ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTg4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9DUkVESVRTCkBAIC0wLDAgKzEsMjQyIEBACisjCisjICAgUGFydHMgb2YgdGhlIGRldmVsb3BtZW50IGVmZm9ydCBmb3IgdGhpcyBwcm9qZWN0IGhhdmUgYmVlbgorIyAgIHNwb25zb3JlZCBieSBTSUVNRU5TIEFHLCBBdXN0cmlhLiBUaGFua3MgdG8gU0lFTUVOUyBmb3IKKyMgICBzdXBwb3J0aW5nIGFuIE9wZW4gU291cmNlIHByb2plY3QhCisjCisjCisjICAgVGhpcyBpcyBhdCBsZWFzdCBhIHBhcnRpYWwgY3JlZGl0cy1maWxlIG9mIGluZGl2aWR1YWwgcGVvcGxlIHRoYXQKKyMgICBoYXZlIGNvbnRyaWJ1dGVkIHRvIHRoZSBVLUJvb3QgcHJvamVjdC4gSXQgaXMgc29ydGVkIGJ5IG5hbWUgYW5kCisjICAgZm9ybWF0dGVkIHRvIGFsbG93IGVhc3kgZ3JlcHBpbmcgYW5kIGJlYXV0aWZpY2F0aW9uIGJ5IHNjcmlwdHMuCisjICAgVGhlIGZpZWxkcyBhcmU6IG5hbWUgKE4pLCBlbWFpbCAoRSksIHdlYi1hZGRyZXNzIChXKSwgUEdQIGtleSBJRAorIyAgIGFuZCBmaW5nZXJwcmludCAoUCksIGRlc2NyaXB0aW9uIChEKSwgYW5kIHNuYWlsLW1haWwgYWRkcmVzcyAoUykuCisjICAgVGhhbmtzLAorIworIyAgICAgICAgICAgICAgICAgICAgICAgV29sZmdhbmcgRGVuaworIy0tLS0tLS0tLS0KKworTjogRHIuIEJydW5vIEFjaGF1ZXIKK0U6IGJydW5vQGV4ZXQtYWcuZGUKK0Q6IFN1cHBvcnQgZm9yIE5ldEJTRCAoYm90aCBhcyBob3N0IGFuZCB0YXJnZXQgc3lzdGVtKQorCitOOiBTd2VuIEFuZGVyc29uCitFOiBzYW5kQHBlcHBlcmNvbi5kZQorRDogRVJJQyBTdXBwb3J0CisKK046IEd1aWxsYXVtZSBBbGV4YW5kcmUKK0U6IGd1aWxsYXVtZS5hbGV4YW5kcmVAZ2VzcGFjLmNoCitEOiBBZGQgUENJUFBDNiBjb25maWd1cmF0aW9uCisKK046IFBpZXJyZSBBdWJlcnQKK0U6IDxwLmF1YmVydEBzdGF1YmxpLmNvbT4KK0Q6IFN1cHBvcnQgZm9yIFJQWENsYXNzaWMgYm9hcmQKKworTjogQW5kcmUgQmVhdWRpbgorRTogPGFuZHJlLmJlYXVkaW5AY29sdWJyaXMuY29tPgorRDogUENNQ0lBLCBFdGhlcm5ldCwgVEZUUAorCitOOiBKZXJyeSB2YW4gQmFyZW4KK0U6IDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRDogQmVkQnVnIHBvcnQgdG8gNjAzZSBjb3JlIChNUEM4Mnh4KS4gQ29kZSBmb3IgZW5oYW5jZWQgbWVtb3J5IHRlc3QuCisKK046IFJhcGhhZWwgQm9zc2VrCitFOiByYXBoYWVsLmJvc3Nla0Bzb2x1dGlvbnM0bGludXguZGUKK0Q6IDh4eHJvbS0wLjMuMAorCitOOiBEYXZpZCBCcm93bgorRTogREJyb3duMDNAaGFycmlzLmNvbQorRDogRXh0ZW5zaW9ucyB0byA4eHhyb20tMC4zLjAKKworTjogT2xpdmVyIEJyb3duCitFOiBvYnJvd25AYWR2ZW50bmV0d29ya3MuY29tCitEOiBQb3J0IHRvIHRoZSBndzgyNjAgYm9hcmQKKworTjogSm9uYXRoYW4gRGUgQnJ1eW5lCitFOiBqb25hdGhhbi5kZWJydXluZUBzaWVtZW5zLmF0ZWEuYmUKK0Q6IFBvcnQgdG8gU2llbWVucyBJQUQyMTAgYm9hcmQKKworTjogQ29ubiBDbGFyaworRTogY2xhcmtAZXN0ZWVtLmNvbQorRDogRVNURUVNMTkyRSBzdXBwb3J0CisKK046IE1hZ251cyBEYW1tCitFOiBlcmFtZGFtQGtpZXJheTEucC55LmtpLmVyYS5lcmljc3Nvbi5zZQorRDogOHh4cm9tCisKK046IEvhcmkgRGF27fBzc29uCitFOiBrZEBmbGFnYS5pcworRDogRkxBR0EgRE0gU3VwcG9ydAorCitOOiBXb2xmZ2FuZyBEZW5rCitFOiB3ZEBkZW54LmRlCitEOiBVLUJvb3QgaW5pdGlhbCB2ZXJzaW9uLCBjb250aW51aW5nIG1haW50ZW5hbmNlLCBBUk1Cb290IG1lcmdlCitXOiBodHRwOi8vd3d3LmRlbnguZGUKKworTjogRGFuIEEuIERpY2tleQorRTogZGRpY2tleUBjaGFydGVyLm5ldAorRDogRkFEUyBTdXBwb3J0CisKK046IEphbWVzIEYuIERvdWdoZXJ0eQorRTogamZkQEdpZ2FiaXROZXR3b3Jrcy5DT00KK0Q6IFBvcnQgdG8gdGhlIE1PVVNTRSBib2FyZAorCitOOiBEYXZlIEVsbGlzCitFOiBER0VAc2l4bmV0aW8uY29tCitEOiBFRVBST00gU3BlZWR1cCwgU1hOSTg1NVQgcG9ydAorCitOOiBEci4gV29sZmdhbmcgR3JhbmRlZ2dlcgorRTogd2dAZGVueC5kZQorRDogU3VwcG9ydCBmb3IgSW50ZXJwaGFzZSA0NTM5IFQxL0UxL0oxIFBNQywgUE42MiwgQ0NNLCBTQ00gYm9hcmRzCitXOiB3d3cuZGVueC5kZQorCitOOiBGcmFuayBHb3R0c2NobGluZworRTogZmdvdHRzY2hsaW5nQGVsdGVjLmRlCitEOiBTdXBwb3J0IGZvciBFTFRFQyBNSFBDL0JBQjd4eC9FTFBQQyBib2FyZHMsIGNmYi1jb25zb2xlLCBpODA0MiwgU01JIEx5bnhFTQorVzogd3d3LmVsdGVjLmRlCisKK046IE1hcml1cyBHcm9lZ2VyCitFOiBtZ3JvZWdlckBzeXNnby5kZQorRDogTUJYIFN1cHBvcnQsIGJvYXJkIHNwZWNpZmljIGZ1bmN0aW9uIGludGVyZmFjZSwgRVNUIFNCQzgyNjAgc3VwcG9ydDsgaW5pdGlhbCBzdXBwb3J0IGZvciBTdHJvbmdBUk0gKExBUlQpLCBBUk03MjBURE1JIChpbXBsZW1lbnRhIEE3KQorVzogd3d3LmVsaW5vcy5jb20KKworTjogS2lyayBIYWRlcmxpZQorRToga2hhZGVybGllQHZpdmlkaW1hZ2UuY29tCitEOiBBZGRlZCBURlRQIHRvIDh4eHJvbSAoLT4gMC4zLjEpCisKK046IENocmlzIEhhbGxpbmFuCitFOiBjbGhAbmV0MXBsdXMuY29tCitEOiBESENQIFN1cHBvcnQKKworTjogQW5uZS1Tb3BoaWUgSGFybm9pcworRTogQW5uZS1Tb3BoaWUuSGFybm9pc0BuZXh0cmVhbS5mcgorRDogUG9ydCB0byBXYWxudXQ0MDUgYm9hcmQKKworTjogQW5kcmVhcyBIZXBwZWwKK0U6IGFoZXBwZWxAc3lzZ28uZGUKK0Q6IENQVSBTdXBwb3J0IGZvciBNUEMgNzV4OyBib2FyZCBzdXBwb3J0IGZvciBFbHRlYyBCQUI3NTAgW29ic29sZXRlIV0KKworTjogSm9zaCBIdWJlcgorRTogaHViZXJAYWx1bS53cGkuZWR1CitEOiBQb3J0IHRvIHRoZSBHYWxpbGVvIEV2YWx1YXRpb24gQm9hcmQsIGFuZCB0aGUgTVBDNzR4eCBjcHUgc2VyaWVzLgorVzogaHR0cDovL3d3dy5tY2x4LmNvbS8KKworSDogU3R1YXJ0IEh1Z2hlcworRTogc3R1YXJ0aEBsaW5lby5jb20KK0Q6IFBvcnQgdG8gTVBDODI2MEFEUyBib2FyZAorCitIOiBSaWNoIElyZWxhbmQKK0U6IHIuaXJlbGFuZEBjb21wdXRlci5vcmcKK0Q6IEZQR0EgZGV2aWNlIGNvbmZpZ3VyYXRpb24gZHJpdmVyCisKK046IEdhcnkgSmVubmVqb2huCitFOiBnYXJ5akBqZW5uZWpvaG4ub3JnLCBnakBkZW54LmRlCitEOiBTdXBwb3J0IGZvciBTYW1zdW5nIEFSTTkyMFQgUzNDMjQwMFgsIEFSTTkyMFQgIlRSQUIiCitXOiB3d3cuZGVueC5kZQorCitOOiBNdXJyYXkgSmVuc2VuCitFOiBNdXJyYXkuSmVuc2VuQGNtc3QuY3Npcm8uYXUKK0Q6IEluaXRpYWwgODI2MCBzdXBwb3J0OyBHREIgc3VwcG9ydAorRDogUG9ydCB0byBDb2dlbnQrSHltb2QgYm9hcmRzOyBIeW1vZCBCb2FyZCBEYXRhYmFzZQorVzogaHR0cDovL3d3dy5tc2EuY21zdC5jc2lyby5hdS9vdXJzdGFmZi9NdXJyYXlKZW5zZW4vbWpqLmh0bWwKKworTjogWW9vLiBKb25naG9vbgorRTogeW9vdGhAaXBvbmUuY28ua3IKK0Q6IEFkZGVkIHBvcnQgdG8gdGhlIFJQWGxpdGUgYm9hcmQKKworTjogQnJhZCBLZW1wCitFOiBCcmFkLktlbXBAc2VyYW5vYS5jb20KK0Q6IFBvcnQgdG8gV2luZHJpdmVyIHBwbWM4MjYwIGJvYXJkCisKK046IFRob21hcyBLb2VsbGVyCitFOiB0a29lbGxlckBnbXgubmV0CitEOiBQb3J0IHRvIE1vdG9yb2xhIFNhbmRwb2ludCAzIChNUEM4MjQwKQorCitOOiBUaG9tYXMgTGFuZ2UKK0U6IHRob21hc0Bjb3JlbGF0dXMuY29tCitEOiBTdXBwb3J0IGZvciBHVEggYm9hcmQ7IGxvdHMgb2YgUENNQ0lBIGZpeGVzCisKK046IFJheW1vbmQgTG8KK0U6IGxvQHJvdXRlZnJlZS5jb20KK0Q6IFN1cHBvcnQgZm9yIERPUyBwYXJ0aXRpb25zCisKK046IERhbiBNYWxlaworRTogZGFuQG5ldHg0LmNvbQorRDogRkFEU1JPTSwgdGhlIGdyYW5kZmF0aGVyIG9mIGFsbCBvZiB0aGlzCisKK046IEpheSBNb25rbWFuCitFOiBqdG1Ac21vb3Roc21vb3RoaWUuY29tCitEOiBFU1QgU0JDODI2MCBzdXBwb3J0CisKK046IEZyYW5rIE1vcmF1ZgorRTogZnJhbmsubW9yYXVmQHNhbHpicmVubmVyLmNvbQorRDogU3VwcG9ydCBmb3IgRW1iZWRkZWQgUGxhbmV0IFJQWCBTdXBlciBCb2FyZAorCitOOiBEYXZpZCBN/GxsZXIKK0U6IGQubXVlbGxlckBlbHNvZnQuY2gKK0Q6IFN1cHBvcnQgZm9yIFNhbXN1bmcgQVJNOTIwVCBTTURLMjQxMCBldmFsIGJvYXJkCisKK046IFJvbGYgT2ZmZXJtYW5ucworRTogcm9mQHN5c2dvLmRlCitEOiBJbml0aWFsIHN1cHBvcnQgZm9yIFNTVi1ETlAxMTEwLCBTTUM5MTExMSBkcml2ZXIKK1c6IHd3dy5lbGlub3MuY29tCisKK046IEtlaXRoIE91dHdhdGVyCitFOiBLZWl0aF9PdXR3YXRlckBtdmlzLmNvbQorRDogU3VwcG9ydCBmb3IgR0VOODYwVCBib2FyZAorCitOOiBLZWl0aCBPdXR3YXRlcgorRToga2VpdGhfb3V0d2F0ZXJAbXZpcy5jb20KK0Q6IFN1cHBvcnQgZm9yIGdlbmVyaWMvY3VzdG9tIE1QQzg2MFQgYm9hcmQgKEdFTjg2MFQpCisKK046IEZyYW5rIFBhbm5vCitFOiBmcGFubm9AZGVscGhpbnRlY2guY29tCitEOiBTdXBwb3J0IGZvciBFbWJlZGRlZCBQbGFuZXQgRVA4MjYwIEJvYXJkCisKK046IERlbmlzIFBldGVyCitFOiBkLnBldGVyQG1wbC5jaAorRDogU3VwcG9ydCBmb3IgNHh4IFNDU0ksIGZsb3BweSwgQ0RST00sIENUNjkwMDAgdmlkZW8sIC4uLgorRDogU3VwcG9ydCBmb3IgUElQNDA1IGJvYXJkCitEOiBTdXBwb3J0IGZvciBNSVA0MDUgYm9hcmQKKworTjogQmlsbCBQaXR0cworRTogd2xwQG1pbmRzcHJpbmcuY29tCitEOiBCZWRCdWcgZW1iZWRkZWQgZGVidWdnZXIgY29kZQorCitOOiBTdGVmYW4gUm9lc2UKK0U6IHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCitEOiBJQk0gUFBDNDAxLzQwMy80MDVHUCBTdXBwb3J0OyBXaW5kb3dzIGVudmlyb25tZW50IHN1cHBvcnQKKworTjogTmVpbCBSdXNzZWxsCitFOiBjYXJldEBjLXNpZGUuY29tCitEOiBBdXRob3Igb2YgTGlNb24tMS40LjIsIHdoaWNoIGNvbnRyaWJ1dGVkIHNvbWUgaWRlYXMKKworTjogUGFvbG8gU2NhZmZhcmRpCitFOiBhcnNlbmlvQHRpbi5pdAorRDogRkFEUzgyMyBjb25maWd1cmF0aW9uLCBNUEM4MjMgdmlkZW8gc3VwcG9ydCwgSTJDLCB3aXJlbGVzcyBrZXlib2FyZCwgbG90cyBtb3JlCisKK046IFJvYmVydCBTY2h3ZWJlbAorRTogci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZQorRDogU3VwcG9ydCBmb3IgY3NiMjI2IGJvYXJkICh4c2NhbGUpCitOOiBSb2IgVGF5bG9yCitFOiByb2J0QGZseWluZ3BpZy5jb20KK0Q6IFBvcnQgdG8gTUJYODYwVCBhbmQgU2FuZHBvaW50ODI0MAorCitOOiBFcmlrIFRoZWlzZW4KK0U6IGV0aGVpc2VuQG1pbmRzcHJpbmcuY29tCitEOiBNQlg4eHggYW5kIG1hbnkgb3RoZXIgcGF0Y2hlcworCitOOiBKaW0gVGhvbXBzb24KK0U6IGppbUBtdXNlbmtpLmNvbQorRDogU3VwcG9ydCBmb3IgTVVTRU5LSSBib2FyZAorCitOOiBEYXZpZCBVcGRlZ3JhZmYKK0U6IGRhdmVAY3JheS5jb20KK0Q6IFBvcnQgdG8gQ3JheSBMMSBib2FyZDsgREhDUCB2ZW5kb3IgZXh0ZW5zaW9ucworCitOOiBDaHJpc3RpYW4gVmVqbGJvCitFOiBjaHJpc3RpYW4udmVqbGJvQHRlbGxhYnMuY29tCitEOiBGQURTODYwVCBldGhlcm5ldCBzdXBwb3J0CisKK046IEFsZXggWnVlcGtlCitFOiBhenVAc3lzZ28uZGUKK0Q6IE92ZXJhbGwgaW1wcm92ZW1lbnRzIG9uIFN0cm9uZ0FSTSwgQVJNNzIwVERNSTsgU3VwcG9ydCBmb3IgVHV4c2NyZWVuOyBpbml0aWFsIFBDTUNJQSBzdXBwb3J0IGZvciBBUk0KK1c6IHd3dy5lbGlub3MuY29tCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmZjc3MgotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRQpAQCAtMCwwICsxLDI2NjMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwIC0gMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1N1bW1hcnk6Cis9PT09PT09PQorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgc291cmNlIGNvZGUgZm9yIFUtQm9vdCwgYSBtb25pdG9yIGZvcgorRW1iZWRkZWQgUG93ZXJQQyBib2FyZHMsIHdoaWNoIGNhbiBiZSBpbnN0YWxsZWQgaW4gYSBib290IFJPTSBhbmQKK3VzZWQgdG8gdGVzdCB0aGUgaGFyZHdhcmUgb3IgZG93bmxvYWQgYW5kIHJ1biBhcHBsaWNhdGlvbiBjb2RlLgorCitUaGUgZGV2ZWxvcG1lbnQgb2YgVS1Cb290IGlzIGNsb3NlbHkgcmVsYXRlZCB0byBMaW51eDogc29tZSBwYXJ0cyBvZgordGhlIHNvdXJjZSBjb2RlIG9yaWdpbmF0ZSBpbiB0aGUgTGludXggc291cmNlIHRyZWUsIHdlIHN0aWxsIGhhdmUKK3NvbWUgaGVhZGVyIGZpbGVzIGluIGNvbW1vbiwgYW5kIHNwZWNpYWwgcHJvdmlzaW9uIGhhcyBiZWVuIG1hZGUgdG8KK3N1cHBvcnQgYm9vdGluZyBvZiBMaW51eCBpbWFnZXMuCisKK1NvbWUgYXR0ZW50aW9uIGhhcyBiZWVuIHBhaWQgdG8gbWFrZSB0aGlzIHNvZnR3YXJlIGVhc2lseQorY29uZmlndXJhYmxlIGFuZCBleHRlbmRhYmxlLiBGb3IgaW5zdGFuY2UsIGFsbCBtb25pdG9yIGNvbW1hbmRzIGFyZQoraW1wbGVtZW50ZWQgd2l0aCB0aGUgc2FtZSBjYWxsIGludGVyZmFjZSwgc28gdGhhdCBpdCdzIHZlcnkgZWFzeSB0bworYWRkIG5ldyBjb21tYW5kcy4gQWxzbywgaW5zdGVhZCBvZiBwZXJtYW5lbnRseSBhZGRpbmcgcmFyZWx5IHVzZWQKK2NvZGUgKGZvciBpbnN0YW5jZSBoYXJkd2FyZSB0ZXN0IHV0aWxpdGllcykgdG8gdGhlIG1vbml0b3IsIHlvdSBjYW4KK2xvYWQgYW5kIHJ1biBpdCBkeW5hbWljYWxseS4KKworCitTdGF0dXM6Cis9PT09PT09CisKK0luIGdlbmVyYWwsIGFsbCBib2FyZHMgZm9yIHdoaWNoIGEgY29uZmlndXJhdGlvbiBvcHRpb24gZXhpc3RzIGluIHRoZQorTWFrZWZpbGUgaGF2ZSBiZWVuIHRlc3RlZCAgdG8gIHNvbWUgIGV4dGVudCAgYW5kICBjYW4gIGJlICBjb25zaWRlcmVkCisid29ya2luZyIuIEluIGZhY3QsIG1hbnkgb2YgdGhlbSBhcmUgdXNlZCBpbiBwcm9kdWN0aW9uIHN5c3RlbXMuCisKK0luIGNhc2Ugb2YgcHJvYmxlbXMgc2VlIHRoZSBDSEFOR0VMT0cgYW5kIENSRURJVFMgZmlsZXMgdG8gIGZpbmQgIG91dAord2hvIGNvbnRyaWJ1dGVkIHRoZSBzcGVjaWZpYyBwb3J0LgorCitFeGNlcHRpb24gZnJvbSB0aGlzIHJ1bGU6IHRoZSBwb3J0IHRvIHRoZSBTYW5kcG9pbnQgODI0MCBoYXMgbm90IGJlZW4KK2NvbXBsZXRlZCB5ZXQuCisKKworV2hlcmUgdG8gZ2V0IGhlbHA6Cis9PT09PT09PT09PT09PT09PT0KKworSW4gY2FzZSB5b3UgaGF2ZSBxdWVzdGlvbnMgYWJvdXQsIHByb2JsZW1zIHdpdGggb3IgY29udHJpYnV0aW9ucyAgZm9yCitVLUJvb3QJIHlvdSAgc2hvdWxkICBzZW5kICBhICBtZXNzYWdlIHRvIHRoZSBVLUJvb3QgbWFpbGluZyBsaXN0IGF0Cis8dS1ib290LXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4uIFRoZXJlIGlzIGFsc28gIGFuICBhcmNoaXZlICBvZgorcHJldmlvdXMgIHRyYWZmaWMgIG9uICB0aGUgIG1haWxpbmcgIGxpc3QgLSBwbGVhc2Ugc2VhcmNoIHRoZSBhcmNoaXZlCitiZWZvcmUgYXNraW5nIEZBUSdzLiBQbGVhc2Ugc2VlCitodHRwOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3UtYm9vdC11c2Vycy8KKworCitXaGVyZSB3ZSBjb21lIGZyb206Cis9PT09PT09PT09PT09PT09PT09CisKKy0gc3RhcnQgZnJvbSA4eHhyb20gc291cmNlcworLSBjbGVhbiB1cCBjb2RlCistIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBjdXN0b20gYm9hcmRzCistIG1ha2UgaXQgcG9zc2libGUgdG8gYWRkIG90aGVyIFtQb3dlclBDXSBDUFVzCistIGV4dGVuZCBmdW5jdGlvbnMsIGVzcGVjaWFsbHk6CisgICogUHJvdmlkZSBleHRlbmRlZCBpbnRlcmZhY2UgdG8gTGludXggYm9vdCBsb2FkZXIKKyAgKiBTLVJlY29yZCBkb3dubG9hZAorICAqIG5ldHdvcmsgYm9vdAorICAqIFBDTUNJQSAvIENvbXBhY3RGTGFzaCAvIEFUQSBkaXNrIC8gU0NTSSAuLi4gYm9vdAorLSBhZGQgb3RoZXIgQ1BVIGZhbWlsaWVzIChzdGFydGluZyB3aXRoIEFSTSkKKworCitEaXJlY3RvcnkgSGllcmFyY2h5OgorPT09PT09PT09PT09PT09PT09PT0KKworLSBib2FyZAkJQm9hcmQgZGVwZW5kZW5kIGZpbGVzCistIGNvbW1vbglNaXNjIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVuZCBmdW5jdGlvbnMKKy0gY3B1CQlDUFUgc3BlY2lmaWMgZmlsZXMKKy0gZGlzawkJQ29kZSBmb3IgZGlzayBkcml2ZSBwYXJ0aXRpb24gaGFuZGxpbmcKKy0gZG9jCQlEb2N1bWVudGF0aW9uIChkb24ndCBleHBlY3QgdG9vIG11Y2gpCistIGRyaXZlcnMJQ29tbW9uIHVzZWQgZGV2aWNlIGRyaXZlcnMKKy0gZHR0CQlEaWdpdGFsIFRoZXJtb21ldGVyIGFuZCBUaGVybW9zdGF0IGRyaXZlcnMKKy0gZXhhbXBsZXMJRXhhbXBsZSBjb2RlIGZvciBzdGFuZGFsb25lIGFwcGxpY2F0aW9ucywgZXRjLgorLSBpbmNsdWRlCUhlYWRlciBGaWxlcworLSBkaXNrCQlIYXJkZGlzayBpbnRlcmZhY2UgY29kZQorLSBuZXQJCU5ldHdvcmtpbmcgY29kZQorLSBwcGMJCUZpbGVzIGdlbmVyaWMgdG8gUG93ZXJQQyBhcmNoaXRlY3R1cmUKKy0gcG9zdAkJUG93ZXIgT24gU2VsZiBUZXN0CistIHBvc3QvYXJjaAkJU3ltbGluayB0byBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgUG93ZXIgT24gU2VsZiBUZXN0CistIHBvc3QvYXJjaC1wcGMJCVBvd2VyUEMgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIFBvd2VyIE9uIFNlbGYgVGVzdAorLSBwb3N0L2NwdS9tcGM4MjYwCU1QQzgyNjAgQ1BVIHNwZWNpZmljIFBvd2VyIE9uIFNlbGYgVGVzdAorLSBwb3N0L2NwdS9tcGM4eHgJTVBDOHh4IENQVSBzcGVjaWZpYyBQb3dlciBPbiBTZWxmIFRlc3QKKy0gcnRjCQlSZWFsIFRpbWUgQ2xvY2sgZHJpdmVycworLSB0b29scwkJVG9vbHMgdG8gYnVpbGQgUy1SZWNvcmQgb3IgVS1Cb290IGltYWdlcywgZXRjLgorCistIGNwdS83NHh4Xzd4eAlGaWxlcyBzcGVjaWZpYyB0byBNb3Rvcm9sYSBNUEM3NHh4IGFuZCA3eHggQ1BVcworLSBjcHUvbXBjOHh4CUZpbGVzIHNwZWNpZmljIHRvIE1vdG9yb2xhIE1QQzh4eCAgQ1BVcworLSBjcHUvbXBjODI0eAlGaWxlcyBzcGVjaWZpYyB0byBNb3Rvcm9sYSBNUEM4MjR4IENQVXMKKy0gY3B1L21wYzgyNjAJRmlsZXMgc3BlY2lmaWMgdG8gTW90b3JvbGEgTVBDODI2MCBDUFUKKy0gY3B1L3BwYzR4eAlGaWxlcyBzcGVjaWZpYyB0byBJQk0JICAgNHh4CSAgIENQVXMKKworLSBib2FyZC9SUFhDbGFzc2ljCisJCUZpbGVzIHNwZWNpZmljIHRvIFJQWENsYXNzaWMgYm9hcmRzCistIGJvYXJkL1JQWGxpdGUJRmlsZXMgc3BlY2lmaWMgdG8gUlBYbGl0ZSAgICBib2FyZHMKKy0gYm9hcmQvYzJtb24JRmlsZXMgc3BlY2lmaWMgdG8gYzJtb24JICAgICBib2FyZHMKKy0gYm9hcmQvY29nZW50CUZpbGVzIHNwZWNpZmljIHRvIENvZ2VudCAgICAgYm9hcmRzCisJCShuZWVkIGZ1cnRoZXIgY29uZmlndXJhdGlvbikKKwkJRmlsZXMgc3BlY2lmaWMgdG8gQ1BDSUlTRVI0ICBib2FyZHMKKy0gYm9hcmQvY3B1ODYJRmlsZXMgc3BlY2lmaWMgdG8gQ1BVODYgICAgICBib2FyZHMKKy0gYm9hcmQvY3JheS8JRmlsZXMgc3BlY2lmaWMgdG8gYm9hcmRzIG1hbnVmYWN0dXJlZCBieSBDcmF5CistIGJvYXJkL2NyYXkvTDEJCUZpbGVzIHNwZWNpZmljIHRvIEwxICAgICAgICAgYm9hcmRzCistIGJvYXJkL2N1ODI0CUZpbGVzIHNwZWNpZmljIHRvIENVODI0CSAgICAgYm9hcmRzCistIGJvYXJkL2Vib255ICAgRmlsZXMgc3BlY2lmaWMgdG8gSUJNIEVib255IGJvYXJkCistIGJvYXJkL2VyaWMJRmlsZXMgc3BlY2lmaWMgdG8gRVJJQwkgICAgIGJvYXJkcworLSBib2FyZC9lc2QvCUZpbGVzIHNwZWNpZmljIHRvIGJvYXJkcyBtYW51ZmFjdHVyZWQgYnkgRVNECistIGJvYXJkL2VzZC9hZGNpb3AJRmlsZXMgc3BlY2lmaWMgdG8gQURDSU9QICAgICBib2FyZHMKKy0gYm9hcmQvZXNkL2FyNDA1CUZpbGVzIHNwZWNpZmljIHRvIEFSNDA1CSAgICAgYm9hcmRzCistIGJvYXJkL2VzZC9jYW5idAlGaWxlcyBzcGVjaWZpYyB0byBDQU5CVAkgICAgIGJvYXJkcworLSBib2FyZC9lc2QvY3BjaTQwNQlGaWxlcyBzcGVjaWZpYyB0byBDUENJNDA1ICAgIGJvYXJkcworLSBib2FyZC9lc2QvY3BjaWlzZXI0CUZpbGVzIHNwZWNpZmljIHRvIENQQ0lJU0VSNCAgYm9hcmRzCistIGJvYXJkL2VzZC9jb21tb24JQ29tbW9uIGZpbGVzIGZvciBFU0QgYm9hcmRzCistIGJvYXJkL2VzZC9kYXNhX3NpbQlGaWxlcyBzcGVjaWZpYyB0byBEQVNBX1NJTSAgIGJvYXJkcworLSBib2FyZC9lc2QvZHU0MDUJRmlsZXMgc3BlY2lmaWMgdG8gRFU0MDUgICAgICBib2FyZHMKKy0gYm9hcmQvZXNkL29jcnRjCUZpbGVzIHNwZWNpZmljIHRvIE9DUlRDICAgICAgYm9hcmRzCistIGJvYXJkL2VzZC9wY2k0MDUJRmlsZXMgc3BlY2lmaWMgdG8gUENJNDA1ICAgICBib2FyZHMKKy0gYm9hcmQvZXN0ZWVtMTkyZQorCQlGaWxlcyBzcGVjaWZpYyB0byBFU1RFRU0xOTJFIGJvYXJkcworLSBib2FyZC9ldHgwOTQJRmlsZXMgc3BlY2lmaWMgdG8gRVRYXzA5NCAgICBib2FyZHMKKy0gYm9hcmQvZXZiNjQyNjAKKwkJRmlsZXMgc3BlY2lmaWMgdG8gRVZCNjQyNjAgICBib2FyZHMKKy0gYm9hcmQvZmFkcwlGaWxlcyBzcGVjaWZpYyB0byBGQURTCSAgICAgYm9hcmRzCistIGJvYXJkL2ZsYWdhZG0gRmlsZXMgc3BlY2lmaWMgdG8gRkxBR0FETSAgICBib2FyZHMKKy0gYm9hcmQvZ2VuODYwdCBGaWxlcyBzcGVjaWZpYyB0byBHRU44NjBUICAgIGJvYXJkcworLSBib2FyZC9nZW5pZXR2IEZpbGVzIHNwZWNpZmljIHRvIEdFTklFVFYgICAgYm9hcmRzCistIGJvYXJkL2d0aAlGaWxlcyBzcGVjaWZpYyB0byBHVEgJICAgICBib2FyZHMKKy0gYm9hcmQvaGVybWVzCUZpbGVzIHNwZWNpZmljIHRvIEhFUk1FUyAgICAgYm9hcmRzCistIGJvYXJkL2h5bW9kCUZpbGVzIHNwZWNpZmljIHRvIEhZTU9ECSAgICAgYm9hcmRzCistIGJvYXJkL2ljdTg2MglGaWxlcyBzcGVjaWZpYyB0byBJQ1U4NjIgICAgIGJvYXJkcworLSBib2FyZC9pcDg2MAlGaWxlcyBzcGVjaWZpYyB0byBJUDg2MAkgICAgIGJvYXJkcworLSBib2FyZC9pcGhhc2U0NTM5CisJCUZpbGVzIHNwZWNpZmljIHRvIEludGVycGhhc2U0NTM5IGJvYXJkcworLSBib2FyZC9pdm0JRmlsZXMgc3BlY2lmaWMgdG8gSVZNUzgvSVZNTDI0IGJvYXJkcworLSBib2FyZC9sYW50ZWMJRmlsZXMgc3BlY2lmaWMgdG8gTEFOVEVDICAgICBib2FyZHMKKy0gYm9hcmQvbHdtb24JRmlsZXMgc3BlY2lmaWMgdG8gTFdNT04JICAgICBib2FyZHMKKy0gYm9hcmQvbWJ4OHh4CUZpbGVzIHNwZWNpZmljIHRvIE1CWAkgICAgIGJvYXJkcworLSBib2FyZC9tcGM4MjYwYWRzCisJCUZpbGVzIHNwZWNpZmljIHRvIE1NUEM4MjYwQURTIGJvYXJkcworLSBib2FyZC9tcGwvCUZpbGVzIHNwZWNpZmljIHRvIGJvYXJkcyBtYW51ZmFjdHVyZWQgYnkgTVBMCistIGJvYXJkL21wbC9jb21tb24JQ29tbW9uIGZpbGVzIGZvciBNUEwgYm9hcmRzCistIGJvYXJkL21wbC9waXA0MDUJRmlsZXMgc3BlY2lmaWMgdG8gUElQNDA1ICAgICBib2FyZHMKKy0gYm9hcmQvbXBsL21pcDQwNQlGaWxlcyBzcGVjaWZpYyB0byBNSVA0MDUgICAgIGJvYXJkcworLSBib2FyZC9tdXNlbmtpCUZpbGVzIHNwZWNpZmljIHRvIE1VU0VLTkkgICAgYm9hcmRzCistIGJvYXJkL212czEJRmlsZXMgc3BlY2lmaWMgdG8gTVZTMSAgICAgICBib2FyZHMKKy0gYm9hcmQvbng4MjMgICBGaWxlcyBzcGVjaWZpYyB0byBOWDgyMyAgICAgIGJvYXJkcworLSBib2FyZC9veGMJRmlsZXMgc3BlY2lmaWMgdG8gT1hDICAgICAgICBib2FyZHMKKy0gYm9hcmQvcGNpcHBjMglGaWxlcyBzcGVjaWZpYyB0byBQQ0lQUEMyL1BDSVBQQzYgYm9hcmRzCistIGJvYXJkL3BtODI2CUZpbGVzIHNwZWNpZmljIHRvIFBNODI2ICAgICAgYm9hcmRzCistIGJvYXJkL3BwbWM4MjYwCisJCUZpbGVzIHNwZWNpZmljIHRvIFBQTUM4MjYwICAgYm9hcmRzCistIGJvYXJkL3JweHN1cGVyCisJCUZpbGVzIHNwZWNpZmljIHRvIFJQWHN1cGVyICAgYm9hcmRzCistIGJvYXJkL3JzZHByb3RvCisJCUZpbGVzIHNwZWNpZmljIHRvIFJTRHByb3RvICAgYm9hcmRzCistIGJvYXJkL3NhbmRwb2ludAorCQlGaWxlcyBzcGVjaWZpYyB0byBTYW5kcG9pbnQgIGJvYXJkcworLSBib2FyZC9zYmM4MjYwCUZpbGVzIHNwZWNpZmljIHRvIFNCQzgyNjAgICAgYm9hcmRzCistIGJvYXJkL3NhY3NuZwlGaWxlcyBzcGVjaWZpYyB0byBTQUNTbmcgICAgIGJvYXJkcworLSBib2FyZC9zaWVtZW5zIEZpbGVzIHNwZWNpZmljIHRvIGJvYXJkcyBtYW51ZmFjdHVyZWQgYnkgU2llbWVucyBBRworLSBib2FyZC9zaWVtZW5zL0NDTQlGaWxlcyBzcGVjaWZpYyB0byBDQ00JICAgICBib2FyZHMKKy0gYm9hcmQvc2llbWVucy9JQUQyMTAJRmlsZXMgc3BlY2lmaWMgdG8gSUFEMjEwICAgICBib2FyZHMKKy0gYm9hcmQvc2llbWVucy9TQ00JRmlsZXMgc3BlY2lmaWMgdG8gU0NNICAgICAgICBib2FyZHMKKy0gYm9hcmQvc2llbWVucy9wY3VfZQlGaWxlcyBzcGVjaWZpYyB0byBQQ1VfRQkgICAgIGJvYXJkcworLSBib2FyZC9zaXhuZXQJRmlsZXMgc3BlY2lmaWMgdG8gU0lYTkVUICAgICBib2FyZHMKKy0gYm9hcmQvc3BkOHh4CUZpbGVzIHNwZWNpZmljIHRvIFNQRDh4eFRTICAgYm9hcmRzCistIGJvYXJkL3RxbTgyNjAgRmlsZXMgc3BlY2lmaWMgdG8gVFFNODI2MCAgICBib2FyZHMKKy0gYm9hcmQvdHFtOHh4CUZpbGVzIHNwZWNpZmljIHRvIFRRTTh4eEwgICAgYm9hcmRzCistIGJvYXJkL3c3bwlGaWxlcyBzcGVjaWZpYyB0byBXN08gICAgICAgIGJvYXJkcworLSBib2FyZC93YWxudXQ0MDUKKwkJRmlsZXMgc3BlY2lmaWMgdG8gV2FsbnV0NDA1ICBib2FyZHMKKy0gYm9hcmQvd2VzdGVsLwlGaWxlcyBzcGVjaWZpYyB0byBib2FyZHMgbWFudWZhY3R1cmVkIGJ5IFdlc3RlbCBXaXJlbGVzcworLSBib2FyZC93ZXN0ZWwvYW14ODYwCUZpbGVzIHNwZWNpZmljIHRvIEFNWDg2MCAgICAgYm9hcmRzCistIGJvYXJkL3V0eDgyNDUJRmlsZXMgc3BlY2lmaWMgdG8gVVRYODI0NSAgIGJvYXJkcworCitTb2Z0d2FyZSBDb25maWd1cmF0aW9uOgorPT09PT09PT09PT09PT09PT09PT09PT0KKworQ29uZmlndXJhdGlvbiBpcyB1c3VhbGx5IGRvbmUgdXNpbmcgQyBwcmVwcm9jZXNzb3IgZGVmaW5lczsgdGhlCityYXRpb25hbGUgYmVoaW5kIHRoYXQgaXMgdG8gYXZvaWQgZGVhZCBjb2RlIHdoZW5ldmVyIHBvc3NpYmxlLgorCitUaGVyZSBhcmUgdHdvIGNsYXNzZXMgb2YgY29uZmlndXJhdGlvbiB2YXJpYWJsZXM6CisKKyogQ29uZmlndXJhdGlvbiBfT1BUSU9OU186CisgIFRoZXNlIGFyZSBzZWxlY3RhYmxlIGJ5IHRoZSB1c2VyIGFuZCBoYXZlIG5hbWVzIGJlZ2lubmluZyB3aXRoCisgICJDT05GSUdfIi4KKworKiBDb25maWd1cmF0aW9uIF9TRVRUSU5HU186CisgIFRoZXNlIGRlcGVuZCBvbiB0aGUgaGFyZHdhcmUgZXRjLiBhbmQgc2hvdWxkIG5vdCBiZSBtZWRkbGVkIHdpdGggaWYKKyAgeW91IGRvbid0IGtub3cgd2hhdCB5b3UncmUgZG9pbmc7IHRoZXkgaGF2ZSBuYW1lcyBiZWdpbm5pbmcgd2l0aAorICAiQ0ZHXyIuCisKK0xhdGVyIHdlIHdpbGwgYWRkIGEgY29uZmlndXJhdGlvbiB0b29sIC0gcHJvYmFibHkgc2ltaWxhciB0byBvciBldmVuCitpZGVudGljYWwgdG8gd2hhdCdzIHVzZWQgZm9yIHRoZSBMaW51eCBrZXJuZWwuIFJpZ2h0IG5vdywgd2UgaGF2ZSB0bworZG8gdGhlIGNvbmZpZ3VyYXRpb24gYnkgaGFuZCwgd2hpY2ggbWVhbnMgY3JlYXRpbmcgc29tZSBzeW1ib2xpYworbGlua3MgYW5kIGVkaXRpbmcgc29tZSBjb25maWd1cmF0aW9uIGZpbGVzLiBXZSB1c2UgdGhlIFRRTTh4eEwgYm9hcmRzCithcyBhbiBleGFtcGxlIGhlcmUuCisKKworU2VsZWN0aW9uIG9mIFByb2Nlc3NvciBBcmNoaXRlY3R1cmUgYW5kIEJvYXJkIFR5cGU6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9yIGFsbCBzdXBwb3J0ZWQgYm9hcmRzIHRoZXJlIGFyZSByZWFkeS10by11c2UgZGVmYXVsdAorY29uZmlndXJhdGlvbnMgYXZhaWxhYmxlOyBqdXN0IHR5cGUgIm1ha2UgPGJvYXJkX25hbWU+X2NvbmZpZyIuCisKK0V4YW1wbGU6IEZvciBhIFRRTTgyM0wgbW9kdWxlIHR5cGU6CisKKwljZCB1LWJvb3QKKwltYWtlIFRRTTgyM0xfY29uZmlnCisKK0ZvciB0aGUgQ29nZW50IHBsYXRmb3JtLCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBjcHUgdHlwZSBhcyB3ZWxsOworZS5nLiAibWFrZSBjb2dlbnRfbXBjOHh4X2NvbmZpZyIuIEFuZCBhbHNvIGNvbmZpZ3VyZSB0aGUgY29nZW50CitkaXJlY3RvcnkgYWNjb3JkaW5nIHRvIHRoZSBpbnN0cnVjdGlvbnMgaW4gY29nZW50L1JFQURNRS4KKworCitDb25maWd1cmF0aW9uIE9wdGlvbnM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvbmZpZ3VyYXRpb24gZGVwZW5kcyBvbiB0aGUgY29tYmluYXRpb24gb2YgYm9hcmQgYW5kIENQVSB0eXBlOyBhbGwKK3N1Y2ggaW5mb3JtYXRpb24gaXMga2VwdCBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZQorImluY2x1ZGUvY29uZmlncy88Ym9hcmRfbmFtZT4uaCIuCisKK0V4YW1wbGU6IEZvciBhIFRRTTgyM0wgbW9kdWxlLCBhbGwgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBhcmUgaW4KKyJpbmNsdWRlL2NvbmZpZ3MvVFFNODIzTC5oIi4KKworCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgbmVlZCB0byBiZSBjb25maWd1cmVkOgorCistIENQVSBUeXBlOglEZWZpbmUgZXhhY3RseSBvbmUgb2YKKworCQlQb3dlclBDIGJhc2VkIENQVXM6CisJCS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJQ09ORklHX01QQzgyMywJQ09ORklHX01QQzg1MCwJQ09ORklHX01QQzg1NSwJQ09ORklHX01QQzg2MAorCW9yCUNPTkZJR19NUEM4MjRYLCBDT05GSUdfTVBDODI2MAorCW9yCUNPTkZJR19JT1A0ODAKKwlvcglDT05GSUdfNDA1R1AKKwlvcglDT05GSUdfNDQwCisJb3IJQ09ORklHX01QQzc0eHgKKworCQlBUk0gYmFzZWQgQ1BVczoKKwkJLS0tLS0tLS0tLS0tLS0tCisJCUNPTkZJR19TQTExMTAKKwkJQ09ORklHX0FSTTcKKwkJQ09ORklHX1BYQTI1MAorCisKKy0gQm9hcmQgVHlwZToJRGVmaW5lIGV4YWN0bHkgb25lIG9mCisKKwkJUG93ZXJQQyBiYXNlZCBib2FyZHM6CisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCUNPTkZJR19BRENJT1AsICAgICBDT05GSUdfSUNVODYyICAgICAgQ09ORklHX1JQWHN1cGVyLAorCQlDT05GSUdfQURTODYwLCAgICAgQ09ORklHX0lQODYwLCAgICAgIENPTkZJR19TTTg1MCwKKwkJQ09ORklHX0FNWDg2MCwgICAgIENPTkZJR19JUEhBU0U0NTM5LCBDT05GSUdfU1BEODIzVFMsCisJCUNPTkZJR19BUjQwNSwgICAgICBDT05GSUdfSVZNTDI0LCAgICAgQ09ORklHX1NYTkk4NTVULAorCQlDT05GSUdfQkFCN3h4LCAgICAgQ09ORklHX0lWTUwyNF8xMjgsIENPTkZJR19TYW5kcG9pbnQ4MjQwLAorCQlDT05GSUdfQ0FOQlQsICAgICAgQ09ORklHX0lWTUwyNF8yNTYsIENPTkZJR19TYW5kcG9pbnQ4MjQ1LAorCQlDT05GSUdfQ0NNLCAgICAgICAgQ09ORklHX0lWTVM4LCAgICAgIENPTkZJR19UUU04MjNMLAorCQlDT05GSUdfQ1BDSTQwNSwgICAgQ09ORklHX0lWTVM4XzEyOCwgIENPTkZJR19UUU04NTBMLAorCQlDT05GSUdfQ1BDSTQwNTIsICAgQ09ORklHX0lWTVM4XzI1NiwgIENPTkZJR19UUU04NTVMLAorCQlDT05GSUdfQ1BDSUlTRVI0LCAgQ09ORklHX0xBTlRFQywgICAgIENPTkZJR19UUU04NjBMLAorCQlDT05GSUdfQ1BVODYsICAgICAgQ09ORklHX01CWCwgICAgICAgIENPTkZJR19UUU04MjYwLAorCQlDT05GSUdfQ1JBWUwxLCAgICAgQ09ORklHX01CWDg2MFQsICAgIENPTkZJR19UVFRlY2gsCisJCUNPTkZJR19DVTgyNCwgICAgICBDT05GSUdfTUhQQywgICAgICAgQ09ORklHX1VUWDgyNDUsCisJCUNPTkZJR19EQVNBX1NJTSwgICBDT05GSUdfTUlQNDA1LCAgICAgQ09ORklHX1c3T0xNQywKKwkJQ09ORklHX0RVNDA1LCAgICAgIENPTkZJR19NT1VTU0UsICAgICBDT05GSUdfVzdPTE1HLAorCQlDT05GSUdfRUxQUEMsICAgICAgQ09ORklHX01QQzgyNjBBRFMsIENPTkZJR19XQUxOVVQ0MDUsCisJCUNPTkZJR19FUklDLCAgICAgICBDT05GSUdfTVVTRU5LSSwgICAgQ09ORklHX1pVTUEsCisJCUNPTkZJR19FU1RFRU0xOTJFLCBDT05GSUdfTVZTMSwgICAgICAgQ09ORklHX2MybW9uLAorCQlDT05GSUdfRVRYMDk0LCAgICAgQ09ORklHX05YODIzLCAgICAgIENPTkZJR19jb2dlbnRfbXBjODI2MCwKKwkJQ09ORklHX0VWQjY0MjYwLCAgIENPTkZJR19PQ1JUQywgICAgICBDT05GSUdfY29nZW50X21wYzh4eCwKKwkJQ09ORklHX0ZBRFM4MjMsICAgIENPTkZJR19PUlNHLCAgICAgICBDT05GSUdfZXA4MjYwLAorCQlDT05GSUdfRkFEUzg1MFNBUiwgQ09ORklHX09YQywgICAgICAgIENPTkZJR19ndzgyNjAsCisJCUNPTkZJR19GQURTODYwVCwgICBDT05GSUdfUENJNDA1LCAgICAgQ09ORklHX2hlcm1lcywKKwkJQ09ORklHX0ZMQUdBRE0sICAgIENPTkZJR19QQ0lQUEMyLCAgICBDT05GSUdfaHltb2QsCisJCUNPTkZJR19GUFM4NTBMLCAgICBDT05GSUdfUENJUFBDNiwgICAgQ09ORklHX2x3bW9uLAorCQlDT05GSUdfR0VOODYwVCwgICAgQ09ORklHX1BJUDQwNSwgICAgIENPTkZJR19wY3VfZSwKKwkJQ09ORklHX0dFTklFVFYsICAgIENPTkZJR19QTTgyNiwgICAgICBDT05GSUdfcHBtYzgyNjAsCisJCUNPTkZJR19HVEgsICAgICAgICBDT05GSUdfUlBYQ2xhc3NpYywgQ09ORklHX3JzZHByb3RvLAorCQlDT05GSUdfSUFEMjEwLCAgICAgQ09ORklHX1JQWGxpdGUsICAgIENPTkZJR19zYmM4MjYwLAorCQlDT05GSUdfRUJPTlksICAgICAgQ09ORklHX3NhY3NuZworCisJCUFSTSBiYXNlZCBib2FyZHM6CisJCS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJQ09ORklHX0hIUF9DUkFETEUsICBDT05GSUdfRE5QMTExMCwgICAgQ09ORklHX0VQNzMxMiwKKwkJQ09ORklHX0lNUEE3LCAgICAgICBDT05GSUdfTEFSVCwgICAgICAgQ09ORklHX0xVQkJPQ0ssCisJCUNPTkZJR19TSEFOTk9OLCAgICAgQ09ORklHX1NNREsyNDAwLCAgIENPTkZJR19TTURLMjQxMCwKKwkJQ09ORklHX1RSQUIKKworCistIENQVSBNb2R1bGUgVHlwZTogKGlmIENPTkZJR19DT0dFTlQgaXMgZGVmaW5lZCkKKwkJRGVmaW5lIGV4YWN0bHkgb25lIG9mCisJCUNPTkZJR19DTUEyODZfNjBfT0xECistLS0gRklYTUUgLS0tIG5vdCB0ZXN0ZWQgeWV0OgorCQlDT05GSUdfQ01BMjg2XzYwLCBDT05GSUdfQ01BMjg2XzIxLCBDT05GSUdfQ01BMjg2XzYwUCwKKwkJQ09ORklHX0NNQTI4N18yMywgQ09ORklHX0NNQTI4N181MAorCistIE1vdGhlcmJvYXJkIFR5cGU6IChpZiBDT05GSUdfQ09HRU5UIGlzIGRlZmluZWQpCisJCURlZmluZSBleGFjdGx5IG9uZSBvZgorCQlDT05GSUdfQ01BMTAxLCBDT05GSUdfQ01BMTAyCisKKy0gTW90aGVyYm9hcmQgSS9PIE1vZHVsZXM6IChpZiBDT05GSUdfQ09HRU5UIGlzIGRlZmluZWQpCisJCURlZmluZSBvbmUgb3IgbW9yZSBvZgorCQlDT05GSUdfQ01BMzAyCisKKy0gTW90aGVyYm9hcmQgT3B0aW9uczogKGlmIENPTkZJR19DTUExMDEgb3IgQ09ORklHX0NNQTEwMiBhcmUgZGVmaW5lZCkKKwkJRGVmaW5lIG9uZSBvciBtb3JlIG9mCisJCUNPTkZJR19MQ0RfSEVBUlRCRUFUCS0gdXBkYXRlIGEgY2hhcmFjdGVyIHBvc2l0aW9uIG9uCisJCQkJCSAgdGhlIGxjZCBkaXNwbGF5IGV2ZXJ5IHNlY29uZCB3aXRoCisJCQkJCSAgYSAicm90YXRvciIgfFwtL3xcLS8KKworLSBNUEM4MjRYIEZhbWlseSBNZW1iZXIgKGlmIENPTkZJR19NUEM4MjRYIGlzIGRlZmluZWQpCisJRGVmaW5lIGV4YWN0bHkgb25lIG9mCisJQ09ORklHX01QQzgyNDAsIENPTkZJR19NUEM4MjQ1CisKKy0gOHh4IENQVSBPcHRpb25zOiAoaWYgdXNpbmcgYW4gOHh4IGNwdSkKKwkJRGVmaW5lIG9uZSBvciBtb3JlIG9mCisJCUNPTkZJR184eHhfR0NMS19GUkVRCS0gaWYgZ2V0X2djbGtfZnJlcSgpIGNhbiBub3Qgd29yayBlLmcuCisJCQkJCSAgbm8gMzJLSHogcmVmZXJlbmNlIFBJVC9SVEMgY2xvY2sKKworLSBDbG9jayBJbnRlcmZhY2U6CisJCUNPTkZJR19DTE9DS1NfSU5fTUhaCisKKwkJVS1Cb290IHN0b3JlcyBhbGwgY2xvY2sgaW5mb3JtYXRpb24gaW4gSHoKKwkJaW50ZXJuYWxseS4gRm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgTGludXgKKwkJa2VybmVscyAod2hpY2ggZXhwZWN0IHRoZSBjbG9ja3MgcGFzc2VkIGluIHRoZQorCQliZF9pbmZvIGRhdGEgdG8gYmUgaW4gTUh6KSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKwkJImNsb2Nrc19pbl9taHoiIGNhbiBiZSBkZWZpbmVkIHNvIHRoYXQgVS1Cb290CisJCWNvbnZlcnRzIGNsb2NrIGRhdGEgdG8gTUhaIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZQorCQlMaW51eCBrZXJuZWwuCisKKwkJV2hlbiBDT05GSUdfQ0xPQ0tTX0lOX01IWiBpcyBkZWZpbmVkLCBhIGRlZmluaXRpb24gb2YKKwkJImNsb2Nrc19pbl9taHo9MSIgaXMgIGF1dG9tYXRpY2FsbHkgIGluY2x1ZGVkICBpbiAgdGhlCisJCWRlZmF1bHQgZW52aXJvbm1lbnQuCisKKy0gQ29uc29sZSBJbnRlcmZhY2U6CisgICAgICAgICAgICAgICAgRGVwZW5kaW5nIG9uIGJvYXJkLCBkZWZpbmUgZXhhY3RseSBvbmUgc2VyaWFsIHBvcnQKKyAgICAgICAgICAgICAgICAobGlrZSBDT05GSUdfOHh4X0NPTlNfU01DMSwgQ09ORklHXzh4eF9DT05TX1NNQzIsCisgICAgICAgICAgICAgICAgQ09ORklHXzh4eF9DT05TX1NDQzEsIC4uLiksIG9yIHN3aXRjaCBvZmYgdGhlIHNlcmlhbAorICAgICAgICAgICAgICAgIGNvbnNvbGUgYnkgZGVmaW5pbmcgQ09ORklHXzh4eF9DT05TX05PTkUKKworCQlOb3RlOiBpZiBDT05GSUdfOHh4X0NPTlNfTk9ORSBpcyBkZWZpbmVkLCB0aGUgc2VyaWFsCisJCXBvcnQgcm91dGluZXMgbXVzdCBiZSBkZWZpbmVkIGVsc2V3aGVyZQorCQkoaS5lLiBzZXJpYWxfaW5pdCgpLCBzZXJpYWxfZ2V0YygpLCAuLi4pCisKKwkJQ09ORklHX0NGQl9DT05TT0xFCisJCUVuYWJsZXMgY29uc29sZSBkZXZpY2UgZm9yIGEgY29sb3IgZnJhbWVidWZmZXIuIE5lZWRzIGZvbGxvd2luZworCQlkZWZpbmVzIChjZi4gc21pTHlueEVNLCBpODA0MiwgYm9hcmQvZWx0ZWMvYmFiN3h4KQorCQkJVklERU9fRkJfTElUVExFX0VORElBTglncmFwaGljIG1lbW9yeSBvcmdhbmlzYXRpb24KKwkJCQkJCShkZWZhdWx0IGJpZyBlbmRpYW4pCisJCQlWSURFT19IV19SRUNURklMTAlncmFwaGljIGNoaXAgc3VwcG9ydHMKKwkJCQkJCXJlY3RhbmdsZSBmaWxsCisJCQkJCQkoY2YuIHNtaUx5bnhFTSkKKwkJCVZJREVPX0hXX0JJVEJMVAkJZ3JhcGhpYyBjaGlwIHN1cHBvcnRzCisJCQkJCQliaXQtYmxpdCAoY2YuIHNtaUx5bnhFTSkKKwkJCVZJREVPX1ZJU0lCTEVfQ09MUwl2aXNpYmxlIHBpeGVsIGNvbHVtbnMKKwkJCQkJCShjb2xzPXBpdGNoKQorCQkJVklERU9fVklTSUJMRV9ST1dTICAgICAgdmlzaWJsZSBwaXhlbCByb3dzCisJCQlWSURFT19QSVhFTF9TSVpFICAgICAgICBieXRlcyBwZXIgcGl4ZWwKKwkJCVZJREVPX0RBVEFfRk9STUFUCWdyYXBoaWMgZGF0YSBmb3JtYXQKKwkJCQkJCSgwLTUsIGNmLiBjZmJfY29uc29sZS5jKQorCQkJVklERU9fRkJfQURSUyAgICAgICAgICAgZnJhbWVidWZmZXIgYWRkcmVzcworCQkJVklERU9fS0JEX0lOSVRfRkNUCWtleWJvYXJkIGludCBmY3QKKwkJCQkJCShpLmUuIGk4MDQyX2tiZF9pbml0KCkpCisJCQlWSURFT19UU1RDX0ZDVAkJdGVzdCBjaGFyIGZjdAorCQkJCQkJKGkuZS4gaTgwNDJfdHN0YykKKwkJCVZJREVPX0dFVENfRkNUCQlnZXQgY2hhciBmY3QKKwkJCQkJCShpLmUuIGk4MDQyX2dldGMpCisJCQlDT05GSUdfQ09OU09MRV9DVVJTT1IJY3Vyc29yIGRyYXdpbmcgb24vb2ZmCisJCQkJCQkocmVxdWlyZXMgYmxpbmsgdGltZXIKKwkJCQkJCWNmLiBpODA0Mi5jKQorCQkJQ0ZHX0NPTlNPTEVfQkxJTktfQ09VTlQgYmxpbmsgaW50ZXJ2YWwgKGNmLiBpODA0Mi5jKQorCQkJQ09ORklHX0NPTlNPTEVfVElNRQlkaXNwbGF5IHRpbWUvZGF0ZSBpbmZvIGluCisJCQkJCQl1cHBlciByaWdodCBjb3JuZXIKKwkJCQkJCShyZXF1aXJlcyBDRkdfQ01EX0RBVEUpCisJCQlDT05GSUdfVklERU9fTE9HTwlkaXNwbGF5IExpbnV4IGxvZ28gaW4KKwkJCQkJCXVwcGVyIGxlZnQgY29ybmVyCisJCQlDT05GSUdfQ09OU09MRV9FWFRSQV9JTkZPCisJCQkJCQlhZGRpb25hbCBib2FyZCBpbmZvIGJlc2lkZQorCQkJCQkJdGhlIGxvZ28KKworICAgICAgICAgICAgICAgIFdoZW4gQ09ORklHX0NGQl9DT05TT0xFIGlzIGRlZmluZWQsIHZpZGVvIGNvbnNvbGUgaXMKKyAgICAgICAgICAgICAgICBkZWZhdWx0IGkvby4gU2VyaWFsIGNvbnNvbGUgY2FuIGJlIGZvcmNlZCB3aXRoCisgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgJ2NvbnNvbGU9c2VyaWFsJy4KKworLSBDb25zb2xlIEJhdWRyYXRlOgorCQlDT05GSUdfQkFVRFJBVEUgLSBpbiBicHMKKwkJU2VsZWN0IG9uZSBvZiB0aGUgYmF1ZHJhdGVzIGxpc3RlZCBpbgorCQlDRkdfQkFVRFJBVEVfVEFCTEUsIHNlZSBiZWxvdy4KKworLSBJbnRlcnJ1cHQgZHJpdmVuIHNlcmlhbCBwb3J0IGlucHV0OgorCQlDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KKworCQlQUEM0MDVHUCBvbmx5LgorCQlVc2UgYW4gaW50ZXJydXB0IGhhbmRsZXIgZm9yIHJlY2VpdmluZyBkYXRhIG9uIHRoZQorCQlzZXJpYWwgcG9ydC4gSXQgYWxzbyBlbmFibGVzIHVzaW5nIGhhcmR3YXJlIGhhbmRzaGFrZQorCQkoUlRTL0NUUykgYW5kIFVBUlQncyBidWlsdC1pbiBGSUZPLiBTZXQgdGhlIG51bWJlciBvZgorCQlieXRlcyB0aGUgaW50ZXJydXB0IGRyaXZlbiBpbnB1dCBidWZmZXIgc2hvdWxkIGhhdmUuCisKKwkJU2V0IHRvIDAgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUgKHRoaXMgaXMgdGhlIGRlZmF1bHQpLgorCQlUaGlzIHdpbGwgYWxzbyBkaXNhYmxlIGhhcmR3YXJlIGhhbmRzaGFrZS4KKworLSBCb290IERlbGF5OglDT05GSUdfQk9PVERFTEFZIC0gaW4gc2Vjb25kcworCQlEZWxheSBiZWZvcmUgYXV0b21hdGljYWxseSBib290aW5nIHRoZSBkZWZhdWx0IGltYWdlOworCQlzZXQgdG8gLTEgdG8gZGlzYWJsZSBhdXRvYm9vdC4KKworCQlTZWUgZG9jL1JFQURNRS5hdXRvYm9vdCBmb3IgdGhlc2Ugb3B0aW9ucyB0aGF0CisJCXdvcmsgd2l0aCBDT05GSUdfQk9PVERFTEFZLiBOb25lIGFyZSByZXF1aXJlZC4KKwkJQ09ORklHX0JPT1RfUkVUUllfVElNRQorCQlDT05GSUdfQk9PVF9SRVRSWV9NSU4KKwkJQ09ORklHX0FVVE9CT09UX0tFWUVECisJCUNPTkZJR19BVVRPQk9PVF9QUk9NUFQKKwkJQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUgorCQlDT05GSUdfQVVUT0JPT1RfU1RPUF9TVFIKKwkJQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUjIKKwkJQ09ORklHX0FVVE9CT09UX1NUT1BfU1RSMgorCQlDT05GSUdfWkVST19CT09UREVMQVlfQ0hFQ0sKKwkJQ09ORklHX1JFU0VUX1RPX1JFVFJZCisKKy0gQXV0b2Jvb3QgQ29tbWFuZDoKKwkJQ09ORklHX0JPT1RDT01NQU5ECisJCU9ubHkgbmVlZGVkIHdoZW4gQ09ORklHX0JPT1RERUxBWSBpcyBlbmFibGVkOworCQlkZWZpbmUgYSBjb21tYW5kIHN0cmluZyB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgZXhlY3V0ZWQKKwkJd2hlbiBubyBjaGFyYWN0ZXIgaXMgcmVhZCBvbiB0aGUgY29uc29sZSBpbnRlcmZhY2UKKwkJd2l0aGluICJCb290IERlbGF5IiBhZnRlciByZXNldC4KKworCQlDT05GSUdfQk9PVEFSR1MKKyAgICAgICAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIHBhc3MgYXJndW1lbnRzIHRvIHRoZSBib290bQorICAgICAgICAgICAgICAgIGNvbW1hbmQuIFRoZSB2YWx1ZSBvZiBDT05GSUdfQk9PVEFSR1MgZ29lcyBpbnRvIHRoZQorICAgICAgICAgICAgICAgIGVudmlyb25tZW50IHZhbHVlICJib290YXJncyIuCisKKwkJQ09ORklHX1JBTUJPT1QgYW5kIENPTkZJR19ORlNCT09UCisgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZXNlIGdvZXMgaW50byB0aGUgZW52aXJvbm1lbnQgYXMKKyAgICAgICAgICAgICAgICAicmFtYm9vdCIgYW5kICJuZnNib290IiByZXNwZWN0aXZlbHksIGFuZCBjYW4gYmUgdXNlZAorICAgICAgICAgICAgICAgIGFzIGEgY29udmVuaWVuY2UsIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gYm9vdGluZyBmcm9tCisgICAgICAgICAgICAgICAgcmFtIGFuZCBuZnMuCisKKy0gUHJlLUJvb3QgQ29tbWFuZHM6CisJCUNPTkZJR19QUkVCT09UCisKKwkJV2hlbiB0aGlzIG9wdGlvbiBpcyAjZGVmaW5lZCwgdGhlIGV4aXN0ZW5jZSBvZiB0aGUKKwkJZW52aXJvbm1lbnQgdmFyaWFibGUgInByZWJvb3QiIHdpbGwgYmUgY2hlY2tlZAorCQlpbW1lZGlhdGVseSBiZWZvcmUgc3RhcnRpbmcgdGhlIENPTkZJR19CT09UREVMQVkKKwkJY291bnRkb3duIGFuZC9vciBydW5uaW5nIHRoZSBhdXRvLWJvb3QgY29tbWFuZCByZXNwLgorCQllbnRlcmluZyBpbnRlcmFjdGl2ZSBtb2RlLgorCisJCVRoaXMgZmVhdHVyZSBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuICJwcmVib290IiBpcworCQlhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBvciBtb2RpZmllZC4gRm9yIGFuIGV4YW1wbGUKKwkJc2VlIHRoZSBMV01PTiBib2FyZCBzcGVjaWZpYyBjb2RlOiBoZXJlICJwcmVib290IiBpcworCQltb2RpZmllZCB3aGVuIHRoZSB1c2VyIGhvbGRzIGRvd24gYSBjZXJ0YWluCisJCWNvbWJpbmF0aW9uIG9mIGtleXMgb24gdGhlIChzcGVjaWFsKSBrZXlib2FyZCB3aGVuCisJCWJvb3RpbmcgdGhlIHN5c3RlbXMKKworLSBTZXJpYWwgRG93bmxvYWQgRWNobyBNb2RlOgorCQlDT05GSUdfTE9BRFNfRUNITworCQlJZiBkZWZpbmVkIHRvIDEsIGFsbCBjaGFyYWN0ZXJzIHJlY2VpdmVkIGR1cmluZyBhCisJCXNlcmlhbCBkb3dubG9hZCAodXNpbmcgdGhlICJsb2FkcyIgY29tbWFuZCkgYXJlCisJCWVjaG9lZCBiYWNrLiBUaGlzIG1pZ2h0IGJlIG5lZWRlZCBieSBzb21lIHRlcm1pbmFsCisJCWVtdWxhdGlvbnMgKGxpa2UgImN1IiksIGJ1dCBtYXkgYXMgd2VsbCBqdXN0IHRha2UKKwkJdGltZSBvbiBvdGhlcnMuIFRoaXMgc2V0dGluZyAjZGVmaW5lJ3MgdGhlIGluaXRpYWwKKwkJdmFsdWUgb2YgdGhlICJsb2Fkc19lY2hvIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworLSBLZ2RiIFNlcmlhbCBCYXVkcmF0ZTogKGlmIENGR19DTURfS0dEQiBpcyBkZWZpbmVkKQorCQlDT05GSUdfS0dEQl9CQVVEUkFURQorCQlTZWxlY3Qgb25lIG9mIHRoZSBiYXVkcmF0ZXMgbGlzdGVkIGluCisJCUNGR19CQVVEUkFURV9UQUJMRSwgc2VlIGJlbG93LgorCistIE1vbml0b3IgRnVuY3Rpb25zOgorCQlDT05GSUdfQ09NTUFORFMKKwkJTW9zdCBtb25pdG9yIGZ1bmN0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgKG9yCisJCWRlLXNlbGVjdGVkKSBieSBhZGp1c3RpbmcgdGhlIGRlZmluaXRpb24gb2YKKwkJQ09ORklHX0NPTU1BTkRTOyB0byBzZWxlY3QgaW5kaXZpZHVhbCBmdW5jdGlvbnMsCisJCSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIGJ5ICJPUiJpbmcgYW55IG9mIHRoZQorCQlmb2xsb3dpbmcgdmFsdWVzOgorCisJCSNkZWZpbmUgZW5hYmxlcyBjb21tYW5kczoKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlDRkdfQ01EX0FTS0VOVgkqIGFzayBmb3IgZW52IHZhcmlhYmxlCisJCUNGR19DTURfQkRJCSAgYmRpbmZvCisJCUNGR19DTURfQkVEQlVHCSAgSW5jbHVkZSBCZWRCdWcgRGVidWdnZXIKKwkJQ0ZHX0NNRF9CT09URAkgIGJvb3RkCisJCUNGR19DTURfQ0FDSEUJICBpY2FjaGUsIGRjYWNoZQorCQlDRkdfQ01EX0NPTlNPTEUJICBjb25pbmZvCisJCUNGR19DTURfREFURQkqIHN1cHBvcnQgZm9yIFJUQywgZGF0ZS90aW1lLi4uCisJCUNGR19DTURfREhDUAkgIERIQ1Agc3VwcG9ydAorCQlDRkdfQ01EX0VDSE8JKiBlY2hvIGFyZ3VtZW50cworCQlDRkdfQ01EX0VFUFJPTQkqIEVFUFJPTSByZWFkL3dyaXRlIHN1cHBvcnQKKwkJQ0ZHX0NNRF9FTEYJICBib290ZWxmLCBib290dngKKwkJQ0ZHX0NNRF9FTlYJICBzYXZlZW52CisJCUNGR19DTURfRkRDCSogRmxvcHB5IERpc2sgU3VwcG9ydAorCQlDRkdfQ01EX0ZMQVNICSAgZmxpbmZvLCBlcmFzZSwgcHJvdGVjdAorCQlDRkdfQ01EX0ZQR0EJICBGUEdBIGRldmljZSBpbml0aWFsaXphdGlvbiBzdXBwb3J0CisJCUNGR19DTURfSTJDCSogSTJDIHNlcmlhbCBidXMgc3VwcG9ydAorCQlDRkdfQ01EX0lERQkqIElERSBoYXJkZGlzayBzdXBwb3J0CisJCUNGR19DTURfSU1JCSAgaW1pbmZvCisJCUNGR19DTURfSU1NQVAJKiBJTU1SIGR1bXAgc3VwcG9ydAorCQlDRkdfQ01EX0lSUQkqIGlycWluZm8KKwkJQ0ZHX0NNRF9LR0RCCSoga2dkYgorCQlDRkdfQ01EX0xPQURCCSAgbG9hZGIKKwkJQ0ZHX0NNRF9MT0FEUwkgIGxvYWRzCisJCUNGR19DTURfTUVNT1JZCSAgbWQsIG1tLCBubSwgbXcsIGNwLCBjbXAsIGNyYywgYmFzZSwKKwkJCQkgIGxvb3AsIG10ZXN0CisJCUNGR19DTURfTUlJCSAgTUlJIHV0aWxpdHkgY29tbWFuZHMKKwkJQ0ZHX0NNRF9ORVQJICBib290cCwgdGZ0cGJvb3QsIHJhcnBib290CisJCUNGR19DTURfUENJCSogcGNpaW5mbworCQlDRkdfQ01EX1BDTUNJQQkqIFBDTUNJQSBzdXBwb3J0CisJCUNGR19DTURfUkVHSU5GTyAqIFJlZ2lzdGVyIGR1bXAKKwkJQ0ZHX0NNRF9SVU4JICBydW4gY29tbWFuZCBpbiBlbnYgdmFyaWFibGUKKwkJQ0ZHX0NNRF9TQ1NJCSogU0NTSSBTdXBwb3J0CisJCUNGR19DTURfU0VUR0VURENSIFN1cHBvcnQgZm9yIERDUiBSZWdpc3RlciBhY2Nlc3MgKDR4eCBvbmx5KQorCQlDRkdfQ01EX1NQSQkqIFNQSSBzZXJpYWwgYnVzIHN1cHBvcnQKKwkJQ0ZHX0NNRF9VU0IJKiBVU0Igc3VwcG9ydAorCQlDRkdfQ01EX0JTUAkqIEJvYXJkIFNQZWNpZmljIGZ1bmN0aW9ucworCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlDRkdfQ01EX0FMTAlhbGwKKworCQlDRkdfQ01EX0RGTAlEZWZhdWx0IGNvbmZpZ3VyYXRpb247IGF0IHRoZSBtb21lbnQKKwkJCQl0aGlzIGlzIGluY2x1ZGVzIGFsbCBjb21tYW5kcywgZXhjZXB0CisJCQkJdGhlIG9uZXMgbWFya2VkIHdpdGggIioiIGluIHRoZSBsaXN0CisJCQkJYWJvdmUuCisKKwkJSWYgeW91IGRvbid0IGRlZmluZSBDT05GSUdfQ09NTUFORFMgaXQgZGVmYXVsdHMgdG8KKwkJQ0ZHX0NNRF9ERkwgaW4gaW5jbHVkZS9jbWRfY29uZmRlZnMuaC4gQSBib2FyZCBjYW4KKwkJb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgaW4gdGhlIHJlc3BlY3RpdmUKKwkJaW5jbHVkZSBmaWxlLgorCisJCUVYQU1QTEU6IElmIHlvdSB3YW50IGFsbCBmdW5jdGlvbnMgZXhjZXB0IG9mIG5ldHdvcmsKKwkJc3VwcG9ydCB5b3UgY2FuIHdyaXRlOgorCisJCSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDRkdfQ01EX0FMTCAmIH5DRkdfQ01EX05FVCkKKworCisJTm90ZToJRG9uJ3QgZW5hYmxlIHRoZSAiaWNhY2hlIiBhbmQgImRjYWNoZSIgY29tbWFuZHMKKyAgICAgICAgICAgICAgICAoY29uZmlndXJhdGlvbiBvcHRpb24gQ0ZHX0NNRF9DQUNIRSkgdW5sZXNzIHlvdSBrbm93CisgICAgICAgICAgICAgICAgd2hhdCB5b3UgKGFuZCB5b3VyIFUtQm9vdCB1c2VycykgYXJlIGRvaW5nLiBEYXRhCisgICAgICAgICAgICAgICAgY2FjaGUgY2Fubm90IGJlIGVuYWJsZWQgb24gc3lzdGVtcyBsaWtlIHRoZSA4eHggb3IKKyAgICAgICAgICAgICAgICA4MjYwICh3aGVyZSBhY2Nlc3NlcyB0byB0aGUgSU1NUiByZWdpb24gbXVzdCBiZQorICAgICAgICAgICAgICAgIHVuY2FjaGVkKSwgYW5kIGl0IGNhbm5vdCBiZSBkaXNhYmxlZCBvbiBhbGwgb3RoZXIKKyAgICAgICAgICAgICAgICBzeXN0ZW1zIHdoZXJlIHdlIChtaXMtKSB1c2UgdGhlIGRhdGEgY2FjaGUgdG8gaG9sZCBhbgorICAgICAgICAgICAgICAgIGluaXRpYWwgc3RhY2sgYW5kIHNvbWUgZGF0YS4KKworCisJCVhYWCAtIHRoaXMgbGlzdCBuZWVkcyB0byBnZXQgdXBkYXRlZCEKKworLSBXYXRjaGRvZzoKKwkJQ09ORklHX1dBVENIRE9HCisJCUlmIHRoaXMgdmFyaWFibGUgaXMgZGVmaW5lZCwgaXQgZW5hYmxlcyB3YXRjaGRvZworCQlzdXBwb3J0LiBUaGVyZSBtdXN0IHN1cHBvcnQgaW4gdGhlIHBsYXRmb3JtIHNwZWNpZmljCisJCWNvZGUgZm9yIGEgd2F0Y2hkb2cuIEZvciB0aGUgOHh4IGFuZCA4MjYwIENQVXMsIHRoZQorCQlTSVUgV2F0Y2hkb2cgZmVhdHVyZSBpcyBlbmFibGVkIGluIHRoZSBTWVBDUgorCQlyZWdpc3Rlci4KKworLSBSZWFsLVRpbWUgQ2xvY2s6CisKKwkJV2hlbiBDRkdfQ01EX0RBVEUgaXMgc2VsZWN0ZWQsIHRoZSB0eXBlIG9mIHRoZSBSVEMKKwkJaGFzIHRvIGJlIHNlbGVjdGVkLCB0b28uIERlZmluZSBleGFjdGx5IG9uZSBvZiB0aGUKKwkJZm9sbG93aW5nIG9wdGlvbnM6CisKKwkJQ09ORklHX1JUQ19NUEM4eHgJLSB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAorCQlDT05GSUdfUlRDX1BDRjg1NjMJLSB1c2UgUGhpbGlwcyBQQ0Y4NTYzIFJUQworCQlDT05GSUdfUlRDX01DMTQ2ODE4CS0gdXNlIE1DMTQ2ODE4IFJUQworCQlDT05GSUdfUlRDX0RTMTMzNwktIHVzZSBNYXhpbSwgSW5jLiBEUzEzMzcgUlRDCisKKy0gVGltZXN0YW1wIFN1cHBvcnQ6CisKKyAgICAgICAgICAgICAgICBXaGVuIENPTkZJR19USU1FU1RBTVAgaXMgc2VsZWN0ZWQsIHRoZSB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAoZGF0ZSBhbmQgdGltZSkgb2YgYW4gaW1hZ2UgaXMgcHJpbnRlZCBieSBpbWFnZQorICAgICAgICAgICAgICAgIGNvbW1hbmRzIGxpa2UgYm9vdG0gb3IgaW1pbmZvLiBUaGlzIG9wdGlvbiBpcworICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCB3aGVuIHlvdSBzZWxlY3QgQ0ZHX0NNRF9EQVRFIC4KKworLSBQYXJ0aXRpb24gU3VwcG9ydDoKKwkJQ09ORklHX01BQ19QQVJUSVRJT04gYW5kL29yIENPTkZJR19ET1NfUEFSVElUSU9OCisJCWFuZC9vciBDT05GSUdfSVNPX1BBUlRJVElPTgorCisJCUlmIElERSBvciBTQ1NJIHN1cHBvcnQJaXMgIGVuYWJsZWQgIChDRkdfQ01EX0lERSAgb3IKKwkJQ0ZHX0NNRF9TQ1NJKSB5b3UgbXVzdCBjb25maWd1cmUgc3VwcG9ydCBmb3IgYXQgbGVhc3QKKwkJb25lIHBhcnRpdGlvbiB0eXBlIGFzIHdlbGwuCisKKy0gSURFIFJlc2V0IG1ldGhvZDoKKwkJQ09ORklHX0lERV9SRVNFVF9ST1VUSU5FCisKKwkJU2V0IHRoaXMgdG8gZGVmaW5lIHRoYXQgaW5zdGVhZCBvZiBhIHJlc2V0IFBpbiwgdGhlCisJCXJvdXRpbmUgaWRlX3NldF9yZXNldChpbnQgaWRlcmVzZXQpIHdpbGwgYmUgdXNlZC4KKworLSBBVEFQSSBTdXBwb3J0OgorCQlDT05GSUdfQVRBUEkKKworCQlTZXQgdGhpcyB0byBlbmFibGUgQVRBUEkgc3VwcG9ydC4KKworLSBTQ1NJIFN1cHBvcnQ6CisJCUF0IHRoZSBtb21lbnQgb25seSB0aGVyZSBpcyBvbmx5IHN1cHBvcnQgZm9yIHRoZQorCQlTWU01M0M4WFggU0NTSSBjb250cm9sbGVyOyBkZWZpbmUKKwkJQ09ORklHX1NDU0lfU1lNNTNDOFhYIHRvIGVuYWJsZSBpdC4KKworCQlDRkdfU0NTSV9NQVhfTFVOIFs4XSwgQ0ZHX1NDU0lfTUFYX1NDU0lfSUQgWzddIGFuZAorCQlDRkdfU0NTSV9NQVhfREVWSUNFIFtDRkdfU0NTSV9NQVhfU0NTSV9JRCAqCisJCUNGR19TQ1NJX01BWF9MVU5dIGNhbiBiZSBhZGp1c3RlZCB0byBkZWZpbmUgdGhlCisJCW1heGltdW0gbnVtYmVycyBvZiBMVU5zLCBTQ1NJIElEJ3MgYW5kIHRhcmdldAorCQlkZXZpY2VzLgorCQlDRkdfU0NTSV9TWU01M0M4WFhfQ0NGIHRvIGZpeCBjbG9jayB0aW1pbmcgKDgwTWh6KQorCistIE5FVFdPUksgU3VwcG9ydCAoUENJKToKKwkJQ09ORklHX0VFUFJPMTAwCisJCVN1cHBvcnQgZm9yIEludGVsIDgyNTU3LzgyNTU5LzgyNTU5RVIgY2hpcHMuCisJCU9wdGlvbmFsIENPTkZJR19FRVBSTzEwMF9TUk9NX1dSSVRFIGVuYWJsZXMgZWVwcm9tCisJCXdyaXRlIHJvdXRpbmUgZm9yIGZpcnN0IHRpbWUgaW5pdGlhbGlzYXRpb24uCisKKwkJQ09ORklHX1RVTElQCisJCVN1cHBvcnQgZm9yIERpZ2l0YWwgMjExNHggY2hpcHMuCisJCU9wdGlvbmFsIENPTkZJR19UVUxJUF9TRUxFQ1RfTUVESUEgZm9yIGJvYXJkIHNwZWNpZmljCisJCW1vZGVtIGNoaXAgaW5pdGlhbGlzYXRpb24gKEtTODc2MS9RUzY2MTEpLgorCisJCUNPTkZJR19OQVRTRU1JCisJCVN1cHBvcnQgZm9yIE5hdGlvbmFsIGRwODM4MTUgY2hpcHMuCisKKwkJQ09ORklHX05TODM4MlgKKwkJU3VwcG9ydCBmb3IgTmF0aW9uYWwgZHA4MzgyWzAxXSBnaWdhYml0IGNoaXBzLgorCistIFVTQiBTdXBwb3J0OgorCQlBdCB0aGUgbW9tZW50IG9ubHkgdGhlIFVIQ0kgaG9zdCBjb250cm9sbGVyIGlzCisJCXN1cHBvcnRlZCAoUElQNDA1LCBNSVA0MDUpOyBkZWZpbmUKKwkJQ09ORklHX1VTQl9VSENJIHRvIGVuYWJsZSBpdC4KKwkJZGVmaW5lIENPTkZJR19VU0JfS0VZQk9BUkQgdG8gZW5hYmxlIHRoZSBVU0IgS2V5Ym9hcmQKKwkJZW5kIGRlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UgdG8gZW5hYmxlIHRoZSBVU0IKKwkJc3RvcmFnZSBkZXZpY2VzLgorCQlOb3RlOgorCQlTdXBwb3J0ZWQgYXJlIFVTQiBLZXlib2FyZHMgYW5kIFVTQiBGbG9wcHkgZHJpdmVzCisJCShURUFDIEZELTA1UFVCKS4KKworLSBLZXlib2FyZCBTdXBwb3J0OgorCQlDT05GSUdfSVNBX0tFWUJPQVJECisKKwkJRGVmaW5lIHRoaXMgdG8gZW5hYmxlIHN0YW5kYXJkIChQQy1TdHlsZSkga2V5Ym9hcmQKKwkJc3VwcG9ydAorCisJCUNPTkZJR19JODA0Ml9LQkQKKwkJU3RhbmRhcmQgUEMga2V5Ym9hcmQgZHJpdmVyIHdpdGggVVMgKGlzIGRlZmF1bHQpIGFuZAorCQlHRVJNQU4ga2V5IGxheW91dCAoc3dpdGNoIHZpYSBlbnZpcm9ubWVudCAna2V5bWFwPWRlJykgc3VwcG9ydC4KKwkJRXhwb3J0IGZ1bmN0aW9uIGk4MDQyX2tiZF9pbml0LCBpODA0Ml90c3RjIGFuZCBpODA0Ml9nZXRjCisJCWZvciBjZmJfY29uc29sZS4gU3VwcG9ydHMgY3Vyc29yIGJsaW5raW5nLgorCistIFZpZGVvIHN1cHBvcnQ6CisJCUNPTkZJR19WSURFTworCisJCURlZmluZSB0aGlzIHRvIGVuYWJsZSB2aWRlbyBzdXBwb3J0IChmb3Igb3V0cHV0IHRvCisJCXZpZGVvKS4KKworCQlDT05GSUdfVklERU9fQ1Q2OTAwMAorCisJCUVuYWJsZSBDaGlwcyAmIFRlY2hub2xvZ2llcyA2OTAwMCBWaWRlbyBjaGlwCisKKwkJQ09ORklHX1ZJREVPX1NNSV9MWU5YRU0KKwkJRW5hYmxlIFNpbGljb24gTW90aW9uIFNNSSA3MTIvNzEwLzgxMCBWaWRlbyBjaGlwCisJCVZpZGVvbW9kZSBhcmUgc2VsZWN0ZWQgdmlhIGVudmlyb25tZW50ICd2aWRlb21vZGUnIHdpdGgKKwkJc3RhbmRhcmQgTGlMbyBtb2RlIG51bWJlcnMuCisJCUZvbGxvd2luZyBtb2RlcyBhcmUgc3VwcG9ydGVkICAoKiBpcyBkZWZhdWx0KToKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMHg2MDAgIDEwMjR4NzY4ICAxMjgweDEwMjQKKyAgICAgICAgICAgICAgMjU2ICAoOGJpdCkgICAgIDMwMyogICAgICAzMDUgICAgICAgMzA3CisgICAgICAgICAgICA2NTUzNiAoMTZiaXQpICAgICAzMTQgICAgICAgMzE3ICAgICAgIDMxYQorICAgICAgICAxNiw3IE1pbGwgKDI0Yml0KSAgICAgMzE1ICAgICAgIDMxOCAgICAgICAzMWIKKwkJKGkuZS4gc2V0ZW52IHZpZGVvbW9kZSAzMTc7IHNhdmVlbnY7IHJlc2V0OykKKworLSBMQ0QgU3VwcG9ydDoJQ09ORklHX0xDRAorCisJCURlZmluZSB0aGlzIHRvIGVuYWJsZSBMQ0Qgc3VwcG9ydCAoZm9yIG91dHB1dCB0byBMQ0QKKwkJZGlzcGxheSk7IGFsc28gc2VsZWN0IG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRpc3BsYXlzCisJCWJ5IGRlZmluaW5nIG9uZSBvZiB0aGVzZToKKworCQlDT05GSUdfTkVDX05MNjY0OEFDMzM6CisKKwkJCU5FQyBOTDY2NDhBQzMzLTE4LiBBY3RpdmUsIGNvbG9yLCBzaW5nbGUgc2Nhbi4KKworCQlDT05GSUdfTkVDX05MNjY0OEJDMjAKKworCQkJTkVDIE5MNjY0OEJDMjAtMDguIDYuNSIsIDY0MHg0ODAuCisJCQlBY3RpdmUsIGNvbG9yLCBzaW5nbGUgc2Nhbi4KKworCQlDT05GSUdfU0hBUlBfMTZ4OQorCisJCQlTaGFycCAzMjB4MjQwLiBBY3RpdmUsIGNvbG9yLCBzaW5nbGUgc2Nhbi4KKwkJCUl0IGlzbid0IDE2eDksIGFuZCBJIGFtIG5vdCBzdXJlIHdoYXQgaXQgaXMuCisKKwkJQ09ORklHX1NIQVJQX0xRNjREMzQxCisKKwkJCVNoYXJwIExRNjREMzQxIGRpc3BsYXksIDY0MHg0ODAuCisJCQlBY3RpdmUsIGNvbG9yLCBzaW5nbGUgc2Nhbi4KKworCQlDT05GSUdfSExEMTA0NQorCisJCQlITEQxMDQ1IGRpc3BsYXksIDY0MHg0ODAuCisJCQlBY3RpdmUsIGNvbG9yLCBzaW5nbGUgc2Nhbi4KKworCQlDT05GSUdfT1BUUkVYX0JXCisKKwkJCU9wdHJleAkgQ0JMNTA4NDAtMiBORi1GVyA5OSAyMiBNNQorCQkJb3IKKwkJCUhpdGFjaGkJIExNRzY5MTJSUEZDLTAwVAorCQkJb3IKKwkJCUhpdGFjaGkJIFNQMTRRMDAyCisKKwkJCTMyMHgyNDAuIEJsYWNrICYgd2hpdGUuCisKKwkJTm9ybWFsbHkgZGlzcGxheSBpcyBibGFjayBvbiB3aGl0ZSBiYWNrZ3JvdW5kOyBkZWZpbmUKKwkJQ0ZHX1dISVRFX09OX0JMQUNLIHRvIGdldCBpdCBpbnZlcnRlZC4KKworLSBFdGhlcm5ldCBhZGRyZXNzOgorCQlDT05GSUdfRVRIQUREUgorCQlDT05GSUdfRVRIMkFERFIKKwkJQ09ORklHX0VUSDNBRERSCisKKwkJRGVmaW5lIGEgZGVmYXVsdCB2YWx1ZSBmb3IgZXRoZXJuZXQgYWRkcmVzcyB0byB1c2UKKwkJZm9yIHRoZSByZXNwZWN0aXZlIGV0aGVybmV0IGludGVyZmFjZSwgaW4gY2FzZSB0aGlzCisJCWlzIG5vdCBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkuCisKKy0gSVAgYWRkcmVzczoKKwkJQ09ORklHX0lQQUREUgorCisJCURlZmluZSBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBJUCBhZGRyZXNzIHRvIHVzZSBmb3IKKwkJdGhlIGRlZmF1bHQgZXRoZXJuZXQgaW50ZXJmYWNlLCBpbiBjYXNlIHRoaXMgaXMgbm90CisJCWRldGVybWluZWQgdGhyb3VnaCBlLmcuIGJvb3RwLgorCistIFNlcnZlciBJUCBhZGRyZXNzOgorCQlDT05GSUdfU0VSVkVSSVAKKworCQlEZWZpbmVzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlSVAgYWRkcmVzcyBvZiBhIFRGVFAKKwkJc2VydmVyIHRvIGNvbnRhY3Qgd2hlbiB1c2luZyB0aGUgInRmdGJvb3QiIGNvbW1hbmQuCisKKy0gQk9PVFAgUmVjb3ZlcnkgTW9kZToKKwkJQ09ORklHX0JPT1RQX1JBTkRPTV9ERUxBWQorCisJCUlmIHlvdSBoYXZlIG1hbnkgdGFyZ2V0cyBpbiBhIG5ldHdvcmsgdGhhdCB0cnkgdG8KKwkJYm9vdCB1c2luZyBCT09UUCwgeW91IG1heSB3YW50IHRvIGF2b2lkIHRoYXQgYWxsCisJCXN5c3RlbXMgc2VuZCBvdXQgQk9PVFAgcmVxdWVzdHMgYXQgcHJlY2lzZWx5IHRoZSBzYW1lCisJCW1vbWVudCAod2hpY2ggd291bGQgaGFwcGVuIGZvciBpbnN0YW5jZSBhdCByZWNvdmVyeQorCQlmcm9tIGEgcG93ZXIgZmFpbHVyZSwgd2hlbiBhbGwgc3lzdGVtcyB3aWxsIHRyeSB0bworCQlib290LCB0aHVzIGZsb29kaW5nIHRoZSBCT09UUCBzZXJ2ZXIuIERlZmluaW5nCisJCUNPTkZJR19CT09UUF9SQU5ET01fREVMQVkgY2F1c2VzIGEgcmFuZG9tIGRlbGF5IHRvIGJlCisJCWluc2VydGVkIGJlZm9yZSBzZW5kaW5nIG91dCBCT09UUCByZXF1ZXN0cy4gVGhlCisJCWZvbGxvd2luZyBkZWxheXMgYXJlIGluc3RlcnRlZCB0aGVuOgorCisJCTFzdCBCT09UUCByZXF1ZXN0OglkZWxheSAwIC4uLiAxIHNlYworCQkybmQgQk9PVFAgcmVxdWVzdDoJZGVsYXkgMCAuLi4gMiBzZWMKKwkJM3JkIEJPT1RQIHJlcXVlc3Q6CWRlbGF5IDAgLi4uIDQgc2VjCisJCTR0aCBhbmQgZm9sbG93aW5nCisJCUJPT1RQIHJlcXVlc3RzOgkJZGVsYXkgMCAuLi4gOCBzZWMKKworLSBTdGF0dXMgTEVEOglDT05GSUdfU1RBVFVTX0xFRAorCisJCVNldmVyYWwgY29uZmlndXJhdGlvbnMgYWxsb3cgdG8gZGlzcGxheSB0aGUgY3VycmVudAorCQlzdGF0dXMgdXNpbmcgYSBMRUQuIEZvciBpbnN0YW5jZSwgdGhlIExFRCB3aWxsIGJsaW5rCisJCWZhc3Qgd2hpbGUgcnVubmluZyBVLUJvb3QgY29kZSwgc3RvcCBibGlua2luZyBhcworCQlzb29uIGFzIGEgcmVwbHkgdG8gYSBCT09UUCByZXF1ZXN0IHdhcyByZWNlaXZlZCwgYW5kCisJCXN0YXJ0IGJsaW5raW5nIHNsb3cgb25jZSB0aGUgTGludXgga2VybmVsIGlzIHJ1bm5pbmcKKwkJKHN1cHBvcnRlZCBieSBhIHN0YXR1cyBMRUQgZHJpdmVyIGluIHRoZSBMaW51eAorCQlrZXJuZWwpLiBEZWZpbmluZyBDT05GSUdfU1RBVFVTX0xFRCBlbmFibGVzIHRoaXMKKwkJZmVhdHVyZSBpbiBVLUJvb3QuCisKKy0gQ0FOIFN1cHBvcnQ6CUNPTkZJR19DQU5fRFJJVkVSCisKKwkJRGVmaW5pbmcgQ09ORklHX0NBTl9EUklWRVIgZW5hYmxlcyBDQU4gZHJpdmVyIHN1cHBvcnQKKwkJb24gdGhvc2Ugc3lzdGVtcyB0aGF0IHN1cHBvcnQgdGhpcyAob3B0aW9uYWwpCisJCWZlYXR1cmUsIGxpa2UgdGhlIFRRTTh4eEwgbW9kdWxlcy4KKworLSBJMkMgU3VwcG9ydDoJQ09ORklHX0hBUkRfSTJDIHwgQ09ORklHX1NPRlRfSTJDCisKKwkJRW5hYmxlcyBJMkMgc2VyaWFsIGJ1cyBjb21tYW5kcy4gIElmIHRoaXMgaXMgc2VsZWN0ZWQsCisJCWVpdGhlciBDT05GSUdfSEFSRF9JMkMgb3IgQ09ORklHX1NPRlRfSTJDIG11c3QgYmUgZGVmaW5lZAorCQl0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBJMkMgZHJpdmVyLgorCisgICAgICAgICAgICAgICAgU2VlIGFsc286IGNvbW1vbi9jbWRfaTJjLmMgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgICAgICAgICAgICAgY29tbWFuZCBsaW5lIGludGVyZmFjZS4KKworCisJCUNPTkZJR19IQVJEX0kyQworCisJCVNlbGVjdHMgdGhlIENQTSBoYXJkd2FyZSBkcml2ZXIgZm9yIEkyQy4KKworCQlDT05GSUdfU09GVF9JMkMKKworCQlVc2Ugc29mdHdhcmUgKGFrYSBiaXQtYmFuZ2luZykgZHJpdmVyIGluc3RlYWQgb2YgQ1BNCisJCW9yIHNpbWlsYXIgaGFyZHdhcmUgc3VwcG9ydCBmb3IgSTJDLiAgVGhpcyBpcyBjb25maWd1cmVkCisJCXZpYSB0aGUgZm9sbG93aW5nIGRlZmluZXMuCisKKwkJSTJDX0lOSVQKKworICAgICAgICAgICAgICAgIChPcHRpb25hbCkuIEFueSBjb21tYW5kcyBuZWNlc3NhcnkgdG8gZW5hYmxlIEkyQworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgb3IgY29uZmlndXJlIHBvcnRzLgorCisJCUkyQ19QT1JUCisKKyAgICAgICAgICAgICAgICAoT25seSBmb3IgTVBDODI2MCBDUFUpLiBUaGUgSS9PIHBvcnQgdG8gdXNlICh0aGUgY29kZQorICAgICAgICAgICAgICAgIGFzc3VtZXMgYm90aCBiaXRzIGFyZSBvbiB0aGUgc2FtZSBwb3J0KS4gVmFsaWQgdmFsdWVzCisgICAgICAgICAgICAgICAgYXJlIDAuLjMgZm9yIHBvcnRzIEEuLkQuCisKKwkJSTJDX0FDVElWRQorCisJCVRoZSBjb2RlIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBJMkMgZGF0YSBsaW5lIGFjdGl2ZQorCQkoZHJpdmVuKS4gIElmIHRoZSBkYXRhIGxpbmUgaXMgb3BlbiBjb2xsZWN0b3IsIHRoaXMKKwkJZGVmaW5lIGNhbiBiZSBudWxsLgorCisJCUkyQ19UUklTVEFURQorCisJCVRoZSBjb2RlIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBJMkMgZGF0YSBsaW5lIHRyaS1zdGF0ZWQKKwkJKGluYWN0aXZlKS4gIElmIHRoZSBkYXRhIGxpbmUgaXMgb3BlbiBjb2xsZWN0b3IsIHRoaXMKKwkJZGVmaW5lIGNhbiBiZSBudWxsLgorCisJCUkyQ19SRUFECisKKwkJQ29kZSB0aGF0IHJldHVybnMgVFJVRSBpZiB0aGUgSTJDIGRhdGEgbGluZSBpcyBoaWdoLAorCQlGQUxTRSBpZiBpdCBpcyBsb3cuCisKKwkJSTJDX1NEQShiaXQpCisKKwkJSWYgPGJpdD4gaXMgVFJVRSwgc2V0cyB0aGUgSTJDIGRhdGEgbGluZSBoaWdoLiBJZiBpdAorCQlpcyBGQUxTRSwgaXQgY2xlYXJzIGl0IChsb3cpLgorCisJCUkyQ19TQ0woYml0KQorCisJCUlmIDxiaXQ+IGlzIFRSVUUsIHNldHMgdGhlIEkyQyBjbG9jayBsaW5lIGhpZ2guIElmIGl0CisJCWlzIEZBTFNFLCBpdCBjbGVhcnMgaXQgKGxvdykuCisKKwkJSTJDX0RFTEFZCisKKwkJVGhpcyBkZWxheSBpcyBpbnZva2VkIGZvdXIgdGltZXMgcGVyIGNsb2NrIGN5Y2xlIHNvIHRoaXMKKwkJY29udHJvbHMgdGhlIHJhdGUgb2YgZGF0YSB0cmFuc2Zlci4gIFRoZSBkYXRhIHJhdGUgdGh1cworCQlpcyAxIC8gKEkyQ19ERUxBWSAqIDQpLgorCistIFNQSSBTdXBwb3J0OglDT05GSUdfU1BJCisKKwkJRW5hYmxlcyBTUEkgZHJpdmVyIChzbyBmYXIgb25seSB0ZXN0ZWQgd2l0aAorCQlTUEkgRUVQUk9NLCBhbHNvIGFuIGluc3RhbmNlIHdvcmtzIHdpdGggQ3J5c3RhbCBBL0QgYW5kCisJCUQvQXMgb24gdGhlIFNBQ1NuZyBib2FyZCkKKworCQlDT05GSUdfU1BJX1gKKworCQlFbmFibGVzIGV4dGVuZGVkICgxNi1iaXQpIFNQSSBFRVBST00gYWRkcmVzc2luZy4KKwkJKHN5bW1ldHJpY2FsIHRvIENPTkZJR19JMkNfWCkKKworCQlDT05GSUdfU09GVF9TUEkKKworICAgICAgICAgICAgICAgIEVuYWJsZXMgYSBzb2Z0d2FyZSAoYml0LWJhbmcpIFNQSSBkcml2ZXIgcmF0aGVyIHRoYW4KKyAgICAgICAgICAgICAgICB1c2luZyBoYXJkd2FyZSBzdXBwb3J0LiBUaGlzIGlzIGEgZ2VuZXJhbCBwdXJwb3NlCisgICAgICAgICAgICAgICAgZHJpdmVyIHRoYXQgb25seSByZXF1aXJlcyB0aHJlZSBnZW5lcmFsIEkvTyBwb3J0IHBpbnMKKyAgICAgICAgICAgICAgICAodHdvIG91dHB1dHMsIG9uZSBpbnB1dCkgdG8gZnVuY3Rpb24uIElmIHRoaXMgaXMKKyAgICAgICAgICAgICAgICBkZWZpbmVkLCB0aGUgYm9hcmQgY29uZmlndXJhdGlvbiBtdXN0IGRlZmluZSBzZXZlcmFsCisgICAgICAgICAgICAgICAgU1BJIGNvbmZpZ3VyYXRpb24gaXRlbXMgKHBvcnQgcGlucyB0byB1c2UsIGV0YykuIEZvcgorICAgICAgICAgICAgICAgIGFuIGV4YW1wbGUsIHNlZSBpbmNsdWRlL2NvbmZpZ3Mvc2Fjc25nLmguCisKKy0gRlBHQSBTdXBwb3J0OiBDT05GSUdfRlBHQV9DT1VOVAorCisgICAgICAgICAgICAgICAgU3BlY2lmeSB0aGUgbnVtYmVyIG9mIEZQR0EgZGV2aWNlcyB0byBzdXBwb3J0LgorCisgICAgICAgICAgICAgICAgQ09ORklHX0ZQR0EKKworICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZXMgb2YgRlBHQSBkZXZpY2VzLiBGb3IKKwkJZXhhbXBsZSwKKyAJCSNkZWZpbmUgQ09ORklHX0ZQR0EgIENGR19YSUxJTlhfVklSVEVYMgorCisgCQlDRkdfRlBHQV9QUk9HX0ZFRURCQUNLCisKKyAgICAgICAgICAgICAgICBFbmFibGUgcHJpbnRpbmcgb2YgaGFzaCBtYXJrcyBkdXJpbmcgRlBHQQorCQljb25maWd1cmF0aW9uLgorCisJCUNGR19GUEdBX0NIRUNLX0JVU1kKKworICAgICAgICAgICAgICAgIEVuYWJsZSBjaGVja3Mgb24gRlBHQSBjb25maWd1cmF0aW9uIGludGVyZmFjZSBidXN5CisgICAgICAgICAgICAgICAgc3RhdHVzIGJ5IHRoZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uLiBUaGlzIG9wdGlvbgorICAgICAgICAgICAgICAgIHdpbGwgcmVxdWlyZSBhIGJvYXJkIG9yIGRldmljZSBzcGVjaWZpYyBmdW5jdGlvbiB0bworICAgICAgICAgICAgICAgIGJlIHdyaXR0ZW4uCisKKwkJQ09ORklHX0ZQR0FfREVMQVkKKworICAgICAgICAgICAgICAgIElmIGRlZmluZWQsIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBkZWxheXMgaW4gdGhlCisgICAgICAgICAgICAgICAgRlBHQSBjb25maWd1cmF0aW9uIGRyaXZlci4KKworCQlDRkdfRlBHQV9DSEVDS19DVFJMQworCisJCUFsbG93IENvbnRyb2wtQyB0byBpbnRlcnJ1cHQgRlBHQSBjb25maWd1cmF0aW9uCisKKwkJQ0ZHX0ZQR0FfQ0hFQ0tfRVJST1IKKworICAgICAgICAgICAgICAgIENoZWNrIGZvciBjb25maWd1cmF0aW9uIGVycm9ycyBkdXJpbmcgRlBHQSBiaXRmaWxlCisgICAgICAgICAgICAgICAgbG9hZGluZy4gRm9yIGV4YW1wbGUsIGFib3J0IGR1cmluZyBWaXJ0ZXggSUkKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGlmIHRoZSBJTklUX0IgbGluZSBnb2VzIGxvdyAod2hpY2gKKyAgICAgICAgICAgICAgICBpbmRpY2F0ZWQgYSBDUkMgZXJyb3IpLgorCisJCUNGR19GUEdBX1dBSVRfSU5JVAorCisgICAgICAgICAgICAgICAgTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIHRoZSBJTklUX0IgbGluZSB0byBkZWFzc2VydAorICAgICAgICAgICAgICAgIGFmdGVyIFBST0JfQiBoYXMgYmVlbiBkZWFzc2VydGVkIGR1cmluZyBhIFZpcnRleCBJSQorICAgICAgICAgICAgICAgIEZQR0EgY29uZmlndXJhdGlvbiBzZXF1ZW5jZS4gVGhlIGRlZmF1bHQgdGltZSBpcyA1MDAgbVMuCisKKwkJQ0ZHX0ZQR0FfV0FJVF9CVVNZCisKKyAgICAgICAgICAgICAgICBNYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgQlVTWSB0byBkZWFzc2VydCBkdXJpbmcKKyAgICAgICAgICAgICAgICBWaXJ0ZXggSUkgRlBHQSBjb25maWd1cmF0aW9uLiBUaGUgZGVmYXVsdCBpcyA1IG1TLgorCisJCUNGR19GUEdBX1dBSVRfQ09ORklHCisKKyAgICAgICAgICAgICAgICBUaW1lIHRvIHdhaXQgYWZ0ZXIgRlBHQSBjb25maWd1cmF0aW9uLiBUaGUgZGVmYXVsdCBpcworCQkyMDAgbVMuCisKKy0gRlBHQSBTdXBwb3J0OglDT05GSUdfRlBHQV9DT1VOVAorCisgCQlTcGVjaWZ5IHRoZSBudW1iZXIgb2YgRlBHQSBkZXZpY2VzIHRvIHN1cHBvcnQuCisKKyAJCUNPTkZJR19GUEdBCisKKyAJCVVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZXMgb2YgRlBHQSBkZXZpY2VzLiAgRm9yIGV4YW1wbGUsCisgCQkjZGVmaW5lIENPTkZJR19GUEdBICBDRkdfWElMSU5YX1ZJUlRFWDIKKworIAkJQ0ZHX0ZQR0FfUFJPR19GRUVEQkFDSworCisgCQlFbmFibGUgcHJpbnRpbmcgb2YgaGFzaCBtYXJrcyBkdXJpbmcgRlBHQSBjb25maWd1cmF0aW9uLgorCisJCUNGR19GUEdBX0NIRUNLX0JVU1kKKworICAgICAgICAgICAgICAgIEVuYWJsZSBjaGVja3Mgb24gRlBHQSBjb25maWd1cmF0aW9uIGludGVyZmFjZSBidXN5CisgICAgICAgICAgICAgICAgc3RhdHVzIGJ5IHRoZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uLiBUaGlzIG9wdGlvbgorICAgICAgICAgICAgICAgIHdpbGwgcmVxdWlyZSBhIGJvYXJkIG9yIGRldmljZSBzcGVjaWZpYyBmdW5jdGlvbiB0bworICAgICAgICAgICAgICAgIGJlIHdyaXR0ZW4uCisKKwkJQ09ORklHX0ZQR0FfREVMQVkKKworCQlJZiBkZWZpbmVkLCBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgZGVsYXlzIGluIHRoZSBGUEdBCisJCWNvbmZpZ3VyYXRpb24gZHJpdmVyLgorCisJCUNGR19GUEdBX0NIRUNLX0NUUkxDCisJCUFsbG93IENvbnRyb2wtQyB0byBpbnRlcnJ1cHQgRlBHQSBjb25maWd1cmF0aW9uCisKKwkJQ0ZHX0ZQR0FfQ0hFQ0tfRVJST1IKKworICAgICAgICAgICAgICAgIENoZWNrIGZvciBjb25maWd1cmF0aW9uIGVycm9ycyBkdXJpbmcgRlBHQSBiaXRmaWxlCisgICAgICAgICAgICAgICAgbG9hZGluZy4gRm9yIGV4YW1wbGUsIGFib3J0IGR1cmluZyBWaXJ0ZXggSUkKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGlmIHRoZSBJTklUX0IgbGluZSBnb2VzIGxvdyAod2hpY2gKKyAgICAgICAgICAgICAgICBpbmRpY2F0ZWQgYSBDUkMgZXJyb3IpLgorCisJCUNGR19GUEdBX1dBSVRfSU5JVAorCisgICAgICAgICAgICAgICAgTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIHRoZSBJTklUX0IgbGluZSB0byBkZWFzc2VydAorICAgICAgICAgICAgICAgIGFmdGVyIFBST0JfQiBoYXMgYmVlbiBkZWFzc2VydGVkIGR1cmluZyBhIFZpcnRleCBJSQorICAgICAgICAgICAgICAgIEZQR0EgY29uZmlndXJhdGlvbiBzZXF1ZW5jZS4gVGhlIGRlZmF1bHQgdGltZSBpcyA1MDAKKyAgICAgICAgICAgICAgICBtUy4KKworCQlDRkdfRlBHQV9XQUlUX0JVU1kKKworICAgICAgICAgICAgICAgIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBCVVNZIHRvIGRlYXNzZXJ0IGR1cmluZworICAgICAgICAgICAgICAgIFZpcnRleCBJSSBGUEdBIGNvbmZpZ3VyYXRpb24uIFRoZSBkZWZhdWx0IGlzIDUgbVMuCisKKwkJQ0ZHX0ZQR0FfV0FJVF9DT05GSUcKKworICAgICAgICAgICAgICAgIFRpbWUgdG8gd2FpdCBhZnRlciBGUEdBIGNvbmZpZ3VyYXRpb24uIFRoZSBkZWZhdWx0IGlzCisgICAgICAgICAgICAgICAgMjAwIG1TLgorCistIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDoKKwkJQ09ORklHX0lERU5UX1NUUklORworCisgICAgICAgICAgICAgICAgSWYgZGVmaW5lZCwgdGhpcyBzdHJpbmcgd2lsbCBiZSBhZGRlZCB0byB0aGUgVS1Cb290CisgICAgICAgICAgICAgICAgdmVyc2lvbiBpbmZvcm1hdGlvbiAoVV9CT09UX1ZFUlNJT04pCisKKy0gVmVuZG9yIFBhcmFtZXRlciBQcm90ZWN0aW9uOgorCisgICAgICAgICAgICAgICAgVS1Cb290IGNvbnNpZGVycyB0aGUgdmFsdWVzIG9mIHRoZSBlbnZpcm9ubWVudAorICAgICAgICAgICAgICAgIHZhcmlhYmxlcyAic2VyaWFsIyIgKEJvYXJkIFNlcmlhbCBOdW1iZXIpIGFuZAorICAgICAgICAgICAgICAgICJldGhhZGRyIiAoRXRoZXJuZXQgQWRkcmVzcykgdG8gYmIgcGFyYW1ldGVycyB0aGF0CisgICAgICAgICAgICAgICAgYXJlIHNldCBvbmNlIGJ5IHRoZSBib2FyZCB2ZW5kb3IgLyBtYW51ZmFjdHVyZXIsIGFuZAorICAgICAgICAgICAgICAgIHByb3RlY3RzIHRoZXNlIHZhcmlhYmxlcyBmcm9tIGNhc3VhbCBtb2RpZmljYXRpb24gYnkKKyAgICAgICAgICAgICAgICB0aGUgdXNlci4gT25jZSBzZXQsIHRoZXNlIHZhcmlhYmxlcyBhcmUgcmVhZC1vbmx5LAorICAgICAgICAgICAgICAgIGFuZCB3cml0ZSBvciBkZWxldGUgYXR0ZW1wdHMgYXJlIHJlamVjdGVkLiBZb3UgY2FuCisgICAgICAgICAgICAgICAgY2hhbmdlIHRoaXMgYmVodmlvdXI6CisKKwkJSWYgQ09ORklHX0VOVl9PVkVSV1JJVEUgaXMgI2RlZmluZWQgaW4geW91ciBjb25maWcKKwkJZmlsZSwgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIHZlbmRvciBwYXJhbWV0ZXJzIGlzCisJCWNvbXBsZXRlbHkgZGlzYWJsZWQuIEFueWJvZHkgY2FuIGNoYW5nZSBvciBkZWx0ZQorCQl0aGVzZSBwYXJhbWV0ZXJzLgorCisJCUFsdGVybmF0aXZlbHksIGlmIHlvdSAjZGVmaW5lIF9ib3RoXyBDT05GSUdfRVRIQUREUgorCQlfYW5kXyBDT05GSUdfT1ZFUldSSVRFX0VUSEFERFJfT05DRSwgYSBkZWZhdWx0CisJCWV0aGVybmV0IGFkZHJlc3MgaXMgaW5zdGFsbGVkIGluIHRoZSBlbnZpcm9ubWVudCwKKwkJd2hpY2ggY2FuIGJlIGNoYW5nZWQgZXhhY3RseSBPTkNFIGJ5IHRoZSB1c2VyLiBbVGhlCisJCXNlcmlhbCMgaXMgdW5hZmZlY3RlZCBieSB0aGlzLCBpLiBlLiBpdCByZW1haW5zCisJCXJlYWQtb25seS5dCisKKy0gUHJvdGVjdGVkIFJBTToKKwkJQ09ORklHX1BSQU0KKworCQlEZWZpbmUgdGhpcyB2YXJpYWJsZSB0byBlbmFibGUgdGhlIHJlc2VydmF0aW9uIG9mCisJCSJwcm90ZWN0ZWQgUkFNIiwgaS4gZS4gUkFNIHdoaWNoIGlzIG5vdCBvdmVyd3JpdHRlbgorCQlieSBVLUJvb3QuIERlZmluZSBDT05GSUdfUFJBTSB0byBob2xkIHRoZSBudW1iZXIgb2YKKwkJa0IgeW91IHdhbnQgdG8gcmVzZXJ2ZSBmb3IgcFJBTS4gWW91IGNhbiBvdmVyd3JpdGUKKwkJdGhpcyBkZWZhdWx0IHZhbHVlIGJ5IGRlZmluaW5nIGFuIGVudmlyb25tZW50CisJCXZhcmlhYmxlICJwcmFtIiB0byB0aGUgbnVtYmVyIG9mIGtCIHlvdSB3YW50IHRvCisJCXJlc2VydmUuIE5vdGUgdGhhdCB0aGUgYm9hcmQgaW5mbyBzdHJ1Y3R1cmUgd2lsbAorCQlzdGlsbCBzaG93IHRoZSBmdWxsIGFtb3VudCBvZiBSQU0uIElmIHBSQU0gaXMKKwkJcmVzZXJ2ZWQsIGEgbmV3IGVudmlyb25tZW50IHZhcmlhYmxlICJtZW0iIHdpbGwKKwkJYXV0b21hdGljYWxseSBiZSBkZWZpbmVkIHRvIGhvbGQgdGhlIGFtb3VudCBvZgorCQlyZW1haW5pbmcgUkFNIGluIGEgZm9ybSB0aGF0IGNhbiBiZSBwYXNzZWQgYXMgYm9vdAorCQlhcmd1bWVudCB0byBMaW51eCwgZm9yIGluc3RhbmNlIGxpa2UgdGhhdDoKKworCQkJc2V0ZW52IGJvb3RhcmdzIC4uLiBtZW09XCQobWVtKQorCQkJc2F2ZWVudgorCisJCVRoaXMgd2F5IHlvdSBjYW4gdGVsbCBMaW51eCBub3QgdG8gdXNlIHRoaXMgbWVtb3J5LAorCQllaXRoZXIsIHdoaWNoIHJlc3VsdHMgaW4gYSBtZW1vcnkgcmVnaW9uIHRoYXQgd2lsbAorCQlub3QgYmUgYWZmZWN0ZWQgYnkgcmVib290cy4KKworCQkqV0FSTklORyogSWYgeW91ciBib2FyZCBjb25maWd1cmF0aW9uIHVzZXMgYXV0b21hdGljCisJCWRldGVjdGlvbiBvZiB0aGUgUkFNIHNpemUsIHlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0CisJCXRoaXMgbWVtb3J5IHRlc3QgaXMgbm9uLWRlc3RydWN0aXZlLiBTbyBmYXIsIHRoZQorCQlmb2xsb3dpbmcgYm9hcmQgY29uZmlndXJhdGlvbnMgYXJlIGtub3duIHRvIGJlCisJCSJwUkFNLWNsZWFuIjoKKworCQkJRVRYMDk0LCBJVk1TOCwgSVZNTDI0LCBTUEQ4eHgsIFRRTTh4eEwsCisJCQlIRVJNRVMsIElQODYwLCBSUFhsaXRlLCBMV01PTiwgTEFOVEVDLAorCQkJUENVX0UsIEZMQUdBRE0sIFRRTTgyNjAKKworLSBFcnJvciBSZWNvdmVyeToKKwkJQ09ORklHX1BBTklDX0hBTkcKKworCQlEZWZpbmUgdGhpcyB2YXJpYWJsZSB0byBzdG9wIHRoZSBzeXN0ZW0gaW4gY2FzZSBvZiBhCisJCWZhdGFsIGVycm9yLCBzbyB0aGF0IHlvdSBoYXZlIHRvIHJlc2V0IGl0IG1hbnVhbGx5LgorCQlUaGlzIGlzIHByb2JhYmx5IE5PVCBhIGdvb2QgaWRlYSBmb3IgYW4gZW1iZWRkZWQKKwkJc3lzdGVtIHdoZXJlIHlvdSB3YW50IHRvIHN5c3RlbSB0byByZWJvb3QKKwkJYXV0b21hdGljYWxseSBhcyBmYXN0IGFzIHBvc3NpYmxlLCBidXQgaXQgbWF5IGJlCisJCXVzZWZ1bCBkdXJpbmcgZGV2ZWxvcG1lbnQgc2luY2UgeW91IGNhbiB0cnkgdG8gZGVidWcKKwkJdGhlIGNvbmRpdGlvbnMgdGhhdCBsZWFkIHRvIHRoZSBzaXR1YXRpb24uCisKKwkJQ09ORklHX05FVF9SRVRSWV9DT1VOVAorCisgICAgICAgICAgICAgICAgVGhpcyB2YXJpYWJsZSBkZWZpbmVzIHRoZSBudW1iZXIgb2YgcmV0cmllcyBmb3IKKyAgICAgICAgICAgICAgICBuZXR3b3JrIG9wZXJhdGlvbnMgbGlrZSBBUlAsIFJBUlAsIFRGVFAsIG9yIEJPT1RQCisgICAgICAgICAgICAgICAgYmVmb3JlIGdpdmluZyB1cCB0aGUgb3BlcmF0aW9uLiBJZiBub3QgZGVmaW5lZCwgYQorICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgb2YgNSBpcyB1c2VkLgorCistIENvbW1hbmQgSW50ZXJwcmV0ZXI6CisJCUNGR19IVVNIX1BBUlNFUgorCisJCURlZmluZSB0aGlzIHZhcmlhYmxlIHRvIGVuYWJsZSB0aGUgImh1c2giIHNoZWxsIChmcm9tCisJCUJ1c3lib3gpIGFzIGNvbW1hbmQgbGluZSBpbnRlcnByZXRlciwgdGh1cyBlbmFibGluZworCQlwb3dlcmZ1bCBjb21tYW5kIGxpbmUgc3ludGF4IGxpa2UKKwkJaWYuLi50aGVuLi4uZWxzZS4uLmZpIGNvbmRpdGlvbmFscyBvciBgJiYnIGFuZCAnfHwnCisJCWNvbnN0cnVjdHMgKCJzaGVsbCBzY3JpcHRzIikuCisKKwkJSWYgdW5kZWZpbmVkLCB5b3UgZ2V0IHRoZSBvbGQsIG11Y2ggc2ltcGxlciBiZWhhdmlvdXIKKwkJd2l0aCBhIHNvbWV3aGF0IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludC4KKworCisJCUNGR19QUk9NUFRfSFVTSF9QUzIKKworCQlUaGlzIGRlZmluZXMgdGhlIHNlY29uZGFyeSBwcm9tcHQgc3RyaW5nLCB3aGljaCBpcworCQlwcmludGVkIHdoZW4gdGhlIGNvbW1hbmQgaW50ZXJwcmV0ZXIgbmVlZHMgbW9yZSBpbnB1dAorCQl0byBjb21wbGV0ZSBhIGNvbW1hbmQuIFVzdWFsbHkgIj4gIi4KKworCU5vdGU6CisKKyAgICAgICAgICAgICAgICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIGxvY2FsIHZhcmlhYmxlcworICAgICAgICAgICAgICAgIHNwYWNlIGFuZCBnbG9iYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNwYWNlIGFyZQorICAgICAgICAgICAgICAgIHNlcGFyYXRlZC4gTG9jYWwgdmFyaWFibGVzIGFyZSB0aG9zZSB5b3UgZGVmaW5lIGJ5CisgICAgICAgICAgICAgICAgc2ltcGx5IHR5cGluZyBsaWtlIGBuYW1lPXZhbHVlJy4gVG8gYWNjZXNzIGEgbG9jYWwKKyAgICAgICAgICAgICAgICB2YXJpYWJsZSBsYXRlciBvbiwgeW91IGhhdmUgd3JpdGUgYCRuYW1lJyBvcgorICAgICAgICAgICAgICAgIGAke25hbWV9JzsgdmFyaWFibGUgZGlyZWN0bHkgYnkgdHlwaW5nIHNheSBgJG5hbWUnIGF0CisgICAgICAgICAgICAgICAgdGhlIGNvbW1hbmQgcHJvbXB0LgorCisgICAgICAgICAgICAgICAgR2xvYmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgdGhvc2UgeW91IHVzZQorICAgICAgICAgICAgICAgIHNldGVudi9wcmludGVudiB0byB3b3JrIHdpdGguIFRvIHJ1biBhIGNvbW1hbmQgc3RvcmVkCisgICAgICAgICAgICAgICAgaW4gc3VjaCBhIHZhcmlhYmxlLCB5b3UgbmVlZCB0byB1c2UgdGhlIHJ1biBjb21tYW5kLAorICAgICAgICAgICAgICAgIGFuZCB5b3UgbXVzdCBub3QgdXNlIHRoZSAnJCcgc2lnbiB0byBhY2Nlc3MgdGhlbS4KKworCQlUbyBzdG9yZSBjb21tYW5kcyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGEKKwkJdmFyaWFibGUsIHBsZWFzZSB1c2UgZG91YmxlIHF1b3RhdGlvbiBtYXJrcworCQlzdXJyb3VuZGluZyB0aGUgd2hvbGUgdGV4dCBvZiB0aGUgdmFyaWFibGUsIGluc3RlYWQKKwkJb2YgdGhlIGJhY2tzbGFzaGVzIGJlZm9yZSBzZW1pY29sb25zIGFuZCBzcGVjaWFsCisJCXN5bWJvbHMuCisKKy0gRGVmYXVsdCBFbnZpcm9ubWVudAorCQlDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCisKKyAgICAgICAgICAgICAgICBEZWZpbmUgdGhpcyB0byBjb250YWluIGFueSBudW1iZXIgb2YgbnVsbCB0ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgc3RyaW5ncyAodmFyaWFibGUgPSB2YWx1ZSBwYWlycykgdGhhdCB3aWxsIGJlIHBhcnQgb2YKKyAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBlbnZpcm9tZW50IGNvbXBpbGVkIGludG8gdGhlIGJvb3QgaW1hZ2UuCisgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHBsYWNlIHNvbWV0aGluZyBsaWtlIHRoaXMgaW4geW91cgorICAgICAgICAgICAgICAgIGJvYXJkJ3MgY29uZmlnIGZpbGU6CisKKwkJI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTIFwKKwkJCSJteXZhcjE9dmFsdWUxXDAiIFwKKwkJCSJteXZhcjI9dmFsdWUyXDAiCisKKyAgICAgICAgICAgICAgICBXYXJuaW5nOiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiBrbm93bGVkZ2UgYWJvdXQgdGhlCisgICAgICAgICAgICAgICAgaW50ZXJuYWwgZm9ybWF0IGhvdyB0aGUgZW52aXJvbm1lbnQgaXMgc3RvcmVkIGJ5IHRoZQorICAgICAgICAgICAgICAgIFUtQm9vdCBjb2RlLiBUaGlzIGlzIE5PVCBhbiBvZmZpY2lhbCwgZXhwb2VydGVkCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlISBBbHRob3VnaCBpdCBpcyB1bmxpa2VseSB0aGF0IHRoaXMgZm9ybWF0CisgICAgICAgICAgICAgICAgd2lsbCBjaGFuZ2Ugc29vbiwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIGVpdGhlci4KKwkJWW91IGJldHRlciBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBoZXJlLgorCisgICAgICAgICAgICAgICAgTm90ZTogb3Zlcmx5IChhYil1c2Ugb2YgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgaXMKKyAgICAgICAgICAgICAgICBkaXNjb3VyYWdlZC4gTWFrZSBzdXJlIHRvIGNoZWNrIG90aGVyIHdheXMgdG8gcHJlc2V0CisgICAgICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IGxpa2UgdGhlIGF1dG9zY3JpcHQgZnVuY3Rpb24gb3IgdGhlCisgICAgICAgICAgICAgICAgYm9vdCBjb21tYW5kIGZpcnN0LgorCistIFNob3cgYm9vdCBwcm9ncmVzcworCQlDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCisKKyAgICAgICAgICAgICAgICBEZWZpbmluZyB0aGlzIG9wdGlvbiBhbGxvd3MgdG8gYWRkIHNvbWUgYm9hcmQtCisgICAgICAgICAgICAgICAgc3BlY2lmaWMgY29kZSAoY2FsbGluZyBhIHVzZXItcHJvdmlkZWQgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAic2hvd19ib290X3Byb2dyZXNzKGludCkiKSB0aGF0IGVuYWJsZXMgeW91IHRvIHNob3cKKyAgICAgICAgICAgICAgICB0aGUgc3lzdGVtJ3MgYm9vdCBwcm9ncmVzcyBvbiBzb21lIGRpc3BsYXkgKGZvcgorICAgICAgICAgICAgICAgIGV4YW1wbGUsIHNvbWUgTEVEJ3MpIG9uIHlvdXIgYm9hcmQuIEF0IHRoZSBtb21lbnQsCisgICAgICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBjaGVja3BvaW50cyBhcmUgaW1wbGVtZW50ZWQ6CisKKyAgQXJnCVdoZXJlCQkJV2hlbgorICAgIDEJY29tbW9uL2NtZF9ib290bS5jCWJlZm9yZSBhdHRlbXB0aW5nIHRvIGJvb3QgYW4gaW1hZ2UKKyAgIC0xCWNvbW1vbi9jbWRfYm9vdG0uYwlJbWFnZSBoZWFkZXIgaGFzIGJhZCAgICAgbWFnaWMgbnVtYmVyCisgICAgMgljb21tb24vY21kX2Jvb3RtLmMJSW1hZ2UgaGVhZGVyIGhhcyBjb3JyZWN0IG1hZ2ljIG51bWJlcgorICAgLTIJY29tbW9uL2NtZF9ib290bS5jCUltYWdlIGhlYWRlciBoYXMgYmFkICAgICBjaGVja3N1bQorICAgIDMJY29tbW9uL2NtZF9ib290bS5jCUltYWdlIGhlYWRlciBoYXMgY29ycmVjdCBjaGVja3N1bQorICAgLTMJY29tbW9uL2NtZF9ib290bS5jCUltYWdlIGRhdGEgICBoYXMgYmFkICAgICBjaGVja3N1bQorICAgIDQJY29tbW9uL2NtZF9ib290bS5jCUltYWdlIGRhdGEgICBoYXMgY29ycmVjdCBjaGVja3N1bQorICAgLTQJY29tbW9uL2NtZF9ib290bS5jCUltYWdlIGlzIGZvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUKKyAgICA1CWNvbW1vbi9jbWRfYm9vdG0uYwlBcmNoaXRlY3R1cmUgY2hlY2sgT0sKKyAgIC01CWNvbW1vbi9jbWRfYm9vdG0uYwlXcm9uZyBJbWFnZSBUeXBlIChub3Qga2VybmVsLCBtdWx0aSwgc3RhbmRhbG9uZSkKKyAgICA2CWNvbW1vbi9jbWRfYm9vdG0uYwlJbWFnZSBUeXBlIGNoZWNrIE9LCisgICAtNgljb21tb24vY21kX2Jvb3RtLmMJZ3VuemlwIHVuY29tcHJlc3Npb24gZXJyb3IKKyAgIC03CWNvbW1vbi9jbWRfYm9vdG0uYwlVbmltcGxlbWVudGVkIGNvbXByZXNzaW9uIHR5cGUKKyAgICA3CWNvbW1vbi9jbWRfYm9vdG0uYwlVbmNvbXByZXNzaW9uIE9LCisgICAtOAljb21tb24vY21kX2Jvb3RtLmMJV3JvbmcgSW1hZ2UgVHlwZSAobm90IGtlcm5lbCwgbXVsdGksIHN0YW5kYWxvbmUpCisgICAgOAljb21tb24vY21kX2Jvb3RtLmMJSW1hZ2UgVHlwZSBjaGVjayBPSworICAgLTkJY29tbW9uL2NtZF9ib290bS5jCVVuc3VwcG9ydGVkIE9TIChub3QgTGludXgsIEJTRCwgVnhXb3JrcywgUU5YKQorICAgIDkJY29tbW9uL2NtZF9ib290bS5jCVN0YXJ0IGluaXRpYWwgcmFtZGlzayB2ZXJpZmljYXRpb24KKyAgLTEwCWNvbW1vbi9jbWRfYm9vdG0uYwlSYW1kaXNrIGhlYWRlciBoYXMgYmFkICAgICBtYWdpYyBudW1iZXIKKyAgLTExCWNvbW1vbi9jbWRfYm9vdG0uYwlSYW1kaXNrIGhlYWRlciBoYXMgYmFkICAgICBjaGVja3N1bQorICAgMTAJY29tbW9uL2NtZF9ib290bS5jCVJhbWRpc2sgaGVhZGVyIGlzIE9LCisgIC0xMgljb21tb24vY21kX2Jvb3RtLmMJUmFtZGlzayBkYXRhICAgaGFzIGJhZCAgICAgY2hlY2tzdW0KKyAgIDExCWNvbW1vbi9jbWRfYm9vdG0uYwlSYW1kaXNrIGRhdGEgICBoYXMgY29ycmVjdCBjaGVja3N1bQorICAgMTIJY29tbW9uL2NtZF9ib290bS5jCVJhbWRpc2sgdmVyaWZpY2F0aW9uIGNvbXBsZXRlLCBzdGFydCBsb2FkaW5nCisgIC0xMwljb21tb24vY21kX2Jvb3RtLmMJV3JvbmcgSW1hZ2UgVHlwZSAobm90IFBQQyBMaW51eCBSYW1kaXNrKQorICAgMTMJY29tbW9uL2NtZF9ib290bS5jCVN0YXJ0IG11bHRpZmlsZSBpbWFnZSB2ZXJpZmljYXRpb24KKyAgIDE0CWNvbW1vbi9jbWRfYm9vdG0uYwlObyBpbml0aWFsIHJhbWRpc2ssIG5vIG11bHRpZmlsZSwgY29udGludWUuCisgICAxNQljb21tb24vY21kX2Jvb3RtLmMJQWxsIHByZXBhcmF0aW9uIGRvbmUsIHRyYW5zZmVycmluZyBjb250cm9sIHRvIE9TCisKKyAgIC0xCWNvbW1vbi9jbWRfZG9jLmMJQmFkIHVzYWdlIG9mICJkb2MiIGNvbW1hbmQKKyAgIC0xCWNvbW1vbi9jbWRfZG9jLmMJTm8gYm9vdCBkZXZpY2UKKyAgIC0xCWNvbW1vbi9jbWRfZG9jLmMJVW5rbm93biBDaGlwIElEIG9uIGJvb3QgZGV2aWNlCisgICAtMQljb21tb24vY21kX2RvYy5jCVJlYWQgRXJyb3Igb24gYm9vdCBkZXZpY2UKKyAgIC0xCWNvbW1vbi9jbWRfZG9jLmMJSW1hZ2UgaGVhZGVyIGhhcyBiYWQgbWFnaWMgbnVtYmVyCisKKyAgIC0xCWNvbW1vbi9jbWRfaWRlLmMJQmFkIHVzYWdlIG9mICJpZGUiIGNvbW1hbmQKKyAgIC0xCWNvbW1vbi9jbWRfaWRlLmMJTm8gYm9vdCBkZXZpY2UKKyAgIC0xCWNvbW1vbi9jbWRfaWRlLmMJVW5rbm93biBib290IGRldmljZQorICAgLTEJY29tbW9uL2NtZF9pZGUuYwlVbmtub3duIHBhcnRpdGlvbiB0YWJsZQorICAgLTEJY29tbW9uL2NtZF9pZGUuYwlJbnZhbGlkIHBhcnRpdGlvbiB0eXBlCisgICAtMQljb21tb24vY21kX2lkZS5jCVJlYWQgRXJyb3Igb24gYm9vdCBkZXZpY2UKKyAgIC0xCWNvbW1vbi9jbWRfaWRlLmMJSW1hZ2UgaGVhZGVyIGhhcyBiYWQgbWFnaWMgbnVtYmVyCisKKyAgIC0xCWNvbW1vbi9jbWRfbnZlZGl0LmMJRW52aXJvbm1lbnQgbm90IGNoYW5nYWJsZSwgYnV0IGhhcyBiYWQgQ1JDCisKKworTW9kZW0gU3VwcG9ydDoKKy0tLS0tLS0tLS0tLS0tCisKK1tzbyBmYXIgb25seSBmb3IgU01ESzI0MDAgYm9hcmRdCisKKy0gTW9kZW0gc3VwcG9ydCBlbmRhYmxlOgorCQlDT05GSUdfTU9ERU1fU1VQUE9SVAorCistIFJUUy9DVFMgRmxvdyBjb250cm9sIGVuYWJsZToKKwkJQ09ORklHX0hXRkxPVworCistIE1vZGVtIGRlYnVnIHN1cHBvcnQ6CisJCUNPTkZJR19NT0RFTV9TVVBQT1JUX0RFQlVHCisKKyAgICAgICAgICAgICAgICBFbmFibGVzIGRlYnVnZ2luZyBzdHVmZiAoY2hhciBzY3JlZW5bMTAyNF0sIGRiZygpKQorICAgICAgICAgICAgICAgIGZvciBtb2RlbSBzdXBwb3J0LiBVc2VmdWwgb25seSB3aXRoIEJESTIwMDAuCisKKy0gR2VuZXJhbDoKKworICAgICAgICAgICAgICAgIEluIHRoZSB0YXJnZXQgc3lzdGVtIG1vZGVtIHN1cHBvcnQgaXMgZW5hYmxlZCB3aGVuIGEKKyAgICAgICAgICAgICAgICBzcGVjaWZpYyBrZXkgKGtleSBjb21iaW5hdGlvbikgaXMgcHJlc3NlZCBkdXJpbmcKKyAgICAgICAgICAgICAgICBwb3dlci1vbi4gT3RoZXJ3aXNlIFUtQm9vdCB3aWxsIGJvb3Qgbm9ybWFsbHkKKyAgICAgICAgICAgICAgICAoYXV0b2Jvb3QpLiBUaGUga2V5X3ByZXNzZWQoKSBmdWN0aW9uIGlzIGNhbGxlZCBmcm9tCisgICAgICAgICAgICAgICAgYm9hcmRfaW5pdCgpLiBDdXJyZW50bHkga2V5X3ByZXNzZWQoKSBpcyBhIGR1bW15CisgICAgICAgICAgICAgICAgZnVuY3Rpb24sIHJldHVybmluZyAxIGFuZCB0aHVzIGVuYWJsaW5nIG1vZGVtCisgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24uCisKKyAgICAgICAgICAgICAgICBJZiB0aGVyZSBhcmUgbm8gbW9kZW0gaW5pdCBzdHJpbmdzIGluIHRoZQorICAgICAgICAgICAgICAgIGVudmlyb25tZW50LCBVLUJvb3QgcHJvY2VlZCB0byBhdXRvYm9vdDsgdGhlCisgICAgICAgICAgICAgICAgcHJldmlvdXMgb3V0cHV0IChiYW5uZXIsIGluZm8gcHJpbnRmcykgd2lsbCBiZQorICAgICAgICAgICAgICAgIHN1cHJlc3NlZCwgdGhvdWdoLgorCisJCVNlZSBhbHNvOiBkb2MvUkVBRE1FLk1vZGVtCisKKworCisKK0NvbmZpZ3VyYXRpb24gU2V0dGluZ3M6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIENGR19MT05HSEVMUDogRGVmaW5lZCB3aGVuIHlvdSB3YW50IGxvbmcgaGVscCBtZXNzYWdlcyBpbmNsdWRlZDsKKwkJdW5kZWZpbmUgdGhpcyB3aGVuIHlvdSdyZSBzaG9ydCBvZiBtZW1vcnkuCisKKy0gQ0ZHX1BST01QVDoJVGhpcyBpcyB3aGF0IFUtQm9vdCBwcmludHMgb24gdGhlIGNvbnNvbGUgdG8KKwkJcHJvbXB0IGZvciB1c2VyIGlucHV0LgorCistIENGR19DQlNJWkU6CUJ1ZmZlciBzaXplIGZvciBpbnB1dCBmcm9tIHRoZSBDb25zb2xlCisKKy0gQ0ZHX1BCU0laRToJQnVmZmVyIHNpemUgZm9yIENvbnNvbGUgb3V0cHV0CisKKy0gQ0ZHX01BWEFSR1M6CW1heC4gTnVtYmVyIG9mIGFyZ3VtZW50cyBhY2NlcHRlZCBmb3IgbW9uaXRvciBjb21tYW5kcworCistIENGR19CQVJHU0laRTogQnVmZmVyIHNpemUgZm9yIEJvb3QgQXJndW1lbnRzIHdoaWNoIGFyZSBwYXNzZWQgdG8KKwkJdGhlIGFwcGxpY2F0aW9uICh1c3VhbGx5IGEgTGludXgga2VybmVsKSB3aGVuIGl0IGlzCisJCWJvb3RlZAorCistIENGR19CQVVEUkFURV9UQUJMRToKKwkJTGlzdCBvZiBsZWdhbCBiYXVkcmF0ZSBzZXR0aW5ncyBmb3IgdGhpcyBib2FyZC4KKworLSBDRkdfQ09OU09MRV9JTkZPX1FVSUVUCisgCQlTdXBwcmVzcyBkaXNwbGF5IG9mIGNvbnNvbGUgaW5mb3JtYXRpb24gYXQgYm9vdC4KKworLSBDRkdfQ09OU09MRV9JU19JTl9FTlYKKyAJCUlmIHRoZSBib2FyZCBzcGVjaWZpYyBmdW5jdGlvbgorIAkJCWV4dGVybiBpbnQgb3ZlcndyaXRlX2NvbnNvbGUgKHZvaWQpOworIAkJcmV0dXJucyAxLCB0aGUgc3RkaW4sIHN0ZGVyciBhbmQgc3Rkb3V0IGFyZSBzd2l0Y2hlZCB0byB0aGUKKwkJc2VyaWFsIHBvcnQsIGVsc2UgdGhlIHNldHRpbmdzIGluIHRoZSBlbnZpcm9ubWVudCBhcmUgdXNlZC4KKworLSBDRkdfQ09OU09MRV9PVkVSV1JJVEVfUk9VVElORQorIAkJRW5hYmxlIHRoZSBjYWxsIHRvIG92ZXJ3cml0ZV9jb25zb2xlKCkuCisKKy0gQ0ZHX0NPTlNPTEVfRU5WX09WRVJXUklURQorCQlFbmFibGUgb3ZlcndyaXRlIG9mIHByZXZpb3VzIGNvbnNvbGUgZW52aXJvbm1lbnQgc2V0dGluZ3MuCisKKy0gQ0ZHX01FTVRFU1RfU1RBUlQsIENGR19NRU1URVNUX0VORDoKKwkJQmVnaW4gYW5kIEVuZCBhZGRyZXNzZXMgb2YgdGhlIGFyZWEgdXNlZCBieSB0aGUKKwkJc2ltcGxlIG1lbW9yeSB0ZXN0LgorCistIENGR19BTFRfTUVNVEVTVDoKKyAJCUVuYWJsZSBhbiBhbHRlcm5hdGUsIG1vcmUgZXh0ZW5zaXZlIG1lbW9yeSB0ZXN0LgorCistIENGR19URlRQX0xPQURBRERSOgorCQlEZWZhdWx0IGxvYWQgYWRkcmVzcyBmb3IgbmV0d29yayBmaWxlIGRvd25sb2FkcworCistIENGR19MT0FEU19CQVVEX0NIQU5HRToKKwkJRW5hYmxlIHRlbXBvcmFyeSBiYXVkcmF0ZSBjaGFuZ2Ugd2hpbGUgc2VyaWFsIGRvd25sb2FkCisKKy0gQ0ZHX1NEUkFNX0JBU0U6CisJCVBoeXNpY2FsIHN0YXJ0IGFkZHJlc3Mgb2YgU0RSQU0uIF9NdXN0XyBiZSAwIGhlcmUuCisKKy0gQ0ZHX01CSU9fQkFTRToKKwkJUGh5c2ljYWwgc3RhcnQgYWRkcmVzcyBvZiBNb3RoZXJib2FyZCBJL08gKGlmIHVzaW5nIGEKKwkJQ29nZW50IG1vdGhlcmJvYXJkKQorCistIENGR19GTEFTSF9CQVNFOgorCQlQaHlzaWNhbCBzdGFydCBhZGRyZXNzIG9mIEZsYXNoIG1lbW9yeS4KKworLSBDRkdfTU9OSVRPUl9CQVNFOgorCQlQaHlzaWNhbCBzdGFydCBhZGRyZXNzIG9mIGJvb3QgbW9uaXRvciBjb2RlIChzZXQgYnkKKwkJbWFrZSBjb25maWcgZmlsZXMgdG8gYmUgc2FtZSBhcyB0aGUgdGV4dCBiYXNlIGFkZHJlc3MKKwkJKFRFWFRfQkFTRSkgdXNlZCB3aGVuIGxpbmtpbmcpIC0gc2FtZSBhcworCQlDRkdfRkxBU0hfQkFTRSB3aGVuIGJvb3RpbmcgZnJvbSBmbGFzaC4KKworLSBDRkdfTU9OSVRPUl9MRU46CisJCVNpemUgb2YgbWVtb3J5IHJlc2VydmVkIGZvciBtb25pdG9yIGNvZGUKKworLSBDRkdfTUFMTE9DX0xFTjoKKwkJU2l6ZSBvZiBEUkFNIHJlc2VydmVkIGZvciBtYWxsb2MoKSB1c2UuCisKKy0gQ0ZHX0JPT1RNQVBTWjoKKwkJTWF4aW11bSBzaXplIG9mIG1lbW9yeSBtYXBwZWQgYnkgdGhlIHN0YXJ0dXAgY29kZSBvZgorCQl0aGUgTGludXgga2VybmVsOyBhbGwgZGF0YSB0aGF0IG11c3QgYmUgcHJvY2Vzc2VkIGJ5CisJCXRoZSBMaW51eCBrZXJuZWwgKGJkX2luZm8sIGJvb3QgYXJndW1lbnRzLCBldmVudHVhbGx5CisJCWluaXRyZCBpbWFnZSkgbXVzdCBiZSBwdXQgYmVsb3cgdGhpcyBsaW1pdC4KKworLSBDRkdfTUFYX0ZMQVNIX0JBTktTOgorCQlNYXggbnVtYmVyIG9mIEZsYXNoIG1lbW9yeSBiYW5rcworCistIENGR19NQVhfRkxBU0hfU0VDVDoKKwkJTWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIGEgRmxhc2ggY2hpcAorCistIENGR19GTEFTSF9FUkFTRV9UT1VUOgorCQlUaW1lb3V0IGZvciBGbGFzaCBlcmFzZSBvcGVyYXRpb25zIChpbiBtcykKKworLSBDRkdfRkxBU0hfV1JJVEVfVE9VVDoKKwkJVGltZW91dCBmb3IgRmxhc2ggd3JpdGUgb3BlcmF0aW9ucyAoaW4gbXMpCisKKy0gQ0ZHX0RJUkVDVF9GTEFTSF9URlRQOgorCisJCUVuYWJsZSBURlRQIHRyYW5zZmVycyBkaXJlY3RseSB0byBmbGFzaCBtZW1vcnk7CisJCXdpdGhvdXQgdGhpcyBvcHRpb24gc3VjaCBhIGRvd25sb2FkIGhhcyB0byBiZQorCQlwZXJmb3JtZWQgaW4gdHdvIHN0ZXBzOiAoMSkgZG93bmxvYWQgdG8gUkFNLCBhbmQgKDIpCisJCWNvcHkgZnJvbSBSQU0gdG8gZmxhc2guCisKKwkJVGhlIHR3by1zdGVwIGFwcHJvYWNoIGlzIHVzdWFsbHkgbW9yZSByZWxpYWJsZSwgc2luY2UKKwkJeW91IGNhbiBjaGVjayBpZiB0aGUgZG93bmxvYWQgd29ya2VkIGJlZm9yZSB5b3UgZXJhc2UKKwkJdGhlIGZsYXNoLCBidXQgaW4gc29tZSBzaXR1YXRpb25zICh3aGVuIHN5dGVtIFJBTSBpcworCQl0b28gbGltaXRlZCB0byBhbGxvdyBmb3IgYSB0ZW1wb3J5IGNvcHkgb2YgdGhlCisJCWRvd25sb2FkZWQgaW1hZ2UpIHRoaXMgb3B0aW9uIG1heSBiZSB2ZXJ5IHVzZWZ1bC4KKworLSBDRkdfRkxBU0hfQ0ZJOgorICAgICAgICAgICAgICAgIERlZmluZSBpZiB0aGUgZmxhc2ggZHJpdmVyIHVzZXMgZXh0cmEgZWxlbWVudHMgaW4gdGhlCisgICAgICAgICAgICAgICAgY29tbW9uIGZsYXNoIHN0cnVjdHVyZSBmb3Igc3RvcmluZyBmbGFzaCBnZW9tZXRyeQorCitUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgZGVhbCB3aXRoIHRoZSBwbGFjZW1lbnQgYW5kIG1hbmFnZW1lbnQKK29mIGVudmlyb25tZW50IGRhdGEgKHZhcmlhYmxlIGFyZWEpOyBpbiBnZW5lcmFsLCB3ZSBzdXBwb3J0IHRoZQorZm9sbG93aW5nIGNvbmZpZ3VyYXRpb25zOgorCistIENGR19FTlZfSVNfSU5fRkxBU0g6CisKKwlEZWZpbmUgdGhpcyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgaW4gZmxhc2ggbWVtb3J5LgorCisJYSkgVGhlIGVudmlyb25tZW50IG9jY3VwaWVzIG9uZSB3aG9sZSBmbGFzaCBzZWN0b3IsIHdoaWNoIGlzCisJICAgImVtYmVkZGVkIiBpbiB0aGUgdGV4dCBzZWdtZW50IHdpdGggdGhlIFUtQm9vdCBjb2RlLiBUaGlzCisJICAgaGFwcGVucyB1c3VhbGx5IHdpdGggImJvdHRvbSBib290IHNlY3RvciIgb3IgInRvcCBib290CisJICAgc2VjdG9yIiB0eXBlIGZsYXNoIGNoaXBzLCB3aGljaCBoYXZlIHNldmVyYWwgc21hbGxlcgorCSAgIHNlY3RvcnMgYXQgdGhlIHN0YXJ0IG9yIHRoZSBlbmQuIEZvciBpbnN0YW5jZSwgc3VjaCBhCisJICAgbGF5b3V0IGNhbiBoYXZlIHNlY3RvciBzaXplcyBvZiA4LCAyeDQsIDE2LCBOeDMyIGtCLiBJbgorCSAgIHN1Y2ggYSBjYXNlIHlvdSB3b3VsZCBwbGFjZSB0aGUgZW52aXJvbm1lbnQgaW4gb25lIG9mIHRoZQorCSAgIDQga0Igc2VjdG9ycyAtIHdpdGggVS1Cb290IGNvZGUgYmVmb3JlIGFuZCBhZnRlciBpdC4gV2l0aAorCSAgICJ0b3AgYm9vdCBzZWN0b3IiIHR5cGUgZmxhc2ggY2hpcHMsIHlvdSB3b3VsZCBwdXQgdGhlCisJICAgZW52aXJvbm1lbnQgaW4gb25lIG9mIHRoZSBsYXN0IHNlY3RvcnMsIGxlYXZpbmcgYSBnYXAKKwkgICBiZXR3ZWVuIFUtQm9vdCBhbmQgdGhlIGVudmlyb25tZW50LgorCisJLSBDRkdfRU5WX09GRlNFVDoKKworCSAgIE9mZnNldCBvZiBlbnZpcm9ubWVudCBkYXRhICh2YXJpYWJsZSBhcmVhKSB0byB0aGUKKwkgICBiZWdpbm5pbmcgb2YgZmxhc2ggbWVtb3J5OyBmb3IgaW5zdGFuY2UsIHdpdGggYm90dG9tIGJvb3QKKwkgICB0eXBlIGZsYXNoIGNoaXBzIHRoZSBzZWNvbmQgc2VjdG9yIGNhbiBiZSB1c2VkOiB0aGUgb2Zmc2V0CisJICAgZm9yIHRoaXMgc2VjdG9yIGlzIGdpdmVuIGhlcmUuCisKKwkgICBDRkdfRU5WX09GRlNFVCBpcyB1c2VkIHJlbGF0aXZlIHRvIENGR19GTEFTSF9CQVNFLgorCisJLSBDRkdfRU5WX0FERFI6CisKKwkgICBUaGlzIGlzIGp1c3QgYW5vdGhlciB3YXkgdG8gc3BlY2lmeSB0aGUgc3RhcnQgYWRkcmVzcyBvZgorCSAgIHRoZSBmbGFzaCBzZWN0b3IgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgKGluc3RlYWQgb2YKKwkgICBDRkdfRU5WX09GRlNFVCkuCisKKwktIENGR19FTlZfU0VDVF9TSVpFOgorCisJICAgU2l6ZSBvZiB0aGUgc2VjdG9yIGNvbnRhaW5pbmcgdGhlIGVudmlyb25tZW50LgorCisKKwliKSBTb21ldGltZXMgZmxhc2ggY2hpcHMgaGF2ZSBmZXcsIGVxdWFsIHNpemVkLCBCSUcgc2VjdG9ycy4KKwkgICBJbiBzdWNoIGEgY2FzZSB5b3UgZG9uJ3Qgd2FudCB0byBzcGVuZCBhIHdob2xlIHNlY3RvciBmb3IKKwkgICB0aGUgZW52aXJvbm1lbnQuCisKKwktIENGR19FTlZfU0laRToKKworCSAgIElmIHlvdSB1c2UgdGhpcyBpbiBjb21iaW5hdGlvbiB3aXRoIENGR19FTlZfSVNfSU5fRkxBU0gKKwkgICBhbmQgQ0ZHX0VOVl9TRUNUX1NJWkUsIHlvdSBjYW4gc3BlY2lmeSB0byB1c2Ugb25seSBhIHBhcnQKKwkgICBvZiB0aGlzIGZsYXNoIHNlY3RvciBmb3IgdGhlIGVudmlyb25tZW50LiBUaGlzIHNhdmVzCisJICAgbWVtb3J5IGZvciB0aGUgUkFNIGNvcHkgb2YgdGhlIGVudmlyb25tZW50LgorCisJICAgSXQgbWF5IGFsc28gc2F2ZSBmbGFzaCBtZW1vcnkgaWYgeW91IGRlY2lkZSB0byB1c2UgdGhpcworCSAgIHdoZW4geW91ciBlbnZpcm9ubWVudCBpcyAiZW1iZWRkZWQiIHdpdGhpbiBVLUJvb3QgY29kZSwKKwkgICBzaW5jZSB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGZsYXNoIHNlY3RvciBjb3VsZCBiZSB1c2VkCisJICAgZm9yIFUtQm9vdCBjb2RlLiBJdCBzaG91bGQgYmUgcG9pbnRlZCBvdXQgdGhhdCB0aGlzIGlzCisJICAgU1RST05HTFkgRElTQ09VUkFHRUQgZnJvbSBhIHJvYnVzdG5lc3MgcG9pbnQgb2YgdmlldzoKKwkgICB1cGRhdGluZyB0aGUgZW52aXJvbm1lbnQgaW4gZmxhc2ggbWFrZXMgaXQgYWx3YXlzCisJICAgbmVjZXNzYXJ5IHRvIGVyYXNlIHRoZSBXSE9MRSBzZWN0b3IuIElmIHNvbWV0aGluZyBnb2VzCisJICAgd3JvbmcgYmVmb3JlIHRoZSBjb250ZW50cyBoYXMgYmVlbiByZXN0b3JlZCBmcm9tIGEgY29weSBpbgorCSAgIFJBTSwgeW91ciB0YXJnZXQgc3lzdGVtIHdpbGwgYmUgZGVhZC4KKworCS0gQ0ZHX0VOVl9BRERSX1JFRFVORAorCSAgQ0ZHX0VOVl9TSVpFX1JFRFVORAorCisgICAgICAgICAgIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlIGEgc2Vjb25kIHN0b3JhZ2UgYXJlYSB1c2VkIHRvIGhvbGQKKyAgICAgICAgICAgYSByZWR1bmRhbmQgY29weSBvZiB0aGUgZW52aXJvbm1lbnQgZGF0YSwgc28gdGhhdCB0aGVyZSBpcworICAgICAgICAgICBhIHZhbGlkIGJhY2t1cCBjb3B5IGluIGNhc2UgdGhlcmUgaXMgYSBwb3dlciBmYWlsdXIgZHVyaW5nCisgICAgICAgICAgIGEgInNhdmVlbnYiIG9wZXJhdGlvbi4KKworQkUgQ0FSRUZVTCEgQW55IGNoYW5nZXMgdG8gdGhlIGZsYXNoIGxheW91dCwgYW5kIHNvbWUgY2hhbmdlcyB0byB0aGUKK3NvdXJjZSBjb2RlIHdpbGwgbWFrZSBpdCBuZWNlc3NhcnkgdG8gYWRhcHQgPGJvYXJkPi91LWJvb3QubGRzKgorYWNjb3JkaW5nbHkhCisKKworLSBDRkdfRU5WX0lTX0lOX05WUkFNOgorCisJRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgc29tZSBub24tdm9sYXRpbGUgbWVtb3J5IGRldmljZQorCShOVlJBTSwgYmF0dGVyeSBidWZmZXJlZCBTUkFNKSB3aGljaCB5b3Ugd2FudCB0byB1c2UgZm9yIHRoZQorCWVudmlyb25tZW50LgorCisJLSBDRkdfRU5WX0FERFI6CisJLSBDRkdfRU5WX1NJWkU6CisKKwkgIFRoZXNlIHR3byAjZGVmaW5lcyBhcmUgdXNlZCB0byBkZXRlcm1pbiB0aGUgbWVtb3J5IGFyZWEgeW91CisJICB3YW50IHRvIHVzZSBmb3IgZW52aXJvbm1lbnQuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIG1lbW9yeQorCSAgY2FuIGp1c3QgYmUgcmVhZCBhbmQgd3JpdHRlbiB0bywgd2l0aG91dCBhbnkgc3BlY2lhbAorCSAgcHJvdmlzaW9uLgorCitCRSBDQVJFRlVMISBUaGUgZmlyc3QgYWNjZXNzIHRvIHRoZSBlbnZpcm9ubWVudCBoYXBwZW5zIHF1aXRlIGVhcmx5CitpbiBVLUJvb3QgaW5pdGFsaXphdGlvbiAod2hlbiB3ZSB0cnkgdG8gZ2V0IHRoZSBzZXR0aW5nIG9mIGZvciB0aGUKK2NvbnNvbGUgYmF1ZHJhdGUpLiBZb3UgKk1VU1QqIGhhdmUgbWFwcGVuZCB5b3VyIE5WUkFNIGFyZWEgdGhlbiwgb3IKK1UtQm9vdCB3aWxsIGhhbmcuCisKK1BsZWFzZSBub3RlIHRoYXQgZXZlbiB3aXRoIE5WUkFNIHdlIHN0aWxsIHVzZSBhIGNvcHkgb2YgdGhlCitlbnZpcm9ubWVudCBpbiBSQU06IHdlIGNvdWxkIHdvcmsgb24gTlZSQU0gZGlyZWN0bHksIGJ1dCB3ZSB3YW50IHRvCitrZWVwIHNldHRpbmdzIHRoZXJlIGFsd2F5cyB1bm1vZGlmaWVkIGV4Y2VwdCBzb21lYm9keSB1c2VzICJzYXZlZW52IgordG8gc2F2ZSB0aGUgY3VycmVudCBzZXR0aW5ncy4KKworCistIENGR19FTlZfSVNfSU5fRUVQUk9NOgorCisJVXNlIHRoaXMgaWYgeW91IGhhdmUgYW4gRUVQUk9NIG9yIHNpbWlsYXIgc2VyaWFsIGFjY2VzcworCWRldmljZSBhbmQgYSBkcml2ZXIgZm9yIGl0LgorCisJLSBDRkdfRU5WX09GRlNFVDoKKwktIENGR19FTlZfU0laRToKKworCSAgVGhlc2UgdHdvICNkZWZpbmVzIHNwZWNpZnkgdGhlIG9mZnNldCBhbmQgc2l6ZSBvZiB0aGUKKwkgIGVudmlyb25tZW50IGFyZWEgd2l0aGluIHRoZSB0b3RhbCBtZW1vcnkgb2YgeW91ciBFRVBST00uCisKKwktIENGR19JMkNfRUVQUk9NX0FERFI6CisJICBJZiBkZWZpbmVkLCBzcGVjaWZpZWQgdGhlIGNoaXAgYWRkcmVzcyBvZiB0aGUgRUVQUk9NIGRldmljZS4KKwkgIFRoZSBkZWZhdWx0IGFkZHJlc3MgaXMgemVyby4KKworCS0gQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0JJVFM6CisJICBJZiBkZWZpbmVkLCB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBhZGRyZXNzIGJ5dGVzIGluIGEKKwkgIHNpbmdsZSBwYWdlIGluIHRoZSBFRVBST00gZGV2aWNlLiAgQSA2NCBieXRlIHBhZ2UsIGZvciBleGFtcGxlCisJICB3b3VsZCByZXF1aXJlIHNpeCBiaXRzLgorCisJLSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfREVMQVlfTVM6CisJICBJZiBkZWZpbmVkLCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBiZXR3ZWVuCisJICBwYWdlIHdyaXRlcy4gIFRoZSBkZWZhdWx0IGlzIHplcm8gbWlsbGlzZWNvbmRzLgorCisJLSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTjoKKwkgIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIEVFUFJPTSBtZW1vcnkgYXJyYXkgYWRkcmVzcy4gIE5vdGUKKwkgIHRoYXQgdGhpcyBpcyBOT1QgdGhlIGNoaXAgYWRkcmVzcyBsZW5ndGghCisKKwktIENGR19FRVBST01fU0laRToKKwkgIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBFRVBST00gZGV2aWNlLgorCisJLSBDRkdfSTJDX0VFUFJPTV9BRERSOgorCSAgSWYgZGVmaW5lZCwgc3BlY2lmaWVkIHRoZSBjaGlwIGFkZHJlc3Mgb2YgdGhlIEVFUFJPTSBkZXZpY2UuCisJICBUaGUgZGVmYXVsdCBhZGRyZXNzIGlzIHplcm8uCisKKwktIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTOgorCSAgSWYgZGVmaW5lZCwgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gYWRkcmVzcyBieXRlcyBpbiBhCisJICBzaW5nbGUgcGFnZSBpbiB0aGUgRUVQUk9NIGRldmljZS4gIEEgNjQgYnl0ZSBwYWdlLCBmb3IgZXhhbXBsZQorCSAgd291bGQgcmVxdWlyZSBzaXggYml0cy4KKworCS0gQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TOgorCSAgSWYgZGVmaW5lZCwgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgYmV0d2VlbgorCSAgcGFnZSB3cml0ZXMuICBUaGUgZGVmYXVsdCBpcyB6ZXJvIG1pbGxpc2Vjb25kcy4KKworCS0gQ0ZHX0kyQ19FRVBST01fQUREUl9MRU46CisJICBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBFRVBST00gbWVtb3J5IGFycmF5IGFkZHJlc3MuICBOb3RlCisJICB0aGF0IHRoaXMgaXMgTk9UIHRoZSBjaGlwIGFkZHJlc3MgbGVuZ3RoIQorCisJLSBDRkdfRUVQUk9NX1NJWkU6CisJICBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgRUVQUk9NIGRldmljZS4KKworLSBDRkdfU1BJX0lOSVRfT0ZGU0VUCisKKwlEZWZpbmVzIG9mZnNldCB0byB0aGUgaW5pdGlhbCBTUEkgYnVmZmVyIGFyZWEgaW4gRFBSQU0uIFRoZQorCWFyZWEgaXMgdXNlZCBhdCBhbiBlYXJseSBzdGFnZSAoUk9NIHBhcnQpIGlmIHRoZSBlbnZpcm9ubWVudAorCWlzIGNvbmZpZ3VyZWQgdG8gcmVzaWRlIGluIHRoZSBTUEkgRUVQUk9NOiBXZSBuZWVkIGEgNTIwIGJ5dGUKKwlzY3JhdGNoIERQUkFNIGFyZWEuIEl0IGlzIHVzZWQgYmV0d2VlbiB0aGUgdHdvIGluaXRpYWxpemF0aW9uCisJY2FsbHMgKHNwaV9pbml0X2YoKSBhbmQgc3BpX2luaXRfcigpKS4gQSB2YWx1ZSBvZiAweEIwMCBzZWVtcworCXRvIGJlIGEgZ29vZCBjaG9pY2Ugc2luY2UgaXQgbWFrZXMgaXQgZmFyIGVub3VnaCBmcm9tIHRoZQorCXN0YXJ0IG9mIHRoZSBkYXRhIGFyZWEgYXMgd2VsbCBhcyBmcm9tIHRoZSBzdGFjayBwb2ludGVyLgorCitQbGVhc2Ugbm90ZSB0aGF0IHRoZSBlbnZpcm9ubWVudCBpcyByZWFkLW9ubHkgYXMgbG9uZyBhcyB0aGUgbW9uaXRvcgoraGFzIGJlZW4gcmVsb2NhdGVkIHRvIFJBTSBhbmQgYSBSQU0gY29weSBvZiB0aGUgZW52aXJvbm1lbnQgaGFzIGJlZW4KK2NyZWF0ZWQ7IGFsc28sIHdoZW4gdXNpbmcgRUVQUk9NIHlvdSB3aWxsIGhhdmUgdG8gdXNlIGdldGVudl9yKCkKK3VudGlsIHRoZW4gdG8gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKK1RoZSBlbnZpcm9ubWVudCBpcyBub3cgcHJvdGVjdGVkIGJ5IGEgQ1JDMzIgY2hlY2tzdW0uIEJlZm9yZSB0aGUKK21vbml0b3IgaXMgcmVsb2NhdGVkIGludG8gUkFNLCBhcyBhIHJlc3VsdCBvZiBhIGJhZCBDUkMgeW91IHdpbGwgYmUKK3dvcmtpbmcgd2l0aCB0aGUgY29tcGlsZWQtaW4gZGVmYXVsdCBlbnZpcm9ubWVudCAtICpzaWxlbnRseSohISEKK1tUaGlzIGlzIG5lY2Vzc2FyeSwgYmVjYXVzZSB0aGUgZmlyc3QgZW52aXJvbm1lbnQgdmFyaWFibGUgd2UgbmVlZCBpcwordGhlICJiYXVkcmF0ZSIgc2V0dGluZyBmb3IgdGhlIGNvbnNvbGUgLSBpZiB3ZSBoYXZlIGEgYmFkIENSQywgd2UKK2Rvbid0IGhhdmUgYW55IGRldmljZSB5ZXQgd2hlcmUgd2UgY291bGQgY29tcGxhaW4uXQorCitOb3RlOiBvbmNlIHRoZSBtb25pdG9yIGhhcyBiZWVuIHJlbG9jYXRlZCwgdGhlbiBpdCB3aWxsIGNvbXBsYWluIGlmCit0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBpcyB1c2VkOyBhIG5ldyBDUkMgaXMgY29tcHV0ZWQgYXMgc29vbiBhcyB5b3UKK3VzZSB0aGUgInNldGVudiIgY29tbWFuZCB0byBtb2RpZnkgLyBkZWxldGUgLyBhZGQgYW55IGVudmlyb25tZW50Cit2YXJpYWJsZSBbZXZlbiB3aGVuIHlvdSB0cnkgdG8gZGVsZXRlIGEgbm9uLWV4aXN0aW5nIHZhcmlhYmxlIV0uCisKK05vdGUyOiB5b3UgbXVzdCBlZGl0IHlvdXIgdS1ib290LmxkcyBmaWxlIHRvIHJlZmxlY3QgdGhpcworY29uZmlndXJhdGlvbi4KKworCitNYW55IG9mIHRoZSBvcHRpb25zIGFyZSBuYW1lZCBleGFjdGx5IGFzIHRoZSBjb3JyZXNwb25kaW5nIExpbnV4CitrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb25zLiBUaGUgaW50ZW50aW9uIGlzIHRvIG1ha2UgaXQgZWFzaWVyIHRvCitidWlsZCBhIGNvbmZpZyB0b29sIC0gbGF0ZXIuCisKK0xvdyBMZXZlbCAoaGFyZHdhcmUgcmVsYXRlZCkgY29uZmlndXJhdGlvbiBvcHRpb25zOgorCistIENGR19DQUNIRUxJTkVfU0laRToKKwkJQ2FjaGUgTGluZSBTaXplIG9mIHRoZSBDUFUuCisKKy0gQ0ZHX0RFRkFVTFRfSU1NUjoKKwkJRGVmYXVsdCBhZGRyZXNzIG9mIHRoZSBJTU1SIGFmdGVyIHN5c3RlbSByZXNldC4KKwkJTmVlZGVkIG9uIHNvbWUgODI2MCBzeXN0ZW1zIChNUEM4MjYwQURTIGFuZCBSUFhzdXBlcikKKwkJdG8gYmUgYWJsZSB0byBhZGp1c3QgdGhlIHBvc2l0aW9uIG9mIHRoZSBJTU1SCisJCXJlZ2lzdGVyIGFmdGVyIGEgcmVzZXQuCisKKy0gQ0ZHX0lNTVI6CVBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIEludGVybmFsIE1lbW9yeSBNYXBwZWQKKwkJUmVnaXN0ZXI7IERPIE5PVCBDSEFOR0UhICgxMS00KQorCQlbTVBDOHh4IHN5c3RlbXMgb25seV0KKworLSBDRkdfSU5JVF9SQU1fQUREUjoKKworCQlTdGFydCBhZGRyZXNzIG9mIG1lbW9yeSBhcmVhIHRoYSBjYW4gYmUgdXNlZCBmb3IKKwkJaW5pdGlhbCBkYXRhIGFuZCBzdGFjazsgcGxlYXNlIG5vdGUgdGhhdCB0aGlzIG11c3QgYmUKKwkJd3JpdGFibGUgbWVtb3J5IHRoYXQgaXMgd29ya2luZyBXSVRIT1VUIHNwZWNpYWwKKwkJaW5pdGlhbGl6YXRpb24sIGkuIGUuIHlvdSBDQU5OT1QgdXNlIG5vcm1hbCBSQU0gd2hpY2gKKwkJd2lsbCBiZWNvbWUgYXZhaWxhYmxlIG9ubHkgYWZ0ZXIgcHJvZ3JhbW1pbmcgdGhlCisJCW1lbW9yeSBjb250cm9sbGVyIGFuZCBydW5uaW5nIGNlcnRhaW4gaW5pdGlhbGl6YXRpb24KKwkJc2VxdWVuY2VzLgorCisJCVUtQm9vdCB1c2VzIHRoZSBmb2xsb3dpbmcgbWVtb3J5IHR5cGVzOgorCQktIE1QQzh4eCBhbmQgTVBDODI2MDogSU1NUiAoaW50ZXJuYWwgbWVtb3J5IG9mIHRoZSBDUFUpCisJCS0gTVBDODI0WDogZGF0YSBjYWNoZQorCQktIFBQQzR4eDogIGRhdGEgY2FjaGUKKworLSBDRkdfSU5JVF9EQVRBX09GRlNFVDoKKworCQlPZmZzZXQgb2YgdGhlIGluaXRpYWwgZGF0YSBzdHJ1Y3R1cmUgaW4gdGhlIG1lbW9yeQorCQlhcmVhIGRlZmluZWQgYnkgQ0ZHX0lOSVRfUkFNX0FERFIuIFVzdWFsbHkKKwkJQ0ZHX0lOSVRfREFUQV9PRkZTRVQgaXMgY2hvc2VuIHN1Y2ggdGhhdCB0aGUgaW5pdGlhbAorCQlkYXRhIGlzIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXZhaWxhYmxlIHNwYWNlCisJCShzb21ldGltZXMgd3JpdHRlbiBhcyAoQ0ZHX0lOSVRfUkFNX0VORCAtCisJCUNGR19JTklUX0RBVEFfU0laRSksIGFuZCB0aGUgaW5pdGlhbCBzdGFjayBpcyBqdXN0CisJCWJlbG93IHRoYXQgYXJlYSAoZ3Jvd2luZyBmcm9tIChDRkdfSU5JVF9SQU1fQUREUiArCisJCUNGR19JTklUX0RBVEFfT0ZGU0VUKSBkb3dud2FyZC4KKworCU5vdGU6CisJCU9uIHRoZSBNUEM4MjRYIChvciBvdGhlciBzeXN0ZW1zIHRoYXQgdXNlIHRoZSBkYXRhCisJCWNhY2hlIGZvciBpbml0aWFsIG1lbW9yeSkgdGhlIGFkZHJlc3MgY2hvc2VuIGZvcgorCQlDRkdfSU5JVF9SQU1fQUREUiBpcyBiYXNpY2FsbHkgYXJiaXRyYXJ5IC0gaXQgbXVzdAorCQlwb2ludCB0byBhbiBvdGhlcndpc2UgVU5VU0VEIGFkZHJlc3Mgc3BhY2UgYmV0d2VlbgorCQl0aGUgdG9wIG9mIFJBTSBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBQQ0kgc3BhY2UuCisKKy0gQ0ZHX1NJVU1DUjoJU0lVIE1vZHVsZSBDb25maWd1cmF0aW9uICgxMS02KQorCistIENGR19TWVBDUjoJU3lzdGVtIFByb3RlY3Rpb24gQ29udHJvbCAoMTEtOSkKKworLSBDRkdfVEJTQ1I6CVRpbWUgQmFzZSBTdGF0dXMgYW5kIENvbnRyb2wgKDExLTI2KQorCistIENGR19QSVNDUjoJUGVyaW9kaWMgSW50ZXJydXB0IFN0YXR1cyBhbmQgQ29udHJvbCAoMTEtMzEpCisKKy0gQ0ZHX1BMUFJDUjoJUExMLCBMb3ctUG93ZXIsIGFuZCBSZXNldCBDb250cm9sIFJlZ2lzdGVyICgxNS0zMCkKKworLSBDRkdfU0NDUjoJU3lzdGVtIENsb2NrIGFuZCByZXNldCBDb250cm9sIFJlZ2lzdGVyICgxNS0yNykKKworLSBDRkdfT1JfVElNSU5HX1NEUkFNOgorCQlTRFJBTSB0aW1pbmcKKworLSBDRkdfTUFNUl9QVEE6CisJCXBlcmlvZGljIHRpbWVyIGZvciByZWZyZXNoCisKKy0gQ0ZHX0RFUjoJRGVidWcgRXZlbnQgUmVnaXN0ZXIgKDM3LTQ3KQorCistIEZMQVNIX0JBU0UwX1BSRUxJTSwgRkxBU0hfQkFTRTFfUFJFTElNLCBDRkdfUkVNQVBfT1JfQU0sCisgIENGR19QUkVMSU1fT1JfQU0sIENGR19PUl9USU1JTkdfRkxBU0gsIENGR19PUjBfUkVNQVAsCisgIENGR19PUjBfUFJFTElNLCBDRkdfQlIwX1BSRUxJTSwgQ0ZHX09SMV9SRU1BUCwgQ0ZHX09SMV9QUkVMSU0sCisgIENGR19CUjFfUFJFTElNOgorCQlNZW1vcnkgQ29udHJvbGxlciBEZWZpbml0aW9uczogQlIwLzEgYW5kIE9SMC8xIChGTEFTSCkKKworLSBTRFJBTV9CQVNFMl9QUkVMSU0sIFNEUkFNX0JBU0UzX1BSRUxJTSwgU0RSQU1fTUFYX1NJWkUsCisgIENGR19PUl9USU1JTkdfU0RSQU0sIENGR19PUjJfUFJFTElNLCBDRkdfQlIyX1BSRUxJTSwKKyAgQ0ZHX09SM19QUkVMSU0sIENGR19CUjNfUFJFTElNOgorCQlNZW1vcnkgQ29udHJvbGxlciBEZWZpbml0aW9uczogQlIyLzMgYW5kIE9SMi8zIChTRFJBTSkKKworLSBDRkdfTUFNUl9QVEEsIENGR19NUFRQUl8yQktfNEssIENGR19NUFRQUl8xQktfNEssIENGR19NUFRQUl8yQktfOEssCisgIENGR19NUFRQUl8xQktfOEssIENGR19NQU1SXzhDT0wsIENGR19NQU1SXzlDT0w6CisJCU1hY2hpbmUgTW9kZSBSZWdpc3RlciBhbmQgTWVtb3J5IFBlcmlvZGljIFRpbWVyCisJCVByZXNjYWxlciBkZWZpbml0aW9ucyAoU0RSQU0gdGltaW5nKQorCistIENGR19JMkNfVUNPREVfUEFUQ0gsIENGR19JMkNfRFBNRU1fT0ZGU0VUIFsweDFGQzBdOgorCQllbmFibGUgSTJDIG1pY3JvY29kZSByZWxvY2F0aW9uIHBhdGNoIChNUEM4eHgpOworCQlkZWZpbmUgcmVsb2NhdGlvbiBvZmZzZXQgaW4gRFBSQU0gW0RTUDJdCisKKy0gQ0ZHX1NQSV9VQ09ERV9QQVRDSCwgQ0ZHX1NQSV9EUE1FTV9PRkZTRVQgWzB4MUZDMF06CisJCWVuYWJsZSBTUEkgbWljcm9jb2RlIHJlbG9jYXRpb24gcGF0Y2ggKE1QQzh4eCk7CisJCWRlZmluZSByZWxvY2F0aW9uIG9mZnNldCBpbiBEUFJBTSBbU0NDNF0KKworLSBDRkdfVVNFX09TQ0NMSzoKKwkJVXNlIE9TQ00gY2xvY2sgbW9kZSBvbiBNQlg4eHggYm9hcmQuIEJlIGNhcmVmdWwsCisJCXdyb25nIHNldHRpbmcgbWlnaHQgZGFtYWdlIHlvdXIgYm9hcmQuIFJlYWQKKwkJZG9jL1JFQURNRS5NQlggYmVmb3JlIHNldHRpbmcgdGhpcyB2YXJpYWJsZSEKKworQnVpbGRpbmcgdGhlIFNvZnR3YXJlOgorPT09PT09PT09PT09PT09PT09PT09PQorCitCdWlsZGluZyBVLUJvb3QgaGFzIGJlZW4gdGVzdGVkIGluIG5hdGl2ZSBQUEMgZW52aXJvbm1lbnRzIChvbiBhCitQb3dlckJvb2sgRzMgcnVubmluZyBMaW51eFBQQyAyMDAwKSBhbmQgaW4gY3Jvc3MgZW52aXJvbm1lbnRzCisocnVubmluZyBSZWRIYXQgNi54IGFuZCA3LnggTGludXggb24geDg2LCBTb2xhcmlzIDIuNiBvbiBhIFNQQVJDLCBhbmQKK05ldEJTRCAxLjUgb24geDg2KS4KKworSWYgeW91IGFyZSBub3QgdXNpbmcgYSBuYXRpdmUgUFBDIGVudmlyb25tZW50LCBpdCBpcyBhc3N1bWVkIHRoYXQgeW91CitoYXZlIHRoZSBHTlUgY3Jvc3MgY29tcGlsaW5nIHRvb2xzIGF2YWlsYWJsZSBpbiB5b3VyIHBhdGggYW5kIG5hbWVkCit3aXRoIGEgcHJlZml4IG9mICJwb3dlcnBjLWxpbnV4LSIuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCAoZS5nLiBpZgoreW91IGFyZSB1c2luZyBNb250YSBWaXN0YSdzIEhhcmQgSGF0IExpbnV4IENESyAxLjIpIHlvdSBtdXN0IGNoYW5nZQordGhlIGRlZmluaXRpb24gb2YgQ1JPU1NfQ09NUElMRSBpbiBNYWtlZmlsZS4gRm9yIEhITCBvbiBhIDR4eCBDUFUsCitjaGFuZ2UgaXQgdG86CisKKwlDUk9TU19DT01QSUxFID0gcHBjXzR4eC0KKworCitVLUJvb3QgaXMgaW50ZW5kZWQgdG8gYmUgIHNpbXBsZSAgdG8gIGJ1aWxkLiAgQWZ0ZXIgIGluc3RhbGxpbmcgIHRoZQorc291cmNlcwkgeW91IG11c3QgY29uZmlndXJlIFUtQm9vdCBmb3Igb25lIHNwZWNpZmljIGJvYXJkIHR5cGUuIFRoaXMKK2lzIGRvbmUgYnkgdHlwaW5nOgorCisJbWFrZSBOQU1FX2NvbmZpZworCit3aGVyZSAiTkFNRV9jb25maWciIGlzIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgZXhpc3RpbmcKK2NvbmZpZ3VyYXRpb25zOyB0aGUgZm9sbG93aW5nIG5hbWVzIGFyZSBzdXBwb3J0ZWQ6CisKKyAgICBBRENJT1BfY29uZmlnCSAgR1RIX2NvbmZpZwkJVFFNODUwTF9jb25maWcKKyAgICBBRFM4NjBfY29uZmlnCSAgSVA4NjBfY29uZmlnCQlUUU04NTVMX2NvbmZpZworICAgIEFSNDA1X2NvbmZpZwkgIElWTUwyNF9jb25maWcJCVRRTTg2MExfY29uZmlnCisgICAgQ0FOQlRfY29uZmlnCSAgSVZNUzhfY29uZmlnCQlXQUxOVVQ0MDVfY29uZmlnCisgICAgQ1BDSTQwNV9jb25maWcJICBMQU5URUNfY29uZmlnCQljb2dlbnRfY29tbW9uX2NvbmZpZworICAgIENQQ0lJU0VSNF9jb25maWcJICBNQlhfY29uZmlnCQljb2dlbnRfbXBjODI2MF9jb25maWcKKyAgICBDVTgyNF9jb25maWcJICBNQlg4NjBUX2NvbmZpZwljb2dlbnRfbXBjOHh4X2NvbmZpZworICAgIEVTVEVFTTE5MkVfY29uZmlnCSAgUlBYbGl0ZV9jb25maWcJaGVybWVzX2NvbmZpZworICAgIEVUWDA5NF9jb25maWcJICBSUFhzdXBlcl9jb25maWcJaHltb2RfY29uZmlnCisgICAgRkFEUzgyM19jb25maWcJICBTTTg1MF9jb25maWcJCWx3bW9uX2NvbmZpZworICAgIEZBRFM4NTBTQVJfY29uZmlnCSAgU1BEODIzVFNfY29uZmlnCXBjdV9lX2NvbmZpZworICAgIEZBRFM4NjBUX2NvbmZpZwkgIFNYTkk4NTVUX2NvbmZpZwlyc2Rwcm90b19jb25maWcKKyAgICBGUFM4NTBMX2NvbmZpZwkgIFNhbmRwb2ludDgyNDBfY29uZmlnCXNiYzgyNjBfY29uZmlnCisgICAgR0VOSUVUVl9jb25maWcJICBUUU04MjNMX2NvbmZpZwlQSVA0MDVfY29uZmlnCisgICAgR0VOODYwVF9jb25maWcJICBFQk9OWV9jb25maWcKKworTm90ZTogZm9yIHNvbWUgYm9hcmQgc3BlY2lhbCBjb25maWd1cmF0aW9uIG5hbWVzIG1heSBleGlzdDsgY2hlY2sgIGlmCisgICAgICBhZGRpdGlvbmFsICBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgZnJvbSB0aGUgYm9hcmQgdmVuZG9yOyBmb3IKKyAgICAgIGluc3RhbmNlLCB0aGUgVFFNOHh4TCBzeXN0ZW1zIHJ1biBub3JtYWxseSBhdCA1MCBNSHogYW5kIHVzZSAgYQorICAgICAgU0NDICBmb3IJMTBiYXNlVAkgZXRoZXJuZXQ7IHRoZXJlIGFyZSBhbHNvIHN5c3RlbXMgd2l0aCA4MCBNSHoKKyAgICAgIENQVSBjbG9jaywgYW5kIGFuIG9wdGlvbmFsIEZhc3QgRXRoZXJuZXQJbW9kdWxlCWlzICBhdmFpbGFibGUKKyAgICAgIGZvciAgQ1BVJ3MgIHdpdGggRkVDLiBZb3UgY2FuIHNlbGVjdCBzdWNoIGFkZGl0aW9uYWwgImZlYXR1cmVzIgorICAgICAgd2hlbiBjaG9zaW5nIHRoZSBjb25maWd1cmF0aW9uLCBpLiBlLgorCisgICAgICBtYWtlIFRRTTg2MExfY29uZmlnCisJLSB3aWxsIGNvbmZpZ3VyZSBmb3IgYSBwbGFpbiBUUU04NjBMLCBpLiBlLiA1ME1Ieiwgbm8gRkVDCisKKyAgICAgIG1ha2UgVFFNODYwTF9GRUNfY29uZmlnCisJLSB3aWxsIGNvbmZpZ3VyZSBmb3IgYSBUUU04NjBMIGF0IDUwTUh6IHdpdGggRkVDIGZvciBldGhlcm5ldAorCisgICAgICBtYWtlIFRRTTg2MExfODBNSHpfY29uZmlnCisJLSB3aWxsIGNvbmZpZ3VyZSBmb3IgYSBUUU04NjBMIGF0IDgwIE1Ieiwgd2l0aCBub3JtYWwgMTBiYXNlVAorCSAgaW50ZXJmYWNlCisKKyAgICAgIG1ha2UgVFFNODYwTF9GRUNfODBNSHpfY29uZmlnCisJLSB3aWxsIGNvbmZpZ3VyZSBmb3IgYSBUUU04NjBMIGF0IDgwIE1IeiB3aXRoIEZFQyBmb3IgZXRoZXJuZXQKKworICAgICAgbWFrZSBUUU04MjNMX0xDRF9jb25maWcKKwktIHdpbGwgY29uZmlndXJlIGZvciBhIFRRTTgyM0wgd2l0aCBVLUJvb3QgY29uc29sZSBvbiBMQ0QKKworICAgICAgbWFrZSBUUU04MjNMX0xDRF84ME1Iel9jb25maWcKKwktIHdpbGwgY29uZmlndXJlIGZvciBhIFRRTTgyM0wgYXQgODAgTUh6IHdpdGggVS1Cb290IGNvbnNvbGUgb24gTENECisKKyAgICAgIGV0Yy4KKworCisKK0ZpbmFsbHksIHR5cGUgIm1ha2UgYWxsIiwgYW5kIHlvdSBzaG91bGQgIGdldCAgc29tZSAgd29ya2luZyAgVS1Cb290CitpbWFnZXMgcmVhZHkgZm9yIGRvd25sb2QgdG8gLyBpbnN0YWxsYXRpb24gb24geW91ciBzeXN0ZW06CisKKy0gInUtYm9vdC5iaW4iIGlzIGEgcmF3IGJpbmFyeSBpbWFnZQorLSAidS1ib290IiBpcyBhbiBpbWFnZSBpbiBFTEYgYmluYXJ5IGZvcm1hdAorLSAidS1ib290LnNyZWMiIGlzIGluIE1vdG9yb2xhIFMtUmVjb3JkIGZvcm1hdAorCisKK1BsZWFzZSBiZSBhd2FyZSB0aGF0IHRoZSBNYWtlZmlsZXMgYXNzdW1lIHlvdSBhcmUgdXNpbmcgR05VIG1ha2UsIHNvCitmb3IgaW5zdGFuY2Ugb24gTmV0QlNEIHlvdSBtaWdodCBuZWVkIHRvIHVzZSAiZ21ha2UiIGluc3RlYWQgb2YKK25hdGl2ZSAibWFrZSIuCisKKworSWYgdGhlIHN5c3RlbSBib2FyZCB0aGF0IHlvdSBoYXZlIGlzIG5vdCBsaXN0ZWQsIHRoZW4geW91IHdpbGwgbmVlZAordG8gcG9ydCBVLUJvb3QgdG8geW91ciBoYXJkd2FyZSBwbGF0Zm9ybS4gVG8gZG8gdGhpcywgZm9sbG93IHRoZXNlCitzdGVwczoKKworMS4gIEFkZCBhIG5ldyBjb25maWd1cmF0aW9uIG9wdGlvbiBmb3IgeW91ciBib2FyZCB0byB0aGUgdG9wbGV2ZWwKKyAgICAiTWFrZWZpbGUiLCB1c2luZyB0aGUgZXhpc3RpbmcgZW50cmllcyBhcyBleGFtcGxlcy4KKzIuICBDcmVhdGUgYSBuZXcgZGlyZWN0b3J5IHRvIGhvbGQgeW91ciBib2FyZCBzcGVjaWZpYyBjb2RlLiBBZGQgYW55CisgICAgZmlsZXMgeW91IG5lZWQuCiszLiAgSWYgeW91J3JlIHBvcnRpbmcgVS1Cb290IHRvIGEgbmV3IENQVSwgdGhlbiBhbHNvIGNyZWF0ZSBhIG5ldworICAgIGRpcmVjdG9yeSB0byBob2xkIHlvdXIgQ1BVIHNwZWNpZmljIGNvZGUuIEFkZCBhbnkgZmlsZXMgeW91IG5lZWQuCis0LiAgUnVuICJtYWtlIGNvbmZpZ19uYW1lIiB3aXRoIHlvdXIgbmV3IG5hbWUuCis1LiAgVHlwZSAibWFrZSIsIGFuZCB5b3Ugc2hvdWxkIGdldCBhIHdvcmtpbmcgInUtYm9vdC5zcmVjIiBmaWxlCisgICAgdG8gYmUgaW5zdGFsbGVkIG9uIHlvdXIgdGFyZ2V0IHN5c3RlbS4KKyAgICBbT2YgY291cnNlLCB0aGlzIGxhc3Qgc3RlcCBpcyBtdWNoIGhhcmRlciB0aGFuIGl0IHNvdW5kcy5dCisKKworVGVzdGluZyBvZiBVLUJvb3QgTW9kaWZpY2F0aW9ucywgUG9ydHMgdG8gTmV3IEhhcmR3YXJlLCBldGMuOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSWYgeW91IGhhdmUgbW9kaWZpZWQgVS1Cb290IHNvdXJjZXMgKGZvciBpbnN0YW5jZSBhZGRlZCBhIG5ldwlib2FyZAorb3IgIHN1cHBvcnQgIGZvciAgbmV3ICBkZXZpY2VzLAkgYSBuZXcgQ1BVLCBldGMuKSB5b3UgYXJlIGV4cGVjdGVkIHRvCitwcm92aWRlIGZlZWRiYWNrIHRvIHRoZSBvdGhlciBkZXZlbG9wZXJzLiBUaGUgZmVlZGJhY2sgbm9ybWFsbHkgdGFrZXMKK3RoZSBmb3JtIG9mIGEgInBhdGNoIiwgaS4gZS4gYSBjb250ZXh0IGRpZmYgYWdhaW5zdCBhIGNlcnRhaW4gKGxhdGVzdAorb2ZmaWNpYWwgb3IgbGF0ZXN0IGluIENWUykgdmVyc2lvbiBvZiBVLUJvb3Qgc291cmNlcy4KKworQnV0IGJlZm9yZSB5b3Ugc3VibWl0IHN1Y2ggYSBwYXRjaCwgcGxlYXNlIHZlcmlmeSB0aGF0CXlvdXIgIG1vZGlmaS0KK2NhdGlvbglkaWQgbm90IGJyZWFrIGV4aXN0aW5nIGNvZGUuIEF0IGxlYXN0IG1ha2Ugc3VyZSB0aGF0ICpBTEwqIG9mCit0aGUgc3VwcG9ydGVkIGJvYXJkcyBjb21waWxlIFdJVEhPVVQgQU5ZIGNvbXBpbGVyIHdhcm5pbmdzLiBUbyBkbyBzbywKK2p1c3QgcnVuIHRoZSAiTUFLRUFMTCIgc2NyaXB0LCB3aGljaCB3aWxsIGNvbmZpZ3VyZSBhbmQgYnVpbGQgVS1Cb290Citmb3IgQUxMIHN1cHBvcnRlZCBzeXN0ZW0uIEJlIHdhcm5lZCwgdGhpcyB3aWxsIHRha2UgYSB3aGlsZS4gWW91ICBjYW4KK3NlbGVjdAl3aGljaCAgKGNyb3NzKQljb21waWxlciAgdG8gdXNlIHB5IHBhc3NpbmcgYSBgQ1JPU1NfQ09NUElMRScKK2Vudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBzY3JpcHQsIGkuIGUuIHRvIHVzZSB0aGUgY3Jvc3MgdG9vbHMgZnJvbQorTW9udGFWaXN0YSdzIEhhcmQgSGF0IExpbnV4IHlvdSBjYW4gdHlwZQorCisJQ1JPU1NfQ09NUElMRT1wcGNfOHh4LSBNQUtFQUxMCisKK29yIHRvIGJ1aWxkIG9uIGEgbmF0aXZlIFBvd2VyUEMgc3lzdGVtIHlvdSBjYW4gdHlwZQorCisJQ1JPU1NfQ09NUElMRT0nICcgTUFLRUFMTAorCitTZWUgYWxzbyAiVS1Cb290IFBvcnRpbmcgR3VpZGUiIGJlbG93LgorCisKKworTW9uaXRvciBDb21tYW5kcyAtIE92ZXJ2aWV3OgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitnbwktIHN0YXJ0IGFwcGxpY2F0aW9uIGF0IGFkZHJlc3MgJ2FkZHInCitydW4JLSBydW4gY29tbWFuZHMgaW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKK2Jvb3RtCS0gYm9vdCBhcHBsaWNhdGlvbiBpbWFnZSBmcm9tIG1lbW9yeQorYm9vdHAJLSBib290IGltYWdlIHZpYSBuZXR3b3JrIHVzaW5nIEJvb3RQL1RGVFAgcHJvdG9jb2wKK3RmdHBib290LSBib290IGltYWdlIHZpYSBuZXR3b3JrIHVzaW5nIFRGVFAgcHJvdG9jb2wKKwkgICAgICAgYW5kIGVudiB2YXJpYWJsZXMgImlwYWRkciIgYW5kICJzZXJ2ZXJpcCIKKwkgICAgICAgKGFuZCBldmVudHVhbGx5ICJnYXRld2F5aXAiKQorcmFycGJvb3QtIGJvb3QgaW1hZ2UgdmlhIG5ldHdvcmsgdXNpbmcgUkFSUC9URlRQIHByb3RvY29sCitkaXNrYm9vdC0gYm9vdCBmcm9tIElERSBkZXZpY2Vib290ZCAgIC0gYm9vdCBkZWZhdWx0LCBpLmUuLCBydW4gJ2Jvb3RjbWQnCitsb2FkcwktIGxvYWQgUy1SZWNvcmQgZmlsZSBvdmVyIHNlcmlhbCBsaW5lCitsb2FkYgktIGxvYWQgYmluYXJ5IGZpbGUgb3ZlciBzZXJpYWwgbGluZSAoa2VybWl0IG1vZGUpCittZAktIG1lbW9yeSBkaXNwbGF5CittbQktIG1lbW9yeSBtb2RpZnkgKGF1dG8taW5jcmVtZW50aW5nKQorbm0JLSBtZW1vcnkgbW9kaWZ5IChjb25zdGFudCBhZGRyZXNzKQorbXcJLSBtZW1vcnkgd3JpdGUgKGZpbGwpCitjcAktIG1lbW9yeSBjb3B5CitjbXAJLSBtZW1vcnkgY29tcGFyZQorY3JjMzIJLSBjaGVja3N1bSBjYWxjdWxhdGlvbgoraW1kICAgICAtIGkyYyBtZW1vcnkgZGlzcGxheQoraW1tICAgICAtIGkyYyBtZW1vcnkgbW9kaWZ5IChhdXRvLWluY3JlbWVudGluZykKK2lubSAgICAgLSBpMmMgbWVtb3J5IG1vZGlmeSAoY29uc3RhbnQgYWRkcmVzcykKK2ltdyAgICAgLSBpMmMgbWVtb3J5IHdyaXRlIChmaWxsKQoraWNyYzMyICAtIGkyYyBjaGVja3N1bSBjYWxjdWxhdGlvbgoraXByb2JlICAtIHByb2JlIHRvIGRpc2NvdmVyIHZhbGlkIEkyQyBjaGlwIGFkZHJlc3NlcworaWxvb3AgICAtIGluZmluaXRlIGxvb3Agb24gYWRkcmVzcyByYW5nZQoraXNkcmFtICAtIHByaW50IFNEUkFNIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KK3NzcGkgICAgLSBTUEkgdXRpbGl0eSBjb21tYW5kcworYmFzZQktIHByaW50IG9yIHNldCBhZGRyZXNzIG9mZnNldAorcHJpbnRlbnYtIHByaW50IGVudmlyb25tZW50IHZhcmlhYmxlcworc2V0ZW52CS0gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcworc2F2ZWVudiAtIHNhdmUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBlcnNpc3RlbnQgc3RvcmFnZQorcHJvdGVjdCAtIGVuYWJsZSBvciBkaXNhYmxlIEZMQVNIIHdyaXRlIHByb3RlY3Rpb24KK2VyYXNlCS0gZXJhc2UgRkxBU0ggbWVtb3J5CitmbGluZm8JLSBwcmludCBGTEFTSCBtZW1vcnkgaW5mb3JtYXRpb24KK2JkaW5mbwktIHByaW50IEJvYXJkIEluZm8gc3RydWN0dXJlCitpbWluZm8JLSBwcmludCBoZWFkZXIgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9uIGltYWdlCitjb25pbmZvIC0gcHJpbnQgY29uc29sZSBkZXZpY2VzIGFuZCBpbmZvcm1hdGlvbnMKK2lkZQktIElERSBzdWItc3lzdGVtCitsb29wCS0gaW5maW5pdGUgbG9vcCBvbiBhZGRyZXNzIHJhbmdlCittdGVzdAktIHNpbXBsZSBSQU0gdGVzdAoraWNhY2hlCS0gZW5hYmxlIG9yIGRpc2FibGUgaW5zdHJ1Y3Rpb24gY2FjaGUKK2RjYWNoZQktIGVuYWJsZSBvciBkaXNhYmxlIGRhdGEgY2FjaGUKK3Jlc2V0CS0gUGVyZm9ybSBSRVNFVCBvZiB0aGUgQ1BVCitlY2hvCS0gZWNobyBhcmdzIHRvIGNvbnNvbGUKK3ZlcnNpb24gLSBwcmludCBtb25pdG9yIHZlcnNpb24KK2hlbHAJLSBwcmludCBvbmxpbmUgaGVscAorPwktIGFsaWFzIGZvciAnaGVscCcKKworCitNb25pdG9yIENvbW1hbmRzIC0gRGV0YWlsZWQgRGVzY3JpcHRpb246Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RPRE8uCisKK0ZvciBub3c6IGp1c3QgdHlwZSAiaGVscCA8Y29tbWFuZD4iLgorCisKK0Vudmlyb25tZW50IFZhcmlhYmxlczoKKz09PT09PT09PT09PT09PT09PT09PT0KKworVS1Cb290IHN1cHBvcnRzIHVzZXIgY29uZmlndXJhdGlvbiB1c2luZyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgd2hpY2gKK2NhbiBiZSBtYWRlIHBlcnNpc3RlbnQgYnkgc2F2aW5nIHRvIEZsYXNoIG1lbW9yeS4KKworRW52aXJvbm1lbnQgVmFyaWFibGVzIGFyZSBzZXQgdXNpbmcgInNldGVudiIsIHByaW50ZWQgdXNpbmcKKyJwcmludGVudiIsIGFuZCBzYXZlZCB0byBGbGFzaCB1c2luZyAic2F2ZWVudiIuIFVzaW5nICJzZXRlbnYiCit3aXRob3V0IGEgdmFsdWUgY2FuIGJlIHVzZWQgdG8gZGVsZXRlIGEgdmFyaWFibGUgZnJvbSB0aGUKK2Vudmlyb25tZW50LiBBcyBsb25nIGFzIHlvdSBkb24ndCBzYXZlIHRoZSBlbnZpcm9ubWVudCB5b3UgYXJlCit3b3JraW5nIHdpdGggYW4gaW4tbWVtb3J5IGNvcHkuIEluIGNhc2UgdGhlIEZsYXNoIGFyZWEgY29udGFpbmluZyB0aGUKK2Vudmlyb25tZW50IGlzIGVyYXNlZCBieSBhY2NpZGVudCwgYSBkZWZhdWx0IGVudmlyb25tZW50IGlzIHByb3ZpZGVkLgorCitTb21lIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBjYW4gYmUgc2V0IHVzaW5nIEVudmlyb25tZW50IFZhcmlhYmxlczoKKworICBiYXVkcmF0ZQktIHNlZSBDT05GSUdfQkFVRFJBVEUKKworICBib290ZGVsYXkJLSBzZWUgQ09ORklHX0JPT1RERUxBWQorCisgIGJvb3RjbWQJLSBzZWUgQ09ORklHX0JPT1RDT01NQU5ECisKKyAgYm9vdGFyZ3MJLSBCb290IGFyZ3VtZW50cyB3aGVuIGJvb3RpbmcgYW4gUlRPUyBpbWFnZQorCisgIGJvb3RmaWxlCS0gTmFtZSBvZiB0aGUgaW1hZ2UgdG8gbG9hZCB3aXRoIFRGVFAKKworICBhdXRvbG9hZAktIGlmIHNldCB0byAibm8iIChhbnkgc3RyaW5nIGJlZ2lubmluZyB3aXRoICduJyksCisJCSAgImJvb3RwIiB3aWxsIGp1c3QgbG9hZCBwZXJmb3JtIGEgbG9va3VwIG9mIHRoZQorCQkgIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgQk9PVFAgc2VydmVyLCBidXQgbm90IHRyeSB0bworCQkgIGxvYWQgYW55IGltYWdlIHVzaW5nIFRGVFAKKworICBhdXRvc3RhcnQJLSBpZiBzZXQgdG8gInllcyIsIGFuIGltYWdlIGxvYWRlZCB1c2luZyB0aGUgImJvb3RwIiwKKwkJICAicmFycGJvb3QiLCAidGZ0cGJvb3QiIG9yICJkaXNrYm9vdCIgY29tbWFuZHMgd2lsbAorCQkgIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCAoYnkgaW50ZXJuYWxseSBjYWxsaW5nCisJCSAgImJvb3RtIikKKworICBpbml0cmRfaGlnaAktIHJlc3RyaWN0IHBvc2l0aW9uaW5nIG9mIGluaXRyZCBpbWFnZXM6CisJCSAgSWYgdGhpcyB2YXJpYWJsZSBpcyBub3Qgc2V0LCBpbml0cmQgaW1hZ2VzIHdpbGwgYmUKKwkJICBjb3BpZWQgdG8gdGhlIGhpZ2hlc3QgcG9zc2libGUgYWRkcmVzcyBpbiBSQU07IHRoaXMKKwkJICBpcyB1c3VhbGx5IHdoYXQgeW91IHdhbnQgc2luY2UgaXQgYWxsb3dzIGZvcgorCQkgIG1heGltdW0gaW5pdHJkIHNpemUuIElmIGZvciBzb21lIHJlYXNvbiB5b3Ugd2FudCB0bworCQkgIG1ha2Ugc3VyZSB0aGF0IHRoZSBpbml0cmQgaW1hZ2UgaXMgbG9hZGVkIGJlbG93IHRoZQorCQkgIENGR19CT09UTUFQU1ogbGltaXQsIHlvdSBjYW4gc2V0IHRoaXMgZW52aXJvbm1lbnQKKwkJICB2YXJpYWJsZSB0byBhIHZhbHVlIG9mICJubyIgb3IgIm9mZiIgb3IgIjAiLgorCQkgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2V0IGl0IHRvIGEgbWF4aW11bSB1cHBlcgorCQkgIGFkZHJlc3MgdG8gdXNlIChVLUJvb3Qgd2lsbCBzdGlsbCBjaGVjayB0aGF0IGl0CisJCSAgZG9lcyBub3Qgb3ZlcndyaXRlIHRoZSBVLUJvb3Qgc3RhY2sgYW5kIGRhdGEpLgorCisJCSAgRm9yIGluc3RhbmNlLCB3aGVuIHlvdSBoYXZlIGEgc3lzdGVtIHdpdGggMTYgTUIKKwkJICBSQU0sIGFuZCB3YW50IHRvIHJlc2V2ZSA0IE1CIGZyb20gdXNlIGJ5IExpbnV4LAorCQkgIHlvdSBjYW4gZG8gdGhpcyBieSBhZGRpbmcgIm1lbT0xMk0iIHRvIHRoZSB2YWx1ZSBvZgorCQkgIHRoZSAiYm9vdGFyZ3MiIHZhcmlhYmxlLiBIb3dldmVyLCBub3cgeW91IG11c3QgbWFrZQorCQkgIHN1cmUsIHRoYXQgdGhlIGluaXRyZCBpbWFnZSBpcyBwbGFjZWQgaW4gdGhlIGZpcnN0CisJCSAgMTIgTUIgYXMgd2VsbCAtIHRoaXMgY2FuIGJlIGRvbmUgd2l0aAorCisJCSAgc2V0ZW52IGluaXRyZF9oaWdoIDAwYzAwMDAwCisKKyAgaXBhZGRyCS0gSVAgYWRkcmVzczsgbmVlZGVkIGZvciB0ZnRwYm9vdCBjb21tYW5kCisKKyAgbG9hZGFkZHIJLSBEZWZhdWx0IGxvYWQgYWRkcmVzcyBmb3IgY29tbWFuZHMgbGlrZSAiYm9vdHAiLAorCQkgICJyYXJwYm9vdCIsICJ0ZnRwYm9vdCIgb3IgImRpc2tib290IgorCisgIGxvYWRzX2VjaG8JLSBzZWUgQ09ORklHX0xPQURTX0VDSE8KKworICBzZXJ2ZXJpcAktIFRGVFAgc2VydmVyIElQIGFkZHJlc3M7IG5lZWRlZCBmb3IgdGZ0cGJvb3QgY29tbWFuZAorCisgIGJvb3RyZXRyeQktIHNlZSBDT05GSUdfQk9PVF9SRVRSWV9USU1FCisKKyAgYm9vdGRlbGF5a2V5CS0gc2VlIENPTkZJR19BVVRPQk9PVF9ERUxBWV9TVFIKKworICBib290c3RvcGtleQktIHNlZSBDT05GSUdfQVVUT0JPT1RfU1RPUF9TVFIKKworCitUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBtYXkgYmUgdXNlZCBhbmQgYXV0b21hdGljYWxseQordXBkYXRlZCBieSB0aGUgbmV0d29yayBib290IGNvbW1hbmRzICgiYm9vdHAiIGFuZCAicmFycGJvb3QiKSwKK2RlcGVuZGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgeW91ciBib290IHNlcnZlcjoKKworICBib290ZmlsZQktIHNlZSBhYm92ZQorICBkbnNpcAkJLSBJUCBhZGRyZXNzIG9mIHlvdXIgRG9tYWluIE5hbWUgU2VydmVyCisgIGdhdGV3YXlpcAktIElQIGFkZHJlc3Mgb2YgdGhlIEdhdGV3YXkgKFJvdXRlcikgdG8gdXNlCisgIGhvc3RuYW1lCS0gVGFyZ2V0IGhvc3RuYW1lCisgIGlwYWRkcgktIHNlZSBhYm92ZQorICBuZXRtYXNrCS0gU3VibmV0IE1hc2sKKyAgcm9vdHBhdGgJLSBQYXRobmFtZSBvZiB0aGUgcm9vdCBmaWxlc3lzdGVtIG9uIHRoZSBORlMgc2VydmVyCisgIHNlcnZlcmlwCS0gc2VlIGFib3ZlCisKKworVGhlcmUgYXJlIHR3byBzcGVjaWFsIEVudmlyb25tZW50IFZhcmlhYmxlczoKKworICBzZXJpYWwjCS0gY29udGFpbnMgaGFyZHdhcmUgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24gc3VjaAorCQkgIGFzIHR5cGUgc3RyaW5nIGFuZC9vciBzZXJpYWwgbnVtYmVyCisgIGV0aGFkZHIJLSBFdGhlcm5ldCBhZGRyZXNzCisKK1RoZXNlIHZhcmlhYmxlcyBjYW4gYmUgc2V0IG9ubHkgb25jZSAodXN1YWxseSBkdXJpbmcgbWFudWZhY3R1cmluZyBvZgordGhlIGJvYXJkKS4gVS1Cb290IHJlZnVzZXMgdG8gZGVsZXRlIG9yIG92ZXJ3cml0ZSB0aGVzZSB2YXJpYWJsZXMKK29uY2UgdGhleSBoYXZlIGJlZW4gc2V0IG9uY2UuCisKKworUGxlYXNlIG5vdGUgdGhhdCBjaGFuZ2VzIHRvIHNvbWUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIG1heSB0YWtlCitvbmx5IGVmZmVjdCBhZnRlciB0aGUgbmV4dCBib290ICh5ZXMsIHRoYXQncyBqdXN0IGxpa2UgV2luZG96ZSA6LSkuCisKKworTm90ZSBmb3IgUmVkdW5kYW50IEV0aGVybmV0IEludGVyZmFjZXM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU29tZSBib2FyZHMgY29tZSB3aXRoIHJlZHVuZGFuZCBldGhlcm5ldCBpbnRlcmZhY2VzOyBVLUJvb3Qgc3VwcG9ydHMKK3N1Y2ggY29uZmlndXJhdGlvbnMgYW5kIGlzIGNhcGFibGUgb2YgYXV0b21hdGljIHNlbGVjdGlvbiBvZiBhCisid29ya2luZyIgaW50ZXJmYWNlIHdoZW4gbmVlZGVkLiBNQUMgYXNzaWduZW1udCB3b3JrcyBhcyBmb2xsb3dzOgorCitOZXR3b3JrIGludGVyZmFjZXMgYXJlIG51bWJlcmVkIGV0aDAsIGV0aDEsIGV0aDIsIC4uLiBDb3JyZXNwb25kaW5nCitNQUMgYWRkcmVzc2VzIGNhbiBiZSBzdG9yZWQgaW4gdGhlIGVudmlyb25tZW50IGFzICJldGhhZGRyIiAoPT5ldGgwKSwKKyJldGgxYWRkciIgKD0+ZXRoMSksICJldGgyYWRkciIsIC4uLgorCitJZiB0aGUgbmV0d29yayBpbnRlcmZhY2Ugc3RvcmVzIHNvbWUgdmFsaWQgTUFDIGFkZHJlc3MgKGZvciBpbnN0YW5jZQoraW4gU1JPTSksIHRoaXMgaXMgdXNlZCBhcyBkZWZhdWx0IGFkZHJlc3MgaWYgdGhlcmUgaXMgTk8gY29ycmVzcG9uLQorZGluZyBzZXR0aW5nIGluIHRoZSBlbnZpcm9ubWVudDsgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIGlzIHNldCwgdGhpcyBvdmVycmlkZXMgdGhlIHNldHRpbmdzIGluIHRoZSBjYXJkOyB0aGF0IG1lYW5zOgorCitvIElmIHRoZSBTUk9NIGhhcyBhIHZhbGlkIE1BQyBhZGRyZXNzLCBhbmQgdGhlcmUgaXMgbm8gYWRkcmVzcyBpbiB0aGUKKyAgZW52aXJvbm1lbnQsIHRoZSBTUk9NJ3MgYWRkcmVzcyBpcyB1c2VkLgorCitvIElmIHRoZXJlIGlzIG5vIHZhbGlkIGFkZHJlc3MgaW4gdGhlIFNST00sIGFuZCBhIGRlZmluaXRpb24gaW4gdGhlCisgIGVudmlyb25tZW50IGV4aXN0cywgdGhlbiB0aGUgdmFsdWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMKKyAgdXNlZC4KKworbyBJZiBib3RoIHRoZSBTUk9NIGFuZCB0aGUgZW52aXJvbm1lbnQgY29udGFpbiBhIE1BQyBhZGRyZXNzLCBhbmQKKyAgYm90aCBhZGRyZXNzZXMgYXJlIHRoZSBzYW1lLCB0aGlzIE1BQyBhZGRyZXNzIGlzIHVzZWQuCisKK28gSWYgYm90aCB0aGUgU1JPTSBhbmQgdGhlIGVudmlyb25tZW50IGNvbnRhaW4gYSBNQUMgYWRkcmVzcywgYW5kIHRoZQorICBhZGRyZXNzZXMgZGlmZmVyLCB0aGUgdmFsdWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgaXMgdXNlZCBhbmQgYQorICB3YXJuaW5nIGlzIHByaW50ZWQuCisKK28gSWYgbmVpdGhlciBTUk9NIG5vciB0aGUgZW52aXJvbm1lbnQgY29udGFpbiBhIE1BQyBhZGRyZXNzLCBhbiBlcnJvcgorICBpcyByYWlzZWQuCisKKworCitJbWFnZSBGb3JtYXRzOgorPT09PT09PT09PT09PT0KKworVGhlICJib290IiBjb21tYW5kcyBvZiB0aGlzIG1vbml0b3Igb3BlcmF0ZSBvbiAiaW1hZ2UiIGZpbGVzIHdoaWNoCitjYW4gYmUgYmFzaWNseSBhbnl0aGluZywgcHJlY2VlZGVkIGJ5IGEgc3BlY2lhbCBoZWFkZXI7IHNlZSB0aGUKK2RlZmluaXRpb25zIGluIGluY2x1ZGUvaW1hZ2UuaCBmb3IgZGV0YWlsczsgYmFzaWNseSwgdGhlIGhlYWRlcgorZGVmaW5lcyB0aGUgZm9sbG93aW5nIGltYWdlIHByb3BlcnRpZXM6CisKKyogVGFyZ2V0IE9wZXJhdGluZyBTeXN0ZW0gKFByb3Zpc2lvbnMgZm9yIE9wZW5CU0QsIE5ldEJTRCwgRnJlZUJTRCwKKyAgNC40QlNELCBMaW51eCwgU1ZSNCwgRXNpeCwgU29sYXJpcywgSXJpeCwgU0NPLCBEZWxsLCBOQ1IsIFZ4V29ya3MsCisgIEx5bnhPUywgcFNPUywgUU5YOworICBDdXJyZW50bHkgc3VwcG9ydGVkOiBMaW51eCwgTmV0QlNELCBWeFdvcmtzLCBRTlgpLgorKiBUYXJnZXQgQ1BVIEFyY2hpdGVjdHVyZSAoUHJvdmlzaW9ucyBmb3IgQWxwaGEsIEFSTSwgSW50ZWwgeDg2LAorICBJQTY0LCBNSVBTLCBNSVBTLCBQb3dlclBDLCBJQk0gUzM5MCwgU3VwZXJILCBTcGFyYywgU3BhcmMgNjQgQml0OworICBDdXJyZW50bHkgc3VwcG9ydGVkOiBQb3dlclBDKS4KKyogQ29tcHJlc3Npb24gVHlwZSAoUHJvdmlzaW9ucyBmb3IgdW5jb21wcmVzc2VkLCBnemlwLCBiemlwMjsKKyAgQ3VycmVudGx5IHN1cHBvcnRlZDogdW5jb21wcmVzc2VkLCBnemlwKS4KKyogTG9hZCBBZGRyZXNzCisqIEVudHJ5IFBvaW50CisqIEltYWdlIE5hbWUKKyogSW1hZ2UgVGltZXN0YW1wCisKK1RoZSBoZWFkZXIgaXMgbWFya2VkIGJ5IGEgc3BlY2lhbCBNYWdpYyBOdW1iZXIsIGFuZCBib3RoIHRoZSBoZWFkZXIKK2FuZCB0aGUgZGF0YSBwb3J0aW9ucyBvZiB0aGUgaW1hZ2UgYXJlIHNlY3VyZWQgYWdhaW5zdCBjb3JydXB0aW9uIGJ5CitDUkMzMiBjaGVja3N1bXMuCisKKworTGludXggU3VwcG9ydDoKKz09PT09PT09PT09PT09CisKK0FsdGhvdWdoIFUtQm9vdCBzaG91bGQgc3VwcG9ydCBhbnkgT1Mgb3Igc3RhbmRhbG9uZSBhcHBsaWNhdGlvbgorZWFzaWx5LCBMaW51eCBoYXMgYWx3YXlzIGJlZW4gaW4gdGhlIGZvY3VzIGR1cmluZyB0aGUgZGVzaWduIG9mCitVLUJvb3QuCisKK1UtQm9vdCBpbmNsdWRlcyBtYW55IGZlYXR1cmVzIHRoYXQgc28gZmFyIGhhdmUgYmVlbiBwYXJ0IG9mIHNvbWUKK3NwZWNpYWwgImJvb3QgbG9hZGVyIiBjb2RlIHdpdGhpbiB0aGUgTGludXgga2VybmVsLiBBbHNvLCBhbnkKKyJpbml0cmQiIGltYWdlcyB0byBiZSB1c2VkIGFyZSBubyBsb25nZXIgcGFydCBvZiBvbmUgYmlnIExpbnV4IGltYWdlOworaW5zdGVhZCwga2VybmVsIGFuZCAiaW5pdHJkIiBhcmUgc2VwYXJhdGUgaW1hZ2VzLiBUaGlzIGltcGxlbWVudGF0aW9uCitzZXJ2ZXMgc2VydmVyYWwgcHVycG9zZXM6CisKKy0gdGhlIHNhbWUgZmVhdHVyZXMgY2FuIGJlIHVzZWQgZm9yIG90aGVyIE9TIG9yIHN0YW5kYWxvbmUKKyAgYXBwbGljYXRpb25zIChmb3IgaW5zdGFuY2U6IHVzaW5nIGNvbXByZXNzZWQgaW1hZ2VzIHRvIHJlZHVjZSB0aGUKKyAgRmxhc2ggbWVtb3J5IGZvb3RwcmludCkKKworLSBpdCBiZWNvbWVzIG11Y2ggZWFzaWVyIHRvIHBvcnQgbmV3IExpbnV4IGtlcm5lbCB2ZXJzaW9ucyBiZWNhdXNlCisgIGxvdHMgb2YgbG93LWxldmVsLCBoYXJkd2FyZSBkZXBlbmRlbmQgc3R1ZmYgYXJlIGRvbmUgYnkgVS1Cb290CisKKy0gdGhlIHNhbWUgTGludXgga2VybmVsIGltYWdlIGNhbiBub3cgYmUgdXNlZCB3aXRoIGRpZmZlcmVudCAiaW5pdHJkIgorICBpbWFnZXM7IG9mIGNvdXJzZSB0aGlzIGFsc28gbWVhbnMgdGhhdCBkaWZmZXJlbnQga2VybmVsIGltYWdlcyBjYW4KKyAgYmUgcnVuIHdpdGggdGhlIHNhbWUgImluaXRyZCIuIFRoaXMgbWFrZXMgdGVzdGluZyBlYXNpZXIgKHlvdSBkb24ndAorICBoYXZlIHRvIGJ1aWxkIGEgbmV3ICJ6SW1hZ2UuaW5pdHJkIiBMaW51eCBpbWFnZSB3aGVuIHlvdSBqdXN0CisgIGNoYW5nZSBhIGZpbGUgaW4geW91ciAiaW5pdHJkIikuIEFsc28sIGEgZmllbGQtdXBncmFkZSBvZiB0aGUKKyAgc29mdHdhcmUgaXMgZWFzaWVyIG5vdy4KKworCitMaW51eCBIT1dUTzoKKz09PT09PT09PT09PQorCitQb3J0aW5nIExpbnV4IHRvIFUtQm9vdCBiYXNlZCBzeXN0ZW1zOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1UtQm9vdCBjYW5ub3Qgc2F2ZSB5b3UgZnJvbSBkb2luZyBhbGwgdGhlIG5lY2Vzc2FyeSBtb2RpZmljYXRpb25zIHRvCitjb25maWd1cmUgdGhlIExpbnV4IGRldmljZSBkcml2ZXJzIGZvciB1c2Ugd2l0aCB5b3VyIHRhcmdldCBoYXJkd2FyZQorKG5vLCB3ZSBkb24ndCBpbnRlbmQgdG8gcHJvdmlkZSBhIGZ1bGwgdmlydHVhbCBtYWNoaW5lIGludGVyZmFjZSB0bworTGludXggOi0pLgorCitCdXQgbm93IHlvdSBjYW4gaWdub3JlIEFMTCBib290IGxvYWRlciBjb2RlIChpbiBhcmNoL3BwYy9tYnhib290KS4KKworSnVzdCBtYWtlIHN1cmUgeW91ciBtYWNoaW5lIHNwZWNpZmljIGhlYWRlciBmaWxlIChmb3IgaW5zdGFuY2UKK2luY2x1ZGUvYXNtLXBwYy90cW04eHguaCkgaW5jbHVkZXMgdGhlIHNhbWUgZGVmaW5pdGlvbiBvZiB0aGUgQm9hcmQKK0luZm9ybWF0aW9uIHN0cnVjdHVyZSBhcyB3ZSBkZWZpbmUgaW4gaW5jbHVkZS91LWJvb3QuaCwgYW5kIG1ha2UKK3N1cmUgdGhhdCB5b3VyIGRlZmluaXRpb24gb2YgSU1BUF9BRERSIHVzZXMgdGhlIHNhbWUgdmFsdWUgYXMgeW91cgorVS1Cb290IGNvbmZpZ3VyYXRpb24gaW4gQ0ZHX0lNTVIuCisKKworQ29uZmlndXJpbmcgdGhlIExpbnV4IGtlcm5lbDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vIHNwZWNpZmljIHJlcXVpcmVtZW50cyBmb3IgVS1Cb290LiBNYWtlIHN1cmUgeW91IGhhdmUgc29tZSByb290CitkZXZpY2UgKGluaXRpYWwgcmFtZGlzaywgTkZTKSBmb3IgeW91ciB0YXJnZXQgc3lzdGVtLgorCisKK0J1aWxkaW5nIGEgTGludXggSW1hZ2U6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitObyBzcGVjaWZpYyByZXF1aXJlbWVudHMgZm9yIFUtQm9vdC4gVGhlcmUgaXMgbm8gbmVlZCB0byBhZGQgYQorInJhbWRpc2suaW1hZ2UuZ3oiIGZpbGUgd2hlbiBidWlsZGluZyB0aGUga2VybmVsLCBldmVuIHdoZW4geW91CitpbnRlbmQgdG8gcnVuIGl0IHdpdGggaW5pdGlhbCByYW1kaXNrLgorCitFeGFtcGxlOgorCisJbWFrZSBUUU04NTBMX2NvbmZpZworCW1ha2Ugb2xkY29uZmlnCisJbWFrZSBkZXAKKwltYWtlIHpJbWFnZQorCitIb3dldmVyLCB3ZSBkb24ndCB1c2UgdGhlICd6SW1hZ2UnICg9ICdhcmNoL3BwYy9tYnhib290L3p2bWxpbnV4Jykgd2UKK2J1aWxkIHRoaXMgd2F5LiBUaGUgJ3pJbWFnZScgaW5jbHVkZXMgdGhlIG9sZCBib290IGxvYWRlciBjb2RlIHdoaWNoCit3ZSBkb24ndCBuZWQgYW55IG1vcmUuIEluc3RlYWQsIHdlIHVzZSB0aGUgcmF3IChjb21wcmVzc2VkKSBMaW51eAora2VybmVsIGltYWdlIGluICdhcmNoL3BwYy9jb2ZmYm9vdC92bWxpbnV4Lmd6Jy4KKworVGhlcmUgaXMgYSBzcGVjaWFsIHRvb2wgKGluICd0b29scy9ta2ltYWdlJykgdG8gZW5jYXBzdWxhdGUgdGhpcworaW1hZ2Ugd2l0aCBoZWFkZXIgaW5mb3JtYXRpb24sIENSQzMyIGNoZWNrc3VtIGV0Yy4gZm9yIHVzZSB3aXRoCitVLUJvb3Q6CisKK0luIHRoZSBmaXJzdCBmb3JtICh3aXRoICItbCIgb3B0aW9uKSBta2ltYWdlICBsaXN0cyAgdGhlICBpbmZvcm1hdGlvbgorY29udGFpbmVkICBpbiAgdGhlIGhlYWRlciBvZiBhbiBleGlzdGluZyBVLUJvb3QgaW1hZ2U7IHRoaXMgaW5jbHVkZXMKK2NoZWNrc3VtIHZlcmlmaWNhdGlvbjoKKworCXRvb2xzL21raW1hZ2UgLWwgaW1hZ2UKKwkgIC1sID09PiBsaXN0IGltYWdlIGhlYWRlciBpbmZvcm1hdGlvbgorCitUaGUgc2Vjb25kIGZvcm0gKHdpdGggIi1kIiBvcHRpb24pIGlzIHVzZWQgdG8gYnVpbGQgYSBVLUJvb3QgaW1hZ2UKK2Zyb20gYSAiZGF0YSBmaWxlIiB3aGljaCBpcyB1c2VkIGFzIGltYWdlIHBheWxvYWQ6CisKKwl0b29scy9ta2ltYWdlIC1BIGFyY2ggLU8gb3MgLVQgdHlwZSAtQyBjb21wIC1hIGFkZHIgLWUgZXAgXAorCQkgICAgICAtbiBuYW1lIC1kIGRhdGFfZmlsZSBpbWFnZQorCSAgLUEgPT0+IHNldCBhcmNoaXRlY3R1cmUgdG8gJ2FyY2gnCisJICAtTyA9PT4gc2V0IG9wZXJhdGluZyBzeXN0ZW0gdG8gJ29zJworCSAgLVQgPT0+IHNldCBpbWFnZSB0eXBlIHRvICd0eXBlJworCSAgLUMgPT0+IHNldCBjb21wcmVzc2lvbiB0eXBlICdjb21wJworCSAgLWEgPT0+IHNldCBsb2FkIGFkZHJlc3MgdG8gJ2FkZHInIChoZXgpCisJICAtZSA9PT4gc2V0IGVudHJ5IHBvaW50IHRvICdlcCcgKGhleCkKKwkgIC1uID09PiBzZXQgaW1hZ2UgbmFtZSB0byAnbmFtZScKKwkgIC1kID09PiB1c2UgaW1hZ2UgZGF0YSBmcm9tICdkYXRhZmlsZScKKworUmlnaHQgbm93LCBhbGwgTGludXgga2VybmVscyB1c2UgdGhlIHNhbWUgbG9hZCBhZGRyZXNzCSgweDAwMDAwMDAwKSwKK2J1dCB0aGUgZW50cnkgcG9pbnQgYWRkcmVzcyBkZXBlbmRzIG9uIHRoZSBrZXJuZWwgdmVyc2lvbjoKKworLSAyLjIueCBrZXJuZWxzIGhhdmUgdGhlIGVudHJ5IHBvaW50IGF0IDB4MDAwMDAwMEMsCistIDIuMy54IGFuZCAyLjQueCBrZXJuZWxzIGhhdmUgdGhlIGVudHJ5IHBvaW50IGF0IDB4MDAwMDAwMDAuCisKK1NvIGEgdHlwaWNhbCBjYWxsIHRvIGJ1aWxkIGEgVS1Cb290IGltYWdlIHdvdWxkIHJlYWQ6CisKKwktPiB0b29scy9ta2ltYWdlIC1uICcyLjIuMTMgZm9yIGluaXRyZCBvbiBUUU04NTBMJyBcCisJPiAtQSBwcGMgLU8gbGludXggLVQga2VybmVsIC1DIGd6aXAgLWEgMDAwMDAwMDAgLWUgMDAwMDAwMEMgXAorCT4gLWQgL29wdC9tcGM4eHgvc3JjL2xpbnV4LTIuMi4xMy9hcmNoL3BwYy9jb2ZmYm9vdC92bWxpbnV4Lmd6IFwKKwk+IGV4YW1wbGVzL2ltYWdlLTIuMi4xMy1pbml0cmQKKwlJbWFnZSBOYW1lOiAgIDIuMi4xMyBmb3IgaW5pdHJkIG9uIFRRTTg1MEwKKwlDcmVhdGVkOiAgICAgIFdlZCBKdWwgMTkgMDI6MzQ6NTkgMjAwMAorCUltYWdlIFR5cGU6ICAgUG93ZXJQQyBMaW51eCBLZXJuZWwgSW1hZ2UgKGd6aXAgY29tcHJlc3NlZCkKKwlEYXRhIFNpemU6ICAgIDMzNTcyNSBCeXRlcyA9IDMyNy44NiBrQiA9IDAuMzIgTUIKKwlMb2FkIEFkZHJlc3M6IDB4MDAwMDAwMDAKKwlFbnRyeSBQb2ludDogIDB4MDAwMDAwMGMKKworVG8gdmVyaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgaW1hZ2UgKG9yIGNoZWNrIGZvciBjb3JydXB0aW9uKToKKworCS0+IHRvb2xzL21raW1hZ2UgLWwgZXhhbXBsZXMvaW1hZ2UtMi4yLjEzLWluaXRyZAorCUltYWdlIE5hbWU6ICAgMi4yLjEzIGZvciBpbml0cmQgb24gVFFNODUwTAorCUNyZWF0ZWQ6ICAgICAgV2VkIEp1bCAxOSAwMjozNDo1OSAyMDAwCisJSW1hZ2UgVHlwZTogICBQb3dlclBDIExpbnV4IEtlcm5lbCBJbWFnZSAoZ3ppcCBjb21wcmVzc2VkKQorCURhdGEgU2l6ZTogICAgMzM1NzI1IEJ5dGVzID0gMzI3Ljg2IGtCID0gMC4zMiBNQgorCUxvYWQgQWRkcmVzczogMHgwMDAwMDAwMAorCUVudHJ5IFBvaW50OiAgMHgwMDAwMDAwYworCitOT1RFOiBmb3IgZW1iZWRkZWQgc3lzdGVtcyB3aGVyZSBib290IHRpbWUgaXMgY3JpdGljYWwgeW91IGNhbiB0cmFkZQorc3BlZWQgZm9yIG1lbW9yeSBhbmQgaW5zdGFsbCBhbiBVTkNPTVBSRVNTRUQgaW1hZ2UgaW5zdGVhZDogdGhpcworbmVlZHMgbW9yZSBzcGFjZSBpbiBGbGFzaCwgYnV0IGJvb3RzIG11Y2ggZmFzdGVyIHNpbmNlIGl0IGRvZXMgbm90CituZWVkIHRvIGJlIHVuY29tcHJlc3NlZDoKKworCS0+IGd1bnppcCAvb3B0L21wYzh4eC9zcmMvbGludXgtMi4yLjEzL2FyY2gvcHBjL2NvZmZib290L3ZtbGludXguZ3oKKwktPiB0b29scy9ta2ltYWdlIC1uICcyLjIuMTMgZm9yIGluaXRyZCBvbiBUUU04NTBMJyBcCisJPiAtQSBwcGMgLU8gbGludXggLVQga2VybmVsIC1DIG5vbmUgLWEgMDAwMDAwMDAgLWUgMDAwMDAwMEMgXAorCT4gLWQgL29wdC9tcGM4eHgvc3JjL2xpbnV4LTIuMi4xMy9hcmNoL3BwYy9jb2ZmYm9vdC92bWxpbnV4IFwKKwk+IGV4YW1wbGVzL2ltYWdlLTIuMi4xMy1pbml0cmQtdW5jb21wcmVzc2VkCisJSW1hZ2UgTmFtZTogICAyLjIuMTMgZm9yIGluaXRyZCBvbiBUUU04NTBMCisJQ3JlYXRlZDogICAgICBXZWQgSnVsIDE5IDAyOjM0OjU5IDIwMDAKKwlJbWFnZSBUeXBlOiAgIFBvd2VyUEMgTGludXggS2VybmVsIEltYWdlICh1bmNvbXByZXNzZWQpCisJRGF0YSBTaXplOiAgICA3OTIxNjAgQnl0ZXMgPSA3NzMuNTkga0IgPSAwLjc2IE1CCisJTG9hZCBBZGRyZXNzOiAweDAwMDAwMDAwCisJRW50cnkgUG9pbnQ6ICAweDAwMDAwMDBjCisKKworU2ltaWxhciB5b3UgY2FuIGJ1aWxkIFUtQm9vdCBpbWFnZXMgZnJvbSBhICdyYW1kaXNrLmltYWdlLmd6JyBmaWxlCit3aGVuIHlvdXIga2VybmVsIGlzIGludGVuZGVkIHRvIHVzZSBhbiBpbml0aWFsIHJhbWRpc2s6CisKKwktPiB0b29scy9ta2ltYWdlIC1uICdTaW1wbGUgUmFtZGlzayBJbWFnZScgXAorCT4gLUEgcHBjIC1PIGxpbnV4IC1UIHJhbWRpc2sgLUMgZ3ppcCBcCisJPiAtZCAvTGludXhQUEMvaW1hZ2VzL1NJTVBMRS1yYW1kaXNrLmltYWdlLmd6IGV4YW1wbGVzL3NpbXBsZS1pbml0cmQKKwlJbWFnZSBOYW1lOiAgIFNpbXBsZSBSYW1kaXNrIEltYWdlCisJQ3JlYXRlZDogICAgICBXZWQgSmFuIDEyIDE0OjAxOjUwIDIwMDAKKwlJbWFnZSBUeXBlOiAgIFBvd2VyUEMgTGludXggUkFNRGlzayBJbWFnZSAoZ3ppcCBjb21wcmVzc2VkKQorCURhdGEgU2l6ZTogICAgNTY2NTMwIEJ5dGVzID0gNTUzLjI1IGtCID0gMC41NCBNQgorCUxvYWQgQWRkcmVzczogMHgwMDAwMDAwMAorCUVudHJ5IFBvaW50OiAgMHgwMDAwMDAwMAorCisKK0luc3RhbGxpbmcgYSBMaW51eCBJbWFnZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gZG93bmxvYWRpbmcgYSBVLUJvb3QgaW1hZ2Ugb3ZlciB0aGUgc2VyaWFsIChjb25zb2xlKSBpbnRlcmZhY2UsCit5b3UgbXVzdCBjb252ZXJ0IHRoZSBpbWFnZSB0byBTLVJlY29yZCBmb3JtYXQ6CisKKwlvYmpjb3B5IC1JIGJpbmFyeSAtTyBzcmVjIGV4YW1wbGVzL2ltYWdlIGV4YW1wbGVzL2ltYWdlLnNyZWMKKworVGhlICdvYmpjb3B5JyBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgVS1Cb290CitpbWFnZSBoZWFkZXIsIHNvIHRoZSByZXN1bHRpbmcgUy1SZWNvcmQgZmlsZSB3aWxsIGJlIHJlbGF0aXZlIHRvCithZGRyZXNzIDB4MDAwMDAwMDAuIFRvIGxvYWQgaXQgdG8gYSBnaXZlbiBhZGRyZXNzLCB5b3UgbmVlZCB0bworc3BlY2lmeSB0aGUgdGFyZ2V0IGFkZHJlc3MgYXMgJ29mZnNldCcgcGFyYW1ldGVyIHdpdGggdGhlICdsb2FkcycKK2NvbW1hbmQuCisKK0V4YW1wbGU6IGluc3RhbGwgdGhlIGltYWdlIHRvIGFkZHJlc3MgMHg0MDEwMDAwMCAod2hpY2ggb24gdGhlCitUUU04eHhMIGlzIGluIHRoZSBmaXJzdCBGbGFzaCBiYW5rKToKKworCT0+IGVyYXNlIDQwMTAwMDAwIDQwMUZGRkZGCisKKwkuLi4uLi4uLi4uIGRvbmUKKwlFcmFzZWQgOCBzZWN0b3JzCisKKwk9PiBsb2FkcyA0MDEwMDAwMAorCSMjIFJlYWR5IGZvciBTLVJlY29yZCBkb3dubG9hZCAuLi4KKwl+PmV4YW1wbGVzL2ltYWdlLnNyZWMKKwkxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAuLi4KKwkuLi4KKwkxNTk4OSAxNTk5MCAxNTk5MSAxNTk5MgorCVtmaWxlIHRyYW5zZmVyIGNvbXBsZXRlXQorCVtjb25uZWN0ZWRdCisJIyMgU3RhcnQgQWRkciA9IDB4MDAwMDAwMDAKKworCitZb3UgY2FuIGNoZWNrIHRoZSBzdWNjZXNzIG9mIHRoZSBkb3dubG9hZCB1c2luZyB0aGUgJ2ltaW5mbycgY29tbWFuZDsKK3RoaXMgaW5jbHVkZXMgYSBjaGVja3N1bSB2ZXJpZmljYXRpb24gc28geW91ICBjYW4gIGJlICBzdXJlICBubwkgZGF0YQorY29ycnVwdGlvbiBoYXBwZW5lZDoKKworCT0+IGltaSA0MDEwMDAwMAorCisJIyMgQ2hlY2tpbmcgSW1hZ2UgYXQgNDAxMDAwMDAgLi4uCisJICAgSW1hZ2UgTmFtZToJIDIuMi4xMyBmb3IgaW5pdHJkIG9uIFRRTTg1MEwKKwkgICBJbWFnZSBUeXBlOgkgUG93ZXJQQyBMaW51eCBLZXJuZWwgSW1hZ2UgKGd6aXAgY29tcHJlc3NlZCkKKwkgICBEYXRhIFNpemU6CSAzMzU3MjUgQnl0ZXMgPSAzMjcga0IgPSAwIE1CCisJICAgTG9hZCBBZGRyZXNzOiAwMDAwMDAwMAorCSAgIEVudHJ5IFBvaW50OgkgMDAwMDAwMGMKKwkgICBWZXJpZnlpbmcgQ2hlY2tzdW0gLi4uIE9LCisKKworCitCb290IExpbnV4OgorLS0tLS0tLS0tLS0KKworVGhlICJib290bSIgY29tbWFuZCBpcyB1c2VkIHRvIGJvb3QgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBzdG9yZWQgaW4KK21lbW9yeSAoUkFNIG9yIEZsYXNoKS4gSW4gY2FzZSBvZiBhIExpbnV4IGtlcm5lbCBpbWFnZSwgdGhlIGNvbnRlbnRzCitvZiB0aGUgImJvb3RhcmdzIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBwYXNzZWQgdG8gdGhlIGtlcm5lbCBhcworcGFyYW1ldGVycy4gWW91IGNhbiBjaGVjayBhbmQgbW9kaWZ5IHRoaXMgdmFyaWFibGUgdXNpbmcgdGhlCisicHJpbnRlbnYiIGFuZCAic2V0ZW52IiBjb21tYW5kczoKKworCisJPT4gcHJpbnRlbnYgYm9vdGFyZ3MKKwlib290YXJncz1yb290PS9kZXYvcmFtCisKKwk9PiBzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyBuZnNyb290PTEwLjAuMC4yOi9MaW51eFBQQyBuZnNhZGRycz0xMC4wLjAuOTk6MTAuMC4wLjIKKworCT0+IHByaW50ZW52IGJvb3RhcmdzCisJYm9vdGFyZ3M9cm9vdD0vZGV2L25mcyBydyBuZnNyb290PTEwLjAuMC4yOi9MaW51eFBQQyBuZnNhZGRycz0xMC4wLjAuOTk6MTAuMC4wLjIKKworCT0+IGJvb3RtIDQwMDIwMDAwCisJIyMgQm9vdGluZyBMaW51eCBrZXJuZWwgYXQgNDAwMjAwMDAgLi4uCisJICAgSW1hZ2UgTmFtZToJIDIuMi4xMyBmb3IgTkZTIG9uIFRRTTg1MEwKKwkgICBJbWFnZSBUeXBlOgkgUG93ZXJQQyBMaW51eCBLZXJuZWwgSW1hZ2UgKGd6aXAgY29tcHJlc3NlZCkKKwkgICBEYXRhIFNpemU6CSAzODE2ODEgQnl0ZXMgPSAzNzIga0IgPSAwIE1CCisJICAgTG9hZCBBZGRyZXNzOiAwMDAwMDAwMAorCSAgIEVudHJ5IFBvaW50OgkgMDAwMDAwMGMKKwkgICBWZXJpZnlpbmcgQ2hlY2tzdW0gLi4uIE9LCisJICAgVW5jb21wcmVzc2luZyBLZXJuZWwgSW1hZ2UgLi4uIE9LCisJTGludXggdmVyc2lvbiAyLjIuMTMgKHdkQGRlbngubG9jYWwubmV0KSAoZ2NjIHZlcnNpb24gMi45NS4yIDE5OTkxMDI0IChyZWxlYXNlKSkgIzEgV2VkIEp1bCAxOSAwMjozNToxNyBNRVNUIDIwMDAKKwlCb290IGFyZ3VtZW50czogcm9vdD0vZGV2L25mcyBydyBuZnNyb290PTEwLjAuMC4yOi9MaW51eFBQQyBuZnNhZGRycz0xMC4wLjAuOTk6MTAuMC4wLjIKKwl0aW1lX2luaXQ6IGRlY3JlbWVudGVyIGZyZXF1ZW5jeSA9IDE4NzUwMDAwMC82MAorCUNhbGlicmF0aW5nIGRlbGF5IGxvb3AuLi4gNDkuNzcgQm9nb01JUFMKKwlNZW1vcnk6IDE1MjA4ayBhdmFpbGFibGUgKDcwMGsga2VybmVsIGNvZGUsIDQ0NGsgZGF0YSwgMzJrIGluaXQpIFtjMDAwMDAwMCxjMTAwMDAwMF0KKwkuLi4KKworSWYgeW91IHdhbnQgdG8gYm9vdCBhIExpbnV4IGtlcm5lbCB3aXRoIGluaXRpYWwgcmFtIGRpc2ssIHlvdSBwYXNzCit0aGUgbWVtb3J5IGFkZHJlc2VzIG9mIGJvdGggdGhlIGtlcm5lbCBhbmQgdGhlIGluaXRyZCBpbWFnZSAoUFBCQ09PVAorZm9ybWF0ISkgdG8gdGhlICJib290bSIgY29tbWFuZDoKKworCT0+IGltaSA0MDEwMDAwMCA0MDIwMDAwMAorCisJIyMgQ2hlY2tpbmcgSW1hZ2UgYXQgNDAxMDAwMDAgLi4uCisJICAgSW1hZ2UgTmFtZToJIDIuMi4xMyBmb3IgaW5pdHJkIG9uIFRRTTg1MEwKKwkgICBJbWFnZSBUeXBlOgkgUG93ZXJQQyBMaW51eCBLZXJuZWwgSW1hZ2UgKGd6aXAgY29tcHJlc3NlZCkKKwkgICBEYXRhIFNpemU6CSAzMzU3MjUgQnl0ZXMgPSAzMjcga0IgPSAwIE1CCisJICAgTG9hZCBBZGRyZXNzOiAwMDAwMDAwMAorCSAgIEVudHJ5IFBvaW50OgkgMDAwMDAwMGMKKwkgICBWZXJpZnlpbmcgQ2hlY2tzdW0gLi4uIE9LCisKKwkjIyBDaGVja2luZyBJbWFnZSBhdCA0MDIwMDAwMCAuLi4KKwkgICBJbWFnZSBOYW1lOgkgU2ltcGxlIFJhbWRpc2sgSW1hZ2UKKwkgICBJbWFnZSBUeXBlOgkgUG93ZXJQQyBMaW51eCBSQU1EaXNrIEltYWdlIChnemlwIGNvbXByZXNzZWQpCisJICAgRGF0YSBTaXplOgkgNTY2NTMwIEJ5dGVzID0gNTUzIGtCID0gMCBNQgorCSAgIExvYWQgQWRkcmVzczogMDAwMDAwMDAKKwkgICBFbnRyeSBQb2ludDoJIDAwMDAwMDAwCisJICAgVmVyaWZ5aW5nIENoZWNrc3VtIC4uLiBPSworCisJPT4gYm9vdG0gNDAxMDAwMDAgNDAyMDAwMDAKKwkjIyBCb290aW5nIExpbnV4IGtlcm5lbCBhdCA0MDEwMDAwMCAuLi4KKwkgICBJbWFnZSBOYW1lOgkgMi4yLjEzIGZvciBpbml0cmQgb24gVFFNODUwTAorCSAgIEltYWdlIFR5cGU6CSBQb3dlclBDIExpbnV4IEtlcm5lbCBJbWFnZSAoZ3ppcCBjb21wcmVzc2VkKQorCSAgIERhdGEgU2l6ZToJIDMzNTcyNSBCeXRlcyA9IDMyNyBrQiA9IDAgTUIKKwkgICBMb2FkIEFkZHJlc3M6IDAwMDAwMDAwCisJICAgRW50cnkgUG9pbnQ6CSAwMDAwMDAwYworCSAgIFZlcmlmeWluZyBDaGVja3N1bSAuLi4gT0sKKwkgICBVbmNvbXByZXNzaW5nIEtlcm5lbCBJbWFnZSAuLi4gT0sKKwkjIyBMb2FkaW5nIFJBTURpc2sgSW1hZ2UgYXQgNDAyMDAwMDAgLi4uCisJICAgSW1hZ2UgTmFtZToJIFNpbXBsZSBSYW1kaXNrIEltYWdlCisJICAgSW1hZ2UgVHlwZToJIFBvd2VyUEMgTGludXggUkFNRGlzayBJbWFnZSAoZ3ppcCBjb21wcmVzc2VkKQorCSAgIERhdGEgU2l6ZToJIDU2NjUzMCBCeXRlcyA9IDU1MyBrQiA9IDAgTUIKKwkgICBMb2FkIEFkZHJlc3M6IDAwMDAwMDAwCisJICAgRW50cnkgUG9pbnQ6CSAwMDAwMDAwMAorCSAgIFZlcmlmeWluZyBDaGVja3N1bSAuLi4gT0sKKwkgICBMb2FkaW5nIFJhbWRpc2sgLi4uIE9LCisJTGludXggdmVyc2lvbiAyLjIuMTMgKHdkQGRlbngubG9jYWwubmV0KSAoZ2NjIHZlcnNpb24gMi45NS4yIDE5OTkxMDI0IChyZWxlYXNlKSkgIzEgV2VkIEp1bCAxOSAwMjozMjowOCBNRVNUIDIwMDAKKwlCb290IGFyZ3VtZW50czogcm9vdD0vZGV2L3JhbQorCXRpbWVfaW5pdDogZGVjcmVtZW50ZXIgZnJlcXVlbmN5ID0gMTg3NTAwMDAwLzYwCisJQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcC4uLiA0OS43NyBCb2dvTUlQUworCS4uLgorCVJBTURJU0s6IENvbXByZXNzZWQgaW1hZ2UgZm91bmQgYXQgYmxvY2sgMAorCVZGUzogTW91bnRlZCByb290IChleHQyIGZpbGVzeXN0ZW0pLgorCisJYmFzaCMKKworCitTdGFuZGFsb25lIEhPV1RPOgorPT09PT09PT09PT09PT09PT0KKworT25lIG9mIHRoZSBmZWF0dXJlcyBvZiBVLUJvb3QgaXMgdGhhdCB5b3UgY2FuIGR5bmFtaWNhbGx5IGxvYWQgYW5kCitydW4gInN0YW5kYWxvbmUiIGFwcGxpY2F0aW9ucywgd2hpY2ggY2FuIHVzZSBzb21lIHJlc291cmNlcyBvZgorVS1Cb290IGxpa2UgY29uc29sZSBJL08gZnVuY3Rpb25zIG9yIGludGVycnVwdCBzZXJ2aWNlcy4KKworVHdvIHNpbXBsZSBleGFtcGxlcyBhcmUgaW5jbHVkZWQgd2l0aCB0aGUgc291cmNlczoKKworIkhlbGxvIFdvcmxkIiBEZW1vOgorLS0tLS0tLS0tLS0tLS0tLS0tLQorCisnZXhhbXBsZXMvaGVsbG9fd29ybGQuYycgY29udGFpbnMgYSBzbWFsbCAiSGVsbG8gV29ybGQiIERlbW8KK2FwcGxpY2F0aW9uOyBpdCBpcyBhdXRvbWF0aWNhbGx5IGNvbXBpbGVkIHdoZW4geW91IGJ1aWxkIFUtQm9vdC4KK0l0J3MgY29uZmlndXJlZCB0byBydW4gYXQgYWRkcmVzcyAweDAwMDQwMDA0LCBzbyB5b3UgY2FuIHBsYXkgd2l0aCBpdAorbGlrZSB0aGF0OgorCisJPT4gbG9hZHMKKwkjIyBSZWFkeSBmb3IgUy1SZWNvcmQgZG93bmxvYWQgLi4uCisJfj5leGFtcGxlcy9oZWxsb193b3JsZC5zcmVjCisJMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgLi4uCisJW2ZpbGUgdHJhbnNmZXIgY29tcGxldGVdCisJW2Nvbm5lY3RlZF0KKwkjIyBTdGFydCBBZGRyID0gMHgwMDA0MDAwNAorCisJPT4gZ28gNDAwMDQgSGVsbG8gV29ybGQhIFRoaXMgaXMgYSB0ZXN0LgorCSMjIFN0YXJ0aW5nIGFwcGxpY2F0aW9uIGF0IDB4MDAwNDAwMDQgLi4uCisJSGVsbG8gV29ybGQKKwlhcmdjID0gNworCWFyZ3ZbMF0gPSAiNDAwMDQiCisJYXJndlsxXSA9ICJIZWxsbyIKKwlhcmd2WzJdID0gIldvcmxkISIKKwlhcmd2WzNdID0gIlRoaXMiCisJYXJndls0XSA9ICJpcyIKKwlhcmd2WzVdID0gImEiCisJYXJndls2XSA9ICJ0ZXN0LiIKKwlhcmd2WzddID0gIjxOVUxMPiIKKwlIaXQgYW55IGtleSB0byBleGl0IC4uLgorCisJIyMgQXBwbGljYXRpb24gdGVybWluYXRlZCwgcmMgPSAweDAKKworQW5vdGhlciBleGFtcGxlLCB3aGljaCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlZ2lzdGVyIGEgQ1BNIGludGVycnVwdAoraGFuZGxlciB3aXRoIHRoZSBVLUJvb3QgY29kZSwgY2FuIGJlIGZvdW5kIGluICdleGFtcGxlcy90aW1lci5jJy4KK0hlcmUsIGEgQ1BNIHRpbWVyIGlzIHNldCB1cCB0byBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgZXZlcnkgc2Vjb25kLgorVGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaXMgdHJpdmlhbCwganVzdCBwcmludGluZyBhICcuJworY2hhcmFjdGVyLCBidXQgdGhpcyBpcyBqdXN0IGEgZGVtbyBwcm9ncmFtLiBUaGUgYXBwbGljYXRpb24gY2FuIGJlCitjb250cm9sbGVkIGJ5IHRoZSBmb2xsb3dpbmcga2V5czoKKworCT8gLSBwcmludCBjdXJyZW50IHZhbHVlcyBvZyB0aGUgQ1BNIFRpbWVyIHJlZ2lzdGVycworCWIgLSBlbmFibGUgaW50ZXJydXB0cyBhbmQgc3RhcnQgdGltZXIKKwllIC0gc3RvcCB0aW1lciBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzCisJcSAtIHF1aXQgYXBwbGljYXRpb24KKworCT0+IGxvYWRzCisJIyMgUmVhZHkgZm9yIFMtUmVjb3JkIGRvd25sb2FkIC4uLgorCX4+ZXhhbXBsZXMvdGltZXIuc3JlYworCTEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIC4uLgorCVtmaWxlIHRyYW5zZmVyIGNvbXBsZXRlXQorCVtjb25uZWN0ZWRdCisJIyMgU3RhcnQgQWRkciA9IDB4MDAwNDAwMDQKKworCT0+IGdvIDQwMDA0CisJIyMgU3RhcnRpbmcgYXBwbGljYXRpb24gYXQgMHgwMDA0MDAwNCAuLi4KKwlUSU1FUlM9MHhmZmYwMDk4MAorCVVzaW5nIHRpbWVyIDEKKwkgIHRnY3IgQCAweGZmZjAwOTgwLCB0bXIgQCAweGZmZjAwOTkwLCB0cnIgQCAweGZmZjAwOTk0LCB0Y3IgQCAweGZmZjAwOTk4LCB0Y24gQCAweGZmZjAwOTljLCB0ZXIgQCAweGZmZjAwOWIwCisKK0hpdCAnYic6CisJW3EsIGIsIGUsID9dIFNldCBpbnRlcnZhbCAxMDAwMDAwIHVzCisJRW5hYmxpbmcgdGltZXIKK0hpdCAnPyc6CisJW3EsIGIsIGUsID9dIC4uLi4uLi4uCisJdGdjcj0weDEsIHRtcj0weGZmMWMsIHRycj0weDNkMDksIHRjcj0weDAsIHRjbj0weGVmNiwgdGVyPTB4MAorSGl0ICc/JzoKKwlbcSwgYiwgZSwgP10gLgorCXRnY3I9MHgxLCB0bXI9MHhmZjFjLCB0cnI9MHgzZDA5LCB0Y3I9MHgwLCB0Y249MHgyYWQ0LCB0ZXI9MHgwCitIaXQgJz8nOgorCVtxLCBiLCBlLCA/XSAuCisJdGdjcj0weDEsIHRtcj0weGZmMWMsIHRycj0weDNkMDksIHRjcj0weDAsIHRjbj0weDFlZmMsIHRlcj0weDAKK0hpdCAnPyc6CisJW3EsIGIsIGUsID9dIC4KKwl0Z2NyPTB4MSwgdG1yPTB4ZmYxYywgdHJyPTB4M2QwOSwgdGNyPTB4MCwgdGNuPTB4MTY5ZCwgdGVyPTB4MAorSGl0ICdlJzoKKwlbcSwgYiwgZSwgP10gLi4uU3RvcHBpbmcgdGltZXIKK0hpdCAncSc6CisJW3EsIGIsIGUsID9dICMjIEFwcGxpY2F0aW9uIHRlcm1pbmF0ZWQsIHJjID0gMHgwCisKKworTmV0QlNEIE5vdGVzOgorPT09PT09PT09PT09PQorCitTdGFydGluZyBhdCB2ZXJzaW9uIDAuOS4yLCBVLUJvb3Qgc3VwcG9ydHMgTmV0QlNEIGJvdGggYXMgaG9zdAorKGJ1aWxkIFUtQm9vdCkgYW5kIHRhcmdldCBzeXN0ZW0gKGJvb3RzIE5ldEJTRC9tcGM4eHgpLgorCitCdWlsZGluZyByZXF1aXJlcyBhIGNyb3NzIGVudmlyb25tZW50OyBpdCBpcyBrbm93biB0byB3b3JrIG9uCitOZXRCU0QvaTM4NiB3aXRoIHRoZSBjcm9zcy1wb3dlcnBjLW5ldGJzZC0xLjMgcGFja2FnZSAoeW91IHdpbGwgYWxzbworbmVlZCBnbWFrZSBzaW5jZSB0aGUgTWFrZWZpbGVzIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIEJTRCBtYWtlKS4KK05vdGUgdGhhdCB0aGUgY3Jvc3MtcG93ZXJwYyBwYWNrYWdlIGRvZXMgbm90IGluc3RhbGwgaW5jbHVkZSBmaWxlczsKK2F0dGVtcHRpbmcgdG8gYnVpbGQgVS1Cb290IHdpbGwgZmFpbCBiZWNhdXNlIDxtYWNoaW5lL2Fuc2kuaD4gaXMKK21pc3NpbmcuICBUaGlzIGZpbGUgaGFzIHRvIGJlIGluc3RhbGxlZCBhbmQgcGF0Y2hlZCBtYW51YWxseToKKworCSMgY2QgL3Vzci9wa2cvY3Jvc3MvcG93ZXJwYy1uZXRic2QvaW5jbHVkZQorCSMgbWtkaXIgcG93ZXJwYworCSMgbG4gLXMgcG93ZXJwYyBtYWNoaW5lCisJIyBjcCAvdXNyL3NyYy9zeXMvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYW5zaS5oIHBvd2VycGMvYW5zaS5oCisJIyAke0VESVR9IHBvd2VycGMvYW5zaS5oCSMjIG11c3QgcmVtb3ZlIF9fdmFfbGlzdCwgX0JTRF9WQV9MSVNUCisKK05hdGl2ZSBidWlsZHMgKmRvbid0KiB3b3JrIGR1ZSB0byBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIG5hdGl2ZQorYW5kIFUtQm9vdCBpbmNsdWRlIGZpbGVzLgorCitCb290aW5nIGFzc3VtZXMgdGhhdCAodGhlIGZpcnN0IHBhcnQgb2YpIHRoZSBpbWFnZSBib290ZWQgaXMgYQorc3RhZ2UtMiBsb2FkZXIgd2hpY2ggaW4gdHVybiBsb2FkcyBhbmQgdGhlbiBpbnZva2VzIHRoZSBrZXJuZWwKK3Byb3Blci4gTG9hZGVyIHNvdXJjZXMgd2lsbCBldmVudHVhbGx5IGFwcGVhciBpbiB0aGUgTmV0QlNEIHNvdXJjZQordHJlZSAocHJvYmFibHkgaW4gc3lzL2FyYy9tcGM4eHgvc3RhbmQvdS1ib290X3N0YWdlMi8pOyBpbiB0aGUKK21lYW50aW1lLCBzZW5kIG1haWwgdG8gYnJ1bm9AZXhldC1hZy5kZSBhbmQvb3Igd2RAZGVueC5kZSBmb3IKK2RldGFpbHMuCisKKworSW1wbGVtZW50YXRpb24gSW50ZXJuYWxzOgorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZm9sbG93aW5nIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGV2ZXJ5CitpbXBsZW1lbnRhdGlvbiBkZXRhaWwuIEhvd2V2ZXIsIGl0IHNob3VsZCBoZWxwIHRvIHVuZGVyc3RhbmQgdGhlCitpbm5lciB3b3JraW5ncyBvZiBVLUJvb3QgYW5kIG1ha2UgaXQgZWFzaWVyIHRvIHBvcnQgaXQgdG8gY3VzdG9tCitoYXJkd2FyZS4KKworCitJbml0aWFsIFN0YWNrLCBHbG9iYWwgRGF0YToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgaW1wbGVtZW50YXRpb24gb2YgVS1Cb290IGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgVS1Cb290CitzdGFydHMgcnVubmluZyBvdXQgb2YgUk9NIChmbGFzaCBtZW1vcnkpLCB1c3VhbGx5IHdpdGhvdXQgYWNjZXNzIHRvCitzeXN0ZW0gUkFNIChiZWNhdXNlIHRoZSBtZW1vcnkgY29udHJvbGxlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0KS4KK1RoaXMgbWVhbnMgdGhhdCB3ZSBkb24ndCBoYXZlIHdyaXRhYmxlIERhdGEgb3IgQlNTIHNlZ21lbnRzLCBhbmQgQlNTCitpcyBub3QgaW5pdGlhbGl6ZWQgYXMgemVyby4gVG8gYmUgYWJsZSB0byBnZXQgYSBDIGVudmlyb25tZW50IHdvcmtpbmcKK2F0IGFsbCwgd2UgaGF2ZSB0byBhbGxvY2F0ZSBhdCBsZWFzdCBhIG1pbmltYWwgc3RhY2suIEltcGxlbWVudGF0aW9uCitvcHRpb25zIGZvciB0aGlzIGFyZSBkZWZpbmVkIGFuZCByZXN0cmljdGVkIGJ5IHRoZSBDUFUgdXNlZDogU29tZSBDUFUKK21vZGVscyBwcm92aWRlIG9uLWNoaXAgbWVtb3J5IChsaWtlIHRoZSBJTU1SIGFyZWEgb24gTVBDOHh4IGFuZAorTVBDODI2eCBwcm9jZXNzb3JzKSwgb24gb3RoZXJzIChwYXJ0cyBvZikgdGhlIGRhdGEgY2FjaGUgY2FuIGJlCitsb2NrZWQgYXMgKG1pcy0pIHVzZWQgYXMgbWVtb3J5LCBldGMuCisKK0l0IGlzIGVzc2VudGlhbCB0byByZW1lbWJlciB0aGlzLCBzaW5jZSBpdCBoYXMgc29tZSBpbXBhY3Qgb24gdGhlIEMKK2NvZGUgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZWR1cmVzOgorCisqIEluaXRpYWxpemVkIGdsb2JhbCBkYXRhIChkYXRhIHNlZ21lbnQpIGlzIHJlYWQtb25seS4gRG8gbm90IGF0dGVtcHQKKyAgdG8gd3JpdGUgaXQuCisKKyogRG8gbm90IHVzZSBhbnkgdW5pdGlhbGl6ZWQgZ2xvYmFsIGRhdGEgKG9yIGltcGxpY2l0ZWx5IGluaXRpYWxpemVkCisgIGFzIHplcm8gZGF0YSAtIEJTUyBzZWdtZW50KSBhdCBhbGwgLSB0aGlzIGlzIHVuZGVmaW5lZCwgaW5pdGlhbGktCisgIHphdGlvbiBpcyBwZXJmb3JtZWQgbGF0ZXIgKHdoZW4gcmVsb2NhdGlvbmcgdG8gUkFNKS4KKworKiBTdGFjayBzcGFjZSBpcyB2ZXJ5IGxpbWl0ZWQuIEF2b2lkIGJpZyBkYXRhIGJ1ZmZlcnMgb3IgdGhpbmdzICBsaWtlCisgIHRoYXQuCisKK0hhdmluZyBvbmx5IHRoZSBzdGFjayBhcyB3cml0YWJsZSBtZW1vcnkgbGltaXRzIG1lYW5zIHdlIGNhbm5vdCB1c2UKK25vcm1hbCBnbG9iYWwgZGF0YSB0byBzaGFyZSBpbmZvcm1hdGlvbiBiZXdlZW4gdGhlIGNvZGUuIEJ1dCBpdAordHVybmVkIG91dCB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBVLUJvb3QgY2FuIGJlIGdyZWF0bHkKK3NpbXBsaWZpZWQgYnkgbWFraW5nIGEgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIChnZF90KSBhdmFpbGFibGUgdG8gYWxsCitmdW5jdGlvbnMuIFdlIGNvdWxkIHBhc3MgYSBwb2ludGVyIHRvIHRoaXMgZGF0YSBhcyBhcmd1bWVudCB0byBfYWxsXworZnVuY3Rpb25zLCBidXQgdGhpcyB3b3VsZCBibG9hdCB0aGUgY29kZS4gSW5zdGVhZCB3ZSB1c2UgYSBmZWF0dXJlIG9mCit0aGUgR0NDIGNvbXBpbGVyIChHbG9iYWwgUmVnaXN0ZXIgVmFyaWFibGVzKSB0byBzaGFyZSB0aGUgZGF0YTogd2UKK3BsYWNlIGEgcG9pbnRlciAoZ2QpIHRvIHRoZSBnbG9iYWwgZGF0YSBpbnRvIGEgcmVnaXN0ZXIgd2hpY2ggd2UKK3Jlc2VydmUgZm9yIHRoaXMgcHVycG9zZS4KKworV2hlbiBjaG9zaW5nIGEgcmVnaXN0ZXIgZm9yIHN1Y2ggYSBwdXJwb3NlIHdlIGFyZSByZXN0cmljdGVkICBieSAgdGhlCityZWxldmFudCAgKEUpQUJJICBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlLCBhbmQgYnkKK0dDQydzIGltcGxlbWVudGF0aW9uLgorCitGb3IgUG93ZXJQQywgdGhlIGZvbGxvd2luZyByZWdpc3RlcnMgaGF2ZSBzcGVjaWZpYyB1c2U6CisJUjE6CXN0YWNrIHBvaW50ZXIKKwlSMjoJVE9DIHBvaW50ZXIKKwlSMy1SNDoJcGFyYW1ldGVyIHBhc3NpbmcgYW5kIHJldHVybiB2YWx1ZXMKKwlSNS1SMTA6CXBhcmFtZXRlciBwYXNzaW5nCisJUjEzOglzbWFsbCBkYXRhIGFyZWEgcG9pbnRlcgorCVIzMDoJR09UIHBvaW50ZXIKKwlSMzE6CWZyYW1lIHBvaW50ZXIKKworCShVLUJvb3QgYWxzbyB1c2VzIFIxNCBhcyBpbnRlcm5hbCBHT1QgcG9pbnRlci4pCisKKyAgICA9PT4gVS1Cb290IHdpbGwgdXNlIFIyOSB0byBob2xkIGEgcG9pbnRlciB0byB0aGUgZ2xvYmFsIGRhdGEKKworICAgIE5vdGU6IG9uIFBQQywgd2UgY291bGQgdXNlIGEgc3RhdGljIGluaXRpYWxpemVyIChzaW5jZSB0aGUKKyAgICBhZGRyZXNzIG9mIHRoZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgaXMga25vd24gYXQgY29tcGlsZSB0aW1lKSwKKyAgICBidXQgaXQgdHVybmVkIG91dCB0aGF0IHJlc2VydmluZyBhIHJlZ2lzdGVyIHJlc3VsdHMgaW4gc29tZXdoYXQKKyAgICBzbWFsbGVyIGNvZGUgLSBhbHRob3VnaCB0aGUgY29kZSBzYXZpbmdzIGFyZSBub3QgdGhhdCBiaWcgKG9uCisgICAgYXZlcmFnZSBmb3IgYWxsIGJvYXJkcyA3NTIgYnl0ZXMgZm9yIHRoZSB3aG9sZSBVLUJvb3QgaW1hZ2UsCisgICAgNjI0IHRleHQgKyAxMjcgZGF0YSkuCisKK09uIEFSTSwgdGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIHVzZWQ6CisKKwlSMDoJZnVuY3Rpb24gYXJndW1lbnQgd29yZC9pbnRlZ2VyIHJlc3VsdAorCVIxLVIzOglmdW5jdGlvbiBhcmd1bWVudCB3b3JkCisJUjk6CUdPVCBwb2ludGVyCisJUjEwOglzdGFjayBsaW1pdCAodXNlZCBvbmx5IGlmIHN0YWNrIGNoZWNraW5nIGlmIGVuYWJsZWQpCisJUjExOglhcmd1bWVudCAoZnJhbWUpIHBvaW50ZXIKKwlSMTI6CXRlbXBvcmFyeSB3b3Jrc3BhY2UKKwlSMTM6CXN0YWNrIHBvaW50ZXIKKwlSMTQ6CWxpbmsgcmVnaXN0ZXIKKwlSMTU6CXByb2dyYW0gY291bnRlcgorCisgICAgPT0+IFUtQm9vdCB3aWxsIHVzZSBSOCB0byBob2xkIGEgcG9pbnRlciB0byB0aGUgZ2xvYmFsIGRhdGEKKworCisKK01lbW9yeSBNYW5hZ2VtZW50OgorLS0tLS0tLS0tLS0tLS0tLS0tCisKK1UtQm9vdCBydW5zIGluIHN5c3RlbSBzdGF0ZSBhbmQgdXNlcyBwaHlzaWNhbCBhZGRyZXNzZXMsIGkuZS4gdGhlCitNTVUgaXMgbm90IHVzZWQgZWl0aGVyIGZvciBhZGRyZXNzIG1hcHBpbmcgbm9yIGZvciBtZW1vcnkgcHJvdGVjdGlvbi4KKworVGhlIGF2YWlsYWJsZSBtZW1vcnkgaXMgbWFwcGVkIHRvIGZpeGVkIGFkZHJlc3NlcyB1c2luZyB0aGUgbWVtb3J5Citjb250cm9sbGVyLiBJbiB0aGlzIHByb2Nlc3MsIGEgY29udGlndW91cyBibG9jayBpcyBmb3JtZWQgZm9yIGVhY2gKK21lbW9yeSB0eXBlIChGbGFzaCwgU0RSQU0sIFNSQU0pLCBldmVuIHdoZW4gaXQgY29uc2lzdHMgb2Ygc2V2ZXJhbAorcGh5c2ljYWwgbWVtb3J5IGJhbmtzLgorCitVLUJvb3QgaXMgaW5zdGFsbGVkIGluIHRoZSBmaXJzdCAxMjgga0Igb2YgdGhlIGZpcnN0IEZsYXNoIGJhbmsgKG9uCitUUU04eHhMIG1vZHVsZXMgdGhpcyBpcyB0aGUgcmFuZ2UgMHg0MDAwMDAwMCAuLi4gMHg0MDAxRkZGRikuIEFmdGVyCitib290aW5nIGFuZCBzaXppbmcgYW5kIGluaXRpYWxpemluZyBEUkFNLCB0aGUgY29kZSByZWxvY2F0ZXMgaXRzZWxmCit0byB0aGUgdXBwZXIgZW5kIG9mIERSQU0uIEltbWVkaWF0ZWx5IGJlbG93IHRoZSBVLUJvb3QgY29kZSBzb21lCittZW1vcnkgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieSBtYWxsb2MoKSBbc2VlIENGR19NQUxMT0NfTEVOCitjb25maWd1cmF0aW9uIHNldHRpbmddLiBCZWxvdyB0aGF0LCBhIHN0cnVjdHVyZSB3aXRoIGdsb2JhbCBCb2FyZAorSW5mbyBkYXRhIGlzIHBsYWNlZCwgZm9sbG93ZWQgYnkgdGhlIHN0YWNrIChncm93aW5nIGRvd253YXJkKS4KKworQWRkaXRpb25hbGx5LCBzb21lIGV4Y2VwdGlvbiBoYW5kbGVyIGNvZGUgaXMgY29waWVkIHRvIHRoZSBsb3cgOCBrQgorb2YgRFJBTSAoMHgwMDAwMDAwMCAuLi4gMHgwMDAwMUZGRikuCisKK1NvIGEgdHlwaWNhbCBtZW1vcnkgY29uZmlndXJhdGlvbiB3aXRoIDE2IE1CIG9mIERSQU0gY291bGQgbG9vayBsaWtlCit0aGlzOgorCisJMHgwMDAwIDAwMDAJRXhjZXB0aW9uIFZlY3RvciBjb2RlCisJICAgICAgOgorCTB4MDAwMCAxRkZGCisJMHgwMDAwIDIwMDAJRnJlZSBmb3IgQXBwbGljYXRpb24gVXNlCisJICAgICAgOgorCSAgICAgIDoKKworCSAgICAgIDoKKwkgICAgICA6CisJMHgwMEZCIEZGMjAJTW9uaXRvciBTdGFjayAoR3Jvd2luZyBkb3dud2FyZCkKKwkweDAwRkIgRkZBQwlCb2FyZCBJbmZvIERhdGEgYW5kIHBlcm1hbmVudCBjb3B5IG9mIGdsb2JhbCBkYXRhCisJMHgwMEZDIDAwMDAJTWFsbG9jIEFyZW5hCisJICAgICAgOgorCTB4MDBGRCBGRkZGCisJMHgwMEZFIDAwMDAJUkFNIENvcHkgb2YgTW9uaXRvciBDb2RlCisJLi4uCQlldmVudHVhbGx5OiBMQ0Qgb3IgdmlkZW8gZnJhbWVidWZmZXIKKwkuLi4JCWV2ZW50dWFsbHk6IHBSQU0gKFByb3RlY3RlZCBSQU0gLSB1bmNoYW5nZWQgYnkgcmVzZXQpCisJMHgwMEZGIEZGRkYJW0VuZCBvZiBSQU1dCisKKworU3lzdGVtIEluaXRpYWxpemF0aW9uOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiB0aGUgcmVzZXQgY29uZmlndXJhdGlvbiwgVS1Cb290IHN0YXJ0cyBhdCB0aGUgcmVzZXQgZW50cnkgcG9pbnQKKyhvbiBtb3N0IFBvd2VyUEMgc3lzdGVucyBhdCBhZGRyZXNzIDB4MDAwMDAxMDApLiBCZWNhdXNlIG9mIHRoZSByZXNldAorY29uZmlndXJhdGlvbiBmb3IgQ1MwIyB0aGlzIGlzIGEgbWlycm9yIG9mIHRoZSBvbmJvYXJkIEZsYXNoIG1lbW9yeS4KK1RvIGJlIGFibGUgdG8gcmUtbWFwIG1lbW9yeSBVLUJvb3QgdGhlbiBqdW1wcyB0byBpdCdzIGxpbmsgYWRkcmVzcy4KK1RvIGJlIGFibGUgdG8gaW1wbGVtZW50IHRoZSBpbml0aWFsaXphdGlvbiBjb2RlIGluIEMsIGEgKHNtYWxsISkKK2luaXRpYWwgc3RhY2sgaXMgc2V0IHVwIGluIHRoZSBpbnRlcm5hbCBEdWFsIFBvcnRlZCBSQU0gKGluIGNhc2UgQ1BVcword2hpY2ggcHJvdmlkZSBzdWNoIGEgZmVhdHVyZSBsaWtlIE1QQzh4eCBvciBNUEM4MjYwKSwgb3IgaW4gYSBsb2NrZWQKK3BhcnQgb2YgdGhlIGRhdGEgY2FjaGUuIEFmdGVyIHRoYXQsIFUtQm9vdCBpbml0aWFsaXplcyB0aGUgQ1BVIGNvcmUsCit0aGUgY2FjaGVzIGFuZCB0aGUgU0lVLgorCitOZXh0LCBhbGwgKHBvdGVudGlhbGx5KSBhdmFpbGFibGUgbWVtb3J5IGJhbmtzIGFyZSBtYXBwZWQgdXNpbmcgYQorcHJlbGltaW5hcnkgbWFwcGluZy4gRm9yIGV4YW1wbGUsIHdlIHB1dCB0aGVtIG9uIDUxMiBNQiBib3VuZGFyaWVzCisobXVsdGlwbGVzIG9mIDB4MjAwMDAwMDA6IFNEUkFNIG9uIDB4MDAwMDAwMDAgYW5kIDB4MjAwMDAwMDAsIEZsYXNoCitvbiAweDQwMDAwMDAwIGFuZCAweDYwMDAwMDAwLCBTUkFNIG9uIDB4ODAwMDAwMDApLiBUaGVuIFVQTSBBIGlzCitwcm9ncmFtbWVkIGZvciBTRFJBTSBhY2Nlc3MuIFVzaW5nIHRoZSB0ZW1wb3JhcnkgY29uZmlndXJhdGlvbiwgYQorc2ltcGxlIG1lbW9yeSB0ZXN0IGlzIHJ1biB0aGF0IGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIFNEUkFNCitiYW5rcy4KKworV2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIFNEUkFNIGJhbmssIGFuZCB0aGUgYmFua3MgYXJlIG9mCitkaWZmZXJlbnQgc2l6ZSwgdGhlIGxhcmdlciBpcyBtYXBwZWQgZmlyc3QuIEZvciBlcXVhbCBzaXplLCB0aGUgZmlyc3QKK2JhbmsgKENTMiMpIGlzIG1hcHBlZCBmaXJzdC4gVGhlIGZpcnN0IG1hcHBpbmcgaXMgYWx3YXlzIGZvciBhZGRyZXNzCisweDAwMDAwMDAwLCB3aXRoIGFueSBhZGRpdGlvbmFsIGJhbmtzIGZvbGxvd2luZyBpbW1lZGlhdGVseSB0byBjcmVhdGUKK2NvbnRpZ3VvdXMgbWVtb3J5IHN0YXJ0aW5nIGZyb20gMC4KKworVGhlbiwgdGhlIG1vbml0b3IgaW5zdGFsbHMgaXRzZWxmIGF0IHRoZSB1cHBlciBlbmQgb2YgdGhlIFNEUkFNIGFyZWEKK2FuZCBhbGxvY2F0ZXMgbWVtb3J5IGZvciB1c2UgYnkgbWFsbG9jKCkgYW5kIGZvciB0aGUgZ2xvYmFsIEJvYXJkCitJbmZvIGRhdGE7IGFsc28sIHRoZSBleGNlcHRpb24gdmVjdG9yIGNvZGUgaXMgY29waWVkIHRvIHRoZSBsb3cgUkFNCitwYWdlcywgYW5kIHRoZSBmaW5hbCBzdGFjayBpcyBzZXQgdXAuCisKK09ubHkgYWZ0ZXIgdGhpcyByZWxvY2F0aW9uIHdpbGwgeW91IGhhdmUgYSAibm9ybWFsIiBDIGVudmlyb25tZW50OwordW50aWwgdGhhdCB5b3UgYXJlIHJlc3RyaWN0ZWQgaW4gc2V2ZXJhbCB3YXlzLCBtb3N0bHkgYmVjYXVzZSB5b3UgYXJlCitydW5uaW5nIGZyb20gUk9NLCBhbmQgYmVjYXVzZSB0aGUgY29kZSB3aWxsIGhhdmUgdG8gYmUgcmVsb2NhdGVkIHRvIGEKK25ldyBhZGRyZXNzIGluIFJBTS4KKworCitVLUJvb3QgUG9ydGluZyBHdWlkZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworW0Jhc2VkIG9uIG1lc3NhZ2VzIGJ5IEplcnJ5IFZhbiBCYXJlbiBpbiB0aGUgVS1Cb290LVVzZXJzIG1haWxpbmcKK2xpc3QsIE9jdG92ZXIgMjAwMl0KKworCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzaWdoYW5kbGVyX3Qgbm9fbW9yZV90aW1lOworCisJc2lnbmFsIChTSUdBTFJNLCBub19tb3JlX3RpbWUpOworCWFsYXJtIChQUk9KRUNUX0RFQURMSU5FIC0gdG9TZWMgKDMgKiBXRUVLKSk7CisKKwlpZiAoYXZhaWxhYmxlX21vbmV5ID4gYXZhaWxhYmxlX21hbnBvd2VyKSB7CisJCXBheSBjb25zdWx0YW50IHRvIHBvcnQgVS1Cb290OworCQlyZXR1cm4gMDsKKwl9CisKKwlEb3dubG9hZCBsYXRlc3QgVS1Cb290IHNvdXJjZTsKKworCWlmIChjbHVlbGVzcykgeworCQllbWFpbCAoIkhpLCBJIGFtIG5ldyB0byBVLUJvb3QsIGhvdyBkbyBJIGdldCBzdGFydGVkPyIpOworCX0KKworCXdoaWxlIChsZWFybmluZykgeworCQlSZWFkIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeTsKKwkJUmVhZCBodHRwOi8vd3d3LmRlbnguZGUvcmUvRFBMRy5odG1sCisJCVJlYWQgdGhlIHNvdXJjZSwgTHVrZTsKKwl9CisKKwlpZiAoYXZhaWxhYmxlX21vbmV5ID4gdG9Mb2NhbEN1cnJlbmN5ICgkMjUwMCkpIHsKKwkJQnV5IGEgQkRJMjAwMDsKKwl9IGVsc2UgeworCQlBZGQgYSBsb3Qgb2YgYWdncmF2YXRpb24gYW5kIHRpbWU7CisJfQorCisJQ3JlYXRlIHlvdXIgb3duIGJvYXJkIHN1cHBvcnQgc3ViZGlyZWN0b3J5OworCisJd2hpbGUgKCFydW5uaW5nKSB7CisJCWRvIHsKKwkJCUFkZCAvIG1vZGlmeSBzb3VyY2UgY29kZTsKKwkJfSB1bnRpbCAoY29tcGlsZXMpOworCQlEZWJ1ZzsKKwkJaWYgKGNsdWVsZXNzKQorCQkJZW1haWwgKCJIaSwgSSBhbSBoYXZpbmcgcHJvYmxlbXMuLi4iKTsKKwl9CisJU2VuZCBwYXRjaCBmaWxlIHRvIFdvbGZnYW5nOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbm9fbW9yZV90aW1lIChpbnQgc2lnKQoreworICAgICAgaGlyZV9hX2d1cnUoKTsKK30KKworCisKK0NvZGluZyBTdGFuZGFyZHM6CistLS0tLS0tLS0tLS0tLS0tLQorCitBbGwgY29udHJpYnV0aW9ucyB0byBVLUJvb3Qgc2hvdWxkIGNvbmZvcm0gdG8gdGhlIExpbnV4IGtlcm5lbAorY29kaW5nIHN0eWxlOyBzZWUgdGhlIGZpbGUgIkRvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUiIGluIHlvdXIgTGludXgKK2tlcm5lbCBzb3VyY2UgZGlyZWN0b3J5LgorCitQbGVhc2Ugbm90ZSB0aGF0IFUtQm9vdCBpcyBpbXBsZW1lbnRlZCBpbiBDIChhbmQgdG8gc29tZSBzbWFsbCBwYXJ0cworaW4gQXNzZW1ibGVyKTsgbm8gQysrIGlzIHVzZWQsIHNvIHBsZWFzZSBkbyBub3QgdXNlIEMrKyBzdHlsZQorY29tbWVudHMgKC8vKSBpbiB5b3VyIGNvZGUuCisKK1N1Ym1pc3Npb25zIHdoaWNoIGRvIG5vdCBjb25mb3JtIHRvIHRoZSBzdGFuZGFyZHMgbWF5IGJlIHJldHVybmVkCit3aXRoIGEgcmVxdWVzdCB0byByZWZvcm1hdCB0aGUgY2hhbmdlcy4KKworCitTdWJtaXR0aW5nIFBhdGNoZXM6CistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NpbmNlIHRoZSBudW1iZXIgb2YgcGF0Y2hlcyBmb3IgVS1Cb290IGlzIGdyb3dpbmcsIHdlIG5lZWQgdG8KK2VzdGFibGlzaCBzb21lIHJ1bGVzLiBTdWJtaXNzaW9ucyB3aGljaCBkbyBub3QgY29uZm9ybSB0byB0aGVzZSBydWxlcworbWF5IGJlIHJlamVjdGVkLCBldmVuIHdoZW4gdGhleSBjb250YWluIGltcG9ydGFudCBhbmQgdmFsdWFibGUgc3R1ZmYuCisKKworV2hlbiB5b3Ugc2VuZCBhIHBhdGNoLCBwbGVhc2UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHdpdGgKK2l0OgorCisqIEZvciBidWcgZml4ZXM6IGEgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyBhbmQgaG93IHlvdXIgcGF0Y2ggZml4ZXMKKyAgdGhpcyBidWcuIFBsZWFzZSB0cnkgdG8gaW5jbHVkZSBhIHdheSBvZiBkZW1vbnN0cmF0aW5nIHRoYXQgdGhlCisgIHBhdGNoIGFjdHVhbGx5IGZpeGVzIHNvbWV0aGluZy4KKworKiBGb3IgbmV3IGZlYXR1cmVzOiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlIGFuZCB5b3VyCisgIGltcGxlbWVudGF0aW9uLgorCisqIEEgQ0hBTkdFTE9HIGVudHJ5IGFzIHBsYWludGV4dCAoc2VwYXJhdGUgZnJvbSB0aGUgcGF0Y2gpCisKKyogRm9yIG1ham9yIGNvbnRyaWJ1dGlvbnMsIHlvdXIgZW50cnkgdG8gdGhlIENSRURJVFMgZmlsZQorCisqIFdoZW4geW91IGFkZCBzdXBwb3J0IGZvciBhIG5ldyBib2FyZCwgZG9uJ3QgZm9yZ2V0IHRvIGFkZCB0aGlzCisgIGJvYXJkIHRvIHRoZSBNQUtFQUxMIHNjcmlwdCwgdG9vLgorCisqIElmIHlvdXIgcGF0Y2ggYWRkcyBuZXcgY29uZmlndXJhdGlvbiBvcHRpb25zLCBkb24ndCBmb3JnZXQgdG8KKyAgZG9jdW1lbnQgdGhlc2UgaW4gdGhlIFJFQURNRSBmaWxlLgorCisqIFRoZSBwYXRjaCBpdHNlbGYuIElmIHlvdSBhcmUgYWNjZXNzaW5nIHRoZSBDVlMgcmVwb3NpdG9yeSB1c2UgImN2cworICB1cGRhdGU7IGN2cyBkaWZmIC1wdVJOIjsgZWxzZSwgdXNlICJkaWZmIC1wdXJOIE9MRCBORVciLiBJZiB5b3VyCisgIHZlcnNpb24gb2YgZGlmZiBkb2VzIG5vdCBzdXBwb3J0IHRoZXNlIG9wdGlvbnMsIHRoZW4gZ2V0IHRoZSBsYXRlc3QKKyAgdmVyc2lvbiBvZiBHTlUgZGlmZi4KKworICBXZSBhY2NlcHQgcGF0Y2hlcyBhcyBwbGFpbiB0ZXh0LCBNSU1FIGF0dGFjaG1lbnRzIG9yIGFzIHV1ZW5jb2RlZAorICBnemlwcGVkIHRleHQuCisKK05vdGVzOgorCisqIEJlZm9yZSBzZW5kaW5nIHRoZSBwYXRjaCwgcnVuIHRoZSBNQUtFQUxMIHNjcmlwdCBvbiB5b3VyIHBhdGNoZWQKKyAgc291cmNlIHRyZWUgYW5kIG1ha2Ugc3VyZSB0aGF0IG5vIGVycm9ycyBvciB3YXJuaW5ncyBhcmUgcmVwb3J0ZWQKKyAgZm9yIGFueSBvZiB0aGUgYm9hcmRzLgorCisqIEtlZXAgeW91ciBtb2RpZmljYXRpb25zIHRvIHRoZSBuZWNlc3NhcnkgbWluaW11bTogQSBwYXRjaAorICBjb250YWluaW5nIHNldmVyYWwgdW5yZWxhdGVkIGNoYW5nZXMgb3IgYXJiaXRyYXJ5IHJlZm9ybWF0cyB3aWxsIGJlCisgIHJldHVybmVkIHdpdGggYSByZXF1ZXN0IHRvIHJlLWZvcm1hdHRpbmcgLyBzcGxpdCBpdC4KKworKiBJZiB5b3UgbW9kaWZ5IGV4aXN0aW5nIGNvZGUsIG1ha2Ugc3VyZSB0aGF0IHlvdXIgbmV3IGNvZGUgZG9lcyBub3QKKyAgYWRkIHRvIHRoZSBtZW1vcnkgZm9vdHByaW50IG9mIHRoZSBjb2RlIDstKSBTbWFsbCBpcyBiZWF1dGlmdWwhCisgIFdoZW4gYWRkaW5nIG5ldyBmZWF0dXJlcywgdGhlc2Ugc2hvdWxkIGNvbXBpbGUgY29uZGl0aW9uYWxseSBvbmx5CisgICh1c2luZyAjaWZkZWYpLCBhbmQgdGhlIHJlc3VsdGluZyBjb2RlIHdpdGggdGhlIG5ldyBmZWF0dXJlCisgIGRpc2FibGVkIG11c3Qgbm90IG5lZWQgbW9yZSBtZW1vcnkgdGhhbiB0aGUgb2xkIGNvZGUgd2l0aG91dCB5b3VyCisgIG1vZGlmaWNhdGlvbi4KZGlmZiAtLWdpdCBhL2JvYXJkL2NvZ2VudC9zZXJpYWwuYyBiL2JvYXJkL2NvZ2VudC9zZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzIwMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvY29nZW50L3NlcmlhbC5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogU2ltcGxlIHNlcmlhbCBkcml2ZXIgZm9yIENvZ2VudCBtb3RoZXJib2FyZCBzZXJpYWwgcG9ydHMKKyAqIGZvciB1c2UgZHVyaW5nIGJvb3QKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Ym9hcmQvY29nZW50L3NlcmlhbC5oPgorCisjaWYgKENNQV9NQl9DQVBTICYgQ01BX01CX0NBUF9TRVJQQVIpCisKKyNpZiAoZGVmaW5lZChDT05GSUdfOHh4KSAmJiBkZWZpbmVkKENPTkZJR184eHhfQ09OU19OT05FKSkgfHwgXAorICAgICAoZGVmaW5lZChDT05GSUdfODI2MCkgJiYgZGVmaW5lZChDT05GSUdfQ09OU19OT05FKSkKKworI2lmIENPTkZJR19DT05TX0lOREVYID09IDEKKyNkZWZpbmUgQ01BX01CX1NFUklBTF9CQVNFCUNNQV9NQl9TRVJJQUxBX0JBU0UKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDIKKyNkZWZpbmUgQ01BX01CX1NFUklBTF9CQVNFCUNNQV9NQl9TRVJJQUxCX0JBU0UKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDMgJiYgKENNQV9NQl9DQVBTICYgQ01BX01CX0NBUF9TRVIyKQorI2RlZmluZSBDTUFfTUJfU0VSSUFMX0JBU0UJQ01BX01CX1NFUjJBX0JBU0UKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDQgJiYgKENNQV9NQl9DQVBTICYgQ01BX01CX0NBUF9TRVIyKQorI2RlZmluZSBDTUFfTUJfU0VSSUFMX0JBU0UJQ01BX01CX1NFUjJCX0JBU0UKKyNlbHNlCisjZXJyb3IgQ09ORklHX0NPTlNfSU5ERVggbXVzdCBiZSBjb25maWd1cmVkIGZvciBDb2dlbnQgbW90aGVyYm9hcmQgc2VyaWFsCisjZW5kaWYKKworaW50IHNlcmlhbF9pbml0ICh2b2lkKQoreworLyogIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOyAqLworCisgICAgY21hX21iX3NlcmlhbCAqbWJzcCA9IChjbWFfbWJfc2VyaWFsICopQ01BX01CX1NFUklBTF9CQVNFOworCisgICAgY21hX21iX3JlZ193cml0ZSgmbWJzcC0+c2VyX2llciwgMHgwMCk7CS8qIHR1cm4gb2ZmIGludGVycnVwdHMgKi8KKyAgICBzZXJpYWxfc2V0YnJnICgpOworICAgIGNtYV9tYl9yZWdfd3JpdGUoJm1ic3AtPnNlcl9sY3IsIDB4MDMpOwkvKiA4IGRhdGEsIDEgc3RvcCwgbm8gcGFyaXR5ICovCisgICAgY21hX21iX3JlZ193cml0ZSgmbWJzcC0+c2VyX21jciwgMHgwMyk7CS8qIFJUUy9EVFIgKi8KKyAgICBjbWFfbWJfcmVnX3dyaXRlKCZtYnNwLT5zZXJfZmNyLCAweDA3KTsJLyogQ2xlYXIgJiBlbmFibGUgRklGT3MgKi8KKworICAgIHJldHVybiAoMCk7Cit9CisKK3ZvaWQKK3NlcmlhbF9zZXRicmcgKHZvaWQpCit7CisgICAgREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyAgICBjbWFfbWJfc2VyaWFsICptYnNwID0gKGNtYV9tYl9zZXJpYWwgKilDTUFfTUJfU0VSSUFMX0JBU0U7CisgICAgdW5zaWduZWQgaW50IGRpdmlzb3I7CisgICAgdW5zaWduZWQgY2hhciBsY3I7CisKKyAgICBpZiAoKGRpdmlzb3IgPSBicl90b19kaXYoZ2QtPmJhdWRyYXRlKSkgPT0gMCkKKwlkaXZpc29yID0gREVGRElWOworCisgICAgbGNyID0gY21hX21iX3JlZ19yZWFkKCZtYnNwLT5zZXJfbGNyKTsKKyAgICBjbWFfbWJfcmVnX3dyaXRlKCZtYnNwLT5zZXJfbGNyLCBsY3J8MHg4MCk7LyogQWNjZXNzIGJhdWQgcmF0ZShzZXQgRExBQikqLworICAgIGNtYV9tYl9yZWdfd3JpdGUoJm1ic3AtPnNlcl9icmwsIGRpdmlzb3IgJiAweGZmKTsKKyAgICBjbWFfbWJfcmVnX3dyaXRlKCZtYnNwLT5zZXJfYnJoLCAoZGl2aXNvciA+PiA4KSAmIDB4ZmYpOworICAgIGNtYV9tYl9yZWdfd3JpdGUoJm1ic3AtPnNlcl9sY3IsIGxjcik7CS8qIHVuc2V0IERMQUIgKi8KK30KKwordm9pZAorc2VyaWFsX3B1dGMoY29uc3QgY2hhciBjKQoreworICAgIGNtYV9tYl9zZXJpYWwgKm1ic3AgPSAoY21hX21iX3NlcmlhbCAqKUNNQV9NQl9TRVJJQUxfQkFTRTsKKworICAgIGlmIChjID09ICdcbicpCisJc2VyaWFsX3B1dGMoJ1xyJyk7CisKKyAgICB3aGlsZSAoKGNtYV9tYl9yZWdfcmVhZCgmbWJzcC0+c2VyX2xzcikgJiBMU1JfVEhSRSkgPT0gMCkKKwk7CisKKyAgICBjbWFfbWJfcmVnX3dyaXRlKCZtYnNwLT5zZXJfdGhyLCBjKTsKK30KKwordm9pZAorc2VyaWFsX3B1dHMoY29uc3QgY2hhciAqcykKK3sKKyAgICB3aGlsZSAoKnMgIT0gJ1wwJykKKwlzZXJpYWxfcHV0YygqcysrKTsKK30KKworaW50CitzZXJpYWxfZ2V0Yyh2b2lkKQoreworICAgIGNtYV9tYl9zZXJpYWwgKm1ic3AgPSAoY21hX21iX3NlcmlhbCAqKUNNQV9NQl9TRVJJQUxfQkFTRTsKKworICAgIHdoaWxlICgoY21hX21iX3JlZ19yZWFkKCZtYnNwLT5zZXJfbHNyKSAmIExTUl9EUikgPT0gMCkKKwk7CisKKyAgICByZXR1cm4gKChpbnQpY21hX21iX3JlZ19yZWFkKCZtYnNwLT5zZXJfcmhyKSAmIDB4N2YpOworfQorCitpbnQKK3NlcmlhbF90c3RjKHZvaWQpCit7CisgICAgY21hX21iX3NlcmlhbCAqbWJzcCA9IChjbWFfbWJfc2VyaWFsICopQ01BX01CX1NFUklBTF9CQVNFOworCisgICAgcmV0dXJuICgoY21hX21iX3JlZ19yZWFkKCZtYnNwLT5zZXJfbHNyKSAmIExTUl9EUikgIT0gMCk7Cit9CisKKyNlbmRpZiAvKiBDT05TX05PTkUgKi8KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpICYmIFwKKyAgICBkZWZpbmVkKENPTkZJR19LR0RCX05PTkUpCisKKyNpZiBDT05GSUdfS0dEQl9JTkRFWCA9PSBDT05GSUdfQ09OU19JTkRFWAorI2Vycm9yIENvbnNvbGUgYW5kIGtnZGIgYXJlIG9uIHRoZSBzYW1lIHNlcmlhbCBwb3J0IC0gdGhpcyBpcyBub3Qgc3VwcG9ydGVkCisjZW5kaWYKKworI2lmIENPTkZJR19LR0RCX0lOREVYID09IDEKKyNkZWZpbmUgQ01BX01CX0tHREJfU0VSX0JBU0UJQ01BX01CX1NFUklBTEFfQkFTRQorI2VsaWYgQ09ORklHX0tHREJfSU5ERVggPT0gMgorI2RlZmluZSBDTUFfTUJfS0dEQl9TRVJfQkFTRQlDTUFfTUJfU0VSSUFMQl9CQVNFCisjZWxpZiBDT05GSUdfS0dEQl9JTkRFWCA9PSAzICYmIChDTUFfTUJfQ0FQUyAmIENNQV9NQl9DQVBfU0VSMikKKyNkZWZpbmUgQ01BX01CX0tHREJfU0VSX0JBU0UJQ01BX01CX1NFUjJBX0JBU0UKKyNlbGlmIENPTkZJR19LR0RCX0lOREVYID09IDQgJiYgKENNQV9NQl9DQVBTICYgQ01BX01CX0NBUF9TRVIyKQorI2RlZmluZSBDTUFfTUJfS0dEQl9TRVJfQkFTRQlDTUFfTUJfU0VSMkJfQkFTRQorI2Vsc2UKKyNlcnJvciBDT05GSUdfS0dEQl9JTkRFWCBtdXN0IGJlIGNvbmZpZ3VyZWQgZm9yIENvZ2VudCBtb3RoZXJib2FyZCBzZXJpYWwKKyNlbmRpZgorCit2b2lkCitrZ2RiX3NlcmlhbF9pbml0KHZvaWQpCit7CisgICAgY21hX21iX3NlcmlhbCAqbWJzcCA9IChjbWFfbWJfc2VyaWFsICopQ01BX01CX0tHREJfU0VSX0JBU0U7CisgICAgdW5zaWduZWQgaW50IGRpdmlzb3I7CisKKyAgICBpZiAoKGRpdmlzb3IgPSBicl90b19kaXYoQ09ORklHX0tHREJfQkFVRFJBVEUpKSA9PSAwKQorCWRpdmlzb3IgPSBERUZESVY7CisKKyAgICBjbWFfbWJfcmVnX3dyaXRlKCZtYnNwLT5zZXJfaWVyLCAweDAwKTsJLyogdHVybiBvZmYgaW50ZXJydXB0cyAqLworICAgIGNtYV9tYl9yZWdfd3JpdGUoJm1ic3AtPnNlcl9sY3IsIDB4ODApOwkvKiBBY2Nlc3MgYmF1ZCByYXRlKHNldCBETEFCKSovCisgICAgY21hX21iX3JlZ193cml0ZSgmbWJzcC0+c2VyX2JybCwgZGl2aXNvciAmIDB4ZmYpOworICAgIGNtYV9tYl9yZWdfd3JpdGUoJm1ic3AtPnNlcl9icmgsIChkaXZpc29yID4+IDgpICYgMHhmZik7CisgICAgY21hX21iX3JlZ193cml0ZSgmbWJzcC0+c2VyX2xjciwgMHgwMyk7CS8qIDggZGF0YSwgMSBzdG9wLCBubyBwYXJpdHkgKi8KKyAgICBjbWFfbWJfcmVnX3dyaXRlKCZtYnNwLT5zZXJfbWNyLCAweDAzKTsJLyogUlRTL0RUUiAqLworICAgIGNtYV9tYl9yZWdfd3JpdGUoJm1ic3AtPnNlcl9mY3IsIDB4MDcpOwkvKiBDbGVhciAmIGVuYWJsZSBGSUZPcyAqLworCisgICAgcHJpbnRmKCJbb24gY21hMTB4IHNlcmlhbCBwb3J0IEJdICIpOworfQorCit2b2lkCitwdXREZWJ1Z0NoYXIoaW50IGMpCit7CisgICAgY21hX21iX3NlcmlhbCAqbWJzcCA9IChjbWFfbWJfc2VyaWFsICopQ01BX01CX0tHREJfU0VSX0JBU0U7CisKKyAgICB3aGlsZSAoKGNtYV9tYl9yZWdfcmVhZCgmbWJzcC0+c2VyX2xzcikgJiBMU1JfVEhSRSkgPT0gMCkKKwk7CisKKyAgICBjbWFfbWJfcmVnX3dyaXRlKCZtYnNwLT5zZXJfdGhyLCBjICYgMHhmZik7Cit9CisKK3ZvaWQKK3B1dERlYnVnU3RyKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICB3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CisJaWYgKCpzdHIgPT0gJ1xuJykKKwkgICAgcHV0RGVidWdDaGFyKCdccicpOworCXB1dERlYnVnQ2hhcigqc3RyKyspOworICAgIH0KK30KKworaW50CitnZXREZWJ1Z0NoYXIodm9pZCkKK3sKKyAgICBjbWFfbWJfc2VyaWFsICptYnNwID0gKGNtYV9tYl9zZXJpYWwgKilDTUFfTUJfS0dEQl9TRVJfQkFTRTsKKworICAgIHdoaWxlICgoY21hX21iX3JlZ19yZWFkKCZtYnNwLT5zZXJfbHNyKSAmIExTUl9EUikgPT0gMCkKKwk7CisKKyAgICByZXR1cm4gKChpbnQpY21hX21iX3JlZ19yZWFkKCZtYnNwLT5zZXJfcmhyKSAmIDB4N2YpOworfQorCit2b2lkCitrZ2RiX2ludGVycnVwdGlibGUoaW50IHllcykKK3sKKyAgICBjbWFfbWJfc2VyaWFsICptYnNwID0gKGNtYV9tYl9zZXJpYWwgKilDTUFfTUJfS0dEQl9TRVJfQkFTRTsKKworICAgIGlmICh5ZXMgPT0gMSkgeworCXByaW50Zigia2dkYjogdHVybmluZyBzZXJpYWwgaW50cyBvblxuIik7CisJY21hX21iX3JlZ193cml0ZSgmbWJzcC0+c2VyX2llciwgMHhmKTsKKyAgICB9CisgICAgZWxzZSB7CisJcHJpbnRmKCJrZ2RiOiB0dXJuaW5nIHNlcmlhbCBpbnRzIG9mZlxuIik7CisJY21hX21iX3JlZ193cml0ZSgmbWJzcC0+c2VyX2llciwgMHgwKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBLR0RCICYmIEtHREJfTk9ORSAqLworCisjZW5kaWYgLyogQ0FQUyAmIFNFUlBBUiAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvY3U4MjQvY3U4MjQuYyBiL2JvYXJkL2N1ODI0L2N1ODI0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhYWVhMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2N1ODI0L2N1ODI0LmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFJvYiBUYXlsb3IsIEZseWluZyBQaWcgU3lzdGVtcy4gcm9idEBmbHlpbmdwaWcuY29tLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMSwgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPHdkQGRlbnguZGU+CisKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4MjR4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHBjaS5oPgorCisjZGVmaW5lIEJPQVJEX1JFVl9SRUcgMHhGRTgwMDAyQgorCitpbnQgY2hlY2tib2FyZCAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWNoYXIgIHJldmlzaW9uID0gKih2b2xhdGlsZSBjaGFyICopKEJPQVJEX1JFVl9SRUcpOworCWNoYXIgIGJ1ZlszMl07CisKKwlwdXRzICgiQm9hcmQ6IENVODI0ICIpOworCXByaW50ZigiUmV2aXNpb24gJWQgIiwgcmV2aXNpb24pOworCXByaW50ZigiTG9jYWwgQnVzIGF0ICVzIE1IelxuIiwgc3RybWh6KGJ1ZiwgZ2QtPmJ1c19jbGspKTsKKworCXJldHVybiAwOworfQorCitsb25nIGludCBpbml0ZHJhbShpbnQgYm9hcmRfdHlwZSkKK3sKKwlpbnQgICAgICAgICAgICAgIGksIGNudDsKKwl2b2xhdGlsZSB1Y2hhciAqIGJhc2UgICAgICA9IENGR19TRFJBTV9CQVNFOworCXZvbGF0aWxlIHVsb25nICogYWRkcjsKKwl1bG9uZyAgICAgICAgICAgIHNhdmVbMzJdOworCXVsb25nICAgICAgICAgICAgdmFsLCByZXQgID0gMDsKKworCWZvciAoaT0wLCBjbnQ9KENGR19NQVhfUkFNX1NJWkUgLyBzaXplb2YobG9uZykpID4+IDE7IGNudCA+IDA7IGNudCA+Pj0gMSkgeworCQlhZGRyID0gKHZvbGF0aWxlIHVsb25nICopYmFzZSArIGNudDsKKwkJc2F2ZVtpKytdID0gKmFkZHI7CisJCSphZGRyID0gfmNudDsKKwl9CisKKwlhZGRyID0gKHZvbGF0aWxlIHVsb25nICopYmFzZTsKKwlzYXZlW2ldID0gKmFkZHI7CisJKmFkZHIgPSAwOworCisJaWYgKCphZGRyICE9IDApIHsKKwkJKmFkZHIgPSBzYXZlW2ldOworCQlnb3RvIERvbmU7CisJfQorCisJZm9yIChjbnQgPSAxOyBjbnQgPD0gQ0ZHX01BWF9SQU1fU0laRSAvIHNpemVvZihsb25nKTsgY250IDw8PSAxKSB7CisJCWFkZHIgPSAodm9sYXRpbGUgdWxvbmcgKiliYXNlICsgY250OworCQl2YWwgPSAqYWRkcjsKKwkJKmFkZHIgPSBzYXZlWy0taV07CisJCWlmICh2YWwgIT0gfmNudCkgeworCQkJdWxvbmcgbmV3X2JhbmswX2VuZCA9IGNudCAqIHNpemVvZihsb25nKSAtIDE7CisJCQl1bG9uZyBtZWFyMSAgPSBtcGM4MjR4X21wYzEwN19nZXRyZWcoTUVBUjEpOworCQkJdWxvbmcgZW1lYXIxID0gbXBjODI0eF9tcGMxMDdfZ2V0cmVnKEVNRUFSMSk7CisJCQltZWFyMSA9ICAobWVhcjEgICYgMHhGRkZGRkYwMCkgfAorCQkJICAoKG5ld19iYW5rMF9lbmQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKTsKKwkJCWVtZWFyMSA9IChlbWVhcjEgJiAweEZGRkZGRjAwKSB8CisJCQkgICgobmV3X2JhbmswX2VuZCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0VBRERSX1NISUZUKTsKKwkJCW1wYzgyNHhfbXBjMTA3X3NldHJlZyhNRUFSMSwgIG1lYXIxKTsKKwkJCW1wYzgyNHhfbXBjMTA3X3NldHJlZyhFTUVBUjEsIGVtZWFyMSk7CisKKwkJCXJldCA9IGNudCAqIHNpemVvZihsb25nKTsKKwkJCWdvdG8gRG9uZTsKKwkJfQorCX0KKworCXJldCA9IENGR19NQVhfUkFNX1NJWkU7CitEb25lOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIFBDSSBEZXZpY2VzLCByZXBvcnQgZGV2aWNlcyBmb3VuZC4KKyAqLworI2lmbmRlZiBDT05GSUdfUENJX1BOUAorc3RhdGljIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlIHBjaV9zYW5kcG9pbnRfY29uZmlnX3RhYmxlW10gPSB7CisJeyBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSAgUENJX0JVUyhDRkdfRVRIX0RFVl9GTiksIFBDSV9ERVYoQ0ZHX0VUSF9ERVZfRk4pLCBQQ0lfRlVOQyhDRkdfRVRIX0RFVl9GTiksCisJICBwY2lfY2ZnZnVuY19jb25maWdfZGV2aWNlLCB7IENGR19FVEhfSU9CQVNFLAorCQkJCSAgICAgICAwLAorCQkJCSAgICAgICBQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01BU1RFUiB9fSwKKwl7IH0KK307CisjZW5kaWYKKworc3RydWN0IHBjaV9jb250cm9sbGVyIGhvc2UgPSB7CisjaWZuZGVmIENPTkZJR19QQ0lfUE5QCisJY29uZmlnX3RhYmxlOiBwY2lfc2FuZHBvaW50X2NvbmZpZ190YWJsZSwKKyNlbmRpZgorfTsKKwordm9pZCBwY2lfaW5pdCh2b2lkKQoreworCXBjaV9tcGM4MjR4X2luaXQoJmhvc2UpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZG5wMTExMC91LWJvb3QubGRzIGIvYm9hcmQvZG5wMTExMC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjBhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kbnAxMTEwL3UtYm9vdC5sZHMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAgICAgICAuID0gMHgwMDAwMDAwMDsKKworICAgICAgICAuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L3NhMTEwMC9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAuZGF0YSA6IHsgKiguZGF0YSkgfQorCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLmdvdCA6IHsgKiguZ290KSB9CisKKwlhcm1ib290X2VuZF9kYXRhID0gLjsKKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5ic3MgOiB7ICooLmJzcykgfQorCisJYXJtYm9vdF9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZWJvbnkvZWJvbnkuYyBiL2JvYXJkL2Vib255L2Vib255LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzZmFkMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2Vib255L2Vib255LmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFNjb3R0IE1jTnV0dCA8c21jbnV0dEBhcnRlc3luY3AuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKworZXh0ZXJuIGxvbmcgaW50IHNwZF9zZHJhbSAodm9pZCk7CisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlICJlYm9ueS5oIgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2RlZmluZSBCT09UX1NNQUxMX0ZMQVNICTMyCS8qIDAwMTAwMDAwICovCisjZGVmaW5lIEZMQVNIX09OQkRfTgkJMgkvKiAwMDAwMDAxMCAqLworI2RlZmluZSBGTEFTSF9TUkFNX1NFTAkJMQkvKiAwMDAwMDAwMSAqLworCitsb25nIGludCBmaXhlZF9zZHJhbSAodm9pZCk7CisKK2ludCBib2FyZF9wcmVfaW5pdCAodm9pZCkKK3sKKwl1aW50IHJlZzsKKwl1bnNpZ25lZCBjaGFyICpmcGdhX2Jhc2UgPSAodW5zaWduZWQgY2hhciAqKSBDRkdfRlBHQV9CQVNFOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0dXAgdGhlIGV4dGVybmFsIGJ1cyBjb250cm9sbGVyL2NoaXAgc2VsZWN0cworCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbXRkY3IgKGViY2NmZ2EsIHhiY2ZnKTsKKwlyZWcgPSBtZmRjciAoZWJjY2ZnZCk7CisJbXRkY3IgKGViY2NmZ2QsIHJlZyB8IDB4MDQwMDAwMDApOwkvKiBTZXQgQVRDICovCisKKwltdGViYyAocGIxYXAsIDB4MDI4MTU0ODApOwkvKiBOVlJBTS9SVEMgKi8KKwltdGViYyAocGIxY3IsIDB4NDgwMTgwMDApOwkvKiBCQT0weDQ4MCAxTUIgUi9XIDgtYml0ICovCisJbXRlYmMgKHBiN2FwLCAweDAxMDE1MjgwKTsJLyogRlBHQSByZWdpc3RlcnMgKi8KKwltdGViYyAocGI3Y3IsIDB4NDgzMTgwMDApOwkvKiBCQT0weDQ4MyAxTUIgUi9XIDgtYml0ICovCisKKwkvKiByZWFkIEZQR0FfUkVHMCAgYW5kIHNldCB0aGUgYnVzIGNvbnRyb2xsZXIgKi8KKwlzdGF0dXMgPSAqZnBnYV9iYXNlOworCWlmICgoc3RhdHVzICYgQk9PVF9TTUFMTF9GTEFTSCkgJiYgIShzdGF0dXMgJiBGTEFTSF9PTkJEX04pKSB7CisJCW10ZWJjIChwYjBhcCwgMHg5YjAxNTQ4MCk7CS8qIEZMQVNIL1NSQU0gKi8KKwkJbXRlYmMgKHBiMGNyLCAweGZmZjE4MDAwKTsJLyogQkFTPTB4ZmZmIDFNQiBSL1cgOC1iaXQgKi8KKwkJbXRlYmMgKHBiMmFwLCAweDliMDE1NDgwKTsJLyogNE1CIEZMQVNIICovCisJCW10ZWJjIChwYjJjciwgMHhmZjg1ODAwMCk7CS8qIEJBUz0weGZmOCA0TUIgUi9XIDgtYml0ICovCisJfSBlbHNlIHsKKwkJbXRlYmMgKHBiMGFwLCAweDliMDE1NDgwKTsJLyogNE1CIEZMQVNIICovCisJCW10ZWJjIChwYjBjciwgMHhmZmM1ODAwMCk7CS8qIEJBUz0weGZmYyA0TUIgUi9XIDgtYml0ICovCisKKwkJLyogc2V0IENTMiBpZiBGTEFTSF9PTkJEX04gPT0gMCAqLworCQlpZiAoIShzdGF0dXMgJiBGTEFTSF9PTkJEX04pKSB7CisJCQltdGViYyAocGIyYXAsIDB4OWIwMTU0ODApOwkvKiBGTEFTSC9TUkFNICovCisJCQltdGViYyAocGIyY3IsIDB4ZmY4MTgwMDApOwkvKiBCQVM9MHhmZjggNE1CIFIvVyA4LWJpdCAqLworCQl9CisJfQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFNldHVwIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBwb2xhcml0aWVzLCB0cmlnZ2VycywgZXRjLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbXRkY3IgKHVpYzBzciwgMHhmZmZmZmZmZik7CS8qIGNsZWFyIGFsbCAqLworCW10ZGNyICh1aWMwZXIsIDB4MDAwMDAwMDApOwkvKiBkaXNhYmxlIGFsbCAqLworCW10ZGNyICh1aWMwY3IsIDB4MDAwMDAwMDkpOwkvKiBTTUkgJiBVSUMxIGNyaXQgYXJlIGNyaXRpY2FsICovCisJbXRkY3IgKHVpYzBwciwgMHhmZmZmZmUxMyk7CS8qIHBlciByZWYtYm9hcmQgbWFudWFsICovCisJbXRkY3IgKHVpYzB0ciwgMHgwMWMwMDAwOCk7CS8qIHBlciByZWYtYm9hcmQgbWFudWFsICovCisJbXRkY3IgKHVpYzB2ciwgMHgwMDAwMDAwMSk7CS8qIGludDMxIGhpZ2hlc3QsIGJhc2U9MHgwMDAgKi8KKwltdGRjciAodWljMHNyLCAweGZmZmZmZmZmKTsJLyogY2xlYXIgYWxsICovCisKKwltdGRjciAodWljMXNyLCAweGZmZmZmZmZmKTsJLyogY2xlYXIgYWxsICovCisJbXRkY3IgKHVpYzFlciwgMHgwMDAwMDAwMCk7CS8qIGRpc2FibGUgYWxsICovCisJbXRkY3IgKHVpYzFjciwgMHgwMDAwMDAwMCk7CS8qIGFsbCBub24tY3JpdGljYWwgKi8KKwltdGRjciAodWljMXByLCAweGZmZmZlMGZmKTsJLyogcGVyIHJlZi1ib2FyZCBtYW51YWwgKi8KKwltdGRjciAodWljMXRyLCAweDAwZmZjMDAwKTsJLyogcGVyIHJlZi1ib2FyZCBtYW51YWwgKi8KKwltdGRjciAodWljMXZyLCAweDAwMDAwMDAxKTsJLyogaW50MzEgaGlnaGVzdCwgYmFzZT0weDAwMCAqLworCW10ZGNyICh1aWMxc3IsIDB4ZmZmZmZmZmYpOwkvKiBjbGVhciBhbGwgKi8KKworCXJldHVybiAwOworfQorCisKKworaW50IGNoZWNrYm9hcmQgKHZvaWQpCit7CisJc3lzX2luZm9fdCBzeXNpbmZvOworCisJZ2V0X3N5c19pbmZvICgmc3lzaW5mbyk7CisKKwlwcmludGYgKCJCb2FyZDogSUJNIDQ0MEdQIEV2YWx1YXRpb24gQm9hcmQgKEVib255KVxuIik7CisJcHJpbnRmICgiXHRWQ086ICVsdSBNSHpcbiIsIHN5c2luZm8uZnJlcVZDT01oeiAvIDEwMDAwMDApOworCXByaW50ZiAoIlx0Q1BVOiAlbHUgTUh6XG4iLCBzeXNpbmZvLmZyZXFQcm9jZXNzb3IgLyAxMDAwMDAwKTsKKwlwcmludGYgKCJcdFBMQjogJWx1IE1IelxuIiwgc3lzaW5mby5mcmVxUExCIC8gMTAwMDAwMCk7CisJcHJpbnRmICgiXHRPUEI6ICVsdSBNSHpcbiIsIHN5c2luZm8uZnJlcU9QQiAvIDEwMDAwMDApOworCXByaW50ZiAoIlx0RVBCOiAlbHUgTUh6XG4iLCBzeXNpbmZvLmZyZXFFUEIgLyAxMDAwMDAwKTsKKwlyZXR1cm4gKDApOworfQorCisKK2xvbmcgaW50IGluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKK3sKKwlsb25nIGRyYW1fc2l6ZSA9IDA7CisJZXh0ZXJuIGxvbmcgc3BkX3NkcmFtICh2b2lkKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NQRF9FRVBST00pCisJZHJhbV9zaXplID0gc3BkX3NkcmFtICgpOworI2Vsc2UKKwlkcmFtX3NpemUgPSBmaXhlZF9zZHJhbSAoKTsKKyNlbmRpZgorCXJldHVybiBkcmFtX3NpemU7Cit9CisKKworI2lmIGRlZmluZWQoQ0ZHX0RSQU1fVEVTVCkKK2ludCB0ZXN0ZHJhbSAodm9pZCkKK3sKKwl1aW50ICpwc3RhcnQgPSAodWludCAqKSAweDAwMDAwMDAwOworCXVpbnQgKnBlbmQgPSAodWludCAqKSAweDA4MDAwMDAwOworCXVpbnQgKnA7CisKKwlmb3IgKHAgPSBwc3RhcnQ7IHAgPCBwZW5kOyBwKyspCisJCSpwID0gMHhhYWFhYWFhYTsKKworCWZvciAocCA9IHBzdGFydDsgcCA8IHBlbmQ7IHArKykgeworCQlpZiAoKnAgIT0gMHhhYWFhYWFhYSkgeworCQkJcHJpbnRmICgiU0RSQU0gdGVzdCBmYWlscyBhdDogJTA4eFxuIiwgKHVpbnQpIHApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlmb3IgKHAgPSBwc3RhcnQ7IHAgPCBwZW5kOyBwKyspCisJCSpwID0gMHg1NTU1NTU1NTsKKworCWZvciAocCA9IHBzdGFydDsgcCA8IHBlbmQ7IHArKykgeworCQlpZiAoKnAgIT0gMHg1NTU1NTU1NSkgeworCQkJcHJpbnRmICgiU0RSQU0gdGVzdCBmYWlscyBhdDogJTA4eFxuIiwgKHVpbnQpIHApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBmaXhlZCBzZHJhbSBpbml0IC0tIGRvZXNuJ3QgdXNlIHNlcmlhbCBwcmVzZW5jZSBkZXRlY3QuCisgKgorICogIEFzc3VtZXM6ICAgIDEyOCBNQiwgbm9uLUVDQywgbm9uLXJlZ2lzdGVyZWQKKyAqICAgICAgICAgICAgICBQTEIgQCAxMzMgTUh6CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2xvbmcgaW50IGZpeGVkX3NkcmFtICh2b2lkKQoreworCXVpbnQgcmVnOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFNldHVwIHNvbWUgZGVmYXVsdAorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltdHNkcmFtIChtZW1fdWFiYmEsIDB4MDAwMDAwMDApOwkvKiB1YmJhPTAgKGRlZmF1bHQpICAgICAgICAgICAgICovCisJbXRzZHJhbSAobWVtX3NsaW8sIDB4MDAwMDAwMDApOwkJLyogcmRyZT0wIHdycmU9MCByYXJ3PTAgICAgICAgICAqLworCW10c2RyYW0gKG1lbV9kZXZvcHQsIDB4MDAwMDAwMDApOwkvKiBkbGw9MCBkcz0wIChub3JtYWwpICAgICAgICAgICovCisJbXRzZHJhbSAobWVtX3dkZGN0ciwgMHgwMDAwMDAwMCk7CS8qIHdyY3A9MCBkY2Q9MCAgICAgICAgICAgICAgICAgKi8KKwltdHNkcmFtIChtZW1fY2xrdHIsIDB4NDAwMDAwMDApOwkvKiBjbGtwPTEgKDkwIGRlZyB3cikgZGNkdD0wICAgICovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0dXAgZm9yIGJvYXJkLXNwZWNpZmljIHNwZWNpZmljIG1lbQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKgorCSAqIEZvbGxvd2luZyBmb3IgQ0FTIExhdGVuY3kgPSAyLjUgQCAxMzMgTUh6IFBMQgorCSAqLworCW10c2RyYW0gKG1lbV9iMGNyLCAweDAwMGE0MDAxKTsJLyogU0RCQT0weDAwMCAxMjhNQiwgTW9kZSAzLCBlbmFibGVkICovCisJbXRzZHJhbSAobWVtX3RyMCwgMHg0MTBhNDAxMik7CS8qIFdSPTIgIFdEPTEgQ0w9Mi41IFBBPTMgQ1A9NCBMRD0yICovCisJLyogUkE9MTAgUkQ9MyAgICAgICAgICAgICAgICAgICAgICAgKi8KKwltdHNkcmFtIChtZW1fdHIxLCAweDgwODAwODJmKTsJLyogU1M9VDIgU0w9U1RBR0UgMyBDRD0xIENUPTB4MDJmICAgKi8KKwltdHNkcmFtIChtZW1fcnRyLCAweDA4MjAwMDAwKTsJLyogUmF0ZSAxNS42MjUgbnMgQCAxMzMgTUh6IFBMQiAgICAgKi8KKwltdHNkcmFtIChtZW1fY2ZnMSwgMHgwMDAwMDAwMCk7CS8qIFNlbGYtcmVmcmVzaCBleGl0LCBkaXNhYmxlIFBNICAgICovCisJdWRlbGF5ICg0MDApOwkJCS8qIERlbGF5IDIwMCB1c2VjcyAobWluKSAgICAgICAgICAgICovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogRW5hYmxlIHRoZSBjb250cm9sbGVyLCB0aGVuIHdhaXQgZm9yIERDRU4gdG8gY29tcGxldGUKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbXRzZHJhbSAobWVtX2NmZzAsIDB4ODYwMDAwMDApOwkvKiBEQ0VOPTEsIFBNVUQ9MSwgNjQtYml0ICAgICAgICAgICAqLworCWZvciAoOzspIHsKKwkJbWZzZHJhbSAobWVtX21jc3RzLCByZWcpOworCQlpZiAocmVnICYgMHg4MDAwMDAwMCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAoMTI4ICogMTAyNCAqIDEwMjQpOwkvKiAxMjggTUIgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfQorI2VuZGlmCS8qICFkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgcGNpX3ByZV9pbml0CisgKgorICogIFRoaXMgcm91dGluZSBpcyBjYWxsZWQganVzdCBwcmlvciB0byByZWdpc3RlcmluZyB0aGUgaG9zZSBhbmQgZ2l2ZXMKKyAqICB0aGUgYm9hcmQgdGhlIG9wcG9ydHVuaXR5IHRvIGNoZWNrIHRoaW5ncy4gUmV0dXJuaW5nIGEgdmFsdWUgb2YgemVybworICogIGluZGljYXRlcyB0aGF0IHRoaW5ncyBhcmUgYmFkICYgUENJIGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSBhYm9ydGVkLgorICoKKyAqCURpZmZlcmVudCBib2FyZHMgbWF5IHdpc2ggdG8gY3VzdG9taXplIHRoZSBwY2kgY29udHJvbGxlciBzdHJ1Y3R1cmUKKyAqCShhZGQgcmVnaW9ucywgb3ZlcnJpZGUgZGVmYXVsdCBhY2Nlc3Mgcm91dGluZXMsIGV0Yykgb3IgcGVyZm9ybQorICoJY2VydGFpbiBwcmUtaW5pdGlhbGl6YXRpb24gYWN0aW9ucy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKQoraW50IHBjaV9wcmVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiBob3NlICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHN0cmFwOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKglUaGUgZWJvbnkgYm9hcmQgaXMgYWx3YXlzIGNvbmZpZ3VyZWQgYXMgdGhlIGhvc3QgJiByZXF1aXJlcyB0aGUKKyAgICAgKglQQ0kgYXJiaXRlciB0byBiZSBlbmFibGVkLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHN0cmFwID0gbWZkY3IoY3BjMF9zdHJwMSk7CisgICAgaWYoIChzdHJhcCAmIDB4MDAxMDAwMDApID09IDAgKXsKKyAgICAgICAgcHJpbnRmKCJQQ0k6IENQQzBfU1RSUDFbUEFFXSBub3Qgc2V0LlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIHBjaV90YXJnZXRfaW5pdAorICoKKyAqCVRoZSBib290c3RyYXAgY29uZmlndXJhdGlvbiBwcm92aWRlcyBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgcGNpCisgKglpbmJvdW5kIG1hcCAoUElNKS4gQnV0IHRoZSBib290c3RyYXAgY29uZmlnIGNob2ljZXMgYXJlIGxpbWl0ZWQgYW5kCisgKgltYXkgbm90IGJlIHN1ZmZpY2llbnQgZm9yIGEgZ2l2ZW4gYm9hcmQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ0ZHX1BDSV9UQVJHRVRfSU5JVCkKK3ZvaWQgcGNpX3RhcmdldF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqIGhvc2UgKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiBEaXNhYmxlIGV2ZXJ5dGhpbmcKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlvdXQzMnIoIFBDSVgwX1BJTTBTQSwgMCApOyAvKiBkaXNhYmxlICovCisJb3V0MzJyKCBQQ0lYMF9QSU0xU0EsIDAgKTsgLyogZGlzYWJsZSAqLworCW91dDMyciggUENJWDBfUElNMlNBLCAwICk7IC8qIGRpc2FibGUgKi8KKwlvdXQzMnIoIFBDSVgwX0VST01CQSwgMCApOyAvKiBkaXNhYmxlIGV4cGFuc2lvbiByb20gKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogTWFwIGFsbCBvZiBTRFJBTSB0byBQQ0kgYWRkcmVzcyAweDAwMDBfMDAwMC4gTm90ZSB0aGF0IHRoZSA0NDAgc3RyYXBwaW5nCisgICAgICogb3B0aW9ucyB0byBub3Qgc3VwcG9ydCBzaXplcyBzdWNoIGFzIDEyOC8yNTYgTUIuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJb3V0MzJyKCBQQ0lYMF9QSU0wTEFMLCBDRkdfU0RSQU1fQkFTRSApOworCW91dDMyciggUENJWDBfUElNMExBSCwgMCApOworCW91dDMyciggUENJWDBfUElNMFNBLCB+KGdkLT5yYW1fc2l6ZSAtIDEpIHwgMSApOworCisJb3V0MzJyKCBQQ0lYMF9CQVIwLCAwICk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIFByb2dyYW0gdGhlIGJvYXJkJ3Mgc3Vic3lzdGVtIGlkL3ZlbmRvciBpZAorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIG91dDE2ciggUENJWDBfU0JTWVNWSUQsIENGR19QQ0lfU1VCU1lTX1ZFTkRPUklEICk7CisgICAgb3V0MTZyKCBQQ0lYMF9TQlNZU0lELCBDRkdfUENJX1NVQlNZU19ERVZJQ0VJRCApOworCisJb3V0MTZyKCBQQ0lYMF9DTUQsIGluMTZyKFBDSVgwX0NNRCkgfCBQQ0lfQ09NTUFORF9NRU1PUlkgKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ0ZHX1BDSV9UQVJHRVRfSU5JVCkgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGlzX3BjaV9ob3N0CisgKgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgYSBwY2kgc2NhbiBzaG91bGQgYmUKKyAqCXBlcmZvcm1lZC4gV2l0aCB2YXJpb3VzIGhhcmR3YXJlIGVudmlyb25tZW50cyAoZXNwZWNpYWxseSBjUENJIGFuZAorICoJUFBNQykgaXQncyBpbnN1ZmZpY2llbnQgdG8gZGVwZW5kIG9uIHRoZSBzdGF0ZSBvZiB0aGUgYXJiaXRlciBlbmFibGUKKyAqCWJpdCBpbiB0aGUgc3RyYXAgcmVnaXN0ZXIsIG9yIGdlbmVyaWMgaG9zdC9hZGFwdGVyIGFzc3VtcHRpb25zLgorICoKKyAqCVJhdGhlciB0aGFuIGhhcmQtY29kZSBhIGJhZCBhc3N1bXB0aW9uIGluIHRoZSBnZW5lcmFsIDQ0MCBjb2RlLCB0aGUKKyAqCTQ0MCBwY2kgY29kZSByZXF1aXJlcyB0aGUgYm9hcmQgdG8gZGVjaWRlIGF0IHJ1bnRpbWUuCisgKgorICoJUmV0dXJuIDAgZm9yIGFkYXB0ZXIgbW9kZSwgbm9uLXplcm8gZm9yIGhvc3QgKG1vbmFyY2gpIG1vZGUuCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQoraW50IGlzX3BjaV9ob3N0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKyAgICAvKiBUaGUgZWJvbnkgYm9hcmQgaXMgYWx3YXlzIGNvbmZpZ3VyZWQgYXMgaG9zdC4gKi8KKyAgICByZXR1cm4oMSk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUENJKSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvZWJvbnkvaW5pdC5TIGIvYm9hcmQvZWJvbnkvaW5pdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZTkzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9lYm9ueS9pbml0LlMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyogIENvcHlyaWdodCAoQykgMjAwMiBTY290dCBNY051dHQgPHNtY251dHRAYXJ0ZXN5bmNwLmNvbT4KKyoKKyogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyogcHJvamVjdC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyogTUEgMDIxMTEtMTMwNyBVU0EKKyovCisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgVExCX1ZBTElEICAgMHgwMDAwMDIwMAorCisvKiBTdXBwb3J0ZWQgcGFnZSBzaXplcyAqLworCisjZGVmaW5lIFNaXzFLCSAgICAweDAwMDAwMDAwCisjZGVmaW5lIFNaXzRLCSAgICAweDAwMDAwMDEwCisjZGVmaW5lIFNaXzE2SwkgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTWl82NEsJICAgIDB4MDAwMDAwMzAKKyNkZWZpbmUgU1pfMjU2SwkgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTWl8xTQkgICAgMHgwMDAwMDA1MAorI2RlZmluZSBTWl8xNk0JICAgIDB4MDAwMDAwNzAKKyNkZWZpbmUgU1pfMjU2TQkgICAgMHgwMDAwMDA5MAorCisvKiBTdG9yYWdlIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgU0FfVwkgICAgMHgwMDAwMDgwMAkgICAgLyogV3JpdGUtdGhyb3VnaCAqLworI2RlZmluZSBTQV9JCSAgICAweDAwMDAwNDAwCSAgICAvKiBDYWNoaW5nIGluaGliaXRlZCAqLworI2RlZmluZSBTQV9NCSAgICAweDAwMDAwMjAwCSAgICAvKiBNZW1vcnkgY29oZXJlbmNlICovCisjZGVmaW5lIFNBX0cJICAgIDB4MDAwMDAxMDAJICAgIC8qIEd1YXJkZWQgKi8KKyNkZWZpbmUgU0FfRQkgICAgMHgwMDAwMDA4MAkgICAgLyogRW5kaWFuICovCisKKy8qIEFjY2VzcyBjb250cm9sICovCisjZGVmaW5lIEFDX1gJICAgIDB4MDAwMDAwMjQJICAgIC8qIEV4ZWN1dGUgKi8KKyNkZWZpbmUgQUNfVwkgICAgMHgwMDAwMDAxMgkgICAgLyogV3JpdGUgKi8KKyNkZWZpbmUgQUNfUgkgICAgMHgwMDAwMDAwOQkgICAgLyogUmVhZCAqLworCisvKiBTb21lIGhhbmR5IG1hY3JvcyAqLworCisjZGVmaW5lIEVQTihlKQkJKChlKSAmIDB4ZmZmZmZjMDApCisjZGVmaW5lIFRMQjAoZXBuLHN6KQkoIChFUE4oKGVwbikpIHwgKHN6KSB8IFRMQl9WQUxJRCApICkKKyNkZWZpbmUgVExCMShycG4sZXJwbikJKCAoKHJwbikmMHhmZmZmZmMwMCkgfCAoZXJwbikgKQorI2RlZmluZSBUTEIyKGEpCQkoIChhKSYweDAwMDAwZmJmICkKKworI2RlZmluZSB0bGJ0YWJfc3RhcnRcCisJbWZsciAgICByMSAgO1wKKwlibCAwZgkgICAgOworCisjZGVmaW5lIHRsYnRhYl9lbmRcCisJLmxvbmcgMCwgMCwgMAk7ICAgXAorMDoJbWZsciAgICByMAk7ICAgXAorCW10bHIgICAgcjEJOyAgIFwKKwlibHIJCTsKKworI2RlZmluZSB0bGJlbnRyeShlcG4sc3oscnBuLGVycG4sYXR0cilcCisJLmxvbmcgVExCMChlcG4sc3opLFRMQjEocnBuLGVycG4pLFRMQjIoYXR0cikKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRMQiBUQUJMRQorICoKKyAqIFRoaXMgdGFibGUgaXMgdXNlZCBieSB0aGUgY3B1IGJvb3QgY29kZSB0byBzZXR1cCB0aGUgaW5pdGlhbCB0bGIKKyAqIGVudHJpZXMuIFJhdGhlciB0aGFuIG1ha2UgYnJvYWQgYXNzdW1wdGlvbnMgaW4gdGhlIGNwdSBzb3VyY2UgdHJlZSwKKyAqIHRoaXMgdGFibGUgbGV0cyBlYWNoIGJvYXJkIHNldCB0aGluZ3MgdXAgaG93ZXZlciB0aGV5IGxpa2UuCisgKgorICogIFBvaW50ZXIgdG8gdGhlIHRhYmxlIGlzIHJldHVybmVkIGluIHIxCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAuc2VjdGlvbiAuYm9vdHBnLCJheCIKKyAgICAuZ2xvYmwgdGxidGFiCisKK3RsYnRhYjoKKyAgICB0bGJ0YWJfc3RhcnQKKyAgICB0bGJlbnRyeSggMHhmMDAwMDAwMCwgU1pfMjU2TSwgMHhmMDAwMDAwMCwgMSwgQUNfUnxBQ19XfEFDX1h8U0FfR3xTQV9JKQorICAgIHRsYmVudHJ5KCBDRkdfUEVSSVBIRVJBTF9CQVNFLCBTWl8yNTZNLCAweDQwMDAwMDAwLCAxLCBBQ19SfEFDX1d8U0FfR3xTQV9JKQorICAgIHRsYmVudHJ5KCBDRkdfSVNSQU1fQkFTRSwgU1pfNEssIDB4ODAwMDAwMDAsIDAsIEFDX1J8QUNfV3xBQ19YICkKKyAgICB0bGJlbnRyeSggQ0ZHX0lTUkFNX0JBU0UgKyAweDEwMDAsIFNaXzRLLCAweDgwMDAxMDAwLCAwLCBBQ19SfEFDX1d8QUNfWCApCisgICAgdGxiZW50cnkoIENGR19TRFJBTV9CQVNFLCBTWl8yNTZNLCAweDAwMDAwMDAwLCAwLCBBQ19SfEFDX1d8QUNfWHxTQV9HfFNBX0kgKQorICAgIHRsYmVudHJ5KCBDRkdfUENJX0JBU0UsIFNaXzI1Nk0sIDB4MDAwMDAwMDAsIDIsIEFDX1J8QUNfV3xTQV9HfFNBX0kgKQorICAgIHRsYmVudHJ5KCBDRkdfUENJX01FTUJBU0UsIFNaXzI1Nk0sIDB4MDAwMDAwMDAsIDMsIEFDX1J8QUNfV3xTQV9HfFNBX0kgKQorICAgIHRsYnRhYl9lbmQKKworCmRpZmYgLS1naXQgYS9ib2FyZC9lbHRlYy9iYWI3eHgvYXNtX2luaXQuUyBiL2JvYXJkL2VsdGVjL2JhYjd4eC9hc21faW5pdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MzliODEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9lbHRlYy9iYWI3eHgvYXNtX2luaXQuUwpAQCAtMCwwICsxLDE0ODcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEgRUxURUMgRWxla3Ryb25payBBRworICogRnJhbmsgR290dHNjaGxpbmcgPGZnb3R0c2NobGluZ0BlbHRlYy5kZT4KKyAqCisgKiBFTFRFQyBCQUIgUFBDIFJBTSBpbml0aWFsaXphdGlvbgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxtcGM3NXguaD4KKyNpbmNsdWRlIDxtcGMxMDYuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKworLyoKKyAqIFRoaXMgZm9sbG93aW5nIGNvbnRhaW5zIHRoZSBlbnRyeSBjb2RlIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gY29kZQorICogZm9yIHRoZSBNUEMgMTA2LCBhIFBDSSBCcmlkZ2UvTWVtb3J5IENvbnRyb2xsZXIuCisgKiBSZWdpc3RlciB1c2FnZToKKyAqIHIwICA9IHJhbXRlc3Qgc2NyYXRjaCByZWdpc3RlciwgdG9nZ2xlRXJyb3IgbG9vcCBjb3VudGVyCisgKiByMSAgPSAweGZlYzAgMGNmOCBDT05GSUdfQUREUkVTUworICogcjIgID0gMHhmZWUwIDBjZmMgQ09ORklHX0RBVEEKKyAqIHIzICA9IHNjcmF0Y2ggcmVnaXN0ZXIsIHN1YnJvdXRpbmUgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSwgcmFtdGVzdCBzaXplCisgKiByNCAgPSBzY3JhdGNoIHJlZ2lzdGVyLCBzcGRSZWFkIGNsb2NrIG1hc2ssIE91dEhleCBsb29wIGNvdW50CisgKiByNSAgPSByYW10ZXN0IHNjcmF0Y2ggcmVnaXN0ZXIKKyAqIHI2ICA9IHRvZ2dsZUVycm9yIDFzdCB2YWx1ZSwgc3BkUmVhZCBwb3J0IG1hc2sKKyAqIHI3ICA9IHRvZ2dsZUVycm9yIDJuZCB2YWx1ZSwgcmFtdGVzdCBzY3JhdGNoIHJlZ2lzdGVyLAorICogICAgICAgc3BkUmVhZCBzY3JhdGNoIHJlZ2lzdGVyICgweDAwKQorICogcjggID0gcmFtdGVzdCBzY3JhdGNoIHJlZ2lzdGVyLCBzcGRSZWFkIHNjcmF0Y2ggcmVnaXN0ZXIgKDB4ODApCisgKiByOSAgPSByYW10ZXN0IHNjcmF0Y2ggcmVnaXN0ZXIsIHRvZ2dsZUVycm9yIGxvb3AgZW5kLCBPdXRIZXggZGlnaXQKKyAqIHIxMCA9IHJhbXRlc3Qgc2NyYXRjaCByZWdpc3Rlciwgc3BkV3JpdGVCeXRlIHBhcmFtZXRlciwKKyAqICAgICAgICBzcGRSZWFkQnl0ZSByZXR1cm4gdmFsdWUsIHByaW50ZiBwb2ludGVyIHRvIENPTTEKKyAqIHIxMSA9IHN0YXJ0VHlwZQorICogcjEyID0gcmFtdGVzdCBzY3JhdGNoIHJlZ2lzdGVyLCBzcGRSZWFkIGRhdGEgbWFzaworICogcjEzID0gcG9pbnRlciB0byBtZXNzYWdlIGJsb2NrCisgKiByMTQgPSBwb2ludGVyIHRvIEdPVAorICogcjE1ID0gc2NyYXRjaCByZWdpc3RlciwgU1BEIHNhdmUKKyAqIHIxNiA9IGJhbmswIHNpemUsIHRvdGFsIG1lbW9yeSBzaXplCisgKiByMTcgPSBiYW5rMSBzaXplCisgKiByMTggPSBiYW5rMiBzaXplCisgKiByMTkgPSBiYW5rMyBzaXplCisgKiByMjAgPSBNQ0NSMSwgTVNBUjEKKyAqIHIyMSA9IE1DQ1IzLCBNRUFSMQorICogcjIyID0gTUNDUjQsIE1CRVIKKyAqIHIyMyA9IEVNU0FSMQorICogcjI0ID0gRU1FQVIxCisgKiByMjUgPSBzYXZlIGxpbmsgcmVnaXN0ZXIgMXN0IGxldmVsCisgKiByMjYgPSBzYXZlIGxpbmsgcmVnaXN0ZXIgMm5kIGxldmVsCisgKiByMjcgPSBzYXZlIGxpbmsgcmVnaXN0ZXIgM3JkIGxldmVsCisgKiByMzAgPSBwb2ludGVyIHRvIEdQSU8gZm9yIHNwZFJlYWQKKyAqLworCisKKy5nbG9ibCBib2FyZF9hc21faW5pdAorYm9hcmRfYXNtX2luaXQ6CisvKgorICogc2V0dXAgcG9pbnRlciB0byBtZXNzYWdlIGJsb2NrCisgKi8KKyAgICBtZmxyICAgIHIyNSAgICAgICAgICAgICAvKiBzYXZlIGF3YXkgbGluayByZWdpc3RlciAqLworICAgIGJsICAgICAgZ2V0X2xua19yZWcgICAgIC8qIHIzPWFkZHIgb2YgbmV4dCBpbnN0cnVjdGlvbiAqLworICAgIHN1YmkgICAgcjQsIHIzLCA4ICAgICAgIC8qIHI0PWJvYXJkX2FzbV9pbml0IGFkZHIgKi8KKyAgICBhZGRpICAgIHIxMywgcjQsIChNZXNzYWdlQmxvY2stYm9hcmRfYXNtX2luaXQpCisvKgorICogZGNhY2hlX2Rpc2FibGUKKyAqLworICAgIG1mc3ByICAgcjMsIEhJRDAKKyAgICBsaSAgICAgIHI0LCBISUQwX0RDRQorICAgIGFuZGMgICAgcjMsIHIzLCByNAorICAgIG1yICAgICAgcjIsIHIzCisgICAgb3JpICAgICByMywgcjMsIEhJRDBfRENJCisgICAgc3luYworICAgIG10c3ByICAgSElEMCwgcjMKKyAgICBtdHNwciAgIEhJRDAsIHIyCisgICAgaXN5bmMKKyAgICBzeW5jCisvKgorICogaWNhY2hlX2Rpc2FibGUKKyAqLworICAgIG1mc3ByICAgcjMsIEhJRDAKKyAgICBsaSAgICAgIHI0LCAwCisgICAgb3JpICAgICByNCwgcjQsIEhJRDBfSUNFCisgICAgYW5kYyAgICByMywgcjMsIHI0CisgICAgc3luYworICAgIG10c3ByICAgSElEMCwgcjMKKy8qCisgKiBpbnZhbGlkYXRlIGNhY2hlcworICovCisgICAgb3JpICAgICByMywgcjMsIChISUQwX0lDRSB8IEhJRDBfSUNGSSB8IEhJRDBfRENJIHwgSElEMF9EQ0UpCisgICAgb3IgICAgICByNCwgcjQsIHIzCisgICAgaXN5bmMKKyAgICBtdHNwciAgIEhJRDAsIHI0CisgICAgYW5kYyAgICByNCwgcjQsIHIzCisgICAgaXN5bmMKKyAgICBtdHNwciAgIEhJRDAsIHI0CisgICAgaXN5bmMKKy8qCisgKiBpY2FjaGVfZW5hYmxlCisgKi8KKyAgICBtZnNwciAgIHIzLCBISUQwCisgICAgb3JpICAgICByMywgcjMsIChISUQwX0lDRSB8IEhJRDBfSUNGSSkKKyAgICBzeW5jCisgICAgbXRzcHIgICBISUQwLCByMworCisgICAgbGlzICAgICByMSwgMHhmZWMwCisgICAgb3JpICAgICByMSwgcjEsIDB4MGNmOAorICAgIGxpcyAgICAgcjIsIDB4ZmVlMAorICAgIG9yaSAgICAgcjIsIHIyLCAweGNmYworCisjaWZkZWYgQ0ZHX0FERFJFU1NfTUFQX0EKKy8qCisgKiBTd2l0Y2ggdG8gYWRkcmVzcyBtYXAgQSBpZiBuZWNlc3NhcnkuCisgKi8KKyAgICBsaXMgICAgIHIzLCBNUEMxMDZfUkVHQGgKKyAgICBvcmkgICAgIHIzLCByMywgUENJX1BJQ1IxCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBzeW5jCisgICAgbHdicnggICByNCwgMCwgcjIKKyAgICBzeW5jCisgICAgbGlzICAgICByMCwgUElDUjFfWElPX01PREVAaAorICAgIG9yaSAgICAgcjAsIHIwLCBQSUNSMV9YSU9fTU9ERUBsCisgICAgYW5kYyAgICByNCwgcjQsIHIwCisgICAgbGlzICAgICByMCwgUElDUjFfQUREUkVTU19NQVBAaAorICAgIG9yaSAgICAgcjAsIHIwLCBQSUNSMV9BRERSRVNTX01BUEBsCisgICAgb3IgICAgICByNCwgcjQsIHIwCisgICAgc3R3YnJ4ICByNCwgMCwgcjIKKyAgICBzeW5jCisjZW5kaWYKKworLyoKKyAqIERvIHRoZSBpbml0IGZvciB0aGUgU0lPLgorICovCisgICAgYmwgICAgICAuc2lvSW5pdAorCisgICAgYWRkaSAgICByMywgcjEzLCAoTWluaXRMb2dvLU1lc3NhZ2VCbG9jaykKKyAgICBibCAgICAgIFByaW50ZgorCisgICAgYWRkaSAgICByMywgcjEzLCAoTXNwZDAxLU1lc3NhZ2VCbG9jaykKKyAgICBibCAgICAgIFByaW50ZgorLyoKKyAqIE1lbW9yeSBjb2ZpZ3VyYXRpb24gdXNpbmcgU1BEIGluZm9ybWF0aW9uIHN0b3JlZCBvbiB0aGUgU09ESU1NcworICovCisgICAgbGkgICAgICByMTcsIDAKKyAgICBsaSAgICAgIHIxOCwgMAorICAgIGxpICAgICAgcjE5LCAwCisKKyAgICBsaSAgICAgIHIzLCAweDAwMDIgICAgICAgICAgLyogZ2V0IFJBTSB0eXBlIGZyb20gc3BkIGZvciBiYW5rMC8xICovCisgICAgYmwgICAgICBzcGRSZWFkCisKKyAgICBjbXBpICAgIDAsIDAsIHIzLCAtMSAgICAgICAgLyogZXJyb3IgPyAqLworICAgIGJuZSAgICAgbm9TcGRFcnJvcgorCisgICAgYWRkaSAgICByMywgcjEzLCAoTWZhaWwtTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisKKyAgICBsaSAgICAgIHI2LCAweGUwICAgICAgICAgICAgLyogZXJyb3IgY29kZXMgaW4gcjYgYW5kIHI3ICAqLworICAgIGxpICAgICAgcjcsIDB4MDAKKyAgICBiICAgICAgIHRvZ2dsZUVycm9yICAgICAgICAgLyogZmFpbCAtIGxvb3AgZm9yZXZlciAqLworCitub1NwZEVycm9yOgorICAgIG1yICAgICAgcjE1LCByMyAgICAgICAgICAgICAvKiBzYXZlIHIzICovCisKKyAgICBhZGRpICAgIHIzLCByMTMsIChNb2stTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisKKyAgICBjbXBsaSAgIDAsIDAsIHIxNSwgMHgwMDAxICAgLyogRlBNID8gKi8KKyAgICBiZXEgICAgIGNvbmZpZ0ZQTQorICAgIGNtcGxpICAgMCwgMCwgcjE1LCAweDAwMDIgICAvKiBFRE8gPyAqLworICAgIGJlcSAgICAgY29uZmlnRURPCisgICAgY21wbGkgICAwLCAwLCByMTUsIDB4MDAwNCAgIC8qIFNEUkFNID8gKi8KKyAgICBiZXEgICAgIGNvbmZpZ1NEUkFNCisKKyAgICBsaSAgICAgIHI2LCAweGUwICAgICAgICAgICAgLyogZXJyb3IgY29kZXMgaW4gcjYgYW5kIHI3ICAqLworICAgIGxpICAgICAgcjcsIDB4MDEKKyAgICBiICAgICAgIHRvZ2dsZUVycm9yICAgICAgICAgLyogZmFpbCAtIGxvb3AgZm9yZXZlciAqLworCitjb25maWdTRFJBTToKKyAgICBhZGRpICAgIHIzLCByMTMsIChNc2RSYW0tTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisvKgorICogc2V0IHRoZSBNZW1vcnkgQ29uZmlndXJhdGlvbiBSZWcuIDEKKyAqLworICAgIGxpICAgICAgcjMsIDB4MDAxZiAgICAgICAgICAvKiBnZXQgYmFuayBzaXplIGZyb20gc3BkIGJhbmswLzEgKi8KKyAgICBibCAgICAgIHNwZFJlYWQKKworICAgIGFuZGkuICAgcjMsIHIzLCAweDAwMzgKKyAgICBiZXEgICAgIFNEMTZNQjJCCisKKyAgICBsaSAgICAgIHIzLCAweDAwMTEgICAgICAgICAgLyogZ2V0IG51bWJlciBvZiBpbnRlcm5hbCBiYW5rcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcm9tIHNwZCBmb3IgYmFuazAvMSAqLworICAgIGJsICAgICAgc3BkUmVhZAorCisgICAgY21wbGkgICAwLCAwLCByMywgMHgwMgorICAgIGJlcSAgICAgU0Q2NE1CMkIKKworICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MDQKKyAgICBiZXEgICAgIFNENjRNQjRCCisKKyAgICBsaSAgICAgIHI2LCAweGUwICAgICAgICAgICAgLyogZXJyb3IgY29kZXMgaW4gcjYgYW5kIHI3ICAqLworICAgIGxpICAgICAgcjcsIDB4MDIKKyAgICBiICAgICAgIHRvZ2dsZUVycm9yICAgICAgICAgLyogZmFpbCAtIGxvb3AgZm9yZXZlciAqLworCitTRDY0TUIyQjoKKyAgICBsaSAgICAgIHIyMCwgMHgwMDA1ICAgICAgICAgLyogNjQtTWJpdCBTRFJBTSAyIGJhbmtzICovCisgICAgYiAgICAgICBTRFJvdzJuZAorCitTRDY0TUI0QjoKKyAgICBsaSAgICAgIHIyMCwgMHgwMDAwICAgICAgICAgLyogNjQtTWJpdCBTRFJBTSA0IGJhbmtzICovCisgICAgYiAgICAgICBTRFJvdzJuZAorCitTRDE2TUIyQjoKKyAgICBsaSAgICAgIHIyMCwgMHgwMDBmICAgICAgICAgLyogMTYtTWJpdCBTRFJBTSAyIGJhbmtzICovCisKK1NEUm93Mm5kOgorICAgIGxpICAgICAgcjMsIDB4MDEwMiAgICAgICAgICAvKiBnZXQgUkFNIHR5cGUgc3BkIGZvciBiYW5rMi8zICovCisgICAgYmwgICAgICBzcGRSZWFkCisKKyAgICBjbXBsaSAgIDAsIDAsIHIzLCAweDAwMDQKKyAgICBibmUgICAgIFMyRDY0TUI0QiAgICAgICAgICAgLyogYmFuazIvMyBpc24ndCBwcmVzZW50IG9yIG5vIFNEUkFNICovCisKKyAgICBsaSAgICAgIHIzLCAweDAxMWYgICAgICAgICAgLyogZ2V0IGJhbmsgc2l6ZSBmcm9tIHNwZCBiYW5rMi8zICovCisgICAgYmwgICAgICBzcGRSZWFkCisKKyAgICBhbmRpLiAgIHIzLCByMywgMHgwMDM4CisgICAgYmVxICAgICBTMkQxNk1CMkIKKy8qCisgKiBzZXQgdGhlIE1lbW9yeSBDb25maWd1cmF0aW9uIFJlZy4gMgorICovCisgICAgbGkgICAgICByMywgMHgwMTExICAgICAgICAgIC8qIGdldCBudW1iZXIgb2YgaW50ZXJuYWwgYmFua3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJvbSBzcGQgZm9yIGJhbmsyLzMgKi8KKyAgICBibCAgICAgIHNwZFJlYWQKKworICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MDIKKyAgICBiZXEgICAgIFMyRDY0TUIyQgorCisgICAgY21wbGkgICAwLCAwLCByMywgMHgwNAorICAgIGJlcSAgICAgUzJENjRNQjRCCisKKyAgICBsaSAgICAgIHI2LCAweGUwICAgICAgICAgICAgLyogZXJyb3IgY29kZXMgaW4gcjYgYW5kIHI3ICovCisgICAgbGkgICAgICByNywgMHgwMworICAgIGIgICAgICAgdG9nZ2xlRXJyb3IgICAgICAgICAvKiBmYWlsIC0gbG9vcCBmb3JldmVyICovCisKK1MyRDY0TUIyQjoKKyAgICBvcmkgICAgIHIyMCwgcjIwLCAweDAwNTAgICAgLyogNjQtTWJpdCBTRFJBTSAyIGJhbmtzICovCisgICAgYiAgICAgICBTMkQ2NE1CNEIKKworUzJEMTZNQjJCOgorICAgIG9yaSAgICAgcjIwLCByMjAsIDB4MDBmMCAgICAvKiAxNi1NYml0IFNEUkFNIDIgYmFua3MgKi8KKworLyoKKyAqIHNldCB0aGUgTWVtb3J5IENvbmZpZ3VyYXRpb24gUmVnLiAzCisgKi8KK1MyRDY0TUI0QjoKKyAgICBsaXMgICAgIHIyMSwgMHg4NjMwICAgICAgICAgLyogQlNUT1BSRSA9IDB4ODAsIFJFRlJFQyA9IDYsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJETEFUID0gMyAqLworCisvKgorICogc2V0IHRoZSBNZW1vcnkgQ29uZmlndXJhdGlvbiBSZWcuIDQKKyAqLworICAgIGxpcyAgICAgcjIyLCAweDI0MzAgICAgICAgICAvKiBQUkVUT0FDVCA9IDIsIEFDVE9QUkUgPSA0LCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXQ0JVRiA9IDEsIFJDQlVGID0gMSAqLworICAgIG9yaSAgICAgcjIyLCByMjIsIDB4MjIyMCAgICAvKiBTRE1PREUgPSAweDAyMiwgQUNUT1JXID0gMiAqLworCisvKgorICogZ2V0IHRoZSBzaXplIG9mIGJhbmsgMC0zCisgKi8KKyAgICBsaSAgICAgIHIzLCAweDAwMWYgICAgICAgICAgLyogZ2V0IGJhbmsgc2l6ZSBmcm9tIHNwZCBiYW5rMC8xICovCisgICAgYmwgICAgICBzcGRSZWFkCisKKyAgICBybHdpbm0gIHIxNiwgcjMsIDIsIDI0LCAyOSAgLyogY2FsY3VsYXRlIHNpemUgaW4gTUJ5dGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKDEyOCBNQiBtYXguKSAqLworCisgICAgbGkgICAgICByMywgMHgwMDA1ICAgICAgICAgIC8qIGdldCBudW1iZXIgb2YgYmFua3MgZnJvbSBzcGQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGJhbmswLzEgKi8KKyAgICBibCAgICAgIHNwZFJlYWQKKworICAgIGNtcGkgICAgMCwgMCwgcjMsIDIgICAgICAgICAvKiAyIGJhbmtzID8gKi8KKyAgICBibmUgICAgIFNEUkFNbm9iYW5rMQorCisgICAgbXIgICAgICByMTcsIHIxNgorCitTRFJBTW5vYmFuazE6CisgICAgYWRkaSAgICByMywgcjEzLCAoTXNwZDIzLU1lc3NhZ2VCbG9jaykKKyAgICBibCAgICAgIFByaW50ZgorCisgICAgbGkgICAgICByMywgMHgwMTAyICAgICAgICAgIC8qIGdldCBSQU0gdHlwZSBzcGQgZm9yIGJhbmsyLzMgKi8KKyAgICBibCAgICAgIHNwZFJlYWQKKworICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MDAwMSAgICAvKiBGUE0gPyAqLworICAgIGJuZSAgICAgbm9GUE0yMyAgICAgICAgICAgICAvKiBoYW5kbGUgYXMgRURPICovCisgICAgYWRkaSAgICByMywgcjEzLCAoTW9rLU1lc3NhZ2VCbG9jaykKKyAgICBibCAgICAgIFByaW50ZgorICAgIGFkZGkgICAgcjMsIHIxMywgKE1mcG1SYW0tTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisgICAgYiAgICAgICBjb25maWdSQU1jb21tb24KK25vRlBNMjM6CisgICAgY21wbGkgICAwLCAwLCByMywgMHgwMDAyICAgIC8qIEVETyA/ICovCisgICAgYm5lICAgICBub0VETzIzCisgICAgYWRkaSAgICByMywgcjEzLCAoTW9rLU1lc3NhZ2VCbG9jaykKKyAgICBibCAgICAgIFByaW50ZgorICAgIGFkZGkgICAgcjMsIHIxMywgKE1lZG9SYW0tTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisgICAgYiAgICAgICBjb25maWdSQU1jb21tb24KK25vRURPMjM6CisgICAgY21wbGkgICAwLCAwLCByMywgMHgwMDA0ICAgIC8qIFNEUkFNID8gKi8KKyAgICBibmUgICAgbm9TRFJBTTIzCisgICAgYWRkaSAgICByMywgcjEzLCAoTW9rLU1lc3NhZ2VCbG9jaykKKyAgICBibCAgICAgIFByaW50ZgorICAgIGFkZGkgICAgcjMsIHIxMywgKE1zZFJhbS1NZXNzYWdlQmxvY2spCisgICAgYmwgICAgICBQcmludGYKKyAgICBiICAgICAgIGNvbmZpZ1NEUkFNMjMKK25vU0RSQU0yMzoKKyAgICBhZGRpICAgIHIzLCByMTMsIChNbmEtTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisgICAgYiAgICAgICBjb25maWdSQU1jb21tb24gICAgIC8qIGJhbmsyLzMgaXNuJ3QgcHJlc2VudCBvciBubyBTRFJBTSAqLworCitjb25maWdTRFJBTTIzOgorICAgIGxpICAgICAgcjMsIDB4MDExZiAgICAgICAgICAvKiBnZXQgYmFuayBzaXplIGZyb20gc3BkIGJhbmsyLzMgKi8KKyAgICBibCAgICAgIHNwZFJlYWQKKworICAgIHJsd2lubSAgcjE4LCByMywgMiwgMjQsIDI5ICAvKiBjYWxjdWxhdGUgc2l6ZSBpbiBNQnl0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoMTI4IE1CIG1heC4pICovCisKKyAgICBsaSAgICAgIHIzLCAweDAxMDUgICAgICAgICAgLyogZ2V0IG51bWJlciBvZiBiYW5rcyBmcm9tICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwZCBiYW5rMC8xICovCisgICAgYmwgICAgICBzcGRSZWFkCisKKyAgICBjbXBpICAgIDAsIDAsIHIzLCAyICAgICAgICAgLyogMiBiYW5rcyA/ICovCisgICAgYm5lICAgICBTRFJBTW5vYmFuazMKKworICAgIG1yICAgIHIxOSwgcjE4CisKK1NEUkFNbm9iYW5rMzoKKyAgICBiICAgICAgIGNvbmZpZ1JBTWNvbW1vbgorCitjb25maWdGUE06CisgICAgYWRkaSAgICByMywgcjEzLCAoTWZwbVJhbS1NZXNzYWdlQmxvY2spCisgICAgYmwgICAgICBQcmludGYKKyAgICBiICAgICAgIGNvbmZpZ0VETzAKKy8qCisgKiBzZXQgdGhlIE1lbW9yeSBDb25maWd1cmF0aW9uIFJlZy4gMQorICovCitjb25maWdFRE86CisgICAgYWRkaSAgICByMywgcjEzLCAoTWVkb1JhbS1NZXNzYWdlQmxvY2spCisgICAgYmwgICAgICBQcmludGYKK2NvbmZpZ0VETzA6CisgICAgbGlzICAgICByMjAsIE1DQ1IxX1RZUEVfRURPQGgKKworZ2V0U3BkUm93QmFuazAxOgorICAgIGxpICAgICAgcjMsIDB4MDAwMyAgICAgICAgICAvKiBnZXQgbnVtYmVyIG9mIHJvdyBiaXRzIGZyb20gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BkIGZyb20gYmFuazAvMSAqLworICAgIGJsICAgICAgc3BkUmVhZAorICAgIG9yaSAgICAgcjIwLCByMjAsIChNQ0NSMV9CSzBfOUJJVFMgfCBNQ0NSMV9CSzFfOUJJVFMpCisgICAgY21wbGkgICAwLCAwLCByMywgMHgwMDA5ICAgIC8qIGJhbmswIC0gIDkgcm93IGJpdHMgKi8KKyAgICBiZXEgICAgIGdldFNwZFJvd0JhbmsyMworCisgICAgb3JpICAgICByMjAsIHIyMCwgKE1DQ1IxX0JLMF8xMEJJVFMgfCBNQ0NSMV9CSzFfMTBCSVRTKQorICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MDAwYSAgICAvKiBiYW5rMCAtICAxMCByb3cgYml0cyAqLworICAgIGJlcSAgICAgZ2V0U3BkUm93QmFuazIzCisKKyAgICBvcmkgICAgIHIyMCwgcjIwLCAoTUNDUjFfQkswXzExQklUUyB8IE1DQ1IxX0JLMV8xMUJJVFMpCisgICAgY21wbGkgICAwLCAwLCByMywgMHgwMDBiICAgIC8qIGJhbmswIC0gIDExIHJvdyBiaXRzICovCisgICAgYmVxICAgICBnZXRTcGRSb3dCYW5rMjMKKworICAgIG9yaSAgICAgcjIwLCByMjAsIChNQ0NSMV9CSzBfMTJCSVRTIHwgTUNDUjFfQksxXzEyQklUUykKKyAgICBjbXBsaSAgIDAsIDAsIHIzLCAweDAwMGMgICAgLyogYmFuazAgLSAgMTIgcm93IGJpdHMgKi8KKyAgICBiZXEgICAgIGdldFNwZFJvd0JhbmsyMworCisgICAgY21wbGkgICAwLCAwLCByMywgMHgwMDBkICAgIC8qIGJhbmswIC0gIDEzIHJvdyBiaXRzICovCisgICAgYmVxICAgICBnZXRTcGRSb3dCYW5rMjMKKworICAgIGxpICAgICAgcjYsIDB4ZTAgICAgICAgICAgICAvKiBlcnJvciBjb2RlcyBpbiByNiBhbmQgcjcgKi8KKyAgICBsaSAgICAgIHI3LCAweDEwCisgICAgYiAgICAgICB0b2dnbGVFcnJvciAgICAgICAgIC8qIGZhaWwgLSBsb29wIGZvcmV2ZXIgKi8KKworZ2V0U3BkUm93QmFuazIzOgorICAgIGxpICAgICByMywgMHgwMTAzICAgICAgICAgICAvKiBnZXQgbnVtYmVyIG9mIHJvdyBiaXRzIGZyb20gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BkIGZvciBiYW5rMi8zICovCisgICAgYmwgICAgICBzcGRSZWFkCisKKyAgICBvcmkgICAgIHIyMCwgcjIwLCAoTUNDUjFfQksyXzlCSVRTIHwgTUNDUjFfQkszXzlCSVRTKQorICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MDAwOSAgICAvKiBiYW5rMCAtICA5IHJvdyBiaXRzICovCisgICAgYmVxICAgICB3cml0ZVJvd0JpdHMKKworICAgIG9yaSAgICAgcjIwLCByMjAsIChNQ0NSMV9CSzJfMTBCSVRTIHwgTUNDUjFfQkszXzEwQklUUykKKyAgICBjbXBsaSAgIDAsIDAsIHIzLCAweDAwMGEgICAgLyogYmFuazAgLSAgMTAgcm93IGJpdHMgKi8KKyAgICBiZXEgICAgIHdyaXRlUm93Qml0cworCisgICAgb3JpICAgICByMjAsIHIyMCwgKE1DQ1IxX0JLMl8xMUJJVFMgfCBNQ0NSMV9CSzNfMTFCSVRTKQorICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MDAwYiAgICAvKiBiYW5rMCAtICAxMSByb3cgYml0cyAqLworICAgIGJlcSAgICAgd3JpdGVSb3dCaXRzCisKKyAgICBvcmkgICAgIHIyMCwgcjIwLCAoTUNDUjFfQksyXzEyQklUUyB8IE1DQ1IxX0JLM18xMkJJVFMpCisKKy8qCisgKiBzZXQgdGhlIE1lbW9yeSBDb25maWd1cmF0aW9uIFJlZy4gMworICovCit3cml0ZVJvd0JpdHM6CisgICAgbGlzICAgICByMjEsIDB4MDAwYSAgICAgICAgIC8qIENQWCA9IDEsIFJBUzZQID0gNCAqLworICAgIG9yaSAgICAgcjIxLCByMjEsIDB4MjI5MyAgICAvKiBDQVM1ID0gMiwgQ1A0ID0gMSwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0FTMyA9IDIsIFJDRDIgPSAyLCBSUCA9IDMgKi8KKy8qCisgKiBzZXQgdGhlIE1lbW9yeSBDb25maWd1cmF0aW9uIFJlZy4gNAorICovCisgICAgbGlzICAgICByMjIsIDB4MDAxMCAgICAgICAgIC8qIGFsbCBTRFJBTSBwYXJhbWV0ZXIgMCwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0NCVUYgZmxvdyB0aHJvdWdoLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSQ0JVRiByZWdpc3RlcmVkICovCisvKgorICogZ2V0IHRoZSBzaXplIG9mIGJhbmsgMC0zCisgKi8KKyAgICBsaSAgICAgIHIzLCAweDAwMDMgICAgICAgICAgLyogZ2V0IHJvdyBiaXRzIGZyb20gc3BkICBiYW5rMC8xICovCisgICAgYmwgICAgICBzcGRSZWFkCisKKyAgICBsaSAgICAgIHIxNiwgMCAgICAgICAgICAgICAgLyogYmFuayBzaXplIGlzOiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoOCoyXnJvdyoyXmNvbHVtbikvMHgxMDAwMDAgTUIgKi8KKyAgICBvcmkgICAgIHIxNiwgcjE2LCAweDgwMDAKKyAgICBybHdubSAgIHIxNiwgcjE2LCByMywgMCwgMzEKKworICAgIGxpICAgICAgcjMsIDB4MDAwNCAgICAgICAgICAvKiBnZXQgY29sdW1uIGJpdHMgZnJvbSBzcGQgYmFuazAvMSAqLworICAgIGJsICAgICAgc3BkUmVhZAorCisgICAgcmx3bm0gICByMTYsIHIxNiwgcjMsIDAsIDMxCisKKyAgICBsaSAgICAgIHIzLCAweDAwMDUgICAgICAgICAgLyogZ2V0IG51bWJlciBvZiBiYW5rcyBmcm9tICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwZCBmb3IgYmFuazAvMSAqLworICAgIGJsICAgICAgc3BkUmVhZAorCisgICAgY21waSAgICAwLCAwLCByMywgMiAgICAgICAgIC8qIDIgYmFua3MgPyAqLworICAgIGJuZSAgICAgRURPbm9iYW5rMQorCisgICAgbXIgICAgICByMTcsIHIxNgorCitFRE9ub2JhbmsxOgorICAgIGFkZGkgICAgcjMsIHIxMywgKE1zcGQyMy1NZXNzYWdlQmxvY2spCisgICAgYmwgICAgICBQcmludGYKKworICAgIGxpICAgICAgcjMsIDB4MDEwMiAgICAgICAgICAvKiBnZXQgUkFNIHR5cGUgc3BkIGZvciBiYW5rMi8zICovCisgICAgYmwgICAgICBzcGRSZWFkCisKKyAgICBjbXBsaSAgIDAsIDAsIHIzLCAweDAwMDEgICAgLyogRlBNID8gKi8KKyAgICBibmUgICAgIG5vRlBNMjMxICAgICAgICAgICAgLyogaGFuZGxlIGFzIEVETyAqLworICAgIGFkZGkgICAgcjMsIHIxMywgKE1vay1NZXNzYWdlQmxvY2spCisgICAgYmwgICAgICBQcmludGYKKyAgICBhZGRpICAgIHIzLCByMTMsIChNZnBtUmFtLU1lc3NhZ2VCbG9jaykKKyAgICBibCAgICAgIFByaW50ZgorICAgIGIgICAgICAgRURPYmFuazIKK25vRlBNMjMxOgorICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MDAwMiAgICAvKiBFRE8gPyAqLworICAgIGJuZSAgICAgbm9FRE8yMzEKKyAgICBhZGRpICAgIHIzLCByMTMsIChNb2stTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisgICAgYWRkaSAgICByMywgcjEzLCAoTWVkb1JhbS1NZXNzYWdlQmxvY2spCisgICAgYmwgICAgICBQcmludGYKKyAgICBiICAgICAgIEVET2JhbmsyCitub0VETzIzMToKKyAgICBjbXBsaSAgIDAsIDAsIHIzLCAweDAwMDQgICAgLyogU0RSQU0gPyAqLworICAgIGJuZSAgICAgbm9TRFJBTTIzMQorICAgIGFkZGkgICAgcjMsIHIxMywgKE1vay1NZXNzYWdlQmxvY2spCisgICAgYmwgICAgICBQcmludGYKKyAgICBhZGRpICAgIHIzLCByMTMsIChNc2RSYW0tTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisgICAgYiAgICAgICBjb25maWdSQU1jb21tb24KK25vU0RSQU0yMzE6CisgICAgYWRkaSAgICByMywgcjEzLCAoTWZhaWwtTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisgICAgYiAgICAgICBjb25maWdSQU1jb21tb24gICAgIC8qIGJhbmsyLzMgaXNuJ3QgcHJlc2VudCBvciBubyBTRFJBTSAqLworCitFRE9iYW5rMjoKKyAgICBsaSAgICAgIHIzLCAweDAxMDMgICAgICAgICAgLyogZ2V0IHJvdyBiaXRzIGZyb20gc3BkIGZvciBiYW5rMi8zICovCisgICAgYmwgICAgICBzcGRSZWFkCisKKyAgICBsaSAgICAgIHIxOCwgMCAgICAgICAgICAgICAgLyogYmFuayBzaXplIGlzOiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoOCoyXnJvdyoyXmNvbHVtbikvMHgxMDAwMDAgTUIgKi8KKyAgICBvcmkgICAgIHIxOCwgcjE4LCAweDgwMDAKKyAgICBybHdubSAgIHIxOCwgcjE4LCByMywgMCwgMzEKKworICAgIGxpICAgICAgcjMsIDB4MDEwNCAgICAgICAgICAvKiBnZXQgY29sdW1uIGJpdHMgZnJvbSBzcGQgYmFuazIvMyAqLworICAgIGJsICAgICAgc3BkUmVhZAorCisgICAgcmx3bm0gICByMTgsIHIxOCwgcjMsIDAsIDMxCisKKyAgICBsaSAgICAgIHIzLCAweDAxMDUgICAgICAgICAgLyogZ2V0IG51bWJlciBvZiBiYW5rcyBmcm9tICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwZCBmb3IgYmFuazIvMyAqLworICAgIGJsICAgICAgc3BkUmVhZAorCisgICAgY21waSAgICAwLCAwLCByMywgMiAgICAgICAgIC8qIDIgYmFua3MgPyAqLworICAgIGJuZSAgICAgY29uZmlnUkFNY29tbW9uCisKKyAgICBtciAgICAgIHIxOSwgcjE4CisKK2NvbmZpZ1JBTWNvbW1vbjoKKyAgICBsaXMgICAgIHIxLCBNUEMxMDZfUkVHX0FERFJAaAorICAgIG9yaSAgICAgcjEsIHIxLCBNUEMxMDZfUkVHX0FERFJAbAorICAgIGxpcyAgICAgcjIsIE1QQzEwNl9SRUdfREFUQUBoCisgICAgb3JpICAgICByMiwgcjIsIE1QQzEwNl9SRUdfREFUQUBsCisKKyAgICBsaSAgICAgIHIwLCAwCisKKy8qCisgKiBJZiB3ZSBhcmUgYWxyZWFkeSBydW5uaW5nIGluIFJBTSAoZGVidWcgbW9kZSksIHdlIHNob3VsZAorICogTk9UIHJlc2V0IHRoZSBNRU1HTyBmbGFnLiBPdGhlcndpc2Ugd2Ugd2lsbCBzdG9wIGFsbCBtZW1vcnkKKyAqIGFjY2Vzc2VzLgorICovCisjaWZkZWYgSU5fUkFNCisgICAgbGlzICAgICByNCwgTUNDUjFfTUVNR09AaAorICAgIG9yaSAgICAgcjQsIHI0LCBNQ0NSMV9NRU1HT0BsCisgICAgb3IgICAgICByMjAsIHIyMCwgcjQKKyNlbmRpZgorCisvKgorICogc2V0IHRoZSBNZW1vcnkgQ29uZmlndXJhdGlvbiBSZWcuIDEKKyAqLworICAgIGxpcyAgICAgcjMsIE1QQzEwNl9SRUdAaCAgICAgICAgLyogc3RhcnQgYnVpbGRpbmcgbmV3IHJlZyBudW1iZXIgKi8KKyAgICBvcmkgICAgIHIzLCByMywgTVBDMTA2X01DQ1IxICAgIC8qIHJlZ2lzdGVyIG51bWJlciAweGYwICovCisgICAgc3R3YnJ4ICByMywgcjAsIHIxICAgICAgICAgICAgICAvKiB3cml0ZSB0aGlzIHZhbHVlIHRvIENPTkZJR19BRERSICovCisgICAgZWllaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgbWVtLiBhY2Nlc3MgaXMgY29tcGxldGUgKi8KKyAgICBzdHdicnggIHIyMCwgcjAsIHIyICAgICAgICAgICAgIC8qIHdyaXRlIGRhdGEgdG8gQ09ORklHX0RBVEEgKi8KKy8qCisgKiBzZXQgdGhlIE1lbW9yeSBDb25maWd1cmF0aW9uIFJlZy4gMworICovCisgICAgbGlzICAgICByMywgTVBDMTA2X1JFR0BoICAgICAgICAvKiBzdGFydCBidWlsZGluZyBuZXcgcmVnIG51bWJlciAqLworICAgIG9yaSAgICAgcjMsIHIzLCBNUEMxMDZfTUNDUjMgICAgLyogcmVnaXN0ZXIgbnVtYmVyIDB4ZjggKi8KKyAgICBzdHdicnggIHIzLCByMCwgcjEgICAgICAgICAgICAgIC8qIHdyaXRlIHRoaXMgdmFsdWUgdG8gQ09ORklHX0FERFIgKi8KKyAgICBlaWVpbyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBtZW0uIGFjY2VzcyBpcyBjb21wbGV0ZSAqLworICAgIHN0d2JyeCAgICByMjEsIHIwLCByMiAgICAgICAgICAgLyogd3JpdGUgZGF0YSB0byBDT05GSUdfREFUQSAqLworLyoKKyAqIHNldCB0aGUgTWVtb3J5IENvbmZpZ3VyYXRpb24gUmVnLiA0CisgKi8KKyAgICBsaXMgICAgIHIzLCBNUEMxMDZfUkVHQGggICAgICAgIC8qIHN0YXJ0IGJ1aWxkaW5nIG5ldyByZWcgbnVtYmVyICovCisgICAgb3JpICAgICByMywgcjMsIE1QQzEwNl9NQ0NSNCAgICAvKiByZWdpc3RlciBudW1iZXIgMHhmYyAqLworICAgIHN0d2JyeCAgcjMsIHIwLCByMSAgICAgICAgICAgICAgLyogd3JpdGUgdGhpcyB2YWx1ZSB0byBDT05GSUdfQUREUiAqLworICAgIGVpZWlvICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIG1lbS4gYWNjZXNzIGlzIGNvbXBsZXRlICovCisgICAgc3R3YnJ4ICByMjIsIHIwLCByMiAgICAgICAgICAgICAvKiB3cml0ZSBkYXRhIHRvIENPTkZJR19EQVRBICovCisvKgorICogc2V0IHRoZSBtZW1vcnkgYm91bmRhcnkgcmVnaXN0ZXJzIGZvciBiYW5rIDAtMworICovCisgICAgbGkgICAgICByMjAsIDAKKyAgICBsaSAgICAgIHIyMywgMAorICAgIGxpICAgICAgcjI0LCAwCisgICAgc3ViaSAgICByMjEsIHIxNiwgMSAgICAgICAgIC8qIGNhbGN1bGF0ZSBlbmQgYWRkcmVzcyBiYW5rMCAqLworICAgIGxpICAgICAgcjIyLCAoTUJFUl9CQU5LMCkKKworICAgIGNtcGkgICAgMCwgMCwgcjE3LCAwICAgICAgICAvKiBiYW5rMSBwcmVzZW50ID8gKi8KKyAgICBiZXEgICAgIG5vYmFuazEKKworICAgIHJsd2lubSAgcjMsIHIxNiwgOCwgMTYsIDIzICAvKiBjYWxjdWxhdGUgc3RhcnQgYWRkcmVzcyBvZiBiYW5rMSAqLworICAgIG9yICAgICAgcjIwLCByMjAsIHIzCisgICAgYWRkICAgICByMTYsIHIxNiwgcjE3ICAgICAgIC8qIGFkZCB0byB0b3RhbCBtZW1vcnkgc2l6ZSAqLworICAgIHN1YmkgICAgcjMsIHIxNiwgMSAgICAgICAgICAvKiBjYWxjdWxhdGUgZW5kIGFkZHJlc3Mgb2YgYmFuazEgKi8KKyAgICBybHdpbm0gIHIzLCByMywgOCwgMTYsIDIzCisgICAgb3IgICAgICByMjEsIHIyMSwgcjMKKyAgICBvcmkgICAgIHIyMiwgcjIyLCAoTUJFUl9CQU5LMSkgICAgICAvKiBlbmFibGUgYmFuazEgKi8KKyAgICBiICAgICAgIGJhbmsyCisKK25vYmFuazE6CisgICAgb3JpICAgICByMjMsIHIyMywgMHgwMzAwICAgIC8qIHNldCBiYW5rMSBzdGFydCB0byB1bnVzZWQgYXJlYSAqLworICAgIG9yaSAgICAgcjI0LCByMjQsIDB4MDMwMCAgICAvKiBzZXQgYmFuazEgZW5kIHRvIHVudXNlZCBhcmVhICovCisKK2JhbmsyOgorICAgIGNtcGkgICAgMCwgMCwgcjE4LCAwICAgICAgICAvKiBiYW5rMiBwcmVzZW50ID8gKi8KKyAgICBiZXEgICAgIG5vYmFuazIKKworICAgIGFuZGkuICAgcjMsIHIxNiwgMHgwMGZmICAgICAvKiBjYWxjdWxhdGUgc3RhcnQgYWRkcmVzcyBvZiBiYW5rMiAqLworICAgIGFuZGkuICAgcjQsIHIxNiwgMHgwMzAwCisgICAgcmx3aW5tICByMywgcjMsIDE2LCA4LCAxNQorICAgIG9yICAgICAgcjIwLCByMjAsIHIzCisgICAgcmx3aW5tICByMywgcjQsIDgsIDgsIDE1CisgICAgb3IgICAgICByMjMsIHIyMywgcjMKKyAgICBhZGQgICAgIHIxNiwgcjE2LCByMTggICAgICAgLyogYWRkIHRvIHRvdGFsIG1lbW9yeSBzaXplICovCisgICAgc3ViaSAgICByMywgcjE2LCAxICAgICAgICAgIC8qIGNhbGN1bGF0ZSBlbmQgYWRkcmVzcyBvZiBiYW5rMiAqLworICAgIGFuZGkuICAgcjQsIHIzLCAweDAzMDAKKyAgICBhbmRpLiAgIHIzLCByMywgMHgwMGZmCisgICAgcmx3aW5tICByMywgcjMsIDE2LCA4LCAxNQorICAgIG9yICAgICAgcjIxLCByMjEsIHIzCisgICAgcmx3aW5tICByMywgcjQsIDgsIDgsIDE1CisgICAgb3IgICAgICByMjQsIHIyNCwgcjMKKyAgICBvcmkgICAgIHIyMiwgcjIyLCAoTUJFUl9CQU5LMikgICAgLyogZW5hYmxlIGJhbmsyICovCisgICAgYiAgICAgICBiYW5rMworCitub2JhbmsyOgorICAgIGxpcyAgICAgcjMsIDB4MDAwMworICAgIG9yICAgICAgcjIzLCByMjMsIHIzICAgICAgICAvKiBzZXQgYmFuazIgc3RhcnQgdG8gdW51c2VkIGFyZWEgKi8KKyAgICBvciAgICAgIHIyNCwgcjI0LCByMyAgICAgICAgLyogc2V0IGJhbmsyIGVuZCB0byB1bnVzZWQgYXJlYSAqLworCitiYW5rMzoKKyAgICBjbXBpICAgIDAsIDAsIHIxOSwgMCAgICAgICAgLyogYmFuazMgcHJlc2VudCA/ICovCisgICAgYmVxICAgICBub2JhbmszCisKKyAgICBhbmRpLiAgIHIzLCByMTYsIDB4MDBmZiAgICAgLyogY2FsY3VsYXRlIHN0YXJ0IGFkZHJlc3Mgb2YgYmFuazMgKi8KKyAgICBhbmRpLiAgIHI0LCByMTYsIDB4MDMwMAorICAgIHJsd2lubSAgcjMsIHIzLCAyNCwgMCwgNworICAgIG9yICAgICAgcjIwLCByMjAsIHIzCisgICAgcmx3aW5tICByMywgcjQsIDE2LCAwLCA3CisgICAgb3IgICAgICByMjMsIHIyMywgcjMKKyAgICBhZGQgICAgIHIxNiwgcjE2LCByMTkgICAgICAgLyogYWRkIHRvIHRvdGFsIG1lbW9yeSBzaXplICovCisgICAgc3ViaSAgICByMywgcjE2LCAxICAgICAgICAgIC8qIGNhbGN1bGF0ZSBlbmQgYWRkcmVzcyBvZiBiYW5rMyAqLworICAgIGFuZGkuICAgcjQsIHIzLCAweDAzMDAKKyAgICBhbmRpLiAgIHIzLCByMywgMHgwMGZmCisgICAgcmx3aW5tICByMywgcjMsIDI0LCAwLCA3CisgICAgb3IgICAgICByMjEsIHIyMSwgcjMKKyAgICBybHdpbm0gIHIzLCByNCwgMTYsIDAsIDcKKyAgICBvciAgICAgIHIyNCwgcjI0LCByMworICAgIG9yaSAgICAgcjIyLCByMjIsIChNQkVSX0JBTkszKSAgICAvKiBlbmFibGUgYmFuazMgKi8KKyAgICBiICAgICAgIHdyaXRlYm91bmQKKworbm9iYW5rMzoKKyAgICBsaXMgICAgIHIzLCAweDAzMDAKKyAgICBvciAgICAgIHIyMywgcjIzLCByMyAgICAgICAgLyogc2V0IGJhbmszIHN0YXJ0IHRvIHVudXNlZCBhcmVhICovCisgICAgb3IgICAgICByMjQsIHIyNCwgcjMgICAgICAgIC8qIHNldCBiYW5rMyBlbmQgdG8gdW51c2VkIGFyZWEgKi8KKword3JpdGVib3VuZDoKKyAgICBsaXMgICAgIHIzLCBNUEMxMDZfUkVHQGggICAgLyogc3RhcnQgYnVpbGRpbmcgbmV3IHJlZyBudW1iZXIgKi8KKyAgICBvcmkgICAgIHIzLCByMywgTVBDMTA2X01TQVIxICAgIC8qIHJlZ2lzdGVyIG51bWJlciAweDgwICovCisgICAgc3R3YnJ4ICByMywgcjAsIHIxICAgICAgICAgIC8qIHdyaXRlIHRoaXMgdmFsdWUgdG8gQ09ORklHX0FERFIgKi8KKyAgICBlaWVpbyAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIG1lbS4gYWNjZXNzIGlzIGNvbXBsZXRlICovCisgICAgc3R3YnJ4ICByMjAsIHIwLCByMiAgICAgICAgIC8qIHdyaXRlIGRhdGEgdG8gQ09ORklHX0RBVEEgKi8KKworICAgIGxpcyAgICAgcjMsIE1QQzEwNl9SRUdAaCAgICAvKiBzdGFydCBidWlsZGluZyBuZXcgcmVnIG51bWJlciAqLworICAgIG9yaSAgICAgcjMsIHIzLCBNUEMxMDZfTUVBUjEgICAgLyogcmVnaXN0ZXIgbnVtYmVyIDB4OTAgKi8KKyAgICBzdHdicnggIHIzLCByMCwgcjEgICAgICAgICAgLyogd3JpdGUgdGhpcyB2YWx1ZSB0byBDT05GSUdfQUREUiAqLworICAgIGVpZWlvICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgbWVtLiBhY2Nlc3MgaXMgY29tcGxldGUgKi8KKyAgICBzdHdicnggIHIyMSwgcjAsIHIyICAgICAgICAgLyogd3JpdGUgZGF0YSB0byBDT05GSUdfREFUQSAqLworCisgICAgbGlzICAgICByMywgTVBDMTA2X1JFR0BoICAgIC8qIHN0YXJ0IGJ1aWxkaW5nIG5ldyByZWcgbnVtYmVyICovCisgICAgb3JpICAgICByMywgcjMsIE1QQzEwNl9FTVNBUjEgICAgLyogcmVnaXN0ZXIgbnVtYmVyIDB4ODggKi8KKyAgICBzdHdicnggIHIzLCByMCwgcjEgICAgICAgICAgLyogd3JpdGUgdGhpcyB2YWx1ZSB0byBDT05GSUdfQUREUiAqLworICAgIGVpZWlvICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgbWVtLiBhY2Nlc3MgaXMgY29tcGxldGUgKi8KKyAgICBzdHdicnggIHIyMywgcjAsIHIyICAgICAgICAgLyogd3JpdGUgZGF0YSB0byBDT05GSUdfREFUQSAqLworCisgICAgbGlzICAgICByMywgTVBDMTA2X1JFR0BoICAgIC8qIHN0YXJ0IGJ1aWxkaW5nIG5ldyByZWcgbnVtYmVyICovCisgICAgb3JpICAgICByMywgcjMsIE1QQzEwNl9FTUVBUjEgICAgLyogcmVnaXN0ZXIgbnVtYmVyIDB4OTggKi8KKyAgICBzdHdicnggIHIzLCByMCwgcjEgICAgICAgICAgLyogd3JpdGUgdGhpcyB2YWx1ZSB0byBDT05GSUdfQUREUiAqLworICAgIGVpZWlvICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgbWVtLiBhY2Nlc3MgaXMgY29tcGxldGUgKi8KKyAgICBzdHdicnggIHIyNCwgcjAsIHIyICAgICAgICAgLyogd3JpdGUgZGF0YSB0byBDT05GSUdfREFUQSAqLworCisvKgorICogc2V0IGJvdW5kYXJpZXMgb2YgdW51c2VkIGJhbmtzIHRvIHVudXNlZCBhZGRyZXNzIHNwYWNlCisgKi8KKyAgICBsaXMgICAgIHI0LCAweDAzMDMKKyAgICBvcmkgICAgIHI0LCByNCwgMHgwMzAzICAgICAgLyogYmFuayA0LTcgc3RhcnQgYW5kIGVuZCBhZHJlc3NlcyAqLworICAgIGxpcyAgICAgcjMsIE1QQzEwNl9SRUdAaCAgICAvKiBzdGFydCBidWlsZGluZyBuZXcgcmVnIG51bWJlciAqLworICAgIG9yaSAgICAgcjMsIHIzLCBNUEMxMDZfRU1TQVIyICAgIC8qIHJlZ2lzdGVyIG51bWJlciAweDhDICovCisgICAgc3R3YnJ4ICByMywgcjAsIHIxICAgICAgICAgIC8qIHdyaXRlIHRoaXMgdmFsdWUgdG8gQ09ORklHX0FERFIgKi8KKyAgICBlaWVpbyAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIG1lbS4gYWNjZXNzIGlzIGNvbXBsZXRlICovCisgICAgc3R3YnJ4ICByNCwgcjAsIHIyICAgICAgICAgIC8qIHdyaXRlIGRhdGEgdG8gQ09ORklHX0RBVEEgKi8KKworICAgIGxpcyAgICAgcjMsIE1QQzEwNl9SRUdAaCAgICAvKiBzdGFydCBidWlsZGluZyBuZXcgcmVnIG51bWJlciAqLworICAgIG9yaSAgICAgcjMsIHIzLCBNUEMxMDZfRU1FQVIyICAgIC8qIHJlZ2lzdGVyIG51bWJlciAweDlDICovCisgICAgc3R3YnJ4ICByMywgcjAsIHIxICAgICAgICAgIC8qIHdyaXRlIHRoaXMgdmFsdWUgdG8gQ09ORklHX0FERFIgKi8KKyAgICBlaWVpbyAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIG1lbS4gYWNjZXNzIGlzIGNvbXBsZXRlICovCisgICAgc3R3YnJ4ICByNCwgcjAsIHIyICAgICAgICAgIC8qIHdyaXRlIGRhdGEgdG8gQ09ORklHX0RBVEEgKi8KKworLyoKKyAqIHNldCB0aGUgTWVtb3J5IENvbmZpZ3VyYXRpb24gUmVnLiAyCisgKi8KKyAgICBsaXMgICAgIHIzLCBNUEMxMDZfUkVHQGggICAgLyogc3RhcnQgYnVpbGRpbmcgbmV3IHJlZyBudW1iZXIgKi8KKyAgICBvcmkgICAgIHIzLCByMywgTVBDMTA2X01DQ1IyICAgIC8qIHJlZ2lzdGVyIG51bWJlciAweGY0ICovCisgICAgc3R3YnJ4ICByMywgcjAsIHIxICAgICAgICAgIC8qIHdyaXRlIHRoaXMgdmFsdWUgdG8gQ09ORklHX0FERFIgKi8KKyAgICBlaWVpbyAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIG1lbS4gYWNjZXNzIGlzIGNvbXBsZXRlICovCisKKyAgICBsaSAgICAgIHIzLCAweDAwMGMgICAgICAgICAgLyogZ2V0IHJlZnJlc2ggZnJvbSBzcGQgZm9yIGJhbmswLzEgKi8KKyAgICBibCAgICAgIHNwZFJlYWQKKworICAgIGNtcGkgICAgMCwgMCwgcjMsIC0xICAgICAgICAvKiBlcnJvciA/ICovCisgICAgYm5lICAgICBjb21tb24xCisKKyAgICBsaSAgICAgIHI2LCAweGUwICAgICAgICAgICAgLyogZXJyb3IgY29kZXMgaW4gcjYgYW5kIHI3ICAqLworICAgIGxpICAgICAgcjcsIDB4MjAKKyAgICBiICAgICAgIHRvZ2dsZUVycm9yICAgICAgICAgLyogZmFpbCAtIGxvb3AgZm9yZXZlciAqLworCitjb21tb24xOgorICAgIGFuZGkuICAgcjE1LCByMywgMHgwMDdmICAgICAvKiBtYXNrIHNlbGZyZWZyZXNoIGJpdCAqLworICAgIGxpICAgICAgcjMsIDB4MDEwYyAgICAgICAgICAvKiBnZXQgcmVmcmVzaCBmcm9tIHNwZCBmb3IgYmFuazIvMyAqLworICAgIGJsICAgICAgc3BkUmVhZAorCisgICAgY21waSAgICAwLCAwLCByMywgLTEgICAgICAgIC8qIGVycm9yID8gKi8KKyAgICBiZXEgICAgIGNvbW1vbjIKKyAgICBhbmRpLiAgIHIzLCByMywgMHgwMDdmICAgICAgLyogbWFzayBzZWxmcmVmcmVzaCBiaXQgKi8KKyAgICBjbXAgICAgIDAsIDAsIHIzLCByMTUgICAgICAgLyogZmluZCB0aGUgbG93ZXIgKi8KKyAgICBibHQgICAgIGNvbW1vbjMKKworY29tbW9uMjoKKyAgICBtciAgICAgIHIzLCByMTUKKworY29tbW9uMzoKKyAgICBsaSAgICAgIHI0LCAweDEwMTAgICAgICAgICAgLyogcmVmZXNoIGN5Y2xlIDEwMjggY2xvY2tzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBsZWZ0IHNoaWZ0ZWQgMiAqLworICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MDAwMCAgICAvKiAxNS42IHVzID8gKi8KKyAgICBiZXEgICAgIHdyaXRlUmVmcmVzaAorCisgICAgbGkgICAgICByNCwgMHgwODA4ICAgICAgICAgIC8qIHJlZmVzaCBjeWNsZSA1MTQgY2xvY2tzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlZnQgc2hpZnRlZCAyICovCisgICAgY21wbGkgICAwLCAwLCByMywgMHgwMDAyICAgIC8qIDcuOCB1cyA/ICovCisgICAgYmVxICAgICB3cml0ZVJlZnJlc2gKKworICAgIGxpICAgICAgcjQsIDB4MjAyMCAgICAgICAgICAvKiByZWZlc2ggY3ljbGUgMjA1NiBjbG9ja3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVmdCBzaGlmdGVkIDIgKi8KKyAgICBjbXBsaSAgIDAsIDAsIHIzLCAweDAwMDMgICAgLyogMzEuMyB1cyA/ICovCisgICAgYmVxICAgICB3cml0ZVJlZnJlc2gKKworICAgIGxpICAgICAgcjQsIDB4NDA0MCAgICAgICAgICAvKiByZWZlc2ggY3ljbGUgNDExMiBjbG9ja3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVmdCBzaGlmdGVkIDIgKi8KKyAgICBjbXBsaSAgIDAsIDAsIHIzLCAweDAwMDQgICAgLyogNjIuNSB1cyA/ICovCisgICAgYmVxICAgICB3cml0ZVJlZnJlc2gKKworICAgIGxpICAgICAgcjQsIDAKKyAgICBvcmkgICAgIHI0LCByNCwgMHg4MDgwICAgICAgLyogcmVmZXNoIGN5Y2xlIDgyMjQgY2xvY2tzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlZnQgc2hpZnRlZCAyICovCisgICAgY21wbGkgICAwLCAwLCByMywgMHgwMDA1ICAgIC8qIDEyNSB1cyA/ICovCisgICAgYmVxICAgICB3cml0ZVJlZnJlc2gKKworICAgIGxpICAgICAgcjYsIDB4ZTAgICAgICAgICAgICAvKiBlcnJvciBjb2RlcyBpbiByNiBhbmQgcjcgKi8KKyAgICBsaSAgICAgIHI3LCAweDIxCisgICAgYiAgICAgICB0b2dnbGVFcnJvciAgICAgICAgIC8qIGZhaWwgLSBsb29wIGZvcmV2ZXIgKi8KKword3JpdGVSZWZyZXNoOgorICAgIHN0d2JyeCAgcjQsIHIwLCByMiAgICAgICAgICAvKiB3cml0ZSBkYXRhIHRvIENPTkZJR19EQVRBICovCisKKy8qCisgKiBEUkFNIEJBTktTIFNIT1VMRCBCRSBFTkFCTEVECisgKi8KKyAgICBhZGRpICAgIHIzLCByMTMsIChNYWN0aXZhdGUtTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisgICAgbXIgICAgICByMywgcjE2CisgICAgYmwgICAgICBPdXREZWMKKyAgICBhZGRpICAgIHIzLCByMTMsIChNbWJ5dGUtTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisKKyAgICBsaXMgICAgIHIzLCBNUEMxMDZfUkVHQGggICAgLyogc3RhcnQgYnVpbGRpbmcgbmV3IHJlZyBudW1iZXIgKi8KKyAgICBvcmkgICAgIHIzLCByMywgTVBDMTA2X01CRVIgLyogcmVnaXN0ZXIgbnVtYmVyIDB4YTAgKi8KKyAgICBzdHdicnggIHIzLCByMCwgcjEgICAgICAgICAgLyogd3JpdGUgdGhpcyB2YWx1ZSB0byBDT05GSUdfQUREUiAqLworICAgIGVpZWlvICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgbWVtLiBhY2Nlc3MgaXMgY29tcGxldGUgKi8KKyAgICBzdGIgICAgIHIyMiwgMChyMikgICAgICAgICAgLyogd3JpdGUgZGF0YSB0byBDT05GSUdfREFUQSAqLworICAgIGxpICAgICAgcjgsIDB4NjMgICAgICAgICAgICAvKiBQR01BWCA9IDk5ICovCisgICAgc3RiICAgICByOCwgMyhyMikgICAgICAgICAgIC8qIHdyaXRlIGRhdGEgdG8gQ09ORklHX0RBVEEgKi8KKworLyoKKyAqICBEUkFNIFNIT1VMRCBOT1cgQkUgQ09ORklHVVJFRCBBTkQgRU5BQkxFRAorICogIE1VU1QgV0FJVCAyMDB1cyBCRUZPUkUgQUNDRVNTSU5HCisgKi8KKyAgICBsaSAgICAgIHIwLCAweDc4MDAKKyAgICBtdGN0ciAgIHIwCisKK3dhaXQyMDB1czoKKyAgICBiZG56ICAgIHdhaXQyMDB1cworCisgICAgbGlzICAgICByMywgTVBDMTA2X1JFR0BoICAgIC8qIHN0YXJ0IGJ1aWxkaW5nIG5ldyByZWcgbnVtYmVyICovCisgICAgb3JpICAgICByMywgcjMsIE1QQzEwNl9NQ0NSMSAgICAvKiByZWdpc3RlciBudW1iZXIgMHhmMCAqLworICAgIHN0d2JyeCAgcjMsIHIwLCByMSAgICAgICAgICAvKiB3cml0ZSB0aGlzIHZhbHVlIHRvIENPTkZJR19BRERSICovCisgICAgZWllaW8gICAgICAgICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBtZW0uIGFjY2VzcyBpcyBjb21wbGV0ZSAqLworCisgICAgbHdicnggICByNCwgcjAsIHIyICAgICAgICAgIC8qIGxvYWQgcjQgZnJvbSBDT05GSUdfREFUQSAqLworCisgICAgbGlzICAgICByMCwgTUNDUjFfTUVNR09AaCAgIC8qIE1FTUdPPTEgKi8KKyAgICBvcmkgICAgIHIwLCByMCwgTUNDUjFfTUVNR09AbAorICAgIG9yICAgICAgcjQsIHI0LCByMCAgICAgICAgICAvKiBzZXQgdGhlIE1FTUdPIGJpdCAqLworICAgIHN0d2JyeCAgcjQsIHIwLCByMiAgICAgICAgICAvKiB3cml0ZSBtZGZkIGRhdGEgdG8gQ09ORklHX0RBVEEgKi8KKworICAgIGxpICAgICAgcjAsIDB4NzAwMAorICAgIG10Y3RyICAgcjAKKword2FpdDhyZWY6CisgICAgYmRueiAgICB3YWl0OHJlZgorCisgICAgYWRkaSAgICByMywgcjEzLCAoTW9rLU1lc3NhZ2VCbG9jaykKKyAgICBibCAgICAgIFByaW50ZgorCisgICAgbXRsciAgICByMjUKKyAgICBibHIKKworLyoKKyAqIEluZmluaXRlIGxvb3AgY2FsbGVkIGluIGNhc2Ugb2YgYW4gZXJyb3IgZHVyaW5nIFJBTSBpbml0aWFsaXNhdGlvbi4KKyAqIGVycm9yIGNvZGVzIGluIHI2IGFuZCByNy4KKyAqLwordG9nZ2xlRXJyb3I6CisgICAgbGkgICAgICByMCwgMAorICAgIGxpcyAgICAgcjksIDEyNworICAgIG9yaSAgICAgcjksIHI5LCA2NTUzNQordG9nZ2xlRXJyb3IxOgorICAgIGFkZGljICAgcjAsIHIwLCAxCisgICAgY21wdyAgICBjcjEsIHIwLCByOQorICAgIGJsZSAgICAgY3IxLCB0b2dnbGVFcnJvcjEKKyAgICBsaSAgICAgIHIwLCAwCisgICAgbGlzICAgICByOSwgMTI3CisgICAgb3JpICAgICByOSwgcjksIDY1NTM1Cit0b2dnbGVFcnJvcjI6CisgICAgYWRkaWMgICByMCwgcjAsIDEKKyAgICBjbXB3ICAgIGNyMSwgcjAsIHI5CisgICAgYmxlICAgICBjcjEsIHRvZ2dsZUVycm9yMgorICAgIGIgICAgICAgdG9nZ2xlRXJyb3IKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgYmFzaWMgaW5pdGlhbGlzYXRpb24gb2YgdGhlIHN1cGVyaW8gY2hpcAorICogdG8gZW5hYmxlIGJhc2ljIGNvbnNvbGUgb3V0cHV0IGFuZCBTUEQgYWNjZXNzIGR1cmluZyBSQU0gaW5pdGlhbGlzYXRpb24uCisgKgorICogVXBvbiBjb21wbGV0aW9uLCBTSU8gcmVzb3VyY2UgcmVnaXN0ZXJzIGFyZSBtYXBwZWQgYXMgZm9sbG93czoKKyAqIFJlc291cmNlICAgICBFbmFibGVkICAgICAgICAgQWRkcmVzcworICogVUFSVDEgICAgICAgIFllcyAgICAgICAgICAgICAzRjgtM0ZGIENPTTEKKyAqIFVBUlQyICAgICAgICBZZXMgICAgICAgICAgICAgMkY4LTJGRiBDT00yCisgKiBHUElPICAgICAgICAgWWVzICAgICAgICAgICAgIDIyMC0yMjcKKyAqLworLnNldCAgICBTSU9fTFVOSU5ERVgsIDB4MDcgICAgICAvKiBTSU8gTFVOIGluZGV4IHJlZ2lzdGVyICovCisuc2V0ICAgIFNJT19DTkZHMSwgMHgyMSAgICAgICAgIC8qIFNJTyBjb25maWd1cmF0aW9uICMxIHJlZ2lzdGVyICovCisuc2V0ICAgIFNJT19QQ1NDSSwgMHgyMyAgICAgICAgIC8qIFNJTyBQQ1MgY29uZmlndXJhdGlvbiBpbmRleCByZWcgKi8KKy5zZXQgICAgU0lPX1BDU0NELCAweDI0ICAgICAgICAgLyogU0lPIFBDUyBjb25maWd1cmF0aW9uIGRhdGEgcmVnICovCisuc2V0ICAgIFNJT19BQ1RJVkFURSwgMHgzMCAgICAgIC8qIFNJTyBhY3RpdmF0ZSByZWdpc3RlciAqLworLnNldCAgICBTSU9fSU9CQVNFSEksIDB4NjAgICAgICAvKiBTSU8gSS9PIHBvcnQgYmFzZSBhZGRyZXNzLCAxNTo4ICovCisuc2V0ICAgIFNJT19JT0JBU0VMTywgMHg2MSAgICAgIC8qIFNJTyBJL08gcG9ydCBiYXNlIGFkZHJlc3MsIDc6MCAqLworLnNldCAgICBTSU9fTFVORU5BQkxFLCAweDAxICAgICAvKiBTSU8gTFVOIGVuYWJsZSAqLworCisuc2lvSW5pdDoKKyAgICBtZnNwciAgIHI3LCA4ICAgICAgICAgICAgICAgLyogc2F2ZSBsaW5rIHJlZ2lzdGVyICovCisKKy5zaW9Jbml0Xzg3MzA4OgorCisvKgorICogR2V0IGJhc2UgYWRkciBvZiBJU0EgSS9PIHNwYWNlCisgKi8KKyAgICBsaXMgICAgIHI2LCBDRkdfSVNBX0lPQGgKKyAgICBvcmkgICAgIHI2LCByNiwgQ0ZHX0lTQV9JT0BsCisKKy8qCisgKiBTZXQgb2Zmc2V0IHRvIGJhc2UgYWRkcmVzcyBmb3IgY29uZmlnIHJlZ2lzdGVycy4KKyAqLworI2lmIGRlZmluZWQoQ0ZHX05TODczMDhfQkFERFJfMHgpCisgICAgYWRkaSAgICByNCwgcjAsIDB4MDI3OQorI2VsaWYgZGVmaW5lZChDRkdfTlM4NzMwOF9CQUREUl8xMCkKKyAgICBhZGRpICAgIHI0LCByMCwgMHgwMTVDCisjZWxpZiBkZWZpbmVkKENGR19OUzg3MzA4X0JBRERSXzExKQorICAgIGFkZGkgICAgcjQsIHIwLCAweDAwMkUKKyNlbmRpZgorICAgIGFkZCAgICAgcjYsIHI2LCByNCAgICAgICAgICAvKiBhZGQgb2Zmc2V0IHRvIGJhc2UgKi8KKyAgICBvciAgICAgIHIzLCByNiwgcjYgICAgICAgICAgLyogbWFrZSBhIGNvcHkgKi8KKworLyoKKyAqIFBNQyAoTFVOIDgpCisgKi8KKyAgICBhZGRpICAgIHI0LCByMCwgU0lPX0xVTklOREVYICAgIC8qIHNlbGVjdCBQTUMgTFVOICovCisgICAgYWRkaSAgICByNSwgcjAsIDB4OAorICAgIGJsICAgICAgLnNpb19idworICAgIGFkZGkgICAgcjQsIHIwLCBTSU9fSU9CQVNFSEkgICAgLyogaW5pdGlhbGl6ZSBQTUMgYWRkcmVzcyB0byAweDQ2MCAqLworICAgIGFkZGkgICAgcjUsIHIwLCAweDA0CisgICAgYmwgICAgICAuc2lvX2J3CisgICAgYWRkaSAgICByNCwgcjAsIFNJT19JT0JBU0VMTworICAgIGFkZGkgICAgcjUsIHIwLCAweDYwCisgICAgYmwgICAgICAuc2lvX2J3CisgICAgYWRkaSAgICByNCwgcjAsIFNJT19BQ1RJVkFURSAgICAvKiBlbmFibGUgUE1DICovCisgICAgYWRkaSAgICByNSwgcjAsIFNJT19MVU5FTkFCTEUKKyAgICBibCAgICAgIC5zaW9fYncKKworICAgIGxpcyAgICAgcjgsIENGR19JU0FfSU9AaAorICAgIG9yaSAgICAgcjgsIHI4LCAweDA0NjAKKyAgICBsaSAgICAgIHI5LCAweDAzCisgICAgc3RiICAgICByOSwgMChyOCkgICAgICAgICAgICAgICAvKiBzZWxlY3QgUE1DMiByZWdpc3RlciAqLworICAgIGVpZWlvCisgICAgbGkgICAgICByOSwgMHgwMAorICAgIHN0YiAgICAgcjksIDEocjgpICAgICAgICAgICAgICAgLyogU3VwZXJJL08gY2xvY2sgc3JjOiAyNE1IeiB2aWEgWDEgKi8KKyAgICBlaWVpbworCisvKgorICogbWFwIFVBUlQxIChMVU4gNikgb3IgVUFSVDIgKExVTiA1KSB0byBDT00xICgweDNGOCkKKyAqLworICAgIGFkZGkgICAgcjQsIHIwLCBTSU9fTFVOSU5ERVggICAgLyogc2VsZWN0IENPTTEgTFVOICovCisgICAgYWRkaSAgICByNSwgcjAsIDB4NgorICAgIGJsICAgICAgLnNpb19idworCisgICAgYWRkaSAgICByNCwgcjAsIFNJT19JT0JBU0VISSAgICAvKiBpbml0aWFsaXplIENPTTEgYWRkcmVzcyB0byAweDNGOCAqLworICAgIGFkZGkgICAgcjUsIHIwLCAweDAzCisgICAgYmwgICAgICAuc2lvX2J3CisKKyAgICBhZGRpICAgIHI0LCByMCwgU0lPX0lPQkFTRUxPCisgICAgYWRkaSAgICByNSwgcjAsIDB4RjgKKyAgICBibCAgICAgIC5zaW9fYncKKworICAgIGFkZGkgICAgcjQsIHIwLCBTSU9fQUNUSVZBVEUgICAgLyogZW5hYmxlIENPTTEgKi8KKyAgICBhZGRpICAgIHI1LCByMCwgU0lPX0xVTkVOQUJMRQorICAgIGJsICAgICAgLnNpb19idworCisvKgorICogSW5pdCBDT00xIGZvciBwb2xsZWQgb3V0cHV0CisgKi8KKyAgICBsaXMgICAgIHI4LCBDRkdfSVNBX0lPQGgKKyAgICBvcmkgICAgIHI4LCByOCwgMHgwM2Y4CisgICAgbGkgICAgICByOSwgMHgwMAorICAgIHN0YiAgICAgcjksIDEocjgpICAgICAgICAgICAvKiBpbnQgZGlzYWJsZWQgKi8KKyAgICBlaWVpbworICAgIGxpICAgICAgcjksIDB4MDAKKyAgICBzdGIgICAgIHI5LCA0KHI4KSAgICAgICAgICAgLyogbW9kZW0gY3RybCAqLworICAgIGVpZWlvCisgICAgbGkgICAgICByOSwgMHg4MAorICAgIHN0YiAgICAgcjksIDMocjgpICAgICAgICAgICAvKiBsaW5rIGN0cmwsIGJhbmsgc2VsZWN0ICovCisgICAgZWllaW8KKyAgICBsaSAgICAgIHI5LCAxMTUyMDAvQ09ORklHX0JBVURSQVRFCisgICAgc3RiICAgICByOSwgMChyOCkgICAgICAgICAgIC8qIGJhdWQgcmF0ZSAoTFNCKSovCisgICAgZWllaW8KKyAgICByb3Ryd2kgIHI5LCByOSwgOAorICAgIHN0YiAgICAgcjksIDEocjgpICAgICAgICAgICAvKiBiYXVkIHJhdGUgKE1TQikgKi8KKyAgICBlaWVpbworICAgIGxpICAgICAgcjksIDB4MDMKKyAgICBzdGIgICAgIHI5LCAzKHI4KSAgICAgICAgICAgLyogOCBkYXRhIGJpdHMsIDEgc3RvcCBiaXQsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHBhcml0eSAqLworICAgIGVpZWlvCisgICAgbGkgICAgICByOSwgMHgwYgorICAgIHN0YiAgICAgcjksIDQocjgpICAgICAgICAgICAvKiBlbmFibGUgdGhlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciAqLworICAgIGVpZWlvCisKK3dhaXRFbXB0eToKKyAgICBsYnogICAgIHI5LCA1KHI4KSAgICAgICAgICAgLyogdHJhbnNtaXQgZW1wdHkgKi8KKyAgICBhbmRpLiAgIHI5LCByOSwgMHg0MAorICAgIGJlcSAgICAgd2FpdEVtcHR5CisgICAgbGkgICAgICByOSwgMHg0NworICAgIHN0YiAgICAgcjksIDMocjgpICAgICAgICAgICAvKiBzZW5kIGJyZWFrLCA4IGRhdGEgYml0cywgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiBzdG9wIGJpdHMsIG5vIHBhcml0eSAqLworICAgIGVpZWlvCisKKyAgICBsaXMgICAgIHIwLCAweDAwMDEKKyAgICBtdGN0ciAgIHIwCisKK3dhaXRDT00xOgorICAgIGx3eiAgICAgcjAsIDUocjgpICAgICAgICAgICAvKiBsb2FkIGZyb20gcG9ydCBmb3IgZGVsYXkgKi8KKyAgICBiZG56ICAgIHdhaXRDT00xCisKK3dhaXRFbXB0eTE6CisgICAgbGJ6ICAgICByOSwgNShyOCkgICAgICAgICAgIC8qIHRyYW5zbWl0IGVtcHR5ICovCisgICAgYW5kaS4gICByOSwgcjksIDB4NDAKKyAgICBiZXEgICAgIHdhaXRFbXB0eTEKKyAgICBsaSAgICAgIHI5LCAweDA3CisgICAgc3RiICAgICByOSwgMyhyOCkgICAgICAgICAgIC8qIDggZGF0YSBiaXRzLCAyIHN0b3AgYml0cywgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gcGFyaXR5ICovCisgICAgZWllaW8KKworLyoKKyAqIEdQSU8gKExVTiA3KQorICovCisgICAgYWRkaSAgICByNCwgcjAsIFNJT19MVU5JTkRFWCAgICAvKiBzZWxlY3QgR1BJTyBMVU4gKi8KKyAgICBhZGRpICAgIHI1LCByMCwgMHg3CisgICAgYmwgICAgICAuc2lvX2J3CisKKyAgICBhZGRpICAgIHI0LCByMCwgU0lPX0lPQkFTRUhJICAgIC8qIGluaXRpYWxpemUgR1BJTyBhZGRyZXNzIHRvIDB4MjIwICovCisgICAgYWRkaSAgICByNSwgcjAsIDB4MDIKKyAgICBibCAgICAgIC5zaW9fYncKKworICAgIGFkZGkgICAgcjQsIHIwLCBTSU9fSU9CQVNFTE8KKyAgICBhZGRpICAgIHI1LCByMCwgMHgyMAorICAgIGJsICAgICAgLnNpb19idworCisgICAgYWRkaSAgICByNCwgcjAsIFNJT19BQ1RJVkFURSAgICAvKiBlbmFibGUgR1BJTyAqLworICAgIGFkZGkgICAgcjUsIHIwLCBTSU9fTFVORU5BQkxFCisgICAgYmwgICAgICAuc2lvX2J3CisKKy5zaW9Jbml0X2RvbmU6CisKKy8qCisgKiBHZXQgYmFzZSBhZGRyIG9mIElTQSBJL08gc3BhY2UKKyAqLworICAgIGxpcyAgICAgcjMsIENGR19JU0FfSU9AaAorICAgIG9yaSAgICAgcjMsIHIzLCBDRkdfSVNBX0lPQGwKKworICAgIGFkZGkgICAgcjMsIHIzLCAweDAxNUMgICAgICAvKiBhZGp1c3QgdG8gc3VwZXJJL08gODczMDggYmFzZSAqLworICAgIG9yICAgICAgcjYsIHIzLCByMyAgICAgICAgICAvKiBtYWtlIGEgY29weSAqLworLyoKKyAqIENTMAorICovCisgICAgYWRkaSAgICByNCwgcjAsIFNJT19QQ1NDSSAgIC8qIHNlbGVjdCBQQ1NDSVIgKi8KKyAgICBhZGRpICAgIHI1LCByMCwgMHgwMAorICAgIGJsICAgICAgLnNpb19idworICAgIGFkZGkgICAgcjQsIHIwLCBTSU9fUENTQ0QgICAvKiBzZWxlY3QgUENTQ0RSICovCisgICAgYWRkaSAgICByNSwgcjAsIDB4MDAKKyAgICBibCAgICAgIC5zaW9fYncKKyAgICBhZGRpICAgIHI0LCByMCwgU0lPX1BDU0NJICAgLyogc2VsZWN0IFBDU0NJUiAqLworICAgIGFkZGkgICAgcjUsIHIwLCAweDAxCisgICAgYmwgICAgICAuc2lvX2J3CisgICAgYWRkaSAgICByNCwgcjAsIFNJT19QQ1NDRCAgIC8qIHNlbGVjdCBQQ1NDRFIgKi8KKyAgICBhZGRpICAgIHI1LCByMCwgMHg3NgorICAgIGJsICAgICAgLnNpb19idworICAgIGFkZGkgICAgcjQsIHIwLCBTSU9fUENTQ0kgICAvKiBzZWxlY3QgUENTQ0lSICovCisgICAgYWRkaSAgICByNSwgcjAsIDB4MDIKKyAgICBibCAgICAgIC5zaW9fYncKKyAgICBhZGRpICAgIHI0LCByMCwgU0lPX1BDU0NEICAgLyogc2VsZWN0IFBDU0NEUiAqLworICAgIGFkZGkgICAgcjUsIHIwLCAweDQwCisgICAgYmwgICAgICAuc2lvX2J3CisvKgorICogQ1MxCisgKi8KKyAgICBhZGRpICAgIHI0LCByMCwgU0lPX1BDU0NJICAgLyogc2VsZWN0IFBDU0NJUiAqLworICAgIGFkZGkgICAgcjUsIHIwLCAweDA1CisgICAgYmwgICAgICAuc2lvX2J3CisgICAgYWRkaSAgICByNCwgcjAsIFNJT19QQ1NDRCAgIC8qIHNlbGVjdCBQQ1NDRFIgKi8KKyAgICBhZGRpICAgIHI1LCByMCwgMHgwMAorICAgIGJsICAgICAgLnNpb19idworICAgIGFkZGkgICAgcjQsIHIwLCBTSU9fUENTQ0kgICAvKiBzZWxlY3QgUENTQ0lSICovCisgICAgYWRkaSAgICByNSwgcjAsIDB4MDUKKyAgICBibCAgICAgIC5zaW9fYncKKyAgICBhZGRpICAgIHI0LCByMCwgU0lPX1BDU0NEICAgLyogc2VsZWN0IFBDU0NEUiAqLworICAgIGFkZGkgICAgcjUsIHIwLCAweDcwCisgICAgYmwgICAgICAuc2lvX2J3CisgICAgYWRkaSAgICByNCwgcjAsIFNJT19QQ1NDSSAgIC8qIHNlbGVjdCBQQ1NDSVIgKi8KKyAgICBhZGRpICAgIHI1LCByMCwgMHgwNgorICAgIGJsICAgICAgLnNpb19idworICAgIGFkZGkgICAgcjQsIHIwLCBTSU9fUENTQ0QgICAvKiBzZWxlY3QgUENTQ0RSICovCisgICAgYWRkaSAgICByNSwgcjAsIDB4MUMKKyAgICBibCAgICAgIC5zaW9fYncKKy8qCisgKiBDUzIKKyAqLworICAgIGFkZGkgICAgcjQsIHIwLCBTSU9fUENTQ0kgICAvKiBzZWxlY3QgUENTQ0lSICovCisgICAgYWRkaSAgICByNSwgcjAsIDB4MDgKKyAgICBibCAgICAgIC5zaW9fYncKKyAgICBhZGRpICAgIHI0LCByMCwgU0lPX1BDU0NEICAgLyogc2VsZWN0IFBDU0NEUiAqLworICAgIGFkZGkgICAgcjUsIHIwLCAweDAwCisgICAgYmwgICAgICAuc2lvX2J3CisgICAgYWRkaSAgICByNCwgcjAsIFNJT19QQ1NDSSAgIC8qIHNlbGVjdCBQQ1NDSVIgKi8KKyAgICBhZGRpICAgIHI1LCByMCwgMHgwOQorICAgIGJsICAgICAgLnNpb19idworICAgIGFkZGkgICAgcjQsIHIwLCBTSU9fUENTQ0QgICAvKiBzZWxlY3QgUENTQ0RSICovCisgICAgYWRkaSAgICByNSwgcjAsIDB4NzEKKyAgICBibCAgICAgIC5zaW9fYncKKyAgICBhZGRpICAgIHI0LCByMCwgU0lPX1BDU0NJICAgLyogc2VsZWN0IFBDU0NJUiAqLworICAgIGFkZGkgICAgcjUsIHIwLCAweDBBCisgICAgYmwgICAgICAuc2lvX2J3CisgICAgYWRkaSAgICByNCwgcjAsIFNJT19QQ1NDRCAgIC8qIHNlbGVjdCBQQ1NDRFIgKi8KKyAgICBhZGRpICAgIHI1LCByMCwgMHgxQworICAgIGJsICAgICAgLnNpb19idworCisgICAgbXRzcHIgICA4LCByNyAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgbGluayByZWdpc3RlciAqLworICAgIGJjbHIgICAgMjAsIDAgICAgICAgICAgICAgICAvKiByZXR1cm4gdG8gY2FsbGVyICovCisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIHdyaXRlcyBhIHJlZ2lzdGVyIHRvIHRoZSBTSU8gY2hpcAorICovCisuc2lvX2J3OgorICAgIHN0YiAgICAgcjQsIDAocjMpICAgICAgICAgICAvKiB3cml0ZSBpbmRleCByZWdpc3RlciB3aXRoIHJlZ2lzdGVyIG9mZnNldCAqLworICAgIGVpZWlvCisgICAgc3luYworICAgIHN0YiAgICAgcjUsIDEocjMpICAgICAgICAgICAvKiAxc3Qgd3JpdGUgKi8KKyAgICBlaWVpbworICAgIHN5bmMKKyAgICBzdGIgICAgIHI1LCAxKHIzKSAgICAgICAgICAgLyogMm5kIHdyaXRlICovCisgICAgZWllaW8KKyAgICBzeW5jCisgICAgYmNsciAgICAyMCwgMCAgICAgICAgICAgICAgIC8qIHJldHVybiB0byBjYWxsZXIgKi8KKy8qCisgKiB0aGlzIGZ1bmN0aW9uIHJlYWRzIGEgcmVnaXN0ZXIgZnJvbSB0aGUgU0lPIGNoaXAKKyAqLworLnNpb19icjoKKyAgICBzdGIgICAgIHI0LCAwKHIzKSAgICAgICAgICAgLyogd3JpdGUgaW5kZXggcmVnaXN0ZXIgd2l0aCByZWdpc3RlciBvZmZzZXQgKi8KKyAgICBlaWVpbworICAgIHN5bmMKKyAgICBsYnogICAgIHIzLCAxKHIzKSAgICAgICAgICAgLyogcmV0cmlldmUgc3BlY2lmaWVkIHJlZyBvZmZzZXQgY29udGVudHMgKi8KKyAgICBlaWVpbworICAgIHN5bmMKKyAgICBiY2xyICAgIDIwLCAwICAgICAgICAgICAgICAgLyogcmV0dXJuIHRvIGNhbGxlciAqLworCisvKgorICogUHJpbnQgYSBtZXNzYWdlIHRvIENPTTEgaW4gcG9sbGluZyBtb2RlCisgKiByMTA9Q09NMSBwb3J0LCByMz0oY2hhciopc3RyaW5nCisgKi8KKy5nbG9ibCBQcmludGYKK1ByaW50ZjoKKyAgICBsaXMgICAgIHIxMCwgQ0ZHX0lTQV9JT0BoICAgLyogQ09NMSBwb3J0ICovCisgICAgb3JpICAgICByMTAsIHIxMCwgMHgwM2Y4CisKK1dhaXRDaHI6CisgICAgbGJ6ICAgICByMCwgNShyMTApICAgICAgICAgIC8qIHJlYWQgbGluayBzdGF0dXMgKi8KKyAgICBlaWVpbworICAgIGFuZGkuICAgcjAsIHIwLCAweDQwICAgICAgICAvKiBtYXNrIHRyYW5zbWl0dGVyIGVtcHR5IGJpdCAqLworICAgIGJlcSAgICAgY3IwLCBXYWl0Q2hyICAgICAgICAvKiB3YWl0IHRpbGwgZW1wdHkgKi8KKyAgICBsYnp4ICAgIHIwLCByMCwgcjMgICAgICAgICAgLyogZ2V0IGNoYXIgKi8KKyAgICBzdGIgICAgIHIwLCAwKHIxMCkgICAgICAgICAgLyogd3JpdGUgdG8gdHJhbnNtaXQgcmVnICovCisgICAgZWllaW8KKyAgICBhZGRpICAgIHIzLCByMywgMSAgICAgICAgICAgLyogbmV4dCBjaGFyICovCisgICAgbGJ6eCAgICByMCwgcjAsIHIzICAgICAgICAgIC8qIGdldCBjaGFyICovCisgICAgY21wd2kgICBjcjEsIHIwLCAwICAgICAgICAgIC8qIGVuZCBvZiBzdHJpbmcgPyAqLworICAgIGJuZSAgICAgY3IxLCBXYWl0Q2hyCisgICAgYmxyCisKKy8qCisgKiBQcmludCA4LzQvMiBkaWdpdHMgaGV4IHZhbHVlIHRvIENPTTEgaW4gcG9sbGluZyBtb2RlCisgKiByMTA9Q09NMSBwb3J0LCByMz12YWwKKyAqLworT3V0SGV4MjoKKyAgICBsaSAgICAgIHI5LCA0ICAgICAgICAgICAgICAgLyogc2hpZnQgcmVnIGZvciAyIGRpZ2l0cyAqLworICAgIGIgICAgICAgT0hzdGFydAorT3V0SGV4NDoKKyAgICBsaSAgICAgIHI5LCAxMiAgICAgICAgICAgICAgLyogc2hpZnQgcmVnIGZvciA0IGRpZ2l0cyAqLworICAgIGIgICAgICAgT0hzdGFydAorICAgIC5nbG9ibCBPdXRIZXgKK091dEhleDoKKyAgICBsaSAgICAgIHI5LCAyOCAgICAgICAgICAgICAgLyogc2hpZnQgcmVnIGZvciA4IGRpZ2l0cyAqLworT0hzdGFydDoKKyAgICBsaXMgICAgIHIxMCwgQ0ZHX0lTQV9JT0BoICAgLyogQ09NMSBwb3J0ICovCisgICAgb3JpICAgICByMTAsIHIxMCwgMHgwM2Y4CitPdXREaWc6CisgICAgbGJ6ICAgICByMCwgNShyMTApICAgICAgICAgIC8qIHJlYWQgbGluayBzdGF0dXMgKi8KKyAgICBlaWVpbworICAgIGFuZGkuICAgcjAsIHIwLCAweDQwICAgICAgICAvKiBtYXNrIHRyYW5zbWl0dGVyIGVtcHR5IGJpdCAqLworICAgIGJlcSAgICAgY3IwLCBPdXREaWcKKyAgICBzcmF3ICAgIHIwLCByMywgcjkKKyAgICBjbHJsd2kgIHIwLCByMCwgMjgKKyAgICBjbXB3aSAgIGNyMSwgcjAsIDkKKyAgICBibGUgICAgIGNyMSwgZGlnSXNOdW0KKyAgICBhZGRpYyAgIHIwLCByMCwgNTUKKyAgICBiICAgICAgIG5leHREaWcKK2RpZ0lzTnVtOgorICAgIGFkZGljICAgcjAsIHIwLCA0OAorbmV4dERpZzoKKyAgICBzdGIgICAgIHIwLCAwKHIxMCkgICAgICAgICAgLyogd3JpdGUgdG8gdHJhbnNtaXQgcmVnICovCisgICAgZWllaW8KKyAgICBhZGRpYy4gIHI5LCByOSwgLTQKKyAgICBiZ2UgICAgIE91dERpZworICAgIGJscgorLyoKKyAqIFByaW50IDMgZGlnaXRzIGhkZWMgdmFsdWUgdG8gQ09NMSBpbiBwb2xsaW5nIG1vZGUKKyAqIHIxMD1DT00xIHBvcnQsIHIzPXZhbCwgcjc9eDAwLCByOD14MCwgcjk9eCwgcjAsIHI2PXNjcmF0Y2gKKyAqLworLmdsb2JsIE91dERlYworT3V0RGVjOgorICAgIGxpICAgICAgcjYsIDEwCisgICAgZGl2d3UgICByMCwgcjMsIHI2ICAgICAgICAgIC8qIHIwID0gcjMgLyAxMCwgcjkgPSByMyBtb2QgMTAgKi8KKyAgICBtdWxsdyAgIHIxMCwgcjAsIHI2CisgICAgc3ViZiAgICByOSwgcjEwLCByMworCisgICAgbXIgICAgICByMywgcjAKKyAgICBkaXZ3dSAgIHIwLCByMywgcjYgICAgICAgICAgLyogcjAgPSByMyAvIDEwLCByOCA9IHIzIG1vZCAxMCAqLworICAgIG11bGx3ICAgcjEwLCByMCwgcjYKKyAgICBzdWJmICAgIHI4LCByMTAsIHIzCisKKyAgICBtciAgICAgIHIzLCByMAorICAgIGRpdnd1ICAgcjAsIHIzLCByNiAgICAgICAgICAvKiByMCA9IHIzIC8gMTAsIHI3ID0gcjMgbW9kIDEwICovCisgICAgbXVsbHcgICByMTAsIHIwLCByNgorICAgIHN1YmYgICAgcjcsIHIxMCwgcjMKKworICAgIGxpcyAgICAgcjEwLCBDRkdfSVNBX0lPQGggICAvKiBDT00xIHBvcnQgKi8KKyAgICBvcmkgICAgIHIxMCwgcjEwLCAweDAzZjgKKworICAgIG9yLiAgICAgcjcsIHI3LCByNworICAgIGJuZSAgICAgbm9ibGFuazEKKyAgICBsaSAgICAgIHIzLCAweDIwCisgICAgYiAgICAgICBPdXREZWM0CisKK25vYmxhbmsxOgorICAgIGFkZGkgICAgcjMsIHI3LCA0OCAgICAgICAgICAvKiBjb252ZXJ0IHRvIEFTQ0lJICovCisKK091dERlYzQ6CisgICAgbGJ6ICAgICByMCwgMChyMTMpICAgICAgICAgIC8qIHNsb3cgZG93biBkdW1teSByZWFkICovCisgICAgbGJ6ICAgICByMCwgNShyMTApICAgICAgICAgIC8qIHJlYWQgbGluayBzdGF0dXMgKi8KKyAgICBlaWVpbworICAgIGFuZGkuICAgcjAsIHIwLCAweDQwICAgICAgICAvKiBtYXNrIHRyYW5zbWl0dGVyIGVtcHR5IGJpdCAqLworICAgIGJlcSAgICAgY3IwLCBPdXREZWM0CisgICAgc3RiICAgICByMywgMChyMTApICAgICAgICAgIC8qIHgwMCB0byB0cmFuc21pdCAqLworICAgIGVpZWlvCisKKyAgICBvci4gICAgIHI3LCByNywgcjgKKyAgICBiZXEgICAgIE91dERlYzUKKworICAgIGFkZGkgICAgcjMsIHI4LCA0OCAgICAgICAgICAvKiBjb252ZXJ0IHRvIEFTQ0lJICovCitPdXREZWM1OgorICAgIGxieiAgICAgcjAsIDAocjEzKSAgICAgICAgICAvKiBzbG93IGRvd24gZHVtbXkgcmVhZCAqLworICAgIGxieiAgICAgcjAsIDUocjEwKSAgICAgICAgICAvKiByZWFkIGxpbmsgc3RhdHVzICovCisgICAgZWllaW8KKyAgICBhbmRpLiAgIHIwLCByMCwgMHg0MCAgICAgICAgLyogbWFzayB0cmFuc21pdHRlciBlbXB0eSBiaXQgKi8KKyAgICBiZXEgICAgIGNyMCwgT3V0RGVjNQorICAgIHN0YiAgICAgcjMsIDAocjEwKSAgICAgICAgICAvKiB4MCAgdG8gdHJhbnNtaXQgKi8KKyAgICBlaWVpbworCisgICAgYWRkaSAgICByMywgcjksIDQ4ICAgICAgICAgIC8qIGNvbnZlcnQgdG8gQVNDSUkgKi8KK091dERlYzY6CisgICAgbGJ6ICAgICByMCwgMChyMTMpICAgICAgICAgIC8qIHNsb3cgZG93biBkdW1teSByZWFkICovCisgICAgbGJ6ICAgICByMCwgNShyMTApICAgICAgICAgIC8qIHJlYWQgbGluayBzdGF0dXMgKi8KKyAgICBlaWVpbworICAgIGFuZGkuICAgcjAsIHIwLCAweDQwICAgICAgICAvKiBtYXNrIHRyYW5zbWl0dGVyIGVtcHR5IGJpdCAqLworICAgIGJlcSAgICAgY3IwLCBPdXREZWM2CisgICAgc3RiICAgICByMywgMChyMTApICAgICAgICAgIC8qIHggICB0byB0cmFuc21pdCAqLworICAgIGVpZWlvCisgICAgYmxyCisvKgorICogUHJpbnQgYSBjaGFyIHRvIENPTTEgaW4gcG9sbGluZyBtb2RlCisgKiByMTA9Q09NMSBwb3J0LCByMz1jaGFyCisgKi8KKy5nbG9ibCAgICBPdXRDaHIKK091dENocjoKKyAgICBsaXMgICAgIHIxMCwgQ0ZHX0lTQV9JT0BoICAgLyogQ09NMSBwb3J0ICovCisgICAgb3JpICAgICByMTAsIHIxMCwgMHgwM2Y4CisKK091dENocjE6CisgICAgbGJ6ICAgICByMCwgNShyMTApICAgICAgICAgIC8qIHJlYWQgbGluayBzdGF0dXMgKi8KKyAgICBlaWVpbworICAgIGFuZGkuICAgcjAsIHIwLCAweDQwICAgICAgICAvKiBtYXNrIHRyYW5zbWl0dGVyIGVtcHR5IGJpdCAqLworICAgIGJlcSAgICAgY3IwLCBPdXRDaHIxICAgICAgICAvKiB3YWl0IHRpbGwgZW1wdHkgKi8KKyAgICBzdGIgICAgIHIzLCAwKHIxMCkgICAgICAgICAgLyogd3JpdGUgdG8gdHJhbnNtaXQgcmVnICovCisgICAgZWllaW8KKyAgICBibHIKKy8qCisgKiBJbnB1dDogIHIzIGFkciB0byByZWFkCisgKiBPdXRwdXQ6IHIzIHZhbCBvciAtMSBmb3IgZXJyb3IKKyAqLworc3BkUmVhZDoKKyAgICBtZnNwciAgIHIyNiwgOCAgICAgICAgICAgICAgLyogc2F2ZSBsaW5rIHJlZ2lzdGVyICovCisKKyAgICBsaXMgICAgIHIzMCwgQ0ZHX0lTQV9JT0BoCisgICAgb3JpICAgICByMzAsIHIzMCwgMHgyMjAgICAgIC8qIEdQSU8gUG9ydCAxICovCisgICAgbGkgICAgICByNywgMHgwMAorICAgIGxpICAgICAgcjgsIDB4MTAwCisgICAgYW5kLiAgICByNSwgcjMsIHI4CisgICAgYmVxICAgICBzcGRiYW5rMAorICAgIGxpICAgICAgcjEyLCAweDA4CisgICAgbGkgICAgICByNCwgMHgxMAorICAgIGxpICAgICAgcjYsIDB4MTgKKyAgICBiICAgICAgIHNwZFJlYWQxCisKK3NwZGJhbmswOgorICAgIGxpICAgICAgcjEyLCAweDIwICAgICAgICAgICAvKiBzZXQgSTJDIGRhdGEgKi8KKyAgICBsaSAgICAgIHI0LCAweDQwICAgICAgICAgICAgLyogc2V0IEkyQyBjbG9jayAqLworICAgIGxpICAgICAgcjYsIDB4NjAgICAgICAgICAgICAvKiBzZXQgSTJDIGNsb2NrIGFuZCBkYXRhICovCisKK3NwZFJlYWQxOgorICAgIGxpICAgICAgcjgsIDB4ODAKKworICAgIGJsICAgICAgc3BkU3RhcnQgICAgICAgICAgICAvKiBhY2Nlc3MgSTJDIGJ1cyBhcyBtYXN0ZXIgKi8KKyAgICBsaSAgICAgIHIxMCwgMHhhMCAgICAgICAgICAgLyogd3JpdGUgdG8gU1BEICovCisgICAgYmwgICAgICBzcGRXcml0ZUJ5dGUKKyAgICBibCAgICAgIHNwZFJlYWRBY2sgICAgICAgICAgLyogQUNLIHJldHVybnMgaW4gcjEwICovCisgICAgY21wdyAgICBjcjAsIHIxMCwgcjcKKyAgICBibmUgICAgIEFja0VyciAgICAgICAgICAgICAgLyogcjEwIG11c3QgYmUgMCwgaWYgQUNLIHJlY2VpdmVkICovCisgICAgbXIgICAgICByMTAsIHIzICAgICAgICAgICAgIC8qIGFkciB0byByZWFkICovCisgICAgYmwgICAgICBzcGRXcml0ZUJ5dGUKKyAgICBibCAgICAgIHNwZFJlYWRBY2sKKyAgICBjbXB3ICAgIGNyMCwgcjEwLCByNworICAgIGJuZSAgICAgQWNrRXJyCisgICAgYmwgICAgICBzcGRTdGFydAorICAgIGxpICAgICAgcjEwLCAweGExICAgICAgICAgICAvKiByZWFkIGZyb20gU1BEICovCisgICAgYmwgICAgICBzcGRXcml0ZUJ5dGUKKyAgICBibCAgICAgIHNwZFJlYWRBY2sKKyAgICBjbXB3ICAgIGNyMCwgcjEwLCByNworICAgIGJuZSAgICAgQWNrRXJyCisgICAgYmwgICAgICBzcGRSZWFkQnl0ZSAgICAgICAgIC8qIHJldHVybiB2YWwgaW4gcjEwICovCisgICAgYmwgICAgICBzcGRXcml0ZUFjaworICAgIGJsICAgICAgc3BkU3RvcCAgICAgICAgICAgICAvKiByZWxlYXNlIEkyQyBidXMgKi8KKyAgICBtciAgICAgIHIzLCByMTAKKyAgICBtdHNwciAgIDgsIHIyNiAgICAgICAgICAgICAgLyogcmVzdG9yZSBsaW5rIHJlZ2lzdGVyICovCisgICAgYmxyCisvKgorICogQUNLIGVycm9yIG9jY3VycmVkCisgKi8KK0Fja0VycjoKKyAgICBibCAgICAgIHNwZFN0b3AKKyAgICBvcmMgICAgIHIzLCByMCwgcjAgICAgICAgICAgLyogcmV0dXJuIC0xICovCisgICAgbXRzcHIgICA4LCByMjYgICAgICAgICAgICAgIC8qIHJlc3RvcmUgbGluayByZWdpc3RlciAqLworICAgIGJscgorCisvKgorICogUm91dGluZXMgdG8gcmVhZCBmcm9tIFJBTSBzcGQuCisgKiByMzAgLSBHUElPIFBvcnQxIGFkZHJlc3MgaW4gYWxsIGNhc2VzLgorICogcjQgLSBjbG9jayBtYXNrIGZvciBTUEQKKyAqIHI2IC0gcG9ydCBtYXNrIGZvciBTUEQKKyAqIHIxMiAtIGRhdGEgbWFzayBmb3IgU1BECisgKi8KK3dhaXRTcGQ6CisgICAgbGkgICAgICByMCwgMHgxMDAwCisgICAgbXRjdHIgICByMAord1NwZDoKKyAgICBiZG56ICAgIHdTcGQKKyAgICBiY2xyICAgIDIwLCAwICAgICAgICAgICAgICAgLyogcmV0dXJuIHRvIGNhbGxlciAqLworCisvKgorICogZXN0YWJsaXNoIFNUQVJUIGNvbmRpdGlvbiBvbiBJMkMgYnVzCisgKi8KK3NwZFN0YXJ0OgorICAgIG1mc3ByICAgcjI3LCA4ICAgICAgICAgICAgICAvKiBzYXZlIGxpbmsgcmVnaXN0ZXIgKi8KKyAgICBzdGIgICAgIHI2LCAwKHIzMCkgICAgICAgICAgLyogc2V0IFNEQSBhbmQgU0NMICovCisgICAgZWllaW8KKyAgICBzdGIgICAgIHI2LCAxKHIzMCkgICAgICAgICAgLyogc3dpdGNoIEdQSU8gdG8gb3V0cHV0ICovCisgICAgZWllaW8KKyAgICBibCAgICAgIHdhaXRTcGQKKyAgICBzdGIgICAgIHI0LCAwKHIzMCkgICAgICAgICAgLyogcmVzZXQgU0RBICovCisgICAgZWllaW8KKyAgICBibCAgICAgIHdhaXRTcGQKKyAgICBzdGIgICAgIHI3LCAwKHIzMCkgICAgICAgICAgLyogcmVzZXQgU0NMICovCisgICAgZWllaW8KKyAgICBibCAgICAgIHdhaXRTcGQKKyAgICBtdHNwciAgIDgsIHIyNworICAgIGJjbHIgICAgMjAsIDAgICAgICAgICAgICAgICAvKiByZXR1cm4gdG8gY2FsbGVyICovCisKKy8qCisgKiBlc3RhYmxpc2ggU1RPUCBjb25kaXRpb24gb24gSTJDIGJ1cworICovCitzcGRTdG9wOgorICAgIG1mc3ByICAgcjI3LCA4ICAgICAgICAgICAgICAvKiBzYXZlIGxpbmsgcmVnaXN0ZXIgKi8KKyAgICBzdGIgICAgIHI3LCAwKHIzMCkgICAgICAgICAgLyogcmVzZXQgU0NMIGFuZCBTREEgKi8KKyAgICBlaWVpbworICAgIHN0YiAgICAgcjYsIDEocjMwKSAgICAgICAgICAvKiBzd2l0Y2ggR1BJTyB0byBvdXRwdXQgKi8KKyAgICBlaWVpbworICAgIGJsICAgICAgd2FpdFNwZAorICAgIHN0YiAgICAgcjQsIDAocjMwKSAgICAgICAgICAvKiBzZXQgU0NMICovCisgICAgZWllaW8KKyAgICBibCAgICAgIHdhaXRTcGQKKyAgICBzdGIgICAgIHI2LCAwKHIzMCkgICAgICAgICAgLyogc2V0IFNEQSBhbmQgU0NMICovCisgICAgZWllaW8KKyAgICBibCAgICAgIHdhaXRTcGQKKyAgICBzdGIgICAgIHI3LCAxKHIzMCkgICAgICAgICAgLyogc3dpdGNoIEdQSU8gdG8gaW5wdXQgKi8KKyAgICBlaWVpbworICAgIG10c3ByICAgOCwgcjI3CisgICAgYmNsciAgICAyMCwgMCAgICAgICAgICAgICAgIC8qIHJldHVybiB0byBjYWxsZXIgKi8KKworc3BkUmVhZEJ5dGU6CisgICAgbWZzcHIgICByMjcsIDgKKyAgICBzdGIgICAgIHI0LCAxKHIzMCkgICAgICAgICAgLyogc2V0IEdQSU8gZm9yIFNDTCBvdXRwdXQgKi8KKyAgICBlaWVpbworICAgIGxpICAgICAgcjksIDB4MDgKKyAgICBsaSAgICAgIHIxMCwgMHgwMAorbG9vcFJCOgorICAgIHN0YiAgICAgcjcsIDAocjMwKSAgICAgICAgICAvKiByZXNldCBTREEgYW5kIFNDTCAqLworICAgIGVpZWlvCisgICAgYmwgICAgICB3YWl0U3BkCisgICAgc3RiICAgICByNCwgMChyMzApICAgICAgICAgIC8qIHNldCBTQ0wgKi8KKyAgICBlaWVpbworICAgIGJsICAgICAgd2FpdFNwZAorICAgIGxieiAgICAgcjUsIDAocjMwKSAgICAgICAgICAvKiByZWFkIGZyb20gR1BJTyBQb3J0MSAqLworICAgIHJsd2lubSAgcjEwLCByMTAsIDEsIDAsIDMxCisgICAgYW5kLiAgICByNSwgcjUsIHIxMgorICAgIGJlcSAgICAgY2xlYXJCaXQKKyAgICBvcmkgICAgIHIxMCwgcjEwLCAweDAxICAgICAgLyogYXBwZW5kIF8xXyAqLworY2xlYXJCaXQ6CisgICAgc3RiICAgICByNywgMChyMzApICAgICAgICAgIC8qIHJlc2V0IFNDTCAqLworICAgIGVpZWlvCisgICAgYmwgICAgICB3YWl0U3BkCisgICAgYWRkaWMuICByOSwgcjksIC0xCisgICAgYm5lICAgICBsb29wUkIKKyAgICBtdHNwciAgIDgsIHIyNworICAgIGJjbHIgICAgMjAsIDAgICAgICAgICAgICAgICAvKiByZXR1cm4gKHIxMCkgdG8gY2FsbGVyICovCisKKy8qCisgKiBzcGRXcml0ZUJ5dGUgd3JpdGVzIGJpdHMgMjQgLSAzMSBvZiByMTAgdG8gSTJDLgorICogcjggY29udGFpbnMgYml0IG1hc2sgMHg4MAorICovCitzcGRXcml0ZUJ5dGU6CisgICAgbWZzcHIgICByMjcsIDggICAgICAgICAgICAgIC8qIHNhdmUgbGluayByZWdpc3RlciAqLworICAgIGxpICAgICAgcjksIDB4MDggICAgICAgICAgICAvKiB3cml0ZSBvY3RldCAqLworICAgIGFuZC4gICAgcjUsIHIxMCwgcjgKKyAgICBibmUgICAgIHNXQjEKKyAgICBzdGIgICAgIHI3LCAwKHIzMCkgICAgICAgICAgLyogc2V0IFNEQSB0byBfMF8gKi8KKyAgICBlaWVpbworICAgIGIgICAgICAgc1dCMgorc1dCMToKKyAgICBzdGIgICAgIHIxMiwgMChyMzApICAgICAgICAgLyogc2V0IFNEQSB0byBfMV8gKi8KKyAgICBlaWVpbworc1dCMjoKKyAgICBzdGIgICAgIHI2LCAxKHIzMCkgICAgICAgICAgLyogc2V0IEdQSU8gdG8gb3V0cHV0ICovCisgICAgZWllaW8KK2xvb3BXQjoKKyAgICBhbmQuICAgIHI1LCByMTAsIHI4CisgICAgYm5lICAgICBzV0IzCisgICAgc3RiICAgICByNywgMChyMzApICAgICAgICAgIC8qIHNldCBTREEgdG8gXzBfICovCisgICAgZWllaW8KKyAgICBiICAgICAgIHNXQjQKK3NXQjM6CisgICAgc3RiICAgICByMTIsIDAocjMwKSAgICAgICAgIC8qIHNldCBTREEgdG8gXzFfICovCisgICAgZWllaW8KK3NXQjQ6CisgICAgYmwgICAgICB3YWl0U3BkCisgICAgYW5kLiAgICByNSwgcjEwLCByOAorICAgIGJuZSAgICAgc1dCNQorICAgIHN0YiAgICAgcjQsIDAocjMwKSAgICAgICAgICAvKiBzZXQgU0RBIHRvIF8wXyBhbmQgU0NMICovCisgICAgZWllaW8KKyAgICBiICAgICAgIHNXQjYKK3NXQjU6CisgICAgc3RiICAgICByNiwgMChyMzApICAgICAgICAgIC8qIHNldCBTREEgdG8gXzFfIGFuZCBTQ0wgKi8KKyAgICBlaWVpbworc1dCNjoKKyAgICBibCAgICAgIHdhaXRTcGQKKyAgICBhbmQuICAgIHI1LCByMTAsIHI4CisgICAgYm5lICAgICBzV0I3CisgICAgc3RiICAgICByNywgMChyMzApICAgICAgICAgIC8qIHNldCBTREEgdG8gXzBfIGFuZCByZXNldCBTQ0wgKi8KKyAgICBlaWVpbworICAgIGIgICAgICAgc1dCOAorc1dCNzoKKyAgICBzdGIgICAgIHIxMiwgMChyMzApICAgICAgICAgLyogc2V0IFNEQSB0byBfMV8gYW5kIHJlc2V0IFNDTCAqLworICAgIGVpZWlvCitzV0I4OgorICAgIGJsICAgICAgd2FpdFNwZAorICAgIHJsd2lubSAgcjEwLCByMTAsIDEsIDAsIDMxICAvKiBuZXh0IGJpdCAqLworICAgIGFkZGljLiAgcjksIHI5LCAtMQorICAgIGJuZSAgICAgbG9vcFdCCisgICAgbXRzcHIgICA4LCByMjcKKyAgICBiY2xyICAgIDIwLCAwICAgICAgICAgICAgICAgLyogcmV0dXJuIHRvIGNhbGxlciAqLworCisvKgorICogUmVhZCBBQ0sgZnJvbSBTUEQsIHJldHVybiB2YWx1ZSBpbiByMTAKKyAqLworc3BkUmVhZEFjazoKKyAgICBtZnNwciAgIHIyNywgOCAgICAgICAgICAgICAgLyogc2F2ZSBsaW5rIHJlZ2lzdGVyICovCisgICAgc3RiICAgICByNCwgMShyMzApICAgICAgICAgIC8qIHNldCBHUElPIHRvIG91dHB1dCAqLworICAgIGVpZWlvCisgICAgc3RiICAgICByNywgMChyMzApICAgICAgICAgIC8qIHJlc2V0IFNEQSBhbmQgU0NMICovCisgICAgZWllaW8KKyAgICBibCAgICAgIHdhaXRTcGQKKyAgICBzdGIgICAgIHI0LCAwKHIzMCkgICAgICAgICAgLyogc2V0IFNDTCAqLworICAgIGVpZWlvCisgICAgYmwgICAgICB3YWl0U3BkCisgICAgbGJ6ICAgICByMTAsIDAocjMwKSAgICAgICAgIC8qIHJlYWQgR1BJTyBQb3J0IDEgYW5kIG1hc2sgU0RBICovCisgICAgYW5kICAgICByMTAsIHIxMCwgcjEyCisgICAgYmwgICAgICB3YWl0U3BkCisgICAgc3RiICAgICByNywgMChyMzApICAgICAgICAgIC8qIHJlc2V0IFNEQSBhbmQgU0NMICovCisgICAgZWllaW8KKyAgICBibCAgICAgIHdhaXRTcGQKKyAgICBtdHNwciAgIDgsIHIyNworICAgIGJjbHIgICAgMjAsIDAgICAgICAgICAgICAgICAvKiByZXR1cm4gKHIxMCkgdG8gY2FsbGVyICovCisKK3NwZFdyaXRlQWNrOgorICAgIG1mc3ByICAgcjI3LCA4CisgICAgc3RiICAgICByMTIsIDAocjMwKSAgICAgICAgIC8qIHNldCBTQ0wgKi8KKyAgICBlaWVpbworICAgIHN0YiAgICAgcjYsIDEocjMwKSAgICAgICAgICAvKiBzZXQgR1BJTyB0byBvdXRwdXQgKi8KKyAgICBlaWVpbworICAgIGJsICAgICAgd2FpdFNwZAorICAgIHN0YiAgICAgcjYsIDAocjMwKSAgICAgICAgICAvKiBTREEgYW5kIFNDTCAqLworICAgIGVpZWlvCisgICAgYmwgICAgICB3YWl0U3BkCisgICAgc3RiICAgICByMTIsIDAocjMwKSAgICAgICAgIC8qIHJlc2V0IFNDTCAqLworICAgIGVpZWlvCisgICAgYmwgICAgICB3YWl0U3BkCisgICAgbXRzcHIgICA4LCByMjcKKyAgICBiY2xyICAgIDIwLCAwICAgICAgICAgICAgICAgLyogcmV0dXJuIHRvIGNhbGxlciAqLworCitnZXRfbG5rX3JlZzoKKyAgICBtZmxyICAgIHIzICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGxpbmsgcmVnICovCisgICAgYmxyCisKKy8qCisgKiBNZXNzYWdlcyBmb3IgY29uc29sZSBvdXRwdXQKKyAqLworLmdsb2JsIE1lc3NhZ2VCbG9jaworTWVzc2FnZUJsb2NrOgorTW9rOgorICAgIC5hc2NpaSAgIk9LXDAxNVwwMTJcMDAwIgorTWZhaWw6CisgICAgLmFzY2lpICAiRkFJTEVEXDAxNVwwMTJcMDAwIgorTW5hOgorICAgIC5hc2NpaSAgIk5BXDAxNVwwMTJcMDAwIgorTWluaXRMb2dvOgorICAgIC5hc2NpaSAgIlwwMTVcMDEyKioqIEVMVEVDIEVsZWt0cm9uaWssIE1haW56ICoqKlwwMTVcMDEyIgorICAgIC5hc2NpaSAgIlwwMTVcMDEySW5pdGlhbGlzaW5nIFJBTVwwMTVcMDEyXDAwMCIKK01zcGQwMToKKyAgICAuYXNjaWkgICIgICAgICAgUmVhZGluZyBTUEQgb2YgYmFuazAvMSAuLi4uLiBcMDAwIgorTXNwZDIzOgorICAgIC5hc2NpaSAgIiAgICAgICBSZWFkaW5nIFNQRCBvZiBiYW5rMi8zIC4uLi4uIFwwMDAiCitNZnBtUmFtOgorICAgIC5hc2NpaSAgIiAgICAgICBSQU0tVHlwZTogRlBNIFwwMTVcMDEyXDAwMCIKK01lZG9SYW06CisgICAgLmFzY2lpICAiICAgICAgIFJBTS1UeXBlOiBFRE8gXDAxNVwwMTJcMDAwIgorTXNkUmFtOgorICAgIC5hc2NpaSAgIiAgICAgICBSQU0tVHlwZTogU0RSQU0gXDAxNVwwMTJcMDAwIgorTWFjdGl2YXRlOgorICAgIC5hc2NpaSAgIiAgICAgICBBY3RpdmF0aW5nIFwwMDAiCitNbWJ5dGU6CisgICAgLmFzY2lpICAiIE1CIC4uLi4uLi4uLi4gXDAwMCIKKyAgICAuYWxpZ24gIDQKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2JvYXJkL2VsdGVjL2JhYjd4eC9lbF9zcm9tLmMgYi9ib2FyZC9lbHRlYy9iYWI3eHgvZWxfc3JvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWJkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9lbHRlYy9iYWI3eHgvZWxfc3JvbS5jCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyIEVMVEVDIEVsZWt0cm9uaWsgQUcKKyAqIEZyYW5rIEdvdHRzY2hsaW5nIDxmZ290dHNjaGxpbmdAZWx0ZWMuZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgInNyb20uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgU1RBUlQgc2VxdWVuY2UKKyAqICAgICAgICBfIF9fX19fX19fXworICogIFNDTEsgIF8+ICAgICAgICAgXF9fX18KKyAqICAgICAgICBfIF9fX18KKyAqICBTRElPICBfPiAgICBcX19fX19fX19fCisgKiAgICAgICAgIDogICAgOiAgICA6CisgKi8KK3N0YXRpYyB2b2lkIGVlcFN0YXJ0ICh2b2lkKQoreworICAgIG91dDgoSTJDX0JVU19EQVQsIDB4NjApOyAgICAgLyogU0NMSyA9IGhpZ2ggIFNESU8gPSBoaWdoICovCisgICAgb3V0OChJMkNfQlVTX0RJUiwgMHg2MCk7ICAgICAvKiBzZXQgb3V0cHV0IGRpcmVjdGlvbiBmb3IgU0NMSy9TRElPICovCisgICAgdWRlbGF5KDEwKTsKKyAgICBvdXQ4KEkyQ19CVVNfREFULCAweDQwKTsgICAgIC8qIFNDTEsgPSBoaWdoICBTRElPID0gbG93ICovCisgICAgdWRlbGF5KDEwKTsKKyAgICBvdXQ4KEkyQ19CVVNfREFULCAweDAwKTsgICAgIC8qIFNDTEsgPSBsb3cgICBTRElPID0gbG93ICovCisgICAgdWRlbGF5KDEwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgU1RPUCBzZXF1ZW5jZQorICogICAgICAgICAgICAgIF9fX19fX18KKyAqICBTQ0xLICBfX19fXy8KKyAqICAgICAgICBfICAgICAgICAgX19fCisgKiAgU0RJTyAgXz5fX19fX19fLworICogICAgICAgICA6ICAgOiAgIDoKKyAqLworc3RhdGljIHZvaWQgZWVwU3RvcCAodm9pZCkKK3sKKyAgICBvdXQ4KEkyQ19CVVNfREFULCAweDAwKTsgICAgICAvKiBTQ0xLID0gbG93ICAgU0RJTyA9IGxvdyAqLworICAgIG91dDgoSTJDX0JVU19ESVIsIDB4NjApOyAgICAgIC8qIHNldCBvdXRwdXQgZGlyZWN0aW9uIGZvciBTQ0xLL1NESU8gKi8KKyAgICB1ZGVsYXkoMTApOworICAgIG91dDgoSTJDX0JVU19EQVQsIDB4NDApOyAgICAgIC8qIFNDTEsgPSBoaWdoICBTRElPID0gbG93ICovCisgICAgdWRlbGF5KDEwKTsKKyAgICBvdXQ4KEkyQ19CVVNfREFULCAweDYwKTsgICAgICAvKiBTQ0xLID0gaGlnaCAgU0RJTyA9IGhpZ2ggKi8KKyAgICB1ZGVsYXkoMTApOworICAgIG91dDgoSTJDX0JVU19ESVIsIDB4MDApOyAgICAgIC8qIHJlc2V0IHRvIGlucHV0IGRpcmVjdGlvbiAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBSZWFkIG9uZSBieXRlIGZyb20gRUVQUk9NCisgKiAgICAgICAgICAgIF9fXyAgICAgX19fICAgICBfX18gICAgIF9fXyAgICAgX19fICAgICBfX18gICAgIF9fXyAgICAgX19fCisgKiAgU0NMSyAgX19fLyAgIFxfX18vICAgXF9fXy8gICBcX19fLyAgIFxfX18vICAgXF9fXy8gICBcX19fLyAgIFxfX18vICAgXAorICogICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiAgU0RJTyAgPiAgICAgXiAgICAgICBeICAgICAgIF4gICAgICAgXiAgICAgICBeICAgICAgIF4gICAgICAgXiAgICAgICBeCisgKiAgICAgICAgOiAgOiAgIDogICA6ICAgOiAgIDogICA6ICAgOiAgIDogICA6ICAgOiAgIDogICA6ICAgOiAgIDogICA6ICAgOgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBlZXBSZWFkQnl0ZSAodm9pZCkKK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGJ1ZiA9IDB4MDA7CisgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICBvdXQ4KEkyQ19CVVNfRElSLCAweDQwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgeworICAgICAgICBvdXQ4KEkyQ19CVVNfREFULCAweDAwKTsgICAgLyogU0NMSyA9IGxvdyAgIFNESU8gPSBoaWdoICovCisgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIG91dDgoSTJDX0JVU19EQVQsIDB4NDApOyAgICAvKiBTQ0xLID0gaGlnaCAgU0RJTyA9IGhpZ2ggKi8KKyAgICAgICAgdWRlbGF5KDE1KTsKKyAgICAgICAgYnVmIDw8PSAxOworICAgICAgICBidWYgPSAoaW44KEkyQ19CVVNfREFUKSAmIDB4MjApID8gKGJ1ZiB8IDB4MDEpIDogKGJ1ZiAmIDB4RkUpOworICAgICAgICBvdXQ4KEkyQ19CVVNfREFULCAweDAwKTsgICAgLyogU0NMSyA9IGxvdyAgIFNESU8gPSBoaWdoICovCisgICAgICAgIHVkZWxheSgxMCk7CisgICAgfQorICAgIHJldHVybihidWYpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBXcml0ZSBvbmUgYnl0ZSB0byBFRVBST00KKyAqICAgICAgICAgICBfX18gICAgIF9fXyAgICAgX19fICAgICBfX18gICAgIF9fXyAgICAgX19fICAgICBfX18gICAgIF9fXworICogIFNDTEsgIF9fLyAgIFxfX18vICAgXF9fXy8gICBcX19fLyAgIFxfX18vICAgXF9fXy8gICBcX19fLyAgIFxfX18vICAgXF9fCisgKiAgICAgICAgIF9fX19fX18gX19fX19fXyBfX19fX19fIF9fX19fX18gX19fX19fXyBfX19fX19fIF9fX19fX18gX19fX19fX18KKyAqICBTRElPICBYX19fX19fX1hfX19fX19fWF9fX19fX19YX19fX19fX1hfX19fX19fWF9fX19fX19YX19fX19fX1hfX19fX19fXworICogICAgICA6ICAgNyAgIDogICA2ICAgOiAgIDUgICA6ICAgNCAgIDogICAzICAgOiAgIDIgICA6ICAgMSAgIDogICAwCisgKi8KK3N0YXRpYyB2b2lkIGVlcFdyaXRlQnl0ZSAocmVnaXN0ZXIgdW5zaWduZWQgY2hhciBidWYpCit7CisgICAgcmVnaXN0ZXIgaW50ICAgIGk7CisKKyAgICAoYnVmICYgMHg4MCkgPyBvdXQ4KEkyQ19CVVNfREFULCAweDIwKSA6IG91dDgoSTJDX0JVU19EQVQsIDB4MDApOyAgICAgLyogU0NMSyA9IGxvdyAgIFNESU8gPSBkYXRhICovCisgICAgb3V0OChJMkNfQlVTX0RJUiwgMHg2MCk7CisKKyAgICBmb3IgKGkgPSA3OyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICAgIChidWYgJiAweDgwKSA/IG91dDgoSTJDX0JVU19EQVQsIDB4MjApIDogb3V0OChJMkNfQlVTX0RBVCwgMHgwMCk7IC8qIFNDTEs9bG93ICBTRElPPWRhdGEgKi8KKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgKGJ1ZiAmIDB4ODApID8gb3V0OChJMkNfQlVTX0RBVCwgMHg2MCkgOiBvdXQ4KEkyQ19CVVNfREFULCAweDQwKTsgLyogU0NMSz1oaWdoIFNESU89ZGF0YSAqLworICAgICAgICB1ZGVsYXkoMTUpOworICAgICAgICAoYnVmICYgMHg4MCkgPyBvdXQ4KEkyQ19CVVNfREFULCAweDIwKSA6IG91dDgoSTJDX0JVU19EQVQsIDB4MDApOyAvKiBTQ0xLPWxvdyAgU0RJTz1kYXRhICovCisgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIGJ1ZiA8PD0gMTsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFJlYWQgZGF0YSBhY2tub3dsZWRnZSBvZiBFRVBST00KKyAqICAgICAgICAgICAgIF9fX19fX18KKyAqICBTQ0xLICBfX19fLyAgICAgICBcX19fCisgKiAgICAgICAgIF9fX19fX19fX19fX19fXworICogIFNESU8gID4KKyAqICAgICAgICA6ICAgOiAgIF4gICA6CisgKi8KK3N0YXRpYyBpbnQgZWVwUmVhZEFjayAodm9pZCkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgb3V0OChJMkNfQlVTX0RJUiwgMHg0MCk7CisgICAgb3V0OChJMkNfQlVTX0RBVCwgMHgwMCk7ICAgICAgICAgICAgLyogU0NMSyA9IGxvdyAgIFNESU8gPSBoaWdoICovCisgICAgdWRlbGF5KDEwKTsKKyAgICBvdXQ4KEkyQ19CVVNfREFULCAweDQwKTsgICAgICAgICAgICAvKiBTQ0xLID0gaGlnaCAgU0RJTyA9IGhpZ2ggKi8KKyAgICB1ZGVsYXkoMTApOworICAgIHJldHZhbCA9IChpbjgoSTJDX0JVU19EQVQpICYgMHgyMCkgPyBFUlJPUiA6IDA7CisgICAgdWRlbGF5KDEwKTsKKyAgICBvdXQ4KEkyQ19CVVNfREFULCAweDAwKTsgICAgICAgICAgICAvKiBTQ0xLID0gbG93ICAgU0RJTyA9IGhpZ2ggKi8KKyAgICB1ZGVsYXkoMTApOworCisgICAgcmV0dXJuKHJldHZhbCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFdyaXRlIGRhdGEgYWNrbm93bGVkZ2UgdG8gRUVQUk9NCisgKiAgICAgICAgICAgICBfX19fX19fCisgKiAgU0NMSyAgX19fXy8gICAgICAgXF9fXworICoKKyAqICBTRElPICA+X19fX19fX19fX19fX19fCisgKiAgICAgICAgOiAgIDogICAgICAgOgorICovCitzdGF0aWMgdm9pZCBlZXBXcml0ZUFjayAodW5zaWduZWQgY2hhciBhY2spCit7CisgICAgYWNrID8gb3V0OChJMkNfQlVTX0RBVCwgMHgyMCkgOiBvdXQ4KEkyQ19CVVNfREFULCAweDAwKTsgLyogU0NMSyA9IGxvdyAgIFNESU8gPSBhY2sgKi8KKyAgICBvdXQ4KEkyQ19CVVNfRElSLCAweDYwKTsKKyAgICB1ZGVsYXkoMTApOworICAgIGFjayA/IG91dDgoSTJDX0JVU19EQVQsIDB4NjApIDogb3V0OChJMkNfQlVTX0RBVCwgMHg0MCk7IC8qIFNDTEsgPSBoaWdoICBTRElPID0gYWNrICovCisgICAgdWRlbGF5KDE1KTsKKyAgICBhY2sgPyBvdXQ4KEkyQ19CVVNfREFULCAweDIwKSA6IG91dDgoSTJDX0JVU19EQVQsIDB4MDApOyAvKiBTQ0xLID0gbG93ICAgU0RJTyA9IGFjayAqLworICAgIHVkZWxheSgxMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCBieXRlcyBmcm9tIEVFUFJPTQorICovCitpbnQgZWxfc3JvbV9sb2FkIChhZGRyLCBidWYsIGNudCwgZGV2aWNlLCBibG9jaykKK3Vuc2lnbmVkIGNoYXIgYWRkcjsKK3Vuc2lnbmVkIGNoYXIgKmJ1ZjsKK2ludCBjbnQ7Cit1bnNpZ25lZCBjaGFyIGRldmljZTsKK3Vuc2lnbmVkIGNoYXIgYmxvY2s7Cit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICBmb3IgKGk9MDtpPGNudDtpKyspCisgICAgeworICAgICAgICBlZXBTdGFydCgpOworICAgICAgICBlZXBXcml0ZUJ5dGUoMHhBMCB8IGRldmljZSB8IGJsb2NrKTsKKyAgICAgICAgaWYgKGVlcFJlYWRBY2soKSA9PSBFUlJPUikKKyAgICAgICAgeworICAgICAgICAgICBlZXBTdG9wKCk7CisgICAgICAgICAgICByZXR1cm4oRVJST1IpOworICAgICAgICB9CisgICAgICAgIGVlcFdyaXRlQnl0ZShhZGRyKyspOworICAgICAgICBpZiAoZWVwUmVhZEFjaygpID09IEVSUk9SKQorICAgICAgICB7CisgICAgICAgICAgICBlZXBTdG9wKCk7CisgICAgICAgICAgICByZXR1cm4oRVJST1IpOworICAgICAgICB9CisgICAgICAgIGVlcFN0YXJ0KCk7CisKKyAgICAgICAgZWVwV3JpdGVCeXRlKDB4QTEgfCBkZXZpY2UgfCBibG9jayk7CisgICAgICAgIGlmIChlZXBSZWFkQWNrKCkgPT0gRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVlcFN0b3AoKTsKKyAgICAgICAgICAgIHJldHVybihFUlJPUik7CisgICAgICAgIH0KKworICAgICAgICAqYnVmKysgPSBlZXBSZWFkQnl0ZSgpOworICAgICAgICBlZXBXcml0ZUFjaygxKTsKKyAgICAgICAgZWVwU3RvcCgpOworCisgICAgICAgIGlmICgoYWRkciA9PSAwKSAmJiAoaSAhPSAoY250LTEpKSkgICAgLyogaXMgaXQgdGhlIHNhbWUgYmxvY2sgPyAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmxvY2sgPT0gRklSU1RfQkxPQ0spCisgICAgICAgICAgICAgICAgYmxvY2sgPSBTRUNPTkRfQkxPQ0s7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oY250KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKgorICogV3JpdGUgYnl0ZXMgdG8gRUVQUk9NCisgKgorICovCitpbnQgZWxfc3JvbV9zdG9yZSAoYWRkciwgYnVmLCBjbnQsIGRldmljZSwgYmxvY2spCit1bnNpZ25lZCBjaGFyICAgIGFkZHIsICpidWYsIGRldmljZSwgYmxvY2s7CitpbnQgICAgICAgIGNudDsKK3sKKyAgICByZWdpc3RlciBpbnQgaSwgcmV0VmFsOworCisgICAgZm9yIChpPTA7aTxjbnQ7aSsrKQorICAgIHsKKyAgICAgICAgcmV0VmFsID0gRVJST1I7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGVlcFN0YXJ0KCk7CisgICAgICAgICAgICBlZXBXcml0ZUJ5dGUoMHhBMCB8IGRldmljZSB8IGJsb2NrKTsKKyAgICAgICAgICAgIGlmICgocmV0VmFsID0gZWVwUmVhZEFjaygpKSA9PSBFUlJPUikKKyAgICAgICAgICAgICAgICBlZXBTdG9wKCk7CisgICAgICAgIH0gd2hpbGUgKHJldFZhbCA9PSBFUlJPUik7CisKKyAgICAgICAgZWVwV3JpdGVCeXRlKGFkZHIrKyk7CisgICAgICAgIGlmIChlZXBSZWFkQWNrKCkgPT0gRVJST1IpICByZXR1cm4oRVJST1IpOworCisgICAgICAgIGlmICgoYWRkciA9PSAwKSAmJiAoaSAhPSAoY250LTEpKSkgICAgLyogaXMgaXQgdGhlIHNhbWUgYmxvY2sgPyAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmxvY2sgPT0gRklSU1RfQkxPQ0spCisgICAgICAgICAgICAgICAgYmxvY2sgPSBTRUNPTkRfQkxPQ0s7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oRVJST1IpOworICAgICAgICB9CisKKyAgICAgICAgZWVwV3JpdGVCeXRlKCpidWYrKyk7CisgICAgICAgIGlmIChlZXBSZWFkQWNrKCkgPT0gRVJST1IpCisgICAgICAgICAgICByZXR1cm4oRVJST1IpOworCisgICAgICAgIGVlcFN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuKGNudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogY2FsY3VsYXRlIGNoZWNrc3VtIGZvciBFTFRFQyByZXZpc2lvbiBzcm9tCisgKi8KK3Vuc2lnbmVkIGxvbmcgZWxfc3JvbV9jaGVja3N1bSAocHRyLCBzaXplKQorcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcHRyOwordW5zaWduZWQgbG9uZyBzaXplOworeworICAgIHVfbG9uZyBmLCBhY2N1ID0gMDsKKyAgICB1X2ludCAgaTsKKyAgICB1X2NoYXIgYnl0ZTsKKworICAgIGZvciAoOyBzaXplOyBzaXplLS0pCisgICAgeworICAgICAgICBieXRlID0gKnB0cisrOworICAgICAgICBmb3IgKGkgPSA4OyBpOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGYgPSAgKChieXRlICYgMSkgXiAoYWNjdSAmIDEpKSA/IDB4ODQwODMwMDEgOiAwOworICAgICAgICAgICAgYWNjdSA+Pj0gMTsgYWNjdSBePSBmOworICAgICAgICAgICAgYnl0ZSA+Pj0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oYWNjdSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9ib2FyZC9lbHRlYy9iYWI3eHgvdS1ib290LmxkcyBiL2JvYXJkL2VsdGVjL2JhYjd4eC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMTBjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9lbHRlYy9iYWI3eHgvdS1ib290LmxkcwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogSm9zaCBIdWJlciA8aHViZXJAbWNseC5jb20+LCBNaXNzaW9uIENyaXRpY2FsIExpbnV4LCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIHUtYm9vdC5sZHMgLSBsaW5rZXIgc2NyaXB0IGZvciBVLUJvb3Qgb24gdGhlIEdhbGlsZW8gRXZhbCBCb2FyZC4KKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7CisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGNwdS83NHh4Xzd4eC9zdGFydC5vCSgudGV4dCkKKworLyogc3RvcmUgdGhlIGVudmlyb25tZW50IGluIGEgc2VwZXJhdGUgc2VjdG9yIGluIHRoZSBib290IGZsYXNoICovCisvKiAgICAuID0gZW52X29mZnNldDsgKi8KKy8qICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KSAqLworCisgICAgKigudGV4dCkKKyAgICAqKC5maXh1cCkKKyAgICAqKC5nb3QxKQorICB9CisgIF9ldGV4dCA9IC47CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgOgorICB7CisgICAgKigucm9kYXRhKQorICAgICooLnJvZGF0YTEpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+MjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKT4+MjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2VsdGVjL2VscHBjL2FzbV9pbml0LlMgYi9ib2FyZC9lbHRlYy9lbHBwYy9hc21faW5pdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjA1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9lbHRlYy9lbHBwYy9hc21faW5pdC5TCkBAIC0wLDAgKzEsODc3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxIEVMVEVDIEVsZWt0cm9uaWsgQUcKKyAqIEZyYW5rIEdvdHRzY2hsaW5nIDxmZ290dHNjaGxpbmdAZWx0ZWMuZGU+CisgKgorICogRUxURUMgRUxQUEMgUkFNIGluaXRpYWxpemF0aW9uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKyNpbmNsdWRlIDxtcGMxMDYuaD4KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisuZ2xvYmwgYm9hcmRfYXNtX2luaXQKK2JvYXJkX2FzbV9pbml0OgorCisvKgorICogc2V0dXAgcG9pbnRlciB0byBtZXNzYWdlIGJsb2NrCisgKi8KKyAgICBtZmxyICAgIHIxMyAgICAgICAgICAgICAgICAgLyogc2F2ZSBhd2F5IGxpbmsgcmVnaXN0ZXIgKi8KKyAgICBibCAgICAgIGdldF9sbmtfcmVnICAgICAgICAgLyogcjM9YWRkciBvZiBuZXh0IGluc3RydWN0aW9uICovCisgICAgc3ViaSAgICByNCwgcjMsIDggICAgICAgICAgIC8qIHI0PWJvYXJkX2FzbV9pbml0IGFkZHIgKi8KKyAgICBhZGRpICAgIHIyOSwgcjQsIChNZXNzYWdlQmxvY2stYm9hcmRfYXNtX2luaXQpCisKKy8qCisgKiBkY2FjaGVfZGlzYWJsZQorICovCisgICAgbWZzcHIgICByMywgSElEMAorICAgIGxpICAgICAgcjQsIEhJRDBfRENFCisgICAgYW5kYyAgICByMywgcjMsIHI0CisgICAgbXIgICAgICByMiwgcjMKKyAgICBvcmkgICAgIHIzLCByMywgSElEMF9EQ0kKKyAgICBzeW5jCisgICAgbXRzcHIgICBISUQwLCByMworICAgIG10c3ByICAgSElEMCwgcjIKKyAgICBpc3luYworICAgIHN5bmMKKy8qCisgKiBpY2FjaGVfZGlzYWJsZQorICovCisgICAgbWZzcHIgICByMywgSElEMAorICAgIGxpICAgICAgcjQsIDAKKyAgICBvcmkgICAgIHI0LCByNCwgSElEMF9JQ0UKKyAgICBhbmRjICAgIHIzLCByMywgcjQKKyAgICBzeW5jCisgICAgbXRzcHIgICBISUQwLCByMworLyoKKyAqIGludmFsaWRhdGUgY2FjaGVzCisgKi8KKyAgICBvcmkgICAgIHIzLCByMywgKEhJRDBfSUNFIHwgSElEMF9JQ0ZJIHwgSElEMF9EQ0kgfCBISUQwX0RDRSkKKyAgICBvciAgICAgIHI0LCByNCwgcjMKKyAgICBpc3luYworICAgIG10c3ByICAgSElEMCwgcjQKKyAgICBhbmRjICAgIHI0LCByNCwgcjMKKyAgICBpc3luYworICAgIG10c3ByICAgSElEMCwgcjQKKyAgICBpc3luYworLyoKKyAqIGljYWNoZV9lbmFibGUKKyAqLworICAgIG1mc3ByICAgcjMsIEhJRDAKKyAgICBvcmkgICAgIHIzLCByMywgKEhJRDBfSUNFIHwgSElEMF9JQ0ZJKQorICAgIHN5bmMKKyAgICBtdHNwciAgIEhJRDAsIHIzCisKKworLyoKKyAqIHNldHVwIG1lbW9yeSBjb250cm9sbGVyCisgKi8KKyAgICBsaXMgICAgIHIxLCBNUEMxMDZfUkVHX0FERFJAaAorICAgIG9yaSAgICAgcjEsIHIxLCBNUEMxMDZfUkVHX0FERFJAbAorICAgIGxpcyAgICAgcjIsIE1QQzEwNl9SRUdfREFUQUBoCisgICAgb3JpICAgICByMiwgcjIsIE1QQzEwNl9SRUdfREFUQUBsCisKKyAgICAvKiBDb25maWd1cmUgUElDUjEgKi8KKyAgICBsaXMgICAgIHIzLCBNUEMxMDZfUkVHQGgKKyAgICBvcmkgICAgIHIzLCByMywgUENJX1BJQ1IxCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHhGRjE0CisgICAgb3JpICAgICByMywgcjMsIDB4MUNDOAorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworICAgIC8qIENvbmZpZ3VyZSBQSUNSMiAqLworICAgIGxpcyAgICAgcjMsIE1QQzEwNl9SRUdAaAorICAgIG9yaSAgICAgcjMsIHIzLCBQQ0lfUElDUjIKKyAgICBzdHdicnggIHIzLCAwLCByMQorICAgIGFkZGlzICAgcjMsIHIwLCAweDAwMDAKKyAgICBvcmkgICAgIHIzLCByMywgMHgwMDAwCisgICAgZWllaW8KKyAgICBzdHdicnggIHIzLCAwLCByMgorCisgICAgLyogQ29uZmlndXJlIEVVTUJBUiAqLworICAgIGxpcyAgICAgcjMsIE1QQzEwNl9SRUdAaAorICAgIG9yaSAgICAgcjMsIHIzLCAweDAwNzggICAgICAvKiBvZmZlc3Qgb2YgRVVNQkFSIGluIFBDSSBjb25maWcgc3BhY2UgKi8KKyAgICBzdHdicnggIHIzLCAwLCByMQorICAgIGxpcyAgICAgcjMsIE1QQzEwN19FVU1CX0FERFJAaAorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworICAgIC8qIENvbmZpZ3VyZSBBZGRyZXNzIE1hcCBCIE9wdGlvbiBSZWcgKi8KKyAgICBsaXMgICAgIHIzLCBNUEMxMDZfUkVHQGgKKyAgICBvcmkgICAgIHIzLCByMywgMHgwMGUwICAgICAgLyogb2ZmZXN0IG9mIEFNQk9SIGluIFBDSSBjb25maWcgc3BhY2UgKi8KKyAgICBzdHdicnggIHIzLCAwLCByMQorICAgIGxpcyAgICAgcjMsIDAKKyAgICBlaWVpbworICAgIHN0d2JyeCAgcjMsIDAsIHIyCisKKyAgICAvKiBDb25maWd1cmUgSTJDIENvbnRyb2xsZXIgKi8KKyAgICBsaXMgICAgIHIxNCwgTVBDMTA3X0kyQ19BRERSQGggIC8qIGJhc2Ugb2YgSTJDIGNvbnRyb2xsZXIgKi8KKyAgICBvcmkgICAgIHIxNCwgcjE0LCBNUEMxMDdfSTJDX0FERFJAbAorICAgIGxpcyAgICAgcjMsIDB4MmIxMCAgICAgICAgICAvKiBJMkMgY2xvY2sgPSAxMDBNSHovMTAyNCAqLworICAgIHN0dyAgICAgcjMsIDQocjE0KQorICAgIGxpICAgICAgcjMsIDAgICAgICAgICAgICAgICAvKiBjbGVhciBhcmJpdHJhdGlvbiAqLworICAgIGVpZWlvCisgICAgc3R3ICAgICByMywgMTIocjE0KQorCisgICAgLyogQ29uZmlndXJlIE1DQ1IxICovCisgICAgbGlzICAgICByMywgTVBDMTA2X1JFR0BoCisgICAgb3JpICAgICByMywgcjMsIE1QQzEwNl9NQ0NSMQorICAgIHN0d2JyeCAgcjMsIDAsIHIxCisgICAgYWRkaXMgICByMywgcjAsIDB4MDY2MCAgICAgIC8qIGRvbid0IHNldCBNRU1HTyBub3cgISAqLworICAgIG9yaSAgICAgcjMsIHIzLCAweDAwMDAKKyAgICBlaWVpbworICAgIHN0d2JyeCAgcjMsIDAsIHIyCisKKyAgICAvKiBDb25maWd1cmUgTUNDUjIgKi8KKyAgICBsaXMgICAgIHIzLCBNUEMxMDZfUkVHQGgKKyAgICBvcmkgICAgIHIzLCByMywgTVBDMTA2X01DQ1IyCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHgwNDAwCisgICAgb3JpICAgICByMywgcjMsIDB4MTgwMAorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworCisgICAgLyogQ29uZmlndXJlIE1DQ1IzICovCisgICAgbGlzICAgICByMywgTVBDMTA2X1JFR0BoCisgICAgb3JpICAgICByMywgcjMsIE1QQzEwNl9NQ0NSMworICAgIHN0d2JyeCAgcjMsIDAsIHIxCisgICAgYWRkaXMgICByMywgcjAsIDB4MDIzMAorICAgIG9yaSAgICAgcjMsIHIzLCAweDAwMDAKKyAgICBlaWVpbworICAgIHN0d2JyeCAgcjMsIDAsIHIyCisKKyAgICAvKiBDb25maWd1cmUgTUNDUjQgKi8KKyAgICBsaXMgICAgIHIzLCBNUEMxMDZfUkVHQGgKKyAgICBvcmkgICAgIHIzLCByMywgTVBDMTA2X01DQ1I0CisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHgyNTMyCisgICAgb3JpICAgICByMywgcjMsIDB4MjIyMAorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworLyoKKyAqIGNvbmZpZ3VyZSBtZW1vcnkgaW50ZXJmYWNlIChNSUNScykKKyAqLworICAgIGFkZGlzICAgcjMsIHIwLCAweDgwMDAgICAgICAvKiBBRERSXzgwICovCisgICAgb3JpICAgICByMywgcjMsIDB4MDA4MCAgICAgIC8qIFNNRU1BREQxICovCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHhGRkZGCisgICAgb3JpICAgICByMywgcjMsIDB4NDAwMAorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworICAgIGFkZGlzICAgcjMsIHIwLCAweDgwMDAgICAgICAvKiBBRERSXzg0ICovCisgICAgb3JpICAgICByMywgcjMsIDB4MDA4NCAgICAgIC8qIFNNRU1BREQyICovCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHhGRkZGCisgICAgb3JpICAgICByMywgcjMsIDB4RkZGRgorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworICAgIGFkZGlzICAgcjMsIHIwLCAweDgwMDAgICAgICAvKiBBRERSXzg4ICovCisgICAgb3JpICAgICByMywgcjMsIDB4MDA4OCAgICAgIC8qIEVYVFNNRU0xICovCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHgwMzAzCisgICAgb3JpICAgICByMywgcjMsIDB4MDAwMAorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworICAgIGFkZGlzICAgcjMsIHIwLCAweDgwMDAgICAgICAvKiBBRERSXzhDICovCisgICAgb3JpICAgICByMywgcjMsIDB4MDA4YyAgICAgIC8qIEVYVFNNRU0yICovCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHgwMzAzCisgICAgb3JpICAgICByMywgcjMsIDB4MDMwMworICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworICAgIGFkZGlzICAgcjMsIHIwLCAweDgwMDAgICAgICAvKiBBRERSXzkwICovCisgICAgb3JpICAgICByMywgcjMsIDB4MDA5MCAgICAgIC8qIEVNRU1BREQxICovCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHhGRkZGCisgICAgb3JpICAgICByMywgcjMsIDB4N0YzRgorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworICAgIGFkZGlzICAgcjMsIHIwLCAweDgwMDAgICAgICAvKiBBRERSXzk0ICovCisgICAgb3JpICAgICByMywgcjMsIDB4MDA5NCAgICAgIC8qIEVNRU1BREQyICovCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHhGRkZGCisgICAgb3JpICAgICByMywgcjMsIDB4RkZGRgorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworICAgIGFkZGlzICAgcjMsIHIwLCAweDgwMDAgICAgICAvKiBBRERSXzk4ICovCisgICAgb3JpICAgICByMywgcjMsIDB4MDA5OCAgICAgIC8qIEVYVEVNRU0xICovCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHgwMzAzCisgICAgb3JpICAgICByMywgcjMsIDB4MDAwMAorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworICAgIGFkZGlzICAgcjMsIHIwLCAweDgwMDAgICAgICAvKiBBRERSXzlDICovCisgICAgb3JpICAgICByMywgcjMsIDB4MDA5YyAgICAgIC8qIEVYVEVNRU0yICovCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHgwMzAzCisgICAgb3JpICAgICByMywgcjMsIDB4MDMwMworICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworICAgIGFkZGlzICAgcjMsIHIwLCAweDgwMDAgICAgICAvKiBBRERSX0EwICovCisgICAgb3JpICAgICByMywgcjMsIDB4MDBhMCAgICAgIC8qIE1FTUJOS0VOICovCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBhZGRpcyAgIHIzLCByMCwgMHgwMDAwCisgICAgb3JpICAgICByMywgcjMsIDB4MDAwMworICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMywgMCwgcjIKKworLyoKKyAqIG11c3Qgd2FpdCBhdCBsZWFzdCAxMDB1cyBhZnRlciBIUkVTRVQgdG8gaXNzdWUgYSBNRU1HTworICovCisgICAgbGlzICAgICByMCwgMQorICAgIG10Y3RyICAgcjAKK21lbVN0YXJ0V2FpdDoKKyAgICBiZG56ICAgIG1lbVN0YXJ0V2FpdAorCisvKgorICogZW5hYmxlIFJBTSBPcGVyYXRpb25zIHRocm91Z2ggTUNDUjEgKE1FTUdPKQorICovCisgICAgbGlzICAgICByMywgMHg4MDAwCisgICAgb3JpICAgICByMywgcjMsIDB4MDBmMAorICAgIHN0d2JyeCAgcjMsIHIwLCByMQorICAgIHN5bmMKKyAgICBsd2JyeCAgIHIzLCAwLCByMgorICAgIGxpcyAgICAgcjAsIDB4MDAwOAorICAgIG9yICAgICAgcjMsIHIwLCByMworICAgIHN0d2JyeCAgcjMsIDAsIHIyCisgICAgc3luYworCisvKgorICogc2V0IExFRHMgZmlyc3QgdGltZQorICovCisgICAgbGkgICAgICByMywgMHgxCisgICAgbGlzICAgICByMzAsIENGR19VU1JfTEVEX0JBU0VAaAorICAgIHN0YiAgICAgcjMsIDIocjMwKQorICAgIHN5bmMKKworLyoKKyAqIGluaXQgQ09NMSBmb3IgcG9sbGVkIG91dHB1dAorICovCisgICAgbGlzICAgICByOCwgQ0ZHX05TMTY1NTBfQ09NMUBoICAvKiBDT00xIGJhc2UgYWRkcmVzcyovCisgICAgb3JpICAgICByOCwgcjgsIENGR19OUzE2NTUwX0NPTTFAbAorICAgIGxpICAgICAgcjksIDB4MDAKKyAgICBzdGIgICAgIHI5LCAxKHI4KSAgICAgICAgICAgLyogaW50IGRpc2FibGVkICovCisgICAgZWllaW8KKyAgICBsaSAgICAgIHI5LCAweDAwCisgICAgc3RiICAgICByOSwgNChyOCkgICAgICAgICAgIC8qIG1vZGVtIGN0cmwgKi8KKyAgICBlaWVpbworICAgIGxpICAgICAgcjksIDB4ODAKKyAgICBzdGIgICAgIHI5LCAzKHI4KSAgICAgICAgICAgLyogbGluayBjdHJsICovCisgICAgZWllaW8KKyAgICBsaSAgICAgIHI5LCAoQ0ZHX05TMTY1NTBfQ0xLIC8gMTYgLyBDT05GSUdfQkFVRFJBVEUpCisgICAgc3RiICAgICByOSwgMChyOCkgICAgICAgICAgIC8qIGJhdWQgcmF0ZSAoTFNCKSovCisgICAgZWllaW8KKyAgICBsaSAgICAgIHI5LCAoKENGR19OUzE2NTUwX0NMSyAvIDE2IC8gQ09ORklHX0JBVURSQVRFKSA+PiA4KQorICAgIHN0YiAgICAgcjksIDEocjgpICAgICAgICAgICAvKiBiYXVkIHJhdGUgKE1TQikgKi8KKyAgICBlaWVpbworICAgIGxpICAgICAgcjksIDB4MDcKKyAgICBzdGIgICAgIHI5LCAzKHI4KSAgICAgICAgICAgLyogOCBkYXRhIGJpdHMsIDIgc3RvcCBiaXQsIG5vIHBhcml0eSAqLworICAgIGVpZWlvCisgICAgbGkgICAgICByOSwgMHgwYgorICAgIHN0YiAgICAgcjksIDQocjgpICAgICAgICAgICAvKiBlbmFibGUgdGhlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciAobW9kZW0gY3RybCkgKi8KKyAgICBlaWVpbword2FpdEVtcHR5OgorICAgIGxieiAgICAgcjksIDUocjgpICAgICAgICAgICAvKiB0cmFuc21pdCBlbXB0eSAqLworICAgIGFuZGkuICAgcjksIHI5LCAweDQwCisgICAgYmVxICAgICB3YWl0RW1wdHkKKyAgICBsaSAgICAgIHI5LCAweDQ3CisgICAgc3RiICAgICByOSwgMyhyOCkgICAgICAgICAgIC8qIHNlbmQgYnJlYWssIDggZGF0YSBiaXRzLCAyIHN0b3AgYml0LCBubyBwYXJpdHkgKi8KKyAgICBlaWVpbworCisgICAgbGlzICAgICByMCwgMHgwMDAxCisgICAgbXRjdHIgICByMAord2FpdENPTTE6CisgICAgbHd6ICAgICByMCwgNShyOCkgICAgICAgICAgIC8qIGxvYWQgZnJvbSBwb3J0IGZvciBkZWxheSAqLworICAgIGJkbnogICAgd2FpdENPTTEKKword2FpdEVtcHR5MToKKyAgICBsYnogICAgIHI5LCA1KHI4KSAgICAgICAgICAgLyogdHJhbnNtaXQgZW1wdHkgKi8KKyAgICBhbmRpLiAgIHI5LCByOSwgMHg0MAorICAgIGJlcSAgICAgd2FpdEVtcHR5MQorICAgIGxpICAgICAgcjksIDB4MDcKKyAgICBzdGIgICAgIHI5LCAzKHI4KSAgICAgICAgICAgLyogOCBkYXRhIGJpdHMsIDIgc3RvcCBiaXQsIG5vIHBhcml0eSAqLworICAgIGVpZWlvCisKKy8qCisgKiBpbnRybyBtZXNzYWdlIGZyb20gbWVzc2FnZSBibG9jaworICovCisgICAgYWRkaSAgICByMywgcjI5LCAoTW5ld0xpbmUtTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisgICAgYWRkaSAgICByMywgcjI5LCAoTWluaXRMb2dvLU1lc3NhZ2VCbG9jaykKKyAgICBibCAgICAgIFByaW50ZgorCisvKgorICogbWVtb3J5IGNvZmlndXJhdGlvbiB1c2luZyBTUEQgaW5mb3JtYXRpb24gc3RvcmVkIG9uIHRoZSBTT0RJTU1zCisgKi8KKyAgICBhZGRpICAgIHIzLCByMjksIChNc3BkMDEtTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisKKyAgICBsaSAgICAgIHIxNywgMAorCisgICAgbGkgICAgICByMywgMHgwMDAyICAgICAgICAgIC8qIGdldCBSQU0gdHlwZSBmcm9tIHNwZCBmb3IgYmFuazAvMSAqLworICAgIGJsICAgICAgc3BkUmVhZAorCisgICAgY21waSAgICAwLCAwLCByMywgLTEgICAgICAgIC8qIGVycm9yID8gKi8KKyAgICBibmUgICAgIG5vU3BkRXJyb3IKKworICAgIGFkZGkgICAgcjMsIHIyOSwgKE1mYWlsLU1lc3NhZ2VCbG9jaykKKyAgICBibCAgICAgIFByaW50ZgorCisgICAgbGkgICAgICByNiwgMHhlICAgICAgICAgICAgIC8qIGVycm9yIGNvZGVzIGluIHI2IGFuZCByNyAgKi8KKyAgICBsaSAgICAgIHI3LCAweDAKKyAgICBiICAgICAgIHRvZ2dsZUVycm9yICAgICAgICAgLyogZmFpbCAtIGxvb3AgZm9yZXZlciAqLworCitub1NwZEVycm9yOgorICAgIG1yICAgICAgcjE1LCByMyAgICAgICAgICAgICAvKiBzYXZlIHIzICovCisKKyAgICBhZGRpICAgIHIzLCByMjksIChNb2stTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisKKyAgICBjbXBsaSAgIDAsIDAsIHIxNSwgMHgwMDA0ICAgLyogU0RSQU0gPyAqLworICAgIGJlcSAgICAgaXNTRFJBTQorCisgICAgYWRkaSAgICByMywgcjI5LCAoTXJhbVR5cC1NZXNzYWdlQmxvY2spCisgICAgYmwgICAgICBQcmludGYKKworICAgIGxpICAgICAgcjYsIDB4ZCAgICAgICAgICAgICAvKiBlcnJvciBjb2RlcyBpbiByNiBhbmQgcjcgICovCisgICAgbGkgICAgICByNywgMHgwCisgICAgYiAgICAgICB0b2dnbGVFcnJvciAgICAgICAgIC8qIGZhaWwgLSBsb29wIGZvcmV2ZXIgKi8KKworaXNTRFJBTToKKyAgICBsaSAgICAgIHIzLCAweDAwMTIgICAgICAgICAgLyogZ2V0IHN1cHBvcnRlZCBDQVMgbGF0ZW5jaWVzIGZyb20gYnl0ZSAxOCAqLworICAgIGJsICAgICAgc3BkUmVhZAorICAgIG1yICAgICAgcjE1LCByMworICAgIGxpICAgICAgcjMsIDB4MDkKKyAgICBhbmRpLiAgIHIwLCByMTUsIDB4MDQKKyAgICBibmUgICAgIG1heENMaXMzCisgICAgbGkgICAgICByMywgMHgxNworbWF4Q0xpczM6CisgICAgYW5kaS4gICByMCwgcjE1LCAweDAyCisgICAgYm5lICAgICBDTDIKKworICAgIGFkZGkgICAgcjMsIHIyOSwgKE1yYW1UeXAtTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisKKyAgICBsaSAgICAgIHI2LCAweGMgICAgICAgICAgICAgLyogZXJyb3IgY29kZXMgaW4gcjYgYW5kIHI3ICAqLworICAgIGxpICAgICAgcjcsIDB4MAorICAgIGIgICAgICAgdG9nZ2xlRXJyb3IgICAgICAgICAvKiBmYWlsIC0gbG9vcCBmb3JldmVyICovCitDTDI6CisgICAgYmwgICAgICBzcGRSZWFkCisgICAgY21wbGkgICAwLCAwLCByMywgMHhhMSAgICAgIC8qIGN5Y2xlIHRpbWUgbXVzdCBiZSAxMG5zIG1heC4gKi8KKyAgICBibHQgICAgIHNwZWVkT2sKKworICAgIGFkZGkgICAgcjMsIHIyOSwgKE1yYW1UeXAtTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisKKyAgICBsaSAgICAgIHI2LCAweGIgICAgICAgICAgICAgLyogZXJyb3IgY29kZXMgaW4gcjYgYW5kIHI3ICAqLworICAgIGxpICAgICAgcjcsIDB4MAorICAgIGIgICAgICAgdG9nZ2xlRXJyb3IgICAgICAgICAvKiBmYWlsIC0gbG9vcCBmb3JldmVyICovCitzcGVlZE9rOgorICAgIGxpcyAgICAgcjIwLCAweDA2ZTggICAgICAgICAvKiBwcmVzZXQgTUNSMSB2YWx1ZSAqLworCisgICAgbGkgICAgICByMywgMHgwMDExICAgICAgICAgIC8qIGdldCBudW1iZXIgb2YgaW50ZXJuYWwgYmFua3MgZnJvbSBzcGQgZm9yIGJhbmswLzEgKi8KKyAgICBibCAgICAgIHNwZFJlYWQKKworICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MDIKKyAgICBiZXEgICAgIFNEXzJCCisgICAgY21wbGkgICAwLCAwLCByMywgMHgwNAorICAgIGJlcSAgICAgU0RfNEIKK21lbUNvbmZFcnI6CisgICAgYWRkaSAgICByMywgcjI5LCAoTXJhbUNvbmZFcnItTWVzc2FnZUJsb2NrKQorICAgIGJsICAgICAgUHJpbnRmCisKKyAgICBsaSAgICAgIHI2LCAweGEgICAgICAgICAgICAgLyogZXJyb3IgY29kZXMgaW4gcjYgYW5kIHI3ICAqLworICAgIGxpICAgICAgcjcsIDB4MAorICAgIGIgICAgICAgdG9nZ2xlRXJyb3IgICAgICAgICAvKiBmYWlsIC0gbG9vcCBmb3JldmVyICovCisKK1NEXzJCOgorICAgIGxpICAgICAgcjMsIDB4MDAwMyAgICAgICAgICAvKiBnZXQgbnVtYmVyIG9mIHJvdyBiaXRzIGZyb20gc3BkIGZvciBiYW5rMC8xICovCisgICAgYmwgICAgICBzcGRSZWFkCisgICAgY21wbGkgICAwLCAwLCByMywgMHgwYgorICAgIGJlcSAgICAgcm93MTF4MgorICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MGMKKyAgICBiZXEgICAgIHJvdzEyeDJvcjEzeDIKKyAgICBjbXBsaSAgIDAsIDAsIHIzLCAweDBkCisgICAgYmVxICAgICByb3cxMngyb3IxM3gyCisgICAgYiAgICAgICBtZW1Db25mRXJyCitTRF80QjoKKyAgICBsaSAgICAgIHIzLCAweDAwMDMgICAgICAgICAgLyogZ2V0IG51bWJlciBvZiByb3cgYml0cyBmcm9tIHNwZCBmb3IgYmFuazAvMSAqLworICAgIGJsICAgICAgc3BkUmVhZAorICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MGIKKyAgICBiZXEgICAgIHJvdzExeDRvcjEyeDQKKyAgICBjbXBsaSAgIDAsIDAsIHIzLCAweDBjCisgICAgYmVxICAgICByb3cxMXg0b3IxMng0CisgICAgY21wbGkgICAwLCAwLCByMywgMHgwZAorICAgIGJlcSAgICAgcm93MTN4NAorICAgIGIgICAgICAgbWVtQ29uZkVycgorcm93MTJ4Mm9yMTN4MjoKKyAgICBvcmkgICAgIHIyMCwgcjIwLCAweDA1CisgICAgYiAgICAgICByb3cxMXg0b3IxMng0Cityb3cxM3g0OgorICAgIG9yaSAgICAgcjIwLCByMjAsIDB4MGEKKyAgICBiICAgICAgIHJvdzExeDRvcjEyeDQKK3JvdzExeDI6CisgICAgb3JpICAgICByMjAsIHIyMCwgMHgwZgorcm93MTF4NG9yMTJ4NDoKKyAgICAvKiBnZXQgdGhlIHNpemUgb2YgYmFuayAwLTEgKi8KKworICAgIGxpICAgICAgcjMsIDB4MDAxZiAgICAgICAgICAvKiBnZXQgYmFuayBzaXplIGZyb20gc3BkIGZvciBiYW5rMC8xICovCisgICAgYmwgICAgICBzcGRSZWFkCisKKyAgICBybHdpbm0gIHIxNiwgcjMsIDIsIDI0LCAyOSAgLyogY2FsY3VsYXRlIHNpemUgaW4gTUJ5dGUgKDEyOCBNQiBtYXguKSAqLworCisgICAgbGkgICAgICByMywgMHgwMDA1ICAgICAgICAgIC8qIGdldCBudW1iZXIgb2YgYmFua3MgZnJvbSBzcGQgZm9yIGJhbmswLzEgKi8KKyAgICBibCAgICAgIHNwZFJlYWQKKworICAgIGNtcGkgICAgMCwgMCwgcjMsIDIgICAgICAgICAvKiAyIGJhbmtzID8gKi8KKyAgICBibmUgICAgIFNEUkFNbm9iYW5rMQorCisgICAgbXIgICAgICByMTcsIHIxNgorCitTRFJBTW5vYmFuazE6CisgICAgbGkgICAgICByMywgMHgwMDBjICAgICAgICAgIC8qIGdldCByZWZyZXNoIGZyb20gc3BkIGZvciBiYW5rMC8xICovCisgICAgYmwgICAgICBzcGRSZWFkCisgICAgYW5kaS4gICByMywgcjMsIDB4MDA3ZiAgICAgIC8qIG1hc2sgc2VsZnJlZnJlc2ggYml0ICovCisgICAgbGkgICAgICByNCwgMHgxODAwICAgICAgICAgIC8qIHJlZmVzaCBjeWNsZSAxNTM2IGNsb2NrcyBsZWZ0IHNoaWZ0ZWQgMiAqLworICAgIGNtcGxpICAgMCwgMCwgcjMsIDB4MDAwMCAgICAvKiAxNS42IHVzID8gKi8KKyAgICBiZXEgICAgIHdyaXRlUmVmcmVzaAorCisgICAgbGkgICAgICByNCwgMHgwYzAwICAgICAgICAgIC8qIHJlZmVzaCBjeWNsZSA3NjggY2xvY2tzIGxlZnQgc2hpZnRlZCAyICovCisgICAgY21wbGkgICAwLCAwLCByMywgMHgwMDAyICAgIC8qIDcuOCB1cyA/ICovCisgICAgYmVxICAgICB3cml0ZVJlZnJlc2gKKworICAgIGxpICAgICAgcjQsIDB4MzAwMCAgICAgICAgICAvKiByZWZlc2ggY3ljbGUgMzA3MiBjbG9ja3MgbGVmdCBzaGlmdGVkIDIgKi8KKyAgICBjbXBsaSAgIDAsIDAsIHIzLCAweDAwMDMgICAgLyogMzEuMyB1cyA/ICovCisgICAgYmVxICAgICB3cml0ZVJlZnJlc2gKKworICAgIGxpICAgICAgcjQsIDB4NjAwMCAgICAgICAgICAvKiByZWZlc2ggY3ljbGUgNjE0NCBjbG9ja3MgbGVmdCBzaGlmdGVkIDIgKi8KKyAgICBjbXBsaSAgIDAsIDAsIHIzLCAweDAwMDQgICAgLyogNjIuNSB1cyA/ICovCisgICAgYmVxICAgICB3cml0ZVJlZnJlc2gKKworICAgIGxpICAgICAgcjQsIDAKKyAgICBvcmkgICAgIHI0LCByNCwgMHhjMDAwICAgICAgLyogcmVmZXNoIGN5Y2xlIDgyMjQgY2xvY2tzIGxlZnQgc2hpZnRlZCAyICovCisgICAgY21wbGkgICAwLCAwLCByMywgMHgwMDA1ICAgIC8qIDEyNSB1cyA/ICovCisgICAgYmVxICAgICB3cml0ZVJlZnJlc2gKKworICAgIGIgICAgICAgbWVtQ29uZkVycgorCit3cml0ZVJlZnJlc2g6CisgICAgbGlzICAgICByMjEsIDB4MDQwMCAgICAgICAgIC8qIHByZXNldCBNQ0NSMiB2YWx1ZSAqLworICAgIG9yICAgICAgcjIxLCByMjEsIHI0CisKKyAgICAvKiBPdmVyd3JpdGUgTUNDUjEgKi8KKyAgICBsaXMgICAgIHIzLCBNUEMxMDZfUkVHQGgKKyAgICBvcmkgICAgIHIzLCByMywgTVBDMTA2X01DQ1IxCisgICAgc3R3YnJ4ICByMywgMCwgcjEKKyAgICBlaWVpbworICAgIHN0d2JyeCAgcjIwLCAwLCByMgorCisgICAgLyogT3ZlcndyaXRlIE1DQ1IyICovCisgICAgbGlzICAgICByMywgTVBDMTA2X1JFR0BoCisgICAgb3JpICAgICByMywgcjMsIE1QQzEwNl9NQ0NSMgorICAgIHN0d2JyeCAgcjMsIDAsIHIxCisgICAgZWllaW8KKyAgICBzdHdicnggIHIyMSwgMCwgcjIKKworICAgIC8qIHNldCB0aGUgbWVtb3J5IGJvdW5kYXJ5IHJlZ2lzdGVycyBmb3IgYmFuayAwLTMgKi8KKyAgICBsaSAgICAgIHIyMCwgMAorICAgIGxpcyAgICAgcjIzLCAweDAzMDMKKyAgICBsaXMgICAgIHIyNCwgMHgwMzAzCisgICAgc3ViaSAgICByMjEsIHIxNiwgMSAgICAgICAgIC8qIGNhbGN1bGF0ZSBlbmQgYWRkcmVzcyBiYW5rMCAqLworICAgIGxpICAgICAgcjIyLCAxCisKKyAgICBjbXBpICAgIDAsIDAsIHIxNywgMCAgICAgICAgLyogYmFuazEgcHJlc2VudCA/ICovCisgICAgYmVxICAgICBub2JhbmsxCisKKyAgICBhbmRpLiAgIHIzLCByMTYsIDB4MDBmZiAgICAgLyogY2FsY3VsYXRlIHN0YXJ0IGFkZHJlc3Mgb2YgYmFuazEgKi8KKyAgICBhbmRpLiAgIHI0LCByMTYsIDB4MDMwMAorICAgIHJsd2lubSAgcjMsIHIzLCA4LCAxNiwgMjMKKyAgICBvciAgICAgIHIyMCwgcjIwLCByMworICAgIG9yICAgICAgcjIzLCByMjMsIHI0CisKKyAgICBhZGQgICAgIHIxNiwgcjE2LCByMTcgICAgICAgLyogYWRkIHRvIHRvdGFsIG1lbW9yeSBzaXplICovCisKKyAgICBzdWJpICAgIHIzLCByMTYsIDEgICAgICAgICAgLyogY2FsY3VsYXRlIGVuZCBhZGRyZXNzIG9mIGJhbmsxICovCisgICAgYW5kaS4gICByNCwgcjMsIDB4MDMwMAorICAgIGFuZGkuICAgcjMsIHIzLCAweDAwZmYKKyAgICBybHdpbm0gIHIzLCByMywgOCwgMTYsIDIzCisgICAgb3IgICAgICByMjEsIHIyMSwgcjMKKyAgICBvciAgICAgIHIyNCwgcjI0LCByNAorCisgICAgb3JpICAgICByMjIsIHIyMiwgMiAgICAgICAgIC8qIGVuYWJsZSBiYW5rMSAqLworICAgIGIgICAgICAgYmFua09rCitub2JhbmsxOgorICAgIG9yaSAgICAgcjIzLCByMjMsIDB4MDMwMCAgICAvKiBzZXQgYmFuazEgc3RhcnQgdG8gdW51c2VkIGFyZWEgKi8KKyAgICBvcmkgICAgIHIyNCwgcjI0LCAweDAzMDAgICAgLyogc2V0IGJhbmsxIGVuZCB0byB1bnVzZWQgYXJlYSAqLworYmFua09rOgorICAgIGFkZGkgICAgcjMsIHIyOSwgKE1hY3RpdmF0ZS1NZXNzYWdlQmxvY2spCisgICAgYmwgICAgICBQcmludGYKKyAgICBtciAgICAgIHIzLCByMTYKKyAgICBibCAgICAgIE91dERlYworICAgIGFkZGkgICAgcjMsIHIyOSwgKE1hY3QwMTIzZS1NZXNzYWdlQmxvY2spCisgICAgYmwgICAgICBQcmludGYKKworLyoKKyAqIG92ZXJ3cml0ZSBNU0FSMSwgTUVBUjEsIEVNU0FSMSwgYW5kIEVNRUFSMQorICovCisgICAgYWRkaXMgICByMywgcjAsIDB4ODAwMCAgICAgIC8qIEFERFJfODAgKi8KKyAgICBvcmkgICAgIHIzLCByMywgMHgwMDgwICAgICAgLyogTVNBUjEgKi8KKyAgICBzdHdicnggIHIzLCAwLCByMQorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMjAsIDAsIHIyCisKKyAgICBhZGRpcyAgIHIzLCByMCwgMHg4MDAwICAgICAgLyogQUREUl84OCAqLworICAgIG9yaSAgICAgcjMsIHIzLCAweDAwODggICAgICAvKiBFTVNBUjEgKi8KKyAgICBzdHdicnggIHIzLCAwLCByMQorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMjMsIDAsIHIyCisKKyAgICBhZGRpcyAgIHIzLCByMCwgMHg4MDAwICAgICAgLyogQUREUl85MCAqLworICAgIG9yaSAgICAgcjMsIHIzLCAweDAwOTAgICAgICAvKiBNRUFSMSAqLworICAgIHN0d2JyeCAgcjMsIDAsIHIxCisgICAgZWllaW8KKyAgICBzdHdicnggIHIyMSwgMCwgcjIKKworICAgIGFkZGlzICAgcjMsIHIwLCAweDgwMDAgICAgICAvKiBBRERSXzk4ICovCisgICAgb3JpICAgICByMywgcjMsIDB4MDA5OCAgICAgIC8qIEVNRUFSMSAqLworICAgIHN0d2JyeCAgcjMsIDAsIHIxCisgICAgZWllaW8KKyAgICBzdHdicnggIHIyNCwgMCwgcjIKKworICAgIGFkZGlzICAgcjMsIHIwLCAweDgwMDAgICAgICAvKiBBRERSX0EwICovCisgICAgb3JpICAgICByMywgcjMsIDB4MDBhMCAgICAgIC8qIE1CRVIgKi8KKyAgICBzdHdicnggIHIzLCAwLCByMQorICAgIGVpZWlvCisgICAgc3R3YnJ4ICByMjIsIDAsIHIyCisKKy8qCisgKiBkZWxheSB0byBsZXQgU0RSQU0gZ28gdGhyb3VnaCBzZXZlcmFsIGluaXRpYWxpemF0aW9uL3JlZnJlc2ggY3ljbGVzCisgKi8KKyAgICBsaXMgICAgIHIzLCAzCisgICAgbXRjdHIgICByMworbWVtU3RhcnRXYWl0XzE6CisgICAgYmRueiAgICBtZW1TdGFydFdhaXRfMQorICAgIGVpZWlvCisKKy8qCisgKiBzZXQgTEVEcyBlbmQKKyAqLworICAgIGxpICAgICAgcjMsIDB4ZgorICAgIGxpcyAgICAgcjMwLCBDRkdfVVNSX0xFRF9CQVNFQGgKKyAgICBzdGIgICAgIHIzLCAyKHIzMCkKKyAgICBzeW5jCisKKyAgICBtdGxyICAgIHIxMworICAgIGJsciAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFWElUIGJvYXJkX2FzbV9pbml0IC4uLiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaW50IGEgbWVzc2FnZSB0byBDT00xIGluIHBvbGxpbmcgbW9kZSAocjEwPUNPTTEgcG9ydCwgcjM9KGNoYXIqKXN0cmluZykKKyAqLworCitQcmludGY6CisgICAgbGlzICAgICByMTAsIENGR19OUzE2NTUwX0NPTTFAaCAvKiBDT00xIGJhc2UgYWRkcmVzcyovCisgICAgb3JpICAgICByMTAsIHIxMCwgQ0ZHX05TMTY1NTBfQ09NMUBsCitXYWl0Q2hyOgorICAgIGxieiAgICAgcjAsIDUocjEwKSAgICAgICAgICAvKiByZWFkIGxpbmsgc3RhdHVzICovCisgICAgZWllaW8KKyAgICBhbmRpLiAgIHIwLCByMCwgMHg0MCAgICAgICAgLyogbWFzayB0cmFuc21pdHRlciBlbXB0eSBiaXQgKi8KKyAgICBiZXEgICAgIGNyMCwgV2FpdENociAgICAgICAgLyogd2FpdCB0aWxsIGVtcHR5ICovCisgICAgbGJ6eCAgICByMCwgcjAsIHIzICAgICAgICAgIC8qIGdldCBjaGFyICovCisgICAgc3RiICAgICByMCwgMChyMTApICAgICAgICAgIC8qIHdyaXRlIHRvIHRyYW5zbWl0IHJlZyAqLworICAgIGVpZWlvCisgICAgYWRkaSAgICByMywgcjMsIDEgICAgICAgICAgIC8qIG5leHQgY2hhciAqLworICAgIGxienggICAgcjAsIHIwLCByMyAgICAgICAgICAvKiBnZXQgY2hhciAqLworICAgIGNtcHdpICAgY3IxLCByMCwgMCAgICAgICAgICAvKiBlbmQgb2Ygc3RyaW5nID8gKi8KKyAgICBibmUgICAgIGNyMSwgV2FpdENocgorICAgIGJscgorCisvKgorICogcHJpbnQgYSBjaGFyIHRvIENPTTEgaW4gcG9sbGluZyBtb2RlIChyMTA9Q09NMSBwb3J0LCByMz1jaGFyKQorICovCitPdXRDaHI6CisgICAgbGlzICAgICByMTAsIENGR19OUzE2NTUwX0NPTTFAaCAvKiBDT00xIGJhc2UgYWRkcmVzcyovCisgICAgb3JpICAgICByMTAsIHIxMCwgQ0ZHX05TMTY1NTBfQ09NMUBsCitPdXRDaHIxOgorICAgIGxieiAgICAgcjAsIDUocjEwKSAgICAgICAgICAvKiByZWFkIGxpbmsgc3RhdHVzICovCisgICAgZWllaW8KKyAgICBhbmRpLiAgIHIwLCByMCwgMHg0MCAgICAgICAgLyogbWFzayB0cmFuc21pdHRlciBlbXB0eSBiaXQgKi8KKyAgICBiZXEgICAgIGNyMCwgT3V0Q2hyMSAgICAgICAgLyogd2FpdCB0aWxsIGVtcHR5ICovCisgICAgc3RiICAgICByMywgMChyMTApICAgICAgICAgIC8qIHdyaXRlIHRvIHRyYW5zbWl0IHJlZyAqLworICAgIGVpZWlvCisgICAgYmxyCisKKy8qCisgKiBwcmludCA4LzQvMiBkaWdpdHMgaGV4IHZhbHVlIHRvIENPTTEgaW4gcG9sbGluZyBtb2RlIChyMTA9Q09NMSBwb3J0LCByMz12YWwpCisgKi8KK091dEhleDI6CisgICAgbGkgICAgICByOSwgNCAgICAgICAgICAgICAgIC8qIHNoaWZ0IHJlZyBmb3IgMiBkaWdpdHMgKi8KKyAgICBiICAgICAgIE9Ic3RhcnQKK091dEhleDQ6CisgICAgbGkgICAgICByOSwgMTIgICAgICAgICAgICAgIC8qIHNoaWZ0IHJlZyBmb3IgNCBkaWdpdHMgKi8KKyAgICBiICAgICAgIE9Ic3RhcnQKK091dEhleDoKKyAgICBsaSAgICAgIHI5LCAyOCAgICAgICAgICAgICAgLyogc2hpZnQgcmVnIGZvciA4IGRpZ2l0cyAqLworT0hzdGFydDoKKyAgICBsaXMgICAgIHIxMCwgQ0ZHX05TMTY1NTBfQ09NMUBoIC8qIENPTTEgYmFzZSBhZGRyZXNzKi8KKyAgICBvcmkgICAgIHIxMCwgcjEwLCBDRkdfTlMxNjU1MF9DT00xQGwKK091dERpZzoKKyAgICBsYnogICAgIHIwLCAwKHIyOSkgICAgICAgICAgLyogc2xvdyBkb3duIGR1bW15IHJlYWQgKi8KKyAgICBsYnogICAgIHIwLCA1KHIxMCkgICAgICAgICAgLyogcmVhZCBsaW5rIHN0YXR1cyAqLworICAgIGVpZWlvCisgICAgYW5kaS4gICByMCwgcjAsIDB4NDAgICAgICAgIC8qIG1hc2sgdHJhbnNtaXR0ZXIgZW1wdHkgYml0ICovCisgICAgYmVxICAgICBjcjAsIE91dERpZworICAgIHNyYXcgICAgcjAsIHIzLCByOQorICAgIGNscmx3aSAgcjAsIHIwLCAyOAorICAgIGNtcHdpICAgY3IxLCByMCwgOQorICAgIGJsZSAgICAgY3IxLCBkaWdJc051bQorICAgIGFkZGljICAgcjAsIHIwLCA1NQorICAgIGIgICAgICAgbmV4dERpZworZGlnSXNOdW06CisgICAgYWRkaWMgICByMCwgcjAsIDQ4CituZXh0RGlnOgorICAgIHN0YiAgICAgcjAsIDAocjEwKSAgICAgICAgICAvKiB3cml0ZSB0byB0cmFuc21pdCByZWcgKi8KKyAgICBlaWVpbworICAgIGFkZGljLiAgcjksIHI5LCAtNAorICAgIGJnZSAgICAgT3V0RGlnCisgICAgYmxyCisKKy8qCisgKiBwcmludCAzIGRpZ2l0cyBoZGVjIHZhbHVlIHRvIENPTTEgaW4gcG9sbGluZyBtb2RlCisgKiAocjEwPUNPTTEgcG9ydCwgcjM9dmFsLCByNz14MDAsIHI4PXgwLCByOT14LCByMCwgcjY9c2NyYXRjaCkKKyAqLworT3V0RGVjOgorICAgIGxpICAgICAgcjYsIDEwCisgICAgZGl2d3UgICByMCwgcjMsIHI2ICAgICAgICAgIC8qIHIwID0gcjMgLyAxMCwgcjkgPSByMyBtb2QgMTAgKi8KKyAgICBtdWxsdyAgIHIxMCwgcjAsIHI2CisgICAgc3ViZiAgICByOSwgcjEwLCByMworICAgIG1yICAgICAgcjMsIHIwCisgICAgZGl2d3UgICByMCwgcjMsIHI2ICAgICAgICAgIC8qIHIwID0gcjMgLyAxMCwgcjggPSByMyBtb2QgMTAgKi8KKyAgICBtdWxsdyAgIHIxMCwgcjAsIHI2CisgICAgc3ViZiAgICByOCwgcjEwLCByMworICAgIG1yICAgICAgcjMsIHIwCisgICAgZGl2d3UgICByMCwgcjMsIHI2ICAgICAgICAgIC8qIHIwID0gcjMgLyAxMCwgcjcgPSByMyBtb2QgMTAgKi8KKyAgICBtdWxsdyAgIHIxMCwgcjAsIHI2CisgICAgc3ViZiAgICByNywgcjEwLCByMworICAgIGxpcyAgICAgcjEwLCBDRkdfTlMxNjU1MF9DT00xQGggLyogQ09NMSBiYXNlIGFkZHJlc3MqLworICAgIG9yaSAgICAgcjEwLCByMTAsIENGR19OUzE2NTUwX0NPTTFAbAorICAgIG9yLiAgICAgcjcsIHI3LCByNworICAgIGJuZSAgICAgbm9ibGFuazEKKyAgICBsaSAgICAgIHIzLCAweDIwCisgICAgYiAgICAgICBPdXREZWM0Citub2JsYW5rMToKKyAgICBhZGRpICAgIHIzLCByNywgNDggICAgICAgICAgLyogY29udmVydCB0byBBU0NJSSAqLworT3V0RGVjNDoKKyAgICBsYnogICAgIHIwLCAwKHIyOSkgICAgICAgICAgLyogc2xvdyBkb3duIGR1bW15IHJlYWQgKi8KKyAgICBsYnogICAgIHIwLCA1KHIxMCkgICAgICAgICAgLyogcmVhZCBsaW5rIHN0YXR1cyAqLworICAgIGVpZWlvCisgICAgYW5kaS4gICByMCwgcjAsIDB4NDAgICAgICAgIC8qIG1hc2sgdHJhbnNtaXR0ZXIgZW1wdHkgYml0ICovCisgICAgYmVxICAgICBjcjAsIE91dERlYzQKKyAgICBzdGIgICAgIHIzLCAwKHIxMCkgICAgICAgICAgLyogeDAwIHRvIHRyYW5zbWl0ICovCisgICAgZWllaW8KKyAgICBvci4gICAgIHI3LCByNywgcjgKKyAgICBiZXEgICAgIE91dERlYzUKKyAgICBhZGRpICAgIHIzLCByOCwgNDggICAgICAgICAgLyogY29udmVydCB0byBBU0NJSSAqLworT3V0RGVjNToKKyAgICBsYnogICAgIHIwLCAwKHIyOSkgICAgICAgICAgLyogc2xvdyBkb3duIGR1bW15IHJlYWQgKi8KKyAgICBsYnogICAgIHIwLCA1KHIxMCkgICAgICAgICAgLyogcmVhZCBsaW5rIHN0YXR1cyAqLworICAgIGVpZWlvCisgICAgYW5kaS4gICByMCwgcjAsIDB4NDAgICAgICAgIC8qIG1hc2sgdHJhbnNtaXR0ZXIgZW1wdHkgYml0ICovCisgICAgYmVxICAgICBjcjAsIE91dERlYzUKKyAgICBzdGIgICAgIHIzLCAwKHIxMCkgICAgICAgICAgLyogeDAgIHRvIHRyYW5zbWl0ICovCisgICAgZWllaW8KKyAgICBhZGRpICAgIHIzLCByOSwgNDggICAgICAgICAgLyogY29udmVydCB0byBBU0NJSSAqLworT3V0RGVjNjoKKyAgICBsYnogICAgIHIwLCAwKHIyOSkgICAgICAgICAgLyogc2xvdyBkb3duIGR1bW15IHJlYWQgKi8KKyAgICBsYnogICAgIHIwLCA1KHIxMCkgICAgICAgICAgLyogcmVhZCBsaW5rIHN0YXR1cyAqLworICAgIGVpZWlvCisgICAgYW5kaS4gICByMCwgcjAsIDB4NDAgICAgICAgIC8qIG1hc2sgdHJhbnNtaXR0ZXIgZW1wdHkgYml0ICovCisgICAgYmVxICAgICBjcjAsIE91dERlYzYKKyAgICBzdGIgICAgIHIzLCAwKHIxMCkgICAgICAgICAgLyogeCAgIHRvIHRyYW5zbWl0ICovCisgICAgZWllaW8KKyAgICBibHIKKworLyoKKyAqIGhhbmcgZW5kbGVzcyBsb29wCisgKi8KK3RvZ2dsZUVycm9yOiAgICAgICAgICAgICAgICAgICAgLyogZmFpbCB0eXBlIGluIHI2LCByNz0weGZmLCB0b2dnbGUgTEVEcyAqLworICAgIHN0YiAgICAgcjcsIDIocjMwKSAgICAgICAgICAvKiByNyB0byBMRUQgKi8KKyAgICBsaSAgICAgIHIwLCAwCisgICAgbGlzICAgICByOSwgMTI3CisgICAgb3JpICAgICByOSwgcjksIDY1NTM1Cit0b2dnbGVFcnJvcjE6CisgICAgYWRkaWMgICByMCwgcjAsIDEKKyAgICBjbXB3ICAgIGNyMSwgcjAsIHI5CisgICAgYmxlICAgICBjcjEsIHRvZ2dsZUVycm9yMQorICAgIHN0YiAgICAgcjYsIDIocjMwKSAgICAgICAgICAvKiByNiB0byBMRUQgKi8KKyAgICBsaSAgICAgIHIwLCAwCisgICAgbGlzICAgICByOSwgMTI3CisgICAgb3JpICAgICByOSwgcjksIDY1NTM1Cit0b2dnbGVFcnJvcjI6CisgICAgYWRkaWMgICByMCwgcjAsIDEKKyAgICBjbXB3ICAgIGNyMSwgcjAsIHI5CisgICAgYmxlICAgICBjcjEsIHRvZ2dsZUVycm9yMgorICAgIGIgICAgICAgdG9nZ2xlRXJyb3IKKworLyoKKyAqIHJvdXRpbmVzIHRvIHJlYWQgZnJvbSByYW0gc3BkCisgKi8KK3NwZFdhaXRJZGxlOgorICAgIGxpcyAgICAgcjAsIDB4MSAgICAgICAgICAgICAvKiB0aW1lb3V0IGZvciBhYm91dCAxMDB1cyAqLworICAgIG10Y3RyICAgcjAKK2lTcGQ6CisgICAgbGJ6ICAgICByMTAsIDEyKHIxNCkKKyAgICBhbmRpLiAgIHIxMCwgcjEwLCAweDIwICAgICAgLyogbWFzayBhbmQgdGVzdCBNQkIgKi8KKyAgICBiZXEgICAgIGlkbGUKKyAgICBiZG56ICAgIGlTcGQKKyAgICBvcmMuICAgIHIxMCwgcjAsIHIwICAgICAgICAgLyogcmV0dXJuIC0xIHRvIGNhbGxlciAqLworaWRsZToKKyAgICBiY2xyICAgIDIwLCAwICAgICAgICAgICAgICAgLyogcmV0dXJuIHRvIGNhbGxlciAqLworCit3YWl0U3BkOgorICAgIGxpcyAgICAgcjAsIDB4MTAgICAgICAgICAgICAvKiB0aW1lb3V0IGZvciBhYm91dCAxLjVtcyAqLworICAgIG10Y3RyICAgcjAKK3dTcGQ6CisgICAgbGJ6ICAgICByMTAsIDEyKHIxNCkKKyAgICBhbmRpLiAgIHIxMCwgcjEwLCAweDgyCisgICAgY21wbGkgICAwLCAwLCByMTAsIDB4ODIgICAgIC8qIHRlc3QgTUNGIGFuZCBNSUYgc2V0ICovCisgICAgYmVxICAgICB3ZW5kCisgICAgYmRueiAgICB3U3BkCisgICAgb3JjLiAgICByMTAsIHIwLCByMCAgICAgICAgIC8qIHJldHVybiAtMSB0byBjYWxsZXIgKi8KKyAgICBiY2xyICAgIDIwLCAwICAgICAgICAgICAgICAgLyogcmV0dXJuIHRvIGNhbGxlciAqLworCit3ZW5kOgorICAgIGxpICAgICAgcjEwLCAwCisgICAgc3RiICAgICByMTAsIDEyKHIxNCkgICAgICAgIC8qIGNsZWFyIHN0YXR1cyAqLworICAgIGJjbHIgICAgMjAsIDAgICAgICAgICAgICAgICAvKiByZXR1cm4gdG8gY2FsbGVyICovCisKKy8qCisgKiBzcGRyZWFkCisgKiBpbjogIHIzIGFkciB0byByZWFkCisgKiBvdXQ6IHIzIHZhbCBvciAtMSBmb3IgZXJyb3IKKyAqIHVzZXMgcjEwLCBhc3N1bWVzIHRoYXQgcjE0IHBvaW50cyB0byBJMkMgY29udHJvbGxlcgorICovCitzcGRSZWFkOgorICAgIG1mc3ByICAgcjI1LCA4ICAgICAgICAgICAgICAvKiBzYXZlIGxpbmsgcmVnaXN0ZXIgKi8KKworICAgIGJsICAgICAgc3BkV2FpdElkbGUKKyAgICBibmUgICAgIHNwZEVycgorCisgICAgbGkgICAgICByMTAsIDB4ODAgICAgICAgICAgIC8qIHN0YXJ0IHdpdGggTUVOICovCisgICAgc3RiICAgICByMTAsIDgocjE0KQorICAgIGVpZWlvCisKKyAgICBsaSAgICAgIHIxMCwgMHhiMCAgICAgICAgICAgLyogc3RhcnQgYXMgbWFzdGVyICovCisgICAgc3RiICAgICByMTAsIDgocjE0KQorICAgIGVpZWlvCisKKyAgICBsaSAgICAgIHIxMCwgMHhhMCAgICAgICAgICAgLyogd3JpdGUgZGV2aWNlIDB4QTAgKi8KKyAgICBzdGIgICAgIHIxMCwgMTYocjE0KQorICAgIGVpZWlvCisgICAgYmwgICAgICB3YWl0U3BkCisgICAgYm5lICAgICBzcGRFcnIKKworICAgIGxieiAgICAgcjEwLCAxMihyMTQpICAgICAgICAvKiB0ZXN0IEFDSyAqLworICAgIGFuZGkuICAgcjEwLCByMTAsIDB4MDEKKyAgICBibmUgICAgIGdvdE5vQWNrCisKKyAgICBzdGIgICAgIHIzLCAxNihyMTQpICAgICAgICAgLyogZGF0YSBhZGRyZXNzICovCisgICAgZWllaW8KKyAgICBibCAgICAgIHdhaXRTcGQKKyAgICBibmUgICAgIHNwZEVycgorCisKKyAgICBsaSAgICAgIHIxMCwgMHhiNCAgICAgICAgICAgLyogc3dpdGNoIHRvIHJlYWQgLSByZXN0YXJ0ICovCisgICAgc3RiICAgICByMTAsIDgocjE0KQorICAgIGVpZWlvCisKKyAgICBsaSAgICAgIHIxMCwgMHhhMSAgICAgICAgICAgLyogcmVhZCBkZXZpY2UgMHhBMCAqLworICAgIHN0YiAgICAgcjEwLCAxNihyMTQpCisgICAgZWllaW8KKyAgICBibCAgICAgIHdhaXRTcGQKKyAgICBibmUgICAgIHNwZEVycgorCisgICAgbGkgICAgICByMTAsIDB4YTggICAgICAgICAgIC8qIG5vIEFDSyAqLworICAgIHN0YiAgICAgcjEwLCA4KHIxNCkKKyAgICBlaWVpbworCisgICAgbGJ6ICAgICByMTAsIDE2KHIxNCkgICAgICAgIC8qIHRyaWdnZXIgcmVhZCBuZXh0IGJ5dGUgKi8KKyAgICBlaWVpbworICAgIGJsICAgICAgd2FpdFNwZAorICAgIGJuZSAgICAgc3BkRXJyCisKKyAgICBsaSAgICAgIHIxMCwgMHg4OCAgICAgICAgICAgLyogZ2VuZXJhdGUgU1RPUCBjb25kaXRpb24gKi8KKyAgICBzdGIgICAgIHIxMCwgOChyMTQpCisgICAgZWllaW8KKworICAgIGxieiAgICAgcjMsIDE2KHIxNCkgICAgICAgICAvKiByZXR1cm4gcmVhZCBieXRlICovCisKKyAgICBtdHNwciAgIDgsIHIyNSAgICAgICAgICAgICAgLyogcmVzdG9yZSBsaW5rIHJlZ2lzdGVyICovCisgICAgYmxyCisKK2dvdE5vQWNrOgorICAgIGxpICAgICAgcjEwLCAweDgwICAgICAgICAgICAvKiBnZW5lcmF0ZSBTVE9QIGNvbmRpdGlvbiAqLworICAgIHN0YiAgICAgcjEwLCA4KHIxNCkKKyAgICBlaWVpbworc3BkRXJyOgorICAgIG9yYyAgICAgcjMsIHIwLCByMCAgICAgICAgICAvKiByZXR1cm4gLTEgKi8KKyAgICBtdHNwciAgIDgsIHIyNSAgICAgICAgICAgICAgLyogcmVzdG9yZSBsaW5rIHJlZ2lzdGVyICovCisgICAgYmxyCisKK2dldF9sbmtfcmVnOgorICAgIG1mbHIgICAgcjMgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gbGluayByZWcgKi8KKyAgICBibHIKKworTWVzc2FnZUJsb2NrOgorCitNaW5pdExvZ286CisgICAgLmFzY2lpICAiXDAxNVwwMTIqKiogRUxURUMgRWxla3Ryb25paywgTWFpbnogKioqXDAxNVwwMTIiCisgICAgLmFzY2lpICAiXDAxNVwwMTJJbml0aWFsaXNpbmcgUkFNXDAxNVwwMTJcMDAwIgorTXNwZDAxOgorICAgIC5hc2NpaSAgIiAgICAgICBSZWFkaW5nIFNQRCBvZiBTT0RJTU0gLi4uLi4uIFwwMDAiCitNcmFtVHlwOgorICAgIC5hc2NpaSAgIlwwMTVcMDEyXFNEUkFNIHdpdGggQ0w9MiBhdCAxMDAgTUh6IHJlcXVpcmVkIVwwMTVcMDEyXDAwMCIKK01yYW1Db25mRXJyOgorICAgIC5hc2NpaSAgIlwwMTVcMDEyXFVuc3VwcG9ydGVkIFNPRElNTSBDb25maWd1cmF0aW9uIVwwMTVcMDEyXDAwMCIKK01hY3RpdmF0ZToKKyAgICAuYXNjaWkgICIgICAgICAgQWN0aXZhdGluZyBcMDAwIgorTWFjdDAxMjNlOgorICAgIC5hc2NpaSAgIiBNQnl0ZS5cMDE1XDAxMlwwMDAiCitNb2s6CisgICAgLmFzY2lpICAiT0sgXDAxNVwwMTJcMDAwIgorTWZhaWw6CisgICAgLmFzY2lpICAiRkFJTEVEIFwwMTVcMDEyXDAwMCIKK01uZXdMaW5lOgorICAgIC5hc2NpaSAgIlwwMTVcMDEyXDAwMCIKKyAgICAuYWxpZ24gNApkaWZmIC0tZ2l0IGEvYm9hcmQvZWx0ZWMvZWxwcGMvdS1ib290LmxkcyBiL2JvYXJkL2VsdGVjL2VscHBjL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxMGMwZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2VsdGVjL2VscHBjL3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiB1LWJvb3QubGRzIC0gbGlua2VyIHNjcmlwdCBmb3IgVS1Cb290IG9uIHRoZSBHYWxpbGVvIEV2YWwgQm9hcmQuCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOworLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICBjcHUvNzR4eF83eHgvc3RhcnQubwkoLnRleHQpCisKKy8qIHN0b3JlIHRoZSBlbnZpcm9ubWVudCBpbiBhIHNlcGVyYXRlIHNlY3RvciBpbiB0aGUgYm9vdCBmbGFzaCAqLworLyogICAgLiA9IGVudl9vZmZzZXQ7ICovCisvKiAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkgKi8KKworICAgICooLnRleHQpCisgICAgKiguZml4dXApCisgICAgKiguZ290MSkKKyAgfQorICBfZXRleHQgPSAuOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgIDoKKyAgeworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MDBGRikgJiAweEZGRkZGRjAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PjI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXyk+PjI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oMjU2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oMjU2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9lcDczMTIvZmxhc2guYyBiL2JvYXJkL2VwNzMxMi9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3M2QyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9lcDczMTIvZmxhc2guYwpAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjZGVmaW5lIEZMQVNIX0JBTktfU0laRSAweDEwMDAwMDAKKyNkZWZpbmUgTUFJTl9TRUNUX1NJWkUgIDB4MjAwMDAKKworZmxhc2hfaW5mb190ICAgIGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3Vsb25nIGZsYXNoX2luaXQgKHZvaWQpCit7CisJaW50IGksIGo7CisJdWxvbmcgc2l6ZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0ZHX01BWF9GTEFTSF9CQU5LUzsgaSsrKSB7CisJCXVsb25nIGZsYXNoYmFzZSA9IDA7CisKKwkJZmxhc2hfaW5mb1tpXS5mbGFzaF9pZCA9CisJCQkJKElOVEVMX01BTlVGQUNUICYgRkxBU0hfVkVORE1BU0spIHwKKwkJCQkoSU5URUxfSURfMjhGMTI4SjMgJiBGTEFTSF9UWVBFTUFTSyk7CisJCWZsYXNoX2luZm9baV0uc2l6ZSA9IEZMQVNIX0JBTktfU0laRTsKKwkJZmxhc2hfaW5mb1tpXS5zZWN0b3JfY291bnQgPSBDRkdfTUFYX0ZMQVNIX1NFQ1Q7CisJCW1lbXNldCAoZmxhc2hfaW5mb1tpXS5wcm90ZWN0LCAwLCBDRkdfTUFYX0ZMQVNIX1NFQ1QpOworCQlpZiAoaSA9PSAwKQorCQkJZmxhc2hiYXNlID0gUEhZU19GTEFTSF8xOworCQllbHNlCisJCQlwYW5pYyAoImNvbmZpZ3VyZWQgdG8gbWFueSBmbGFzaCBiYW5rcyFcbiIpOworCQlmb3IgKGogPSAwOyBqIDwgZmxhc2hfaW5mb1tpXS5zZWN0b3JfY291bnQ7IGorKykgeworCQkJZmxhc2hfaW5mb1tpXS5zdGFydFtqXSA9IGZsYXNoYmFzZSArIGogKiBNQUlOX1NFQ1RfU0laRTsKKwkJfQorCQlzaXplICs9IGZsYXNoX2luZm9baV0uc2l6ZTsKKwl9CisKKwkvKiBQcm90ZWN0IG1vbml0b3IgYW5kIGVudmlyb25tZW50IHNlY3RvcnMKKwkgKi8KKwlmbGFzaF9wcm90ZWN0ICggRkxBR19QUk9URUNUX1NFVCwKKwkJCUNGR19GTEFTSF9CQVNFLAorCQkJQ0ZHX0ZMQVNIX0JBU0UgKyBfYXJtYm9vdF9lbmRfZGF0YSAtIF9hcm1ib290X3N0YXJ0LAorCQkJJmZsYXNoX2luZm9bMF0pOworCisJZmxhc2hfcHJvdGVjdCAoIEZMQUdfUFJPVEVDVF9TRVQsCisJCQlDRkdfRU5WX0FERFIsCisJCQlDRkdfRU5WX0FERFIgKyBDRkdfRU5WX1NJWkUgLSAxLCAmZmxhc2hfaW5mb1swXSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZsYXNoX3ByaW50X2luZm8gKGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJaW50IGk7CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spIHsKKwljYXNlIChJTlRFTF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKToKKwkJcHJpbnRmICgiSW50ZWw6ICIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYgKCJVbmtub3duIFZlbmRvciAiKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSB7CisJY2FzZSAoSU5URUxfSURfMjhGMTI4SjMgJiBGTEFTSF9UWVBFTUFTSyk6CisJCXByaW50ZiAoIjI4RjEyOEozICgxMjhNYml0KVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZiAoIlVua25vd24gQ2hpcCBUeXBlXG4iKTsKKwkJZ290byBEb25lOworCQlicmVhazsKKwl9CisKKwlwcmludGYgKCIgIFNpemU6ICVsZCBNQiBpbiAlZCBTZWN0b3JzXG4iLAorCQkJaW5mby0+c2l6ZSA+PiAyMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKworCXByaW50ZiAoIiAgU2VjdG9yIFN0YXJ0IEFkZHJlc3NlczoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJaWYgKChpICUgNSkgPT0gMCkgeworCQkJcHJpbnRmICgiXG4gICAiKTsKKwkJfQorCQlwcmludGYgKCIgJTA4bFglcyIsIGluZm8tPnN0YXJ0W2ldLAorCQkJCWluZm8tPnByb3RlY3RbaV0gPyAiIChSTykiIDogIiAgICAgIik7CisJfQorCXByaW50ZiAoIlxuIik7CisKKyAgRG9uZToKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK2ludCBmbGFzaF9lcmFzZSAoZmxhc2hfaW5mb190ICogaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCit7CisJaW50IGZsYWcsIHByb3QsIHNlY3Q7CisJaW50IHJjID0gRVJSX09LOworCisJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pCisJCXJldHVybiBFUlJfVU5LTk9XTl9GTEFTSF9UWVBFOworCisJaWYgKChzX2ZpcnN0IDwgMCkgfHwgKHNfZmlyc3QgPiBzX2xhc3QpKSB7CisJCXJldHVybiBFUlJfSU5WQUw7CisJfQorCisJaWYgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSAhPQorCQkoSU5URUxfTUFOVUZBQ1QgJiBGTEFTSF9WRU5ETUFTSykpIHsKKwkJcmV0dXJuIEVSUl9VTktOT1dOX0ZMQVNIX1ZFTkRPUjsKKwl9CisKKwlwcm90ID0gMDsKKwlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdDsgKytzZWN0KSB7CisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdKSB7CisJCQlwcm90Kys7CisJCX0KKwl9CisJaWYgKHByb3QpCisJCXJldHVybiBFUlJfUFJPVEVDVEVEOworCisJLyoKKwkgKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0CisJICogaGVyZS4gUmVtZW1iZXIgdGhhdCBvdXIgZXhjZXB0aW9uIHZlY3RvcnMgYXJlCisJICogYXQgYWRkcmVzcyAwIGluIHRoZSBmbGFzaCwgYW5kIHdlIGRvbid0IHdhbnQgYQorCSAqICh0aWNrZXIpIGV4Y2VwdGlvbiB0byBoYXBwZW4gd2hpbGUgdGhlIGZsYXNoCisJICogY2hpcCBpcyBpbiBwcm9ncmFtbWluZyBtb2RlLgorCSAqLworCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMgKCk7CisKKwkvKiBTdGFydCBlcmFzZSBvbiB1bnByb3RlY3RlZCBzZWN0b3JzICovCisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3QgJiYgIWN0cmxjICgpOyBzZWN0KyspIHsKKworCQlwcmludGYgKCJFcmFzaW5nIHNlY3RvciAlMmQgLi4uICIsIHNlY3QpOworCisJCS8qIGFybSBzaW1wbGUsIG5vbiBpbnRlcnJ1cHQgZGVwZW5kZW50IHRpbWVyICovCisJCXJlc2V0X3RpbWVyX21hc2tlZCAoKTsKKworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSA9PSAwKSB7CS8qIG5vdCBwcm90ZWN0ZWQgKi8KKwkJCXZ1X3Nob3J0ICphZGRyID0gKHZ1X3Nob3J0ICopIChpbmZvLT5zdGFydFtzZWN0XSk7CisKKwkJCSphZGRyID0gMHgyMDsJCS8qIGVyYXNlIHNldHVwICovCisJCQkqYWRkciA9IDB4RDA7CQkvKiBlcmFzZSBjb25maXJtICovCisKKwkJCXdoaWxlICgoKmFkZHIgJiAweDgwKSAhPSAweDgwKSB7CisJCQkJaWYgKGdldF90aW1lcl9tYXNrZWQgKCkgPiBDRkdfRkxBU0hfRVJBU0VfVE9VVCkgeworCQkJCQkqYWRkciA9IDB4QjA7CS8qIHN1c3BlbmQgZXJhc2UgKi8KKwkJCQkJKmFkZHIgPSAweEZGOwkvKiByZXNldCB0byByZWFkIG1vZGUgKi8KKwkJCQkJcmMgPSBFUlJfVElNT1VUOworCQkJCQlnb3RvIG91dGFoZXJlOworCQkJCX0KKwkJCX0KKworCQkJLyogY2xlYXIgc3RhdHVzIHJlZ2lzdGVyIGNvbW1hbmQgKi8KKwkJCSphZGRyID0gMHg1MDsKKwkJCS8qIHJlc2V0IHRvIHJlYWQgbW9kZSAqLworCQkJKmFkZHIgPSAweEZGOworCQl9CisJCXByaW50ZiAoIm9rLlxuIik7CisJfQorCWlmIChjdHJsYyAoKSkKKwkJcHJpbnRmICgiVXNlciBJbnRlcnJ1cHQhXG4iKTsKKworICBvdXRhaGVyZToKKworCS8qIGFsbG93IGZsYXNoIHRvIHNldHRsZSAtIHdhaXQgMTAgbXMgKi8KKwl1ZGVsYXlfbWFza2VkICgxMDAwMCk7CisKKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHkgbWVtb3J5IHRvIGZsYXNoCisgKi8KKworc3RhdGljIGludCB3cml0ZV93b3JkIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1bG9uZyBkZXN0LCB1c2hvcnQgZGF0YSkKK3sKKwl2dV9zaG9ydCAqYWRkciA9ICh2dV9zaG9ydCAqKSBkZXN0LCB2YWw7CisJaW50IHJjID0gRVJSX09LOworCWludCBmbGFnOworCisJLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkCisJICovCisJaWYgKCgqYWRkciAmIGRhdGEpICE9IGRhdGEpCisJCXJldHVybiBFUlJfTk9UX0VSQVNFRDsKKworCS8qCisJICogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dAorCSAqIGhlcmUuIFJlbWVtYmVyIHRoYXQgb3VyIGV4Y2VwdGlvbiB2ZWN0b3JzIGFyZQorCSAqIGF0IGFkZHJlc3MgMCBpbiB0aGUgZmxhc2gsIGFuZCB3ZSBkb24ndCB3YW50IGEKKwkgKiAodGlja2VyKSBleGNlcHRpb24gdG8gaGFwcGVuIHdoaWxlIHRoZSBmbGFzaAorCSAqIGNoaXAgaXMgaW4gcHJvZ3JhbW1pbmcgbW9kZS4KKwkgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJLyogY2xlYXIgc3RhdHVzIHJlZ2lzdGVyIGNvbW1hbmQgKi8KKwkqYWRkciA9IDB4NTA7CisKKwkvKiBwcm9ncmFtIHNldC11cCBjb21tYW5kICovCisJKmFkZHIgPSAweDQwOworCisJLyogbGF0Y2ggYWRkcmVzcy9kYXRhICovCisJKmFkZHIgPSBkYXRhOworCisJLyogYXJtIHNpbXBsZSwgbm9uIGludGVycnVwdCBkZXBlbmRlbnQgdGltZXIgKi8KKwlyZXNldF90aW1lcl9tYXNrZWQgKCk7CisKKwkvKiB3YWl0IHdoaWxlIHBvbGxpbmcgdGhlIHN0YXR1cyByZWdpc3RlciAqLworCXdoaWxlICgoKHZhbCA9ICphZGRyKSAmIDB4ODApICE9IDB4ODApIHsKKwkJaWYgKGdldF90aW1lcl9tYXNrZWQgKCkgPiBDRkdfRkxBU0hfV1JJVEVfVE9VVCkgeworCQkJcmMgPSBFUlJfVElNT1VUOworCQkJLyogc3VzcGVuZCBwcm9ncmFtIGNvbW1hbmQgKi8KKwkJCSphZGRyID0gMHhCMDsKKwkJCWdvdG8gb3V0YWhlcmU7CisJCX0KKwl9CisKKwlpZiAodmFsICYgMHgxQSkgewkJCS8qIGNoZWNrIGZvciBlcnJvciAqLworCQlwcmludGYgKCJcbkZsYXNoIHdyaXRlIGVycm9yICUwMnggYXQgYWRkcmVzcyAlMDhseFxuIiwKKwkJCQkoaW50KSB2YWwsICh1bnNpZ25lZCBsb25nKSBkZXN0KTsKKwkJaWYgKHZhbCAmICgxIDw8IDMpKSB7CisJCQlwcmludGYgKCJWb2x0YWdlIHJhbmdlIGVycm9yLlxuIik7CisJCQlyYyA9IEVSUl9QUk9HX0VSUk9SOworCQkJZ290byBvdXRhaGVyZTsKKwkJfQorCQlpZiAodmFsICYgKDEgPDwgMSkpIHsKKwkJCXByaW50ZiAoIkRldmljZSBwcm90ZWN0IGVycm9yLlxuIik7CisJCQlyYyA9IEVSUl9QUk9URUNURUQ7CisJCQlnb3RvIG91dGFoZXJlOworCQl9CisJCWlmICh2YWwgJiAoMSA8PCA0KSkgeworCQkJcHJpbnRmICgiUHJvZ3JhbW1pbmcgZXJyb3IuXG4iKTsKKwkJCXJjID0gRVJSX1BST0dfRVJST1I7CisJCQlnb3RvIG91dGFoZXJlOworCQl9CisJCXJjID0gRVJSX1BST0dfRVJST1I7CisJCWdvdG8gb3V0YWhlcmU7CisJfQorCisgIG91dGFoZXJlOgorCS8qIHJlYWQgYXJyYXkgY29tbWFuZCAqLworCSphZGRyID0gMHhGRjsKKworCWlmIChmbGFnKQorCQllbmFibGVfaW50ZXJydXB0cyAoKTsKKworCXJldHVybiByYzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2guCisgKi8KKworaW50IHdyaXRlX2J1ZmYgKGZsYXNoX2luZm9fdCAqIGluZm8sIHVjaGFyICogc3JjLCB1bG9uZyBhZGRyLCB1bG9uZyBjbnQpCit7CisJdWxvbmcgY3AsIHdwOworCXVzaG9ydCBkYXRhOworCWludCBsOworCWludCBpLCByYzsKKworCXdwID0gKGFkZHIgJiB+MSk7CQkJLyogZ2V0IGxvd2VyIHdvcmQgYWxpZ25lZCBhZGRyZXNzICovCisKKwkvKgorCSAqIGhhbmRsZSB1bmFsaWduZWQgc3RhcnQgYnl0ZXMKKwkgKi8KKwlpZiAoKGwgPSBhZGRyIC0gd3ApICE9IDApIHsKKwkJZGF0YSA9IDA7CisJCWZvciAoaSA9IDAsIGNwID0gd3A7IGkgPCBsOyArK2ksICsrY3ApIHsKKwkJCWRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqKHVjaGFyICopIGNwIDw8IDgpOworCQl9CisJCWZvciAoOyBpIDwgMiAmJiBjbnQgPiAwOyArK2kpIHsKKwkJCWRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqc3JjKysgPDwgOCk7CisJCQktLWNudDsKKwkJCSsrY3A7CisJCX0KKwkJZm9yICg7IGNudCA9PSAwICYmIGkgPCAyOyArK2ksICsrY3ApIHsKKwkJCWRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqKHVjaGFyICopIGNwIDw8IDgpOworCQl9CisKKwkJaWYgKChyYyA9IHdyaXRlX3dvcmQgKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworCQkJcmV0dXJuIChyYyk7CisJCX0KKwkJd3AgKz0gMjsKKwl9CisKKwkvKgorCSAqIGhhbmRsZSB3b3JkIGFsaWduZWQgcGFydAorCSAqLworCXdoaWxlIChjbnQgPj0gMikgeworCQlkYXRhID0gKigodnVfc2hvcnQgKikgc3JjKTsKKwkJaWYgKChyYyA9IHdyaXRlX3dvcmQgKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworCQkJcmV0dXJuIChyYyk7CisJCX0KKwkJc3JjICs9IDI7CisJCXdwICs9IDI7CisJCWNudCAtPSAyOworCX0KKworCWlmIChjbnQgPT0gMCkgeworCQlyZXR1cm4gRVJSX09LOworCX0KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpID0gMCwgY3AgPSB3cDsgaSA8IDIgJiYgY250ID4gMDsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqc3JjKysgPDwgOCk7CisJCS0tY250OworCX0KKwlmb3IgKDsgaSA8IDI7ICsraSwgKytjcCkgeworCQlkYXRhID0gKGRhdGEgPj4gOCkgfCAoKih1Y2hhciAqKSBjcCA8PCA4KTsKKwl9CisKKwlyZXR1cm4gd3JpdGVfd29yZCAoaW5mbywgd3AsIGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXA3MzEyL3UtYm9vdC5sZHMgYi9ib2FyZC9lcDczMTIvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODQ5NjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZXA3MzEyL3UtYm9vdC5sZHMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAgICAgICAuID0gMHgwMDAwMDAwMDsKKworICAgICAgICAuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L2FybTcyMHQvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLmRhdGEgOiB7ICooLmRhdGEpIH0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5nb3QgOiB7ICooLmdvdCkgfQorCisJYXJtYm9vdF9lbmRfZGF0YSA9IC47CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAuYnNzIDogeyAqKC5ic3MpIH0KKworCWFybWJvb3RfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jb21tb24vZnBnYS5jIGIvYm9hcmQvZXNkL2NvbW1vbi9mcGdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2YjQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2VzZC9jb21tb24vZnBnYS5jCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBNYXR0aGlhcyBGdWNocywgZXNkIGdtYmggZ2VybWFueSwgbWF0dGhpYXMuZnVjaHNAZXNkLWVsZWN0cm9uaWNzLmNvbQorICogU3RlZmFuIFJvZXNlLCBlc2QgZ21iaCBnZXJtYW55LCBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBGUEdBX0RFQlVHCisjZGVmaW5lIERCRyh4Li4uKSBwcmludGYoeCkKKyNlbHNlCisjZGVmaW5lIERCRyh4Li4uKQorI2VuZGlmIC8qIERFQlVHICovCisKKyNkZWZpbmUgTUFYX09ORVMgICAgICAgICAgICAgICAyMjYKKworI2RlZmluZSBJQk00MDVHUF9HUElPMF9PUiAgICAgIDB4ZWY2MDA3MDAgIC8qIEdQSU8gT3V0cHV0ICovCisjZGVmaW5lIElCTTQwNUdQX0dQSU8wX1RDUiAgICAgMHhlZjYwMDcwNCAgLyogR1BJTyBUaHJlZS1TdGF0ZSBDb250cm9sICovCisjZGVmaW5lIElCTTQwNUdQX0dQSU8wX09EUiAgICAgMHhlZjYwMDcxOCAgLyogR1BJTyBPcGVuIERyYWluICovCisjZGVmaW5lIElCTTQwNUdQX0dQSU8wX0lSICAgICAgMHhlZjYwMDcxYyAgLyogR1BJTyBJbnB1dCAqLworCisjaWZkZWYgQ0ZHX0ZQR0FfUFJHCisjIGRlZmluZSBGUEdBX1BSRyAgICAgICAgICAgICAgQ0ZHX0ZQR0FfUFJHIC8qIEZQR0EgcHJvZ3JhbSBwaW4gKHBwYyBvdXRwdXQpKi8KKyMgZGVmaW5lIEZQR0FfQ0xLICAgICAgICAgICAgICBDRkdfRlBHQV9DTEsgLyogRlBHQSBjbGsgcGluIChwcGMgb3V0cHV0KSAgICAqLworIyBkZWZpbmUgRlBHQV9EQVRBICAgICAgICAgICAgIENGR19GUEdBX0RBVEEgLyogRlBHQSBkYXRhIHBpbiAocHBjIG91dHB1dCkgICovCisjIGRlZmluZSBGUEdBX0RPTkUgICAgICAgICAgICAgQ0ZHX0ZQR0FfRE9ORSAvKiBGUEdBIGRvbmUgcGluIChwcGMgaW5wdXQpICAgKi8KKyMgZGVmaW5lIEZQR0FfSU5JVCAgICAgICAgICAgICBDRkdfRlBHQV9JTklUIC8qIEZQR0EgaW5pdCBwaW4gKHBwYyBpbnB1dCkgICAqLworI2Vsc2UKKyMgZGVmaW5lIEZQR0FfUFJHICAgICAgICAgICAgICAweDA0MDAwMDAwICAvKiBGUEdBIHByb2dyYW0gcGluIChwcGMgb3V0cHV0KSAqLworIyBkZWZpbmUgRlBHQV9DTEsgICAgICAgICAgICAgIDB4MDIwMDAwMDAgIC8qIEZQR0EgY2xrIHBpbiAocHBjIG91dHB1dCkgICAgICovCisjIGRlZmluZSBGUEdBX0RBVEEgICAgICAgICAgICAgMHgwMTAwMDAwMCAgLyogRlBHQSBkYXRhIHBpbiAocHBjIG91dHB1dCkgICAgKi8KKyMgZGVmaW5lIEZQR0FfRE9ORSAgICAgICAgICAgICAweDAwODAwMDAwICAvKiBGUEdBIGRvbmUgcGluIChwcGMgaW5wdXQpICAgICAqLworIyBkZWZpbmUgRlBHQV9JTklUICAgICAgICAgICAgIDB4MDA0MDAwMDAgIC8qIEZQR0EgaW5pdCBwaW4gKHBwYyBpbnB1dCkgICAgICovCisjZW5kaWYKKworI2RlZmluZSBFUlJPUl9GUEdBX1BSR19JTklUX0xPVyAgLTEgICAgICAgIC8qIFRpbWVvdXQgYWZ0ZXIgUFJHKiBhc3NlcnRlZCAgICovCisjZGVmaW5lIEVSUk9SX0ZQR0FfUFJHX0lOSVRfSElHSCAtMiAgICAgICAgLyogVGltZW91dCBhZnRlciBQUkcqIGRlYXNzZXJ0ZWQgKi8KKyNkZWZpbmUgRVJST1JfRlBHQV9QUkdfRE9ORSAgICAgIC0zICAgICAgICAvKiBUaW1lb3V0IGFmdGVyIHByb2dyYW1taW5nICAgICAqLworCisjZGVmaW5lIFNFVF9GUEdBKGRhdGEpICAgICAgICAgb3V0MzIoSUJNNDA1R1BfR1BJTzBfT1IsIGRhdGEpCisKKyNkZWZpbmUgRlBHQV9XUklURV8xIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTRVRfRlBHQShGUEdBX1BSRyB8ICAgICAgICAgICAgRlBHQV9EQVRBKTsgIC8qIHNldCBjbG9jayB0byAwICovICBcCisgICAgICAgIFNFVF9GUEdBKEZQR0FfUFJHIHwgICAgICAgICAgICBGUEdBX0RBVEEpOyAgLyogc2V0IGRhdGEgdG8gMSAgKi8gIFwKKyAgICAgICAgU0VUX0ZQR0EoRlBHQV9QUkcgfCBGUEdBX0NMSyB8IEZQR0FfREFUQSk7ICAvKiBzZXQgY2xvY2sgdG8gMSAqLyAgXAorICAgICAgICBTRVRfRlBHQShGUEdBX1BSRyB8IEZQR0FfQ0xLIHwgRlBHQV9EQVRBKTt9IC8qIHNldCBkYXRhIHRvIDEgICovCisKKyNkZWZpbmUgRlBHQV9XUklURV8wIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTRVRfRlBHQShGUEdBX1BSRyB8ICAgICAgICAgICAgRlBHQV9EQVRBKTsgIC8qIHNldCBjbG9jayB0byAwICovICBcCisgICAgICAgIFNFVF9GUEdBKEZQR0FfUFJHKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGRhdGEgdG8gMCAgKi8gIFwKKyAgICAgICAgU0VUX0ZQR0EoRlBHQV9QUkcgfCBGUEdBX0NMSyk7ICAgICAgICAgICAgICAvKiBzZXQgY2xvY2sgdG8gMSAqLyAgXAorICAgICAgICBTRVRfRlBHQShGUEdBX1BSRyB8IEZQR0FfQ0xLIHwgRlBHQV9EQVRBKTt9IC8qIHNldCBkYXRhIHRvIDEgICovCisKKworc3RhdGljIGludCBmcGdhX2Jvb3QodW5zaWduZWQgY2hhciAqZnBnYWRhdGEsIGludCBzaXplKQoreworICBpbnQgaSxpbmRleCxsZW47CisgIGludCBjb3VudDsKKyNpZmRlZiBDRkdfRlBHQV9TUEFSVEFOMgorICBpbnQgajsKKyNlbHNlCisgIHVuc2lnbmVkIGNoYXIgYjsKKyAgaW50IGJpdDsKKyNlbmRpZgorCisgIC8qIGRpc3BsYXkgaW5mb3Mgb24gZnBnYWltYWdlICovCisgIGluZGV4ID0gMTU7CisgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICB7CisgICAgICBsZW4gPSBmcGdhZGF0YVtpbmRleF07CisgICAgICBEQkcoIkZQR0E6ICVzXG4iLCAmKGZwZ2FkYXRhW2luZGV4KzFdKSk7CisgICAgICBpbmRleCArPSBsZW4rMzsKKyAgICB9CisKKyNpZmRlZiBDRkdfRlBHQV9TUEFSVEFOMgorICAvKiBzZWFyY2ggZm9yIHByZWFtYmxlIDB4RkZGRkZGRkYgKi8KKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKChmcGdhZGF0YVtpbmRleF0gPT0gMHhmZikgJiYgKGZwZ2FkYXRhW2luZGV4KzFdID09IDB4ZmYpICYmCisgICAgICAgICAgKGZwZ2FkYXRhW2luZGV4KzJdID09IDB4ZmYpICYmIChmcGdhZGF0YVtpbmRleCszXSA9PSAweGZmKSkKKyAgICAgICAgYnJlYWs7IC8qIHByZWFtYmxlIGZvdW5kICovCisgICAgICBlbHNlCisgICAgICAgIGluZGV4Kys7CisgICAgfQorI2Vsc2UKKyAgLyogc2VhcmNoIGZvciBwcmVhbWJsZSAweEZGMlggKi8KKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2l6ZS0xIDsgaW5kZXgrKykKKyAgICB7CisgICAgICBpZiAoKGZwZ2FkYXRhW2luZGV4XSA9PSAweGZmKSAmJiAoKGZwZ2FkYXRhW2luZGV4KzFdICYgMHhmMCkgPT0gMHgzMCkpCisJYnJlYWs7CisgICAgfQorICBpbmRleCArPSAyOworI2VuZGlmCisKKyAgREJHKCJGUEdBOiBjb25maWdkYXRhIHN0YXJ0cyBhdCBwb3NpdGlvbiAweCV4XG4iLGluZGV4KTsKKyAgREJHKCJGUEdBOiBsZW5ndGggb2YgZnBnYS1kYXRhICVkXG4iLCBzaXplLWluZGV4KTsKKworICAvKgorICAgKiBTZXR1cCBwb3J0IHBpbnMgZm9yIGZwZ2EgcHJvZ3JhbW1pbmcKKyAgICovCisgIG91dDMyKElCTTQwNUdQX0dQSU8wX09EUiwgMHgwMDAwMDAwMCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBvcGVuIGRyYWluIHBpbnMgICAgICAqLworICBvdXQzMihJQk00MDVHUF9HUElPMF9UQ1IsIEZQR0FfUFJHIHwgRlBHQV9DTEsgfCBGUEdBX0RBVEEpOyAgLyogc2V0dXAgZm9yIG91dHB1dCAgICAgICAgKi8KKyAgb3V0MzIoSUJNNDA1R1BfR1BJTzBfT1IsICBGUEdBX1BSRyB8IEZQR0FfQ0xLIHwgRlBHQV9EQVRBKTsgIC8qIHNldCBvdXRwdXQgcGlucyB0byBoaWdoICovCisKKyAgREJHKCIlcywgIiwoKGluMzIoSUJNNDA1R1BfR1BJTzBfSVIpICYgRlBHQV9ET05FKSA9PSAwKSA/ICJOT1QgRE9ORSIgOiAiRE9ORSIgKTsKKyAgREJHKCIlc1xuIiwoKGluMzIoSUJNNDA1R1BfR1BJTzBfSVIpICYgRlBHQV9JTklUKSA9PSAwKSA/ICJOT1QgSU5JVCIgOiAiSU5JVCIgKTsKKworICAvKgorICAgKiBJbml0IGZwZ2EgYnkgYXNzZXJ0aW5nIGFuZCBkZWFzc2VydGluZyBQUk9HUkFNKgorICAgKi8KKyAgU0VUX0ZQR0EoRlBHQV9DTEsgfCBGUEdBX0RBVEEpOworCisgIC8qIFdhaXQgZm9yIEZQR0EgaW5pdCBsaW5lIGxvdyAqLworICBjb3VudCA9IDA7CisgIHdoaWxlIChpbjMyKElCTTQwNUdQX0dQSU8wX0lSKSAmIEZQR0FfSU5JVCkKKyAgICB7CisgICAgICB1ZGVsYXkoMTAwMCk7IC8qIHdhaXQgMW1zICovCisgICAgICAvKiBDaGVjayBmb3IgdGltZW91dCAtIDEwMHVzIG1heCwgc28gdXNlIDNtcyAqLworICAgICAgaWYgKGNvdW50KysgPiAzKQorICAgICAgICB7CisgICAgICAgICAgREJHKCJGUEdBOiBCb290aW5nIGZhaWxlZCFcbiIpOworICAgICAgICAgIHJldHVybiBFUlJPUl9GUEdBX1BSR19JTklUX0xPVzsKKyAgICAgICAgfQorICAgIH0KKworICBEQkcoIiVzLCAiLCgoaW4zMihJQk00MDVHUF9HUElPMF9JUikgJiBGUEdBX0RPTkUpID09IDApID8gIk5PVCBET05FIiA6ICJET05FIiApOworICBEQkcoIiVzXG4iLCgoaW4zMihJQk00MDVHUF9HUElPMF9JUikgJiBGUEdBX0lOSVQpID09IDApID8gIk5PVCBJTklUIiA6ICJJTklUIiApOworCisgIC8qIGRlYXNzZXJ0IFBST0dSQU0qICovCisgIFNFVF9GUEdBKEZQR0FfUFJHIHwgRlBHQV9DTEsgfCBGUEdBX0RBVEEpOworCisgIC8qIFdhaXQgZm9yIEZQR0EgZW5kIG9mIGluaXQgcGVyaW9kIC4gICovCisgIGNvdW50ID0gMDsKKyAgd2hpbGUgKCEoaW4zMihJQk00MDVHUF9HUElPMF9JUikgJiBGUEdBX0lOSVQpKQorICAgIHsKKyAgICAgIHVkZWxheSgxMDAwKTsgLyogd2FpdCAxbXMgKi8KKyAgICAgIC8qIENoZWNrIGZvciB0aW1lb3V0ICovCisgICAgICBpZiAoY291bnQrKyA+IDMpCisgICAgICAgIHsKKyAgICAgICAgICBEQkcoIkZQR0E6IEJvb3RpbmcgZmFpbGVkIVxuIik7CisgICAgICAgICAgcmV0dXJuIEVSUk9SX0ZQR0FfUFJHX0lOSVRfSElHSDsKKyAgICAgICAgfQorICAgIH0KKworICBEQkcoIiVzLCAiLCgoaW4zMihJQk00MDVHUF9HUElPMF9JUikgJiBGUEdBX0RPTkUpID09IDApID8gIk5PVCBET05FIiA6ICJET05FIiApOworICBEQkcoIiVzXG4iLCgoaW4zMihJQk00MDVHUF9HUElPMF9JUikgJiBGUEdBX0lOSVQpID09IDApID8gIk5PVCBJTklUIiA6ICJJTklUIiApOworCisgIERCRygid3JpdGUgY29uZmlndXJhdGlvbiBkYXRhIGludG8gZnBnYVxuIik7CisgIC8qIHdyaXRlIGNvbmZpZ3VyYXRpb24tZGF0YSBpbnRvIGZwZ2EuLi4gKi8KKworI2lmZGVmIENGR19GUEdBX1NQQVJUQU4yCisgIC8qCisgICAqIExvYWQgdW5jb21wcmVzc2VkIGltYWdlIGludG8gZnBnYQorICAgKi8KKyAgZm9yIChpPWluZGV4OyBpPHNpemU7IGkrKykKKyAgICB7CisgICAgICBmb3IgKGo9MDsgajw4OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKGZwZ2FkYXRhW2ldICYgMHg4MCkgPT0gMHg4MCkKKwkgICAgeworICAgICAgICAgICAgICBGUEdBX1dSSVRFXzE7CisJICAgIH0KKyAgICAgICAgICBlbHNlCisJICAgIHsKKyAgICAgICAgICAgICAgRlBHQV9XUklURV8wOworCSAgICB9CisgICAgICAgICAgZnBnYWRhdGFbaV0gPDw9IDE7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAvKiBzZW5kIDB4ZmYgMHgyMCAqLworICBGUEdBX1dSSVRFXzE7IEZQR0FfV1JJVEVfMTsgRlBHQV9XUklURV8xOyBGUEdBX1dSSVRFXzE7CisgIEZQR0FfV1JJVEVfMTsgRlBHQV9XUklURV8xOyBGUEdBX1dSSVRFXzE7IEZQR0FfV1JJVEVfMTsKKyAgRlBHQV9XUklURV8wOyBGUEdBX1dSSVRFXzA7IEZQR0FfV1JJVEVfMTsgRlBHQV9XUklURV8wOworICBGUEdBX1dSSVRFXzA7IEZQR0FfV1JJVEVfMDsgRlBHQV9XUklURV8wOyBGUEdBX1dSSVRFXzA7CisKKyAgLyoKKyAgKiogQml0X0RlQ29tcHJlc3Npb24KKyAgKiogICBDb2RlIDEgICAgICAgICAgIC4uIG1heE9uZXMgICAgIDogbiAgICAgICAgICAgICAgICAgJzEncyBmb2xsb3dlZCBieSAnMCcKKyAgKiogICAgICAgIG1heE9uZXMgKyAxIC4uIG1heE9uZXMgKyAxIDogbiAtIDEgICAgICAgICAgICAgJzEncyBubyAnMCcKKyAgKiogICAgICAgIG1heE9uZXMgKyAyIC4uIDI1NCAgICAgICAgIDogbiAtIChtYXhPbmVzICsgMikgJzAncyBmb2xsb3dlZCBieSAnMScKKyAgKiogICAgICAgIDI1NSAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgJzEnCisgICovCisKKyAgZm9yIChpPWluZGV4OyBpPHNpemU7IGkrKykKKyAgICB7CisgICAgICBiID0gZnBnYWRhdGFbaV07CisgICAgICBpZiAoKGIgPj0gMSkgJiYgKGIgPD0gTUFYX09ORVMpKQorCXsKKwkgIGZvcihiaXQ9MDsgYml0PGI7IGJpdCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBGUEdBX1dSSVRFXzE7CisgICAgICAgICAgICB9CisJICBGUEdBX1dSSVRFXzA7CisJfQorICAgICAgZWxzZSBpZiAoYiA9PSAoTUFYX09ORVMrMSkpCisJeworCSAgZm9yKGJpdD0xOyBiaXQ8YjsgYml0KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZQR0FfV1JJVEVfMTsKKyAgICAgICAgICAgIH0KKwl9CisgICAgICBlbHNlIGlmICgoYiA+PSAoTUFYX09ORVMrMikpICYmIChiIDw9IDI1NCkpCisJeworCSAgZm9yKGJpdD0wOyBiaXQ8KGItKE1BWF9PTkVTKzIpKTsgYml0KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZQR0FfV1JJVEVfMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBGUEdBX1dSSVRFXzE7CisJfQorICAgICAgZWxzZSBpZiAoYiA9PSAyNTUpCisgICAgICAgIHsKKyAgICAgICAgICBGUEdBX1dSSVRFXzE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICBEQkcoIiVzLCAiLCgoaW4zMihJQk00MDVHUF9HUElPMF9JUikgJiBGUEdBX0RPTkUpID09IDApID8gIk5PVCBET05FIiA6ICJET05FIiApOworICBEQkcoIiVzXG4iLCgoaW4zMihJQk00MDVHUF9HUElPMF9JUikgJiBGUEdBX0lOSVQpID09IDApID8gIk5PVCBJTklUIiA6ICJJTklUIiApOworCisgIC8qCisgICAqIENoZWNrIGlmIGZwZ2EncyBET05FIHNpZ25hbCAtIGNvcnJlY3RseSBib290ZWQgPworICAgKi8KKworICAvKiBXYWl0IGZvciBGUEdBIGVuZCBvZiBwcm9ncmFtbWluZyBwZXJpb2QgLiAgKi8KKyAgY291bnQgPSAwOworICB3aGlsZSAoIShpbjMyKElCTTQwNUdQX0dQSU8wX0lSKSAmIEZQR0FfRE9ORSkpCisgICAgeworICAgICAgdWRlbGF5KDEwMDApOyAvKiB3YWl0IDFtcyAqLworICAgICAgLyogQ2hlY2sgZm9yIHRpbWVvdXQgKi8KKyAgICAgIGlmIChjb3VudCsrID4gMykKKyAgICAgICAgeworICAgICAgICAgIERCRygiRlBHQTogQm9vdGluZyBmYWlsZWQhXG4iKTsKKyAgICAgICAgICByZXR1cm4gRVJST1JfRlBHQV9QUkdfRE9ORTsKKyAgICAgICAgfQorICAgIH0KKworICBEQkcoIkZQR0E6IEJvb3Rpbmcgc3VjY2Vzc2Z1bCFcbiIpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jb21tb24vcGNpLmMgYi9ib2FyZC9lc2QvY29tbW9uL3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZjE4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9lc2QvY29tbW9uL3BjaS5jCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBTdGVmYW4gUm9lc2UsIGVzZCBnbWJoIGdlcm1hbnksIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHBwYzR4eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworCit1X2xvbmcgcGNpOTA1NF9pb2Jhc2U7CisKKworI2RlZmluZSBQQ0lfUFJJTUFSWV9DQVIJKDB4NTAwMDAwZGMpIC8qIFBDSSBjb25maWcgYWRkcmVzcyByZWcgKi8KKyNkZWZpbmUgUENJX1BSSU1BUllfQ0RSCSgweDgwMDAwMDAwKSAvKiBQQ0kgY29uZmlnIGRhdGEgICAgcmVnICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgIFN1YnJvdXRpbmU6ICBwY2k5MDU0X3JlYWRfY29uZmlnX2R3b3JkCit8ICBEZXNjcmlwdGlvbjogUmVhZCBhIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCit8ICBJbnB1dHM6Cit8ICAgICAgICAgICAgICAgaG9zZSAgICAgICAgICAgIFBDSSBDb250cm9sbGVyCit8ICAgICAgICAgICAgICAgZGV2ICAgICAgICAgICAgIFBDSSBCdXMrRGV2aWNlK0Z1bmN0aW9uIG51bWJlcgorfCAgICAgICAgICAgICAgIG9mZnNldCAgICAgICAgICBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIG51bWJlcgorfCAgICAgICAgICAgICAgIHZhbHVlICAgICAgICAgICBBZGRyZXNzIG9mIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHZhbHVlCit8ICBSZXR1cm4gdmFsdWU6Cit8ICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIFN1Y2Nlc3NmdWwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgcGNpOTA1NF9yZWFkX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkgICAgICBwY2lfZGV2X3QgZGV2LCBpbnQgb2Zmc2V0LCB1MzIqIHZhbHVlKQoreworICB1bnNpZ25lZCBsb25nICAgICAgY29uQWRyVmFsOworICB1bnNpZ25lZCBsb25nICAgICAgdmFsOworCisgIC8qIGdlbmVyYXRlIGNvZGVkIHZhbHVlIGZvciBDT05fQURSIHJlZ2lzdGVyICovCisgIGNvbkFkclZhbCA9IGRldiB8IChvZmZzZXQgJiAweGZjKSB8IDB4ODAwMDAwMDA7CisKKyAgLyogTG9hZCB0aGUgQ09OX0FEUiAoQ0FSKSB2YWx1ZSBmaXJzdCwgdGhlbiByZWFkIGZyb20gQ09OX0RBVEEgKENEUikgKi8KKyAgKih1bnNpZ25lZCBsb25nICopUENJX1BSSU1BUllfQ0FSID0gY29uQWRyVmFsOworCisgIC8qIE5vdGU6ICpwUmVzdWx0IGNvbWVzIGJhY2sgYXMgLTEgaWYgbWFjaGluZSBjaGVjayBoYXBwZW5lZCAqLworICB2YWwgPSBpbjMycihQQ0lfUFJJTUFSWV9DRFIpOworCisgICp2YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSB2YWw7CisKKyAgb3V0MzJyKFBDSV9QUklNQVJZX0NBUiwgMCk7CisKKyAgaWYgKCgqKHVuc2lnbmVkIGxvbmcgKikweDUwMDAwMzA0KSAmIDB4NjAwMDAwMDApCisgICAgeworICAgICAgLyogY2xlYXIgcGNpIG1hc3Rlci90YXJnZXQgYWJvcnQgYml0cyAqLworICAgICAgKih1bnNpZ25lZCBsb25nICopMHg1MDAwMDMwNCA9ICoodW5zaWduZWQgbG9uZyAqKTB4NTAwMDAzMDQ7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCAgU3Vicm91dGluZTogIHBjaTkwNTRfd3JpdGVfY29uZmlnX2R3b3JkCit8ICBEZXNjcmlwdGlvbjogV3JpdGUgYSBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KK3wgIElucHV0czoKK3wgICAgICAgICAgICAgICBob3NlICAgICAgICAgICAgUENJIENvbnRyb2xsZXIKK3wgICAgICAgICAgICAgICBkZXYgICAgICAgICAgICAgUENJIEJ1cytEZXZpY2UrRnVuY3Rpb24gbnVtYmVyCit8ICAgICAgICAgICAgICAgb2Zmc2V0ICAgICAgICAgIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgbnVtYmVyCit8ICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdmFsdWUKK3wgIFJldHVybiB2YWx1ZToKK3wgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgU3VjY2Vzc2Z1bAorfCBVcGRhdGVkIGZvciBwYXNzMiBlcnJhdGEgIzYuIE5lZWQgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBjbGVhciB0aGUKK3wgUENJQ0ZHQURSIHJlZyBhZnRlciB3cml0aW5nIHRoZSBQQ0lDRkdEQVRBIHJlZy4KKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgcGNpOTA1NF93cml0ZV9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJICAgICAgIHBjaV9kZXZfdCBkZXYsIGludCBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKyAgdW5zaWduZWQgbG9uZyAgICAgIGNvbkFkclZhbDsKKworICBjb25BZHJWYWwgPSBkZXYgfCAob2Zmc2V0ICYgMHhmYykgfCAweDgwMDAwMDAwOworCisgICoodW5zaWduZWQgbG9uZyAqKVBDSV9QUklNQVJZX0NBUiA9IGNvbkFkclZhbDsKKworICBvdXQzMnIoUENJX1BSSU1BUllfQ0RSLCB2YWx1ZSk7CisKKyAgb3V0MzJyKFBDSV9QUklNQVJZX0NBUiwgMCk7CisKKyAgLyogY2xlYXIgcGNpIG1hc3Rlci90YXJnZXQgYWJvcnQgYml0cyAqLworICAqKHVuc2lnbmVkIGxvbmcgKikweDUwMDAwMzA0ID0gKih1bnNpZ25lZCBsb25nICopMHg1MDAwMDMwNDsKKworICByZXR1cm4gKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmZGVmIENPTkZJR19EQVNBX1NJTQorc3RhdGljIHZvaWQgcGNpX2Rhc2Ffc2ltX2NvbmZpZ19wY2k5MDU0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldiwKKwkJCQkJc3RydWN0IHBjaV9jb25maWdfdGFibGUgKl8pCit7CisgIHVuc2lnbmVkIGludCBpb2Jhc2U7CisgIHVuc2lnbmVkIHNob3J0IHN0YXR1cyA9IDA7CisgIHVuc2lnbmVkIGNoYXIgdGltZXI7CisKKyAgLyoKKyAgICogQ29uZmlndXJlIFBMWCBQQ0k5MDU0CisgICAqLworICBwY2lfcmVhZF9jb25maWdfd29yZChDRkdfUENJOTA1NF9ERVZfRk4sIFBDSV9DT01NQU5ELCAmc3RhdHVzKTsKKyAgc3RhdHVzIHw9IFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZOworICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoQ0ZHX1BDSTkwNTRfREVWX0ZOLCBQQ0lfQ09NTUFORCwgc3RhdHVzKTsKKworICAvKiBDaGVjayB0aGUgbGF0ZW5jeSB0aW1lciBmb3IgdmFsdWVzID49IDB4NjAuCisgICAqLworICBwY2lfcmVhZF9jb25maWdfYnl0ZShDRkdfUENJOTA1NF9ERVZfRk4sIFBDSV9MQVRFTkNZX1RJTUVSLCAmdGltZXIpOworICBpZiAodGltZXIgPCAweDYwKQorICAgIHsKKyAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShDRkdfUENJOTA1NF9ERVZfRk4sIFBDSV9MQVRFTkNZX1RJTUVSLCAweDYwKTsKKyAgICB9CisKKyAgLyogU2V0IEkvTyBiYXNlIHJlZ2lzdGVyLgorICAgKi8KKyAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChDRkdfUENJOTA1NF9ERVZfRk4sIFBDSV9CQVNFX0FERFJFU1NfMCwgQ0ZHX1BDSTkwNTRfSU9CQVNFKTsKKyAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKENGR19QQ0k5MDU0X0RFVl9GTiwgUENJX0JBU0VfQUREUkVTU18wLCAmaW9iYXNlKTsKKworICBwY2k5MDU0X2lvYmFzZSA9IHBjaV9tZW1fdG9fcGh5cyhDRkdfUENJOTA1NF9ERVZfRk4sIGlvYmFzZSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCisgIGlmIChwY2k5MDU0X2lvYmFzZSA9PSAweGZmZmZmZmZmKQorICAgIHsKKyAgICAgIHByaW50ZigiRXJyb3I6IENhbiBub3Qgc2V0IEkvTyBiYXNlIHJlZ2lzdGVyLlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBwY2k5MDU0X2NvbmZpZ190YWJsZVtdID0geworI2lmbmRlZiBDT05GSUdfUENJX1BOUAorICB7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisgICAgUENJX0JVUyhDRkdfRVRIX0RFVl9GTiksIFBDSV9ERVYoQ0ZHX0VUSF9ERVZfRk4pLCBQQ0lfRlVOQyhDRkdfRVRIX0RFVl9GTiksCisgICAgcGNpX2NmZ2Z1bmNfY29uZmlnX2RldmljZSwgeyBDRkdfRVRIX0lPQkFTRSwKKwkJCQkgQ0ZHX0VUSF9JT0JBU0UsCisJCQkJIFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUFTVEVSIH19LAorI2lmZGVmIENPTkZJR19EQVNBX1NJTQorICB7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisgICAgUENJX0JVUyhDRkdfUENJOTA1NF9ERVZfRk4pLCBQQ0lfREVWKENGR19QQ0k5MDU0X0RFVl9GTiksIFBDSV9GVU5DKENGR19QQ0k5MDU0X0RFVl9GTiksCisgICAgcGNpX2Rhc2Ffc2ltX2NvbmZpZ19wY2k5MDU0IH0sCisjZW5kaWYKKyNlbmRpZgorICB7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpOTA1NF9ob3NlID0geworICBjb25maWdfdGFibGU6IHBjaTkwNTRfY29uZmlnX3RhYmxlLAorfTsKKwordm9pZCBwY2lfaW5pdCh2b2lkKQoreworICBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAmcGNpOTA1NF9ob3NlOworCisgIC8qCisgICAqIFJlZ2lzdGVyIHRoZSBob3NlCisgICAqLworICBob3NlLT5maXJzdF9idXNubyA9IDA7CisgIGhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOworCisgIC8qIFN5c3RlbSBtZW1vcnkgc3BhY2UgKi8KKyAgcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCSAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAxMDAwMDAwLAorCQkgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKyAgLyogUENJIE1lbW9yeSBzcGFjZSAqLworICBwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJIDB4MDAwMDAwMDAsIDB4YzAwMDAwMDAsIDB4MTAwMDAwMDAsCisJCSBQQ0lfUkVHSU9OX01FTSk7CisKKyAgcGNpX3NldF9vcHMoaG9zZSwKKwkgICAgICBwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlX3ZpYV9kd29yZCwKKwkgICAgICBwY2lfaG9zZV9yZWFkX2NvbmZpZ193b3JkX3ZpYV9kd29yZCwKKwkgICAgICBwY2k5MDU0X3JlYWRfY29uZmlnX2R3b3JkLAorCSAgICAgIHBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlX3ZpYV9kd29yZCwKKwkgICAgICBwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZF92aWFfZHdvcmQsCisJICAgICAgcGNpOTA1NF93cml0ZV9jb25maWdfZHdvcmQpOworCisgIGhvc2UtPnJlZ2lvbl9jb3VudCA9IDI7CisKKyAgcGNpX3JlZ2lzdGVyX2hvc2UoaG9zZSk7CisKKyAgaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY3BjaTQwNS9jcGNpNDA1LmMgYi9ib2FyZC9lc2QvY3BjaTQwNS9jcGNpNDA1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkYThmYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2VzZC9jcGNpNDA1L2NwY2k0MDUuYwpAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogU3RlZmFuIFJvZXNlLCBlc2QgZ21iaCBnZXJtYW55LCBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNtZF9ib290Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIDAKKyNkZWZpbmUgRlBHQV9ERUJVRworI2VuZGlmCisKKy8qIGZwZ2EgY29uZmlndXJhdGlvbiBkYXRhIC0gZ2VuZXJhdGVkIGJ5IGJpbjJjYyAqLworY29uc3QgdW5zaWduZWQgY2hhciBmcGdhZGF0YVtdID0KK3sKKyNpZmRlZiBDT05GSUdfQ1BDSTQwNV9WRVIyCisjIGluY2x1ZGUgImZwZ2FkYXRhX2NwY2k0MDUyLmMiCisjZWxzZQorIyBpbmNsdWRlICJmcGdhZGF0YV9jcGNpNDA1LmMiCisjZW5kaWYKK307CisKKy8qCisgKiBpbmNsdWRlIGNvbW1vbiBmcGdhIGNvZGUgKGZvciBlc2QgYm9hcmRzKQorICovCisjaW5jbHVkZSAiLi4vY29tbW9uL2ZwZ2EuYyIKKworCisvKiBQcm90b3R5cGVzICovCitpbnQgdmVyc2lvbjIodm9pZCk7CitpbnQgZ3VuemlwKHZvaWQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCAqKTsKKworCitpbnQgYm9hcmRfcHJlX2luaXQgKHZvaWQpCit7CisjaWZuZGVmIENPTkZJR19DUENJNDA1X1ZFUjIKKwlpbnQgaW5kZXgsIGxlbiwgaTsKKwlpbnQgc3RhdHVzOworI2VuZGlmCisKKyNpZmRlZiBGUEdBX0RFQlVHCisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwkvKiBzZXQgdXAgc2VyaWFsIHBvcnQgd2l0aCBkZWZhdWx0IGJhdWRyYXRlICovCisJKHZvaWQpIGdldF9jbG9ja3MgKCk7CisJZ2QtPmJhdWRyYXRlID0gQ09ORklHX0JBVURSQVRFOworCXNlcmlhbF9pbml0ICgpOworCWNvbnNvbGVfaW5pdF9mKCk7CisjZW5kaWYKKworCS8qCisJICogRmlyc3QgcHVsbCBmcGdhLXByZyBwaW4gbG93LCB0byBkaXNhYmxlIGZwZ2EgbG9naWMgKG9uIHZlcnNpb24gMiBib2FyZCkKKwkgKi8KKwlvdXQzMihJQk00MDVHUF9HUElPMF9PRFIsIDB4MDAwMDAwMDApOyAgICAgICAgLyogbm8gb3BlbiBkcmFpbiBwaW5zICAgICAgKi8KKwlvdXQzMihJQk00MDVHUF9HUElPMF9UQ1IsIENGR19GUEdBX1BSRyk7ICAgICAgLyogc2V0dXAgZm9yIG91dHB1dCAgICAgICAgKi8KKwlvdXQzMihJQk00MDVHUF9HUElPMF9PUiwgIENGR19GUEdBX1BSRyk7ICAgICAgLyogc2V0IG91dHB1dCBwaW5zIHRvIGhpZ2ggKi8KKwlvdXQzMihJQk00MDVHUF9HUElPMF9PUiwgMCk7ICAgICAgICAgICAgICAgICAgLyogcHVsbCBwcmcgbG93ICAgICAgICAgICAgKi8KKworCS8qCisJICogQm9vdCBvbmJvYXJkIEZQR0EKKwkgKi8KKyNpZm5kZWYgQ09ORklHX0NQQ0k0MDVfVkVSMgorCWlmICghdmVyc2lvbjIoKSkgeworCQlzdGF0dXMgPSBmcGdhX2Jvb3QoKHVuc2lnbmVkIGNoYXIgKilmcGdhZGF0YSwgc2l6ZW9mKGZwZ2FkYXRhKSk7CisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJLyogYm9vdGluZyBGUEdBIGZhaWxlZCAqLworI2lmbmRlZiBGUEdBX0RFQlVHCisJCQlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCQkJLyogc2V0IHVwIHNlcmlhbCBwb3J0IHdpdGggZGVmYXVsdCBiYXVkcmF0ZSAqLworCQkJKHZvaWQpIGdldF9jbG9ja3MgKCk7CisJCQlnZC0+YmF1ZHJhdGUgPSBDT05GSUdfQkFVRFJBVEU7CisJCQlzZXJpYWxfaW5pdCAoKTsKKwkJCWNvbnNvbGVfaW5pdF9mKCk7CisjZW5kaWYKKwkJCXByaW50ZigiXG5GUEdBOiBCb290aW5nIGZhaWxlZCAiKTsKKwkJCXN3aXRjaCAoc3RhdHVzKSB7CisJCQljYXNlIEVSUk9SX0ZQR0FfUFJHX0lOSVRfTE9XOgorCQkJCXByaW50ZigiKFRpbWVvdXQ6IElOSVQgbm90IGxvdyBhZnRlciBhc3NlcnRpbmcgUFJPR1JBTSopXG4gIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEVSUk9SX0ZQR0FfUFJHX0lOSVRfSElHSDoKKwkJCQlwcmludGYoIihUaW1lb3V0OiBJTklUIG5vdCBoaWdoIGFmdGVyIGRlYXNzZXJ0aW5nIFBST0dSQU0qKVxuICIpOworCQkJCWJyZWFrOworCQkJY2FzZSBFUlJPUl9GUEdBX1BSR19ET05FOgorCQkJCXByaW50ZigiKFRpbWVvdXQ6IERPTkUgbm90IGhpZ2ggYWZ0ZXIgcHJvZ3JhbW1pbmcgRlBHQSlcbiAiKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogZGlzcGxheSBpbmZvcyBvbiBmcGdhaW1hZ2UgKi8KKwkJCWluZGV4ID0gMTU7CisJCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJCQlsZW4gPSBmcGdhZGF0YVtpbmRleF07CisJCQkJcHJpbnRmKCJGUEdBOiAlc1xuIiwgJihmcGdhZGF0YVtpbmRleCsxXSkpOworCQkJCWluZGV4ICs9IGxlbiszOworCQkJfQorCQkJcHV0YyAoJ1xuJyk7CisJCQkvKiBkZWxheWVkIHJlYm9vdCAqLworCQkJZm9yIChpPTIwOyBpPjA7IGktLSkgeworCQkJCXByaW50ZigiUmVib290aW5nIGluICUyZCBzZWNvbmRzIFxyIixpKTsKKwkJCQlmb3IgKGluZGV4PTA7aW5kZXg8MTAwMDtpbmRleCsrKQorCQkJCQl1ZGVsYXkoMTAwMCk7CisJCQl9CisJCQlwdXRjICgnXG4nKTsKKwkJCWRvX3Jlc2V0KE5VTEwsIDAsIDAsIE5VTEwpOworCQl9CisJfQorI2VuZGlmIC8qICFDT05GSUdfQ1BDSTQwNV9WRVIyICovCisKKwkvKgorCSAqIElSUSAwLTE1ICA0MDVHUCBpbnRlcm5hbGx5IGdlbmVyYXRlZDsgYWN0aXZlIGhpZ2g7IGxldmVsIHNlbnNpdGl2ZQorCSAqIElSUSAxNiAgICA0MDVHUCBpbnRlcm5hbGx5IGdlbmVyYXRlZDsgYWN0aXZlIGxvdzsgbGV2ZWwgc2Vuc2l0aXZlCisJICogSVJRIDE3LTI0IFJFU0VSVkVECisJICogSVJRIDI1IChFWFQgSVJRIDApIENBTjA7IGFjdGl2ZSBsb3c7IGxldmVsIHNlbnNpdGl2ZQorCSAqIElSUSAyNiAoRVhUIElSUSAxKSBDQU4xICgrRlBHQSBvbiBDUENJNDA1MikgOyBhY3RpdmUgbG93OyBsZXZlbCBzZW5zaXRpdmUKKwkgKiBJUlEgMjcgKEVYVCBJUlEgMikgUENJIFNMT1QgMDsgYWN0aXZlIGxvdzsgbGV2ZWwgc2Vuc2l0aXZlCisJICogSVJRIDI4IChFWFQgSVJRIDMpIFBDSSBTTE9UIDE7IGFjdGl2ZSBsb3c7IGxldmVsIHNlbnNpdGl2ZQorCSAqIElSUSAyOSAoRVhUIElSUSA0KSBQQ0kgU0xPVCAyOyBhY3RpdmUgbG93OyBsZXZlbCBzZW5zaXRpdmUKKwkgKiBJUlEgMzAgKEVYVCBJUlEgNSkgUENJIFNMT1QgMzsgYWN0aXZlIGxvdzsgbGV2ZWwgc2Vuc2l0aXZlCisJICogSVJRIDMxIChFWFQgSVJRIDYpIENPTVBBQ1QgRkxBU0g7IGFjdGl2ZSBoaWdoOyBsZXZlbCBzZW5zaXRpdmUKKwkgKi8KKwltdGRjcih1aWNzciwgMHhGRkZGRkZGRik7ICAgICAgIC8qIGNsZWFyIGFsbCBpbnRzICovCisJbXRkY3IodWljZXIsIDB4MDAwMDAwMDApOyAgICAgICAvKiBkaXNhYmxlIGFsbCBpbnRzICovCisJbXRkY3IodWljY3IsIDB4MDAwMDAwMDApOyAgICAgICAvKiBzZXQgYWxsIHRvIGJlIG5vbi1jcml0aWNhbCovCisJbXRkY3IodWljcHIsIDB4RkZGRkZGODEpOyAgICAgICAvKiBzZXQgaW50IHBvbGFyaXRpZXMgKi8KKwltdGRjcih1aWN0ciwgMHgxMDAwMDAwMCk7ICAgICAgIC8qIHNldCBpbnQgdHJpZ2dlciBsZXZlbHMgKi8KKwltdGRjcih1aWN2Y3IsIDB4MDAwMDAwMDEpOyAgICAgIC8qIHNldCB2ZWN0IGJhc2U9MCxJTlQwIGhpZ2hlc3QgcHJpb3JpdHkqLworCW10ZGNyKHVpY3NyLCAweEZGRkZGRkZGKTsgICAgICAgLyogY2xlYXIgYWxsIGludHMgKi8KKworCXJldHVybiAwOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGN0ZXJtbTIodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQ1BDSTQwNV9WRVIyCisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBubywgYm9hcmQgaXMgY3BjaTQwNSAqLworI2Vsc2UKKwlpZiAoKCoodW5zaWduZWQgY2hhciAqKTB4ZjAwMDA0MDAgPT0gMHgwMCkgJiYKKwkgICAgKCoodW5zaWduZWQgY2hhciAqKTB4ZjAwMDA0MDEgPT0gMHgwMSkpCisJCXJldHVybiAwOyAgICAgICAgICAgICAgIC8qIG5vLCBib2FyZCBpcyBjcGNpNDA1ICovCisJZWxzZQorCQlyZXR1cm4gLTE7ICAgICAgICAgICAgICAvKiB5ZXMsIGJvYXJkIGlzIGN0ZXJtLW0yICovCisjZW5kaWYKK30KKworCitpbnQgY3BjaTQwNV9ob3N0KHZvaWQpCit7CisJaWYgKG1mZGNyKHN0cmFwKSAmIFBTUl9QQ0lfQVJCSVRfRU4pCisJCXJldHVybiAtMTsgICAgICAgICAgICAgIC8qIHllcywgYm9hcmQgaXMgY3BjaTQwNSBob3N0ICovCisJZWxzZQorCQlyZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBubywgYm9hcmQgaXMgY3BjaTQwNSBhZGFwdGVyICovCit9CisKKworaW50IHZlcnNpb24yKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjbnRybDBSZWc7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCS8qCisJICogU2V0dXAgR1BJTyBwaW5zIChDUzIvR1BJTzExIGFzIEdQSU8pCisJICovCisJY250cmwwUmVnID0gbWZkY3IoY250cmwwKTsKKwltdGRjcihjbnRybDAsIGNudHJsMFJlZyB8IDB4MDIwMDAwMDApOworCisJdWRlbGF5KDEwMDApOyAgICAgICAgICAgICAgICAgICAvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVhZGluZyBpbnB1dCAqLworCXZhbHVlID0gaW4zMihJQk00MDVHUF9HUElPMF9JUikgJiAweDAwMTAwMDAwOyAvKiB0ZXN0IEdQSU8xMSAqLworCisJLyoKKwkgKiBTZXR1cCBHUElPIHBpbnMgKENTMi9HUElPMTEgYXMgQ1MgYWdhaW4pCisJICovCisJbXRkY3IoY250cmwwLCBjbnRybDBSZWcpOworCisJaWYgKHZhbHVlKQorCQlyZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBubywgYm9hcmQgaXMgdmVyc2lvbiAxLnggKi8KKwllbHNlCisJCXJldHVybiAtMTsgICAgICAgICAgICAgIC8qIHllcywgYm9hcmQgaXMgdmVyc2lvbiAyLnggKi8KK30KKworCitpbnQgbWlzY19pbml0X2YgKHZvaWQpCit7CisJcmV0dXJuIDA7ICAvKiBkdW1teSBpbXBsZW1lbnRhdGlvbiAqLworfQorCisKK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWJkX3QgKmJkID0gZ2QtPmJkOworCWNoYXIgKgl0bXA7ICAgICAgICAgICAgICAgICAgICAvKiBUZW1wb3JhcnkgY2hhciBwb2ludGVyICAgICAgKi8KKworI2lmZGVmIENPTkZJR19DUENJNDA1X1ZFUjIKKwl1bnNpZ25lZCBjaGFyICpkc3Q7CisJdWxvbmcgbGVuID0gc2l6ZW9mKGZwZ2FkYXRhKTsKKwlpbnQgc3RhdHVzOworCWludCBpbmRleDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGNudHJsMFJlZzsKKworCS8qCisJICogT24gQ1BDSS00MDUgdmVyc2lvbiAyIHRoZSBlbnZpcm9ubWVudCBpcyBzYXZlZCBpbiBlZXByb20hCisJICogRlBHQSBjYW4gYmUgZ3ppcCBjb21wcmVzc2VkIChtYWxsb2MpIGFuZCBib290ZWQgdGhpcyBsYXRlLgorCSAqLworCisJaWYgKHZlcnNpb24yKCkpIHsKKwkJLyoKKwkJICogU2V0dXAgR1BJTyBwaW5zIChDUzYrQ1M3IGFzIEdQSU8pCisJCSAqLworCQljbnRybDBSZWcgPSBtZmRjcihjbnRybDApOworCQltdGRjcihjbnRybDAsIGNudHJsMFJlZyB8IDB4MDAzMDAwMDApOworCisJCWRzdCA9IG1hbGxvYyhDRkdfRlBHQV9NQVhfU0laRSk7CisJCWlmIChndW56aXAgKGRzdCwgQ0ZHX0ZQR0FfTUFYX1NJWkUsICh1Y2hhciAqKWZwZ2FkYXRhLCAoaW50ICopJmxlbikgIT0gMCkgeworCQkJcHJpbnRmICgiR1VOWklQIEVSUk9SIC0gbXVzdCBSRVNFVCBib2FyZCB0byByZWNvdmVyXG4iKTsKKwkJCWRvX3Jlc2V0IChOVUxMLCAwLCAwLCBOVUxMKTsKKwkJfQorCisJCXN0YXR1cyA9IGZwZ2FfYm9vdChkc3QsIGxlbik7CisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJcHJpbnRmKCJcbkZQR0E6IEJvb3RpbmcgZmFpbGVkICIpOworCQkJc3dpdGNoIChzdGF0dXMpIHsKKwkJCWNhc2UgRVJST1JfRlBHQV9QUkdfSU5JVF9MT1c6CisJCQkJcHJpbnRmKCIoVGltZW91dDogSU5JVCBub3QgbG93IGFmdGVyIGFzc2VydGluZyBQUk9HUkFNKilcbiAiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVJST1JfRlBHQV9QUkdfSU5JVF9ISUdIOgorCQkJCXByaW50ZigiKFRpbWVvdXQ6IElOSVQgbm90IGhpZ2ggYWZ0ZXIgZGVhc3NlcnRpbmcgUFJPR1JBTSopXG4gIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEVSUk9SX0ZQR0FfUFJHX0RPTkU6CisJCQkJcHJpbnRmKCIoVGltZW91dDogRE9ORSBub3QgaGlnaCBhZnRlciBwcm9ncmFtbWluZyBGUEdBKVxuICIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBkaXNwbGF5IGluZm9zIG9uIGZwZ2FpbWFnZSAqLworCQkJaW5kZXggPSAxNTsKKwkJCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQkJCWxlbiA9IGRzdFtpbmRleF07CisJCQkJcHJpbnRmKCJGUEdBOiAlc1xuIiwgJihkc3RbaW5kZXgrMV0pKTsKKwkJCQlpbmRleCArPSBsZW4rMzsKKwkJCX0KKwkJCXB1dGMgKCdcbicpOworCQkJLyogZGVsYXllZCByZWJvb3QgKi8KKwkJCWZvciAoaT0yMDsgaT4wOyBpLS0pIHsKKwkJCQlwcmludGYoIlJlYm9vdGluZyBpbiAlMmQgc2Vjb25kcyBcciIsaSk7CisJCQkJZm9yIChpbmRleD0wO2luZGV4PDEwMDA7aW5kZXgrKykKKwkJCQkJdWRlbGF5KDEwMDApOworCQkJfQorCQkJcHV0YyAoJ1xuJyk7CisJCQlkb19yZXNldChOVUxMLCAwLCAwLCBOVUxMKTsKKwkJfQorCisJCS8qIHJlc3RvcmUgZ3Bpby9jcyBzZXR0aW5ncyAqLworCQltdGRjcihjbnRybDAsIGNudHJsMFJlZyk7CisKKwkJcHV0cygiRlBHQTogICIpOworCisJCS8qIGRpc3BsYXkgaW5mb3Mgb24gZnBnYWltYWdlICovCisJCWluZGV4ID0gMTU7CisJCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQkJbGVuID0gZHN0W2luZGV4XTsKKwkJCXByaW50ZigiJXMgIiwgJihkc3RbaW5kZXgrMV0pKTsKKwkJCWluZGV4ICs9IGxlbiszOworCQl9CisJCXB1dGMgKCdcbicpOworCisJCWZyZWUoZHN0KTsKKwl9CisJZWxzZSB7CisJCXByaW50ZigiXG4qKiogVS1Cb290IFZlcnNpb24gZG9lcyBub3QgbWF0Y2ggQm9hcmQgVmVyc2lvbiFcbiIpOworCQlwcmludGYoIioqKiBDUENJLTQwNSBWZXJzaW9uIDIueCBkZXRlY3RlZCFcbiIpOworCQlwcmludGYoIioqKiBQbGVhc2UgdXNlIGNvcnJlY3QgVS1Cb290IHZlcnNpb24gKENQQ0k0MDUyKSFcblxuIik7CisJfQorCisjZWxzZSAvKiBDT05GSUdfQ1BDSTQwNV9WRVIyICovCisKKwkvKgorCSAqIEdlbmVyYXRlIGxhc3QgYnl0ZSBvZiBpcC1hZGRyIGZyb20gY29kZS1wbHVnIEAgMHhmMDAwMDQwMAorCSAqLworCWlmIChjdGVybW0yKCkpIHsKKwkJY2hhciBzdHJbMzJdOworCQl1bnNpZ25lZCBjaGFyIGlwYnl0ZSA9ICoodW5zaWduZWQgY2hhciAqKTB4ZjAwMDA0MDA7CisKKwkJLyoKKwkJICogT25seSBvdmVyd3JpdGUgaXAtYWRkciB3aXRoIGFsbG93ZWQgdmFsdWVzCisJCSAqLworCQlpZiAoKGlwYnl0ZSAhPSAweDAwKSAmJiAoaXBieXRlICE9IDB4ZmYpKSB7CisJCQliZC0+YmlfaXBfYWRkciA9IChiZC0+YmlfaXBfYWRkciAmIDB4ZmZmZmZmMDApIHwgaXBieXRlOworCQkJc3ByaW50ZihzdHIsICIlbGQuJWxkLiVsZC4lbGQiLAorCQkJCShiZC0+YmlfaXBfYWRkciAmIDB4ZmYwMDAwMDApID4+IDI0LAorCQkJCShiZC0+YmlfaXBfYWRkciAmIDB4MDBmZjAwMDApID4+IDE2LAorCQkJCShiZC0+YmlfaXBfYWRkciAmIDB4MDAwMGZmMDApID4+IDgsCisJCQkJKGJkLT5iaV9pcF9hZGRyICYgMHgwMDAwMDBmZikpOworCQkJc2V0ZW52KCJpcGFkZHIiLCBzdHIpOworCQl9CisJfQorCisJaWYgKHZlcnNpb24yKCkpIHsKKwkJcHJpbnRmKCJcbioqKiBVLUJvb3QgVmVyc2lvbiBkb2VzIG5vdCBtYXRjaCBCb2FyZCBWZXJzaW9uIVxuIik7CisJCXByaW50ZigiKioqIENQQ0ktNDA1IEJvYXJkIFZlcnNpb24gMS54IGRldGVjdGVkIVxuIik7CisJCXByaW50ZigiKioqIFBsZWFzZSB1c2UgY29ycmVjdCBVLUJvb3QgdmVyc2lvbiAoQ1BDSTQwNSkhXG5cbiIpOworCX0KKworI2VuZGlmIC8qIENPTkZJR19DUENJNDA1X1ZFUjIgKi8KKworCS8qCisJICogV3JpdGUgZXRoZXJuZXQgYWRkciBpbiBOVlJBTSBmb3IgVnhXb3JrcworCSAqLworCXRtcCA9IChjaGFyICopQ0ZHX05WUkFNX0JBU0VfQUREUiArIENGR19OVlJBTV9WWFdPUktTX09GRlM7CisJbWVtY3B5KCAoY2hhciAqKXRtcCwgKGNoYXIgKikmYmQtPmJpX2VuZXRhZGRyWzBdLCA2ICk7CisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogQ2hlY2sgQm9hcmQgSWRlbnRpdHk6CisgKi8KKworaW50IGNoZWNrYm9hcmQgKHZvaWQpCit7CisjaWZuZGVmIENPTkZJR19DUENJNDA1X1ZFUjIKKwlpbnQgaW5kZXg7CisJaW50IGxlbjsKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgc3RyWzY0XTsKKwlpbnQgaSA9IGdldGVudl9yICgic2VyaWFsIyIsIHN0ciwgc2l6ZW9mKHN0cikpOworCisJcHV0cyAoIkJvYXJkOiAiKTsKKworCWlmIChpID09IC0xKSB7CisJCXB1dHMgKCIjIyMgTm8gSFcgSUQgLSBhc3N1bWluZyBDUENJNDA1Iik7CisJfSBlbHNlIHsKKwkJcHV0cyhzdHIpOworCX0KKworCWlmICh2ZXJzaW9uMigpKQorCQlwdXRzICgiIChWZXIgMi54LCAiKTsKKwllbHNlCisJCXB1dHMgKCIgKFZlciAxLngsICIpOworCisjaWYgMAorCWlmICgoKih1bnNpZ25lZCBzaG9ydCAqKSgodW5zaWduZWQgbG9uZylDRkdfRlBHQV9CQVNFX0FERFIpICsgQ0ZHX0ZQR0FfU1RBVFVTKQorCSAgICAmIENGR19GUEdBX1NUQVRVU19GTEFTSCkKKwkJcHV0cyAoIkZMQVNIIEJhbmsgQSwgIik7CisJZWxzZQorCQlwdXRzICgiRkxBU0ggQmFuayBCLCAiKTsKKyNlbmRpZgorCisJaWYgKGN0ZXJtbTIoKSkgeworCQlwcmludGYoIkNURVJNLU0yIC0gSWQ9MHglMDJ4KSIsICoodW5zaWduZWQgY2hhciAqKTB4ZjAwMDA0MDApOworCX0gZWxzZSB7CisJCWlmIChjcGNpNDA1X2hvc3QoKSkgeworCQkJcHV0cyAoIlBDSSBIb3N0IFZlcnNpb24pIik7CisJCX0gZWxzZSB7CisJCQlwdXRzICgiUENJIEFkYXB0ZXIgVmVyc2lvbikiKTsKKwkJfQorCX0KKworI2lmbmRlZiBDT05GSUdfQ1BDSTQwNV9WRVIyCisJcHV0cyAoIlxuRlBHQTogICIpOworCisJLyogZGlzcGxheSBpbmZvcyBvbiBmcGdhaW1hZ2UgKi8KKwlpbmRleCA9IDE1OworCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQlsZW4gPSBmcGdhZGF0YVtpbmRleF07CisJCXByaW50ZigiJXMgIiwgJihmcGdhZGF0YVtpbmRleCsxXSkpOworCQlpbmRleCArPSBsZW4rMzsKKwl9CisjZW5kaWYKKworCXB1dGMgKCdcbicpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworbG9uZyBpbnQgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJbXRkY3IobWVtY2ZnYSwgbWVtX21iMGNmKTsKKwl2YWwgPSBtZmRjcihtZW1jZmdkKTsKKworI2lmIDAKKwlwcmludGYoIlxubWIwY2Y9JXhcbiIsIHZhbCk7IC8qIHRlc3Qtb25seSAqLworCXByaW50Zigic3RyYXA9JXhcbiIsIG1mZGNyKHN0cmFwKSk7IC8qIHRlc3Qtb25seSAqLworI2VuZGlmCisKKwlyZXR1cm4gKDQqMTAyNCoxMDI0IDw8ICgodmFsICYgMHgwMDBlMDAwMCkgPj4gMTcpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgdGVzdGRyYW0gKHZvaWQpCit7CisJLyogVE9ETzogWFhYIFhYWCBYWFggKi8KKwlwcmludGYgKCJ0ZXN0OiAxNiBNQiAtIG9rXG4iKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19DUENJNDA1X1ZFUjIKKyNpZmRlZiBDT05GSUdfSURFX1JFU0VUCisKK3ZvaWQgaWRlX3NldF9yZXNldChpbnQgb24pCit7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmZwZ2FfbW9kZSA9ICh1bnNpZ25lZCBzaG9ydCAqKUNGR19GUEdBX0JBU0VfQUREUjsKKworCS8qCisJICogQXNzZXJ0IG9yIGRlYXNzZXJ0IENvbXBhY3RGbGFzaCBSZXNldCBQaW4KKwkgKi8KKwlpZiAob24pIHsJCS8qIGFzc2VydCBSRVNFVCAqLworCQkqZnBnYV9tb2RlICY9IH4oQ0ZHX0ZQR0FfTU9ERV9DRl9SRVNFVCk7CisJfSBlbHNlIHsJCS8qIHJlbGVhc2UgUkVTRVQgKi8KKwkJKmZwZ2FfbW9kZSB8PSBDRkdfRlBHQV9NT0RFX0NGX1JFU0VUOworCX0KK30KKworI2VuZGlmIC8qIENPTkZJR19JREVfUkVTRVQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ1BDSTQwNV9WRVIyICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jcGNpNDQwL2NwY2k0NDAuYyBiL2JvYXJkL2VzZC9jcGNpNDQwL2NwY2k0NDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWE1ZWRkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZXNkL2NwY2k0NDAvY3BjaTQ0MC5jCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTdGVmYW4gUm9lc2UsIGVzZCBnbWJoIGdlcm1hbnksIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisKK2xvbmcgaW50IGZpeGVkX3NkcmFtKCB2b2lkICk7CisKK2ludCBib2FyZF9wcmVfaW5pdCAodm9pZCkKK3sKKwl1aW50IHJlZzsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTZXR1cCB0aGUgZXh0ZXJuYWwgYnVzIGNvbnRyb2xsZXIvY2hpcCBzZWxlY3RzCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltdGRjciggZWJjY2ZnYSwgeGJjZmcgKTsKKwlyZWcgPSBtZmRjciggZWJjY2ZnZCApOworCW10ZGNyKCBlYmNjZmdkLCByZWcgfCAweDA0MDAwMDAwICk7CS8qIFNldCBBVEMgKi8KKworCW10ZWJjKCBwYjBhcCwgMHg5MjAxNTQ4MCApOwkvKiBGTEFTSC9TUkFNICovCisJbXRlYmMoIHBiMGNyLCAweEZGODdBMDAwICk7IC8qIEJBUz0weGZmOCA4TUIgUi9XIDE2LWJpdCAqLworCS8qIHRlc3Qtb25seTogb3RoZXIgcmVncyBzdGlsbCBtaXNzaW5nLi4uICovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0dXAgdGhlIGludGVycnVwdCBjb250cm9sbGVyIHBvbGFyaXRpZXMsIHRyaWdnZXJzLCBldGMuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltdGRjciggdWljMHNyLCAweGZmZmZmZmZmICk7ICAgIC8qIGNsZWFyIGFsbCAqLworCW10ZGNyKCB1aWMwZXIsIDB4MDAwMDAwMDAgKTsgICAgLyogZGlzYWJsZSBhbGwgKi8KKwltdGRjciggdWljMGNyLCAweDAwMDAwMDA5ICk7ICAgIC8qIFNNSSAmIFVJQzEgY3JpdCBhcmUgY3JpdGljYWwgKi8KKwltdGRjciggdWljMHByLCAweGZmZmZmZTEzICk7ICAgIC8qIHBlciByZWYtYm9hcmQgbWFudWFsICovCisJbXRkY3IoIHVpYzB0ciwgMHgwMWMwMDAwOCApOyAgICAvKiBwZXIgcmVmLWJvYXJkIG1hbnVhbCAqLworCW10ZGNyKCB1aWMwdnIsIDB4MDAwMDAwMDEgKTsgICAgLyogaW50MzEgaGlnaGVzdCwgYmFzZT0weDAwMCAqLworCW10ZGNyKCB1aWMwc3IsIDB4ZmZmZmZmZmYgKTsgICAgLyogY2xlYXIgYWxsICovCisKKwltdGRjciggdWljMXNyLCAweGZmZmZmZmZmICk7ICAgIC8qIGNsZWFyIGFsbCAqLworCW10ZGNyKCB1aWMxZXIsIDB4MDAwMDAwMDAgKTsgICAgLyogZGlzYWJsZSBhbGwgKi8KKwltdGRjciggdWljMWNyLCAweDAwMDAwMDAwICk7ICAgIC8qIGFsbCBub24tY3JpdGljYWwgKi8KKwltdGRjciggdWljMXByLCAweGZmZmZlMGZmICk7ICAgIC8qIHBlciByZWYtYm9hcmQgbWFudWFsICovCisJbXRkY3IoIHVpYzF0ciwgMHgwMGZmYzAwMCApOyAgICAvKiBwZXIgcmVmLWJvYXJkIG1hbnVhbCAqLworCW10ZGNyKCB1aWMxdnIsIDB4MDAwMDAwMDEgKTsgICAgLyogaW50MzEgaGlnaGVzdCwgYmFzZT0weDAwMCAqLworCW10ZGNyKCB1aWMxc3IsIDB4ZmZmZmZmZmYgKTsgICAgLyogY2xlYXIgYWxsICovCisKKwlyZXR1cm4gMDsKK30KKworCisKK2ludCBjaGVja2JvYXJkICh2b2lkKQoreworCXN5c19pbmZvX3Qgc3lzaW5mbzsKKwlnZXRfc3lzX2luZm8oJnN5c2luZm8pOworCisJcHJpbnRmKCJCb2FyZDogZXNkIENQQ0ktNDQwXG4iKTsKKwlwcmludGYoIlx0VkNPOiAlbHUgTUh6XG4iLCBzeXNpbmZvLmZyZXFWQ09NaHovMTAwMDAwMCk7CisJcHJpbnRmKCJcdENQVTogJWx1IE1IelxuIiwgc3lzaW5mby5mcmVxUHJvY2Vzc29yLzEwMDAwMDApOworCXByaW50ZigiXHRQTEI6ICVsdSBNSHpcbiIsIHN5c2luZm8uZnJlcVBMQi8xMDAwMDAwKTsKKwlwcmludGYoIlx0T1BCOiAlbHUgTUh6XG4iLCBzeXNpbmZvLmZyZXFPUEIvMTAwMDAwMCk7CisJcHJpbnRmKCJcdEVQQjogJWx1IE1IelxuIiwgc3lzaW5mby5mcmVxRVBCLzEwMDAwMDApOworCXJldHVybiAoMCk7Cit9CisKKworbG9uZyBpbnQgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQoreworCWxvbmcgICAgZHJhbV9zaXplID0gMDsKKworCWRyYW1fc2l6ZSA9IGZpeGVkX3NkcmFtKCk7CisJcmV0dXJuIGRyYW1fc2l6ZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGZpeGVkIHNkcmFtIGluaXQgLS0gZG9lc24ndCB1c2Ugc2VyaWFsIHByZXNlbmNlIGRldGVjdC4KKyAqCisgKiAgQXNzdW1lczogICAgNjQgTUIsIG5vbi1FQ0MsIG5vbi1yZWdpc3RlcmVkCisgKiAgICAgICAgICAgICAgUExCIEAgMTMzIE1IegorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitsb25nIGludCBmaXhlZF9zZHJhbSggdm9pZCApCit7CisJdWludCAgICByZWc7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0dXAgc29tZSBkZWZhdWx0CisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW10c2RyYW0oIG1lbV91YWJiYSwgMHgwMDAwMDAwMCApOyAgIC8qIHViYmE9MCAoZGVmYXVsdCkgICAgICAgICAgICAgKi8KKwltdHNkcmFtKCBtZW1fc2xpbywgIDB4MDAwMDAwMDAgKTsgICAvKiByZHJlPTAgd3JyZT0wIHJhcnc9MCAgICAgICAgICovCisJbXRzZHJhbSggbWVtX2Rldm9wdCwweDAwMDAwMDAwICk7ICAgLyogZGxsPTAgZHM9MCAobm9ybWFsKSAgICAgICAgICAqLworCW10c2RyYW0oIG1lbV93ZGRjdHIsMHg0MDAwMDAwMCApOyAgIC8qIHdyY3A9MCBkY2Q9MCAgICAgICAgICAgICAgICAgKi8KKwltdHNkcmFtKCBtZW1fY2xrdHIsIDB4NDAwMDAwMDAgKTsgICAvKiBjbGtwPTEgKDkwIGRlZyB3cikgZGNkdD0wICAgICovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0dXAgZm9yIGJvYXJkLXNwZWNpZmljIHNwZWNpZmljIG1lbQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKgorCSAqIEZvbGxvd2luZyBmb3IgQ0FTIExhdGVuY3kgPSAyLjUgQCAxMzMgTUh6IFBMQgorCSAqLworCW10c2RyYW0oIG1lbV9iMGNyLCAweDAwMDgyMDAxICk7LyogU0RCQT0weDAwMCwgNjRNQiwgTW9kZSAyLCBlbmFibGVkKi8KKwltdHNkcmFtKCBtZW1fdHIwLCAgMHg0MTBhNDAxMiApOy8qIFdSPTIgIFdEPTEgQ0w9Mi41IFBBPTMgQ1A9NCBMRD0yICovCisJLyogUkE9MTAgUkQ9MyAgICAgICAgICAgICAgICAgICAgICAgKi8KKwltdHNkcmFtKCBtZW1fdHIxLCAgMHg4MDgwMDgyZiApOy8qIFNTPVQyIFNMPVNUQUdFIDMgQ0Q9MSBDVD0weDAyZiAgICovCisJbXRzZHJhbSggbWVtX3J0ciwgIDB4MDgyMDAwMDAgKTsvKiBSYXRlIDE1LjYyNSBucyBAIDEzMyBNSHogUExCICAgICAqLworCW10c2RyYW0oIG1lbV9jZmcxLCAweDAwMDAwMDAwICk7LyogU2VsZi1yZWZyZXNoIGV4aXQsIGRpc2FibGUgUE0gICAgKi8KKwl1ZGVsYXkoIDQwMCApOyAgICAgICAgICAgICAgICAgIC8qIERlbGF5IDIwMCB1c2VjcyAobWluKSAgICAgICAgICAgICovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogRW5hYmxlIHRoZSBjb250cm9sbGVyLCB0aGVuIHdhaXQgZm9yIERDRU4gdG8gY29tcGxldGUKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbXRzZHJhbSggbWVtX2NmZzAsIDB4ODYwMDAwMDAgKTsvKiBEQ0VOPTEsIFBNVUQ9MSwgNjQtYml0ICAgICAgICAgICAqLworCWZvcig7OykKKwl7CisJCW1mc2RyYW0oIG1lbV9tY3N0cywgcmVnICk7CisJCWlmKCByZWcgJiAweDgwMDAwMDAwICkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiggNjQgKiAxMDI0ICogMTAyNCApOyAgICAgIC8qIDY0IE1CICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30KZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jcGNpNDQwL2luaXQuUyBiL2JvYXJkL2VzZC9jcGNpNDQwL2luaXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFiOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZXNkL2NwY2k0NDAvaW5pdC5TCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisqICBDb3B5cmlnaHQgKEMpIDIwMDIgU2NvdHQgTWNOdXR0IDxzbWNudXR0QGFydGVzeW5jcC5jb20+CisqCisqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisqIHByb2plY3QuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisqIE1BIDAyMTExLTEzMDcgVVNBCisqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorCisvKiBHZW5lcmFsICovCisjZGVmaW5lIFRMQl9WQUxJRCAgIDB4MDAwMDAyMDAKKworLyogU3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgKi8KKworI2RlZmluZSBTWl8xSwkgICAgMHgwMDAwMDAwMAorI2RlZmluZSBTWl80SwkgICAgMHgwMDAwMDAxMAorI2RlZmluZSBTWl8xNksJICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgU1pfNjRLCSAgICAweDAwMDAwMDMwCisjZGVmaW5lIFNaXzI1NksJICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgU1pfMU0JICAgIDB4MDAwMDAwNTAKKyNkZWZpbmUgU1pfMTZNCSAgICAweDAwMDAwMDcwCisjZGVmaW5lIFNaXzI1Nk0JICAgIDB4MDAwMDAwOTAKKworLyogU3RvcmFnZSBhdHRyaWJ1dGVzICovCisjZGVmaW5lIFNBX1cJICAgIDB4MDAwMDA4MDAJICAgIC8qIFdyaXRlLXRocm91Z2ggKi8KKyNkZWZpbmUgU0FfSQkgICAgMHgwMDAwMDQwMAkgICAgLyogQ2FjaGluZyBpbmhpYml0ZWQgKi8KKyNkZWZpbmUgU0FfTQkgICAgMHgwMDAwMDIwMAkgICAgLyogTWVtb3J5IGNvaGVyZW5jZSAqLworI2RlZmluZSBTQV9HCSAgICAweDAwMDAwMTAwCSAgICAvKiBHdWFyZGVkICovCisjZGVmaW5lIFNBX0UJICAgIDB4MDAwMDAwODAJICAgIC8qIEVuZGlhbiAqLworCisvKiBBY2Nlc3MgY29udHJvbCAqLworI2RlZmluZSBBQ19YCSAgICAweDAwMDAwMDI0CSAgICAvKiBFeGVjdXRlICovCisjZGVmaW5lIEFDX1cJICAgIDB4MDAwMDAwMTIJICAgIC8qIFdyaXRlICovCisjZGVmaW5lIEFDX1IJICAgIDB4MDAwMDAwMDkJICAgIC8qIFJlYWQgKi8KKworLyogU29tZSBoYW5keSBtYWNyb3MgKi8KKworI2RlZmluZSBFUE4oZSkJCSgoZSkgJiAweGZmZmZmYzAwKQorI2RlZmluZSBUTEIwKGVwbixzeikJKCAoRVBOKChlcG4pKSB8IChzeikgfCBUTEJfVkFMSUQgKSApCisjZGVmaW5lIFRMQjEocnBuLGVycG4pCSggKChycG4pJjB4ZmZmZmZjMDApIHwgKGVycG4pICkKKyNkZWZpbmUgVExCMihhKQkJKCAoYSkmMHgwMDAwMGZiZiApCisKKyNkZWZpbmUgdGxidGFiX3N0YXJ0XAorCW1mbHIgICAgcjEgIDtcCisJYmwgMGYJICAgIDsKKworI2RlZmluZSB0bGJ0YWJfZW5kXAorCS5sb25nIDAsIDAsIDAJOyAgIFwKKzA6CW1mbHIgICAgcjAJOyAgIFwKKwltdGxyICAgIHIxCTsgICBcCisJYmxyCQk7CisKKyNkZWZpbmUgdGxiZW50cnkoZXBuLHN6LHJwbixlcnBuLGF0dHIpXAorCS5sb25nIFRMQjAoZXBuLHN6KSxUTEIxKHJwbixlcnBuKSxUTEIyKGF0dHIpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUTEIgVEFCTEUKKyAqCisgKiBUaGlzIHRhYmxlIGlzIHVzZWQgYnkgdGhlIGNwdSBib290IGNvZGUgdG8gc2V0dXAgdGhlIGluaXRpYWwgdGxiCisgKiBlbnRyaWVzLiBSYXRoZXIgdGhhbiBtYWtlIGJyb2FkIGFzc3VtcHRpb25zIGluIHRoZSBjcHUgc291cmNlIHRyZWUsCisgKiB0aGlzIHRhYmxlIGxldHMgZWFjaCBib2FyZCBzZXQgdGhpbmdzIHVwIGhvd2V2ZXIgdGhleSBsaWtlLgorICoKKyAqICBQb2ludGVyIHRvIHRoZSB0YWJsZSBpcyByZXR1cm5lZCBpbiByMQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLnNlY3Rpb24gLmJvb3RwZywiYXgiCisgICAgLmdsb2JsIHRsYnRhYgorCit0bGJ0YWI6CisgICAgdGxidGFiX3N0YXJ0CisgICAgdGxiZW50cnkoIDB4ZjAwMDAwMDAsIFNaXzI1Nk0sIDB4ZjAwMDAwMDAsIDEsIEFDX1J8QUNfV3xBQ19YfFNBX0d8U0FfSSkKKyAgICB0bGJlbnRyeSggQ0ZHX1BFUklQSEVSQUxfQkFTRSwgU1pfMjU2TSwgMHg0MDAwMDAwMCwgMSwgQUNfUnxBQ19XfFNBX0d8U0FfSSkKKyAgICB0bGJlbnRyeSggQ0ZHX0lTUkFNX0JBU0UsIFNaXzRLLCAweDgwMDAwMDAwLCAwLCBBQ19SfEFDX1d8QUNfWCApCisgICAgdGxiZW50cnkoIENGR19JU1JBTV9CQVNFICsgMHgxMDAwLCBTWl80SywgMHg4MDAwMTAwMCwgMCwgQUNfUnxBQ19XfEFDX1ggKQorICAgIHRsYmVudHJ5KCBDRkdfU0RSQU1fQkFTRSwgU1pfMjU2TSwgMHgwMDAwMDAwMCwgMCwgQUNfUnxBQ19XfEFDX1ggKQorICAgIHRsYnRhYl9lbmQKKworCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvcGNpNDA1L3BjaTQwNS5jIGIvYm9hcmQvZXNkL3BjaTQwNS9wY2k0MDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDg2YzAyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZXNkL3BjaTQwNS9wY2k0MDUuYwpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogU3RlZmFuIFJvZXNlLCBlc2QgZ21iaCBnZXJtYW55LCBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNtZF9ib290Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8NDA1Z3BfcGNpLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIDAKKyNkZWZpbmUgRlBHQV9ERUJVRworI2VuZGlmCisKKyNkZWZpbmUgUENJX1JFQ09ORklHX01BR0lDICAgICAgIDB4MDcwODE5NjcKKworCitzdHJ1Y3QgcGNpX2NvbmZpZ19yZWdzIHsKKwl1bnNpZ25lZCBzaG9ydCAgY29tbWFuZDsKKwl1bnNpZ25lZCBjaGFyICAgbGF0ZW5jeV90aW1lcjsKKwl1bnNpZ25lZCBjaGFyICAgaW50X2xpbmU7CisJdW5zaWduZWQgbG9uZyAgIGJhcjE7CisJdW5zaWduZWQgbG9uZyAgIGJhcjI7CisJdW5zaWduZWQgbG9uZyAgIG1hZ2ljOworfTsKKworCisvKiBmcGdhIGNvbmZpZ3VyYXRpb24gZGF0YSAtIGdlbmVyYXRlZCBieSBiaW4yY2MgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgZnBnYWRhdGFbXSA9Cit7CisjaW5jbHVkZSAiZnBnYWRhdGEuYyIKK307CisKKy8qCisgKiBpbmNsdWRlIGNvbW1vbiBmcGdhIGNvZGUgKGZvciBlc2QgYm9hcmRzKQorICovCisjaW5jbHVkZSAiLi4vY29tbW9uL2ZwZ2EuYyIKKworCisvKiBQcm90b3R5cGVzICovCitpbnQgZ3VuemlwKHZvaWQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCAqKTsKKworCitpbnQgYm9hcmRfcHJlX2luaXQgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjbnRybDBSZWc7CisKKwkvKgorCSAqIElSUSAwLTE1ICA0MDVHUCBpbnRlcm5hbGx5IGdlbmVyYXRlZDsgYWN0aXZlIGhpZ2g7IGxldmVsIHNlbnNpdGl2ZQorCSAqIElSUSAxNiAgICA0MDVHUCBpbnRlcm5hbGx5IGdlbmVyYXRlZDsgYWN0aXZlIGxvdzsgbGV2ZWwgc2Vuc2l0aXZlCisJICogSVJRIDE3LTI0IFJFU0VSVkVECisJICogSVJRIDI1IChFWFQgSVJRIDApIENBTjA7IGFjdGl2ZSBsb3c7IGxldmVsIHNlbnNpdGl2ZQorCSAqIElSUSAyNiAoRVhUIElSUSAxKSBDQU4xOyBhY3RpdmUgbG93OyBsZXZlbCBzZW5zaXRpdmUKKwkgKiBJUlEgMjcgKEVYVCBJUlEgMikgQ0FOMjsgYWN0aXZlIGxvdzsgbGV2ZWwgc2Vuc2l0aXZlCisJICogSVJRIDI4IChFWFQgSVJRIDMpIENBTjM7IGFjdGl2ZSBsb3c7IGxldmVsIHNlbnNpdGl2ZQorCSAqIElSUSAyOSAoRVhUIElSUSA0KSB1bnVzZWQ7IGFjdGl2ZSBsb3c7IGxldmVsIHNlbnNpdGl2ZQorCSAqIElSUSAzMCAoRVhUIElSUSA1KSBGUEdBIFRpbWVzdGFtcDsgYWN0aXZlIGxvdzsgbGV2ZWwgc2Vuc2l0aXZlCisJICogSVJRIDMxIChFWFQgSVJRIDYpIFBDSSBSZXNldDsgYWN0aXZlIGxvdzsgbGV2ZWwgc2Vuc2l0aXZlCisJICovCisJbXRkY3IodWljc3IsIDB4RkZGRkZGRkYpOyAgICAgICAgLyogY2xlYXIgYWxsIGludHMgKi8KKwltdGRjcih1aWNlciwgMHgwMDAwMDAwMCk7ICAgICAgICAvKiBkaXNhYmxlIGFsbCBpbnRzICovCisJbXRkY3IodWljY3IsIDB4MDAwMDAwMDApOyAgICAgICAgLyogc2V0IGFsbCB0byBiZSBub24tY3JpdGljYWwqLworCW10ZGNyKHVpY3ByLCAweEZGRkZGRjgwKTsgICAgICAgIC8qIHNldCBpbnQgcG9sYXJpdGllcyAqLworCW10ZGNyKHVpY3RyLCAweDEwMDAwMDAwKTsgICAgICAgIC8qIHNldCBpbnQgdHJpZ2dlciBsZXZlbHMgKi8KKwltdGRjcih1aWN2Y3IsIDB4MDAwMDAwMDEpOyAgICAgICAvKiBzZXQgdmVjdCBiYXNlPTAsSU5UMCBoaWdoZXN0IHByaW9yaXR5Ki8KKwltdGRjcih1aWNzciwgMHhGRkZGRkZGRik7ICAgICAgICAvKiBjbGVhciBhbGwgaW50cyAqLworCisJLyoKKwkgKiBTZXR1cCBHUElPIHBpbnMgKElSUTQvR1BJTzIxIGFzIEdQSU8pCisJICovCisJY250cmwwUmVnID0gbWZkY3IoY250cmwwKTsKKwltdGRjcihjbnRybDAsIGNudHJsMFJlZyB8IDB4MDAwMDgwMDApOworCisJcmV0dXJuIDA7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgbWlzY19pbml0X2YgKHZvaWQpCit7CisJcmV0dXJuIDA7ICAvKiBkdW1teSBpbXBsZW1lbnRhdGlvbiAqLworfQorCisKK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyICpkc3Q7CisJdWxvbmcgbGVuID0gc2l6ZW9mKGZwZ2FkYXRhKTsKKwlpbnQgc3RhdHVzOworCWludCBpbmRleDsKKwlpbnQgaTsKKwlzdHJ1Y3QgcGNpX2NvbmZpZ19yZWdzICpwY2lfcmVnczsKKworCS8qCisJICogT24gUENJLTQwNSB0aGUgZW52aXJvbm1lbnQgaXMgc2F2ZWQgaW4gZWVwcm9tIQorCSAqIEZQR0EgY2FuIGJlIGd6aXAgY29tcHJlc3NlZCAobWFsbG9jKSBhbmQgYm9vdGVkIHRoaXMgbGF0ZS4KKwkgKi8KKworCWRzdCA9IG1hbGxvYyhDRkdfRlBHQV9NQVhfU0laRSk7CisJaWYgKGd1bnppcCAoZHN0LCBDRkdfRlBHQV9NQVhfU0laRSwgKHVjaGFyICopZnBnYWRhdGEsIChpbnQgKikmbGVuKSAhPSAwKSB7CisJCXByaW50ZiAoIkdVTlpJUCBFUlJPUiAtIG11c3QgUkVTRVQgYm9hcmQgdG8gcmVjb3ZlclxuIik7CisJCWRvX3Jlc2V0IChOVUxMLCAwLCAwLCBOVUxMKTsKKwl9CisKKwlzdGF0dXMgPSBmcGdhX2Jvb3QoZHN0LCBsZW4pOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlwcmludGYoIlxuRlBHQTogQm9vdGluZyBmYWlsZWQgIik7CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgRVJST1JfRlBHQV9QUkdfSU5JVF9MT1c6CisJCQlwcmludGYoIihUaW1lb3V0OiBJTklUIG5vdCBsb3cgYWZ0ZXIgYXNzZXJ0aW5nIFBST0dSQU0qKVxuICIpOworCQkJYnJlYWs7CisJCWNhc2UgRVJST1JfRlBHQV9QUkdfSU5JVF9ISUdIOgorCQkJcHJpbnRmKCIoVGltZW91dDogSU5JVCBub3QgaGlnaCBhZnRlciBkZWFzc2VydGluZyBQUk9HUkFNKilcbiAiKTsKKwkJCWJyZWFrOworCQljYXNlIEVSUk9SX0ZQR0FfUFJHX0RPTkU6CisJCQlwcmludGYoIihUaW1lb3V0OiBET05FIG5vdCBoaWdoIGFmdGVyIHByb2dyYW1taW5nIEZQR0EpXG4gIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGRpc3BsYXkgaW5mb3Mgb24gZnBnYWltYWdlICovCisJCWluZGV4ID0gMTU7CisJCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQkJbGVuID0gZHN0W2luZGV4XTsKKwkJCXByaW50ZigiRlBHQTogJXNcbiIsICYoZHN0W2luZGV4KzFdKSk7CisJCQlpbmRleCArPSBsZW4rMzsKKwkJfQorCQlwdXRjICgnXG4nKTsKKwkJLyogZGVsYXllZCByZWJvb3QgKi8KKwkJZm9yIChpPTIwOyBpPjA7IGktLSkgeworCQkJcHJpbnRmKCJSZWJvb3RpbmcgaW4gJTJkIHNlY29uZHMgXHIiLGkpOworCQkJZm9yIChpbmRleD0wO2luZGV4PDEwMDA7aW5kZXgrKykKKwkJCQl1ZGVsYXkoMTAwMCk7CisJCX0KKwkJcHV0YyAoJ1xuJyk7CisJCWRvX3Jlc2V0KE5VTEwsIDAsIDAsIE5VTEwpOworCX0KKworCXB1dHMoIkZQR0E6ICAiKTsKKworCS8qIGRpc3BsYXkgaW5mb3Mgb24gZnBnYWltYWdlICovCisJaW5kZXggPSAxNTsKKwlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJbGVuID0gZHN0W2luZGV4XTsKKwkJcHJpbnRmKCIlcyAiLCAmKGRzdFtpbmRleCsxXSkpOworCQlpbmRleCArPSBsZW4rMzsKKwl9CisJcHV0YyAoJ1xuJyk7CisKKwkvKgorCSAqIFJld3JpdGUgcGNpIGNvbmZpZyByZWdzIChvbmx5IGFmdGVyIHNvZnQtcmVzZXQgd2l0aCBtYWdpYyBzZXQpCisJICovCisJcGNpX3JlZ3MgPSAoc3RydWN0IHBjaV9jb25maWdfcmVncyAqKTB4MTA7CisJaWYgKHBjaV9yZWdzLT5tYWdpYyA9PSBQQ0lfUkVDT05GSUdfTUFHSUMpIHsKKwkJcHV0cygiUENJOiAgIEZvdW5kIG1hZ2ljLCByZXdyaXRpbmcgY29uZmlnIHJlZ3MuLi5cbiIpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoUENJREVWSURfNDA1R1AsIFBDSV9DT01NQU5ELAorCQkJCSAgICAgIHBjaV9yZWdzLT5jb21tYW5kKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKFBDSURFVklEXzQwNUdQLCBQQ0lfTEFURU5DWV9USU1FUiwKKwkJCQkgICAgICBwY2lfcmVncy0+bGF0ZW5jeV90aW1lcik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShQQ0lERVZJRF80MDVHUCwgUENJX0lOVEVSUlVQVF9MSU5FLAorCQkJCSAgICAgIHBjaV9yZWdzLT5pbnRfbGluZSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoUENJREVWSURfNDA1R1AsIFBDSV9CQVNFX0FERFJFU1NfMSwKKwkJCQkgICAgICAgcGNpX3JlZ3MtPmJhcjEpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKFBDSURFVklEXzQwNUdQLCBQQ0lfQkFTRV9BRERSRVNTXzIsCisJCQkJICAgICAgIHBjaV9yZWdzLT5iYXIyKTsKKwl9CisJcGNpX3JlZ3MtPm1hZ2ljID0gMDsgLyogY2xlYXIgbWFnaWMgYWdhaW4gKi8KKworI2lmIDAgLyogdGVzdC1vbmx5ICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoUENJREVWSURfNDA1R1AsIFBDSV9DT01NQU5ELCAmKHBjaV9yZWdzLT5jb21tYW5kKSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoUENJREVWSURfNDA1R1AsIFBDSV9MQVRFTkNZX1RJTUVSLCAmKHBjaV9yZWdzLT5sYXRlbmN5X3RpbWVyKSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoUENJREVWSURfNDA1R1AsIFBDSV9JTlRFUlJVUFRfTElORSwgJihwY2lfcmVncy0+aW50X2xpbmUpKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoUENJREVWSURfNDA1R1AsIFBDSV9CQVNFX0FERFJFU1NfMSwgJihwY2lfcmVncy0+YmFyMSkpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChQQ0lERVZJRF80MDVHUCwgUENJX0JBU0VfQUREUkVTU18yLCAmKHBjaV9yZWdzLT5iYXIyKSk7CisJcGNpX3JlZ3MtPm1hZ2ljID0gUENJX1JFQ09ORklHX01BR0lDOyAvKiBzZXQgbWFnaWMgKi8KKyNlbmRpZgorCisJZnJlZShkc3QpOworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIENoZWNrIEJvYXJkIElkZW50aXR5OgorICovCisKK2ludCBjaGVja2JvYXJkICh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgc3RyWzY0XTsKKwlpbnQgaSA9IGdldGVudl9yICgic2VyaWFsIyIsIHN0ciwgc2l6ZW9mKHN0cikpOworCisJcHV0cyAoIkJvYXJkOiAiKTsKKworCWlmIChpID09IC0xKSB7CisJCXB1dHMgKCIjIyMgTm8gSFcgSUQgLSBhc3N1bWluZyBDUENJNDA1Iik7CisJfSBlbHNlIHsKKwkJcHV0cyAoc3RyKTsKKwl9CisJcHV0YyAoJ1xuJyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwltdGRjcihtZW1jZmdhLCBtZW1fbWIwY2YpOworCXZhbCA9IG1mZGNyKG1lbWNmZ2QpOworCisjaWYgMAorCXByaW50ZigiXG5tYjBjZj0leFxuIiwgdmFsKTsgLyogdGVzdC1vbmx5ICovCisJcHJpbnRmKCJzdHJhcD0leFxuIiwgbWZkY3Ioc3RyYXApKTsgLyogdGVzdC1vbmx5ICovCisjZW5kaWYKKworCXJldHVybiAoNCoxMDI0KjEwMjQgPDwgKCh2YWwgJiAweDAwMGUwMDAwKSA+PiAxNykpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCB0ZXN0ZHJhbSAodm9pZCkKK3sKKwkvKiBUT0RPOiBYWFggWFhYIFhYWCAqLworCXByaW50ZiAoInRlc3Q6IDE2IE1CIC0gb2tcbiIpOworCisJcmV0dXJuICgwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvZXZiNjQyNjAvZXRoX2FkZHJ0YmwuYyBiL2JvYXJkL2V2YjY0MjYwL2V0aF9hZGRydGJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE0OTI1YQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2V2YjY0MjYwL2V0aF9hZGRydGJsLmMKQEAgLTAsMCArMSwyMjUgQEAKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxnYWxpbGVvL2d0NjQyNjBSLmg+CisjaW5jbHVkZSA8Z2FsaWxlby9jb3JlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSAiZXRoLmgiCisjaW5jbHVkZSAiZXRoX2FkZHJ0YmwuaCIKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorCisjZGVmaW5lIFBSSU5URiBwcmludGYKKworI2lmZGVmIENPTkZJR19HVF9VU0VfTUFDX0hBU0hfVEFCTEUKKworc3RhdGljIHUzMiAgICAgICAgICAgYWRkcmVzc1RhYmxlSGFzaE1vZGVbIEdBTF9FVEhfREVWUyBdID0geyAwLCB9Oworc3RhdGljIHUzMiAgICAgICAgICAgYWRkcmVzc1RhYmxlSGFzaFNpemVbIEdBTF9FVEhfREVWUyBdID0geyAwLCB9Oworc3RhdGljIGFkZHJUYmxFbnRyeSAqYWRkcmVzc1RhYmxlQmFzZVsgICAgIEdBTF9FVEhfREVWUyBdID0geyAwLCB9Oworc3RhdGljIHZvaWQgICAgICAgICAqcmVhbEFkZHJUYWJsZUJhc2VbICAgIEdBTF9FVEhfREVWUyBdID0geyAwLCB9OworCitzdGF0aWMgY29uc3QgdTMyIGhhc2hMZW5ndGhbIDIgXSA9IHsKKyAgICAoMHg4MDAwKSwgICAgICAgICAgICAgLyogOEsgKiA0IGVudHJpZXMgKi8KKyAgICAoMHg4MDAwLzE2KSwgICAgICAgICAgLyogNTEyICogNCBlbnRyaWVzICovCit9OworCisvKiBJbml0aWFsaXplIHRoZSBhZGRyZXNzIHRhYmxlIGZvciBhIHBvcnQsIGlmIG5lZWRlZCAqLwordW5zaWduZWQgaW50IGluaXRBZGRyZXNzVGFibGUoIHUzMiBwb3J0LCB1MzIgaGFzaE1vZGUsIHUzMiBoYXNoU2l6ZVNlbGVjdG9yKQoreworICAgIHVuc2lnbmVkIGludCB0YWJsZUJhc2U7CisKKyAgICBpZiggcG9ydCA8IDAgfHwgcG9ydCA+PSBHQUxfRVRIX0RFVlMgKSB7CisJCXByaW50ZigiJXM6IEludmFsaWQgcG9ydCBudW1iZXIgJWRcbiIsIF9fRlVOQ1RJT05fXywgcG9ydCApOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaGFzaE1vZGUgPiAxKSB7CisJCXByaW50ZigiJXM6IEludmFsaWQgSGFzaCBNb2RlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBvcnQgKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCByZWFsQWRkclRhYmxlQmFzZVtwb3J0XSAmJgorCQkoIGFkZHJlc3NUYWJsZUhhc2hTaXplW3BvcnRdICE9IGhhc2hTaXplU2VsZWN0b3IgKSkgeworCQkvKiB3ZSBoYXZlIGJlZW4gaGVyZSBiZWZvcmUsCisJCSAqIGJ1dCBub3cgd2Ugd2FudCBhIGRpZmZlcmVudCBzaXplZCB0YWJsZQorCQkgKi8KKwkJZnJlZSggcmVhbEFkZHJUYWJsZUJhc2VbcG9ydF0gKTsKKwkJcmVhbEFkZHJUYWJsZUJhc2VbcG9ydF0gPSAwOworCQlhZGRyZXNzVGFibGVCYXNlW3BvcnRdID0gMDsKKworCX0KKworCXRhYmxlQmFzZSA9ICh1bnNpZ25lZCBpbnQpYWRkcmVzc1RhYmxlQmFzZVtwb3J0XTsKKwkvKiB3ZSBnZXQgY2FsbGVkIGZvciBldmVyeSBwcm9iZSwgc28gb25seSBkbyB0aGlzIG9uY2UgKi8KKwlpZiAoICF0YWJsZUJhc2UgKSB7CisgICAgCWludCBieXRlcyA9IGhhc2hMZW5ndGhbaGFzaFNpemVTZWxlY3Rvcl0gKiBzaXplb2YoYWRkclRibEVudHJ5KTsKKworCQl0YWJsZUJhc2UgPSAodW5zaWduZWQgaW50KXJlYWxBZGRyVGFibGVCYXNlW3BvcnRdID0gbWFsbG9jKGJ5dGVzKzY0KTsKKworCSAgICBpZighdGFibGVCYXNlKQorCQl7CisJCQlwcmludGYoIiVzOiBhbGxvYyBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAwOworCQl9CisKKyAgICAJLyogYWxpZ24gdG8gb2N0YWwgYnl0ZSAqLworCSAgICBpZih0YWJsZUJhc2UmNjMpIHRhYmxlQmFzZT0odGFibGVCYXNlKzYzKSAmIH42MzsKKworICAgIAlhZGRyZXNzVGFibGVIYXNoTW9kZVtwb3J0XSA9IGhhc2hNb2RlOworCSAgICBhZGRyZXNzVGFibGVIYXNoU2l6ZVtwb3J0XSA9IGhhc2hTaXplU2VsZWN0b3I7CisgICAgCWFkZHJlc3NUYWJsZUJhc2VbcG9ydF0gPSAoYWRkclRibEVudHJ5ICopdGFibGVCYXNlOworCisJICAgIG1lbXNldCgodm9pZCAqKXRhYmxlQmFzZSwwLGJ5dGVzKTsKKwl9CisKKyAgICByZXR1cm4gdGFibGVCYXNlOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSB0aGUgaGFzaCBmdW5jdGlvbiBvZiB0aGUgYWRkcmVzcy4KKyAqIGRlcGVuZHMgb24gdGhlIGhhc2ggbW9kZSBhbmQgaGFzaCBzaXplLgorICogSW5wdXRzCisgKiBtYWNIICAgICAgICAgICAgIC0gdGhlIDIgbW9zdCBzaWduaWZpY2FudCBieXRlcyBvZiB0aGUgTUFDIGFkZHJlc3MuCisgKiBtYWNMICAgICAgICAgICAgIC0gdGhlIDQgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgb2YgdGhlIE1BQyBhZGRyZXNzLgorICogaGFzaE1vZGUgICAgICAgICAtIGhhc2ggbW9kZSAwIG9yIGhhc2ggbW9kZSAxLgorICogaGFzaFNpemVTZWxlY3RvciAtIGluZGljYXRlcyBudW1iZXIgb2YgaGFzaCB0YWJsZSBlbnRyaWVzICgwPTB4ODAwMCwxPTB4ODAwKQorICogT3V0cHV0cworICogcmV0dXJuIHRoZSBjYWxjdWxhdGVkIGVudHJ5LgorICovCit1MzIKK2hhc2hUYWJsZUZ1bmN0aW9uKCB1MzIgbWFjSCwgdTMyIG1hY0wsIHUzMiBIYXNoU2l6ZSwgdTMyIGhhc2hfbW9kZSkKK3sKKyAgICB1MzIgaGFzaFJlc3VsdDsKKyAgICB1MzIgYWRkckg7CisgICAgdTMyIGFkZHJMOworICAgIHUzMiBhZGRyMDsKKyAgICB1MzIgYWRkcjE7CisgICAgdTMyIGFkZHIyOworICAgIHUzMiBhZGRyMzsKKyAgICB1MzIgYWRkckhTd2FwcGVkOworICAgIHUzMiBhZGRyTFN3YXBwZWQ7CisKKworICAgIGFkZHJIID0gTklCQkxFX1NXQVBQSU5HXzE2X0JJVCggbWFjSCApOworICAgIGFkZHJMID0gTklCQkxFX1NXQVBQSU5HXzMyX0JJVCggbWFjTCApOworCisgICAgYWRkckhTd2FwcGVkID0gICBGTElQXzRfQklUUyggIGFkZHJIICAgICAgICAmIDB4ZiApCisgICAgICAgICAgICAgICAgICsgKChGTElQXzRfQklUUyggKGFkZHJIID4+ICA0KSAmIDB4ZikpIDw8ICA0KQorICAgICAgICAgICAgICAgICArICgoRkxJUF80X0JJVFMoIChhZGRySCA+PiAgOCkgJiAweGYpKSA8PCAgOCkKKyAgICAgICAgICAgICAgICAgKyAoKEZMSVBfNF9CSVRTKCAoYWRkckggPj4gMTIpICYgMHhmKSkgPDwgMTIpOworCisgICAgYWRkckxTd2FwcGVkID0gICBGTElQXzRfQklUUyggIGFkZHJMICAgICAgICAmIDB4ZiApCisgICAgICAgICAgICAgICAgICsgKChGTElQXzRfQklUUyggKGFkZHJMID4+ICA0KSAmIDB4ZikpIDw8ICA0KQorICAgICAgICAgICAgICAgICArICgoRkxJUF80X0JJVFMoIChhZGRyTCA+PiAgOCkgJiAweGYpKSA8PCAgOCkKKyAgICAgICAgICAgICAgICAgKyAoKEZMSVBfNF9CSVRTKCAoYWRkckwgPj4gMTIpICYgMHhmKSkgPDwgMTIpCisgICAgICAgICAgICAgICAgICsgKChGTElQXzRfQklUUyggKGFkZHJMID4+IDE2KSAmIDB4ZikpIDw8IDE2KQorICAgICAgICAgICAgICAgICArICgoRkxJUF80X0JJVFMoIChhZGRyTCA+PiAyMCkgJiAweGYpKSA8PCAyMCkKKyAgICAgICAgICAgICAgICAgKyAoKEZMSVBfNF9CSVRTKCAoYWRkckwgPj4gMjQpICYgMHhmKSkgPDwgMjQpCisgICAgICAgICAgICAgICAgICsgKChGTElQXzRfQklUUyggKGFkZHJMID4+IDI4KSAmIDB4ZikpIDw8IDI4KTsKKworICAgIGFkZHJIID0gYWRkckhTd2FwcGVkOworICAgIGFkZHJMID0gYWRkckxTd2FwcGVkOworCisgICAgaWYoIGhhc2hfbW9kZSA9PSAwICkgIHsKKyAgICAgICAgYWRkcjAgPSAgKGFkZHJMID4+ICAyKSAmIDB4MDNmOworICAgICAgICBhZGRyMSA9ICAoYWRkckwgICAgICAgICYgMHgwMDMpIHwgKChhZGRyTCA+PiA4KSAmIDB4N2YpIDw8IDI7CisgICAgICAgIGFkZHIyID0gIChhZGRyTCA+PiAxNSkgJiAweDFmZjsKKyAgICAgICAgYWRkcjMgPSAoKGFkZHJMID4+IDI0KSAmIDB4MGZmKSB8ICgoYWRkckggJiAgMSkgICAgICAgICA8PCA4KTsKKyAgICB9IGVsc2UgIHsKKyAgICAgICAgYWRkcjAgPSBGTElQXzZfQklUUyggICAgYWRkckwgICAgICAgICYgMHgwM2YgKTsKKyAgICAgICAgYWRkcjEgPSBGTElQXzlfQklUUyggICgoYWRkckwgPj4gIDYpICYgMHgxZmYpKTsKKyAgICAgICAgYWRkcjIgPSBGTElQXzlfQklUUyggICAoYWRkckwgPj4gMTUpICYgMHgxZmYpOworICAgICAgICBhZGRyMyA9IEZMSVBfOV9CSVRTKCAoKChhZGRyTCA+PiAyNCkgJiAweDBmZikgfCAoKGFkZHJIICYgMHgxKSA8PCA4KSkpOworICAgIH0KKworICAgIGhhc2hSZXN1bHQgPSAoYWRkcjAgPDwgOSkgfCAoYWRkcjEgXiBhZGRyMiBeIGFkZHIzKTsKKworICAgIGlmKCBIYXNoU2l6ZSA9PSBfOEtfVEFCTEUgKSAgeworICAgICAgICBoYXNoUmVzdWx0ID0gaGFzaFJlc3VsdCAmIDB4ZmZmZjsKKyAgICB9IGVsc2UgIHsKKyAgICAgICAgaGFzaFJlc3VsdCA9IGhhc2hSZXN1bHQgJiAweDA3ZmY7CisgICAgfQorCisgICAgcmV0dXJuKCBoYXNoUmVzdWx0ICk7Cit9CisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhZGQgYW4gZW50cnkgdG8gdGhlIGFkZHJlc3MgdGFibGUuCisgKiBkZXBlbmRzIG9uIHRoZSBoYXNoIG1vZGUgYW5kIGhhc2ggc2l6ZSB0aGF0IHdhcyBpbml0aWFsaXplZC4KKyAqIElucHV0cworICogcG9ydCAtIEVUSEVSTkVUIHBvcnQgbnVtYmVyLgorICogbWFjSCAtIHRoZSAyIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgb2YgdGhlIE1BQyBhZGRyZXNzLgorICogbWFjTCAtIHRoZSA0IGxlYXN0IHNpZ25pZmljYW50IGJ5dGVzIG9mIHRoZSBNQUMgYWRkcmVzcy4KKyAqIHNraXAgLSBpZiAxLCBza2lwIHRoaXMgYWRkcmVzcy4KKyAqIHJkICAgLSB0aGUgUkQgZmllbGQgaW4gdGhlIGFkZHJlc3MgdGFibGUuCisgKiBPdXRwdXRzCisgKiBhZGRyZXNzIHRhYmxlIGVudHJ5IGlzIGFkZGVkLgorICogVFJVRSBpZiBzdWNjZXNzLgorICogRkFMU0UgaWYgdGFibGUgZnVsbAorICovCitpbnQKK2FkZEFkZHJlc3NUYWJsZUVudHJ5KAorICAgIHUzMiAgICAgICAgICAgcG9ydCwKKyAgICB1MzIgICAgICAgICAgIG1hY0gsCisgICAgdTMyICAgICAgICAgICBtYWNMLAorICAgIHUzMiAgICAgICAgICAgcmQsCisgICAgdTMyICAgICAgICAgICBza2lwICAgICAgICAgKQoreworICAgIGFkZHJUYmxFbnRyeSAqZW50cnk7CisgICAgdTMyICAgICAgICAgICBuZXdIaTsKKyAgICB1MzIgICAgICAgICAgIG5ld0xvOworICAgIHUzMiAgICAgICAgICAgaTsKKworICAgIG5ld0xvID0gKCgobWFjSCA+PiAgNCkgJiAweGYpIDw8IDE1KQorICAgICAgICAgIHwgKCgobWFjSCA+PiAgMCkgJiAweGYpIDw8IDExKQorICAgICAgICAgIHwgKCgobWFjSCA+PiAxMikgJiAweGYpIDw8ICA3KQorICAgICAgICAgIHwgKCgobWFjSCA+PiAgOCkgJiAweGYpIDw8ICAzKQorICAgICAgICAgIHwgKCgobWFjTCA+PiAyMCkgJiAweDEpIDw8IDMxKQorICAgICAgICAgIHwgKCgobWFjTCA+PiAxNikgJiAweGYpIDw8IDI3KQorICAgICAgICAgIHwgKCgobWFjTCA+PiAyOCkgJiAweGYpIDw8IDIzKQorICAgICAgICAgIHwgKCgobWFjTCA+PiAyNCkgJiAweGYpIDw8IDE5KQorICAgICAgICAgIHwgICAoc2tpcCA8PCBTS0lQX0JJVCkgIHwgIChyZCA8PCAyKSB8IFZBTElEOworCisgICAgbmV3SGkgPSAoKChtYWNMID4+ICA0KSAmIDB4ZikgPDwgMTUpCisgICAgICAgICAgfCAoKChtYWNMID4+ICAwKSAmIDB4ZikgPDwgMTEpCisgICAgICAgICAgfCAoKChtYWNMID4+IDEyKSAmIDB4ZikgPDwgIDcpCisgICAgICAgICAgfCAoKChtYWNMID4+ICA4KSAmIDB4ZikgPDwgIDMpCisgICAgICAgICAgfCAoKChtYWNMID4+IDIxKSAmIDB4NykgPDwgIDApOworCisgICAgLyoKKyAgICAgKiBQaWNrIHRoZSBhcHByb3ByaWF0ZSB0YWJsZSwgc3RhcnQgc2Nhbm5pbmcgZm9yIGZyZWUvcmV1c2FibGUKKyAgICAgKiBlbnRyaWVzIGF0IHRoZSBpbmRleCBvYnRhaW5lZCBieSBoYXNoaW5nIHRoZSBzcGVjaWZpZWQgTUFDIGFkZHJlc3MKKyAgICAgKi8KKyAgICBlbnRyeSAgPSBhZGRyZXNzVGFibGVCYXNlW3BvcnRdOworICAgIGVudHJ5ICs9IGhhc2hUYWJsZUZ1bmN0aW9uKCBtYWNILCBtYWNMLCBhZGRyZXNzVGFibGVIYXNoU2l6ZVtwb3J0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1RhYmxlSGFzaE1vZGVbcG9ydF0gICk7CisgICAgZm9yKCBpID0gMDsgIGkgPCBIT1BfTlVNQkVSOyAgaSsrLCBlbnRyeSsrICkgIHsKKyAgICAgICAgaWYoICEoZW50cnktPmxvICYgVkFMSUQpICAgLyp8fCAoZW50cnktPmxvICYgU0tJUCkqLyAgICkgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgIHsgICAgICAgICAgICAgICAgICAgIC8qIGlmIHNhbWUgYWRkcmVzcyBwdXQgaW4gc2FtZSBwb3NpdGlvbiAqLworICAgICAgICAgICAgaWYoICAgKChlbnRyeS0+bG8gJiAweGZmZmZmZmY4KSA9PSAobmV3TG8gJiAweGZmZmZmZmY4KSkKKyAgICAgICAgICAgICAgICAmJiAoZW50cnktPmhpICAgICAgICAgICAgICAgPT0gIG5ld0hpKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGkgPT0gSE9QX05VTUJFUiApICB7CisgICAgICAgIFBSSU5URiggImFkZEdUNjQyNjBhZGRyZXNzVGFibGVFbnRyeTogdGFibGUgc2VjdGlvbiBpcyBmdWxsXG4iICk7CisgICAgICAgIHJldHVybiggRkFMU0UgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgZW50cnkKKyAgICAgKi8KKyAgICBlbnRyeS0+aGkgPSBuZXdIaTsKKyAgICBlbnRyeS0+bG8gPSBuZXdMbzsKKyAgICBEQ0FDSEVfRkxVU0hfTl9TWU5DKCAodTMyKWVudHJ5LCBNQUNfRU5UUllfU0laRSApOworICAgIHJldHVybiggVFJVRSApOworfQorCisjZW5kaWYgLyogQ09ORklHX0dUX1VTRV9NQUNfSEFTSF9UQUJMRSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvZXZiNjQyNjAvcGNpLmMgYi9ib2FyZC9ldmI2NDI2MC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTkxNzhkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZXZiNjQyNjAvcGNpLmMKQEAgLTAsMCArMSw2OTEgQEAKKy8qIFBDSS5jIC0gUENJIGZ1bmN0aW9ucyAqLworCisvKiBDb3B5cmlnaHQgLSBHYWxpbGVvIHRlY2hub2xvZ3kuICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworI2luY2x1ZGUgPGdhbGlsZW8vcGNpLmg+CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBjaV9pcnFfc3dpenpsZVsyXVtQQ0lfTUFYX0RFVklDRVNdID0geworI2lmZGVmIENPTkZJR19aVU1BX1YyCisgICAgezAsMCwwLDAsMCwwLDAsMjksIFs4IC4uLiBQQ0lfTUFYX0RFVklDRVMtMV09MH0sCisgICAgezAsMCwwLDAsMCwwLDAsMjgsIFs4IC4uLiBQQ0lfTUFYX0RFVklDRVMtMV09MH0KKyNlbHNlCS8qIEVWQj8/PyBUaGlzIGlzIGEgZ3Vlc3MgKi8KKyAgICB7MCwwLDAsMCwwLDAsMCwyNywyNywgWzkgLi4uIFBDSV9NQVhfREVWSUNFUy0xXT0wfSwKKyAgICB7MCwwLDAsMCwwLDAsMCwyOSwyOSwgWzkgLi4uIFBDSV9NQVhfREVWSUNFUy0xXT0wfQorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9wMnBfY29uZmlndXJhdGlvbl9yZWdbXT17CisgICAgUENJXzBQMlBfQ09ORklHVVJBVElPTiwgUENJXzFQMlBfQ09ORklHVVJBVElPTn07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tdPXsKKyAgICBQQ0lfMENPTkZJR1VSQVRJT05fQUREUkVTUywgUENJXzFDT05GSUdVUkFUSU9OX0FERFJFU1N9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9jb25maWd1cmF0aW9uX2RhdGFbXT17CisgICAgUENJXzBDT05GSUdVUkFUSU9OX0RBVEFfVklSVFVBTF9SRUdJU1RFUiwKKyAgICBQQ0lfMUNPTkZJR1VSQVRJT05fREFUQV9WSVJUVUFMX1JFR0lTVEVSfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfZXJyb3JfY2F1c2VfcmVnW109eworICAgIFBDSV8wRVJST1JfQ0FVU0UsIFBDSV8xRVJST1JfQ0FVU0V9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9hcmJpdGVyX2NvbnRyb2xbXT17CisgICAgUENJXzBBUkJJVEVSX0NPTlRST0wsIFBDSV8xQVJCSVRFUl9DT05UUk9MfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfc25vb3BfY29udHJvbF9iYXNlXzBfbG93W109eworICAgIFBDSV8wU05PT1BfQ09OVFJPTF9CQVNFXzBfTE9XLCBQQ0lfMVNOT09QX0NPTlRST0xfQkFTRV8wX0xPV307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9zbm9vcF9jb250cm9sX3RvcF8wW109eworICAgIFBDSV8wU05PT1BfQ09OVFJPTF9UT1BfMCwgUENJXzFTTk9PUF9DT05UUk9MX1RPUF8wfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfYWNjZXNzX2NvbnRyb2xfYmFzZV8wX2xvd1tdPXsKKyAgICBQQ0lfMEFDQ0VTU19DT05UUk9MX0JBU0VfMF9MT1csIFBDSV8xQUNDRVNTX0NPTlRST0xfQkFTRV8wX0xPV307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9hY2Nlc3NfY29udHJvbF90b3BfMFtdPXsKKyAgICBQQ0lfMEFDQ0VTU19DT05UUk9MX1RPUF8wLCBQQ0lfMUFDQ0VTU19DT05UUk9MX1RPUF8wfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfc2NzX2Jhbmtfc2l6ZVsyXVs0XSA9IHsKKyAgICB7UENJXzBTQ1NfMF9CQU5LX1NJWkUsIFBDSV8wU0NTXzFfQkFOS19TSVpFLAorICAgICBQQ0lfMFNDU18yX0JBTktfU0laRSwgUENJXzBTQ1NfM19CQU5LX1NJWkV9LAorICAgIHtQQ0lfMVNDU18wX0JBTktfU0laRSwgUENJXzFTQ1NfMV9CQU5LX1NJWkUsCisgICAgIFBDSV8xU0NTXzJfQkFOS19TSVpFLCBQQ0lfMVNDU18zX0JBTktfU0laRX19OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9wMnBfY29uZmlndXJhdGlvbltdID0geworICAgIFBDSV8wUDJQX0NPTkZJR1VSQVRJT04sIFBDSV8xUDJQX0NPTkZJR1VSQVRJT059OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpV3JpdGVDb25maWdSZWcgLSBXcml0ZSB0byBhIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisqICAgICAgICAgICAgICAgICAgICAtIE1ha2Ugc3VyZSB0aGUgR1QgaXMgY29uZmlndXJlZCBhcyBhIG1hc3RlciBiZWZvcmUgd3JpdGluZworKiAgICAgICAgICAgICAgICAgICAgICB0byBhbm90aGVyIGRldmljZSBvbiB0aGUgUENJLgorKiAgICAgICAgICAgICAgICAgICAgLSBUaGUgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBCaWcvTGl0dGxlIGVuZGlhbiBjb252ZXJzaW9uLgorKgorKgorKiBJbnB1dHM6ICAgdW5zaWduZWQgaW50IHJlZ09mZnNldDogVGhlIHJlZ2lzdGVyIG9mZnNldCBhcyBpdCBhcGVhcnMgaW4gdGhlIEdUIHNwZWMKKyogICAgICAgICAgICAgICAgICAgKG9yIGFueSBvdGhlciBQQ0kgZGV2aWNlIHNwZWMpCisqICAgICAgICAgICBwY2lEZXZOdW06IFRoZSBkZXZpY2UgbnVtYmVyIG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KKyoKKyogIENvbmZpZ3VyYXRpb24gQWRkcmVzcyAweENGODoKKyoKKyogICAgICAgMzEgMzAgICAgMjQgMjMgIDE2IDE1ICAxMSAxMCAgICAgOCA3ICAgICAgMiAgMCAgICAgPD1iaXQgTnVtYmVyCisqICB8Y29uZ2lmfFJlc2VydmVkfCAgQnVzIHxEZXZpY2V8RnVuY3Rpb258UmVnaXN0ZXJ8MDB8CisqICB8RW5hYmxlfCAgICAgICAgfE51bWJlcnxOdW1iZXJ8IE51bWJlciB8IE51bWJlciB8ICB8ICAgIDw9ZmllbGQgTmFtZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwY2lXcml0ZUNvbmZpZ1JlZyhQQ0lfSE9TVCBob3N0LCB1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0LHVuc2lnbmVkIGludCBwY2lEZXZOdW0sdW5zaWduZWQgaW50IGRhdGEpCit7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgaW50IERhdGFGb3JBZGRyUmVnOworICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbk51bTsKKyAgICB1bnNpZ25lZCBpbnQgYnVzTnVtID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcjsKKworICAgIGlmKHBjaURldk51bSA+IDMyKSAvKiBpbGxlZ2FsIGRldmljZSBOdW1iZXIgKi8KKyAgICAgICAgcmV0dXJuOworICAgIGlmKHBjaURldk51bSA9PSBTRUxGKSAvKiBjb25maWd1cmUgb3VyIGNvbmZpZ3VyYXRpb24gc3BhY2UuICovCisgICAgeworICAgICAgICBwY2lEZXZOdW0gPSAoR1RSRUdSRUFEKHBjaV9wMnBfY29uZmlndXJhdGlvbl9yZWdbaG9zdF0pID4+IDI0KSAmIDB4MWY7CisgICAgICAgIGJ1c051bSA9IEdUUkVHUkVBRChwY2lfcDJwX2NvbmZpZ3VyYXRpb25fcmVnW2hvc3RdKSAmIDB4ZmYwMDAwOworICAgIH0KKyAgICBmdW5jdGlvbk51bSA9ICByZWdPZmZzZXQgJiAweDAwMDAwNzAwOworICAgIHBjaURldk51bSA9IHBjaURldk51bSA8PCAxMTsKKyAgICByZWdPZmZzZXQgPSByZWdPZmZzZXQgJiAweGZjOworICAgIERhdGFGb3JBZGRyUmVnID0gKCByZWdPZmZzZXQgfCBwY2lEZXZOdW0gfCBmdW5jdGlvbk51bSB8IGJ1c051bSkgfCBCSVQzMTsKKyAgICBHVF9SRUdfV1JJVEUocGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tob3N0XSxEYXRhRm9yQWRkclJlZyk7CisgICAgR1RfUkVHX1JFQUQocGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tob3N0XSwgJmFkZHIpOworICAgIGlmIChhZGRyICE9IERhdGFGb3JBZGRyUmVnKSByZXR1cm47CisgICAgR1RfUkVHX1dSSVRFKHBjaV9jb25maWd1cmF0aW9uX2RhdGFbaG9zdF0sZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lSZWFkQ29uZmlnUmVnICAtIFJlYWQgZnJvbSBhIFBDSTAgY29uZmlndXJhdGlvbiByZWdpc3RlcgorKiAgICAgICAgICAgICAgICAgICAgLSBNYWtlIHN1cmUgdGhlIEdUIGlzIGNvbmZpZ3VyZWQgYXMgYSBtYXN0ZXIgYmVmb3JlIHJlYWRpbmcKKyogICAgICAgICAgICAgICAgICAgICBmcm9tIGFub3RoZXIgZGV2aWNlIG9uIHRoZSBQQ0kuCisqICAgICAgICAgICAgICAgICAgIC0gVGhlIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgQmlnL0xpdHRsZSBlbmRpYW4gY29udmVyc2lvbi4KKyogSU5QVVRTOiAgIHJlZ09mZnNldDogVGhlIHJlZ2lzdGVyIG9mZnNldCBhcyBpdCBhcGVhcnMgaW4gdGhlIEdUIHNwZWMgKG9yIFBDSQorKiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMpCisqICAgICAgICAgICBwY2lEZXZOdW06IFRoZSBkZXZpY2UgbnVtYmVyIG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KKyogUkVUVVJOUzogZGF0YSAsIGlmIHRoZSBkYXRhID09IDB4ZmZmZmZmZmYgY2hlY2sgdGhlIG1hc3RlciBhYm9ydCBiaXQgaW4gdGhlCisqICAgICAgICAgICAgICAgICBjYXVzZSByZWdpc3RlciB0byBtYWtlIHN1cmUgdGhlIGRhdGEgaXMgdmFsaWQKKyoKKyogIENvbmZpZ3VyYXRpb24gQWRkcmVzcyAweENGODoKKyoKKyogICAgICAgMzEgMzAgICAgMjQgMjMgIDE2IDE1ICAxMSAxMCAgICAgOCA3ICAgICAgMiAgMCAgICAgPD1iaXQgTnVtYmVyCisqICB8Y29uZ2lmfFJlc2VydmVkfCAgQnVzIHxEZXZpY2V8RnVuY3Rpb258UmVnaXN0ZXJ8MDB8CisqICB8RW5hYmxlfCAgICAgICAgfE51bWJlcnxOdW1iZXJ8IE51bWJlciB8IE51bWJlciB8ICB8ICAgIDw9ZmllbGQgTmFtZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IHBjaVJlYWRDb25maWdSZWcgKFBDSV9IT1NUIGhvc3QsIHVuc2lnbmVkIGludCByZWdPZmZzZXQsdW5zaWduZWQgaW50IHBjaURldk51bSkKK3sKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRGF0YUZvckFkZHJSZWc7CisgICAJdW5zaWduZWQgaW50IGRhdGE7CisgICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uTnVtOworICAgIHVuc2lnbmVkIGludCBidXNOdW0gPSAwOworCisgICAgaWYocGNpRGV2TnVtID4gMzIpIC8qIGlsbGVnYWwgZGV2aWNlIE51bWJlciAqLworICAgICAgICByZXR1cm4gMHhmZmZmZmZmZjsKKyAgICBpZihwY2lEZXZOdW0gPT0gU0VMRikgLyogY29uZmlndXJlIG91ciBjb25maWd1cmF0aW9uIHNwYWNlLiAqLworICAgIHsKKyAgICAgICAgcGNpRGV2TnVtID0gKEdUUkVHUkVBRChwY2lfcDJwX2NvbmZpZ3VyYXRpb25fcmVnW2hvc3RdKSA+PiAyNCkgJiAweDFmOworICAgICAgICBidXNOdW0gPSBHVFJFR1JFQUQocGNpX3AycF9jb25maWd1cmF0aW9uX3JlZ1tob3N0XSkgJiAweGZmMDAwMDsKKyAgICB9CisgICAgZnVuY3Rpb25OdW0gPSByZWdPZmZzZXQgJiAweDAwMDAwNzAwOworICAgIHBjaURldk51bSA9IHBjaURldk51bSA8PCAxMTsKKyAgICByZWdPZmZzZXQgPSByZWdPZmZzZXQgJiAweGZjOworICAgIERhdGFGb3JBZGRyUmVnID0gKHJlZ09mZnNldCB8IHBjaURldk51bSB8IGZ1bmN0aW9uTnVtIHwgYnVzTnVtKSB8IEJJVDMxIDsKKyAgICBHVF9SRUdfV1JJVEUocGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tob3N0XSxEYXRhRm9yQWRkclJlZyk7CisgICAgR1RfUkVHX1JFQUQocGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tob3N0XSwgJmRhdGEpOworICAgIGlmIChkYXRhICE9IERhdGFGb3JBZGRyUmVnKQorICAgICAgICByZXR1cm4gMHhmZmZmZmZmZjsKKyAgICBHVF9SRUdfUkVBRChwY2lfY29uZmlndXJhdGlvbl9kYXRhW2hvc3RdLCAmZGF0YSk7CisgICAgcmV0dXJuIGRhdGE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lPdmVyQnJpZGdlV3JpdGVDb25maWdSZWcgLSBXcml0ZSB0byBhIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHdoZXJlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhZ2VudCBpcyBwbGFjZWQgb24gYW5vdGhlciBCdXMuIEZvciBtb3JlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHJlYWQgUDJQIGluIHRoZSBQQ0kgc3BlYy4KKyoKKyogSW5wdXRzOiAgIHVuc2lnbmVkIGludCByZWdPZmZzZXQgLSBUaGUgcmVnaXN0ZXIgb2Zmc2V0IGFzIGl0IGFwZWFycyBpbiB0aGUKKyogICAgICAgICAgIEdUIHNwZWMgKG9yIGFueSBvdGhlciBQQ0kgZGV2aWNlIHNwZWMpLgorKiAgICAgICAgICAgdW5zaWduZWQgaW50IHBjaURldk51bSAtIFRoZSBkZXZpY2UgbnVtYmVyIG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KKyogICAgICAgICAgIHVuc2lnbmVkIGludCBidXNOdW0gLSBPbiB3aGljaCBidXMgZG9lcyB0aGUgVGFyZ2V0IGFnZW50IGNvbm5lY3QKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0by4KKyogICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhIC0gZGF0YSB0byBiZSB3cml0dGVuLgorKgorKiAgQ29uZmlndXJhdGlvbiBBZGRyZXNzIDB4Q0Y4OgorKgorKiAgICAgICAzMSAzMCAgICAyNCAyMyAgMTYgMTUgIDExIDEwICAgICA4IDcgICAgICAyICAwICAgICA8PWJpdCBOdW1iZXIKKyogIHxjb25naWZ8UmVzZXJ2ZWR8ICBCdXMgfERldmljZXxGdW5jdGlvbnxSZWdpc3RlcnwwMXwKKyogIHxFbmFibGV8ICAgICAgICB8TnVtYmVyfE51bWJlcnwgTnVtYmVyIHwgTnVtYmVyIHwgIHwgICAgPD1maWVsZCBOYW1lCisqCisqICBUaGUgY29uZmlndXJhdGlvbiBBZGRyZXNzIGlzIGNvbmZpZ3VyZSBhcyB0eXBlLUkgKGJpdHNbMTowXSA9ICcwMScpIGR1ZSB0bworKiAgIFBDSSBzcGVjIHJlZmVycmluZyB0byBQMlAuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBjaU92ZXJCcmlkZ2VXcml0ZUNvbmZpZ1JlZyhQQ0lfSE9TVCBob3N0LAorCQkJCSB1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBjaURldk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBidXNOdW0sdW5zaWduZWQgaW50IGRhdGEpCit7CisgICAJdW5zaWduZWQgaW50ICAgRGF0YUZvclJlZzsKKyAgICB1bnNpZ25lZCBpbnQgICBmdW5jdGlvbk51bTsKKworICAgCWZ1bmN0aW9uTnVtID0gIHJlZ09mZnNldCAmIDB4MDAwMDA3MDA7CisgICAgcGNpRGV2TnVtID0gcGNpRGV2TnVtIDw8IDExOworICAgIHJlZ09mZnNldCA9IHJlZ09mZnNldCAmIDB4ZmY7CisgICAgYnVzTnVtID0gYnVzTnVtIDw8IDE2OworICAgIGlmKHBjaURldk51bSA9PSBTRUxGKSAvKiBUaGlzIGJvYXJkICovCisgICAgeworICAgICAgICBEYXRhRm9yUmVnID0gKCByZWdPZmZzZXQgfCBwY2lEZXZOdW0gfCBmdW5jdGlvbk51bSkgfCBCSVQwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEYXRhRm9yUmVnID0gKCByZWdPZmZzZXQgfCBwY2lEZXZOdW0gfCBmdW5jdGlvbk51bSB8IGJ1c051bSkgfAorICAgICAgICAgICAgQklUMzEgfCBCSVQwOworICAgIH0KKyAgICBHVF9SRUdfV1JJVEUocGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tob3N0XSxEYXRhRm9yUmVnKTsKKyAgICBpZihwY2lEZXZOdW0gPT0gU0VMRikgLyogVGhpcyBib2FyZCAqLworICAgIHsKKyAgICAgICAgR1RfUkVHX1dSSVRFKHBjaV9jb25maWd1cmF0aW9uX2RhdGFbaG9zdF0sZGF0YSk7CisgICAgfQorICAgIGVsc2UgLyogY29uZmlndXJhdGlvbiBUcmFuc2FjdGlvbiBvdmVyIHRoZSBwY2kuICovCisgICAgeworICAgICAgICAvKiBUaGUgUENJIGlzIHdvcmtpbmcgaW4gTEUgTW9kZSBTbyBpdCBzd2FwIHRoZSBEYXRhLiAqLworICAgICAgICBHVF9SRUdfV1JJVEUocGNpX2NvbmZpZ3VyYXRpb25fZGF0YVtob3N0XSxXT1JEX1NXQVAoZGF0YSkpOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpT3ZlckJyaWRnZVJlYWRDb25maWdSZWcgIC0gUmVhZCBmcm9tIGEgUENJbiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHdoZXJlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhZ2VudCB0YXJnZXQgbG9jYXRlIG9uIGFub3RoZXIgUENJIGJ1cy4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTWFrZSBzdXJlIHRoZSBHVCBpcyBjb25maWd1cmVkIGFzIGEgbWFzdGVyCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSByZWFkaW5nIGZyb20gYW5vdGhlciBkZXZpY2Ugb24gdGhlIFBDSS4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhlIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgQmlnL0xpdHRsZSBlbmRpYW4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbi4KKyogSU5QVVRTOiAgIHJlZ09mZnNldDogVGhlIHJlZ2lzdGVyIG9mZnNldCBhcyBpdCBhcGVhcnMgaW4gdGhlIEdUIHNwZWMgKG9yIFBDSQorKiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMpLiAoY29uZmlndXJhdGlvbiByZWdpc3RlciBvZmZzZXQuKQorKiAgICAgICAgICAgcGNpRGV2TnVtOiBUaGUgZGV2aWNlIG51bWJlciBuZWVkcyB0byBiZSBhZGRyZXNzZWQuCisqICAgICAgICAgICBidXNOdW06IHRoZSBCdXMgbnVtYmVyIHdoZXJlIHRoZSBhZ2VudCBpcyBwbGFjZS4KKyogUkVUVVJOUzogZGF0YSAsIGlmIHRoZSBkYXRhID09IDB4ZmZmZmZmZmYgY2hlY2sgdGhlIG1hc3RlciBhYm9ydCBiaXQgaW4gdGhlCisqICAgICAgICAgICAgICAgICBjYXVzZSByZWdpc3RlciB0byBtYWtlIHN1cmUgdGhlIGRhdGEgaXMgdmFsaWQKKyoKKyogIENvbmZpZ3VyYXRpb24gQWRkcmVzcyAweENGODoKKyoKKyogICAgICAgMzEgMzAgICAgMjQgMjMgIDE2IDE1ICAxMSAxMCAgICAgOCA3ICAgICAgMiAgMCAgICAgPD1iaXQgTnVtYmVyCisqICB8Y29uZ2lmfFJlc2VydmVkfCAgQnVzIHxEZXZpY2V8RnVuY3Rpb258UmVnaXN0ZXJ8MDF8CisqICB8RW5hYmxlfCAgICAgICAgfE51bWJlcnxOdW1iZXJ8IE51bWJlciB8IE51bWJlciB8ICB8ICAgIDw9ZmllbGQgTmFtZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IHBjaU92ZXJCcmlkZ2VSZWFkQ29uZmlnUmVnKFBDSV9IT1NUIGhvc3QsCisJCQkJCXVuc2lnbmVkIGludCByZWdPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBjaURldk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnVzTnVtKQoreworICAgIHVuc2lnbmVkIGludCBEYXRhRm9yUmVnOworICAgIHVuc2lnbmVkIGludCBkYXRhOworICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbk51bTsKKworICAgIGZ1bmN0aW9uTnVtID0gcmVnT2Zmc2V0ICYgMHgwMDAwMDcwMDsKKyAgICBwY2lEZXZOdW0gPSBwY2lEZXZOdW0gPDwgMTE7CisgICAgcmVnT2Zmc2V0ID0gcmVnT2Zmc2V0ICYgMHhmZjsKKyAgICBidXNOdW0gPSBidXNOdW0gPDwgMTY7CisgICAgaWYgKHBjaURldk51bSA9PSBTRUxGKSAvKiBUaGlzIGJvYXJkICovCisgICAgeworICAgICAgICBEYXRhRm9yUmVnID0gKHJlZ09mZnNldCB8IHBjaURldk51bSB8IGZ1bmN0aW9uTnVtKSB8IEJJVDMxIDsKKyAgICB9CisgICAgZWxzZSAvKiBhZ2VudCBvbiBhbm90aGVyIGJ1cyAqLworICAgIHsKKyAgICAgICAgRGF0YUZvclJlZyA9IChyZWdPZmZzZXQgfCBwY2lEZXZOdW0gfCBmdW5jdGlvbk51bSB8IGJ1c051bSkgfAorICAgICAgICBCSVQwIHwgQklUMzEgOworICAgIH0KKyAgICBHVF9SRUdfV1JJVEUocGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tob3N0XSxEYXRhRm9yUmVnKTsKKyAgICBpZiAocGNpRGV2TnVtID09IFNFTEYpIC8qIFRoaXMgYm9hcmQgKi8KKyAgIAl7CisgICAgICAgIEdUX1JFR19SRUFEKHBjaV9jb25maWd1cmF0aW9uX2RhdGFbaG9zdF0sICZkYXRhKTsKKyAgICAJcmV0dXJuIGRhdGE7CisgICAgfQorICAgIGVsc2UgLyogVGhlIFBDSSBpcyB3b3JraW5nIGluIExFIE1vZGUgU28gaXQgc3dhcCB0aGUgRGF0YS4gKi8KKyAgICB7CisgICAgICAgIEdUX1JFR19SRUFEKHBjaV9jb25maWd1cmF0aW9uX2RhdGFbaG9zdF0sICZkYXRhKTsKKyAgICAJcmV0dXJuIFdPUkRfU1dBUChkYXRhKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lHZXRSZWdPZmZzZXQgLSBHZXRzIHRoZSByZWdpc3RlciBvZmZzZXQgZm9yIHRoaXMgcmVnaW9uIGNvbmZpZy4KKyoKKyogSU5QVVQ6ICAgQnVzLCBSZWdpb24gLSBUaGUgYnVzIGFuZCByZWdpb24gd2UgYXNrIGZvciBpdHMgYmFzZSBhZGRyZXNzLgorKiBPVVRQVVQ6ICAgTi9BCisqIFJFVFVSTlM6IFBDSSByZWdpc3RlciBiYXNlIGFkZHJlc3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGNpR2V0UmVnT2Zmc2V0KFBDSV9IT1NUIGhvc3QsIFBDSV9SRUdJT04gcmVnaW9uKQoreworICAgIHN3aXRjaCAoaG9zdCkKKyAgICB7CisJY2FzZSBQQ0lfSE9TVDA6CisJICAgIHN3aXRjaChyZWdpb24pIHsKKwkJY2FzZSBQQ0lfSU86CQlyZXR1cm4gUENJXzBJX09fTE9XX0RFQ09ERV9BRERSRVNTOworCQljYXNlIFBDSV9SRUdJT04wOglyZXR1cm4gUENJXzBNRU1PUlkwX0xPV19ERUNPREVfQUREUkVTUzsKKwkJY2FzZSBQQ0lfUkVHSU9OMToJcmV0dXJuIFBDSV8wTUVNT1JZMV9MT1dfREVDT0RFX0FERFJFU1M7CisJCWNhc2UgUENJX1JFR0lPTjI6CXJldHVybiBQQ0lfME1FTU9SWTJfTE9XX0RFQ09ERV9BRERSRVNTOworCQljYXNlIFBDSV9SRUdJT04zOglyZXR1cm4gUENJXzBNRU1PUlkzX0xPV19ERUNPREVfQUREUkVTUzsKKwkgICAgfQorCWNhc2UgUENJX0hPU1QxOgorCSAgICBzd2l0Y2gocmVnaW9uKSB7CisJCWNhc2UgUENJX0lPOgkJcmV0dXJuIFBDSV8xSV9PX0xPV19ERUNPREVfQUREUkVTUzsKKwkJY2FzZSBQQ0lfUkVHSU9OMDoJcmV0dXJuIFBDSV8xTUVNT1JZMF9MT1dfREVDT0RFX0FERFJFU1M7CisJCWNhc2UgUENJX1JFR0lPTjE6CXJldHVybiBQQ0lfMU1FTU9SWTFfTE9XX0RFQ09ERV9BRERSRVNTOworCQljYXNlIFBDSV9SRUdJT04yOglyZXR1cm4gUENJXzFNRU1PUlkyX0xPV19ERUNPREVfQUREUkVTUzsKKwkJY2FzZSBQQ0lfUkVHSU9OMzoJcmV0dXJuIFBDSV8xTUVNT1JZM19MT1dfREVDT0RFX0FERFJFU1M7CisJICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFBDSV8wTUVNT1JZMF9MT1dfREVDT0RFX0FERFJFU1M7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGNpR2V0UmVtYXBPZmZzZXQoUENJX0hPU1QgaG9zdCwgUENJX1JFR0lPTiByZWdpb24pCit7CisgICAgc3dpdGNoIChob3N0KQorICAgIHsKKwljYXNlIFBDSV9IT1NUMDoKKwkgICAgc3dpdGNoKHJlZ2lvbikgeworCQljYXNlIFBDSV9JTzoJCXJldHVybiBQQ0lfMElfT19BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04wOglyZXR1cm4gUENJXzBNRU1PUlkwX0FERFJFU1NfUkVNQVA7CisJCWNhc2UgUENJX1JFR0lPTjE6CXJldHVybiBQQ0lfME1FTU9SWTFfQUREUkVTU19SRU1BUDsKKwkJY2FzZSBQQ0lfUkVHSU9OMjoJcmV0dXJuIFBDSV8wTUVNT1JZMl9BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04zOglyZXR1cm4gUENJXzBNRU1PUlkzX0FERFJFU1NfUkVNQVA7CisJICAgIH0KKwljYXNlIFBDSV9IT1NUMToKKwkgICAgc3dpdGNoKHJlZ2lvbikgeworCQljYXNlIFBDSV9JTzoJCXJldHVybiBQQ0lfMUlfT19BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04wOglyZXR1cm4gUENJXzFNRU1PUlkwX0FERFJFU1NfUkVNQVA7CisJCWNhc2UgUENJX1JFR0lPTjE6CXJldHVybiBQQ0lfMU1FTU9SWTFfQUREUkVTU19SRU1BUDsKKwkJY2FzZSBQQ0lfUkVHSU9OMjoJcmV0dXJuIFBDSV8xTUVNT1JZMl9BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04zOglyZXR1cm4gUENJXzFNRU1PUlkzX0FERFJFU1NfUkVNQVA7CisJICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFBDSV8wTUVNT1JZMF9BRERSRVNTX1JFTUFQOworfQorCitib29sIHBjaU1hcFNwYWNlKFBDSV9IT1NUIGhvc3QsIFBDSV9SRUdJT04gcmVnaW9uLCB1bnNpZ25lZCBpbnQgcmVtYXBCYXNlLCB1bnNpZ25lZCBpbnQgYmFua0Jhc2UsdW5zaWduZWQgaW50IGJhbmtMZW5ndGgpCit7CisgICAgdW5zaWduZWQgaW50IGxvdz0weGZmZjsKKyAgICB1bnNpZ25lZCBpbnQgaGlnaD0weDA7CisgICAgdW5zaWduZWQgaW50IHJlZ09mZnNldD1wY2lHZXRSZWdPZmZzZXQoaG9zdCwgcmVnaW9uKTsKKyAgICB1bnNpZ25lZCBpbnQgcmVtYXBPZmZzZXQ9cGNpR2V0UmVtYXBPZmZzZXQoaG9zdCwgcmVnaW9uKTsKKworICAgIGlmKGJhbmtMZW5ndGghPTApIHsKKwlsb3cgPSAoYmFua0Jhc2UgPj4gMjApICYgMHhmZmY7CisJaGlnaD0oKGJhbmtCYXNlK2JhbmtMZW5ndGgpPj4yMCktMTsKKyAgICB9CisKKyAgICBHVF9SRUdfV1JJVEUocmVnT2Zmc2V0LCBsb3cgfCAoMTw8MjQpKTsJLyogbm8gc3dhcHBpbmcgKi8KKyAgICBHVF9SRUdfV1JJVEUocmVnT2Zmc2V0KzgsIGhpZ2gpOworCisgICAgaWYoYmFua0xlbmd0aCE9MCkgewkvKiBtdXN0IGRvIEFGVEVSIHdyaXRpbmcgbWFwcyAqLworCUdUX1JFR19XUklURShyZW1hcE9mZnNldCwgcmVtYXBCYXNlPj4yMCk7CS8qIHNvcnJ5LCAzMiBiaXRzIG9ubHkuCisJCQkJCQkJICAgZG9udCBzdXBwb3J0IHVwcGVyIDMyCisJCQkJCQkJICAgaW4gdGhpcyBkcml2ZXIgKi8KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3Vuc2lnbmVkIGludCBwY2lHZXRTcGFjZUJhc2UoUENJX0hPU1QgaG9zdCwgUENJX1JFR0lPTiByZWdpb24pCit7CisgICAgdW5zaWduZWQgaW50IGxvdzsKKyAgICB1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0PXBjaUdldFJlZ09mZnNldChob3N0LCByZWdpb24pOworICAgIEdUX1JFR19SRUFEKHJlZ09mZnNldCwmbG93KTsKKyAgICByZXR1cm4gKGxvdyYweGZmZik8PDIwOworfQorCit1bnNpZ25lZCBpbnQgcGNpR2V0U3BhY2VTaXplKFBDSV9IT1NUIGhvc3QsIFBDSV9SRUdJT04gcmVnaW9uKQoreworICAgIHVuc2lnbmVkIGludCBsb3csaGlnaDsKKyAgICB1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0PXBjaUdldFJlZ09mZnNldChob3N0LCByZWdpb24pOworICAgIEdUX1JFR19SRUFEKHJlZ09mZnNldCwmbG93KTsKKyAgICBHVF9SRUdfUkVBRChyZWdPZmZzZXQrOCwmaGlnaCk7CisgICAgaGlnaCY9MHhmZmY7CisgICAgbG93Jj0weGZmZjsKKyAgICBpZihoaWdoPD1sb3cpIHJldHVybiAwOworICAgIHJldHVybiAoaGlnaCsxLWxvdyk8PDIwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpTWFwTWVtb3J5QmFuayAtIE1hcHMgUENJX2hvc3QgbWVtb3J5IGJhbmsgImJhbmsiIGZvciB0aGUgc2xhdmUuCisqCisqIElucHV0czogYmFzZSBhbmQgc2l6ZSBvZiBQQ0kgU0NTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBjaU1hcE1lbW9yeUJhbmsoUENJX0hPU1QgaG9zdCwgTUVNT1JZX0JBTksgYmFuaywgdW5zaWduZWQgaW50IHBjaURyYW1CYXNlLHVuc2lnbmVkIGludCBwY2lEcmFtU2l6ZSkKK3sKKyAgCXBjaURyYW1CYXNlID0gcGNpRHJhbUJhc2UgJiAweGZmZmZmMDAwOworICAgIHBjaURyYW1CYXNlID0gcGNpRHJhbUJhc2UgfCAocGNpUmVhZENvbmZpZ1JlZyhob3N0LAorICAgICAgICBQQ0lfU0NTXzBfQkFTRV9BRERSRVNTICsgNCpiYW5rLFNFTEYpICYgMHgwMDAwMGZmZik7CisgICAgcGNpV3JpdGVDb25maWdSZWcoaG9zdCxQQ0lfU0NTXzBfQkFTRV9BRERSRVNTICsgNCpiYW5rLFNFTEYscGNpRHJhbUJhc2UpOworICAgIGlmKHBjaURyYW1TaXplID09IDApCisgICAgICAgIHBjaURyYW1TaXplICsrOworICAgIEdUX1JFR19XUklURShwY2lfc2NzX2Jhbmtfc2l6ZVtob3N0XVtiYW5rXSwgcGNpRHJhbVNpemUtMSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaVNldFJlZ2lvbkZlYXR1cmVzIC0gVGhpcyBmdW5jdGlvbiBtb2RpZnlzIG9uZSBvZiB0aGUgOCByZWdpb25zIHdpdGgKKyogICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSBiaXRzIGdpdmVuIGFzIGFuIGlucHV0LgorKiAgICAgICAgICAgICAgICAgICAgICAgLSBCZSBhZHZpc2VkIHRvIGNoZWNrIHRoZSBzcGVjIGJlZm9yZSBtb2RpZnlpbmcgdGhlbS4KKyogSW5wdXRzOiBQQ0lfUFJPVEVDVF9SRUdJT04gcmVnaW9uIC0gb25lIG9mIHRoZSBlaWdodCByZWdpb25zLgorKiAgICAgICAgIHVuc2lnbmVkIGludCBmZWF0dXJlcyAtIFNlZSBmaWxlOiBwY2kuaCB0aGVyZSBhcmUgZGVmaW50aW9uIGZvciB0aG9zZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiBmZWF0dXJlcy4KKyogICAgICAgICB1bnNpZ25lZCBpbnQgYmFzZUFkZHJlc3MgLSBUaGUgcmVnaW9uIGJhc2UgQWRkcmVzcy4KKyogICAgICAgICB1bnNpZ25lZCBpbnQgdG9wQWRkcmVzcyAtIFRoZSByZWdpb24gdG9wIEFkZHJlc3MuCisqIFJldHVybnM6IGZhbHNlIGlmIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBlcnJvbmVvdXMgdHJ1ZSBvdGhlcndpc2UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHBjaVNldFJlZ2lvbkZlYXR1cmVzKFBDSV9IT1NUIGhvc3QsIFBDSV9BQ0NFU1NfUkVHSU9OUyByZWdpb24sdW5zaWduZWQgaW50IGZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJhc2VBZGRyZXNzLHVuc2lnbmVkIGludCByZWdpb25MZW5ndGgpCit7CisgICAgdW5zaWduZWQgaW50IGFjY2Vzc0xvdzsKKyAgICB1bnNpZ25lZCBpbnQgYWNjZXNzSGlnaDsKKyAgICB1bnNpZ25lZCBpbnQgYWNjZXNzVG9wID0gYmFzZUFkZHJlc3MgKyByZWdpb25MZW5ndGg7CisKKyAgICBpZihyZWdpb25MZW5ndGggPT0gMCkgLyogY2xvc2UgdGhlIHJlZ2lvbi4gKi8KKyAgICB7CisgICAgICAgIHBjaURpc2FibGVBY2Nlc3NSZWdpb24oaG9zdCwgcmVnaW9uKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8qIGJhc2UgQWRkcmVzcyBpcyBzdG9yZSBpcyBiaXRzIFsxMTowXSAqLworICAgIGFjY2Vzc0xvdyA9IChiYXNlQWRkcmVzcyAmIDB4ZmZmMDAwMDApID4+IDIwOworICAgIC8qIEFsbCB0aGUgZmVhdHVyZXMgYXJlIHVwZGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGRlZmluZXMgaW4gcGNpLmggKHRvIGJlIG9uCisgICAgICAgdGhlIHNhZmUgc2lkZSB3ZSBkaXNhYmxlIGJpdHM6IFsxMTowXSAqLworICAgIGFjY2Vzc0xvdyA9IGFjY2Vzc0xvdyB8IChmZWF0dXJlcyAmIDB4ZmZmZmYwMDApOworICAgIC8qIHdyaXRlIHRvIHRoZSBMb3cgQWNjZXNzIFJlZ2lvbiByZWdpc3RlciAqLworICAgIEdUX1JFR19XUklURSggcGNpX2FjY2Vzc19jb250cm9sX2Jhc2VfMF9sb3dbaG9zdF0gKyAweDEwKnJlZ2lvbixhY2Nlc3NMb3cpOworCisgICAgYWNjZXNzSGlnaCA9IChhY2Nlc3NUb3AgJiAweGZmZjAwMDAwKSA+PiAyMDsKKworICAgIC8qIHdyaXRlIHRvIHRoZSBIaWdoIEFjY2VzcyBSZWdpb24gcmVnaXN0ZXIgKi8KKyAgICBHVF9SRUdfV1JJVEUocGNpX2FjY2Vzc19jb250cm9sX3RvcF8wW2hvc3RdICsgMHgxMCpyZWdpb24sYWNjZXNzSGlnaCAtIDEpOworICAgIHJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpRGlzYWJsZUFjY2Vzc1JlZ2lvbiAtIERpc2FibGUgVGhlIGdpdmVuIFJlZ2lvbiBieSB3cml0aW5nIE1BWCBzaXplCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaXRzIGxvdyBBZGRyZXNzIGFuZCBNSU4gc2l6ZSB0byBpdHMgaGlnaCBBZGRyZXNzLgorKgorKiBJbnB1dHM6ICAgUENJX0FDQ0VTU19SRUdJT05TIHJlZ2lvbiAtIFRoZSByZWdpb24gd2UgdG8gYmUgRGlzYWJsZWQuCisqIFJldHVybnM6ICBOL0EuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBjaURpc2FibGVBY2Nlc3NSZWdpb24oUENJX0hPU1QgaG9zdCwgUENJX0FDQ0VTU19SRUdJT05TIHJlZ2lvbikKK3sKKyAgICAvKiB3cml0aW5nIGJhY2sgdGhlIHJlZ2lzdGVycyBkZWZhdWx0IHZhbHVlcy4gKi8KKyAgICBHVF9SRUdfV1JJVEUocGNpX2FjY2Vzc19jb250cm9sX2Jhc2VfMF9sb3dbaG9zdF0gKyAweDEwKnJlZ2lvbiwweDAxMDAxZmZmKTsKKyAgICBHVF9SRUdfV1JJVEUocGNpX2FjY2Vzc19jb250cm9sX3RvcF8wW2hvc3RdICsgMHgxMCpyZWdpb24sMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lBcmJpdGVyRW5hYmxlIC0gRW5hYmxlcyBQQ0ktMGBzIEFyYml0cmF0aW9uIG1lY2hhbmlzbS4KKyoKKyogSW5wdXRzOiAgIE4vQQorKiBSZXR1cm5zOiAgdHJ1ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgcGNpQXJiaXRlckVuYWJsZShQQ0lfSE9TVCBob3N0KQoreworICAgIHVuc2lnbmVkIGludCByZWdEYXRhOworCisgICAgR1RfUkVHX1JFQUQocGNpX2FyYml0ZXJfY29udHJvbFtob3N0XSwmcmVnRGF0YSk7CisgICAgR1RfUkVHX1dSSVRFKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0scmVnRGF0YSB8IEJJVDMxKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaUFyYml0ZXJEaXNhYmxlIC0gRGlzYWJsZSBQQ0ktMGBzIEFyYml0cmF0aW9uIG1lY2hhbmlzbS4KKyoKKyogSW5wdXRzOiAgIE4vQQorKiBSZXR1cm5zOiAgdHJ1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBwY2lBcmJpdGVyRGlzYWJsZShQQ0lfSE9TVCBob3N0KQoreworICAgIHVuc2lnbmVkIGludCByZWdEYXRhOworCisgICAgR1RfUkVHX1JFQUQocGNpX2FyYml0ZXJfY29udHJvbFtob3N0XSwmcmVnRGF0YSk7CisgICAgR1RfUkVHX1dSSVRFKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0scmVnRGF0YSAmIDB4N2ZmZmZmZmYpOworICAgIHJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpUGFya2luZ0Rpc2FibGUgLSBQYXJrIG9uIGxhc3Qgb3B0aW9uIGRpc2FibGUsIHdpdGggdGhpcyBmdW5jdGlvbiB5b3UgY2FuCisqICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUgdGhlIHBhcmsgb24gbGFzdCBtZWNoYW5pc20gZm9yIGVhY2ggYWdlbnQuCisqICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGluZyB0aGlzIG9wdGlvbiBmb3IgYWxsIGFnZW50cyByZXN1bHRzIHBhcmtpbmcKKyogICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGludGVybmFsIG1hc3Rlci4KKyoKKyogSW5wdXRzOiBQQ0lfQUdFTlRfUEFSSyBpbnRlcm5hbEFnZW50IC0gIHBhcmtpbmcgRGlzYWJsZSBmb3IgaW50ZXJuYWwgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDAgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzAgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDEgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzEgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDIgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzIgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDMgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzMgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDQgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzQgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDUgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzUgYWdlbnQuCisqIFJldHVybnM6ICB0cnVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHBjaVBhcmtpbmdEaXNhYmxlKFBDSV9IT1NUIGhvc3QsIFBDSV9BR0VOVF9QQVJLIGludGVybmFsQWdlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQUdFTlRfUEFSSyBleHRlcm5hbEFnZW50MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDIsCisgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQUdFTlRfUEFSSyBleHRlcm5hbEFnZW50MywKKyAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDUpCit7CisgICAgdW5zaWduZWQgaW50IHJlZ0RhdGE7CisgICAgdW5zaWduZWQgaW50IHdyaXRlRGF0YTsKKworICAgIEdUX1JFR19SRUFEKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0sJnJlZ0RhdGEpOworICAgIHdyaXRlRGF0YSA9IChpbnRlcm5hbEFnZW50IDw8IDE0KSArIChleHRlcm5hbEFnZW50MCA8PCAxNSkgKyAgICAgXAorICAgICAgICAgICAgICAgIChleHRlcm5hbEFnZW50MSA8PCAxNikgKyAoZXh0ZXJuYWxBZ2VudDIgPDwgMTcpICsgICAgXAorICAgICAgICAgICAgICAgIChleHRlcm5hbEFnZW50MyA8PCAxOCkgKyAoZXh0ZXJuYWxBZ2VudDQgPDwgMTkpICsgICAgXAorICAgICAgICAgICAgICAgIChleHRlcm5hbEFnZW50NSA8PCAyMCk7CisgICAgcmVnRGF0YSA9IChyZWdEYXRhICYgfigweDdmPDwxNCkpIHwgd3JpdGVEYXRhOworICAgIEdUX1JFR19XUklURShwY2lfYXJiaXRlcl9jb250cm9sW2hvc3RdLHJlZ0RhdGEpOworICAgIHJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpU2V0UmVnaW9uU25vb3BNb2RlIC0gVGhpcyBmdW5jdGlvbiBtb2RpZnlzIG9uZSBvZiB0aGUgNCByZWdpb25zIHdoaWNoCisqICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyBDYWNoZSBDb2hlcmVuY3kgaW4gdGhlIFBDSV9uIGludGVyZmFjZS4KKyogSW5wdXRzOiByZWdpb24gLSBPbmUgb2YgdGhlIGZvdXIgcmVnaW9ucy4KKyogICAgICAgICBzbm9vcFR5cGUgLSBUaGVyZSBpcyBmb3VyIG9wdGlvbmFsIFR5cGVzOgorKiAgICAgICAgICAgICAgICAgICAgICAgIDEuIE5vIFNub29wLgorKiAgICAgICAgICAgICAgICAgICAgICAgIDIuIFNub29wIHRvIFdUIHJlZ2lvbi4KKyogICAgICAgICAgICAgICAgICAgICAgICAzLiBTbm9vcCB0byBXQiByZWdpb24uCisqICAgICAgICAgICAgICAgICAgICAgICAgNC4gU25vb3AgJiBJbnZhbGlkYXRlIHRvIFdCIHJlZ2lvbi4KKyogICAgICAgICBiYXNlQWRkcmVzcyAtIEJhc2UgQWRkcmVzcyBvZiB0aGlzIHJlZ2lvbi4KKyogICAgICAgICByZWdpb25MZW5ndGggLSBSZWdpb24gbGVuZ3RoLgorKiBSZXR1cm5zOiBmYWxzZSBpZiBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgd3Jvbmcgb3RoZXJ3aXNlIHJldHVybiB0cnVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBwY2lTZXRSZWdpb25Tbm9vcE1vZGUoUENJX0hPU1QgaG9zdCwgUENJX1NOT09QX1JFR0lPTiByZWdpb24sUENJX1NOT09QX1RZUEUgc25vb3BUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVnaW9uTGVuZ3RoKQoreworICAgIHVuc2lnbmVkIGludCBzbm9vcFhiYXNlQWRkcmVzczsKKyAgICB1bnNpZ25lZCBpbnQgc25vb3BYdG9wQWRkcmVzczsKKyAgICB1bnNpZ25lZCBpbnQgZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgc25vb3BIaWdoID0gYmFzZUFkZHJlc3MgKyByZWdpb25MZW5ndGg7CisKKyAgICBpZiggKHJlZ2lvbiA+IFBDSV9TTk9PUF9SRUdJT04zKSB8fCAoc25vb3BUeXBlID4gUENJX1NOT09QX1dCKSApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzbm9vcFhiYXNlQWRkcmVzcyA9IHBjaV9zbm9vcF9jb250cm9sX2Jhc2VfMF9sb3dbaG9zdF0gKyAweDEwICogcmVnaW9uOworICAgIHNub29wWHRvcEFkZHJlc3MgPSBwY2lfc25vb3BfY29udHJvbF90b3BfMFtob3N0XSArIDB4MTAgKiByZWdpb247CisgICAgaWYocmVnaW9uTGVuZ3RoID09IDApIC8qIGNsb3NpbmcgdGhlIHJlZ2lvbiAqLworICAgIHsKKyAgICAgICAgR1RfUkVHX1dSSVRFKHNub29wWGJhc2VBZGRyZXNzLDB4MDAwMGZmZmYpOworICAgICAgICBHVF9SRUdfV1JJVEUoc25vb3BYdG9wQWRkcmVzcywwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJhc2VBZGRyZXNzID0gYmFzZUFkZHJlc3MgJiAweGZmZjAwMDAwOyAvKiBHcmFudWxhcml0eSBvZiAxTUJ5dGUgKi8KKyAgICBkYXRhID0gKGJhc2VBZGRyZXNzID4+IDIwKSB8IHNub29wVHlwZSA8PCAxMjsKKyAgICBHVF9SRUdfV1JJVEUoc25vb3BYYmFzZUFkZHJlc3MsZGF0YSk7CisgICAgc25vb3BIaWdoID0gKHNub29wSGlnaCAmIDB4ZmZmMDAwMDApID4+IDIwOworICAgIEdUX1JFR19XUklURShzbm9vcFh0b3BBZGRyZXNzLHNub29wSGlnaCAtIDEpOworICAgIHJldHVybiB0cnVlOworfQorCisvKgorICoKKyAqLworCitzdGF0aWMgaW50IGd0X3JlYWRfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQlwY2lfZGV2X3QgZGV2LAorCQkJCWludCBvZmZzZXQsIHUzMiogdmFsdWUpCit7CisgICAgKnZhbHVlID0gcGNpUmVhZENvbmZpZ1JlZygoUENJX0hPU1QpIGhvc2UtPmNmZ19hZGRyLCBvZmZzZXQsIFBDSV9ERVYoZGV2KSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Rfd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgcGNpX2Rldl90IGRldiwKKwkJCQkgaW50IG9mZnNldCwgdTMyIHZhbHVlKQoreworICAgIHBjaVdyaXRlQ29uZmlnUmVnKChQQ0lfSE9TVClob3NlLT5jZmdfYWRkciwgb2Zmc2V0LCBQQ0lfREVWKGRldiksIHZhbHVlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqCisgKi8KKworc3RhdGljIHZvaWQgZ3Rfc2V0dXBfaWRlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCSBwY2lfZGV2X3QgZGV2LCBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqZW50cnkpCit7CisgICAgc3RhdGljIGNvbnN0IGludCBpZGVfYmFyW109ezgsNCw4LDQsMCwwfTsKKyAgICB1MzIgYmFyX3Jlc3BvbnNlLCBiYXJfdmFsdWU7CisgICAgaW50IGJhcjsKKworICAgIGZvciAoYmFyPTA7IGJhcjw2OyBiYXIrKykKKyAgICB7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCArIGJhcio0LCAweDApOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCArIGJhcio0LCAmYmFyX3Jlc3BvbnNlKTsKKworCXBjaWF1dG9fcmVnaW9uX2FsbG9jYXRlKGJhcl9yZXNwb25zZSAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8gPworCQkJCWhvc2UtPnBjaV9pbyA6IGhvc2UtPnBjaV9tZW0sIGlkZV9iYXJbYmFyXSwgJmJhcl92YWx1ZSk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX0JBU0VfQUREUkVTU18wICsgYmFyKjQsIGJhcl92YWx1ZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBndF9maXh1cF9pcnEoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2KQoreworICAgIHVuc2lnbmVkIGNoYXIgcGluLCBpcnE7CisKKyAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKKworICAgIGlmKHBpbiA9PSAxKSB7CS8qIG9ubHkgYWxsb3cgSU5UIEEgKi8KKwlpcnEgPSBwY2lfaXJxX3N3aXp6bGVbKFBDSV9IT1NUKWhvc2UtPmNmZ19hZGRyXVtQQ0lfREVWKGRldildOworCWlmKGlycSkKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOworICAgIH0KK30KKworc3RydWN0IHBjaV9jb25maWdfdGFibGUgZ3RfY29uZmlnX3RhYmxlW10gPSB7CisgICAgeyBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUsCisgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBndF9zZXR1cF9pZGV9LAorCisgICAgeyB9Cit9OworCitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpMF9ob3NlID0geworICAgIGZpeHVwX2lycTogZ3RfZml4dXBfaXJxLAorICAgIGNvbmZpZ190YWJsZTogZ3RfY29uZmlnX3RhYmxlLAorfTsKKworc3RydWN0IHBjaV9jb250cm9sbGVyIHBjaTFfaG9zZSA9IHsKKyAgICBmaXh1cF9pcnE6IGd0X2ZpeHVwX2lycSwKKyAgICBjb25maWdfdGFibGU6IGd0X2NvbmZpZ190YWJsZSwKK307CisKK3ZvaWQKK3BjaV9pbml0KHZvaWQpCit7CisgICAgdW5zaWduZWQgaW50IGNvbW1hbmQ7CisKKyAgICBwY2kwX2hvc2UuZmlyc3RfYnVzbm8gPSAwOworICAgIHBjaTBfaG9zZS5sYXN0X2J1c25vID0gMHhmZjsKKworICAgIC8qIFBDSSBtZW1vcnkgc3BhY2UgKi8KKyAgICBwY2lfc2V0X3JlZ2lvbihwY2kwX2hvc2UucmVnaW9ucyArIDAsCisJCSAgIENGR19QQ0kwXzBfTUVNX1NQQUNFLAorCQkgICBDRkdfUENJMF8wX01FTV9TUEFDRSwKKwkJICAgQ0ZHX1BDSTBfTUVNX1NJWkUsCisJCSAgIFBDSV9SRUdJT05fTUVNKTsKKworICAgIC8qIFBDSSBJL08gc3BhY2UgKi8KKyAgICBwY2lfc2V0X3JlZ2lvbihwY2kwX2hvc2UucmVnaW9ucyArIDEsCisJCSAgIENGR19QQ0kwX0lPX1NQQUNFX1BDSSwKKwkJICAgQ0ZHX1BDSTBfSU9fU1BBQ0UsCisJCSAgIENGR19QQ0kwX0lPX1NJWkUsCisJCSAgIFBDSV9SRUdJT05fSU8pOworCisgICAgcGNpX3NldF9vcHMoJnBjaTBfaG9zZSwKKwkJcGNpX2hvc2VfcmVhZF9jb25maWdfYnl0ZV92aWFfZHdvcmQsCisJCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmRfdmlhX2R3b3JkLAorCQlndF9yZWFkX2NvbmZpZ19kd29yZCwKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGVfdmlhX2R3b3JkLAorCQlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZF92aWFfZHdvcmQsCisJCWd0X3dyaXRlX2NvbmZpZ19kd29yZCk7CisKKyAgICBwY2kwX2hvc2UucmVnaW9uX2NvdW50ID0gMjsKKworICAgIHBjaTBfaG9zZS5jZmdfYWRkciA9ICh1bnNpZ25lZCBpbnQqKSBQQ0lfSE9TVDA7CisKKyAgICBwY2lfcmVnaXN0ZXJfaG9zZSgmcGNpMF9ob3NlKTsKKworICAgIHBjaUFyYml0ZXJFbmFibGUoUENJX0hPU1QwKTsKKyAgICBwY2lQYXJraW5nRGlzYWJsZShQQ0lfSE9TVDAsMSwxLDEsMSwxLDEsMSk7CisKKyAgICBjb21tYW5kID0gcGNpUmVhZENvbmZpZ1JlZyhQQ0lfSE9TVDAsIFBDSV9DT01NQU5ELCBTRUxGKTsKKyAgICBjb21tYW5kIHw9IFBDSV9DT01NQU5EX01BU1RFUjsKKyAgICBwY2lXcml0ZUNvbmZpZ1JlZyhQQ0lfSE9TVDAsIFBDSV9DT01NQU5ELCBTRUxGLCBjb21tYW5kKTsKKworICAgIHBjaTBfaG9zZS5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2NhbigmcGNpMF9ob3NlKTsKKworICAgIGNvbW1hbmQgPSBwY2lSZWFkQ29uZmlnUmVnKFBDSV9IT1NUMCwgUENJX0NPTU1BTkQsIFNFTEYpOworICAgIGNvbW1hbmQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOworICAgIHBjaVdyaXRlQ29uZmlnUmVnKFBDSV9IT1NUMCwgUENJX0NPTU1BTkQsIFNFTEYsIGNvbW1hbmQpOworCisgICAgcGNpMV9ob3NlLmZpcnN0X2J1c25vID0gcGNpMF9ob3NlLmxhc3RfYnVzbm8gKyAxOworICAgIHBjaTFfaG9zZS5sYXN0X2J1c25vID0gMHhmZjsKKworICAgIC8qIFBDSSBtZW1vcnkgc3BhY2UgKi8KKyAgICBwY2lfc2V0X3JlZ2lvbihwY2kxX2hvc2UucmVnaW9ucyArIDAsCisJCSAgIENGR19QQ0kxXzBfTUVNX1NQQUNFLAorCQkgICBDRkdfUENJMV8wX01FTV9TUEFDRSwKKwkJICAgQ0ZHX1BDSTFfTUVNX1NJWkUsCisJCSAgIFBDSV9SRUdJT05fTUVNKTsKKworICAgIC8qIFBDSSBJL08gc3BhY2UgKi8KKyAgICBwY2lfc2V0X3JlZ2lvbihwY2kxX2hvc2UucmVnaW9ucyArIDEsCisJCSAgIENGR19QQ0kxX0lPX1NQQUNFX1BDSSwKKwkJICAgQ0ZHX1BDSTFfSU9fU1BBQ0UsCisJCSAgIENGR19QQ0kxX0lPX1NJWkUsCisJCSAgIFBDSV9SRUdJT05fSU8pOworCisgICAgcGNpX3NldF9vcHMoJnBjaTFfaG9zZSwKKwkJcGNpX2hvc2VfcmVhZF9jb25maWdfYnl0ZV92aWFfZHdvcmQsCisJCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmRfdmlhX2R3b3JkLAorCQlndF9yZWFkX2NvbmZpZ19kd29yZCwKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGVfdmlhX2R3b3JkLAorCQlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZF92aWFfZHdvcmQsCisJCWd0X3dyaXRlX2NvbmZpZ19kd29yZCk7CisKKyAgICBwY2kxX2hvc2UucmVnaW9uX2NvdW50ID0gMjsKKworICAgIHBjaTFfaG9zZS5jZmdfYWRkciA9ICh1bnNpZ25lZCBpbnQqKSBQQ0lfSE9TVDE7CisKKyAgICBwY2lfcmVnaXN0ZXJfaG9zZSgmcGNpMV9ob3NlKTsKKworICAgIHBjaUFyYml0ZXJFbmFibGUoUENJX0hPU1QxKTsKKyAgICBwY2lQYXJraW5nRGlzYWJsZShQQ0lfSE9TVDEsMSwxLDEsMSwxLDEsMSk7CisKKyAgICBjb21tYW5kID0gcGNpUmVhZENvbmZpZ1JlZyhQQ0lfSE9TVDEsIFBDSV9DT01NQU5ELCBTRUxGKTsKKyAgICBjb21tYW5kIHw9IFBDSV9DT01NQU5EX01BU1RFUjsKKyAgICBwY2lXcml0ZUNvbmZpZ1JlZyhQQ0lfSE9TVDEsIFBDSV9DT01NQU5ELCBTRUxGLCBjb21tYW5kKTsKKworICAgIHBjaTFfaG9zZS5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2NhbigmcGNpMV9ob3NlKTsKKworICAgIGNvbW1hbmQgPSBwY2lSZWFkQ29uZmlnUmVnKFBDSV9IT1NUMSwgUENJX0NPTU1BTkQsIFNFTEYpOworICAgIGNvbW1hbmQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOworICAgIHBjaVdyaXRlQ29uZmlnUmVnKFBDSV9IT1NUMSwgUENJX0NPTU1BTkQsIFNFTEYsIGNvbW1hbmQpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXZiNjQyNjAvc2RyYW1faW5pdC5jIGIvYm9hcmQvZXZiNjQyNjAvc2RyYW1faW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOThlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9ldmI2NDI2MC9zZHJhbV9pbml0LmMKQEAgLTAsMCArMSw2MjkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIHNkcmFtX2luaXQuYyAtIGF1dG9tYXRpYyBtZW1vcnkgc2l6aW5nICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDw3NHh4Xzd4eC5oPgorI2luY2x1ZGUgPGdhbGlsZW8vbWVtb3J5Lmg+CisjaW5jbHVkZSA8Z2FsaWxlby9wY2kuaD4KKyNpbmNsdWRlIDxnYWxpbGVvL2d0NjQyNjBSLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisKKyNpbmNsdWRlICJldGguaCIKKyNpbmNsdWRlICJtcHNjLmgiCisjaW5jbHVkZSAiaTJjLmgiCisjaW5jbHVkZSAiNjQyNjAuaCIKKworLyogI2RlZmluZQlERUJVRyAqLworI2RlZmluZQlNQVBfUENJCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEUCh4KSB4CisjZWxzZQorI2RlZmluZSBEUCh4KQorI2VuZGlmCisKKyNkZWZpbmUgR0IgICAgICAgICAoMSA8PCAzMCkKKworLyogc3RydWN0dXJlIHRvIHN0b3JlIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiBhYm91dCBhbiBzZHJhbSBiYW5rICovCit0eXBlZGVmIHN0cnVjdCBzZHJhbV9pbmZvIHsKKwl1Y2hhciBkcmJfc2l6ZTsKKwl1Y2hhciByZWdpc3RlcmVkLCBlY2M7CisJdWNoYXIgdHBhcjsKKwl1Y2hhciB0cmFzX2Nsb2NrczsKKwl1Y2hhciBidXJzdF9sZW47CisJdWNoYXIgYmFua3MsIHNsb3Q7CisJaW50IHNpemU7CS8qIGRldGVjdGVkIHNpemUsIG5vdCBmcm9tIEkyQyBidXQgZnJvbSBkcmFtX3NpemUoKSAqLworfSBzZHJhbV9pbmZvX3Q7CisKKyNpZmRlZiBERUJVRwordm9pZCBkdW1wX2RpbW1faW5mbyhzdHJ1Y3Qgc2RyYW1faW5mbyAqZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZWNjX2xlZ2VuZFtdPXsiIiwiIFBhcml0eSIsIiBFQ0MifTsKKyAgICBwcmludGYoImRpbW0lcyAlc0RSQU06ICVkTWlieXRlczpcbiIsCisJICAgIGVjY19sZWdlbmRbZC0+ZWNjXSwKKwkgICAgZC0+cmVnaXN0ZXJlZD8iUiI6IiIsCisJICAgIChkLT5zaXplPj4yMCkpOworICAgIHByaW50ZigiICBkcmI9JWQgdHBhcj0lZCB0cmFzPSVkIGJ1cnN0bGVuPSVkIGJhbmtzPSVkIHNsb3Q9JWRcbiIsCisJICAgIGQtPmRyYl9zaXplLCBkLT50cGFyLCBkLT50cmFzX2Nsb2NrcywgZC0+YnVyc3RfbGVuLAorCSAgICBkLT5iYW5rcywgZC0+c2xvdCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorbWVtb3J5X21hcF9iYW5rKHVuc2lnbmVkIGludCBiYW5rTm8sCisJCXVuc2lnbmVkIGludCBiYW5rQmFzZSwKKwkJdW5zaWduZWQgaW50IGJhbmtMZW5ndGgpCit7CisjaWZkZWYgREVCVUcKKwlpZiAoYmFua0xlbmd0aCA+IDApIHsKKwkJcHJpbnRmKCJtYXBwaW5nIGJhbmsgJWQgYXQgJTA4eCAtICUwOHhcbiIsCisJCSAgICAgICBiYW5rTm8sIGJhbmtCYXNlLCBiYW5rQmFzZSArIGJhbmtMZW5ndGggLSAxKTsKKwl9IGVsc2UgeworCQlwcmludGYoInVubWFwcGluZyBiYW5rICVkXG4iLCBiYW5rTm8pOworCX0KKyNlbmRpZgorCisJbWVtb3J5TWFwQmFuayhiYW5rTm8sIGJhbmtCYXNlLCBiYW5rTGVuZ3RoKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgTUFQX1BDSQorc3RhdGljIGludAorbWVtb3J5X21hcF9iYW5rX3BjaSh1bnNpZ25lZCBpbnQgYmFua05vLAorCQl1bnNpZ25lZCBpbnQgYmFua0Jhc2UsCisJCXVuc2lnbmVkIGludCBiYW5rTGVuZ3RoKQoreworCVBDSV9IT1NUIGhvc3Q7CisJZm9yIChob3N0PVBDSV9IT1NUMDtob3N0PD1QQ0lfSE9TVDE7aG9zdCsrKSB7CisJCWNvbnN0IGludCBmZWF0dXJlcz0KKwkJCVBSRUZFVENIX0VOQUJMRSB8CisJCQlERUxBWUVEX1JFQURfRU5BQkxFIHwKKwkJCUFHR1JFU1NJVkVfUFJFRkVUQ0ggfAorCQkJUkVBRF9MSU5FX0FHR1JFU1NJVkVfUFJFRkVUQ0ggfAorCQkJUkVBRF9NVUxUSV9BR0dSRVNTSVZFX1BSRUZFVENIIHwKKwkJCU1BWF9CVVJTVF80IHwKKwkJCVBDSV9OT19TV0FQOworCisJCXBjaU1hcE1lbW9yeUJhbmsoaG9zdCwgYmFua05vLCBiYW5rQmFzZSwgYmFua0xlbmd0aCk7CisKKwkJcGNpU2V0UmVnaW9uU25vb3BNb2RlKGhvc3QsIGJhbmtObywgUENJX1NOT09QX1dCLCBiYW5rQmFzZSwKKwkJCQliYW5rTGVuZ3RoKTsKKworCQlwY2lTZXRSZWdpb25GZWF0dXJlcyhob3N0LCBiYW5rTm8sIGZlYXR1cmVzLCBiYW5rQmFzZSwgYmFua0xlbmd0aCk7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbXVjaCBvZiB0aGlzIGNvZGUgaXMgYmFzZWQgb24gKG9yIGlzKSB0aGUgY29kZSBpbiB0aGUgcGlwNDA1IHBvcnQgKi8KKy8qIHRoYW5rcyBnbyB0byB0aGUgYXV0aG9ycyBvZiBzYWlkIHBvcnQgLSBKb3NoICovCisKKworLyoKKyAqIHRyYW5zbGF0ZSBucy5ucy8xMCBjb2Rpbmcgb2YgU1BEIHRpbWluZyB2YWx1ZXMKKyAqIGludG8gMTAgcHMgdW5pdCB2YWx1ZXMKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAorTlMxMHRvMTBQUyh1bnNpZ25lZCBjaGFyIHNwZF9ieXRlKQoreworCXVuc2lnbmVkIHNob3J0IG5zLCBuczEwOworCisJLyogaXNvbGF0ZSB1cHBlciBuaWJibGUgKi8KKwlucyA9IChzcGRfYnl0ZSA+PiA0KSAmIDB4MEY7CisJLyogaXNvbGF0ZSBsb3dlciBuaWJibGUgKi8KKwluczEwID0gKHNwZF9ieXRlICYgMHgwRik7CisKKwlyZXR1cm4obnMqMTAwICsgbnMxMCoxMCk7Cit9CisKKy8qCisgKiB0cmFuc2xhdGUgbnMgY29kaW5nIG9mIFNQRCB0aW1pbmcgdmFsdWVzCisgKiBpbnRvIDEwIHBzIHVuaXQgdmFsdWVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQKK05TdG8xMFBTKHVuc2lnbmVkIGNoYXIgc3BkX2J5dGUpCit7CisJcmV0dXJuKHNwZF9ieXRlKjEwMCk7Cit9CisKKyNpZmRlZiBDT05GSUdfWlVNQV9WMgorc3RhdGljIGludAorY2hlY2tfZGltbSh1Y2hhciBzbG90LCBzZHJhbV9pbmZvX3QgKmluZm8pCit7CisgICAgICAgIC8qIGFzc3VtZSAyIGRpbW1zLCAyIGJhbmtzIGVhY2ggMjU2TSAtIHdlIGRvbnQgaGF2ZSBhbgorCSAqIGRpbW0gaTJjIHNvIHJlbHkgb24gdGhlIGRldGVjdGlvbiByb3V0aW5lcyBsYXRlciAqLworCisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisJaW5mby0+c2xvdCA9IHNsb3Q7CisJaW5mby0+YmFua3MgPSAyOwkvKiBEZXRlY3QgbGF0ZXIgKi8KKwkgICAgaW5mby0+cmVnaXN0ZXJlZCA9IDA7CisJaW5mby0+ZHJiX3NpemUgPSAzMjsJLyogMTYgLSAyNTZNQml0LCAzMiAtIDUxMk1CaXQKKwkJCQkgICBidXQgZG9lc24ndCBtYXR0ZXIsIGJvdGggZG8gc2FtZQorCQkJCSAgIHRoaW5nIGluIHNldHVwX3NkcmFtKCkgKi8KKwkgICAgaW5mby0+dHBhciA9IDM7CisJICAgIGluZm8tPnRyYXNfY2xvY2tzID0gNTsKKwkgICAgaW5mby0+YnVyc3RfbGVuID0gNDsKKyNpZmRlZiBDT05GSUdfRUNDCisJaW5mby0+ZWNjID0gMDsJCS8qIERldGVjdCBsYXRlciAqLworI2VuZGlmIC8qIENPTkZJR19FQ0MgKi8KKwlyZXR1cm4gMDsKK30KKworI2Vsc2UgLyogISBDT05GSUdfWlVNQV9WMiAqLworCisvKiBUaGlzIGNvZGUgcmVhZHMgdGhlIFNQRCBjaGlwIG9uIHRoZSBzZHJhbSBhbmQgcG9wdWxhdGVzCisgKiB0aGUgYXJyYXkgd2hpY2ggaXMgcGFzc2VkIGluIHdpdGggdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uICovCitzdGF0aWMgaW50CitjaGVja19kaW1tKHVjaGFyIHNsb3QsIHNkcmFtX2luZm9fdCAqaW5mbykKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwl1Y2hhciBhZGRyID0gc2xvdCA9PSAwID8gRElNTTBfSTJDX0FERFIgOiBESU1NMV9JMkNfQUREUjsKKwlpbnQgcmV0OworCXVjaGFyIHJvd3MsIGNvbHMsIHNkcmFtX2JhbmtzLCBzdXBwX2NhbCwgd2lkdGgsIGNhbF92YWw7CisJdWxvbmcgdG1lbWNsazsKKwl1Y2hhciB0cnBfY2xvY2tzLCB0cmNkX2Nsb2NrczsKKwl1Y2hhciBkYXRhWzEyOF07CisKKwlnZXRfY2xvY2tzICgpOworCisgCXRtZW1jbGsgPSAxMDAwMDAwMDAwIC8gKGdkLT5idXNfY2xrIC8gMTAwKTsgIC8qIGluIDEwIHBzIHVuaXRzICovCisKKyNpZmRlZiBDT05GSUdfRVZCNjQyNjBfNzUwQ1gKKwlpZiAoMCAhPSBzbG90KSB7CisJCXByaW50ZigiY2hlY2tfZGltbTogVGhlIEVWQi02NDI2MC03NTBDWCBvbmx5IGhhcyAxIERJTU0sIik7CisJCXByaW50ZigiICAgICAgICAgICAgY2FsbGVkIHdpdGggc2xvdD0lZCBpbnNldGFkIVxuIiwgc2xvdCk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCURQKHB1dHMoImJlZm9yZSBpMmMgcmVhZFxuIikpOworCisJcmV0ID0gaTJjX3JlYWQoYWRkciwgMCwgMTI4LCBkYXRhLCAwKTsKKworCURQKHB1dHMoImFmdGVyIGkyYyByZWFkXG4iKSk7CisKKwkvKiB6ZXJvIGFsbCB0aGUgdmFsdWVzICovCisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisJaWYgKHJldCkgeworCQlEUChwcmludGYoIk5vIERJTU0gaW4gc2xvdCAlZCBbZXJyID0gJXhdXG4iLCBzbG90LCByZXQpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZmlyc3QsIGRvIHNvbWUgc2FuaXR5IGNoZWNrcyAqLworCWlmIChkYXRhWzJdICE9IDB4NCkgeworCQlwcmludGYoIk5vdCBTRFJBTSBpbiBzbG90ICVkXG4iLCBzbG90KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZ2V0IHZhcmlvdXMgaW5mb3JtYXRpb24gKi8KKwlyb3dzID0gZGF0YVszXTsKKwljb2xzID0gZGF0YVs0XTsKKwlpbmZvLT5iYW5rcyA9IGRhdGFbNV07CisJc2RyYW1fYmFua3MgPSBkYXRhWzE3XTsKKwl3aWR0aCA9IGRhdGFbMTNdICYgMHg3ZjsKKworCURQKHByaW50Zigic2RyYW1fYmFua3M6ICVkLCBiYW5rczogJWRcbiIsIHNkcmFtX2JhbmtzLCBpbmZvLT5iYW5rcykpOworCisJLyogY2hlY2sgaWYgdGhlIG1lbW9yeSBpcyByZWdpc3RlcmVkICovCisJaWYgKGRhdGFbMjFdICYgKEJJVDEgfCBCSVQ0KSkKKwkJaW5mby0+cmVnaXN0ZXJlZCA9IDE7CisKKyNpZmRlZiBDT05GSUdfRUNDCisJLyogY2hlY2sgZm9yIEVDQy9wYXJpdHkgWzAgPSBub25lLCAxID0gcGFyaXR5LCAyID0gZWNjXSAqLworCWluZm8tPmVjYyA9IChkYXRhWzExXSAmIDIpID4+IDE7CisjZW5kaWYKKworCS8qIGJpdCAxIGlzIENMMiwgYml0IDIgaXMgQ0wzICovCisJc3VwcF9jYWwgPSAoZGF0YVsxOF0gJiAweDYpID4+IDE7CisKKwkvKiBjb21wdXRlIHRoZSByZWxldmFudCBjbG9jayB2YWx1ZXMgKi8KKwl0cnBfY2xvY2tzID0gKE5TdG8xMFBTKGRhdGFbMjddKSsodG1lbWNsay0xKSkgLyB0bWVtY2xrOworCXRyY2RfY2xvY2tzID0gKE5TdG8xMFBTKGRhdGFbMjldKSsodG1lbWNsay0xKSkgLyB0bWVtY2xrOworCWluZm8tPnRyYXNfY2xvY2tzID0gKE5TdG8xMFBTKGRhdGFbMzBdKSsodG1lbWNsay0xKSkgLyB0bWVtY2xrOworCisJRFAocHJpbnRmKCJ0cnAgPSAlZFxudHJjZF9jbG9ja3MgPSAlZFxudHJhc19jbG9ja3MgPSAlZFxuIiwKKwkJICB0cnBfY2xvY2tzLCB0cmNkX2Nsb2NrcywgaW5mby0+dHJhc19jbG9ja3MpKTsKKworCS8qIHRyeSBhIENBUyBsYXRlbmN5IG9mIDMgZmlyc3QuLi4gKi8KKwljYWxfdmFsID0gMDsKKwlpZiAoc3VwcF9jYWwgJiAzKSB7CisJCWlmIChOUzEwdG8xMFBTKGRhdGFbOV0pIDw9IHRtZW1jbGspCisJCQljYWxfdmFsID0gMzsKKwl9CisKKwkvKiB0aGVuIDIuLi4gKi8KKwlpZiAoc3VwcF9jYWwgJiAyKSB7CisJCWlmIChOUzEwdG8xMFBTKGRhdGFbMjNdKSA8PSB0bWVtY2xrKQorCQkJY2FsX3ZhbCA9IDI7CisJfQorCisJRFAocHJpbnRmKCJjYWxfdmFsID0gJWRcbiIsIGNhbF92YWwpKTsKKworCS8qIGJ1bW1lciwgZGlkJ3Qgd29yay4uLiAqLworCWlmIChjYWxfdmFsID09IDApIHsKKwkJRFAocHJpbnRmKCJDb3VsZG4ndCBmaW5kIGEgZ29vZCBDQVMgbGF0ZW5jeVxuIikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBnZXQgdGhlIGxhcmdlc3QgZGVsYXkgLS0gdGhlc2UgdmFsdWVzIG5lZWQgdG8gYWxsIGJlIHRoZSBzYW1lCisJICogc2VlIFJlcyM2ICovCisJaW5mby0+dHBhciA9IGNhbF92YWw7CisJaWYgKHRycF9jbG9ja3MgPiBpbmZvLT50cGFyKQorCQlpbmZvLT50cGFyID0gdHJwX2Nsb2NrczsKKwlpZiAodHJjZF9jbG9ja3MgPiBpbmZvLT50cGFyKQorCQlpbmZvLT50cGFyID0gdHJjZF9jbG9ja3M7CisKKwlEUChwcmludGYoInRwYXIgc2V0IHRvOiAlZFxuIiwgaW5mby0+dHBhcikpOworCisjaWZkZWYgQ0ZHX0JST0tFTl9DTDIKKwlpZiAoaW5mby0+dHBhciA9PSAyKXsKKwkJaW5mby0+dHBhciA9IDM7CisJICAgICAgICBEUChwcmludGYoInRwYXIgZml4ZWQtdXAgdG86ICVkXG4iLCBpbmZvLT50cGFyKSk7CisJfQorI2VuZGlmCisJLyogY29tcHV0ZSB0aGUgbW9kdWxlIERSQiBzaXplICovCisJaW5mby0+ZHJiX3NpemUgPSAoKCgxIDw8IChyb3dzICsgY29scykpICogc2RyYW1fYmFua3MpICogd2lkdGgpIC8gXzE2TTsKKworCURQKHByaW50ZigiZHJiX3NpemUgc2V0IHRvOiAlZFxuIiwgaW5mby0+ZHJiX3NpemUpKTsKKworCS8qIGZpbmQgdGhlIGJ1cnN0IGxlbiAqLworCWluZm8tPmJ1cnN0X2xlbiA9IGRhdGFbMTZdICYgMHhmOworCWlmICgoaW5mby0+YnVyc3RfbGVuICYgOCkgPT0gOCkgeworCQlpbmZvLT5idXJzdF9sZW4gPSAxOworCX0gZWxzZSBpZiAoKGluZm8tPmJ1cnN0X2xlbiAmIDQpID09IDQpIHsKKwkJaW5mby0+YnVyc3RfbGVuID0gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpbmZvLT5zbG90ID0gc2xvdDsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiAhIENPTkZJR19aVU1BX1YyICovCisKK3N0YXRpYyBpbnQKK3NldHVwX3NkcmFtX2NvbW1vbihzZHJhbV9pbmZvX3QgaW5mb1syXSkKK3sKKyAgICAJdWxvbmcgdG1wOworCWludCB0cGFyPTIsIHRyYXNfY2xvY2tzPTUsIHJlZ2lzdGVyZWQ9MSwgZWNjPTI7CisKKwlpZighaW5mb1swXS5iYW5rcyAmJiAhaW5mb1sxXS5iYW5rcykgcmV0dXJuIDA7CisKKwlpZihpbmZvWzBdLmJhbmtzKSB7CisJICAgIGlmKGluZm9bMF0udHBhcj50cGFyKSB0cGFyPWluZm9bMF0udHBhcjsKKwkgICAgaWYoaW5mb1swXS50cmFzX2Nsb2Nrcz50cmFzX2Nsb2NrcykgdHJhc19jbG9ja3M9aW5mb1swXS50cmFzX2Nsb2NrczsKKwkgICAgaWYoIWluZm9bMF0ucmVnaXN0ZXJlZCkgcmVnaXN0ZXJlZD0wOworCSAgICBpZihpbmZvWzBdLmVjYyE9MikgZWNjPTA7CisJfQorCisJaWYoaW5mb1sxXS5iYW5rcykgeworCSAgICBpZihpbmZvWzFdLnRwYXI+dHBhcikgdHBhcj1pbmZvWzFdLnRwYXI7CisJICAgIGlmKGluZm9bMV0udHJhc19jbG9ja3M+dHJhc19jbG9ja3MpIHRyYXNfY2xvY2tzPWluZm9bMV0udHJhc19jbG9ja3M7CisJICAgIGlmKCFpbmZvWzFdLnJlZ2lzdGVyZWQpIHJlZ2lzdGVyZWQ9MDsKKwkgICAgaWYoaW5mb1sxXS5lY2MhPTIpIGVjYz0wOworCX0KKworCS8qIFNEUkFNIGNvbmZpZ3VyYXRpb24gKi8KKwl0bXAgPSBHVFJFR1JFQUQoU0RSQU1fQ09ORklHVVJBVElPTik7CisKKwkvKiBUdXJuIG9uIHBoeXNpY2FsIGludGVybGVhdmUgaWYgYm90aCBESU1NcworCSAqIGhhdmUgZXZlbiBudW1iZXJzIG9mIGJhbmtzLiAqLworCWlmKCAoaW5mb1swXS5iYW5rcyA9PSAwIHx8IGluZm9bMF0uYmFua3MgPT0gMikgJiYKKwkgICAgKGluZm9bMV0uYmFua3MgPT0gMCB8fCBpbmZvWzFdLmJhbmtzID09IDIpICkgeworCSAgICAvKiBwaHlzaWNhbCBpbnRlcmxlYXZlIG9uICovCisJICAgIHRtcCAmPSB+KDEgPDwgMTUpOworCX0gZWxzZSB7CisJICAgIC8qIHBoeXNpY2FsIGludGVybGVhdmUgb2ZmICovCisJICAgIHRtcCB8PSAoMSA8PCAxNSk7CisJfQorCisJdG1wIHw9IChyZWdpc3RlcmVkIDw8IDE3KTsKKworCS8qIFVzZSBidWZmZXIgMSB0byByZXR1cm4gcmVhZCBkYXRhIHRvIHRoZSBDUFUKKwkgKiBTZWUgUmVzICMxMiAqLworCXRtcCB8PSAoMSA8PCAyNik7CisKKwlHVF9SRUdfV1JJVEUoU0RSQU1fQ09ORklHVVJBVElPTiwgdG1wKTsKKwlEUChwcmludGYoIlNEUkFNIGNvbmZpZzogJTA4eFxuIiwKKwkJR1RSRUdSRUFEKFNEUkFNX0NPTkZJR1VSQVRJT04pKSk7CisKKwkvKiBTRFJBTSB0aW1pbmcgKi8KKwl0bXAgPSAoKCh0cGFyID09IDMpID8gMiA6IDEpIHwKKwkgICAgICAgKCgodHBhciA9PSAzKSA/IDIgOiAxKSA8PCAyKSB8CisJICAgICAgICgoKHRwYXIgPT0gMykgPyAyIDogMSkgPDwgNCkgfAorCSAgICAgICAodHJhc19jbG9ja3MgPDwgOCkpOworCisjaWZkZWYgQ09ORklHX0VDQworCS8qIFNldHVwIEVDQyAqLworCWlmIChlY2MgPT0gMikgdG1wIHw9IDE8PDEzOworI2VuZGlmIC8qIENPTkZJR19FQ0MgKi8KKworCUdUX1JFR19XUklURShTRFJBTV9USU1JTkcsIHRtcCk7CisJRFAocHJpbnRmKCJTRFJBTSB0aW1pbmc6ICUwOHggKCVkLCVkLCVkLCVkKVxuIiwKKwkJR1RSRUdSRUFEKFNEUkFNX1RJTUlORyksIHRwYXIsdHBhcix0cGFyLHRyYXNfY2xvY2tzKSk7CisKKwkvKiBTRFJBTSBhZGRyZXNzIGRlY29kZSByZWdpc3RlciAqLworCS8qIHByb2dyYW0gdGhpcyB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlICovCisJR1RfUkVHX1dSSVRFKFNEUkFNX0FERFJFU1NfREVDT0RFLCAweDIpOworCURQKHByaW50ZigiU0RSQU0gZGVjb2RlOiAlMDh4XG4iLAorCQlHVFJFR1JFQUQoU0RSQU1fQUREUkVTU19ERUNPREUpKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0cyB1cCB0aGUgR1QgcHJvcGVybHkgd2l0aCBpbmZvcm1hdGlvbiBwYXNzZWQgaW4gKi8KK3N0YXRpYyBpbnQKK3NldHVwX3NkcmFtKHNkcmFtX2luZm9fdCAqaW5mbykKK3sKKwl1bG9uZyB0bXAsIGNoZWNrOworCXVsb25nICphZGRyID0gMDsKKwlpbnQgaTsKKworCS8qIHNhbml0eSBjaGVja2luZyAqLworCWlmICghIGluZm8tPmJhbmtzKSByZXR1cm4gMDsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBQcm9ncmFtIHRoZSBHVCB3aXRoIHRoZSBkaXNjb3ZlcmVkIGRhdGEgKi8KKworCS8qIGJhbmsgcGFyYW1ldGVycyAqLworCXRtcCA9ICgweGY8PDE2KTsJLyogbGVhdmUgYWxsIHZpcnQgYmFuayBwYWdlcyBvcGVuICovCisKKwlEUChwcmludGYoImRyYl9zaXplOiAlZFxuIiwgaW5mby0+ZHJiX3NpemUpKTsKKwlzd2l0Y2ggKGluZm8tPmRyYl9zaXplKSB7CisJY2FzZSAxOgorCQl0bXAgfD0gKDEgPDwgMTQpOworCQlicmVhazsKKwljYXNlIDQ6CisJY2FzZSA4OgorCQl0bXAgfD0gKDIgPDwgMTQpOworCQlicmVhazsKKwljYXNlIDE2OgorCWNhc2UgMzI6CisJCXRtcCB8PSAoMyA8PCAxNCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiRXJyb3IgaW4gZHJhbSBzaXplIGNhbGN1bGF0aW9uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU0RSQU0gYmFuayBwYXJhbWV0ZXJzICovCisJLyogdGhlIHBhcmFtIHJlZ2lzdGVycyBmb3Igc2xvdCAxIChiYW5rcyAyKzMpIGFyZSBvZmZzZXQgYnkgMHg4ICovCisJR1RfUkVHX1dSSVRFKFNEUkFNX0JBTkswUEFSQU1FVEVSUyArIChpbmZvLT5zbG90ICogMHg4KSwgdG1wKTsKKwlHVF9SRUdfV1JJVEUoU0RSQU1fQkFOSzFQQVJBTUVURVJTICsgKGluZm8tPnNsb3QgKiAweDgpLCB0bXApOworCURQKHByaW50ZigiU0RSQU0gYmFua3BhcmFtIHNsb3QgJWQgKGJhbmsgJWQrJWQpOiAlMDhseFxuIiwgaW5mby0+c2xvdCwgaW5mby0+c2xvdCoyLCAoaW5mby0+c2xvdCoyKSsxLCB0bXApKTsKKworCS8qIHNldCB0aGUgU0RSQU0gY29uZmlndXJhdGlvbiBmb3IgZWFjaCBiYW5rICovCisJZm9yIChpID0gaW5mby0+c2xvdCAqIDI7IGkgPCAoKGluZm8tPnNsb3QgKiAyKSArIGluZm8tPmJhbmtzKTsgaSsrKSB7CisJCURQKHByaW50ZigiKioqIFJ1bm5pbmcgYSBNUlMgY3ljbGUgZm9yIGJhbmsgJWQgKioqXG4iLCBpKSk7CisKKwkJLyogbWFwIHRoZSBiYW5rICovCisJCW1lbW9yeV9tYXBfYmFuayhpLCAwLCBHQi80KTsKKworCQkvKiBzZXQgU0RSQU0gbW9kZSAqLworCQlHVF9SRUdfV1JJVEUoU0RSQU1fT1BFUkFUSU9OX01PREUsIDB4Myk7CisJCWNoZWNrID0gR1RSRUdSRUFEKFNEUkFNX09QRVJBVElPTl9NT0RFKTsKKworCQkvKiBkdW1teSB3cml0ZSAqLworCQkqYWRkciA9IDA7CisKKwkJLyogd2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KKwkJd2hpbGUgKChHVFJFR1JFQUQoU0RSQU1fT1BFUkFUSU9OX01PREUpICYgKDEgPDwgMzEpKSA9PSAwKQorCQkJOworCisJCS8qIHN3aXRjaCBiYWNrIHRvIG5vcm1hbCBvcGVyYXRpb24gbW9kZSAqLworCQlHVF9SRUdfV1JJVEUoU0RSQU1fT1BFUkFUSU9OX01PREUsIDApOworCQljaGVjayA9IEdUUkVHUkVBRChTRFJBTV9PUEVSQVRJT05fTU9ERSk7CisKKwkJLyogdW5tYXAgdGhlIGJhbmsgKi8KKwkJbWVtb3J5X21hcF9iYW5rKGksIDAsIDApOworCQlEUChwcmludGYoIioqKiBNUlMgY3ljbGUgZm9yIGJhbmsgJWQgZG9uZSAqKipcbiIsIGkpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIG1lbW9yeSByYW5nZSBmb3IgdmFsaWQgUkFNLiBBIHNpbXBsZSBtZW1vcnkgdGVzdCBkZXRlcm1pbmVzCisgKiB0aGUgYWN0dWFsbHkgYXZhaWxhYmxlIFJBTSBzaXplIGJldHdlZW4gYWRkcmVzc2VzIGBiYXNlJyBhbmQKKyAqIGBiYXNlICsgbWF4c2l6ZScuIFNvbWUgKG5vdCBhbGwpIGhhcmR3YXJlIGVycm9ycyBhcmUgZGV0ZWN0ZWQ6CisgKiAtIHNob3J0IGJldHdlZW4gYWRkcmVzcyBsaW5lcworICogLSBzaG9ydCBiZXR3ZWVuIGRhdGEgbGluZXMKKyAqLworc3RhdGljIGxvbmcgaW50CitkcmFtX3NpemUobG9uZyBpbnQgKmJhc2UsIGxvbmcgaW50IG1heHNpemUpCit7CisgICAgdm9sYXRpbGUgbG9uZyBpbnQJICphZGRyLCAqYj1iYXNlOworICAgIGxvbmcgaW50CSBjbnQsIHZhbCwgc2F2ZTEsIHNhdmUyOworCisjZGVmaW5lIFNUQVJUVkFMICgxPDwyMCkJLyogc3RhcnQgdGVzdCBhdCAxTSAqLworICAgIGZvciAoY250ID0gU1RBUlRWQUwvc2l6ZW9mKGxvbmcpOyBjbnQgPCBtYXhzaXplL3NpemVvZihsb25nKTsgY250IDw8PSAxKSB7CisJICAgIGFkZHIgPSBiYXNlICsgY250OwkvKiBwb2ludGVyIGFyaXRoISAqLworCisJICAgIHNhdmUxPSphZGRyOwkvKiBzYXZlIGNvbnRlbnRzIG9mIGFkZHIgKi8KKwkgICAgc2F2ZTI9KmI7CQkvKiBzYXZlIGNvbnRlbnRzIG9mIGJhc2UgKi8KKworCSAgICAqYWRkcj1jbnQ7CQkvKiB3cml0ZSBjbnQgdG8gYWRkciAqLworCSAgICAqYj0wOwkJLyogcHV0IG51bGwgYXQgYmFzZSAqLworCisJICAgIC8qIGNoZWNrIGF0IGJhc2UgYWRkcmVzcyAqLworCSAgICBpZiAoKCpiKSAhPSAwKSB7CisJCSphZGRyPXNhdmUxOwkvKiByZXN0b3JlICphZGRyICovCisJCSpiPXNhdmUyOwkvKiByZXN0b3JlICpiICovCisJCXJldHVybiAoMCk7CisJICAgIH0KKwkgICAgdmFsID0gKmFkZHI7CS8qIHJlYWQgKmFkZHIgKi8KKworCSAgICAqYWRkcj1zYXZlMTsKKwkgICAgKmI9c2F2ZTI7CisKKwkgICAgaWYgKHZhbCAhPSBjbnQpIHsKKwkJICAgIC8qIGZpeCBib3VuZGFyeSBjb25kaXRpb24uLiBTVEFSVFZBTCBtZWFucyB6ZXJvICovCisJCSAgICBpZihjbnQ9PVNUQVJUVkFML3NpemVvZihsb25nKSkgY250PTA7CisJCSAgICByZXR1cm4gKGNudCAqIHNpemVvZihsb25nKSk7CisJICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1heHNpemU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVS1Cb290IGludGVyZmFjZSBmdW5jdGlvbiB0byBTRFJBTSBpbml0IC0gdGhpcyBpcyB3aGVyZSBhbGwgdGhlCisgKiBjb250cm9sbGluZyBsb2dpYyBoYXBwZW5zICovCitsb25nIGludAoraW5pdGRyYW0oaW50IGJvYXJkX3R5cGUpCit7CisJdWxvbmcgY2hlY2tiYW5rWzRdID0geyBbMCAuLi4gM10gPSAwIH07CisJaW50IGJhbmtfbm87CisgICAgICAgIHVsb25nIHRvdGFsOworCWludCBuaHI7CisJc2RyYW1faW5mb190IGRpbW1faW5mb1syXTsKKworCisJLyogZmlyc3QsIHVzZSB0aGUgU1BEIHRvIGdldCBpbmZvIGFib3V0IHRoZSBTRFJBTSAqLworCisJLyogY2hlY2sgdGhlIE5IUiBiaXQgYW5kIHNraXAgbWVtIGluaXQgaWYgaXQncyBhbHJlYWR5IGRvbmUgKi8KKwluaHIgPSBnZXRfaGlkMCgpICYgKDEgPDwgMTYpOworCisJaWYgKG5ocikgeworCQlwcmludGYoIlNraXBwaW5nIFNEUkFNIHNldHVwIGR1ZSB0byBOSFIgYml0IGJlaW5nIHNldFxuIik7CisJfSBlbHNlIHsKKwkJLyogRElNTTAgKi8KKwkJY2hlY2tfZGltbSgwLCAmZGltbV9pbmZvWzBdKTsKKworCQkvKiBESU1NMSAqLworI2lmbmRlZiBDT05GSUdfRVZCNjQyNjBfNzUwQ1ggLyogRVZCNjQyNjBfNzUwQ1ggaGFzIG9ubHkgMSBESU1NICovCisJCWNoZWNrX2RpbW0oMSwgJmRpbW1faW5mb1sxXSk7CisjZWxzZSAvKiBDT05GSUdfRVZCNjQyNjBfNzUwQ1ggKi8KKwkJbWVtc2V0KCZkaW1tX2luZm9bMV0sIDAsIHNpemVvZihzZHJhbV9pbmZvX3QpKTsKKyNlbmRpZgorCisJCS8qIHVubWFwIGFsbCBiYW5rcyAqLworCQltZW1vcnlfbWFwX2JhbmsoMCwgMCwgMCk7CisJCW1lbW9yeV9tYXBfYmFuaygxLCAwLCAwKTsKKwkJbWVtb3J5X21hcF9iYW5rKDIsIDAsIDApOworCQltZW1vcnlfbWFwX2JhbmsoMywgMCwgMCk7CisKKwkJLyogTm93LCBwcm9ncmFtIHRoZSBHVCB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlcyAqLworCQlpZiAoc2V0dXBfc2RyYW1fY29tbW9uKGRpbW1faW5mbykpIHsKKwkJCXByaW50ZigiU2V0dXAgY29tbW9uIGZhaWxlZC5cbiIpOworCQl9CisKKwkJaWYgKHNldHVwX3NkcmFtKCZkaW1tX2luZm9bMF0pKSB7CisJCQlwcmludGYoIlNldHVwIGZvciBESU1NMSBmYWlsZWQuXG4iKTsKKwkJfQorCisJCWlmIChzZXR1cF9zZHJhbSgmZGltbV9pbmZvWzFdKSkgeworCQkJcHJpbnRmKCJTZXR1cCBmb3IgRElNTTIgZmFpbGVkLlxuIik7CisJCX0KKworCQkvKiBzZXQgdGhlIE5IUiBiaXQgKi8KKwkJc2V0X2hpZDAoZ2V0X2hpZDAoKSB8ICgxIDw8IDE2KSk7CisJfQorCS8qIG5leHQsIHNpemUgdGhlIFNEUkFNIGJhbmtzICovCisKKwl0b3RhbCA9IDA7CisJaWYgKGRpbW1faW5mb1swXS5iYW5rcyA+IDApIGNoZWNrYmFua1swXSA9IDE7CisJaWYgKGRpbW1faW5mb1swXS5iYW5rcyA+IDEpIGNoZWNrYmFua1sxXSA9IDE7CisJaWYgKGRpbW1faW5mb1swXS5iYW5rcyA+IDIpCisJCXByaW50ZigiRXJyb3IsIFNQRCBjbGFpbXMgRElNTTEgaGFzID4yIGJhbmtzXG4iKTsKKworCWlmIChkaW1tX2luZm9bMV0uYmFua3MgPiAwKSBjaGVja2JhbmtbMl0gPSAxOworCWlmIChkaW1tX2luZm9bMV0uYmFua3MgPiAxKSBjaGVja2JhbmtbM10gPSAxOworCWlmIChkaW1tX2luZm9bMV0uYmFua3MgPiAyKQorCQlwcmludGYoIkVycm9yLCBTUEQgY2xhaW1zIERJTU0yIGhhcyA+MiBiYW5rc1xuIik7CisKKwkvKiBHZW5lcmljIGRyYW0gc2l6ZXI6IHdvcmtzIGV2ZW4gaWYgd2UgZG9uJ3QgaGF2ZSBpMmMgRElNTXMsCisJICogYXMgbG9uZyBhcyB0aGUgdGltaW5nIHNldHRpbmdzIGFyZSBtb3JlIG9yIGxlc3MgY29ycmVjdCAqLworCisJLyoKKwkgKiBwYXNzIDE6IHNpemUgYWxsIHRoZSBiYW5rcywgdXNpbmcgZmlyc3QgYmF0ICgwLTI1Nk0pCisJICogCSAgIGxpbWl0YXRpb246IHdlIG9ubHkgc3VwcG9ydCAyNTZNIHBlciBiYW5rIGR1ZSB0bworCSAqICAJICAgdXMgb25seSBoYXZpbmcgMSBCQVQgZm9yIGFsbCBEUkFNCisJICovCisJZm9yIChiYW5rX25vID0gMDsgYmFua19ubyA8IENGR19EUkFNX0JBTktTOyBiYW5rX25vKyspIHsKKwkJLyogc2tpcCBvdmVyIGJhbmtzIHRoYXQgYXJlIG5vdCBwb3B1bGF0ZWQgKi8KKwkJaWYgKCEgY2hlY2tiYW5rW2Jhbmtfbm9dKQorCQkJY29udGludWU7CisKKwkJRFAocHJpbnRmKCJjaGVja2luZyBiYW5rICVkXG4iLCBiYW5rX25vKSk7CisKKwkJbWVtb3J5X21hcF9iYW5rKGJhbmtfbm8sIDAsIEdCLzQpOworCQljaGVja2JhbmtbYmFua19ub10gPSBkcmFtX3NpemUoTlVMTCwgR0IvNCk7CisJCW1lbW9yeV9tYXBfYmFuayhiYW5rX25vLCAwLCAwKTsKKworCQlEUChwcmludGYoImJhbmsgJWQgJTA4bHhcbiIsIGJhbmtfbm8sIGNoZWNrYmFua1tiYW5rX25vXSkpOworCX0KKworCS8qCisJICogcGFzcyAyOiBjb250aWd1b3VzbHkgbWFwIGVhY2ggYmFuayBpbnRvIHBoeXNpY2FsIGFkZHJlc3MKKwkgKiAJICAgc3BhY2UuCisJICovCisJZGltbV9pbmZvWzBdLmJhbmtzPWRpbW1faW5mb1sxXS5iYW5rcz0wOworCWZvciAoYmFua19ubyA9IDA7IGJhbmtfbm8gPCBDRkdfRFJBTV9CQU5LUzsgYmFua19ubysrKSB7CisJCWlmKCFjaGVja2JhbmtbYmFua19ub10pIGNvbnRpbnVlOworCisJCWRpbW1faW5mb1tiYW5rX25vLzJdLmJhbmtzKys7CisJCWRpbW1faW5mb1tiYW5rX25vLzJdLnNpemUrPWNoZWNrYmFua1tiYW5rX25vXTsKKworCQltZW1vcnlfbWFwX2JhbmsoYmFua19ubywgdG90YWwsIGNoZWNrYmFua1tiYW5rX25vXSk7CisjaWZkZWYgTUFQX1BDSQorCQltZW1vcnlfbWFwX2JhbmtfcGNpKGJhbmtfbm8sIHRvdGFsLCBjaGVja2JhbmtbYmFua19ub10pOworI2VuZGlmCisJCXRvdGFsICs9IGNoZWNrYmFua1tiYW5rX25vXTsKKwl9CisKKyNpZmRlZiBDT05GSUdfRUNDCisjaWZkZWYgQ09ORklHX1pVTUFfVjIKKwkvKgorCSAqIFdlIGFsd2F5cyBlbmFibGUgRUNDIHdoZW4gYmFuayAyIGFuZCAzIGFyZSB1bnBvcHVsYXRlZAorCSAqIElmIHdlIDIgb3IgMyBhcmUgcG9wdWxhdGVkLCB3ZSBDQU4nVCBzdXBwb3J0IEVDQy4KKwkgKiAoWnVtYSBib2FyZHMgb25seSBzdXBwb3J0IEVDQyBpbiBiYW5rcyAwIGFuZCAxOyBhc3N1bWUgdGhhdAorCSAqIGluIHRoYXQgY29uZmlndXJhdGlvbiwgRUNDIGNoaXBzIGFyZSBtb3VudGVkLCBldmVuIGZvciBzdGFja2VkCisJICogY2hpcHMpCisJICovCisJaWYgKGNoZWNrYmFua1syXT09MCAmJiBjaGVja2JhbmtbM109PTApIHsKKwkgICAgCWRpbW1faW5mb1swXS5lY2M9MjsKKwkJR1RfUkVHX1dSSVRFKFNEUkFNX1RJTUlORywgR1RSRUdSRUFEKFNEUkFNX1RJTUlORykgfCAoMSA8PCAxMykpOworCQkvKiBUT0RPOiBkbyB3ZSBoYXZlIHRvIHJ1biBNUlMgY3ljbGVzIGFnYWluPyAqLworCX0KKyNlbmRpZiAvKiBDT05GSUdfWlVNQV9WMiAqLworCisJaWYgKEdUUkVHUkVBRChTRFJBTV9USU1JTkcpICYgKDEgPDwgMTMpKSB7CisJCXB1dHMoIltFQ0NdICIpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfRUNDICovCisKKyNpZmRlZiBERUJVRworCWR1bXBfZGltbV9pbmZvKCZkaW1tX2luZm9bMF0pOworCWR1bXBfZGltbV9pbmZvKCZkaW1tX2luZm9bMV0pOworI2VuZGlmCisJLyogVE9ETzogcmV0dXJuIGF0IE1PU1QgMjU2TT8gKi8KKyAgICAgICAgLyogcmV0dXJuIHRvdGFsID4gR0IvNCA/IEdCLzQgOiB0b3RhbDsgKi8KKwlyZXR1cm4gdG90YWw7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9ldmI2NDI2MC9zZXJpYWwuYyBiL2JvYXJkL2V2YjY0MjYwL3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzdhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9ldmI2NDI2MC9zZXJpYWwuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogSm9zaCBIdWJlciA8aHViZXJAbWNseC5jb20+LCBNaXNzaW9uIENyaXRpY2FsIExpbnV4LCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIHNlcmlhbC5jIC0gc2VyaWFsIHN1cHBvcnQgZm9yIHRoZSBnYWwgZXYgYm9hcmQKKyAqLworCisvKiBzdXBwb3J0cyBib3RoIHRoZSAxNjY1MCBkdWFydCBhbmQgdGhlIE1QU0MgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxnYWxpbGVvL21lbW9yeS5oPgorCisjaWYgKGRlZmluZWQgQ0ZHX0lOSVRfQ0hBTjEpIHx8IChkZWZpbmVkIENGR19JTklUX0NIQU4yKQorI2luY2x1ZGUgPG5zMTY1NTAuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic2VyaWFsLmgiCisKKyNpbmNsdWRlICJtcHNjLmgiCisKKyNpZiAoZGVmaW5lZCBDRkdfSU5JVF9DSEFOMSkgfHwgKGRlZmluZWQgQ0ZHX0lOSVRfQ0hBTjIpCitjb25zdCBOUzE2NTUwX3QgQ09NX1BPUlRTW10gPSB7IChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTEsCisJCQkJKE5TMTY1NTBfdCkgQ0ZHX05TMTY1NTBfQ09NMiB9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTVBTQworCitpbnQgc2VyaWFsX2luaXQgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiAoZGVmaW5lZCBDRkdfSU5JVF9DSEFOMSkgfHwgKGRlZmluZWQgQ0ZHX0lOSVRfQ0hBTjIpCisJaW50IGNsb2NrX2Rpdmlzb3IgPSBDRkdfTlMxNjU1MF9DTEsgLyAxNiAvIGdkLT5iYXVkcmF0ZTsKKyNlbmRpZgorCisJbXBzY19pbml0KGdkLT5iYXVkcmF0ZSk7CisKKwkvKiBpbml0IHRoZSBEVUFSVCBjaGFucyBzbyB0aGF0IEtHREIgaW4gdGhlIGtlcm5lbCBjYW4gdXNlIHRoZW0gKi8KKyNpZmRlZiBDRkdfSU5JVF9DSEFOMQorCU5TMTY1NTBfcmVpbml0KENPTV9QT1JUU1swXSwgY2xvY2tfZGl2aXNvcik7CisjZW5kaWYKKyNpZmRlZiBDRkdfSU5JVF9DSEFOMgorCU5TMTY1NTBfcmVpbml0KENPTV9QT1JUU1sxXSwgY2xvY2tfZGl2aXNvcik7CisjZW5kaWYKKwlyZXR1cm4gKDApOworfQorCit2b2lkCitzZXJpYWxfcHV0Yyhjb25zdCBjaGFyIGMpCit7CisJaWYgKGMgPT0gJ1xuJykKKwkJbXBzY19wdXRjaGFyKCdccicpOworCisJbXBzY19wdXRjaGFyKGMpOworfQorCitpbnQKK3NlcmlhbF9nZXRjKHZvaWQpCit7CisJcmV0dXJuIG1wc2NfZ2V0Y2hhcigpOworfQorCitpbnQKK3NlcmlhbF90c3RjKHZvaWQpCit7CisJcmV0dXJuIG1wc2NfdGVzdF9jaGFyKCk7Cit9CisKK3ZvaWQKK3NlcmlhbF9zZXRicmcgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlnYWxicmdfc2V0X2JhdWRyYXRlKENPTkZJR19NUFNDX1BPUlQsIGdkLT5iYXVkcmF0ZSk7Cit9CisKKyNlbHNlIC8qICEgQ09ORklHX01QU0MgKi8KKworaW50IHNlcmlhbF9pbml0ICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJaW50IGNsb2NrX2Rpdmlzb3IgPSBDRkdfTlMxNjU1MF9DTEsgLyAxNiAvIGdkLT5iYXVkcmF0ZTsKKworI2lmZGVmIENGR19JTklUX0NIQU4xCisJKHZvaWQpTlMxNjU1MF9pbml0KENPTV9QT1JUU1swXSwgY2xvY2tfZGl2aXNvcik7CisjZW5kaWYKKyNpZmRlZiBDRkdfSU5JVF9DSEFOMgorCSh2b2lkKU5TMTY1NTBfaW5pdChDT01fUE9SVFNbMV0sIGNsb2NrX2Rpdmlzb3IpOworI2VuZGlmCisKKwlyZXR1cm4gKDApOworfQorCit2b2lkCitzZXJpYWxfcHV0Yyhjb25zdCBjaGFyIGMpCit7CisJaWYgKGMgPT0gJ1xuJykKKwkJTlMxNjU1MF9wdXRjKENPTV9QT1JUU1tDRkdfRFVBUlRfQ0hBTl0sICdccicpOworCisJTlMxNjU1MF9wdXRjKENPTV9QT1JUU1tDRkdfRFVBUlRfQ0hBTl0sIGMpOworfQorCitpbnQKK3NlcmlhbF9nZXRjKHZvaWQpCit7CisJcmV0dXJuIE5TMTY1NTBfZ2V0YyhDT01fUE9SVFNbQ0ZHX0RVQVJUX0NIQU5dKTsKK30KKworaW50CitzZXJpYWxfdHN0Yyh2b2lkKQoreworCXJldHVybiBOUzE2NTUwX3RzdGMoQ09NX1BPUlRTW0NGR19EVUFSVF9DSEFOXSk7Cit9CisKK3ZvaWQKK3NlcmlhbF9zZXRicmcgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlpbnQgY2xvY2tfZGl2aXNvciA9IENGR19OUzE2NTUwX0NMSyAvIDE2IC8gZ2QtPmJhdWRyYXRlOworCisjaWZkZWYgQ0ZHX0lOSVRfQ0hBTjEKKwlOUzE2NTUwX3JlaW5pdChDT01fUE9SVFNbMF0sIGNsb2NrX2Rpdmlzb3IpOworI2VuZGlmCisjaWZkZWYgQ0ZHX0lOSVRfQ0hBTjIKKwlOUzE2NTUwX3JlaW5pdChDT01fUE9SVFNbMV0sIGNsb2NrX2Rpdmlzb3IpOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBDT05GSUdfTVBTQyAqLworCit2b2lkCitzZXJpYWxfcHV0cyAoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJc2VyaWFsX3B1dGMgKCpzKyspOworCX0KK30KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCit2b2lkCitrZ2RiX3NlcmlhbF9pbml0KHZvaWQpCit7Cit9CisKK3ZvaWQKK3B1dERlYnVnQ2hhciAoaW50IGMpCit7CisJc2VyaWFsX3B1dGMgKGMpOworfQorCit2b2lkCitwdXREZWJ1Z1N0ciAoY29uc3QgY2hhciAqc3RyKQoreworCXNlcmlhbF9wdXRzIChzdHIpOworfQorCitpbnQKK2dldERlYnVnQ2hhciAodm9pZCkKK3sKKwlyZXR1cm4gc2VyaWFsX2dldGMoKTsKK30KKwordm9pZAora2dkYl9pbnRlcnJ1cHRpYmxlIChpbnQgeWVzKQoreworCXJldHVybjsKK30KKyNlbmRpZgkvKiBDRkdfQ01EX0tHREIJKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2dlbjg2MHQvUkVBRE1FIGIvYm9hcmQvZ2VuODYwdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxY2VlZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2dlbjg2MHQvUkVBRE1FCkBAIC0wLDAgKzEsMTQyIEBACisKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGJvYXJkIHNwZWNpZmljIGNvZGUgZm9yIGEgZ2VuZXJpYyBNUEM4NjBUIGJhc2VkCitlbWJlZGRlZCBjb21wdXRlciwgY2FsbGVkICdHRU44NjBUJy4gIFRoZSBkZXNpZ24gaXMgZ2VuZXJpYyBpbiB0aGUgc2Vuc2UgdGhhdAorY29tbW9uLCByZWFkaWx5IGF2YWlsYWJsZSBjb21wb25lbnRzIGFyZSB1c2VkIGFuZCB0aGF0IHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlCitzeXN0ZW0gaXMgaShyZWxhdGl2ZWx5KSBzdHJhaWdodGZvcndhcmQ6CisKKwlPbmUgZWlnaHQgYml0IHdpZGUgYm9vdCAoRkxBU0gpIG1lbW9yeQorCTMyIGJpdCBtYWluIG1lbW9yeSB1c2luZyBTRFJBTQorCURPQyAyMDAwKworCUV0aGVybmV0IFBIWQorCVNvbWUgSTJDIHBlcmlwaGVyYWwgZGV2aWNlczogQXRtZWwgQVQyNEMyNTYgRUVQUk9NLCBNYXhpbSBEUzEzMzcgUlRDLgorCVNvbWUgb3RoZXIgbWlzY2VsbGFuZW91cyBwZXJpcGhlcmFscworCitOT1RFOiBUaGVyZSBhcmUgcmVmZXJlbmNlcyB0byBhIFhJbGlueCBGUEdBIGFuZCBNaWwtU3RkIDE1NTMgZGF0YWJ1cyBpbiB0aGlzCitwb3J0LiAgSSBndWVzcyB0aGUgY29tcHV0ZXIgaXMgbm90IGFzIGdlbmVyaWMgYXMgSSBmaXJzdCBzYWlkIDgpICBIb3dldmVyLAordGhlc2UgZXh0cmFzIGNhbiBiZSBzYWZlbHkgaWdub3JlZC4KKworR2l2ZW4gdGhlIEdFTjg2MFQgZmlsZXMsIGl0IHNob3VsZCBiZSBwcmV0dHkgZWFzeSB0byByZXZlcnNlIGVuZ2luZWVyIHRoZQoraGFyZHdhcmUgY29uZmlndXJhdGlvbiwgaWYgdGhhdCdzIHVzZWZ1bCB0byB5b3UuICBIb3BlZnVsbHksIHRoaXMgY29kZSB3aWxsCitiZSB1c2VmdWwgdG8gc29tZW9uZSBhcyBhIGJhc2lzIGZvciBhIHBvcnQgdG8gYSBuZXcgc3lzdGVtIG9yIGFzIGEgaGVhZCBzdGFydAorb24gYSBjdXN0b20gZGVzaWduLiAgSWYgeW91IGVuZCB1cCB1c2luZyBhbnkgb2YgdGhpcywgSSB3b3VsZCBhcHByZWNpYXRlCitoZWFyaW5nIGZyb20geW91LCBlc3BlY2lhbGx5IGlmIHlvdSBkaXNjb3ZlciBidWdzIG9yIGZpbmQgd2F5cyB0byBpbXByb3ZlIHRoZQorcXVhbGl0eSBvZiB0aGlzIFUtQm9vdCBwb3J0LgorCitIZXJlIGFyZSB0aGUgc2FsaWVudCBmZWF0dXJlcyBvZiB0aGUgc3lzdGVtOgorQ2xvY2sJCQkJCQk6CTMzIE1oeiBvc2NpbGxhdG9yCitQcm9jZXNzb3IgY29yZSBmcmVxdWVuY3kJOgk2NiBNaHogIGlmIGluIDE6MjoxIG1vZGU7IGNhbiBhbHNvIHJ1biAxOjEKK0J1cyBmcmVxdWVuY3kJCQkJOgkzMyBNaHoKKworTWFpbiBtZW1vcnk6CisJVHlwZQk6IFNEUkFNCisJV2lkdGgJOiAzMiBiaXRzCisJU2l6ZQk6IDY0IG1lZ2FieXRlcworCUNoaXAJOiBUd28gTWljcm9uIE1UNDhMQzE2TTE2QTJURy03RQorCUNTCQk6IE1QQzg2MFQgQ1MxKi9VUE1BCisJVVBNQSBDT05ORUNUSU9OUzoKKwkJU0RSQU0gQTEwCTogR1BMQTAqCisJCVNEUkFNIENBUyoJOiBHUExBMioKKwkJU0RSQU0gV0UqCTogR1BMQTMqCisJCVNEUkFNIFJBUyoJOiBHUExBNCoKKworQm9vdCBtZW1vcnk6CisJVHlwZQk6IEZMQVNICisJV2lkdGgJOiA4IGJpdHMKKwlTaXplCTogMTYgbWVnYWJ5dGVzCisJQ2hpcAk6IE9uZSBJbnRlbCAyOEYxMjhKM0EgKFN0cmF0YUZsYXNoKQorCUNTCQk6IE1QQzg2MFQgQ1MwKi9HUENNICh0aGlzIGlzIHRoZSAiYm9vdCIgY2hpcCBzZWxlY3QpCisKK0VFUFJPTSBtZW1vcnk6CisJVHlwZQk6IFNlcmlhbCBJMkMgRUVQUk9NCisJV2lkdGgJOiA4IGJpdHMKKwlTaXplCTogMzIga2liaWJ5dGVzCisJQ2hpcAk6IE9uZSBBdG1lbCBBVDI1QzI1NgorCUNTCQk6IDB4NTAgKGV4dGVybmFsIEkyQyBhZGRyZXNzIHBpbnMgb24gZGV2aWNlIGFyZSB0aWVkIHRvIEdORCkKKworRmlsZXN5c3RlbSBtZW1vcnk6CisJVHlwZQk6IE5BTkQgRkxBU0ggKFRvc2hpYmEpCisJV2lkdGgJOiA4IGJpdHMgKGkuZS4gaW50ZXJmYWNlIHRvIERPQyBpcyA4IGJpdHMpCisJU2l6ZQk6IDMyIG1lZ2FieXRlcworCUNoaXAJOiBPbmUgRGlza09uQ0hpcCBNaWxsZW5pdW0gUGx1cyAoRE9DIDIwMDArKQorCUNTCQk6IE1QQzg2MFQgQ1MyKi9HUENNCisKK05ldHdvcmsgc3VwcG9ydDoKKwlNQUMJCTogTVBDODZPVCBGRUMgKEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlcikKKwlQSFkJCTogSW50ZWwgTFhUOTcxQQorCU1JSSBBZGRyOiAweDAgKGhhcmR3aXJlZCBvbiB0aGUgYm9hcmQpCisJTUlJIElSUQk6CisKK0NvbnNvbGU6CisJUlMtMjMyIG9uIFNNQzEgKE1heGltIE1BWDMyMzIgTFZDTU9TLVJTMjMyIGxldmVsIHNoaWZ0ZXIpCisKK1JlYWwgVGltZSBDbG9jazoKKwlUeXBlCTogTG93IHBvd2VyLCBJMkMgaW50ZXJmYWNlCisJQ2hpcAk6IE1heGltIERTMTMzNworCUNTCQk6IEFkZHJlc3MgMHg2OCBvbiBJMkMgYnVzCisKKwlUaGUgTVBDODYwVCdzIGludGVybmFsIFJUQyBoYXMgYSBkZWZlY3QgaW4gTWFzayByZXYgRCB0aGF0IGluY3JlYXNlcworCXRoZSBjdXJyZW50IGRyYWluIG9uIHRoZSBLQVBXUiBsaW5lIHRvIDEwIG1BLiAgU2luY2UgdGhpcyBpcyBhbgorCXVucmVhc29uYWJsZSBhbW91bnQgb2YgY3VycmVudCBkcmF3IGZvciBhIFJUQywgYW5kIE1vdG9yb2xhIGRvZXMgbm90CisJcGxhbiB0byBmaXggdGhpcyBpbiBmdXR1cmUgbWFzayByZXZpc2lvbnMsIGEgc2VyaWFsIChJMkMpIFJUQyB0aGF0CisJd29ya3MgaGFzIGJlZW4gaW5jbHVkZWQgaW5zdGVhZC4gIE5PVEUgdGhhdCB0aGUgRFMxMzM3IGNhbiBiZQorCWNvbmZpZ3VyZWQgdG8gb3V0cHV0IGEgMzI3NjggSHogY2xvY2sgd2hpbGUgdGhlIG1haW4gcG93ZXIgaXMgb24uCisJVGhpcyBjbG9jayBvdXRwdXQgaGFzIGJlZW4gcm91dGVkIHRvIHRoZSBNUEM4NjBUJ3MgRVhUQUwgcGluIHRvIGFsbG93CisJdGhlIGludGVybmFsIFJUQyB0byBiZSB1c2VkLiAgTk9URSBhbHNvIHRoYXQgZHVlIHRvIHlldCBhbm90aGVyCisJZGVmZWN0IGluIHRoZSByZXYgRCBtYXNrLCB0aGUgUlRDIGRvZXMgbm90IG9wZXJhdGUgcmVsaWFibHkgd2hlbiB0aGUKKwlpbnRlcm5hbCBSVEMgZGl2aXNvciBpcyBzZXQgdG8gdXNlIGEgMzI3NjggSHogcmVmZXJlbmNlLiAgU28ganVzdCB1c2UKKwl0aGUgSTJDIFJUQy4KKworTWlzY2VsbGFuZW91czoKKwlYaWxpbnggVmlydGV4IEZQR0Egb24gQ1MzKi9HUENNLgorCVZpcnRleCBGUEdBIHNsYXZlIFNlbGVjdE1hcCBpbnRlcmZhY2Ugb24gY3M0Ki9VUE1CLgorCU1pbC1TdGQgMTU1MyBkYXRhYnVzIGludGVyZmFjZSBvbiBDUzUqL0dQQ00uCisJQXVkaW8gc291bmRlciAoYmVlcGVyKSB3aXRoIGRpZ2l0YWwgdm9sdW1lIGNvbnRyb2wgY29ubmVjdGVkIHRvIFNQS1JPVVQuCisKK0lzc3VlczoKKwlUaGUgRE9DIDIwMDArIHJldHVybnMgMHg0MCBhcyBpdHMgZGV2aWNlIElEIHdoZW4gcHJvYmVkIHVzaW5nIHRoZSBtZXRob2QKKwlkZXN4cmliZWQgaW4gdGhlIERPQyBkYXRhc2hlZXQuICBVbmZvcnR1bmF0ZWx5LCB0aGUgVS1Cb290IERPQyBkcml2ZXIKKwlkb2VzIG5vdCByZWNvZ25pemUgdGhpcyBkZXZpY2UuICBBcyBvZiB0aGlzIHdyaXRpbmcsIGl0IHNlZW1zIHRoYXQgTVRECisJZG9lcyBub3Qgc3VwcG9ydCB0aGUgRE9DIDIwMDArIGVpdGhlci4KKworU3RhdHVzOgorCUV2ZXJ5dGhpbmcgYXBwZWFycyB0byB3b3JrIGV4Y2VwdCBET0Mgc3VwcG9ydC4gQXMgb2YgdGhpcyB3cml0aW5nLAorCURhdmlkIFdvb2Rob3VzZSBoYXMgc3RhdGVkIG9uIHRoZSBNVEQgbWFpbGluZyBsaXN0IHRoYXQgaGUgaGFzIG5vCisJa25vd2xlZGdlIG9mIHRoZSBET0MgTWlsbGluZXVtIFBsdXMgYW5kIHRoZXJmb3JlIHRoZXJlIGlzIG5vIHN1cHBvcnQKKwlpbiBNVEQgZm9yIHRoaXMgZGV2aWNlLiAgSSB3aXNoIEkgaGFkIGtub3duIHRoaXMgc29vbmVyIDooCisKK1RoZSBHRU44NjBUIGJvYXJkIHNwZWNpZmljIGZpbGVzIGFuZCBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uIHRoZSB3b3JrCitvZiBvdGhlcnMgd2hvIGhhdmUgY29udHJpYnV0ZWQgdG8gVS1Cb290LiBUaGUgY29wcmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlcworb2YgdGhlc2UgYXV0aG9ycyBoYXZlIGJlZW4gcmV0YWluZWQgd2hlcmV2ZXIgdGhlaXIgY29kZSBoYXMgYmVlbiByZXVzZWQuCitBbGwgbmV3IGNvZGUgdG8gc3VwcG9ydCB0aGUgR0VOODYwVCBib2FyZCBpczoKKworCShDKSBDb3B5cmlnaHQgMjAwMS0yMDAyCisJS2VpdGggT3V0d2F0ZXIgKGtlaXRoX291dHdhdGVyQG12aXMuY29tKQorCithbmQgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFwcGxpZXM6CisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgordGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorTUEgMDIxMTEtMTMwNyBVU0EKKworVGhhbmtzIHRvIFdvbGZnYW5nIERlbmsgZm9yIGEgZ3JlYXQgc29mdHdhcmUgcGFja2FnZSBhbmQgdG8gZXZlcnlvbmUKK3dobyBjb250cmlidXRlZCB0byBpdHMgZGV2ZWxvcG1lbnQuCisKK0tlaXRoIE91dHdhdGVyCitTci4gU3RhZmYgRW5naW5lZXIKK01pY3JvdmlzaW9uLCBJbmMuCis8a2VpdGhfb3V0d2F0ZXJAbXZpcy5jb20+Cis8b3V0d2F0ZXJAZXNraW1vLmNvbT4KKwordmltOiBzZXQgdHM9NCBzdz00IHR3PTc4OgorCmRpZmYgLS1naXQgYS9ib2FyZC9nZW44NjB0L2JlZXBlci5jIGIvYm9hcmQvZ2VuODYwdC9iZWVwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmZlNjZiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZ2VuODYwdC9iZWVwZXIuYwpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogS2VpdGggT3V0d2F0ZXIsIGtlaXRoX291dHdhdGVyQG12aXMuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzh4eC5oPgorI2luY2x1ZGUgPGFzbS84eHhfaW1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisvKgorICogQmFzaWMgYmVlcGVyIHN1cHBvcnQgZm9yIHRoZSBHRU44NjBUIGJvYXJkLiAgVGhlIEdFTjg2MFQgaW5jbHVkZXMKKyAqIGFuIGF1ZGlvIHNvdW5kZXIgZHJpdmVuIGJ5IGEgUGhpbGxpcHMgVERBODU1MSBhbXBsaWZpZXIuICBUaGUKKyAqIFREQTg1NTEgZmVhdHVyZXMgYSBkaWdpdGFsIHZvbHVtZSBjb250cm9sIHdoaWNoIHVzZXMgYSAidHJpbmFyeSIKKyAqIGlucHV0IChoaWdoL2hpZ2gtWi9sb3cpIHRvIHNldCB2b2x1bWUuICBUaGUgODYwJ3MgU1BLUk9VVCBwaW4KKyAqIGRyaXZlcyB0aGUgYW1wbGlmaWVyIGlucHV0LgorICovCisKKworLyoKKyAqIEluaXRpYWxpemUgYmVlcGVyLXJlbGF0ZWQgaGFyZHdhcmUuIEluaXRpYWxpemUgdGltZXIgMSBmb3IgdXNlIHdpdGgKKyAqIHRoZSBiZWVwZXIuIFVzZSA2NiBNaHogaW50ZXJuYWwgY2xvY2sgd2l0aCBwcmVzY2FsZSBvZiAzMyB0byBnZXQKKyAqIDEgdVMgcGVyaW9kIHBlciBjb3VudC4KKyAqIEZJWE1FOiB3ZSBzaG91bGQgcmVhbGx5IGNvbXB1dGUgdGhlIHByZXNjYWxlIGJhc2VkIG9uIHRoZSByZXBvcnRlZAorICogY29yZSBjbG9jayBmcmVxdWVuY3kuCisgKi8KK3ZvaWQKK2luaXRfYmVlcGVyKHZvaWQpCit7CisgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKworCWltbWFwLT5pbV9jcG10aW1lci5jcG10X3RnY3IgJj0gflRHQ1JfUlNUMSB8IFRHQ1JfU1RQMTsKKwlpbW1hcC0+aW1fY3BtdGltZXIuY3BtdF90bXIxID0gKCgzMyA8PCBUTVJfUFNfU0hJRlQpICYgVE1SX1BTX01TSykKKwkJCQkJCQkJIHwgVE1SX09NIHwgVE1SX0ZSUiB8IFRNUl9JQ0xLX0lOX0dFTjsKKwlpbW1hcC0+aW1fY3BtdGltZXIuY3BtdF90Y24xID0gMDsKKwlpbW1hcC0+aW1fY3BtdGltZXIuY3BtdF90ZXIxID0gMHhmZmZmOworCWltbWFwLT5pbV9jcG10aW1lci5jcG10X3RnY3IgfD0gVEdDUl9SU1QxOworfQorCisKKy8qCisgKiBTZXQgYmVlcGVyIGZyZXF1ZW5jeS4gIE1heCBhbGxvd2VkIGZyZXF1ZW5jeSBpcyAyLjUgS0h6LiAgVGhpcyBsaW1pdAorICogaXMgbW9zdGx5IGFyYml0cmFyeSwgYnV0IHRoZSBiZWVwZXIgaXNuJ3QgcmVhbGx5IG11Y2ggZ29vZCBiZXlvbmQgdGhpcworICogZnJlcXVlbmN5LgorICovCit2b2lkCitzZXRfYmVlcGVyX2ZyZXF1ZW5jeSh1aW50IGZyZXF1ZW5jeSkKK3sKKyNkZWZpbmUgRlJFUV9MSU1JVAkyNTAwCisKKyAgICB2b2xhdGlsZSBpbW1hcF90ICppbW1hcCAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworCisJLyoKKwkgKiBDb21wdXRlIHRpbWVyIHRpY2tzIGdpdmVuIGRlc2lyZWQgZnJlcXVlbmN5LiAgVGhlIHRpbWVyIGlzIHNldCB1cAorCSAqIHRvIGNvdW50IDAuNSB1UyBwZXIgdGljayBhbmQgaXQgdGFrZXMgdHdvIHRpY2tzIHBlciBjeWNsZSAoSHopLgorCSAqLworCWlmIChmcmVxdWVuY3kgPiBGUkVRX0xJTUlUKSBmcmVxdWVuY3kgPSBGUkVRX0xJTUlUOworCWZyZXF1ZW5jeSA9IDEwMDAwMDAvZnJlcXVlbmN5OworCWltbWFwLT5pbV9jcG10aW1lci5jcG10X3RycjEgPSAodXNob3J0KWZyZXF1ZW5jeTsKK30KKworCisvKgorICogVHVybiB0aGUgYmVlcGVyIG9uCisgKi8KK3ZvaWQKK2JlZXBlcl9vbih2b2lkKQoreworICAgIHZvbGF0aWxlIGltbWFwX3QgKmltbWFwICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisKKwlpbW1hcC0+aW1fY3BtdGltZXIuY3BtdF90Z2NyICY9IH5UR0NSX1NUUDE7Cit9CisKKworLyoKKyAqIFR1cm4gdGhlIGJlZXBlciBvZmYKKyAqLwordm9pZAorYmVlcGVyX29mZih2b2lkKQoreworICAgIHZvbGF0aWxlIGltbWFwX3QgKmltbWFwICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisKKwlpbW1hcC0+aW1fY3BtdGltZXIuY3BtdF90Z2NyIHw9IFRHQ1JfU1RQMTsKK30KKworCisvKgorICogSW5jcmVhc2Ugb3IgZGVjcmVhc2UgdGhlIGJlZXBlciB2b2x1bWUuICBWb2x1bWUgY2FuIGJlIHNldAorICogZnJvbSBvZmYgdG8gZnVsbCBpbiA2NCBzdGVwcy4gIFRvIGluY3JlYXNlIHZvbHVtZSwgdGhlIG91dHB1dAorICogcGluIGlzIGFjdGl2ZWx5IGRyaXZlbiBoaWdoLCB0aGVuIHJldHVybmVkIHRvIHRyaXN0YXRlLgorICogVG8gZGVjcmVhc2Ugdm9sdW1lLCBvdXRwdXQgYSBsb3cgb24gdGhlIHBvcnQgcGluIChubyBuZWVkIHRvCisgKiBjaGFuZ2UgcGluIG1vZGUgdG8gdHJpc3RhdGUpIHRoZW4gb3V0cHV0IGEgaGlnaCB0byBnbyBiYWNrIHRvCisgKiB0cmlzdGF0ZS4KKyAqLwordm9pZAorc2V0X2JlZXBlcl92b2x1bWUoaW50IHN0ZXBzKQoreworICAgIHZvbGF0aWxlIGltbWFwX3QgKmltbWFwICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJaW50IGk7CisKKwlpZiAoc3RlcHMgPj0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgKHN0ZXBzID49IDY0ID8gNjQgOiBzdGVwcyk7IGkrKykgeworCQkJaW1tYXAtPmltX2NwbS5jcF9wYm9kciAmPSB+KDB4ODAwMDAwMDAgPj4gMTkpOworCQkJdWRlbGF5KDEpOworCQkJaW1tYXAtPmltX2NwbS5jcF9wYm9kciB8PSAoMHg4MDAwMDAwMCA+PiAxOSk7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwl9CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPiAoc3RlcHMgPD0gLTY0ID8gLTY0IDogc3RlcHMpOyBpLS0pIHsKKwkJCWltbWFwLT5pbV9jcG0uY3BfcGJkYXQgJj0gfigweDgwMDAwMDAwID4+IDE5KTsKKwkJCXVkZWxheSgxKTsKKwkJCWltbWFwLT5pbV9jcG0uY3BfcGJkYXQgfD0gKDB4ODAwMDAwMDAgPj4gMTkpOworCQkJdWRlbGF5KDEpOworCQl9CisJfQorfQorCisKKy8qCisgKiBDaGVjayB0aGUgZW52aXJvbm1lbnQgdG8gc2VlIGlmIHRoZSBiZWVwZXIgbmVlZHMgYmVlcGluZy4KKyAqIENvbnRyb2xsZWQgYnkgYSBzZXF1ZW5jZSBvZiB0aGUgZm9ybToKKyAqIGZyZXEvZGVsdGEgdm9sdW1lL29uIHRpbWUvb2ZmIHRpbWU7Li4uIHdoZXJlOgorICogZnJlcSAJCT0gZnJlcXVlbmN5IGluIEh6ICgwIC0gMjUwMCkKKyAqIGRlbHRhIHZvbHVtZSA9IHZvbHVtZSBzdGVwcyB1cCBvciBkb3duICgtNjQgPD0gdm9sIDw9IDY0KQorICogb24gdGltZQkJPSB0aW1lIGluIG1TCisgKiBvZmYgdGltZQkJPSB0aW1lIGluIG1TCisgKgorICogUmV0dXJuIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlCisgKi8KK2ludAorZG9fYmVlcGVyKGNoYXIgKnNlcXVlbmNlKQoreworI2RlZmluZSBERUxJTUlURVIJJzsnCisKK2ludCBhcmdzWzRdOworaW50IGk7CitpbnQgdmFsOworY2hhciAqcCA9IHNlcXVlbmNlOworY2hhciAqdHA7CisKKwkvKgorCSAqIFBhcnNlIHRoZSBjb250cm9sIHNlcXVlbmNlLiAgVGhpcyBpcyBhIHJlYWxseSBzaW1wbGUgcGFyc2VyCisJICogd2l0aG91dCBhbnkgcmVhbCBlcnJvciBjaGVja2luZy4gIFlvdSBjYW4gcHJvYmFibHkgYmxvdyBpdAorCSAqIHVwIHJlYWxseSBlYXNpbHkuCisJICovCisJaWYgKCpwID09ICdcMCcgfHwgIWlzZGlnaXQoKnApKSB7CisJCXByaW50ZigiJXM6JWQ6IG51bGwgb3IgaW52YWxpZCBzdHJpbmcgKCVzKVxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIHApOworCQlyZXR1cm4gMDsKKwl9CisKKwlpID0gMDsKKwl3aGlsZSAoKnAgIT0gJ1wwJykgeworCQl3aGlsZSAoKnAgIT0gREVMSU1JVEVSKSB7CisJCQlpZiAoaSA+IDMpIGkgPSAwOworCQkJdmFsID0gKGludCkgc2ltcGxlX3N0cnRvbChwLCAmdHAsIDApOworCQkJaWYgKHRwID09IHApIHsKKwkJCQlwcmludGYoIiVzOiVkOiBubyBkaWdpdHMgb3IgYmFkIGZvcm1hdFxuIiwKKwkJCQkJCQkJX19GSUxFX18sX19MSU5FX18pOworCQkJCXJldHVybiAwOworCQkJfQorCQkJZWxzZSB7CisJCQkJYXJnc1tpXSA9IHZhbDsKKwkJCX0KKworCQkJaSsrOworCQkJaWYgKCp0cCA9PSBERUxJTUlURVIpCisJCQkJcCA9IHRwOworCQkJZWxzZQorCQkJCXAgPSArK3RwOworCQl9CisJCXArKzsKKworCQkvKgorCQkgKiBXZWxsLCB3ZSBnb3Qgc29tZXRoaW5nIHRoYXQgaGFzIGEgY2hhbmNlIG9mIGJlaW5nIGNvcnJlY3QKKwkJICovCisjaWYgMAorCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlwcmludGYoIiVzOiVkOmFyZyAlZCA9ICVkXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIGksIGFyZ3NbaV0pOworCQl9CisJCXByaW50ZigiXG4iKTsKKyNlbmRpZgorCisJCXNldF9iZWVwZXJfZnJlcXVlbmN5KGFyZ3NbMF0pOworCQlzZXRfYmVlcGVyX3ZvbHVtZShhcmdzWzFdKTsKKwkJYmVlcGVyX29uKCk7CisJCXVkZWxheSgxMDAwICogYXJnc1syXSk7CisJCWJlZXBlcl9vZmYoKTsKKwkJdWRlbGF5KDEwMDAgKiBhcmdzWzNdKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIHZpbTogc2V0IHRzPTQgc3c9NCB0dz03ODogKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2dlbjg2MHQvZmxhc2guYyBiL2JvYXJkL2dlbjg2MHQvZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDJiMWIwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZ2VuODYwdC9mbGFzaC5jCkBAIC0wLDAgKzEsNjQ0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICogS2VpdGggT3V0d2F0ZXIsIGtlaXRoX291dHdhdGVyQG12c2kuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzh4eC5oPgorCisjaWYgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0ZMQVNIKQorIyBpZm5kZWYgIENGR19FTlZfQUREUgorIyAgZGVmaW5lIENGR19FTlZfQUREUgkoQ0ZHX0ZMQVNIX0JBU0UgKyBDRkdfRU5WX09GRlNFVCkKKyMgZW5kaWYKKyMgaWZuZGVmICBDRkdfRU5WX1NJWkUKKyMgIGRlZmluZSBDRkdfRU5WX1NJWkUJQ0ZHX0VOVl9TRUNUX1NJWkUKKyMgZW5kaWYKKyMgaWZuZGVmICBDRkdfRU5WX1NFQ1RfU0laRQorIyAgZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFICBDRkdfRU5WX1NJWkUKKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogVXNlIGJ1ZmZlcmVkIHdyaXRlcyB0byBmbGFzaCBieSBkZWZhdWx0IC0gdGhleSBhcmUgYWJvdXQgMzJ4IGZhc3RlciB0aGFuCisgKiBzaW5nbGUgYnl0ZSB3cml0ZXMuCisgKi8KKyNpZm5kZWYgIENGR19HRU44NjBUX0ZMQVNIX1VTRV9XUklURV9CVUZGRVIKKyNkZWZpbmUgQ0ZHX0dFTjg2MFRfRkxBU0hfVVNFX1dSSVRFX0JVRkZFUgorI2VuZGlmCisKKy8qCisgKiBNYXggdGltZSB0byB3YWl0IChpbiBtUykgZm9yIGZsYXNoIGRldmljZSB0byBhbGxvY2F0ZSBhIHdyaXRlIGJ1ZmZlci4KKyAqLworI2lmbmRlZiBDRkdfRkxBU0hfQUxMT0NfQlVGRkVSX1RPVVQKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0FMTE9DX0JVRkZFUl9UT1VUCQkxMDAKKyNlbmRpZgorCisvKgorICogVGhlc2UgZnVuY3Rpb25zIHN1cHBvcnQgYSBzaW5nbGUgSW50ZWwgU3RyYXRhRmxhc2ggZGV2aWNlICgyOEYxMjhKM0EpCisgKiBpbiBieXRlIG1vZGUgb25seSEuICBUaGUgZmxhc2ggcm91dGluZXMgYXJlIHZlcnkgYmFzaWMgYW5kIHNpbXBsZQorICogc2luY2UgdGhlcmUgaXNuJ3QgcmVhbGx5IGFueSByZW1hcHBpbmcgbmVjZXNzYXJ5LgorICovCisKKy8qCisgKiBJbnRlbCBTQ1MgKFNjYWxhYmxlIENvbW1hbmQgU2V0KSBjb21tYW5kIGRlZmluaXRpb25zCisgKiAodGFrZW4gZnJvbSAyOEYxMjhKM0EgZGF0YXNoZWV0KQorICovCisjZGVmaW5lIFNDU19SRUFEX0NNRAkJCQkweGZmCisjZGVmaW5lIFNDU19SRUFEX0lEX0NNRAkJCQkweDkwCisjZGVmaW5lIFNDU19RVUVSWV9DTUQJCQkJMHg5OAorI2RlZmluZSBTQ1NfUkVBRF9TVEFUVVNfQ01ECQkJMHg3MAorI2RlZmluZSBTQ1NfQ0xFQVJfU1RBVFVTX0NNRAkJMHg1MAorI2RlZmluZSBTQ1NfV1JJVEVfQlVGX0NNRAkJCTB4ZTgKKyNkZWZpbmUgU0NTX1BST0dSQU1fQ01ECQkJCTB4NDAKKyNkZWZpbmUgU0NTX0JMT0NLX0VSQVNFX0NNRAkJCTB4MjAKKyNkZWZpbmUgU0NTX0JMT0NLX0VSQVNFX1JFU1VNRV9DTUQJMHhkMAorI2RlZmluZSBTQ1NfUFJPR1JBTV9SRVNVTUVfQ01ECQkweGQwCisjZGVmaW5lIFNDU19CTE9DS19FUkFTRV9TVVNQRU5EX0NNRAkweGIwCisjZGVmaW5lIFNDU19TRVRfQkxPQ0tfTE9DS19DTUQJCTB4NjAKKyNkZWZpbmUgU0NTX0NMUl9CTE9DS19MT0NLX0NNRAkJMHg2MAorCisvKgorICogU0NTIHN0YXR1cy9leHRlbmRlZCBzdGF0dXMgcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgIFNDU19TUjcJCQkJCTB4ODAKKyNkZWZpbmUgIFNDU19YU1I3CQkJCQkweDgwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAwCisjZGVmaW5lIERFQlVHX0ZMQVNICisjZW5kaWYKKworI2lmZGVmIERFQlVHX0ZMQVNICisjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikgcHJpbnRmKGZtdCAsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ZsYXNoX2luZm9fdAlmbGFzaF9pbmZvW0NGR19NQVhfRkxBU0hfQkFOS1NdOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbnMKKyAqLworc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplICh2dV9jaGFyICphZGRyLCBmbGFzaF9pbmZvX3QgKmluZm8pOworc3RhdGljIGludCB3cml0ZV9kYXRhOCAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1Y2hhciBkYXRhKTsKK3N0YXRpYyB2b2lkIGZsYXNoX2dldF9vZmZzZXRzICh1bG9uZyBiYXNlLCBmbGFzaF9pbmZvX3QgKmluZm8pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbml0aWFsaXplIHRoZSBmbGFzaCBtZW1vcnkuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK2ZsYXNoX2luaXQgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAgICAgKmltbWFwICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOworCXVuc2lnbmVkIGxvbmcgc2l6ZV9iMDsKKwlpbnQgaTsKKworCWZvciAoaT0gMDsgaSA8IENGR19NQVhfRkxBU0hfQkFOS1M7ICsraSkgeworCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwl9CisKKwkvKgorCSAqIFRoZSBnZW44NjB0IGJvYXJkIG9ubHkgaGFzIG9uZSBGTEFTSCBtZW1vcnkgZGV2aWNlLCBzbyB0aGUKKwkgKiBGTEFTSCBCYW5rIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSBzdGF0aWNhbGx5LgorCSAqLworCVBSSU5URigiXG4jIyBHZXQgZmxhc2ggYmFuayAxIHNpemUgQCAweCUwOHhcbiIsIEZMQVNIX0JBU0UwX1BSRUxJTSk7CisJc2l6ZV9iMCA9IGZsYXNoX2dldF9zaXplKCh2dV9jaGFyICopRkxBU0hfQkFTRTBfUFJFTElNLCAmZmxhc2hfaW5mb1swXSk7CisJaWYgKGZsYXNoX2luZm9bMF0uZmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlwcmludGYgKCIjIyBVbmtub3duIEZMQVNIIG9uIEJhbmsgMDogIgorCQkJCSJJRCAweCVseCwgU2l6ZSA9IDB4JTA4bHggPSAlbGQgTUJcbiIsCisJCQkJZmxhc2hfaW5mb1swXS5mbGFzaF9pZCxzaXplX2IwLCBzaXplX2IwIDw8IDIwKTsKKwl9CisKKwlQUklOVEYoIiMjIEJlZm9yZSByZW1hcDpcbiIKKwkJICAgIiAgQlIwOiAweCUwOHggICAgT1IwOiAweCUwOHhcbiAgQlIxOiAweCUwOHggICAgT1IxOiAweCUwOHhcbiIsCisJCSAgIG1lbWN0bC0+bWVtY19icjAsIG1lbWN0bC0+bWVtY19vcjAsCisJCSAgIG1lbWN0bC0+bWVtY19icjEsIG1lbWN0bC0+bWVtY19vcjEpOworCisJLyoKKwkgKiBSZW1hcCBGTEFTSCBhY2NvcmRpbmcgdG8gcmVhbCBzaXplCisJICovCisJbWVtY3RsLT5tZW1jX29yMCB8PSAoLXNpemVfYjAgJiAweEZGRkY4MDAwKTsKKwltZW1jdGwtPm1lbWNfYnIwIHw9IChDRkdfRkxBU0hfQkFTRSAmIEJSX0JBX01TSyk7CisKKwlQUklOVEYoIiMjIEFmdGVyIHJlbWFwOlxuIgorCQkgICAiICBCUjA6IDB4JTA4eCAgICBPUjA6IDB4JTA4eFxuIiwgbWVtY3RsLT5tZW1jX2JyMCwgbWVtY3RsLT5tZW1jX29yMCk7CisKKwkvKgorCSAqIFJlLWRvIHNpemluZyB0byBnZXQgZnVsbCBjb3JyZWN0IGluZm8KKwkgKi8KKwlzaXplX2IwID0gZmxhc2hfZ2V0X3NpemUgKCh2dV9jaGFyICopQ0ZHX0ZMQVNIX0JBU0UsICZmbGFzaF9pbmZvWzBdKTsKKwlmbGFzaF9nZXRfb2Zmc2V0cyAoQ0ZHX0ZMQVNIX0JBU0UsICZmbGFzaF9pbmZvWzBdKTsKKwlmbGFzaF9pbmZvWzBdLnNpemUgPSBzaXplX2IwOworCisjaWYgQ0ZHX01PTklUT1JfQkFTRSA+PSBDRkdfRkxBU0hfQkFTRQorCS8qCisJICogTW9uaXRvciBwcm90ZWN0aW9uIGlzIE9OIGJ5IGRlZmF1bHQKKwkgKi8KKwlmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCSAgICAgIAkgIENGR19NT05JVE9SX0JBU0UsCisJCSAgICAgIAkgIENGR19NT05JVE9SX0JBU0UgKyBDRkdfTU9OSVRPUl9MRU4gLSAxLAorCQkgICAgICAJICAmZmxhc2hfaW5mb1swXSk7CisjZW5kaWYKKworI2lmZGVmCUNGR19FTlZfSVNfSU5fRkxBU0gKKwkvKgorCSAqIEVudmlyb25tZW50IHByb3RlY3Rpb24gT04gYnkgZGVmYXVsdAorCSAqLworCWZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwKKwkJICAgICAgCSAgQ0ZHX0VOVl9BRERSLAorCQkgICAgICAJICBDRkdfRU5WX0FERFIgKyBDRkdfRU5WX1NFQ1RfU0laRSAtIDEsCisJCSAgICAgIAkgICZmbGFzaF9pbmZvWzBdKTsKKyNlbmRpZgorCisJUFJJTlRGKCIjIyBGaW5hbCBGbGFzaCBiYW5rIHNpemU6IDB4JTA4bHhcbiIsc2l6ZV9iMCk7CisJcmV0dXJuIChzaXplX2IwKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGaWxsIGluIHRoZSBGTEFTSCBvZmZzZXQgdGFibGUKKyAqLworc3RhdGljIHZvaWQKK2ZsYXNoX2dldF9vZmZzZXRzICh1bG9uZyBiYXNlLCBmbGFzaF9pbmZvX3QgKmluZm8pCit7CisJaW50IGk7CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSB7CisJCWNhc2UgRkxBU0hfTUFOX0lOVEVMOgorCSAgICAJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisJCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlOworCQkJCWJhc2UgKz0gMTAyNCAqIDEyODsKKwkgICAgCX0KKwkgICAgCXJldHVybjsKKworCQlkZWZhdWx0OgorCSAgIAkJcHJpbnRmICgiRG9uJ3Qga25vdyBzZWN0b3Igb2Zmc2V0cyBmb3IgRkxBU0giCisJCQkgICAgICAgICIgdHlwZSAweCVseFxuIiwgaW5mby0+Zmxhc2hfaWQpOworCSAgICByZXR1cm47CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERpc3BsYXkgRkxBU0ggZGV2aWNlIGluZm8KKyAqLwordm9pZAorZmxhc2hfcHJpbnRfaW5mbyAoZmxhc2hfaW5mb190ICppbmZvKQoreworCWludCBpOworCisJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJcHJpbnRmICgiTWlzc2luZyBvciB1bmtub3duIEZMQVNIIHR5cGVcbiIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSB7CisJY2FzZSBGTEFTSF9NQU5fSU5URUw6CisJCQlwcmludGYgKCJJbnRlbCAiKTsKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCQlwcmludGYgKCJVbmtub3duIFZlbmRvciAiKTsKKwkJCWJyZWFrOworCX0KKworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworCWNhc2UgRkxBU0hfMjhGMTI4SjNBOgorCQkJcHJpbnRmICgiMjhGMTI4SjNBICgxMjhNYml0ID0gMTI4SyB4IDEyOClcbiIpOworCQkJYnJlYWs7CisJZGVmYXVsdDoKKwkJCXByaW50ZiAoIlVua25vd24gQ2hpcCBUeXBlXG4iKTsKKwkJCWJyZWFrOworCX0KKworCWlmIChpbmZvLT5zaXplID49ICgxMDI0ICogMTAyNCkpIHsKKwkJaSA9IDIwOworCX0gZWxzZSB7CisJCWkgPSAxMDsKKwl9CisJcHJpbnRmICgiICBTaXplOiAlbGQgJWNCIGluICVkIFNlY3RvcnNcbiIsCisJCQlpbmZvLT5zaXplID4+IGksCisJCQkoaSA9PSAyMCkgPyAnTScgOiAnaycsCisJCQlpbmZvLT5zZWN0b3JfY291bnQpOworCisJcHJpbnRmICgiICBTZWN0b3IgU3RhcnQgQWRkcmVzc2VzOiIpOworCWZvciAoaT0wOyBpPGluZm8tPnNlY3Rvcl9jb3VudDsgKytpKSB7CisJCWlmICgoaSAlIDUpID09IDApCisJCQlwcmludGYgKCJcbiAgICIpOworCQkJcHJpbnRmICgiICUwOGxYJXMiLAorCQkJaW5mby0+c3RhcnRbaV0sCisJCQlpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIKKwkJKTsKKwl9CisJcHJpbnRmICgiXG4iKTsKKwlyZXR1cm47Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2V0IHNpemUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciBhIEZMQVNIIGRldmljZS4KKyAqIE5PVEU6IFRoZSBmb2xsb3dpbmcgY29kZSBjYW5ub3QgYmUgcnVuIGZyb20gRkxBU0ghCisgKi8KK3N0YXRpYwordWxvbmcgZmxhc2hfZ2V0X3NpemUgKHZ1X2NoYXIgKmFkZHIsIGZsYXNoX2luZm9fdCAqaW5mbykKK3sKKyNkZWZpbmUgTk9fRkxBU0gJMAorCisJdnVfY2hhciB2YWx1ZVsyXTsKKworCS8qCisJICogVHJ5IHRvIHJlYWQgdGhlIG1hbnVmYWN0dXJlciBJRAorCSAqLworCWFkZHJbMF0gPSBTQ1NfUkVBRF9DTUQ7CisJYWRkclswXSA9IFNDU19SRUFEX0lEX0NNRDsKKwl2YWx1ZVswXSA9IGFkZHJbMF07CisJdmFsdWVbMV0gPSBhZGRyWzJdOworCWFkZHJbMF0gPSBTQ1NfUkVBRF9DTUQ7CisKKwlQUklOVEYoIk1hbnVmLiBJRCBAIDB4JTA4bHg6IDB4JTAyeFxuIiwgKHVsb25nKWFkZHIsIHZhbHVlWzBdKTsKKwlzd2l0Y2ggKHZhbHVlWzBdKSB7CisJCWNhc2UgKElOVEVMX01BTlVGQUNUICYgMHhmZik6CisJCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX01BTl9JTlRFTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCQkJaW5mby0+c2VjdG9yX2NvdW50ID0gMDsKKwkJCWluZm8tPnNpemUgPSAwOworCQkJcmV0dXJuIChOT19GTEFTSCk7CisJfQorCisJLyoKKwkgKiBSZWFkIHRoZSBkZXZpY2UgSUQKKwkgKi8KKwlQUklOVEYoIkRldmljZSBJRCBAIDB4JTA4bHg6IDB4JTAyeFxuIiwgKHVsb25nKSgmYWRkclsyXSksIHZhbHVlWzFdKTsKKwlzd2l0Y2ggKHZhbHVlWzFdKSB7CisJCWNhc2UgKElOVEVMX0lEXzI4RjEyOEozQSAmIDB4ZmYpOgorCQkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfMjhGMTI4SjNBOworCQkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTI4OworCQkJaW5mby0+c2l6ZSA9IDE2ICogMTAyNCAqIDEwMjQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCQkJcmV0dXJuIChOT19GTEFTSCk7CisJfQorCisJaWYgKGluZm8tPnNlY3Rvcl9jb3VudCA+IENGR19NQVhfRkxBU0hfU0VDVCkgeworCQlwcmludGYgKCIqKiBFUlJPUjogc2VjdG9yIGNvdW50ICVkID4gbWF4ICglZCkgKipcbiIsCisJCQkJaW5mby0+c2VjdG9yX2NvdW50LCBDRkdfTUFYX0ZMQVNIX1NFQ1QpOworCQkJCWluZm8tPnNlY3Rvcl9jb3VudCA9IENGR19NQVhfRkxBU0hfU0VDVDsKKwl9CisJcmV0dXJuIChpbmZvLT5zaXplKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFcmFzZSB0aGUgc3BlY2lmaWVkIHNlY3RvcnMgaW4gdGhlIHNwZWNpZmllZCBGTEFTSCBkZXZpY2UKKyAqLworaW50CitmbGFzaF9lcmFzZShmbGFzaF9pbmZvX3QgKmluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KQoreworCWludCBmbGFnLCBwcm90LCBzZWN0OworCXVsb25nIHN0YXJ0LCBub3csIGxhc3Q7CisKKwlpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwkJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJCXByaW50ZiAoIi0gbWlzc2luZ1xuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCItIG5vIHNlY3RvcnMgdG8gZXJhc2VcbiIpOworCQl9CisJCXJldHVybiAxOworCX0KKworCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgIT0gRkxBU0hfTUFOX0lOVEVMKSB7CisJCXByaW50ZiAoIkNhbiBlcmFzZSBvbmx5IEludGVsIGZsYXNoIHR5cGVzIC0gYWJvcnRlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCXByb3QgPSAwOworCWZvciAoc2VjdD1zX2ZpcnN0OyBzZWN0PD1zX2xhc3Q7ICsrc2VjdCkgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkgeworCQkJcHJvdCsrOworCQl9CisJfQorCisJaWYgKHByb3QpIHsKKwkJcHJpbnRmICgiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyB3aWxsIG5vdCBiZSBlcmFzZWQhXG4iLAorCQkJCXByb3QpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIlxuIik7CisJfQorCisJc3RhcnQgPSBnZXRfdGltZXIgKDApOworCWxhc3QgID0gc3RhcnQ7CisKKwkvKgorCSAqIFN0YXJ0IGVyYXNlIG9uIHVucHJvdGVjdGVkIHNlY3RvcnMKKwkgKi8KKwlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0PD1zX2xhc3Q7IHNlY3QrKykgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSA9PSAwKSB7CS8qIG5vdCBwcm90ZWN0ZWQgKi8KKwkJCXZ1X2NoYXIgKmFkZHIgPSAodWNoYXIgKikoaW5mby0+c3RhcnRbc2VjdF0pOworCQkJdnVfY2hhciBzdGF0dXM7CisKKwkJCS8qCisJCQkgKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0CisJCQkgKi8KKwkJCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCQkJKmFkZHIgPSBTQ1NfQ0xFQVJfU1RBVFVTX0NNRDsKKwkJCSphZGRyID0gU0NTX0JMT0NLX0VSQVNFX0NNRDsKKwkJCSphZGRyID0gU0NTX0JMT0NLX0VSQVNFX1JFU1VNRV9DTUQ7CisKKwkJCS8qCisJCQkgKiBSZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkKKwkJCSAqLworCQkJaWYgKGZsYWcpCisJCQkJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCQkJLyoKKwkJCSAqIFdhaXQgYXQgbGVhc3QgODB1cyAtIGxldCdzIHdhaXQgMSBtcworCQkJICovCisJCQl1ZGVsYXkgKDEwMDApOworCisJCQl3aGlsZSAoKChzdGF0dXMgPSAqYWRkcikgJiBTQ1NfU1I3KSAhPSBTQ1NfU1I3KSB7CisJCQkJaWYgKChub3c9Z2V0X3RpbWVyKHN0YXJ0KSkgPiBDRkdfRkxBU0hfRVJBU0VfVE9VVCkgeworCQkJCQlwcmludGYgKCJUaW1lb3V0XG4iKTsKKwkJCQkJKmFkZHIgPSBTQ1NfQkxPQ0tfRVJBU0VfU1VTUEVORF9DTUQ7CisJCQkJCSphZGRyID0gU0NTX1JFQURfQ01EOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIFNob3cgdGhhdCB3ZSdyZSB3YWl0aW5nCisJCQkJICovCisJCQkJaWYgKChub3cgLSBsYXN0KSA+IDEwMDApIHsJLyogMSBzZWNvbmQgKi8KKwkJCQkJcHV0YyAoJy4nKTsKKwkJCQkJbGFzdCA9IG5vdzsKKwkJCQl9CisJCQl9CisJCQkqYWRkciA9IFNDU19SRUFEX0NNRDsKKwkJfQorCX0KKwlwcmludGYgKCIgZG9uZVxuIik7CisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIENGR19HRU44NjBUX0ZMQVNIX1VTRV9XUklURV9CVUZGRVIKKy8qCisgKiBBbGxvY2F0ZSBhIGZsYXNoIGJ1ZmZlciwgZmlsbCBpdCB3aXRoIGRhdGEgYW5kIHdyaXRlIGl0IHRvIHRoZSBmbGFzaC4KKyAqIDAgLSBPSworICogMSAtIFRpbWVvdXQgb24gYnVmZmVyIHJlcXVlc3QKKyAqCisgKiBOT1RFOiBBZnRlciB0aGUgbGFzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIFdTTSBzdGF0dXMgbmVlZHMgdG8gYmUgY2hlY2tlZCEKKyAqLworc3RhdGljIGludAord3JpdGVfZmxhc2hfYnVmZmVyOChmbGFzaF9pbmZvX3QgKmluZm9fcCwgdnVfY2hhciAqc3JjX3AsIHZ1X2NoYXIgKmRlc3RfcCwKKwkJCQkgICAgdWludCBjb3VudCkKK3sKKwl2dV9jaGFyICpibG9ja19hZGRyX3AgPSBOVUxMOworCXZ1X2NoYXIgKnN0YXJ0X2FkZHJfcCA9IE5VTEw7CisJdWxvbmcgYmxvY2tzaXplID0gaW5mb19wLT5zaXplIC8gKHVsb25nKWluZm9fcC0+c2VjdG9yX2NvdW50OworCisJaW50IGk7CisJdWludCB0aW1lID0gZ2V0X3RpbWVyKDApOworCisJUFJJTlRGKCIlczolZDogc3JjOiAweCVwIGRlc3Q6IDB4JXAgIGNvdW50OiAlZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgc3JjX3AsIGRlc3RfcCwgY291bnQpOworCisJLyoKKwkgKiBXaGF0IGJsb2NrIGFyZSB3ZSBpbj8gV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIHNvdXJjZSBhZGRyZXNzIGlzCisJICogaW4gdGhlIGZsYXNoIGFkZHJlc3MgcmFuZ2UsIGJ1dCB3ZSBhbHNvIGNhbid0IGNyb3NzIGEgYmxvY2sgYm91bmRhcnkuCisJICogV2UgYXNzdW1lIHRoYXQgdGhlIGJsb2NrIGRvZXMgbm90IGNyb3NzIGEgYm91bmRhcnkgKHdlJ2xsIGNoZWNrIGJlZm9yZQorCSAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbikuCisJICovCisgCWZvciAoaSA9IDA7IGkgPCBpbmZvX3AtPnNlY3Rvcl9jb3VudDsgKytpKSB7CisJCWlmICggKCh1bG9uZylkZXN0X3AgPj0gaW5mb19wLT5zdGFydFtpXSkgJiYKKwkJICAgICgodWxvbmcpZGVzdF9wIDwgKGluZm9fcC0+c3RhcnRbaV0gKyBibG9ja3NpemUpKSApIHsKKwkJCVBSSU5URigiJXM6JWQ6IERlc3QgYWRkciAweCVwIGlzIGluIGJsb2NrICVkIEAgMHglLjhseFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBkZXN0X3AsIGksIGluZm9fcC0+c3RhcnRbaV0pOworCQkJYmxvY2tfYWRkcl9wID0gKHZ1X2NoYXIgKilpbmZvX3AtPnN0YXJ0W2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIFJlcXVlc3QgYSBidWZmZXIKKwkgKi8KKwkqYmxvY2tfYWRkcl9wID0gU0NTX1dSSVRFX0JVRl9DTUQ7CisJd2hpbGUgKCgqYmxvY2tfYWRkcl9wICYgU0NTX1hTUjcpICE9IFNDU19YU1I3KSB7CisJCWlmIChnZXRfdGltZXIodGltZSkgPiAgQ0ZHX0ZMQVNIX0FMTE9DX0JVRkZFUl9UT1VUKSB7CisJCQlQUklOVEYoIiVzOiVkOiBCdWZmZXIgYWxsb2NhdGlvbiB0aW1lb3V0IEAgMHglcCAod2FpdGVkICVkIG1TKVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBibG9ja19hZGRyX3AsCisJCQkJICAgQ0ZHX0ZMQVNIX0FMTE9DX0JVRkZFUl9UT1VUKTsKKwkJCXJldHVybiAxOworCQl9CisJCSpibG9ja19hZGRyX3AgPSBTQ1NfV1JJVEVfQlVGX0NNRDsKKwl9CisKKwkvKgorCSAqIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIGRhdGEKKwkgKi8KKwlzdGFydF9hZGRyX3AgPSBkZXN0X3A7CisJKmJsb2NrX2FkZHJfcCA9IGNvdW50IC0gMTsgLyogZmxhc2ggZGV2aWNlIHdhbnRzIGNvdW50IC0gMSAqLworCVBSSU5URigiJXM6JWQ6IEZpbGwgYnVmZmVyIGF0IGJsb2NrIGFkZHIgMHglcFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgYmxvY2tfYWRkcl9wKTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkqc3RhcnRfYWRkcl9wKysgPSAqc3JjX3ArKzsKKwl9CisKKwkvKgorCSAqIEZsdXNoIGJ1ZmZlciB0byBmbGFzaAorCSAqLworCSpibG9ja19hZGRyX3AgPSBTQ1NfUFJPR1JBTV9SRVNVTUVfQ01EOworI2lmIDEKKwl0aW1lID0gZ2V0X3RpbWVyKDApOworCXdoaWxlICgoKmJsb2NrX2FkZHJfcCAmIFNDU19TUjcpICE9IFNDU19TUjcpIHsKKwkJaWYgKGdldF90aW1lcih0aW1lKSA+ICBDRkdfRkxBU0hfV1JJVEVfVE9VVCkgeworCQkJUFJJTlRGKCIlczolZDogV3JpdGUgdGltZW91dCBAIDB4JXAgKHdhaXRlZCAlZCBtUylcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgYmxvY2tfYWRkcl9wLCBDRkdfRkxBU0hfV1JJVEVfVE9VVCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5IG1lbW9yeSB0byBmbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKiA0IC0gRmxhc2ggbm90IGlkZW50aWZpZWQKKyAqLworaW50Cit3cml0ZV9idWZmKGZsYXNoX2luZm9fdCAqaW5mb19wLCB1Y2hhciAqc3JjX3AsIHVsb25nIGFkZHIsIHVsb25nIGNvdW50KQoreworCWludCByYyA9IDA7CisjaWZkZWYgQ0ZHX0dFTjg2MFRfRkxBU0hfVVNFX1dSSVRFX0JVRkZFUgorI2RlZmluZSBGTEFTSF9XUklURV9CVUZfU0laRQkweDAwMDAwMDIwCS8qIDMyIGJ5dGVzICovCisJaW50IGk7CisJdWludCBidWZzOworCXVsb25nIGJ1Zl9jb3VudDsKKwl2dV9jaGFyICpzcDsKKwl2dV9jaGFyICpkcDsKKyNlbHNlCisJdWxvbmcgd3A7CisjZW5kaWYKKworCVBSSU5URigiXG4lczolZDogc3JjOiAweCUuOGx4IGRlc3Q6IDB4JS44bHggc2l6ZTogJWQgKDB4JS44bHgpXG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAodWxvbmcpc3JjX3AsIGFkZHIsICh1aW50KWNvdW50LCBjb3VudCk7CisKKwlpZiAoaW5mb19wLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCXJldHVybiA0OworCX0KKworI2lmZGVmIENGR19HRU44NjBUX0ZMQVNIX1VTRV9XUklURV9CVUZGRVIKKwlzcCA9IHNyY19wOworCWRwID0gKHVjaGFyICopYWRkcjsKKworCS8qCisJICogRm9yIG1heGltdW0gcGVyZm9ybWFuY2UsIHdlIHdhbnQgdG8gYWxpZ24gdGhlIHN0YXJ0IGFkZHJlc3MgdG8KKwkgKiB0aGUgYmVnaW5uaW5nIG9mIGEgd3JpdGUgYnVmZmVyIGJvdW5kYXJ5IChpLmUuIEE0LUEwIG9mIHRoZQorCSAqIHN0YXJ0IGFkZHJlc3MgPSAwKS4gU2VlIGhvdyBtYW55IGJ5dGVzIGFyZSByZXF1aXJlZCB0byBnZXQgdG8gYQorCSAqIHdyaXRlLWJ1ZmZlci1hbGlnbmVkIGFkZHJlc3MuICBJZiB0aGF0IG51bWJlciBpcyBub24temVybywgZG8KKwkgKiBub24gYnVmZmVyZWQgd3JpdGVzIG9mIHRoZSBub24tYWxpZ25lZCBkYXRhLiAgQnkgZG9pbmcgbm9uLWJ1ZmZlcmVkCisJICogd3JpdGVzLCB3ZSBhdm9pZCB0aGUgcHJvYmxlbSBvZiBjcm9zc2luZyBhIGJsb2NrIChzZWN0b3IpIGJvdW5kYXJ5CisJICogd2l0aCBidWZmZXJlZCB3cml0ZXMuCisJICovCisJYnVmX2NvdW50ID0gRkxBU0hfV1JJVEVfQlVGX1NJWkUgLSAoYWRkciAmIChGTEFTSF9XUklURV9CVUZfU0laRSAtIDEpKTsKKwlpZiAoYnVmX2NvdW50ID09IEZMQVNIX1dSSVRFX0JVRl9TSVpFKSB7IC8qIGFscmVhZHkgb24gYSBib3VuZGFyeSAqLworCQlidWZfY291bnQgPSAwOworCX0KKwlpZiAoYnVmX2NvdW50ID4gY291bnQpIHsgLyogbm90IGEgZnVsbCBidWZmZXJzIHdvcnRoIG9mIGRhdGEgdG8gd3JpdGUgKi8KKwkJYnVmX2NvdW50ID0gY291bnQ7CisJfQorCWNvdW50IC09IGJ1Zl9jb3VudDsKKworCVBSSU5URigiJXM6JWQ6IFdyaXRlIGJ1ZmZlciBhbGlnbm1lbnQgY291bnQgPSAlbGRcbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGJ1Zl9jb3VudCk7CisJd2hpbGUgKGJ1Zl9jb3VudC0tID49IDEpIHsKKwkJaWYgKChyYyA9IHdyaXRlX2RhdGE4KGluZm9fcCwgKHVsb25nKWRwKyssICpzcCsrKSkgIT0gMCkgIHsKKwkJCXJldHVybiAocmMpOworCQl9CisJfQorCisJUFJJTlRGKCIlczolZDogY291bnQgPSAlbGRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGNvdW50KTsKKwlpZiAoY291bnQgPT0gMCkgeyAvKiBhbGwgZG9uZSAqLworCQlQUklOVEYoIiVzOiVkOiBMZXNzIHRoYW4gMSBidWZmZXIgKCVkKSB3b3J0aCBvZiBieXRlc1xuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIEZMQVNIX1dSSVRFX0JVRl9TSVpFKTsKKwkJcmV0dXJuIChyYyk7CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBhcmUgd3JpdGUgYnVmZmVyIGFsaWduZWQsIHdyaXRlIGZ1bGwgb3IgcGFydGlhbCBidWZmZXJzLgorCSAqIFRoZSBmYWN0IHRoYXQgd2UgYXJlIHdyaXRlIGJ1ZmZlciBhbGlnbmVkIGF1dG9tYXRpY2FsbHkgYXZvaWRzCisJICogY3Jvc3NpbmcgYSBibG9jayBhZGRyZXNzIGR1cmluZyBhIHdyaXRlIGJ1ZmZlciBvcGVyYXRpb24uCisJICovCisJYnVmcyA9IGNvdW50IC8gRkxBU0hfV1JJVEVfQlVGX1NJWkU7CisJUFJJTlRGKCIlczolZDogJWQgKDB4JXgpIGJ1ZmZlcnMgdG8gd3JpdGVcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sCisJCSAgIGJ1ZnMsIGJ1ZnMpOworCXdoaWxlIChidWZzID49IDEpIHsKKwkJcmMgPSB3cml0ZV9mbGFzaF9idWZmZXI4KGluZm9fcCwgc3AsIGRwLCBGTEFTSF9XUklURV9CVUZfU0laRSk7CisJCWlmIChyYyAhPSAwKSB7CisJCQlQUklOVEYoIiVzOiVkOiAqKiBFcnJvciB3cml0aW5nIGJ1ZiAlZFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBidWZzKTsKKwkJCXJldHVybiAocmMpOworCQl9CisJCWJ1ZnMtLTsKKwkJc3AgKz0gRkxBU0hfV1JJVEVfQlVGX1NJWkU7CisJCWRwICs9IEZMQVNIX1dSSVRFX0JVRl9TSVpFOworCX0KKworCS8qCisJICogRG8gdGhlIGxlZnRvdmVycworCSAqLworCWkgPSBjb3VudCAlIEZMQVNIX1dSSVRFX0JVRl9TSVpFOworCVBSSU5URigiJXM6JWQ6ICVkICgweCV4KSBsZWZ0b3ZlciBieXRlc1xuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgaSwgaSk7CisJaWYgKGkgPiAwKSB7CisJCXJjID0gd3JpdGVfZmxhc2hfYnVmZmVyOChpbmZvX3AsIHNwLCBkcCwgaSk7CisJfQorCisJc3AgPSAodnVfY2hhciopaW5mb19wLT5zdGFydFswXTsKKwkqc3AgPSBTQ1NfUkVBRF9DTUQ7CisJcmV0dXJuIChyYyk7CisKKyNlbHNlCisJd3AgPSBhZGRyOworCXdoaWxlIChjb3VudC0tID49IDEpIHsKKwkJaWYoKHJjID0gd3JpdGVfZGF0YTgoaW5mb19wLCB3cCsrLCAqc3JjX3ArKykpICE9IDApCisJCQlyZXR1cm4gKHJjKTsKKwl9CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXcml0ZSBhIGJ5dGUgdG8gRmxhc2gsIHJldHVybnM6CisgKiAwIC0gT0sKKyAqIDEgLSB3cml0ZSB0aW1lb3V0CisgKiAyIC0gRmxhc2ggbm90IGVyYXNlZAorICovCitzdGF0aWMgaW50Cit3cml0ZV9kYXRhOCAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1Y2hhciBkYXRhKQoreworCXZ1X2NoYXIgKmFkZHIgPSAodnVfY2hhciAqKWRlc3Q7CisJdnVfY2hhciBzdGF0dXM7CisJdWxvbmcgc3RhcnQ7CisJaW50IGZsYWc7CisKKwkvKiBDaGVjayBpZiBGbGFzaCBpcyAoc3VmZmljaWVudGx5KSBlcmFzZWQgKi8KKwlpZiAoKCphZGRyICYgZGF0YSkgIT0gZGF0YSkgeworCQlyZXR1cm4gKDIpOworCX0KKwkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKwkqYWRkciA9IFNDU19QUk9HUkFNX0NNRDsKKwkqYWRkciA9IGRhdGE7CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCXN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKworCXdoaWxlICgoKHN0YXR1cyA9ICphZGRyKSAmIFNDU19TUjcpICE9IFNDU19TUjcpIHsKKwkJaWYgKGdldF90aW1lcihzdGFydCkgPiBDRkdfRkxBU0hfV1JJVEVfVE9VVCkgeworCQkJKmFkZHIgPSBTQ1NfUkVBRF9DTUQ7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCSphZGRyID0gU0NTX1JFQURfQ01EOworCXJldHVybiAoMCk7Cit9CisKKy8qIHZpbTogc2V0IHRzPTQgc3c9NCB0dz03ODogKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2dlbjg2MHQvZnBnYS5jIGIvYm9hcmQvZ2VuODYwdC9mcGdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0ZmJmMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2dlbjg2MHQvZnBnYS5jCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBSaWNoIElyZWxhbmQsIEVudGVyYXN5cyBOZXR3b3JrcywgcmlyZWxhbmRAZW50ZXJhc3lzLmNvbS4KKyAqIEtlaXRoIE91dHdhdGVyLCBrZWl0aF9vdXR3YXRlckBtdmlzLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworLyoKKyAqIFZpcnRleDIgRlBHQSBjb25maWd1cmF0aW9uIHN1cHBvcnQgZm9yIHRoZSBHRU44NjBUIGNvbXB1dGVyCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHZpcnRleDIuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSAiZnBnYS5oIgorCisjaWYgKENPTkZJR19GUEdBKQorCisjaWYgMAorI2RlZmluZSBHRU44NjBUX0ZQR0FfREVCVUcKKyNlbmRpZgorCisjaWZkZWYgR0VOODYwVF9GUEdBX0RFQlVHCisjZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKKyNlbHNlCisjZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikKKyNlbmRpZgorCisvKgorICogUG9ydCBiaXQgbnVtYmVycyBmb3IgdGhlIFNlbGVjdG1hcCBjb250cm9scworICovCisjZGVmaW5lIEZQR0FfSU5JVF9CSVRfTlVNCQkyMgkvKiBQQjIyICovCisjZGVmaW5lIEZQR0FfUkVTRVRfQklUX05VTQkJMTEJLyogUEMxMSAqLworI2RlZmluZSBGUEdBX0RPTkVfQklUX05VTQkJMTYJLyogUEIxNiAqLworI2RlZmluZSBGUEdBX1BST0dSQU1fQklUX05VTQk3CS8qIFBBNyAgKi8KKworLyogTm90ZSB0aGF0IHRoZXNlIGFyZSBwb2ludGVycyB0byBjb2RlIHRoYXQgaXMgaW4gRmxhc2guICBUaGV5IHdpbGwgYmUKKyAqIHJlbG9jYXRlZCBhdCBydW50aW1lLgorICovCitYaWxpbnhfVmlydGV4Ml9TbGF2ZV9TZWxlY3RNYXBfZm5zIGZwZ2FfZm5zID0geworCWZwZ2FfcHJlX2NvbmZpZ19mbiwKKwlmcGdhX3BnbV9mbiwKKwlmcGdhX2luaXRfZm4sCisJZnBnYV9lcnJfZm4sCisJZnBnYV9kb25lX2ZuLAorCWZwZ2FfY2xrX2ZuLAorCWZwZ2FfY3NfZm4sCisJZnBnYV93cl9mbiwKKwlmcGdhX3JlYWRfZGF0YV9mbiwKKwlmcGdhX3dyaXRlX2RhdGFfZm4sCisJZnBnYV9idXN5X2ZuLAorCWZwZ2FfYWJvcnRfZm4sCisJZnBnYV9wb3N0X2NvbmZpZ19mbgorfTsKKworWGlsaW54X2Rlc2MgZnBnYVtDT05GSUdfRlBHQV9DT1VOVF0gPSB7CisJeyBYaWxpbnhfVmlydGV4MiwKKwkgIHNsYXZlX3NlbGVjdG1hcCwKKwkgIFhJTElOWF9YQzJWMzAwMF9TSVpFLAorCSAgKHZvaWQgKikmZnBnYV9mbnMsCisJICAwCisJfQorfTsKKworLyoKKyAqIERpc3BsYXkgRlBHQSByZXZpc2lvbiBpbmZvcm1hdGlvbgorICovCit2b2lkCitwcmludF9mcGdhX3JldmlzaW9uKHZvaWQpCit7CisJdnVfbG9uZyAqcmV2X3AgPSAodnVfbG9uZyAqKTB4NjAwMDAwMDg7CisKKwlwcmludGYoIkZQR0EgUmV2aXNpb24gMHglLjhseCIKKwkJICAgIiAoRGF0ZSAlLjJseC8lLjJseC8lLjJseCwgU3RhdHVzIFwiJS4xbHhcIiwgVmVyc2lvbiAlLjNsdSlcbiIsCisJCSAgICpyZXZfcCwKKwkJICAgKCgqcmV2X3AgPj4gMjgpICYgMHhmKSwKKwkJICAgKCgqcmV2X3AgPj4gMjApICYgMHhmZiksCisJCSAgICgoKnJldl9wID4+IDEyKSAmIDB4ZmYpLAorCQkgICAoKCpyZXZfcCA+PiA4KSAmIDB4ZiksCisJCSAgICgqcmV2X3AgJiAweGZmKSk7Cit9CisKKworLyoKKyAqIFBlcmZvcm0gYSBzaW1wbGUgdGVzdCBvZiB0aGUgRlBHQSB0byBwcm9jZXNzb3IgaW50ZXJmYWNlIHVzaW5nIHRoZSBGUEdBJ3MKKyAqIGludmVydGluZyBidXMgdGVzdCByZWdpc3Rlci4gIFRoZSBncmVhdCB0aGluZyBhYm91dCBkb2luZyBhIHJlYWQvd3JpdGUKKyAqIHRlc3Qgb24gYSByZWdpc3RlciB0aGF0IGludmVydHMgaXQncyBjb250ZW50cyBpcyB0aGF0IHlvdSBhdm9pZCBhbnkKKyAqIHByb2JsZW1zIHdpdGggYnVzIGNoYXJnaW5nLgorICogUmV0dXJuIDAgb24gZmFpbHVyZSwgMSBvbiBzdWNjZXNzLgorICovCitpbnQKK3Rlc3RfZnBnYV9pYnRyKHZvaWQpCit7CisJdnVfbG9uZyAqaWJ0cl9wID0gKHZ1X2xvbmcgKikweDYwMDAwMDEwOworCXZ1X2xvbmcgcmVhZGJhY2s7CisJdnVfbG9uZyBjb21wYXJlOworCWludCBpOworCWludCBqOworCWludCBrOworCWludCBwYXNzID0gMTsKKworCXN0YXRpYyBjb25zdCB1bG9uZyBiaXRwYXR0ZXJuW10gPSB7CisJCTB4ZGVhZGJlZWYsCS8qIG1hZ2ljIElEIHBhdHRlcm4gZm9yIGRlYnVnCSovCisJCTB4MDAwMDAwMDEsCS8qIHNpbmdsZSBiaXQJCQkJCSovCisJCTB4MDAwMDAwMDMsCS8qIHR3byBhZGphY2VudCBiaXRzCQkJKi8KKwkJMHgwMDAwMDAwNywJLyogdGhyZWUgYWRqYWNlbnQgYml0cwkJCSovCisJCTB4MDAwMDAwMEYsCS8qIGZvdXIgYWRqYWNlbnQgYml0cwkJCSovCisJCTB4MDAwMDAwMDUsCS8qIHR3byBub24tYWRqYWNlbnQgYml0cwkJKi8KKwkJMHgwMDAwMDAxNSwJLyogdGhyZWUgbm9uLWFkamFjZW50IGJpdHMJCSovCisJCTB4MDAwMDAwNTUsCS8qIGZvdXIgbm9uLWFkamFjZW50IGJpdHMJCSovCisJCTB4YWFhYWFhYWEsCS8qIGFsdGVybmF0aW5nIDEvMAkJCQkqLworCX07CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCAzMTsgaisrKSB7CisJCQlmb3IgKGsgPSAwOyBrIDwgc2l6ZW9mKGJpdHBhdHRlcm4pL3NpemVvZihiaXRwYXR0ZXJuWzBdKTsgaysrKSB7CisJCQkJKmlidHJfcCA9IGNvbXBhcmUgPSAoYml0cGF0dGVybltrXSA8PCBqKTsKKwkJCQlyZWFkYmFjayA9ICppYnRyX3A7CisJCQkJaWYgKHJlYWRiYWNrICE9IH5jb21wYXJlKSB7CisJCQkJCXByaW50ZigiJXM6JWQ6IEZQR0EgdGVzdCBmYWlsOiBleHBlY3RlZCAweCUuOGx4IgorCQkJCQkJICAgIiBhY3R1YWwgMHglLjhseFxuIiwKKwkJCQkJCSAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIH5jb21wYXJlLCByZWFkYmFjayk7CisJCQkJCXBhc3MgPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoIXBhc3MpIGJyZWFrOworCQl9CisJCWlmICghcGFzcykgYnJlYWs7CisJfQorCWlmIChwYXNzKSB7CisJCXByaW50ZigiRlBHQSBpbnZlcnRpbmcgYnVzIHRlc3QgcGFzc2VkXG4iKTsKKwkJcHJpbnRfZnBnYV9yZXZpc2lvbigpOworCX0KKwllbHNlIHsKKwkJcHJpbnRmKCIqKiBGUEdBIGludmVydGluZyBidXMgdGVzdCBmYWlsZWRcbiIpOworCX0KKwlyZXR1cm4gcGFzczsKK30KKworCisvKgorICogU2V0IHRoZSBhY3RpdmUtbG93IEZQR0EgcmVzZXQgc2lnbmFsLgorICovCit2b2lkCitmcGdhX3Jlc2V0KGludCBhc3NlcnQpCit7CisgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKworCVBSSU5URigiJXM6JWQ6IFJFU0VUICIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworCWlmIChhc3NlcnQpIHsKKwkJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkYXQgJj0gfigweDgwMDAgPj4gRlBHQV9SRVNFVF9CSVRfTlVNKTsKKwkJUFJJTlRGKCJhc3NlcnRlZFxuIik7CisJfQorCWVsc2UgeworCQlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RhdCB8PSAoMHg4MDAwID4+IEZQR0FfUkVTRVRfQklUX05VTSk7CisJCVBSSU5URigiZGVhc3NlcnRlZFxuIik7CisJfQorfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBTZWxlY3RNYXAgaW50ZXJmYWNlLiAgV2UgYXNzdW1lIHRoYXQgdGhlIG1vZGUgYW5kIHRoZQorICogaW5pdGlhbCBzdGF0ZSBvZiBhbGwgb2YgdGhlIHBvcnQgcGlucyBoYXZlIGFscmVhZHkgYmVlbiBzZXQhCisgKi8KK3ZvaWQKK2ZwZ2Ffc2VsZWN0bWFwX2luaXQodm9pZCkKK3sKKwlQUklOVEYoIiVzOiVkOiBJbml0aWFsaXplIFNlbGVjdE1hcCBpbnRlcmZhY2VcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworCWZwZ2FfcGdtX2ZuKEZBTFNFLCBGQUxTRSwgMCk7ICAgLyogbWFrZSBzdXJlIHByb2dyYW0gcGluIGlzIGluYWN0aXZlICovCit9CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGZwZ2EuICBSZXR1cm4gMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUuCisgKi8KK2ludAorZ2VuODYwdF9pbml0X2ZwZ2Eodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWludCBpOworCisJUFJJTlRGKCIlczolZDogSW5pdGlhbGl6ZSBGUEdBIGludGVyZmFjZSAocmVsb2NhdGlvbiBvZmZzZXQgPSAweCUuOGx4KVxuIiwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIGdkLT5yZWxvY19vZmYpOworCWZwZ2FfaW5pdChnZC0+cmVsb2Nfb2ZmKTsKKwlmcGdhX3NlbGVjdG1hcF9pbml0KCk7CisKKwlmb3IoaT0wOyBpIDwgQ09ORklHX0ZQR0FfQ09VTlQ7IGkrKykgeworCQlQUklOVEYoIiVzOiVkOiBBZGRpbmcgZnBnYSAlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgaSk7CisJCWZwZ2FfYWRkKGZwZ2FfeGlsaW54LCAmZnBnYVtpXSk7CisJfQorIAlyZXR1cm4gMTsKK30KKworCisvKgorICogU2V0IHRoZSBGUEdBJ3MgYWN0aXZlLWxvdyBTZWxlY3RNYXAgcHJvZ3JhbSBsaW5lIHRvIHRoZSBzcGVjaWZpZWQgbGV2ZWwKKyAqLworaW50CitmcGdhX3BnbV9mbihpbnQgYXNzZXJ0LCBpbnQgZmx1c2gsIGludCBjb29raWUpCit7CisgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKworCVBSSU5URigiJXM6JWQ6IEZQR0EgUFJPR1JBTSAiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKworCWlmIChhc3NlcnQpIHsKKwkJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGFkYXQgJj0gfigweDgwMDAgPj4gRlBHQV9QUk9HUkFNX0JJVF9OVU0pOworCQlQUklOVEYoImFzc2VydGVkXG4iKTsKKwl9CisJZWxzZSB7CisJCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhZGF0IHw9ICgweDgwMDAgPj4gRlBHQV9QUk9HUkFNX0JJVF9OVU0pOworCQlQUklOVEYoImRlYXNzZXJ0ZWRcbiIpOworCX0KKwlyZXR1cm4gYXNzZXJ0OworfQorCisKKy8qCisgKiBUZXN0IHRoZSBzdGF0ZSBvZiB0aGUgYWN0aXZlLWxvdyBGUEdBIElOSVQgbGluZS4gIFJldHVybiAxIG9uIElOSVQKKyAqIGFzc2VydGVkIChsb3cpLgorICovCitpbnQKK2ZwZ2FfaW5pdF9mbihpbnQgY29va2llKQoreworICAgIHZvbGF0aWxlIGltbWFwX3QgKmltbWFwICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisKKwlQUklOVEYoIiVzOiVkOiBJTklUIGNoZWNrLi4uICIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworCWlmKGltbWFwLT5pbV9jcG0uY3BfcGJkYXQgJiAoMHg4MDAwMDAwMCA+PiBGUEdBX0lOSVRfQklUX05VTSkpIHsKKwkJUFJJTlRGKCJoaWdoXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgeworCQlQUklOVEYoImxvd1xuIik7CisJCXJldHVybiAxOworCX0KK30KKworCisvKgorICogVGVzdCB0aGUgc3RhdGUgb2YgdGhlIGFjdGl2ZS1oaWdoIEZQR0EgRE9ORSBwaW4KKyAqLworaW50CitmcGdhX2RvbmVfZm4oaW50IGNvb2tpZSkKK3sKKyAgICB2b2xhdGlsZSBpbW1hcF90ICppbW1hcCAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworCisJUFJJTlRGKCIlczolZDogRE9ORSBjaGVjay4uLiAiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKwlpZiAoaW1tYXAtPmltX2NwbS5jcF9wYmRhdCAmICgweDgwMDAwMDAwID4+IEZQR0FfRE9ORV9CSVRfTlVNKSkgeworCQlQUklOVEYoImhpZ2hcbiIpOworCQlyZXR1cm4gRlBHQV9TVUNDRVNTOworCX0KKwllbHNlIHsKKwkJUFJJTlRGKCJsb3dcbiIpOworCQlyZXR1cm4gRlBHQV9GQUlMOworCX0KK30KKworCisvKgorICogUmVhZCBGUEdBIFNlbGVjdE1hcCBkYXRhLgorICovCitpbnQKK2ZwZ2FfcmVhZF9kYXRhX2ZuKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBjb29raWUpCit7CisJdnVfY2hhciAqcCA9ICh2dV9jaGFyICopU0VMRUNUTUFQX0JBU0U7CisKKwkqZGF0YSA9ICpwOworI2lmIDAKKwlQUklOVEYoIiVzOiBSZWFkIDB4JXggaW50byAweCVwXG4iLCBfX0ZVTkNUSU9OX18sIChpbnQpZGF0YSwgZGF0YSk7CisjZW5kaWYKKwlyZXR1cm4gKGludClkYXRhOworfQorCisKKy8qCisgKiBXcml0ZSBkYXRhIHRvIHRoZSBGUEdBIFNlbGVjdE1hcCBwb3J0CisgKi8KK2ludAorZnBnYV93cml0ZV9kYXRhX2ZuKHVuc2lnbmVkIGNoYXIgZGF0YSwgaW50IGZsdXNoLCBpbnQgY29va2llKQoreworCXZ1X2NoYXIgKnAgPSAodnVfY2hhciAqKVNFTEVDVE1BUF9CQVNFOworCisjaWYgMAorCVBSSU5URigiJXM6IFdyaXRlIERhdGEgMHgleFxuIiwgX19GVU5DVElPTl9fLCAoaW50KWRhdGEpOworI2VuZGlmCisJKnAgPSBkYXRhOworCXJldHVybiAoaW50KWRhdGE7Cit9CisKKworLyoKKyAqIEFib3J0IGFuZCBGUEdBIG9wZXJhdGlvbgorICovCitpbnQKK2ZwZ2FfYWJvcnRfZm4oaW50IGNvb2tpZSkKK3sKKwlQUklOVEYoIiVzOiVkOiBGUEdBIHByb2dyYW0gc2VxdWVuY2UgYWJvcnRlZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisJcmV0dXJuIEZQR0FfRkFJTDsKK30KKworCisvKgorICogRlBHQSBwcmUtY29uZmlndXJhdGlvbiBmdW5jdGlvbi4gSnVzdCBtYWtlIHN1cmUgdGhhdAorICogRlBHQSByZXNldCBpcyBhc3NlcnRlZCB0byBrZWVwIHRoZSBGUEdBIGZyb20gc3RhcnRpbmcgdXAgYWZ0ZXIKKyAqIGNvbmZpZ3VyYXRpb24uCisgKi8KK2ludAorZnBnYV9wcmVfY29uZmlnX2ZuKGludCBjb29raWUpCit7CisJUFJJTlRGKCIlczolZDogRlBHQSBwcmUtY29uZmlndXJhdGlvblxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisJZnBnYV9yZXNldChUUlVFKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogRlBHQSBwb3N0IGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24uIEJsaXAgdGhlIEZQR0EgcmVzZXQgbGluZSBhbmQgdGhlbiBzZWUgaWYKKyAqIHRoZSBGUEdBIGFwcGVhcnMgdG8gYmUgcnVubmluZy4KKyAqLworaW50CitmcGdhX3Bvc3RfY29uZmlnX2ZuKGludCBjb29raWUpCit7CisJaW50IHJjOworCisJUFJJTlRGKCIlczolZDogRlBHQSBwb3N0IGNvbmZpZ3VyYXRpb25cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworCWZwZ2FfcmVzZXQoVFJVRSk7CisJdWRlbGF5KDEwMDApOworCWZwZ2FfcmVzZXQoRkFMU0UpOworCXVkZWxheSAoMTAwMCk7CisKKwkvKgorCSAqIFVzZSB0aGUgRlBHQSxzIGludmVydGluZyBidXMgdGVzdCByZWdpc3RlciB0byBkbyBhIHNpbXBsZSB0ZXN0IG9mIHRoZQorCSAqIHByb2Nlc3NvciBpbnRlcmZhY2UuCisJICovCisJcmMgPSB0ZXN0X2ZwZ2FfaWJ0cigpOworCXJldHVybiByYzsKK30KKworCisvKgorICogQ2xvY2ssIGNoaXAgc2VsZWN0IGFuZCB3cml0ZSBzaWduYWwgYXNzZXJ0IGZ1bmN0aW9ucyBhbmQgZXJyb3IgY2hlY2sKKyAqIGFuZCBidXN5IGZ1bmN0aW9ucy4gIFRoZXNlIGFyZSBvbmx5IHN0dWJzIGJlY2F1c2UgdGhlIEdFTjg2MFQgc2VsZWN0bWFwCisgKiBpbnRlcmZhY2UgaGFuZGxlcyBzZXF1ZW5jaW5nIG9mIGNvbnRyb2wgc2lnbmFscyBhdXRvbWF0aWNhbGx5IChpdCB1c2VzCisgKiBhIG1lbW9yeS1tYXBwZWQgaW50ZXJmYWNlIHRvIHRoZSBGUEdBIFNlbGVjdE1hcCBwb3J0KS4gIFRoZSBkZXNpZ24gb2YKKyAqIHRoZSBpbnRlcmZhY2UgZ3VhcmFudGVlcyB0aGF0IHRoZSBTZWxlY3RNYXAgcG9ydCBjYW5ub3QgYmUgb3ZlcnJ1biBzbworICogbm8gYnVzeSBjaGVjayBpcyBuZWVkZWQuICBBIGNvbmZpZ3VyYXRpb24gZXJyb3IgaXMgc2lnbmFsbGVkIGJ5IElOSVQKKyAqIGdvaW5nIGxvdyBkdXJpbmcgY29uZmlndXJhdGlvbiwgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBzZXBhcmF0ZSBlcnJvcgorICogZnVuY3Rpb24uCisgKi8KK2ludAorZnBnYV9jbGtfZm4oaW50IGFzc2VydF9jbGssIGludCBmbHVzaCwgaW50IGNvb2tpZSkKK3sKKwlyZXR1cm4gYXNzZXJ0X2NsazsKK30KKworaW50CitmcGdhX2NzX2ZuKGludCBhc3NlcnRfY3MsIGludCBmbHVzaCwgaW50IGNvb2tpZSkKK3sKKwlyZXR1cm4gYXNzZXJ0X2NzOworfQorCitpbnQKK2ZwZ2Ffd3JfZm4oaW50IGFzc2VydF93cml0ZSwgaW50IGZsdXNoLCBpbnQgY29va2llKQoreworCXJldHVybiBhc3NlcnRfd3JpdGU7Cit9CisKK2ludAorZnBnYV9lcnJfZm4oaW50IGNvb2tpZSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50CitmcGdhX2J1c3lfZm4oaW50IGNvb2tpZSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiB2aW06IHNldCB0cz00IHR3PTc4IHN3PTQ6ICovCmRpZmYgLS1naXQgYS9ib2FyZC9nZW44NjB0L2dlbjg2MHQuYyBiL2JvYXJkL2dlbjg2MHQvZ2VuODYwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTMyNjIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9nZW44NjB0L2dlbjg2MHQuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqIEtlaXRoIE91dHdhdGVyLCBrZWl0aF9vdXR3YXRlckBtdmlzLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDx2aXJ0ZXgyLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjaW5jbHVkZSA8YXNtLzh4eF9pbW1hcC5oPgorI2luY2x1ZGUgImJlZXBlci5oIgorI2luY2x1ZGUgImZwZ2EuaCIKKyNpbmNsdWRlICJpb3BvcnQuaCIKKworI2lmZGVmIENPTkZJR19TVEFUVVNfTEVECisjaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19DTURfTUlJKSAmJiBkZWZpbmVkKENPTkZJR19NSUkpCisjaW5jbHVkZSA8bmV0Lmg+CisjZW5kaWYKKworI2lmIDAKKyNkZWZpbmUgR0VOODYwVF9ERUJVRworI2VuZGlmCisKKyNpZmRlZiBHRU44NjBUX0RFQlVHCisjZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKKyNlbHNlCisjZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyBVUE0gaW5pdCB0YWJsZXMgd2VyZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieQorICogTW90b3JvbGEncyBNQ1VJTklUIHByb2dyYW0uIFNlZSB0aGUgUkVBRE1FIGZpbGUgZm9yIFVQTSB0bworICogU0RSQU0gcGluIGFzc2lnbm1lbnRzIGlmIHlvdSB3YW50IHRvIHR5cGUgdGhpcyBkYXRhIGludG8KKyAqIE1DVUlOSVQgaW4gb3JkZXIgdG8gcmV2ZXJzZSBlbmdpbmVlciB0aGUgd2F2ZWZvcm1zLgorICovCisKKy8qCisgKiBVUE0gaW5pdGlhbGl6YXRpb24gdGFibGVzIGZvciBNSUNST04gTVQ0OExDMTZNMTZBMlRHIFNEUkFNIGRldmljZXMKKyAqIChVUE1BKSBhbmQgVmlydGV4IEZQR0EgU2VsZWN0TWFwIGludGVyZmFjZSAoVVBNQikuCisgKiBOT1RFIHRoYXQgdW51c2VkIGFyZWFzIG9mIHRoZSB0YWJsZSBhcmUgdXNlZCB0byBob2xkIE5PUCwgcHJlY2hhcmdlCisgKiBhbmQgbW9kZSByZWdpc3RlciBzZXQgc2VxdWVuY2VzLgorICoKKyAqLworI2RlZmluZQlVUE1BX05PUF9BRERSCQkJMHg1CisjZGVmaW5lCVVQTUFfUFJFQ0hBUkdFX0FERFIJCTB4NgorI2RlZmluZSBVUE1BX01SU19BRERSCQkJMHgxMgorCisjZGVmaW5lIFVQTV9TSU5HTEVfUkVBRF9BRERSCTB4MDAKKyNkZWZpbmUgVVBNX0JVUlNUX1JFQURfQUREUgkJMHgwOAorI2RlZmluZSBVUE1fU0lOR0xFX1dSSVRFX0FERFIJMHgxOAorI2RlZmluZSBVUE1fQlVSU1RfV1JJVEVfQUREUgkweDIwCisjZGVmaW5lCVVQTV9SRUZSRVNIX0FERFIJCTB4MzAKKworY29uc3QgdWludCBzZHJhbV91cG1fdGFibGVbXSA9IHsKKwkvKiBzaW5nbGUgcmVhZCAgIChvZmZzZXQgMHgwMCBpbiB1cG0gcmFtKSAqLworCTB4MGUwZmRjMDQsIDB4MDFhZGZjMDQsIDB4MGZiZmZjMDAsIDB4MWZmZjVjMDUsCisJMHhmZmZmZmZmZiwgMHgwZmZmZmZjZCwgMHgwZmZmMGZjZSwgMHhlZmNmZmZmZiwKKwkvKiBidXJzdCByZWFkICAgIChvZmZzZXQgMHgwOCBpbiB1cG0gcmFtKSAqLworCTB4MGYwZmRjMDQsIDB4MDBmZGZjMDQsIDB4ZjBmZmZjMDAsIDB4ZjBmZmZjMDAsCisJMHhmMWZmZmMwMCwgMHhmZmZmZmMwMCwgMHhmZmZmZmMwNSwgMHhmZmZmZmZmZiwKKwkweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweDBmZmZmZmY0LCAweDFmM2Q1ZmY0LAorCTB4ZmZmZmZmZjQsIDB4ZmZmZmZmZjUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJLyogc2luZ2xlIHdyaXRlICAob2Zmc2V0IDB4MTggaW4gdXBtIHJhbSkgKi8KKwkweDBmMGZkYzA0LCAweDAwYWQzYzAwLCAweDFmZmY1YzA1LCAweGZmZmZmZmZmLAorCTB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJLyogYnVyc3Qgd3JpdGUgICAob2Zmc2V0IDB4MjAgaW4gdXBtIHJhbSkgKi8KKwkweDBmMGZkYzAwLCAweDEwZmQ3YzAwLCAweGYwZmZmYzAwLCAweGYwZmZmYzAwLAorCTB4ZjFmZmZjMDQsIDB4ZmZmZmZjMDUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZjdmZiwKKwkweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLAorCS8qIHJlZnJlc2ggICAgICAgKG9mZnNldCAweDMwIGluIHVwbSByYW0pICovCisJMHgxZmZkZGM4NCwgMHhmZmZmZmMwNCwgMHhmZmZmZmMwNCwgMHhmZmZmZmM4NCwKKwkweGZmZmZmYzA1LCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLAorCTB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJLyogZXhjZXB0aW9uICAgICAob2Zmc2V0IDB4M0MgaW4gdXBtIHJhbSkgKi8KKyAgIH07CisKK2NvbnN0IHVpbnQgc2VsZWN0bWFwX3VwbV90YWJsZVtdID0geworCS8qIHNpbmdsZSByZWFkICAgKG9mZnNldCAweDAwIGluIHVwbSByYW0pICovCisJMHg4OGZmZmMwNiwgMHgwMGZmZjQwNCwgMHgwMGZmZmMwNCwgMHgzM2ZmZmMwMCwKKwkweGZmZmZmYzA1LCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLAorCS8qIGJ1cnN0IHJlYWQgICAgKG9mZnNldCAweDA4IGluIHVwbSByYW0pICovCisJMHhmZmZmZmMwNCwgMHhmZmZmZmMwNSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwKKwkweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLAorCTB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwKKwkvKiBzaW5nbGUgd3JpdGUgIChvZmZzZXQgMHgxOCBpbiB1cG0gcmFtKSAqLworCTB4ODhmZmZjMDQsIDB4MDBmZmY0MDAsIDB4NzdmZmZjMDUsIDB4ZmZmZmZmZmYsCisJMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwKKwkvKiBidXJzdCB3cml0ZSAgIChvZmZzZXQgMHgyMCBpbiB1cG0gcmFtKSAqLworCTB4ZmZmZmZjMDQsIDB4ZmZmZmZjMDUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwKKwkweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLAorCTB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJLyogcmVmcmVzaCAgICAgICAob2Zmc2V0IDB4MzAgaW4gdXBtIHJhbSkgKi8KKwkweGZmZmZmYzA0LCAweGZmZmZmYzA1LCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLAorCTB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwKKwkvKiBleGNlcHRpb24gICAgIChvZmZzZXQgMHgzQyBpbiB1cG0gcmFtKSAqLworCTB4ZmZmZmZjMDUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYKK307CisKKy8qCisgKiBDaGVjayBib2FyZCBpZGVudGl0eS4gIEFsd2F5cyBzdWNjZXNzZnVsIChnaXZlcyBpbmZvcm1hdGlvbiBvbmx5KQorICovCitpbnQKK2NoZWNrYm9hcmQodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworICAgIHVuc2lnbmVkIGNoYXIgKnM7CisgICAgdW5zaWduZWQgY2hhciBidWZbNjRdOworICAgIGludCBpOworCisgICAgaSA9IGdldGVudl9yKCJib2FyZF9pZCIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIHMgPSAoaT4wKSA/IGJ1ZiA6IE5VTEw7CisKKwlpZiAocykgeworCQlwcmludGYoIiVzICIsIHMpOworCX0gZWxzZSB7CisJCXByaW50ZigiPHVua25vd24+ICIpOworCX0KKworICAgIGkgPSBnZXRlbnZfcigic2VyaWFsIyIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIHMgPSAoaT4wKSA/IGJ1ZiA6IE5VTEw7CisKKwlpZiAocykgeworCQlwcmludGYoIlMvTiAlc1xuIiwgcyk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJTL04gPHVua25vd24+XG4iKTsKKwl9CisKKyAgICBwcmludGYoIkNQVSBhdCAlcyBNSHosICIsc3RybWh6KGJ1ZiwgZ2QtPmNwdV9jbGspKTsKKwlwcmludGYoImxvY2FsIGJ1cyBhdCAlcyBNSHpcbiIsIHN0cm1oeihidWYsIGdkLT5idXNfY2xrKSk7CisgICAgcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgU0RSQU0KKyAqLworbG9uZyBpbnQKK2luaXRkcmFtKGludCBib2FyZF90eXBlKQoreworICAgIHZvbGF0aWxlIGltbWFwX3QgICAgICppbW1yICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisgICAgdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1yLT5pbV9tZW1jdGw7CisKKyAgICB1cG1jb25maWcoVVBNQSwKKwkJCSAgKHVpbnQgKilzZHJhbV91cG1fdGFibGUsCisJCQkgIHNpemVvZihzZHJhbV91cG1fdGFibGUpIC8gc2l6ZW9mKHVpbnQpCisJCQkgKTsKKworICAgIC8qCisgICAgICogU2V0dXAgTUFNUiByZWdpc3RlcgorICAgICAqLworICAgIG1lbWN0bC0+bWVtY19tcHRwciA9IENGR19NUFRQUl8xQktfOEs7CisgICAgbWVtY3RsLT5tZW1jX21hbXIgPSBDRkdfTUFNUl84Q09MICYgKH4oTUFNUl9QVEFFKSk7IC8qIG5vIHJlZnJlc2ggeWV0ICovCisKKyAgICAvKgorICAgICAqIE1hcCBDUzEqIHRvIFNEUkFNIGJhbmsKKyAgICAgKi8KKyAgICBtZW1jdGwtPm1lbWNfb3IxID0gQ0ZHX09SMTsKKyAgICBtZW1jdGwtPm1lbWNfYnIxID0gQ0ZHX0JSMTsKKworCS8qCisJICogUGVyZm9ybSBTRFJBTSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZToKKwkgKiAxLiBBcHBseSBhdCBsZWFzdCBvbmUgTk9QIGNvbW1hbmQKKwkgKiAyLiAxMDAgdVMgZGVsYXkgKEpFREVDIHN0YW5kYXJkIHNheXMgMjAwIHVTKQorCSAqIDMuIElzc3VlIDQgcHJlY2hhcmdlIGNvbW1hbmRzCisJICogNC4gUGVyZm9ybSB0d28gcmVmcmVzaCBjeWNsZXMKKwkgKiA1LiBQcm9ncmFtIG1vZGUgcmVnaXN0ZXIKKwkgKgorCSAqIFByb2dyYW0gU0RSQU0gZm9yIHN0YW5kYXJkIG9wZXJhdGlvbiwgc2VxdWVudGlhbCBidXJzdCwgYnVyc3QgbGVuZ3RoCisJICogb2YgNCwgQ0FTIGxhdGVuY3kgb2YgMi4KKwkgKi8KKyAgICBtZW1jdGwtPm1lbWNfbWFyID0gMHgwMDAwMDAwMDsKKwltZW1jdGwtPm1lbWNfbWNyID0gTUNSX1VQTV9BIHwgTUNSX09QX1JVTiB8IE1DUl9NQl9DUzEgfAorCQkJCQkgICBNQ1JfTUxDRigwKSB8IFVQTUFfTk9QX0FERFI7CisJdWRlbGF5KDIwMCk7CisgICAgbWVtY3RsLT5tZW1jX21hciA9IDB4MDAwMDAwMDA7CisJbWVtY3RsLT5tZW1jX21jciA9IE1DUl9VUE1fQSB8IE1DUl9PUF9SVU4gfCBNQ1JfTUJfQ1MxIHwKKwkJCQkJICAgTUNSX01MQ0YoNCkgfCBVUE1BX1BSRUNIQVJHRV9BRERSOworCisgICAgbWVtY3RsLT5tZW1jX21hciA9IDB4MDAwMDAwMDA7CisJbWVtY3RsLT5tZW1jX21jciA9IE1DUl9VUE1fQSB8IE1DUl9PUF9SVU4gfCBNQ1JfTUJfQ1MxIHwKKwkJCQkJICAgTUNSX01MQ0YoMikgfCBVUE1fUkVGUkVTSF9BRERSOworCisgICAgbWVtY3RsLT5tZW1jX21hciA9IDB4MDAwMDAwODg7CisJbWVtY3RsLT5tZW1jX21jciA9IE1DUl9VUE1fQSB8IE1DUl9PUF9SVU4gfCBNQ1JfTUJfQ1MxIHwKKwkJCQkJICAgTUNSX01MQ0YoMSkgfCBVUE1BX01SU19BRERSOworCisgICAgbWVtY3RsLT5tZW1jX21hciA9IDB4MDAwMDAwMDA7CisJbWVtY3RsLT5tZW1jX21jciA9IE1DUl9VUE1fQSB8IE1DUl9PUF9SVU4gfCBNQ1JfTUJfQ1MxIHwKKwkJCQkJICAgTUNSX01MQ0YoMCkgfCBVUE1BX05PUF9BRERSOworCS8qCisJICogRW5hYmxlIHJlZnJlc2gKKwkgKi8KKyAgICBtZW1jdGwtPm1lbWNfbWFtciB8PSBNQU1SX1BUQUU7CisKKyAgICByZXR1cm4gKFNEUkFNX1NJWkUpOworfQorCisvKgorICogRGlzayBPbiBDaGlwIChET0MpIE1pbGxlbml1bSBpbml0aWFsaXphdGlvbi4KKyAqIFRoZSBET0MgbGl2ZXMgaW4gdGhlIENTMiogc3BhY2UKKyAqLworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKK2V4dGVybiB2b2lkCitkb2NfcHJvYmUodWxvbmcgcGh5c2Fkcik7CisKK3ZvaWQKK2RvY19pbml0KHZvaWQpCit7CisJcHJpbnRmKCJQcm9iaW5nIGF0IDB4JS44eDogIiwgRE9DX0JBU0UpOworCWRvY19wcm9iZShET0NfQkFTRSk7Cit9CisjZW5kaWYKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgaW50aWFsaXphdGlvbgorICovCitpbnQKK21pc2NfaW5pdF9yICh2b2lkKQoreworICAgIHZvbGF0aWxlIGltbWFwX3QgICAgICppbW1yICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisgICAgdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1yLT5pbV9tZW1jdGw7CisKKwkvKgorCSAqIFNldCB1cCBVUE1CIHRvIGhhbmRsZSB0aGUgVmlydGV4IEZQR0EgU2VsZWN0TWFwIGludGVyZmFjZQorCSAqLworCXVwbWNvbmZpZyhVUE1CLCAodWludCAqKXNlbGVjdG1hcF91cG1fdGFibGUsCisJCQkgIHNpemVvZihzZWxlY3RtYXBfdXBtX3RhYmxlKSAvIHNpemVvZih1aW50KSk7CisKKyAgICBtZW1jdGwtPm1lbWNfbWJtciA9IDB4MDsKKworCWNvbmZpZ19tcGM4eHhfaW9wb3J0cyhpbW1yKTsKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKwltaWlfaW5pdCgpOworI2VuZGlmCisKKyNpZiAoQ09ORklHX0ZQR0EpCisJZ2VuODYwdF9pbml0X2ZwZ2EoKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogRmluYWwgaW5pdCBob29rIGJlZm9yZSBlbnRlcmluZyBjb21tYW5kIGxvb3AuCisgKi8KK2ludAorbGFzdF9zdGFnZV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBidWZbMjU2XTsKKwlpbnQgaTsKKworCS8qCisJICogU2V0IExFRHMgaGVyZSBzaW5jZSBzdGF0dXMgTEVEIGluaXQgY29kZSBoYXMgYWxyZWFkeSBydW4KKwkgKi8KKwlzdGF0dXNfbGVkX3NldChTVEFUVVNfTEVEX0JJVDEsIFNUQVRVU19MRURfT04pOworCXN0YXR1c19sZWRfc2V0KFNUQVRVU19MRURfQklUMywgU1RBVFVTX0xFRF9PTik7CisKKwkvKgorCSAqIFR1cm4gdGhlIGJlZXBlciB2b2x1bWUgYWxsIHRoZSB3YXkgZG93biBpbiBjYXNlIHRoaXMgaXMgYSB3YXJtCisJICogYm9vdC4KKwkgKi8KKwlzZXRfYmVlcGVyX3ZvbHVtZSgtNjQpOworCWluaXRfYmVlcGVyKCk7CisKKwkvKgorCSAqIFJlYWQgdGhlIGVudmlyb25tZW50IHRvIHNlZSB3aGF0IHRvIGRvIHdpdGggdGhlIGJlZXBlcgorCSAqLworICAgIGkgPSBnZXRlbnZfcigiYmVlcGVyIiwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKGkgPiAwKSB7CisJCWRvX2JlZXBlcihidWYpOworCX0KKwlyZXR1cm4gMDsKK30KKy8qIHZpbTogc2V0IHRzPTQgc3c9NCB0dz03OCA6ICovCmRpZmYgLS1naXQgYS9ib2FyZC9nZW44NjB0L2lvcG9ydC5jIGIvYm9hcmQvZ2VuODYwdC9pb3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDY1MjRkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZ2VuODYwdC9pb3BvcnQuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjaW5jbHVkZSA8YXNtLzh4eF9pbW1hcC5oPgorI2luY2x1ZGUgImlvcG9ydC5oIgorCisjaWYgMAorI2RlZmluZSBJT1BPUlRfREVCVUcKKyNlbmRpZgorCisjaWZkZWYgIElPUE9SVF9ERUJVRworI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pIHByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworLyoKKyAqIFRoZSBpb3BvcnQgY29uZmlndXJhdGlvbiB0YWJsZS4KKyAqLworY29uc3QgbXBjOHh4X2lvcF9jb25mX3QgaW9wX2NvbmZfdGFiW05VTV9QT1JUU11bUE9SVF9CSVRTXSA9IHsKKyAgICAvKgorCSAqIFBvcnQgQSBjb25maWd1cmF0aW9uCisJICogUGluCQlTaWduYWwJCQkJVHlwZQlBY3RpdmUJCUluaXRpYWwgc3RhdGUKKwkgKiBQQTcgCQlmcGdhUHJvZ3JhbUxvd091dAlPdXQJCUxvdwkJCUhpZ2gKKwkgKi8KKyAgICB7CS8qCSAgICBjb25mIHBwYXIgcHNvciBwZGlyIHBvZHIgcGRhdCBwaW50CSAgIGZ1bmN0aW9uIAkJKi8KKwkvKiBOL0EgICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKiBObyBwaW4JCQkqLworCS8qIE4vQSAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qIE5vIHBpbgkJCSovCisJLyogUEExNSAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBQQTE0ICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBBMTMgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEExMiAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBQQTExICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBBMTAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEE5ICAqLyB7IDEsICAgMCwgICAwLCAgIDEsICAgMCwgICAwLCAgIDAgfSwgLyogZ3JuIGJpY29sb3IgTEVEIDEqLworCS8qIFBBOCAgKi8geyAxLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCwgICAwIH0sIC8qIHJlZCBiaWNvbG9yIExFRCAxKi8KKwkvKiBQQTcgICovIHsgMSwgICAwLCAgIDAsICAgMSwgICAwLCAgIDEsICAgMCB9LCAvKiBmcGdhUHJvZ3JhbUxvdwkqLworCS8qIFBBNiAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEE1ICAqLyB7IDEsICAgMCwgICAwLCAgIDEsICAgMCwgICAwLCAgIDAgfSwgLyogZ3JuIGJpY29sb3IgTEVEIDAqLworCS8qIFBBNCAgKi8geyAxLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCwgICAwIH0sIC8qIHJlZCBiaWNvbG9yIExFRCAwKi8KKwkvKiBQQTMgICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBBMiAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEExICAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBQQTAgICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9ICAvKgkqLworICAgIH0sCisKKwkvKgorCSAqIFBpbgkJU2lnbmFsCQkJVHlwZQkJQWN0aXZlCQlJbml0aWFsIHN0YXRlCisJICogUEIxNAkJZG9jQnVzeUxvd0luCUluCQkJTG93CQkJWAorCSAqIFBCMTUJCWdwaW8xU2lnCQlPdXQJCQlIaWdoCQlMb3cKKwkgKiBQQjE2CQlmcGdhRG9uZUJpCQlJbgkJCUhpZ2gJCVgKKwkgKiBQQjE3CQlzd0JpdE9rTG93T3V0CU91dAkJCUxvdwkJCUxvdworCSAqIFBCMTkJCXNwZWFrZXJWb2xTaWcJT3V0L0hpLVoJSGlnaC9Mb3cJSGlnaCAoSGktWikKKwkgKiBQQjIyCQlmcGdhSW5pdExvd0JpCUluCQkJTG93CQkJWAorCSAqIFBCMjMJCWJhdHRlcnlPa1NpZwlJbgkJCUhpZ2gJCVgKKyAgICAgKi8KKyAgICB7CS8qCSAgICBjb25mIHBwYXIgcHNvciBwZGlyIHBvZHIgcGRhdCBwaW50IAkgIGZ1bmN0aW9uCQkJKi8KKwkvKiBQQjMxICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBCMzAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEIyOSAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBQQjI4ICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBCMjcgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEIyNiAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBQQjI1ICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBCMjQgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEIyMyAqLyB7IDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyogYmF0dGVyeU9rCQkqLworCS8qIFBCMjIgKi8geyAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qIGZwZ2FJbml0TG93QmkJKi8KKwkvKiBQQjIxICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBCMjAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEIxOSAqLyB7IDEsICAgMCwgICAwLCAgIDEsICAgMSwgICAxLCAgIDAgfSwgLyogc3BlYWtlclZvbAkJKi8KKwkvKiBQQjE4ICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBCMTcgKi8geyAxLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCwgICAwIH0sIC8qIHN3Qml0T2tMb3cJCSovCisJLyogUEIxNiAqLyB7IDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyogZnBnYURvbmUJCQkqLworCS8qIFBCMTUgKi8geyAxLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCwgICAwIH0sIC8qIGdwaW8xCQkJKi8KKwkvKiBQQjE0ICovIHsgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9ICAvKiBkb2NCdXN5TG93CQkqLworICAgIH0sCisKKwkvKgorCSAqIFBpbgkJU2lnbmFsCQkJCVR5cGUJQWN0aXZlCQlJbml0aWFsIHN0YXRlCisJICogUEM0CQlpMmNCdXMxRW5TaWcJCU91dAkJSGlnaAkJSGlnaAorCSAqIFBDNQkJaTJjQnVzMkVuU2lnCQlPdXQJCUhpZ2gJCUhpZ2gKKwkgKiBQQzYJCWdwaW8wU2lnCQkJT3V0CQlIaWdoCQlMb3cKKwkgKiBQQzgJCWkyY0J1czNFblNpZwkJT3V0CQlIaWdoCQlIaWdoCisJICogUEMxMAkJaTJjQnVzNEVuU2lnCQlPdXQJCUhpZ2gJCUhpZ2gKKwkgKiBQQzExCQlmcGdhUmVzZXRMb3dPdXQJCU91dAkJTG93CQkJSGlnaAorCSAqIFBDMTIJCXN5c3RlbUJpdE9rSW4JCUluCQlIaWdoCQlYCisJICogUEMxNQkJc2VsZkRyZXFMb3cJCQlJbgkJTG93CQkJWAorCSAqLworICAgIHsJLyoJICAgIGNvbmYgcHBhciBwc29yIHBkaXIgcG9kciBwZGF0IHBpbnQgCSAgZnVuY3Rpb24JCQkqLworCS8qIE4vQQkqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBOL0EJKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEMxNSAqLyB7IDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyogc2VsZkRyZXFMb3dJbgkqLworCS8qIFBDMTQgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEMxMyAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBQQzEyICovIHsgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKiBzeXN0ZW1CaXRPa0luCSovCisJLyogUEMxMSAqLyB7IDEsICAgMCwgICAwLCAgIDEsICAgMCwgICAxLCAgIDAgfSwgLyogZnBnYVJlc2V0TG93T3V0CSovCisJLyogUEMxMCAqLyB7IDEsICAgMCwgICAwLCAgIDEsICAgMCwgICAxLCAgIDAgfSwgLyogaTJjQnVzNEVuU2lnCQkqLworCS8qIFBDOSAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEM4ICAqLyB7IDEsICAgMCwgICAwLCAgIDEsICAgMCwgICAxLCAgIDAgfSwgLyogaTJjQnVzM0VuU2lnCQkqLworCS8qIFBDNyAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEM2ICAqLyB7IDEsICAgMCwgICAwLCAgIDEsICAgMCwgICAxLCAgIDAgfSwgLyogZ3BpbzAJCQkqLworCS8qIFBDNSAgKi8geyAxLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMSwgICAwIH0sIC8qIGkyY0J1czJFblNpZwkJKi8KKwkvKiBQQzQgICovIHsgMSwgICAwLCAgIDAsICAgMSwgICAwLCAgIDEsICAgMCB9LCAvKiBpMmNCdXMxRW5TaWcJCSovCisJLyogTi9BICAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBOL0EgICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIE4vQSAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogTi9BICAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSAgLyoJKi8KKyAgICB9LAorCisgICAgLyogUG9ydCBEIGNvbmZpZ3VyYXRpb24gKi8KKyAgICB7CS8qCSAgICBjb25mIHBwYXIgcHNvciBwZGlyIHBvZHIgcGRhdCBwaW50IAkgICBmdW5jdGlvbgkJCSovCisJLyogTi9BICAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBOL0EgICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBEMTUgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEQxNCAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBQRDEzICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBEMTIgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEQxMSAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBQRDEwICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBEOSAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEQ4ICAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBQRDcgICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBENiAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogUEQ1ICAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBQRDQgICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIFBEMyAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sIC8qCSovCisJLyogTi9BICAqLyB7IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgfSwgLyoJKi8KKwkvKiBOL0EgICovIHsgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCB9LCAvKgkqLworCS8qIE4vQSAgKi8geyAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0gIC8qCSovCisgICAgfQorfTsKKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgTVBDOFhYIEkvTyBwb3J0cyBwZXIgdGhlIGlvcG9ydCBjb25maWd1cmF0aW9uIHRhYmxlCisgKiAodGFrZW4gZnJvbSAuL2NwdS9tcGM4MjYwL2NwdV9pbml0LmMpCisgKi8KK3ZvaWQKK2NvbmZpZ19tcGM4eHhfaW9wb3J0cyh2b2xhdGlsZSBpbW1hcF90ICppbW1yKQoreworICAgIGludCBwb3J0bnVtOworCisgICAgZm9yIChwb3J0bnVtID0gMDsgcG9ydG51bSA8IE5VTV9QT1JUUzsgcG9ydG51bSsrKSB7CisJCXVpbnQgcG1zayA9IDAsIHBwYXIgPSAwLCBwc29yID0gMCwgcGRpciA9IDA7CisJCXVpbnQgcG9kciA9IDAsIHBkYXQgPSAwLCBwaW50ID0gMDsKKwkJdWludCBtc2sgPSAxOworCQltcGM4eHhfaW9wX2NvbmZfdCAqaW9wYyA9IChtcGM4eHhfaW9wX2NvbmZfdCAqKSZpb3BfY29uZl90YWJbcG9ydG51bV1bMF07CisJCW1wYzh4eF9pb3BfY29uZl90ICplaW9wYyA9IGlvcGMgKyBQT1JUX0JJVFM7CisKKwkJLyoKKwkJICogRm9yIGFsbCBwb3J0cyBleGNlcHQgcG9ydCBCLCBpZ25vcmUgdGhlIHR3byBkb24ndCBjYXJlIGVudHJpZXMKKwkJICogaW4gdGhlIGNvbmZpZ3VyYXRpb24gdGFibGVzLgorCQkgKi8KKwkJaWYgKHBvcnRudW0gIT0gMSkgeworCQkJaW9wYyA9IChtcGM4eHhfaW9wX2NvbmZfdCAqKSZpb3BfY29uZl90YWJbcG9ydG51bV1bMl07CisJCX0KKworCQkvKgorCQkgKiBOT1RFOiBpbmRleCAwIHJlZmVycyB0byBwaW4gMTcsIGluZGV4IDE3IHJlZmVycyB0byBwaW4gMAorCQkgKi8KKwkJd2hpbGUgKGlvcGMgPCBlaW9wYykgeworCSAgICAJaWYgKGlvcGMtPmNvbmYpIHsKKwkJCQlwbXNrIHw9IG1zazsKKwkJCQlpZiAoaW9wYy0+cHBhcikgcHBhciB8PSBtc2s7CisJCQkJaWYgKGlvcGMtPnBzb3IpIHBzb3IgfD0gbXNrOworCQkJCWlmIChpb3BjLT5wZGlyKSBwZGlyIHw9IG1zazsKKwkJCQlpZiAoaW9wYy0+cG9kcikgcG9kciB8PSBtc2s7CisJCQkJaWYgKGlvcGMtPnBkYXQpIHBkYXQgfD0gbXNrOworCQkJCWlmIChpb3BjLT5waW50KSBwaW50IHw9IG1zazsKKwkJICAgIH0KKwkJICAgIG1zayA8PD0gMTsKKwkgIAkgIGlvcGMrKzsKKwkJfQorCisJCVBSSU5URigiJXM6JWQ6XG4gIHBvcnRudW09JWQgIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcG9ydG51bSk7CisjaWZkZWYgSU9QT1JUX0RFQlVHCisJCXN3aXRjaChwb3J0bnVtKSB7CisJCQljYXNlIDA6IHByaW50ZigiKEEpXG4iKTsgYnJlYWs7CisJCQljYXNlIDE6IHByaW50ZigiKEIpXG4iKTsgYnJlYWs7CisJCQljYXNlIDI6IHByaW50ZigiKEMpXG4iKTsgYnJlYWs7CisJCQljYXNlIDM6IHByaW50ZigiKEQpXG4iKTsgYnJlYWs7CisJCQlkZWZhdWx0OiBwcmludGYoIig/KVxuIik7IGJyZWFrOworCQl9CisjZW5kaWYKKwkJUFJJTlRGKCIgIHBwYXI9MHglLjh4ICBwZGlyPTB4JS44eCAgcG9kcj0weCUuOHhcbiIKKwkJCSAgICIgIHBkYXQ9MHglLjh4ICBwc29yPTB4JS44eCAgcGludD0weCUuOHggIHBtc2s9MHglLjh4XG4iLAorCQkJICAgcHBhciwgcGRpciwgcG9kciwgcGRhdCwgcHNvciwgcGludCwgcG1zayk7CisKKwkJLyoKKwkJICogSGF2ZSB0byBoYW5kbGUgdGhlIGlvcG9ydHMgb24gYSBwb3J0LWJ5LXBvcnQgYmFzaXMgc2luY2UgdGhlcmUKKwkJICogYXJlIHRocmVlIGRpZmZlcmVudCBmbGF2b3JzLgorCQkgKi8KKwkJaWYgKHBtc2sgIT0gMCkgeworCQkgICAgdWludCB0cG1zayA9IH5wbXNrOworCisJCQlpZiAoMCA9PSBwb3J0bnVtKSB7IC8qIHBvcnQgQSAqLworCQkgICAgCWltbXItPmltX2lvcG9ydC5pb3BfcGFwYXIgJj0gdHBtc2s7CisJCSAgICAJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRhdCA9CisJCQkJCShpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGF0ICYgdHBtc2spIHwgcGRhdDsKKwkJICAgIAlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyID0KKwkJCQkJKGltbXItPmltX2lvcG9ydC5pb3BfcGFkaXIgJiB0cG1zaykgfCBwZGlyOworCQkgICAgCWltbXItPmltX2lvcG9ydC5pb3BfcGFvZHIgPQorCQkJCQkoaW1tci0+aW1faW9wb3J0LmlvcF9wYW9kciAmIHRwbXNrKSB8IHBvZHI7CisJCSAgICAJaW1tci0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSBwcGFyOworCQkJfQorCQkJZWxzZSBpZiAoMSA9PSBwb3J0bnVtKSB7IC8qIHBvcnQgQiAqLworCQkgICAgCWltbXItPmltX2NwbS5jcF9wYnBhciAmPSB0cG1zazsKKwkJICAgIAlpbW1yLT5pbV9jcG0uY3BfcGJkYXQgPSAoaW1tci0+aW1fY3BtLmNwX3BiZGF0ICYgdHBtc2spIHwgcGRhdDsKKwkJICAgIAlpbW1yLT5pbV9jcG0uY3BfcGJkaXIgPSAoaW1tci0+aW1fY3BtLmNwX3BiZGlyICYgdHBtc2spIHwgcGRpcjsKKwkJICAgIAlpbW1yLT5pbV9jcG0uY3BfcGJvZHIgPSAoaW1tci0+aW1fY3BtLmNwX3Bib2RyICYgdHBtc2spIHwgcG9kcjsKKwkJICAgIAlpbW1yLT5pbV9jcG0uY3BfcGJwYXIgfD0gcHBhcjsKKwkJCX0KKwkJCWVsc2UgaWYgKDIgPT0gcG9ydG51bSkgeyAvKiBwb3J0IEMgKi8KKwkJICAgIAlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IHRwbXNrOworCQkgICAgCWltbXItPmltX2lvcG9ydC5pb3BfcGNkYXQgPQorCQkJCQkoaW1tci0+aW1faW9wb3J0LmlvcF9wY2RhdCAmIHRwbXNrKSB8IHBkYXQ7CisJCSAgICAJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RpciA9CisJCQkJCShpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGlyICYgdHBtc2spIHwgcGRpcjsKKwkJICAgIAlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjaW50ID0KKwkJCQkJKGltbXItPmltX2lvcG9ydC5pb3BfcGNpbnQgJiB0cG1zaykgfCBwaW50OworCQkgICAgCWltbXItPmltX2lvcG9ydC5pb3BfcGNzbyA9CisJCQkJCShpbW1yLT5pbV9pb3BvcnQuaW9wX3Bjc28gJiB0cG1zaykgfCBwc29yOworCQkgICAgCWltbXItPmltX2lvcG9ydC5pb3BfcGNwYXIgfD0gcHBhcjsKKwkJCX0KKwkJCWVsc2UgaWYgKDMgPT0gcG9ydG51bSkgeyAvKiBwb3J0IEQgKi8KKwkJICAgIAlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkcGFyICY9IHRwbXNrOworCQkgICAgCWltbXItPmltX2lvcG9ydC5pb3BfcGRkYXQgPQorCQkJCQkoaW1tci0+aW1faW9wb3J0LmlvcF9wZGRhdCAmIHRwbXNrKSB8IHBkYXQ7CisJCSAgICAJaW1tci0+aW1faW9wb3J0LmlvcF9wZGRpciA9CisJCQkJCShpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGlyICYgdHBtc2spIHwgcGRpcjsKKwkJICAgIAlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkcGFyIHw9IHBwYXI7CisJCQl9CisJCX0KKyAgICB9CisKKwlQUklOVEYoIiVzOiVkOiBQb3J0IEE6XG4gIHBhcGFyPTB4JS40eCAgcGFkaXI9MHglLjR4IgorCQkgICAiICBwYW9kcj0weCUuNHhcbiAgcGFkYXQ9MHglLjR4XG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorCQkgICBpbW1yLT5pbV9pb3BvcnQuaW9wX3BhcGFyLCBpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyLAorCQkgICBpbW1yLT5pbV9pb3BvcnQuaW9wX3Bhb2RyLCBpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGF0KTsKKwlQUklOVEYoIiVzOiVkOiBQb3J0IEI6XG4gIHBicGFyPTB4JS44eCAgcGJkaXI9MHglLjh4IgorCQkgICAiICBwYm9kcj0weCUuOHhcbiAgcGJkYXQ9MHglLjh4XG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorCQkgICBpbW1yLT5pbV9jcG0uY3BfcGJwYXIsIGltbXItPmltX2NwbS5jcF9wYmRpciwKKwkJICAgaW1tci0+aW1fY3BtLmNwX3Bib2RyLCBpbW1yLT5pbV9jcG0uY3BfcGJkYXQpOworCVBSSU5URigiJXM6JWQ6IFBvcnQgQzpcbiAgcGNwYXI9MHglLjR4ICBwY2Rpcj0weCUuNHgiCisJCSAgICIgIHBjZGF0PTB4JS40eFxuICBwY3NvPTB4JS40eCAgcGNpbnQ9MHglLjR4XG4gICIsCisJCSAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGltbXItPmltX2lvcG9ydC5pb3BfcGNwYXIsCisJCSAgIGltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIsIGltbXItPmltX2lvcG9ydC5pb3BfcGNkYXQsCisJCSAgIGltbXItPmltX2lvcG9ydC5pb3BfcGNzbywgaW1tci0+aW1faW9wb3J0LmlvcF9wY2ludCk7CisJUFJJTlRGKCIlczolZDogUG9ydCBEOlxuICBwZHBhcj0weCUuNHggIHBkZGlyPTB4JS40eCIKKwkJICAgIiAgcGRkYXQ9MHglLjR4XG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAorCQkgICBpbW1yLT5pbV9pb3BvcnQuaW9wX3BkcGFyLCBpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGlyLAorCQkgICBpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGF0KTsKK30KKworLyogdmltOiBzZXQgdHM9NCBzdz00IHR3PTc4OiAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvZ2VuODYwdC91LWJvb3QubGRzIGIvYm9hcmQvZ2VuODYwdC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNTNjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9nZW44NjB0L3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBMaW5rZXIgY29tbWFuZCBmaWxlIGZvciB0aGUgR0VOODYwVCBib2FyZC4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOworU0VDVElPTlMKK3sKKyAgLyoKKyAgICogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6CisgICAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgOiB7ICooLmludGVycCkJCX0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQkJfQorICAucGx0ICAgICAgICAgICA6IHsgKigucGx0KQkJfQorICAudGV4dCA6CisgIHsKKyAgICBjcHUvbXBjOHh4L3N0YXJ0Lm8JCSgudGV4dCkKKyAgICBjb21tb24vZGxtYWxsb2MubwkJKC50ZXh0KQorICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JCSgudGV4dCkKKyAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKKyAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCisgICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCisKKy8qICAgIC4gPSBlbnZfb2Zmc2V0OworICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KSAqLworCisgICAgKigudGV4dCkKKyAgICAqKC5maXh1cCkKKyAgICAqKC5nb3QxKQorICB9CisgIF9ldGV4dCA9IC47CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgOgorICB7CisgICAgKigucm9kYXRhKQorICAgICooLnJvZGF0YTEpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKgorICAgKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDoKKyAgICovCisgIC4gPSAoLiArIDB4MDBGRikgJiAweEZGRkZGRjAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PjI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXyk+PjI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oMjU2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oMjU2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisKKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvaW1wYTcvZmxhc2guYyBiL2JvYXJkL2ltcGE3L2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5ZmZiOAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2ltcGE3L2ZsYXNoLmMKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2RlZmluZSBGTEFTSF9CQU5LX1NJWkUgMHg4MDAwMDAKKyNkZWZpbmUgTUFJTl9TRUNUX1NJWkUgIDB4MjAwMDAKKyNkZWZpbmUgUEFSQU1fU0VDVF9TSVpFIDB4NDAwMAorCitmbGFzaF9pbmZvX3QgICAgZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKwordWxvbmcgZmxhc2hfaW5pdCh2b2lkKQoreworICAgIGludCBpLCBqOworICAgIHVsb25nIHNpemUgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IENGR19NQVhfRkxBU0hfQkFOS1M7IGkrKykKKyAgICB7CisJdWxvbmcgZmxhc2hiYXNlID0gMDsKKwlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0KKwkgIChJTlRFTF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKSB8CisJICAoSU5URUxfSURfMjhGMzIwQjNUICYgRkxBU0hfVFlQRU1BU0spOworCWZsYXNoX2luZm9baV0uc2l6ZSA9IEZMQVNIX0JBTktfU0laRTsKKwlmbGFzaF9pbmZvW2ldLnNlY3Rvcl9jb3VudCA9IENGR19NQVhfRkxBU0hfU0VDVDsKKwltZW1zZXQoZmxhc2hfaW5mb1tpXS5wcm90ZWN0LCAwLCBDRkdfTUFYX0ZMQVNIX1NFQ1QpOworCWlmIChpID09IDApCisJICBmbGFzaGJhc2UgPSBQSFlTX0ZMQVNIXzE7CisJZWxzZSBpZiAoaSA9PSAxKQorCSAgZmxhc2hiYXNlID0gUEhZU19GTEFTSF8yOworCWVsc2UKKwkgIHBhbmljKCJjb25maWd1cmVkIHRvIG1hbnkgZmxhc2ggYmFua3MhXG4iKTsKKwlmb3IgKGogPSAwOyBqIDwgZmxhc2hfaW5mb1tpXS5zZWN0b3JfY291bnQ7IGorKykKKwl7CisJICAgIGlmIChqIDw9IDcpCisJICAgIHsKKwkJZmxhc2hfaW5mb1tpXS5zdGFydFtqXSA9IGZsYXNoYmFzZSArIGogKiBQQVJBTV9TRUNUX1NJWkU7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWZsYXNoX2luZm9baV0uc3RhcnRbal0gPSBmbGFzaGJhc2UgKyAoaiAtIDcpKk1BSU5fU0VDVF9TSVpFOworCSAgICB9CisJfQorCXNpemUgKz0gZmxhc2hfaW5mb1tpXS5zaXplOworICAgIH0KKworICAgIC8qIFByb3RlY3QgbW9uaXRvciBhbmQgZW52aXJvbm1lbnQgc2VjdG9ycworICAgICAqLworICAgIGZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwKKwkJICBDRkdfRkxBU0hfQkFTRSwKKwkJICBDRkdfRkxBU0hfQkFTRSArIF9hcm1ib290X2VuZF9kYXRhIC0gX2FybWJvb3Rfc3RhcnQsCisJCSAgJmZsYXNoX2luZm9bMF0pOworCisgICAgZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkgIENGR19FTlZfQUREUiwKKwkJICBDRkdfRU5WX0FERFIgKyBDRkdfRU5WX1NJWkUgLSAxLAorCQkgICZmbGFzaF9pbmZvWzBdKTsKKworICAgIHJldHVybiBzaXplOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmxhc2hfcHJpbnRfaW5mbyAgKGZsYXNoX2luZm9fdCAqaW5mbykKK3sKKyAgICBpbnQgaTsKKworICAgIHN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykKKyAgICB7CisgICAgY2FzZSAoSU5URUxfTUFOVUZBQ1QgJiBGTEFTSF9WRU5ETUFTSyk6CisJcHJpbnRmKCJJbnRlbDogIik7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlwcmludGYoIlVua25vd24gVmVuZG9yICIpOworCWJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykKKyAgICB7CisgICAgY2FzZSAoSU5URUxfSURfMjhGMzIwQjNUICYgRkxBU0hfVFlQRU1BU0spOgorCXByaW50ZigiMjhGMzIwRjNCICgxNk1iaXQpXG4iKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXByaW50ZigiVW5rbm93biBDaGlwIFR5cGVcbiIpOworCWdvdG8gRG9uZTsKKwlicmVhazsKKyAgICB9CisKKyAgICBwcmludGYoIiAgU2l6ZTogJWxkIE1CIGluICVkIFNlY3RvcnNcbiIsCisJICAgaW5mby0+c2l6ZSA+PiAyMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKworICAgIHByaW50ZigiICBTZWN0b3IgU3RhcnQgQWRkcmVzc2VzOiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykKKyAgICB7CisJaWYgKChpICUgNSkgPT0gMCkKKwl7CisJICAgIHByaW50ZiAoIlxuICAgIik7CisJfQorCXByaW50ZiAoIiAlMDhsWCVzIiwgaW5mby0+c3RhcnRbaV0sCisJCWluZm8tPnByb3RlY3RbaV0gPyAiIChSTykiIDogIiAgICAgIik7CisgICAgfQorICAgIHByaW50ZiAoIlxuIik7CisKK0RvbmU6Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitpbnQJZmxhc2hfZXJhc2UgKGZsYXNoX2luZm9fdCAqaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCit7CisgICAgaW50IGZsYWcsIHByb3QsIHNlY3Q7CisgICAgaW50IHJjID0gRVJSX09LOworCisgICAgaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pCisJcmV0dXJuIEVSUl9VTktOT1dOX0ZMQVNIX1RZUEU7CisKKyAgICBpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwlyZXR1cm4gRVJSX0lOVkFMOworICAgIH0KKworICAgIGlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgIT0KKwkoSU5URUxfTUFOVUZBQ1QgJiBGTEFTSF9WRU5ETUFTSykpIHsKKwlyZXR1cm4gRVJSX1VOS05PV05fRkxBU0hfVkVORE9SOworICAgIH0KKworICAgIHByb3QgPSAwOworICAgIGZvciAoc2VjdD1zX2ZpcnN0OyBzZWN0PD1zX2xhc3Q7ICsrc2VjdCkgeworCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdKSB7CisJICAgIHByb3QrKzsKKwl9CisgICAgfQorICAgIGlmIChwcm90KQorCXJldHVybiBFUlJfUFJPVEVDVEVEOworCisgICAgLyoKKyAgICAgKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0CisgICAgICogaGVyZS4gUmVtZW1iZXIgdGhhdCBvdXIgZXhjZXB0aW9uIHZlY3RvcnMgYXJlCisgICAgICogYXQgYWRkcmVzcyAwIGluIHRoZSBmbGFzaCwgYW5kIHdlIGRvbid0IHdhbnQgYQorICAgICAqICh0aWNrZXIpIGV4Y2VwdGlvbiB0byBoYXBwZW4gd2hpbGUgdGhlIGZsYXNoCisgICAgICogY2hpcCBpcyBpbiBwcm9ncmFtbWluZyBtb2RlLgorICAgICAqLworICAgIGZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworICAgIC8qIFN0YXJ0IGVyYXNlIG9uIHVucHJvdGVjdGVkIHNlY3RvcnMgKi8KKyAgICBmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0PD1zX2xhc3QgJiYgIWN0cmxjKCk7IHNlY3QrKykgeworCisJcHJpbnRmKCJFcmFzaW5nIHNlY3RvciAlMmQgLi4uICIsIHNlY3QpOworCisJLyogYXJtIHNpbXBsZSwgbm9uIGludGVycnVwdCBkZXBlbmRlbnQgdGltZXIgKi8KKwlyZXNldF90aW1lcl9tYXNrZWQoKTsKKworCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdID09IDApIHsJLyogbm90IHByb3RlY3RlZCAqLworCSAgICB2dV9sb25nICphZGRyID0gKHZ1X2xvbmcgKikoaW5mby0+c3RhcnRbc2VjdF0pOworCisJICAgICphZGRyID0gMHgwMDIwMDAyMDsJLyogZXJhc2Ugc2V0dXAgKi8KKwkgICAgKmFkZHIgPSAweDAwRDAwMEQwOwkvKiBlcmFzZSBjb25maXJtICovCisKKwkgICAgd2hpbGUgKCgqYWRkciAmIDB4MDA4MDAwODApICE9IDB4MDA4MDAwODApIHsKKwkJaWYgKGdldF90aW1lcl9tYXNrZWQoKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKSB7CisJCSAgICAqYWRkciA9IDB4MDBCMDAwQjA7IC8qIHN1c3BlbmQgZXJhc2UgKi8KKwkJICAgICphZGRyID0gMHgwMEZGMDBGRjsJLyogcmVzZXQgdG8gcmVhZCBtb2RlICovCisJCSAgICByYyA9IEVSUl9USU1PVVQ7CisJCSAgICBnb3RvIG91dGFoZXJlOworCQl9CisJICAgIH0KKworCSAgICAqYWRkciA9IDB4MDBGRjAwRkY7CS8qIHJlc2V0IHRvIHJlYWQgbW9kZSAqLworCX0KKwlwcmludGYoIm9rLlxuIik7CisgICAgfQorICAgIGlmIChjdHJsYygpKQorICAgICAgcHJpbnRmKCJVc2VyIEludGVycnVwdCFcbiIpOworCitvdXRhaGVyZToKKworICAgIC8qIGFsbG93IGZsYXNoIHRvIHNldHRsZSAtIHdhaXQgMTAgbXMgKi8KKyAgICB1ZGVsYXlfbWFza2VkKDEwMDAwKTsKKworICAgIGlmIChmbGFnKQorICAgICAgZW5hYmxlX2ludGVycnVwdHMoKTsKKworICAgIHJldHVybiByYzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2gKKyAqLworCitzdGF0aWMgaW50IHdyaXRlX3dvcmQgKGZsYXNoX2luZm9fdCAqaW5mbywgdWxvbmcgZGVzdCwgdWxvbmcgZGF0YSkKK3sKKyAgICB2dV9sb25nICphZGRyID0gKHZ1X2xvbmcgKilkZXN0OworICAgIHVsb25nIGJhcmY7CisgICAgaW50IHJjID0gRVJSX09LOworICAgIGludCBmbGFnOworCisgICAgLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkCisgICAgICovCisgICAgaWYgKCgqYWRkciAmIGRhdGEpICE9IGRhdGEpCisgICAgICAgIHJldHVybiBFUlJfTk9UX0VSQVNFRDsKKworICAgIC8qCisgICAgICogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dAorICAgICAqIGhlcmUuIFJlbWVtYmVyIHRoYXQgb3VyIGV4Y2VwdGlvbiB2ZWN0b3JzIGFyZQorICAgICAqIGF0IGFkZHJlc3MgMCBpbiB0aGUgZmxhc2gsIGFuZCB3ZSBkb24ndCB3YW50IGEKKyAgICAgKiAodGlja2VyKSBleGNlcHRpb24gdG8gaGFwcGVuIHdoaWxlIHRoZSBmbGFzaAorICAgICAqIGNoaXAgaXMgaW4gcHJvZ3JhbW1pbmcgbW9kZS4KKyAgICAgKi8KKyAgICBmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICAvKiBjbGVhciBzdGF0dXMgcmVnaXN0ZXIgY29tbWFuZCAqLworICAgICphZGRyID0gMHgwMDUwMDA1MDsKKworICAgIC8qIHByb2dyYW0gc2V0LXVwIGNvbW1hbmQgKi8KKyAgICAqYWRkciA9IDB4MDA0MDAwNDA7CisKKyAgICAvKiBsYXRjaCBhZGRyZXNzL2RhdGEgKi8KKyAgICAqYWRkciA9IGRhdGE7CisKKyAgICAvKiBhcm0gc2ltcGxlLCBub24gaW50ZXJydXB0IGRlcGVuZGVudCB0aW1lciAqLworICAgIHJlc2V0X3RpbWVyX21hc2tlZCgpOworCisgICAgLyogcmVhZCBzdGF0dXMgcmVnaXN0ZXIgY29tbWFuZCAqLworICAgICphZGRyID0gMHgwMDcwMDA3MDsKKworICAgIC8qIHdhaXQgd2hpbGUgcG9sbGluZyB0aGUgc3RhdHVzIHJlZ2lzdGVyICovCisgICAgd2hpbGUoKCphZGRyICYgMHgwMDgwMDA4MCkgIT0gMHgwMDgwMDA4MCkKKyAgICB7CisJaWYgKGdldF90aW1lcl9tYXNrZWQoKSA+IENGR19GTEFTSF9XUklURV9UT1VUKSB7CisJICAgIHJjID0gRVJSX1RJTU9VVDsKKwkgICAgLyogc3VzcGVuZCBwcm9ncmFtIGNvbW1hbmQgKi8KKwkgICAgKmFkZHIgPSAweDAwQjAwMEIwOworCSAgICBnb3RvIG91dGFoZXJlOworCX0KKworCWlmKCAqYWRkciAmIDB4MDAzQTAwM0EpIHsJLyogY2hlY2sgZm9yIGVycm9yICovCisJICAgIGJhcmYgPSAqYWRkcjsKKwkgICAgaWYoIGJhcmYgJiAweDAwM0EwMDAwKSB7CisJCWJhcmYgPj49MTY7CisJICAgIH0gZWxzZSB7CisJCWJhcmYgJj0gMHgwMDAwMDAzQTsKKwkgICAgfQorCSAgICBwcmludGYoIlxuRmxhc2ggd3JpdGUgZXJyb3IgJTAybHggYXQgYWRkcmVzcyAlMDhseFxuIiwKKwkJICAgYmFyZiwgKHVuc2lnbmVkIGxvbmcpZGVzdCk7CisJICAgIGlmKGJhcmYgJiAweDAwMDIpIHsKKwkJcHJpbnRmKCJCbG9jayBsb2NrZWQsIG5vdCBlcmFzZWQuXG4iKTsKKwkJcmMgPSBFUlJfTk9UX0VSQVNFRDsKKwkJZ290byBvdXRhaGVyZTsKKwkgICAgfQorCSAgICBpZihiYXJmICYgMHgwMDEwKSB7CisJCXByaW50ZigiUHJvZ3JhbW1pbmcgZXJyb3IuXG4iKTsKKwkJcmMgPSBFUlJfUFJPR19FUlJPUjsKKwkJZ290byBvdXRhaGVyZTsKKwkgICAgfQorCSAgICBpZihiYXJmICYgMHgwMDA4KSB7CisJCXByaW50ZigiVnBwIExvdyBlcnJvci5cbiIpOworCQlyYyA9IEVSUl9QUk9HX0VSUk9SOworCQlnb3RvIG91dGFoZXJlOworCSAgICB9CisJICAgIHJjID0gRVJSX1BST0dfRVJST1I7CisJICAgIGdvdG8gb3V0YWhlcmU7CisJfQorICAgIH0KKworCitvdXRhaGVyZToKKyAgICAvKiByZWFkIGFycmF5IGNvbW1hbmQgKi8KKyAgICAqYWRkciA9IDB4MDBGRjAwRkY7CisKKyAgICBpZiAoZmxhZykKKyAgICAgIGVuYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHkgbWVtb3J5IHRvIGZsYXNoLgorICovCisKK2ludCB3cml0ZV9idWZmIChmbGFzaF9pbmZvX3QgKmluZm8sIHVjaGFyICpzcmMsIHVsb25nIGFkZHIsIHVsb25nIGNudCkKK3sKKyAgICB1bG9uZyBjcCwgd3AsIGRhdGE7CisgICAgaW50IGw7CisgICAgaW50IGksIHJjOworCisgICAgd3AgPSAoYWRkciAmIH4zKTsJLyogZ2V0IGxvd2VyIHdvcmQgYWxpZ25lZCBhZGRyZXNzICovCisKKyAgICAvKgorICAgICAqIGhhbmRsZSB1bmFsaWduZWQgc3RhcnQgYnl0ZXMKKyAgICAgKi8KKyAgICBpZiAoKGwgPSBhZGRyIC0gd3ApICE9IDApIHsKKwlkYXRhID0gMDsKKwlmb3IgKGk9MCwgY3A9d3A7IGk8bDsgKytpLCArK2NwKSB7CisJICAgIGRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqKHVjaGFyICopY3AgPDwgMjQpOworCX0KKwlmb3IgKDsgaTw0ICYmIGNudD4wOyArK2kpIHsKKwkgICAgZGF0YSA9IChkYXRhID4+IDgpIHwgKCpzcmMrKyA8PCAyNCk7CisJICAgIC0tY250OworCSAgICArK2NwOworCX0KKwlmb3IgKDsgY250PT0wICYmIGk8NDsgKytpLCArK2NwKSB7CisJICAgIGRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqKHVjaGFyICopY3AgPDwgMjQpOworCX0KKworCWlmICgocmMgPSB3cml0ZV93b3JkKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworCSAgICByZXR1cm4gKHJjKTsKKwl9CisJd3AgKz0gNDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGhhbmRsZSB3b3JkIGFsaWduZWQgcGFydAorICAgICAqLworICAgIHdoaWxlIChjbnQgPj0gNCkgeworCWRhdGEgPSAqKCh2dV9sb25nKilzcmMpOworCWlmICgocmMgPSB3cml0ZV93b3JkKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworCSAgICByZXR1cm4gKHJjKTsKKwl9CisJc3JjICs9IDQ7CisJd3AgICs9IDQ7CisJY250IC09IDQ7CisgICAgfQorCisgICAgaWYgKGNudCA9PSAwKSB7CisJcmV0dXJuIEVSUl9PSzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGhhbmRsZSB1bmFsaWduZWQgdGFpbCBieXRlcworICAgICAqLworICAgIGRhdGEgPSAwOworICAgIGZvciAoaT0wLCBjcD13cDsgaTw0ICYmIGNudD4wOyArK2ksICsrY3ApIHsKKwlkYXRhID0gKGRhdGEgPj4gOCkgfCAoKnNyYysrIDw8IDI0KTsKKwktLWNudDsKKyAgICB9CisgICAgZm9yICg7IGk8NDsgKytpLCArK2NwKSB7CisJZGF0YSA9IChkYXRhID4+IDgpIHwgKCoodWNoYXIgKiljcCA8PCAyNCk7CisgICAgfQorCisgICAgcmV0dXJuIHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvaW1wYTcvdS1ib290LmxkcyBiL2JvYXJkL2ltcGE3L3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0OTY0OAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2ltcGE3L3UtYm9vdC5sZHMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAgICAgICAuID0gMHgwMDAwMDAwMDsKKworICAgICAgICAuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L2FybTcyMHQvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLmRhdGEgOiB7ICooLmRhdGEpIH0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5nb3QgOiB7ICooLmdvdCkgfQorCisJYXJtYm9vdF9lbmRfZGF0YSA9IC47CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAuYnNzIDogeyAqKC5ic3MpIH0KKworCWFybWJvb3RfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2xhcnQvdS1ib290LmxkcyBiL2JvYXJkL2xhcnQvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGIwYWRlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbGFydC91LWJvb3QubGRzCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgICAgICAgLiA9IDB4MDAwMDAwMDA7CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9zYTExMDAvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLmRhdGEgOiB7ICooLmRhdGEpIH0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5nb3QgOiB7ICooLmdvdCkgfQorCisJYXJtYm9vdF9lbmRfZGF0YSA9IC47CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAuYnNzIDogeyAqKC5ic3MpIH0KKworCWFybWJvb3RfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL21ieDh4eC9tYng4eHguYyBiL2JvYXJkL21ieDh4eC9tYng4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTliZjgwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbWJ4OHh4L21ieDh4eC5jCkBAIC0wLDAgKzEsMzc5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiBCb2FyZCBzcGVjaWZpYyByb3V0aW5lcyBmb3IgdGhlIE1CWAorICoKKyAqIC0gaW5pdGlhbGlzYXRpb24KKyAqIC0gaW50ZXJmYWNlIHRvIFZQRCBkYXRhIChtYWMgYWRkcmVzcywgY2xvY2sgc3BlZWRzKQorICogLSBtZW1vcnkgY29udHJvbGxlcgorICogLSBzZXJpYWwgaW8gaW5pdGlhbGlzYXRpb24KKyAqIC0gZXRoZXJuZXQgaW8gaW5pdGlhbGlzYXRpb24KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjaW5jbHVkZSAiZGltbS5oIgorI2luY2x1ZGUgInZwZC5oIgorI2luY2x1ZGUgImNzci5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCB1aW50IHNkcmFtX3RhYmxlXzQwW10gPSB7CisJLyogRFJBTSAtIHNpbmdsZSByZWFkLiAob2Zmc2V0IDAgaW4gdXBtIFJBTSkKKwkgKi8KKwkweENGQUZDMDA0LCAweDBGQUZDNDA0LCAweDBDQUYwQzA0LCAweDMwQUYwQzAwLAorCTB4RjFCRjQ4MDUsIDB4RkZGRkMwMDUsIDB4RkZGRkMwMDUsIDB4RkZGRkMwMDUsCisKKwkvKiBEUkFNIC0gYnVyc3QgcmVhZC4gKG9mZnNldCA4IGluIHVwbSBSQU0pCisJICovCisJMHhDRkFGQzAwNCwgMHgwRkFGQzQwNCwgMHgwQ0FGMEMwNCwgMHgwM0FGMEMwOCwKKwkweDBDQUYwQzA0LCAweDAzQUYwQzA4LCAweDBDQUYwQzA0LCAweDAzQUYwQzA4LAorCTB4MENBRjBDMDQsIDB4MzBBRjBDMDAsIDB4RjNCRjQ4MDUsIDB4RkZGRkMwMDUsCisJMHhGRkZGQzAwNSwgMHhGRkZGQzAwNSwgMHhGRkZGQzAwNSwgMHhGRkZGQzAwNSwKKworCS8qIERSQU0gLSBzaW5nbGUgd3JpdGUuIChvZmZzZXQgMTggaW4gdXBtIFJBTSkKKwkgKi8KKwkweENGRkYwMDA0LCAweDBGRkYwNDA0LCAweDBDRkYwQzAwLCAweDMzRkY0ODA0LAorCTB4RkZGRkMwMDUsIDB4RkZGRkMwMDUsIDB4RkZGRkMwMDUsIDB4RkZGRkMwMDUsCisKKwkvKiBEUkFNIC0gYnVyc3Qgd3JpdGUuIChvZmZzZXQgMjAgaW4gdXBtIFJBTSkKKwkgKi8KKwkweENGRkYwMDA0LCAweDBGRkYwNDA0LCAweDBDRkYwQzAwLCAweDAzRkYwQzBDLAorCTB4MENGRjBDMDAsIDB4MDNGRjBDMEMsIDB4MENGRjBDMDAsIDB4MDNGRjBDMEMsCisJMHgwQ0ZGMEMwMCwgMHgzM0ZGNDgwNCwgMHhGRkZGQzAwNSwgMHhGRkZGQzAwNSwKKwkweEZGRkZDMDA1LCAweEZGRkZDMDA1LCAweEZGRkZDMDA1LCAweEZGRkZDMDA1LAorCisJLyogcmVmcmVzaCAgKG9mZnNldCAzMCBpbiB1cG0gUkFNKQorCSAqLworCTB4RkNGRkMwMDQsIDB4QzBGRkMwMDQsIDB4MDFGRkMwMDQsIDB4MEZGRkMwMDQsCisJMHgzRkZGQzAwNCwgMHhGRkZGQzAwNSwgMHhGRkZGQzAwNSwgMHhGRkZGQzAwNSwKKwkweEZGRkZDMDA1LCAweEZGRkZDMDA1LCAweEZGRkZDMDA1LCAweEZGRkZDMDA1LAorCisJLyogZXhjZXB0aW9uLiAob2Zmc2V0IDNjIGluIHVwbSBSQU0pCisJICovCisJMHhGRkZGQzAwNywgMHhGRkZGQzAwNywgMHhGRkZGQzAwNywgMHhGRkZGQzAwNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50IHNkcmFtX3RhYmxlXzUwW10gPSB7CisJLyogRFJBTSAtIHNpbmdsZSByZWFkLiAob2Zmc2V0IDAgaW4gdXBtIFJBTSkKKwkgKi8KKwkweENGQUZDMDA0LCAweDBGQUZDNDA0LCAweDBDQUY4QzA0LCAweDEwQUYwQzA0LAorCTB4RjBBRjBDMDAsIDB4RjNCRjQ4MDUsIDB4RkZGRkMwMDUsIDB4RkZGRkMwMDUsCisKKwkvKiBEUkFNIC0gYnVyc3QgcmVhZC4gKG9mZnNldCA4IGluIHVwbSBSQU0pCisJICovCisJMHhDRkFGQzAwNCwgMFgwRkFGQzQwNCwgMFgwQ0FGOEMwNCwgMFgwMEFGMEMwNCwKKyAgLyoJMFgwN0FGMEMwOCwgMFgwQ0FGMEMwNCwgMFgwMUFGMEMwNCwgMFgwRkFGMEMwNCwJKi8KKwkwWDA3QUYwQzA4LCAwWDBDQUYwQzA0LCAwWDAxQUYwQzA0LCAwWDBGQUYwQzA4LAorCTBYMENBRjBDMDQsIDBYMDFBRjBDMDQsIDBYMEZBRjBDMDgsIDBYMENBRjBDMDQsCisgIC8qCTBYMTBBRjBDMDQsIDBYRjBBRkMwMDAsIDBYRjNGRjQ4MDUsIDBYRkZGRkMwMDUsCSovCisJMFgxMEFGMEMwNCwgMFhGMEFGQzAwMCwgMFhGM0JGNDgwNSwgMFhGRkZGQzAwNSwKKworCS8qIERSQU0gLSBzaW5nbGUgd3JpdGUuIChvZmZzZXQgMTggaW4gdXBtIFJBTSkKKwkgKi8KKwkweENGRkYwMDA0LCAweDBGRkYwNDA0LCAweDBDRkYwQzAwLCAweDEzRkY0ODA0LAorCTB4RkZGRkMwMDQsIDB4RkZGRkMwMDUsIDB4RkZGRkMwMDUsIDB4RkZGRkMwMDUsCisKKwkvKiBEUkFNIC0gYnVyc3Qgd3JpdGUuIChvZmZzZXQgMjAgaW4gdXBtIFJBTSkKKwkgKi8KKwkweENGRkYwMDA0LCAweDBGRkYwNDA0LCAweDBDRkYwQzAwLCAweDAzRkYwQzBDLAorCTB4MENGRjBDMDAsIDB4MDNGRjBDMEMsIDB4MENGRjBDMDAsIDB4MDNGRjBDMEMsCisJMHgwQ0ZGMEMwMCwgMHgxM0ZGNDgwNCwgMHhGRkZGQzAwNCwgMHhGRkZGQzAwNSwKKwkweEZGRkZDMDA1LCAweEZGRkZDMDA1LCAweEZGRkZDMDA1LCAweEZGRkZDMDA1LAorCisJLyogcmVmcmVzaCAgKG9mZnNldCAzMCBpbiB1cG0gUkFNKQorCSAqLworCTB4RkNGRkMwMDQsIDB4QzBGRkMwMDQsIDB4MDFGRkMwMDQsIDB4MEZGRkMwMDQsCisJMHgxRkZGQzAwNCwgMHhGRkZGQzAwNCwgMHhGRkZGQzAwNSwgMHhGRkZGQzAwNSwKKwkweEZGRkZDMDA1LCAweEZGRkZDMDA1LCAweEZGRkZDMDA1LCAweEZGRkZDMDA1LAorCisJLyogZXhjZXB0aW9uLiAob2Zmc2V0IDNjIGluIHVwbSBSQU0pCisJICovCisJMHhGRkZGQzAwNywgMHhGRkZGQzAwNywgMHhGRkZGQzAwNywgMHhGRkZGQzAwNywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfcmVmZnJlcSh2b2lkKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYm9hcmRfZ2V0X2NwdWZyZXEodm9pZCk7CisKK3ZvaWQgbWJ4X2luaXQgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIG1lbWN0bDh4eF90ICptZW1jdGwgPSAmaW1tci0+aW1fbWVtY3RsOworCXVsb25nIHNwZWVkLCByZWZjbG9jaywgcGxwcmNyLCBzY2NyOworCXVsb25nIGJyMF8zMiA9IG1lbWN0bC0+bWVtY19icjAgJiAweDQwMDsKKworCS8qIHJlYWwtdGltZSBjbG9jayBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlpbW1yLT5pbV9zaXRrLnNpdGtfcnRjc2NrID0gS0FQV1JfS0VZOworCWltbXItPmltX3NpdC5zaXRfcnRjc2MgPSAweDAwQzM7CisKKwkvKiBTSUVMIGFuZCBTSU1BU0sgUmVnaXN0ZXJzIChzZWUgTUJYIFBSRyAyLTMpICovCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2ltYXNrID0gMHgwMDAwMDAwMDsKKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zaWVsID0gMHhBQUFBMDAwMDsKKwlpbW1yLT5pbV9zaXVfY29uZi5zY190ZXNyID0gMHhGRkZGRkZGRjsKKworCS8qCisJICogUHJlcGFyZSBhY2Nlc3MgdG8gaTJjIGJ1cy4gVGhlIE1CWCBvZmZlcnMgMyBkZXZpY2VzIG9uIHRoZSBpMmMgYnVzOgorCSAqIDEuIFZpdGFsIFByb2R1Y3QgRGF0YSAoY29udGFpbnMgY2xvY2sgc3BlZWRzLCBNQUMgYWRkcmVzcyBldGMsIHNlZSB2cGQuaCkKKwkgKiAyLiBSQU0gIFNwZWNzIChzZWUgZGltbS5oKQorCSAqIDIuIERJTU0gU3BlY3MgKHNlZSBkaW1tLmgpCisJICovCisJdnBkX2luaXQgKCk7CisKKwkvKiBzeXN0ZW0gY2xvY2sgYW5kIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlpbW1yLT5pbV9jbGtyc3RrLmNhcmtfc2NjcmsgPSBLQVBXUl9LRVk7CisJc2NjciA9IGltbXItPmltX2Nsa3JzdC5jYXJfc2NjcjsKKwlzY2NyICY9IFNDQ1JfTUFTSzsKKwlzY2NyIHw9IENGR19TQ0NSOworCWltbXItPmltX2Nsa3JzdC5jYXJfc2NjciA9IHNjY3I7CisKKwlzcGVlZCA9IGJvYXJkX2dldF9jcHVmcmVxICgpOworCXJlZmNsb2NrID0gZ2V0X3JlZmZyZXEgKCk7CisKKyNpZiAoKENGR19QTFBSQ1IgJiBQTFBSQ1JfTUZfTVNLKSAhPSAwKQorCXBscHJjciA9IENGR19QTFBSQ1I7CisjZWxzZQorCXBscHJjciA9IGltbXItPmltX2Nsa3JzdC5jYXJfcGxwcmNyOworCXBscHJjciAmPSBQTFBSQ1JfTUZfTVNLOwkvKiBpc29sYXRlIE1GIGZpZWxkICovCisJcGxwcmNyIHw9IENGR19QTFBSQ1I7CQkvKiByZXNldCBjb250cm9sIGJpdHMgICAqLworI2VuZGlmCisKKyNpZmRlZiBDRkdfVVNFX09TQ0NMSwkJCS8qIFNlZSBkb2MvUkVBRE1FLk1CWCAhICovCisJcGxwcmNyIHw9ICgoc3BlZWQgKyByZWZjbG9jayAvIDIpIC8gcmVmY2xvY2sgLSAxKSA8PCAyMDsKKyNlbmRpZgorCisJaW1tci0+aW1fY2xrcnN0ay5jYXJrX3BscHJjcmsgPSBLQVBXUl9LRVk7CisJaW1tci0+aW1fY2xrcnN0LmNhcl9wbHByY3IgPSBwbHByY3I7CisKKwkvKgorCSAqIHByZWxpbWluYXJ5IHNldHVwIG9mIG1lbW9yeSBjb250cm9sbGVyOgorCSAqIC0gbWFwIEZsYXNoLCBvdGhlcndpc2UgY29uZmlndXJhdGlvbi9zdGF0dXMKKwkgKiAgICByZWdpc3RlcnMgd29uJ3QgYmUgYWNjZXNzaWJsZSB3aGVuIHJlYWQKKwkgKiAgICBieSBib2FyZF9pbml0X2YuCisJICogLSBtYXAgTlZSQU0gYW5kIGNvbmZpZ3VhdGlvbi9zdGF0dXMgcmVnaXN0ZXJzLgorCSAqIC0gbWFwIHBjaSByZWdpc3RlcnMuCisJICogLSBET04nVCBtYXAgcmFtIHlldCwgdGhpcyBpcyBkb25lIGluIGluaXRkcmFtKCkuCisJICovCisJc3dpdGNoIChzcGVlZCAvIDEwMDAwMDApIHsKKwljYXNlIDQwOgorCQltZW1jdGwtPm1lbWNfYnIwID0gMHhGRTAwMDAwMCB8IGJyMF8zMiB8IDE7CisJCW1lbWN0bC0+bWVtY19vcjAgPSAweEZGODAwOTMwOworCQltZW1jdGwtPm1lbWNfb3I0ID0gQ0ZHX05WUkFNX09SIHwgMHg5MjA7CisJCW1lbWN0bC0+bWVtY19icjQgPSBDRkdfTlZSQU1fQkFTRSB8IDB4NDAxOworCQlicmVhazsKKwljYXNlIDUwOgorCQltZW1jdGwtPm1lbWNfYnIwID0gMHhGRTAwMDAwMCB8IGJyMF8zMiB8IDE7CisJCW1lbWN0bC0+bWVtY19vcjAgPSAweEZGODAwOTQwOworCQltZW1jdGwtPm1lbWNfb3I0ID0gQ0ZHX05WUkFNX09SIHwgMHg5MzA7CisJCW1lbWN0bC0+bWVtY19icjQgPSBDRkdfTlZSQU1fQkFTRSB8IDB4NDAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQloYW5nICgpOworCQlicmVhazsKKwl9CisjaWZkZWYgQ09ORklHX1VTRV9QQ0kKKwltZW1jdGwtPm1lbWNfb3I1ID0gQ0ZHX1BDSU1FTV9PUjsKKwltZW1jdGwtPm1lbWNfYnI1ID0gQ0ZHX1BDSU1FTV9CQVNFIHwgMHgwMDE7CisJbWVtY3RsLT5tZW1jX29yNiA9IENGR19QQ0lCUklER0VfT1I7CisJbWVtY3RsLT5tZW1jX2JyNiA9IENGR19QQ0lCUklER0VfQkFTRSB8IDB4MDAxOworI2VuZGlmCisJLyoKKwkgKiBGSVhNRTogSSBkbyBub3QgdW5kZXJzdGFuZCB3aHkgSSBoYXZlIHRvIGNhbGwgdGhpcyB0bworCSAqIGluaXRpYWxpc2UgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaGVyZSBiZWZvcmUgYm9vdGluZyBmcm9tCisJICogdGhlIFBDTUNJQSBjYXJkIGJ1dCBpZiBJIGRvIG5vdCB0aGUgTGludXgga2VybmVsIGZhbGxzCisJICogb3ZlciBpbiBhIGJpZyBoZWFwLiBJZiB5b3UgY2FuIGFuc3dlciB0aGlzIHF1ZXN0aW9uIEkKKwkgKiB3b3VsZCBsaWtlIHRvIGtub3cgYWJvdXQgaXQuCisJICovCisJYm9hcmRfZXRoZXJfaW5pdCgpOworfQorCit2b2lkIGJvYXJkX3NlcmlhbF9pbml0ICh2b2lkKQoreworCU1CWF9DU1IxICY9IH4oQ1NSMV9DT00xRU4gfCBDU1IxX1hDVlJESVMpOworfQorCit2b2lkIGJvYXJkX2V0aGVyX2luaXQgKHZvaWQpCit7CisJTUJYX0NTUjEgJj0gfihDU1IxX0VBRU4gfCBDU1IxX0VMRU4pOworCU1CWF9DU1IxIHw9IENTUjFfRVRFTiB8IENTUjFfVFBFTiB8IENTUjFfRkRESVM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYm9hcmRfZ2V0X2NwdWZyZXEgKHZvaWQpCit7CisjaWZuZGVmIENPTkZJR184eHhfR0NMS19GUkVRCisJdnBkX3BhY2tldF90ICpwYWNrZXQ7CisKKwlwYWNrZXQgPSB2cGRfZmluZF9wYWNrZXQgKFZQRF9QSURfSUNTKTsKKwlyZXR1cm4gKigodWxvbmcgKikgcGFja2V0LT5kYXRhKTsKKyNlbHNlCisJcmV0dXJuKCh1bnNpZ25lZCBpbnQpQ09ORklHXzh4eF9HQ0xLX0ZSRVEgKTsKKyNlbmRpZiAvKiBDT05GSUdfOHh4X0dDTEtfRlJFUSAqLworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9yZWZmcmVxICh2b2lkKQoreworCXZwZF9wYWNrZXRfdCAqcGFja2V0OworCisJcGFja2V0ID0gdnBkX2ZpbmRfcGFja2V0IChWUERfUElEX1JDUyk7CisJcmV0dXJuICooKHVsb25nICopIHBhY2tldC0+ZGF0YSk7Cit9CisKK3ZvaWQgYm9hcmRfZ2V0X2VuZXRhZGRyICh1Y2hhciAqIGFkZHIpCit7CisJaW50IGk7CisJdnBkX3BhY2tldF90ICpwYWNrZXQ7CisKKwlwYWNrZXQgPSB2cGRfZmluZF9wYWNrZXQgKFZQRF9QSURfRUEpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWFkZHJbaV0gPSBwYWNrZXQtPmRhdGFbaV07Cit9CisKKy8qCisgKiBDaGVjayBCb2FyZCBJZGVudGl0eToKKyAqLworCitpbnQgY2hlY2tib2FyZCAodm9pZCkKK3sKKwl2cGRfcGFja2V0X3QgKnBhY2tldDsKKwlpbnQgaTsKKwljb25zdCBjaGFyICpjb25zdCBmbXQgPQorCQkiXG4JICoqKiBXYXJuaW5nOiBMb3cgQmF0dGVyeSBTdGF0dXMgLSAlcyBCYXR0ZXJ5ICoqKiI7CisKKwlwdXRzICgiQm9hcmQ6ICIpOworCisJcGFja2V0ID0gdnBkX2ZpbmRfcGFja2V0IChWUERfUElEX1BJRCk7CisJZm9yIChpID0gMDsgaSA8IHBhY2tldC0+c2l6ZTsgaSsrKSB7CisJCXNlcmlhbF9wdXRjIChwYWNrZXQtPmRhdGFbaV0pOworCX0KKwlwYWNrZXQgPSB2cGRfZmluZF9wYWNrZXQgKFZQRF9QSURfTVQpOworCWZvciAoaSA9IDA7IGkgPCBwYWNrZXQtPnNpemU7IGkrKykgeworCQlzZXJpYWxfcHV0YyAocGFja2V0LT5kYXRhW2ldKTsKKwl9CisJc2VyaWFsX3B1dGMgKCcoJyk7CisJcGFja2V0ID0gdnBkX2ZpbmRfcGFja2V0IChWUERfUElEX0ZBTik7CisJZm9yIChpID0gMDsgaSA8IHBhY2tldC0+c2l6ZTsgaSsrKSB7CisJCXNlcmlhbF9wdXRjIChwYWNrZXQtPmRhdGFbaV0pOworCX0KKwlzZXJpYWxfcHV0YyAoJyknKTsKKworCWlmICghKE1CWF9DU1IyICYgU1IyX0JBVEdEKSkKKwkJcHJpbnRmIChmbXQsICJPbi1Cb2FyZCIpOworCWlmICghKE1CWF9DU1IyICYgU1IyX05WQkFUR0QpKQorCQlwcmludGYgKGZtdCwgIk5WUkFNIik7CisKKwlzZXJpYWxfcHV0YyAoJ1xuJyk7CisKKwlyZXR1cm4gKDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1bG9uZyBnZXRfcmFtc2l6ZSAoZGltbV90ICogZGltbSkKK3sKKwl1bG9uZyBzaXplID0gMDsKKworCWlmIChkaW1tLT5mbXQgPT0gMSB8fCBkaW1tLT5mbXQgPT0gMiB8fCBkaW1tLT5mbXQgPT0gMworCQl8fCBkaW1tLT5mbXQgPT0gNCkgeworCQlzaXplID0gKDEgPDwgKGRpbW0tPm5fcm93ICsgZGltbS0+bl9jb2wpKSAqIGRpbW0tPm5fYmFua3MgKgorCQkJKChkaW1tLT5kYXRhX3dfaGkgPDwgOCB8IGRpbW0tPmRhdGFfd19sbykgLyA4KTsKKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKworbG9uZyBpbnQgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOworCXVuc2lnbmVkIGxvbmcgcmFtX3N6ID0gMDsKKwl1bnNpZ25lZCBsb25nIGRpbW1fc3ogPSAwOworCWRpbW1fdCB2cGRfZGltbSwgdnBkX2RyYW07CisJdW5zaWduZWQgaW50IHNwZWVkID0gYm9hcmRfZ2V0X2NwdWZyZXEgKCkgLyAxMDAwMDAwOworCisJaWYgKHZwZF9yZWFkICgweGEyLCAodWNoYXIgKikgJiB2cGRfZGltbSwgc2l6ZW9mICh2cGRfZGltbSksIDApID4gMCkgeworCQlkaW1tX3N6ID0gZ2V0X3JhbXNpemUgKCZ2cGRfZGltbSk7CisJfQorCWlmICh2cGRfcmVhZCAoMHhhNiwgKHVjaGFyICopICYgdnBkX2RyYW0sIHNpemVvZiAodnBkX2RyYW0pLCAwKSA+IDApIHsKKwkJcmFtX3N6ID0gZ2V0X3JhbXNpemUgKCZ2cGRfZHJhbSk7CisJfQorCisJLyoKKwkgKiBPbmx5IGluaXRpYWxpemUgbWVtb3J5IGNvbnRyb2xsZXIgd2hlbiBydW5uaW5nIGZyb20gRkxBU0guCisJICogV2hlbiBydW5uaW5nIGZyb20gUkFNLCBkb24ndCB0b3VjaCBpdC4KKwkgKi8KKwlpZiAoKHVsb25nKSBpbml0ZHJhbSAmIDB4ZmYwMDAwMDApIHsKKwkJdWxvbmcgZGltbV9iYW5rOworCQl1bG9uZyBicjBfMzIgPSBtZW1jdGwtPm1lbWNfYnIwICYgMHg0MDA7CisKKwkJc3dpdGNoIChzcGVlZCkgeworCQljYXNlIDQwOgorCQkJdXBtY29uZmlnIChVUE1BLCAodWludCAqKSBzZHJhbV90YWJsZV80MCwKKwkJCQkJICAgc2l6ZW9mIChzZHJhbV90YWJsZV80MCkgLyBzaXplb2YgKHVpbnQpKTsKKwkJCW1lbWN0bC0+bWVtY19tcHRwciA9IDB4MDIwMDsKKwkJCW1lbWN0bC0+bWVtY19tYW1yID0gZGltbV9zeiA/IDB4MDY4MDEwMDAgOiAweDEzODAxMDAwOworCQkJbWVtY3RsLT5tZW1jX29yNyA9IDB4ZmY4MDA5MzA7CisJCQltZW1jdGwtPm1lbWNfYnI3ID0gMHhmYzAwMDAwMCB8IChicjBfMzIgXiBicjBfMzIpIHwgMTsKKwkJCWJyZWFrOworCQljYXNlIDUwOgorCQkJdXBtY29uZmlnIChVUE1BLCAodWludCAqKSBzZHJhbV90YWJsZV81MCwKKwkJCQkJICAgc2l6ZW9mIChzZHJhbV90YWJsZV81MCkgLyBzaXplb2YgKHVpbnQpKTsKKwkJCW1lbWN0bC0+bWVtY19tcHRwciA9IDB4MDIwMDsKKwkJCW1lbWN0bC0+bWVtY19tYW1yID0gZGltbV9zeiA/IDB4MDg4MDEwMDAgOiAweDE4ODAxMDA7CisJCQltZW1jdGwtPm1lbWNfb3I3ID0gMHhmZjgwMDk0MDsKKwkJCW1lbWN0bC0+bWVtY19icjcgPSAweGZjMDAwMDAwIHwgKGJyMF8zMiBeIGJyMF8zMikgfCAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloYW5nICgpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBub3cgbWFwIHJhbSBhbmQgZGltbSwgbGFyZ2VzdCBvbmUgZmlyc3QgKi8KKwkJZGltbV9iYW5rID0gZGltbV9zeiAvIDI7CisJCWlmICghZGltbV9zeikgeworCQkJbWVtY3RsLT5tZW1jX29yMSA9IH4ocmFtX3N6IC0gMSkgfCAweDQwMDsKKwkJCW1lbWN0bC0+bWVtY19icjEgPSBDRkdfU0RSQU1fQkFTRSB8IDB4ODE7CisJCQltZW1jdGwtPm1lbWNfYnIyID0gMDsKKwkJCW1lbWN0bC0+bWVtY19icjMgPSAwOworCQl9IGVsc2UgaWYgKHJhbV9zeiA+IGRpbW1fYmFuaykgeworCQkJbWVtY3RsLT5tZW1jX29yMSA9IH4ocmFtX3N6IC0gMSkgfCAweDQwMDsKKwkJCW1lbWN0bC0+bWVtY19icjEgPSBDRkdfU0RSQU1fQkFTRSB8IDB4ODE7CisJCQltZW1jdGwtPm1lbWNfb3IyID0gfihkaW1tX2JhbmsgLSAxKSB8IDB4NDAwOworCQkJbWVtY3RsLT5tZW1jX2JyMiA9IChDRkdfU0RSQU1fQkFTRSArIHJhbV9zeikgfCAweDgxOworCQkJbWVtY3RsLT5tZW1jX29yMyA9IH4oZGltbV9iYW5rIC0gMSkgfCAweDQwMDsKKwkJCW1lbWN0bC0+bWVtY19icjMgPSAoQ0ZHX1NEUkFNX0JBU0UgKyByYW1fc3ogKyBkaW1tX2JhbmspIFwKKwkJCQkJCQkJICAgICB8IDB4ODE7CisJCX0gZWxzZSB7CisJCQltZW1jdGwtPm1lbWNfb3IyID0gfihkaW1tX2JhbmsgLSAxKSB8IDB4NDAwOworCQkJbWVtY3RsLT5tZW1jX2JyMiA9IENGR19TRFJBTV9CQVNFIHwgMHg4MTsKKwkJCW1lbWN0bC0+bWVtY19vcjMgPSB+KGRpbW1fYmFuayAtIDEpIHwgMHg0MDA7CisJCQltZW1jdGwtPm1lbWNfYnIzID0gKENGR19TRFJBTV9CQVNFICsgZGltbV9iYW5rKSB8IDB4ODE7CisJCQltZW1jdGwtPm1lbWNfb3IxID0gfihyYW1fc3ogLSAxKSB8IDB4NDAwOworCQkJbWVtY3RsLT5tZW1jX2JyMSA9IChDRkdfU0RSQU1fQkFTRSArIGRpbW1fc3opIHwgMHg4MTsKKwkJfQorCX0KKworCXJldHVybiByYW1fc3ogKyBkaW1tX3N6OworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbWwyL3NlcmlhbC5jIGIvYm9hcmQvbWwyL3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOWE4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9tbDIvc2VyaWFsLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFBldGVyIERlIFNjaHJpanZlciAocDJAbWluZC5iZSksIE1pbmQgTGludXggU29sdXRpb25zLCBOVi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS91LWJvb3QuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNvbmZpZ3MvTUwyLmg+CisKKyNpZiAoZGVmaW5lZCBDRkdfSU5JVF9DSEFOMSkgfHwgKGRlZmluZWQgQ0ZHX0lOSVRfQ0hBTjIpCisjaW5jbHVkZSA8bnMxNjU1MC5oPgorI2VuZGlmCisKKyNpZiAwCisjaW5jbHVkZSAic2VyaWFsLmgiCisjZW5kaWYKKworI2lmIChkZWZpbmVkIENGR19JTklUX0NIQU4xKSB8fCAoZGVmaW5lZCBDRkdfSU5JVF9DSEFOMikKK2NvbnN0IE5TMTY1NTBfdCBDT01fUE9SVFNbXSA9IHsgKE5TMTY1NTBfdCkgQ0ZHX05TMTY1NTBfQ09NMSwKKwkJICAgICAgICAgICAgICAgIChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTIgfTsKKyNlbmRpZgorCitpbnQKK3NlcmlhbF9pbml0ICh2b2lkKQoreworCQlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCSAgICBpbnQgY2xvY2tfZGl2aXNvciA9IENGR19OUzE2NTUwX0NMSyAvIDE2IC8gZ2QtPmJhdWRyYXRlOworCisjaWZkZWYgQ0ZHX0lOSVRfQ0hBTjEKKwkgICAgKHZvaWQpTlMxNjU1MF9pbml0KENPTV9QT1JUU1swXSwgY2xvY2tfZGl2aXNvcik7CisjZW5kaWYKKyNpZmRlZiBDRkdfSU5JVF9DSEFOMgorCSAgICAodm9pZClOUzE2NTUwX2luaXQoQ09NX1BPUlRTWzFdLCBjbG9ja19kaXZpc29yKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKworfQorCit2b2lkCitzZXJpYWxfcHV0Yyhjb25zdCBjaGFyIGMpCit7CisgICAgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgTlMxNjU1MF9wdXRjKENPTV9QT1JUU1tDRkdfRFVBUlRfQ0hBTl0sICdccicpOworCisgICAgTlMxNjU1MF9wdXRjKENPTV9QT1JUU1tDRkdfRFVBUlRfQ0hBTl0sIGMpOworfQorCitpbnQKK3NlcmlhbF9nZXRjKHZvaWQpCit7CisgICAgcmV0dXJuIE5TMTY1NTBfZ2V0YyhDT01fUE9SVFNbQ0ZHX0RVQVJUX0NIQU5dKTsKK30KKworaW50CitzZXJpYWxfdHN0Yyh2b2lkKQoreworICAgIHJldHVybiBOUzE2NTUwX3RzdGMoQ09NX1BPUlRTW0NGR19EVUFSVF9DSEFOXSk7Cit9CisKK3ZvaWQKK3NlcmlhbF9zZXRicmcgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyAgICBpbnQgY2xvY2tfZGl2aXNvciA9IENGR19OUzE2NTUwX0NMSyAvIDE2IC8gZ2QtPmJhdWRyYXRlOworCisjaWZkZWYgQ0ZHX0lOSVRfQ0hBTjEKKyAgICBOUzE2NTUwX3JlaW5pdChDT01fUE9SVFNbMF0sIGNsb2NrX2Rpdmlzb3IpOworI2VuZGlmCisjaWZkZWYgQ0ZHX0lOSVRfQ0hBTjIKKyAgICBOUzE2NTUwX3JlaW5pdChDT01fUE9SVFNbMV0sIGNsb2NrX2Rpdmlzb3IpOworI2VuZGlmCit9CisKK3ZvaWQKK3NlcmlhbF9wdXRzIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlzZXJpYWxfcHV0YyAoKnMrKyk7CisJfQorfQorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKK3ZvaWQKK2tnZGJfc2VyaWFsX2luaXQodm9pZCkKK3sKK30KKwordm9pZAorcHV0RGVidWdDaGFyIChpbnQgYykKK3sKKwlzZXJpYWxfcHV0YyAoYyk7Cit9CisKK3ZvaWQKK3B1dERlYnVnU3RyIChjb25zdCBjaGFyICpzdHIpCit7CisJc2VyaWFsX3B1dHMgKHN0cik7Cit9CisKK2ludAorZ2V0RGVidWdDaGFyICh2b2lkKQoreworCXJldHVybiBzZXJpYWxfZ2V0YygpOworfQorCit2b2lkCitrZ2RiX2ludGVycnVwdGlibGUgKGludCB5ZXMpCit7CisJcmV0dXJuOworfQorI2VuZGlmCS8qIENGR19DTURfS0dEQgkqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbW91c3NlL3BjaS5jIGIvYm9hcmQvbW91c3NlL3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Y2EyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9tb3Vzc2UvcGNpLmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogSmFtZXMgRG91Z2hlcnR5IChqZmRAY3Muc3RhbmZvcmQuZWR1KQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBQQ0kgQ29uZmlndXJhdGlvbiBzcGFjZSBhY2Nlc3Mgc3VwcG9ydCBmb3IgTVBDODI0eC9NUEMxMDcgUENJIEJyaWRnZQorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODI0eC5oPgorI2luY2x1ZGUgPHBjaS5oPgorCisjaW5jbHVkZSAibW91c3NlLmgiCisKKy8qCisgKiBQcm9taXNlIEFUQS82NiBzdXBwb3J0LgorICovCisjZGVmaW5lIFhGRVJfUElPXzQJMHgwQwkvKiAwMDAwfDExMDAgKi8KKyNkZWZpbmUgWEZFUl9QSU9fMwkweDBCCS8qIDAwMDB8MTAxMSAqLworI2RlZmluZSBYRkVSX1BJT18yCTB4MEEJLyogMDAwMHwxMDEwICovCisjZGVmaW5lIFhGRVJfUElPXzEJMHgwOQkvKiAwMDAwfDEwMDEgKi8KKyNkZWZpbmUgWEZFUl9QSU9fMAkweDA4CS8qIDAwMDB8MTAwMCAqLworI2RlZmluZSBYRkVSX1BJT19TTE9XCTB4MDAJLyogMDAwMHwwMDAwICovCisKKy8qIFByb21pc2UgUmVncyAqLworI2RlZmluZSBSRUdfQQkJMHgwMQorI2RlZmluZSBSRUdfQgkJMHgwMgorI2RlZmluZSBSRUdfQwkJMHgwNAorI2RlZmluZSBSRUdfRAkJMHgwOAorCit2b2lkCitwZGMyMDJ4eF9kZWNvZGVfcmVnaXN0ZXJzICh1bnNpZ25lZCBjaGFyIHJlZ2lzdGVycywgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyCWJpdCA9IDAsIGJpdDEgPSAwLCBiaXQyID0gMDsKKwlzd2l0Y2gocmVnaXN0ZXJzKSB7CisJCWNhc2UgUkVHX0E6CisJCQliaXQyID0gMDsKKwkJCXByaW50ZigiICBBIFJlZ2lzdGVyICIpOworCQkJaWYgKHZhbHVlICYgMHg4MCkgcHJpbnRmKCJTWU5DX0lOICIpOworCQkJaWYgKHZhbHVlICYgMHg0MCkgcHJpbnRmKCJFUlJEWV9FTiAiKTsKKwkJCWlmICh2YWx1ZSAmIDB4MjApIHByaW50ZigiSU9SRFlfRU4gIik7CisJCQlpZiAodmFsdWUgJiAweDEwKSBwcmludGYoIlBSRUZFVENIX0VOICIpOworCQkJaWYgKHZhbHVlICYgMHgwOCkgeyBwcmludGYoIlBBMyAiKTtiaXQyIHw9IDB4MDg7IH0KKwkJCWlmICh2YWx1ZSAmIDB4MDQpIHsgcHJpbnRmKCJQQTIgIik7Yml0MiB8PSAweDA0OyB9CisJCQlpZiAodmFsdWUgJiAweDAyKSB7IHByaW50ZigiUEExICIpO2JpdDIgfD0gMHgwMjsgfQorCQkJaWYgKHZhbHVlICYgMHgwMSkgeyBwcmludGYoIlBBMCAiKTtiaXQyIHw9IDB4MDE7IH0KKwkJCXByaW50ZigiUElPKEEpID0gJWQgIiwgYml0Mik7CisJCQlicmVhazsKKwkJY2FzZSBSRUdfQjoKKwkJCWJpdDEgPSAwO2JpdDIgPSAwOworCQkJcHJpbnRmKCIgIEIgUmVnaXN0ZXIgIik7CisJCQlpZiAodmFsdWUgJiAweDgwKSB7IHByaW50ZigiTUIyICIpO2JpdDEgfD0gMHg4MDsgfQorCQkJaWYgKHZhbHVlICYgMHg0MCkgeyBwcmludGYoIk1CMSAiKTtiaXQxIHw9IDB4NDA7IH0KKwkJCWlmICh2YWx1ZSAmIDB4MjApIHsgcHJpbnRmKCJNQjAgIik7Yml0MSB8PSAweDIwOyB9CisJCQlwcmludGYoIkRNQShCKSA9ICVkICIsIGJpdDEgPj4gNSk7CisJCQlpZiAodmFsdWUgJiAweDEwKSBwcmludGYoIlBJT19GT1JDRUQvUEI0ICIpOworCQkJaWYgKHZhbHVlICYgMHgwOCkgeyBwcmludGYoIlBCMyAiKTtiaXQyIHw9IDB4MDg7IH0KKwkJCWlmICh2YWx1ZSAmIDB4MDQpIHsgcHJpbnRmKCJQQjIgIik7Yml0MiB8PSAweDA0OyB9CisJCQlpZiAodmFsdWUgJiAweDAyKSB7IHByaW50ZigiUEIxICIpO2JpdDIgfD0gMHgwMjsgfQorCQkJaWYgKHZhbHVlICYgMHgwMSkgeyBwcmludGYoIlBCMCAiKTtiaXQyIHw9IDB4MDE7IH0KKwkJCXByaW50ZigiUElPKEIpID0gJWQgIiwgYml0Mik7CisJCQlicmVhazsKKwkJY2FzZSBSRUdfQzoKKwkJCWJpdDIgPSAwOworCQkJcHJpbnRmKCIgIEMgUmVnaXN0ZXIgIik7CisJCQlpZiAodmFsdWUgJiAweDgwKSBwcmludGYoIkRNQVJRcCAiKTsKKwkJCWlmICh2YWx1ZSAmIDB4NDApIHByaW50ZigiSU9SRFlwICIpOworCQkJaWYgKHZhbHVlICYgMHgyMCkgcHJpbnRmKCJETUFSX0VOICIpOworCQkJaWYgKHZhbHVlICYgMHgxMCkgcHJpbnRmKCJETUFXX0VOICIpOworCisJCQlpZiAodmFsdWUgJiAweDA4KSB7IHByaW50ZigiTUMzICIpO2JpdDIgfD0gMHgwODsgfQorCQkJaWYgKHZhbHVlICYgMHgwNCkgeyBwcmludGYoIk1DMiAiKTtiaXQyIHw9IDB4MDQ7IH0KKwkJCWlmICh2YWx1ZSAmIDB4MDIpIHsgcHJpbnRmKCJNQzEgIik7Yml0MiB8PSAweDAyOyB9CisJCQlpZiAodmFsdWUgJiAweDAxKSB7IHByaW50ZigiTUMwICIpO2JpdDIgfD0gMHgwMTsgfQorCQkJcHJpbnRmKCJETUEoQykgPSAlZCAiLCBiaXQyKTsKKwkJCWJyZWFrOworCQljYXNlIFJFR19EOgorCQkJcHJpbnRmKCIgIEQgUmVnaXN0ZXIgIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybjsKKwl9CisJcHJpbnRmKCJcbiAgICAgICAgJXMgIiwgKHJlZ2lzdGVycyAmIFJFR19EKSA/ICJEUCIgOgorCQkJCShyZWdpc3RlcnMgJiBSRUdfQykgPyAiQ1AiIDoKKwkJCQkocmVnaXN0ZXJzICYgUkVHX0IpID8gIkJQIiA6CisJCQkJKHJlZ2lzdGVycyAmIFJFR19BKSA/ICJBUCIgOiAiRVJST1IiKTsKKwlmb3IgKGJpdD0xMjg7Yml0PjA7Yml0Lz0yKQorCQlwcmludGYoIiVzIiwgKHZhbHVlICYgYml0KSA/ICIxIiA6ICIwIik7CisJcHJpbnRmKCJcbiIpOworfQorCisvKgorICogUHJvbWlzZSBBVEEvNjYgU3VwcG9ydDogY29uZmlndXJlIFByb21pc2UgQVRBNjYgY2FyZCBpbiBzcGVjaWZpZWQgbW9kZS4KKyAqLworaW50CitwZGMyMDJ4eF90dW5lX2NoaXBzZXQgKHBjaV9kZXZfdCBkZXYsIGludCBkcml2ZSwgdW5zaWduZWQgY2hhciBzcGVlZCkKK3sKKwl1bnNpZ25lZCBzaG9ydAkJZHJpdmVfY29uZjsKKwlpbnQJCQllcnIgPSAwOworCXVuc2lnbmVkIGNoYXIJCQlkcml2ZV9wY2ksIEFQLCBCUCwgQ1AsIERQOworCXVuc2lnbmVkIGNoYXIJCQlUQSA9IDAsIFRCID0gMDsKKworCXN3aXRjaCAoZHJpdmUpIHsKKwkJY2FzZSAwOiBkcml2ZV9wY2kgPSAweDYwOyBicmVhazsKKwkJY2FzZSAxOiBkcml2ZV9wY2kgPSAweDY0OyBicmVhazsKKwkJY2FzZSAyOiBkcml2ZV9wY2kgPSAweDY4OyBicmVhazsKKwkJY2FzZSAzOiBkcml2ZV9wY2kgPSAweDZjOyBicmVhazsKKwkJZGVmYXVsdDogcmV0dXJuIC0xOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgZHJpdmVfcGNpLCAmZHJpdmVfY29uZik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKSwgJkFQKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpfDB4MDEsICZCUCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKXwweDAyLCAmQ1ApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSl8MHgwMywgJkRQKTsKKworCWlmICgoQVAgJiAweDBGKSB8fCAoQlAgJiAweDA3KSkgeworCSAgLyogY2xlYXIgUElPIG1vZGVzIG9mIGxvd2VyIDg0MjEgYml0cyBvZiBBIFJlZ2lzdGVyICovCisJICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKSwgQVAgJiB+MHgwRik7CisJICBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpLCAmQVApOworCisJICAvKiBjbGVhciBQSU8gbW9kZXMgb2YgbG93ZXIgNDIxIGJpdHMgb2YgQiBSZWdpc3RlciAqLworCSAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSl8MHgwMSwgQlAgJiB+MHgwNyk7CisJICBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpfDB4MDEsICZCUCk7CisKKwkgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSksICZBUCk7CisJICBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpfDB4MDEsICZCUCk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKSwgJkFQKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpfDB4MDEsICZCUCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKXwweDAyLCAmQ1ApOworCisJc3dpdGNoKHNwZWVkKSB7CisJCWNhc2UgWEZFUl9QSU9fNDoJVEEgPSAweDAxOyBUQiA9IDB4MDQ7IGJyZWFrOworCQljYXNlIFhGRVJfUElPXzM6CVRBID0gMHgwMjsgVEIgPSAweDA2OyBicmVhazsKKwkJY2FzZSBYRkVSX1BJT18yOglUQSA9IDB4MDM7IFRCID0gMHgwODsgYnJlYWs7CisJCWNhc2UgWEZFUl9QSU9fMToJVEEgPSAweDA1OyBUQiA9IDB4MEM7IGJyZWFrOworCQljYXNlIFhGRVJfUElPXzA6CisJCWRlZmF1bHQ6CQlUQSA9IDB4MDk7IFRCID0gMHgxMzsgYnJlYWs7CisJfQorCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSksIEFQfFRBKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKXwweDAxLCBCUHxUQik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpLCAmQVApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgKGRyaXZlX3BjaSl8MHgwMSwgJkJQKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIChkcml2ZV9wY2kpfDB4MDIsICZDUCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAoZHJpdmVfcGNpKXwweDAzLCAmRFApOworCisKKyNpZmRlZiBQREMyMDJYWF9ERUJVRworCXBkYzIwMnh4X2RlY29kZV9yZWdpc3RlcnMoUkVHX0EsIEFQKTsKKwlwZGMyMDJ4eF9kZWNvZGVfcmVnaXN0ZXJzKFJFR19CLCBCUCk7CisJcGRjMjAyeHhfZGVjb2RlX3JlZ2lzdGVycyhSRUdfQywgQ1ApOworCXBkYzIwMnh4X2RlY29kZV9yZWdpc3RlcnMoUkVHX0QsIERQKTsKKyNlbmRpZgorCXJldHVybiBlcnI7Cit9CisvKgorICogU2hvdy9Jbml0IFBDSSBkZXZpY2VzIG9uIHRoZSBzcGVjaWZpZWQgYnVzIG51bWJlci4KKyAqLworCit2b2lkIHBjaV9tb3Vzc2VfZml4dXBfaXJxKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldikKK3sKKwl1bnNpZ25lZCBpbnQgbGluZTsKKworCXN3aXRjaChQQ0lfREVWKGRldikpIHsKKwljYXNlIDB4MGQ6CisJCWxpbmUgPSAweDAwMDAwMTAxOworCQlicmVhazsKKworCWNhc2UgMHgwZToKKwlkZWZhdWx0OgorCQlsaW5lID0gMHgwMDAwMDMwMzsKKwkJYnJlYWs7CisJfQorCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgbGluZSk7Cit9CisKK3ZvaWQgcGNpX21vdXNzZV9zZXR1cF9wZGMyMDJ4eChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYsCisJCQkgICAgICAgc3RydWN0IHBjaV9jb25maWdfdGFibGUgKl8pCit7CisJdW5zaWduZWQgc2hvcnQgdmVuZG9ySWQ7CisJdW5zaWduZWQgaW50IG1iYXIwLCBjbWQ7CisJaW50IGJhciwgYTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX1ZFTkRPUl9JRCwgJnZlbmRvcklkKTsKKworCWlmKHZlbmRvcklkID09IFBDSV9WRU5ET1JfSURfUFJPTUlTRSB8fCB2ZW5kb3JJZCA9PSBQQ0lfVkVORE9SX0lEX0NNRCl7CisJCS8qIFBEQyAyMDJ4eCBjYXJkIGlzIGhhbmRsZWQgZGlmZmVyZW50bHksIGl0IGlzIGEgYm9vdGFibGUKKwkJICogZGV2aWNlIGFuZCBuZWVkcyBhbGwgNSBNQkFSJ3MgY29uZmlndXJlZAorCQkgKi8KKwkJZm9yKGJhciA9IDA7IGJhciA8IDU7IGJhcisrKXsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCtiYXIqNCwgJm1iYXIwKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzArYmFyKjQsIH4wKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCtiYXIqNCwgJm1iYXIwKTsKKyNpZmRlZiBERUJVRworCQkJcHJpbnRmKCIgIEFUQV9iYXJbJWRdID0gJWRieXRlc1xuIiwgYmFyLAorCQkJICAgICAgIH4obWJhcjAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKSArIDEpOworI2VuZGlmCisJCX0KKworCQkvKiBQcm9ncmFtIGFsbCBCQVIncyAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX0JBU0VfQUREUkVTU18wLCBQUk9NSVNFX01CQVIwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSwgUFJPTUlTRV9NQkFSMSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzIsCVBST01JU0VfTUJBUjIpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX0JBU0VfQUREUkVTU18zLAlQUk9NSVNFX01CQVIzKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9CQVNFX0FERFJFU1NfNCwJUFJPTUlTRV9NQkFSNCk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzUsCVBST01JU0VfTUJBUjUpOworCisJCWZvcihiYXIgPSAwOyBiYXIgPCA1OyBiYXIrKyl7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzArYmFyKjQsICZtYmFyMCk7CisjaWZkZWYgREVCVUcKKwkJCXByaW50ZigiICBBVEFfYmFyWyVkXUAweCV4XG4iLCBiYXIsIG1iYXIwKTsKKyNlbmRpZgorCQl9CisKKwkJLyogRW5hYmxlIFJPTSBFeHBhbnNpb24gYmFzZSAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCBQUk9NSVNFX01CQVI1fDEpOworCisJCS8qIElvIGVuYWJsZSwgTWVtb3J5IGVuYWJsZSwgbWFzdGVyIGVuYWJsZSAqLworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisJCWNtZCAmPSB+MHhmZmZmMDAwMDsKKwkJY21kIHw9IFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX0lPOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisKKwkJLyogQnJlYXRoIHNvbWUgbGlmZSBpbnRvIHRoZSBjb250cm9sbGVyICovCisJCWZvciggYSA9IDA7IGEgPCA0OyBhKyspCisJCQlwZGMyMDJ4eF90dW5lX2NoaXBzZXQoZGV2LCBhLCBYRkVSX1BJT18wKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBwY2lfc2FuZHBvaW50X2NvbmZpZ190YWJsZVtdID0geworCXsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMHgwMCwgMHgwZSwgMHgwMCwKKwkgIHBjaV9tb3Vzc2Vfc2V0dXBfcGRjMjAyeHggfSwKKyNpZm5kZWYgQ09ORklHX1BDSV9QTlAKKwl7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB4MDAsIDB4MGQsIDB4MDAsCisJICBwY2lfY2ZnZnVuY19jb25maWdfZGV2aWNlLCB7UENJX0VORVRfSU9BRERSLAorCQkJCSAgICAgIFBDSV9FTkVUX01FTUFERFIsCisJCQkJICAgICAgUENJX0NPTU1BTkRfTUVNT1JZIHwKKwkJCQkgICAgICBQQ0lfQ09NTUFORF9NQVNURVJ9fSwKKwl7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJICBwY2lfY2ZnZnVuY19jb25maWdfZGV2aWNlLCB7UENJX1NMT1RfSU9BRERSLAorCQkJCSAgICAgIFBDSV9TTE9UX01FTUFERFIsCisJCQkJICAgICAgUENJX0NPTU1BTkRfTUVNT1JZIHwKKwkJCQkgICAgICBQQ0lfQ09NTUFORF9NQVNURVJ9fSwKKyNlbmRpZgorCXsgfQorfTsKKworc3RydWN0IHBjaV9jb250cm9sbGVyIGhvc2UgPSB7CisJY29uZmlnX3RhYmxlOiBwY2lfc2FuZHBvaW50X2NvbmZpZ190YWJsZSwKKwlmaXh1cF9pcnE6IHBjaV9tb3Vzc2VfZml4dXBfaXJxLAorfTsKKwordm9pZCBwY2lfaW5pdCh2b2lkKQoreworCXBjaV9tcGM4MjR4X2luaXQoJmhvc2UpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBsL2NvbW1vbi9jb21tb25fdXRpbC5jIGIvYm9hcmQvbXBsL2NvbW1vbi9jb21tb25fdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYzQ5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9tcGwvY29tbW9uL2NvbW1vbl91dGlsLmMKQEAgLTAsMCArMSw2MDYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIERlbmlzIFBldGVyLCBNUEwgQUcgU3dpdHplcmxhbmQsIGQucGV0ZXJAbXBsLmNoCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8dmlkZW9fZmIuaD4KKyNpbmNsdWRlICJjb21tb25fdXRpbC5oIgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDxkZXZpY2VzLmg+CisjaW5jbHVkZSA8cGNpLmg+CisKK2V4dGVybiBpbnQgIGd1bnppcCAodm9pZCAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKiwgaW50ICopOworZXh0ZXJuIGludCBtZW1fdGVzdCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHJhbXNpemUsIGludCBxdWlldCk7CisKKyNkZWZpbmUgSTJDX0JBQ0tVUF9BRERSIDB4N0MwMCAvKiAweDIwMCBieXRlcyBmb3IgYmFja3VwICovCisjZGVmaW5lIElNQUdFX1NJWkUgMHg4MDAwMAorCitleHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bXTsJLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMgKi8KKworaW1hZ2VfaGVhZGVyX3QgaGVhZGVyOworCisKKworaW50IG1wbF9wcmcodW5zaWduZWQgbG9uZyBzcmMsdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJZmxhc2hfaW5mb190ICppbmZvOworCWludCBpLHJjOworCXVuc2lnbmVkIGxvbmcgKm1hZ2ljID0gKHVuc2lnbmVkIGxvbmcgKilzcmM7CisKKwlpbmZvID0gJmZsYXNoX2luZm9bMF07CisgIAlzdGFydCA9IDAgLSBzaXplOworCWZvcihpPWluZm8tPnNlY3Rvcl9jb3VudC0xO2k+MDtpLS0pCisJeworCQlpbmZvLT5wcm90ZWN0W2ldID0gMDsgLyogdW5wcm90ZWN0IHRoaXMgc2VjdG9yICovCisJCWlmKHN0YXJ0Pj1pbmZvLT5zdGFydFtpXSkKKwkJYnJlYWs7CisJfQorCS8qIHNldC11cCBmbGFzaCBsb2NhdGlvbiAqLworCS8qIG5vdyBlcmFzZSBmbGFzaCAqLworCWlmKG1hZ2ljWzBdIT1JSF9NQUdJQykgeworCQlwcmludGYoIkJhZCBNYWdpYyBudW1iZXJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXByaW50ZigiRXJhc2luZyBhdCAlbHggKHNlY3RvciAlZCkgKHN0YXJ0ICVseClcbiIsCisJCQkJc3RhcnQsaSxpbmZvLT5zdGFydFtpXSk7CisJZmxhc2hfZXJhc2UgKGluZm8sIGksIGluZm8tPnNlY3Rvcl9jb3VudC0xKTsKKwlwcmludGYoImZsYXNoIGVyYXNlZCwgcHJvZ3JhbW1pbmcgZnJvbSAweCVseCAweCVseCBCeXRlc1xuIixzcmMsc2l6ZSk7CisJaWYgKChyYyA9IGZsYXNoX3dyaXRlICgodWNoYXIgKilzcmMsIHN0YXJ0LCBzaXplKSkgIT0gMCkgeworCQlwdXRzICgiRVJST1IgIik7CisJCWZsYXNoX3BlcnJvciAocmMpOworCQlyZXR1cm4gKDEpOworCX0KKwlwdXRzICgiT0sgcHJvZ3JhbW1pbmcgZG9uZVxuIik7CisJcmV0dXJuIDA7Cit9CisKKworaW50IG1wbF9wcmdfaW1hZ2UodW5zaWduZWQgbG9uZyBsZF9hZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZGF0YSxsZW4sY2hlY2tzdW07CisJaW1hZ2VfaGVhZGVyX3QgKmhkcj0maGVhZGVyOworCS8qIENvcHkgaGVhZGVyIHNvIHdlIGNhbiBibGFuayBDUkMgZmllbGQgZm9yIHJlLWNhbGN1bGF0aW9uICovCisJbWVtY3B5ICgmaGVhZGVyLCAoY2hhciAqKWxkX2FkZHIsIHNpemVvZihpbWFnZV9oZWFkZXJfdCkpOworCWlmIChoZHItPmloX21hZ2ljICAhPSBJSF9NQUdJQykgeworCQlwcmludGYgKCJCYWQgTWFnaWMgTnVtYmVyXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXByaW50X2ltYWdlX2hkcihoZHIpOworCWlmIChoZHItPmloX29zICAhPSBJSF9PU19VX0JPT1QpIHsKKwkJcHJpbnRmICgiTm8gVS1Cb290IEltYWdlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChoZHItPmloX3R5cGUgICE9IElIX1RZUEVfRklSTVdBUkUpIHsKKwkJcHJpbnRmICgiTm8gRmlybXdhcmUgSW1hZ2VcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJZGF0YSA9ICh1bG9uZykmaGVhZGVyOworCWxlbiAgPSBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpOworCWNoZWNrc3VtID0gaGRyLT5paF9oY3JjOworCWhkci0+aWhfaGNyYyA9IDA7CisJaWYgKGNyYzMyICgwLCAoY2hhciAqKWRhdGEsIGxlbikgIT0gY2hlY2tzdW0pIHsKKwkJcHJpbnRmICgiQmFkIEhlYWRlciBDaGVja3N1bVxuIik7CisJCXJldHVybiAxOworCX0KKwlkYXRhID0gbGRfYWRkciArIHNpemVvZihpbWFnZV9oZWFkZXJfdCk7CisJbGVuICA9IGhkci0+aWhfc2l6ZTsKKwlwcmludGYgKCJWZXJpZnlpbmcgQ2hlY2tzdW0gLi4uICIpOworCWlmIChjcmMzMiAoMCwgKGNoYXIgKilkYXRhLCBsZW4pICE9IGhkci0+aWhfZGNyYykgeworCQlwcmludGYgKCJCYWQgRGF0YSBDUkNcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJc3dpdGNoIChoZHItPmloX2NvbXApIHsKKwljYXNlIElIX0NPTVBfTk9ORToKKwkJYnJlYWs7CisJY2FzZSBJSF9DT01QX0daSVA6CisJCXByaW50ZiAoIiAgVW5jb21wcmVzc2luZyAgLi4uICIpOworCQlpZiAoZ3VuemlwICgodm9pZCAqKShkYXRhKzB4MTAwMDAwKSwgMHg0MDAwMDAsCisJCQkgICAgKHVjaGFyICopZGF0YSwgKGludCAqKSZsZW4pICE9IDApIHsKKwkJCXByaW50ZiAoIkdVTlpJUCBFUlJPUlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkYXRhKz0weDEwMDAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiICAgVW5pbXBsZW1lbnRlZCBjb21wcmVzc2lvbiB0eXBlICVkXG4iLCBoZHItPmloX2NvbXApOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcmludGYgKCIgIE9LXG4iKTsKKwlyZXR1cm4obXBsX3ByZyhkYXRhLGxlbikpOworfQorCisKK3ZvaWQgZ2V0X2JhY2t1cF92YWx1ZXMoYmFja3VwX3QgKmJ1ZikKK3sKKwlpMmNfcmVhZChDRkdfREVGX0VFUFJPTV9BRERSLCBJMkNfQkFDS1VQX0FERFIsMiwodm9pZCAqKWJ1ZixzaXplb2YoYmFja3VwX3QpKTsKK30KKwordm9pZCBzZXRfYmFja3VwX3ZhbHVlcyhpbnQgb3ZlcndyaXRlKQoreworCWJhY2t1cF90IGJhY2s7CisJaW50IGk7CisKKwlnZXRfYmFja3VwX3ZhbHVlcygmYmFjayk7CisJaWYoIW92ZXJ3cml0ZSkgeworCQlpZihzdHJuY21wKGJhY2suc2lnbmF0dXJlLCJNUExcMCIsNCk9PTApIHsKKwkJCXByaW50ZigiTm90IHBvc3NpYmxlIHRvIHdyaXRlIEJhY2t1cFxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbWVtY3B5KGJhY2suc2lnbmF0dXJlLCJNUExcMCIsNCk7CisJaT1nZXRlbnZfcigic2VyaWFsIyIsYmFjay5zZXJpYWxfbmFtZSwxNik7CisJaWYoaT09MCkgeworCQlwcmludGYoIk5vdCBwb3NzaWJsZSB0byB3cml0ZSBCYWNrdXBcbiIpOworCQlyZXR1cm47CisJfQorCWJhY2suc2VyaWFsX25hbWVbMTZdPTA7CisJaT1nZXRlbnZfcigiZXRoYWRkciIsYmFjay5ldGhfYWRkciwyMCk7CisJaWYoaT09MCkgeworCQlwcmludGYoIk5vdCBwb3NzaWJsZSB0byB3cml0ZSBCYWNrdXBcbiIpOworCQlyZXR1cm47CisJfQorCWJhY2suZXRoX2FkZHJbMjBdPTA7CisJaTJjX3dyaXRlKENGR19ERUZfRUVQUk9NX0FERFIsIEkyQ19CQUNLVVBfQUREUiwyLCh2b2lkICopJmJhY2ssc2l6ZW9mKGJhY2t1cF90KSk7Cit9CisKK3ZvaWQgY2xlYXJfZW52X3ZhbHVlcyh2b2lkKQoreworCWJhY2t1cF90IGJhY2s7CisJdW5zaWduZWQgY2hhciBlbnZfY3JjWzRdOworCisJbWVtc2V0KCZiYWNrLDB4ZmYsc2l6ZW9mKGJhY2t1cF90KSk7CisJbWVtc2V0KGVudl9jcmMsMHgwMCw0KTsKKwlpMmNfd3JpdGUoQ0ZHX0RFRl9FRVBST01fQUREUixJMkNfQkFDS1VQX0FERFIsMiwodm9pZCAqKSZiYWNrLHNpemVvZihiYWNrdXBfdCkpOworCWkyY193cml0ZShDRkdfREVGX0VFUFJPTV9BRERSLENGR19FTlZfT0ZGU0VULDIsKHZvaWQgKillbnZfY3JjLDQpOworfQorCisvKgorICogY2hlY2sgY3JjIG9mICJvbGRlciIgZW52aXJvbm1lbnQKKyAqLworaW50IGNoZWNrX2Vudl9vbGRfc2l6ZSh1bG9uZyBvbGRzaXplKQoreworCXVsb25nIGNyYywgbGVuLCBuZXc7CisJdW5zaWduZWQgb2ZmOworCXVjaGFyIGJ1Zls2NF07CisKKwkvKiByZWFkIG9sZCBDUkMgKi8KKwllZXByb21fcmVhZCAoQ0ZHX0RFRl9FRVBST01fQUREUiwKKwkJICAgICBDRkdfRU5WX09GRlNFVCwKKwkJICAgICAodWNoYXIgKikmY3JjLCBzaXplb2YodWxvbmcpKTsKKworCW5ldyA9IDA7CisJbGVuID0gb2xkc2l6ZTsKKwlvZmYgPSBzaXplb2YobG9uZyk7CisJbGVuID0gb2xkc2l6ZS1vZmY7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaW50IG4gPSAobGVuID4gc2l6ZW9mKGJ1ZikpID8gc2l6ZW9mKGJ1ZikgOiBsZW47CisKKwkJZWVwcm9tX3JlYWQgKENGR19ERUZfRUVQUk9NX0FERFIsIENGR19FTlZfT0ZGU0VUK29mZiwgYnVmLCBuKTsKKwkJbmV3ID0gY3JjMzIgKG5ldywgYnVmLCBuKTsKKwkJbGVuIC09IG47CisJCW9mZiArPSBuOworCX0KKworCXJldHVybiAoY3JjID09IG5ldyk7Cit9CisKK3N0YXRpYyB1bG9uZyBvbGRzaXplc1tdID0geworCTB4MjAwLAorCTB4ODAwLAorCTAKK307CisKK3ZvaWQgY29weV9vbGRfZW52KHVsb25nIHNpemUpCit7CisJdWNoYXIgbmFtZV9idWZbNjRdOworCXVjaGFyIHZhbHVlX2J1ZlsweDgwMF07CisJdWNoYXIgYzsKKwl1bG9uZyBsZW47CisJdW5zaWduZWQgb2ZmOworCXVjaGFyICpuYW1lLCAqdmFsdWU7CisKKwluYW1lPSZuYW1lX2J1ZlswXTsKKwl2YWx1ZT0mdmFsdWVfYnVmWzBdOworCWxlbj1zaXplOworCW9mZiA9IHNpemVvZihsb25nKTsKKwl3aGlsZSAobGVuID4gb2ZmKSB7CisJCWVlcHJvbV9yZWFkIChDRkdfREVGX0VFUFJPTV9BRERSLCBDRkdfRU5WX09GRlNFVCtvZmYsICZjLCAxKTsKKwkJaWYoYyAhPSAnPScpIHsKKwkJCSpuYW1lKys9YzsKKwkJCW9mZisrOworCQl9CisJCWVsc2UgeworCQkJKm5hbWUrKz0nXDAnOworCQkJb2ZmKys7CisJCQlkbyB7CisJCQkJZWVwcm9tX3JlYWQgKENGR19ERUZfRUVQUk9NX0FERFIsIENGR19FTlZfT0ZGU0VUK29mZiwgJmMsIDEpOworCQkJCSp2YWx1ZSsrPWM7CisJCQkJb2ZmKys7CisJCQkJaWYoYyA9PSAnXDAnKQorCQkJCQlicmVhazsKKwkJCX0gd2hpbGUobGVuID4gb2ZmKTsKKwkJCW5hbWU9Jm5hbWVfYnVmWzBdOworCQkJdmFsdWU9JnZhbHVlX2J1ZlswXTsKKwkJCWlmKHN0cm5jbXAobmFtZSwiYmF1ZHJhdGUiLDgpIT0wKSB7CisJCQkJc2V0ZW52KG5hbWUsdmFsdWUpOworCQkJfQorCisJCX0KKwl9Cit9CisKKwordm9pZCBjaGVja19lbnYodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyICpzOworCWludCBpPTA7CisJY2hhciBidWZbMzJdOworCWJhY2t1cF90IGJhY2s7CisKKwlzPWdldGVudigic2VyaWFsIyIpOworCWlmKCFzKSB7CisJCXdoaWxlKG9sZHNpemVzW2ldKSB7CisJCQlpZihjaGVja19lbnZfb2xkX3NpemUob2xkc2l6ZXNbaV0pKQorCQkJCWJyZWFrOworCQkJaSsrOworCQl9CisJCWlmKCFvbGRzaXplc1tpXSkgeworCQkJLyogbm8gb2xkIGVudmlyb25tZW50IGhhcyBiZWVuIGZvdW5kICovCisJCQlnZXRfYmFja3VwX3ZhbHVlcyAoJmJhY2spOworCQkJaWYgKHN0cm5jbXAgKGJhY2suc2lnbmF0dXJlLCAiTVBMXDAiLCA0KSA9PSAwKSB7CisJCQkJc3ByaW50ZiAoYnVmLCAiJXMiLCBiYWNrLnNlcmlhbF9uYW1lKTsKKwkJCQlzZXRlbnYgKCJzZXJpYWwjIiwgYnVmKTsKKwkJCQlzcHJpbnRmIChidWYsICIlcyIsIGJhY2suZXRoX2FkZHIpOworCQkJCXNldGVudiAoImV0aGFkZHIiLCBidWYpOworCQkJCXByaW50ZiAoIklORk86ICBzZXJpYWwjIGFuZCBldGhhZGRyIHJlY292ZXJlZCwgdXNlIHNhdmVlbnZcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWNvcHlfb2xkX2VudihvbGRzaXplc1tpXSk7CisJCQlwcmludGYgKCJJTkZPOiAgb2xkIGVudmlyb25tZW50IGFqdXN0ZWQsIHVzZSBzYXZlZW52XG4iKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJLyogY2hlY2sgaWYgYmFjayB1cCBpcyBzZXQgKi8KKwkJZ2V0X2JhY2t1cF92YWx1ZXMoJmJhY2spOworCQlpZihzdHJuY21wKGJhY2suc2lnbmF0dXJlLCJNUExcMCIsNCkhPTApIHsKKwkJCXNldF9iYWNrdXBfdmFsdWVzKDApOworCQl9CisJfQorfQorCisKKworZXh0ZXJuIGRldmljZV90ICpzdGRpb19kZXZpY2VzW107CitleHRlcm4gY2hhciAqc3RkaW9fbmFtZXNbXTsKKwordm9pZCBzaG93X3N0ZGlvX2Rldih2b2lkKQoreworCS8qIFByaW50IGluZm9ybWF0aW9ucyAqLworCXByaW50ZiAoIkluOiAgICAiKTsKKwlpZiAoc3RkaW9fZGV2aWNlc1tzdGRpbl0gPT0gTlVMTCkgeworCQlwcmludGYgKCJObyBpbnB1dCBkZXZpY2VzIGF2YWlsYWJsZSFcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIiVzXG4iLCBzdGRpb19kZXZpY2VzW3N0ZGluXS0+bmFtZSk7CisJfQorCisJcHJpbnRmICgiT3V0OiAgICIpOworCWlmIChzdGRpb19kZXZpY2VzW3N0ZG91dF0gPT0gTlVMTCkgeworCQlwcmludGYgKCJObyBvdXRwdXQgZGV2aWNlcyBhdmFpbGFibGUhXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYgKCIlc1xuIiwgc3RkaW9fZGV2aWNlc1tzdGRvdXRdLT5uYW1lKTsKKwl9CisKKwlwcmludGYgKCJFcnI6ICAgIik7CisJaWYgKHN0ZGlvX2RldmljZXNbc3RkZXJyXSA9PSBOVUxMKSB7CisJCXByaW50ZiAoIk5vIGVycm9yIGRldmljZXMgYXZhaWxhYmxlIVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmICgiJXNcbiIsIHN0ZGlvX2RldmljZXNbc3RkZXJyXS0+bmFtZSk7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiBzd2l0Y2hlcyB0aGUgY3MwIGFuZCB0aGUgY3MxIHRvIHRoZSBsb2NhdGlvbnMuCisJICAgV2hlbiBib290IGlzIFRSVUUsIHRoZSB0aGUgbWFwcGluZyBpcyBzd2l0Y2hlZAorCSAgIHRvIHRoZSBib290IGNvbmZpZ3VyYXRpb24sIElmIGl0IGlzIEZBTFNFLCB0aGUKKwkgICBmbGFzaCB3aWxsIGJlIHN3aXRjaGVkIGluIHRoZSBib290IGFyZWEgKi8KKworI3VuZGVmIFNXX0NTX0RCRworI2lmZGVmIFNXX0NTX0RCRworI2RlZmluZQlTV19DU19QUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBTV19DU19QUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworCitpbnQgc3dpdGNoX2NzKHVuc2lnbmVkIGNoYXIgYm9vdCkKK3sKKyAgCXVuc2lnbmVkIGxvbmcgcGJjcjsKKwltdGRjcihlYmNjZmdhLCBwYjBjcik7IC8qIGdldCBjczAgY29uZmlnIHJlZyAqLworCXBiY3IgPSBtZmRjcihlYmNjZmdkKTsKKwlpZigocGJjciYweDAwMDAyMDAwKT09MCkgeworCQkvKiB3ZSBuZWVkIG9ubHkgdG8gc3dpdGNoIGlmIGJvb3QgZnJvbSBNUFMgKi8KKwkJLypwcmludGYoIiBNUFMgYm9vdCBtb2RlIGRldGVjdGVkLiAiKTsqLworCQkvKiBwcmludGYoImNzMCBjZmc6ICVseFxuIixwYmNyKTsgKi8KKwkJaWYoYm9vdCkgeworCQkJLyogc3dpdGNoIHRvIGJvb3QgY29uZmlndXJhdGlvbiAqLworCQkJLyogdGhpcyBpcyBhIDhiaXQgYm9vdCwgc3dpdGNoIGNzMCB0byBmbGFzaCBsb2NhdGlvbiAqLworCQkJU1dfQ1NfUFJJTlRGKCJzd2l0Y2ggdG8gYm9vdCBtb2RlIChNUFMgb24gSGlnaCBhZGRyZXNzXG4iKTsKKwkJCXBiY3ImPTB4MDAwRkZGRkY7IC8qbWFzayBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNzMCAqLworCQkJcGJjcnw9KEZMQVNIX0JBU0UwX1BSRUxJTSAmIDB4RkZGMDAwMDApOworCQkJbXRkY3IoZWJjY2ZnYSwgcGIwY3IpOworCQkJbXRkY3IoZWJjY2ZnZCwgcGJjcik7CisJCQlTV19DU19QUklOVEYoIiAgbmV3IGNzMCBjZmc6ICVseFxuIixwYmNyKTsKKwkJCW10ZGNyKGViY2NmZ2EsIHBiMWNyKTsgLyogZ2V0IGNzMSBjb25maWcgcmVnIChmbGFzaCkgKi8KKwkJCXBiY3IgPSBtZmRjcihlYmNjZmdkKTsKKwkJCVNXX0NTX1BSSU5URigiIG9sZCBjczEgY2ZnOiAlbHhcbiIscGJjcik7CisJCQlwYmNyJj0weDAwMEZGRkZGOyAvKm1hc2sgYmFzZSBhZGRyZXNzIG9mIHRoZSBjczEgKi8KKwkJCXBiY3J8PShNVUxUSV9QVVJQT1NFX1NPQ0tFVF9BRERSICYgMHhGRkYwMDAwMCk7CisJCQltdGRjcihlYmNjZmdhLCBwYjFjcik7CisJCQltdGRjcihlYmNjZmdkLCBwYmNyKTsKKwkJCVNXX0NTX1BSSU5URigiICBuZXcgY3MxIGNmZzogJWx4LCBNUFMgaXMgb24gSGlnaCBBZGRyZXNzXG4iLHBiY3IpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogbWFwIGZsYXNoIHRvIGJvb3QgYXJlYSwgKi8KKwkJCVNXX0NTX1BSSU5URigibWFwIEZsYXNoIHRvIGJvb3QgYXJlYVxuIik7CisJCQlwYmNyJj0weDAwMEZGRkZGOyAvKm1hc2sgYmFzZSBhZGRyZXNzIG9mIHRoZSBjczAgKi8KKwkJCXBiY3J8PShNVUxUSV9QVVJQT1NFX1NPQ0tFVF9BRERSICYgMHhGRkYwMDAwMCk7CisJCQltdGRjcihlYmNjZmdhLCBwYjBjcik7CisJCQltdGRjcihlYmNjZmdkLCBwYmNyKTsKKwkJCVNXX0NTX1BSSU5URigiICBuZXcgY3MwIGNmZzogJWx4XG4iLHBiY3IpOworCQkJbXRkY3IoZWJjY2ZnYSwgcGIxY3IpOyAvKiBnZXQgY3MxIGNvbmZpZyByZWcgKGZsYXNoKSAqLworCQkJcGJjciA9IG1mZGNyKGViY2NmZ2QpOworCQkJU1dfQ1NfUFJJTlRGKCIgIGNzMSBjZmc6ICVseFxuIixwYmNyKTsKKwkJCXBiY3ImPTB4MDAwRkZGRkY7IC8qbWFzayBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNzMSAqLworCQkJcGJjcnw9KEZMQVNIX0JBU0UwX1BSRUxJTSAmIDB4RkZGMDAwMDApOworCQkJbXRkY3IoZWJjY2ZnYSwgcGIxY3IpOworCQkJbXRkY3IoZWJjY2ZnZCwgcGJjcik7CisJCQlTV19DU19QUklOVEYoIiAgbmV3IGNzMSBjZmc6ICVseCBGbGFzaCBpcyBvbiBIaWdoIEFkZHJlc3NcbiIscGJjcik7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCWVsc2UgeworCQlTV19DU19QUklOVEYoIk5vcm1hbCBib290LCBubyBzd2l0Y2hpbmcgbmVjZXNzYXJ5XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisKK2ludCBkb19tcGxjb21tb24oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgCXVsb25nIHNpemUsc3JjLGxkX2FkZHI7CisJaW50IHJlc3VsdDsKKwliYWNrdXBfdCBiYWNrOworCWNoYXIgc3c7CisJc3JjID0gTVVMVElfUFVSUE9TRV9TT0NLRVRfQUREUjsKKwlzaXplID0gSU1BR0VfU0laRTsKKworCWlmIChzdHJjbXAoYXJndlsxXSwgImZsYXNoIikgPT0gMCkKKwl7CisJCXN3ID0gc3dpdGNoX2NzKDApOyAvKiBTd2l0Y2ggZmxhc2ggdG8gbm9ybWFsIGxvY2F0aW9uICovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRDKQorCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJmbG9wcHkiKSA9PSAwKSB7CisgCQkJY2hhciAqbG9jYWxfYXJnc1szXTsKKwkJCWV4dGVybiBpbnQgZG9fZmRjYm9vdCAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CisJCQlwcmludGYgKCJcbnVwZGF0aW5nIGJvb3Rsb2FkZXIgaW1hZ2UgZnJvbSBmbG9wcHlcbiIpOworCQkJbG9jYWxfYXJnc1swXSA9IGFyZ3ZbMF07CisJICAgIAkJaWYoYXJnYz09NCkgeworCQkJCWxvY2FsX2FyZ3NbMV0gPSBhcmd2WzNdOworCQkJCWxvY2FsX2FyZ3NbMl0gPSBOVUxMOworCQkJCWxkX2FkZHI9c2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCQkJCXJlc3VsdD1kb19mZGNib290KGNtZHRwLCAwLCAyLCBsb2NhbF9hcmdzKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWxvY2FsX2FyZ3NbMV0gPSBOVUxMOworCQkJCWxkX2FkZHI9Q0ZHX0xPQURfQUREUjsKKwkJCQlyZXN1bHQ9ZG9fZmRjYm9vdChjbWR0cCwgMCwgMSwgbG9jYWxfYXJncyk7CisJCQl9CisJCQlyZXN1bHQ9bXBsX3ByZ19pbWFnZShsZF9hZGRyKTsKKwkJCXN3aXRjaF9jcyhzdyk7IC8qIFN3aXRjaCBmbGFzaCBiYWNrICovCisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisjZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRDKSAqLworCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJtZW0iKSA9PSAwKSB7CisJICAgIAkJaWYoYXJnYz09NCkgeworCQkJCWxkX2FkZHI9c2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCQkJfQorCQkJZWxzZSB7CisJCQkJbGRfYWRkcj1sb2FkX2FkZHI7CisJCQl9CisJCQlwcmludGYgKCJcbnVwZGF0aW5nIGJvb3Rsb2FkZXIgaW1hZ2UgZnJvbSBtZW1vcnkgYXQgJWxYXG4iLGxkX2FkZHIpOworCQkJcmVzdWx0PW1wbF9wcmdfaW1hZ2UobGRfYWRkcik7CisJCQlzd2l0Y2hfY3Moc3cpOyAvKiBTd2l0Y2ggZmxhc2ggYmFjayAqLworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJtcHMiKSA9PSAwKSB7CisJCQlwcmludGYgKCJcbnVwZGF0aW5nIGJvb3Rsb2FkZXIgaW1hZ2UgZnJvbSBNU1BcbiIpOworCQkJcmVzdWx0PW1wbF9wcmcoc3JjLHNpemUpOworCQkJc3dpdGNoX2NzKHN3KTsgLyogU3dpdGNoIGZsYXNoIGJhY2sgKi8KKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJc3dpdGNoX2NzKHN3KTsgLyogU3dpdGNoIGZsYXNoIGJhY2sgKi8KKworCX0KKwlpZiAoc3RyY21wKGFyZ3ZbMV0sICJtZW0iKSA9PSAwKQorCXsKKwkJcmVzdWx0PTA7CisJCWlmKGFyZ2M9PTMpCisJCXsKKwkJCXJlc3VsdCA9IChpbnQpc2ltcGxlX3N0cnRvbChhcmd2WzJdLCBOVUxMLCAxNik7CisJICAgIH0KKwkgICAgc3JjPSh1bnNpZ25lZCBsb25nKSZyZXN1bHQ7CisJICAgIHNyYy09Q0ZHX01FTVRFU1RfU1RBUlQ7CisJICAgIHNyYy09KDEwMCoxMDI0KTsgLyogLSAxMDBrICovCisJICAgIHNyYyY9MHhmZmYwMDAwMDsKKwkgICAgc2l6ZT0wOworCSAgICBkbyB7CisJICAgIAlzaXplKys7CisJCQlwcmludGYoIlxuXG5QYXNzICVsZFxuIixzaXplKTsKKwkJCW1lbV90ZXN0KENGR19NRU1URVNUX1NUQVJULHNyYywxKTsKKwkJCWlmKGN0cmxjKCkpCisJCQkJYnJlYWs7CisJCQlpZihyZXN1bHQ+MCkKKwkJCQlyZXN1bHQtLTsKKworCQl9d2hpbGUocmVzdWx0KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzdHJjbXAoYXJndlsxXSwgImNsZWFyZW52dmFsdWVzIikgPT0gMCkKKwl7CisgCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJ5ZXMiKSA9PSAwKQorCQl7CisJCQljbGVhcl9lbnZfdmFsdWVzKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoc3RyY21wKGFyZ3ZbMV0sICJnZXRiYWNrIikgPT0gMCkgeworCQlnZXRfYmFja3VwX3ZhbHVlcygmYmFjayk7CisJCWJhY2suc2lnbmF0dXJlWzNdPTA7CisJCWJhY2suc2VyaWFsX25hbWVbMTZdPTA7CisJCWJhY2suZXRoX2FkZHJbMjBdPTA7CisJCXByaW50ZigiR2V0QmFja1VwOiBzaWduYXR1cmU6ICVzXG4iLGJhY2suc2lnbmF0dXJlKTsKKwkJcHJpbnRmKCIgICAgICAgICAgIHNlcmlhbCM6ICAgJXNcbiIsYmFjay5zZXJpYWxfbmFtZSk7CisJCXByaW50ZigiICAgICAgICAgICBldGhhZGRyOiAgICVzXG4iLGJhY2suZXRoX2FkZHIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cmNtcChhcmd2WzFdLCAic2V0YmFjayIpID09IDApIHsKKwkJc2V0X2JhY2t1cF92YWx1ZXMoMSk7CisJCXJldHVybiAwOworCX0KKwlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJcmV0dXJuIDE7Cit9CisKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKK2V4dGVybiB2b2lkIGRvY19wcm9iZSh1bG9uZyBwaHlzYWRyKTsKK3ZvaWQgZG9jX2luaXQgKHZvaWQpCit7CisgIGRvY19wcm9iZShNVUxUSV9QVVJQT1NFX1NPQ0tFVF9BRERSKTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfVklERU8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmVzIHRvIGRpc3BsYXkgdGhlIEJvYXJkIGluZm9ybWF0aW9uCisgKiB0byB0aGUgc2NyZWVuIChzaW5jZSB0aGUgVkdBIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXMgbGFzdCwKKyAqIHdlIG11c3QgcmVzZW5kIHRoZSBpbmZvcykKKyAqLworCisjaWZkZWYgQ09ORklHX0NPTlNPTEVfRVhUUkFfSU5GTworZXh0ZXJuIEdyYXBoaWNEZXZpY2UgY3RmYjsKKwordm9pZCB2aWRlb19nZXRfaW5mb19zdHIgKGludCBsaW5lX251bWJlciwgY2hhciAqaW5mbykKK3sKKwkvKiBpbml0IHZpZGVvIGluZm8gc3RyaW5ncyBmb3IgZ3JhcGhpYyBjb25zb2xlICovCisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisJUFBDNDA1X1NZU19JTkZPIHN5c19pbmZvOworCWNoYXIgcmV2OworCWludCBpOworCXVuc2lnbmVkIGxvbmcgcHZyOworCWNoYXIgYnVmWzY0XTsKKwljaGFyIHRtcFsxNl07CisJdW5zaWduZWQgY2hhciAqcywgKmUsIGJjLCBzdzsKKwlzd2l0Y2ggKGxpbmVfbnVtYmVyKQorCXsKKwljYXNlIDI6CisJCS8qIENQVSBhbmQgYm9hcmQgaW5mb3MgKi8KKwkJcHZyPWdldF9wdnIoKTsKKwkJZ2V0X3N5c19pbmZvICgmc3lzX2luZm8pOworCQlzd2l0Y2ggKHB2cikgeworCQkJY2FzZSBQVlJfNDA1R1BfUkI6IHJldj0nQic7IGJyZWFrOworCQkJY2FzZSBQVlJfNDA1R1BfUkM6IHJldj0nQyc7IGJyZWFrOworCQkJY2FzZSBQVlJfNDA1R1BfUkQ6IHJldj0nRCc7IGJyZWFrOworCQkJY2FzZSBQVlJfNDA1R1BfUkU6IHJldj0nRSc7IGJyZWFrOworCQkJZGVmYXVsdDogICAgICAgICAgIHJldj0nPyc7IGJyZWFrOworCQl9CisJCS8qIEJvYXJkIGluZm8gKi8KKwkJaT0wOworCQlzPWdldGVudiAoInNlcmlhbCMiKTsKKyNpZmRlZiBDT05GSUdfUElQNDA1CisJCWlmICghcyB8fCBzdHJuY21wIChzLCAiUElQNDA1IiwgNikpIHsKKwkJCXNwcmludGYoYnVmLCIjIyMgTm8gSFcgSUQgLSBhc3N1bWluZyBQSVA0MDUiKTsKKwkJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX01JUDQwNQorCQlpZiAoIXMgfHwgc3RybmNtcCAocywgIk1JUDQwNSIsIDYpKSB7CisJCQlzcHJpbnRmKGJ1ZiwiIyMjIE5vIEhXIElEIC0gYXNzdW1pbmcgTUlQNDA1Iik7CisJCX0KKyNlbmRpZgorCQllbHNlIHsKKwkJCWZvciAoZSA9IHM7ICplOyArK2UpIHsKKwkJCQlpZiAoKmUgPT0gJyAnKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWZvciAoOyBzIDwgZTsgKytzKSB7CisJCQkJaWYgKCpzID09ICdfJykgeworCQkJCQkrK3M7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlidWZbaSsrXT0qczsKKwkJCX0KKwkJCXNwcmludGYoJmJ1ZltpXSwiIFNOICIpOworCQkJaSs9NDsKKwkJCWZvciAoOyBzIDwgZTsgKytzKSB7CisJCQkJYnVmW2krK109KnM7CisJCQl9CisJCQlidWZbaSsrXT0wOworCQl9CisJCXNwcmludGYgKGluZm8sIiAlcyBQUEM0MDVHUCAlYyAlcyBNSHogKCVsdS8lbHUvJWx1IE1IeikiLAorCQkJYnVmLHJldiwKKwkJCXN0cm1oeiAodG1wLCBnZC0+Y3B1X2NsayksIHN5c19pbmZvLmZyZXFQTEIgLyAxMDAwMDAwLAorCQkJc3lzX2luZm8uZnJlcVBMQiAvIHN5c19pbmZvLnBsbE9wYkRpdiAvIDEwMDAwMDAsCisJCQlzeXNfaW5mby5mcmVxUExCIC8gc3lzX2luZm8ucGxsRXh0QnVzRGl2IC8gMTAwMDAwMCk7CisJCXJldHVybjsKKwljYXNlIDM6CisJCS8qIE1lbW9yeSBJbmZvICovCisJCXN3ID0gc3dpdGNoX2NzICgwKTsKKwkJc3dpdGNoX2NzIChzdyk7CisJCWJjID0gaW44IChDT05GSUdfUE9SVF9BRERSKTsKKwkJc3ByaW50ZihpbmZvLCAiICVsdU1CIFJBTSwgJWx1TUIgRmxhc2ggQ2ZnIDB4JTAyWCAlcyAlcyIsCisJCQlnZC0+YmQtPmJpX21lbXNpemUgLyAweDEwMDAwMCwKKwkJCWdkLT5iZC0+YmlfZmxhc2hzaXplIC8gMHgxMDAwMDAsCisJCQliYywKKwkJCXN3ID8gIk1QUyBib290IiA6ICJGbGFzaCBib290IiwKKwkJCWN0ZmIubW9kZUlkZW50KTsKKwkJcmV0dXJuOworCWNhc2UgMToKKwkJc3ByaW50ZgkoYnVmLCAiJXMiLENPTkZJR19JREVOVF9TVFJJTkcpOworCQlzcHJpbnRmIChpbmZvLCAiICVzIiwgJmJ1ZlsxXSk7CisJCXJldHVybjsKKyAgICB9CisgICAgLyogbm8gbW9yZSBpbmZvIGxpbmVzICovCisgICAgKmluZm8gPSAwOworICAgIHJldHVybjsKK30KKyNlbmRpZiAvKiBDT05GSUdfQ09OU09MRV9FWFRSQV9JTkZPICovCisKKyNlbmRpZiAvKiBDT05GSUdfVklERU8gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL21wbC9jb21tb24vcGNpLmMgYi9ib2FyZC9tcGwvY29tbW9uL3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTY1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9tcGwvY29tbW9uL3BjaS5jCkBAIC0wLDAgKzEsMTAyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfAorfCAgICAgICBUaGlzIHNvdXJjZSBjb2RlIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlIHRvIHlvdSBieSBJQk0gb24gYW4gQVMtSVMKK3wgICAgICAgYmFzaXMuICBBbnlvbmUgcmVjZWl2aW5nIHRoaXMgc291cmNlIGlzIGxpY2Vuc2VkIHVuZGVyIElCTQorfCAgICAgICBjb3B5cmlnaHRzIHRvIHVzZSBpdCBpbiBhbnkgd2F5IGhlIG9yIHNoZSBkZWVtcyBmaXQsIGluY2x1ZGluZworfCAgICAgICBjb3B5aW5nIGl0LCBtb2RpZnlpbmcgaXQsIGNvbXBpbGluZyBpdCwgYW5kIHJlZGlzdHJpYnV0aW5nIGl0IGVpdGhlcgorfCAgICAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucy4gIE5vIGxpY2Vuc2UgdW5kZXIgSUJNIHBhdGVudHMgb3IKK3wgICAgICAgcGF0ZW50IGFwcGxpY2F0aW9ucyBpcyB0byBiZSBpbXBsaWVkIGJ5IHRoZSBjb3B5cmlnaHQgbGljZW5zZS4KK3wKK3wgICAgICAgQW55IHVzZXIgb2YgdGhpcyBzb2Z0d2FyZSBzaG91bGQgdW5kZXJzdGFuZCB0aGF0IElCTSBjYW5ub3QgcHJvdmlkZQorfCAgICAgICB0ZWNobmljYWwgc3VwcG9ydCBmb3IgdGhpcyBzb2Z0d2FyZSBhbmQgd2lsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yCit8ICAgICAgIGFueSBjb25zZXF1ZW5jZXMgcmVzdWx0aW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorfAorfCAgICAgICBBbnkgcGVyc29uIHdobyB0cmFuc2ZlcnMgdGhpcyBzb3VyY2UgY29kZSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrCit8ICAgICAgIG11c3QgaW5jbHVkZSB0aGUgSUJNIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgcGFyYWdyYXBoLCBhbmQgdGhlCit8ICAgICAgIHByZWNlZGluZyB0d28gcGFyYWdyYXBocyBpbiB0aGUgdHJhbnNmZXJyZWQgc29mdHdhcmUuCit8Cit8ICAgICAgIENPUFlSSUdIVCAgIEkgQiBNICAgQ09SUE9SQVRJT04gMTk5NQorfCAgICAgICBMSUNFTlNFRCBNQVRFUklBTCAgLSAgUFJPR1JBTSBQUk9QRVJUWSBPRiBJIEIgTQorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBBZGFwdGVkIGZvciBQSVA0MDUgMDMuMDcuMDEKKyAqIERlbmlzIFBldGVyLCBNUEwgQUcgU3dpdHplcmxhbmQsIGQucGV0ZXJAbXBsLmNoCisgKgorICogVE9ETzogQ2xlYW4tdXAKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSAiaXNhLmgiCisKKyNpZmRlZiBDT05GSUdfNDA1R1AKKyNpZmRlZiBDT05GSUdfUENJCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSAicGlpeDRfcGNpLmgiCisjaW5jbHVkZSAicGNpX3BhcnRzLmgiCisKK3ZvaWQgcGNpX3BpcDQwNV93cml0ZV9yZWdzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldiwKKwkJCSAgIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICplbnRyeSkKK3sKKwlzdHJ1Y3QgcGNpX3BpcDQwNV9jb25maWdfZW50cnkgKnRhYmxlOworCWludCBpOworCisJdGFibGUgPSAoc3RydWN0IHBjaV9waXA0MDVfY29uZmlnX2VudHJ5KikgZW50cnktPnByaXZbMF07CisKKwlmb3IgKGk9MDsgdGFibGVbaV0ud2lkdGg7IGkrKykKKwl7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRmKCJSZWcgMHglMDJYIFZhbHVlIDB4JTA4bFggV2lkdGggJTAyZCB3cml0dGVuXG4iLAorCQkgICAgICAgdGFibGVbaV0uaW5kZXgsIHRhYmxlW2ldLnZhbCwgdGFibGVbaV0ud2lkdGgpOworI2VuZGlmCisKKwkJc3dpdGNoKHRhYmxlW2ldLndpZHRoKQorCQl7CisJCWNhc2UgMTogcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCB0YWJsZVtpXS5pbmRleCwgdGFibGVbaV0udmFsKTsgYnJlYWs7CisJCWNhc2UgMjogcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCB0YWJsZVtpXS5pbmRleCwgdGFibGVbaV0udmFsKTsgYnJlYWs7CisJCWNhc2UgNDogcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgdGFibGVbaV0uaW5kZXgsIHRhYmxlW2ldLnZhbCk7IGJyZWFrOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHBjaV9waXA0MDVfZml4dXBfaXJxKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldikKK3sKKwl1bnNpZ25lZCBjaGFyIGludF9saW5lID0gMHhmZjsKKwkvKgorCSAqIFdyaXRlIHBjaSBpbnRlcnJ1cHQgbGluZSByZWdpc3RlcgorCSAqLworCWlmKFBDSV9ERVYoZGV2KT09MCkgLyogRGV2aWNlMCA9IFBQQzQwNSAtPiBza2lwICovCisJCXJldHVybjsKKwlpZihQQ0lfRlVOQyhkZXYpPT0wKQorCXsKKwkJLyogYXNzdW1pbmcgYWxsIGZ1bmN0aW9uIDAgYXJlIHVzaW5nIHRoZWlyIElOVEEjIFBpbiovCisJCWludF9saW5lPVBDSV9JUlFfVkVDVE9SKGRldik7CisJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpbnRfbGluZSk7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRmKCJGaXh1cCBJUlE6IGRldiAlZCAoJXgpIGludCBsaW5lICVkIDB4JXhcbiIsCisJCSAgICAgICBQQ0lfREVWKGRldiksZGV2LGludF9saW5lLGludF9saW5lKTsKKyNlbmRpZgorCX0KK30KKworZXh0ZXJuIHZvaWQgcGNpXzQwNWdwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIGhvc2UgPSB7CisgIGNvbmZpZ190YWJsZTogcGNpX3BpcDQwNV9jb25maWdfdGFibGUsCisgIGZpeHVwX2lycTogcGNpX3BpcDQwNV9maXh1cF9pcnEsCit9OworCit2b2lkIHBjaV9pbml0KHZvaWQpCit7CisJLyp3ZSB3YW50IHRoZSBwdHJzIHRvIFJBTSBub3QgZmxhc2ggKGllIGRvbid0IHVzZSBpbml0IGxpc3QpKi8KKwlob3NlLmZpeHVwX2lycSAgICA9IHBjaV9waXA0MDVfZml4dXBfaXJxOworCWhvc2UuY29uZmlnX3RhYmxlID0gcGNpX3BpcDQwNV9jb25maWdfdGFibGU7CisJcGNpXzQwNWdwX2luaXQoJmhvc2UpOworfQorCisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworI2VuZGlmIC8qIENPTkZJR180MDVHUCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBsL2NvbW1vbi9wY2lfcGFydHMuaCBiL2JvYXJkL21wbC9jb21tb24vcGNpX3BhcnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0NTg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL21wbC9jb21tb24vcGNpX3BhcnRzLmgKQEAgLTAsMCArMSwxOTIgQEAKKyAvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBEZW5pcyBQZXRlciwgTVBMIEFHIFN3aXR6ZXJsYW5kLCBkLnBldGVyQG1wbC5jaAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworI2lmbmRlZiBfUENJX1BBUlRTX0hfCisjZGVmaW5lIF9QQ0lfUEFSVFNfSF8KKworCisvKiBCb2FyZCBzcGVjaWZpYyBmaWxlIGNvbnRhaW5pbmc6CisgKiAtIFBDSSBNZW1vcnkgTWFwcGluZworICogLSBQQ0kgSU8gTWFwcGluZworICogLSBQQ0kgSW50ZXJydXB0IE1hcHBpbmcKKyAqLworCisvKiBQSVA0MDUgUENJIElOVCBSb3V0aW5nOgorICogICAgICAgICAgICAgICAgICAgICAgSVJRMCAgVkVDVE9SCisgKiBQSVhYNCBJRFNFTCAgPSBBRDE2ICBJTlRBIyAgMjggKEZ1bmN0aW9uIDIgVVNCIGlzIElOVEQjID0gMzEpCisgKiBWR0EgICBJRFNFTCAgPSBBRDE3ICBJTlRCIyAgMjkKKyAqIFNDU0kgIElEU0VMICA9IEFEMTggIElOVEMjICAzMAorICogUEMxMDQgSURTRUwwID0gQUQyMCAgSU5UQSMgIDI4CisgKiBQQzEwNCBJRFNFTDEgPSBBRDIxICBJTlRCIyAgMjkKKyAqIFBDMTA0IElEU0VMMiA9IEFEMjIgIElOVEMjICAzMAorICogUEMxMDQgSURTRUwzID0gQUQyMyAgSU5URCMgIDMxCisgKgorICogYnVzZGV2ZnVuYyA9IEVYWFggWFhYWCBCQkJCIEJCQkIgRERERCBERkZGIFJSUlIgUlIwMAorICogICAgICAgICAgICAgIF4gICAgICAgICBeICAgICAgICAgXiAgICAgXiAgIF4KKyAqICAgICAgICAgICAgIDMxICAgICAgICAyMyAgICAgICAgMTUgICAgMTAgICA3CisgKiBFID0gRW5hYmxlZAorICogQiA9IEJ1c3NudW1iZXIKKyAqIEQgPSBEZXZpY2VudW1iZXIgKERldmljZTAgPSBBRDEwKQorICogRiA9IEZ1bmN0aW9ubnVtYmVyCisgKiBSID0gUmVnaXN0ZXJudW1iZXIKKyAqCisgKiBEZXZpY2UgPSAoYnVzZGV2ZnVuYz4+MTEpICsgMTAKKyAqIFZlY3RvciA9IGRldmljZW51bWJlciAlIDQgKyAyOAorICoKKyAqLworI2RlZmluZSBQQ0lfSElHSEVTVF9PTl9CT0FSRF9JRAkxOQorLyojZGVmaW5lIFBDSV9ERVZfTlVNQkVSKHgpCSgoKHg+PjExKSAmIDB4MWYpICsgMTApICovCisjZGVmaW5lIFBDSV9JUlFfVkVDVE9SKHgpCSgoUENJX0RFVih4KSArIDEwKSAlIDQpICsgMjgKKworCisKKy8qIFBDSSBEZXZpY2UgTGlzdCBmb3IgUElQNDA1ICovCisKKy8qIE1hcHBpbmc6CisgKiArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogpiBQQ0kgTWVtQWRkciB8IFBDSSBJT0FkZHIgfCBMb2NhbCBBZGRyIHwgRGV2aWNlIC8gRnVuY3Rpb24gICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAweDAwMDAwMDAwIHwgICAgICAgICAgICB8IDB4QTAwMDAwMDAgfCBJU0EgTWVtb3J5IChoYXJkIHdpcmVkKSAgICAgICAgfAorICogfCAgMHgwMEZGRkZGRiB8ICAgICAgICAgICAgfCAweEEwRkZGRkZGIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgIHwgMHgwMDAwMDAwMCB8IDB4RTgwMDAwMDAgfCBJU0EgSU8gKGhhcmQgd2lyZWQpICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICB8IDB4MDAwMEZGRkYgfCAweEU4MDBGRkZGIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAweDgwMDAwMDAwIHwgICAgICAgICAgICB8IDB4ODAwMDAwMDAgfCBWR0EgQ29udHJvbGxlciBNZW1vcnkgICAgICAgICAgfAorICogfCAgMHg4MEZGRkZGRiB8ICAgICAgICAgICAgfCAweDgwRkZGRkZGIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAweDgxMDAwMDAwIHwgICAgICAgICAgICB8IDB4ODEwMDAwMDAgfCBTQ1NJIENvbnRyb2xsZXIgTWVtb3J5ICAgICAgICAgfAorICogfCAgMHg4MUZGRkZGRiB8ICAgICAgICAgICAgfCAweDgxRkZGRkZGIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKi8KKworc3RydWN0IHBjaV9waXA0MDVfY29uZmlnX2VudHJ5IHsKKwlpbnQgCQlpbmRleDsgCS8qIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nIAl2YWw7CS8qIHZhbHVlICovCisJaW50IAkJd2lkdGg7CS8qIGRhdGEgc2l6ZSAqLworfTsKKworZXh0ZXJuIHZvaWQgcGNpX3BpcDQwNV93cml0ZV9yZWdzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqLAorCQkJCSAgcGNpX2Rldl90LAorCQkJCSAgc3RydWN0IHBjaV9jb25maWdfdGFibGUgKik7CisKKy8qIFBJSVg0IElTQSBCcmlkZ2UgRnVuY3Rpb24gMCAqLworc3RhdGljIHN0cnVjdCBwY2lfcGlwNDA1X2NvbmZpZ19lbnRyeSBwaWl4NF9pc2FfYnJpZGdlX2YwW10gPSB7CisJe1BDSV9DRkdfUElJWDRfU0VSSVJRLAkweEQwLAkJMX0sIC8qIGVuYWJsZSBDb250aW5vdXMgU0VSSVJRIFBpbiAqLworCXtQQ0lfQ0ZHX1BJSVg0X0dFTkNGRywJMHgwMDAxMDA0MSwJNH0sIC8qIGVuYWJsZSBTRVJJUlFzLCBJU0EsIFBOUAkqLworCXtQQ0lfQ0ZHX1BJSVg0X1RPTSwJMHhGRSwJCTF9LCAvKiBUb3Agb2YgTWVtb3J5CQkqLworCXtQQ0lfQ0ZHX1BJSVg0X1hCQ1MsCTB4MDJDNCwJCTJ9LCAvKiBkaXNhYmxlIGFsbCBwZXJpIENTCSovCisJe1BDSV9DRkdfUElJWDRfUlRDQ0ZHLAkweDIxLAkJMX0sIC8qIGVuYWJsZSBSVEMJICAgCSovCisjaWYgZGVmaW5lZChDT05GSUdfUElQNDA1KQorCXtQQ0lfQ0ZHX1BJSVg0X01CRE1BLAkweDgyLAkJMX0sIC8qIHNldCBNQkRNQTAgdG8gRE1BIDIgICAJKi8KKwl7UENJX0NGR19QSUlYNF9NQkRNQSsxLAkweDgzLAkJMX0sIC8qIHNldCBNQkRNQTEgdG8gRE1BIDMgICAJKi8KKyNlbmRpZgorCXtQQ0lfQ0ZHX1BJSVg0X0RMQywJMHgwLAkJMX0sIC8qIGRpc2FibGUgcGFzc2l2ZSByZWxlYXNlIGZlYXR1cmUgKi8KKwl7IH0JCQkJICAgIAkgICAgLyogZW5kIG9mIGRldmljZSB0YWJsZQkqLworfTsKKworLyogUElJWDQgSURFIENvbnRyb2xsZXIgRnVuY3Rpb24gMSAqLworc3RhdGljIHN0cnVjdCBwY2lfcGlwNDA1X2NvbmZpZ19lbnRyeSBwaWl4NF9pZGVfY250cmxfZjFbXSA9IHsKKwl7UENJX0NPTU1BTkQsCQkweDAwMDEsCQkyfSwgLyogZW5hYmxlIElPIGFjY2VzcyAJKi8KKwl7UENJX0NGR19QSUlYNF9JREVUSU0sCTB4ODAwMDgwMDAsCTR9LCAvKiBlbmFibGUgQm90aCBJREUgY2hhbm5lbHMJKi8KKwl7IH0JCQkJCSAgICAvKiBlbmQgb2YgZGV2aWNlIHRhYmxlIAkqLworfTsKKworLyogUElJWDQgVVNCIENvbnRyb2xsZXIgRnVuY3Rpb24gMiAqLworc3RhdGljIHN0cnVjdCBwY2lfcGlwNDA1X2NvbmZpZ19lbnRyeSBwaWl4NF91c2JfY250cmxfZjJbXSA9IHsKKwl7UENJX0lOVEVSUlVQVF9MSU5FLAkzMSwJCTF9LCAvKiBJbnQgdmVjdG9yID0gMzEgCQkqLworCXtQQ0lfQkFTRV9BRERSRVNTXzQsCTB4MDAwMEUwMDEsCTR9LCAvKiBTZXQgSU8gQWRkcmVzcyB0byAweGUwMDAgdG8gMHhlMDFGICovCisJe1BDSV9MQVRFTkNZX1RJTUVSLAkweDgwLAkJMX0sIC8qIExhdGVuY3kgVGltZXIgMHg4MCAJKi8KKwl7MHhDMCwJCQkweDIwMDAsCQkyfSwgLyogTGVnYWN5IHN1cHBvcnQgCQkqLworCXtQQ0lfQ09NTUFORCwJCTB4MDAwNSwJCTJ9LCAvKiBlbmFibGUgSU8gYWNjZXNzIGFuZCBNYXN0ZXIgKi8KKwl7IH0JCQkJCSAgICAvKiBlbmQgb2YgZGV2aWNlIHRhYmxlIAkqLworfTsKKworLyogUElJWDQgUG93ZXIgTWFuYWdlbWVudCBGdW5jdGlvbiAzICovCitzdGF0aWMgc3RydWN0IHBjaV9waXA0MDVfY29uZmlnX2VudHJ5IHBpaXg0X3BtbV9jbnRybF9mM1tdID0geworCXtQQ0lfQ09NTUFORCwJCTB4MDAwMSwJCTJ9LCAvKiBlbmFibGUgSU8gYWNjZXNzIAkqLworCXtQQ0lfQ0ZHX1BJSVg0X1BNQUIsCTB4MDAwMDQwMDAsCTR9LCAvKiBzZXQgUE1CQSB0byAidmFsaWQiIHZhbHVlICovCisJe1BDSV9DRkdfUElJWDRfUE1NSVNDLAkweDAxLAkJMX0sIC8qIGVuYWJsZSBQTUJBIElPIGFjY2VzcwkqLworCXtQQ0lfQ0ZHX1BJSVg0X1NNQkJBLAkweDAwMDA1MDAwLAk0fSwgLyogc2V0IFNNQkJBIHRvICJ2YWxpZCIgdmFsdWUgKi8KKwl7IH0JCQkJCSAgICAvKiBlbmQgb2YgZGV2aWNlIHRhYmxlIAkqLworfTsKKy8qIFBQQzQwNSBEdW1teSBvbmx5IHVzZWQgdG8gcHJldmVudCBhdXRvc2V0dXAgb24gdGhpcyBob3N0IGJyaWRnZSAqLworc3RhdGljIHN0cnVjdCBwY2lfcGlwNDA1X2NvbmZpZ19lbnRyeSBpYm00MDVfZHVtbXlbXSA9IHsKKwl7IH0JCQkJICAgIAkgICAgLyogZW5kIG9mIGRldmljZSB0YWJsZSAJKi8KK307CisKK3ZvaWQgcGNpXzQwNWdwX3NldHVwX3ZnYShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYsCisJCQkgc3RydWN0IHBjaV9jb25maWdfdGFibGUgKmVudHJ5KTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9jb25maWdfdGFibGUgcGNpX3BpcDQwNV9jb25maWdfdGFibGVbXT17CisJe1BDSV9WRU5ET1JfSURfSUJNLCAJCQkvKiA0MDUgZHVtbXkgKi8KKwkgUENJX0RFVklDRV9JRF9JQk1fNDA1R1AsCisJIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsCisJIHBjaV9waXA0MDVfd3JpdGVfcmVncywgeyh1bnNpZ25lZCBsb25nKSBpYm00MDVfZHVtbXl9fSwKKworCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAJCQkvKiBQSUlYNCBJU0EgQnJpZGdlIEZ1bmN0aW9uIDAgKi8KKwkgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzAsCisJIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsCisJIHBjaV9waXA0MDVfd3JpdGVfcmVncywgeyh1bnNpZ25lZCBsb25nKSBwaWl4NF9pc2FfYnJpZGdlX2YwfX0sCisKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwJCQkvKiBQSUlYNCBJREUgQ29udHJvbGxlciBGdW5jdGlvbiAxICovCisJIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQiwKKwkgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMSwKKwkgcGNpX3BpcDQwNV93cml0ZV9yZWdzLCB7KHVuc2lnbmVkIGxvbmcpIHBpaXg0X2lkZV9jbnRybF9mMX19LAorCisJe1BDSV9WRU5ET1JfSURfSU5URUwsCQkJLyogUElJWDQgVVNCIENvbnRyb2xsZXIgRnVuY3Rpb24gMiAqLworCSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMiwKKwkgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMiwKKwkgcGNpX3BpcDQwNV93cml0ZV9yZWdzLCB7KHVuc2lnbmVkIGxvbmcpIHBpaXg0X3VzYl9jbnRybF9mMn19LAorCisJe1BDSV9WRU5ET1JfSURfSU5URUwsCQkJLyogUElJWDQgVVNCIENvbnRyb2xsZXIgRnVuY3Rpb24gMyAqLworCSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywKKwkgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMywKKwkgcGNpX3BpcDQwNV93cml0ZV9yZWdzLCB7KHVuc2lnbmVkIGxvbmcpIHBpaXg0X3BtbV9jbnRybF9mM319LAorCisJe1BDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsCisJIFBDSV9DTEFTU19ESVNQTEFZX1ZHQSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgcGNpXzQwNWdwX3NldHVwX3ZnYX0sCisKKwl7UENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwKKwkgUENJX0NMQVNTX05PVF9ERUZJTkVEX1ZHQSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgcGNpXzQwNWdwX3NldHVwX3ZnYX0sCisKKwl7IH0KK307CisjZW5kaWYgLyogX1BDSV9QQVJUU19IXyAqLworCisKKworCisKZGlmZiAtLWdpdCBhL2JvYXJkL21wbC9taXA0MDUvTWFrZWZpbGUgYi9ib2FyZC9tcGwvbWlwNDA1L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWNhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9tcGwvbWlwNDA1L01ha2VmaWxlCkBAIC0wLDAgKzEsNDkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSBsaWIkKEJPQVJEKS5hCisKK09CSlMJPSAkKEJPQVJEKS5vIC4uL2NvbW1vbi9mbGFzaC5vIGNtZF9taXA0MDUubyAuLi9jb21tb24vcGNpLm8gXAorCQkJLi4vY29tbW9uL3VzYl91aGNpLm8gLi4vY29tbW9uL21lbXRzdC5vIC4uL2NvbW1vbi9jb21tb25fdXRpbC5vCisKK1NPQkpTCT0gaW5pdC5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpIGNydiAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLmRlcGVuZDoJTWFrZWZpbGUgJChTT0JKUzoubz0uUykgJChPQkpTOi5vPS5jKQorCQkkKENDKSAtTSAkKENGTEFHUykgJChTT0JKUzoubz0uUykgJChPQkpTOi5vPS5jKSA+ICRACisKK3NpbmNsdWRlIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBsL3BpcDQwNS9NYWtlZmlsZSBiL2JvYXJkL21wbC9waXA0MDUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjYzUzMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL21wbC9waXA0MDUvTWFrZWZpbGUKQEAgLTAsMCArMSw1MiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9IGxpYiQoQk9BUkQpLmEKKworT0JKUwk9ICQoQk9BUkQpLm8gXAorCSAgLi4vY29tbW9uL2ZsYXNoLm8gY21kX3BpcDQwNS5vIC4uL2NvbW1vbi9wY2kubyBcCisJICAuLi9jb21tb24vaXNhLm8gLi4vY29tbW9uL2tiZC5vIFwKKwkgIC4uL2NvbW1vbi91c2JfdWhjaS5vIFwKKwkgIC4uL2NvbW1vbi9tZW10c3QubyAuLi9jb21tb24vY29tbW9uX3V0aWwubworCitTT0JKUwk9IGluaXQubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSBjcnYgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5kZXBlbmQ6CU1ha2VmaWxlICQoU09CSlM6Lm89LlMpICQoT0JKUzoubz0uYykKKwkJJChDQykgLU0gJChDRkxBR1MpICQoU09CSlM6Lm89LlMpICQoT0JKUzoubz0uYykgPiAkQAorCitzaW5jbHVkZSAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL211c2Vua2kvbXVzZW5raS5jIGIvYm9hcmQvbXVzZW5raS9tdXNlbmtpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwMmYzNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL211c2Vua2kvbXVzZW5raS5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBSb2IgVGF5bG9yLCBGbHlpbmcgUGlnIFN5c3RlbXMuIHJvYnRAZmx5aW5ncGlnLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODI0eC5oPgorI2luY2x1ZGUgPHBjaS5oPgorCitpbnQgY2hlY2tib2FyZCAodm9pZCkKK3sKKwl1bG9uZyBidXNmcmVxICA9IGdldF9idXNfZnJlcSgwKTsKKwljaGFyICBidWZbMzJdOworCisJcHJpbnRmKCJCb2FyZDogTVVTRU5LSSBMb2NhbCBCdXMgYXQgJXMgTUh6XG4iLCBzdHJtaHooYnVmLCBidXNmcmVxKSk7CisJcmV0dXJuIDA7CisKK30KKworI2lmIDAgCS8qIE5PVCBVU0VEICovCitpbnQgY2hlY2tmbGFzaCAodm9pZCkKK3sKKwkvKiBUT0RPOiBYWFggWFhYIFhYWCAqLworCXByaW50ZiAoIiMjIFRlc3Qgbm90IGltcGxlbWVudGVkIHlldCAjI1xuIik7CisKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCisKK2xvbmcgaW50IGluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKK3sKKwlpbnQgICAgICAgICAgICAgIGksIGNudDsKKwl2b2xhdGlsZSB1Y2hhciAqIGJhc2U9IENGR19TRFJBTV9CQVNFOworCXZvbGF0aWxlIHVsb25nICogYWRkcjsKKwl1bG9uZyAgICAgICAgICAgIHNhdmVbMzJdOworCXVsb25nICAgICAgICAgICAgdmFsLCByZXQgID0gMDsKKworCWZvciAoaT0wLCBjbnQ9KENGR19NQVhfUkFNX1NJWkUgLyBzaXplb2YobG9uZykpID4+IDE7IGNudCA+IDA7IGNudCA+Pj0gMSkgeworCQlhZGRyID0gKHZvbGF0aWxlIHVsb25nICopYmFzZSArIGNudDsKKwkJc2F2ZVtpKytdID0gKmFkZHI7CisJCSphZGRyID0gfmNudDsKKwl9CisKKwlhZGRyID0gKHZvbGF0aWxlIHVsb25nICopYmFzZTsKKwlzYXZlW2ldID0gKmFkZHI7CisJKmFkZHIgPSAwOworCisJaWYgKCphZGRyICE9IDApIHsKKwkJKmFkZHIgPSBzYXZlW2ldOworCQlnb3RvIERvbmU7CisJfQorCisJZm9yIChjbnQgPSAxOyBjbnQgPD0gQ0ZHX01BWF9SQU1fU0laRSAvIHNpemVvZihsb25nKTsgY250IDw8PSAxKSB7CisJCWFkZHIgPSAodm9sYXRpbGUgdWxvbmcgKiliYXNlICsgY250OworCQl2YWwgPSAqYWRkcjsKKwkJKmFkZHIgPSBzYXZlWy0taV07CisJCWlmICh2YWwgIT0gfmNudCkgeworCQkJdWxvbmcgbmV3X2JhbmswX2VuZCA9IGNudCAqIHNpemVvZihsb25nKSAtIDE7CisJCQl1bG9uZyBtZWFyMSAgPSBtcGM4MjR4X21wYzEwN19nZXRyZWcoTUVBUjEpOworCQkJdWxvbmcgZW1lYXIxID0gbXBjODI0eF9tcGMxMDdfZ2V0cmVnKEVNRUFSMSk7CisJCQltZWFyMSA9ICAobWVhcjEgICYgMHhGRkZGRkYwMCkgfAorCQkJICAoKG5ld19iYW5rMF9lbmQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKTsKKwkJCWVtZWFyMSA9IChlbWVhcjEgJiAweEZGRkZGRjAwKSB8CisJCQkgICgobmV3X2JhbmswX2VuZCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0VBRERSX1NISUZUKTsKKwkJCW1wYzgyNHhfbXBjMTA3X3NldHJlZyhNRUFSMSwgIG1lYXIxKTsKKwkJCW1wYzgyNHhfbXBjMTA3X3NldHJlZyhFTUVBUjEsIGVtZWFyMSk7CisKKwkJCXJldCA9IGNudCAqIHNpemVvZihsb25nKTsKKwkJCWdvdG8gRG9uZTsKKwkJfQorCX0KKworCXJldCA9IENGR19NQVhfUkFNX1NJWkU7CitEb25lOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIFBDSSBEZXZpY2VzCisgKi8KKyNpZm5kZWYgQ09ORklHX1BDSV9QTlAKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBwY2lfc2FuZHBvaW50X2NvbmZpZ190YWJsZVtdID0geworI2lmIDAKKwl7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJICAweDAsIDB4MCwgMHgwLCAvKiB1bmtub3duIGV0aDAgZGl2aWNlICovCisJICBwY2lfY2ZnZnVuY19jb25maWdfZGV2aWNlLCB7IFBDSV9FTkVUMF9JT0FERFIsCisJCQkJICAgICAgIFBDSV9FTkVUMF9NRU1BRERSLAorCQkJCSAgICAgICBQQ0lfQ09NTUFORF9JTyB8CisJCQkJICAgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8CisJCQkJICAgICAgIFBDSV9DT01NQU5EX01BU1RFUiB9fSwKKwl7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJICAweDAsIDB4MCwgMHgwLCAvKiB1bmtub3duIGV0aDEgZGV2aWNlICovCisJICBwY2lfY2ZnZnVuY19jb25maWdfZGV2aWNlLCB7IFBDSV9FTkVUMV9JT0FERFIsCisJCQkJICAgICAgIFBDSV9FTkVUMV9NRU1BRERSLAorCQkJCSAgICAgICBQQ0lfQ09NTUFORF9JTyB8CisJCQkJICAgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8CisJCQkJICAgICAgIFBDSV9DT01NQU5EX01BU1RFUiB9fSwKKyNlbmRpZgorCXsgfQorfTsKKyNlbmRpZgorCitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZSA9IHsKKyNpZm5kZWYgQ09ORklHX1BDSV9QTlAKKwljb25maWdfdGFibGU6IHBjaV9zYW5kcG9pbnRfY29uZmlnX3RhYmxlLAorI2VuZGlmCit9OworCit2b2lkIHBjaV9pbml0KHZvaWQpCit7CisJcGNpX21wYzgyNHhfaW5pdCgmaG9zZSk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9tdnMxL01ha2VmaWxlIGIvYm9hcmQvbXZzMS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjE3M2QwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbXZzMS9NYWtlZmlsZQpAQCAtMCwwICsxLDQwIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMAorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gbGliJChCT0FSRCkuYQorCitPQkpTCT0gJChCT0FSRCkubyBmbGFzaC5vCisKKyQoTElCKToJLmRlcGVuZCAkKE9CSlMpCisJJChBUikgY3J2ICRAICReCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLmRlcGVuZDoJTWFrZWZpbGUgJChTT0JKUzoubz0uUykgJChPQkpTOi5vPS5jKQorCQkkKENDKSAtTSAkKENGTEFHUykgJChTT0JKUzoubz0uUykgJChPQkpTOi5vPS5jKSA+ICRACisKK3NpbmNsdWRlIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0dmlhL01ha2VmaWxlIGIvYm9hcmQvbmV0dmlhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTczZDAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXR2aWEvTWFrZWZpbGUKQEAgLTAsMCArMSw0MCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9IGxpYiQoQk9BUkQpLmEKKworT0JKUwk9ICQoQk9BUkQpLm8gZmxhc2gubworCiskKExJQik6CS5kZXBlbmQgJChPQkpTKQorCSQoQVIpIGNydiAkQCAkXgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5kZXBlbmQ6CU1ha2VmaWxlICQoU09CSlM6Lm89LlMpICQoT0JKUzoubz0uYykKKwkJJChDQykgLU0gJChDRkxBR1MpICQoU09CSlM6Lm89LlMpICQoT0JKUzoubz0uYykgPiAkQAorCitzaW5jbHVkZSAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHZpYS9uZXR2aWEuYyBiL2JvYXJkL25ldHZpYS9uZXR2aWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDQ1OTNlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbmV0dmlhL25ldHZpYS5jCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBQYW50ZWxpcyBBbnRvbmlvdSwgSW50cmFjb20gUy5BLiwgcGFudG9AaW50cmFjb20uZ3IKKyAqIFUtQm9vdCBwb3J0IG9uIE5ldFZpYSBib2FyZAorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlICJtcGM4eHguaCIKKworLyogc29tZSBzYW5lIGJpdCBtYWNyb3MgKi8KKyNkZWZpbmUgX0JEKF9iKQkJCQkoMVUgPDwgKDMxLShfYikpKQorI2RlZmluZSBfQkRSKF9sLCBfaCkJCQkoKCgoKDFVIDw8ICgzMS0oX2wpKSkgLSAxKSA8PCAxKSB8IDEpICYgfigoMVUgPDwgKDMxLShfaCkpKSAtIDEpKQorCisjZGVmaW5lIF9CVyhfYikJCQkJKDFVIDw8ICgxNS0oX2IpKSkKKyNkZWZpbmUgX0JXUihfbCwgX2gpCQkJKCgoKCgxVSA8PCAoMTUtKF9sKSkpIC0gMSkgPDwgMSkgfCAxKSAmIH4oKDFVIDw8ICgxNS0oX2gpKSkgLSAxKSkKKworI2RlZmluZSBfQkIoX2IpCQkJCSgxVSA8PCAoNy0oX2IpKSkKKyNkZWZpbmUgX0JCUihfbCwgX2gpCQkJKCgoKCgxVSA8PCAoNy0oX2wpKSkgLSAxKSA8PCAxKSB8IDEpICYgfigoMVUgPDwgKDctKF9oKSkpIC0gMSkpCisKKyNkZWZpbmUgX0IoX2IpCQkJCV9CRChfYikKKyNkZWZpbmUgX0JSKF9sLCBfaCkJCQlfQkRSKF9sLCBfaCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgX05PVF9VU0VEXwkweEZGRkZGRkZGCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBDU18wMDAwCQkweDAwMDAwMDAwCisjZGVmaW5lIENTXzAwMDEJCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ1NfMDAxMAkJMHgyMDAwMDAwMAorI2RlZmluZSBDU18wMDExCQkweDMwMDAwMDAwCisjZGVmaW5lIENTXzAxMDAJCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ1NfMDEwMQkJMHg1MDAwMDAwMAorI2RlZmluZSBDU18wMTEwCQkweDYwMDAwMDAwCisjZGVmaW5lIENTXzAxMTEJCTB4NzAwMDAwMDAKKyNkZWZpbmUgQ1NfMTAwMAkJMHg4MDAwMDAwMAorI2RlZmluZSBDU18xMDAxCQkweDkwMDAwMDAwCisjZGVmaW5lIENTXzEwMTAJCTB4QTAwMDAwMDAKKyNkZWZpbmUgQ1NfMTAxMQkJMHhCMDAwMDAwMAorI2RlZmluZSBDU18xMTAwCQkweEMwMDAwMDAwCisjZGVmaW5lIENTXzExMDEJCTB4RDAwMDAwMDAKKyNkZWZpbmUgQ1NfMTExMAkJMHhFMDAwMDAwMAorI2RlZmluZSBDU18xMTExCQkweEYwMDAwMDAwCisKKyNkZWZpbmUgQlNfMDAwMAkJMHgwMDAwMDAwMAorI2RlZmluZSBCU18wMDAxCQkweDAxMDAwMDAwCisjZGVmaW5lIEJTXzAwMTAJCTB4MDIwMDAwMDAKKyNkZWZpbmUgQlNfMDAxMQkJMHgwMzAwMDAwMAorI2RlZmluZSBCU18wMTAwCQkweDA0MDAwMDAwCisjZGVmaW5lIEJTXzAxMDEJCTB4MDUwMDAwMDAKKyNkZWZpbmUgQlNfMDExMAkJMHgwNjAwMDAwMAorI2RlZmluZSBCU18wMTExCQkweDA3MDAwMDAwCisjZGVmaW5lIEJTXzEwMDAJCTB4MDgwMDAwMDAKKyNkZWZpbmUgQlNfMTAwMQkJMHgwOTAwMDAwMAorI2RlZmluZSBCU18xMDEwCQkweDBBMDAwMDAwCisjZGVmaW5lIEJTXzEwMTEJCTB4MEIwMDAwMDAKKyNkZWZpbmUgQlNfMTEwMAkJMHgwQzAwMDAwMAorI2RlZmluZSBCU18xMTAxCQkweDBEMDAwMDAwCisjZGVmaW5lIEJTXzExMTAJCTB4MEUwMDAwMDAKKyNkZWZpbmUgQlNfMTExMQkJMHgwRjAwMDAwMAorCisjZGVmaW5lIEExMF9BQUFBCTB4MDAwMDAwMDAKKyNkZWZpbmUgQTEwX0FBQTAJMHgwMDIwMDAwMAorI2RlZmluZSBBMTBfQUFBMQkweDAwMzAwMDAwCisjZGVmaW5lIEExMF8wMDBBCTB4MDA4MDAwMDAKKyNkZWZpbmUgQTEwXzAwMDAJMHgwMEEwMDAwMAorI2RlZmluZSBBMTBfMDAwMQkweDAwQjAwMDAwCisjZGVmaW5lIEExMF8xMTFBCTB4MDBDMDAwMDAKKyNkZWZpbmUgQTEwXzExMTAJMHgwMEUwMDAwMAorI2RlZmluZSBBMTBfMTExMQkweDAwRjAwMDAwCisKKyNkZWZpbmUgUkFTXzAwMDAJMHgwMDAwMDAwMAorI2RlZmluZSBSQVNfMDAwMQkweDAwMDQwMDAwCisjZGVmaW5lIFJBU18xMTEwCTB4MDAwODAwMDAKKyNkZWZpbmUgUkFTXzExMTEJMHgwMDBDMDAwMAorCisjZGVmaW5lIENBU18wMDAwCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0FTXzAwMDEJMHgwMDAxMDAwMAorI2RlZmluZSBDQVNfMTExMAkweDAwMDIwMDAwCisjZGVmaW5lIENBU18xMTExCTB4MDAwMzAwMDAKKworI2RlZmluZSBXRV8wMDAwCQkweDAwMDAwMDAwCisjZGVmaW5lIFdFXzAwMDEJCTB4MDAwMDQwMDAKKyNkZWZpbmUgV0VfMTExMAkJMHgwMDAwODAwMAorI2RlZmluZSBXRV8xMTExCQkweDAwMDBDMDAwCisKKyNkZWZpbmUgR1BMNF8wMDAwCTB4MDAwMDAwMDAKKyNkZWZpbmUgR1BMNF8wMDAxCTB4MDAwMDEwMDAKKyNkZWZpbmUgR1BMNF8xMTEwCTB4MDAwMDIwMDAKKyNkZWZpbmUgR1BMNF8xMTExCTB4MDAwMDMwMDAKKworI2RlZmluZSBHUEw1XzAwMDAJMHgwMDAwMDAwMAorI2RlZmluZSBHUEw1XzAwMDEJMHgwMDAwMDQwMAorI2RlZmluZSBHUEw1XzExMTAJMHgwMDAwMDgwMAorI2RlZmluZSBHUEw1XzExMTEJMHgwMDAwMEMwMAorI2RlZmluZSBMT09QCQkweDAwMDAwMDgwCisKKyNkZWZpbmUgRVhFTgkJMHgwMDAwMDA0MAorCisjZGVmaW5lIEFNWF9DT0wJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQU1YX1JPVwkJMHgwMDAwMDAyMAorI2RlZmluZSBBTVhfTUFSCQkweDAwMDAwMDMwCisKKyNkZWZpbmUgTkEJCTB4MDAwMDAwMDgKKworI2RlZmluZSBVVEEJCTB4MDAwMDAwMDQKKworI2RlZmluZSBUT0RUCQkweDAwMDAwMDAyCisKKyNkZWZpbmUgTEFTVAkJMHgwMDAwMDAwMQorCitjb25zdCB1aW50IHNkcmFtX3RhYmxlWzB4NDBdID0geworCS8qIFJTUyAqLworCUNTXzAwMDEgfCBCU18xMTExIHwgQTEwX0FBQUEgfCBSQVNfMDAwMSB8IENBU18xMTExIHwgV0VfMTExMSB8IEFNWF9DT0wgfCBVVEEsCQkJLyogQUNUICAgKi8KKwlDU18xMTExIHwgQlNfMTExMSB8IEExMF8wMDAwIHwgUkFTXzExMTEgfCBDQVNfMTExMSB8IFdFXzExMTEgfCBBTVhfQ09MIHwgVVRBLAkJCS8qIE5PUCAgICovCisJQ1NfMDAwMCB8IEJTXzExMTEgfCBBMTBfMDAwMSB8IFJBU18xMTExIHwgQ0FTXzAwMDEgfCBXRV8xMTExIHwgQU1YX0NPTCB8IFVUQSwJCQkvKiBSRUFEICAqLworCUNTXzAwMDEgfCBCU18wMDAxIHwgQTEwXzExMTEgfCBSQVNfMDAwMSB8IENBU18xMTExIHwgV0VfMDAwMSB8IEFNWF9DT0wgfCBVVEEsCQkJLyogUEFMTCAgKi8KKwlDU18xMTExIHwgQlNfMTExMSB8IEExMF8xMTExIHwgUkFTXzExMTEgfCBDQVNfMTExMSB8IFdFXzExMTEgfCBBTVhfQ09MLAkJCQkvKiBOT1AgICAqLworCUNTXzExMTEgfCBCU18xMTExIHwgQTEwXzExMTEgfCBSQVNfMTExMSB8IENBU18xMTExIHwgV0VfMTExMSB8IEFNWF9DT0wgfCBVVEEgfCBUT0RUIHwgTEFTVCwJLyogTk9QICAgKi8KKwlfTk9UX1VTRURfLCBfTk9UX1VTRURfLAorCisJLyogUkJTICovCisJQ1NfMDAwMSB8IEJTXzExMTEgfCBBMTBfQUFBQSB8IFJBU18wMDAxIHwgQ0FTXzExMTEgfCBXRV8xMTExIHwgQU1YX0NPTCB8IFVUQSwJCQkvKiBBQ1QgICAqLworCUNTXzExMTEgfCBCU18xMTExIHwgQTEwXzAwMDAgfCBSQVNfMTExMSB8IENBU18xMTExIHwgV0VfMTExMSB8IEFNWF9DT0wgfCBVVEEsCQkJLyogTk9QICAgKi8KKwlDU18wMDAxIHwgQlNfMTExMSB8IEExMF8wMDAxIHwgUkFTXzExMTEgfCBDQVNfMDAwMSB8IFdFXzExMTEgfCBBTVhfQ09MIHwgVVRBLAkJCS8qIFJFQUQgICovCisJQ1NfMTExMSB8IEJTXzAwMDAgfCBBMTBfMTExMSB8IFJBU18xMTExIHwgQ0FTXzExMTEgfCBXRV8xMTExIHwgQU1YX0NPTCB8IFVUQSwJCQkvKiBOT1AgICAqLworCUNTXzExMTEgfCBCU18wMDAwIHwgQTEwXzExMTEgfCBSQVNfMTExMSB8IENBU18xMTExIHwgV0VfMTExMSB8IEFNWF9DT0wsCQkJCS8qIE5PUAkgKi8KKwlDU18xMTExIHwgQlNfMDAwMCB8IEExMF8xMTExIHwgUkFTXzExMTEgfCBDQVNfMTExMSB8IFdFXzExMTEgfCBBTVhfQ09MLAkJCQkvKiBOT1AJICovCisJQ1NfMDAwMSB8IEJTXzAwMDEgfCBBMTBfMTExMSB8IFJBU18wMDAxIHwgQ0FTXzExMTEgfCBXRV8wMDAxIHwgQU1YX0NPTCwJCQkJLyogUEFMTCAgKi8KKwlDU18xMTExIHwgQlNfMTExMSB8IEExMF8xMTExIHwgUkFTXzExMTEgfCBDQVNfMTExMSB8IFdFXzExMTEgfCBBTVhfQ09MIHwgVE9EVCB8IExBU1QsCQkvKiBOT1AJICovCisJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKKwlfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAorCisJLyogV1NTICovCisJQ1NfMDAwMSB8IEJTXzExMTEgfCBBMTBfQUFBQSB8IFJBU18wMDAxIHwgQ0FTXzExMTEgfCBXRV8xMTExIHwgQU1YX0NPTCB8IFVUQSwKKwlDU18xMTExIHwgQlNfMTExMSB8IEExMF8wMDAwIHwgUkFTXzExMTEgfCBDQVNfMTExMSB8IFdFXzExMTEgfCBBTVhfQ09MLAorCUNTXzAwMDAgfCBCU18wMDAxIHwgQTEwXzAwMDAgfCBSQVNfMTExMSB8IENBU18wMDAxIHwgV0VfMDAwMCB8IEFNWF9DT0wgfCBVVEEsCisJQ1NfMDAwMSB8IEJTXzExMTEgfCBBMTBfMTExMSB8IFJBU18wMDAxIHwgQ0FTXzExMTEgfCBXRV8wMDAxIHwgQU1YX0NPTCB8IFVUQSB8IFRPRFQgfCBMQVNULAorCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCisKKwkvKiBXQlMgKi8KKwlDU18wMDAxIHwgQlNfMTExMSB8IEExMF9BQUFBIHwgUkFTXzAwMDEgfCBDQVNfMTExMSB8IFdFXzExMTEgfCBBTVhfQ09MIHwgVVRBLAkJCS8qIEFDVCAgICovCisJQ1NfMTExMSB8IEJTXzExMTEgfCBBMTBfMDAwMCB8IFJBU18xMTExIHwgQ0FTXzExMTEgfCBXRV8xMTExIHwgQU1YX0NPTCwJCQkJLyogTk9QICAgKi8KKwlDU18wMDAxIHwgQlNfMDAwMCB8IEExMF8wMDAwIHwgUkFTXzExMTEgfCBDQVNfMDAwMSB8IFdFXzAwMDAgfCBBTVhfQ09MLAkJCQkvKiBXUklURSAqLworCUNTXzExMTEgfCBCU18wMDAwIHwgQTEwXzExMTEgfCBSQVNfMTExMSB8IENBU18xMTExIHwgV0VfMTExMSB8IEFNWF9DT0wsCQkJCS8qIE5PUCAgICovCisJQ1NfMTExMSB8IEJTXzAwMDAgfCBBMTBfMTExMSB8IFJBU18xMTExIHwgQ0FTXzExMTEgfCBXRV8xMTExIHwgQU1YX0NPTCwJCQkJLyogTk9QICAgKi8KKwlDU18xMTExIHwgQlNfMDAwMSB8IEExMF8xMTExIHwgUkFTXzExMTEgfCBDQVNfMTExMSB8IFdFXzExMTEgfCBBTVhfQ09MIHwgVVRBLAkJCS8qIE5PUCAgICovCisJQ1NfMTExMSB8IEJTXzExMTEgfCBBMTBfMTExMSB8IFJBU18xMTExIHwgQ0FTXzExMTEgfCBXRV8xMTExIHwgQU1YX0NPTCB8IFVUQSwJCQkvKiBOT1AgICAqLworCUNTXzAwMDEgfCBCU18xMTExIHwgQTEwXzExMTEgfCBSQVNfMDAwMSB8IENBU18xMTExIHwgV0VfMDAwMSB8IEFNWF9DT0wgfCBVVEEsCQkJLyogUEFMTCAgKi8KKwlDU18xMTExIHwgQlNfMTExMSB8IEExMF8xMTExIHwgUkFTXzExMTEgfCBDQVNfMTExMSB8IFdFXzExMTEgfCBBTVhfQ09MIHwgVVRBIHwgVE9EVCB8IExBU1QsCS8qIE5PUCAgICovCisJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKKwlfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAorCisJLyogVVBUICovCisJQ1NfMTExMSB8IEJTXzExMTEgfCBBMTBfMTExMSB8IFJBU18xMTExIHwgQ0FTXzExMTEgfCBXRV8xMTExIHwgQU1YX0NPTCwJCQkJLyogTk9QICAgKi8KKwlDU18wMDAxIHwgQlNfMTExMSB8IEExMF8xMTExIHwgUkFTXzAwMDEgfCBDQVNfMDAwMSB8IFdFXzExMTEgfCBBTVhfQ09MIHwgTE9PUCwKKwlDU18xMTExIHwgQlNfMTExMSB8IEExMF8xMTExIHwgUkFTXzExMTEgfCBDQVNfMTExMSB8IFdFXzExMTEgfCBBTVhfQ09MLAorCUNTXzExMTEgfCBCU18xMTExIHwgQTEwXzExMTEgfCBSQVNfMTExMSB8IENBU18xMTExIHwgV0VfMTExMSB8IEFNWF9DT0wsCisJQ1NfMTExMSB8IEJTXzExMTEgfCBBMTBfMTExMSB8IFJBU18xMTExIHwgQ0FTXzExMTEgfCBXRV8xMTExIHwgQU1YX0NPTCB8IExPT1AsCisJQ1NfMTExMSB8IEJTXzExMTEgfCBBMTBfMTExMSB8IFJBU18xMTExIHwgQ0FTXzExMTEgfCBXRV8xMTExIHwgQU1YX0NPTCB8IExBU1QsCisJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKKwlfTk9UX1VTRURfLCBfTk9UX1VTRURfLAorCisJLyogRVhDICovCisJQ1NfMDAwMSB8IEJTXzExMTEgfCBBMTBfMTExMSB8IFJBU18wMDAxIHwgQ0FTXzExMTEgfCBXRV8wMDAxIHwgQU1YX0NPTCwKKwlDU18xMTExIHwgQlNfMTExMSB8IEExMF8xMTExIHwgUkFTXzExMTEgfCBDQVNfMTExMSB8IFdFXzExMTEgfCBBTVhfQ09MIHwgVE9EVCB8IExBU1QsCisKKwkvKiBSRUcgKi8KKwlDU18xMTExIHwgQlNfMTExMSB8IEExMF8xMTExIHwgUkFTXzExMTEgfCBDQVNfMTExMSB8IFdFXzExMTAgfCBBTVhfTUFSLAorCUNTXzAwMDEgfCBCU18xMTExIHwgQTEwXzAwMDEgfCBSQVNfMDAwMSB8IENBU18wMDAxIHwgV0VfMDAwMSB8IEFNWF9NQVIgfCBUT0RUIHwgTEFTVCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICogQ2hlY2sgQm9hcmQgSWRlbnRpdHk6CisgKgorICogVGVzdCBFVFggSUQgc3RyaW5nIChFVFhfeHh4Li4uKQorICoKKyAqIFJldHVybiAxIGFsd2F5cy4KKyAqLworCitpbnQgY2hlY2tib2FyZCh2b2lkKQoreworCXByaW50ZiAoIk5FVFZJQVxuIik7CisJcmV0dXJuICgwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAweEM4ID0gMGIxMTAwMTAwMCAsIENBUzMsID4+IDIgPSAwYjAwIDExIDAgMDEwICovCisjZGVmaW5lIE1BUl9TRFJBTV9JTklUCQkweDAwMDAwMEM4TFUKKworI2RlZmluZSBNQ1JfT1AoeCkJCSgodW5zaWduZWQgbG9uZykoKHgpICYgMykgPDwgKDMxLTEpKQorI2RlZmluZSBNQ1JfT1BfTUFTSwkJTUNSX09QKDMpCisKKyNkZWZpbmUgTUNSX1VNKHgpCQkoKHVuc2lnbmVkIGxvbmcpKCh4KSAmIDEpIDw8ICgzMSAtIDgpKQorI2RlZmluZSBNQ1JfVU1fTUFTSwkJTUNSX1VNKDEpCisjZGVmaW5lIE1DUl9VTV9VUE1BCQlNQ1JfVU0oMCkKKyNkZWZpbmUgTUNSX1VNX1VQTUIJCU1DUl9VTSgxKQorCisjZGVmaW5lIE1DUl9NQih4KQkJKCh1bnNpZ25lZCBsb25nKSgoeCkgJiA3KSA8PCAoMzEgLSAxOCkpCisjZGVmaW5lIE1DUl9NQl9NQVNLCQlNQ1JfTUIoNykKKyNkZWZpbmUgTUNSX01CX0NTKHgpCQlNQ1JfTUIoeCkKKworI2RlZmluZSBNQ1JfTUNMRih4KQkJKCh1bnNpZ25lZCBsb25nKSgoeCkgJiAxNSkgPDwgKDMxIC0gMjMpKQorI2RlZmluZSBNQ1JfTUNMRl9NQVNLCQlNQ1JfTUNMRigxNSkKKworbG9uZyBpbnQgaW5pdGRyYW0oaW50IGJvYXJkX3R5cGUpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBtZW1jdGw4eHhfdCAqbWVtY3RsID0gJmltbWFwLT5pbV9tZW1jdGw7CisJbG9uZyBpbnQgc2l6ZTsKKworCXVwbWNvbmZpZyhVUE1BLCAodWludCAqKSBzZHJhbV90YWJsZSwgc2l6ZW9mKHNkcmFtX3RhYmxlKSAvIHNpemVvZih1aW50KSk7CisKKwkvKgorCSAqIFByZWxpbWluYXJ5IHByZXNjYWxlciBmb3IgcmVmcmVzaAorCSAqLworCW1lbWN0bC0+bWVtY19tcHRwciA9IENGR19NUFRQUl8xQktfOEs7CisKKwltZW1jdGwtPm1lbWNfbWFyID0gTUFSX1NEUkFNX0lOSVQ7CS8qIDMyLWJpdCBhZGRyZXNzIHRvIGJlIG91dHB1dCBvbiB0aGUgYWRkcmVzcyBidXMgaWYgQU1YID0gMGIxMSAqLworCisgICAgLyoKKyAgICAgKiBNYXAgY29udHJvbGxlciBiYW5rIDMgdG8gdGhlIFNEUkFNIGJhbmsgYXQgcHJlbGltaW5hcnkgYWRkcmVzcy4KKyAgICAgKi8KKwltZW1jdGwtPm1lbWNfb3IzID0gQ0ZHX09SM19QUkVMSU07CisJbWVtY3RsLT5tZW1jX2JyMyA9IENGR19CUjNfUFJFTElNOworCisJbWVtY3RsLT5tZW1jX21hbXIgPSBDRkdfTUFNUl85Q09MICYgfk1BTVJfUFRBRTsJLyogbm8gcmVmcmVzaCB5ZXQgKi8KKworCXVkZWxheSgyMDApOworCisJLyogcGVyZm9ybSBTRFJBTSBpbml0aWFsaXNhdGlvbiBzZXF1ZW5jZSAqLworCW1lbWN0bC0+bWVtY19tY3IgPSBNQ1JfT1BfUlVOIHwgTUNSX1VNX1VQTUEgfCBNQ1JfTUJfQ1MzIHwgTUNSX01DTEYoMSkgfCBNQ1JfTUFEKDB4M0MpOwkvKiBwcmVjaGFyZ2UgYWxsCQkJKi8KKwl1ZGVsYXkoMSk7CisJbWVtY3RsLT5tZW1jX21jciA9IE1DUl9PUF9SVU4gfCBNQ1JfVU1fVVBNQSB8IE1DUl9NQl9DUzMgfCBNQ1JfTUNMRigwKSB8IE1DUl9NQUQoMHgzMCk7IC8qIHJlZnJlc2ggMTYgdGltZXMoMCkJCSovCisJdWRlbGF5KDEpOworCW1lbWN0bC0+bWVtY19tY3IgPSBNQ1JfT1BfUlVOIHwgTUNSX1VNX1VQTUEgfCBNQ1JfTUJfQ1MzIHwgTUNSX01DTEYoMSkgfCBNQ1JfTUFEKDB4M0UpOwkvKiBleGNlcHRpb24gcHJvZ3JhbSAod3JpdGUgbWFyKSAqLworCXVkZWxheSgxKTsKKworCW1lbWN0bC0+bWVtY19tYW1yIHw9IE1BTVJfUFRBRTsJLyogZW5hYmxlIHJlZnJlc2ggKi8KKworCXVkZWxheSgxMDAwKTsKKworCW1lbWN0bC0+bWVtY19tYW1yID0gQ0ZHX01BTVJfOUNPTDsKKworCXNpemUgPSBTRFJBTV9NQVhfU0laRTsKKworCXVkZWxheSgxMDAwMCk7CisKKwkvKiBkbyB0aGUgcmFtIHRlc3QgKi8KKwl7CisJCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKnJwOworCQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHY7CisKKwkJLyogZmlyc3QgZmlsbCAqLworCQlmb3IgKHJwID0gKHVuc2lnbmVkIGxvbmcgKikwOyBycCA8ICh1bnNpZ25lZCBsb25nICopU0RSQU1fTUFYX1NJWkU7ICkKKwkJICAgICpycCsrID0gKHVuc2lnbmVkIGxvbmcpcnA7CisKKwkJLyogbm93IGNoZWNrICovCisJCWZvciAocnAgPSAodW5zaWduZWQgbG9uZyAqKTA7IHJwIDwgKHVuc2lnbmVkIGxvbmcgKilTRFJBTV9NQVhfU0laRTsgcnArKykgeworCQkgICAgaWYgKCh2ID0gKnJwKSAhPSAodW5zaWduZWQgbG9uZylycCkgeworCQkJcHJpbnRmKCJFUlJPUiBhdCAweCVseCAoMHglbHgpXG4iLCAodW5zaWduZWQgbG9uZylycCwgdik7CisJCQlyZXR1cm4gLTE7CisJCSAgICB9CisJCX0KKworCX0KKworCXJldHVybiAoc2l6ZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IG1pc2NfaW5pdF9yKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGJpdHMgdGhhdCBjYW4gaGF2ZSBhIHNwZWNpYWwgcHVycG9zZSBvciBjYW4gYmUgY29uZmlndXJlZCBhcyBpbnB1dHMvb3V0cHV0cyAqLworI2RlZmluZSBQQV9NQVNLCQkoX0JXUig0LCA5KSB8IF9CV1IoMTIsIDE1KSkKKyNkZWZpbmUgUEFfT0RSX01BU0sJKF9CVyg5KSB8IF9CVygxMikgfCBfQlcoMTQpKQorI2RlZmluZSBQQV9PRFJfVkFMCTAKKyNkZWZpbmUgUEFfR1BfSU5NQVNLCTAKKyNkZWZpbmUgUEFfR1BfT1VUTUFTSwkoX0JXKDUpIHwgX0JXKDE0KSB8IF9CVygxNSkpCisjZGVmaW5lIFBBX1NQX09VVE1BU0sJMAorI2RlZmluZSBQQV9HUF9PVVRWQUwJX0JXKDUpCisjZGVmaW5lIFBBX1NQX09VVFZBTAkwCisKKyNkZWZpbmUgUEJfTUFTSwkJKF9CUigxNiwgMTkpIHwgX0JSKDIyLCAzMSkpCisjZGVmaW5lIFBCX09EUl9NQVNLCVBCX01BU0sKKyNkZWZpbmUgUEJfT0RSX1ZBTAkwCisjZGVmaW5lIFBCX0dQX0lOTUFTSwkwCisjZGVmaW5lIFBCX0dQX09VVE1BU0sJKF9CUigxNiwgMTkpIHwgX0JSKDI2LCAyNykgfCBfQigzMSkpCisjZGVmaW5lIFBCX1NQX09VVE1BU0sJX0JSKDI4LCAzMCkKKyNkZWZpbmUgUEJfU1BfT1VUVkFMCV9CUigyOCwgMzApCisjZGVmaW5lIFBCX0dQX09VVFZBTAkoX0JSKDE2LCAxOSkgfCBfQlIoMjYsIDI3KSB8IF9CKDMxKSkKKworI2RlZmluZSBQQ19NQVNLCQlfQldSKDQsIDE1KQorI2RlZmluZSBQQ19TT19NQVNLCShfQldSKDYsIDExKSB8IF9CV1IoMTQsIDE1KSkKKyNkZWZpbmUgUENfU09fVkFMCTAKKyNkZWZpbmUgUENfSU5UX01BU0sJUENfTUFTSworI2RlZmluZSBQQ19JTlRfVkFMCTAKKyNkZWZpbmUgUENfR1BfSU5NQVNLCShfQldSKDUsIDcpIHwgX0JXUig5LCAxMCkgfCBfQlcoMTMpKQorI2RlZmluZSBQQ19HUF9PVVRNQVNLCV9CVygxMikKKyNkZWZpbmUgUENfU1BfT1VUTUFTSwkwCisjZGVmaW5lIFBDX1NQX09VVFZBTAlfQlcoMTIpCisjZGVmaW5lIFBDX0dQX09VVFZBTAkwCisKKyNkZWZpbmUgUERfTUFTSwkJX0JXUigwLCAxNSkKKyNkZWZpbmUgUERfR1BfSU5NQVNLCTAKKyNkZWZpbmUgUERfR1BfT1VUTUFTSwlfQldSKDMsIDE1KQorI2RlZmluZSBQRF9TUF9PVVRNQVNLCTAKKyNkZWZpbmUgUERfR1BfT1VUVkFMCShfQlcoMykgfCBfQlcoNSkgfCBfQlcoNykgfCBfQldSKDgsIDE1KSkKKyNkZWZpbmUgUERfU1BfT1VUVkFMCTAKKworaW50IGJvYXJkX3ByZV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXIgdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwlyZWdpc3RlciB2b2xhdGlsZSBpb3A4eHhfdCAqaW9wb3J0ID0gJmltbWFwLT5pbV9pb3BvcnQ7CisJcmVnaXN0ZXIgdm9sYXRpbGUgY3BtOHh4X3QgKmNwbSA9ICZpbW1hcC0+aW1fY3BtOworCisJaW9wb3J0LT5pb3BfcGFkYXQgPSAoaW9wb3J0LT5pb3BfcGFkYXQgJiB+UEFfTUFTSykgICAgIHwgUEFfU1BfT1VUVkFMIHwgUEFfR1BfT1VUVkFMOworCWlvcG9ydC0+aW9wX3Bhb2RyID0gKGlvcG9ydC0+aW9wX3Bhb2RyICYgflBBX09EUl9NQVNLKSB8IFBBX09EUl9WQUw7CisJaW9wb3J0LT5pb3BfcGFkaXIgPSAoaW9wb3J0LT5pb3BfcGFkaXIgJiB+UEFfR1BfSU5NQVNLKXwgUEFfU1BfT1VUTUFTSyB8IFBBX0dQX09VVE1BU0s7CisJaW9wb3J0LT5pb3BfcGFwYXIgPSAoaW9wb3J0LT5pb3BfcGFwYXIgJiB+KFBBX0dQX0lOTUFTSyAmIFBBX0dQX09VVE1BU0spKTsKKworCWNwbS0+Y3BfcGJkYXQgPSAoaW9wb3J0LT5pb3BfcGFkYXQgJiB+UEJfTUFTSykgICAgIHwgUEJfU1BfT1VUVkFMIHwgUEJfR1BfT1VUVkFMOworCWNwbS0+Y3BfcGJvZHIgPSAoaW9wb3J0LT5pb3BfcGFvZHIgJiB+UEJfT0RSX01BU0spIHwgUEJfT0RSX1ZBTDsKKwljcG0tPmNwX3BiZGlyID0gKGlvcG9ydC0+aW9wX3BhZGlyICYgflBCX0dQX0lOTUFTSyl8IFBCX1NQX09VVE1BU0sgfCBQQl9HUF9PVVRNQVNLOworCWNwbS0+Y3BfcGJwYXIgPSAoaW9wb3J0LT5pb3BfcGFwYXIgJiB+KFBCX0dQX0lOTUFTSyAmIFBCX0dQX09VVE1BU0spKTsKKworCWlvcG9ydC0+aW9wX3BjZGF0ID0gKGlvcG9ydC0+aW9wX3BjZGF0ICYgflBDX01BU0spICAgICB8IFBDX1NQX09VVFZBTCB8IFBDX0dQX09VVFZBTDsKKwlpb3BvcnQtPmlvcF9wY2RpciA9IChpb3BvcnQtPmlvcF9wY2RpciAmIH5QQ19HUF9JTk1BU0spfCBQQ19TUF9PVVRNQVNLIHwgUENfR1BfT1VUTUFTSzsKKwlpb3BvcnQtPmlvcF9wY3NvICA9IChpb3BvcnQtPmlvcF9wY3NvICAmIH5QQ19TT19NQVNLKSAgfCBQQ19TT19WQUw7CisJaW9wb3J0LT5pb3BfcGNpbnQgPSAoaW9wb3J0LT5pb3BfcGNpbnQgJiB+UENfSU5UX01BU0spIHwgUENfSU5UX1ZBTDsKKwlpb3BvcnQtPmlvcF9wY3BhciA9IChpb3BvcnQtPmlvcF9wY3BhciAmIH4oUENfR1BfSU5NQVNLICYgUENfR1BfT1VUTUFTSykpOworCisJaW9wb3J0LT5pb3BfcGRkYXQgPSAoaW9wb3J0LT5pb3BfcGRkYXQgJiB+UERfTUFTSykgICAgIHwgUERfU1BfT1VUVkFMIHwgUERfR1BfT1VUVkFMOworCWlvcG9ydC0+aW9wX3BkZGlyID0gKGlvcG9ydC0+aW9wX3BkZGlyICYgflBEX0dQX0lOTUFTSyl8IFBEX1NQX09VVE1BU0sgfCBQRF9HUF9PVVRNQVNLOworCWlvcG9ydC0+aW9wX3BkcGFyID0gKGlvcG9ydC0+aW9wX3BkcGFyICYgfihQRF9HUF9JTk1BU0sgJiBQRF9HUF9PVVRNQVNLKSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0dmlhL3UtYm9vdC5sZHMgYi9ib2FyZC9uZXR2aWEvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzVmMTJjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbmV0dmlhL3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOworLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAJCTogeyAqKC5pbnRlcnApCQl9CisgIC5oYXNoICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgIDogeyAqKC5yZWwudGV4dCkJfQorICAucmVsYS50ZXh0ICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgOiB7ICooLnJlbC5kYXRhKQl9CisgIC5yZWxhLmRhdGEgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICA6IHsgKigucmVsYS5yb2RhdGEpCX0KKyAgLnJlbC5nb3QgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICA6IHsgKigucmVsYS5nb3QpCX0KKyAgLnJlbC5jdG9ycyAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICA6IHsgKigucmVsYS5ic3MpCX0KKyAgLnJlbC5wbHQgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICA6IHsgKigucmVsYS5wbHQpCX0KKyAgLmluaXQgICAgICAgICA6IHsgKiguaW5pdCkJCX0KKyAgLnBsdAkJCTogeyAqKC5wbHQpIAkJfQorICAudGV4dCAgICAgIAk6CisgIHsKKyAgICBjcHUvbXBjOHh4L3N0YXJ0Lm8JCSgudGV4dCkKKyAgICBjcHUvbXBjOHh4L3RyYXBzLm8JCSgudGV4dCkKKyAgICBjb21tb24vZGxtYWxsb2MubwkJKC50ZXh0KQorICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JCSgudGV4dCkKKyAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKKyAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCisgICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCisgICAgbGliX3BwYy9jYWNoZS5vCQkoLnRleHQpCisgICAgbGliX3BwYy90aW1lLm8JCSgudGV4dCkKKworICAgIC4gPSBlbnZfb2Zmc2V0OworICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vCSgucHBjZW52KQorCisgICAgKigudGV4dCkKKyAgICAqKC5maXh1cCkKKyAgICAqKC5nb3QxKQorICB9CisgIF9ldGV4dCA9IC47CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgOgorICB7CisgICAgKigucm9kYXRhKQorICAgICooLnJvZGF0YTEpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+MjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKT4+MjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL25ldHZpYS91LWJvb3QubGRzLmRlYnVnIGIvYm9hcmQvbmV0dmlhL3UtYm9vdC5sZHMuZGVidWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0OTRmYgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHZpYS91LWJvb3QubGRzLmRlYnVnCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/CisgICBfX0RZTkFNSUMgPSAwOyAgICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbgkqLworICAgIC8qIHRoZSBzZWN0b3IgbGF5b3V0IG9mIG91ciBmbGFzaCBjaGlwcyEJWFhYIEZJWE1FIFhYWAkqLworCisgICAgY3B1L21wYzh4eC9zdGFydC5vCQkoLnRleHQpCisgICAgY29tbW9uL2RsbWFsbG9jLm8JCSgudGV4dCkKKyAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKKyAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCisKKyAgICAuID0gZW52X29mZnNldDsKKyAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkKKworICAgICooLnRleHQpCisgICAgKiguZml4dXApCisgICAgKiguZ290MSkKKyAgfQorICBfZXRleHQgPSAuOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgIDoKKyAgeworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PjI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXyk+PjI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvb3hjL2ZsYXNoLmMgYi9ib2FyZC9veGMvZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjAyMjBlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvb3hjL2ZsYXNoLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBGbGFzaCBSb3V0aW5lcyBmb3IgU1RNMjlXMzIwREIvU1RNMjlXODAwRCBmbGFzaCBjaGlwcworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4eHguaD4KKworZmxhc2hfaW5mb190CWZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107IC8qIGluZm8gZm9yIEZMQVNIIGNoaXBzCSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZSAodnVfY2hhciAqYWRkciwgZmxhc2hfaW5mb190ICppbmZvKTsKK3N0YXRpYyBpbnQgd3JpdGVfYnl0ZSAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1Y2hhciBkYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3Vuc2lnbmVkIGxvbmcgZmxhc2hfaW5pdCAodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICAgaW50IGk7CisKKyAgICAvKiBJbml0OiBubyBGTEFTSGVzIGtub3duICovCisgICAgZm9yIChpPTA7IGk8Q0ZHX01BWF9GTEFTSF9CQU5LUzsgKytpKSB7CisJZmxhc2hfaW5mb1tpXS5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXZSB1c2UgdGhlIGZvbGxvd2luZyB0cmljayBoZXJlOiBzaW5jZSBmbGFzaCBpcyBjeWNsaWNhbGx5CisgICAgICogbWFwcGVkIGluIHRoZSAweEZGODAwMDAwLTB4RkZGRkZGRkYgYXJlYSwgd2UgZGV0ZWN0IHRoZSB0eXBlCisgICAgICogYW5kIHRoZSBzaXplIG9mIGZsYXNoIHVzaW5nIDB4RkY4MDAwMDAgYXMgdGhlIGJhc2UgYWRkcmVzcywKKyAgICAgKiBhbmQgdGhlbiBjYWxsIGZsYXNoX2dldF9zaXplKCkgYWdhaW4gdG8gZmlsbCBmbGFzaF9pbmZvLgorICAgICAqLworICAgIHNpemUgPSBmbGFzaF9nZXRfc2l6ZSgodnVfY2hhciAqKUNGR19GTEFTSF9QUkVMSU1CQVNFLCAmZmxhc2hfaW5mb1swXSk7CisgICAgaWYgKHNpemUpCisgICAgeworCWZsYXNoX2dldF9zaXplKCh2dV9jaGFyICopKC1zaXplKSwgJmZsYXNoX2luZm9bMF0pOworICAgIH0KKworI2lmIChDRkdfTU9OSVRPUl9CQVNFID49IENGR19GTEFTSF9QUkVMSU1CQVNFKQorICAgIC8qIG1vbml0b3IgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisgICAgZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkgIENGR19NT05JVE9SX0JBU0UsCisJCSAgQ0ZHX01PTklUT1JfQkFTRStDRkdfTU9OSVRPUl9MRU4tMSwKKwkJICAmZmxhc2hfaW5mb1swXSk7CisjZW5kaWYKKworI2lmIChDRkdfRU5WX0lTX0lOX0ZMQVNIID09IDEpICYmIGRlZmluZWQoQ0ZHX0VOVl9BRERSKQorIyBpZm5kZWYgIENGR19FTlZfU0laRQorIyAgZGVmaW5lIENGR19FTlZfU0laRQlDRkdfRU5WX1NFQ1RfU0laRQorIyBlbmRpZgorICAgIGZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwKKwkJICBDRkdfRU5WX0FERFIsCisJCSAgQ0ZHX0VOVl9BRERSICsgQ0ZHX0VOVl9TSVpFIC0gMSwKKwkJICAmZmxhc2hfaW5mb1swXSk7CisjZW5kaWYKKworICAgIHJldHVybiAoc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBmbGFzaF9wcmludF9pbmZvICAoZmxhc2hfaW5mb190ICppbmZvKQoreworICAgIGludCBpOworCisgICAgaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwlwcmludGYgKCJtaXNzaW5nIG9yIHVua25vd24gRkxBU0ggdHlwZVxuIik7CisJcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgeworICAgIGNhc2UgRkxBU0hfTUFOX1NUTToKKwlwcmludGYgKCJTVCAiKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXByaW50ZiAoIlVua25vd24gVmVuZG9yICIpOworCWJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworICAgIGNhc2UgRkxBU0hfU1RNMzIwREI6CisJcHJpbnRmICgiTTI5VzMyMERCICgzMiBNYml0KVxuIik7CisJYnJlYWs7CisgICAgY2FzZSBGTEFTSF9TVE04MDBEQjoKKwlwcmludGYgKCJNMjlXODAwREIgKDggTWJpdCwgYm90dG9tIGJvb3QgYmxvY2spXG4iKTsKKwlicmVhazsKKyAgICBjYXNlIEZMQVNIX1NUTTgwMERUOgorCXByaW50ZiAoIk0yOVc4MDBEVCAoOCBNYml0LCB0b3AgYm9vdCBibG9jaylcbiIpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJcHJpbnRmICgiVW5rbm93biBDaGlwIFR5cGVcbiIpOworCWJyZWFrOworICAgIH0KKworICAgIHByaW50ZiAoIiAgU2l6ZTogJWxkIEtCIGluICVkIFNlY3RvcnNcbiIsCisJICAgIGluZm8tPnNpemUgPj4gMTAsIGluZm8tPnNlY3Rvcl9jb3VudCk7CisKKyAgICBwcmludGYgKCIgIFNlY3RvciBTdGFydCBBZGRyZXNzZXM6Iik7CisgICAgZm9yIChpPTA7IGk8aW5mby0+c2VjdG9yX2NvdW50OyArK2kpIHsKKwlpZiAoKGkgJSA1KSA9PSAwKQorCSAgICBwcmludGYgKCJcbiAgICIpOworCXByaW50ZiAoIiAlMDhsWCVzIiwKKwkJaW5mby0+c3RhcnRbaV0sCisJCWluZm8tPnByb3RlY3RbaV0gPyAiIChSTykiIDogIiAgICAgIgorCQkpOworICAgIH0KKyAgICBwcmludGYgKCJcbiIpOworICAgIHJldHVybjsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBjYW5ub3QgYmUgcnVuIGZyb20gRkxBU0ghCisgKi8KKworc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplICh2dV9jaGFyICphZGRyLCBmbGFzaF9pbmZvX3QgKmluZm8pCit7CisgICAgc2hvcnQgaTsKKyAgICB1Y2hhciB2ZW5kb3IsIGRldmlkOworICAgIHVsb25nIGJhc2UgPSAodWxvbmcpYWRkcjsKKworICAgIC8qIFdyaXRlIGF1dG8gc2VsZWN0IGNvbW1hbmQ6IHJlYWQgTWFudWZhY3R1cmVyIElEICovCisgICAgYWRkclsweDBBQUFdID0gMHhBQTsKKyAgICBhZGRyWzB4MDU1NV0gPSAweDU1OworICAgIGFkZHJbMHgwQUFBXSA9IDB4OTA7CisKKyAgICB1ZGVsYXkoMTAwMCk7CisKKyAgICB2ZW5kb3IgPSBhZGRyWzBdOworICAgIGRldmlkID0gYWRkclsyXTsKKworICAgIC8qIG9ubHkgc3VwcG9ydCBTVE0gKi8KKyAgICBpZiAoKHZlbmRvciA8PCAxNikgIT0gRkxBU0hfTUFOX1NUTSkgeworCXJldHVybiAwOworICAgIH0KKworICAgIGlmIChkZXZpZCA9PSBGTEFTSF9TVE0zMjBEQikgeworICAgIAkvKiBNUEM4MjQwIGNhbiBhZGRyZXNzIG1heGltdW0gMk1iIG9mIGZsYXNoLCB0aGF0IGlzIHdoeSB0aGUgTVNCCisJICogbGVhZCBpcyBncm91bmRlZCBhbmQgd2UgY2FuIGFjY2VzcyBvbmx5IDIgZmlyc3QgTWIgKi8KKwlpbmZvLT5mbGFzaF9pZCAgICAgPSB2ZW5kb3IgPDwgMTYgfCBkZXZpZDsKKwlpbmZvLT5zZWN0b3JfY291bnQgPSAzMjsKKwlpbmZvLT5zaXplICAgICAgICAgPSBpbmZvLT5zZWN0b3JfY291bnQgKiAweDEwMDAwOworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworCSAgICBpbmZvLT5zdGFydFtpXSA9IGJhc2UgKyBpICogMHgxMDAwMDsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKGRldmlkID09IEZMQVNIX1NUTTgwMERCKSB7CisJaW5mby0+Zmxhc2hfaWQgICAgID0gdmVuZG9yIDw8IDE2IHwgZGV2aWQ7CisJaW5mby0+c2VjdG9yX2NvdW50ID0gMTk7CisJaW5mby0+c2l6ZSAgICAgICAgID0gMHgxMDAwMDA7CisJaW5mby0+c3RhcnRbMF0gICAgID0gMHgwMDAwOworCWluZm8tPnN0YXJ0WzFdICAgICA9IDB4NDAwMDsKKwlpbmZvLT5zdGFydFsyXSAgICAgPSAweDYwMDA7CisJaW5mby0+c3RhcnRbM10gICAgID0gMHg4MDAwOworCWZvciAoaSA9IDQ7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworCSAgICBpbmZvLT5zdGFydFtpXSA9IGJhc2UgKyAoaS0zKSAqIDB4MTAwMDA7CisJfQorICAgIH0KKyAgICBlbHNlIGlmIChkZXZpZCA9PSBGTEFTSF9TVE04MDBEVCkgeworCWluZm8tPmZsYXNoX2lkICAgICA9IHZlbmRvciA8PCAxNiB8IGRldmlkOworCWluZm8tPnNlY3Rvcl9jb3VudCA9IDE5OworCWluZm8tPnNpemUgICAgICAgICA9IDB4MTAwMDAwOworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQtNDsgaSsrKSB7CisJICAgIGluZm8tPnN0YXJ0W2ldID0gYmFzZSArIGkgKiAweDEwMDAwOworCX0KKwlpbmZvLT5zdGFydFtpXSAgICAgPSBiYXNlICsgaSAqIDB4MTAwMDA7CisJaW5mby0+c3RhcnRbaSsxXSAgID0gYmFzZSArIGkgKiAweDEwMDAwICsgMHg4MDAwOworCWluZm8tPnN0YXJ0W2krMl0gICA9IGJhc2UgKyBpICogMHgxMDAwMCArIDB4YTAwMDsKKwlpbmZvLT5zdGFydFtpKzNdICAgPSBiYXNlICsgaSAqIDB4MTAwMDAgKyAweGMwMDA7CisgICAgfQorICAgIGVsc2UgeworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIG1hcmsgYWxsIHNlY3RvcnMgYXMgdW5wcm90ZWN0ZWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwlpbmZvLT5wcm90ZWN0W2ldID0gMDsKKyAgICB9CisKKyAgICAvKiBJc3N1ZSB0aGUgcmVzZXQgY29tbWFuZCAqLworICAgIGlmIChpbmZvLT5mbGFzaF9pZCAhPSBGTEFTSF9VTktOT1dOKSB7CisJYWRkclswXSA9IDB4RjA7CS8qIHJlc2V0IGJhbmsgKi8KKyAgICB9CisKKyAgICByZXR1cm4gKGluZm8tPnNpemUpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitpbnQJZmxhc2hfZXJhc2UgKGZsYXNoX2luZm9fdCAqaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCit7CisgICAgdnVfY2hhciAqYWRkciA9ICh2dV9jaGFyICopKGluZm8tPnN0YXJ0WzBdKTsKKyAgICBpbnQgZmxhZywgcHJvdCwgc2VjdCwgbF9zZWN0OworICAgIHVsb25nIHN0YXJ0LCBub3csIGxhc3Q7CisKKyAgICBpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCSAgICBwcmludGYgKCItIG1pc3NpbmdcbiIpOworCX0gZWxzZSB7CisJICAgIHByaW50ZiAoIi0gbm8gc2VjdG9ycyB0byBlcmFzZVxuIik7CisJfQorCXJldHVybiAxOworICAgIH0KKworICAgIHByb3QgPSAwOworICAgIGZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyBzZWN0KyspIHsKKwlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkgeworCSAgICBwcm90Kys7CisJfQorICAgIH0KKworICAgIGlmIChwcm90KSB7CisJcHJpbnRmICgiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyB3aWxsIG5vdCBiZSBlcmFzZWQhXG4iLAorCQlwcm90KTsKKyAgICB9IGVsc2UgeworCXByaW50ZiAoIlxuIik7CisgICAgfQorCisgICAgbF9zZWN0ID0gLTE7CisKKyAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKyAgICBmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICBhZGRyWzB4MEFBQV0gPSAweEFBOworICAgIGFkZHJbMHgwNTU1XSA9IDB4NTU7CisgICAgYWRkclsweDBBQUFdID0gMHg4MDsKKyAgICBhZGRyWzB4MEFBQV0gPSAweEFBOworICAgIGFkZHJbMHgwNTU1XSA9IDB4NTU7CisKKyAgICAvKiB3YWl0IGF0IGxlYXN0IDgwdXMgLSBsZXQncyB3YWl0IDEgbXMgKi8KKyAgICB1ZGVsYXkgKDEwMDApOworCisgICAgLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLworICAgIGZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3Q8PXNfbGFzdDsgc2VjdCsrKSB7CisJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkgewkvKiBub3QgcHJvdGVjdGVkICovCisJICAgIGFkZHIgPSAodnVfY2hhciAqKShpbmZvLT5zdGFydFtzZWN0XSk7CisJICAgIGFkZHJbMF0gPSAweDMwOworCSAgICBsX3NlY3QgPSBzZWN0OworCX0KKyAgICB9CisKKyAgICAvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoZmxhZykKKyAgICAgIGVuYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICAvKiB3YWl0IGF0IGxlYXN0IDgwdXMgLSBsZXQncyB3YWl0IDEgbXMgKi8KKyAgICB1ZGVsYXkgKDEwMDApOworCisgICAgLyoKKyAgICAgKiBXZSB3YWl0IGZvciB0aGUgbGFzdCB0cmlnZ2VyZWQgc2VjdG9yCisgICAgICovCisgICAgaWYgKGxfc2VjdCA8IDApCisgICAgICBnb3RvIERPTkU7CisKKyAgICBzdGFydCA9IGdldF90aW1lciAoMCk7CisgICAgbGFzdCAgPSBzdGFydDsKKyAgICBhZGRyID0gKHZ1X2NoYXIgKikoaW5mby0+c3RhcnRbbF9zZWN0XSk7CisgICAgd2hpbGUgKChhZGRyWzBdICYgMHg4MCkgIT0gMHg4MCkgeworCWlmICgobm93ID0gZ2V0X3RpbWVyKHN0YXJ0KSkgPiBDRkdfRkxBU0hfRVJBU0VfVE9VVCkgeworCSAgICBwcmludGYgKCJUaW1lb3V0XG4iKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCS8qIHNob3cgdGhhdCB3ZSdyZSB3YWl0aW5nICovCisJaWYgKChub3cgLSBsYXN0KSA+IDEwMDApIHsJLyogZXZlcnkgc2Vjb25kICovCisJICAgIHNlcmlhbF9wdXRjICgnLicpOworCSAgICBsYXN0ID0gbm93OworCX0KKyAgICB9CisKKyAgICBET05FOgorICAgIC8qIHJlc2V0IHRvIHJlYWQgbW9kZSAqLworICAgIGFkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKWluZm8tPnN0YXJ0WzBdOworICAgIGFkZHJbMF0gPSAweEYwOwkvKiByZXNldCBiYW5rICovCisKKyAgICBwcmludGYgKCIgZG9uZVxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHkgbWVtb3J5IHRvIGZsYXNoLCByZXR1cm5zOgorICogMCAtIE9LCisgKiAxIC0gd3JpdGUgdGltZW91dAorICogMiAtIEZsYXNoIG5vdCBlcmFzZWQKKyAqLworCitpbnQgd3JpdGVfYnVmZiAoZmxhc2hfaW5mb190ICppbmZvLCB1Y2hhciAqc3JjLCB1bG9uZyBhZGRyLCB1bG9uZyBjbnQpCit7CisgICAgaW50IHJjOworCisgICAgd2hpbGUgKGNudCA+IDApIHsKKwlpZiAoKHJjID0gd3JpdGVfYnl0ZShpbmZvLCBhZGRyLCAqc3JjKSkgIT0gMCkgeworCSAgICByZXR1cm4gKHJjKTsKKwl9CisJYWRkcisrOworCXNyYysrOworCWNudC0tOworICAgIH0KKworICAgIHJldHVybiAoMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyaXRlIGEgYnl0ZSB0byBGbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfYnl0ZSAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1Y2hhciBkYXRhKQoreworICAgIHZ1X2NoYXIgKmFkZHIgPSAodnVfY2hhciAqKShpbmZvLT5zdGFydFswXSk7CisgICAgdWxvbmcgc3RhcnQ7CisgICAgaW50IGZsYWc7CisKKyAgICAvKiBDaGVjayBpZiBGbGFzaCBpcyAoc3VmZmljaWVudGx5KSBlcmFzZWQgKi8KKyAgICBpZiAoKCooKHZ1X2NoYXIgKilkZXN0KSAmIGRhdGEpICE9IGRhdGEpIHsKKwlyZXR1cm4gKDIpOworICAgIH0KKyAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKyAgICBmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICBhZGRyWzB4MEFBQV0gPSAweEFBOworICAgIGFkZHJbMHgwNTU1XSA9IDB4NTU7CisgICAgYWRkclsweDBBQUFdID0gMHhBMDsKKworICAgICooKHZ1X2NoYXIgKilkZXN0KSA9IGRhdGE7CisKKyAgICAvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoZmxhZykKKyAgICAgIGVuYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICAvKiBkYXRhIHBvbGxpbmcgZm9yIEQ3ICovCisgICAgc3RhcnQgPSBnZXRfdGltZXIgKDApOworICAgIHdoaWxlICgoKigodnVfY2hhciAqKWRlc3QpICYgMHg4MCkgIT0gKGRhdGEgJiAweDgwKSkgeworCWlmIChnZXRfdGltZXIoc3RhcnQpID4gQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQpIHsKKwkgICAgcmV0dXJuICgxKTsKKwl9CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvb3hjL294Yy5jIGIvYm9hcmQvb3hjL294Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2VkODQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9veGMvb3hjLmMKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFJvYiBUYXlsb3IsIEZseWluZyBQaWcgU3lzdGVtcy4gcm9idEBmbHlpbmdwaWcuY29tLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4MjR4Lmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8aTJjLmg+CisKK2ludCBjaGVja2JvYXJkICh2b2lkKQoreworCXB1dHMgKAkiQm9hcmQ6IE9YQzgyNDBcbiIgKTsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBpbnQgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQoreworI2lmbmRlZiBDRkdfUkFNQk9PVAorCWludAkJIGksIGNudDsKKwl2b2xhdGlsZSB1Y2hhciAqIGJhc2U9IENGR19TRFJBTV9CQVNFOworCXZvbGF0aWxlIHVsb25nICogYWRkcjsKKwl1bG9uZwkJIHNhdmVbMzJdOworCXVsb25nCQkgdmFsLCByZXQgID0gMDsKKworCWZvciAoaT0wLCBjbnQ9KENGR19NQVhfUkFNX1NJWkUgLyBzaXplb2YobG9uZykpID4+IDE7IGNudCA+IDA7IGNudCA+Pj0gMSkgeworCQlhZGRyID0gKHZvbGF0aWxlIHVsb25nICopYmFzZSArIGNudDsKKwkJc2F2ZVtpKytdID0gKmFkZHI7CisJCSphZGRyID0gfmNudDsKKwl9CisKKwlhZGRyID0gKHZvbGF0aWxlIHVsb25nICopYmFzZTsKKwlzYXZlW2ldID0gKmFkZHI7CisJKmFkZHIgPSAwOworCisJaWYgKCphZGRyICE9IDApIHsKKwkJKmFkZHIgPSBzYXZlW2ldOworCQlnb3RvIERvbmU7CisJfQorCisJZm9yIChjbnQgPSAxOyBjbnQgPD0gQ0ZHX01BWF9SQU1fU0laRSAvIHNpemVvZihsb25nKTsgY250IDw8PSAxKSB7CisJCWFkZHIgPSAodm9sYXRpbGUgdWxvbmcgKiliYXNlICsgY250OworCQl2YWwgPSAqYWRkcjsKKwkJKmFkZHIgPSBzYXZlWy0taV07CisJCWlmICh2YWwgIT0gfmNudCkgeworCQkJdWxvbmcgbmV3X2JhbmswX2VuZCA9IGNudCAqIHNpemVvZihsb25nKSAtIDE7CisJCQl1bG9uZyBtZWFyMSAgPSBtcGM4MjR4X21wYzEwN19nZXRyZWcoTUVBUjEpOworCQkJdWxvbmcgZW1lYXIxID0gbXBjODI0eF9tcGMxMDdfZ2V0cmVnKEVNRUFSMSk7CisJCQltZWFyMSA9ICAobWVhcjEgICYgMHhGRkZGRkYwMCkgfAorCQkJKChuZXdfYmFuazBfZW5kICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfQUREUl9TSElGVCk7CisJCQllbWVhcjEgPSAoZW1lYXIxICYgMHhGRkZGRkYwMCkgfAorCQkJKChuZXdfYmFuazBfZW5kICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpOworCQkJbXBjODI0eF9tcGMxMDdfc2V0cmVnKE1FQVIxLCAgbWVhcjEpOworCQkJbXBjODI0eF9tcGMxMDdfc2V0cmVnKEVNRUFSMSwgZW1lYXIxKTsKKworCQkJcmV0ID0gY250ICogc2l6ZW9mKGxvbmcpOworCQkJZ290byBEb25lOworCQl9CisJfQorCisJcmV0ID0gQ0ZHX01BWF9SQU1fU0laRTsKK0RvbmU6CisJcmV0dXJuIHJldDsKKyNlbHNlCisJLyogaWYgVS1Cb290IHN0YXJ0cyBmcm9tIFJBTSwgdGhlbiBzdXBwb3NlIHdlIGhhdmUgMTZNYiBvZiBSQU0gKi8KKwlyZXR1cm4gKDE2IDw8IDIwKTsKKyNlbmRpZgorfQorCisvKgorICogSW5pdGlhbGl6ZSBQQ0kgRGV2aWNlcywgcmVwb3J0IGRldmljZXMgZm91bmQuCisgKi8KKyNpZm5kZWYgQ09ORklHX1BDSV9QTlAKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBwY2lfb3hjX2NvbmZpZ190YWJsZVtdID0geworCXsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMHgxNCwgUENJX0FOWV9JRCwKKwkgIHBjaV9jZmdmdW5jX2NvbmZpZ19kZXZpY2UsIHsgUENJX0VORVQwX0lPQUREUiwKKwkJCQkgICAgICAgUENJX0VORVQwX01FTUFERFIsCisJCQkJICAgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUiB9fSwKKwl7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB4MTUsIFBDSV9BTllfSUQsCisJICBwY2lfY2ZnZnVuY19jb25maWdfZGV2aWNlLCB7IFBDSV9FTkVUMV9JT0FERFIsCisJCQkJICAgICAgIFBDSV9FTkVUMV9NRU1BRERSLAorCQkJCSAgICAgICBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIgfX0sCisJeyB9Cit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZSA9IHsKKyNpZm5kZWYgQ09ORklHX1BDSV9QTlAKKwljb25maWdfdGFibGU6IHBjaV9veGNfY29uZmlnX3RhYmxlLAorI2VuZGlmCit9OworCit2b2lkIHBjaV9pbml0ICh2b2lkKQoreworCXBjaV9tcGM4MjR4X2luaXQoJmhvc2UpOworfQorCitpbnQgYm9hcmRfcHJlX2luaXQgKHZvaWQpCit7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKENGR19DUExEX1JFU0VUKSA9IDB4ODk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfV0FUQ0hET0cKK3ZvaWQgb3hjX3dkdF9yZXNldCh2b2lkKQoreworCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShDRkdfQ1BMRF9XQVRDSERPRykgPSAweGZmOworfQorCit2b2lkIHdhdGNoZG9nX3Jlc2V0KHZvaWQpCit7CisJaW50IHJlX2VuYWJsZSA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisJb3hjX3dkdF9yZXNldCgpOworCWlmIChyZV9lbmFibGUpCisJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBveGNfZ2V0X2V4cGFuZGVyKHVuc2lnbmVkIGNoYXIgYWRkciwgdW5zaWduZWQgY2hhciAqIHZhbCkKK3sKKwlyZXR1cm4gaTJjX3JlYWQoYWRkciwgMCwgMCwgdmFsLCAxKTsKK30KKworc3RhdGljIGludCBveGNfc2V0X2V4cGFuZGVyKHVuc2lnbmVkIGNoYXIgYWRkciwgdW5zaWduZWQgY2hhciB2YWwpCit7CisJcmV0dXJuIGkyY193cml0ZShhZGRyLCAwLCAwLCAmdmFsLCAxKTsKK30KKworc3RhdGljIGludCBleHBhbmRlcjBhbGl2ZSA9IDA7CisKKyNpZmRlZiBDT05GSUdfU0hPV19BQ1RJVklUWQorc3RhdGljIGludCBsZWR0b2dnbGUgPSAwOworc3RhdGljIGludCBsZWRzdGF0dXMgPSAxOworCit2b2lkIG94Y190b2dnbGVfYWN0aXZlbGVkKHZvaWQpCit7CisJbGVkdG9nZ2xlKys7Cit9CisKK3ZvaWQgc2hvd19hY3Rpdml0eShpbnQgYXJnKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxlZCA9IDA7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlpZiAoIWV4cGFuZGVyMGFsaXZlKSByZXR1cm47CisKKwlpZiAoKGxlZHRvZ2dsZSA+ICgyICogYXJnKSkgJiYgbGVkc3RhdHVzKSB7CisJCWxlZCBePSAweDgwOworCQlveGNfZ2V0X2V4cGFuZGVyKENGR19JMkNfRVhQQU5ERVIwX0FERFIsICZ2YWwpOworCQl1ZGVsYXkoMjAwKTsKKwkJb3hjX3NldF9leHBhbmRlcihDRkdfSTJDX0VYUEFOREVSMF9BRERSLCAodmFsICYgMHg3RikgfCBsZWQpOworCQlsZWR0b2dnbGUgPSAwOworCX0KK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwordm9pZCBzaG93X2Jvb3RfcHJvZ3Jlc3MoaW50IGFyZykKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCWlmICghZXhwYW5kZXIwYWxpdmUpIHJldHVybjsKKworCWlmIChhcmcgPiAwICYmIGxlZHN0YXR1cykgeworCQlsZWRzdGF0dXMgPSAwOworCQlveGNfZ2V0X2V4cGFuZGVyKENGR19JMkNfRVhQQU5ERVIwX0FERFIsICZ2YWwpOworCQl1ZGVsYXkoMjAwKTsKKwkJb3hjX3NldF9leHBhbmRlcihDRkdfSTJDX0VYUEFOREVSMF9BRERSLCB2YWwgfCAweDgwKTsKKwl9IGVsc2UgaWYgKGFyZyA8IDApIHsKKwkJb3hjX2dldF9leHBhbmRlcihDRkdfSTJDX0VYUEFOREVSMF9BRERSLCAmdmFsKTsKKwkJdWRlbGF5KDIwMCk7CisJCW94Y19zZXRfZXhwYW5kZXIoQ0ZHX0kyQ19FWFBBTkRFUjBfQUREUiwgdmFsICYgMHg3Rik7CisJCWxlZHN0YXR1cyA9IDE7CisJfQorfQorI2VuZGlmCisKK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwkvKiBjaGVjayB3aGV0aGVyIHRoZSBpMmMgZXhwYW5kZXIgIzAgaXMgYWNjZXNzaWJsZSAqLworCWlmICghb3hjX3NldF9leHBhbmRlcihDRkdfSTJDX0VYUEFOREVSMF9BRERSLCAweDdGKSkgeworCQl1ZGVsYXkoMjAwKTsKKwkJZXhwYW5kZXIwYWxpdmUgPSAxOworCX0KKworI2lmZGVmIENGR19PWENfR0VORVJBVEVfSVAKKwl7CisJCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJCWNoYXIgc3RyWzMyXTsKKwkJdW5zaWduZWQgbG9uZyBpcCA9IENGR19PWENfSVBNQVNLOworCQliZF90ICpiZCA9IGdkLT5iZDsKKworCQlpZiAoZXhwYW5kZXIwYWxpdmUpIHsKKwkJCXVuc2lnbmVkIGNoYXIgdmFsOworCisJCQlpZiAoIW94Y19nZXRfZXhwYW5kZXIoQ0ZHX0kyQ19FWFBBTkRFUjBfQUREUiwgJnZhbCkpIHsKKwkJCQlpcCA9IChpcCAmIDB4ZmZmZmZmMDApIHwgKCh2YWwgJiAweDdjKSA+PiAyKTsKKwkJCX0KKwkJfQorCisJCWlmICgoaXAgJiAweGZmKSA8IDMpIHsKKwkJCS8qIGlmIGZhaWwsIHNldCB4LngueC4yNTQgKi8KKwkJCWlwID0gKGlwICYgMHhmZmZmZmYwMCkgfCAweGZlOworCQl9CisKKwkJYmQtPmJpX2lwX2FkZHIgPSBpcDsKKwkJc3ByaW50ZihzdHIsICIlbGQuJWxkLiVsZC4lbGQiLAorCQkJKGJkLT5iaV9pcF9hZGRyICYgMHhmZjAwMDAwMCkgPj4gMjQsCisJCQkoYmQtPmJpX2lwX2FkZHIgJiAweDAwZmYwMDAwKSA+PiAxNiwKKwkJCShiZC0+YmlfaXBfYWRkciAmIDB4MDAwMGZmMDApID4+IDgsCisJCQkoYmQtPmJpX2lwX2FkZHIgJiAweDAwMDAwMGZmKSk7CisJCXNldGVudigiaXBhZGRyIiwgc3RyKTsKKwkJcHJpbnRmKCJpcDogICAgJXNcbiIsIHN0cik7CisJfQorI2VuZGlmCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3BjaXBwYzIvY3BjNzEwX2luaXRfcmFtLmMgYi9ib2FyZC9wY2lwcGMyL2NwYzcxMF9pbml0X3JhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZWQ4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9wY2lwcGMyL2NwYzcxMF9pbml0X3JhbS5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInBjaXBwYzIuaCIKKyNpbmNsdWRlICJpMmMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY3BjNzEwX21lbV9vcmdfcworeworICB1OAkJcm93czsKKyAgdTgJCWNvbHM7CisgIHU4CQliYW5rczI7CisgIHU4CQlvcmc7Cit9IGNwYzcxMF9tZW1fb3JnX3Q7CisKK3N0YXRpYyBpbnQJCWNwYzcxMF9jb21wdXRlX21jZXIJKHUzMiAqCQltY2VyLAorCQkJCQkJIHVuc2lnbmVkIGxvbmcgKgorCQkJCQkJCQlzaXplLAorCQkJCQkJIHVuc2lnbmVkIGludAlzZHJhbSk7CitzdGF0aWMgaW50CQljcGM3MTBfZWVwcm9tX2NoZWNrc3VtCSh1bnNpZ25lZCBpbnQJc2RyYW0pOworc3RhdGljIHU4CQljcGM3MTBfZWVwcm9tX3JlYWQJKHVuc2lnbmVkIGludAlzZHJhbSwKKwkJCQkJCSB1bnNpZ25lZCBpbnQJb2Zmc2V0KTsKKworc3RhdGljIHUzMgkJY3BjNzEwX21jZXJfbWVtIFtdID0KK3sKKyAgMHgwMDAwMDNmMywJLyogMTggbGluZXMsICAgIDQgTWIgKi8KKyAgMHgwMDAwMDNlMywJLyogMTkgbGluZXMsICAgIDggTWIgKi8KKyAgMHgwMDAwMDNjMywJLyogMjAgbGluZXMsICAgMTYgTWIgKi8KKyAgMHgwMDAwMDM4MywJLyogMjEgbGluZXMsICAgMzIgTWIgKi8KKyAgMHgwMDAwMDMwMywJLyogMjIgbGluZXMsICAgNjQgTWIgKi8KKyAgMHgwMDAwMDIwMywJLyogMjMgbGluZXMsICAxMjggTWIgKi8KKyAgMHgwMDAwMDAwMywJLyogMjQgbGluZXMsICAyNTYgTWIgKi8KKyAgMHgwMDAwMDAwMiwJLyogMjUgbGluZXMsICA1MTIgTWIgKi8KKyAgMHgwMDAwMDAwMQkvKiAyNiBsaW5lcywgMTAyNCBNYiAqLworfTsKK3N0YXRpYyBjcGM3MTBfbWVtX29yZ190CWNwYzcxMF9tZW1fb3JnIFtdID0KK3sKKyAgeyAweDBjLCAweDA5LCAweDAyLCAweDAwIH0sCS8qIDAwMDA6IDEyLyA5LzIgKi8KKyAgeyAweDBkLCAweDA5LCAweDAyLCAweDAwIH0sCS8qIDAwMDA6IDEzLyA5LzIgKi8KKyAgeyAweDBkLCAweDBhLCAweDAyLCAweDAwIH0sCS8qIDAwMDA6IDEzLzEwLzIgKi8KKyAgeyAweDBkLCAweDBiLCAweDAyLCAweDAwIH0sCS8qIDAwMDA6IDEzLzExLzIgKi8KKyAgeyAweDBkLCAweDBjLCAweDAyLCAweDAwIH0sCS8qIDAwMDA6IDEzLzEyLzIgKi8KKyAgeyAweDBlLCAweDBjLCAweDAyLCAweDAwIH0sCS8qIDAwMDA6IDE0LzEyLzIgKi8KKyAgeyAweDBiLCAweDA4LCAweDAyLCAweDAxIH0sCS8qIDAwMDE6IDExLyA4LzIgKi8KKyAgeyAweDBiLCAweDA5LCAweDAxLCAweDAyIH0sCS8qIDAwMTA6IDExLyA5LzEgKi8KKyAgeyAweDBiLCAweDBhLCAweDAxLCAweDAzIH0sCS8qIDAwMTE6IDExLzEwLzEgKi8KKyAgeyAweDBjLCAweDA4LCAweDAyLCAweDA0IH0sCS8qIDAxMDA6IDEyLyA4LzIgKi8KKyAgeyAweDBjLCAweDBhLCAweDAyLCAweDA1IH0sCS8qIDAxMDE6IDEyLzEwLzIgKi8KKyAgeyAweDBkLCAweDA4LCAweDAxLCAweDA2IH0sCS8qIDAxMTA6IDEzLyA4LzEgKi8KKyAgeyAweDBkLCAweDA4LCAweDAyLCAweDA3IH0sCS8qIDAxMTE6IDEzLyA4LzIgKi8KKyAgeyAweDBkLCAweDA5LCAweDAxLCAweDA4IH0sCS8qIDEwMDA6IDEzLyA5LzEgKi8KKyAgeyAweDBkLCAweDBhLCAweDAxLCAweDA5IH0sCS8qIDEwMDE6IDEzLzEwLzEgKi8KKyAgeyAweDBiLCAweDA4LCAweDAxLCAweDBhIH0sCS8qIDEwMTA6IDExLyA4LzEgKi8KKyAgeyAweDBjLCAweDA4LCAweDAxLCAweDBiIH0sCS8qIDEwMTE6IDEyLyA4LzEgKi8KKyAgeyAweDBjLCAweDA5LCAweDAxLCAweDBjIH0sCS8qIDExMDA6IDEyLyA5LzEgKi8KKyAgeyAweDBlLCAweDA5LCAweDAyLCAweDBkIH0sCS8qIDExMDE6IDE0LyA5LzIgKi8KKyAgeyAweDBlLCAweDBhLCAweDAyLCAweDBlIH0sCS8qIDExMTA6IDE0LzEwLzIgKi8KKyAgeyAweDBlLCAweDBiLCAweDAyLCAweDBmIH0gCS8qIDExMTE6IDE0LzExLzIgKi8KK307CisKK3Vuc2lnbmVkIGxvbmcgY3BjNzEwX3JhbV9pbml0ICh2b2lkKQoreworICB1bnNpZ25lZCBsb25nIAltZW1zaXplID0gMDsKKyAgdW5zaWduZWQgbG9uZwkJYmFua19zaXplOworICB1MzIJCQltY2VyOworCisjaWZuZGVmIENGR19SQU1CT09UCisgICAgLyogQ2xlYXIgbWVtb3J5IGJhbmtzCisgICAgICovCisgIG91dDMyKFJFRyhTRFJBTTAsIE1DRVIwKSwgMCk7CisgIG91dDMyKFJFRyhTRFJBTTAsIE1DRVIxKSwgMCk7CisgIG91dDMyKFJFRyhTRFJBTTAsIE1DRVIyKSwgMCk7CisgIG91dDMyKFJFRyhTRFJBTTAsIE1DRVIzKSwgMCk7CisgIG91dDMyKFJFRyhTRFJBTTAsIE1DRVI0KSwgMCk7CisgIG91dDMyKFJFRyhTRFJBTTAsIE1DRVI1KSwgMCk7CisgIG91dDMyKFJFRyhTRFJBTTAsIE1DRVI2KSwgMCk7CisgIG91dDMyKFJFRyhTRFJBTTAsIE1DRVI3KSwgMCk7CisgIGlvYmFycmllcl9ydygpOworCisgICAgLyogRGlzYWJsZSBtZW1vcnkKKyAgICAgKi8KKyAgb3V0MzIoUkVHKFNEUkFNMCxNQ0NSKSwgMHgxM2IwNjAwMCk7CisgIGlvYmFycmllcl9ydygpOworI2VuZGlmCisKKyAgICAvKiBPbmx5IHRoZSBmaXJzdCBtZW1vcnkgYmFuayBpcyBpbml0aWFsaXNlZCBub3cKKyAgICAgKi8KKyAgaWYgKCEgY3BjNzEwX2NvbXB1dGVfbWNlcigmIG1jZXIsICYgYmFua19zaXplLCAwKSkKKyAgeworICAgIHB1dHMoIlVuc3VwcG9ydGVkIFNEUkFNIHR5cGUgIVxuIik7CisgICAgaGFuZygpOworICB9CisgIG1lbXNpemUgKz0gYmFua19zaXplOworI2lmbmRlZiBDRkdfUkFNQk9PVAorICAgIC8qIEVuYWJsZSBiYW5rLCB6ZXJvIHN0YXJ0CisgICAgICovCisgIG91dDMyKFJFRyhTRFJBTTAsIE1DRVIwKSwgbWNlciB8IDB4ODAwMDAwMDApOworICBpb2JhcnJpZXJfcncoKTsKKyNlbmRpZgorCisjaWZuZGVmIENGR19SQU1CT09UCisgICAgLyogRW5hYmxlIG1lbW9yeQorICAgICAqLworICBvdXQzMihSRUcoU0RSQU0wLCBNQ0NSKSwgaW4zMihSRUcoU0RSQU0wLCBNQ0NSKSkgfCAweDgwMDAwMDAwKTsKKworICAgIC8qIFdhaXQgdW50aWwgaW5pdGlhbGlzYXRpb24gZmluaXNoZWQKKyAgICAgKi8KKyAgd2hpbGUgKCEgKGluMzIgKFJFRyhTRFJBTTAsIE1DQ1IpKSAmIDB4MjAwMDAwMDApKQorICB7CisgICAgaW9iYXJyaWVyX3J3KCk7CisgIH0KKworICAgIC8qIENsZWFyIE1lbW9yeSBFcnJvciBTdGF0dXMgYW5kIEFkZHJlc3MgcmVnaXN0ZXJzCisgICAgICovCisgIG91dDMyKFJFRyhTRFJBTTAsIE1FU1IpLCAwKTsKKyAgb3V0MzIoUkVHKFNEUkFNMCwgTUVBUiksIDApOworICBpb2JhcnJpZXJfcncoKTsKKworICAgIC8qIEVDQyBpcyBub3QgY29uZmlndXJlZCBub3cKKyAgICAgKi8KKyNlbmRpZgorCisgICAgLyogTWVtb3J5IHNpemUgY291bnRlcgorICAgICAqLworICBvdXQzMihSRUcoQ1BDMCwgUkdCQU4xKSwgbWVtc2l6ZSk7CisKKyAgcmV0dXJuIG1lbXNpemU7Cit9CisKK3N0YXRpYyBpbnQgY3BjNzEwX2NvbXB1dGVfbWNlciAoCisgIHUzMiAqCQkJbWNlciwKKyAgdW5zaWduZWQgbG9uZwkqCXNpemUsCisgIHVuc2lnbmVkIGludAkJc2RyYW0pCit7CisgIHU4CQkJcm93czsKKyAgdTgJCQljb2xzOworICB1OAkJCWJhbmtzMjsKKyAgdW5zaWduZWQgaW50CQlsaW5lczsKKyAgdTMyCQkJbWMgPSAwOworICB1bnNpZ25lZCBpbnQJCWk7CisgIGNwYzcxMF9tZW1fb3JnX3QgKglvcmcgPSAwOworCisKKyAgaWYgKCEgaTJjX3Jlc2V0KCkpCisgIHsKKyAgICBwdXRzKCJDYW4ndCByZXNldCBJMkMhXG4iKTsKKyAgICBoYW5nKCk7CisgIH0KKworICBpZiAoISBjcGM3MTBfZWVwcm9tX2NoZWNrc3VtKHNkcmFtKSkKKyAgeworICAgIHB1dHMoIkludmFsaWQgRUVQUk9NIGNoZWNrc3VtICFcbiIpOworICAgIGhhbmcoKTsKKyAgfQorCisgIHJvd3MgICA9IGNwYzcxMF9lZXByb21fcmVhZChzZHJhbSwgMyk7CisgIGNvbHMgICA9IGNwYzcxMF9lZXByb21fcmVhZChzZHJhbSwgNCk7CisgICAgLyogQ2FuIGJlIDIgb3IgNCBiYW5rczsgZGl2aWRlIGJ5IDIKKyAgICAgKi8KKyAgYmFua3MyID0gY3BjNzEwX2VlcHJvbV9yZWFkKHNkcmFtLCAxNykgLyAyOworCisgIGxpbmVzID0gcm93cyArIGNvbHMgKyBiYW5rczI7CisKKyAgaWYgKGxpbmVzIDwgMTggfHwgbGluZXMgPiAyNikKKyAgeworICAgICAgLyogVW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbgorICAgICAgICovCisgICAgcmV0dXJuIDA7CisgIH0KKworCisgIG1jIHw9IGNwYzcxMF9tY2VyX21lbSBbbGluZXMgLSAxOF0gPDwgNjsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNwYzcxMF9tZW1fb3JnKSAvIHNpemVvZihjcGM3MTBfbWVtX29yZ190KTsgaSsrKQorICB7CisgICAgY3BjNzEwX21lbV9vcmdfdCAqCWNvcmcgPSBjcGM3MTBfbWVtX29yZyArIGk7CisKKyAgICBpZiAoY29yZy0+cm93cyA9PSByb3dzICYmIGNvcmctPmNvbHMgPT0gY29scyAmJiBjb3JnLT5iYW5rczIgPT0gYmFua3MyKQorICAgIHsKKyAgICAgIG9yZyA9IGNvcmc7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICghIG9yZykKKyAgeworICAgICAgLyogVW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbgorICAgICAgICovCisgICAgcmV0dXJuIDA7CisgIH0KKworICBtYyB8PSAodTMyKSBvcmctPm9yZyA8PCAyOworCisgICAgLyogU3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgKm1jZXIgPSBtYzsKKyAgKnNpemUgPSAxbCA8PCAobGluZXMgKyA0KTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjcGM3MTBfZWVwcm9tX2NoZWNrc3VtICgKKyAgdW5zaWduZWQgaW50CQlzZHJhbSkKK3sKKyAgdTgJCQlzdW0gPSAwOworICB1bnNpZ25lZCBpbnQJCWk7CisKKyAgZm9yIChpID0gMDsgaSA8IDYzOyBpKyspCisgIHsKKyAgICBzdW0gKz0gY3BjNzEwX2VlcHJvbV9yZWFkKHNkcmFtLCBpKTsKKyAgfQorCisgIHJldHVybiBzdW0gPT0gY3BjNzEwX2VlcHJvbV9yZWFkKHNkcmFtLCA2Myk7Cit9CisKK3N0YXRpYyB1OCBjcGM3MTBfZWVwcm9tX3JlYWQgKAorICB1bnNpZ25lZCBpbnQJCXNkcmFtLAorICB1bnNpZ25lZCBpbnQJCW9mZnNldCkKK3sKKyAgdTgJCQlkZXYgPSAoc2RyYW0gPDwgMSkgfCAweGEwOworICB1OAkJCWRhdGE7CisKKyAgaWYgKCEgaTJjX3JlYWRfYnl0ZSgmIGRhdGEsIGRldixvZmZzZXQpKQorICB7CisgICAgcHV0cygiSTJDIGVycm9yICFcbiIpOworICAgIGhhbmcoKTsKKyAgfQorCisgIHJldHVybiBkYXRhOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvcGNpcHBjMi9jcGM3MTBfcGNpLmMgYi9ib2FyZC9wY2lwcGMyL2NwYzcxMF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTc1Y2RhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvcGNpcHBjMi9jcGM3MTBfcGNpLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHBjaS5oPgorCisjaW5jbHVkZSAiaGFyZHdhcmUuaCIKKyNpbmNsdWRlICJwY2lwcGMyLmgiCisKK3N0cnVjdCBwY2lfY29udHJvbGxlciBsb2NhbF9ob3NlLCBjcGNpX2hvc2U7CisKK3N0YXRpYyB1MzIJY3BjNzEwX21hcHBlZF9yYW07CisKKyAgLyogRW5hYmxlIFBDSSByZXRyeSB0aW1lb3V0cworICAgKi8KK3ZvaWQgY3BjNzEwX3BjaV9lbmFibGVfdGltZW91dCAodm9pZCkKK3sKKyAgb3V0MzIoQlJJREdFKExPQ0FMLCBDRkdBRERSKSwgMHg1MDAwMDA4MCk7CisgIGlvYmFycmllcl9ydygpOworICBvdXQzMihCUklER0UoTE9DQUwsIENGR0RBVEEpLCAweDMyMDAwMDAwKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisKKyAgb3V0MzIoQlJJREdFKENQQ0ksIENGR0FERFIpLCAweDUwMDAwMTgwKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisgIG91dDMyKEJSSURHRShDUENJLCBDRkdEQVRBKSwgMHgzMjAwMDAwMCk7CisgIGlvYmFycmllcl9ydygpOworfQorCit2b2lkIGNwYzcxMF9wY2lfaW5pdCAodm9pZCkKK3sKKyAgdTMyCQkJc2RyYW1fc2l6ZSA9IHBjaXBwYzJfc2RyYW1fc2l6ZSgpOworCisgIGNwYzcxMF9tYXBwZWRfcmFtID0gc2RyYW1fc2l6ZSA8IFBDSV9NRU1PUllfTUFYU0laRSA/CisgICAgICAgICAgICAgICAgICAgICAgc2RyYW1fc2l6ZSA6IFBDSV9NRU1PUllfTUFYU0laRTsKKworICAgIC8qIFNlbGVjdCB0aGUgbG9jYWwgUENJCisgICAgICovCisgIG91dDMyKFJFRyhDUEMwLCBQQ0lDTkZSKSwgMHg4MDAwMDAwMik7CisgIGlvYmFycmllcl9ydygpOworCisgIG91dDMyKFJFRyhDUEMwLCBQQ0lCQVIpLCBCUklER0VfTE9DQUxfUEhZUyk7CisgIGlvYmFycmllcl9ydygpOworCisgICAgLyogRW5hYmxlIFBDSSBicmlkZ2UgYWRkcmVzcyBkZWNvZGluZworICAgICAqLworICBvdXQzMihSRUcoQ1BDMCwgUENJRU5CKSwgMHg4MDAwMDAwMCk7CisgIGlvYmFycmllcl9ydygpOworCisgICAgLyogU2VsZWN0IHRoZSBDUENJIGJyaWRnZQorICAgICAqLworICBvdXQzMihSRUcoQ1BDMCwgUENJQ05GUiksIDB4ODAwMDAwMDMpOworICBpb2JhcnJpZXJfcncoKTsKKworICBvdXQzMihSRUcoQ1BDMCwgUENJQkFSKSwgQlJJREdFX0NQQ0lfUEhZUyk7CisgIGlvYmFycmllcl9ydygpOworCisgICAgLyogRW5hYmxlIFBDSSBicmlkZ2UgYWRkcmVzcyBkZWNvZGluZworICAgICAqLworICBvdXQzMihSRUcoQ1BDMCwgUENJRU5CKSwgMHg4MDAwMDAwMCk7CisgIGlvYmFycmllcl9ydygpOworCisgICAgLyogRGlzYWJsZSBjb25maWd1cmF0aW9uIGFjY2Vzc2VzCisgICAgICovCisgIG91dDMyKFJFRyhDUEMwLCBQQ0lDTkZSKSwgMHg4MDAwMDAwMCk7CisgIGlvYmFycmllcl9ydygpOworCisgICAgLyogSW5pdGlhbGlzZSB0aGUgbG9jYWwgUENJCisgICAgICovCisgIG91dDMyKEJSSURHRShMT0NBTCwgQ1JSKSwgMHg3YzAwMDAwMCk7CisgIGlvYmFycmllcl9ydygpOworICBvdXQzMihCUklER0UoTE9DQUwsIFBDSURHKSwgMHg0MDAwMDAwMCk7CisgIGlvYmFycmllcl9ydygpOworICBvdXQzMihCUklER0UoTE9DQUwsIFBJQkFSKSwgQlJJREdFX0xPQ0FMX0lPX0JVUyk7CisgIG91dDMyKEJSSURHRShMT0NBTCwgU0lCQVIpLCBCUklER0VfTE9DQUxfSU9fUEhZUyk7CisgIG91dDMyKEJSSURHRShMT0NBTCwgSU9TSVpFKSwgLUJSSURHRV9MT0NBTF9JT19TSVpFKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisgIG91dDMyKEJSSURHRShMT0NBTCwgUE1CQVIpLCBCUklER0VfTE9DQUxfTUVNX0JVUyk7CisgIG91dDMyKEJSSURHRShMT0NBTCwgU01CQVIpLCBCUklER0VfTE9DQUxfTUVNX1BIWVMpOworICBvdXQzMihCUklER0UoTE9DQUwsIE1TSVpFKSwgLUJSSURHRV9MT0NBTF9NRU1fU0laRSk7CisgIGlvYmFycmllcl9ydygpOworICBvdXQzMihCUklER0UoTE9DQUwsIFBSKSwgMHgwMGZmZTAwMCk7CisgIGlvYmFycmllcl9ydygpOworICBvdXQzMihCUklER0UoTE9DQUwsIEFDUiksIDB4ZmUwMDAwMDApOworICBpb2JhcnJpZXJfcncoKTsKKyAgb3V0MzIoQlJJREdFKExPQ0FMLCBQU0JBUiksIFBDSV9NRU1PUllfQlVTID4+IDI0KTsKKyAgb3V0MzIoQlJJREdFKExPQ0FMLCBCQVJQUyksIFBDSV9NRU1PUllfUEhZUyA+PiAyNCk7CisgIG91dDMyKEJSSURHRShMT0NBTCwgUFNTSVpFKSwgMjU2IC0gKGNwYzcxMF9tYXBwZWRfcmFtID4+IDI0KSk7CisgIGlvYmFycmllcl9ydygpOworCisgICAgLyogSW5pdGlhbGlzZSB0aGUgQ1BDSSBicmlkZ2UKKyAgICAgKi8KKyAgb3V0MzIoQlJJREdFKENQQ0ksIENSUiksIDB4N2MwMDAwMDApOworICBpb2JhcnJpZXJfcncoKTsKKyAgb3V0MzIoQlJJREdFKENQQ0ksIFBDSURHKSwgMHhDMDAwMDAwMCk7CisgIGlvYmFycmllcl9ydygpOworICBvdXQzMihCUklER0UoQ1BDSSwgUElCQVIpLCBCUklER0VfQ1BDSV9JT19CVVMpOworICBvdXQzMihCUklER0UoQ1BDSSwgU0lCQVIpLCBCUklER0VfQ1BDSV9JT19QSFlTKTsKKyAgb3V0MzIoQlJJREdFKENQQ0ksIElPU0laRSksIC1CUklER0VfQ1BDSV9JT19TSVpFKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisgIG91dDMyKEJSSURHRShDUENJLCBQTUJBUiksIEJSSURHRV9DUENJX01FTV9CVVMpOworICBvdXQzMihCUklER0UoQ1BDSSwgU01CQVIpLCBCUklER0VfQ1BDSV9NRU1fUEhZUyk7CisgIG91dDMyKEJSSURHRShDUENJLCBNU0laRSksIC1CUklER0VfQ1BDSV9NRU1fU0laRSk7CisgIGlvYmFycmllcl9ydygpOworICBvdXQzMihCUklER0UoQ1BDSSwgUFIpLCAweDgwZmZlMDAwKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisgIG91dDMyKEJSSURHRShDUENJLCBBQ1IpLCAweGRmMDAwMDAwKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisgIG91dDMyKEJSSURHRShDUENJLCBQU0JBUiksIFBDSV9NRU1PUllfQlVTID4+IDI0KTsKKyAgb3V0MzIoQlJJREdFKENQQ0ksIEJBUlBTKSwgUENJX01FTU9SWV9QSFlTID4+IDI0KTsKKyAgb3V0MzIoQlJJREdFKENQQ0ksIFBTU0laRSksIDI1NiAtIChjcGM3MTBfbWFwcGVkX3JhbSA+PiAyNCkpOworICBpb2JhcnJpZXJfcncoKTsKKworICAgIC8qIExvY2FsIFBDSQorICAgICAqLworCisgIG91dDMyKEJSSURHRShMT0NBTCwgQ0ZHQUREUiksIDB4MDQwMDAwODApOworICBpb2JhcnJpZXJfcncoKTsKKyAgb3V0MzIoQlJJREdFKExPQ0FMLCBDRkdEQVRBKSwgMHg1NjAxMDAwMCk7CisgIGlvYmFycmllcl9ydygpOworCisgIG91dDMyKEJSSURHRShMT0NBTCwgQ0ZHQUREUiksIDB4MGMwMDAwODApOworICBpb2JhcnJpZXJfcncoKTsKKyAgb3V0MzIoQlJJREdFKExPQ0FMLCBDRkdEQVRBKSwgUENJX0xBVEVOQ1lfVElNRVJfVkFMIDw8IDE2KTsKKyAgaW9iYXJyaWVyX3J3KCk7CisKKyAgICAvKiBTZXQgYnVzIGFuZCBzdWJidXMgbnVtYmVycworICAgICAqLworICBvdXQzMihCUklER0UoTE9DQUwsIENGR0FERFIpLCAweDQwMDAwMDgwKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisgIG91dDMyKEJSSURHRShMT0NBTCwgQ0ZHREFUQSksIDB4MDAwMDAwMDApOworICBpb2JhcnJpZXJfcncoKTsKKworICBvdXQzMihCUklER0UoTE9DQUwsIENGR0FERFIpLCAweDUwMDAwMDgwKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisgICAgLyogUENJIHJldHJ5IHRpbWVvdXRzIHdpbGwgYmUgZW5hYmxlZCBsYXRlcgorICAgICAqLworICBvdXQzMihCUklER0UoTE9DQUwsIENGR0RBVEEpLCAweDAwMDAwMDAwKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisKKyAgICAvKiBDUENJCisgICAgICovCisKKyAgICAvKiBTZXQgYnVzIGFuZCBzdWJidXMgbnVtYmVycworICAgICAqLworICBvdXQzMihCUklER0UoQ1BDSSwgQ0ZHQUREUiksIDB4NDAwMDAwODApOworICBpb2JhcnJpZXJfcncoKTsKKyAgb3V0MzIoQlJJREdFKENQQ0ksIENGR0RBVEEpLCAweDAxMDEwMDAwKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisKKyAgb3V0MzIoQlJJREdFKENQQ0ksIENGR0FERFIpLCAweDA0MDAwMTgwKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisgIG91dDMyKEJSSURHRShDUENJLCBDRkdEQVRBKSwgMHg1NjAxMDAwMCk7CisgIGlvYmFycmllcl9ydygpOworCisgIG91dDMyKEJSSURHRShDUENJLCBDRkdBRERSKSwgMHgwYzAwMDE4MCk7CisgIGlvYmFycmllcl9ydygpOworICBvdXQzMihCUklER0UoQ1BDSSwgQ0ZHREFUQSksIFBDSV9MQVRFTkNZX1RJTUVSX1ZBTCA8PCAxNik7CisgIGlvYmFycmllcl9ydygpOworCisgICAgLyogV3JpdGUgdG8gdGhlIFBTQkFSICovCisgIG91dDMyKEJSSURHRShDUENJLCBDRkdBRERSKSwgMHgxMDAwMDE4MCk7CisgIGlvYmFycmllcl9ydygpOworICBvdXQzMihCUklER0UoQ1BDSSwgQ0ZHREFUQSksIGNwdV90b19sZTMyKFBDSV9NRU1PUllfQlVTKSk7CisgIGlvYmFycmllcl9ydygpOworCisgICAgLyogU2V0IGJ1cyBhbmQgc3ViYnVzIG51bWJlcnMKKyAgICAgKi8KKyAgb3V0MzIoQlJJREdFKENQQ0ksIENGR0FERFIpLCAweDQwMDAwMTgwKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisgIG91dDMyKEJSSURHRShDUENJLCBDRkdEQVRBKSwgMHgwMWZmMDAwMCk7CisgIGlvYmFycmllcl9ydygpOworCisgIG91dDMyKEJSSURHRShDUENJLCBDRkdBRERSKSwgMHg1MDAwMDE4MCk7CisgIGlvYmFycmllcl9ydygpOworICBvdXQzMihCUklER0UoQ1BDSSwgQ0ZHREFUQSksIDB4MzIwMDAwMDApOworICAgIC8qIFBDSSByZXRyeSB0aW1lb3V0cyB3aWxsIGJlIGVuYWJsZWQgbGF0ZXIKKyAgICAgKi8KKyAgb3V0MzIoQlJJREdFKENQQ0ksIENGR0RBVEEpLCAweDAwMDAwMDAwKTsKKyAgaW9iYXJyaWVyX3J3KCk7CisKKyAgICAvKiBSZW1vdmUgcmVzZXQgb24gdGhlIFBDSSBidXNlcworICAgICAqLworICBvdXQzMihCUklER0UoTE9DQUwsIENSUiksIDB4ZmMwMDAwMDApOworICBpb2JhcnJpZXJfcncoKTsKKyAgb3V0MzIoQlJJREdFKENQQ0ksIENSUiksIDB4ZmMwMDAwMDApOworICBpb2JhcnJpZXJfcncoKTsKKworICBsb2NhbF9ob3NlLmZpcnN0X2J1c25vID0gMDsKKyAgbG9jYWxfaG9zZS5sYXN0X2J1c25vID0gMHhmZjsKKworICAvKiBTeXN0ZW0gbWVtb3J5IHNwYWNlICovCisgIHBjaV9zZXRfcmVnaW9uKGxvY2FsX2hvc2UucmVnaW9ucyArIDAsCisJCSBQQ0lfTUVNT1JZX0JVUywKKwkJIFBDSV9NRU1PUllfUEhZUywKKwkJIFBDSV9NRU1PUllfTUFYU0laRSwKKwkJIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisgIC8qIFBDSSBtZW1vcnkgc3BhY2UgKi8KKyAgcGNpX3NldF9yZWdpb24obG9jYWxfaG9zZS5yZWdpb25zICsgMSwKKwkJIEJSSURHRV9MT0NBTF9NRU1fQlVTLAorCQkgQlJJREdFX0xPQ0FMX01FTV9QSFlTLAorCQkgQlJJREdFX0xPQ0FMX01FTV9TSVpFLAorCQkgUENJX1JFR0lPTl9NRU0pOworCisgIC8qIFBDSSBJL08gc3BhY2UgKi8KKyAgcGNpX3NldF9yZWdpb24obG9jYWxfaG9zZS5yZWdpb25zICsgMiwKKwkJIEJSSURHRV9MT0NBTF9JT19CVVMsCisJCSBCUklER0VfTE9DQUxfSU9fUEhZUywKKwkJIEJSSURHRV9MT0NBTF9JT19TSVpFLAorCQkgUENJX1JFR0lPTl9JTyk7CisKKyAgbG9jYWxfaG9zZS5yZWdpb25fY291bnQgPSAzOworCisgIHBjaV9zZXR1cF9pbmRpcmVjdCgmbG9jYWxfaG9zZSwKKwkJICAgICBCUklER0VfTE9DQUxfUEhZUyArIEhXX0JSSURHRV9DRkdBRERSLAorCQkgICAgIEJSSURHRV9MT0NBTF9QSFlTICsgSFdfQlJJREdFX0NGR0RBVEEpOworCisgIHBjaV9yZWdpc3Rlcl9ob3NlKCZsb2NhbF9ob3NlKTsKKworICAvKiBJbml0aWFsaXplIFBDSTMyIGJ1cyByZWdpc3RlcnMgKi8KKyAgcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoJmxvY2FsX2hvc2UsCisJCQkgIFBDSV9CREYobG9jYWxfaG9zZS5maXJzdF9idXNubywwLDApLAorCQkJICBDUEM3MTBfQlVTX05VTUJFUiwKKwkJCSAgbG9jYWxfaG9zZS5maXJzdF9idXNubyk7CisgIHBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKCZsb2NhbF9ob3NlLAorCQkJICBQQ0lfQkRGKGxvY2FsX2hvc2UuZmlyc3RfYnVzbm8sMCwwKSwKKwkJCSAgQ1BDNzEwX1NVQl9CVVNfTlVNQkVSLAorCQkJICBsb2NhbF9ob3NlLmxhc3RfYnVzbm8pOworCisgIGxvY2FsX2hvc2UubGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oJmxvY2FsX2hvc2UpOworCisgIC8qIFdyaXRlIG91dCBjb3JyZWN0IG1heCBzdWJvcmRpbmF0ZSBidXMgbnVtYmVyIGZvciBsb2NhbCBob3NlICovCisgIHBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKCZsb2NhbF9ob3NlLAorCQkJICBQQ0lfQkRGKGxvY2FsX2hvc2UuZmlyc3RfYnVzbm8sMCwwKSwKKwkJCSAgQ1BDNzEwX1NVQl9CVVNfTlVNQkVSLAorCQkJICBsb2NhbF9ob3NlLmxhc3RfYnVzbm8pOworCisgIGNwY2lfaG9zZS5maXJzdF9idXNubyA9IGxvY2FsX2hvc2UubGFzdF9idXNubyArIDE7CisgIGNwY2lfaG9zZS5sYXN0X2J1c25vID0gMHhmZjsKKworICAvKiBTeXN0ZW0gbWVtb3J5IHNwYWNlICovCisgIHBjaV9zZXRfcmVnaW9uKGNwY2lfaG9zZS5yZWdpb25zICsgMCwKKwkJIFBDSV9NRU1PUllfQlVTLAorCQkgUENJX01FTU9SWV9QSFlTLAorCQkgUENJX01FTU9SWV9NQVhTSVpFLAorCQkgUENJX1JFR0lPTl9NRU1PUlkpOworCisgIC8qIFBDSSBtZW1vcnkgc3BhY2UgKi8KKyAgcGNpX3NldF9yZWdpb24oY3BjaV9ob3NlLnJlZ2lvbnMgKyAxLAorCQkgQlJJREdFX0NQQ0lfTUVNX0JVUywKKwkJIEJSSURHRV9DUENJX01FTV9QSFlTLAorCQkgQlJJREdFX0NQQ0lfTUVNX1NJWkUsCisJCSBQQ0lfUkVHSU9OX01FTSk7CisKKyAgLyogUENJIEkvTyBzcGFjZSAqLworICBwY2lfc2V0X3JlZ2lvbihjcGNpX2hvc2UucmVnaW9ucyArIDIsCisJCSBCUklER0VfQ1BDSV9JT19CVVMsCisJCSBCUklER0VfQ1BDSV9JT19QSFlTLAorCQkgQlJJREdFX0NQQ0lfSU9fU0laRSwKKwkJIFBDSV9SRUdJT05fSU8pOworCisgIGNwY2lfaG9zZS5yZWdpb25fY291bnQgPSAzOworCisgIHBjaV9zZXR1cF9pbmRpcmVjdCgmY3BjaV9ob3NlLAorCQkgICAgIEJSSURHRV9DUENJX1BIWVMgKyBIV19CUklER0VfQ0ZHQUREUiwKKwkJICAgICBCUklER0VfQ1BDSV9QSFlTICsgSFdfQlJJREdFX0NGR0RBVEEpOworCisgIHBjaV9yZWdpc3Rlcl9ob3NlKCZjcGNpX2hvc2UpOworCisgIC8qIEluaXRpYWxpemUgUENJNjQgYnVzIHJlZ2lzdGVycyAqLworICBwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZSgmY3BjaV9ob3NlLAorCQkJICBQQ0lfQkRGKGNwY2lfaG9zZS5maXJzdF9idXNubywwLDApLAorCQkJICBDUEM3MTBfQlVTX05VTUJFUiwKKwkJCSAgY3BjaV9ob3NlLmZpcnN0X2J1c25vKTsKKyAgcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoJmNwY2lfaG9zZSwKKwkJCSAgUENJX0JERihjcGNpX2hvc2UuZmlyc3RfYnVzbm8sMCwwKSwKKwkJCSAgQ1BDNzEwX1NVQl9CVVNfTlVNQkVSLAorCQkJICBjcGNpX2hvc2UubGFzdF9idXNubyk7CisKKyAgY3BjaV9ob3NlLmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuKCZjcGNpX2hvc2UpOworCisgIC8qIFdyaXRlIG91dCBjb3JyZWN0IG1heCBzdWJvcmRpbmF0ZSBidXMgbnVtYmVyIGZvciBjcGNpIGhvc2UgKi8KKyAgcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoJmNwY2lfaG9zZSwKKwkJCSAgUENJX0JERihjcGNpX2hvc2UuZmlyc3RfYnVzbm8sMCwwKSwKKwkJCSAgQ1BDNzEwX1NVQl9CVVNfTlVNQkVSLAorCQkJICBjcGNpX2hvc2UubGFzdF9idXNubyk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9wY2lwcGMyL2kyYy5jIGIvYm9hcmQvcGNpcHBjMi9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmIxZDBmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvcGNpcHBjMi9pMmMuYwpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJoYXJkd2FyZS5oIgorI2luY2x1ZGUgImkyYy5oIgorCitzdGF0aWMgdm9pZAkJaTJjX3N0YXJ0CSh2b2lkKTsKK3N0YXRpYyB2b2lkCQlpMmNfc3RvcAkodm9pZCk7CitzdGF0aWMgaW50CQlpMmNfd3JpdGUJKHU4CQlkYXRhKTsKK3N0YXRpYyB2b2lkCQlpMmNfcmVhZAkodTggKgkJZGF0YSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAlpMmNfcG9ydF9zdGFydCAgKHZvaWQpOworc3RhdGljIGlubGluZSB2b2lkCWkyY19jbG9jawkodW5zaWduZWQgaW50CXZhbCk7CitzdGF0aWMgaW5saW5lIHZvaWQJaTJjX2RhdGEJKHVuc2lnbmVkIGludAl2YWwpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKKwkJCWkyY19pbgkJKHZvaWQpOworc3RhdGljIGlubGluZSB2b2lkCWkyY193cml0ZV9iaXQJKHVuc2lnbmVkIGludAl2YWwpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKKwkJCWkyY19yZWFkX2JpdAkodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAlpMmNfdWRlbGF5CSh1bnNpZ25lZCBpbnQJdGltZSk7CisKK2ludCBpMmNfcmVhZF9ieXRlICgKKyAgdTggKgkJCWRhdGEsCisgIHU4CQkJZGV2LAorICB1OAkJCW9mZnNldCkKK3sKKyAgaW50CQkJZXJyID0gMDsKKworICBpMmNfc3RhcnQoKTsKKworICBlcnIgPSAhIGkyY193cml0ZShkZXYpOworCisgIGlmICghIGVycikKKyAgeworICAgIGVyciA9ICEgaTJjX3dyaXRlKG9mZnNldCk7CisgIH0KKworICBpZiAoISBlcnIpCisgIHsKKyAgICBpMmNfc3RhcnQoKTsKKyAgfQorCisgIGlmICghIGVycikKKyAgeworICAgIGVyciA9ICEgaTJjX3dyaXRlKGRldiB8IDB4MDEpOworICB9CisKKyAgaWYgKCEgZXJyKQorICB7CisgICAgaTJjX3JlYWQoZGF0YSk7CisgIH0KKworICBpMmNfc3RvcCgpOworCisgIHJldHVybiAhIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGkyY191ZGVsYXkgKAorICB1bnNpZ25lZCBpbnQJCXRpbWUpCit7CisgIGludAkJCXY7CisKKyAgYXNtIHZvbGF0aWxlKCJtdGRlYyAlMCIgOiA6ICJyIiAodGltZSAqICgoQ0ZHX0JVU19DTEsgLyA0KSAvIDEwMDAwMDApKSk7CisKKyAgZG8KKyAgeworICAgIGFzbSB2b2xhdGlsZSgiaXN5bmM7IG1mZGVjICUwIiA6ICI9ciIgKHYpKTsKKyAgfSB3aGlsZSAodiA+PSAwKTsKK30KKworICAvKiBMb3ctbGV2ZWwgaGFyZHdhcmUgYWNjZXNzCisgICAqLworCisjZGVmaW5lIEJJVF9HUERBVEEJCTB4ODAwMDAwMDAKKyNkZWZpbmUgQklUX0dQQ0xLCQkweDQwMDAwMDAwCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpMmNfcG9ydF9zdGFydCAodm9pZCkKK3sKKyAgb3V0MzIoUkVHKENQQzAsIEdQRElSKSwgaW4zMihSRUcoQ1BDMCwgR1BESVIpKSAmIH4oQklUX0dQQ0xLIHwgQklUX0dQREFUQSkpOworICBvdXQzMihSRUcoQ1BDMCwgR1BPVVQpLCBpbjMyKFJFRyhDUEMwLCBHUE9VVCkpICYgfihCSVRfR1BDTEsgfCBCSVRfR1BEQVRBKSk7CisgIGlvYmFycmllcl9ydygpOworCisgIGkyY191ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpMmNfY2xvY2sgKAorICB1bnNpZ25lZCBpbnQJCXZhbCkKK3sKKyAgaWYgKHZhbCkKKyAgeworICAgIG91dDMyKFJFRyhDUEMwLCBHUERJUiksIGluMzIoUkVHKENQQzAsIEdQRElSKSkgJiB+QklUX0dQQ0xLKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBvdXQzMihSRUcoQ1BDMCwgR1BESVIpLCBpbjMyKFJFRyhDUEMwLCBHUERJUikpIHwgQklUX0dQQ0xLKTsKKyAgfQorCisgIGlvYmFycmllcl9ydygpOworCisgIGkyY191ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpMmNfZGF0YSAoCisgIHVuc2lnbmVkIGludAkJdmFsKQoreworICBpZiAodmFsKQorICB7CisgICAgb3V0MzIoUkVHKENQQzAsIEdQRElSKSwgaW4zMihSRUcoQ1BDMCwgR1BESVIpKSAmIH5CSVRfR1BEQVRBKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBvdXQzMihSRUcoQ1BDMCwgR1BESVIpLCBpbjMyKFJFRyhDUEMwLCBHUERJUikpIHwgQklUX0dQREFUQSk7CisgIH0KKworICBpb2JhcnJpZXJfcncoKTsKKworICBpMmNfdWRlbGF5KDEpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpMmNfaW4gKHZvaWQpCit7CisgIHVuc2lnbmVkIGludAkJdmFsID0gKChpbjMyKFJFRyhDUEMwLCBHUElOKSkgJiBCSVRfR1BEQVRBKSAhPSAwKT8xOjA7CisKKyAgaW9iYXJyaWVyX3J3KCk7CisKKyAgcmV0dXJuIHZhbDsKK30KKworCisgIC8qIFByb3RvY29sIGltcGxlbWVudGF0aW9uCisgICAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaTJjX3dyaXRlX2JpdCAoCisgIHVuc2lnbmVkIGludAkJdmFsKQoreworICBpMmNfZGF0YSh2YWwpOworICBpMmNfdWRlbGF5KDEwKTsKKyAgaTJjX2Nsb2NrKDEpOworICBpMmNfdWRlbGF5KDEwKTsKKyAgaTJjX2Nsb2NrKDApOworICBpMmNfdWRlbGF5KDEwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaTJjX3JlYWRfYml0ICh2b2lkKQoreworICB1bnNpZ25lZCBpbnQJCXZhbDsKKworICBpMmNfZGF0YSgxKTsKKyAgaTJjX3VkZWxheSgxMCk7CisKKyAgaTJjX2Nsb2NrKDEpOworICBpMmNfdWRlbGF5KDEwKTsKKworICB2YWwgPSBpMmNfaW4oKTsKKworICBpMmNfY2xvY2soMCk7CisgIGkyY191ZGVsYXkoMTApOworCisgIHJldHVybiB2YWw7Cit9CisKK3Vuc2lnbmVkIGludCBpMmNfcmVzZXQgKHZvaWQpCit7CisgIHVuc2lnbmVkIGludAkJdmFsOworICBpbnQgaTsKKworICBpMmNfcG9ydF9zdGFydCgpOworCisgIGk9MDsKKyAgZG8geworICAgIGkyY191ZGVsYXkoMTApOworICAgIGkyY19jbG9jaygwKTsKKyAgICBpMmNfdWRlbGF5KDEwKTsKKyAgICBpMmNfY2xvY2soMSk7CisgICAgaTJjX3VkZWxheSgxMCk7CisgICAgdmFsID0gaTJjX2luKCk7CisgICAgaSsrOworICB9ICB3aGlsZSAoKGk8OSkmJih2YWw9PTApKTsKKyAgcmV0dXJuICh2YWwpOworfQorCisKK3N0YXRpYyB2b2lkIGkyY19zdGFydCAodm9pZCkKK3sKKyAgaTJjX2RhdGEoMSk7CisgIGkyY19jbG9jaygxKTsKKyAgaTJjX3VkZWxheSgxMCk7CisgIGkyY19kYXRhKDApOworICBpMmNfdWRlbGF5KDEwKTsKKyAgaTJjX2Nsb2NrKDApOworICBpMmNfdWRlbGF5KDEwKTsKK30KKworc3RhdGljIHZvaWQgaTJjX3N0b3AgKHZvaWQpCit7CisgIGkyY19kYXRhKDApOworICBpMmNfdWRlbGF5KDEwKTsKKyAgaTJjX2Nsb2NrKDEpOworICBpMmNfdWRlbGF5KDEwKTsKKyAgaTJjX2RhdGEoMSk7CisgIGkyY191ZGVsYXkoMTApOworfQorCitzdGF0aWMgaW50IGkyY193cml0ZSAoCisgIHU4CQkJZGF0YSkKK3sKKyAgdW5zaWduZWQgaW50CQlpOworCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgIHsKKyAgICBpMmNfd3JpdGVfYml0KGRhdGEgPj4gNyk7CisgICAgZGF0YSA8PD0gMTsKKyAgfQorCisgIHJldHVybiBpMmNfcmVhZF9iaXQoKSA9PSAwOworfQorCitzdGF0aWMgdm9pZCBpMmNfcmVhZCAoCisgIHU4ICoJCQlkYXRhKQoreworICB1bnNpZ25lZCBpbnQJCWk7CisgIHU4CQkJdmFsID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICB7CisgICAgdmFsIDw8PSAxOworICAgIHZhbCB8PSBpMmNfcmVhZF9iaXQoKTsKKyAgfQorCisgICpkYXRhID0gdmFsOworICBpMmNfd3JpdGVfYml0KDEpOyAvKiBOb0FjayAqLworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvcGNpcHBjMi9wY2lwcGMyLmMgYi9ib2FyZC9wY2lwcGMyL3BjaXBwYzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWIwNjViCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvcGNpcHBjMi9wY2lwcGMyLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvZG9jMjAwMC5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8cGNpLmg+CisKKyNpbmNsdWRlICJoYXJkd2FyZS5oIgorI2luY2x1ZGUgInBjaXBwYzIuaCIKKyNpbmNsdWRlICJzY29uc29sZS5oIgorI2luY2x1ZGUgImZwZ2Ffc2VyaWFsLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKworc3RhdGljIGludCBwY2lwcGMyX3dkdF9pbml0X2RvbmUgPSAwOworCit2b2lkIHBjaXBwYzJfd2R0X2luaXQgKHZvaWQpOworCisjZW5kaWYKKworICAvKiBDaGVjayBib2FyZCBpZGVudGl0eQorICAgKi8KK2ludCBjaGVja2JvYXJkICh2b2lkKQoreworI2lmZGVmIENPTkZJR19QQ0lQUEMyCisJcHV0cyAoIkJvYXJkOiBHZXNwYWMgUENJUFBDLTJcbiIpOworI2Vsc2UKKwlwdXRzICgiQm9hcmQ6IEdlc3BhYyBQQ0lQUEMtNlxuIik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworICAvKiBSQU0gc2l6ZSBpcyBzdG9yZWQgaW4gQ1BDMF9SR0JBTjEKKyAgICovCit1MzIgcGNpcHBjMl9zZHJhbV9zaXplICh2b2lkKQoreworCXJldHVybiBpbjMyIChSRUcgKENQQzAsIFJHQkFOMSkpOworfQorCitsb25nIGluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKK3sKKwlyZXR1cm4gY3BjNzEwX3JhbV9pbml0ICgpOworfQorCit2b2lkIGRvX3Jlc2V0IChjbWRfdGJsX3QgKmNtZHRwLCBiZF90ICpiZCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJb3V0MzIgKFJFRyAoQ1BDMCwgU1BPUiksIDApOworCWlvYmFycmllcl9ydyAoKTsKKwl3aGlsZSAoMSk7Cit9CisKK2ludCBib2FyZF9wcmVfaW5pdCAodm9pZCkKK3sKKwlvdXQzMiAoUkVHIChDUEMwLCBSU1RSKSwgMHhDMDAwMDAwMCk7CisJaW9iYXJyaWVyX3J3ICgpOworCisJb3V0MzIgKFJFRyAoQ1BDMCwgUlNUUiksIDB4RjAwMDAwMDApOworCWlvYmFycmllcl9ydyAoKTsKKworCW91dDMyIChSRUcgKENQQzAsIFVDVEwpLCAweDAwRjgwMDAwKTsKKworCW91dDMyIChSRUcgKENQQzAsIFNJT0MwKSwgMHgzMDAwMDAwMCk7CisKKwlvdXQzMiAoUkVHIChDUEMwLCBBQkNOVEwpLCAweDAwMDAwMDAwKTsKKworCW91dDMyIChSRUcgKENQQzAsIFNFU1IpLCAweDAwMDAwMDAwKTsKKwlvdXQzMiAoUkVHIChDUEMwLCBTRUFSKSwgMHgwMDAwMDAwMCk7CisKKwkvKiBEZXRlY3QgSUJNIEF2aWdub24gQ1BDNzEwIFJldmlzaW9uICovCisJaWYgKChpbjMyIChSRUcgKENQQzAsIFVDVEwpKSAmIDB4MDAwMDAwRjApID09IENQQzcxMF9UWVBFXzEwMFApCisJCW91dDMyIChSRUcgKENQQzAsIFBHQ0hQKSwgMHhBMDAwMDA0MCk7CisJZWxzZQorCQlvdXQzMiAoUkVHIChDUEMwLCBQR0NIUCksIDB4ODA4MDAwNDApOworCisKKwlvdXQzMiAoUkVHIChDUEMwLCBBVEFTKSwgMHg3MDlDMjUwOCk7CisKKwlpb2JhcnJpZXJfcncgKCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhZnRlcl9yZWxvYyAodWxvbmcgZGVzdF9hZGRyKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJLyogSnVtcCB0byB0aGUgbWFpbiBVLUJvb3QgYm9hcmQgaW5pdCBjb2RlCisJICovCisJYm9hcmRfaW5pdF9yIChnZCwgZGVzdF9hZGRyKTsKK30KKworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXBjaXBwYzJfZnBnYV9pbml0ICgpOworCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisJcGNpcHBjMl93ZHRfaW5pdCAoKTsKKyNlbmRpZgorCisJZnBnYV9zZXJpYWxfaW5pdCAoc2NvbnNvbGVfZ2V0X2JhdWRyYXRlICgpKTsKKworCXNjb25zb2xlX3B1dGMgICA9IGZwZ2Ffc2VyaWFsX3B1dGM7CisJc2NvbnNvbGVfcHV0cyAgID0gZnBnYV9zZXJpYWxfcHV0czsKKwlzY29uc29sZV9nZXRjICAgPSBmcGdhX3NlcmlhbF9nZXRjOworCXNjb25zb2xlX3RzdGMgICA9IGZwZ2Ffc2VyaWFsX3RzdGM7CisJc2NvbnNvbGVfc2V0YnJnID0gZnBnYV9zZXJpYWxfc2V0YnJnOworCisJc2NvbnNvbGVfZmx1c2ggKCk7CisJcmV0dXJuICgwKTsKK30KKwordm9pZCBwY2lfaW5pdCAodm9pZCkKK3sKKwljcGM3MTBfcGNpX2luaXQgKCk7CisKKwkvKiBGUEdBIHJlcXVpcmVzIG5vIHJldHJ5IHRpbWVvdXRzIHRvIGJlIGVuYWJsZWQKKwkgKi8KKwljcGM3MTBfcGNpX2VuYWJsZV90aW1lb3V0ICgpOworfQorCit2b2lkIGRvY19pbml0ICh2b2lkKQoreworCWRvY19wcm9iZSAocGNpcHBjMl9mcGdhMV9waHlzICsgSFdfRlBHQTFfRE9DKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCit2b2lkIHBjaXBwYzJfd2R0X2luaXQgKHZvaWQpCit7CisJb3V0MTZyIChGUEdBIChXRFQsIFBST0cpLCAweGZmZmYpOworCW91dDggKEZQR0EgKFdEVCwgQ1RSTCksIDB4MSk7CisKKwlwY2lwcGMyX3dkdF9pbml0X2RvbmUgPSAxOworfQorCit2b2lkIHBjaXBwYzJfd2R0X2RvbmUgKHZvaWQpCit7CisJb3V0OCAoRlBHQSAoV0RULCBDVFJMKSwgMHgwKTsKKworCXBjaXBwYzJfd2R0X2luaXRfZG9uZSA9IDA7Cit9CisKK3ZvaWQgcGNpcHBjMl93ZHRfcmVzZXQgKHZvaWQpCit7CisJaWYgKHBjaXBwYzJfd2R0X2luaXRfZG9uZSA9PSAxKQorCQlvdXQ4IChGUEdBIChXRFQsIFJFRlJFU0gpLCAweDU2KTsKK30KKwordm9pZCB3YXRjaGRvZ19yZXNldCAodm9pZCkKK3sKKwlpbnQgcmVfZW5hYmxlID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJcGNpcHBjMl93ZHRfcmVzZXQgKCk7CisJaWYgKHJlX2VuYWJsZSkKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7Cit9CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCitpbnQgZG9fd2QgKGNtZF90YmxfdCAqY21kdHAsIGJkX3QgKmJkLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDE6CisJCXByaW50ZiAoIldhdGNoZG9nIHRpbWVyIHN0YXR1cyBpcyAlc1xuIiwKKwkJCXBjaXBwYzJfd2R0X2luaXRfZG9uZSA9PSAxID8gIm9uIiA6ICJvZmYiKTsKKworCQlyZXR1cm4gMDsKKwljYXNlIDI6CisJCWlmICghc3RyY21wKGFyZ3ZbMV0sIm9uIikpIHsKKwkJCXBjaXBwYzJfd2R0X2luaXQoKTsKKwkJCXByaW50ZigiV2F0Y2hkb2cgdGltZXIgbm93IGlzIG9uXG4iKTsKKworCQkJcmV0dXJuIDA7CisKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sIm9mZiIpKSB7CisJCQlwY2lwcGMyX3dkdF9kb25lKCk7CisJCQlwcmludGYoIldhdGNoZG9nIHRpbWVyIG5vdyBpcyBvZmZcbiIpOworCisJCQlyZXR1cm4gMDsKKworCQl9IGVsc2UKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworfQorCisjZW5kaWYJLyogQ0ZHX0NNRF9CU1AgKi8KKyNlbmRpZgkvKiBDT05GSUdfV0FUQ0hET0cgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL3BuNjIvY21kX3BuNjIuYyBiL2JvYXJkL3BuNjIvY21kX3BuNjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjhmNmMwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvcG42Mi9jbWRfcG42Mi5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBHcmFuZGVnZ2VyLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3Z0BkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxjbWRfYXV0b3NjcmlwdC5oPgorI2luY2x1ZGUgPGNtZF9ic3AuaD4KKworI2luY2x1ZGUgInBuNjIuaCIKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKworZXh0ZXJuIGludCBkb19ib290bSAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CisKKy8qCisgKiBDb21tYW5kIGxlZDogY29udHJvbHMgdGhlIHZhcmlvdXMgTEVEcyAwLi4xMSBvbiB0aGUgUE42MiBjYXJkLgorICovCitpbnQgZG9fbGVkIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbnVtYmVyLCBmdW5jdGlvbjsKKworICAgIGlmIChhcmdjICE9IDMpIHsKKwlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworICAgIH0KKyAgICBudW1iZXIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxMCk7CisgICAgaWYgKG51bWJlciA+IFBONjJfTEVEX01BWCkKKwlyZXR1cm4gMTsKKyAgICBmdW5jdGlvbiA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKyAgICBzZXRfbGVkIChudW1iZXIsIGZ1bmN0aW9uKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIENvbW1hbmQgbG9hZHBjaTogbG9hZHMgYSBpbWFnZSBvdmVyIFBDSS4KKyAqLworI2RlZmluZSBDTURfTU9WRV9XSU5ET1cgMHgxCisjZGVmaW5lIENNRF9CT09UX0lNQUdFICAweDIKKworaW50IGRvX2xvYWRwY2kgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGNoYXIgKnM7CisgICAgdWxvbmcgYWRkciA9IDAsIGNvdW50ID0gMDsKKyAgICB1MzIgb2ZmOworICAgIGludCBjbWQsIHJjb2RlID0gMDsKKworICAgIC8qIHByZS1zZXQgbG9hZF9hZGRyICovCisgICAgaWYgKChzID0gZ2V0ZW52KCJsb2FkYWRkciIpKSAhPSBOVUxMKSB7CisJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDE2KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGFyZ2MpIHsKKyAgICBjYXNlIDE6CisJYnJlYWs7CisgICAgY2FzZSAyOgorCWFkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICBwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworICAgIH0KKworICAgIHByaW50ZiAoIiMjIFJlYWR5IGZvciBpbWFnZSBkb3dubG9hZCAuLi5cbiIpOworCisgICAgc2hvd19zdGFydHVwX3BoYXNlKDEyKTsKKworICAgIHdoaWxlICgxKSB7CisJLyogQWxpdmUgaW5kaWNhdG9yICovCisJaTIxNTV4X3dyaXRlX3NjcmFwYWQoQk9PVF9QUk9UTywgQk9PVF9QUk9UT19SRUFEWSk7CisKKwkvKiBUb2dnbGUgc3RhdHVzIExFRHMgKi8KKwljbWQgPSAoY291bnQgLyAyMDApICUgNDsgLyogZG93bnNjYWxlICovCisJc2V0X2xlZCg0LCBjbWQgPT0gMCA/IExFRF8xIDogTEVEXzApOworCXNldF9sZWQoNSwgY21kID09IDEgPyBMRURfMSA6IExFRF8wKTsKKwlzZXRfbGVkKDYsIGNtZCA9PSAyID8gTEVEXzEgOiBMRURfMCk7CisJc2V0X2xlZCg3LCBjbWQgPT0gMyA/IExFRF8xIDogTEVEXzApOworCXVkZWxheSgxMDAwKTsKKwljb3VudCsrOworCisJY21kID0gaTIxNTV4X3JlYWRfc2NyYXBhZChCT09UX0NNRCk7CisKKwlpZiAoY21kID09IEJPT1RfQ01EX01PVkUpIHsKKwkgICAgb2ZmID0gaTIxNTV4X3JlYWRfc2NyYXBhZChCT09UX0RBVEEpOworCSAgICBvZmYgKz0gYWRkcjsKKwkgICAgaTIxNTV4X3NldF9iYXJfYmFzZSgzLCBvZmYpOworCSAgICBwcmludGYgKCIjIyBCQVIzIEFkZHIgbW92ZWQgPSAweCUwOHhcbiIsIG9mZik7CisJICAgIGkyMTU1eF93cml0ZV9zY3JhcGFkKEJPT1RfQ01ELCB+Y21kKTsKKwkgICAgc2hvd19zdGFydHVwX3BoYXNlKDEzKTsKKwl9CisJZWxzZSBpZiAoY21kID09IEJPT1RfQ01EX0JPT1QpIHsKKwkgICAgc2V0X2xlZCg0LCBMRURfMSk7CisJICAgIHNldF9sZWQoNSwgTEVEXzEpOworCSAgICBzZXRfbGVkKDYsIExFRF8xKTsKKwkgICAgc2V0X2xlZCg3LCBMRURfMSk7CisKKwkgICAgaTIxNTV4X3dyaXRlX3NjcmFwYWQoQk9PVF9DTUQsIH5jbWQpOworCSAgICBzaG93X3N0YXJ0dXBfcGhhc2UoMTQpOworCSAgICBicmVhazsKKwl9CisKKwkvKiBBYm9ydCBpZiBjdHJsLWMgd2FzIHByZXNzZWQgKi8KKwlpZiAoY3RybGMoKSkgeworCSAgICBwcmludGYoIlxuQWJvcnRcbiIpOworCSAgICByZXR1cm4gMDsKKwl9CisKKyAgICB9CisKKyAgICAvKiBSZXBvaW50IHRvIHRoZSBkZWZhdWx0IHNoYXJlZCBtZW1vcnkgKi8KKyAgICBpMjE1NXhfc2V0X2Jhcl9iYXNlKDMsIFBONjJfU01FTV9ERUZBVUxUKTsKKworICAgIGxvYWRfYWRkciA9IGFkZHI7CisgICAgcHJpbnRmICgiIyMgU3RhcnQgQWRkciAgICAgID0gMHglMDhseFxuIiwgYWRkcik7CisKKyAgICBzaG93X3N0YXJ0dXBfcGhhc2UoMTUpOworCisgICAgLyogTG9hZGluZyBvaywgY2hlY2sgaWYgd2Ugc2hvdWxkIGF0dGVtcHQgYW4gYXV0by1zdGFydCAqLworICAgIGlmICgoKHMgPSBnZXRlbnYoImF1dG9zdGFydCIpKSAhPSBOVUxMKSAmJiAoc3RyY21wKHMsInllcyIpID09IDApKSB7CisJY2hhciAqbG9jYWxfYXJnc1syXTsKKwlsb2NhbF9hcmdzWzBdID0gYXJndlswXTsKKwlsb2NhbF9hcmdzWzFdID0gTlVMTDsKKworCXByaW50ZiAoIkF1dG9tYXRpYyBib290IG9mIGltYWdlIGF0IGFkZHIgMHglMDhsWCAuLi5cbiIsCisJCWxvYWRfYWRkcik7CisJcmNvZGUgPSBkb19ib290bSAoY21kdHAsIDAsIDEsIGxvY2FsX2FyZ3MpOworICAgIH0KKworI2lmZGVmIENPTkZJR19BVVRPU0NSSVBUCisgICAgaWYgKGxvYWRfYWRkcikgeworCWNoYXIgKnM7CisKKwlpZiAoKChzID0gZ2V0ZW52KCJhdXRvc2NyaXB0IikpICE9IE5VTEwpICYmIChzdHJjbXAocywieWVzIikgPT0gMCkpIHsKKwkgICAgcHJpbnRmKCJSdW5uaW5nIGF1dG9zY3JpcHQgYXQgYWRkciAweCUwOGxYIC4uLlxuIiwgbG9hZF9hZGRyKTsKKwkgICAgcmNvZGUgPSBhdXRvc2NyaXB0IChiZCwgbG9hZF9hZGRyKTsKKwl9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHJjb2RlOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL3BuNjIvbWlzYy5jIGIvYm9hcmQvcG42Mi9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3MTk1MAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3BuNjIvbWlzYy5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyIFdvbGZnYW5nIEdyYW5kZWdnZXIgPHdnQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzgyNHguaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworI2luY2x1ZGUgInBuNjIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHBjaV9kZXZfdCAgICBkZXZubzsKKyAgICB2b2xhdGlsZSB1MzIgKmNzcjsKKworfSBpMjE1NXhfdDsKKworc3RhdGljIGkyMTU1eF90IGkyMTU1eCA9IHsgMCwgTlVMTCB9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaTIxNTV4X2lkc1tdID0geworICAgIHsgMHgxMDExLCAweDAwNDYgfSwJCS8qIGkyMTU1NCAqLworICAgIHsgMHg4MDg2LCAweGI1NTUgfQkJLyogaTIxNTU1ICovCit9OworCitpbnQgaTIxNTV4X2luaXQodm9pZCkKK3sKKyAgICBwY2lfZGV2X3QgZGV2bm87CisgICAgdTMyIHZhbDsKKyAgICBpbnQgaTsKKworICAgIC8qCisgICAgICogRmluZCB0aGUgSW50ZWwgYnJpZGdlLgorICAgICAqLworICAgIGlmICgoZGV2bm8gPSBwY2lfZmluZF9kZXZpY2VzKGkyMTU1eF9pZHMsIDApKSA8IDApIHsKKwlwcmludGYoIkVycm9yOiBJbnRlbCBicmlkZ2UgMjE1NXggbm90IGZvdW5kIVxuIik7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpMjE1NXguZGV2bm8gPSBkZXZubzsKKworICAgIC8qCisgICAgICogR2V0IGF1dG8tY29uZmlndXJlZCBiYXNlIGFkZHJlc3MgZm9yIENTUiBhY2Nlc3MuCisgICAgICovCisgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldm5vLCBQQ0lfQkFTRV9BRERSRVNTXzEsICZ2YWwpOworICAgIGlmICh2YWwgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSB7CisJdmFsICY9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKwlpMjE1NXguY3NyID0gKHZvbGF0aWxlIHUzMiAqKShfSU9fQkFTRSArIHZhbCk7CisgICAgfSBlbHNlIHsKKwl2YWwgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwlpMjE1NXguY3NyID0gICh2b2xhdGlsZSB1MzIgKil2YWw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUcmFuc2xhdGUgZG93bnN0cmVhbSBtZW1vcnkgMiAoYmFyMykgdG8gYmFzZSBvZiBzaGFyZWQgbWVtb3J5LgorICAgICAqLworICAgIGkyMTU1eF9zZXRfYmFyX2Jhc2UoMywgUE42Ml9TTUVNX0RFRkFVTFQpOworCisgICAgLyoKKyAgICAgKiBFbmFibGUgbWVtb3J5IHNwYWNlLCBJL08gc3BhY2UgYW5kIGJ1cyBtYXN0ZXIgYml0cworICAgICAqIGluIGJvdGggUHJpbWFyeSBhbmQgU2Vjb25kYXJ5IGNvbW1hbmQgcmVnaXN0ZXJzLgorICAgICAqLworICAgIHZhbCA9IFBDSV9DT01NQU5EX01FTU9SWXxQQ0lfQ09NTUFORF9NQVNURVJ8UENJX0NPTU1BTkRfSU87CisgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldm5vLCAweDQ0LCB2YWwpOworICAgIHBjaV93cml0ZV9jb25maWdfd29yZChkZXZubywgMHgwNCwgdmFsKTsKKworICAgIC8qCisgICAgICogQ2xlYXIgc2NyYXRjaHBhZCByZWdpc3RlcnMuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IChJMjE1NVhfU0NSQVBBRF9NQVggLSAxKTsgaSsrKSB7CisJaTIxNTV4X3dyaXRlX3NjcmFwYWQoaSwgMHgwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCBpbnRlcnJ1cHQgbGluZSBmb3IgTGludXguCisgICAgICovCisgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldm5vLCBQQ0lfSU5URVJSVVBUX0xJTkUsIDMpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBY2Nlc3MgdGhlIFNjcmF0Y2hwYWQgcmVnaXN0ZXJzIDAuLjcgb2YgdGhlIEludGVsIGJyaWRnZS4KKyAqLwordm9pZCBpMjE1NXhfd3JpdGVfc2NyYXBhZChpbnQgaWR4LCB1MzIgdmFsKQoreworICAgIGlmIChpZHggPj0gMCAmJiBpZHggPCBJMjE1NVhfU0NSQVBBRF9NQVgpCisJb3V0X2xlMzIoaTIxNTV4LmNzciArIChJMjE1NVhfU0NSQVBBRF9BRERSLzQpICsgaWR4LCB2YWwpOworICAgIGVsc2UKKwlwcmludGYoImkyMTU1eF93cml0ZV9zY3JhcGFkOiBpbnZhbGlkIGluZGV4XG4iKTsKK30KKwordTMyIGkyMTU1eF9yZWFkX3NjcmFwYWQoaW50IGlkeCkKK3sKKyAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgSTIxNTVYX1NDUkFQQURfTUFYKQorCXJldHVybiBpbl9sZTMyKGkyMTU1eC5jc3IgKyAoSTIxNTVYX1NDUkFQQURfQUREUi80KSArIGlkeCk7CisgICAgZWxzZQorCXByaW50ZigiaTIxNTV4X3JlYWRfc2NyYXBhZDogaW52YWxpZCBpbmRleFxuIik7CisgICAgcmV0dXJuIC0xOworfQorCit2b2lkIGkyMTU1eF9zZXRfYmFyX2Jhc2UoaW50IGJhciwgdTMyIGJhc2UpCit7CisgICAgaWYgKGJhciA+PSAyICYmIGJhciA8PSA0KSB7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChpMjE1NXguZGV2bm8sCisJCQkgICAgICAgSTIxNTVYX0JBUjJfQkFTRSArIChiYXIgLSAyKSAqIDQsCisJCQkgICAgICAgYmFzZSk7CisgICAgfQorfQorCisvKgorICogUmVhZCBWaXRhbCBQcm9kdWN0IERhdGEgKFZQRCkgZnJvbSB0aGUgU2VyaWFsIEVQUk9NIGF0dGFjaGVkCisgKiB0byB0aGUgSW50ZWwgYnJpZGdlLgorICovCitpbnQgaTIxNTV4X3JlYWRfdnBkKGludCBvZmZzZXQsIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworICAgIGludCBpLCBuOworICAgIHUxNiB2YWwxNjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaTIxNTV4LmRldm5vLCBJMjE1NVhfVlBEX0FERFIsCisJCQkgICAgICBvZmZzZXQgKyBpIC0gSTIxNTVYX1ZQRF9TVEFSVCk7CisJZm9yIChuID0gMTAwMDA7IG4gPiAwOyBuLS0pIHsKKwkgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoaTIxNTV4LmRldm5vLCBJMjE1NVhfVlBEX0FERFIsICZ2YWwxNik7CisJICAgIGlmICgodmFsMTYgJiAweDgwMDApICE9IDApIC8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwkJYnJlYWs7CisJICAgIHVkZWxheSgxMDApOworCX0KKwlpZiAobiA9PSAwKSB7CisJICAgIHByaW50ZigiaTIxNTV4X3JlYWRfdnBkOiBUSU1FT1VUXG4iKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGkyMTU1eC5kZXZubywgSTIxNTVYX1ZQRF9EQVRBLCAmZGF0YVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhbTc5Yzk1eF9pZHMgW10gPSB7CisgICAgICAgIHsgUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFIH0sCisgICAgICAgIHsgfQorfTsKKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgQU1EIGV0aGVybmV0IGNvbnRyb2xsZXJzLgorICovCitpbnQgYW03OWM5NXhfaW5pdCh2b2lkKQoreworICAgIHBjaV9kZXZfdCBkZXZubzsKKyAgICBpbnQgaTsKKworICAgIC8qCisgICAgICogU2V0IGludGVycnVwdCBsaW5lIGZvciBMaW51eC4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJaWYgKChkZXZubyA9IHBjaV9maW5kX2RldmljZXMoYW03OWM5NXhfaWRzLCBpKSkgPCAwKQorCSAgICBicmVhazsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2bm8sIFBDSV9JTlRFUlJVUFRfTElORSwgMitpKTsKKyAgICB9CisgICAgaWYgKGkgPCAyKQorCXByaW50ZigiRXJyb3I6IE9ubHkgJWQgQU1EIEV0aGVybmV0IENvbnRyb2xsZXIgZm91bmQhXG4iLCBpKTsKKworICAgIHJldHVybiAwOworfQorCisKK3ZvaWQgc2V0X2xlZCh1bnNpZ25lZCBpbnQgbnVtYmVyLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24pCit7CisgICAgdm9sYXRpbGUgdTggKmFkZHI7CisKKyAgICBpZiAoKG51bWJlciA+PSAwKSAmJiAobnVtYmVyIDwgUE42Ml9MRURfTUFYKSAmJgorCShmdW5jdGlvbiA+PSAwKSAmJiAoZnVuY3Rpb24gPD0gTEVEX0xBU1RfRlVOQ1RJT04pKSB7CisJYWRkciA9ICh2b2xhdGlsZSB1OCAqKShQTjYyX0xFRF9CQVNFICsgbnVtYmVyICogOCk7CisJb3V0XzgoYWRkciwgZnVuY3Rpb24mMHhmZik7CisgICAgfQorfQorCisvKgorICogU2hvdyBmYXRhbCBlcnJvciBpbmRpY2F0ZWQgYnkgS2luZ2h0IFJpZGVyKHRtKSBlZmZlY3QKKyAqIGluIExFRFMgMC03LiBMRURTIDgtMTEgY29udGFpbiA0IGJpdCBlcnJvciBjb2RlLgorICogTm90ZTogdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0ZXJtaW5hdGUuCisgKi8KK3ZvaWQgZmF0YWxfZXJyb3IodW5zaWduZWQgaW50IGVycm9yX2NvZGUpCit7CisgICAgaW50IGksIGQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCXNldF9sZWQoaSwgTEVEXzApOworICAgIH0KKworICAgIC8qCisgICAgICogV3JpdGUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzZXRfbGVkKDgsICAoZXJyb3JfY29kZSAmIDB4MDEpID8gTEVEXzEgOiBMRURfMCk7CisgICAgc2V0X2xlZCg5LCAgKGVycm9yX2NvZGUgJiAweDAyKSA/IExFRF8xIDogTEVEXzApOworICAgIHNldF9sZWQoMTAsIChlcnJvcl9jb2RlICYgMHgwNCkgPyBMRURfMSA6IExFRF8wKTsKKyAgICBzZXRfbGVkKDExLCAoZXJyb3JfY29kZSAmIDB4MDgpID8gTEVEXzEgOiBMRURfMCk7CisKKyAgICAvKgorICAgICAqIFlheSAtIEtuaWdodCBSaWRlciBlZmZlY3QhCisgICAgICovCisgICAgd2hpbGUoMSkgeworCXVuc2lnbmVkIGludCBkZWxheSA9IDIwMDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJICAgIHNldF9sZWQoaSwgTEVEXzEpOworCSAgICBmb3IgKGQgPSAwOyBkIDwgZGVsYXk7IGQrKyk7CisJICAgIHNldF9sZWQoaSwgTEVEXzApOworCX0KKworCWZvciAoaSA9IDc7IGkgPiAwOyBpLS0pIHsKKwkgICAgc2V0X2xlZChpLCBMRURfMSk7CisJICAgIGZvciAoZCA9IDA7IGQgPCBkZWxheTsgZCsrKTsKKwkgICAgc2V0X2xlZChpLCBMRURfMCk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2JvYXJkL3BuNjIvcG42Mi5jIGIvYm9hcmQvcG42Mi9wbjYyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4NzUyNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3BuNjIvcG42Mi5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyIFdvbGZnYW5nIEdyYW5kZWdnZXIgPHdnQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzgyNHguaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworI2luY2x1ZGUgInBuNjIuaCIKKworCitzdGF0aWMgaW50IGdldF9zZXJpYWxfbnVtYmVyIChjaGFyICpzdHJpbmcsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgZ2V0X21hY19hZGRyZXNzIChpbnQgaWQsIHU4ICogbWFjLCBjaGFyICpzdHJpbmcsIGludCBzaXplKTsKKworI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKK3ZvaWQgc2hvd19ib290X3Byb2dyZXNzIChpbnQgcGhhc2UpCit7CisJLyoKKwkgKiBTaG93IHBoYXNlcyBvZiB0aGUgYm9vdG0gY29tbWFuZCBvbiB0aGUgZnJvbnQgcGFuZWwKKwkgKiBMRURzIGFuZCB0aGUgc2NyYXRjaHBhZCByZWdpc3RlciAjMyBhcyB3ZWxsLiBXZSB1c2UKKwkgKiBibGlua2luZyBMRURzIGZvciBsb2dpY2FsICIxIi4KKwkgKi8KKwlpZiAocGhhc2UgPiAwKSB7CisJCXNldF9sZWQgKDgsIChwaGFzZSAmIDB4MSkgPyBMRURfU0xPV19DTE9DSyA6IExFRF8wKTsKKwkJc2V0X2xlZCAoOSwgKHBoYXNlICYgMHgyKSA/IExFRF9TTE9XX0NMT0NLIDogTEVEXzApOworCQlzZXRfbGVkICgxMCwgKHBoYXNlICYgMHg0KSA/IExFRF9TTE9XX0NMT0NLIDogTEVEXzApOworCQlzZXRfbGVkICgxMSwgKHBoYXNlICYgMHg4KSA/IExFRF9TTE9XX0NMT0NLIDogTEVEXzApOworCX0KKwlpMjE1NXhfd3JpdGVfc2NyYXBhZCAoQk9PVF9TVEFUVVMsIHBoYXNlKTsKKwlpZiAocGhhc2UgPCAwKQorCQlpMjE1NXhfd3JpdGVfc2NyYXBhZCAoQk9PVF9ET05FLCBCT09UX0RPTkVfRVJST1IpOworfQorI2VuZGlmCisKK3ZvaWQgc2hvd19zdGFydHVwX3BoYXNlIChpbnQgcGhhc2UpCit7CisJLyoKKwkgKiBTaG93IHRoZSBwaGFzZSBvZiBVLUJvb3Qgc3RhcnR1cCBvbiB0aGUgZnJvbnQgcGFuZWwKKwkgKiBMRURzIGFuZCB0aGUgc2NyYXRjaHBhZCByZWdpc3RlciAjMyBhcyB3ZWxsLgorCSAqLworCWlmIChwaGFzZSA+IDApIHsKKwkJc2V0X2xlZCAoOCwgKHBoYXNlICYgMHgxKSA/IExFRF8xIDogTEVEXzApOworCQlzZXRfbGVkICg5LCAocGhhc2UgJiAweDIpID8gTEVEXzEgOiBMRURfMCk7CisJCXNldF9sZWQgKDEwLCAocGhhc2UgJiAweDQpID8gTEVEXzEgOiBMRURfMCk7CisJCXNldF9sZWQgKDExLCAocGhhc2UgJiAweDgpID8gTEVEXzEgOiBMRURfMCk7CisJfQorCWkyMTU1eF93cml0ZV9zY3JhcGFkIChCT09UX1NUQVRVUywgcGhhc2UpOworCWlmIChwaGFzZSA8IDApCisJCWkyMTU1eF93cml0ZV9zY3JhcGFkIChCT09UX0RPTkUsIEJPT1RfRE9ORV9FUlJPUik7Cit9CisKK2ludCBjaGVja2JvYXJkICh2b2lkKQoreworCXNob3dfc3RhcnR1cF9waGFzZSAoMSk7CisJcHV0cyAoIkJvYXJkOiBQTjYyXG4iKTsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBpbnQgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQoreworCWludCBpLCBjbnQ7CisJdm9sYXRpbGUgdWNoYXIgKmJhc2UgPSBDRkdfU0RSQU1fQkFTRTsKKwl2b2xhdGlsZSB1bG9uZyAqYWRkcjsKKwl1bG9uZyBzYXZlWzMyXTsKKwl1bG9uZyB2YWwsIHJldCA9IDA7CisKKwlzaG93X3N0YXJ0dXBfcGhhc2UgKDIpOworCisJZm9yIChpID0gMCwgY250ID0gKENGR19NQVhfUkFNX1NJWkUgLyBzaXplb2YgKGxvbmcpKSA+PiAxOyBjbnQgPiAwOworCQkgY250ID4+PSAxKSB7CisJCWFkZHIgPSAodm9sYXRpbGUgdWxvbmcgKikgYmFzZSArIGNudDsKKwkJc2F2ZVtpKytdID0gKmFkZHI7CisJCSphZGRyID0gfmNudDsKKwl9CisKKwlhZGRyID0gKHZvbGF0aWxlIHVsb25nICopIGJhc2U7CisJc2F2ZVtpXSA9ICphZGRyOworCSphZGRyID0gMDsKKworCWlmICgqYWRkciAhPSAwKSB7CisJCSphZGRyID0gc2F2ZVtpXTsKKwkJZ290byBEb25lOworCX0KKworCWZvciAoY250ID0gMTsgY250IDw9IENGR19NQVhfUkFNX1NJWkUgLyBzaXplb2YgKGxvbmcpOyBjbnQgPDw9IDEpIHsKKwkJYWRkciA9ICh2b2xhdGlsZSB1bG9uZyAqKSBiYXNlICsgY250OworCQl2YWwgPSAqYWRkcjsKKwkJKmFkZHIgPSBzYXZlWy0taV07CisJCWlmICh2YWwgIT0gfmNudCkgeworCQkJdWxvbmcgbmV3X2JhbmswX2VuZCA9IGNudCAqIHNpemVvZiAobG9uZykgLSAxOworCQkJdWxvbmcgbWVhcjEgPSBtcGM4MjR4X21wYzEwN19nZXRyZWcgKE1FQVIxKTsKKwkJCXVsb25nIGVtZWFyMSA9IG1wYzgyNHhfbXBjMTA3X2dldHJlZyAoRU1FQVIxKTsKKworCQkJbWVhcjEgPSAobWVhcjEgJiAweEZGRkZGRjAwKSB8CisJCQkJCSgobmV3X2JhbmswX2VuZCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpOworCQkJZW1lYXIxID0gKGVtZWFyMSAmIDB4RkZGRkZGMDApIHwKKwkJCQkJKChuZXdfYmFuazBfZW5kICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpOworCQkJbXBjODI0eF9tcGMxMDdfc2V0cmVnIChNRUFSMSwgbWVhcjEpOworCQkJbXBjODI0eF9tcGMxMDdfc2V0cmVnIChFTUVBUjEsIGVtZWFyMSk7CisKKwkJCXJldCA9IGNudCAqIHNpemVvZiAobG9uZyk7CisJCQlnb3RvIERvbmU7CisJCX0KKwl9CisKKwlyZXQgPSBDRkdfTUFYX1JBTV9TSVpFOworICBEb25lOgorCXNob3dfc3RhcnR1cF9waGFzZSAoMyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgUENJIERldmljZXMuIFdlIHJlbHkgb24gYXV0by1jb25maWd1cmF0aW9uLgorICovCisjaWZuZGVmIENPTkZJR19QQ0lfUE5QCisjZXJyb3IgIkNPTkZJR19QQ0lfUE5QIGlzIG5vdCBkZWZpbmVkLCBwbGVhc2UgY29ycmVjdCEiCisjZW5kaWYKKworc3RydWN0IHBjaV9jb250cm9sbGVyIGhvc2UgPSB7Cit9OworCit2b2lkIHBjaV9pbml0ICh2b2lkKQoreworCXNob3dfc3RhcnR1cF9waGFzZSAoNCk7CisJcGNpX21wYzgyNHhfaW5pdCAoJmhvc2UpOworCisJc2hvd19zdGFydHVwX3BoYXNlICg1KTsKKwlpMjE1NXhfaW5pdCAoKTsKKwlzaG93X3N0YXJ0dXBfcGhhc2UgKDYpOworCWFtNzljOTV4X2luaXQgKCk7CisJc2hvd19zdGFydHVwX3BoYXNlICg3KTsKK30KKworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJY2hhciBzdHJbMjBdOworCXU4IG1hY1s2XTsKKworCXNob3dfc3RhcnR1cF9waGFzZSAoOCk7CisJLyoKKwkgKiBHZXQgc2VyaWFsIG51bWJlciBhbmQgZXRoZXJuZXQgYWRkcmVzc2VzIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQKKwkgKiBhbmQgdXBkYXRlIHRoZSBib2FyZCBpbmZvIHN0cnVjdHVyZSBhbmQgdGhlIGVudmlyb25tZW50LgorCSAqLworCWlmIChnZXRlbnYgKCJzZXJpYWwjIikgPT0gTlVMTCAmJgorCQlnZXRfc2VyaWFsX251bWJlciAoc3RyLCBzdHJsZW4gKHN0cikpID4gMCkgeworCQlzZXRlbnYgKCJzZXJpYWwjIiwgc3RyKTsKKwl9CisJc2hvd19zdGFydHVwX3BoYXNlICg5KTsKKworCWlmIChnZXRlbnYgKCJldGhhZGRyIikgPT0gTlVMTCAmJgorCQlnZXRfbWFjX2FkZHJlc3MgKDAsIG1hYywgc3RyLCBzaXplb2YgKHN0cikpID4gMCkgeworCQlzZXRlbnYgKCJldGhhZGRyIiwgc3RyKTsKKwkJbWVtY3B5IChnZC0+YmQtPmJpX2VuZXRhZGRyLCBtYWMsIDYpOworCX0KKwlzaG93X3N0YXJ0dXBfcGhhc2UgKDEwKTsKKworCWlmIChnZXRlbnYgKCJldGgxYWRkciIpID09IE5VTEwgJiYKKwkJZ2V0X21hY19hZGRyZXNzICgxLCBtYWMsIHN0ciwgc2l6ZW9mIChzdHIpKSA+IDApIHsKKwkJc2V0ZW52ICgiZXRoMWFkZHIiLCBzdHIpOworCQltZW1jcHkgKGdkLT5iZC0+YmlfZW5ldDFhZGRyLCBtYWMsIDYpOworCX0KKwlzaG93X3N0YXJ0dXBfcGhhc2UgKDExKTsKKworCS8qIFRlbGwgZXZlcnlib2R5IHRoYXQgVS1Cb290IGlzIHVwIGFuZCBydW5uaWcgKi8KKwlpMjE1NXhfd3JpdGVfc2NyYXBhZCAoMCwgMHgxMjM0NTY3OCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBnZXRfc2VyaWFsX251bWJlciAoY2hhciAqc3RyaW5nLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKwljaGFyIGM7CisKKwlpZiAoc2l6ZSA8IEkyMTU1WF9WUERfU05fU0laRSkKKwkJc2l6ZSA9IEkyMTU1WF9WUERfU05fU0laRTsKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemUgLSAxKTsgaSsrKSB7CisJCWkyMTU1eF9yZWFkX3ZwZCAoSTIxNTVYX1ZQRF9TTl9TVEFSVCArIGksIDEsICZjKTsKKwkJaWYgKGMgPT0gJ1wwJykKKwkJCWJyZWFrOworCQlzdHJpbmdbaV0gPSBjOworCX0KKwlzdHJpbmdbaV0gPSAnXDAnOwkJCS8qIG1ha2Ugc3VyZSBpdCdzIHRlcm1pbmF0ZWQgKi8KKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGdldF9tYWNfYWRkcmVzcyAoaW50IGlkLCB1OCAqIG1hYywgY2hhciAqc3RyaW5nLCBpbnQgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA8IDYgKiAzKQorCQlyZXR1cm4gLTE7CisKKwlpMjE1NXhfcmVhZF92cGQgKEkyMTU1WF9WUERfTUFDMF9TVEFSVCArIDYgKiBpZCwgNiwgbWFjKTsKKwlyZXR1cm4gc3ByaW50ZiAoc3RyaW5nLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sCisJCQkJbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9yMzYwbXBpL3IzNjBtcGkuYyBiL2JvYXJkL3IzNjBtcGkvcjM2MG1waS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3Yjg4NzMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9yMzYwbXBpL3IzNjBtcGkuYwpAQCAtMCwwICsxLDQyMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjaW5jbHVkZSA8aTJjLmg+CisKKyNpbmNsdWRlIDxjb21tcHJvYy5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxjbWRfYnNwLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAgICAgICAvKiBmb3Igc3RyZHVwICovCisKKworLyoKKyAqICBNZW1vcnkgQ29udHJvbGxlciBVc2luZworICoKKyAqICBDUzAgLSBGbGFzaCBtZW1vcnkgICAgICAgICAgICAoMHg0MDAwMDAwMCkKKyAqICBDUzEgLSBTRFJBTSAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMH0KKyAqICBDUzIgLQorICogIENTMyAtCisgKiAgQ1M0IC0KKyAqICBDUzUgLQorICogIENTNiAtIFBDTUNJQSBkZXZpY2UKKyAqICBDUzcgLSBQQ01DSUEgZGV2aWNlCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIF9ub3RfdXNlZF8JMHhmZmZmZmZmZgorCitjb25zdCB1aW50IHNkcmFtX3RhYmxlW109Cit7CisgICAgICAgIC8qIHNpbmdsZSByZWFkLiAob2Zmc2V0IDAgaW4gdXBtIFJBTSkgKi8KKyAgICAgICAgMHgxZjA3ZmMwNCwgMHhlZWFlZmMwNCwgMHgxMWFkZmMwNCwgMHhlZmJiYmMwMCwKKyAgICAgICAgMHgxZmY3N2M0NywKKworICAgICAgICAvKiBNUlMgaW5pdGlhbGl6YXRpb24gKG9mZnNldCA1KSAqLworCisgICAgICAgIDB4MWZmNzdjMzQsIDB4ZWZlYWJjMzQsIDB4MWZiNTdjMzUsCisKKyAgICAgICAgLyogYnVyc3QgcmVhZC4gKG9mZnNldCA4IGluIHVwbSBSQU0pICovCisgICAgICAgIDB4MWYwN2ZjMDQsIDB4ZWVhZWZjMDQsIDB4MTBhZGZjMDQsIDB4ZjBhZmZjMDAsCisgICAgICAgIDB4ZjBhZmZjMDAsIDB4ZjFhZmZjMDAsIDB4ZWZiYmJjMDAsIDB4MWZmNzdjNDcsCisgICAgICAgIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sCisgICAgICAgIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sCisKKyAgICAgICAgLyogc2luZ2xlIHdyaXRlLiAob2Zmc2V0IDE4IGluIHVwbSBSQU0pICovCisgICAgICAgIDB4MWYyN2ZjMDQsIDB4ZWVhZWJjMDAsIDB4MDFiOTNjMDQsIDB4MWZmNzdjNDcsCisgICAgICAgIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sCisKKyAgICAgICAgLyogYnVyc3Qgd3JpdGUuIChvZmZzZXQgMjAgaW4gdXBtIFJBTSkgKi8KKyAgICAgICAgMHgxZjA3ZmMwNCwgMHhlZWFlYmMwMCwgMHgxMGFkN2MwMCwgMHhmMGFmZmMwMCwKKyAgICAgICAgMHhmMGFmZmMwMCwgMHhlMWJiYmMwNCwgMHgxZmY3N2M0NywgX25vdF91c2VkXywKKyAgICAgICAgX25vdF91c2VkXywgX25vdF91c2VkXywgX25vdF91c2VkXywgX25vdF91c2VkXywKKyAgICAgICAgX25vdF91c2VkXywgX25vdF91c2VkXywgX25vdF91c2VkXywgX25vdF91c2VkXywKKworICAgICAgICAvKiByZWZyZXNoLiAob2Zmc2V0IDMwIGluIHVwbSBSQU0pICovCisgICAgICAgIDB4MWZmNWZjODQsIDB4ZmZmZmZjMDQsIDB4ZmZmZmZjMDQsIDB4ZmZmZmZjMDQsCisgICAgICAgIDB4ZmZmZmZjODQsIDB4ZmZmZmZjMDcsIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sCisgICAgICAgIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sCisKKyAgICAgICAgLyogZXhjZXB0aW9uLiAob2Zmc2V0IDNjIGluIHVwbSBSQU0pICovCisgICAgICAgIDB4N2ZmZmZjMDcsIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8sIF9ub3RfdXNlZF8gfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogQ2hlY2sgQm9hcmQgSWRlbnRpdHk6CisgKi8KKworaW50IGNoZWNrYm9hcmQgKHZvaWQpCit7CisJcHV0cyAoIkJvYXJkOiBSMzYwIE1QSSBCb2FyZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGxvbmcgaW50IGRyYW1fc2l6ZSAobG9uZyBpbnQsIGxvbmcgaW50ICosIGxvbmcgaW50KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBtZW1jdGw4eHhfdCAqbWVtY3RsID0gJmltbWFwLT5pbV9tZW1jdGw7CisJbG9uZyBpbnQgc2l6ZTgsIHNpemU5OworCWxvbmcgaW50IHNpemVfYjAgPSAwOworCXVuc2lnbmVkIGxvbmcgcmVnOworCisJdXBtY29uZmlnIChVUE1BLCAodWludCAqKSBzZHJhbV90YWJsZSwKKwkJCSAgIHNpemVvZiAoc2RyYW1fdGFibGUpIC8gc2l6ZW9mICh1aW50KSk7CisKKwkvKgorCSAqIFByZWxpbWluYXJ5IHByZXNjYWxlciBmb3IgcmVmcmVzaCAoZGVwZW5kcyBvbiBudW1iZXIgb2YKKwkgKiBiYW5rcyk6IFRoaXMgdmFsdWUgaXMgc2VsZWN0ZWQgZm9yIGZvdXIgY3ljbGVzIGV2ZXJ5IDYyLjQgdXMKKwkgKiB3aXRoIHR3byBTRFJBTSBiYW5rcyBvciBmb3VyIGN5Y2xlcyBldmVyeSAzMS4yIHVzIHdpdGggb25lCisJICogYmFuay4gSXQgd2lsbCBiZSBhZGp1c3RlZCBhZnRlciBtZW1vcnkgc2l6aW5nLgorCSAqLworCW1lbWN0bC0+bWVtY19tcHRwciA9IENGR19NUFRQUl8yQktfOEs7CisKKwltZW1jdGwtPm1lbWNfbWFyID0gMHgwMDAwMDA4ODsKKworCS8qCisJICogTWFwIGNvbnRyb2xsZXIgYmFuayAxIHRvIHRoZSBTRFJBTSBiYW5rIGF0CisJICogcHJlbGltaW5hcnkgYWRkcmVzcyAtIHRoZXNlIGhhdmUgdG8gYmUgbW9kaWZpZWQgYWZ0ZXIgdGhlCisJICogU0RSQU0gc2l6ZSBoYXMgYmVlbiBkZXRlcm1pbmVkLgorCSAqLworCW1lbWN0bC0+bWVtY19vcjEgPSBDRkdfT1IxX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIxID0gQ0ZHX0JSMV9QUkVMSU07CisKKwltZW1jdGwtPm1lbWNfbWFtciA9IENGR19NQU1SXzhDT0wgJiAofihNQU1SX1BUQUUpKTsJLyogbm8gcmVmcmVzaCB5ZXQgKi8KKworCXVkZWxheSAoMjAwKTsKKworCS8qIHBlcmZvcm0gU0RSQU0gaW5pdGlhbGl6c2F0aW9uIHNlcXVlbmNlICovCisKKwltZW1jdGwtPm1lbWNfbWNyID0gMHg4MDAwMjEwNTsJLyogU0RSQU0gYmFuayAwICovCisJdWRlbGF5ICgyMDApOworCW1lbWN0bC0+bWVtY19tY3IgPSAweDgwMDAyMjMwOwkvKiBTRFJBTSBiYW5rIDAgLSBleGVjdXRlIHR3aWNlICovCisJdWRlbGF5ICgyMDApOworCisJbWVtY3RsLT5tZW1jX21hbXIgfD0gTUFNUl9QVEFFOwkvKiBlbmFibGUgcmVmcmVzaCAqLworCisJdWRlbGF5ICgxMDAwKTsKKworCS8qCisJICogQ2hlY2sgQmFuayAwIE1lbW9yeSBTaXplIGZvciByZS1jb25maWd1cmF0aW9uCisJICoKKwkgKiB0cnkgOCBjb2x1bW4gbW9kZQorCSAqLworCXNpemU4ID0gZHJhbV9zaXplIChDRkdfTUFNUl84Q09MLCAodWxvbmcgKikgU0RSQU1fQkFTRTFfUFJFTElNLAorCQkJCQkgICBTRFJBTV9NQVhfU0laRSk7CisKKwl1ZGVsYXkgKDEwMDApOworCisJLyoKKwkgKiB0cnkgOSBjb2x1bW4gbW9kZQorCSAqLworCXNpemU5ID0gZHJhbV9zaXplIChDRkdfTUFNUl85Q09MLCAodWxvbmcgKikgU0RSQU1fQkFTRTFfUFJFTElNLAorCQkJCQkgICBTRFJBTV9NQVhfU0laRSk7CisKKwlpZiAoc2l6ZTggPCBzaXplOSkgewkJLyogbGVhdmUgY29uZmlndXJhdGlvbiBhdCA5IGNvbHVtbnMgKi8KKwkJc2l6ZV9iMCA9IHNpemU5OworLyoJZGVidWcgKCJTRFJBTSBCYW5rIDAgaW4gOSBjb2x1bW4gbW9kZTogJWxkIE1CXG4iLCBzaXplID4+IDIwKTsJKi8KKwl9IGVsc2UgewkJCQkJLyogYmFjayB0byA4IGNvbHVtbnMgICAgICAgICAgICAqLworCQlzaXplX2IwID0gc2l6ZTg7CisJCW1lbWN0bC0+bWVtY19tYW1yID0gQ0ZHX01BTVJfOENPTDsKKwkJdWRlbGF5ICg1MDApOworLyoJZGVidWcgKCJTRFJBTSBCYW5rIDAgaW4gOCBjb2x1bW4gbW9kZTogJWxkIE1CXG4iLCBzaXplID4+IDIwKTsJKi8KKwl9CisKKwl1ZGVsYXkgKDEwMDApOworCisJLyoKKwkgKiBBZGp1c3QgcmVmcmVzaCByYXRlIGRlcGVuZGluZyBvbiBTRFJBTSB0eXBlLCBib3RoIGJhbmtzCisJICogRm9yIHR5cGVzID4gMTI4IE1CaXQgbGVhdmUgaXQgYXQgdGhlIGN1cnJlbnQgKGZhc3QpIHJhdGUKKwkgKi8KKwlpZiAoKHNpemVfYjAgPCAweDAyMDAwMDAwKSkgeworCQkvKiByZWR1Y2UgdG8gMTUuNiB1cyAoNjIuNCB1cyAvIHF1YWQpICovCisJCW1lbWN0bC0+bWVtY19tcHRwciA9IENGR19NUFRQUl8yQktfNEs7CisJCXVkZWxheSAoMTAwMCk7CisJfQorCisJLyoKKwkgKiBGaW5hbCBtYXBwaW5nCisJICovCisKKwltZW1jdGwtPm1lbWNfb3IxID0gKCgtc2l6ZV9iMCkgJiAweEZGRkYwMDAwKSB8IENGR19PUl9USU1JTkdfU0RSQU07CisJbWVtY3RsLT5tZW1jX2JyMSA9IChDRkdfU0RSQU1fQkFTRSAmIEJSX0JBX01TSykgfCBCUl9NU19VUE1BIHwgQlJfVjsKKworCS8qIGFkanVzdCByZWZyZXNoIHJhdGUgZGVwZW5kaW5nIG9uIFNEUkFNIHR5cGUsIG9uZSBiYW5rICovCisJcmVnID0gbWVtY3RsLT5tZW1jX21wdHByOworCXJlZyA+Pj0gMTsJCS8qIHJlZHVjZSB0byBDRkdfTVBUUFJfMUJLXzhLIC8gXzRLICovCisJbWVtY3RsLT5tZW1jX21wdHByID0gcmVnOworCisJdWRlbGF5ICgxMDAwMCk7CisKKwlyZXR1cm4gKHNpemVfYjApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBDaGVjayBtZW1vcnkgcmFuZ2UgZm9yIHZhbGlkIFJBTS4gQSBzaW1wbGUgbWVtb3J5IHRlc3QgZGV0ZXJtaW5lcworICogdGhlIGFjdHVhbGx5IGF2YWlsYWJsZSBSQU0gc2l6ZSBiZXR3ZWVuIGFkZHJlc3NlcyBgYmFzZScgYW5kCisgKiBgYmFzZSArIG1heHNpemUnLiBTb21lIChub3QgYWxsKSBoYXJkd2FyZSBlcnJvcnMgYXJlIGRldGVjdGVkOgorICogLSBzaG9ydCBiZXR3ZWVuIGFkZHJlc3MgbGluZXMKKyAqIC0gc2hvcnQgYmV0d2VlbiBkYXRhIGxpbmVzCisgKi8KKworc3RhdGljIGxvbmcgaW50IGRyYW1fc2l6ZSAobG9uZyBpbnQgbWFtcl92YWx1ZSwgbG9uZyBpbnQgKmJhc2UsCisJCQkJCQkgICBsb25nIGludCBtYXhzaXplKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOworCXZvbGF0aWxlIGxvbmcgaW50ICphZGRyOworCXVsb25nIGNudCwgdmFsOworCXVsb25nIHNhdmVbMzJdOwkJCS8qIHRvIG1ha2UgdGVzdCBub24tZGVzdHJ1Y3RpdmUgKi8KKwl1bnNpZ25lZCBjaGFyIGkgPSAwOworCisJbWVtY3RsLT5tZW1jX21hbXIgPSBtYW1yX3ZhbHVlOworCisJZm9yIChjbnQgPSBtYXhzaXplIC8gc2l6ZW9mIChsb25nKTsgY250ID4gMDsgY250ID4+PSAxKSB7CisJCWFkZHIgPSBiYXNlICsgY250OwkvKiBwb2ludGVyIGFyaXRoISAqLworCisJCXNhdmVbaSsrXSA9ICphZGRyOworCQkqYWRkciA9IH5jbnQ7CisJfQorCisJLyogd3JpdGUgMCB0byBiYXNlIGFkZHJlc3MgKi8KKwlhZGRyID0gYmFzZTsKKwlzYXZlW2ldID0gKmFkZHI7CisJKmFkZHIgPSAwOworCisJLyogY2hlY2sgYXQgYmFzZSBhZGRyZXNzICovCisJaWYgKCh2YWwgPSAqYWRkcikgIT0gMCkgeworCQkqYWRkciA9IHNhdmVbaV07CisJCXJldHVybiAoMCk7CisJfQorCisJZm9yIChjbnQgPSAxOyBjbnQgPD0gbWF4c2l6ZSAvIHNpemVvZiAobG9uZyk7IGNudCA8PD0gMSkgeworCQlhZGRyID0gYmFzZSArIGNudDsJLyogcG9pbnRlciBhcml0aCEgKi8KKwkJdmFsID0gKmFkZHI7CisJCSphZGRyID0gc2F2ZVstLWldOworCisJCWlmICh2YWwgIT0gKH5jbnQpKSB7CisJCQlyZXR1cm4gKGNudCAqIHNpemVvZiAobG9uZykpOworCQl9CisJfQorCXJldHVybiAobWF4c2l6ZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCByMzYwX3B3bV93cml0ZSAodWNoYXIgcmVnLCB1Y2hhciB2YWwpCit7CisJaWYgKGkyY193cml0ZSAoQ0ZHX0kyQ19QV01fQUREUiwgcmVnLCAxLCAmdmFsLCAxKSkgeworCQlwcmludGYgKCJDYW4ndCB3cml0ZSBQV00gcmVnaXN0ZXIgMHglMDJYLlxuIiwgcmVnKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogS2V5Ym9hcmQgQ29udHJvbGxlcgorICovCisKKy8qIE51bWJlciBvZiBieXRlcyByZXR1cm5lZCBmcm9tIEtleWJvYXJkIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgS0VZQkRfS0VZX01BWAkJMjAJCQkJLyogbWF4aW11bSBrZXkgbnVtYmVyICovCisjZGVmaW5lIEtFWUJEX0RBVEFMRU4JCSgoS0VZQkRfS0VZX01BWCArIDcpIC8gOCkJLyogbm9ybWFsIGtleSBzY2FuIGRhdGEgKi8KKworc3RhdGljIHVjaGFyIGtiZF9hZGRyID0gQ0ZHX0kyQ19LQkRfQUREUjsKKworc3RhdGljIHVjaGFyICprZXlfbWF0Y2ggKHVjaGFyICopOworCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJdWNoYXIga2JkX2RhdGFbS0VZQkRfREFUQUxFTl07CisJdWNoYXIga2V5YmRfZW52WzIgKiBLRVlCRF9EQVRBTEVOICsgMV07CisJdWNoYXIgKnN0cjsKKwlpbnQgaTsKKworCWkyY19pbml0IChDRkdfSTJDX1NQRUVELCBDRkdfSTJDX1NMQVZFKTsKKworCWkyY19yZWFkIChrYmRfYWRkciwgMCwgMCwga2JkX2RhdGEsIEtFWUJEX0RBVEFMRU4pOworCisJZm9yIChpID0gMDsgaSA8IEtFWUJEX0RBVEFMRU47ICsraSkgeworCQlzcHJpbnRmIChrZXliZF9lbnYgKyBpICsgaSwgIiUwMlgiLCBrYmRfZGF0YVtpXSk7CisJfQorCXNldGVudiAoImtleWJkIiwga2V5YmRfZW52KTsKKworCXN0ciA9IHN0cmR1cCAoa2V5X21hdGNoIChrYmRfZGF0YSkpOwkvKiBkZWNvZGUga2V5cyAqLworCisjaWZkZWYgQ09ORklHX1BSRUJPT1QJLyogYXV0b21hdGljYWxseSBjb25maWd1cmUgInByZWJvb3QiIGNvbW1hbmQgb24ga2V5IG1hdGNoICovCisJc2V0ZW52ICgicHJlYm9vdCIsIHN0cik7CS8qIHNldCBvciBkZWxldGUgZGVmaW5pdGlvbiAqLworI2VuZGlmIC8qIENPTkZJR19QUkVCT09UICovCisJaWYgKHN0ciAhPSBOVUxMKSB7CisJCWZyZWUgKHN0cik7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2hlY2sgaWYgcHJlc3NlZCBrZXkocykgbWF0Y2ggbWFnaWMgc2VxdWVuY2UsCisgKiBhbmQgcmV0dXJuIHRoZSBjb21tYW5kIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhhdCBrZXkocykuCisgKgorICogSWYgbm8ga2V5IHByZXNzIHdhcyBkZWNvZGVkLCBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIE5vdGU6IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGFyZ3VtZW50IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aAorICogdGhlICJtYWdpYyBjaGFyY3RlciBjb2RlIiBvZiB0aGUgZGVjb2RlZCBrZXkocyksIG9yICdcMCcuCisgKgorICoKKyAqIE5vdGU6IHRoZSBzdHJpbmcgcG9pbnRzIHRvIHN0YXRpYyBlbnZpcm9ubWVudCBkYXRhIGFuZCBtdXN0IGJlCisgKiBzYXZlZCBiZWZvcmUgeW91IGNhbGwgYW55IGZ1bmN0aW9uIHRoYXQgbW9kaWZpZXMgdGhlIGVudmlyb25tZW50LgorICovCisjaWZkZWYgQ09ORklHX1BSRUJPT1QKKworc3RhdGljIHVjaGFyIGtiZF9tYWdpY19wcmVmaXhbXSA9ICJrZXlfbWFnaWMiOworc3RhdGljIHVjaGFyIGtiZF9jb21tYW5kX3ByZWZpeFtdID0gImtleV9jbWQiOworCitzdGF0aWMgdWNoYXIgKmtleV9tYXRjaCAodWNoYXIgKiBrYmRfZGF0YSkKK3sKKwl1Y2hhciBjb21wYXJlW0tFWUJEX0RBVEFMRU5dOworCXVjaGFyIG1hZ2ljW3NpemVvZiAoa2JkX21hZ2ljX3ByZWZpeCkgKyAxXTsKKwl1Y2hhciBjbWRfbmFtZVtzaXplb2YgKGtiZF9jb21tYW5kX3ByZWZpeCkgKyAxXTsKKwl1Y2hhciBrZXlfbWFzazsKKwl1Y2hhciAqc3RyLCAqbnh0LCAqc3VmZml4OworCXVjaGFyICprYmRfbWFnaWNfa2V5czsKKwljaGFyICpjbWQ7CisJaW50IGk7CisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgc3RyaW5nIGRlZmluZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCBjYW4gcGUgYXBwZW5kZWQKKwkgKiB0byAia2V5X21hZ2ljIiB0byBmb3JtIHRoZSBuYW1lcyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdAorCSAqIGhvbGQgIm1hZ2ljIiBrZXkgY29kZXMsIGkuIGUuIHN1Y2gga2V5IGNvZGVzIHRoYXQgY2FuIGNhdXNlCisJICogcHJlLWJvb3QgYWN0aW9ucy4gSWYgdGhlIHN0cmluZyBpcyBlbXB0eSAoIiIpLCB0aGVuIG9ubHkKKwkgKiAia2V5X21hZ2ljIiBpcyBjaGVja2VkIChvbGQgYmVoYXZpb3VyKTsgdGhlIHN0cmluZyAiMTI1IiBjYXVzZXMKKwkgKiBjaGVja3MgZm9yICJrZXlfbWFnaWMxIiwgImtleV9tYWdpYzIiIGFuZCAia2V5X21hZ2ljNSIsIGV0Yy4KKwkgKi8KKwlpZiAoKGtiZF9tYWdpY19rZXlzID0gZ2V0ZW52ICgibWFnaWNfa2V5cyIpKSA9PSBOVUxMKQorCQlrYmRfbWFnaWNfa2V5cyA9ICIiOworCisJLyogbG9vcCBvdmVyIGFsbCBtYWdpYyBrZXlzOworCSAqIHVzZSAnXDAnIHN1ZmZpeCBpbiBjYXNlIG9mIGVtcHR5IHN0cmluZworCSAqLworCWZvciAoc3VmZml4PWtiZF9tYWdpY19rZXlzOyAqc3VmZml4IHx8IHN1ZmZpeD09a2JkX21hZ2ljX2tleXM7ICsrc3VmZml4KSB7CisJCXNwcmludGYgKG1hZ2ljLCAiJXMlYyIsIGtiZF9tYWdpY19wcmVmaXgsICpzdWZmaXgpOworI2lmIDAKKwkJcHJpbnRmICgiIyMjIENoZWNrIG1hZ2ljIFwiJXNcIlxuIiwgbWFnaWMpOworI2VuZGlmCisKKwkJbWVtY3B5KGNvbXBhcmUsIGtiZF9kYXRhLCBLRVlCRF9EQVRBTEVOKTsKKworCQlmb3IgKHN0ciA9IGdldGVudihtYWdpYyk7IHN0ciAhPSBOVUxMOyBzdHIgPSAoKm54dCkgPyBueHQrMSA6IG54dCkgeworCQkJdWNoYXIgYzsKKworCQkJYyA9ICh1Y2hhcikgc2ltcGxlX3N0cnRvdWwgKHN0ciwgKGNoYXIgKiopICgmbnh0KSwgMTYpOworCisJCQlpZiAoc3RyID09IG54dCkJCQkJLyogaW52YWxpZCBjaGFyYWN0ZXIgKi8KKwkJCQlicmVhazsKKworCQkJaWYgKGMgPj0gS0VZQkRfS0VZX01BWCkJCQkvKiBiYWQga2V5IG51bWJlciAqLworCQkJCWdvdG8gbmV4dF9tYWdpYzsKKworCQkJa2V5X21hc2sgPSAweDgwID4+IChjICUgOCk7CisKKwkJCWlmICghKGNvbXBhcmVbYyAvIDhdICYga2V5X21hc2spKQkvKiBrZXkgbm90IHByZXNzZWQgKi8KKwkJCQlnb3RvIG5leHRfbWFnaWM7CisKKwkJCWNvbXBhcmVbYyAvIDhdICY9IH5rZXlfbWFzazsKKwkJfQorCisJCWZvciAoaT0wOyBpPEtFWUJEX0RBVEFMRU47IGkrKykKKwkJCWlmIChjb21wYXJlW2ldKQkJCS8qIGtleShzKSBub3QgcmVsZWFzZWQgKi8KKwkJCQlnb3RvIG5leHRfbWFnaWM7CisKKwkJc3ByaW50ZiAoY21kX25hbWUsICIlcyVjIiwga2JkX2NvbW1hbmRfcHJlZml4LCAqc3VmZml4KTsKKworCQljbWQgPSBnZXRlbnYgKGNtZF9uYW1lKTsKKyNpZiAwCisJCXByaW50ZiAoIiMjIyBTZXQgUFJFQk9PVCB0byAkKCVzKTogXCIlc1wiXG4iLAorCQkJY21kX25hbWUsIGNtZCA/IGNtZCA6ICI8PE5VTEw+PiIpOworI2VuZGlmCisJCSprYmRfZGF0YSA9ICpzdWZmaXg7CisJCXJldHVybiAoY21kKTsKKworCW5leHRfbWFnaWM6OworCX0KKyNpZiAwCisJcHJpbnRmICgiIyMjIERlbGV0ZSBQUkVCT09UXG4iKTsKKyNlbmRpZgorCSprYmRfZGF0YSA9ICdcMCc7CisJcmV0dXJuIChOVUxMKTsKK30KKyNlbmRpZgkJCQkJCQkvKiBDT05GSUdfUFJFQk9PVCAqLworCisvKiBSZWFkIEtleWJvYXJkIHN0YXR1cyAqLworaW50IGRvX2tiZCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVjaGFyIGtiZF9kYXRhW0tFWUJEX0RBVEFMRU5dOworCXVjaGFyIGtleWJkX2VudlsyICogS0VZQkRfREFUQUxFTiArIDFdOworCWludCBpOworCisJaTJjX2luaXQgKENGR19JMkNfU1BFRUQsIENGR19JMkNfU0xBVkUpOworCisJLyogUmVhZCBrZXlzICovCisJaTJjX3JlYWQgKGtiZF9hZGRyLCAwLCAwLCBrYmRfZGF0YSwgS0VZQkRfREFUQUxFTik7CisKKwlwdXRzICgiS2V5czoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgS0VZQkRfREFUQUxFTjsgKytpKSB7CisJCXNwcmludGYgKGtleWJkX2VudiArIGkgKyBpLCAiJTAyWCIsIGtiZF9kYXRhW2ldKTsKKwkJcHJpbnRmICgiICUwMngiLCBrYmRfZGF0YVtpXSk7CisJfQorCXB1dGMgKCdcbicpOworCXNldGVudiAoImtleWJkIiwga2V5YmRfZW52KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3NhY3NuZy9jbGtpbml0LmMgYi9ib2FyZC9zYWNzbmcvY2xraW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlODUxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYWNzbmcvY2xraW5pdC5jCkBAIC0wLDAgKzEsODg0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBDdXN0b20gSURFQVMsIEluYy4gPHd3dy5jaWRlYXMuY29tPgorICogSm9uIERpZWtlbWEgPGRpZWtlbWFAY2lkZWFzLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8aW9wb3J0cy5oPgorI2luY2x1ZGUgPG1wYzgyNjAuaD4KKyNpbmNsdWRlIDxhc20vY3BtXzgyNjAuaD4KKyNpbmNsdWRlIDxjb25maWdzL3NhY3NuZy5oPgorCisjaW5jbHVkZSAiY2xraW5pdC5oIgorCitpbnQgRGFxNjR4U2FtcGxpbmcgPSAwOworCisKK3ZvaWQgRGFxX0JSR19SZXNldCh1aW50IGJyZykKK3sKKyAgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisgICAgIHZvbGF0aWxlIHVpbnQgKmJyZ19wdHI7CisKKyAgICAgYnJnX3B0ciA9ICh1aW50ICopJmltbXItPmltX2JyZ2MxOworCisgICAgIGlmIChicmcgPj0gNSkgeworICAgICAgICAgYnJnX3B0ciA9ICh1aW50ICopJmltbXItPmltX2JyZ2M1OworICAgICAgICAgYnJnIC09IDQ7CisgICAgIH0KKyAgICAgYnJnX3B0ciArPSBicmc7CisgICAgICpicmdfcHRyIHw9ICBDUE1fQlJHX1JTVDsKKyAgICAgKmJyZ19wdHIgJj0gfkNQTV9CUkdfUlNUOworfQorCit2b2lkIERhcV9CUkdfRGlzYWJsZSh1aW50IGJyZykKK3sKKyAgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisgICAgIHZvbGF0aWxlIHVpbnQgKmJyZ19wdHI7CisKKyAgICAgYnJnX3B0ciA9ICh1aW50ICopJmltbXItPmltX2JyZ2MxOworCisgICAgIGlmIChicmcgPj0gNSkgeworICAgICAgICAgYnJnX3B0ciA9ICh1aW50ICopJmltbXItPmltX2JyZ2M1OworICAgICAgICAgYnJnIC09IDQ7CisgICAgIH0KKyAgICAgYnJnX3B0ciArPSBicmc7CisgICAgICpicmdfcHRyICY9IH5DUE1fQlJHX0VOOworfQorCit2b2lkIERhcV9CUkdfRW5hYmxlKHVpbnQgYnJnKQoreworICAgICB2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKyAgICAgdm9sYXRpbGUgdWludCAqYnJnX3B0cjsKKworICAgICBicmdfcHRyID0gKHVpbnQgKikmaW1tci0+aW1fYnJnYzE7CisgICAgIGlmIChicmcgPj0gNSkgeworICAgICAgICAgYnJnX3B0ciA9ICh1aW50ICopJmltbXItPmltX2JyZ2M1OworICAgICAgICAgYnJnIC09IDQ7CisgICAgIH0KKyAgICAgYnJnX3B0ciArPSBicmc7CisgICAgICpicmdfcHRyIHw9IENQTV9CUkdfRU47Cit9CisKK3VpbnQgRGFxX0JSR19HZXRfRGl2MTYodWludCBicmcpCit7CisgICAgIHZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworICAgICB1aW50ICpicmdfcHRyOworCisgICAgIGJyZ19wdHIgPSAodWludCAqKSZpbW1yLT5pbV9icmdjMTsKKyAgICAgaWYgKGJyZyA+PSA1KSB7CisgICAgICAgICBicmdfcHRyID0gKHVpbnQgKikmaW1tci0+aW1fYnJnYzU7CisgICAgICAgICBicmcgLT0gNDsKKyAgICAgfQorICAgICBicmdfcHRyICs9IGJyZzsKKworICAgICBpZiAoKmJyZ19wdHIgJiBDUE1fQlJHX0RJVjE2KSB7CisgICAgICAgICAvKiBESVYxNiBhY3RpdmUgKi8KKyAgICAgICAgIHJldHVybiAoVFJVRSk7CisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgICAvKiBESVYxNiBpbmFjdGl2ZSAqLworICAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgIH0KK30KKwordm9pZCBEYXFfQlJHX1NldF9EaXYxNih1aW50IGJyZywgdWludCBkaXYxNikKK3sKKyAgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisgICAgIHVpbnQgKmJyZ19wdHI7CisKKyAgICAgYnJnX3B0ciA9ICh1aW50ICopJmltbXItPmltX2JyZ2MxOworICAgICBpZiAoYnJnID49IDUpIHsKKyAgICAgICAgIGJyZ19wdHIgPSAodWludCAqKSZpbW1yLT5pbV9icmdjNTsKKyAgICAgICAgIGJyZyAtPSA0OworICAgICB9CisgICAgIGJyZ19wdHIgKz0gYnJnOworCisgICAgIGlmIChkaXYxNikgeworICAgICAgICAgLyogRElWMTYgYWN0aXZlICovCisgICAgICAgICAqYnJnX3B0ciB8PSAgQ1BNX0JSR19ESVYxNjsKKyAgICAgfQorICAgICBlbHNlIHsKKyAgICAgICAgIC8qIERJVjE2IGluYWN0aXZlICovCisgICAgICAgICAqYnJnX3B0ciAmPSB+Q1BNX0JSR19ESVYxNjsKKyAgICAgfQorfQorCit1aW50IERhcV9CUkdfR2V0X0NvdW50KHVpbnQgYnJnKQoreworICAgICB2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKyAgICAgdWludCAqYnJnX3B0cjsKKyAgICAgdWludCBicmdfY250OworCisgICAgIGJyZ19wdHIgPSAodWludCAqKSZpbW1yLT5pbV9icmdjMTsKKyAgICAgaWYgKGJyZyA+PSA1KSB7CisgICAgICAgICBicmdfcHRyID0gKHVpbnQgKikmaW1tci0+aW1fYnJnYzU7CisgICAgICAgICBicmcgLT0gNDsKKyAgICAgfQorICAgICBicmdfcHRyICs9IGJyZzsKKworICAgICAvKiBHZXQgdGhlIGNsb2NrIGRpdmlkZXIKKyAgICAgICoKKyAgICAgICogTm90ZTogQSBjbG9jayBkaXZpZGVyIG9mIDAgbWVhbnMgZGl2aWRlIGJ5IDEsCisgICAgICAqICAgICAgIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGFkZCAxIHRvIHRoZSBjb3VudC4KKyAgICAgICovCisgICAgIGJyZ19jbnQgPSAoKmJyZ19wdHIgJiBDUE1fQlJHX0NEX01BU0spID4+IENQTV9CUkdfRElWMTZfU0hJRlQ7CisgICAgIGJyZ19jbnQrKzsKKyAgICAgaWYgKCpicmdfcHRyICYgQ1BNX0JSR19ESVYxNikgeworICAgICAgICAgYnJnX2NudCAqPSAxNjsKKyAgICAgfQorCisgICAgcmV0dXJuIChicmdfY250KTsKK30KKwordm9pZCBEYXFfQlJHX1NldF9Db3VudCh1aW50IGJyZywgdWludCBicmdfY250KQoreworICAgICB2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKyAgICAgdWludCAqYnJnX3B0cjsKKworICAgICBicmdfcHRyID0gKHVpbnQgKikmaW1tci0+aW1fYnJnYzE7CisgICAgIGlmIChicmcgPj0gNSkgeworICAgICAgICAgYnJnX3B0ciA9ICh1aW50ICopJmltbXItPmltX2JyZ2M1OworICAgICAgICAgYnJnIC09IDQ7CisgICAgIH0KKyAgICAgYnJnX3B0ciArPSBicmc7CisKKyAgICAgLyoKKyAgICAgICogTm90ZTogQSBjbG9jayBkaXZpZGVyIG9mIDAgbWVhbnMgZGl2aWRlIGJ5IDEsCisgICAgICAqCSB0aGVyZWZvcmUgd2UgbmVlZCB0byBzdWJ0cmFjdCAxIGZyb20gdGhlIGNvdW50LgorICAgICAgKi8KKyAgICAgaWYgKGJyZ19jbnQgPiA0MDk2KSB7CisgICAgICAgICAvKiBQcmVzY2FsZSA9IERpdmlkZSBieSAxNiAqLworICAgICAgICAgKmJyZ19wdHIgPSAoKmJyZ19wdHIgJiB+Q1BNX0JSR19DRF9NQVNLKSAgIHwKKwkgICAgICgoKGJyZ19jbnQgLyAxNikgLSAxKSA8PCBDUE1fQlJHX0RJVjE2X1NISUZUKTsKKwkgKmJyZ19wdHIgfD0gQ1BNX0JSR19ESVYxNjsKKyAgICAgfQorICAgICBlbHNlIHsKKyAgICAgICAgIC8qIFByZXNjYWxlID0gRGl2aWRlIGJ5IDEgKi8KKyAgICAgICAgICpicmdfcHRyID0gKCpicmdfcHRyICYgfkNQTV9CUkdfQ0RfTUFTSykgfAorCSAgICAgKChicmdfY250IC0gMSkgPDwgQ1BNX0JSR19ESVYxNl9TSElGVCk7CisJICpicmdfcHRyICY9IH5DUE1fQlJHX0RJVjE2OworICAgICB9Cit9CisKK3VpbnQgRGFxX0JSR19HZXRfRXh0Q2xrKHVpbnQgYnJnKQoreworICAgICB2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKyAgICAgdWludCAqYnJnX3B0cjsKKworICAgICBicmdfcHRyID0gKHVpbnQgKikmaW1tci0+aW1fYnJnYzE7CisgICAgIGlmIChicmcgPj0gNSkgeworICAgICAgICAgYnJnX3B0ciA9ICh1aW50ICopJmltbXItPmltX2JyZ2M1OworICAgICAgICAgYnJnIC09IDQ7CisgICAgIH0KKyAgICAgYnJnX3B0ciArPSBicmc7CisKKyAgICAgcmV0dXJuICgoKmJyZ19wdHIgJiBDUE1fQlJHX0VYVENfTUFTSykgPj4gQ1BNX0JSR19FWFRDX1NISUZUKTsKK30KKworY2hhciogRGFxX0JSR19HZXRfRXh0Q2xrX0Rlc2NyaXB0aW9uKHVpbnQgYnJnKQoreworICAgICB1aW50IGV4dGM7CisKKyAgICAgZXh0YyA9IERhcV9CUkdfR2V0X0V4dENsayhicmcpOworCisgICAgIHN3aXRjaCAoYnJnICsgMSkgeworICAgICAgICAgY2FzZSAxOgorICAgICAgICAgY2FzZSAyOgorICAgICAgICAgY2FzZSA1OgorICAgICAgICAgY2FzZSA2OiB7CisgICAgICAgICAgICAgc3dpdGNoIChleHRjKSB7CisgICAgICAgICAgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgiQlJHX0lOVCIpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgiQ0xLMyIpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGNhc2UgMjogeworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgiQ0xLNSIpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHJldHVybiAoIj8/MTI0NT8/Iik7CisgICAgICAgICB9CisgICAgICAgICBjYXNlIDM6CisgICAgICAgICBjYXNlIDQ6CisgICAgICAgICBjYXNlIDc6CisgICAgICAgICBjYXNlIDg6IHsKKyAgICAgICAgICAgICBzd2l0Y2ggKGV4dGMpIHsKKyAgICAgICAgICAgICAgICAgY2FzZSAwOiB7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCJCUkdfSU5UIik7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgY2FzZSAxOiB7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCJDTEs5Iik7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCJDTEsxNSIpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHJldHVybiAoIj8/MzQ3OD8/Iik7CisgICAgICAgICB9CisgICAgIH0KKyAgICAgcmV0dXJuICgiPz85ODc2Pz8iKTsKK30KKwordm9pZCBEYXFfQlJHX1NldF9FeHRDbGsodWludCBicmcsIHVpbnQgZXh0YykKK3sKKyAgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisgICAgIHVpbnQgKmJyZ19wdHI7CisKKyAgICAgYnJnX3B0ciA9ICh1aW50ICopJmltbXItPmltX2JyZ2MxOworICAgICBpZiAoYnJnID49IDUpIHsKKyAgICAgICAgIGJyZ19wdHIgPSAodWludCAqKSZpbW1yLT5pbV9icmdjNTsKKyAgICAgICAgIGJyZyAtPSA0OworICAgICB9CisgICAgIGJyZ19wdHIgKz0gYnJnOworCisgICAgICpicmdfcHRyID0gKCpicmdfcHRyICYgfkNQTV9CUkdfRVhUQ19NQVNLKSB8CisgICAgICAgICAgICAgICAgKChleHRjIDw8IENQTV9CUkdfRVhUQ19TSElGVCkgJiBDUE1fQlJHX0VYVENfTUFTSyk7Cit9CisKK3VpbnQgRGFxX0JSR19SYXRlKHVpbnQgYnJnKQoreworICAgICBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKyAgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisgICAgIHVpbnQgKmJyZ19wdHI7CisgICAgIHVpbnQgYnJnX2NudDsKKyAgICAgdWludCBicmdfZnJlcSA9IDA7CisKKyAgICAgYnJnX3B0ciA9ICh1aW50ICopJmltbXItPmltX2JyZ2MxOworICAgICBicmdfcHRyICs9IGJyZzsKKyAgICAgaWYgKGJyZyA+PSA1KSB7CisgICAgICAgICBicmdfcHRyID0gKHVpbnQgKikmaW1tci0+aW1fYnJnYzU7CisgICAgICAgICBicmdfcHRyICs9IChicmcgLSA0KTsKKyAgICAgfQorCisgICAgYnJnX2NudCA9IERhcV9CUkdfR2V0X0NvdW50KGJyZyk7CisKKyAgICBzd2l0Y2ggKERhcV9CUkdfR2V0X0V4dENsayhicmcpKSB7CisgICAgICAgIGNhc2UgQ1BNX0JSR19FWFRDX0NMSzM6CisgICAgICAgIGNhc2UgQ1BNX0JSR19FWFRDX0NMSzU6IHsKKwkgICAgYnJnX2ZyZXEgPSBicmdfY250OworCSAgICBicmVhazsKKwl9CisJZGVmYXVsdDogeworCSAgICBicmdfZnJlcSA9ICh1aW50KUJSR19JTlRfQ0xLIC8gYnJnX2NudDsKKwl9CisgICAgfQorICAgIHJldHVybiAoYnJnX2ZyZXEpOworfQorCit1aW50IERhcV9HZXRfU2FtcGxlUmF0ZSh2b2lkKQorCit7CisgICAgIC8qCisgICAgICAqIFJlYWQgdGhlIEJSRydzIHRvIHJldHVybiB0aGUgYWN0dWFsIHNhbXBsZSByYXRlLgorICAgICAgKi8KKyAgICAgcmV0dXJuIChEYXFfQlJHX1JhdGUoTUNMS19CUkcpIC8gKE1DTEtfRElWSVNPUiAqIFNDTEtfRElWSVNPUikpOworfQorCit1aW50IERhcV9TZXRfU2FtcGxlUmF0ZSh1aW50IHJhdGUsIHVpbnQgZm9yY2UpCisKK3sKKyAgICBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKyAgICB1aW50IG1jbGtfZGl2aXNvcjsgLyogTUNMSyBkaXZpc29yICovCisgICAgdWludCByYXRlX2N1cnI7ICAgIC8qIEN1cnJlbnQgc2FtcGxlIHJhdGUgKi8KKworICAgIC8qCisgICAgICogTGltaXQgdGhlIHNhbXBsZSByYXRlIHRvIHNvbWUgc2Vuc2libGUgdmFsdWVzLgorICAgICAqLworICAgIGlmIChEYXE2NHhTYW1wbGluZykgeworICAgICAgaWYgKHJhdGUgPiBNQVhfNjR4X1NBTVBMRV9SQVRFKSB7CisJICByYXRlID0gTUFYXzY0eF9TQU1QTEVfUkFURTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAocmF0ZSA+IE1BWF8xMjh4X1NBTVBMRV9SQVRFKSB7CisJICByYXRlID0gTUFYXzEyOHhfU0FNUExFX1JBVEU7CisgICAgICB9CisgICAgfQorICAgIGlmIChyYXRlIDwgTUlOX1NBTVBMRV9SQVRFKSB7CisgICAgICAgIHJhdGUgPSBNSU5fU0FNUExFX1JBVEU7CisgICAgfQorCisgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSByZWFsbHkgY2hhbmdpbmcgcmF0ZXMgKi8KKyAgICByYXRlX2N1cnIgPSBEYXFfR2V0X1NhbXBsZVJhdGUoKTsKKyAgICBpZiAoKHJhdGUgIT0gcmF0ZV9jdXJyKSB8fCBmb3JjZSkgeworICAgICAgICAvKgorCSAqIER5bmFtaWNhbGx5IGFkanVzdCBNQ0xLIGJhc2VkIG9uIHRoZSBuZXcgc2FtcGxlIHJhdGUuCisJICovCisKKyAgICAgICAgLyogQ29tcHV0ZSB0aGUgZGl2aXNvcnMgKi8KKyAgICAgICAgbWNsa19kaXZpc29yID0gQlJHX0lOVF9DTEsgLyAocmF0ZSAqIE1DTEtfRElWSVNPUiAqIFNDTEtfRElWSVNPUik7CisKKwkvKiBTZXR1cCBNQ0xLICovCisJRGFxX0JSR19TZXRfQ291bnQoTUNMS19CUkcsIG1jbGtfZGl2aXNvcik7CisKKwkvKiBTZXR1cCBTQ0xLICovCisjICAgICAgIGlmZGVmIFJVTl9TQ0xLX09OX0JSR19JTlQKKwkgICBEYXFfQlJHX1NldF9Db3VudChTQ0xLX0JSRywgbWNsa19kaXZpc29yICogTUNMS19ESVZJU09SKTsKKyMgICAgICAgZWxzZQorCSAgIERhcV9CUkdfU2V0X0NvdW50KFNDTEtfQlJHLCBNQ0xLX0RJVklTT1IpOworIyAgICAgICBlbmRpZgorCisjICAgICAgIGlmZGVmIFJVTl9MUkNMS19PTl9CUkdfSU5UCisJICAgIERhcV9CUkdfU2V0X0NvdW50KExSQ0xLX0JSRywKKwkJCSAgICAgIG1jbGtfZGl2aXNvciAqIE1DTEtfRElWSVNPUiAqIFNDTEtfRElWSVNPUik7CisjICAgICAgIGVsc2UKKwkgICAgRGFxX0JSR19TZXRfQ291bnQoTFJDTEtfQlJHLCBTQ0xLX0RJVklTT1IpOworIyAgICAgICBlbmRpZgorCisJLyogUmVhZCB0aGUgQlJHJ3MgdG8gcmV0dXJuIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuICovCisJcmF0ZV9jdXJyID0gRGFxX0dldF9TYW1wbGVSYXRlKCk7CisgICAgfQorCisgICAgcmV0dXJuIChyYXRlX2N1cnIpOworfQorCit2b2lkIERhcV9Jbml0X0Nsb2NrcyhpbnQgc2FtcGxlX3JhdGUsIGludCBzYW1wbGVfNjR4KQorCit7CisgICAgdm9sYXRpbGUgaW9wb3J0X3QgKmlvcGEgPSBpb3BvcnRfYWRkcigoaW1tYXBfdCAqKUNGR19JTU1SLCAwIC8qIHBvcnQgQSAqLyk7CisKKyAgICAvKiBTYXZlIG9mZiB0aGUgY2xvY2tpbmcgZGF0YSAqLworICAgIERhcTY0eFNhbXBsaW5nID0gc2FtcGxlXzY0eDsKKworICAgIC8qCisgICAgICogTGltaXQgdGhlIHNhbXBsZSByYXRlIHRvIHNvbWUgc2Vuc2libGUgdmFsdWVzLgorICAgICAqLworICAgIGlmIChEYXE2NHhTYW1wbGluZykgeworICAgICAgaWYgKHNhbXBsZV9yYXRlID4gTUFYXzY0eF9TQU1QTEVfUkFURSkgeworCSAgc2FtcGxlX3JhdGUgPSBNQVhfNjR4X1NBTVBMRV9SQVRFOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChzYW1wbGVfcmF0ZSA+IE1BWF8xMjh4X1NBTVBMRV9SQVRFKSB7CisJICBzYW1wbGVfcmF0ZSA9IE1BWF8xMjh4X1NBTVBMRV9SQVRFOworICAgICAgfQorICAgIH0KKyAgICBpZiAoc2FtcGxlX3JhdGUgPCBNSU5fU0FNUExFX1JBVEUpIHsKKyAgICAgICAgc2FtcGxlX3JhdGUgPSBNSU5fU0FNUExFX1JBVEU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIHRoZSBNQ0xLL1NDTEsvTFJDTEsgYmF1ZCByYXRlIGdlbmVyYXRvcnMuCisgICAgICovCisKKyAgICAvKiBTZXR1cCBNQ0xLICovCisgICAgRGFxX0JSR19TZXRfRXh0Q2xrKE1DTEtfQlJHLCBDUE1fQlJHX0VYVENfQlJHQ0xLKTsKKworICAgIC8qIFNldHVwIFNDTEsgKi8KKyMgICBpZmRlZiBSVU5fU0NMS19PTl9CUkdfSU5UCisgICAgICAgIERhcV9CUkdfU2V0X0V4dENsayhTQ0xLX0JSRywgQ1BNX0JSR19FWFRDX0JSR0NMSyk7CisjICAgZWxzZQorICAgICAgICBEYXFfQlJHX1NldF9FeHRDbGsoU0NMS19CUkcsIENQTV9CUkdfRVhUQ19DTEs5KTsKKyMgICBlbmRpZgorCisgICAgLyogU2V0dXAgTFJDTEsgKi8KKyMgICBpZmRlZiBSVU5fTFJDTEtfT05fQlJHX0lOVAorICAgICAgICBEYXFfQlJHX1NldF9FeHRDbGsoTFJDTEtfQlJHLCBDUE1fQlJHX0VYVENfQlJHQ0xLKTsKKyMgICBlbHNlCisgICAgICAgIERhcV9CUkdfU2V0X0V4dENsayhMUkNMS19CUkcsIENQTV9CUkdfRVhUQ19DTEs1KTsKKyMgICBlbmRpZgorCisgICAgLyogU2V0dXAgdGhlIEJSRyByYXRlcyAqLworICAgIERhcV9TZXRfU2FtcGxlUmF0ZShzYW1wbGVfcmF0ZSwgVFJVRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIGNsb2NrIGRyaXZlcnMgKi8KKyAgICBpb3BhLT5wZGF0ICY9IH5TTFJDTEtfRU5fTUFTSzsKK30KKwordm9pZCBEYXFfU3RvcF9DbG9ja3Modm9pZCkKKworeworI2lmZGVmIFRJR0hURU5fVVBfQlJHX1RJTUlORworICAgIHZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworI2VuZGlmCisKKyMgICBpZmRlZiBUSUdIVEVOX1VQX0JSR19USU1JTkcKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXQgTUNMSyBCUkcKKyAgICAgICAgICovCisjICAgICAgIGlmIChNQ0xLX0JSRyA9PSAwKQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzEgfD0gIENQTV9CUkdfUlNUOworICAgICAgICAgICAgaW1tci0+aW1fYnJnYzEgJj0gfkNQTV9CUkdfUlNUOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTUNMS19CUkcgPT0gMSkKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2MyIHw9ICBDUE1fQlJHX1JTVDsKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2MyICY9IH5DUE1fQlJHX1JTVDsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKE1DTEtfQlJHID09IDIpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjMyB8PSAgQ1BNX0JSR19SU1Q7CisgICAgICAgICAgICBpbW1yLT5pbV9icmdjMyAmPSB+Q1BNX0JSR19SU1Q7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChNQ0xLX0JSRyA9PSAzKQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzQgfD0gIENQTV9CUkdfUlNUOworICAgICAgICAgICAgaW1tci0+aW1fYnJnYzQgJj0gfkNQTV9CUkdfUlNUOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTUNMS19CUkcgPT0gNCkKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2M1IHw9ICBDUE1fQlJHX1JTVDsKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2M1ICY9IH5DUE1fQlJHX1JTVDsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKE1DTEtfQlJHID09IDUpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjNiB8PSAgQ1BNX0JSR19SU1Q7CisgICAgICAgICAgICBpbW1yLT5pbV9icmdjNiAmPSB+Q1BNX0JSR19SU1Q7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChNQ0xLX0JSRyA9PSA2KQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzcgfD0gIENQTV9CUkdfUlNUOworICAgICAgICAgICAgaW1tci0+aW1fYnJnYzcgJj0gfkNQTV9CUkdfUlNUOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTUNMS19CUkcgPT0gNykKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2M4IHw9ICBDUE1fQlJHX1JTVDsKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2M4ICY9IH5DUE1fQlJHX1JTVDsKKyMgICAgICAgZW5kaWYKKworICAgICAgICAvKgorICAgICAgICAgKiBSZXNldCBTQ0xLIEJSRworICAgICAgICAgKi8KKyMgICAgICAgaWYgKFNDTEtfQlJHID09IDApCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjMSB8PSAgQ1BNX0JSR19SU1Q7CisgICAgICAgICAgICBpbW1yLT5pbV9icmdjMSAmPSB+Q1BNX0JSR19SU1Q7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChTQ0xLX0JSRyA9PSAxKQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzIgfD0gIENQTV9CUkdfUlNUOworICAgICAgICAgICAgaW1tci0+aW1fYnJnYzIgJj0gfkNQTV9CUkdfUlNUOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoU0NMS19CUkcgPT0gMikKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2MzIHw9ICBDUE1fQlJHX1JTVDsKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2MzICY9IH5DUE1fQlJHX1JTVDsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKFNDTEtfQlJHID09IDMpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjNCB8PSAgQ1BNX0JSR19SU1Q7CisgICAgICAgICAgICBpbW1yLT5pbV9icmdjNCAmPSB+Q1BNX0JSR19SU1Q7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChTQ0xLX0JSRyA9PSA0KQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzUgfD0gIENQTV9CUkdfUlNUOworICAgICAgICAgICAgaW1tci0+aW1fYnJnYzUgJj0gfkNQTV9CUkdfUlNUOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoU0NMS19CUkcgPT0gNSkKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2M2IHw9ICBDUE1fQlJHX1JTVDsKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2M2ICY9IH5DUE1fQlJHX1JTVDsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKFNDTEtfQlJHID09IDYpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjNyB8PSAgQ1BNX0JSR19SU1Q7CisgICAgICAgICAgICBpbW1yLT5pbV9icmdjNyAmPSB+Q1BNX0JSR19SU1Q7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChTQ0xLX0JSRyA9PSA3KQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzggfD0gIENQTV9CUkdfUlNUOworICAgICAgICAgICAgaW1tci0+aW1fYnJnYzggJj0gfkNQTV9CUkdfUlNUOworIyAgICAgICBlbmRpZgorCisgICAgICAgIC8qCisgICAgICAgICAqIFJlc2V0IExSQ0xLIEJSRworICAgICAgICAgKi8KKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSAwKQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzEgfD0gIENQTV9CUkdfUlNUOworICAgICAgICAgICAgaW1tci0+aW1fYnJnYzEgJj0gfkNQTV9CUkdfUlNUOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTFJDTEtfQlJHID09IDEpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjMiB8PSAgQ1BNX0JSR19SU1Q7CisgICAgICAgICAgICBpbW1yLT5pbV9icmdjMiAmPSB+Q1BNX0JSR19SU1Q7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChMUkNMS19CUkcgPT0gMikKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2MzIHw9ICBDUE1fQlJHX1JTVDsKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2MzICY9IH5DUE1fQlJHX1JTVDsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSAzKQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzQgfD0gIENQTV9CUkdfUlNUOworICAgICAgICAgICAgaW1tci0+aW1fYnJnYzQgJj0gfkNQTV9CUkdfUlNUOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTFJDTEtfQlJHID09IDQpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjNSB8PSAgQ1BNX0JSR19SU1Q7CisgICAgICAgICAgICBpbW1yLT5pbV9icmdjNSAmPSB+Q1BNX0JSR19SU1Q7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChMUkNMS19CUkcgPT0gNSkKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2M2IHw9ICBDUE1fQlJHX1JTVDsKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2M2ICY9IH5DUE1fQlJHX1JTVDsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSA2KQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzcgfD0gIENQTV9CUkdfUlNUOworICAgICAgICAgICAgaW1tci0+aW1fYnJnYzcgJj0gfkNQTV9CUkdfUlNUOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTFJDTEtfQlJHID09IDcpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjOCB8PSAgQ1BNX0JSR19SU1Q7CisgICAgICAgICAgICBpbW1yLT5pbV9icmdjOCAmPSB+Q1BNX0JSR19SU1Q7CisjICAgICAgIGVuZGlmCisjICAgZWxzZQorICAgICAgICAvKgorICAgICAgICAgKiBSZXNldCB0aGUgY2xvY2tzCisgICAgICAgICAqLworICAgICAgICBEYXFfQlJHX1Jlc2V0KE1DTEtfQlJHKTsKKyAgICAgICAgRGFxX0JSR19SZXNldChTQ0xLX0JSRyk7CisgICAgICAgIERhcV9CUkdfUmVzZXQoTFJDTEtfQlJHKTsKKyMgICBlbmRpZgorfQorCit2b2lkIERhcV9TdGFydF9DbG9ja3MoaW50IHNhbXBsZV9yYXRlKQorCit7CisjaWZkZWYgVElHSFRFTl9VUF9CUkdfVElNSU5HCisgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisKKyAgICB1aW50ICAgICAgICAgIG1jbGtfYnJnOyAgICAgICAvKiBNQ0xLICBCUkcgdmFsdWUgKi8KKyAgICB1aW50ICAgICAgICAgIHNjbGtfYnJnOyAgICAgICAvKiBTQ0xLICBCUkcgdmFsdWUgKi8KKyAgICB1aW50ICAgICAgICAgIGxyY2xrX2JyZzsgICAgICAvKiBMUkNMSyBCUkcgdmFsdWUgKi8KKyAgICB1aW50ICAgICAgICAgIHRlbXBfbHJjbGtfYnJnOyAvKiBUZW1wb3JhcnkgTFJDTEsgQlJHIHZhbHVlICovCisgICAgdWludAkgIHJlYWxfbHJjbGtfYnJnOyAvKiBQZXJtYW5lbnQgTFJDTEsgQlJHIHZhbHVlICovCisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsgICAgICAgICAgLyogSW50ZXJydXB0IGZsYWdzICovCisgICAgdWludCAgICAgICAgICBzY2xrX2NudDsgICAgICAgLyogU0NMSyBjb3VudCAqLworICAgIHVpbnQgICAgICAgICAgZGVsYXlfY250OyAgICAgIC8qIERlbGF5IGNvdW50ICovCisjZW5kaWYKKworIyAgIGlmZGVmIFRJR0hURU5fVVBfQlJHX1RJTUlORworICAgICAgICAvKgorICAgICAgICAgKiBPYnRhaW4gdGhlIGVuYWJsZWQgTUNMSyBCUkcgdmFsdWUKKyAgICAgICAgICovCisjICAgICAgIGlmIChNQ0xLX0JSRyA9PSAwKQorICAgICAgICAgICAgbWNsa19icmcgPSAoaW1tci0+aW1fYnJnYzEgJiB+Q1BNX0JSR19SU1QpIHwgQ1BNX0JSR19FTjsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKE1DTEtfQlJHID09IDEpCisgICAgICAgICAgICBtY2xrX2JyZyA9IChpbW1yLT5pbV9icmdjMiAmIH5DUE1fQlJHX1JTVCkgfCBDUE1fQlJHX0VOOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTUNMS19CUkcgPT0gMikKKyAgICAgICAgICAgIG1jbGtfYnJnID0gKGltbXItPmltX2JyZ2MzICYgfkNQTV9CUkdfUlNUKSB8IENQTV9CUkdfRU47CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChNQ0xLX0JSRyA9PSAzKQorICAgICAgICAgICAgbWNsa19icmcgPSAoaW1tci0+aW1fYnJnYzQgJiB+Q1BNX0JSR19SU1QpIHwgQ1BNX0JSR19FTjsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKE1DTEtfQlJHID09IDQpCisgICAgICAgICAgICBtY2xrX2JyZyA9IChpbW1yLT5pbV9icmdjNSAmIH5DUE1fQlJHX1JTVCkgfCBDUE1fQlJHX0VOOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTUNMS19CUkcgPT0gNSkKKyAgICAgICAgICAgIG1jbGtfYnJnID0gKGltbXItPmltX2JyZ2M2ICYgfkNQTV9CUkdfUlNUKSB8IENQTV9CUkdfRU47CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChNQ0xLX0JSRyA9PSA2KQorICAgICAgICAgICAgbWNsa19icmcgPSAoaW1tci0+aW1fYnJnYzcgJiB+Q1BNX0JSR19SU1QpIHwgQ1BNX0JSR19FTjsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKE1DTEtfQlJHID09IDcpCisgICAgICAgICAgICBtY2xrX2JyZyA9IChpbW1yLT5pbV9icmdjOCAmIH5DUE1fQlJHX1JTVCkgfCBDUE1fQlJHX0VOOworIyAgICAgICBlbmRpZgorCisgICAgICAgIC8qCisgICAgICAgICAqIE9idGFpbiB0aGUgZW5hYmxlZCBTQ0xLIEJSRyB2YWx1ZQorICAgICAgICAgKi8KKyMgICAgICAgaWYgKFNDTEtfQlJHID09IDApCisgICAgICAgICAgICBzY2xrX2JyZyA9IChpbW1yLT5pbV9icmdjMSAmIH5DUE1fQlJHX1JTVCkgfCBDUE1fQlJHX0VOOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoU0NMS19CUkcgPT0gMSkKKyAgICAgICAgICAgIHNjbGtfYnJnID0gKGltbXItPmltX2JyZ2MyICYgfkNQTV9CUkdfUlNUKSB8IENQTV9CUkdfRU47CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChTQ0xLX0JSRyA9PSAyKQorICAgICAgICAgICAgc2Nsa19icmcgPSAoaW1tci0+aW1fYnJnYzMgJiB+Q1BNX0JSR19SU1QpIHwgQ1BNX0JSR19FTjsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKFNDTEtfQlJHID09IDMpCisgICAgICAgICAgICBzY2xrX2JyZyA9IChpbW1yLT5pbV9icmdjNCAmIH5DUE1fQlJHX1JTVCkgfCBDUE1fQlJHX0VOOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoU0NMS19CUkcgPT0gNCkKKyAgICAgICAgICAgIHNjbGtfYnJnID0gKGltbXItPmltX2JyZ2M1ICYgfkNQTV9CUkdfUlNUKSB8IENQTV9CUkdfRU47CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChTQ0xLX0JSRyA9PSA1KQorICAgICAgICAgICAgc2Nsa19icmcgPSAoaW1tci0+aW1fYnJnYzYgJiB+Q1BNX0JSR19SU1QpIHwgQ1BNX0JSR19FTjsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKFNDTEtfQlJHID09IDYpCisgICAgICAgICAgICBzY2xrX2JyZyA9IChpbW1yLT5pbV9icmdjNyAmIH5DUE1fQlJHX1JTVCkgfCBDUE1fQlJHX0VOOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoU0NMS19CUkcgPT0gNykKKyAgICAgICAgICAgIHNjbGtfYnJnID0gKGltbXItPmltX2JyZ2M4ICYgfkNQTV9CUkdfUlNUKSB8IENQTV9CUkdfRU47CisjICAgICAgIGVuZGlmCisKKyAgICAgICAgLyoKKyAgICAgICAgICogT2J0YWluIHRoZSBlbmFibGVkIExSQ0xLIEJSRyB2YWx1ZQorICAgICAgICAgKi8KKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSAwKQorICAgICAgICAgICAgbHJjbGtfYnJnID0gKGltbXItPmltX2JyZ2MxICYgfkNQTV9CUkdfUlNUKSB8IENQTV9CUkdfRU47CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChMUkNMS19CUkcgPT0gMSkKKyAgICAgICAgICAgIGxyY2xrX2JyZyA9IChpbW1yLT5pbV9icmdjMiAmIH5DUE1fQlJHX1JTVCkgfCBDUE1fQlJHX0VOOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTFJDTEtfQlJHID09IDIpCisgICAgICAgICAgICBscmNsa19icmcgPSAoaW1tci0+aW1fYnJnYzMgJiB+Q1BNX0JSR19SU1QpIHwgQ1BNX0JSR19FTjsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSAzKQorICAgICAgICAgICAgbHJjbGtfYnJnID0gKGltbXItPmltX2JyZ2M0ICYgfkNQTV9CUkdfUlNUKSB8IENQTV9CUkdfRU47CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChMUkNMS19CUkcgPT0gNCkKKyAgICAgICAgICAgIGxyY2xrX2JyZyA9IChpbW1yLT5pbV9icmdjNSAmIH5DUE1fQlJHX1JTVCkgfCBDUE1fQlJHX0VOOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTFJDTEtfQlJHID09IDUpCisgICAgICAgICAgICBscmNsa19icmcgPSAoaW1tci0+aW1fYnJnYzYgJiB+Q1BNX0JSR19SU1QpIHwgQ1BNX0JSR19FTjsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSA2KQorICAgICAgICAgICAgbHJjbGtfYnJnID0gKGltbXItPmltX2JyZ2M3ICYgfkNQTV9CUkdfUlNUKSB8IENQTV9CUkdfRU47CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChMUkNMS19CUkcgPT0gNykKKyAgICAgICAgICAgIGxyY2xrX2JyZyA9IChpbW1yLT5pbV9icmdjOCAmIH5DUE1fQlJHX1JTVCkgfCBDUE1fQlJHX0VOOworIyAgICAgICBlbmRpZgorCisJLyogU2F2ZSBvZmYgdGhlIHJlYWwgTFJDTEsgdmFsdWUgKi8KKwlyZWFsX2xyY2xrX2JyZyA9IGxyY2xrX2JyZzsKKworCS8qIE9idGFpbiB0aGUgY3VycmVudCBTQ0xLIGNvdW50ICovCisJc2Nsa19jbnQgID0gKChzY2xrX2JyZyAmIDB4MDAwMDFGRkUpID4+IDEpICsgMTsKKworCS8qIENvbXB1dGUgdGhlIGRlbGF5IGFzIGEgZnVuY3Rpb24gb2YgU0NMSyBjb3VudCAqLworICAgICAgICBkZWxheV9jbnQgPSAoKHNjbGtfY250IC8gNCkgLSAyKSAqIDEwICsgNjsKKwlpZiAoc2FtcGxlX3JhdGUgPT0gNDM0MDIpIHsKKwkgIGRlbGF5X2NudCsrOworCX0KKworICAgICAgICAvKiBDbGVhciBvdXQgdGhlIGNvdW50ICovCisJdGVtcF9scmNsa19icmcgPSBzY2xrX2JyZyAmIH4weDAwMDAxRkZFOworCisgICAgICAgIC8qIEluc2VydCB0aGUgY291bnQgKi8KKwl0ZW1wX2xyY2xrX2JyZyB8PSAoKGRlbGF5X2NudCArIChzY2xrX2NudCAvIDIpIC0gMSkgPDwgMSkgJiAgMHgwMDAwMUZGRTsKKworICAgICAgICAvKgorICAgICAgICAgKiBFbmFibGUgTUNMSyBCUkcKKyAgICAgICAgICovCisjICAgICAgIGlmIChNQ0xLX0JSRyA9PSAwKQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzEgPSBtY2xrX2JyZzsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKE1DTEtfQlJHID09IDEpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjMiA9IG1jbGtfYnJnOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTUNMS19CUkcgPT0gMikKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2MzID0gbWNsa19icmc7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChNQ0xLX0JSRyA9PSAzKQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzQgPSBtY2xrX2JyZzsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKE1DTEtfQlJHID09IDQpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjNSA9IG1jbGtfYnJnOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTUNMS19CUkcgPT0gNSkKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2M2ID0gbWNsa19icmc7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChNQ0xLX0JSRyA9PSA2KQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzcgPSBtY2xrX2JyZzsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKE1DTEtfQlJHID09IDcpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjOCA9IG1jbGtfYnJnOworIyAgICAgICBlbmRpZgorCisgICAgICAgIC8qCisgICAgICAgICAqIEVuYWJsZSBTQ0xLIEJSRworICAgICAgICAgKi8KKyMgICAgICAgaWYgKFNDTEtfQlJHID09IDApCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjMSA9IHNjbGtfYnJnOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoU0NMS19CUkcgPT0gMSkKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2MyID0gc2Nsa19icmc7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChTQ0xLX0JSRyA9PSAyKQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzMgPSBzY2xrX2JyZzsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKFNDTEtfQlJHID09IDMpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjNCA9IHNjbGtfYnJnOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoU0NMS19CUkcgPT0gNCkKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2M1ID0gc2Nsa19icmc7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChTQ0xLX0JSRyA9PSA1KQorICAgICAgICAgICAgaW1tci0+aW1fYnJnYzYgPSBzY2xrX2JyZzsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKFNDTEtfQlJHID09IDYpCisgICAgICAgICAgICBpbW1yLT5pbV9icmdjNyA9IHNjbGtfYnJnOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoU0NMS19CUkcgPT0gNykKKyAgICAgICAgICAgIGltbXItPmltX2JyZ2M4ID0gc2Nsa19icmc7CisjICAgICAgIGVuZGlmCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRW5hYmxlIExSQ0xLIEJSRyAoMXN0IHRpbWUgLSB0ZW1wb3JhcnkpCisgICAgICAgICAqLworIyAgICAgICBpZiAoTFJDTEtfQlJHID09IDApCisgICAgICAgICAgICAgaW1tci0+aW1fYnJnYzEgPSB0ZW1wX2xyY2xrX2JyZzsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSAxKQorICAgICAgICAgICAgIGltbXItPmltX2JyZ2MyID0gdGVtcF9scmNsa19icmc7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChMUkNMS19CUkcgPT0gMikKKyAgICAgICAgICAgICBpbW1yLT5pbV9icmdjMyA9IHRlbXBfbHJjbGtfYnJnOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTFJDTEtfQlJHID09IDMpCisgICAgICAgICAgICAgaW1tci0+aW1fYnJnYzQgPSB0ZW1wX2xyY2xrX2JyZzsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSA0KQorICAgICAgICAgICAgIGltbXItPmltX2JyZ2M1ID0gdGVtcF9scmNsa19icmc7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChMUkNMS19CUkcgPT0gNSkKKyAgICAgICAgICAgICBpbW1yLT5pbV9icmdjNiA9IHRlbXBfbHJjbGtfYnJnOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTFJDTEtfQlJHID09IDYpCisgICAgICAgICAgICAgaW1tci0+aW1fYnJnYzcgPSB0ZW1wX2xyY2xrX2JyZzsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSA3KQorICAgICAgICAgICAgIGltbXItPmltX2JyZ2M4ID0gdGVtcF9scmNsa19icmc7CisjICAgICAgIGVuZGlmCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRW5hYmxlIExSQ0xLIEJSRyAoMm5kIHRpbWUgLSBwZXJtYW5lbnQpCisgICAgICAgICAqLworIyAgICAgICBpZiAoTFJDTEtfQlJHID09IDApCisgICAgICAgICAgICAgaW1tci0+aW1fYnJnYzEgPSByZWFsX2xyY2xrX2JyZzsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSAxKQorICAgICAgICAgICAgIGltbXItPmltX2JyZ2MyID0gcmVhbF9scmNsa19icmc7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChMUkNMS19CUkcgPT0gMikKKyAgICAgICAgICAgICBpbW1yLT5pbV9icmdjMyA9IHJlYWxfbHJjbGtfYnJnOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTFJDTEtfQlJHID09IDMpCisgICAgICAgICAgICAgaW1tci0+aW1fYnJnYzQgPSByZWFsX2xyY2xrX2JyZzsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSA0KQorICAgICAgICAgICAgIGltbXItPmltX2JyZ2M1ID0gcmVhbF9scmNsa19icmc7CisjICAgICAgIGVuZGlmCisjICAgICAgIGlmIChMUkNMS19CUkcgPT0gNSkKKyAgICAgICAgICAgICBpbW1yLT5pbV9icmdjNiA9IHJlYWxfbHJjbGtfYnJnOworIyAgICAgICBlbmRpZgorIyAgICAgICBpZiAoTFJDTEtfQlJHID09IDYpCisgICAgICAgICAgICAgaW1tci0+aW1fYnJnYzcgPSByZWFsX2xyY2xrX2JyZzsKKyMgICAgICAgZW5kaWYKKyMgICAgICAgaWYgKExSQ0xLX0JSRyA9PSA3KQorICAgICAgICAgICAgIGltbXItPmltX2JyZ2M4ID0gcmVhbF9scmNsa19icmc7CisjICAgICAgIGVuZGlmCisjICAgZWxzZQorICAgICAgICAvKgorICAgICAgICAgKiBFbmFibGUgdGhlIGNsb2NrcworICAgICAgICAgKi8KKyAgICAgICAgRGFxX0JSR19FbmFibGUoTFJDTEtfQlJHKTsKKyAgICAgICAgRGFxX0JSR19FbmFibGUoU0NMS19CUkcpOworICAgICAgICBEYXFfQlJHX0VuYWJsZShNQ0xLX0JSRyk7CisjICAgZW5kaWYKK30KKwordm9pZCBEYXFfRGlzcGxheV9DbG9ja3Modm9pZCkKKworeworICAgIHZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworICAgIHVpbnQgbWNsa19kaXZpc29yOyAvKiBEZXRlY3RlZCBNQ0xLIGRpdmlzb3IgKi8KKyAgICB1aW50IHNjbGtfZGl2aXNvcjsgLyogRGV0ZWN0ZWQgU0NMSyBkaXZpc29yICovCisKKyAgICBwcmludGYoIlxuQlJHOlxuIik7CisgICAgaWYgKGltbXItPmltX2JyZ2M0ICE9IDApIHsKKyAgICAgICAgcHJpbnRmKCJcdGJyZ2M0XHQweCUwOHggQCAweCUwOHgsICU1ZCBjb3VudCwgJWQgZXh0YywgJThzLCAgTUNMS1xuIiwKKwkgICAgICAgaW1tci0+aW1fYnJnYzQsCisJICAgICAgICh1aW50KSYoaW1tci0+aW1fYnJnYzQpLAorCSAgICAgICBEYXFfQlJHX0dldF9Db3VudCgzKSwKKwkgICAgICAgRGFxX0JSR19HZXRfRXh0Q2xrKDMpLAorCSAgICAgICBEYXFfQlJHX0dldF9FeHRDbGtfRGVzY3JpcHRpb24oMykpOworICAgIH0KKyAgICBpZiAoaW1tci0+aW1fYnJnYzggIT0gMCkgeworICAgICAgICBwcmludGYoIlx0YnJnYzhcdDB4JTA4eCBAIDB4JTA4eCwgJTVkIGNvdW50LCAlZCBleHRjLCAlOHMsICBTQ0xLXG4iLAorCSAgICAgICBpbW1yLT5pbV9icmdjOCwKKwkgICAgICAgKHVpbnQpJihpbW1yLT5pbV9icmdjOCksCisJICAgICAgIERhcV9CUkdfR2V0X0NvdW50KDcpLAorCSAgICAgICBEYXFfQlJHX0dldF9FeHRDbGsoNyksCisJICAgICAgIERhcV9CUkdfR2V0X0V4dENsa19EZXNjcmlwdGlvbig3KSk7CisgICAgfQorICAgIGlmIChpbW1yLT5pbV9icmdjNiAhPSAwKSB7CisgICAgICAgIHByaW50ZigiXHRicmdjNlx0MHglMDh4IEAgMHglMDh4LCAlNWQgY291bnQsICVkIGV4dGMsICU4cywgIExSQ0xLXG4iLAorCSAgICAgICBpbW1yLT5pbV9icmdjNiwKKwkgICAgICAgKHVpbnQpJihpbW1yLT5pbV9icmdjNiksCisJICAgICAgIERhcV9CUkdfR2V0X0NvdW50KDUpLAorCSAgICAgICBEYXFfQlJHX0dldF9FeHRDbGsoNSksCisJICAgICAgIERhcV9CUkdfR2V0X0V4dENsa19EZXNjcmlwdGlvbig1KSk7CisgICAgfQorICAgIGlmIChpbW1yLT5pbV9icmdjMSAhPSAwKSB7CisgICAgICAgIHByaW50ZigiXHRicmdjMVx0MHglMDh4IEAgMHglMDh4LCAlNWQgY291bnQsICVkIGV4dGMsICU4cywgIFNNQzFcbiIsCisJICAgICAgIGltbXItPmltX2JyZ2MxLAorCSAgICAgICAodWludCkmKGltbXItPmltX2JyZ2MxKSwKKwkgICAgICAgRGFxX0JSR19HZXRfQ291bnQoMCksCisJICAgICAgIERhcV9CUkdfR2V0X0V4dENsaygwKSwKKwkgICAgICAgRGFxX0JSR19HZXRfRXh0Q2xrX0Rlc2NyaXB0aW9uKDApKTsKKyAgICB9CisgICAgaWYgKGltbXItPmltX2JyZ2MyICE9IDApIHsKKyAgICAgICAgcHJpbnRmKCJcdGJyZ2MyXHQweCUwOHggQCAweCUwOHgsICU1ZCBjb3VudCwgJWQgZXh0YywgJThzLCAgU01DMlxuIiwKKwkgICAgICAgaW1tci0+aW1fYnJnYzIsCisJICAgICAgICh1aW50KSYoaW1tci0+aW1fYnJnYzIpLAorCSAgICAgICBEYXFfQlJHX0dldF9Db3VudCgxKSwKKwkgICAgICAgRGFxX0JSR19HZXRfRXh0Q2xrKDEpLAorCSAgICAgICBEYXFfQlJHX0dldF9FeHRDbGtfRGVzY3JpcHRpb24oMSkpOworICAgIH0KKyAgICBpZiAoaW1tci0+aW1fYnJnYzMgIT0gMCkgeworICAgICAgICBwcmludGYoIlx0YnJnYzNcdDB4JTA4eCBAIDB4JTA4eCwgJTVkIGNvdW50LCAlZCBleHRjLCAlOHMsICBTQ0MxXG4iLAorCSAgICAgICBpbW1yLT5pbV9icmdjMywKKwkgICAgICAgKHVpbnQpJihpbW1yLT5pbV9icmdjMyksCisJICAgICAgIERhcV9CUkdfR2V0X0NvdW50KDIpLAorCSAgICAgICBEYXFfQlJHX0dldF9FeHRDbGsoMiksCisJICAgICAgIERhcV9CUkdfR2V0X0V4dENsa19EZXNjcmlwdGlvbigyKSk7CisgICAgfQorICAgIGlmIChpbW1yLT5pbV9icmdjNSAhPSAwKSB7CisgICAgICAgIHByaW50ZigiXHRicmdjNVx0MHglMDh4IEAgMHglMDh4LCAlNWQgY291bnQsICVkIGV4dGMsICU4c1xuIiwKKwkgICAgICAgaW1tci0+aW1fYnJnYzUsCisJICAgICAgICh1aW50KSYoaW1tci0+aW1fYnJnYzUpLAorCSAgICAgICBEYXFfQlJHX0dldF9Db3VudCg0KSwKKwkgICAgICAgRGFxX0JSR19HZXRfRXh0Q2xrKDQpLAorCSAgICAgICBEYXFfQlJHX0dldF9FeHRDbGtfRGVzY3JpcHRpb24oNCkpOworICAgIH0KKyAgICBpZiAoaW1tci0+aW1fYnJnYzcgIT0gMCkgeworICAgICAgICBwcmludGYoIlx0YnJnYzdcdDB4JTA4eCBAIDB4JTA4eCwgJTVkIGNvdW50LCAlZCBleHRjLCAlOHNcbiIsCisJICAgICAgIGltbXItPmltX2JyZ2M3LAorCSAgICAgICAodWludCkmKGltbXItPmltX2JyZ2M3KSwKKwkgICAgICAgRGFxX0JSR19HZXRfQ291bnQoNiksCisJICAgICAgIERhcV9CUkdfR2V0X0V4dENsayg2KSwKKwkgICAgICAgRGFxX0JSR19HZXRfRXh0Q2xrX0Rlc2NyaXB0aW9uKDYpKTsKKyAgICB9CisKKyMgICBpZmRlZiBSVU5fU0NMS19PTl9CUkdfSU5UCisgICAgICAgIG1jbGtfZGl2aXNvciA9IERhcV9CUkdfUmF0ZShNQ0xLX0JSRykgLyBEYXFfQlJHX1JhdGUoU0NMS19CUkcpOworIyAgIGVsc2UKKyAgICAgICAgbWNsa19kaXZpc29yID0gRGFxX0JSR19HZXRfQ291bnQoU0NMS19CUkcpOworIyAgIGVuZGlmCisjICAgaWZkZWYgUlVOX0xSQ0xLX09OX0JSR19JTlQKKyAgICAgICAgc2Nsa19kaXZpc29yID0gRGFxX0JSR19SYXRlKFNDTEtfQlJHKSAvIERhcV9CUkdfUmF0ZShMUkNMS19CUkcpOworIyAgIGVsc2UKKyAgICAgICAgc2Nsa19kaXZpc29yID0gRGFxX0JSR19HZXRfQ291bnQoTFJDTEtfQlJHKTsKKyMgICBlbmRpZgorCisgICAgcHJpbnRmKCJcbkFEQy9EQUMgQ2xvY2tpbmcgKCVkLyVkKTpcbiIsIHNjbGtfZGl2aXNvciwgbWNsa19kaXZpc29yKTsKKyAgICBwcmludGYoIlx0TUNMSyAgJThkIEh6LCBvciAlM2R4IFNDTEssIG9yICUzZHggTFJDTEtcbiIsCisJICAgRGFxX0JSR19SYXRlKE1DTEtfQlJHKSwKKwkgICBtY2xrX2Rpdmlzb3IsCisJICAgbWNsa19kaXZpc29yICogc2Nsa19kaXZpc29yKTsKKyMgICBpZmRlZiBSVU5fU0NMS19PTl9CUkdfSU5UCisgICAgICAgIHByaW50ZigiXHRTQ0xLICAlOGQgSHosIG9yICUzZHggTFJDTEtcbiIsCisJICAgICAgIERhcV9CUkdfUmF0ZShTQ0xLX0JSRyksCisJICAgICAgIHNjbGtfZGl2aXNvcik7CisjICAgZWxzZQorICAgICAgICBwcmludGYoIlx0U0NMSyAgJThkIEh6LCBvciAlM2R4IExSQ0xLXG4iLAorCSAgICAgICBEYXFfQlJHX1JhdGUoTUNMS19CUkcpIC8gbWNsa19kaXZpc29yLAorCSAgICAgICBzY2xrX2Rpdmlzb3IpOworIyAgIGVuZGlmCisjICAgaWZkZWYgUlVOX0xSQ0xLX09OX0JSR19JTlQKKyAgICAgICAgcHJpbnRmKCJcdExSQ0xLICU4ZCBIelxuIiwKKwkgICAgICAgRGFxX0JSR19SYXRlKExSQ0xLX0JSRykpOworIyAgIGVsc2UKKyMgICAgICAgaWZkZWYgUlVOX1NDTEtfT05fQlJHX0lOVAorICAgICAgICAgICAgcHJpbnRmKCJcdExSQ0xLICU4ZCBIelxuIiwKKwkJICAgRGFxX0JSR19SYXRlKFNDTEtfQlJHKSAvIHNjbGtfZGl2aXNvcik7CisjICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiXHRMUkNMSyAlOGQgSHpcbiIsCisJCSAgIERhcV9CUkdfUmF0ZShNQ0xLX0JSRykgLyAobWNsa19kaXZpc29yICogc2Nsa19kaXZpc29yKSk7CisjICAgICAgIGVuZGlmCisjICAgZW5kaWYKKyAgICBwcmludGYoIlxuIik7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9zYWNzbmcvaW9jb25maWcuaCBiL2JvYXJkL3NhY3NuZy9pb2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTdmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYWNzbmcvaW9jb25maWcuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIEkvTyBQb3J0IGNvbmZpZ3VyYXRpb24gdGFibGUKKyAqCisgKiBJZiBjb25mIGlzIDEsIHRoZW4gdGhhdCBwb3J0IHBpbiB3aWxsIGJlIGNvbmZpZ3VyZWQgYXQgYm9vdCB0aW1lCisgKiBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgdmFsdWVzIHBvZHIvcGRpci9wcGFyL3Bzb3IvcGRhdCBmb3IgdGhhdCBlbnRyeQorICovCisKKyNpZmRlZiBTS0lQCisjdW5kZWYgU0tJUAorI2VuZGlmCisKKyNpZmRlZiBDT05GCisjdW5kZWYgQ09ORgorI2VuZGlmCisKKyNpZmRlZiBESU4KKyN1bmRlZiBESU4KKyNlbmRpZgorCisjaWZkZWYgRE9VVAorI3VuZGVmIERPVVQKKyNlbmRpZgorCisjaWZkZWYgR1BJTworI3VuZGVmIEdQSU8KKyNlbmRpZgorCisjaWZkZWYgU1BFQworI3VuZGVmIFNQRUMKKyNlbmRpZgorCisjaWZkZWYgQUNUVgorI3VuZGVmIEFDVFYKKyNlbmRpZgorCisjaWZkZWYgT1BFTgorI3VuZGVmIE9QRU4KKyNlbmRpZgorCisjZGVmaW5lIFNLSVAgMCAgLyogU0tJUCBvdmVyIHRoaXMgcG9ydCAqLworI2RlZmluZSBDT05GIDEgIC8qIENPTkZpZ3VyYXRpb24gdGhlIHBvcnQgKi8KKworI2RlZmluZSBESU4gIDAgIC8qIFBESVJ4IDA6IERpcmVjdGlvbiBJTiAgKi8KKyNkZWZpbmUgRE9VVCAxICAvKiBQRElSeCAxOiBEaXJlY3Rpb24gT1VUICovCisKKyNkZWZpbmUgR1BJTyAwICAvKiBQUEFSeCAwOiBHZW5lcmFsIFB1cnBvc2UgSS9PICovCisjZGVmaW5lIFNQRUMgMSAgLyogUFBBUnggMTogZGVkaWNhdGVkIHRvIGEgcGVyaXBoZXJhbCBmdW5jdGlvbiwgKi8KKyAgICAgICAgICAgICAgICAvKiAgICAgICAgICBpLmUuIHRoZSBwb3J0IGhhcyBhIFNQRUNpYWwgdXNlLiAqLworCisjZGVmaW5lIEFDVFYgMCAgLyogUE9EUnggMDogQUNUaVZlbHkgZHJpdmVuIGFzIGFuIG91dHB1dCAqLworI2RlZmluZSBPUEVOIDEgIC8qIFBPRFJ4IDE6IE9QRU4tZHJhaW4gZHJpdmVyICovCisKK2NvbnN0IGlvcF9jb25mX3QgaW9wX2NvbmZfdGFiWzRdWzMyXSA9IHsKKworICAgIC8qIFBvcnQgQSBjb25maWd1cmF0aW9uICovCisgICAgewkvKgkgICAgIGNvbmYgIHBwYXIgIHBzb3IgIHBkaXIgIHBvZHIgIHBkYXQgKi8KKwkvKiBQQTMxICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogUk9ESVM4KiAgICAgICAgKi8KKwkvKiBQQTMwICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogUk9ESVM3KiAgICAgICAgKi8KKwkvKiBQQTI5ICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogUk9ESVM2KiAgICAgICAgKi8KKwkvKiBQQTI4ICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogUk9ESVM1KiAgICAgICAgKi8KKwkvKiBQQTI3ICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogUk9ESVM0KiAgICAgICAgKi8KKwkvKiBQQTI2ICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogUk9ESVMzKiAgICAgICAgKi8KKwkvKiBQQTI1ICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogUk9ESVMyKiAgICAgICAgKi8KKwkvKiBQQTI0ICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogUk9ESVMxKiAgICAgICAgKi8KKwkvKiBQQTIzICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogT0RJU19FTiogICAgICAgKi8KKwkvKiBQQTIyICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogU1RMRUQyX0VOKiAgICAgKi8KKwkvKiBQQTIxICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogU1RMRUQxX0VOKiAgICAgKi8KKwkvKiBQQTIwICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogUExFRDNfRU4qICAgICAgKi8KKwkvKiBQQTE5ICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogUExFRDJfRU4qICAgICAgKi8KKyAgICAgICAgLyogUEExOCAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIFBMRUQxX0VOKiAgICAgICovCisJLyogUEExNyAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEExNiAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIERBQ19SU1QqICAgICAgICovCisJLyogUEExNSAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMSAgIH0sIC8qIENIMzRTREFUQV9QVSAgICovCisgICAgICAgIC8qIFBBMTQgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDEgICB9LCAvKiBDSDEyU0RBVEFfUFUgICAqLworICAgICAgICAvKiBQQTEzICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogU0xSQ0xLX0VOKiAgICAgKi8KKwkvKiBQQTEyICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogTVRSWF80QUNEQyogICAgKi8KKwkvKiBQQTExICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogTVRSWF80VEVEUyogICAgKi8KKwkvKiBQQTEwICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogTVRSWF80WFREUyogICAgKi8KKwkvKiBQQTkgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogTVRSWF8zQUNEQyogICAgKi8KKwkvKiBQQTggICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogTVRSWF8zVEVEUyogICAgKi8KKwkvKiBQQTcgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogTVRSWF8zWFREUyogICAgKi8KKwkvKiBQQTYgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogTVRSWF8yQUNEQyogICAgKi8KKwkvKiBQQTUgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogTVRSWF8yVEVEUyogICAgKi8KKwkvKiBQQTQgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogTVRSWF8yWFREUyogICAgKi8KKwkvKiBQQTMgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAwICAgfSwgLyogTi9DICAgICAgICAgICAgKi8KKwkvKiBQQTIgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogTVRSWF8xQUNEQyogICAgKi8KKwkvKiBQQTEgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSwgLyogTVRSWF8xVEVEUyogICAgKi8KKwkvKiBQQTAgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAxICAgfSAgLyogTVRSWF8xWFREUyogICAgKi8KKyAgICB9LAorCisgICAgLyogUG9ydCBCIGNvbmZpZ3VyYXRpb24gKi8KKyAgICB7CS8qCSAgICAgY29uZiAgcHBhciAgcHNvciAgcGRpciAgcG9kciAgcGRhdCAqLworCS8qIFBCMzEgKi8geyBDT05GLCBTUEVDLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9UWF9FUiAqLworCS8qIFBCMzAgKi8geyBDT05GLCBTUEVDLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9SWF9EViAqLworCS8qIFBCMjkgKi8geyBDT05GLCBTUEVDLCAgIDEsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9UWF9FTiAqLworCS8qIFBCMjggKi8geyBDT05GLCBTUEVDLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9SWF9FUiAqLworCS8qIFBCMjcgKi8geyBDT05GLCBTUEVDLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9DT0wgICAqLworCS8qIFBCMjYgKi8geyBDT05GLCBTUEVDLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9DUlMgICAqLworCS8qIFBCMjUgKi8geyBDT05GLCBTUEVDLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9UWEQzICAqLworCS8qIFBCMjQgKi8geyBDT05GLCBTUEVDLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9UWEQyICAqLworCS8qIFBCMjMgKi8geyBDT05GLCBTUEVDLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9UWEQxICAqLworCS8qIFBCMjIgKi8geyBDT05GLCBTUEVDLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9UWEQwICAqLworCS8qIFBCMjEgKi8geyBDT05GLCBTUEVDLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9SWEQwICAqLworCS8qIFBCMjAgKi8geyBDT05GLCBTUEVDLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9SWEQxICAqLworCS8qIFBCMTkgKi8geyBDT05GLCBTUEVDLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9SWEQyICAqLworCS8qIFBCMTggKi8geyBDT05GLCBTUEVDLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBGQ0MyIE1JSV9SWEQzICAqLworCS8qIFBCMTcgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBCMTYgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBCMTUgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBCMTQgKi8geyBDT05GLCBTUEVDLCAgIDEsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBMMVJYREMxLCAgIEJTREFUQV9BREMxMiAqLworCS8qIFBCMTMgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBCMTIgKi8geyBDT05GLCBTUEVDLCAgIDEsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBMMVJTWU5DQzEsIExSQ0xLICAqLworCS8qIFBCMTEgKi8geyBDT05GLCBTUEVDLCAgIDEsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBMMVRYREQxLCAgIFJTREFUQV9EQUMxMiAqLworCS8qIFBCMTAgKi8geyBDT05GLCBTUEVDLCAgIDEsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBMMVJYREQxLCAgIEJTREFUQV9BREMzNCAqLworCS8qIFBCOSAgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBCOCAgKi8geyBDT05GLCBTUEVDLCAgIDEsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBMMVJTWU5DRDEsIExSQ0xLICAqLworCS8qIFBCNyAgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBCNiAgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDEgICB9LCAvKiBYQ0lURV9TSEROICAgICAqLworCS8qIFBCNSAgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDEgICB9LCAvKiBUUklHR0VSICAgICAgICAqLworCS8qIFBCNCAgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBBUk0gICAgICAgICAgICAqLworCS8qIFBCMyAgKi8geyBTS0lQLCBHUElPLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBwaW4gZG9lc24ndCBleGlzdCAqLworCS8qIFBCMiAgKi8geyBTS0lQLCBHUElPLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBwaW4gZG9lc24ndCBleGlzdCAqLworCS8qIFBCMSAgKi8geyBTS0lQLCBHUElPLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBwaW4gZG9lc24ndCBleGlzdCAqLworCS8qIFBCMCAgKi8geyBTS0lQLCBHUElPLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9ICAvKiBwaW4gZG9lc24ndCBleGlzdCAqLworICAgIH0sCisKKyAgICAvKiBQb3J0IEMgKi8KKyAgICB7CS8qCSAgICAgIGNvbmYgcHBhciAgcHNvciAgcGRpciAgcG9kciAgcGRhdCAqLworCS8qIFBDMzEgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBDMzAgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBDMjkgKi8geyBDT05GLCBTUEVDLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBDTEszLCAgTUNMSyAgICAqLworCS8qIFBDMjggKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBUT1VUMiogICAgICAgICAqLworI2lmZGVmIFFRUQorCS8qIFBDMjggKi8geyBDT05GLCBTUEVDLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBUT1VUMiogICAgICAgICAqLworI2VuZGlmCisJLyogUEMyNyAqLyB7IENPTkYsIFNQRUMsICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0sIC8qIENMSzUsICBTQ0xLICAgICovCisJLyogUEMyNiAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEMyNSAqLyB7IENPTkYsIFNQRUMsICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0sIC8qIENMSzcsICBTQ0xLICAgICovCisJLyogUEMyNCAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEMyMyAqLyB7IENPTkYsIFNQRUMsICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0sIC8qIENMSzksICBNQ0xLICAgICovCisJLyogUEMyMiAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEMyMSAqLyB7IENPTkYsIFNQRUMsICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIEJSR082IChMUkNMSykgICovCisJLyogUEMyMCAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEMxOSAqLyB7IENPTkYsIFNQRUMsICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0sIC8qIENMSzEzLCBNSUlfUlhDTEsgICovCisJLyogUEMxOCAqLyB7IENPTkYsIFNQRUMsICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0sIC8qIENMSzE0LCBNSUlfVFhDTEsgICovCisgICAgICAgIC8qIFBDMTcgKi8geyBDT05GLCBTUEVDLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBCUkdPOCAoU0NMSykgICAqLworCS8qIFBDMTYgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBDMTUgKi8geyBDT05GLCBTUEVDLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBTTUMyX1RYICAgICAgICAqLworCS8qIFBDMTQgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBDMTMgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBDMTIgKi8geyBDT05GLCBTUEVDLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBURE1fU1RSQjMgICAgICAqLworCS8qIFBDMTEgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBDMTAgKi8geyBDT05GLCBTUEVDLCAgIDEsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBURE1fU1RSQjQgICAgICAqLworCS8qIFBDOSAgKi8geyBDT05GLCBHUElPLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBCUERJU19JTjMgICAgICAqLworCS8qIFBDOCAgKi8geyBDT05GLCBHUElPLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBCUERJU19JTjIgICAgICAqLworCS8qIFBDNyAgKi8geyBDT05GLCBHUElPLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBCUERJU19JTjEgICAgICAqLworCS8qIFBDNiAgKi8geyBDT05GLCBHUElPLCAgIDAsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBOL0MgICAgICAgICAgICAqLworCS8qIFBDNSAgKi8geyBDT05GLCBHUElPLCAgIDAsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBCVFNUX0lOMiogICAgICAqLworICAgICAgICAvKiBQQzQgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRElOLCAgQUNUViwgICAwICAgfSwgLyogQlRTVF9JTjEqICAgICAgKi8KKwkvKiBQQzMgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRElOLCAgQUNUViwgICAwICAgfSwgLyogTVVTSF9TVEFUICAgICAgKi8KKwkvKiBQQzIgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRElOLCAgQUNUViwgICAwICAgfSwgLyogT1VURFJWX1NUQVQgICAgKi8KKwkvKiBQQzEgICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgT1BFTiwgICAxICAgfSwgLyogUEhZX01ESU8gICAgICAgKi8KKyAgICAgICAgLyogUEMwICAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMSAgIH0sIC8qIFBIWV9NREMgICAgICAgICovCisgICAgfSwKKworICAgIC8qIFBvcnQgRCAqLworICAgIHsJLyoJICAgICAgY29uZiBwcGFyICBwc29yICBwZGlyICBwb2RyICBwZGF0ICovCisJLyogUEQzMSAqLyB7IENPTkYsIFNQRUMsICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0sIC8qIFNDQzFfUlggICAgICAgICovCisJLyogUEQzMCAqLyB7IENPTkYsIFNQRUMsICAgMSwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIFNDQzFfVFggICAgICAgICovCisJLyogUEQyOSAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQyOCAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQyNyAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQyNiAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQyNSAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQyNCAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQyMyAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQyMiAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQyMSAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQyMCAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMSAgIH0sIC8qIFNQSV9BRENfQ1MqICAgICovCisJLyogUEQxOSAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMSAgIH0sIC8qIFNQSV9EQUNfQ1MqICAgICovCisjaWYgZGVmaW5lZChDT05GSUdfU09GVF9TUEkpCisJLyogUEQxOCAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIFNQSV9DTEsgICAgICAgICovCisJLyogUEQxNyAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIFNQSV9NT1NJICAgICAgICovCisJLyogUEQxNiAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0sIC8qIFNQSV9NSVNPICAgICAgICovCisjZWxzZQorCS8qIFBEMTggKi8geyBDT05GLCBTUEVDLCAgIDEsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBTUElfQ0xLICAgICAgICAqLworCS8qIFBEMTcgKi8geyBDT05GLCBTUEVDLCAgIDEsICBET1VULCBBQ1RWLCAgIDAgICB9LCAvKiBTUElfTU9TSSAgICAgICAqLworCS8qIFBEMTYgKi8geyBDT05GLCBTUEVDLCAgIDEsICBESU4sICBBQ1RWLCAgIDAgICB9LCAvKiBTUElfTUlTTyAgICAgICAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU09GVF9JMkMpCisJLyogUEQxNSAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIE9QRU4sICAgMSAgIH0sIC8qIEkyQ19TREEgICAgICAgICovCisJLyogUEQxNCAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMSAgIH0sIC8qIEkyQ19TQ0wgICAgICAgICovCisjZWxzZQorI2lmIGRlZmluZWQoQ09ORklHX0hBUkRfSTJDKQorCS8qIFBEMTUgKi8geyBDT05GLCBTUEVDLCAgIDEsICBESU4sICBPUEVOLCAgIDAgICB9LCAvKiBJMkNfU0RBICAgICAgICAqLworCS8qIFBEMTQgKi8geyBDT05GLCBTUEVDLCAgIDEsICBESU4sICBPUEVOLCAgIDAgICB9LCAvKiBJMkNfU0NMICAgICAgICAqLworI2Vsc2UgLyogbm9ybWFsIEkvTyBwb3J0IHBpbnMgKi8KKwkvKiBQRDE1ICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAwICAgfSwgLyogSTJDX1NEQSAgICAgICAgKi8KKwkvKiBQRDE0ICovIHsgQ09ORiwgR1BJTywgICAwLCAgRE9VVCwgQUNUViwgICAwICAgfSwgLyogSTJDX1NDTCAgICAgICAgKi8KKyNlbmRpZgorI2VuZGlmCisJLyogUEQxMyAqLyB7IENPTkYsIFNQRUMsICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIFRETV9TVFJCMSAgICAgICovCisJLyogUEQxMiAqLyB7IENPTkYsIFNQRUMsICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIFRETV9TVFJCMiAgICAgICovCisJLyogUEQxMSAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQxMCAqLyB7IENPTkYsIFNQRUMsICAgMSwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIEJSR080IChNQ0xLKSAgICovCisJLyogUEQ5ICAqLyB7IENPTkYsIFNQRUMsICAgMCwgIERPVVQsIEFDVFYsICAgMCAgIH0sIC8qIFNNQzFfVFggICAgICAgICovCisJLyogUEQ4ICAqLyB7IENPTkYsIFNQRUMsICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0sIC8qIFNNQzFfUlggICAgICAgICovCisJLyogUEQ3ICAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMSAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQ2ICAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMSAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQ1ICAqLyB7IENPTkYsIEdQSU8sICAgMCwgIERPVVQsIEFDVFYsICAgMSAgIH0sIC8qIE4vQyAgICAgICAgICAgICovCisJLyogUEQ0ICAqLyB7IENPTkYsIFNQRUMsICAgMSwgIERPVVQsIEFDVFYsICAgMSAgIH0sIC8qIFNNQzJfUlggICAgICAgICovCisJLyogUEQzICAqLyB7IFNLSVAsIEdQSU8sICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0sIC8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCisJLyogUEQyICAqLyB7IFNLSVAsIEdQSU8sICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0sIC8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCisJLyogUEQxICAqLyB7IFNLSVAsIEdQSU8sICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0sIC8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCisJLyogUEQwICAqLyB7IFNLSVAsIEdQSU8sICAgMCwgIERJTiwgIEFDVFYsICAgMCAgIH0gIC8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCisgICAgfQorfTsKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvc2FuZHBvaW50L3NhbmRwb2ludC5jIGIvYm9hcmQvc2FuZHBvaW50L3NhbmRwb2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMzg1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYW5kcG9pbnQvc2FuZHBvaW50LmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFJvYiBUYXlsb3IsIEZseWluZyBQaWcgU3lzdGVtcy4gcm9idEBmbHlpbmdwaWcuY29tLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4MjR4Lmg+CisjaW5jbHVkZSA8cGNpLmg+CisKK2ludCBjaGVja2JvYXJkICh2b2lkKQoreworCS8qVE9ETzogQ2hlY2sgcHJvY2Vzc29yIHR5cGUgKi8KKworCXB1dHMgKAkiQm9hcmQ6IFNhbmRwb2ludCAiCisjaWZkZWYgQ09ORklHX01QQzgyNDAKKwkJIjgyNDAiCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVBDODI0NQorCQkiODI0NSIKKyNlbmRpZgorCQkiIFVuaXR5ICMjVGVzdCBub3QgaW1wbGVtZW50ZWQgeWV0IyNcbiIpOworCXJldHVybiAwOworfQorCisjaWYgMCAJLyogTk9UIFVTRUQgKi8KK2ludCBjaGVja2ZsYXNoICh2b2lkKQoreworCS8qIFRPRE86IFhYWCBYWFggWFhYICovCisJcHJpbnRmICgiIyMgVGVzdCBub3QgaW1wbGVtZW50ZWQgeWV0ICMjXG4iKTsKKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYKKworbG9uZyBpbnQgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQoreworCWludAkJIGksIGNudDsKKwl2b2xhdGlsZSB1Y2hhciAqIGJhc2U9IENGR19TRFJBTV9CQVNFOworCXZvbGF0aWxlIHVsb25nICogYWRkcjsKKwl1bG9uZwkJIHNhdmVbMzJdOworCXVsb25nCQkgdmFsLCByZXQgID0gMDsKKworCWZvciAoaT0wLCBjbnQ9KENGR19NQVhfUkFNX1NJWkUgLyBzaXplb2YobG9uZykpID4+IDE7IGNudCA+IDA7IGNudCA+Pj0gMSkgeworCQlhZGRyID0gKHZvbGF0aWxlIHVsb25nICopYmFzZSArIGNudDsKKwkJc2F2ZVtpKytdID0gKmFkZHI7CisJCSphZGRyID0gfmNudDsKKwl9CisKKwlhZGRyID0gKHZvbGF0aWxlIHVsb25nICopYmFzZTsKKwlzYXZlW2ldID0gKmFkZHI7CisJKmFkZHIgPSAwOworCisJaWYgKCphZGRyICE9IDApIHsKKwkJKmFkZHIgPSBzYXZlW2ldOworCQlnb3RvIERvbmU7CisJfQorCisJZm9yIChjbnQgPSAxOyBjbnQgPD0gQ0ZHX01BWF9SQU1fU0laRSAvIHNpemVvZihsb25nKTsgY250IDw8PSAxKSB7CisJCWFkZHIgPSAodm9sYXRpbGUgdWxvbmcgKiliYXNlICsgY250OworCQl2YWwgPSAqYWRkcjsKKwkJKmFkZHIgPSBzYXZlWy0taV07CisJCWlmICh2YWwgIT0gfmNudCkgeworCQkJdWxvbmcgbmV3X2JhbmswX2VuZCA9IGNudCAqIHNpemVvZihsb25nKSAtIDE7CisJCQl1bG9uZyBtZWFyMSAgPSBtcGM4MjR4X21wYzEwN19nZXRyZWcoTUVBUjEpOworCQkJdWxvbmcgZW1lYXIxID0gbXBjODI0eF9tcGMxMDdfZ2V0cmVnKEVNRUFSMSk7CisJCQltZWFyMSA9ICAobWVhcjEgICYgMHhGRkZGRkYwMCkgfAorCQkJKChuZXdfYmFuazBfZW5kICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfQUREUl9TSElGVCk7CisJCQllbWVhcjEgPSAoZW1lYXIxICYgMHhGRkZGRkYwMCkgfAorCQkJKChuZXdfYmFuazBfZW5kICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpOworCQkJbXBjODI0eF9tcGMxMDdfc2V0cmVnKE1FQVIxLCAgbWVhcjEpOworCQkJbXBjODI0eF9tcGMxMDdfc2V0cmVnKEVNRUFSMSwgZW1lYXIxKTsKKworCQkJcmV0ID0gY250ICogc2l6ZW9mKGxvbmcpOworCQkJZ290byBEb25lOworCQl9CisJfQorCisJcmV0ID0gQ0ZHX01BWF9SQU1fU0laRTsKK0RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgUENJIERldmljZXMsIHJlcG9ydCBkZXZpY2VzIGZvdW5kLgorICovCisjaWZuZGVmIENPTkZJR19QQ0lfUE5QCitzdGF0aWMgc3RydWN0IHBjaV9jb25maWdfdGFibGUgcGNpX3NhbmRwb2ludF9jb25maWdfdGFibGVbXSA9IHsKKwl7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB4MGYsIFBDSV9BTllfSUQsCisJICBwY2lfY2ZnZnVuY19jb25maWdfZGV2aWNlLCB7IFBDSV9FTkVUMF9JT0FERFIsCisJCQkJICAgICAgIFBDSV9FTkVUMF9NRU1BRERSLAorCQkJCSAgICAgICBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIgfX0sCisJeyBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAweDEwLCBQQ0lfQU5ZX0lELAorCSAgcGNpX2NmZ2Z1bmNfY29uZmlnX2RldmljZSwgeyBQQ0lfRU5FVDFfSU9BRERSLAorCQkJCSAgICAgICBQQ0lfRU5FVDFfTUVNQUREUiwKKwkJCQkgICAgICAgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSIH19LAorCXsgfQorfTsKKyNlbmRpZgorCitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZSA9IHsKKyNpZm5kZWYgQ09ORklHX1BDSV9QTlAKKwljb25maWdfdGFibGU6IHBjaV9zYW5kcG9pbnRfY29uZmlnX3RhYmxlLAorI2VuZGlmCit9OworCit2b2lkIHBjaV9pbml0KHZvaWQpCit7CisJcGNpX21wYzgyNHhfaW5pdCgmaG9zZSk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9zaGFubm9uL3UtYm9vdC5sZHMgYi9ib2FyZC9zaGFubm9uL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiMGFkZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NoYW5ub24vdS1ib290LmxkcwpAQCAtMCwwICsxLDUzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgICAgICAgIC4gPSAweDAwMDAwMDAwOworCisgICAgICAgIC4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvc2ExMTAwL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5kYXRhIDogeyAqKC5kYXRhKSB9CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAuZ290IDogeyAqKC5nb3QpIH0KKworCWFybWJvb3RfZW5kX2RhdGEgPSAuOworCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLmJzcyA6IHsgKiguYnNzKSB9CisKKwlhcm1ib290X2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9zaWVtZW5zL0NDTS9jY20uYyBiL2JvYXJkL3NpZW1lbnMvQ0NNL2NjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OWYzOGYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zaWVtZW5zL0NDTS9jY20uYwpAQCAtMCwwICsxLDQ0MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGxvbmcgaW50IGRyYW1fc2l6ZSAobG9uZyBpbnQsIGxvbmcgaW50ICosIGxvbmcgaW50KTsKK3ZvaWQgY2FuX2RyaXZlcl9lbmFibGUgKHZvaWQpOwordm9pZCBjYW5fZHJpdmVyX2Rpc2FibGUgKHZvaWQpOworCitpbnQgZnBnYV9pbml0KHZvaWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUJX05PVF9VU0VEXwkweEZGRkZGRkZGCisKK2NvbnN0IHVpbnQgc2RyYW1fdGFibGVbXSA9Cit7CisJLyoKKwkgKiBTaW5nbGUgUmVhZC4gKE9mZnNldCAwIGluIFVQTUEgUkFNKQorCSAqLworCTB4MUYwREZDMDQsIDB4RUVBRkJDMDQsIDB4MTFBRjdDMDQsIDB4RUZCQUZDMDAsCisJMHgxRkY1RkM0NywgLyogbGFzdCAqLworCS8qCisJICogU0RSQU0gSW5pdGlhbGl6YXRpb24gKG9mZnNldCA1IGluIFVQTUEgUkFNKQorCSAqCisJICogVGhpcyBpcyBubyBVUE0gZW50cnkgcG9pbnQuIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbiB1c2VzCisJICogdGhlIHJlbWFpbmluZyBzcGFjZSB0byBlc3RhYmxpc2ggYW4gaW5pdGlhbGl6YXRpb24KKwkgKiBzZXF1ZW5jZSwgd2hpY2ggaXMgZXhlY3V0ZWQgYnkgYSBSVU4gY29tbWFuZC4KKwkgKgorCSAqLworCQkgICAgMHgxRkY1RkMzNCwgMHhFRkVBQkMzNCwgMHgxRkI1N0MzNSwgLyogbGFzdCAqLworCS8qCisJICogQnVyc3QgUmVhZC4gKE9mZnNldCA4IGluIFVQTUEgUkFNKQorCSAqLworCTB4MUYwREZDMDQsIDB4RUVBRkJDMDQsIDB4MTBBRjdDMDQsIDB4RjBBRkZDMDAsCisJMHhGMEFGRkMwMCwgMHhGMUFGRkMwMCwgMHhFRkJBRkMwMCwgMHgxRkY1RkM0NywgLyogbGFzdCAqLworCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCisJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKKwkvKgorCSAqIFNpbmdsZSBXcml0ZS4gKE9mZnNldCAxOCBpbiBVUE1BIFJBTSkKKwkgKi8KKwkweDFGMERGQzA0LCAweEVFQUJCQzAwLCAweDAxQjI3QzA0LCAweDFGRjVGQzQ3LCAvKiBsYXN0ICovCisJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKKwkvKgorCSAqIEJ1cnN0IFdyaXRlLiAoT2Zmc2V0IDIwIGluIFVQTUEgUkFNKQorCSAqLworCTB4MUYwREZDMDQsIDB4RUVBQkJDMDAsIDB4MTBBNzdDMDAsIDB4RjBBRkZDMDAsCisJMHhGMEFGRkMwMCwgMHhFMUJBRkMwNCwgMHgxRkY1RkM0NywgLyogbGFzdCAqLworCQkJCQkgICAgX05PVF9VU0VEXywKKwlfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAorCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCisJLyoKKwkgKiBSZWZyZXNoICAoT2Zmc2V0IDMwIGluIFVQTUEgUkFNKQorCSAqLworCTB4MUZGRDdDODQsIDB4RkZGRkZDMDQsIDB4RkZGRkZDMDQsIDB4RkZGRkZDMDQsCisJMHhGRkZGRkM4NCwgMHhGRkZGRkMwNywgLyogbGFzdCAqLworCQkJCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCisJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKKwkvKgorCSAqIEV4Y2VwdGlvbi4gKE9mZnNldCAzYyBpbiBVUE1BIFJBTSkKKwkgKi8KKwkweDdGRkZGQzA3LCAvKiBsYXN0ICovCisJCSAgICBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qCisgKiBDaGVjayBCb2FyZCBJZGVudGl0eToKKyAqCisgKiBBbHdheXMgcmV0dXJuIDEgKG5vIHNlY29uZCBEUkFNIGJhbmsgc2luY2UgYmFzZWQgb24gVFFNOHh4TCBtb2R1bGUpCisgKi8KKworaW50IGNoZWNrYm9hcmQgKHZvaWQpCit7CisgICAgdW5zaWduZWQgY2hhciAqczsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls2NF07CisKKyAgICBzID0gKGdldGVudl9yICgic2VyaWFsIyIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpID4gMCkgPyBidWYgOiBOVUxMOworCisgICAgcHV0cyAoIkJvYXJkOiBTaWVtZW5zIENDTSIpOworCisgICAgaWYgKHMpIHsKKwkgICAgcHV0cyAoIiAoIik7CisKKwkgICAgZm9yICg7ICpzOyArK3MpIHsKKwkJaWYgKCpzID09ICcgJykKKwkJICAgIGJyZWFrOworCQlwdXRjICgqcyk7CisJICAgIH0KKwkgICAgcHV0YyAoJyknKTsKKyAgICB9CisKKyAgICBwdXRjICgnXG4nKTsKKworICAgIHJldHVybiAoMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIElmIFBvd2VyLU9uLVJlc2V0IHN3aXRjaCBvZmYgdGhlIFJlZCBhbmQgR3JlZW4gTEVEOiBBdCByZXNldCwgdGhlCisgKiBkYXRhIGRpcmVjdGlvbiByZWdpc3RlcnMgYXJlIGNsZWFyZWQgYW5kIG11c3QgdGhlcmVmb3JlIGJlIHJlc3RvcmVkLgorICovCisjZGVmaW5lIFJTUl9DU1JTCTB4MDgwMDAwMDAKKworaW50IHBvd2VyX29uX3Jlc2V0KHZvaWQpCit7CisgICAgLyogVGVzdCBSZXNldCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyAgICByZXR1cm4gKCh2b2xhdGlsZSBpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9jbGtyc3QuY2FyX3JzciAmIFJTUl9DU1JTID8gMDoxOworfQorCisjZGVmaW5lIFBCX0xFRF9HUkVFTgkweDEwMDAwCQkvKiByZWQgTEVEIGlzIG9uIFBCLjE1ICovCisjZGVmaW5lIFBCX0xFRF9SRUQJMHgyMDAwMAkJLyogcmVkIExFRCBpcyBvbiBQQi4xNCAqLworI2RlZmluZSBQQl9MRURTCQkoUEJfTEVEX0dSRUVOIHwgUEJfTEVEX1JFRCk7CisKK3N0YXRpYyB2b2lkIGluaXRfbGVkcyAodm9pZCkKK3sKKyAgICB2b2xhdGlsZSBpbW1hcF90ICppbW1hcCAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworCisgICAgaW1tYXAtPmltX2NwbS5jcF9wYnBhciAmPSB+UEJfTEVEUzsKKyAgICBpbW1hcC0+aW1fY3BtLmNwX3Bib2RyICY9IH5QQl9MRURTOworICAgIGltbWFwLT5pbV9jcG0uY3BfcGJkaXIgfD0gIFBCX0xFRFM7CisgICAgLyogQ2hlY2sgc3RvcCByZXNldCBzdGF0dXMgKi8KKyAgICBpZiAocG93ZXJfb25fcmVzZXQoKSkgeworCSAgICBpbW1hcC0+aW1fY3BtLmNwX3BiZGF0ICY9IH5QQl9MRURTOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCit7CisgICAgdm9sYXRpbGUgaW1tYXBfdCAgICAgKmltbWFwICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisgICAgdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOworICAgIGxvbmcgaW50IHNpemU4LCBzaXplOTsKKyAgICBsb25nIGludCBzaXplID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIHJlZzsKKworICAgIHVwbWNvbmZpZyhVUE1BLCAodWludCAqKXNkcmFtX3RhYmxlLCBzaXplb2Yoc2RyYW1fdGFibGUpL3NpemVvZih1aW50KSk7CisKKyAgICAvKgorICAgICAqIFByZWxpbWluYXJ5IHByZXNjYWxlciBmb3IgcmVmcmVzaCAoZGVwZW5kcyBvbiBudW1iZXIgb2YKKyAgICAgKiBiYW5rcyk6IFRoaXMgdmFsdWUgaXMgc2VsZWN0ZWQgZm9yIGZvdXIgY3ljbGVzIGV2ZXJ5IDYyLjQgdXMKKyAgICAgKiB3aXRoIHR3byBTRFJBTSBiYW5rcyBvciBmb3VyIGN5Y2xlcyBldmVyeSAzMS4yIHVzIHdpdGggb25lCisgICAgICogYmFuay4gSXQgd2lsbCBiZSBhZGp1c3RlZCBhZnRlciBtZW1vcnkgc2l6aW5nLgorICAgICAqLworICAgIG1lbWN0bC0+bWVtY19tcHRwciA9IENGR19NUFRQUl8yQktfOEs7CisKKyAgICBtZW1jdGwtPm1lbWNfbWFyICA9IDB4MDAwMDAwODg7CisKKyAgICAvKgorICAgICAqIE1hcCBjb250cm9sbGVyIGJhbmtzIDIgYW5kIDMgdG8gdGhlIFNEUkFNIGJhbmtzIDIgYW5kIDMgYXQKKyAgICAgKiBwcmVsaW1pbmFyeSBhZGRyZXNzZXMgLSB0aGVzZSBoYXZlIHRvIGJlIG1vZGlmaWVkIGFmdGVyIHRoZQorICAgICAqIFNEUkFNIHNpemUgaGFzIGJlZW4gZGV0ZXJtaW5lZC4KKyAgICAgKi8KKyAgICBtZW1jdGwtPm1lbWNfb3IyID0gQ0ZHX09SMl9QUkVMSU07CisgICAgbWVtY3RsLT5tZW1jX2JyMiA9IENGR19CUjJfUFJFTElNOworCisgICAgbWVtY3RsLT5tZW1jX21hbXIgPSBDRkdfTUFNUl84Q09MICYgKH4oTUFNUl9QVEFFKSk7IC8qIG5vIHJlZnJlc2ggeWV0ICovCisKKyAgICB1ZGVsYXkoMjAwKTsKKworICAgIC8qIHBlcmZvcm0gU0RSQU0gaW5pdGlhbGl6c2F0aW9uIHNlcXVlbmNlICovCisKKyAgICBtZW1jdGwtPm1lbWNfbWNyICA9IDB4ODAwMDQxMDU7CS8qIFNEUkFNIGJhbmsgMCAqLworICAgIHVkZWxheSgxKTsKKyAgICBtZW1jdGwtPm1lbWNfbWNyICA9IDB4ODAwMDQyMzA7CS8qIFNEUkFNIGJhbmsgMCAtIGV4ZWN1dGUgdHdpY2UgKi8KKyAgICB1ZGVsYXkoMSk7CisKKyAgICBtZW1jdGwtPm1lbWNfbWFtciB8PSBNQU1SX1BUQUU7CS8qIGVuYWJsZSByZWZyZXNoICovCisKKyAgICB1ZGVsYXkgKDEwMDApOworCisgICAgLyoKKyAgICAgKiBDaGVjayBCYW5rIDAgTWVtb3J5IFNpemUgZm9yIHJlLWNvbmZpZ3VyYXRpb24KKyAgICAgKgorICAgICAqIHRyeSA4IGNvbHVtbiBtb2RlCisgICAgICovCisgICAgc2l6ZTggPSBkcmFtX3NpemUgKENGR19NQU1SXzhDT0wsICh1bG9uZyAqKVNEUkFNX0JBU0UyX1BSRUxJTSwgU0RSQU1fTUFYX1NJWkUpOworCisgICAgdWRlbGF5ICgxMDAwKTsKKworICAgIC8qCisgICAgICogdHJ5IDkgY29sdW1uIG1vZGUKKyAgICAgKi8KKyAgICBzaXplOSA9IGRyYW1fc2l6ZSAoQ0ZHX01BTVJfOUNPTCwgKHVsb25nICopU0RSQU1fQkFTRTJfUFJFTElNLCBTRFJBTV9NQVhfU0laRSk7CisKKyAgICBpZiAoc2l6ZTggPCBzaXplOSkgewkJLyogbGVhdmUgY29uZmlndXJhdGlvbiBhdCA5IGNvbHVtbnMJKi8KKwlzaXplID0gc2l6ZTk7CisvKglkZWJ1ZyAoIlNEUkFNIGluIDkgY29sdW1uIG1vZGU6ICVsZCBNQlxuIiwgc2l6ZSA+PiAyMCk7CSovCisgICAgfSBlbHNlIHsJCQkJLyogYmFjayB0byA4IGNvbHVtbnMJCQkqLworCXNpemUgPSBzaXplODsKKwltZW1jdGwtPm1lbWNfbWFtciA9IENGR19NQU1SXzhDT0w7CisJdWRlbGF5KDUwMCk7CisvKglkZWJ1ZyAoIlNEUkFNIGluIDggY29sdW1uIG1vZGU6ICVsZCBNQlxuIiwgc2l6ZSA+PiAyMCk7CSovCisgICAgfQorCisgICAgdWRlbGF5ICgxMDAwKTsKKworICAgIC8qCisgICAgICogQWRqdXN0IHJlZnJlc2ggcmF0ZSBkZXBlbmRpbmcgb24gU0RSQU0gdHlwZQorICAgICAqIEZvciB0eXBlcyA+IDEyOCBNQml0IGxlYXZlIGl0IGF0IHRoZSBjdXJyZW50IChmYXN0KSByYXRlCisgICAgICovCisgICAgaWYgKHNpemUgPCAweDAyMDAwMDAwKSB7CisJLyogcmVkdWNlIHRvIDE1LjYgdXMgKDYyLjQgdXMgLyBxdWFkKSAqLworCW1lbWN0bC0+bWVtY19tcHRwciA9IENGR19NUFRQUl8yQktfNEs7CisJdWRlbGF5KDEwMDApOworICAgIH0KKworICAgIC8qCisgICAgICogRmluYWwgbWFwcGluZworICAgICAqLworCisgICAgbWVtY3RsLT5tZW1jX29yMiA9ICgoLXNpemUpICYgMHhGRkZGMDAwMCkgfCBDRkdfT1JfVElNSU5HX1NEUkFNOworICAgIG1lbWN0bC0+bWVtY19icjIgPSAoQ0ZHX1NEUkFNX0JBU0UgJiBCUl9CQV9NU0spIHwgQlJfTVNfVVBNQSB8IEJSX1Y7CisKKworICAgIC8qIGFkanVzdCByZWZyZXNoIHJhdGUgZGVwZW5kaW5nIG9uIFNEUkFNIHR5cGUsIG9uZSBiYW5rICovCisgICAgcmVnID0gbWVtY3RsLT5tZW1jX21wdHByOworICAgIHJlZyA+Pj0gMTsJLyogcmVkdWNlIHRvIENGR19NUFRQUl8xQktfOEsgLyBfNEsgKi8KKyAgICBtZW1jdGwtPm1lbWNfbXB0cHIgPSByZWc7CisKKyAgICBjYW5fZHJpdmVyX2VuYWJsZSAoKTsKKyAgICBpbml0X2xlZHMgKCk7CisKKyAgICB1ZGVsYXkoMTAwMDApOworCisgICAgcmV0dXJuIChzaXplKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogV2FybmluZyAtIGJvdGggdGhlIFBVTUEgbG9hZCBtb2RlIGFuZCB0aGUgQ0FOIGRyaXZlciB1c2UgVVBNIEIsCisgKiBzbyBtYWtlIHN1cmUgb25seSBvbmUgb2YgYm90aCBpcyBhY3RpdmUuCisgKi8KK3ZvaWQgY2FuX2RyaXZlcl9lbmFibGUgKHZvaWQpCit7CisgICAgdm9sYXRpbGUgaW1tYXBfdCAgICAgKmltbWFwICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisgICAgdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOworCisgICAgLyogSW5pdGlhbGl6ZSBNQk1SICovCisgICAgbWVtY3RsLT5tZW1jX21ibXIgPSBNQU1SX0dQTF9CNERJUzsJLyogR1BMX0I0IG91cHV0IGxpbmUgRGlzYWJsZSAqLworCisgICAgLyogSW5pdGlhbGl6ZSBVUE1CIGZvciBDQU46IHNpbmdsZSByZWFkICovCisgICAgbWVtY3RsLT5tZW1jX21kciA9IDB4RkZGRkMwMDQ7CisgICAgbWVtY3RsLT5tZW1jX21jciA9IDB4MDEwMCB8IFVQTUI7CisKKyAgICBtZW1jdGwtPm1lbWNfbWRyID0gMHgwRkZGRDAwNDsKKyAgICBtZW1jdGwtPm1lbWNfbWNyID0gMHgwMTAxIHwgVVBNQjsKKworICAgIG1lbWN0bC0+bWVtY19tZHIgPSAweDBGRkZDMDAwOworICAgIG1lbWN0bC0+bWVtY19tY3IgPSAweDAxMDIgfCBVUE1COworCisgICAgbWVtY3RsLT5tZW1jX21kciA9IDB4M0ZGRkMwMDQ7CisgICAgbWVtY3RsLT5tZW1jX21jciA9IDB4MDEwMyB8IFVQTUI7CisKKyAgICBtZW1jdGwtPm1lbWNfbWRyID0gMHhGRkZGREMwNTsKKyAgICBtZW1jdGwtPm1lbWNfbWNyID0gMHgwMTA0IHwgVVBNQjsKKworICAgIC8qIEluaXRpYWxpemUgVVBNQiBmb3IgQ0FOOiBzaW5nbGUgd3JpdGUgKi8KKyAgICBtZW1jdGwtPm1lbWNfbWRyID0gMHhGRkZDQzAwNDsKKyAgICBtZW1jdGwtPm1lbWNfbWNyID0gMHgwMTE4IHwgVVBNQjsKKworICAgIG1lbWN0bC0+bWVtY19tZHIgPSAweENGRkNEMDA0OworICAgIG1lbWN0bC0+bWVtY19tY3IgPSAweDAxMTkgfCBVUE1COworCisgICAgbWVtY3RsLT5tZW1jX21kciA9IDB4MEZGQ0MwMDA7CisgICAgbWVtY3RsLT5tZW1jX21jciA9IDB4MDExQSB8IFVQTUI7CisKKyAgICBtZW1jdGwtPm1lbWNfbWRyID0gMHg3RkZDQzAwNDsKKyAgICBtZW1jdGwtPm1lbWNfbWNyID0gMHgwMTFCIHwgVVBNQjsKKworICAgIG1lbWN0bC0+bWVtY19tZHIgPSAweEZGRkRDQzA1OworICAgIG1lbWN0bC0+bWVtY19tY3IgPSAweDAxMUMgfCBVUE1COworCisgICAgLyogSW5pdGlhbGl6ZSBPUjMgLyBCUjMgZm9yIENBTiBCdXMgQ29udHJvbGxlciAqLworICAgIG1lbWN0bC0+bWVtY19vcjMgPSBDRkdfT1IzX0NBTjsKKyAgICBtZW1jdGwtPm1lbWNfYnIzID0gQ0ZHX0JSM19DQU47Cit9CisKK3ZvaWQgY2FuX2RyaXZlcl9kaXNhYmxlICh2b2lkKQoreworICAgIHZvbGF0aWxlIGltbWFwX3QgICAgICppbW1hcCAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworICAgIHZvbGF0aWxlIG1lbWN0bDh4eF90ICptZW1jdGwgPSAmaW1tYXAtPmltX21lbWN0bDsKKworICAgIC8qIFJlc2V0IE9SMyAvIEJSMyB0byBkaXNhYmxlICBDQU4gQnVzIENvbnRyb2xsZXIgKi8KKyAgICBtZW1jdGwtPm1lbWNfYnIzID0gMDsKKyAgICBtZW1jdGwtPm1lbWNfb3IzID0gMDsKKworICAgIG1lbWN0bC0+bWVtY19tYm1yID0gMDsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBDaGVjayBtZW1vcnkgcmFuZ2UgZm9yIHZhbGlkIFJBTS4gQSBzaW1wbGUgbWVtb3J5IHRlc3QgZGV0ZXJtaW5lcworICogdGhlIGFjdHVhbGx5IGF2YWlsYWJsZSBSQU0gc2l6ZSBiZXR3ZWVuIGFkZHJlc3NlcyBgYmFzZScgYW5kCisgKiBgYmFzZSArIG1heHNpemUnLiBTb21lIChub3QgYWxsKSBoYXJkd2FyZSBlcnJvcnMgYXJlIGRldGVjdGVkOgorICogLSBzaG9ydCBiZXR3ZWVuIGFkZHJlc3MgbGluZXMKKyAqIC0gc2hvcnQgYmV0d2VlbiBkYXRhIGxpbmVzCisgKi8KKworc3RhdGljIGxvbmcgaW50IGRyYW1fc2l6ZSAobG9uZyBpbnQgbWFtcl92YWx1ZSwgbG9uZyBpbnQgKmJhc2UsIGxvbmcgaW50IG1heHNpemUpCit7CisgICAgdm9sYXRpbGUgaW1tYXBfdCAgICAgKmltbWFwICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisgICAgdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOworICAgIHZvbGF0aWxlIGxvbmcgaW50CSAqYWRkcjsKKyAgICB1bG9uZwkJICBjbnQsIHZhbDsKKyAgICB1bG9uZwkJICBzYXZlWzMyXTsJLyogdG8gbWFrZSB0ZXN0IG5vbi1kZXN0cnVjdGl2ZSAqLworICAgIHVuc2lnbmVkIGNoYXIJICBpID0gMDsKKworICAgIG1lbWN0bC0+bWVtY19tYW1yID0gbWFtcl92YWx1ZTsKKworICAgIGZvciAoY250ID0gbWF4c2l6ZS9zaXplb2YobG9uZyk7IGNudCA+IDA7IGNudCA+Pj0gMSkgeworCWFkZHIgPSBiYXNlICsgY250OwkvKiBwb2ludGVyIGFyaXRoISAqLworCisJc2F2ZVtpKytdID0gKmFkZHI7CisJKmFkZHIgPSB+Y250OworICAgIH0KKworICAgIC8qIHdyaXRlIDAgdG8gYmFzZSBhZGRyZXNzICovCisgICAgYWRkciA9IGJhc2U7CisgICAgc2F2ZVtpXSA9ICphZGRyOworICAgICphZGRyID0gMDsKKworICAgIC8qIGNoZWNrIGF0IGJhc2UgYWRkcmVzcyAqLworICAgIGlmICgodmFsID0gKmFkZHIpICE9IDApIHsKKwkqYWRkciA9IHNhdmVbaV07CisJcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICBmb3IgKGNudCA9IDE7IGNudCA8PSBtYXhzaXplL3NpemVvZihsb25nKTsgY250IDw8PSAxKSB7CisJYWRkciA9IGJhc2UgKyBjbnQ7CS8qIHBvaW50ZXIgYXJpdGghICovCisKKwl2YWwgPSAqYWRkcjsKKwkqYWRkciA9IHNhdmVbLS1pXTsKKworCWlmICh2YWwgIT0gKH5jbnQpKSB7CisJICAgIHJldHVybiAoY250ICogc2l6ZW9mKGxvbmcpKTsKKwl9CisgICAgfQorICAgIHJldHVybiAobWF4c2l6ZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZQlFVEhfQ0ZHX0JJVFMJKENGR19QQl9FVEhfQ0ZHMSB8IENGR19QQl9FVEhfQ0ZHMiAgfCBDRkdfUEJfRVRIX0NGRzMgKQorCisjZGVmaW5lIEVUSF9BTExfQklUUwkoRVRIX0NGR19CSVRTIHwgQ0ZHX1BCX0VUSF9QT1dFUkRPV04pCisKK3ZvaWQJcmVzZXRfcGh5KHZvaWQpCit7CisJaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJdWxvbmcgdmFsdWU7CisKKwkvKiBDb25maWd1cmUgYWxsIG5lZWRlZCBwb3J0IHBpbnMgZm9yIEdQSU8gKi8KKyNpZiBDRkdfRVRIX01ERElTX1ZBTFVFCisJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRhdCB8PSAgIENGR19QQV9FVEhfTURESVM7CisjZWxzZQorCWltbXItPmltX2lvcG9ydC5pb3BfcGFkYXQgJj0gfihDRkdfUEFfRVRIX01ERElTIHwgQ0ZHX1BBX0VUSF9SRVNFVCk7CS8qIFNldCBsb3cgKi8KKyNlbmRpZgorCWltbXItPmltX2lvcG9ydC5pb3BfcGFwYXIgJj0gfihDRkdfUEFfRVRIX01ERElTIHwgQ0ZHX1BBX0VUSF9SRVNFVCk7CS8qIEdQSU8gKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3Bhb2RyICY9IH4oQ0ZHX1BBX0VUSF9NRERJUyB8IENGR19QQV9FVEhfUkVTRVQpOwkvKiBhY3RpdmUgb3V0cHV0ICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRpciB8PSAgIENGR19QQV9FVEhfTURESVMgfCBDRkdfUEFfRVRIX1JFU0VUOwkvKiBvdXRwdXQgKi8KKworCWltbXItPmltX2NwbS5jcF9wYnBhciAmPSB+KEVUSF9BTExfQklUUyk7CS8qIEdQSU8gKi8KKwlpbW1yLT5pbV9jcG0uY3BfcGJvZHIgJj0gfihFVEhfQUxMX0JJVFMpOwkvKiBhY3RpdmUgb3V0cHV0ICovCisKKwl2YWx1ZSAgPSBpbW1yLT5pbV9jcG0uY3BfcGJkYXQ7CisKKwkvKiBBc3NlcnQgUG93ZXJkb3duIGFuZCBSZXNldCBzaWduYWxzICovCisJdmFsdWUgfD0gIENGR19QQl9FVEhfUE9XRVJET1dOOworCisJLyogUEhZIGNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgTURESVMgYW5kIENGRzEgLi4uIENGRzMgKi8KKyNpZiBDRkdfRVRIX0NGRzFfVkFMVUUKKwl2YWx1ZSB8PSAgIENGR19QQl9FVEhfQ0ZHMTsKKyNlbHNlCisJdmFsdWUgJj0gfihDRkdfUEJfRVRIX0NGRzEpOworI2VuZGlmCisjaWYgQ0ZHX0VUSF9DRkcyX1ZBTFVFCisJdmFsdWUgfD0gICBDRkdfUEJfRVRIX0NGRzI7CisjZWxzZQorCXZhbHVlICY9IH4oQ0ZHX1BCX0VUSF9DRkcyKTsKKyNlbmRpZgorI2lmIENGR19FVEhfQ0ZHM19WQUxVRQorCXZhbHVlIHw9ICAgQ0ZHX1BCX0VUSF9DRkczOworI2Vsc2UKKwl2YWx1ZSAmPSB+KENGR19QQl9FVEhfQ0ZHMyk7CisjZW5kaWYKKworCS8qIERyaXZlIG91dHB1dCBzaWduYWxzIHRvIGluaXRpYWwgc3RhdGUgKi8KKwlpbW1yLT5pbV9jcG0uY3BfcGJkYXQgID0gdmFsdWU7CisJaW1tci0+aW1fY3BtLmNwX3BiZGlyIHw9IEVUSF9BTExfQklUUzsKKwl1ZGVsYXkgKDEwMDAwKTsKKworCS8qIERlLWFzc2VydCBFdGhlcm5ldCBQb3dlcmRvd24gKi8KKwlpbW1yLT5pbV9jcG0uY3BfcGJkYXQgJj0gfihDRkdfUEJfRVRIX1BPV0VSRE9XTik7IC8qIEVuYWJsZSBQSFkgcG93ZXIgKi8KKwl1ZGVsYXkgKDEwMDAwKTsKKworCS8qIGRlLWFzc2VydCBSRVNFVCBzaWduYWwgb2YgUEhZICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRhdCB8PSBDRkdfUEFfRVRIX1JFU0VUOworCXVkZWxheSAoMTAwMCk7Cit9CisKKworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCWZwZ2FfaW5pdCgpOworCXJldHVybiAoMCk7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9ib2FyZC9zaWVtZW5zL0NDTS9mcGdhX2NjbS5jIGIvYm9hcmQvc2llbWVucy9DQ00vZnBnYV9jY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTIzODdiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2llbWVucy9DQ00vZnBnYV9jY20uYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgR3JhbmRlZ2dlciwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2dAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4eHguaD4KKyNpbmNsdWRlIDxjb21tcHJvYy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaW5jbHVkZSAiLi4vY29tbW9uL2ZwZ2EuaCIKKworZnBnYV90IGZwZ2FfbGlzdFtdID0geworICAgIHsgIlBVTUEiICwgUFVNQV9DT05GX0JBU0UgLAorICAgICAgQ0ZHX1BDX1BVTUFfSU5JVCAsIENGR19QQ19QVU1BX1BST0cgLCBDRkdfUENfUFVNQV9ET05FICB9Cit9OworaW50IGZwZ2FfY291bnQgPSBzaXplb2YoZnBnYV9saXN0KSAvIHNpemVvZihmcGdhX3QpOworCit2b2lkIGNhbl9kcml2ZXJfZW5hYmxlICh2b2lkKTsKK3ZvaWQgY2FuX2RyaXZlcl9kaXNhYmxlICh2b2lkKTsKKworI2RlZmluZQlfTk9UX1VTRURfCTB4RkZGRkZGRkYKKworLyoKKyAqIFBVTUEgYWNjZXNzIHVzaW5nIFVQTSBCCisgKi8KK2NvbnN0IHVpbnQgcHVtYV90YWJsZVtdID0KK3sKKwkvKgorCSAqIFNpbmdsZSBSZWFkLiAoT2Zmc2V0IDAgaW4gVVBNIFJBTSkKKwkgKi8KKwlfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAorCV9OT1RfVVNFRF8sCisJLyoKKwkgKiBQcmVjaGFyZ2UgYW5kIE1SUworCSAqLworCQkgICAgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKKwkvKgorCSAqIEJ1cnN0IFJlYWQuIChPZmZzZXQgOCBpbiBVUE0gUkFNKQorCSAqLworCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCisJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKKwlfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAorCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCisJLyoKKwkgKiBTaW5nbGUgV3JpdGUuIChPZmZzZXQgMTggaW4gVVBNIFJBTSkKKwkgKi8KKwkweDBGRkNGODA0LCAweDBGRkNGNDAwLCAweDNGRkRGQzQ3LCAvKiBsYXN0ICovCisJCQkJCSAgICBfTk9UX1VTRURfLAorCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCisJLyoKKwkgKiBCdXJzdCBXcml0ZS4gKE9mZnNldCAyMCBpbiBVUE0gUkFNKQorCSAqLworCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCisJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKKwlfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAorCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCisJLyoKKwkgKiBSZWZyZXNoICAoT2Zmc2V0IDMwIGluIFVQTSBSQU0pCisJICovCisJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKKwlfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAorCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCisJLyoKKwkgKiBFeGNlcHRpb24uIChPZmZzZXQgM2MgaW4gVVBNIFJBTSkKKwkgKi8KKwkweDdGRkZGQzA3LCAvKiBsYXN0ICovCisJCSAgICBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAorfTsKKworCit1bG9uZyBmcGdhX2NvbnRyb2wgKGZwZ2FfdCogZnBnYSwgaW50IGNtZCkKK3sKKyAgICB2b2xhdGlsZSBpbW1hcF90ICAgICAqaW1tciAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworICAgIHZvbGF0aWxlIG1lbWN0bDh4eF90ICptZW1jdGwgPSAmaW1tci0+aW1fbWVtY3RsOworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIEZQR0FfSU5JVF9JU19ISUdIOgorCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgJj0gfmZwZ2EtPmluaXRfbWFzazsgLyogaW5wdXQgKi8KKwlyZXR1cm4gKGltbXItPmltX2lvcG9ydC5pb3BfcGNkYXQgJiBmcGdhLT5pbml0X21hc2spID8gMTowOworCisgICAgY2FzZSBGUEdBX0lOSVRfU0VUX0xPVzoKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGlyIHw9ICBmcGdhLT5pbml0X21hc2s7IC8qIG91dHB1dCAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkYXQgJj0gfmZwZ2EtPmluaXRfbWFzazsKKwlicmVhazsKKworICAgIGNhc2UgRlBHQV9JTklUX1NFVF9ISUdIOgorCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgfD0gZnBnYS0+aW5pdF9tYXNrOyAvKiBvdXRwdXQgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGF0IHw9IGZwZ2EtPmluaXRfbWFzazsKKwlicmVhazsKKworICAgIGNhc2UgRlBHQV9QUk9HX1NFVF9MT1c6CisJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RhdCAmPSB+ZnBnYS0+cHJvZ19tYXNrOworCWJyZWFrOworCisgICAgY2FzZSBGUEdBX1BST0dfU0VUX0hJR0g6CisJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RhdCB8PSBmcGdhLT5wcm9nX21hc2s7CisJYnJlYWs7CisKKyAgICBjYXNlIEZQR0FfRE9ORV9JU19ISUdIOgorCXJldHVybiAoaW1tci0+aW1faW9wb3J0LmlvcF9wY2RhdCAmIGZwZ2EtPmRvbmVfbWFzaykgPyAxOjA7CisKKyAgICBjYXNlIEZQR0FfUkVBRF9NT0RFOgorCS8qIGRpc2FibGUgRlBHQSBpbiBtZW1vcnkgY29udHJvbGxlciAqLworCW1lbWN0bC0+bWVtY19icjQgPSAwOworCW1lbWN0bC0+bWVtY19vcjQgPSBQVU1BX0NPTkZfT1JfUkVBRDsKKwltZW1jdGwtPm1lbWNfYnI0ID0gUFVNQV9DT05GX0JSX1JFQUQ7CisKKwkvKiAocmUtKSBlbmFibGUgQ0FOIGRyaXZlcnMgKi8KKwljYW5fZHJpdmVyX2VuYWJsZSAoKTsKKworCWJyZWFrOworCisgICAgY2FzZSBGUEdBX0xPQURfTU9ERToKKwkvKiBkaXNhYmxlIEZQR0EgaW4gbWVtb3J5IGNvbnRyb2xsZXIgKi8KKwltZW1jdGwtPm1lbWNfYnI0ID0gMDsKKwkvKgorCSAqIFdlIG11c3QgZGlzYWJsZSB0aGUgQ0FOIGRyaXZlcnMgZmlyc3QgYmVjYXVzZQorCSAqIHRoZXkgdXNlIFVQTSBCLCB0b28uCisJICovCisJY2FuX2RyaXZlcl9kaXNhYmxlICgpOworCS8qCisJICogQ29uZmlndXJlIFVQTUIgZm9yIEZQR0EKKwkgKi8KKwl1cG1jb25maWcoVVBNQiwodWludCAqKXB1bWFfdGFibGUsc2l6ZW9mKHB1bWFfdGFibGUpL3NpemVvZih1aW50KSk7CisJbWVtY3RsLT5tZW1jX29yNCA9IFBVTUFfQ09ORl9PUl9MT0FEOworCW1lbWN0bC0+bWVtY19icjQgPSBQVU1BX0NPTkZfQlJfTE9BRDsKKwlicmVhazsKKworICAgIGNhc2UgRlBHQV9HRVRfSUQ6CisJcmV0dXJuICoodm9sYXRpbGUgdWxvbmcgKilmcGdhLT5jb25mX2Jhc2U7CisKKyAgICBjYXNlIEZQR0FfSU5JVF9QT1JUUzoKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IH5mcGdhLT5pbml0X21hc2s7IC8qIElOSVQgSS9PICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wY3NvICAmPSB+ZnBnYS0+aW5pdF9tYXNrOworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgJj0gfmZwZ2EtPmluaXRfbWFzazsKKworCWltbXItPmltX2lvcG9ydC5pb3BfcGNwYXIgJj0gfmZwZ2EtPnByb2dfbWFzazsgLyogUFJPRyBPdXRwdXQgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3Bjc28gICY9IH5mcGdhLT5wcm9nX21hc2s7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RpciB8PSAgZnBnYS0+cHJvZ19tYXNrOworCisJaW1tci0+aW1faW9wb3J0LmlvcF9wY3BhciAmPSB+ZnBnYS0+ZG9uZV9tYXNrOyAvKiBET05FIElucHV0ICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wY3NvICAmPSB+ZnBnYS0+ZG9uZV9tYXNrOworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgJj0gfmZwZ2EtPmRvbmVfbWFzazsKKworCWJyZWFrOworCisgICAgfQorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9zaWVtZW5zL1NDTS9mcGdhX3NjbS5jIGIvYm9hcmQvc2llbWVucy9TQ00vZnBnYV9zY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjkzNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2llbWVucy9TQ00vZnBnYV9zY20uYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgR3JhbmRlZ2dlciwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2dAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4MjYwLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSAiLi4vY29tbW9uL2ZwZ2EuaCIKKworZnBnYV90IGZwZ2FfbGlzdFtdID0geworICAgIHsgIkZJT1giICwgQ0ZHX0ZJT1hfQkFTRSAsCisgICAgICBDRkdfUERfRklPWF9JTklUICwgQ0ZHX1BEX0ZJT1hfUFJPRyAsIENGR19QRF9GSU9YX0RPTkUgIH0sCisgICAgeyAiRkRPSE0iLCBDRkdfRkRPSE1fQkFTRSwKKyAgICAgIENGR19QRF9GRE9ITV9JTklULCBDRkdfUERfRkRPSE1fUFJPRywgQ0ZHX1BEX0ZET0hNX0RPTkUgfQorfTsKK2ludCBmcGdhX2NvdW50ID0gc2l6ZW9mKGZwZ2FfbGlzdCkgLyBzaXplb2YoZnBnYV90KTsKKworCit1bG9uZyBmcGdhX2NvbnRyb2wgKGZwZ2FfdCogZnBnYSwgaW50IGNtZCkKK3sKKyAgICB2b2xhdGlsZSBpbW1hcF90ICppbW1yICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgRlBHQV9JTklUX0lTX0hJR0g6CisJaW1tci0+aW1faW9wb3J0LmlvcF9wZGlyZCAmPSB+ZnBnYS0+aW5pdF9tYXNrOyAvKiBpbnB1dCAqLworCXJldHVybiAoaW1tci0+aW1faW9wb3J0LmlvcF9wZGF0ZCAmIGZwZ2EtPmluaXRfbWFzaykgPyAxOjA7CisKKyAgICBjYXNlIEZQR0FfSU5JVF9TRVRfTE9XOgorCWltbXItPmltX2lvcG9ydC5pb3BfcGRpcmQgfD0gIGZwZ2EtPmluaXRfbWFzazsgLyogb3V0cHV0ICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wZGF0ZCAmPSB+ZnBnYS0+aW5pdF9tYXNrOworCWJyZWFrOworCisgICAgY2FzZSBGUEdBX0lOSVRfU0VUX0hJR0g6CisJaW1tci0+aW1faW9wb3J0LmlvcF9wZGlyZCB8PSBmcGdhLT5pbml0X21hc2s7IC8qIG91dHB1dCAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGRhdGQgfD0gZnBnYS0+aW5pdF9tYXNrOworCWJyZWFrOworCisgICAgY2FzZSBGUEdBX1BST0dfU0VUX0xPVzoKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkYXRkICY9IH5mcGdhLT5wcm9nX21hc2s7CisJYnJlYWs7CisKKyAgICBjYXNlIEZQR0FfUFJPR19TRVRfSElHSDoKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkYXRkIHw9IGZwZ2EtPnByb2dfbWFzazsKKwlicmVhazsKKworICAgIGNhc2UgRlBHQV9ET05FX0lTX0hJR0g6CisJcmV0dXJuIChpbW1yLT5pbV9pb3BvcnQuaW9wX3BkYXRkICYgZnBnYS0+ZG9uZV9tYXNrKSA/IDE6MDsKKworICAgIGNhc2UgRlBHQV9SRUFEX01PREU6CisJYnJlYWs7CisKKyAgICBjYXNlIEZQR0FfTE9BRF9NT0RFOgorCWJyZWFrOworCisgICAgY2FzZSBGUEdBX0dFVF9JRDoKKwlpZiAoZnBnYS0+Y29uZl9iYXNlID09IENGR19GSU9YX0JBU0UpIHsKKwkgICAgdWxvbmcgdmVyID0gKih2b2xhdGlsZSB1bG9uZyAqKShmcGdhLT5jb25mX2Jhc2UgKyAweDEwKTsKKwkgICAgcmV0dXJuICgodmVyID4+IDEwKSAmIDB4ZikgKyAoKHZlciA+PiAyKSAmIDB4ZjApOworCX0KKwllbHNlIGlmIChmcGdhLT5jb25mX2Jhc2UgPT0gQ0ZHX0ZET0hNX0JBU0UpIHsKKwkgICAgcmV0dXJuICgqKHZvbGF0aWxlIHVzaG9ydCAqKWZwZ2EtPmNvbmZfYmFzZSkgJiAweGZmOworCX0KKwllbHNlIHsKKwkgICAgcmV0dXJuICoodm9sYXRpbGUgdWxvbmcgKilmcGdhLT5jb25mX2Jhc2U7CisJfQorCisgICAgY2FzZSBGUEdBX0lOSVRfUE9SVFM6CisJaW1tci0+aW1faW9wb3J0LmlvcF9wcGFyZCAmPSB+ZnBnYS0+aW5pdF9tYXNrOyAvKiBJTklUIEkvTyAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcHNvcmQgJj0gfmZwZ2EtPmluaXRfbWFzazsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkaXJkICY9IH5mcGdhLT5pbml0X21hc2s7CisKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BwYXJkICY9IH5mcGdhLT5wcm9nX21hc2s7IC8qIFBST0cgT3V0cHV0ICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wc29yZCAmPSB+ZnBnYS0+cHJvZ19tYXNrOworCWltbXItPmltX2lvcG9ydC5pb3BfcGRpcmQgfD0gIGZwZ2EtPnByb2dfbWFzazsKKworCWltbXItPmltX2lvcG9ydC5pb3BfcHBhcmQgJj0gfmZwZ2EtPmRvbmVfbWFzazsgLyogRE9ORSBJbnB1dCAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcHNvcmQgJj0gfmZwZ2EtPmRvbmVfbWFzazsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkaXJkICY9IH5mcGdhLT5kb25lX21hc2s7CisKKwlicmVhazsKKworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3NpZW1lbnMvY29tbW9uL1JFQURNRSBiL2JvYXJkL3NpZW1lbnMvY29tbW9uL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzgxOTAzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2llbWVucy9jb21tb24vUkVBRE1FCkBAIC0wLDAgKzEsMjcgQEAKK0NDTS9TQ00tRXJnYWVuenVuZ2VuIGZ1ZXIgVS1Cb290IHVuZCBMaW51eDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRXMgZ2lidCBudW4gZWluIGdlbWVpbnNhbWVzIEtvbW1hbmRvIHp1bSBMYWRlbiBkZXIgRlBHQXM6CisKKyAgPT4gaGVscCBmcGdhCisgIGZwZ2EgZnBnYSBzdGF0dXMgW25hbWVdIC0gcHJpbnQgRlBHQSBzdGF0dXMKKyAgZnBnYSByZXNldCAgW25hbWVdIC0gcmVzZXQgRlBHQQorICBmcGdhIGxvYWQgW25hbWVdIGFkZHIgLSBsb2FkIEZQR0EgY29uZmlndXJhdGlvbiBkYXRhCisKK0RlciBOYW1lIGthbm4gYmVpbSBDQ00tTW9kdWxlIGF1Y2ggd2VnZ2VsYXNzZW4gd2VyZGVuLgorRGllIExhZW5nZW5hbmdhYmUgdW5kIGRhbWl0ICJwdW1hX2xlbiIgaXN0IG5pY2h0IG1laHIKK25vZXRpZzoKKworICA9PiBmcGdhIGxvYWQgcHVtYSA0MDYwMDAwMAorICBGUEdBIGxvYWQgUFVNQTogYWRkciA0MDYwMDAwMDogKDAwMDAwMDA1KS4uLiBkb25lCisKK0RpZSBNVEQtUGFydGl0aW9uaWVydW5nIGthbm4gbnVuIG1pdHRlbHMgImJvb3RhcmdzIiB1ZWJlci0KK2dlYmVuIHdlcmRlbjoKKworICA9PiBwcmludGVudiBhZGRtdGQKKyAgYWRkbXRkPXNldGVudiBib290YXJncyAkKGJvb3RhcmdzKQorICAgIG10ZHBhcnRzPTA6MjU2ayhVLUJvb3Qpcm8sNzY4ayhLZXJuZWwpLC0oUmVzdClcOzE6LShteUpGRlMyKQorCitEaWUgUG9ydGllcnVuZyBhdWYgU01DIGlzdCBuYXR1ZXJsaWNoIG5vY2ggbmljaHQgZ2V0ZXN0ZXQuCisKK1dvbGZnYW5nIEdyYW5kZWdnZXIgKDA0LjA2LjIwMDIpCmRpZmYgLS1naXQgYS9ib2FyZC9zaWVtZW5zL2NvbW1vbi9mcGdhLmMgYi9ib2FyZC9zaWVtZW5zL2NvbW1vbi9mcGdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3ZGU1YQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NpZW1lbnMvY29tbW9uL2ZwZ2EuYwpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgR3JhbmRlZ2dlciwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2dAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjbWRfYm9vdC5oPgorI2luY2x1ZGUgPGNtZF9ic3AuaD4KKworI2luY2x1ZGUgImZwZ2EuaCIKKworaW50ICBwb3dlcl9vbl9yZXNldCh2b2lkKTsKKworLyogLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAqLworCisKK3N0YXRpYyBpbnQgZnBnYV9nZXRfdmVyc2lvbihmcGdhX3QqIGZwZ2EsIGNoYXIqIG5hbWUpCit7CisgICAgY2hhciB2bmFtZVsxMl07CisgICAgLyoKKyAgICAgKiBOZXQtbGlzdCBzdHJpbmcgZm9ybWF0OgorICAgICAqICAgICAidnZ2dnZ2dnZkZGRkZGRkZG4uLi4iLgorICAgICAqICAgICBWZXJzaW9uIERhdGUgICAgTmFtZQorICAgICAqICAgICAiMDAwMDAwMDMyMjA0MjAwMlBVTUEiID0gUFVNQSB2ZXJzaW9uIDMgZnJvbSAyMi4wNC4yMDAyLgorICAgICAqLworICAgIGlmIChzdHJsZW4obmFtZSkgPCAoMTYgKyBzdHJsZW4oZnBnYS0+bmFtZSkpKQorCWdvdG8gZmFpbHVyZTsKKyAgICAvKiBDaGVjayBGUEdBIG5hbWUgKi8KKyAgICBpZiAoc3RyY21wKCZuYW1lWzE2XSwgZnBnYS0+bmFtZSkgIT0gMCkKKwlnb3RvIGZhaWx1cmU7CisgICAgLyogR2V0IHZlcnNpb24gbnVtYmVyICovCisgICAgbWVtY3B5KHZuYW1lLCBuYW1lLCA4KTsKKyAgICB2bmFtZVs4XSA9ICdcMCc7CisgICAgcmV0dXJuIHNpbXBsZV9zdHJ0b3VsKHZuYW1lLCBOVUxMLCAxNik7CisKKyBmYWlsdXJlOgorICAgIHByaW50ZigiSW1hZ2UgbmFtZSAlcyBpcyBpbnZhbGlkXG4iLCBuYW1lKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gKi8KKworc3RhdGljIGZwZ2FfdCogZnBnYV9nZXQoY2hhciogZnBnYV9uYW1lKQoreworICAgIGNoYXIgbmFtZVtGUEdBX05BTUVfTEVOXTsKKyAgICBpbnQgaTsKKworICAgIGlmIChzdHJsZW4oZnBnYV9uYW1lKSA+PSBGUEdBX05BTUVfTEVOKQorCWdvdG8gZmFpbHVyZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuKGZwZ2FfbmFtZSk7IGkrKykKKwluYW1lW2ldID0gdG91cHBlcihmcGdhX25hbWVbaV0pOworICAgIG5hbWVbaV0gPSAnXDAnOworICAgIGZvciAoaSA9IDA7IGkgPCBmcGdhX2NvdW50OyBpKyspIHsKKwlpZiAoc3RyY21wKG5hbWUsIGZwZ2FfbGlzdFtpXS5uYW1lKSA9PSAwKQorCSAgICByZXR1cm4gJmZwZ2FfbGlzdFtpXTsKKyAgICB9CisgZmFpbHVyZToKKyAgICBwcmludGYoIkZQR0E6IG5hbWUgJXMgaXMgaW52YWxpZFxuIiwgZnBnYV9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAqLworCitzdGF0aWMgdm9pZCBmcGdhX3N0YXR1cyAoZnBnYV90KiBmcGdhKQoreworICAgIC8qIENoZWNrIHN0YXRlICovCisgICAgaWYgKGZwZ2FfY29udHJvbChmcGdhLCBGUEdBX0RPTkVfSVNfSElHSCkpCisJcHJpbnRmICgiJXMgaXMgbG9hZGVkICglMDhseClcbiIsCisJCWZwZ2EtPm5hbWUsIGZwZ2FfY29udHJvbChmcGdhLCBGUEdBX0dFVF9JRCkpOworICAgIGVsc2UKKwlwcmludGYgKCIlcyBpcyBOT1QgbG9hZGVkXG4iLCBmcGdhLT5uYW1lKTsKK30KKworLyogLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAqLworCisjZGVmaW5lIEZQR0FfUkVTRVRfVElNRU9VVCAxMDAgLyogPSAxMCBtcyAqLworCitzdGF0aWMgaW50IGZwZ2FfcmVzZXQgKGZwZ2FfdCogZnBnYSkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIFNldCBQUk9HIHRvIGxvdyBhbmQgd2FpdCB0aWwgSU5JVCBnb2VzIGxvdyAqLworICAgIGZwZ2FfY29udHJvbChmcGdhLCBGUEdBX1BST0dfU0VUX0xPVyk7CisgICAgZm9yIChpID0gMDsgaSA8IEZQR0FfUkVTRVRfVElNRU9VVDsgaSsrKSB7CisJdWRlbGF5ICgxMDApOworCWlmICghZnBnYV9jb250cm9sKGZwZ2EsIEZQR0FfSU5JVF9JU19ISUdIKSkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IEZQR0FfUkVTRVRfVElNRU9VVCkKKwlnb3RvIGZhaWx1cmU7CisKKyAgICAvKiBTZXQgUFJPRyB0byBoaWdoIGFuZCB3YWl0IHRpbCBJTklUIGdvZXMgaGlnaCAqLworICAgIGZwZ2FfY29udHJvbChmcGdhLCBGUEdBX1BST0dfU0VUX0hJR0gpOworICAgIGZvciAoaSA9IDA7IGkgPCBGUEdBX1JFU0VUX1RJTUVPVVQ7IGkrKykgeworCXVkZWxheSAoMTAwKTsKKwlpZiAoZnBnYV9jb250cm9sKGZwZ2EsIEZQR0FfSU5JVF9JU19ISUdIKSkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IEZQR0FfUkVTRVRfVElNRU9VVCkKKwlnb3RvIGZhaWx1cmU7CisKKyAgICByZXR1cm4gMDsKKyBmYWlsdXJlOgorICAgIHJldHVybiAxOworfQorCisvKiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICovCisKKyNkZWZpbmUgRlBHQV9MT0FEX1RJTUVPVVQgMTAwIC8qID0gMTAgbXMgKi8KKworc3RhdGljIGludCBmcGdhX2xvYWQgKGZwZ2FfdCogZnBnYSwgdWxvbmcgYWRkciwgaW50IGNoZWNrYWxsKQoreworICAgIHZvbGF0aWxlIHVjaGFyICpmcGdhX2FkZHIgPSAodm9sYXRpbGUgdWNoYXIgKilmcGdhLT5jb25mX2Jhc2U7CisgICAgaW1hZ2VfaGVhZGVyX3QgaGRyOworICAgIHVsb25nIGxlbiwgY2hlY2tzdW07CisgICAgdWNoYXIgKmRhdGEgPSAodWNoYXIgKikmaGRyOworICAgIGNoYXIgKnMsIG1zZ1szMl07CisgICAgaW50IHZlcmlmeSwgaTsKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIGltYWdlIGhlYWRlciBhbmQgZGF0YSBvZiB0aGUgbmV0LWxpc3QKKyAgICAgKi8KKyAgICBtZW1jcHkgKCZoZHIsIChjaGFyICopYWRkciwgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSk7CisKKyAgICBpZiAoaGRyLmloX21hZ2ljICE9IElIX01BR0lDKSB7CisJc3RyY3B5IChtc2csICJCYWQgSW1hZ2UgTWFnaWMgTnVtYmVyIik7CisgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICB9CisKKyAgICBsZW4gID0gc2l6ZW9mKGltYWdlX2hlYWRlcl90KTsKKworICAgIGNoZWNrc3VtID0gaGRyLmloX2hjcmM7CisgICAgaGRyLmloX2hjcmMgPSAwOworCisgICAgaWYgKGNyYzMyICgwLCBkYXRhLCBsZW4pICE9IGNoZWNrc3VtKSB7CisJc3RyY3B5IChtc2csICJCYWQgSW1hZ2UgSGVhZGVyIENSQyIpOworCWdvdG8gZmFpbHVyZTsKKyAgICB9CisKKyAgICBkYXRhID0gKHVjaGFyKikoYWRkciArIHNpemVvZihpbWFnZV9oZWFkZXJfdCkpOworICAgIGxlbiAgPSBoZHIuaWhfc2l6ZTsKKworICAgIHMgPSBnZXRlbnYgKCJ2ZXJpZnkiKTsKKyAgICB2ZXJpZnkgPSAocyAmJiAoKnMgPT0gJ24nKSkgPyAwIDogMTsKKyAgICBpZiAodmVyaWZ5KSB7CisJaWYgKGNyYzMyICgwLCBkYXRhLCBsZW4pICE9IGhkci5paF9kY3JjKSB7CisJICAgIHN0cmNweSAobXNnLCAiQmFkIEltYWdlIERhdGEgQ1JDIik7CisJICAgIGdvdG8gZmFpbHVyZTsKKwl9CisgICAgfQorCisgICAgaWYgKGNoZWNrYWxsICYmIGZwZ2FfZ2V0X3ZlcnNpb24oZnBnYSwgaGRyLmloX25hbWUpIDwgMCkKKwlyZXR1cm4gMTsKKworICAgIC8qIGFsaWduIGxlbmd0aCAqLworICAgIGlmIChsZW4gJiAxKQorCSsrbGVuOworCisgICAgLyoKKyAgICAgKiBSZXNldCBGUEdBIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uCisgICAgICovCisgICAgaWYgKGZwZ2FfcmVzZXQoZnBnYSkpIHsKKwlzdHJjcHkgKG1zZywgIlJlc2V0IFRpbWVvdXQiKTsKKwlnb3RvIGZhaWx1cmU7CisgICAgfQorCisgICAgcHJpbnRmICgiKCVzKS4uLiAiLCBoZHIuaWhfbmFtZSk7CisgICAgLyoKKyAgICAgKiBDb3B5IGRhdGEgdG8gRlBHQQorICAgICAqLworICAgIGZwZ2FfY29udHJvbCAoZnBnYSwgRlBHQV9MT0FEX01PREUpOworICAgIHdoaWxlIChsZW4tLSkgeworCSpmcGdhX2FkZHIgPSAqZGF0YSsrOworICAgIH0KKyAgICBmcGdhX2NvbnRyb2wgKGZwZ2EsIEZQR0FfUkVBRF9NT0RFKTsKKworICAgIC8qCisgICAgICogV2FpdCBmb3IgY29tcGxldGlvbiBhbmQgY2hlY2sgZXJyb3Igc3RhdHVzIGlmIHRpbWVvdXQKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgRlBHQV9MT0FEX1RJTUVPVVQ7IGkrKykgeworCXVkZWxheSAoMTAwKTsKKwlpZiAoZnBnYV9jb250cm9sIChmcGdhLCBGUEdBX0RPTkVfSVNfSElHSCkpCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA9PSBGUEdBX0xPQURfVElNRU9VVCkgeworCWlmIChmcGdhX2NvbnRyb2woZnBnYSwgRlBHQV9JTklUX0lTX0hJR0gpKQorCSAgICBzdHJjcHkobXNnLCAiSW52YWxpZCBTaXplIik7CisJZWxzZQorCSAgICBzdHJjcHkobXNnLCAiQ1JDIEVycm9yIik7CisJZ290byBmYWlsdXJlOworICAgIH0KKworICAgIHByaW50ZigiZG9uZVxuIik7CisgICAgcmV0dXJuIDA7CisKKyBmYWlsdXJlOgorCisgICAgcHJpbnRmKCJFUlJPUjogJXNcbiIsIG1zZyk7CisgICAgcmV0dXJuIDE7Cit9CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisKKy8qIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gKi8KKworaW50IGRvX2ZwZ2EgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHVsb25nIGFkZHIgPSAwOworICAgIGludCBpOworICAgIGZwZ2FfdCogZnBnYTsKKworICAgIGlmIChhcmdjIDwgMikKKwlnb3RvIGZhaWx1cmU7CisKKyAgICBpZiAoc3RybmNtcChhcmd2WzFdLCAic3RhdCIsIDQpID09IDApIHsJCS8qIHN0YXR1cyAqLworCWlmIChhcmdjID09IDIpIHsKKwkgICAgZm9yIChpID0gMDsgaSA8IGZwZ2FfY291bnQ7IGkrKykgeworCQlmcGdhX3N0YXR1cyAoJmZwZ2FfbGlzdFtpXSk7CisJICAgIH0KKwl9CisJZWxzZSBpZiAoYXJnYyA9PSAzKSB7CisJICAgIGlmICgoZnBnYSA9IGZwZ2FfZ2V0KGFyZ3ZbMl0pKSA9PSAwKQorCQlnb3RvIGZhaWx1cmU7CisJICAgIGZwZ2Ffc3RhdHVzIChmcGdhKTsKKwl9CisJZWxzZQorCSAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCJsb2FkIikgPT0gMCkgewkJLyogbG9hZCAqLworCWlmIChhcmdjID09IDMgJiYgZnBnYV9jb3VudCA9PSAxKSB7CisJICAgIGZwZ2EgPSAmZnBnYV9saXN0WzBdOworCX0KKwllbHNlIGlmIChhcmdjID09IDQpIHsKKwkgICAgaWYgKChmcGdhID0gZnBnYV9nZXQoYXJndlsyXSkpID09IDApCisJCWdvdG8gZmFpbHVyZTsKKwl9CisJZWxzZQorCSAgICBnb3RvIGZhaWx1cmU7CisKKwlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlthcmdjLTFdLCBOVUxMLCAxNik7CisKKwlwcmludGYgKCJGUEdBIGxvYWQgJXM6IGFkZHIgJTA4bHg6ICIsCisJCWZwZ2EtPm5hbWUsIGFkZHIpOworCWZwZ2FfbG9hZCAoZnBnYSwgYWRkciwgMSk7CisKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcChhcmd2WzFdLCAicmVzZSIsIDQpID09IDApIHsJLyogcmVzZXQgKi8KKwlpZiAoYXJnYyA9PSAyICYmIGZwZ2FfY291bnQgPT0gMSkgeworCSAgICBmcGdhID0gJmZwZ2FfbGlzdFswXTsKKwl9CisJZWxzZSBpZiAoYXJnYyA9PSAzKSB7CisJICAgIGlmICgoZnBnYSA9IGZwZ2FfZ2V0KGFyZ3ZbMl0pKSA9PSAwKQorCQlnb3RvIGZhaWx1cmU7CisJfQorCWVsc2UKKwkgICAgZ290byBmYWlsdXJlOworCisJcHJpbnRmICgiRlBHQSByZXNldCAlczogIiwgZnBnYS0+bmFtZSk7CisJaWYgKGZwZ2FfcmVzZXQoZnBnYSkpCisJICAgIHByaW50ZiAoIkVSUk9SOiBUaW1lb3V0XG4iKTsKKwllbHNlCisJICAgIHByaW50ZiAoImRvbmVcbiIpOworICAgIH0KKyAgICBlbHNlCisJZ290byBmYWlsdXJlOworCisgICAgcmV0dXJuIDA7CisKKyBmYWlsdXJlOgorICAgIHByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCAqLworCisvKiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICovCisKK2ludCBmcGdhX2luaXQgKHZvaWQpCit7CisgICAgdWxvbmcgYWRkcjsKKyAgICB1bG9uZyBuZXdfaWQsIG9sZF9pZCA9IDA7CisgICAgaW1hZ2VfaGVhZGVyX3QgKmhkcjsKKyAgICBmcGdhX3QqIGZwZ2E7CisgICAgaW50IGRvX2xvYWQsIGksIGo7CisgICAgY2hhciBuYW1lWzE2XSwgKnM7CisKKyAgICAvKgorICAgICAqICBQb3J0IHNldHVwIGZvciBGUEdBIGNvbnRyb2wKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZnBnYV9jb3VudDsgaSsrKSB7CisJZnBnYV9jb250cm9sKCZmcGdhX2xpc3RbaV0sIEZQR0FfSU5JVF9QT1JUUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMb2FkIEZQR0Eocyk6IGEgbmV3IG5ldC1saXN0IGlzIGxvYWRlZCBpZiB0aGUgRlBHQSBpcworICAgICAqIGVtcHR5LCBQb3dlci1vbi1SZXNldCBvciB0aGUgb2xkIG9uZSBpcyBub3QgdXAtdG8tZGF0ZQorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBmcGdhX2NvdW50OyBpKyspIHsKKwlmcGdhID0gJmZwZ2FfbGlzdFtpXTsKKwlwcmludGYgKCIlczogICIsIGZwZ2EtPm5hbWUpOworCisJZm9yIChqID0gMDsgaiA8IHN0cmxlbihmcGdhLT5uYW1lKTsgaisrKQorCSAgICBuYW1lW2pdID0gdG9sb3dlcihmcGdhLT5uYW1lW2pdKTsKKwluYW1lW2pdID0gJ1wwJzsKKwlzcHJpbnRmKG5hbWUsICIlc19hZGRyIiwgbmFtZSk7CisJYWRkciA9IDA7CisJaWYgKChzID0gZ2V0ZW52KG5hbWUpKSAhPSBOVUxMKQorCSAgICBhZGRyID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMTYpOworCisJaWYgKCFhZGRyKSB7CisJICAgIHByaW50ZiAoImVudi4gdmFyaWFibGUgJXMgdW5kZWZpbmVkXG4iLCBuYW1lKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJaGRyID0gKGltYWdlX2hlYWRlcl90ICopYWRkcjsKKwlpZiAoKG5ld19pZCA9IGZwZ2FfZ2V0X3ZlcnNpb24oZnBnYSwgaGRyLT5paF9uYW1lKSkgPT0gLTEpCisJICAgIHJldHVybiAxOworCisJZG9fbG9hZCA9IDE7CisKKwlpZiAoIXBvd2VyX29uX3Jlc2V0KCkgJiYgZnBnYV9jb250cm9sKGZwZ2EsIEZQR0FfRE9ORV9JU19ISUdIKSkgeworCSAgICBvbGRfaWQgPSBmcGdhX2NvbnRyb2woZnBnYSwgRlBHQV9HRVRfSUQpOworCSAgICBpZiAobmV3X2lkID09IG9sZF9pZCkKKwkJZG9fbG9hZCA9IDA7CisJfQorCisJaWYgKGRvX2xvYWQpIHsKKwkgICAgcHJpbnRmICgibG9hZGluZyAiKTsKKwkgICAgZnBnYV9sb2FkIChmcGdhLCBhZGRyLCAwKTsKKwl9IGVsc2UgeworCSAgICBwcmludGYgKCJsb2FkZWQgKCUwOGx4KVxuIiwgb2xkX2lkKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9zbWRrMjQwMC91LWJvb3QubGRzIGIvYm9hcmQvc21kazI0MDAvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzljMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc21kazI0MDAvdS1ib290LmxkcwpAQCAtMCwwICsxLDU0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorLypPVVRQVVRfRk9STUFUKCJlbGYzMi1hcm0iLCAiZWxmMzItYXJtIiwgImVsZjMyLWFybSIpKi8KK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgICAgICAgIC4gPSAweDAwMDAwMDAwOworCisgICAgICAgIC4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvYXJtOTIwdC9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAuZGF0YSA6IHsgKiguZGF0YSkgfQorCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLmdvdCA6IHsgKiguZ290KSB9CisKKwlhcm1ib290X2VuZF9kYXRhID0gLjsKKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5ic3MgOiB7ICooLmJzcykgfQorCisJYXJtYm9vdF9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvc21kazI0MTAvc21kazI0MTAuYyBiL2JvYXJkL3NtZGsyNDEwL3NtZGsyNDEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5ODNlZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NtZGsyNDEwL3NtZGsyNDEwLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGF2aWQgTXVlbGxlciwgRUxTT0ZUIEFHLCA8ZC5tdWVsbGVyQGVsc29mdC5jaD4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8czNjMjQxMC5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRkNMS19TUEVFRCAxCisKKyNpZiBGQ0xLX1NQRUVEPT0wCQkvKiBGb3V0ID0gMjAzTUh6LCBGaW4gPSAxMk1IeiBmb3IgQXVkaW8gKi8KKyNkZWZpbmUgTV9NRElWCTB4QzMKKyNkZWZpbmUgTV9QRElWCTB4NAorI2RlZmluZSBNX1NESVYJMHgxCisjZWxpZiBGQ0xLX1NQRUVEPT0xCQkvKiBGb3V0ID0gMjAyLjhNSHogKi8KKyNkZWZpbmUgTV9NRElWCTB4QTEKKyNkZWZpbmUgTV9QRElWCTB4MworI2RlZmluZSBNX1NESVYJMHgxCisjZW5kaWYKKworI2RlZmluZSBVU0JfQ0xPQ0sgMQorCisjaWYgVVNCX0NMT0NLPT0wCisjZGVmaW5lIFVfTV9NRElWCTB4QTEKKyNkZWZpbmUgVV9NX1BESVYJMHgzCisjZGVmaW5lIFVfTV9TRElWCTB4MQorI2VsaWYgVVNCX0NMT0NLPT0xCisjZGVmaW5lIFVfTV9NRElWCTB4NDgKKyNkZWZpbmUgVV9NX1BESVYJMHgzCisjZGVmaW5lIFVfTV9TRElWCTB4MgorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSAodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIKKwkgICJzdWJzICUwLCAlMSwgIzFcbiIKKwkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIgKGxvb3BzKSk7Cit9CisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBpbml0aWFsaXNhdGlvbnMKKyAqLworCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCS8qIHRvIHJlZHVjZSBQTEwgbG9jayB0aW1lLCBhZGp1c3QgdGhlIExPQ0tUSU1FIHJlZ2lzdGVyICovCisJckxPQ0tUSU1FID0gMHhGRkZGRkY7CisKKwkvKiBjb25maWd1cmUgTVBMTCAqLworCXJNUExMQ09OID0gKChNX01ESVYgPDwgMTIpICsgKE1fUERJViA8PCA0KSArIE1fU0RJVik7CisKKwkvKiBzb21lIGRlbGF5IGJldHdlZW4gTVBMTCBhbmQgVVBMTCAqLworCWRlbGF5ICg0MDAwKTsKKworCS8qIGNvbmZpZ3VyZSBVUExMICovCisJclVQTExDT04gPSAoKFVfTV9NRElWIDw8IDEyKSArIChVX01fUERJViA8PCA0KSArIFVfTV9TRElWKTsKKworCS8qIHNvbWUgZGVsYXkgYmV0d2VlbiBNUExMIGFuZCBVUExMICovCisJZGVsYXkgKDgwMDApOworCisJLyogc2V0IHVwIHRoZSBJL08gcG9ydHMgKi8KKwlyR1BBQ09OID0gMHgwMDdGRkZGRjsKKwlyR1BCQ09OID0gMHgwMDA0NDU1NTsKKwlyR1BCVVAgPSAweDAwMDAwN0ZGOworCXJHUENDT04gPSAweEFBQUFBQUFBOworCXJHUENVUCA9IDB4MDAwMEZGRkY7CisJckdQRENPTiA9IDB4QUFBQUFBQUE7CisJckdQRFVQID0gMHgwMDAwRkZGRjsKKwlyR1BFQ09OID0gMHhBQUFBQUFBQTsKKwlyR1BFVVAgPSAweDAwMDBGRkZGOworCXJHUEZDT04gPSAweDAwMDA1NUFBOworCXJHUEZVUCA9IDB4MDAwMDAwRkY7CisJckdQR0NPTiA9IDB4RkY5NUZGQkE7CisJckdQR1VQID0gMHgwMDAwRkZGRjsKKwlyR1BIQ09OID0gMHgwMDJBRkFBQTsKKwlyR1BIVVAgPSAweDAwMDAwN0ZGOworCisJLyogYXJjaCBudW1iZXIgb2YgU01ESzI0MTAtQm9hcmQgKi8KKwlnZC0+YmQtPmJpX2FyY2hfbnVtYmVyID0gMTkzOworCisJLyogYWRyZXNzIG9mIGJvb3QgcGFyYW1ldGVycyAqLworCWdkLT5iZC0+YmlfYm9vdF9wYXJhbXMgPSAweDMwMDAwMTAwOworCisJaWNhY2hlX2VuYWJsZSgpOworCWRjYWNoZV9lbmFibGUoKTsKKworCXJldHVybiAwOworfQorCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJZ2QtPmJkLT5iaV9kcmFtWzBdLnN0YXJ0ID0gUEhZU19TRFJBTV8xOworCWdkLT5iZC0+YmlfZHJhbVswXS5zaXplID0gUEhZU19TRFJBTV8xX1NJWkU7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTh4eC9mbGFzaC5jIGIvYm9hcmQvdHFtOHh4L2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3NGNjYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3RxbTh4eC9mbGFzaC5jCkBAIC0wLDAgKzEsNTY5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzh4eC5oPgorCisjaWZuZGVmCUNGR19FTlZfQUREUgorI2RlZmluZSBDRkdfRU5WX0FERFIJKENGR19GTEFTSF9CQVNFICsgQ0ZHX0VOVl9PRkZTRVQpCisjZW5kaWYKKworZmxhc2hfaW5mb190CWZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107IC8qIGluZm8gZm9yIEZMQVNIIGNoaXBzCSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9ucworICovCitzdGF0aWMgdWxvbmcgZmxhc2hfZ2V0X3NpemUgKHZ1X2xvbmcgKmFkZHIsIGZsYXNoX2luZm9fdCAqaW5mbyk7CitzdGF0aWMgaW50IHdyaXRlX3dvcmQgKGZsYXNoX2luZm9fdCAqaW5mbywgdWxvbmcgZGVzdCwgdWxvbmcgZGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCit1bnNpZ25lZCBsb25nIGZsYXNoX2luaXQgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAgICAgKmltbWFwICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOworCXVuc2lnbmVkIGxvbmcgc2l6ZV9iMCwgc2l6ZV9iMTsKKwlpbnQgaTsKKworCS8qIEluaXQ6IG5vIEZMQVNIZXMga25vd24gKi8KKwlmb3IgKGk9MDsgaTxDRkdfTUFYX0ZMQVNIX0JBTktTOyArK2kpIHsKKwkJZmxhc2hfaW5mb1tpXS5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJfQorCisJLyogU3RhdGljIEZMQVNIIEJhbmsgY29uZmlndXJhdGlvbiBoZXJlIC0gRklYTUUgWFhYICovCisKKwlzaXplX2IwID0gZmxhc2hfZ2V0X3NpemUoKHZ1X2xvbmcgKilGTEFTSF9CQVNFMF9QUkVMSU0sICZmbGFzaF9pbmZvWzBdKTsKKworCWlmIChmbGFzaF9pbmZvWzBdLmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJcHJpbnRmICgiIyMgVW5rbm93biBGTEFTSCBvbiBCYW5rIDAgLSBTaXplID0gMHglMDhseCA9ICVsZCBNQlxuIiwKKwkJCXNpemVfYjAsIHNpemVfYjA8PDIwKTsKKwl9CisKKwlzaXplX2IxID0gZmxhc2hfZ2V0X3NpemUoKHZ1X2xvbmcgKilGTEFTSF9CQVNFMV9QUkVMSU0sICZmbGFzaF9pbmZvWzFdKTsKKworCWlmIChzaXplX2IxID4gc2l6ZV9iMCkgeworCQlwcmludGYgKCIjIyBFUlJPUjogIgorCQkJIkJhbmsgMSAoMHglMDhseCA9ICVsZCBNQikgPiBCYW5rIDAgKDB4JTA4bHggPSAlbGQgTUIpXG4iLAorCQkJc2l6ZV9iMSwgc2l6ZV9iMTw8MjAsCisJCQlzaXplX2IwLCBzaXplX2IwPDwyMAorCQkpOworCQlmbGFzaF9pbmZvWzBdLmZsYXNoX2lkCT0gRkxBU0hfVU5LTk9XTjsKKwkJZmxhc2hfaW5mb1sxXS5mbGFzaF9pZAk9IEZMQVNIX1VOS05PV047CisJCWZsYXNoX2luZm9bMF0uc2VjdG9yX2NvdW50CT0gLTE7CisJCWZsYXNoX2luZm9bMV0uc2VjdG9yX2NvdW50CT0gLTE7CisJCWZsYXNoX2luZm9bMF0uc2l6ZQkJPSAwOworCQlmbGFzaF9pbmZvWzFdLnNpemUJCT0gMDsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKiBSZW1hcCBGTEFTSCBhY2NvcmRpbmcgdG8gcmVhbCBzaXplICovCisJbWVtY3RsLT5tZW1jX29yMCA9IENGR19PUl9USU1JTkdfRkxBU0ggfCAoLXNpemVfYjAgJiBPUl9BTV9NU0spOworCW1lbWN0bC0+bWVtY19icjAgPSAoQ0ZHX0ZMQVNIX0JBU0UgJiBCUl9CQV9NU0spIHwgQlJfTVNfR1BDTSB8IEJSX1Y7CisKKwkvKiBSZS1kbyBzaXppbmcgdG8gZ2V0IGZ1bGwgY29ycmVjdCBpbmZvICovCisJc2l6ZV9iMCA9IGZsYXNoX2dldF9zaXplKCh2dV9sb25nICopQ0ZHX0ZMQVNIX0JBU0UsICZmbGFzaF9pbmZvWzBdKTsKKworI2lmIENGR19NT05JVE9SX0JBU0UgPj0gQ0ZHX0ZMQVNIX0JBU0UKKwkvKiBtb25pdG9yIHByb3RlY3Rpb24gT04gYnkgZGVmYXVsdCAqLworCWZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwKKwkJICAgICAgQ0ZHX01PTklUT1JfQkFTRSwKKwkJICAgICAgQ0ZHX01PTklUT1JfQkFTRStDRkdfTU9OSVRPUl9MRU4tMSwKKwkJICAgICAgJmZsYXNoX2luZm9bMF0pOworI2VuZGlmCisKKyNpZmRlZglDRkdfRU5WX0lTX0lOX0ZMQVNICisJLyogRU5WIHByb3RlY3Rpb24gT04gYnkgZGVmYXVsdCAqLworCWZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwKKwkJICAgICAgQ0ZHX0VOVl9BRERSLAorCQkgICAgICBDRkdfRU5WX0FERFIrQ0ZHX0VOVl9TSVpFLTEsCisJCSAgICAgICZmbGFzaF9pbmZvWzBdKTsKKyNlbmRpZgorCisJaWYgKHNpemVfYjEpIHsKKwkJbWVtY3RsLT5tZW1jX29yMSA9IENGR19PUl9USU1JTkdfRkxBU0ggfCAoLXNpemVfYjEgJiAweEZGRkY4MDAwKTsKKwkJbWVtY3RsLT5tZW1jX2JyMSA9ICgoQ0ZHX0ZMQVNIX0JBU0UgKyBzaXplX2IwKSAmIEJSX0JBX01TSykgfAorCQkJCSAgICBCUl9NU19HUENNIHwgQlJfVjsKKworCQkvKiBSZS1kbyBzaXppbmcgdG8gZ2V0IGZ1bGwgY29ycmVjdCBpbmZvICovCisJCXNpemVfYjEgPSBmbGFzaF9nZXRfc2l6ZSgodnVfbG9uZyAqKShDRkdfRkxBU0hfQkFTRSArIHNpemVfYjApLAorCQkJCQkgICZmbGFzaF9pbmZvWzFdKTsKKworI2lmIENGR19NT05JVE9SX0JBU0UgPj0gQ0ZHX0ZMQVNIX0JBU0UKKwkJLyogbW9uaXRvciBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KKwkJZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkJICAgICAgQ0ZHX01PTklUT1JfQkFTRSwKKwkJCSAgICAgIENGR19NT05JVE9SX0JBU0UrQ0ZHX01PTklUT1JfTEVOLTEsCisJCQkgICAgICAmZmxhc2hfaW5mb1sxXSk7CisjZW5kaWYKKworI2lmZGVmCUNGR19FTlZfSVNfSU5fRkxBU0gKKwkJLyogRU5WIHByb3RlY3Rpb24gT04gYnkgZGVmYXVsdCAqLworCQlmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCQkgICAgICBDRkdfRU5WX0FERFIsCisJCQkgICAgICBDRkdfRU5WX0FERFIrQ0ZHX0VOVl9TSVpFLTEsCisJCQkgICAgICAmZmxhc2hfaW5mb1sxXSk7CisjZW5kaWYKKwl9IGVsc2UgeworCQltZW1jdGwtPm1lbWNfYnIxID0gMDsJCS8qIGludmFsaWRhdGUgYmFuayAqLworCisJCWZsYXNoX2luZm9bMV0uZmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCQlmbGFzaF9pbmZvWzFdLnNlY3Rvcl9jb3VudCA9IC0xOworCX0KKworCWZsYXNoX2luZm9bMF0uc2l6ZSA9IHNpemVfYjA7CisJZmxhc2hfaW5mb1sxXS5zaXplID0gc2l6ZV9iMTsKKworCXJldHVybiAoc2l6ZV9iMCArIHNpemVfYjEpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmxhc2hfcHJpbnRfaW5mbyAgKGZsYXNoX2luZm9fdCAqaW5mbykKK3sKKwlpbnQgaTsKKworCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCXByaW50ZiAoIm1pc3Npbmcgb3IgdW5rbm93biBGTEFTSCB0eXBlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgeworCWNhc2UgRkxBU0hfTUFOX0FNRDoJcHJpbnRmICgiQU1EICIpOwkJYnJlYWs7CisJY2FzZSBGTEFTSF9NQU5fRlVKOglwcmludGYgKCJGVUpJVFNVICIpOwkJYnJlYWs7CisJZGVmYXVsdDoJCXByaW50ZiAoIlVua25vd24gVmVuZG9yICIpOwlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spIHsKKwljYXNlIEZMQVNIX0FNNDAwQjoJcHJpbnRmICgiQU0yOUxWNDAwQiAoNCBNYml0LCBib3R0b20gYm9vdCBzZWN0KVxuIik7CisJCQkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTQwMFQ6CXByaW50ZiAoIkFNMjlMVjQwMFQgKDQgTWJpdCwgdG9wIGJvb3Qgc2VjdG9yKVxuIik7CisJCQkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTgwMEI6CXByaW50ZiAoIkFNMjlMVjgwMEIgKDggTWJpdCwgYm90dG9tIGJvb3Qgc2VjdClcbiIpOworCQkJCWJyZWFrOworCWNhc2UgRkxBU0hfQU04MDBUOglwcmludGYgKCJBTTI5TFY4MDBUICg4IE1iaXQsIHRvcCBib290IHNlY3RvcilcbiIpOworCQkJCWJyZWFrOworCWNhc2UgRkxBU0hfQU0xNjBCOglwcmludGYgKCJBTTI5TFYxNjBCICgxNiBNYml0LCBib3R0b20gYm9vdCBzZWN0KVxuIik7CisJCQkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTE2MFQ6CXByaW50ZiAoIkFNMjlMVjE2MFQgKDE2IE1iaXQsIHRvcCBib290IHNlY3RvcilcbiIpOworCQkJCWJyZWFrOworCWNhc2UgRkxBU0hfQU0zMjBCOglwcmludGYgKCJBTTI5TFYzMjBCICgzMiBNYml0LCBib3R0b20gYm9vdCBzZWN0KVxuIik7CisJCQkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTMyMFQ6CXByaW50ZiAoIkFNMjlMVjMyMFQgKDMyIE1iaXQsIHRvcCBib290IHNlY3RvcilcbiIpOworCQkJCWJyZWFrOworCWRlZmF1bHQ6CQlwcmludGYgKCJVbmtub3duIENoaXAgVHlwZVxuIik7CisJCQkJYnJlYWs7CisJfQorCisJcHJpbnRmICgiICBTaXplOiAlbGQgTUIgaW4gJWQgU2VjdG9yc1xuIiwKKwkJaW5mby0+c2l6ZSA+PiAyMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKworCXByaW50ZiAoIiAgU2VjdG9yIFN0YXJ0IEFkZHJlc3NlczoiKTsKKwlmb3IgKGk9MDsgaTxpbmZvLT5zZWN0b3JfY291bnQ7ICsraSkgeworCQlpZiAoKGkgJSA1KSA9PSAwKQorCQkJcHJpbnRmICgiXG4gICAiKTsKKwkJcHJpbnRmICgiICUwOGxYJXMiLAorCQkJaW5mby0+c3RhcnRbaV0sCisJCQlpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIKKwkJKTsKKwl9CisJcHJpbnRmICgiXG4iKTsKKwlyZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGNhbm5vdCBiZSBydW4gZnJvbSBGTEFTSCEKKyAqLworCitzdGF0aWMgdWxvbmcgZmxhc2hfZ2V0X3NpemUgKHZ1X2xvbmcgKmFkZHIsIGZsYXNoX2luZm9fdCAqaW5mbykKK3sKKwlzaG9ydCBpOworCXVsb25nIHZhbHVlOworCXVsb25nIGJhc2UgPSAodWxvbmcpYWRkcjsKKworCS8qIFdyaXRlIGF1dG8gc2VsZWN0IGNvbW1hbmQ6IHJlYWQgTWFudWZhY3R1cmVyIElEICovCisJYWRkclsweDA1NTVdID0gMHgwMEFBMDBBQTsKKwlhZGRyWzB4MDJBQV0gPSAweDAwNTUwMDU1OworCWFkZHJbMHgwNTU1XSA9IDB4MDA5MDAwOTA7CisKKwl2YWx1ZSA9IGFkZHJbMF07CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSBBTURfTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX0FNRDsKKwkJYnJlYWs7CisJY2FzZSBGVUpfTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX0ZVSjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAwOworCQlpbmZvLT5zaXplID0gMDsKKwkJcmV0dXJuICgwKTsJCQkvKiBubyBvciB1bmtub3duIGZsYXNoCSovCisJfQorCisJdmFsdWUgPSBhZGRyWzFdOwkJCS8qIGRldmljZSBJRAkJKi8KKworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIEFNRF9JRF9MVjQwMFQ6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNNDAwVDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTE7CisJCWluZm8tPnNpemUgPSAweDAwMTAwMDAwOworCQlicmVhazsJCQkJLyogPT4gMSBNQgkJKi8KKworCWNhc2UgQU1EX0lEX0xWNDAwQjoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU00MDBCOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAxMTsKKwkJaW5mby0+c2l6ZSA9IDB4MDAxMDAwMDA7CisJCWJyZWFrOwkJCQkvKiA9PiAxIE1CCQkqLworCisJY2FzZSBBTURfSURfTFY4MDBUOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTgwMFQ7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDE5OworCQlpbmZvLT5zaXplID0gMHgwMDIwMDAwMDsKKwkJYnJlYWs7CQkJCS8qID0+IDIgTUIJCSovCisKKwljYXNlIEFNRF9JRF9MVjgwMEI6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNODAwQjsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTk7CisJCWluZm8tPnNpemUgPSAweDAwMjAwMDAwOworCQlicmVhazsJCQkJLyogPT4gMiBNQgkJKi8KKworCWNhc2UgQU1EX0lEX0xWMTYwVDoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0xNjBUOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAzNTsKKwkJaW5mby0+c2l6ZSA9IDB4MDA0MDAwMDA7CisJCWJyZWFrOwkJCQkvKiA9PiA0IE1CCQkqLworCisJY2FzZSBBTURfSURfTFYxNjBCOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTE2MEI7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDM1OworCQlpbmZvLT5zaXplID0gMHgwMDQwMDAwMDsKKwkJYnJlYWs7CQkJCS8qID0+IDQgTUIJCSovCisJY2FzZSBBTURfSURfTFYzMjBUOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTMyMFQ7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDcxOworCQlpbmZvLT5zaXplID0gMHgwMDgwMDAwMDsKKwkJYnJlYWs7CQkJCS8qID0+IDggTUIJCSovCisKKwljYXNlIEFNRF9JRF9MVjMyMEI6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNMzIwQjsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gNzE7CisJCWluZm8tPnNpemUgPSAweDAwODAwMDAwOworCQlicmVhazsJCQkJLyogPT4gOCBNQgkJKi8KKwlkZWZhdWx0OgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCXJldHVybiAoMCk7CQkJLyogPT4gbm8gb3IgdW5rbm93biBmbGFzaCAqLworCX0KKworCS8qIHNldCB1cCBzZWN0b3Igc3RhcnQgYWRkcmVzcyB0YWJsZSAqLworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIEFNRF9JRF9MVjQwMEI6CisJY2FzZSBBTURfSURfTFY4MDBCOgorCWNhc2UgQU1EX0lEX0xWMTYwQjoKKwkJLyogc2V0IHNlY3RvciBvZmZzZXRzIGZvciBib3R0b20gYm9vdCBibG9jayB0eXBlCSovCisJCWluZm8tPnN0YXJ0WzBdID0gYmFzZSArIDB4MDAwMDAwMDA7CisJCWluZm8tPnN0YXJ0WzFdID0gYmFzZSArIDB4MDAwMDgwMDA7CisJCWluZm8tPnN0YXJ0WzJdID0gYmFzZSArIDB4MDAwMEMwMDA7CisJCWluZm8tPnN0YXJ0WzNdID0gYmFzZSArIDB4MDAwMTAwMDA7CisJCWZvciAoaSA9IDQ7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgKGkgKiAweDAwMDIwMDAwKSAtIDB4MDAwNjAwMDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBTURfSURfTFY0MDBUOgorCWNhc2UgQU1EX0lEX0xWODAwVDoKKwljYXNlIEFNRF9JRF9MVjE2MFQ6CisJCS8qIHNldCBzZWN0b3Igb2Zmc2V0cyBmb3IgdG9wIGJvb3QgYmxvY2sgdHlwZQkJKi8KKwkJaSA9IGluZm8tPnNlY3Rvcl9jb3VudCAtIDE7CisJCWluZm8tPnN0YXJ0W2ktLV0gPSBiYXNlICsgaW5mby0+c2l6ZSAtIDB4MDAwMDgwMDA7CisJCWluZm8tPnN0YXJ0W2ktLV0gPSBiYXNlICsgaW5mby0+c2l6ZSAtIDB4MDAwMEMwMDA7CisJCWluZm8tPnN0YXJ0W2ktLV0gPSBiYXNlICsgaW5mby0+c2l6ZSAtIDB4MDAwMTAwMDA7CisJCWZvciAoOyBpID49IDA7IGktLSkgeworCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgaSAqIDB4MDAwMjAwMDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBTURfSURfTFYzMjBCOgorCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJCWluZm8tPnN0YXJ0W2ldID0gYmFzZTsKKwkJCS8qCisJCQkgKiBUaGUgZmlyc3QgOCBzZWN0b3JzIGFyZSA4IGtCLAorCQkJICogYWxsIHRoZSBvdGhlciBvbmVzICBhcmUgNjQga0IKKwkJCSAqLworCQkJYmFzZSArPSAoaSA8IDgpCisJCQkJPyAgMiAqICggOCA8PCAxMCkKKwkJCQk6ICAyICogKDY0IDw8IDEwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEFNRF9JRF9MVjMyMFQ6CisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlOworCQkJLyoKKwkJCSAqIFRoZSBsYXN0IDggc2VjdG9ycyBhcmUgOCBrQiwKKwkJCSAqIGFsbCB0aGUgb3RoZXIgb25lcyAgYXJlIDY0IGtCCisJCQkgKi8KKwkJCWJhc2UgKz0gKGkgPCAoaW5mby0+c2VjdG9yX2NvdW50IC0gOCkpCisJCQkJPyAgMiAqICg2NCA8PCAxMCkKKwkJCQk6ICAyICogKCA4IDw8IDEwKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKDApOworCQlicmVhazsKKwl9CisKKwkvKiBjaGVjayBmb3IgcHJvdGVjdGVkIHNlY3RvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJLyogcmVhZCBzZWN0b3IgcHJvdGVjdGlvbiBhdCBzZWN0b3IgYWRkcmVzcywgKEE3IC4uIEEwKSA9IDB4MDIgKi8KKwkJLyogRDAgPSAxIGlmIHByb3RlY3RlZCAqLworCQlhZGRyID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoaW5mby0+c3RhcnRbaV0pOworCQlpbmZvLT5wcm90ZWN0W2ldID0gYWRkclsyXSAmIDE7CisJfQorCisJLyoKKwkgKiBQcmV2ZW50IHdyaXRlcyB0byB1bmluaXRpYWxpemVkIEZMQVNILgorCSAqLworCWlmIChpbmZvLT5mbGFzaF9pZCAhPSBGTEFTSF9VTktOT1dOKSB7CisJCWFkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWluZm8tPnN0YXJ0WzBdOworCisJCSphZGRyID0gMHgwMEYwMDBGMDsJLyogcmVzZXQgYmFuayAqLworCX0KKworCXJldHVybiAoaW5mby0+c2l6ZSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK2ludAlmbGFzaF9lcmFzZSAoZmxhc2hfaW5mb190ICppbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK3sKKwl2dV9sb25nICphZGRyID0gKHZ1X2xvbmcqKShpbmZvLT5zdGFydFswXSk7CisJaW50IGZsYWcsIHByb3QsIHNlY3QsIGxfc2VjdDsKKwl1bG9uZyBzdGFydCwgbm93LCBsYXN0OworCisJaWYgKChzX2ZpcnN0IDwgMCkgfHwgKHNfZmlyc3QgPiBzX2xhc3QpKSB7CisJCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCQlwcmludGYgKCItIG1pc3NpbmdcbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRmICgiLSBubyBzZWN0b3JzIHRvIGVyYXNlXG4iKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHx8CisJICAgIChpbmZvLT5mbGFzaF9pZCA+IEZMQVNIX0FNRF9DT01QKSkgeworCQlwcmludGYgKCJDYW4ndCBlcmFzZSB1bmtub3duIGZsYXNoIHR5cGUgJTA4bHggLSBhYm9ydGVkXG4iLAorCQkJaW5mby0+Zmxhc2hfaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcm90ID0gMDsKKwlmb3IgKHNlY3Q9c19maXJzdDsgc2VjdDw9c19sYXN0OyArK3NlY3QpIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pIHsKKwkJCXByb3QrKzsKKwkJfQorCX0KKworCWlmIChwcm90KSB7CisJCXByaW50ZiAoIi0gV2FybmluZzogJWQgcHJvdGVjdGVkIHNlY3RvcnMgd2lsbCBub3QgYmUgZXJhc2VkIVxuIiwKKwkJCXByb3QpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIlxuIik7CisJfQorCisJbF9zZWN0ID0gLTE7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKwlhZGRyWzB4MDU1NV0gPSAweDAwQUEwMEFBOworCWFkZHJbMHgwMkFBXSA9IDB4MDA1NTAwNTU7CisJYWRkclsweDA1NTVdID0gMHgwMDgwMDA4MDsKKwlhZGRyWzB4MDU1NV0gPSAweDAwQUEwMEFBOworCWFkZHJbMHgwMkFBXSA9IDB4MDA1NTAwNTU7CisKKwkvKiBTdGFydCBlcmFzZSBvbiB1bnByb3RlY3RlZCBzZWN0b3JzICovCisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdDw9c19sYXN0OyBzZWN0KyspIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkgewkvKiBub3QgcHJvdGVjdGVkICovCisJCQlhZGRyID0gKHZ1X2xvbmcqKShpbmZvLT5zdGFydFtzZWN0XSk7CisJCQlhZGRyWzBdID0gMHgwMDMwMDAzMDsKKwkJCWxfc2VjdCA9IHNlY3Q7CisJCX0KKwl9CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCS8qIHdhaXQgYXQgbGVhc3QgODB1cyAtIGxldCdzIHdhaXQgMSBtcyAqLworCXVkZWxheSAoMTAwMCk7CisKKwkvKgorCSAqIFdlIHdhaXQgZm9yIHRoZSBsYXN0IHRyaWdnZXJlZCBzZWN0b3IKKwkgKi8KKwlpZiAobF9zZWN0IDwgMCkKKwkJZ290byBET05FOworCisJc3RhcnQgPSBnZXRfdGltZXIgKDApOworCWxhc3QgID0gc3RhcnQ7CisJYWRkciA9ICh2dV9sb25nKikoaW5mby0+c3RhcnRbbF9zZWN0XSk7CisJd2hpbGUgKChhZGRyWzBdICYgMHgwMDgwMDA4MCkgIT0gMHgwMDgwMDA4MCkgeworCQlpZiAoKG5vdyA9IGdldF90aW1lcihzdGFydCkpID4gQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQpIHsKKwkJCXByaW50ZiAoIlRpbWVvdXRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogc2hvdyB0aGF0IHdlJ3JlIHdhaXRpbmcgKi8KKwkJaWYgKChub3cgLSBsYXN0KSA+IDEwMDApIHsJLyogZXZlcnkgc2Vjb25kICovCisJCQlwdXRjICgnLicpOworCQkJbGFzdCA9IG5vdzsKKwkJfQorCX0KKworRE9ORToKKwkvKiByZXNldCB0byByZWFkIG1vZGUgKi8KKwlhZGRyID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilpbmZvLT5zdGFydFswXTsKKwlhZGRyWzBdID0gMHgwMEYwMDBGMDsJLyogcmVzZXQgYmFuayAqLworCisJcHJpbnRmICgiIGRvbmVcbiIpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5IG1lbW9yeSB0byBmbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KKworaW50IHdyaXRlX2J1ZmYgKGZsYXNoX2luZm9fdCAqaW5mbywgdWNoYXIgKnNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQoreworCXVsb25nIGNwLCB3cCwgZGF0YTsKKwlpbnQgaSwgbCwgcmM7CisKKwl3cCA9IChhZGRyICYgfjMpOwkvKiBnZXQgbG93ZXIgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCBzdGFydCBieXRlcworCSAqLworCWlmICgobCA9IGFkZHIgLSB3cCkgIT0gMCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpPTAsIGNwPXdwOyBpPGw7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisJCX0KKwkJZm9yICg7IGk8NCAmJiBjbnQ+MDsgKytpKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAqc3JjKys7CisJCQktLWNudDsKKwkJCSsrY3A7CisJCX0KKwkJZm9yICg7IGNudD09MCAmJiBpPDQ7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisJCX0KKworCQlpZiAoKHJjID0gd3JpdGVfd29yZChpbmZvLCB3cCwgZGF0YSkpICE9IDApIHsKKwkJCXJldHVybiAocmMpOworCQl9CisJCXdwICs9IDQ7CisJfQorCisJLyoKKwkgKiBoYW5kbGUgd29yZCBhbGlnbmVkIHBhcnQKKwkgKi8KKwl3aGlsZSAoY250ID49IDQpIHsKKwkJZGF0YSA9IDA7CisJCWZvciAoaT0wOyBpPDQ7ICsraSkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworCQl9CisJCWlmICgocmMgPSB3cml0ZV93b3JkKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworCQkJcmV0dXJuIChyYyk7CisJCX0KKwkJd3AgICs9IDQ7CisJCWNudCAtPSA0OworCX0KKworCWlmIChjbnQgPT0gMCkgeworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpPTAsIGNwPXdwOyBpPDQgJiYgY250PjA7ICsraSwgKytjcCkgeworCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAqc3JjKys7CisJCS0tY250OworCX0KKwlmb3IgKDsgaTw0OyArK2ksICsrY3ApIHsKKwkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisJfQorCisJcmV0dXJuICh3cml0ZV93b3JkKGluZm8sIHdwLCBkYXRhKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyaXRlIGEgd29yZCB0byBGbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfd29yZCAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKQoreworCXZ1X2xvbmcgKmFkZHIgPSAodnVfbG9uZyopKGluZm8tPnN0YXJ0WzBdKTsKKwl1bG9uZyBzdGFydDsKKwlpbnQgZmxhZzsKKworCS8qIENoZWNrIGlmIEZsYXNoIGlzIChzdWZmaWNpZW50bHkpIGVyYXNlZCAqLworCWlmICgoKigodnVfbG9uZyAqKWRlc3QpICYgZGF0YSkgIT0gZGF0YSkgeworCQlyZXR1cm4gKDIpOworCX0KKwkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKwlhZGRyWzB4MDU1NV0gPSAweDAwQUEwMEFBOworCWFkZHJbMHgwMkFBXSA9IDB4MDA1NTAwNTU7CisJYWRkclsweDA1NTVdID0gMHgwMEEwMDBBMDsKKworCSooKHZ1X2xvbmcgKilkZXN0KSA9IGRhdGE7CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCS8qIGRhdGEgcG9sbGluZyBmb3IgRDcgKi8KKwlzdGFydCA9IGdldF90aW1lciAoMCk7CisJd2hpbGUgKCgqKCh2dV9sb25nICopZGVzdCkgJiAweDAwODAwMDgwKSAhPSAoZGF0YSAmIDB4MDA4MDAwODApKSB7CisJCWlmIChnZXRfdGltZXIoc3RhcnQpID4gQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQpIHsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisJcmV0dXJuICgwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCmRpZmYgLS1naXQgYS9ib2FyZC90cW04eHgvbG9hZF9zZXJudW1fZXRoYWRkci5jIGIvYm9hcmQvdHFtOHh4L2xvYWRfc2VybnVtX2V0aGFkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGJhZjdmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvdHFtOHh4L2xvYWRfc2VybnVtX2V0aGFkZHIuYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByb2Nlc3MgSGFyZHdhcmUgSW5mb3JtYXRpb24gQmxvY2s6CisgKgorICogSWYgd2UgYm9vdCBvbiBhIHN5c3RlbSBmcmVzaCBmcm9tIGZhY3RvcnksIGNoZWNrIGlmIHRoZSBIYXJkd2FyZQorICogSW5mb3JtYXRpb24gQmxvY2sgZXhpc3RzIGFuZCBzYXZlIHRoZSBpbmZvcm1hdGlvbiBpdCBjb250YWlucy4KKyAqCisgKiBUaGUgVFFNOHh4TCAvIFRRTTgyeHggSGFyZHdhcmUgSW5mb3JtYXRpb24gQmxvY2sgaXMgZGVmaW5lZCBhcworICogZm9sbG93czoKKyAqIC0gbG9jYXRlZCBpbiBmaXJzdCBmbGFzaCBiYW5rCisgKiAtIHN0YXJ0cyBhdCBvZmZzZXQgMHgwMDAzRkZDMAorICogLSBzaXplIDB4MDAwMDAwNDAKKyAqCisgKiBJbnRlcm5hbCBzdHJ1Y3R1cmU6CisgKiAtIHNlcXVlbmNlIG9mIEFTQ0lJIGNoYXJhY3RlciBzdHJpbmdzCisgKiAtIGZpZWxkcyBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgc3BhY2UgY2hhcmFjdGVyICgweDIwKQorICogLSBsYXN0IGZpZWxkIHRlcm1pbmF0ZWQgYnkgTlVMIGNoYXJhY3RlciAoMHgwMCkKKyAqIC0gcmVtYWluaW5nIHNwYWNlIGZpbGxlZCB3aXRoIE5VTCBjaGFyYWN0ZXJzICgweDAwKQorICoKKyAqIEZpZWxkcyBpbiBIYXJkd2FyZSBJbmZvcm1hdGlvbiBCbG9jazoKKyAqIDEpIE1vZHVsZSBUeXBlCisgKiAyKSBTZXJpYWwgTnVtYmVyCisgKiAzKSBGaXJzdCBNQUMgQWRkcmVzcworICogNCkgTnVtYmVyIG9mIGFkZGl0aW9uYWwgTUFDIGFkZHJlc3NlcworICovCisKK3ZvaWQgbG9hZF9zZXJudW1fZXRoYWRkciAodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyICpod2k7CisJdW5zaWduZWQgY2hhciAgc2VyaWFsIFtDRkdfSFdJTkZPX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgIGV0aGFkZHJbQ0ZHX0hXSU5GT19TSVpFXTsKKwl1bnNpZ25lZCBzaG9ydCBpaCwgaXMsIGllLCBwYXJ0OworCisJaHdpID0gKHVuc2lnbmVkIGNoYXIgKikoQ0ZHX0ZMQVNIX0JBU0UgKyBDRkdfSFdJTkZPX09GRlNFVCk7CisJaWggPSBpcyA9IGllID0gMDsKKworCWlmICgqKCh1bnNpZ25lZCBsb25nICopaHdpKSAhPSAodW5zaWduZWQgbG9uZylDRkdfSFdJTkZPX01BR0lDKSB7CisJCXJldHVybjsKKwl9CisKKwlwYXJ0ID0gMTsKKworCS8qIGNvcHkgc2VyaWFsICMgLyBNQUMgYWRkcmVzcyAqLworCXdoaWxlICgoaHdpW2loXSAhPSAnXDAnKSAmJiAoaWggPCBDRkdfSFdJTkZPX1NJWkUpKSB7CisJCWlmIChod2lbaWhdIDwgJyAnIHx8IGh3aVtpaF0gPiAnficpIHsgLyogQVNDSUkgc3RyaW5ncyEgKi8KKwkJCXJldHVybjsKKwkJfQorCQlzd2l0Y2ggKHBhcnQpIHsKKwkJZGVmYXVsdDoJCS8qIENvcHkgc2VyaWFsICMgKi8KKwkJCWlmIChod2lbaWhdID09ICcgJykgeworCQkJCSsrcGFydDsKKwkJCX0KKwkJCXNlcmlhbFtpcysrXSA9IGh3aVtpaF07CisJCQlicmVhazsKKwkJY2FzZSAzOgkJCS8qIENvcHkgTUFDIGFkZHJlc3MgKi8KKwkJCWlmIChod2lbaWhdID09ICcgJykgeworCQkJCSsrcGFydDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWV0aGFkZHJbaWUrK10gPSBod2lbaWhdOworCQkJaWYgKChpZSAlIDMpID09IDIpCisJCQkJZXRoYWRkcltpZSsrXSA9ICc6JzsKKwkJCWJyZWFrOworCQl9CisJCSsraWg7CisJfQorCXNlcmlhbFtpc10gID0gJ1wwJzsKKwlpZiAoaWUgJiYgZXRoYWRkcltpZS0xXSA9PSAnOicpCisJCS0taWU7CisJZXRoYWRkcltpZV0gPSAnXDAnOworCisJLyogc2V0IHNlcmlhbCMgYW5kIGV0aGFkZHIgaWYgbm90IHlldCBkZWZpbmVkICovCisJaWYgKGdldGVudigic2VyaWFsIyIpID09IE5VTEwpIHsKKwkJc2V0ZW52ICgic2VyaWFsIyIsIHNlcmlhbCk7CisJfQorCisJaWYgKGdldGVudigiZXRoYWRkciIpID09IE5VTEwpIHsKKwkJc2V0ZW52ICgiZXRoYWRkciIsIGV0aGFkZHIpOworCX0KK30KZGlmZiAtLWdpdCBhL2JvYXJkL3RyYWIvUkVBRE1FLmtiZCBiL2JvYXJkL3RyYWIvUkVBRE1FLmtiZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGIwMGJjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvdHJhYi9SRUFETUUua2JkCkBAIC0wLDAgKzEsNDQgQEAKKworVGhlIFRSQUIga2V5Ym9hcmQgaW1wbGVtZW50YXRpb24gaXMgc2ltaWxhciB0byB0aGF0IGZvciBMV01PTiBhbmQKK1IzNjBNUEkgYm9hcmRzLiBUaGUgb25seSBkaWZmZXJlbmNlIGNvbmNlcm5zIGtleSBuYW1pbmcuIFRoZXJlIGFyZSA0CitrZXlzIG9uIFRSQUI6IDEsIDIsIDMsIDQuCisKKzEpIFRoZSAia2JkIiBjb21tYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YXRlIG9mCisgICB0aGUga2V5cy4gRm9yIGV4YW1wbGUsCisKKwlUUkFCICMga2JkCisJS2V5czogMSAwIDEgMAorCisgICBtZWFucyB0aGF0IGtleXMgMSBhbmQgMyBhcmUgcHJlc3NlZC4gVGhlIGtleWJvYXJkIHN0YXR1cyBpcyBhbHNvCisgICBzdG9yZWQgaW4gdGhlICJrZXliZCIgZW52aXJvbm1lbnQgdmFyaWFibGUuIEluIHRoaXMgZXhhbXBsZSB3ZSBnZXQKKworCWtleWJkPTEwMTAKKworMikgVGhlICJwcmVib290IiB2YXJpYWJsZSBpcyBzZXQgYWNjb3JkaW5nIHRvIGN1cnJlbnQgZW52aXJvbm1lbnQKKyAgIHNldHRpbmdzIGFuZCBrZXlzIHByZXNzZWQuIFRoaXMgaXMgYW4gZXhhbXBsZToKKworCVRSQUIgIyBzZXRlbnYgbWFnaWNfa2V5cyBYWQorCVRSQUIgIyBzZXRlbnYga2V5X21hZ2ljWCAxMgorCVRSQUIgIyBzZXRlbnYga2V5X2NtZFggZWNobyAjIyBLZXlzIDEgKyAyIHByZXNzZWQgIyNcO2VjaG8KKwlUUkFCICMgc2V0ZW52IGtleV9tYWdpY1kgMTMKKwlUUkFCICMgc2V0ZW52IGtleV9jbWRZIGVjaG8gIyMgS2V5cyAxICsgMyBwcmVzc2VkICMjXDtlY2hvCisKKyAgIEhlcmUgIm1hZ2ljX2tleXM9WFkiIG1lYW5zIHRoYXQgdGhlICJrZXlfbWFnaWNYIiBhbmQgImtleV9tYWdpY1kiCisgICB2YXJpYWJsZXMgd2lsbCBiZSBjaGVja2VkIGZvciBhIG1hdGNoLiBFYWNoIHZhcmlhYmxlICJrZXlfbWFnaWMqIgorICAgZGVmaW5lcyBhIHNldCBvZiBrZXlzLiBJbiB0aGUgb3VyIGV4YW1wbGUsIGlmIGtleXMgMSBhbmQgMyBhcmUKKyAgIHByZXNzZWQgZHVyaW5nIHJlc2V0LCB0aGVuICJrZXlfbWFnaWNZIiBtYXRjaGVzLCBzbyB0aGUgInByZWJvb3QiCisgICB2YXJpYWJsZSB3aWxsIGJlIHNldCB0byB0aGUgY29udGVudHMgb2YgImtleV9jbWRZIjoKKworCXByZWJvb3Q9ZWNobyAjIyBLZXlzIDEgKyAzIHByZXNzZWQgIyM7ZWNobworCiszKSBUaGUgVFJBQiBib2FyZCBoYXMgb3B0aW9uYWwgbW9kZW0gc3VwcG9ydC4gV2hlbiBhIGNlcnRhaW4ga2V5CisgICBjb21iaW5hdGlvbiBpcyBwcmVzc2VkIG9uIHRoZSBrZXlib2FyZCBhdCBwb3dlci1vbiwgdGhlIGZpcm13YXJlCisgICBwZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBtb2RlbSBhbmQgYWxsb3dzIGZvcgorICAgZGlhbC1pbi4gVGhlIGtleSBjb21iaW5hdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlCisgICAiaW5jbHVkZS9jb25maWdzL3RyYWIuaCIgZmlsZS4gRm9yIGV4YW1wbGU6CisKKwkjZGVmaW5lICAgICAgICBDT05GSUdfTU9ERU1fS0VZX01BR0lDICAiMjMiCisKKyAgIG1lYW5zIHRoYXQgbW9kZW0gd2lsbCBiZSBpbml0aWFsaXplZCBpZiBhbmQgb25seSBpZiBib3RoIGtleXMgMiwgMworICAgYXJlIHByZXNzZWQuIE5vdGUgdGhhdCB0aGUgZm9ybWF0IG9mIHRoaXMgc3RyaW5nIGlzIHNpbWlsYXIgdG8gdGhlCisgICBmb3JtYXQgb2YgImtleV9tYWdpYyoiIGVudmlyb25tZW50IHZhcmlhYmxlcyBkZXNjcmliZWQgYWJvdmUuCmRpZmYgLS1naXQgYS9ib2FyZC90cmFiL3RyYWIuYyBiL2JvYXJkL3RyYWIvdHJhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWIxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC90cmFiL3RyYWIuYwpAQCAtMCwwICsxLDMwMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qICNkZWZpbmUgREVCVUcgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNtZF9ic3AuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzM2MyNDAwLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19NT0RFTV9TVVBQT1JUCitzdGF0aWMgaW50IGtleV9wcmVzc2VkKHZvaWQpOworZXh0ZXJuIHZvaWQgZGlzYWJsZV9wdXRjKHZvaWQpOworZXh0ZXJuIGludCBkb19tZG1faW5pdDsgLyogZGVmaW5lZCBpbiBjb21tb24vbWFpbi5jICovCisKKy8qCisgKiBXZSBuZWVkIGEgZGVsYXkgb2YgYXQgbGVhc3QgNTAwIHVzIGFmdGVyIHR1cm5pbmcgb24gdGhlIFZGRCBjbG9jaworICogYmVmb3JlIHdlIGNhbiByZWFkIGFueSB1c2VmdWwgaW5mb3JtYXRpb24gZm9yIHRoZSBDUExEIGNvbnRyb2xsaW5nCisgKiB0aGUga2V5Ym9hcmQgc3dpdGNoZXMuIExldCdzIHBsYXkgc2FmZSBhbmQgd2FpdCA1IG1zLiBUaGUgcHJvYmxlbQorICogaXMgdGhhdCB0aW1lcnMgYXJlIG5vdCBhdmFpbGFibGUgeWV0LCBzbyB3ZSB1c2UgYSBtYW51YWxseSB0aW1lZAorICogbG9vcC4KKyAqLworI2RlZmluZSBLQkRfTURFTEFZCTEwMDAwMAkvKiAxMDAwICovCitzdGF0aWMgdm9pZCBtZGVsYXlfbm9fdGltZXIgKGludCBtc2VjKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJaW50IGk7CisJaW50IGRlbGF5ID0gbXNlYyAqIDM7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGVsYXk7IGkgKyspIGdkLT5iZC0+YmlfYXJjaF9udW1iZXIgPSAxNDU7Cit9CisjZW5kaWYgLyogQ09ORklHX01PREVNX1NVUFBPUlQgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGluaXRpYWxpc2F0aW9ucworICovCisKK2ludCBib2FyZF9pbml0ICgpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwkvKiBtZW1vcnkgYW5kIGNwdS1zcGVlZCBhcmUgc2V0dXAgYmVmb3JlIHJlbG9jYXRpb24gKi8KKyNpZmRlZiBDT05GSUdfVFJBQl81ME1IWgorCS8qIGNoYW5nZSB0aGUgY2xvY2sgdG8gYmUgNTAgTUh6IDE6MToxICovCisJLyogTURJVjoweDVjIFBESVY6NCBTRElWOjIgKi8KKwlyTVBMTENPTiA9IDB4NWMwNDI7CisJckNMS0RJVk4gPSAwOworI2Vsc2UKKwkvKiBjaGFuZ2UgdGhlIGNsb2NrIHRvIGJlIDEzMyBNSHogMToyOjQgKi8KKwkvKiBNRElWOjB4N2QgUERJVjo0IFNESVY6MSAqLworCXJNUExMQ09OID0gMHg3ZDA0MTsKKwlyQ0xLRElWTiA9IDM7CisjZW5kaWYKKworCS8qIHNldCB1cCB0aGUgSS9PIHBvcnRzICovCisJclBBQ09OID0gMHgzZmZmZjsKKwlyUEJDT04gPSAweGFhYWFhYWFhOworCXJQQlVQICA9IDB4ZmZmZjsKKwkvKiBJTlBVVCBuQ1RTMCBuUlRTMCBUWERbMV0gVFhEWzBdIFJYRFsxXSBSWERbMF0JKi8KKwkvKiAgMDAsICAgIDEwLCAgICAgIDEwLCAgICAgIDEwLCAgICAgIDEwLCAgICAgIDEwLCAgICAgIDEwIAkqLworCXJQRkNPTiA9ICgyPDwwKSB8ICgyPDwyKSB8ICgyPDw0KSB8ICgyPDw2KSB8ICgyPDw4KSB8ICgyPDwxMCk7CisjaWZkZWYgQ09ORklHX0hXRkxPVworCS8qIGRvIG5vdCBwdWxsIHVwIFJYRDAsIFJYRDEsIFRYRDAsIFRYRDEsIENUUzAsIFJUUzAgKi8KKwlyUEZVUCAgPSAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSk7CisjZWxzZQorCS8qIGRvIG5vdCBwdWxsIHVwIFJYRDAsIFJYRDEsIFRYRDAsIFRYRDEgKi8KKwlyUEZVUCAgPSAoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8Myk7CisjZW5kaWYKKwlyUEdDT04gPSAweDA7CisJclBHVVAgID0gMHgwOworCXJPUEVOQ1I9IDB4MDsKKworCS8qIGFyY2ggbnVtYmVyIG9mIFNBTVNVTkctQm9hcmQgKi8KKwkvKiBNQUNIX1RZUEVfU01ESzI0MDAgKi8KKwkvKiBYWFggdGhpcyBpc24ndCByZWFsbHkgY29ycmVjdCwgYnV0IGtlZXAgaXQgZm9yIG5vdyAqLworCWdkLT5iZC0+YmlfYXJjaF9udW1iZXIgPSAxNDU7CisKKwkvKiBhZHJlc3Mgb2YgYm9vdCBwYXJhbWV0ZXJzICovCisJZ2QtPmJkLT5iaV9ib290X3BhcmFtcyA9IDB4MGMwMDAxMDA7CisKKyNpZmRlZiBDT05GSUdfTU9ERU1fU1VQUE9SVAorCS8qIFRoaXMgc3R1ZmYgaXMgbmVlZGVkIHRvIGdldCBpbnRlcnJ1cHRzIG9uIHN0b3AtcG9zaXRpb24KKwkgKiBjb250YWN0IGV2ZW50cy4KKwkgKiAoQ29waWVkIGZyb20gdGhlIExDRCBpbml0aWFsaXphdGlvbiByb3V0aW5lLikKKwkgKi8KKwlpZiAockxDRENPTjEgPT0gMCkKKwl7CisJCXJQQ0NPTiA9IChyUENDT04gJiAweEZGRkZGRjAwKXwgMHgwMDAwMDBBQTsKKwkJclBEQ09OID0gKHJQRENPTiAmIDB4RkZGRkZGMDMpfCAweDAwMDAwMEE4OworI2lmIDAKKwkJclBEQ09OID0gKHJQRENPTiAmIDB4RkZGRkZGMDApfCAweDAwMDAwMEFBOworI2VuZGlmCisJCXJMQ0RDT04yID0gMHgwMDBEQzAwMDsKKwkJckxDRENPTjMgPSAweDAwNTEwMDBBOworCQlyTENEQ09ONCA9IDB4MDAwMDAwMDE7CisJCXJMQ0RDT041ID0gMHgwMDAwMDQ0MDsKKwkJckxDRENPTjEgPSAweDAwMDAwQjc1OworCX0KKworCW1kZWxheV9ub190aW1lciAoS0JEX01ERUxBWSk7CisKKwlpZiAoa2V5X3ByZXNzZWQoKSkgeworCQlkaXNhYmxlX3B1dGMoKTsJLyogbW9kZW0gZG9lc24ndCB1bmRlcnN0YW5kIGJhbm5lciBldGMgKi8KKwkJZG9fbWRtX2luaXQgPSAxOworCX0KKyNlbmRpZgkvKiBDT05GSUdfTU9ERU1fU1VQUE9SVCAqLworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc3RhcnQgPSBQSFlTX1NEUkFNXzE7CisJZ2QtPmJkLT5iaV9kcmFtWzBdLnNpemUgPSBQSFlTX1NEUkFNXzFfU0laRTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogS2V5Ym9hcmQgQ29udHJvbGxlcgorICovCisKKy8qIE1heGltdW0ga2V5IG51bWJlciAqLworI2RlZmluZSBLRVlCRF9LRVlfTlVNCQk0CisKKyNkZWZpbmUgS0JEX0RBVEEJKCgoKih2b2xhdGlsZSB1bG9uZyAqKTB4MDQwMjAwMDApID4+IDE2KSAmIDB4RikKKworc3RhdGljIHVjaGFyICprZXlfbWF0Y2ggKHVsb25nKTsKKworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXVsb25nIGtiZF9kYXRhID0gS0JEX0RBVEE7CisJdWNoYXIga2V5YmRfZW52W0tFWUJEX0tFWV9OVU0gKyAxXTsKKwl1Y2hhciAqc3RyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEtFWUJEX0tFWV9OVU07ICsraSkgeworCQlrZXliZF9lbnZbaV0gPSAnMCcgKyAoKGtiZF9kYXRhID4+IGkpICYgMSk7CisJfQorCWtleWJkX2VudltpXSA9ICdcMCc7CisJZGVidWcgKCIqKiBTZXR0aW5nIGtleWJkPVwiJXNcIlxuIiwga2V5YmRfZW52KTsKKwlzZXRlbnYgKCJrZXliZCIsIGtleWJkX2Vudik7CisKKwlzdHIgPSBzdHJkdXAgKGtleV9tYXRjaCAoa2JkX2RhdGEpKTsJLyogZGVjb2RlIGtleXMgKi8KKworI2lmZGVmIENPTkZJR19QUkVCT09UCS8qIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlICJwcmVib290IiBjb21tYW5kIG9uIGtleSBtYXRjaCAqLworCWRlYnVnICgiKiogU2V0dGluZyBwcmVib290PVwiJXNcIlxuIiwgc3RyKTsKKwlzZXRlbnYgKCJwcmVib290Iiwgc3RyKTsJLyogc2V0IG9yIGRlbGV0ZSBkZWZpbml0aW9uICovCisjZW5kaWYgLyogQ09ORklHX1BSRUJPT1QgKi8KKwlpZiAoc3RyICE9IE5VTEwpIHsKKwkJZnJlZSAoc3RyKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisjaWZkZWYgQ09ORklHX1BSRUJPT1QKKworc3RhdGljIHVjaGFyIGtiZF9tYWdpY19wcmVmaXhbXSA9ICJrZXlfbWFnaWMiOworc3RhdGljIHVjaGFyIGtiZF9jb21tYW5kX3ByZWZpeFtdID0gImtleV9jbWQiOworCitzdGF0aWMgaW50IGNvbXBhcmVfbWFnaWMgKHVsb25nIGtiZF9kYXRhLCB1Y2hhciAqc3RyKQoreworCXVjaGFyIGtleV9tYXNrOworCisJZGVidWcgKCJjb21wYXJlX21hZ2ljOiBrYmQ6ICUwNGx4ICBzdHI6IFwiJXNcIlxuIixrYmRfZGF0YSxzdHIpOworCWZvciAoOyAqc3RyOyBzdHIrKykKKwl7CisJCXVjaGFyIGMgPSAqc3RyIC0gJzEnOworCisJCWlmIChjID49IEtFWUJEX0tFWV9OVU0pCQkvKiBiYWQga2V5IG51bWJlciAqLworCQkJcmV0dXJuIC0xOworCisJCWtleV9tYXNrID0gMSA8PCBjOworCisJCWlmICghKGtiZF9kYXRhICYga2V5X21hc2spKSB7CS8qIGtleSBub3QgcHJlc3NlZCAqLworCQkJZGVidWcgKCAiY29tcGFyZV9tYWdpYzogIgorCQkJCSJrYmQ6ICUwNGx4IG1hc2s6ICUwNGx4IC0ga2V5IG5vdCBwcmVzc2VkXG4iLAorCQkJCWtiZF9kYXRhLCBrZXlfbWFzayApOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJa2JkX2RhdGEgJj0gfmtleV9tYXNrOworCX0KKworCWlmIChrYmRfZGF0YSkgewkJCQkvKiBrZXkocykgbm90IHJlbGVhc2VkICovCisJCWRlYnVnICggImNvbXBhcmVfbWFnaWM6ICIKKwkJCSJrYmQ6ICUwNGx4IC0ga2V5KHMpIG5vdCByZWxlYXNlZFxuIiwga2JkX2RhdGEpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENoZWNrIGlmIHByZXNzZWQga2V5KHMpIG1hdGNoIG1hZ2ljIHNlcXVlbmNlLAorICogYW5kIHJldHVybiB0aGUgY29tbWFuZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoYXQga2V5KHMpLgorICoKKyAqIElmIG5vIGtleSBwcmVzcyB3YXMgZGVjb2RlZCwgTlVMTCBpcyByZXR1cm5lZC4KKyAqCisgKiBOb3RlOiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBhcmd1bWVudCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGgKKyAqIHRoZSAibWFnaWMgY2hhcmN0ZXIgY29kZSIgb2YgdGhlIGRlY29kZWQga2V5KHMpLCBvciAnXDAnLgorICoKKyAqCisgKiBOb3RlOiB0aGUgc3RyaW5nIHBvaW50cyB0byBzdGF0aWMgZW52aXJvbm1lbnQgZGF0YSBhbmQgbXVzdCBiZQorICogc2F2ZWQgYmVmb3JlIHlvdSBjYWxsIGFueSBmdW5jdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSBlbnZpcm9ubWVudC4KKyAqLworc3RhdGljIHVjaGFyICprZXlfbWF0Y2ggKHVsb25nIGtiZF9kYXRhKQoreworCXVjaGFyIG1hZ2ljW3NpemVvZiAoa2JkX21hZ2ljX3ByZWZpeCkgKyAxXTsKKwl1Y2hhciBjbWRfbmFtZVtzaXplb2YgKGtiZF9jb21tYW5kX3ByZWZpeCkgKyAxXTsKKwl1Y2hhciAqc3VmZml4OworCXVjaGFyICprYmRfbWFnaWNfa2V5czsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBzdHJpbmcgZGVmaW5lcyB0aGUgY2hhcmFjdGVycyB0aGF0IGNhbiBwZSBhcHBlbmRlZAorCSAqIHRvICJrZXlfbWFnaWMiIHRvIGZvcm0gdGhlIG5hbWVzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0CisJICogaG9sZCAibWFnaWMiIGtleSBjb2RlcywgaS4gZS4gc3VjaCBrZXkgY29kZXMgdGhhdCBjYW4gY2F1c2UKKwkgKiBwcmUtYm9vdCBhY3Rpb25zLiBJZiB0aGUgc3RyaW5nIGlzIGVtcHR5ICgiIiksIHRoZW4gb25seQorCSAqICJrZXlfbWFnaWMiIGlzIGNoZWNrZWQgKG9sZCBiZWhhdmlvdXIpOyB0aGUgc3RyaW5nICIxMjUiIGNhdXNlcworCSAqIGNoZWNrcyBmb3IgImtleV9tYWdpYzEiLCAia2V5X21hZ2ljMiIgYW5kICJrZXlfbWFnaWM1IiwgZXRjLgorCSAqLworCWlmICgoa2JkX21hZ2ljX2tleXMgPSBnZXRlbnYgKCJtYWdpY19rZXlzIikpID09IE5VTEwpCisJCWtiZF9tYWdpY19rZXlzID0gIiI7CisKKwlkZWJ1ZyAoImtleV9tYXRjaDogbWFnaWNfa2V5cz1cIiVzXCJcbiIsIGtiZF9tYWdpY19rZXlzKTsKKworCS8qIGxvb3Agb3ZlciBhbGwgbWFnaWMga2V5czsKKwkgKiB1c2UgJ1wwJyBzdWZmaXggaW4gY2FzZSBvZiBlbXB0eSBzdHJpbmcKKwkgKi8KKwlmb3IgKHN1ZmZpeD1rYmRfbWFnaWNfa2V5czsgKnN1ZmZpeCB8fCBzdWZmaXg9PWtiZF9tYWdpY19rZXlzOyArK3N1ZmZpeCkKKwl7CisJCXNwcmludGYgKG1hZ2ljLCAiJXMlYyIsIGtiZF9tYWdpY19wcmVmaXgsICpzdWZmaXgpOworCisJCWRlYnVnICgia2V5X21hdGNoOiBtYWdpYz1cIiVzXCJcbiIsCisJCQlnZXRlbnYobWFnaWMpID8gZ2V0ZW52KG1hZ2ljKSA6ICI8VU5ERUZJTkVEPiIpOworCisJCWlmIChjb21wYXJlX21hZ2ljKGtiZF9kYXRhLCBnZXRlbnYobWFnaWMpKSA9PSAwKQorCQl7CisJCQlzcHJpbnRmIChjbWRfbmFtZSwgIiVzJWMiLCBrYmRfY29tbWFuZF9wcmVmaXgsICpzdWZmaXgpOworCQkJZGVidWcgKCJrZXlfbWF0Y2g6IGNtZG5hbWUgJXM9XCIlc1wiXG4iLAorCQkJCWNtZF9uYW1lLAorCQkJCWdldGVudiAoY21kX25hbWUpID8KKwkJCQkJZ2V0ZW52IChjbWRfbmFtZSkgOgorCQkJCQkiPFVOREVGSU5FRD4iKTsKKwkJCXJldHVybiAoZ2V0ZW52IChjbWRfbmFtZSkpOworCQl9CisJfQorCWRlYnVnICgia2V5X21hdGNoOiBubyBtYXRjaFxuIik7CisJcmV0dXJuIChOVUxMKTsKK30KKyNlbmRpZgkJCQkJCQkvKiBDT05GSUdfUFJFQk9PVCAqLworCisvKiBSZWFkIEtleWJvYXJkIHN0YXR1cyAqLworaW50IGRvX2tiZCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVsb25nIGtiZF9kYXRhID0gS0JEX0RBVEE7CisJdWNoYXIga2V5YmRfZW52W0tFWUJEX0tFWV9OVU0gKyAxXTsKKwlpbnQgaTsKKworCXB1dHMgKCJLZXlzOiIpOworCWZvciAoaSA9IDA7IGkgPCBLRVlCRF9LRVlfTlVNOyArK2kpIHsKKwkJa2V5YmRfZW52W2ldID0gJzAnICsgKChrYmRfZGF0YSA+PiBpKSAmIDEpOworCQlwcmludGYgKCIgJWMiLCBrZXliZF9lbnZbaV0pOworCX0KKwlrZXliZF9lbnZbaV0gPSAnXDAnOworCXB1dGMgKCdcbicpOworCXNldGVudiAoImtleWJkIiwga2V5YmRfZW52KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19NT0RFTV9TVVBQT1JUCitzdGF0aWMgaW50IGtleV9wcmVzc2VkKHZvaWQpCit7CisJcmV0dXJuIChjb21wYXJlX21hZ2ljKEtCRF9EQVRBLCBDT05GSUdfTU9ERU1fS0VZX01BR0lDKSA9PSAwKTsKK30KKyNlbmRpZgkvKiBDT05GSUdfTU9ERU1fU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvdHJhYi91LWJvb3QubGRzIGIvYm9hcmQvdHJhYi91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODM0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC90cmFiL3UtYm9vdC5sZHMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKKy8qT1VUUFVUX0ZPUk1BVCgiZWxmMzItYXJtIiwgImVsZjMyLWFybSIsICJlbGYzMi1hcm0iKSovCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAgICAgICAuID0gMHgwMDAwMDAwMDsKKworICAgICAgICAuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L2FybTkyMHQvc3RhcnQubwkoLnRleHQpCisJICBsaWJfYXJtL191ZGl2c2kzLm8JKC50ZXh0KQorCSAgbGliX2FybS9fdW1vZHNpMy5vCSgudGV4dCkKKwkgIGxpYl9nZW5lcmljL3psaWIubwkoLnRleHQpCisJICBsaWJfZ2VuZXJpYy9jcmMzMi5vCSgudGV4dCkKKwkgIGxpYl9nZW5lcmljL3N0cmluZy5vCSgudGV4dCkKKworCS4gPSBlbnZfb2Zmc2V0OworCWNvbW1vbi9lbnZpcm9ubWVudC5vCSgucHBjZW52KQorCisJICAqKC50ZXh0KQorCX0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLmRhdGEgOiB7ICooLmRhdGEpIH0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5nb3QgOiB7ICooLmdvdCkgfQorCisJYXJtYm9vdF9lbmRfZGF0YSA9IC47CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAuYnNzIDogeyAqKC5ic3MpIH0KKworCWFybWJvb3RfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3RyYWIvdmZkLmMgYi9ib2FyZC90cmFiL3ZmZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYTQ4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC90cmFiL3ZmZC5jCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIC0tIHdkQGRlbnguZGUKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogKiogREVCVUcgU0VUVElOR1MJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICNkZWZpbmUgREVCVUcJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICoqIEhFQURFUiBGSUxFUwkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGRldmljZXMuaD4KKyNpbmNsdWRlIDxzM2MyNDAwLmg+CisKKyNpZmRlZiBDT05GSUdfVkZECisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBDT05GSUcgU1RVRkYgLS0gc2hvdWxkIGJlIG1vdmVkIHRvIGJvYXJkIGNvbmZpZyBmaWxlCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBQQUdFX1NJWkUKKyNkZWZpbmUJUEFHRV9TSVpFCTQwOTYKKyNlbmRpZgorCisjZGVmaW5lIFJPVAkweDA5CisjZGVmaW5lIEJMQVUJMHgwQworI2RlZmluZSBWSU9MRVRUCTBYMEQKKwordWxvbmcgdmZkYmFzZTsKK3Vsb25nIGZyYW1lX2J1Zl9zaXplOworI2RlZmluZSBmcmFtZV9idWZfb2ZmcyA0CisKKy8qIHRha2VuIGZyb20gYXJtYm9vdC9jb21tb24vdmZkLmMgKi8KK3Vsb25nICAgICAgICAgYWRyX3ZmZF90YWJsZVsxMTJdWzE4XVsyXVs0XVsyXTsKK3Vuc2lnbmVkIGNoYXIgYml0X3ZmZF90YWJsZVsxMTJdWzE4XVsyXVs0XVsyXTsKKworLyoKKyAqIGluaXRpYWxpemUgdGhlIHZhbHVlcyBmb3IgdGhlIFZGRC1ncmlkLWNvbnRyb2wgaW4gdGhlIGZyYW1lYnVmZmVyCisgKi8KK3ZvaWQgaW5pdF9ncmlkX2N0cmwodm9pZCkKK3sKKwl1bG9uZyBhZHIsIGdyaWRfY3ljbGU7CisJdW5zaWduZWQgaW50IGJpdCwgZGlzcGxheTsKKwl1bnNpZ25lZCBjaGFyIHRlbXAsIGJpdF9ucjsKKworCWZvciAoYWRyPXZmZGJhc2U7IGFkcjw9KHZmZGJhc2UrNzE2OCk7IGFkcis9NCkgLypjbGVhciBmcmFtZSBidWZmZXIgKi8KKwkJKCoodm9sYXRpbGUgdWxvbmcqKShhZHIpKT0wOworCisJZm9yKGRpc3BsYXk9MDtkaXNwbGF5PD0zO2Rpc3BsYXkrKykKKwl7CisJCWZvcihncmlkX2N5Y2xlPTA7Z3JpZF9jeWNsZTw9NTU7Z3JpZF9jeWNsZSsrKQorCQl7CisJCQliaXQgPSBncmlkX2N5Y2xlKjI1Nio0KyhncmlkX2N5Y2xlKzIwMCkqNCtmcmFtZV9idWZfb2ZmcytkaXNwbGF5OworIAkJCS8qIHdyYXAgYXJyb3VuZCBpZiBvZmZzZXQgKHNlZSBtYW51YWwgUzNDMjQwMCkgKi8KKwkJCWlmIChiaXQ+PWZyYW1lX2J1Zl9zaXplKjgpCisJCQkJYml0ID0gYml0LShmcmFtZV9idWZfc2l6ZSo4KTsKKwkJCWFkciA9IHZmZGJhc2UrKGJpdC8zMikqNCsoMy0oYml0JTMyKS84KTsKKwkJCWJpdF9uciA9IGJpdCU4OworCQkJYml0X25yID0gKGJpdF9ucj4zKT9iaXRfbnItNDpiaXRfbnIrNDsKKwkJCXRlbXA9KCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopKGFkcikpOworCQkJdGVtcHw9KDE8PGJpdF9ucik7CisJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikoYWRyKSk9dGVtcDsKKworCQkJaWYoZ3JpZF9jeWNsZTw1NSkKKwkJCQliaXQgPSBncmlkX2N5Y2xlKjI1Nio0KyhncmlkX2N5Y2xlKzIwMSkqNCtmcmFtZV9idWZfb2ZmcytkaXNwbGF5OworCQkJZWxzZQorCQkJCWJpdCA9IGdyaWRfY3ljbGUqMjU2KjQrMjAwKjQrZnJhbWVfYnVmX29mZnMrZGlzcGxheS00OyAJLyogZ3JpZCBuci4gMCAqLworCQkJLyogd3JhcCBhcnJvdW5kIGlmIG9mZnNldCAoc2VlIG1hbnVhbCBTM0MyNDAwKSAqLworCQkJaWYgKGJpdD49ZnJhbWVfYnVmX3NpemUqOCkKKwkJCQliaXQgPSBiaXQtKGZyYW1lX2J1Zl9zaXplKjgpOworCQkJYWRyID0gdmZkYmFzZSsoYml0LzMyKSo0KygzLShiaXQlMzIpLzgpOworCQkJYml0X25yID0gYml0JTg7CisJCQliaXRfbnIgPSAoYml0X25yPjMpP2JpdF9uci00OmJpdF9ucis0OworCQkJdGVtcD0oKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikoYWRyKSk7CisJCQl0ZW1wfD0oMTw8Yml0X25yKTsKKwkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKShhZHIpKT10ZW1wOworCQl9CisJfQorfQorCisvKgorICpjcmVhdGUgdHJhbnNsYXRpb24gdGFibGUgZm9yIGdldHRpbmcgZWFzeSB0aGUgcmlnaHQgcG9zaXRpb24gaW4gdGhlCisgKnBoeXNpY2FsIGZyYW1lYnVmZmVyIGZvciBzb21lIHgveS1jb29yZGluYXRlcyBvZiB0aGUgVkZEcworICovCit2b2lkIGNyZWF0ZV92ZmRfdGFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmZkX3RhYmxlWzExMl1bMThdWzJdWzRdWzJdOworCXVsb25nIGFkcjsKKwl1bnNpZ25lZCBpbnQgeCwgeSwgY29sb3IsIGRpc3BsYXksIGVudHJ5LCBwaXhlbCwgYml0X25yOworCisJLyoKKwkgKiBDcmVhdGUgdHJhbnNsYXRpb24gdGFibGUgZm9yIE5vcml0YWtlLVQxMTlDLVZGRC1zcGVjaWZpYworCSAqIG9yZ2FuaXplZCBmcmFtZS1idWZmZXIuCisJICogQ3JlYXRlZCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBiaXQgaW4gdGhlIGZyYW1lYnVmZmVyICh0aGUKKwkgKiBmaXJzdCB0cmFuc2ZlcnJlZCBwaXhlbCBvZiBlYWNoIGZyYW1lIGlzIGJpdCAwKS4KKwkgKi8KKwlmb3IoeT0wO3k8PTE3O3krKykgICAvKiBaZWlsZSAqLworCXsKKwkJZm9yKHg9MDt4PD0xMTE7eCsrKSAgLyogU3BhbHRlbiAqLworCQl7CisJCQkvKkRpc3BsYXkgMCBibGF1ZSBQaXhlbCBFaW50cmFnIDEgKi8KKwkJCXZmZF90YWJsZVt4XVt5XVswXVswXVswXT0oKHglNCkqNCt5KjE2Kyh4LzQpKjIwNDgpOworCQkJLypEaXNwbGF5IDAgcm90ZSBQaXhlbCBFaW50cmFnIDEgKi8KKwkJCXZmZF90YWJsZVt4XVt5XVsxXVswXVswXT0oKHglNCkqNCt5KjE2Kyh4LzQpKjIwNDgrNTEyKTsKKwkJCWlmKHg8PTEpCisJCQl7CisJCQkJLypEaXNwbGF5IDAgYmxhdWUgUGl4ZWwgRWludHJhZyAyICovCisJCQkJdmZkX3RhYmxlW3hdW3ldWzBdWzBdWzFdPSgoKHgrMTEyKSU0KSo0K3kqMTYrKCh4KzExMCkvNCkqMjA0OCsxMDI0KTsKKwkJCQkvKkRpc3BsYXkgMCByb3RlIFBpeGVsIEVpbnRyYWcgMiAqLworCQkJCXZmZF90YWJsZVt4XVt5XVsxXVswXVsxXT0oKCh4KzExMiklNCkqNCt5KjE2KygoeCsxMTApLzQpKjIwNDgrNTEyKzEwMjQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qRGlzcGxheSAwIGJsYXVlIFBpeGVsIEVpbnRyYWcgMiAqLworCQkJCXZmZF90YWJsZVt4XVt5XVswXVswXVsxXT0oKHglNCkqNCt5KjE2KygoeC0yKS80KSoyMDQ4KzEwMjQpOworCQkJCS8qRGlzcGxheSAwIHJvdGUgUGl4ZWwgRWludHJhZyAyICovCisJCQkJdmZkX3RhYmxlW3hdW3ldWzFdWzBdWzFdPSgoeCU0KSo0K3kqMTYrKCh4LTIpLzQpKjIwNDgrNTEyKzEwMjQpOworCQkJfQorCQkJLypEaXNwbGF5IDEgYmxhdWUgUGl4ZWwgRWludHJhZyAxICovCisJCQl2ZmRfdGFibGVbeF1beV1bMF1bMV1bMF09KCh4JTQpKjQreSoxNisoeC80KSoyMDQ4KzEpOworCQkJLypEaXNwbGF5IDEgcm90ZSBQaXhlbCBFaW50cmFnIDEgKi8KKwkJCXZmZF90YWJsZVt4XVt5XVsxXVsxXVswXT0oKHglNCkqNCt5KjE2Kyh4LzQpKjIwNDgrNTEyKzEpOworCQkJaWYoeDw9MSkKKwkJCXsKKwkJCQkvKkRpc3BsYXkgMSBibGF1ZSBQaXhlbCBFaW50cmFnIDIgKi8KKwkJCQl2ZmRfdGFibGVbeF1beV1bMF1bMV1bMV09KCgoeCsxMTIpJTQpKjQreSoxNisoKHgrMTEwKS80KSoyMDQ4KzErMTAyNCk7CisJCQkJLypEaXNwbGF5IDEgcm90ZSBQaXhlbCBFaW50cmFnIDIgKi8KKwkJCQl2ZmRfdGFibGVbeF1beV1bMV1bMV1bMV09KCgoeCsxMTIpJTQpKjQreSoxNisoKHgrMTEwKS80KSoyMDQ4KzUxMisxKzEwMjQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qRGlzcGxheSAxIGJsYXVlIFBpeGVsIEVpbnRyYWcgMiAqLworCQkJCXZmZF90YWJsZVt4XVt5XVswXVsxXVsxXT0oKHglNCkqNCt5KjE2KygoeC0yKS80KSoyMDQ4KzErMTAyNCk7CisJCQkJLypEaXNwbGF5IDEgcm90ZSBQaXhlbCBFaW50cmFnIDIgKi8KKwkJCQl2ZmRfdGFibGVbeF1beV1bMV1bMV1bMV09KCh4JTQpKjQreSoxNisoKHgtMikvNCkqMjA0OCs1MTIrMSsxMDI0KTsKKwkJCX0KKwkJCS8qRGlzcGxheSAyIGJsYXVlIFBpeGVsIEVpbnRyYWcgMSAqLworCQkJdmZkX3RhYmxlW3hdW3ldWzBdWzJdWzBdPSgoeCU0KSo0K3kqMTYrKHgvNCkqMjA0OCsyKTsKKwkJCS8qRGlzcGxheSAyIHJvdGUgUGl4ZWwgRWludHJhZyAxICovCisJCQl2ZmRfdGFibGVbeF1beV1bMV1bMl1bMF09KCh4JTQpKjQreSoxNisoeC80KSoyMDQ4KzUxMisyKTsKKwkJCWlmKHg8PTEpCisJCQl7CisJCQkJLypEaXNwbGF5IDIgYmxhdWUgUGl4ZWwgRWludHJhZyAyICovCisJCQkJdmZkX3RhYmxlW3hdW3ldWzBdWzJdWzFdPSgoKHgrMTEyKSU0KSo0K3kqMTYrKCh4KzExMCkvNCkqMjA0OCsyKzEwMjQpOworCQkJCS8qRGlzcGxheSAyIHJvdGUgUGl4ZWwgRWludHJhZyAyICovCisJCQkJdmZkX3RhYmxlW3hdW3ldWzFdWzJdWzFdPSgoKHgrMTEyKSU0KSo0K3kqMTYrKCh4KzExMCkvNCkqMjA0OCs1MTIrMisxMDI0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKkRpc3BsYXkgMiBibGF1ZSBQaXhlbCBFaW50cmFnIDIgKi8KKwkJCQl2ZmRfdGFibGVbeF1beV1bMF1bMl1bMV09KCh4JTQpKjQreSoxNisoKHgtMikvNCkqMjA0OCsyKzEwMjQpOworCQkJCS8qRGlzcGxheSAyIHJvdGUgUGl4ZWwgRWludHJhZyAyICovCisJCQkJdmZkX3RhYmxlW3hdW3ldWzFdWzJdWzFdPSgoeCU0KSo0K3kqMTYrKCh4LTIpLzQpKjIwNDgrNTEyKzIrMTAyNCk7CisJCQl9CisJCQkvKkRpc3BsYXkgMyBibGF1ZSBQaXhlbCBFaW50cmFnIDEgKi8KKwkJCXZmZF90YWJsZVt4XVt5XVswXVszXVswXT0oKHglNCkqNCt5KjE2Kyh4LzQpKjIwNDgrMyk7CisJCQkvKkRpc3BsYXkgMyByb3RlIFBpeGVsIEVpbnRyYWcgMSAqLworCQkJdmZkX3RhYmxlW3hdW3ldWzFdWzNdWzBdPSgoeCU0KSo0K3kqMTYrKHgvNCkqMjA0OCs1MTIrMyk7CisJCQlpZih4PD0xKQorCQkJeworCQkJCS8qRGlzcGxheSAzIGJsYXVlIFBpeGVsIEVpbnRyYWcgMiAqLworCQkJCXZmZF90YWJsZVt4XVt5XVswXVszXVsxXT0oKCh4KzExMiklNCkqNCt5KjE2KygoeCsxMTApLzQpKjIwNDgrMysxMDI0KTsKKwkJCQkvKkRpc3BsYXkgMyByb3RlIFBpeGVsIEVpbnRyYWcgMiAqLworCQkJCXZmZF90YWJsZVt4XVt5XVsxXVszXVsxXT0oKCh4KzExMiklNCkqNCt5KjE2KygoeCsxMTApLzQpKjIwNDgrNTEyKzMrMTAyNCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLypEaXNwbGF5IDMgYmxhdWUgUGl4ZWwgRWludHJhZyAyICovCisJCQkJdmZkX3RhYmxlW3hdW3ldWzBdWzNdWzFdPSgoeCU0KSo0K3kqMTYrKCh4LTIpLzQpKjIwNDgrMysxMDI0KTsKKwkJCQkvKkRpc3BsYXkgMyByb3RlIFBpeGVsIEVpbnRyYWcgMiAqLworCQkJCXZmZF90YWJsZVt4XVt5XVsxXVszXVsxXT0oKHglNCkqNCt5KjE2KygoeC0yKS80KSoyMDQ4KzUxMiszKzEwMjQpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBDcmVhdGUgdHJhbnNsYXRpb24gdGFibGUgZm9yIE5vcml0YWtlLVQxMTlDLVZGRC1zcGVjaWZpYworCSAqIG9yZ2FuaXplZCBmcmFtZS1idWZmZXIKKwkgKiBDcmVhdGUgdGFibGUgd2l0aCBlbnRyaWVzIGZvciBwaHlzaWNhbCBieXRlIGFkcmVzc2VzIGFuZAorCSAqIGJpdC1udW1iZXIgd2l0aGluIHRoZSBieXRlCisJICogZnJvbSB0YWJsZSB3aXRoIGJpdC1udW1iZXJzIHdpdGhpbiB0aGUgdG90YWwgZnJhbWVidWZmZXIKKwkgKi8KKwlmb3IoeT0wO3k8PTE3O3krKykKKwl7CisJCWZvcih4PTA7eDw9MTExO3grKykKKwkJeworCQkJZm9yKGNvbG9yPTA7Y29sb3I8PTE7Y29sb3IrKykKKwkJCXsKKwkJCQlmb3IoZGlzcGxheT0wO2Rpc3BsYXk8PTM7ZGlzcGxheSsrKQorCQkJCXsKKwkJCQkJZm9yKGVudHJ5PTA7ZW50cnk8PTE7ZW50cnkrKykKKwkJCQkJeworCQkJCQkJcGl4ZWwgID0gdmZkX3RhYmxlW3hdW3ldW2NvbG9yXVtkaXNwbGF5XVtlbnRyeV0gKyBmcmFtZV9idWZfb2ZmczsKKwkJCQkJCSAvKgorCQkJCQkJICAqIHdyYXAgYXJyb3VuZCBpZiBvZmZzZXQKKwkJCQkJCSAgKiAoc2VlIG1hbnVhbCBTM0MyNDAwKQorCQkJCQkJICAqLworCQkJCQkJaWYgKHBpeGVsPj1mcmFtZV9idWZfc2l6ZSo4KQorCQkJCQkJCXBpeGVsID0gcGl4ZWwtKGZyYW1lX2J1Zl9zaXplKjgpOworCQkJCQkJYWRyICAgID0gdmZkYmFzZSsocGl4ZWwvMzIpKjQrKDMtKHBpeGVsJTMyKS84KTsKKwkJCQkJCWJpdF9uciA9IHBpeGVsJTg7CisJCQkJCQliaXRfbnIgPSAoYml0X25yPjMpP2JpdF9uci00OmJpdF9ucis0OworCQkJCQkJYWRyX3ZmZF90YWJsZVt4XVt5XVtjb2xvcl1bZGlzcGxheV1bZW50cnldID0gYWRyOworCQkJCQkJYml0X3ZmZF90YWJsZVt4XVt5XVtjb2xvcl1bZGlzcGxheV1bZW50cnldID0gYml0X25yOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisvKgorICogU2V0L2NsZWFyIHBpeGVsIG9mIHRoZSBWRkRzCisgKi8KK3ZvaWQgc2V0X3ZmZF9waXhlbCh1bnNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIGNoYXIgeSwgdW5zaWduZWQgY2hhciBjb2xvciwgdW5zaWduZWQgY2hhciBkaXNwbGF5LCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCXVsb25nIGFkcjsKKwl1bnNpZ25lZCBjaGFyIGJpdF9uciwgdGVtcDsKKworCWlmICh2YWx1ZSE9MCkKKwl7CisJCS8qIFBpeGVsLUVpbnRyYWcgTnIuIDEgKi8KKwkJYWRyID0gYWRyX3ZmZF90YWJsZVt4XVt5XVtjb2xvcl1bZGlzcGxheV1bMF07CisJCS8qIFBpeGVsLUVpbnRyYWcgTnIuIDEgKi8KKwkJYml0X25yID0gYml0X3ZmZF90YWJsZVt4XVt5XVtjb2xvcl1bZGlzcGxheV1bMF07CisJCXRlbXA9KCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopKGFkcikpOworCQl0ZW1wfD0xPDxiaXRfbnI7CisJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKShhZHIpKT10ZW1wOworCisJCS8qIFBpeGVsLUVpbnRyYWcgTnIuIDIgKi8KKwkJYWRyID0gYWRyX3ZmZF90YWJsZVt4XVt5XVtjb2xvcl1bZGlzcGxheV1bMV07CisJCS8qIFBpeGVsLUVpbnRyYWcgTnIuIDIgKi8KKwkJYml0X25yID0gYml0X3ZmZF90YWJsZVt4XVt5XVtjb2xvcl1bZGlzcGxheV1bMV07CisJCXRlbXA9KCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopKGFkcikpOworCQl0ZW1wfD0xPDxiaXRfbnI7CisJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKShhZHIpKT10ZW1wOworCX0KKwllbHNlCisJeworCQkvKiBQaXhlbC1FaW50cmFnIE5yLiAxICovCisJCWFkciA9IGFkcl92ZmRfdGFibGVbeF1beV1bY29sb3JdW2Rpc3BsYXldWzBdOworCQkvKiBQaXhlbC1FaW50cmFnIE5yLiAxICovCisJCWJpdF9uciA9IGJpdF92ZmRfdGFibGVbeF1beV1bY29sb3JdW2Rpc3BsYXldWzBdOworCQl0ZW1wPSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKShhZHIpKTsKKwkJdGVtcCY9figxPDxiaXRfbnIpOworCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikoYWRyKSk9dGVtcDsKKworCQkvKiBQaXhlbC1FaW50cmFnIE5yLiAyICovCisJCWFkciA9IGFkcl92ZmRfdGFibGVbeF1beV1bY29sb3JdW2Rpc3BsYXldWzFdOworCQkvKiBQaXhlbC1FaW50cmFnIE5yLiAyICovCisJCWJpdF9uciA9IGJpdF92ZmRfdGFibGVbeF1beV1bY29sb3JdW2Rpc3BsYXldWzFdOworCQl0ZW1wPSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKShhZHIpKTsKKwkJdGVtcCY9figxPDxiaXRfbnIpOworCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikoYWRyKSk9dGVtcDsKKwl9Cit9CisKKy8qCisgKiB0cmFuc2ZlciBpbWFnZSBmcm9tIEJNUC1GaWxlCisgKi8KK3ZvaWQgdHJhbnNmZXJfcGljKGludCBkaXNwbGF5LCB1bnNpZ25lZCBjaGFyICphZHIsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKwlpbnQgeCwgeTsKKwl1bnNpZ25lZCBjaGFyIHRlbXA7CisKKwlmb3IgKDsgaGVpZ2h0ID4gMDsgaGVpZ2h0IC09IDE4KQorCXsKKwkJaWYgKGhlaWdodCA+IDE4KQorCQkJeSA9IDE4OworCQllbHNlCisJCQl5ID0gaGVpZ2h0OworCQlmb3IgKDsgeSA+IDA7IHktLSkKKwkJeworCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpCisJCQl7CisJCQkJdGVtcCA9ICphZHIrKzsKKwkJCQlzZXRfdmZkX3BpeGVsKHgsIHktMSwgMCwgZGlzcGxheSwgMCk7CisJCQkJc2V0X3ZmZF9waXhlbCh4LCB5LTEsIDEsIGRpc3BsYXksIDApOworCQkJCWlmICgodGVtcCA+PiA0KSA9PSBCTEFVKQorCQkJCQlzZXRfdmZkX3BpeGVsKHgsIHktMSwgMCwgZGlzcGxheSwgMSk7CisJCQkJZWxzZSBpZiAoKHRlbXAgPj4gNCkgPT0gUk9UKQorCQkJCQlzZXRfdmZkX3BpeGVsKHgsIHktMSwgMSwgZGlzcGxheSwgMSk7CisJCQkJZWxzZSBpZiAoKHRlbXAgPj4gNCkgPT0gVklPTEVUVCkKKwkJCQl7CisJCQkJCXNldF92ZmRfcGl4ZWwoeCwgeS0xLCAwLCBkaXNwbGF5LCAxKTsKKwkJCQkJc2V0X3ZmZF9waXhlbCh4LCB5LTEsIDEsIGRpc3BsYXksIDEpOworCQkJCX0KKwkJCQlzZXRfdmZkX3BpeGVsKHgrMSwgeS0xLCAwLCBkaXNwbGF5LCAwKTsKKwkJCQlzZXRfdmZkX3BpeGVsKHgrMSwgeS0xLCAxLCBkaXNwbGF5LCAwKTsKKwkJCQlpZiAoKHRlbXAgJiAweDBGKSA9PSBCTEFVKQorCQkJCQlzZXRfdmZkX3BpeGVsKHgrMSwgeS0xLCAwLCBkaXNwbGF5LCAxKTsKKwkJCQllbHNlIGlmICgodGVtcCAmIDB4MEYpID09IFJPVCkKKwkJCQkJc2V0X3ZmZF9waXhlbCh4KzEsIHktMSwgMSwgZGlzcGxheSwgMSk7CisJCQkJZWxzZSBpZiAoKHRlbXAgJiAweDBGKSA9PSBWSU9MRVRUKQorCQkJCXsKKwkJCQkJc2V0X3ZmZF9waXhlbCh4KzEsIHktMSwgMCwgZGlzcGxheSwgMSk7CisJCQkJCXNldF92ZmRfcGl4ZWwoeCsxLCB5LTEsIDEsIGRpc3BsYXksIDEpOworCQkJCX0KKwkJCX0KKwkJfQorCQlkaXNwbGF5Kys7CisJCWlmIChkaXNwbGF5ID4gMykKKwkJCWRpc3BsYXkgPSAwOworCX0KK30KKworLyoKKyAqIGluaXRpYWxpemUgTENELUNvbnRyb2xsZXIgb2YgdGhlIFMzQzI0MDAgZm9yIHVzaW5nIFZGRHMKKyAqLworaW50IGRydl92ZmRfaW5pdCh2b2lkKQoreworCXVsb25nIHBhbGV0dGU7CisKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCXZmZGJhc2UgPSBnZC0+ZmJfYmFzZTsKKwljcmVhdGVfdmZkX3RhYmxlKCk7CisJaW5pdF9ncmlkX2N0cmwoKTsKKworCS8qCisJICogSGlud2VpczogRGVyIEZyYW1lYnVmZmVyIGlzdCB1bSBnZW5hdSBlaW4gTmliYmxlIHZlcnNjaG9iZW4KKwkgKiBEYXMgZXJzdGUgYW5nZXplaWd0ZSBQaXhlbCB3aXJkIGF1cyBkZW0gendlaXRlbiBOaWJibGUgZ2Vob2x0CisJICogZGFzIGxldHp0ZSBhbmdlemVpZ3RlIFBpeGVsIHdpcmQgYXVzIGRlbSBlcnN0ZW4gTmliYmxlIGdlaG9sdAorCSAqICh3cmFwIGFyb3VuZCkKKwkgKiBzZWUgbWFudWFsIFMzQzI0MDAKKwkgKi8KKwkvKiBmcmFtZSBidWZmZXIgc3RhcnRhZHIgKi8KKwlyTENEU0FERFIxID0gdmZkYmFzZSA+PiAxOworIAkvKiBmcmFtZSBidWZmZXIgZW5kYWRyICovCisJckxDRFNBRERSMiA9ICh2ZmRiYXNlICsgZnJhbWVfYnVmX3NpemUpID4+IDE7CisJckxDRFNBRERSMyA9ICgoMjU2LzQpKTsKKworCS8qIFBvcnQtUGlucyBhbHMgTENELUF1c2dhbmcgKi8KKwlyUENDT04gPSAgIChyUENDT04gJiAweEZGRkZGRjAwKXwgMHgwMDAwMDBBQTsKKwkvKiBQb3J0LVBpbnMgYWxzIExDRC1BdXNnYW5nICovCisJclBEQ09OID0gICAoclBEQ09OICYgMHhGRkZGRkYwMyl8IDB4MDAwMDAwQTg7CisjaWZkZWYgV0lUSF9WRlJBTUUKKwkvKiBtaXQgVkZSQU1FIHp1bSBNZXNzZW4gKi8KKwlyUERDT04gPSAgIChyUERDT04gJiAweEZGRkZGRjAwKXwgMHgwMDAwMDBBQTsKKyNlbmRpZgorCisJckxDRENPTjIgPSAweDAwMERDMDAwOworCXJMQ0RDT04zID0gMHgwMDUxMDAwQTsKKwlyTENEQ09ONCA9IDB4MDAwMDAwMDE7CisJckxDRENPTjUgPSAweDAwMDAwNDQwOworCXJMQ0RDT04xID0gMHgwMDAwMEI3NTsKKworCWRlYnVnICgiTENEU0FERFIxOiAlbFhcbiIsIHJMQ0RTQUREUjEpOworCWRlYnVnICgiTENEU0FERFIyOiAlbFhcbiIsIHJMQ0RTQUREUjIpOworCWRlYnVnICgiTENEU0FERFIzOiAlbFhcbiIsIHJMQ0RTQUREUjMpOworCisJZm9yKHBhbGV0dGU9MDtwYWxldHRlPD0xNTtwYWxldHRlKyspCisJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCopKFBBTEVUVEUrKHBhbGV0dGUqNCkpKT1wYWxldHRlOworCWZvcihwYWxldHRlPTE2O3BhbGV0dGU8PTI1NTtwYWxldHRlKyspCisJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCopKFBBTEVUVEUrKHBhbGV0dGUqNCkpKT0weDAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBST00gY2FwYWJsZSBpbml0aWFsaXphdGlvbiBwYXJ0IC0gbmVlZGVkIHRvIHJlc2VydmUgRkIgbWVtb3J5CSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBpcyBjYWxsZWQgZWFybHkgaW4gdGhlIHN5c3RlbSBpbml0aWFsaXphdGlvbiB0byBncmFiIG1lbW9yeQorICogZm9yIHRoZSBWRkQgY29udHJvbGxlci4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBpcyBydW5uaW5nIGZyb20gUk9NLCBzbyBubyB3cml0ZSBhY2Nlc3MgdG8gZ2xvYmFsIGRhdGEuCisgKi8KK3Vsb25nIHZmZF9zZXRtZW0gKHVsb25nIGFkZHIpCit7CisJdWxvbmcgc2l6ZTsKKworCS8qIE1BR0lDICovCisJZnJhbWVfYnVmX3NpemUgPSAoMjU2KjQqNTYpLzg7CisKKwkvKiBSb3VuZCB1cCB0byBuZWFyZXN0IGZ1bGwgcGFnZSAqLworCXNpemUgPSAoZnJhbWVfYnVmX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgfihQQUdFX1NJWkUgLSAxKTsKKworCWRlYnVnICgiUmVzZXJ2aW5nICVsZGsgZm9yIFZGRCBGcmFtZWJ1ZmZlciBhdDogJTA4bHhcbiIsIHNpemU+PjEwLCBhZGRyKTsKKworCXJldHVybiAoc2l6ZSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfVkZEICovCmRpZmYgLS1naXQgYS9ib2FyZC91dHg4MjQ1L3V0eDgyNDUuYyBiL2JvYXJkL3V0eDgyNDUvdXR4ODI0NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTg2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC91dHg4MjQ1L3V0eDgyNDUuYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogUm9iIFRheWxvciwgRmx5aW5nIFBpZyBTeXN0ZW1zLiByb2J0QGZseWluZ3BpZy5jb20uCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHcmVnb3J5IEUuIEFsbGVuLCBnYWxsZW5AYXJsdXQudXRleGFzLmVkdQorICogTWF0dGhldyBFLiBLYXJnZXIsIGthcmdlckBhcmx1dC51dGV4YXMuZWR1CisgKiBBcHBsaWVkIFJlc2VhcmNoIExhYm9yYXRvcmllcywgVGhlIFVuaXZlcnNpdHkgb2YgVGV4YXMgYXQgQXVzdGluCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzgyNHguaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8cGNpLmg+CisKKyNkZWZpbmUJU0FWRV9TWgkzMgorCisKK2ludCBjaGVja2JvYXJkKHZvaWQpCit7CisJdWxvbmcgYnVzZnJlcSAgPSBnZXRfYnVzX2ZyZXEoMCk7CisJY2hhciAgYnVmWzMyXTsKKworCXByaW50ZigiQm9hcmQ6IFVUWDgyNDUgTG9jYWwgQnVzIGF0ICVzIE1IelxuIiwgc3RybWh6KGJ1ZiwgYnVzZnJlcSkpOworCXJldHVybiAwOworfQorCisKK2xvbmcgaW50IGluaXRkcmFtKGludCBib2FyZF90eXBlKQoreworI2lmIDEKKwlpbnQJCQkJaSwgY250OworCXZvbGF0aWxlIHVjaGFyCSpiYXNlID0JQ0ZHX1NEUkFNX0JBU0U7CisJdm9sYXRpbGUgdWxvbmcJKmFkZHI7CisJdWxvbmcJCQlzYXZlW1NBVkVfU1pdOworCXVsb25nCQkJdmFsLCByZXQgID0gMDsKKworCWZvciAoaT0wOyBpPFNBVkVfU1o7IGkrKykJe3NhdmVbaV0gPSAwO30JCS8qIGNsZWFyIHRhYmxlICovCisKKwlmb3IgKGk9MCwgY250PShDRkdfTUFYX1JBTV9TSVpFIC8gc2l6ZW9mKGxvbmcpKSA+PiAxOyBjbnQgPiAwOyBjbnQgPj49IDEpCisJeworCQlhZGRyID0gKHZvbGF0aWxlIHVsb25nICopYmFzZSArIGNudDsKKwkJc2F2ZVtpKytdID0gKmFkZHI7CisJCSphZGRyID0gfmNudDsKKwl9CisKKwlhZGRyID0gKHZvbGF0aWxlIHVsb25nICopYmFzZTsKKwlzYXZlW2ldID0gKmFkZHI7CisJKmFkZHIgPSAwOworCisJaWYgKCphZGRyICE9IDApCisJeworCQkqYWRkciA9IHNhdmVbaV07CisJCWdvdG8gRG9uZTsKKwl9CisKKwlmb3IgKGNudCA9IDE7IGNudCA8IENGR19NQVhfUkFNX1NJWkUgLyBzaXplb2YobG9uZyk7IGNudCA8PD0gMSkKKwl7CisJCWFkZHIgPSAodm9sYXRpbGUgdWxvbmcgKiliYXNlICsgY250OworCQl2YWwgPSAqYWRkcjsKKwkJKmFkZHIgPSBzYXZlWy0taV07CisJCWlmICh2YWwgIT0gfmNudCkKKwkJeworCQkJdWxvbmcgbmV3X2JhbmswX2VuZCA9IGNudCAqIHNpemVvZihsb25nKSAtIDE7CisJCQl1bG9uZyBtZWFyMSAgPSBtcGM4MjR4X21wYzEwN19nZXRyZWcoTUVBUjEpOworCQkJdWxvbmcgZW1lYXIxID0gbXBjODI0eF9tcGMxMDdfZ2V0cmVnKEVNRUFSMSk7CisJCQltZWFyMSA9ICAobWVhcjEgICYgMHhGRkZGRkYwMCkgfAorCQkJICAoKG5ld19iYW5rMF9lbmQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKTsKKwkJCWVtZWFyMSA9IChlbWVhcjEgJiAweEZGRkZGRjAwKSB8CisJCQkgICgobmV3X2JhbmswX2VuZCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0VBRERSX1NISUZUKTsKKwkJCW1wYzgyNHhfbXBjMTA3X3NldHJlZyhNRUFSMSwgIG1lYXIxKTsKKwkJCW1wYzgyNHhfbXBjMTA3X3NldHJlZyhFTUVBUjEsIGVtZWFyMSk7CisKKwkJCXJldCA9IGNudCAqIHNpemVvZihsb25nKTsKKwkJCWdvdG8gRG9uZTsKKwkJfQorCX0KKworCXJldCA9IENGR19NQVhfUkFNX1NJWkU7CitEb25lOgorCXJldHVybiByZXQ7CisjZWxzZQorCXJldHVybiAoQ0ZHX01BWF9SQU1fU0laRSk7CisjZW5kaWYKKworfQorCisKKy8qCisgKiBJbml0aWFsaXplIFBDSSBEZXZpY2VzLCByZXBvcnQgZGV2aWNlcyBmb3VuZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHBjaV9jb25maWdfdGFibGUgcGNpX3V0eDgyNDVfY29uZmlnX3RhYmxlW10gPSB7CisjaWZuZGVmIENPTkZJR19QQ0lfUE5QCisJeyBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSAgcGNpX2NmZ2Z1bmNfY29uZmlnX2RldmljZSwgeyBQQ0lfRU5FVDBfSU9BRERSLAorCQkJCSAgICAgICBQQ0lfRU5FVDBfTUVNQUREUiwKKwkJCQkgICAgICAgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSIH19LAorCXsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgIHBjaV9jZmdmdW5jX2NvbmZpZ19kZXZpY2UsIHsgUENJX0ZJUkVXSVJFX0lPQUREUiwKKwkJCQkgICAgICAgUENJX0ZJUkVXSVJFX01FTUFERFIsCisJCQkJICAgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUiB9fSwKKyNlbmRpZiAvKkNPTkZJR19QQ0lfUE5QKi8KKwl7IH0KK307CisKKworc3RhdGljIHZvaWQgcGNpX3V0eDgyNDVfZml4dXBfaXJxKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldikKK3sKKwlpZiAoUENJX0RFVihkZXYpID09IDExKQorCQkvKiBhc3NpZ24gc2VyaWFsIGludGVycnVwdCBsaW5lIDkgKGludDI1KSB0byBGaXJlV2lyZSAqLworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgMjUpOworCisJZWxzZSBpZiAoUENJX0RFVihkZXYpID09IDEyKQorCQkvKiBhc3NpZ24gc2VyaWFsIGludGVycnVwdCBsaW5lIDggKGludDI0KSB0byBFdGhlcm5ldCAqLworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgMjQpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHV0eDgyNDVfaG9zZSA9IHsKKyNpZm5kZWYgQ09ORklHX1BDSV9QTlAKKwljb25maWdfdGFibGU6IHBjaV91dHg4MjQ1X2NvbmZpZ190YWJsZSwKKwlmaXh1cF9pcnE6IHBjaV91dHg4MjQ1X2ZpeHVwX2lycSwKKwl3cml0ZV9ieXRlOiBwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZQorI2VuZGlmIC8qQ09ORklHX1BDSV9QTlAqLworfTsKKwordm9pZCBwY2lfaW5pdCAodm9pZCkKK3sKKwlwY2lfbXBjODI0eF9pbml0KCZ1dHg4MjQ1X2hvc2UpOworCisJaWNhY2hlX2VuYWJsZSgpOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC93N28vZmxhc2guYyBiL2JvYXJkL3c3by9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDg0NzYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC93N28vZmxhc2guYwpAQCAtMCwwICsxLDk0MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogRXJpayBUaGVpc2VuLCBXYXZlIDcgT3B0aWNzLCBldGhlaXNlbkBtaW5kc3ByaW5nLmNvbS4KKyAqICBCYXNlZCBvbiBjb2RlIGJ5OgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKworZmxhc2hfaW5mb190ICAgIGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107IC8qIGluZm8gZm9yIEZMQVNIIGNoaXBzICAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9ucworICovCitzdGF0aWMgdWxvbmcgZmxhc2hfZ2V0X3NpemUgKHZ1X2xvbmcgKmFkZHIsIGZsYXNoX2luZm9fdCAqaW5mbyk7CitzdGF0aWMgaW50IHdyaXRlX3dvcmQ4KGZsYXNoX2luZm9fdCAqaW5mbywgdWxvbmcgZGVzdCwgdWxvbmcgZGF0YSk7CitzdGF0aWMgaW50IHdyaXRlX3dvcmQzMiAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGZsYXNoX2dldF9vZmZzZXRzICh1bG9uZyBiYXNlLCBmbGFzaF9pbmZvX3QgKmluZm8pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKwordW5zaWduZWQgbG9uZyBmbGFzaF9pbml0ICh2b2lkKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZV9iMCwgYmFzZV9iMDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemVfYjEsIGJhc2VfYjE7CisKKyAgICAvKiBJbml0OiBubyBGTEFTSGVzIGtub3duICovCisgICAgZm9yIChpID0gMDsgaSA8IENGR19NQVhfRkxBU0hfQkFOS1M7ICsraSkgeworICAgICAgICBmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKyAgICB9CisKKyAgICAvKiBHZXQgU2l6ZSBvZiBCb290IGFuZCBNYWluIEZsYXNoZXMgKi8KKyAgICBzaXplX2IwID0gZmxhc2hfZ2V0X3NpemUoKHZ1X2xvbmcgKilGTEFTSF9CQVNFMF9QUkVMSU0sICZmbGFzaF9pbmZvWzBdKTsKKyAgICBpZiAoZmxhc2hfaW5mb1swXS5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisgICAgICAgIHByaW50ZiAoIiMjIFVua25vd24gRkxBU0ggb24gQmFuayAwIC0gU2l6ZSA9IDB4JTA4bHggPSAlbGQgTUJcbiIsCisgICAgICAgICAgICBzaXplX2IwLCBzaXplX2IwPDwyMCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaXplX2IxID0gZmxhc2hfZ2V0X3NpemUoKHZ1X2xvbmcgKilGTEFTSF9CQVNFMV9QUkVMSU0sICZmbGFzaF9pbmZvWzFdKTsKKyAgICBpZiAoZmxhc2hfaW5mb1sxXS5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisgICAgICAgIHByaW50ZiAoIiMjIFVua25vd24gRkxBU0ggb24gQmFuayAxIC0gU2l6ZSA9IDB4JTA4bHggPSAlbGQgTUJcbiIsCisgICAgICAgICAgICBzaXplX2IxLCBzaXplX2IxPDwyMCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBiYXNlIGFkZHJlc3NlcyAqLworICAgIGJhc2VfYjAgPSAtc2l6ZV9iMDsKKyAgICBiYXNlX2IxID0gLXNpemVfYjE7CisKKyAgICAvKiBTZXR1cCBvZmZzZXRzIGZvciBCb290IEZsYXNoICovCisgICAgZmxhc2hfZ2V0X29mZnNldHMgKGJhc2VfYjAsICZmbGFzaF9pbmZvWzBdKTsKKworICAgIC8qIFByb3RlY3QgYm9hcmQgbGV2ZWwgZGF0YSAqLworICAgICh2b2lkKWZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwKKwkJCWJhc2VfYjAsCisJCQlmbGFzaF9pbmZvWzBdLnN0YXJ0WzFdIC0gMSwKKwkJCSZmbGFzaF9pbmZvWzBdKTsKKworCisgICAgLyogTW9uaXRvciBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KKyAgICAodm9pZClmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2IwICsgc2l6ZV9iMCAtIENGR19NT05JVE9SX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfYjAgKyBzaXplX2IwIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmbGFzaF9pbmZvWzBdKTsKKworICAgIC8qIFByb3RlY3QgdGhlIEZQR0EgaW1hZ2UgKi8KKyAgICAodm9pZClmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9CQVNFMV9QUkVMSU0sCisgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9CQVNFMV9QUkVMSU0gKyBDRkdfRlBHQV9JTUFHRV9MRU4gLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXNoX2luZm9bMV0pOworCisgICAgLyogUHJvdGVjdCB0aGUgZGVmYXVsdCBib290IGltYWdlICovCisgICAgKHZvaWQpZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfQkFTRTFfUFJFTElNICsgQ0ZHX0ZQR0FfSU1BR0VfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfQkFTRTFfUFJFTElNICsgQ0ZHX0ZQR0FfSU1BR0VfTEVOICsgMHg2MDAwMDAgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXNoX2luZm9bMV0pOworCisgICAgLyogU2V0dXAgb2Zmc2V0cyBmb3IgTWFpbiBGbGFzaCAqLworICAgIGZsYXNoX2dldF9vZmZzZXRzIChGTEFTSF9CQVNFMV9QUkVMSU0sICZmbGFzaF9pbmZvWzFdKTsKKworICAgIHJldHVybiAoc2l6ZV9iMCArIHNpemVfYjEpOworfSAvKiBlbmQgZmxhc2hfaW5pdCgpICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgZmxhc2hfZ2V0X29mZnNldHMgKHVsb25nIGJhc2UsIGZsYXNoX2luZm9fdCAqaW5mbykKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIHNldCB1cCBzZWN0b3Igc3RhcnQgYWRkcmVzcyB0YWJsZSAtIEZPUiBCT09UIFJPTSBPTkxZISEhICovCisgICAgaWYgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSAgPT0gRkxBU0hfQU0wNDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKQorICAgICAgICAgICAgaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgKGkgKiAweDAwMDEwMDAwKTsKKyAgICB9Cit9IC8qIGVuZCBmbGFzaF9nZXRfb2Zmc2V0cygpICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBmbGFzaF9wcmludF9pbmZvICAoZmxhc2hfaW5mb190ICppbmZvKQoreworICAgIGludCBpOworICAgIGludCBrOworICAgIGludCBzaXplOworICAgIGludCBlcmFzZWQ7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqZmxhc2g7CisKKyAgICBpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworICAgICAgICBwcmludGYgKCJtaXNzaW5nIG9yIHVua25vd24gRkxBU0ggdHlwZVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spIHsKKyAgICAgICAgY2FzZSBGTEFTSF9NQU5fQU1EOiAgICAgcHJpbnRmICgiMSB4IEFNRCAiKTsgICAgYnJlYWs7CisJY2FzZSBGTEFTSF9NQU5fU1RNOglwcmludGYgKCIxIHggU1RNICIpOwlicmVhazsKKyAgICAgICAgY2FzZSBGTEFTSF9NQU5fSU5URUw6ICAgcHJpbnRmICgiMiB4IEludGVsICIpOyAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHByaW50ZiAoIlVua25vd24gVmVuZG9yICIpOworICAgIH0KKworICAgIHN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworICAgICAgICBjYXNlIEZMQVNIX0FNMDQwOgorCSAgICBpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spID09IEZMQVNIX01BTl9BTUQpCisgICAgICAgICAgICAJcHJpbnRmICgiQU0yOUxWMDQwICg0MDk2IEtiaXQsIHVuaWZvcm0gc2VjdG9yIHNpemUpXG4iKTsKKwkgICAgZWxzZSBpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spID09IEZMQVNIX01BTl9TVE0pCisgICAgICAgICAgICAJcHJpbnRmICgiTTI5VzA0MEIgKDQwOTYgS2JpdCwgdW5pZm9ybSBibG9jayBzaXplKVxuIik7CisJICAgIGVsc2UKKyAgICAgICAgICAgIAlwcmludGYgKCJVTktOT1dOIDI5eDA0MHggKDQwOTYgS2JpdCwgdW5pZm9ybSBzZWN0b3Igc2l6ZSlcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkxBU0hfMjhGMzIwSjNBOgorICAgICAgICAgICAgcHJpbnRmICgiMjhGMzIwSjNBICgzMiBNYml0ID0gMTI4SyB4IDMyKVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGTEFTSF8yOEY2NDBKM0E6CisgICAgICAgICAgICBwcmludGYgKCIyOEY2NDBKM0EgKDY0IE1iaXQgPSAxMjhLIHggNjQpXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZMQVNIXzI4RjEyOEozQToKKyAgICAgICAgICAgIHByaW50ZiAoIjI4RjEyOEozQSAoMTI4IE1iaXQgPSAxMjhLIHggMTI4KVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZiAoIlVua25vd24gQ2hpcCBUeXBlXG4iKTsKKyAgICB9CisKKyAgICBpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spID09IEZMQVNIX01BTl9TVE0pIHsKKyAgICAJcHJpbnRmICgiICBTaXplOiAlbGQgS0IgaW4gJWQgQmxvY2tzXG4iLAorICAgICAgICAJaW5mby0+c2l6ZSA+PiAxMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKyAgICB9IGVsc2UgeworICAgIAlwcmludGYgKCIgIFNpemU6ICVsZCBLQiBpbiAlZCBTZWN0b3JzXG4iLAorICAgICAgICAJaW5mby0+c2l6ZSA+PiAxMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKyAgICB9CisKKyAgICBwcmludGYgKCIgIFNlY3RvciBTdGFydCBBZGRyZXNzZXM6Iik7CisgICAgZm9yIChpPTA7IGk8aW5mby0+c2VjdG9yX2NvdW50OyArK2kpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgaWYgd2hvbGUgc2VjdG9yIGlzIGVyYXNlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGkgIT0gKGluZm8tPnNlY3Rvcl9jb3VudC0xKSkKKyAgICAgICAgICAgIHNpemUgPSBpbmZvLT5zdGFydFtpKzFdIC0gaW5mby0+c3RhcnRbaV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNpemUgPSBpbmZvLT5zdGFydFswXSArIGluZm8tPnNpemUgLSBpbmZvLT5zdGFydFtpXTsKKyAgICAgICAgZXJhc2VkID0gMTsKKyAgICAgICAgZmxhc2ggPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWluZm8tPnN0YXJ0W2ldOworICAgICAgICBzaXplID0gc2l6ZSA+PiAyOyAgICAgICAgLyogZGl2aWRlIGJ5IDQgZm9yIGxvbmd3b3JkIGFjY2VzcyAqLworICAgICAgICBmb3IgKGs9MDsgazxzaXplOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqZmxhc2grKyAhPSAweGZmZmZmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyYXNlZCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGkgJSA1KSA9PSAwKQorICAgICAgICAgICAgcHJpbnRmICgiXG4gICAiKTsKKyAgICAgICAgcHJpbnRmICgiICUwOGxYJXMlcyIsCisgICAgICAgICAgICBpbmZvLT5zdGFydFtpXSwKKyAgICAgICAgICAgIGVyYXNlZCA/ICIgRSIgOiAiICAiLAorICAgICAgICAgICAgaW5mby0+cHJvdGVjdFtpXSA/ICJSTyAiIDogIiAgICIKKyAgICAgICAgKTsKKyAgICB9CisgICAgcHJpbnRmICgiXG4iKTsKK30gLyogZW5kIGZsYXNoX3ByaW50X2luZm8oKSAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGNhbm5vdCBiZSBydW4gZnJvbSBGTEFTSCEKKyAqLworc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplICh2dV9sb25nICphZGRyLCBmbGFzaF9pbmZvX3QgKmluZm8pCit7CisgICAgc2hvcnQgaTsKKyAgICB1bG9uZyBiYXNlID0gKHVsb25nKWFkZHI7CisKKyAgICAvKiBTZXR1cCBkZWZhdWx0IHR5cGUgKi8KKyAgICBpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisgICAgaW5mby0+c2VjdG9yX2NvdW50ID0wOworICAgIGluZm8tPnNpemUgPSAwOworCisgICAgLyogVGVzdCBmb3IgQm9vdCBGbGFzaCAqLworICAgIGlmIChiYXNlID09IEZMQVNIX0JBU0UwX1BSRUxJTSkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOworICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICogYWRkcjIgPSAodW5zaWduZWQgY2hhciAqKWFkZHI7CisKKyAgICAgICAgLyogV3JpdGUgYXV0byBzZWxlY3QgY29tbWFuZDogcmVhZCBNYW51ZmFjdHVyZXIgSUQgKi8KKyAgICAgICAgKihhZGRyMiArIDB4NTU1KSA9IDB4YWE7CisgICAgICAgICooYWRkcjIgKyAweDJhYSkgPSAweDU1OworICAgICAgICAqKGFkZHIyICsgMHg1NTUpID0gMHg5MDsKKworICAgICAgICAvKiBNYW51ZmFjdHVyZSBJRCAqLworICAgICAgICB2YWx1ZSA9ICphZGRyMjsKKyAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgY2FzZSAodW5zaWduZWQgY2hhcilBTURfTUFOVUZBQ1Q6CisgICAgICAgICAgICAgICAgaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fQU1EOworICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICBjYXNlICh1bnNpZ25lZCBjaGFyKVNUTV9NQU5VRkFDVDoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fU1RNOworCQlicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmFkZHIyID0gMHhmMDsgICAgICAgICAgICAgIC8qIG5vIG9yIHVua25vd24gZmxhc2ggICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBEZXZpY2UgSUQgKi8KKyAgICAgICAgdmFsdWUgPSAqKGFkZHIyICsgMSk7CisgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgIGNhc2UgKHVuc2lnbmVkIGNoYXIpQU1EX0lEX0xWMDQwQjoKKwkgICAgY2FzZSAodW5zaWduZWQgY2hhcilTVE1fSURfMjlXMDQwQjoKKyAgICAgICAgICAgICAgICBpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTA0MDsKKyAgICAgICAgICAgICAgICBpbmZvLT5zZWN0b3JfY291bnQgPSA4OworICAgICAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDAwMDgwMDAwOworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgLyogPT4gNTEyS2IgKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmFkZHIyID0gMHhmMDsgICAgICAgICAgICAgICAvKiA9PiBubyBvciB1bmtub3duIGZsYXNoICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7IC8qIE1BSU4gRmxhc2ggKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKyAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqIGFkZHIyID0gKHVuc2lnbmVkIGxvbmcgKilhZGRyOworCisgICAgICAgIC8qIFdyaXRlIGF1dG8gc2VsZWN0IGNvbW1hbmQ6IHJlYWQgTWFudWZhY3R1cmVyIElEICovCisgICAgICAgICphZGRyMiA9IDB4OTA5MDkwOTA7CisKKyAgICAgICAgLyogTWFudWZhY3R1cmUgSUQgKi8KKyAgICAgICAgdmFsdWUgPSAqYWRkcjI7CisgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgIGNhc2UgKHVuc2lnbmVkIGxvbmcpSU5URUxfTUFOVUZBQ1Q6CisgICAgICAgICAgICAgICAgaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fSU5URUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICphZGRyMiA9IDB4ZmY7ICAgICAgICAgICAgICAvKiBubyBvciB1bmtub3duIGZsYXNoICAqLworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyogRGV2aWNlIElEIC0gVGhpcyBzaGl0IGlzIGludGVybGVhdmVkLi4uICovCisgICAgICAgIHZhbHVlID0gKihhZGRyMiArIDEpOworICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICBjYXNlICh1bnNpZ25lZCBsb25nKUlOVEVMX0lEXzI4RjMyMEozQToKKyAgICAgICAgICAgICAgICBpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF8yOEYzMjBKM0E7CisgICAgICAgICAgICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMzI7CisgICAgICAgICAgICAgICAgaW5mby0+c2l6ZSA9IDB4MDA0MDAwMDAgKiAyOworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgLyogPT4gMiBYIDQgTUIgKi8KKyAgICAgICAgICAgIGNhc2UgKHVuc2lnbmVkIGxvbmcpSU5URUxfSURfMjhGNjQwSjNBOgorICAgICAgICAgICAgICAgIGluZm8tPmZsYXNoX2lkICs9IEZMQVNIXzI4RjY0MEozQTsKKyAgICAgICAgICAgICAgICBpbmZvLT5zZWN0b3JfY291bnQgPSA2NDsKKyAgICAgICAgICAgICAgICBpbmZvLT5zaXplID0gMHgwMDgwMDAwMCAqIDI7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAvKiA9PiAyIFggOCBNQiAqLworICAgICAgICAgICAgY2FzZSAodW5zaWduZWQgbG9uZylJTlRFTF9JRF8yOEYxMjhKM0E6CisgICAgICAgICAgICAgICAgaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfMjhGMTI4SjNBOworICAgICAgICAgICAgICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDEyODsKKyAgICAgICAgICAgICAgICBpbmZvLT5zaXplID0gMHgwMTAwMDAwMCAqIDI7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAvKiA9PiAyIFggMTYgTUIgKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmFkZHIyID0gMHhmZjsgICAgICAgICAgICAgICAvKiA9PiBubyBvciB1bmtub3duIGZsYXNoICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZXhjZWVkIENGR19NQVhfRkxBU0hfU0VDVCAqLworICAgIGlmIChpbmZvLT5zZWN0b3JfY291bnQgPiBDRkdfTUFYX0ZMQVNIX1NFQ1QpIHsKKyAgICAgICAgcHJpbnRmICgiKiogRVJST1I6IHNlY3RvciBjb3VudCAlZCA+IG1heCAoJWQpICoqXG4iLAorICAgICAgICAgICAgICAgIGluZm8tPnNlY3Rvcl9jb3VudCwgQ0ZHX01BWF9GTEFTSF9TRUNUKTsKKyAgICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gQ0ZHX01BWF9GTEFTSF9TRUNUOworICAgIH0KKworICAgIC8qIHNldCB1cCBzZWN0b3Igc3RhcnQgYWRkcmVzcyB0YWJsZSAqLworICAgIHN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworICAgICAgICBjYXNlIEZMQVNIX0FNMDQwOgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIGluZm8tPnN0YXJ0W2ldID0gYmFzZSArIChpICogMHgwMDAxMDAwMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGTEFTSF8yOEYzMjBKM0E6CisgICAgICAgIGNhc2UgRkxBU0hfMjhGNjQwSjNBOgorICAgICAgICBjYXNlIEZMQVNIXzI4RjEyOEozQToKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICBpbmZvLT5zdGFydFtpXSA9IGJhc2UgKyAoaSAqIDB4MDAwMjAwMDAgKiAyKTsgLyogMiBCYW5rcyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogVGVzdCBmb3IgQm9vdCBGbGFzaCAqLworICAgIGlmIChiYXNlID09IEZMQVNIX0JBU0UwX1BSRUxJTSkgeworICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICphZGRyMjsKKyAgICAgICAgLyogY2hlY2sgZm9yIHByb3RlY3RlZCBzZWN0b3JzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworICAgICAgICAgICAgLyogcmVhZCBzZWN0b3IgcHJvdGVjdGlvbiBhdCBzZWN0b3IgYWRkcmVzcywgKEFYIC4uIEEwKSA9IDB4MDIgKi8KKyAgICAgICAgICAgIC8qIEQwID0gMSBpZiBwcm90ZWN0ZWQgKi8KKyAgICAgICAgICAgIGFkZHIyID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoaW5mby0+c3RhcnRbaV0pOworICAgICAgICAgICAgaW5mby0+cHJvdGVjdFtpXSA9ICooYWRkcjIgKyAyKSAmIDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZXN0b3JlIHJlYWQgbW9kZSAqLworICAgICAgICAqKHVuc2lnbmVkIGNoYXIgKiliYXNlID0gMHhGMDsgICAgICAgLyogUmVzZXQgTk9STUFMIEZsYXNoICovCisgICAgfQorICAgIGVsc2UgeyAvKiBNYWluIEZsYXNoICovCisgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIyOworICAgICAgICAvKiBjaGVjayBmb3IgcHJvdGVjdGVkIHNlY3RvcnMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAvKiByZWFkIHNlY3RvciBwcm90ZWN0aW9uIGF0IHNlY3RvciBhZGRyZXNzLCAoQVggLi4gQTApID0gMHgwMiAqLworICAgICAgICAgICAgLyogRDAgPSAxIGlmIHByb3RlY3RlZCAqLworICAgICAgICAgICAgYWRkcjIgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShpbmZvLT5zdGFydFtpXSk7CisgICAgICAgICAgICBpbmZvLT5wcm90ZWN0W2ldID0gKihhZGRyMiArIDIpICYgMHgxOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVzdG9yZSByZWFkIG1vZGUgKi8KKyAgICAgICAgKih1bnNpZ25lZCBsb25nICopYmFzZSA9IDB4RkZGRkZGRkY7IC8qIFJlc2V0ICBGbGFzaCAqLworICAgIH0KKworICAgIHJldHVybiAoaW5mby0+c2l6ZSk7Cit9IC8qIGVuZCBmbGFzaF9nZXRfc2l6ZSgpICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgaW50IHdhaXRfZm9yX0RRNyh1bG9uZyBhZGRyLCB1Y2hhciBjbXBfdmFsLCB1bG9uZyB0b3V0KQoreworICAgIGludCBpOworCisgICAgdm9sYXRpbGUgdWNoYXIgKnZhZGRyID0gICh1Y2hhciAqKWFkZHI7CisKKyAgICAvKiBMb29wIFggdGltZXMgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDw9ICgxMDAgKiB0b3V0KTsgaSsrKSB7ICAgIC8qIFdhaXQgdXAgdG8gdG91dCBtcyAqLworICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICAvKiBQYXVzZSAxMCB1cyAqLworCisgICAgICAgIC8qIENoZWNrIGZvciBjb21wbGV0aW9uICovCisgICAgICAgIGlmICgodmFkZHJbMF0gJiAweDgwKSA9PSAoY21wX3ZhbCAmIDB4ODApKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEtFRVAgVEhFIExVU0VSIEhBUFBZIC0gUHJpbnQgYSBkb3QgZXZlcnkgMS4xIHNlY29uZHMgKi8KKyAgICAgICAgaWYgKCEoaSAlIDExMDAwMCkpCisgICAgICAgICAgICBwdXRjKCcuJyk7CisKKyAgICAgICAgLyogS2ljayB0aGUgZG9nIGlmIG5lZWRlZCAqLworICAgICAgICBXQVRDSERPR19SRVNFVCgpOworICAgIH0KKworICAgIHJldHVybiAxOworfSAvKiB3YWl0X2Zvcl9EUTcoKSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGludCBmbGFzaF9lcmFzZTgoZmxhc2hfaW5mb190ICppbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK3sKKyAgICBpbnQgdGNvZGUsIHJjb2RlID0gMDsKKyAgICB2b2xhdGlsZSB1Y2hhciAqYWRkciA9ICh1Y2hhciAqKShpbmZvLT5zdGFydFswXSk7CisgICAgdm9sYXRpbGUgdWNoYXIgKnNlY3Rvcl9hZGRyOworICAgIGludCBmbGFnLCBwcm90LCBzZWN0OworCisgICAgLyogVmFsaWRhdGUgYXJndW1lbnRzICovCisgICAgaWYgKChzX2ZpcnN0IDwgMCkgfHwgKHNfZmlyc3QgPiBzX2xhc3QpKSB7CisgICAgICAgIGlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKQorICAgICAgICAgICAgcHJpbnRmICgiLSBtaXNzaW5nXG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmICgiLSBubyBzZWN0b3JzIHRvIGVyYXNlXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIEtOT1dOIGZsYXNoIHR5cGUgKi8KKyAgICBpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworICAgICAgICBwcmludGYgKCJDYW4ndCBlcmFzZSB1bmtub3duIGZsYXNoIHR5cGUgLSBhYm9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIHByb3RlY3RlZCBzZWN0b3JzICovCisgICAgcHJvdCA9IDA7CisgICAgZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7ICsrc2VjdCkgeworICAgICAgICBpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkKKyAgICAgICAgICAgIHByb3QrKzsKKyAgICB9CisgICAgaWYgKHByb3QpCisgICAgICAgIHByaW50ZiAoIi0gV2FybmluZzogJWQgcHJvdGVjdGVkIHNlY3RvcnMgd2lsbCBub3QgYmUgZXJhc2VkIVxuIiwgcHJvdCk7CisgICAgZWxzZQorICAgICAgICBwcmludGYgKCJcbiIpOworCisgICAgLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLworICAgIGZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyBzZWN0KyspIHsKKyAgICAgICAgaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkgeyAgICAgIC8qIG5vdCBwcm90ZWN0ZWQgKi8KKyAgICAgICAgICAgIHNlY3Rvcl9hZGRyID0gKHVjaGFyICopKGluZm8tPnN0YXJ0W3NlY3RdKTsKKworICAgIAkJaWYgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSA9PSBGTEFTSF9NQU5fU1RNKQorCQkgICAgcHJpbnRmKCJFcmFzaW5nIGJsb2NrICVwXG4iLCBzZWN0b3JfYWRkcik7CisJCWVsc2UKKwkJICAgIHByaW50ZigiRXJhc2luZyBzZWN0b3IgJXBcbiIsIHNlY3Rvcl9hZGRyKTsKKworICAgICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIEZsYXNoIHRvIHRpbWVvdXQgKi8KKyAgICAgICAgICAgIGZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworICAgICAgICAgICAgKihhZGRyICsgMHg1NTUpID0gKHVjaGFyKTB4QUE7CisgICAgICAgICAgICAqKGFkZHIgKyAweDJhYSkgPSAodWNoYXIpMHg1NTsKKyAgICAgICAgICAgICooYWRkciArIDB4NTU1KSA9ICh1Y2hhcikweDgwOworICAgICAgICAgICAgKihhZGRyICsgMHg1NTUpID0gKHVjaGFyKTB4QUE7CisgICAgICAgICAgICAqKGFkZHIgKyAweDJhYSkgPSAodWNoYXIpMHg1NTsKKyAgICAgICAgICAgICpzZWN0b3JfYWRkciA9ICh1Y2hhcikweDMwOyAgICAgIC8qIHNlY3RvciBlcmFzZSAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2FpdCBmb3IgZWFjaCBzZWN0b3IgdG8gY29tcGxldGUsIGl0J3MgbW9yZQorICAgICAgICAgICAgICogcmVsaWFibGUuICBBY2NvcmRpbmcgdG8gQU1EIFNwZWMsIHlvdSBtdXN0CisgICAgICAgICAgICAgKiBpc3N1ZSBhbGwgZXJhc2UgY29tbWFuZHMgd2l0aGluIGEgc3BlY2lmaWVkCisgICAgICAgICAgICAgKiB0aW1lb3V0LiAgVGhpcyBoYXMgYmVlbiBzZWVuIHRvIGZhaWwsIGVzcGVjaWFsbHkKKyAgICAgICAgICAgICAqIGlmIHByaW50ZigpcyBhcmUgaW5jbHVkZWQgKGZvciBkZWJ1ZykhIQorICAgICAgICAgICAgICogVGFrZXMgdXAgdG8gNiBzZWNvbmRzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0Y29kZSAgPSB3YWl0X2Zvcl9EUTcoKHVsb25nKXNlY3Rvcl9hZGRyLCAweDgwLCA2MDAwKTsKKworICAgICAgICAgICAgLyogcmUtZW5hYmxlIGludGVycnVwdHMgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAgICAgICBlbmFibGVfaW50ZXJydXB0cygpOworCisgICAgICAgICAgICAvKiBNYWtlIHN1cmUgd2UgZGlkbid0IHRpbWVvdXQgKi8KKyAgICAgICAgICAgIGlmICh0Y29kZSkgeworICAgICAgICAgICAgICAgIHByaW50ZiAoIlRpbWVvdXRcbiIpOworICAgICAgICAgICAgICAgIHJjb2RlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHdhaXQgYXQgbGVhc3QgODB1cyAtIGxldCdzIHdhaXQgMSBtcyAqLworICAgIHVkZWxheSAoMTAwMCk7CisKKyAgICAvKiByZXNldCB0byByZWFkIG1vZGUgKi8KKyAgICBhZGRyID0gKHVjaGFyICopaW5mby0+c3RhcnRbMF07CisgICAgKmFkZHIgPSAodWNoYXIpMHhGMDsgICAgICAgICAgICAgICAgICAgICAvKiByZXNldCBiYW5rICovCisKKyAgICBwcmludGYgKCIgZG9uZVxuIik7CisgICAgcmV0dXJuIHJjb2RlOworfSAvKiBlbmQgZmxhc2hfZXJhc2U4KCkgKi8KKworc3RhdGljIGludCBmbGFzaF9lcmFzZTMyKGZsYXNoX2luZm9fdCAqaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCit7CisgICAgaW50IGZsYWcsIHNlY3Q7CisgICAgdWxvbmcgc3RhcnQsIG5vdywgbGFzdDsKKyAgICBpbnQgcHJvdCA9IDA7CisKKyAgICAvKiBWYWxpZGF0ZSBhcmd1bWVudHMgKi8KKyAgICBpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKyAgICAgICAgaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pCisgICAgICAgICAgICBwcmludGYgKCItIG1pc3NpbmdcbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYgKCItIG5vIHNlY3RvcnMgdG8gZXJhc2VcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgS05PV04gZmxhc2ggdHlwZSAqLworICAgIGlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgIT0gRkxBU0hfTUFOX0lOVEVMKSB7CisgICAgICAgIHByaW50ZiAoIkNhbiBlcmFzZSBvbmx5IEludGVsIGZsYXNoIHR5cGVzIC0gYWJvcnRlZFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciBwcm90ZWN0ZWQgc2VjdG9ycyAqLworICAgIGZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyArK3NlY3QpIHsKKyAgICAgICAgaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pCisgICAgICAgICAgICBwcm90Kys7CisgICAgfQorICAgIGlmIChwcm90KQorICAgICAgICBwcmludGYgKCItIFdhcm5pbmc6ICVkIHByb3RlY3RlZCBzZWN0b3JzIHdpbGwgbm90IGJlIGVyYXNlZCFcbiIsIHByb3QpOworICAgIGVsc2UKKyAgICAgICAgcHJpbnRmICgiXG4iKTsKKworICAgIHN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKyAgICBsYXN0ICA9IHN0YXJ0OworICAgIC8qIFN0YXJ0IGVyYXNlIG9uIHVucHJvdGVjdGVkIHNlY3RvcnMgKi8KKyAgICBmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdDsgc2VjdCsrKSB7CisgICAgICAgIFdBVENIRE9HX1JFU0VUKCk7CisgICAgICAgIGlmIChpbmZvLT5wcm90ZWN0W3NlY3RdID09IDApIHsgICAgICAvKiBub3QgcHJvdGVjdGVkICovCisgICAgICAgICAgICB2dV9sb25nICphZGRyID0gKHZ1X2xvbmcgKikoaW5mby0+c3RhcnRbc2VjdF0pOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKyAgICAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLworICAgICAgICAgICAgZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisgICAgICAgICAgICAqYWRkciA9IDB4MDA1MDAwNTA7ICAgICAgICAgICAgICAvKiBjbGVhciBzdGF0dXMgcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICphZGRyID0gMHgwMDIwMDAyMDsgICAgICAgICAgICAgIC8qIGVyYXNlIHNldHVwICovCisgICAgICAgICAgICAqYWRkciA9IDB4MDBEMDAwRDA7ICAgICAgICAgICAgICAvKiBlcmFzZSBjb25maXJtICovCisKKyAgICAgICAgICAgIC8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgICAgICAgZW5hYmxlX2ludGVycnVwdHMoKTsKKworICAgICAgICAgICAgLyogV2FpdCBhdCBsZWFzdCA4MHVzIC0gbGV0J3Mgd2FpdCAxIG1zICovCisgICAgICAgICAgICB1ZGVsYXkgKDEwMDApOworCisgICAgICAgICAgICB3aGlsZSAoKChzdGF0dXMgPSAqYWRkcikgJiAweDAwODAwMDgwKSAhPSAweDAwODAwMDgwKSB7CisgICAgICAgICAgICAgICAgaWYgKChub3cgPSBnZXRfdGltZXIoc3RhcnQpKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIlRpbWVvdXRcbiIpOworICAgICAgICAgICAgICAgICAgICAqYWRkciA9IDB4MDBCMDAwQjA7ICAgICAgLyogc3VzcGVuZCBlcmFzZSAgICAgICovCisgICAgICAgICAgICAgICAgICAgICphZGRyID0gMHgwMEZGMDBGRjsgICAgICAvKiByZXNldCB0byByZWFkIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogc2hvdyB0aGF0IHdlJ3JlIHdhaXRpbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoKG5vdyAtIGxhc3QpID4gOTkwKSB7ICAgLyogZXZlcnkgc2Vjb25kICovCisgICAgICAgICAgICAgICAgICAgIHB1dGMgKCcuJyk7CisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBub3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKmFkZHIgPSAweDAwRkYwMEZGOyAgICAgICAgICAgICAgLyogcmVzZXQgdG8gcmVhZCBtb2RlICovCisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmICgiIGRvbmVcbiIpOworICAgIHJldHVybiAwOworfSAvKiBlbmQgZmxhc2hfZXJhc2UzMigpICovCisKK2ludCBmbGFzaF9lcmFzZShmbGFzaF9pbmZvX3QgKmluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KQoreworICAgIGlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfQU0wNDApCisgICAgICAgIHJldHVybiBmbGFzaF9lcmFzZTgoaW5mbywgc19maXJzdCwgc19sYXN0KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmbGFzaF9lcmFzZTMyKGluZm8sIHNfZmlyc3QsIHNfbGFzdCk7Cit9IC8qIGVuZCBmbGFzaF9lcmFzZSgpICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHkgbWVtb3J5IHRvIGZsYXNoLCByZXR1cm5zOgorICogMCAtIE9LCisgKiAxIC0gd3JpdGUgdGltZW91dAorICogMiAtIEZsYXNoIG5vdCBlcmFzZWQKKyAqLworc3RhdGljIGludCB3cml0ZV9idWZmOChmbGFzaF9pbmZvX3QgKmluZm8sIHVjaGFyICpzcmMsIHVsb25nIGFkZHIsIHVsb25nIGNudCkKK3sKKyAgICB1bG9uZyBjcCwgd3AsIGRhdGE7CisgICAgdWxvbmcgc3RhcnQ7CisgICAgaW50IGksIGwsIHJjOworCisgICAgc3RhcnQgPSBnZXRfdGltZXIgKDApOworCisgICAgd3AgPSAoYWRkciAmIH4zKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgbG93ZXIgd29yZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCBhZGRyZXNzICovCisKKyAgICAvKgorICAgICAqIGhhbmRsZSB1bmFsaWduZWQgc3RhcnQgYnl0ZXMKKyAgICAgKi8KKyAgICBpZiAoKGwgPSBhZGRyIC0gd3ApICE9IDApIHsKKyAgICAgICAgZGF0YSA9IDA7CisgICAgICAgIGZvciAoaT0wLCBjcD13cDsgaTxsOyArK2ksICsrY3ApIHsKKyAgICAgICAgICAgIGRhdGEgPSAoZGF0YSA8PCA4KSB8ICgqKHVjaGFyICopY3ApOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBpPDQgJiYgY250PjA7ICsraSkgeworICAgICAgICAgICAgZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworICAgICAgICAgICAgLS1jbnQ7CisgICAgICAgICAgICArK2NwOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBjbnQ9PTAgJiYgaTw0OyArK2ksICsrY3ApIHsKKyAgICAgICAgICAgIGRhdGEgPSAoZGF0YSA8PCA4KSB8ICgqKHVjaGFyICopY3ApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyYyA9IHdyaXRlX3dvcmQ4KGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIChyYyk7CisgICAgICAgIH0KKyAgICAgICAgd3AgKz0gNDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGhhbmRsZSB3b3JkIGFsaWduZWQgcGFydAorICAgICAqLworICAgIHdoaWxlIChjbnQgPj0gNCkgeworICAgICAgICBkYXRhID0gMDsKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgKytpKSB7CisgICAgICAgICAgICBkYXRhID0gKGRhdGEgPDwgOCkgfCAqc3JjKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyYyA9IHdyaXRlX3dvcmQ4KGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIChyYyk7CisgICAgICAgIH0KKyAgICAgICAgd3AgICs9IDQ7CisgICAgICAgIGNudCAtPSA0OworICAgICAgICBpZiAoZ2V0X3RpbWVyKHN0YXJ0KSA+IDEwMDApIHsgICAvKiBldmVyeSBzZWNvbmQgKi8KKyAgICAgICAgICAgV0FUQ0hET0dfUkVTRVQoKTsKKyAgICAgICAgICAgcHV0YyAoJy4nKTsKKyAgICAgICAgICAgc3RhcnQgPSBnZXRfdGltZXIoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY250ID09IDApIHsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGhhbmRsZSB1bmFsaWduZWQgdGFpbCBieXRlcworICAgICAqLworICAgIGRhdGEgPSAwOworICAgIGZvciAoaT0wLCBjcD13cDsgaTw0ICYmIGNudD4wOyArK2ksICsrY3ApIHsKKyAgICAgICAgZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworICAgICAgICAtLWNudDsKKyAgICB9CisgICAgZm9yICg7IGk8NDsgKytpLCArK2NwKSB7CisgICAgICAgIGRhdGEgPSAoZGF0YSA8PCA4KSB8ICgqKHVjaGFyICopY3ApOworICAgIH0KKworICAgIHJldHVybiAod3JpdGVfd29yZDgoaW5mbywgd3AsIGRhdGEpKTsKK30gLyogZW5kIHdyaXRlX2J1ZmY4KCkgKi8KKworI2RlZmluZQlGTEFTSF9XSURUSAk0CS8qIGZsYXNoIGJ1cyB3aWR0aCBpbiBieXRlcyAqLworc3RhdGljIGludCB3cml0ZV9idWZmMzIgKGZsYXNoX2luZm9fdCAqaW5mbywgdWNoYXIgKnNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQoreworCXVsb25nIGNwLCB3cCwgZGF0YTsKKwlpbnQgaSwgbCwgcmM7CisJdWxvbmcgc3RhcnQ7CisKKwlzdGFydCA9IGdldF90aW1lciAoMCk7CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlyZXR1cm4gNDsKKwl9CisKKwl3cCA9IChhZGRyICYgfihGTEFTSF9XSURUSC0xKSk7CS8qIGdldCBsb3dlciBGTEFTSF9XSURUSCBhbGlnbmVkIGFkZHJlc3MgKi8KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCBzdGFydCBieXRlcworCSAqLworCWlmICgobCA9IGFkZHIgLSB3cCkgIT0gMCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpPTAsIGNwPXdwOyBpPGw7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisJCX0KKwkJZm9yICg7IGk8RkxBU0hfV0lEVEggJiYgY250PjA7ICsraSkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworCQkJLS1jbnQ7CisJCQkrK2NwOworCQl9CisJCWZvciAoOyBjbnQ9PTAgJiYgaTxGTEFTSF9XSURUSDsgKytpLCArK2NwKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAoKih1Y2hhciAqKWNwKTsKKwkJfQorCisJCWlmICgocmMgPSB3cml0ZV93b3JkMzIoaW5mbywgd3AsIGRhdGEpKSAhPSAwKSB7CisJCQlyZXR1cm4gKHJjKTsKKwkJfQorCQl3cCArPSBGTEFTSF9XSURUSDsKKwl9CisKKwkvKgorCSAqIGhhbmRsZSBGTEFTSF9XSURUSCBhbGlnbmVkIHBhcnQKKwkgKi8KKwl3aGlsZSAoY250ID49IEZMQVNIX1dJRFRIKSB7CisJCWRhdGEgPSAwOworCQlmb3IgKGk9MDsgaTxGTEFTSF9XSURUSDsgKytpKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAqc3JjKys7CisJCX0KKwkJaWYgKChyYyA9IHdyaXRlX3dvcmQzMihpbmZvLCB3cCwgZGF0YSkpICE9IDApIHsKKwkJCXJldHVybiAocmMpOworCQl9CisJCXdwICArPSBGTEFTSF9XSURUSDsKKwkJY250IC09IEZMQVNIX1dJRFRIOworICAgICAgICAgIGlmIChnZXRfdGltZXIoc3RhcnQpID4gOTkwKSB7ICAgLyogZXZlcnkgc2Vjb25kICovCisJCQlwdXRjICgnLicpOworCQkJc3RhcnQgPSBnZXRfdGltZXIoMCk7CisJCX0KKwl9CisKKwlpZiAoY250ID09IDApIHsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKgorCSAqIGhhbmRsZSB1bmFsaWduZWQgdGFpbCBieXRlcworCSAqLworCWRhdGEgPSAwOworCWZvciAoaT0wLCBjcD13cDsgaTxGTEFTSF9XSURUSCAmJiBjbnQ+MDsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKKwkJLS1jbnQ7CisJfQorCWZvciAoOyBpPEZMQVNIX1dJRFRIOyArK2ksICsrY3ApIHsKKwkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisJfQorCisJcmV0dXJuICh3cml0ZV93b3JkMzIoaW5mbywgd3AsIGRhdGEpKTsKK30gLyogd3JpdGVfYnVmZjMyKCkgKi8KKworaW50IHdyaXRlX2J1ZmYoZmxhc2hfaW5mb190ICppbmZvLCB1Y2hhciAqc3JjLCB1bG9uZyBhZGRyLCB1bG9uZyBjbnQpCit7CisgICAgaW50IHJldHZhbDsKKworICAgIGlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfQU0wNDApCisgICAgICAgIHJldHZhbCA9IHdyaXRlX2J1ZmY4KGluZm8sIHNyYywgYWRkciwgY250KTsKKyAgICBlbHNlCisgICAgICAgIHJldHZhbCA9IHdyaXRlX2J1ZmYzMihpbmZvLCBzcmMsIGFkZHIsIGNudCk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfSAvKiBlbmQgd3JpdGVfYnVmZigpICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyaXRlIGEgd29yZCB0byBGbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KKworc3RhdGljIGludCB3cml0ZV93b3JkOChmbGFzaF9pbmZvX3QgKmluZm8sIHVsb25nIGRlc3QsIHVsb25nIGRhdGEpCit7CisgICAgdm9sYXRpbGUgdWNoYXIgKmFkZHIyID0gKHVjaGFyICopKGluZm8tPnN0YXJ0WzBdKTsKKyAgICB2b2xhdGlsZSB1Y2hhciAqZGVzdDIgPSAodWNoYXIgKilkZXN0OworICAgIHZvbGF0aWxlIHVjaGFyICpkYXRhMiA9ICh1Y2hhciAqKSZkYXRhOworICAgIGludCBmbGFnOworICAgIGludCBpLCB0Y29kZSwgcmNvZGUgPSAwOworCisgICAgLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2VudGx5KSBlcmFzZWQgKi8KKyAgICBpZiAoKCooKHZvbGF0aWxlIHVjaGFyICopZGVzdCkgJgorICAgICAgICAodWNoYXIpZGF0YSkgIT0gKHVjaGFyKWRhdGEpIHsKKyAgICAgICAgcmV0dXJuICgyKTsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaSA8ICg0IC8gc2l6ZW9mKHVjaGFyKSk7IGkrKykgeworICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKyAgICAgICAgZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisgICAgICAgICooYWRkcjIgKyAweDU1NSkgPSAodWNoYXIpMHhBQTsKKyAgICAgICAgKihhZGRyMiArIDB4MmFhKSA9ICh1Y2hhcikweDU1OworICAgICAgICAqKGFkZHIyICsgMHg1NTUpID0gKHVjaGFyKTB4QTA7CisKKyAgICAgICAgZGVzdDJbaV0gPSBkYXRhMltpXTsKKworICAgICAgICAvKiBXYWl0IGZvciB3cml0ZSB0byBjb21wbGV0ZSwgdXAgdG8gMW1zICovCisgICAgICAgIHRjb2RlID0gd2FpdF9mb3JfRFE3KCh1bG9uZykmZGVzdDJbaV0sIGRhdGEyW2ldLCAxKTsKKworICAgICAgICAvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgICBlbmFibGVfaW50ZXJydXB0cygpOworCisgICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgdGltZW91dCAqLworICAgICAgICBpZiAodGNvZGUpIHsKKyAgICAgICAgICAgIHJjb2RlID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByY29kZTsKK30gLyogZW5kIHdyaXRlX3dvcmQ4KCkgKi8KKworc3RhdGljIGludCB3cml0ZV93b3JkMzIoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKQoreworICAgIHZ1X2xvbmcgKmFkZHIgPSAodnVfbG9uZyAqKWRlc3Q7CisgICAgdWxvbmcgc3RhdHVzOworICAgIHVsb25nIHN0YXJ0OworICAgIGludCBmbGFnOworCisgICAgLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkICovCisgICAgaWYgKCgqYWRkciAmIGRhdGEpICE9IGRhdGEpIHsKKyAgICAgICAgcmV0dXJuICgyKTsKKyAgICB9CisgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlICovCisgICAgZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisgICAgKmFkZHIgPSAweDAwNDAwMDQwOyAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBzZXR1cCAqLworICAgICphZGRyID0gZGF0YTsKKworICAgIC8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChmbGFnKQorICAgICAgICBlbmFibGVfaW50ZXJydXB0cygpOworCisgICAgc3RhcnQgPSBnZXRfdGltZXIgKDApOworCisgICAgd2hpbGUgKCgoc3RhdHVzID0gKmFkZHIpICYgMHgwMDgwMDA4MCkgIT0gMHgwMDgwMDA4MCkgeworICAgICAgICBXQVRDSERPR19SRVNFVCgpOworICAgICAgICBpZiAoZ2V0X3RpbWVyKHN0YXJ0KSA+IENGR19GTEFTSF9XUklURV9UT1VUKSB7CisgICAgICAgICAgICAqYWRkciA9IDB4MDBGRjAwRkY7ICAgICAgICAgICAgICAvKiByZXN0b3JlIHJlYWQgbW9kZSAqLworICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICphZGRyID0gMHgwMEZGMDBGRjsgICAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSByZWFkIG1vZGUgKi8KKworICAgIHJldHVybiAoMCk7Cit9IC8qIGVuZCB3cml0ZV93b3JkMzIoKSAqLworCisKK3N0YXRpYyBpbnQgX2ZsYXNoX3Byb3RlY3QoZmxhc2hfaW5mb190ICppbmZvLCBsb25nIHNlY3RvcikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZmxhZzsKKyAgICB1bG9uZyBzdGF0dXM7CisgICAgaW50IHJjb2RlID0gMDsKKyAgICB2b2xhdGlsZSBsb25nICphZGRyID0gKHVuc2lnbmVkIGxvbmcgKilzZWN0b3I7CisKKyAgICBzd2l0Y2goaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworICAgICAgICBjYXNlIEZMQVNIXzI4RjMyMEozQToKKyAgICAgICAgY2FzZSBGTEFTSF8yOEY2NDBKM0E6CisgICAgICAgIGNhc2UgRkxBU0hfMjhGMTI4SjNBOgorICAgICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIEZsYXNoIHRvIHRpbWVvdXQgKi8KKyAgICAgICAgICAgIGZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworICAgICAgICAgICAgLyogSXNzdWUgY29tbWFuZCAqLworICAgICAgICAgICAgKmFkZHIgPSAweDAwNTAwMDUwTDsgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIHN0YXR1cyByZWdpc3RlciAqLworICAgICAgICAgICAgKmFkZHIgPSAweDAwNjAwMDYwTDsgICAgICAgICAgICAgLyogU2V0IGxvY2sgYml0IHNldHVwICovCisgICAgICAgICAgICAqYWRkciA9IDB4MDAwMTAwMDFMOyAgICAgICAgICAgICAvKiBTZXQgbG9jayBiaXQgY29uZmlybSAqLworCisgICAgICAgICAgICAvKiBXYWl0IGZvciBjb21tYW5kIGNvbXBsZXRpb24gKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7ICAgICAgIC8qIDc1dXMgdGltZW91dCwgd2FpdCAxMDB1cyAqLworICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgICAgICAgICAgaWYgKCgqYWRkciAmIDB4MDA4MDAwODBMKSA9PSAweDAwODAwMDgwTCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE5vdCBzdWNjZXNzZnVsPyAqLworICAgICAgICAgICAgc3RhdHVzID0gKmFkZHI7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDB4MDA4MDAwODBMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJQcm90ZWN0ICV4IHNlY3RvciBmYWlsZWQ6ICV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAodWludClzZWN0b3IsICh1aW50KXN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmNvZGUgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBSZXN0b3JlIHJlYWQgbW9kZSAqLworICAgICAgICAgICAgKmFkZHIgPSAweDAwZmYwMGZmTDsKKworICAgICAgICAgICAgLyogcmUtZW5hYmxlIGludGVycnVwdHMgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAgICAgICBlbmFibGVfaW50ZXJydXB0cygpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGTEFTSF9BTTA0MDogICAgICAgICAgICAgICAgICAgIC8qIE5vIHNvZnQgc2VjdG9yIHByb3RlY3Rpb24gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFR1cm4gcHJvdGVjdGlvbiBvbiBmb3IgdGhpcyBzZWN0b3IgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGluZm8tPnN0YXJ0W2ldID09IHNlY3RvcikgeworICAgICAgICAgICAgaW5mby0+cHJvdGVjdFtpXSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByY29kZTsKK30gLyogZW5kIF9mbGFzaF9wcm90ZWN0KCkgKi8KKworc3RhdGljIGludCBfZmxhc2hfdW5wcm90ZWN0KGZsYXNoX2luZm9fdCAqaW5mbywgbG9uZyBzZWN0b3IpCit7CisgICAgaW50IGk7CisgICAgaW50IGZsYWc7CisgICAgdWxvbmcgc3RhdHVzOworICAgIGludCByY29kZSA9IDA7CisgICAgdm9sYXRpbGUgbG9uZyAqYWRkciA9ICh1bnNpZ25lZCBsb25nICopc2VjdG9yOworCisgICAgc3dpdGNoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spIHsKKyAgICAgICAgY2FzZSBGTEFTSF8yOEYzMjBKM0E6CisgICAgICAgIGNhc2UgRkxBU0hfMjhGNjQwSjNBOgorICAgICAgICBjYXNlIEZMQVNIXzI4RjEyOEozQToKKyAgICAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBGbGFzaCB0byB0aW1lb3V0ICovCisgICAgICAgICAgICBmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICAgICAgICAgICphZGRyID0gMHgwMDUwMDA1MEw7ICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICphZGRyID0gMHgwMDYwMDA2MEw7ICAgICAgICAgICAgIC8qIENsZWFyIGxvY2sgYml0IHNldHVwICovCisgICAgICAgICAgICAqYWRkciA9IDB4MDBEMDAwRDBMOyAgICAgICAgICAgICAvKiBDbGVhciBsb2NrIGJpdCBjb25maXJtICovCisKKyAgICAgICAgICAgIC8qIFdhaXQgZm9yIGNvbW1hbmQgY29tcGxldGlvbiAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDgwIDsgaSsrKSB7ICAgICAgLyogNzAwbXMgdGltZW91dCwgd2FpdCA4MDAgKi8KKyAgICAgICAgICAgICAgICB1ZGVsYXkoMTAwMDApOyAgICAgICAgICAgICAgIC8qIERlbGF5IDEwbXMgKi8KKyAgICAgICAgICAgICAgICBpZiAoKCphZGRyICYgMHgwMDgwMDA4MEwpID09IDB4MDA4MDAwODBMKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTm90IHN1Y2Nlc3NmdWw/ICovCisgICAgICAgICAgICBzdGF0dXMgPSAqYWRkcjsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMHgwMDgwMDA4MEwpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlVuLXByb3RlY3QgJXggc2VjdG9yIGZhaWxlZDogJXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICh1aW50KXNlY3RvciwgKHVpbnQpc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAqYWRkciA9IDB4MDBmZjAwZmZMOworICAgICAgICAgICAgICAgIHJjb2RlID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcmVzdG9yZSByZWFkIG1vZGUgKi8KKyAgICAgICAgICAgICphZGRyID0gMHgwMGZmMDBmZkw7CisKKyAgICAgICAgICAgIC8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgICAgICAgZW5hYmxlX2ludGVycnVwdHMoKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkxBU0hfQU0wNDA6ICAgICAgICAgICAgICAgICAgICAvKiBObyBzb2Z0IHNlY3RvciBwcm90ZWN0aW9uICovCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZpeCBJbnRlbCdzIGxpdHRsZSByZWQgd2Fnb24uICBSZXByb3RlY3QKKyAgICAgKiBzZWN0b3JzIHRoYXQgd2VyZSBwcm90ZWN0ZWQgYmVmb3JlIHdlIHVuZGlkCisgICAgICogcHJvdGVjdGlvbiBvbiBhIHNwZWNpZmljIHNlY3Rvci4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGluZm8tPnN0YXJ0W2ldICE9IHNlY3RvcikgeworICAgICAgICAgICAgaWYgKGluZm8tPnByb3RlY3RbaV0pIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZsYXNoX3Byb3RlY3QoaW5mbywgaW5mby0+c3RhcnRbaV0pKQorICAgICAgICAgICAgICAgICAgICByY29kZSA9IDE7CisJICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIFR1cm4gcHJvdGVjdGlvbiBvZmYgZm9yIHRoaXMgc2VjdG9yICovCisgICAgICAgICAgICBpbmZvLT5wcm90ZWN0W2ldID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmNvZGU7Cit9IC8qIGVuZCBfZmxhc2hfdW5wcm90ZWN0KCkgKi8KKworCitpbnQgZmxhc2hfcmVhbF9wcm90ZWN0KGZsYXNoX2luZm9fdCAqaW5mbywgbG9uZyBzZWN0b3IsIGludCBwcm90KQoreworICAgIGludCByY29kZTsKKworICAgIGlmIChwcm90KQorICAgICAgICByY29kZSA9IF9mbGFzaF9wcm90ZWN0KGluZm8sIGluZm8tPnN0YXJ0W3NlY3Rvcl0pOworICAgIGVsc2UKKyAgICAgICAgcmNvZGUgPSBfZmxhc2hfdW5wcm90ZWN0KGluZm8sIGluZm8tPnN0YXJ0W3NlY3Rvcl0pOworCisgICAgcmV0dXJuIHJjb2RlOworfSAvKiBlbmQgZmxhc2hfcmVhbF9wcm90ZWN0KCkgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKZGlmZiAtLWdpdCBhL2JvYXJkL3c3by9mcGdhLmMgYi9ib2FyZC93N28vZnBnYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDEyM2IKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC93N28vZnBnYS5jCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBFcmlrIFRoZWlzZW4sIFdhdmUgNyBPcHRpY3MsIGV0aGVpc2VuQG1pbmRzcHJpbmcuY29tCisgKiAgYW5kCisgKiBCaWxsIEh1bnRlciwgV2F2ZSA3IE9wdGljcywgd2lsbGlhbS5odW50ZXJAbWVkaWFvbmUubmV0CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlICJ3N28uaCIKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSAiZXJyb3JzLmgiCisKK3N0YXRpYyB2b2lkCitmcGdhX2ltZ193cml0ZSh1bnNpZ25lZCBsb25nICpzcmMsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBzaG9ydCAqZGFkZHIpCit7CisgICAgdW5zaWduZWQgbG9uZyBpOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpkZXN0ID0gZGFkZHI7CS8qIHZvbGF0aWxlLWJ5cGFzcyBvcHRpbWl6ZXIgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgc3JjKyspIHsKKyAgICAgICAgdmFsID0gKnNyYzsKKyAgICAgICAgKmRlc3QgPSAodW5zaWduZWQgc2hvcnQpKCh2YWwgJiAweGZmMDAwMDAwTCkgPj4gMTYpOworICAgICAgICAqZGVzdCA9ICh1bnNpZ25lZCBzaG9ydCkoKHZhbCAmIDB4MDBmZjAwMDBMKSA+PiA4KTsKKyAgICAgICAgKmRlc3QgPSAodW5zaWduZWQgc2hvcnQpKHZhbCAmIDB4MDAwMGZmMDBMKTsKKyAgICAgICAgKmRlc3QgPSAodW5zaWduZWQgc2hvcnQpKCh2YWwgJiAweDAwMDAwMGZmTCkgPDwgOCk7CisgICAgfQorCisgICAgLyogVGVybWluYXRlIHByb2dyYW1taW5nIHdpdGggNCBDIGNsb2NrcyAqLworICAgIGRlc3QgPSBkYWRkcjsKKyAgICB2YWwgPSAqKHVuc2lnbmVkIHNob3J0ICopZGVzdDsKKyAgICB2YWwgPSAqKHVuc2lnbmVkIHNob3J0ICopZGVzdDsKKyAgICB2YWwgPSAqKHVuc2lnbmVkIHNob3J0ICopZGVzdDsKKyAgICB2YWwgPSAqKHVuc2lnbmVkIHNob3J0ICopZGVzdDsKKworfQorCisKK2ludAorZnBnYURvd25sb2FkKHVuc2lnbmVkIGNoYXIgKnNhZGRyLAorCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCSAgICAgdW5zaWduZWQgc2hvcnQgKmRhZGRyKQoreworICAgIGludCBpOwkJCQkJLyogaW5kZXgsIGludHIgZGlzYWJsZSBmbGFnICovCisgICAgaW50IHN0YXJ0OwkJCQkJLyogdGltZXIgKi8KKyAgICB1bnNpZ25lZCBsb25nIGdyZWcsIGdyZWdvOwkJCS8qIEdQSU8gJiBvdXRwdXQgcmVnaXN0ZXIgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsJCQkvKiBpbWFnZSBzaXplIGluIHdvcmRzICovCisgICAgdW5zaWduZWQgbG9uZyAqc291cmNlOwkJCS8qIGltYWdlIHNvdXJjZSBhZGRyICovCisgICAgdW5zaWduZWQgc2hvcnQgKmRlc3Q7CQkJLyogZGVzdGluYXRpb24gRlBHQSBhZGRyICovCisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKm5kZXN0OwkJLyogdGVtcCBkZXN0IEZQR0EgYWRkciAqLworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHZhbDsJCS8qIHRlbXAgdmFsICovCisgICAgdW5zaWduZWQgbG9uZyBjbmZnID0gR1BJT19YQ1ZfQ05GRzsJCS8qIEZQR0EgQ05GRyAqLworICAgIHVuc2lnbmVkIGxvbmcgZWlycSA9IEdQSU9fWENWX0lSUTsKKyAgICBpbnQgcmV0dmFsID0gLTE7CQkJCS8qIEZ1bmN0aW9uIHJldHVybiB2YWx1ZSAqLworCisgICAgLyogU2V0dXAgc29tZSBiYXNpYyB2YWx1ZXMgKi8KKyAgICBsZW5ndGggPSAoc2l6ZSAvIDQpICsgMTsJCQkvKiBzaXplIGluIHdvcmRzLCByb3VuZGluZyBVUAorCQkJCQkJICAgIGlzIE9LICovCisgICAgc291cmNlID0gKHVuc2lnbmVkIGxvbmcgKilzYWRkcjsKKyAgICBkZXN0ID0gKHVuc2lnbmVkIHNob3J0ICopZGFkZHI7CisKKyAgICAvKiBHZXQgRENSIG91dHB1dCByZWdpc3RlciAqLworICAgIGdyZWdvID0gaW4zMihJQk00MDVHUF9HUElPMF9PUik7CisKKyAgICAvKiBSZXNldCBGUEdBICovCisgICAgZ3JlZ28gJj0gfkdQSU9fWENWX1BST0c7CQkJLyogUFJPRyBsaW5lIGxvdyAqLworICAgIG91dDMyKElCTTQwNUdQX0dQSU8wX09SLCBncmVnbyk7CisKKyAgICAvKiBTZXR1cCB0aW1lb3V0IHRpbWVyICovCisgICAgc3RhcnQgPSBnZXRfdGltZXIoMCk7CisKKyAgICAvKiBXYWl0IGZvciBGUEdBIGluaXQgbGluZSAqLworICAgIHdoaWxlKGluMzIoSUJNNDA1R1BfR1BJTzBfSVIpICYgR1BJT19YQ1ZfSU5JVCkgeyAvKiBXYWl0IElOSVQgbGluZSBsb3cgKi8KKyAgICAgICAgLyogQ2hlY2sgZm9yIHRpbWVvdXQgLSAxMDB1cyBtYXgsIHNvIHVzZSAzbXMgKi8KKyAgICAgICAgaWYgKGdldF90aW1lcihzdGFydCkgPiAzKSB7CisgICAgICAgICAgICBwcmludGYoIiAgICAgZmFpbGVkIHRvIHN0YXJ0IGluaXQuXG4iKTsKKyAgICAgICAgICAgIGxvZ193YXJuKEVSUl9YSU5JVDApOwkJLyogRG9uJ3QgaGFsdCAqLworCisgICAgICAgICAgICAvKiBSZXNldCBsaW5lIHN0YXlzIGxvdyAqLworICAgICAgICAgICAgZ290byBkb25lOwkJCQkvKiBJIGxpa2UgZ290b3MuLi4gKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVucmVzZXQgRlBHQSAqLworICAgIGdyZWdvIHw9IEdQSU9fWENWX1BST0c7CQkJLyogUFJPRyBsaW5lIGhpZ2ggKi8KKyAgICBvdXQzMihJQk00MDVHUF9HUElPMF9PUiwgZ3JlZ28pOworCisgICAgLyogV2FpdCBmb3IgRlBHQSBlbmQgb2YgaW5pdCBwZXJpb2QgLiAgKi8KKyAgICB3aGlsZSghKGluMzIoSUJNNDA1R1BfR1BJTzBfSVIpICYgR1BJT19YQ1ZfSU5JVCkpIHsgLyogV2FpdCBmb3IgSU5JVCBoaSAqLworCisgICAgICAgIC8qIENoZWNrIGZvciB0aW1lb3V0ICovCisgICAgICAgIGlmIChnZXRfdGltZXIoc3RhcnQpID4gMykgeworICAgICAgICAgICAgcHJpbnRmKCIgICAgIGZhaWxlZCB0byBleGl0IGluaXQuXG4iKTsKKyAgICAgICAgICAgIGxvZ193YXJuKEVSUl9YSU5JVDEpOworCisgICAgICAgICAgICAvKiBSZXNldCBGUEdBICovCisgICAgICAgICAgICBncmVnbyAmPSB+R1BJT19YQ1ZfUFJPRzsJCS8qIFBST0cgbGluZSBsb3cgKi8KKyAgICAgICAgICAgIG91dDMyKElCTTQwNUdQX0dQSU8wX09SLCBncmVnbyk7CisKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE5vdyBwcm9ncmFtIEZQR0EgLi4uICovCisgICAgbmRlc3QgPSBkZXN0OworICAgIGZvciAoaSA9IDA7IGkgPCBDT05GSUdfTlVNX0ZQR0FTOyBpKyspIHsKKyAgICAgICAgLyogVG9nZ2xlIElSUS9HUElPICovCisgICAgICAgIGdyZWcgPSBtZmRjcihDUEMwX0NSMCk7CQkJLyogZ2V0IGNoaXAgY3RybCByZWdpc3RlciAqLworICAgICAgICBncmVnIHw9IGVpcnE7CQkJCS8qIHRvZ2dsZSBpcnEvZ3BpbyAqLworICAgICAgICBtdGRjcihDUEMwX0NSMCwgZ3JlZyk7CQkJLyogIC4uLiBqdXN0IGRvIGl0ICovCisKKyAgICAgICAgLyogdHVybiBvbiBvcGVuIGRyYWluIGZvciBDTkZHICovCisgICAgICAgIGdyZWcgPSBpbjMyKElCTTQwNUdQX0dQSU8wX09EUik7CS8qIGdldCBvcGVuIGRyYWluIHJlZ2lzdGVyICovCisgICAgICAgIGdyZWcgfD0gY25mZzsJCQkJLyogQ05GRyBvcGVuIGRyYWluICovCisgICAgICAgIG91dDMyKElCTTQwNUdQX0dQSU8wX09EUiwgZ3JlZyk7CS8qICAuLiBqdXN0IGRvIGl0ICovCisKKyAgICAgICAgLyogVHVybiBvdXRwdXQgZW5hYmxlIG9uIGZvciBDTkZHICovCisgICAgICAgIGdyZWcgPSBpbjMyKElCTTQwNUdQX0dQSU8wX1RDUik7CS8qIGdldCB0cmlzdGF0ZSByZWdpc3RlciAqLworICAgICAgICBncmVnIHw9IGNuZmc7CQkJCS8qIENORkcgdHJpc3RhdGUgaW5hY3RpdmUgKi8KKyAgICAgICAgb3V0MzIoSUJNNDA1R1BfR1BJTzBfVENSLCBncmVnKTsJLyogIC4uLiBqdXN0IGRvIGl0ICovCisKKyAgICAgICAgLyogU2V0dXAgRlBHQSBmb3IgcHJvZ3JhbW1pbmcgKi8KKyAgICAgICAgZ3JlZ28gJj0gfmNuZmc7CQkJCS8qIENPTkZJRyBsaW5lIGxvdyAqLworICAgICAgICBvdXQzMihJQk00MDVHUF9HUElPMF9PUiwgZ3JlZ28pOworCisgICAgICAgIC8qCisgICAgICAgICAqIFByb2dyYW0gdGhlIEZQR0EKKyAgICAgICAgICovCisgICAgICAgIHByaW50ZigiXG4gICAgICAgZGVzdGluYXRpb246IDB4JWx4ICIsICh1bnNpZ25lZCBsb25nKW5kZXN0KTsKKworICAgICAgICBmcGdhX2ltZ193cml0ZShzb3VyY2UsICBsZW5ndGgsICAodW5zaWduZWQgc2hvcnQgKiluZGVzdCk7CisKKyAgICAgICAgLyogRG9uZSBwcm9ncmFtbWluZyAqLworICAgICAgICBncmVnbyB8PSBjbmZnOwkJCQkvKiBDT05GSUcgbGluZSBoaWdoICovCisgICAgICAgIG91dDMyKElCTTQwNUdQX0dQSU8wX09SLCBncmVnbyk7CisKKyAgICAgICAgLyogVHVybiBvdXRwdXQgZW5hYmxlIE9GRiBmb3IgQ05GRyAqLworICAgICAgICBncmVnID0gaW4zMihJQk00MDVHUF9HUElPMF9UQ1IpOwkvKiBnZXQgdHJpc3RhdGUgcmVnaXN0ZXIgKi8KKyAgICAgICAgZ3JlZyAmPSB+Y25mZzsJCQkJLyogQ05GRyB0cmlzdGF0ZSBpbmFjdGl2ZSAqLworICAgICAgICBvdXQzMihJQk00MDVHUF9HUElPMF9UQ1IsIGdyZWcpOwkvKiAgLi4uIGp1c3QgZG8gaXQgKi8KKworICAgICAgICAvKiBUb2dnbGUgSVJRL0dQSU8gKi8KKyAgICAgICAgZ3JlZyA9IG1mZGNyKENQQzBfQ1IwKTsJCQkvKiBnZXQgY2hpcCBjdHJsIHJlZ2lzdGVyICovCisgICAgICAgIGdyZWcgJj0gfmVpcnE7CQkJCS8qIHRvZ2dsZSBpcnEvZ3BpbyAqLworICAgICAgICBtdGRjcihDUEMwX0NSMCwgZ3JlZyk7CQkJLyogIC4uLiBqdXN0IGRvIGl0ICovCisKKyAgICAgICAgbmRlc3QgPSAodW5zaWduZWQgc2hvcnQgKikoKGNoYXIgKiluZGVzdCArIDB4MDAxMDAwMDBMKTsgLyogWFhYIC0gTmV4dCBGUEdBIGFkZHIgKi8KKyAgICAgICAgY25mZyA+Pj0gMTsJCQkJLyogWFhYIC0gTmV4dCAgKi8KKyAgICAgICAgZWlycSA+Pj0gMTsKKyAgICB9CisKKyAgICAvKiBUZXJtaW5hdGUgcHJvZ3JhbW1pbmcgd2l0aCA0IEMgY2xvY2tzICovCisgICAgbmRlc3QgPSBkZXN0OworICAgIGZvciAoaSA9IDA7IGkgPCBDT05GSUdfTlVNX0ZQR0FTOyBpKyspIHsKKyAgICAgICAgdmFsID0gKm5kZXN0OworICAgICAgICB2YWwgPSAqbmRlc3Q7CisgICAgICAgIHZhbCA9ICpuZGVzdDsKKyAgICAgICAgdmFsID0gKm5kZXN0OworICAgICAgICBuZGVzdCA9ICh1bnNpZ25lZCBzaG9ydCAqKSgoY2hhciAqKW5kZXN0ICsgMHgwMDEwMDAwMEwpOworICAgIH0KKworICAgIC8qIFNldHVwIHRpbWVyICovCisgICAgc3RhcnQgPSBnZXRfdGltZXIoMCk7CisKKyAgICAvKiBXYWl0IGZvciBGUEdBIGVuZCBvZiBwcm9ncmFtbWluZyBwZXJpb2QgLiAgKi8KKyAgICB3aGlsZSghKGluMzIoSUJNNDA1R1BfR1BJTzBfSVIpICYgR1BJT19YQ1ZfRE9ORSkpIHsgLyogVGVzdCBET05FIGxvdyAqLworCisgICAgICAgIC8qIENoZWNrIGZvciB0aW1lb3V0ICovCisgICAgICAgIGlmIChnZXRfdGltZXIoc3RhcnQpID4gMykgeworICAgICAgICAgICAgcHJpbnRmKCIgICAgIGRvbmUgZmFpbGVkIHRvIGNvbWUgaGlnaC5cbiIpOworICAgICAgICAgICAgbG9nX3dhcm4oRVJSX1hET05FMSk7CisKKyAgICAgICAgICAgIC8qIFJlc2V0IEZQR0EgKi8KKyAgICAgICAgICAgIGdyZWdvICY9IH5HUElPX1hDVl9QUk9HOwkJLyogUFJPRyBsaW5lIGxvdyAqLworICAgICAgICAgICAgb3V0MzIoSUJNNDA1R1BfR1BJTzBfT1IsIGdyZWdvKTsKKworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpbnRmKCJcbiAgICAgICBGUEdBIGxvYWQgc3VjY2VlZGVkXG4iKTsKKyAgICByZXR2YWwgPSAwOwkJCQkJLyogUHJvZ3JhbSBPSyAqLworCitkb25lOgorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIEZQR0EgaW1hZ2UgaXMgc3RvcmVkIGluIGZsYXNoICovCitleHRlcm4gZmxhc2hfaW5mb190ICAgIGZsYXNoX2luZm9bXTsKKworaW50IGluaXRfZnBnYSh2b2lkKQoreworICAgIHVuc2lnbmVkIGludCBpLGoscHRyOwkJCS8qIEdlbmVyYWwgcHVycG9zZSAqLworICAgIHVuc2lnbmVkIGNoYXIgYnVmY2hhcjsJCQkvKiBHZW5lcmFsIHB1cnBvc2UgY2hhcmFjdGVyICovCisgICAgdW5zaWduZWQgY2hhciAqYnVmOwkJCQkvKiBTdGFydCBvZiBpbWFnZSBwb2ludGVyICovCisgICAgdW5zaWduZWQgbG9uZyBsZW47CQkJCS8qIExlbmd0aCBvZiBpbWFnZSAqLworICAgIHVuc2lnbmVkIGNoYXIgKmZuX2J1ZjsJCQkvKiBTdGFydCBvZiBmaWxlbmFtZSBzdHJpbmcgKi8KKyAgICB1bnNpZ25lZCBpbnQgZm5fbGVuOwkJCS8qIExlbmd0aCBvZiBmaWxlbmFtZSBzdHJpbmcgKi8KKyAgICB1bnNpZ25lZCBjaGFyICp4Y3ZfYnVmOwkJCS8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgaW1hZ2UgKi8KKyAgICB1bnNpZ25lZCBsb25nIHhjdl9sZW47CQkJLyogTGVuZ3RoIG9mIGltYWdlICovCisgICAgdW5zaWduZWQgbG9uZyBjcmM7CQkJCS8qIDMwYml0IGNyYyBpbiBpbWFnZSAqLworICAgIHVuc2lnbmVkIGxvbmcgY2FsY19jcmM7CQkJLyogQ2FsYydkIDMwYml0IGNyYyAqLworICAgIGludCByZXR2YWwgPSAtMTsKKworICAgIC8qIFRlbGwgdGhlIHdvcmxkIHdoYXQgd2UgYXJlIGRvaW5nICovCisgICAgcHJpbnRmKCJGUEdBOiAgIik7CisKKyAgICAvKgorICAgICAqIEdldCBhZGRyZXNzIG9mIGZpcnN0IHNlY3RvciB3aGVyZSB0aGUgRlBHQQorICAgICAqIGltYWdlIGlzIHN0b3JlZC4KKyAgICAgKi8KKyAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKWZsYXNoX2luZm9bMV0uc3RhcnRbMF07CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgc3RvcmVkIGltYWdlJ3MgQ1JDICYgbGVuZ3RoLgorICAgICAqLworICAgIGNyYyA9ICoodW5zaWduZWQgbG9uZyAqKShidWYrNCk7CQkvKiBDUkMgaXMgZmlyc3QgbG9uZyB3b3JkICovCisgICAgbGVuID0gKih1bnNpZ25lZCBsb25nICopKGJ1Zis4KTsJCS8qIEltYWdlIGxlbiBpcyBuZXh0IGxvbmcgKi8KKworICAgIC8qIFBlZGFudGljICovCisgICAgaWYgKChsZW4gPCAweDEzM0E0KSB8fCAobGVuID4gMHg4MDAwMCkpCisgICAgICAgIGdvdG8gYmFkX2ltYWdlOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbGUgbmFtZSBwb2ludGVyIGFuZCBsZW5ndGguCisgICAgICovCisgICAgZm5fbGVuID0gKCoodW5zaWduZWQgc2hvcnQgKikoYnVmKzEyKSAmIDB4ZmYpOyAvKiBmaWxlbmFtZSBsZW5ndGgKKwkJCQkJCSAgICAgIGlzIG5leHQgc2hvcnQgKi8KKyAgICBmbl9idWYgPSBidWYgKyAxNDsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBGUEdBIGltYWdlIHBvaW50ZXIgYW5kIGxlbmd0aCBsZW5ndGguCisgICAgICovCisgICAgeGN2X2J1ZiA9IGZuX2J1ZiArIGZuX2xlbjsJCQkvKiBwb2ludGVyIHRvIGZwZ2EgaW1hZ2UgKi8KKyAgICB4Y3ZfbGVuID0gbGVuIC0gMTQgLSBmbl9sZW47CQkvKiBmcGdhIGltYWdlIGxlbmd0aCAqLworCisgICAgLyogQ2hlY2sgZm9yIHVuaW5pdGlhbGl6ZWQgRkxBU0ggKi8KKyAgICBpZiAoKHN0cm5jbXAoYnVmLCAidzdvIiwgMykhPTApIHx8IChsZW4gPiAweDAwMDdmZmZmTCkgfHwgKGxlbiA9PSAwKSkKKwlnb3RvIGJhZF9pbWFnZTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIGFuZCBDaGVjayB0aGUgaW1hZ2UncyBDUkMuCisgICAgICovCisgICAgY2FsY19jcmMgPSBjcmMzMigwLCB4Y3ZfYnVmLCB4Y3ZfbGVuKTsKKyAgICBpZiAoY3JjICE9IGNhbGNfY3JjKSB7CisgICAgICAgIHByaW50ZigiXG5mYWlsZWQgLSBiYWQgQ1JDXG4iKTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIC8qIE91dHB1dCB0aGUgZmlsZSBuYW1lICovCisgICAgcHJpbnRmKCJmaWxlIG5hbWUgIDogIik7CisgICAgZm9yIChpPTA7aTxmbl9sZW47aSsrKSB7CisgICAgICAgIGJ1ZmNoYXIgPSBmbl9idWZbK2ldOworICAgICAgICBpZiAoYnVmY2hhcjwnICcgfHwgYnVmY2hhcj4nficpIGJ1ZmNoYXIgPSAnLic7CisgICAgICAgIHB1dGMoYnVmY2hhcik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBmaW5kIHJlc3Qgb2YgZGlzcGxheSBkYXRhCisgICAgICovCisgICAgcHRyID0gMTU7CQkJCQkvKiBPZmZzZXQgdG8gbmNkIGZpbGVuYW1lCisJCQkJCQkgICBsZW5ndGggaW4gZnBnYSBpbWFnZSAqLworICAgIGogPSB4Y3ZfYnVmW3B0cl07CQkJCS8qIEdldCBsZW4gb2YgbmNkIGZpbGVuYW1lICovCisgICAgaWYgKGogPiAzMikgZ290byBiYWRfaW1hZ2U7CisgICAgcHRyID0gcHRyICsgaiArIDM7CQkJCS8qIHNraXAgbmNkIGZpbGVuYW1lIHN0cmluZyArCisJCQkJCQkgICAzIGJ5dGVzIG1vcmUgYnl0ZXMgKi8KKworICAgIC8qCisgICAgICogb3V0cHV0IHRhcmdldCBkZXZpY2Ugc3RyaW5nCisgICAgICovCisgICAgaiA9IHhjdl9idWZbcHRyKytdIC0gMTsJCQkvKiBsZW4gb2YgdGFyZyBzdHIgbGVzcyB0ZXJtICovCisgICAgaWYgKGogPiAzMikgZ290byBiYWRfaW1hZ2U7CisgICAgcHJpbnRmKCJcbiAgICAgICB0YXJnZXQgICAgIDogIik7CisgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworCWJ1ZmNoYXIgPSAoeGN2X2J1ZltwdHIrK10pOworCWlmIChidWZjaGFyPCcgJyB8fCBidWZjaGFyPid+JykgYnVmY2hhciA9ICcuJzsKKwlwdXRjKGJ1ZmNoYXIpOworICAgIH0KKworICAgIC8qCisgICAgICogb3V0cHV0IGNvbXBpbGF0aW9uIGRhdGUgc3RyaW5nIGFuZCB0aW1lIHN0cmluZworICAgICAqLworICAgIHB0ciArPSAzOwkJCQkJLyogc2tpcCAyIGJ5dGVzICovCisgICAgcHJpbnRmKCJcbiAgICAgICBzeW50aCB0aW1lIDogIik7CisgICAgaiA9ICh4Y3ZfYnVmW3B0cisrXSAtIDEpOwkJCS8qIGxlbiBvZiBkYXRlIHN0ciBsZXNzIHRlcm0gKi8KKyAgICBpZiAoaiA+IDMyKSBnb3RvIGJhZF9pbWFnZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJYnVmY2hhciA9ICh4Y3ZfYnVmW3B0cisrXSk7CisJaWYgKGJ1ZmNoYXI8JyAnIHx8IGJ1ZmNoYXI+J34nKSBidWZjaGFyID0gJy4nOworCXB1dGMoYnVmY2hhcik7CisgICAgfQorCisgICAgcHRyICs9IDM7CQkJCQkvKiBTa2lwIDIgYnl0ZXMgKi8KKyAgICBwcmludGYoIiAtICIpOworICAgIGogPSAoeGN2X2J1ZltwdHIrK10gLSAxKTsJCQkvKiBzbGVuID0gdGFyZyBkZXYgc3RyIGxlbiAqLworICAgIGlmIChqID4gMzIpIGdvdG8gYmFkX2ltYWdlOworICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKwlidWZjaGFyID0gKHhjdl9idWZbcHRyKytdKTsKKwlpZiAoYnVmY2hhcjwnICcgfHwgYnVmY2hhcj4nficpIGJ1ZmNoYXIgPSAnLic7CisJcHV0YyhidWZjaGFyKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIG91dHB1dCBjcmMgYW5kIGxlbmd0aCBzdHJpbmdzCisgICAgICovCisgICAgcHJpbnRmKCJcbiAgICAgICBsZW4gJiBjcmMgIDogMHglbHggIDB4JWx4IiwgbGVuLCBjcmMpOworCisgICAgLyoKKyAgICAgKiBQcm9ncmFtIHRoZSBGUEdBLgorICAgICAqLworICAgIHJldHZhbCA9IGZwZ2FEb3dubG9hZCgodW5zaWduZWQgY2hhciopeGN2X2J1ZiwgeGN2X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIHNob3J0ICopMHhmZDAwMDAwMEwpOworICAgIHJldHVybiByZXR2YWw7CisKK2JhZF9pbWFnZToKKyAgICBwcmludGYoIlxuICAgICAgIEJBRCBGUEdBIGltYWdlIGZvcm1hdCBAICVseFxuIiwgZmxhc2hfaW5mb1sxXS5zdGFydFswXSk7CisgICAgbG9nX3dhcm4oRVJSX1hJTUFHRSk7Citkb25lOgorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgdGVzdF9mcGdhKHVuc2lnbmVkIHNob3J0ICpkYWRkcikKK3sKKyAgICBpbnQgaTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqbmRlc3QgPSBkYWRkcjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBDT05GSUdfTlVNX0ZQR0FTOyBpKyspIHsKKyNpZiBkZWZpbmVkKENPTkZJR19XN09MTUcpCisJbmRlc3RbMHg3ZV0gPSAweDU1YWE7CisJaWYgKG5kZXN0WzB4N2VdICE9IDB4NTVhYSkKKwkgICAgbG9nX3dhcm4oRVJSX1hSVzEgKyBpKTsKKwluZGVzdFsweDdlXSA9IDB4YWE1NTsKKwlpZiAobmRlc3RbMHg3ZV0gIT0gMHhhYTU1KQorCSAgICBsb2dfd2FybihFUlJfWFJXMSArIGkpOworCW5kZXN0WzB4N2VdID0gMHhjMzE4OworCWlmIChuZGVzdFsweDdlXSAhPSAweGMzMTgpCisJICAgIGxvZ193YXJuKEVSUl9YUlcxICsgaSk7CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1c3T0xNQykKKwluZGVzdFsweDgwMF0gPSAweDU1YWE7CisJbmRlc3RbMHg4MDFdID0gMHhhYTU1OworCW5kZXN0WzB4ODAyXSA9IDB4YzMxODsKKwluZGVzdFsweDQ4MDBdID0gMHg1NWFhOworCW5kZXN0WzB4NDgwMV0gPSAweGFhNTU7CisJbmRlc3RbMHg0ODAyXSA9IDB4YzMxODsKKwlpZiAoKG5kZXN0WzB4ODAwXSAhPSAweDU1YWEpIHx8CisJICAgIChuZGVzdFsweDgwMV0gIT0gMHhhYTU1KSB8fAorCSAgICAobmRlc3RbMHg4MDJdICE9IDB4YzMxOCkpCisJICAgIGxvZ193YXJuKEVSUl9YUlcxICsgKDIgKiBpKSk7ICAgICAgIC8qIEF1dG8gZ2VuIGVycm9yIGNvZGUgKi8KKwlpZiAoKG5kZXN0WzB4NDgwMF0gIT0gMHg1NWFhKSB8fAorCSAgICAobmRlc3RbMHg0ODAxXSAhPSAweGFhNTUpIHx8CisJICAgIChuZGVzdFsweDQ4MDJdICE9IDB4YzMxOCkpCisJICAgIGxvZ193YXJuKEVSUl9YUlcyICsgKDIgKiBpKSk7ICAgICAgIC8qIEF1dG8gZ2VuIGVycm9yIGNvZGUgKi8KKworI2Vsc2UKKyMgZXJyb3IgIlVua25vd24gVzdPIGJvYXJkIGNvbmZpZ3VyYXRpb24iCisjZW5kaWYKKyAgICB9CisKKyAgICBwcmludGYoIiAgICAgICBGUEdBIHJlYWR5XG4iKTsKKyAgICByZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL2JvYXJkL3c3by9pbml0LlMgYi9ib2FyZC93N28vaW5pdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYmYyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC93N28vaW5pdC5TCkBAIC0wLDAgKzEsMjY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJIFRoaXMgc291cmNlIGNvZGUgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgdG8geW91IGJ5IElCTSBvbiBhbiBBUy1JUworICoJIGJhc2lzLgkgQW55b25lIHJlY2VpdmluZyB0aGlzIHNvdXJjZSBpcyBsaWNlbnNlZCB1bmRlciBJQk0KKyAqCSBjb3B5cmlnaHRzIHRvIHVzZSBpdCBpbiBhbnkgd2F5IGhlIG9yIHNoZSBkZWVtcyBmaXQsIGluY2x1ZGluZworICoJIGNvcHlpbmcgaXQsIG1vZGlmeWluZyBpdCwgY29tcGlsaW5nIGl0LCBhbmQgcmVkaXN0cmlidXRpbmcgaXQgZWl0aGVyCisgKgkgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMuCSBObyBsaWNlbnNlIHVuZGVyIElCTSBwYXRlbnRzIG9yCisgKgkgcGF0ZW50IGFwcGxpY2F0aW9ucyBpcyB0byBiZSBpbXBsaWVkIGJ5IHRoZSBjb3B5cmlnaHQgbGljZW5zZS4KKyAqCisgKgkgQW55IHVzZXIgb2YgdGhpcyBzb2Z0d2FyZSBzaG91bGQgdW5kZXJzdGFuZCB0aGF0IElCTSBjYW5ub3QgcHJvdmlkZQorICoJIHRlY2huaWNhbCBzdXBwb3J0IGZvciB0aGlzIHNvZnR3YXJlIGFuZCB3aWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IKKyAqCSBhbnkgY29uc2VxdWVuY2VzIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKgkgQW55IHBlcnNvbiB3aG8gdHJhbnNmZXJzIHRoaXMgc291cmNlIGNvZGUgb3IgYW55IGRlcml2YXRpdmUgd29yaworICoJIG11c3QgaW5jbHVkZSB0aGUgSUJNIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgcGFyYWdyYXBoLCBhbmQgdGhlCisgKgkgcHJlY2VkaW5nIHR3byBwYXJhZ3JhcGhzIGluIHRoZSB0cmFuc2ZlcnJlZCBzb2Z0d2FyZS4KKyAqCisgKgkgQ09QWVJJR0hUICAgSSBCIE0gICBDT1JQT1JBVElPTiAxOTk1CisgKgkgTElDRU5TRUQgTUFURVJJQUwgIC0gIFBST0dSQU0gUFJPUEVSVFkgT0YgSSBCIE0KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisKKyNkZWZpbmUgX0xJTlVYX0NPTkZJR19IIDEJLyogYXZvaWQgcmVhZGluZyBMaW51eCBhdXRvY29uZi5oIGZpbGUJKi8KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoJZXh0X2J1c19jbnRscl9pbml0CisgKgorICogRGVzY3JpcHRpb246CUNvbmZpZ3VyZXMgRUJDIENvbnRyb2xsZXIgYW5kIGEgZmV3IGJhc2ljIGNoaXAgc2VsZWN0cy4KKyAqCisgKgkJQ1MwIGlzIHNldHVwIHRvIGdldCB0aGUgQm9vdCBGbGFzaCBvdXQgb2YgdGhlIGFkZHJlc3NzIHJhbmdlCisgKgkJc28gdGhhdCB3ZSBtYXkgc2V0dXAgYSBzdGFjay4gIENTNyBpcyBzZXR1cCBzbyB0aGF0IHdlIGNhbgorICoJCWFjY2VzcyBhbmQgcmVzZXQgdGhlIGhhcmR3YXJlIHdhdGNoZG9nLgorICoKKyAqCQlJTVBPUlRBTlQ6IEZvciBwYXNzMSB0aGlzIGNvZGUgbXVzdCBydW4gZnJvbQorICoJCWNhY2hlIHNpbmNlIHlvdSBjYW4gbm90IHJlbGlhYmx5IGNoYW5nZSBhIHBlcmlwaGVyYWwgYmFua3MKKyAqCQl0aW1pbmcgcmVnaXN0ZXIgKHBieGFwKSB3aGlsZSBydW5uaW5nIGNvZGUgZnJvbSB0aGF0IGJhbmsuCisgKgkJRm9yIGV4Liwgc2luY2Ugd2UgYXJlIHJ1bm5pbmcgZnJvbSBST00gb24gYmFuayAwLCB3ZSBjYW4gTk9UCisgKgkJZXhlY3V0ZSB0aGUgY29kZSB0aGF0IG1vZGlmaWVzIGJhbmsgMCB0aW1pbmdzIGZyb20gUk9NLCBzbworICoJCXdlIHJ1biBpdCBmcm9tIGNhY2hlLgorICoKKyAqIE5vdGVzOglEb2VzIE5PVCB1c2UgdGhlIHN0YWNrLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS5zZWN0aW9uICIudGV4dCIKKwkuYWxpZ24JMgorCS5nbG9ibAlleHRfYnVzX2NudGxyX2luaXQKKwkudHlwZQlleHRfYnVzX2NudGxyX2luaXQsIEBmdW5jdGlvbgorZXh0X2J1c19jbnRscl9pbml0OgorCW1mbHIJcjAKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBQcmVmZXRjaCBlbnRpcmUgZXh0X2J1c19jbnRybF9pbml0IGZ1bmN0aW9uIGludG8gdGhlIGljYWNoZS4KKwkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlIHNhbWUgQ1Mgd2UKKwkgKiBhcmUgZXhlY3V0aW5nIGZyb20uICBPdGhlcndpc2UgYSBDUFUgbG9ja3VwIG1heSBvY2N1ci4KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlibAkuLmdldEFkZHIKKy4uZ2V0QWRkcjoKKwltZmxyCXIzCQkJLyogZ2V0IGFkZHJlc3Mgb2YgLi5nZXRBZGRyICovCisKKwkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGNhY2hlIGxpbmVzIGZvciB0aGlzIGZ1bmN0aW9uICovCisJYWRkaQlyNCwgMCwgKCgoLkxmZTAgLSAuLmdldEFkZHIpIC8gQ0ZHX0NBQ0hFTElORV9TSVpFKSArIDIpCisJbXRjdHIJcjQKKy4uZWJjbG9vcDoKKwlpY2J0CXIwLCByMwkJCS8qIHByZWZldGNoIGNhY2hlIGxpbmUgZm9yIGFkZHIgaW4gcjMqLworCWFkZGkJcjMsIHIzLCBDRkdfQ0FDSEVMSU5FX1NJWkUgLyogbW92ZSB0byBuZXh0IGNhY2hlIGxpbmUgKi8KKwliZG56CS4uZWJjbG9vcAkJLyogY29udGludWUgZm9yICRDVFIgY2FjaGUgbGluZXMgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIERlbGF5IHRvIGVuc3VyZSBhbGwgYWNjZXNzZXMgdG8gUk9NIGFyZSBjb21wbGV0ZSBiZWZvcmUgY2hhbmdpbmcKKwkgKiBiYW5rIDAgdGltaW5ncy4gMjAwdXNlYyBzaG91bGQgYmUgZW5vdWdoLgorCSAqIDIwMCwwMDAsMDAwIChjeWNsZXMvc2VjKSBYIC4wMDAyMDAgKHNlYykgPSAweDlDNDAgY3ljbGVzLgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWFkZGlzCXIzLCAwLCAweDAKKwlvcmkJcjMsIHIzLCAweEEwMDAJCS8qIHdhaXQgMjAwdXMgZnJvbSByZXNldCAqLworCW10Y3RyCXIzCisuLnNwaW5scDoKKwliZG56CS4uc3BpbmxwCQkvKiBzcGluIGxvb3AgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNldHVwIEV4dGVybmFsIEJ1cyBDb250cm9sbGVyIChFQkMpLgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWFkZGkJcjMsIDAsIGVwY3IKKwltdGRjcgllYmNjZmdhLCByMworCWFkZGlzCXI0LCAwLCAweGIwNDAJCS8qIERldmljZSBiYXNlIHRpbWVvdXQgPSAxMDI0IGN5Y2xlcyAqLworCW9yaQlyNCwgcjQsIDB4MAkJLyogRHJpdmUgQ1Mgd2l0aCBleHRlcm5hbCBtYXN0ZXIgKi8KKwltdGRjcgllYmNjZmdkLCByNAorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQ2hhbmdlIFBDSUlOVCBzaWduYWwgdG8gUGVyV0UKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwltZmRjcglyNCwgY250cmwxCisJb3JpCXI0LCByNCwgMHg0MDAwCisJbXRkY3IJY250cmwxLCByNAorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogTWVtb3J5IEJhbmsgMCAoRmxhc2ggQmFuayAwKSBpbml0aWFsaXphdGlvbgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWFkZGkJcjMsIDAsIHBiMGFwCisJbXRkY3IJZWJjY2ZnYSwgcjMKKwlhZGRpcwlyNCwgMCwgQ0ZHX1c3T19FQkNfUEIwQVBAaAorCW9yaQlyNCwgcjQsIENGR19XN09fRUJDX1BCMEFQQGwKKwltdGRjcgllYmNjZmdkLCByNAorCisJYWRkaQlyMywgMCwgcGIwY3IKKwltdGRjcgllYmNjZmdhLCByMworCWFkZGlzCXI0LCAwLCBDRkdfVzdPX0VCQ19QQjBDUkBoCisJb3JpCXI0LCByNCwgQ0ZHX1c3T19FQkNfUEIwQ1JAbAorCW10ZGNyCWViY2NmZ2QsIHI0CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBNZW1vcnkgQmFuayA3IExFRHMgLSBORUVERUQgQkVDQVVTRSBPRiBIVyBXQVRDSERPRyBBTkQgTEVEcy4KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlhZGRpCXIzLCAwLCBwYjdhcAorCW10ZGNyCWViY2NmZ2EsIHIzCisJYWRkaXMJcjQsIDAsIENGR19XN09fRUJDX1BCN0FQQGgKKwlvcmkJcjQsIHI0LCBDRkdfVzdPX0VCQ19QQjdBUEBsCisJbXRkY3IJZWJjY2ZnZCwgcjQKKworCWFkZGkJcjMsIDAsIHBiN2NyCisJbXRkY3IJZWJjY2ZnYSwgcjMKKwlhZGRpcwlyNCwgMCwgQ0ZHX1c3T19FQkNfUEI3Q1JAaAorCW9yaQlyNCwgcjQsIENGR19XN09fRUJDX1BCN0NSQGwKKwltdGRjcgllYmNjZmdkLCByNAorCisJLyogV2UgYXJlIGFsbCBkb25lICovCisJbXRscglyMAkJCS8qIFJlc3RvcmUgbGluayByZWdpc3RlciAqLworCWJscgkJCQkvKiBSZXR1cm4gdG8gY2FsbGluZyBmdW5jdGlvbiAqLworLkxmZTA6CS5zaXplCWV4dF9idXNfY250bHJfaW5pdCwuTGZlMC1leHRfYnVzX2NudGxyX2luaXQKKy8qIGVuZCBleHRfYnVzX2NudGxyX2luaXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoJc2RyYW1faW5pdAorICoKKyAqIERlc2NyaXB0aW9uOglDb25maWd1cmVzIFNEUkFNIG1lbW9yeSBiYW5rcy4KKyAqCisgKgkJU2VyaWFsIFByZXNlbmNlIERldGVjdCwgIlNQRCwiIHJlYWRzIHRoZSBTRFJBTSBFRVBST00KKyAqCQl2aWEgdGhlIElJQyBidXMgYW5kIHRoZW4gY29uZmlndXJlcyB0aGUgU0RSQU0gbWVtb3J5CisgKgkJYmFua3MgYXBwcm9wcmlhdGVseS4gSWYgQXV0byBNZW1vcnkgQ29uZmlndXJhdGlvbiBpcworICoJCWlzIG5vdCB1c2VkLCBpdCBpcyBhc3N1bWVkIHRoYXQgYSA0TUIgMTF4OHgyLCBub24tRUNDLAorICoJCVNEUkFNIGlzIHNvbGRlcmVkIGRvd24uCisgKgorICogTm90ZXM6CUV4cGVjdHMgdGhhdCB0aGUgc3RhY2sgaXMgYWxyZWFkeSBzZXR1cC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkuc2VjdGlvbiAiLnRleHQiCisJLmFsaWduCTIKKwkuZ2xvYmwJc2RyYW1faW5pdAorCS50eXBlCXNkcmFtX2luaXQsIEBmdW5jdGlvbgorc2RyYW1faW5pdDoKKwkvKiBzYXZlIHRoZSByZXR1cm4gaW5mbyBvbiBzdGFjayAqLworCW1mbHIJcjAJCQkvKiBHZXQgbGluayByZWdpc3RlciAqLworCXN0d3UJcjEsIC04KHIxKQkJLyogU2F2ZSBiYWNrIGNoYWluIGFuZCBtb3ZlIFNQICovCisJc3R3CXIwLCArMTIocjEpCQkvKiBTYXZlIGxpbmsgcmVnaXN0ZXIgKi8KKworCS8qCisJICogRmlyc3QgY2FsbCBzcGRfc2RyYW0gdG8gdHJ5IHRvIGluaXQgU0RSQU0gYWNjb3JkaW5nIHRvIHRoZQorCSAqIGNvbnRlbnRzIG9mIHRoZSBTUEQgRUVQUk9NLiAgSWYgdGhlIFNQRCBFRVBST00gaXMgYmxhbmsgb3IKKwkgKiBlcnJvbmlvdXMsIHNwZF9zZHJhbSByZXR1cm5zIDAgaW4gUjMuCisJICovCisJYmwJc3BkX3NkcmFtCisJYWRkaWMuCXIzLCByMywgMAkJLyogQ2hlY2sgZm9yIGVycm9yLCBzYXZlIGRyYW0gc2l6ZSAqLworCWJuZQkuLnNkcmlfZG9uZQkJLyogSWYgaXQgd29ya2VkLCB3ZSdyZSBkb25lLi4uICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBJZiBTUEQgZGV0ZWN0aW9uIGZhaWxzLCB3ZSdsbCBkZWZhdWx0IHRvIDRNQiwgMTF4OHgyLCBhcyB0aGlzCisJICogaXMgdGhlIFNNQUxMRVNUIFNEUkFNIHNpemUgdGhlIDQwNSBzdXBwb3J0cy4gIFdlIGNhbiBkbyB0aGlzCisJICogYmVjYXVzZSBXN08gYm9hcmRzIGhhdmUgc29sZGVyZWQgb24gUkFNLCBhbmQgdGhlcmUgd2lsbCBhbHdheXMKKwkgKiBiZSBzb21lIGFtb3VudCBwcmVzZW50LiAgSWYgd2Ugd2VyZSB1c2luZyBESU1Ncywgd2Ugc2hvdWxkIGhhbmcKKwkgKiB0aGUgYm9hcmQgaW5zdGVhZCwgc2luY2UgaXQgZG9lc24ndCBoYXZlIGFueSBSQU0gdG8gY29udGludWUKKwkgKiBydW5uaW5nIHdpdGguCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKgorCSAqIERpc2FibGUgbWVtb3J5IGNvbnRyb2xsZXIgdG8gYWxsb3cKKwkgKiB2YWx1ZXMgdG8gYmUgY2hhbmdlZC4KKwkgKi8KKwlhZGRpICAgIHIzLCAwLCBtZW1fbWNvcHQxCisJbXRkY3IgICBtZW1jZmdhLCByMworCWFkZGlzICAgcjQsIDAsIDB4MAorCW9yaSAgICAgcjQsIHI0LCAweDAKKwltdGRjciAgIG1lbWNmZ2QsIHI0CisKKwkvKgorCSAqIFNldCBNQjBDRiBmb3IgZXh0IGJhbmsgMC4gKDAtNE1CKSBBZGRyZXNzIE1vZGUgNSBzaW5jZSAxMXg4eDIKKwkgKiBBbGwgb3RoZXIgYmFua3MgYXJlIGRpc2FibGVkLgorCSAqLworCWFkZGkJcjMsIDAsIG1lbV9tYjBjZgorCW10ZGNyCW1lbWNmZ2EsIHIzCisJYWRkaXMJcjQsIDAsIDB4MDAwMAkJLyogQkE9MHgwLCBTWj00TUIgKi8KKwlvcmkJcjQsIHI0LCAweDgwMDEJCS8qIE1vZGUgaXMgNSwgMTF4OHgyb3I0LCBCRT1FbmFibGVkICovCisJbXRkY3IJbWVtY2ZnZCwgcjQKKworCS8qIENsZWFyIE1CMUNSLE1CMkNSLE1CM0NSIHRvIHR1cm4gb3RoZXIgYmFua3Mgb2ZmICovCisJYWRkaQlyNCwgMCwgMAkJLyogWmVybyB0aGUgZGF0YSByZWcgKi8KKworCWFkZGkJcjMsIHIzLCA0CQkvKiBQb2ludCB0byBNQjFDRiByZWcgKi8KKwltdGRjcgltZW1jZmdhLCByMwkJLyogU2V0IHRoZSBhZGRyZXNzICovCisJbXRkY3IJbWVtY2ZnZCwgcjQJCS8qIFplcm8gdGhlIHJlZyAqLworCisJYWRkaQlyMywgcjMsIDQJCS8qIFBvaW50IHRvIE1CMkNGIHJlZyAqLworCW10ZGNyCW1lbWNmZ2EsIHIzCQkvKiBTZXQgdGhlIGFkZHJlc3MgKi8KKwltdGRjcgltZW1jZmdkLCByNAkJLyogWmVybyB0aGUgcmVnICovCisKKwlhZGRpCXIzLCByMywgNAkJLyogUG9pbnQgdG8gTUIzQ0YgcmVnICovCisJbXRkY3IJbWVtY2ZnYSwgcjMJCS8qIFNldCB0aGUgYWRkcmVzcyAqLworCW10ZGNyCW1lbWNmZ2QsIHI0CQkvKiBaZXJvIHRoZSByZWcgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNldCB0aGUgU0RSQU0gVGltaW5nIHJlZywgU0RUUjEgYW5kIHRoZSByZWZyZXNoIHRpbWVyIHJlZywgUlRSLgorCSAqIFRvIHNldCB0aGUgYXBwcm9wcmlhdGUgdGltaW5ncywgd2UgYXNzdW1lIHNkcmFtIGlzCisJICogMTAwTUh6IChwYzEwMCBjb21wbGlhbnQpLgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyoKKwkgKiBTZXQgdXAgU0RUUjEKKwkgKi8KKwlhZGRpICAgIHIzLCAwLCBtZW1fc2R0cjEKKwltdGRjciAgIG1lbWNmZ2EsIHIzCisJYWRkaXMgICByNCwgMCwgMHgwMDg2CQkvKiBTRFRSMSB2YWx1ZSBmb3IgMTAwTWh6ICovCisJb3JpICAgICByNCwgcjQsIDB4NDAwRAorCW10ZGNyICAgbWVtY2ZnZCwgcjQKKworCS8qCisJICogU2V0IFJUUgorCSAqLworCWFkZGkgICAgcjMsIDAsIG1lbV9ydHIKKwltdGRjciAgIG1lbWNmZ2EsIHIzCisJYWRkaXMgICByNCwgMCwgMHgwNUYwCQkvKiBSVFIgcmVmcmVzaCB2YWwgPSAxNS42MjVtc0AxMDBNaHogKi8KKwltdGRjciAgIG1lbWNmZ2QsIHI0CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBEZWxheSB0byBlbnN1cmUgMjAwdXNlYyBoYXZlIGVsYXBzZWQgc2luY2UgcmVzZXQuIEFzc3VtZSB3b3JzdAorCSAqIGNhc2UgdGhhdCB0aGUgY29yZSBpcyBydW5uaW5nIDIwME1oejoKKwkgKgkgIDIwMCwwMDAsMDAwIChjeWNsZXMvc2VjKSBYIC4wMDAyMDAgKHNlYykgPSAweDlDNDAgY3ljbGVzCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJYWRkaXMgICByMywgMCwgMHgwMDAwCisJb3JpICAgICByMywgcjMsIDB4QTAwMAkJLyogV2FpdCAyMDB1cyBmcm9tIHJlc2V0ICovCisJbXRjdHIgICByMworLi5zcGlubHAyOgorCWJkbnogICAgLi5zcGlubHAyCQkvKiBzcGluIGxvb3AgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNldCBtZW1vcnkgY29udHJvbGxlciBvcHRpb25zIHJlZywgTUNPUFQxLgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWFkZGkgICAgcjMsIDAsIG1lbV9tY29wdDEKKwltdGRjciAgIG1lbWNmZ2EsIHIzCisJYWRkaXMgICByNCwgMCwgMHg4MEUwCQkvKiBEQ19FTj0xLFNSRT0wLFBNRT0wLE1FTUNISz0wICovCisJb3JpICAgICByNCwgcjQsIDB4MDAwMAkJLyogUkVHRU49MCxEUlc9MDAsQlJQRj0wMSxFQ0NERD0xICovCisJbXRkY3IgICBtZW1jZmdkLCByNAkJLyogRU1EVUxSPTEgKi8KKworLi5zZHJpX2RvbmU6CisJLyogcmVzdG9yZSBhbmQgcmV0dXJuICovCisJbHd6CXIwLCArMTIocjEpCQkvKiBHZXQgc2F2ZWQgbGluayByZWdpc3RlciAqLworCWFkZGkJcjEsIHIxLCArOAkJLyogUmVtb3ZlIGZyYW1lIGZyb20gc3RhY2sgKi8KKwltdGxyCXIwCQkJLyogUmVzdG9yZSBsaW5rIHJlZ2lzdGVyICovCisJYmxyCQkJCS8qIFJldHVybiB0byBjYWxsaW5nIGZ1bmN0aW9uICovCisuTGZlMToJLnNpemUJc2RyYW1faW5pdCwuTGZlMS1zZHJhbV9pbml0CisvKiBlbmQgc2RyYW1faW5pdCgpICovCisKZGlmZiAtLWdpdCBhL2JvYXJkL3c3by9wb3N0MS5TIGIvYm9hcmQvdzdvL3Bvc3QxLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxMGNjYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3c3by9wb3N0MS5TCkBAIC0wLDAgKzEsNzQ1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBCaWxsIEh1bnRlciwgV2F2ZSA3IE9wdGljcywgd2lsbGlhbS5odW50ZXJAbWVkaWFvbmUubmV0CisgKiAgYW5kCisgKiBFcmlrIFRoZWlzZW4sIFdhdmUgNyBPcHRpY3MsIGV0aGVpc2VuQG1pbmRzcHJpbmcuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqCVJvdXRpbmUgdG8gZXhlcmNpc2UgbWVtb3J5IGZvciB0aGUgYnJpbmdpbmcgdXAgb2Ygb3VyIGJvYXJkcy4KKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHBwYzR4eC5oPgorCisjZGVmaW5lIF9MSU5VWF9DT05GSUdfSCAxICAgICAgIC8qIGF2b2lkIHJlYWRpbmcgTGludXggYXV0b2NvbmYuaCBmaWxlICAqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorCisjaW5jbHVkZSAiZXJyb3JzLmgiCisKKyNkZWZpbmUgX0FTTUxBTkdVQUdFCisKKwkuZ2xvYmwJdGVzdF9zZHJhbQorCS5nbG9ibAl0ZXN0X2xlZAorCS5nbG9ibAlsb2dfc3RhdAorCS5nbG9ibAlsb2dfd2FybgorCS5nbG9ibAlsb2dfZXJyCisJLmdsb2JsICB0ZW1wX3VhcnRfaW5pdAorCS5nbG9ibCAgcG9zdF9wdXRzCisJLmdsb2JsICBkaXNwX2hleAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKiogICBUZXh0IFN0cmluZ3MgZm9yIGxvdyBsZXZlbCBwcmludGluZyAgICoqKioqKgorKioqKioqKiAgICAgICAgICBJbiBzZWN0aW9uIGdvdDIgICAgICAgICAgICAgICAqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERlZmluZSB0aGUgdGV4dCBzdHJpbmdzIGZvciBlcnJvcnMgYW5kIHdhcm5pbmdzLgorICogU3dpdGNoIHRvIC5kYXRhIHNlY3Rpb24uCisgKi8KKwkuc2VjdGlvbiAiLmRhdGEiCitlcnJfc3RyOiAJLmFzY2l6ICIqKiogUE9TVCBFUlJPUiAgID0gIgord2Fybl9zdHI6CS5hc2NpeiAiKioqIFBPU1QgV0FSTklORyA9ICIKK2VuZF9zdHI6ICAuYXNjaXogIlxyXG4iCisKKy8qCisgKiBFbnRlciB0aGUgbGFiZWxzIGluIEdsb2JhbCBFbnRyeSBUYWJsZSAoR09UKS4KKyAqIFN3aXRjaCB0byAuZ290MiBzZWN0aW9uLgorICovCisJU1RBUlRfR09UCisJR09UX0VOVFJZKGVycl9zdHIpCisJR09UX0VOVFJZKHdhcm5fc3RyKQorCUdPVF9FTlRSWShlbmRfc3RyKQorCUVORF9HT1QKKworLyoKKyAqIFN3aXRjaCAgYmFjayB0byAudGV4dCBzZWN0aW9uLgorICovCisJLnRleHQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiogICAgTEVEIHJlZ2lzdGVyIHRlc3QgICAqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0ZXN0X2xlZDoKKwkvKiBzYXZlIHRoZSByZXR1cm4gaW5mbyBvbiBzdGFjayAqLworCW1mbHIJcjAJCQkvKiBHZXQgbGluayByZWdpc3RlciAqLworCXN0d3UJcjEsIC0xMihyMSkJCS8qIFNhdmUgYmFjayBjaGFpbiBhbmQgbW92ZSBTUCAqLworCXN0dwlyMCwgKzE2KHIxKQkJLyogU2F2ZSBsaW5rIHJlZ2lzdGVyICovCisJc3R3CXI0LCArOChyMSkJCS8qIHNhdmUgUjQgKi8KKworCVdBVENIRE9HX1JFU0VUICAgICAgICAJCS8qIFJlc2V0IHRoZSB3YXRjaGRvZyAqLworCisJYWRkaSAgICByMywgMCwgRVJSX0ZGCQkvKiBmaXJzdCB0ZXN0IHZhbHVlIGlzIGZmZmYgKi8KKwlhZGRpCXI0LCByMywgMAkJLyogc2F2ZSBjb3B5IG9mIHBhdHRlcm4gKi8KKwlibAlzZXRfbGVkCQkJLyogc3RvcmUgZmlyc3QgdGVzdCB2YWx1ZSAqLworCWJsCWdldF9sZWQJCQkvKiByZWFkIGl0IGJhY2sgKi8KKwl4b3IuCXI0LCByNCwgcjMJCS8qIGNvbXBhcmUgdG8gb3JpZ2luYWwgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19XN09MTUMpCisJYW5kaS4gICByNCwgcjQsIDB4MDBmZgkJLyogbG1jIGhhcyA4IGJpdHMgKi8KKyNlbHNlCisJYW5kaS4gICByNCwgcjQsIDB4ZmZmZgkJLyogbG1nIGhhcyAxNiBiaXRzICovCisjZW5kaWYKKwliZXEgICAgIExFRDIJCQkvKiBuZXh0IHRlc3QgKi8KKwlhZGRpICAgIHIzLCAwLCBFUlJfTEVECQkvKiBlcnJvciBjb2RlID0gMSAqLworCWJsCWxvZ19lcnIJCQkvKiBkaXNwbGF5IGVycm9yIGFuZCBoYWx0ICovCitMRUQyOglhZGRpICAgIHIzLCAwLCBFUlJfMDAJCS8qIDJuZCB0ZXN0IHZhbHVlIGlzIDAwMDAgKi8KKwlhZGRpCXI0LCByMywgMAkJLyogc2F2ZSBjb3B5IG9mIHBhdHRlcm4gKi8KKwlibAlzZXRfbGVkCQkJLyogc3RvcmUgZmlyc3QgdGVzdCB2YWx1ZSAqLworCWJsCWdldF9sZWQJCQkvKiByZWFkIGl0IGJhY2sgKi8KKwl4b3IuCXI0LCByNCwgcjMJCS8qIGNvbXBhcmUgdG8gb3JpZ2luYWwgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19XN09MTUMpCisJYW5kaS4gICByNCwgcjQsIDB4MDBmZgkJLyogbG1jIGhhcyA4IGJpdHMgKi8KKyNlbHNlCisJYW5kaS4gICByNCwgcjQsIDB4ZmZmZgkJLyogbG1nIGhhcyAxNiBiaXRzICovCisjZW5kaWYKKwliZXEgICAgIExFRDMJCQkvKiBuZXh0IHRlc3QgKi8KKwlhZGRpICAgIHIzLCAwLCBFUlJfTEVECQkvKiBlcnJvciBjb2RlID0gMSAqLworCWJsCWxvZ19lcnIJCQkvKiBkaXNwbGF5IGVycm9yIGFuZCBoYWx0ICovCisKK0xFRDM6CS8qIHJlc3RvcmUgc3RhY2sgYW5kIHJldHVybiAqLworCWx3eglyMCwgKzE2KHIxKQkJLyogR2V0IHNhdmVkIGxpbmsgcmVnaXN0ZXIgKi8KKwltdGxyCXIwCQkJLyogUmVzdG9yZSBsaW5rIHJlZ2lzdGVyICovCisJbHd6CXI0LCArOChyMSkJCS8qIHJlc3RvcmUgcjQgKi8KKwlhZGRpCXIxLCByMSwgKzEyCQkvKiBSZW1vdmUgZnJhbWUgZnJvbSBzdGFjayAqLworCWJscgkJCQkvKiBSZXR1cm4gdG8gY2FsbGluZyBmdW5jdGlvbiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKiAgICAgU0RSQU0gVEVTVFMgICAgICAgICoqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Rlc3Rfc2RyYW06CisJLyogY2FsbGVkIHdpdGggbWVtIHNpemUgaW4gcjMgKi8KKwkvKiBzYXZlIHRoZSByZXR1cm4gaW5mbyBvbiBzdGFjayAqLworCW1mbHIJcjAJCQkvKiBHZXQgbGluayByZWdpc3RlciAqLworCXN0d3UJcjEsIC0xNihyMSkJCS8qIFNhdmUgYmFjayBjaGFpbiBhbmQgbW92ZSBTUCAqLworCXN0dwlyMCwgKzIwKHIxKQkJLyogU2F2ZSBsaW5rIHJlZ2lzdGVyICovCisJc3RtdwlyMzAsICs4KHIxKQkJLyogc2F2ZSBSMzAsUjMxICovCisJCQkJCS8qIHIzMCBpcyBsb2cyKG1lbSBzaXplKSAqLworCQkJCQkvKiByMzEgaXMgbWVtIHNpemUgKi8KKworCS8qIHRha2UgbG9nMiBvZiB0b3RhbCBtZW0gc2l6ZSAqLworCWFkZGkJcjMxLCByMywgMAkJLyogc2F2ZSB0b3RhbCBtZW0gc2l6ZSAqLworCWFkZGkJcjMwLCAwLCAwCQkvKiBjbGVhciByMzAgKi8KK2wyX2xvb3A6CisJc3J3aS4JcjMxLCByMzEsIDEJCS8qIHNoaWZ0IHJpZ2h0IDEgKi8KKwlhZGRpCXIzMCwgcjMwLCAxCQkvKiBjb3VudCBzaGlmdHMgKi8KKwlibmUJbDJfbG9vcAkJCS8qIGxvb3AgdGlsbCBkb25lICovCisJYWRkaQlyMzAsIHIzMCwgLTEJCS8qIGNvcnJlY3QgZm9yIG92ZXIgY291bnQgKi8KKwlhZGRpCXIzMSwgcjMsIDAJCS8qIHNhdmUgb3JpZ2luYWwgc2l6ZSAqLworCisJLyogbm93IGtpY2sgdGhlIGRvZyBhbmQgdGVzdCB0aGUgbWVtICovCisJV0FUQ0hET0dfUkVTRVQgICAgICAgIAkJLyogUmVzZXQgdGhlIHdhdGNoZG9nICovCisJYmwJRGF0YV9CdXN0ZXIJCS8qIHRlc3QgY3Jvc3NlZC9zaG9ydGVkIGRhdGEgbGluZXMgKi8KKwlhZGRpCXIzLCByMzAsIDAJCS8qIGdldCBsb2cyKG1lbXNpemUpICovCisJYWRkaQlyNCwgcjMxLCAwCQkvKiBnZXQgbWVtc2l6ZSAqLworCWJsCUdob3N0X0J1c3RlcgkJLyogdGVzdCBjcm9zc2VkL3Nob3J0ZWQgYWRkciBsaW5lcyAqLworCWFkZGkJcjMsIHIzMSwgMAkJLyogZ2V0IG1lbSBzaXplICovCisJYmwJQml0X0J1c3RlcgkJLyogY2hlY2sgZm9yIGJhZCBpbnRlcm5hbCBiaXRzICovCisKKwkvKiByZXN0b3JlIHN0YWNrIGFuZCByZXR1cm4gKi8KKwlsbXcJcjMwLCArOChyMSkJCS8qIFJlc3RvcmUgcjMwLCByMzEgKi8KKwlsd3oJcjAsICsyMChyMSkJCS8qIEdldCBzYXZlZCBsaW5rIHJlZ2lzdGVyICovCisJbXRscglyMAkJCS8qIFJlc3RvcmUgbGluayByZWdpc3RlciAqLworCWFkZGkJcjEsIHIxLCArMTYJCS8qIFJlbW92ZSBmcmFtZSBmcm9tIHN0YWNrICovCisJYmxyCQkJCS8qIFJldHVybiB0byBjYWxsaW5nIGZ1bmN0aW9uICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKiAgc2RyYW0gZGF0YSBidXMgdGVzdCAgICoqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRGF0YV9CdXN0ZXI6CisJLyogc2F2ZSB0aGUgcmV0dXJuIGluZm8gb24gc3RhY2sgKi8KKwltZmxyCXIwCQkJLyogR2V0IGxpbmsgcmVnaXN0ZXIgKi8KKwlzdHd1CXIxLCAtMjQocjEpCQkvKiBTYXZlIGJhY2sgY2hhaW4gYW5kIG1vdmUgU1AgKi8KKwlzdHcJcjAsICsyOChyMSkJCS8qIFNhdmUgbGluayByZWdpc3RlciAqLworCXN0bXcJcjI4LCA4KHIxKQkJLyogc2F2ZSByMjggLSByMzEgb24gc3RhY2sgKi8KKwkJCQkJLyogcjMxIGkvbyByZWdpc3RlciAqLworCQkJCQkvKiByMzAgc2RyYW0gYmFzZSBhZGRyZXNzICovCisJCQkJCS8qIHIyOSA1NTU1IHN5bmRyb20gKi8KKwkJCQkJLyogcjI4IGFhYWEgc3luZHJvbSAqLworCisJLyogc2V0IHVwIGxlZCByZWdpc3RlciBmb3IgdGhpcyB0ZXN0ICovCisJYWRkaSAgICByMywgMCwgRVJSX1JBTUcJCS8qIHNldCBsZWQgY29kZSB0byAxICovCisJYmwJbG9nX3N0YXQJCS8qIHN0b3JlIHRlc3QgdmFsdWUgKi8KKwkvKiBub3cgdGVzdCB0aGUgZHJhbSBkYXRhIGJ1cyAqLworCXhvcglyMzAsIHIzMCwgcjMwCQkvKiBsb2FkIHIzMCB3aXRoIGJhc2UgYWRkciBvZiBzZHJhbSAqLworCWFkZGlzCXIzMSwgMCwgMHg1NTU1CQkvKiBsb2FkIHIzMSB3aXRoIHRlc3QgdmFsdWUgKi8KKwlvcmkJcjMxLCByMzEsIDB4NTU1NQorCXN0dwlyMzEsMChyMzApCQkvKiBzdG8gdGhlIHZhbHVlICovCisJbHd6CXIyOSwwKHIzMCkJCS8qIHJlYWQgaXQgYmFjayAqLworCXhvcglyMjkscjMxLHIyOQkJLyogY29tcGFyZSBpdCB0byBvcmlnaW5hbCAqLworCWFkZGlzCXIzMSwgMCwgMHhhYWFhCQkvKiBsb2FkIHIzMSB3aXRoIHRlc3QgdmFsdWUgKi8KKwlvcmkJcjMxLCByMzEsIDB4YWFhYQorCXN0dwlyMzEsMChyMzApCQkvKiBzdG8gdGhlIHZhbHVlICovCisJbHd6CXIyOCwwKHIzMCkJCS8qIHJlYWQgaXQgYmFjayAqLworCXhvcglyMjgscjMxLHIyOAkJLyogY29tcGFyZSBpdCB0byBvcmlnaW5hbCAqLworCW9yCXIzLHIyOCxyMjkJCS8qIG9yIHRvZ2V0aGVyIGJvdGggZXJyb3IgdGVybXMgKi8KKwkvKgorCSAqIE5vdyB0aGF0IHdlIGhhdmUgdGhlIGVycm9yIGJpdHMsCisJICogd2UgaGF2ZSB0byBkZWNpZGUgd2hpY2ggcGFydCB0aGV5IGFyZSBpbi4KKwkgKi8KKwlibAlnZXRfaWR4CQkJLyogcjUgaXMgbm93IGluZGV4IHRvIGVycm9yICovCisJYWRkaQlyMywgcjMsIEVSUl9SQU1HCisJY21wd2kJcjMsIEVSUl9SQU1HCQkvKiBjaGVjayBmb3IgZXJyb3JzICovCisJYmVxCWRiX2RvbmUJCQkvKiBza2lwIGlmIG5vIGVycm9ycyAqLworCWJsCWxvZ19lcnIJCQkvKiBsb2cgdGhlIGVycm9yICovCisKK2RiX2RvbmU6CisJbG13CXIyOCwgOChyMSkJCS8qIHJlc3RvcmUgcjI4IC0gcjMxIGZyb20gc3RhY2sgKi8KKwlsd3oJcjAsICsyOChyMSkJCS8qIEdldCBzYXZlZCBsaW5rIHJlZ2lzdGVyICovCisJYWRkaQlyMSwgcjEsICsyNAkJLyogUmVtb3ZlIGZyYW1lIGZyb20gc3RhY2sgKi8KKwltdGxyCXIwCQkJLyogUmVzdG9yZSBsaW5rIHJlZ2lzdGVyICovCisJYmxyCQkJCS8qIFJldHVybiB0byBjYWxsaW5nIGZ1bmN0aW9uICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKiAgdGVzdCBmb3IgYWRkcmVzcyBnaG9zdGluZyBpbiBkcmFtICoqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitHaG9zdF9CdXN0ZXI6CisJLyogc2F2ZSB0aGUgcmV0dXJuIGluZm8gb24gc3RhY2sgKi8KKwltZmxyCXIwCQkJLyogR2V0IGxpbmsgcmVnaXN0ZXIgKi8KKwlzdHd1CXIxLCAtMzYocjEpCQkvKiBTYXZlIGJhY2sgY2hhaW4gYW5kIG1vdmUgU1AgKi8KKwlzdHcJcjAsICs0MChyMSkJCS8qIFNhdmUgbGluayByZWdpc3RlciAqLworCXN0bXcJcjI1LCA4KHIxKQkJLyogc2F2ZSByMjUgLSByMzEgb24gc3RhY2sgKi8KKwkJCQkJLyogcjMxID0gc2NyYXRjaCByZWdpc3RlciAqLworCQkJCQkvKiByMzAgaXMgbWFpbiByZWZlcmFuY2UgbG9vcCBjb3VudGVyLAorCQkJCQkgICAwIHRvIDIzICovCisJCQkJCS8qIHIyOSBpcyBnaG9zdCBsb29wIGNvdW50LCAwIHRvIDIyICovCisJCQkJCS8qIHIyOCBpcyByZWZlcmFuY2UgYWRkcmVzcyAqLworCQkJCQkvKiByMjcgaXMgZ2hvc3QgYWRkcmVzcyAqLworCQkJCQkvKiByMjYgaXMgbG9nMiAobWVtIHNpemUpID0KKwkJCQkJICAgICBudW1iZXIgb2YgYnl0ZSBhZGRyIGJpdHMgKi8KKwkJCQkJLyogcjI1IGlzIG1lbSBzaXplICovCisKKwkvKiBzYXZlIHRoZSBsb2cyKG1lbSBzaXplKSBhbmQgbWVtIHNpemUgKi8KKwlhZGRpCXIyNiwgcjMsIDAJCS8qIHIyNiBpcyBudW1iZXIgb2YgYnl0ZSBhZGRyIGJpdHMgKi8KKwlhZGRpCXIyNSwgcjQsIDAJCS8qIHIyNSBpcyBtZW0gc2l6ZSBpbiBieXRlcyAqLworCisJLyogc2V0IHRoZSBsZWRzIGZvciBhZGRyZXNzIGdob3N0IHRlc3QgKi8KKwlhZGRpCXIzLCAwLCBFUlJfQURERworCWJsCXNldF9sZWQKKworCS8qIGZpcnN0IGZpbGwgbWVtb3J5IHdpdGggemVyb3MgKi8KKwlzcndpCXIzMSwgcjI1LCAyCQkvKiBjb252ZXJ0IGJ5dGVzIHRvIGxvbmdzICovCisJbXRjdHIJcjMxCQkJLyogc2V0dXAgYnl0ZSBjb3VudGVyICovCisJYWRkaQlyMjgsIDAsIDAJCS8qIHN0YXJ0IGF0IGFkZHJlc3MgYXQgMCAqLworCWFkZGkJcjMxLCAwLCAwCQkvKiBkYXRhIHZhbHVlID0gMCAqLworY2xyX2xvb3A6CisJc3R3CXIzMSwgMChyMjgpCQkvKiBTdG9yZSB6ZXJvIHZhbHVlICovCisJYWRkaQlyMjgsIHIyOCwgNAkJLyogSW5jcmVtZW50IHRvIG5leHQgd29yZCAqLworCWFuZGkuCXIyNywgcjI4LCAweGZmZmYJLyogY2hlY2sgZm9yIDJeMTYgbG9vcHMgKi8KKwlibmUJY2xyX3NraXAJCS8qIGlmIG5vdCB0aGVyZSwgdGhlbiBza2lwICovCisJV0FUQ0hET0dfUkVTRVQgICAJCS8qIGtpY2sgdGhlIGRvZyBldmVyeSBub3cgYW5kIHRoZW4gKi8KK2Nscl9za2lwOgorCWJkbnoJY2xyX2xvb3AJCS8qIFJvdW5kIGFuZCByb3VuZC4uLiAqLworCisJLyogbm93IGRvIG1haW4gdGVzdCAqLworCWFkZGkJcjMwLCAwLCAwCQkvKiBzdGFydCByZWZlcmFuY2UgY291bnRlciBhdCAwICovCitvdXRzaWRlOgorCS8qCisJICogQ2FsY3VsYXRlIHRoZSByZWZlcmFuY2UgYWRkcmVzcworCSAqICAgdGhlIHJlZmVyYW5jZSBhZGRyZXNzIGlzIGNhbGN1bGF0ZWQgYnkgc2V0dGluZyB0aGUgKHIzMC0xKQorCSAqICAgYml0IG9mIHRoZSBiYXNlIGFkZHJlc3MKKwkgKiB3aGVuIHIzMD0wLCB0aGUgcmVmZXJhbmNlIGFkZHJlc3MgaXMgdGhlIGJhc2UgYWRkcmVzcy4KKwkgKiB0aHVzIHRoZSBzZXF1ZW5jZSAwLDEsMiw0LDgsLi4sMl4obi0xKQorCSAqIHNldHRpbmcgdGhlIGJpdCBpcyBkb25lIHdpdGggdGhlIGZvbGxvd2luZyBzaGlmdCBmdW5jdGlvbnMuCisJICovCisJV0FUQ0hET0dfUkVTRVQgICAJCS8qIFJlc2V0IHRoZSB3YXRjaGRvZyAqLworCisJYWRkaQlyMzEsIDAsIDEJCS8qIHIzMSA9IDEgKi8KKwlzbHcJcjI4LCByMzEsIHIzMAkJLyogc2V0IGJpdCBjb3Jlc3BvbmRpbmcgdG8gbG9vcCBjbnQgKi8KKwlzcndpCXIyOCwgcjI4LCAxCQkvKiB0aGVuIHNoaWZ0IGl0IHJpZ2h0IG9uZSBzbyAgKi8KKwkJCQkJLyogICB3ZSBzdGFydCBhdCBsb2NhdGlvbiAwICovCisJLyogZmlsbCByZWZlcmFuY2UgYWRkcmVzcyB3aXRoIEZzICovCisJYWRkaQlyMzEsIDAsIDB4MDBmZgkJLyogcjMxID0gb25lIGJ5dGUgb2Ygc2V0IGJpdHMgKi8KKwlzdGIgICAgIHIzMSwwKHIyOCkJCS8qIHNhdmUgZmYgaW4gcmVmZXJhbmNlIGFkZHJlc3MgKi8KKworICAgICAgICAvKiBnaG9zdCAoaW5uZXIpIGxvb3AsIG5vdyBjaGVjayBhbGwgcG9zaWJsZSBnaG9zdGVkIGFkZHJlc3NlcyAqLworCWFkZGkJcjI5LCAwLCAwCQkvKiBzdGFydCBnaG9zdGVkIGxvb3AgY291bnRlciBhdCAwICovCitpbnNpZGU6CisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIGdob3N0IGFkZHJlc3MgYnkgZmxpcHBpbmcgb25lCisJICogIGJpdCBvZiByZWZlcmFuY2UgYWRkcmVzcy4gIFRoaXMgZ2l2ZXMgdGhlCisJICogIHNlcXVlbmNlIDEsMiw0LDgsLi4uLDJeKG4tMSkKKwkgKi8KKwlhZGRpCXIzMSwgMCwgMQkJLyogcjMxID0gMSAqLworCXNsdyAgICAgcjI3LCByMzEsIHIyOQkJLyogc2V0ICBiaXQgY29yZXNwb25kaW5nIHRvIGxvb3AgY250ICovCisJeG9yCXIyNywgcjI4LCByMjcJCS8qIGdob3N0IGFkZHJlc3MgPSByZWYgYWRkciB3aXRoCisJCQkJCSAgICAgYml0IGZsaXBwZWQqLworCisJLyogbm93IGNoZWNrIGZvciBnaG9zdGluZyAqLworCWxieiAgICAgcjMxLDAocjI3KQkJLyogZ2V0IGNvbnRlbnQgb2YgZ2hvc3QgYWRkciAqLworCWNtcHdpICAgcjMxLCAwCQkJLyogY29tcGFyZSByZWFkIHZhbHVlIHRvIDAgKi8KKwlibmUJQ2FzcGVyCQkJLyogICB3ZSBmb3VuZCBhIGdob3N0ISAqLworCisJLyogbm93IGNsb3NlIGdob3N0ICggaW5uZXIgKSBsb29wICovCisJYWRkaSAJcjI5LCByMjksIDEJCS8qIGluY3JlbWVudCBpbm5lciBsb29wIGNvdW50ZXIgKi8KKwljbXB3IAlyMjksIHIyNgkJLyogY2hlY2sgZm9yIGxhc3QgaW5uZXIgbG9vcCAqLworCWJsdAkJaW5zaWRlCQkvKiBkbyBtb3JlIGlubmVyIGxvb3BzICovCisKKwkvKiBub3cgY2xvc2UgcmVmZXJhbmNlICggb3V0ZXIgKSBsb29wICovCisJYWRkaSAJcjMxLCAwLCAwIAkJLyogcjMxID0gemVybyAqLworCXN0YglyMzEsIDAoMjgpCQkvKiB6ZXJvIG91dCB0aGUgYWx0ZXJlZCBhZGRyZXNzIGxvYy4gKi8KKwkvKgorCSAqIEluY3JlbWVudCBhbmQgY2hlY2sgZm9yIGVuZCwgY291bnQgaXMgemVybyBiYXNlZC4KKwkgKiBXaXRoIHRoZSBibGUsIHRoaXMgZ2l2ZXMgdXMgb25lIG1vcmUgbG9vcHMgdGhhbgorCSAqIGFkZHJlc3MgYml0cyBmb3Igc2VxdWVuY2UgMCwxLDIsNCw4LC4uLjJeKG4tMSkKKwkqLworCWFkZGkgCXIzMCwgcjMwLCAxCQkvKiBpbmNyZW1lbnQgb3V0ZXIgbG9vcCBjb3VudGVyICovCisJY21wdyAJcjMwLCByMjYJCS8qIGNoZWNrIGZvciBsYXN0IGlubmVyIGxvb3AgKi8KKwlibGUJb3V0c2lkZQkJCS8qIGRvIG1vcmUgb3V0ZXIgbG9vcHMgKi8KKworCS8qIHdlcmUgZG9uZSwgbGV0cyBnbyBob21lICovCisJYglnYl9kb25lCitDYXNwZXI6CQkJCQkvKiB3ZSBmb3VuZCBhIGdob3N0ICEhICovCisJYWRkaQlyMywgMCwgRVJSX0FEREYJCS8qIGdldCBpbmRleGVkIGVycm9yIG1lc3NhZ2UgKi8KKwlibAlsb2dfZXJyCQkJLyogbG9nIGVycm9yIGxlZCBlcnJvciBjb2RlICovCitnYl9kb25lOiAvKiAgcGFjayB5b3VyIGJhZ3MsIGFuZCBnbyBob21lICovCisgICAgICAgIGxtdyAgICAgcjI1LCA4KHIxKSAgICAgICAgICAgICAgLyogcmVzdG9yZSByMjUgLSByMzEgZnJvbSBzdGFjayAqLworICAgICAgICBsd3ogICAgIHIwLCArNDAocjEpICAgICAgICAgICAgIC8qIEdldCBzYXZlZCBsaW5rIHJlZ2lzdGVyICovCisgICAgICAgIGFkZGkgICAgcjEsIHIxLCArMzYgICAgICAgICAgICAgLyogUmVtb3ZlIGZyYW1lIGZyb20gc3RhY2sgKi8KKyAgICAgICAgbXRsciAgICByMCAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIGxpbmsgcmVnaXN0ZXIgKi8KKyAgICAgICAgYmxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdG8gY2FsbGluZyBmdW5jdGlvbiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqICAgICAgU0RSQU0gZGF0YSBmaWxsIHRlc3RzICAgICAgICoqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCaXRfQnVzdGVyOgorCS8qIGNhbGxlZCB3aXRoIG1lbSBzaXplIGluIHIzICovCisJLyogc2F2ZSB0aGUgcmV0dXJuIGluZm8gb24gc3RhY2sgKi8KKwltZmxyCXIwCQkJLyogR2V0IGxpbmsgcmVnaXN0ZXIgKi8KKwlzdHd1CXIxLCAtMTYocjEpCQkvKiBTYXZlIGJhY2sgY2hhaW4gYW5kIG1vdmUgU1AgKi8KKwlzdHcJcjAsICsyMChyMSkJCS8qIFNhdmUgbGluayByZWdpc3RlciAqLworCXN0dwlyNCwgKzgocjEpCQkvKiBzYXZlIFI0ICovCisJc3R3CXI1LCArMTIocjEpCQkvKiBzYXZlIHI1ICovCisKKwlhZGRpcwlyNSwgcjMsIDAJCS8qIHNhdmUgbWVtIHNpemUgKi8KKworCS8qIFRlc3QgNTU1NTU1NTUgKi8KKwlhZGRpCXIzLCAwLCBFUlJfUjU1RwkJLyogc2V0IHVwIGVycm9yIGNvZGUgaW4gY2FzZSB3ZSBmYWlsICovCisJYmwJbG9nX3N0YXQJCS8qIHN0b3JlIHRlc3QgdmFsdWUgKi8KKwlhZGRpcwlyNCwgMCwgMHg1NTU1CisJb3JpCXI0LCByNCwgMHg1NTU1CisJYmwJZmlsbF90ZXN0CisKKwkvKiBUZXN0IGFhYWFhYWFhICAqLworCWFkZGkJcjMsIDAsIEVSUl9SQUFHCQkvKiBzZXQgdXAgZXJyb3IgY29kZSBpbiBjYXNlIHdlIGZhaWwgKi8KKwlibAlsb2dfc3RhdAkJLyogc3RvcmUgdGVzdCB2YWx1ZSAqLworCWFkZGlzCXI0LCAwLCAweEFBQUEKKwlvcmkJcjQsIHI0LCAweEFBQUEKKwlibAlmaWxsX3Rlc3QKKworCS8qIFRlc3QgMDAwMDAwMDAgICovCisJYWRkaQlyMywgMCwgRVJSX1IwMEcJCS8qIHNldCB1cCBlcnJvciBjb2RlIGluIGNhc2Ugd2UgZmFpbCAqLworCWJsCWxvZ19zdGF0CQkvKiBzdG9yZSB0ZXN0IHZhbHVlICovCisJYWRkaXMJcjQsIDAsIDAKKwlvcmkJcjQsIHI0LCAwCisJYmwJZmlsbF90ZXN0CisKKwkvKiByZXN0b3JlIHN0YWNrIGFuZCByZXR1cm4gKi8KKwlsd3oJcjUsICsxMihyMSkJCS8qIHJlc3RvcmUgcjQgKi8KKwlsd3oJcjQsICs4KHIxKQkJLyogcmVzdG9yZSByNCAqLworCWx3eglyMCwgKzIwKHIxKQkJLyogR2V0IHNhdmVkIGxpbmsgcmVnaXN0ZXIgKi8KKwlhZGRpCXIxLCByMSwgKzE2CQkvKiBSZW1vdmUgZnJhbWUgZnJvbSBzdGFjayAqLworCW10bHIJcjAJCQkvKiBSZXN0b3JlIGxpbmsgcmVnaXN0ZXIgKi8KKwlibHIJCQkJLyogUmV0dXJuIHRvIGNhbGxpbmcgZnVuY3Rpb24gKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiogICAgICAgICAgICAgZmlsbCB0ZXN0ICAgICAgICAgICAgICAqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCXRlc3RzIG1lbW9yeSBieSBmaWxsaW5nIHdpdGggdmFsdWUsIGFuZCByZWFkaW5nIGJhY2sgKi8KKy8qCXI1ID0gU2l6ZSBvZiBtZW1vcnkgaW4gYnl0ZXMgKi8KKy8qCXI0ID0gVmFsdWUgdG8gd3JpdGUgKi8KKy8qCXIzID0gRXJyb3IgY29kZSAqLworZmlsbF90ZXN0OgorICAgICAgICBtZmxyICAgIHIwICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCBsaW5rIHJlZ2lzdGVyICovCisgICAgICAgIHN0d3UgICAgcjEsIC0zMihyMSkgICAgICAgICAgICAgLyogU2F2ZSBiYWNrIGNoYWluIGFuZCBtb3ZlIFNQICovCisgICAgICAgIHN0dyAgICAgcjAsICszNihyMSkgICAgICAgICAgICAgLyogU2F2ZSBsaW5rIHJlZ2lzdGVyICovCisgICAgICAgIHN0bXcgICAgcjI3LCA4KHIxKSAgICAgICAgICAgICAgLyogc2F2ZSByMjcgLSByMzEgb24gc3RhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByMzEgLSBzY3JhdGNoIHJlZ2lzdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcjMwIC0gbWVtb3J5IGFkZHJlc3MgKi8KKwltcglyMjcsIHIzCisJbXIJcjI4LCByNAorCW1yCXIyOSwgcjUKKworCVdBVENIRE9HX1JFU0VUICAgCQkvKiBSZXNldCB0aGUgd2F0Y2hkb2cgKi8KKworCS8qIGZpcnN0IGZpbGwgbWVtb3J5IHdpdGggVmFsdWUgKi8KKwlzcmF3aQlyMzEsIHIyOSwgMgkJLyogY29udmVydCBieXRlcyB0byBsb25ncyAqLworCW10Y3RyCXIzMQkJCS8qIHNldHVwIGNvdW50ZXIgKi8KKwlhZGRpCXIzMCwgMCwgMAkJLyogTWFrZSByMzAgPSBhZGRyIDAgKi8KK2Z0XzA6CXN0dwlyMjgsIDAocjMwKQkJLyogU3RvcmUgdmFsdWUgKi8KKwlhZGRpCXIzMCwgcjMwLCA0CQkvKiBJbmNyZW1lbnQgdG8gbmV4dCB3b3JkICovCisJYW5kaS4JcjMxLCByMzAsIDB4ZmZmZgkvKiBjaGVjayBmb3IgMl4xNiBsb29wcyAqLworCWJuZQlmdF8wYQkJCS8qIGlmIG5vdCB0aGVyZSwgdGhlbiBza2lwICovCisJV0FUQ0hET0dfUkVTRVQgICAJCS8qIGtpY2sgdGhlIGRvZyBldmVyeSBub3cgYW5kIHRoZW4gKi8KK2Z0XzBhOgliZG56CWZ0XzAJCQkvKiBSb3VuZCBhbmQgcm91bmQuLi4gKi8KKworCVdBVENIRE9HX1JFU0VUICAgCQkvKiBSZXNldCB0aGUgd2F0Y2hkb2cgKi8KKworCS8qIE5vdyBjb25maXJtIFZhbHVlIGlzIGluIG1lbW9yeSAqLworCXNyYXdpCXIzMSwgcjI5LCAyCQkvKiBjb252ZXJ0IGJ5dGVzIHRvIGxvbmdzICovCisJbXRjdHIJcjMxCQkJLyogc2V0dXAgY291bnRlciAqLworCWFkZGkJcjMwLCAwLCAwCQkvKiBNYWtlIHIzMCA9IGFkZHIgMCAqLworZnRfMToJbHd6CXIzMSwgMChyMzApCQkvKiBnZXQgdmFsdWUgZnJvbSBtZW1vcnkgKi8KKyAgICAgICAgeG9yLglyMzEsIHIzMSwgcjI4CQkvKiBXcml0ZW4gPSBSZWFkID8gKi8KKyAgICAgICAgYm5lCWZ0X2VycgkJCS8qIElmIGJhZCwgdGhhbiBoYWx0ICovCisJYWRkaQlyMzAsIHIzMCwgNAkJLyogSW5jcmVtZW50IHRvIG5leHQgd29yZCAqLworCWFuZGkuCXIzMSwgcjMwLCAweGZmZmYJLyogY2hlY2sgZm9yIDJeMTYgbG9vcHMqLworCWJuZQlmdF8xYQkJCS8qIGlmIG5vdCB0aGVyZSwgdGhlbiBza2lwICovCisJV0FUQ0hET0dfUkVTRVQJCQkvKiBraWNrIHRoZSBkb2cgZXZlcnkgbm93IGFuZCB0aGVuICovCitmdF8xYToJYmRueglmdF8xCQkJLyogUm91bmQgYW5kIHJvdW5kLi4uICovCisKKwlXQVRDSERPR19SRVNFVCAgIAkJLyogUmVzZXQgdGhlIHdhdGNoZG9nICovCisKKwliCWZpbGxfZG9uZQkJLyogcmVzdG9yZSBhbmQgcmV0dXJuICovCisKK2Z0X2VycjoJYWRkaQlyMjksIHIyNywgMAkJLyogc2F2ZSBjdXJyZW50IGxlZCBjb2RlICovCisJYWRkaQlyMjcsIHIzMSwgMAkJLyogZ2V0IHBhdHRlcm4gaW4gcjI3ICovCisJYmwJZ2V0X2lkeAkJCS8qIGdldCBpbmRleCBmcm9tIHIyNyAqLworCWFkZAlyMjcsIHIyNywgcjI5CQkvKiBhZGQgaW5kZXggdG8gb2xkIGxlZCBjb2RlICovCisJYmwJbG9nX2VycgkJCS8qIG91dHB1dCBsZWQgZXJyIGNvZGUsIGhhbHQgQ1BVICovCisKK2ZpbGxfZG9uZToKKyAgICAgICAgbG13ICAgICByMjcsIDgocjEpICAgICAgICAgICAgICAvKiByZXN0b3JlIHIyNyAtIHIzMSBmcm9tIHN0YWNrICovCisgICAgICAgIGx3eiAgICAgcjAsICszNihyMSkgICAgICAgICAgICAgLyogR2V0IHNhdmVkIGxpbmsgcmVnaXN0ZXIgKi8KKyAgICAgICAgYWRkaSAgICByMSwgcjEsICszMiAgICAgICAgICAgICAvKiBSZW1vdmUgZnJhbWUgZnJvbSBzdGFjayAqLworICAgICAgICBtdGxyICAgIHIwICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgbGluayByZWdpc3RlciAqLworICAgICAgICBibHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiB0byBjYWxsaW5nIGZ1bmN0aW9uICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICBnZXQgZXJyb3IgaW5kZXggZnJvbSByMyBwYXR0ZXJuICAgICoqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZ2V0X2lkeDoJCQkJLyogcjMgPSAoTVNXKHIzKSAhPTApKjIgKworCQkJCQkgICAgKExTVyhyMykgIT0wKSAqLworCS8qIHNhdmUgdGhlIHJldHVybiBpbmZvIG9uIHN0YWNrICovCisJbWZscglyMAkJCS8qIEdldCBsaW5rIHJlZ2lzdGVyICovCisJc3R3dQlyMSwgLTEyKHIxKQkJLyogU2F2ZSBiYWNrIGNoYWluIGFuZCBtb3ZlIFNQICovCisJc3R3CXIwLCArMTYocjEpCQkvKiBTYXZlIGxpbmsgcmVnaXN0ZXIgKi8KKwlzdHcJcjQsICs4KHIxKQkJLyogc2F2ZSBSNCAqLworCisJYW5kaS4JcjQsIHIzLCAweGZmZmYJCS8qIGNoZWNrIGZvciBsb3dlciBiaXRzICovCisJYmVxCWdpMgkJCS8qIHNraXAgaWYgbm8gYml0cyBzZXQgKi8KKwlhbmRpcy4JcjQsIHIzLCAweGZmZmYJCS8qIGNoZWNrIGZvciB1cHBlciBiaXRzICovCisJYmVxCWdpMwkJCS8qIHNraXAgaWYgbm8gYml0cyBzZXQgKi8KKwlhZGRpCXIzLCAwLCAzCQkvKiBib3RoIHVwcGVyIGFuZCBsb3dlciBiaXRzIHNldCAqLworCWIJZ2lfZG9uZQorZ2kyOglhbmRpcy4JcjQsIHIzLCAweGZmZmYJCS8qIGNoZWNrIGZvciB1cHBlciBiaXRzKi8KKwliZXEJZ2k0CQkJLyogc2tpcCBpZiBubyBiaXRzIHNldCAqLworCWFkZGkJcjMsIDAsIDIJCS8qIG9ubHkgdXBwZXIgYml0cyBzZXQgKi8KKwliCWdpX2RvbmUKK2dpMzoJYWRkaQlyMywgMCwgMQkJLyogb25seSBsb3dlciBiaXRzIHNldCAqLworCWIJZ2lfZG9uZQorZ2k0OglhZGRpCXIzLCAwLCAwCQkvKiBubyBiaXRzIHNldCAqLworZ2lfZG9uZToKKwkvKiByZXN0b3JlIHN0YWNrIGFuZCByZXR1cm4gKi8KKwlsd3oJcjAsICsxNihyMSkJCS8qIEdldCBzYXZlZCBsaW5rIHJlZ2lzdGVyICovCisJbXRscglyMAkJCS8qIFJlc3RvcmUgbGluayByZWdpc3RlciAqLworCWx3eglyNCwgKzgocjEpCQkvKiByZXN0b3JlIHI0ICovCisJYWRkaQlyMSwgcjEsICsxMgkJLyogUmVtb3ZlIGZyYW1lIGZyb20gc3RhY2sgKi8KKwlibHIJCQkJLyogUmV0dXJuIHRvIGNhbGxpbmcgZnVuY3Rpb24gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKiAgICAgICBzZXQgTEVEIHRvIFI1IGFuZCBoYW5nICAgICAgICoqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbG9nX3N0YXQ6CQkJCS8qIG91dHB1dCBhIGxlZCBjb2RlIGFuZCBjb250aW51ZSAqLworc2V0X2xlZDoKKwkvKiBzYXZlIHRoZSByZXR1cm4gaW5mbyBvbiBzdGFjayAqLworCW1mbHIJcjAJCQkvKiBHZXQgbGluayByZWdpc3RlciAqLworCXN0d3UJcjEsIC0xMihyMSkJCS8qIFNhdmUgYmFjayBjaGFpbiBhbmQgbW92ZSBTUCAqLworCXN0dwlyMCwgKzE2KHIxKQkJLyogU2F2ZSBsaW5rIHJlZ2lzdGVyICovCisJc3R3CXI0LCArOChyMSkJCS8qIHNhdmUgUjQgKi8KKworCWFkZGlzCXI0LCAwLCAweGZlMDAJCS8qIExFRCBidWZmZXIgaXMgYXQgMHhmZTAwMDAwMCAqLworI2lmIGRlZmluZWQoQ09ORklHX1c3T0xNRykJCS8qIG9ubHkgb24gZ2F0ZXdheSwgaW52ZXJ0IG91dHB1dHMgKi8KKwl4b3JpCXIzLHIzLCAweGZmZmYJCS8qIGNvbXBsZW1lbnQgbGVkIGNvZGUsIGFjdGl2ZSBsb3cgKi8KKwlzdGgJcjMsIDAocjQpCQkvKiBzdG9yZSBmaXJzdCB0ZXN0IHZhbHVlICovCisJeG9yaQlyMyxyMywgMHhmZmZmCQkvKiBjb21wbGVtZW50IGxlZCBjb2RlLCBhY3RpdmUgbG93ICovCisjZWxzZQkJCQkJLyogaWYgbm90IGdhdGV3YXksIHRoZW4gZG9uJ3QgaW52ZXJ0ICovCisJc3RoCXIzLCAwKHI0KQkJLyogc3RvcmUgZmlyc3QgdGVzdCB2YWx1ZSAqLworI2VuZGlmCisKKwkvKiByZXN0b3JlIHN0YWNrIGFuZCByZXR1cm4gKi8KKwlsd3oJcjAsICsxNihyMSkJCS8qIEdldCBzYXZlZCBsaW5rIHJlZ2lzdGVyICovCisJbXRscglyMAkJCS8qIFJlc3RvcmUgbGluayByZWdpc3RlciAqLworCWx3eglyNCwgKzgocjEpCQkvKiByZXN0b3JlIHI0ICovCisJYWRkaQlyMSwgcjEsICsxMgkJLyogUmVtb3ZlIGZyYW1lIGZyb20gc3RhY2sgKi8KKwlibHIJCQkJLyogUmV0dXJuIHRvIGNhbGxpbmcgZnVuY3Rpb24gKi8KKworZ2V0X2xlZDoKKwkvKiBzYXZlIHRoZSByZXR1cm4gaW5mbyBvbiBzdGFjayAqLworCW1mbHIJcjAJCQkvKiBHZXQgbGluayByZWdpc3RlciAqLworCXN0d3UJcjEsIC0xMihyMSkJCS8qIFNhdmUgYmFjayBjaGFpbiBhbmQgbW92ZSBTUCAqLworCXN0dwlyMCwgKzE2KHIxKQkJLyogU2F2ZSBsaW5rIHJlZ2lzdGVyICovCisJc3R3CXI0LCArOChyMSkJCS8qIHNhdmUgUjQgKi8KKworCWFkZGlzCXI0LCAwLCAweGZlMDAJCS8qIExFRCBidWZmZXIgaXMgYXQgMHhmZTAwMDAwMCAqLworCWxoeglyMywgMChyNCkJCS8qIHN0b3JlIGZpcnN0IHRlc3QgdmFsdWUgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19XN09MTUcpCQkvKiBvbmx5IG9uIGdhdGV3YXksIGludmVydCBpbnB1dHMgKi8KKwl4b3JpCXIzLHIzLCAweGZmZmYJCS8qIGNvbXBsZW1lbnQgbGVkIGNvZGUsIGFjdGl2ZSBsb3cgKi8KKyNlbmRpZgorCisJLyogcmVzdG9yZSBzdGFjayBhbmQgcmV0dXJuICovCisJbHd6CXIwLCArMTYocjEpCQkvKiBHZXQgc2F2ZWQgbGluayByZWdpc3RlciAqLworCW10bHIJcjAJCQkvKiBSZXN0b3JlIGxpbmsgcmVnaXN0ZXIgKi8KKwlsd3oJcjQsICs4KHIxKQkJLyogcmVzdG9yZSByNCAqLworCWFkZGkJcjEsIHIxLCArMTIJCS8qIFJlbW92ZSBmcmFtZSBmcm9tIHN0YWNrICovCisJYmxyCQkJCS8qIFJldHVybiB0byBjYWxsaW5nIGZ1bmN0aW9uICovCisKK2xvZ19lcnI6CS8qIG91dHB1dCB0aGUgZXJyb3IgYW5kIGhhbmcgdGhlIGJvYXJkICggZm9yIG5vdyApICovCisJLyogc2F2ZSB0aGUgcmV0dXJuIGluZm8gb24gc3RhY2sgKi8KKwltZmxyCXIwCQkJLyogR2V0IGxpbmsgcmVnaXN0ZXIgKi8KKwlzdHd1CXIxLCAtMTIocjEpCQkvKiBTYXZlIGJhY2sgY2hhaW4gYW5kIG1vdmUgU1AgKi8KKwlzdHcJcjAsICsxNihyMSkJCS8qIFNhdmUgbGluayByZWdpc3RlciAqLworCXN0dwlyMywgKzgocjEpCQkvKiBzYXZlIGEgY29weSBvZiBlcnJvciBjb2RlICovCisJYmwJc2V0X2xlZAkJCS8qIHNldCB0aGUgbGVkIHBhdHRlcm4gKi8KKwlHRVRfR09UCQkJCS8qIGdldCBHT1QgYWRkcmVzcyBpbiByMTQgKi8KKwlsd3oJcjMsR09UKGVycl9zdHIpCQkvKiBnZXQgYWRkcmVzcyBvZiBzdHJpbmcgKi8KKwlibAlwb3N0X3B1dHMJCS8qIG91dHB1dCB0aGUgd2FybmluZyBzdHJpbmcgKi8KKwlsd3oJcjMsICs4KHIxKQkJLyogZ2V0IGVycm9yIGNvZGUgKi8KKwlhZGRpCXI0LCAwLCAyCQkvKiBzZXQgZGlzcCBsZW5ndGggdG8gMiBuaWJibGVzICovCisJYmwJZGlzcF9oZXgJCS8qIG91dHB1dCB0aGUgZXJyb3IgY29kZSAqLworCWx3eglyMyxHT1QoZW5kX3N0cikJCS8qIGdldCBhZGRyZXNzIG9mIHN0cmluZyAqLworCWJsCXBvc3RfcHV0cwkJLyogb3V0cHV0IHRoZSB3YXJuaW5nIHN0cmluZyAqLworaGFsdDoKKwliCWhhbHQJCQkvKiBoYW5nICovCisKKwkvKiByZXN0b3JlIHN0YWNrIGFuZCByZXR1cm4gKi8KKwlsd3oJcjAsICsxNihyMSkJCS8qIEdldCBzYXZlZCBsaW5rIHJlZ2lzdGVyICovCisJbXRscglyMAkJCS8qIFJlc3RvcmUgbGluayByZWdpc3RlciAqLworCWFkZGkJcjEsIHIxLCArMTIJCS8qIFJlbW92ZSBmcmFtZSBmcm9tIHN0YWNrICovCisJYmxyCQkJCS8qIFJldHVybiB0byBjYWxsaW5nIGZ1bmN0aW9uICovCisKK2xvZ193YXJuOgkvKiBvdXRwdXQgYSB3YXJuaW5nLCB0aGVuIGNvbnRpbnVlIHdpdGggb3BlcmF0aW9ucyAqLworCS8qIHNhdmUgdGhlIHJldHVybiBpbmZvIG9uIHN0YWNrICovCisJbWZscglyMAkJCS8qIEdldCBsaW5rIHJlZ2lzdGVyICovCisJc3R3dQlyMSwgLTE2KHIxKQkJLyogU2F2ZSBiYWNrIGNoYWluIGFuZCBtb3ZlIFNQICovCisJc3R3CXIwLCArMjAocjEpCQkvKiBTYXZlIGxpbmsgcmVnaXN0ZXIgKi8KKwlzdHcJcjMsICs4KHIxKQkJLyogc2F2ZSBhIGNvcHkgb2YgZXJyb3IgY29kZSAqLworCXN0dwlyMTQsICsxMihyMSkJCS8qIHNhdmUgYSBjb3B5IG9mIHIxNCAodXNlZCBieSBHT1QpICovCisKKwlibAlzZXRfbGVkCQkJLyogc2V0IHRoZSBsZWQgcGF0dGVybiAqLworCUdFVF9HT1QJCQkJLyogZ2V0IEdPVCBhZGRyZXNzIGluIHIxNCAqLworCWx3eglyMyxHT1Qod2Fybl9zdHIpCS8qIGdldCBhZGRyZXNzIG9mIHN0cmluZyAqLworCWJsCXBvc3RfcHV0cwkJLyogb3V0cHV0IHRoZSB3YXJuaW5nIHN0cmluZyAqLworCWx3eglyMywgKzgocjEpCQkvKiBnZXQgZXJyb3IgY29kZSAqLworCWFkZGkJcjQsIDAsIDIJCS8qIHNldCBkaXNwIGxlbmd0aCB0byAyIG5pYmJsZXMgKi8KKwlibAlkaXNwX2hleAkJLyogb3V0cHV0IHRoZSBlcnJvciBjb2RlICovCisJbHd6CXIzLEdPVChlbmRfc3RyKQkJLyogZ2V0IGFkZHJlc3Mgb2Ygc3RyaW5nICovCisJYmwJcG9zdF9wdXRzCQkvKiBvdXRwdXQgdGhlIHdhcm5pbmcgc3RyaW5nICovCisKKwlhZGRpcwlyMywgMCwgNjQJCS8qIGhhcyBhIGxvbmcgZGVsYXkgKi8KKwltdGN0cglyMworbG9nXzI6CisJV0FUQ0hET0dfUkVTRVQJCQkvKiB0aGlzIGtlZXBzIGRvZyBmcm9tIGJhcmtpbmcsICovCisJCQkJICAgICAJLyogICBhbmQgdGFrZXMgdGltZSAqLworCWJkbnoJbG9nXzIJCQkvKiBsb29wIHRpbGwgdGltZSBleHBpcmVzICovCisKKwkvKiByZXN0b3JlIHN0YWNrIGFuZCByZXR1cm4gKi8KKwlsd3oJcjAsICsyMChyMSkJCS8qIEdldCBzYXZlZCBsaW5rIHJlZ2lzdGVyICovCisJbHd6CXIxNCwgKzEyKHIxKQkJLyogcmVzdG9yZSByMTQgKi8KKwltdGxyCXIwCQkJLyogUmVzdG9yZSBsaW5rIHJlZ2lzdGVyICovCisJYWRkaQlyMSwgcjEsICsxNgkJLyogUmVtb3ZlIGZyYW1lIGZyb20gc3RhY2sgKi8KKwlibHIJCQkJLyogUmV0dXJuIHRvIGNhbGxpbmcgZnVuY3Rpb24gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXRlbXBfdWFydF9pbml0CisgKglUZW1wb3JhcnkgVUFSVCBpbml0aWFsaXphdGlvbiByb3V0aW5lCisgKglTZXRzIHVwIFVBUlQwIHRvIHJ1biBhdCA5NjAwTjgxIG9mZiBvZiB0aGUgaW50ZXJuYWwgY2xvY2suCisgKglSMy1SNCBhcmUgdXNlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0ZW1wX3VhcnRfaW5pdDoKKwkvKiBzYXZlIHRoZSByZXR1cm4gaW5mbyBvbiBzdGFjayAqLworCW1mbHIJcjAJCQkvKiBHZXQgbGluayByZWdpc3RlciAqLworCXN0d3UJcjEsIC04KHIxKQkJLyogU2F2ZSBiYWNrIGNoYWluIGFuZCBtb3ZlIFNQICovCisJc3R3CXIwLCArMTIocjEpCQkvKiBTYXZlIGxpbmsgcmVnaXN0ZXIgKi8KKworICAgICAgICBhZGRpcyAgIHIzLCAwLCAweGVmNjAKKyAgICAgICAgb3JpICAgICByMywgcjMsIDB4MDMwMyAgICAgICAgICAvKiByMyA9IFVBUlQwX0xDUiAqLworICAgICAgICBhZGRpICAgIHI0LCAwLCAweDgzICAgICAgICAgICAgIC8qIG44MSBmb3JtYXQsIGRpdmlzb3IgcmVncyBlbmFibGVkICovCisgICAgICAgIHN0YiAgICAgcjQsIDAocjMpCisKKwkvKiBzZXQgYmF1ZCByYXRlIHRvIHVzZSBpbnRlcm5hbCBjbG9jaywKKwkgICBiYXVkID0gKDIwMGU2LzE2KS8zMS80MiA9IDk2MDAgKi8KKworICAgICAgICBhZGRpcyAgIHIzLCAwLCAweGVmNjAJCS8qIEFkZHJlc3Mgb2YgYmF1ZCBkaXZpc29yIHJlZyAqLworICAgICAgICBvcmkgICAgIHIzLCByMywgMHgwMzAwCQkvKiAgIFVBUlQwX0RMTSAqLworICAgICAgICBhZGRpICAgIHI0LCAwLCArNDIJCS8qIHVhcnQgYmF1ZCBkaXZpc29yIExTQiA9IDkzICovCisgICAgICAgIHN0YiAgICAgcjQsIDAocjMpICAgICAgICAgICAgICAgLyogYmF1ZCA9ICgyMDAgLzE2KS8xNC85MyAqLworCisgICAgICAgIGFkZGkgICAgcjMsIHIzLCAweDAwMDEJCS8qIHVhcnQgYmF1ZCBkaXZpc29yIGFkZHIgKi8KKyAgICAgICAgYWRkaSAgICByNCwgMCwgMAorICAgICAgICBzdGIgICAgIHI0LCAwKHIzKSAgICAgICAgICAgICAgIC8qIERpdmlzb3IgTGF0Y2ggTVNCID0gMCAqLworCisgICAgICAgIGFkZGlzICAgcjMsIDAsIDB4ZWY2MAorICAgICAgICBvcmkgICAgIHIzLCByMywgMHgwMzAzICAgICAgICAgIC8qIHIzID0gVUFSVDBfTENSICovCisgICAgICAgIGFkZGkgICAgcjQsIDAsIDB4MDMgICAgICAgICAgICAgLyogbjgxIGZvcm1hdCwgdHgvcnggcmVncyBlbmFibGVkICovCisgICAgICAgIHN0YiAgICAgcjQsIDAocjMpCisKKwkvKiBvdXRwdXQgYSBmZXcgbGluZSBmZWVkcyAqLworCWFkZGkJcjMsIDAsICdcbicJCS8qIGxvYWQgbGluZSBmZWVkICovCisJYmwgCXBvc3RfcHV0YwkJLyogb3V0cHV0IHRoZSBjaGFyICovCisJYWRkaQlyMywgMCwgJ1xuJwkJLyogbG9hZCBsaW5lIGZlZWQgKi8KKwlibCAJcG9zdF9wdXRjCQkvKiBvdXRwdXQgdGhlIGNoYXIgKi8KKworICAgICAgICAvKiByZXN0b3JlIHN0YWNrIGFuZCByZXR1cm4gKi8KKwlsd3oJcjAsICsxMihyMSkJCS8qIEdldCBzYXZlZCBsaW5rIHJlZ2lzdGVyICovCisJbXRscglyMAkJCS8qIFJlc3RvcmUgbGluayByZWdpc3RlciAqLworCWFkZGkJcjEsIHIxLCArOAkJLyogUmVtb3ZlIGZyYW1lIGZyb20gc3RhY2sgKi8KKwlibHIJCQkJLyogUmV0dXJuIHRvIGNhbGxpbmcgZnVuY3Rpb24gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKglwb3N0X3B1dGMKKyAqKglvdXRwdXRzIGNoYXJhY3RvciBpbiBSMworICoqCXIzIHJldHVybnMgdGhlIGVycm9yIGNvZGUgKCAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvciApCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwb3N0X3B1dGM6CisKKwkvKiBzYXZlIHRoZSByZXR1cm4gaW5mbyBvbiBzdGFjayAqLworCW1mbHIJcjAJCQkvKiBHZXQgbGluayByZWdpc3RlciAqLworCXN0d3UJcjEsIC0yMChyMSkJCS8qIFNhdmUgYmFjayBjaGFpbiBhbmQgbW92ZSBTUCAqLworCXN0dwlyMCwgKzI0KHIxKQkJLyogU2F2ZSBsaW5rIHJlZ2lzdGVyICovCisJc3RtdwlyMjksIDgocjEpCQkvKiBzYXZlCXIyOSAtIHIzMSBvbiBzdGFjaworCQkJCQkgICByMzEgLSB1YXJ0IGJhc2UgYWRkcmVzcworICAgICAgIAkJCQkJICAgcjMwIC0gZGVsYXkgY291bnRlcgorCQkJCQkgICByMjkgLSBzY3JhdGNoIHJlZyAqLworCisgICAgIGFkZGlzICAgcjMxLCAwLCAweGVmNjAJCS8qIFBvaW50IHRvIHVhcnQgYmFzZSAqLworICAgICBvcmkgICAgIHIzMSwgcjMxLCAweDAzMDAKKyAgICAgYWRkaXMgICByMzAsIDAsIDE1MiAJCS8qIExvYWQgYWJvdXQgMTAsMDAwLDAwMCB0aWNrcy4gKi8KK3BwdXRjX2xwOgorCWxieiAgICAgcjI5LCA1KHIzMSkgCQkvKiBSZWFkIExpbmUgU3RhdHVzIFJlZ2lzdGVyICovCisJYW5kaS4gICByMjksIHIyOSwgMHgyMAkJLyogQ2hlY2sgVEhSRSBzdGF0dXMgKi8KKwlibmUgICAgIHRocmVfc2V0CQkvKiBCcmFuY2ggaWYgRklGTyBlbXB0eSAqLworCWFkZGljLiAgcjMwLCByMzAsIC0xCQkvKiBEZWNyZW1lbnQgYW5kIGNoZWNrIGlmIGVtcHR5LiAqLworCWJuZSAgICAgcHB1dGNfbHAJCS8qIFRyeSwgdHJ5IGFnYWluICovCisJYWRkaSAgICByMywgMCwgLTEJCS8qIExvYWQgZXJyb3IgY29kZSBmb3IgdGltZW91dCAqLworCWIgICAgICAgcHB1dGNfZG9uZSAJCS8qIEJhaWwgb3V0IHdpdGggZXJyb3IgY29kZSBzZXQgKi8KK3RocmVfc2V0OgorCXN0YiAgICAgcjMsIDAocjMxKQkJLyogU3RvcmUgY2hhcmFjdGVyIHRvIFVBUlQgKi8KKwlhZGRpCXIzLCAwLCAwCQkvKiBjbGVhciBlcnJvciBjb2RlICovCitwcHV0Y19kb25lOgorCWxtdwlyMjksIDgocjEpCQkvKnJlc3RvcmUgcjI5IC0gcjMxIGZyb20gc3RhY2sgKi8KKwlsd3oJcjAsICsyNChyMSkJCS8qIEdldCBzYXZlZCBsaW5rIHJlZ2lzdGVyICovCisJYWRkaQlyMSwgcjEsICsyMAkJLyogUmVtb3ZlIGZyYW1lIGZyb20gc3RhY2sgKi8KKwltdGxyCXIwCQkJLyogUmVzdG9yZSBsaW5rIHJlZ2lzdGVyICovCisJYmxyCQkJCS8qIFJldHVybiB0byBjYWxsaW5nIGZ1bmN0aW9uICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBwb3N0X3B1dHMKKyAgICBBY2NlcHRzIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBwb2ludGVkIHRvIGJ5IFIzCisgICAgT3V0cHV0cyB0byB0aGUgc2VyaWFsIHBvcnQgdW50aWwgMHgwMCBpcyBmb3VuZC4KKyAgICByMyByZXR1cm5zIHRoZSBlcnJvciBjb2RlICggLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IgKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwb3N0X3B1dHM6CisKKwkvKiBzYXZlIHRoZSByZXR1cm4gaW5mbyBvbiBzdGFjayAqLworCW1mbHIJcjAJCQkvKiBHZXQgbGluayByZWdpc3RlciAqLworCXN0d3UJcjEsIC0xMihyMSkJCS8qIFNhdmUgYmFjayBjaGFpbiBhbmQgbW92ZSBTUCAqLworCXN0dwlyMCwgKzE2KHIxKQkJLyogU2F2ZSBsaW5rIHJlZ2lzdGVyICovCisJc3R3CXIzMSwgOChyMSkJCS8qIHNhdmUgcjMxIC0gY2hhciBwb2ludGVyICovCisKKwlhZGRpIAlyMzEsIHIzLCAwICAgICAgICAgICAgICAvKiBtb3ZlIHBvaW50ZXIgdG8gUjMxICovCitwcHV0c19ueHQ6CisJbGJ6CXIzLCAwKHIzMSkJCS8qIEdldCBuZXh0IGNoYXJhY3RlciAqLworCWFkZGljLiAgcjMsIHIzLCAwCQkvKiBDaGVjayBmb3IgemVybyAqLworCWJlcQlwcHV0c190ZXJtCQkvKiBiYWlsIG91dCBpZiB6ZXJvICovCisJYmwJcG9zdF9wdXRjCQkvKiBvdXRwdXQgdGhlIGNoYXIgKi8KKwlhZGRpYy4JcjMsIHIzLCAwCQkvKiBjaGVjayBmb3IgZXJyb3IgKi8KKwlibmUJcHB1dHNfZXJyCisJYWRkaSAJcjMxLCByMzEsIDEJCS8qIHBvaW50IHRvIG5leHQgY2hhciAqLworCWIJcHB1dHNfbnh0IAkJLyogbG9vcCB0aWxsIHRlcm0gKi8KK3BwdXRzX2VycjoKKwlhZGRpIAlyMywgMCwgLTEJCS8qIHNldCBlcnJvciBjb2RlICovCisJYglwcHV0c19lbmQJCS8qIHdlcmUgb3V0YSBoZXJlICovCitwcHV0c190ZXJtOgorCWFkZGkgCXIzLCAwLCAxCQkvKiBzZXQgc3VjY2VzcyBjb2RlICovCisgCS8qIHJlc3RvcmUgc3RhY2sgYW5kIHJldHVybiAqLworcHB1dHNfZW5kOgorCWx3eglyMzEsIDgocjEpCQkvKiByZXN0b3JlIHIyNyAtIHIzMSBmcm9tIHN0YWNrICovCisJbHd6CXIwLCArMTYocjEpCQkvKiBHZXQgc2F2ZWQgbGluayByZWdpc3RlciAqLworCWFkZGkJcjEsIHIxLCArMTIJCS8qIFJlbW92ZSBmcmFtZSBmcm9tIHN0YWNrICovCisJbXRscglyMAkJCS8qIFJlc3RvcmUgbGluayByZWdpc3RlciAqLworCWJscgkJCQkvKiBSZXR1cm4gdG8gY2FsbGluZyBmdW5jdGlvbiAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioJZGlzcF9oZXgKKyAqKioqKglSb3V0aW5lIHRvIGRpc3BsYXkgYSBoZXggdmFsdWUgZnJvbSBhIHJlZ2lzdGVyLgorICoqKioqCVIzIGlzIHZhbHVlIHRvIGRpc3BsYXkKKyAqKioqKglSNCBpcyBudW1iZXIgb2YgbmliYmxlcyB0byBkaXNwbGF5IGllIDIgZm9yIGJ5dGUgOCBmb3IgKGxvbmcpd29yZAorICoqKioqCVJldHVybnMgLTEgaW4gUjMgaWYgdGhlcmUgaXMgYW4gZXJyb3IgKCBpZSBzZXJpYWwgcG9ydCBoYW5ncyApCisgKioqKioJUmV0dXJucyAwIGluIFIzIGlmIG5vIGVycm9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Rpc3BfaGV4OgorCS8qIHNhdmUgdGhlIHJldHVybiBpbmZvIG9uIHN0YWNrICovCisJbWZscglyMAkJCS8qIEdldCBsaW5rIHJlZ2lzdGVyICovCisJc3R3dQlyMSwgLTE2KHIxKQkJLyogU2F2ZSBiYWNrIGNoYWluIGFuZCBtb3ZlIFNQICovCisJc3R3CXIwLCArMjAocjEpCQkvKiBTYXZlIGxpbmsgcmVnaXN0ZXIgKi8KKwlzdG13CXIzMCwgOChyMSkJCS8qIHNhdmUgcjMwIC0gcjMxIG9uIHN0YWNrICovCisJCQkJCS8qIHIzMSBvdXRwdXQgY2hhciAqLworCQkJCQkvKiByMzAgdWFydCBiYXNlIGFkZHJlc3MgKi8KKwlhZGRpIAlyMzAsIDAsIDggICAgICAgICAgICAgICAvKiBHbyB0aHJvdWdoIDggbmliYmxlcy4gKi8KKwlhZGRpIAlyMzEsIHIzLCAwCitwcHV0aF9ueHQ6CisJcmx3aW5tCXIzMSwgcjMxLCA0LCAwLCAzMQkvKiBSb3RhdGUgbmV4dCBuaWJibGUgaW50byBwb3NpdGlvbiAqLworCWFuZGkuIAlyMywgcjMxLCAweDBmCQkvKiBHZXQgbmliYmxlLiAqLworCWFkZGkgCXIzLCByMywgMHgzMAkJLyogQWRkIHplcm8ncyBBU0NJSSBjb2RlLiAqLworCWNtcHdpCXIzLCAweDAzYQorCWJsdAlwcHV0aF9vdXQKKwlhZGRpIAlyMywgcjMsIDB4MDcgICAgICAgICAgICAvKiAweDI3IGZvciBsb3dlciBjYXNlLiAqLworcHB1dGhfb3V0OgorCWNtcHcgCXIzMCwgcjQKKwliZ3QJcHB1dGhfc2tpcAorCWJsCXBvc3RfcHV0YworCWFkZGljLiAJcjMsIHIzLCAwIAkJLyogY2hlY2sgZm9yIGVycm9yICovCisJYm5lCXBwdXRoX2VycgorcHB1dGhfc2tpcDoKKwlhZGRpYy4JcjMwLCByMzAsIC0xCisJYm5lCXBwdXRoX254dAorCXhvcglyMywgcjMsIHIzCQkvKiBDbGVhciBlcnJvciBjb2RlICovCisJYglwcHV0aF9kb25lCitwcHV0aF9lcnI6CisJYWRkaSAJcjMsIDAsIC0xIAkJLyogc2V0IGVycm9yIGNvZGUgKi8KK3BwdXRoX2RvbmU6CisgICAgICAgIC8qIHJlc3RvcmUgc3RhY2sgYW5kIHJldHVybiAqLworCWxtdwlyMzAsIDgocjEpCQkvKiAgcmVzdG9yZSByMzAgLSByMzEgZnJvbSBzdGFjayAqLworCWx3eglyMCwgKzIwKHIxKQkJLyogR2V0IHNhdmVkIGxpbmsgcmVnaXN0ZXIgKi8KKwlhZGRpCXIxLCByMSwgKzE2CQkvKiBSZW1vdmUgZnJhbWUgZnJvbSBzdGFjayAqLworCW10bHIJcjAJCQkvKiBSZXN0b3JlIGxpbmsgcmVnaXN0ZXIgKi8KKwlibHIJCQkJLyogUmV0dXJuIHRvIGNhbGxpbmcgZnVuY3Rpb24gKi8KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvdzdvL3Bvc3QyLmMgYi9ib2FyZC93N28vcG9zdDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzFjMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvdzdvL3Bvc3QyLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEJpbGwgSHVudGVyLCBXYXZlIDcgT3B0aWNzLCB3aWxsaWFtaHVudGVyQG1lZGlhb25lLm5ldAorICogICBhbmQKKyAqIEVyaWsgVGhlaXNlbiwgV2F2ZSA3IE9wdGljcywgZXRoZWlzZW5AbWluZHNwcmluZy5jb20uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHJ0Yy5oPgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgImR0dC5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX000OFQzNUEpCit2b2lkIHJ0Y3Rlc3Qodm9pZCkKK3sKKyAgICB2b2xhdGlsZSB1Y2hhciAqdGNoYXIgPSAodWNoYXIqKShDRkdfTlZSQU1fQkFTRV9BRERSICsgQ0ZHX05WUkFNX1NJWkUgLSA5KTsKKyAgICBzdHJ1Y3QgcnRjX3RpbWUgdG1wOworCisgICAgLyogc2V0IHVwIGxlZCBjb2RlIGZvciBSVEMgdGVzdHMgKi8KKyAgICBsb2dfc3RhdChFUlJfUlRDRyk7CisKKyAgICAvKgorICAgICAqIERvIFJUQyBiYXR0ZXJ5IHRlc3QuIFRoZSBmaXJzdCB3cml0ZSBhZnRlciBwb3dlciB1cAorICAgICAqIGZhaWxzIGlmIGJhdHRlcnkgaXMgbG93LgorICAgICAqLworICAgICp0Y2hhciA9IDB4YWE7CisgICAgaWYgKCgqdGNoYXIgXiAweGFhKSAhPSAweDApIGxvZ193YXJuKEVSUl9SVENCQVQpOworICAgICp0Y2hhciA9IDB4NTU7CQkJCS8qIFJlc2V0IHRlc3QgYWRkcmVzcyAqLworCisgICAgLyoKKyAgICAgKiBOb3cgbGV0cyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHZhbHVlcyBpbiB0aGUgUlRDLgorICAgICAqLworICAgIHJ0Y19nZXQoJnRtcCk7CisgICAgaWYgKCh0bXAudG1fc2VjIDwgMCkJfCAodG1wLnRtX3NlYyAgPiA1OSkgICB8CisJKHRtcC50bV9taW4gPCAwKQl8ICh0bXAudG1fbWluICA+IDU5KSAgIHwKKwkodG1wLnRtX2hvdXIgPCAwKQl8ICh0bXAudG1faG91ciA+IDIzKSAgIHwKKwkodG1wLnRtX21kYXkgPCAxICkJfCAodG1wLnRtX21kYXkgPiAzMSkgICB8CisJKHRtcC50bV9tb24gPCAxICkJfCAodG1wLnRtX21vbiAgPiAxMikgICB8CisJKHRtcC50bV95ZWFyIDwgMjAwMCkJfCAodG1wLnRtX3llYXIgPiAyNTAwKSB8CisJKHRtcC50bV93ZGF5IDwgMSApCXwgKHRtcC50bV93ZGF5ID4gNykpIHsKKwlsb2dfd2FybihFUlJfUlRDVElNKTsKKwlydGNfcmVzZXQoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5vdyBsZXRzIGRvIGEgY2hlY2sgdG8gc2VlIGlmIHRoZSBOViBSQU0gaXMgdGhlcmUuCisgICAgICovCisgICAgKnRjaGFyID0gMHhhYTsKKyAgICBpZiAoKCp0Y2hhciBeIDB4YWEpICE9IDB4MCkgbG9nX2VycihFUlJfUlRDVkFMKTsKKyAgICAqdGNoYXIgPSAweDU1OwkJCQkvKiBSZXNldCB0ZXN0IGFkZHJlc3MgKi8KKworfSAvKiBydGN0ZXN0KCkgKi8KKyNlbmRpZgkvKiBDT05GSUdfUlRDX000OFQzNUEgKi8KKworCisjaWZkZWYgQ09ORklHX0RUVF9MTTc1CitpbnQgZHR0X3Rlc3QoaW50IHNlbnNvcikKK3sKKyAgICBzaG9ydCB0ZW1wLCB0cmlwLCBoeXN0OworCisgICAgLyogZ2V0IHZhbHVlcyAqLworICAgIHRlbXAgPSBkdHRfcmVhZChzZW5zb3IsIERUVF9SRUFEX1RFTVApIC8gMjU2OworICAgIHRyaXAgPSBkdHRfcmVhZChzZW5zb3IsIERUVF9URU1QX1NFVCkgLyAyNTY7CisgICAgaHlzdCA9IGR0dF9yZWFkKHNlbnNvciwgRFRUX1RFTVBfSFlTVCkgLyAyNTY7CisKKyAgICAvKiBjaGVjayB2YWx1ZXMgKi8KKyAgICBpZiAoKGh5c3QgIT0gKENGR19EVFRfTUFYX1RFTVAgLSBDRkdfRFRUX0hZU1RFUkVTSVMpKSB8fAorCSh0cmlwICE9IENGR19EVFRfTUFYX1RFTVApIHx8CisJKHRlbXAgPCBDRkdfRFRUX0xPV19URU1QKSB8fCAodGVtcCA+IENGR19EVFRfTUFYX1RFTVApKQorCXJldHVybiAxOworCisgICAgcmV0dXJuIDA7Cit9IC8qIGR0dF90ZXN0KCkgKi8KKyNlbmRpZiAvKiBDT05GSUdfRFRUX0xNNzUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHBvc3QyKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfUlRDX000OFQzNUEpCisgICAgcnRjdGVzdCgpOworI2VuZGlmCS8qIENPTkZJR19SVENfTTQ4VDM1QSAqLworCisjaWZkZWYgQ09ORklHX0RUVF9MTTc1CisgICAgbG9nX3N0YXQoRVJSX1RlbXBHKTsKKyAgICBpZihkdHRfdGVzdCgyKSAhPSAwKSBsb2dfd2FybihFUlJfVHRlc3QwKTsKKyAgICBpZihkdHRfdGVzdCg0KSAhPSAwKSBsb2dfd2FybihFUlJfVHRlc3QxKTsKKyNlbmRpZiAvKiBDT05GSUdfRFRUX0xNNzUgKi8KK30gLyogcG9zdDIoKSAqLworCmRpZmYgLS1naXQgYS9ib2FyZC93N28vdnBkLmMgYi9ib2FyZC93N28vdnBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0YjEyNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3c3by92cGQuYwpAQCAtMCwwICsxLDQwOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogRXJpayBUaGVpc2VuLCBXYXZlIDcgT3B0aWNzLCBldGhlaXNlbkBtaW5kc3ByaW5nLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWYgZGVmaW5lZChWWFdPUktTKQorIyBpbmNsdWRlIDxzdGRpby5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgZGVmaW5lIENGR19ERUZfRUVQUk9NX0FERFIgMHhhMAorZXh0ZXJuIGNoYXIgaWljUmVhZEJ5dGUoIGNoYXIsIGNoYXIgKTsKK2V4dGVybiB1bG9uZ190IGNyYzMyKCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKTsKKyNlbHNlCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInZwZC5oIgorCisvKgorICogdnBkX3JlYWRlcigpIC0gcmVhZHMgVlBEIGRhdGEgZnJvbSBJMkMgRUVQUk9NUy4KKyAqICAgICAgICAgICAgICAgIHJldHVybnMgcG9pbnRlciB0byBidWZmZXIgb3IgTlVMTC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgordnBkX3JlYWRlcih1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGRldl9hZGRyLCB1bnNpZ25lZCBvZmYsIHVuc2lnbmVkIGNvdW50KQoreworICAgIHVuc2lnbmVkIG9mZnNldCA9IG9mZjsJCQkvKiBDYWxjdWxhdGVkIG9mZnNldCAqLworCisgICAgLyoKKyAgICAgKiBUaGUgbWFpbiBib2FyZCBFRVBST00gY29udGFpbnMKKyAgICAgKiBTRFJBTSBTUEQgaW4gdGhlIGZpcnN0IDEyOCBieXRlcywKKyAgICAgKiBzbyBza2V3IHRoZSBvZmZzZXQuCisgICAgICovCisgICAgaWYgKGRldl9hZGRyID09IENGR19ERUZfRUVQUk9NX0FERFIpCisJb2Zmc2V0ICs9IFNEUkFNX1NQRF9EQVRBX1NJWkU7CisKKyAgICAvKiBUcnkgdG8gcmVhZCB0aGUgSTJDIEVFUFJPTSAqLworI2lmIGRlZmluZWQoVlhXT1JLUykKKyAgICB7CisJaW50IGk7CisJZm9yKCBpID0gMDsgaSA8IGNvdW50OyArK2kgKSB7CisJICAgIGJ1ZlsgaSBdID0gaWljUmVhZEJ5dGUoIGRldl9hZGRyLCBvZmZzZXQraSApOworCX0KKyAgICB9CisjZWxzZQorICAgIGlmIChlZXByb21fcmVhZChkZXZfYWRkciwgb2Zmc2V0LCBidWYsIGNvdW50KSkgeworCXByaW50ZigiRmFpbGVkIHRvIHJlYWQgJWQgYnl0ZXMgZnJvbSBWUEQgRUVQUk9NIDB4JXggQCAweCV4XG4iLAorCSAgICAgICBjb3VudCwgZGV2X2FkZHIsIG9mZnNldCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gYnVmOworfSAvKiB2cGRfcmVhZGVyKCkgKi8KKworCisvKgorICogdnBkX2dldF9wYWNrZXQoKSAtIHJldHVybnMgbmV4dCBWUEQgcGFja2V0IG9yIE5VTEwuCisgKi8KK3N0YXRpYyB2cGRfcGFja2V0X3QgKnZwZF9nZXRfcGFja2V0KHZwZF9wYWNrZXRfdCAqdnBkX3BhY2tldCkKK3sKKyAgICB2cGRfcGFja2V0X3QgKnBhY2tldCA9IHZwZF9wYWNrZXQ7CisKKyAgICBpZiAocGFja2V0ICE9IE5VTEwpIHsKKwlpZiAocGFja2V0LT5pZGVudGlmaWVyID09IFZQRF9QSURfVEVSTSkKKwkgICAgcmV0dXJuIE5VTEw7CisJZWxzZQorCSAgICBwYWNrZXQgPSAodnBkX3BhY2tldF90ICopKChjaGFyICopcGFja2V0ICsgcGFja2V0LT5zaXplICsgMik7CisgICAgfQorCisgICAgcmV0dXJuIHBhY2tldDsKK30gLyogdnBkX2dldF9wYWNrZXQoKSAqLworCisKKy8qCisgKiB2cGRfZmluZF9wYWNrZXQoKSAtIExvY2F0ZXMgYW5kIHJldHVybnMgdGhlIHNwZWNpZmllZAorICoJCSAgICAgICBWUEQgcGFja2V0IG9yIE5VTEwgb24gZXJyb3IuCisgKi8KK3N0YXRpYyB2cGRfcGFja2V0X3QgKnZwZF9maW5kX3BhY2tldCh2cGRfdCAqdnBkLCB1bnNpZ25lZCBjaGFyIGlkZW50KQoreworICAgIHZwZF9wYWNrZXRfdCAqcGFja2V0ID0gKHZwZF9wYWNrZXRfdCAqKSZ2cGQtPnBhY2tldHM7CisKKyAgICAvKiBHdWFyYW50ZWVkIGlsbGVnYWwgKi8KKyAgICBpZiAoaWRlbnQgPT0gVlBEX1BJRF9HSSkKKwlyZXR1cm4gTlVMTDsKKworICAgIC8qIFNjYW4gdHVwbGVzIGxvb2tpbmcgZm9yIGEgbWF0Y2ggKi8KKyAgICB3aGlsZSAoKHBhY2tldC0+aWRlbnRpZmllciAhPSBpZGVudCkgJiYKKwkgICAocGFja2V0LT5pZGVudGlmaWVyICE9IFZQRF9QSURfVEVSTSkpCisJcGFja2V0ID0gdnBkX2dldF9wYWNrZXQocGFja2V0KTsKKworICAgIC8qIERpZCB3ZSBmaW5kIGl0PyAqLworICAgIGlmICgocGFja2V0LT5pZGVudGlmaWVyKSAmJiAocGFja2V0LT5pZGVudGlmaWVyICE9IGlkZW50KSkKKwlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gcGFja2V0OworfQorCisKKy8qCisgKiB2cGRfaXNfdmFsaWQoKSAtIFZhbGlkYXRlcyBjb250ZW50cyBvZiBWUEQgZGF0YQorICoJCSAgICBpbiBJMkMgRUVQUk9NLiAgUmV0dXJucyAxIGZvcgorICoJCSAgICBzdWNjZXNzIG9yIDAgZm9yIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgdnBkX2lzX3ZhbGlkKHVuc2lnbmVkIGRldl9hZGRyLCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisgICAgdW5zaWduZWQJICAgIG51bV9ieXRlczsKKyAgICB2cGRfcGFja2V0X3QgICAgKnBhY2tldDsKKyAgICB2cGRfdAkgICAgKnZwZCA9ICh2cGRfdCAqKWJ1ZjsKKyAgICB1bnNpZ25lZCBzaG9ydCAgc3RvcmVkX2NyYzE2LCBjYWxjX2NyYzE2ID0gMHhmZmZmOworCisgICAgLyogQ2hlY2sgRXllY2F0Y2hlciAqLworICAgIGlmIChzdHJuY21wKHZwZC0+aGVhZGVyLmV5ZWNhdGNoZXIsIFZQRF9FWUVDQVRDSEVSLCBWUERfRVlFX1NJWkUpICE9IDApIHsKKwl1bnNpZ25lZCBvZmZzZXQgPSAwOworCWlmIChkZXZfYWRkciA9PSBDRkdfREVGX0VFUFJPTV9BRERSKQorCSAgICBvZmZzZXQgKz0gU0RSQU1fU1BEX0RBVEFfU0laRTsKKwlwcmludGYoIkVycm9yOiBWUEQgRUVQUk9NIDB4JXggY29ycnVwdCBAIDB4JXhcbiIsIGRldl9hZGRyLCBvZmZzZXQpOworCisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogQ2hlY2sgTGVuZ3RoICovCisgICAgaWYgKHZwZC0+aGVhZGVyLnNpemU+IFZQRF9NQVhfRUVQUk9NX1NJWkUpIHsKKwlwcmludGYoIkVycm9yOiBWUEQgRUVQUk9NIDB4JXggY29udGFpbnMgYmFkIHNpemUgMHgleFxuIiwKKwkgICAgICAgZGV2X2FkZHIsIHZwZC0+aGVhZGVyLnNpemUpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIE5vdyBmaW5kIHRoZSB0ZXJtaW5hdGlvbiBwYWNrZXQgKi8KKyAgICBpZiAoKHBhY2tldCA9IHZwZF9maW5kX3BhY2tldCh2cGQsIFZQRF9QSURfVEVSTSkpID09IE5VTEwpIHsKKwlwcmludGYoIkVycm9yOiBWUEQgRUVQUk9NIDB4JXggbWlzc2luZyB0ZXJtaW5hdGlvbiBwYWNrZXRcbiIsCisJICAgICAgIGRldl9hZGRyKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgZGF0YSBzaXplICovCisgICAgbnVtX2J5dGVzID0gKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBjaGFyICopcGFja2V0IC0KKwkJCQkodW5zaWduZWQgY2hhciAqKXZwZCArIHNpemVvZih2cGRfcGFja2V0X3QpKTsKKworICAgIC8qIEZpbmQgc3RvcmVkIENSQyBhbmQgY2xlYXIgaXQgKi8KKyAgICBpZiAoKHBhY2tldCA9IHZwZF9maW5kX3BhY2tldCh2cGQsIFZQRF9QSURfQ1JDKSkgPT0gTlVMTCkgeworCXByaW50ZigiRXJyb3I6IFZQRCBFRVBST00gMHgleCBtaXNzaW5nIENSQ1xuIiwgZGV2X2FkZHIpOworCXJldHVybiAwOworICAgIH0KKyAgICBzdG9yZWRfY3JjMTYgPSAqKCh1c2hvcnQgKilwYWNrZXQtPmRhdGEpOworICAgICoodXNob3J0ICopcGFja2V0LT5kYXRhID0gMDsKKworICAgIC8qIE9LLCBsZXRzIGNhbGN1bGF0ZSB0aGUgQ1JDIGFuZCBjaGVjayBpdCAqLworI2lmIGRlZmluZWQoVlhXT1JLUykKKyAgICBjYWxjX2NyYzE2ID0gKDB4ZmZmZiAmIGNyYzMyKGJ1ZiwgbnVtX2J5dGVzKSk7CisjZWxzZQorICAgIGNhbGNfY3JjMTYgPSAoMHhmZmZmICYgY3JjMzIoMCwgYnVmLCBudW1fYnl0ZXMpKTsKKyNlbmRpZgorICAgICoodXNob3J0ICopcGFja2V0LT5kYXRhID0gc3RvcmVkX2NyYzE2OyAgICAgLyogTm93IHJlc3RvcmUgdGhlIENSQyAqLworICAgIGlmIChzdG9yZWRfY3JjMTYgIT0gY2FsY19jcmMxNikgeworCXByaW50ZigiRXJyb3I6IFZQRCBFRVBST00gMHgleCBoYXMgYmFkIENSQyAweCV4XG4iLAorCSAgICAgICBkZXZfYWRkciwgc3RvcmVkX2NyYzE2KTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30gLyogdnBkX2lzX3ZhbGlkKCkgKi8KKworCisvKgorICogc2l6ZV9vaygpIC0gQ2hlY2sgdG8gc2VlIGlmIHBhY2tldCBzaXplIG1hdGNoZXMKKyAqCSAgICAgICBzaXplIG9mIGRhdGEgd2Ugd2FudC4gUmV0dXJucyAxIGZvcgorICoJICAgICAgIGdvb2QgbWF0Y2ggb3IgMCBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBzaXplX29rKHZwZF9wYWNrZXRfdCAqcGFja2V0LCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgaWYgKHBhY2tldC0+c2l6ZSAhPSBzaXplKSB7CisJcHJpbnRmKCJWUEQgUGFja2V0IDB4JXggY29ycnVwdC5cbiIsIHBhY2tldC0+aWRlbnRpZmllcik7CisJcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfSAvKiBzaXplX29rKCkgKi8KKworCisvKgorICogc3RybGVuX29rKCkgLSBDaGVjayB0byBzZWUgaWYgcGFja2V0IHNpemUgbWF0Y2hlcworICoJCSBzdHJsZW4gb2YgdGhlIHN0cmluZyB3ZSB3YW50IHRvIHBvcHVsYXRlLgorICoJCSBSZXR1cm5zIDEgZm9yIHZhbGlkIGxlbmd0aCBvciAwIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHN0cmxlbl9vayh2cGRfcGFja2V0X3QgKnBhY2tldCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisgICAgaWYgKHBhY2tldC0+c2l6ZSA+PSBsZW5ndGgpIHsKKwlwcmludGYoIlZQRCBQYWNrZXQgMHgleCBjb3JydXB0LlxuIiwgcGFja2V0LT5pZGVudGlmaWVyKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9IC8qIHN0cmxlbl9vaygpICovCisKKworLyoKKyAqIGdldF92cGRfZGF0YSgpIC0gcG9wdWxhdGVzIHRoZSBwYXNzZWQgVlBEIHN0cnVjdHVyZSAndnBkSW5mbycKKyAqCQkgICAgd2l0aCBkYXRhIG9idGFpbmVkIGZyb20gdGhlIHNwZWNpZmllZAorICoJCSAgICBJMkMgRUVQUk9NICdkZXZfYWRkcicuICBSZXR1cm5zIDAgZm9yCisgKgkJICAgIHN1Y2Nlc3Mgb3IgMSBmb3IgZmFpbHVyZS4KKyAqLworaW50IHZwZF9nZXRfZGF0YSh1bnNpZ25lZCBjaGFyIGRldl9hZGRyLCBWUEQgKnZwZEluZm8pCit7CisgICAgdW5zaWduZWQgY2hhciBidWZbVlBEX0VFUFJPTV9TSVpFXTsKKyAgICB2cGRfdCAqdnBkID0gKHZwZF90ICopYnVmOworICAgIHZwZF9wYWNrZXRfdCAqcGFja2V0OworCisgICAgaWYgKHZwZEluZm8gPT0gTlVMTCkKKwlyZXR1cm4gMTsKKworICAgICAvKgorICAgICAgKiBGaWxsIHZwZEluZm8gd2l0aCAwcyB0byBibGFuayBvdXQKKyAgICAgICogdW51c2VkIGZpZWxkcywgZmlsbCB2cGRJbmZvLT5ldGhBZGRycworICAgICAgKiB3aXRoIGFsbCAweGZmcyBzbyB0aGF0IG90aGVyJ3MgY29kZSBjYW4KKyAgICAgICogZGV0ZXJtaW5lIGhvdyBtYW55IHJlYWwgRXRoZXJuZXQgYWRkcmVzc2VzCisgICAgICAqIHRoZXJlIGFyZS4gIE9VSXMgc3RhcnRpbmcgd2l0aCAweGZmIGFyZQorICAgICAgKiBicm9hZGNhc3QgYWRkcmVzc2VzLCBhbmQgd291bGQgbmV2ZXIgYmUKKyAgICAgICogcGVybWFudGVseSBzdG9yZWQuCisgICAgICAqLworICAgIG1lbXNldCgodm9pZCAqKXZwZEluZm8sIDAsIHNpemVvZihWUEQpKTsKKyAgICBtZW1zZXQoKHZvaWQgKikmdnBkSW5mby0+ZXRoQWRkcnMsIDB4ZmYsIHNpemVvZih2cGRJbmZvLT5ldGhBZGRycykpOworICAgIHZwZEluZm8tPl9kZXZBZGRyID0gZGV2X2FkZHI7CisKKyAgICAvKiBSZWFkIHRoZSBtaW5pbXVtIHNpemUgZmlyc3QgKi8KKyAgICBpZiAodnBkX3JlYWRlcihidWYsIGRldl9hZGRyLCAwLCBWUERfRUVQUk9NX1NJWkUpID09IE5VTEwpIHsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBDaGVjayB2YWxpZGl0eSBvZiBWUEQgZGF0YSAqLworICAgIGlmICghdnBkX2lzX3ZhbGlkKGRldl9hZGRyLCBidWYpKSB7CisJcHJpbnRmKCJWUEQgRGF0YSBpcyBJTlZBTElEIVxuIik7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgLyoKKyAgICAgICogV2FsayBhbGwgdGhlIHBhY2tldHMgYW5kIHBvcHVsYXRlCisgICAgICAqIHRoZSBWUEQgaW5mbyBzdHJ1Y3R1cmUuCisgICAgICAqLworICAgIHBhY2tldCA9ICh2cGRfcGFja2V0X3QgKikmdnBkLT5wYWNrZXRzOworICAgIGRvIHsKKwlzd2l0Y2ggKHBhY2tldC0+aWRlbnRpZmllcikgeworCSAgICBjYXNlIFZQRF9QSURfR0k6CisJCXByaW50ZigiRXJyb3I6IElsbGVnYWwgVlBEIHZhbHVlXG4iKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgVlBEX1BJRF9QSUQ6CisJCWlmIChzdHJsZW5fb2socGFja2V0LCBNQVhfUFJPRF9JRCkpIHsKKwkJICAgIHN0cm5jcHkodnBkSW5mby0+cHJvZHVjdElkLAorCQkJICAgIHBhY2tldC0+ZGF0YSwgcGFja2V0LT5zaXplKTsKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBWUERfUElEX1JFVjoKKwkJaWYgKHNpemVfb2socGFja2V0LCBzaXplb2YoY2hhcikpKQorCQkgICAgdnBkSW5mby0+cmV2aXNpb25JZCA9ICpwYWNrZXQtPmRhdGE7CisJCWJyZWFrOworCSAgICBjYXNlIFZQRF9QSURfU046CisJCWlmIChzaXplX29rKHBhY2tldCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkgeworCQkgICAgdnBkSW5mby0+c2VyaWFsTnVtID0KKwkJCSoodW5zaWduZWQgbG9uZyAqKXBhY2tldC0+ZGF0YTsKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBWUERfUElEX01BTklEOgorCQlpZiAoc2l6ZV9vayhwYWNrZXQsIHNpemVvZih1bnNpZ25lZCBjaGFyKSkpCisJCSAgICB2cGRJbmZvLT5tYW51SUQgPSAqcGFja2V0LT5kYXRhOworCQlicmVhazsKKwkgICAgY2FzZSBWUERfUElEX1BDTzoKKwkJaWYgKHNpemVfb2socGFja2V0LCBzaXplb2YodW5zaWduZWQgbG9uZykpKSB7CisJCSAgICB2cGRJbmZvLT5jb25maWdPcHQgPQorCQkJKih1bnNpZ25lZCBsb25nICopcGFja2V0LT5kYXRhOworCQl9CisJCWJyZWFrOworCSAgICBjYXNlIFZQRF9QSURfU1lTQ0xLOgorCQlpZiAoc2l6ZV9vayhwYWNrZXQsIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCisJCSAgICB2cGRJbmZvLT5zeXNDbGsgPSAqKHVuc2lnbmVkIGxvbmcgKilwYWNrZXQtPmRhdGE7CisJCWJyZWFrOworCSAgICBjYXNlIFZQRF9QSURfU0VSQ0xLOgorCQlpZiAoc2l6ZV9vayhwYWNrZXQsIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCisJCSAgICB2cGRJbmZvLT5zZXJDbGsgPSAqKHVuc2lnbmVkIGxvbmcgKilwYWNrZXQtPmRhdGE7CisJCWJyZWFrOworCSAgICBjYXNlIFZQRF9QSURfRkxBU0g6CisJCWlmIChzaXplX29rKHBhY2tldCwgOSkpIHsJLyogWFhYIC0gaGFyZGNvZGVkLAorCQkJCQkJICAgcGFkZGluZyBpbiBzdHJ1Y3QgKi8KKwkJICAgIG1lbWNweSgmdnBkSW5mby0+Zmxhc2hDZmcsIHBhY2tldC0+ZGF0YSwgOSk7CisJCX0KKwkJYnJlYWs7CisJICAgIGNhc2UgVlBEX1BJRF9FVEhBRERSOgorCQltZW1jcHkodnBkSW5mby0+ZXRoQWRkcnMsIHBhY2tldC0+ZGF0YSwgcGFja2V0LT5zaXplKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgVlBEX1BJRF9QT1RTOgorCQlpZiAoc2l6ZV9vayhwYWNrZXQsIHNpemVvZihjaGFyKSkpCisJCSAgICB2cGRJbmZvLT5udW1QT1RTID0gKHVuc2lnbmVkKSpwYWNrZXQtPmRhdGE7CisJCWJyZWFrOworCSAgICBjYXNlIFZQRF9QSURfRFMxOgorCQlpZiAoc2l6ZV9vayhwYWNrZXQsIHNpemVvZihjaGFyKSkpCisJCSAgICB2cGRJbmZvLT5udW1EUzEgPSAodW5zaWduZWQpKnBhY2tldC0+ZGF0YTsKKwkgICAgY2FzZSBWUERfUElEX0dBTDoKKwkgICAgY2FzZSBWUERfUElEX0NSQzoKKwkgICAgY2FzZSBWUERfUElEX1RFUk06CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlwcmludGYoIldhcm5pbmc6IEZvdW5kIHVua25vd24gVlBEIHBhY2tldCBJRCAweCV4XG4iLAorCQkgICAgICAgcGFja2V0LT5pZGVudGlmaWVyKTsKKwkJYnJlYWs7CisJfQorICAgIH0gd2hpbGUgKChwYWNrZXQgPSB2cGRfZ2V0X3BhY2tldChwYWNrZXQpKSk7CisKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIGdldF92cGRfZGF0YSgpICovCisKKworLyoKKyAqIHZwZF9pbml0KCkgLSBJbml0aWFsaXplIGRlZmF1bHQgVlBEIGVudmlyb25tZW50CisgKi8KK2ludCB2cGRfaW5pdCh1bnNpZ25lZCBjaGFyIGRldl9hZGRyKQoreworICAgIHJldHVybiAoMCk7Cit9IC8qIHZwZF9pbml0KCkgKi8KKworCisvKgorICogdnBkX3ByaW50KCkgLSBQcmV0dHkgcHJpbnQgdGhlIFZQRCBkYXRhLgorICovCit2b2lkIHZwZF9wcmludChWUEQgKnZwZEluZm8pCit7CisgICAgY29uc3QgY2hhciAqY29uc3Qgc3AgICAgPSAiIjsKKyAgICBjb25zdCBjaGFyICpjb25zdCBzZm10ICA9ICIlNHMlLTIwczogXCIlc1wiXG4iOworICAgIGNvbnN0IGNoYXIgKmNvbnN0IGNmbXQgID0gIiU0cyUtMjBzOiAnJWMnXG4iOworICAgIGNvbnN0IGNoYXIgKmNvbnN0IGRmbXQgID0gIiU0cyUtMjBzOiAlbGRcbiI7CisgICAgY29uc3QgY2hhciAqY29uc3QgaGZtdCAgPSAiJTRzJS0yMHM6ICUwOGxYXG4iOworICAgIGNvbnN0IGNoYXIgKmNvbnN0IGRzZm10ID0gIiU0cyUtMjBzOiAlZFxuIjsKKyAgICBjb25zdCBjaGFyICpjb25zdCBoc2ZtdCA9ICIlNHMlLTIwczogJTA0WFxuIjsKKyAgICBjb25zdCBjaGFyICpjb25zdCBkaGZtdCA9ICIlNHMlLTIwczogJWxkICglbFgpXG4iOworCisgICAgcHJpbnRmKCJWUEQgcmVhZCBmcm9tIEkyQyBkZXZpY2U6ICUwMlhcbiIsIHZwZEluZm8tPl9kZXZBZGRyKTsKKworICAgIGlmICh2cGRJbmZvLT5wcm9kdWN0SWRbMF0pCisJcHJpbnRmKHNmbXQsIHNwLCAiUHJvZHVjdCBJRCIsIHZwZEluZm8tPnByb2R1Y3RJZCk7CisgICAgZWxzZQorCXByaW50ZihzZm10LCBzcCwgIlByb2R1Y3QgSUQiLCAiVU5LTk9XTiIpOworCisgICAgaWYgKHZwZEluZm8tPnJldmlzaW9uSWQpCisJcHJpbnRmKGNmbXQsIHNwLCAiUmV2aXNpb24gSUQiLCB2cGRJbmZvLT5yZXZpc2lvbklkKTsKKworICAgIGlmICh2cGRJbmZvLT5zZXJpYWxOdW0pCisJcHJpbnRmKGRmbXQsIHNwLCAiU2VyaWFsIE51bWJlciIsIHZwZEluZm8tPnNlcmlhbE51bSk7CisKKyAgICBpZiAodnBkSW5mby0+bWFudUlEKQorCXByaW50ZihkZm10LCBzcCwgIk1hbnVmYWN0dXJlIElEIiwgKGxvbmcpdnBkSW5mby0+bWFudUlEKTsKKworICAgIGlmICh2cGRJbmZvLT5jb25maWdPcHQpCisJcHJpbnRmKGhmbXQsIHNwLCAiQ29uZmlndXJhdGlvbiIsIHZwZEluZm8tPmNvbmZpZ09wdCk7CisKKyAgICBpZiAodnBkSW5mby0+c3lzQ2xrKQorCXByaW50ZihkaGZtdCwgc3AsICJTeXN0ZW0gQ2xvY2siLCB2cGRJbmZvLT5zeXNDbGssIHZwZEluZm8tPnN5c0Nsayk7CisKKyAgICBpZiAodnBkSW5mby0+c2VyQ2xrKQorCXByaW50ZihkaGZtdCwgc3AsICJTZXJpYWwgQ2xvY2siLCB2cGRJbmZvLT5zZXJDbGssIHZwZEluZm8tPnNlckNsayk7CisKKyAgICBpZiAodnBkSW5mby0+bnVtUE9UUykKKwlwcmludGYoZGZtdCwgc3AsICJOdW1iZXIgb2YgUE9UUyBsaW5lcyIsIHZwZEluZm8tPm51bVBPVFMpOworCisgICAgaWYgKHZwZEluZm8tPm51bURTMSkKKwlwcmludGYoZGZtdCwgc3AsICJOdW1iZXIgb2YgRFMxcyIsIHZwZEluZm8tPm51bURTMSk7CisKKyAgICAvKiBQcmludCBFdGhlcm5ldCBBZGRyZXNzZXMgKi8KKyAgICBpZiAodnBkSW5mby0+ZXRoQWRkcnNbMF1bMF0gIT0gMHhmZikgeworCWludCBpLCBqOworCXByaW50ZigiJTRzRXRoZXJOZXQgQWRkcmVzcyhlcyk6ICIsIHNwKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0VUSF9BRERSUzsgaSsrKSB7CisJICAgIGlmICh2cGRJbmZvLT5ldGhBZGRyc1tpXVswXSAhPSAweGZmKSB7CisJCWZvciAoaiA9IDA7IGogPCA2OyBqKyspIHsKKwkJICAgIHByaW50ZigiJTAyWCIsIHZwZEluZm8tPmV0aEFkZHJzW2ldW2pdKTsKKwkJICAgIGlmICgoKGogKyAxKSAlIDYpICE9IDApCisJCQlwcmludGYoIjoiKTsKKwkJICAgIGVsc2UKKwkJCXByaW50ZigiICIpOworCQl9CisJCWlmICgoKGkgKyAxKSAlIDMpID09IDApIHByaW50ZigiXG4lMjRzOiAiLCBzcCk7CisJICAgIH0KKwl9CisJcHJpbnRmKCJcbiIpOworICAgIH0KKworICAgIGlmICh2cGRJbmZvLT5mbGFzaENmZy5tZmcgJiYgdnBkSW5mby0+Zmxhc2hDZmcuZGV2KSB7CisJcHJpbnRmKCJNYWluIEZsYXNoIENvbmZpZ3VyYXRpb246XG4iKTsKKwlwcmludGYoaHNmbXQsIHNwLCAiTWFudWZhY3R1cmUgSUQiLCB2cGRJbmZvLT5mbGFzaENmZy5tZmcpOworCXByaW50Zihoc2ZtdCwgc3AsICJEZXZpY2UgSUQiLCAgICAgIHZwZEluZm8tPmZsYXNoQ2ZnLmRldik7CisJcHJpbnRmKGRzZm10LCBzcCwgIkRldmljZSBXaWR0aCIsICAgdnBkSW5mby0+Zmxhc2hDZmcuZGV2V2lkdGgpOworCXByaW50Zihkc2ZtdCwgc3AsICJOdW0uIERldmljZXMiLCAgIHZwZEluZm8tPmZsYXNoQ2ZnLm51bURldnMpOworCXByaW50Zihkc2ZtdCwgc3AsICJOdW0uIENvbHVtbnMiLCAgIHZwZEluZm8tPmZsYXNoQ2ZnLm51bUNvbHMpOworCXByaW50Zihkc2ZtdCwgc3AsICJDb2x1bW4gV2lkdGgiLCAgIHZwZEluZm8tPmZsYXNoQ2ZnLmNvbFdpZHRoKTsKKwlwcmludGYoZHNmbXQsIHNwLCAiV0UgRGF0YSBXaWR0aCIsICB2cGRJbmZvLT5mbGFzaENmZy53ZURhdGFXaWR0aCk7CisgICAgfQorfSAvKiB2cGRfcHJpbnQoKSAqLworCmRpZmYgLS1naXQgYS9ib2FyZC93N28vdnBkLmggYi9ib2FyZC93N28vdnBkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViYmUzZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3c3by92cGQuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogRXJpayBUaGVpc2VuLCBXYXZlIDcgT3B0aWNzLCBldGhlaXNlbkBtaW5kc3ByaW5nLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9WUERfSF8KKyNkZWZpbmUgX1ZQRF9IXworCisvKgorICogTWFpbiBGbGFzaCBDb25maWd1cmF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBmbGFzaENmZ19zIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBtZmc7CQkJCS8qIE1hbnVmYWN0dXJlIElEICovCisgICAgdW5zaWduZWQgc2hvcnQgZGV2OwkJCQkvKiBEZXZpY2UgSUQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGRldldpZHRoOwkJCS8qIERldmljZSBXaWR0aCAqLworICAgIHVuc2lnbmVkIGNoYXIgbnVtRGV2czsJCQkvKiBOdW1iZXIgb2YgZGV2aWNlcyAqLworICAgIHVuc2lnbmVkIGNoYXIgbnVtQ29sczsJCQkvKiBOdW1iZXIgb2YgY29sdW1ucyAqLworICAgIHVuc2lnbmVkIGNoYXIgY29sV2lkdGg7CQkJLyogV2lkdGggb2YgYSBjb2x1bW4gKi8KKyAgICB1bnNpZ25lZCBjaGFyIHdlRGF0YVdpZHRoOwkJCS8qIFdyaXRlL0VyYXNlIERhdGEgV2lkdGggKi8KK30gZmxhc2hDZmdfdDsKKworLyoKKyAqIFZpdGFsIFByb2R1Y3QgRGF0YSAtIFZQRAorICovCisjZGVmaW5lIE1BWF9QUk9EX0lECQkxNQorI2RlZmluZSBNQVhfRVRIX0FERFJTCQkxMAordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEV0aEFkZHJbNl07Cit0eXBlZGVmIHN0cnVjdCB2cGQgeworICAgIHVuc2lnbmVkIGNoYXIgX2RldkFkZHI7CQkJLyogRGV2aWNlIGFkZHJlc3MgZHVyaW5nIHJlYWQgKi8KKyAgICBjaGFyIHByb2R1Y3RJZFtNQVhfUFJPRF9JRF07CQkvKiBQcm9kdWN0IElEICovCisgICAgY2hhciByZXZpc2lvbklkOwkJCQkvKiBSZXZpc2lvbiBJRCBhcyBhIGNoYXIgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbE51bTsJCQkvKiBTZXJpYWwgbnVtYmVyICovCisgICAgdW5zaWduZWQgY2hhciAgbWFudUlEOwkJCS8qIE1hbnVmYWN0IElEIC0gYnl0ZSBpbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGNvbmZpZ09wdDsJCQkvKiBDb25maWcgT3B0aW9uIC0gYml0IGZpZWxkICovCisgICAgdW5zaWduZWQgbG9uZyBzeXNDbGs7CQkJLyogU3lzdGVtIGNsb2NrIGluIEhlcnR6ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJDbGs7CQkJLyogRXh0LiBjbG9jayBpbiBIZXJ0eiAqLworICAgIGZsYXNoQ2ZnX3QgZmxhc2hDZmc7CQkJLyogRmxhc2ggY29uZmlndXJhdGlvbiAqLworICAgIHVuc2lnbmVkIGxvbmcgbnVtUE9UUzsJCQkvKiBOdW1iZXIgb2YgUE9UUyBsaW5lcyAqLworICAgIHVuc2lnbmVkIGxvbmcgbnVtRFMxOwkJCS8qIE51bWJlciBvZiBEUzEgY2lyY3VpdHMgKi8KKyAgICBFdGhBZGRyIGV0aEFkZHJzW01BWF9FVEhfQUREUlNdOwkJLyogRXRoZXJuZXQgTUFDLCAxc3QgPSBjcmFmdCAqLworfSBWUEQ7CisKKworI2RlZmluZSBWUERfTUFYX0VFUFJPTV9TSVpFCTUxMgkJLyogTWF4IHNpemUgVlBEIEVFUFJPTSAqLworI2RlZmluZSBTRFJBTV9TUERfREFUQV9TSVpFCTEyOAkJLyogU2l6ZSBTUEQgaW4gVlBEIEVFUFJPTSAqLworCisvKgorICogUElEcyAtIFBhY2tldCBJZGVudGlmaWVycworICovCisjZGVmaW5lIFZQRF9QSURfR0kJCTB4MAkJLyogR3VhcmFudGVkIElsbGVnYWwgKi8KKyNkZWZpbmUgVlBEX1BJRF9QSUQJCTB4MQkJLyogUHJvZHVjdCBJZGVudGlmaWVyICovCisjZGVmaW5lIFZQRF9QSURfUkVWCQkweDIJCS8qIFByb2R1Y3QgUmV2aXNpb24gKi8KKyNkZWZpbmUgVlBEX1BJRF9TTgkJMHgzCQkvKiBTZXJpYWwgTnVtYmVyICovCisjZGVmaW5lIFZQRF9QSURfTUFOSUQJCTB4NAkJLyogTWFudWZhY3R1cmUgSUQgKi8KKyNkZWZpbmUgVlBEX1BJRF9QQ08JCTB4NQkJLyogUHJvZHVjdCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFZQRF9QSURfU1lTQ0xLCQkweDYJCS8qIFN5c3RlbSBDbG9jayAqLworI2RlZmluZSBWUERfUElEX1NFUkNMSwkJMHg3CQkvKiBTZXIuIENsay4gU3BlZWQgaW4gSGVydHogKi8KKyNkZWZpbmUgVlBEX1BJRF9DUkMJCTB4OAkJLyogVlBEIENSQyAqLworI2RlZmluZSBWUERfUElEX0ZMQVNICQkweDkJCS8qIEZsYXNoIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgVlBEX1BJRF9FVEhBRERSCQkweEEJCS8qIEV0aGVybmV0IEFkZHJlc3MoZXMpICovCisjZGVmaW5lIFZQRF9QSURfR0FMCQkweEIJCS8qIEdhbGlsZW8gU3dpdGNoIENvbmZpZyAqLworI2RlZmluZSBWUERfUElEX1BPVFMJCTB4QwkJLyogTnVtYmVyIG9mIFBPVFMgTGluZXMgKi8KKyNkZWZpbmUgVlBEX1BJRF9EUzEJCTB4RAkJLyogTnVtYmVyIG9mIERTMXMgKi8KKyNkZWZpbmUgVlBEX1BJRF9URVJNCQkweEZGCQkvKiBUZXJtaW5hdGlvbiBwYWNrZXQgKi8KKworLyoKKyAqIFZQRCAtIEV5ZWNhdGNoZXIvTWFnaWMKKyAqLworI2RlZmluZSBWUERfRVlFQ0FUQ0hFUgkJIlc3TyIKKyNkZWZpbmUgVlBEX0VZRV9TSVpFCQkzCit0eXBlZGVmIHN0cnVjdCB2cGRfaGVhZGVyIHsKKyAgICB1bnNpZ25lZCBjaGFyIGV5ZWNhdGNoZXJbVlBEX0VZRV9TSVpFXTsJLyogZXllY2F0Y2hlciAtICJXN08iICovCisgICAgdW5zaWduZWQgc2hvcnQgc2l6ZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgLyogc2l6ZSBvZiBFRVBST00gKi8KK30gdnBkX2hlYWRlcl90OworCisKKyNkZWZpbmUgVlBEX0RBVEFfU0laRSAoVlBEX01BWF9FRVBST01fU0laRSAtIFNEUkFNX1NQRF9EQVRBX1NJWkUgLSBcCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodnBkX2hlYWRlcl90KSkKK3R5cGVkZWYgc3RydWN0IHZwZF9zIHsKKyAgICB2cGRfaGVhZGVyX3QgaGVhZGVyOworICAgIHVuc2lnbmVkIGNoYXIgcGFja2V0c1tWUERfREFUQV9TSVpFXTsKK30gdnBkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHZwZF9wYWNrZXQgeworICAgIHVuc2lnbmVkIGNoYXIgaWRlbnRpZmllcjsKKyAgICB1bnNpZ25lZCBjaGFyIHNpemU7CisgICAgdW5zaWduZWQgY2hhciBkYXRhWzFdOworfSB2cGRfcGFja2V0X3Q7CisKKy8qCisgKiBWUEQgY29uZmlnT3B0IGJpdCBtYXNrCisgKi8KKyNkZWZpbmUgVlBEX0hBU19CQlJBTQkJMHgxCQkvKiBCYXR0ZXJ5IGJhY2tlZCBTUkFNICovCisjZGVmaW5lIFZQRF9IQVNfUlRDCQkweDIJCS8qIEJhdHRlcnkgYmFja2VkIFJUQyAqLworI2RlZmluZSBWUERfSEFTX0VYVF9TRVJfQ0xLCTB4NAkJLyogRXh0ZXJuYWwgc2VyaWFsIGNsb2NrICovCisjZGVmaW5lIFZQRF9IQVNfU0VSX1RSQU5TXzEJMHg4CQkvKiBDT00xIHRyYW5zY2VpdmVyICovCisjZGVmaW5lIFZQRF9IQVNfU0VSX1RSQU5TXzIJMHgxMAkJLyogQ09NMiB0cmFuc2NlaXZlciAqLworI2RlZmluZSBWUERfSEFTX0NSQUZUX1BIWQkweDIwCQkvKiBDUkFGVCBFdGhlcm5ldCAqLworI2RlZmluZSBWUERfSEFTX0RUVF8xCQkweDQwCQkvKiBJMkMgRGlnaXRhbCB0aGVybS4gIzEgKi8KKyNkZWZpbmUgVlBEX0hBU19EVFRfMgkJMHg4MAkJLyogSTJDIERpZ2l0YWwgdGhlcm0uICMyICovCisjZGVmaW5lIFZQRF9IQVNfMTAwMF9VUF9MQVNFUgkweDEwMAkJLyogR01NIC0gMTAwME1iaXQgVXBsaW5rICovCisjZGVmaW5lIFZQRF9IQVNfNzBLTV9VUF9MQVNFUgkweDIwMAkJLyogQ01NIC0gNzBLTSBVcGxpbmsgbGFzZXIgKi8KKyNkZWZpbmUgVlBEX0hBU18yX1VQTElOS1MJMHg0MDAJCS8qIENNTSAtIDIgdXBsaW5rIGxhc2VycyAqLworI2RlZmluZSBWUERfSEFTX0ZQR0EJCTB4ODAwCQkvKiBIYXMgMSBvciBtb3JlIEZQR0FzICovCisjZGVmaW5lIFZQRF9IQVNfREZBCQkweDEwMDAJCS8qIENMTSAtIEhhcyAyIEZpYmVyIEludGVyLiAqLworI2RlZmluZSBWUERfSEFTX0dBTF9TV0lUQ0gJMHgyMDAwCQkvKiBHTU0gLSBIYXMgYSBHYWwgc3dpdGNoICovCisjZGVmaW5lIFZQRF9IQVNfUE9UU19MSU5FUwkweDQwMDAJCS8qIEdNTSAtIEhhcyBQT1RTIGxpbmVzICovCisjZGVmaW5lIFZQRF9IQVNfRFMxX0NIQU5ORUxTCTB4ODAwMAkJLyogR01NIC0gSGFzIERTMSBjaGFubmVscyAqLworI2RlZmluZSBWUERfSEFTX0NBQkxFX1JFVFVSTgkweDEwMDAwCQkvKiBHQk0vR0JSIC0gQ2FibGUgcmV0LiBwYXRoICovCisKKyNkZWZpbmUgVlBEX0VFUFJPTV9TSVpFICAgICAgICAgKDI1NiAtIFNEUkFNX1NQRF9EQVRBX1NJWkUpIC8qIFNpemUgRUVQUk9NICovCisKK2V4dGVybiBpbnQgdnBkX2dldF9kYXRhKHVuc2lnbmVkIGNoYXIgZGV2X2FkZHIsIFZQRCAqdnBkKTsKK2V4dGVybiB2b2lkIHZwZF9wcmludChWUEQgKnZwZEluZm8pOworCisjZW5kaWYgLyogX1ZQRF9IXyAqLworCmRpZmYgLS1naXQgYS9ib2FyZC93N28vdzdvLmMgYi9ib2FyZC93N28vdzdvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwNGQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3c3by93N28uYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogRXJpayBUaGVpc2VuLCBXYXZlIDcgT3B0aWNzLCBldGhlaXNlbkBtaW5kc3ByaW5nLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSAidzdvLmgiCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSAidnBkLmgiCisjaW5jbHVkZSAiZXJyb3JzLmgiCisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKwordW5zaWduZWQgbG9uZyBnZXRfZHJhbV9zaXplKHZvaWQpOworCisvKgorICogTWFjcm9zIHRvIHRyYW5zZm9ybSB2YWx1ZXMKKyAqIGludG8gZW52aXJvbm1lbnQgc3RyaW5ncy4KKyAqLworI2RlZmluZSBYTUtfU1RSKHgpCSN4CisjZGVmaW5lIE1LX1NUUih4KQlYTUtfU1RSKHgpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGJvYXJkX3ByZV9pbml0ICh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX1c3T0xNRykKKyAgICAvKgorICAgICAqIFNldHVwIEdQSU8gcGlucyAtIHJlc2V0IGRldmljZXMuCisgICAgICovCisgICAgb3V0MzIoSUJNNDA1R1BfR1BJTzBfT0RSLCAweDEwMDAwMDAwKTsJLyogb25lIG9wZW4gZHJhaW4gcGluICovCisgICAgb3V0MzIoSUJNNDA1R1BfR1BJTzBfT1IsIDB4M0UwMDAwMDApOwkvKiBzZXQgb3V0cHV0IHBpbnMgdG8gZGVmYXVsdCAqLworICAgIG91dDMyKElCTTQwNUdQX0dQSU8wX1RDUiwgMHg3ZjgwMDAwMCk7CS8qIHNldHVwIGZvciBvdXRwdXQgKi8KKworICAgIC8qCisgICAgICogSVJRIDAtMTUgIDQwNUdQIGludGVybmFsbHkgZ2VuZXJhdGVkOyBhY3RpdmUgaGlnaDsgbGV2ZWwgc2Vuc2l0aXZlCisgICAgICogSVJRIDE2ICAgIDQwNUdQIGludGVybmFsbHkgZ2VuZXJhdGVkOyBhY3RpdmUgbG93OyBsZXZlbCBzZW5zaXRpdmUKKyAgICAgKiBJUlEgMTctMjQgUkVTRVJWRUQKKyAgICAgKiBJUlEgMjUgKEVYVCBJUlEgMCkgWElMSU5YOyBhY3RpdmUgbG93OyBsZXZlbCBzZW5zaXRpdmUKKyAgICAgKiBJUlEgMjYgKEVYVCBJUlEgMSkgUENJIElOVCBBOyBhY3RpdmUgbG93OyBsZXZlbCBzZW5zaXRpdmUKKyAgICAgKiBJUlEgMjcgKEVYVCBJUlEgMikgUENJIElOVCBCOyBhY3RpdmUgbG93OyBsZXZlbCBzZW5zaXRpdmUKKyAgICAgKiBJUlEgMjggKEVYVCBJUlEgMykgU0FNIDI7IGFjdGl2ZSBsb3c7IGxldmVsIHNlbnNpdGl2ZQorICAgICAqIElSUSAyOSAoRVhUIElSUSA0KSBCYXR0ZXJ5IEJhZDsgYWN0aXZlIGxvdzsgbGV2ZWwgc2Vuc2l0aXZlCisgICAgICogSVJRIDMwIChFWFQgSVJRIDUpIExldmVsIE9uZSBQSFk7IGFjdGl2ZSBsb3c7IGxldmVsIHNlbnNpdGl2ZQorICAgICAqIElSUSAzMSAoRVhUIElSUSA2KSBTQU0gMTsgYWN0aXZlIGhpZ2g7IGxldmVsIHNlbnNpdGl2ZQorICAgICAqLworICAgIG10ZGNyKHVpY3NyLCAweEZGRkZGRkZGKTsJCQkvKiBjbGVhciBhbGwgaW50cyAqLworICAgIG10ZGNyKHVpY2VyLCAweDAwMDAwMDAwKTsJCQkvKiBkaXNhYmxlIGFsbCBpbnRzICovCisKKyAgICBtdGRjcih1aWNjciwgMHgwMDAwMDAwMCk7CQkJLyogc2V0IGFsbCB0byBiZSBub24tY3JpdGljYWwqLworICAgIG10ZGNyKHVpY3ByLCAweEZGRkZGRjgwKTsJCQkvKiBzZXQgaW50IHBvbGFyaXRpZXMgKi8KKyAgICBtdGRjcih1aWN0ciwgMHgxMDAwMDAwMCk7CQkJLyogc2V0IGludCB0cmlnZ2VyIGxldmVscyAqLworICAgIG10ZGNyKHVpY3ZjciwgMHgwMDAwMDAwMSk7CQkJLyogc2V0IHZlY3QgYmFzZT0wLAorCQkJCQkJICAgSU5UMCBoaWdoZXN0IHByaW9yaXR5Ki8KKworICAgIG10ZGNyKHVpY3NyLCAweEZGRkZGRkZGKTsJCQkvKiBjbGVhciBhbGwgaW50cyAqLworCisjZWxpZiBkZWZpbmVkKENPTkZJR19XN09MTUMpCisgICAgLyoKKyAgICAgKiBTZXR1cCBHUElPIHBpbnMKKyAgICAgKi8KKyAgICBvdXQzMihJQk00MDVHUF9HUElPMF9PRFIsIDB4MDE4MDAwMDApOwkvKiBYQ1YgRG9uZSBPcGVuIERyYWluICovCisgICAgb3V0MzIoSUJNNDA1R1BfR1BJTzBfT1IsICAweDAzODAwMDAwKTsJLyogc2V0IG91dCBwaW5zIHRvIGRlZmF1bHQgKi8KKyAgICBvdXQzMihJQk00MDVHUF9HUElPMF9UQ1IsIDB4NjZDMDAwMDApOwkvKiBzZXR1cCBmb3Igb3V0cHV0ICovCisKKyAgICAvKgorICAgICAqIElSUSAwLTE1ICA0MDVHUCBpbnRlcm5hbGx5IGdlbmVyYXRlZDsgYWN0aXZlIGhpZ2g7IGxldmVsIHNlbnNpdGl2ZQorICAgICAqIElSUSAxNiAgICA0MDVHUCBpbnRlcm5hbGx5IGdlbmVyYXRlZDsgYWN0aXZlIGxvdzsgbGV2ZWwgc2Vuc2l0aXZlCisgICAgICogSVJRIDE3LTI0IFJFU0VSVkVECisgICAgICogSVJRIDI1IChFWFQgSVJRIDApIERCRSAwOyBhY3RpdmUgbG93OyBsZXZlbCBzZW5zaXRpdmUKKyAgICAgKiBJUlEgMjYgKEVYVCBJUlEgMSkgREJFIDE7IGFjdGl2ZSBsb3c7IGxldmVsIHNlbnNpdGl2ZQorICAgICAqIElSUSAyNyAoRVhUIElSUSAyKSBEQkUgMjsgYWN0aXZlIGxvdzsgbGV2ZWwgc2Vuc2l0aXZlCisgICAgICogSVJRIDI4IChFWFQgSVJRIDMpIERCRSBDb21tb247IGFjdGl2ZSBsb3c7IGxldmVsIHNlbnNpdGl2ZQorICAgICAqIElSUSAyOSAoRVhUIElSUSA0KSBQQ0k7IGFjdGl2ZSBsb3c7IGxldmVsIHNlbnNpdGl2ZQorICAgICAqIElSUSAzMCAoRVhUIElSUSA1KSBSQ01NIFJlc2V0OyBhY3RpdmUgbG93OyBsZXZlbCBzZW5zaXRpdmUKKyAgICAgKiBJUlEgMzEgKEVYVCBJUlEgNikgUEhZOyBhY3RpdmUgaGlnaDsgbGV2ZWwgc2Vuc2l0aXZlCisgICAgICovCisgICAgbXRkY3IodWljc3IsIDB4RkZGRkZGRkYpOwkJCS8qIGNsZWFyIGFsbCBpbnRzICovCisgICAgbXRkY3IodWljZXIsIDB4MDAwMDAwMDApOwkJCS8qIGRpc2FibGUgYWxsIGludHMgKi8KKworICAgIG10ZGNyKHVpY2NyLCAweDAwMDAwMDAwKTsJCQkvKiBzZXQgYWxsIHRvIGJlIG5vbi1jcml0aWNhbCovCisgICAgbXRkY3IodWljcHIsIDB4RkZGRkZGODApOwkJCS8qIHNldCBpbnQgcG9sYXJpdGllcyAqLworICAgIG10ZGNyKHVpY3RyLCAweDEwMDAwMDAwKTsJCQkvKiBzZXQgaW50IHRyaWdnZXIgbGV2ZWxzICovCisgICAgbXRkY3IodWljdmNyLCAweDAwMDAwMDAxKTsJCQkvKiBzZXQgdmVjdCBiYXNlPTAsCisJCQkJCQkgICBJTlQwIGhpZ2hlc3QgcHJpb3JpdHkqLworCisgICAgbXRkY3IodWljc3IsIDB4RkZGRkZGRkYpOwkJCS8qIGNsZWFyIGFsbCBpbnRzICovCisKKyNlbHNlIC8qIFVua25vd24gKi8KKyMgICAgZXJyb3IgIlVua25vd24gVzdPIGJvYXJkIGNvbmZpZ3VyYXRpb24iCisjZW5kaWYKKworICAgIFdBVENIRE9HX1JFU0VUKCk7CQkJCS8qIFJlc2V0IHRoZSB3YXRjaGRvZyAqLworICAgIHRlbXBfdWFydF9pbml0KCk7CQkJCS8qIGluaXQgdGhlIHVhcnQgZm9yIGRlYnVnICovCisgICAgV0FUQ0hET0dfUkVTRVQoKTsJCQkJLyogUmVzZXQgdGhlIHdhdGNoZG9nICovCisgICAgdGVzdF9sZWQoKTsJCQkJCS8qIHRlc3QgdGhlIExFRHMgKi8KKyAgICB0ZXN0X3NkcmFtKGdldF9kcmFtX3NpemUoKSk7CQkvKiB0ZXN0IHRoZSBkcmFtICovCisgICAgbG9nX3N0YXQoRVJSX1BPU1QxKTsJCQkvKiBsb2cgc3RhdHVzLHBvc3QxIGNvbXBsZXRlICovCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogQ2hlY2sgQm9hcmQgSWRlbnRpdHk6CisgKi8KK2ludCBjaGVja2JvYXJkICh2b2lkKQoreworICAgIFZQRCB2cGQ7CisKKyAgICBwdXRzICgiQm9hcmQ6ICIpOworCisgICAgLyogVlBEIGRhdGEgcHJlc2VudCBpbiBJMkMgRUVQUk9NICovCisgICAgaWYgKHZwZF9nZXRfZGF0YShDRkdfREVGX0VFUFJPTV9BRERSLCAmdnBkKSA9PSAwKSB7CisJLyoKKwkgKiBLbm93biBib2FyZCB0eXBlLgorCSAqLworCWlmICh2cGQucHJvZHVjdElkWzBdICYmCisJICAgICgoc3RybmNtcCh2cGQucHJvZHVjdElkLCAiR01NIiwgMykgPT0gMCkgfHwKKwkgICAgIChzdHJuY21wKHZwZC5wcm9kdWN0SWQsICJDTU0iLCAzKSA9PSAwKSkpIHsKKworCSAgICAvKiBPdXRwdXQgYm9hcmQgaW5mb3JtYXRpb24gb24gc3RhcnR1cCAqLworCSAgICBwcmludGYoIlwiJXNcIiwgcmV2aXNpb24gJyVjJywgc2VyaWFsIyAlbGQsIG1hbnVmYWN0dXJlciAldVxuIiwKKwkJICAgdnBkLnByb2R1Y3RJZCwgdnBkLnJldmlzaW9uSWQsIHZwZC5zZXJpYWxOdW0sIHZwZC5tYW51SUQpOworCSAgICByZXR1cm4gKDApOworCX0KKyAgICB9CisKKyAgICBwdXRzICgiIyMjIFVua25vd24gSFcgSUQgLSBhc3N1bWluZyBOT1RISU5HXG4iKTsKKyAgICByZXR1cm4gKDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2xvbmcgaW50IGluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKK3sKKyAgICByZXR1cm4gZ2V0X2RyYW1fc2l6ZSgpOworfQorCit1bnNpZ25lZCBsb25nIGdldF9kcmFtX3NpemUgKHZvaWQpCit7CisgICAgaW50IHRtcCwgaSwgcmVnc1s0XTsKKyAgICBpbnQgc2l6ZSA9IDA7CisKKyAgICAvKiBHZXQgYmFuayBTaXplIHJlZ2lzdGVycyAqLworICAgIG10ZGNyKG1lbWNmZ2EsIG1lbV9tYjBjZik7CQkJLyogZ2V0IGJhbmsgMCBjb25maWcgcmVnICovCisgICAgcmVnc1swXSA9IG1mZGNyKG1lbWNmZ2QpOworCisgICAgbXRkY3IobWVtY2ZnYSwgbWVtX21iMWNmKTsJCQkvKiBnZXQgYmFuayAxIGNvbmZpZyByZWcgKi8KKyAgICByZWdzWzFdID0gbWZkY3IobWVtY2ZnZCk7CisKKyAgICBtdGRjcihtZW1jZmdhLCBtZW1fbWIyY2YpOwkJCS8qIGdldCBiYW5rIDIgY29uZmlnIHJlZyAqLworICAgIHJlZ3NbMl0gPSBtZmRjcihtZW1jZmdkKTsKKworICAgIG10ZGNyKG1lbWNmZ2EsIG1lbV9tYjNjZik7CQkJLyogZ2V0IGJhbmsgMyBjb25maWcgcmVnICovCisgICAgcmVnc1szXSA9IG1mZGNyKG1lbWNmZ2QpOworCisgICAgLyogY29tcHV0ZSB0aGUgc2l6ZSwgYWRkIGVhY2ggYmFuayBpZiBlbmFibGVkICovCisgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJaWYgKHJlZ3NbaV0gJiAweDAwMDEpIHsJCQkvKiBpZiBlbmFibGVkLCAqLworCSAgICB0bXAgPSAoKHJlZ3NbaV0gPj4gKDMxIC0gMTQpKSAmIDB4Nyk7IC8qIGdldCBzaXplIGJpdHMgKi8KKwkgICAgdG1wID0gMHg0MDAwMDAgPDwgdG1wOwkJLyogU2l6ZSBiaXRzIFggNE1CID0gc2l6ZSAqLworCSAgICBzaXplICs9IHRtcDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK2ludCBtaXNjX2luaXRfZiAodm9pZCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3c3b19lbnZfaW5pdChWUEQgKnZwZCkKK3sKKyAgICAvKgorICAgICAqIFJlYWQgVlBECisgICAgICovCisgICAgaWYgKHZwZF9nZXRfZGF0YShDRkdfREVGX0VFUFJPTV9BRERSLCB2cGQpICE9IDApCisJcmV0dXJuOworCisgICAgIC8qCisgICAgICAqIEtub3duIGJvYXJkIHR5cGUuCisgICAgICAqLworICAgIGlmICh2cGQtPnByb2R1Y3RJZFswXSAmJgorCSgoc3RybmNtcCh2cGQtPnByb2R1Y3RJZCwgIkdNTSIsIDMpID09IDApIHx8CisJIChzdHJuY21wKHZwZC0+cHJvZHVjdElkLCAiQ01NIiwgMykgPT0gMCkpKSB7CisJY2hhciBidWZbMzBdOworCWNoYXIgKmV0aDsKKwl1bnNpZ25lZCBjaGFyICpzZXJpYWwgPSBnZXRlbnYoInNlcmlhbCMiKTsKKwl1bnNpZ25lZCBjaGFyICpldGhhZGRyID0gZ2V0ZW52KCJldGhhZGRyIik7CisKKwkvKiBTZXQgJ3NlcmlhbCMnIGVudnZhciBpZiBzZXJpYWwjIGlzbid0IHNldCAqLworCWlmICghc2VyaWFsKSB7CisJICAgIHNwcmludGYoYnVmLCAiJXMtJWxkIiwgdnBkLT5wcm9kdWN0SWQsIHZwZC0+c2VyaWFsTnVtKTsKKwkgICAgc2V0ZW52KCJzZXJpYWwjIiwgYnVmKTsKKwl9CisKKwkvKiBTZXQgJ2V0aGFkZHInIGVudnZhciBpZiAnZXRoYWRkcicgZW52dmFyIGlzIHRoZSBkZWZhdWx0ICovCisJZXRoID0gdnBkLT5ldGhBZGRyc1swXTsKKwlpZiAoZXRoYWRkciAmJiAoc3RyY21wKGV0aGFkZHIsIE1LX1NUUihDT05GSUdfRVRIQUREUikpID09IDApKSB7CisJICAgIC8qIE5vdyBzZXR1cCBldGhhZGRyICovCisJICAgIHNwcmludGYoYnVmLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkgICAgZXRoWzBdLCBldGhbMV0sIGV0aFsyXSwgZXRoWzNdLCBldGhbNF0sIGV0aFs1XSk7CisJICAgIHNldGVudigiZXRoYWRkciIsIGJ1Zik7CisJfQorICAgIH0KK30gLyogdzdvX2Vudl9pbml0KCkgKi8KKworCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisgICAgVlBEIHZwZDsJCQkJCS8qIFZQRCBpbmZvcm1hdGlvbiAqLworCisjaWYgZGVmaW5lZChDT05GSUdfVzdPTE1HKQorICAgIHVuc2lnbmVkIGxvbmcgZ3JlZzsJCQkJLyogR1BJTyBSZWdpc3RlciAqLworCisgICAgZ3JlZyA9IGluMzIoSUJNNDA1R1BfR1BJTzBfT1IpOworCisgICAgLyoKKyAgICAgKiBYWFggLSBVbnJlc2V0IGRldmljZXMgLSB0aGlzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIFZ4V29ya3MgZHJpdmVyIGNvZGUKKyAgICAgKi8KKyAgICBncmVnIHw9IDB4NDE4MDAwMDBMOwkJCS8qIFNBTSwgUEhZLCBHYWxpbGVvICovCisKKyAgICBvdXQzMihJQk00MDVHUF9HUElPMF9PUiwgZ3JlZyk7CQkvKiBzZXQgb3V0cHV0IHBpbnMgdG8gZGVmYXVsdCAqLworI2VuZGlmIC8qIENPTkZJR19XN09MTUcgKi8KKworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSBXN08gZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICovCisgICAgdzdvX2Vudl9pbml0KCZ2cGQpOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIHRoZSBGUEdBKHMpLgorICAgICAqLworICAgIGlmIChpbml0X2ZwZ2EoKSA9PSAwKQorCXRlc3RfZnBnYSgodW5zaWduZWQgc2hvcnQgKilDT05GSUdfRlBHQVNfQkFTRSk7CisKKyAgICAvKiBNb3JlIFBPU1QgdGVzdGluZy4gKi8KKyAgICBwb3N0MigpOworCisgICAgLyogRG9uZSB3aXRoIGhhcmR3YXJlIGluaXRpYWxpemF0aW9uIGFuZCBQT1NULiAqLworICAgIGxvZ19zdGF0KEVSUl9QT1NUT0spOworCisgICAgLyogQ2FsbCBzaWxseSwgZmFpbCBzYWZlIGJvb3QgaW5pdCByb3V0aW5lICovCisgICAgaW5pdF9mc2Jvb3QoKTsKKworCXJldHVybiAoMCk7Cit9CisKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZG9jLmMgYi9jb21tb24vY21kX2RvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDBmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vY21kX2RvYy5jCkBAIC0wLDAgKzEsMTU2MyBAQAorLyoKKyAqIERyaXZlciBmb3IgRGlzay1Pbi1DaGlwIDIwMDAgYW5kIE1pbGxlbm5pdW0KKyAqIChjKSAxOTk5IE1hY2hpbmUgVmlzaW9uIEhvbGRpbmdzLCBJbmMuCisgKiAoYykgMTk5OSwgMjAwMCBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogJElkOiBkb2MyMDAwLmMsdiAxLjQ2IDIwMDEvMTAvMDIgMTU6MDU6MTMgZHdtdzIgRXhwICQKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUworIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+CisjIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQlzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQorI2Vsc2UKKyMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCisjZW5kaWYKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKworI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfaWRzLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL2RvYzIwMDAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmZ0bC5oPgorCisjaWZkZWYgQ0ZHX0RPQ19TVVBQT1JUXzIwMDAKKyNkZWZpbmUgRG9DX2lzXzIwMDAoZG9jKSAoZG9jLT5DaGlwSUQgPT0gRE9DX0NoaXBJRF9Eb2MyaykKKyNlbHNlCisjZGVmaW5lIERvQ19pc18yMDAwKGRvYykgKDApCisjZW5kaWYKKworI2lmZGVmIENGR19ET0NfU1VQUE9SVF9NSUxMRU5OSVVNCisjZGVmaW5lIERvQ19pc19NaWxsZW5uaXVtKGRvYykgKGRvYy0+Q2hpcElEID09IERPQ19DaGlwSURfRG9jTWlsKQorI2Vsc2UKKyNkZWZpbmUgRG9DX2lzX01pbGxlbm5pdW0oZG9jKSAoMCkKKyNlbmRpZgorCisvKiBDRkdfRE9DX1BBU1NJVkVfUFJPQkU6CisgICBJbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgQklPUyBjaGVja3N1bSBpcyBjb3JyZWN0IGF0IGJvb3QgdGltZSwgYW5kCisgICBoZW5jZSB0aGF0IHRoZSBvbmJvYXJkIEJJT1MgZXh0ZW5zaW9uIGdldHMgZXhlY3V0ZWQsIHRoZSBEaXNrT25DaGlwCisgICBnb2VzIGludG8gcmVzZXQgbW9kZSB3aGVuIGl0IGlzIHJlYWQgc2VxdWVudGlhbGx5OiBhbGwgcmVnaXN0ZXJzCisgICByZXR1cm4gMHhmZiB1bnRpbCB0aGUgY2hpcCBpcyB3b2tlbiB1cCBhZ2FpbiBieSB3cml0aW5nIHRvIHRoZQorICAgRE9DQ29udHJvbCByZWdpc3Rlci4KKworICAgVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyB0aGF0IHRoZSBwcm9iZSBmb3IgdGhlIERpc2tPbkNoaXAgaXMgdW5zYWZlLAorICAgYmVjYXVzZSBvbmUgb2YgdGhlIGZpcnN0IHRoaW5ncyBpdCBkb2VzIGlzIHdyaXRlIHRvIHdoZXJlIGl0IHRoaW5rcworICAgdGhlIERPQ0NvbnRyb2wgcmVnaXN0ZXIgc2hvdWxkIGJlIC0gd2hpY2ggbWF5IHdlbGwgYmUgc2hhcmVkIG1lbW9yeQorICAgZm9yIGFub3RoZXIgZGV2aWNlLiBJJ3ZlIGhhZCBtYWNoaW5lcyB3aGljaCBsb2NrIHVwIHdoZW4gdGhpcyBpcworICAgYXR0ZW1wdGVkLiBIZW5jZSB0aGUgcG9zc2liaWxpdHkgdG8gZG8gYSBwYXNzaXZlIHByb2JlLCB3aGljaCB3aWxsIGZhaWwKKyAgIHRvIGRldGVjdCBhIGNoaXAgaW4gcmVzZXQgbW9kZSwgYnV0IGlzIGF0IGxlYXN0IGd1YXJhbnRlZWQgbm90IHRvIGxvY2sKKyAgIHRoZSBtYWNoaW5lLgorCisgICBJZiB5b3UgaGF2ZSB0aGlzIHByb2JsZW0sIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmU6CisjZGVmaW5lIENGR19ET0NfUEFTU0lWRV9QUk9CRQorKi8KKworI3VuZGVmCURPQ19ERUJVRworI3VuZGVmCUVDQ19ERUJVRworI3VuZGVmCVBTWUNIT19ERUJVRworI3VuZGVmCU5GVExfREVCVUcKKworc3RhdGljIHN0cnVjdCBEaXNrT25DaGlwIGRvY19kZXZfZGVzY1tDRkdfTUFYX0RPQ19ERVZJQ0VdOworCisvKiBDdXJyZW50IERPQyBEZXZpY2UJKi8KK3N0YXRpYyBpbnQgY3Vycl9kZXZpY2UgPSAtMTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgZG9fZG9jIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgcmNvZGUgPSAwOworCisgICAgc3dpdGNoIChhcmdjKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKwlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKHN0cmNtcChhcmd2WzFdLCJpbmZvIikgPT0gMCkgeworCQlpbnQgaTsKKworCQlwdXRjICgnXG4nKTsKKworCQlmb3IgKGk9MDsgaTxDRkdfTUFYX0RPQ19ERVZJQ0U7ICsraSkgeworCQkJaWYoZG9jX2Rldl9kZXNjW2ldLkNoaXBJRCA9PSBET0NfQ2hpcElEX1VOS05PV04pCisJCQkJY29udGludWU7IC8qIGxpc3Qgb25seSBrbm93biBkZXZpY2VzICovCisJCQlwcmludGYgKCJEZXZpY2UgJWQ6ICIsIGkpOworCQkJZG9jX3ByaW50KCZkb2NfZGV2X2Rlc2NbaV0pOworCQl9CisJCXJldHVybiAwOworCisJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwiZGV2aWNlIikgPT0gMCkgeworCQlpZiAoKGN1cnJfZGV2aWNlIDwgMCkgfHwgKGN1cnJfZGV2aWNlID49IENGR19NQVhfRE9DX0RFVklDRSkpIHsKKwkJCXB1dHMgKCJcbm5vIGRldmljZXMgYXZhaWxhYmxlXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXByaW50ZiAoIlxuRGV2aWNlICVkOiAiLCBjdXJyX2RldmljZSk7CisJCWRvY19wcmludCgmZG9jX2Rldl9kZXNjW2N1cnJfZGV2aWNlXSk7CisJCXJldHVybiAwOworCX0KKwlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworICAgIGNhc2UgMzoKKwlpZiAoc3RyY21wKGFyZ3ZbMV0sImRldmljZSIpID09IDApIHsKKwkJaW50IGRldiA9IChpbnQpc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApOworCisJCXByaW50ZiAoIlxuRGV2aWNlICVkOiAiLCBkZXYpOworCQlpZiAoZGV2ID49IENGR19NQVhfRE9DX0RFVklDRSkgeworCQkJcHV0cyAoInVua25vd24gZGV2aWNlXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWRvY19wcmludCgmZG9jX2Rldl9kZXNjW2Rldl0pOworCQkvKmRvY19wcmludCAoZGV2KTsqLworCisJCWlmIChkb2NfZGV2X2Rlc2NbZGV2XS5DaGlwSUQgPT0gRE9DX0NoaXBJRF9VTktOT1dOKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWN1cnJfZGV2aWNlID0gZGV2OworCisJCXB1dHMgKCIuLi4gaXMgbm93IGN1cnJlbnQgZGV2aWNlXG4iKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworICAgIGRlZmF1bHQ6CisJLyogYXQgbGVhc3QgNCBhcmdzICovCisKKwlpZiAoc3RyY21wKGFyZ3ZbMV0sInJlYWQiKSA9PSAwIHx8IHN0cmNtcChhcmd2WzFdLCJ3cml0ZSIpID09IDApIHsKKwkJdWxvbmcgYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwkJdWxvbmcgb2ZmICA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKwkJdWxvbmcgc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sIE5VTEwsIDE2KTsKKwkJaW50IGNtZCAgICA9IChzdHJjbXAoYXJndlsxXSwicmVhZCIpID09IDApOworCQlpbnQgcmV0LCB0b3RhbDsKKworCQlwcmludGYgKCJcbkRPQyAlczogZGV2aWNlICVkIG9mZnNldCAlbGQsIHNpemUgJWxkIC4uLiAiLAorCQkJY21kID8gInJlYWQiIDogIndyaXRlIiwgY3Vycl9kZXZpY2UsIG9mZiwgc2l6ZSk7CisKKwkJcmV0ID0gZG9jX3J3KGRvY19kZXZfZGVzYyArIGN1cnJfZGV2aWNlLCBjbWQsIG9mZiwgc2l6ZSwKKwkJCSAgICAgJnRvdGFsLCAodV9jaGFyKilhZGRyKTsKKworCQlwcmludGYgKCIlZCBieXRlcyAlczogJXNcbiIsIHRvdGFsLCBjbWQgPyAicmVhZCIgOiAid3JpdGUiLAorCQkJcmV0ID8gIkVSUk9SIiA6ICJPSyIpOworCisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwiZXJhc2UiKSA9PSAwKSB7CisJCXVsb25nIG9mZiA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwkJdWxvbmcgc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKwkJaW50IHJldDsKKworCQlwcmludGYgKCJcbkRPQyBlcmFzZTogZGV2aWNlICVkIG9mZnNldCAlbGQsIHNpemUgJWxkIC4uLiAiLAorCQkJY3Vycl9kZXZpY2UsIG9mZiwgc2l6ZSk7CisKKwkJcmV0ID0gZG9jX2VyYXNlIChkb2NfZGV2X2Rlc2MgKyBjdXJyX2RldmljZSwgb2ZmLCBzaXplKTsKKworCQlwcmludGYoIiVzXG4iLCByZXQgPyAiRVJST1IiIDogIk9LIik7CisKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCQlyY29kZSA9IDE7CisJfQorCisJcmV0dXJuIHJjb2RlOworICAgIH0KK30KKworaW50IGRvX2RvY2Jvb3QgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKmJvb3RfZGV2aWNlID0gTlVMTDsKKwljaGFyICplcDsKKwlpbnQgZGV2OworCXVsb25nIGNudDsKKwl1bG9uZyBhZGRyOworCXVsb25nIG9mZnNldCA9IDA7CisJaW1hZ2VfaGVhZGVyX3QgKmhkcjsKKwlpbnQgcmNvZGUgPSAwOworCisJc3dpdGNoIChhcmdjKSB7CisJY2FzZSAxOgorCQlhZGRyID0gQ0ZHX0xPQURfQUREUjsKKwkJYm9vdF9kZXZpY2UgPSBnZXRlbnYgKCJib290ZGV2aWNlIik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKwkJYm9vdF9kZXZpY2UgPSBnZXRlbnYgKCJib290ZGV2aWNlIik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKwkJYm9vdF9kZXZpY2UgPSBhcmd2WzJdOworCQlicmVhazsKKwljYXNlIDQ6CisJCWFkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisJCWJvb3RfZGV2aWNlID0gYXJndlsyXTsKKwkJb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFib290X2RldmljZSkgeworCQlwdXRzICgiXG4qKiBObyBib290IGRldmljZSAqKlxuIik7CisJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkZXYgPSBzaW1wbGVfc3RydG91bChib290X2RldmljZSwgJmVwLCAxNik7CisKKwlpZiAoKGRldiA+PSBDRkdfTUFYX0RPQ19ERVZJQ0UpIHx8CisJICAgIChkb2NfZGV2X2Rlc2NbZGV2XS5DaGlwSUQgPT0gRE9DX0NoaXBJRF9VTktOT1dOKSkgeworCQlwcmludGYgKCJcbioqIERldmljZSAlZCBub3QgYXZhaWxhYmxlXG4iLCBkZXYpOworCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHJpbnRmICgiXG5Mb2FkaW5nIGZyb20gZGV2aWNlICVkOiAlcyBhdCAweCVsWCAob2Zmc2V0IDB4JWxYKVxuIiwKKwkJZGV2LCBkb2NfZGV2X2Rlc2NbZGV2XS5uYW1lLCBkb2NfZGV2X2Rlc2NbZGV2XS5waHlzYWRyLAorCQlvZmZzZXQpOworCisJaWYgKGRvY19ydyAoZG9jX2Rldl9kZXNjICsgZGV2LCAxLCBvZmZzZXQsCisJCSAgICBTRUNUT1JTSVpFLCBOVUxMLCAodV9jaGFyICopYWRkcikpIHsKKwkJcHJpbnRmICgiKiogUmVhZCBlcnJvciBvbiAlZFxuIiwgZGV2KTsKKwkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXJldHVybiAxOworCX0KKworCWhkciA9IChpbWFnZV9oZWFkZXJfdCAqKWFkZHI7CisKKwlpZiAoaGRyLT5paF9tYWdpYyA9PSBJSF9NQUdJQykgeworCisJCXByaW50X2ltYWdlX2hkciAoaGRyKTsKKworCQljbnQgPSAoaGRyLT5paF9zaXplICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSk7CisJCWNudCAtPSBTRUNUT1JTSVpFOworCX0gZWxzZSB7CisJCXB1dHMgKCJcbioqIEJhZCBNYWdpYyBOdW1iZXIgKipcbiIpOworCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRvY19ydyAoZG9jX2Rldl9kZXNjICsgZGV2LCAxLCBvZmZzZXQgKyBTRUNUT1JTSVpFLCBjbnQsCisJCSAgICBOVUxMLCAodV9jaGFyICopKGFkZHIrU0VDVE9SU0laRSkpKSB7CisJCXByaW50ZiAoIioqIFJlYWQgZXJyb3Igb24gJWRcbiIsIGRldik7CisJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBMb2FkaW5nIG9rLCB1cGRhdGUgZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KKworCWxvYWRfYWRkciA9IGFkZHI7CisKKwkvKiBDaGVjayBpZiB3ZSBzaG91bGQgYXR0ZW1wdCBhbiBhdXRvLXN0YXJ0ICovCisJaWYgKCgoZXAgPSBnZXRlbnYoImF1dG9zdGFydCIpKSAhPSBOVUxMKSAmJiAoc3RyY21wKGVwLCJ5ZXMiKSA9PSAwKSkgeworCQljaGFyICpsb2NhbF9hcmdzWzJdOworCQlleHRlcm4gaW50IGRvX2Jvb3RtIChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKKworCQlsb2NhbF9hcmdzWzBdID0gYXJndlswXTsKKwkJbG9jYWxfYXJnc1sxXSA9IE5VTEw7CisKKwkJcHJpbnRmICgiQXV0b21hdGljIGJvb3Qgb2YgaW1hZ2UgYXQgYWRkciAweCUwOGxYIC4uLlxuIiwgYWRkcik7CisKKwkJZG9fYm9vdG0gKGNtZHRwLCAwLCAxLCBsb2NhbF9hcmdzKTsKKwkJcmNvZGUgPSAxOworCX0KKwlyZXR1cm4gcmNvZGU7Cit9CisKK2ludCBkb2NfcncgKHN0cnVjdCBEaXNrT25DaGlwKiB0aGlzLCBpbnQgY21kLAorCSAgICBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKwkgICAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYpCit7CisJaW50IG5vZWNjLCByZXQgPSAwLCBuLCB0b3RhbCA9IDA7CisJY2hhciBlY2NidWZbNl07CisKKwl3aGlsZShsZW4pIHsKKwkJLyogVGhlIEVDQyB3aWxsIG5vdCBiZSBjYWxjdWxhdGVkIGNvcnJlY3RseSBpZgorCQkgICBsZXNzIHRoYW4gNTEyIGlzIHdyaXR0ZW4gb3IgcmVhZCAqLworCQlub2VjYyA9IChmcm9tICE9IChmcm9tIHwgMHgxZmYpICsgMSkgfHwJKGxlbiA8IDB4MjAwKTsKKworCQlpZiAoY21kKQorCQkJcmV0ID0gZG9jX3JlYWRfZWNjKHRoaXMsIGZyb20sIGxlbiwKKwkJCQkJICAgJm4sICh1X2NoYXIqKWJ1ZiwKKwkJCQkJICAgbm9lY2MgPyBOVUxMIDogZWNjYnVmKTsKKwkJZWxzZQorCQkJcmV0ID0gZG9jX3dyaXRlX2VjYyh0aGlzLCBmcm9tLCBsZW4sCisJCQkJCSAgICAmbiwgKHVfY2hhciopYnVmLAorCQkJCQkgICAgbm9lY2MgPyBOVUxMIDogZWNjYnVmKTsKKworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJZnJvbSAgKz0gbjsKKwkJYnVmICAgKz0gbjsKKwkJdG90YWwgKz0gbjsKKwkJbGVuICAgLT0gbjsKKwl9CisKKwlpZiAocmV0bGVuKQorCQkqcmV0bGVuID0gdG90YWw7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGRvY19wcmludChzdHJ1Y3QgRGlza09uQ2hpcCAqdGhpcykgeworCXByaW50ZigiJXMgYXQgMHglbFgsXG4iCisJICAgICAgICJcdCAgJWQgY2hpcCVzICVzLCBzaXplICVkIE1CLCBcbiIKKwkgICAgICAgIlx0ICB0b3RhbCBzaXplICVsZCBNQiwgc2VjdG9yIHNpemUgJWxkIGtCXG4iLAorCSAgICAgICB0aGlzLT5uYW1lLCB0aGlzLT5waHlzYWRyLCB0aGlzLT5udW1jaGlwcywKKwkgICAgICAgdGhpcy0+bnVtY2hpcHM+MSA/ICJzIiA6ICIiLCB0aGlzLT5jaGlwc19uYW1lLAorCSAgICAgICAxIDw8ICh0aGlzLT5jaGlwc2hpZnQgLSAyMCksCisJICAgICAgIHRoaXMtPnRvdGxlbiA+PiAyMCwgdGhpcy0+ZXJhc2VzaXplID4+IDEwKTsKKworCWlmICh0aGlzLT5uZnRsX2ZvdW5kKSB7CisJCXN0cnVjdCBORlRMcmVjb3JkICpuZnRsID0gJnRoaXMtPm5mdGw7CisJCXVuc2lnbmVkIGxvbmcgYmluX3NpemUsIGZsYXNoX3NpemU7CisKKwkJYmluX3NpemUgPSBuZnRsLT5uYl9ib290X2Jsb2NrcyAqIHRoaXMtPmVyYXNlc2l6ZTsKKwkJZmxhc2hfc2l6ZSA9IChuZnRsLT5uYl9ibG9ja3MgLSBuZnRsLT5uYl9ib290X2Jsb2NrcykgKiB0aGlzLT5lcmFzZXNpemU7CisKKwkJcHJpbnRmKCJcdCAgTkZUTCBib290IHJlY29yZDpcbiIKKwkJICAgICAgICJcdCAgICBCaW5hcnkgcGFydGl0aW9uOiBzaXplICVsZCVzXG4iCisJCSAgICAgICAiXHQgICAgRmxhc2ggZGlzayBwYXJ0aXRpb246IHNpemUgJWxkJXMsIG9mZnNldCAweCVseFxuIiwKKwkJICAgICAgIGJpbl9zaXplID4gKDEgPDwgMjApID8gYmluX3NpemUgPj4gMjAgOiBiaW5fc2l6ZSA+PiAxMCwKKwkJICAgICAgIGJpbl9zaXplID4gKDEgPDwgMjApID8gIk1CIiA6ICJrQiIsCisJCSAgICAgICBmbGFzaF9zaXplID4gKDEgPDwgMjApID8gZmxhc2hfc2l6ZSA+PiAyMCA6IGZsYXNoX3NpemUgPj4gMTAsCisJCSAgICAgICBmbGFzaF9zaXplID4gKDEgPDwgMjApID8gIk1CIiA6ICJrQiIsIGJpbl9zaXplKTsKKwl9IGVsc2UgeworCQlwdXRzICgiXHQgIE5vIE5GVEwgYm9vdCByZWNvcmQgZm91bmQuXG4iKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgdG8gYXZvaWQgY2FsbHMgb2YgdGhlIF9fYXNocmRpMyBmdW5jdGlvbi4gKi8KK3N0YXRpYyBpbnQgc2hyKGludCB2YWwsIGludCBzaGlmdCkgeworCXJldHVybiB2YWwgPj4gc2hpZnQ7Cit9CisKKy8qIFBlcmZvcm0gdGhlIHJlcXVpcmVkIGRlbGF5IGN5Y2xlcyBieSByZWFkaW5nIGZyb20gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyICovCitzdGF0aWMgdm9pZCBEb0NfRGVsYXkoc3RydWN0IERpc2tPbkNoaXAgKmRvYywgdW5zaWduZWQgc2hvcnQgY3ljbGVzKQoreworCXZvbGF0aWxlIGNoYXIgZHVtbXk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3ljbGVzOyBpKyspIHsKKwkJaWYgKERvQ19pc19NaWxsZW5uaXVtKGRvYykpCisJCQlkdW1teSA9IFJlYWRET0MoZG9jLT52aXJ0YWRyLCBOT1ApOworCQllbHNlCisJCQlkdW1teSA9IFJlYWRET0MoZG9jLT52aXJ0YWRyLCBET0NTdGF0dXMpOworCX0KKworfQorCisvKiBET0NfV2FpdFJlYWR5OiBXYWl0IGZvciBSRFkgbGluZSB0byBiZSBhc3NlcnRlZCBieSB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBfRG9DX1dhaXRSZWFkeShzdHJ1Y3QgRGlza09uQ2hpcCAqZG9jKQoreworCXVuc2lnbmVkIGxvbmcgZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBnZXRfdGltZXIoMCk7CisKKyNpZmRlZiBQU1lDSE9fREVCVUcKKwlwdXRzICgiX0RvQ19XYWl0UmVhZHkgY2FsbGVkIGZvciBvdXQtb2YtbGluZSB3YWl0XG4iKTsKKyNlbmRpZgorCisJLyogT3V0LW9mLWxpbmUgcm91dGluZSB0byB3YWl0IGZvciBjaGlwIHJlc3BvbnNlICovCisJd2hpbGUgKCEoUmVhZERPQyhkb2NwdHIsIENEU05Db250cm9sKSAmIENEU05fQ1RSTF9GUl9CKSkgeworI2lmZGVmIENGR19ET0NfU0hPUlRfVElNRU9VVAorCQkvKiBpdCBzZWVtcyB0aGF0IGFmdGVyIGEgY2VydGFpbiB0aW1lIHRoZSBEb0MgZGVhc3NlcnRzCisJCSAqIHRoZSBDRFNOX0NUUkxfRlJfQiBhbHRob3VnaCBpdCBpcyBub3QgcmVhZHkuLi4KKwkJICogdXNpbmcgYSBzaG9ydCB0aW1vdXQgc29sdmUgdGhpcyAodGltZXIgaW5jcmVtZW50cyBldmVyeSBtcykgKi8KKwkJaWYgKGdldF90aW1lcihzdGFydCkgPiAxMCkgeworCQkJcmV0dXJuIERPQ19FVElNRU9VVDsKKwkJfQorI2Vsc2UKKwkJaWYgKGdldF90aW1lcihzdGFydCkgPiAxMCAqIDEwMDApIHsKKwkJCXB1dHMgKCJfRG9DX1dhaXRSZWFkeSB0aW1lZCBvdXQuXG4iKTsKKwkJCXJldHVybiBET0NfRVRJTUVPVVQ7CisJCX0KKyNlbmRpZgorCQl1ZGVsYXkoMSk7CisgICAgICAgIH0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IERvQ19XYWl0UmVhZHkoc3RydWN0IERpc2tPbkNoaXAgKmRvYykKK3sKKwl1bnNpZ25lZCBsb25nIGRvY3B0ciA9IGRvYy0+dmlydGFkcjsKKwkvKiBUaGlzIGlzIGlubGluZSwgdG8gb3B0aW1pc2UgdGhlIGNvbW1vbiBjYXNlLCB3aGVyZSBpdCdzIHJlYWR5IGluc3RhbnRseSAqLworCWludCByZXQgPSAwOworCisJLyogNCByZWFkIGZvcm0gTk9QIHJlZ2lzdGVyIHNob3VsZCBiZSBpc3N1ZWQgaW4gcHJpb3IgdG8gdGhlIHJlYWQgZnJvbSBDRFNOQ29udHJvbAorCSAgIHNlZSBTb2Z0d2FyZSBSZXF1aXJlbWVudCAxMS40IGl0ZW0gMi4gKi8KKwlEb0NfRGVsYXkoZG9jLCA0KTsKKworCWlmICghKFJlYWRET0MoZG9jcHRyLCBDRFNOQ29udHJvbCkgJiBDRFNOX0NUUkxfRlJfQikpCisJCS8qIENhbGwgdGhlIG91dC1vZi1saW5lIHJvdXRpbmUgdG8gd2FpdCAqLworCQlyZXQgPSBfRG9DX1dhaXRSZWFkeShkb2MpOworCisJLyogaXNzdWUgMiByZWFkIGZyb20gTk9QIHJlZ2lzdGVyIGFmdGVyIHJlYWRpbmcgZnJvbSBDRFNOQ29udHJvbCByZWdpc3RlcgorCSAgIHNlZSBTb2Z0d2FyZSBSZXF1aXJlbWVudCAxMS40IGl0ZW0gMi4gKi8KKwlEb0NfRGVsYXkoZG9jLCAyKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIERvQ19Db21tYW5kOiBTZW5kIGEgZmxhc2ggY29tbWFuZCB0byB0aGUgZmxhc2ggY2hpcCB0aHJvdWdoIHRoZSBDRFNOIFNsb3cgSU8gcmVnaXN0ZXIgdG8KKyAgIGJ5cGFzcyB0aGUgaW50ZXJuYWwgcGlwZWxpbmUuIEVhY2ggb2YgNCBkZWxheSBjeWNsZXMgKHJlYWQgZnJvbSB0aGUgTk9QIHJlZ2lzdGVyKSBpcworICAgcmVxdWlyZWQgYWZ0ZXIgd3JpdGluZyB0byBDRFNOIENvbnRyb2wgcmVnaXN0ZXIsIHNlZSBTb2Z0d2FyZSBSZXF1aXJlbWVudCAxMS40IGl0ZW0gMy4gKi8KKworc3RhdGljIGlubGluZSBpbnQgRG9DX0NvbW1hbmQoc3RydWN0IERpc2tPbkNoaXAgKmRvYywgdW5zaWduZWQgY2hhciBjb21tYW5kLAorCQkJICAgICAgdW5zaWduZWQgY2hhciB4dHJhZmxhZ3MpCit7CisJdW5zaWduZWQgbG9uZyBkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisKKwlpZiAoRG9DX2lzXzIwMDAoZG9jKSkKKwkJeHRyYWZsYWdzIHw9IENEU05fQ1RSTF9GTEFTSF9JTzsKKworCS8qIEFzc2VydCB0aGUgQ0xFIChDb21tYW5kIExhdGNoIEVuYWJsZSkgbGluZSB0byB0aGUgZmxhc2ggY2hpcCAqLworCVdyaXRlRE9DKHh0cmFmbGFncyB8IENEU05fQ1RSTF9DTEUgfCBDRFNOX0NUUkxfQ0UsIGRvY3B0ciwgQ0RTTkNvbnRyb2wpOworCURvQ19EZWxheShkb2MsIDQpOwkvKiBTb2Z0d2FyZSByZXF1aXJlbWVudCAxMS40LjMgZm9yIE1pbGxlbm5pdW0gKi8KKworCWlmIChEb0NfaXNfTWlsbGVubml1bShkb2MpKQorCQlXcml0ZURPQyhjb21tYW5kLCBkb2NwdHIsIENEU05TbG93SU8pOworCisJLyogU2VuZCB0aGUgY29tbWFuZCAqLworCVdyaXRlRE9DXyhjb21tYW5kLCBkb2NwdHIsIGRvYy0+aW9yZWcpOworCisJLyogTG93ZXIgdGhlIENMRSBsaW5lICovCisJV3JpdGVET0MoeHRyYWZsYWdzIHwgQ0RTTl9DVFJMX0NFLCBkb2NwdHIsIENEU05Db250cm9sKTsKKwlEb0NfRGVsYXkoZG9jLCA0KTsJLyogU29mdHdhcmUgcmVxdWlyZW1lbnQgMTEuNC4zIGZvciBNaWxsZW5uaXVtICovCisKKwkvKiBXYWl0IGZvciB0aGUgY2hpcCB0byByZXNwb25kIC0gU29mdHdhcmUgcmVxdWlyZW1lbnQgMTEuNC4xIChleHRlbmRlZCBmb3IgYW55IGNvbW1hbmQpICovCisJcmV0dXJuIERvQ19XYWl0UmVhZHkoZG9jKTsKK30KKworLyogRG9DX0FkZHJlc3M6IFNldCB0aGUgY3VycmVudCBhZGRyZXNzIGZvciB0aGUgZmxhc2ggY2hpcCB0aHJvdWdoIHRoZSBDRFNOIFNsb3cgSU8gcmVnaXN0ZXIgdG8KKyAgIGJ5cGFzcyB0aGUgaW50ZXJuYWwgcGlwZWxpbmUuIEVhY2ggb2YgNCBkZWxheSBjeWNsZXMgKHJlYWQgZnJvbSB0aGUgTk9QIHJlZ2lzdGVyKSBpcworICAgcmVxdWlyZWQgYWZ0ZXIgd3JpdGluZyB0byBDRFNOIENvbnRyb2wgcmVnaXN0ZXIsIHNlZSBTb2Z0d2FyZSBSZXF1aXJlbWVudCAxMS40IGl0ZW0gMy4gKi8KKworc3RhdGljIGludCBEb0NfQWRkcmVzcyhzdHJ1Y3QgRGlza09uQ2hpcCAqZG9jLCBpbnQgbnVtYnl0ZXMsIHVuc2lnbmVkIGxvbmcgb2ZzLAorCQkgICAgICAgdW5zaWduZWQgY2hhciB4dHJhZmxhZ3MxLCB1bnNpZ25lZCBjaGFyIHh0cmFmbGFnczIpCit7CisJdW5zaWduZWQgbG9uZyBkb2NwdHI7CisJaW50IGk7CisKKwlkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisKKwlpZiAoRG9DX2lzXzIwMDAoZG9jKSkKKwkJeHRyYWZsYWdzMSB8PSBDRFNOX0NUUkxfRkxBU0hfSU87CisKKwkvKiBBc3NlcnQgdGhlIEFMRSAoQWRkcmVzcyBMYXRjaCBFbmFibGUpIGxpbmUgdG8gdGhlIGZsYXNoIGNoaXAgKi8KKwlXcml0ZURPQyh4dHJhZmxhZ3MxIHwgQ0RTTl9DVFJMX0FMRSB8IENEU05fQ1RSTF9DRSwgZG9jcHRyLCBDRFNOQ29udHJvbCk7CisKKwlEb0NfRGVsYXkoZG9jLCA0KTsJLyogU29mdHdhcmUgcmVxdWlyZW1lbnQgMTEuNC4zIGZvciBNaWxsZW5uaXVtICovCisKKwkvKiBTZW5kIHRoZSBhZGRyZXNzICovCisJLyogRGV2aWNlcyB3aXRoIDI1Ni1ieXRlIHBhZ2UgYXJlIGFkZHJlc3NlZCBhczoKKwkgICBDb2x1bW4gKGJpdHMgMC03KSwgUGFnZSAoYml0cyA4LTE1LCAxNi0yMywgMjQtMzEpCisJICAgKiB0aGVyZSBpcyBubyBkZXZpY2Ugb24gdGhlIG1hcmtldCB3aXRoIHBhZ2UyNTYKKwkgICBhbmQgbW9yZSB0aGFuIDI0IGJpdHMuCisJICAgRGV2aWNlcyB3aXRoIDUxMi1ieXRlIHBhZ2UgYXJlIGFkZHJlc3NlZCBhczoKKwkgICBDb2x1bW4gKGJpdHMgMC03KSwgUGFnZSAoYml0cyA5LTE2LCAxNy0yNCwgMjUtMzEpCisJICAgKiAyNS0zMSBpcyBzZW50IG9ubHkgaWYgdGhlIGNoaXAgc3VwcG9ydCBpdC4KKwkgICAqIGJpdCA4IGNoYW5nZXMgdGhlIHJlYWQgY29tbWFuZCB0byBiZSBzZW50CisJICAgKE5BTkRfQ01EX1JFQUQwIG9yIE5BTkRfQ01EX1JFQUQxKS4KKwkgKi8KKworCWlmIChudW1ieXRlcyA9PSBBRERSX0NPTFVNTiB8fCBudW1ieXRlcyA9PSBBRERSX0NPTFVNTl9QQUdFKSB7CisJCWlmIChEb0NfaXNfTWlsbGVubml1bShkb2MpKQorCQkJV3JpdGVET0Mob2ZzICYgMHhmZiwgZG9jcHRyLCBDRFNOU2xvd0lPKTsKKwkJV3JpdGVET0NfKG9mcyAmIDB4ZmYsIGRvY3B0ciwgZG9jLT5pb3JlZyk7CisJfQorCisJaWYgKGRvYy0+cGFnZTI1NikgeworCQlvZnMgPSBvZnMgPj4gODsKKwl9IGVsc2UgeworCQlvZnMgPSBvZnMgPj4gOTsKKwl9CisKKwlpZiAobnVtYnl0ZXMgPT0gQUREUl9QQUdFIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRvYy0+cGFnZWFkcmxlbjsgaSsrLCBvZnMgPSBvZnMgPj4gOCkgeworCQkJaWYgKERvQ19pc19NaWxsZW5uaXVtKGRvYykpCisJCQkJV3JpdGVET0Mob2ZzICYgMHhmZiwgZG9jcHRyLCBDRFNOU2xvd0lPKTsKKwkJCVdyaXRlRE9DXyhvZnMgJiAweGZmLCBkb2NwdHIsIGRvYy0+aW9yZWcpOworCQl9CisJfQorCisJRG9DX0RlbGF5KGRvYywgMik7CS8qIE5lZWRlZCBmb3Igc29tZSBzbG93IGZsYXNoIGNoaXBzLiBtZi4gKi8KKworCS8qIEZJWE1FOiBUaGUgU2xvd0lPJ3MgZm9yIG1pbGxlbm5pdW0gY291bGQgYmUgcmVwbGFjZWQgYnkKKwkgICBhIHNpbmdsZSBXcml0ZVBpcGVUZXJtIGhlcmUuIG1mLiAqLworCisJLyogTG93ZXIgdGhlIEFMRSBsaW5lICovCisJV3JpdGVET0MoeHRyYWZsYWdzMSB8IHh0cmFmbGFnczIgfCBDRFNOX0NUUkxfQ0UsIGRvY3B0ciwKKwkJIENEU05Db250cm9sKTsKKworCURvQ19EZWxheShkb2MsIDQpOwkvKiBTb2Z0d2FyZSByZXF1aXJlbWVudCAxMS40LjMgZm9yIE1pbGxlbm5pdW0gKi8KKworCS8qIFdhaXQgZm9yIHRoZSBjaGlwIHRvIHJlc3BvbmQgLSBTb2Z0d2FyZSByZXF1aXJlbWVudCAxMS40LjEgKi8KKwlyZXR1cm4gRG9DX1dhaXRSZWFkeShkb2MpOworfQorCisvKiBSZWFkIGEgYnVmZmVyIGZyb20gRG9DLCB0YWtpbmcgY2FyZSBvZiBNaWxsZW5uaXVtIG9kZGl0eXMgKi8KK3N0YXRpYyB2b2lkIERvQ19SZWFkQnVmKHN0cnVjdCBEaXNrT25DaGlwICpkb2MsIHVfY2hhciAqIGJ1ZiwgaW50IGxlbikKK3sKKwl2b2xhdGlsZSBpbnQgZHVtbXk7CisJaW50IG1vZHVsdXMgPSAweGZmZmY7CisJdW5zaWduZWQgbG9uZyBkb2NwdHI7CisJaW50IGk7CisKKwlkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisKKwlpZiAobGVuIDw9IDApCisJCXJldHVybjsKKworCWlmIChEb0NfaXNfTWlsbGVubml1bShkb2MpKSB7CisJCS8qIFJlYWQgdGhlIGRhdGEgdmlhIHRoZSBpbnRlcm5hbCBwaXBlbGluZSB0aHJvdWdoIENEU04gSU8gcmVnaXN0ZXIsCisJCSAgIHNlZSBQaXBlbGluZWQgUmVhZCBPcGVyYXRpb25zIDExLjMgKi8KKwkJZHVtbXkgPSBSZWFkRE9DKGRvY3B0ciwgUmVhZFBpcGVJbml0KTsKKworCQkvKiBNaWxsZW5uaXVtIHNob3VsZCB1c2UgdGhlIExhc3REYXRhUmVhZCByZWdpc3RlciAtIFBpcGVsaW5lIFJlYWRzICovCisJCWxlbi0tOworCisJCS8qIFRoaXMgaXMgbmVlZGVkIGZvciBjb3JyZWN0bHkgRUNDIGNhbGN1bGF0aW9uICovCisJCW1vZHVsdXMgPSAweGZmOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJYnVmW2ldID0gUmVhZERPQ18oZG9jcHRyLCBkb2MtPmlvcmVnICsgKGkgJiBtb2R1bHVzKSk7CisKKwlpZiAoRG9DX2lzX01pbGxlbm5pdW0oZG9jKSkgeworCQlidWZbaV0gPSBSZWFkRE9DKGRvY3B0ciwgTGFzdERhdGFSZWFkKTsKKwl9Cit9CisKKy8qIFdyaXRlIGEgYnVmZmVyIHRvIERvQywgdGFraW5nIGNhcmUgb2YgTWlsbGVubml1bSBvZGRpdHlzICovCitzdGF0aWMgdm9pZCBEb0NfV3JpdGVCdWYoc3RydWN0IERpc2tPbkNoaXAgKmRvYywgY29uc3QgdV9jaGFyICogYnVmLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZG9jcHRyOworCWludCBpOworCisJZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCVdyaXRlRE9DXyhidWZbaV0sIGRvY3B0ciwgZG9jLT5pb3JlZyArIGkpOworCisJaWYgKERvQ19pc19NaWxsZW5uaXVtKGRvYykpIHsKKwkJV3JpdGVET0MoMHgwMCwgZG9jcHRyLCBXcml0ZVBpcGVUZXJtKTsKKwl9Cit9CisKKworLyogRG9DX1NlbGVjdENoaXA6IFNlbGVjdCBhIGdpdmVuIGZsYXNoIGNoaXAgd2l0aGluIHRoZSBjdXJyZW50IGZsb29yICovCisKK3N0YXRpYyBpbmxpbmUgaW50IERvQ19TZWxlY3RDaGlwKHN0cnVjdCBEaXNrT25DaGlwICpkb2MsIGludCBjaGlwKQoreworCXVuc2lnbmVkIGxvbmcgZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCisJLyogU29mdHdhcmUgcmVxdWlyZW1lbnQgMTEuNC40IGJlZm9yZSB3cml0aW5nIERldmljZVNlbGVjdCAqLworCS8qIERlYXNzZXJ0IHRoZSBDRSBsaW5lIHRvIGVsaW1pbmF0ZSBnbGl0Y2hlcyBvbiB0aGUgRkNFIyBvdXRwdXRzICovCisJV3JpdGVET0MoQ0RTTl9DVFJMX1dQLCBkb2NwdHIsIENEU05Db250cm9sKTsKKwlEb0NfRGVsYXkoZG9jLCA0KTsJLyogU29mdHdhcmUgcmVxdWlyZW1lbnQgMTEuNC4zIGZvciBNaWxsZW5uaXVtICovCisKKwkvKiBTZWxlY3QgdGhlIGluZGl2aWR1YWwgZmxhc2ggY2hpcCByZXF1ZXN0ZWQgKi8KKwlXcml0ZURPQyhjaGlwLCBkb2NwdHIsIENEU05EZXZpY2VTZWxlY3QpOworCURvQ19EZWxheShkb2MsIDQpOworCisJLyogUmVhc3NlcnQgdGhlIENFIGxpbmUgKi8KKwlXcml0ZURPQyhDRFNOX0NUUkxfQ0UgfCBDRFNOX0NUUkxfRkxBU0hfSU8gfCBDRFNOX0NUUkxfV1AsIGRvY3B0ciwKKwkJIENEU05Db250cm9sKTsKKwlEb0NfRGVsYXkoZG9jLCA0KTsJLyogU29mdHdhcmUgcmVxdWlyZW1lbnQgMTEuNC4zIGZvciBNaWxsZW5uaXVtICovCisKKwkvKiBXYWl0IGZvciBpdCB0byBiZSByZWFkeSAqLworCXJldHVybiBEb0NfV2FpdFJlYWR5KGRvYyk7Cit9CisKKy8qIERvQ19TZWxlY3RGbG9vcjogU2VsZWN0IGEgZ2l2ZW4gZmxvb3IgKGJhbmsgb2YgZmxhc2ggY2hpcHMpICovCisKK3N0YXRpYyBpbmxpbmUgaW50IERvQ19TZWxlY3RGbG9vcihzdHJ1Y3QgRGlza09uQ2hpcCAqZG9jLCBpbnQgZmxvb3IpCit7CisJdW5zaWduZWQgbG9uZyBkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisKKwkvKiBTZWxlY3QgdGhlIGZsb29yIChiYW5rKSBvZiBjaGlwcyByZXF1aXJlZCAqLworCVdyaXRlRE9DKGZsb29yLCBkb2NwdHIsIEZsb29yU2VsZWN0KTsKKworCS8qIFdhaXQgZm9yIHRoZSBjaGlwIHRvIGJlIHJlYWR5ICovCisJcmV0dXJuIERvQ19XYWl0UmVhZHkoZG9jKTsKK30KKworLyogRG9DX0lkZW50Q2hpcDogSWRlbnRpZnkgYSBnaXZlbiBOQU5EIGNoaXAgZ2l2ZW4ge2Zsb29yLGNoaXB9ICovCisKK3N0YXRpYyBpbnQgRG9DX0lkZW50Q2hpcChzdHJ1Y3QgRGlza09uQ2hpcCAqZG9jLCBpbnQgZmxvb3IsIGludCBjaGlwKQoreworCWludCBtZnIsIGlkLCBpOworCXZvbGF0aWxlIGNoYXIgZHVtbXk7CisKKwkvKiBQYWdlIGluIHRoZSByZXF1aXJlZCBmbG9vci9jaGlwICovCisJRG9DX1NlbGVjdEZsb29yKGRvYywgZmxvb3IpOworCURvQ19TZWxlY3RDaGlwKGRvYywgY2hpcCk7CisKKwkvKiBSZXNldCB0aGUgY2hpcCAqLworCWlmIChEb0NfQ29tbWFuZChkb2MsIE5BTkRfQ01EX1JFU0VULCBDRFNOX0NUUkxfV1ApKSB7CisjaWZkZWYgRE9DX0RFQlVHCisJCXByaW50ZigiRG9DX0NvbW1hbmQgKHJlc2V0KSBmb3IgJWQsJWQgcmV0dXJuZWQgdHJ1ZVxuIiwKKwkJICAgICAgIGZsb29yLCBjaGlwKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKworCS8qIFJlYWQgdGhlIE5BTkQgY2hpcCBJRDogMS4gU2VuZCBSZWFkSUQgY29tbWFuZCAqLworCWlmIChEb0NfQ29tbWFuZChkb2MsIE5BTkRfQ01EX1JFQURJRCwgQ0RTTl9DVFJMX1dQKSkgeworI2lmZGVmIERPQ19ERUJVRworCQlwcmludGYoIkRvQ19Db21tYW5kIChSZWFkSUQpIGZvciAlZCwlZCByZXR1cm5lZCB0cnVlXG4iLAorCQkgICAgICAgZmxvb3IsIGNoaXApOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCS8qIFJlYWQgdGhlIE5BTkQgY2hpcCBJRDogMi4gU2VuZCBhZGRyZXNzIGJ5dGUgemVybyAqLworCURvQ19BZGRyZXNzKGRvYywgQUREUl9DT0xVTU4sIDAsIENEU05fQ1RSTF9XUCwgMCk7CisKKwkvKiBSZWFkIHRoZSBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBpZCBjb2RlcyBmcm9tIHRoZSBkZXZpY2UgKi8KKworCS8qIENEU04gU2xvdyBJTyByZWdpc3RlciBzZWUgU29mdHdhcmUgUmVxdWlyZW1lbnQgMTEuNCBpdGVtIDUuICovCisJZHVtbXkgPSBSZWFkRE9DKGRvYy0+dmlydGFkciwgQ0RTTlNsb3dJTyk7CisJRG9DX0RlbGF5KGRvYywgMik7CisJbWZyID0gUmVhZERPQ18oZG9jLT52aXJ0YWRyLCBkb2MtPmlvcmVnKTsKKworCS8qIENEU04gU2xvdyBJTyByZWdpc3RlciBzZWUgU29mdHdhcmUgUmVxdWlyZW1lbnQgMTEuNCBpdGVtIDUuICovCisJZHVtbXkgPSBSZWFkRE9DKGRvYy0+dmlydGFkciwgQ0RTTlNsb3dJTyk7CisJRG9DX0RlbGF5KGRvYywgMik7CisJaWQgPSBSZWFkRE9DXyhkb2MtPnZpcnRhZHIsIGRvYy0+aW9yZWcpOworCisJLyogTm8gcmVzcG9uc2UgLSByZXR1cm4gZmFpbHVyZSAqLworCWlmIChtZnIgPT0gMHhmZiB8fCBtZnIgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayBpdCdzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBjaGlwIHdlIGlkZW50aWZpZWQuCisJICogTS1TeXN0ZW1zIHNheSB0aGF0IGFueSBnaXZlbiBEaXNrT25DaGlwIGRldmljZSBzaG91bGQgb25seQorCSAqIGNvbnRhaW4gX29uZV8gdHlwZSBvZiBmbGFzaCBwYXJ0LCBhbHRob3VnaCB0aGF0J3Mgbm90IGEKKwkgKiBoYXJkd2FyZSByZXN0cmljdGlvbi4gKi8KKwlpZiAoZG9jLT5tZnIpIHsKKwkJaWYgKGRvYy0+bWZyID09IG1mciAmJiBkb2MtPmlkID09IGlkKQorCQkJcmV0dXJuIDE7CS8qIFRoaXMgaXMgYW5vdGhlciB0aGUgc2FtZSB0aGUgZmlyc3QgKi8KKwkJZWxzZQorCQkJcHJpbnRmKCJGbGFzaCBjaGlwIGF0IGZsb29yICVkLCBjaGlwICVkIGlzIGRpZmZlcmVudDpcbiIsCisJCQkgICAgICAgZmxvb3IsIGNoaXApOworCX0KKworCS8qIFByaW50IGFuZCBzdG9yZSB0aGUgbWFudWZhY3R1cmVyIGFuZCBJRCBjb2Rlcy4gKi8KKwlmb3IgKGkgPSAwOyBuYW5kX2ZsYXNoX2lkc1tpXS5uYW1lICE9IE5VTEw7IGkrKykgeworCQlpZiAobWZyID09IG5hbmRfZmxhc2hfaWRzW2ldLm1hbnVmYWN0dXJlX2lkICYmCisJCSAgICBpZCA9PSBuYW5kX2ZsYXNoX2lkc1tpXS5tb2RlbF9pZCkgeworI2lmZGVmIERPQ19ERUJVRworCQkJcHJpbnRmKCJGbGFzaCBjaGlwIGZvdW5kOiBNYW51ZmFjdHVyZXIgSUQ6ICUyLjJYLCAiCisJCQkgICAgICAgIkNoaXAgSUQ6ICUyLjJYICglcylcbiIsIG1mciwgaWQsCisJCQkgICAgICAgbmFuZF9mbGFzaF9pZHNbaV0ubmFtZSk7CisjZW5kaWYKKwkJCWlmICghZG9jLT5tZnIpIHsKKwkJCQlkb2MtPm1mciA9IG1mcjsKKwkJCQlkb2MtPmlkID0gaWQ7CisJCQkJZG9jLT5jaGlwc2hpZnQgPQorCQkJCSAgICBuYW5kX2ZsYXNoX2lkc1tpXS5jaGlwc2hpZnQ7CisJCQkJZG9jLT5wYWdlMjU2ID0gbmFuZF9mbGFzaF9pZHNbaV0ucGFnZTI1NjsKKwkJCQlkb2MtPnBhZ2VhZHJsZW4gPQorCQkJCSAgICBuYW5kX2ZsYXNoX2lkc1tpXS5wYWdlYWRybGVuOworCQkJCWRvYy0+ZXJhc2VzaXplID0KKwkJCQkgICAgbmFuZF9mbGFzaF9pZHNbaV0uZXJhc2VzaXplOworCQkJCWRvYy0+Y2hpcHNfbmFtZSA9CisJCQkJICAgIG5hbmRfZmxhc2hfaWRzW2ldLm5hbWU7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCisjaWZkZWYgRE9DX0RFQlVHCisJLyogV2UgaGF2ZW4ndCBmdWxseSBpZGVudGlmaWVkIHRoZSBjaGlwLiBQcmludCBhcyBtdWNoIGFzIHdlIGtub3cuICovCisJcHJpbnRmKCJVbmtub3duIGZsYXNoIGNoaXAgZm91bmQ6ICUyLjJYICUyLjJYXG4iLAorCSAgICAgICBpZCwgbWZyKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKy8qIERvQ19TY2FuQ2hpcHM6IEZpbmQgYWxsIE5BTkQgY2hpcHMgcHJlc2VudCBpbiBhIERpc2tPbkNoaXAsIGFuZCBpZGVudGlmeSB0aGVtICovCisKK3N0YXRpYyB2b2lkIERvQ19TY2FuQ2hpcHMoc3RydWN0IERpc2tPbkNoaXAgKnRoaXMpCit7CisJaW50IGZsb29yLCBjaGlwOworCWludCBudW1jaGlwc1tNQVhfRkxPT1JTXTsKKwlpbnQgbWF4Y2hpcHMgPSBNQVhfQ0hJUFM7CisJaW50IHJldCA9IDE7CisKKwl0aGlzLT5udW1jaGlwcyA9IDA7CisJdGhpcy0+bWZyID0gMDsKKwl0aGlzLT5pZCA9IDA7CisKKwlpZiAoRG9DX2lzX01pbGxlbm5pdW0odGhpcykpCisJCW1heGNoaXBzID0gTUFYX0NISVBTX01JTDsKKworCS8qIEZvciBlYWNoIGZsb29yLCBmaW5kIHRoZSBudW1iZXIgb2YgdmFsaWQgY2hpcHMgaXQgY29udGFpbnMgKi8KKwlmb3IgKGZsb29yID0gMDsgZmxvb3IgPCBNQVhfRkxPT1JTOyBmbG9vcisrKSB7CisJCXJldCA9IDE7CisJCW51bWNoaXBzW2Zsb29yXSA9IDA7CisJCWZvciAoY2hpcCA9IDA7IGNoaXAgPCBtYXhjaGlwcyAmJiByZXQgIT0gMDsgY2hpcCsrKSB7CisKKwkJCXJldCA9IERvQ19JZGVudENoaXAodGhpcywgZmxvb3IsIGNoaXApOworCQkJaWYgKHJldCkgeworCQkJCW51bWNoaXBzW2Zsb29yXSsrOworCQkJCXRoaXMtPm51bWNoaXBzKys7CisJCQl9CisJCX0KKwl9CisKKwkvKiBJZiB0aGVyZSBhcmUgbm9uZSBhdCBhbGwgdGhhdCB3ZSByZWNvZ25pc2UsIGJhaWwgKi8KKwlpZiAoIXRoaXMtPm51bWNoaXBzKSB7CisJCXB1dHMgKCJObyBmbGFzaCBjaGlwcyByZWNvZ25pc2VkLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhbiBhcnJheSB0byBob2xkIHRoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBjaGlwICovCisJdGhpcy0+Y2hpcHMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBOYW5kKSAqIHRoaXMtPm51bWNoaXBzKTsKKwlpZiAoIXRoaXMtPmNoaXBzKSB7CisJCXB1dHMgKCJObyBtZW1vcnkgZm9yIGFsbG9jYXRpbmcgY2hpcCBpbmZvIHN0cnVjdHVyZXNcbiIpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gMDsKKworCS8qIEZpbGwgb3V0IHRoZSBjaGlwIGFycmF5IHdpdGgge2Zsb29yLCBjaGlwbm99IGZvciBlYWNoCisJICogZGV0ZWN0ZWQgY2hpcCBpbiB0aGUgZGV2aWNlLiAqLworCWZvciAoZmxvb3IgPSAwOyBmbG9vciA8IE1BWF9GTE9PUlM7IGZsb29yKyspIHsKKwkJZm9yIChjaGlwID0gMDsgY2hpcCA8IG51bWNoaXBzW2Zsb29yXTsgY2hpcCsrKSB7CisJCQl0aGlzLT5jaGlwc1tyZXRdLmZsb29yID0gZmxvb3I7CisJCQl0aGlzLT5jaGlwc1tyZXRdLmNoaXAgPSBjaGlwOworCQkJdGhpcy0+Y2hpcHNbcmV0XS5jdXJhZHIgPSAwOworCQkJdGhpcy0+Y2hpcHNbcmV0XS5jdXJtb2RlID0gMHg1MDsKKwkJCXJldCsrOworCQl9CisJfQorCisJLyogQ2FsY3VsYXRlIGFuZCBwcmludCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZGV2aWNlICovCisJdGhpcy0+dG90bGVuID0gdGhpcy0+bnVtY2hpcHMgKiAoMSA8PCB0aGlzLT5jaGlwc2hpZnQpOworCisjaWZkZWYgRE9DX0RFQlVHCisJcHJpbnRmKCIlZCBmbGFzaCBjaGlwcyBmb3VuZC4gVG90YWwgRGlza09uQ2hpcCBzaXplOiAlbGQgTUJcbiIsCisJICAgICAgIHRoaXMtPm51bWNoaXBzLCB0aGlzLT50b3RsZW4gPj4gMjApOworI2VuZGlmCit9CisKKy8qIGZpbmRfYm9vdF9yZWNvcmQ6IEZpbmQgdGhlIE5GVEwgTWVkaWEgSGVhZGVyIGFuZCBpdHMgU3BhcmUgY29weSB3aGljaCBjb250YWlucyB0aGUKKyAqCXZhcmlvdXMgZGV2aWNlIGluZm9ybWF0aW9uIG9mIHRoZSBORlRMIHBhcnRpdGlvbiBhbmQgQmFkIFVuaXQgVGFibGUuIFVwZGF0ZQorICoJdGhlIFJlcGxVbml0VGFibGVbXSB0YWJsZSBhY2Nyb2RpbmcgdG8gdGhlIEJhZCBVbml0IFRhYmxlLiBSZXBsVW5pdFRhYmxlW10KKyAqCWlzIHVzZWQgZm9yIG1hbmFnZW1lbnQgb2YgRXJhc2UgVW5pdCBpbiBvdGhlciByb3V0aW5lcyBpbiBuZnRsLmMgYW5kIG5mdGxtb3VudC5jCisgKi8KK3N0YXRpYyBpbnQgZmluZF9ib290X3JlY29yZChzdHJ1Y3QgTkZUTHJlY29yZCAqbmZ0bCkKK3sKKwlzdHJ1Y3QgbmZ0bF91Y2kxIGgxOworCXN0cnVjdCBuZnRsX29vYiBvb2I7CisJdW5zaWduZWQgaW50IGJsb2NrLCBib290X3JlY29yZF9jb3VudCA9IDA7CisJaW50IHJldGxlbjsKKwl1OCBidWZbU0VDVE9SU0laRV07CisJc3RydWN0IE5GVExNZWRpYUhlYWRlciAqbWggPSAmbmZ0bC0+TWVkaWFIZHI7CisJdW5zaWduZWQgaW50IGk7CisKKwluZnRsLT5NZWRpYVVuaXQgPSBCTE9DS19OSUw7CisJbmZ0bC0+U3BhcmVNZWRpYVVuaXQgPSBCTE9DS19OSUw7CisKKwkvKiBzZWFyY2ggZm9yIGEgdmFsaWQgYm9vdCByZWNvcmQgKi8KKwlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBuZnRsLT5uYl9ibG9ja3M7IGJsb2NrKyspIHsKKwkJaW50IHJldDsKKworCQkvKiBDaGVjayBmb3IgQU5BTkQgaGVhZGVyIGZpcnN0LiBUaGVuIGNhbiB3aGluZ2UgaWYgaXQncyBmb3VuZCBidXQgbGF0ZXIKKwkJICAgY2hlY2tzIGZhaWwgKi8KKwkJaWYgKChyZXQgPSBkb2NfcmVhZF9lY2MobmZ0bC0+bXRkLCBibG9jayAqIG5mdGwtPkVyYXNlU2l6ZSwgU0VDVE9SU0laRSwKKwkJCQkJJnJldGxlbiwgYnVmLCBOVUxMKSkpIHsKKwkJCXN0YXRpYyBpbnQgd2FybmNvdW50ID0gNTsKKworCQkJaWYgKHdhcm5jb3VudCkgeworCQkJCXByaW50ZigiQmxvY2sgcmVhZCBhdCAweCV4IGZhaWxlZFxuIiwgYmxvY2sgKiBuZnRsLT5FcmFzZVNpemUpOworCQkJCWlmICghLS13YXJuY291bnQpCisJCQkJCXB1dHMgKCJGdXJ0aGVyIGZhaWx1cmVzIGZvciB0aGlzIGJsb2NrIHdpbGwgbm90IGJlIHByaW50ZWRcbiIpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmV0bGVuIDwgNiB8fCBtZW1jbXAoYnVmLCAiQU5BTkQiLCA2KSkgeworCQkJLyogQU5BTkRcMCBub3QgZm91bmQuIENvbnRpbnVlICovCisjaWZkZWYgUFNZQ0hPX0RFQlVHCisJCQlwcmludGYoIkFOQU5EIGhlYWRlciBub3QgZm91bmQgYXQgMHgleFxuIiwgYmxvY2sgKiBuZnRsLT5FcmFzZVNpemUpOworI2VuZGlmCisJCQljb250aW51ZTsKKwkJfQorCisjaWZkZWYgTkZUTF9ERUJVRworCQlwcmludGYoIkFOQU5EIGhlYWRlciBmb3VuZCBhdCAweCV4XG4iLCBibG9jayAqIG5mdGwtPkVyYXNlU2l6ZSk7CisjZW5kaWYKKworCQkvKiBUbyBiZSBzYWZlciB3aXRoIEJJT1MsIGFsc28gdXNlIGVyYXNlIG1hcmsgYXMgZGlzY3JpbWluYW50ICovCisJCWlmICgocmV0ID0gZG9jX3JlYWRfb29iKG5mdGwtPm10ZCwgYmxvY2sgKiBuZnRsLT5FcmFzZVNpemUgKyBTRUNUT1JTSVpFICsgOCwKKwkJCQk4LCAmcmV0bGVuLCAoY2hhciAqKSZoMSkgPCAwKSkgeworI2lmZGVmIE5GVExfREVCVUcKKwkJCXByaW50ZigiQU5BTkQgaGVhZGVyIGZvdW5kIGF0IDB4JXgsIGJ1dCBPT0IgZGF0YSByZWFkIGZhaWxlZFxuIiwKKwkJCSAgICAgICBibG9jayAqIG5mdGwtPkVyYXNlU2l6ZSk7CisjZW5kaWYKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogT0ssIHdlIGxpa2UgaXQuICovCisKKwkJaWYgKGJvb3RfcmVjb3JkX2NvdW50KSB7CisJCQkvKiBXZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCBvbmUuIFNvIHdlIGp1c3QgY2hlY2sgaWYKKwkJCSAgIHRoaXMgb25lIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBvbmUgd2UgZm91bmQgKi8KKwkJCWlmIChtZW1jbXAobWgsIGJ1Ziwgc2l6ZW9mKHN0cnVjdCBORlRMTWVkaWFIZWFkZXIpKSkgeworI2lmZGVmIE5GVExfREVCVUcKKwkJCQlwcmludGYoIk5GVEwgTWVkaWEgSGVhZGVycyBhdCAweCV4IGFuZCAweCV4IGRpc2FncmVlLlxuIiwKKwkJCQkgICAgICAgbmZ0bC0+TWVkaWFVbml0ICogbmZ0bC0+RXJhc2VTaXplLCBibG9jayAqIG5mdGwtPkVyYXNlU2l6ZSk7CisjZW5kaWYKKwkJCQkvKiBpZiAoZGVidWcpIFByaW50IGJvdGggc2lkZSBieSBzaWRlICovCisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGJvb3RfcmVjb3JkX2NvdW50ID09IDEpCisJCQkJbmZ0bC0+U3BhcmVNZWRpYVVuaXQgPSBibG9jazsKKworCQkJYm9vdF9yZWNvcmRfY291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhpcyBpcyB0aGUgZmlyc3Qgd2UndmUgc2Vlbi4gQ29weSB0aGUgbWVkaWEgaGVhZGVyIHN0cnVjdHVyZSBpbnRvIHBsYWNlICovCisJCW1lbWNweShtaCwgYnVmLCBzaXplb2Yoc3RydWN0IE5GVExNZWRpYUhlYWRlcikpOworCisJCS8qIERvIHNvbWUgc2FuaXR5IGNoZWNrcyBvbiBpdCAqLworCQlpZiAobWgtPlVuaXRTaXplRmFjdG9yICE9IDB4ZmYpIHsKKwkJCXB1dHMgKCJTb3JyeSwgd2UgZG9uJ3Qgc3VwcG9ydCBVbml0U2l6ZUZhY3RvciAiCisJCQkgICAgICAib2YgIT0gMSB5ZXQuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW5mdGwtPm5iX2Jvb3RfYmxvY2tzID0gbGUxNl90b19jcHUobWgtPkZpcnN0UGh5c2ljYWxFVU4pOworCQlpZiAoKG5mdGwtPm5iX2Jvb3RfYmxvY2tzICsgMikgPj0gbmZ0bC0+bmJfYmxvY2tzKSB7CisJCQlwcmludGYgKCJORlRMIE1lZGlhIEhlYWRlciBzYW5pdHkgY2hlY2sgZmFpbGVkOlxuIgorCQkJCSJuYl9ib290X2Jsb2NrcyAoJWQpICsgMiA+IG5iX2Jsb2NrcyAoJWQpXG4iLAorCQkJCW5mdGwtPm5iX2Jvb3RfYmxvY2tzLCBuZnRsLT5uYl9ibG9ja3MpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJbmZ0bC0+bnVtdnVuaXRzID0gbGUzMl90b19jcHUobWgtPkZvcm1hdHRlZFNpemUpIC8gbmZ0bC0+RXJhc2VTaXplOworCQlpZiAobmZ0bC0+bnVtdnVuaXRzID4gKG5mdGwtPm5iX2Jsb2NrcyAtIG5mdGwtPm5iX2Jvb3RfYmxvY2tzIC0gMikpIHsKKwkJCXByaW50ZiAoIk5GVEwgTWVkaWEgSGVhZGVyIHNhbml0eSBjaGVjayBmYWlsZWQ6XG4iCisJCQkJIm51bXZ1bml0cyAoJWQpID4gbmJfYmxvY2tzICglZCkgLSBuYl9ib290X2Jsb2NrcyglZCkgLSAyXG4iLAorCQkJCW5mdGwtPm51bXZ1bml0cywKKwkJCQluZnRsLT5uYl9ibG9ja3MsCisJCQkJbmZ0bC0+bmJfYm9vdF9ibG9ja3MpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJbmZ0bC0+bnJfc2VjdHMgID0gbmZ0bC0+bnVtdnVuaXRzICogKG5mdGwtPkVyYXNlU2l6ZSAvIFNFQ1RPUlNJWkUpOworCisJCS8qIElmIHdlJ3JlIG5vdCB1c2luZyB0aGUgbGFzdCBzZWN0b3JzIGluIHRoZSBkZXZpY2UgZm9yIHNvbWUgcmVhc29uLAorCQkgICByZWR1Y2UgbmJfYmxvY2tzIGFjY29yZGluZ2x5IHNvIHdlIGZvcmdldCB0aGV5J3JlIHRoZXJlICovCisJCW5mdGwtPm5iX2Jsb2NrcyA9IGxlMTZfdG9fY3B1KG1oLT5OdW1FcmFzZVVuaXRzKSArIGxlMTZfdG9fY3B1KG1oLT5GaXJzdFBoeXNpY2FsRVVOKTsKKworCQkvKiByZWFkIHRoZSBCYWQgRXJhc2UgVW5pdCBUYWJsZSBhbmQgbW9kaWZ5IFJlcGxVbml0VGFibGVbXSBhY2NvcmRpbmdseSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbmZ0bC0+bmJfYmxvY2tzOyBpKyspIHsKKwkJCWlmICgoaSAmIChTRUNUT1JTSVpFIC0gMSkpID09IDApIHsKKwkJCQkvKiByZWFkIG9uZSBzZWN0b3IgZm9yIGV2ZXJ5IFNFQ1RPUlNJWkUgb2YgYmxvY2tzICovCisJCQkJaWYgKChyZXQgPSBkb2NfcmVhZF9lY2MobmZ0bC0+bXRkLCBibG9jayAqIG5mdGwtPkVyYXNlU2l6ZSArCisJCQkJCQkgICAgICAgaSArIFNFQ1RPUlNJWkUsIFNFQ1RPUlNJWkUsCisJCQkJCQkgICAgICAgJnJldGxlbiwgYnVmLCAoY2hhciAqKSZvb2IpKSA8IDApIHsKKwkJCQkJcHV0cyAoIlJlYWQgb2YgYmFkIHNlY3RvciB0YWJsZSBmYWlsZWRcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCQkJLyogbWFyayB0aGUgQmFkIEVyYXNlIFVuaXQgYXMgUkVTRVJWRUQgaW4gUmVwbFVuaXRUYWJsZSAqLworCQkJaWYgKGJ1ZltpICYgKFNFQ1RPUlNJWkUgLSAxKV0gIT0gMHhmZikKKwkJCQluZnRsLT5SZXBsVW5pdFRhYmxlW2ldID0gQkxPQ0tfUkVTRVJWRUQ7CisJCX0KKworCQluZnRsLT5NZWRpYVVuaXQgPSBibG9jazsKKwkJYm9vdF9yZWNvcmRfY291bnQrKzsKKworCX0gLyogZm9yZWFjaCAoYmxvY2spICovCisKKwlyZXR1cm4gYm9vdF9yZWNvcmRfY291bnQ/MDotMTsKK30KKworLyogVGhpcyByb3V0aW5lIGlzIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVyIG10ZCBjb2RlIHZpYQorICogaW50ZXJfbW9kdWxlX3JlZ2lzdGVyLiAgSXQgbXVzdCBvbmx5IGJlIGFjY2Vzc2VkIHRocm91Z2gKKyAqIGludGVyX21vZHVsZV9nZXQgd2hpY2ggd2lsbCBidW1wIHRoZSB1c2UgY291bnQgb2YgdGhpcyBtb2R1bGUuICBUaGUKKyAqIGFkZHJlc3NlcyBwYXNzZWQgYmFjayBpbiBtdGQgYXJlIHZhbGlkIGFzIGxvbmcgYXMgdGhlIHVzZSBjb3VudCBvZgorICogdGhpcyBtb2R1bGUgaXMgbm9uLXplcm8sIGkuZS4gYmV0d2VlbiBpbnRlcl9tb2R1bGVfZ2V0IGFuZAorICogaW50ZXJfbW9kdWxlX3B1dC4gIEtlaXRoIE93ZW5zIDxrYW9zQG9jcy5jb20uYXU+IDI5IE9jdCAyMDAwLgorICovCitzdGF0aWMgdm9pZCBEb0Mya19pbml0KHN0cnVjdCBEaXNrT25DaGlwKiB0aGlzKQoreworCXN0cnVjdCBORlRMcmVjb3JkICpuZnRsOworCisJc3dpdGNoICh0aGlzLT5DaGlwSUQpIHsKKwljYXNlIERPQ19DaGlwSURfRG9jMms6CisJCXRoaXMtPm5hbWUgPSAiRGlza09uQ2hpcCAyMDAwIjsKKwkJdGhpcy0+aW9yZWcgPSBEb0NfMmtfQ0RTTl9JTzsKKwkJYnJlYWs7CisJY2FzZSBET0NfQ2hpcElEX0RvY01pbDoKKwkJdGhpcy0+bmFtZSA9ICJEaXNrT25DaGlwIE1pbGxlbm5pdW0iOworCQl0aGlzLT5pb3JlZyA9IERvQ19NaWxfQ0RTTl9JTzsKKwkJYnJlYWs7CisJfQorCisjaWZkZWYgRE9DX0RFQlVHCisJcHJpbnRmKCIlcyBmb3VuZCBhdCBhZGRyZXNzIDB4JWxYXG4iLCB0aGlzLT5uYW1lLAorCSAgICAgICB0aGlzLT5waHlzYWRyKTsKKyNlbmRpZgorCisJdGhpcy0+dG90bGVuID0gMDsKKwl0aGlzLT5udW1jaGlwcyA9IDA7CisKKwl0aGlzLT5jdXJmbG9vciA9IC0xOworCXRoaXMtPmN1cmNoaXAgPSAtMTsKKworCS8qIElkZW50IGFsbCB0aGUgY2hpcHMgcHJlc2VudC4gKi8KKwlEb0NfU2NhbkNoaXBzKHRoaXMpOworCisJbmZ0bCA9ICZ0aGlzLT5uZnRsOworCisJLyogR2V0IHBoeXNpY2FsIHBhcmFtZXRlcnMgKi8KKwluZnRsLT5FcmFzZVNpemUgPSB0aGlzLT5lcmFzZXNpemU7CisgICAgICAgIG5mdGwtPm5iX2Jsb2NrcyA9IHRoaXMtPnRvdGxlbiAvIHRoaXMtPmVyYXNlc2l6ZTsKKwluZnRsLT5tdGQgPSB0aGlzOworCisJaWYgKGZpbmRfYm9vdF9yZWNvcmQobmZ0bCkgIT0gMCkKKwkJdGhpcy0+bmZ0bF9mb3VuZCA9IDA7CisJZWxzZQorCQl0aGlzLT5uZnRsX2ZvdW5kID0gMTsKKworCXByaW50ZigiJXMgQCAweCVsWCwgJWxkIE1CXG4iLCB0aGlzLT5uYW1lLCB0aGlzLT5waHlzYWRyLCB0aGlzLT50b3RsZW4gPj4gMjApOworfQorCitpbnQgZG9jX3JlYWRfZWNjKHN0cnVjdCBEaXNrT25DaGlwKiB0aGlzLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKwkJIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICogYnVmLCB1X2NoYXIgKiBlY2NidWYpCit7CisJdW5zaWduZWQgbG9uZyBkb2NwdHI7CisJc3RydWN0IE5hbmQgKm15Y2hpcDsKKwl1bnNpZ25lZCBjaGFyIHN5bmRyb21lWzZdOworCXZvbGF0aWxlIGNoYXIgZHVtbXk7CisJaW50IGksIGxlbjI1NiA9IDAsIHJldD0wOworCisJZG9jcHRyID0gdGhpcy0+dmlydGFkcjsKKworCS8qIERvbid0IGFsbG93IHJlYWQgcGFzdCBlbmQgb2YgZGV2aWNlICovCisJaWYgKGZyb20gPj0gdGhpcy0+dG90bGVuKSB7CisJCXB1dHMgKCJPdXQgb2YgZmxhc2hcbiIpOworCQlyZXR1cm4gRE9DX0VJTlZBTDsKKwl9CisKKwkvKiBEb24ndCBhbGxvdyBhIHNpbmdsZSByZWFkIHRvIGNyb3NzIGEgNTEyLWJ5dGUgYmxvY2sgYm91bmRhcnkgKi8KKwlpZiAoZnJvbSArIGxlbiA+ICgoZnJvbSB8IDB4MWZmKSArIDEpKQorCQlsZW4gPSAoKGZyb20gfCAweDFmZikgKyAxKSAtIGZyb207CisKKwkvKiBUaGUgRUNDIHdpbGwgbm90IGJlIGNhbGN1bGF0ZWQgY29ycmVjdGx5IGlmIGxlc3MgdGhhbiA1MTIgaXMgcmVhZCAqLworCWlmIChsZW4gIT0gMHgyMDAgJiYgZWNjYnVmKQorCQlwcmludGYoIkVDQyBuZWVkcyBhIGZ1bGwgc2VjdG9yIHJlYWQgKGFkcjogJWx4IHNpemUgJWx4KVxuIiwKKwkJICAgICAgIChsb25nKSBmcm9tLCAobG9uZykgbGVuKTsKKworI2lmZGVmIFBIWUNIX0RFQlVHCisJcHJpbnRmKCJEb0NfUmVhZCAoYWRyOiAlbHggc2l6ZSAlbHgpXG4iLCAobG9uZykgZnJvbSwgKGxvbmcpIGxlbik7CisjZW5kaWYKKworCS8qIEZpbmQgdGhlIGNoaXAgd2hpY2ggaXMgdG8gYmUgdXNlZCBhbmQgc2VsZWN0IGl0ICovCisJbXljaGlwID0gJnRoaXMtPmNoaXBzW3Nocihmcm9tLCB0aGlzLT5jaGlwc2hpZnQpXTsKKworCWlmICh0aGlzLT5jdXJmbG9vciAhPSBteWNoaXAtPmZsb29yKSB7CisJCURvQ19TZWxlY3RGbG9vcih0aGlzLCBteWNoaXAtPmZsb29yKTsKKwkJRG9DX1NlbGVjdENoaXAodGhpcywgbXljaGlwLT5jaGlwKTsKKwl9IGVsc2UgaWYgKHRoaXMtPmN1cmNoaXAgIT0gbXljaGlwLT5jaGlwKSB7CisJCURvQ19TZWxlY3RDaGlwKHRoaXMsIG15Y2hpcC0+Y2hpcCk7CisJfQorCisJdGhpcy0+Y3VyZmxvb3IgPSBteWNoaXAtPmZsb29yOworCXRoaXMtPmN1cmNoaXAgPSBteWNoaXAtPmNoaXA7CisKKwlEb0NfQ29tbWFuZCh0aGlzLAorCQkgICAgKCF0aGlzLT5wYWdlMjU2CisJCSAgICAgJiYgKGZyb20gJiAweDEwMCkpID8gTkFORF9DTURfUkVBRDEgOiBOQU5EX0NNRF9SRUFEMCwKKwkJICAgIENEU05fQ1RSTF9XUCk7CisJRG9DX0FkZHJlc3ModGhpcywgQUREUl9DT0xVTU5fUEFHRSwgZnJvbSwgQ0RTTl9DVFJMX1dQLAorCQkgICAgQ0RTTl9DVFJMX0VDQ19JTyk7CisKKwlpZiAoZWNjYnVmKSB7CisJCS8qIFByaW1lIHRoZSBFQ0MgZW5naW5lICovCisJCVdyaXRlRE9DKERPQ19FQ0NfUkVTRVQsIGRvY3B0ciwgRUNDQ29uZik7CisJCVdyaXRlRE9DKERPQ19FQ0NfRU4sIGRvY3B0ciwgRUNDQ29uZik7CisJfSBlbHNlIHsKKwkJLyogZGlzYWJsZSB0aGUgRUNDIGVuZ2luZSAqLworCQlXcml0ZURPQyhET0NfRUNDX1JFU0VULCBkb2NwdHIsIEVDQ0NvbmYpOworCQlXcml0ZURPQyhET0NfRUNDX0RJUywgZG9jcHRyLCBFQ0NDb25mKTsKKwl9CisKKwkvKiB0cmVhdCBjcm9zc2luZyAyNTYtYnl0ZSBzZWN0b3IgZm9yIDJNIHggOGJpdHMgZGV2aWNlcyAqLworCWlmICh0aGlzLT5wYWdlMjU2ICYmIGZyb20gKyBsZW4gPiAoZnJvbSB8IDB4ZmYpICsgMSkgeworCQlsZW4yNTYgPSAoZnJvbSB8IDB4ZmYpICsgMSAtIGZyb207CisJCURvQ19SZWFkQnVmKHRoaXMsIGJ1ZiwgbGVuMjU2KTsKKworCQlEb0NfQ29tbWFuZCh0aGlzLCBOQU5EX0NNRF9SRUFEMCwgQ0RTTl9DVFJMX1dQKTsKKwkJRG9DX0FkZHJlc3ModGhpcywgQUREUl9DT0xVTU5fUEFHRSwgZnJvbSArIGxlbjI1NiwKKwkJCSAgICBDRFNOX0NUUkxfV1AsIENEU05fQ1RSTF9FQ0NfSU8pOworCX0KKworCURvQ19SZWFkQnVmKHRoaXMsICZidWZbbGVuMjU2XSwgbGVuIC0gbGVuMjU2KTsKKworCS8qIExldCB0aGUgY2FsbGVyIGtub3cgd2UgY29tcGxldGVkIGl0ICovCisJKnJldGxlbiA9IGxlbjsKKworCWlmIChlY2NidWYpIHsKKwkJLyogUmVhZCB0aGUgRUNDIGRhdGEgdGhyb3VnaCB0aGUgRGlza09uQ2hpcCBFQ0MgbG9naWMgKi8KKwkJLyogTm90ZTogdGhpcyB3aWxsIHdvcmsgZXZlbiB3aXRoIDJNIHggOGJpdCBkZXZpY2VzIGFzICAgKi8KKwkJLyogICAgICAgdGhleSBoYXZlIDggYnl0ZXMgb2YgT09CIHBlciAyNTYgcGFnZS4gbWYuICAgICAgKi8KKwkJRG9DX1JlYWRCdWYodGhpcywgZWNjYnVmLCA2KTsKKworCQkvKiBGbHVzaCB0aGUgcGlwZWxpbmUgKi8KKwkJaWYgKERvQ19pc19NaWxsZW5uaXVtKHRoaXMpKSB7CisJCQlkdW1teSA9IFJlYWRET0MoZG9jcHRyLCBFQ0NDb25mKTsKKwkJCWR1bW15ID0gUmVhZERPQyhkb2NwdHIsIEVDQ0NvbmYpOworCQkJaSA9IFJlYWRET0MoZG9jcHRyLCBFQ0NDb25mKTsKKwkJfSBlbHNlIHsKKwkJCWR1bW15ID0gUmVhZERPQyhkb2NwdHIsIDJrX0VDQ1N0YXR1cyk7CisJCQlkdW1teSA9IFJlYWRET0MoZG9jcHRyLCAya19FQ0NTdGF0dXMpOworCQkJaSA9IFJlYWRET0MoZG9jcHRyLCAya19FQ0NTdGF0dXMpOworCQl9CisKKwkJLyogQ2hlY2sgdGhlIEVDQyBTdGF0dXMgKi8KKwkJaWYgKGkgJiAweDgwKSB7CisJCQlpbnQgbmJfZXJyb3JzOworCQkJLyogVGhlcmUgd2FzIGFuIEVDQyBlcnJvciAqLworI2lmZGVmIEVDQ19ERUJVRworCQkJcHJpbnRmKCJEaXNrT25DaGlwIEVDQyBFcnJvcjogUmVhZCBhdCAlbHhcbiIsIChsb25nKWZyb20pOworI2VuZGlmCisJCQkvKiBSZWFkIHRoZSBFQ0Mgc3luZHJvbSB0aHJvdWdoIHRoZSBEaXNrT25DaGlwIEVDQyBsb2dpYy4KKwkJCSAgIFRoZXNlIHN5bmRyb21lIHdpbGwgYmUgYWxsIFpFUk8gd2hlbiB0aGVyZSBpcyBubyBlcnJvciAqLworCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJCXN5bmRyb21lW2ldID0KKwkJCQkgICAgUmVhZERPQyhkb2NwdHIsIEVDQ1N5bmRyb21lMCArIGkpOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgbmJfZXJyb3JzID0gZG9jX2RlY29kZV9lY2MoYnVmLCBzeW5kcm9tZSk7CisKKyNpZmRlZiBFQ0NfREVCVUcKKwkJCXByaW50ZigiRXJyb3JzIGNvcnJlY3RlZDogJXhcbiIsIG5iX2Vycm9ycyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYl9lcnJvcnMgPCAwKSB7CisJCQkJLyogV2UgcmV0dXJuIGVycm9yLCBidXQgaGF2ZSBhY3R1YWxseSBkb25lIHRoZSByZWFkLiBOb3QgdGhhdAorCQkJCSAgIHRoaXMgY2FuIGJlIHRvbGQgdG8gdXNlci1zcGFjZSwgdmlhIHN5c19yZWFkKCksIGJ1dCBhdCBsZWFzdAorCQkJCSAgIE1URC1hd2FyZSBzdHVmZiBjYW4ga25vdyBhYm91dCBpdCBieSBjaGVja2luZyAqcmV0bGVuICovCisJCQkJcHJpbnRmKCJFQ0MgRXJyb3JzIGF0ICVseFxuIiwgKGxvbmcpZnJvbSk7CisJCQkJcmV0ID0gRE9DX0VFQ0M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKworI2lmZGVmIFBTWUNIT19ERUJVRworCQlwcmludGYoIkVDQyBEQVRBIGF0ICVseEI6ICUyLjJYICUyLjJYICUyLjJYICUyLjJYICUyLjJYICUyLjJYXG4iLAorCQkJICAgICAobG9uZylmcm9tLCBlY2NidWZbMF0sIGVjY2J1ZlsxXSwgZWNjYnVmWzJdLAorCQkJICAgICBlY2NidWZbM10sIGVjY2J1Zls0XSwgZWNjYnVmWzVdKTsKKyNlbmRpZgorCisJCS8qIGRpc2FibGUgdGhlIEVDQyBlbmdpbmUgKi8KKwkJV3JpdGVET0MoRE9DX0VDQ19ESVMsIGRvY3B0ciAsIEVDQ0NvbmYpOworCX0KKworCS8qIGFjY29yZGluZyB0byAxMS40LjEsIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGJ1c3kgbGluZQorICAgICAgICAgKiBkcm9wIGlmIHdlIHJlYWQgdG8gdGhlIGVuZCBvZiB0aGUgcGFnZS4gICovCisJaWYoMCA9PSAoKGZyb20gKyAqcmV0bGVuKSAmIDB4MWZmKSkKKwl7CisJICAgIERvQ19XYWl0UmVhZHkodGhpcyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IGRvY193cml0ZV9lY2Moc3RydWN0IERpc2tPbkNoaXAqIHRoaXMsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwKKwkJICBzaXplX3QgKiByZXRsZW4sIGNvbnN0IHVfY2hhciAqIGJ1ZiwKKwkJICB1X2NoYXIgKiBlY2NidWYpCit7CisJaW50IGRpOyAvKiBZZXMsIERJIGlzIGEgaGFuZ292ZXIgZnJvbSB3aGVuIEkgd2FzIGRpc2Fzc2VtYmxpbmcgdGhlIGJpbmFyeSBkcml2ZXIgKi8KKwl1bnNpZ25lZCBsb25nIGRvY3B0cjsKKwl2b2xhdGlsZSBjaGFyIGR1bW15OworCWludCBsZW4yNTYgPSAwOworCXN0cnVjdCBOYW5kICpteWNoaXA7CisKKwlkb2NwdHIgPSB0aGlzLT52aXJ0YWRyOworCisJLyogRG9uJ3QgYWxsb3cgd3JpdGUgcGFzdCBlbmQgb2YgZGV2aWNlICovCisJaWYgKHRvID49IHRoaXMtPnRvdGxlbikgeworCQlwdXRzICgiT3V0IG9mIGZsYXNoXG4iKTsKKwkJcmV0dXJuIERPQ19FSU5WQUw7CisJfQorCisJLyogRG9uJ3QgYWxsb3cgYSBzaW5nbGUgd3JpdGUgdG8gY3Jvc3MgYSA1MTItYnl0ZSBibG9jayBib3VuZGFyeSAqLworCWlmICh0byArIGxlbiA+ICgodG8gfCAweDFmZikgKyAxKSkKKwkJbGVuID0gKCh0byB8IDB4MWZmKSArIDEpIC0gdG87CisKKwkvKiBUaGUgRUNDIHdpbGwgbm90IGJlIGNhbGN1bGF0ZWQgY29ycmVjdGx5IGlmIGxlc3MgdGhhbiA1MTIgaXMgd3JpdHRlbiAqLworCWlmIChsZW4gIT0gMHgyMDAgJiYgZWNjYnVmKQorCQlwcmludGYoIkVDQyBuZWVkcyBhIGZ1bGwgc2VjdG9yIHdyaXRlIChhZHI6ICVseCBzaXplICVseClcbiIsCisJCSAgICAgICAobG9uZykgdG8sIChsb25nKSBsZW4pOworCisJLyogcHJpbnRmKCJEb0NfV3JpdGUgKGFkcjogJWx4IHNpemUgJWx4KVxuIiwgKGxvbmcpIHRvLCAobG9uZykgbGVuKTsgKi8KKworCS8qIEZpbmQgdGhlIGNoaXAgd2hpY2ggaXMgdG8gYmUgdXNlZCBhbmQgc2VsZWN0IGl0ICovCisJbXljaGlwID0gJnRoaXMtPmNoaXBzW3Nocih0bywgdGhpcy0+Y2hpcHNoaWZ0KV07CisKKwlpZiAodGhpcy0+Y3VyZmxvb3IgIT0gbXljaGlwLT5mbG9vcikgeworCQlEb0NfU2VsZWN0Rmxvb3IodGhpcywgbXljaGlwLT5mbG9vcik7CisJCURvQ19TZWxlY3RDaGlwKHRoaXMsIG15Y2hpcC0+Y2hpcCk7CisJfSBlbHNlIGlmICh0aGlzLT5jdXJjaGlwICE9IG15Y2hpcC0+Y2hpcCkgeworCQlEb0NfU2VsZWN0Q2hpcCh0aGlzLCBteWNoaXAtPmNoaXApOworCX0KKworCXRoaXMtPmN1cmZsb29yID0gbXljaGlwLT5mbG9vcjsKKwl0aGlzLT5jdXJjaGlwID0gbXljaGlwLT5jaGlwOworCisJLyogU2V0IGRldmljZSB0byBtYWluIHBsYW5lIG9mIGZsYXNoICovCisJRG9DX0NvbW1hbmQodGhpcywgTkFORF9DTURfUkVTRVQsIENEU05fQ1RSTF9XUCk7CisJRG9DX0NvbW1hbmQodGhpcywKKwkJICAgICghdGhpcy0+cGFnZTI1NgorCQkgICAgICYmICh0byAmIDB4MTAwKSkgPyBOQU5EX0NNRF9SRUFEMSA6IE5BTkRfQ01EX1JFQUQwLAorCQkgICAgQ0RTTl9DVFJMX1dQKTsKKworCURvQ19Db21tYW5kKHRoaXMsIE5BTkRfQ01EX1NFUUlOLCAwKTsKKwlEb0NfQWRkcmVzcyh0aGlzLCBBRERSX0NPTFVNTl9QQUdFLCB0bywgMCwgQ0RTTl9DVFJMX0VDQ19JTyk7CisKKwlpZiAoZWNjYnVmKSB7CisJCS8qIFByaW1lIHRoZSBFQ0MgZW5naW5lICovCisJCVdyaXRlRE9DKERPQ19FQ0NfUkVTRVQsIGRvY3B0ciwgRUNDQ29uZik7CisJCVdyaXRlRE9DKERPQ19FQ0NfRU4gfCBET0NfRUNDX1JXLCBkb2NwdHIsIEVDQ0NvbmYpOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgdGhlIEVDQyBlbmdpbmUgKi8KKwkJV3JpdGVET0MoRE9DX0VDQ19SRVNFVCwgZG9jcHRyLCBFQ0NDb25mKTsKKwkJV3JpdGVET0MoRE9DX0VDQ19ESVMsIGRvY3B0ciwgRUNDQ29uZik7CisJfQorCisJLyogdHJlYXQgY3Jvc3NpbmcgMjU2LWJ5dGUgc2VjdG9yIGZvciAyTSB4IDhiaXRzIGRldmljZXMgKi8KKwlpZiAodGhpcy0+cGFnZTI1NiAmJiB0byArIGxlbiA+ICh0byB8IDB4ZmYpICsgMSkgeworCQlsZW4yNTYgPSAodG8gfCAweGZmKSArIDEgLSB0bzsKKwkJRG9DX1dyaXRlQnVmKHRoaXMsIGJ1ZiwgbGVuMjU2KTsKKworCQlEb0NfQ29tbWFuZCh0aGlzLCBOQU5EX0NNRF9QQUdFUFJPRywgMCk7CisKKwkJRG9DX0NvbW1hbmQodGhpcywgTkFORF9DTURfU1RBVFVTLCBDRFNOX0NUUkxfV1ApOworCQkvKiBUaGVyZSdzIGFuIGltcGxpY2l0IERvQ19XYWl0UmVhZHkoKSBpbiBEb0NfQ29tbWFuZCAqLworCisJCWR1bW15ID0gUmVhZERPQyhkb2NwdHIsIENEU05TbG93SU8pOworCQlEb0NfRGVsYXkodGhpcywgMik7CisKKwkJaWYgKFJlYWRET0NfKGRvY3B0ciwgdGhpcy0+aW9yZWcpICYgMSkgeworCQkJcHV0cyAoIkVycm9yIHByb2dyYW1taW5nIGZsYXNoXG4iKTsKKwkJCS8qIEVycm9yIGluIHByb2dyYW1taW5nICovCisJCQkqcmV0bGVuID0gMDsKKwkJCXJldHVybiBET0NfRUlPOworCQl9CisKKwkJRG9DX0NvbW1hbmQodGhpcywgTkFORF9DTURfU0VRSU4sIDApOworCQlEb0NfQWRkcmVzcyh0aGlzLCBBRERSX0NPTFVNTl9QQUdFLCB0byArIGxlbjI1NiwgMCwKKwkJCSAgICBDRFNOX0NUUkxfRUNDX0lPKTsKKwl9CisKKwlEb0NfV3JpdGVCdWYodGhpcywgJmJ1ZltsZW4yNTZdLCBsZW4gLSBsZW4yNTYpOworCisJaWYgKGVjY2J1ZikgeworCQlXcml0ZURPQyhDRFNOX0NUUkxfRUNDX0lPIHwgQ0RTTl9DVFJMX0NFLCBkb2NwdHIsCisJCQkgQ0RTTkNvbnRyb2wpOworCisJCWlmIChEb0NfaXNfTWlsbGVubml1bSh0aGlzKSkgeworCQkJV3JpdGVET0MoMCwgZG9jcHRyLCBOT1ApOworCQkJV3JpdGVET0MoMCwgZG9jcHRyLCBOT1ApOworCQkJV3JpdGVET0MoMCwgZG9jcHRyLCBOT1ApOworCQl9IGVsc2UgeworCQkJV3JpdGVET0NfKDAsIGRvY3B0ciwgdGhpcy0+aW9yZWcpOworCQkJV3JpdGVET0NfKDAsIGRvY3B0ciwgdGhpcy0+aW9yZWcpOworCQkJV3JpdGVET0NfKDAsIGRvY3B0ciwgdGhpcy0+aW9yZWcpOworCQl9CisKKwkJLyogUmVhZCB0aGUgRUNDIGRhdGEgdGhyb3VnaCB0aGUgRGlza09uQ2hpcCBFQ0MgbG9naWMgKi8KKwkJZm9yIChkaSA9IDA7IGRpIDwgNjsgZGkrKykgeworCQkJZWNjYnVmW2RpXSA9IFJlYWRET0MoZG9jcHRyLCBFQ0NTeW5kcm9tZTAgKyBkaSk7CisJCX0KKworCQkvKiBSZXNldCB0aGUgRUNDIGVuZ2luZSAqLworCQlXcml0ZURPQyhET0NfRUNDX0RJUywgZG9jcHRyLCBFQ0NDb25mKTsKKworI2lmZGVmIFBTWUNIT19ERUJVRworCQlwcmludGYKKwkJICAgICgiT09CIGRhdGEgYXQgJWx4IGlzICUyLjJYICUyLjJYICUyLjJYICUyLjJYICUyLjJYICUyLjJYXG4iLAorCQkgICAgIChsb25nKSB0bywgZWNjYnVmWzBdLCBlY2NidWZbMV0sIGVjY2J1ZlsyXSwgZWNjYnVmWzNdLAorCQkgICAgIGVjY2J1Zls0XSwgZWNjYnVmWzVdKTsKKyNlbmRpZgorCX0KKworCURvQ19Db21tYW5kKHRoaXMsIE5BTkRfQ01EX1BBR0VQUk9HLCAwKTsKKworCURvQ19Db21tYW5kKHRoaXMsIE5BTkRfQ01EX1NUQVRVUywgQ0RTTl9DVFJMX1dQKTsKKwkvKiBUaGVyZSdzIGFuIGltcGxpY2l0IERvQ19XYWl0UmVhZHkoKSBpbiBEb0NfQ29tbWFuZCAqLworCisJZHVtbXkgPSBSZWFkRE9DKGRvY3B0ciwgQ0RTTlNsb3dJTyk7CisJRG9DX0RlbGF5KHRoaXMsIDIpOworCisJaWYgKFJlYWRET0NfKGRvY3B0ciwgdGhpcy0+aW9yZWcpICYgMSkgeworCQlwdXRzICgiRXJyb3IgcHJvZ3JhbW1pbmcgZmxhc2hcbiIpOworCQkvKiBFcnJvciBpbiBwcm9ncmFtbWluZyAqLworCQkqcmV0bGVuID0gMDsKKwkJcmV0dXJuIERPQ19FSU87CisJfQorCisJLyogTGV0IHRoZSBjYWxsZXIga25vdyB3ZSBjb21wbGV0ZWQgaXQgKi8KKwkqcmV0bGVuID0gbGVuOworCisJaWYgKGVjY2J1ZikgeworCQl1bnNpZ25lZCBjaGFyIHhbOF07CisJCXNpemVfdCBkdW1teTsKKwkJaW50IHJldDsKKworCQkvKiBXcml0ZSB0aGUgRUNDIGRhdGEgdG8gZmxhc2ggKi8KKwkJZm9yIChkaT0wOyBkaTw2OyBkaSsrKQorCQkJeFtkaV0gPSBlY2NidWZbZGldOworCisJCXhbNl09MHg1NTsKKwkJeFs3XT0weDU1OworCisJCXJldCA9IGRvY193cml0ZV9vb2IodGhpcywgdG8sIDgsICZkdW1teSwgeCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZG9jX3JlYWRfb29iKHN0cnVjdCBEaXNrT25DaGlwKiB0aGlzLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuLAorCQkgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYpCit7CisJaW50IGxlbjI1NiA9IDAsIHJldDsKKwl1bnNpZ25lZCBsb25nIGRvY3B0cjsKKwlzdHJ1Y3QgTmFuZCAqbXljaGlwOworCisJZG9jcHRyID0gdGhpcy0+dmlydGFkcjsKKworCW15Y2hpcCA9ICZ0aGlzLT5jaGlwc1tzaHIob2ZzLCB0aGlzLT5jaGlwc2hpZnQpXTsKKworCWlmICh0aGlzLT5jdXJmbG9vciAhPSBteWNoaXAtPmZsb29yKSB7CisJCURvQ19TZWxlY3RGbG9vcih0aGlzLCBteWNoaXAtPmZsb29yKTsKKwkJRG9DX1NlbGVjdENoaXAodGhpcywgbXljaGlwLT5jaGlwKTsKKwl9IGVsc2UgaWYgKHRoaXMtPmN1cmNoaXAgIT0gbXljaGlwLT5jaGlwKSB7CisJCURvQ19TZWxlY3RDaGlwKHRoaXMsIG15Y2hpcC0+Y2hpcCk7CisJfQorCXRoaXMtPmN1cmZsb29yID0gbXljaGlwLT5mbG9vcjsKKwl0aGlzLT5jdXJjaGlwID0gbXljaGlwLT5jaGlwOworCisJLyogdXBkYXRlIGFkZHJlc3MgZm9yIDJNIHggOGJpdCBkZXZpY2VzLiBPT0Igc3RhcnRzIG9uIHRoZSBzZWNvbmQgKi8KKwkvKiBwYWdlIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBkb2NfcmVhZF9lY2MuICovCisJaWYgKHRoaXMtPnBhZ2UyNTYpIHsKKwkJaWYgKCEob2ZzICYgMHg4KSkKKwkJCW9mcyArPSAweDEwMDsKKwkJZWxzZQorCQkJb2ZzIC09IDB4ODsKKwl9CisKKwlEb0NfQ29tbWFuZCh0aGlzLCBOQU5EX0NNRF9SRUFET09CLCBDRFNOX0NUUkxfV1ApOworCURvQ19BZGRyZXNzKHRoaXMsIEFERFJfQ09MVU1OX1BBR0UsIG9mcywgQ0RTTl9DVFJMX1dQLCAwKTsKKworCS8qIHRyZWF0IGNyb3NzaW5nIDgtYnl0ZSBPT0IgZGF0YSBmb3IgMk0geCA4Yml0IGRldmljZXMgKi8KKwkvKiBOb3RlOiBkYXRhc2hlZXQgc2F5cyBpdCBzaG91bGQgYXV0b21hdGljYWx5IHdyYXAgdG8gdGhlICovCisJLyogICAgICAgbmV4dCBPT0IgYmxvY2ssIGJ1dCBpdCBkaWRuJ3Qgd29yayBoZXJlLiBtZi4gICAgICAqLworCWlmICh0aGlzLT5wYWdlMjU2ICYmIG9mcyArIGxlbiA+IChvZnMgfCAweDcpICsgMSkgeworCQlsZW4yNTYgPSAob2ZzIHwgMHg3KSArIDEgLSBvZnM7CisJCURvQ19SZWFkQnVmKHRoaXMsIGJ1ZiwgbGVuMjU2KTsKKworCQlEb0NfQ29tbWFuZCh0aGlzLCBOQU5EX0NNRF9SRUFET09CLCBDRFNOX0NUUkxfV1ApOworCQlEb0NfQWRkcmVzcyh0aGlzLCBBRERSX0NPTFVNTl9QQUdFLCBvZnMgJiAofjB4MWZmKSwKKwkJCSAgICBDRFNOX0NUUkxfV1AsIDApOworCX0KKworCURvQ19SZWFkQnVmKHRoaXMsICZidWZbbGVuMjU2XSwgbGVuIC0gbGVuMjU2KTsKKworCSpyZXRsZW4gPSBsZW47CisJLyogUmVhZGluZyB0aGUgZnVsbCBPT0IgZGF0YSBkcm9wcyB1cyBvZmYgb2YgdGhlIGVuZCBvZiB0aGUgcGFnZSwKKyAgICAgICAgICogY2F1c2luZyB0aGUgZmxhc2ggZGV2aWNlIHRvIGdvIGludG8gYnVzeSBtb2RlLCBzbyB3ZSBuZWVkCisgICAgICAgICAqIHRvIHdhaXQgdW50aWwgcmVhZHkgMTEuNC4xIGFuZCBUb3NoaWJhIFRDNTgyNTZGVCBkb2NzICovCisKKwlyZXQgPSBEb0NfV2FpdFJlYWR5KHRoaXMpOworCisJcmV0dXJuIHJldDsKKworfQorCitpbnQgZG9jX3dyaXRlX29vYihzdHJ1Y3QgRGlza09uQ2hpcCogdGhpcywgbG9mZl90IG9mcywgc2l6ZV90IGxlbiwKKwkJICBzaXplX3QgKiByZXRsZW4sIGNvbnN0IHVfY2hhciAqIGJ1ZikKK3sKKwlpbnQgbGVuMjU2ID0gMDsKKwl1bnNpZ25lZCBsb25nIGRvY3B0ciA9IHRoaXMtPnZpcnRhZHI7CisJc3RydWN0IE5hbmQgKm15Y2hpcCA9ICZ0aGlzLT5jaGlwc1tzaHIob2ZzLCB0aGlzLT5jaGlwc2hpZnQpXTsKKwl2b2xhdGlsZSBpbnQgZHVtbXk7CisKKyNpZmRlZiBQU1lDSE9fREVCVUcKKwlwcmludGYoImRvY193cml0ZV9vb2IoJWx4LCAlZCk6ICUyLjJYICUyLjJYICUyLjJYICUyLjJYIC4uLiAlMi4yWCAlMi4yWCAuLiAlMi4yWCAlMi4yWFxuIiwKKwkgICAgICAgKGxvbmcpb2ZzLCBsZW4sIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwKKwkgICAgICAgYnVmWzhdLCBidWZbOV0sIGJ1ZlsxNF0sYnVmWzE1XSk7CisjZW5kaWYKKworCS8qIEZpbmQgdGhlIGNoaXAgd2hpY2ggaXMgdG8gYmUgdXNlZCBhbmQgc2VsZWN0IGl0ICovCisJaWYgKHRoaXMtPmN1cmZsb29yICE9IG15Y2hpcC0+Zmxvb3IpIHsKKwkJRG9DX1NlbGVjdEZsb29yKHRoaXMsIG15Y2hpcC0+Zmxvb3IpOworCQlEb0NfU2VsZWN0Q2hpcCh0aGlzLCBteWNoaXAtPmNoaXApOworCX0gZWxzZSBpZiAodGhpcy0+Y3VyY2hpcCAhPSBteWNoaXAtPmNoaXApIHsKKwkJRG9DX1NlbGVjdENoaXAodGhpcywgbXljaGlwLT5jaGlwKTsKKwl9CisJdGhpcy0+Y3VyZmxvb3IgPSBteWNoaXAtPmZsb29yOworCXRoaXMtPmN1cmNoaXAgPSBteWNoaXAtPmNoaXA7CisKKwkvKiBkaXNhYmxlIHRoZSBFQ0MgZW5naW5lICovCisJV3JpdGVET0MgKERPQ19FQ0NfUkVTRVQsIGRvY3B0ciwgRUNDQ29uZik7CisJV3JpdGVET0MgKERPQ19FQ0NfRElTLCBkb2NwdHIsIEVDQ0NvbmYpOworCisJLyogUmVzZXQgdGhlIGNoaXAsIHNlZSBTb2Z0d2FyZSBSZXF1aXJlbWVudCAxMS40IGl0ZW0gMS4gKi8KKwlEb0NfQ29tbWFuZCh0aGlzLCBOQU5EX0NNRF9SRVNFVCwgQ0RTTl9DVFJMX1dQKTsKKworCS8qIGlzc3VlIHRoZSBSZWFkMiBjb21tYW5kIHRvIHNldCB0aGUgcG9pbnRlciB0byB0aGUgU3BhcmUgRGF0YSBBcmVhLiAqLworCURvQ19Db21tYW5kKHRoaXMsIE5BTkRfQ01EX1JFQURPT0IsIENEU05fQ1RSTF9XUCk7CisKKwkvKiB1cGRhdGUgYWRkcmVzcyBmb3IgMk0geCA4Yml0IGRldmljZXMuIE9PQiBzdGFydHMgb24gdGhlIHNlY29uZCAqLworCS8qIHBhZ2UgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIGRvY19yZWFkX2VjYy4gKi8KKwlpZiAodGhpcy0+cGFnZTI1NikgeworCQlpZiAoIShvZnMgJiAweDgpKQorCQkJb2ZzICs9IDB4MTAwOworCQllbHNlCisJCQlvZnMgLT0gMHg4OworCX0KKworCS8qIGlzc3VlIHRoZSBTZXJpYWwgRGF0YSBJbiBjb21tYW5kIHRvIGluaXRpYWwgdGhlIFBhZ2UgUHJvZ3JhbSBwcm9jZXNzICovCisJRG9DX0NvbW1hbmQodGhpcywgTkFORF9DTURfU0VRSU4sIDApOworCURvQ19BZGRyZXNzKHRoaXMsIEFERFJfQ09MVU1OX1BBR0UsIG9mcywgMCwgMCk7CisKKwkvKiB0cmVhdCBjcm9zc2luZyA4LWJ5dGUgT09CIGRhdGEgZm9yIDJNIHggOGJpdCBkZXZpY2VzICovCisJLyogTm90ZTogZGF0YXNoZWV0IHNheXMgaXQgc2hvdWxkIGF1dG9tYXRpY2FseSB3cmFwIHRvIHRoZSAqLworCS8qICAgICAgIG5leHQgT09CIGJsb2NrLCBidXQgaXQgZGlkbid0IHdvcmsgaGVyZS4gbWYuICAgICAgKi8KKwlpZiAodGhpcy0+cGFnZTI1NiAmJiBvZnMgKyBsZW4gPiAob2ZzIHwgMHg3KSArIDEpIHsKKwkJbGVuMjU2ID0gKG9mcyB8IDB4NykgKyAxIC0gb2ZzOworCQlEb0NfV3JpdGVCdWYodGhpcywgYnVmLCBsZW4yNTYpOworCisJCURvQ19Db21tYW5kKHRoaXMsIE5BTkRfQ01EX1BBR0VQUk9HLCAwKTsKKwkJRG9DX0NvbW1hbmQodGhpcywgTkFORF9DTURfU1RBVFVTLCAwKTsKKwkJLyogRG9DX1dhaXRSZWFkeSgpIGlzIGltcGxpY2l0IGluIERvQ19Db21tYW5kICovCisKKwkJZHVtbXkgPSBSZWFkRE9DKGRvY3B0ciwgQ0RTTlNsb3dJTyk7CisJCURvQ19EZWxheSh0aGlzLCAyKTsKKworCQlpZiAoUmVhZERPQ18oZG9jcHRyLCB0aGlzLT5pb3JlZykgJiAxKSB7CisJCQlwdXRzICgiRXJyb3IgcHJvZ3JhbW1pbmcgb29iIGRhdGFcbiIpOworCQkJLyogVGhlcmUgd2FzIGFuIGVycm9yICovCisJCQkqcmV0bGVuID0gMDsKKwkJCXJldHVybiBET0NfRUlPOworCQl9CisJCURvQ19Db21tYW5kKHRoaXMsIE5BTkRfQ01EX1NFUUlOLCAwKTsKKwkJRG9DX0FkZHJlc3ModGhpcywgQUREUl9DT0xVTU5fUEFHRSwgb2ZzICYgKH4weDFmZiksIDAsIDApOworCX0KKworCURvQ19Xcml0ZUJ1Zih0aGlzLCAmYnVmW2xlbjI1Nl0sIGxlbiAtIGxlbjI1Nik7CisKKwlEb0NfQ29tbWFuZCh0aGlzLCBOQU5EX0NNRF9QQUdFUFJPRywgMCk7CisJRG9DX0NvbW1hbmQodGhpcywgTkFORF9DTURfU1RBVFVTLCAwKTsKKwkvKiBEb0NfV2FpdFJlYWR5KCkgaXMgaW1wbGljaXQgaW4gRG9DX0NvbW1hbmQgKi8KKworCWR1bW15ID0gUmVhZERPQyhkb2NwdHIsIENEU05TbG93SU8pOworCURvQ19EZWxheSh0aGlzLCAyKTsKKworCWlmIChSZWFkRE9DXyhkb2NwdHIsIHRoaXMtPmlvcmVnKSAmIDEpIHsKKwkJcHV0cyAoIkVycm9yIHByb2dyYW1taW5nIG9vYiBkYXRhXG4iKTsKKwkJLyogVGhlcmUgd2FzIGFuIGVycm9yICovCisJCSpyZXRsZW4gPSAwOworCQlyZXR1cm4gRE9DX0VJTzsKKwl9CisKKwkqcmV0bGVuID0gbGVuOworCXJldHVybiAwOworCit9CisKK2ludCBkb2NfZXJhc2Uoc3RydWN0IERpc2tPbkNoaXAqIHRoaXMsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pCit7CisJdm9sYXRpbGUgaW50IGR1bW15OworCXVuc2lnbmVkIGxvbmcgZG9jcHRyOworCXN0cnVjdCBOYW5kICpteWNoaXA7CisKKwlpZiAob2ZzICYgKHRoaXMtPmVyYXNlc2l6ZS0xKSB8fCBsZW4gJiAodGhpcy0+ZXJhc2VzaXplLTEpKSB7CisJCXB1dHMgKCJPZmZzZXQgYW5kIHNpemUgbXVzdCBiZSBzZWN0b3IgYWxpZ25lZFxuIik7CisJCXJldHVybiBET0NfRUlOVkFMOworCX0KKworCWRvY3B0ciA9IHRoaXMtPnZpcnRhZHI7CisKKwkvKiBGSVhNRTogRG8gdGhpcyBpbiB0aGUgYmFja2dyb3VuZC4gVXNlIHRpbWVycyBvciBzY2hlZHVsZV90YXNrKCkgKi8KKwl3aGlsZShsZW4pIHsKKwkJbXljaGlwID0gJnRoaXMtPmNoaXBzW3NocihvZnMsIHRoaXMtPmNoaXBzaGlmdCldOworCisJCWlmICh0aGlzLT5jdXJmbG9vciAhPSBteWNoaXAtPmZsb29yKSB7CisJCQlEb0NfU2VsZWN0Rmxvb3IodGhpcywgbXljaGlwLT5mbG9vcik7CisJCQlEb0NfU2VsZWN0Q2hpcCh0aGlzLCBteWNoaXAtPmNoaXApOworCQl9IGVsc2UgaWYgKHRoaXMtPmN1cmNoaXAgIT0gbXljaGlwLT5jaGlwKSB7CisJCQlEb0NfU2VsZWN0Q2hpcCh0aGlzLCBteWNoaXAtPmNoaXApOworCQl9CisJCXRoaXMtPmN1cmZsb29yID0gbXljaGlwLT5mbG9vcjsKKwkJdGhpcy0+Y3VyY2hpcCA9IG15Y2hpcC0+Y2hpcDsKKworCQlEb0NfQ29tbWFuZCh0aGlzLCBOQU5EX0NNRF9FUkFTRTEsIDApOworCQlEb0NfQWRkcmVzcyh0aGlzLCBBRERSX1BBR0UsIG9mcywgMCwgMCk7CisJCURvQ19Db21tYW5kKHRoaXMsIE5BTkRfQ01EX0VSQVNFMiwgMCk7CisKKwkJRG9DX0NvbW1hbmQodGhpcywgTkFORF9DTURfU1RBVFVTLCBDRFNOX0NUUkxfV1ApOworCisJCWR1bW15ID0gUmVhZERPQyhkb2NwdHIsIENEU05TbG93SU8pOworCQlEb0NfRGVsYXkodGhpcywgMik7CisKKwkJaWYgKFJlYWRET0NfKGRvY3B0ciwgdGhpcy0+aW9yZWcpICYgMSkgeworCQkJcHJpbnRmKCJFcnJvciBlcmFzaW5nIGF0IDB4JWx4XG4iLCAobG9uZylvZnMpOworCQkJLyogVGhlcmUgd2FzIGFuIGVycm9yICovCisJCQlnb3RvIGNhbGxiYWNrOworCQl9CisJCW9mcyArPSB0aGlzLT5lcmFzZXNpemU7CisJCWxlbiAtPSB0aGlzLT5lcmFzZXNpemU7CisJfQorCisgY2FsbGJhY2s6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRvY2NoZWNrKHVuc2lnbmVkIGxvbmcgcG90ZW50aWFsLCB1bnNpZ25lZCBsb25nIHBoeXNhZHIpCit7CisJdW5zaWduZWQgbG9uZyB3aW5kb3c9cG90ZW50aWFsOworCXVuc2lnbmVkIGNoYXIgdG1wLCBDaGlwSUQ7CisjaWZuZGVmIERPQ19QQVNTSVZFX1BST0JFCisJdW5zaWduZWQgY2hhciB0bXAyOworI2VuZGlmCisKKwkvKiBSb3V0aW5lIGNvcGllZCBmcm9tIHRoZSBMaW51eCBET0MgZHJpdmVyICovCisKKyNpZmRlZiBDRkdfRE9DUFJPQkVfNTVBQQorCS8qIENoZWNrIGZvciAweDU1IDB4QUEgc2lnbmF0dXJlIGF0IGJlZ2lubmluZyBvZiB3aW5kb3csCisJICAgdGhpcyBpcyBubyBsb25nZXIgdHJ1ZSBvbmNlIHdlIHJlbW92ZSB0aGUgSVBMIChmb3IgTWlsbGVubml1bSAqLworCWlmIChSZWFkRE9DKHdpbmRvdywgU2lnMSkgIT0gMHg1NSB8fCBSZWFkRE9DKHdpbmRvdywgU2lnMikgIT0gMHhhYSkKKwkJcmV0dXJuIDA7CisjZW5kaWYgLyogQ0ZHX0RPQ1BST0JFXzU1QUEgKi8KKworI2lmbmRlZiBET0NfUEFTU0lWRV9QUk9CRQorCS8qIEl0J3Mgbm90IHBvc3NpYmxlIHRvIGNsZWFubHkgZGV0ZWN0IHRoZSBEaXNrT25DaGlwIC0gdGhlCisJICogYm9vdHVwIHByb2NlZHVyZSB3aWxsIHB1dCB0aGUgZGV2aWNlIGludG8gcmVzZXQgbW9kZSwgYW5kCisJICogaXQncyBub3QgcG9zc2libGUgdG8gdGFsayB0byBpdCB3aXRob3V0IGFjdHVhbGx5IHdyaXRpbmcKKwkgKiB0byB0aGUgRE9DQ29udHJvbCByZWdpc3Rlci4gU28gd2Ugc3RvcmUgdGhlIGN1cnJlbnQgY29udGVudHMKKwkgKiBvZiB0aGUgRE9DQ29udHJvbCByZWdpc3RlcidzIGxvY2F0aW9uLCBpbiBjYXNlIHdlIGxhdGVyIGRlY2lkZQorCSAqIHRoYXQgaXQncyBub3QgYSBEaXNrT25DaGlwLCBhbmQgd2FudCB0byBwdXQgaXQgYmFjayBob3cgd2UKKwkgKiBmb3VuZCBpdC4KKwkgKi8KKwl0bXAyID0gUmVhZERPQyh3aW5kb3csIERPQ0NvbnRyb2wpOworCisJLyogUmVzZXQgdGhlIERpc2tPbkNoaXAgQVNJQyAqLworCVdyaXRlRE9DKERPQ19NT0RFX0NMUl9FUlIgfCBET0NfTU9ERV9NRFdSRU4gfCBET0NfTU9ERV9SRVNFVCwKKwkJIHdpbmRvdywgRE9DQ29udHJvbCk7CisJV3JpdGVET0MoRE9DX01PREVfQ0xSX0VSUiB8IERPQ19NT0RFX01EV1JFTiB8IERPQ19NT0RFX1JFU0VULAorCQkgd2luZG93LCBET0NDb250cm9sKTsKKworCS8qIEVuYWJsZSB0aGUgRGlza09uQ2hpcCBBU0lDICovCisJV3JpdGVET0MoRE9DX01PREVfQ0xSX0VSUiB8IERPQ19NT0RFX01EV1JFTiB8IERPQ19NT0RFX05PUk1BTCwKKwkJIHdpbmRvdywgRE9DQ29udHJvbCk7CisJV3JpdGVET0MoRE9DX01PREVfQ0xSX0VSUiB8IERPQ19NT0RFX01EV1JFTiB8IERPQ19NT0RFX05PUk1BTCwKKwkJIHdpbmRvdywgRE9DQ29udHJvbCk7CisjZW5kaWYgLyogIURPQ19QQVNTSVZFX1BST0JFICovCisKKwlDaGlwSUQgPSBSZWFkRE9DKHdpbmRvdywgQ2hpcElEKTsKKworCXN3aXRjaCAoQ2hpcElEKSB7CisJY2FzZSBET0NfQ2hpcElEX0RvYzJrOgorCQkvKiBDaGVjayB0aGUgVE9HR0xFIGJpdCBpbiB0aGUgRUNDIHJlZ2lzdGVyICovCisJCXRtcCA9IFJlYWRET0Mod2luZG93LCAya19FQ0NTdGF0dXMpICYgRE9DX1RPR0dMRV9CSVQ7CisJCWlmICgoUmVhZERPQyh3aW5kb3csIDJrX0VDQ1N0YXR1cykgJiBET0NfVE9HR0xFX0JJVCkgIT0gdG1wKQorCQkJCXJldHVybiBDaGlwSUQ7CisJCWJyZWFrOworCisJY2FzZSBET0NfQ2hpcElEX0RvY01pbDoKKwkJLyogQ2hlY2sgdGhlIFRPR0dMRSBiaXQgaW4gdGhlIEVDQyByZWdpc3RlciAqLworCQl0bXAgPSBSZWFkRE9DKHdpbmRvdywgRUNDQ29uZikgJiBET0NfVE9HR0xFX0JJVDsKKwkJaWYgKChSZWFkRE9DKHdpbmRvdywgRUNDQ29uZikgJiBET0NfVE9HR0xFX0JJVCkgIT0gdG1wKQorCQkJCXJldHVybiBDaGlwSUQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKyNpZm5kZWYgQ0ZHX0RPQ1BST0JFXzU1QUEKKy8qCisgKiBpZiB0aGUgSUQgaXNuJ3QgdGhlIERvQzIwMDAgb3IgRG9DTWlsbGVuaXVtIElELCBzbyB3ZSBjYW4gYXNzdW1lCisgKiB0aGUgRE9DIGlzIG1pc3NpbmcKKyAqLworIyBpZiAwCisJCXByaW50ZigiUG9zc2libGUgRGlza09uQ2hpcCB3aXRoIHVua25vd24gQ2hpcElEICUyLjJYIGZvdW5kIGF0IDB4JWx4XG4iLAorCQkgICAgICAgQ2hpcElELCBwaHlzYWRyKTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBET0NfUEFTU0lWRV9QUk9CRQorCQkvKiBQdXQgYmFjayB0aGUgY29udGVudHMgb2YgdGhlIERPQ0NvbnRyb2wgcmVnaXN0ZXIsIGluIGNhc2UgaXQncyBub3QKKwkJICogYWN0dWFsbHkgYSBEaXNrT25DaGlwLgorCQkgKi8KKwkJV3JpdGVET0ModG1wMiwgd2luZG93LCBET0NDb250cm9sKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKwlwdXRzICgiRGlza09uQ2hpcCBmYWlsZWQgVE9HR0xFIHRlc3QsIGRyb3BwaW5nLlxuIik7CisKKyNpZm5kZWYgRE9DX1BBU1NJVkVfUFJPQkUKKwkvKiBQdXQgYmFjayB0aGUgY29udGVudHMgb2YgdGhlIERPQ0NvbnRyb2wgcmVnaXN0ZXI6IGl0J3Mgbm90IGEgRGlza09uQ2hpcCAqLworCVdyaXRlRE9DKHRtcDIsIHdpbmRvdywgRE9DQ29udHJvbCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkb2NfcHJvYmUodW5zaWduZWQgbG9uZyBwaHlzYWRyKQoreworCXN0cnVjdCBEaXNrT25DaGlwICp0aGlzID0gTlVMTDsKKwlpbnQgaT0wLCBDaGlwSUQ7CisKKwlpZiAoKENoaXBJRCA9IGRvY2NoZWNrKHBoeXNhZHIsIHBoeXNhZHIpKSkgeworCisJCWZvciAoaT0wOyBpPENGR19NQVhfRE9DX0RFVklDRTsgaSsrKSB7CisJCQlpZiAoZG9jX2Rldl9kZXNjW2ldLkNoaXBJRCA9PSBET0NfQ2hpcElEX1VOS05PV04pIHsKKwkJCQl0aGlzID0gZG9jX2Rldl9kZXNjICsgaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghdGhpcykgeworCQkJcHV0cyAoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRhdGEgc3RydWN0dXJlcy5cbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGN1cnJfZGV2aWNlID09IC0xKQorCQkJY3Vycl9kZXZpY2UgPSBpOworCisJCW1lbXNldCgoY2hhciAqKXRoaXMsIDAsIHNpemVvZihzdHJ1Y3QgRGlza09uQ2hpcCkpOworCisJCXRoaXMtPnZpcnRhZHIgPSBwaHlzYWRyOworCQl0aGlzLT5waHlzYWRyID0gcGh5c2FkcjsKKwkJdGhpcy0+Q2hpcElEID0gQ2hpcElEOworCisJCURvQzJrX2luaXQodGhpcyk7CisJfSBlbHNlIHsKKwkJcHV0cyAoIk5vIERpc2tPbkNoaXAgZm91bmRcbiIpOworCX0KK30KKworI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfaWRlLmMgYi9jb21tb24vY21kX2lkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYmZlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vY21kX2lkZS5jCkBAIC0wLDAgKzEsMTU2MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisvKgorICogSURFIHN1cHBvcnQKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGltYWdlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2lmIGRlZmluZWQoQ09ORklHX0lERV84eHhfRElSRUNUKSB8fCBkZWZpbmVkKENPTkZJR19JREVfUENNQ0lBKQorIyBpbmNsdWRlIDxwY21jaWEuaD4KKyNlbmRpZgorI2lmZGVmIENPTkZJR184eHgKKyMgaW5jbHVkZSA8bXBjOHh4Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxpZGUuaD4KKyNpbmNsdWRlIDxhdGEuaD4KKyNpbmNsdWRlIDxjbWRfaWRlLmg+CisjaW5jbHVkZSA8Y21kX2Rpc2suaD4KKyNpZmRlZiBDT05GSUdfU1RBVFVTX0xFRAorIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKKyMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgorIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykJc2hvd19ib290X3Byb2dyZXNzKGFyZykKKyNlbHNlCisjIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQorI2VuZGlmCisKKworI3VuZGVmCUlERV9ERUJVRworCisjaWZkZWYJSURFX0RFQlVHCisjZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKKyNlbHNlCisjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikKKyNlbmRpZgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorCisvKiBUaW1pbmdzIGZvciBJREUgSW50ZXJmYWNlCisgKgorICogU0VUVVAgLyBMRU5HVEggLyBIT0xEIC0gY3ljbGVzIHZhbGlkIGZvciA1MCBNSHogY2xrCisgKiA3MAkgICAxNjUJICAgIDMwCSAgIFBJTy1Nb2RlIDAsIFtuc10KKyAqICA0CSAgICAgOQkgICAgIDIJCSAgICAgICBbQ3ljbGVzXQorICogNTAJICAgMTI1CSAgICAyMAkgICBQSU8tTW9kZSAxLCBbbnNdCisgKiAgMwkgICAgIDcJICAgICAyCQkgICAgICAgW0N5Y2xlc10KKyAqIDMwCSAgIDEwMAkgICAgMTUJICAgUElPLU1vZGUgMiwgW25zXQorICogIDIJICAgICA2CSAgICAgMQkJICAgICAgIFtDeWNsZXNdCisgKiAzMAkgICAgODAJICAgIDEwCSAgIFBJTy1Nb2RlIDMsIFtuc10KKyAqICAyCSAgICAgNQkgICAgIDEJCSAgICAgICBbQ3ljbGVzXQorICogMjUJICAgIDcwCSAgICAxMAkgICBQSU8tTW9kZSA0LCBbbnNdCisgKiAgMgkgICAgIDQJICAgICAxCQkgICAgICAgW0N5Y2xlc10KKyAqLworCitjb25zdCBzdGF0aWMgcGlvX2NvbmZpZ190IHBpb19jb25maWdfbnMgW0lERV9NQVhfUElPX01PREUrMV0gPQoreworICAgIC8qCVNldHVwICBMZW5ndGggIEhvbGQgICovCisJeyA3MCwJMTY1LAkzMCB9LAkJLyogUElPLU1vZGUgMCwgW25zXQkqLworCXsgNTAsCTEyNSwJMjAgfSwJCS8qIFBJTy1Nb2RlIDEsIFtuc10JKi8KKwl7IDMwLAkxMDEsCTE1IH0sCQkvKiBQSU8tTW9kZSAyLCBbbnNdCSovCisJeyAzMCwJIDgwLAkxMCB9LAkJLyogUElPLU1vZGUgMywgW25zXQkqLworCXsgMjUsCSA3MCwJMTAgfSwJCS8qIFBJTy1Nb2RlIDQsIFtuc10JKi8KK307CisKK3N0YXRpYyBwaW9fY29uZmlnX3QgcGlvX2NvbmZpZ19jbGsgW0lERV9NQVhfUElPX01PREUrMV07CisKKyNpZm5kZWYJQ0ZHX1BJT19NT0RFCisjZGVmaW5lCUNGR19QSU9fTU9ERQkwCQkvKiB1c2UgYSByZWxheGVkIGRlZmF1bHQgKi8KKyNlbmRpZgorc3RhdGljIGludCBwaW9fbW9kZSA9IENGR19QSU9fTU9ERTsKKworLyogTWFrZSBjbG9jayBjeWNsZXMgYW5kIGFsd2F5cyByb3VuZCB1cCAqLworCisjZGVmaW5lIFBDTUNJQV9NS19DTEtTKCB0LCBUICkgKCggKHQpICogKFQpICsgOTk5VSApIC8gMTAwMFUgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEN1cnJlbnQgSS9PIERldmljZQkqLworc3RhdGljIGludCBjdXJyX2RldmljZSA9IC0xOworCisvKiBDdXJyZW50IG9mZnNldCBmb3IgSURFMCAvIElERTEgYnVzIGFjY2VzcwkqLwordWxvbmcgaWRlX2J1c19vZmZzZXRbQ0ZHX0lERV9NQVhCVVNdID0geworI2lmIGRlZmluZWQoQ0ZHX0FUQV9JREUwX09GRlNFVCkKKwlDRkdfQVRBX0lERTBfT0ZGU0VULAorI2VuZGlmCisjaWYgZGVmaW5lZChDRkdfQVRBX0lERTFfT0ZGU0VUKSAmJiAoQ0ZHX0lERV9NQVhCVVMgPiAxKQorCUNGR19BVEFfSURFMV9PRkZTRVQsCisjZW5kaWYKK307CisKKyNkZWZpbmUJQVRBX0NVUlJfQkFTRShkZXYpCShDRkdfQVRBX0JBU0VfQUREUitpZGVfYnVzX29mZnNldFtJREVfQlVTKGRldildKQorCitzdGF0aWMgaW50CSAgICBpZGVfYnVzX29rW0NGR19JREVfTUFYQlVTXTsKKworc3RhdGljICBibG9ja19kZXZfZGVzY190IGlkZV9kZXZfZGVzY1tDRkdfSURFX01BWERFVklDRV07CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBDT05GSUdfSURFX0xFRAorc3RhdGljIHZvaWQgIGlkZV9sZWQgICAodWNoYXIgbGVkLCB1Y2hhciBzdGF0dXMpOworI2Vsc2UKKyNkZWZpbmUgaWRlX2xlZChhLGIpCS8qIGR1bW15ICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JREVfUkVTRVQKK3N0YXRpYyB2b2lkICBpZGVfcmVzZXQgKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgaWRlX3Jlc2V0KCkJLyogZHVtbXkgKi8KKyNlbmRpZgorCitzdGF0aWMgdm9pZCAgaWRlX2lkZW50IChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CitzdGF0aWMgdWNoYXIgaWRlX3dhaXQgIChpbnQgZGV2LCB1bG9uZyB0KTsKKworI2RlZmluZSBJREVfVElNRV9PVVQJMjAwMAkvKiAyIHNlYyB0aW1lb3V0ICovCisKKyNkZWZpbmUgQVRBUElfVElNRV9PVVQJNzAwMAkvKiA3IHNlYyB0aW1lb3V0ICg1IHNlYyBzZWVtcyB0byB3b3JrLi4uKSAqLworCisjZGVmaW5lIElERV9TUElOX1VQX1RJTUVfT1VUIDUwMDAgLyogNSBzZWMgc3Bpbi11cCB0aW1lb3V0ICovCisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gb3V0YihpbnQgZGV2LCBpbnQgcG9ydCwgdW5zaWduZWQgY2hhciB2YWwpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgX19pbmxpbmVfXyBpbmIoaW50IGRldiwgaW50IHBvcnQpOworc3RhdGljIHZvaWQgaW5wdXRfc3dhcF9kYXRhKGludCBkZXYsIHVsb25nICpzZWN0X2J1ZiwgaW50IHdvcmRzKTsKK3N0YXRpYyB2b2lkIGlucHV0X2RhdGEoaW50IGRldiwgdWxvbmcgKnNlY3RfYnVmLCBpbnQgd29yZHMpOworc3RhdGljIHZvaWQgb3V0cHV0X2RhdGEoaW50IGRldiwgdWxvbmcgKnNlY3RfYnVmLCBpbnQgd29yZHMpOworc3RhdGljIHZvaWQgaWRlbnRfY3B5ICh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGludCBsZW4pOworCisKKyNpZmRlZiBDT05GSUdfQVRBUEkKK3N0YXRpYyB2b2lkCWF0YXBpX2lucXVpcnkoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOwordWxvbmcgYXRhcGlfcmVhZCAoaW50IGRldmljZSwgdWxvbmcgYmxrbnIsIHVsb25nIGJsa2NudCwgdWxvbmcgKmJ1ZmZlcik7CisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX0lERV84eHhfRElSRUNUCitzdGF0aWMgdm9pZCBzZXRfcGNtY2lhX3RpbWluZyAoaW50IHBtb2RlKTsKKyNlbHNlCisjZGVmaW5lIHNldF9wY21jaWFfdGltaW5nKGEpCS8qIGR1bW15ICovCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgZG9faWRlIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgcmNvZGUgPSAwOworCisgICAgc3dpdGNoIChhcmdjKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKwlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworICAgIGNhc2UgMjoKKwlpZiAoc3RybmNtcChhcmd2WzFdLCJyZXMiLDMpID09IDApIHsKKwkJcHV0cyAoIlxuUmVzZXQgSURFIgorI2lmZGVmIENPTkZJR19JREVfOHh4X0RJUkVDVAorCQkJIiBvbiBQQ01DSUEgIiBQQ01DSUFfU0xPVF9NU0cKKyNlbmRpZgorCQkJIjogIik7CisKKwkJaWRlX2luaXQgKCk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoc3RybmNtcChhcmd2WzFdLCJpbmYiLDMpID09IDApIHsKKwkJaW50IGk7CisKKwkJcHV0YyAoJ1xuJyk7CisKKwkJZm9yIChpPTA7IGk8Q0ZHX0lERV9NQVhERVZJQ0U7ICsraSkgeworCQkJaWYgKGlkZV9kZXZfZGVzY1tpXS50eXBlPT1ERVZfVFlQRV9VTktOT1dOKQorCQkJCWNvbnRpbnVlOyAvKiBsaXN0IG9ubHkga25vd24gZGV2aWNlcyAqLworCQkJcHJpbnRmICgiSURFIGRldmljZSAlZDogIiwgaSk7CisJCQlkZXZfcHJpbnQoJmlkZV9kZXZfZGVzY1tpXSk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwl9IGVsc2UgaWYgKHN0cm5jbXAoYXJndlsxXSwiZGV2IiwzKSA9PSAwKSB7CisJCWlmICgoY3Vycl9kZXZpY2UgPCAwKSB8fCAoY3Vycl9kZXZpY2UgPj0gQ0ZHX0lERV9NQVhERVZJQ0UpKSB7CisJCQlwdXRzICgiXG5ubyBJREUgZGV2aWNlcyBhdmFpbGFibGVcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcHJpbnRmICgiXG5JREUgZGV2aWNlICVkOiAiLCBjdXJyX2RldmljZSk7CisJCWRldl9wcmludCgmaWRlX2Rldl9kZXNjW2N1cnJfZGV2aWNlXSk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoc3RybmNtcChhcmd2WzFdLCJwYXJ0Iiw0KSA9PSAwKSB7CisJCWludCBkZXYsIG9rOworCisJCWZvciAob2s9MCwgZGV2PTA7IGRldjxDRkdfSURFX01BWERFVklDRTsgKytkZXYpIHsKKwkJCWlmIChpZGVfZGV2X2Rlc2NbZGV2XS5wYXJ0X3R5cGUhPVBBUlRfVFlQRV9VTktOT1dOKSB7CisJCQkJKytvazsKKwkJCQlpZiAoZGV2KQorCQkJCQlwdXRjICgnXG4nKTsKKwkJCQlwcmludF9wYXJ0KCZpZGVfZGV2X2Rlc2NbZGV2XSk7CisJCQl9CisJCX0KKwkJaWYgKCFvaykgeworCQkJcHV0cyAoIlxubm8gSURFIGRldmljZXMgYXZhaWxhYmxlXG4iKTsKKwkJCXJjb2RlICsrOworCQl9CisJCXJldHVybiByY29kZTsKKwl9CisJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwlyZXR1cm4gMTsKKyAgICBjYXNlIDM6CisJaWYgKHN0cm5jbXAoYXJndlsxXSwiZGV2IiwzKSA9PSAwKSB7CisJCWludCBkZXYgPSAoaW50KXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKTsKKworCQlwcmludGYgKCJcbklERSBkZXZpY2UgJWQ6ICIsIGRldik7CisJCWlmIChkZXYgPj0gQ0ZHX0lERV9NQVhERVZJQ0UpIHsKKwkJCXB1dHMgKCJ1bmtub3duIGRldmljZVxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkZXZfcHJpbnQoJmlkZV9kZXZfZGVzY1tkZXZdKTsKKwkJLyppZGVfcHJpbnQgKGRldik7Ki8KKworCQlpZiAoaWRlX2Rldl9kZXNjW2Rldl0udHlwZSA9PSBERVZfVFlQRV9VTktOT1dOKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWN1cnJfZGV2aWNlID0gZGV2OworCisJCXB1dHMgKCIuLi4gaXMgbm93IGN1cnJlbnQgZGV2aWNlXG4iKTsKKworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoYXJndlsxXSwicGFydCIsNCkgPT0gMCkgeworCQlpbnQgZGV2ID0gKGludClzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxMCk7CisKKwkJaWYgKGlkZV9kZXZfZGVzY1tkZXZdLnBhcnRfdHlwZSE9UEFSVF9UWVBFX1VOS05PV04pIHsKKwkJCQlwcmludF9wYXJ0KCZpZGVfZGV2X2Rlc2NbZGV2XSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCJcbklERSBkZXZpY2UgJWQgbm90IGF2YWlsYWJsZVxuIiwgZGV2KTsKKwkJCXJjb2RlID0gMTsKKwkJfQorCQlyZXR1cm4gcmNvZGU7CisjaWYgMAorCX0gZWxzZSBpZiAoc3RybmNtcChhcmd2WzFdLCJwaW8iLDQpID09IDApIHsKKwkJaW50IG1vZGUgPSAoaW50KXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKTsKKworCQlpZiAoKG1vZGUgPj0gMCkgJiYgKG1vZGUgPD0gSURFX01BWF9QSU9fTU9ERSkpIHsKKwkJCXB1dHMgKCJcblNldHRpbmcgIik7CisJCQlwaW9fbW9kZSA9IG1vZGU7CisJCQlpZGVfaW5pdCAoKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZiAoIlxuSW52YWxpZCBQSU8gbW9kZSAlZCAoMCAuLi4gJWQgb25seSlcbiIsCisJCQkJbW9kZSwgSURFX01BWF9QSU9fTU9ERSk7CisJCX0KKwkJcmV0dXJuOworI2VuZGlmCisJfQorCisJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwlyZXR1cm4gMTsKKyAgICBkZWZhdWx0OgorCS8qIGF0IGxlYXN0IDQgYXJncyAqLworCisJaWYgKHN0cmNtcChhcmd2WzFdLCJyZWFkIikgPT0gMCkgeworCQl1bG9uZyBhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCQl1bG9uZyBibGsgID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCQl1bG9uZyBjbnQgID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgTlVMTCwgMTYpOworCQl1bG9uZyBuOworCisJCXByaW50ZiAoIlxuSURFIHJlYWQ6IGRldmljZSAlZCBibG9jayAjICVsZCwgY291bnQgJWxkIC4uLiAiLAorCQkJY3Vycl9kZXZpY2UsIGJsaywgY250KTsKKworCQluID0gaWRlX2Rldl9kZXNjW2N1cnJfZGV2aWNlXS5ibG9ja19yZWFkIChjdXJyX2RldmljZSwKKwkJCQkJCQkgIGJsaywgY250LAorCQkJCQkJCSAgKHVsb25nICopYWRkcik7CisJCS8qIGZsdXNoIGNhY2hlIGFmdGVyIHJlYWQgKi8KKwkJZmx1c2hfY2FjaGUgKGFkZHIsIGNudCppZGVfZGV2X2Rlc2NbY3Vycl9kZXZpY2VdLmJsa3N6KTsKKworCQlwcmludGYgKCIlbGQgYmxvY2tzIHJlYWQ6ICVzXG4iLAorCQkJbiwgKG49PWNudCkgPyAiT0siIDogIkVSUk9SIik7CisJCWlmIChuPT1jbnQpIHsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCJ3cml0ZSIpID09IDApIHsKKwkJdWxvbmcgYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwkJdWxvbmcgYmxrICA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKwkJdWxvbmcgY250ICA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sIE5VTEwsIDE2KTsKKwkJdWxvbmcgbjsKKworCQlwcmludGYgKCJcbklERSB3cml0ZTogZGV2aWNlICVkIGJsb2NrICMgJWxkLCBjb3VudCAlbGQgLi4uICIsCisJCQljdXJyX2RldmljZSwgYmxrLCBjbnQpOworCisJCW4gPSBpZGVfd3JpdGUgKGN1cnJfZGV2aWNlLCBibGssIGNudCwgKHVsb25nICopYWRkcik7CisKKwkJcHJpbnRmICgiJWxkIGJsb2NrcyB3cml0dGVuOiAlc1xuIiwKKwkJCW4sIChuPT1jbnQpID8gIk9LIiA6ICJFUlJPUiIpOworCQlpZiAobj09Y250KSB7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwkJcmNvZGUgPSAxOworCX0KKworCXJldHVybiByY29kZTsKKyAgICB9Cit9CisKK2ludCBkb19kaXNrYm9vdCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY2hhciAqYm9vdF9kZXZpY2UgPSBOVUxMOworCWNoYXIgKmVwOworCWludCBkZXYsIHBhcnQgPSAwOworCXVsb25nIGNudDsKKwl1bG9uZyBhZGRyOworCWRpc2tfcGFydGl0aW9uX3QgaW5mbzsKKwlpbWFnZV9oZWFkZXJfdCAqaGRyOworCWludCByY29kZSA9IDA7CisKKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDE6CisJCWFkZHIgPSBDRkdfTE9BRF9BRERSOworCQlib290X2RldmljZSA9IGdldGVudiAoImJvb3RkZXZpY2UiKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOworCQlib290X2RldmljZSA9IGdldGVudiAoImJvb3RkZXZpY2UiKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOworCQlib290X2RldmljZSA9IGFyZ3ZbMl07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIWJvb3RfZGV2aWNlKSB7CisJCXB1dHMgKCJcbioqIE5vIGJvb3QgZGV2aWNlICoqXG4iKTsKKwkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXJldHVybiAxOworCX0KKworCWRldiA9IHNpbXBsZV9zdHJ0b3VsKGJvb3RfZGV2aWNlLCAmZXAsIDE2KTsKKworCWlmIChpZGVfZGV2X2Rlc2NbZGV2XS50eXBlPT1ERVZfVFlQRV9VTktOT1dOKSB7CisJCXByaW50ZiAoIlxuKiogRGV2aWNlICVkIG5vdCBhdmFpbGFibGVcbiIsIGRldik7CisJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKmVwKSB7CisJCWlmICgqZXAgIT0gJzonKSB7CisJCQlwdXRzICgiXG4qKiBJbnZhbGlkIGJvb3QgZGV2aWNlLCB1c2UgYGRldls6cGFydF0nICoqXG4iKTsKKwkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcGFydCA9IHNpbXBsZV9zdHJ0b3VsKCsrZXAsIE5VTEwsIDE2KTsKKwl9CisJaWYgKGdldF9wYXJ0aXRpb25faW5mbyAoJmlkZV9kZXZfZGVzY1tkZXZdLCBwYXJ0LCAmaW5mbykpIHsKKwkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoc3RybmNtcChpbmZvLnR5cGUsIEJPT1RfUEFSVF9UWVBFLCBzaXplb2YoaW5mby50eXBlKSkgIT0gMCkgeworCQlwcmludGYgKCJcbioqIEludmFsaWQgcGFydGl0aW9uIHR5cGUgXCIlLjMyc1wiIgorCQkJIiAoZXhwZWN0IFwiIiBCT09UX1BBUlRfVFlQRSAiXCIpXG4iLAorCQkJaW5mby50eXBlKTsKKwkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXJldHVybiAxOworCX0KKworCXByaW50ZiAoIlxuTG9hZGluZyBmcm9tIElERSBkZXZpY2UgJWQsIHBhcnRpdGlvbiAlZDogIgorCQkiTmFtZTogJS4zMnMgIFR5cGU6ICUuMzJzXG4iLAorCQlkZXYsIHBhcnQsIGluZm8ubmFtZSwgaW5mby50eXBlKTsKKworCVBSSU5URiAoIkZpcnN0IEJsb2NrOiAlbGQsICAjIG9mIGJsb2NrczogJWxkLCBCbG9jayBTaXplOiAlbGRcbiIsCisJCWluZm8uc3RhcnQsIGluZm8uc2l6ZSwgaW5mby5ibGtzeik7CisKKwlpZiAoaWRlX2Rldl9kZXNjW2Rldl0uYmxvY2tfcmVhZCAoZGV2LCBpbmZvLnN0YXJ0LCAxLCAodWxvbmcgKilhZGRyKSAhPSAxKSB7CisJCXByaW50ZiAoIioqIFJlYWQgZXJyb3Igb24gJWQ6JWRcbiIsIGRldiwgcGFydCk7CisJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlyZXR1cm4gMTsKKwl9CisKKwloZHIgPSAoaW1hZ2VfaGVhZGVyX3QgKilhZGRyOworCisJaWYgKG50b2hsKGhkci0+aWhfbWFnaWMpID09IElIX01BR0lDKSB7CisKKwkJcHJpbnRfaW1hZ2VfaGRyIChoZHIpOworCisJCWNudCA9IChudG9obChoZHItPmloX3NpemUpICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSk7CisJCWNudCArPSBpbmZvLmJsa3N6IC0gMTsKKwkJY250IC89IGluZm8uYmxrc3o7CisJCWNudCAtPSAxOworCX0gZWxzZSB7CisJCXByaW50ZigiXG4qKiBCYWQgTWFnaWMgTnVtYmVyICoqXG4iKTsKKwkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChpZGVfZGV2X2Rlc2NbZGV2XS5ibG9ja19yZWFkIChkZXYsIGluZm8uc3RhcnQrMSwgY250LAorCQkgICAgICAodWxvbmcgKikoYWRkcitpbmZvLmJsa3N6KSkgIT0gY250KSB7CisJCXByaW50ZiAoIioqIFJlYWQgZXJyb3Igb24gJWQ6JWRcbiIsIGRldiwgcGFydCk7CisJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlyZXR1cm4gMTsKKwl9CisKKworCS8qIExvYWRpbmcgb2ssIHVwZGF0ZSBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworCisJbG9hZF9hZGRyID0gYWRkcjsKKworCS8qIENoZWNrIGlmIHdlIHNob3VsZCBhdHRlbXB0IGFuIGF1dG8tc3RhcnQgKi8KKwlpZiAoKChlcCA9IGdldGVudigiYXV0b3N0YXJ0IikpICE9IE5VTEwpICYmIChzdHJjbXAoZXAsInllcyIpID09IDApKSB7CisJCWNoYXIgKmxvY2FsX2FyZ3NbMl07CisJCWV4dGVybiBpbnQgZG9fYm9vdG0gKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOworCisJCWxvY2FsX2FyZ3NbMF0gPSBhcmd2WzBdOworCQlsb2NhbF9hcmdzWzFdID0gTlVMTDsKKworCQlwcmludGYgKCJBdXRvbWF0aWMgYm9vdCBvZiBpbWFnZSBhdCBhZGRyIDB4JTA4bFggLi4uXG4iLCBhZGRyKTsKKworCQlkb19ib290bSAoY21kdHAsIDAsIDEsIGxvY2FsX2FyZ3MpOworCQlyY29kZSA9IDE7CisJfQorCXJldHVybiByY29kZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGlkZV9pbml0ICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWZkZWYgQ09ORklHX0lERV84eHhfRElSRUNUCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJdm9sYXRpbGUgcGNtY29uZjh4eF90ICpwY21wID0gJihpbW1yLT5pbV9wY21jaWEpOworI2VuZGlmCisJdW5zaWduZWQgY2hhciBjOworCWludCBpLCBidXM7CisKKyNpZmRlZiBDT05GSUdfSURFXzh4eF9QQ0NBUkQKKwlleHRlcm4gaW50IHBjbWNpYV9vbiAodm9pZCk7CisKKwlXQVRDSERPR19SRVNFVCgpOworCisJLyogaW5pdGlhbGl6ZSB0aGUgUENNQ0lBIElERSBhZGFwdGVyIGNhcmQgKi8KKwlpZiAocGNtY2lhX29uKCkpCisJCXJldHVybjsKKwl1ZGVsYXkgKDEwMDAwMDApOwkvKiAxIHMgKi8KKyNlbmRpZgkvKiBDT05GSUdfSURFXzh4eF9QQ0NBUkQgKi8KKworCVdBVENIRE9HX1JFU0VUKCk7CisKKwkvKiBJbml0aWFsaXplIFBJTyB0aW1pbmcgdGFibGVzICovCisJZm9yIChpPTA7IGkgPD0gSURFX01BWF9QSU9fTU9ERTsgKytpKSB7CisJICAgIHBpb19jb25maWdfY2xrW2ldLnRfc2V0dXAgID0gUENNQ0lBX01LX0NMS1MocGlvX2NvbmZpZ19uc1tpXS50X3NldHVwLAorCQkJCQkJCSAgICBnZC0+YnVzX2Nsayk7CisJICAgIHBpb19jb25maWdfY2xrW2ldLnRfbGVuZ3RoID0gUENNQ0lBX01LX0NMS1MocGlvX2NvbmZpZ19uc1tpXS50X2xlbmd0aCwKKwkJCQkJCQkgICAgZ2QtPmJ1c19jbGspOworCSAgICBwaW9fY29uZmlnX2Nsa1tpXS50X2hvbGQgICA9IFBDTUNJQV9NS19DTEtTKHBpb19jb25maWdfbnNbaV0udF9ob2xkLAorCQkJCQkJCSAgICBnZC0+YnVzX2Nsayk7CisJICAgIFBSSU5URiAoIlBJTyBNb2RlICVkOiBzZXR1cD0lMmQgbnMvJWQgY2xrIgorCQkgICAgIiAgbGVuPSUzZCBucy8lZCBjbGsiCisJCSAgICAiICBob2xkPSUyZCBucy8lZCBjbGtcbiIsCisJCSAgICBpLAorCQkgICAgcGlvX2NvbmZpZ19uc1tpXS50X3NldHVwLCAgcGlvX2NvbmZpZ19jbGtbaV0udF9zZXR1cCwKKwkJICAgIHBpb19jb25maWdfbnNbaV0udF9sZW5ndGgsIHBpb19jb25maWdfY2xrW2ldLnRfbGVuZ3RoLAorCQkgICAgcGlvX2NvbmZpZ19uc1tpXS50X2hvbGQsICAgcGlvX2NvbmZpZ19jbGtbaV0udF9ob2xkKTsKKwl9CisKKwkvKiBSZXNldCB0aGUgSURFIGp1c3QgdG8gYmUgc3VyZS4KKwkgKiBMaWdodCBMRUQncyB0byBzaG93CisJICovCisJaWRlX2xlZCAoKExFRF9JREUxIHwgTEVEX0lERTIpLCAxKTsJCS8qIExFRCdzIG9uCSovCisJaWRlX3Jlc2V0ICgpOyAvKiBBVEFQSSBEcml2ZXMgc2VlbXMgdG8gbmVlZCBhIHByb3BlciBJREUgUmVzZXQgKi8KKworI2lmZGVmIENPTkZJR19JREVfOHh4X0RJUkVDVAorCS8qIFBDTUNJQSAvIElERSBpbml0aWFsaXphdGlvbiBmb3IgY29tbW9uIG1lbSBzcGFjZSAqLworCXBjbXAtPnBjbWNfcGdjcmIgPSAwOworI2VuZGlmCisKKwkvKiBzdGFydCBpbiBQSU8gbW9kZSAwIC0gbW9zdCByZWxheGVkIHRpbWluZ3MgKi8KKwlwaW9fbW9kZSA9IDA7CisJc2V0X3BjbWNpYV90aW1pbmcgKHBpb19tb2RlKTsKKworCS8qCisJICogV2FpdCBmb3IgSURFIHRvIGdldCByZWFkeS4KKwkgKiBBY2NvcmRpbmcgdG8gc3BlYywgdGhpcyBjYW4gdGFrZSB1cCB0byAzMSBzZWNvbmRzIQorCSAqLworCWZvciAoYnVzPTA7IGJ1czxDRkdfSURFX01BWEJVUzsgKytidXMpIHsKKwkJaW50IGRldiA9IGJ1cyAqIChDRkdfSURFX01BWERFVklDRSAvIENGR19JREVfTUFYQlVTKTsKKworCQlwcmludGYgKCJCdXMgJWQ6ICIsIGJ1cyk7CisKKwkJaWRlX2J1c19va1tidXNdID0gMDsKKworCQkvKiBTZWxlY3QgZGV2aWNlCisJCSAqLworCQl1ZGVsYXkgKDEwMDAwMCk7CQkvKiAxMDAgbXMgKi8KKwkJb3V0YiAoZGV2LCBBVEFfREVWX0hELCBBVEFfTEJBIHwgQVRBX0RFVklDRShkZXYpKTsKKwkJdWRlbGF5ICgxMDAwMDApOwkJLyogMTAwIG1zICovCisKKwkJaSA9IDA7CisJCWRvIHsKKwkJCXVkZWxheSAoMTAwMDApOwkJLyogMTAgbXMgKi8KKworCQkJYyA9IGluYiAoZGV2LCBBVEFfU1RBVFVTKTsKKwkJCWkrKzsKKwkJCWlmIChpID4gKEFUQV9SRVNFVF9USU1FICogMTAwKSkgeworCQkJCXB1dHMgKCIqKiBUaW1lb3V0ICoqXG4iKTsKKwkJCQlpZGVfbGVkICgoTEVEX0lERTEgfCBMRURfSURFMiksIDApOyAvKiBMRUQncyBvZmYgKi8KKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoKGkgPj0gMTAwKSAmJiAoKGklMTAwKT09MCkpIHsKKwkJCQlwdXRjICgnLicpOworCQkJfQorCQl9IHdoaWxlIChjICYgQVRBX1NUQVRfQlVTWSk7CisKKwkJaWYgKGMgJiAoQVRBX1NUQVRfQlVTWSB8IEFUQV9TVEFUX0ZBVUxUKSkgeworCQkJcHV0cyAoIm5vdCBhdmFpbGFibGUgICIpOworCQkJUFJJTlRGICgiU3RhdHVzID0gMHglMDJYICIsIGMpOworI2lmbmRlZiBDT05GSUdfQVRBUEkgLyogQVRBUEkgRGV2aWNlcyBkbyBub3Qgc2V0IERSRFkgKi8KKwkJfSBlbHNlICBpZiAoKGMgJiBBVEFfU1RBVF9SRUFEWSkgPT0gMCkgeworCQkJcHV0cyAoIm5vdCBhdmFpbGFibGUgICIpOworCQkJUFJJTlRGICgiU3RhdHVzID0gMHglMDJYICIsIGMpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlwdXRzICgiT0sgIik7CisJCQlpZGVfYnVzX29rW2J1c10gPSAxOworCQl9CisJCVdBVENIRE9HX1JFU0VUKCk7CisJfQorCXB1dGMgKCdcbicpOworCisJaWRlX2xlZCAoKExFRF9JREUxIHwgTEVEX0lERTIpLCAwKTsJLyogTEVEJ3Mgb2ZmCSovCisKKwljdXJyX2RldmljZSA9IC0xOworCWZvciAoaT0wOyBpPENGR19JREVfTUFYREVWSUNFOyArK2kpIHsKKyNpZmRlZiBDT05GSUdfSURFX0xFRAorCQlpbnQgbGVkID0gKElERV9CVVMoaSkgPT0gMCkgPyBMRURfSURFMSA6IExFRF9JREUyOworI2VuZGlmCisJCWlkZV9kZXZfZGVzY1tpXS5pZl90eXBlPUlGX1RZUEVfSURFOworCQlpZGVfZGV2X2Rlc2NbaV0uZGV2PWk7CisJCWlkZV9kZXZfZGVzY1tpXS5wYXJ0X3R5cGU9UEFSVF9UWVBFX1VOS05PV047CisJCWlkZV9kZXZfZGVzY1tpXS5ibGtzej0wOworCQlpZGVfZGV2X2Rlc2NbaV0ubGJhPTA7CisJCWlkZV9kZXZfZGVzY1tpXS5ibG9ja19yZWFkPWlkZV9yZWFkOworCQlpZiAoIWlkZV9idXNfb2tbSURFX0JVUyhpKV0pCisJCQljb250aW51ZTsKKwkJaWRlX2xlZCAobGVkLCAxKTsJCS8qIExFRCBvbgkqLworCQlpZGVfaWRlbnQoJmlkZV9kZXZfZGVzY1tpXSk7CisJCWlkZV9sZWQgKGxlZCwgMCk7CQkvKiBMRUQgb2ZmCSovCisJCWRldl9wcmludCgmaWRlX2Rldl9kZXNjW2ldKTsKKy8qCQlpZGVfcHJpbnQgKGkpOyAqLworCQlpZiAoKGlkZV9kZXZfZGVzY1tpXS5sYmEgPiAwKSAmJiAoaWRlX2Rldl9kZXNjW2ldLmJsa3N6ID4gMCkpIHsKKwkJCWluaXRfcGFydCAoJmlkZV9kZXZfZGVzY1tpXSk7CQkJLyogaW5pdGlhbGl6ZSBwYXJ0aXRpb24gdHlwZSAqLworCQkJaWYgKGN1cnJfZGV2aWNlIDwgMCkKKwkJCQljdXJyX2RldmljZSA9IGk7CisJCX0KKwl9CisJV0FUQ0hET0dfUkVTRVQoKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitibG9ja19kZXZfZGVzY190ICogaWRlX2dldF9kZXYoaW50IGRldikKK3sKKwlyZXR1cm4gKChibG9ja19kZXZfZGVzY190ICopJmlkZV9kZXZfZGVzY1tkZXZdKTsKK30KKworCisjaWZkZWYgQ09ORklHX0lERV84eHhfRElSRUNUCisKK3N0YXRpYyB2b2lkCitzZXRfcGNtY2lhX3RpbWluZyAoaW50IHBtb2RlKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworCXZvbGF0aWxlIHBjbWNvbmY4eHhfdCAqcGNtcCA9ICYoaW1tci0+aW1fcGNtY2lhKTsKKwl1bG9uZyB0aW1pbmdzOworCisJUFJJTlRGICgiU2V0IHRpbWluZyBmb3IgUElPIE1vZGUgJWRcbiIsIHBtb2RlKTsKKworCXRpbWluZ3MgPSBQQ01DSUFfU0hUKHBpb19jb25maWdfY2xrW3Btb2RlXS50X2hvbGQpCisJCXwgUENNQ0lBX1NTVChwaW9fY29uZmlnX2Nsa1twbW9kZV0udF9zZXR1cCkKKwkJfCBQQ01DSUFfU0wgKHBpb19jb25maWdfY2xrW3Btb2RlXS50X2xlbmd0aCkKKwkJOworCisJLyogSURFIDAKKwkgKi8KKwlwY21wLT5wY21jX3BicjAgPSBDRkdfUENNQ0lBX1BCUjA7CisJcGNtcC0+cGNtY19wb3IwID0gQ0ZHX1BDTUNJQV9QT1IwCisjaWYgKENGR19QQ01DSUFfUE9SMCAhPSAwKQorCQkJfCB0aW1pbmdzCisjZW5kaWYKKwkJCTsKKwlQUklOVEYgKCJQQlIwOiAlMDh4ICBQT1IwOiAlMDh4XG4iLCBwY21wLT5wY21jX3BicjAsIHBjbXAtPnBjbWNfcG9yMCk7CisKKwlwY21wLT5wY21jX3BicjEgPSBDRkdfUENNQ0lBX1BCUjE7CisJcGNtcC0+cGNtY19wb3IxID0gQ0ZHX1BDTUNJQV9QT1IxCisjaWYgKENGR19QQ01DSUFfUE9SMSAhPSAwKQorCQkJfCB0aW1pbmdzCisjZW5kaWYKKwkJCTsKKwlQUklOVEYgKCJQQlIxOiAlMDh4ICBQT1IxOiAlMDh4XG4iLCBwY21wLT5wY21jX3BicjEsIHBjbXAtPnBjbWNfcG9yMSk7CisKKwlwY21wLT5wY21jX3BicjIgPSBDRkdfUENNQ0lBX1BCUjI7CisJcGNtcC0+cGNtY19wb3IyID0gQ0ZHX1BDTUNJQV9QT1IyCisjaWYgKENGR19QQ01DSUFfUE9SMiAhPSAwKQorCQkJfCB0aW1pbmdzCisjZW5kaWYKKwkJCTsKKwlQUklOVEYgKCJQQlIyOiAlMDh4ICBQT1IyOiAlMDh4XG4iLCBwY21wLT5wY21jX3BicjIsIHBjbXAtPnBjbWNfcG9yMik7CisKKwlwY21wLT5wY21jX3BicjMgPSBDRkdfUENNQ0lBX1BCUjM7CisJcGNtcC0+cGNtY19wb3IzID0gQ0ZHX1BDTUNJQV9QT1IzCisjaWYgKENGR19QQ01DSUFfUE9SMyAhPSAwKQorCQkJfCB0aW1pbmdzCisjZW5kaWYKKwkJCTsKKwlQUklOVEYgKCJQQlIzOiAlMDh4ICBQT1IzOiAlMDh4XG4iLCBwY21wLT5wY21jX3BicjMsIHBjbXAtPnBjbWNfcG9yMyk7CisKKwkvKiBJREUgMQorCSAqLworCXBjbXAtPnBjbWNfcGJyNCA9IENGR19QQ01DSUFfUEJSNDsKKwlwY21wLT5wY21jX3BvcjQgPSBDRkdfUENNQ0lBX1BPUjQKKyNpZiAoQ0ZHX1BDTUNJQV9QT1I0ICE9IDApCisJCQl8IHRpbWluZ3MKKyNlbmRpZgorCQkJOworCVBSSU5URiAoIlBCUjQ6ICUwOHggIFBPUjQ6ICUwOHhcbiIsIHBjbXAtPnBjbWNfcGJyNCwgcGNtcC0+cGNtY19wb3I0KTsKKworCXBjbXAtPnBjbWNfcGJyNSA9IENGR19QQ01DSUFfUEJSNTsKKwlwY21wLT5wY21jX3BvcjUgPSBDRkdfUENNQ0lBX1BPUjUKKyNpZiAoQ0ZHX1BDTUNJQV9QT1I1ICE9IDApCisJCQl8IHRpbWluZ3MKKyNlbmRpZgorCQkJOworCVBSSU5URiAoIlBCUjU6ICUwOHggIFBPUjU6ICUwOHhcbiIsIHBjbXAtPnBjbWNfcGJyNSwgcGNtcC0+cGNtY19wb3I1KTsKKworCXBjbXAtPnBjbWNfcGJyNiA9IENGR19QQ01DSUFfUEJSNjsKKwlwY21wLT5wY21jX3BvcjYgPSBDRkdfUENNQ0lBX1BPUjYKKyNpZiAoQ0ZHX1BDTUNJQV9QT1I2ICE9IDApCisJCQl8IHRpbWluZ3MKKyNlbmRpZgorCQkJOworCVBSSU5URiAoIlBCUjY6ICUwOHggIFBPUjY6ICUwOHhcbiIsIHBjbXAtPnBjbWNfcGJyNiwgcGNtcC0+cGNtY19wb3I2KTsKKworCXBjbXAtPnBjbWNfcGJyNyA9IENGR19QQ01DSUFfUEJSNzsKKwlwY21wLT5wY21jX3BvcjcgPSBDRkdfUENNQ0lBX1BPUjcKKyNpZiAoQ0ZHX1BDTUNJQV9QT1I3ICE9IDApCisJCQl8IHRpbWluZ3MKKyNlbmRpZgorCQkJOworCVBSSU5URiAoIlBCUjc6ICUwOHggIFBPUjc6ICUwOHhcbiIsIHBjbXAtPnBjbWNfcGJyNywgcGNtcC0+cGNtY19wb3I3KTsKKworfQorCisjZW5kaWYJLyogQ09ORklHX0lERV84eHhfRElSRUNUICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXworb3V0YihpbnQgZGV2LCBpbnQgcG9ydCwgdW5zaWduZWQgY2hhciB2YWwpCit7CisJLyogRW5zdXJlIEkvTyBvcGVyYXRpb25zIGNvbXBsZXRlICovCisJX19hc21fXyB2b2xhdGlsZSgiZWllaW8iKTsKKwkqKCh1Y2hhciAqKShBVEFfQ1VSUl9CQVNFKGRldikrcG9ydCkpID0gdmFsOworI2lmIDAKKwlwcmludGYgKCJPVVRCOiAweCUwOGx4IDw9PSAweCUwMnhcbiIsIEFUQV9DVVJSX0JBU0UoZGV2KStwb3J0LCB2YWwpOworI2VuZGlmCit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIF9faW5saW5lX18KK2luYihpbnQgZGV2LCBpbnQgcG9ydCkKK3sKKwl1Y2hhciB2YWw7CisJLyogRW5zdXJlIEkvTyBvcGVyYXRpb25zIGNvbXBsZXRlICovCisJX19hc21fXyB2b2xhdGlsZSgiZWllaW8iKTsKKwl2YWwgPSAqKCh1Y2hhciAqKShBVEFfQ1VSUl9CQVNFKGRldikrcG9ydCkpOworI2lmIDAKKwlwcmludGYgKCJJTkI6IDB4JTA4bHggPT0+IDB4JTAyeFxuIiwgQVRBX0NVUlJfQkFTRShkZXYpK3BvcnQsIHZhbCk7CisjZW5kaWYKKwlyZXR1cm4gKHZhbCk7Cit9CisKK19faW5saW5lX18gdW5zaWduZWQgbGRfbGUxNihjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqYWRkcikKK3sKKwl1bnNpZ25lZCB2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxoYnJ4ICUwLDAsJTEiIDogIj1yIih2YWwpIDogInIiKGFkZHIpLCAibSIoKmFkZHIpKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZAoraW5wdXRfc3dhcF9kYXRhKGludCBkZXYsIHVsb25nICpzZWN0X2J1ZiwgaW50IHdvcmRzKQoreworCXZvbGF0aWxlIHVzaG9ydAkqcGJ1ZiA9ICh1c2hvcnQgKikoQVRBX0NVUlJfQkFTRShkZXYpK0FUQV9EQVRBX1JFRyk7CisJdXNob3J0CSpkYnVmID0gKHVzaG9ydCAqKXNlY3RfYnVmOworCisJd2hpbGUgKHdvcmRzLS0pIHsKKwkJKmRidWYrKyA9IGxkX2xlMTYocGJ1Zik7CisJCSpkYnVmKysgPSBsZF9sZTE2KHBidWYpOworCX0KK30KKworc3RhdGljIHZvaWQKK291dHB1dF9kYXRhKGludCBkZXYsIHVsb25nICpzZWN0X2J1ZiwgaW50IHdvcmRzKQoreworCXVzaG9ydAkqZGJ1ZjsKKwl2b2xhdGlsZSB1c2hvcnQJKnBidWY7CisKKwlwYnVmID0gKHVzaG9ydCAqKShBVEFfQ1VSUl9CQVNFKGRldikrQVRBX0RBVEFfUkVHKTsKKwlkYnVmID0gKHVzaG9ydCAqKXNlY3RfYnVmOworCXdoaWxlICh3b3Jkcy0tKSB7CisJCV9fYXNtX18gdm9sYXRpbGUgKCJlaWVpbyIpOworCQkqcGJ1ZiA9ICpkYnVmKys7CisJCV9fYXNtX18gdm9sYXRpbGUgKCJlaWVpbyIpOworCQkqcGJ1ZiA9ICpkYnVmKys7CisJfQorfQorCitzdGF0aWMgdm9pZAoraW5wdXRfZGF0YShpbnQgZGV2LCB1bG9uZyAqc2VjdF9idWYsIGludCB3b3JkcykKK3sKKwl1c2hvcnQJKmRidWY7CisJdm9sYXRpbGUgdXNob3J0CSpwYnVmOworCisJcGJ1ZiA9ICh1c2hvcnQgKikoQVRBX0NVUlJfQkFTRShkZXYpK0FUQV9EQVRBX1JFRyk7CisJZGJ1ZiA9ICh1c2hvcnQgKilzZWN0X2J1ZjsKKwl3aGlsZSAod29yZHMtLSkgeworCQlfX2FzbV9fIHZvbGF0aWxlICgiZWllaW8iKTsKKwkJKmRidWYrKyA9ICpwYnVmOworCQlfX2FzbV9fIHZvbGF0aWxlICgiZWllaW8iKTsKKwkJKmRidWYrKyA9ICpwYnVmOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCBpZGVfaWRlbnQgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKQoreworCXVsb25nIGlvYnVmW0FUQV9TRUNUT1JXT1JEU107CisJdW5zaWduZWQgY2hhciBjOworCWhkX2RyaXZlaWRfdCAqaW9wID0gKGhkX2RyaXZlaWRfdCAqKWlvYnVmOworCisjaWYgMAorCWludCBtb2RlLCBjeWNsZV90aW1lOworI2VuZGlmCisJaW50IGRldmljZTsKKwlkZXZpY2U9ZGV2X2Rlc2MtPmRldjsKKwlwcmludGYgKCIgIERldmljZSAlZDogIiwgZGV2aWNlKTsKKworCWlkZV9sZWQgKERFVklDRV9MRUQoZGV2aWNlKSwgMSk7CS8qIExFRCBvbgkqLworCS8qIFNlbGVjdCBkZXZpY2UKKwkgKi8KKwlvdXRiIChkZXZpY2UsIEFUQV9ERVZfSEQsIEFUQV9MQkEgfCBBVEFfREVWSUNFKGRldmljZSkpOworCWRldl9kZXNjLT5pZl90eXBlPUlGX1RZUEVfSURFOworI2lmZGVmIENPTkZJR19BVEFQSQorCS8qIGNoZWNrIHNpZ25hdHVyZSAqLworCWlmICgoaW5iKGRldmljZSxBVEFfU0VDVF9DTlQpPT0weDAxKSAmJgorCQkgKGluYihkZXZpY2UsQVRBX1NFQ1RfTlVNKT09MHgwMSkgJiYKKwkJIChpbmIoZGV2aWNlLEFUQV9DWUxfTE9XKT09MHgxNCkgJiYKKwkJIChpbmIoZGV2aWNlLEFUQV9DWUxfSElHSCk9PTB4RUIpKSB7CisJCS8qIEFUQVBJIFNpZ25hdHVyZSBmb3VuZCAqLworCQlkZXZfZGVzYy0+aWZfdHlwZT1JRl9UWVBFX0FUQVBJOworCQkvKiBTdGFydCBJZGVudCBDb21tYW5kCisJCSAqLworCQlvdXRiIChkZXZpY2UsIEFUQV9DT01NQU5ELCBBVEFQSV9DTURfSURFTlQpOworCQkvKgorCQkgKiBXYWl0IGZvciBjb21wbGV0aW9uIC0gQVRBUEkgZGV2aWNlcyBuZWVkIG1vcmUgdGltZQorCQkgKiB0byBiZWNvbWUgcmVhZHkKKwkJICovCisJCWMgPSBpZGVfd2FpdCAoZGV2aWNlLCBBVEFQSV9USU1FX09VVCk7CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKwkJLyogU3RhcnQgSWRlbnQgQ29tbWFuZAorCQkgKi8KKwkJb3V0YiAoZGV2aWNlLCBBVEFfQ09NTUFORCwgQVRBX0NNRF9JREVOVCk7CisKKwkJLyogV2FpdCBmb3IgY29tcGxldGlvbgorCQkgKi8KKwkJYyA9IGlkZV93YWl0IChkZXZpY2UsIElERV9USU1FX09VVCk7CisJfQorCWlkZV9sZWQgKERFVklDRV9MRUQoZGV2aWNlKSwgMCk7CS8qIExFRCBvZmYJKi8KKworCWlmICgoKGMgJiBBVEFfU1RBVF9EUlEpID09IDApIHx8CisJICAgICgoYyAmIChBVEFfU1RBVF9GQVVMVHxBVEFfU1RBVF9FUlIpKSAhPSAwKSApIHsKKwkJZGV2X2Rlc2MtPnR5cGU9REVWX1RZUEVfVU5LTk9XTjsKKwkJcmV0dXJuOworCX0KKworCWlucHV0X3N3YXBfZGF0YSAoZGV2aWNlLCBpb2J1ZiwgQVRBX1NFQ1RPUldPUkRTKTsKKworCWlkZW50X2NweSAoZGV2X2Rlc2MtPnJldmlzaW9uLCBpb3AtPmZ3X3Jldiwgc2l6ZW9mKGRldl9kZXNjLT5yZXZpc2lvbikpOworCWlkZW50X2NweSAoZGV2X2Rlc2MtPnZlbmRvciwgaW9wLT5tb2RlbCwgc2l6ZW9mKGRldl9kZXNjLT52ZW5kb3IpKTsKKwlpZGVudF9jcHkgKGRldl9kZXNjLT5wcm9kdWN0LCBpb3AtPnNlcmlhbF9ubywgc2l6ZW9mKGRldl9kZXNjLT5wcm9kdWN0KSk7CisKKwlpZiAoKGlvcC0+Y29uZmlnICYgMHgwMDgwKT09MHgwMDgwKQorCQlkZXZfZGVzYy0+cmVtb3ZhYmxlID0gMTsKKwllbHNlCisJCWRldl9kZXNjLT5yZW1vdmFibGUgPSAwOworCisjaWYgMAorCS8qCisJICogRHJpdmUgUElPIG1vZGUgYXV0b3NlbGVjdGlvbgorCSAqLworCW1vZGUgPSBpb3AtPnRQSU87CisKKwlwcmludGYgKCJ0UElPID0gMHglMDJ4ID0gJWRcbiIsbW9kZSwgbW9kZSk7CisJaWYgKG1vZGUgPiAyKSB7CQkvKiAyIGlzIG1heGltdW0gYWxsb3dlZCB0UElPIHZhbHVlICovCisJCW1vZGUgPSAyOworCQlQUklOVEYgKCJPdmVycmlkZSB0UElPIC0+IDJcbiIpOworCX0KKwlpZiAoaW9wLT5maWVsZF92YWxpZCAmIDIpIHsJLyogZHJpdmUgaW1wbGVtZW50cyBBVEEyPyAqLworCQlQUklOVEYgKCJEcml2ZSBpbXBsZW1lbnRzIEFUQTJcbiIpOworCQlpZiAoaW9wLT5jYXBhYmlsaXR5ICYgOCkgewkvKiBkcml2ZSBzdXBwb3J0cyB1c2VfaW9yZHk/ICovCisJCQljeWNsZV90aW1lID0gaW9wLT5laWRlX3Bpb19pb3JkeTsKKwkJfSBlbHNlIHsKKwkJCWN5Y2xlX3RpbWUgPSBpb3AtPmVpZGVfcGlvOworCQl9CisJCVBSSU5URiAoImN5Y2xlIHRpbWUgPSAlZFxuIiwgY3ljbGVfdGltZSk7CisJCW1vZGUgPSA0OworCQlpZiAoY3ljbGVfdGltZSA+IDEyMCkgbW9kZSA9IDM7CS8qIDEyMCBucyBmb3IgUElPIG1vZGUgNCAqLworCQlpZiAoY3ljbGVfdGltZSA+IDE4MCkgbW9kZSA9IDI7CS8qIDE4MCBucyBmb3IgUElPIG1vZGUgMyAqLworCQlpZiAoY3ljbGVfdGltZSA+IDI0MCkgbW9kZSA9IDE7CS8qIDI0MCBucyBmb3IgUElPIG1vZGUgNCAqLworCQlpZiAoY3ljbGVfdGltZSA+IDM4MykgbW9kZSA9IDA7CS8qIDM4MyBucyBmb3IgUElPIG1vZGUgNCAqLworCX0KKwlwcmludGYgKCJQSU8gbW9kZSB0byB1c2U6IFBJTyAlZFxuIiwgbW9kZSk7CisjZW5kaWYgLyogMCAqLworCisjaWZkZWYgQ09ORklHX0FUQVBJCisJaWYgKGRldl9kZXNjLT5pZl90eXBlPT1JRl9UWVBFX0FUQVBJKSB7CisJCWF0YXBpX2lucXVpcnkoZGV2X2Rlc2MpOworCQlyZXR1cm47CisJfQorI2VuZGlmIC8qIENPTkZJR19BVEFQSSAqLworCisJLyogc3dhcCBzaG9ydHMgKi8KKwlkZXZfZGVzYy0+bGJhID0gKGlvcC0+bGJhX2NhcGFjaXR5IDw8IDE2KSB8IChpb3AtPmxiYV9jYXBhY2l0eSA+PiAxNik7CisJLyogYXNzdW1pbmcgSEQgKi8KKwlkZXZfZGVzYy0+dHlwZT1ERVZfVFlQRV9IQVJERElTSzsKKwlkZXZfZGVzYy0+Ymxrc3o9QVRBX0JMT0NLU0laRTsKKwlkZXZfZGVzYy0+bHVuPTA7IC8qIGp1c3QgdG8gZmlsbCBzb21ldGhpbmcgaW4uLi4gKi8KKworI2lmIDAgCS8qIG9ubHkgdXNlZCB0byB0ZXN0IHRoZSBwb3dlcnNhdmluZyBtb2RlLAorCSAqIGlmIGVuYWJsZWQsIHRoZSBkcml2ZSBnb2VzIGFmdGVyIDUgc2VjCisJICogaW4gc3RhbmRieSBtb2RlICovCisJb3V0YiAoZGV2aWNlLCBBVEFfREVWX0hELCBBVEFfTEJBIHwgQVRBX0RFVklDRShkZXZpY2UpKTsKKwljID0gaWRlX3dhaXQgKGRldmljZSwgSURFX1RJTUVfT1VUKTsKKwlvdXRiIChkZXZpY2UsIEFUQV9TRUNUX0NOVCwgMSk7CisJb3V0YiAoZGV2aWNlLCBBVEFfTEJBX0xPVywgIDApOworCW91dGIgKGRldmljZSwgQVRBX0xCQV9NSUQsICAwKTsKKwlvdXRiIChkZXZpY2UsIEFUQV9MQkFfSElHSCwgMCk7CisJb3V0YiAoZGV2aWNlLCBBVEFfREVWX0hELCAgIEFUQV9MQkEJCXwKKwkJCQkgICAgQVRBX0RFVklDRShkZXZpY2UpKTsKKwlvdXRiIChkZXZpY2UsIEFUQV9DT01NQU5ELCAgMHhlMyk7CisJdWRlbGF5ICg1MCk7CisJYyA9IGlkZV93YWl0IChkZXZpY2UsIElERV9USU1FX09VVCk7CS8qIGNhbid0IHRha2Ugb3ZlciA1MDAgbXMgKi8KKyNlbmRpZgorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordWxvbmcgaWRlX3JlYWQgKGludCBkZXZpY2UsIHVsb25nIGJsa25yLCB1bG9uZyBibGtjbnQsIHVsb25nICpidWZmZXIpCit7CisJdWxvbmcgbiA9IDA7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIGNoYXIgcHdyc2F2ZT0wOyAvKiBwb3dlciBzYXZlICovCisKKwlQUklOVEYgKCJpZGVfcmVhZCBkZXYgJWQgc3RhcnQgJWxYLCBibG9ja3MgJWxYIGJ1ZmZlciBhdCAlbFhcbiIsCisJCWRldmljZSwgYmxrbnIsIGJsa2NudCwgKHVsb25nKWJ1ZmZlcik7CisKKwlpZGVfbGVkIChERVZJQ0VfTEVEKGRldmljZSksIDEpOwkvKiBMRUQgb24JKi8KKworCS8qIFNlbGVjdCBkZXZpY2UKKwkgKi8KKwlvdXRiIChkZXZpY2UsIEFUQV9ERVZfSEQsIEFUQV9MQkEgfCBBVEFfREVWSUNFKGRldmljZSkpOworCWMgPSBpZGVfd2FpdCAoZGV2aWNlLCBJREVfVElNRV9PVVQpOworCisJaWYgKGMgJiBBVEFfU1RBVF9CVVNZKSB7CisJCXByaW50ZiAoIklERSByZWFkOiBkZXZpY2UgJWQgbm90IHJlYWR5XG4iLCBkZXZpY2UpOworCQlnb3RvIElERV9SRUFEX0U7CisJfQorCisJLyogZmlyc3QgY2hlY2sgaWYgdGhlIGRyaXZlIGlzIGluIFBvd2Vyc2F2aW5nIG1vZGUsIGlmIHllcywKKwkgKiBpbmNyZWFzZSB0aGUgdGltZW91dCB2YWx1ZSAqLworCW91dGIgKGRldmljZSwgQVRBX0NPTU1BTkQsICBBVEFfQ01EX0NIS19QV1IpOworCXVkZWxheSAoNTApOworCisJYyA9IGlkZV93YWl0IChkZXZpY2UsIElERV9USU1FX09VVCk7CS8qIGNhbid0IHRha2Ugb3ZlciA1MDAgbXMgKi8KKworCWlmIChjICYgQVRBX1NUQVRfQlVTWSkgeworCQlwcmludGYgKCJJREUgcmVhZDogZGV2aWNlICVkIG5vdCByZWFkeVxuIiwgZGV2aWNlKTsKKwkJZ290byBJREVfUkVBRF9FOworCX0KKwlpZiAoKGMgJiBBVEFfU1RBVF9FUlIpID09IEFUQV9TVEFUX0VSUikgeworCQlwcmludGYgKCJObyBQb3dlcnNhdmluZyBtb2RlICVYXG4iLCBjKTsKKwl9IGVsc2UgeworCQljID0gaW5iKGRldmljZSxBVEFfU0VDVF9DTlQpOworCQlQUklOVEYoIlBvd2Vyc2F2aW5nICUwMlhcbiIsYyk7CisJCWlmKGM9PTApCisJCQlwd3JzYXZlPTE7CisJfQorCisKKwl3aGlsZSAoYmxrY250LS0gPiAwKSB7CisKKwkJYyA9IGlkZV93YWl0IChkZXZpY2UsIElERV9USU1FX09VVCk7CisKKwkJaWYgKGMgJiBBVEFfU1RBVF9CVVNZKSB7CisJCQlwcmludGYgKCJJREUgcmVhZDogZGV2aWNlICVkIG5vdCByZWFkeVxuIiwgZGV2aWNlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJb3V0YiAoZGV2aWNlLCBBVEFfU0VDVF9DTlQsIDEpOworCQlvdXRiIChkZXZpY2UsIEFUQV9MQkFfTE9XLCAgKGJsa25yID4+ICAwKSAmIDB4RkYpOworCQlvdXRiIChkZXZpY2UsIEFUQV9MQkFfTUlELCAgKGJsa25yID4+ICA4KSAmIDB4RkYpOworCQlvdXRiIChkZXZpY2UsIEFUQV9MQkFfSElHSCwgKGJsa25yID4+IDE2KSAmIDB4RkYpOworCQlvdXRiIChkZXZpY2UsIEFUQV9ERVZfSEQsICAgQVRBX0xCQQkJfAorCQkJCQkgICAgQVRBX0RFVklDRShkZXZpY2UpCXwKKwkJCQkJICAgICgoYmxrbnIgPj4gMjQpICYgMHhGKSApOworCQlvdXRiIChkZXZpY2UsIEFUQV9DT01NQU5ELCAgQVRBX0NNRF9SRUFEKTsKKworCQl1ZGVsYXkgKDUwKTsKKworCQlpZihwd3JzYXZlKSB7CisJCQljID0gaWRlX3dhaXQgKGRldmljZSwgSURFX1NQSU5fVVBfVElNRV9PVVQpOwkvKiBtYXkgdGFrZSB1cCB0byA0IHNlYyAqLworCQkJcHdyc2F2ZT0wOworCQl9IGVsc2UgeworCQkJYyA9IGlkZV93YWl0IChkZXZpY2UsIElERV9USU1FX09VVCk7CS8qIGNhbid0IHRha2Ugb3ZlciA1MDAgbXMgKi8KKwkJfQorCisJCWlmICgoYyYoQVRBX1NUQVRfRFJRfEFUQV9TVEFUX0JVU1l8QVRBX1NUQVRfRVJSKSkgIT0gQVRBX1NUQVRfRFJRKSB7CisJCQlwcmludGYgKCJFcnJvciAobm8gSVJRKSBkZXYgJWQgYmxrICVsZDogc3RhdHVzIDB4JTAyeFxuIiwKKwkJCQlkZXZpY2UsIGJsa25yLCBjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaW5wdXRfZGF0YSAoZGV2aWNlLCBidWZmZXIsIEFUQV9TRUNUT1JXT1JEUyk7CisJCSh2b2lkKSBpbmIgKGRldmljZSwgQVRBX1NUQVRVUyk7CS8qIGNsZWFyIElSUSAqLworCisJCSsrbjsKKwkJKytibGtucjsKKwkJYnVmZmVyICs9IEFUQV9TRUNUT1JXT1JEUzsKKwl9CitJREVfUkVBRF9FOgorCWlkZV9sZWQgKERFVklDRV9MRUQoZGV2aWNlKSwgMCk7CS8qIExFRCBvZmYJKi8KKwlyZXR1cm4gKG4pOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwordWxvbmcgaWRlX3dyaXRlIChpbnQgZGV2aWNlLCB1bG9uZyBibGtuciwgdWxvbmcgYmxrY250LCB1bG9uZyAqYnVmZmVyKQoreworCXVsb25nIG4gPSAwOworCXVuc2lnbmVkIGNoYXIgYzsKKworCWlkZV9sZWQgKERFVklDRV9MRUQoZGV2aWNlKSwgMSk7CS8qIExFRCBvbgkqLworCisJLyogU2VsZWN0IGRldmljZQorCSAqLworCW91dGIgKGRldmljZSwgQVRBX0RFVl9IRCwgQVRBX0xCQSB8IEFUQV9ERVZJQ0UoZGV2aWNlKSk7CisKKwl3aGlsZSAoYmxrY250LS0gPiAwKSB7CisKKwkJYyA9IGlkZV93YWl0IChkZXZpY2UsIElERV9USU1FX09VVCk7CisKKwkJaWYgKGMgJiBBVEFfU1RBVF9CVVNZKSB7CisJCQlwcmludGYgKCJJREUgcmVhZDogZGV2aWNlICVkIG5vdCByZWFkeVxuIiwgZGV2aWNlKTsKKwkJCWdvdG8gV1JfT1VUOworCQl9CisKKwkJb3V0YiAoZGV2aWNlLCBBVEFfU0VDVF9DTlQsIDEpOworCQlvdXRiIChkZXZpY2UsIEFUQV9MQkFfTE9XLCAgKGJsa25yID4+ICAwKSAmIDB4RkYpOworCQlvdXRiIChkZXZpY2UsIEFUQV9MQkFfTUlELCAgKGJsa25yID4+ICA4KSAmIDB4RkYpOworCQlvdXRiIChkZXZpY2UsIEFUQV9MQkFfSElHSCwgKGJsa25yID4+IDE2KSAmIDB4RkYpOworCQlvdXRiIChkZXZpY2UsIEFUQV9ERVZfSEQsICAgQVRBX0xCQQkJfAorCQkJCQkgICAgQVRBX0RFVklDRShkZXZpY2UpCXwKKwkJCQkJICAgICgoYmxrbnIgPj4gMjQpICYgMHhGKSApOworCQlvdXRiIChkZXZpY2UsIEFUQV9DT01NQU5ELCAgQVRBX0NNRF9XUklURSk7CisKKwkJdWRlbGF5ICg1MCk7CisKKwkJYyA9IGlkZV93YWl0IChkZXZpY2UsIElERV9USU1FX09VVCk7CS8qIGNhbid0IHRha2Ugb3ZlciA1MDAgbXMgKi8KKworCQlpZiAoKGMmKEFUQV9TVEFUX0RSUXxBVEFfU1RBVF9CVVNZfEFUQV9TVEFUX0VSUikpICE9IEFUQV9TVEFUX0RSUSkgeworCQkJcHJpbnRmICgiRXJyb3IgKG5vIElSUSkgZGV2ICVkIGJsayAlbGQ6IHN0YXR1cyAweCUwMnhcbiIsCisJCQkJZGV2aWNlLCBibGtuciwgYyk7CisJCQlnb3RvIFdSX09VVDsKKwkJfQorCisJCW91dHB1dF9kYXRhIChkZXZpY2UsIGJ1ZmZlciwgQVRBX1NFQ1RPUldPUkRTKTsKKwkJYyA9IGluYiAoZGV2aWNlLCBBVEFfU1RBVFVTKTsJLyogY2xlYXIgSVJRICovCisJCSsrbjsKKwkJKytibGtucjsKKwkJYnVmZmVyICs9IEFUQV9TRUNUT1JXT1JEUzsKKwl9CitXUl9PVVQ6CisJaWRlX2xlZCAoREVWSUNFX0xFRChkZXZpY2UpLCAwKTsJLyogTEVEIG9mZgkqLworCXJldHVybiAobik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGNvcHkgc3JjIHRvIGRlc3QsIHNraXBwaW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGJsYW5rcyBhbmQgbnVsbAorICogdGVybWluYXRlIHRoZSBzdHJpbmcKKyAqLworc3RhdGljIHZvaWQgaWRlbnRfY3B5ICh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IHN0YXJ0LGVuZDsKKworCXN0YXJ0PTA7CisJd2hpbGUgKHN0YXJ0PGxlbikgeworCQlpZiAoc3JjW3N0YXJ0XSE9JyAnKQorCQkJYnJlYWs7CisJCXN0YXJ0Kys7CisJfQorCWVuZD1sZW4tMTsKKwl3aGlsZSAoZW5kPnN0YXJ0KSB7CisJCWlmIChzcmNbZW5kXSE9JyAnKQorCQkJYnJlYWs7CisJCWVuZC0tOworCX0KKwlmb3IgKCA7IHN0YXJ0PD1lbmQ7IHN0YXJ0KyspIHsKKwkJKmRlc3QrKz1zcmNbc3RhcnRdOworCX0KKwkqZGVzdD0nXDAnOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBXYWl0IHVudGlsIEJ1c3kgYml0IGlzIG9mZiwgb3IgdGltZW91dCAoaW4gbXMpCisgKiBSZXR1cm4gbGFzdCBzdGF0dXMKKyAqLworc3RhdGljIHVjaGFyIGlkZV93YWl0IChpbnQgZGV2LCB1bG9uZyB0KQoreworCXVsb25nIGRlbGF5ID0gMTAgKiB0OwkJLyogcG9sbCBldmVyeSAxMDAgdXMgKi8KKwl1Y2hhciBjOworCisJd2hpbGUgKChjID0gaW5iKGRldiwgQVRBX1NUQVRVUykpICYgQVRBX1NUQVRfQlVTWSkgeworCQl1ZGVsYXkgKDEwMCk7CisJCWlmIChkZWxheS0tID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAoYyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19JREVfUkVTRVQKK2V4dGVybiB2b2lkIGlkZV9zZXRfcmVzZXQoaW50IGlkZXJlc2V0KTsKKworc3RhdGljIHZvaWQgaWRlX3Jlc2V0ICh2b2lkKQoreworI2lmIGRlZmluZWQoQ0ZHX1BCXzEyVl9FTkFCTEUpIHx8IGRlZmluZWQoQ0ZHX1BCX0lERV9NT1RPUikKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKyNlbmRpZgorCWludCBpOworCisJY3Vycl9kZXZpY2UgPSAtMTsKKwlmb3IgKGk9MDsgaTxDRkdfSURFX01BWEJVUzsgKytpKQorCQlpZGVfYnVzX29rW2ldID0gMDsKKwlmb3IgKGk9MDsgaTxDRkdfSURFX01BWERFVklDRTsgKytpKQorCQlpZGVfZGV2X2Rlc2NbaV0udHlwZSA9IERFVl9UWVBFX1VOS05PV047CisKKwlpZGVfc2V0X3Jlc2V0ICgxKTsgLyogYXNzZXJ0IHJlc2V0ICovCisKKwlXQVRDSERPR19SRVNFVCgpOworCisjaWZkZWYgQ0ZHX1BCXzEyVl9FTkFCTEUKKwlpbW1yLT5pbV9jcG0uY3BfcGJkYXQgJj0gfihDRkdfUEJfMTJWX0VOQUJMRSk7CS8qIDEyViBFbmFibGUgb3V0cHV0IE9GRiAqLworCWltbXItPmltX2NwbS5jcF9wYnBhciAmPSB+KENGR19QQl8xMlZfRU5BQkxFKTsKKwlpbW1yLT5pbV9jcG0uY3BfcGJvZHIgJj0gfihDRkdfUEJfMTJWX0VOQUJMRSk7CisJaW1tci0+aW1fY3BtLmNwX3BiZGlyIHw9ICAgQ0ZHX1BCXzEyVl9FTkFCTEU7CisKKwkvKiB3YWl0IDUwMCBtcyBmb3IgdGhlIHZvbHRhZ2UgdG8gc3RhYmlsaXplCisJICovCisJZm9yIChpPTA7IGk8NTAwOyArK2kpIHsKKwkJdWRlbGF5ICgxMDAwKTsKKwl9CisKKwlpbW1yLT5pbV9jcG0uY3BfcGJkYXQgfD0gICBDRkdfUEJfMTJWX0VOQUJMRTsJLyogMTJWIEVuYWJsZSBvdXRwdXQgT04gKi8KKyNlbmRpZgkvKiBDRkdfUEJfMTJWX0VOQUJMRSAqLworCisjaWZkZWYgQ0ZHX1BCX0lERV9NT1RPUgorCS8qIGNvbmZpZ3VyZSBJREUgTW90b3Igdm9sdGFnZSBtb25pdG9yIHBpbiBhcyBpbnB1dCAqLworCWltbXItPmltX2NwbS5jcF9wYnBhciAmPSB+KENGR19QQl9JREVfTU9UT1IpOworCWltbXItPmltX2NwbS5jcF9wYm9kciAmPSB+KENGR19QQl9JREVfTU9UT1IpOworCWltbXItPmltX2NwbS5jcF9wYmRpciAmPSB+KENGR19QQl9JREVfTU9UT1IpOworCisJLyogd2FpdCB1cCB0byAxIHMgZm9yIHRoZSBtb3RvciB2b2x0YWdlIHRvIHN0YWJpbGl6ZQorCSAqLworCWZvciAoaT0wOyBpPDEwMDA7ICsraSkgeworCQlpZiAoKGltbXItPmltX2NwbS5jcF9wYmRhdCAmIENGR19QQl9JREVfTU9UT1IpICE9IDApIHsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSAoMTAwMCk7CisJfQorCisJaWYgKGkgPT0gMTAwMCkgewkvKiBUaW1lb3V0ICovCisJCXByaW50ZiAoIlxuV2FybmluZzogNVYgZm9yIElERSBNb3RvciBtaXNzaW5nXG4iKTsKKyMgaWZkZWYgQ09ORklHX1NUQVRVU19MRUQKKyMgIGlmZGVmIFNUQVRVU19MRURfWUVMTE9XCisJCXN0YXR1c19sZWRfc2V0ICAoU1RBVFVTX0xFRF9ZRUxMT1csIFNUQVRVU19MRURfT04gKTsKKyMgIGVuZGlmCisjICBpZmRlZiBTVEFUVVNfTEVEX0dSRUVOCisJCXN0YXR1c19sZWRfc2V0ICAoU1RBVFVTX0xFRF9HUkVFTiwgIFNUQVRVU19MRURfT0ZGKTsKKyMgIGVuZGlmCisjIGVuZGlmCS8qIENPTkZJR19TVEFUVVNfTEVEICovCisJfQorI2VuZGlmCS8qIENGR19QQl9JREVfTU9UT1IgKi8KKworCVdBVENIRE9HX1JFU0VUKCk7CisKKwkvKiBkZS1hc3NlcnQgUkVTRVQgc2lnbmFsICovCisJaWRlX3NldF9yZXNldCgwKTsKKworCS8qIHdhaXQgMjUwIG1zICovCisJZm9yIChpPTA7IGk8MjUwOyArK2kpIHsKKwkJdWRlbGF5ICgxMDAwKTsKKwl9Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfSURFX1JFU0VUICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19JREVfTEVECisKK3N0YXRpYwl1Y2hhcglsZWRfYnVmZmVyID0gMDsJCS8qIEJ1ZmZlciBmb3IgY3VycmVudCBMRUQgc3RhdHVzCSovCisKK3N0YXRpYyB2b2lkIGlkZV9sZWQgKHVjaGFyIGxlZCwgdWNoYXIgc3RhdHVzKQoreworCXVjaGFyICpsZWRfcG9ydCA9IExFRF9QT1JUOworCisJaWYgKHN0YXR1cykJewkJLyogc3dpdGNoIExFRCBvbgkqLworCQlsZWRfYnVmZmVyIHw9ICBsZWQ7CisJfSBlbHNlIHsJCQkvKiBzd2l0Y2ggTEVEIG9mZgkqLworCQlsZWRfYnVmZmVyICY9IH5sZWQ7CisJfQorCisJKmxlZF9wb3J0ID0gbGVkX2J1ZmZlcjsKK30KKworI2VuZGlmCS8qIENPTkZJR19JREVfTEVEICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19BVEFQSQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFUQVBJIFN1cHBvcnQKKyAqLworCisKKworI3VuZGVmCUFUQVBJX0RFQlVHCisKKyNpZmRlZglBVEFQSV9ERUJVRworI2RlZmluZQlBVF9QUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBBVF9QUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworLyogc2luY2UgQVRBUEkgbWF5IHVzZSBjb21tYW5kcyB3aXRoIG5vdCA0IGJ5dGVzIGFsbGlnbmVkIGxlbmd0aAorICogd2UgaGF2ZSBvdXIgb3duIHRyYW5zZmVyIGZ1bmN0aW9ucywgMiBieXRlcyBhbGxpZ25lZCAqLworc3RhdGljIHZvaWQKK291dHB1dF9kYXRhX3Nob3J0cyhpbnQgZGV2LCB1c2hvcnQgKnNlY3RfYnVmLCBpbnQgc2hvcnRzKQoreworCXVzaG9ydAkqZGJ1ZjsKKwl2b2xhdGlsZSB1c2hvcnQJKnBidWY7CisKKwlwYnVmID0gKHVzaG9ydCAqKShBVEFfQ1VSUl9CQVNFKGRldikrQVRBX0RBVEFfUkVHKTsKKwlkYnVmID0gKHVzaG9ydCAqKXNlY3RfYnVmOworCXdoaWxlIChzaG9ydHMtLSkgeworCQlfX2FzbV9fIHZvbGF0aWxlICgiZWllaW8iKTsKKwkJKnBidWYgPSAqZGJ1ZisrOworCX0KK30KKworc3RhdGljIHZvaWQKK2lucHV0X2RhdGFfc2hvcnRzKGludCBkZXYsIHVzaG9ydCAqc2VjdF9idWYsIGludCBzaG9ydHMpCit7CisJdXNob3J0CSpkYnVmOworCXZvbGF0aWxlIHVzaG9ydAkqcGJ1ZjsKKworCXBidWYgPSAodXNob3J0ICopKEFUQV9DVVJSX0JBU0UoZGV2KStBVEFfREFUQV9SRUcpOworCWRidWYgPSAodXNob3J0ICopc2VjdF9idWY7CisJd2hpbGUgKHNob3J0cy0tKSB7CisJCV9fYXNtX18gdm9sYXRpbGUgKCJlaWVpbyIpOworCQkqZGJ1ZisrID0gKnBidWY7CisJfQorfQorCisvKgorICogV2FpdCB1bnRpbCAoU3RhdHVzICYgbWFzaykgPT0gcmVzLCBvciB0aW1lb3V0IChpbiBtcykKKyAqIFJldHVybiBsYXN0IHN0YXR1cworICogVGhpcyBpcyB1c2VkIHNpbmNlIHNvbWUgQVRBUEkgQ0QgUk9NcyBjbGVhcnMgdGhlaXIgQnVzeSBCaXQgZmlyc3QKKyAqIGFuZCB0aGVuIHRoZXkgc2V0IHRoZWlyIERSUSBCaXQKKyAqLworc3RhdGljIHVjaGFyIGF0YXBpX3dhaXRfbWFzayAoaW50IGRldiwgdWxvbmcgdCx1Y2hhciBtYXNrLCB1Y2hhciByZXMpCit7CisJdWxvbmcgZGVsYXkgPSAxMCAqIHQ7CQkvKiBwb2xsIGV2ZXJ5IDEwMCB1cyAqLworCXVjaGFyIGM7CisKKwljID0gaW5iKGRldixBVEFfREVWX0NUTCk7IC8qIHByZXZlbnRzIHRvIHJlYWQgdGhlIHN0YXR1cyBiZWZvcmUgdmFsaWQgKi8KKwl3aGlsZSAoKChjID0gaW5iKGRldiwgQVRBX1NUQVRVUykpICYgbWFzaykKKwkJCSE9IHJlcykgeworCQkvKiBicmVhayBpZiBlcnJvciBvY2N1cnMgKGRvZXNuJ3QgbWFrZSBzZW5zZSB0byB3YWl0IG1vcmUpICovCisJCWlmKChjICYgQVRBX1NUQVRfRVJSKT09QVRBX1NUQVRfRVJSKQorCQkJYnJlYWs7CisJCXVkZWxheSAoMTAwKTsKKwkJaWYgKGRlbGF5LS0gPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChjKTsKK30KKworLyoKKyAqIGlzc3VlIGFuIGF0YXBpIGNvbW1hbmQKKyAqLwordW5zaWduZWQgY2hhciBhdGFwaV9pc3N1ZShpbnQgZGV2aWNlLHVuc2lnbmVkIGNoYXIqIGNjYixpbnQgY2NibGVuLCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLGludCBidWZsZW4pCit7CisJdW5zaWduZWQgY2hhciBjLGVycixtYXNrLHJlczsKKwlpbnQgbjsKKwlpZGVfbGVkIChERVZJQ0VfTEVEKGRldmljZSksIDEpOwkvKiBMRUQgb24JKi8KKworCS8qIFNlbGVjdCBkZXZpY2UKKwkgKi8KKwltYXNrID0gQVRBX1NUQVRfQlVTWXxBVEFfU1RBVF9EUlE7CisJcmVzID0gMDsKKwlvdXRiIChkZXZpY2UsIEFUQV9ERVZfSEQsIEFUQV9MQkEgfCBBVEFfREVWSUNFKGRldmljZSkpOworCWMgPSBhdGFwaV93YWl0X21hc2soZGV2aWNlLEFUQVBJX1RJTUVfT1VULG1hc2sscmVzKTsKKwlpZiAoKGMgJiBtYXNrKSAhPSByZXMpIHsKKwkJcHJpbnRmICgiQVRBUElfSVNTVUU6IGRldmljZSAlZCBub3QgcmVhZHkgc3RhdHVzICVYXG4iLCBkZXZpY2UsYyk7CisJCWVycj0weEZGOworCQlnb3RvIEFJX09VVDsKKwl9CisJLyogd3JpdGUgdGFza2ZpbGUgKi8KKwlvdXRiIChkZXZpY2UsIEFUQV9FUlJPUl9SRUcsIDApOyAvKiBubyBETUEsIG5vIG92ZXJsYXBlZCAqLworCW91dGIgKGRldmljZSwgQVRBX0NZTF9MT1csICAodW5zaWduZWQgY2hhcikoYnVmbGVuICYgMHhGRikpOworCW91dGIgKGRldmljZSwgQVRBX0NZTF9ISUdILCAodW5zaWduZWQgY2hhcikoKGJ1Zmxlbjw8OCkgJiAweEZGKSk7CisJb3V0YiAoZGV2aWNlLCBBVEFfREVWX0hELCAgIEFUQV9MQkEgfCBBVEFfREVWSUNFKGRldmljZSkpOworCisJb3V0YiAoZGV2aWNlLCBBVEFfQ09NTUFORCwgIEFUQVBJX0NNRF9QQUNLRVQpOworCXVkZWxheSAoNTApOworCisJbWFzayA9IEFUQV9TVEFUX0RSUXxBVEFfU1RBVF9CVVNZfEFUQV9TVEFUX0VSUjsKKwlyZXMgPSBBVEFfU1RBVF9EUlE7CisJYyA9IGF0YXBpX3dhaXRfbWFzayhkZXZpY2UsQVRBUElfVElNRV9PVVQsbWFzayxyZXMpOworCisJaWYgKChjICYgbWFzaykgIT0gcmVzKSB7IC8qIERSUSBtdXN0IGJlIDEsIEJTWSAwICovCisJCXByaW50ZiAoIkFUVEFQSV9JU1NVRTogRXJyb3IgKG5vIElSUSkgYmVmb3JlIHNlbmRpbmcgY2NiIGRldiAlZCBzdGF0dXMgMHglMDJ4XG4iLGRldmljZSxjKTsKKwkJZXJyPTB4RkY7CisJCWdvdG8gQUlfT1VUOworCX0KKworCW91dHB1dF9kYXRhX3Nob3J0cyAoZGV2aWNlLCAodW5zaWduZWQgc2hvcnQgKiljY2IsY2NibGVuLzIpOyAvKiB3cml0ZSBjb21tYW5kIGJsb2NrICovCisgCS8qIEFUQVBJIENvbW1hbmQgd3JpdHRlbiB3YWl0IGZvciBjb21wbGV0aXRpb24gKi8KKwl1ZGVsYXkgKDUwMDApOyAvKiBkZXZpY2UgbXVzdCBzZXQgYnN5ICovCisKKwltYXNrID0gQVRBX1NUQVRfRFJRfEFUQV9TVEFUX0JVU1l8QVRBX1NUQVRfRVJSOworCS8qIGlmIG5vIGRhdGEgd2FpdCBmb3IgRFJRID0gMCBCU1kgPSAwCisJICogaWYgZGF0YSB3YWl0IGZvciBEUlEgPSAxIEJTWSA9IDAgKi8KKwlyZXM9MDsKKwlpZihidWZsZW4pCisJCXJlcyA9IEFUQV9TVEFUX0RSUTsKKwljID0gYXRhcGlfd2FpdF9tYXNrKGRldmljZSxBVEFQSV9USU1FX09VVCxtYXNrLHJlcyk7CisJaWYgKChjICYgbWFzaykgIT0gcmVzICkgeworCQlpZiAoYyAmIEFUQV9TVEFUX0VSUikgeworCQkJZXJyPShpbmIoZGV2aWNlLEFUQV9FUlJPUl9SRUcpKT4+NDsKKwkJCUFUX1BSSU5URigiYXRhcGlfaXNzdWUgMSByZXR1cm5lZCBzZW5zZSBrZXkgJVggc3RhdHVzICUwMlhcbiIsZXJyLGMpOworCQl9IGVsc2UgeworCQkJcHJpbnRmICgiQVRUQVBJX0lTU1VFOiAobm8gRFJRKSBhZnRlciBzZW5kaW5nIGNjYiAoJXgpICBzdGF0dXMgMHglMDJ4XG4iLCBjY2JbMF0sYyk7CisJCQllcnI9MHhGRjsKKwkJfQorCQlnb3RvIEFJX09VVDsKKwl9CisJbj1pbmIoZGV2aWNlLCBBVEFfQ1lMX0hJR0gpOworCW48PD04OworCW4rPWluYihkZXZpY2UsIEFUQV9DWUxfTE9XKTsKKwlpZihuPmJ1ZmxlbikgeworCQlwcmludGYoIkVSUk9SLCB0cmFuc2ZlciBieXRlcyAlZCByZXF1ZXN0ZWQgb25seSAlZFxuIixuLGJ1Zmxlbik7CisJCWVycj0weGZmOworCQlnb3RvIEFJX09VVDsKKwl9CisJaWYoKG49PTApJiYoYnVmbGVuPDApKSB7CisJCXByaW50ZigiRVJST1IsIHRyYW5zZmVyIGJ5dGVzICVkIHJlcXVlc3RlZCAlZFxuIixuLGJ1Zmxlbik7CisJCWVycj0weGZmOworCQlnb3RvIEFJX09VVDsKKwl9CisJaWYobiE9YnVmbGVuKSB7CisJCUFUX1BSSU5URigiV0FSTklORywgdHJhbnNmZXIgYnl0ZXMgJWQgbm90IGVxdWFsIHdpdGggcmVxdWVzdGVkICVkXG4iLG4sYnVmbGVuKTsKKwl9CisJaWYobiE9MCkgeyAvKiBkYXRhIHRyYW5zZmVyICovCisJCUFUX1BSSU5URigiQVRBUElfSVNTVUU6ICVkIEJ5dGVzIHRvIHRyYW5zZmVyXG4iLG4pOworCQkgLyogd2UgdHJhbnNmZXIgc2hvcnRzICovCisJCW4+Pj0xOworCQkvKiBvayBub3cgZGVjaWRlIGlmIGl0IGlzIGFuIGluIG9yIG91dHB1dCAqLworCQlpZiAoKGluYihkZXZpY2UsIEFUQV9TRUNUX0NOVCkmMHgwMik9PTApIHsKKwkJCUFUX1BSSU5URigiV3JpdGUgdG8gZGV2aWNlXG4iKTsKKwkJCW91dHB1dF9kYXRhX3Nob3J0cyhkZXZpY2UsKHVuc2lnbmVkIHNob3J0ICopYnVmZmVyLG4pOworCQl9IGVsc2UgeworCQkJQVRfUFJJTlRGKCJSZWFkIGZyb20gZGV2aWNlIEAgJXAgc2hvcnRzICVkXG4iLGJ1ZmZlcixuKTsKKwkJCWlucHV0X2RhdGFfc2hvcnRzKGRldmljZSwodW5zaWduZWQgc2hvcnQgKilidWZmZXIsbik7CisJCX0KKwl9CisJdWRlbGF5KDUwMDApOyAvKiBzZWVtcyB0aGF0IHNvbWUgQ0QgUk9NcyBuZWVkIHRoaXMuLi4gKi8KKwltYXNrID0gQVRBX1NUQVRfQlVTWXxBVEFfU1RBVF9FUlI7CisJcmVzPTA7CisJYyA9IGF0YXBpX3dhaXRfbWFzayhkZXZpY2UsQVRBUElfVElNRV9PVVQsbWFzayxyZXMpOworCWlmICgoYyAmIEFUQV9TVEFUX0VSUikgPT0gQVRBX1NUQVRfRVJSKSB7CisJCWVycj0oaW5iKGRldmljZSxBVEFfRVJST1JfUkVHKSA+PiA0KTsKKwkJQVRfUFJJTlRGKCJhdGFwaV9pc3N1ZSAyIHJldHVybmVkIHNlbnNlIGtleSAlWCBzdGF0dXMgJVhcbiIsZXJyLGMpOworCX0gZWxzZSB7CisJCWVyciA9IDA7CisJfQorQUlfT1VUOgorCWlkZV9sZWQgKERFVklDRV9MRUQoZGV2aWNlKSwgMCk7CS8qIExFRCBvZmYJKi8KKwlyZXR1cm4gKGVycik7Cit9CisKKy8qCisgKiBzZW5kaW5nIHRoZSBjb21tYW5kIHRvIGF0YXBpX2lzc3VlLiBJZiBhbiBzdGF0dXMgb3RoZXIgdGhhbiBnb29kCisgKiByZXR1cm5zLCBhbiByZXF1ZXN0X3NlbnNlIHdpbGwgYmUgaXNzdWVkCisgKi8KKworI2RlZmluZSBBVEFQSV9EUklWRV9OT1RfUkVBRFkgCTEwMAorI2RlZmluZSBBVEFQSV9VTklUX0FUVE4JCTEwCisKK3Vuc2lnbmVkIGNoYXIgYXRhcGlfaXNzdWVfYXV0b3JlcSAoaW50IGRldmljZSwKKwkJCQkgICB1bnNpZ25lZCBjaGFyKiBjY2IsCisJCQkJICAgaW50IGNjYmxlbiwKKwkJCQkgICB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJCQkJICAgaW50IGJ1ZmxlbikKK3sKKwl1bnNpZ25lZCBjaGFyIHNlbnNlX2RhdGFbMThdLHNlbnNlX2NjYlsxMl07CisJdW5zaWduZWQgY2hhciByZXMsa2V5LGFzYyxhc2NxOworCWludCBub3RyZWFkeSx1bml0YXR0bjsKKworCXVuaXRhdHRuPUFUQVBJX1VOSVRfQVRUTjsKKwlub3RyZWFkeT1BVEFQSV9EUklWRV9OT1RfUkVBRFk7CisKK3JldHJ5OgorCXJlcz0gYXRhcGlfaXNzdWUoZGV2aWNlLGNjYixjY2JsZW4sYnVmZmVyLGJ1Zmxlbik7CisJaWYgKHJlcz09MCkKKwkJcmV0dXJuICgwKTsgLyogT2sgKi8KKworCWlmIChyZXM9PTB4RkYpCisJCXJldHVybiAoMHhGRik7IC8qIGVycm9yICovCisKKwlBVF9QUklOVEYoIihhdXRvX3JlcSlhdGFwaV9pc3N1ZSByZXR1cm5lZCBzZW5zZSBrZXkgJVhcbiIscmVzKTsKKworCW1lbXNldChzZW5zZV9jY2IsMCxzaXplb2Yoc2Vuc2VfY2NiKSk7CisJbWVtc2V0KHNlbnNlX2RhdGEsMCxzaXplb2Yoc2Vuc2VfZGF0YSkpOworCXNlbnNlX2NjYlswXT1BVEFQSV9DTURfUkVRX1NFTlNFOworCXNlbnNlX2NjYls0XT0xODsgLyogYWxsb2NhdGlvbiBMZWdudGggKi8KKworCXJlcz1hdGFwaV9pc3N1ZShkZXZpY2Usc2Vuc2VfY2NiLDEyLHNlbnNlX2RhdGEsMTgpOworCWtleT0oc2Vuc2VfZGF0YVsyXSYweEYpOworCWFzYz0oc2Vuc2VfZGF0YVsxMl0pOworCWFzY3E9KHNlbnNlX2RhdGFbMTNdKTsKKworCUFUX1BSSU5URigiQVRBUElfQ01EX1JFUV9TRU5TRSByZXR1cm5lZCAleFxuIixyZXMpOworCUFUX1BSSU5URigiIFNlbnNlIHBhZ2U6ICUwMlgga2V5ICUwMlggQVNDICUwMlggQVNDUSAlMDJYXG4iLAorCQlzZW5zZV9kYXRhWzBdLAorCQlrZXksCisJCWFzYywKKwkJYXNjcSk7CisKKwlpZigoa2V5PT0wKSkKKwkJcmV0dXJuIDA7IC8qIG9rIGRldmljZSByZWFkeSAqLworCisJaWYoKGtleT09Nil8fCAoYXNjPT0weDI5KSB8fCAoYXNjPT0weDI4KSkgeyAvKiBVbml0IEF0dGVudGlvbiAqLworCQlpZih1bml0YXR0bi0tPjApIHsKKwkJCXVkZWxheSgyMDAqMTAwMCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCXByaW50ZigiVW5pdCBBdHRlbnRpb24sIHRyaWVkICVkXG4iLEFUQVBJX1VOSVRfQVRUTik7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmKChhc2M9PTB4NCkgJiYgKGFzY3E9PTB4MSkpIHsgLyogbm90IHJlYWR5LCBidXQgd2lsbCBiZSByZWFkeSBzb29uICovCisJCWlmIChub3RyZWFkeS0tPjApIHsKKwkJCXVkZWxheSgyMDAqMTAwMCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCXByaW50ZigiRHJpdmUgbm90IHJlYWR5LCB0cmllZCAlZCB0aW1lc1xuIixBVEFQSV9EUklWRV9OT1RfUkVBRFkpOworCQlnb3RvIGVycm9yOworCX0KKwlpZihhc2M9PTB4M2EpIHsKKwkJQVRfUFJJTlRGKCJNZWRpYSBub3QgcHJlc2VudFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCXByaW50ZiAoIkVSUk9SOiBVbmtub3duIFNlbnNlIGtleSAlMDJYIEFTQyAlMDJYIEFTQ1EgJTAyWFxuIixrZXksYXNjLGFzY3EpOworZXJyb3I6CisJQVRfUFJJTlRGICgiRVJST1IgU2Vuc2Uga2V5ICUwMlggQVNDICUwMlggQVNDUSAlMDJYXG4iLGtleSxhc2MsYXNjcSk7CisJcmV0dXJuICgweEZGKTsKK30KKworCisKK3N0YXRpYyB2b2lkCWF0YXBpX2lucXVpcnkoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjKQoreworCXVuc2lnbmVkIGNoYXIgY2NiWzEyXTsgLyogQ29tbWFuZCBkZXNjcmlwdG9yIGJsb2NrICovCisJdW5zaWduZWQgY2hhciBpb2J1Zls2NF07IC8qIHRlbXAgYnVmICovCisJdW5zaWduZWQgY2hhciBjOworCWludCBkZXZpY2U7CisKKwlkZXZpY2U9ZGV2X2Rlc2MtPmRldjsKKwlkZXZfZGVzYy0+dHlwZT1ERVZfVFlQRV9VTktOT1dOOyAvKiBub3QgeWV0IHZhbGlkICovCisJZGV2X2Rlc2MtPmJsb2NrX3JlYWQ9YXRhcGlfcmVhZDsKKworCW1lbXNldChjY2IsMCxzaXplb2YoY2NiKSk7CisJbWVtc2V0KGlvYnVmLDAsc2l6ZW9mKGlvYnVmKSk7CisKKwljY2JbMF09QVRBUElfQ01EX0lOUVVJUlk7CisJY2NiWzRdPTQwOyAvKiBhbGxvY2F0aW9uIExlZ250aCAqLworCWM9YXRhcGlfaXNzdWVfYXV0b3JlcShkZXZpY2UsY2NiLDEyLCh1bnNpZ25lZCBjaGFyICopaW9idWYsNDApOworCisJQVRfUFJJTlRGKCJBVEFQSV9DTURfSU5RVUlSWSByZXR1cm5lZCAleFxuIixjKTsKKwlpZiAoYyE9MCkKKwkJcmV0dXJuOworCisJLyogY29weSBkZXZpY2UgaWRlbnQgc3RyaW5ncyAqLworCWlkZW50X2NweShkZXZfZGVzYy0+dmVuZG9yLCZpb2J1Zls4XSw4KTsKKwlpZGVudF9jcHkoZGV2X2Rlc2MtPnByb2R1Y3QsJmlvYnVmWzE2XSwxNik7CisJaWRlbnRfY3B5KGRldl9kZXNjLT5yZXZpc2lvbiwmaW9idWZbMzJdLDUpOworCisJZGV2X2Rlc2MtPmx1bj0wOworCWRldl9kZXNjLT5sYmE9MDsKKwlkZXZfZGVzYy0+Ymxrc3o9MDsKKwlkZXZfZGVzYy0+dHlwZT1pb2J1ZlswXSAmIDB4MWY7CisKKwlpZiAoKGlvYnVmWzFdJjB4ODApPT0weDgwKQorCQlkZXZfZGVzYy0+cmVtb3ZhYmxlID0gMTsKKwllbHNlCisJCWRldl9kZXNjLT5yZW1vdmFibGUgPSAwOworCisJbWVtc2V0KGNjYiwwLHNpemVvZihjY2IpKTsKKwltZW1zZXQoaW9idWYsMCxzaXplb2YoaW9idWYpKTsKKwljY2JbMF09QVRBUElfQ01EX1NUQVJUX1NUT1A7CisJY2NiWzRdPTB4MDM7IC8qIHN0YXJ0ICovCisKKwljPWF0YXBpX2lzc3VlX2F1dG9yZXEoZGV2aWNlLGNjYiwxMiwodW5zaWduZWQgY2hhciAqKWlvYnVmLDApOworCisJQVRfUFJJTlRGKCJBVEFQSV9DTURfU1RBUlRfU1RPUCByZXR1cm5lZCAleFxuIixjKTsKKwlpZiAoYyE9MCkKKwkJcmV0dXJuOworCisJbWVtc2V0KGNjYiwwLHNpemVvZihjY2IpKTsKKwltZW1zZXQoaW9idWYsMCxzaXplb2YoaW9idWYpKTsKKwljPWF0YXBpX2lzc3VlX2F1dG9yZXEoZGV2aWNlLGNjYiwxMiwodW5zaWduZWQgY2hhciAqKWlvYnVmLDApOworCisJQVRfUFJJTlRGKCJBVEFQSV9DTURfVU5JVF9URVNUX1JFQURZIHJldHVybmVkICV4XG4iLGMpOworCWlmIChjIT0wKQorCQlyZXR1cm47CisKKwltZW1zZXQoY2NiLDAsc2l6ZW9mKGNjYikpOworCW1lbXNldChpb2J1ZiwwLHNpemVvZihpb2J1ZikpOworCWNjYlswXT1BVEFQSV9DTURfUkVBRF9DQVA7CisJYz1hdGFwaV9pc3N1ZV9hdXRvcmVxKGRldmljZSxjY2IsMTIsKHVuc2lnbmVkIGNoYXIgKilpb2J1Ziw4KTsKKwlBVF9QUklOVEYoIkFUQVBJX0NNRF9SRUFEX0NBUCByZXR1cm5lZCAleFxuIixjKTsKKwlpZiAoYyE9MCkKKwkJcmV0dXJuOworCisJQVRfUFJJTlRGKCJSZWFkIENhcDogTEJBICUwMlglMDJYJTAyWCUwMlggYmxrc2l6ZSAlMDJYJTAyWCUwMlglMDJYXG4iLAorCQlpb2J1ZlswXSxpb2J1ZlsxXSxpb2J1ZlsyXSxpb2J1ZlszXSwKKwkJaW9idWZbNF0saW9idWZbNV0saW9idWZbNl0saW9idWZbN10pOworCisJZGV2X2Rlc2MtPmxiYSAgPSgodW5zaWduZWQgbG9uZylpb2J1ZlswXTw8MjQpICsKKwkJCSgodW5zaWduZWQgbG9uZylpb2J1ZlsxXTw8MTYpICsKKwkJCSgodW5zaWduZWQgbG9uZylpb2J1ZlsyXTw8IDgpICsKKwkJCSgodW5zaWduZWQgbG9uZylpb2J1ZlszXSk7CisJZGV2X2Rlc2MtPmJsa3N6PSgodW5zaWduZWQgbG9uZylpb2J1Zls0XTw8MjQpICsKKwkJCSgodW5zaWduZWQgbG9uZylpb2J1Zls1XTw8MTYpICsKKwkJCSgodW5zaWduZWQgbG9uZylpb2J1Zls2XTw8IDgpICsKKwkJCSgodW5zaWduZWQgbG9uZylpb2J1Zls3XSk7CisJcmV0dXJuOworfQorCisKKy8qCisgKiBhdGFwaV9yZWFkOgorICogd2UgdHJhbnNmZXIgb25seSBvbmUgYmxvY2sgcGVyIGNvbW1hbmQsIHNpbmNlIHRoZSBtdWx0aXBsZSBEUlEgcGVyCisgKiBjb21tYW5kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyAqLworI2RlZmluZSBBVEFQSV9SRUFEX01BWF9CWVRFUwkyMDQ4CS8qIHdlIHJlYWQgbWF4IDJrYnl0ZXMgKi8KKyNkZWZpbmUgQVRBUElfUkVBRF9CTE9DS19TSVpFCTIwNDgJLyogYXNzdW1pbmcgQ0QgcGFydCAqLworI2RlZmluZSBBVEFQSV9SRUFEX01BWF9CTE9DSyBBVEFQSV9SRUFEX01BWF9CWVRFUy9BVEFQSV9SRUFEX0JMT0NLX1NJWkUJLyogbWF4IGJsb2NrcyAqLworCit1bG9uZyBhdGFwaV9yZWFkIChpbnQgZGV2aWNlLCB1bG9uZyBibGtuciwgdWxvbmcgYmxrY250LCB1bG9uZyAqYnVmZmVyKQoreworCXVsb25nIG4gPSAwOworCXVuc2lnbmVkIGNoYXIgY2NiWzEyXTsgLyogQ29tbWFuZCBkZXNjcmlwdG9yIGJsb2NrICovCisJdWxvbmcgY250OworCisJQVRfUFJJTlRGKCJhdGFwaV9yZWFkIGRldiAlZCBzdGFydCAlbFgsIGJsb2NrcyAlbFggYnVmZmVyIGF0ICVsWFxuIiwKKwkJZGV2aWNlLCBibGtuciwgYmxrY250LCAodWxvbmcpYnVmZmVyKTsKKworCWRvIHsKKwkJaWYgKGJsa2NudD5BVEFQSV9SRUFEX01BWF9CTE9DSykgeworCQkJY250PUFUQVBJX1JFQURfTUFYX0JMT0NLOworCQl9IGVsc2UgeworCQkJY250PWJsa2NudDsKKwkJfQorCQljY2JbMF09QVRBUElfQ01EX1JFQURfMTI7CisJCWNjYlsxXT0wOyAvKiByZXNlcnZlZCAqLworCQljY2JbMl09KHVuc2lnbmVkIGNoYXIpIChibGtucj4+MjQpICYgMHhGRjsgLyogTVNCIEJsb2NrICovCisJCWNjYlszXT0odW5zaWduZWQgY2hhcikgKGJsa25yPj4xNikgJiAweEZGOyAvKiAgKi8KKwkJY2NiWzRdPSh1bnNpZ25lZCBjaGFyKSAoYmxrbnI+PiA4KSAmIDB4RkY7CisJCWNjYls1XT0odW5zaWduZWQgY2hhcikgIGJsa25yICAgICAgJiAweEZGOyAvKiBMU0IgQmxvY2sgKi8KKwkJY2NiWzZdPSh1bnNpZ25lZCBjaGFyKSAoY250ICA+PjI0KSAmIDB4RkY7IC8qIE1TQiBCbG9jayBjb3VudCAqLworCQljY2JbN109KHVuc2lnbmVkIGNoYXIpIChjbnQgID4+MTYpICYgMHhGRjsKKwkJY2NiWzhdPSh1bnNpZ25lZCBjaGFyKSAoY250ICA+PiA4KSAmIDB4RkY7CisJCWNjYls5XT0odW5zaWduZWQgY2hhcikgIGNudAkgICAmIDB4RkY7IC8qIExTQiBCbG9jayAqLworCQljY2JbMTBdPTA7IC8qIHJlc2VydmVkICovCisJCWNjYlsxMV09MDsgLyogcmVzZXJ2ZWQgKi8KKworCQlpZiAoYXRhcGlfaXNzdWVfYXV0b3JlcShkZXZpY2UsY2NiLDEyLAorCQkJCQkodW5zaWduZWQgY2hhciAqKWJ1ZmZlciwKKwkJCQkJY250KkFUQVBJX1JFQURfQkxPQ0tfU0laRSkgPT0gMHhGRikgeworCQkJcmV0dXJuIChuKTsKKwkJfQorCQluKz1jbnQ7CisJCWJsa2NudC09Y250OworCQlibGtucis9Y250OworCQlidWZmZXIrPWNudCooQVRBUElfUkVBRF9CTE9DS19TSVpFLzQpOyAvKiB1bG9uZyBibG9ja3NpemUgaW4gdWxvbmcgKi8KKwl9IHdoaWxlIChibGtjbnQgPiAwKTsKKwlyZXR1cm4gKG4pOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNlbmRpZiAvKiBDT05GSUdfQVRBUEkgKi8KKworI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFICovCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2ltbWFwLmMgYi9jb21tb24vY21kX2ltbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzMzM1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9jbWRfaW1tYXAuYwpAQCAtMCwwICsxLDU3OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogTVBDOHh4L01QQzgyNjAgSW50ZXJuYWwgTWVtb3J5IE1hcCBGdW5jdGlvbnMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNtZF9pbW1hcC5oPgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSU1NQVApICYmIFwKKyAgICAoZGVmaW5lZChDT05GSUdfOHh4KSB8fCBkZWZpbmVkKENPTkZJR184MjYwKSkKKworI2lmIGRlZmluZWQoQ09ORklHXzh4eCkKKyNpbmNsdWRlIDxhc20vOHh4X2ltbWFwLmg+CisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHXzgyNjApCisjaW5jbHVkZSA8YXNtL2ltbWFwXzgyNjAuaD4KKyNpbmNsdWRlIDxhc20vY3BtXzgyNjAuaD4KKyNpbmNsdWRlIDxhc20vaW9waW5fODI2MC5oPgorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit1bmltcGxlbWVudGVkICggY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJcHJpbnRmICgiU29ycnksIGJ1dCB0aGUgJyVzJyBjb21tYW5kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZFxuIiwKKwkJY21kdHAtPm5hbWUpOworfQorCitpbnQKK2RvX3NpdWluZm8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisKKyNpZiBkZWZpbmVkKENPTkZJR184eHgpCisJdm9sYXRpbGUgc3lzY29uZjh4eF90ICpzYyA9ICZpbW1hcC0+aW1fc2l1X2NvbmY7CisjZWxpZiBkZWZpbmVkKENPTkZJR184MjYwKQorCXZvbGF0aWxlIHN5c2NvbmY4MjYwX3QgKnNjID0gJmltbWFwLT5pbV9zaXVfY29uZjsKKyNlbmRpZgorCisJcHJpbnRmICgiU0lVTUNSPSAlMDh4IFNZUENSID0gJTA4eFxuIiwgc2MtPnNjX3NpdW1jciwgc2MtPnNjX3N5cGNyKTsKKyNpZiBkZWZpbmVkKENPTkZJR184eHgpCisJcHJpbnRmICgiU1dUICAgPSAlMDh4XG4iLCBzYy0+c2Nfc3d0KTsKKwlwcmludGYgKCJTSVBFTkQ9ICUwOHggU0lNQVNLPSAlMDh4XG4iLCBzYy0+c2Nfc2lwZW5kLCBzYy0+c2Nfc2ltYXNrKTsKKwlwcmludGYgKCJTSUVMICA9ICUwOHggU0lWRUMgPSAlMDh4XG4iLCBzYy0+c2Nfc2llbCwgc2MtPnNjX3NpdmVjKTsKKwlwcmludGYgKCJURVNSICA9ICUwOHggU0RDUiAgPSAlMDh4XG4iLCBzYy0+c2NfdGVzciwgc2MtPnNjX3NkY3IpOworI2VsaWYgZGVmaW5lZChDT05GSUdfODI2MCkKKwlwcmludGYgKCJCQ1IgICA9ICUwOHhcbiIsIHNjLT5zY19iY3IpOworCXByaW50ZiAoIlBfQUNSID0gICAgICAgJTAyeCBQX0FMUkg9ICUwOHggUF9BTFJMPSAlMDh4XG4iLAorCQlzYy0+c2NfcHBjX2Fjciwgc2MtPnNjX3BwY19hbHJoLCBzYy0+c2NfcHBjX2FscmwpOworCXByaW50ZiAoIkxfQUNSID0gICAgICAgJTAyeCBMX0FMUkg9ICUwOHggTF9BTFJMPSAlMDh4XG4iLAorCQlzYy0+c2NfbGNsX2Fjciwgc2MtPnNjX2xjbF9hbHJoLCBzYy0+c2NfbGNsX2FscmwpOworCXByaW50ZiAoIlBURVNSMT0gJTA4eCBQVEVTUjI9ICUwOHhcbiIsIHNjLT5zY190ZXNjcjEsIHNjLT5zY190ZXNjcjIpOworCXByaW50ZiAoIkxURVNSMT0gJTA4eCBMVEVTUjI9ICUwOHhcbiIsIHNjLT5zY19sdGVzY3IxLCBzYy0+c2NfbHRlc2NyMik7CisJcHJpbnRmICgiUERURUEgPSAlMDh4IFBEVEVNID0gICAgICAgJTAyeFxuIiwgc2MtPnNjX3BkdGVhLCBzYy0+c2NfcGR0ZW0pOworCXByaW50ZiAoIkxEVEVBID0gJTA4eCBMRFRFTSA9ICAgICAgICUwMnhcbiIsIHNjLT5zY19sZHRlYSwgc2MtPnNjX2xkdGVtKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitpbnQKK2RvX21lbWNpbmZvIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOworCisjaWYgZGVmaW5lZChDT05GSUdfOHh4KQorCXZvbGF0aWxlIG1lbWN0bDh4eF90ICptZW1jdGwgPSAmaW1tYXAtPmltX21lbWN0bDsKKwlpbnQgbmJhbmtzID0gODsKKyNlbGlmIGRlZmluZWQoQ09ORklHXzgyNjApCisJdm9sYXRpbGUgbWVtY3RsODI2MF90ICptZW1jdGwgPSAmaW1tYXAtPmltX21lbWN0bDsKKwlpbnQgbmJhbmtzID0gMTI7CisjZW5kaWYKKwl2b2xhdGlsZSB1aW50ICpwID0gJm1lbWN0bC0+bWVtY19icjA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJhbmtzOyBpKyssIHAgKz0gMikgeworCQlpZiAoaSA8IDEwKSB7CisJCQlwcmludGYgKCJCUiVkICAgPSAlMDh4IE9SJWQgICA9ICUwOHhcbiIsCisJCQkJaSwgcFswXSwgaSwgcFsxXSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCJCUiVkICA9ICUwOHggT1IlZCAgPSAlMDh4XG4iLAorCQkJCWksIHBbMF0sIGksIHBbMV0pOworCQl9CisJfQorCisJcHJpbnRmICgiTUFSICAgPSAlMDh4IiwgbWVtY3RsLT5tZW1jX21hcik7CisjaWYgZGVmaW5lZChDT05GSUdfOHh4KQorCXByaW50ZiAoIiBNQ1IgICA9ICUwOHhcbiIsIG1lbWN0bC0+bWVtY19tY3IpOworI2VsaWYgZGVmaW5lZChDT05GSUdfODI2MCkKKwlwcmludGYgKCJcbiIpOworI2VuZGlmCisJcHJpbnRmICgiTUFNUiAgPSAlMDh4IE1CTVIgID0gJTA4eCIsCisJCW1lbWN0bC0+bWVtY19tYW1yLCBtZW1jdGwtPm1lbWNfbWJtcik7CisjaWYgZGVmaW5lZChDT05GSUdfOHh4KQorCXByaW50ZiAoIlxuTVNUQVQgPSAgICAgJTA0eFxuIiwgbWVtY3RsLT5tZW1jX21zdGF0KTsKKyNlbGlmIGRlZmluZWQoQ09ORklHXzgyNjApCisJcHJpbnRmICgiIE1DTVIgID0gJTA4eFxuIiwgbWVtY3RsLT5tZW1jX21jbXIpOworI2VuZGlmCisJcHJpbnRmICgiTVBUUFIgPSAgICAgJTA0eCBNRFIgICA9ICUwOHhcbiIsCisJCW1lbWN0bC0+bWVtY19tcHRwciwgbWVtY3RsLT5tZW1jX21kcik7CisjaWYgZGVmaW5lZChDT05GSUdfODI2MCkKKwlwcmludGYgKCJQU0RNUiA9ICUwOHggTFNETVIgPSAlMDh4XG4iLAorCQltZW1jdGwtPm1lbWNfcHNkbXIsIG1lbWN0bC0+bWVtY19sc2Rtcik7CisJcHJpbnRmICgiUFVSVCAgPSAgICAgICAlMDJ4IFBTUlQgID0gICAgICAgJTAyeFxuIiwKKwkJbWVtY3RsLT5tZW1jX3B1cnQsIG1lbWN0bC0+bWVtY19wc3J0KTsKKwlwcmludGYgKCJMVVJUICA9ICAgICAgICUwMnggTFNSVCAgPSAgICAgICAlMDJ4XG4iLAorCQltZW1jdGwtPm1lbWNfbHVydCwgbWVtY3RsLT5tZW1jX2xzcnQpOworCXByaW50ZiAoIklNTVIgID0gJTA4eFxuIiwgbWVtY3RsLT5tZW1jX2ltbXIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK2ludAorZG9fc2l0aW5mbyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdW5pbXBsZW1lbnRlZCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHXzgyNjAKK2ludAorZG9faWNpbmZvIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1bmltcGxlbWVudGVkIChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50Citkb19jYXJpbmZvIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1bmltcGxlbWVudGVkIChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY291bnRlcjsKKworc3RhdGljIHZvaWQKK2hlYWRlcih2b2lkKQoreworCWNoYXIgKmRhdGEgPSAiXAorICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwKKyAgICAgICAwMDAwMDAwMDAwMTExMTExMTExMTIyMjIyMjIyMjIzMyAgICAgICAgMDAwMDAwMDAwMDExMTExMTExMTEyMjIyMjIyMjIyMzNcCisgICAgICAgMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEgICAgICAgIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxXAorICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwKKyAgICAiOworCWludCBpOworCisJaWYgKGNvdW50ZXIgJSAyKQorCXB1dGMoJ1xuJyk7CisJY291bnRlciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBkYXRhICs9IDc5KQorCQlwcmludGYoIiUuNzlzXG4iLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgYmluYXJ5IChjaGFyICpsYWJlbCwgdWludCB2YWx1ZSwgaW50IG5iaXRzKQoreworCXVpbnQgbWFzayA9IDEgPDwgKG5iaXRzIC0gMSk7CisJaW50IGksIHNlY29uZCA9IChjb3VudGVyKysgJSAyKTsKKworCWlmIChzZWNvbmQpCisJCXB1dGMgKCcgJyk7CisJcHV0cyAobGFiZWwpOworCWZvciAoaSA9IDMyICsgMTsgaSAhPSBuYml0czsgaS0tKQorCQlwdXRjICgnICcpOworCisJd2hpbGUgKG1hc2sgIT0gMCkgeworCQlpZiAodmFsdWUgJiBtYXNrKQorCQkJcHV0YyAoJzEnKTsKKwkJZWxzZQorCQkJcHV0YyAoJzAnKTsKKwkJbWFzayA+Pj0gMTsKKwl9CisKKwlpZiAoc2Vjb25kKQorCQlwdXRjICgnXG4nKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHXzh4eCkKKyNkZWZpbmUgUEFfTkJJVFMJMTYKKyNkZWZpbmUgUEFfTkJfT0RSCSA4CisjZGVmaW5lIFBCX05CSVRTCTE4CisjZGVmaW5lIFBCX05CX09EUgkxNgorI2RlZmluZSBQQ19OQklUUwkxMgorI2RlZmluZSBQRF9OQklUUwkxMworI2VsaWYgZGVmaW5lZChDT05GSUdfODI2MCkKKyNkZWZpbmUgUEFfTkJJVFMJMzIKKyNkZWZpbmUgUEFfTkJfT0RSCTMyCisjZGVmaW5lIFBCX05CSVRTCTI4CisjZGVmaW5lIFBCX05CX09EUgkyOAorI2RlZmluZSBQQ19OQklUUwkzMgorI2RlZmluZSBQRF9OQklUUwkyOAorI2VuZGlmCisKK2ludAorZG9faW9waW5mbyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKworI2lmIGRlZmluZWQoQ09ORklHXzh4eCkKKwl2b2xhdGlsZSBpb3A4eHhfdCAqaW9wID0gJmltbWFwLT5pbV9pb3BvcnQ7CisJdm9sYXRpbGUgdXNob3J0ICpsLCAqcjsKKyNlbGlmIGRlZmluZWQoQ09ORklHXzgyNjApCisJdm9sYXRpbGUgaW9wODI2MF90ICppb3AgPSAmaW1tYXAtPmltX2lvcG9ydDsKKwl2b2xhdGlsZSB1aW50ICpsLCAqcjsKKyNlbmRpZgorCXZvbGF0aWxlIHVpbnQgKlI7CisKKwljb3VudGVyID0gMDsKKwloZWFkZXIgKCk7CisKKwkvKgorCSAqIFBvcnRzIEEgJiBCCisJICovCisKKyNpZiBkZWZpbmVkKENPTkZJR184eHgpCisJbCA9ICZpb3AtPmlvcF9wYWRpcjsKKwlSID0gJmltbWFwLT5pbV9jcG0uY3BfcGJkaXI7CisjZWxpZiBkZWZpbmVkKENPTkZJR184MjYwKQorCWwgPSAmaW9wLT5pb3BfcGRpcmE7CisJUiA9ICZpb3AtPmlvcF9wZGlyYjsKKyNlbmRpZgorCWJpbmFyeSAoIlBBX0RJUiIsICpsKyssIFBBX05CSVRTKTsKKwliaW5hcnkgKCJQQl9ESVIiLCAqUisrLCBQQl9OQklUUyk7CisJYmluYXJ5ICgiUEFfUEFSIiwgKmwrKywgUEFfTkJJVFMpOworCWJpbmFyeSAoIlBCX1BBUiIsICpSKyssIFBCX05CSVRTKTsKKyNpZiBkZWZpbmVkKENPTkZJR184MjYwKQorCWJpbmFyeSAoIlBBX1NPUiIsICpsKyssIFBBX05CSVRTKTsKKwliaW5hcnkgKCJQQl9TT1IiLCAqUisrLCBQQl9OQklUUyk7CisjZW5kaWYKKwliaW5hcnkgKCJQQV9PRFIiLCAqbCsrLCBQQV9OQl9PRFIpOworCWJpbmFyeSAoIlBCX09EUiIsICpSKyssIFBCX05CX09EUik7CisJYmluYXJ5ICgiUEFfREFUIiwgKmwrKywgUEFfTkJJVFMpOworCWJpbmFyeSAoIlBCX0RBVCIsICpSKyssIFBCX05CSVRTKTsKKworCWhlYWRlciAoKTsKKworCS8qCisJICogUG9ydHMgQyAmIEQKKwkgKi8KKworI2lmIGRlZmluZWQoQ09ORklHXzh4eCkKKwlsID0gJmlvcC0+aW9wX3BjZGlyOworCXIgPSAmaW9wLT5pb3BfcGRkaXI7CisjZWxpZiBkZWZpbmVkKENPTkZJR184MjYwKQorCWwgPSAmaW9wLT5pb3BfcGRpcmM7CisJciA9ICZpb3AtPmlvcF9wZGlyZDsKKyNlbmRpZgorCWJpbmFyeSAoIlBDX0RJUiIsICpsKyssIFBDX05CSVRTKTsKKwliaW5hcnkgKCJQRF9ESVIiLCAqcisrLCBQRF9OQklUUyk7CisJYmluYXJ5ICgiUENfUEFSIiwgKmwrKywgUENfTkJJVFMpOworCWJpbmFyeSAoIlBEX1BBUiIsICpyKyssIFBEX05CSVRTKTsKKyNpZiBkZWZpbmVkKENPTkZJR184eHgpCisJYmluYXJ5ICgiUENfU08gIiwgKmwrKywgUENfTkJJVFMpOworCWJpbmFyeSAoIiAgICAgICIsIDAsIDApOworCXIrKzsKKyNlbGlmIGRlZmluZWQoQ09ORklHXzgyNjApCisJYmluYXJ5ICgiUENfU09SIiwgKmwrKywgUENfTkJJVFMpOworCWJpbmFyeSAoIlBEX1NPUiIsICpyKyssIFBEX05CSVRTKTsKKwliaW5hcnkgKCJQQ19PRFIiLCAqbCsrLCBQQ19OQklUUyk7CisJYmluYXJ5ICgiUERfT0RSIiwgKnIrKywgUERfTkJJVFMpOworI2VuZGlmCisJYmluYXJ5ICgiUENfREFUIiwgKmwrKywgUENfTkJJVFMpOworCWJpbmFyeSAoIlBEX0RBVCIsICpyKyssIFBEX05CSVRTKTsKKyNpZiBkZWZpbmVkKENPTkZJR184eHgpCisJYmluYXJ5ICgiUENfSU5UIiwgKmwrKywgUENfTkJJVFMpOworI2VuZGlmCisKKwloZWFkZXIgKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzZXQgdGhlIGlvIHBpbnMKKyAqIHRoaXMgbmVlZHMgYSBjbGVhbiB1cCBmb3Igc21hbGxlciB0aWdodGVyIGNvZGUKKyAqIHVzZSAqdWludCBhbmQgc2V0IHRoZSBhZGRyZXNzIGJhc2VkIG9uIGNtZCArIHBvcnQKKyAqLworaW50Citkb19pb3BzZXQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmIGRlZmluZWQoQ09ORklHXzgyNjApCisJdWludCByY29kZSA9IDA7CisJc3RhdGljIHVpbnQgcG9ydCA9IDA7CisJc3RhdGljIHVpbnQgcGluID0gMDsKKwlzdGF0aWMgdWludCB2YWx1ZSA9IDA7CisJc3RhdGljIGVudW0geyBESVIsIFBBUiwgU09SLCBPRFIsIERBVCB9IGNtZCA9IERBVDsKKwlpb3Bpbl90IGlvcGluOworCisJaWYgKGFyZ2MgIT0gNSkgeworCQlwcmludGYgKCJpb3BzZXQgUE9SVCBQSU4gQ01EIFZBTFVFXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXBvcnQgPSBhcmd2WzFdWzBdIC0gJ0EnOworCWlmIChwb3J0ID4gMykKKwkJcG9ydCAtPSAweDIwOworCWlmIChwb3J0ID4gMykKKwkJcmNvZGUgPSAxOworCXBpbiA9IHNpbXBsZV9zdHJ0b2wgKGFyZ3ZbMl0sIE5VTEwsIDEwKTsKKwlpZiAocGluID4gMzEpCisJCXJjb2RlID0gMTsKKworCisJc3dpdGNoIChhcmd2WzNdWzBdKSB7CisJY2FzZSAnZCc6CisJCWlmIChhcmd2WzNdWzFdID09ICdhJykKKwkJCWNtZCA9IERBVDsKKwkJZWxzZSBpZiAoYXJndlszXVsxXSA9PSAnaScpCisJCQljbWQgPSBESVI7CisJCWVsc2UKKwkJCXJjb2RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSAncCc6CisJCWNtZCA9IFBBUjsKKwkJYnJlYWs7CisJY2FzZSAnbyc6CisJCWNtZCA9IE9EUjsKKwkJYnJlYWs7CisJY2FzZSAncyc6CisJCWNtZCA9IFNPUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiaW9wc2V0OiB1bmtub3duIGNvbW1hbmQgJXNcbiIsIGFyZ3ZbM10pOworCQlyY29kZSA9IDE7CisJfQorCWlmIChhcmd2WzRdWzBdID09ICcxJykKKwkJdmFsdWUgPSAxOworCWVsc2UgaWYgKGFyZ3ZbNF1bMF0gPT0gJzAnKQorCQl2YWx1ZSA9IDA7CisJZWxzZQorCQlyY29kZSA9IDE7CisJaWYgKHJjb2RlID09IDApIHsKKwkJaW9waW4ucG9ydCA9IHBvcnQ7CisJCWlvcGluLnBpbiA9IHBpbjsKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBESVI6CisJCQlpZiAodmFsdWUpCisJCQkJaW9waW5fc2V0X291dCAoJmlvcGluKTsKKwkJCWVsc2UKKwkJCQlpb3Bpbl9zZXRfaW4gKCZpb3Bpbik7CisJCQlicmVhazsKKwkJY2FzZSBQQVI6CisJCQlpZiAodmFsdWUpCisJCQkJaW9waW5fc2V0X2RlZCAoJmlvcGluKTsKKwkJCWVsc2UKKwkJCQlpb3Bpbl9zZXRfZ2VuICgmaW9waW4pOworCQkJYnJlYWs7CisJCWNhc2UgU09SOgorCQkJaWYgKHZhbHVlKQorCQkJCWlvcGluX3NldF9vcHQyICgmaW9waW4pOworCQkJZWxzZQorCQkJCWlvcGluX3NldF9vcHQxICgmaW9waW4pOworCQkJYnJlYWs7CisJCWNhc2UgT0RSOgorCQkJaWYgKHZhbHVlKQorCQkJCWlvcGluX3NldF9vZHIgKCZpb3Bpbik7CisJCQllbHNlCisJCQkJaW9waW5fc2V0X2FjdCAoJmlvcGluKTsKKwkJCWJyZWFrOworCQljYXNlIERBVDoKKwkJCWlmICh2YWx1ZSkKKwkJCQlpb3Bpbl9zZXRfaGlnaCAoJmlvcGluKTsKKwkJCWVsc2UKKwkJCQlpb3Bpbl9zZXRfbG93ICgmaW9waW4pOworCQkJYnJlYWs7CisJCX0KKworCX0KKwlyZXR1cm4gcmNvZGU7CisjZWxzZQorCXVuaW1wbGVtZW50ZWQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQKK2RvX2RtYWluZm8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVuaW1wbGVtZW50ZWQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwlyZXR1cm4gMDsKK30KKworaW50Citkb19mY2NpbmZvIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1bmltcGxlbWVudGVkIChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByYnJnIChpbnQgbiwgdWludCB2YWwpCit7CisJdWludCBleHRjID0gKHZhbCA+PiAxNCkgJiAzOworCXVpbnQgY2QgPSAodmFsICYgQ1BNX0JSR19DRF9NQVNLKSA+PiAxOworCXVpbnQgZGl2MTYgPSAodmFsICYgQ1BNX0JSR19ESVYxNikgIT0gMDsKKworI2lmIGRlZmluZWQoQ09ORklHXzh4eCkKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwl1bG9uZyBjbG9jayA9IGdkLT5jcHVfY2xrOworI2VsaWYgZGVmaW5lZChDT05GSUdfODI2MCkKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwl1bG9uZyBjbG9jayA9IGdkLT5icmdfY2xrOworI2VuZGlmCisKKwlwcmludGYgKCJCUkclZDoiLCBuKTsKKworCWlmICh2YWwgJiBDUE1fQlJHX1JTVCkKKwkJcHV0cyAoIiBSRVNFVCIpOworCWVsc2UKKwkJcHV0cyAoIiAgICAgICIpOworCisJaWYgKHZhbCAmIENQTV9CUkdfRU4pCisJCXB1dHMgKCIgIEVOQUJMRUQiKTsKKwllbHNlCisJCXB1dHMgKCIgRElTQUJMRUQiKTsKKworCXByaW50ZiAoIiBFWFRDPSVkIiwgZXh0Yyk7CisKKwlpZiAodmFsICYgQ1BNX0JSR19BVEIpCisJCXB1dHMgKCIgQVRCIik7CisJZWxzZQorCQlwdXRzICgiICAgICIpOworCisJcHJpbnRmICgiIERJVklERVI9JTRkIiwgY2QpOworCWlmIChleHRjID09IDAgJiYgY2QgIT0gMCkgeworCQl1aW50IGJhdWRyYXRlOworCisJCWlmIChkaXYxNikKKwkJCWJhdWRyYXRlID0gKGNsb2NrIC8gMTYpIC8gKGNkICsgMSk7CisJCWVsc2UKKwkJCWJhdWRyYXRlID0gY2xvY2sgLyAoY2QgKyAxKTsKKworCQlwcmludGYgKCI9JTZkIGJwcyIsIGJhdWRyYXRlKTsKKwl9IGVsc2UgeworCQlwdXRzICgiICAgICAgICAgICAiKTsKKwl9CisKKwlpZiAodmFsICYgQ1BNX0JSR19ESVYxNikKKwkJcHV0cyAoIiBESVYxNiIpOworCWVsc2UKKwkJcHV0cyAoIiAgICAgICIpOworCisJcHV0YyAoJ1xuJyk7Cit9CisKK2ludAorZG9fYnJnaW5mbyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKworI2lmIGRlZmluZWQoQ09ORklHXzh4eCkKKwl2b2xhdGlsZSBjcG04eHhfdCAqY3AgPSAmaW1tYXAtPmltX2NwbTsKKwl2b2xhdGlsZSB1aW50ICpwID0gJmNwLT5jcF9icmdjMTsKKyNlbGlmIGRlZmluZWQoQ09ORklHXzgyNjApCisJdm9sYXRpbGUgdWludCAqcCA9ICZpbW1hcC0+aW1fYnJnYzE7CisjZW5kaWYKKwlpbnQgaSA9IDE7CisKKwl3aGlsZSAoaSA8PSA0KQorCQlwcmJyZyAoaSsrLCAqcCsrKTsKKworI2lmIGRlZmluZWQoQ09ORklHXzgyNjApCisJcCA9ICZpbW1hcC0+aW1fYnJnYzU7CisJd2hpbGUgKGkgPD0gOCkKKwkJcHJicmcgKGkrKywgKnArKyk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworaW50Citkb19pMmNpbmZvIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOworCisjaWYgZGVmaW5lZChDT05GSUdfOHh4KQorCXZvbGF0aWxlIGkyYzh4eF90ICppMmMgPSAmaW1tYXAtPmltX2kyYzsKKwl2b2xhdGlsZSBjcG04eHhfdCAqY3AgPSAmaW1tYXAtPmltX2NwbTsKKwl2b2xhdGlsZSBpaWNfdCAqaWlwID0gKGlpY190ICopICYgY3AtPmNwX2RwYXJhbVtQUk9GRl9JSUNdOworI2VsaWYgZGVmaW5lZChDT05GSUdfODI2MCkKKwl2b2xhdGlsZSBpMmM4MjYwX3QgKmkyYyA9ICZpbW1hcC0+aW1faTJjOworCXZvbGF0aWxlIGlpY190ICppaXA7CisJdWludCBkcGFkZHI7CisKKwlkcGFkZHIgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKSAoJmltbWFwLT5pbV9kcHJhbWJhc2VbUFJPRkZfSTJDX0JBU0VdKSk7CisJaWYgKGRwYWRkciA9PSAwKQorCQlpaXAgPSBOVUxMOworCWVsc2UKKwkJaWlwID0gKGlpY190ICopICYgaW1tYXAtPmltX2RwcmFtYmFzZVtkcGFkZHJdOworI2VuZGlmCisKKwlwcmludGYgKCJJMk1PRCA9ICUwMnggSTJBREQgPSAlMDJ4XG4iLCBpMmMtPmkyY19pMm1vZCwgaTJjLT5pMmNfaTJhZGQpOworCXByaW50ZiAoIkkyQlJHID0gJTAyeCBJMkNPTSA9ICUwMnhcbiIsIGkyYy0+aTJjX2kyYnJnLCBpMmMtPmkyY19pMmNvbSk7CisJcHJpbnRmICgiSTJDRVIgPSAlMDJ4IEkyQ01SID0gJTAyeFxuIiwgaTJjLT5pMmNfaTJjZXIsIGkyYy0+aTJjX2kyY21yKTsKKworCWlmIChpaXAgPT0gTlVMTCkKKwkJcHJpbnRmICgiaTJjIHBhcmFtZXRlciByYW0gbm90IGFsbG9jYXRlZFxuIik7CisJZWxzZSB7CisJCXByaW50ZiAoIlJCQVNFID0gJTA4eCBUQkFTRSA9ICUwOHhcbiIsCisJCQlpaXAtPmlpY19yYmFzZSwgaWlwLT5paWNfdGJhc2UpOworCQlwcmludGYgKCJSRkNSICA9ICAgICAgICUwMnggVEZDUiAgPSAgICAgICAlMDJ4XG4iLAorCQkJaWlwLT5paWNfcmZjciwgaWlwLT5paWNfdGZjcik7CisJCXByaW50ZiAoIk1SQkxSID0gICAgICUwNHhcbiIsIGlpcC0+aWljX21yYmxyKTsKKwkJcHJpbnRmICgiUlNUQVRFPSAlMDh4IFJEUCAgID0gJTA4eFxuIiwKKwkJCWlpcC0+aWljX3JzdGF0ZSwgaWlwLT5paWNfcmRwKTsKKwkJcHJpbnRmICgiUkJQVFIgPSAgICAgJTA0eCBSQkMgICA9ICAgICAlMDR4XG4iLAorCQkJaWlwLT5paWNfcmJwdHIsIGlpcC0+aWljX3JiYyk7CisJCXByaW50ZiAoIlJYVE1QID0gJTA4eFxuIiwgaWlwLT5paWNfcnh0bXApOworCQlwcmludGYgKCJUU1RBVEU9ICUwOHggVERQICAgPSAlMDh4XG4iLAorCQkJaWlwLT5paWNfdHN0YXRlLCBpaXAtPmlpY190ZHApOworCQlwcmludGYgKCJUQlBUUiA9ICAgICAlMDR4IFRCQyAgID0gICAgICUwNHhcbiIsCisJCQlpaXAtPmlpY190YnB0ciwgaWlwLT5paWNfdGJjKTsKKwkJcHJpbnRmICgiVFhUTVAgPSAlMDh4XG4iLCBpaXAtPmlpY190eHRtcCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQKK2RvX3NjY2luZm8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVuaW1wbGVtZW50ZWQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwlyZXR1cm4gMDsKK30KKworaW50Citkb19zbWNpbmZvIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1bmltcGxlbWVudGVkIChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJcmV0dXJuIDA7Cit9CisKK2ludAorZG9fc3BpaW5mbyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdW5pbXBsZW1lbnRlZCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOworCXJldHVybiAwOworfQorCitpbnQKK2RvX211eGluZm8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVuaW1wbGVtZW50ZWQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwlyZXR1cm4gMDsKK30KKworaW50Citkb19zaWluZm8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVuaW1wbGVtZW50ZWQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwlyZXR1cm4gMDsKK30KKworaW50Citkb19tY2NpbmZvIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1bmltcGxlbWVudGVkIChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogQ0ZHX0NNRF9JTU1BUCAmJiAoQ09ORklHXzh4eCB8fCBDT05GSUdfODI2MCkgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfamZmczIuYyBiL2NvbW1vbi9jbWRfamZmczIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFkOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2NtZF9qZmZzMi5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBCb290IHN1cHBvcnQKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxjbWRfYm9vdC5oPgorI2luY2x1ZGUgPGNtZF9hdXRvc2NyaXB0Lmg+CisjaW5jbHVkZSA8c19yZWNvcmQuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorCisjaW5jbHVkZSA8amZmczIvamZmczIuaD4KK3N0YXRpYyBpbnQgcGFydF9udW09MDsKKworI2lmbmRlZiBDRkdfSkZGU19DVVNUT01fUEFSVAorCitzdGF0aWMgc3RydWN0IHBhcnRfaW5mbyBwYXJ0OworCitzdHJ1Y3QgcGFydF9pbmZvKgoramZmczJfcGFydF9pbmZvKGludCBwYXJ0X251bSkKK3sKKwlleHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bXTsJLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMgKi8KKwlpbnQgaTsKKworCWlmKHBhcnRfbnVtPT0wKXsKKworCQlpZihwYXJ0LnVzcl9wcml2PT0odm9pZCopMSkKKwkJCXJldHVybiAmcGFydDsKKworCQltZW1zZXQoJnBhcnQsIDAsIHNpemVvZihwYXJ0KSk7CisKKyNpZiBkZWZpbmVkKENGR19KRkZTMl9GSVJTVF9TRUNUT1IpCisJCXBhcnQub2Zmc2V0ID0gKHVuc2lnbmVkIGNoYXIgKikgZmxhc2hfaW5mb1tDRkdfSkZGUzJfRklSU1RfQkFOS10uc3RhcnRbQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUl07CisjZWxzZQorCQlwYXJ0Lm9mZnNldCA9ICh1bnNpZ25lZCBjaGFyICopIGZsYXNoX2luZm9bQ0ZHX0pGRlMyX0ZJUlNUX0JBTktdLnN0YXJ0WzBdOworI2VuZGlmCisKKwkJLyogRmlndXJlIG91dCBmbGFzaCBwYXJ0aXRpb24gc2l6ZSAqLworCQlmb3IgKGkgPSBDRkdfSkZGUzJfRklSU1RfQkFOSzsgaSA8IENGR19KRkZTMl9OVU1fQkFOS1MrQ0ZHX0pGRlMyX0ZJUlNUX0JBTks7IGkrKykKKwkJCXBhcnQuc2l6ZSArPSBmbGFzaF9pbmZvW2ldLnNpemU7CisKKyNpZiBkZWZpbmVkKENGR19KRkZTMl9GSVJTVF9TRUNUT1IpICYmIChDRkdfSkZGUzJfRklSU1RfU0VDVE9SID4gMCkKKwkJcGFydC5zaXplIC09CisJCQlmbGFzaF9pbmZvW0NGR19KRkZTMl9GSVJTVF9CQU5LXS5zdGFydFtDRkdfSkZGUzJfRklSU1RfU0VDVE9SXSAtCisJCQlmbGFzaF9pbmZvW0NGR19KRkZTMl9GSVJTVF9CQU5LXS5zdGFydFswXTsKKyNlbmRpZgorCisJCS8qIHVudXNlZCBpbiBjdXJyZW50IGpmZnMyIGxvYWRlciAqLworCQlwYXJ0LmVyYXNlc2l6ZSA9IDA7CisKKwkJLyogTWFyayB0aGUgc3RydWN0IGFzIHJlYWR5ICovCisJCXBhcnQudXNyX3ByaXY9KHZvaWQqKTE7CisKKwkJcmV0dXJuICZwYXJ0OworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBpZm5kZWYgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQgKi8KK2ludAorZG9famZmczJfZnNsb2FkKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKmZpbGVuYW1lID0gInBJbWFnZSI7CisJdWxvbmcgb2Zmc2V0ID0gQ0ZHX0xPQURfQUREUjsKKwlpbnQgc2l6ZTsKKwlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0OworCisJaWYgKGFyZ2MgPT0gMikgeworCQlmaWxlbmFtZSA9IGFyZ3ZbMV07CisJfQorCWlmIChhcmdjID09IDMpIHsKKwkJb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOworCQlmaWxlbmFtZSA9IGFyZ3ZbMl07CisJfQorCisJaWYgKDAgIT0gKHBhcnQ9amZmczJfcGFydF9pbmZvKHBhcnRfbnVtKSkpeworCisJCXByaW50ZigiIyMjIEpGRlMyIGxvYWRpbmcgJyVzJyB0byAweCVseFxuIiwgZmlsZW5hbWUsIG9mZnNldCk7CisJCXNpemUgPSBqZmZzMl8xcGFzc19sb2FkKChjaGFyICopb2Zmc2V0LCBwYXJ0LCBmaWxlbmFtZSk7CisKKwkJaWYgKHNpemUgPiAwKSB7CisJCQljaGFyIGJ1ZlsxMF07CisJCQlwcmludGYoIiMjIyBKRkZTMiBsb2FkIGNvbXBsZXRlOiAlZCBieXRlcyBsb2FkZWQgdG8gMHglbHhcbiIsCisJCQkJc2l6ZSwgb2Zmc2V0KTsKKwkJCXNwcmludGYoYnVmLCAiJXgiLCBzaXplKTsKKwkJCXNldGVudigiZmlsZXNpemUiLCBidWYpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIjIyMgSkZGUzIgTE9BRCBFUlJPUjwleD4gZm9yICVzIVxuIiwgc2l6ZSwgZmlsZW5hbWUpOworCQl9CisKKwkJcmV0dXJuICEoc2l6ZSA+IDApOworCX0KKwlwcmludGYoIkFjdGl2ZSBwYXJ0aXRpb24gbm90IHZhbGlkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworaW50Citkb19qZmZzMl9scyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyICpmaWxlbmFtZSA9ICIvIjsKKwlpbnQgcmV0OworCXN0cnVjdCBwYXJ0X2luZm8gKnBhcnQ7CisKKwlpZiAoYXJnYyA9PSAyKQorCQlmaWxlbmFtZSA9IGFyZ3ZbMV07CisKKwlpZiAoMCAhPSAocGFydD1qZmZzMl9wYXJ0X2luZm8ocGFydF9udW0pKSl7CisKKwkJcmV0ID0gamZmczJfMXBhc3NfbHMoamZmczJfcGFydF9pbmZvKHBhcnRfbnVtKSwgZmlsZW5hbWUpOworCisJCXJldHVybiAocmV0ID09IDEpOworCX0KKwlwcmludGYoIkFjdGl2ZSBwYXJ0aXRpb24gbm90IHZhbGlkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworaW50Citkb19qZmZzMl9mc2luZm8oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0OworCisJaWYgKDAgIT0gKHBhcnQ9amZmczJfcGFydF9pbmZvKHBhcnRfbnVtKSkpeworCisJCXJldCA9IGpmZnMyXzFwYXNzX2luZm8oamZmczJfcGFydF9pbmZvKHBhcnRfbnVtKSk7CisKKwkJcmV0dXJuIChyZXQgPT0gMSk7CisJfQorCXByaW50ZigiQWN0aXZlIHBhcnRpdGlvbiBub3QgdmFsaWRcbiIpOworCXJldHVybiAwOworfQorCitpbnQKK2RvX2pmZnMyX2NocGFydChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgdG1wX3BhcnQ7CisKKwlpZiAoYXJnYyA+PSAyKSB7CisJCXRtcF9wYXJ0ID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOworCX1lbHNleworCQlwcmludGYoIk5lZWQgcGFydGl0aW9uIG51bWJlciBpbiBhcmd1bWVudCBsaXN0XG4iKTsKKwkJcmV0dXJuIDA7CisKKwl9CisKKwlpZiAoamZmczJfcGFydF9pbmZvKHRtcF9wYXJ0KSl7CisJCXByaW50ZigiUGFydGl0b24gY2hhbmdlZCB0byAlZFxuIix0bXBfcGFydCk7CisJCXBhcnRfbnVtPXRtcF9wYXJ0OworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGYoIlBhcnRpdGlvbiAlZCBpcyBub3QgdmFsaWQgcGFydGl0b25cbiIsdG1wX3BhcnQpOworCXJldHVybiAwOworCit9CisjZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9wY2kuYyBiL2NvbW1vbi9jbWRfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlNGI5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9jbWRfcGNpLmMKQEAgLTAsMCArMSw0NzcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEgU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBBbmRyZWFzIEhlcHBlbCA8YWhlcHBlbEBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKiBXb2xmZ2FuZyBHcmFuZGVnZ2VyLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3Z0BkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBQQ0kgcm91dGluZXMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfUENJCisKKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8Y21kX2Jvb3QuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8Y21kX3BjaS5oPgorI2luY2x1ZGUgPHBjaS5oPgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENJKQorCitleHRlcm4gaW50IGNtZF9nZXRfZGF0YV9zaXplKGNoYXIqIGFyZywgaW50IGRlZmF1bHRfc2l6ZSk7CisKK3Vuc2lnbmVkIGNoYXIJU2hvcnRQQ0lMaXN0aW5nID0gMTsKKworLyoKKyAqIEZvbGxvd3Mgcm91dGluZXMgZm9yIHRoZSBvdXRwdXQgb2YgaW5mb3MgYWJvdXQgZGV2aWNlcyBvbiBQQ0kgYnVzLgorICovCisKK3ZvaWQgcGNpX2hlYWRlcl9zaG93KHBjaV9kZXZfdCBkZXYpOwordm9pZCBwY2lfaGVhZGVyX3Nob3dfYnJpZWYocGNpX2Rldl90IGRldik7CisKKy8qCisgKiBTdWJyb3V0aW5lOiAgcGNpaW5mbworICoKKyAqIERlc2NyaXB0aW9uOiBTaG93IGluZm9ybWF0aW9uIGFib3V0IGRldmljZXMgb24gUENJIGJ1cy4KKyAqCQkJCURlcGVuZGluZyBvbiB0aGUgZGVmaW5lIENGR19TSE9SVF9QQ0lfTElTVElORworICoJCQkJdGhlIG91dHB1dCB3aWxsIGJlIG1vcmUgb3IgbGVzcyBleGhhdXN0aXZlLgorICoKKyAqIElucHV0czoJYnVzX25vCQl0aGUgbnVtYmVyIG9mIHRoZSBidXMgdG8gYmUgc2Nhbm5lZC4KKyAqCisgKiBSZXR1cm46ICAgICAgTm9uZQorICoKKyAqLwordm9pZCBwY2lpbmZvKGludCBCdXNOdW0sIGludCBTaG9ydFBDSUxpc3RpbmcpCit7CisJaW50IERldmljZTsKKwlpbnQgRnVuY3Rpb247CisJdW5zaWduZWQgY2hhciBIZWFkZXJUeXBlOworCXVuc2lnbmVkIHNob3J0IFZlbmRvcklEOworCXBjaV9kZXZfdCBkZXY7CisKKwlwcmludGYoIlNjYW5uaW5nIFBDSSBkZXZpY2VzIG9uIGJ1cyAlZFxuIiwgQnVzTnVtKTsKKworCWlmIChTaG9ydFBDSUxpc3RpbmcpIHsKKwkJcHJpbnRmKCJCdXNEZXZGdW4gIFZlbmRvcklkICAgRGV2aWNlSWQgICBEZXZpY2UgQ2xhc3MgICAgICAgU3ViLUNsYXNzXG4iKTsKKwkJcHJpbnRmKCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG4iKTsKKwl9CisKKwlmb3IgKERldmljZSA9IDA7IERldmljZSA8IFBDSV9NQVhfUENJX0RFVklDRVM7IERldmljZSsrKSB7CisJCUhlYWRlclR5cGUgPSAwOworCQlWZW5kb3JJRCA9IDA7CisJCWZvciAoRnVuY3Rpb24gPSAwOyBGdW5jdGlvbiA8IFBDSV9NQVhfUENJX0ZVTkNUSU9OUzsgRnVuY3Rpb24rKykgeworCQkJLyoKKwkJCSAqIElmIHRoaXMgaXMgbm90IGEgbXVsdGktZnVuY3Rpb24gZGV2aWNlLCB3ZSBza2lwIHRoZSByZXN0LgorCQkJICovCisJCQlpZiAoRnVuY3Rpb24gJiYgIShIZWFkZXJUeXBlICYgMHg4MCkpCisJCQkJYnJlYWs7CisKKwkJCWRldiA9IFBDSV9CREYoQnVzTnVtLCBEZXZpY2UsIEZ1bmN0aW9uKTsKKworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfVkVORE9SX0lELCAmVmVuZG9ySUQpOworCQkJaWYgKChWZW5kb3JJRCA9PSAweEZGRkYpIHx8IChWZW5kb3JJRCA9PSAweDAwMDApKQorCQkJCWNvbnRpbnVlOworCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9IRUFERVJfVFlQRSwgJkhlYWRlclR5cGUpOworCisJCQlpZiAoU2hvcnRQQ0lMaXN0aW5nKQorCQkJeworCQkJCXByaW50ZigiJTAyeC4lMDJ4LiUwMnggICAiLCBCdXNOdW0sIERldmljZSwgRnVuY3Rpb24pOworCQkJCXBjaV9oZWFkZXJfc2hvd19icmllZihkZXYpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXByaW50ZigiXG5Gb3VuZCBQQ0kgZGV2aWNlICUwMnguJTAyeC4lMDJ4OlxuIiwKKwkJCQkgICAgICAgQnVzTnVtLCBEZXZpY2UsIEZ1bmN0aW9uKTsKKwkJCQlwY2lfaGVhZGVyX3Nob3coZGV2KTsKKwkJCX0KKwkgICAgfQorICAgIH0KK30KKworY2hhciogcGNpX2NsYXNzZXNfc3RyKHU4IGNsYXNzKQoreworCXN0YXRpYyBjaGFyICpwY2lfY2xhc3Nlc1tdID0geworCQkiQnVpbGQgYmVmb3JlIFBDSSBSZXYyLjAiLAorCQkiTWFzcyBzdG9yYWdlIGNvbnRyb2xsZXIiLAorCQkiTmV0d29yayBjb250cm9sbGVyICAgICAiLAorCQkiRGlzcGxheSBjb250cm9sbGVyICAgICAiLAorCQkiTXVsdGltZWRpYSBkZXZpY2UgICAgICAiLAorCQkiTWVtb3J5IGNvbnRyb2xsZXIgICAgICAiLAorCQkiQnJpZGdlIGRldmljZSAgICAgICAgICAiLAorCQkiU2ltcGxlIGNvbW0uIGNvbnRyb2xsZXIiLAorCQkiQmFzZSBzeXN0ZW0gcGVyaXBoZXJhbCAiLAorCQkiSW5wdXQgZGV2aWNlICAgICAgICAgICAiLAorCQkiRG9ja2luZyBzdGF0aW9uICAgICAgICAiLAorCQkiUHJvY2Vzc29yICAgICAgICAgICAgICAiLAorCQkiU2VyaWFsIGJ1cyBjb250cm9sbGVyICAiLAorCQkiUmVzZXJ2ZWQgZW50cnkgICAgICAgICAiLAorCQkiRG9lcyBub3QgZml0IGFueSBjbGFzcyAiCisJfTsKKworCWlmIChjbGFzcyA8IChzaXplb2YgcGNpX2NsYXNzZXMgLyBzaXplb2YgKnBjaV9jbGFzc2VzKSkKKwkJcmV0dXJuIHBjaV9jbGFzc2VzWyhpbnQpIGNsYXNzXTsKKworCXJldHVybiAgIj8/PyAgICAgICAgICAgICAgICAgICAgIjsKK30KKworLyoKKyAqIFN1YnJvdXRpbmU6ICBwY2lfaGVhZGVyX3Nob3dfYnJpZWYKKyAqCisgKiBEZXNjcmlwdGlvbjogUmVhZHMgYW5kIHByaW50cyB0aGUgaGVhZGVyIG9mIHRoZQorICogCQlzcGVjaWZpZWQgUENJIGRldmljZSBpbiBzaG9ydCBmb3JtLgorICoKKyAqIElucHV0czoJZGV2ICAgICAgQnVzK0RldmljZStGdW5jdGlvbiBudW1iZXIKKyAqCisgKiBSZXR1cm46ICAgICAgTm9uZQorICoKKyAqLwordm9pZCBwY2lfaGVhZGVyX3Nob3dfYnJpZWYocGNpX2Rldl90IGRldikKK3sKKwl1MTYgdmVuZG9yLCBkZXZpY2U7CisJdTggY2xhc3MsIHN1YmNsYXNzOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfVkVORE9SX0lELCAmdmVuZG9yKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9ERVZJQ0VfSUQsICZkZXZpY2UpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX0NPREUsICZjbGFzcyk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0xBU1NfU1VCX0NPREUsICZzdWJjbGFzcyk7CisKKwlwcmludGYoIjB4JS40eCAgICAgMHglLjR4ICAgICAlcyAweCUuMnhcbiIsCisJICAgICAgIHZlbmRvciwgZGV2aWNlLAorCSAgICAgICBwY2lfY2xhc3Nlc19zdHIoY2xhc3MpLCBzdWJjbGFzcyk7Cit9CisKKy8qCisgKiBTdWJyb3V0aW5lOiAgUENJX0hlYWRlcl9TaG93CisgKgorICogRGVzY3JpcHRpb246IFJlYWRzIHRoZSBoZWFkZXIgb2YgdGhlIHNwZWNpZmllZCBQQ0kgZGV2aWNlLgorICoKKyAqIElucHV0czoJCUJ1c0RldkZ1bmMgICAgICBCdXMrRGV2aWNlK0Z1bmN0aW9uIG51bWJlcgorICoKKyAqIFJldHVybjogICAgICBOb25lCisgKgorICovCit2b2lkIHBjaV9oZWFkZXJfc2hvdyhwY2lfZGV2X3QgZGV2KQoreworCXU4IF9ieXRlLCBoZWFkZXJfdHlwZTsKKwl1MTYgX3dvcmQ7CisJdTMyIF9kd29yZDsKKworI2RlZmluZSBQUklOVChtc2csIHR5cGUsIHJlZykgXAorCXBjaV9yZWFkX2NvbmZpZ18jI3R5cGUoZGV2LCByZWcsICZfIyN0eXBlKTsgXAorCXByaW50Zihtc2csIF8jI3R5cGUpCisKKyNkZWZpbmUgUFJJTlQyKG1zZywgdHlwZSwgcmVnLCBmdW5jKSBcCisJcGNpX3JlYWRfY29uZmlnXyMjdHlwZShkZXYsIHJlZywgJl8jI3R5cGUpOyBcCisJcHJpbnRmKG1zZywgXyMjdHlwZSwgZnVuYyhfIyN0eXBlKSkKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0hFQURFUl9UWVBFLCAmaGVhZGVyX3R5cGUpOworCisJUFJJTlQgKCIgIHZlbmRvciBJRCA9ICAgICAgICAgICAgICAgICAgIDB4JS40eFxuIiwgd29yZCwgUENJX1ZFTkRPUl9JRCk7CisJUFJJTlQgKCIgIGRldmljZSBJRCA9ICAgICAgICAgICAgICAgICAgIDB4JS40eFxuIiwgd29yZCwgUENJX0RFVklDRV9JRCk7CisJUFJJTlQgKCIgIGNvbW1hbmQgcmVnaXN0ZXIgPSAgICAgICAgICAgIDB4JS40eFxuIiwgd29yZCwgUENJX0NPTU1BTkQpOworCVBSSU5UICgiICBzdGF0dXMgcmVnaXN0ZXIgPSAgICAgICAgICAgICAweCUuNHhcbiIsIHdvcmQsIFBDSV9TVEFUVVMpOworCVBSSU5UICgiICByZXZpc2lvbiBJRCA9ICAgICAgICAgICAgICAgICAweCUuMnhcbiIsIGJ5dGUsIFBDSV9SRVZJU0lPTl9JRCk7CisJUFJJTlQyKCIgIGNsYXNzIGNvZGUgPSAgICAgICAgICAgICAgICAgIDB4JS4yeCAoJXMpXG4iLCBieXRlLCBQQ0lfQ0xBU1NfQ09ERSwKKwkgICAgICAgCQkJCQkJCXBjaV9jbGFzc2VzX3N0cik7CisJUFJJTlQgKCIgIHN1YiBjbGFzcyBjb2RlID0gICAgICAgICAgICAgIDB4JS4yeFxuIiwgYnl0ZSwgUENJX0NMQVNTX1NVQl9DT0RFKTsKKwlQUklOVCAoIiAgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlID0gICAgICAgMHglLjJ4XG4iLCBieXRlLCBQQ0lfQ0xBU1NfUFJPRyk7CisJUFJJTlQgKCIgIGNhY2hlIGxpbmUgPSAgICAgICAgICAgICAgICAgIDB4JS4yeFxuIiwgYnl0ZSwgUENJX0NBQ0hFX0xJTkVfU0laRSk7CisJUFJJTlQgKCIgIGxhdGVuY3kgdGltZSA9ICAgICAgICAgICAgICAgIDB4JS4yeFxuIiwgYnl0ZSwgUENJX0xBVEVOQ1lfVElNRVIpOworCVBSSU5UICgiICBoZWFkZXIgdHlwZSA9ICAgICAgICAgICAgICAgICAweCUuMnhcbiIsIGJ5dGUsIFBDSV9IRUFERVJfVFlQRSk7CisJUFJJTlQgKCIgIEJJU1QgPSAgICAgICAgICAgICAgICAgICAgICAgIDB4JS4yeFxuIiwgYnl0ZSwgUENJX0JJU1QpOworCVBSSU5UICgiICBiYXNlIGFkZHJlc3MgMCA9ICAgICAgICAgICAgICAweCUuOHhcbiIsIGR3b3JkLCBQQ0lfQkFTRV9BRERSRVNTXzApOworCVBSSU5UICgiICBiYXNlIGFkZHJlc3MgMSA9ICAgICAgICAgICAgICAweCUuOHhcbiIsIGR3b3JkLCBQQ0lfQkFTRV9BRERSRVNTXzEpOworCisJaWYgKGhlYWRlcl90eXBlICYgMHgwMSkgewkJLyogUENJLXRvLVBDSSBicmlkZ2UgKi8KKwkJUFJJTlQgKCIgIHByaW1hcnkgYnVzIG51bWJlciA9ICAgICAgICAgIDB4JS4yeFxuIiwgYnl0ZSwgUENJX1BSSU1BUllfQlVTKTsKKwkJUFJJTlQgKCIgIHNlY29uZGFyeSBidXMgbnVtYmVyID0gICAgICAgIDB4JS4yeFxuIiwgYnl0ZSwgUENJX1NFQ09OREFSWV9CVVMpOworCQlQUklOVCAoIiAgc3Vib3JkaW5hdGUgYnVzIG51bWJlciA9ICAgICAgMHglLjJ4XG4iLCBieXRlLCBQQ0lfU1VCT1JESU5BVEVfQlVTKTsKKwkJUFJJTlQgKCIgIHNlY29uZGFyeSBsYXRlbmN5IHRpbWVyID0gICAgIDB4JS4yeFxuIiwgYnl0ZSwgUENJX1NFQ19MQVRFTkNZX1RJTUVSKTsKKwkJUFJJTlQgKCIgIElPIGJhc2UgPSAgICAgICAgICAgICAgICAgICAgIDB4JS4yeFxuIiwgYnl0ZSwgUENJX0lPX0JBU0UpOworCQlQUklOVCAoIiAgSU8gbGltaXQgPSAgICAgICAgICAgICAgICAgICAgMHglLjJ4XG4iLCBieXRlLCBQQ0lfSU9fTElNSVQpOworCQlQUklOVCAoIiAgc2Vjb25kYXJ5IHN0YXR1cyA9ICAgICAgICAgICAgMHglLjR4XG4iLCB3b3JkLCBQQ0lfU0VDX1NUQVRVUyk7CisJCVBSSU5UICgiICBtZW1vcnkgYmFzZSA9ICAgICAgICAgICAgICAgICAweCUuNHhcbiIsIHdvcmQsIFBDSV9NRU1PUllfQkFTRSk7CisJCVBSSU5UICgiICBtZW1vcnkgbGltaXQgPSAgICAgICAgICAgICAgICAweCUuNHhcbiIsIHdvcmQsIFBDSV9NRU1PUllfTElNSVQpOworCQlQUklOVCAoIiAgcHJlZmV0Y2ggbWVtb3J5IGJhc2UgPSAgICAgICAgMHglLjR4XG4iLCB3b3JkLCBQQ0lfUFJFRl9NRU1PUllfQkFTRSk7CisJCVBSSU5UICgiICBwcmVmZXRjaCBtZW1vcnkgbGltaXQgPSAgICAgICAweCUuNHhcbiIsIHdvcmQsIFBDSV9QUkVGX01FTU9SWV9MSU1JVCk7CisJCVBSSU5UICgiICBwcmVmZXRjaCBtZW1vcnkgYmFzZSB1cHBlciA9ICAweCUuOHhcbiIsIGR3b3JkLCBQQ0lfUFJFRl9CQVNFX1VQUEVSMzIpOworCQlQUklOVCAoIiAgcHJlZmV0Y2ggbWVtb3J5IGxpbWl0IHVwcGVyID0gMHglLjh4XG4iLCBkd29yZCwgUENJX1BSRUZfTElNSVRfVVBQRVIzMik7CisJCVBSSU5UICgiICBJTyBiYXNlIHVwcGVyIDE2IGJpdHMgPSAgICAgICAweCUuNHhcbiIsIHdvcmQsIFBDSV9JT19CQVNFX1VQUEVSMTYpOworCQlQUklOVCAoIiAgSU8gbGltaXQgdXBwZXIgMTYgYml0cyA9ICAgICAgMHglLjR4XG4iLCB3b3JkLCBQQ0lfSU9fTElNSVRfVVBQRVIxNik7CisJCVBSSU5UICgiICBleHBhbnNpb24gUk9NIGJhc2UgYWRkcmVzcyA9ICAweCUuOHhcbiIsIGR3b3JkLCBQQ0lfUk9NX0FERFJFU1MxKTsKKwkJUFJJTlQgKCIgIGludGVycnVwdCBsaW5lID0gICAgICAgICAgICAgIDB4JS4yeFxuIiwgYnl0ZSwgUENJX0lOVEVSUlVQVF9MSU5FKTsKKwkJUFJJTlQgKCIgIGludGVycnVwdCBwaW4gPSAgICAgICAgICAgICAgIDB4JS4yeFxuIiwgYnl0ZSwgUENJX0lOVEVSUlVQVF9QSU4pOworCQlQUklOVCAoIiAgYnJpZGdlIGNvbnRyb2wgPSAgICAgICAgICAgICAgMHglLjR4XG4iLCB3b3JkLCBQQ0lfQlJJREdFX0NPTlRST0wpOworICAgIH0gZWxzZSB7CQkJCQkvKiBQQ0kgZGV2aWNlICovCisJCVBSSU5UKCIgIGJhc2UgYWRkcmVzcyAyID0gICAgICAgICAgICAgIDB4JS44eFxuIiwgZHdvcmQsIFBDSV9CQVNFX0FERFJFU1NfMik7CisJCVBSSU5UKCIgIGJhc2UgYWRkcmVzcyAzID0gICAgICAgICAgICAgIDB4JS44eFxuIiwgZHdvcmQsIFBDSV9CQVNFX0FERFJFU1NfMyk7CisJCVBSSU5UKCIgIGJhc2UgYWRkcmVzcyA0ID0gICAgICAgICAgICAgIDB4JS44eFxuIiwgZHdvcmQsIFBDSV9CQVNFX0FERFJFU1NfNCk7CisJCVBSSU5UKCIgIGJhc2UgYWRkcmVzcyA1ID0gICAgICAgICAgICAgIDB4JS44eFxuIiwgZHdvcmQsIFBDSV9CQVNFX0FERFJFU1NfNSk7CisJCVBSSU5UKCIgIGNhcmRCdXMgQ0lTIHBvaW50ZXIgPSAgICAgICAgIDB4JS44eFxuIiwgZHdvcmQsIFBDSV9DQVJEQlVTX0NJUyk7CisJCVBSSU5UKCIgIHN1YiBzeXN0ZW0gdmVuZG9yIElEID0gICAgICAgIDB4JS40eFxuIiwgd29yZCwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQpOworCQlQUklOVCgiICBzdWIgc3lzdGVtIElEID0gICAgICAgICAgICAgICAweCUuNHhcbiIsIHdvcmQsIFBDSV9TVUJTWVNURU1fSUQpOworCQlQUklOVCgiICBleHBhbnNpb24gUk9NIGJhc2UgYWRkcmVzcyA9ICAweCUuOHhcbiIsIGR3b3JkLCBQQ0lfUk9NX0FERFJFU1MpOworCQlQUklOVCgiICBpbnRlcnJ1cHQgbGluZSA9ICAgICAgICAgICAgICAweCUuMnhcbiIsIGJ5dGUsIFBDSV9JTlRFUlJVUFRfTElORSk7CisJCVBSSU5UKCIgIGludGVycnVwdCBwaW4gPSAgICAgICAgICAgICAgIDB4JS4yeFxuIiwgYnl0ZSwgUENJX0lOVEVSUlVQVF9QSU4pOworCQlQUklOVCgiICBtaW4gR3JhbnQgPSAgICAgICAgICAgICAgICAgICAweCUuMnhcbiIsIGJ5dGUsIFBDSV9NSU5fR05UKTsKKwkJUFJJTlQoIiAgbWF4IExhdGVuY3kgPSAgICAgICAgICAgICAgICAgMHglLjJ4XG4iLCBieXRlLCBQQ0lfTUFYX0xBVCk7CisgICAgfQorCisjdW5kZWYgUFJJTlQKKyN1bmRlZiBQUklOVDIKK30KKworLyogQ29udmVydCB0aGUgImJ1cy5kZXZpY2UuZnVuY3Rpb24iIGlkZW50aWZpZXIgaW50byBhIG51bWJlci4KKyAqLworc3RhdGljIHBjaV9kZXZfdCBnZXRfcGNpX2RldihjaGFyKiBuYW1lKQoreworCWNoYXIgY251bVsxMl07CisJaW50IGxlbiwgaSwgaW9sZCwgbjsKKwlpbnQgYmRmc1szXSA9IHswLDAsMH07CisKKwlsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKGxlbiA+IDgpCisJCXJldHVybiAtMTsKKwlmb3IgKGkgPSAwLCBpb2xkID0gMCwgbiA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAobmFtZVtpXSA9PSAnLicpIHsKKwkJCW1lbWNweShjbnVtLCAmbmFtZVtpb2xkXSwgaSAtIGlvbGQpOworCQkJY251bVtpIC0gaW9sZF0gPSAnXDAnOworCQkJYmRmc1tuKytdID0gc2ltcGxlX3N0cnRvdWwoY251bSwgTlVMTCwgMTYpOworCQkJaW9sZCA9IGkgKyAxOworCQl9CisJfQorCXN0cmNweShjbnVtLCAmbmFtZVtpb2xkXSk7CisJaWYgKG4gPT0gMCkKKwkJbiA9IDE7CisJYmRmc1tuXSA9IHNpbXBsZV9zdHJ0b3VsKGNudW0sIE5VTEwsIDE2KTsKKwlyZXR1cm4gUENJX0JERihiZGZzWzBdLCBiZGZzWzFdLCBiZGZzWzJdKTsKK30KKworc3RhdGljIGludCBwY2lfY2ZnX2Rpc3BsYXkocGNpX2Rldl90IGJkZiwgdWxvbmcgYWRkciwgdWxvbmcgc2l6ZSwgdWxvbmcgbGVuZ3RoKQoreworI2RlZmluZSBESVNQX0xJTkVfTEVOCTE2CisJdWxvbmcgaSwgbmJ5dGVzLCBsaW5lYnl0ZXM7CisJaW50IHJjID0gMDsKKworCWlmIChsZW5ndGggPT0gMCkKKwkJbGVuZ3RoID0gMHg0MCAvIHNpemU7IC8qIFN0YW5kYXJkIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlICovCisKKwkvKiBQcmludCB0aGUgbGluZXMuCisJICogb25jZSwgYW5kIGFsbCBhY2Nlc3NlcyBhcmUgd2l0aCB0aGUgc3BlY2lmaWVkIGJ1cyB3aWR0aC4KKwkgKi8KKwluYnl0ZXMgPSBsZW5ndGggKiBzaXplOworCWRvIHsKKwkJdWludAl2YWw0OworCQl1c2hvcnQgIHZhbDI7CisJCXVfY2hhcgl2YWwxOworCisJCXByaW50ZigiJTA4bHg6IiwgYWRkcik7CisJCWxpbmVieXRlcyA9IChuYnl0ZXM+RElTUF9MSU5FX0xFTik/RElTUF9MSU5FX0xFTjpuYnl0ZXM7CisJCWZvciAoaT0wOyBpPGxpbmVieXRlczsgaSs9IHNpemUpIHsKKwkJCWlmIChzaXplID09IDQpIHsKKwkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYmRmLCBhZGRyLCAmdmFsNCk7CisJCQkJcHJpbnRmKCIgJTA4eCIsIHZhbDQpOworCQkJfSBlbHNlIGlmIChzaXplID09IDIpIHsKKwkJCQlwY2lfcmVhZF9jb25maWdfd29yZChiZGYsIGFkZHIsICZ2YWwyKTsKKwkJCQlwcmludGYoIiAlMDR4IiwgdmFsMik7CisJCQl9IGVsc2UgeworCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJkZiwgYWRkciwgJnZhbDEpOworCQkJCXByaW50ZigiICUwMngiLCB2YWwxKTsKKwkJCX0KKwkJCWFkZHIgKz0gc2l6ZTsKKwkJfQorCQlwcmludGYoIlxuIik7CisJCW5ieXRlcyAtPSBsaW5lYnl0ZXM7CisJCWlmIChjdHJsYygpKSB7CisJCQlyYyA9IDE7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKG5ieXRlcyA+IDApOworCisJcmV0dXJuIChyYyk7Cit9CisKK3N0YXRpYyBpbnQgcGNpX2NmZ193cml0ZSAocGNpX2Rldl90IGJkZiwgdWxvbmcgYWRkciwgdWxvbmcgc2l6ZSwgdWxvbmcgdmFsdWUpCit7CisJaWYgKHNpemUgPT0gNCkgeworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJkZiwgYWRkciwgdmFsdWUpOworCX0KKwllbHNlIGlmIChzaXplID09IDIpIHsKKwkJdXNob3J0IHZhbCA9IHZhbHVlICYgMHhmZmZmOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYmRmLCBhZGRyLCB2YWwpOworCX0KKwllbHNlIHsKKwkJdV9jaGFyIHZhbCA9IHZhbHVlICYgMHhmZjsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJkZiwgYWRkciwgdmFsKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BjaV9jZmdfbW9kaWZ5IChwY2lfZGV2X3QgYmRmLCB1bG9uZyBhZGRyLCB1bG9uZyBzaXplLCB1bG9uZyB2YWx1ZSwgaW50IGluY3JmbGFnKQoreworCXVsb25nCWk7CisJaW50CW5ieXRlczsKKwlleHRlcm4gY2hhciBjb25zb2xlX2J1ZmZlcltdOworCXVpbnQJdmFsNDsKKwl1c2hvcnQgIHZhbDI7CisJdV9jaGFyCXZhbDE7CisKKwkvKiBQcmludCB0aGUgYWRkcmVzcywgZm9sbG93ZWQgYnkgdmFsdWUuICBUaGVuIGFjY2VwdCBpbnB1dCBmb3IKKwkgKiB0aGUgbmV4dCB2YWx1ZS4gIEEgbm9uLWNvbnZlcnRlZCB2YWx1ZSBleGl0cy4KKwkgKi8KKwlkbyB7CisJCXByaW50ZigiJTA4bHg6IiwgYWRkcik7CisJCWlmIChzaXplID09IDQpIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChiZGYsIGFkZHIsICZ2YWw0KTsKKwkJCXByaW50ZigiICUwOHgiLCB2YWw0KTsKKwkJfQorCQllbHNlIGlmIChzaXplID09IDIpIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJkZiwgYWRkciwgJnZhbDIpOworCQkJcHJpbnRmKCIgJTA0eCIsIHZhbDIpOworCQl9CisJCWVsc2UgeworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoYmRmLCBhZGRyLCAmdmFsMSk7CisJCQlwcmludGYoIiAlMDJ4IiwgdmFsMSk7CisJCX0KKworCQluYnl0ZXMgPSByZWFkbGluZSAoIiA/ICIpOworCQlpZiAobmJ5dGVzID09IDAgfHwgKG5ieXRlcyA9PSAxICYmIGNvbnNvbGVfYnVmZmVyWzBdID09ICctJykpIHsKKwkJCS8qIDxDUj4gcHJlc3NlZCBhcyBvbmx5IGlucHV0LCBkb24ndCBtb2RpZnkgY3VycmVudAorCQkJICogbG9jYXRpb24gYW5kIG1vdmUgdG8gbmV4dC4gIi0iIHByZXNzZWQgd2lsbCBnbyBiYWNrLgorCQkJICovCisJCQlpZiAoaW5jcmZsYWcpCisJCQkJYWRkciArPSBuYnl0ZXMgPyAtc2l6ZSA6IHNpemU7CisJCQluYnl0ZXMgPSAxOworI2lmZGVmIENPTkZJR19CT09UX1JFVFJZX1RJTUUKKwkJCXJlc2V0X2NtZF90aW1lb3V0KCk7IC8qIGdvb2QgZW5vdWdoIHRvIG5vdCB0aW1lIG91dCAqLworI2VuZGlmCisJCX0KKyNpZmRlZiBDT05GSUdfQk9PVF9SRVRSWV9USU1FCisJCWVsc2UgaWYgKG5ieXRlcyA9PSAtMikgeworCQkJYnJlYWs7CS8qIHRpbWVkIG91dCwgZXhpdCB0aGUgY29tbWFuZAkqLworCQl9CisjZW5kaWYKKwkJZWxzZSB7CisJCQljaGFyICplbmRwOworCQkJaSA9IHNpbXBsZV9zdHJ0b3VsKGNvbnNvbGVfYnVmZmVyLCAmZW5kcCwgMTYpOworCQkJbmJ5dGVzID0gZW5kcCAtIGNvbnNvbGVfYnVmZmVyOworCQkJaWYgKG5ieXRlcykgeworI2lmZGVmIENPTkZJR19CT09UX1JFVFJZX1RJTUUKKwkJCQkvKiBnb29kIGVub3VnaCB0byBub3QgdGltZSBvdXQKKwkJCQkgKi8KKwkJCQlyZXNldF9jbWRfdGltZW91dCgpOworI2VuZGlmCisJCQkJcGNpX2NmZ193cml0ZSAoYmRmLCBhZGRyLCBzaXplLCBpKTsKKwkJCQlpZiAoaW5jcmZsYWcpCisJCQkJCWFkZHIgKz0gc2l6ZTsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKG5ieXRlcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUENJIENvbmZpZ3VyYXRpb24gU3BhY2UgYWNjZXNzIGNvbW1hbmRzCisgKgorICogU3ludGF4OgorICoJcGNpIGRpc3BsYXlbLmIsIC53LCAubF0gYnVzLmRldmljZS5mdW5jdGlvbn0gW2FkZHJdIFtsZW5dCisgKglwY2kgbmV4dFsuYiwgLncsIC5sXSBidXMuZGV2aWNlLmZ1bmN0aW9uIFthZGRyXQorICogICAgICBwY2kgbW9kaWZ5Wy5iLCAudywgLmxdIGJ1cy5kZXZpY2UuZnVuY3Rpb24gW2FkZHJdCisgKiAgICAgIHBjaSB3cml0ZVsuYiwgLncsIC5sXSBidXMuZGV2aWNlLmZ1bmN0aW9uIGFkZHIgdmFsdWUKKyAqLworaW50IGRvX3BjaSAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdWxvbmcgYWRkciA9IDAsIHZhbHVlID0gMCwgc2l6ZSA9IDA7CisJcGNpX2Rldl90IGJkZiA9IDA7CisJY2hhciBjbWQgPSAncyc7CisKKwlpZiAoYXJnYyA+IDEpCisJCWNtZCA9IGFyZ3ZbMV1bMF07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgJ2QnOgkJLyogZGlzcGxheSAqLworCWNhc2UgJ24nOgkJLyogbmV4dCAqLworCWNhc2UgJ20nOgkJLyogbW9kaWZ5ICovCisJY2FzZSAndyc6CQkvKiB3cml0ZSAqLworCQkvKiBDaGVjayBmb3IgYSBzaXplIHNwZWNpZmljYXRpb24uICovCisJCXNpemUgPSBjbWRfZ2V0X2RhdGFfc2l6ZShhcmd2WzFdLCA0KTsKKwkJaWYgKGFyZ2MgPiAzKQorCQkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKwkJaWYgKGFyZ2MgPiA0KQorCQkJdmFsdWUgPSBzaW1wbGVfc3RydG91bChhcmd2WzRdLCBOVUxMLCAxNik7CisJY2FzZSAnaCc6CQkvKiBoZWFkZXIgKi8KKwkJaWYgKGFyZ2MgPCAzKQorCQkJZ290byB1c2FnZTsKKwkJaWYgKChiZGYgPSBnZXRfcGNpX2Rldihhcmd2WzJdKSkgPT0gLTEpCisJCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIHNjYW4gYnVzICovCisJCXZhbHVlID0gMTsgLyogc2hvcnQgbGlzdGluZyAqLworCQliZGYgPSAwOyAgIC8qIGJ1cyBudW1iZXIgICovCisJCWlmIChhcmdjID4gMSkgeworCQkJaWYgKGFyZ3ZbYXJnYy0xXVswXSA9PSAnbCcpIHsKKwkJCQl2YWx1ZSA9IDA7CisJCQkJYXJnYy0tOworCQkJfQorCQkJaWYgKGFyZ2MgPiAxKQorCQkJCWJkZiA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKwkJfQorCQlwY2lpbmZvKGJkZiwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGFyZ3ZbMV1bMF0pIHsKKwljYXNlICdoJzoJCS8qIGhlYWRlciAqLworCQlwY2lfaGVhZGVyX3Nob3coYmRmKTsKKwkJcmV0dXJuIDA7CisJY2FzZSAnZCc6CQkvKiBkaXNwbGF5ICovCisJCXJldHVybiBwY2lfY2ZnX2Rpc3BsYXkoYmRmLCBhZGRyLCBzaXplLCB2YWx1ZSk7CisJY2FzZSAnbic6CQkvKiBuZXh0ICovCisJCWlmIChhcmdjIDwgNCkKKwkJCWdvdG8gdXNhZ2U7CisJCXJldHVybiBwY2lfY2ZnX21vZGlmeShiZGYsIGFkZHIsIHNpemUsIHZhbHVlLCAwKTsKKwljYXNlICdtJzoJCS8qIG1vZGlmeSAqLworCQlpZiAoYXJnYyA8IDQpCisJCQlnb3RvIHVzYWdlOworCQlyZXR1cm4gcGNpX2NmZ19tb2RpZnkoYmRmLCBhZGRyLCBzaXplLCB2YWx1ZSwgMSk7CisJY2FzZSAndyc6CQkvKiB3cml0ZSAqLworCQlpZiAoYXJnYyA8IDUpCisJCQlnb3RvIHVzYWdlOworCQlyZXR1cm4gcGNpX2NmZ193cml0ZShiZGYsIGFkZHIsIHNpemUsIHZhbHVlKTsKKwl9CisKKwlyZXR1cm4gMTsKKyB1c2FnZToKKwlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworfQorCisjZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENJKSAqLworCisjZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9wY21jaWEuYyBiL2NvbW1vbi9jbWRfcGNtY2lhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmMjFhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9jbWRfcGNtY2lhLmMKQEAgLTAsMCArMSwyMjQzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTG90cyBvZiBjb2RlIGNvcGllZCBmcm9tOgorICoKKyAqIG04eHhfcGNtY2lhLmMgLSBMaW51eCBQQ01DSUEgc29ja2V0IGRyaXZlciBmb3IgdGhlIG1wYzh4eCBzZXJpZXMuCisgKiAoQykgMTk5OS0yMDAwIE1hZ251cyBEYW1tIDxkYW1tQGJpdHNtYXJ0LmNvbT4KKyAqCisgKiAiVGhlIEV4Q0Egc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgc29ja2V0IGNvbnRyb2xsZXJzIHNob3VsZCBwcm92aWRlCisgKiB0d28gSU8gYW5kIGZpdmUgbWVtb3J5IHdpbmRvd3MgcGVyIHNvY2tldCwgd2hpY2ggY2FuIGJlIGluZGVwZW5kZW50bHkKKyAqIGNvbmZpZ3VyZWQgYW5kIHBvc2l0aW9uZWQgaW4gdGhlIGhvc3QgYWRkcmVzcyBzcGFjZSBhbmQgbWFwcGVkIHRvCisgKiBhcmJpdHJhcnkgc2VnbWVudHMgb2YgY2FyZCBhZGRyZXNzIHNwYWNlLiAiIC0gRGF2aWQgQSBIaW5kcy4gMTk5OQorICoKKyAqIFRoaXMgY29udHJvbGxlciBkb2VzIF9ub3RfIG1lZXQgdGhlIEV4Q0Egc3RhbmRhcmQuCisgKgorICogbTh4eCBwY21jaWEgY29udHJvbGxlciBicmllZiBpbmZvOgorICogKyA4IHdpbmRvd3MgKGF0dHJpYiwgbWVtLCBpL28pCisgKiArIHVwIHRvIHR3byBzbG90cyAoU0xPVF9BIGFuZCBTTE9UX0IpCisgKiArIGlucHV0cGlucywgb3V0cHV0cGlucywgZXZlbnQgYW5kIG1hc2sgcmVnaXN0ZXJzLgorICogLSBubyBvZmZzZXQgcmVnaXN0ZXIuIHNpZ2guCisgKgorICogQmVjYXVzZSBvZiB0aGUgbGFja2luZyBvZmZzZXQgcmVnaXN0ZXIgd2UgbXVzdCBtYXAgdGhlIHdob2xlIGNhcmQuCisgKiBXZSBhc3NpZ24gZWFjaCBtZW1vcnkgd2luZG93IFBDTUNJQV9NRU1fV0lOX1NJWkUgYWRkcmVzcyBzcGFjZS4KKyAqIE1ha2Ugc3VyZSB0aGVyZSBpcyAoUENNQ0lBX01FTV9XSU5fU0laRSAqIFBDTUNJQV9NRU1fV0lOX05PCisgKiAqIFBDTUNJQV9TT0NLRVRTX05PKSBieXRlcyBhdCBQQ01DSUFfTUVNX1dJTl9CQVNFLgorICogVGhlIGkvbyB3aW5kb3dzIGFyZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYXQgUENNQ0lBX0lPX1dJTl9CQVNFLgorICogVGhleSBhcmUgbWF4aW11bSA2NEtCeXRlIGVhY2guLi4KKyAqLworCisvKiAjZGVmaW5lIERFQlVHCTEJKi8KKworLyoKKyAqIFBDTUNJQSBzdXBwb3J0CisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cGNtY2lhLmg+CisjaW5jbHVkZSA8Y21kX3BjbWNpYS5oPgorI2lmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKSAmJiBkZWZpbmVkKENPTkZJR184eHgpCisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19MV01PTikKKyNpbmNsdWRlIDxpMmMuaD4KKyNlbmRpZgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKSB8fCBcCisgICAgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpKQorCitpbnQgcGNtY2lhX29uICh2b2lkKTsKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKK3N0YXRpYyBpbnQgIHBjbWNpYV9vZmYgKHZvaWQpOworc3RhdGljIGludCAgaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgIGhhcmR3YXJlX2VuYWJsZSAoaW50IHNsb3QpOworc3RhdGljIGludCAgdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApOworI2lmZGVmIENPTkZJR19JREVfOHh4X1BDQ0FSRAorc3RhdGljIHZvaWQgcHJpbnRfZnVuY2lkIChpbnQgZnVuYyk7CitzdGF0aWMgdm9pZCBwcmludF9maXhlZCAgKHZvbGF0aWxlIHVjaGFyICpwKTsKK3N0YXRpYyBpbnQgIGlkZW50aWZ5ICAgICAodm9sYXRpbGUgdWNoYXIgKnApOworc3RhdGljIGludCAgY2hlY2tfaWRlX2RldmljZSAodm9pZCk7CisjZW5kaWYJLyogQ09ORklHX0lERV84eHhfUENDQVJEICovCisKK3N0YXRpYyB1X2ludCBtOHh4X2dldF9ncmF5Y29kZSh1X2ludCBzaXplKTsKKyNpZiAwCitzdGF0aWMgdV9pbnQgbTh4eF9nZXRfc3BlZWQodV9pbnQgbnMsIHVfaW50IGlzX2lvKTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGxvb2sgdXAgdGFibGUgZm9yIHBnY3J4IHJlZ2lzdGVycyAqLworCitzdGF0aWMgdV9pbnQgKnBjbWNpYV9wZ2NyeFsyXSA9IHsKKwkmKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9wY21jaWEucGNtY19wZ2NyYSwKKwkmKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9wY21jaWEucGNtY19wZ2NyYiwKK307CisKKyNkZWZpbmUgUENNQ0lBX1BHQ1JYKHNsb3QpCSgqcGNtY2lhX3BnY3J4W3Nsb3RdKQorCitjb25zdCBjaGFyICppbmRlbnQgPSAiXHQgICAiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisKK2ludCBkb19waW5pdCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IHJjb2RlID0gMDsKKworCWlmIChhcmdjICE9IDIpIHsKKwkJcHJpbnRmICgiVXNhZ2U6IHBpbml0IHtvbiB8IG9mZn1cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHN0cmNtcChhcmd2WzFdLCJvbiIpID09IDApIHsKKwkgICAgIAlyY29kZSA9IHBjbWNpYV9vbiAoKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCJvZmYiKSA9PSAwKSB7CisJCXJjb2RlID0gcGNtY2lhX29mZiAoKTsKKwl9IGVsc2UgeworCQlwcmludGYgKCJVc2FnZTogcGluaXQge29uIHwgb2ZmfVxuIik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiByY29kZTsKK30KKyNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19MV01PTikKKyMgZGVmaW5lICBDRkdfUENNQ0lBX1RJTUlORwkoUENNQ0lBX1NIVCg5KSB8IFBDTUNJQV9TU1QoMykgfCBQQ01DSUFfU0woMTIpKQorI2Vsc2UKKyMgZGVmaW5lICBDRkdfUENNQ0lBX1RJTUlORwkoUENNQ0lBX1NIVCgyKSB8IFBDTUNJQV9TU1QoNCkgfCBQQ01DSUFfU0woOSkpCisjZW5kaWYKKworaW50IHBjbWNpYV9vbiAodm9pZCkKK3sKKwlpbnQgaTsKKwl1X2xvbmcgcmVnLCBiYXNlOworCXBjbWNpYV93aW5fdCAqd2luOworCisJZGVidWcgKCJFbmFibGUgUENNQ0lBICIgUENNQ0lBX1NMT1RfTVNHICJcbiIpOworCisJLyogaW50aWFsaXplIHRoZSBmaXhlZCBtZW1vcnkgd2luZG93cyAqLworCXdpbiA9IChwY21jaWFfd2luX3QgKikoJigoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fcGNtY2lhLnBjbWNfcGJyMCk7CisJYmFzZSA9IENGR19QQ01DSUFfTUVNX0FERFI7CisKKwlpZigocmVnID0gbTh4eF9nZXRfZ3JheWNvZGUoQ0ZHX1BDTUNJQV9NRU1fU0laRSkpID09IC0xKSB7CisJCXByaW50ZiAoIkNhbm5vdCBzZXQgd2luZG93IHNpemUgdG8gMHglMDh4XG4iLAorCQkJQ0ZHX1BDTUNJQV9NRU1fU0laRSk7CisJCXJldHVybiAoMSk7CisJfQorCisJZm9yIChpPTA7IGk8UENNQ0lBX01FTV9XSU5fTk87ICsraSkgeworCQl3aW4tPmJyID0gYmFzZTsKKworCQlzd2l0Y2ggKGkpIHsKKyNpZmRlZiBDT05GSUdfSURFXzh4eF9QQ0NBUkQKKwkJY2FzZSAwOgl7CS8qIG1hcCBhdHRyaWJ1dGUgbWVtb3J5ICovCisJCQl3aW4tPm9yID0gKAlQQ01DSUFfQlNJWkVfNjRNCisJCQkJfAlQQ01DSUFfUFBTXzgKKwkJCQl8CVBDTUNJQV9QUlNfQVRUUgorCQkJCXwJUENNQ0lBX1NMT1RfeAorCQkJCXwJUENNQ0lBX1BWCisJCQkJfAlDRkdfUENNQ0lBX1RJTUlORyApOworCQkJYnJlYWs7CisJCSAgICB9CisKKwkJY2FzZSAxOiB7CS8qIG1hcCBJL08gd2luZG93IGZvciBkYXRhIHJlZyAqLworCQkJd2luLT5vciA9ICgJUENNQ0lBX0JTSVpFXzFLCisJCQkJfAlQQ01DSUFfUFBTXzE2CisJCQkJfAlQQ01DSUFfUFJTX0lPCisJCQkJfAlQQ01DSUFfU0xPVF94CisJCQkJfAlQQ01DSUFfUFYKKwkJCQl8CUNGR19QQ01DSUFfVElNSU5HICk7CisJCQlicmVhazsKKwkJICAgIH0KKworCQljYXNlIDI6IHsJLyogbWFwIEkvTyB3aW5kb3cgZm9yIGNvbW1hbmQvY3RybCByZWcgYmxvY2sgKi8KKwkJCXdpbi0+b3IgPSAoCVBDTUNJQV9CU0laRV8xSworCQkJCXwJUENNQ0lBX1BQU184CisJCQkJfAlQQ01DSUFfUFJTX0lPCisJCQkJfAlQQ01DSUFfU0xPVF94CisJCQkJfAlQQ01DSUFfUFYKKwkJCQl8CUNGR19QQ01DSUFfVElNSU5HICk7CisJCQlicmVhazsKKwkJICAgIH0KKyNlbmRpZgkvKiBDT05GSUdfSURFXzh4eF9QQ0NBUkQgKi8KKwkJZGVmYXVsdDoJLyogc2V0IHRvIG5vdCB2YWxpZCAqLworCQkJd2luLT5vciA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWRlYnVnICgiTWVtV2luICVkOiBQQlIgMHglMDhsWCAgUE9SICUwOGxYXG4iLAorCQkJaSwgd2luLT5iciwgd2luLT5vcik7CisJCWJhc2UgKz0gQ0ZHX1BDTUNJQV9NRU1fU0laRTsKKwkJKyt3aW47CisJfQorCisJLyogdHVybiBvZmYgdm9sdGFnZSAqLworCWlmICh2b2x0YWdlX3NldChfc2xvdF8sIDAsIDApKQorCQlyZXR1cm4gKDEpOworCisJLyogRW5hYmxlIGV4dGVybmFsIGhhcmR3YXJlICovCisJaWYgKGhhcmR3YXJlX2VuYWJsZShfc2xvdF8pKQorCQlyZXR1cm4gKDEpOworCisjaWZkZWYgQ09ORklHX0lERV84eHhfUENDQVJECisJaWYgKGNoZWNrX2lkZV9kZXZpY2UoKSkKKwkJcmV0dXJuICgxKTsKKyNlbmRpZgorCXJldHVybiAoMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKworc3RhdGljIGludCBwY21jaWFfb2ZmICh2b2lkKQoreworCWludCBpOworCXBjbWNpYV93aW5fdCAqd2luOworCisJcHJpbnRmICgiRGlzYWJsZSBQQ01DSUEgIiBQQ01DSUFfU0xPVF9NU0cgIlxuIik7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdGUsIGFuZCBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX3BjbWNpYS5wY21jX3BzY3IgPSAgUENNQ0lBX01BU0soX3Nsb3RfKTsKKwkoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX3BjbWNpYS5wY21jX3BlciAmPSB+UENNQ0lBX01BU0soX3Nsb3RfKTsKKworCS8qIHR1cm4gb2ZmIGludGVycnVwdCBhbmQgZGlzYWJsZSBDeE9FICovCisJUENNQ0lBX1BHQ1JYKF9zbG90XykgPSBfX01ZX1BDTUNJQV9HQ1JYX0NYT0U7CisKKwkvKiB0dXJuIG9mZiBtZW1vcnkgd2luZG93cyAqLworCXdpbiA9IChwY21jaWFfd2luX3QgKikoJigoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fcGNtY2lhLnBjbWNfcGJyMCk7CisKKwlmb3IgKGk9MDsgaTxQQ01DSUFfTUVNX1dJTl9OTzsgKytpKSB7CisJCS8qIGRpc2FibGUgbWVtb3J5IHdpbmRvdyAqLworCQl3aW4tPm9yID0gMDsKKwkJKyt3aW47CisJfQorCisJLyogdHVybiBvZmYgdm9sdGFnZSAqLworCXZvbHRhZ2Vfc2V0KF9zbG90XywgMCwgMCk7CisKKwkvKiBkaXNhYmxlIGV4dGVybmFsIGhhcmR3YXJlICovCisJcHJpbnRmICgiU2h1dGRvd24gYW5kIFBvd2Vyb2ZmICIgUENNQ0lBX1NMT1RfTVNHICJcbiIpOworCWhhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19JREVfOHh4X1BDQ0FSRAorCisjZGVmaW5lCU1BWF9UVVBFTF9TWgk1MTIKKyNkZWZpbmUgTUFYX0ZFQVRVUkVTCTQKKworc3RhdGljIGludCBjaGVja19pZGVfZGV2aWNlICh2b2lkKQoreworCXZvbGF0aWxlIHVjaGFyICppZGVudCA9IE5VTEw7CisJdm9sYXRpbGUgdWNoYXIgKmZlYXR1cmVfcFtNQVhfRkVBVFVSRVNdOworCXZvbGF0aWxlIHVjaGFyICpwLCAqc3RhcnQ7CisJaW50IG5fZmVhdHVyZXMgPSAwOworCXVjaGFyIGZ1bmNfaWQgPSB+MDsKKwl1Y2hhciBjb2RlLCBsZW47CisJdXNob3J0IGNvbmZpZ19iYXNlID0gMDsKKwlpbnQgZm91bmQgPSAwOworCWludCBpOworCisJZGVidWcgKCJQQ01DSUEgTUVNOiAlMDhYXG4iLCBDRkdfUENNQ0lBX01FTV9BRERSKTsKKworCXN0YXJ0ID0gcCA9ICh2b2xhdGlsZSB1Y2hhciAqKSBDRkdfUENNQ0lBX01FTV9BRERSOworCisJd2hpbGUgKChwIC0gc3RhcnQpIDwgTUFYX1RVUEVMX1NaKSB7CisKKwkJY29kZSA9ICpwOyBwICs9IDI7CisKKwkJaWYgKGNvZGUgPT0gMHhGRikgeyAvKiBFbmQgb2YgY2hhaW4gKi8KKwkJCWJyZWFrOworCQl9CisKKwkJbGVuID0gKnA7IHAgKz0gMjsKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiAoREVCVUcgPiAxKQorCQl7IHZvbGF0aWxlIHVjaGFyICpxID0gcDsKKwkJCXByaW50ZiAoIlxuVHVwbGUgY29kZSAlMDJ4ICBsZW5ndGggJWRcblx0RGF0YToiLAorCQkJCWNvZGUsIGxlbik7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQkJCXByaW50ZiAoIiAlMDJ4IiwgKnEpOworCQkJCXErPSAyOworCQkJfQorCQl9CisjZW5kaWYJLyogREVCVUcgKi8KKwkJc3dpdGNoIChjb2RlKSB7CisJCWNhc2UgQ0lTVFBMX1ZFUlNfMToKKwkJCWlkZW50ID0gcCArIDQ7CisJCQlicmVhazsKKwkJY2FzZSBDSVNUUExfRlVOQ0lEOgorCQkJLyogRml4IGZvciBicm9rZW4gU2FuRGlzayB3aGljaCBtYXkgaGF2ZSAweDgwIGJpdCBzZXQgKi8KKwkJCWZ1bmNfaWQgPSAqcCAmIDB4N0Y7CisJCQlicmVhazsKKwkJY2FzZSBDSVNUUExfRlVOQ0U6CisJCQlpZiAobl9mZWF0dXJlcyA8IE1BWF9GRUFUVVJFUykKKwkJCQlmZWF0dXJlX3Bbbl9mZWF0dXJlcysrXSA9IHA7CisJCQlicmVhazsKKwkJY2FzZSBDSVNUUExfQ09ORklHOgorCQkJY29uZmlnX2Jhc2UgPSAoKihwKzYpIDw8IDgpICsgKCoocCs0KSk7CisJCQlkZWJ1ZyAoIlxuIyMgQ29uZmlnX2Jhc2UgPSAlMDR4ICMjI1xuIiwgY29uZmlnX2Jhc2UpOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcCArPSAyICogbGVuOworCX0KKworCWZvdW5kID0gaWRlbnRpZnkgKGlkZW50KTsKKworCWlmIChmdW5jX2lkICE9ICgodWNoYXIpfjApKSB7CisJCXByaW50X2Z1bmNpZCAoZnVuY19pZCk7CisKKwkJaWYgKGZ1bmNfaWQgPT0gQ0lTVFBMX0ZVTkNJRF9GSVhFRCkKKwkJCWZvdW5kID0gMTsKKwkJZWxzZQorCQkJcmV0dXJuICgxKTsJLyogbm8gZGlzayBkcml2ZSAqLworCX0KKworCWZvciAoaT0wOyBpPG5fZmVhdHVyZXM7ICsraSkgeworCQlwcmludF9maXhlZCAoZmVhdHVyZV9wW2ldKTsKKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCXByaW50ZiAoInVua25vd24gY2FyZCB0eXBlXG4iKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKiBzZXQgSS9PIGFyZWEgaW4gY29uZmlnIHJlZyAtPiBvbmx5IHZhbGlkIGZvciBBUkdPU1kgRDUhISEgKi8KKwkqKCh1Y2hhciAqKShDRkdfUENNQ0lBX01FTV9BRERSICsgY29uZmlnX2Jhc2UpKSA9IDE7CisKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCS8qIENPTkZJR19JREVfOHh4X1BDQ0FSRCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogYm9hcmQgc3BlY2lmaWMgc3R1ZmY6CQkJCQkJCSovCisvKiB2b2x0YWdlX3NldCgpLCBoYXJkd2FyZV9lbmFibGUoKSBhbmQgaGFyZHdhcmVfZGlzYWJsZSgpCQkJKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUlBYIEJvYXJkcyBmcm9tIEVtYmVkZGVkIFBsYW5ldAkJCQkJCSovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19SUFhDTEFTU0lDKSB8fCBkZWZpbmVkKENPTkZJR19SUFhMSVRFKQorCisvKiBUaGUgUlBYIGJvYXJkcyBzZWVtcyB0byBoYXZlIGl0J3MgYnVzIG1vbml0b3IgdGltZW91dCBzZXQgdG8gNio4IGNsb2Nrcy4KKyAqIFNZUENSIGlzIHdyaXRlIG9uY2Ugb25seSwgdGhlcmVmb3JlIG11c3QgdGhlIHNsb3dlc3QgbWVtb3J5IGJlIGZhc3RlcgorICogdGhhbiB0aGUgYnVzIG1vbml0b3Igb3Igd2Ugd2lsbCBnZXQgYSBtYWNoaW5lIGNoZWNrIGR1ZSB0byB0aGUgYnVzIHRpbWVvdXQuCisgKi8KKworI2RlZmluZSBQQ01DSUFfQk9BUkRfTVNHICJSUFggQ0xBU1NJQyBvciBSUFggTElURSIKKworI3VuZGVmIFBDTUNJQV9CTVRfTElNSVQKKyNkZWZpbmUgUENNQ0lBX0JNVF9MSU1JVCAoNio4KQorCitzdGF0aWMgaW50IHZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQoreworCXVfbG9uZyByZWcgPSAwOworCisJc3dpdGNoKHZjYykgeworCWNhc2UgMDogYnJlYWs7CisJY2FzZSAzMzogcmVnIHw9IEJDU1IxX1BDVkNUTDQ7IGJyZWFrOworCWNhc2UgNTA6IHJlZyB8PSBCQ1NSMV9QQ1ZDVEw1OyBicmVhazsKKwlkZWZhdWx0OiByZXR1cm4gMTsKKwl9CisKKwlzd2l0Y2godnBwKSB7CisJY2FzZSAwOiBicmVhazsKKwljYXNlIDMzOgorCWNhc2UgNTA6CisJCWlmKHZjYyA9PSB2cHApCisJCQlyZWcgfD0gQkNTUjFfUENWQ1RMNjsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJCWJyZWFrOworCWNhc2UgMTIwOgorCQlyZWcgfD0gQkNTUjFfUENWQ1RMNzsKKwlkZWZhdWx0OiByZXR1cm4gMTsKKwl9CisKKwlpZih2Y2MgPT0gMTIwKQorCSAgIHJldHVybiAxOworCisJLyogZmlyc3QsIHR1cm4gb2ZmIGFsbCBwb3dlciAqLworCisJKigodWludCAqKVJQWF9DU1JfQUREUikgJj0gfihCQ1NSMV9QQ1ZDVEw0IHwgQkNTUjFfUENWQ1RMNQorCQkJCSAgICAgfCBCQ1NSMV9QQ1ZDVEw2IHwgQkNTUjFfUENWQ1RMNyk7CisKKwkvKiBlbmFibGUgbmV3IHBvd2Vyc2V0dGluZ3MgKi8KKworCSooKHVpbnQgKilSUFhfQ1NSX0FERFIpIHw9IHJlZzsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIHNvY2tldF9nZXQoX3Nsb3RfKSBQQ01DSUFfU09DS0VUX0tFWV81Vgorc3RhdGljIGludCBoYXJkd2FyZV9lbmFibGUgKGludCBzbG90KQoreworCXJldHVybiAwOwkvKiBObyBoYXJkd2FyZSB0byBlbmFibGUgKi8KK30KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCitzdGF0aWMgaW50IGhhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCit7CisJcmV0dXJuIDA7CS8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KK30KKyNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCS8qIENPTkZJR19SUFhDTEFTU0lDICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIChGKUFEUyBCb2FyZHMgZnJvbSBNb3Rvcm9sYQkJCQkJCQkqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQURTKSB8fCBkZWZpbmVkKENPTkZJR19GQURTKQorCisjaWZkZWYgQ09ORklHX0FEUworI2RlZmluZSBQQ01DSUFfQk9BUkRfTVNHICJBRFMiCisjZGVmaW5lIFBDTUNJQV9HTElUQ0hZX0NEICAvKiBNeSBBRFMgYm9hcmQgbmVlZHMgdGhpcyAqLworI2Vsc2UKKyNkZWZpbmUgUENNQ0lBX0JPQVJEX01TRyAiRkFEUyIKKyNlbmRpZgorCitzdGF0aWMgaW50IHZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQoreworCXVfbG9uZyByZWcgPSAwOworCisJc3dpdGNoKHZwcCkgeworCWNhc2UgMDogcmVnID0gMDsgYnJlYWs7CisJY2FzZSA1MDogcmVnID0gMTsgYnJlYWs7CisJY2FzZSAxMjA6IHJlZyA9IDI7IGJyZWFrOworCWRlZmF1bHQ6IHJldHVybiAxOworCX0KKworCXN3aXRjaCh2Y2MpIHsKKwljYXNlIDA6IHJlZyA9IDA7IGJyZWFrOworI2lmZGVmIENPTkZJR19BRFMKKwljYXNlIDUwOiByZWcgPSBCQ1NSMV9QQ0NWQ0NPTjsgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkFEUworCWNhc2UgMzM6IHJlZyA9IEJDU1IxX1BDQ1ZDQzAgfCBCQ1NSMV9QQ0NWQ0MxOyBicmVhazsKKwljYXNlIDUwOiByZWcgPSBCQ1NSMV9QQ0NWQ0MxOyBicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6IHJldHVybiAxOworCX0KKworCS8qIGZpcnN0LCB0dXJuIG9mZiBhbGwgcG93ZXIgKi8KKworI2lmZGVmIENPTkZJR19BRFMKKwkqKCh1aW50ICopQkNTUjEpIHw9IEJDU1IxX1BDQ1ZDQ09OOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZBRFMKKwkqKCh1aW50ICopQkNTUjEpICY9IH4oQkNTUjFfUENDVkNDMCB8IEJDU1IxX1BDQ1ZDQzEpOworI2VuZGlmCisJKigodWludCAqKUJDU1IxKSAmPSB+QkNTUjFfUENDVlBQX01BU0s7CisKKwkvKiBlbmFibGUgbmV3IHBvd2Vyc2V0dGluZ3MgKi8KKworI2lmZGVmIENPTkZJR19BRFMKKwkqKCh1aW50ICopQkNTUjEpICY9IH5yZWc7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkFEUworCSooKHVpbnQgKilCQ1NSMSkgfD0gcmVnOworI2VuZGlmCisKKyAJKigodWludCAqKUJDU1IxKSB8PSByZWcgPDwgMjA7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBzb2NrZXRfZ2V0KF9zbG90XykgUENNQ0lBX1NPQ0tFVF9LRVlfNVYKKworc3RhdGljIGludCBoYXJkd2FyZV9lbmFibGUoaW50IHNsb3QpCit7CisJKigodWludCAqKUJDU1IxKSAmPSB+QkNTUjFfUENDRU47CisJcmV0dXJuIDA7Cit9CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCitzdGF0aWMgaW50IGhhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCit7CisJKigodWludCAqKUJDU1IxKSAmPSB+QkNTUjFfUENDRU47CisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKworI2VuZGlmCS8qIChGKUFEUyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUUU04eHhMIEJvYXJkcyBieSBUUSBDb21wb25lbnRzCQkJCQkJKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1RRTTh4eEwpCisKKyNkZWZpbmUgUENNQ0lBX0JPQVJEX01TRyAiVFFNOHh4TCIKKworCitzdGF0aWMgaW50IGhhcmR3YXJlX2VuYWJsZShpbnQgc2xvdCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKKwl2b2xhdGlsZSBjcG04eHhfdAkqY3A7CisJdm9sYXRpbGUgcGNtY29uZjh4eF90CSpwY21wOworCXZvbGF0aWxlIHN5c2NvbmY4eHhfdAkqc3lzcDsKKwl1aW50IHJlZywgbWFzazsKKworCWRlYnVnICgiaGFyZHdhcmVfZW5hYmxlOiAiIFBDTUNJQV9CT0FSRF9NU0cgIiBTbG90ICVjXG4iLCAnQScrc2xvdCk7CisKKwl1ZGVsYXkoMTAwMDApOworCisJaW1tYXAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworCXN5c3AgID0gKHN5c2NvbmY4eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fc2l1X2NvbmYpKTsKKwlwY21wICA9IChwY21jb25mOHh4X3QgKikoJigoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX3BjbWNpYSkpOworCWNwICAgID0gKGNwbTh4eF90ICopKCYoKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9jcG0pKTsKKworCS8qCisJICogQ29uZmlndXJlIFNJVU1DUiB0byBlbmFibGUgUENNQ0lBIHBvcnQgQgorCSAqIChWRkxTWzA6MV0gYXJlIG5vdCB1c2VkIGZvciBkZWJ1Z2dpbmcsIHdlIGNvbm5lY3QgRlJaIyBpbnN0ZWFkKQorCSAqLworCXN5c3AtPnNjX3NpdW1jciAmPSB+U0lVTUNSX0RCR0MxMTsJLyogc2V0IERCR0MgdG8gMDAgKi8KKworCS8qIGNsZWFyIGludGVycnVwdCBzdGF0ZSwgYW5kIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXBjbXAtPnBjbWNfcHNjciA9ICBQQ01DSUFfTUFTSyhfc2xvdF8pOworCXBjbXAtPnBjbWNfcGVyICY9IH5QQ01DSUFfTUFTSyhfc2xvdF8pOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICYgRE1BICovCisJUENNQ0lBX1BHQ1JYKF9zbG90XykgPSAwOworCisJLyoKKwkgKiBEaXNhYmxlIFBDTUNJQSBidWZmZXJzIChpc29sYXRlIHRoZSBpbnRlcmZhY2UpCisJICogYW5kIGFzc2VydCBSRVNFVCBzaWduYWwKKwkgKi8KKwlkZWJ1ZyAoIkRpc2FibGUgUENNQ0lBIGJ1ZmZlcnMgYW5kIGFzc2VydCBSRVNFVFxuIik7CisJcmVnICA9ICBQQ01DSUFfUEdDUlgoX3Nsb3RfKTsKKwlyZWcgfD0gIF9fTVlfUENNQ0lBX0dDUlhfQ1hSRVNFVDsJLyogYWN0aXZlIGhpZ2ggKi8KKwlyZWcgfD0gIF9fTVlfUENNQ0lBX0dDUlhfQ1hPRTsJCS8qIGFjdGl2ZSBsb3cgICovCisJUENNQ0lBX1BHQ1JYKF9zbG90XykgPSByZWc7CisJdWRlbGF5KDUwMCk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBQb3J0IEMgcGlucyBmb3IKKwkgKiA1IFZvbHRzIEVuYWJsZSBhbmQgMyBWb2x0cyBlbmFibGUKKwkgKi8KKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY3BhciAmPSB+KDB4MDAwMiB8IDB4MDAwNCk7CisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNzbyAgJj0gfigweDAwMDIgfCAweDAwMDQpOworCS8qIHJlbW92ZSBhbGwgcG93ZXIgKi8KKworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGF0ICY9IH4oMHgwMDAyIHwgMHgwMDA0KTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIGlzIGEgY2FyZCBpbiB0aGUgc2xvdCwgdGhlbiBjb25maWd1cmUgdGhlIGludGVyZmFjZS4KKwkgKi8KKwl1ZGVsYXkoMTAwMDApOworCWRlYnVnICgiWyVkXSAlczogUElQUiglcCk9MHgleFxuIiwKKwkJX19MSU5FX18sX19GVU5DVElPTl9fLAorCQkmKHBjbXAtPnBjbWNfcGlwcikscGNtcC0+cGNtY19waXByKTsKKwlpZiAocGNtcC0+cGNtY19waXByICYgMHgwMDAwMTgwMCkgeworCQlwcmludGYgKCIgICBObyBDYXJkIGZvdW5kXG4iKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKgorCSAqIFBvd2VyIE9uLgorCSAqLworCW1hc2sgPSBQQ01DSUFfVlMxKHNsb3QpIHwgUENNQ0lBX1ZTMihzbG90KTsKKwlyZWcgID0gcGNtcC0+cGNtY19waXByOworCWRlYnVnICgiUElQUjogMHgleCA9PT4gVlMxPW8lcywgVlMyPW8lc1xuIiwKKwkJcmVnLAorCQkocmVnJlBDTUNJQV9WUzEoc2xvdCkpPyJuIjoiZmYiLAorCQkocmVnJlBDTUNJQV9WUzIoc2xvdCkpPyJuIjoiZmYiKTsKKwlpZiAoKHJlZyAmIG1hc2spID09IG1hc2spIHsKKwkJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkYXQgfD0gMHgwMDA0OworCQlwdXRzICgiIDUuMFYgY2FyZCBmb3VuZDogIik7CisJfSBlbHNlIHsKKwkJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkYXQgfD0gMHgwMDAyOworCQlwdXRzICgiIDMuM1YgY2FyZCBmb3VuZDogIik7CisJfQorCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGlyIHw9ICAoMHgwMDAyIHwgMHgwMDA0KTsKKyNpZiAwCisJLyogIFZDQyBzd2l0Y2ggZXJyb3IgZmxhZywgUENNQ0lBIHNsb3QgSU5QQUNLXyBwaW4gKi8KKwljcC0+Y3BfcGJkaXIgJj0gfigweDAwMjAgfCAweDAwMTApOworCWNwLT5jcF9wYnBhciAmPSB+KDB4MDAyMCB8IDB4MDAxMCk7CisJdWRlbGF5KDUwMDAwMCk7CisjZW5kaWYKKwl1ZGVsYXkoMTAwMCk7CisJZGVidWcgKCJFbmFibGUgUENNQ0lBIGJ1ZmZlcnMgYW5kIHN0b3AgUkVTRVRcbiIpOworCXJlZyAgPSAgUENNQ0lBX1BHQ1JYKF9zbG90Xyk7CisJcmVnICY9IH5fX01ZX1BDTUNJQV9HQ1JYX0NYUkVTRVQ7CS8qIGFjdGl2ZSBoaWdoICovCisJcmVnICY9IH5fX01ZX1BDTUNJQV9HQ1JYX0NYT0U7CQkvKiBhY3RpdmUgbG93ICAqLworCVBDTUNJQV9QR0NSWChfc2xvdF8pID0gcmVnOworCisJdWRlbGF5KDI1MDAwMCk7CS8qIHNvbWUgY2FyZHMgbmVlZCA+MTUwIG1zIHRvIGNvbWUgdXAgOi0oICovCisKKwlkZWJ1ZyAoIiMgaGFyZHdhcmVfZW5hYmxlIGRvbmVcbiIpOworCisJcmV0dXJuICgwKTsKK30KKworCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCitzdGF0aWMgaW50IGhhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCit7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CisJdm9sYXRpbGUgcGNtY29uZjh4eF90CSpwY21wOworCXVfbG9uZyByZWc7CisKKwlkZWJ1ZyAoImhhcmR3YXJlX2Rpc2FibGU6ICIgUENNQ0lBX0JPQVJEX01TRyAiIFNsb3QgJWNcbiIsICdBJytzbG90KTsKKworCWltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKwlwY21wID0gKHBjbWNvbmY4eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fcGNtY2lhKSk7CisKKwkvKiByZW1vdmUgYWxsIHBvd2VyICovCisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkYXQgJj0gfigweDAwMDIgfCAweDAwMDQpOworCisJLyogQ29uZmlndXJlIFBDTUNJQSBHZW5lcmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IDA7CisKKwlkZWJ1ZyAoIkRpc2FibGUgUENNQ0lBIGJ1ZmZlcnMgYW5kIGFzc2VydCBSRVNFVFxuIik7CisJcmVnICA9ICBQQ01DSUFfUEdDUlgoX3Nsb3RfKTsKKwlyZWcgfD0gX19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworCXJlZyB8PSBfX01ZX1BDTUNJQV9HQ1JYX0NYT0U7CQkvKiBhY3RpdmUgbG93ICAqLworCVBDTUNJQV9QR0NSWChfc2xvdF8pID0gcmVnOworCisJdWRlbGF5KDEwMDAwKTsKKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKworCisKK3N0YXRpYyBpbnQgdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCit7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CisJdm9sYXRpbGUgcGNtY29uZjh4eF90CSpwY21wOworCXVfbG9uZyByZWc7CisKKwlkZWJ1ZyAoInZvbHRhZ2Vfc2V0OiAiCisJCVBDTUNJQV9CT0FSRF9NU0cKKwkJIiBTbG90ICVjLCBWY2M9JWQuJWQsIFZwcD0lZC4lZFxuIiwKKwkJJ0EnK3Nsb3QsIHZjYy8xMCwgdmNjJTEwLCB2cHAvMTAsIHZjYyUxMCk7CisKKwlpbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJcGNtcCA9IChwY21jb25mOHh4X3QgKikoJigoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX3BjbWNpYSkpOworCS8qCisJICogRGlzYWJsZSBQQ01DSUEgYnVmZmVycyAoaXNvbGF0ZSB0aGUgaW50ZXJmYWNlKQorCSAqIGFuZCBhc3NlcnQgUkVTRVQgc2lnbmFsCisJICovCisJZGVidWcgKCJEaXNhYmxlIFBDTUNJQSBidWZmZXJzIGFuZCBhc3NlcnQgUkVTRVRcbiIpOworCXJlZyAgPSAgUENNQ0lBX1BHQ1JYKF9zbG90Xyk7CisJcmVnIHw9ICBfX01ZX1BDTUNJQV9HQ1JYX0NYUkVTRVQ7CS8qIGFjdGl2ZSBoaWdoICovCisJcmVnIHw9ICBfX01ZX1BDTUNJQV9HQ1JYX0NYT0U7CQkvKiBhY3RpdmUgbG93ICAqLworCVBDTUNJQV9QR0NSWChfc2xvdF8pID0gcmVnOworCXVkZWxheSg1MDApOworCisJLyoKKwkgKiBDb25maWd1cmUgUG9ydCBDIHBpbnMgZm9yCisJICogNSBWb2x0cyBFbmFibGUgYW5kIDMgVm9sdHMgZW5hYmxlLAorCSAqIFR1cm4gb2ZmIGFsbCBwb3dlcgorCSAqLworCWRlYnVnICgiUENNQ0lBIHBvd2VyIE9GRlxuIik7CisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNwYXIgJj0gfigweDAwMDIgfCAweDAwMDQpOworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3Bjc28gICY9IH4oMHgwMDAyIHwgMHgwMDA0KTsKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RhdCAmPSB+KDB4MDAwMiB8IDB4MDAwNCk7CisKKwlyZWcgPSAwOworCXN3aXRjaCh2Y2MpIHsKKwljYXNlICAwOiAJCWJyZWFrOworCWNhc2UgMzM6IHJlZyB8PSAweDAwMDI7CWJyZWFrOworCWNhc2UgNTA6IHJlZyB8PSAweDAwMDQ7CWJyZWFrOworCWRlZmF1bHQ6IAkJZ290byBkb25lOworCX0KKworCS8qIENoZWNraW5nIHN1cHBvcnRlZCB2b2x0YWdlcyAqLworCisJZGVidWcgKCJQSVBSOiAweCV4IC0tPiAlc1xuIiwKKwkJcGNtcC0+cGNtY19waXByLAorCQkocGNtcC0+cGNtY19waXByICYgMHgwMDAwODAwMCkgPyAib25seSA1IFYiIDogImNhbiBkbyAzLjNWIik7CisKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RhdCB8PSByZWc7CisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkaXIgfD0gICgweDAwMDIgfCAweDAwMDQpOworCWlmIChyZWcpIHsKKwkJZGVidWcgKCJQQ01DSUEgcG93ZXJlZCBhdCAlc1ZcbiIsCisJCQkocmVnJjB4MDAwNCkgPyAiNS4wIiA6ICIzLjMiKTsKKwl9IGVsc2UgeworCQlkZWJ1ZyAoIlBDTUNJQSBwb3dlcmVkIGRvd25cbiIpOworCX0KKworZG9uZToKKwlkZWJ1ZyAoIkVuYWJsZSBQQ01DSUEgYnVmZmVycyBhbmQgc3RvcCBSRVNFVFxuIik7CisJcmVnICA9ICBQQ01DSUFfUEdDUlgoX3Nsb3RfKTsKKwlyZWcgJj0gfl9fTVlfUENNQ0lBX0dDUlhfQ1hSRVNFVDsJLyogYWN0aXZlIGhpZ2ggKi8KKwlyZWcgJj0gfl9fTVlfUENNQ0lBX0dDUlhfQ1hPRTsJCS8qIGFjdGl2ZSBsb3cgICovCisJUENNQ0lBX1BHQ1JYKF9zbG90XykgPSByZWc7CisJdWRlbGF5KDUwMCk7CisKKwlkZWJ1ZyAoInZvbHRhZ2Vfc2V0OiAiIFBDTUNJQV9CT0FSRF9NU0cgIiBTbG90ICVjLCBET05FXG4iLAorCQlzbG90KydBJyk7CisJcmV0dXJuICgwKTsKK30KKworI2VuZGlmCS8qIFRRTTh4eEwgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBMV01PTiBCb2FyZAkJCQkJCQkJCSovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19MV01PTikKKworI2RlZmluZSBQQ01DSUFfQk9BUkRfTVNHICJMV01PTiIKKworLyogI2RlZmluZSdzIGZvciBNQVgxNjA0IFBvd2VyIFN3aXRjaCAqLworI2RlZmluZSBNQVgxNjA0X09QX1NVUwkJMHg4MAorI2RlZmluZSBNQVgxNjA0X1ZDQ0JPTgkJMHg0MAorI2RlZmluZSBNQVgxNjA0X1ZDQ18zNQkJMHgyMAorI2RlZmluZSBNQVgxNjA0X1ZDQ0JISVoJCTB4MTAKKyNkZWZpbmUgTUFYMTYwNF9WUFBCT04JCTB4MDgKKyNkZWZpbmUgTUFYMTYwNF9WUFBCUEJQR00JMHgwNAorI2RlZmluZSBNQVgxNjA0X1ZQUEJISVoJCTB4MDIKKy8qIHJlc2VydmVkCQkJMHgwMQkqLworCitzdGF0aWMgaW50IGhhcmR3YXJlX2VuYWJsZShpbnQgc2xvdCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKKwl2b2xhdGlsZSBjcG04eHhfdAkqY3A7CisJdm9sYXRpbGUgcGNtY29uZjh4eF90CSpwY21wOworCXZvbGF0aWxlIHN5c2NvbmY4eHhfdAkqc3lzcDsKKwl1aW50IHJlZywgbWFzazsKKwl1Y2hhciB2YWw7CisKKworCWRlYnVnICgiaGFyZHdhcmVfZW5hYmxlOiAiIFBDTUNJQV9CT0FSRF9NU0cgIiBTbG90ICVjXG4iLCAnQScrc2xvdCk7CisKKwkvKiBTd2l0Y2ggb24gUENNQ0lBIHBvcnQgaW4gUElDIHJlZ2lzdGVyIDB4NjAgKi8KKwlyZWcgPSBwaWNfcmVhZCAgKDB4NjApOworCWRlYnVnICgiWyVkXSBQSUMgcmVhZDogcmVnXzYwID0gMHglMDJ4XG4iLCBfX0xJTkVfXywgcmVnKTsKKwlyZWcgJj0gfjB4MTA7CisJLyogcmVnIHw9ICAweDA4OyBWcHAgbm90IG5lZWRlZCAqLworCXBpY193cml0ZSAoMHg2MCwgcmVnKTsKKyNpZmRlZiBERUJVRworCXJlZyA9IHBpY19yZWFkICAoMHg2MCk7CisJcHJpbnRmICgiWyVkXSBQSUMgcmVhZDogcmVnXzYwID0gMHglMDJ4XG4iLCBfX0xJTkVfXywgcmVnKTsKKyNlbmRpZgorCXVkZWxheSgxMDAwMCk7CisKKwlpbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJc3lzcCAgPSAoc3lzY29uZjh4eF90ICopKCYoKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9zaXVfY29uZikpOworCXBjbXAgID0gKHBjbWNvbmY4eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fcGNtY2lhKSk7CisJY3AgICAgPSAoY3BtOHh4X3QgKikoJigoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX2NwbSkpOworCisJLyoKKwkgKiBDb25maWd1cmUgU0lVTUNSIHRvIGVuYWJsZSBQQ01DSUEgcG9ydCBCCisJICogKFZGTFNbMDoxXSBhcmUgbm90IHVzZWQgZm9yIGRlYnVnZ2luZywgd2UgY29ubmVjdCBGUlojIGluc3RlYWQpCisJICovCisJc3lzcC0+c2Nfc2l1bWNyICY9IH5TSVVNQ1JfREJHQzExOwkvKiBzZXQgREJHQyB0byAwMCAqLworCisJLyogY2xlYXIgaW50ZXJydXB0IHN0YXRlLCBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJcGNtcC0+cGNtY19wc2NyID0gIFBDTUNJQV9NQVNLKF9zbG90Xyk7CisJcGNtcC0+cGNtY19wZXIgJj0gflBDTUNJQV9NQVNLKF9zbG90Xyk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgJiBETUEgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IDA7CisKKwkvKgorCSAqIERpc2FibGUgUENNQ0lBIGJ1ZmZlcnMgKGlzb2xhdGUgdGhlIGludGVyZmFjZSkKKwkgKiBhbmQgYXNzZXJ0IFJFU0VUIHNpZ25hbAorCSAqLworCWRlYnVnICgiRGlzYWJsZSBQQ01DSUEgYnVmZmVycyBhbmQgYXNzZXJ0IFJFU0VUXG4iKTsKKwlyZWcgID0gIFBDTUNJQV9QR0NSWChfc2xvdF8pOworCXJlZyB8PSAgX19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworCXJlZyB8PSAgX19NWV9QQ01DSUFfR0NSWF9DWE9FOwkJLyogYWN0aXZlIGxvdyAgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IHJlZzsKKwl1ZGVsYXkoNTAwKTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIGlzIGEgY2FyZCBpbiB0aGUgc2xvdCwgdGhlbiBjb25maWd1cmUgdGhlIGludGVyZmFjZS4KKwkgKi8KKwl1ZGVsYXkoMTAwMDApOworCWRlYnVnICgiWyVkXSAlczogUElQUiglcCk9MHgleFxuIiwKKwkJX19MSU5FX18sX19GVU5DVElPTl9fLAorCQkmKHBjbXAtPnBjbWNfcGlwcikscGNtcC0+cGNtY19waXByKTsKKwlpZiAocGNtcC0+cGNtY19waXByICYgMHgwMDAwMTgwMCkgeworCQlwcmludGYgKCIgICBObyBDYXJkIGZvdW5kXG4iKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKgorCSAqIFBvd2VyIE9uLgorCSAqLworCW1hc2sgPSBQQ01DSUFfVlMxKHNsb3QpIHwgUENNQ0lBX1ZTMihzbG90KTsKKwlyZWcgID0gcGNtcC0+cGNtY19waXByOworCWRlYnVnICgiUElQUjogMHgleCA9PT4gVlMxPW8lcywgVlMyPW8lc1xuIiwKKwkJcmVnLAorCQkocmVnJlBDTUNJQV9WUzEoc2xvdCkpPyJuIjoiZmYiLAorCQkocmVnJlBDTUNJQV9WUzIoc2xvdCkpPyJuIjoiZmYiKTsKKwlpZiAoKHJlZyAmIG1hc2spID09IG1hc2spIHsKKwkJdmFsID0gMDsJCS8qIFZDQ0IzLzUgPSAwID09PiB1c2UgVnggPSA1LjAgViAqLworCQlwdXRzICgiIDUuMFYgY2FyZCBmb3VuZDogIik7CisJfSBlbHNlIHsKKwkJdmFsID0gTUFYMTYwNF9WQ0NfMzU7CS8qIFZDQ0IzLzUgPSAxID09PiB1c2UgVnkgPSAzLjMgViAqLworCQlwdXRzICgiIDMuM1YgY2FyZCBmb3VuZDogIik7CisJfQorCisJLyogIHN3aXRjaCBWQ0Mgb24gKi8KKwl2YWwgfD0gIE1BWDE2MDRfT1BfU1VTIHwgTUFYMTYwNF9WQ0NCT047CisJaTJjX2luaXQgIChDRkdfSTJDX1NQRUVELCBDRkdfSTJDX1NMQVZFKTsKKwlpMmNfd3JpdGUgKENGR19JMkNfUE9XRVJfQV9BRERSLCAwLCAwLCAmdmFsLCAxKTsKKworCXVkZWxheSg1MDAwMDApOworCisJZGVidWcgKCJFbmFibGUgUENNQ0lBIGJ1ZmZlcnMgYW5kIHN0b3AgUkVTRVRcbiIpOworCXJlZyAgPSAgUENNQ0lBX1BHQ1JYKF9zbG90Xyk7CisJcmVnICY9IH5fX01ZX1BDTUNJQV9HQ1JYX0NYUkVTRVQ7CS8qIGFjdGl2ZSBoaWdoICovCisJcmVnICY9IH5fX01ZX1BDTUNJQV9HQ1JYX0NYT0U7CQkvKiBhY3RpdmUgbG93ICAqLworCVBDTUNJQV9QR0NSWChfc2xvdF8pID0gcmVnOworCisJdWRlbGF5KDI1MDAwMCk7CS8qIHNvbWUgY2FyZHMgbmVlZCA+MTUwIG1zIHRvIGNvbWUgdXAgOi0oICovCisKKwlkZWJ1ZyAoIiMgaGFyZHdhcmVfZW5hYmxlIGRvbmVcbiIpOworCisJcmV0dXJuICgwKTsKK30KKworCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCitzdGF0aWMgaW50IGhhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCit7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CisJdm9sYXRpbGUgcGNtY29uZjh4eF90CSpwY21wOworCXVfbG9uZyByZWc7CisJdWNoYXIgdmFsOworCisJZGVidWcgKCJoYXJkd2FyZV9kaXNhYmxlOiAiIFBDTUNJQV9CT0FSRF9NU0cgIiBTbG90ICVjXG4iLCAnQScrc2xvdCk7CisKKwlpbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJcGNtcCA9IChwY21jb25mOHh4X3QgKikoJigoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX3BjbWNpYSkpOworCisJLyogcmVtb3ZlIGFsbCBwb3dlciwgcHV0IG91dHB1dCBpbiBoaWdoIGltcGVkYW5jZSBzdGF0ZSAqLworCXZhbCAgPSBNQVgxNjA0X1ZDQ0JISVogfCBNQVgxNjA0X1ZQUEJISVo7CisJaTJjX2luaXQgIChDRkdfSTJDX1NQRUVELCBDRkdfSTJDX1NMQVZFKTsKKwlpMmNfd3JpdGUgKENGR19JMkNfUE9XRVJfQV9BRERSLCAwLCAwLCAmdmFsLCAxKTsKKworCS8qIENvbmZpZ3VyZSBQQ01DSUEgR2VuZXJhbCBDb250cm9sIFJlZ2lzdGVyICovCisJUENNQ0lBX1BHQ1JYKF9zbG90XykgPSAwOworCisJZGVidWcgKCJEaXNhYmxlIFBDTUNJQSBidWZmZXJzIGFuZCBhc3NlcnQgUkVTRVRcbiIpOworCXJlZyAgPSAgUENNQ0lBX1BHQ1JYKF9zbG90Xyk7CisJcmVnIHw9IF9fTVlfUENNQ0lBX0dDUlhfQ1hSRVNFVDsJLyogYWN0aXZlIGhpZ2ggKi8KKwlyZWcgfD0gX19NWV9QQ01DSUFfR0NSWF9DWE9FOwkJLyogYWN0aXZlIGxvdyAgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IHJlZzsKKworCS8qIFN3aXRjaCBvZmYgUENNQ0lBIHBvcnQgaW4gUElDIHJlZ2lzdGVyIDB4NjAgKi8KKwlyZWcgPSBwaWNfcmVhZCAgKDB4NjApOworCWRlYnVnICgiWyVkXSBQSUMgcmVhZDogcmVnXzYwID0gMHglMDJ4XG4iLCBfX0xJTkVfXywgcmVnKTsKKwlyZWcgfD0gIDB4MTA7CisJcmVnICY9IH4weDA4OworCXBpY193cml0ZSAoMHg2MCwgcmVnKTsKKyNpZmRlZiBERUJVRworCXJlZyA9IHBpY19yZWFkICAoMHg2MCk7CisJcHJpbnRmICgiWyVkXSBQSUMgcmVhZDogcmVnXzYwID0gMHglMDJ4XG4iLCBfX0xJTkVfXywgcmVnKTsKKyNlbmRpZgorCXVkZWxheSgxMDAwMCk7CisKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisKKworCitzdGF0aWMgaW50IHZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQoreworCXZvbGF0aWxlIGltbWFwX3QJKmltbWFwOworCXZvbGF0aWxlIHBjbWNvbmY4eHhfdAkqcGNtcDsKKwl1X2xvbmcgcmVnOworCXVjaGFyIHZhbDsKKworCWRlYnVnICgidm9sdGFnZV9zZXQ6ICIKKwkJUENNQ0lBX0JPQVJEX01TRworCQkiIFNsb3QgJWMsIFZjYz0lZC4lZCwgVnBwPSVkLiVkXG4iLAorCQknQScrc2xvdCwgdmNjLzEwLCB2Y2MlMTAsIHZwcC8xMCwgdmNjJTEwKTsKKworCWltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKwlwY21wID0gKHBjbWNvbmY4eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fcGNtY2lhKSk7CisJLyoKKwkgKiBEaXNhYmxlIFBDTUNJQSBidWZmZXJzIChpc29sYXRlIHRoZSBpbnRlcmZhY2UpCisJICogYW5kIGFzc2VydCBSRVNFVCBzaWduYWwKKwkgKi8KKwlkZWJ1ZyAoIkRpc2FibGUgUENNQ0lBIGJ1ZmZlcnMgYW5kIGFzc2VydCBSRVNFVFxuIik7CisJcmVnICA9ICBQQ01DSUFfUEdDUlgoX3Nsb3RfKTsKKwlyZWcgfD0gIF9fTVlfUENNQ0lBX0dDUlhfQ1hSRVNFVDsJLyogYWN0aXZlIGhpZ2ggKi8KKwlyZWcgfD0gIF9fTVlfUENNQ0lBX0dDUlhfQ1hPRTsJCS8qIGFjdGl2ZSBsb3cgICovCisJUENNQ0lBX1BHQ1JYKF9zbG90XykgPSByZWc7CisJdWRlbGF5KDUwMCk7CisKKwkvKgorCSAqIFR1cm4gb2ZmIGFsbCBwb3dlciAoc3dpdGNoIHRvIGhpZ2ggaW1wZWRhbmNlKQorCSAqLworCWRlYnVnICgiUENNQ0lBIHBvd2VyIE9GRlxuIik7CisJdmFsICA9IE1BWDE2MDRfVkNDQkhJWiB8IE1BWDE2MDRfVlBQQkhJWjsKKwlpMmNfaW5pdCAgKENGR19JMkNfU1BFRUQsIENGR19JMkNfU0xBVkUpOworCWkyY193cml0ZSAoQ0ZHX0kyQ19QT1dFUl9BX0FERFIsIDAsIDAsICZ2YWwsIDEpOworCisJdmFsID0gMDsKKwlzd2l0Y2godmNjKSB7CisJY2FzZSAgMDogCQkJYnJlYWs7CisJY2FzZSAzMzogdmFsID0gTUFYMTYwNF9WQ0NfMzU7CWJyZWFrOworCWNhc2UgNTA6IAkJCWJyZWFrOworCWRlZmF1bHQ6IAkJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBDaGVja2luZyBzdXBwb3J0ZWQgdm9sdGFnZXMgKi8KKworCWRlYnVnICgiUElQUjogMHgleCAtLT4gJXNcbiIsCisJCXBjbXAtPnBjbWNfcGlwciwKKwkJKHBjbXAtPnBjbWNfcGlwciAmIDB4MDAwMDgwMDApID8gIm9ubHkgNSBWIiA6ICJjYW4gZG8gMy4zViIpOworCisJaTJjX3dyaXRlIChDRkdfSTJDX1BPV0VSX0FfQUREUiwgMCwgMCwgJnZhbCwgMSk7CisJaWYgKHZhbCkgeworCQlkZWJ1ZyAoIlBDTUNJQSBwb3dlcmVkIGF0ICVzVlxuIiwKKwkJCSh2YWwgJiBNQVgxNjA0X1ZDQ18zNSkgPyAiMy4zIiA6ICI1LjAiKTsKKwl9IGVsc2UgeworCQlkZWJ1ZyAoIlBDTUNJQSBwb3dlcmVkIGRvd25cbiIpOworCX0KKworZG9uZToKKwlkZWJ1ZyAoIkVuYWJsZSBQQ01DSUEgYnVmZmVycyBhbmQgc3RvcCBSRVNFVFxuIik7CisJcmVnICA9ICBQQ01DSUFfUEdDUlgoX3Nsb3RfKTsKKwlyZWcgJj0gfl9fTVlfUENNQ0lBX0dDUlhfQ1hSRVNFVDsJLyogYWN0aXZlIGhpZ2ggKi8KKwlyZWcgJj0gfl9fTVlfUENNQ0lBX0dDUlhfQ1hPRTsJCS8qIGFjdGl2ZSBsb3cgICovCisJUENNQ0lBX1BHQ1JYKF9zbG90XykgPSByZWc7CisJdWRlbGF5KDUwMCk7CisKKwlkZWJ1ZyAoInZvbHRhZ2Vfc2V0OiAiIFBDTUNJQV9CT0FSRF9NU0cgIiBTbG90ICVjLCBET05FXG4iLAorCQlzbG90KydBJyk7CisJcmV0dXJuICgwKTsKK30KKworI2VuZGlmCS8qIExXTU9OICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEdUSCBib2FyZCBieSBDb3JlbGF0dXMgQUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19HVEgpCisKKyNkZWZpbmUgUENNQ0lBX0JPQVJEX01TRyAiR1RIIENPTVBBQ1QgRkxBU0giCisKK3N0YXRpYyBpbnQgdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCit7ICAvKiBEbyBub3RoaW5nICovCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhcmR3YXJlX2VuYWJsZSAoaW50IHNsb3QpCit7CisgIHZvbGF0aWxlIGltbWFwX3QJKmltbWFwOworICB2b2xhdGlsZSBjcG04eHhfdAkqY3A7CisgIHZvbGF0aWxlIHBjbWNvbmY4eHhfdAkqcGNtcDsKKyAgdm9sYXRpbGUgc3lzY29uZjh4eF90CSpzeXNwOworICB1aW50IHJlZywgbWFzazsKKworICBkZWJ1ZyAoImhhcmR3YXJlX2VuYWJsZTogR1RIIFNsb3QgJWNcbiIsICdBJytzbG90KTsKKworICBpbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisgIHN5c3AgID0gKHN5c2NvbmY4eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fc2l1X2NvbmYpKTsKKyAgcGNtcCAgPSAocGNtY29uZjh4eF90ICopKCYoKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9wY21jaWEpKTsKKyAgY3AgICAgPSAoY3BtOHh4X3QgKikoJigoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX2NwbSkpOworCisgIC8qIGNsZWFyIGludGVycnVwdCBzdGF0ZSwgYW5kIGRpc2FibGUgaW50ZXJydXB0cyAqLworICBwY21wLT5wY21jX3BzY3IgPSAgUENNQ0lBX01BU0soX3Nsb3RfKTsKKyAgcGNtcC0+cGNtY19wZXIgJj0gflBDTUNJQV9NQVNLKF9zbG90Xyk7CisKKyAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICYgRE1BICovCisgIFBDTUNJQV9QR0NSWChfc2xvdF8pID0gMDsKKworICAvKgorICAgKiBEaXNhYmxlIFBDTUNJQSBidWZmZXJzIChpc29sYXRlIHRoZSBpbnRlcmZhY2UpCisgICAqIGFuZCBhc3NlcnQgUkVTRVQgc2lnbmFsCisgICAqLworICBkZWJ1ZyAoIkRpc2FibGUgUENNQ0lBIGJ1ZmZlcnMgYW5kIGFzc2VydCBSRVNFVFxuIik7CisgIHJlZyAgPSAgUENNQ0lBX1BHQ1JYKF9zbG90Xyk7CisgIHJlZyB8PSAgX19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworICByZWcgfD0gIF9fTVlfUENNQ0lBX0dDUlhfQ1hPRTsJCS8qIGFjdGl2ZSBsb3cgICovCisgIFBDTUNJQV9QR0NSWChfc2xvdF8pID0gcmVnOworICB1ZGVsYXkoNTAwKTsKKworICAvKgorICAgKiBNYWtlIHN1cmUgdGhlcmUgaXMgYSBjYXJkIGluIHRoZSBzbG90LCB0aGVuIGNvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlLgorICAgKi8KKyAgdWRlbGF5KDEwMDAwKTsKKyAgZGVidWcgKCJbJWRdICVzOiBQSVBSKCVwKT0weCV4XG4iLAorCQlfX0xJTkVfXyxfX0ZVTkNUSU9OX18sCisJCSYocGNtcC0+cGNtY19waXByKSxwY21wLT5wY21jX3BpcHIpOworICBpZiAocGNtcC0+cGNtY19waXByICYgMHg5ODAwMDAwMCkgeworICAgIHByaW50ZiAoIiAgIE5vIENhcmQgZm91bmRcbiIpOworICAgIHJldHVybiAoMSk7CisgIH0KKworICBtYXNrID0gUENNQ0lBX1ZTMShzbG90KSB8IFBDTUNJQV9WUzIoc2xvdCk7CisgIHJlZyAgPSBwY21wLT5wY21jX3BpcHI7CisgIGRlYnVnICgiUElQUjogMHgleCA9PT4gVlMxPW8lcywgVlMyPW8lc1xuIiwKKwkJcmVnLAorCQkocmVnJlBDTUNJQV9WUzEoc2xvdCkpPyJuIjoiZmYiLAorCQkocmVnJlBDTUNJQV9WUzIoc2xvdCkpPyJuIjoiZmYiKTsKKworICBkZWJ1ZyAoIkVuYWJsZSBQQ01DSUEgYnVmZmVycyBhbmQgc3RvcCBSRVNFVFxuIik7CisgIHJlZyAgPSAgUENNQ0lBX1BHQ1JYKF9zbG90Xyk7CisgIHJlZyAmPSB+X19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworICByZWcgJj0gfl9fTVlfUENNQ0lBX0dDUlhfQ1hPRTsJCS8qIGFjdGl2ZSBsb3cgICovCisgIFBDTUNJQV9QR0NSWChfc2xvdF8pID0gcmVnOworCisgIHVkZWxheSgyNTAwMDApOwkvKiBzb21lIGNhcmRzIG5lZWQgPjE1MCBtcyB0byBjb21lIHVwIDotKCAqLworCisgIGRlYnVnICgiIyBoYXJkd2FyZV9lbmFibGUgZG9uZVxuIik7CisKKyAgcmV0dXJuIDA7Cit9CisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorc3RhdGljIGludCBoYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQoreworCXJldHVybiAwOwkvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCit9CisjZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgkvKiBDT05GSUdfR1RIICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIElDVTg2MiBCb2FyZHMgYnkgQ2FtYnJpZGdlIEJyb2FkYmFuZCBMdGQuCQkJCQkqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfSUNVODYyKQorCisjZGVmaW5lIFBDTUNJQV9CT0FSRF9NU0cgIklDVTg2MiIKKworc3RhdGljIHZvaWQgY2ZnX3BvcnRfQiAodm9pZCk7CisKK3N0YXRpYyBpbnQgaGFyZHdhcmVfZW5hYmxlKGludCBzbG90KQoreworCXZvbGF0aWxlIGltbWFwX3QJKmltbWFwOworCXZvbGF0aWxlIGNwbTh4eF90CSpjcDsKKwl2b2xhdGlsZSBwY21jb25mOHh4X3QJKnBjbXA7CisJdm9sYXRpbGUgc3lzY29uZjh4eF90CSpzeXNwOworCXVpbnQgcmVnLCBwaXByLCBtYXNrOworCWludCBpOworCisJZGVidWcgKCJoYXJkd2FyZV9lbmFibGU6ICIgUENNQ0lBX0JPQVJEX01TRyAiIFNsb3QgJWNcbiIsICdBJytzbG90KTsKKworCXVkZWxheSgxMDAwMCk7CisKKwlpbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJc3lzcCAgPSAoc3lzY29uZjh4eF90ICopKCYoKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9zaXVfY29uZikpOworCXBjbXAgID0gKHBjbWNvbmY4eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fcGNtY2lhKSk7CisJY3AgICAgPSAoY3BtOHh4X3QgKikoJigoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX2NwbSkpOworCisJLyogQ29uZmlndXJlIFBvcnQgQiBmb3IgVFBTMjIwNSBQQy1DYXJkIFBvd2VyLUludGVyZmFjZSBTd2l0Y2ggKi8KKwljZmdfcG9ydF9CICgpOworCisJLyoKKwkgKiBDb25maWd1cmUgU0lVTUNSIHRvIGVuYWJsZSBQQ01DSUEgcG9ydCBCCisJICogKFZGTFNbMDoxXSBhcmUgbm90IHVzZWQgZm9yIGRlYnVnZ2luZywgd2UgY29ubmVjdCBGUlojIGluc3RlYWQpCisJICovCisJc3lzcC0+c2Nfc2l1bWNyICY9IH5TSVVNQ1JfREJHQzExOwkvKiBzZXQgREJHQyB0byAwMCAqLworCisJLyogY2xlYXIgaW50ZXJydXB0IHN0YXRlLCBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJcGNtcC0+cGNtY19wc2NyID0gIFBDTUNJQV9NQVNLKF9zbG90Xyk7CisJcGNtcC0+cGNtY19wZXIgJj0gflBDTUNJQV9NQVNLKF9zbG90Xyk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgJiBETUEgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IDA7CisKKwkvKgorCSAqIERpc2FibGUgUENNQ0lBIGJ1ZmZlcnMgKGlzb2xhdGUgdGhlIGludGVyZmFjZSkKKwkgKiBhbmQgYXNzZXJ0IFJFU0VUIHNpZ25hbAorCSAqLworCWRlYnVnICgiRGlzYWJsZSBQQ01DSUEgYnVmZmVycyBhbmQgYXNzZXJ0IFJFU0VUXG4iKTsKKwlyZWcgID0gIFBDTUNJQV9QR0NSWChfc2xvdF8pOworCXJlZyB8PSAgX19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworCXJlZyB8PSAgX19NWV9QQ01DSUFfR0NSWF9DWE9FOwkJLyogYWN0aXZlIGxvdyAgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IHJlZzsKKwl1ZGVsYXkoNTAwKTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIGlzIGEgY2FyZCBpbiB0aGUgc2xvdCwgdGhlbiBjb25maWd1cmUgdGhlIGludGVyZmFjZS4KKwkgKi8KKwl1ZGVsYXkoMTAwMDApOworCWRlYnVnICgiWyVkXSAlczogUElQUiglcCk9MHgleFxuIiwKKwkJX19MSU5FX18sX19GVU5DVElPTl9fLAorCQkmKHBjbXAtPnBjbWNfcGlwcikscGNtcC0+cGNtY19waXByKTsKKwlpZiAocGNtcC0+cGNtY19waXByICYgMHgwMDAwMTgwMCkgeworCQlwcmludGYgKCIgICBObyBDYXJkIGZvdW5kXG4iKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKgorCSAqIFBvd2VyIE9uOiBTZXQgVkFWQ0MgdG8gMy4zViBvciA1Viwgc2V0IFZBVlBQIHRvIEhpLVoKKwkgKi8KKwltYXNrID0gUENNQ0lBX1ZTMShzbG90KSB8IFBDTUNJQV9WUzIoc2xvdCk7CisJcGlwciA9IHBjbXAtPnBjbWNfcGlwcjsKKwlkZWJ1ZyAoIlBJUFI6IDB4JXggPT0+IFZTMT1vJXMsIFZTMj1vJXNcbiIsCisJCXBpcHIsCisJCShyZWcmUENNQ0lBX1ZTMShzbG90KSk/Im4iOiJmZiIsCisJCShyZWcmUENNQ0lBX1ZTMihzbG90KSk/Im4iOiJmZiIpOworCisJcmVnICA9IGNwLT5jcF9wYmRhdDsKKwlpZiAoKHBpcHIgJiBtYXNrKSA9PSBtYXNrKSB7CisJCXJlZyB8PSAgKFRQUzIyMDVfVlBQX1BHTSB8IFRQUzIyMDVfVlBQX1ZDQyB8CS8qIFZBVlBQID0+IEhpLVogKi8KKwkJCSBUUFMyMjA1X1ZDQzMpOwkJCQkvKiAzViBvZmYJKi8KKwkJcmVnICY9IH4oVFBTMjIwNV9WQ0M1KTsJCQkJLyogNVYgb24JKi8KKwkJcHV0cyAoIiA1LjBWIGNhcmQgZm91bmQ6ICIpOworCX0gZWxzZSB7CisJCXJlZyB8PSAgKFRQUzIyMDVfVlBQX1BHTSB8IFRQUzIyMDVfVlBQX1ZDQyB8CS8qIFZBVlBQID0+IEhpLVogKi8KKwkJCSBUUFMyMjA1X1ZDQzUpOwkJCQkvKiA1ViBvZmYJKi8KKwkJcmVnICY9IH4oVFBTMjIwNV9WQ0MzKTsJCQkJLyogM1Ygb24JKi8KKwkJcHV0cyAoIiAzLjNWIGNhcmQgZm91bmQ6ICIpOworCX0KKworCWRlYnVnICgiXG5QQiBEQVQ6ICUwOHggLT4gMy4zViAlcyA1LjBWICVzIFZQUF9QR00gJXMgVlBQX1ZDQyAlc1xuIiwKKwkJcmVnLAorCQkocmVnICYgVFBTMjIwNV9WQ0MzKSAgICA/ICJvZmYiIDogIm9uIiwKKwkJKHJlZyAmIFRQUzIyMDVfVkNDNSkgICAgPyAib2ZmIiA6ICJvbiIsCisJCShyZWcgJiBUUFMyMjA1X1ZQUF9QR00pID8gIm9mZiIgOiAib24iLAorCQkocmVnICYgVFBTMjIwNV9WUFBfVkNDKSA/ICJvZmYiIDogIm9uIiApOworCisJY3AtPmNwX3BiZGF0ID0gcmVnOworCisJLyogIFdhaXQgNTAwIG1zOyB1c2UgdGhpcyB0byBjaGVjayBmb3Igb3Zlci1jdXJyZW50ICovCisJZm9yIChpPTA7IGk8NTAwMDsgKytpKSB7CisJCWlmICgoY3AtPmNwX3BiZGF0ICYgVFBTMjIwNV9PQykgPT0gMCkgeworCQkJcHJpbnRmICgiICAgKioqIE92ZXJjdXJyZW50IC0gU2FmZXR5IHNodXRkb3duICoqKlxuIik7CisJCQljcC0+Y3BfcGJkYXQgJj0gfihUUFMyMjA1X1NIRE4pOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQl1ZGVsYXkgKDEwMCk7CisJfQorCisJZGVidWcgKCJFbmFibGUgUENNQ0lBIGJ1ZmZlcnMgYW5kIHN0b3AgUkVTRVRcbiIpOworCXJlZyAgPSAgUENNQ0lBX1BHQ1JYKF9zbG90Xyk7CisJcmVnICY9IH5fX01ZX1BDTUNJQV9HQ1JYX0NYUkVTRVQ7CS8qIGFjdGl2ZSBoaWdoICovCisJcmVnICY9IH5fX01ZX1BDTUNJQV9HQ1JYX0NYT0U7CQkvKiBhY3RpdmUgbG93ICAqLworCVBDTUNJQV9QR0NSWChfc2xvdF8pID0gcmVnOworCisJdWRlbGF5KDI1MDAwMCk7CS8qIHNvbWUgY2FyZHMgbmVlZCA+MTUwIG1zIHRvIGNvbWUgdXAgOi0oICovCisKKwlkZWJ1ZyAoIiMgaGFyZHdhcmVfZW5hYmxlIGRvbmVcbiIpOworCisJcmV0dXJuICgwKTsKK30KKworCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCitzdGF0aWMgaW50IGhhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCit7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CisJdm9sYXRpbGUgY3BtOHh4X3QJKmNwOworCXZvbGF0aWxlIHBjbWNvbmY4eHhfdAkqcGNtcDsKKwl1X2xvbmcgcmVnOworCisJZGVidWcgKCJoYXJkd2FyZV9kaXNhYmxlOiAiIFBDTUNJQV9CT0FSRF9NU0cgIiBTbG90ICVjXG4iLCAnQScrc2xvdCk7CisKKwlpbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJY3AgICAgPSAoY3BtOHh4X3QgKikoJigoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX2NwbSkpOworCXBjbXAgID0gKHBjbWNvbmY4eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fcGNtY2lhKSk7CisKKwkvKiBTaHV0IGRvd24gKi8KKwljcC0+Y3BfcGJkYXQgJj0gfihUUFMyMjA1X1NIRE4pOworCisJLyogQ29uZmlndXJlIFBDTUNJQSBHZW5lcmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IDA7CisKKwlkZWJ1ZyAoIkRpc2FibGUgUENNQ0lBIGJ1ZmZlcnMgYW5kIGFzc2VydCBSRVNFVFxuIik7CisJcmVnICA9ICBQQ01DSUFfUEdDUlgoX3Nsb3RfKTsKKwlyZWcgfD0gX19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworCXJlZyB8PSBfX01ZX1BDTUNJQV9HQ1JYX0NYT0U7CQkvKiBhY3RpdmUgbG93ICAqLworCVBDTUNJQV9QR0NSWChfc2xvdF8pID0gcmVnOworCisJdWRlbGF5KDEwMDAwKTsKKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKworCisKK3N0YXRpYyBpbnQgdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCit7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CisJdm9sYXRpbGUgY3BtOHh4X3QJKmNwOworCXZvbGF0aWxlIHBjbWNvbmY4eHhfdAkqcGNtcDsKKwl1X2xvbmcgcmVnOworCisJZGVidWcgKCJ2b2x0YWdlX3NldDogIgorCQlQQ01DSUFfQk9BUkRfTVNHCisJCSIgU2xvdCAlYywgVmNjPSVkLiVkLCBWcHA9JWQuJWRcbiIsCisJCSdBJytzbG90LCB2Y2MvMTAsIHZjYyUxMCwgdnBwLzEwLCB2Y2MlMTApOworCisJaW1tYXAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworCWNwICAgID0gKGNwbTh4eF90ICopKCYoKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9jcG0pKTsKKwlwY21wICA9IChwY21jb25mOHh4X3QgKikoJigoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX3BjbWNpYSkpOworCS8qCisJICogRGlzYWJsZSBQQ01DSUEgYnVmZmVycyAoaXNvbGF0ZSB0aGUgaW50ZXJmYWNlKQorCSAqIGFuZCBhc3NlcnQgUkVTRVQgc2lnbmFsCisJICovCisJZGVidWcgKCJEaXNhYmxlIFBDTUNJQSBidWZmZXJzIGFuZCBhc3NlcnQgUkVTRVRcbiIpOworCXJlZyAgPSAgUENNQ0lBX1BHQ1JYKF9zbG90Xyk7CisJcmVnIHw9ICBfX01ZX1BDTUNJQV9HQ1JYX0NYUkVTRVQ7CS8qIGFjdGl2ZSBoaWdoICovCisJcmVnIHw9ICBfX01ZX1BDTUNJQV9HQ1JYX0NYT0U7CQkvKiBhY3RpdmUgbG93ICAqLworCVBDTUNJQV9QR0NSWChfc2xvdF8pID0gcmVnOworCXVkZWxheSg1MDApOworCisJLyoKKwkgKiBDb25maWd1cmUgUG9ydCBDIHBpbnMgZm9yCisJICogNSBWb2x0cyBFbmFibGUgYW5kIDMgVm9sdHMgZW5hYmxlLAorCSAqIFR1cm4gYWxsIHBvd2VyIHBpbnMgdG8gSGktWgorCSAqLworCWRlYnVnICgiUENNQ0lBIHBvd2VyIE9GRlxuIik7CisJY2ZnX3BvcnRfQiAoKTsJLyogRW5hYmxlcyBzd2l0Y2gsIGJ1dCBhbGwgaW4gSGktWiAqLworCisJcmVnICA9IGNwLT5jcF9wYmRhdDsKKworCXN3aXRjaCh2Y2MpIHsKKwljYXNlICAwOiAJCQlicmVhazsJLyogU3dpdGNoIG9mZgkJKi8KKwljYXNlIDMzOiByZWcgJj0gflRQUzIyMDVfVkNDMzsJYnJlYWs7CS8qIFN3aXRjaCBvbiAzLjNWCSovCisJY2FzZSA1MDogcmVnICY9IH5UUFMyMjA1X1ZDQzU7CWJyZWFrOwkvKiBTd2l0Y2ggb24gNS4wVgkqLworCWRlZmF1bHQ6IAkJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBDaGVja2luZyBzdXBwb3J0ZWQgdm9sdGFnZXMgKi8KKworCWRlYnVnICgiUElQUjogMHgleCAtLT4gJXNcbiIsCisJCXBjbXAtPnBjbWNfcGlwciwKKwkJKHBjbXAtPnBjbWNfcGlwciAmIDB4MDAwMDgwMDApID8gIm9ubHkgNSBWIiA6ICJjYW4gZG8gMy4zViIpOworCisJY3AtPmNwX3BiZGF0ID0gcmVnOworCisjaWZkZWYgREVCVUcKKyAgICB7CisJY2hhciAqczsKKworCWlmICgocmVnICYgVFBTMjIwNV9WQ0MzKSA9PSAwKSB7CisJCXMgPSAiYXQgMy4zViI7CisJfSBlbHNlIGlmICgocmVnICYgVFBTMjIwNV9WQ0M1KSA9PSAwKSB7CisJCXMgPSAiYXQgNS4wViI7CisJfSBlbHNlIHsKKwkJcyA9ICJkb3duIjsKKwl9CisJcHJpbnRmICgiUENNQ0lBIHBvd2VyZWQgJXNcbiIsIHMpOworICAgIH0KKyNlbmRpZgorCitkb25lOgorCWRlYnVnICgiRW5hYmxlIFBDTUNJQSBidWZmZXJzIGFuZCBzdG9wIFJFU0VUXG4iKTsKKwlyZWcgID0gIFBDTUNJQV9QR0NSWChfc2xvdF8pOworCXJlZyAmPSB+X19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworCXJlZyAmPSB+X19NWV9QQ01DSUFfR0NSWF9DWE9FOwkJLyogYWN0aXZlIGxvdyAgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IHJlZzsKKwl1ZGVsYXkoNTAwKTsKKworCWRlYnVnICgidm9sdGFnZV9zZXQ6ICIgUENNQ0lBX0JPQVJEX01TRyAiIFNsb3QgJWMsIERPTkVcbiIsCisJCXNsb3QrJ0EnKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZCBjZmdfcG9ydF9CICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QJKmltbWFwOworCXZvbGF0aWxlIGNwbTh4eF90CSpjcDsKKwl1aW50IHJlZzsKKworCWltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKwljcCAgICA9IChjcG04eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fY3BtKSk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBQb3J0IEIgZm9yIFRQUzIyMDUgUEMtQ2FyZCBQb3dlci1JbnRlcmZhY2UgU3dpdGNoCisJICoKKwkgKiBTd2l0Y2ggb2ZmIGFsbCB2b2x0YWdlcywgYXNzZXJ0IHNodXRkb3duCisJICovCisJcmVnICA9IGNwLT5jcF9wYmRhdDsKKwlyZWcgfD0gIChUUFMyMjA1X1ZQUF9QR00gfCBUUFMyMjA1X1ZQUF9WQ0MgfAkvKiBWQVZQUCA9PiBIaS1aICovCisJCSBUUFMyMjA1X1ZDQzMgICAgfCBUUFMyMjA1X1ZDQzUgICAgfAkvKiBWQVZDQyA9PiBIaS1aICovCisJCSBUUFMyMjA1X1NIRE4pOwkJCQkvKiBlbmFibGUgc3dpdGNoICovCisJY3AtPmNwX3BiZGF0ID0gcmVnOworCisJY3AtPmNwX3BicGFyICY9IH4oVFBTMjIwNV9JTlBVVFMgfCBUUFMyMjA1X09VVFBVVFMpOworCisJcmVnID0gY3AtPmNwX3BiZGlyICYgfihUUFMyMjA1X0lOUFVUUyk7CisJY3AtPmNwX3BiZGlyID0gcmVnIHwgVFBTMjIwNV9PVVRQVVRTOworCisJZGVidWcgKCJTZXQgUG9ydCBCOiBQQVI6ICUwOHggRElSOiAlMDh4IERBVDogJTA4eFxuIiwKKwkJY3AtPmNwX3BicGFyLCBjcC0+Y3BfcGJkaXIsIGNwLT5jcF9wYmRhdCk7Cit9CisKKyNlbmRpZgkvKiBJQ1U4NjIgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBDMk1PTiBCb2FyZHMgYnkgVFRUZWNoIENvbXB1dGVydGVjaG5payBBRwkJCQkJKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0MyTU9OKQorCisjZGVmaW5lIFBDTUNJQV9CT0FSRF9NU0cgIkMyTU9OIgorCitzdGF0aWMgdm9pZCBjZmdfcG9ydHMgKHZvaWQpOworCitzdGF0aWMgaW50IGhhcmR3YXJlX2VuYWJsZShpbnQgc2xvdCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKKwl2b2xhdGlsZSBjcG04eHhfdAkqY3A7CisJdm9sYXRpbGUgcGNtY29uZjh4eF90CSpwY21wOworCXZvbGF0aWxlIHN5c2NvbmY4eHhfdAkqc3lzcDsKKwl1aW50IHJlZywgcGlwciwgbWFzazsKKwl1c2hvcnQgc3JlZzsKKwlpbnQgaTsKKworCWRlYnVnICgiaGFyZHdhcmVfZW5hYmxlOiAiIFBDTUNJQV9CT0FSRF9NU0cgIiBTbG90ICVjXG4iLCAnQScrc2xvdCk7CisKKwl1ZGVsYXkoMTAwMDApOworCisJaW1tYXAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworCXN5c3AgID0gKHN5c2NvbmY4eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fc2l1X2NvbmYpKTsKKwlwY21wICA9IChwY21jb25mOHh4X3QgKikoJigoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX3BjbWNpYSkpOworCWNwICAgID0gKGNwbTh4eF90ICopKCYoKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9jcG0pKTsKKworCS8qIENvbmZpZ3VyZSBQb3J0cyBmb3IgVFBTMjIxMUEgUEMtQ2FyZCBQb3dlci1JbnRlcmZhY2UgU3dpdGNoICovCisJY2ZnX3BvcnRzICgpOworCisJLyoKKwkgKiBDb25maWd1cmUgU0lVTUNSIHRvIGVuYWJsZSBQQ01DSUEgcG9ydCBCCisJICogKFZGTFNbMDoxXSBhcmUgbm90IHVzZWQgZm9yIGRlYnVnZ2luZywgd2UgY29ubmVjdCBGUlojIGluc3RlYWQpCisJICovCisJc3lzcC0+c2Nfc2l1bWNyICY9IH5TSVVNQ1JfREJHQzExOwkvKiBzZXQgREJHQyB0byAwMCAqLworCisJLyogY2xlYXIgaW50ZXJydXB0IHN0YXRlLCBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJcGNtcC0+cGNtY19wc2NyID0gIFBDTUNJQV9NQVNLKF9zbG90Xyk7CisJcGNtcC0+cGNtY19wZXIgJj0gflBDTUNJQV9NQVNLKF9zbG90Xyk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgJiBETUEgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IDA7CisKKwkvKgorCSAqIERpc2FibGUgUENNQ0lBIGJ1ZmZlcnMgKGlzb2xhdGUgdGhlIGludGVyZmFjZSkKKwkgKiBhbmQgYXNzZXJ0IFJFU0VUIHNpZ25hbAorCSAqLworCWRlYnVnICgiRGlzYWJsZSBQQ01DSUEgYnVmZmVycyBhbmQgYXNzZXJ0IFJFU0VUXG4iKTsKKwlyZWcgID0gIFBDTUNJQV9QR0NSWChfc2xvdF8pOworCXJlZyB8PSAgX19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworCXJlZyB8PSAgX19NWV9QQ01DSUFfR0NSWF9DWE9FOwkJLyogYWN0aXZlIGxvdyAgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IHJlZzsKKwl1ZGVsYXkoNTAwKTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIGlzIGEgY2FyZCBpbiB0aGUgc2xvdCwgdGhlbiBjb25maWd1cmUgdGhlIGludGVyZmFjZS4KKwkgKi8KKwl1ZGVsYXkoMTAwMDApOworCWRlYnVnICgiWyVkXSAlczogUElQUiglcCk9MHgleFxuIiwKKwkJX19MSU5FX18sX19GVU5DVElPTl9fLAorCQkmKHBjbXAtPnBjbWNfcGlwcikscGNtcC0+cGNtY19waXByKTsKKwlpZiAocGNtcC0+cGNtY19waXByICYgMHgwMDAwMTgwMCkgeworCQlwcmludGYgKCIgICBObyBDYXJkIGZvdW5kXG4iKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKgorCSAqIFBvd2VyIE9uOiBTZXQgVkFWQ0MgdG8gMy4zViBvciA1Viwgc2V0IFZBVlBQIHRvIEhpLVoKKwkgKi8KKwltYXNrID0gUENNQ0lBX1ZTMShzbG90KSB8IFBDTUNJQV9WUzIoc2xvdCk7CisJcGlwciA9IHBjbXAtPnBjbWNfcGlwcjsKKwlkZWJ1ZyAoIlBJUFI6IDB4JXggPT0+IFZTMT1vJXMsIFZTMj1vJXNcbiIsCisJCXBpcHIsCisJCShyZWcmUENNQ0lBX1ZTMShzbG90KSk/Im4iOiJmZiIsCisJCShyZWcmUENNQ0lBX1ZTMihzbG90KSk/Im4iOiJmZiIpOworCisJc3JlZyA9IGltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGF0OworCWlmICgocGlwciAmIG1hc2spID09IG1hc2spIHsKKwkJc3JlZyB8PSAgKFRQUzIyMTFfVlBQRDAgfCBUUFMyMjExX1ZQUEQxIHwJLyogVkFWUFAgPT4gSGktWiAqLworCQkJICBUUFMyMjExX1ZDQ0QxKTsJCQkvKiA1ViBvbgkqLworCQlzcmVnICY9IH4oVFBTMjIxMV9WQ0NEMCk7CQkJLyogM1Ygb2ZmCSovCisJCXB1dHMgKCIgNS4wViBjYXJkIGZvdW5kOiAiKTsKKwl9IGVsc2UgeworCQlzcmVnIHw9ICAoVFBTMjIxMV9WUFBEMCB8IFRQUzIyMTFfVlBQRDEgfAkvKiBWQVZQUCA9PiBIaS1aICovCisJCQkgIFRQUzIyMTFfVkNDRDApOwkJCS8qIDNWIG9uCSovCisJCXNyZWcgJj0gfihUUFMyMjExX1ZDQ0QxKTsJCQkvKiA1ViBvZmYJKi8KKwkJcHV0cyAoIiAzLjNWIGNhcmQgZm91bmQ6ICIpOworCX0KKworCWRlYnVnICgiXG5QQyBEQVQ6ICUwNHggLT4gMy4zViAlcyA1LjBWICVzXG4iLAorCQlzcmVnLAorCQkoIChzcmVnICYgVFBTMjIxMV9WQ0NEMCkgJiYgIShzcmVnICYgVFBTMjIxMV9WQ0NEMSkpID8gIm9uIiA6ICJvZmYiLAorCQkoIShzcmVnICYgVFBTMjIxMV9WQ0NEMCkgJiYgIChzcmVnICYgVFBTMjIxMV9WQ0NEMSkpID8gIm9uIiA6ICJvZmYiCisJKTsKKworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGF0ID0gc3JlZzsKKworCS8qICBXYWl0IDUwMCBtczsgdXNlIHRoaXMgdG8gY2hlY2sgZm9yIG92ZXItY3VycmVudCAqLworCWZvciAoaT0wOyBpPDUwMDA7ICsraSkgeworCQlpZiAoKGNwLT5jcF9wYmRhdCAmIFRQUzIyMTFfT0MpID09IDApIHsKKwkJICAgIHByaW50ZiAoIiAgICoqKiBPdmVyY3VycmVudCAtIFNhZmV0eSBzaHV0ZG93biAqKipcbiIpOworCQkgICAgaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkYXQgJj0gfihUUFMyMjExX1ZDQ0QwfFRQUzIyMTFfVkNDRDEpOworCQkgICAgcmV0dXJuICgxKTsKKwkJfQorCQl1ZGVsYXkgKDEwMCk7CisJfQorCisJZGVidWcgKCJFbmFibGUgUENNQ0lBIGJ1ZmZlcnMgYW5kIHN0b3AgUkVTRVRcbiIpOworCXJlZyAgPSAgUENNQ0lBX1BHQ1JYKF9zbG90Xyk7CisJcmVnICY9IH5fX01ZX1BDTUNJQV9HQ1JYX0NYUkVTRVQ7CS8qIGFjdGl2ZSBoaWdoICovCisJcmVnICY9IH5fX01ZX1BDTUNJQV9HQ1JYX0NYT0U7CQkvKiBhY3RpdmUgbG93ICAqLworCVBDTUNJQV9QR0NSWChfc2xvdF8pID0gcmVnOworCisJdWRlbGF5KDI1MDAwMCk7CS8qIHNvbWUgY2FyZHMgbmVlZCA+MTUwIG1zIHRvIGNvbWUgdXAgOi0oICovCisKKwlkZWJ1ZyAoIiMgaGFyZHdhcmVfZW5hYmxlIGRvbmVcbiIpOworCisJcmV0dXJuICgwKTsKK30KKworCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCitzdGF0aWMgaW50IGhhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCit7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CisJdm9sYXRpbGUgY3BtOHh4X3QJKmNwOworCXZvbGF0aWxlIHBjbWNvbmY4eHhfdAkqcGNtcDsKKwl1X2xvbmcgcmVnOworCisJZGVidWcgKCJoYXJkd2FyZV9kaXNhYmxlOiAiIFBDTUNJQV9CT0FSRF9NU0cgIiBTbG90ICVjXG4iLCAnQScrc2xvdCk7CisKKwlpbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJcGNtcCAgPSAocGNtY29uZjh4eF90ICopKCYoKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9wY21jaWEpKTsKKworCS8qIENvbmZpZ3VyZSBQQ01DSUEgR2VuZXJhbCBDb250cm9sIFJlZ2lzdGVyICovCisJUENNQ0lBX1BHQ1JYKF9zbG90XykgPSAwOworCisJZGVidWcgKCJEaXNhYmxlIFBDTUNJQSBidWZmZXJzIGFuZCBhc3NlcnQgUkVTRVRcbiIpOworCXJlZyAgPSAgUENNQ0lBX1BHQ1JYKF9zbG90Xyk7CisJcmVnIHw9IF9fTVlfUENNQ0lBX0dDUlhfQ1hSRVNFVDsJLyogYWN0aXZlIGhpZ2ggKi8KKwlyZWcgfD0gX19NWV9QQ01DSUFfR0NSWF9DWE9FOwkJLyogYWN0aXZlIGxvdyAgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IHJlZzsKKworCS8qIEFMbCB2b2x0YWdlcyBvZmYgLyBIaS1aICovCisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkYXQgfD0gKFRQUzIyMTFfVlBQRDAgfCBUUFMyMjExX1ZQUEQxIHwKKwkJCQkgICAgICAgVFBTMjIxMV9WQ0NEMCB8IFRQUzIyMTFfVkNDRDEgKTsKKworCXVkZWxheSgxMDAwMCk7CisKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisKKworCitzdGF0aWMgaW50IHZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQoreworCXZvbGF0aWxlIGltbWFwX3QJKmltbWFwOworCXZvbGF0aWxlIGNwbTh4eF90CSpjcDsKKwl2b2xhdGlsZSBwY21jb25mOHh4X3QJKnBjbXA7CisJdV9sb25nIHJlZzsKKwl1c2hvcnQgc3JlZzsKKworCWRlYnVnICgidm9sdGFnZV9zZXQ6ICIKKwkJUENNQ0lBX0JPQVJEX01TRworCQkiIFNsb3QgJWMsIFZjYz0lZC4lZCwgVnBwPSVkLiVkXG4iLAorCQknQScrc2xvdCwgdmNjLzEwLCB2Y2MlMTAsIHZwcC8xMCwgdmNjJTEwKTsKKworCWltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKwljcCAgICA9IChjcG04eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fY3BtKSk7CisJcGNtcCAgPSAocGNtY29uZjh4eF90ICopKCYoKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9wY21jaWEpKTsKKwkvKgorCSAqIERpc2FibGUgUENNQ0lBIGJ1ZmZlcnMgKGlzb2xhdGUgdGhlIGludGVyZmFjZSkKKwkgKiBhbmQgYXNzZXJ0IFJFU0VUIHNpZ25hbAorCSAqLworCWRlYnVnICgiRGlzYWJsZSBQQ01DSUEgYnVmZmVycyBhbmQgYXNzZXJ0IFJFU0VUXG4iKTsKKwlyZWcgID0gIFBDTUNJQV9QR0NSWChfc2xvdF8pOworCXJlZyB8PSAgX19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworCXJlZyB8PSAgX19NWV9QQ01DSUFfR0NSWF9DWE9FOwkJLyogYWN0aXZlIGxvdyAgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IHJlZzsKKwl1ZGVsYXkoNTAwKTsKKworCS8qCisJICogQ29uZmlndXJlIFBvcnQgQyBwaW5zIGZvcgorCSAqIDUgVm9sdHMgRW5hYmxlIGFuZCAzIFZvbHRzIGVuYWJsZSwKKwkgKiBUdXJuIGFsbCBwb3dlciBwaW5zIHRvIEhpLVoKKwkgKi8KKwlkZWJ1ZyAoIlBDTUNJQSBwb3dlciBPRkZcbiIpOworCWNmZ19wb3J0cyAoKTsJLyogRW5hYmxlcyBzd2l0Y2gsIGJ1dCBhbGwgaW4gSGktWiAqLworCisJc3JlZyAgPSBpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RhdDsKKwlzcmVnIHw9IFRQUzIyMTFfVlBQRDAgfCBUUFMyMjExX1ZQUEQxOwkJLyogVkFWUFAgYWx3YXlzIEhpLVogKi8KKworCXN3aXRjaCh2Y2MpIHsKKwljYXNlICAwOiAJCQlicmVhazsJLyogU3dpdGNoIG9mZgkJKi8KKwljYXNlIDMzOiBzcmVnIHw9ICBUUFMyMjExX1ZDQ0QwOwkvKiBTd2l0Y2ggb24gMy4zVgkqLworCQkgc3JlZyAmPSB+VFBTMjIxMV9WQ0NEMTsKKwkJIAkJCWJyZWFrOworCWNhc2UgNTA6IHNyZWcgJj0gflRQUzIyMTFfVkNDRDA7CS8qIFN3aXRjaCBvbiA1LjBWCSovCisJCSBzcmVnIHw9ICBUUFMyMjExX1ZDQ0QxOworCQkgCQkJYnJlYWs7CisJZGVmYXVsdDogCQkJZ290byBkb25lOworCX0KKworCS8qIENoZWNraW5nIHN1cHBvcnRlZCB2b2x0YWdlcyAqLworCisJZGVidWcgKCJQSVBSOiAweCV4IC0tPiAlc1xuIiwKKwkJcGNtcC0+cGNtY19waXByLAorCQkocGNtcC0+cGNtY19waXByICYgMHgwMDAwODAwMCkgPyAib25seSA1IFYiIDogImNhbiBkbyAzLjNWIik7CisKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RhdCA9IHNyZWc7CisKKyNpZmRlZiBERUJVRworICAgIHsKKwljaGFyICpzOworCisJaWYgKChzcmVnICYgVFBTMjIxMV9WQ0NEMCkgJiYgIShzcmVnICYgVFBTMjIxMV9WQ0NEMSkpIHsKKwkJcyA9ICJhdCAzLjNWIjsKKwl9IGVsc2UgaWYgKCEoc3JlZyAmIFRQUzIyMTFfVkNDRDApICYmICAoc3JlZyAmIFRQUzIyMTFfVkNDRDEpKSB7CisJCXMgPSAiYXQgNS4wViI7CisJfSBlbHNlIHsKKwkJcyA9ICJkb3duIjsKKwl9CisJcHJpbnRmICgiUENNQ0lBIHBvd2VyZWQgJXNcbiIsIHMpOworICAgIH0KKyNlbmRpZgorCitkb25lOgorCWRlYnVnICgiRW5hYmxlIFBDTUNJQSBidWZmZXJzIGFuZCBzdG9wIFJFU0VUXG4iKTsKKwlyZWcgID0gIFBDTUNJQV9QR0NSWChfc2xvdF8pOworCXJlZyAmPSB+X19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworCXJlZyAmPSB+X19NWV9QQ01DSUFfR0NSWF9DWE9FOwkJLyogYWN0aXZlIGxvdyAgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IHJlZzsKKwl1ZGVsYXkoNTAwKTsKKworCWRlYnVnICgidm9sdGFnZV9zZXQ6ICIgUENNQ0lBX0JPQVJEX01TRyAiIFNsb3QgJWMsIERPTkVcbiIsCisJCXNsb3QrJ0EnKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZCBjZmdfcG9ydHMgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CisJdm9sYXRpbGUgY3BtOHh4X3QJKmNwOworCXVzaG9ydCBzcmVnOworCisJaW1tYXAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworCWNwICAgID0gKGNwbTh4eF90ICopKCYoKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9jcG0pKTsKKworCS8qCisJICogQ29uZmlndXJlIFBvcnQgQyBmb3IgVFBTMjIxMSBQQy1DYXJkIFBvd2VyLUludGVyZmFjZSBTd2l0Y2gKKwkgKgorCSAqIFN3aXRjaCBvZmYgYWxsIHZvbHRhZ2VzLCBhc3NlcnQgc2h1dGRvd24KKwkgKi8KKwlzcmVnID0gaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkYXQ7CisJc3JlZyB8PSAgKFRQUzIyMTFfVlBQRDAgfCBUUFMyMjExX1ZQUEQxKTsJLyogVkFWUFAgPT4gSGktWiAqLworCXNyZWcgJj0gfihUUFMyMjExX1ZDQ0QwIHwgVFBTMjIxMV9WQ0NEMSk7CS8qIDNWIGFuZCA1ViBvZmYgKi8KKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RhdCA9IHNyZWc7CisKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY3BhciAmPSB+KFRQUzIyMTFfT1VUUFVUUyk7CisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkaXIgfD0gICBUUFMyMjExX09VVFBVVFM7CisKKwlkZWJ1ZyAoIlNldCBQb3J0IEM6IFBBUjogICAgICUwNHggRElSOiAgICAgJTA0eCBEQVQ6ICAgICAlMDR4XG4iLAorCQlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY3BhciwKKwkJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkaXIsCisJCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGF0KTsKKworCS8qCisJICogQ29uZmlndXJlIFBvcnQgQiBmb3IgVFBTMjIxMSBQQy1DYXJkIFBvd2VyLUludGVyZmFjZSBTd2l0Y2gKKwkgKgorCSAqIE92ZXItQ3VycmVudCBJbnB1dCBvbmx5CisJICovCisJY3AtPmNwX3BicGFyICY9IH4oVFBTMjIxMV9JTlBVVFMpOworCWNwLT5jcF9wYmRpciAmPSB+KFRQUzIyMTFfSU5QVVRTKTsKKworCWRlYnVnICgiU2V0IFBvcnQgQjogUEFSOiAlMDh4IERJUjogJTA4eCBEQVQ6ICUwOHhcbiIsCisJCWNwLT5jcF9wYnBhciwgY3AtPmNwX3BiZGlyLCBjcC0+Y3BfcGJkYXQpOworfQorCisjZW5kaWYJLyogQzJNT04gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgTUJYIGJvYXJkIGZyb20gTW9yb3RvbGEKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoIENPTkZJR19NQlggKQorI2luY2x1ZGUgPC4uL2JvYXJkL21ieDh4eC9jc3IuaD4KKworLyogQSBsb3Qgb2YgdGhpcyBoYXMgYmVlbiB0YWtlbiBmcm9tIHRoZSBSUFggY29kZSBpbiB0aGlzIGZpbGUgaXQgd29ya3MgZnJvbSBtZS4KKyAgIEkgaGF2ZSBhZGRlZCB0aGUgdm9sdGFnZSBzZWxlY3Rpb24gZm9yIHRoZSBNQlggYm9hcmQuICovCisKKy8qIE1CWCB2b2x0YWdlIGJpdCBpbiBjb250cm9sIHJlZ2lzdGVyICMyICovCisjZGVmaW5lIENSMl9WUFAxMiAgICAgICAoKHVjaGFyKTB4MTApCisjZGVmaW5lIENSMl9WUFBWREQgICAgICAoKHVjaGFyKTB4MjApCisjZGVmaW5lIENSMl9WREQ1ICAgICAgICAoKHVjaGFyKTB4NDApCisjZGVmaW5lIENSMl9WREQzICAgICAgICAoKHVjaGFyKTB4ODApCisKKyNkZWZpbmUgUENNQ0lBX0JPQVJEX01TRyAiTUJYODYwIgorCitzdGF0aWMgaW50IHZvbHRhZ2Vfc2V0IChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKK3sKKwl1Y2hhciByZWcgPSAwOworCisJZGVidWcgKCJ2b2x0YWdlX3NldDogUENNQ0lBX0JPQVJEX01TRyBTbG90ICVjLCBWY2M9JWQuJWQsIFZwcD0lZC4lZFxuIiwKKwkJICdBJyArIHNsb3QsIHZjYyAvIDEwLCB2Y2MgJSAxMCwgdnBwIC8gMTAsIHZjYyAlIDEwKTsKKworCXN3aXRjaCAodmNjKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDMzOgorCQlyZWcgfD0gQ1IyX1ZERDM7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXJlZyB8PSBDUjJfVkRENTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCisJc3dpdGNoICh2cHApIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJY2FzZSA1MDoKKwkJaWYgKHZjYyA9PSB2cHApIHsKKwkJCXJlZyB8PSBDUjJfVlBQVkREOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAxMjA6CisJCXJlZyB8PSBDUjJfVlBQMTI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KKworCS8qIGZpcnN0LCB0dXJuIG9mZiBhbGwgcG93ZXIgKi8KKwlNQlhfQ1NSMiAmPSB+KENSMl9WRERTRUwgfCBDUjJfVlBQU0VMKTsKKworCS8qIGVuYWJsZSBuZXcgcG93ZXJzZXR0aW5ncyAqLworCU1CWF9DU1IyIHw9IHJlZzsKKwlkZWJ1ZyAoIk1CWF9DU1IyIHJlYWQgPSAweCUwMnhcbiIsIE1CWF9DU1IyKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgaGFyZHdhcmVfZW5hYmxlIChpbnQgc2xvdCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcDsKKwl2b2xhdGlsZSBjcG04eHhfdCAqY3A7CisJdm9sYXRpbGUgcGNtY29uZjh4eF90ICpwY21wOworCXZvbGF0aWxlIHN5c2NvbmY4eHhfdCAqc3lzcDsKKwl1aW50IHJlZywgbWFzazsKKworCWRlYnVnICgiaGFyZHdhcmVfZW5hYmxlOiAiIFBDTUNJQV9CT0FSRF9NU0cgIiBTbG90ICVjXG4iLAorCQkJCSAgJ0EnICsgc2xvdCk7CisKKwl1ZGVsYXkgKDEwMDAwKTsKKworCWltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJc3lzcCA9IChzeXNjb25mOHh4X3QgKikgKCYoKChpbW1hcF90ICopIENGR19JTU1SKS0+aW1fc2l1X2NvbmYpKTsKKwlwY21wID0gKHBjbWNvbmY4eHhfdCAqKSAoJigoKGltbWFwX3QgKikgQ0ZHX0lNTVIpLT5pbV9wY21jaWEpKTsKKwljcCA9IChjcG04eHhfdCAqKSAoJigoKGltbWFwX3QgKikgQ0ZHX0lNTVIpLT5pbV9jcG0pKTsKKworCS8qIGNsZWFyIGludGVycnVwdCBzdGF0ZSwgYW5kIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXBjbXAtPnBjbWNfcHNjciA9IFBDTUNJQV9NQVNLIChfc2xvdF8pOworCXBjbXAtPnBjbWNfcGVyICY9IH5QQ01DSUFfTUFTSyAoX3Nsb3RfKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAmIERNQSAqLworCVBDTUNJQV9QR0NSWCAoX3Nsb3RfKSA9IDA7CisKKwkvKgorCSAqIERpc2FibGUgUENNQ0lBIGJ1ZmZlcnMgKGlzb2xhdGUgdGhlIGludGVyZmFjZSkKKwkgKiBhbmQgYXNzZXJ0IFJFU0VUIHNpZ25hbAorCSAqLworCWRlYnVnICgiRGlzYWJsZSBQQ01DSUEgYnVmZmVycyBhbmQgYXNzZXJ0IFJFU0VUXG4iKTsKKwlyZWcgPSBQQ01DSUFfUEdDUlggKF9zbG90Xyk7CisJcmVnIHw9IF9fTVlfUENNQ0lBX0dDUlhfQ1hSRVNFVDsJLyogYWN0aXZlIGhpZ2ggKi8KKwlyZWcgfD0gX19NWV9QQ01DSUFfR0NSWF9DWE9FOwkvKiBhY3RpdmUgbG93ICAqLworCVBDTUNJQV9QR0NSWCAoX3Nsb3RfKSA9IHJlZzsKKwl1ZGVsYXkgKDUwMCk7CisKKwkvKiByZW1vdmUgYWxsIHBvd2VyICovCisJdm9sdGFnZV9zZXQgKHNsb3QsIDAsIDApOworCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIGlzIGEgY2FyZCBpbiB0aGUgc2xvdCwgdGhlbiBjb25maWd1cmUgdGhlIGludGVyZmFjZS4KKwkgKi8KKwl1ZGVsYXkgKDEwMDAwKTsKKwlkZWJ1ZyAoIlslZF0gJXM6IFBJUFIoJXApPTB4JXhcbiIsIF9fTElORV9fLCBfX0ZVTkNUSU9OX18sCisJCSAgJihwY21wLT5wY21jX3BpcHIpLCBwY21wLT5wY21jX3BpcHIpOworCisJaWYgKHBjbXAtPnBjbWNfcGlwciAmIDB4MDAwMDE4MDApIHsKKwkJcHJpbnRmICgiICAgTm8gQ2FyZCBmb3VuZFxuIik7CisJCXJldHVybiAoMSk7CisJfQorCisJLyoKKwkgKiBQb3dlciBPbi4KKwkgKi8KKwltYXNrID0gUENNQ0lBX1ZTMSAoX3Nsb3RfKSB8IFBDTUNJQV9WUzIgKF9zbG90Xyk7CisJcmVnID0gcGNtcC0+cGNtY19waXByOworCWRlYnVnICgiUElQUjogMHgleCA9PT4gVlMxPW8lcywgVlMyPW8lc1xuIiwgcmVnLAorCQkgIChyZWcgJiBQQ01DSUFfVlMxIChzbG90KSkgPyAibiIgOiAiZmYiLAorCQkgIChyZWcgJiBQQ01DSUFfVlMyIChzbG90KSkgPyAibiIgOiAiZmYiKTsKKworCWlmICgocmVnICYgbWFzaykgPT0gbWFzaykgeworCQl2b2x0YWdlX3NldCAoX3Nsb3RfLCA1MCwgMCk7CisJCXByaW50ZiAoIiA1LjBWIGNhcmQgZm91bmQ6ICIpOworCX0gZWxzZSB7CisJCXZvbHRhZ2Vfc2V0IChfc2xvdF8sIDMzLCAwKTsKKwkJcHJpbnRmICgiIDMuM1YgY2FyZCBmb3VuZDogIik7CisJfQorCisJZGVidWcgKCJFbmFibGUgUENNQ0lBIGJ1ZmZlcnMgYW5kIHN0b3AgUkVTRVRcbiIpOworCXJlZyA9IFBDTUNJQV9QR0NSWCAoX3Nsb3RfKTsKKwlyZWcgJj0gfl9fTVlfUENNQ0lBX0dDUlhfQ1hSRVNFVDsJLyogYWN0aXZlIGhpZ2ggKi8KKwlyZWcgJj0gfl9fTVlfUENNQ0lBX0dDUlhfQ1hPRTsJLyogYWN0aXZlIGxvdyAgKi8KKwlQQ01DSUFfUEdDUlggKF9zbG90XykgPSByZWc7CisKKwl1ZGVsYXkgKDI1MDAwMCk7CS8qIHNvbWUgY2FyZHMgbmVlZCA+MTUwIG1zIHRvIGNvbWUgdXAgOi0oICovCisKKwlkZWJ1ZyAoIiMgaGFyZHdhcmVfZW5hYmxlIGRvbmVcbiIpOworCisJcmV0dXJuICgwKTsKK30KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKK3N0YXRpYyBpbnQgaGFyZHdhcmVfZGlzYWJsZSAoaW50IHNsb3QpCit7CisJcmV0dXJuIDA7CS8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KK30KKyNlbmRpZiAvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmIC8qIENPTkZJR19NQlggKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFIzNjBNUEkgQm9hcmQJCQkJCQkJCSovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19SMzYwTVBJKQorCisjZGVmaW5lIFBDTUNJQV9CT0FSRF9NU0cgIlIzNjBNUEkiCisKKworc3RhdGljIGludCBoYXJkd2FyZV9lbmFibGUoaW50IHNsb3QpCit7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CisJdm9sYXRpbGUgY3BtOHh4X3QJKmNwOworCXZvbGF0aWxlIHBjbWNvbmY4eHhfdAkqcGNtcDsKKwl2b2xhdGlsZSBzeXNjb25mOHh4X3QJKnN5c3A7CisJdWludCByZWcsIG1hc2s7CisKKwlkZWJ1ZyAoImhhcmR3YXJlX2VuYWJsZTogIiBQQ01DSUFfQk9BUkRfTVNHICIgU2xvdCAlY1xuIiwgJ0EnK3Nsb3QpOworCisJdWRlbGF5KDEwMDAwKTsKKworCWltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKwlzeXNwICA9IChzeXNjb25mOHh4X3QgKikoJigoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX3NpdV9jb25mKSk7CisJcGNtcCAgPSAocGNtY29uZjh4eF90ICopKCYoKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9wY21jaWEpKTsKKwljcCAgICA9IChjcG04eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fY3BtKSk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBTSVVNQ1IgdG8gZW5hYmxlIFBDTUNJQSBwb3J0IEIKKwkgKiAoVkZMU1swOjFdIGFyZSBub3QgdXNlZCBmb3IgZGVidWdnaW5nLCB3ZSBjb25uZWN0IEZSWiMgaW5zdGVhZCkKKwkgKi8KKwlzeXNwLT5zY19zaXVtY3IgJj0gflNJVU1DUl9EQkdDMTE7CS8qIHNldCBEQkdDIHRvIDAwICovCisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdGUsIGFuZCBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlwY21wLT5wY21jX3BzY3IgPSAgUENNQ0lBX01BU0soX3Nsb3RfKTsKKwlwY21wLT5wY21jX3BlciAmPSB+UENNQ0lBX01BU0soX3Nsb3RfKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAmIERNQSAqLworCVBDTUNJQV9QR0NSWChfc2xvdF8pID0gMDsKKworCS8qCisJICogRGlzYWJsZSBQQ01DSUEgYnVmZmVycyAoaXNvbGF0ZSB0aGUgaW50ZXJmYWNlKQorCSAqIGFuZCBhc3NlcnQgUkVTRVQgc2lnbmFsCisJICovCisJZGVidWcgKCJEaXNhYmxlIFBDTUNJQSBidWZmZXJzIGFuZCBhc3NlcnQgUkVTRVRcbiIpOworCXJlZyAgPSAgUENNQ0lBX1BHQ1JYKF9zbG90Xyk7CisJcmVnIHw9ICBfX01ZX1BDTUNJQV9HQ1JYX0NYUkVTRVQ7CS8qIGFjdGl2ZSBoaWdoICovCisJcmVnIHw9ICBfX01ZX1BDTUNJQV9HQ1JYX0NYT0U7CQkvKiBhY3RpdmUgbG93ICAqLworCVBDTUNJQV9QR0NSWChfc2xvdF8pID0gcmVnOworCXVkZWxheSg1MDApOworCisJLyoKKwkgKiBDb25maWd1cmUgUG9ydHMgQSwgQiAmIEMgcGlucyBmb3IKKwkgKiA1IFZvbHRzIEVuYWJsZSBhbmQgMyBWb2x0cyBlbmFibGUKKwkgKi8KKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY3BhciAmPSB+KDB4MDQwMCk7CisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNzbyAgJj0gfigweDA0MDApOy8qCisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkaXIgfD0gMHgwNDAwOyovCisKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wYXBhciAmPSB+KDB4MDIwMCk7LyoKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wYWRpciB8PSAweDAyMDA7Ki8KKyNpZiAwCisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGJwYXIgJj0gfigweEMwMDApOworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BiZGlyICY9IH4oMHhDMDAwKTsKKyNlbmRpZgorCS8qIHJlbW92ZSBhbGwgcG93ZXIgKi8KKworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGF0IHw9IDB4MDQwMDsKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wYWRhdCB8PSAweDAyMDA7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGNhcmQgaW4gdGhlIHNsb3QsIHRoZW4gY29uZmlndXJlIHRoZSBpbnRlcmZhY2UuCisJICovCisJdWRlbGF5KDEwMDAwKTsKKwlkZWJ1ZyAoIlslZF0gJXM6IFBJUFIoJXApPTB4JXhcbiIsCisJCV9fTElORV9fLF9fRlVOQ1RJT05fXywKKwkJJihwY21wLT5wY21jX3BpcHIpLHBjbXAtPnBjbWNfcGlwcik7CisJaWYgKHBjbXAtPnBjbWNfcGlwciAmIDB4MDAwMDE4MDApIHsKKwkJcHJpbnRmICgiICAgTm8gQ2FyZCBmb3VuZFxuIik7CisJCXJldHVybiAoMSk7CisJfQorCisJLyoKKwkgKiBQb3dlciBPbi4KKwkgKi8KKwltYXNrID0gUENNQ0lBX1ZTMShzbG90KSB8IFBDTUNJQV9WUzIoc2xvdCk7CisJcmVnICA9IHBjbXAtPnBjbWNfcGlwcjsKKwlkZWJ1ZyAoIlBJUFI6IDB4JXggPT0+IFZTMT1vJXMsIFZTMj1vJXNcbiIsCisJCXJlZywKKwkJKHJlZyZQQ01DSUFfVlMxKHNsb3QpKT8ibiI6ImZmIiwKKwkJKHJlZyZQQ01DSUFfVlMyKHNsb3QpKT8ibiI6ImZmIik7CisJaWYgKChyZWcgJiBtYXNrKSA9PSBtYXNrKSB7CisJCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGF0ICY9IH4oMHg0MDAwKTsKKwkJcHV0cyAoIiA1LjBWIGNhcmQgZm91bmQ6ICIpOworCX0gZWxzZSB7CisJCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhZGF0ICY9IH4oMHgwMDAyKTsKKwkJcHV0cyAoIiAzLjNWIGNhcmQgZm91bmQ6ICIpOworCX0KKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RpciB8PSAweDA0MDA7CisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGFkaXIgfD0gMHgwMjAwOworI2lmIDAKKwkvKiAgVkNDIHN3aXRjaCBlcnJvciBmbGFnLCBQQ01DSUEgc2xvdCBJTlBBQ0tfIHBpbiAqLworCWNwLT5jcF9wYmRpciAmPSB+KDB4MDAyMCB8IDB4MDAxMCk7CisJY3AtPmNwX3BicGFyICY9IH4oMHgwMDIwIHwgMHgwMDEwKTsKKwl1ZGVsYXkoNTAwMDAwKTsKKyNlbmRpZgorCWRlYnVnICgiRW5hYmxlIFBDTUNJQSBidWZmZXJzIGFuZCBzdG9wIFJFU0VUXG4iKTsKKwlyZWcgID0gIFBDTUNJQV9QR0NSWChfc2xvdF8pOworCXJlZyAmPSB+X19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworCXJlZyAmPSB+X19NWV9QQ01DSUFfR0NSWF9DWE9FOwkJLyogYWN0aXZlIGxvdyAgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IHJlZzsKKworCXVkZWxheSgyNTAwMDApOwkvKiBzb21lIGNhcmRzIG5lZWQgPjE1MCBtcyB0byBjb21lIHVwIDotKCAqLworCisJZGVidWcgKCIjIGhhcmR3YXJlX2VuYWJsZSBkb25lXG4iKTsKKworCXJldHVybiAoMCk7Cit9CisKKworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorc3RhdGljIGludCBoYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQoreworCXZvbGF0aWxlIGltbWFwX3QJKmltbWFwOworCXZvbGF0aWxlIHBjbWNvbmY4eHhfdAkqcGNtcDsKKwl1X2xvbmcgcmVnOworCisJZGVidWcgKCJoYXJkd2FyZV9kaXNhYmxlOiAiIFBDTUNJQV9CT0FSRF9NU0cgIiBTbG90ICVjXG4iLCAnQScrc2xvdCk7CisKKwlpbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJcGNtcCA9IChwY21jb25mOHh4X3QgKikoJigoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX3BjbWNpYSkpOworCisJLyogcmVtb3ZlIGFsbCBwb3dlciAqLworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGF0IHw9IDB4MDQwMDsKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wYWRhdCB8PSAweDAyMDA7CisKKwkvKiBDb25maWd1cmUgUENNQ0lBIEdlbmVyYWwgQ29udHJvbCBSZWdpc3RlciAqLworCVBDTUNJQV9QR0NSWChfc2xvdF8pID0gMDsKKworCWRlYnVnICgiRGlzYWJsZSBQQ01DSUEgYnVmZmVycyBhbmQgYXNzZXJ0IFJFU0VUXG4iKTsKKwlyZWcgID0gIFBDTUNJQV9QR0NSWChfc2xvdF8pOworCXJlZyB8PSBfX01ZX1BDTUNJQV9HQ1JYX0NYUkVTRVQ7CS8qIGFjdGl2ZSBoaWdoICovCisJcmVnIHw9IF9fTVlfUENNQ0lBX0dDUlhfQ1hPRTsJCS8qIGFjdGl2ZSBsb3cgICovCisJUENNQ0lBX1BHQ1JYKF9zbG90XykgPSByZWc7CisKKwl1ZGVsYXkoMTAwMDApOworCisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworCisKKworc3RhdGljIGludCB2b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKKwl2b2xhdGlsZSBwY21jb25mOHh4X3QJKnBjbXA7CisJdV9sb25nIHJlZzsKKworCWRlYnVnICgidm9sdGFnZV9zZXQ6ICIKKwkJUENNQ0lBX0JPQVJEX01TRworCQkiIFNsb3QgJWMsIFZjYz0lZC4lZCwgVnBwPSVkLiVkXG4iLAorCQknQScrc2xvdCwgdmNjLzEwLCB2Y2MlMTAsIHZwcC8xMCwgdmNjJTEwKTsKKworCWltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKwlwY21wID0gKHBjbWNvbmY4eHhfdCAqKSgmKCgoaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1fcGNtY2lhKSk7CisJLyoKKwkgKiBEaXNhYmxlIFBDTUNJQSBidWZmZXJzIChpc29sYXRlIHRoZSBpbnRlcmZhY2UpCisJICogYW5kIGFzc2VydCBSRVNFVCBzaWduYWwKKwkgKi8KKwlkZWJ1ZyAoIkRpc2FibGUgUENNQ0lBIGJ1ZmZlcnMgYW5kIGFzc2VydCBSRVNFVFxuIik7CisJcmVnICA9ICBQQ01DSUFfUEdDUlgoX3Nsb3RfKTsKKwlyZWcgfD0gIF9fTVlfUENNQ0lBX0dDUlhfQ1hSRVNFVDsJLyogYWN0aXZlIGhpZ2ggKi8KKwlyZWcgfD0gIF9fTVlfUENNQ0lBX0dDUlhfQ1hPRTsJCS8qIGFjdGl2ZSBsb3cgICovCisJUENNQ0lBX1BHQ1JYKF9zbG90XykgPSByZWc7CisJdWRlbGF5KDUwMCk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBQb3J0cyBBICYgQyBwaW5zIGZvcgorCSAqIDUgVm9sdHMgRW5hYmxlIGFuZCAzIFZvbHRzIGVuYWJsZSwKKwkgKiBUdXJuIG9mZiBhbGwgcG93ZXIKKwkgKi8KKwlkZWJ1ZyAoIlBDTUNJQSBwb3dlciBPRkZcbiIpOworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IH4oMHgwNDAwKTsKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY3NvICAmPSB+KDB4MDQwMCk7LyoKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RpciB8PSAweDA0MDA7Ki8KKworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhcGFyICY9IH4oMHgwMjAwKTsvKgorCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhZGlyIHw9IDB4MDIwMDsqLworCisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkYXQgfD0gMHgwNDAwOworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhZGF0IHw9IDB4MDIwMDsKKworCXJlZyA9IDA7CisJc3dpdGNoKHZjYykgeworCWNhc2UgIDA6IAkJYnJlYWs7CisJY2FzZSAzMzogcmVnIHw9IDB4MDIwMDsJYnJlYWs7CisJY2FzZSA1MDogcmVnIHw9IDB4MDQwMDsJYnJlYWs7CisJZGVmYXVsdDogCQlnb3RvIGRvbmU7CisJfQorCisJLyogQ2hlY2tpbmcgc3VwcG9ydGVkIHZvbHRhZ2VzICovCisKKwlkZWJ1ZyAoIlBJUFI6IDB4JXggLS0+ICVzXG4iLAorCQlwY21wLT5wY21jX3BpcHIsCisJCShwY21wLT5wY21jX3BpcHIgJiAweDAwMDA4MDAwKSA/ICJvbmx5IDUgViIgOiAiY2FuIGRvIDMuM1YiKTsKKworCWlmIChyZWcgJiAweDAyMDApCisJCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGF0ICY9ICFyZWc7CisJaWYgKHJlZyAmIDB4MDQwMCkKKwkJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGFkYXQgJj0gIXJlZzsKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RpciB8PSAgMHgwMjAwOworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhZGlyIHw9ICAweDA0MDA7CisJaWYgKHJlZykgeworCQlkZWJ1ZyAoIlBDTUNJQSBwb3dlcmVkIGF0ICVzVlxuIiwKKwkJCShyZWcmMHgwNDAwKSA/ICI1LjAiIDogIjMuMyIpOworCX0gZWxzZSB7CisJCWRlYnVnICgiUENNQ0lBIHBvd2VyZWQgZG93blxuIik7CisJfQorCitkb25lOgorCWRlYnVnICgiRW5hYmxlIFBDTUNJQSBidWZmZXJzIGFuZCBzdG9wIFJFU0VUXG4iKTsKKwlyZWcgID0gIFBDTUNJQV9QR0NSWChfc2xvdF8pOworCXJlZyAmPSB+X19NWV9QQ01DSUFfR0NSWF9DWFJFU0VUOwkvKiBhY3RpdmUgaGlnaCAqLworCXJlZyAmPSB+X19NWV9QQ01DSUFfR0NSWF9DWE9FOwkJLyogYWN0aXZlIGxvdyAgKi8KKwlQQ01DSUFfUEdDUlgoX3Nsb3RfKSA9IHJlZzsKKwl1ZGVsYXkoNTAwKTsKKworCWRlYnVnICgidm9sdGFnZV9zZXQ6ICIgUENNQ0lBX0JPQVJEX01TRyAiIFNsb3QgJWMsIERPTkVcbiIsCisJCXNsb3QrJ0EnKTsKKwlyZXR1cm4gKDApOworfQorCisjZW5kaWYJLyogUjM2ME1QSSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEVuZCBvZiBCb2FyZCBTcGVjaWZpYyBTdHVmZgkJCQkJCQkqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIE1QQzh4eCBTcGVjaWZpYyBTdHVmZiAtIHNob3VsZCBnbyB0byBNUEM4eHggZGlyZWN0b3J5CQkJKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFNlYXJjaCB0aGlzIHRhYmxlIHRvIHNlZSBpZiB0aGUgd2luZG93c2l6ZSBpcworICogc3VwcG9ydGVkLi4uCisgKi8KKworI2RlZmluZSBNOFhYX1NJWkVTX05PIDMyCisKK3N0YXRpYyBjb25zdCB1X2ludCBtOHh4X3NpemVfdG9fZ3JheVtNOFhYX1NJWkVTX05PXSA9Cit7IDB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDQsCisgIDB4MDAwMDAwODAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMjAsCisgIDB4MDAwMDgwMDAsIDB4MDAwMDQwMDAsIDB4MDAwMDEwMDAsIDB4MDAwMDIwMDAsCisgIDB4MDAwMDAxMDAsIDB4MDAwMDAyMDAsIDB4MDAwMDA4MDAsIDB4MDAwMDA0MDAsCisKKyAgMHgwZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwKKyAgMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHhmZmZmZmZmZiwgMHgwNDAwMDAwMCwKKyAgMHgwMDAxMDAwMCwgMHgwMDAyMDAwMCwgMHgwMDA4MDAwMCwgMHgwMDA0MDAwMCwKKyAgMHgwMDgwMDAwMCwgMHgwMDQwMDAwMCwgMHgwMDEwMDAwMCwgMHgwMDIwMDAwMCB9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVfaW50IG04eHhfZ2V0X2dyYXljb2RlKHVfaW50IHNpemUpCit7CisJdV9pbnQgazsKKworCWZvciAoayA9IDA7IGsgPCBNOFhYX1NJWkVTX05POyBrKyspIHsKKwkJaWYobTh4eF9zaXplX3RvX2dyYXlba10gPT0gc2l6ZSkKKwkJCWJyZWFrOworCX0KKworCWlmKChrID09IE04WFhfU0laRVNfTk8pIHx8IChtOHh4X3NpemVfdG9fZ3JheVtrXSA9PSAtMSkpCisJCWsgPSAtMTsKKworCXJldHVybiBrOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAwCitzdGF0aWMgdV9pbnQgbTh4eF9nZXRfc3BlZWQodV9pbnQgbnMsIHVfaW50IGlzX2lvKQoreworCXVfaW50IHJlZywgY2xvY2tzLCBwc3N0LCBwc2wsIHBzaHQ7CisKKwlpZighbnMpIHsKKworCQkvKgorCQkgKiBXZSBnZXQgY2FsbGVkIHdpdGggSU8gbWFwcyBzZXR1cCB0byAwbnMKKwkJICogaWYgbm90IHNwZWNpZmllZCBieSB0aGUgdXNlci4KKwkJICogVGhleSBzaG91bGQgYmUgMjU1bnMuCisJCSAqLworCisJCWlmKGlzX2lvKQorCQkJbnMgPSAyNTU7CisJCWVsc2UKKwkJCW5zID0gMTAwOyAgLyogZmFzdCBtZW1vcnkgaWYgMCAqLworCX0KKworCS8qCisJICogSW4gUFNTVCwgUFNMLCBQU0hUIGZpZWxkcyB3ZSB0ZWxsIHRoZSBjb250cm9sbGVyCisJICogdGltaW5nIHBhcmFtZXRlcnMgaW4gQ0xLT1VUIGNsb2NrIGN5Y2xlcy4KKwkgKiBDTEtPVVQgaXMgdGhlIHNhbWUgYXMgR0NMSzJfNTAuCisJICovCisKKy8qIGhvdyB3ZSB3YW50IHRvIGFkanVzdCB0aGUgdGltaW5nIC0gaW4gcGVyY2VudCAqLworCisjZGVmaW5lIEFESiAxODAgLyogODAgJSBsb25nZXIgYWNjZXNzdGltZSAtIHRvIGJlIHN1cmUgKi8KKworCWNsb2NrcyA9ICgoTThYWF9CVVNGUkVRIC8gMTAwMCkgKiBucykgLyAxMDAwOworCWNsb2NrcyA9IChjbG9ja3MgKiBBREopIC8gKDEwMCoxMDAwKTsKKworCWlmKGNsb2NrcyA+PSBQQ01DSUFfQk1UX0xJTUlUKSB7CisJCURFQlVHKDAsICJNYXggYWNjZXNzIHRpbWUgbGltaXQgcmVhY2hlZFxuIik7CisJCWNsb2NrcyA9IFBDTUNJQV9CTVRfTElNSVQtMTsKKwl9CisKKwlwc3N0ID0gY2xvY2tzIC8gNzsgICAgICAgICAgLyogc2V0dXAgdGltZSAqLworCXBzaHQgPSBjbG9ja3MgLyA3OyAgICAgICAgICAvKiBob2xkIHRpbWUgKi8KKwlwc2wgID0gKGNsb2NrcyAqIDUpIC8gNzsgICAgLyogc3Ryb2JlIGxlbmd0aCAqLworCisJcHNzdCArPSBjbG9ja3MgLSAocHNzdCArIHBzaHQgKyBwc2wpOworCisJcmVnID0gIHBzc3QgPDwgMTI7CisJcmVnIHw9IHBzbCAgPDwgNzsKKwlyZWcgfD0gcHNodCA8PCAxNjsKKworCXJldHVybiByZWc7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX0lERV84eHhfUENDQVJECitzdGF0aWMgdm9pZCBwcmludF9mdW5jaWQgKGludCBmdW5jKQoreworCXB1dHMgKGluZGVudCk7CisJc3dpdGNoIChmdW5jKSB7CisJY2FzZSBDSVNUUExfRlVOQ0lEX01VTFRJOgorCQlwdXRzICgiIE11bHRpLUZ1bmN0aW9uIik7CisJCWJyZWFrOworCWNhc2UgQ0lTVFBMX0ZVTkNJRF9NRU1PUlk6CisJCXB1dHMgKCIgTWVtb3J5Iik7CisJCWJyZWFrOworCWNhc2UgQ0lTVFBMX0ZVTkNJRF9TRVJJQUw6CisJCXB1dHMgKCIgU2VyaWFsIFBvcnQiKTsKKwkJYnJlYWs7CisJY2FzZSBDSVNUUExfRlVOQ0lEX1BBUkFMTEVMOgorCQlwdXRzICgiIFBhcmFsbGVsIFBvcnQiKTsKKwkJYnJlYWs7CisJY2FzZSBDSVNUUExfRlVOQ0lEX0ZJWEVEOgorCQlwdXRzICgiIEZpeGVkIERpc2siKTsKKwkJYnJlYWs7CisJY2FzZSBDSVNUUExfRlVOQ0lEX1ZJREVPOgorCQlwdXRzICgiIFZpZGVvIEFkYXB0ZXIiKTsKKwkJYnJlYWs7CisJY2FzZSBDSVNUUExfRlVOQ0lEX05FVFdPUks6CisJCXB1dHMgKCIgTmV0d29yayBBZGFwdGVyIik7CisJCWJyZWFrOworCWNhc2UgQ0lTVFBMX0ZVTkNJRF9BSU1TOgorCQlwdXRzICgiIEFJTVMgQ2FyZCIpOworCQlicmVhazsKKwljYXNlIENJU1RQTF9GVU5DSURfU0NTSToKKwkJcHV0cyAoIiBTQ1NJIEFkYXB0ZXIiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHV0cyAoIiBVbmtub3duIik7CisJCWJyZWFrOworCX0KKwlwdXRzICgiIENhcmRcbiIpOworfQorI2VuZGlmCS8qIENPTkZJR19JREVfOHh4X1BDQ0FSRCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBDT05GSUdfSURFXzh4eF9QQ0NBUkQKK3N0YXRpYyB2b2lkIHByaW50X2ZpeGVkICh2b2xhdGlsZSB1Y2hhciAqcCkKK3sKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlwdXRzKGluZGVudCk7CisKKwlzd2l0Y2ggKCpwKSB7CisJY2FzZSBDSVNUUExfRlVOQ0VfSURFX0lGQUNFOgorCSAgICB7ICAgdWNoYXIgaWZhY2UgPSAqKHArMik7CisKKwkJcHV0cyAoKGlmYWNlID09IENJU1RQTF9JREVfSU5URVJGQUNFKSA/ICIgSURFIiA6ICIgdW5rbm93biIpOworCQlwdXRzICgiIGludGVyZmFjZSAiKTsKKwkJYnJlYWs7CisJICAgIH0KKwljYXNlIENJU1RQTF9GVU5DRV9JREVfTUFTVEVSOgorCWNhc2UgQ0lTVFBMX0ZVTkNFX0lERV9TTEFWRToKKwkgICAgeyAgIHVjaGFyIGYxID0gKihwKzIpOworCQl1Y2hhciBmMiA9ICoocCs0KTsKKworCQlwdXRzICgoZjEgJiBDSVNUUExfSURFX1NJTElDT04pID8gIiBbc2lsaWNvbl0iIDogIiBbcm90YXRpbmddIik7CisKKwkJaWYgKGYxICYgQ0lTVFBMX0lERV9VTklRVUUpCisJCQlwdXRzICgiIFt1bmlxdWVdIik7CisKKwkJcHV0cyAoKGYxICYgQ0lTVFBMX0lERV9EVUFMKSA/ICIgW2R1YWxdIiA6ICIgW3NpbmdsZV0iKTsKKworCQlpZiAoZjIgJiBDSVNUUExfSURFX0hBU19TTEVFUCkKKwkJCXB1dHMgKCIgW3NsZWVwXSIpOworCisJCWlmIChmMiAmIENJU1RQTF9JREVfSEFTX1NUQU5EQlkpCisJCQlwdXRzICgiIFtzdGFuZGJ5XSIpOworCisJCWlmIChmMiAmIENJU1RQTF9JREVfSEFTX0lETEUpCisJCQlwdXRzICgiIFtpZGxlXSIpOworCisJCWlmIChmMiAmIENJU1RQTF9JREVfTE9XX1BPV0VSKQorCQkJcHV0cyAoIiBbbG93IHBvd2VyXSIpOworCisJCWlmIChmMiAmIENJU1RQTF9JREVfUkVHX0lOSElCSVQpCisJCQlwdXRzICgiIFtyZWcgaW5oaWJpdF0iKTsKKworCQlpZiAoZjIgJiBDSVNUUExfSURFX0hBU19JTkRFWCkKKwkJCXB1dHMgKCIgW2luZGV4XSIpOworCisJCWlmIChmMiAmIENJU1RQTF9JREVfSU9JUzE2KQorCQkJcHV0cyAoIiBbSU9pczE2XSIpOworCisJCWJyZWFrOworCSAgICB9CisJfQorCXB1dGMgKCdcbicpOworfQorI2VuZGlmCS8qIENPTkZJR19JREVfOHh4X1BDQ0FSRCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBDT05GSUdfSURFXzh4eF9QQ0NBUkQKKworI2RlZmluZSBNQVhfSURFTlRfQ0hBUlMJCTY0CisjZGVmaW5lCU1BWF9JREVOVF9GSUVMRFMJNAorCitzdGF0aWMgdWNoYXIgKmtub3duX2NhcmRzW10gPSB7CisJIkFSR09TWSBQblBJREUgRDUiLAorCU5VTEwKK307CisKK3N0YXRpYyBpbnQgaWRlbnRpZnkgICh2b2xhdGlsZSB1Y2hhciAqcCkKK3sKKwl1Y2hhciBpZF9zdHJbTUFYX0lERU5UX0NIQVJTXTsKKwl1Y2hhciBkYXRhOworCXVjaGFyICp0OworCXVjaGFyICoqY2FyZDsKKwlpbnQgaSwgZG9uZTsKKworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoMCk7CS8qIERvbid0IGtub3cgKi8KKworCXQgPSBpZF9zdHI7CisJZG9uZSA9MDsKKworCWZvciAoaT0wOyBpPD00ICYmICFkb25lOyArK2ksIHArPTIpIHsKKwkJd2hpbGUgKChkYXRhID0gKnApICE9ICdcMCcpIHsKKwkJCWlmIChkYXRhID09IDB4RkYpIHsKKwkJCQlkb25lID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCSp0KysgPSBkYXRhOworCQkJaWYgKHQgPT0gJmlkX3N0cltNQVhfSURFTlRfQ0hBUlMtMV0pIHsKKwkJCQlkb25lID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXAgKz0gMjsKKwkJfQorCQlpZiAoIWRvbmUpCisJCQkqdCsrID0gJyAnOworCX0KKwkqdCA9ICdcMCc7CisJd2hpbGUgKC0tdCA+IGlkX3N0cikgeworCQlpZiAoKnQgPT0gJyAnKQorCQkJKnQgPSAnXDAnOworCQllbHNlCisJCQlicmVhazsKKwl9CisJcHV0cyAoaWRfc3RyKTsKKwlwdXRjICgnXG4nKTsKKworCWZvciAoY2FyZD1rbm93bl9jYXJkczsgKmNhcmQ7ICsrY2FyZCkgeworCQlkZWJ1ZyAoIiMjIENvbXBhcmUgYWdhaW5zdCBcIiVzXCJcbiIsICpjYXJkKTsKKwkJaWYgKHN0cmNtcCgqY2FyZCwgaWRfc3RyKSA9PSAwKSB7CS8qIGZvdW5kISAqLworCQkJZGVidWcgKCIjIyBDQVJEIEZPVU5EICMjXG4iKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisKKwlyZXR1cm4gKDApOwkvKiBkb24ndCBrbm93ICovCit9CisjZW5kaWYJLyogQ09ORklHX0lERV84eHhfUENDQVJEICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2VuZGlmIC8qIENGR19DTURfUENNQ0lBIHx8IChDRkdfQ01EX0lERSAmJiBDT05GSUdfSURFXzh4eF9QQ0NBUkQpICovCmRpZmYgLS1naXQgYS9jb21tb24vZW52X2ZsYXNoLmMgYi9jb21tb24vZW52X2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5M2QyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9lbnZfZmxhc2guYwpAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMSBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFuZHJlYXMgSGVwcGVsIDxhaGVwcGVsQHN5c2dvLmRlPgorCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiAjZGVmaW5lIERFQlVHICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmIGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9GTEFTSCkgLyogRW52aXJvbm1lbnQgaXMgaW4gRmxhc2ggKi8KKworI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxlbnZpcm9ubWVudC5oPgorI2luY2x1ZGUgPGNtZF9udmVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKworI2lmICgoQ09ORklHX0NPTU1BTkRTJihDRkdfQ01EX0VOVnxDRkdfQ01EX0ZMQVNIKSkgPT0gKENGR19DTURfRU5WfENGR19DTURfRkxBU0gpKQorI2RlZmluZSBDTURfU0FWRUVOVgorI2VsaWYgZGVmaW5lZChDRkdfRU5WX0FERFJfUkVEVU5EKQorI2Vycm9yIENhbm5vdCB1c2UgQ0ZHX0VOVl9BRERSX1JFRFVORCB3aXRob3V0IENGR19DTURfRU5WICYgQ0ZHX0NNRF9GTEFTSAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19FTlZfU0VDVF9TSVpFKSAmJiAoQ0ZHX0VOVl9TRUNUX1NJWkUgPiBDRkdfRU5WX1NJWkUpICYmIFwKKyAgICBkZWZpbmVkKENGR19FTlZfQUREUl9SRURVTkQpCisjZXJyb3IgQ0ZHX0VOVl9BRERSX1JFRFVORCBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiBDRkdfRU5WX1NFQ1RfU0laRSA+IENGR19FTlZfU0laRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19FTlZfU0laRV9SRURVTkQpICYmIChDRkdfRU5WX1NJWkVfUkVEVU5EIDwgQ0ZHX0VOVl9TSVpFKQorI2Vycm9yIENGR19FTlZfU0laRV9SRURVTkQgc2hvdWxkIG5vdCBiZSBsZXNzIHRoZW4gQ0ZHX0VOVl9TSVpFCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JTkZFUk5PCisjIGlmZGVmIENGR19FTlZfQUREUl9SRURVTkQKKyNlcnJvciBDRkdfRU5WX0FERFJfUkVEVU5EIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgQ09ORklHX0lORkVSTk8KKyMgZW5kaWYKKyNlbmRpZgorCitjaGFyICogZW52X25hbWVfc3BlYyA9ICJGbGFzaCI7CisKKyNpZmRlZiBFTlZfSVNfRU1CRURERUQKKworZXh0ZXJuIHVjaGFyIGVudmlyb25tZW50W107CitlbnZfdCAqZW52X3B0ciA9IChlbnZfdCAqKSgmZW52aXJvbm1lbnRbMF0pOworCisjaWZkZWYgQ01EX1NBVkVFTlYKKy8qIHN0YXRpYyBlbnZfdCAqZmxhc2hfYWRkciA9IChlbnZfdCAqKSgmZW52aXJvbm1lbnRbMF0pOy1icm9rZW4gb24gQVJNLXdkLSovCitzdGF0aWMgZW52X3QgKmZsYXNoX2FkZHIgPSAoZW52X3QgKilDRkdfRU5WX0FERFI7CisjZW5kaWYKKworI2Vsc2UgLyogISBFTlZfSVNfRU1CRURERUQgKi8KKworZW52X3QgKmVudl9wdHIgPSAoZW52X3QgKilDRkdfRU5WX0FERFI7CisjaWZkZWYgQ01EX1NBVkVFTlYKK3N0YXRpYyBlbnZfdCAqZmxhc2hfYWRkciA9IChlbnZfdCAqKUNGR19FTlZfQUREUjsKKyNlbmRpZgorCisjZW5kaWYgLyogRU5WX0lTX0VNQkVEREVEICovCisKKyNpZmRlZiBDRkdfRU5WX0FERFJfUkVEVU5ECitzdGF0aWMgZW52X3QgKmZsYXNoX2FkZHJfbmV3ID0gKGVudl90ICopQ0ZHX0VOVl9BRERSX1JFRFVORDsKKworc3RhdGljIHVsb25nIGVuZF9hZGRyID0gQ0ZHX0VOVl9BRERSICsgQ0ZHX0VOVl9TSVpFIC0gMTsKK3N0YXRpYyB1bG9uZyBlbmRfYWRkcl9uZXcgPSBDRkdfRU5WX0FERFJfUkVEVU5EICsgQ0ZHX0VOVl9TSVpFX1JFRFVORCAtIDE7CisKK3N0YXRpYyB1Y2hhciBhY3RpdmVfZmxhZyA9IDE7CitzdGF0aWMgdWNoYXIgb2Jzb2xldGVfZmxhZyA9IDA7CisjZW5kaWYKKworZXh0ZXJuIHVjaGFyIGRlZmF1bHRfZW52aXJvbm1lbnRbXTsKK2V4dGVybiBpbnQgZGVmYXVsdF9lbnZpcm9ubWVudF9zaXplOworCisKK3VjaGFyIGVudl9nZXRfY2hhcl9zcGVjIChpbnQgaW5kZXgpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlyZXR1cm4gKCAqKCh1Y2hhciAqKShnZC0+ZW52X2FkZHIgKyBpbmRleCkpICk7Cit9CisKKyNpZmRlZiBDRkdfRU5WX0FERFJfUkVEVU5ECisKK2ludCAgZW52X2luaXQodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWludCBjcmMxX29rID0KKwkJKGNyYzMyKDAsIGZsYXNoX2FkZHItPmRhdGEsIEVOVl9TSVpFKSA9PSBmbGFzaF9hZGRyLT5jcmMpOworCWludCBjcmMyX29rID0KKwkJKGNyYzMyKDAsIGZsYXNoX2FkZHJfbmV3LT5kYXRhLCBFTlZfU0laRSkgPT0gZmxhc2hfYWRkcl9uZXctPmNyYyk7CisKKwl1Y2hhciBmbGFnMSA9IGZsYXNoX2FkZHItPmZsYWdzOworCXVjaGFyIGZsYWcyID0gZmxhc2hfYWRkcl9uZXctPmZsYWdzOworCisJdWxvbmcgYWRkcl9kZWZhdWx0ID0gKHVsb25nKSZkZWZhdWx0X2Vudmlyb25tZW50WzBdOworCXVsb25nIGFkZHIxID0gKHVsb25nKSYoZmxhc2hfYWRkci0+ZGF0YSk7CisJdWxvbmcgYWRkcjIgPSAodWxvbmcpJihmbGFzaF9hZGRyX25ldy0+ZGF0YSk7CisKKwlpZiAoY3JjMV9vayAmJiAhIGNyYzJfb2spCisJeworCQlnZC0+ZW52X2FkZHIgID0gYWRkcjE7CisJCWdkLT5lbnZfdmFsaWQgPSAxOworCX0KKwllbHNlIGlmICghIGNyYzFfb2sgJiYgY3JjMl9vaykKKwl7CisJCWdkLT5lbnZfYWRkciAgPSBhZGRyMjsKKwkJZ2QtPmVudl92YWxpZCA9IDE7CisJfQorCWVsc2UgaWYgKCEgY3JjMV9vayAmJiAhIGNyYzJfb2spCisJeworCQlnZC0+ZW52X2FkZHIgID0gYWRkcl9kZWZhdWx0OworCQlnZC0+ZW52X3ZhbGlkID0gMDsKKwl9CisJZWxzZSBpZiAoZmxhZzEgPT0gYWN0aXZlX2ZsYWcgJiYgZmxhZzIgPT0gb2Jzb2xldGVfZmxhZykKKwl7CisJCWdkLT5lbnZfYWRkciAgPSBhZGRyMTsKKwkJZ2QtPmVudl92YWxpZCA9IDE7CisJfQorCWVsc2UgaWYgKGZsYWcxID09IG9ic29sZXRlX2ZsYWcgJiYgZmxhZzIgPT0gYWN0aXZlX2ZsYWcpCisJeworCQlnZC0+ZW52X2FkZHIgID0gYWRkcjI7CisJCWdkLT5lbnZfdmFsaWQgPSAxOworCX0KKwllbHNlIGlmIChmbGFnMSA9PSBmbGFnMikKKwl7CisJCWdkLT5lbnZfYWRkciAgPSBhZGRyMTsKKwkJZ2QtPmVudl92YWxpZCA9IDI7CisJfQorCWVsc2UgaWYgKGZsYWcxID09IDB4RkYpCisJeworCQlnZC0+ZW52X2FkZHIgID0gYWRkcjE7CisJCWdkLT5lbnZfdmFsaWQgPSAyOworCX0KKwllbHNlIGlmIChmbGFnMiA9PSAweEZGKQorCXsKKwkJZ2QtPmVudl9hZGRyICA9IGFkZHIyOworCQlnZC0+ZW52X3ZhbGlkID0gMjsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisjaWZkZWYgQ01EX1NBVkVFTlYKK2ludCBzYXZlZW52KHZvaWQpCit7CisJaW50IHJjID0gMTsKKworCWRlYnVnICgiUHJvdGVjdCBvZmYgJTA4bFggLi4uICUwOGxYXG4iLAorCQkodWxvbmcpZmxhc2hfYWRkciwgZW5kX2FkZHIpOworCisJaWYgKGZsYXNoX3NlY3RfcHJvdGVjdCAoMCwgKHVsb25nKWZsYXNoX2FkZHIsIGVuZF9hZGRyKSkgeworCQlnb3RvIERvbmU7CisJfQorCisJZGVidWcgKCJQcm90ZWN0IG9mZiAlMDhsWCAuLi4gJTA4bFhcbiIsCisJCSh1bG9uZylmbGFzaF9hZGRyX25ldywgZW5kX2FkZHJfbmV3KTsKKworCWlmIChmbGFzaF9zZWN0X3Byb3RlY3QgKDAsICh1bG9uZylmbGFzaF9hZGRyX25ldywgZW5kX2FkZHJfbmV3KSkgeworCQlnb3RvIERvbmU7CisJfQorCisJcHV0cyAoIkVyYXNpbmcgRmxhc2guLi4iKTsKKwlkZWJ1ZyAoIiAlMDhsWCAuLi4gJTA4bFggLi4uIiwKKwkJKHVsb25nKWZsYXNoX2FkZHJfbmV3LCBlbmRfYWRkcl9uZXcpOworCisJaWYgKGZsYXNoX3NlY3RfZXJhc2UgKCh1bG9uZylmbGFzaF9hZGRyX25ldywgZW5kX2FkZHJfbmV3KSkgeworCQlnb3RvIERvbmU7CisJfQorCisJcHV0cyAoIldyaXRpbmcgdG8gRmxhc2guLi4gIik7CisJZGVidWcgKCIgJTA4bFggLi4uICUwOGxYIC4uLiIsCisJCSh1bG9uZykmKGZsYXNoX2FkZHJfbmV3LT5kYXRhKSwKKwkJc2l6ZW9mKGVudl9wdHItPmRhdGEpKyh1bG9uZykmKGZsYXNoX2FkZHJfbmV3LT5kYXRhKSk7CisJaWYgKGZsYXNoX3dyaXRlKGVudl9wdHItPmRhdGEsCisJICAgICAgICAgICAgICAgICh1bG9uZykmKGZsYXNoX2FkZHJfbmV3LT5kYXRhKSwKKwkJCXNpemVvZihlbnZfcHRyLT5kYXRhKSkgfHwKKworCSAgICBmbGFzaF93cml0ZSgoY2hhciAqKSYoZW52X3B0ci0+Y3JjKSwKKwkgICAgICAgICAgICAgICAgKHVsb25nKSYoZmxhc2hfYWRkcl9uZXctPmNyYyksCisJCQlzaXplb2YoZW52X3B0ci0+Y3JjKSkgfHwKKworCSAgICBmbGFzaF93cml0ZSgoY2hhciAqKSZvYnNvbGV0ZV9mbGFnLAorCSAgICAgICAgICAgICAgICAodWxvbmcpJihmbGFzaF9hZGRyLT5mbGFncyksCisJCQlzaXplb2YoZmxhc2hfYWRkci0+ZmxhZ3MpKSB8fAorCisJICAgIGZsYXNoX3dyaXRlKChjaGFyICopJmFjdGl2ZV9mbGFnLAorCSAgICAgICAgICAgICAgICAodWxvbmcpJihmbGFzaF9hZGRyX25ldy0+ZmxhZ3MpLAorCQkJc2l6ZW9mKGZsYXNoX2FkZHJfbmV3LT5mbGFncykpKQorCXsKKwkJZmxhc2hfcGVycm9yIChyYyk7CisJCWdvdG8gRG9uZTsKKwl9CisJcHV0cyAoImRvbmVcbiIpOworCisJeworCQllbnZfdCAqIGV0bXAgPSBmbGFzaF9hZGRyOworCQl1bG9uZyBsdG1wID0gZW5kX2FkZHI7CisKKwkJZmxhc2hfYWRkciA9IGZsYXNoX2FkZHJfbmV3OworCQlmbGFzaF9hZGRyX25ldyA9IGV0bXA7CisKKwkJZW5kX2FkZHIgPSBlbmRfYWRkcl9uZXc7CisJCWVuZF9hZGRyX25ldyA9IGx0bXA7CisJfQorCisJcmMgPSAwOworRG9uZToKKworCS8qIHRyeSB0byByZS1wcm90ZWN0ICovCisJKHZvaWQpIGZsYXNoX3NlY3RfcHJvdGVjdCAoMSwgKHVsb25nKWZsYXNoX2FkZHIsIGVuZF9hZGRyKTsKKwkodm9pZCkgZmxhc2hfc2VjdF9wcm90ZWN0ICgxLCAodWxvbmcpZmxhc2hfYWRkcl9uZXcsIGVuZF9hZGRyX25ldyk7CisKKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYgLyogQ01EX1NBVkVFTlYgKi8KKworI2Vsc2UgLyogISBDRkdfRU5WX0FERFJfUkVEVU5EICovCisKK2ludCAgZW52X2luaXQodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWlmIChjcmMzMigwLCBlbnZfcHRyLT5kYXRhLCBFTlZfU0laRSkgPT0gZW52X3B0ci0+Y3JjKSB7CisJCWdkLT5lbnZfYWRkciAgPSAodWxvbmcpJihlbnZfcHRyLT5kYXRhKTsKKwkJZ2QtPmVudl92YWxpZCA9IDE7CisJfSBlbHNlIHsKKwkJZ2QtPmVudl9hZGRyICA9ICh1bG9uZykmZGVmYXVsdF9lbnZpcm9ubWVudFswXTsKKwkJZ2QtPmVudl92YWxpZCA9IDA7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworI2lmZGVmIENNRF9TQVZFRU5WCisKK2ludCBzYXZlZW52KHZvaWQpCit7CisJaW50CWxlbiwgcmM7CisJdWxvbmcJZW5kX2FkZHI7CisJdWxvbmcJZmxhc2hfc2VjdF9hZGRyOworI2lmIGRlZmluZWQoQ0ZHX0VOVl9TRUNUX1NJWkUpICYmIChDRkdfRU5WX1NFQ1RfU0laRSA+IENGR19FTlZfU0laRSkKKwl1bG9uZwlmbGFzaF9vZmZzZXQ7CisJdWNoYXIJZW52X2J1ZmZlcltDRkdfRU5WX1NFQ1RfU0laRV07CisjZWxzZQorCXVjaGFyICplbnZfYnVmZmVyID0gKGNoYXIgKillbnZfcHRyOworI2VuZGlmCS8qIENGR19FTlZfU0VDVF9TSVpFICovCisJaW50IHJjb2RlID0gMDsKKworI2lmIGRlZmluZWQoQ0ZHX0VOVl9TRUNUX1NJWkUpICYmIChDRkdfRU5WX1NFQ1RfU0laRSA+IENGR19FTlZfU0laRSkKKworCWZsYXNoX29mZnNldCAgICA9ICgodWxvbmcpZmxhc2hfYWRkcikgJiAoQ0ZHX0VOVl9TRUNUX1NJWkUtMSk7CisJZmxhc2hfc2VjdF9hZGRyID0gKCh1bG9uZylmbGFzaF9hZGRyKSAmIH4oQ0ZHX0VOVl9TRUNUX1NJWkUtMSk7CisKKwlkZWJ1ZyAoICJjb3B5IG9sZCBjb250ZW50OiAiCisJCSJzZWN0X2FkZHI6ICUwOGxYICBlbnZfYWRkcjogJTA4bFggIG9mZnNldDogJTA4bFhcbiIsCisJCWZsYXNoX3NlY3RfYWRkciwgKHVsb25nKWZsYXNoX2FkZHIsIGZsYXNoX29mZnNldCk7CisKKwkvKiBjb3B5IG9sZCBjb250ZW50cyB0byB0ZW1wb3JhcnkgYnVmZmVyICovCisJbWVtY3B5IChlbnZfYnVmZmVyLCAodm9pZCAqKWZsYXNoX3NlY3RfYWRkciwgQ0ZHX0VOVl9TRUNUX1NJWkUpOworCisJLyogY29weSBjdXJyZW50IGVudmlyb25tZW50IHRvIHRlbXBvcmFyeSBidWZmZXIgKi8KKwltZW1jcHkgKCh1Y2hhciAqKSgodW5zaWduZWQgbG9uZyllbnZfYnVmZmVyICsgZmxhc2hfb2Zmc2V0KSwKKwkJZW52X3B0ciwKKwkJQ0ZHX0VOVl9TSVpFKTsKKworCWxlbgkgPSBDRkdfRU5WX1NFQ1RfU0laRTsKKyNlbHNlCisJZmxhc2hfc2VjdF9hZGRyID0gKHVsb25nKWZsYXNoX2FkZHI7CisJbGVuCSA9IENGR19FTlZfU0laRTsKKyNlbmRpZgkvKiBDRkdfRU5WX1NFQ1RfU0laRSAqLworCisjaWZuZGVmIENPTkZJR19JTkZFUk5PCisJZW5kX2FkZHIgPSBmbGFzaF9zZWN0X2FkZHIgKyBsZW4gLSAxOworI2Vsc2UKKwkvKiB0aGlzIGlzIHRoZSBsYXN0IHNlY3RvciwgYW5kIHRoZSBzaXplIGlzIGhhcmRjb2RlZCBoZXJlICovCisJLyogb3RoZXJ3aXNlIHdlIHdpbGwgZ2V0IHN0YWNrIHByb2JsZW1zIG9uIGxvYWRpbmcgMTI4IEtCIGVudmlyb25tZW50ICovCisJZW5kX2FkZHIgPSBmbGFzaF9zZWN0X2FkZHIgKyAweDIwMDAwIC0gMTsKKyNlbmRpZgorCisJZGVidWcgKCJQcm90ZWN0IG9mZiAlMDhsWCAuLi4gJTA4bFhcbiIsCisJCSh1bG9uZylmbGFzaF9zZWN0X2FkZHIsIGVuZF9hZGRyKTsKKworCWlmIChmbGFzaF9zZWN0X3Byb3RlY3QgKDAsIGZsYXNoX3NlY3RfYWRkciwgZW5kX2FkZHIpKQorCQlyZXR1cm4gMTsKKworCXB1dHMgKCJFcmFzaW5nIEZsYXNoLi4uIik7CisJaWYgKGZsYXNoX3NlY3RfZXJhc2UgKGZsYXNoX3NlY3RfYWRkciwgZW5kX2FkZHIpKQorCQlyZXR1cm4gMTsKKworCXB1dHMgKCJXcml0aW5nIHRvIEZsYXNoLi4uICIpOworCXJjID0gZmxhc2hfd3JpdGUoZW52X2J1ZmZlciwgZmxhc2hfc2VjdF9hZGRyLCBsZW4pOworCWlmIChyYyAhPSAwKSB7CisJCWZsYXNoX3BlcnJvciAocmMpOworCQlyY29kZSA9IDE7CisJfSBlbHNlIHsKKwkJcHV0cyAoImRvbmVcbiIpOworCX0KKworCS8qIHRyeSB0byByZS1wcm90ZWN0ICovCisJKHZvaWQpIGZsYXNoX3NlY3RfcHJvdGVjdCAoMSwgZmxhc2hfc2VjdF9hZGRyLCBlbmRfYWRkcik7CisJcmV0dXJuIHJjb2RlOworfQorCisjZW5kaWYgLyogQ01EX1NBVkVFTlYgKi8KKworI2VuZGlmIC8qIENGR19FTlZfQUREUl9SRURVTkQgKi8KKwordm9pZCBlbnZfcmVsb2NhdGVfc3BlYyAodm9pZCkKK3sKKyNpZiAhZGVmaW5lZChFTlZfSVNfRU1CRURERUQpIHx8IGRlZmluZWQoQ0ZHX0VOVl9BRERSX1JFRFVORCkKKyNpZmRlZiBDRkdfRU5WX0FERFJfUkVEVU5ECisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlpZiAoZ2QtPmVudl9hZGRyICE9ICh1bG9uZykmKGZsYXNoX2FkZHItPmRhdGEpKQorCXsKKwkJZW52X3QgKiBldG1wID0gZmxhc2hfYWRkcjsKKwkJdWxvbmcgbHRtcCA9IGVuZF9hZGRyOworCisJCWZsYXNoX2FkZHIgPSBmbGFzaF9hZGRyX25ldzsKKwkJZmxhc2hfYWRkcl9uZXcgPSBldG1wOworCisJCWVuZF9hZGRyID0gZW5kX2FkZHJfbmV3OworCQllbmRfYWRkcl9uZXcgPSBsdG1wOworCX0KKworCWlmIChmbGFzaF9hZGRyX25ldy0+ZmxhZ3MgIT0gb2Jzb2xldGVfZmxhZyAmJgorCSAgICBjcmMzMigwLCBmbGFzaF9hZGRyX25ldy0+ZGF0YSwgRU5WX1NJWkUpID09CisJICAgIGZsYXNoX2FkZHJfbmV3LT5jcmMpCisJeworCQlnZC0+ZW52X3ZhbGlkID0gMjsKKwkJZmxhc2hfc2VjdF9wcm90ZWN0ICgwLCAodWxvbmcpZmxhc2hfYWRkcl9uZXcsIGVuZF9hZGRyX25ldyk7CisJCWZsYXNoX3dyaXRlKChjaGFyICopJm9ic29sZXRlX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgIAkgICAgKHVsb25nKSYoZmxhc2hfYWRkcl9uZXctPmZsYWdzKSwKKwkgICAgICAgIAkgICAgc2l6ZW9mKGZsYXNoX2FkZHJfbmV3LT5mbGFncykpOworCQlmbGFzaF9zZWN0X3Byb3RlY3QgKDEsICh1bG9uZylmbGFzaF9hZGRyX25ldywgZW5kX2FkZHJfbmV3KTsKKwl9CisKKwlpZiAoZmxhc2hfYWRkci0+ZmxhZ3MgIT0gYWN0aXZlX2ZsYWcgJiYKKwkgICAgKGZsYXNoX2FkZHItPmZsYWdzICYgYWN0aXZlX2ZsYWcpID09IGFjdGl2ZV9mbGFnKQorCXsKKwkJZ2QtPmVudl92YWxpZCA9IDI7CisJCWZsYXNoX3NlY3RfcHJvdGVjdCAoMCwgKHVsb25nKWZsYXNoX2FkZHIsIGVuZF9hZGRyKTsKKwkJZmxhc2hfd3JpdGUoKGNoYXIgKikmYWN0aXZlX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgIAkgICAgKHVsb25nKSYoZmxhc2hfYWRkci0+ZmxhZ3MpLAorCSAgICAgICAgCSAgICBzaXplb2YoZmxhc2hfYWRkci0+ZmxhZ3MpKTsKKwkJZmxhc2hfc2VjdF9wcm90ZWN0ICgxLCAodWxvbmcpZmxhc2hfYWRkciwgZW5kX2FkZHIpOworCX0KKworCWlmIChnZC0+ZW52X3ZhbGlkID09IDIpCisJCXB1dHMgKCIqKiogV2FybmluZyAtIHNvbWUgcHJvYmxlbXMgZGV0ZWN0ZWQgIgorCQkgICAgICAicmVhZGluZyBlbnZpcm9ubWVudDsgcmVjb3ZlcmVkIHN1Y2Nlc3NmdWxseVxuXG4iKTsKKyNlbmRpZiAvKiBDRkdfRU5WX0FERFJfUkVEVU5EICovCisJbWVtY3B5IChlbnZfcHRyLCAodm9pZCopZmxhc2hfYWRkciwgQ0ZHX0VOVl9TSVpFKTsKKyNlbmRpZiAvKiAhIEVOVl9JU19FTUJFRERFRCB8fCBDRkdfRU5WX0FERFJfUkVEVU5EICovCit9CisKKyNlbmRpZiAvKiBDRkdfRU5WX0lTX0lOX0ZMQVNIKSAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2Vudl9udnJhbS5jIGIvY29tbW9uL2Vudl9udnJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmE0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZW52X252cmFtLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDEgU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBBbmRyZWFzIEhlcHBlbCA8YWhlcHBlbEBzeXNnby5kZT4KKworICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIDA5LTE4LTIwMDEgQW5kcmVhcyBIZXBwZWwsIFN5c2dvIFJUUyBHbWJIIDxhaGVwcGVsQHN5c2dvLmRlPgorICoKKyAqIEl0IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZSBpbiBhbGwgY2FzZXMgdG8gdXNlICdtZW1jcHkoKScgdG8gY29weQorICogdGhlIGVudmlyb25tZW50IHRvIE5WUkFNLCBhcyB0aGUgTlZSQU0gbWlnaHQgbm90IGJlIG1hcHBlZCBpbnRvCisgKiB0aGUgbWVtb3J5IHNwYWNlLiAoSS5lLiB0aGlzIGlzIHRoZSBjYXNlIGZvciB0aGUgQkFCNzUwKS4gSW4gdGhvc2UKKyAqIGNhc2VzIGl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIGFjY2VzcyB0aGUgTlZSQU0gdXNpbmcgYSBkaWZmZXJlbnQKKyAqIG1ldGhvZC4gRm9yIGV4YW1wbGUsIHRoZSBSVEMgb24gdGhlIEJBQjc1MCBpcyBhY2Nlc3NpYmxlIGluIElPCisgKiBzcGFjZSB1c2luZyBpdHMgYWRkcmVzcyBhbmQgZGF0YSByZWdpc3RlcnMuIFRvIGVuYWJsZSB1c2FnZSBvZgorICogTlZSQU0gaW4gdGhvc2UgY2FzZXMgSSBpbnZlbnRlZCB0aGUgZnVuY3Rpb25zICdudnJhbV9yZWFkKCknIGFuZAorICogJ252cmFtX3dyaXRlKCknLCB3aGljaCB3aWxsIGJlIGFjdGl2YXRlZCB1cG9uIHRoZSBjb25maWd1cmF0aW9uCisgKiAjZGVmaW5lIENGR19OVlJBTV9BQ0NFU1NfUk9VVElORS4gTm90ZSwgdGhhdCB0aG9zZSBmdW5jdGlvbnMgYXJlCisgKiBzdHJvbmdseSBkZXBlbmRlbnQgb24gdGhlIHVzZWQgSFcsIGFuZCBtdXN0IGJlIHJlZGVmaW5lZCBmb3IgZWFjaAorICogYm9hcmQgdGhhdCB3YW50cyB0byB1c2UgdGhlbS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfRU5WX0lTX0lOX05WUkFNIC8qIEVudmlyb25tZW50IGlzIGluIE5WUkFNICovCisKKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8ZW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxjbWRfbnZlZGl0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNpZmRlZiBDRkdfTlZSQU1fQUNDRVNTX1JPVVRJTkUKK2V4dGVybiB2b2lkICpudnJhbV9yZWFkKHZvaWQgKmRlc3QsIGNvbnN0IGxvbmcgc3JjLCBzaXplX3QgY291bnQpOworZXh0ZXJuIHZvaWQgbnZyYW1fd3JpdGUobG9uZyBkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCk7CitlbnZfdCAqZW52X3B0ciA9IE5VTEw7CisjZWxzZQorZW52X3QgKmVudl9wdHIgPSAoZW52X3QgKilDRkdfRU5WX0FERFI7CisjZW5kaWYKKworY2hhciAqIGVudl9uYW1lX3NwZWMgPSAiTlZSQU0iOworCitleHRlcm4gdWNoYXIgZGVmYXVsdF9lbnZpcm9ubWVudFtdOworZXh0ZXJuIGludCBkZWZhdWx0X2Vudmlyb25tZW50X3NpemU7CisKK2V4dGVybiB1Y2hhciAoKmVudl9nZXRfY2hhcikoaW50KTsKK2V4dGVybiB1Y2hhciBlbnZfZ2V0X2NoYXJfbWVtb3J5IChpbnQgaW5kZXgpOworCisKK3VjaGFyIGVudl9nZXRfY2hhcl9zcGVjIChpbnQgaW5kZXgpCit7CisjaWZkZWYgQ0ZHX05WUkFNX0FDQ0VTU19ST1VUSU5FCisJdWNoYXIgYzsKKworCW52cmFtX3JlYWQoJmMsIENGR19FTlZfQUREUitpbmRleCwgMSk7CisKKwlyZXR1cm4gYzsKKyNlbHNlCisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlyZXR1cm4gKigodWNoYXIgKikoZ2QtPmVudl9hZGRyICsgaW5kZXgpKTsKKyNlbmRpZgorfQorCit2b2lkIGVudl9yZWxvY2F0ZV9zcGVjICh2b2lkKQoreworI2lmIGRlZmluZWQoQ0ZHX05WUkFNX0FDQ0VTU19ST1VUSU5FKQorCW52cmFtX3JlYWQoZW52X3B0ciwgQ0ZHX0VOVl9BRERSLCBDRkdfRU5WX1NJWkUpOworI2Vsc2UKKwltZW1jcHkgKGVudl9wdHIsICh2b2lkKilDRkdfRU5WX0FERFIsIENGR19FTlZfU0laRSk7CisjZW5kaWYKK30KKworaW50IHNhdmVlbnYgKHZvaWQpCit7CisJaW50IHJjb2RlID0gMDsKKworI2lmZGVmIENGR19OVlJBTV9BQ0NFU1NfUk9VVElORQorCW52cmFtX3dyaXRlKENGR19FTlZfQUREUiwgZW52X3B0ciwgQ0ZHX0VOVl9TSVpFKTsKKyNlbHNlCisJaWYgKG1lbWNweSAoKGNoYXIgKilDRkdfRU5WX0FERFIsIGVudl9wdHIsIENGR19FTlZfU0laRSkgPT0gTlVMTCkKKwkJICAgIHJjb2RlID0gMSA7CisjZW5kaWYKKwlyZXR1cm4gcmNvZGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdGlhbGl6ZSBFbnZpcm9ubWVudCB1c2UKKyAqCisgKiBXZSBhcmUgc3RpbGwgcnVubmluZyBmcm9tIFJPTSwgc28gZGF0YSB1c2UgaXMgbGltaXRlZAorICovCitpbnQgZW52X2luaXQgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiBkZWZpbmVkKENGR19OVlJBTV9BQ0NFU1NfUk9VVElORSkKKwl1bG9uZyBjcmM7CisJdWNoYXIgZGF0YVtFTlZfU0laRV07CisJbnZyYW1fcmVhZCAoJmNyYywgQ0ZHX0VOVl9BRERSLCBzaXplb2YodWxvbmcpKTsKKwludnJhbV9yZWFkIChkYXRhLCBDRkdfRU5WX0FERFIrc2l6ZW9mKHVsb25nKSwgRU5WX1NJWkUpOworCisJaWYgKGNyYzMyKDAsIGRhdGEsIEVOVl9TSVpFKSA9PSBjcmMpIHsKKwkJZ2QtPmVudl9hZGRyICA9ICh1bG9uZylDRkdfRU5WX0FERFIgKyBzaXplb2YobG9uZyk7CisjZWxzZQorCWlmIChjcmMzMigwLCBlbnZfcHRyLT5kYXRhLCBFTlZfU0laRSkgPT0gZW52X3B0ci0+Y3JjKSB7CisJCWdkLT5lbnZfYWRkciAgPSAodWxvbmcpJihlbnZfcHRyLT5kYXRhKTsKKyNlbmRpZgorCQlnZC0+ZW52X3ZhbGlkID0gMTsKKwl9IGVsc2UgeworCQlnZC0+ZW52X2FkZHIgID0gKHVsb25nKSZkZWZhdWx0X2Vudmlyb25tZW50WzBdOworCQlnZC0+ZW52X3ZhbGlkID0gMDsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisjZW5kaWYgLyogQ0ZHX0VOVl9JU19JTl9OVlJBTSAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2Vudmlyb25tZW50LmMgYi9jb21tb24vZW52aXJvbm1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGJmZDYyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2Vudmlyb25tZW50LmMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEVyaWsgVGhlaXNlbiwgIFdhdmUgNyBPcHRpY3MsIGV0aGVpc2VuQG1pbmRzcHJpbmcuY29tLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxlbnZpcm9ubWVudC5oPgorCisvKgorICogSGFuZGxlIEhPU1RTIHRoYXQgaGF2ZSBwcmVwZW5kZWQKKyAqIGNyYXAgb24gc3ltYm9sIG5hbWVzLCBub3QgVEFSR0VUUy4KKyAqLworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorLyogTGVhZGluZyB1bmRlcnNjb3JlIG9uIHN5bWJvbHMgKi8KKyMgIGRlZmluZSBTWU1fQ0hBUiAiXyIKKyNlbHNlIC8qIE5vIGxlYWRpbmcgY2hhcmFjdGVyIG9uIHN5bWJvbHMgKi8KKyMgIGRlZmluZSBTWU1fQ0hBUgorI2VuZGlmCisKKy8qCisgKiBHZW5lcmF0ZSBlbWJlZGRlZCBlbnZpcm9ubWVudCB0YWJsZQorICogaW5zaWRlIFUtQm9vdCBpbWFnZSwgaWYgbmVlZGVkLgorICovCisjaWYgZGVmaW5lZChFTlZfSVNfRU1CRURERUQpCisvKgorICogT25seSBwdXQgdGhlIGVudmlyb25tZW50IGluIGl0J3Mgb3duIHNlY3Rpb24gd2hlbiB3ZSBhcmUgYnVpbGRpbmcKKyAqIFUtQm9vdCBwcm9wZXIuICBUaGUgaG9zdCBiYXNlZCBwcm9ncmFtICJ0b29scy9lbnZjcmMiIGRvZXMgbm90IG5lZWQKKyAqIGEgc2VwZXJhdGUgc2VjdGlvbi4gIE5vdGUgdGhhdCBFTlZfQ1JDIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJ1aWxkaW5nCisgKiBVLUJvb3QgaXRzZWxmLgorICovCisjaWYgKGRlZmluZWQoQ09ORklHX0ZBRFMpCXx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfSFlNT0QpCXx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfSUNVODYyKQl8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX1IzNjBNUEkpCXx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfVFFNOHh4TCkJfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19SUlZJU0lPTikJfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19UUkFCKSAgICkJJiYgXAorICAgICBkZWZpbmVkKEVOVl9DUkMpIC8qIEVudmlyb25tZW50IGVtYmVkZGVkIGluIFUtQm9vdCAucHBjZW52IHNlY3Rpb24gKi8KKy8qIFhYWCAtIFRoaXMgb25seSB3b3JrcyB3aXRoIEdOVSBDICovCisjICBkZWZpbmUgX19QUENFTlZfXyBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbigiLnBwY2VudiIpKSkKKyMgIGRlZmluZSBfX1BQQ1RFWFRfXyBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbigiLnRleHQiKSkpCisKKyNlbGlmIGRlZmluZWQoVVNFX0hPU1RDQykgLyogTmF0aXZlIGZvciAndG9vbHMvZW52Y3JjJyAqLworIyAgZGVmaW5lIF9fUFBDRU5WX18gLypYWFggRE9fTk9UX0RFTF9USElTX0NPTU1FTlQqLworIyAgZGVmaW5lIF9fUFBDVEVYVF9fIC8qWFhYIERPX05PVF9ERUxfVEhJU19DT01NRU5UKi8KKworI2Vsc2UgLyogRW52aXJvbm1lbnQgaXMgZW1iZWRkZWQgaW4gVS1Cb290J3MgLnRleHQgc2VjdGlvbiAqLworLyogWFhYIC0gVGhpcyBvbmx5IHdvcmtzIHdpdGggR05VIEMgKi8KKyMgIGRlZmluZSBfX1BQQ0VOVl9fIF9fYXR0cmlidXRlX18gKChzZWN0aW9uKCIudGV4dCIpKSkKKyMgIGRlZmluZSBfX1BQQ1RFWFRfXyBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbigiLnRleHQiKSkpCisjZW5kaWYKKworLyoKKyAqIE1hY3JvcyB0byBnZW5lcmF0ZSBnbG9iYWwgYWJzb2x1dGVzLgorICovCisjZGVmaW5lIEdFTl9TWU1OQU1FKHN0cikgU1lNX0NIQVIgI3N0cgorI2RlZmluZSBHRU5fVkFMVUUoc3RyKSAjc3RyCisjZGVmaW5lIEdFTl9BQlMobmFtZSwgdmFsdWUpIFwKKwkJYXNtICgiLmdsb2JsICIgR0VOX1NZTU5BTUUobmFtZSkpOyBcCisJCWFzbSAoR0VOX1NZTU5BTUUobmFtZSkgIiA9ICIgR0VOX1ZBTFVFKHZhbHVlKSkKKworLyoKKyAqIE1hY3JvcyB0byB0cmFuc2Zvcm0gdmFsdWVzCisgKiBpbnRvIGVudmlyb25tZW50IHN0cmluZ3MuCisgKi8KKyNkZWZpbmUgWE1LX1NUUih4KQkjeAorI2RlZmluZSBNS19TVFIoeCkJWE1LX1NUUih4KQorCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBidWlsZGluZyB3aXRoIGEKKyAqIGNvbXB1dGVkIENSQy4gIE90aGVyd2lzZSBkZWZpbmUgaXQgYXMgfjAuCisgKi8KKyNpZiAhZGVmaW5lZChFTlZfQ1JDKQorIyAgZGVmaW5lIEVOVl9DUkMJfjAKKyNlbmRpZgorCitlbnZfdCBlbnZpcm9ubWVudCBfX1BQQ0VOVl9fID0geworCUVOVl9DUkMsCS8qIENSQyBTdW0gKi8KKyNpZmRlZiBDRkdfUkVEVU5EQU5EX0VOVklST05NRU5UCisJMSwJCS8qIEZsYWdzOiB2YWxpZCAqLworI2VuZGlmCisJeworI2lmIGRlZmluZWQoQ09ORklHX0JPT1RBUkdTKQorCSJib290YXJncz0iCUNPTkZJR19CT09UQVJHUwkJCSJcMCIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RDT01NQU5EKQorCSJib290Y21kPSIJQ09ORklHX0JPT1RDT01NQU5ECQkiXDAiCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19SQU1CT09UQ09NTUFORCkKKwkicmFtYm9vdD0iCUNPTkZJR19SQU1CT09UQ09NTUFORAkJIlwwIgorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTkZTQk9PVENPTU1BTkQpCisJIm5mc2Jvb3Q9IglDT05GSUdfTkZTQk9PVENPTU1BTkQJCSJcMCIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RERUxBWSkgJiYgKENPTkZJR19CT09UREVMQVkgPj0gMCkKKwkiYm9vdGRlbGF5PSIJTUtfU1RSKENPTkZJR19CT09UREVMQVkpCSJcMCIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0JBVURSQVRFKSAmJiAoQ09ORklHX0JBVURSQVRFID49IDApCisJImJhdWRyYXRlPSIJTUtfU1RSKENPTkZJR19CQVVEUkFURSkJCSJcMCIKKyNlbmRpZgorI2lmZGVmCUNPTkZJR19MT0FEU19FQ0hPCisJImxvYWRzX2VjaG89IglNS19TVFIoQ09ORklHX0xPQURTX0VDSE8pCSJcMCIKKyNlbmRpZgorI2lmZGVmCUNPTkZJR19FVEhBRERSCisJImV0aGFkZHI9IglNS19TVFIoQ09ORklHX0VUSEFERFIpCQkiXDAiCisjZW5kaWYKKyNpZmRlZglDT05GSUdfRVRIMUFERFIKKwkiZXRoMWFkZHI9IglNS19TVFIoQ09ORklHX0VUSDFBRERSKQkJIlwwIgorI2VuZGlmCisjaWZkZWYJQ09ORklHX0VUSDJBRERSCisJImV0aDJhZGRyPSIJTUtfU1RSKENPTkZJR19FVEgyQUREUikJCSJcMCIKKyNlbmRpZgorI2lmZGVmCUNPTkZJR19FVEhQUklNRQorCSJldGhwcmltZT0iCUNPTkZJR19FVEhQUklNRQkJCSJcMCIKKyNlbmRpZgorI2lmZGVmCUNPTkZJR19JUEFERFIKKwkiaXBhZGRyPSIJTUtfU1RSKENPTkZJR19JUEFERFIpCQkiXDAiCisjZW5kaWYKKyNpZmRlZglDT05GSUdfU0VSVkVSSVAKKwkic2VydmVyaXA9IglNS19TVFIoQ09ORklHX1NFUlZFUklQKQkJIlwwIgorI2VuZGlmCisjaWZkZWYJQ0ZHX0FVVE9MT0FECisJImF1dG9sb2FkPSIJQ0ZHX0FVVE9MT0FECQkJIlwwIgorI2VuZGlmCisjaWZkZWYJQ09ORklHX1JPT1RQQVRICisJInJvb3RwYXRoPSIJTUtfU1RSKENPTkZJR19ST09UUEFUSCkJCSJcMCIKKyNlbmRpZgorI2lmZGVmCUNPTkZJR19HQVRFV0FZSVAKKwkiZ2F0ZXdheWlwPSIJTUtfU1RSKENPTkZJR19HQVRFV0FZSVApCSJcMCIKKyNlbmRpZgorI2lmZGVmCUNPTkZJR19ORVRNQVNLCisJIm5ldG1hc2s9IglNS19TVFIoQ09ORklHX05FVE1BU0spCQkiXDAiCisjZW5kaWYKKyNpZmRlZglDT05GSUdfSE9TVE5BTUUKKwkiaG9zdG5hbWU9IglNS19TVFIoQ09ORklHX0hPU1ROQU1FKQkJIlwwIgorI2VuZGlmCisjaWZkZWYJQ09ORklHX0JPT1RGSUxFCisJImJvb3RmaWxlPSIJTUtfU1RSKENPTkZJR19CT09URklMRSkJCSJcMCIKKyNlbmRpZgorI2lmZGVmCUNPTkZJR19MT0FEQUREUgorCSJsb2FkYWRkcj0iCU1LX1NUUihDT05GSUdfTE9BREFERFIpCQkiXDAiCisjZW5kaWYKKyNpZmRlZglDT05GSUdfUFJFQk9PVAorCSJwcmVib290PSIJQ09ORklHX1BSRUJPT1QJCQkiXDAiCisjZW5kaWYKKyNpZmRlZglDT05GSUdfQ0xPQ0tTX0lOX01IWgorCSJjbG9ja3NfaW5fbWh6PSIgIjEiCQkJCSJcMCIKKyNlbmRpZgorI2lmZGVmICBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCisJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUworI2VuZGlmCisJIlwwIgkJLyogVGVybS4gZW52X3QuZGF0YSB3aXRoIDIgTlVMTHMgKi8KKwl9Cit9OworI2lmZGVmIENGR19FTlZfQUREUl9SRURVTkQKK2Vudl90IHJlZHVuZGFuZF9lbnZpcm9ubWVudCBfX1BQQ0VOVl9fID0geworCTAsCQkvKiBDUkMgU3VtOiBpbnZhbGlkICovCisJMCwJCS8qIEZsYWdzOiAgIGludmFsaWQgKi8KKwl7CisJIlwwIgorCX0KK307CisjZW5kaWYJLyogQ0ZHX0VOVl9BRERSX1JFRFVORCAqLworCisvKgorICogVGhlc2Ugd2lsbCBlbmQgdXAgaW4gdGhlIC50ZXh0IHNlY3Rpb24KKyAqIGlmIHRoZSBlbnZpcm9ubWVudCBzdHJpbmdzIGFyZSBlbWJlZGRlZAorICogaW4gdGhlIGltYWdlLiAgV2hlbiB0aGlzIGlzIHVzZWQgZm9yCisgKiB0b29scy9lbnZjcmMsIHRoZXkgYXJlIHBsYWNlZCBpbiB0aGUKKyAqIC5kYXRhLy5zZGF0YSBzZWN0aW9uLgorICoKKyAqLwordW5zaWduZWQgbG9uZyBlbnZfc2l6ZSBfX1BQQ1RFWFRfXyA9IHNpemVvZihlbnZfdCk7CisKKy8qCisgKiBBZGQgaW4gYWJzb2x1dGVzLgorICovCitHRU5fQUJTKGVudl9vZmZzZXQsIENGR19FTlZfT0ZGU0VUKTsKKworI2VuZGlmIC8qIEVOVl9JU19FTUJFRERFRCAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL21haW4uYyBiL2NvbW1vbi9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0ODA0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9tYWluLmMKQEAgLTAsMCArMSw4MTcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNtZF9udmVkaXQuaD4KKyNpbmNsdWRlIDxjbWRfYm9vdG0uaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19CT09UX1JFVFJZX1RJTUUpICYmIGRlZmluZWQoQ09ORklHX1JFU0VUX1RPX1JFVFJZKQorI2luY2x1ZGUgPGNtZF9ib290Lmg+CQkvKiBmb3IgZG9fcmVzZXQoKSBwcm90b3R5cGUgKi8KKyNlbmRpZgorCisjaWZkZWYgQ0ZHX0hVU0hfUEFSU0VSCisjaW5jbHVkZSA8aHVzaC5oPgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0RFTEFZX1NUT1BfU1RSIDMyCisKK3N0YXRpYyBjaGFyICogZGVsZXRlX2NoYXIgKGNoYXIgKmJ1ZmZlciwgY2hhciAqcCwgaW50ICpjb2xwLCBpbnQgKm5wLCBpbnQgcGxlbik7CitzdGF0aWMgaW50IHBhcnNlX2xpbmUgKGNoYXIgKiwgY2hhciAqW10pOworI2lmIGRlZmluZWQoQ09ORklHX0JPT1RERUxBWSkgJiYgKENPTkZJR19CT09UREVMQVkgPj0gMCkKK3N0YXRpYyBpbnQgYWJvcnRib290KGludCk7CisjZW5kaWYKKworI3VuZGVmIERFQlVHX1BBUlNFUgorCitjaGFyICAgICAgICBjb25zb2xlX2J1ZmZlcltDRkdfQ0JTSVpFXTsJCS8qIGNvbnNvbGUgSS9PIGJ1ZmZlcgkqLworCitzdGF0aWMgY2hhciBlcmFzZV9zZXFbXSA9ICJcYiBcYiI7CQkvKiBlcmFzZSBzZXF1ZW5jZQkqLworc3RhdGljIGNoYXIgICB0YWJfc2VxW10gPSAiICAgICAgICAiOwkJLyogdXNlZCB0byBleHBhbmQgVEFCcwkqLworCisjaWZkZWYgQ09ORklHX0JPT1RfUkVUUllfVElNRQorc3RhdGljIHVpbnQ2NF90IGVuZHRpbWUgPSAwOyAgLyogbXVzdCBiZSBzZXQsIGRlZmF1bHQgaXMgaW5zdGFudCB0aW1lb3V0ICovCitzdGF0aWMgaW50ICAgICAgcmV0cnlfdGltZSA9IC0xOyAvKiAtMSBzbyBjYW4gY2FsbCByZWFkbGluZSBiZWZvcmUgbWFpbl9sb29wICovCisjZW5kaWYKKworI2RlZmluZQllbmR0aWNrKHNlY29uZHMpIChnZXRfdGlja3MoKSArICh1aW50NjRfdCkoc2Vjb25kcykgKiBnZXRfdGJjbGsoKSkKKworI2lmbmRlZiBDT05GSUdfQk9PVF9SRVRSWV9NSU4KKyNkZWZpbmUgQ09ORklHX0JPT1RfUkVUUllfTUlOIENPTkZJR19CT09UX1JFVFJZX1RJTUUKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01PREVNX1NVUFBPUlQKK2ludCBkb19tZG1faW5pdCA9IDA7CitleHRlcm4gdm9pZCBtZG1faW5pdCh2b2lkKTsgLyogZGVmaW5lZCBpbiBib2FyZC5jICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV2F0Y2ggZm9yICdkZWxheScgc2Vjb25kcyBmb3IgYXV0b2Jvb3Qgc3RvcCBvciBhdXRvYm9vdCBkZWxheSBzdHJpbmcuCisgKiByZXR1cm5zOiAwIC0gIG5vIGtleSBzdHJpbmcsIGFsbG93IGF1dG9ib290CisgKiAgICAgICAgICAxIC0gZ290IGtleSBzdHJpbmcsIGFib3J0CisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19CT09UREVMQVkpICYmIChDT05GSUdfQk9PVERFTEFZID49IDApCisjIGlmIGRlZmluZWQoQ09ORklHX0FVVE9CT09UX0tFWUVEKQorc3RhdGljIF9faW5saW5lX18gaW50IGFib3J0Ym9vdChpbnQgYm9vdGRlbGF5KQoreworCWludCBhYm9ydCA9IDA7CisJdWludDY0X3QgZXRpbWUgPSBlbmR0aWNrKGJvb3RkZWxheSk7CisJc3RydWN0CisJeworCQljaGFyKiBzdHI7CisJCXVfaW50IGxlbjsKKwkJaW50IHJldHJ5OworCX0KKwlkZWxheWtleSBbXSA9CisJeworCQl7IHN0cjogZ2V0ZW52ICgiYm9vdGRlbGF5a2V5IiksICByZXRyeTogMSB9LAorCQl7IHN0cjogZ2V0ZW52ICgiYm9vdGRlbGF5a2V5MiIpLCByZXRyeTogMSB9LAorCQl7IHN0cjogZ2V0ZW52ICgiYm9vdHN0b3BrZXkiKSwgICByZXRyeTogMCB9LAorCQl7IHN0cjogZ2V0ZW52ICgiYm9vdHN0b3BrZXkyIiksICByZXRyeTogMCB9LAorCX07CisKKwljaGFyIHByZXNza2V5IFtNQVhfREVMQVlfU1RPUF9TVFJdOworCXVfaW50IHByZXNza2V5X2xlbiA9IDA7CisJdV9pbnQgcHJlc3NrZXlfbWF4ID0gMDsKKwl1X2ludCBpOworCisjICBpZmRlZiBDT05GSUdfQVVUT0JPT1RfUFJPTVBUCisJcHJpbnRmIChDT05GSUdfQVVUT0JPT1RfUFJPTVBULCBib290ZGVsYXkpOworIyAgZW5kaWYKKworIyAgaWZkZWYgQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUgorCWlmIChkZWxheWtleVswXS5zdHIgPT0gTlVMTCkKKwkJZGVsYXlrZXlbMF0uc3RyID0gQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUjsKKyMgIGVuZGlmCisjICBpZmRlZiBDT05GSUdfQVVUT0JPT1RfREVMQVlfU1RSMgorCWlmIChkZWxheWtleVsxXS5zdHIgPT0gTlVMTCkKKwkJZGVsYXlrZXlbMV0uc3RyID0gQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUjI7CisjICBlbmRpZgorIyAgaWZkZWYgQ09ORklHX0FVVE9CT09UX1NUT1BfU1RSCisJaWYgKGRlbGF5a2V5WzJdLnN0ciA9PSBOVUxMKQorCQlkZWxheWtleVsyXS5zdHIgPSBDT05GSUdfQVVUT0JPT1RfU1RPUF9TVFI7CisjICBlbmRpZgorIyAgaWZkZWYgQ09ORklHX0FVVE9CT09UX1NUT1BfU1RSMgorCWlmIChkZWxheWtleVszXS5zdHIgPT0gTlVMTCkKKwkJZGVsYXlrZXlbM10uc3RyID0gQ09ORklHX0FVVE9CT09UX1NUT1BfU1RSMjsKKyMgIGVuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRlbGF5a2V5KSAvIHNpemVvZihkZWxheWtleVswXSk7IGkgKyspIHsKKwkJZGVsYXlrZXlbaV0ubGVuID0gZGVsYXlrZXlbaV0uc3RyID09IE5VTEwgPworCQkJCSAgICAwIDogc3RybGVuIChkZWxheWtleVtpXS5zdHIpOworCQlkZWxheWtleVtpXS5sZW4gPSBkZWxheWtleVtpXS5sZW4gPiBNQVhfREVMQVlfU1RPUF9TVFIgPworCQkJCSAgICBNQVhfREVMQVlfU1RPUF9TVFIgOiBkZWxheWtleVtpXS5sZW47CisKKwkJcHJlc3NrZXlfbWF4ID0gcHJlc3NrZXlfbWF4ID4gZGVsYXlrZXlbaV0ubGVuID8KKwkJCQkgICAgcHJlc3NrZXlfbWF4IDogZGVsYXlrZXlbaV0ubGVuOworCisjICBpZiBERUJVR19CT09US0VZUworCQlwcmludGYoIiVzIGtleTo8JXM+XG4iLAorCQkgICAgICAgZGVsYXlrZXlbaV0ucmV0cnkgPyAiZGVsYXkiIDogInN0b3AiLAorCQkgICAgICAgZGVsYXlrZXlbaV0uc3RyID8gZGVsYXlrZXlbaV0uc3RyIDogIk5VTEwiKTsKKyMgIGVuZGlmCisJfQorCisJLyogSW4gb3JkZXIgdG8ga2VlcCB1cCB3aXRoIGluY29taW5nIGRhdGEsIGNoZWNrIHRpbWVvdXQgb25seQorCSAqIHdoZW4gY2F0Y2ggdXAuCisJICovCisJd2hpbGUgKCFhYm9ydCAmJiBnZXRfdGlja3MoKSA8PSBldGltZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRlbGF5a2V5KSAvIHNpemVvZihkZWxheWtleVswXSk7IGkgKyspIHsKKwkJCWlmIChkZWxheWtleVtpXS5sZW4gPiAwICYmCisJCQkgICAgcHJlc3NrZXlfbGVuID49IGRlbGF5a2V5W2ldLmxlbiAmJgorCQkJICAgIG1lbWNtcCAocHJlc3NrZXkgKyBwcmVzc2tleV9sZW4gLSBkZWxheWtleVtpXS5sZW4sCisJCSAgICAgICAgCSAgICBkZWxheWtleVtpXS5zdHIsCisJCQkJICAgIGRlbGF5a2V5W2ldLmxlbikgPT0gMCkgeworIyAgaWYgREVCVUdfQk9PVEtFWVMKKwkJCQlwcmludGYoImdvdCAlc2tleVxuIiwKKwkJCQkgICAgICAgZGVsYXlrZXlbaV0ucmV0cnkgPyAiZGVsYXkiIDogInN0b3AiKTsKKyMgIGVuZGlmCisKKyMgIGlmZGVmIENPTkZJR19CT09UX1JFVFJZX1RJTUUKKwkJCQkvKiBkb24ndCByZXRyeSBhdXRvIGJvb3QgKi8KKwkJCQlpZiAoISBkZWxheWtleVtpXS5yZXRyeSkKKwkJCQkJcmV0cnlfdGltZSA9IC0xOworIyAgZW5kaWYKKwkJCQlhYm9ydCA9IDE7CisJCQl9CisJCX0KKworCQlpZiAodHN0YygpKSB7CisJCQlpZiAocHJlc3NrZXlfbGVuIDwgcHJlc3NrZXlfbWF4KSB7CisJCQkJcHJlc3NrZXkgW3ByZXNza2V5X2xlbiArK10gPSBnZXRjKCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcHJlc3NrZXlfbWF4IC0gMTsgaSArKykKKwkJCQkJcHJlc3NrZXkgW2ldID0gcHJlc3NrZXkgW2kgKyAxXTsKKworCQkJCXByZXNza2V5IFtpXSA9IGdldGMoKTsKKwkJCX0KKwkJfQorCX0KKyMgIGlmIERFQlVHX0JPT1RLRVlTCisJaWYgKCFhYm9ydCkKKwkJcHJpbnRmKCJrZXkgdGltZW91dFxuIik7CisjICBlbmRpZgorCisJcmV0dXJuIGFib3J0OworfQorCisjIGVsc2UJLyogIWRlZmluZWQoQ09ORklHX0FVVE9CT09UX0tFWUVEKSAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYWJvcnRib290KGludCBib290ZGVsYXkpCit7CisJaW50IGFib3J0ID0gMDsKKworCXByaW50ZigiSGl0IGFueSBrZXkgdG8gc3RvcCBhdXRvYm9vdDogJTJkICIsIGJvb3RkZWxheSk7CisKKyNpZiBkZWZpbmVkIENPTkZJR19aRVJPX0JPT1RERUxBWV9DSEVDSworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayBpZiBrZXkgYWxyZWFkeSBwcmVzc2VkCisgICAgICAgICAqIERvbid0IGNoZWNrIGlmIGJvb3RkZWxheSA8IDAKKyAgICAgICAgICovCisJaWYgKGJvb3RkZWxheSA+PSAwKSB7CisJCWlmICh0c3RjKCkpIHsJLyogd2UgZ290IGEga2V5IHByZXNzCSovCisJCQkodm9pZCkgZ2V0YygpOyAgLyogY29uc3VtZSBpbnB1dAkqLworCQkJcHJpbnRmICgiXGJcYlxiIDBcbiIpOworCQkJcmV0dXJuIDE7IAkvKiBkb24ndCBhdXRvIGJvb3QJKi8KKwkJfQorICAgICAgICB9CisjZW5kaWYKKworCXdoaWxlIChib290ZGVsYXkgPiAwKSB7CisJCWludCBpOworCisJCS0tYm9vdGRlbGF5OworCQkvKiBkZWxheSAxMDAgKiAxMG1zICovCisJCWZvciAoaT0wOyAhYWJvcnQgJiYgaTwxMDA7ICsraSkgeworCQkJaWYgKHRzdGMoKSkgewkvKiB3ZSBnb3QgYSBrZXkgcHJlc3MJKi8KKwkJCQlhYm9ydCAgPSAxOwkvKiBkb24ndCBhdXRvIGJvb3QJKi8KKwkJCQlib290ZGVsYXkgPSAwOwkvKiBubyBtb3JlIGRlbGF5CSovCisJCQkJKHZvaWQpIGdldGMoKTsgIC8qIGNvbnN1bWUgaW5wdXQJKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSAoMTAwMDApOworCQl9CisKKwkJcHJpbnRmICgiXGJcYlxiJTJkICIsIGJvb3RkZWxheSk7CisJfQorCisJcHV0YyAoJ1xuJyk7CisKKwlyZXR1cm4gYWJvcnQ7Cit9CisjIGVuZGlmCS8qIENPTkZJR19BVVRPQk9PVF9LRVlFRCAqLworI2VuZGlmCS8qIENPTkZJR19CT09UREVMQVkgPj0gMCAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgbWFpbl9sb29wICh2b2lkKQoreworI2lmbmRlZiBDRkdfSFVTSF9QQVJTRVIKKwlzdGF0aWMgY2hhciBsYXN0Y29tbWFuZFtDRkdfQ0JTSVpFXSA9IHsgMCwgfTsKKwlpbnQgbGVuOworCWludCByYyA9IDE7CisJaW50IGZsYWc7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JPT1RERUxBWSkgJiYgKENPTkZJR19CT09UREVMQVkgPj0gMCkKKwljaGFyICpzOworCWludCBib290ZGVsYXk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFJFQk9PVAorCWNoYXIgKnA7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1ZGRCkgJiYgZGVmaW5lZChWRkRfVEVTVF9MT0dPKQorCXVsb25nIGJtcCA9IDA7CQkvKiBkZWZhdWx0IGJpdG1hcCAqLworCWV4dGVybiBpbnQgdHJhYl92ZmQgKHVsb25nIGJpdG1hcCk7CisKKyNpZmRlZiBDT05GSUdfTU9ERU1fU1VQUE9SVAorCWlmIChkb19tZG1faW5pdCkKKwkJYm1wID0gMTsJLyogYWx0ZXJuYXRlIGJpdG1hcCAqLworI2VuZGlmCisJdHJhYl92ZmQgKGJtcCk7CisjZW5kaWYJLyogQ09ORklHX1ZGRCAmJiBWRkRfVEVTVF9MT0dPICovCisKKyNpZmRlZiBDT05GSUdfTU9ERU1fU1VQUE9SVAorCWRlYnVnICgiREVCVUc6IG1haW5fbG9vcDogICBkb19tZG1faW5pdD0lZFxuIiwgZG9fbWRtX2luaXQpOworCWlmIChkb19tZG1faW5pdCkgeworCQl1Y2hhciAqc3RyID0gc3RyZHVwKGdldGVudigibWRtX2NtZCIpKTsKKwkJc2V0ZW52ICgicHJlYm9vdCIsIHN0cik7ICAvKiBzZXQgb3IgZGVsZXRlIGRlZmluaXRpb24gKi8KKwkJaWYgKHN0ciAhPSBOVUxMKQorCQkJZnJlZSAoc3RyKTsKKwkJbWRtX2luaXQoKTsgLyogd2FpdCBmb3IgbW9kZW0gY29ubmVjdGlvbiAqLworCX0KKyNlbmRpZiAgLyogQ09ORklHX01PREVNX1NVUFBPUlQgKi8KKworI2lmZGVmIENGR19IVVNIX1BBUlNFUgorCXVfYm9vdF9odXNoX3N0YXJ0ICgpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUFJFQk9PVAorCWlmICgocCA9IGdldGVudiAoInByZWJvb3QiKSkgIT0gTlVMTCkgeworIyBpZmRlZiBDT05GSUdfQVVUT0JPT1RfS0VZRUQKKwkJaW50IHByZXYgPSBkaXNhYmxlX2N0cmxjKDEpOwkvKiBkaXNhYmxlIENvbnRyb2wgQyBjaGVja2luZyAqLworIyBlbmRpZgorCisjIGlmbmRlZiBDRkdfSFVTSF9QQVJTRVIKKwkJcnVuX2NvbW1hbmQgKHAsIDApOworIyBlbHNlCisJCXBhcnNlX3N0cmluZ19vdXRlcihwLCBGTEFHX1BBUlNFX1NFTUlDT0xPTiB8CisJCQkJICAgIEZMQUdfRVhJVF9GUk9NX0xPT1ApOworIyBlbmRpZgorCisjIGlmZGVmIENPTkZJR19BVVRPQk9PVF9LRVlFRAorCQlkaXNhYmxlX2N0cmxjKHByZXYpOwkvKiByZXN0b3JlIENvbnRyb2wgQyBjaGVja2luZyAqLworIyBlbmRpZgorCX0KKyNlbmRpZiAvKiBDT05GSUdfUFJFQk9PVCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVERFTEFZKSAmJiAoQ09ORklHX0JPT1RERUxBWSA+PSAwKQorCXMgPSBnZXRlbnYgKCJib290ZGVsYXkiKTsKKwlib290ZGVsYXkgPSBzID8gKGludClzaW1wbGVfc3RydG9sKHMsIE5VTEwsIDEwKSA6IENPTkZJR19CT09UREVMQVk7CisKKyNpZiAwCisJcHJpbnRmICgiIyMjIG1haW5fbG9vcCBlbnRlcmVkOlxuXG4iKTsKKyNlbmRpZgorCisjIGlmZGVmIENPTkZJR19CT09UX1JFVFJZX1RJTUUKKwlzID0gZ2V0ZW52ICgiYm9vdHJldHJ5Iik7CisJaWYgKHMgIT0gTlVMTCkKKwkJcmV0cnlfdGltZSA9IChpbnQpc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMTApOworCWVsc2UKKwkJcmV0cnlfdGltZSA9ICBDT05GSUdfQk9PVF9SRVRSWV9USU1FOworCWlmIChyZXRyeV90aW1lID49IDAgJiYgcmV0cnlfdGltZSA8IENPTkZJR19CT09UX1JFVFJZX01JTikKKwkJcmV0cnlfdGltZSA9IENPTkZJR19CT09UX1JFVFJZX01JTjsKKyMgZW5kaWYJLyogQ09ORklHX0JPT1RfUkVUUllfVElNRSAqLworCisJcyA9IGdldGVudiAoImJvb3RjbWQiKTsKKwlpZiAoYm9vdGRlbGF5ID49IDAgJiYgcyAmJiAhYWJvcnRib290IChib290ZGVsYXkpKSB7CisjIGlmZGVmIENPTkZJR19BVVRPQk9PVF9LRVlFRAorCQlpbnQgcHJldiA9IGRpc2FibGVfY3RybGMoMSk7CS8qIGRpc2FibGUgQ29udHJvbCBDIGNoZWNraW5nICovCisjIGVuZGlmCisKKyMgaWZuZGVmIENGR19IVVNIX1BBUlNFUgorCQlydW5fY29tbWFuZCAocywgMCk7CisjIGVsc2UKKwkJcGFyc2Vfc3RyaW5nX291dGVyKHMsIEZMQUdfUEFSU0VfU0VNSUNPTE9OIHwKKwkJCQkgICAgRkxBR19FWElUX0ZST01fTE9PUCk7CisjIGVuZGlmCisKKyMgaWZkZWYgQ09ORklHX0FVVE9CT09UX0tFWUVECisJCWRpc2FibGVfY3RybGMocHJldik7CS8qIHJlc3RvcmUgQ29udHJvbCBDIGNoZWNraW5nICovCisjIGVuZGlmCisJfQorI2VuZGlmCS8qIENPTkZJR19CT09UREVMQVkgKi8KKworCS8qCisJICogTWFpbiBMb29wIGZvciBNb25pdG9yIENvbW1hbmQgUHJvY2Vzc2luZworCSAqLworI2lmZGVmIENGR19IVVNIX1BBUlNFUgorCXBhcnNlX2ZpbGVfb3V0ZXIoKTsKKwkvKiBUaGlzIHBvaW50IGlzIG5ldmVyIHJlYWNoZWQgKi8KKwlmb3IgKDs7KTsKKyNlbHNlCisJZm9yICg7OykgeworI2lmZGVmIENPTkZJR19CT09UX1JFVFJZX1RJTUUKKwkJaWYgKHJjID49IDApIHsKKwkJCS8qIFNhdyBlbm91Z2ggb2YgYSB2YWxpZCBjb21tYW5kIHRvCisJCQkgKiByZXN0YXJ0IHRoZSB0aW1lb3V0LgorCQkJICovCisJCQlyZXNldF9jbWRfdGltZW91dCgpOworCQl9CisjZW5kaWYKKwkJbGVuID0gcmVhZGxpbmUgKENGR19QUk9NUFQpOworCisJCWZsYWcgPSAwOwkvKiBhc3N1bWUgbm8gc3BlY2lhbCBmbGFncyBmb3Igbm93ICovCisJCWlmIChsZW4gPiAwKQorCQkJc3RyY3B5IChsYXN0Y29tbWFuZCwgY29uc29sZV9idWZmZXIpOworCQllbHNlIGlmIChsZW4gPT0gMCkKKwkJCWZsYWcgfD0gQ01EX0ZMQUdfUkVQRUFUOworI2lmZGVmIENPTkZJR19CT09UX1JFVFJZX1RJTUUKKwkJZWxzZSBpZiAobGVuID09IC0yKSB7CisJCQkvKiAtMiBtZWFucyB0aW1lZCBvdXQsIHJldHJ5IGF1dG9ib290CisJCQkgKi8KKwkJCXByaW50ZigiXG5UaW1lZCBvdXQgd2FpdGluZyBmb3IgY29tbWFuZFxuIik7CisjIGlmZGVmIENPTkZJR19SRVNFVF9UT19SRVRSWQorCQkJLyogUmVpbml0IGJvYXJkIHRvIHJ1biBpbml0aWFsaXphdGlvbiBjb2RlIGFnYWluICovCisJCQlkb19yZXNldCAoTlVMTCwgMCwgMCwgTlVMTCk7CisjIGVsc2UKKwkJCXJldHVybjsJCS8qIHJldHJ5IGF1dG9ib290ICovCisjIGVuZGlmCisJCX0KKyNlbmRpZgorCisJCWlmIChsZW4gPT0gLTEpCisJCQlwcmludGYgKCI8SU5URVJSVVBUPlxuIik7CisJCWVsc2UKKwkJCXJjID0gcnVuX2NvbW1hbmQgKGxhc3Rjb21tYW5kLCBmbGFnKTsKKworCQlpZiAocmMgPD0gMCkgeworCQkJLyogaW52YWxpZCBjb21tYW5kIG9yIG5vdCByZXBlYXRhYmxlLCBmb3JnZXQgaXQgKi8KKwkJCWxhc3Rjb21tYW5kWzBdID0gMDsKKwkJfQorCX0KKyNlbmRpZiAvKkNGR19IVVNIX1BBUlNFUiovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJlc2V0IGNvbW1hbmQgbGluZSB0aW1lb3V0IHRvIHJldHJ5X3RpbWUgc2Vjb25kcworICovCisjaWZkZWYgQ09ORklHX0JPT1RfUkVUUllfVElNRQordm9pZCByZXNldF9jbWRfdGltZW91dCh2b2lkKQoreworCWVuZHRpbWUgPSBlbmR0aWNrKHJldHJ5X3RpbWUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUHJvbXB0IGZvciBpbnB1dCBhbmQgcmVhZCBhIGxpbmUuCisgKiBJZiAgQ09ORklHX0JPT1RfUkVUUllfVElNRSBpcyBkZWZpbmVkIGFuZCByZXRyeV90aW1lID49IDAsCisgKiB0aW1lIG91dCB3aGVuIHRpbWUgZ29lcyBwYXN0IGVuZHRpbWUgKHRpbWViYXNlIHRpbWUgaW4gdGlja3MpLgorICogUmV0dXJuOgludW1iZXIgb2YgcmVhZCBjaGFyYWN0ZXJzCisgKgkJLTEgaWYgYnJlYWsKKyAqCQktMiBpZiB0aW1lZCBvdXQKKyAqLworaW50IHJlYWRsaW5lIChjb25zdCBjaGFyICpjb25zdCBwcm9tcHQpCit7CisJY2hhciAgICpwID0gY29uc29sZV9idWZmZXI7CisJaW50CW4gPSAwOwkJCQkvKiBidWZmZXIgaW5kZXgJCSovCisJaW50CXBsZW4gPSAwOwkJCS8qIHByb21wdCBsZW5ndGgJKi8KKwlpbnQJY29sOwkJCQkvKiBvdXRwdXQgY29sdW1uIGNudAkqLworCWNoYXIJYzsKKworCS8qIHByaW50IHByb21wdCAqLworCWlmIChwcm9tcHQpIHsKKwkJcGxlbiA9IHN0cmxlbiAocHJvbXB0KTsKKwkJcHV0cyAocHJvbXB0KTsKKwl9CisJY29sID0gcGxlbjsKKworCWZvciAoOzspIHsKKyNpZmRlZiBDT05GSUdfQk9PVF9SRVRSWV9USU1FCisJCXdoaWxlICghdHN0YygpKSB7CS8qIHdoaWxlIG5vIGluY29taW5nIGRhdGEgKi8KKwkJCWlmIChyZXRyeV90aW1lID49IDAgJiYgZ2V0X3RpY2tzKCkgPiBlbmR0aW1lKQorCQkJCXJldHVybiAoLTIpOwkvKiB0aW1lZCBvdXQgKi8KKwkJfQorI2VuZGlmCisJCVdBVENIRE9HX1JFU0VUKCk7CQkvKiBUcmlnZ2VyIHdhdGNoZG9nLCBpZiBuZWVkZWQgKi8KKworI2lmZGVmIENPTkZJR19TSE9XX0FDVElWSVRZCisJCXdoaWxlICghdHN0YygpKSB7CisJCQlleHRlcm4gdm9pZCBzaG93X2FjdGl2aXR5KGludCBhcmcpOworCQkJc2hvd19hY3Rpdml0eSgwKTsKKwkJfQorI2VuZGlmCisJCWMgPSBnZXRjKCk7CisKKwkJLyoKKwkJICogU3BlY2lhbCBjaGFyYWN0ZXIgaGFuZGxpbmcKKwkJICovCisJCXN3aXRjaCAoYykgeworCQljYXNlICdccic6CQkJCS8qIEVudGVyCQkqLworCQljYXNlICdcbic6CisJCQkqcCA9ICdcMCc7CisJCQlwdXRzICgiXHJcbiIpOworCQkJcmV0dXJuIChwIC0gY29uc29sZV9idWZmZXIpOworCisJCWNhc2UgMHgwMzoJCQkJLyogXkMgLSBicmVhawkJKi8KKwkJCWNvbnNvbGVfYnVmZmVyWzBdID0gJ1wwJzsJLyogZGlzY2FyZCBpbnB1dCAqLworCQkJcmV0dXJuICgtMSk7CisKKwkJY2FzZSAweDE1OgkJCQkvKiBeVSAtIGVyYXNlIGxpbmUJKi8KKwkJCXdoaWxlIChjb2wgPiBwbGVuKSB7CisJCQkJcHV0cyAoZXJhc2Vfc2VxKTsKKwkJCQktLWNvbDsKKwkJCX0KKwkJCXAgPSBjb25zb2xlX2J1ZmZlcjsKKwkJCW4gPSAwOworCQkJY29udGludWU7CisKKwkJY2FzZSAweDE3OgkJCQkvKiBeVyAtIGVyYXNlIHdvcmQgCSovCisJCQlwPWRlbGV0ZV9jaGFyKGNvbnNvbGVfYnVmZmVyLCBwLCAmY29sLCAmbiwgcGxlbik7CisJCQl3aGlsZSAoKG4gPiAwKSAmJiAoKnAgIT0gJyAnKSkgeworCQkJCXA9ZGVsZXRlX2NoYXIoY29uc29sZV9idWZmZXIsIHAsICZjb2wsICZuLCBwbGVuKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCisJCWNhc2UgMHgwODoJCQkJLyogXkggIC0gYmFja3NwYWNlCSovCisJCWNhc2UgMHg3RjoJCQkJLyogREVMIC0gYmFja3NwYWNlCSovCisJCQlwPWRlbGV0ZV9jaGFyKGNvbnNvbGVfYnVmZmVyLCBwLCAmY29sLCAmbiwgcGxlbik7CisJCQljb250aW51ZTsKKworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIE11c3QgYmUgYSBub3JtYWwgY2hhcmFjdGVyIHRoZW4KKwkJCSAqLworCQkJaWYgKG4gPCBDRkdfQ0JTSVpFLTIpIHsKKwkJCQlpZiAoYyA9PSAnXHQnKSB7CS8qIGV4cGFuZCBUQUJzCQkqLworCQkJCQlwdXRzICh0YWJfc2VxKyhjb2wmMDcpKTsKKwkJCQkJY29sICs9IDggLSAoY29sJjA3KTsKKwkJCQl9IGVsc2UgeworCQkJCQkrK2NvbDsJCS8qIGVjaG8gaW5wdXQJCSovCisJCQkJCXB1dGMgKGMpOworCQkJCX0KKwkJCQkqcCsrID0gYzsKKwkJCQkrK247CisJCQl9IGVsc2UgewkJCS8qIEJ1ZmZlciBmdWxsCQkqLworCQkJCXB1dGMgKCdcYScpOworCQkJfQorCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNoYXIgKiBkZWxldGVfY2hhciAoY2hhciAqYnVmZmVyLCBjaGFyICpwLCBpbnQgKmNvbHAsIGludCAqbnAsIGludCBwbGVuKQoreworCWNoYXIgKnM7CisKKwlpZiAoKm5wID09IDApIHsKKwkJcmV0dXJuIChwKTsKKwl9CisKKwlpZiAoKigtLXApID09ICdcdCcpIHsJCQkvKiB3aWxsIHJldHlwZSB0aGUgd2hvbGUgbGluZQkqLworCQl3aGlsZSAoKmNvbHAgPiBwbGVuKSB7CisJCQlwdXRzIChlcmFzZV9zZXEpOworCQkJKCpjb2xwKS0tOworCQl9CisJCWZvciAocz1idWZmZXI7IHM8cDsgKytzKSB7CisJCQlpZiAoKnMgPT0gJ1x0JykgeworCQkJCXB1dHMgKHRhYl9zZXErKCgqY29scCkgJiAwNykpOworCQkJCSpjb2xwICs9IDggLSAoKCpjb2xwKSAmIDA3KTsKKwkJCX0gZWxzZSB7CisJCQkJKysoKmNvbHApOworCQkJCXB1dGMgKCpzKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXB1dHMgKGVyYXNlX3NlcSk7CisJCSgqY29scCktLTsKKwl9CisJKCpucCktLTsKKwlyZXR1cm4gKHApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IHBhcnNlX2xpbmUgKGNoYXIgKmxpbmUsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgbmFyZ3MgPSAwOworCisjaWZkZWYgREVCVUdfUEFSU0VSCisJcHJpbnRmICgicGFyc2VfbGluZTogXCIlc1wiXG4iLCBsaW5lKTsKKyNlbmRpZgorCXdoaWxlIChuYXJncyA8IENGR19NQVhBUkdTKSB7CisKKwkJLyogc2tpcCBhbnkgd2hpdGUgc3BhY2UgKi8KKwkJd2hpbGUgKCgqbGluZSA9PSAnICcpIHx8ICgqbGluZSA9PSAnXHQnKSkgeworCQkJKytsaW5lOworCQl9CisKKwkJaWYgKCpsaW5lID09ICdcMCcpIHsJLyogZW5kIG9mIGxpbmUsIG5vIG1vcmUgYXJncwkqLworCQkJYXJndltuYXJnc10gPSBOVUxMOworI2lmZGVmIERFQlVHX1BBUlNFUgorCQlwcmludGYgKCJwYXJzZV9saW5lOiBuYXJncz0lZFxuIiwgbmFyZ3MpOworI2VuZGlmCisJCQlyZXR1cm4gKG5hcmdzKTsKKwkJfQorCisJCWFyZ3ZbbmFyZ3MrK10gPSBsaW5lOwkvKiBiZWdpbiBvZiBhcmd1bWVudCBzdHJpbmcJKi8KKworCQkvKiBmaW5kIGVuZCBvZiBzdHJpbmcgKi8KKwkJd2hpbGUgKCpsaW5lICYmICgqbGluZSAhPSAnICcpICYmICgqbGluZSAhPSAnXHQnKSkgeworCQkJKytsaW5lOworCQl9CisKKwkJaWYgKCpsaW5lID09ICdcMCcpIHsJLyogZW5kIG9mIGxpbmUsIG5vIG1vcmUgYXJncwkqLworCQkJYXJndltuYXJnc10gPSBOVUxMOworI2lmZGVmIERFQlVHX1BBUlNFUgorCQlwcmludGYgKCJwYXJzZV9saW5lOiBuYXJncz0lZFxuIiwgbmFyZ3MpOworI2VuZGlmCisJCQlyZXR1cm4gKG5hcmdzKTsKKwkJfQorCisJCSpsaW5lKysgPSAnXDAnOwkJLyogdGVybWluYXRlIGN1cnJlbnQgYXJnCSAqLworCX0KKworCXByaW50ZiAoIioqIFRvbyBtYW55IGFyZ3MgKG1heC4gJWQpICoqXG4iLCBDRkdfTUFYQVJHUyk7CisKKyNpZmRlZiBERUJVR19QQVJTRVIKKwlwcmludGYgKCJwYXJzZV9saW5lOiBuYXJncz0lZFxuIiwgbmFyZ3MpOworI2VuZGlmCisJcmV0dXJuIChuYXJncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBwcm9jZXNzX21hY3JvcyAoY29uc3QgY2hhciAqaW5wdXQsIGNoYXIgKm91dHB1dCkKK3sKKwljaGFyIGMsIHByZXY7CisJY29uc3QgY2hhciAqdmFybmFtZV9zdGFydCA9IE5VTEw7CisJaW50IGlucHV0Y250ICA9IHN0cmxlbiAoaW5wdXQpOworCWludCBvdXRwdXRjbnQgPSBDRkdfQ0JTSVpFOworCWludCBzdGF0ZSA9IDA7CS8qIDAgPSB3YWl0aW5nIGZvciAnJCcJKi8KKwkJCS8qIDEgPSB3YWl0aW5nIGZvciAnKCcJKi8KKwkJCS8qIDIgPSB3YWl0aW5nIGZvciAnKScJKi8KKworI2lmZGVmIERFQlVHX1BBUlNFUgorCWNoYXIgKm91dHB1dF9zdGFydCA9IG91dHB1dDsKKworCXByaW50ZiAoIltQUk9DRVNTX01BQ1JPU10gSU5QVVQgbGVuICVkOiBcIiVzXCJcbiIsIHN0cmxlbihpbnB1dCksIGlucHV0KTsKKyNlbmRpZgorCisJcHJldiA9ICdcMCc7CQkJLyogcHJldmlvdXMgY2hhcmFjdGVyCSovCisKKwl3aGlsZSAoaW5wdXRjbnQgJiYgb3V0cHV0Y250KSB7CisJICAgIGMgPSAqaW5wdXQrKzsKKwkgICAgaW5wdXRjbnQtLTsKKworCSAgICAvKiByZW1vdmUgb25lIGxldmVsIG9mIGVzY2FwZSBjaGFyYWN0ZXJzICovCisJICAgIGlmICgoYyA9PSAnXFwnKSAmJiAocHJldiAhPSAnXFwnKSkgeworCQlpZiAoaW5wdXRjbnQtLSA9PSAwKQorCQkJYnJlYWs7CisJCXByZXYgPSBjOworCSAgICAJYyA9ICppbnB1dCsrOworCSAgICB9CisKKwkgICAgc3dpdGNoIChzdGF0ZSkgeworCSAgICBjYXNlIDA6CQkJLyogV2FpdGluZyBmb3IgKHVuZXNjYXBlZCkgJAkqLworCQlpZiAoKGMgPT0gJyQnKSAmJiAocHJldiAhPSAnXFwnKSkgeworCQkJc3RhdGUrKzsKKwkJfSBlbHNlIHsKKwkJCSoob3V0cHV0KyspID0gYzsKKwkJCW91dHB1dGNudC0tOworCQl9CisJCWJyZWFrOworCSAgICBjYXNlIDE6CQkJLyogV2FpdGluZyBmb3IgKAkqLworCQlpZiAoYyA9PSAnKCcpIHsKKwkJCXN0YXRlKys7CisJCQl2YXJuYW1lX3N0YXJ0ID0gaW5wdXQ7CisJCX0gZWxzZSB7CisJCQlzdGF0ZSA9IDA7CisJCQkqKG91dHB1dCsrKSA9ICckJzsKKwkJCW91dHB1dGNudC0tOworCisJCQlpZiAob3V0cHV0Y250KSB7CisJCQkJKihvdXRwdXQrKykgPSBjOworCQkJCW91dHB1dGNudC0tOworCQkJfQorCQl9CisJCWJyZWFrOworCSAgICBjYXNlIDI6CQkJLyogV2FpdGluZyBmb3IgKQkqLworCQlpZiAoYyA9PSAnKScpIHsKKwkJCWludCBpOworCQkJY2hhciBlbnZuYW1lW0NGR19DQlNJWkVdLCAqZW52dmFsOworCQkJaW50IGVudmNudCA9IGlucHV0LXZhcm5hbWVfc3RhcnQtMTsgLyogVmFybmFtZSAjIG9mIGNoYXJzICovCisKKwkJCS8qIEdldCB0aGUgdmFybmFtZSAqLworCQkJZm9yIChpID0gMDsgaSA8IGVudmNudDsgaSsrKSB7CisJCQkJZW52bmFtZVtpXSA9IHZhcm5hbWVfc3RhcnRbaV07CisJCQl9CisJCQllbnZuYW1lW2ldID0gMDsKKworCQkJLyogR2V0IGl0cyB2YWx1ZSAqLworCQkJZW52dmFsID0gZ2V0ZW52IChlbnZuYW1lKTsKKworCQkJLyogQ29weSBpbnRvIHRoZSBsaW5lIGlmIGl0IGV4aXN0cyAqLworCQkJaWYgKGVudnZhbCAhPSBOVUxMKQorCQkJCXdoaWxlICgoKmVudnZhbCkgJiYgb3V0cHV0Y250KSB7CisJCQkJCSoob3V0cHV0KyspID0gKihlbnZ2YWwrKyk7CisJCQkJCW91dHB1dGNudC0tOworCQkJCX0KKwkJCS8qIExvb2sgZm9yIGFub3RoZXIgJyQnICovCisJCQlzdGF0ZSA9IDA7CisJCX0KKwkJYnJlYWs7CisJICAgIH0KKworCSAgICBwcmV2ID0gYzsKKwl9CisKKwlpZiAob3V0cHV0Y250KQorCQkqb3V0cHV0ID0gMDsKKworI2lmZGVmIERFQlVHX1BBUlNFUgorCXByaW50ZiAoIltQUk9DRVNTX01BQ1JPU10gT1VUUFVUIGxlbiAlZDogXCIlc1wiXG4iLAorCQlzdHJsZW4ob3V0cHV0X3N0YXJ0KSwgb3V0cHV0X3N0YXJ0KTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmV0dXJuczoKKyAqCTEgIC0gY29tbWFuZCBleGVjdXRlZCwgcmVwZWF0YWJsZQorICoJMCAgLSBjb21tYW5kIGV4ZWN1dGVkIGJ1dCBub3QgcmVwZWF0YWJsZSwgaW50ZXJydXB0ZWQgY29tbWFuZHMgYXJlCisgKgkgICAgIGFsd2F5cyBjb25zaWRlcmVkIG5vdCByZXBlYXRhYmxlCisgKgktMSAtIG5vdCBleGVjdXRlZCAodW5yZWNvZ25pemVkLCBib290ZCByZWN1cnNpb24gb3IgdG9vIG1hbnkgYXJncykKKyAqICAgICAgICAgICAoSWYgY21kIGlzIE5VTEwgb3IgIiIgb3IgbG9uZ2VyIHRoYW4gQ0ZHX0NCU0laRS0xIGl0IGlzCisgKiAgICAgICAgICAgY29uc2lkZXJlZCB1bnJlY29nbml6ZWQpCisgKgorICogV0FSTklORzoKKyAqCisgKiBXZSBtdXN0IGNyZWF0ZSBhIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBjb21tYW5kIHNpbmNlIHRoZSBjb21tYW5kIHdlIGdldAorICogbWF5IGJlIHRoZSByZXN1bHQgZnJvbSBnZXRlbnYoKSwgd2hpY2ggcmV0dXJucyBhIHBvaW50ZXIgZGlyZWN0bHkgdG8KKyAqIHRoZSBlbnZpcm9ubWVudCBkYXRhLCB3aGljaCBtYXkgY2hhbmdlIG1hZ2ljbHkgd2hlbiB0aGUgY29tbWFuZCB3ZSBydW4KKyAqIGNyZWF0ZXMgb3IgbW9kaWZpZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIChsaWtlICJib290cCIgZG9lcykuCisgKi8KKworaW50IHJ1bl9jb21tYW5kIChjb25zdCBjaGFyICpjbWQsIGludCBmbGFnKQoreworCWNtZF90YmxfdCAqY21kdHA7CisJY2hhciBjbWRidWZbQ0ZHX0NCU0laRV07CS8qIHdvcmtpbmcgY29weSBvZiBjbWQJCSovCisJY2hhciAqdG9rZW47CQkJLyogc3RhcnQgb2YgdG9rZW4gaW4gY21kYnVmCSovCisJY2hhciAqc2VwOwkJCS8qIGVuZCBvZiB0b2tlbiAoc2VwYXJhdG9yKSBpbiBjbWRidWYgKi8KKwljaGFyIGZpbmFsdG9rZW5bQ0ZHX0NCU0laRV07CisJY2hhciAqc3RyID0gY21kYnVmOworCWNoYXIgKmFyZ3ZbQ0ZHX01BWEFSR1MgKyAxXTsJLyogTlVMTCB0ZXJtaW5hdGVkCSovCisJaW50IGFyZ2M7CisJaW50IHJlcGVhdGFibGUgPSAxOworCisjaWZkZWYgREVCVUdfUEFSU0VSCisJcHJpbnRmICgiW1JVTl9DT01NQU5EXSBjbWRbJXBdPVwiIiwgY21kKTsKKwlwdXRzIChjbWQgPyBjbWQgOiAiTlVMTCIpOwkvKiB1c2UgcHV0cyAtIHN0cmluZyBtYXkgYmUgbG9vb29uZyAqLworCXB1dHMgKCJcIlxuIik7CisjZW5kaWYKKworCWNsZWFyX2N0cmxjKCk7CQkvKiBmb3JnZXQgYW55IHByZXZpb3VzIENvbnRyb2wgQyAqLworCisJaWYgKCFjbWQgfHwgISpjbWQpIHsKKwkJcmV0dXJuIC0xOwkvKiBlbXB0eSBjb21tYW5kICovCisJfQorCisJaWYgKHN0cmxlbihjbWQpID49IENGR19DQlNJWkUpIHsKKwkJcHV0cyAoIiMjIENvbW1hbmQgdG9vIGxvbmchXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN0cmNweSAoY21kYnVmLCBjbWQpOworCisJLyogUHJvY2VzcyBzZXBhcmF0b3JzIGFuZCBjaGVjayBmb3IgaW52YWxpZAorCSAqIHJlcGVhdGFibGUgY29tbWFuZHMKKwkgKi8KKworI2lmZGVmIERFQlVHX1BBUlNFUgorCXByaW50ZiAoIltQUk9DRVNTX1NFUEFSQVRPUlNdICVzXG4iLCBjbWQpOworI2VuZGlmCisJd2hpbGUgKCpzdHIpIHsKKworCQkvKgorCQkgKiBGaW5kIHNlcGFyYXRvciwgb3Igc3RyaW5nIGVuZAorCQkgKiBBbGxvdyBzaW1wbGUgZXNjYXBlIG9mICc7JyBieSB3cml0aW5nICJcOyIKKwkJICovCisJCWZvciAoc2VwID0gc3RyOyAqc2VwOyBzZXArKykgeworCQkJaWYgKCgqc2VwID09ICc7JykgJiYJLyogc2VwYXJhdG9yCQkqLworCQkJICAgICggc2VwICE9IHN0cikgJiYJLyogcGFzdCBzdHJpbmcgc3RhcnQJKi8KKwkJCSAgICAoKihzZXAtMSkgIT0gJ1xcJykpCS8qIGFuZCBOT1QgZXNjYXBlZAkqLworCQkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogTGltaXQgdGhlIHRva2VuIHRvIGRhdGEgYmV0d2VlbiBzZXBhcmF0b3JzCisJCSAqLworCQl0b2tlbiA9IHN0cjsKKwkJaWYgKCpzZXApIHsKKwkJCXN0ciA9IHNlcCArIDE7CS8qIHN0YXJ0IG9mIGNvbW1hbmQgZm9yIG5leHQgcGFzcyAqLworCQkJKnNlcCA9ICdcMCc7CisJCX0KKwkJZWxzZQorCQkJc3RyID0gc2VwOwkvKiBubyBtb3JlIGNvbW1hbmRzIGZvciBuZXh0IHBhc3MgKi8KKyNpZmRlZiBERUJVR19QQVJTRVIKKwkJcHJpbnRmICgidG9rZW46IFwiJXNcIlxuIiwgdG9rZW4pOworI2VuZGlmCisKKwkJLyogZmluZCBtYWNyb3MgaW4gdGhpcyB0b2tlbiBhbmQgcmVwbGFjZSB0aGVtICovCisJCXByb2Nlc3NfbWFjcm9zICh0b2tlbiwgZmluYWx0b2tlbik7CisKKwkJLyogRXh0cmFjdCBhcmd1bWVudHMgKi8KKwkJYXJnYyA9IHBhcnNlX2xpbmUgKGZpbmFsdG9rZW4sIGFyZ3YpOworCisJCS8qIExvb2sgdXAgY29tbWFuZCBpbiBjb21tYW5kIHRhYmxlICovCisJCWlmICgoY21kdHAgPSBmaW5kX2NtZChhcmd2WzBdKSkgPT0gTlVMTCkgeworCQkJcHJpbnRmICgiVW5rbm93biBjb21tYW5kICclcycgLSB0cnkgJ2hlbHAnXG4iLCBhcmd2WzBdKTsKKwkJCXJldHVybiAtMTsJLyogZ2l2ZSB1cCBhZnRlciBiYWQgY29tbWFuZCAqLworCQl9CisKKwkJLyogZm91bmQgLSBjaGVjayBtYXggYXJncyAqLworCQlpZiAoYXJnYyA+IGNtZHRwLT5tYXhhcmdzKSB7CisJCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCQkJcmV0dXJuIC0xOworCQl9CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CT09URCkKKwkJLyogYXZvaWQgImJvb3RkIiByZWN1cnNpb24gKi8KKwkJaWYgKGNtZHRwLT5jbWQgPT0gZG9fYm9vdGQpIHsKKyNpZmRlZiBERUJVR19QQVJTRVIKKwkJCXByaW50ZiAoIlslc11cbiIsIGZpbmFsdG9rZW4pOworI2VuZGlmCisJCQlpZiAoZmxhZyAmIENNRF9GTEFHX0JPT1REKSB7CisJCQkJcHJpbnRmICgiJ2Jvb3RkJyByZWN1cnNpb24gZGV0ZWN0ZWRcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlmbGFnIHw9IENNRF9GTEFHX0JPT1REOworCQl9CisjZW5kaWYJLyogQ0ZHX0NNRF9CT09URCAqLworCisJCS8qIE9LIC0gY2FsbCBmdW5jdGlvbiB0byBkbyB0aGUgY29tbWFuZCAqLworCQlpZiAoKGNtZHRwLT5jbWQpIChjbWR0cCwgZmxhZywgYXJnYywgYXJndikgIT0gMCkgeworCQkJcmV0dXJuICgtMSk7CisJCX0KKworCQlyZXBlYXRhYmxlICY9IGNtZHRwLT5yZXBlYXRhYmxlOworCisJCS8qIERpZCB0aGUgdXNlciBzdG9wIHRoaXM/ICovCisJCWlmIChoYWRfY3RybGMgKCkpCisJCQlyZXR1cm4gMDsJLyogaWYgc3RvcHBlZCB0aGVuIG5vdCByZXBlYXRhYmxlICovCisJfQorCisJcmV0dXJuIHJlcGVhdGFibGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUlVOKQoraW50IGRvX3J1biAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBpOworCWludCByY29kZSA9IDE7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZm9yIChpPTE7IGk8YXJnYzsgKytpKSB7CisjaWZuZGVmIENGR19IVVNIX1BBUlNFUgorCSAgICBpZiAocnVuX2NvbW1hbmQgKGdldGVudiAoYXJndltpXSksIGZsYWcpICE9IC0xKSArK3Jjb2RlOworI2Vsc2UKKyAgIAkgICAgaWYgKHBhcnNlX3N0cmluZ19vdXRlcihnZXRlbnYgKGFyZ3ZbaV0pLAorCQkgICAgRkxBR19QQVJTRV9TRU1JQ09MT04gfCBGTEFHX0VYSVRfRlJPTV9MT09QKSA9PSAwKSArK3Jjb2RlOworI2VuZGlmCisJfQorCXJldHVybiAoKHJjb2RlID09IGkpID8gMCA6IDEpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vbWlpcGh5dXRpbC5jIGIvY29tbW9uL21paXBoeXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjI0MjVmCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL21paXBoeXV0aWwuYwpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogR2VyYWxkIFZhbiBCYXJlbiwgQ3VzdG9tIElERUFTLCB2YW5iYXJlbkBjaWRlYXMuY29tLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBUaGlzIHByb3ZpZGVzIGEgYml0LWJhbmdlZCBpbnRlcmZhY2UgdG8gdGhlIGV0aGVybmV0IE1JSSBtYW5hZ2VtZW50CisgKiBjaGFubmVsLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtaWlwaHkuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZWFkIHRoZSBPVUksIG1hbnVmYWN0dXJlJ3MgbW9kZWwgbnVtYmVyLCBhbmQgcmV2aXNpb24gbnVtYmVyLgorICoKKyAqIE9VSTogICAgIDIyIGJpdHMgKHVuc2lnbmVkIGludCkKKyAqIE1vZGVsOiAgICA2IGJpdHMgKHVuc2lnbmVkIGNoYXIpCisgKiBSZXZpc2lvbjogNCBiaXRzICh1bnNpZ25lZCBjaGFyKQorICoKKyAqIFJldHVybnM6CisgKiAgIDAgb24gc3VjY2VzcworICovCitpbnQgbWlpcGh5X2luZm8gKHVuc2lnbmVkIGNoYXIgYWRkciwKKwkJIHVuc2lnbmVkIGludCAqb3VpLAorCQkgdW5zaWduZWQgY2hhciAqbW9kZWwsIHVuc2lnbmVkIGNoYXIgKnJldikKK3sKKwl1bnNpZ25lZCBpbnQgcmVnID0gMDsKKworCS8qCisJICogVHJpY2s6IHdlIGFyZSByZWFkaW5nIHR3byAxNiByZWdpc3RlcnMgaW50byBhIDMyIGJpdCB2YXJpYWJsZQorCSAqIHNvIHdlIGRvIGEgMTYgcmVhZCBpbnRvIHRoZSBoaWdoIG9yZGVyIGJpdHMgb2YgdGhlIHZhcmlhYmxlIChiaWcKKwkgKiBlbmRpYW4sIHlvdSBrbm93KSwgc2hpZnQgaXQgZG93biAxNiBiaXRzLCBhbmQgdGhlIHJlYWQgdGhlIHJlc3QuCisJICovCisJaWYgKG1paXBoeV9yZWFkIChhZGRyLCBQSFlfUEhZSURSMiwgKHVuc2lnbmVkIHNob3J0ICopICZyZWcpICE9IDApIHsKKyNpZmRlZiBERUJVRworCQlwcmludGYgKCJQSFkgSUQgcmVnaXN0ZXIgMiByZWFkIGZhaWxlZFxuIik7CisjZW5kaWYKKwkJcmV0dXJuICgtMSk7CisJfQorCXJlZyA+Pj0gMTY7CisKKyNpZmRlZiBERUJVRworCXByaW50ZiAoIlBIWV9QSFlJRFIyIEAgMHgleCA9IDB4JTA0eFxuIiwgYWRkciwgcmVnKTsKKyNlbmRpZgorCWlmIChyZWcgPT0gMHhGRkZGKSB7CisJCS8qIE5vIHBoeXNpY2FsIGRldmljZSBwcmVzZW50IGF0IHRoaXMgYWRkcmVzcyAqLworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlpZiAobWlpcGh5X3JlYWQgKGFkZHIsIFBIWV9QSFlJRFIxLCAodW5zaWduZWQgc2hvcnQgKikgJnJlZykgIT0gMCkgeworI2lmZGVmIERFQlVHCisJCXByaW50ZiAoIlBIWSBJRCByZWdpc3RlciAxIHJlYWQgZmFpbGVkXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gKC0xKTsKKwl9CisjaWZkZWYgREVCVUcKKwlwcmludGYgKCJQSFlfUEhZSURSWzEsMl0gQCAweCV4ID0gMHglMDh4XG4iLCBhZGRyLCByZWcpOworI2VuZGlmCisJKm91aSAgID0gICAgICAgICAgICAgICAgICggcmVnID4+IDEwKTsKKwkqbW9kZWwgPSAodW5zaWduZWQgY2hhcikgKChyZWcgPj4gIDQpICYgMHgwMDAwMDAzRik7CisJKnJldiAgID0gKHVuc2lnbmVkIGNoYXIpICggcmVnICAgICAgICAmIDB4MDAwMDAwMEYpOworCXJldHVybiAoMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVzZXQgdGhlIFBIWS4KKyAqIFJldHVybnM6CisgKiAgIDAgb24gc3VjY2VzcworICovCitpbnQgbWlpcGh5X3Jlc2V0ICh1bnNpZ25lZCBjaGFyIGFkZHIpCit7CisJdW5zaWduZWQgc2hvcnQgcmVnOworCWludCBsb29wX2NudDsKKworCWlmIChtaWlwaHlfd3JpdGUgKGFkZHIsIFBIWV9CTUNSLCAweDgwMDApICE9IDApIHsKKyNpZmRlZiBERUJVRworCQlwcmludGYgKCJQSFkgcmVzZXQgZmFpbGVkXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIFBvbGwgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZm9yIHRoZSByZXNldCBiaXQgdG8gZ28gdG8gMCAoaXQgaXMKKwkgKiBhdXRvLWNsZWFyaW5nKS4gIFRoaXMgc2hvdWxkIGhhcHBlbiB3aXRoaW4gMC41IHNlY29uZHMgcGVyIHRoZQorCSAqIElFRUUgc3BlYy4KKwkgKi8KKwlsb29wX2NudCA9IDA7CisJcmVnID0gMHg4MDAwOworCXdoaWxlICgoKHJlZyAmIDB4ODAwMCkgIT0gMCkgJiYgKGxvb3BfY250KysgPCAxMDAwMDAwKSkgeworCQlpZiAobWlpcGh5X3JlYWQgKGFkZHIsIFBIWV9CTUNSLCAmcmVnKSAhPSAwKSB7CisjICAgICBpZmRlZiBERUJVRworCQkJcHJpbnRmICgiUEhZIHN0YXR1cyByZWFkIGZhaWxlZFxuIik7CisjICAgICBlbmRpZgorCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9CisJaWYgKChyZWcgJiAweDgwMDApID09IDApIHsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQlwcmludGYgKCJQSFkgcmVzZXQgdGltZWQgb3V0XG4iKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV0ZXJtaW5lIHRoZSBldGhlcm5ldCBzcGVlZCAoMTAvMTAwKS4KKyAqLworaW50IG1paXBoeV9zcGVlZCAodW5zaWduZWQgY2hhciBhZGRyKQoreworCXVuc2lnbmVkIHNob3J0IHJlZzsKKworCWlmIChtaWlwaHlfcmVhZCAoYWRkciwgUEhZX0FOTFBBUiwgJnJlZykpIHsKKwkJcHJpbnRmICgiUEhZIHNwZWVkMSByZWFkIGZhaWxlZCwgYXNzdW1pbmcgMTBiVFxuIik7CisJCXJldHVybiAoXzEwQkFTRVQpOworCX0KKworCWlmICgocmVnICYgUEhZX0FOTFBBUl8xMDApICE9IDApIHsKKwkJcmV0dXJuIChfMTAwQkFTRVQpOworCX0gZWxzZSB7CisJCXJldHVybiAoXzEwQkFTRVQpOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXRlcm1pbmUgZnVsbC9oYWxmIGR1cGxleC4KKyAqLworaW50IG1paXBoeV9kdXBsZXggKHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwl1bnNpZ25lZCBzaG9ydCByZWc7CisKKwlpZiAobWlpcGh5X3JlYWQgKGFkZHIsIFBIWV9BTkxQQVIsICZyZWcpKSB7CisJCXByaW50ZiAoIlBIWSBkdXBsZXggcmVhZCBmYWlsZWQsIGFzc3VtaW5nIGhhbGYgZHVwbGV4XG4iKTsKKwkJcmV0dXJuIChIQUxGKTsKKwl9CisKKwlpZiAoKHJlZyAmIChQSFlfQU5MUEFSXzEwRkQgfCBQSFlfQU5MUEFSX1RYRkQpKSAhPSAwKSB7CisJCXJldHVybiAoRlVMTCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChIQUxGKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTUlJIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9zb2Z0X2kyYy5jIGIvY29tbW9uL3NvZnRfaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3NzQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9zb2Z0X2kyYy5jCkBAIC0wLDAgKzEsNDE2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxLCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCBzdWJzdGFudGlhbGx5IGJ5IEdlcmFsZCBWYW4gQmFyZW4sIEN1c3RvbSBJREVBUywKKyAqIHZhbmJhcmVuQGNpZGVhcy5jb20uICBJdCB3YXMgaGVhdmlseSBpbmZsdWVuY2VkIGJ5IExpTW9uLCB3cml0dGVuIGJ5CisgKiBOZWlsIFJ1c3NlbGwuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2lmZGVmCUNPTkZJR19NUEM4MjYwCQkJLyogb25seSB2YWxpZCBmb3IgTVBDODI2MCAqLworI2luY2x1ZGUgPGlvcG9ydHMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGkyYy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfU09GVF9JMkMpCisKKy8qICNkZWZpbmUJREVCVUdfSTJDCSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIFJFVFJJRVMJCTAKKworCisjZGVmaW5lIEkyQ19BQ0sJCTAJCS8qIFBEX1NEQSBsZXZlbCB0byBhY2sgYSBieXRlICovCisjZGVmaW5lIEkyQ19OT0FDSwkxCQkvKiBQRF9TREEgbGV2ZWwgdG8gbm9hY2sgYSBieXRlICovCisKKworI2lmZGVmIERFQlVHX0kyQworI2RlZmluZSBQUklOVEQoZm10LGFyZ3MuLi4pCWRvIHsJXAorCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwlcCisJaWYgKGdkLT5oYXZlX2NvbnNvbGUpCQlcCisJCXByaW50ZiAoZm10ICwjI2FyZ3MpOwlcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIFBSSU5URChmbXQsYXJncy4uLikKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQgIHNlbmRfcmVzZXQJKHZvaWQpOworc3RhdGljIHZvaWQgIHNlbmRfc3RhcnQJKHZvaWQpOworc3RhdGljIHZvaWQgIHNlbmRfc3RvcAkodm9pZCk7CitzdGF0aWMgdm9pZCAgc2VuZF9hY2sJKGludCk7CitzdGF0aWMgaW50ICAgd3JpdGVfYnl0ZQkodWNoYXIgYnl0ZSk7CitzdGF0aWMgdWNoYXIgcmVhZF9ieXRlCShpbnQpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNlbmQgYSByZXNldCBzZXF1ZW5jZSBjb25zaXN0aW5nIG9mIDkgY2xvY2tzIHdpdGggdGhlIGRhdGEgc2lnbmFsIGhpZ2gKKyAqIHRvIGNsb2NrIGFueSBjb25mdXNlZCBkZXZpY2UgYmFjayBpbnRvIGFuIGlkbGUgc3RhdGUuICBBbHNvIHNlbmQgYQorICogPHN0b3A+IGF0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIGZvciBiZWx0cyAmIHN1c3BlbmRlcnMuCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfcmVzZXQodm9pZCkKK3sKKyNpZmRlZglDT05GSUdfTVBDODI2MAorCXZvbGF0aWxlIGlvcG9ydF90ICppb3AgPSBpb3BvcnRfYWRkcigoaW1tYXBfdCAqKUNGR19JTU1SLCBJMkNfUE9SVCk7CisjZW5kaWYKKyNpZmRlZglDT05GSUdfOHh4CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisjZW5kaWYKKwlpbnQgajsKKworCUkyQ19BQ1RJVkU7CisJSTJDX1NEQSgxKTsKKwlmb3IoaiA9IDA7IGogPCA5OyBqKyspIHsKKwkJSTJDX1NDTCgwKTsKKwkJSTJDX0RFTEFZOworCQlJMkNfREVMQVk7CisJCUkyQ19TQ0woMSk7CisJCUkyQ19ERUxBWTsKKwkJSTJDX0RFTEFZOworCX0KKwlzZW5kX3N0b3AoKTsKKwlJMkNfVFJJU1RBVEU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNUQVJUOiBIaWdoIC0+IExvdyBvbiBTREEgd2hpbGUgU0NMIGlzIEhpZ2gKKyAqLworc3RhdGljIHZvaWQgc2VuZF9zdGFydCh2b2lkKQoreworI2lmZGVmCUNPTkZJR19NUEM4MjYwCisJdm9sYXRpbGUgaW9wb3J0X3QgKmlvcCA9IGlvcG9ydF9hZGRyKChpbW1hcF90ICopQ0ZHX0lNTVIsIEkyQ19QT1JUKTsKKyNlbmRpZgorI2lmZGVmCUNPTkZJR184eHgKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKyNlbmRpZgorCisJSTJDX0RFTEFZOworCUkyQ19TREEoMSk7CisJSTJDX0FDVElWRTsKKwlJMkNfREVMQVk7CisJSTJDX1NDTCgxKTsKKwlJMkNfREVMQVk7CisJSTJDX1NEQSgwKTsKKwlJMkNfREVMQVk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNUT1A6IExvdyAtPiBIaWdoIG9uIFNEQSB3aGlsZSBTQ0wgaXMgSGlnaAorICovCitzdGF0aWMgdm9pZCBzZW5kX3N0b3Aodm9pZCkKK3sKKyNpZmRlZglDT05GSUdfTVBDODI2MAorCXZvbGF0aWxlIGlvcG9ydF90ICppb3AgPSBpb3BvcnRfYWRkcigoaW1tYXBfdCAqKUNGR19JTU1SLCBJMkNfUE9SVCk7CisjZW5kaWYKKyNpZmRlZglDT05GSUdfOHh4CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisjZW5kaWYKKworCUkyQ19TQ0woMCk7CisJSTJDX0RFTEFZOworCUkyQ19TREEoMCk7CisJSTJDX0FDVElWRTsKKwlJMkNfREVMQVk7CisJSTJDX1NDTCgxKTsKKwlJMkNfREVMQVk7CisJSTJDX1NEQSgxKTsKKwlJMkNfREVMQVk7CisJSTJDX1RSSVNUQVRFOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGFjayBzaG91bGQgYmUgSTJDX0FDSyBvciBJMkNfTk9BQ0sKKyAqLworc3RhdGljIHZvaWQgc2VuZF9hY2soaW50IGFjaykKK3sKKyNpZmRlZglDT05GSUdfTVBDODI2MAorCXZvbGF0aWxlIGlvcG9ydF90ICppb3AgPSBpb3BvcnRfYWRkcigoaW1tYXBfdCAqKUNGR19JTU1SLCBJMkNfUE9SVCk7CisjZW5kaWYKKyNpZmRlZglDT05GSUdfOHh4CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisjZW5kaWYKKworCUkyQ19BQ1RJVkU7CisJSTJDX1NDTCgwKTsKKwlJMkNfREVMQVk7CisKKwlJMkNfU0RBKGFjayk7CisKKwlJMkNfQUNUSVZFOworCUkyQ19ERUxBWTsKKwlJMkNfU0NMKDEpOworCUkyQ19ERUxBWTsKKwlJMkNfREVMQVk7CisJSTJDX1NDTCgwKTsKKwlJMkNfREVMQVk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VuZCA4IGJpdHMgYW5kIGxvb2sgZm9yIGFuIGFja25vd2xlZGdlbWVudC4KKyAqLworc3RhdGljIGludCB3cml0ZV9ieXRlKHVjaGFyIGRhdGEpCit7CisjaWZkZWYJQ09ORklHX01QQzgyNjAKKwl2b2xhdGlsZSBpb3BvcnRfdCAqaW9wID0gaW9wb3J0X2FkZHIoKGltbWFwX3QgKilDRkdfSU1NUiwgSTJDX1BPUlQpOworI2VuZGlmCisjaWZkZWYJQ09ORklHXzh4eAorCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworI2VuZGlmCisJaW50IGo7CisJaW50IG5hY2s7CisKKwlJMkNfQUNUSVZFOworCWZvcihqID0gMDsgaiA8IDg7IGorKykgeworCQlJMkNfU0NMKDApOworCQlJMkNfREVMQVk7CisJCUkyQ19TREEoZGF0YSAmIDB4ODApOworCQlJMkNfREVMQVk7CisJCUkyQ19TQ0woMSk7CisJCUkyQ19ERUxBWTsKKwkJSTJDX0RFTEFZOworCisJCWRhdGEgPDw9IDE7CisJfQorCisJLyoKKwkgKiBMb29rIGZvciBhbiA8QUNLPihuZWdhdGl2ZSBsb2dpYykgYW5kIHJldHVybiBpdC4KKwkgKi8KKwlJMkNfU0NMKDApOworCUkyQ19ERUxBWTsKKwlJMkNfU0RBKDEpOworCUkyQ19UUklTVEFURTsKKwlJMkNfREVMQVk7CisJSTJDX1NDTCgxKTsKKwlJMkNfREVMQVk7CisJSTJDX0RFTEFZOworCW5hY2sgPSBJMkNfUkVBRDsKKwlJMkNfU0NMKDApOworCUkyQ19ERUxBWTsKKwlJMkNfQUNUSVZFOworCisJcmV0dXJuKG5hY2spOwkvKiBub3QgYSBuYWNrIGlzIGFuIGFjayAqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlmIGFjayA9PSBJMkNfQUNLLCBBQ0sgdGhlIGJ5dGUgc28gY2FuIGNvbnRpbnVlIHJlYWRpbmcsIGVsc2UKKyAqIHNlbmQgSTJDX05PQUNLIHRvIGVuZCB0aGUgcmVhZC4KKyAqLworc3RhdGljIHVjaGFyIHJlYWRfYnl0ZShpbnQgYWNrKQoreworI2lmZGVmCUNPTkZJR19NUEM4MjYwCisJdm9sYXRpbGUgaW9wb3J0X3QgKmlvcCA9IGlvcG9ydF9hZGRyKChpbW1hcF90ICopQ0ZHX0lNTVIsIEkyQ19QT1JUKTsKKyNlbmRpZgorI2lmZGVmCUNPTkZJR184eHgKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKyNlbmRpZgorCWludCAgZGF0YTsKKwlpbnQgIGo7CisKKwkvKgorCSAqIFJlYWQgOCBiaXRzLCBNU0IgZmlyc3QuCisJICovCisJSTJDX1RSSVNUQVRFOworCWRhdGEgPSAwOworCWZvcihqID0gMDsgaiA8IDg7IGorKykgeworCQlJMkNfU0NMKDApOworCQlJMkNfREVMQVk7CisJCUkyQ19TQ0woMSk7CisJCUkyQ19ERUxBWTsKKwkJZGF0YSA8PD0gMTsKKwkJZGF0YSB8PSBJMkNfUkVBRDsKKwkJSTJDX0RFTEFZOworCX0KKwlzZW5kX2FjayhhY2spOworCisJcmV0dXJuKGRhdGEpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBQdWJsaWMgRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluaXRpYWxpemF0aW9uCisgKi8KK3ZvaWQgaTJjX2luaXQgKGludCBzcGVlZCwgaW50IHNsYXZlYWRkcikKK3sKKyNpZmRlZglDT05GSUdfOHh4CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisjZW5kaWYKKworI2lmZGVmCUkyQ19JTklUCisJSTJDX0lOSVQ7CisjZW5kaWYKKwkvKgorICAgICAgICAgKiBXQVJOSU5HOiBEbyBOT1Qgc2F2ZSBzcGVlZCBpbiBhIHN0YXRpYyB2YXJpYWJsZTogaWYgdGhlCisgICAgICAgICAqIEkyQyByb3V0aW5lcyBhcmUgY2FsbGVkIGJlZm9yZSBSQU0gaXMgaW5pdGlhbGl6ZWQgKHRvIHJlYWQKKyAgICAgICAgICogdGhlIERJTU0gU1BELCBmb3IgaW5zdGFuY2UpLCBSQU0gd29uJ3QgYmUgdXNhYmxlIGFuZCB5b3VyCisgICAgICAgICAqIHN5c3RlbSB3aWxsIGNyYXNoLgorCSAqLworCXNlbmRfcmVzZXQgKCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFByb2JlIHRvIHNlZSBpZiBhIGNoaXAgaXMgcHJlc2VudC4gIEFsc28gZ29vZCBmb3IgY2hlY2tpbmcgZm9yIHRoZQorICogY29tcGxldGlvbiBvZiBFRVBST00gd3JpdGVzIHNpbmNlIHRoZSBjaGlwIHN0b3BzIHJlc3BvbmRpbmcgdW50aWwKKyAqIHRoZSB3cml0ZSBjb21wbGV0ZXMgKHR5cGljYWxseSAxMG1TZWMpLgorICovCitpbnQgaTJjX3Byb2JlKHVjaGFyIGFkZHIpCit7CisJaW50IHJjOworCisJc2VuZF9zdGFydCgpOworCXJjID0gd3JpdGVfYnl0ZSAoKGFkZHIgPDwgMSkgfCAxKTsKKwlzZW5kX3N0b3AoKTsKKworCXJldHVybiAocmMgPyAxIDogMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlYWQgYnl0ZXMKKyAqLworaW50ICBpMmNfcmVhZCh1Y2hhciBjaGlwLCB1aW50IGFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBzaGlmdDsKKwlQUklOVEQoImkyY19yZWFkOiBjaGlwICUwMlggYWRkciAlMDJYIGFsZW4gJWQgYnVmZmVyICVwIGxlbiAlZFxuIiwKKwkJY2hpcCwgYWRkciwgYWxlbiwgYnVmZmVyLCBsZW4pOworCisjaWZkZWYgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVworCS8qCisJICogRUVQUk9NIGNoaXBzIHRoYXQgaW1wbGVtZW50ICJhZGRyZXNzIG92ZXJmbG93IiBhcmUgb25lcworCSAqIGxpa2UgQ2F0YWx5c3QgMjRXQzA0LzA4LzE2IHdoaWNoIGhhcyA5LzEwLzExIGJpdHMgb2YKKwkgKiBhZGRyZXNzIGFuZCB0aGUgZXh0cmEgYml0cyBlbmQgdXAgaW4gdGhlICJjaGlwIGFkZHJlc3MiCisJICogYml0IHNsb3RzLiBUaGlzIG1ha2VzIGEgMjRXQzA4ICgxS2J5dGUpIGNoaXAgbG9vayBsaWtlCisJICogZm91ciAyNTYgYnl0ZSBjaGlwcy4KKwkgKgorCSAqIE5vdGUgdGhhdCB3ZSBjb25zaWRlciB0aGUgbGVuZ3RoIG9mIHRoZSBhZGRyZXNzIGZpZWxkIHRvCisJICogc3RpbGwgYmUgb25lIGJ5dGUgYmVjYXVzZSB0aGUgZXh0cmEgYWRkcmVzcyBiaXRzIGFyZQorCSAqIGhpZGRlbiBpbiB0aGUgY2hpcCBhZGRyZXNzLgorCSAqLworCWNoaXAgfD0gKChhZGRyID4+IChhbGVuICogOCkpICYgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVyk7CisKKwlQUklOVEQoImkyY19yZWFkOiBmaXggYWRkcl9vdmVyZmxvdzogY2hpcCAlMDJYIGFkZHIgJTAyWFxuIiwKKwkJY2hpcCwgYWRkcik7CisjZW5kaWYKKworCS8qCisJICogRG8gdGhlIGFkZHJlc3NpbmcgcG9ydGlvbiBvZiBhIHdyaXRlIGN5Y2xlIHRvIHNldCB0aGUKKwkgKiBjaGlwJ3MgYWRkcmVzcyBwb2ludGVyLiAgSWYgdGhlIGFkZHJlc3MgbGVuZ3RoIGlzIHplcm8sCisJICogZG9uJ3QgZG8gdGhlIG5vcm1hbCB3cml0ZSBjeWNsZSB0byBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlciwKKwkgKiB0aGVyZSBpcyBubyBhZGRyZXNzIHBvaW50ZXIgaW4gdGhpcyBjaGlwLgorCSAqLworCXNlbmRfc3RhcnQoKTsKKwlpZihhbGVuID4gMCkgeworCQlpZih3cml0ZV9ieXRlKGNoaXAgPDwgMSkpIHsJLyogd3JpdGUgY3ljbGUgKi8KKwkJCXNlbmRfc3RvcCgpOworCQkJUFJJTlREKCJpMmNfcmVhZCwgbm8gY2hpcCByZXNwb25kZWQgJTAyWFxuIiwgY2hpcCk7CisJCQlyZXR1cm4oMSk7CisJCX0KKwkJc2hpZnQgPSAoYWxlbi0xKSAqIDg7CisJCXdoaWxlKGFsZW4tLSA+IDApIHsKKwkJCWlmKHdyaXRlX2J5dGUoYWRkciA+PiBzaGlmdCkpIHsKKwkJCQlQUklOVEQoImkyY19yZWFkLCBhZGRyZXNzIG5vdCA8QUNLPmVkXG4iKTsKKwkJCQlyZXR1cm4oMSk7CisJCQl9CisJCQlzaGlmdCAtPSA4OworCQl9CisJCXNlbmRfc3RvcCgpOwkvKiByZXBvcnRlZGx5IHNvbWUgY2hpcHMgbmVlZCBhIGZ1bGwgc3RvcCAqLworCQlzZW5kX3N0YXJ0KCk7CisJfQorCS8qCisJICogU2VuZCB0aGUgY2hpcCBhZGRyZXNzIGFnYWluLCB0aGlzIHRpbWUgZm9yIGEgcmVhZCBjeWNsZS4KKwkgKiBUaGVuIHJlYWQgdGhlIGRhdGEuICBPbiB0aGUgbGFzdCBieXRlLCB3ZSBkbyBhIE5BQ0sgaW5zdGVhZAorCSAqIG9mIGFuIEFDSyhsZW4gPT0gMCkgdG8gdGVybWluYXRlIHRoZSByZWFkLgorCSAqLworCXdyaXRlX2J5dGUoKGNoaXAgPDwgMSkgfCAxKTsJLyogcmVhZCBjeWNsZSAqLworCXdoaWxlKGxlbi0tID4gMCkgeworCQkqYnVmZmVyKysgPSByZWFkX2J5dGUobGVuID09IDApOworCX0KKwlzZW5kX3N0b3AoKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyaXRlIGJ5dGVzCisgKi8KK2ludCAgaTJjX3dyaXRlKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJaW50IHNoaWZ0LCBmYWlsdXJlcyA9IDA7CisKKwlQUklOVEQoImkyY193cml0ZTogY2hpcCAlMDJYIGFkZHIgJTAyWCBhbGVuICVkIGJ1ZmZlciAlcCBsZW4gJWRcbiIsCisJCWNoaXAsIGFkZHIsIGFsZW4sIGJ1ZmZlciwgbGVuKTsKKworCXNlbmRfc3RhcnQoKTsKKwlpZih3cml0ZV9ieXRlKGNoaXAgPDwgMSkpIHsJLyogd3JpdGUgY3ljbGUgKi8KKwkJc2VuZF9zdG9wKCk7CisJCVBSSU5URCgiaTJjX3dyaXRlLCBubyBjaGlwIHJlc3BvbmRlZCAlMDJYXG4iLCBjaGlwKTsKKwkJcmV0dXJuKDEpOworCX0KKwlzaGlmdCA9IChhbGVuLTEpICogODsKKwl3aGlsZShhbGVuLS0gPiAwKSB7CisJCWlmKHdyaXRlX2J5dGUoYWRkciA+PiBzaGlmdCkpIHsKKwkJCVBSSU5URCgiaTJjX3dyaXRlLCBhZGRyZXNzIG5vdCA8QUNLPmVkXG4iKTsKKwkJCXJldHVybigxKTsKKwkJfQorCQlzaGlmdCAtPSA4OworCX0KKworCXdoaWxlKGxlbi0tID4gMCkgeworCQlpZih3cml0ZV9ieXRlKCpidWZmZXIrKykpIHsKKwkJCWZhaWx1cmVzKys7CisJCX0KKwl9CisJc2VuZF9zdG9wKCk7CisJcmV0dXJuKGZhaWx1cmVzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVhZCBhIHJlZ2lzdGVyCisgKi8KK3VjaGFyIGkyY19yZWdfcmVhZCh1Y2hhciBpMmNfYWRkciwgdWNoYXIgcmVnKQoreworCWNoYXIgYnVmOworCisJaTJjX3JlYWQoaTJjX2FkZHIsIHJlZywgMSwgJmJ1ZiwgMSk7CisKKwlyZXR1cm4oYnVmKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV3JpdGUgYSByZWdpc3RlcgorICovCit2b2lkIGkyY19yZWdfd3JpdGUodWNoYXIgaTJjX2FkZHIsIHVjaGFyIHJlZywgdWNoYXIgdmFsKQoreworCWkyY193cml0ZShpMmNfYWRkciwgcmVnLCAxLCAmdmFsLCAxKTsKK30KKworCisjZW5kaWYJLyogQ09ORklHX1NPRlRfSTJDICovCmRpZmYgLS1naXQgYS9jcHUvYXJtNzIwdC9NYWtlZmlsZSBiL2NwdS9hcm03MjB0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOTUwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtNzIwdC9NYWtlZmlsZQpAQCAtMCwwICsxLDQzIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMAorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gbGliJChDUFUpLmEKKworU1RBUlQJPSBzdGFydC5vCitPQkpTCT0gc2VyaWFsLm8gaW50ZXJydXB0cy5vIGNwdS5vCisKK2FsbDoJLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgY3J2ICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisuZGVwZW5kOglNYWtlZmlsZSAkKFNUQVJUOi5vPS5TKSAkKE9CSlM6Lm89LmMpCisJCSQoQ0MpIC1NICQoQ0ZMQUdTKSAkKFNUQVJUOi5vPS5TKSAkKE9CSlM6Lm89LmMpID4gJEAKKworc2luY2x1ZGUgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9jcHUvYXJtNzIwdC9pbnRlcnJ1cHRzLmMgYi9jcHUvYXJtNzIwdC9pbnRlcnJ1cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3ODdmZQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9hcm03MjB0L2ludGVycnVwdHMuYwpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFsZXggWnVlcGtlIDxhenVAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNscHM3MTExLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvYy1hcm12L3B0cmFjZS5oPgorCitleHRlcm4gdm9pZCByZXNldF9jcHUodWxvbmcgYWRkcik7CisKKy8qIHdlIGFsd2F5cyBjb3VudCBkb3duIHRoZSBtYXguICovCisjZGVmaW5lIFRJTUVSX0xPQURfVkFMIDB4ZmZmZgorCisvKiBtYWNybyB0byByZWFkIHRoZSAxNiBiaXQgdGltZXIgKi8KKyNkZWZpbmUgUkVBRF9USU1FUiAoSU9fVEMxRCAmIDB4ZmZmZikKKworI2lmZGVmIENPTkZJR19VU0VfSVJRCisvKiBlbmFibGUgSVJRL0ZJUSBpbnRlcnJ1cHRzICovCit2b2lkIGVuYWJsZV9pbnRlcnJ1cHRzICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJzICUwLCBjcHNyXG4iCisJCQkgICAgICJiaWMgJTAsICUwLCAjMHg4MFxuIgorCQkJICAgICAibXNyIGNwc3JfYywgJTAiCisJCQkgICAgIDogIj1yIiAodGVtcCkKKwkJCSAgICAgOgorCQkJICAgICA6ICJtZW1vcnkiKTsKK30KKworCisvKgorICogZGlzYWJsZSBJUlEvRklRIGludGVycnVwdHMKKyAqIHJldHVybnMgdHJ1ZSBpZiBpbnRlcnJ1cHRzIGhhZCBiZWVuIGVuYWJsZWQgYmVmb3JlIHdlIGRpc2FibGVkIHRoZW0KKyAqLworaW50IGRpc2FibGVfaW50ZXJydXB0cyAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG9sZCx0ZW1wOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcnMgJTAsIGNwc3JcbiIKKwkJCSAgICAgIm9yciAlMSwgJTAsICMweDgwXG4iCisJCQkgICAgICJtc3IgY3Bzcl9jLCAlMSIKKwkJCSAgICAgOiAiPXIiIChvbGQpLCAiPXIiICh0ZW1wKQorCQkJICAgICA6CisJCQkgICAgIDogIm1lbW9yeSIpOworCXJldHVybiAob2xkICYgMHg4MCkgPT0gMDsKK30KKyNlbHNlCit2b2lkIGVuYWJsZV9pbnRlcnJ1cHRzICh2b2lkKQoreworCXJldHVybjsKK30KK2ludCBkaXNhYmxlX2ludGVycnVwdHMgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisKK3ZvaWQgYmFkX21vZGUgKHZvaWQpCit7CisJcGFuaWMgKCJSZXNldHRpbmcgQ1BVIC4uLlxuIik7CisJcmVzZXRfY3B1ICgwKTsKK30KKwordm9pZCBzaG93X3JlZ3MgKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY29uc3QgY2hhciAqcHJvY2Vzc29yX21vZGVzW10gPQorCQkJeyAiVVNFUl8yNiIsICJGSVFfMjYiLCAiSVJRXzI2IiwgIlNWQ18yNiIsICJVSzRfMjYiLCAiVUs1XzI2IiwKKyJVSzZfMjYiLCAiVUs3XzI2IiwKKwkJIlVLOF8yNiIsICJVSzlfMjYiLCAiVUsxMF8yNiIsICJVSzExXzI2IiwgIlVLMTJfMjYiLCAiVUsxM18yNiIsCisJCQkJIlVLMTRfMjYiLCAiVUsxNV8yNiIsCisJCSJVU0VSXzMyIiwgIkZJUV8zMiIsICJJUlFfMzIiLCAiU1ZDXzMyIiwgIlVLNF8zMiIsICJVSzVfMzIiLAorCQkJCSJVSzZfMzIiLCAiQUJUXzMyIiwKKwkJIlVLOF8zMiIsICJVSzlfMzIiLCAiVUsxMF8zMiIsICJVTkRfMzIiLCAiVUsxMl8zMiIsICJVSzEzXzMyIiwKKwkJCQkiVUsxNF8zMiIsICJTWVNfMzIiCisJfTsKKworCWZsYWdzID0gY29uZGl0aW9uX2NvZGVzIChyZWdzKTsKKworCXByaW50ZiAoInBjIDogWzwlMDhseD5dICAgIGxyIDogWzwlMDhseD5dXG4iCisJCQkic3AgOiAlMDhseCAgaXAgOiAlMDhseCAgZnAgOiAlMDhseFxuIiwKKwkJCWluc3RydWN0aW9uX3BvaW50ZXIgKHJlZ3MpLAorCQkJcmVncy0+QVJNX2xyLCByZWdzLT5BUk1fc3AsIHJlZ3MtPkFSTV9pcCwgcmVncy0+QVJNX2ZwKTsKKwlwcmludGYgKCJyMTA6ICUwOGx4ICByOSA6ICUwOGx4ICByOCA6ICUwOGx4XG4iLAorCQkJcmVncy0+QVJNX3IxMCwgcmVncy0+QVJNX3I5LCByZWdzLT5BUk1fcjgpOworCXByaW50ZiAoInI3IDogJTA4bHggIHI2IDogJTA4bHggIHI1IDogJTA4bHggIHI0IDogJTA4bHhcbiIsCisJCQlyZWdzLT5BUk1fcjcsIHJlZ3MtPkFSTV9yNiwgcmVncy0+QVJNX3I1LCByZWdzLT5BUk1fcjQpOworCXByaW50ZiAoInIzIDogJTA4bHggIHIyIDogJTA4bHggIHIxIDogJTA4bHggIHIwIDogJTA4bHhcbiIsCisJCQlyZWdzLT5BUk1fcjMsIHJlZ3MtPkFSTV9yMiwgcmVncy0+QVJNX3IxLCByZWdzLT5BUk1fcjApOworCXByaW50ZiAoIkZsYWdzOiAlYyVjJWMlYyIsCisJCQlmbGFncyAmIENDX05fQklUID8gJ04nIDogJ24nLAorCQkJZmxhZ3MgJiBDQ19aX0JJVCA/ICdaJyA6ICd6JywKKwkJCWZsYWdzICYgQ0NfQ19CSVQgPyAnQycgOiAnYycsIGZsYWdzICYgQ0NfVl9CSVQgPyAnVicgOiAndicpOworCXByaW50ZiAoIiAgSVJRcyAlcyAgRklRcyAlcyAgTW9kZSAlcyVzXG4iLAorCQkJaW50ZXJydXB0c19lbmFibGVkIChyZWdzKSA/ICJvbiIgOiAib2ZmIiwKKwkJCWZhc3RfaW50ZXJydXB0c19lbmFibGVkIChyZWdzKSA/ICJvbiIgOiAib2ZmIiwKKwkJCXByb2Nlc3Nvcl9tb2Rlc1twcm9jZXNzb3JfbW9kZSAocmVncyldLAorCQkJdGh1bWJfbW9kZSAocmVncykgPyAiIChUKSIgOiAiIik7Cit9CisKK3ZvaWQgZG9fdW5kZWZpbmVkX2luc3RydWN0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKwlwcmludGYgKCJ1bmRlZmluZWQgaW5zdHJ1Y3Rpb25cbiIpOworCXNob3dfcmVncyAocHRfcmVncyk7CisJYmFkX21vZGUgKCk7Cit9CisKK3ZvaWQgZG9fc29mdHdhcmVfaW50ZXJydXB0IChzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKwlwcmludGYgKCJzb2Z0d2FyZSBpbnRlcnJ1cHRcbiIpOworCXNob3dfcmVncyAocHRfcmVncyk7CisJYmFkX21vZGUgKCk7Cit9CisKK3ZvaWQgZG9fcHJlZmV0Y2hfYWJvcnQgKHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCXByaW50ZiAoInByZWZldGNoIGFib3J0XG4iKTsKKwlzaG93X3JlZ3MgKHB0X3JlZ3MpOworCWJhZF9tb2RlICgpOworfQorCit2b2lkIGRvX2RhdGFfYWJvcnQgKHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCXByaW50ZiAoImRhdGEgYWJvcnRcbiIpOworCXNob3dfcmVncyAocHRfcmVncyk7CisJYmFkX21vZGUgKCk7Cit9CisKK3ZvaWQgZG9fbm90X3VzZWQgKHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCXByaW50ZiAoIm5vdCB1c2VkXG4iKTsKKwlzaG93X3JlZ3MgKHB0X3JlZ3MpOworCWJhZF9tb2RlICgpOworfQorCit2b2lkIGRvX2ZpcSAoc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJcHJpbnRmICgiZmFzdCBpbnRlcnJ1cHQgcmVxdWVzdFxuIik7CisJc2hvd19yZWdzIChwdF9yZWdzKTsKKwliYWRfbW9kZSAoKTsKK30KKwordm9pZCBkb19pcnEgKHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCXByaW50ZiAoImludGVycnVwdCByZXF1ZXN0XG4iKTsKKwlzaG93X3JlZ3MgKHB0X3JlZ3MpOworCWJhZF9tb2RlICgpOworfQorCitzdGF0aWMgdWxvbmcgdGltZXN0YW1wOworc3RhdGljIHVsb25nIGxhc3RkZWM7CisKK2ludCBpbnRlcnJ1cHRfaW5pdCAodm9pZCkKK3sKKwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJSU9fSU5UTVIxID0gMDsKKworCS8qIG9wZXJhdGUgdGltZXIgMSBpbiBwcmVzY2FsZSBtb2RlICovCisJSU9fU1lTQ09OMSB8PSBTWVNDT04xX1RDMU07CisKKwkvKiBzZWxlY3QgMmtIeiBjbG9jayBzb3VyY2UgZm9yIHRpbWVyIDEgKi8KKwlJT19TWVNDT04xICY9IH5TWVNDT04xX1RDMVM7CisKKwkvKiBzZXQgdGltZXIgMSBjb3VudGVyICovCisJbGFzdGRlYyA9IElPX1RDMUQgPSBUSU1FUl9MT0FEX1ZBTDsKKwl0aW1lc3RhbXAgPSAwOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIHRpbWVyIHdpdGhvdXQgaW50ZXJydXB0cworICovCisKK3ZvaWQgcmVzZXRfdGltZXIgKHZvaWQpCit7CisJcmVzZXRfdGltZXJfbWFza2VkICgpOworfQorCit1bG9uZyBnZXRfdGltZXIgKHVsb25nIGJhc2UpCit7CisJcmV0dXJuIGdldF90aW1lcl9tYXNrZWQgKCkgLSBiYXNlOworfQorCit2b2lkIHNldF90aW1lciAodWxvbmcgdCkKK3sKKwl0aW1lc3RhbXAgPSB0OworfQorCit2b2lkIHVkZWxheSAodW5zaWduZWQgbG9uZyB1c2VjKQoreworCXVsb25nIHRtbzsKKworCXRtbyA9IHVzZWMgLyAxMDAwOworCXRtbyAqPSBDRkdfSFo7CisJdG1vIC89IDEwMDA7CisKKwl0bW8gKz0gZ2V0X3RpbWVyICgwKTsKKworCXdoaWxlIChnZXRfdGltZXJfbWFza2VkICgpIDwgdG1vKQorCQkvKk5PUCovOworfQorCit2b2lkIHJlc2V0X3RpbWVyX21hc2tlZCAodm9pZCkKK3sKKwkvKiByZXNldCB0aW1lICovCisJbGFzdGRlYyA9IFJFQURfVElNRVI7CisJdGltZXN0YW1wID0gMDsKK30KKwordWxvbmcgZ2V0X3RpbWVyX21hc2tlZCAodm9pZCkKK3sKKwl1bG9uZyBub3cgPSBSRUFEX1RJTUVSOworCisJaWYgKGxhc3RkZWMgPj0gbm93KSB7CisJCS8qIG5vcm1hbCBtb2RlICovCisJCXRpbWVzdGFtcCArPSBsYXN0ZGVjIC0gbm93OworCX0gZWxzZSB7CisJCS8qIHdlIGhhdmUgYW4gb3ZlcmZsb3cgLi4uICovCisJCXRpbWVzdGFtcCArPSBsYXN0ZGVjICsgVElNRVJfTE9BRF9WQUwgLSBub3c7CisJfQorCWxhc3RkZWMgPSBub3c7CisKKwlyZXR1cm4gdGltZXN0YW1wOworfQorCit2b2lkIHVkZWxheV9tYXNrZWQgKHVuc2lnbmVkIGxvbmcgdXNlYykKK3sKKwl1bG9uZyB0bW87CisKKwl0bW8gPSB1c2VjIC8gMTAwMDsKKwl0bW8gKj0gQ0ZHX0haOworCXRtbyAvPSAxMDAwOworCisJcmVzZXRfdGltZXJfbWFza2VkICgpOworCisJd2hpbGUgKGdldF90aW1lcl9tYXNrZWQgKCkgPCB0bW8pCisJCS8qTk9QKi87Cit9CmRpZmYgLS1naXQgYS9jcHUvYXJtOTIwdC9NYWtlZmlsZSBiL2NwdS9hcm05MjB0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZWM4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTIwdC9NYWtlZmlsZQpAQCAtMCwwICsxLDQzIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gbGliJChDUFUpLmEKKworU1RBUlQJPSBzdGFydC5vCitPQkpTCT0gc2VyaWFsLm8gaW50ZXJydXB0cy5vIGNwdS5vIHNwZWVkLm8KKworYWxsOgkuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSBjcnYgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5kZXBlbmQ6CU1ha2VmaWxlICQoU1RBUlQ6Lm89LlMpICQoT0JKUzoubz0uYykKKwkJJChDQykgLU0gJChDRkxBR1MpICQoU1RBUlQ6Lm89LlMpICQoT0JKUzoubz0uYykgPiAkQAorCitzaW5jbHVkZSAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2ludGVycnVwdHMuYyBiL2NwdS9hcm05MjB0L2ludGVycnVwdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjNjY2JkCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyMHQvaW50ZXJydXB0cy5jCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogQWxleCBadWVwa2UgPGF6dUBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXJtOTIwdC5oPgorI2lmIGRlZmluZWQoQ09ORklHX1MzQzI0MDApCisjaW5jbHVkZSA8czNjMjQwMC5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfUzNDMjQxMCkKKyNpbmNsdWRlIDxzM2MyNDEwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9wcm9jLWFybXYvcHRyYWNlLmg+CisKK2V4dGVybiB2b2lkIHJlc2V0X2NwdSh1bG9uZyBhZGRyKTsKK2ludCB0aW1lcl9sb2FkX3ZhbCA9IDA7CisKKy8qIG1hY3JvIHRvIHJlYWQgdGhlIDE2IGJpdCB0aW1lciAqLworI2RlZmluZSBSRUFEX1RJTUVSIChyVENOVE80ICYgMHhmZmZmKQorCisjaWZkZWYgQ09ORklHX1VTRV9JUlEKKy8qIGVuYWJsZSBJUlEgaW50ZXJydXB0cyAqLwordm9pZCBlbmFibGVfaW50ZXJydXB0cyAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1ycyAlMCwgY3BzclxuIgorCQkJICAgICAiYmljICUwLCAlMCwgIzB4ODBcbiIKKwkJCSAgICAgIm1zciBjcHNyX2MsICUwIgorCQkJICAgICA6ICI9ciIgKHRlbXApCisJCQkgICAgIDoKKwkJCSAgICAgOiAibWVtb3J5Iik7Cit9CisKKworLyoKKyAqIGRpc2FibGUgSVJRL0ZJUSBpbnRlcnJ1cHRzCisgKiByZXR1cm5zIHRydWUgaWYgaW50ZXJydXB0cyBoYWQgYmVlbiBlbmFibGVkIGJlZm9yZSB3ZSBkaXNhYmxlZCB0aGVtCisgKi8KK2ludCBkaXNhYmxlX2ludGVycnVwdHMgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBvbGQsdGVtcDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJzICUwLCBjcHNyXG4iCisJCQkgICAgICJvcnIgJTEsICUwLCAjMHhjMFxuIgorCQkJICAgICAibXNyIGNwc3JfYywgJTEiCisJCQkgICAgIDogIj1yIiAob2xkKSwgIj1yIiAodGVtcCkKKwkJCSAgICAgOgorCQkJICAgICA6ICJtZW1vcnkiKTsKKwlyZXR1cm4gKG9sZCAmIDB4ODApID09IDA7Cit9CisjZWxzZQordm9pZCBlbmFibGVfaW50ZXJydXB0cyAodm9pZCkKK3sKKwlyZXR1cm47Cit9CitpbnQgZGlzYWJsZV9pbnRlcnJ1cHRzICh2b2lkKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKworCit2b2lkIGJhZF9tb2RlICh2b2lkKQoreworCXBhbmljICgiUmVzZXR0aW5nIENQVSAuLi5cbiIpOworCXJlc2V0X2NwdSAoMCk7Cit9CisKK3ZvaWQgc2hvd19yZWdzIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNvbnN0IGNoYXIgKnByb2Nlc3Nvcl9tb2Rlc1tdID0geworCSJVU0VSXzI2IiwJIkZJUV8yNiIsCSJJUlFfMjYiLAkiU1ZDXzI2IiwKKwkiVUs0XzI2IiwJIlVLNV8yNiIsCSJVSzZfMjYiLAkiVUs3XzI2IiwKKwkiVUs4XzI2IiwJIlVLOV8yNiIsCSJVSzEwXzI2IiwJIlVLMTFfMjYiLAorCSJVSzEyXzI2IiwJIlVLMTNfMjYiLAkiVUsxNF8yNiIsCSJVSzE1XzI2IiwKKwkiVVNFUl8zMiIsCSJGSVFfMzIiLAkiSVJRXzMyIiwJIlNWQ18zMiIsCisJIlVLNF8zMiIsCSJVSzVfMzIiLAkiVUs2XzMyIiwJIkFCVF8zMiIsCisJIlVLOF8zMiIsCSJVSzlfMzIiLAkiVUsxMF8zMiIsCSJVTkRfMzIiLAorCSJVSzEyXzMyIiwJIlVLMTNfMzIiLAkiVUsxNF8zMiIsCSJTWVNfMzIiLAorCX07CisKKwlmbGFncyA9IGNvbmRpdGlvbl9jb2RlcyAocmVncyk7CisKKwlwcmludGYgKCJwYyA6IFs8JTA4bHg+XSAgICBsciA6IFs8JTA4bHg+XVxuIgorCQkic3AgOiAlMDhseCAgaXAgOiAlMDhseCAgZnAgOiAlMDhseFxuIiwKKwkJaW5zdHJ1Y3Rpb25fcG9pbnRlciAocmVncyksCisJCXJlZ3MtPkFSTV9sciwgcmVncy0+QVJNX3NwLCByZWdzLT5BUk1faXAsIHJlZ3MtPkFSTV9mcCk7CisJcHJpbnRmICgicjEwOiAlMDhseCAgcjkgOiAlMDhseCAgcjggOiAlMDhseFxuIiwKKwkJcmVncy0+QVJNX3IxMCwgcmVncy0+QVJNX3I5LCByZWdzLT5BUk1fcjgpOworCXByaW50ZiAoInI3IDogJTA4bHggIHI2IDogJTA4bHggIHI1IDogJTA4bHggIHI0IDogJTA4bHhcbiIsCisJCXJlZ3MtPkFSTV9yNywgcmVncy0+QVJNX3I2LCByZWdzLT5BUk1fcjUsIHJlZ3MtPkFSTV9yNCk7CisJcHJpbnRmICgicjMgOiAlMDhseCAgcjIgOiAlMDhseCAgcjEgOiAlMDhseCAgcjAgOiAlMDhseFxuIiwKKwkJcmVncy0+QVJNX3IzLCByZWdzLT5BUk1fcjIsIHJlZ3MtPkFSTV9yMSwgcmVncy0+QVJNX3IwKTsKKwlwcmludGYgKCJGbGFnczogJWMlYyVjJWMiLAorCQlmbGFncyAmIENDX05fQklUID8gJ04nIDogJ24nLAorCQlmbGFncyAmIENDX1pfQklUID8gJ1onIDogJ3onLAorCQlmbGFncyAmIENDX0NfQklUID8gJ0MnIDogJ2MnLCBmbGFncyAmIENDX1ZfQklUID8gJ1YnIDogJ3YnKTsKKwlwcmludGYgKCIgIElSUXMgJXMgIEZJUXMgJXMgIE1vZGUgJXMlc1xuIiwKKwkJaW50ZXJydXB0c19lbmFibGVkIChyZWdzKSA/ICJvbiIgOiAib2ZmIiwKKwkJZmFzdF9pbnRlcnJ1cHRzX2VuYWJsZWQgKHJlZ3MpID8gIm9uIiA6ICJvZmYiLAorCQlwcm9jZXNzb3JfbW9kZXNbcHJvY2Vzc29yX21vZGUgKHJlZ3MpXSwKKwkJdGh1bWJfbW9kZSAocmVncykgPyAiIChUKSIgOiAiIik7Cit9CisKK3ZvaWQgZG9fdW5kZWZpbmVkX2luc3RydWN0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKwlwcmludGYgKCJ1bmRlZmluZWQgaW5zdHJ1Y3Rpb25cbiIpOworCXNob3dfcmVncyAocHRfcmVncyk7CisJYmFkX21vZGUgKCk7Cit9CisKK3ZvaWQgZG9fc29mdHdhcmVfaW50ZXJydXB0IChzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKwlwcmludGYgKCJzb2Z0d2FyZSBpbnRlcnJ1cHRcbiIpOworCXNob3dfcmVncyAocHRfcmVncyk7CisJYmFkX21vZGUgKCk7Cit9CisKK3ZvaWQgZG9fcHJlZmV0Y2hfYWJvcnQgKHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCXByaW50ZiAoInByZWZldGNoIGFib3J0XG4iKTsKKwlzaG93X3JlZ3MgKHB0X3JlZ3MpOworCWJhZF9tb2RlICgpOworfQorCit2b2lkIGRvX2RhdGFfYWJvcnQgKHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCXByaW50ZiAoImRhdGEgYWJvcnRcbiIpOworCXNob3dfcmVncyAocHRfcmVncyk7CisJYmFkX21vZGUgKCk7Cit9CisKK3ZvaWQgZG9fbm90X3VzZWQgKHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCXByaW50ZiAoIm5vdCB1c2VkXG4iKTsKKwlzaG93X3JlZ3MgKHB0X3JlZ3MpOworCWJhZF9tb2RlICgpOworfQorCit2b2lkIGRvX2ZpcSAoc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJcHJpbnRmICgiZmFzdCBpbnRlcnJ1cHQgcmVxdWVzdFxuIik7CisJc2hvd19yZWdzIChwdF9yZWdzKTsKKwliYWRfbW9kZSAoKTsKK30KKwordm9pZCBkb19pcnEgKHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCXByaW50ZiAoImludGVycnVwdCByZXF1ZXN0XG4iKTsKKwlzaG93X3JlZ3MgKHB0X3JlZ3MpOworCWJhZF9tb2RlICgpOworfQorCitzdGF0aWMgdWxvbmcgdGltZXN0YW1wOworc3RhdGljIHVsb25nIGxhc3RkZWM7CisKK2ludCBpbnRlcnJ1cHRfaW5pdCAodm9pZCkKK3sKKwkvKiB1c2UgUFdNIFRpbWVyIDQgYmVjYXVzZSBpdCBoYXMgbm8gb3V0cHV0ICovCisJLyogcHJlc2NhbGVyIGZvciBUaW1lciA0IGlzIDE2ICovCisJclRDRkcwID0gMHgwZjAwOworCWlmICh0aW1lcl9sb2FkX3ZhbCA9PSAwKQorCXsKKwkJLyoKKwkJICogZm9yIDEwIG1zIGNsb2NrIHBlcmlvZCBAIFBDTEsgd2l0aCA0IGJpdCBkaXZpZGVyID0gMS8yCisJCSAqIChkZWZhdWx0KSBhbmQgcHJlc2NhbGVyID0gMTYuIFNob3VsZCBiZSAxMDM5MAorCQkgKiBAMzMuMjVNSHogYW5kIDE1NjI1IEAgNTAgTUh6CisJCSAqLworCQl0aW1lcl9sb2FkX3ZhbCA9IGdldF9QQ0xLKCkvKDIgKiAxNiAqIDEwMCk7CisJfQorCS8qIGxvYWQgdmFsdWUgZm9yIDEwIG1zIHRpbWVvdXQgKi8KKwlsYXN0ZGVjID0gclRDTlRCNCA9IHRpbWVyX2xvYWRfdmFsOworCS8qIGF1dG8gbG9hZCwgbWFudWFsIHVwZGF0ZSBvZiBUaW1lciA0ICovCisJclRDT04gPSAweDYwMDAwMDsKKwkvKiBhdXRvIGxvYWQsIHN0YXJ0IFRpbWVyIDQgKi8KKwlyVENPTiA9IDB4NTAwMDAwOworCXRpbWVzdGFtcCA9IDA7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogdGltZXIgd2l0aG91dCBpbnRlcnJ1cHRzCisgKi8KKwordm9pZCByZXNldF90aW1lciAodm9pZCkKK3sKKwlyZXNldF90aW1lcl9tYXNrZWQgKCk7Cit9CisKK3Vsb25nIGdldF90aW1lciAodWxvbmcgYmFzZSkKK3sKKwlyZXR1cm4gZ2V0X3RpbWVyX21hc2tlZCAoKSAtIGJhc2U7Cit9CisKK3ZvaWQgc2V0X3RpbWVyICh1bG9uZyB0KQoreworCXRpbWVzdGFtcCA9IHQ7Cit9CisKK3ZvaWQgdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWMpCit7CisJdWxvbmcgdG1vOworCisJdG1vID0gdXNlYyAvIDEwMDA7CisJdG1vICo9ICh0aW1lcl9sb2FkX3ZhbCAqIDEwMCk7CisJdG1vIC89IDEwMDA7CisKKwl0bW8gKz0gZ2V0X3RpbWVyICgwKTsKKworCXdoaWxlIChnZXRfdGltZXJfbWFza2VkICgpIDwgdG1vKQorCQkvKk5PUCovOworfQorCit2b2lkIHJlc2V0X3RpbWVyX21hc2tlZCAodm9pZCkKK3sKKwkvKiByZXNldCB0aW1lICovCisJbGFzdGRlYyA9IFJFQURfVElNRVI7CisJdGltZXN0YW1wID0gMDsKK30KKwordWxvbmcgZ2V0X3RpbWVyX21hc2tlZCAodm9pZCkKK3sKKwl1bG9uZyBub3cgPSBSRUFEX1RJTUVSOworCisJaWYgKGxhc3RkZWMgPj0gbm93KSB7CisJCS8qIG5vcm1hbCBtb2RlICovCisJCXRpbWVzdGFtcCArPSBsYXN0ZGVjIC0gbm93OworCX0gZWxzZSB7CisJCS8qIHdlIGhhdmUgYW4gb3ZlcmZsb3cgLi4uICovCisJCXRpbWVzdGFtcCArPSBsYXN0ZGVjICsgdGltZXJfbG9hZF92YWwgLSBub3c7CisJfQorCWxhc3RkZWMgPSBub3c7CisKKwlyZXR1cm4gdGltZXN0YW1wOworfQorCit2b2lkIHVkZWxheV9tYXNrZWQgKHVuc2lnbmVkIGxvbmcgdXNlYykKK3sKKwl1bG9uZyB0bW87CisKKwl0bW8gPSB1c2VjIC8gMTAwMDsKKwl0bW8gKj0gKHRpbWVyX2xvYWRfdmFsICogMTAwKTsKKwl0bW8gLz0gMTAwMDsKKworCXJlc2V0X3RpbWVyX21hc2tlZCAoKTsKKworCXdoaWxlIChnZXRfdGltZXJfbWFza2VkICgpIDwgdG1vKQorCQkvKk5PUCovOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gUG93ZXJQQyBjb2RlIChyZWFkIHRpbWViYXNlIGFzIGxvbmcgbG9uZykuCisgKiBPbiBBUk0gaXQganVzdCByZXR1cm5zIHRoZSB0aW1lciB2YWx1ZS4KKyAqLwordW5zaWduZWQgbG9uZyBsb25nIGdldF90aWNrcyh2b2lkKQoreworCXJldHVybiBnZXRfdGltZXIoMCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcml2ZWQgZnJvbSBQb3dlclBDIGNvZGUgKHRpbWViYXNlIGNsb2NrIGZyZXF1ZW5jeSkuCisgKiBPbiBBUk0gaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpbWVyIHRpY2tzIHBlciBzZWNvbmQuCisgKi8KK3Vsb25nIGdldF90YmNsayAodm9pZCkKK3sKKwl1bG9uZyB0YmNsazsKKworI2lmIGRlZmluZWQoQ09ORklHX1NNREsyNDAwKSB8fCBkZWZpbmVkKENPTkZJR19UUkFCKQorCXRiY2xrID0gdGltZXJfbG9hZF92YWwgKiAxMDA7CisjZWxpZiBkZWZpbmVkKENPTkZJR19TTURLMjQxMCkKKwl0YmNsayA9IENGR19IWjsKKyNlbmRpZgorCisJcmV0dXJuIHRiY2xrOworfQpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyMHQvc2VyaWFsLmMgYi9jcHUvYXJtOTIwdC9zZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzJlNzNiCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyMHQvc2VyaWFsLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpZiBkZWZpbmVkKENPTkZJR19TM0MyNDAwKSB8fCBkZWZpbmVkKENPTkZJR19UUkFCKQorI2luY2x1ZGUgPHMzYzI0MDAuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX1MzQzI0MTApCisjaW5jbHVkZSA8czNjMjQxMC5oPgorI2VuZGlmCisKKwordm9pZCBzZXJpYWxfc2V0YnJnICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJaW50IGk7CisJdW5zaWduZWQgaW50IHJlZyA9IDA7CisKKwkvKiB2YWx1ZSBpcyBjYWxjdWxhdGVkIHNvIDogKGludCkoUENMSy8xNi4vYmF1ZHJhdGUpIC0xICovCisJcmVnID0gZ2V0X1BDTEsoKSAvICgxNiAqIGdkLT5iYXVkcmF0ZSkgLSAxOworCisjaWZkZWYgQ09ORklHX1NFUklBTDEKKwkvKiBGSUZPIGVuYWJsZSwgVHgvUnggRklGTyBjbGVhciAqLworCXJVRkNPTjAgPSAweDA3OworCXJVTUNPTjAgPSAweDA7CisJLyogTm9ybWFsLE5vIHBhcml0eSwxIHN0b3AsOCBiaXQgKi8KKwlyVUxDT04wID0gMHgzOworCS8qCisJICogdHg9bGV2ZWwscng9ZWRnZSxkaXNhYmxlIHRpbWVvdXQgaW50LixlbmFibGUgcnggZXJyb3IgaW50LiwKKwkgKiBub3JtYWwsaW50ZXJydXB0IG9yIHBvbGxpbmcKKwkgKi8KKwlyVUNPTjAgPSAweDI0NTsKKwlyVUJSRElWMCA9IHJlZzsKKworI2lmZGVmIENPTkZJR19IV0ZMT1cKKwlyVU1DT04wID0gMHgxOyAvKiBSVFMgdXAgKi8KKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKyk7CisjZWxpZiBDT05GSUdfU0VSSUFMMgorIyBpZiBkZWZpbmVkKENPTkZJR19UUkFCKQorIyAgI2Vycm9yICJUUkFCIHN1cHBvcnRzIG9ubHkgQ09ORklHX1NFUklBTDEiCisjIGVuZGlmCisJLyogRklGTyBlbmFibGUsIFR4L1J4IEZJRk8gY2xlYXIgKi8KKwlyVUZDT04xID0gMHgwNjsKKwlyVU1DT04xID0gMHgwOworCS8qIE5vcm1hbCxObyBwYXJpdHksMSBzdG9wLDggYml0ICovCisJclVMQ09OMSA9IDB4MzsKKwkvKgorCSAqIHR4PWxldmVsLHJ4PWVkZ2UsZGlzYWJsZSB0aW1lb3V0IGludC4sZW5hYmxlIHJ4IGVycm9yIGludC4sCisJICogbm9ybWFsLGludGVycnVwdCBvciBwb2xsaW5nCisJICovCisJclVDT04xID0gMHgyNDU7CisJclVCUkRJVjEgPSByZWc7CisKKyNpZmRlZiBDT05GSUdfSFdGTE9XCisJclVNQ09OMSA9IDB4MTsgLyogUlRTIHVwICovCisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspOworI2Vsc2UKKyNlcnJvciAiQmFkOiB5b3UgZGlkbid0IGNvbmZpZ3VyZSBzZXJpYWwgLi4uIgorI2VuZGlmCit9CisKKy8qCisgKiBJbml0aWFsaXNlIHRoZSBzZXJpYWwgcG9ydCB3aXRoIHRoZSBnaXZlbiBiYXVkcmF0ZS4gVGhlIHNldHRpbmdzCisgKiBhcmUgYWx3YXlzIDggZGF0YSBiaXRzLCBubyBwYXJpdHksIDEgc3RvcCBiaXQsIG5vIHN0YXJ0IGJpdHMuCisgKgorICovCitpbnQgc2VyaWFsX2luaXQgKHZvaWQpCit7CisJc2VyaWFsX3NldGJyZyAoKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBSZWFkIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgc2VyaWFsIHBvcnQuIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwCisgKiBvdGhlcndpc2UuIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIHN1Y2Nlc2Z1bGwsIHRoZSBjaGFyYWN0ZXIgcmVhZCBpcworICogd3JpdHRlbiBpbnRvIGl0cyBhcmd1bWVudCBjLgorICovCitpbnQgc2VyaWFsX2dldGMgKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NFUklBTDEKKwl3aGlsZSAoIShyVVRSU1RBVDAgJiAweDEpKTsKKworCXJldHVybiByVVJYSDAgJiAweGZmOworI2VsaWYgQ09ORklHX1NFUklBTDIKKwl3aGlsZSAoIShyVVRSU1RBVDEgJiAweDEpKTsKKworCXJldHVybiByVVJYSDEgJiAweGZmOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfSFdGTE9XCitzdGF0aWMgaW50IGh3ZmxvdyA9IDA7IC8qIHR1cm5lZCBvZmYgYnkgZGVmYXVsdCAqLworaW50IGh3Zmxvd19vbm9mZihpbnQgb24pCit7CisJc3dpdGNoKG9uKSB7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCWJyZWFrOyAvKiByZXR1cm4gY3VycmVudCAqLworCWNhc2UgMToKKwkJaHdmbG93ID0gMTsgLyogdHVybiBvbiAqLworCQlicmVhazsKKwljYXNlIC0xOgorCQlod2Zsb3cgPSAwOyAvKiB0dXJuIG9mZiAqLworCQlicmVhazsKKwl9CisJcmV0dXJuIGh3ZmxvdzsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01PREVNX1NVUFBPUlQKK3N0YXRpYyBpbnQgYmVfcXVpZXQgPSAwOwordm9pZCBkaXNhYmxlX3B1dGModm9pZCkKK3sKKwliZV9xdWlldCA9IDE7Cit9CisKK3ZvaWQgZW5hYmxlX3B1dGModm9pZCkKK3sKKwliZV9xdWlldCA9IDA7Cit9CisjZW5kaWYKKworCisvKgorICogT3V0cHV0IGEgc2luZ2xlIGJ5dGUgdG8gdGhlIHNlcmlhbCBwb3J0LgorICovCit2b2lkIHNlcmlhbF9wdXRjIChjb25zdCBjaGFyIGMpCit7CisjaWZkZWYgQ09ORklHX01PREVNX1NVUFBPUlQKKwlpZiAoYmVfcXVpZXQpCisJCXJldHVybjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NFUklBTDEKKwkvKiB3YWl0IGZvciByb29tIGluIHRoZSB0eCBGSUZPIG9uIFNFUklBTDEgKi8KKwl3aGlsZSAoIShyVVRSU1RBVDAgJiAweDIpKTsKKworI2lmZGVmIENPTkZJR19IV0ZMT1cKKwkvKiBXYWl0IGZvciBDVFMgdXAgKi8KKwl3aGlsZShod2Zsb3cgJiYgIShyVU1TVEFUMCAmIDB4MSkpCisJCTsKKyNlbmRpZgorCisJclVUWEgwID0gYzsKKyNlbGlmIENPTkZJR19TRVJJQUwyCisJLyogd2FpdCBmb3Igcm9vbSBpbiB0aGUgdHggRklGTyBvbiBTRVJJQUwyICovCisJd2hpbGUgKCEoclVUUlNUQVQxICYgMHgyKSk7CisKKyNpZmRlZiBDT05GSUdfSFdGTE9XCisJLyogV2FpdCBmb3IgQ1RTIHVwICovCisJd2hpbGUoaHdmbG93ICYmICEoclVNU1RBVDEgJiAweDEpKQorCQk7CisjZW5kaWYKKwlyVVRYSDEgPSBjOworI2VuZGlmCisKKwkvKiBJZiBcbiwgYWxzbyBkbyBcciAqLworCWlmIChjID09ICdcbicpCisJCXNlcmlhbF9wdXRjICgnXHInKTsKK30KKworLyoKKyAqIFRlc3Qgd2hldGhlciBhIGNoYXJhY3RlciBpcyBpbiB0aGUgUlggYnVmZmVyCisgKi8KK2ludCBzZXJpYWxfdHN0YyAodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU0VSSUFMMQorCXJldHVybiByVVRSU1RBVDAgJiAweDE7CisjZWxpZiBDT05GSUdfU0VSSUFMMgorCXJldHVybiByVVRSU1RBVDEgJiAweDE7CisjZW5kaWYKK30KKwordm9pZAorc2VyaWFsX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCXNlcmlhbF9wdXRjICgqcysrKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jcHUvYXJtOTIwdC9zcGVlZC5jIGIvY3B1L2FybTkyMHQvc3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWUwYzFhCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyMHQvc3BlZWQuYwpAQCAtMCwwICsxLDk2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxLTIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYXZpZCBNdWVsbGVyLCBFTFNPRlQgQUcsIGQubXVlbGxlckBlbHNvZnQuY2gKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBUaGlzIGNvZGUgc2hvdWxkIHdvcmsgZm9yIGJvdGggdGhlIFMzQzI0MDAgYW5kIHRoZSBTM0MyNDEwCisgKiBhcyB0aGV5IHNlZW0gdG8gaGF2ZSB0aGUgc2FtZSBQTEwgYW5kIGNsb2NrIG1hY2hpbmVyeSBpbnNpZGUuCisgKiBUaGUgZGlmZmVyZW50IGFkZHJlc3MgbWFwcGluZyBpcyBoYW5kbGVkIGJ5IHRoZSBzM2MyNHh4LmggZmlsZXMgYmVsb3cuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2lmIGRlZmluZWQoQ09ORklHX1MzQzI0MDApCisjaW5jbHVkZSA8czNjMjQwMC5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfUzNDMjQxMCkKKyNpbmNsdWRlIDxzM2MyNDEwLmg+CisjZW5kaWYKKworI2RlZmluZSBNUExMIDAKKyNkZWZpbmUgVVBMTCAxCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIE5PVEU6IFRoaXMgZGVzY3JpYmVzIHRoZSBwcm9wZXIgdXNlIG9mIHRoaXMgZmlsZS4KKyAqCisgKiBDT05GSUdfUExMX0lOUFVUX0ZSRVEgc2hvdWxkIGJlIGRlZmluZWQgYXMgdGhlIGlucHV0IGZyZXF1ZW5jeSBvZiB0aGUgUExMLgorICoKKyAqIGdldF9GQ0xLKCksIGdldF9IQ0xLKCksIGdldF9QQ0xLKCkgYW5kIGdldF9VQ0xLKCkgcmV0dXJuIHRoZSBjbG9jayBvZgorICogdGhlIHNwZWNpZmllZCBidXMgaW4gSFouCisgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVsb25nIGdldF9QTExDTEsoaW50IHBsbHJlZykKK3sKKyAgICB1bG9uZyByLCBtLCBwLCBzOworCisgICAgaWYgKHBsbHJlZyA9PSBNUExMKQorCXIgPSByTVBMTENPTjsKKyAgICBlbHNlIGlmIChwbGxyZWcgPT0gVVBMTCkKKwlyID0gclVQTExDT047CisgICAgZWxzZQorCWhhbmcoKTsKKworICAgIG0gPSAoKHIgJiAweEZGMDAwKSA+PiAxMikgKyA4OworICAgIHAgPSAoKHIgJiAweDAwM0YwKSA+PiA0KSArIDI7CisgICAgcyA9IHIgJiAweDM7CisKKyAgICByZXR1cm4oKENPTkZJR19QTExfSU5QVVRfRlJFUSAqIG0pIC8gKHAgPDwgcykpOworfQorCisvKiByZXR1cm4gRkNMSyBmcmVxdWVuY3kgKi8KK3Vsb25nIGdldF9GQ0xLKHZvaWQpCit7CisgICAgcmV0dXJuKGdldF9QTExDTEsoTVBMTCkpOworfQorCisvKiByZXR1cm4gSENMSyBmcmVxdWVuY3kgKi8KK3Vsb25nIGdldF9IQ0xLKHZvaWQpCit7CisgICAgdWxvbmcgY2xrZGl2ID0gckNMS0RJVk47CisKKyAgICByZXR1cm4oKGNsa2RpdiAmIDB4MikgPyBnZXRfRkNMSygpLzIgOiBnZXRfRkNMSygpKTsKK30KKworLyogcmV0dXJuIFBDTEsgZnJlcXVlbmN5ICovCit1bG9uZyBnZXRfUENMSyh2b2lkKQoreworICAgIHVsb25nIGNsa2RpdiA9IHJDTEtESVZOOworCisgICAgcmV0dXJuKChjbGtkaXYgJiAweDEpID8gZ2V0X0hDTEsoKS8yIDogZ2V0X0hDTEsoKSk7Cit9CisKKy8qIHJldHVybiBVQ0xLIGZyZXF1ZW5jeSAqLwordWxvbmcgZ2V0X1VDTEsodm9pZCkKK3sKKyAgICByZXR1cm4oZ2V0X1BMTENMSyhVUExMKSk7Cit9CmRpZmYgLS1naXQgYS9jcHUvbXBjODI0eC9jcHVfaW5pdC5jIGIvY3B1L21wYzgyNHgvY3B1X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDJmNjVkCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzgyNHgvY3B1X2luaXQuYwpAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogUm9iIFRheWxvci4gRmx5aW5nIFBpZyBTeXN0ZW1zLiByb2J0QGZseWluZ3BpZy5jb20uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxtcGM4MjR4Lmg+CisKKyNpZm5kZWYgQ0ZHX0JBTkswX1JPVworI2RlZmluZSBDRkdfQkFOSzBfUk9XIDAKKyNlbmRpZgorI2lmbmRlZiBDRkdfQkFOSzFfUk9XCisjZGVmaW5lIENGR19CQU5LMV9ST1cgMAorI2VuZGlmCisjaWZuZGVmIENGR19CQU5LMl9ST1cKKyNkZWZpbmUgQ0ZHX0JBTksyX1JPVyAwCisjZW5kaWYKKyNpZm5kZWYgQ0ZHX0JBTkszX1JPVworI2RlZmluZSBDRkdfQkFOSzNfUk9XIDAKKyNlbmRpZgorI2lmbmRlZiBDRkdfQkFOSzRfUk9XCisjZGVmaW5lIENGR19CQU5LNF9ST1cgMAorI2VuZGlmCisjaWZuZGVmIENGR19CQU5LNV9ST1cKKyNkZWZpbmUgQ0ZHX0JBTks1X1JPVyAwCisjZW5kaWYKKyNpZm5kZWYgQ0ZHX0JBTks2X1JPVworI2RlZmluZSBDRkdfQkFOSzZfUk9XIDAKKyNlbmRpZgorI2lmbmRlZiBDRkdfQkFOSzdfUk9XCisjZGVmaW5lIENGR19CQU5LN19ST1cgMAorI2VuZGlmCisjaWZuZGVmIENGR19EQlVTX1NJWkUyCisjZGVmaW5lIENGR19EQlVTX1NJWkUyIDAKKyNlbmRpZgorCisvKgorICogQnJlYXRoIHNvbWUgbGlmZSBpbnRvIHRoZSBDUFUuLi4KKyAqCisgKiBTZXQgdXAgdGhlIG1lbW9yeSBtYXAsCisgKiBpbml0aWFsaXplIGEgYnVuY2ggb2YgcmVnaXN0ZXJzLAorICovCit2b2lkCitjcHVfaW5pdF9mICh2b2lkKQoreworLyogTU9VU1NFIGJvYXJkIGlzIGluaXRpYWxpemVkIGluIGFzbSAqLworI2lmICFkZWZpbmVkKENPTkZJR19NT1VTU0UpICYmICFkZWZpbmVkKENPTkZJR19CTVcpCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgQ09ORklHX1dSSVRFX0hBTEZXT1JEKFBDSUNSLCAweDA2KTsgLyogQnVzIE1hc3RlciwgcmVzcG9uZCB0byBQQ0kgbWVtb3J5IHNwYWNlIGFjZXNzZXMqLworLyogICAgQ09ORklHX1dSSVRFX0hBTEZXT1JEKFBDSVNSLCAweGZmZmYpOyAqLyAvKnJlc2V0IFBDSVNSKi8KKworI2lmIGRlZmluZWQoQ09ORklHX01VU0VOS0kpIHx8IGRlZmluZWQoQ09ORklHX1BONjIpCisvKiBXaHkgaXMgdGhpcyBoZXJlLCB5b3UgYXNrPyAgVHJ5LCBqdXN0IHRyeSBzZXR0aW5nIDB4ODAwMAorICogaW4gUENJQUNSIHdpdGggQ09ORklHX1dSSVRFX0hBTEZXT1JEKCkKKyAqIHRoaXMgb25lIHdhcyBhIHN0dW1wZXIsIGFuZCB3ZSBhcmUgYW5ub3llZAorICovCisKKyNkZWZpbmUgTV9DT05GSUdfV1JJVEVfSEFMRldPUkQoIGFkZHIsIGRhdGEgKSBcCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oICAgICBcCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdHcgICUyLDAoJTApXG4gICAgICAgICBcCisgICAgICBzeW5jXG4gICAgICAgICAgICAgICAgICBcCisgICAgICBzdGggICUzLDIoJTEpXG4gICAgICAgICBcCisgICAgICBzeW5jXG4gICAgICAgICAgICAgICAgICBcCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IC8qIG5vIG91dHB1dCAqLyAgICAgICBcCisgICAgICA6ICJyIiAoQ09ORklHX0FERFIpLCAiciIgKENPTkZJR19EQVRBKSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInIiIChQQ0lTV0FQKGFkZHIgJiB+MykpLCAiciIgKFBDSVNXQVAoZGF0YSA8PCAxNikpICAgXAorICAgICAgKTsKKworICAgIE1fQ09ORklHX1dSSVRFX0hBTEZXT1JEKFBDSUFDUiwgMHg4MDAwKTsKKyNlbmRpZgorCisgICAgQ09ORklHX1dSSVRFX0JZVEUoUENMU1IsIDB4OCk7CS8qIHNldCBQQ0kgY2FjaGUgbGluZSBzaXplICovCisKKyAgICAvKgorICAgICAqIE5vdGUgdGhhdCBhbHRob3VnaCB0aGlzIGJpdCBpcyBjbGVhcmVkIGFmdGVyIGEgaGFyZCByZXNldCwgaXQKKyAgICAgKiBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0IGFuZCB0aGVuIGNsZWFyZWQgYnkgc29mdHdhcmUgZHVyaW5nCisgICAgICogaW5pdGlhbGl6YXRpb24gaW4gb3JkZXIgdG8gZ3VhcmFudGVlIGNvcnJlY3Qgb3BlcmF0aW9uIG9mIHRoZQorICAgICAqIERMTCBhbmQgdGhlIFNEUkFNX0NMS1swOjNdIHNpZ25hbHMgKGlmIHRoZXkgYXJlIHVzZWQpLgorICAgICAqLworICAgIENPTkZJR19SRUFEX0JZVEUgKEFNQk9SLCB2YWwpOworICAgIENPTkZJR19XUklURV9CWVRFKEFNQk9SLCB2YWwgJiAweERGKTsKKyAgICBDT05GSUdfV1JJVEVfQllURShBTUJPUiwgdmFsIHwgMHgyMCk7CisgICAgQ09ORklHX1dSSVRFX0JZVEUoQU1CT1IsIHZhbCAmIDB4REYpOworCisgICAgQ09ORklHX1JFQURfV09SRChQSUNSMSwgdmFsKTsKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MjQwKQorICAgIENPTkZJR19XUklURV9XT1JEKCBQSUNSMSwKKyAgICAgICAodmFsICYgKFBJQ1IxX0FERFJFU1NfTUFQIHwgUElDUjFfUkNTMCkpIHwKKwkgICAgICAgUElSQzFfTVNLIHwgUElDUjFfUFJPQ19UWVBFXzYwM0UgfAorCSAgICAgICBQSUNSMV9GTEFTSF9XUl9FTiB8IFBJQ1IxX01DUF9FTiB8CisJICAgICAgIFBJQ1IxX0NGX0RQQVJLIHwgUElDUjFfRU5fUENTIHwKKwkgICAgICAgUElDUjFfQ0ZfQVBBUksgKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzgyNDUpCisgICAgQ09ORklHX1dSSVRFX1dPUkQoIFBJQ1IxLAorICAgICAgICh2YWwgJiAoUElDUjFfUkNTMCkpIHwKKwkgICAgICAgUElDUjFfUFJPQ19UWVBFXzYwM0UgfAorCSAgICAgICBQSUNSMV9GTEFTSF9XUl9FTiB8IFBJQ1IxX01DUF9FTiB8CisJICAgICAgIFBJQ1IxX0NGX0RQQVJLIHwgUElDUjFfTk9fQlVTV19DSyB8CisJICAgICAgIFBJQ1IxX0RFQ3wgUElDUjFfQ0ZfQVBBUksgfCAweDEwKTsJLyogODI0NSBVTSBzYXlzIGJpdCA0IG11c3QgYmUgc2V0ICovCisjZWxzZQorI2Vycm9yIFNwZWNpZmljIHR5cGUgb2YgTVBDODI0eCBtdXN0IGJlIGRlZmluZWQgKGkuZS4gQ09ORklHX01QQzgyNDApCisjZW5kaWYKKworICAgIENPTkZJR19SRUFEX1dPUkQoUElDUjIsIHZhbCk7CisgICAgdmFsPSB2YWwgJiB+IChQSUNSMl9DRl9TTk9PUF9XU19NQVNLIHwgUElDUjJfQ0ZfQVBIQVNFX1dTX01BU0spOyAvKm1hc2sgb2ZmIHdhaXRzdGF0ZSBiaXRzKi8KKyNpZm5kZWYgQ09ORklHX1BONjIKKyAgICB2YWwgfD0gUElDUjJfQ0ZfU05PT1BfV1NfMVdTIHwgUElDUjJfQ0ZfQVBIQVNFX1dTXzFXUzsgLyoxIHdhaXQgc3RhdGUqLworI2VuZGlmCisgICAgQ09ORklHX1dSSVRFX1dPUkQoUElDUjIsIHZhbCk7CisKKyAgICBDT05GSUdfV1JJVEVfV09SRChFVU1CQkFSLCBDRkdfRVVNQl9BRERSKTsKKyNpZm5kZWYgQ0ZHX1JBTUJPT1QKKyAgICBDT05GSUdfV1JJVEVfV09SRChNQ0NSMSwgKENGR19ST01OQUwgPDwgTUNDUjFfUk9NTkFMX1NISUZUKSB8CisJCQkJIChDRkdfQkFOSzBfUk9XKSB8CisJCQkJIChDRkdfQkFOSzFfUk9XIDw8IE1DQ1IxX0JBTksxUk9XX1NISUZUKSB8CisJCQkJIChDRkdfQkFOSzJfUk9XIDw8IE1DQ1IxX0JBTksyUk9XX1NISUZUKSB8CisJCQkJIChDRkdfQkFOSzNfUk9XIDw8IE1DQ1IxX0JBTkszUk9XX1NISUZUKSB8CisJCQkJIChDRkdfQkFOSzRfUk9XIDw8IE1DQ1IxX0JBTks0Uk9XX1NISUZUKSB8CisJCQkJIChDRkdfQkFOSzVfUk9XIDw8IE1DQ1IxX0JBTks1Uk9XX1NISUZUKSB8CisJCQkJIChDRkdfQkFOSzZfUk9XIDw8IE1DQ1IxX0JBTks2Uk9XX1NISUZUKSB8CisJCQkJIChDRkdfQkFOSzdfUk9XIDw8IE1DQ1IxX0JBTks3Uk9XX1NISUZUKSB8CisJCQkgICAgIChDRkdfUk9NRkFMIDw8IE1DQ1IxX1JPTUZBTF9TSElGVCkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19BU1JJU0UpICYmIGRlZmluZWQoQ0ZHX0FTRkFMTCkKKyAgICBDT05GSUdfV1JJVEVfV09SRChNQ0NSMiwgQ0ZHX1JFRklOVCA8PCBNQ0NSMl9SRUZJTlRfU0hJRlQgfAorICAgIAkJCSAgICAgQ0ZHX0FTUklTRSA8PCBNQ0NSMl9BU1JJU0VfU0hJRlQgfAorICAgIAkJCSAgICAgQ0ZHX0FTRkFMTCA8PCBNQ0NSMl9BU0ZBTExfU0hJRlQpOworI2Vsc2UKKyAgICBDT05GSUdfV1JJVEVfV09SRChNQ0NSMiwgQ0ZHX1JFRklOVCA8PCBNQ0NSMl9SRUZJTlRfU0hJRlQpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MjQwKQorICAgIENPTkZJR19XUklURV9XT1JEKE1DQ1IzLAorCSgoKENGR19CU1RPUFJFICYgMHgwMDNjKSA+PiAyKSA8PCBNQ0NSM19CU1RPUFJFMlRPNV9TSElGVCkgfAorCShDRkdfUkVGUkVDIDw8IE1DQ1IzX1JFRlJFQ19TSElGVCkgfAorCShDRkdfUkRMQVQgIDw8IE1DQ1IzX1JETEFUX1NISUZUKSk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4MjQ1KQorICAgIENPTkZJR19XUklURV9XT1JEKE1DQ1IzLAorCSgoKENGR19CU1RPUFJFICYgMHgwMDNjKSA+PiAyKSA8PCBNQ0NSM19CU1RPUFJFMlRPNV9TSElGVCkgfAorCShDRkdfUkVGUkVDIDw8IE1DQ1IzX1JFRlJFQ19TSElGVCkpOworI2Vsc2UKKyNlcnJvciBTcGVjaWZpYyB0eXBlIG9mIE1QQzgyNHggbXVzdCBiZSBkZWZpbmVkIChpLmUuIENPTkZJR19NUEM4MjQwKQorI2VuZGlmCisKKy8qIHRoaXMgaXMgZ3Jvc3MuICBXZSB0aGluayB0aGVzZSBzaG91bGQgYWxsIGJlIHRoZSBzYW1lLCBhbmQgdmFyaW91cyBib2FyZHMKKyAqICBzaG91bGQgZGVmaW5lIENGR19BQ1RPUlcgdG8gMCBpZiB0aGV5IGRvbid0IHdhbnQgdG8gc2V0IGl0LCBvciBldmVuLCBpZgorICogIGl0cyBub3Qgc2V0LCB3ZSBkZWZpbmUgaXQgdG8gemVybyBpbiB0aGlzIGZpbGUKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NVODI0KSB8fCBkZWZpbmVkKENPTkZJR19QTjYyKQorCUNPTkZJR19XUklURV9XT1JEKE1DQ1I0LAorCShDRkdfUFJFVE9BQ1QgPDwgTUNDUjRfUFJFVE9BQ1RfU0hJRlQpIHwKKwkoQ0ZHX0FDVFRPUFJFIDw8IE1DQ1I0X0FDVFRPUFJFX1NISUZUKSB8CisJTUNDUjRfQklUMjEgfAorCShDRkdfUkVHSVNURVJEX1RZUEVfQlVGRkVSID8gTUNDUjRfUkVHSVNURVJFRDogMCkgfAorCSgoQ0ZHX0JTVE9QUkUgJiAweDAwMDMpIDw8TUNDUjRfQlNUT1BSRTBUTzFfU0hJRlQgKSB8CisJKCgoQ0ZHX1NETU9ERV9DQVNfTEFUIDw8NCkgfCAoQ0ZHX1NETU9ERV9XUkFQIDw8MykgfAorCQkgIENGR19TRE1PREVfQlVSU1RMRU4pIDw8IE1DQ1I0X1NETU9ERV9TSElGVCkgfAorCShDRkdfQUNUT1JXIDw8IE1DQ1I0X0FDVFRPUldfU0hJRlQpIHwKKwkoKChDRkdfQlNUT1BSRSAmIDB4MDNjMCkgPj4gNikgPDwgTUNDUjRfQlNUT1BSRTZUTzlfU0hJRlQpKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzgyNDApCisJQ09ORklHX1dSSVRFX1dPUkQoTUNDUjQsCisJKENGR19QUkVUT0FDVCA8PCBNQ0NSNF9QUkVUT0FDVF9TSElGVCkgfAorCShDRkdfQUNUVE9QUkUgPDwgTUNDUjRfQUNUVE9QUkVfU0hJRlQpIHwKKwlNQ0NSNF9CSVQyMSB8CisJKENGR19SRUdJU1RFUkRfVFlQRV9CVUZGRVIgPyBNQ0NSNF9SRUdJU1RFUkVEOiAwKSB8CisJKChDRkdfQlNUT1BSRSAmIDB4MDAwMykgPDxNQ0NSNF9CU1RPUFJFMFRPMV9TSElGVCApIHwKKwkoKChDRkdfU0RNT0RFX0NBU19MQVQgPDw0KSB8IChDRkdfU0RNT0RFX1dSQVAgPDwzKSB8CisJCSAgKENGR19TRE1PREVfQlVSU1RMRU4pKSA8PE1DQ1I0X1NETU9ERV9TSElGVCkgfAorCSgoKENGR19CU1RPUFJFICYgMHgwM2MwKSA+PiA2KSA8PE1DQ1I0X0JTVE9QUkU2VE85X1NISUZUICkpOworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODI0NSkKKyAgICBDT05GSUdfUkVBRF9XT1JEKE1DQ1IxLCB2YWwpOworICAgIHZhbCAmPSBNQ0NSMV9EQlVTX1NJWkUwOyAgICAvKiB0ZXN0IGZvciA2NC1iaXQgbWVtIGJ1cyAqLworCisgICAgQ09ORklHX1dSSVRFX1dPUkQoTUNDUjQsCisJKENGR19QUkVUT0FDVCA8PCBNQ0NSNF9QUkVUT0FDVF9TSElGVCkgfAorCShDRkdfQUNUVE9QUkUgPDwgTUNDUjRfQUNUVE9QUkVfU0hJRlQpIHwKKyAgICAgICAgKENGR19FWFRST00gPyBNQ0NSNF9FWFRST00gOiAwKSB8CisgICAgICAgIChDRkdfUkVHRElNTSA/IE1DQ1I0X1JFR0RJTU0gOiAwKSB8CisJKENGR19SRUdJU1RFUkRfVFlQRV9CVUZGRVIgPyBNQ0NSNF9SRUdJU1RFUkVEOiAwKSB8CisJKChDRkdfQlNUT1BSRSAmIDB4MDAwMykgPDxNQ0NSNF9CU1RPUFJFMFRPMV9TSElGVCApIHwKKwkoQ0ZHX0RCVVNfU0laRTIgPDwgTUNDUjRfREJVU19TSVpFMl9TSElGVCkgfAorCSgoKENGR19TRE1PREVfQ0FTX0xBVCA8PDQpIHwgKENGR19TRE1PREVfV1JBUCA8PDMpIHwKKyAgICAgICAgICAgICAgKHZhbCA/IDIgOiAzKSkgPDwgTUNDUjRfU0RNT0RFX1NISUZUKSAgfAorCShDRkdfQUNUT1JXIDw8IE1DQ1I0X0FDVFRPUldfU0hJRlQpIHwKKwkoKChDRkdfQlNUT1BSRSAmIDB4MDNjMCkgPj4gNikgPDxNQ0NSNF9CU1RPUFJFNlRPOV9TSElGVCApKTsKKyNlbHNlCisjZXJyb3IgU3BlY2lmaWMgdHlwZSBvZiBNUEM4MjR4IG11c3QgYmUgZGVmaW5lZCAoaS5lLiBDT05GSUdfTVBDODI0MCkKKyNlbmRpZgorCisgICAgQ09ORklHX1dSSVRFX1dPUkQoTVNBUjEsCisJKCAoQ0ZHX0JBTkswX1NUQVJUICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfQUREUl9TSElGVCkgfAorCSgoKENGR19CQU5LMV9TVEFSVCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIDw8IDgpIHwKKwkoKChDRkdfQkFOSzJfU1RBUlQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCAxNikgfAorCSgoKENGR19CQU5LM19TVEFSVCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIDw8IDI0KSk7CisgICAgQ09ORklHX1dSSVRFX1dPUkQoRU1TQVIxLAorCSggKENGR19CQU5LMF9TVEFSVCAmIE1JQ1JfRUFERFJfTUFTSykgPj4gTUlDUl9FQUREUl9TSElGVCkgfAorCSgoKENGR19CQU5LMV9TVEFSVCAmIE1JQ1JfRUFERFJfTUFTSykgPj4gTUlDUl9FQUREUl9TSElGVCkgPDwgOCkgfAorCSgoKENGR19CQU5LMl9TVEFSVCAmIE1JQ1JfRUFERFJfTUFTSykgPj4gTUlDUl9FQUREUl9TSElGVCkgPDwgMTYpIHwKKwkoKChDRkdfQkFOSzNfU1RBUlQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIDw8IDI0KSk7CisgICAgQ09ORklHX1dSSVRFX1dPUkQoTVNBUjIsCisJKCAoQ0ZHX0JBTks0X1NUQVJUICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfQUREUl9TSElGVCkgfAorCSgoKENGR19CQU5LNV9TVEFSVCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIDw8IDgpIHwKKwkoKChDRkdfQkFOSzZfU1RBUlQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCAxNikgfAorCSgoKENGR19CQU5LN19TVEFSVCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIDw8IDI0KSk7CisgICAgQ09ORklHX1dSSVRFX1dPUkQoRU1TQVIyLAorCSggKENGR19CQU5LNF9TVEFSVCAmIE1JQ1JfRUFERFJfTUFTSykgPj4gTUlDUl9FQUREUl9TSElGVCkgfAorCSgoKENGR19CQU5LNV9TVEFSVCAmIE1JQ1JfRUFERFJfTUFTSykgPj4gTUlDUl9FQUREUl9TSElGVCkgPDwgOCkgfAorCSgoKENGR19CQU5LNl9TVEFSVCAmIE1JQ1JfRUFERFJfTUFTSykgPj4gTUlDUl9FQUREUl9TSElGVCkgPDwgMTYpIHwKKwkoKChDRkdfQkFOSzdfU1RBUlQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIDw8IDI0KSk7CisgICAgQ09ORklHX1dSSVRFX1dPUkQoTUVBUjEsCisJKCAoQ0ZHX0JBTkswX0VORCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIHwKKwkoKChDRkdfQkFOSzFfRU5EICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfQUREUl9TSElGVCkgPDwgOCkgfAorCSgoKENGR19CQU5LMl9FTkQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCAxNikgfAorCSgoKENGR19CQU5LM19FTkQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCAyNCkpOworICAgIENPTkZJR19XUklURV9XT1JEKEVNRUFSMSwKKwkoIChDRkdfQkFOSzBfRU5EICYgTUlDUl9FQUREUl9NQVNLKSA+PiBNSUNSX0VBRERSX1NISUZUKSB8CisJKCgoQ0ZHX0JBTksxX0VORCAmIE1JQ1JfRUFERFJfTUFTSykgPj4gTUlDUl9FQUREUl9TSElGVCkgPDwgOCkgfAorCSgoKENGR19CQU5LMl9FTkQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIDw8IDE2KSB8CisJKCgoQ0ZHX0JBTkszX0VORCAmIE1JQ1JfRUFERFJfTUFTSykgPj4gTUlDUl9FQUREUl9TSElGVCkgPDwgMjQpKTsKKyAgICBDT05GSUdfV1JJVEVfV09SRChNRUFSMiwKKwkoIChDRkdfQkFOSzRfRU5EICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfQUREUl9TSElGVCkgfAorCSgoKENGR19CQU5LNV9FTkQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCA4KSB8CisJKCgoQ0ZHX0JBTks2X0VORCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIDw8IDE2KSB8CisJKCgoQ0ZHX0JBTks3X0VORCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIDw8IDI0KSk7CisgICAgQ09ORklHX1dSSVRFX1dPUkQoRU1FQVIyLAorCSggKENGR19CQU5LNF9FTkQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIHwKKwkoKChDRkdfQkFOSzVfRU5EICYgTUlDUl9FQUREUl9NQVNLKSA+PiBNSUNSX0VBRERSX1NISUZUKSA8PCA4KSB8CisJKCgoQ0ZHX0JBTks2X0VORCAmIE1JQ1JfRUFERFJfTUFTSykgPj4gTUlDUl9FQUREUl9TSElGVCkgPDwgMTYpIHwKKwkoKChDRkdfQkFOSzdfRU5EICYgTUlDUl9FQUREUl9NQVNLKSA+PiBNSUNSX0VBRERSX1NISUZUKSA8PCAyNCkpOworCisgICAgQ09ORklHX1dSSVRFX0JZVEUoT0RDUiwgQ0ZHX09EQ1IpOworI2lmZGVmIENGR19ETExfTUFYX0RFTEFZCisJQ09ORklHX1dSSVRFX0JZVEUoTUlPQ1IxLCBDRkdfRExMX01BWF9ERUxBWSk7CS8qIG5lZWRlZCB0byBtYWtlIERMTCBsb2NrICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENGR19ETExfRVhURU5EKSAmJiBkZWZpbmVkKENGR19QQ0lfSE9MRF9ERUwpCisJQ09ORklHX1dSSVRFX0JZVEUoUE1DUjIsIENGR19ETExfRVhURU5EIHwgQ0ZHX1BDSV9IT0xEX0RFTCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1JT0NSMikgJiYgZGVmaW5lZChDRkdfU0RSQU1fRFNDRCkKKwlDT05GSUdfV1JJVEVfQllURShNSU9DUjIsIENGR19TRFJBTV9EU0NEKTsJLyogY2hhbmdlIG1lbW9yeSBpbnB1dCAqLworI2VuZGlmIC8qIHNldHVwICYgaG9sZCB0aW1lICovCisKKyAgICBDT05GSUdfV1JJVEVfQllURShNQkVSLAorCSBDRkdfQkFOSzBfRU5BQkxFIHwKKwkoQ0ZHX0JBTksxX0VOQUJMRSA8PCAxKSB8CisJKENGR19CQU5LMl9FTkFCTEUgPDwgMikgfAorCShDRkdfQkFOSzNfRU5BQkxFIDw8IDMpIHwKKwkoQ0ZHX0JBTks0X0VOQUJMRSA8PCA0KSB8CisJKENGR19CQU5LNV9FTkFCTEUgPDwgNSkgfAorCShDRkdfQkFOSzZfRU5BQkxFIDw8IDYpIHwKKwkoQ0ZHX0JBTks3X0VOQUJMRSA8PCA3KSk7CisKKyNpZmRlZiBDRkdfUEdNQVgKKyAgICBDT05GSUdfV1JJVEVfQllURShNUE1SLCBDRkdfUEdNQVgpOworI2VuZGlmCisKKyAgICAvKiAhIFdhaXQgMjAwdXMgYmVmb3JlIGluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzICovCisgICAgLypGSVhNRTogd3JpdGUgYSBkZWNlbnQgdWRlbGF5IHdhaXQgKi8KKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyAgICAgICIgbXRjdHIJJTAgXG4gXAorICAgICAgIDA6IGJkbnoJIDBiXG4iCisgICAgICA6CisgICAgICA6ICJyIiAoMHgxMDAwMCkpOworCisgICBDT05GSUdfUkVBRF9XT1JEKE1DQ1IxLCB2YWwpOworICAgQ09ORklHX1dSSVRFX1dPUkQoTUNDUjEsIHZhbCB8IE1DQ1IxX01FTUdPKTsgLyogc2V0IG1lbW9yeSBhY2Nlc3MgZ29pbmcgKi8KKyAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJlaWVpbyIpOworCisjZW5kaWYgLyogIUNPTkZJR19NT1VTU0UgJiYgIUNPTkZJR19CTVcgKi8KK30KKworCisjaWZkZWYgQ09ORklHX01PVVNTRQorI2lmZGVmIElOQ0xVREVfTVBDMTA3X1JFUE9SVAorc3RydWN0IE1QQzEwN19zeworICAgIHVuc2lnbmVkIGludCBpb2Jhc2U7CisgICAgY2hhciBkZXNjWzEyMF07Cit9IE1QQzEwN1JlZ3NbXSA9eworICAgIHtCTUNfQkFTRSsweDAsICAiTVBDMTA3IFZlbmRvci9EZXZpY2UgSUQifSwKKyAgICB7Qk1DX0JBU0UrMHg0LCAgIk1QQzEwNyBQQ0kgQ29tbWFuZC9TdGF0dXMgUmVnaXN0ZXIifSwKKyAgICB7Qk1DX0JBU0UrMHg4LCAgIk1QQzEwNyBSZXZpc2lvbiJ9LAorICAgIHtCTUNfQkFTRSsweEMsICAiTVBDMTA3IENhY2hlIExpbmUgU2l6ZSJ9LAorICAgIHtCTUNfQkFTRSsweDEwLCAiTVBDMTA3IExNQkFSIn0sCisgICAge0JNQ19CQVNFKzB4MTQsICJNUEM4MjR4IFBDU1IifSwKKyAgICB7Qk1DX0JBU0UrMHhBOCwgIk1QQzgyNHggUElDUjEifSwKKyAgICB7Qk1DX0JBU0UrMHhBQywgIk1QQzgyNHggUElDUjIifSwKKyAgICB7Qk1DX0JBU0UrMHg0NiwgIk1QQzgyNHggUEFDUiJ9LAorICAgIHtCTUNfQkFTRSsweDMxMCwgIk1QQzgyNHggSVRXUiJ9LAorICAgIHtCTUNfQkFTRSsweDMwMCwgIk1QQzgyNHggT01CQVIifSwKKyAgICB7Qk1DX0JBU0UrMHgzMDgsICJNUEM4MjR4IE9UV1IifSwKKyAgICB7Qk1DX0JBU0UrMHgxNCwgIk1QQzEwNyBQZXJpcGhlcmFsIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciJ9LAorICAgIHtCTUNfQkFTRSsweDc4LCAiTVBDMTA3IEVVTUJBUiJ9LAorICAgIHtCTUNfQkFTRSsweEMwLCAiTVBDMTA3IFByb2Nlc3NvciBCdXMgRXJyb3IgU3RhdHVzIn0sCisgICAge0JNQ19CQVNFKzB4QzQsICJNUEMxMDcgUENJIEJ1cyBFcnJvciBTdGF0dXMifSwKKyAgICB7Qk1DX0JBU0UrMHhDOCwgIk1QQzEwNyBQcm9jZXNzb3IvUENJIEVycm9yIEFkZHJlc3MifSwKKyAgICB7Qk1DX0JBU0UrMHhFMCwgIk1QQzEwNyBBTUJPUiBSZWdpc3RlciJ9LAorICAgIHtCTUNfQkFTRSsweEYwLCAiTVBDMTA3IE1DQ1IxIFJlZ2lzdGVyIn0sCisgICAge0JNQ19CQVNFKzB4RjQsICJNUEMxMDcgTUNDUjIgUmVnaXN0ZXIifSwKKyAgICB7Qk1DX0JBU0UrMHhGOCwgIk1QQzEwNyBNQ0NSMyBSZWdpc3RlciJ9LAorICAgIHtCTUNfQkFTRSsweEZDLCAiTVBDMTA3IE1DQ1I0IFJlZ2lzdGVyIn0KK307CisjZGVmaW5lIE5fTVBDMTA3X1JlZ3MJKHNpemVvZihNUEMxMDdSZWdzKS9zaXplb2YoTVBDMTA3UmVnc1swXSkpCisjZW5kaWYgLyogSU5DTFVERV9NUEMxMDdfUkVQT1JUICovCisjZW5kaWYgLyogQ09ORklHX01PVVNTRSAqLworCisvKgorICogaW5pdGlhbGl6ZSBoaWdoZXIgbGV2ZWwgcGFydHMgb2YgQ1BVIGxpa2UgdGltZSBiYXNlIGFuZCB0aW1lcnMKKyAqLworaW50IGNwdV9pbml0X3IgKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX01PVVNTRQorI2lmZGVmIElOQ0xVREVfTVBDMTA3X1JFUE9SVAorCXVuc2lnbmVkIGludCB0bXAgPSAwLCBpOworI2VuZGlmCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBFVU1CQkFSIChFbWJlZGRlZCBVdGlsIE1lbSBCbG9jayBCYXNlIEFkZHIgUmVnKS4KKwkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWZvcmUgdGhlIEVQSUMsIERNQSBjdGxyLCBJMkMgY3RsciwgZXRjLiBjYW4KKwkgKiBiZSBhY2Nlc3NlZC4KKwkgKi8KKworI2lmZGVmIENPTkZJR19NUEM4MjQwCQkJLyogb25seSBvbiBNUEM4MjQwICovCisJbXBjODI0eF9tcGMxMDdfc2V0cmVnIChFVU1CQkFSLCBFVU1CQkFSX1ZBTCk7CisJLyogTU9UL1NQUzogSXNzdWUgIzEwMDAyLCBQQ0kgKEZEIEFsaWFzIGVuYWJsZSkgKi8KKwltcGM4MjR4X21wYzEwN19zZXRyZWcgKEFNQk9SLCAweDAwMDAwMEMwKTsKKyNlbmRpZgorCisKKyNpZmRlZiBJTkNMVURFX01QQzEwN19SRVBPUlQKKwkvKiBDaGVjayBNUEM4MjR4IFBDSSBEZXZpY2UgYW5kIFZlbmRvciBJRCAqLworCXdoaWxlICgodG1wID0gbXBjODI0eF9tcGMxMDdfZ2V0cmVnIChCTUNfQkFTRSkpICE9IDB4MzEwNTcpIHsKKwkJcHJpbnRmICgiCU1QQzEwNzogb2Zmc2V0PTB4JXgsIHZhbCA9IDB4JXhcbiIsCisJCQlCTUNfQkFTRSwKKwkJCXRtcCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5fTVBDMTA3X1JlZ3M7IGkrKykgeworCQlwcmludGYgKCIJMHgleC8lcyA9IDB4JXhcbiIsCisJCQlNUEMxMDdSZWdzW2ldLmlvYmFzZSwKKwkJCU1QQzEwN1JlZ3NbaV0uZGVzYywKKwkJCW1wYzgyNHhfbXBjMTA3X2dldHJlZyAoTVBDMTA3UmVnc1tpXS5pb2Jhc2UpKTsKKwl9CisKKwlwcmludGYgKCJJQkFUMEwgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMEwpKTsKKwlwcmludGYgKCJJQkFUMFUgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMFUpKTsKKwlwcmludGYgKCJJQkFUMUwgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMUwpKTsKKwlwcmludGYgKCJJQkFUMVUgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMVUpKTsKKwlwcmludGYgKCJJQkFUMkwgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMkwpKTsKKwlwcmludGYgKCJJQkFUMlUgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMlUpKTsKKwlwcmludGYgKCJJQkFUM0wgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUM0wpKTsKKwlwcmludGYgKCJJQkFUM1UgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUM1UpKTsKKwlwcmludGYgKCJEQkFUMEwgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMEwpKTsKKwlwcmludGYgKCJEQkFUMFUgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMFUpKTsKKwlwcmludGYgKCJEQkFUMUwgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMUwpKTsKKwlwcmludGYgKCJEQkFUMVUgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMVUpKTsKKwlwcmludGYgKCJEQkFUMkwgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMkwpKTsKKwlwcmludGYgKCJEQkFUMlUgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMlUpKTsKKwlwcmludGYgKCJEQkFUM0wgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUM0wpKTsKKwlwcmludGYgKCJEQkFUM1UgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUM1UpKTsKKyNlbmRpZiAvKiBJTkNMVURFX01QQzEwN19SRVBPUlQgKi8KKyNlbmRpZiAvKiBDT05GSUdfTU9VU1NFICovCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjR4L2RyaXZlcnMvaTJjL2kyYzEuYyBiL2NwdS9tcGM4MjR4L2RyaXZlcnMvaTJjL2kyYzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTZlYzYwCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzgyNHgvZHJpdmVycy9pMmMvaTJjMS5jCkBAIC0wLDAgKzEsMTIyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgQCBNb3Rvcm9sYSwgMTk5OQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfSEFSRF9JMkMKKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlICJpMmNfZXhwb3J0LmgiCisjaW5jbHVkZSAiaTJjLmgiCisKKyN1bmRlZiAgSTJDREJHMAorI3VuZGVmICBERUJVRworCisvKiBEZWZpbmUgYSBtYWNybyB0byB1c2UgYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tbGF5ZXIgcHJpbnQgZnVuY3Rpb24sIGlmCisgKiBvbmUgd2FzIHBhc3NlZCB0byB0aGUgSTJDIGxpYnJhcnkgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAgSWYgdGhlcmUgd2FzCisgKiBubyBmdW5jdGlvbiBwb2ludGVyIHBhc3NlZCwgdGhpcyBwcm90ZWN0cyBhZ2FpbnN0IGNhbGxpbmcgaXQuICBBbHNvIGRlZmluZQorICogdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGhvbGRzIHRoZSBwYXNzZWQgcG9pbnRlci4KKyAqLworI2RlZmluZSBUSU1FT1VUIChDRkdfSFovNCkKKyNkZWZpbmUgUFJJTlQgaWYgKCBhcHBfcHJpbnQgKSBhcHBfcHJpbnQKK3N0YXRpYyBpbnQgKCphcHBfcHJpbnQpIChjaGFyICosIC4uLik7CisKKy8qKioqKioqKioqKioqKioqKioqIEludGVybmFsIHRvIEkyQyBEcml2ZXIgKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgaW50IEJ5dGVUb1htaXQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBYbWl0Qnl0ZSA9IDA7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqWG1pdEJ1ZiA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IFhtaXRCdWZFbXB0eVN0b3AgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBCeXRlVG9SY3YgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBSY3ZCeXRlID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpSY3ZCdWYgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBSY3ZCdWZGdWxTdG9wID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgTWFzdGVyUmN2QWRkcmVzcyA9IDA7CisKKy8qIFNldCBieSBjYWxsIHRvIGdldF9ldW1iYmFyIGR1cmluZyBJMkNfSW5pdGlhbGl6ZS4KKyAqIFRoaXMgY291bGQgYmUgZ2xvYmFsbHkgYXZhaWxhYmxlIHRvIHRoZSBJMkMgbGlicmFyeSwgYnV0IHRoZXJlIGlzCisgKiBhbiBhZHZhbnRhZ2UgdG8gcGFzc2luZyBpdCBhcyBhIHBhcmFtZXRlcjogaXQgaXMgYWxyZWFkeSBpbiBhIHJlZ2lzdGVyCisgKiBhbmQgZG9lc24ndCBoYXZlIHRvIGJlIGxvYWRlZCBmcm9tIG1lbW9yeS4gIEFsc28sIHRoYXQgaXMgdGhlIHdheSB0aGUKKyAqIEkyQyBsaWJyYXJ5IHdhcyBhbHJlYWR5IGltcGxlbWVudGVkIGFuZCBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIGl0IHdpdGhvdXQKKyAqIGEgbW9yZSBkZXRhaWxlZCBhbmFseXNpcy4KKyAqIEl0IGlzIGJlaW5nIHNldCBhcyBhIGdsb2JhbCB2YXJpYWJsZSBpbiBJMkNfSW5pdGlhbGl6ZSB0byBoaWRlIGl0IGZyb20KKyAqIHRoZSBESU5LIGFwcGxpY2F0aW9uIGxheWVyLCBiZWNhdXNlIGl0IGlzIEthaGx1YS1zcGVjaWZpYy4gIEkgdGhpbmsgdGhhdAorICogZ2V0X2V1bWJiYXIsIGxvYWRfcnVudGltZV9yZWcsIGFuZCBzdG9yZV9ydW50aW1lX3JlZyBzaG91bGQgYmUgZGVmaW5lZCBpbgorICogYSBLYWhsdWEtc3BlY2lmaWMgbGlicmFyeSBkZWFsaW5nIHdpdGggdGhlIGVtYmVkZGVkIHV0aWxpdGllcyBtZW1vcnkgYmxvY2suCisgKiBSaWdodCBub3csIGdldF9ldW1iYmFyIGlzIGRlZmluZWQgaW4gZGluazMyL2thaGx1YS5zLiAgVGhlIG90aGVyIHR3byBhcmUKKyAqIGRlZmluZWQgaW4gZGluazMyL2RyaXZlcnMvaTJjL2kyYzIucy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBHbG9iYWxfZXVtYmJhciA9IDA7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgbG9hZF9ydW50aW1lX3JlZyAodW5zaWduZWQgaW50IGV1bWJiYXIsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHJlZyk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3RvcmVfcnVudGltZV9yZWcgKHVuc2lnbmVkIGludCBldW1iYmFyLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEFQSSAqKioqKioqKioqKioqKioqKi8KKworLyogQXBwbGljYXRpb24gUHJvZ3JhbSBJbnRlcmZhY2UgKEFQSSkgYXJlIHRoZSBjYWxscyBwcm92aWRlZCBieSB0aGUgSTJDCisgKiBsaWJyYXJ5IHRvIHVwcGVyIGxheWVyIGFwcGxpY2F0aW9ucyAoaS5lLiwgRElOSykgdG8gYWNjZXNzIHRoZSBLYWhsdWEKKyAqIEkyQyBidXMgaW50ZXJmYWNlLiAgVGhlIGZ1bmN0aW9ucyBhbmQgdmFsdWVzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBBUEkKKyAqIGFyZSBkZWNsYXJlZCBpbiBpMmNfZXhwb3J0LmguCisgKi8KKworLyogIEluaXRpYWxpemUgSTJDIHVuaXQgd2l0aCB0aGUgZm9sbG93aW5nOgorICogIGRyaXZlcidzIHNsYXZlIGFkZHJlc3MKKyAqICBpbnRlcnJ1cHQgZW5hYmxlZAorICogIG9wdGlvbmFsIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gbGF5ZXIgcHJpbnQgZnVuY3Rpb24KKyAqCisgKiAgVGhlc2UgcGFyYW1ldGVycyBtYXkgYmUgYWRkZWQ6CisgKiAgZGVzaXJlZCBjbG9jayByYXRlCisgKiAgZGlnaXRhbCBmaWx0ZXIgZnJlcXVlbmN5IHNhbXBsaW5nIHJhdGUKKyAqCisgKiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgSTJDIHVuaXQgY2FuIGJlIHVzZWQuCisgKi8KK0kyQ19TdGF0dXMgSTJDX0luaXRpYWxpemUgKHVuc2lnbmVkIGNoYXIgYWRkciwKKwkJCSAgIEkyQ19JTlRFUlJVUFRfTU9ERSBlbl9pbnQsCisJCQkgICBpbnQgKCpwKSAoY2hhciAqLCAuLi4pKQoreworCUkyQ1N0YXR1cyBzdGF0dXM7CisKKwkvKiBlc3RhYmxpc2ggdGhlIHBvaW50ZXIsIGlmIHRoZXJlIGlzIG9uZSwgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgInByaW50ZiIgKi8KKwlhcHBfcHJpbnQgPSBwOworCisJLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgZ2V0IHRoZSBlbWJlZGRlZCB1dGlsaXRpZXMgbWVtb3J5IGJsb2NrCisJICogYmFzZSBhZGRyZXNzLiAgSSdtIG5vdCBzdXJlIHdoYXQgdG8gZG8gYWJvdXQgZXJyb3IgaGFuZGxpbmcgaGVyZToKKwkgKiBpZiBhIG5vbi16ZXJvIHZhbHVlIGlzIHJldHVybmVkLCBhY2NlcHQgaXQuCisJICovCisJaWYgKEdsb2JhbF9ldW1iYmFyID09IDApCisJCUdsb2JhbF9ldW1iYmFyID0gZ2V0X2V1bWJiYXIgKCk7CisJaWYgKEdsb2JhbF9ldW1iYmFyID09IDApIHsKKwkJUFJJTlQgKCJJMkNfSW5pdGlhbGl6ZTogY2FuJ3QgZmluZCBFVU1CQkFSXG4iKTsKKwkJcmV0dXJuIEkyQ19FUlJPUjsKKwl9CisKKwkvKiB2YWxpZGF0ZSB0aGUgSTJDIGFkZHJlc3MgKi8KKwlpZiAoYWRkciAmIDB4ODApIHsKKwkJUFJJTlQgKCJJMkNfSW5pdGlhbGl6ZSwgSTJDIGFkZHJlc3MgaW52YWxpZDogICVkIDB4JXhcbiIsCisJCQkgICAodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBhZGRyKTsKKwkJcmV0dXJuIEkyQ19FUlJPUjsKKwl9CisKKwkvKiBDYWxsIHRoZSBpbnRlcm5hbCBJMkMgbGlicmFyeSBmdW5jdGlvbiB0byBwZXJmb3JtIHdvcmsuCisJICogQWNjZXB0IHRoZSBkZWZhdWx0IGZyZXF1ZW5jeSBzYW1wbGluZyByYXRlIChubyB3YXkgdG8gc2V0IGl0IGN1cnJlbnRseSwKKwkgKiB2aWEgSTJDX0luaXQpIGFuZCBzZXQgdGhlIGNsb2NrIGZyZXF1ZW5jeSB0byBzb21ldGhpbmcgcmVhc29uYWJsZS4KKwkgKi8KKwlzdGF0dXMgPSBJMkNfSW5pdCAoR2xvYmFsX2V1bWJiYXIsICh1bnNpZ25lZCBjaGFyKSAweDMxLCBhZGRyLCBlbl9pbnQpOworCWlmIChzdGF0dXMgIT0gSTJDU1VDQ0VTUykgeworCQlQUklOVCAoIkkyQ19Jbml0aWFsaXplOiBlcnJvciBpbiBpbml0aWF0aW9uXG4iKTsKKwkJcmV0dXJuIEkyQ19FUlJPUjsKKwl9CisKKwkvKiBhbGwgaXMgd2VsbCAqLworCXJldHVybiBJMkNfU1VDQ0VTUzsKK30KKworCisvKiBQZXJmb3JtIHRoZSBnaXZlbiBJMkMgdHJhbnNhY3Rpb24sIG9ubHkgTUFTVEVSX1hNSVQgYW5kIE1BU1RFUl9SQ1YKKyAqIGFyZSBpbXBsZW1lbnRlZC4gIEJvdGggYXJlIG9ubHkgaW4gcG9sbGluZyBtb2RlLgorICoKKyAqIGVuX2ludCBjb250cm9scyBpbnRlcnJ1cHQvcG9sbGluZyBtb2RlCisgKiBhY3QgaXMgdGhlIHR5cGUgb2YgdHJhbnNhY3Rpb24KKyAqIGkyY19hZGRyIGlzIHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgc2xhdmUgZGV2aWNlCisgKiBkYXRhX2FkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgb24gdGhlIHNsYXZlIGRldmljZQorICogbGVuIGlzIHRoZSBsZW5ndGggb2YgZGF0YSB0byBzZW5kIG9yIHJlY2VpdmUKKyAqIGJ1ZmZlciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBidWZmZXIKKyAqIHN0b3AgPSBJMkNfTk9fU1RPUCwgZG9uJ3Qgc2lnbmFsIFNUT1AgYXQgZW5kIG9mIHRyYW5zYWN0aW9uCisgKiAgICAgICAgSTJDX1NUT1AsIHNpZ25hbCBTVE9QIGF0IGVuZCBvZiB0cmFuc2FjdGlvbgorICogcmV0cnkgaXMgdGhlIHRpbWVvdXQgcmV0cnkgdmFsdWUsIGN1cnJlbnRseSBpZ25vcmVkCisgKiByc3RhID0gSTJDX05PX1JFU1RBUlQsIHRoaXMgaXMgbm90IGNvbnRpbnVhdGlvbiBvZiBleGlzdGluZyB0cmFuc2FjdGlvbgorICogICAgICAgIEkyQ19SRVNUQVJULCB0aGlzIGlzIGEgY29udGludWF0aW9uIG9mIGV4aXN0aW5nIHRyYW5zYWN0aW9uCisgKi8KK0kyQ19TdGF0dXMgSTJDX2RvX3RyYW5zYWN0aW9uICggSTJDX0lOVEVSUlVQVF9NT0RFIGVuX2ludCwKKwkJCQlJMkNfVFJBTlNBQ1RJT05fTU9ERSBhY3QsCisJCQkJdW5zaWduZWQgY2hhciBpMmNfYWRkciwKKwkJCQl1bnNpZ25lZCBjaGFyIGRhdGFfYWRkciwKKwkJCQlpbnQgbGVuLAorCQkJCWNoYXIgKmJ1ZmZlciwKKwkJCQlJMkNfU1RPUF9NT0RFIHN0b3AsCisJCQkJaW50IHJldHJ5LCBJMkNfUkVTVEFSVF9NT0RFIHJzdGEpCit7CisJSTJDX1N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBkYXRhX2FkZHJfYnVmZmVyWzFdOworCisjaWYgMQorLyogVGhpcyBpcyBhIHRlbXBvcmFyeSB3b3JrLWFyb3VuZC4gIFRoZSBJMkMgbGlicmFyeSBicmVha3MgdGhlIHByb3RvY29sCisgKiBpZiBpdCBhdHRlbXB0cyB0byBoYW5kbGUgYSBkYXRhIHRyYW5zbWlzc2lvbiBpbiBtb3JlIHRoYW4gb25lCisgKiB0cmFuc2FjdGlvbiwgc28gdGhlIGRhdGEgYWRkcmVzcyBhbmQgdGhlIGFjdHVhbCBkYXRhIGJ5dGVzIGFyZSBwdXQKKyAqIGludG8gYSBzaW5nbGUgYnVmZmVyIGJlZm9yZSBzZW5kaW5nIGl0IHRvIHRoZSBsaWJyYXJ5IGludGVybmFsIGZ1bmN0aW9ucy4KKyAqIFRoZSBwcm9ibGVtIGlzIHJlbGF0ZWQgdG8gYmVpbmcgYWJsZSB0byByZXN0YXJ0IGEgdHJhbnNhY3Rpb24gd2l0aG91dAorICogc2VuZGluZyB0aGUgSTJDIGRldmljZSBhZGRyZXNzIG9yIHJlcGVhdGluZyB0aGUgZGF0YSBhZGRyZXNzLiAgSXQgbWF5IHRha2UKKyAqIGEgZGF5IG9yIHR3byB0byBzb3J0IGl0IGFsbCBvdXQsIHNvIEknbGwgaGF2ZSB0byBnZXQgYmFjayB0byBpdCBsYXRlci4KKyAqIExvb2sgYXQgSTJDX1N0YXJ0IHRvIHNlZSBhYm91dCB1c2luZyBzb21lIHN0YXR1cyBmbGFncyAoSSdtIG5vdCBzdXJlIHRoYXQKKyAqICJzdG9wIiBhbmQgInJzdGEiIGFyZSBlbm91Z2ggdG8gcmVmbGVjdCB0aGUgc3RhdGVzLCBtYXliZSBzbzsgYnV0IHRoZSBsb2dpYworICogaW4gdGhlIGxpYnJhcnkgaXMgaW5zdWZmaWNpZW50KSB0byBjb250cm9sIGNvcnJlY3QgaGFuZGxpbmcgb2YgdGhlIHByb3RvY29sLgorICovCisJdW5zaWduZWQgY2hhciBkdW1teV9idWZmZXJbMjU3XTsKKworCWlmIChhY3QgPT0gSTJDX01BU1RFUl9YTUlUKSB7CisJCWludCBpOworCisJCWlmIChsZW4gPiAyNTYpCisJCQlyZXR1cm4gSTJDX0VSUk9SOworCQlmb3IgKGkgPSAxOyBpIDw9IGxlbjsgaSsrKQorCQkJZHVtbXlfYnVmZmVyW2ldID0gYnVmZmVyW2kgLSAxXTsKKwkJZHVtbXlfYnVmZmVyWzBdID0gZGF0YV9hZGRyOworCQlzdGF0dXMgPSBJMkNfZG9fYnVmZmVyIChlbl9pbnQsIGFjdCwgaTJjX2FkZHIsIDEgKyBsZW4sCisJCQkJCWR1bW15X2J1ZmZlciwgc3RvcCwgcmV0cnksIHJzdGEpOworCQlpZiAoc3RhdHVzICE9IEkyQ19TVUNDRVNTKSB7CisJCQlQUklOVCAoIkkyQ19kb190cmFuc2FjdGlvbjogY2FuJ3QgcGVyZm9ybSBkYXRhIHRyYW5zZmVyXG4iKTsKKwkJCXJldHVybiBJMkNfRVJST1I7CisJCX0KKwkJcmV0dXJuIEkyQ19TVUNDRVNTOworCX0KKyNlbmRpZgkvKiBlbmQgb2YgdGVtcCB3b3JrLWFyb3VuZCAqLworCisJLyogdmFsaWRhdGUgcmVxdWVzdGVkIHRyYW5zYWN0aW9uIHR5cGUgKi8KKwlpZiAoKGFjdCAhPSBJMkNfTUFTVEVSX1hNSVQpICYmIChhY3QgIT0gSTJDX01BU1RFUl9SQ1YpKSB7CisJCVBSSU5UICgiSTJDX2RvX3RyYW5zYWN0aW9uLCBpbnZhbGlkIHRyYW5zYWN0aW9uIHJlcXVlc3Q6ICAlZFxuIiwKKwkJCWFjdCk7CisJCXJldHVybiBJMkNfRVJST1I7CisJfQorCisJLyogcmFuZ2UgY2hlY2sgdGhlIEkyQyBhZGRyZXNzICovCisJaWYgKGkyY19hZGRyICYgMHg4MCkgeworCQlQUklOVCAoIkkyQ19kb190cmFuc2FjdGlvbiwgSTJDIGFkZHJlc3Mgb3V0IG9mIHJhbmdlOiAgJWQgMHgleFxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpIGkyY19hZGRyLCAodW5zaWduZWQgaW50KSBpMmNfYWRkcik7CisJCXJldHVybiBJMkNfRVJST1I7CisJfSBlbHNlIHsKKwkJZGF0YV9hZGRyX2J1ZmZlclswXSA9IGRhdGFfYWRkcjsKKwl9CisKKwkvKgorICAgICAgICAgKiBXZSBmaXJzdCBoYXZlIHRvIGNvbnRhY3QgdGhlIHNsYXZlIGRldmljZSBhbmQgdHJhbnNtaXQgdGhlCisgICAgICAgICAqIGRhdGEgYWRkcmVzcy4gQmUgY2FyZWZ1bCBhYm91dCB0aGUgU1RPUCBhbmQgcmVzdGFydCBzdHVmZi4KKyAgICAgICAgICogV2UgZG9uJ3Qgd2FudCB0byBzaWduYWwgU1RPUCBhZnRlciBzZW5kaW5nIHRoZSBkYXRhCisgICAgICAgICAqIGFkZHJlc3MsIGJ1dCB0aGlzIGNvdWxkIGJlIGEgY29udGludWF0aW9uIGlmIHRoZQorICAgICAgICAgKiBhcHBsaWNhdGlvbiBkaWRuJ3QgcmVsZWFzZSB0aGUgYnVzIGFmdGVyIHRoZSBwcmV2aW91cworICAgICAgICAgKiB0cmFuc2FjdGlvbiwgYnkgbm90IHNlbmRpbmcgYSBTVE9QIGFmdGVyIGl0LgorCSAqLworCXN0YXR1cyA9IEkyQ19kb19idWZmZXIgKGVuX2ludCwgSTJDX01BU1RFUl9YTUlULCBpMmNfYWRkciwgMSwKKwkJCQlkYXRhX2FkZHJfYnVmZmVyLCBJMkNfTk9fU1RPUCwgcmV0cnksIHJzdGEpOworCWlmIChzdGF0dXMgIT0gSTJDX1NVQ0NFU1MpIHsKKwkJUFJJTlQgKCJJMkNfZG9fdHJhbnNhY3Rpb246IGNhbid0IHNlbmQgZGF0YSBhZGRyZXNzIGZvciByZWFkXG4iKTsKKwkJcmV0dXJuIEkyQ19FUlJPUjsKKwl9CisKKwkvKiBUaGUgZGF0YSB0cmFuc2ZlciB3aWxsIGJlIGEgY29udGludWF0aW9uLiAqLworCXJzdGEgPSBJMkNfUkVTVEFSVDsKKworCS8qIG5vdyBoYW5kbGUgdGhlIHVzZXIgZGF0YSAqLworCXN0YXR1cyA9IEkyQ19kb19idWZmZXIgKGVuX2ludCwgYWN0LCBpMmNfYWRkciwgbGVuLAorCQkJCWJ1ZmZlciwgc3RvcCwgcmV0cnksIHJzdGEpOworCWlmIChzdGF0dXMgIT0gSTJDX1NVQ0NFU1MpIHsKKwkJUFJJTlQgKCJJMkNfZG9fdHJhbnNhY3Rpb246IGNhbid0IHBlcmZvcm0gZGF0YSB0cmFuc2ZlclxuIik7CisJCXJldHVybiBJMkNfRVJST1I7CisJfQorCisJLyogYWxsIGlzIHdlbGwgKi8KKwlyZXR1cm4gSTJDX1NVQ0NFU1M7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIHdvcmsgZm9yIEkyQ19kb190cmFuc2FjdGlvbi4gIFRoZSB3b3JrIGlzCisgKiBzcGxpdCBpbnRvIHRoaXMgZnVuY3Rpb24gdG8gZW5hYmxlIEkyQ19kb190cmFuc2FjdGlvbiB0byBmaXJzdCB0cmFuc21pdAorICogdGhlIGRhdGEgYWRkcmVzcyB0byB0aGUgSTJDIHNsYXZlIGRldmljZSB3aXRob3V0IHB1dHRpbmcgdGhlIGRhdGEgYWRkcmVzcworICogaW50byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYnVmZmVyLgorICoKKyAqIGVuX2ludCBjb250cm9scyBpbnRlcnJ1cHQvcG9sbGluZyBtb2RlCisgKiBhY3QgaXMgdGhlIHR5cGUgb2YgdHJhbnNhY3Rpb24KKyAqIGkyY19hZGRyIGlzIHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgc2xhdmUgZGV2aWNlCisgKiBsZW4gaXMgdGhlIGxlbmd0aCBvZiBkYXRhIHRvIHNlbmQgb3IgcmVjZWl2ZQorICogYnVmZmVyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIGJ1ZmZlcgorICogc3RvcCA9IEkyQ19OT19TVE9QLCBkb24ndCBzaWduYWwgU1RPUCBhdCBlbmQgb2YgdHJhbnNhY3Rpb24KKyAqICAgICAgICBJMkNfU1RPUCwgc2lnbmFsIFNUT1AgYXQgZW5kIG9mIHRyYW5zYWN0aW9uCisgKiByZXRyeSBpcyB0aGUgdGltZW91dCByZXRyeSB2YWx1ZSwgY3VycmVudGx5IGlnbm9yZWQKKyAqIHJzdGEgPSBJMkNfTk9fUkVTVEFSVCwgdGhpcyBpcyBub3QgY29udGludWF0aW9uIG9mIGV4aXN0aW5nIHRyYW5zYWN0aW9uCisgKiAgICAgICAgSTJDX1JFU1RBUlQsIHRoaXMgaXMgYSBjb250aW51YXRpb24gb2YgZXhpc3RpbmcgdHJhbnNhY3Rpb24KKyAqLworc3RhdGljIEkyQ19TdGF0dXMgSTJDX2RvX2J1ZmZlciAoSTJDX0lOVEVSUlVQVF9NT0RFIGVuX2ludCwKKwkJCQkgSTJDX1RSQU5TQUNUSU9OX01PREUgYWN0LAorCQkJCSB1bnNpZ25lZCBjaGFyIGkyY19hZGRyLAorCQkJCSBpbnQgbGVuLAorCQkJCSB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJCQkJIEkyQ19TVE9QX01PREUgc3RvcCwKKwkJCQkgaW50IHJldHJ5LCBJMkNfUkVTVEFSVF9NT0RFIHJzdGEpCit7CisJSTJDU3RhdHVzIHJ2YWw7CisJdW5zaWduZWQgaW50IGRldl9zdGF0OworCisJaWYgKGFjdCA9PSBJMkNfTUFTVEVSX1JDVikgeworCQkvKiBzZXQgdXAgZm9yIG1hc3Rlci1yZWNlaXZlIHRyYW5zYWN0aW9uICovCisJCXJ2YWwgPSBJMkNfZ2V0IChHbG9iYWxfZXVtYmJhciwgaTJjX2FkZHIsIGJ1ZmZlciwgbGVuLCBzdG9wLCByc3RhKTsKKwl9IGVsc2UgeworCQkvKiBzZXQgdXAgZm9yIG1hc3Rlci10cmFuc21pdCB0cmFuc2FjdGlvbiAqLworCQlydmFsID0gSTJDX3B1dCAoR2xvYmFsX2V1bWJiYXIsIGkyY19hZGRyLCBidWZmZXIsIGxlbiwgc3RvcCwgcnN0YSk7CisJfQorCisJLyogdmFsaWRhdGUgdGhlIHNldHVwICovCisJaWYgKHJ2YWwgIT0gSTJDU1VDQ0VTUykgeworCQlkZXZfc3RhdCA9IGxvYWRfcnVudGltZV9yZWcgKEdsb2JhbF9ldW1iYmFyLCBJMkNTUik7CisJCVBSSU5UICgiRXJyb3IoSTJDX2RvX2J1ZmZlcik6IGNvbnRyb2wgcGhhc2UsIGNvZGUoMHglMDh4KSwgc3RhdHVzKDB4JTA4eClcbiIsIHJ2YWwsIGRldl9zdGF0KTsKKwkJSTJDX1N0b3AgKEdsb2JhbF9ldW1iYmFyKTsKKwkJcmV0dXJuIEkyQ19FUlJPUjsKKwl9CisKKwlpZiAoZW5faW50ID09IDEpIHsKKwkJLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgbm8gaW50ZXJydXB0IGhhbmRsaW5nIHlldCAqLworCQlyZXR1cm4gSTJDX1NVQ0NFU1M7CisJfQorCisJLyogdGhpcyBwZXJmb3JtcyB0aGUgcG9sbGluZyBhY3Rpb24sIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlZCwKKwkgKiB0aGUgc3RhdHVzIHJldHVybmVkIGZyb20gSTJDX1RpbWVyX0V2ZW50IHdpbGwgYmUgSTJDQlVGRkZVTEwgb3IKKwkgKiBJMkNCVUZGRU1QVFkgKHJjdiBvciB4bWl0KSwgSTJDU1VDQ0VTUyBvciBJMkNBRERSRVNTIGluZGljYXRlcyB0aGUKKwkgKiB0cmFuc2FjdGlvbiBpcyBub3QgeWV0IGNvbXBsZXRlLCBhbnl0aGluZyBlbHNlIGlzIGFuIGVycm9yLgorCSAqLworCXdoaWxlIChydmFsID09IEkyQ1NVQ0NFU1MgfHwgcnZhbCA9PSBJMkNBRERSRVNTKSB7CisJCWludCB0aW1ldmFsID0gZ2V0X3RpbWVyICgwKTsKKworCQkvKiBwb2xsIHRoZSBkZXZpY2UgdW50aWwgc29tZXRoaW5nIGhhcHBlbnMgKi8KKwkJZG8geworCQkJcnZhbCA9IEkyQ19UaW1lcl9FdmVudCAoR2xvYmFsX2V1bWJiYXIsIDApOworCQl9CisJCXdoaWxlIChydmFsID09IEkyQ05PRVZFTlQgJiYgZ2V0X3RpbWVyICh0aW1ldmFsKSA8IFRJTUVPVVQpOworCisJCS8qIGNoZWNrIGZvciBlcnJvciBjb25kaXRpb24gKi8KKwkJaWYgKHJ2YWwgPT0gSTJDU1VDQ0VTUyAgIHx8CisJCSAgICBydmFsID09IEkyQ0JVRkZGVUxMICB8fAorCQkgICAgcnZhbCA9PSBJMkNCVUZGRU1QVFkgfHwKKwkJICAgIHJ2YWwgPT0gSTJDQUREUkVTUykgeworCQkJOwkvKiBkbyBub3RoaW5nICovCisJCX0gZWxzZSB7CisJCQkvKiByZXBvcnQgdGhlIGVycm9yIGNvbmRpdGlvbiAqLworCQkJZGV2X3N0YXQgPSBsb2FkX3J1bnRpbWVfcmVnIChHbG9iYWxfZXVtYmJhciwgSTJDU1IpOworCQkJUFJJTlQgKCJFcnJvcihJMkNfZG9fYnVmZmVyKTogIGNvZGUoMHglMDh4KSwgc3RhdHVzKDB4JTA4eClcbiIsCisJCQkJICAgcnZhbCwgZGV2X3N0YXQpOworCQkJcmV0dXJuIEkyQ19FUlJPUjsKKwkJfQorCX0KKworCS8qIGFsbCBpcyB3ZWxsICovCisJcmV0dXJuIEkyQ19TVUNDRVNTOworfQorCisvKioKKyAqIE5vdGU6CisgKgorICogSW4gYWxsIGZvbGxvd2luZyBmdW5jdGlvbnMsCisgKiB0aGUgY2FsbGVyIHNoYWxsIHBhc3MgdGhlIGNvbmZpZ3VyZWQgZW1iZWRkZWQgdXRpbGl0eSBtZW1vcnkKKyAqIGJsb2NrIGJhc2UsIEVVTUJCQVIuCisgKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IEkyQ19wdXQKKyAqCisgKiBkZXNjcmlwdGlvbjoKKyAgIFNlbmQgYSBidWZmZXIgb2YgZGF0YSB0byB0aGUgaW50ZW5kZWQgcmN2X2FkZHIuCisgKiBJZiBzdG9wX2ZsYWcgaXMgc2V0LCBhZnRlciB0aGUgd2hvbGUgYnVmZmVyCisgKiBpcyBzZW50LCBnZW5lcmF0ZSBhIFNUT1Agc2lnbmFsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiByZWNlaXZlciBkb2Vzbid0IHNpZ25hbCB0aGUgU1RPUCBpbiB0aGUgbWlkZGxlLgorICogSTJDIGlzIHRoZSBtYXN0ZXIgcGVyZm9ybWluZyB0cmFuc21pdHRpbmcuIElmCisgKiBubyBTVE9QIHNpZ25hbCBpcyBnZW5lcmF0ZWQgYXQgdGhlIGVuZCBvZiBjdXJyZW50CisgKiB0cmFuc2FjdGlvbiwgdGhlIG1hc3RlciBjYW4gZ2VuZXJhdGUgYSBTVEFSVCBzaWduYWwKKyAqIHRvIGFub3RoZXIgc2xhdmUgYWRkci4KKyAqCisgKiBub3RlOiB0aGlzIGlzIG1hc3RlciB4bWl0IEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJMkNTdGF0dXMgSTJDX3B1dCAodW5zaWduZWQgaW50IGV1bWJiYXIsIHVuc2lnbmVkIGNoYXIgcmN2X2FkZHIsCS8qIHJlY2VpdmVyJ3MgYWRkcmVzcyAqLworCSAgdW5zaWduZWQgY2hhciAqYnVmZmVyX3B0ciwJLyogcG9pbnRlciBvZiBkYXRhIHRvIGJlIHNlbnQgKi8KKwkgIHVuc2lnbmVkIGludCBsZW5ndGgsCS8qIG51bWJlciBvZiBieXRlIG9mIGluIHRoZSBidWZmZXIgKi8KKwkgIHVuc2lnbmVkIGludCBzdG9wX2ZsYWcsCS8qIDEgLSBzaWduYWwgU1RPUCB3aGVuIGJ1ZmZlciBpcyBlbXB0eQorCQkJCQkgKiAwIC0gbm8gU1RPUCBzaWduYWwgd2hlbiBidWZmZXIgaXMgZW1wdHkKKwkJCQkJICovCisJICB1bnNpZ25lZCBpbnQgaXNfY250KQorewkJCQkJLyogMSAtIHRoaXMgaXMgYSByZXN0YXJ0LCBkb24ndCBjaGVjayBNQkIKKwkJCQkJICogMCAtIHRoaXMgaXMgYSBuZXcgc3RhcnQsIGNoZWNrIE1CQgorCQkJCQkgKi8KKwlpZiAoYnVmZmVyX3B0ciA9PSAwIHx8IGxlbmd0aCA9PSAwKSB7CisJCXJldHVybiBJMkNFUlJPUjsKKwl9CisjaWZkZWYgSTJDREJHMAorCVBSSU5UICgiJXMoJWQpOiBJMkNfcHV0XG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworI2VuZGlmCisKKwlYbWl0Qnl0ZSA9IDA7CisJQnl0ZVRvWG1pdCA9IGxlbmd0aDsKKwlYbWl0QnVmID0gYnVmZmVyX3B0cjsKKwlYbWl0QnVmRW1wdHlTdG9wID0gc3RvcF9mbGFnOworCisJUmN2Qnl0ZSA9IDA7CisJQnl0ZVRvUmN2ID0gMDsKKwlSY3ZCdWYgPSAwOworCisJLyogd2UgYXJlIHRoZSBtYXN0ZXIsIHN0YXJ0IHRyYW5zYWN0aW9uICovCisJcmV0dXJuIEkyQ19TdGFydCAoZXVtYmJhciwgcmN2X2FkZHIsIFhNSVQsIGlzX2NudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IEkyQ19nZXQKKyAqCisgKiBkZXNjcmlwdGlvbjoKKyAqIFJlY2VpdmUgYSBidWZmZXIgb2YgZGF0YSBmcm9tIHRoZSBkZXNpcmVkIHNlbmRlcl9hZGRyCisgKiBJZiBzdG9wX2ZsYWcgaXMgc2V0LCB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbCBhbmQgdGhlCisgKiBzZW5kZXIgZG9lcyBub3Qgc2lnbmFsIFNUT1AsIGdlbmVyYXRlIGEgU1RPUCBzaWduYWwuCisgKiBJMkMgaXMgdGhlIG1hc3RlciBwZXJmb3JtaW5nIHJlY2VpdmluZy4gSWYgbm8gU1RPUCBzaWduYWwKKyAqIGlzIGdlbmVyYXRlZCwgdGhlIG1hc3RlciBjYW4gZ2VuZXJhdGUgYSBTVEFSVCBzaWduYWwKKyAqIHRvIGFub3RoZXIgc2xhdmUgYWRkci4KKyAqCisgKiBub3RlOiB0aGlzIGlzIG1hc3RlciByZWNlaXZlIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSTJDU3RhdHVzIEkyQ19nZXQgKHVuc2lnbmVkIGludCBldW1iYmFyLCB1bnNpZ25lZCBjaGFyIHJjdl9mcm9tLAkvKiBzZW5kZXIncyBhZGRyZXNzICovCisJCSAgdW5zaWduZWQgY2hhciAqYnVmZmVyX3B0ciwJLyogcG9pbnRlciBvZiByZWNlaXZpbmcgYnVmZmVyICovCisJCSAgdW5zaWduZWQgaW50IGxlbmd0aCwJLyogbGVuZ3RoIG9mIHRoZSByZWNlaXZpbmcgYnVmZmVyICovCisJCSAgdW5zaWduZWQgaW50IHN0b3BfZmxhZywJLyogMSAtIHNpZ25hbCBTVE9QIHdoZW4gYnVmZmVyIGlzIGZ1bGwKKwkJCQkJCSAqIDAgLSBubyBTVE9QIHNpZ25hbCB3aGVuIGJ1ZmZlciBpcyBmdWxsCisJCQkJCQkgKi8KKwkJICB1bnNpZ25lZCBpbnQgaXNfY250KQorewkJCQkJCS8qIDEgLSB0aGlzIGlzIGEgcmVzdGFydCwgZG9uJ3QgY2hlY2sgTUJCCisJCQkJCQkgKiAwIC0gdGhpcyBpcyBhIG5ldyBzdGFydCwgY2hlY2sgTUJCCisJCQkJCQkgKi8KKwlpZiAoYnVmZmVyX3B0ciA9PSAwIHx8IGxlbmd0aCA9PSAwKSB7CisJCXJldHVybiBJMkNFUlJPUjsKKwl9CisjaWZkZWYgSTJDREJHMAorCVBSSU5UICgiJXMoJWQpOiBJMkNfZ2V0XG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworI2VuZGlmCisKKwlSY3ZCeXRlID0gMDsKKwlCeXRlVG9SY3YgPSBsZW5ndGg7CisJUmN2QnVmID0gYnVmZmVyX3B0cjsKKwlSY3ZCdWZGdWxTdG9wID0gc3RvcF9mbGFnOworCisJWG1pdEJ5dGUgPSAwOworCUJ5dGVUb1htaXQgPSAwOworCVhtaXRCdWYgPSAwOworCisJLyogd2UgYXJlIHRoZSBtYXN0ZXIsIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbiAqLworCXJldHVybiBJMkNfU3RhcnQgKGV1bWJiYXIsIHJjdl9mcm9tLCBSQ1YsIGlzX2NudCk7CisKK30KKworI2lmIDAJLyogdHVybiBvZmYgZGVhZCBjb2RlICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogSTJDX3dyaXRlCisgKgorICogZGVzY3JpcHRpb246CisgKiBTZW5kIGEgYnVmZmVyIG9mIGRhdGEgdG8gdGhlIHJlcXVpcmluZyBtYXN0ZXIuCisgKiBJZiBzdG9wX2ZsYWcgaXMgc2V0LCBhZnRlciB0aGUgd2hvbGUgYnVmZmVyIGlzIHNlbnQsCisgKiBnZW5lcmF0ZSBhIFNUT1Agc2lnbmFsIHByb3ZpZGVkIHRoYXQgdGhlIHJlcXVpcmluZworICogcmVjZWl2ZXIgZG9lc24ndCBzaWduYWwgdGhlIFNUT1AgaW4gdGhlIG1pZGRsZS4KKyAqIEkyQyBpcyB0aGUgc2xhdmUgcGVyZm9ybWluZyB0cmFuc21pdHRpbmcuCisgKgorICogTm90ZTogdGhpcyBpcyBzbGF2ZSB4bWl0IEFQSS4KKyAqCisgKiAgICAgICBkdWUgdG8gdGhlIGN1cnJlbnQgS2FobHVhIGRlc2lnbiwgc2xhdmUgdHJhbnNtaXR0ZXIKKyAqICAgICAgIHNoYWxsIG5vdCBzaWduYWwgU1RPUCBzaW5jZSB0aGVyZSBpcyBubyB3YXkKKyAqICAgICAgIGZvciBtYXN0ZXIgdG8gZGV0ZWN0IGl0LCBjYXVzaW5nIEkyQyBidXMgaHVuZy4KKyAqCisgKiAgICAgICBGb3IgdGhlIGFib3ZlIHJlYXNvbiwgdGhlIHN0b3BfZmxhZyBpcyBhbHdheXMKKyAqICAgICAgIHNldCwgaS5lLiwgMC4KKyAqCisgKiAgICAgICBwcm9ncmFtbWVyIHNoYWxsIHVzZSB0aGUgdGltZXIgb24gS2FobHVhIHRvCisgKiAgICAgICBjb250cm9sIHRoZSBpbnRlcnZhbCBvZiBkYXRhIGJ5dGUgYXQgdGhlCisgKiAgICAgICBtYXN0ZXIgc2lkZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEkyQ1N0YXR1cyBJMkNfd3JpdGUgKHVuc2lnbmVkIGludCBldW1iYmFyLCB1bnNpZ25lZCBjaGFyICpidWZmZXJfcHRyLAkvKiBwb2ludGVyIG9mIGRhdGEgdG8gYmUgc2VudCAqLworCQl1bnNpZ25lZCBpbnQgbGVuZ3RoLAkvKiBudW1iZXIgb2YgYnl0ZSBvZiBpbiB0aGUgYnVmZmVyICovCisJCXVuc2lnbmVkIGludCBzdG9wX2ZsYWcpCit7CQkJCQkvKiAxIC0gc2lnbmFsIFNUT1Agd2hlbiBidWZmZXIgaXMgZW1wdHkKKwkJCQkJICogMCAtIG5vIFNUT1Agc2lnbmFsIHdoZW4gYnVmZmVyIGlzIGVtcHR5CisJCQkJCSAqLworCWlmIChidWZmZXJfcHRyID09IDAgfHwgbGVuZ3RoID09IDApIHsKKwkJcmV0dXJuIEkyQ0VSUk9SOworCX0KKworCVhtaXRCeXRlID0gMDsKKwlCeXRlVG9YbWl0ID0gbGVuZ3RoOworCVhtaXRCdWYgPSBidWZmZXJfcHRyOworCVhtaXRCdWZFbXB0eVN0b3AgPSAwOwkvKiBpbiBvcmRlciB0byBhdm9pZCBidXMgaHVuZywgaWdub3JlZCB0aGUgdXNlcidzIHN0b3BfZmxhZyAqLworCisJUmN2Qnl0ZSA9IDA7CisJQnl0ZVRvUmN2ID0gMDsKKwlSY3ZCdWYgPSAwOworCisJLyogd2UgYXJlIHRoZSBzbGF2ZSwganVzdCB3YWl0IGZvciBiZWluZyBjYWxsZWQsIG9yIHB1bGwgKi8KKwkvKiBJMkNfVGltZXJfRXZlbnQoIGV1bWJiYXIgKTsgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IEkyQ19yZWFkCisgKgorICogZGVzY3JpcHRpb246CisgKiBSZWNlaXZlIGEgYnVmZmVyIG9mIGRhdGEgZnJvbSB0aGUgc2VuZGluZyBtYXN0ZXIuCisgKiBJZiBzdG9wX2ZsYWcgaXMgc2V0LCB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbCBhbmQgdGhlCisgKiBzZW5kZXIgZG9lcyBub3Qgc2lnbmFsIFNUT1AsIGdlbmVyYXRlIGEgU1RPUCBzaWduYWwuCisgKiBJMkMgaXMgdGhlIHNsYXZlIHBlcmZvcm1pbmcgcmVjZWl2aW5nLgorICoKKyAqIG5vdGU6IHRoaXMgaXMgc2xhdmUgcmVjZWl2ZSBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEkyQ1N0YXR1cyBJMkNfcmVhZCAodW5zaWduZWQgaW50IGV1bWJiYXIsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcl9wdHIsCS8qIHBvaW50ZXIgb2YgcmVjZWl2aW5nIGJ1ZmZlciAqLworCQkgICB1bnNpZ25lZCBpbnQgbGVuZ3RoLAkvKiBsZW5ndGggb2YgdGhlIHJlY2VpdmluZyBidWZmZXIgKi8KKwkJICAgdW5zaWduZWQgaW50IHN0b3BfZmxhZykKK3sJCQkJCS8qIDEgLSBzaWduYWwgU1RPUCB3aGVuIGJ1ZmZlciBpcyBmdWxsCisJCQkJCSAqIDAgLSBubyBTVE9QIHNpZ25hbCB3aGVuIGJ1ZmZlciBpcyBmdWxsCisJCQkJCSAqLworCWlmIChidWZmZXJfcHRyID09IDAgfHwgbGVuZ3RoID09IDApIHsKKwkJcmV0dXJuIEkyQ0VSUk9SOworCX0KKworCVJjdkJ5dGUgPSAwOworCUJ5dGVUb1JjdiA9IGxlbmd0aDsKKwlSY3ZCdWYgPSBidWZmZXJfcHRyOworCVJjdkJ1ZkZ1bFN0b3AgPSBzdG9wX2ZsYWc7CisKKwlYbWl0Qnl0ZSA9IDA7CisJQnl0ZVRvWG1pdCA9IDA7CisJWG1pdEJ1ZiA9IDA7CisKKwkvKiB3YWl0IGZvciBtYXN0ZXIgdG8gY2FsbCB1cywgb3IgcG9sbCAqLworCS8qIEkyQ19UaW1lcl9FdmVudCggZXVtYmJhciApOyAqLworfQorI2VuZGlmCS8qIHR1cm4gb2ZmIGRlYWQgY29kZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogSTJjX1RpbWVyX0V2ZW50CisgKgorICogZGVzY3JpcHRpb246CisgKiBpZiBpbnRlcnJ1cHQgaXMgbm90IHVzZWQsIHRoaXMgaXMgdGhlIHRpbWVyIGV2ZW50IGhhbmRsZXIuCisgKiBBZnRlciBlYWNoIGZpeGVkIHRpbWUgaW50ZXJ2YWwsIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZAorICogdG8gY2hlY2sgdGhlIEkyQyBzdGF0dXMgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gdG8KKyAqIGhhbmRsZSB0aGUgc3RhdHVzIGV2ZW50LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEkyQ1N0YXR1cyBJMkNfVGltZXJfRXZlbnQgKHVuc2lnbmVkIGludCBldW1iYmFyLAorCQkJCSAgSTJDU3RhdHVzICgqaGFuZGxlcikgKHVuc2lnbmVkIGludCkpCit7CisJSTJDX1NUQVQgc3RhdDsKKworI2lmZGVmIEkyQ0RCRzAKKwlQUklOVCAoIiVzKCVkKTogSTJDX1RpbWVyX0V2ZW50XG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworI2VuZGlmCisKKwlzdGF0ID0gSTJDX0dldF9TdGF0IChldW1iYmFyKTsKKworCWlmIChzdGF0Lm1pZiA9PSAxKSB7CisJCWlmIChoYW5kbGVyID09IDApIHsKKwkJCXJldHVybiBJMkNfSVNSIChldW1iYmFyKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAoKmhhbmRsZXIpIChldW1iYmFyKTsKKwkJfQorCX0KKworCXJldHVybiBJMkNOT0VWRU5UOworfQorCisKKy8qKioqKioqKioqKioqKioqKiogRGV2aWNlIEkvTyBmdW5jdGlvbiAqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IEkyQ19TdGFydAorICoKKyAqIGRlc2NyaXB0aW9uOiBHZW5lcmF0ZSBhIFNUQVJUIHNpZ25hbCBpbiB0aGUgZGVzaXJlZCBtb2RlLgorICogICAgICAgICAgICAgIEkyQyBpcyB0aGUgbWFzdGVyLgorICoKKyAqICAgICAgICAgICAgICBSZXR1cm4gSTJDU1VDQ0VTUyBpZiBubyBlcnJvci4KKyAqCisgKiBub3RlOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSTJDU3RhdHVzIEkyQ19TdGFydCAodW5zaWduZWQgaW50IGV1bWJiYXIsIHVuc2lnbmVkIGNoYXIgc2xhdmVfYWRkciwJLyogYWRkcmVzcyBvZiB0aGUgcmVjZWl2ZXIgKi8KKwkJCUkyQ19NT0RFIG1vZGUsCS8qIFhNSVQoMSkgLSBwdXQgKHdyaXRlKQorCQkJCQkgKiBSQ1YoMCkgIC0gZ2V0IChyZWFkKQorCQkJCQkgKi8KKwkJCXVuc2lnbmVkIGludCBpc19jbnQpCit7CQkJCQkvKiAxIC0gdGhpcyBpcyBhIHJlc3RhcnQsIGRvbid0IGNoZWNrIE1CQgorCQkJCQkgKiAwIC0gdGhpcyBpcyBhIG5ldyBzdGFydAorCQkJCQkgKi8KKwl1bnNpZ25lZCBpbnQgdG1wID0gMDsKKwlJMkNfU1RBVCBzdGF0OworCUkyQ19DVFJMIGN0cmw7CisKKyNpZmRlZiBJMkNEQkcwCisJUFJJTlQgKCIlcyglZCk6IEkyQ19TdGFydCBhZGRyIDB4JXggbW9kZSAlZCBjbnQgJWRcbiIsIF9fRklMRV9fLAorCQkgICBfX0xJTkVfXywgc2xhdmVfYWRkciwgbW9kZSwgaXNfY250KTsKKyNlbmRpZgorCisJY3RybCA9IEkyQ19HZXRfQ3RybCAoZXVtYmJhcik7CisKKwkvKiBmaXJzdCBtYWtlIHN1cmUgSTJDIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisJaWYgKGN0cmwubWVuID09IDApIHsKKwkJcmV0dXJuIEkyQ0VSUk9SOworCX0KKworCS8qIG5leHQgbWFrZSBzdXJlIGJ1cyBpcyBpZGxlICovCisJc3RhdCA9IEkyQ19HZXRfU3RhdCAoZXVtYmJhcik7CisKKwlpZiAoaXNfY250ID09IDAgJiYgc3RhdC5tYmIgPT0gMSkgeworCQkvKiBzb3JyeSwgd2UgbG9zdCAqLworCQlyZXR1cm4gSTJDQlVTQlVTWTsKKwl9IGVsc2UgaWYgKGlzX2NudCA9PSAxICYmIHN0YXQubWlmID09IDEgJiYgc3RhdC5tYWwgPT0gMCkgeworCQkvKiBzb3JyeSwgd2UgbG9zdCB0aGUgYnVzICovCisJCXJldHVybiBJMkNBTE9TUzsKKwl9CisKKworCS8qIE9LLCBJMkMgaXMgZW5hYmxlZCBhbmQgd2UgaGF2ZSB0aGUgYnVzICovCisKKwkvKiBwcmVwYXJlIHRvIHdyaXRlIHRoZSBzbGF2ZSBhZGRyZXNzICovCisJY3RybC5tc3RhID0gMTsKKwljdHJsLm10eCA9IDE7CisJY3RybC50eGFrID0gMDsKKwljdHJsLnJzdGEgPSBpc19jbnQ7CQkvKiBzZXQgdGhlIHJlcGVhdCBzdGFydCBiaXQgKi8KKwlJMkNfU2V0X0N0cmwgKGV1bWJiYXIsIGN0cmwpOworCisJLyogd3JpdGUgdGhlIHNsYXZlIGFkZHJlc3MgYW5kIHhtaXQvcmN2IG1vZGUgYml0ICovCisJdG1wID0gbG9hZF9ydW50aW1lX3JlZyAoZXVtYmJhciwgSTJDRFIpOworCXRtcCA9ICh0bXAgJiAweGZmZmZmZjAwKSB8CisJICAgICAgKChzbGF2ZV9hZGRyICYgMHgwMDdmKSA8PCAxKSB8CisJICAgICAgKG1vZGUgPT0gWE1JVCA/IDB4MCA6IDB4MSk7CisJc3RvcmVfcnVudGltZV9yZWcgKGV1bWJiYXIsIEkyQ0RSLCB0bXApOworCisJaWYgKG1vZGUgPT0gUkNWKSB7CisJCU1hc3RlclJjdkFkZHJlc3MgPSAxOworCX0gZWxzZSB7CisJCU1hc3RlclJjdkFkZHJlc3MgPSAwOworCX0KKworI2lmZGVmIEkyQ0RCRzAKKwlQUklOVCAoIiVzKCVkKTogSTJDX1N0YXJ0IGV4aXRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisjZW5kaWYKKworCS8qIHdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQgb3IgcG9sbCAgKi8KKwlyZXR1cm4gSTJDU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogSTJjX1N0b3AKKyAqCisgKiBkZXNjcmlwdGlvbjogR2VuZXJhdGUgYSBTVE9QIHNpZ25hbCB0byB0ZXJtaW5hdGUgdGhlIG1hc3RlcgorICogICAgICAgICAgICAgIHRyYW5zYWN0aW9uLgorICogICAgICAgICAgICAgIHJldHVybiBJMkNTVUNDRVNTCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSTJDU3RhdHVzIEkyQ19TdG9wICh1bnNpZ25lZCBpbnQgZXVtYmJhcikKK3sKKwlJMkNfQ1RSTCBjdHJsOworCisjaWZkZWYgSTJDREJHMAorCVBSSU5UICgiJXMoJWQpOiBJMkNfU3RvcCBlbnRlclxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKyNlbmRpZgorCisJY3RybCA9IEkyQ19HZXRfQ3RybCAoZXVtYmJhcik7CisJY3RybC5tc3RhID0gMDsKKwlJMkNfU2V0X0N0cmwgKGV1bWJiYXIsIGN0cmwpOworCisjaWZkZWYgSTJDREJHMAorCVBSSU5UICgiJXMoJWQpOiBJMkNfU3RvcCBleGl0XG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworI2VuZGlmCisKKwlyZXR1cm4gSTJDU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uOiBJMkNfTWFzdGVyX1htaXQKKyAqCisgKiBkZXNjcmlwdGlvbjogTWFzdGVyIHNlbmRzIG9uZSBieXRlIG9mIGRhdGEgdG8KKyAqICAgICAgICAgICAgICBzbGF2ZSB0YXJnZXQKKyAqCisgKiAgICAgICAgICAgICAgcmV0dXJuIEkyQ1NVQ0NFU1MgaWYgdGhlIGJ5dGUgdHJhbnNtaXR0ZWQuCisgKiAgICAgICAgICAgICAgT3RoZXJ3aXNlIG5vLXplcm8KKyAqCisgKiBOb3RlOiBjb25kaXRpb24gbXVzdCBtZWV0IHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQ6CisgKiAgICAgICBJMkNTUihNSUYpID09IDEgJiYgSTJDU1IoTUNGKSAgPT0gMSAgJiYgSTJDU1IoUlhBSykgPT0gMAorICogICAgICAgSTJDQ1IoTVNUQSkgPT0gMSAgJiYgSTJDQ1IoTVRYKSA9PSAxCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJMkNTdGF0dXMgSTJDX01hc3Rlcl9YbWl0ICh1bnNpZ25lZCBpbnQgZXVtYmJhcikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKEJ5dGVUb1htaXQgPiAwKSB7CisKKwkJaWYgKEJ5dGVUb1htaXQgPT0gWG1pdEJ5dGUpIHsKKwkJCS8qIGFsbCB4bWl0dGVkICovCisJCQlCeXRlVG9YbWl0ID0gMDsKKworCQkJaWYgKFhtaXRCdWZFbXB0eVN0b3AgPT0gMSkgeworCQkJCUkyQ19TdG9wIChldW1iYmFyKTsKKwkJCX0KKworCQkJcmV0dXJuIEkyQ0JVRkZFTVBUWTsKKworCQl9CisjaWZkZWYgSTJDREJHMAorCQlQUklOVCAoIiVzKCVkKTogeG1pdCAweCUwMnhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywKKwkJCSAgICooWG1pdEJ1ZiArIFhtaXRCeXRlKSk7CisjZW5kaWYKKworCQl2YWwgPSAqKFhtaXRCdWYgKyBYbWl0Qnl0ZSk7CisJCXZhbCAmPSAweDAwMDAwMGZmOworCQlzdG9yZV9ydW50aW1lX3JlZyAoZXVtYmJhciwgSTJDRFIsIHZhbCk7CisJCVhtaXRCeXRlKys7CisKKwkJcmV0dXJuIEkyQ1NVQ0NFU1M7CisKKwl9CisKKwlyZXR1cm4gSTJDQlVGRkVNUFRZOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uOiBJMkNfTWFzdGVyX1JjdgorICoKKyAqIGRlc2NyaXB0aW9uOiBtYXN0ZXIgcmVhZHMgb25lIGJ5dGUgZGF0YQorICogICAgICAgICAgICAgIGZyb20gc2xhdmUgc291cmNlCisgKgorICogICAgICAgICAgICAgIHJldHVybiBJMkNTVUNDRVNTIGlmIG5vIGVycm9yCisgKgorICogTm90ZTogY29uZGl0aW9uIG11c3QgbWVldCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkOgorICogICAgICAgSTJDU1IoTUlGKSA9PSAxICYmIEkyQ1NSKE1DRikgPT0gMSAmJgorICogICAgICAgSTJDQ1IoTVNUQSkgPT0gMSAmJiBJMkNDUihNVFgpID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSTJDU3RhdHVzIEkyQ19NYXN0ZXJfUmN2ICh1bnNpZ25lZCBpbnQgZXVtYmJhcikKK3sKKwlJMkNfQ1RSTCBjdHJsOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoQnl0ZVRvUmN2ID4gMCkgeworCisJCWlmIChCeXRlVG9SY3YgLSBSY3ZCeXRlID09IDIgJiYgUmN2QnVmRnVsU3RvcCA9PSAxKSB7CisJCQkvKiBtYXN0ZXIgcmVxdWVzdHMgbW9yZSB0aGFuIG9yIGVxdWFsIHRvIDIgYnl0ZXMKKwkJCSAqIHdlIGFyZSByZWFkaW5nIDJuZCB0byBsYXN0IGJ5dGUKKwkJCSAqLworCisJCQkvKiB3ZSBuZWVkIHRvIHNldCBJMkNDUihUWEFLKSB0byBnZW5lcmF0ZSBhIFNUT1AgKi8KKwkJCWN0cmwgPSBJMkNfR2V0X0N0cmwgKGV1bWJiYXIpOworCQkJY3RybC50eGFrID0gMTsKKwkJCUkyQ19TZXRfQ3RybCAoZXVtYmJhciwgY3RybCk7CisKKwkJCS8qIEthaGx1YSB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBTVE9QCisJCQkgKiBuZXh0IHRpbWUgYSB0cmFuc2FjdGlvbiBoYXBwZW5zCisJCQkgKi8KKworCQkJLyogbm90ZTogdGhlIGNhc2Ugb2YgbWFzdGVyIHJlcXVlc3Rpbmcgb25lIGJ5dGUgaXMKKwkJCSAqICAgICAgIGhhbmRsZWQgaW4gSTJDX0lTUgorCQkJICovCisJCX0KKworCQkvKiBnZW5lcmF0IGEgU1RPUCBiZWZvcmUgcmVhZGluZyB0aGUgbGFzdCBieXRlICovCisJCWlmIChSY3ZCeXRlICsgMSA9PSBCeXRlVG9SY3YgJiYgUmN2QnVmRnVsU3RvcCA9PSAxKSB7CisJCQlJMkNfU3RvcCAoZXVtYmJhcik7CisJCX0KKworCQl2YWwgPSBsb2FkX3J1bnRpbWVfcmVnIChldW1iYmFyLCBJMkNEUik7CisJCSooUmN2QnVmICsgUmN2Qnl0ZSkgPSB2YWwgJiAweEZGOworCisjaWZkZWYgSTJDREJHMAorCQlQUklOVCAoIiVzKCVkKTogcmN2IDB4JTAyeFxuIiwgX19GSUxFX18sIF9fTElORV9fLAorCQkJICAgKihSY3ZCdWYgKyBSY3ZCeXRlKSk7CisjZW5kaWYKKworCQlSY3ZCeXRlKys7CisKKwkJaWYgKEJ5dGVUb1JjdiA9PSBSY3ZCeXRlKSB7CisJCQlCeXRlVG9SY3YgPSAwOworCisJCQlyZXR1cm4gSTJDQlVGRkZVTEw7CisJCX0KKworCQlyZXR1cm4gSTJDU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gSTJDQlVGRkZVTEw7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uOiBJMkNfU2xhdmVfWG1pdAorICoKKyAqIGRlc2NyaXB0aW9uOiBTbGF2ZSBzZW5kcyBvbmUgYnl0ZSBvZiBkYXRhIHRvCisgKiAgICAgICAgICAgICAgcmVxdWVzdGluZyBkZXN0aW5hdGlvbgorICoKKyAqICAgICAgICByZXR1cm4gU1VDQ0VTUyBpZiB0aGUgYnl0ZSB0cmFuc21pdHRlZC4gT3RoZXJ3aXNlCisgKiAgICAgICAgTm8temVybworICoKKyAqIE5vdGU6IGNvbmRpdGlvbiBtdXN0IG1lZXQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZDoKKyAqICAgICAgIEkyQ1NSKE1JRikgPT0gMSAmJiBJMkNTUihNQ0YpID09IDEgJiYgIEkyQ1NSKFJYQUspID0gMAorICogICAgICAgSTJDQ1IoTVNUQSkgPT0gMCAgJiYgSTJDQ1IoTVRYKSA9PSAxCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJMkNTdGF0dXMgSTJDX1NsYXZlX1htaXQgKHVuc2lnbmVkIGludCBldW1iYmFyKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoQnl0ZVRvWG1pdCA+IDApIHsKKworCQlpZiAoQnl0ZVRvWG1pdCA9PSBYbWl0Qnl0ZSkgeworCQkJLyogbm8gbW9yZSBkYXRhIHRvIHNlbmQgKi8KKwkJCUJ5dGVUb1htaXQgPSAwOworCisJCQkvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogZG8gbm90IHRvZ2dsZSBJMkNDUihNVFgpLiBEb2luZyBzbyB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYXVzZSBidXMtaHVuZyBzaW5jZSBjdXJyZW50IEthaGx1YSBkZXNpZ24KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGRvZXMgbm90IGdpdmUgbWFzdGVyIGEgd2F5IHRvIGRldGVjdCBzbGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogc3RvcC4gSXQgaXMgYWx3YXlzIGEgZ29vZCBpZGVhIGZvciBtYXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHVzZSB0aW1lciB0byBwcmV2ZW50IHRoZSBsb25nIGxvbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGRlbGF5cworCQkJICovCisKKwkJCXJldHVybiBJMkNCVUZGRU1QVFk7CisJCX0KKyNpZmRlZiBJMkNEQkcKKwkJUFJJTlQgKCIlcyglZCk6IHhtaXQgMHglMDJ4XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sCisJCQkgICAqKFhtaXRCdWYgKyBYbWl0Qnl0ZSkpOworI2VuZGlmCisKKwkJdmFsID0gKihYbWl0QnVmICsgWG1pdEJ5dGUpOworCQl2YWwgJj0gMHgwMDAwMDBmZjsKKwkJc3RvcmVfcnVudGltZV9yZWcgKGV1bWJiYXIsIEkyQ0RSLCB2YWwpOworCQlYbWl0Qnl0ZSsrOworCisJCXJldHVybiBJMkNTVUNDRVNTOworCX0KKworCXJldHVybiBJMkNCVUZGRU1QVFk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IEkyQ19TbGF2ZV9SY3YKKyAqCisgKiBkZXNjcmlwdGlvbjogc2xhdmUgcmVhZHMgb25lIGJ5dGUgZGF0YQorICogICAgICAgICAgICAgIGZyb20gbWFzdGVyIHNvdXJjZQorICoKKyAqICAgICAgICAgICAgICByZXR1cm4gSTJDU1VDQ0VTUyBpZiBubyBlcnJvciBvdGhlcndpc2Ugbm9uLXplcm8KKyAqCisgKiBOb3RlOiBjb25kaXRpb24gbXVzdCBtZWV0IHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQ6CisgKiAgICAgICBJMkNTUihNSUYpID09IDEgJiYgSTJDU1IoTUNGKSA9PSAxICYmCisgKiAgICAgICBJMkNDUihNU1RBKSA9PSAwICYmIEkyQ0NSKE1UWCkgID0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJMkNTdGF0dXMgSTJDX1NsYXZlX1JjdiAodW5zaWduZWQgaW50IGV1bWJiYXIpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlJMkNfQ1RSTCBjdHJsOworCisJaWYgKEJ5dGVUb1JjdiA+IDApIHsKKwkJdmFsID0gbG9hZF9ydW50aW1lX3JlZyAoZXVtYmJhciwgSTJDRFIpOworCQkqKFJjdkJ1ZiArIFJjdkJ5dGUpID0gdmFsICYgMHhmZjsKKyNpZmRlZiBJMkNEQkcKKwkJUFJJTlQgKCIlcyglZCk6IHJjdiAweCUwMnhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywKKwkJCSAgICooUmN2QnVmICsgUmN2Qnl0ZSkpOworI2VuZGlmCisJCVJjdkJ5dGUrKzsKKworCQlpZiAoQnl0ZVRvUmN2ID09IFJjdkJ5dGUpIHsKKwkJCWlmIChSY3ZCdWZGdWxTdG9wID09IDEpIHsKKwkJCQkvKiBhbGwgZG9uZSAqLworCQkJCWN0cmwgPSBJMkNfR2V0X0N0cmwgKGV1bWJiYXIpOworCQkJCWN0cmwudHhhayA9IDE7CisJCQkJSTJDX1NldF9DdHJsIChldW1iYmFyLCBjdHJsKTsKKwkJCX0KKworCQkJQnl0ZVRvUmN2ID0gMDsKKwkJCXJldHVybiBJMkNCVUZGRlVMTDsKKwkJfQorCisJCXJldHVybiBJMkNTVUNDRVNTOworCX0KKworCXJldHVybiBJMkNCVUZGRlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKiBEZXZpY2UgQ29udHJvbCBGdW5jdGlvbiAqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogSTJDX0luaXQKKyAqCisgKiBkZXNjcmlwdGlvbjogSW5pdGlhbGl6ZSBJMkMgdW5pdCB3aXRoIGRlc2lyZWQgZnJlcXVlbmN5IGRpdmlkZXIsCisgKiAgICAgICAgICAgICAgbWFzdGVyJ3MgbGlzdGVuaW5nIGFkZHJlc3MsIHdpdGggaW50ZXJydXB0IGVuYWJsZWQKKyAqICAgICAgICAgICAgICBvciBkaXNhYmxlZC4KKyAqCisgKiBub3RlOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEkyQ1N0YXR1cyBJMkNfSW5pdCAodW5zaWduZWQgaW50IGV1bWJiYXIsIHVuc2lnbmVkIGNoYXIgZmRyLAkvKiBmcmVxdWVuY3kgZGl2aWRlciAqLworCQkgICB1bnNpZ25lZCBjaGFyIHNsYXZlX2FkZHIsCS8qIGRyaXZlcidzIGFkZHJlc3MgdXNlZCBmb3IgcmVjZWl2aW5nICovCisJCSAgIHVuc2lnbmVkIGludCBlbl9pbnQpCit7CQkJCQkJLyogMSAtIGVuYWJsZSBJMkMgaW50ZXJydXB0CisJCQkJCQkgKiAwIC0gZGlzYWJsZSBJMkMgaW50ZXJydXAKKwkJCQkJCSAqLworCUkyQ19DVFJMIGN0cmw7CisJdW5zaWduZWQgaW50IHRtcDsKKworI2lmZGVmIEkyQ0RCRzAKKwlQUklOVCAoIiVzKCVkKTogSTJDX0luaXQgZW50ZXJcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisjZW5kaWYKKworCWN0cmwgPSBJMkNfR2V0X0N0cmwgKGV1bWJiYXIpOworCS8qIGRpc2FibGUgdGhlIEkyQyBtb2R1bGUgYmVmb3JlIHdlIGNoYW5nZSBldmVyeXRoaW5nICovCisJY3RybC5tZW4gPSAwOworCUkyQ19TZXRfQ3RybCAoZXVtYmJhciwgY3RybCk7CisKKwkvKiBzZXQgdGhlIGZyZXF1ZW5jeSBkaXZlciAqLworCXRtcCA9IGxvYWRfcnVudGltZV9yZWcgKGV1bWJiYXIsIEkyQ0ZEUik7CisJdG1wID0gKHRtcCAmIDB4ZmZmZmZmYzApIHwgKGZkciAmIDB4M2YpOworCXN0b3JlX3J1bnRpbWVfcmVnIChldW1iYmFyLCBJMkNGRFIsIHRtcCk7CisKKwkvKiBTZXQgb3VyIGxpc3RlbmluZyAoc2xhdmUpIGFkZHJlc3MgKi8KKwl0bXAgPSBsb2FkX3J1bnRpbWVfcmVnIChldW1iYmFyLCBJMkNBRFIpOworCXRtcCA9ICh0bXAgJiAweGZmZmZmZjAxKSB8ICgoc2xhdmVfYWRkciAmIDB4N2YpIDw8IDEpOworCXN0b3JlX3J1bnRpbWVfcmVnIChldW1iYmFyLCBJMkNBRFIsIHRtcCk7CisKKwkvKiBlbmFibGUgSTJDIHdpdGggZGVzaXJlZCBpbnRlcnJ1cHQgc2V0dGluZyAqLworCWN0cmwubWVuID0gMTsKKwljdHJsLm1pZW4gPSBlbl9pbnQgJiAweDE7CisJSTJDX1NldF9DdHJsIChldW1iYmFyLCBjdHJsKTsKKyNpZmRlZiBJMkNEQkcwCisJUFJJTlQgKCIlcyglZCk6IEkyQ19Jbml0IGV4aXRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisjZW5kaWYKKworCXJldHVybiBJMkNTVUNDRVNTOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb24gSTJjX0dldF9TdGF0CisgKgorICogZGVzY3JpcHRpb246IFF1ZXJ5IEkyQyBTdGF0dXMsIGkuZS4sIHJlYWQgSTJDU1IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJMkNfU1RBVCBJMkNfR2V0X1N0YXQgKHVuc2lnbmVkIGludCBldW1iYmFyKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCUkyQ19TVEFUIHN0YXQ7CisKKwl0ZW1wID0gbG9hZF9ydW50aW1lX3JlZyAoZXVtYmJhciwgSTJDU1IpOworCisjaWZkZWYgSTJDREJHMAorCVBSSU5UICgiJXMoJWQpOiBnZXQgc3RhdCA9IDB4JTA4eFxuIiwgX19GSUxFX18sIF9fTElORV9fLCB0ZW1wKTsKKyNlbmRpZgorCisJc3RhdC5yc3J2MCA9ICh0ZW1wICYgMHhmZmZmZmYwMCkgPj4gODsKKwlzdGF0Lm1jZiAgID0gKHRlbXAgJiAweDAwMDAwMDgwKSA+PiA3OworCXN0YXQubWFhcyAgPSAodGVtcCAmIDB4MDAwMDAwNDApID4+IDY7CisJc3RhdC5tYmIgICA9ICh0ZW1wICYgMHgwMDAwMDAyMCkgPj4gNTsKKwlzdGF0Lm1hbCAgID0gKHRlbXAgJiAweDAwMDAwMDEwKSA+PiA0OworCXN0YXQucnNydjEgPSAodGVtcCAmIDB4MDAwMDAwMDgpID4+IDM7CisJc3RhdC5zcncgICA9ICh0ZW1wICYgMHgwMDAwMDAwNCkgPj4gMjsKKwlzdGF0Lm1pZiAgID0gKHRlbXAgJiAweDAwMDAwMDAyKSA+PiAxOworCXN0YXQucnhhayAgPSAodGVtcCAmIDB4MDAwMDAwMDEpOworCXJldHVybiBzdGF0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogSTJjX1NldF9DdHJsCisgKgorICogZGVzY3JpcHRpb246IENoYW5nZSBJMkMgQ29udHJvbCBiaXRzLAorICogICAgICAgICAgICAgIGkuZS4sIHdyaXRlIHRvIEkyQ0NSCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgSTJDX1NldF9DdHJsICh1bnNpZ25lZCBpbnQgZXVtYmJhciwgSTJDX0NUUkwgY3RybCkKK3sJCQkJCQkvKiBuZXcgY29udHJvbCB2YWx1ZSAqLworCXVuc2lnbmVkIGludCB0ZW1wID0gbG9hZF9ydW50aW1lX3JlZyAoZXVtYmJhciwgSTJDQ1IpOworCisJdGVtcCAmPSAweGZmZmZmZjAzOworCXRlbXAgfD0gKChjdHJsLm1lbiAgJiAweDEpIDw8IDcpOworCXRlbXAgfD0gKChjdHJsLm1pZW4gJiAweDEpIDw8IDYpOworCXRlbXAgfD0gKChjdHJsLm1zdGEgJiAweDEpIDw8IDUpOworCXRlbXAgfD0gKChjdHJsLm10eCAgJiAweDEpIDw8IDQpOworCXRlbXAgfD0gKChjdHJsLnR4YWsgJiAweDEpIDw8IDMpOworCXRlbXAgfD0gKChjdHJsLnJzdGEgJiAweDEpIDw8IDIpOworI2lmZGVmIEkyQ0RCRzAKKwlQUklOVCAoIiVzKCVkKTogc2V0IGN0cmwgPSAweCUwOHhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgdGVtcCk7CisjZW5kaWYKKwlzdG9yZV9ydW50aW1lX3JlZyAoZXVtYmJhciwgSTJDQ1IsIHRlbXApOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IEkyQ19HZXRfQ3RybAorICoKKyAqIGRlc2NyaXB0aW9uOiBRdWVyeSBJMkMgQ29udHJvbCBiaXRzLAorICogICAgICAgICAgICAgIGkuZS4sIHJlYWQgSTJDQ1IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJMkNfQ1RSTCBJMkNfR2V0X0N0cmwgKHVuc2lnbmVkIGludCBldW1iYmFyKQoreworCXVuaW9uIHsKKwkJSTJDX0NUUkwgY3RybDsKKwkJdW5zaWduZWQgaW50IHRlbXA7CisJfSBzOworCisJcy50ZW1wID0gbG9hZF9ydW50aW1lX3JlZyAoZXVtYmJhciwgSTJDQ1IpOworI2lmZGVmIEkyQ0RCRzAKKwlQUklOVCAoIiVzKCVkKTogZ2V0IGN0cmwgPSAweCUwOHhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcy50ZW1wKTsKKyNlbmRpZgorCisJcmV0dXJuIHMuY3RybDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IEkyQ19TbGF2ZV9BZGRyCisgKgorICogZGVzY3JpcHRpb246IFByb2Nlc3Mgc2xhdmUgYWRkcmVzcyBwaGFzZS4KKyAqICAgICAgICAgICAgICByZXR1cm4gSTJDU1VDQ0VTUyBpZiBubyBlcnJvcgorICoKKyAqIG5vdGU6IFByZWNvbmRpdGlvbiBmb3IgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgorICogICAgICAgSTJDU1IoTUlGKSA9PSAxICYmCisgKiAgICAgICBJMkNTUihNQUFTKSA9PSAxCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJMkNTdGF0dXMgSTJDX1NsYXZlX0FkZHIgKHVuc2lnbmVkIGludCBldW1iYmFyKQoreworCUkyQ19TVEFUIHN0YXQgPSBJMkNfR2V0X1N0YXQgKGV1bWJiYXIpOworCUkyQ19DVFJMIGN0cmwgPSBJMkNfR2V0X0N0cmwgKGV1bWJiYXIpOworCisJaWYgKHN0YXQuc3J3ID09IDEpIHsKKwkJLyogd2UgYXJlIGFza2VkIHRvIHhtaXQgKi8KKwkJY3RybC5tdHggPSAxOworCQlJMkNfU2V0X0N0cmwgKGV1bWJiYXIsIGN0cmwpOwkvKiBzZXQgTVRYICovCisJCXJldHVybiBJMkNfU2xhdmVfWG1pdCAoZXVtYmJhcik7CisJfQorCisJLyogd2UgYXJlIGFza2VkIHRvIHJlY2VpdmUgZGF0YSAqLworCWN0cmwubXR4ID0gMDsKKwlJMkNfU2V0X0N0cmwgKGV1bWJiYXIsIGN0cmwpOworCSh2b2lkKSBsb2FkX3J1bnRpbWVfcmVnIChldW1iYmFyLCBJMkNEUik7CS8qIGRvIGEgZmFrZSByZWFkIHRvIHN0YXJ0ICovCisKKwlyZXR1cm4gSTJDQUREUkVTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogSTJDX0lTUgorICoKKyAqIGRlc2NyaXB0aW9uOiBJMkMgSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICoKKyAqIG5vdGU6IFByZWNvbmRpdGlvbjoKKyAqICAgICAgSTJDU1IoTUlGKSA9PSAxCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJMkNTdGF0dXMgSTJDX0lTUiAodW5zaWduZWQgaW50IGV1bWJiYXIpCit7CisJSTJDX1NUQVQgc3RhdDsKKwlJMkNfQ1RSTCBjdHJsOworCisjaWZkZWYgSTJDREJHMAorCVBSSU5UICgiJXMoJWQpOiBJMkNfSVNSXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworI2VuZGlmCisKKwlzdGF0ID0gSTJDX0dldF9TdGF0IChldW1iYmFyKTsKKwljdHJsID0gSTJDX0dldF9DdHJsIChldW1iYmFyKTsKKworCS8qIGNsZWFyIE1JRiAqLworCXN0YXQubWlmID0gMDsKKworCS8qIE5vdyBsZXQgc2VlIHdoYXQga2luZCBvZiBldmVudCB0aGlzIGlzICovCisJaWYgKHN0YXQubWNmID09IDEpIHsKKwkJLyogdHJhbnNmZXIgY29tcGV0ZSAqLworCisJCS8qIGNsZWFyIHRoZSBNSUYgYml0ICovCisJCUkyQ19TZXRfU3RhdCAoZXVtYmJhciwgc3RhdCk7CisKKwkJaWYgKGN0cmwubXN0YSA9PSAxKSB7CisJCQkvKiBtYXN0ZXIgKi8KKwkJCWlmIChjdHJsLm10eCA9PSAxKSB7CisJCQkJLyogY2hlY2sgaWYgdGhpcyBpcyB0aGUgYWRkcmVzcyBwaGFzZSBmb3IgbWFzdGVyIHJlY2VpdmUgKi8KKwkJCQlpZiAoTWFzdGVyUmN2QWRkcmVzcyA9PSAxKSB7CisJCQkJCS8qIFllcywgaXQgaXMgdGhlIGFkZHJlc3MgcGhhc2Ugb2YgbWFzdGVyIHJlY2VpdmUgKi8KKwkJCQkJY3RybC5tdHggPSAwOworCQkJCQkvKiBub3cgY2hlY2sgaG93IG11Y2ggd2Ugd2FudCB0byByZWNlaXZlICovCisJCQkJCWlmIChCeXRlVG9SY3YgPT0gMSAmJiBSY3ZCdWZGdWxTdG9wID09IDEpIHsKKwkJCQkJCWN0cmwudHhhayA9IDE7CisJCQkJCX0KKworCQkJCQlJMkNfU2V0X0N0cmwgKGV1bWJiYXIsIGN0cmwpOworCQkJCQkodm9pZCkgbG9hZF9ydW50aW1lX3JlZyAoZXVtYmJhciwgSTJDRFIpOwkvKiBmYWtlIHJlYWQgZmlyc3QgKi8KKworCQkJCQlNYXN0ZXJSY3ZBZGRyZXNzID0gMDsKKwkJCQkJcmV0dXJuIEkyQ0FERFJFU1M7CisKKwkJCQl9CisKKwkJCQkvKiBtYXN0ZXIgeG1pdCAqLworCQkJCWlmIChzdGF0LnJ4YWsgPT0gMCkgeworCQkJCQkvKiBzbGF2ZSBoYXMgYWNrbm93bGVkZ2VkICovCisJCQkJCXJldHVybiBJMkNfTWFzdGVyX1htaXQgKGV1bWJiYXIpOworCQkJCX0KKworCQkJCS8qIHNsYXZlIGhhcyBub3QgYWNrbm93bGVkZ2VkIHlldCwgZ2VuZXJhdGUgYSBTVE9QICovCisJCQkJaWYgKFhtaXRCdWZFbXB0eVN0b3AgPT0gMSkgeworCQkJCQljdHJsLm1zdGEgPSAwOworCQkJCQlJMkNfU2V0X0N0cmwgKGV1bWJiYXIsIGN0cmwpOworCQkJCX0KKworCQkJCXJldHVybiBJMkNTVUNDRVNTOworCQkJfQorCisJCQkvKiBtYXN0ZXIgcmVjZWl2ZSAqLworCQkJcmV0dXJuIEkyQ19NYXN0ZXJfUmN2IChldW1iYmFyKTsKKwkJfQorCisJCS8qIHNsYXZlICovCisJCWlmIChjdHJsLm10eCA9PSAxKSB7CisJCQkvKiBzbGF2ZSB4bWl0ICovCisJCQlpZiAoc3RhdC5yeGFrID09IDApIHsKKwkJCQkvKiBtYXN0ZXIgaGFzIGFja25vd2xlZGdlZCAqLworCQkJCXJldHVybiBJMkNfU2xhdmVfWG1pdCAoZXVtYmJhcik7CisJCQl9CisKKwkJCS8qIG1hc3RlciBoYXMgbm90IGFja25vd2xlZGdlZCwgd2FpdCBmb3IgU1RPUCAqLworCQkJLyogZG8gbm90aGluZyBmb3IgcHJldmVudGluZyBidXMgZnJvbSBodW5nICovCisJCQlyZXR1cm4gSTJDU1VDQ0VTUzsKKwkJfQorCisJCS8qIHNsYXZlIHJjdiAqLworCQlyZXR1cm4gSTJDX1NsYXZlX1JjdiAoZXVtYmJhcik7CisKKwl9IGVsc2UgaWYgKHN0YXQubWFhcyA9PSAxKSB7CisJCS8qIHJlY2VpdmVkIGEgY2FsbCBmcm9tIG1hc3RlciAqLworCisJCS8qIGNsZWFyIHRoZSBNSUYgYml0ICovCisJCUkyQ19TZXRfU3RhdCAoZXVtYmJhciwgc3RhdCk7CisKKwkJLyogbWFzdGVyIGlzIGNhbGxpbmcgdXMsIHByb2Nlc3MgdGhlIGFkZHJlc3MgcGhhc2UgKi8KKwkJcmV0dXJuIEkyQ19TbGF2ZV9BZGRyIChldW1iYmFyKTsKKwl9IGVsc2UgeworCQkvKiBoYXMgdG8gYmUgYXJiaXRyYXRpb24gbG9zdCAqLworCQlzdGF0Lm1hbCA9IDA7CisJCUkyQ19TZXRfU3RhdCAoZXVtYmJhciwgc3RhdCk7CisKKwkJY3RybC5tc3RhID0gMDsJCQkvKiByZXR1cm4gdG8gcmVjZWl2ZSBtb2RlICovCisJCUkyQ19TZXRfQ3RybCAoZXVtYmJhciwgY3RybCk7CisJfQorCisJcmV0dXJuIEkyQ1NVQ0NFU1M7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IEkyQ19TZXRfU3RhdAorICoKKyAqIGRlc2NyaXB0aW9uOiBtb2RpZnkgdGhlIEkyQ1NSCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgSTJDX1NldF9TdGF0ICh1bnNpZ25lZCBpbnQgZXVtYmJhciwgSTJDX1NUQVQgc3RhdCkKK3sKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGludCB2YWw7CisJCUkyQ19TVEFUIHN0YXQ7CisJfSBzX3RtcDsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGludCB2YWw7CisJCUkyQ19TVEFUIHN0YXQ7CisJfSBzOworCisJcy52YWwgPSBsb2FkX3J1bnRpbWVfcmVnIChldW1iYmFyLCBJMkNTUik7CisJcy52YWwgJj0gMHhmZmZmZmYwODsKKwlzX3RtcC5zdGF0ID0gc3RhdDsKKwlzLnZhbCB8PSAoc190bXAudmFsICYgMHhmNyk7CisKKyNpZmRlZiBJMkNEQkcwCisJUFJJTlQgKCIlcyglZCk6IHNldCBzdGF0ID0gMHglMDh4XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIHMudmFsKTsKKyNlbmRpZgorCisJc3RvcmVfcnVudGltZV9yZWcgKGV1bWJiYXIsIEkyQ1NSLCBzLnZhbCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIGZvbGxvd2luZyBhcmUgcm91dGluZXMgdG8gZ2x1ZSB0aGUgcmVzdCBvZgorICogVS1Cb290IHRvIHRoZSBTYW5kcG9pbnQgSTJDIGRyaXZlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBpMmNfaW5pdCAoaW50IHNwZWVkLCBpbnQgc2xhdmVhZGQpCit7CisjaWZkZWYgREVCVUcKKwlJMkNfSW5pdGlhbGl6ZSAoMHg3ZiwgMCwgKHZvaWQgKikgcHJpbnRmKTsKKyNlbHNlCisJSTJDX0luaXRpYWxpemUgKDB4N2YsIDAsIDApOworI2VuZGlmCit9CisKK2ludCBpMmNfcHJvYmUgKHVjaGFyIGNoaXApCit7CisJaW50IHRtcDsKKworCS8qCisJICogVHJ5IHRvIHJlYWQgdGhlIGZpcnN0IGxvY2F0aW9uIG9mIHRoZSBjaGlwLiAgVGhlIHVuZGVybHlpbmcKKwkgKiBkcml2ZXIgZG9lc24ndCBhcHBlYXIgdG8gc3VwcG9ydCBzZW5kaW5nIGp1c3QgdGhlIGNoaXAgYWRkcmVzcworCSAqIGFuZCBsb29raW5nIGZvciBhbiA8QUNLPiBiYWNrLgorCSAqLworCXVkZWxheSgxMDAwMCk7CisJcmV0dXJuIGkyY19yZWFkIChjaGlwLCAwLCAxLCAoY2hhciAqKSZ0bXAsIDEpOworfQorCitpbnQgaTJjX3JlYWQgKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICogYnVmZmVyLCBpbnQgbGVuKQoreworCUkyQ1N0YXR1cyBzdGF0dXM7CisJdWNoYXIgeGFkZHJbNF07CisKKwlpZiAoYWxlbiA+IDApIHsKKwkJeGFkZHJbMF0gPSAoYWRkciA+PiAyNCkgJiAweEZGOworCQl4YWRkclsxXSA9IChhZGRyID4+IDE2KSAmIDB4RkY7CisJCXhhZGRyWzJdID0gKGFkZHIgPj4gOCkgJiAweEZGOworCQl4YWRkclszXSA9IGFkZHIgJiAweEZGOworCisJCXN0YXR1cyA9IEkyQ19kb19idWZmZXIgKDAsIEkyQ19NQVNURVJfWE1JVCwgY2hpcCwgYWxlbiwKKwkJCQkJJnhhZGRyWzQgLSBhbGVuXSwgSTJDX05PX1NUT1AsIDEsCisJCQkJCUkyQ19OT19SRVNUQVJUKTsKKwkJaWYgKHN0YXR1cyAhPSBJMkNfU1VDQ0VTUykgeworCQkJUFJJTlQgKCJpMmNfcmVhZDogY2FuJ3Qgc2VuZCBkYXRhIGFkZHJlc3MgZm9yIHJlYWRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKiBUaGUgZGF0YSB0cmFuc2ZlciB3aWxsIGJlIGEgY29udGludWF0aW9uLiAqLworCXN0YXR1cyA9IEkyQ19kb19idWZmZXIgKDAsIEkyQ19NQVNURVJfUkNWLCBjaGlwLCBsZW4sCisJCQkJYnVmZmVyLCBJMkNfU1RPUCwgMSwgKGFsZW4gPiAwID8gSTJDX1JFU1RBUlQgOgorCQkJCUkyQ19OT19SRVNUQVJUKSk7CisKKwlpZiAoc3RhdHVzICE9IEkyQ19TVUNDRVNTKSB7CisJCVBSSU5UICgiaTJjX3JlYWQ6IGNhbid0IHBlcmZvcm0gZGF0YSB0cmFuc2ZlclxuIik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaTJjX3dyaXRlICh1Y2hhciBjaGlwLCB1aW50IGFkZHIsIGludCBhbGVuLCB1Y2hhciAqIGJ1ZmZlciwgaW50IGxlbikKK3sKKwlJMkNTdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgZHVtbXlfYnVmZmVyW0kyQ19SWFRYX0xFTiArIDJdOworCWludCBpOworCisJZHVtbXlfYnVmZmVyWzBdID0gYWRkciAmIDB4RkY7CisJaWYgKGFsZW4gPT0gMikKKwkJZHVtbXlfYnVmZmVyWzFdID0gKGFkZHIgPj4gOCkgJiAweEZGOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJZHVtbXlfYnVmZmVyW2kgKyBhbGVuXSA9IGJ1ZmZlcltpXTsKKworCXN0YXR1cyA9IEkyQ19kb19idWZmZXIgKDAsIEkyQ19NQVNURVJfWE1JVCwgY2hpcCwgYWxlbiArIGxlbiwKKwkJCQlkdW1teV9idWZmZXIsIEkyQ19TVE9QLCAxLCBJMkNfTk9fUkVTVEFSVCk7CisKKyNpZmRlZiBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfREVMQVlfTVMKKwl1ZGVsYXkoQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TICogMTAwMCk7CisjZW5kaWYKKwlpZiAoc3RhdHVzICE9IEkyQ19TVUNDRVNTKSB7CisJCVBSSU5UICgiaTJjX3dyaXRlOiBjYW4ndCBwZXJmb3JtIGRhdGEgdHJhbnNmZXJcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordWNoYXIgaTJjX3JlZ19yZWFkICh1Y2hhciBpMmNfYWRkciwgdWNoYXIgcmVnKQoreworCWNoYXIgYnVmWzFdOworCisJaTJjX2luaXQgKDAsIDApOworCisJaTJjX3JlYWQgKGkyY19hZGRyLCByZWcsIDEsIGJ1ZiwgMSk7CisKKwlyZXR1cm4gKGJ1ZlswXSk7Cit9CisKK3ZvaWQgaTJjX3JlZ193cml0ZSAodWNoYXIgaTJjX2FkZHIsIHVjaGFyIHJlZywgdWNoYXIgdmFsKQoreworCWkyY19pbml0ICgwLCAwKTsKKworCWkyY193cml0ZSAoaTJjX2FkZHIsIHJlZywgMSwgJnZhbCwgMSk7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfSEFSRF9JMkMgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjR4L3BjaS5jIGIvY3B1L21wYzgyNHgvcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzYzRjMwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM4MjR4L3BjaS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBhcmNoL3BwYy9rZXJuZWwvbXBjMTB4X2NvbW1vbi5jCisgKgorICogQ29tbW9uIHJvdXRpbmVzIGZvciB0aGUgTW90b3JvbGEgU1BTIE1QQzEwNiwgTVBDMTA3IGFuZCBNUEM4MjQwIEhvc3QgYnJpZGdlLAorICogTWVtIGN0bHIsIEVQSUMsIGV0Yy4KKyAqCisgKiBBdXRob3I6IE1hcmsgQS4gR3JlZXIKKyAqICAgICAgICAgbWdyZWVyQG12aXN0YS5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19QQ0kKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxtcGM4MjR4Lmg+CisKK3ZvaWQgcGNpX21wYzgyNHhfaW5pdCAoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKKwlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKKworCS8qIFN5c3RlbSBtZW1vcnkgc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJICAgICAgIENIUlBfUENJX01FTU9SWV9CVVMsCisJCSAgICAgICBDSFJQX1BDSV9NRU1PUllfUEhZUywKKwkJICAgICAgIENIUlBfUENJX01FTU9SWV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKwkvKiBQQ0kgbWVtb3J5IHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCSAgICAgICBDSFJQX1BDSV9NRU1fQlVTLAorCQkgICAgICAgQ0hSUF9QQ0lfTUVNX1BIWVMsCisJCSAgICAgICBDSFJQX1BDSV9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIElTQS9QQ0kgbWVtb3J5IHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCSAgICAgICBDSFJQX0lTQV9NRU1fQlVTLAorCQkgICAgICAgQ0hSUF9JU0FfTUVNX1BIWVMsCisJCSAgICAgICBDSFJQX0lTQV9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIFBDSSBJL08gc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywKKwkJICAgICAgIENIUlBfUENJX0lPX0JVUywKKwkJICAgICAgIENIUlBfUENJX0lPX1BIWVMsCisJCSAgICAgICBDSFJQX1BDSV9JT19TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkvKiBJU0EvUENJIEkvTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyA0LAorCQkgICAgICAgQ0hSUF9JU0FfSU9fQlVTLAorCQkgICAgICAgQ0hSUF9JU0FfSU9fUEhZUywKKwkJICAgICAgIENIUlBfSVNBX0lPX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKworCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDU7CisKKwlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwKKwkJCSAgIENIUlBfUkVHX0FERFIsCisJCQkgICBDSFJQX1JFR19EQVRBKTsKKworCXBjaV9yZWdpc3Rlcl9ob3NlKGhvc2UpOworCisJaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNHgvc3RhcnQuUyBiL2NwdS9tcGM4MjR4L3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5NzA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM4MjR4L3N0YXJ0LlMKQEAgLTAsMCArMSw4MzUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4CURhbiBNYWxlayA8ZG1hbGVrQGpsYy5uZXQ+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk5CU1hZ251cyBEYW1tIDxraWVyYXlwYzAxLnAueS5raWUuZXJhLmVyaWNzc29uLnNlPgorICogIENvcHlyaWdodCAoQykgMjAwMCwyMDAxLDIwMDIgV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBVLUJvb3QgLSBTdGFydHVwIENvZGUgZm9yIFBvd2VyUEMgYmFzZWQgRW1iZWRkZWQgQm9hcmRzCisgKgorICoKKyAqIFRoZSBwcm9jZXNzb3Igc3RhcnRzIGF0IDB4MDAwMDAxMDAgYW5kIHRoZSBjb2RlIGlzIGV4ZWN1dGVkCisgKiBmcm9tIGZsYXNoLiBUaGUgY29kZSBpcyBvcmdhbml6ZWQgdG8gYmUgYXQgYW4gb3RoZXIgYWRkcmVzcworICogaW4gbWVtb3J5LCBidXQgYXMgbG9uZyB3ZSBkb24ndCBqdW1wIGFyb3VuZCBiZWZvcmUgcmVsb2NhdGluZy4KKyAqIGJvYXJkX2luaXQgbGllcyBhdCBhIHF1aXRlIGhpZ2ggYWRkcmVzcyBhbmQgd2hlbiB0aGUgY3B1IGhhcworICoganVtcGVkIHRoZXJlLCBldmVyeXRoaW5nIGlzIG9rLgorICogVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBjcHUgZ2l2ZXMgdGhlIEZMQVNIIChDUzApIHRoZSB3aG9sZQorICogYWRkcmVzcyBzcGFjZSBhdCBzdGFydHVwLCBhbmQgYm9hcmRfaW5pdCBsaWVzIGFzIGEgZWNobyBvZgorICogdGhlIGZsYXNoIHNvbWV3aGVyZSB1cCB0aGVyZSBpbiB0aGUgbWVtb3J5bWFwLgorICoKKyAqIGJvYXJkX2luaXQgd2lsbCBjaGFuZ2UgQ1MwIHRvIGJlIHBvc2l0aW9uZWQgYXQgdGhlIGNvcnJlY3QKKyAqIGFkZHJlc3MgYW5kIChzKWRyYW0gd2lsbCBiZSBwb3NpdGlvbmVkIGF0IGFkZHJlc3MgMAorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bXBjODI0eC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworI2RlZmluZSBfTElOVVhfQ09ORklHX0ggMQkvKiBhdm9pZCByZWFkaW5nIExpbnV4IGF1dG9jb25mLmggZmlsZQkqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpZm5kZWYgQ09ORklHX0lERU5UX1NUUklORworI2RlZmluZSBDT05GSUdfSURFTlRfU1RSSU5HICIiCisjZW5kaWYKKworLyogV2UgZG9uJ3Qgd2FudCB0aGUgTU1VIHlldC4KKyovCisjdW5kZWYJTVNSX0tFUk5FTAorLyogRlAsIE1hY2hpbmUgQ2hlY2sgYW5kIFJlY292ZXJhYmxlIEludGVyci4gKi8KKyNkZWZpbmUgTVNSX0tFUk5FTCAoIE1TUl9GUCB8IE1TUl9NRSB8IE1TUl9SSSApCisKKy8qCisgKiBTZXQgdXAgR09UOiBHbG9iYWwgT2Zmc2V0IFRhYmxlCisgKgorICogVXNlIHIxNCB0byBhY2Nlc3MgdGhlIEdPVAorICovCisJU1RBUlRfR09UCisJR09UX0VOVFJZKF9HT1QyX1RBQkxFXykKKwlHT1RfRU5UUlkoX0ZJWFVQX1RBQkxFXykKKworCUdPVF9FTlRSWShfc3RhcnQpCisJR09UX0VOVFJZKF9zdGFydF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWShfZW5kX29mX3ZlY3RvcnMpCisJR09UX0VOVFJZKHRyYW5zZmVyX3RvX2hhbmRsZXIpCisKKwlHT1RfRU5UUlkoX2VuZCkKKwlHT1RfRU5UUlkoLmJzcykKKyNpZiBkZWZpbmVkKENPTkZJR19GQURTKQorCUdPVF9FTlRSWShlbnZpcm9ubWVudCkKKyNlbmRpZgorCUVORF9HT1QKKworLyoKKyAqIHIzIC0gMXN0IGFyZyB0byBib2FyZF9pbml0KCk6IElNTVAgcG9pbnRlcgorICogcjQgLSAybmQgYXJnIHRvIGJvYXJkX2luaXQoKTogYm9vdCBmbGFnCisgKi8KKwkudGV4dAorCS5sb25nCTB4MjcwNTE5NTYJCS8qIFUtQm9vdCBNYWdpYyBOdW1iZXIJCQkqLworCS5nbG9ibAl2ZXJzaW9uX3N0cmluZwordmVyc2lvbl9zdHJpbmc6CisJLmFzY2lpIFVfQk9PVF9WRVJTSU9OCisJLmFzY2lpICIgKCIsIF9fREFURV9fLCAiIC0gIiwgX19USU1FX18sICIpIgorCS5hc2NpaSBDT05GSUdfSURFTlRfU1RSSU5HLCAiXDAiCisKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQKKwkuZ2xvYmwJX3N0YXJ0Citfc3RhcnQ6CisJbGkJcjIxLCBCT09URkxBR19DT0xECS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCisJYglib290X2NvbGQKKworCS4gPSBFWENfT0ZGX1NZU19SRVNFVCArIDB4MTAKKworCS5nbG9ibAlfc3RhcnRfd2FybQorX3N0YXJ0X3dhcm06CisJbGkJcjIxLCBCT09URkxBR19XQVJNCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCisJYglib290X3dhcm0KKworYm9vdF9jb2xkOgorYm9vdF93YXJtOgorCisJLyogSW5pdGlhbGl6ZSBtYWNoaW5lIHN0YXR1czsgZW5hYmxlIG1hY2hpbmUgY2hlY2sgaW50ZXJydXB0CQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGkJcjMsIE1TUl9LRVJORUwJCS8qIFNldCBGUCwgTUUsIFJJIGZsYWdzICovCisJbXRtc3IJcjMKKwltdHNwcglTUlIxLCByMwkJLyogTWFrZSBTUlIxIG1hdGNoIE1TUiAqLworCisJYWRkaXMJcjAsMCwweDAwMDAJCS8qIGxldHMgbWFrZSBzdXJlIHRoYXQgcjAgaXMgcmVhbGx5IDAgKi8KKwltdHNwciAgIEhJRDAsIHIwCQkvKiBkaXNhYmxlIEkgYW5kIEQgY2FjaGVzICovCisKKwltZnNwcglyMywgSUNSCQkJLyogY2xlYXIgSW50ZXJydXB0IENhdXNlIFJlZ2lzdGVyICovCisKKwltZm1zcglyMwkJCS8qIHR1cm4gb2ZmIGFkZHJlc3MgdHJhbnNsYXRpb24gKi8KKwlhZGRpcwlyNCwwLDB4ZmZmZgorCW9yaQlyNCxyNCwweGZmY2YKKwlhbmQJcjMscjMscjQKKwltdG1zcglyMworCWlzeW5jCisJc3luYwkJCQkvKiB0aGUgTU1VIHNob3VsZCBiZSBvZmYuLi4gKi8KKworCitpbl9mbGFzaDoKKyNpZiBkZWZpbmVkKENPTkZJR19CTVcpCisJYmwgZWFybHlfaW5pdF9mIC8qIE11c3QgYmUgQVNNOiBubyBzdGFjayB5ZXQhICovCisjZW5kaWYKKwkvKgorCSAqIFNldHVwIEJBVHMgLSBjYW5ub3QgYmUgZG9uZSBpbiBDIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBzdGFjayB5ZXQKKwkgKi8KKwlibAlzZXR1cF9iYXRzCisKKwkvKiBFbmFibGUgTU1VLgorCSAqLworCW1mbXNyCXIzCisJb3JpCXIzLCByMywgKE1TUl9JUiB8IE1TUl9EUikKKwltdG1zcglyMworI2lmICFkZWZpbmVkKENPTkZJR19CTVcpCisJLyogRW5hYmxlIGFuZCBpbnZhbGlkYXRlIGRhdGEgY2FjaGUuCisJICovCisJbWZzcHIJcjMsIEhJRDAKKwltcglyMiwgcjMKKwlvcmkJcjMsIHIzLCBISUQwX0RDRSB8IEhJRDBfRENJCisJb3JpCXIyLCByMiwgSElEMF9EQ0UKKwlzeW5jCisJbXRzcHIJSElEMCwgcjMKKwltdHNwcglISUQwLCByMgorCXN5bmMKKworCS8qIEFsbG9jYXRlIEluaXRpYWwgUkFNIGluIGRhdGEgY2FjaGUuCisJICovCisJbGlzCXIzLCBDRkdfSU5JVF9SQU1fQUREUkBoCisJb3JpCXIzLCByMywgQ0ZHX0lOSVRfUkFNX0FERFJAbAorCWxpCXIyLCAxMjgKKwltdGN0cglyMgorMToKKwlkY2J6CXIwLCByMworCWFkZGkJcjMsIHIzLCAzMgorCWJkbnoJMWIKKworCS8qIExvY2sgd2F5MCBpbiBkYXRhIGNhY2hlLgorCSAqLworCW1mc3ByCXIzLCAxMDExCisJbGlzCXIyLCAweGZmZmYKKwlvcmkJcjIsIHIyLCAweGZmMWYKKwlhbmQJcjMsIHIzLCByMgorCW9yaQlyMywgcjMsIDB4MDA4MAorCXN5bmMKKwltdHNwcgkxMDExLCByMworI2VuZGlmIC8qICFDT05GSUdfQk1XICovCisJLyoKKwkgKiBUaGlzayB0aGUgc3RhY2sgcG9pbnRlciAqc29tZXdoZXJlKiBzZW5zaWJsZS4gRG9lc250CisJICogbWF0dGVyIG11Y2ggd2hlcmUgYXMgd2UnbGwgbW92ZSBpdCB3aGVuIHdlIHJlbG9jYXRlCisJICovCisJbGlzCXIxLCAoQ0ZHX0lOSVRfUkFNX0FERFIgKyBDRkdfR0JMX0RBVEFfT0ZGU0VUKUBoCisJb3JpCXIxLCByMSwgKENGR19JTklUX1JBTV9BRERSICsgQ0ZHX0dCTF9EQVRBX09GRlNFVClAbAorCisJbGkJcjAsIDAJCQkvKiBNYWtlIHJvb20gZm9yIHN0YWNrIGZyYW1lIGhlYWRlciBhbmQJKi8KKwlzdHd1CXIwLCAtNChyMSkJCS8qIGNsZWFyIGZpbmFsIHN0YWNrIGZyYW1lIHNvIHRoYXQJKi8KKwlzdHd1CXIwLCAtNChyMSkJCS8qIHN0YWNrIGJhY2t0cmFjZXMgdGVybWluYXRlIGNsZWFubHkJKi8KKworCS8qIGxldCB0aGUgQy1jb2RlIHNldCB1cCB0aGUgcmVzdAkJCQkJKi8KKwkvKgkJCQkJCQkJCSovCisJLyogQmUgY2FyZWZ1bCB0byBrZWVwIGNvZGUgcmVsb2NhdGFibGUgIQkJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlHRVRfR09UCQkJLyogaW5pdGlhbGl6ZSBHT1QgYWNjZXNzCQkJKi8KKworCS8qIHIzOiBJTU1SICovCisJYmwJY3B1X2luaXRfZgkvKiBydW4gbG93LWxldmVsIENQVSBpbml0IGNvZGUgICAgIChmcm9tIEZsYXNoKQkqLworCisJbXIJcjMsIHIyMQorCS8qIHIzOiBCT09URkxBRyAqLworCWJsCWJvYXJkX2luaXRfZgkvKiBydW4gMXN0IHBhcnQgb2YgYm9hcmQgaW5pdCBjb2RlIChmcm9tIEZsYXNoKSAqLworCisKKworCS5nbG9ibAlfc3RhcnRfb2ZfdmVjdG9ycworX3N0YXJ0X29mX3ZlY3RvcnM6CisKKy8qIE1hY2hpbmUgY2hlY2sgKi8KKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfTUFDSF9DSENLLCBNYWNoaW5lQ2hlY2ssIE1hY2hpbmVDaGVja0V4Y2VwdGlvbikKKworLyogRGF0YSBTdG9yYWdlIGV4Y2VwdGlvbi4gICJOZXZlciIgZ2VuZXJhdGVkIG9uIHRoZSA4NjAuICovCisJU1REX0VYQ0VQVElPTihFWENfT0ZGX0RBVEFfU1RPUiwgRGF0YVN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEluc3RydWN0aW9uIFN0b3JhZ2UgZXhjZXB0aW9uLiAgIk5ldmVyIiBnZW5lcmF0ZWQgb24gdGhlIDg2MC4gKi8KKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfSU5TX1NUT1IsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oRVhDX09GRl9FWFRFUk5BTCwgRXh0SW50ZXJydXB0LCBleHRlcm5hbF9pbnRlcnJ1cHQpCisKKy8qIEFsaWdubWVudCBleGNlcHRpb24uICovCisJLiA9IEVYQ19PRkZfQUxJR04KK0FsaWdubWVudDoKKwlFWENFUFRJT05fUFJPTE9HCisJbWZzcHIJcjQsREFSCisJc3R3CXI0LF9EQVIocjIxKQorCW1mc3ByCXI1LERTSVNSCisJc3R3CXI1LF9EU0lTUihyMjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWxpCXIyMCxNU1JfS0VSTkVMCisJcmx3aW1pCXIyMCxyMjMsMCwxNiwxNgkJLyogY29weSBFRSBiaXQgZnJvbSBzYXZlZCBNU1IgKi8KKwlsd3oJcjYsR09UKHRyYW5zZmVyX3RvX2hhbmRsZXIpCisJbXRscglyNgorCWJscmwKKy5MX0FsaWdubWVudDoKKwkubG9uZwlBbGlnbm1lbnRFeGNlcHRpb24gLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCS5sb25nCWludF9yZXR1cm4gLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCisvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLworCS4gPSBFWENfT0ZGX1BST0dSQU0KK1Byb2dyYW1DaGVjazoKKwlFWENFUFRJT05fUFJPTE9HCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWxpCXIyMCxNU1JfS0VSTkVMCisJcmx3aW1pCXIyMCxyMjMsMCwxNiwxNgkJLyogY29weSBFRSBiaXQgZnJvbSBzYXZlZCBNU1IgKi8KKwlsd3oJcjYsR09UKHRyYW5zZmVyX3RvX2hhbmRsZXIpCisJbXRscglyNgorCWJscmwKKy5MX1Byb2dyYW1DaGVjazoKKwkubG9uZwlQcm9ncmFtQ2hlY2tFeGNlcHRpb24gLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCS5sb25nCWludF9yZXR1cm4gLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCisJLyogTm8gRlBVIG9uIE1QQzh4eC4gVGhpcyBleGNlcHRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbi4KKwkqLworCVNURF9FWENFUFRJT04oRVhDX09GRl9GUFVOQVZBSUwsIEZQVW5hdmFpbGFibGUsIFVua25vd25FeGNlcHRpb24pCisKKwkvKiBJIGd1ZXNzIHdlIGNvdWxkIGltcGxlbWVudCBkZWNyZW1lbnRlciwgYW5kIG1heSBoYXZlCisJICogdG8gc29tZWRheSBmb3IgdGltZWtlZXBpbmcuCisJICovCisJU1REX0VYQ0VQVElPTihFWENfT0ZGX0RFQ1IsIERlY3JlbWVudGVyLCB0aW1lcl9pbnRlcnJ1cHQpCisJU1REX0VYQ0VQVElPTigweGEwMCwgVHJhcF8wYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4YjAwLCBUcmFwXzBiLCBVbmtub3duRXhjZXB0aW9uKQorCisJLiA9IDB4YzAwCisvKgorICogcjAgLSBTWVNDQUxMIG51bWJlcgorICogcjMtLi4uIGFyZ3VtZW50cworICovCitTeXN0ZW1DYWxsOgorCWFkZGlzCXIxMSxyMCwwCQkvKiBnZXQgZnVuY3Rpb25zIHRhYmxlIGFkZHIgKi8KKwlvcmkJcjExLHIxMSwwCQkvKiBOb3RlOiB0aGlzIGNvZGUgaXMgcGF0Y2hlZCBpbiB0cmFwX2luaXQgKi8KKwlhZGRpcwlyMTIscjAsMAkJLyogZ2V0IG51bWJlciBvZiBmdW5jdGlvbnMgKi8KKwlvcmkJcjEyLHIxMiwwCisKKwljbXBsdwkwLCByMCwgcjEyCisJYmdlCTFmCisKKwlybHdpbm0JcjAscjAsMiwwLDMxCQkvKiBmbl9hZGRyID0gZm5fdGJsW3IwXSAqLworCWFkZAlyMTEscjExLHIwCisJbHd6CXIxMSwwKHIxMSkKKworCWxpCXIxMiwweGQwMC00KjMJCS8qIHNhdmUgTFIgJiBTUlJ4ICovCisJbWZscglyMAorCXN0dwlyMCwwKHIxMikKKwltZnNwcglyMCxTUlIwCisJc3R3CXIwLDQocjEyKQorCW1mc3ByCXIwLFNSUjEKKwlzdHcJcjAsOChyMTIpCisKKwlsaQlyMTIsMHhjMDArX2JhY2stU3lzdGVtQ2FsbAorCW10bHIJcjEyCisJbXRzcHIJU1JSMCxyMTEKKworMToJU1lOQworCXJmaQorCitfYmFjazoKKworCW1mbXNyCXIxMQkJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWxpCXIxMiwwCisJb3JpCXIxMixyMTIsTVNSX0VFCisJYW5kYwlyMTEscjExLHIxMgorCVNZTkMJCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjExCisJU1lOQworCisJbGkJcjEyLDB4ZDAwLTQqMwkJLyogcmVzdG9yZSByZWdzICovCisJbHd6CXIxMSwwKHIxMikKKwltdGxyCXIxMQorCWx3eglyMTEsNChyMTIpCisJbXRzcHIJU1JSMCxyMTEKKwlsd3oJcjExLDgocjEyKQorCW10c3ByCVNSUjEscjExCisKKwlTWU5DCisJcmZpCisKKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfVFJBQ0UsIFNpbmdsZVN0ZXAsIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfRlBVTkFTU0lTVCwgVHJhcF8wZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfUE1JLCBUcmFwXzBmLCBVbmtub3duRXhjZXB0aW9uKQorCisJU1REX0VYQ0VQVElPTihFWENfT0ZGX0lUTUUsIEluc3RydWN0aW9uVHJhbnNNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oRVhDX09GRl9ETFRNRSwgRGF0YUxvYWRUcmFuc01pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTihFWENfT0ZGX0RTVE1FLCBEYXRhU3RvcmVUcmFuc01pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTihFWENfT0ZGX0lBQkUsIEluc3RydWN0aW9uQnJlYWtwb2ludCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfU01JRSwgU3lzTWFuYWdlSW50LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxNTAwLCBSZXNlcnZlZDUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE2MDAsIFJlc2VydmVkNiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTcwMCwgUmVzZXJ2ZWQ3LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxODAwLCBSZXNlcnZlZDgsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE5MDAsIFJlc2VydmVkOSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWEwMCwgUmVzZXJ2ZWRBLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxYjAwLCBSZXNlcnZlZEIsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFjMDAsIFJlc2VydmVkQywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWQwMCwgUmVzZXJ2ZWRELCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxZTAwLCBSZXNlcnZlZEUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFmMDAsIFJlc2VydmVkRiwgVW5rbm93bkV4Y2VwdGlvbikKKworCVNURF9FWENFUFRJT04oRVhDX09GRl9STVRFLCBSdW5Nb2RlVHJhY2UsIFVua25vd25FeGNlcHRpb24pCisKKwkuZ2xvYmwJX2VuZF9vZl92ZWN0b3JzCitfZW5kX29mX3ZlY3RvcnM6CisKKworCS4gPSAweDMwMDAKKworLyoKKyAqIFRoaXMgY29kZSBmaW5pc2hlcyBzYXZpbmcgdGhlIHJlZ2lzdGVycyB0byB0aGUgZXhjZXB0aW9uIGZyYW1lCisgKiBhbmQganVtcHMgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZm9yIHRoZSBleGNlcHRpb24uCisgKiBSZWdpc3RlciByMjEgaXMgcG9pbnRlciBpbnRvIHRyYXAgZnJhbWUsIHIxIGhhcyBuZXcgc3RhY2sgcG9pbnRlci4KKyAqLworCS5nbG9ibAl0cmFuc2Zlcl90b19oYW5kbGVyCit0cmFuc2Zlcl90b19oYW5kbGVyOgorCXN0dwlyMjIsX05JUChyMjEpCisJbGlzCXIyMixNU1JfUE9XQGgKKwlhbmRjCXIyMyxyMjMscjIyCisJc3R3CXIyMyxfTVNSKHIyMSkKKwlTQVZFX0dQUig3LCByMjEpCisJU0FWRV80R1BSUyg4LCByMjEpCisJU0FWRV84R1BSUygxMiwgcjIxKQorCVNBVkVfOEdQUlMoMjQsIHIyMSkKKyNpZiAwCisJYW5kaS4JcjIzLHIyMyxNU1JfUFIKKwltZnNwcglyMjMsU1BSRzMJCS8qIGlmIGZyb20gdXNlciwgZml4IHVwIHRzcy5yZWdzICovCisJYmVxCTJmCisJYWRkaQlyMjQscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlzdHcJcjI0LFBUX1JFR1MocjIzKQorMjoJYWRkaQlyMixyMjMsLVRTUwkJLyogc2V0IHIyIHRvIGN1cnJlbnQgKi8KKwl0b3ZpcnQocjIscjIscjIzKQorI2VuZGlmCisJbWZscglyMjMKKwlhbmRpLglyMjQscjIzLDB4M2YwMAkJLyogZ2V0IHZlY3RvciBvZmZzZXQgKi8KKwlzdHcJcjI0LFRSQVAocjIxKQorCWxpCXIyMiwwCisJc3R3CXIyMixSRVNVTFQocjIxKQorCW10c3ByCVNQUkcyLHIyMgkJLyogcjEgaXMgbm93IGtlcm5lbCBzcCAqLworI2lmIDAKKwlhZGRpCXIyNCxyMixUQVNLX1NUUlVDVF9TSVpFIC8qIGNoZWNrIGZvciBrZXJuZWwgc3RhY2sgb3ZlcmZsb3cgKi8KKwljbXBsdwkwLHIxLHIyCisJY21wbHcJMSxyMSxyMjQKKwljcmFuZAkxLDEsNAorCWJndAlzdGFja19vdmYJCS8qIGlmIHIyIDwgcjEgPCByMitUQVNLX1NUUlVDVF9TSVpFICovCisjZW5kaWYKKwlsd3oJcjI0LDAocjIzKQkJLyogdmlydHVhbCBhZGRyZXNzIG9mIGhhbmRsZXIgKi8KKwlsd3oJcjIzLDQocjIzKQkJLyogd2hlcmUgdG8gZ28gd2hlbiBkb25lICovCisJbXRzcHIJU1JSMCxyMjQKKwlvcmkJcjIwLHIyMCwweDMwCQkvKiBlbmFibGUgSVIsIERSICovCisJbXRzcHIJU1JSMSxyMjAKKwltdGxyCXIyMworCVNZTkMKKwlyZmkJCQkJLyoganVtcCB0byBoYW5kbGVyLCBlbmFibGUgTU1VICovCisKK2ludF9yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJU1JSMCxyMgorCW10c3ByCVNSUjEscjAKKwlsd3oJcjAsR1BSMChyMSkKKwlsd3oJcjIsR1BSMihyMSkKKwlsd3oJcjEsR1BSMShyMSkKKwlTWU5DCisJcmZpCisKKy8qIENhY2hlIGZ1bmN0aW9ucy4KKyovCisJLmdsb2JsCWljYWNoZV9lbmFibGUKK2ljYWNoZV9lbmFibGU6CisJbWZzcHIJcjUsSElEMAkJLyogdHVybiBvbiB0aGUgSSBjYWNoZS4gKi8KKwlvcmkJcjUscjUsMHg4ODAwCS8qIEluc3RydWN0aW9uIGNhY2hlIG9ubHkhICovCisJYWRkaXMJcjYsMCwweEZGRkYKKwlvcmkJcjYscjYsMHhGN0ZGCisJYW5kCXI2LHI1LHI2CS8qIGNsZWFyIHRoZSBpbnZhbGlkYXRlIGJpdCAqLworCXN5bmMKKwltdHNwcglISUQwLHI1CisJbXRzcHIJSElEMCxyNgorCWlzeW5jCisJc3luYworCWJscgorCisJLmdsb2JsCWljYWNoZV9kaXNhYmxlCitpY2FjaGVfZGlzYWJsZToKKwltZnNwcglyNSxISUQwCisJYWRkaXMJcjYsMCwweEZGRkYKKwlvcmkJcjYscjYsMHg3RkZGCisJYW5kCXI1LHI1LHI2CisJc3luYworCW10c3ByCUhJRDAscjUKKwlpc3luYworCXN5bmMKKwlibHIKKworCS5nbG9ibAlpY2FjaGVfc3RhdHVzCitpY2FjaGVfc3RhdHVzOgorCW1mc3ByCXIzLCBISUQwCisJc3J3aQlyMywgcjMsIDE1CS8qID4+MTUgJiAxPT4gc2VsZWN0IGJpdCAxNiAqLworCWFuZGkuCXIzLCByMywgMQorCWJscgorCisJLmdsb2JsCWRjYWNoZV9lbmFibGUKK2RjYWNoZV9lbmFibGU6CisJbWZzcHIJcjUsSElEMAkJLyogdHVybiBvbiB0aGUgRCBjYWNoZS4gKi8KKwlvcmkJcjUscjUsMHg0NDAwCS8qIERhdGEgY2FjaGUgb25seSEgKi8KKwltZnNwcglyNCwgUFZSCQkvKiByZWFkIFBWUiAqLworCXNyYXdpCXIzLCByNCwgMTYJLyogc2hpZnQgb2ZmIHRoZSBsZWFzdCAxNiBiaXRzICovCisJY21waQkwLCAwLCByMywgMHhDCS8qIENoZWNrIGZvciBNYXggcHZyICovCisJYm5lCU5vdE1heAorCW9yaQlyNSxyNSwweDAwNDAJLyogc2V0dGluZyB0aGUgRENGQSBiaXQsIGZvciBNYXggcmV2IDEgZXJyYXRhICovCitOb3RNYXg6CisJYWRkaXMJcjYsMCwweEZGRkYKKwlvcmkJcjYscjYsMHhGQkZGCisJYW5kCXI2LHI1LHI2CS8qIGNsZWFyIHRoZSBpbnZhbGlkYXRlIGJpdCAqLworCXN5bmMKKwltdHNwcglISUQwLHI1CisJbXRzcHIJSElEMCxyNgorCWlzeW5jCisJc3luYworCWJscgorCisJLmdsb2JsCWRjYWNoZV9kaXNhYmxlCitkY2FjaGVfZGlzYWJsZToKKwltZnNwcglyNSxISUQwCisJYWRkaXMJcjYsMCwweEZGRkYKKwlvcmkJcjYscjYsMHhCRkZGCisJYW5kCXI1LHI1LHI2CisJc3luYworCW10c3ByCUhJRDAscjUKKwlpc3luYworCXN5bmMKKwlibHIKKworCS5nbG9ibAlkY2FjaGVfc3RhdHVzCitkY2FjaGVfc3RhdHVzOgorCW1mc3ByCXIzLCBISUQwCisJc3J3aQlyMywgcjMsIDE0CS8qID4+MTQgJiAxPT4gc2VsZWN0IGJpdCAxNyAqLworCWFuZGkuCXIzLCByMywgMQorCWJscgorCisJLmdsb2JsCWRjX3JlYWQKK2RjX3JlYWQ6CisvKlRPRE8gOiB3aG8gdXNlcyB0aGlzLCB3aGF0IHNob3VsZCBpdCBkbz8KKyovCisJYmxyCisKKworCS5nbG9ibCBnZXRfcHZyCitnZXRfcHZyOgorCW1mc3ByCXIzLCBQVlIKKwlibHIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiB2b2lkIHJlbG9jYXRlX2NvZGUgKGFkZHJfc3AsIGdkLCBhZGRyX21vbmkpCisgKgorICogVGhpcyAiZnVuY3Rpb24iIGRvZXMgbm90IHJldHVybiwgaW5zdGVhZCBpdCBjb250aW51ZXMgaW4gUkFNCisgKiBhZnRlciByZWxvY2F0aW5nIHRoZSBtb25pdG9yIGNvZGUuCisgKgorICogcjMgPSBkZXN0CisgKiByNCA9IHNyYworICogcjUgPSBsZW5ndGggaW4gYnl0ZXMKKyAqIHI2ID0gY2FjaGVsaW5lc2l6ZQorICovCisJLmdsb2JsCXJlbG9jYXRlX2NvZGUKK3JlbG9jYXRlX2NvZGU6CisKKwltcglyMSwgIHIzCQkvKiBTZXQgbmV3IHN0YWNrIHBvaW50ZXIJCSovCisJbXIJcjksICByNAkJLyogU2F2ZSBjb3B5IG9mIEdsb2JhbCBEYXRhIHBvaW50ZXIJKi8KKwltcglyMTAsIHI1CQkvKiBTYXZlIGNvcHkgb2YgRGVzdGluYXRpb24gQWRkcmVzcwkqLworCisJbXIJcjMsICByNQkJCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCisjaWZkZWYgREVCVUcKKwlsaXMJcjQsIENGR19TRFJBTV9CQVNFQGgJCS8qIFNvdXJjZSAgICAgIEFkZHJlc3MJKi8KKwlvcmkJcjQsIHI0LCBDRkdfU0RSQU1fQkFTRUBsCisjZWxzZQorCWxpcwlyNCwgQ0ZHX01PTklUT1JfQkFTRUBoCQkvKiBTb3VyY2UgICAgICBBZGRyZXNzCSovCisJb3JpCXI0LCByNCwgQ0ZHX01PTklUT1JfQkFTRUBsCisjZW5kaWYKKwlsaXMJcjUsIENGR19NT05JVE9SX0xFTkBoCQkvKiBMZW5ndGggaW4gQnl0ZXMJKi8KKwlvcmkJcjUsIHI1LCBDRkdfTU9OSVRPUl9MRU5AbAorCWxpCXI2LCBDRkdfQ0FDSEVMSU5FX1NJWkUJCS8qIENhY2hlIExpbmUgU2l6ZQkqLworCisJLyoKKwkgKiBGaXggR09UIHBvaW50ZXI6CisJICoKKwkgKiBOZXcgR09ULVBUUiA9IChvbGQgR09ULVBUUiAtIENGR19NT05JVE9SX0JBU0UpICsgRGVzdGluYXRpb24gQWRkcmVzcworCSAqCisJICogT2Zmc2V0OgorCSAqLworCXN1YglyMTUsIHIxMCwgcjQKKworCS8qIEZpcnN0IG91ciBvd24gR09UICovCisJYWRkCXIxNCwgcjE0LCByMTUKKwkvKiB0aGUgdGhlIG9uZSB1c2VkIGJ5IHRoZSBDIGNvZGUgKi8KKwlhZGQJcjMwLCByMzAsIHIxNQorCisJLyoKKwkgKiBOb3cgcmVsb2NhdGUgY29kZQorCSAqLworCisJY21wbHcJY3IxLHIzLHI0CisJYWRkaQlyMCxyNSwzCisJc3J3aS4JcjAscjAsMgorCWJlcQljcjEsNGYJCS8qIEluIHBsYWNlIGNvcHkgaXMgbm90IG5lY2Vzc2FyeQkqLworCWJlcQk3ZgkJLyogUHJvdGVjdCBhZ2FpbnN0IDAgY291bnQJCSovCisJbXRjdHIJcjAKKwliZ2UJY3IxLDJmCisKKwlsYQlyOCwtNChyNCkKKwlsYQlyNywtNChyMykKKzE6CWx3enUJcjAsNChyOCkKKwlzdHd1CXIwLDQocjcpCisJYmRuegkxYgorCWIJNGYKKworMjoJc2x3aQlyMCxyMCwyCisJYWRkCXI4LHI0LHIwCisJYWRkCXI3LHIzLHIwCiszOglsd3p1CXIwLC00KHI4KQorCXN0d3UJcjAsLTQocjcpCisJYmRuegkzYgorCisvKgorICogTm93IGZsdXNoIHRoZSBjYWNoZTogbm90ZSB0aGF0IHdlIG11c3Qgc3RhcnQgZnJvbSBhIGNhY2hlIGFsaWduZWQKKyAqIGFkZHJlc3MuIE90aGVyd2lzZSB3ZSBtaWdodCBtaXNzIG9uZSBjYWNoZSBsaW5lLgorICovCis0OgljbXB3aQlyNiwwCisJYWRkCXI1LHIzLHI1CisJYmVxCTdmCQkvKiBBbHdheXMgZmx1c2ggcHJlZmV0Y2ggcXVldWUgaW4gYW55IGNhc2UgKi8KKwlzdWJpCXIwLHI2LDEKKwlhbmRjCXIzLHIzLHIwCisJbXIJcjQscjMKKzU6CWRjYnN0CTAscjQKKwlhZGQJcjQscjQscjYKKwljbXBsdwlyNCxyNQorCWJsdAk1YgorCXN5bmMJCQkvKiBXYWl0IGZvciBhbGwgZGNic3QgdG8gY29tcGxldGUgb24gYnVzICovCisJbXIJcjQscjMKKzY6CWljYmkJMCxyNAorCWFkZAlyNCxyNCxyNgorCWNtcGx3CXI0LHI1CisJYmx0CTZiCis3OglzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGljYmkgdG8gY29tcGxldGUgb24gYnVzCSovCisJaXN5bmMKKworLyoKKyAqIFdlIGFyZSBkb25lLiBEbyBub3QgcmV0dXJuLCBpbnN0ZWFkIGJyYW5jaCB0byBzZWNvbmQgcGFydCBvZiBib2FyZAorICogaW5pdGlhbGl6YXRpb24sIG5vdyBydW5uaW5nIGZyb20gUkFNLgorICovCisKKwlhZGRpCXIwLCByMTAsIGluX3JhbSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbXRscglyMAorCWJscgorCitpbl9yYW06CisKKwkvKgorCSAqIFJlbG9jYXRpb24gRnVuY3Rpb24sIHIxNCBwb2ludCB0byBnb3QyKzB4ODAwMAorCSAqCisJICogQWRqdXN0IGdvdDIgcG9pbnRlcnMsIG5vIG5lZWQgdG8gY2hlY2sgZm9yIDAsIHRoaXMgY29kZQorCSAqIGFscmVhZHkgcHV0cyBhIGZldyBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKwkgKi8KKwlsaQlyMCxfX2dvdDJfZW50cmllc0BzZWN0b2ZmQGwKKwlsYQlyMyxHT1QoX0dPVDJfVEFCTEVfKQorCWx3eglyMTEsR09UKF9HT1QyX1RBQkxFXykKKwltdGN0cglyMAorCXN1YglyMTEscjMscjExCisJYWRkaQlyMyxyMywtNAorMToJbHd6dQlyMCw0KHIzKQorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjAsMChyMykKKwliZG56CTFiCisKKwkvKgorCSAqIE5vdyBhZGp1c3QgdGhlIGZpeHVwcyBhbmQgdGhlIHBvaW50ZXJzIHRvIHRoZSBmaXh1cHMKKwkgKiBpbiBjYXNlIHdlIG5lZWQgdG8gbW92ZSBvdXJzZWx2ZXMgYWdhaW4uCisJICovCisyOglsaQlyMCxfX2ZpeHVwX2VudHJpZXNAc2VjdG9mZkBsCisJbHd6CXIzLEdPVChfRklYVVBfVEFCTEVfKQorCWNtcHdpCXIwLDAKKwltdGN0cglyMAorCWFkZGkJcjMscjMsLTQKKwliZXEJNGYKKzM6CWx3enUJcjQsNChyMykKKwlsd3p1eAlyMCxyNCxyMTEKKwlhZGQJcjAscjAscjExCisJc3R3CXIxMCwwKHIzKQorCXN0dwlyMCwwKHI0KQorCWJkbnoJM2IKKzQ6CitjbGVhcl9ic3M6CisJLyoKKwkgKiBOb3cgY2xlYXIgQlNTIHNlZ21lbnQKKwkgKi8KKwlsd3oJcjMsR09UKC5ic3MpCisJbHd6CXI0LEdPVChfZW5kKQorCisJY21wbHcJMCwgcjMsIHI0CisJYmVxCTZmCisKKwlsaQlyMCwgMAorNToKKwlzdHcJcjAsIDAocjMpCisJYWRkaQlyMywgcjMsIDQKKwljbXBsdwkwLCByMywgcjQKKwlibHQJNWIKKzY6CisKKwltcglyMywgcjkJCS8qIEdsb2JhbCBEYXRhIHBvaW50ZXIJCSovCisJbXIJcjQsIHIxMAkJLyogRGVzdGluYXRpb24gQWRkcmVzcwkJKi8KKwlibAlib2FyZF9pbml0X3IKKworCS8qIFByb2JsZW1zIGFjY2Vzc2luZyAiZW5kIiBpbiBDLCBzbyBkbyBpdCBoZXJlICovCisJLmdsb2JsCWdldF9lbmRhZGRyCitnZXRfZW5kYWRkcjoKKwlsd3oJcjMsR09UKF9lbmQpCisJYmxyCisKKwkvKgorCSAqIENvcHkgZXhjZXB0aW9uIHZlY3RvciBjb2RlIHRvIGxvdyBtZW1vcnkKKwkgKgorCSAqIHIzOiBkZXN0X2FkZHIKKwkgKiByNzogc291cmNlIGFkZHJlc3MsIHI4OiBlbmQgYWRkcmVzcywgcjk6IHRhcmdldCBhZGRyZXNzCisJICovCisJLmdsb2JsCXRyYXBfaW5pdAordHJhcF9pbml0OgorCWx3eglyNywgR09UKF9zdGFydCkKKwlsd3oJcjgsIEdPVChfZW5kX29mX3ZlY3RvcnMpCisKKwlybHdpbm0JcjksIHI3LCAwLCAxOCwgMzEJLyogX3N0YXJ0ICYgMHgzRkZGCSovCisKKwljbXBsdwkwLCByNywgcjgKKwliZ2VscgkJCQkvKiByZXR1cm4gaWYgcjc+PXI4IC0ganVzdCBpbiBjYXNlICovCisKKwltZmxyCXI0CQkJLyogc2F2ZSBsaW5rIHJlZ2lzdGVyCQkqLworMToKKwlsd3oJcjAsIDAocjcpCisJc3R3CXIwLCAwKHI5KQorCWFkZGkJcjcsIHI3LCA0CisJYWRkaQlyOSwgcjksIDQKKwljbXBsdwkwLCByNywgcjgKKwlibmUJMWIKKworCS8qCisJICogcmVsb2NhdGUgYGhkbHInIGFuZCBgaW50X3JldHVybicgZW50cmllcworCSAqLworCWxpCXI3LCAuTF9NYWNoaW5lQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBBbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorMjoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJMmIKKworCWxpCXI3LCAuTF9BbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9Qcm9ncmFtQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9GUFVuYXZhaWxhYmxlIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgU3lzdGVtQ2FsbCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCiszOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvcgkqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAkzYgorCisJbGkJcjcsIC5MX1NpbmdsZVN0ZXAgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBfZW5kX29mX3ZlY3RvcnMgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorNDoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJNGIKKworCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIJKi8KKwlibHIKKworCS8qCisJICogRnVuY3Rpb246IHJlbG9jYXRlIGVudHJpZXMgZm9yIG9uZSBleGNlcHRpb24gdmVjdG9yCisJICovCit0cmFwX3JlbG9jOgorCWx3eglyMCwgMChyNykJCS8qIGhkbHIgLi4uCQkJKi8KKwlhZGQJcjAsIHIwLCByMwkJLyogIC4uLiArPSBkZXN0X2FkZHIJCSovCisJc3R3CXIwLCAwKHI3KQorCisJbHd6CXIwLCA0KHI3KQkJLyogaW50X3JldHVybiAuLi4JCSovCisJYWRkCXIwLCByMCwgcjMJCS8qICAuLi4gKz0gZGVzdF9hZGRyCQkqLworCXN0dwlyMCwgNChyNykKKworCWJscgorCisJLyogU2V0dXAgdGhlIEJBVCByZWdpc3RlcnMuCisJICovCitzZXR1cF9iYXRzOgorCWxpcwlyNCwgQ0ZHX0lCQVQwTEBoCisJb3JpCXI0LCByNCwgQ0ZHX0lCQVQwTEBsCisJbGlzCXIzLCBDRkdfSUJBVDBVQGgKKwlvcmkJcjMsIHIzLCBDRkdfSUJBVDBVQGwKKwltdHNwcglJQkFUMEwsIHI0CisJbXRzcHIJSUJBVDBVLCByMworCWlzeW5jCisKKwlsaXMJcjQsIENGR19EQkFUMExAaAorCW9yaQlyNCwgcjQsIENGR19EQkFUMExAbAorCWxpcwlyMywgQ0ZHX0RCQVQwVUBoCisJb3JpCXIzLCByMywgQ0ZHX0RCQVQwVUBsCisJbXRzcHIJREJBVDBMLCByNAorCW10c3ByCURCQVQwVSwgcjMKKwlpc3luYworCisJbGlzCXI0LCBDRkdfSUJBVDFMQGgKKwlvcmkJcjQsIHI0LCBDRkdfSUJBVDFMQGwKKwlsaXMJcjMsIENGR19JQkFUMVVAaAorCW9yaQlyMywgcjMsIENGR19JQkFUMVVAbAorCW10c3ByCUlCQVQxTCwgcjQKKwltdHNwcglJQkFUMVUsIHIzCisJaXN5bmMKKworCWxpcwlyNCwgQ0ZHX0RCQVQxTEBoCisJb3JpCXI0LCByNCwgQ0ZHX0RCQVQxTEBsCisJbGlzCXIzLCBDRkdfREJBVDFVQGgKKwlvcmkJcjMsIHIzLCBDRkdfREJBVDFVQGwKKwltdHNwcglEQkFUMUwsIHI0CisJbXRzcHIJREJBVDFVLCByMworCWlzeW5jCisKKwlsaXMJcjQsIENGR19JQkFUMkxAaAorCW9yaQlyNCwgcjQsIENGR19JQkFUMkxAbAorCWxpcwlyMywgQ0ZHX0lCQVQyVUBoCisJb3JpCXIzLCByMywgQ0ZHX0lCQVQyVUBsCisJbXRzcHIJSUJBVDJMLCByNAorCW10c3ByCUlCQVQyVSwgcjMKKwlpc3luYworCisJbGlzCXI0LCBDRkdfREJBVDJMQGgKKwlvcmkJcjQsIHI0LCBDRkdfREJBVDJMQGwKKwlsaXMJcjMsIENGR19EQkFUMlVAaAorCW9yaQlyMywgcjMsIENGR19EQkFUMlVAbAorCW10c3ByCURCQVQyTCwgcjQKKwltdHNwcglEQkFUMlUsIHIzCisJaXN5bmMKKworCWxpcwlyNCwgQ0ZHX0lCQVQzTEBoCisJb3JpCXI0LCByNCwgQ0ZHX0lCQVQzTEBsCisJbGlzCXIzLCBDRkdfSUJBVDNVQGgKKwlvcmkJcjMsIHIzLCBDRkdfSUJBVDNVQGwKKwltdHNwcglJQkFUM0wsIHI0CisJbXRzcHIJSUJBVDNVLCByMworCWlzeW5jCisKKwlsaXMJcjQsIENGR19EQkFUM0xAaAorCW9yaQlyNCwgcjQsIENGR19EQkFUM0xAbAorCWxpcwlyMywgQ0ZHX0RCQVQzVUBoCisJb3JpCXIzLCByMywgQ0ZHX0RCQVQzVUBsCisJbXRzcHIJREJBVDNMLCByNAorCW10c3ByCURCQVQzVSwgcjMKKwlpc3luYworCisJLyogSW52YWxpZGF0ZSBUTEJzLgorCSAqIC0+IGZvciAodmFsID0gMDsgdmFsIDwgMHgyMDAwMDsgdmFsKz0weDEwMDApCisJICogLT4gICB0bGJpZSh2YWwpOworCSAqLworCWxpcwlyMywgMAorCWxpcwlyNSwgMgorCisxOgorCXRsYmllCXIzCisJYWRkaQlyMywgcjMsIDB4MTAwMAorCWNtcAkwLCAwLCByMywgcjUKKwlibHQJMWIKKworCWJscgorCisKZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjYwL2NwdV9pbml0LmMgYi9jcHUvbXBjODI2MC9jcHVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTM2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjODI2MC9jcHVfaW5pdC5jCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzgyNjAuaD4KKyNpbmNsdWRlIDxhc20vY3BtXzgyNjAuaD4KKyNpbmNsdWRlIDxpb3BvcnRzLmg+CisKK3N0YXRpYyB2b2lkIGNvbmZpZ184MjYwX2lvcG9ydHMgKHZvbGF0aWxlIGltbWFwX3QgKiBpbW1yKQoreworCWludCBwb3J0bnVtOworCisJZm9yIChwb3J0bnVtID0gMDsgcG9ydG51bSA8IDQ7IHBvcnRudW0rKykgeworCQl1aW50IHBtc2sgPSAwLAorCQkgICAgIHBwYXIgPSAwLAorCQkgICAgIHBzb3IgPSAwLAorCQkgICAgIHBkaXIgPSAwLAorCQkgICAgIHBvZHIgPSAwLAorCQkgICAgIHBkYXQgPSAwOworCQlpb3BfY29uZl90ICppb3BjID0gKGlvcF9jb25mX3QgKikgJiBpb3BfY29uZl90YWJbcG9ydG51bV1bMF07CisJCWlvcF9jb25mX3QgKmVpb3BjID0gaW9wYyArIDMyOworCQl1aW50IG1zayA9IDE7CisKKwkJLyoKKwkJICogTk9URToKKwkJICogaW5kZXggMCByZWZlcnMgdG8gcGluIDMxLAorCQkgKiBpbmRleCAzMSByZWZlcnMgdG8gcGluIDAKKwkJICovCisJCXdoaWxlIChpb3BjIDwgZWlvcGMpIHsKKwkJCWlmIChpb3BjLT5jb25mKSB7CisJCQkJcG1zayB8PSBtc2s7CisJCQkJaWYgKGlvcGMtPnBwYXIpCisJCQkJCXBwYXIgfD0gbXNrOworCQkJCWlmIChpb3BjLT5wc29yKQorCQkJCQlwc29yIHw9IG1zazsKKwkJCQlpZiAoaW9wYy0+cGRpcikKKwkJCQkJcGRpciB8PSBtc2s7CisJCQkJaWYgKGlvcGMtPnBvZHIpCisJCQkJCXBvZHIgfD0gbXNrOworCQkJCWlmIChpb3BjLT5wZGF0KQorCQkJCQlwZGF0IHw9IG1zazsKKwkJCX0KKworCQkJbXNrIDw8PSAxOworCQkJaW9wYysrOworCQl9CisKKwkJaWYgKHBtc2sgIT0gMCkgeworCQkJdm9sYXRpbGUgaW9wb3J0X3QgKmlvcCA9IGlvcG9ydF9hZGRyIChpbW1yLCBwb3J0bnVtKTsKKwkJCXVpbnQgdHBtc2sgPSB+cG1zazsKKworCQkJLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSAoc29tZXdoYXQgY29uZnVzZWQpIHBhcmFncmFwaCBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvdHRvbSBvZiBwYWdlIDM1LTUgd2FybnMgdGhhdCB0aGVyZSBtaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgInVua25vd24gYmVoYXZpb3VyIiB3aGVuIHByb2dyYW1taW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBQU09SeCBhbmQgUERJUngsIGlmIFBQQVJ4ID0gMSwgc28gSQorICAgICAgICAgICAgICAgICAgICAgICAgICogZGVjaWRlZCB0aGlzIG1lYW50IEkgaGFkIHRvIGRpc2FibGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBkZWRpY2F0ZWQgZnVuY3Rpb24gZmlyc3QsIGFuZCBlbmFibGUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGxhc3QuCisJCQkgKi8KKwkJCWlvcC0+cHBhciAmPSB0cG1zazsKKwkJCWlvcC0+cHNvciA9IChpb3AtPnBzb3IgJiB0cG1zaykgfCBwc29yOworCQkJaW9wLT5wZGF0ID0gKGlvcC0+cGRhdCAmIHRwbXNrKSB8IHBkYXQ7CisJCQlpb3AtPnBkaXIgPSAoaW9wLT5wZGlyICYgdHBtc2spIHwgcGRpcjsKKwkJCWlvcC0+cG9kciA9IChpb3AtPnBvZHIgJiB0cG1zaykgfCBwb2RyOworCQkJaW9wLT5wcGFyIHw9IHBwYXI7CisJCX0KKwl9Cit9CisKKy8qCisgKiBCcmVhdGggc29tZSBsaWZlIGludG8gdGhlIENQVS4uLgorICoKKyAqIFNldCB1cCB0aGUgbWVtb3J5IG1hcCwKKyAqIGluaXRpYWxpemUgYSBidW5jaCBvZiByZWdpc3RlcnMsCisgKiBpbml0aWFsaXplIHRoZSBVUE0ncworICovCit2b2lkIGNwdV9pbml0X2YgKHZvbGF0aWxlIGltbWFwX3QgKiBpbW1yKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJdm9sYXRpbGUgbWVtY3RsODI2MF90ICptZW1jdGwgPSAmaW1tci0+aW1fbWVtY3RsOworCWV4dGVybiB2b2lkIG04MjYwX2NwbV9yZXNldCAodm9pZCk7CisKKwkvKiBQb2ludGVyIGlzIHdyaXRhYmxlIHNpbmNlIHdlIGFsbG9jYXRlZCBhIHJlZ2lzdGVyIGZvciBpdCAqLworCWdkID0gKGdkX3QgKikgKENGR19JTklUX1JBTV9BRERSICsgQ0ZHX0dCTF9EQVRBX09GRlNFVCk7CisKKwkvKiBDbGVhciBpbml0aWFsIGdsb2JhbCBkYXRhICovCisJbWVtc2V0ICgodm9pZCAqKSBnZCwgMCwgc2l6ZW9mIChnZF90KSk7CisKKwkvKiBSU1IgLSBSZXNldCBTdGF0dXMgUmVnaXN0ZXIgLSBjbGVhciBhbGwgc3RhdHVzICg1LTQpICovCisJZ2QtPnJlc2V0X3N0YXR1cyA9IGltbXItPmltX2Nsa3JzdC5jYXJfcnNyOworCWltbXItPmltX2Nsa3JzdC5jYXJfcnNyID0gUlNSX0FMTEJJVFM7CisKKwkvKiBSTVIgLSBSZXNldCBNb2RlIFJlZ2lzdGVyIC0gY29udGFpbnMgY2hlY2tzdG9wIHJlc2V0IGVuYWJsZSAoNS01KSAqLworCWltbXItPmltX2Nsa3JzdC5jYXJfcm1yID0gQ0ZHX1JNUjsKKworCS8qIEJDUiAtIEJ1cyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICg0LTI1KSAqLworCWltbXItPmltX3NpdV9jb25mLnNjX2JjciA9IENGR19CQ1I7CisKKwkvKiBTSVVNQ1IgLSBjb250YWlucyBkZWJ1ZyBwaW4gY29uZmlndXJhdGlvbiAoNC0zMSkgKi8KKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zaXVtY3IgPSBDRkdfU0lVTUNSOworCisJY29uZmlnXzgyNjBfaW9wb3J0cyAoaW1tcik7CisKKwkvKiBpbml0aWFsaXplIHRpbWUgY291bnRlciBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXIgKDQtNDApICovCisJaW1tci0+aW1fc2l0LnNpdF90bWNudHNjID0gQ0ZHX1RNQ05UU0M7CisKKwkvKiBpbml0aWFsaXplIHRoZSBQSVQgKDQtNDIpICovCisJaW1tci0+aW1fc2l0LnNpdF9waXNjciA9IENGR19QSVNDUjsKKworI2lmICFkZWZpbmVkKENPTkZJR19DT0dFTlQpCQkvKiBkb25lIGluIHN0YXJ0LlMgZm9yIHRoZSBjb2dlbnQgKi8KKwkvKiBTeXN0ZW0gY2xvY2sgY29udHJvbCByZWdpc3RlciAoOS04KSAqLworCWltbXItPmltX2Nsa3JzdC5jYXJfc2NjciA9IENGR19TQ0NSOworI2VuZGlmIC8qICFDT05GSUdfQ09HRU5UICovCisKKwkvKgorCSAqIE1lbW9yeSBDb250cm9sbGVyOgorCSAqLworCisJLyogTWFwIGJhbmtzIDAgYW5kIDEgdG8gdGhlIEZMQVNIIGJhbmtzIDAgYW5kIDEgYXQgcHJlbGltaW5hcnkKKwkgKiBhZGRyZXNzZXMgLSB0aGVzZSBoYXZlIHRvIGJlIG1vZGlmaWVkIGxhdGVyIHdoZW4gRkxBU0ggc2l6ZQorCSAqIGhhcyBiZWVuIGRldGVybWluZWQKKwkgKi8KKworI2lmIGRlZmluZWQoQ0ZHX09SMF9SRU1BUCkKKwltZW1jdGwtPm1lbWNfb3IwID0gQ0ZHX09SMF9SRU1BUDsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0ZHX09SMV9SRU1BUCkKKwltZW1jdGwtPm1lbWNfb3IxID0gQ0ZHX09SMV9SRU1BUDsKKyNlbmRpZgorCisJLyogbm93IHJlc3RyaWN0IHRvIHByZWxpbWluYXJ5IHJhbmdlICovCisJbWVtY3RsLT5tZW1jX2JyMCA9IENGR19CUjBfUFJFTElNOworCW1lbWN0bC0+bWVtY19vcjAgPSBDRkdfT1IwX1BSRUxJTTsKKworI2lmIGRlZmluZWQoQ0ZHX0JSMV9QUkVMSU0pICYmIGRlZmluZWQoQ0ZHX09SMV9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yMSA9IENGR19PUjFfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjEgPSBDRkdfQlIxX1BSRUxJTTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfQlIyX1BSRUxJTSkgJiYgZGVmaW5lZChDRkdfT1IyX1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3IyID0gQ0ZHX09SMl9QUkVMSU07CisJbWVtY3RsLT5tZW1jX2JyMiA9IENGR19CUjJfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19CUjNfUFJFTElNKSAmJiBkZWZpbmVkKENGR19PUjNfUFJFTElNKQorCW1lbWN0bC0+bWVtY19vcjMgPSBDRkdfT1IzX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIzID0gQ0ZHX0JSM19QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX0JSNF9QUkVMSU0pICYmIGRlZmluZWQoQ0ZHX09SNF9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yNCA9IENGR19PUjRfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjQgPSBDRkdfQlI0X1BSRUxJTTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfQlI1X1BSRUxJTSkgJiYgZGVmaW5lZChDRkdfT1I1X1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3I1ID0gQ0ZHX09SNV9QUkVMSU07CisJbWVtY3RsLT5tZW1jX2JyNSA9IENGR19CUjVfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19CUjZfUFJFTElNKSAmJiBkZWZpbmVkKENGR19PUjZfUFJFTElNKQorCW1lbWN0bC0+bWVtY19vcjYgPSBDRkdfT1I2X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI2ID0gQ0ZHX0JSNl9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX0JSN19QUkVMSU0pICYmIGRlZmluZWQoQ0ZHX09SN19QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yNyA9IENGR19PUjdfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjcgPSBDRkdfQlI3X1BSRUxJTTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfQlI4X1BSRUxJTSkgJiYgZGVmaW5lZChDRkdfT1I4X1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3I4ID0gQ0ZHX09SOF9QUkVMSU07CisJbWVtY3RsLT5tZW1jX2JyOCA9IENGR19CUjhfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19CUjlfUFJFTElNKSAmJiBkZWZpbmVkKENGR19PUjlfUFJFTElNKQorCW1lbWN0bC0+bWVtY19vcjkgPSBDRkdfT1I5X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI5ID0gQ0ZHX0JSOV9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX0JSMTBfUFJFTElNKSAmJiBkZWZpbmVkKENGR19PUjEwX1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3IxMCA9IENGR19PUjEwX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIxMCA9IENGR19CUjEwX1BSRUxJTTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfQlIxMV9QUkVMSU0pICYmIGRlZmluZWQoQ0ZHX09SMTFfUFJFTElNKQorCW1lbWN0bC0+bWVtY19vcjExID0gQ0ZHX09SMTFfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjExID0gQ0ZHX0JSMTFfUFJFTElNOworI2VuZGlmCisKKwltODI2MF9jcG1fcmVzZXQgKCk7Cit9CisKKy8qCisgKiBpbml0aWFsaXplIGhpZ2hlciBsZXZlbCBwYXJ0cyBvZiBDUFUgbGlrZSB0aW1lIGJhc2UgYW5kIHRpbWVycworICovCitpbnQgY3B1X2luaXRfciAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBnZC0+YmQtPmJpX2ltbXJfYmFzZTsKKworCWltbXItPmltX2NwbS5jcF9yY2NyID0gQ0ZHX1JDQ1I7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogcHJpbnQgb3V0IHRoZSByZWFzb24gZm9yIHRoZSByZXNldAorICovCitpbnQgcHJ0XzgyNjBfcnNyICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJc3RhdGljIHN0cnVjdCB7CisJCXVsb25nIG1hc2s7CisJCWNoYXIgKmRlc2M7CisJfSBiaXRzW10gPSB7CisJCXsKKwkJUlNSX0pUUlMsICJKVEFHIn0sIHsKKwkJUlNSX0NTUlMsICJDaGVjayBTdG9wIn0sIHsKKwkJUlNSX1NXUlMsICJTb2Z0d2FyZSBXYXRjaGRvZyJ9LCB7CisJCVJTUl9CTVJTLCAiQnVzIE1vbml0b3IifSwgeworCQlSU1JfRVNSUywgIkV4dGVybmFsIFNvZnQifSwgeworCQlSU1JfRUhSUywgIkV4dGVybmFsIEhhcmQifQorCX07CisJc3RhdGljIGludCBuID0gc2l6ZW9mIGJpdHMgLyBzaXplb2YgYml0c1swXTsKKwl1bG9uZyByc3IgPSBnZC0+cmVzZXRfc3RhdHVzOworCWludCBpOworCWNoYXIgKnNlcDsKKworCXB1dHMgKCJNUEM4MjYwIFJlc2V0IFN0YXR1czoiKTsKKworCXNlcCA9ICIgIjsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlpZiAocnNyICYgYml0c1tpXS5tYXNrKSB7CisJCQlwcmludGYgKCIlcyVzIiwgc2VwLCBiaXRzW2ldLmRlc2MpOworCQkJc2VwID0gIiwgIjsKKwkJfQorCisJcHV0cyAoIlxuXG4iKTsKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAvaTJjLmMgYi9jcHUvbXBjODI2MC9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmZhMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzgyNjAvaTJjLmMKQEAgLTAsMCArMSw3MzMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFBhb2xvIFNjYWZmYXJkaSwgQUlSVkVOVCBTQU0gcy5wLmEgLSBSSU1JTkkoSVRBTFkpLCBhcnNlbmlvQHRpbi5pdAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMCBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19IQVJEX0kyQykKKworI2luY2x1ZGUgPGFzbS9jcG1fODI2MC5oPgorI2luY2x1ZGUgPGkyYy5oPgorCisvKiBkZWZpbmUgdG8gZW5hYmxlIGRlYnVnIG1lc3NhZ2VzICovCisjdW5kZWYgIERFQlVHX0kyQworCisvKiB1U2VjIHRvIHdhaXQgYmV0d2VlbiBwb2xscyBvZiB0aGUgaTJjICovCisjZGVmaW5lIERFTEFZX1VTCTEwMAorLyogdVNlYyB0byB3YWl0IGZvciB0aGUgQ1BNIHRvIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIGJ1ZmZlciAqLworI2RlZmluZSBTVEFSVF9ERUxBWV9VUwkxMDAwCisKKy8qCisgKiB0eC9yeCBwZXItYnl0ZSB0aW1lb3V0OiB3ZSBkZWxheSBERUxBWV9VUyB1U2VjIGJldHdlZW4gcG9sbHMgc28gdGhlCisgKiB0aW1lb3V0IHdpbGwgYmUgKHR4X2xlbmd0aCArIHJ4X2xlbmd0aCkgKiBERUxBWV9VUyAqIFRPVVRfTE9PUAorICovCisjZGVmaW5lIFRPVVRfTE9PUCA1CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNldCBkZWZhdWx0IHZhbHVlcworICovCisjaWZuZGVmCUNGR19JMkNfU1BFRUQKKyNkZWZpbmUJQ0ZHX0kyQ19TUEVFRAk1MDAwMAorI2VuZGlmCisKKyNpZm5kZWYJQ0ZHX0kyQ19TTEFWRQorI2RlZmluZQlDRkdfSTJDX1NMQVZFCTB4RkUKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3R5cGVkZWYgdm9pZCAoKmkyY19lY2JfdCkoaW50LCBpbnQpOyAgICAvKiBlcnJvciBjYWxsYmFjayBmdW5jdGlvbiAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBrZWVwcyB0cmFjayBvZiB0aGUgYmQgYW5kIGJ1ZmZlciBzcGFjZSB1c2FnZS4gKi8KK3R5cGVkZWYgc3RydWN0IGkyY19zdGF0ZSB7CisJaW50CQlyeF9pZHg7CQkvKiBpbmRleCAgIHRvIG5leHQgZnJlZSBSeCBCRCAqLworCWludAkJdHhfaWR4OwkJLyogaW5kZXggICB0byBuZXh0IGZyZWUgVHggQkQgKi8KKwl2b2lkCQkqcnhiZDsJCS8qIHBvaW50ZXIgdG8gbmV4dCBmcmVlIFJ4IEJEICovCisJdm9pZAkJKnR4YmQ7CQkvKiBwb2ludGVyIHRvIG5leHQgZnJlZSBUeCBCRCAqLworCWludAkJdHhfc3BhY2U7CS8qIG51bWJlciAgb2YgVHggYnl0ZXMgbGVmdCAgICovCisJdW5zaWduZWQgY2hhcgkqdHhfYnVmOwkvKiBwb2ludGVyIHRvIGZyZWUgVHggYXJlYSAgICAqLworCWkyY19lY2JfdAllcnJfY2I7CQkvKiBlcnJvciBjYWxsYmFjayBmdW5jdGlvbiAgICAqLworfSBpMmNfc3RhdGVfdDsKKworLyogZmxhZ3MgZm9yIGkyY19zZW5kKCkgYW5kIGkyY19yZWNlaXZlKCkgKi8KKyNkZWZpbmUJSTJDRl9FTkFCTEVfU0VDT05EQVJZCTB4MDEJLyogc2Vjb25kYXJ5X2FkZHJlc3MgaXMgdmFsaWQJKi8KKyNkZWZpbmUJSTJDRl9TVEFSVF9DT05ECQkweDAyCS8qIHR4OiBnZW5lcmF0ZSBzdGFydCBjb25kaXRpb24JKi8KKyNkZWZpbmUgSTJDRl9TVE9QX0NPTkQJCTB4MDQJLyogdHg6IGdlbmVyYXRlIHN0b3AgIGNvbmRpdGlvbgkqLworCisvKiByZXR1cm4gY29kZXMgKi8KKyNkZWZpbmUgSTJDRVJSX05PX0JVRkZFUlMJMHgwMQkvKiBubyBtb3JlIEJEcyBvciBidWZmZXIgc3BhY2UJKi8KKyNkZWZpbmUgSTJDRVJSX01TR19UT09fTE9ORwkweDAyCS8qIHRyaWVkIHRvIHNlbmQvcmVjZWl2ZSB0byBtdWNoIGRhdGEgICAqLworI2RlZmluZSBJMkNFUlJfVElNRU9VVAkJMHgwMwkvKiB0aW1lb3V0IGluIGkyY19kb2lvKCkJKi8KKyNkZWZpbmUgSTJDRVJSX1FVRVVFX0VNUFRZCTB4MDQJLyogaTJjX2RvaW8gY2FsbGVkIHdpdGhvdXQgc2VuZC9yZWNlaXZlICovCisKKy8qIGVycm9yIGNhbGxiYWNrIGZsYWdzICovCisjZGVmaW5lIEkyQ0VDQl9SWF9FUlIJCTB4MTAJLyogdGhpcyBpcyBhIHJlY2VpdmUgZXJyb3IJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9SWF9FUlJfT1YJMHgwMgkvKiByZWNlaXZlIG92ZXJydW4gZXJyb3IJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9SWF9NQVNLCTB4MGYJLyogbWFzayBmb3IgZXJyb3IgYml0cwkJKi8KKyNkZWZpbmUgSTJDRUNCX1RYX0VSUgkJMHgyMAkvKiB0aGlzIGlzIGEgdHJhbnNtaXQgZXJyb3IJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9UWF9DTAkweDAxCS8qIHRyYW5zbWl0IGNvbGxpc2lvbiBlcnJvcgkqLworI2RlZmluZSAgICAgSTJDRUNCX1RYX1VOCTB4MDIJLyogdHJhbnNtaXQgdW5kZXJmbG93IGVycm9yCSovCisjZGVmaW5lICAgICBJMkNFQ0JfVFhfTkFLCTB4MDQJLyogdHJhbnNtaXQgbm8gYWNrIGVycm9yCSovCisjZGVmaW5lICAgICBJMkNFQ0JfVFhfTUFTSwkweDBmCS8qIG1hc2sgZm9yIGVycm9yIGJpdHMJCSovCisjZGVmaW5lIEkyQ0VDQl9USU1FT1VUCQkweDQwCS8qIHRoaXMgaXMgYSB0aW1lb3V0IGVycm9yCSovCisKKyNkZWZpbmUgRVJST1JfSTJDX05PTkUJCTAKKyNkZWZpbmUgRVJST1JfSTJDX0xFTkdUSAkxCisKKyNkZWZpbmUgSTJDX1dSSVRFX0JJVAkJMHgwMAorI2RlZmluZSBJMkNfUkVBRF9CSVQJCTB4MDEKKworI2RlZmluZSBJMkNfUlhUWF9MRU4JMTI4CS8qIG1heGltdW0gdHgvcnggYnVmZmVyIGxlbmd0aCAqLworCisKKyNkZWZpbmUgTlVNX1JYX0JEUyA0CisjZGVmaW5lIE5VTV9UWF9CRFMgNAorI2RlZmluZSBNQVhfVFhfU1BBQ0UgMjU2CisKK3R5cGVkZWYgc3RydWN0IEkyQ19CRAoreworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsKKyAgdW5zaWduZWQgY2hhciAqYWRkcjsKK30gSTJDX0JEOworI2RlZmluZSBCRF9JMkNfVFhfU1RBUlQgMHgwNDAwICAvKiBzcGVjaWFsIHN0YXR1cyBmb3IgaTJjOiBTdGFydCBjb25kaXRpb24gKi8KKworI2RlZmluZSBCRF9JMkNfVFhfQ0wJMHgwMDAxCS8qIGNvbGxpc2lvbiBlcnJvciAqLworI2RlZmluZSBCRF9JMkNfVFhfVU4JMHgwMDAyCS8qIHVuZGVyZmxvdyBlcnJvciAqLworI2RlZmluZSBCRF9JMkNfVFhfTkFLCTB4MDAwNAkvKiBubyBhY2tub3dsZWRnZSBlcnJvciAqLworI2RlZmluZSBCRF9JMkNfVFhfRVJSCShCRF9JMkNfVFhfTkFLfEJEX0kyQ19UWF9VTnxCRF9JMkNfVFhfQ0wpCisKKyNkZWZpbmUgQkRfSTJDX1JYX0VSUglCRF9TQ19PVgorCisjaWZkZWYgREVCVUdfSTJDCisjZGVmaW5lIFBSSU5URCh4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgUFJJTlREKHgpCisjZW5kaWYKKworLyoKKyAqIFJldHVybnMgdGhlIGJlc3QgdmFsdWUgb2YgSTJCUkcgdG8gbWVldCBkZXNpcmVkIGNsb2NrIHNwZWVkIG9mIEkyQyB3aXRoCisgKiBpbnB1dCBwYXJhbWV0ZXJzIChjbG9jayBzcGVlZCwgZmlsdGVyLCBhbmQgcHJlZGl2aWRlciB2YWx1ZSkuCisgKiBJdCByZXR1cm5zIGNvbXB1dGVyIHNwZWVkIHZhbHVlIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGl0IGFuZCBkZXNpcmVkCisgKiBzcGVlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2kyY19yb3VuZHJhdGUoaW50IGh6LCBpbnQgc3BlZWQsIGludCBmaWx0ZXIsIGludCBtb2R2YWwsCisJCWludCAqYnJndmFsLCBpbnQgKnRvdHNwZWVkKQoreworICAgIGludCBtb2RkaXYgPSAxIDw8ICg1LShtb2R2YWwgJiAzKSksIGJyZ2RpdiwgZGl2OworCisgICAgUFJJTlREKCgiXHRbSTJDXSB0cnlpbmcgaHo9JWQsIHNwZWVkPSVkLCBmaWx0ZXI9JWQsIG1vZHZhbD0lZFxuIiwKKwloeiwgc3BlZWQsIGZpbHRlciwgbW9kdmFsKSk7CisKKyAgICBkaXYgPSBtb2RkaXYgKiBzcGVlZDsKKyAgICBicmdkaXYgPSAoaHogKyBkaXYgLSAxKSAvIGRpdjsKKworICAgIFBSSU5URCgoIlx0XHRtb2RkaXY9JWQsIGJyZ2Rpdj0lZFxuIiwgbW9kZGl2LCBicmdkaXYpKTsKKworICAgICpicmd2YWwgPSAoYnJnZGl2IC8gMikgLSAzIC0gKDIqZmlsdGVyKTsKKworICAgIGlmICgoKmJyZ3ZhbCA8IDApIHx8ICgqYnJndmFsID4gMjU1KSkgeworCSAgUFJJTlREKCgiXHRcdHJlamVjdGVkIGJyZ3ZhbD0lZFxuIiwgKmJyZ3ZhbCkpOworCSAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGJyZ2RpdiA9IDIgKiAoKmJyZ3ZhbCArIDMgKyAoMiAqIGZpbHRlcikpOworICAgIGRpdiA9IG1vZGRpdiAqIGJyZ2RpdiA7CisgICAgKnRvdHNwZWVkID0gKGh6ICsgZGl2IC0gMSkgLyBkaXY7CisKKyAgICBQUklOVEQoKCJcdFx0YWNjZXB0ZWQgYnJndmFsPSVkLCB0b3RzcGVlZD0lZFxuIiwgKmJyZ3ZhbCwgKnRvdHNwZWVkKSk7CisKKyAgICByZXR1cm4gIDA7Cit9CisKKy8qCisgKiBTZXRzIHRoZSBJMkMgY2xvY2sgcHJlZGl2aWRlciBhbmQgZGl2aWRlciB0byBtZWV0IHJlcXVpcmVkIGNsb2NrIHNwZWVkLgorICovCitzdGF0aWMgaW50IGkyY19zZXRyYXRlKGludCBoeiwgaW50IHNwZWVkKQoreworICAgIGltbWFwX3QJKmltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUiA7CisgICAgdm9sYXRpbGUgaTJjODI2MF90ICppMmMgPSAoaTJjODI2MF90ICopJmltbWFwLT5pbV9pMmM7CisgICAgaW50IGJyZ3ZhbCwKKwkgIG1vZHZhbCwJLyogMC0zICovCisJICBiZXN0c3BlZWRfZGlmZiA9IHNwZWVkLAorCSAgYmVzdHNwZWVkX2JyZ3ZhbD0wLAorCSAgYmVzdHNwZWVkX21vZHZhbD0wLAorCSAgYmVzdHNwZWVkX2ZpbHRlcj0wLAorCSAgdG90c3BlZWQsCisJICBmaWx0ZXIgPSAwOyAvKiBVc2UgdGhpcyBmaXhlZCB2YWx1ZSAqLworCisJZm9yIChtb2R2YWwgPSAwOyBtb2R2YWwgPCA0OyBtb2R2YWwrKykKKwl7CisJCWlmIChpMmNfcm91bmRyYXRlIChoeiwgc3BlZWQsIGZpbHRlciwgbW9kdmFsLCAmYnJndmFsLCAmdG90c3BlZWQpID09IDApCisJCXsKKwkJCWludCBkaWZmID0gc3BlZWQgLSB0b3RzcGVlZCA7CisKKwkJCWlmICgoZGlmZiA+PSAwKSAmJiAoZGlmZiA8IGJlc3RzcGVlZF9kaWZmKSkKKwkJCXsKKwkJCQliZXN0c3BlZWRfZGlmZiAJPSBkaWZmIDsKKwkJCQliZXN0c3BlZWRfbW9kdmFsIAk9IG1vZHZhbDsKKwkJCQliZXN0c3BlZWRfYnJndmFsIAk9IGJyZ3ZhbDsKKwkJCQliZXN0c3BlZWRfZmlsdGVyIAk9IGZpbHRlcjsKKwkJCX0KKwkJfQorCX0KKworICAgIFBSSU5URCgoIltJMkNdIEJlc3QgaXM6XG4iKSk7CisgICAgUFJJTlREKCgiW0kyQ10gQ1BVPSVkaHogUkFURT0lZCBGPSVkIEkyTU9EPSUwOHggSTJCUkc9JTA4eCBESUZGPSVkaHpcbiIsCisJCSAgIGh6LCBzcGVlZCwKKwkJICAgYmVzdHNwZWVkX2ZpbHRlciwgYmVzdHNwZWVkX21vZHZhbCwgYmVzdHNwZWVkX2JyZ3ZhbCwKKwkJICAgYmVzdHNwZWVkX2RpZmYpKTsKKworICAgIGkyYy0+aTJjX2kybW9kIHw9ICgoYmVzdHNwZWVkX21vZHZhbCAmIDMpIDw8IDEpIHwgKGJlc3RzcGVlZF9maWx0ZXIgPDwgMyk7CisgICAgaTJjLT5pMmNfaTJicmcgPSBiZXN0c3BlZWRfYnJndmFsICYgMHhmZjsKKworICAgIFBSSU5URCgoIltJMkNdIGkybW9kPSUwOHggaTJicmc9JTA4eFxuIiwgaTJjLT5pMmNfaTJtb2QsIGkyYy0+aTJjX2kyYnJnKSk7CisKKyAgICByZXR1cm4gMSA7Cit9CisKK3ZvaWQgaTJjX2luaXQoaW50IHNwZWVkLCBpbnQgc2xhdmVhZGQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVIgOworCXZvbGF0aWxlIGNwbTgyNjBfdCAqY3AgPSAoY3BtODI2MF90ICopJmltbWFwLT5pbV9jcG07CisJdm9sYXRpbGUgaTJjODI2MF90ICppMmMJPSAoaTJjODI2MF90ICopJmltbWFwLT5pbV9pMmM7CisJdm9sYXRpbGUgaWljX3QgKmlpcDsKKwl1bG9uZyByYmFzZSwgdGJhc2U7CisJdm9sYXRpbGUgSTJDX0JEICpyeGJkLCAqdHhiZDsKKwl1aW50IGRwYWRkcjsKKworCWRwYWRkciA9ICooKHVuc2lnbmVkIHNob3J0KikoJmltbWFwLT5pbV9kcHJhbWJhc2VbUFJPRkZfSTJDX0JBU0VdKSk7CisJaWYgKGRwYWRkciA9PSAwKSB7CisJICAgIC8qIG5lZWQgdG8gYWxsb2NhdGUgZHVhbCBwb3J0IHJhbSAqLworCSAgICBkcGFkZHIgPSBtODI2MF9jcG1fZHBhbGxvYyg2NCArCisJCShOVU1fUlhfQkRTICogc2l6ZW9mKEkyQ19CRCkpICsgKE5VTV9UWF9CRFMgKiBzaXplb2YoSTJDX0JEKSkgKworCQlNQVhfVFhfU1BBQ0UsIDY0KTsKKwkgICAgKigodW5zaWduZWQgc2hvcnQqKSgmaW1tYXAtPmltX2RwcmFtYmFzZVtQUk9GRl9JMkNfQkFTRV0pKSA9IGRwYWRkcjsKKwl9CisKKwkvKgorCSAqIGluaXRpYWxpc2UgZGF0YSBpbiBkdWFsIHBvcnQgcmFtOgorCSAqCisJICogCSAgZHBhZGRyIC0+IHBhcmFtZXRlciByYW0gKDY0IGJ5dGVzKQorCSAqICAgICAgICAgcmJhc2UgLT4gcnggQkQgICAgICAgICAoTlVNX1JYX0JEUyAqIHNpemVvZihJMkNfQkQpIGJ5dGVzKQorCSAqICAgICAgICAgdGJhc2UgLT4gdHggQkQgICAgICAgICAoTlVNX1RYX0JEUyAqIHNpemVvZihJMkNfQkQpIGJ5dGVzKQorCSAqICAgICAgICAgICAgICAgICAgdHggYnVmZmVyICAgICAoTUFYX1RYX1NQQUNFIGJ5dGVzKQorCSAqLworCisJaWlwID0gKGlpY190ICopJmltbWFwLT5pbV9kcHJhbWJhc2VbZHBhZGRyXTsKKwltZW1zZXQoKHZvaWQqKWlpcCwgMCwgc2l6ZW9mKGlpY190KSk7CisKKwlyYmFzZSA9IGRwYWRkciArIDY0OworCXRiYXNlID0gcmJhc2UgKyBOVU1fUlhfQkRTICogc2l6ZW9mKEkyQ19CRCk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlpMmMtPmkyY19pMm1vZCA9IDB4MDA7CisJaTJjLT5pMmNfaTJjbXIgPSAweDAwOworCWkyYy0+aTJjX2kyY2VyID0gMHhmZjsKKwlpMmMtPmkyY19pMmFkZCA9IHNsYXZlYWRkOworCisJLyoKKwkgKiBTZXQgdGhlIEkyQyBCUkcgQ2xvY2sgZGl2aXNpb24gZmFjdG9yIGZyb20gZGVzaXJlZCBpMmMgcmF0ZQorCSAqIGFuZCBjdXJyZW50IENQVSByYXRlICh3ZSBhc3N1bWUgc2NjciBkZmJnciBmaWVsZCBpcyAwOworCSAqIGRpdmlkZSBCUkdDTEsgYnkgMSkKKwkgKi8KKwlQUklOVEQoKCJbSTJDXSBTZXR0aW5nIHJhdGUuLi5cbiIpKTsKKwlpMmNfc2V0cmF0ZSAoZ2QtPmJyZ19jbGssIENGR19JMkNfU1BFRUQpIDsKKworCS8qIFNldCBJMkMgY29udHJvbGxlciBpbiBtYXN0ZXIgbW9kZSAqLworCWkyYy0+aTJjX2kyY29tID0gMHgwMTsKKworCS8qIEluaXRpYWxpemUgVHgvUnggcGFyYW1ldGVycyAqLworCWlpcC0+aWljX3JiYXNlID0gcmJhc2U7CisJaWlwLT5paWNfdGJhc2UgPSB0YmFzZTsKKwlyeGJkID0gKEkyQ19CRCAqKSgodW5zaWduZWQgY2hhciAqKSZpbW1hcC0+aW1fZHByYW1iYXNlW2lpcC0+aWljX3JiYXNlXSk7CisJdHhiZCA9IChJMkNfQkQgKikoKHVuc2lnbmVkIGNoYXIgKikmaW1tYXAtPmltX2RwcmFtYmFzZVtpaXAtPmlpY190YmFzZV0pOworCisJUFJJTlREKCgiW0kyQ10gcmJhc2UgPSAlMDR4XG4iLCBpaXAtPmlpY19yYmFzZSkpOworCVBSSU5URCgoIltJMkNdIHRiYXNlID0gJTA0eFxuIiwgaWlwLT5paWNfdGJhc2UpKTsKKwlQUklOVEQoKCJbSTJDXSByeGJkID0gJTA4eFxuIiwgKGludClyeGJkKSk7CisJUFJJTlREKCgiW0kyQ10gdHhiZCA9ICUwOHhcbiIsIChpbnQpdHhiZCkpOworCisJLyogU2V0IGJpZyBlbmRpYW4gYnl0ZSBvcmRlciAqLworCWlpcC0+aWljX3RmY3IgPSAweDEwOworCWlpcC0+aWljX3JmY3IgPSAweDEwOworCisJLyogU2V0IG1heGltdW0gcmVjZWl2ZSBzaXplLiAqLworCWlpcC0+aWljX21yYmxyID0gSTJDX1JYVFhfTEVOOworCisgICAgY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoQ1BNX0NSX0kyQ19QQUdFLAorCQkJCQkJCUNQTV9DUl9JMkNfU0JMT0NLLAorCQkJCQkJCTB4MDAsCisJCQkJCQkJQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisgICAgZG8geworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7CisgICAgfSB3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKTsKKworCS8qIENsZWFyIGV2ZW50cyBhbmQgaW50ZXJydXB0cyAqLworCWkyYy0+aTJjX2kyY2VyID0gMHhmZjsKKwlpMmMtPmkyY19pMmNtciA9IDB4MDA7Cit9CisKK3N0YXRpYwordm9pZCBpMmNfbmV3aW8oaTJjX3N0YXRlX3QgKnN0YXRlKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUiA7CisJdm9sYXRpbGUgaWljX3QgKmlpcDsKKwl1aW50IGRwYWRkcjsKKworCVBSSU5URCgoIltJMkNdIGkyY19uZXdpb1xuIikpOworCisJZHBhZGRyID0gKigodW5zaWduZWQgc2hvcnQqKSgmaW1tYXAtPmltX2RwcmFtYmFzZVtQUk9GRl9JMkNfQkFTRV0pKTsKKwlpaXAgPSAoaWljX3QgKikmaW1tYXAtPmltX2RwcmFtYmFzZVtkcGFkZHJdOworCXN0YXRlLT5yeF9pZHggPSAwOworCXN0YXRlLT50eF9pZHggPSAwOworCXN0YXRlLT5yeGJkID0gKHZvaWQqKSZpbW1hcC0+aW1fZHByYW1iYXNlW2lpcC0+aWljX3JiYXNlXTsKKwlzdGF0ZS0+dHhiZCA9ICh2b2lkKikmaW1tYXAtPmltX2RwcmFtYmFzZVtpaXAtPmlpY190YmFzZV07CisJc3RhdGUtPnR4X3NwYWNlID0gTUFYX1RYX1NQQUNFOworCXN0YXRlLT50eF9idWYgPSAodWNoYXIqKXN0YXRlLT50eGJkICsgTlVNX1RYX0JEUyAqIHNpemVvZihJMkNfQkQpOworCXN0YXRlLT5lcnJfY2IgPSBOVUxMOworCisJUFJJTlREKCgiW0kyQ10gcnhiZCA9ICUwOHhcbiIsIChpbnQpc3RhdGUtPnJ4YmQpKTsKKwlQUklOVEQoKCJbSTJDXSB0eGJkID0gJTA4eFxuIiwgKGludClzdGF0ZS0+dHhiZCkpOworCVBSSU5URCgoIltJMkNdIHR4X2J1ZiA9ICUwOHhcbiIsIChpbnQpc3RhdGUtPnR4X2J1ZikpOworCisJLyogY2xlYXIgdGhlIGJ1ZmZlciBtZW1vcnkgKi8KKwltZW1zZXQoKGNoYXIgKilzdGF0ZS0+dHhfYnVmLCAwLCBNQVhfVFhfU1BBQ0UpOworfQorCitzdGF0aWMKK2ludCBpMmNfc2VuZChpMmNfc3RhdGVfdCAqc3RhdGUsCisJCQkgdW5zaWduZWQgY2hhciBhZGRyZXNzLAorCQkJIHVuc2lnbmVkIGNoYXIgc2Vjb25kYXJ5X2FkZHJlc3MsCisJCQkgdW5zaWduZWQgaW50IGZsYWdzLAorCQkJIHVuc2lnbmVkIHNob3J0IHNpemUsCisJCQkgdW5zaWduZWQgY2hhciAqZGF0YW91dCkKK3sKKwl2b2xhdGlsZSBJMkNfQkQgKnR4YmQ7CisJaW50IGksajsKKworCVBSSU5URCgoIltJMkNdIGkyY19zZW5kIGFkZD0lMDJkIHNlYz0lMDJkIGZsYWc9JTAyZCBzaXplPSVkXG4iLAorCQkJYWRkcmVzcywgc2Vjb25kYXJ5X2FkZHJlc3MsIGZsYWdzLCBzaXplKSk7CisKKwkvKiB0cnlpbmcgdG8gc2VuZCBtZXNzYWdlIGxhcmdlciB0aGFuIEJEICovCisJaWYgKHNpemUgPiBJMkNfUlhUWF9MRU4pCisJICByZXR1cm4gSTJDRVJSX01TR19UT09fTE9ORzsKKworCS8qIG5vIG1vcmUgZnJlZSBiZHMgKi8KKwlpZiAoc3RhdGUtPnR4X2lkeCA+PSBOVU1fVFhfQkRTIHx8IHN0YXRlLT50eF9zcGFjZSA8ICgyICsgc2l6ZSkpCisJICByZXR1cm4gSTJDRVJSX05PX0JVRkZFUlM7CisKKwl0eGJkID0gKEkyQ19CRCAqKXN0YXRlLT50eGJkOworCXR4YmQtPmFkZHIgPSBzdGF0ZS0+dHhfYnVmOworCisJUFJJTlREKCgiW0kyQ10gdHhiZCA9ICUwOHhcbiIsIChpbnQpdHhiZCkpOworCisgICAgaWYgKGZsYWdzICYgSTJDRl9TVEFSVF9DT05EKQorICAgIHsKKwlQUklOVEQoKCJbSTJDXSBGb3JtYXR0aW5nIGFkZHJlc3Nlcy4uLlxuIikpOworCWlmIChmbGFncyAmIEkyQ0ZfRU5BQkxFX1NFQ09OREFSWSkKKwl7CisJCXR4YmQtPmxlbmd0aCA9IHNpemUgKyAyOyAgLyogTGVuZ3RoIG9mIG1lc3NhZ2UgcGx1cyBkZXN0IGFkZHJlc3NlcyAqLworCQl0eGJkLT5hZGRyWzBdID0gYWRkcmVzcyA8PCAxOworCQl0eGJkLT5hZGRyWzFdID0gc2Vjb25kYXJ5X2FkZHJlc3M7CisJCWkgPSAyOworCX0KKwllbHNlCisJeworCQl0eGJkLT5sZW5ndGggPSBzaXplICsgMTsgIC8qIExlbmd0aCBvZiBtZXNzYWdlIHBsdXMgZGVzdCBhZGRyZXNzICovCisJCXR4YmQtPmFkZHJbMF0gPSBhZGRyZXNzIDw8IDE7ICAvKiBXcml0ZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHRvIEJEICovCisJCWkgPSAxOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwl0eGJkLT5sZW5ndGggPSBzaXplOyAgLyogTGVuZ3RoIG9mIG1lc3NhZ2UgKi8KKwlpID0gMDsKKyAgICB9CisKKwkvKiBzZXQgdXAgdHhiZCAqLworCXR4YmQtPnN0YXR1cyA9IEJEX1NDX1JFQURZOworCWlmIChmbGFncyAmIEkyQ0ZfU1RBUlRfQ09ORCkKKwkgIHR4YmQtPnN0YXR1cyB8PSBCRF9JMkNfVFhfU1RBUlQ7CisJaWYgKGZsYWdzICYgSTJDRl9TVE9QX0NPTkQpCisJICB0eGJkLT5zdGF0dXMgfD0gQkRfU0NfTEFTVCB8IEJEX1NDX1dSQVA7CisKKwkvKiBDb3B5IGRhdGEgdG8gc2VuZCBpbnRvIGJ1ZmZlciAqLworCVBSSU5URCgoIltJMkNdIGNvcHkgZGF0YS4uLlxuIikpOworCWZvcihqID0gMDsgaiA8IHNpemU7IGkrKywgaisrKQorCSAgdHhiZC0+YWRkcltpXSA9IGRhdGFvdXRbal07CisKKwlQUklOVEQoKCJbSTJDXSB0eGJkOiBsZW5ndGg9MHglMDR4IHN0YXR1cz0weCUwNHggYWRkclswXT0weCUwMnggYWRkclsxXT0weCUwMnhcbiIsCisJCSAgIHR4YmQtPmxlbmd0aCwKKwkJICAgdHhiZC0+c3RhdHVzLAorCQkgICB0eGJkLT5hZGRyWzBdLAorCQkgICB0eGJkLT5hZGRyWzFdKSk7CisKKwkvKiBhZHZhbmNlIHN0YXRlICovCisJc3RhdGUtPnR4X2J1ZiArPSB0eGJkLT5sZW5ndGg7CisJc3RhdGUtPnR4X3NwYWNlIC09IHR4YmQtPmxlbmd0aDsKKwlzdGF0ZS0+dHhfaWR4Kys7CisJc3RhdGUtPnR4YmQgPSAodm9pZCopKHR4YmQgKyAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMKK2ludCBpMmNfcmVjZWl2ZShpMmNfc3RhdGVfdCAqc3RhdGUsCisJCQkJdW5zaWduZWQgY2hhciBhZGRyZXNzLAorCQkJCXVuc2lnbmVkIGNoYXIgc2Vjb25kYXJ5X2FkZHJlc3MsCisJCQkJdW5zaWduZWQgaW50IGZsYWdzLAorCQkJCXVuc2lnbmVkIHNob3J0IHNpemVfdG9fZXhwZWN0LAorCQkJCXVuc2lnbmVkIGNoYXIgKmRhdGFpbikKK3sKKwl2b2xhdGlsZSBJMkNfQkQgKnJ4YmQsICp0eGJkOworCisJUFJJTlREKCgiW0kyQ10gaTJjX3JlY2VpdmUgJTAyZCAlMDJkICUwMmRcbiIsIGFkZHJlc3MsIHNlY29uZGFyeV9hZGRyZXNzLCBmbGFncykpOworCisJLyogRXhwZWN0ZWQgdG8gcmVjZWl2ZSB0b28gbXVjaCAqLworCWlmIChzaXplX3RvX2V4cGVjdCA+IEkyQ19SWFRYX0xFTikKKwkgIHJldHVybiBJMkNFUlJfTVNHX1RPT19MT05HOworCisJLyogbm8gbW9yZSBmcmVlIGJkcyAqLworCWlmIChzdGF0ZS0+dHhfaWR4ID49IE5VTV9UWF9CRFMgfHwgc3RhdGUtPnJ4X2lkeCA+PSBOVU1fUlhfQkRTCisJCSB8fCBzdGF0ZS0+dHhfc3BhY2UgPCAyKQorCSAgcmV0dXJuIEkyQ0VSUl9OT19CVUZGRVJTOworCisJcnhiZCA9IChJMkNfQkQgKilzdGF0ZS0+cnhiZDsKKwl0eGJkID0gKEkyQ19CRCAqKXN0YXRlLT50eGJkOworCisJUFJJTlREKCgiW0kyQ10gcnhiZCA9ICUwOHhcbiIsIChpbnQpcnhiZCkpOworCVBSSU5URCgoIltJMkNdIHR4YmQgPSAlMDh4XG4iLCAoaW50KXR4YmQpKTsKKworCXR4YmQtPmFkZHIgPSBzdGF0ZS0+dHhfYnVmOworCisJLyogc2V0IHVwIFRYQkQgZm9yIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlpZiAoZmxhZ3MgJiBJMkNGX0VOQUJMRV9TRUNPTkRBUlkpCisJeworCQl0eGJkLT5sZW5ndGggPSAyOworCQl0eGJkLT5hZGRyWzBdID0gYWRkcmVzcyA8PCAxOyAgIC8qIFdyaXRlIGRhdGEgKi8KKwkJdHhiZC0+YWRkclsxXSA9IHNlY29uZGFyeV9hZGRyZXNzOyAgLyogSW50ZXJuYWwgYWRkcmVzcyAqLworCQl0eGJkLT5zdGF0dXMgPSBCRF9TQ19SRUFEWTsKKwl9CisJZWxzZQorCXsKKwkJdHhiZC0+bGVuZ3RoID0gMSArIHNpemVfdG9fZXhwZWN0OworCQl0eGJkLT5hZGRyWzBdID0gKGFkZHJlc3MgPDwgMSkgfCAweDAxOworCQl0eGJkLT5zdGF0dXMgPSBCRF9TQ19SRUFEWTsKKwkJbWVtc2V0KCZ0eGJkLT5hZGRyWzFdLCAwLCB0eGJkLT5sZW5ndGgpOworCX0KKworCS8qIHNldCB1cCByeGJkIGZvciByZWNlcHRpb24gKi8KKwlyeGJkLT5zdGF0dXMgPSBCRF9TQ19FTVBUWTsKKwlyeGJkLT5sZW5ndGggPSBzaXplX3RvX2V4cGVjdDsKKwlyeGJkLT5hZGRyID0gZGF0YWluOworCisJdHhiZC0+c3RhdHVzIHw9IEJEX0kyQ19UWF9TVEFSVDsKKwlpZiAoZmxhZ3MgJiBJMkNGX1NUT1BfQ09ORCkKKwl7CisJCXR4YmQtPnN0YXR1cyB8PSBCRF9TQ19MQVNUIHwgQkRfU0NfV1JBUDsKKwkJcnhiZC0+c3RhdHVzIHw9IEJEX1NDX1dSQVA7CisJfQorCisJUFJJTlREKCgiW0kyQ10gdHhiZDogbGVuZ3RoPTB4JTA0eCBzdGF0dXM9MHglMDR4IGFkZHJbMF09MHglMDJ4IGFkZHJbMV09MHglMDJ4XG4iLAorCQkgICB0eGJkLT5sZW5ndGgsCisJCSAgIHR4YmQtPnN0YXR1cywKKwkJICAgdHhiZC0+YWRkclswXSwKKwkJICAgdHhiZC0+YWRkclsxXSkpOworCVBSSU5URCgoIltJMkNdIHJ4YmQ6IGxlbmd0aD0weCUwNHggc3RhdHVzPTB4JTA0eCBhZGRyWzBdPTB4JTAyeCBhZGRyWzFdPTB4JTAyeFxuIiwKKwkJICAgcnhiZC0+bGVuZ3RoLAorCQkgICByeGJkLT5zdGF0dXMsCisJCSAgIHJ4YmQtPmFkZHJbMF0sCisJCSAgIHJ4YmQtPmFkZHJbMV0pKTsKKworCS8qIGFkdmFuY2Ugc3RhdGUgKi8KKwlzdGF0ZS0+dHhfYnVmICs9IHR4YmQtPmxlbmd0aDsKKwlzdGF0ZS0+dHhfc3BhY2UgLT0gdHhiZC0+bGVuZ3RoOworCXN0YXRlLT50eF9pZHgrKzsKKwlzdGF0ZS0+dHhiZCA9ICh2b2lkKikodHhiZCArIDEpOworCXN0YXRlLT5yeF9pZHgrKzsKKwlzdGF0ZS0+cnhiZCA9ICh2b2lkKikocnhiZCArIDEpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljCitpbnQgaTJjX2RvaW8oaTJjX3N0YXRlX3QgKnN0YXRlKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUiA7CisJdm9sYXRpbGUgaWljX3QgKmlpcDsKKwl2b2xhdGlsZSBpMmM4MjYwX3QgKmkyYwk9IChpMmM4MjYwX3QgKikmaW1tYXAtPmltX2kyYzsKKwl2b2xhdGlsZSBJMkNfQkQgKnR4YmQsICpyeGJkOworCWludCAgajsKKyAgICAgICAgaW50ICB0aW1lb3V0OworCXVpbnQgZHBhZGRyOworCisJUFJJTlREKCgiW0kyQ10gaTJjX2RvaW9cbiIpKTsKKworICAgICAgICB0aW1lb3V0ID0gVE9VVF9MT09QICogMjU2OwkvKiBhcmJpdHJhcmlseSBsb25nICovCisKKwlpZiAoc3RhdGUtPnR4X2lkeCA8PSAwICYmIHN0YXRlLT5yeF9pZHggPD0gMCkgeworCQlQUklOVEQoKCJbSTJDXSBObyBJL08gaXMgcXVldWVkXG4iKSk7CisJCXJldHVybiBJMkNFUlJfUVVFVUVfRU1QVFk7CisJfQorCisJZHBhZGRyID0gKigodW5zaWduZWQgc2hvcnQqKSgmaW1tYXAtPmltX2RwcmFtYmFzZVtQUk9GRl9JMkNfQkFTRV0pKTsKKwlpaXAgPSAoaWljX3QgKikmaW1tYXAtPmltX2RwcmFtYmFzZVtkcGFkZHJdOworCWlpcC0+aWljX3JicHRyID0gaWlwLT5paWNfcmJhc2U7CisJaWlwLT5paWNfdGJwdHIgPSBpaXAtPmlpY190YmFzZTsKKworCS8qIEVuYWJsZSBJMkMgKi8KKwlQUklOVEQoKCJbSTJDXSBFbmFibGluZyBJMkMuLi5cbiIpKTsKKwlpMmMtPmkyY19pMm1vZCB8PSAweDAxOworCisJLyogQmVnaW4gdHJhbnNtaXNzaW9uICovCisJaTJjLT5pMmNfaTJjb20gfD0gMHg4MDsKKworCS8qIExvb3AgdW50aWwgdHJhbnNtaXQgJiByZWNlaXZlIGNvbXBsZXRlZCAqLworCisJdHhiZCA9ICgoSTJDX0JEKilzdGF0ZS0+dHhiZCkgLSAxOworCWogPSAwOworCWlmIChzdGF0ZS0+dHhfaWR4ID4gMCkgeworICAgICAgICAJdGltZW91dCA9IFRPVVRfTE9PUCAqIHR4YmQtPmxlbmd0aDsKKworCQlQUklOVEQoKCJbSTJDXSBUcmFuc21pdHRpbmcuLi4odHhiZD0weCUwOGx4KVxuIiwgKHVsb25nKXR4YmQpKTsKKwkJdWRlbGF5KFNUQVJUX0RFTEFZX1VTKTsJLyogZ2l2ZSBpdCB0aW1lIHRvIHN0YXJ0ICovCisJCXdoaWxlKCh0eGJkLT5zdGF0dXMgJiBCRF9TQ19SRUFEWSkgJiYgKGorKyA8IHRpbWVvdXQpKSB7CisJCQl1ZGVsYXkoREVMQVlfVVMpOworCQkJaWYgKGN0cmxjKCkpCisJCQkJcmV0dXJuICgtMSk7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7CisJCX0KKwl9CisKKwlyeGJkID0gKChJMkNfQkQqKXN0YXRlLT5yeGJkKSAtIDE7CisJaiA9IDA7CisJaWYgKChzdGF0ZS0+cnhfaWR4ID4gMCkgJiYgKGogPCB0aW1lb3V0KSkgeworICAgICAgICAJdGltZW91dCA9IFRPVVRfTE9PUCAqIHJ4YmQtPmxlbmd0aDsKKwkJUFJJTlREKCgiW0kyQ10gUmVjZWl2aW5nLi4uKHJ4YmQ9MHglMDhseClcbiIsICh1bG9uZylyeGJkKSk7CisJCXVkZWxheShTVEFSVF9ERUxBWV9VUyk7CS8qIGdpdmUgaXQgdGltZSB0byBzdGFydCAqLworCQl3aGlsZSgocnhiZC0+c3RhdHVzICYgQkRfU0NfRU1QVFkpICYmIChqKysgPCB0aW1lb3V0KSkgeworCQkJdWRlbGF5KERFTEFZX1VTKTsKKwkJCWlmIChjdHJsYygpKQorCQkJCXJldHVybiAoLTEpOworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOworCQl9CisJfQorCisJLyogVHVybiBvZmYgSTJDICovCisJaTJjLT5pMmNfaTJtb2QgJj0gfjB4MDE7CisKKwlpZiAoc3RhdGUtPmVycl9jYiAhPSBOVUxMKSB7CisJCWludCBuLCBpLCBiOworCisJCS8qCisJCSAqIGlmIHdlIGhhdmUgYW4gZXJyb3IgY2FsbGJhY2sgZnVuY3Rpb24sIGxvb2sgYXQgdGhlCisJCSAqIGVycm9yIGJpdHMgaW4gdGhlIGJkIHN0YXR1cyBhbmQgcGFzcyB0aGVtIGJhY2sKKwkJICovCisKKwkJaWYgKChuID0gc3RhdGUtPnR4X2lkeCkgPiAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQkJdHhiZCA9ICgoSTJDX0JEKilzdGF0ZS0+dHhiZCkgLSAobiAtIGkpOworCQkJCWlmICgoYiA9IHR4YmQtPnN0YXR1cyAmIEJEX0kyQ19UWF9FUlIpICE9IDApCisJCQkJCSgqc3RhdGUtPmVycl9jYikoSTJDRUNCX1RYX0VSUnxiLCBpKTsKKwkJCX0KKwkJfQorCisJCWlmICgobiA9IHN0YXRlLT5yeF9pZHgpID4gMCkgeworCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJCXJ4YmQgPSAoKEkyQ19CRCopc3RhdGUtPnJ4YmQpIC0gKG4gLSBpKTsKKwkJCQlpZiAoKGIgPSByeGJkLT5zdGF0dXMgJiBCRF9JMkNfUlhfRVJSKSAhPSAwKQorCQkJCQkoKnN0YXRlLT5lcnJfY2IpKEkyQ0VDQl9SWF9FUlJ8YiwgaSk7CisJCQl9CisJCX0KKworCQlpZiAoaiA+PSB0aW1lb3V0KQorCQkJKCpzdGF0ZS0+ZXJyX2NiKShJMkNFQ0JfVElNRU9VVCwgMCk7CisJfQorCisJLyogc29ydCBvdXQgZXJyb3JzIGFuZCByZXR1cm4gYXBwcm9wcmlhdGUgZ29vZC9lcnJvciBzdGF0dXMgKi8KKwlpZihqID49IHRpbWVvdXQpCisJCXJldHVybihJMkNFUlJfVElNRU9VVCk7CisJaWYoKHR4YmQtPnN0YXR1cyAmIEJEX0kyQ19UWF9FUlIpICE9IDApCisJCXJldHVybihJMkNFQ0JfVFhfRVJSIHwgKHR4YmQtPnN0YXR1cyAmIEkyQ0VDQl9UWF9NQVNLKSk7CisJaWYoKHJ4YmQtPnN0YXR1cyAmIEJEX0kyQ19SWF9FUlIpICE9IDApCisJCXJldHVybihJMkNFQ0JfUlhfRVJSIHwgKHJ4YmQtPnN0YXR1cyAmIEkyQ0VDQl9SWF9NQVNLKSk7CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgaGFkX3R4X25hazsKKworc3RhdGljIHZvaWQKK2kyY190ZXN0X2NhbGxiYWNrKGludCBmbGFncywgaW50IHhudW0pCit7CisJaWYgKChmbGFncyAmIEkyQ0VDQl9UWF9FUlIpICYmIChmbGFncyAmIEkyQ0VDQl9UWF9OQUspKQorCQloYWRfdHhfbmFrID0gMTsKK30KKworaW50IGkyY19wcm9iZSh1Y2hhciBjaGlwKQoreworCWkyY19zdGF0ZV90IHN0YXRlOworCWludCByYzsKKwl1Y2hhciBidWZbMV07CisKKwlpMmNfbmV3aW8oJnN0YXRlKTsKKworCXN0YXRlLmVycl9jYiA9IGkyY190ZXN0X2NhbGxiYWNrOworCWhhZF90eF9uYWsgPSAwOworCisJcmMgPSBpMmNfcmVjZWl2ZSgmc3RhdGUsIGNoaXAsIDAsIEkyQ0ZfU1RBUlRfQ09ORHxJMkNGX1NUT1BfQ09ORCwgMSwgYnVmKTsKKworCWlmIChyYyAhPSAwKQorCQlyZXR1cm4gKHJjKTsKKworCXJjID0gaTJjX2RvaW8oJnN0YXRlKTsKKworCWlmICgocmMgIT0gMCkgJiYgKHJjICE9IEkyQ0VSUl9USU1FT1VUKSkKKwkJcmV0dXJuIChyYyk7CisKKwlyZXR1cm4gKGhhZF90eF9uYWspOworfQorCisKK2ludAoraTJjX3JlYWQodWNoYXIgY2hpcCwgdWludCBhZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlpMmNfc3RhdGVfdCBzdGF0ZTsKKwl1Y2hhciB4YWRkcls0XTsKKwlpbnQgcmM7CisKKwl4YWRkclswXSA9IChhZGRyID4+IDI0KSAmIDB4RkY7CisJeGFkZHJbMV0gPSAoYWRkciA+PiAxNikgJiAweEZGOworCXhhZGRyWzJdID0gKGFkZHIgPj4gIDgpICYgMHhGRjsKKwl4YWRkclszXSA9ICBhZGRyICAgICAgICAmIDB4RkY7CisKKyNpZmRlZiBDRkdfSTJDX0VFUFJPTV9BRERSX09WRVJGTE9XCisJIC8qCisJICAqIEVFUFJPTSBjaGlwcyB0aGF0IGltcGxlbWVudCAiYWRkcmVzcyBvdmVyZmxvdyIgYXJlIG9uZXMKKwkgICogbGlrZSBDYXRhbHlzdCAyNFdDMDQvMDgvMTYgd2hpY2ggaGFzIDkvMTAvMTEgYml0cyBvZiBhZGRyZXNzCisJICAqIGFuZCB0aGUgZXh0cmEgYml0cyBlbmQgdXAgaW4gdGhlICJjaGlwIGFkZHJlc3MiIGJpdCBzbG90cy4KKwkgICogVGhpcyBtYWtlcyBhIDI0V0MwOCAoMUtieXRlKSBjaGlwIGxvb2sgbGlrZSBmb3VyIDI1NiBieXRlCisJICAqIGNoaXBzLgorICAJICAqCisJICAqIE5vdGUgdGhhdCB3ZSBjb25zaWRlciB0aGUgbGVuZ3RoIG9mIHRoZSBhZGRyZXNzIGZpZWxkIHRvIHN0aWxsCisJICAqIGJlIG9uZSBieXRlIGJlY2F1c2UgdGhlIGV4dHJhIGFkZHJlc3MgYml0cyBhcmUgaGlkZGVuIGluIHRoZQorCSAgKiBjaGlwIGFkZHJlc3MuCisJICAqLworCWNoaXAgfD0gKChhZGRyID4+IChhbGVuICogOCkpICYgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVyk7CisjZW5kaWYKKworCWkyY19uZXdpbygmc3RhdGUpOworCisJcmMgPSBpMmNfc2VuZCgmc3RhdGUsIGNoaXAsIDAsIEkyQ0ZfU1RBUlRfQ09ORCwgYWxlbiwgJnhhZGRyWzQtYWxlbl0pOworCWlmIChyYyAhPSAwKSB7CisJCXByaW50ZigiaTJjX3JlYWQ6IGkyY19zZW5kIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCXJldHVybiAxOworCX0KKworCXJjID0gaTJjX3JlY2VpdmUoJnN0YXRlLCBjaGlwLCAwLCBJMkNGX1NUT1BfQ09ORCwgbGVuLCBidWZmZXIpOworCWlmIChyYyAhPSAwKSB7CisJCXByaW50ZigiaTJjX3JlYWQ6IGkyY19yZWNlaXZlIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCXJldHVybiAxOworCX0KKworCXJjID0gaTJjX2RvaW8oJnN0YXRlKTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGYoImkyY19yZWFkOiBpMmNfZG9pbyBmYWlsZWQgKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludAoraTJjX3dyaXRlKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJaTJjX3N0YXRlX3Qgc3RhdGU7CisJdWNoYXIgeGFkZHJbNF07CisJaW50IHJjOworCisJeGFkZHJbMF0gPSAoYWRkciA+PiAyNCkgJiAweEZGOworCXhhZGRyWzFdID0gKGFkZHIgPj4gMTYpICYgMHhGRjsKKwl4YWRkclsyXSA9IChhZGRyID4+ICA4KSAmIDB4RkY7CisJeGFkZHJbM10gPSAgYWRkciAgICAgICAgJiAweEZGOworCisjaWZkZWYgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVworCSAvKgorCSAgKiBFRVBST00gY2hpcHMgdGhhdCBpbXBsZW1lbnQgImFkZHJlc3Mgb3ZlcmZsb3ciIGFyZSBvbmVzCisJICAqIGxpa2UgQ2F0YWx5c3QgMjRXQzA0LzA4LzE2IHdoaWNoIGhhcyA5LzEwLzExIGJpdHMgb2YgYWRkcmVzcworCSAgKiBhbmQgdGhlIGV4dHJhIGJpdHMgZW5kIHVwIGluIHRoZSAiY2hpcCBhZGRyZXNzIiBiaXQgc2xvdHMuCisJICAqIFRoaXMgbWFrZXMgYSAyNFdDMDggKDFLYnl0ZSkgY2hpcCBsb29rIGxpa2UgZm91ciAyNTYgYnl0ZQorCSAgKiBjaGlwcy4KKyAgCSAgKgorCSAgKiBOb3RlIHRoYXQgd2UgY29uc2lkZXIgdGhlIGxlbmd0aCBvZiB0aGUgYWRkcmVzcyBmaWVsZCB0byBzdGlsbAorCSAgKiBiZSBvbmUgYnl0ZSBiZWNhdXNlIHRoZSBleHRyYSBhZGRyZXNzIGJpdHMgYXJlIGhpZGRlbiBpbiB0aGUKKwkgICogY2hpcCBhZGRyZXNzLgorCSAgKi8KKwljaGlwIHw9ICgoYWRkciA+PiAoYWxlbiAqIDgpKSAmIENGR19JMkNfRUVQUk9NX0FERFJfT1ZFUkZMT1cpOworI2VuZGlmCisKKwlpMmNfbmV3aW8oJnN0YXRlKTsKKworCXJjID0gaTJjX3NlbmQoJnN0YXRlLCBjaGlwLCAwLCBJMkNGX1NUQVJUX0NPTkQsIGFsZW4sICZ4YWRkcls0LWFsZW5dKTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGYoImkyY193cml0ZTogZmlyc3QgaTJjX3NlbmQgZmFpbGVkICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmMgPSBpMmNfc2VuZCgmc3RhdGUsIDAsIDAsIEkyQ0ZfU1RPUF9DT05ELCBsZW4sIGJ1ZmZlcik7CisJaWYgKHJjICE9IDApIHsKKwkJcHJpbnRmKCJpMmNfd3JpdGU6IHNlY29uZCBpMmNfc2VuZCBmYWlsZWQgKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyYyA9IGkyY19kb2lvKCZzdGF0ZSk7CisJaWYgKHJjICE9IDApIHsKKwkJcHJpbnRmKCJpMmNfd3JpdGU6IGkyY19kb2lvIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwordWNoYXIKK2kyY19yZWdfcmVhZCh1Y2hhciBjaGlwLCB1Y2hhciByZWcpCit7CisJY2hhciBidWY7CisKKwlpMmNfcmVhZChjaGlwLCByZWcsIDEsICZidWYsIDEpOworCisJcmV0dXJuIChidWYpOworfQorCit2b2lkCitpMmNfcmVnX3dyaXRlKHVjaGFyIGNoaXAsIHVjaGFyIHJlZywgdWNoYXIgdmFsKQoreworCWkyY193cml0ZShjaGlwLCByZWcsIDEsICZ2YWwsIDEpOworfQorCisjZW5kaWYJLyogQ09ORklHX0hBUkRfSTJDICovCmRpZmYgLS1naXQgYS9jcHUvbXBjOHh4L2NwdS5jIGIvY3B1L21wYzh4eC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWI1OGIwCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzh4eC9jcHUuYwpAQCAtMCwwICsxLDUxNiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBtOHh4LmMKKyAqCisgKiBDUFUgc3BlY2lmaWMgY29kZQorICoKKyAqIHdyaXR0ZW4gb3IgY29sbGVjdGVkIGFuZCBzb21ldGltZXMgcmV3cml0dGVuIGJ5CisgKiBNYWdudXMgRGFtbSA8ZGFtbUBiaXRzbWFydC5jb20+CisgKgorICogbWlub3IgbW9kaWZpY2F0aW9ucyBieQorICogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisKK3N0YXRpYyBjaGFyICpjcHVfd2FybmluZyA9ICJcbiAgICAgICAgICIgXAorCSIqKiogV2FybmluZzogQ1BVIENvcmUgaGFzIFNpbGljb24gQnVncyAtLSBDaGVjayB0aGUgRXJyYXRhICoqKiI7CisKKyNpZiAoKGRlZmluZWQoQ09ORklHX01QQzg2MCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODU1KSkgJiYgXAorICAgICAhZGVmaW5lZChDT05GSUdfTVBDODYyKSkKKyMgaWZkZWYJQ09ORklHX01QQzg1NQorIyAgZGVmaW5lCUlEX1NUUgkiUEM4NTUiCisjIGVsc2UKKyMgIGRlZmluZQlJRF9TVFIJIlBDODYwIgorIyBlbmRpZgorCitzdGF0aWMgaW50IGNoZWNrX0NQVSAobG9uZyBjbG9jaywgdWludCBwdnIsIHVpbnQgaW1tcikKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIChpbW1yICYgMHhGRkZGMDAwMCk7CisJdWludCBrLCBtOworCWNoYXIgYnVmWzMyXTsKKwljaGFyIHByZSA9ICdYJzsKKwljaGFyICptaWQgPSAieHgiOworCWNoYXIgKnN1ZjsKKworCS8qIHRoZSBoaWdoZXN0IDE2IGJpdHMgc2hvdWxkIGJlIDB4MDA1MCBmb3IgYSA4NjAgKi8KKworCWlmICgocHZyID4+IDE2KSAhPSAweDAwNTApCisJCXJldHVybiAtMTsKKworCWsgPSAoaW1tciA8PCAxNikgfCAqKCh1c2hvcnQgKikgJiBpbW1hcC0+aW1fY3BtLmNwX2RwYXJhbVsweEIwXSk7CisJbSA9IDA7CisKKwlzd2l0Y2ggKGspIHsKKwljYXNlIDB4MDAwMjAwMDE6IHByZSA9ICdwJzsgc3VmID0gIiI7IGJyZWFrOworCWNhc2UgMHgwMDAzMDAwMTogc3VmID0gIiI7IGJyZWFrOworCWNhc2UgMHgwMDEyMDAwMzogc3VmID0gIkEiOyBicmVhazsKKwljYXNlIDB4MDAxMzAwMDM6IHN1ZiA9ICJBMyI7IGJyZWFrOworCisJY2FzZSAweDAwMjAwMDA0OiBzdWYgPSAiQiI7IGJyZWFrOworCisJY2FzZSAweDAwMzAwMDA0OiBzdWYgPSAiQyI7IGJyZWFrOworCWNhc2UgMHgwMDMxMDAwNDogc3VmID0gIkMxIjsgbSA9IDE7CisJCWJyZWFrOworCisJY2FzZSAweDAwMjAwMDY0OiBtaWQgPSAiU1IiOyBzdWYgPSAiQiI7IGJyZWFrOworCWNhc2UgMHgwMDMwMDA2NTogbWlkID0gIlNSIjsgc3VmID0gIkMiOyBicmVhazsKKwljYXNlIDB4MDAzMTAwNjU6IG1pZCA9ICJTUiI7IHN1ZiA9ICJDMSI7IG0gPSAxOyBicmVhazsKKwljYXNlIDB4MDUwMTAwMDA6IHN1ZiA9ICJEMyI7IG0gPSAxOyBicmVhazsKKwljYXNlIDB4MDUwMjAwMDA6IHN1ZiA9ICJENCI7IG0gPSAxOyBicmVhazsKKworCQkvKiB0aGlzIHZhbHVlIGlzIG5vdCBkb2N1bWVudGVkIGFueXdoZXJlICovCisJY2FzZSAweDQwMDAwMDAwOiBwcmUgPSAnUCc7IHN1ZiA9ICJEIjsgbSA9IDE7IGJyZWFrOworCisJZGVmYXVsdDogc3VmID0gTlVMTDsgYnJlYWs7CisJfQorCisJaWYgKHN1ZikKKwkJcHJpbnRmICgiJWMiIElEX1NUUiAiJXNaUG5uJXMiLCBwcmUsIG1pZCwgc3VmKTsKKwllbHNlCisJCXByaW50ZiAoInVua25vd24gTSIgSURfU1RSICIgKDB4JTA4eCkiLCBrKTsKKworCXByaW50ZiAoIiBhdCAlcyBNSHo6Iiwgc3RybWh6IChidWYsIGNsb2NrKSk7CisKKwlwcmludGYgKCIgJXUga0IgSS1DYWNoZSIsIGNoZWNraWNhY2hlICgpID4+IDEwKTsKKwlwcmludGYgKCIgJXUga0IgRC1DYWNoZSIsIGNoZWNrZGNhY2hlICgpID4+IDEwKTsKKworCS8qIGxldHMgY2hlY2sgYW5kIHNlZSBpZiB3ZSdyZSBydW5uaW5nIG9uIGEgODYwVCAob3IgUD8pICovCisKKwlpbW1hcC0+aW1fY3BtLmNwX2ZlYy5mZWNfYWRkcl9sb3cgPSAweDEyMzQ1Njc4OworCWlmIChpbW1hcC0+aW1fY3BtLmNwX2ZlYy5mZWNfYWRkcl9sb3cgPT0gMHgxMjM0NTY3OCkgeworCQlwcmludGYgKCIgRkVDIHByZXNlbnQiKTsKKwl9CisKKwlpZiAoIW0pIHsKKwkJcHV0cyAoY3B1X3dhcm5pbmcpOworCX0KKworCXB1dGMgKCdcbicpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg2MikKKworc3RhdGljIGludCBjaGVja19DUFUgKGxvbmcgY2xvY2ssIHVpbnQgcHZyLCB1aW50IGltbXIpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSAoaW1tciAmIDB4RkZGRjAwMDApOworCXVpbnQgaywgbTsKKwljaGFyIGJ1ZlszMl07CisJY2hhciBwcmUgPSAnWCc7CisJY2hhciAqbWlkID0gInh4IjsKKwljaGFyICpzdWY7CisKKwkvKiB0aGUgaGlnaGVzdCAxNiBiaXRzIHNob3VsZCBiZSAweDAwNTAgZm9yIGEgOHh4ICovCisKKwlpZiAoKHB2ciA+PiAxNikgIT0gMHgwMDUwKQorCQlyZXR1cm4gLTE7CisKKwlrID0gKGltbXIgPDwgMTYpIHwgKigodXNob3J0ICopICYgaW1tYXAtPmltX2NwbS5jcF9kcGFyYW1bMHhCMF0pOworCW0gPSAwOworCisJc3dpdGNoIChrKSB7CisKKwkJLyogdGhpcyB2YWx1ZSBpcyBub3QgZG9jdW1lbnRlZCBhbnl3aGVyZSAqLworCWNhc2UgMHgwNjAwMDAwMDogbWlkID0gIlAiOyBzdWYgPSAiMCI7IGJyZWFrOworCWNhc2UgMHgwNjAxMDAwMTogbWlkID0gIlAiOyBzdWYgPSAiQSI7IG0gPSAxOyBicmVhazsKKwljYXNlIDB4MDcwMDAwMDM6IG1pZCA9ICJQIjsgc3VmID0gIkIiOyBtID0gMTsgYnJlYWs7CisJZGVmYXVsdDogc3VmID0gTlVMTDsgYnJlYWs7CisJfQorCisJaWYgKHN1ZikKKwkJcHJpbnRmICgiJWNQQzg2MiVzWlBubiVzIiwgcHJlLCBtaWQsIHN1Zik7CisJZWxzZQorCQlwcmludGYgKCJ1bmtub3duIE1QQzg2MiAoMHglMDh4KSIsIGspOworCisJcHJpbnRmICgiIGF0ICVzIE1IejoiLCBzdHJtaHogKGJ1ZiwgY2xvY2spKTsKKworCXByaW50ZiAoIiAldSBrQiBJLUNhY2hlIiwgY2hlY2tpY2FjaGUgKCkgPj4gMTApOworCXByaW50ZiAoIiAldSBrQiBELUNhY2hlIiwgY2hlY2tkY2FjaGUgKCkgPj4gMTApOworCisJLyogbGV0cyBjaGVjayBhbmQgc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgb24gYSA4NjJUIChvciBQPykgKi8KKworCWltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9IDB4MTIzNDU2Nzg7CisJaWYgKGltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9PSAweDEyMzQ1Njc4KSB7CisJCXByaW50ZiAoIiBGRUMgcHJlc2VudCIpOworCX0KKworCWlmICghbSkgeworCQlwdXRzIChjcHVfd2FybmluZyk7CisJfQorCisJcHV0YyAoJ1xuJyk7CisKKwlyZXR1cm4gMDsKK30KKworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODIzKQorCitzdGF0aWMgaW50IGNoZWNrX0NQVSAobG9uZyBjbG9jaywgdWludCBwdnIsIHVpbnQgaW1tcikKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIChpbW1yICYgMHhGRkZGMDAwMCk7CisJdWludCBrLCBtOworCWNoYXIgYnVmWzMyXTsKKwljaGFyICpzdWY7CisKKwkvKiB0aGUgaGlnaGVzdCAxNiBiaXRzIHNob3VsZCBiZSAweDAwNTAgZm9yIGEgOHh4ICovCisKKwlpZiAoKHB2ciA+PiAxNikgIT0gMHgwMDUwKQorCQlyZXR1cm4gLTE7CisKKwlrID0gKGltbXIgPDwgMTYpIHwgKigodXNob3J0ICopICYgaW1tYXAtPmltX2NwbS5jcF9kcGFyYW1bMHhCMF0pOworCW0gPSAwOworCisJc3dpdGNoIChrKSB7CisJCS8qIE1QQzgyMyAqLworCWNhc2UgMHgyMDAwMDAwMDogc3VmID0gIjAiOyBicmVhazsKKwljYXNlIDB4MjAwMTAwMDA6IHN1ZiA9ICIwLjEiOyBicmVhazsKKwljYXNlIDB4MjAwMjAwMDA6IHN1ZiA9ICJaMi8zIjsgYnJlYWs7CisJY2FzZSAweDIwMDIwMDAxOiBzdWYgPSAiWjMiOyBicmVhazsKKwljYXNlIDB4MjEwMDAwMDA6IHN1ZiA9ICJBIjsgYnJlYWs7CisJY2FzZSAweDIxMDEwMDAwOiBzdWYgPSAiQiI7IG0gPSAxOyBicmVhazsKKwljYXNlIDB4MjEwMTAwMDE6IHN1ZiA9ICJCMiI7IG0gPSAxOyBicmVhazsKKwkJLyogTVBDODIzRSAqLworCWNhc2UgMHgyNDAxMDAwMDogc3VmID0gTlVMTDsKKwkJCXB1dHMgKCJQUEM4MjNFWlRubkIyIik7CisJCQltID0gMTsKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCQlzdWYgPSBOVUxMOworCQkJcHJpbnRmICgidW5rbm93biBNUEM4MjMgKDB4JTA4eCkiLCBrKTsKKwkJCWJyZWFrOworCX0KKwlpZiAoc3VmKQorCQlwcmludGYgKCJQUEM4MjNaVG5uJXMiLCBzdWYpOworCisJcHJpbnRmICgiIGF0ICVzIE1IejoiLCBzdHJtaHogKGJ1ZiwgY2xvY2spKTsKKworCXByaW50ZiAoIiAldSBrQiBJLUNhY2hlIiwgY2hlY2tpY2FjaGUgKCkgPj4gMTApOworCXByaW50ZiAoIiAldSBrQiBELUNhY2hlIiwgY2hlY2tkY2FjaGUgKCkgPj4gMTApOworCisJLyogbGV0cyBjaGVjayBhbmQgc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgb24gYSA4NjBUIChvciBQPykgKi8KKworCWltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9IDB4MTIzNDU2Nzg7CisJaWYgKGltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9PSAweDEyMzQ1Njc4KSB7CisJCXB1dHMgKCIgRkVDIHByZXNlbnQiKTsKKwl9CisKKwlpZiAoIW0pIHsKKwkJcHV0cyAoY3B1X3dhcm5pbmcpOworCX0KKworCXB1dGMgKCdcbicpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg1MCkKKworc3RhdGljIGludCBjaGVja19DUFUgKGxvbmcgY2xvY2ssIHVpbnQgcHZyLCB1aW50IGltbXIpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSAoaW1tciAmIDB4RkZGRjAwMDApOworCXVpbnQgaywgbTsKKwljaGFyIGJ1ZlszMl07CisKKwkvKiB0aGUgaGlnaGVzdCAxNiBiaXRzIHNob3VsZCBiZSAweDAwNTAgZm9yIGEgOHh4ICovCisKKwlpZiAoKHB2ciA+PiAxNikgIT0gMHgwMDUwKQorCQlyZXR1cm4gLTE7CisKKwlrID0gKGltbXIgPDwgMTYpIHwgKigodXNob3J0ICopICYgaW1tYXAtPmltX2NwbS5jcF9kcGFyYW1bMHhCMF0pOworCW0gPSAwOworCisJc3dpdGNoIChrKSB7CisJY2FzZSAweDIwMDIwMDAxOgorCQlwcmludGYgKCJYUEM4NTB4eFpUIik7CisJCWJyZWFrOworCWNhc2UgMHgyMTAwMDA2NToKKwkJcHJpbnRmICgiWFBDODUweHhaVEEiKTsKKwkJYnJlYWs7CisJY2FzZSAweDIxMDEwMDY3OgorCQlwcmludGYgKCJYUEM4NTB4eFpUQiIpOworCQltID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDIxMDIwMDY4OgorCQlwcmludGYgKCJYUEM4NTB4eFpUQyIpOworCQltID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgidW5rbm93biBNUEM4NTAgKDB4JTA4eCkiLCBrKTsKKwl9CisJcHJpbnRmICgiIGF0ICVzIE1IejoiLCBzdHJtaHogKGJ1ZiwgY2xvY2spKTsKKworCXByaW50ZiAoIiAldSBrQiBJLUNhY2hlIiwgY2hlY2tpY2FjaGUgKCkgPj4gMTApOworCXByaW50ZiAoIiAldSBrQiBELUNhY2hlIiwgY2hlY2tkY2FjaGUgKCkgPj4gMTApOworCisJLyogbGV0cyBjaGVjayBhbmQgc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgb24gYSA4NTBUIChvciBQPykgKi8KKworCWltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9IDB4MTIzNDU2Nzg7CisJaWYgKGltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9PSAweDEyMzQ1Njc4KSB7CisJCXByaW50ZiAoIiBGRUMgcHJlc2VudCIpOworCX0KKworCWlmICghbSkgeworCQlwdXRzIChjcHVfd2FybmluZyk7CisJfQorCisJcHV0YyAoJ1xuJyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZXJyb3IgQ1BVIHVuZGVmaW5lZAorI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBjaGVja2NwdSAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCXVsb25nIGNsb2NrID0gZ2QtPmNwdV9jbGs7CisJdWludCBpbW1yID0gZ2V0X2ltbXIgKDApOwkvKiBSZXR1cm4gZnVsbCBJTU1SIGNvbnRlbnRzICovCisJdWludCBwdnIgPSBnZXRfcHZyICgpOworCisJcHV0cyAoIkNQVTogICAiKTsKKworCS8qIDg1MCBoYXMgUEFSVE5VTSAyMCAqLworCS8qIDgwMSBoYXMgUEFSVE5VTSAxMCAqLworCXJldHVybiBjaGVja19DUFUgKGNsb2NrLCBwdnIsIGltbXIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBMMSBpLWNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB0aGUgc3RhbmRhcmQgODYwIGhhcyAxMjggc2V0cyBvZiAxNiBieXRlcyBpbiAyIHdheXMgKD0gNCBrQikgICAgICAgICAgICAgICovCisvKiB0aGUgODYwIFAgKHBsdXMpIGhhcyAyNTYgc2V0cyBvZiAxNiBieXRlcyBpbiA0IHdheXMgKD0gMTYga0IpICAgICAgICAgICAgICovCisKK2ludCBjaGVja2ljYWNoZSAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIG1lbWN0bDh4eF90ICptZW1jdGwgPSAmaW1tYXAtPmltX21lbWN0bDsKKwl1MzIgY2FjaGVvbiA9IHJkX2ljX2NzdCAoKSAmIElEQ19FTkFCTEVEOworCisjaWZkZWYgQ09ORklHX0lQODYwCisJdTMyIGsgPSBtZW1jdGwtPm1lbWNfYnIxICYgfjB4MDAwMDdmZmY7CS8qIHByb2JlIGluIGZsYXNoIG1lbW9yeWFyZWEgKi8KKyNlbHNlCisJdTMyIGsgPSBtZW1jdGwtPm1lbWNfYnIwICYgfjB4MDAwMDdmZmY7CS8qIHByb2JlIGluIGZsYXNoIG1lbW9yeWFyZWEgKi8KKyNlbmRpZgorCXUzMiBtOworCXUzMiBsaW5lcyA9IC0xOworCisJd3JfaWNfY3N0IChJRENfVU5BTEwpOworCXdyX2ljX2NzdCAoSURDX0lOVkFMTCk7CisJd3JfaWNfY3N0IChJRENfRElTQUJMRSk7CisJX19hc21fXyB2b2xhdGlsZSAoImlzeW5jIik7CisKKwl3aGlsZSAoISgobSA9IHJkX2ljX2NzdCAoKSkgJiBJRENfQ0VSUjIpKSB7CisJCXdyX2ljX2FkciAoayk7CisJCXdyX2ljX2NzdCAoSURDX0xETENLKTsKKwkJX19hc21fXyB2b2xhdGlsZSAoImlzeW5jIik7CisKKwkJbGluZXMrKzsKKwkJayArPSAweDEwOwkJCQkvKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgY2FjaGVsaW5lICovCisJfQorCisJd3JfaWNfY3N0IChJRENfVU5BTEwpOworCXdyX2ljX2NzdCAoSURDX0lOVkFMTCk7CisKKwlpZiAoY2FjaGVvbikKKwkJd3JfaWNfY3N0IChJRENfRU5BQkxFKTsKKwllbHNlCisJCXdyX2ljX2NzdCAoSURDX0RJU0FCTEUpOworCisJX19hc21fXyB2b2xhdGlsZSAoImlzeW5jIik7CisKKwlyZXR1cm4gbGluZXMgPDwgNDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEwxIGQtY2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHRoZSBzdGFuZGFyZCA4NjAgaGFzIDEyOCBzZXRzIG9mIDE2IGJ5dGVzIGluIDIgd2F5cyAoPSA0IGtCKSAgICAgICAgICAgICAgKi8KKy8qIHRoZSA4NjAgUCAocGx1cykgaGFzIDI1NiBzZXRzIG9mIDE2IGJ5dGVzIGluIDIgd2F5cyAoPSA4IGtCKSAgICAgICAgICAgICAgKi8KKy8qIGNhbGwgd2l0aCBjYWNoZSBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50IGNoZWNrZGNhY2hlICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOworCXUzMiBjYWNoZW9uID0gcmRfZGNfY3N0ICgpICYgSURDX0VOQUJMRUQ7CisKKyNpZmRlZiBDT05GSUdfSVA4NjAKKwl1MzIgayA9IG1lbWN0bC0+bWVtY19icjEgJiB+MHgwMDAwN2ZmZjsJLyogcHJvYmUgaW4gZmxhc2ggbWVtb3J5YXJlYSAqLworI2Vsc2UKKwl1MzIgayA9IG1lbWN0bC0+bWVtY19icjAgJiB+MHgwMDAwN2ZmZjsJLyogcHJvYmUgaW4gZmxhc2ggbWVtb3J5YXJlYSAqLworI2VuZGlmCisJdTMyIG07CisJdTMyIGxpbmVzID0gLTE7CisKKwl3cl9kY19jc3QgKElEQ19VTkFMTCk7CisJd3JfZGNfY3N0IChJRENfSU5WQUxMKTsKKwl3cl9kY19jc3QgKElEQ19ESVNBQkxFKTsKKworCXdoaWxlICghKChtID0gcmRfZGNfY3N0ICgpKSAmIElEQ19DRVJSMikpIHsKKwkJd3JfZGNfYWRyIChrKTsKKwkJd3JfZGNfY3N0IChJRENfTERMQ0spOworCQlsaW5lcysrOworCQlrICs9IDB4MTA7CS8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBjYWNoZWxpbmUgKi8KKwl9CisKKwl3cl9kY19jc3QgKElEQ19VTkFMTCk7CisJd3JfZGNfY3N0IChJRENfSU5WQUxMKTsKKworCWlmIChjYWNoZW9uKQorCQl3cl9kY19jc3QgKElEQ19FTkFCTEUpOworCWVsc2UKKwkJd3JfZGNfY3N0IChJRENfRElTQUJMRSk7CisKKwlyZXR1cm4gbGluZXMgPDwgNDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCB1cG1jb25maWcgKHVpbnQgdXBtLCB1aW50ICogdGFibGUsIHVpbnQgc2l6ZSkKK3sKKwl1aW50IGk7CisJdWludCBhZGRyID0gMDsKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIG1lbWN0bDh4eF90ICptZW1jdGwgPSAmaW1tYXAtPmltX21lbWN0bDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJbWVtY3RsLT5tZW1jX21kciA9IHRhYmxlW2ldOwkvKiAoMTYtMTUpICovCisJCW1lbWN0bC0+bWVtY19tY3IgPSBhZGRyIHwgdXBtOwkvKiAoMTYtMTYpICovCisJCWFkZHIrKzsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGRvX3Jlc2V0IChjbWRfdGJsX3QgKiBjbWR0cCwgYmRfdCAqIGJkLCBpbnQgZmxhZywgaW50IGFyZ2MsCisJCQkgIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1bG9uZyBtc3IsIGFkZHI7CisKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOworCisJaW1tYXAtPmltX2Nsa3JzdC5jYXJfcGxwcmNyIHw9IFBMUFJDUl9DU1I7CS8qIENoZWNrc3RvcCBSZXNldCBlbmFibGUgKi8KKworCS8qIEludGVycnVwdHMgYW5kIE1NVSBvZmYgKi8KKwlfX2FzbV9fIHZvbGF0aWxlICgibXRzcHIgICAgODEsIDAiKTsKKwlfX2FzbV9fIHZvbGF0aWxlICgibWZtc3IgICAgJTAiOiI9ciIgKG1zcikpOworCisJbXNyICY9IH4weDEwMzA7CisJX19hc21fXyB2b2xhdGlsZSAoIm10bXNyICAgICUwIjo6InIiIChtc3IpKTsKKworCS8qCisJICogVHJ5aW5nIHRvIGV4ZWN1dGUgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gYXQgYSBub24tZXhpc3RpbmcgYWRkcmVzcworCSAqIHNob3VsZCBjYXVzZSBhIG1hY2hpbmUgY2hlY2ssIHJlc3VsdGluZyBpbiByZXNldAorCSAqLworI2lmZGVmIENGR19SRVNFVF9BRERSRVNTCisJYWRkciA9IENGR19SRVNFVF9BRERSRVNTOworI2Vsc2UKKwkvKgorCSAqIG5vdGU6IHdoZW4gQ0ZHX01PTklUT1JfQkFTRSBwb2ludHMgdG8gYSBSQU0gYWRkcmVzcywgQ0ZHX01PTklUT1JfQkFTRQorCSAqIC0gc2l6ZW9mICh1bG9uZykgaXMgdXN1YWxseSBhIHZhbGlkIGFkZHJlc3MuIEJldHRlciBwaWNrIGFuIGFkZHJlc3MKKwkgKiBrbm93biB0byBiZSBpbnZhbGlkIG9uIHlvdXIgc3lzdGVtIGFuZCBhc3NpZ24gaXQgdG8gQ0ZHX1JFU0VUX0FERFJFU1MuCisJICogIih1bG9uZyktMSIgdXNlZCB0byBiZSBhIGdvb2QgY2hvaWNlIGZvciBtYW55IHN5c3RlbXMuLi4KKwkgKi8KKwlhZGRyID0gQ0ZHX01PTklUT1JfQkFTRSAtIHNpemVvZiAodWxvbmcpOworI2VuZGlmCisJKCh2b2lkICgqKSh2b2lkKSkgYWRkcikgKCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEdldCB0aW1lYmFzZSBjbG9jayBmcmVxdWVuY3kgKGxpa2UgY3B1X2NsayBpbiBIeikKKyAqCisgKiBTZWUgdGFibGUgMTUtNSBwcC4gMTUtMTYsIGFuZCBTQ0NSW1JUU0VMXSBwcC4gMTUtMjcuCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3RiY2xrICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9ICh2b2xhdGlsZSBpbW1hcF90ICopIENGR19JTU1SOworCXVsb25nIG9zY2NsaywgZmFjdG9yOworCisJaWYgKGltbXItPmltX2Nsa3JzdC5jYXJfc2NjciAmIFNDQ1JfVEJTKSB7CisJCXJldHVybiAoZ2QtPmNwdV9jbGsgLyAxNik7CisJfQorCisJZmFjdG9yID0gKCgoQ0ZHX1BMUFJDUikgJiBQTFBSQ1JfTUZfTVNLKSA+PiBQTFBSQ1JfTUZfU0hJRlQpICsgMTsKKworCW9zY2NsayA9IGdkLT5jcHVfY2xrIC8gZmFjdG9yOworCisJaWYgKChpbW1yLT5pbV9jbGtyc3QuY2FyX3NjY3IgJiBTQ0NSX1JUU0VMKSA9PSAwIHx8IGZhY3RvciA+IDIpIHsKKwkJcmV0dXJuIChvc2NjbGsgLyA0KTsKKwl9CisJcmV0dXJuIChvc2NjbGsgLyAxNik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQordm9pZCB3YXRjaGRvZ19yZXNldCAodm9pZCkKK3sKKwlpbnQgcmVfZW5hYmxlID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJcmVzZXRfOHh4X3dhdGNoZG9nICgoaW1tYXBfdCAqKSBDRkdfSU1NUik7CisJaWYgKHJlX2VuYWJsZSkKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7Cit9CisKK3ZvaWQgcmVzZXRfOHh4X3dhdGNoZG9nICh2b2xhdGlsZSBpbW1hcF90ICogaW1tcikKK3sKKyMgaWYgZGVmaW5lZChDT05GSUdfTFdNT04pCisJLyoKKwkgKiBUaGUgTFdNT04gYm9hcmQgdXNlcyBhIE1BWDYzMDEgV2F0Y2hkb2cKKwkgKiB3aXRoIHRoZSB0cmlnZ2VyIHBpbiBjb25uZWN0ZWQgdG8gcG9ydCBQQS43CisJICoKKwkgKiAoVGhlIG9sZCBib2FyZCB2ZXJzaW9uIHVzZWQgYSBNQVg3MDZURVNBIFdhdGNoZG9nLCB3aGljaAorCSAqIGhhZCB0byBiZSBoYW5kbGVkIGV4YWN0bHkgdGhlIHNhbWUuKQorCSAqLworIyBkZWZpbmUgV0FUQ0hET0dfQklUCTB4MDEwMAorCWltbXItPmltX2lvcG9ydC5pb3BfcGFwYXIgJj0gfihXQVRDSERPR19CSVQpOwkvKiBHUElPICAgICAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGFkaXIgfD0gV0FUQ0hET0dfQklUOwkvKiBPdXRwdXQgICAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGFvZHIgJj0gfihXQVRDSERPR19CSVQpOwkvKiBhY3RpdmUgb3V0cHV0ICovCisKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGF0IF49IFdBVENIRE9HX0JJVDsJLyogVG9nZ2xlIFdESSAgICovCisjIGVsc2UKKwkvKgorCSAqIEFsbCBvdGhlciBib2FyZHMgdXNlIHRoZSBNUEM4eHggSW50ZXJuYWwgV2F0Y2hkb2cKKwkgKi8KKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zd3NyID0gMHg1NTZjOwkvKiB3cml0ZSBtYWdpYzEgKi8KKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zd3NyID0gMHhhYTM5OwkvKiB3cml0ZSBtYWdpYzIgKi8KKyMgZW5kaWYgLyogQ09ORklHX0xXTU9OICovCit9CisKKyNlbmRpZiAvKiBDT05GSUdfV0FUQ0hET0cgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzh4eC9mZWMuYyBiL2NwdS9tcGM4eHgvZmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzZGNhYQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM4eHgvZmVjLmMKQEAgLTAsMCArMSw3MTAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorCisjdW5kZWYJRVRfREVCVUcKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChGRUNfRU5FVCkKKworI2lmZGVmIENGR19ESVNDT1ZFUl9QSFkKKyNpbmNsdWRlIDxtaWlwaHkuaD4KK3N0YXRpYyB2b2lkIG1paV9kaXNjb3Zlcl9waHkodm9pZCk7CisjZW5kaWYKKworLyogRXRoZXJuZXQgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQnVmZmVycyAqLworI2RlZmluZSBEQlVGX0xFTkdUSCAgMTUyMAorCisjZGVmaW5lIFRYX0JVRl9DTlQgMgorCisjZGVmaW5lIFRPVVRfTE9PUCAxMDAKKworI2RlZmluZSBQS1RfTUFYQlVGX1NJWkUJCTE1MTgKKyNkZWZpbmUgUEtUX01JTkJVRl9TSVpFCQk2NAorI2RlZmluZSBQS1RfTUFYQkxSX1NJWkUJCTE1MjAKKworCitzdGF0aWMgY2hhciB0eGJ1ZltEQlVGX0xFTkdUSF07CisKK3N0YXRpYyB1aW50IHJ4SWR4OwkvKiBpbmRleCBvZiB0aGUgY3VycmVudCBSWCBidWZmZXIgKi8KK3N0YXRpYyB1aW50IHR4SWR4OwkvKiBpbmRleCBvZiB0aGUgY3VycmVudCBUWCBidWZmZXIgKi8KKworLyoKKyAgKiBGRUMgRXRoZXJuZXQgVHggYW5kIFJ4IGJ1ZmZlciBkZXNjcmlwdG9ycyBhbGxvY2F0ZWQgYXQgdGhlCisgICogIGltbXItPnVkYXRhX2JkIGFkZHJlc3Mgb24gRHVhbC1Qb3J0IFJBTQorICAqIFByb3ZpZGUgZm9yIERvdWJsZSBCdWZmZXJpbmcKKyAgKi8KKwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgQ29tbW9uQnVmZmVyRGVzY3JpcHRvciB7CisgICAgY2JkX3QgcnhiZFtQS1RCVUZTUlhdOwkJLyogUnggQkQgKi8KKyAgICBjYmRfdCB0eGJkW1RYX0JVRl9DTlRdOwkJLyogVHggQkQgKi8KK30gUlRYQkQ7CisKK3N0YXRpYyBSVFhCRCAqcnR4ID0gTlVMTDsKKworc3RhdGljIGludCBmZWNfc2VuZChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpOworc3RhdGljIGludCBmZWNfcmVjdihzdHJ1Y3QgZXRoX2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgZmVjX2luaXQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCAqIGJkKTsKK3N0YXRpYyB2b2lkIGZlY19oYWx0KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpOworCitpbnQgZmVjX2luaXRpYWxpemUoYmRfdCAqYmlzKQoreworCXN0cnVjdCBldGhfZGV2aWNlKiBkZXY7CisKKwlkZXYgPSAoc3RydWN0IGV0aF9kZXZpY2UqKSBtYWxsb2Moc2l6ZW9mICpkZXYpOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJGRUMgRVRIRVJORVQiKTsKKwlkZXYtPmlvYmFzZSA9IDA7CisJZGV2LT5wcml2ICAgPSAwOworCWRldi0+aW5pdCAgID0gZmVjX2luaXQ7CisJZGV2LT5oYWx0ICAgPSBmZWNfaGFsdDsKKwlkZXYtPnNlbmQgICA9IGZlY19zZW5kOworCWRldi0+cmVjdiAgID0gZmVjX3JlY3Y7CisKKwlldGhfcmVnaXN0ZXIoZGV2KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZlY19zZW5kKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgaiwgcmM7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIGZlY190ICpmZWNwID0gJihpbW1yLT5pbV9jcG0uY3BfZmVjKTsKKworCS8qIHNlY3Rpb24gMTYuOS4yMy4zCisJICogV2FpdCBmb3IgcmVhZHkKKwkgKi8KKwlqID0gMDsKKwl3aGlsZSAoKHJ0eC0+dHhiZFt0eElkeF0uY2JkX3NjICYgQkRfRU5FVF9UWF9SRUFEWSkgJiYgKGo8VE9VVF9MT09QKSkgeworCQl1ZGVsYXkoMSk7CisJCWorKzsKKwl9CisJaWYgKGo+PVRPVVRfTE9PUCkgeworCQlwcmludGYoIlRYIG5vdCByZWFkeVxuIik7CisJfQorCisJcnR4LT50eGJkW3R4SWR4XS5jYmRfYnVmYWRkciA9ICh1aW50KXBhY2tldDsKKwlydHgtPnR4YmRbdHhJZHhdLmNiZF9kYXRsZW4gID0gbGVuZ3RoOworCXJ0eC0+dHhiZFt0eElkeF0uY2JkX3NjIHw9IEJEX0VORVRfVFhfUkVBRFkgfCBCRF9FTkVUX1RYX0xBU1Q7CisJX19hc21fXyAoImVpZWlvIik7CisKKwkvKiBBY3RpdmF0ZSB0cmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciBwb2xsaW5nICovCisJZmVjcC0+ZmVjX3hfZGVzX2FjdGl2ZSA9IDB4MDEwMDAwMDA7CS8qIERlc2NyaXB0b3IgcG9sbGluZyBhY3RpdmUJKi8KKworCWogPSAwOworCXdoaWxlICgocnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1RYX1JFQURZKSAmJiAoajxUT1VUX0xPT1ApKSB7CisjaWYgZGVmaW5lZChDT05GSUdfSUNVODYyKQorCQl1ZGVsYXkoMTApOworI2Vsc2UKKwkJdWRlbGF5KDEpOworI2VuZGlmCisJCWorKzsKKwl9CisJaWYgKGo+PVRPVVRfTE9PUCkgeworCQlwcmludGYoIlRYIHRpbWVvdXRcbiIpOworCX0KKyNpZmRlZiBFVF9ERUJVRworCXByaW50ZigiJXNbJWRdICVzOiBjeWNsZXM6ICVkICAgIHN0YXR1czogJXggIHJldHJ5IGNudDogJWRcbiIsCisJX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fLGoscnR4LT50eGJkW3R4SWR4XS5jYmRfc2MsCisJKHJ0eC0+dHhiZFt0eElkeF0uY2JkX3NjICYgMHgwMDNDKT4+Mik7CisjZW5kaWYKKwkvKiByZXR1cm4gb25seSBzdGF0dXMgYml0cyAqLzsKKwlyYyA9IChydHgtPnR4YmRbdHhJZHhdLmNiZF9zYyAmIEJEX0VORVRfVFhfU1RBVFMpOworCisJdHhJZHggPSAodHhJZHggKyAxKSAlIFRYX0JVRl9DTlQ7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZmVjX3JlY3Yoc3RydWN0IGV0aF9kZXZpY2UqIGRldikKK3sKKwlpbnQgbGVuZ3RoOworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBmZWNfdCAqZmVjcCA9ICYoaW1tci0+aW1fY3BtLmNwX2ZlYyk7CisKKyAgIGZvciAoOzspIHsKKwkvKiBzZWN0aW9uIDE2LjkuMjMuMiAqLworCWlmIChydHgtPnJ4YmRbcnhJZHhdLmNiZF9zYyAmIEJEX0VORVRfUlhfRU1QVFkpIHsKKwkJbGVuZ3RoID0gLTE7CisJCWJyZWFrOyAgICAgLyogbm90aGluZyByZWNlaXZlZCAtIGxlYXZlIGZvcigpIGxvb3AgKi8KKwl9CisKKwlsZW5ndGggPSBydHgtPnJ4YmRbcnhJZHhdLmNiZF9kYXRsZW47CisKKwlpZiAocnR4LT5yeGJkW3J4SWR4XS5jYmRfc2MgJiAweDAwM2YpIHsKKyNpZmRlZiBFVF9ERUJVRworCQlwcmludGYoIiVzWyVkXSBlcnI6ICV4XG4iLAorCQlfX0ZVTkNUSU9OX18sX19MSU5FX18scnR4LT5yeGJkW3J4SWR4XS5jYmRfc2MpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJLyogUGFzcyB0aGUgcGFja2V0IHVwIHRvIHRoZSBwcm90b2NvbCBsYXllcnMuICovCisJCU5ldFJlY2VpdmUoTmV0UnhQYWNrZXRzW3J4SWR4XSwgbGVuZ3RoIC0gNCk7CisJfQorCisJLyogR2l2ZSB0aGUgYnVmZmVyIGJhY2sgdG8gdGhlIEZFQy4gKi8KKwlydHgtPnJ4YmRbcnhJZHhdLmNiZF9kYXRsZW4gPSAwOworCisJLyogd3JhcCBhcm91bmQgYnVmZmVyIGluZGV4IHdoZW4gbmVjZXNzYXJ5ICovCisJaWYgKChyeElkeCArIDEpID49IFBLVEJVRlNSWCkgeworCQlydHgtPnJ4YmRbUEtUQlVGU1JYIC0gMV0uY2JkX3NjID0gKEJEX0VORVRfUlhfV1JBUCB8IEJEX0VORVRfUlhfRU1QVFkpOworCQlyeElkeCA9IDA7CisJfSBlbHNlIHsKKwkJcnR4LT5yeGJkW3J4SWR4XS5jYmRfc2MgPSBCRF9FTkVUX1JYX0VNUFRZOworCQlyeElkeCsrOworCX0KKworCV9fYXNtX18gKCJlaWVpbyIpOworCisJLyogVHJ5IHRvIGZpbGwgQnVmZmVyIERlc2NyaXB0b3JzICovCisJZmVjcC0+ZmVjX3JfZGVzX2FjdGl2ZSA9IDB4MDEwMDAwMDA7CS8qIERlc2NyaXB0b3IgcG9sbGluZyBhY3RpdmUJKi8KKyAgIH0KKworICAgcmV0dXJuIGxlbmd0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRkVDIEV0aGVybmV0IEluaXRpYWxpemF0aW9uIFJvdXRpbmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZQlGRUNfRUNOVFJMX1BJTk1VWAkweDAwMDAwMDA0CisjZGVmaW5lIEZFQ19FQ05UUkxfRVRIRVJfRU4JMHgwMDAwMDAwMgorI2RlZmluZSBGRUNfRUNOVFJMX1JFU0VUCTB4MDAwMDAwMDEKKworI2RlZmluZSBGRUNfUkNOVFJMX0JDX1JFSgkweDAwMDAwMDEwCisjZGVmaW5lIEZFQ19SQ05UUkxfUFJPTQkJMHgwMDAwMDAwOAorI2RlZmluZSBGRUNfUkNOVFJMX01JSV9NT0RFCTB4MDAwMDAwMDQKKyNkZWZpbmUgRkVDX1JDTlRSTF9EUlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRkVDX1JDTlRSTF9MT09QCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgRkVDX1RDTlRSTF9GREVOCQkweDAwMDAwMDA0CisjZGVmaW5lIEZFQ19UQ05UUkxfSEJDCQkweDAwMDAwMDAyCisjZGVmaW5lIEZFQ19UQ05UUkxfR1RTCQkweDAwMDAwMDAxCisKKyNkZWZpbmUJRkVDX1JFU0VUX0RFTEFZCQk1MAorCitzdGF0aWMgaW50IGZlY19pbml0KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGJkX3QgKiBiZCkKK3sKKworCWludCBpOworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBmZWNfdCAqZmVjcCA9ICYoaW1tci0+aW1fY3BtLmNwX2ZlYyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19GQURTKSAmJiBkZWZpbmVkKENPTkZJR19NUEM4NjBUKQorCS8qIGNvbmZpZ3VyZSBGQURTIGZvciBmYXN0IChGRUMpIGV0aGVybmV0LCBoYWxmLWR1cGxleCAqLworCS8qIFRoZSBMWFQ5NzAgbmVlZHMgYWJvdXQgNTBtcyB0byByZWNvdmVyIGZyb20gcmVzZXQsIHNvCisJICogd2FpdCBmb3IgaXQgYnkgZGlzY292ZXJpbmcgdGhlIFBIWSBiZWZvcmUgbGVhdmluZyBldGhfaW5pdCgpLgorCSAqLworCXsKKwkJdm9sYXRpbGUgdWludCAqYmNzcjQgPSAodm9sYXRpbGUgdWludCAqKSBCQ1NSNDsKKwkJKmJjc3I0ID0gKCpiY3NyNCAmIH4oQkNTUjRfRkVUSF9FTiB8IEJDU1I0X0ZFVEhDRkcxKSkKKwkJCXwgKEJDU1I0X0ZFVEhDRkcwIHwgQkNTUjRfRkVUSEZERSB8IEJDU1I0X0ZFVEhSU1QpOworCisJCS8qIHJlc2V0IHRoZSBMWFQ5NzAgUEhZICovCisJCSpiY3NyNCAmPSB+QkNTUjRfRkVUSFJTVDsKKwkJdWRlbGF5ICgxMCk7CisJCSpiY3NyNCB8PSBCQ1NSNF9GRVRIUlNUOworCQl1ZGVsYXkgKDEwKTsKKwl9CisjZW5kaWYKKwkvKiBXaGFjayBhIHJlc2V0LgorCSAqIEEgZGVsYXkgaXMgcmVxdWlyZWQgYmV0d2VlbiBhIHJlc2V0IG9mIHRoZSBGRUMgYmxvY2sgYW5kCisJICogaW5pdGlhbGl6YXRpb24gb2Ygb3RoZXIgRkVDIHJlZ2lzdGVycyBiZWNhdXNlIHRoZSByZXNldCB0YWtlcworCSAqIHNvbWUgdGltZSB0byBjb21wbGV0ZS4gSWYgeW91IGRvbid0IGRlbGF5LCBzdWJzZXF1ZW50IHdyaXRlcworCSAqIHRvIEZFQyByZWdpc3RlcnMgbWlnaHQgZ2V0IGtpbGxlZCBieSB0aGUgcmVzZXQgcm91dGluZSB3aGljaCBpcworCSAqIHN0aWxsIGluIHByb2dyZXNzLgorCSAqLworCWZlY3AtPmZlY19lY250cmwgPSBGRUNfRUNOVFJMX1BJTk1VWCB8IEZFQ19FQ05UUkxfUkVTRVQ7CisJZm9yIChpID0gMDsKKwkgICAgIChmZWNwLT5mZWNfZWNudHJsICYgRkVDX0VDTlRSTF9SRVNFVCkgJiYgKGkgPCBGRUNfUkVTRVRfREVMQVkpOworCSAgICAgKytpKSB7CisJCXVkZWxheSAoMSk7CisJfQorCWlmIChpID09IEZFQ19SRVNFVF9ERUxBWSkgeworCQlwcmludGYgKCJGRUNfUkVTRVRfREVMQVkgdGltZW91dFxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFdlIHVzZSBzdHJpY3RseSBwb2xsaW5nIG1vZGUgb25seQorCSAqLworCWZlY3AtPmZlY19pbWFzayA9IDA7CisKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHQKKwkgKi8KKwlmZWNwLT5mZWNfaWV2ZW50ID0gMHhmZmMwOworCisJLyogTm8gbmVlZCB0byBzZXQgdGhlIElWRUMgcmVnaXN0ZXIgKi8KKworCS8qIFNldCBzdGF0aW9uIGFkZHJlc3MKKwkgKi8KKyNkZWZpbmUgZWEgZXRoX2dldF9kZXYoKS0+ZW5ldGFkZHIKKwlmZWNwLT5mZWNfYWRkcl9sb3cgICA9CShlYVswXSA8PCAyNCkgfCAoZWFbMV0gPDwgMTYpIHwKKwkJCQkoZWFbMl0gPDwgIDgpIHwgKGVhWzNdICAgICAgKSA7CisJZmVjcC0+ZmVjX2FkZHJfaGlnaCAgPQkoZWFbNF0gPDwgIDgpIHwgKGVhWzVdCSAgICApIDsKKyN1bmRlZiBlYQorCisJLyogQ2xlYXIgbXVsdGljYXN0IGFkZHJlc3MgaGFzaCB0YWJsZQorCSAqLworCWZlY3AtPmZlY19oYXNoX3RhYmxlX2hpZ2ggPSAwOworCWZlY3AtPmZlY19oYXNoX3RhYmxlX2xvdyAgPSAwOworCisJLyogU2V0IG1heGltdW0gcmVjZWl2ZSBidWZmZXIgc2l6ZS4KKwkgKi8KKwlmZWNwLT5mZWNfcl9idWZmX3NpemUgPSBQS1RfTUFYQkxSX1NJWkU7CisKKwkvKiBTZXQgbWF4aW11bSBmcmFtZSBsZW5ndGgKKwkgKi8KKwlmZWNwLT5mZWNfcl9oYXNoID0gUEtUX01BWEJVRl9TSVpFOworCisJLyoKKwkgKiBTZXR1cCBCdWZmZXJzIGFuZCBCdWZmZXIgRGVzcmlwdG9ycworCSAqLworCXJ4SWR4ID0gMDsKKwl0eElkeCA9IDA7CisKKwlpZiAoIXJ0eCkgeworI2lmZGVmIENGR19BTExPQ19EUFJBTQorCSAgICBydHggPSAoUlRYQkQgKikgKGltbXItPmltX2NwbS5jcF9kcG1lbSArIGRwcmFtX2FsbG9jX2FsaWduKHNpemVvZihSVFhCRCksOCkpOworI2Vsc2UKKwkgICAgcnR4ID0gKFJUWEJEICopIChpbW1yLT5pbV9jcG0uY3BfZHBtZW0gKyBDUE1fRkVDX0JBU0UpOworI2VuZGlmCisJfQorCS8qCisJICogU2V0dXAgUmVjZWl2ZXIgQnVmZmVyIERlc2NyaXB0b3JzICgxMy4xNC4yNC4xOCkKKwkgKiBTZXR0aW5nczoKKwkgKiAgICAgRW1wdHksIFdyYXAKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUEtUQlVGU1JYOyBpKyspIHsKKwkJcnR4LT5yeGJkW2ldLmNiZF9zYyAgICAgID0gQkRfRU5FVF9SWF9FTVBUWTsKKwkJcnR4LT5yeGJkW2ldLmNiZF9kYXRsZW4gID0gMDsJLyogUmVzZXQgKi8KKwkJcnR4LT5yeGJkW2ldLmNiZF9idWZhZGRyID0gKHVpbnQpIE5ldFJ4UGFja2V0c1tpXTsKKwl9CisJcnR4LT5yeGJkW1BLVEJVRlNSWCAtIDFdLmNiZF9zYyB8PSBCRF9FTkVUX1JYX1dSQVA7CisKKwkvKgorCSAqIFNldHVwIEV0aGVybmV0IFRyYW5zbWl0dGVyIEJ1ZmZlciBEZXNjcmlwdG9ycyAoMTMuMTQuMjQuMTkpCisJICogU2V0dGluZ3M6CisJICogICAgTGFzdCwgVHggQ1JDCisJICovCisJZm9yIChpID0gMDsgaSA8IFRYX0JVRl9DTlQ7IGkrKykgeworCQlydHgtPnR4YmRbaV0uY2JkX3NjICAgICAgPSBCRF9FTkVUX1RYX0xBU1QgfCBCRF9FTkVUX1RYX1RDOworCQlydHgtPnR4YmRbaV0uY2JkX2RhdGxlbiAgPSAwOwkvKiBSZXNldCAqLworCQlydHgtPnR4YmRbaV0uY2JkX2J1ZmFkZHIgPSAodWludCkgKCZ0eGJ1ZlswXSk7CisJfQorCXJ0eC0+dHhiZFtUWF9CVUZfQ05UIC0gMV0uY2JkX3NjIHw9IEJEX0VORVRfVFhfV1JBUDsKKworCS8qIFNldCByZWNlaXZlIGFuZCB0cmFuc21pdCBkZXNjcmlwdG9yIGJhc2UKKwkgKi8KKwlmZWNwLT5mZWNfcl9kZXNfc3RhcnQgPSAodW5zaWduZWQgaW50KSAoJnJ0eC0+cnhiZFswXSk7CisJZmVjcC0+ZmVjX3hfZGVzX3N0YXJ0ID0gKHVuc2lnbmVkIGludCkgKCZydHgtPnR4YmRbMF0pOworCisJLyogRW5hYmxlIE1JSSBtb2RlCisJICovCisjaWYgMAkvKiBGdWxsIGR1cGxleCBtb2RlICovCisJZmVjcC0+ZmVjX3JfY250cmwgPSBGRUNfUkNOVFJMX01JSV9NT0RFOworCWZlY3AtPmZlY194X2NudHJsID0gRkVDX1RDTlRSTF9GREVOOworI2Vsc2UJLyogSGFsZiBkdXBsZXggbW9kZSAqLworCWZlY3AtPmZlY19yX2NudHJsID0gRkVDX1JDTlRSTF9NSUlfTU9ERSB8IEZFQ19SQ05UUkxfRFJUOworCWZlY3AtPmZlY194X2NudHJsID0gMDsKKyNlbmRpZgorCisJLyogRW5hYmxlIGJpZyBlbmRpYW4gYW5kIGRvbid0IGNhcmUgYWJvdXQgU0RNQSBGQy4KKwkgKi8KKwlmZWNwLT5mZWNfZnVuX2NvZGUgPSAweDc4MDAwMDAwOworCisJLyogU2V0IE1JSSBzcGVlZCB0byAyLjUgTUh6IG9yIHNsaWdodGx5IGJlbG93LgorCSAqIEFjY29yZGluZyB0byB0aGUgTVBDODYwVCAoUmV2LiBEKSBGYXN0IGV0aGVybmV0IGNvbnRyb2xsZXIgdXNlcgorCSAqIG1hbnVhbCAoNi4yLjE0KSwKKwkgKiB0aGUgTUlJIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGNsb2NrIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsCisJICogdG8gMi41IE1Iei4KKwkgKiBUaGlzIE1EQyBmcmVxdWVuY3kgaXMgZXF1YWwgdG8gc3lzdGVtIGNsb2NrIC8gKDIgKiBNSUlfU1BFRUQpLgorCSAqIFRoZW4gTUlJX1NQRUVEID0gc3lzdGVtX2Nsb2NrIC8gMiAqIDIsNSBNaHouCisJICovCisJZmVjcC0+ZmVjX21paV9zcGVlZCA9ICgoYmQtPmJpX2J1c2ZyZXEgKyA0OTk5OTk5KSAvIDUwMDAwMDApIDw8IDE7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfSUNVODYyKSAmJiAhZGVmaW5lZChDT05GSUdfSUFEMjEwKQorCS8qIENvbmZpZ3VyZSBhbGwgb2YgcG9ydCBEIGZvciBNSUkuCisJICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wZHBhciA9IDB4MWZmZjsKKworCS8qIEJpdHMgbW92ZWQgZnJvbSBSZXYuIEQgb253YXJkICovCisJaWYgKChnZXRfaW1tciAoMCkgJiAweGZmZmYpIDwgMHgwNTAxKSB7CisJCWltbXItPmltX2lvcG9ydC5pb3BfcGRkaXIgPSAweDFjNTg7CS8qIFByZSByZXYuIEQgKi8KKwl9IGVsc2UgeworCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGlyID0gMHgxZmZmOwkvKiBSZXYuIEQgYW5kIGxhdGVyICovCisJfQorI2Vsc2UKKwkvKiBDb25maWd1cmUgcG9ydCBBIGZvciBNSUkuCisJKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0lDVTg2MikgJiYgZGVmaW5lZChDRkdfRElTQ09WRVJfUEhZKQorCisJLyogT24gdGhlIElDVTg2MiBib2FyZCB0aGUgTUlJLU1EQyBwaW4gaXMgcm91dGVkIHRvIFBEOCBwaW4KKwkgKiBvZiBDUFUsIHNvIGZvciB0aGlzIGJvYXJkIHdlIG5lZWQgdG8gY29uZmlndXJlIFV0b3BpYSBhbmQKKwkgKiBlbmFibGUgUEQ4IHRvIE1JSS1NREMgZnVuY3Rpb24gKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkcGFyIHw9IDB4NDA4MDsKKyNlbmRpZgorCisJLyogSGFzIFV0b3BpYSBiZWVuIGNvbmZpZ3VyZWQ/ICovCisJaWYgKGltbXItPmltX2lvcG9ydC5pb3BfcGRwYXIgJiAoMHg4MDAwID4+IDEpKSB7CisJCS8qCisJCSAqIFlFUyAtIFVzZSBNVVhFRCBtb2RlIGZvciBVVE9QSUEgYnVzLgorCQkgKiBUaGlzIGZyZWVzIFBvcnQgQSBmb3IgdXNlIGJ5IE1JSSAoc2VlIDg2MlVNIHRhYmxlIDQxLTYpLgorCQkgKi8KKwkJaW1tci0+aW1faW9wb3J0LnV0bW9kZSAmPSB+MHg4MDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBOTyAtIHNldCBTUExJVCBtb2RlIGZvciBVVE9QSUEgYnVzLgorCQkgKgorCQkgKiBUaGlzIGRvZXNuJ3QgcmVhbGx5IGVmZmVjdCBVVE9QSUEgKHdoaWNoIGlzbid0CisJCSAqIGVuYWJsZWQgYW55d2F5KSBidXQganVzdCB0ZWxscyB0aGUgODYyCisJCSAqIHRvIHVzZSBwb3J0IEEgZm9yIE1JSSAoc2VlIDg2MlVNIHRhYmxlIDQxLTYpLgorCQkgKi8KKwkJaW1tci0+aW1faW9wb3J0LnV0bW9kZSB8PSAweDgwOworCX0KKyNlbmRpZgkvKiAhZGVmaW5lZChDT05GSUdfSUNVODYyKSAqLworCisJcnhJZHggPSAwOworCXR4SWR4ID0gMDsKKworCS8qIE5vdyBlbmFibGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3NpbmcKKwkgKi8KKwlmZWNwLT5mZWNfZWNudHJsID0gRkVDX0VDTlRSTF9QSU5NVVggfCBGRUNfRUNOVFJMX0VUSEVSX0VOOworCisjaWZkZWYgQ0ZHX0RJU0NPVkVSX1BIWQorCS8qIHdhaXQgZm9yIHRoZSBQSFkgdG8gd2FrZSB1cCBhZnRlciByZXNldAorCSAqLworCW1paV9kaXNjb3Zlcl9waHkoKTsKKyNlbmRpZgorCisJLyogQW5kIGxhc3QsIHRyeSB0byBmaWxsIFJ4IEJ1ZmZlciBEZXNjcmlwdG9ycyAqLworCWZlY3AtPmZlY19yX2Rlc19hY3RpdmUgPSAweDAxMDAwMDAwOwkvKiBEZXNjcmlwdG9yIHBvbGxpbmcgYWN0aXZlCSovCisKKwlyZXR1cm4gMTsKK30KKworCisKK3N0YXRpYyB2b2lkIGZlY19oYWx0KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisjaWYgMAorICAgIHZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworICAgIGltbXItPmltX2NwbS5jcF9zY2NbU0NDX0VORVRdLnNjY19nc21ybCAmPSB+KFNDQ19HU01STF9FTlIgfCBTQ0NfR1NNUkxfRU5UKTsKKyNlbmRpZgorfQorCisjaWYgMAordm9pZCByZXN0YXJ0KHZvaWQpCit7CisgICB2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKyAgIGltbXItPmltX2NwbS5jcF9zY2NbU0NDX0VORVRdLnNjY19nc21ybCB8PSAoU0NDX0dTTVJMX0VOUiB8IFNDQ19HU01STF9FTlQpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19ESVNDT1ZFUl9QSFkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKworc3RhdGljCWludAlwaHlhZGRyID0gLTE7CS8qIGRpZG4ndCBmaW5kIGEgUEhZIHlldCAqLworc3RhdGljCXVpbnQJcGh5dHlwZTsKKworLyogTWFrZSBNSUkgcmVhZC93cml0ZSBjb21tYW5kcyBmb3IgdGhlIEZFQy4KKyovCisKKyNkZWZpbmUgbWtfbWlpX3JlYWQoQUREUiwgUkVHKQkoMHg2MDAyMDAwMCB8ICgoQUREUiA8PCAyMykgfCBcCisJCQkJCQkoUkVHICYgMHgxZikgPDwgMTgpKQorCisjZGVmaW5lIG1rX21paV93cml0ZShBRERSLCBSRUcsIFZBTCkJKDB4NTAwMjAwMDAgfCAoKEFERFIgPDwgMjMpIHwgXAorCQkJCQkJKFJFRyAmIDB4MWYpIDw8IDE4KSB8IFwKKwkJCQkJCShWQUwgJiAweGZmZmYpKQorCisvKiBJbnRlcnJ1cHQgZXZlbnRzL21hc2tzLgorKi8KKyNkZWZpbmUgRkVDX0VORVRfSEJFUlIJKCh1aW50KTB4ODAwMDAwMDApCS8qIEhlYXJ0YmVhdCBlcnJvciAqLworI2RlZmluZSBGRUNfRU5FVF9CQUJSCSgodWludCkweDQwMDAwMDAwKQkvKiBCYWJibGluZyByZWNlaXZlciAqLworI2RlZmluZSBGRUNfRU5FVF9CQUJUCSgodWludCkweDIwMDAwMDAwKQkvKiBCYWJibGluZyB0cmFuc21pdHRlciAqLworI2RlZmluZSBGRUNfRU5FVF9HUkEJKCh1aW50KTB4MTAwMDAwMDApCS8qIEdyYWNlZnVsIHN0b3AgY29tcGxldGUgKi8KKyNkZWZpbmUgRkVDX0VORVRfVFhGCSgodWludCkweDA4MDAwMDAwKQkvKiBGdWxsIGZyYW1lIHRyYW5zbWl0dGVkICovCisjZGVmaW5lIEZFQ19FTkVUX1RYQgkoKHVpbnQpMHgwNDAwMDAwMCkJLyogQSBidWZmZXIgd2FzIHRyYW5zbWl0dGVkICovCisjZGVmaW5lIEZFQ19FTkVUX1JYRgkoKHVpbnQpMHgwMjAwMDAwMCkJLyogRnVsbCBmcmFtZSByZWNlaXZlZCAqLworI2RlZmluZSBGRUNfRU5FVF9SWEIJKCh1aW50KTB4MDEwMDAwMDApCS8qIEEgYnVmZmVyIHdhcyByZWNlaXZlZCAqLworI2RlZmluZSBGRUNfRU5FVF9NSUkJKCh1aW50KTB4MDA4MDAwMDApCS8qIE1JSSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRkVDX0VORVRfRUJFUlIJKCh1aW50KTB4MDA0MDAwMDApCS8qIFNETUEgYnVzIGVycm9yICovCisKKy8qIFBIWSBpZGVudGlmaWNhdGlvbgorICovCisjZGVmaW5lIFBIWV9JRF9MWFQ5NzAJCTB4NzgxMDAwMDAJLyogTFhUOTcwICovCisjZGVmaW5lIFBIWV9JRF9MWFQ5NzEJCTB4MDAxMzc4ZTAJLyogTFhUOTcxIGFuZCA5NzIgKi8KKyNkZWZpbmUgUEhZX0lEXzgyNTU1CQkweDAyYTgwMTUwCS8qIEludGVsIDgyNTU1ICovCisjZGVmaW5lIFBIWV9JRF9RUzY2MTIJCTB4MDE4MTQ0MDAJLyogUVM2NjEyICovCisjZGVmaW5lIFBIWV9JRF9BTUQ3OUM3ODQJMHgwMDIyNTYxMAkvKiBBTUQgNzlDNzg0ICovCisjZGVmaW5lIFBIWV9JRF9MU0k4MDIyNQkJMHgwMDE2Zjg3MAkvKiBMU0kgODAyMjUgKi8KKyNkZWZpbmUgUEhZX0lEX0xTSTgwMjI1QgkweDAwMTZmODgwCS8qIExTSSA4MDIyNS9CICovCisKKworLyogc2VuZCBjb21tYW5kIHRvIHBoeSB1c2luZyBtaWksIHdhaXQgZm9yIHJlc3VsdCAqLworc3RhdGljIHVpbnQKK21paV9zZW5kKHVpbnQgbWlpX2NtZCkKK3sKKwl1aW50IG1paV9yZXBseTsKKwl2b2xhdGlsZSBmZWNfdAkqZXA7CisKKwllcCA9ICYoKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9jcG0uY3BfZmVjKTsKKworCWVwLT5mZWNfbWlpX2RhdGEgPSBtaWlfY21kOwkvKiBjb21tYW5kIHRvIHBoeSAqLworCisJLyogd2FpdCBmb3IgbWlpIGNvbXBsZXRlICovCisJd2hpbGUgKCEoZXAtPmZlY19pZXZlbnQgJiBGRUNfRU5FVF9NSUkpKQorCQk7CS8qIHNwaW4gdW50aWwgZG9uZSAqLworCW1paV9yZXBseSA9IGVwLT5mZWNfbWlpX2RhdGE7CQkvKiByZXN1bHQgZnJvbSBwaHkgKi8KKwllcC0+ZmVjX2lldmVudCA9IEZFQ19FTkVUX01JSTsJCS8qIGNsZWFyIE1JSSBjb21wbGV0ZSAqLworI2lmIDAKKwlwcmludGYoIiVzWyVkXSAlczogc2VudD0weCU4Ljh4LCByZXBseT0weCU4Ljh4XG4iLAorCQlfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18sbWlpX2NtZCxtaWlfcmVwbHkpOworI2VuZGlmCisJcmV0dXJuIChtaWlfcmVwbHkgJiAweGZmZmYpOwkJLyogZGF0YSByZWFkIGZyb20gcGh5ICovCit9CisjZW5kaWYgLyogQ0ZHX0RJU0NPVkVSX1BIWSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisKKyNpZiBkZWZpbmVkKENGR19ESVNDT1ZFUl9QSFkpCitzdGF0aWMgdm9pZAorbWlpX2Rpc2NvdmVyX3BoeSh2b2lkKQoreworI2RlZmluZSBNQVhfUEhZX1BBU1NFUyAxMQorCXVpbnQgcGh5bm87CisJaW50ICBwYXNzOworCisJcGh5YWRkciA9IC0xOwkvKiBkaWRuJ3QgZmluZCBhIFBIWSB5ZXQgKi8KKwlmb3IgKHBhc3MgPSAxOyBwYXNzIDw9IE1BWF9QSFlfUEFTU0VTICYmIHBoeWFkZHIgPCAwOyArK3Bhc3MpIHsKKwkJaWYgKHBhc3MgPiAxKSB7CisJCQkvKiBQSFkgbWF5IG5lZWQgbW9yZSB0aW1lIHRvIHJlY292ZXIgZnJvbSByZXNldC4KKwkJCSAqIFRoZSBMWFQ5NzAgbmVlZHMgNTBtcyB0eXBpY2FsLCBubyBtYXhpbXVtIGlzCisJCQkgKiBzcGVjaWZpZWQsIHNvIHdhaXQgMTBtcyBiZWZvcmUgdHJ5IGFnYWluLgorCQkJICogV2l0aCAxMSBwYXNzZXMgdGhpcyBnaXZlcyBpdCAxMDBtcyB0byB3YWtlIHVwLgorCQkJICovCisJCQl1ZGVsYXkoMTAwMDApOwkvKiB3YWl0IDEwbXMgKi8KKwkJfQorCQlmb3IgKHBoeW5vID0gMDsgcGh5bm8gPCAzMiAmJiBwaHlhZGRyIDwgMDsgKytwaHlubykgeworCQkJcGh5dHlwZSA9IG1paV9zZW5kKG1rX21paV9yZWFkKHBoeW5vLCBQSFlfUEhZSURSMSkpOworI2lmZGVmIEVUX0RFQlVHCisJCQlwcmludGYoIlBIWSB0eXBlIDB4JXggcGFzcyAlZCB0eXBlICIsIHBoeXR5cGUsIHBhc3MpOworI2VuZGlmCisJCQlpZiAocGh5dHlwZSAhPSAweGZmZmYpIHsKKwkJCQlwaHlhZGRyID0gcGh5bm87CisJCQkJcGh5dHlwZSA8PD0gMTY7CisJCQkJcGh5dHlwZSB8PSBtaWlfc2VuZChta19taWlfcmVhZChwaHlubywKKwkJCQkJCQkJUEhZX1BIWUlEUjIpKTsKKworI2lmZGVmIEVUX0RFQlVHCisJCQkJcHJpbnRmKCJQSFkgQCAweCV4IHBhc3MgJWQgdHlwZSAiLHBoeW5vLHBhc3MpOworCQkJCXN3aXRjaCAocGh5dHlwZSAmIDB4ZmZmZmZmZjApIHsKKwkJCQljYXNlIFBIWV9JRF9MWFQ5NzA6CisJCQkJCXByaW50ZigiTFhUOTcwXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQSFlfSURfTFhUOTcxOgorCQkJCQlwcmludGYoIkxYVDk3MVxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUEhZX0lEXzgyNTU1OgorCQkJCQlwcmludGYoIjgyNTU1XG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQSFlfSURfUVM2NjEyOgorCQkJCQlwcmludGYoIlFTNjYxMlxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUEhZX0lEX0FNRDc5Qzc4NDoKKwkJCQkJcHJpbnRmKCJBTUQ3OUM3ODRcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFBIWV9JRF9MU0k4MDIyNUI6CisJCQkJCXByaW50ZigiTFNJIEw4MDIyNS9CXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRmKCIweCUwOHhcbiIsIHBoeXR5cGUpOworCQkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKwkJCX0KKwkJfQorCX0KKwlpZiAocGh5YWRkciA8IDApIHsKKwkJcHJpbnRmKCJObyBQSFkgZGV2aWNlIGZvdW5kLlxuIik7CisJfQorfQorI2VuZGlmCS8qIENGR19ESVNDT1ZFUl9QSFkgKi8KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkgJiYgIWRlZmluZWQoQ09ORklHX0JJVEJBTkdNSUkpCisKK3N0YXRpYyBpbnQgbWlpX2luaXRfZG9uZSA9IDA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtaWlfaW5pdCAtLSBJbml0aWFsaXplIHRoZSBNSUkgZm9yIE1JSSBjb21tYW5kIHdpdGhvdXQgZXRoZXJuZXQKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSBzdWJzZXQgb2YgZXRoX2luaXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3ZvaWQgbWlpX2luaXQgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisJYmRfdCAqYmQgPSBnZC0+YmQ7CisKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3AgPSAmKGltbXItPmltX2NwbS5jcF9mZWMpOworCWludCBpOworCisJaWYgKG1paV9pbml0X2RvbmUgIT0gMCkgeworCQlyZXR1cm47CisJfQorCisJLyogV2hhY2sgYSByZXNldC4KKwkgKiBBIGRlbGF5IGlzIHJlcXVpcmVkIGJldHdlZW4gYSByZXNldCBvZiB0aGUgRkVDIGJsb2NrIGFuZAorCSAqIGluaXRpYWxpemF0aW9uIG9mIG90aGVyIEZFQyByZWdpc3RlcnMgYmVjYXVzZSB0aGUgcmVzZXQgdGFrZXMKKwkgKiBzb21lIHRpbWUgdG8gY29tcGxldGUuIElmIHlvdSBkb24ndCBkZWxheSwgc3Vic2VxdWVudCB3cml0ZXMKKwkgKiB0byBGRUMgcmVnaXN0ZXJzIG1pZ2h0IGdldCBraWxsZWQgYnkgdGhlIHJlc2V0IHJvdXRpbmUgd2hpY2ggaXMKKwkgKiBzdGlsbCBpbiBwcm9ncmVzcy4KKwkgKi8KKworCWZlY3AtPmZlY19lY250cmwgPSBGRUNfRUNOVFJMX1BJTk1VWCB8IEZFQ19FQ05UUkxfUkVTRVQ7CisJZm9yIChpID0gMDsKKwkgICAgIChmZWNwLT5mZWNfZWNudHJsICYgRkVDX0VDTlRSTF9SRVNFVCkgJiYgKGkgPCBGRUNfUkVTRVRfREVMQVkpOworCSAgICAgKytpKSB7CisJCXVkZWxheSAoMSk7CisJfQorCWlmIChpID09IEZFQ19SRVNFVF9ERUxBWSkgeworCQlwcmludGYgKCJGRUNfUkVTRVRfREVMQVkgdGltZW91dFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBXZSB1c2Ugc3RyaWN0bHkgcG9sbGluZyBtb2RlIG9ubHkKKwkgKi8KKwlmZWNwLT5mZWNfaW1hc2sgPSAwOworCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0CisJICovCisJZmVjcC0+ZmVjX2lldmVudCA9IDB4ZmZjMDsKKworCS8qIFNldCBNSUkgc3BlZWQgdG8gMi41IE1IeiBvciBzbGlnaHRseSBiZWxvdy4KKwkgKiBBY2NvcmRpbmcgdG8gdGhlIE1QQzg2MFQgKFJldi4gRCkgRmFzdCBldGhlcm5ldCBjb250cm9sbGVyIHVzZXIKKwkgKiBtYW51YWwgKDYuMi4xNCksCisJICogdGhlIE1JSSBtYW5hZ2VtZW50IGludGVyZmFjZSBjbG9jayBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbAorCSAqIHRvIDIuNSBNSHouCisJICogVGhpcyBNREMgZnJlcXVlbmN5IGlzIGVxdWFsIHRvIHN5c3RlbSBjbG9jayAvICgyICogTUlJX1NQRUVEKS4KKwkgKiBUaGVuIE1JSV9TUEVFRCA9IHN5c3RlbV9jbG9jayAvIDIgKiAyLDUgTWh6LgorCSAqLworCWZlY3AtPmZlY19taWlfc3BlZWQgPSAoKGJkLT5iaV9idXNmcmVxICsgNDk5OTk5OSkgLyA1MDAwMDAwKSA8PCAxOworCisjaWYgIWRlZmluZWQoQ09ORklHX0lDVTg2MikgJiYgIWRlZmluZWQoQ09ORklHX0lBRDIxMCkKKwkvKiBDb25maWd1cmUgYWxsIG9mIHBvcnQgRCBmb3IgTUlJLgorCSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGRwYXIgPSAweDFmZmY7CisKKwkvKiBCaXRzIG1vdmVkIGZyb20gUmV2LiBEIG9ud2FyZCAqLworCWlmICgoZ2V0X2ltbXIgKDApICYgMHhmZmZmKSA8IDB4MDUwMSkgeworCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGlyID0gMHgxYzU4OwkvKiBQcmUgcmV2LiBEICovCisJfSBlbHNlIHsKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wZGRpciA9IDB4MWZmZjsJLyogUmV2LiBEIGFuZCBsYXRlciAqLworCX0KKyNlbHNlCisJLyogQ29uZmlndXJlIHBvcnQgQSBmb3IgTUlJLgorCSovCisKKyNpZiBkZWZpbmVkKENPTkZJR19JQ1U4NjIpCisKKwkvKiBPbiB0aGUgSUNVODYyIGJvYXJkIHRoZSBNSUktTURDIHBpbiBpcyByb3V0ZWQgdG8gUEQ4IHBpbgorCSAqIG9mIENQVSwgc28gZm9yIHRoaXMgYm9hcmQgd2UgbmVlZCB0byBjb25maWd1cmUgVXRvcGlhIGFuZAorCSAqIGVuYWJsZSBQRDggdG8gTUlJLU1EQyBmdW5jdGlvbiAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGRwYXIgfD0gMHg0MDgwOworI2VuZGlmCisKKwkvKiBIYXMgVXRvcGlhIGJlZW4gY29uZmlndXJlZD8gKi8KKwlpZiAoaW1tci0+aW1faW9wb3J0LmlvcF9wZHBhciAmICgweDgwMDAgPj4gMSkpIHsKKwkJLyoKKwkJICogWUVTIC0gVXNlIE1VWEVEIG1vZGUgZm9yIFVUT1BJQSBidXMuCisJCSAqIFRoaXMgZnJlZXMgUG9ydCBBIGZvciB1c2UgYnkgTUlJIChzZWUgODYyVU0gdGFibGUgNDEtNikuCisJCSAqLworCQlpbW1yLT5pbV9pb3BvcnQudXRtb2RlICY9IH4weDgwOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE5PIC0gc2V0IFNQTElUIG1vZGUgZm9yIFVUT1BJQSBidXMuCisJCSAqCisJCSAqIFRoaXMgZG9lc24ndCByZWFsbHkgZWZmZWN0IFVUT1BJQSAod2hpY2ggaXNuJ3QKKwkJICogZW5hYmxlZCBhbnl3YXkpIGJ1dCBqdXN0IHRlbGxzIHRoZSA4NjIKKwkJICogdG8gdXNlIHBvcnQgQSBmb3IgTUlJIChzZWUgODYyVU0gdGFibGUgNDEtNikuCisJCSAqLworCQlpbW1yLT5pbV9pb3BvcnQudXRtb2RlIHw9IDB4ODA7CisJfQorI2VuZGlmCS8qICFkZWZpbmVkKENPTkZJR19JQ1U4NjIpICovCisJLyogTm93IGVuYWJsZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvY2Vzc2luZworCSAqLworCWZlY3AtPmZlY19lY250cmwgPSBGRUNfRUNOVFJMX1BJTk1VWCB8IEZFQ19FQ05UUkxfRVRIRVJfRU47CisKKwltaWlfaW5pdF9kb25lID0gMTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVhZCBhbmQgd3JpdGUgYSBNSUkgUEhZIHJlZ2lzdGVyLCByb3V0aW5lcyB1c2VkIGJ5IE1JSSBVdGlsaXRpZXMKKyAqCisgKiBGSVhNRTogVGhlc2Ugcm91dGluZXMgYXJlIGV4cGVjdGVkIHRvIHJldHVybiAwIG9uIHN1Y2Nlc3MsIGJ1dCBtaWlfc2VuZAorICoJICBkb2VzIF9ub3RfIHJldHVybiBhbiBlcnJvciBjb2RlLiBNYXliZSAweEZGRkYgbWVhbnMgZXJyb3IsIGkuZS4KKyAqCSAgbm8gUEhZIGNvbm5lY3RlZC4uLgorICoJICBGb3Igbm93IGFsd2F5cyByZXR1cm4gMC4KKyAqIEZJWE1FOiBUaGVzZSByb3V0aW5lcyBvbmx5IHdvcmsgYWZ0ZXIgY2FsbGluZyBldGhfaW5pdCgpIGF0IGxlYXN0IG9uY2UhCisgKgkgIE90aGVyd2lzZSB0aGV5IGhhbmcgaW4gbWlpX3NlbmQoKSAhISEgU29ycnkhCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBtaWlwaHlfcmVhZCh1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIGNoYXIgIHJlZywgdW5zaWduZWQgc2hvcnQgKnZhbHVlKQoreworCXNob3J0IHJkcmVnOyAgICAvKiByZWdpc3RlciB3b3JraW5nIHZhbHVlICovCisKKyNpZmRlZiBNSUlfREVCVUcKKwlwcmludGYgKCJtaWlwaHlfcmVhZCgweCV4KSBAIDB4JXggPSAiLCByZWcsIGFkZHIpOworI2VuZGlmCisJcmRyZWcgPSBtaWlfc2VuZChta19taWlfcmVhZChhZGRyLCByZWcpKTsKKworCSp2YWx1ZSA9IHJkcmVnOworCisjaWZkZWYgTUlJX0RFQlVHCisJcHJpbnRmICgiMHglMDR4XG4iLCAqdmFsdWUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworaW50IG1paXBoeV93cml0ZSh1bnNpZ25lZCBjaGFyICBhZGRyLCB1bnNpZ25lZCBjaGFyICByZWcsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCXNob3J0IHJkcmVnOyAgICAvKiByZWdpc3RlciB3b3JraW5nIHZhbHVlICovCisKKyNpZmRlZiBNSUlfREVCVUcKKwlwcmludGYgKCJtaWlwaHlfd3JpdGUoMHgleCkgQCAweCV4ID0gIiwgcmVnLCBhZGRyKTsKKyNlbmRpZgorCisJcmRyZWcgPSBtaWlfc2VuZChta19taWlfd3JpdGUoYWRkciwgcmVnLCB2YWx1ZSkpOworCisjaWZkZWYgTUlJX0RFQlVHCisJcHJpbnRmICgiMHglMDR4XG4iLCB2YWx1ZSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkgJiYgIWRlZmluZWQoQ09ORklHX0JJVEJBTkdNSUkpKi8KKworI2VuZGlmCS8qIENGR19DTURfTkVULCBGRUNfRU5FVCAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzh4eC9zcGkuYyBiL2NwdS9tcGM4eHgvc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA0ZDg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM4eHgvc3BpLmMKQEAgLTAsMCArMSw1NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTmF2aW4gQm9wcHVyaSAvIFByYXNoYW50IFBhdGVsCisgKgk8bmJvcHB1cmlAdHJpbmV0Y29tbXVuaWNhdGlvbi5jb20+LAorICoJPHBtcGF0ZWxAdHJpbmV0Y29tbXVuaWNhdGlvbi5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgR2VyZCBNZW5uY2hlbiA8R2VyZC5NZW5uY2hlbkBpY24uc2llbWVucy5kZT4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8d2RAZGVueC5kZT4uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIE1QQzh4eCBDUE0gU1BJIGludGVyZmFjZS4KKyAqCisgKiBQYXJ0cyBvZiB0aGlzIGNvZGUgYXJlIHByb2JhYmx5IG5vdCBwb3J0YWJsZSBhbmQvb3Igc3BlY2lmaWMgdG8KKyAqIHRoZSBib2FyZCB3aGljaCBJIHVzZWQgZm9yIHRoZSB0ZXN0cy4gUGxlYXNlIHNlbmQgZml4ZXMvY29tcGxhaW50cworICogdG8gd2RAZGVueC5kZQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKworI2lmIChkZWZpbmVkKENPTkZJR19TUEkpKSB8fCAoQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9TUEkpCisKKy8qIFdhcm5pbmc6CisgKiBZb3UgY2Fubm90IGVuYWJsZSBERUJVRyBmb3IgZWFybHkgc3lzdGVtIGluaXRhbGl6YXRpb24sIGkuIGUuIHdoZW4KKyAqIHRoaXMgZHJpdmVyIGlzIHVzZWQgdG8gcmVhZCBlbnZpcm9ubWVudCBwYXJhbWV0ZXJzIGxpa2UgImJhdWRyYXRlIgorICogZnJvbSBFRVBST00gd2hpY2ggYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc2VyaWFsIHBvcnQgd2hpY2ggaXMKKyAqIG5lZWRlZCB0byBwcmludCB0aGUgZGVidWcgbWVzc2FnZXMuLi4KKyAqLworI3VuZGVmCURFQlVHCisKKyNkZWZpbmUgU1BJX0VFUFJPTV9XUkVOCQkweDA2CisjZGVmaW5lIFNQSV9FRVBST01fUkRTUgkJMHgwNQorI2RlZmluZSBTUElfRUVQUk9NX1JFQUQJCTB4MDMKKyNkZWZpbmUgU1BJX0VFUFJPTV9XUklURQkweDAyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogT2Zmc2V0IGZvciBpbml0aWFsIFNQSSBidWZmZXJzIGluIERQUkFNOgorICogV2UgbmVlZCBhIDUyMCBieXRlIHNjcmF0Y2ggRFBSQU0gYXJlYSB0byB1c2UgYXQgYW4gZWFybHkgc3RhZ2UuCisgKiBJdCBpcyB1c2VkIGJldHdlZW4gdGhlIHR3byBpbml0aWFsaXphdGlvbiBjYWxscyAoc3BpX2luaXRfZigpCisgKiBhbmQgc3BpX2luaXRfcigpKS4KKyAqIFRoZSB2YWx1ZSAweGIwMCBtYWtlcyBpdCBmYXIgZW5vdWdoIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkYXRhCisgKiBhcmVhIChhcyB3ZWxsIGFzIGZyb20gdGhlIHN0YWNrIHBvaW50ZXIpLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZuZGVmCUNGR19TUElfSU5JVF9PRkZTRVQKKyNkZWZpbmUJQ0ZHX1NQSV9JTklUX09GRlNFVAkweEIwMAorI2VuZGlmCisKKyNpZmRlZglERUJVRworCisjZGVmaW5lCURQUklOVChhKQlwcmludGYgYTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBIZWxwZXIgZnVuY3Rpb25zIHRvIHBlZWsgaW50byB0eCBhbmQgcnggYnVmZmVycworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGV4X2RpZ2l0ID0gIjAxMjM0NTY3ODlBQkNERUYiOworCitzdGF0aWMgY2hhciBxdWlja2hleCAoaW50IGkpCit7CisJcmV0dXJuIGhleF9kaWdpdFtpXTsKK30KKworc3RhdGljIHZvaWQgbWVtZHVtcCAodm9pZCAqcHYsIGludCBudW0pCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqcGMgPSAodW5zaWduZWQgY2hhciAqKSBwdjsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJcHJpbnRmICgiJWMlYyAiLCBxdWlja2hleCAocGNbaV0gPj4gNCksIHF1aWNraGV4IChwY1tpXSAmIDB4MGYpKTsKKwlwcmludGYgKCJcdCIpOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJcHJpbnRmICgiJWMiLCBpc3ByaW50IChwY1tpXSkgPyBwY1tpXSA6ICcuJyk7CisJcHJpbnRmICgiXG4iKTsKK30KKyNlbHNlCS8qICFERUJVRyAqLworCisjZGVmaW5lCURQUklOVChhKQorCisjZW5kaWYJLyogREVCVUcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb24gcHJvdG90eXBlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBzcGlfaW5pdCAodm9pZCk7CisKK3NzaXplX3Qgc3BpX3JlYWQgKHVjaGFyICosIGludCwgdWNoYXIgKiwgaW50KTsKK3NzaXplX3Qgc3BpX3dyaXRlICh1Y2hhciAqLCBpbnQsIHVjaGFyICosIGludCk7Citzc2l6ZV90IHNwaV94ZmVyIChzaXplX3QpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWYXJpYWJsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBNQVhfQlVGRkVSCTB4MTA0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluaXRpYWxseSB3ZSBwbGFjZSB0aGUgUlggYW5kIFRYIGJ1ZmZlcnMgYXQgYSBmaXhlZCBsb2NhdGlvbiBpbiBEUFJBTSEKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB1Y2hhciAqcnhidWYgPQorICAodWNoYXIgKikmKChjcG04eHhfdCAqKSYoKGltbWFwX3QgKilDRkdfSU1NUiktPmltX2NwbSktPmNwX2RwbWVtCisJCQlbQ0ZHX1NQSV9JTklUX09GRlNFVF07CitzdGF0aWMgdWNoYXIgKnR4YnVmID0KKyAgKHVjaGFyICopJigoY3BtOHh4X3QgKikmKChpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9jcG0pLT5jcF9kcG1lbQorCQkJW0NGR19TUElfSU5JVF9PRkZTRVQrTUFYX0JVRkZFUl07CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uOiAgICBzcGlfaW5pdF9mCisgKgorICogIERlc2NyaXB0aW9uOiBJbml0IFNQSS1Db250cm9sbGVyIChST00gcGFydCkKKyAqCisgKiAgcmV0dXJuOiAgICAgIC0tLQorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCit2b2lkIHNwaV9pbml0X2YgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGRwYWRkcjsKKworCXZvbGF0aWxlIHNwaV90ICpzcGk7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tcjsKKwl2b2xhdGlsZSBjcGljOHh4X3QgKmNwaTsKKwl2b2xhdGlsZSBjcG04eHhfdCAqY3A7CisJdm9sYXRpbGUgaW9wOHh4X3QgKmlvcDsKKwl2b2xhdGlsZSBjYmRfdCAqdGJkZiwgKnJiZGY7CisKKwlpbW1yID0gKGltbWFwX3QgKikgIENGR19JTU1SOworCWNwaSAgPSAoY3BpYzh4eF90ICopJmltbXItPmltX2NwaWM7CisJaW9wICA9IChpb3A4eHhfdCAqKSAmaW1tci0+aW1faW9wb3J0OworCWNwICAgPSAoY3BtOHh4X3QgKikgJmltbXItPmltX2NwbTsKKworI2lmZGVmIENGR19TUElfVUNPREVfUEFUQ0gKKwlzcGkgID0gKHNwaV90ICopJmNwLT5jcF9kcG1lbVtzcGktPnNwaV9ycGJhc2VdOworI2Vsc2UKKwlzcGkgID0gKHNwaV90ICopJmNwLT5jcF9kcGFyYW1bUFJPRkZfU1BJXTsKKwkvKiBEaXNhYmxlIHJlbG9jYXRpb24gKi8KKwlzcGktPnNwaV9ycGJhc2UgPSAwOworI2VuZGlmCisKKy8qIDEgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBJbml0aWFsaXplIFBvcnQgQiBTUEkgcGlucyAtPiBwYWdlIDM0LTggTVBDODYwVU0KKwkgKiAod2UgYXJlIG9ubHkgaW4gTWFzdGVyIE1vZGUgISkKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogR1BJTyBvciBwZXIuIEZ1bmN0aW9uCisJICogUEJQQVJbMjhdID0gMSBbMHgwMDAwMDAwOF0gLT4gUEVSSTogKFNQSU1JU08pCisJICogUEJQQVJbMjldID0gMSBbMHgwMDAwMDAwNF0gLT4gUEVSSTogKFNQSU1PU0kpCisJICogUEJQQVJbMzBdID0gMSBbMHgwMDAwMDAwMl0gLT4gUEVSSTogKFNQSUNMSykKKwkgKiBQQlBBUlszMV0gPSAwIFsweDAwMDAwMDAxXSAtPiBHUElPOiAoQ1MgZm9yIFBDVUUvQ0NNLUVFUFJPTSkKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNwLT5jcF9wYnBhciB8PSAgMHgwMDAwMDAwRTsJLyogc2V0ICBiaXRzCSovCisJY3AtPmNwX3BicGFyICY9IH4weDAwMDAwMDAxOwkvKiByZXNldCBiaXQJKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBJbi9PdXQgb3IgcGVyLiBGdW5jdGlvbiAwLzEKKwkgKiBQQkRJUlsyOF0gPSAxIFsweDAwMDAwMDA4XSAtPiBQRVJJMTogU1BJTUlTTworCSAqIFBCRElSWzI5XSA9IDEgWzB4MDAwMDAwMDRdIC0+IFBFUkkxOiBTUElNT1NJCisJICogUEJESVJbMzBdID0gMSBbMHgwMDAwMDAwMl0gLT4gUEVSSTE6IFNQSUNMSworCSAqIFBCRElSWzMxXSA9IDEgWzB4MDAwMDAwMDFdIC0+IEdQSU8gT1VUOiBDUyBmb3IgUENVRS9DQ00tRUVQUk9NCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNwLT5jcF9wYmRpciB8PSAweDAwMDAwMDBGOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIG9wZW4gZHJhaW4gb3IgYWN0aXZlIG91dHB1dAorCSAqIFBCT0RSWzI4XSA9IDEgWzB4MDAwMDAwMDhdIC0+IG9wZW4gZHJhaW46IFNQSU1JU08KKwkgKiBQQk9EUlsyOV0gPSAwIFsweDAwMDAwMDA0XSAtPiBhY3RpdmUgb3V0cHV0IFNQSU1PU0kKKwkgKiBQQk9EUlszMF0gPSAwIFsweDAwMDAwMDAyXSAtPiBhY3RpdmUgb3V0cHV0OiBTUElDTEsKKwkgKiBQQk9EUlszMV0gPSAwIFsweDAwMDAwMDAxXSAtPiBhY3RpdmUgb3V0cHV0OiBHUElPIE9VVDogQ1MgZm9yIFBDVUUvQ0NNCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJY3AtPmNwX3Bib2RyIHw9ICAweDAwMDAwMDA4OworCWNwLT5jcF9wYm9kciAmPSB+MHgwMDAwMDAwNzsKKworCS8qIEluaXRpYWxpemUgdGhlIHBhcmFtZXRlciByYW0uCisJICogV2UgbmVlZCB0byBtYWtlIHN1cmUgbWFueSB0aGluZ3MgYXJlIGluaXRpYWxpemVkIHRvIHplcm8KKwkgKi8KKwlzcGktPnNwaV9yc3RhdGUJPSAwOworCXNwaS0+c3BpX3JkcAk9IDA7CisJc3BpLT5zcGlfcmJwdHIJPSAwOworCXNwaS0+c3BpX3JiYwk9IDA7CisJc3BpLT5zcGlfcnh0bXAJPSAwOworCXNwaS0+c3BpX3RzdGF0ZQk9IDA7CisJc3BpLT5zcGlfdGRwCT0gMDsKKwlzcGktPnNwaV90YnB0cgk9IDA7CisJc3BpLT5zcGlfdGJjCT0gMDsKKwlzcGktPnNwaV90eHRtcAk9IDA7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3Igb25lIHRyYW5zbWl0IGFuZCBvbmUgcmVjZWl2ZSBidWZmZXIKKwkgKiBkZXNjcmlwdG9yIGluIHRoZSBEUCByYW0KKwkgKi8KKyNpZmRlZiBDRkdfQUxMT0NfRFBSQU0KKwlkcGFkZHIgPSBkcHJhbV9hbGxvY19hbGlnbiAoc2l6ZW9mKGNiZF90KSoyLCA4KTsKKyNlbHNlCisJZHBhZGRyID0gQ1BNX1NQSV9CQVNFOworI2VuZGlmCisKKy8qIDMgKi8KKwkvKiBTZXQgdXAgdGhlIFNQSSBwYXJhbWV0ZXJzIGluIHRoZSBwYXJhbWV0ZXIgcmFtICovCisJc3BpLT5zcGlfcmJhc2UgPSBkcGFkZHI7CisJc3BpLT5zcGlfdGJhc2UgPSBkcGFkZHIgKyBzaXplb2YgKGNiZF90KTsKKworCS8qKioqKioqKioqKklNUE9SVEFOVCoqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBTZXR0aW5nIHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9yIHBvaW50ZXJzCisgICAgICAgICAqIGluaXRpYWxseSB0byByYmFzZSBhbmQgdGJhc2UuIE9ubHkgdGhlIG1pY3JvY29kZSBwYXRjaGVzCisgICAgICAgICAqIGRvY3VtZW50YXRpb24gdGFsa3MgYWJvdXQgaW5pdGlhbGl6aW5nIHRoaXMgcG9pbnRlci4gVGhpcworICAgICAgICAgKiBpcyBtaXNzaW5nIGZyb20gdGhlIHNhbXBsZSBJMkMgZHJpdmVyLiBJZiB5b3UgZG9udAorICAgICAgICAgKiBpbml0aWFsaXplIHRoZXNlIHBvaW50ZXJzLCB0aGUga2VybmVsIGhhbmdzLgorCSAqLworCXNwaS0+c3BpX3JicHRyID0gc3BpLT5zcGlfcmJhc2U7CisJc3BpLT5zcGlfdGJwdHIgPSBzcGktPnNwaV90YmFzZTsKKworLyogNCAqLworI2lmZGVmIENGR19TUElfVUNPREVfUEFUQ0gKKwkvKgorCSAqICBJbml0aWFsaXplIHJlcXVpcmVkIHBhcmFtZXRlcnMgaWYgdXNpbmcgbWljcm9jb2RlIHBhdGNoLgorCSAqLworCXNwaS0+c3BpX3JzdGF0ZSA9IDA7CisJc3BpLT5zcGlfdHN0YXRlID0gMDsKKyNlbHNlCisJLyogSW5pdCBTUEkgVHggKyBSeCBQYXJhbWV0ZXJzICovCisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykKKwkJOworCWNwLT5jcF9jcGNyID0gbWtfY3JfY21kKENQTV9DUl9DSF9TUEksIENQTV9DUl9JTklUX1RSWCkgfCBDUE1fQ1JfRkxHOworCXdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpCisJCTsKKyNlbmRpZgkvKiBDRkdfU1BJX1VDT0RFX1BBVENIICovCisKKy8qIDUgKi8KKwkvKiBTZXQgU0RNQSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2RjciA9IDB4MDAwMTsKKworLyogNiAqLworCS8qIFNldCB0byBiaWcgZW5kaWFuLiAqLworCXNwaS0+c3BpX3RmY3IgPSBTTUNfRUI7CisJc3BpLT5zcGlfcmZjciA9IFNNQ19FQjsKKworLyogNyAqLworCS8qIFNldCBtYXhpbXVtIHJlY2VpdmUgc2l6ZS4gKi8KKwlzcGktPnNwaV9tcmJsciA9IE1BWF9CVUZGRVI7CisKKy8qIDggKyA5ICovCisJLyogdHggYW5kIHJ4IGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworCXRiZGYgPSAoY2JkX3QgKikgJiBjcC0+Y3BfZHBtZW1bc3BpLT5zcGlfdGJhc2VdOworCXJiZGYgPSAoY2JkX3QgKikgJiBjcC0+Y3BfZHBtZW1bc3BpLT5zcGlfcmJhc2VdOworCisJdGJkZi0+Y2JkX3NjICY9IH5CRF9TQ19SRUFEWTsKKwlyYmRmLT5jYmRfc2MgJj0gfkJEX1NDX0VNUFRZOworCisJLyogU2V0IHRoZSBiZCdzIHJ4IGFuZCB0eCBidWZmZXIgYWRkcmVzcyBwb2ludGVycyAqLworCXJiZGYtPmNiZF9idWZhZGRyID0gKHVsb25nKSByeGJ1ZjsKKwl0YmRmLT5jYmRfYnVmYWRkciA9ICh1bG9uZykgdHhidWY7CisKKy8qIDEwICsgMTEgKi8KKwljcC0+Y3Bfc3BpbSA9IDA7CQkJLyogTWFzayAgYWxsIFNQSSBldmVudHMgKi8KKwljcC0+Y3Bfc3BpZSA9IFNQSV9FTUFTSzsJCS8qIENsZWFyIGFsbCBTUEkgZXZlbnRzCSovCisKKwlyZXR1cm47Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uOiAgICBzcGlfaW5pdF9yCisgKgorICogIERlc2NyaXB0aW9uOiBJbml0IFNQSS1Db250cm9sbGVyIChSQU0gcGFydCkgLQorICoJCSBUaGUgbWFsbG9jIGVuZ2luZSBpcyByZWFkeSBhbmQgd2UgY2FuIG1vdmUgb3VyIGJ1ZmZlcnMgdG8KKyAqCQkgbm9ybWFsIFJBTQorICoKKyAqICByZXR1cm46ICAgICAgLS0tCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQgc3BpX2luaXRfciAodm9pZCkKK3sKKwl2b2xhdGlsZSBjcG04eHhfdCAqY3A7CisJdm9sYXRpbGUgc3BpX3QgKnNwaTsKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yOworCXZvbGF0aWxlIGNiZF90ICp0YmRmLCAqcmJkZjsKKworCWltbXIgPSAoaW1tYXBfdCAqKSAgQ0ZHX0lNTVI7CisJY3AgICA9IChjcG04eHhfdCAqKSAmaW1tci0+aW1fY3BtOworCisjaWZkZWYgQ0ZHX1NQSV9VQ09ERV9QQVRDSAorCXNwaSAgPSAoc3BpX3QgKikmY3AtPmNwX2RwbWVtW3NwaS0+c3BpX3JwYmFzZV07CisjZWxzZQorCXNwaSAgPSAoc3BpX3QgKikmY3AtPmNwX2RwYXJhbVtQUk9GRl9TUEldOworCS8qIERpc2FibGUgcmVsb2NhdGlvbiAqLworCXNwaS0+c3BpX3JwYmFzZSA9IDA7CisjZW5kaWYKKworCS8qIHR4IGFuZCByeCBidWZmZXIgZGVzY3JpcHRvcnMgKi8KKwl0YmRmID0gKGNiZF90ICopICYgY3AtPmNwX2RwbWVtW3NwaS0+c3BpX3RiYXNlXTsKKwlyYmRmID0gKGNiZF90ICopICYgY3AtPmNwX2RwbWVtW3NwaS0+c3BpX3JiYXNlXTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgUlggYW5kIFRYIGJ1ZmZlcnMgKi8KKwlyeGJ1ZiA9ICh1Y2hhciAqKSBtYWxsb2MgKE1BWF9CVUZGRVIpOworCXR4YnVmID0gKHVjaGFyICopIG1hbGxvYyAoTUFYX0JVRkZFUik7CisKKwlyYmRmLT5jYmRfYnVmYWRkciA9ICh1bG9uZykgcnhidWY7CisJdGJkZi0+Y2JkX2J1ZmFkZHIgPSAodWxvbmcpIHR4YnVmOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEZ1bmN0aW9uOiAgICBzcGlfd3JpdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzc2l6ZV90IHNwaV93cml0ZSAodWNoYXIgKmFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBpOworCisJbWVtc2V0KHJ4YnVmLCAwLCBNQVhfQlVGRkVSKTsKKwltZW1zZXQodHhidWYsIDAsIE1BWF9CVUZGRVIpOworCSp0eGJ1ZiA9IFNQSV9FRVBST01fV1JFTjsJCS8qIHdyaXRlIGVuYWJsZQkJKi8KKwlzcGlfeGZlcigxKTsKKwltZW1jcHkodHhidWYsIGFkZHIsIGFsZW4pOworCSp0eGJ1ZiA9IFNQSV9FRVBST01fV1JJVEU7CQkvKiBXUklURSBtZW1vcnkgYXJyYXkJKi8KKwltZW1jcHkoYWxlbiArIHR4YnVmLCBidWZmZXIsIGxlbik7CisJc3BpX3hmZXIoYWxlbiArIGxlbik7CisJCQkJCQkvKiBpZ25vcmUgcmVjZWl2ZWQgZGF0YQkqLworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkJKnR4YnVmID0gU1BJX0VFUFJPTV9SRFNSOwkvKiByZWFkIHN0YXR1cwkJKi8KKwkJdHhidWZbMV0gPSAwOworCQlzcGlfeGZlcigyKTsKKwkJaWYgKCEocnhidWZbMV0gJiAxKSkgeworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMDApOworCX0KKwlpZiAoaSA+PSAxMDAwKSB7CisJCXByaW50ZiAoIioqKiBzcGlfd3JpdGU6IFRpbWUgb3V0IHdoaWxlIHdyaXRpbmchXG4iKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEZ1bmN0aW9uOiAgICBzcGlfcmVhZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3NzaXplX3Qgc3BpX3JlYWQgKHVjaGFyICphZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwltZW1zZXQocnhidWYsIDAsIE1BWF9CVUZGRVIpOworCW1lbXNldCh0eGJ1ZiwgMCwgTUFYX0JVRkZFUik7CisJbWVtY3B5KHR4YnVmLCBhZGRyLCBhbGVuKTsKKwkqdHhidWYgPSBTUElfRUVQUk9NX1JFQUQ7CQkvKiBSRUFEIG1lbW9yeSBhcnJheQkqLworCisJLyoKKwkgKiBUaGVyZSBpcyBhIGJ1ZyBpbiA4NjBUICg/KSB0aGF0IGN1dHMgdGhlIGxhc3QgYnl0ZSBvZiBpbnB1dAorCSAqIGlmIHdlJ3JlIHJlYWRpbmcgaW50byBEUFJBTS4gVGhlIHNvbHV0aW9uIHdlIGNob29zZSBoZXJlIGlzCisJICogdG8gYWx3YXlzIHJlYWQgbGVuKzEgYnl0ZXMgKHdlIGhhdmUgb25lIGV4dHJhIGJ5dGUgYXQgdGhlCisJICogZW5kIG9mIHRoZSBidWZmZXIpLgorCSAqLworCXNwaV94ZmVyKGFsZW4gKyBsZW4gKyAxKTsKKwltZW1jcHkoYnVmZmVyLCBhbGVuICsgcnhidWYsIGxlbik7CisKKwlyZXR1cm4gbGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEZ1bmN0aW9uOiAgICBzcGlfeGZlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3NzaXplX3Qgc3BpX3hmZXIgKHNpemVfdCBjb3VudCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yOworCXZvbGF0aWxlIGNwbTh4eF90ICpjcDsKKwl2b2xhdGlsZSBzcGlfdCAqc3BpOworCWNiZF90ICp0YmRmLCAqcmJkZjsKKwl1c2hvcnQgbG9vcDsKKwlpbnQgdG07CisKKwlEUFJJTlQgKCgiKioqIHNwaV94ZmVyIGVudGVyZWQgKioqXG4iKSk7CisKKwlpbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJY3AgICA9IChjcG04eHhfdCAqKSAmaW1tci0+aW1fY3BtOworCisjaWZkZWYgQ0ZHX1NQSV9VQ09ERV9QQVRDSAorCXNwaSAgPSAoc3BpX3QgKikmY3AtPmNwX2RwbWVtW3NwaS0+c3BpX3JwYmFzZV07CisjZWxzZQorCXNwaSAgPSAoc3BpX3QgKikmY3AtPmNwX2RwYXJhbVtQUk9GRl9TUEldOworCS8qIERpc2FibGUgcmVsb2NhdGlvbiAqLworCXNwaS0+c3BpX3JwYmFzZSA9IDA7CisjZW5kaWYKKworCXRiZGYgPSAoY2JkX3QgKikgJiBjcC0+Y3BfZHBtZW1bc3BpLT5zcGlfdGJhc2VdOworCXJiZGYgPSAoY2JkX3QgKikgJiBjcC0+Y3BfZHBtZW1bc3BpLT5zcGlfcmJhc2VdOworCisJLyogU2V0IENTIGZvciBkZXZpY2UgKi8KKwljcC0+Y3BfcGJkYXQgJj0gfjB4MDAwMTsKKworCS8qIFNldHRpbmcgdHggYmQgc3RhdHVzIGFuZCBkYXRhIGxlbmd0aCAqLworCXRiZGYtPmNiZF9zYyAgPSBCRF9TQ19SRUFEWSB8IEJEX1NDX0xBU1QgfCBCRF9TQ19XUkFQOworCXRiZGYtPmNiZF9kYXRsZW4gPSBjb3VudDsKKworCURQUklOVCAoKCIqKiogc3BpX3hmZXI6IEJ5dGVzIHRvIGJlIHhmZXJyZWQ6ICVkICoqKlxuIiwKKwkJCQkJCQl0YmRmLT5jYmRfZGF0bGVuKSk7CisKKwkvKiBTZXR0aW5nIHJ4IGJkIHN0YXR1cyBhbmQgZGF0YSBsZW5ndGggKi8KKwlyYmRmLT5jYmRfc2MgPSBCRF9TQ19FTVBUWSB8IEJEX1NDX1dSQVA7CisJcmJkZi0+Y2JkX2RhdGxlbiA9IDA7CSAvKiByeCBsZW5ndGggaGFzIG5vIHNpZ25pZmljYW5jZSAqLworCisJbG9vcCA9IGNwLT5jcF9zcG1vZGUgJiBTUE1PREVfTE9PUDsKKwljcC0+Y3Bfc3Btb2RlID0gLypTUE1PREVfRElWMTYJfCovCS8qIEJSRy8xNiBtb2RlIG5vdCB1c2VkIGhlcmUgKi8KKwkJCWxvb3AJCXwKKwkJCVNQTU9ERV9SRVYJfAorCQkJU1BNT0RFX01TVFIJfAorCQkJU1BNT0RFX0VOCXwKKwkJCVNQTU9ERV9MRU4oOCkJfAkvKiA4IEJpdHMgcGVyIGNoYXIgKi8KKwkJCVNQTU9ERV9QTSgweDgpIDsJLyogbWVkaXVtIHNwZWVkICovCisJY3AtPmNwX3NwaW0gPSAwOwkJCS8qIE1hc2sgIGFsbCBTUEkgZXZlbnRzICovCisJY3AtPmNwX3NwaWUgPSBTUElfRU1BU0s7CQkvKiBDbGVhciBhbGwgU1BJIGV2ZW50cwkqLworCisJLyogc3RhcnQgc3BpIHRyYW5zZmVyICovCisJRFBSSU5UICgoIioqKiBzcGlfeGZlcjogUGVyZm9ybWluZyB0cmFuc2ZlciAuLi5cbiIpKTsKKwljcC0+Y3Bfc3Bjb20gfD0gU1BJX1NUUjsJCS8qIFN0YXJ0IHRyYW5zbWl0ICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFdhaXQgZm9yIFNQSSB0cmFuc21pdCB0byBnZXQgb3V0CisJICogb3IgdGltZSBvdXQgKDEgc2Vjb25kID0gMTAwMCBtcykKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWZvciAodG09MDsgdG08MTAwMDsgKyt0bSkgeworCQlpZiAoY3AtPmNwX3NwaWUgJiBTUElfVFhCKSB7CS8qIFR4IEJ1ZmZlciBFbXB0eSAqLworCQkJRFBSSU5UICgoIioqKiBzcGlfeGZlcjogVHggYnVmZmVyIGVtcHR5XG4iKSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKHRiZGYtPmNiZF9zYyAmIEJEX1NDX1JFQURZKSA9PSAwKSB7CisJCQlEUFJJTlQgKCgiKioqIHNwaV94ZmVyOiBUeCBCRCBkb25lXG4iKSk7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkgKDEwMDApOworCX0KKwlpZiAodG0gPj0gMTAwMCkgeworCQlwcmludGYgKCIqKiogc3BpX3hmZXI6IFRpbWUgb3V0IHdoaWxlIHhmZXJyaW5nIHRvL2Zyb20gU1BJIVxuIik7CisJfQorCURQUklOVCAoKCIqKiogc3BpX3hmZXI6IC4uLiB0cmFuc2ZlciBlbmRlZFxuIikpOworCisjaWZkZWYJREVCVUcKKwlwcmludGYgKCJcbnNwaV94ZmVyOiB0eGJ1ZiBhZnRlciB4ZmVyXG4iKTsKKwltZW1kdW1wICgodm9pZCAqKSB0eGJ1ZiwgMTYpOwkvKiBkdW1wIG9mIHR4YnVmIGJlZm9yZSB0cmFuc21pdCAqLworCXByaW50ZiAoInNwaV94ZmVyOiByeGJ1ZiBhZnRlciB4ZmVyXG4iKTsKKwltZW1kdW1wICgodm9pZCAqKSByeGJ1ZiwgMTYpOwkvKiBkdW1wIG9mIHJ4YnVmIGFmdGVyIHRyYW5zbWl0ICovCisJcHJpbnRmICgiXG4iKTsKKyNlbmRpZgorCisJLyogQ2xlYXIgQ1MgZm9yIGRldmljZSAqLworCWNwLT5jcF9wYmRhdCB8PSAweDAwMDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CisjZW5kaWYJLyogQ09ORklHX1NQSSB8fCAoQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9TUEkpICovCisKKy8qCisgKiBTUEkgdGVzdAorICoKKyAqIFRoZSBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgaXMgdGVzdGVkIGluIHRoZSBsb2NhbCBsb29wYmFjayBtb2RlLgorICogVGhlIGludGVyZmFjZSBpcyBjb25maWd1cmVkIGFjY29yZGluZ2x5IGFuZCBzZXZlcmFsIHBhY2tldHMKKyAqIGFyZSB0cmFuc2ZlcmVkLiBUaGUgY29uZmlndXJhYmxlIHRlc3QgcGFyYW1ldGVycyBhcmU6CisgKiAgIFRFU1RfTUlOX0xFTkdUSCAtIG1pbmltdW0gc2l6ZSBvZiBwYWNrZXQgdG8gdHJhbnNmZXIKKyAqICAgVEVTVF9NQVhfTEVOR1RIIC0gbWF4aW11bSBzaXplIG9mIHBhY2tldCB0byB0cmFuc2ZlcgorICogICBURVNUX05VTSAtIG51bWJlciBvZiB0ZXN0cworICovCisKKyNpZiBDT05GSUdfUE9TVCAmIENGR19QT1NUX1NQSQorCisjZGVmaW5lIFRFU1RfTUlOX0xFTkdUSAkJMQorI2RlZmluZSBURVNUX01BWF9MRU5HVEgJCU1BWF9CVUZGRVIKKyNkZWZpbmUgVEVTVF9OVU0JCTEKKworc3RhdGljIHZvaWQgcGFja2V0X2ZpbGwgKGNoYXIgKiBwYWNrZXQsIGludCBsZW5ndGgpCit7CisJY2hhciBjID0gKGNoYXIpIGxlbmd0aDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwl7CisJICAgIHBhY2tldFtpXSA9IGMrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGFja2V0X2NoZWNrIChjaGFyICogcGFja2V0LCBpbnQgbGVuZ3RoKQoreworCWNoYXIgYyA9IChjaGFyKSBsZW5ndGg7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJeworCSAgICBpZiAocGFja2V0W2ldICE9IGMrKykgcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgc3BpX3Bvc3RfdGVzdCAoaW50IGZsYWdzKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJaW50IHJlcyA9IC0xOworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBjcG04eHhfdCAqY3AgPSAoY3BtOHh4X3QgKikgJmltbXItPmltX2NwbTsKKwlpbnQgaTsKKwlpbnQgbDsKKworCXNwaV9pbml0X2YoKTsKKwlzcGlfaW5pdF9yKCk7CisKKwljcC0+Y3Bfc3Btb2RlIHw9IFNQTU9ERV9MT09QOworCisJZm9yIChpID0gMDsgaSA8IFRFU1RfTlVNOyBpKyspCisJeworCSAgICBmb3IgKGwgPSBURVNUX01JTl9MRU5HVEg7IGwgPD0gVEVTVF9NQVhfTEVOR1RIOyBsICs9IDgpCisJICAgIHsKKwkJcGFja2V0X2ZpbGwodHhidWYsIGwpOworCisJCXNwaV94ZmVyKGwpOworCisJCWlmIChwYWNrZXRfY2hlY2socnhidWYsIGwpIDwgMCkKKwkJeworCQkgICAgZ290byBEb25lOworCQl9CisJICAgIH0KKwl9CisKKwlyZXMgPSAwOworCisJRG9uZToKKworCWNwLT5jcF9zcG1vZGUgJj0gflNQTU9ERV9MT09QOworCisJLyoKKwkgKiBTQ0MyIEV0aGVybmV0IHBhcmFtZXRlciBSQU0gc3BhY2Ugb3ZlcmxhcHMKKwkgKiB0aGUgU1BJIHBhcmFtZXRlciBSQU0gc3BhY2UuIFNvIHdlIG5lZWQgdG8gcmVzdG9yZQorCSAqIHRoZSBTQ0MyIGNvbmZpZ3VyYXRpb24gaWYgaXQgaXMgdXNlZCBieSBVQVJUIG9yIEV0aGVybmV0LgorCSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfOHh4X0NPTlNfU0NDMikKKwlzZXJpYWxfaW5pdCgpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNDQ19FTkVUKSAmJiAoU0NDX0VORVQgPT0gMSkKKwlldGhfaW5pdChnZC0+YmQpOworI2VuZGlmCisKKwlpZiAocmVzICE9IDApCisJeworCQlwb3N0X2xvZygiU1BJIHRlc3QgZmFpbGVkXG4iKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorI2VuZGlmCS8qIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfU1BJICovCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4LzQwNWdwX2VuZXQuYyBiL2NwdS9wcGM0eHgvNDA1Z3BfZW5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTllNDIKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvcHBjNHh4LzQwNWdwX2VuZXQuYwpAQCAtMCwwICsxLDg2NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiAgICAgICBUaGlzIHNvdXJjZSBjb2RlIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlIHRvIHlvdSBieSBJQk0gb24gYW4gQVMtSVMKKyAqICAgICAgIGJhc2lzLiAgQW55b25lIHJlY2VpdmluZyB0aGlzIHNvdXJjZSBpcyBsaWNlbnNlZCB1bmRlciBJQk0KKyAqICAgICAgIGNvcHlyaWdodHMgdG8gdXNlIGl0IGluIGFueSB3YXkgaGUgb3Igc2hlIGRlZW1zIGZpdCwgaW5jbHVkaW5nCisgKiAgICAgICBjb3B5aW5nIGl0LCBtb2RpZnlpbmcgaXQsIGNvbXBpbGluZyBpdCwgYW5kIHJlZGlzdHJpYnV0aW5nIGl0IGVpdGhlcgorICogICAgICAgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMuICBObyBsaWNlbnNlIHVuZGVyIElCTSBwYXRlbnRzIG9yCisgKiAgICAgICBwYXRlbnQgYXBwbGljYXRpb25zIGlzIHRvIGJlIGltcGxpZWQgYnkgdGhlIGNvcHlyaWdodCBsaWNlbnNlLgorICoKKyAqICAgICAgIEFueSB1c2VyIG9mIHRoaXMgc29mdHdhcmUgc2hvdWxkIHVuZGVyc3RhbmQgdGhhdCBJQk0gY2Fubm90IHByb3ZpZGUKKyAqICAgICAgIHRlY2huaWNhbCBzdXBwb3J0IGZvciB0aGlzIHNvZnR3YXJlIGFuZCB3aWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IKKyAqICAgICAgIGFueSBjb25zZXF1ZW5jZXMgcmVzdWx0aW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqICAgICAgIEFueSBwZXJzb24gd2hvIHRyYW5zZmVycyB0aGlzIHNvdXJjZSBjb2RlIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsKKyAqICAgICAgIG11c3QgaW5jbHVkZSB0aGUgSUJNIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgcGFyYWdyYXBoLCBhbmQgdGhlCisgKiAgICAgICBwcmVjZWRpbmcgdHdvIHBhcmFncmFwaHMgaW4gdGhlIHRyYW5zZmVycmVkIHNvZnR3YXJlLgorICoKKyAqICAgICAgIENPUFlSSUdIVCAgIEkgQiBNICAgQ09SUE9SQVRJT04gMTk5NQorICogICAgICAgTElDRU5TRUQgTUFURVJJQUwgIC0gIFBST0dSQU0gUFJPUEVSVFkgT0YgSSBCIE0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiAgRmlsZSBOYW1lOiAgZW5ldGVtYWMuYworICoKKyAqICBGdW5jdGlvbjogICBEZXZpY2UgZHJpdmVyIGZvciB0aGUgZXRoZXJuZXQgRU1BQzMgbWFjcm8gb24gdGhlIDQwNUdQLgorICoKKyAqICBBdXRob3I6ICAgICBNYXJrIFdpc25lcgorICoKKyAqICBDaGFuZ2UgQWN0aXZpdHktCisgKgorICogIERhdGUgICAgICAgIERlc2NyaXB0aW9uIG9mIENoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZCisgKiAgLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tCisgKiAgMDUtTWF5LTk5ICAgQ3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUtXCisgKiAgMjctSnVuLTk5ICAgQ2xlYW4gdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSldCCisgKiAgMTYtSnVsLTk5ICAgQWRkZWQgTUFMIGVycm9yIHJlY292ZXJ5IGFuZCBiZXR0ZXIgSVAgcGFja2V0IGhhbmRsaW5nICAgICAgTUtXCisgKiAgMjktSnVsLTk5ICAgQWRkZWQgRnVsbCBkdXBsZXggc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUtXCisgKiAgMDYtQXVnLTk5ICAgQ2hhbmdlZCBuYW1lcyBmb3IgTWFsIENSIHJlZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUtXCisgKiAgMjMtQXVnLTk5ICAgVHVybmVkIG9mZiBTWUUgd2hlbiBydW5uaW5nIGF0IDEwTWJzICAgICAgICAgICAgICAgICAgICAgICAgTUtXCisgKiAgMjQtQXVnLTk5ICAgTWFya2VkIGRlc2NyaXB0b3IgZW1wdHkgYWZ0ZXIgY2FsbF94bGMgICAgICAgICAgICAgICAgICAgICAgTUtXCisgKiAgMDctU2VwLTk5ICAgU2V0IE1BTCBSWCBidWZmZXIgc2l6ZSByZWcgdG8gRU5FVF9NQVhfTVRVX0FMSUdORUQgLyAxNiAgICAgTUNHCisgKiAgICAgICAgICAgICAgdG8gYXZvaWQgY2hhaW5pbmcgbWF4aW11bSBzaXplZCBwYWNrZXRzLiBQdXNoIHN0YXJ0aW5nCisgKiAgICAgICAgICAgICAgUlggZGVzY3JpcHRvciBhZGRyZXNzIHVwIHRvIHRoZSBuZXh0IGNhY2hlIGxpbmUgYm91bmRhcnkuCisgKiAgMTYtSmFuLTAwICAgQWRkZWQgc3VwcG9ydCBmb3IgYm9vdGluZyB3aXRoIElQIG9mIDB4MCAgICAgICAgICAgICAgICAgICAgTUtXCisgKiAgMTUtTWFyLTAwICAgVXBkYXRlZCBlbmV0SW5pdCgpIHRvIGVuYWJsZSBicm9hZGNhc3QgYWRkcmVzc2VzIGluIHRoZQorICoJICAgICAgICBFTUFDX1JYTSByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKV0IKKyAqICAxMi1NYXItMDEgICBhbm5lLXNvcGhpZS5oYXJub2lzQG5leHRyZWFtLmZyCisgKiAgICAgICAgICAgICAgIC0gVmFyaWFibGVzIGFyZSBjb21wYXRpYmxlIHdpdGggdGhvc2UgYWxyZWFkeSBkZWZpbmVkIGluCisgKiAgICAgICAgICAgICAgICBpbmNsdWRlL25ldC5oCisgKiAgICAgICAgICAgICAgLSBSZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9yIHJpbmcgaXMgdXNlZCB0byBzZW5kIGJ1ZmZlcnMKKyAqICAgICAgICAgICAgICAgIHRvIHRoZSB1c2VyCisgKiAgICAgICAgICAgICAgLSBJbmZvIHByaW50IGFib3V0IHNlbmQvcmVjZWl2ZWQvaGFuZGxlZCBwYWNrZXQgbnVtYmVyIGlmCisgKiAgICAgICAgICAgICAgICBJTkZPXzQwNV9FTkVUIGlzIHNldAorICogIDE3LUFwci0wMSAgIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKiAgICAgICAgICAgICAgLSBNQUwgcmVzZXQgaW4gImV0aF9oYWx0IiBpbmNsdWRlZAorICogICAgICAgICAgICAgIC0gRW5ldCBzcGVlZCBhbmQgZHVwbGV4IG91dHB1dCBub3cgaW4gb25lIGxpbmUKKyAqICAwOC1NYXktMDEgICBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICogICAgICAgICAgICAgIC0gTUFMIGVycm9yIGhhbmRsaW5nIGFkZGVkIChldGhfaW5pdCBjYWxsZWQgYWdhaW4pCisgKiAgMTMtTm92LTAxICAgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KKyAqICAgICAgICAgICAgICAtIFNldCBJU1QgYml0IGluIEVNQUNfTTEgcmVnIHVwb24gMTAwTUJpdCBvciBmdWxsIGR1cGxleAorICogIDA0LUphbi0wMiAgIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKiAgICAgICAgICAgICAgLSBXYWl0IGZvciBQSFkgYXV0byBuZWdvdGlhdGlvbiB0byBjb21wbGV0ZSBhZGRlZAorICogIDA2LUZlYi0wMiAgIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKiAgICAgICAgICAgICAgLSBCdWcgZml4ZWQgaW4gd2FpdGluZyBmb3IgYXV0byBuZWdvdGlhdGlvbiB0byBjb21wbGV0ZQorICogIDI2LUZlYi0wMiAgIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKiAgICAgICAgICAgICAgLSByeCBhbmQgdHggYnVmZmVyIGRlc2NyaXB0b3JzIG5vdyBhbGxvY2F0ZWQgKG5vIGZpeGVkIGFkZHJlc3MKKyAqICAgICAgICAgICAgICAgIHVzZWQgYW55bW9yZSkKKyAqICAxNy1KdW4tMDIgICBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICogICAgICAgICAgICAgIC0gTUFMIGVycm9yIGRlYnVnIHByaW50ZiAnTScgcmVtb3ZlZCAocnggZGUgaW50ZXJydXB0IG1heQorICogICAgICAgICAgICAgICAgb2NjdXIgdXBvbiBtYW55IGluY29taW5nIHBhY2tldHMgd2l0aCBvbmx5IDQgcnggYnVmZmVycykuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxwcGM0eHguaD4KKyNpbmNsdWRlIDxjb21tcHJvYy5oPgorI2luY2x1ZGUgPDQwNWdwX2VuZXQuaD4KKyNpbmNsdWRlIDw0MDVfbWFsLmg+CisjaW5jbHVkZSA8bWlpcGh5Lmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSAidmVjbnVtLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR180MDVHUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwKQorCisjZGVmaW5lIEVNQUNfUkVTRVRfVElNRU9VVCAxMDAwCS8qIDEwMDAgbXMgcmVzZXQgdGltZW91dCAqLworI2RlZmluZSBQSFlfQVVUT05FR09USUFURV9USU1FT1VUIDIwMDAJLyogMjAwMCBtcyBhdXRvbmVnb3RpYXRlIHRpbWVvdXQgKi8KKworI2RlZmluZSBOVU1fVFhfQlVGRiAxCisvKiBBUy5IQVJOT0lTCisgKiBVc2UgUEtUQlVGU1JYIChpbmNsdWRlL25ldC5oKSBpbnN0ZWFkIG9mIHNldHRpbmcgTlVNX1JYX0JVRkYgYWdhaW4KKyAqIFRoZXNlIGJvdGggdmFyaWFibGVzIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgc2FtZSB0aGluZyEKKyAqICNkZWZpbmUgTlVNX1JYX0JVRkYgNAorICovCisjZGVmaW5lIE5VTV9SWF9CVUZGIFBLVEJVRlNSWAorCisvKiBFdGhlcm5ldCBUcmFuc21pdCBhbmQgUmVjZWl2ZSBCdWZmZXJzICovCisvKiBBUy5IQVJOT0lTCisgKiBJbiB0aGUgc2FtZSB3YXkgRU5FVF9NQVhfTVRVIGFuZCBFTkVUX01BWF9NVFVfQUxJR05FRCBhcmUgc2V0IGZyb20KKyAqIFBLVFNJWkUgYW5kIFBLVFNJWkVfQUxJR04gKGluY2x1ZGUvbmV0LmgpCisgKi8KKyNkZWZpbmUgRU5FVF9NQVhfTVRVICAgICAgICAgICBQS1RTSVpFCisjZGVmaW5lIEVORVRfTUFYX01UVV9BTElHTkVEICAgUEtUU0laRV9BTElHTgorCitzdGF0aWMgY2hhciAqdHhidWZfcHRyOworCisvKiBkZWZpbmUgdGhlIG51bWJlciBvZiBjaGFubmVscyBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBFTUFDX1JYQ0hMICAgICAgMQorI2RlZmluZSBFTUFDX1RYQ0hMICAgICAgMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogRGVmaW5lcyBmb3IgTUFML0VNQUMgaW50ZXJydXB0IGNvbmRpdGlvbnMgYXMgcmVwb3J0ZWQgaW4gdGhlIFVJQyAoVW5pdmVyc2FsCisgKiBJbnRlcnJ1cHQgQ29udHJvbGxlcikuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgTUFMX1VJQ19FUlIgKCBVSUNfTUFMX1NFUlIgfCBVSUNfTUFMX1RYREUgIHwgVUlDX01BTF9SWERFKQorI2RlZmluZSBNQUxfVUlDX0RFRiAgKFVJQ19NQUxfUlhFT0IgfCBNQUxfVUlDX0VSUikKKyNkZWZpbmUgRU1BQ19VSUNfREVGIFVJQ19FTkVUCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBHbG9iYWwgdmFyaWFibGVzLiBUWCBhbmQgUlggZGVzY3JpcHRvcnMgYW5kIGJ1ZmZlcnMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2xhdGlsZSBtYWxfZGVzY190ICp0eDsKK3N0YXRpYyB2b2xhdGlsZSBtYWxfZGVzY190ICpyeDsKK3N0YXRpYyBtYWxfZGVzY190ICphbGxvY190eF9idWYgPSBOVUxMOworc3RhdGljIG1hbF9kZXNjX3QgKmFsbG9jX3J4X2J1ZiA9IE5VTEw7CisKKy8qIElFUiBnbG9iYWxzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlbWFjX2llcjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1hbF9pZXI7CisKKworLyogU3RhdGlzdGljIEFyZWFzICovCisjZGVmaW5lIE1BWF9FUlJfTE9HIDEwCitzdHJ1Y3QgZW1hY19zdGF0cyB7CisJaW50IGRhdGFfbGVuX2VycjsKKwlpbnQgcnhfZnJhbWVzOworCWludCByeDsKKwlpbnQgcnhfcHJvdF9lcnI7Cit9OworCitzdGF0aWMgc3RydWN0IHN0YXRzIHsJCQkvKiBTdGF0aXN0aWMgQmxvY2sgKi8KKwlzdHJ1Y3QgZW1hY19zdGF0cyBlbWFjOworCWludCBpbnRfZXJyOworCXNob3J0IHR4X2Vycl9sb2dbTUFYX0VSUl9MT0ddOworCXNob3J0IHJ4X2Vycl9sb2dbTUFYX0VSUl9MT0ddOworfSBzdGF0czsKKworc3RhdGljIGludCBmaXJzdF9pbml0ID0gMDsKKworc3RhdGljIGludCB0eF9lcnJfaW5kZXggPSAwOwkvKiBUcmFuc21pdCBFcnJvciBJbmRleCBmb3IgdHhfZXJyX2xvZyAqLworc3RhdGljIGludCByeF9lcnJfaW5kZXggPSAwOwkvKiBSZWNlaXZlIEVycm9yIEluZGV4IGZvciByeF9lcnJfbG9nICovCisKK3N0YXRpYyBpbnQgcnhfc2xvdCA9IDA7CQkJLyogTUFMIFJlY2VpdmUgU2xvdCAqLworc3RhdGljIGludCByeF9pX2luZGV4ID0gMDsJCS8qIFJlY2VpdmUgSW50ZXJydXB0IFF1ZXVlIEluZGV4ICovCitzdGF0aWMgaW50IHJ4X3VfaW5kZXggPSAwOwkJLyogUmVjZWl2ZSBVc2VyIFF1ZXVlIEluZGV4ICovCitzdGF0aWMgaW50IHJ4X3JlYWR5W05VTV9SWF9CVUZGXTsJLyogUmVjZWl2ZSBSZWFkeSBRdWV1ZSAqLworCitzdGF0aWMgaW50IHR4X3Nsb3QgPSAwOwkJCS8qIE1BTCBUcmFuc21pdCBTbG90ICovCitzdGF0aWMgaW50IHR4X2lfaW5kZXggPSAwOwkJLyogVHJhbnNtaXQgSW50ZXJydXB0IFF1ZXVlIEluZGV4ICovCitzdGF0aWMgaW50IHR4X3VfaW5kZXggPSAwOwkJLyogVHJhbnNtaXQgVXNlciBRdWV1ZSBJbmRleCAqLworc3RhdGljIGludCB0eF9ydW5bTlVNX1RYX0JVRkZdOwkvKiBUcmFuc21pdCBSdW5uaW5nIFF1ZXVlICovCisKKyN1bmRlZiBJTkZPXzQwNV9FTkVUIDEKKyNpZmRlZiBJTkZPXzQwNV9FTkVUCitzdGF0aWMgaW50IHBhY2tldFNlbnQgPSAwOworc3RhdGljIGludCBwYWNrZXRSZWNlaXZlZCA9IDA7CitzdGF0aWMgaW50IHBhY2tldEhhbmRsZWQgPSAwOworI2VuZGlmCisKK3N0YXRpYyBjaGFyIGVtYWNfaHdkX2FkZHJbRU5FVF9BRERSX0xFTkdUSF07CisKK3N0YXRpYyBiZF90ICpiaXNfc2F2ZSA9IE5VTEw7CS8qIGZvciBldGhfaW5pdCB1cG9uIG1hbCBlcnJvciAqLworCitzdGF0aWMgaW50IGlzX3JlY2VpdmluZyA9IDA7CS8qIHN5bmMgd2l0aCBldGggaW50ZXJydXB0ICovCitzdGF0aWMgaW50IHByaW50X3NwZWVkID0gMTsJLyogcHJpbnQgc3BlZWQgbWVzc2FnZSB1cG9uIHN0YXJ0ICovCisKK3N0YXRpYyB2b2lkIGVuZXRfcmN2ICh1bnNpZ25lZCBsb25nIG1hbGlzcik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBQcm90b3R5cGVzIGFuZCBleHRlcm5hbHMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgbWFsX2VyciAodW5zaWduZWQgbG9uZyBpc3IsIHVuc2lnbmVkIGxvbmcgdWljLCB1bnNpZ25lZCBsb25nIG1hbF9kZWYsCisJICAgICAgdW5zaWduZWQgbG9uZyBtYWxfZXJycik7Cit2b2lkIGVtYWNfZXJyICh1bnNpZ25lZCBsb25nIGlzcik7CisKKwordm9pZCBldGhfaGFsdCAodm9pZCkKK3sKKwltdGRjciAobWFsaWVyLCAweDAwMDAwMDAwKTsJLyogZGlzYWJsZSBtYWwgaW50ZXJydXB0cyAqLworCW91dDMyIChFTUFDX0lFUiwgMHgwMDAwMDAwMCk7CS8qIGRpc2FibGUgZW1hYyBpbnRlcnJ1cHRzICovCisKKwkvKiAxc3QgcmVzZXQgTUFMICovCisJbXRkY3IgKG1hbG1jciwgTUFMX0NSX01NU1IpOworCisJLyogd2FpdCBmb3IgcmVzZXQgKi8KKwl3aGlsZSAobWZkY3IgKG1hbG1jcikgJiBNQUxfQ1JfTU1TUikgeworCX07CisKKwkvKiBFTUFDIFJFU0VUICovCisJb3V0MzIgKEVNQUNfTTAsIEVNQUNfTTBfU1JTVCk7CisKKwlwcmludF9zcGVlZCA9IDE7CQkvKiBwcmludCBzcGVlZCBtZXNzYWdlIGFnYWluIG5leHQgdGltZSAqLworfQorCisKK2ludCBldGhfaW5pdCAoYmRfdCAqIGJpcykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHJlZzsKKwl1bnNpZ25lZCBsb25nIG1zcjsKKwl1bnNpZ25lZCBsb25nIHNwZWVkOworCXVuc2lnbmVkIGxvbmcgZHVwbGV4OworCXVuc2lnbmVkIG1vZGVfcmVnOworCXVuc2lnbmVkIHNob3J0IHJlZ19zaG9ydDsKKworCW1zciA9IG1mbXNyICgpOworCW10bXNyIChtc3IgJiB+KE1TUl9FRSkpOwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKworI2lmZGVmIElORk9fNDA1X0VORVQKKwkvKiBBUy5IQVJOT0lTCisJICogV2Ugc2hvdWxkIGhhdmUgOgorCSAqIHBhY2tldEhhbmRsZWQgPD0gIHBhY2tldFJlY2VpdmVkIDw9IHBhY2tldEhhbmRsZWQrUEtUQlVGU1JYCisgICAgICAgICAqIEluIHRoZSBtb3N0IGNhc2VzIHBhY2tldEhhbmRsZWQgPSBwYWNrZXRSZWNlaXZlZCwgYnV0IGl0CisgICAgICAgICAqIGlzIHBvc3NpYmxlIHRoYXQgbmV3IHBhY2tldHMgKHdpdGhvdXQgcmVsYXRpb25zaGlwIHdpdGgKKyAgICAgICAgICogY3VycmVudCB0cmFuc2ZlcikgaGF2ZSBnb3QgdGhlIHRpbWUgdG8gYXJyaXZlZCBiZWZvcmUKKyAgICAgICAgICogbmV0bG9vcCBjYWxscyBldGhfaGFsdAorCSAqLworCXByaW50ZiAoIkFib3V0IHByZWNlZWRpbmcgdHJhbnNmZXI6XG4iCisJCSItIFNlbnQgcGFja2V0IG51bWJlciAlZFxuIgorCQkiLSBSZWNlaXZlZCBwYWNrZXQgbnVtYmVyICVkXG4iCisJCSItIEhhbmRsZWQgcGFja2V0IG51bWJlciAlZFxuIiwKKwkJcGFja2V0U2VudCwgcGFja2V0UmVjZWl2ZWQsIHBhY2tldEhhbmRsZWQpOworCXBhY2tldFNlbnQgPSAwOworCXBhY2tldFJlY2VpdmVkID0gMDsKKwlwYWNrZXRIYW5kbGVkID0gMDsKKyNlbmRpZgorCisJLyogTUFMIFJFU0VUICovCisJbXRkY3IgKG1hbG1jciwgTUFMX0NSX01NU1IpOworCS8qIHdhaXQgZm9yIHJlc2V0ICovCisJd2hpbGUgKG1mZGNyIChtYWxtY3IpICYgTUFMX0NSX01NU1IpIHsKKwl9OworCisJdHhfZXJyX2luZGV4ID0gMDsJCS8qIFRyYW5zbWl0IEVycm9yIEluZGV4IGZvciB0eF9lcnJfbG9nICovCisJcnhfZXJyX2luZGV4ID0gMDsJCS8qIFJlY2VpdmUgRXJyb3IgSW5kZXggZm9yIHJ4X2Vycl9sb2cgKi8KKworCXJ4X3Nsb3QgPSAwOwkJCS8qIE1BTCBSZWNlaXZlIFNsb3QgKi8KKwlyeF9pX2luZGV4ID0gMDsJCQkvKiBSZWNlaXZlIEludGVycnVwdCBRdWV1ZSBJbmRleCAqLworCXJ4X3VfaW5kZXggPSAwOwkJCS8qIFJlY2VpdmUgVXNlciBRdWV1ZSBJbmRleCAqLworCisJdHhfc2xvdCA9IDA7CQkJLyogTUFMIFRyYW5zbWl0IFNsb3QgKi8KKwl0eF9pX2luZGV4ID0gMDsJCQkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgUXVldWUgSW5kZXggKi8KKwl0eF91X2luZGV4ID0gMDsJCQkvKiBUcmFuc21pdCBVc2VyIFF1ZXVlIEluZGV4ICovCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisgICAgICAgIC8qIHNldCBSTUlJIG1vZGUgKi8KKyAgICAgICAgb3V0MzIgKFpNSUlfRkVSLCBaTUlJX1JNSUkgfCBaTUlJX01ESTApOworI2VuZGlmIC8qIENPTkZJR180NDAgKi8KKworCS8qIEVNQUMgUkVTRVQgKi8KKwlvdXQzMiAoRU1BQ19NMCwgRU1BQ19NMF9TUlNUKTsKKworCS8qIHdhaXQgZm9yIFBIWSB0byBjb21wbGV0ZSBhdXRvIG5lZ290aWF0aW9uICovCisJcmVnX3Nob3J0ID0gMDsKKyNpZm5kZWYgQ09ORklHX0NTODk1Ml9QSFkKKwltaWlwaHlfcmVhZCAoQ09ORklHX1BIWV9BRERSLCBQSFlfQk1TUiwgJnJlZ19zaG9ydCk7CisKKwkvKgorCSAqIFdhaXQgaWYgUEhZIGlzIGFibGUgb2YgYXV0b25lZ290aWF0aW9uIGFuZCBhdXRvbmVnb3RpYXRpb24gaXMgbm90IGNvbXBsZXRlCisJICovCisJaWYgKChyZWdfc2hvcnQgJiBQSFlfQk1TUl9BVVROX0FCTEUpCisJICAgICYmICEocmVnX3Nob3J0ICYgUEhZX0JNU1JfQVVUTl9DT01QKSkgeworCQlwdXRzICgiV2FpdGluZyBmb3IgUEhZIGF1dG8gbmVnb3RpYXRpb24gdG8gY29tcGxldGUiKTsKKwkJaSA9IDA7CisJCXdoaWxlICghKHJlZ19zaG9ydCAmIFBIWV9CTVNSX0FVVE5fQ09NUCkpIHsKKwkJCWlmICgoaSsrICUgMTAwKSA9PSAwKQorCQkJCXB1dGMgKCcuJyk7CisJCQl1ZGVsYXkgKDEwMDAwKTsJCS8qIDEwIG1zICovCisJCQltaWlwaHlfcmVhZCAoQ09ORklHX1BIWV9BRERSLCBQSFlfQk1TUiwgJnJlZ19zaG9ydCk7CisKKwkJCS8qCisJCQkgKiBUaW1lb3V0IHJlYWNoZWQgPworCQkJICovCisJCQlpZiAoaSAqIDEwID4gUEhZX0FVVE9ORUdPVElBVEVfVElNRU9VVCkgeworCQkJCXB1dHMgKCIgVElNRU9VVCAhXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwdXRzICgiIGRvbmVcbiIpOworCQl1ZGVsYXkgKDUwMDAwMCk7CS8qIGFub3RoZXIgNTAwIG1zIChyZXN1bHRzIGluIGZhc3RlciBib290aW5nKSAqLworCX0KKyNlbmRpZgorCXNwZWVkID0gbWlpcGh5X3NwZWVkIChDT05GSUdfUEhZX0FERFIpOworCWR1cGxleCA9IG1paXBoeV9kdXBsZXggKENPTkZJR19QSFlfQUREUik7CisJaWYgKHByaW50X3NwZWVkKSB7CisJCXByaW50X3NwZWVkID0gMDsKKwkJcHJpbnRmICgiRU5FVCBTcGVlZCBpcyAlZCBNYnBzIC0gJXMgZHVwbGV4IGNvbm5lY3Rpb25cbiIsCisJCQkoaW50KSBzcGVlZCwgKGR1cGxleCA9PSBIQUxGKSA/ICJIQUxGIiA6ICJGVUxMIik7CisJfQorCisJLyogc2V0IHRoZSBNYWwgY29uZmlndXJhdGlvbiByZWcgKi8KKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisJLyogRXJyYXRhIDEuMTI6IE1BTF8xIC0tIERpc2FibGUgTUFMIGJ1cnN0aW5nICovCisJaWYoIGdldF9wdnIoKSA9PSBQVlJfNDQwR1BfUkIgKQorCSAgICBtdGRjciAobWFsbWNyLCBNQUxfQ1JfT1BCQkwgfCBNQUxfQ1JfTEVBIHwgTUFMX0NSX1BMQkxUX0RFRkFVTFQpOworCWVsc2UKKyNlbHNlCisJbXRkY3IgKG1hbG1jciwgTUFMX0NSX1BMQkIgfCBNQUxfQ1JfT1BCQkwgfCBNQUxfQ1JfTEVBIHwgTUFMX0NSX1BMQkxUX0RFRkFVTFQpOworI2VuZGlmCisKKwkvKiBGcmVlICJvbGQiIGJ1ZmZlcnMgKi8KKwlpZiAoYWxsb2NfdHhfYnVmKSBmcmVlKGFsbG9jX3R4X2J1Zik7CisJaWYgKGFsbG9jX3J4X2J1ZikgZnJlZShhbGxvY19yeF9idWYpOworCisJLyoKKwkgKiBNYWxsb2MgTUFMIGJ1ZmZlciBkZXNjaXB0b3JzLCBtYWtlIHN1cmUgdGhleSBhcmUKKwkgKiBhbGlnbmVkIG9uIGNhY2hlIGxpbmUgYm91bmRhcnkgc2l6ZQorCSAqICg0MDEvNDAzL0lPUDQ4MCA9IDE2LCA0MDUgPSAzMikKKwkgKiBhbmQgZG9lc24ndCBjcm9zcyBjYWNoZSBibG9jayBib3VuZGFyaWVzLgorCSAqLworCWFsbG9jX3R4X2J1ZiA9IChtYWxfZGVzY190ICopbWFsbG9jKChzaXplb2YobWFsX2Rlc2NfdCkgKiBOVU1fVFhfQlVGRikgKworCQkJCQkgICAgKCgyICogQ0ZHX0NBQ0hFTElORV9TSVpFKSAtIDIpKTsKKwlpZiAoKChpbnQpYWxsb2NfdHhfYnVmICYgQ0FDSEVMSU5FX01BU0spICE9IDApIHsKKwkJdHggPSAobWFsX2Rlc2NfdCAqKSgoaW50KWFsbG9jX3R4X2J1ZiArIENGR19DQUNIRUxJTkVfU0laRSAtCisJCQkJICAgICgoaW50KWFsbG9jX3R4X2J1ZiAmIENBQ0hFTElORV9NQVNLKSk7CisJfSBlbHNlIHsKKwkJdHggPSBhbGxvY190eF9idWY7CisJfQorCisJYWxsb2NfcnhfYnVmID0gKG1hbF9kZXNjX3QgKiltYWxsb2MoKHNpemVvZihtYWxfZGVzY190KSAqIE5VTV9SWF9CVUZGKSArCisJCQkJCSAgICAoKDIgKiBDRkdfQ0FDSEVMSU5FX1NJWkUpIC0gMikpOworCWlmICgoKGludClhbGxvY19yeF9idWYgJiBDQUNIRUxJTkVfTUFTSykgIT0gMCkgeworCQlyeCA9IChtYWxfZGVzY190ICopKChpbnQpYWxsb2NfcnhfYnVmICsgQ0ZHX0NBQ0hFTElORV9TSVpFIC0KKwkJCQkgICAgKChpbnQpYWxsb2NfcnhfYnVmICYgQ0FDSEVMSU5FX01BU0spKTsKKwl9IGVsc2UgeworCQlyeCA9IGFsbG9jX3J4X2J1ZjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0JVRkY7IGkrKykgeworCQl0eFtpXS5jdHJsID0gMDsKKwkJdHhbaV0uZGF0YV9sZW4gPSAwOworCQlpZiAoZmlyc3RfaW5pdCA9PSAwKQorCQkJdHhidWZfcHRyID0gKGNoYXIgKikgbWFsbG9jIChFTkVUX01BWF9NVFVfQUxJR05FRCk7CisJCXR4W2ldLmRhdGFfcHRyID0gdHhidWZfcHRyOworCQlpZiAoKE5VTV9UWF9CVUZGIC0gMSkgPT0gaSkKKwkJCXR4W2ldLmN0cmwgfD0gTUFMX1RYX0NUUkxfV1JBUDsKKwkJdHhfcnVuW2ldID0gLTE7CisjaWYgMAorCQlwcmludGYgKCJUWF9CVUZGICVkIEAgMHglMDhseFxuIiwgaSwgKHVsb25nKSB0eFtpXS5kYXRhX3B0cik7CisjZW5kaWYKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0JVRkY7IGkrKykgeworCQlyeFtpXS5jdHJsID0gMDsKKwkJcnhbaV0uZGF0YV9sZW4gPSAwOworCQkvKiAgICAgICByeFtpXS5kYXRhX3B0ciA9IChjaGFyICopICZyeF9idWZmW2ldOyAqLworCQlyeFtpXS5kYXRhX3B0ciA9IChjaGFyICopIE5ldFJ4UGFja2V0c1tpXTsKKwkJaWYgKChOVU1fUlhfQlVGRiAtIDEpID09IGkpCisJCQlyeFtpXS5jdHJsIHw9IE1BTF9SWF9DVFJMX1dSQVA7CisJCXJ4W2ldLmN0cmwgfD0gTUFMX1JYX0NUUkxfRU1QVFkgfCBNQUxfUlhfQ1RSTF9JTlRSOworCQlyeF9yZWFkeVtpXSA9IC0xOworI2lmIDAKKwkJcHJpbnRmICgiUlhfQlVGRiAlZCBAIDB4JTA4bHhcbiIsIGksICh1bG9uZykgcnhbaV0uZGF0YV9wdHIpOworI2VuZGlmCisJfQorCisJbWVtY3B5IChlbWFjX2h3ZF9hZGRyLCBiaXMtPmJpX2VuZXRhZGRyLCBFTkVUX0FERFJfTEVOR1RIKTsKKworCXJlZyA9IDB4MDAwMDAwMDA7CisKKwlyZWcgfD0gZW1hY19od2RfYWRkclswXTsJLyogc2V0IGhpZ2ggYWRkcmVzcyAqLworCXJlZyA9IHJlZyA8PCA4OworCXJlZyB8PSBlbWFjX2h3ZF9hZGRyWzFdOworCisJb3V0MzIgKEVNQUNfSUFILCByZWcpOworCisJcmVnID0gMHgwMDAwMDAwMDsKKwlyZWcgfD0gZW1hY19od2RfYWRkclsyXTsJLyogc2V0IGxvdyBhZGRyZXNzICAqLworCXJlZyA9IHJlZyA8PCA4OworCXJlZyB8PSBlbWFjX2h3ZF9hZGRyWzNdOworCXJlZyA9IHJlZyA8PCA4OworCXJlZyB8PSBlbWFjX2h3ZF9hZGRyWzRdOworCXJlZyA9IHJlZyA8PCA4OworCXJlZyB8PSBlbWFjX2h3ZF9hZGRyWzVdOworCisJb3V0MzIgKEVNQUNfSUFMLCByZWcpOworCisJLyogc2V0dXAgTUFMIHR4ICYgcnggY2hhbm5lbCBwb2ludGVycyAqLworCW10ZGNyIChtYWx0eGN0cDByLCB0eCk7CisJbXRkY3IgKG1hbHJ4Y3RwMHIsIHJ4KTsKKworCS8qIFJlc2V0IHRyYW5zbWl0IGFuZCByZWNlaXZlIGNoYW5uZWxzICovCisJbXRkY3IgKG1hbHJ4Y2FyciwgMHg4MDAwMDAwMCk7CS8qIDIgY2hhbm5lbHMgKi8KKwltdGRjciAobWFsdHhjYXJyLCAweDgwMDAwMDAwKTsJLyogMiBjaGFubmVscyAqLworCisJLyogRW5hYmxlIE1BTCB0cmFuc21pdCBhbmQgcmVjZWl2ZSBjaGFubmVscyAqLworCW10ZGNyIChtYWx0eGNhc3IsIDB4ODAwMDAwMDApOwkvKiAxIGNoYW5uZWwgKi8KKwltdGRjciAobWFscnhjYXNyLCAweDgwMDAwMDAwKTsJLyogMSBjaGFubmVsICovCisKKwkvKiBzZXQgUlggYnVmZmVyIHNpemUgKi8KKwltdGRjciAobWFscmNiczAsIEVORVRfTUFYX01UVV9BTElHTkVEIC8gMTYpOworCisJLyogc2V0IHRyYW5zbWl0IGVuYWJsZSAmIHJlY2VpdmUgZW5hYmxlICovCisJb3V0MzIgKEVNQUNfTTAsIEVNQUNfTTBfVFhFIHwgRU1BQ19NMF9SWEUpOworCisJLyogc2V0IHJlY2VpdmUgZmlmbyB0byA0ayBhbmQgdHggZmlmbyB0byAyayAqLworCW1vZGVfcmVnID0gRU1BQ19NMV9SRlNfNEsgfCBFTUFDX00xX1RYX0ZJRk9fMks7CisKKwkvKiBzZXQgc3BlZWQgKi8KKwlpZiAoc3BlZWQgPT0gXzEwMEJBU0VUKQorCQltb2RlX3JlZyA9IG1vZGVfcmVnIHwgRU1BQ19NMV9NRl8xMDBNQlBTIHwgRU1BQ19NMV9JU1Q7CisJZWxzZQorCQltb2RlX3JlZyA9IG1vZGVfcmVnICYgfjB4MDBDMDAwMDA7CS8qIDEwIE1CUFMgKi8KKwlpZiAoZHVwbGV4ID09IEZVTEwpCisJCW1vZGVfcmVnID0gbW9kZV9yZWcgfCAweDgwMDAwMDAwIHwgRU1BQ19NMV9JU1Q7CisKKwlvdXQzMiAoRU1BQ19NMSwgbW9kZV9yZWcpOworCisJLyogRW5hYmxlIGJyb2FkY2FzdCBhbmQgaW5kdmlkdWFsIGFkZHJlc3MgKi8KKwlvdXQzMiAoRU1BQ19SWE0sIEVNQUNfUk1SX0JBRSB8IEVNQUNfUk1SX0lBRQorCSAgICAgICAvKnwgRU1BQ19STVJfQVJSUHwgRU1BQ19STVJfU0ZDUyB8IEVNQUNfUk1SX1NQICovICk7CisKKwkvKiB3ZSBwcm9iYWJseSBuZWVkIHRvIHNldCB0aGUgdHggbW9kZTEgcmVnPyBtYXliZSBhdCB0eCB0aW1lICovCisKKwkvKiBzZXQgdHJhbnNtaXQgcmVxdWVzdCB0aHJlc2hvbGQgcmVnaXN0ZXIgKi8KKwlvdXQzMiAoRU1BQ19UUlRSLCAweDE4MDAwMDAwKTsJLyogMjU2IGJ5dGUgdGhyZXNob2xkICovCisKKwkvKiBzZXQgcmVjZWl2ZSAgbG93L2hpZ2ggd2F0ZXIgbWFyayByZWdpc3RlciAqLworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKwkvKiA0NDBHUCBoYXMgYSA2NCBieXRlIGJ1cnN0IGxlbmd0aCAqLworICAgICAgICBvdXQzMiAoRU1BQ19SWF9ISV9MT19XTUFSSywgMHg4MDAwOTAwMCk7CisgICAgICAgIG91dDMyIChFTUFDX1RYTTEsICAgICAgICAgICAweGY4NjQwMDAwKTsKKyNlbHNlIC8qIENPTkZJR180NDAgKi8KKwkvKiA0MDVzIGhhdmUgYSAxNiBieXRlIGJ1cnN0IGxlbmd0aCAqLworCW91dDMyIChFTUFDX1JYX0hJX0xPX1dNQVJLLCAweDBmMDAyMDAwKTsKKyNlbmRpZiAvKiBDT05GSUdfNDQwICovCisKKwkvKiBGcmFtZSBnYXAgc2V0ICovCisJb3V0MzIgKEVNQUNfSV9GUkFNRV9HQVBfUkVHLCAweDAwMDAwMDA4KTsKKworCWlmIChmaXJzdF9pbml0ID09IDApIHsKKwkJLyoKKwkJICogQ29ubmVjdCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lcworCQkgKi8KKwkJaXJxX2luc3RhbGxfaGFuZGxlciAoVkVDTlVNX0VXVTAsIChpbnRlcnJ1cHRfaGFuZGxlcl90ICopIGVuZXRJbnQsIE5VTEwpOworCQlpcnFfaW5zdGFsbF9oYW5kbGVyIChWRUNOVU1fTVMsIChpbnRlcnJ1cHRfaGFuZGxlcl90ICopIGVuZXRJbnQsIE5VTEwpOworCQlpcnFfaW5zdGFsbF9oYW5kbGVyIChWRUNOVU1fTVRFLCAoaW50ZXJydXB0X2hhbmRsZXJfdCAqKSBlbmV0SW50LCBOVUxMKTsKKwkJaXJxX2luc3RhbGxfaGFuZGxlciAoVkVDTlVNX01SRSwgKGludGVycnVwdF9oYW5kbGVyX3QgKikgZW5ldEludCwgTlVMTCk7CisJCWlycV9pbnN0YWxsX2hhbmRsZXIgKFZFQ05VTV9UWERFLCAoaW50ZXJydXB0X2hhbmRsZXJfdCAqKSBlbmV0SW50LCBOVUxMKTsKKwkJaXJxX2luc3RhbGxfaGFuZGxlciAoVkVDTlVNX1JYREUsIChpbnRlcnJ1cHRfaGFuZGxlcl90ICopIGVuZXRJbnQsIE5VTEwpOworCQlpcnFfaW5zdGFsbF9oYW5kbGVyIChWRUNOVU1fRVRIMCwgKGludGVycnVwdF9oYW5kbGVyX3QgKikgZW5ldEludCwgTlVMTCk7CisJfQorCisJLyogc2V0IHVwIGludGVycnVwdCBoYW5kbGVyICovCisJLyogc2V0dXAgaW50ZXJydXB0IGNvbnRyb2xlciB0byB0YWtlIGludGVycnVwdHMgZnJvbSB0aGUgTUFMICYKKwkgICBFTUFDICovCisJbXRkY3IgKHVpY3NyLCAweGZmZmZmZmZmKTsJLyogY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJbXRkY3IgKHVpY2VyLCBtZmRjciAodWljZXIpIHwgTUFMX1VJQ19ERUYgfCBFTUFDX1VJQ19ERUYpOworCisJLyogc2V0IHRoZSBNQUwgSUVSID8/PyBuYW1lcyBtYXkgY2hhbmdlIHdpdGggbmV3IHNwZWMgPz8/ICovCisJbWFsX2llciA9IE1BTF9JRVJfREUgfCBNQUxfSUVSX05FIHwgTUFMX0lFUl9URSB8IE1BTF9JRVJfT1BCRSB8CisJCU1BTF9JRVJfUExCRTsKKwltdGRjciAobWFsZXNyLCAweGZmZmZmZmZmKTsJLyogY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJbXRkY3IgKG1hbHR4ZGVpciwgMHhmZmZmZmZmZik7CS8qIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCW10ZGNyIChtYWxyeGRlaXIsIDB4ZmZmZmZmZmYpOwkvKiBjbGVhciBwZW5kaW5nIGludGVycnVwdHMgKi8KKwltdGRjciAobWFsaWVyLCBtYWxfaWVyKTsKKworCS8qIFNldCBFTUFDIElFUiAqLworCWVtYWNfaWVyID0gRU1BQ19JU1JfUFRMRSB8IEVNQUNfSVNSX0JGQ1MgfAorCQlFTUFDX0lTUl9QVExFIHwgRU1BQ19JU1JfT1JFICB8IEVNQUNfSVNSX0lSRTsKKwlpZiAoc3BlZWQgPT0gXzEwMEJBU0VUKQorCQllbWFjX2llciA9IGVtYWNfaWVyIHwgRU1BQ19JU1JfU1lFOworCisJb3V0MzIgKEVNQUNfSVNSLCAweGZmZmZmZmZmKTsJLyogY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJb3V0MzIgKEVNQUNfSUVSLCBlbWFjX2llcik7CisKKwltdG1zciAobXNyKTsJCQkJLyogZW5hYmxlIGludGVycnVwdHMgYWdhaW4gKi8KKworCWJpc19zYXZlID0gYmlzOworCWZpcnN0X2luaXQgPSAxOworCisJcmV0dXJuICgwKTsKK30KKworCitpbnQgZXRoX3NlbmQgKHZvbGF0aWxlIHZvaWQgKnB0ciwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZW5ldF9mcmFtZSAqZWZfcHRyOworCXVsb25nIHRpbWVfc3RhcnQsIHRpbWVfbm93OworCXVuc2lnbmVkIGxvbmcgdGVtcF90eG0wOworCisJZWZfcHRyID0gKHN0cnVjdCBlbmV0X2ZyYW1lICopIHB0cjsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogIENvcHkgaW4gb3VyIGFkZHJlc3MgaW50byB0aGUgZnJhbWUuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJKHZvaWQpIG1lbWNweSAoZWZfcHRyLT5zb3VyY2VfYWRkciwgZW1hY19od2RfYWRkciwgRU5FVF9BRERSX0xFTkdUSCk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIElmIGZyYW1lIGlzIHRvbyBsb25nIG9yIHRvbyBzaG9ydCwgbW9kaWZ5IGxlbmd0aC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAobGVuID4gRU5FVF9NQVhfTVRVKQorCQlsZW4gPSBFTkVUX01BWF9NVFU7CisKKwkvKiAgIG1lbWNweSAoKHZvaWQgKikgJnR4X2J1ZmZbdHhfc2xvdF0sIChjb25zdCB2b2lkICopIHB0ciwgbGVuKTsgKi8KKwltZW1jcHkgKCh2b2lkICopIHR4YnVmX3B0ciwgKGNvbnN0IHZvaWQgKikgcHRyLCBsZW4pOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiBzZXQgVFggQnVmZmVyIGJ1c3ksIGFuZCBzZW5kIGl0CisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJdHhbdHhfc2xvdF0uY3RybCA9IChNQUxfVFhfQ1RSTF9MQVNUIHwKKwkJCSAgICBFTUFDX1RYX0NUUkxfR0ZDUyB8IEVNQUNfVFhfQ1RSTF9HUCkgJgorCQl+KEVNQUNfVFhfQ1RSTF9JU0EgfCBFTUFDX1RYX0NUUkxfUlNBKTsKKwlpZiAoKE5VTV9UWF9CVUZGIC0gMSkgPT0gdHhfc2xvdCkKKwkJdHhbdHhfc2xvdF0uY3RybCB8PSBNQUxfVFhfQ1RSTF9XUkFQOworCisJdHhbdHhfc2xvdF0uZGF0YV9sZW4gPSAoc2hvcnQpIGxlbjsKKwl0eFt0eF9zbG90XS5jdHJsIHw9IE1BTF9UWF9DVFJMX1JFQURZOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoImVpZWlvIik7CisJb3V0MzIgKEVNQUNfVFhNMCwgaW4zMiAoRU1BQ19UWE0wKSB8IEVNQUNfVFhNMF9HTlAwKTsKKyNpZmRlZiBJTkZPXzQwNV9FTkVUCisJcGFja2V0U2VudCsrOworI2VuZGlmCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIHBvbGwgdW5pdGwgdGhlIHBhY2tldCBpcyBzZW50IGFuZCB0aGVuIG1ha2Ugc3VyZSBpdCBpcyBPSworCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXRpbWVfc3RhcnQgPSBnZXRfdGltZXIgKDApOworCXdoaWxlICgxKSB7CisJCXRlbXBfdHhtMCA9IGluMzIgKEVNQUNfVFhNMCk7CisJCS8qIGxvb3AgdW50aWwgZWl0aGVyIFRJTlQgdHVybnMgb24gb3IgMyBzZWNvbmRzIGVsYXBzZSAqLworCQlpZiAoKHRlbXBfdHhtMCAmIEVNQUNfVFhNMF9HTlAwKSAhPSAwKSB7CisJCQkvKiB0cmFuc21pdCBpcyBkb25lLCBzbyBub3cgY2hlY2sgZm9yIGVycm9ycworICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgdGhlcmUgaXMgYW4gZXJyb3IsIGFuIGludGVycnVwdCBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGhhcHBlbiB3aGVuIHdlIHJldHVybgorCQkJICovCisJCQl0aW1lX25vdyA9IGdldF90aW1lciAoMCk7CisJCQlpZiAoKHRpbWVfbm93IC0gdGltZV9zdGFydCkgPiAzMDAwKSB7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorfQorCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCBFbmV0SW50LgorfCBFbmV0SW50IGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gIEl0IHdpbGwgZGV0ZXJtaW5lIHRoZQorfCBjYXVzZSBvZiB0aGUgaW50ZXJydXB0IGFuZCBjYWxsIHRoZSBhcHBvcnByaWF0ZSBzZXJ2aXZlCit8IHJvdXRpbmUuCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGVuZXRJbnQgKCkKK3sKKwlpbnQgc2VydmljZWQ7CisJaW50IHJjID0gLTE7CQkJCS8qIGRlZmF1bHQgdG8gbm90IHVzICovCisJdW5zaWduZWQgbG9uZyBtYWxfaXNyOworCXVuc2lnbmVkIGxvbmcgZW1hY19pc3IgPSAwOworCXVuc2lnbmVkIGxvbmcgbWFsX3J4X2VvYjsKKwl1bnNpZ25lZCBsb25nIG15X3VpYzBtc3IsIG15X3VpYzFtc3I7CisKKwkvKiBlbnRlciBsb29wIHRoYXQgc3RheXMgaW4gaW50ZXJydXB0IGNvZGUgdW50aWwgbm90aGluZyB0byBzZXJ2aWNlICovCisJZG8geworCQlzZXJ2aWNlZCA9IDA7CisKKwkJbXlfdWljMG1zciA9IG1mZGNyICh1aWMwbXNyKTsKKwkJbXlfdWljMW1zciA9IG1mZGNyICh1aWMxbXNyKTsKKworCQlpZiAoIShteV91aWMwbXNyICYgVUlDX01SRSkKKyAgICAgICAgICAgICAgICAgICAgJiYgIShteV91aWMxbXNyICYgKFVJQ19FVEgwIHwgVUlDX01TIHwgVUlDX01UREUgfCBVSUNfTVJERSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgZm9yIHVzICovCisJCQlyZXR1cm4gKHJjKTsKKwkJfQorCisJCS8qIGdldCBhbmQgY2xlYXIgY29udHJvbGxlciBzdGF0dXMgaW50ZXJydXB0cyAqLworCQkvKiBsb29rIGF0IE1hbCBhbmQgRU1BQyBpbnRlcnJ1cHRzICovCisJCWlmICgobXlfdWljMG1zciAmIFVJQ19NUkUpCisgICAgICAgICAgICAgICAgICAgIHx8IChteV91aWMxbXNyICYgKFVJQ19NUyB8IFVJQ19NVERFIHwgVUlDX01SREUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgaGF2ZSBhIE1BTCBpbnRlcnJ1cHQgKi8KKwkJCW1hbF9pc3IgPSBtZmRjciAobWFsZXNyKTsKKwkJCS8qIGxvb2sgZm9yIG1hbCBlcnJvciAqLworCQkJaWYgKG15X3VpYzFtc3IgJiAoVUlDX01TIHwgVUlDX01UREUgfCBVSUNfTVJERSkpIHsKKwkJCQltYWxfZXJyIChtYWxfaXNyLCBteV91aWMwbXNyLCBNQUxfVUlDX0RFRiwgTUFMX1VJQ19FUlIpOworCQkJCXNlcnZpY2VkID0gMTsKKwkJCQlyYyA9IDA7CisJCQl9CisJCX0KKwkJaWYgKFVJQ19FVEgwICYgbXlfdWljMW1zcikgewkvKiBsb29rIGZvciBFTUFDIGVycm9ycyAqLworCQkJZW1hY19pc3IgPSBpbjMyIChFTUFDX0lTUik7CisJCQlpZiAoKGVtYWNfaWVyICYgZW1hY19pc3IpICE9IDApIHsKKwkJCQllbWFjX2VyciAoZW1hY19pc3IpOworCQkJCXNlcnZpY2VkID0gMTsKKwkJCQlyYyA9IDA7CisJCQl9CisJCX0KKwkJaWYgKChlbWFjX2llciAmIGVtYWNfaXNyKQorICAgICAgICAgICAgICAgICAgICB8fCAobXlfdWljMW1zciAmIChVSUNfTVMgfCBVSUNfTVRERSB8IFVJQ19NUkRFKSkpIHsKKwkJCW10ZGNyICh1aWMwc3IsIFVJQ19NUkUpOyAvKiBDbGVhciAqLworCQkJbXRkY3IgKHVpYzFzciwgVUlDX0VUSDAgfCBVSUNfTVMgfCBVSUNfTVRERSB8IFVJQ19NUkRFKTsgLyogQ2xlYXIgKi8KKwkJCXJldHVybiAocmMpOwkJLyogd2UgaGFkIGVycm9ycyBzbyBnZXQgb3V0ICovCisJCX0KKworCQkvKiBoYW5kbGUgTUFMIFJYIEVPQiAgaW50ZXJ1cHQgZnJvbSBhIHJlY2VpdmUgKi8KKwkJLyogY2hlY2sgZm9yIEVPQiBvbiB2YWxpZCBjaGFubmVscyAgICAgICAgICAgICovCisJCWlmIChteV91aWMwbXNyICYgVUlDX01SRSkgeworCQkJbWFsX3J4X2VvYiA9IG1mZGNyIChtYWxyeGVvYmlzcik7CisJCQlpZiAoKG1hbF9yeF9lb2IgJiAweDgwMDAwMDAwKSAhPSAwKSB7CS8qIGNhbGwgZW1hYyByb3V0aW5lIGZvciBjaGFubmVsIDAgKi8KKwkJCQkvKiBjbGVhciBFT0IKKwkJCQkgICBtdGRjcihtYWxyeGVvYmlzciwgbWFsX3J4X2VvYik7ICovCisJCQkJZW5ldF9yY3YgKGVtYWNfaXNyKTsKKwkJCQkvKiBpbmRpY2F0ZSB0aGF0IHdlIHNlcnZpY2VkIGFuIGludGVycnVwdCAqLworCQkJCXNlcnZpY2VkID0gMTsKKwkJCQlyYyA9IDA7CisJCQl9CisJCX0KKyAgICAgICAgICAgICAgICBtdGRjciAodWljMHNyLCBVSUNfTVJFKTsgLyogQ2xlYXIgKi8KKyAgICAgICAgICAgICAgICBtdGRjciAodWljMXNyLCBVSUNfRVRIMCB8IFVJQ19NUyB8IFVJQ19NVERFIHwgVUlDX01SREUpOyAvKiBDbGVhciAqLworCX0gd2hpbGUgKHNlcnZpY2VkKTsKKworCXJldHVybiAocmMpOworfQorI2Vsc2UgLyogQ09ORklHXzQ0MCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIEVuZXRJbnQuCisgKiBFbmV0SW50IGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gIEl0IHdpbGwgZGV0ZXJtaW5lIHRoZQorICogY2F1c2Ugb2YgdGhlIGludGVycnVwdCBhbmQgY2FsbCB0aGUgYXBwb3JwcmlhdGUgc2Vydml2ZQorICogcm91dGluZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGVuZXRJbnQgKCkKK3sKKwlpbnQgc2VydmljZWQ7CisJaW50IHJjID0gLTE7CQkJCS8qIGRlZmF1bHQgdG8gbm90IHVzICovCisJdW5zaWduZWQgbG9uZyBtYWxfaXNyOworCXVuc2lnbmVkIGxvbmcgZW1hY19pc3IgPSAwOworCXVuc2lnbmVkIGxvbmcgbWFsX3J4X2VvYjsKKwl1bnNpZ25lZCBsb25nIG15X3VpY21zcjsKKworCS8qIGVudGVyIGxvb3AgdGhhdCBzdGF5cyBpbiBpbnRlcnJ1cHQgY29kZSB1bnRpbCBub3RoaW5nIHRvIHNlcnZpY2UgKi8KKwlkbyB7CisJCXNlcnZpY2VkID0gMDsKKworCQlteV91aWNtc3IgPSBtZmRjciAodWljbXNyKTsKKwkJaWYgKChteV91aWNtc3IgJiAoTUFMX1VJQ19ERUYgfCBFTUFDX1VJQ19ERUYpKSA9PSAwKSB7CS8qIG5vdCBmb3IgdXMgKi8KKwkJCXJldHVybiAocmMpOworCQl9CisKKworCQkvKiBnZXQgYW5kIGNsZWFyIGNvbnRyb2xsZXIgc3RhdHVzIGludGVycnVwdHMgKi8KKwkJLyogbG9vayBhdCBNYWwgYW5kIEVNQUMgaW50ZXJydXB0cyAqLworCQlpZiAoKE1BTF9VSUNfREVGICYgbXlfdWljbXNyKSAhPSAwKSB7CS8qIHdlIGhhdmUgYSBNQUwgaW50ZXJydXB0ICovCisJCQltYWxfaXNyID0gbWZkY3IgKG1hbGVzcik7CisJCQkvKiBsb29rIGZvciBtYWwgZXJyb3IgKi8KKwkJCWlmICgobXlfdWljbXNyICYgTUFMX1VJQ19FUlIpICE9IDApIHsKKwkJCQltYWxfZXJyIChtYWxfaXNyLCBteV91aWNtc3IsIE1BTF9VSUNfREVGLCBNQUxfVUlDX0VSUik7CisJCQkJc2VydmljZWQgPSAxOworCQkJCXJjID0gMDsKKwkJCX0KKwkJfQorCQlpZiAoKEVNQUNfVUlDX0RFRiAmIG15X3VpY21zcikgIT0gMCkgewkvKiBsb29rIGZvciBFTUFDIGVycm9ycyAqLworCQkJZW1hY19pc3IgPSBpbjMyIChFTUFDX0lTUik7CisJCQlpZiAoKGVtYWNfaWVyICYgZW1hY19pc3IpICE9IDApIHsKKwkJCQllbWFjX2VyciAoZW1hY19pc3IpOworCQkJCXNlcnZpY2VkID0gMTsKKwkJCQlyYyA9IDA7CisJCQl9CisJCX0KKwkJaWYgKCgoZW1hY19pZXIgJiBlbWFjX2lzcikgIT0gMCkgfCAoKE1BTF9VSUNfRVJSICYgbXlfdWljbXNyKSAhPSAwKSkgeworCQkJbXRkY3IgKHVpY3NyLCBNQUxfVUlDX0RFRiB8IEVNQUNfVUlDX0RFRik7IC8qIENsZWFyICovCisJCQlyZXR1cm4gKHJjKTsJCS8qIHdlIGhhZCBlcnJvcnMgc28gZ2V0IG91dCAqLworCQl9CisKKworCQkvKiBoYW5kbGUgTUFMIFJYIEVPQiAgaW50ZXJ1cHQgZnJvbSBhIHJlY2VpdmUgKi8KKwkJLyogY2hlY2sgZm9yIEVPQiBvbiB2YWxpZCBjaGFubmVscyAgICAgICAgICAgICovCisJCWlmICgobXlfdWljbXNyICYgVUlDX01BTF9SWEVPQikgIT0gMCkgeworCQkJbWFsX3J4X2VvYiA9IG1mZGNyIChtYWxyeGVvYmlzcik7CisJCQlpZiAoKG1hbF9yeF9lb2IgJiAweDgwMDAwMDAwKSAhPSAwKSB7CS8qIGNhbGwgZW1hYyByb3V0aW5lIGZvciBjaGFubmVsIDAgKi8KKwkJCQkvKiBjbGVhciBFT0IKKwkJCQkgICBtdGRjcihtYWxyeGVvYmlzciwgbWFsX3J4X2VvYik7ICovCisJCQkJZW5ldF9yY3YgKGVtYWNfaXNyKTsKKwkJCQkvKiBpbmRpY2F0ZSB0aGF0IHdlIHNlcnZpY2VkIGFuIGludGVycnVwdCAqLworCQkJCXNlcnZpY2VkID0gMTsKKwkJCQlyYyA9IDA7CisJCQl9CisJCX0KKwkJbXRkY3IgKHVpY3NyLCBNQUxfVUlDX0RFRiB8IEVNQUNfVUlDX0RFRik7CS8qIENsZWFyICovCisJfQorCXdoaWxlIChzZXJ2aWNlZCk7CisKKwlyZXR1cm4gKHJjKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfNDQwICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgTUFMIEVycm9yIFJvdXRpbmUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBtYWxfZXJyICh1bnNpZ25lZCBsb25nIGlzciwgdW5zaWduZWQgbG9uZyB1aWMsIHVuc2lnbmVkIGxvbmcgbWFsZGVmLAorCSAgICAgIHVuc2lnbmVkIGxvbmcgbWFsX2VycnIpCit7CisJbXRkY3IgKG1hbGVzciwgaXNyKTsJCS8qIGNsZWFyIGludGVycnVwdCAqLworCisJLyogY2xlYXIgREUgaW50ZXJydXB0ICovCisJbXRkY3IgKG1hbHR4ZGVpciwgMHhDMDAwMDAwMCk7CisJbXRkY3IgKG1hbHJ4ZGVpciwgMHg4MDAwMDAwMCk7CisKKyNpZiAxCS8qc3IgKi8KKwlwcmludGYgKCJcbk1BTCBlcnJvciBvY2N1cmVkLi4uLiBJU1IgPSAlbHggVUlDID0gPSAlbHggIE1BTF9ERUYgPSAlbHggIE1BTF9FUlI9ICVseCBcbiIsCisJCWlzciwgdWljLCBtYWxkZWYsIG1hbF9lcnJyKTsKKyNlbHNlCisjaWYgMAorCS8qCisJICogTUFMIGVycm9yIGlzIFJYIERFIGVycm9yIChvdXQgb2YgcnggYnVmZmVycykhIFRoaXMgaXMgT0sgaGVyZSwgdXBvbgorCSAqIG1hbnkgaW5jb21pbmcgcGFja2V0cyB3aXRoIG9ubHkgNCByeCBidWZmZXJzLgorCSAqLworCXByaW50ZiAoIk0iKTsJCQkvKiBqdXN0IHRvIHNlZSBzb21ldGhpbmcgdXBvbiBtYWwgZXJyb3IgKi8KKyNlbmRpZgorI2VuZGlmCS8qc3IgKi8KKworCWV0aF9pbml0IChiaXNfc2F2ZSk7CQkvKiBzdGFydCBhZ2Fpbi4uLiAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogIEVNQUMgRXJyb3IgUm91dGluZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGVtYWNfZXJyICh1bnNpZ25lZCBsb25nIGlzcikKK3sKKwlwcmludGYgKCJFTUFDIGVycm9yIG9jY3VyZWQuLi4uIElTUiA9ICVseFxuIiwgaXNyKTsKKwlvdXQzMiAoRU1BQ19JU1IsIGlzcik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgZW5ldF9yY3YoKSBoYW5kbGVzIHRoZSBldGhlcm5ldCByZWNlaXZlIGRhdGEKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgZW5ldF9yY3YgKHVuc2lnbmVkIGxvbmcgbWFsaXNyKQoreworCXN0cnVjdCBlbmV0X2ZyYW1lICplZl9wdHI7CisJdW5zaWduZWQgbG9uZyBkYXRhX2xlbjsKKwl1bnNpZ25lZCBsb25nIHJ4X2VvYl9pc3I7CisKKwlpbnQgaGFuZGxlZCA9IDA7CisJaW50IGk7CisJaW50IGxvb3BfY291bnQgPSAwOworCisJcnhfZW9iX2lzciA9IG1mZGNyIChtYWxyeGVvYmlzcik7CisJaWYgKCgweDgwMDAwMDAwID4+IChFTUFDX1JYQ0hMIC0gMSkpICYgcnhfZW9iX2lzcikgeworCQkvKiBjbGVhciBFT0IgKi8KKwkJbXRkY3IgKG1hbHJ4ZW9iaXNyLCByeF9lb2JfaXNyKTsKKworCQkvKiBFTUFDIFJYIGRvbmUgKi8KKwkJd2hpbGUgKDEpIHsJCQkJLyogZG8gYWxsICovCisJCQlpID0gcnhfc2xvdDsKKworCQkJaWYgKChNQUxfUlhfQ1RSTF9FTVBUWSAmIHJ4W2ldLmN0cmwpCisJCQkgICAgfHwgKGxvb3BfY291bnQgPj0gTlVNX1JYX0JVRkYpKQorCQkJCWJyZWFrOworCQkJbG9vcF9jb3VudCsrOworCQkJcnhfc2xvdCsrOworCQkJaWYgKE5VTV9SWF9CVUZGID09IHJ4X3Nsb3QpCisJCQkJcnhfc2xvdCA9IDA7CisJCQloYW5kbGVkKys7CisJCQlkYXRhX2xlbiA9ICh1bnNpZ25lZCBsb25nKSByeFtpXS5kYXRhX2xlbjsJLyogR2V0IGxlbiAqLworCQkJaWYgKGRhdGFfbGVuKSB7CisJCQkJaWYgKGRhdGFfbGVuID4gRU5FVF9NQVhfTVRVKQkvKiBDaGVjayBsZW4gKi8KKwkJCQkJZGF0YV9sZW4gPSAwOworCQkJCWVsc2UgeworCQkJCQlpZiAoRU1BQ19SWF9FUlJPUlMgJiByeFtpXS5jdHJsKSB7CS8qIENoZWNrIEVycm9ycyAqLworCQkJCQkJZGF0YV9sZW4gPSAwOworCQkJCQkJc3RhdHMucnhfZXJyX2xvZ1tyeF9lcnJfaW5kZXhdID0gcnhbaV0uY3RybDsKKwkJCQkJCXJ4X2Vycl9pbmRleCsrOworCQkJCQkJaWYgKHJ4X2Vycl9pbmRleCA9PSBNQVhfRVJSX0xPRykKKwkJCQkJCQlyeF9lcnJfaW5kZXggPSAwOworCQkJCQl9CS8qIGVtYWNfZXJyb3MgICAgICAgICAqLworCQkJCX0JCS8qIGRhdGFfbGVuIDwgbWF4IG10dSAqLworCQkJfQkJCS8qIGlmIGRhdGFfbGVuICAgICAgICAqLworCQkJaWYgKCFkYXRhX2xlbikgewkvKiBubyBkYXRhICovCisJCQkJcnhbaV0uY3RybCB8PSBNQUxfUlhfQ1RSTF9FTVBUWTsJLyogRnJlZSBSZWN2IEJ1ZmZlciAqLworCisJCQkJc3RhdHMuZW1hYy5kYXRhX2xlbl9lcnIrKzsJLyogRXJyb3IgYXQgUnggKi8KKwkJCX0KKworCQkJLyogIWRhdGFfbGVuICovCisJCQkvKiBBUy5IQVJOT0lTICovCisJCQkvKiBDaGVjayBpZiB1c2VyIGhhcyBhbHJlYWR5IGVhdGVuIGJ1ZmZlciAqLworCQkJLyogaWYgbm90ID0+IEVSUk9SICovCisJCQllbHNlIGlmIChyeF9yZWFkeVtyeF9pX2luZGV4XSAhPSAtMSkgeworCQkJCWlmIChpc19yZWNlaXZpbmcpCisJCQkJCXByaW50ZiAoIkVSUk9SIDogUmVjZWl2ZSBidWZmZXJzIGFyZSBmdWxsIVxuIik7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXN0YXRzLmVtYWMucnhfZnJhbWVzKys7CisJCQkJc3RhdHMuZW1hYy5yeCArPSBkYXRhX2xlbjsKKwkJCQllZl9wdHIgPSAoc3RydWN0IGVuZXRfZnJhbWUgKikgcnhbaV0uZGF0YV9wdHI7CisjaWZkZWYgSU5GT180MDVfRU5FVAorCQkJCXBhY2tldFJlY2VpdmVkKys7CisjZW5kaWYKKwkJCQkvKiBBUy5IQVJOT0lTCisJCQkJICogdXNlIHJpbmcgYnVmZmVyCisJCQkJICovCisJCQkJcnhfcmVhZHlbcnhfaV9pbmRleF0gPSBpOworCQkJCXJ4X2lfaW5kZXgrKzsKKwkJCQlpZiAoTlVNX1JYX0JVRkYgPT0gcnhfaV9pbmRleCkKKwkJCQkJcnhfaV9pbmRleCA9IDA7CisKKwkJCQkvKiBwcmludGYoIlgiKTsgIC98KiB0ZXN0LW9ubHkgKnwvICovCisKKwkJCQkvKiAgQVMuSEFSTk9JUworCQkJCSAqIGZyZWUgcmVjZWl2ZSBidWZmZXIgb25seSB3aGVuCisJCQkJICogYnVmZmVyIGhhcyBiZWVuIGhhbmRsZWQgKGV0aF9yeCkKKwkJCQkgcnhbaV0uY3RybCB8PSBNQUxfUlhfQ1RSTF9FTVBUWTsKKwkJCQkqLworCQkJfQkJCS8qIGlmIGRhdGFfbGVuICovCisJCX0JCQkJLyogd2hpbGUgKi8KKwl9CQkJCQkvKiBpZiBFTUFDS19SWENITCAqLworfQorCisKK2ludCBldGhfcnggKHZvaWQpCit7CisJaW50IGxlbmd0aDsKKwlpbnQgdXNlcl9pbmRleDsKKwl1bnNpZ25lZCBsb25nIG1zcjsKKworCWlzX3JlY2VpdmluZyA9IDE7CQkJLyogdGVsbCBkcml2ZXIgKi8KKworCWZvciAoOzspIHsKKwkJLyogQVMuSEFSTk9JUworCQkgKiB1c2UgcmluZyBidWZmZXIgYW5kCisJCSAqIGdldCBpbmRleCBmcm9tIHJ4IGJ1ZmZlciBkZXNjaXB0b3IgcXVldWUKKwkJICovCisJCXVzZXJfaW5kZXggPSByeF9yZWFkeVtyeF91X2luZGV4XTsKKwkJaWYgKHVzZXJfaW5kZXggPT0gLTEpIHsKKwkJCWxlbmd0aCA9IC0xOworCQkJYnJlYWs7CS8qIG5vdGhpbmcgcmVjZWl2ZWQgLSBsZWF2ZSBmb3IoKSBsb29wICovCisJCX0KKworCQltc3IgPSBtZm1zciAoKTsKKwkJbXRtc3IgKG1zciAmIH4oTVNSX0VFKSk7CisKKwkJbGVuZ3RoID0gcnhbdXNlcl9pbmRleF0uZGF0YV9sZW47CisKKwkJLyogUGFzcyB0aGUgcGFja2V0IHVwIHRvIHRoZSBwcm90b2NvbCBsYXllcnMuICovCisJCS8qICAgICAgIE5ldFJlY2VpdmUoTmV0UnhQYWNrZXRzW3J4SWR4XSwgbGVuZ3RoIC0gNCk7ICovCisJCS8qICAgICAgIE5ldFJlY2VpdmUoTmV0UnhQYWNrZXRzW2ldLCBsZW5ndGgpOyAqLworCQlOZXRSZWNlaXZlIChOZXRSeFBhY2tldHNbdXNlcl9pbmRleF0sIGxlbmd0aCAtIDQpOworCQkvKiBGcmVlIFJlY3YgQnVmZmVyICovCisJCXJ4W3VzZXJfaW5kZXhdLmN0cmwgfD0gTUFMX1JYX0NUUkxfRU1QVFk7CisJCS8qIEZyZWUgcnggYnVmZmVyIGRlc2NyaXB0b3IgcXVldWUgKi8KKwkJcnhfcmVhZHlbcnhfdV9pbmRleF0gPSAtMTsKKwkJcnhfdV9pbmRleCsrOworCQlpZiAoTlVNX1JYX0JVRkYgPT0gcnhfdV9pbmRleCkKKwkJCXJ4X3VfaW5kZXggPSAwOworCisjaWZkZWYgSU5GT180MDVfRU5FVAorCQlwYWNrZXRIYW5kbGVkKys7CisjZW5kaWYKKworCQltdG1zciAobXNyKTsJCQkvKiBFbmFibGUgSVJRJ3MgKi8KKwl9CisKKwlpc19yZWNlaXZpbmcgPSAwOwkJCS8qIHRlbGwgZHJpdmVyICovCisKKwlyZXR1cm4gbGVuZ3RoOworfQorCisjZW5kaWYJLyogQ09ORklHXzQwNUdQICovCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4LzQwNWdwX3BjaS5jIGIvY3B1L3BwYzR4eC80MDVncF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzJjNTliCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L3BwYzR4eC80MDVncF9wY2kuYwpAQCAtMCwwICsxLDUwMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiAgICAgICBUaGlzIHNvdXJjZSBjb2RlIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlIHRvIHlvdSBieSBJQk0gb24gYW4gQVMtSVMKKyAqICAgICAgIGJhc2lzLiAgQW55b25lIHJlY2VpdmluZyB0aGlzIHNvdXJjZSBpcyBsaWNlbnNlZCB1bmRlciBJQk0KKyAqICAgICAgIGNvcHlyaWdodHMgdG8gdXNlIGl0IGluIGFueSB3YXkgaGUgb3Igc2hlIGRlZW1zIGZpdCwgaW5jbHVkaW5nCisgKiAgICAgICBjb3B5aW5nIGl0LCBtb2RpZnlpbmcgaXQsIGNvbXBpbGluZyBpdCwgYW5kIHJlZGlzdHJpYnV0aW5nIGl0IGVpdGhlcgorICogICAgICAgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMuICBObyBsaWNlbnNlIHVuZGVyIElCTSBwYXRlbnRzIG9yCisgKiAgICAgICBwYXRlbnQgYXBwbGljYXRpb25zIGlzIHRvIGJlIGltcGxpZWQgYnkgdGhlIGNvcHlyaWdodCBsaWNlbnNlLgorICoKKyAqICAgICAgIEFueSB1c2VyIG9mIHRoaXMgc29mdHdhcmUgc2hvdWxkIHVuZGVyc3RhbmQgdGhhdCBJQk0gY2Fubm90IHByb3ZpZGUKKyAqICAgICAgIHRlY2huaWNhbCBzdXBwb3J0IGZvciB0aGlzIHNvZnR3YXJlIGFuZCB3aWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IKKyAqICAgICAgIGFueSBjb25zZXF1ZW5jZXMgcmVzdWx0aW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqICAgICAgIEFueSBwZXJzb24gd2hvIHRyYW5zZmVycyB0aGlzIHNvdXJjZSBjb2RlIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsKKyAqICAgICAgIG11c3QgaW5jbHVkZSB0aGUgSUJNIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgcGFyYWdyYXBoLCBhbmQgdGhlCisgKiAgICAgICBwcmVjZWRpbmcgdHdvIHBhcmFncmFwaHMgaW4gdGhlIHRyYW5zZmVycmVkIHNvZnR3YXJlLgorICoKKyAqICAgICAgIENPUFlSSUdIVCAgIEkgQiBNICAgQ09SUE9SQVRJT04gMTk5NQorICogICAgICAgTElDRU5TRUQgTUFURVJJQUwgIC0gIFBST0dSQU0gUFJPUEVSVFkgT0YgSSBCIE0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqICBGaWxlIE5hbWU6ICAgNDA1Z3BfcGNpLmMKKyAqCisgKiAgRnVuY3Rpb246ICAgIEluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHRoZSA0MDVHUCBQQ0kgQ29uZmlndXJhdGlvbiByZWdzLgorICoKKyAqICBBdXRob3I6ICAgICAgTWFyayBHYW1lCisgKgorICogIENoYW5nZSBBY3Rpdml0eS0KKyAqCisgKiAgRGF0ZSAgICAgICAgRGVzY3JpcHRpb24gb2YgQ2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlkKKyAqICAtLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0KKyAqICAwOS1TZXAtOTggICBDcmVhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0cKKyAqICAwMi1Ob3YtOTggICBSZW1vdmVkIEV4dGVybmFsIGFyYml0ZXIgc2VsZWN0ZWQgbWVzc2FnZSAgICAgICAgICAgICAgICAgICBKV0IKKyAqICAyNy1Ob3YtOTggICBaZXJvIG91dCBQVE1CQVIyIGFuZCBkaXNhYmxlIGluIFBUTTJNUyAgICAgICAgICAgICAgICAgICAgICBKV0IKKyAqICAwNC1KYW4tOTkgICBaZXJvIG91dCBvdGhlciB1bnVzZWQgUE1NIGFuZCBQVE0gcmVncy4gQ2hhbmdlIGJ1cyBzY2FuICAgICBNQ0cKKyAqICAgICAgICAgICAgICBmcm9tICgwIHRvIG4pIHRvICgxIHRvIG4pLgorICogIDE3LU1heS05OSAgIFBvcnQgdG8gV2FsbnV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpXQgorICogIDE3LUp1bi05OSAgIFVwZGF0ZWQgZm9yIFZHQSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpXQgorICogIDIxLUp1bi05OSAgIFVwZGF0ZWQgdG8gYWxsb3cgU1JBTSByZWdpb24gdG8gYmUgYSB0YXJnZXQgZnJvbSBQQ0kgYnVzICAgIEpXQgorICogIDE5LUp1bC05OSAgIFVwZGF0ZWQgZm9yIDQwNUdQIHBhc3MgMSBlcnJhdGEgIzI2IChMb3cgUENJIHN1YnNlcXVlbnQgICAgIE1DRworICogICAgICAgICAgICAgIHRhcmdldCBsYXRlbmN5IHRpbWVyIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCkuCisgKiAgICAgICAgICAgICAgU2hvdWxkIGJlIGZpeGVkIGluIHBhc3MgMi4KKyAqICAwOS1TZXAtOTkgICBSZW1vdmVkIHVzZSBvZiBQVE0yIHNpbmNlIHRoZSBTUkFNIHJlZ2lvbiBubyBsb25nZXIgbmVlZHMgICBKV0IKKyAqICAgICAgICAgICAgICB0byBiZSBhIFBDSSB0YXJnZXQuIFplcm8gb3V0IFBUTUJBUjIgYW5kIGRpc2FibGUgaW4gUFRNMk1TLgorICogIDEwLURlYy05OSAgIFVwZGF0ZWQgUENJX1dyaXRlX0NGR19SZWcgZm9yIHBhc3MyIGVycmF0YSAjNiAgICAgICAgICAgICAgIEpXQgorICogIDExLUphbi0wMCAgIEVuc3VyZSBQTU14TUFzIGRpc2FibGVkIGJlZm9yZSBzZXR0aW5nIFBNTXhMQXMuIFRoaXMgaXMgbm90CisgKiAgICAgICAgICAgICAgcmVhbGx5IHJlcXVpcmVkIGFmdGVyIGEgcmVzZXQgc2luY2UgUE1NeE1BcyBhcmUgYWxyZWFkeQorICogCSAgICAgICAgZGlzYWJsZWQgYnV0IGlzIGEgZ29vZCBwcmFjdGljZSBub25ldGhlbGVzcy4gICAgICAgICAgICAgICAgSldCCisgKiAgMTItSnVuLTAxICAgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KKyAqICAgICAgICAgICAgICAtIFBDSSBob3N0L2FkYXB0ZXIgaGFuZGxpbmcgcmV3b3JrZWQKKyAqICAwOS1KdWwtMDEgICBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICogICAgICAgICAgICAgIC0gUENJIGhvc3Qgbm93IGNvbmZpZ3VyZXMgZnJvbSBkZXZpY2UgMCAobm90IDEpIHRvIG1heF9kZXYsCisgKiAgICAgICAgICAgICAgICAoaG9zdCBjb25maWd1cmVzIGl0c2VsZikKKyAqICAgICAgICAgICAgICAtIE9uIENQQ0ktNDA1IHBjaSBiYXNlIGFkZHJlc3MgYW5kIHNpemUgaXMgZ2VuZXJhdGVkIGZyb20KKyAqICAgICAgICAgICAgICAgIFNEUkFNIGFuZCBGTEFTSCBzaXplIChDRkcgcmVncyBub3QgdXNlZCBhbnltb3JlKQorICogICAgICAgICAgICAgIC0gU29tZSBtaW5vciBjaGFuZ2VzIGZvciBDUENJLTQwNS1BIChhZGFwdGVyIHZlcnNpb24pCisgKiAgMTQtU2VwLTAxICAgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KKyAqICAgICAgICAgICAgICAtIENPTkZJR19QQ0lfU0NBTl9TSE9XIGFkZGVkIHRvIHByaW50IHBjaSBkZXZpY2VzIHVwb24gc3RhcnR1cAorICogIDI4LVNlcC0wMSAgIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKiAgICAgICAgICAgICAgLSBDaGFuZ2VkIHBjaSBtYXN0ZXIgY29uZmlndXJhdGlvbiBmb3IgbGludXggY29tcGF0aWJpbGl0eQorICogICAgICAgICAgICAgICAgKG5vIG5lZWQgZm9yIGJpb3NfZml4dXAoKSBhbnltb3JlKQorICogIDI2LUZlYi0wMiAgIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKiAgICAgICAgICAgICAgLSBCdWcgZml4ZWQgaW4gcGNpIGNvbmZpZ3VyYXRpb24gKEFuZHJldyBNYXkpCisgKiAgICAgICAgICAgICAgLSBSZW1vdmVkIHBjaSBjbGFzcyBjb2RlIGluaXQgZm9yIENQQ0k0MDUgYm9hcmQKKyAqICAxNS1NYXktMDIgICBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICogICAgICAgICAgICAgIC0gTmV3IHZnYSBkZXZpY2UgaGFuZGxpbmcKKyAqICAyOS1NYXktMDIgICBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICogICAgICAgICAgICAgIC0gUENJIGNsYXNzIGNvZGUgaW5pdCBhZGRlZCAoaWYgZGVmaW5lZCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8Y21kX2Jvb3QuaD4KKyNpZiAhZGVmaW5lZChDT05GSUdfNDQwKQorI2luY2x1ZGUgPDQwNWdwX3BjaS5oPgorI2VuZGlmCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHBjaS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfNDA1R1ApCisKKyNpZmRlZiBDT05GSUdfUENJCisKKy8qI2RlZmluZSBERUJVRyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBwY2lfaW5pdC4gIEluaXRpYWxpemVzIHRoZSA0MDVHUCBQQ0kgQ29uZmlndXJhdGlvbiByZWdzLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHBjaV80MDVncF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWludCBpLCByZWdfbnVtID0gMDsKKwliZF90ICpiZCA9IGdkLT5iZDsKKworCXVuc2lnbmVkIHNob3J0IHRlbXBfc2hvcnQ7CisJdW5zaWduZWQgbG9uZyBwdG1wY2lsYVsyXSA9IHtDRkdfUENJX1BUTTFQQ0ksIENGR19QQ0lfUFRNMlBDSX07CisjaWYgZGVmaW5lZChDT05GSUdfQ1BDSTQwNSkKKwl1bnNpZ25lZCBsb25nIHB0bWxhWzJdICAgID0ge2JkLT5iaV9tZW1zdGFydCwgYmQtPmJpX2ZsYXNoc3RhcnR9OworCXVuc2lnbmVkIGxvbmcgcHRtbXNbMl0gICAgPSB7fihiZC0+YmlfbWVtc2l6ZSAtIDEpIHwgMSwgfihiZC0+YmlfZmxhc2hzaXplIC0gMSkgfCAxfTsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyBwdG1sYVsyXSAgICA9IHtDRkdfUENJX1BUTTFMQSwgQ0ZHX1BDSV9QVE0yTEF9OworCXVuc2lnbmVkIGxvbmcgcHRtbXNbMl0gICAgPSB7Q0ZHX1BDSV9QVE0xTVMsIENGR19QQ0lfUFRNMk1TfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1BJUDQwNSkgfHwgZGVmaW5lZCAoQ09ORklHX01JUDQwNSkKKwl1bnNpZ25lZCBsb25nIHBtbWxhWzNdICAgID0gezB4ODAwMDAwMDAsIDB4QTAwMDAwMDAsIDB9OworCXVuc2lnbmVkIGxvbmcgcG1tbWFbM10gICAgPSB7MHhFMDAwMDAwMSwgMHhFMDAwMDAwMSwgMH07CisJdW5zaWduZWQgbG9uZyBwbW1wY2lsYVszXSA9IHsweDgwMDAwMDAwLCAweDAwMDAwMDAwLCAwfTsKKwl1bnNpZ25lZCBsb25nIHBtbXBjaWhhWzNdID0gezB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9OworI2Vsc2UKKwl1bnNpZ25lZCBsb25nIHBtbWxhWzNdICAgID0gezB4ODAwMDAwMDAsIDAsMH07CisJdW5zaWduZWQgbG9uZyBwbW1tYVszXSAgICA9IHsweEMwMDAwMDAxLCAwLDB9OworCXVuc2lnbmVkIGxvbmcgcG1tcGNpbGFbM10gPSB7MHg4MDAwMDAwMCwgMCwwfTsKKwl1bnNpZ25lZCBsb25nIHBtbXBjaWhhWzNdID0gezB4MDAwMDAwMDAsIDAsMH07CisjZW5kaWYKKworCS8qCisJICogUmVnaXN0ZXIgdGhlIGhvc2UKKwkgKi8KKwlob3NlLT5maXJzdF9idXNubyA9IDA7CisJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CisKKwkvKiBJU0EvUENJIEkvTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyByZWdfbnVtKyssCisJCSAgICAgICBNSU5fUENJX1BDSV9JT0FERFIsCisJCSAgICAgICBNSU5fUExCX1BDSV9JT0FERFIsCisJCSAgICAgICAweDEwMDAwLAorCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkvKiBQQ0kgSS9PIHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIHJlZ19udW0rKywKKwkJICAgICAgIDB4MDA4MDAwMDAsCisJCSAgICAgICAweGU4ODAwMDAwLAorCQkgICAgICAgMHgwMzgwMDAwMCwKKwkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJcmVnX251bSA9IDI7CisKKwkvKiBNZW1vcnkgc3BhY2VzICovCisJZm9yIChpPTA7IGk8MjsgaSsrKQorCQlpZiAocHRtbXNbaV0gJiAxKQorCQl7CisJCQlpZiAoIWkpIGhvc2UtPnBjaV9mYiA9IGhvc2UtPnJlZ2lvbnMgKyByZWdfbnVtOworCisJCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgcmVnX251bSsrLAorCQkJCSAgICAgICBwdG1wY2lsYVtpXSwgcHRtbGFbaV0sCisJCQkJICAgICAgIH4ocHRtbXNbaV0gJiAweGZmZmZmMDAwKSArIDEsCisJCQkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwKKwkJCQkgICAgICAgUENJX1JFR0lPTl9NRU1PUlkpOworCQl9CisKKwkvKiBQQ0kgbWVtb3J5IHNwYWNlcyAqLworCWZvciAoaT0wOyBpPDM7IGkrKykKKwkJaWYgKHBtbW1hW2ldICYgMSkKKwkJeworCQkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIHJlZ19udW0rKywKKwkJCQkgICAgICAgcG1tcGNpbGFbaV0sIHBtbWxhW2ldLAorCQkJCSAgICAgICB+KHBtbW1hW2ldICYgMHhmZmZmZjAwMCkgKyAxLAorCQkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisJCX0KKworCWhvc2UtPnJlZ2lvbl9jb3VudCA9IHJlZ19udW07CisKKwlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwKKwkJCSAgIFBDSUNGR0FEUiwKKwkJCSAgIFBDSUNGR0RBVEEpOworCisJaWYgKGhvc2UtPnBjaV9mYikKKwkJcGNpYXV0b19yZWdpb25faW5pdChob3NlLT5wY2lfZmIpOworCisJcGNpX3JlZ2lzdGVyX2hvc2UoaG9zZSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIDQwNUdQIFBDSSBNYXN0ZXIgY29uZmlndXJhdGlvbi4KKwkgKiBNYXAgb25lIDUxMiBNQiByYW5nZSBvZiBQTEIvcHJvY2Vzc29yIGFkZHJlc3NlcyB0byBQQ0kgbWVtb3J5IHNwYWNlLgorCSAqIFBMQiBhZGRyZXNzIDB4ODAwMDAwMDAtMHhCRkZGRkZGRiA9PT4gUENJIGFkZHJlc3MgMHg4MDAwMDAwMC0weEJGRkZGRkZGCisJICogVXNlIGJ5dGUgcmV2ZXJzZWQgb3V0IHJvdXRpbmVzIHRvIGhhbmRsZSBlbmRpYW5lc3MuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJb3V0MzJyKFBNTTBNQSwgICAgcG1tbWFbMF0pOyAgICAgICAgICAvKiBlbnN1cmUgZGlzYWJsZWQgYjQgc2V0dGluZyBQTU0wTEEgKi8KKwlvdXQzMnIoUE1NMExBLCAgICBwbW1sYVswXSk7CisJb3V0MzJyKFBNTTBQQ0lMQSwgcG1tcGNpbGFbMF0pOworCW91dDMycihQTU0wUENJSEEsIHBtbXBjaWhhWzBdKTsKKwlvdXQzMnIoUE1NME1BLCAgICBwbW1tYVswXSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIFBNTTEgaXMgbm90IHVzZWQuICBJbml0aWFsaXplIHRoZW0gdG8gemVyby4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlvdXQzMnIoUE1NMU1BLCAgICBwbW1tYVsxXSk7ICAgICAgICAgIC8qIGVuc3VyZSBkaXNhYmxlZCBiNCBzZXR0aW5nIFBNTTJMQSAqLworCW91dDMycihQTU0xTEEsICAgIHBtbWxhWzFdKTsKKwlvdXQzMnIoUE1NMVBDSUxBLCBwbW1wY2lsYVsxXSk7CisJb3V0MzJyKFBNTTFQQ0lIQSwgcG1tcGNpaGFbMV0pOworCW91dDMycihQTU0xTUEsICAgIHBtbW1hWzFdKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogUE1NMiBpcyBub3QgdXNlZC4gIEluaXRpYWxpemUgdGhlbSB0byB6ZXJvLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW91dDMycihQTU0yTUEsICAgIHBtbW1hWzJdKTsgICAgICAgICAgLyogZW5zdXJlIGRpc2FibGVkIGI0IHNldHRpbmcgUE1NMkxBICovCisJb3V0MzJyKFBNTTJMQSwgICAgcG1tbGFbMl0pOworCW91dDMycihQTU0yUENJTEEsIHBtbXBjaWxhWzJdKTsKKwlvdXQzMnIoUE1NMlBDSUhBLCBwbW1wY2loYVsyXSk7CisJb3V0MzJyKFBNTTJNQSwgICAgcG1tbWFbMl0pOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiA0MDVHUCBQQ0kgVGFyZ2V0IGNvbmZpZ3VyYXRpb24uICAoUFRNMSkKKwkgKiBOb3RlOiBQVE0xTVMgaXMgaGFyZHdpcmUgZW5hYmxlZCBidXQgd2Ugc2V0IHRoZSBlbmFibGUgYml0IGFueXdheS4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlvdXQzMnIoUFRNMUxBLCAgICBwdG1sYVswXSk7ICAgICAgICAgLyogaW5zZXJ0IGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAqLworCW91dDMycihQVE0xTVMsICAgIHB0bW1zWzBdKTsgICAgICAgICAvKiBpbnNlcnQgc2l6ZSwgZW5hYmxlIGJpdCBpcyAxICAgICAgICovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIDQwNUdQIFBDSSBUYXJnZXQgY29uZmlndXJhdGlvbi4gIChQVE0yKQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW91dDMycihQVE0yTEEsIHB0bWxhWzFdKTsgICAgICAgICAgICAvKiBpbnNlcnQgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKHB0bW1zWzFdID09IDApCisJeworCQlvdXQzMnIoUFRNMk1TLCAgICAweDAwMDAwMDAxKTsgICAvKiBzZXQgZW5hYmxlIGJpdCAgICAgICAgICAgICAgICAgICAgICovCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoUENJREVWSURfNDA1R1AsIFBDSV9CQVNFX0FERFJFU1NfMiwgMHgwMDAwMDAwMCk7CisJCW91dDMycihQVE0yTVMsICAgIDB4MDAwMDAwMDApOyAgIC8qIGRpc2FibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl9CisJZWxzZQorCXsKKwkJb3V0MzJyKFBUTTJNUywgcHRtbXNbMV0pOyAgICAgICAgLyogaW5zZXJ0IHNpemUsIGVuYWJsZSBiaXQgaXMgMSAgICAgICAqLworCX0KKworCS8qCisJICogSW5zZXJ0IFN1YnN5c3RlbSBWZW5kb3IgYW5kIERldmljZSBJRAorCSAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChQQ0lERVZJRF80MDVHUCwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsIENGR19QQ0lfU1VCU1lTX1ZFTkRPUklEKTsKKyNpZmRlZiBDT05GSUdfQ1BDSTQwNQorCWlmIChtZmRjcihzdHJhcCkgJiBQU1JfUENJX0FSQklUX0VOKQorCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoUENJREVWSURfNDA1R1AsIFBDSV9TVUJTWVNURU1fSUQsIENGR19QQ0lfU1VCU1lTX0RFVklDRUlEKTsKKwllbHNlCisJCXBjaV93cml0ZV9jb25maWdfd29yZChQQ0lERVZJRF80MDVHUCwgUENJX1NVQlNZU1RFTV9JRCwgQ0ZHX1BDSV9TVUJTWVNfREVWSUNFSUQyKTsKKyNlbHNlCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKFBDSURFVklEXzQwNUdQLCBQQ0lfU1VCU1lTVEVNX0lELCBDRkdfUENJX1NVQlNZU19ERVZJQ0VJRCk7CisjZW5kaWYKKworCS8qCisJICogSW5zZXJ0IENsYXNzLWNvZGUKKwkgKi8KKyNpZmRlZiBDRkdfUENJX0NMQVNTQ09ERQorCXBjaV93cml0ZV9jb25maWdfd29yZChQQ0lERVZJRF80MDVHUCwgUENJX0NMQVNTX1NVQl9DT0RFLCBDRkdfUENJX0NMQVNTQ09ERSk7CisjZW5kaWYgLyogQ0ZHX1BDSV9DTEFTU0NPREUgKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogSWYgUENJIHNwZWVkID0gNjZNaHosIHNldCA2Nk1oeiBjYXBhYmxlIGJpdC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoYmQtPmJpX3BjaV9idXNmcmVxID49IDY2MDAwMDAwKSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKFBDSURFVklEXzQwNUdQLCBQQ0lfU1RBVFVTLCAmdGVtcF9zaG9ydCk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChQQ0lERVZJRF80MDVHUCxQQ0lfU1RBVFVTLCh0ZW1wX3Nob3J0fFBDSV9TVEFUVVNfNjZNSFopKTsKKwl9CisKKyNpZiAoQ09ORklHX1BDSV9IT1NUICE9IFBDSV9IT1NUX0FEQVBURVIpCisjaWYgKENPTkZJR19QQ0lfSE9TRSA9PSBQQ0lfSE9TVF9BVVRPKQorCWlmIChtZmRjcihzdHJhcCkgJiBQU1JfUENJX0FSQklUX0VOKQorI2VuZGlmCisJeworCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQkgKiBXcml0ZSB0aGUgNDA1R1AgUENJIENvbmZpZ3VyYXRpb24gcmVncy4KKwkJICogRW5hYmxlIDQwNUdQIHRvIGJlIGEgbWFzdGVyIG9uIHRoZSBQQ0kgYnVzIChQTU0pLgorCQkgKiBFbmFibGUgNDA1R1AgdG8gYWN0IGFzIGEgUENJIG1lbW9yeSB0YXJnZXQgKFBUTSkuCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQlwY2lfcmVhZF9jb25maWdfd29yZChQQ0lERVZJRF80MDVHUCwgUENJX0NPTU1BTkQsICZ0ZW1wX3Nob3J0KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKFBDSURFVklEXzQwNUdQLCBQQ0lfQ09NTUFORCwgdGVtcF9zaG9ydCB8CisJCQkJICAgICAgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfTUVNT1JZKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogU2V0IEhDRSBiaXQgKEhvc3QgQ29uZmlndXJhdGlvbiBFbmFibGVkKQorCSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKFBDSURFVklEXzQwNUdQLCBQQ0lCUkRHT1BUMiwgJnRlbXBfc2hvcnQpOworCXBjaV93cml0ZV9jb25maWdfd29yZChQQ0lERVZJRF80MDVHUCwgUENJQlJER09QVDIsICh0ZW1wX3Nob3J0IHwgMHgwMDAxKSk7CisKKyNpZmRlZiBDT05GSUdfUENJX1BOUAorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogU2NhbiB0aGUgUENJIGJ1cyBhbmQgY29uZmlndXJlIGRldmljZXMgZm91bmQuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgKENPTkZJR19QQ0lfSE9TVCA9PSBQQ0lfSE9TVF9BVVRPKQorCWlmIChtZmRjcihzdHJhcCkgJiBQU1JfUENJX0FSQklUX0VOKQorI2VuZGlmCisJeworI2lmZGVmIENPTkZJR19QQ0lfU0NBTl9TSE9XCisJCXByaW50ZigiUENJOiAgIEJ1cyBEZXYgVmVuSWQgRGV2SWQgQ2xhc3MgSW50XG4iKTsKKyNlbmRpZgorCisJCWhvc2UtPmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuKGhvc2UpOworCX0KKyNlbmRpZiAgLyogQ09ORklHX1BDSV9QTlAgKi8KKworfQorCisvKgorICogZHJpdmVycy9wY2kuYyBza2lwcyBldmVyeSBob3N0IGJyaWRnZSBidXQgdGhlIDQwNUdQIHNpbmNlIGl0IGNvdWxkCisgKiBiZSBzZXQgYXMgYW4gQWRhcHRlci4KKyAqCisgKiBJIChBbmRyZXcgTWF5KSBkb24ndCBrbm93IHdoYXQgd2Ugc2hvdWxkIGRvIGhlcmUsIGJ1dCBJIGRvbid0IHdhbnQKKyAqIHRoZSBhdXRvIHNldHVwIG9mIGEgUENJIGRldmljZSBkaXNhYmxpbmcgd2hhdCBpcyBkb25lIHBjaV80MDVncF9pbml0CisgKiBhcyBoYXMgaGFwcGVuZWQgYmVmb3JlLgorICovCit2b2lkIHBjaV80MDVncF9zZXR1cF9icmlkZ2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2LAorCQkJICAgIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICplbnRyeSkKK3sKKyNpZmRlZiBERUJVRworICAgICAgICBwcmludGYoIjQwNWdwX3NldHVwX2JyaWRnZVxuIik7CisjZW5kaWYKK30KKworLyoKKyAqCisgKi8KKwordm9pZCBwY2lfNDA1Z3BfZml4dXBfaXJxKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldikKK3sKKwl1bnNpZ25lZCBjaGFyIGludF9saW5lID0gMHhmZjsKKworCS8qCisJICogV3JpdGUgcGNpIGludGVycnVwdCBsaW5lIHJlZ2lzdGVyIChjcGNpNDA1IHNwZWNpZmljKQorCSAqLworCXN3aXRjaCAoUENJX0RFVihkZXYpICYgMHgwMykKKwl7CisJY2FzZSAwOgorCQlpbnRfbGluZSA9IDI3ICsgMjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpbnRfbGluZSA9IDI3ICsgMzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpbnRfbGluZSA9IDI3ICsgMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpbnRfbGluZSA9IDI3ICsgMTsKKwkJYnJlYWs7CisJfQorCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGludF9saW5lKTsKK30KKwordm9pZCBwY2lfNDA1Z3Bfc2V0dXBfdmdhKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldiwKKwkJCSBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqZW50cnkpCit7CisJdW5zaWduZWQgaW50IGNtZHN0YXQgPSAwOworCisJcGNpYXV0b19zZXR1cF9kZXZpY2UoaG9zZSwgZGV2LCA2LCBob3NlLT5wY2lfbWVtLCBob3NlLT5wY2lfaW8pOworCisJLyogYWx3YXlzIGVuYWJsZSBpbyBzcGFjZSBvbiB2Z2EgYm9hcmRzICovCisJcGNpX2hvc2VfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgJmNtZHN0YXQpOworCWNtZHN0YXQgfD0gUENJX0NPTU1BTkRfSU87CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsIGNtZHN0YXQpOworfQorCisjaWYgIShkZWZpbmVkKENPTkZJR19QSVA0MDUpIHx8IGRlZmluZWQgKENPTkZJR19NSVA0MDUpKQorCisvKgorICpBcyBpcyB0aGVzZSBmdW5jdHMgZ2V0IGNhbGxlZCBvdXQgb2YgZmxhc2ggTm90IGEgaG9ycmlibGUKKyAqdGhpbmcsIGJ1dCBzb21ldGhpbmcgdG8ga2VlcCBpbiBtaW5kLiAobm8gc3RhdGljcz8pCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBwY2lfNDA1Z3BfY29uZmlnX3RhYmxlW10gPSB7CisvKmlmIFZlbmRJRCBpcyAwIGl0IHRlcm1pbmF0ZXMgdGhlIHRhYmxlIHNlYXJjaCAoaWUgV2FsbnV0KSovCisjaWYgQ0ZHX1BDSV9TVUJTWVNfVkVORE9SSUQKKwl7Q0ZHX1BDSV9TVUJTWVNfVkVORE9SSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19CUklER0VfSE9TVCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpXzQwNWdwX3NldHVwX2JyaWRnZX0sCisjZW5kaWYKKwl7UENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX0RJU1BMQVlfVkdBLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfNDA1Z3Bfc2V0dXBfdmdhfSwKKworCXtQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfTk9UX0RFRklORURfVkdBLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfNDA1Z3Bfc2V0dXBfdmdhfSwKKworCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBob3NlID0geworCWZpeHVwX2lycTogcGNpXzQwNWdwX2ZpeHVwX2lycSwKKwljb25maWdfdGFibGU6IHBjaV80MDVncF9jb25maWdfdGFibGUsCit9OworCit2b2lkIHBjaV9pbml0KHZvaWQpCit7CisJLyp3ZSB3YW50IHRoZSBwdHJzIHRvIFJBTSBub3QgZmxhc2ggKGllIGRvbid0IHVzZSBpbml0IGxpc3QpKi8KKwlob3NlLmZpeHVwX2lycSAgICA9IHBjaV80MDVncF9maXh1cF9pcnE7CisJaG9zZS5jb25maWdfdGFibGUgPSBwY2lfNDA1Z3BfY29uZmlnX3RhYmxlOworCXBjaV80MDVncF9pbml0KCZob3NlKTsKK30KKworI2VuZGlmCisKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKyNlbmRpZiAvKiBDT05GSUdfNDA1R1AgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIENPTkZJR180NDAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkgJiYgZGVmaW5lZChDT05GSUdfUENJKQorCitzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHBwYzQ0MF9ob3NlID0gezB9OworCisKK3ZvaWQgcGNpXzQ0MF9pbml0IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJaW50IHJlZ19udW0gPSAwOworCXVuc2lnbmVkIGxvbmcgc3RyYXA7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIFRoZSBQQ0kgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgZW5hYmxlIGJpdCBtdXN0IGJlIHNldCAuLi4gaWYgbm90IGFib3J0CisgICAgICogcGNpIHNldHVwIHNpbmNlIHVwZGF0aW5nIHRoZSBiaXQgcmVxdWlyZXMgY2hpcCByZXNldC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBzdHJhcCA9IG1mZGNyKGNwYzBfc3RycDEpOworICAgIGlmKCAoc3RyYXAgJiAweDAwMDQwMDAwKSA9PSAwICl7CisgICAgICAgIHByaW50ZigiUENJOiBDUEMwX1NUUlAxW1BJU0VdIG5vdCBzZXQuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJQQ0k6IENvbmZpZ3VyYXRpb24gYWJvcnRlZC5cbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiBQQ0kgY29udHJvbGxlciBpbml0CisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaG9zZS0+Zmlyc3RfYnVzbm8gPSAwOworCWhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOworCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIHJlZ19udW0rKywKKwkJICAgICAgIDB4MDAwMDAwMDAsCisJCQkgICBQQ0lYMF9JT0JBU0UsCisJCQkgICAweDEwMDAwLAorCQkJICAgUENJX1JFR0lPTl9JTyk7CisKKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgcmVnX251bSsrLAorCQkgICAgICAgQ0ZHX1BDSV9UQVJHQkFTRSwKKwkJCSAgIENGR19QQ0lfTUVNQkFTRSwKKwkJCSAgIDB4MTAwMDAwMDAsCisJCQkgICBQQ0lfUkVHSU9OX01FTSApOworCWhvc2UtPnJlZ2lvbl9jb3VudCA9IHJlZ19udW07CisKKwlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwgUENJWDBfQ0ZHQURSLCBQQ0lYMF9DRkdEQVRBKTsKKworI2lmIGRlZmluZWQoQ0ZHX1BDSV9QUkVfSU5JVCkKKyAgICAvKiBMZXQgYm9hcmQgY2hhbmdlL21vZGlmeSBob3NlICYgZG8gaW5pdGlhbCBjaGVja3MgKi8KKyAgICBpZiggcGNpX3ByZV9pbml0IChob3NlKSA9PSAwICl7CisgICAgICAgIHByaW50ZigiUENJOiBCb2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKyAgICAgICAgcHJpbnRmKCJQQ0k6IENvbmZpZ3VyYXRpb24gYWJvcnRlZC5cbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKwlwY2lfcmVnaXN0ZXJfaG9zZSggaG9zZSApOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiBQQ0kgdGFyZ2V0IGluaXQKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKENGR19QQ0lfVEFSR0VUX0lOSVQpCisJcGNpX3RhcmdldF9pbml0KGhvc2UpOyAgICAgICAgICAgICAgICAvKiBMZXQgYm9hcmQgc2V0dXAgcGNpIHRhcmdldCAqLworI2Vsc2UKKyAgICBvdXQxNnIoIFBDSVgwX1NCU1lTVklELCBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCApOworICAgIG91dDE2ciggUENJWDBfU0JTWVNJRCwgQ0ZHX1BDSV9TVUJTWVNfSUQgKTsKKyAgICBvdXQxNnIoIFBDSVgwX0NMUywgMHgwMDA2MDAwMCApOyAvKiBCcmlkZ2UsIGhvc3QgYnJpZGdlICovCisjZW5kaWYKKworICAgIG91dDMyciggUENJWDBfQlJER09QVDEsIDB4MTAwMDAwNjAgKTsgICAgICAgICAgICAgICAvKiBQTEIgUnEgcHJpIGhpZ2hlc3QgICAqLworICAgIG91dDMyciggUENJWDBfQlJER09QVDIsIGluMzIoUENJWDBfQlJER09QVDIpIHwgMSApOyAvKiBFbmFibGUgaG9zdCBjb25maWcgICAqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiBQQ0kgbWFzdGVyIGluaXQ6IGRlZmF1bHQgaXMgb25lIDI1Nk1CIHJlZ2lvbiBmb3IgUENJIG1lbW9yeToKKwkgKiAweDNfMDAwMDAwMDAgLSAweDNfMEZGRkZGRkYgID09PiBDRkdfUENJX01FTUJBU0UKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKENGR19QQ0lfTUFTVEVSX0lOSVQpCisJcGNpX21hc3Rlcl9pbml0KGhvc2UpOyAgICAgICAgICAvKiBMZXQgYm9hcmQgc2V0dXAgcGNpIG1hc3RlciAqLworI2Vsc2UKKwlvdXQzMnIoIFBDSVgwX1BPTTBTQSwgMCApOyAvKiBkaXNhYmxlICovCisJb3V0MzJyKCBQQ0lYMF9QT00xU0EsIDAgKTsgLyogZGlzYWJsZSAqLworCW91dDMyciggUENJWDBfUE9NMlNBLCAwICk7IC8qIGRpc2FibGUgKi8KKwlvdXQzMnIoIFBDSVgwX1BPTTBMQUwsIDB4MDAwMDAwMDAgKTsKKwlvdXQzMnIoIFBDSVgwX1BPTTBMQUgsIDB4MDAwMDAwMDMgKTsKKwlvdXQzMnIoIFBDSVgwX1BPTTBQQ0lBTCwgQ0ZHX1BDSV9NRU1CQVNFICk7CisJb3V0MzJyKCBQQ0lYMF9QT00wUENJQUgsIDB4MDAwMDAwMDAgKTsKKwlvdXQzMnIoIFBDSVgwX1BPTTBTQSwgMHhmMDAwMDAwMSApOyAvKiAyNTZNQiwgZW5hYmxlZCAqLworICAgIG91dDMyciggUENJWDBfU1RTLCBpbjMyciggUENJWDBfU1RTICkgJiB+MHgwMDAwZmZmOCApOworI2VuZGlmCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIFBDSSBob3N0IGNvbmZpZ3VyYXRpb24gLS0gd2UgZG9uJ3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgaGVyZSAuLi4gdGhlCisgICAgICogX2JvYXJkX211c3RfaW5kaWNhdGVfIHdoYXQgdG8gZG8gLS0gdGhlcmUncyBqdXN0IHRvbyBtYW55IHJ1bnRpbWUKKyAgICAgKiBzY2VuYXJpb3MgaW4gZW52aXJvbm1lbnRzIGxpa2UgY1BDSSwgUFBNQywgZXRjLiB0byBtYWtlIGEgZGV0ZXJtaW5hdGlvbgorICAgICAqIGJhc2VkIG9uIGhhcmQtY29kZWQgdmFsdWVzIG9yIHN0YXRlIG9mIGFyYml0ZXIgZW5hYmxlLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmKCBpc19wY2lfaG9zdChob3NlKSApeworI2lmZGVmIENPTkZJR19QQ0lfU0NBTl9TSE9XCisgICAgICAgIHByaW50ZigiUENJOiAgIEJ1cyBEZXYgVmVuSWQgRGV2SWQgQ2xhc3MgSW50XG4iKTsKKyNlbmRpZgorICAgICAgICBvdXQxNnIoIFBDSVgwX0NNRCwgaW4xNnIoIFBDSVgwX0NNRCApIHwgUENJX0NPTU1BTkRfTUFTVEVSKTsKKyAgICAgICAgaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7CisgICAgfQorfQorCisKK3ZvaWQgcGNpX2luaXQodm9pZCkKK3sKKwlwY2lfNDQwX2luaXQgKCZwcGM0NDBfaG9zZSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfNDQwICYgQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9jcHUuYyBiL2NwdS9wcGM0eHgvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhZmZiMQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9wcGM0eHgvY3B1LmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIG04eHguYworICoKKyAqIENQVSBzcGVjaWZpYyBjb2RlCisgKgorICogd3JpdHRlbiBvciBjb2xsZWN0ZWQgYW5kIHNvbWV0aW1lcyByZXdyaXR0ZW4gYnkKKyAqIE1hZ251cyBEYW1tIDxkYW1tQGJpdHNtYXJ0LmNvbT4KKyAqCisgKiBtaW5vciBtb2RpZmljYXRpb25zIGJ5CisgKiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxwcGM0eHguaD4KKworCisjaWYgZGVmaW5lZChDT05GSUdfNDQwKQorc3RhdGljIGludCBkb19jaGlwX3Jlc2V0KCB1bnNpZ25lZCBsb25nIHN5czAsIHVuc2lnbmVkIGxvbmcgc3lzMSApOworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGNoZWNrY3B1ICh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHXzQwNUdQKSB8fCBkZWZpbmVkKENPTkZJR180MDVDUikgfHwgZGVmaW5lZChDT05GSUdfSU9QNDgwKSB8fCBkZWZpbmVkKENPTkZJR180NDApCisJdWludCBwdnIgPSBnZXRfcHZyKCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR180MDVHUCkgfHwgZGVmaW5lZChDT05GSUdfNDA1Q1IpIHx8IGRlZmluZWQoQ09ORklHX0lPUDQ4MCkKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCXVsb25nIGNsb2NrID0gZ2QtPmNwdV9jbGs7CisJY2hhciBidWZbMzJdOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR180MDVHUCkgfHwgZGVmaW5lZChDT05GSUdfNDA1Q1IpCisJUFBDNDA1X1NZU19JTkZPIHN5c19pbmZvOworCisJcHV0cyAoIkNQVTogICAiKTsKKworCWdldF9zeXNfaW5mbygmc3lzX2luZm8pOworCisjaWYgQ09ORklHXzQwNUdQCisJcHV0cygiSUJNIFBvd2VyUEMgNDA1R1AiKTsKKwlpZiAocHZyID09IFBWUl80MDVHUFJfUkEpIHsKKwkJcHV0YygncicpOworCX0KKwlwdXRzKCIgUmV2LiAiKTsKKyNlbmRpZgorI2lmIENPTkZJR180MDVDUgorCXB1dHMoIklCTSBQb3dlclBDIDQwNUNSIFJldi4gIik7CisjZW5kaWYKKwlzd2l0Y2ggKHB2cikgeworCWNhc2UgUFZSXzQwNUdQX1JCOgorCQlwdXRjKCdCJyk7CisJCWJyZWFrOworCWNhc2UgUFZSXzQwNUdQX1JDOgorI2lmIENPTkZJR180MDVDUgorCWNhc2UgUFZSXzQwNUNSX1JDOgorI2VuZGlmCisJCXB1dGMoJ0MnKTsKKwkJYnJlYWs7CisJY2FzZSBQVlJfNDA1R1BfUkQ6CisJCXB1dGMoJ0QnKTsKKwkJYnJlYWs7CisjaWYgQ09ORklHXzQwNUdQCisJY2FzZSBQVlJfNDA1R1BfUkU6CisJCXB1dGMoJ0UnKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFBWUl80MDVDUl9SQToKKwljYXNlIFBWUl80MDVHUFJfUkE6CisJCXB1dGMoJ0EnKTsKKwkJYnJlYWs7CisJY2FzZSBQVlJfNDA1Q1JfUkI6CisJCXB1dGMoJ0InKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCI/IChQVlI9JTA4eCkiLCBwdnIpOworCQlicmVhazsKKwl9CisKKwlwcmludGYoIiBhdCAlcyBNSHogKFBMQj0lbHUsIE9QQj0lbHUsIEVCQz0lbHUgTUh6KVxuIiwgc3RybWh6KGJ1ZiwgY2xvY2spLAorCSAgICAgICBzeXNfaW5mby5mcmVxUExCIC8gMTAwMDAwMCwKKwkgICAgICAgc3lzX2luZm8uZnJlcVBMQiAvIHN5c19pbmZvLnBsbE9wYkRpdiAvIDEwMDAwMDAsCisJICAgICAgIHN5c19pbmZvLmZyZXFQTEIgLyBzeXNfaW5mby5wbGxFeHRCdXNEaXYgLyAxMDAwMDAwKTsKKworI2lmIENPTkZJR180MDVHUAorCWlmIChtZmRjcihzdHJhcCkgJiBQU1JfUENJX0FTWU5DX0VOKQorCQlwcmludGYoIiAgICAgICAgICAgUENJIGFzeW5jIGV4dCBjbG9jayB1c2VkLCAiKTsKKwllbHNlCisJCXByaW50ZigiICAgICAgICAgICBQQ0kgc3luYyBjbG9jayBhdCAlbHUgTUh6LCAiLAorCQkgICAgICAgc3lzX2luZm8uZnJlcVBMQiAvIHN5c19pbmZvLnBsbFBjaURpdiAvIDEwMDAwMDApOworCWlmIChtZmRjcihzdHJhcCkgJiBQU1JfUENJX0FSQklUX0VOKQorCQlwcmludGYoImludGVybmFsIFBDSSBhcmJpdGVyIGVuYWJsZWRcbiIpOworCWVsc2UKKwkJcHJpbnRmKCJleHRlcm5hbCBQQ0kgYXJiaXRlciBlbmFibGVkXG4iKTsKKyNlbmRpZgorCisJaWYgKChwdnIgfCAweDAwMDAwMDAxKSA9PSBQVlJfNDA1R1BSX1JBKSB7CisJCXByaW50ZigiICAgICAgICAgICAxNiBrQiBJLUNhY2hlIDE2IGtCIEQtQ2FjaGUiKTsKKwl9IGVsc2UgeworCQlwcmludGYoIiAgICAgICAgICAgMTYga0IgSS1DYWNoZSA4IGtCIEQtQ2FjaGUiKTsKKwl9CisKKworI2VuZGlmICAvKiBkZWZpbmVkKENPTkZJR180MDVHUCkgfHwgZGVmaW5lZChDT05GSUdfNDA1Q1IpICovCisKKyNpZmRlZiBDT05GSUdfSU9QNDgwCisJcHJpbnRmKCJQTFggSU9QNDgwIChQVlI9JTA4eCkiLCBwdnIpOworCXByaW50ZigiIGF0ICVzIE1IejoiLCBzdHJtaHooYnVmLCBjbG9jaykpOworCXByaW50ZigiICV1IGtCIEktQ2FjaGUiLCA0KTsKKwlwcmludGYoIiAldSBrQiBELUNhY2hlIiwgMik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKwlwdXRzKCJJQk0gUG93ZXJQQyA0NDAgUmV2LiAiKTsKKwlzd2l0Y2gocHZyKQorCXsKKyAgICAgICAgY2FzZSBQVlJfNDQwR1BfUkI6CisJCXB1dGMoJ0InKTsKKyAgICAgICAgLyogU2VlIGVycmF0YSAxLjEyOiBDSElQXzQgKi8KKyAgICAgICAgaWYoICAgKCBtZmRjcihjcGMwX3N5czApICE9IG1mZGNyKGNwYzBfc3RycDApICkKKyAgICAgICAgICAgIHx8KCBtZmRjcihjcGMwX3N5czEpICE9IG1mZGNyKGNwYzBfc3RycDEpICkgKXsKKyAgICAgICAgICAgIHB1dHMoIlxuXHQgQ1BDMF9TWVN4IERDUnMgY29ycnVwdGVkLiBSZXNldHRpbmcgY2hpcCAuLi5cbiIpOworICAgICAgICAgICAgdWRlbGF5KCAxMDAwICogMTAwMCApOyAvKiBHaXZlIHRpbWUgZm9yIHNlcmlhbCBidWYgdG8gY2xlYXIgKi8KKyAgICAgICAgICAgIGRvX2NoaXBfcmVzZXQoIG1mZGNyKGNwYzBfc3RycDApLCBtZmRjcihjcGMwX3N0cnAxKSApOworICAgICAgICB9CisJCWJyZWFrOworICAgICAgICBjYXNlIFBWUl80NDBHUF9SQzoKKwkJcHV0YygnQycpOworCQlicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKwkJcHJpbnRmKCJVTktOT1dOIChQVlI9JTA4eCkiLCBwdnIpOworCQlicmVhazsKKwl9CisjZW5kaWYKKworCXByaW50ZigiXG4iKTsKKworCXJldHVybiAwOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGRvX3Jlc2V0IChjbWRfdGJsX3QgKmNtZHRwLCBiZF90ICpiZCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYXRlIHN5c3RlbSByZXNldCBpbiBkZWJ1ZyBjb250cm9sIHJlZ2lzdGVyIERCQ1IKKyAgICAgICAgICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oImxpcyAgIDMsIDB4MzAwMCIgOjo6ICJyMyIpOworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXRzcHIgMHgxMzQsIDMiKTsKKyNlbHNlCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm10c3ByIDB4M2YyLCAzIik7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKK3N0YXRpYworaW50IGRvX2NoaXBfcmVzZXQoIHVuc2lnbmVkIGxvbmcgc3lzMCwgdW5zaWduZWQgbG9uZyBzeXMxICkKK3sKKyAgICAvKiBDaGFuZ2VzIHRvIGNwYzBfc3lzMCBhbmQgY3BjMF9zeXMxIHJlcXVpcmUgY2hpcAorICAgICAqIHJlc2V0LgorICAgICAqLworICAgIG10ZGNyKCBjbnRybDAsIG1mZGNyKGNudHJsMCkgfCAweDgwMDAwMDAwICk7IC8qIFNldCBTV0UgKi8KKyAgICBtdGRjciggY3BjMF9zeXMwLCBzeXMwICk7CisgICAgbXRkY3IoIGNwYzBfc3lzMSwgc3lzMSApOworICAgIG10ZGNyKCBjbnRybDAsIG1mZGNyKGNudHJsMCkgJiB+MHg4MDAwMDAwMCApOyAvKiBDbHIgU1dFICovCisgICAgbXRzcHIoIGRiY3IwLCAweDIwMDAwMDAwKTsgIC8qIFJlc2V0IHRoZSBjaGlwICovCisKKyAgICByZXR1cm4gMTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBHZXQgdGltZWJhc2UgY2xvY2sgZnJlcXVlbmN5CisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3RiY2xrICh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKworCXN5c19pbmZvX3QgIHN5c19pbmZvOworCisJZ2V0X3N5c19pbmZvKCZzeXNfaW5mbyk7CisJcmV0dXJuIChzeXNfaW5mby5mcmVxUHJvY2Vzc29yKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfNDA1R1ApIHx8IGRlZmluZWQoQ09ORklHXzQwNUNSKSB8fCBkZWZpbmVkKENPTkZJR180MDUpCisKKwlQUEM0MDVfU1lTX0lORk8gc3lzX2luZm87CisKKwlnZXRfc3lzX2luZm8oJnN5c19pbmZvKTsKKwlyZXR1cm4gKHN5c19pbmZvLmZyZXFQcm9jZXNzb3IpOworCisjZWxpZiBkZWZpbmVkKENPTkZJR19JT1A0ODApCisKKwlyZXR1cm4gKDY2MDAwMDAwKTsKKworI2Vsc2UKKworIyBlcnJvciBnZXRfdGJjbGsoKSBub3QgaW1wbGVtZW50ZWQKKworI2VuZGlmCisKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCit2b2lkCit3YXRjaGRvZ19yZXNldCh2b2lkKQoreworCWludCByZV9lbmFibGUgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKwlyZXNldF80eHhfd2F0Y2hkb2coKTsKKwlpZiAocmVfZW5hYmxlKSBlbmFibGVfaW50ZXJydXB0cygpOworfQorCit2b2lkCityZXNldF80eHhfd2F0Y2hkb2codm9pZCkKK3sKKwkvKgorCSAqIENsZWFyIFRTUihXSVMpIGJpdAorCSAqLworCW10c3ByKHRzciwgMHg0MDAwMDAwMCk7Cit9CisjZW5kaWYJLyogQ09ORklHX1dBVENIRE9HICovCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L2kyYy5jIGIvY3B1L3BwYzR4eC9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGFmMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L3BwYzR4eC9pMmMuYwpAQCAtMCwwICsxLDQxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSTJDIEJ1cyBpbnRlcmZhY2UgaW5pdGlhbGlzYXRpb24gYW5kIEkyQyBDb21tYW5kcyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZm9yIFBQQzQwNUdQCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBdXRob3IgOiBBUyBIQVJOT0lTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEYXRlICAgOiAxMy5EZWMuMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxwcGM0eHguaD4KKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisjICAgaW5jbHVkZSA8NDQwX2kyYy5oPgorI2Vsc2UKKyMgICBpbmNsdWRlIDw0MDVncF9pMmMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGkyYy5oPgorCisjaWZkZWYgQ09ORklHX0hBUkRfSTJDCisKKyNkZWZpbmUgSUlDX09LCQkwCisjZGVmaW5lIElJQ19OT0sJCTEKKyNkZWZpbmUgSUlDX05PS19MQQkyCQkvKiBMb3N0IGFyYml0cmF0aW9uICovCisjZGVmaW5lIElJQ19OT0tfSUNUCTMJCS8qIEluY29tcGxldGUgdHJhbnNmZXIgKi8KKyNkZWZpbmUgSUlDX05PS19YRlJBCTQJCS8qIFRyYW5zZmVyIGFib3J0ZWQgKi8KKyNkZWZpbmUgSUlDX05PS19EQVRBCTUJCS8qIE5vIGRhdGEgaW4gYnVmZmVyICovCisjZGVmaW5lIElJQ19OT0tfVE9VVAk2CQkvKiBUcmFuc2ZlciB0aW1lb3V0ICovCisKKyNkZWZpbmUgSUlDX1RJTUVPVVQgMQkJCS8qIDEgc2Vjb25kZSAqLworCisKK3N0YXRpYyB2b2lkIF9pMmNfYnVzX3Jlc2V0ICh2b2lkKQoreworCWludCBpLCBzdGF0dXM7CisKKwkvKiBSZXNldCBzdGF0dXMgcmVnaXN0ZXIgKi8KKwkvKiB3cml0ZSAxIGluIFNDTVAgYW5kIElSUUEgdG8gY2xlYXIgdGhlc2UgZmllbGRzICovCisJb3V0OCAoSUlDX1NUUywgMHgwQSk7CisKKwkvKiB3cml0ZSAxIGluIElSUVAgSVJRRCBMQSBJQ1QgWEZSQSB0byBjbGVhciB0aGVzZSBmaWVsZHMgKi8KKwlvdXQ4IChJSUNfRVhUU1RTLCAweDhGKTsKKwlfX2FzbV9fIHZvbGF0aWxlICgiZWllaW8iKTsKKworCS8qCisJICogR2V0IGN1cnJlbnQgc3RhdGUsIHJlc2V0IGJ1cworCSAqIG9ubHkgaWYgbm8gdHJhbnNmZXJzIGFyZSBwZW5kaW5nLgorCSAqLworCWkgPSAxMDsKKwlkbyB7CisJCS8qIEdldCBzdGF0dXMgKi8KKwkJc3RhdHVzID0gaW44IChJSUNfU1RTKTsKKwkJdWRlbGF5ICg1MDApOwkJCS8qIDUwMHVzICovCisJCWktLTsKKwl9IHdoaWxlICgoc3RhdHVzICYgSUlDX1NUU19QVCkgJiYgKGkgPiAwKSk7CisJLyogU29mdCByZXNldCBjb250cm9sbGVyICovCisJc3RhdHVzID0gaW44IChJSUNfWFRDTlRMU1MpOworCW91dDggKElJQ19YVENOVExTUywgKHN0YXR1cyB8IElJQ19YVENOVExTU19TUlNUKSk7CisJX19hc21fXyB2b2xhdGlsZSAoImVpZWlvIik7CisKKwkvKiBtYWtlIHN1cmUgd2hlcmUgaW4gaW5pdGlhbCBzdGF0ZSwgZGF0YSBoaSwgY2xvY2sgaGkgKi8KKwlvdXQ4IChJSUNfRElSRUNUQ05UTCwgMHhDKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlpZiAoKGluOCAoSUlDX0RJUkVDVENOVEwpICYgMHgzKSAhPSAweDMpIHsKKwkJCS8qIGNsb2NrIHVudGlsIHdlIGdldCB0byBrbm93biBzdGF0ZSAqLworCQkJb3V0OCAoSUlDX0RJUkVDVENOVEwsIDB4OCk7CS8qIGNsb2NrIGxvICovCisJCQl1ZGVsYXkgKDEwMCk7CQkvKiAxMDB1cyAqLworCQkJb3V0OCAoSUlDX0RJUkVDVENOVEwsIDB4Qyk7CS8qIGNsb2NrIGhpICovCisJCQl1ZGVsYXkgKDEwMCk7CQkvKiAxMDB1cyAqLworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogc2VuZCBzdGFydCBjb25kaXRpb24gKi8KKwlvdXQ4IChJSUNfRElSRUNUQ05UTCwgMHg0KTsKKwl1ZGVsYXkgKDEwMDApOwkJCQkvKiAxbXMgKi8KKwkvKiBzZW5kIHN0b3AgY29uZGl0aW9uICovCisJb3V0OCAoSUlDX0RJUkVDVENOVEwsIDB4Qyk7CisJdWRlbGF5ICgxMDAwKTsJCQkJLyogMW1zICovCisJLyogVW5yZXNldCBjb250cm9sbGVyICovCisJb3V0OCAoSUlDX1hUQ05UTFNTLCAoc3RhdHVzICYgfklJQ19YVENOVExTU19TUlNUKSk7CisJdWRlbGF5ICgxMDAwKTsJCQkJLyogMW1zICovCit9CisKK3ZvaWQgaTJjX2luaXQgKGludCBzcGVlZCwgaW50IHNsYXZlYWRkKQoreworCXN5c19pbmZvX3Qgc3lzSW5mbzsKKwl1bnNpZ25lZCBsb25nIGZyZXFPUEI7CisJaW50IHZhbCwgZGl2aXNvcjsKKworCS8qIEhhbmRsZSBwb3NzaWJsZSBmYWlsZWQgSTJDIHN0YXRlICovCisJX2kyY19idXNfcmVzZXQgKCk7CisKKwkvKiBjbGVhciBsbyBtYXN0ZXIgYWRkcmVzcyAqLworCW91dDggKElJQ19MTUFEUiwgMCk7CisKKwkvKiBjbGVhciBoaSBtYXN0ZXIgYWRkcmVzcyAqLworCW91dDggKElJQ19ITUFEUiwgMCk7CisKKwkvKiBjbGVhciBsbyBzbGF2ZSBhZGRyZXNzICovCisJb3V0OCAoSUlDX0xTQURSLCAwKTsKKworCS8qIGNsZWFyIGhpIHNsYXZlIGFkZHJlc3MgKi8KKwlvdXQ4IChJSUNfSFNBRFIsIDApOworCisJLyogQ2xvY2sgZGl2aWRlIFJlZ2lzdGVyICovCisJLyogZ2V0IE9QQiBmcmVxdWVuY3kgKi8KKwlnZXRfc3lzX2luZm8gKCZzeXNJbmZvKTsKKwlmcmVxT1BCID0gc3lzSW5mby5mcmVxUExCIC8gc3lzSW5mby5wbGxPcGJEaXY7CisJLyogc2V0IGRpdmlzb3IgYWNjb3JkaW5nIHRvIGZyZXFPUEIgKi8KKwlkaXZpc29yID0gKGZyZXFPUEIgLSAxKSAvIDEwMDAwMDAwOworCWlmIChkaXZpc29yID09IDApCisJCWRpdmlzb3IgPSAxOworCW91dDggKElJQ19DTEtESVYsIGRpdmlzb3IpOworCisJLyogbm8gaW50ZXJydXB0cyAqLworCW91dDggKElJQ19JTlRSTVNLLCAwKTsKKworCS8qIGNsZWFyIHRyYW5zZmVyIGNvdW50ICovCisJb3V0OCAoSUlDX1hGUkNOVCwgMCk7CisKKwkvKiBjbGVhciBleHRlbmRlZCBjb250cm9sICYgc3RhdCAqLworCS8qIHdyaXRlIDEgaW4gU1JDIFNSUyBTV0MgU1dTIHRvIGNsZWFyIHRoZXNlIGZpZWxkcyAqLworCW91dDggKElJQ19YVENOVExTUywgMHhGMCk7CisKKwkvKiBNb2RlIENvbnRyb2wgUmVnaXN0ZXIKKwkgICBGbHVzaCBTbGF2ZS9NYXN0ZXIgZGF0YSBidWZmZXIgKi8KKwlvdXQ4IChJSUNfTURDTlRMLCBJSUNfTURDTlRMX0ZTREIgfCBJSUNfTURDTlRMX0ZNREIpOworCV9fYXNtX18gdm9sYXRpbGUgKCJlaWVpbyIpOworCisKKyAgICAgICAgdmFsID0gaW44KElJQ19NRENOVEwpOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgiZWllaW8iKTsKKworICAgICAgICAvKiBJZ25vcmUgR2VuZXJhbCBDYWxsLCBzbGF2ZSB0cmFuc2ZlcnMgYXJlIGlnbm9yZWQsCisgICAgICAgICAgIGRpc2FibGUgaW50ZXJydXB0cywgZXhpdCB1bmtub3duIGJ1cyBzdGF0ZSwgZW5hYmxlIGhvbGQKKyAgICAgICAgICAgU0NMCisgICAgICAgICAgIDEwMGtIeiBub3JtYWx5IG9yIEZhc3RNb2RlIGZvciA0MDBrSHogYW5kIGFib3ZlCisgICAgICAgICovCisKKyAgICAgICAgdmFsIHw9IElJQ19NRENOVExfRVVCU3xJSUNfTURDTlRMX0hTQ0w7CisgICAgICAgIGlmKCBzcGVlZCA+PSA0MDAwMDAgKXsKKyAgICAgICAgICAgICAgICB2YWwgfD0gSUlDX01EQ05UTF9GU007CisgICAgICAgIH0KKwlvdXQ4IChJSUNfTURDTlRMLCB2YWwpOworCisJLyogY2xlYXIgY29udHJvbCByZWcgKi8KKwlvdXQ4IChJSUNfQ05UTCwgMHgwMCk7CisJX19hc21fXyB2b2xhdGlsZSAoImVpZWlvIik7CisKK30KKworLyoKKyAgVGhpcyBjb2RlIHRyaWVzIHRvIHVzZSB0aGUgZmVhdHVyZXMgb2YgdGhlIDQwNUdQIGkyYworICBjb250cm9sbGVyLiBJdCB3aWxsIHRyYW5zZmVyIHVwIHRvIDQgYnl0ZXMgaW4gb25lIHBhc3MKKyAgb24gdGhlIGxvb3AuIEl0IG9ubHkgZG9lcyBvdXQ4KGxieikgdG8gdGhlIGJ1ZmZlciB3aGVuIGl0CisgIGlzIHBvc3NpYmxlIHRvIGRvIG91dDE2KGxoeikgdHJhbnNmZXJzLgorCisgIGNtZF90eXBlIGlzIDAgZm9yIHdyaXRlIDEgZm9yIHJlYWQuCisKKyAgYWRkcl9sZW4gY2FuIHRha2UgYW55IHZhbHVlIGZyb20gMC0yNTUsIGl0IGlzIG9ubHkgbGltaXRlZAorICBieSB0aGUgY2hhciwgd2UgY291bGQgbWFrZSBpdCBsYXJnZXIgaWYgbmVlZGVkLiBJZiBpdCBpcworICAwIHdlIHNraXAgdGhlIGFkZHJlc3Mgd3JpdGUgY3ljbGUuCisKKyAgVHlwaWNhbCBjYXNlIGlzIGEgV3JpdGUgb2YgYW4gYWRkciBmb2xsb3dkIGJ5IGEgUmVhZC4gVGhlCisgIElCTSBGQVEgZG9lcyBub3QgY292ZXIgdGhpcy4gT24gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgd3JpdGUKKyAgd2UgZG9uJ3Qgc2V0IHRoZSBjcmVnIENIVCBiaXQsIGFuZCBvbiB0aGUgZmlyc3QgYnl0ZXMgb2YgdGhlCisgIHJlYWQgd2Ugc2V0IHRoZSBSUFNUIGJpdC4KKworICBJdCBkb2VzIG5vdCBzdXBwb3J0IGFkZHJlc3Mgb25seSB0cmFuc2ZlcnMsIHRoZXJlIG11c3QgYmUKKyAgYSBkYXRhIHBhcnQuIElmIHlvdSB3YW50IHRvIHdyaXRlIHRoZSBhZGRyZXNzIHlvdXJzZWxmLCBwdXQKKyAgaXQgaW4gdGhlIGRhdGEgcG9pbnRlci4KKworICBJdCBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zZmVyIHRvL2Zyb20gYWRkcmVzcyAwLgorCisgIEl0IGRvZXMgbm90IGNoZWNrIFhGUkNOVC4KKyovCitzdGF0aWMKK2ludCBpMmNfdHJhbnNmZXIodW5zaWduZWQgY2hhciBjbWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjaGlwLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGFkZHJbXSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhZGRyX2xlbiwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBkYXRhW10sCisJCSB1bnNpZ25lZCBzaG9ydCBkYXRhX2xlbiApCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIqIHB0cjsKKyAgICAgICAgaW50IHJlYWRpbmc7CisgICAgICAgIGludCB0cmFuLGNudDsKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHVjaGFyIGNyZWc7CisKKyAgICAgICAgaWYoIGRhdGEgPT0gMCB8fCBkYXRhX2xlbiA9PSAwICl7CisgICAgICAgICAgICAgICAgLypEb24ndCBzdXBwb3J0IGRhdGEgdHJhbnNmZXIgb2Ygbm8gbGVuZ3RoIG9yIHRvIGFkZHJlc3MgMCovCisgICAgICAgICAgICAgICAgcHJpbnRmKCAiaTJjX3RyYW5zZmVyOiBiYWQgY2FsbFxuIiApOworICAgICAgICAgICAgICAgIHJldHVybiBJSUNfTk9LOworICAgICAgICB9CisgICAgICAgIGlmKCBhZGRyICYmIGFkZHJfbGVuICl7CisgICAgICAgICAgICAgICAgcHRyID0gYWRkcjsKKyAgICAgICAgICAgICAgICBjbnQgPSBhZGRyX2xlbjsKKyAgICAgICAgICAgICAgICByZWFkaW5nID0gMDsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcHRyID0gZGF0YTsKKyAgICAgICAgICAgICAgICBjbnQgPSBkYXRhX2xlbjsKKyAgICAgICAgICAgICAgICByZWFkaW5nID0gY21kX3R5cGU7CisgICAgICAgIH0KKworICAgICAgICAvKkNsZWFyIFN0b3AgQ29tcGxldGUgQml0Ki8KKyAgICAgICAgb3V0OChJSUNfU1RTLElJQ19TVFNfU0NNUCk7CisgICAgICAgIC8qIENoZWNrIGluaXQgKi8KKyAgICAgICAgaT0xMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIC8qIEdldCBzdGF0dXMgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBpbjgoSUlDX1NUUyk7CisgICAgICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgiZWllaW8iKTsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgIH0gd2hpbGUgKChzdGF0dXMgJiBJSUNfU1RTX1BUKSAmJiAoaT4wKSk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAmIElJQ19TVFNfUFQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBJSUNfTk9LX1RPVVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgLypmbHVzaCB0aGUgTWFzdGVyL1NsYXZlIERhdGFidWZmZXJzKi8KKyAgICAgICAgb3V0OChJSUNfTURDTlRMLCAoKGluOChJSUNfTURDTlRMKSl8SUlDX01EQ05UTF9GTURCfElJQ19NRENOVExfRlNEQikpOworICAgICAgICAvKm5lZWQgdG8gd2FpdCA0IE9QQiBjbG9ja3M/IGNvZGUgYmVsb3cgc2hvdWxkIHRha2UgdGhhdCBsb25nKi8KKworICAgICAgICAvKiA3LWJpdCBhZHJlc3NpbmcgKi8KKyAgICAgICAgb3V0OChJSUNfSE1BRFIsMCk7CisgICAgICAgIG91dDgoSUlDX0xNQURSLCBjaGlwKTsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSgiZWllaW8iKTsKKworICAgICAgICB0cmFuID0gMDsKKyAgICAgICAgcmVzdWx0ID0gSUlDX09LOworICAgICAgICBjcmVnID0gMDsKKworICAgICAgICB3aGlsZSAoIHRyYW4gIT0gY250ICYmIChyZXN1bHQgPT0gSUlDX09LKSkgeworICAgICAgICAgICAgICAgIGludCAgYmMsajsKKworICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgcmVnaXN0ZXIgPQorICAgICAgICAgICAgICAgICAgIE5vcm1hbCB0cmFuc2ZlciwgNy1iaXRzIGFkcmVzc2luZywgVHJhbnNmZXIgdXAgdG8gYmMgYnl0ZXMsIE5vcm1hbCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICBUcmFuc2ZlciBpcyBhIHNlcXVlbmNlIG9mIHRyYW5zZmVycworICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgY3JlZyB8PSBJSUNfQ05UTF9QVDsKKworICAgICAgICAgICAgICAgIGJjID0gKGNudCAtIHRyYW4pID4gNCA/IDQgOgorICAgICAgICAgICAgICAgICAgICAgICAgY250IC0gdHJhbjsKKyAgICAgICAgICAgICAgICBjcmVnIHw9IChiYy0xKTw8NDsKKyAgICAgICAgICAgICAgICAvKiBpZiB0aGUgcmVhbCBjbWQgdHlwZSBpcyB3cml0ZSBjb250aW51ZSB0cmFucyovCisgICAgICAgICAgICAgICAgaWYgKCAoIWNtZF90eXBlICYmIChwdHIgPT0gYWRkcikpIHx8ICgodHJhbitiYykgIT0gY250KSApCisgICAgICAgICAgICAgICAgICAgICAgICBjcmVnIHw9IElJQ19DTlRMX0NIVDsKKworICAgICAgICAgICAgICAgIGlmIChyZWFkaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgY3JlZyB8PSBJSUNfQ05UTF9SRUFEOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDsgajxiYzsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0OChJSUNfTURCVUYscHRyW3RyYW4ral0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKCJlaWVpbyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQ4KElJQ19DTlRMLCBjcmVnICk7CisgICAgICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgiZWllaW8iKTsKKworICAgICAgICAgICAgICAgIC8qIFRyYW5zZmVyIGlzIGluIHByb2dyZXNzCisgICAgICAgICAgICAgICAgICAgd2UgaGF2ZSB0byB3YWl0IGZvciB1cHRvIDUgYnl0ZXMgb2YgZGF0YQorICAgICAgICAgICAgICAgICAgIDEgYnl0ZSBjaGlwIGFkZHJlc3Mrci93IGJpdCB0aGVuIGJjIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgb2YgZGF0YS4KKyAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMTApIGlzIDEgYml0IHRpbWUgYXQgMTAwa2h6CisgICAgICAgICAgICAgICAgICAgRG91YmxlZCBmb3Igc2xvcC4gMjAgaXMgdG9vIHNtYWxsLgorCQkqLworICAgICAgICAgICAgICAgIGk9Mio1Kjg7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHN0YXR1cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gaW44KElJQ19TVFMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgiZWllaW8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSAoMTApOworICAgICAgICAgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKChzdGF0dXMgJiBJSUNfU1RTX1BUKSAmJiAhKHN0YXR1cyAmIElJQ19TVFNfRVJSKQorCQkJICYmIChpPjApKTsKKworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBJSUNfU1RTX0VSUikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gSUlDX05PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGluOCAoSUlDX0VYVFNUUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3N0IGFyYml0cmF0aW9uPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIElJQ19FWFRTVFNfTEEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IElJQ19OT0tfTEE7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNvbXBsZXRlIHRyYW5zZmVyPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIElJQ19FWFRTVFNfSUNUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBJSUNfTk9LX0lDVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zZmVyIGFib3J0ZWQ/ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgSUlDX0VYVFNUU19YRlJBKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBJSUNfTk9LX1hGUkE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggc3RhdHVzICYgSUlDX1NUU19QVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gSUlDX05PS19UT1VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBDb21tYW5kIGlzIHJlYWRpbmcgPT4gZ2V0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIGlmICgocmVhZGluZykgJiYgKHJlc3VsdCA9PSBJSUNfT0spKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBcmUgdGhlcmUgZGF0YSBpbiBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBJSUNfU1RTX01EQlMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVuIGlmIHdlIGhhdmUgZGF0YSB3ZSBoYXZlIHRvIHdhaXQgNE9QQiBjbG9ja3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaXQgdG8gaGl0IHRoZSBmcm9udCBvZiB0aGUgRklGTywgYWZ0ZXIgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIGNhbiBqdXN0IHJlYWQuIFdlIHNob3VsZCBjaGVjayBYRkNOVCBoZXJlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBGSUZPIGlzIGZ1bGwgdGhlcmUgaXMgbm8gbmVlZCB0byB3YWl0LgorCQkJCSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSAoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxiYztqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJbdHJhbitqXSA9IGluOChJSUNfTURCVUYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoImVpZWlvIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBJSUNfTk9LX0RBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNyZWcgPSAwOworICAgICAgICAgICAgICAgIHRyYW4rPWJjOworICAgICAgICAgICAgICAgIGlmKCBwdHIgPT0gYWRkciAmJiB0cmFuID09IGNudCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IGRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBjbnQgPSBkYXRhX2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGluZyA9IGNtZF90eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJlYWRpbmcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVnID0gSUlDX0NOVExfUlBTVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZXN1bHQpOworfQorCitpbnQgaTJjX3Byb2JlICh1Y2hhciBjaGlwKQoreworCXVjaGFyIGJ1ZlsxXTsKKworCWJ1ZlswXSA9IDA7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2hhdCBpcyBuZWVkZWQgaXMgdG8gc2VuZCB0aGUgY2hpcCBhZGRyZXNzIGFuZCB2ZXJpZnkgdGhhdCB0aGUKKyAgICAgICAgICogYWRkcmVzcyB3YXMgPEFDSz5lZCAoaS5lLiB0aGVyZSB3YXMgYSBjaGlwIGF0IHRoYXQgYWRkcmVzcyB3aGljaAorICAgICAgICAgKiBkcm92ZSB0aGUgZGF0YSBsaW5lIGxvdykuCisgICAgICAgICAqLworICAgICAgICByZXR1cm4oaTJjX3RyYW5zZmVyICgxLCBjaGlwIDw8IDEsIDAsMCwgYnVmLCAxKSAhPSAwKTsKK30KKworCisKK2ludCBpMmNfcmVhZCAodWNoYXIgY2hpcCwgdWludCBhZGRyLCBpbnQgYWxlbiwgdWNoYXIgKiBidWZmZXIsIGludCBsZW4pCit7CisgICAgICAgIHVjaGFyIHhhZGRyWzRdOworICAgICAgICBpbnQgcmV0OworCisJaWYgKCBhbGVuID4gNCApIHsKKwkJcHJpbnRmICgiSTJDIHJlYWQ6IGFkZHIgbGVuICVkIG5vdCBzdXBwb3J0ZWRcbiIsIGFsZW4pOworCQlyZXR1cm4gMTsKKwl9CisKKyAgICAgICAgaWYgKCBhbGVuID4gMCApIHsKKyAgICAgICAgICAgICAgICB4YWRkclswXSA9IChhZGRyID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgeGFkZHJbMV0gPSAoYWRkciA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgICAgIHhhZGRyWzJdID0gKGFkZHIgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgICAgIHhhZGRyWzNdID0gYWRkciAmIDB4RkY7CisgICAgICAgIH0KKworCisjaWZkZWYgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVworCS8qCisgICAgICAgICAqIEVFUFJPTSBjaGlwcyB0aGF0IGltcGxlbWVudCAiYWRkcmVzcyBvdmVyZmxvdyIgYXJlIG9uZXMKKyAgICAgICAgICogbGlrZSBDYXRhbHlzdCAyNFdDMDQvMDgvMTYgd2hpY2ggaGFzIDkvMTAvMTEgYml0cyBvZgorICAgICAgICAgKiBhZGRyZXNzIGFuZCB0aGUgZXh0cmEgYml0cyBlbmQgdXAgaW4gdGhlICJjaGlwIGFkZHJlc3MiCisgICAgICAgICAqIGJpdCBzbG90cy4gVGhpcyBtYWtlcyBhIDI0V0MwOCAoMUtieXRlKSBjaGlwIGxvb2sgbGlrZQorICAgICAgICAgKiBmb3VyIDI1NiBieXRlIGNoaXBzLgorCSAqCisgICAgICAgICAqIE5vdGUgdGhhdCB3ZSBjb25zaWRlciB0aGUgbGVuZ3RoIG9mIHRoZSBhZGRyZXNzIGZpZWxkIHRvCisgICAgICAgICAqIHN0aWxsIGJlIG9uZSBieXRlIGJlY2F1c2UgdGhlIGV4dHJhIGFkZHJlc3MgYml0cyBhcmUKKyAgICAgICAgICogaGlkZGVuIGluIHRoZSBjaGlwIGFkZHJlc3MuCisJICovCisgICAgICAgIGlmKCBhbGVuID4gMCApCisgICAgICAgICAgICAgICAgY2hpcCB8PSAoKGFkZHIgPj4gKGFsZW4gKiA4KSkgJiBDRkdfSTJDX0VFUFJPTV9BRERSX09WRVJGTE9XKTsKKyNlbmRpZgorICAgICAgICBpZiggKHJldCA9IGkyY190cmFuc2ZlciggMSwgY2hpcDw8MSwgJnhhZGRyWzQtYWxlbl0sIGFsZW4sIGJ1ZmZlciwgbGVuICkpICE9IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoICJJMmMgcmVhZDogZmFpbGVkICVkXG4iLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworfQorCitpbnQgaTJjX3dyaXRlICh1Y2hhciBjaGlwLCB1aW50IGFkZHIsIGludCBhbGVuLCB1Y2hhciAqIGJ1ZmZlciwgaW50IGxlbikKK3sKKyAgICAgICAgdWNoYXIgeGFkZHJbNF07CisKKwlpZiAoIGFsZW4gPiA0ICkgeworCQlwcmludGYgKCJJMkMgd3JpdGU6IGFkZHIgbGVuICVkIG5vdCBzdXBwb3J0ZWRcbiIsIGFsZW4pOworCQlyZXR1cm4gMTsKKworCX0KKyAgICAgICAgaWYgKCBhbGVuID4gMCApIHsKKyAgICAgICAgICAgICAgICB4YWRkclswXSA9IChhZGRyID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgeGFkZHJbMV0gPSAoYWRkciA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgICAgIHhhZGRyWzJdID0gKGFkZHIgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgICAgIHhhZGRyWzNdID0gYWRkciAmIDB4RkY7CisgICAgICAgIH0KKworI2lmZGVmIENGR19JMkNfRUVQUk9NX0FERFJfT1ZFUkZMT1cKKwkvKgorICAgICAgICAgKiBFRVBST00gY2hpcHMgdGhhdCBpbXBsZW1lbnQgImFkZHJlc3Mgb3ZlcmZsb3ciIGFyZSBvbmVzCisgICAgICAgICAqIGxpa2UgQ2F0YWx5c3QgMjRXQzA0LzA4LzE2IHdoaWNoIGhhcyA5LzEwLzExIGJpdHMgb2YKKyAgICAgICAgICogYWRkcmVzcyBhbmQgdGhlIGV4dHJhIGJpdHMgZW5kIHVwIGluIHRoZSAiY2hpcCBhZGRyZXNzIgorICAgICAgICAgKiBiaXQgc2xvdHMuIFRoaXMgbWFrZXMgYSAyNFdDMDggKDFLYnl0ZSkgY2hpcCBsb29rIGxpa2UKKyAgICAgICAgICogZm91ciAyNTYgYnl0ZSBjaGlwcy4KKwkgKgorICAgICAgICAgKiBOb3RlIHRoYXQgd2UgY29uc2lkZXIgdGhlIGxlbmd0aCBvZiB0aGUgYWRkcmVzcyBmaWVsZCB0bworICAgICAgICAgKiBzdGlsbCBiZSBvbmUgYnl0ZSBiZWNhdXNlIHRoZSBleHRyYSBhZGRyZXNzIGJpdHMgYXJlCisgICAgICAgICAqIGhpZGRlbiBpbiB0aGUgY2hpcCBhZGRyZXNzLgorCSAqLworICAgICAgICBpZiggYWxlbiA+IDAgKQorICAgICAgICAgICAgICAgIGNoaXAgfD0gKChhZGRyID4+IChhbGVuICogOCkpICYgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVyk7CisjZW5kaWYKKworICAgICAgICByZXR1cm4gKGkyY190cmFuc2ZlciggMCwgY2hpcDw8MSwgJnhhZGRyWzQtYWxlbl0sIGFsZW4sIGJ1ZmZlciwgbGVuICkgIT0gMCk7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfSEFSRF9JMkMgKi8KZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvc2RyYW0uYyBiL2NwdS9wcGM0eHgvc2RyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjRiZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L3BwYzR4eC9zZHJhbS5jCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTdGVmYW4gUm9lc2UsIGVzZCBnbWJoIGdlcm1hbnksIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHBwYzR4eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworCisjaWZkZWYgQ09ORklHX1NEUkFNX0JBTkswCisKKworI2RlZmluZSBNQUdJQzAgMHgwMDAwMDAwMAorI2RlZmluZSBNQUdJQzEgMHgxMTExMTExMQorI2RlZmluZSBNQUdJQzIgMHgyMjIyMjIyMgorI2RlZmluZSBNQUdJQzMgMHgzMzMzMzMzMworI2RlZmluZSBNQUdJQzQgMHg0NDQ0NDQ0NAorCisjZGVmaW5lIEFERFJfWkVSTyAweDAwMDAwMDAwCisjZGVmaW5lIEFERFJfNDAwICAweDAwMDAwNDAwCisjZGVmaW5lIEFERFJfMDhNQiAweDAwODAwMDAwCisjZGVmaW5lIEFERFJfMTZNQiAweDAxMDAwMDAwCisjZGVmaW5lIEFERFJfMzJNQiAweDAyMDAwMDAwCisjZGVmaW5lIEFERFJfNjRNQiAweDA0MDAwMDAwCisKKyNkZWZpbmUgbXRzZHJhbTAocmVnLCBkYXRhKSAgbXRkY3IobWVtY2ZnYSxyZWcpO210ZGNyKG1lbWNmZ2QsZGF0YSkKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgc2RyYW1faW5pdCh2b2lkKQoreworCXVsb25nIHNwZWVkOworCXVsb25nIHNkdHIxOworCXVsb25nIHJ0cjsKKworCS8qCisJICogRGV0ZXJtaW5lIFNEUkFNIHNwZWVkCisJICovCisJc3BlZWQgPSBnZXRfYnVzX2ZyZXEoMCk7IC8qIHBhcmFtZXRlciBub3QgdXNlZCBvbiBwcGM0eHggKi8KKworCS8qCisJICogU3VwcG9ydCBmb3IgMTAwTUh6IGFuZCAxMzNNSHogU0RSQU0KKwkgKi8KKwlpZiAoc3BlZWQgPiAxMDAwMDAwMDApIHsKKwkJLyoKKwkJICogMTMzIE1IeiBTRFJBTQorCQkgKi8KKwkJc2R0cjEgPSAweDAxMDc0MDE1OworCQlydHIgPSAweDA3ZjAwMDAwOworCX0gZWxzZSB7CisJCS8qCisJCSAqIGRlZmF1bHQ6IDEwMCBNSHogU0RSQU0KKwkJICovCisJCXNkdHIxID0gMHgwMDg2NDAwZDsKKwkJcnRyID0gMHgwNWYwMDAwMDsKKwl9CisKKwkvKgorCSAqIFNldCBNQjBDRiBmb3IgYmFuayAwLiAoMC02NE1CKSBBZGRyZXNzIE1vZGUgMyBzaW5jZSAxM3g5KDQpCisJICovCisJbXRzZHJhbTAobWVtX21iMGNmLCAweDAwMDg0MDAxKTsKKworCW10c2RyYW0wKG1lbV9zZHRyMSwgc2R0cjEpOworCW10c2RyYW0wKG1lbV9ydHIsIHJ0cik7CisKKwkvKgorCSAqIFdhaXQgZm9yIDIwMHVzCisJICovCisJdWRlbGF5KDIwMCk7CisKKwkvKgorCSAqIFNldCBtZW1vcnkgY29udHJvbGxlciBvcHRpb25zIHJlZywgTUNPUFQxLgorCSAqIFNldCBEQ19FTiB0byAnMScgYW5kIEJSRF9QUkYgdG8gJzAxJyBmb3IgMTYgYnl0ZSBQTEIgQnVyc3QKKwkgKiByZWFkL3ByZWZldGNoLgorCSAqLworCW10c2RyYW0wKG1lbV9tY29wdDEsIDB4ODA4MDAwMDApOworCisJLyoKKwkgKiBXYWl0IGZvciAxMG1zCisJICovCisJdWRlbGF5KDEwMDAwKTsKKworCS8qCisJICogVGVzdCBpZiA2NCBNQnl0ZSBhcmUgZXF1aXBwZWQgKG1pcnJvciB0ZXN0KQorCSAqLworCSoodm9sYXRpbGUgdWxvbmcgKilBRERSX1pFUk8gPSBNQUdJQzA7CisJKih2b2xhdGlsZSB1bG9uZyAqKUFERFJfMDhNQiA9IE1BR0lDMTsKKwkqKHZvbGF0aWxlIHVsb25nICopQUREUl8xNk1CID0gTUFHSUMyOworCSoodm9sYXRpbGUgdWxvbmcgKilBRERSXzMyTUIgPSBNQUdJQzM7CisKKwlpZiAoKCoodm9sYXRpbGUgdWxvbmcgKilBRERSX1pFUk8gPT0gTUFHSUMwKSAmJgorCSAgICAoKih2b2xhdGlsZSB1bG9uZyAqKUFERFJfMDhNQiA9PSBNQUdJQzEpICYmCisJICAgICgqKHZvbGF0aWxlIHVsb25nICopQUREUl8xNk1CID09IE1BR0lDMikpIHsKKwkJLyoKKwkJICogT0ssIDY0TUIgZGV0ZWN0ZWQgLT4gYWxsIGRvbmUKKwkJICovCisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIE5vdyB0ZXN0IGZvciAzMiBNQnl0ZS4uLgorCSAqLworCisgICAgICAgIC8qCisJICogRGlzYWJsZSBtZW1vcnkgY29udHJvbGxlci4KKwkgKi8KKwltdHNkcmFtMChtZW1fbWNvcHQxLCAweDAwMDAwMDAwKTsKKworCS8qCisJICogU2V0IE1CMENGIGZvciBiYW5rIDAuICgwLTMyTUIpIEFkZHJlc3MgTW9kZSAyIHNpbmNlIDEyeDkoNCkKKwkgKi8KKwltdHNkcmFtMChtZW1fbWIwY2YsIDB4MDAwNjIwMDEpOworCisJLyoKKwkgKiBTZXQgbWVtb3J5IGNvbnRyb2xsZXIgb3B0aW9ucyByZWcsIE1DT1BUMS4KKwkgKiBTZXQgRENfRU4gdG8gJzEnIGFuZCBCUkRfUFJGIHRvICcwMScgZm9yIDE2IGJ5dGUgUExCIEJ1cnN0CisJICogcmVhZC9wcmVmZXRjaC4KKwkgKi8KKwltdHNkcmFtMChtZW1fbWNvcHQxLCAweDgwODAwMDAwKTsKKworCS8qCisJICogV2FpdCBmb3IgMTBtcworCSAqLworCXVkZWxheSgxMDAwMCk7CisKKwkvKgorCSAqIFRlc3QgaWYgMzIgTUJ5dGUgYXJlIGVxdWlwcGVkIChtaXJyb3IgdGVzdCkKKwkgKi8KKwkqKHZvbGF0aWxlIHVsb25nICopQUREUl9aRVJPID0gTUFHSUMwOworCSoodm9sYXRpbGUgdWxvbmcgKilBRERSXzQwMCAgPSBNQUdJQzE7CisJKih2b2xhdGlsZSB1bG9uZyAqKUFERFJfMDhNQiA9IE1BR0lDMjsKKwkqKHZvbGF0aWxlIHVsb25nICopQUREUl8xNk1CID0gTUFHSUMzOworCisJaWYgKCgqKHZvbGF0aWxlIHVsb25nICopQUREUl9aRVJPID09IE1BR0lDMCkgJiYKKwkgICAgKCoodm9sYXRpbGUgdWxvbmcgKilBRERSXzQwMCAgPT0gTUFHSUMxKSAmJgorCSAgICAoKih2b2xhdGlsZSB1bG9uZyAqKUFERFJfMDhNQiA9PSBNQUdJQzIpKSB7CisJCS8qCisJCSAqIE9LLCAzMk1CIGRldGVjdGVkIC0+IGFsbCBkb25lCisJCSAqLworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBTZXR1cCBmb3IgMTYgTUJ5dGUuLi4KKwkgKi8KKworICAgICAgICAvKgorCSAqIERpc2FibGUgbWVtb3J5IGNvbnRyb2xsZXIuCisJICovCisJbXRzZHJhbTAobWVtX21jb3B0MSwgMHgwMDAwMDAwMCk7CisKKwkvKgorCSAqIFNldCBNQjBDRiBmb3IgYmFuayAwLiAoMC0xNk1CKSBBZGRyZXNzIE1vZGUgNCBzaW5jZSAxMng4KDQpCisJICovCisJbXRzZHJhbTAobWVtX21iMGNmLCAweDAwMDQ2MDAxKTsKKworCS8qCisJICogU2V0IG1lbW9yeSBjb250cm9sbGVyIG9wdGlvbnMgcmVnLCBNQ09QVDEuCisJICogU2V0IERDX0VOIHRvICcxJyBhbmQgQlJEX1BSRiB0byAnMDEnIGZvciAxNiBieXRlIFBMQiBCdXJzdAorCSAqIHJlYWQvcHJlZmV0Y2guCisJICovCisJbXRzZHJhbTAobWVtX21jb3B0MSwgMHg4MDgwMDAwMCk7CisKKwkvKgorCSAqIFdhaXQgZm9yIDEwbXMKKwkgKi8KKwl1ZGVsYXkoMTAwMDApOworfQorCisjZW5kaWYgLyogQ09ORklHX1NEUkFNX0JBTkswICovCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L3NwZWVkLmMgYi9jcHUvcHBjNHh4L3NwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0MTUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9wcGM0eHgvc3BlZWQuYwpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwYzR4eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE9ORV9CSUxMSU9OICAgICAgICAxMDAwMDAwMDAwCisKKworI2lmIGRlZmluZWQoQ09ORklHXzQwNUdQKSB8fCBkZWZpbmVkKENPTkZJR180MDVDUikKKwordm9pZCBnZXRfc3lzX2luZm8gKFBQQzQwNV9TWVNfSU5GTyAqIHN5c0luZm8pCit7CisJdW5zaWduZWQgbG9uZyBwbGxtcjsKKwl1bnNpZ25lZCBsb25nIHN5c0Nsa1BlcmlvZFBzID0gT05FX0JJTExJT04gLyAoQ09ORklHX1NZU19DTEtfRlJFUSAvIDEwMDApOworCXVpbnQgcHZyID0gZ2V0X3B2cigpOworCXVuc2lnbmVkIGxvbmcgcHNyOworCXVuc2lnbmVkIGxvbmcgbTsKKworCS8qCisJICogUmVhZCBQTEwgTW9kZSByZWdpc3RlcgorCSAqLworCXBsbG1yID0gbWZkY3IgKHBsbG1kKTsKKworCS8qCisJICogUmVhZCBQaW4gU3RyYXBwaW5nIHJlZ2lzdGVyCisJICovCisJcHNyID0gbWZkY3IgKHN0cmFwKTsKKworCS8qCisJICogRGV0ZXJtaW5lIEZXRF9ESVYuCisJICovCisJc3lzSW5mby0+cGxsRndkRGl2ID0gOCAtICgocGxsbXIgJiBQTExNUl9GV0RfRElWX01BU0spID4+IDI5KTsKKworCS8qCisJICogRGV0ZXJtaW5lIEZCS19ESVYuCisJICovCisJc3lzSW5mby0+cGxsRmJrRGl2ID0gKChwbGxtciAmIFBMTE1SX0ZCX0RJVl9NQVNLKSA+PiAyNSk7CisJaWYgKHN5c0luZm8tPnBsbEZia0RpdiA9PSAwKSB7CisJCXN5c0luZm8tPnBsbEZia0RpdiA9IDE2OworCX0KKworCS8qCisJICogRGV0ZXJtaW5lIFBMQl9ESVYuCisJICovCisJc3lzSW5mby0+cGxsUGxiRGl2ID0gKChwbGxtciAmIFBMTE1SX0NQVV9UT19QTEJfTUFTSykgPj4gMTcpICsgMTsKKworCS8qCisJICogRGV0ZXJtaW5lIFBDSV9ESVYuCisJICovCisJc3lzSW5mby0+cGxsUGNpRGl2ID0gKChwbGxtciAmIFBMTE1SX1BDSV9UT19QTEJfTUFTSykgPj4gMTMpICsgMTsKKworCS8qCisJICogRGV0ZXJtaW5lIEVYVEJVU19ESVYuCisJICovCisJc3lzSW5mby0+cGxsRXh0QnVzRGl2ID0gKChwbGxtciAmIFBMTE1SX0VYQl9UT19QTEJfTUFTSykgPj4gMTEpICsgMjsKKworCS8qCisJICogRGV0ZXJtaW5lIE9QQl9ESVYuCisJICovCisJc3lzSW5mby0+cGxsT3BiRGl2ID0gKChwbGxtciAmIFBMTE1SX09QQl9UT19QTEJfTUFTSykgPj4gMTUpICsgMTsKKworCS8qCisJICogQ2hlY2sgaWYgUFBDNDA1R1ByIHVzZWQgKG1hc2sgbWlub3IgcmV2aXNpb24gZmllbGQpCisJICovCisJaWYgKChwdnIgJiAweGZmZmZmZmYwKSA9PSAoUFZSXzQwNUdQUl9SQSAmIDB4ZmZmZmZmZjApKSB7CisJCS8qCisJCSAqIERldGVybWluZSBGV0RfRElWIEIgKG9ubHkgUFBDNDA1R1ByIHdpdGggbmV3IG1vZGUgc3RyYXBwaW5nKS4KKwkJICovCisJCXN5c0luZm8tPnBsbEZ3ZERpdkIgPSA4IC0gKHBsbG1yICYgUExMTVJfRldEQl9ESVZfTUFTSyk7CisKKwkJLyoKKwkJICogRGV0ZXJtaW5lIGZhY3RvciBtIGRlcGVuZGluZyBvbiBQTEwgZmVlZGJhY2sgY2xvY2sgc291cmNlCisJCSAqLworCQlpZiAoIShwc3IgJiBQU1JfUENJX0FTWU5DX0VOKSkgeworCQkJaWYgKHBzciAmIFBTUl9ORVdfTU9ERV9FTikgeworCQkJCS8qCisJCQkJICogc3luYyBwY2kgY2xvY2sgdXNlZCBhcyBmZWVkYmFjayAobmV3IG1vZGUpCisJCQkJICovCisJCQkJbSA9IDEgKiBzeXNJbmZvLT5wbGxGd2REaXZCICogMiAqIHN5c0luZm8tPnBsbFBjaURpdjsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBzeW5jIHBjaSBjbG9jayB1c2VkIGFzIGZlZWRiYWNrIChsZWdhY3kgbW9kZSkKKwkJCQkgKi8KKwkJCQltID0gMSAqIHN5c0luZm8tPnBsbEZ3ZERpdkIgKiBzeXNJbmZvLT5wbGxQbGJEaXYgKiBzeXNJbmZvLT5wbGxQY2lEaXY7CisJCQl9CisJCX0gZWxzZSBpZiAocHNyICYgUFNSX05FV19NT0RFX0VOKSB7CisJCQlpZiAocHNyICYgUFNSX1BFUkNMS19TWU5DX01PREVfRU4pIHsKKwkJCQkvKgorCQkJCSAqIFBlckNsayB1c2VkIGFzIGZlZWRiYWNrIChuZXcgbW9kZSkKKwkJCQkgKi8KKwkJCQltID0gMSAqIHN5c0luZm8tPnBsbEZ3ZERpdkIgKiAyICogc3lzSW5mby0+cGxsRXh0QnVzRGl2OworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIENQVSBjbG9jayB1c2VkIGFzIGZlZWRiYWNrIChuZXcgbW9kZSkKKwkJCQkgKi8KKwkJCQltID0gc3lzSW5mby0+cGxsRmJrRGl2ICogc3lzSW5mby0+cGxsRndkRGl2OworCQkJfQorCQl9IGVsc2UgaWYgKHN5c0luZm8tPnBsbEV4dEJ1c0RpdiA9PSBzeXNJbmZvLT5wbGxGYmtEaXYpIHsKKwkJCS8qCisJCQkgKiBQZXJDbGsgdXNlZCBhcyBmZWVkYmFjayAobGVnYWN5IG1vZGUpCisJCQkgKi8KKwkJCW0gPSAxICogc3lzSW5mby0+cGxsRndkRGl2QiAqIHN5c0luZm8tPnBsbFBsYkRpdiAqIHN5c0luZm8tPnBsbEV4dEJ1c0RpdjsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBQTEIgY2xvY2sgdXNlZCBhcyBmZWVkYmFjayAobGVnYWN5IG1vZGUpCisJCQkgKi8KKwkJCW0gPSBzeXNJbmZvLT5wbGxGYmtEaXYgKiBzeXNJbmZvLT5wbGxGd2REaXZCICogc3lzSW5mby0+cGxsUGxiRGl2OworCQl9CisKKwkJc3lzSW5mby0+ZnJlcVZDT01oeiA9ICgxMDAwMDAwICogbSkgLyBzeXNDbGtQZXJpb2RQczsKKwkJc3lzSW5mby0+ZnJlcVByb2Nlc3NvciA9IChzeXNJbmZvLT5mcmVxVkNPTWh6ICogMTAwMDAwMCkgLyBzeXNJbmZvLT5wbGxGd2REaXY7CisJCXN5c0luZm8tPmZyZXFQTEIgPSAoc3lzSW5mby0+ZnJlcVZDT01oeiAqIDEwMDAwMDApIC8KKwkJCShzeXNJbmZvLT5wbGxGd2REaXZCICogc3lzSW5mby0+cGxsUGxiRGl2KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBDaGVjayBwbGxGd2REaXYgdG8gc2VlIGlmIHJ1bm5pbmcgaW4gYnlwYXNzIG1vZGUgd2hlcmUgdGhlIENQVSBzcGVlZAorCQkgKiBpcyBlcXVhbCB0byB0aGUgNDA1R1AgU1lTX0NMS19GUkVRLiBJZiBub3QgaW4gYnlwYXNzIG1vZGUsIGNoZWNrIFZDTworCQkgKiB0byBtYWtlIHN1cmUgaXQgaXMgd2l0aGluIHRoZSBwcm9wZXIgcmFuZ2UuCisJCSAqICAgIHNwZWM6ICAgIFZDTyA9IFNZU19DTE9DSyB4IEZCS0RJViB4IFBMQkRJViB4IEZXRERJVgorCQkgKiBOb3RlIGZyZXFWQ08gaXMgY2FsY3VsYXRlZCBpbiBNaHogdG8gYXZvaWQgZXJyb3JzIGludHJvZHVjZWQgYnkgcm91bmRpbmcuCisJCSAqLworCQlpZiAoc3lzSW5mby0+cGxsRndkRGl2ID09IDEpIHsKKwkJCXN5c0luZm8tPmZyZXFQcm9jZXNzb3IgPSBDT05GSUdfU1lTX0NMS19GUkVROworCQkJc3lzSW5mby0+ZnJlcVBMQiA9IENPTkZJR19TWVNfQ0xLX0ZSRVEgLyBzeXNJbmZvLT5wbGxQbGJEaXY7CisJCX0gZWxzZSB7CisJCQlzeXNJbmZvLT5mcmVxVkNPTWh6ID0gKCAxMDAwMDAwICoKKwkJCQkJCXN5c0luZm8tPnBsbEZ3ZERpdiAqCisJCQkJCQlzeXNJbmZvLT5wbGxGYmtEaXYgKgorCQkJCQkJc3lzSW5mby0+cGxsUGxiRGl2CisJCQkJKSAvIHN5c0Nsa1BlcmlvZFBzOworCQkJaWYgKHN5c0luZm8tPmZyZXFWQ09NaHogPj0gVkNPX01JTgorCQkJICAgICYmIHN5c0luZm8tPmZyZXFWQ09NaHogPD0gVkNPX01BWCkgeworCQkJCXN5c0luZm8tPmZyZXFQTEIgPSAoT05FX0JJTExJT04gLworCQkJCQkJICAgICgoc3lzQ2xrUGVyaW9kUHMgKiAxMCkgLworCQkJCQkJICAgICBzeXNJbmZvLT5wbGxGYmtEaXYpKSAqIDEwMDAwOworCQkJCXN5c0luZm8tPmZyZXFQcm9jZXNzb3IgPSBzeXNJbmZvLT5mcmVxUExCICogc3lzSW5mby0+cGxsUGxiRGl2OworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYgKCJcbkludmFsaWQgVkNPIGZyZXF1ZW5jeSBjYWxjdWxhdGVkIDogICVsZCBNSHogXGFcbiIsCisJCQkJCXN5c0luZm8tPmZyZXFWQ09NaHopOworCQkJCXByaW50ZiAoIkl0IG11c3QgYmUgYmV0d2VlbiAlZC0lZCBNSHogXGFcbiIsCisJCQkJCVZDT19NSU4sIFZDT19NQVgpOworCQkJCXByaW50ZiAoIlBMTCBNb2RlIHJlZyAgICAgICAgICAgOiAgJTguOGx4XGFcbiIsCisJCQkJCXBsbG1yKTsKKwkJCQloYW5nICgpOworCQkJfQorCQl9CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X09QQl9mcmVxCisgKiByZXR1cm4gT1BCIGJ1cyBmcmVxIGluIEh6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgZ2V0X09QQl9mcmVxICh2b2lkKQoreworCXVsb25nIHZhbCA9IDA7CisKKwlQUEM0MDVfU1lTX0lORk8gc3lzX2luZm87CisKKwlnZXRfc3lzX2luZm8gKCZzeXNfaW5mbyk7CisJdmFsID0gc3lzX2luZm8uZnJlcVBMQiAvIHN5c19pbmZvLnBsbE9wYkRpdjsKKworCXJldHVybiB2YWw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfUENJX2ZyZXEKKyAqIHJldHVybiBQQ0kgYnVzIGZyZXEgaW4gSHoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBnZXRfUENJX2ZyZXEgKHZvaWQpCit7CisJdWxvbmcgdmFsOworCVBQQzQwNV9TWVNfSU5GTyBzeXNfaW5mbzsKKworCWdldF9zeXNfaW5mbyAoJnN5c19pbmZvKTsKKwl2YWwgPSBzeXNfaW5mby5mcmVxUExCIC8gc3lzX2luZm8ucGxsUGNpRGl2OworCXJldHVybiB2YWw7Cit9CisKKworI2VsaWYgZGVmaW5lZChDT05GSUdfNDQwKQordm9pZCBnZXRfc3lzX2luZm8gKHN5c19pbmZvX3QgKiBzeXNJbmZvKQoreworCXVuc2lnbmVkIGxvbmcgc3RycDA7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCXVuc2lnbmVkIGxvbmcgbTsKKworCS8qIEV4dHJhY3QgY29uZmlndXJlZCBkaXZpc29ycyAqLworCXN0cnAwID0gbWZkY3IoIGNwYzBfc3RycDAgKTsKKwlzeXNJbmZvLT5wbGxGd2REaXZBID0gOCAtICgoc3RycDAgJiBQTExTWVMwX0ZXRF9ESVZfQV9NQVNLKSA+PiAxNSk7CisJc3lzSW5mby0+cGxsRndkRGl2QiA9IDggLSAoKHN0cnAwICYgUExMU1lTMF9GV0RfRElWX0JfTUFTSykgPj4gMTIpOworCXRlbXAgPSAoc3RycDAgJiBQTExTWVMwX0ZCX0RJVl9NQVNLKSA+PiAxODsKKwlzeXNJbmZvLT5wbGxGYmtEaXYgPSB0ZW1wID8gdGVtcCA6IDE2OworCXN5c0luZm8tPnBsbE9wYkRpdiA9IDEgKyAoKHN0cnAwICYgUExMU1lTMF9PUEJfRElWX01BU0spID4+IDEwKTsKKwlzeXNJbmZvLT5wbGxFeHRCdXNEaXYgPSAxICsgKChzdHJwMCAmIFBMTFNZUzBfRVBCX0RJVl9NQVNLKSA+PiA4KTsKKworCS8qIENhbGN1bGF0ZSAnTScgYmFzZWQgb24gZmVlZGJhY2sgc291cmNlICovCisJaWYoIHN0cnAwICYgUExMU1lTMF9FWFRTTF9NQVNLICkKKwkJbSA9IHN5c0luZm8tPnBsbEV4dEJ1c0RpdiAqIHN5c0luZm8tPnBsbE9wYkRpdiAqIHN5c0luZm8tPnBsbEZ3ZERpdkI7CisJZWxzZQorCQltID0gc3lzSW5mby0+cGxsRmJrRGl2ICogc3lzSW5mby0+cGxsRndkRGl2QTsKKworCS8qIE5vdyBjYWxjdWxhdGUgdGhlIGluZGl2aWR1YWwgY2xvY2tzICovCisJc3lzSW5mby0+ZnJlcVZDT01oeiA9IChtICogQ09ORklHX1NZU19DTEtfRlJFUSkgKyAobT4+MSk7CisJc3lzSW5mby0+ZnJlcVByb2Nlc3NvciA9IHN5c0luZm8tPmZyZXFWQ09NaHovc3lzSW5mby0+cGxsRndkRGl2QTsKKwlzeXNJbmZvLT5mcmVxUExCID0gc3lzSW5mby0+ZnJlcVZDT01oei9zeXNJbmZvLT5wbGxGd2REaXZCOworICAgIGlmKCBnZXRfcHZyKCkgPT0gUFZSXzQ0MEdQX1JCICkgLyogUmV2IEIgZGl2cyBhbiBleHRyYSAyIC0tIGdlZXohICovCisgICAgICAgIHN5c0luZm8tPmZyZXFQTEIgPj49IDE7CisJc3lzSW5mby0+ZnJlcU9QQiA9IHN5c0luZm8tPmZyZXFQTEIvc3lzSW5mby0+cGxsT3BiRGl2OworCXN5c0luZm8tPmZyZXFFUEIgPSBzeXNJbmZvLT5mcmVxT1BCL3N5c0luZm8tPnBsbEV4dEJ1c0RpdjsKKworfQorCit1bG9uZyBnZXRfT1BCX2ZyZXEgKHZvaWQpCit7CisKKwlzeXNfaW5mb190IHN5c19pbmZvOworCWdldF9zeXNfaW5mbyAoJnN5c19pbmZvKTsKKwlyZXR1cm4gc3lzX2luZm8uZnJlcU9QQjsKK30KKworI2VsaWYgZGVmaW5lZChDT05GSUdfNDA1KQorCit2b2lkIGdldF9zeXNfaW5mbyAoc3lzX2luZm9fdCAqIHN5c0luZm8pIHsKKworCXN5c0luZm8tPmZyZXFWQ09NaHo9MzEyNTAwMDsKKwlzeXNJbmZvLT5mcmVxUHJvY2Vzc29yPTEyKjEwMDAqMTAwMDsKKwlzeXNJbmZvLT5mcmVxUExCPTUwKjEwMDAqMTAwMDsKKwlzeXNJbmZvLT5mcmVxUENJPTY2KjEwMDAqMTAwMDsKKworfQorCisjZW5kaWYKKworaW50IGdldF9jbG9ja3MgKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfNDA1R1ApIHx8IGRlZmluZWQoQ09ORklHXzQwNUNSKSB8fCBkZWZpbmVkKENPTkZJR180NDApIHx8IGRlZmluZWQoQ09ORklHXzQwNSkKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCXN5c19pbmZvX3Qgc3lzX2luZm87CisKKwlnZXRfc3lzX2luZm8gKCZzeXNfaW5mbyk7CisJZ2QtPmNwdV9jbGsgPSBzeXNfaW5mby5mcmVxUHJvY2Vzc29yOworCWdkLT5idXNfY2xrID0gc3lzX2luZm8uZnJlcVBMQjsKKworI2VuZGlmCS8qIGRlZmluZWQoQ09ORklHXzQwNUdQKSB8fCBkZWZpbmVkKENPTkZJR180MDVDUikgKi8KKworI2lmZGVmIENPTkZJR19JT1A0ODAKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWdkLT5jcHVfY2xrID0gNjYwMDAwMDA7CisJZ2QtPmJ1c19jbGsgPSA2NjAwMDAwMDsKKyNlbmRpZgorCXJldHVybiAoMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfYnVzX2ZyZXEKKyAqIHJldHVybiBQTEIgYnVzIGZyZXEgaW4gSHoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bG9uZyBnZXRfYnVzX2ZyZXEgKHVsb25nIGR1bW15KQoreworCXVsb25nIHZhbDsKKworI2lmIGRlZmluZWQoQ09ORklHXzQwNUdQKSB8fCBkZWZpbmVkKENPTkZJR180MDVDUikgfHwgZGVmaW5lZChDT05GSUdfNDA1KSB8fCBkZWZpbmVkKENPTkZJR180NDApCisJc3lzX2luZm9fdCBzeXNfaW5mbzsKKworCWdldF9zeXNfaW5mbyAoJnN5c19pbmZvKTsKKwl2YWwgPSBzeXNfaW5mby5mcmVxUExCOworCisjZWxpZiBkZWZpbmVkKENPTkZJR19JT1A0ODApCisKKwl2YWwgPSA2NjsKKworI2Vsc2UKKyMgZXJyb3IgZ2V0X2J1c19mcmVxKCkgbm90IGltcGxlbWVudGVkCisjZW5kaWYKKworCXJldHVybiB2YWw7Cit9CmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L3ZlY251bS5oIGIvY3B1L3BwYzR4eC92ZWNudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDkzYTVkCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L3BwYzR4eC92ZWNudW0uaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyogIENvcHlyaWdodCAoQykgMjAwMiBTY290dCBNY051dHQgPHNtY251dHRAYXJ0ZXN5bmNwLmNvbT4KKyoKKyogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyogcHJvamVjdC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyogTUEgMDIxMTEtMTMwNyBVU0EKKyovCisKKy8qCisgKiBJbnRlcnJ1cHQgdmVjdG9yIG51bWJlciBkZWZpbml0aW9ucyB0byBlYXNlIHRoZQorICogNDA1IC0tIDQ0MCBwb3J0aW5nIHBhaW4gOy0pCisgKgorICogTk9URTogVGhleSdyZSBub3QgYWxsIGhlcmUgeWV0IC4uLiB1cGRhdGUgYXMgbmVlZGVkLgorICoKKyAqLworCisjaWZuZGVmIF9WRUNOVU1TX0hfCisjZGVmaW5lIF9WRUNOVU1TX0hfCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisKKy8qIFVJQyAwICovCisjZGVmaW5lIFZFQ05VTV9VMCAgICAgICAgICAgMCAgICAgICAgICAgLyogVUFSVDAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fVTEgICAgICAgICAgIDEgICAgICAgICAgIC8qIFVBUlQxICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX0lJQzAgICAgICAgICAyICAgICAgICAgICAvKiBJSUMwICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9JSUMxICAgICAgICAgMyAgICAgICAgICAgLyogSUlDMSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fUElNICAgICAgICAgIDQgICAgICAgICAgIC8qIFBDSSBpbmJvdW5kIG1lc3NhZ2UgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX1BDUlcgICAgICAgICA1ICAgICAgICAgICAvKiBQQ0kgY29tbWFuZCByZWcgd3JpdGUgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9QUE0gICAgICAgICAgNiAgICAgICAgICAgLyogUENJIHBvd2VyIG1hbmFnZW1lbnQgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fTVNJMCAgICAgICAgIDcgICAgICAgICAgIC8qIFBDSSBNU0kgbGV2ZWwgMCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX01TSTEgICAgICAgICA4ICAgICAgICAgICAvKiBQQ0kgTVNJIGxldmVsIDAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9NU0kyICAgICAgICAgOSAgICAgICAgICAgLyogUENJIE1TSSBsZXZlbCAwICAgICAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fTVRFICAgICAgICAgIDEwICAgICAgICAgIC8qIE1BTCBUWEVPQiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX01SRSAgICAgICAgICAxMSAgICAgICAgICAvKiBNQUwgUlhFT0IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9EMCAgICAgICAgICAgMTIgICAgICAgICAgLyogRE1BIGNoYW5uZWwgMCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fRDEgICAgICAgICAgIDEzICAgICAgICAgIC8qIERNQSBjaGFubmVsIDEgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX0QyICAgICAgICAgICAxNCAgICAgICAgICAvKiBETUEgY2hhbm5lbCAyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9EMyAgICAgICAgICAgMTUgICAgICAgICAgLyogRE1BIGNoYW5uZWwgMyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fQ1QwICAgICAgICAgIDE4ICAgICAgICAgIC8qIEdQVCBjb21wYXJlIHRpbWVyIDAgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX0NUMSAgICAgICAgICAxOSAgICAgICAgICAvKiBHUFQgY29tcGFyZSB0aW1lciAxICAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9DVDIgICAgICAgICAgMjAgICAgICAgICAgLyogR1BUIGNvbXBhcmUgdGltZXIgMiAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fQ1QzICAgICAgICAgIDIxICAgICAgICAgIC8qIEdQVCBjb21wYXJlIHRpbWVyIDMgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX0NUNCAgICAgICAgICAyMiAgICAgICAgICAvKiBHUFQgY29tcGFyZSB0aW1lciA0ICAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9FSVIwICAgICAgICAgMjMgICAgICAgICAgLyogRXh0ZXJuYWwgaW50ZXJydXB0IDAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fRUlSMSAgICAgICAgIDI0ICAgICAgICAgIC8qIEV4dGVybmFsIGludGVycnVwdCAxICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX0VJUjIgICAgICAgICAyNSAgICAgICAgICAvKiBFeHRlcm5hbCBpbnRlcnJ1cHQgMiAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9FSVIzICAgICAgICAgMjYgICAgICAgICAgLyogRXh0ZXJuYWwgaW50ZXJydXB0IDMgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fRUlSNCAgICAgICAgIDI3ICAgICAgICAgIC8qIEV4dGVybmFsIGludGVycnVwdCA0ICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX0VJUjUgICAgICAgICAyOCAgICAgICAgICAvKiBFeHRlcm5hbCBpbnRlcnJ1cHQgNSAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9FSVI2ICAgICAgICAgMjkgICAgICAgICAgLyogRXh0ZXJuYWwgaW50ZXJydXB0IDYgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fVUlDMU5DICAgICAgIDMwICAgICAgICAgIC8qIFVJQzEgbm9uLWNyaXRpY2FsIGludGVycnVwdCAgKi8KKyNkZWZpbmUgVkVDTlVNX1VJQzFDICAgICAgICAzMSAgICAgICAgICAvKiBVSUMxIGNyaXRpY2FsIGludGVycnVwdCAgICAgICovCisKKy8qIFVJQyAxICovCisjZGVmaW5lIFZFQ05VTV9NUyAgICAgICAgICAgKDMyICsgMCApICAgLyogTUFMIFNFUlIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fVFhERSAgICAgICAgICgzMiArIDEgKSAgIC8qIE1BTCBUWERFICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX1JYREUgICAgICAgICAoMzIgKyAyICkgICAvKiBNQUwgUlhERSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9FVEgwICAgICAgICAgKDMyICsgMjgpICAgLyogRXRoZXJuZXQgMCBpbnRlcnJ1cHQgc3RhdHVzICAqLworI2RlZmluZSBWRUNOVU1fRVdVMCAgICAgICAgICgzMiArIDI5KSAgIC8qIEV0aGVybmV0IDAgd2FrZXVwICAgICAgICAgICAgKi8KKworI2Vsc2UgLyogIWRlZmluZWQoQ09ORklHXzQ0MCkgKi8KKworI2RlZmluZSBWRUNOVU1fVTAgICAgICAgICAgIDAgICAgICAgICAgIC8qIFVBUlQwICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX1UxICAgICAgICAgICAxICAgICAgICAgICAvKiBVQVJUMSAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9EMCAgICAgICAgICAgNSAgICAgICAgICAgLyogRE1BIGNoYW5uZWwgMCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fRDEgICAgICAgICAgIDYgICAgICAgICAgIC8qIERNQSBjaGFubmVsIDEgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX0QyICAgICAgICAgICA3ICAgICAgICAgICAvKiBETUEgY2hhbm5lbCAyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9EMyAgICAgICAgICAgOCAgICAgICAgICAgLyogRE1BIGNoYW5uZWwgMyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fRVdVMCAgICAgICAgIDkgICAgICAgICAgIC8qIEV0aGVybmV0IHdha2V1cCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX01TICAgICAgICAgICAxMCAgICAgICAgICAvKiBNQUwgU0VSUiAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9NVEUgICAgICAgICAgMTEgICAgICAgICAgLyogTUFMIFRYRU9CICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fTVJFICAgICAgICAgIDEyICAgICAgICAgIC8qIE1BTCBSWEVPQiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX1RYREUgICAgICAgICAxMyAgICAgICAgICAvKiBNQUwgVFhERSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9SWERFICAgICAgICAgMTQgICAgICAgICAgLyogTUFMIFJYREUgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fRVRIMCAgICAgICAgIDE1ICAgICAgICAgIC8qIEV0aGVybmV0IGludGVycnVwdCBzdGF0dXMgICAgKi8KKyNkZWZpbmUgVkVDTlVNX0VJUjAgICAgICAgICAyNSAgICAgICAgICAvKiBFeHRlcm5hbCBpbnRlcnJ1cHQgMCAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9FSVIxICAgICAgICAgMjYgICAgICAgICAgLyogRXh0ZXJuYWwgaW50ZXJydXB0IDEgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fRUlSMiAgICAgICAgIDI3ICAgICAgICAgIC8qIEV4dGVybmFsIGludGVycnVwdCAyICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX0VJUjMgICAgICAgICAyOCAgICAgICAgICAvKiBFeHRlcm5hbCBpbnRlcnJ1cHQgMyAgICAgICAgICovCisjZGVmaW5lIFZFQ05VTV9FSVI0ICAgICAgICAgMjkgICAgICAgICAgLyogRXh0ZXJuYWwgaW50ZXJydXB0IDQgICAgICAgICAqLworI2RlZmluZSBWRUNOVU1fRUlSNSAgICAgICAgIDMwICAgICAgICAgIC8qIEV4dGVybmFsIGludGVycnVwdCA1ICAgICAgICAgKi8KKyNkZWZpbmUgVkVDTlVNX0VJUjYgICAgICAgICAzMSAgICAgICAgICAvKiBFeHRlcm5hbCBpbnRlcnJ1cHQgNiAgICAgICAgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR180NDApICovCisKKyNlbmRpZiAvKiBfVkVDTlVNU19IXyAqLwpkaWZmIC0tZ2l0IGEvY3B1L3NhMTEwMC9NYWtlZmlsZSBiL2NwdS9zYTExMDAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5NTBkYQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9zYTExMDAvTWFrZWZpbGUKQEAgLTAsMCArMSw0MyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9IGxpYiQoQ1BVKS5hCisKK1NUQVJUCT0gc3RhcnQubworT0JKUwk9IHNlcmlhbC5vIGludGVycnVwdHMubyBjcHUubworCithbGw6CS5kZXBlbmQgJChTVEFSVCkgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpIGNydiAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLmRlcGVuZDoJTWFrZWZpbGUgJChTVEFSVDoubz0uUykgJChPQkpTOi5vPS5jKQorCQkkKENDKSAtTSAkKENGTEFHUykgJChTVEFSVDoubz0uUykgJChPQkpTOi5vPS5jKSA+ICRACisKK3NpbmNsdWRlIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY3B1L3hzY2FsZS9zZXJpYWwuYyBiL2NwdS94c2NhbGUvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzMDJhNwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS94c2NhbGUvc2VyaWFsLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDx3ZEBkZW54LmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFsZXggWnVlcGtlIDxhenVAc3lzZ28uZGU+CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IDIwMDAgMjAwMSBFcmlrIE1vdXcgKEouQS5LLk1vdXdAaXRzLnR1ZGVsZnQubmwpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKwordm9pZCBzZXJpYWxfc2V0YnJnICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJdW5zaWduZWQgaW50IHF1b3QgPSAwOworCisJaWYgKGdkLT5iYXVkcmF0ZSA9PSAxMjAwKQorCQlxdW90ID0gMTkyOworCWVsc2UgaWYgKGdkLT5iYXVkcmF0ZSA9PSA5NjAwKQorCQlxdW90ID0gOTY7CisJZWxzZSBpZiAoZ2QtPmJhdWRyYXRlID09IDE5MjAwKQorCQlxdW90ID0gNDg7CisJZWxzZSBpZiAoZ2QtPmJhdWRyYXRlID09IDM4NDAwKQorCQlxdW90ID0gMjQ7CisJZWxzZSBpZiAoZ2QtPmJhdWRyYXRlID09IDU3NjAwKQorCQlxdW90ID0gMTY7CisJZWxzZSBpZiAoZ2QtPmJhdWRyYXRlID09IDExNTIwMCkKKwkJcXVvdCA9IDg7CisJZWxzZQorCQloYW5nICgpOworCisjaWZkZWYgQ09ORklHX0ZGVUFSVAorCisJQ0tFTiB8PSBDS0VONl9GRlVBUlQ7CisKKwlGRklFUiA9IDA7CQkJCQkvKiBEaXNhYmxlIGZvciBub3cgKi8KKwlGRkZDUiA9IDA7CQkJCQkvKiBObyBmaWZvcyBlbmFibGVkICovCisKKwkvKiBzZXQgYmF1ZCByYXRlICovCisJRkZMQ1IgPSBMQ1JfV0xTMCB8IExDUl9XTFMxIHwgTENSX0RMQUI7CisJRkZETEwgPSBxdW90ICYgMHhmZjsKKwlGRkRMSCA9IHF1b3QgPj4gODsKKwlGRkxDUiA9IExDUl9XTFMwIHwgTENSX1dMUzE7CisKKwlGRklFUiA9IElFUl9VVUU7CQkJLyogRW5hYmxlIEZGVUFSVCAqLworCisjZWxpZiBDT05GSUdfU1RVQVJUCisjZXJyb3IgIkJhZDogbm90IGltcGxlbWVudGVkIHlldCEiCisjZWxzZQorI2Vycm9yICJCYWQ6IHlvdSBkaWRuJ3QgY29uZmlndXJlZCBzZXJpYWwgLi4uIgorI2VuZGlmCit9CisKKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIHNlcmlhbCBwb3J0IHdpdGggdGhlIGdpdmVuIGJhdWRyYXRlLiBUaGUgc2V0dGluZ3MKKyAqIGFyZSBhbHdheXMgOCBkYXRhIGJpdHMsIG5vIHBhcml0eSwgMSBzdG9wIGJpdCwgbm8gc3RhcnQgYml0cy4KKyAqCisgKi8KK2ludCBzZXJpYWxfaW5pdCAodm9pZCkKK3sKKwlzZXJpYWxfc2V0YnJnICgpOworCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogT3V0cHV0IGEgc2luZ2xlIGJ5dGUgdG8gdGhlIHNlcmlhbCBwb3J0LgorICovCit2b2lkIHNlcmlhbF9wdXRjIChjb25zdCBjaGFyIGMpCit7CisjaWZkZWYgQ09ORklHX0ZGVUFSVAorCS8qIHdhaXQgZm9yIHJvb20gaW4gdGhlIHR4IEZJRk8gb24gRkZVQVJUICovCisJd2hpbGUgKChGRkxTUiAmIExTUl9URU1UKSA9PSAwKTsKKworCUZGVEhSID0gYzsKKyNlbGlmIENPTkZJR19TVFVBUlQKKyNlbmRpZgorCisJLyogSWYgXG4sIGFsc28gZG8gXHIgKi8KKwlpZiAoYyA9PSAnXG4nKQorCQlzZXJpYWxfcHV0YyAoJ1xyJyk7Cit9CisKKy8qCisgKiBSZWFkIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgc2VyaWFsIHBvcnQuIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwCisgKiBvdGhlcndpc2UuIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIHN1Y2Nlc2Z1bGwsIHRoZSBjaGFyYWN0ZXIgcmVhZCBpcworICogd3JpdHRlbiBpbnRvIGl0cyBhcmd1bWVudCBjLgorICovCitpbnQgc2VyaWFsX3RzdGMgKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0ZGVUFSVAorCXJldHVybiBGRkxTUiAmIExTUl9EUjsKKyNlbGlmIENPTkZJR19TVFVBUlQKKyNlbmRpZgorfQorCisvKgorICogUmVhZCBhIHNpbmdsZSBieXRlIGZyb20gdGhlIHNlcmlhbCBwb3J0LiBSZXR1cm5zIDEgb24gc3VjY2VzcywgMAorICogb3RoZXJ3aXNlLiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBzdWNjZXNmdWxsLCB0aGUgY2hhcmFjdGVyIHJlYWQgaXMKKyAqIHdyaXR0ZW4gaW50byBpdHMgYXJndW1lbnQgYy4KKyAqLworaW50IHNlcmlhbF9nZXRjICh2b2lkKQoreworI2lmZGVmIENPTkZJR19GRlVBUlQKKwl3aGlsZSAoIShGRkxTUiAmIExTUl9EUikpOworCisJcmV0dXJuIChjaGFyKSBGRlJCUiAmIDB4ZmY7CisjZWxpZiBDT05GSUdfU1RVQVJUCisjZW5kaWYKK30KKwordm9pZAorc2VyaWFsX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCXNlcmlhbF9wdXRjICgqcysrKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jcHUveHNjYWxlL3N0YXJ0LlMgYi9jcHUveHNjYWxlL3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwNDlhOAotLS0gL2Rldi9udWxsCisrKyBiL2NwdS94c2NhbGUvc3RhcnQuUwpAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAqICBhcm1ib290IC0gU3RhcnR1cCBDb2RlIGZvciBYU2NhbGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4CURhbiBNYWxlayA8ZG1hbGVrQGpsYy5uZXQ+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk5CU1hZ251cyBEYW1tIDxraWVyYXlwYzAxLnAueS5raWUuZXJhLmVyaWNzc29uLnNlPgorICogIENvcHlyaWdodCAoQykgMjAwMAlXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMQlBbGV4IFr8cGtlIDxhenVAc3lzZ28uZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCUt5bGUgSGFycmlzIDxraGFycmlzQG5leHVzLXRlY2gubmV0PgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorCisuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CWIgICAgICAgcmVzZXQKKwlsZHIJcGMsIF91bmRlZmluZWRfaW5zdHJ1Y3Rpb24KKwlsZHIJcGMsIF9zb2Z0d2FyZV9pbnRlcnJ1cHQKKwlsZHIJcGMsIF9wcmVmZXRjaF9hYm9ydAorCWxkcglwYywgX2RhdGFfYWJvcnQKKwlsZHIJcGMsIF9ub3RfdXNlZAorCWxkcglwYywgX2lycQorCWxkcglwYywgX2ZpcQorCitfdW5kZWZpbmVkX2luc3RydWN0aW9uOgkud29yZCB1bmRlZmluZWRfaW5zdHJ1Y3Rpb24KK19zb2Z0d2FyZV9pbnRlcnJ1cHQ6CS53b3JkIHNvZnR3YXJlX2ludGVycnVwdAorX3ByZWZldGNoX2Fib3J0Ogkud29yZCBwcmVmZXRjaF9hYm9ydAorX2RhdGFfYWJvcnQ6CQkud29yZCBkYXRhX2Fib3J0Citfbm90X3VzZWQ6CQkud29yZCBub3RfdXNlZAorX2lycToJCQkud29yZCBpcnEKK19maXE6CQkJLndvcmQgZmlxCisKKwkuYmFsaWdubCAxNiwweGRlYWRiZWVmCisKKworLyoKKyAqIFN0YXJ0dXAgQ29kZSAocmVzZXQgdmVjdG9yKQorICoKKyAqIGRvIGltcG9ydGFudCBpbml0IG9ubHkgaWYgd2UgZG9uJ3Qgc3RhcnQgZnJvbSBtZW1vcnkhCisgKiAtIHJlbG9jYXRlIGFybWJvb3QgdG8gcmFtCisgKiAtIHNldHVwIHN0YWNrCisgKiAtIGp1bXAgdG8gc2Vjb25kIHN0YWdlCisgKi8KKworLyoKKyAqIENGR19NRU1fRU5EIGlzIGluIHRoZSBib2FyZCBkZXBlbmRlbnQgY29uZmlnLWZpbGUgKGNvbmZpZ3MvY29uZmlnX0JPQVJELmgpCisgKi8KK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCisKKy5nbG9ibCBfYXJtYm9vdF9zdGFydAorX2FybWJvb3Rfc3RhcnQ6CisJLndvcmQgX3N0YXJ0CisKKy8qCisgKiBOb3RlOiBfYXJtYm9vdF9lbmRfZGF0YSBhbmQgX2FybWJvb3RfZW5kIGFyZSBkZWZpbmVkCisgKiBieSB0aGUgKGJvYXJkLWRlcGVuZGVudCkgbGlua2VyIHNjcmlwdC4KKyAqIF9hcm1ib290X2VuZF9kYXRhIGlzIHRoZSBmaXJzdCB1c2FibGUgRkxBU0ggYWRkcmVzcyBhZnRlciBhcm1ib290CisgKi8KKy5nbG9ibCBfYXJtYm9vdF9lbmRfZGF0YQorX2FybWJvb3RfZW5kX2RhdGE6CisJLndvcmQgYXJtYm9vdF9lbmRfZGF0YQorLmdsb2JsIF9hcm1ib290X2VuZAorX2FybWJvb3RfZW5kOgorCS53b3JkIGFybWJvb3RfZW5kCisKKy8qCisgKiBfYXJtYm9vdF9yZWFsX2VuZCBpcyB0aGUgZmlyc3QgdXNhYmxlIFJBTSBhZGRyZXNzIGJlaGluZCBhcm1ib290CisgKiBhbmQgdGhlIHZhcmlvdXMgc3RhY2tzCisgKi8KKy5nbG9ibCBfYXJtYm9vdF9yZWFsX2VuZAorX2FybWJvb3RfcmVhbF9lbmQ6CisJLndvcmQgMHgwYmFkYzBkZQorCisvKgorICogV2UgcmVsb2NhdGUgdWJvb3QgdG8gdGhpcyBhZGRyZXNzIChlbmQgb2YgUkFNIC0gMTI4IEtpQikKKyAqLworLmdsb2JsIF91Ym9vdF9yZWxvYworX3Vib290X3JlbG9jOgorCS53b3JkIENGR19EUkFNX0JBU0UgKyBDRkdfRFJBTV9TSVpFIC0gQ0ZHX01PTklUT1JfTEVOCisKKyNpZmRlZiBDT05GSUdfVVNFX0lSUQorLyogSVJRIHN0YWNrIG1lbW9yeSAoY2FsY3VsYXRlZCBhdCBydW4tdGltZSkgKi8KKy5nbG9ibCBJUlFfU1RBQ0tfU1RBUlQKK0lSUV9TVEFDS19TVEFSVDoKKwkud29yZAkweDBiYWRjMGRlCisKKy8qIElSUSBzdGFjayBtZW1vcnkgKGNhbGN1bGF0ZWQgYXQgcnVuLXRpbWUpICovCisuZ2xvYmwgRklRX1NUQUNLX1NUQVJUCitGSVFfU1RBQ0tfU1RBUlQ6CisJLndvcmQgMHgwYmFkYzBkZQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHRoZSBhY3R1YWwgcmVzZXQgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcmVzZXQ6CisJbXJzCXIwLGNwc3IJCQkvKiBzZXQgdGhlIGNwdSB0byBTVkMzMiBtb2RlICAgICAgICAqLworCWJpYwlyMCxyMCwjMHgxZgkJLyogKHN1cGVydmlzZXIgbW9kZSwgTT0xMDAxMSkgICAgICAgKi8KKwlvcnIJcjAscjAsIzB4MTMKKwltc3IJY3BzcixyMAorCisJYmwJY3B1X2luaXRfY3JpdAkJLyogd2UgZG8gc3lzLWNyaXRpY2FsIGluaXRzICAgICAgICAgKi8KKworcmVsb2NhdGU6CQkJCS8qIHJlbG9jYXRlIFUtQm9vdCB0byBSQU0gICAgICAgICAgKi8KKwlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICovCisJbGRyCXIyLCBfYXJtYm9vdF9zdGFydAorCWxkcglyMywgX2FybWJvb3RfZW5kCisJc3ViCXIyLCByMywgcjIJCS8qIHIyIDwtIHNpemUgb2YgYXJtYm9vdCAqLworLyoJbGRyCXIxLCBfdWJvb3RfcmVsb2MJLyAqIHIxIDwtIGRlc3RpbmF0aW9uIGFkZHJlc3MgICAgICAgICovCisJbGRyCXIxLCBfVEVYVF9CQVNFCisJYWRkCXIyLCByMCwgcjIJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworCitjb3B5X2xvb3A6CisJbGRtaWEJcjAhLCB7cjMtcjEwfQkJLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKwlzdG1pYQlyMSEsIHtyMy1yMTB9CQkvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlZWUgW3IyXSAgICAqLworCWJsZQljb3B5X2xvb3AKKworCS8qIFNldCB1cCB0aGUgc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlsZHIJcjAsIF91Ym9vdF9yZWxvYwkvKiB1cHBlciAxMjggS2lCOiByZWxvY2F0ZWQgdWJvb3QgICAqLworCXN1YglyMCwgcjAsICNDRkdfTUFMTE9DX0xFTgkvKiBtYWxsb2MgYXJlYSAgICAgICAgICAgICAgICAgICAgICAqLworCQkJCQkvKiBGSVhNRTogYmRpbmZvIHNob3VsZCBiZSBoZXJlICAgICAqLworCXN1YglzcCwgcjAsICMxMgkJLyogbGVhdmUgMyB3b3JkcyBmb3IgYWJvcnQtc3RhY2sgKi8KKworCWxkcglwYywgX3N0YXJ0X2FybWJvb3QKKworX3N0YXJ0X2FybWJvb3Q6CS53b3JkIHN0YXJ0X2FybWJvb3QKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ1BVX2luaXRfY3JpdGljYWwgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gc2V0dXAgaW1wb3J0YW50IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSBzZXR1cCBtZW1vcnkgdGltaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyogSW50ZXJydXB0LUNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworSUNfQkFTRToJICAgLndvcmQJICAgMHg0MGQwMDAwMAorI2RlZmluZSBJQ01SCTB4MDQKKworLyogUmVzZXQtQ29udHJvbGxlciAqLworUlNUX0JBU0U6CS53b3JkICAgMHg0MGYwMDAzMAorI2RlZmluZSBSQ1NSCTB4MDAKKworCisJLyogQ2xvY2sgTWFuYWdlciBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQ0NfQkFTRToJCS53b3JkCTB4NDEzMDAwMDAKKyNkZWZpbmUgQ0NDUiAgICAweDAwCitjcHVzcGVlZDoJLndvcmQgICBDRkdfQ1BVU1BFRUQKKworCS8qIFJTOiA/Pz8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkubWFjcm8gQ1BXQUlUCisgICAgbXJjICBwMTUsMCxyMCxjMixjMCwwCisJbW92ICByMCxyMAorCXN1YiAgcGMscGMsIzQKKwkuZW5kbQorCisKK2NwdV9pbml0X2NyaXQ6CisKKwkvKiBtYXNrIGFsbCBJUlFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJbGRyCXIwLCBJQ19CQVNFCisJbW92CXIxLCAjMHgwMAorCXN0cglyMSwgW3IwLCAjSUNNUl0KKworCS8qIHNldCBjbG9jayBzcGVlZCAqLworCWxkcglyMCwgQ0NfQkFTRQorCWxkcglyMSwgY3B1c3BlZWQKKwlzdHIJcjEsIFtyMCwgI0NDQ1JdCisKKwkvKgorCSAqIGJlZm9yZSByZWxvY2F0aW5nLCB3ZSBoYXZlIHRvIHNldHVwIFJBTSB0aW1pbmcKKwkgKiBiZWNhdXNlIG1lbW9yeSB0aW1pbmcgaXMgYm9hcmQtZGVwZW5kZW5kLCB5b3Ugd2lsbAorCSAqIGZpbmQgYSBtZW1zZXR1cC5TIGluIHlvdXIgYm9hcmQgZGlyZWN0b3J5LgorCSAqLworCW1vdglpcCwJbHIKKwlibAltZW1zZXR1cAorCW1vdglsciwJaXAKKworCS8qIE1lbW9yeSBpbnRlcmZhY2VzIGFyZSB3b3JraW5nLiBEaXNhYmxlIE1NVSBhbmQgZW5hYmxlIEktY2FjaGUuICAgKi8KKworCWxkcglyMCwgPTB4MjAwMQkJLyogZW5hYmxlIGFjY2VzcyB0byBhbGwgY29wcm9jLiAgICAgKi8KKwltY3IJcDE1LCAwLCByMCwgYzE1LCBjMSwgMAorICAgIENQV0FJVAorCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJLyogZHJhaW4gdGhlIHdyaXRlICYgZmlsbCBidWZmZXJzICAgKi8KKyAgICBDUFdBSVQKKworCW1jcglwMTUsIDAsIHIwLCBjNywgYzcsIDAJLyogZmx1c2ggSWNhY2hlLCBEY2FjaGUgYW5kIEJUQiAgICAgKi8KKyAgICBDUFdBSVQKKworCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDAJLyogZmx1c2ggaW5zdHVjdGlvbiBhbmQgZGF0YSBUTEJzICAgKi8KKyAgICBDUFdBSVQKKworCS8qIEVuYWJsZSB0aGUgSWNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAorCW9ycglyMCwgcjAsICMweDE4MDAKKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisgICAgQ1BXQUlUCisqLworCW1vdglwYywgbHIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW50ZXJydXB0IGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJUlEgc3RhY2sgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBTX0ZSQU1FX1NJWkUJNzIKKworI2RlZmluZSBTX09MRF9SMAk2OAorI2RlZmluZSBTX1BTUgkJNjQKKyNkZWZpbmUgU19QQwkJNjAKKyNkZWZpbmUgU19MUgkJNTYKKyNkZWZpbmUgU19TUAkJNTIKKworI2RlZmluZSBTX0lQCQk0OAorI2RlZmluZSBTX0ZQCQk0NAorI2RlZmluZSBTX1IxMAkJNDAKKyNkZWZpbmUgU19SOQkJMzYKKyNkZWZpbmUgU19SOAkJMzIKKyNkZWZpbmUgU19SNwkJMjgKKyNkZWZpbmUgU19SNgkJMjQKKyNkZWZpbmUgU19SNQkJMjAKKyNkZWZpbmUgU19SNAkJMTYKKyNkZWZpbmUgU19SMwkJMTIKKyNkZWZpbmUgU19SMgkJOAorI2RlZmluZSBTX1IxCQk0CisjZGVmaW5lIFNfUjAJCTAKKworI2RlZmluZSBNT0RFX1NWQyAweDEzCisKKwkvKiB1c2UgYmFkX3NhdmVfdXNlcl9yZWdzIGZvciBhYm9ydC9wcmVmZXRjaC91bmRlZi9zd2kgLi4uICAgICAgICAgICovCisKKwkubWFjcm8JYmFkX3NhdmVfdXNlcl9yZWdzCisJc3ViCXNwLCBzcCwgI1NfRlJBTUVfU0laRQorCXN0bWlhCXNwLCB7cjAgLSByMTJ9CQkJLyogQ2FsbGluZyByMC1yMTIgICAgICAgICAgICovCisJYWRkICAgICByOCwgc3AsICNTX1BDCisKKwlsZHIJcjIsIF9hcm1ib290X2VuZAorCWFkZAlyMiwgcjIsICNDT05GSUdfU1RBQ0tTSVpFCisJc3ViCXIyLCByMiwgIzgKKwlsZG1pYQlyMiwge3IyIC0gcjR9ICAgICAgICAgICAgICAgICAgIC8qIGdldCBwYywgY3Bzciwgb2xkX3IwICAgICAqLworCWFkZAlyMCwgc3AsICNTX0ZSQU1FX1NJWkUJCS8qIHJlc3RvcmUgc3BfU1ZDICAgICAgICAgICAqLworCisJYWRkCXI1LCBzcCwgI1NfU1AKKwltb3YJcjEsIGxyCisJc3RtaWEJcjUsIHtyMCAtIHI0fSAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHNwX1NWQywgbHJfU1ZDLCBwYywgY3Bzciwgb2xkX3IgKi8KKwltb3YJcjAsIHNwCisJLmVuZG0KKworCisJLyogdXNlIGlycV9zYXZlX3VzZXJfcmVncyAvIGlycV9yZXN0b3JlX3VzZXJfcmVncyBmb3IgICAgICAgICAgICAgICAgKi8KKwkvKiBJUlEvRklRIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJLm1hY3JvCWlycV9zYXZlX3VzZXJfcmVncworCXN1YglzcCwgc3AsICNTX0ZSQU1FX1NJWkUKKwlzdG1pYQlzcCwge3IwIC0gcjEyfQkJCS8qIENhbGxpbmcgcjAtcjEyICAgICAgICAgICAgKi8KKwlhZGQgICAgIHI4LCBzcCwgI1NfUEMKKwlzdG1kYiAgIHI4LCB7c3AsIGxyfV4gICAgICAgICAgICAgICAgICAgLyogQ2FsbGluZyBTUCwgTFIgICAgICAgICAgICAqLworCXN0ciAgICAgbHIsIFtyOCwgIzBdICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGNhbGxpbmcgUEMgICAgICAgICAgICovCisJbXJzICAgICByNiwgc3BzcgorCXN0ciAgICAgcjYsIFtyOCwgIzRdICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIENQU1IgICAgICAgICAgICAgICAgICovCisJc3RyICAgICByMCwgW3I4LCAjOF0gICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgT0xEX1IwICAgICAgICAgICAgICAgKi8KKwltb3YJcjAsIHNwCisJLmVuZG0KKworCS5tYWNybwlpcnFfcmVzdG9yZV91c2VyX3JlZ3MKKwlsZG1pYQlzcCwge3IwIC0gbHJ9XgkJCUAgQ2FsbGluZyByMCAtIGxyCisJbW92CXIwLCByMAorCWxkcglsciwgW3NwLCAjU19QQ10JCQlAIEdldCBQQworCWFkZAlzcCwgc3AsICNTX0ZSQU1FX1NJWkUKKwlzdWJzCXBjLCBsciwgIzQJCQlAIHJldHVybiAmIG1vdmUgc3Bzcl9zdmMgaW50byBjcHNyCisJLmVuZG0KKworCS5tYWNybyBnZXRfYmFkX3N0YWNrCisJbGRyCXIxMywgX2FybWJvb3RfZW5kCQlAIHNldHVwIG91ciBtb2RlIHN0YWNrCisJYWRkCXIxMywgcjEzLCAjQ09ORklHX1NUQUNLU0laRQlAIHJlc2lkZXMgYXQgdG9wIG9mIG5vcm1hbCBzdGFjaworCXN1YglyMTMsIHIxMywgIzgKKworCXN0cglsciwgW3IxM10JCQlAIHNhdmUgY2FsbGVyIGxyIC8gc3BzcgorCW1ycwlsciwgc3BzcgorCXN0ciAgICAgbHIsIFtyMTMsICM0XQorCisJbW92CXIxMywgI01PREVfU1ZDCQkJQCBwcmVwYXJlIFNWQy1Nb2RlCisJbXNyCXNwc3JfYywgcjEzCisJbW92CWxyLCBwYworCW1vdnMJcGMsIGxyCisJLmVuZG0KKworCS5tYWNybyBnZXRfaXJxX3N0YWNrCQkJQCBzZXR1cCBJUlEgc3RhY2sKKwlsZHIJc3AsIElSUV9TVEFDS19TVEFSVAorCS5lbmRtCisKKwkubWFjcm8gZ2V0X2ZpcV9zdGFjawkJCUAgc2V0dXAgRklRIHN0YWNrCisJbGRyCXNwLCBGSVFfU1RBQ0tfU1RBUlQKKwkuZW5kbQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBleGNlcHRpb24gaGFuZGxlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkuYWxpZ24gIDUKK3VuZGVmaW5lZF9pbnN0cnVjdGlvbjoKKwlnZXRfYmFkX3N0YWNrCisJYmFkX3NhdmVfdXNlcl9yZWdzCisJYmwgCWRvX3VuZGVmaW5lZF9pbnN0cnVjdGlvbgorCisJLmFsaWduCTUKK3NvZnR3YXJlX2ludGVycnVwdDoKKwlnZXRfYmFkX3N0YWNrCisJYmFkX3NhdmVfdXNlcl9yZWdzCisJYmwgCWRvX3NvZnR3YXJlX2ludGVycnVwdAorCisJLmFsaWduCTUKK3ByZWZldGNoX2Fib3J0OgorCWdldF9iYWRfc3RhY2sKKwliYWRfc2F2ZV91c2VyX3JlZ3MKKwlibCAJZG9fcHJlZmV0Y2hfYWJvcnQKKworCS5hbGlnbgk1CitkYXRhX2Fib3J0OgorCWdldF9iYWRfc3RhY2sKKwliYWRfc2F2ZV91c2VyX3JlZ3MKKwlibCAJZG9fZGF0YV9hYm9ydAorCisJLmFsaWduCTUKK25vdF91c2VkOgorCWdldF9iYWRfc3RhY2sKKwliYWRfc2F2ZV91c2VyX3JlZ3MKKwlibCAJZG9fbm90X3VzZWQKKworI2lmZGVmIENPTkZJR19VU0VfSVJRCisKKwkuYWxpZ24JNQoraXJxOgorCWdldF9pcnFfc3RhY2sKKwlpcnFfc2F2ZV91c2VyX3JlZ3MKKwlibCAJZG9faXJxCisJaXJxX3Jlc3RvcmVfdXNlcl9yZWdzCisKKwkuYWxpZ24JNQorZmlxOgorCWdldF9maXFfc3RhY2sKKwlpcnFfc2F2ZV91c2VyX3JlZ3MJCS8qIHNvbWVvbmUgb3VnaHQgdG8gd3JpdGUgYSBtb3JlICAgICovCisJYmwgCWRvX2ZpcQkJCS8qIGVmZmljdGlvbiBmaXFfc2F2ZV91c2VyX3JlZ3MgICAgICovCisJaXJxX3Jlc3RvcmVfdXNlcl9yZWdzCisKKyNlbHNlCisKKwkuYWxpZ24JNQoraXJxOgorCWdldF9iYWRfc3RhY2sKKwliYWRfc2F2ZV91c2VyX3JlZ3MKKwlibCAJZG9faXJxCisKKwkuYWxpZ24JNQorZmlxOgorCWdldF9iYWRfc3RhY2sKKwliYWRfc2F2ZV91c2VyX3JlZ3MKKwlibCAJZG9fZmlxCisKKyNlbmRpZgorCisvKgorICogRklYTUUgSG93IGRvIHdlIHJlc2V0Pz8/IFdhdGNoZG9nIHRpbWVvdXQ/PworICovCisJLmFsaWduCTUKKy5nbG9ibCByZXNldF9jcHUKK3Jlc2V0X2NwdToKKwkvKgorCWxkcglyMCwgUlNUX0JBU0UKKwltb3YJcjEsICMweDAJCQlAIHNldCBiaXQgMy0wIC4uLgorCXN0cglyMSwgW3IwLCAjUkNTUl0JCQlAIC4uLiB0byBjbGVhciBpbiBSQ1NSCisJbW92CXIxLCAjMHgxCisJc3RyCXIxLCBbcjAsICNSQ1NSXQkJCUAgYW5kIHBlcmZvcm0gcmVzZXQKKwkqLworCWIJcmVzZXRfY3B1CQkJQCBzaWxseSwgYnV0IHJlcGVhdCBlbmRsZXNzbHkKKwpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5KRkZTMiBiL2RvYy9SRUFETUUuSkZGUzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzOWM0NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUuSkZGUzIKQEAgLTAsMCArMSw2OCBAQAorSkZGUzIgb3B0aW9ucyBhbmQgdXNhZ2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitKRkZTMiBpbiBVLUJvb3QgaXMgYSByZWFkIG9ubHkgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZpbGUgc3lzdGVtIGluCitMaW51eCB3aXRoIHRoZSBzYW1lIG5hbWUuIFRvIHVzZSBKRkZTMiBkZWZpbmUgQ0ZHX0NNRF9KRkZTMi4KKworVGhlIG1vZHVsZSBhZGRzIHRocmVlIG5ldyBjb21tYW5kcy4KK2ZzbG9hZCAgLSBsb2FkIGJpbmFyeSBmaWxlIGZyb20gYSBmaWxlIHN5c3RlbSBpbWFnZQorZnNpbmZvICAtIHByaW50IGluZm9ybWF0aW9uIGFib3V0IGZpbGUgc3lzdGVtcworbHMgICAgICAtIGxpc3QgZmlsZXMgaW4gYSBkaXJlY3RvcnkKKworCitUaGVyZSBpcyB0d28gd2F5cyBmb3IgSkZGUzIgdG8gZmluZCB0aGUgZGlzay4gVGhlIGRlZmF1bHQgd2F5IHVzZXMKK3RoZSBmbGFzaF9pbmZvIHN0cnVjdHVyZSB0byBmaW5kIHRoZSBzdGFydCBvZiBhIEpGRlMyIGRpc2sgKGNhbGxlZAorcGFydGl0aW9uIGluIHRoZSBjb2RlKSBhbmQgeW91IGNhbiBjaGFuZ2Ugd2hlcmUgdGhlIHBhcnRpdGlvbiBpcyB3aXRoCit0d28gZGVmaW5lcy4KKworQ0ZHX0pGRlMyX0ZJUlNUX0JBTksKKwlkZWZpbmVkIHRoZSBmaXJzdCBmbGFzaCBiYW5rIHRvIHVzZQorCitDRkdfSkZGUzJfRklSU1RfU0VDVE9SCisJZGVmaW5lcyB0aGUgZmlyc3Qgc2VjdG9yIHRvIHVzZQorCisKK1RoZSBzZWNvbmQgd2F5IGlzIHRvIGRlZmluZSBDRkdfSkZGU19DVVNUT01fUEFSVCBhbmQgaW1wbGVtZW50IHRoZQoramZmczJfcGFydF9pbmZvKGludCBwYXJ0X251bSkgZnVuY3Rpb24gaW4geW91ciBib2FyZCBzcGVjaWZpYyBmaWxlcy4KK0luIHRoaXMgbW9kZSBDRkdfSkZGUzJfRklSU1RfQkFOSyBhbmQgQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUiBpcyBub3QKK3VzZWQuCisKK1RoZSBpbnB1dCBpcyBhIHBhcnRpdGlvbiBudW1iZXIgc3RhcnRpbmcgd2l0aCAwLgorUmV0dXJuIGEgcG9pbnRlciB0byBzdHJ1Y3QgcGFydF9pbmZvIG9yIE5VTEwgZm9yIGVycm9yOworCitFeCBqZmZzMl9wYXJ0X2luZm8oKSBmb3Igb25lIHBhcnRpdGlvbi4KKy0tLQorI2lmIGRlZmluZWQgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQKKyNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgorCitzdGF0aWMgc3RydWN0IHBhcnRfaW5mbyBwYXJ0OworCitzdHJ1Y3QgcGFydF9pbmZvKgoramZmczJfcGFydF9pbmZvKGludCBwYXJ0X251bSkKK3sKKwlpZihwYXJ0X251bT09MCl7CisJCWlmKHBhcnQudXNyX3ByaXY9PSh2b2lkKikxKQorCQkJcmV0dXJuICZwYXJ0OworCisJCW1lbXNldCgmcGFydCwgMCwgc2l6ZW9mKHBhcnQpKTsKKwkJcGFydC5vZmZzZXQ9KGNoYXIqKTB4RkY4MDAwMDA7CisJCXBhcnQuc2l6ZT0xMDI0KjEwMjQqODsKKworCQkvKiBNYXJrIHRoZSBzdHJ1Y3QgYXMgcmVhZHkgKi8KKwkJcGFydC51c3JfcHJpdj0odm9pZCopMTsKKworCQlyZXR1cm4gJnBhcnQ7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCistLS0KKworVE9ETy4KKworICAgICAgICBBZGQgYSBuZXcgY29tbWFuZCBzbyBpdCdzIGFjdHVhbGx5IHBvc3NpYmxlIHRvIGNoYW5nZQorCXBhcnRpdGlvbi4KKworICAgICAgICBSZW1vdmUgdGhlIGFzc3VtcHRpb24gdGhhdCBKRkZTIGNhbiBkZXJlZmVyZW5jZSBhIHBvaW50ZXIKKyAgICAgICAgaW50byB0aGUgZGlzay4gVGhlIGN1cnJlbnQgY29kZSBkbyBub3Qgd29yayB3aXRoIG1lbW9yeSBob2xlcworICAgICAgICBvciBoYXJkd2FyZSB3aXRoIGEgc2xpZGluZyB3aW5kb3cgKFBDTUNJQSkuCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLk1vZGVtIGIvZG9jL1JFQURNRS5Nb2RlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2JhN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5Nb2RlbQpAQCAtMCwwICsxLDczIEBACitIb3cgdG8gY29uZmlndXJlIG1vZGVtIHN1cHBvcnQgaW4gVS1Cb290IDoKKworMS4gRGVmaW5lIG1vZGVtIGluaXRpYWxpemF0aW9uIHN0cmluZ3M6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG1vZGVtIGluaXRpYWxpemF0aW9uIHN0cmluZ3MgaGF2ZSBmb2xsb3dpbmcgZm9ybWF0OgorCisJbWRtX2luaXQxPTxBVC1jb21tYW5kPgorCW1kbV9pbml0Mj08QVQtY29tbWFuZD4KKwkuLi4KKworVHVybmluZyBvZmYgbW9kZW0gdmVyYm9zZSByZXNwb25zZXMgd2l0aCBBVFYwIG9yIEFUUTEgaXMgbm90IGFsbG93ZWQ7CitVLUJvb3QgYW5hbHl6ZXMgb25seSB2ZXJib3NlIChub3QgbnVtZXJpYykgcmVzdWx0IGNvZGVzLiBNb2RlbSBsb2NhbAorY29tbWFuZCBlY2hvIGNhbiBiZSB0dXJuZWQgb2ZmIChBVEUwKS4KKworMi4gUlRTL0NUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2w6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IG1heSB3aXNoIHRvIGVuYWJsZSBSVFMvQ1RTIGhhcmR3YXJlIGZsb3cgY29udHJvbCwgaWYgdGhlIGJvYXJkJ3MKK1VBUlQgZHJpdmVyIHN1cHBvcnRzIGl0IChzZWUgQ09ORklHX0hXRkxPVyBjb21waWxlLXRpbWUgZmxhZyBpbgorY29uZmlnLzxib2FyZD4uaCkuIFRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgJ21kbV9mbG93X2NvbnRyb2wnCitlbnZpcm9ubWVudCB2YXJpYWJsZToKKworCSdtZG1fZmxvd19jb250cm9sPXJ0cy9jdHMnICAtIHRvIGVuYWJsZSBSVFMvQ1RTIGZsb3cgY29udHJvbC4KKwknbWRtX2Zsb3dfY29udHJvbD1ub25lICcgICAgLSB0byBkaXNhYmxlLgorCisKK1RoZSBmb2xsb3dpbmcgYXJlIHRoZSBleGFtcGxlcyB1c2luZyBhIFJvY2t3ZWxsIE9FTSBtb2RlbQorY29uZmlndXJhdGlvbjoKKworU0FNU1VORyAjIHNldGVudiBtZG1faW5pdDEgQVRaCQkJLSByZXNldCB0aGUgbW9kZW0gdG8KKwkJCQkJCSAgdGhlIGZhY3RvcnkgZGVmYXVsdHMuCitTQU1TVU5HICMgc2V0ZW52IG1kbV9pbml0MiBBVFMwPTEgICAgICAgICAgICAgICAtIHNldCBtb2RlbSBpbnRvCisJCQkJCQkgIGFuc3dlciBtb2RlLgorU0FNU1VORyAjIHNldGVudiBtZG1fZmxvd19jb250cm9sIHJ0cy9jdHMgICAgICAgLSBlbmFibGUgc2VyaWFsIHBvcnQKKwkJCQkJCSAgZmxvdyBjb250cm9sCitTQU1TVU5HICMgc2F2ZWVudgorCitUaGUgZXhhbXBsZSBhYm92ZSBpbml0aWFsaXplcyBtb2RlbSBpbnRvIGFuc3dlciBtb2RlIHRvIHdhaXQgZm9yIHRoZQoraW5jb21pbmcgY2FsbC4gUlRTL0NUUyBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCBmb3IgdGhlIHNlcmlhbCBwb3J0LgorKFRoZSBSVFMvQ1RTIGZsb3cgY29udHJvbCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgb24gdGhlIG1vZGVtKS4KKworCitTQU1TVU5HICMgc2V0ZW52IG1kbV9pbml0MSBBVFoKK1NBTVNVTkcgIyBzZXRlbnYgbWRtX2luaXQyIEFUUzM5PTArSUZDPTAsMAktIGRpc2FibGUgbW9kZW0KKwkJCQkJCSAgUlRTL0NUUyBmbG93IGNvbnRyb2wKK1NBTVNVTkcgIyBzZXRlbnYgbWRtX2luaXQzIEFURFQxNjQzOTczICAgICAgICAgLSAgZGlhbCBvdXQgdGhlIG51bWJlcgorU0FNU1VORyAjIHNldGVudiBtZG1fZmxvd19jb250cm9sIG5vbmUKK1NBTVNVTkcgIyBzYXZlZW52CisKK1RoZSBleGFtcGxlIGFib3ZlIGluaXRpYWxpemVzIG1vZGVtIHRvIGRpYWwtdXAgY29ubmVjdGlvbiBvbiB0aGUKK251bWJlciAxNjQzOTczLiBGbG93IGNvbnRyb2wgaXMgZGlzYWJsZWQuCisKK05vdGUgdGhhdCBmbG93IGNvbnRyb2wgbXVzdCBiZSB0dXJuZWQgYm90aCBvZmYgb3IgYm90aCBvbiBmb3IgdGhlCitib2FyZCBzZXJpYWwgcG9ydCBhbmQgZm9yIHRoZSBtb2RlbS4KKworCitJZiB0aGUgY29ubmVjdGlvbiB3YXMgc2V0IHVwIHN1Y2Nlc3NmdWxseSwgdGhlIFUtQm9vdCBwcm9tcHQgYXBwZWFycworb24gdGhlIHRlcm1pbmFsIGNvbnNvbGUuIElmIG5vdCAoVS1Cb290IG1vZGVtIHdhcyBjb25maWd1cmVkIGZvcgorb3JpZ2luYXRpbmcgdGhlIGNhbGwgYW5kIGNvbm5lY3Rpb24gd2FzIG5vdCBlc3RhYmxpc2hlZCkgLSB0aGUgYm9hcmQKK3Nob3VsZCBiZSByZXNldCBmb3IgYW5vdGhlciBkaWFsLXVwIHRyeS4KKworCitOb3RlIG9uIHRoZSBTTURLMjQwMCBib2FyZDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTaW5jZSB0aGUgYm9hcmQgc2VyaWFsIHBvcnRzIGRvZXMgbm90IGhhdmUgRFRSIHNpZ25hbCB3aXJlZCwgbW9kZW0KK3Nob3VsZCBiZSB0b2xkIHRvIGlnbm9yZSBwb3J0IERUUiBzZXR0aW5nIHByaW9yIHRvIGNvbm5lY3Rpb24gdG8gdGhlCitTTURLIGJvYXJkLCBhbmQgdGhpcyBzZXR0aW5nIHNob3VsZCBiZSBzdG9yZWQgaW4gbW9kZW0gTlZSQU0uIEZvciB0aGUKK1JvY2t3ZWxsIE9FTSBtb2RlbSB0aGlzIGNhbiB0byBiZSBkb25lIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCitBVCZEMCZXCisKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuY29tbWFuZHMgYi9kb2MvUkVBRE1FLmNvbW1hbmRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NjE4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUkVBRE1FLmNvbW1hbmRzCkBAIC0wLDAgKzEsOTkgQEAKKyMKKyMgVGhlIGNvbW1hbmRzIGluIHRoaXMgdGFibGUgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseSBieSB0aGUKKyMgY29tbWFuZCBuYW1lIGFuZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBjb21tYW5kIG5hbWUgc3RyaW5nCisjIGxlbmd0aC4gVGhpcyBpcyB0byBwcmV2ZW50IGNvbmZsaWN0cyBpbiBjb21tYW5kIG5hbWUgcGFyc2luZy4KKyMgUGxlYXNlIGVuc3VyZSB0aGF0IG5ldyBjb21tYW5kcyBhcmUgYWRkZWQgYWNjb3JkaW5nIHRvIHRoYXQgcnVsZS4KKyMgU2VlICQoVE9QRElSKS9jb21tb24vY29tbWFuZC5jCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgY29tbWFuZAlsZW5ndGgKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYXNrZW52CQk4CithcwkJMgorYXV0b3NjcgkJNQorYmFzZQkJMgorYmRpbmZvCQkyCitib290ZWxmCQk3Citib290bQkJNQorYm9vdHAJCTUKK2Jvb3R2eAkJNgorYm9vdGQJCTQKK2JyZWFrCQkyCiticmdpbmZvCQkzCitjYXJpbmZvCQkzCitjaHBhcnQJCTYKK2NtcAkJMworY29uaW5mbwkJNQorY29udGludWUJNAorY3AJCTIKK2NyYzMyCQkzCitkYXRlCQkzCitkY2FjaGUJCTIKK2RoY3AJCTQKK2RtYWluZm8JCTMKK2RzCQkyCitkdHQJCTMKK2VjaG8JCTQKK2VlcHJvbQkJMworZXJhc2UJCTMKK2ZjY2luZm8JCTMKK2ZkY2Jvb3QJCTQKK2ZsaW5mbwkJMworZnBnYQkJNAorZnNpbmZvCQk1Citmc2xvYWQJCTUKK2dldGRjcgkJNgkJIyBJQk0gNFhYIERDUiByZWdpc3RlcnMKK2dvCQkyCitoZWxwCQkxCitpMmNpbmZvCQk0CitpMmMJCTMKK2ljYWNoZQkJMgoraWNpbmZvCQkzCitpZGUJCTMKK2ltaW5mbwkJMworaW9waW5mbwkJMworaXJxaW5mbwkJMwora2dkYgkJNAorbG9hZGIJCTUKK2xvYWRzCQk1Citsb29wCQk0CitscwkJMgorbWNjaW5mbwkJMworbWQJCTIKK21lbWNpbmZvCTQKK21paQkJMworbW0JCTIKK210ZXN0CQk1CittdXhpbmZvCQkzCittdwkJMgorbmV4dAkJNAorbm0JCTIKK3BjaWluZm8JCTMKK3Bpbml0CQk0CitwcmludGVudgk4Citwcm90ZWN0CQk0CityYXJwYm9vdAk0CityZHVtcAkJNQorcmVnaW5mbwkJMworcmVzZXQJCTUKK3J1bgkJMworc2F2ZWVudgkJNAorc2NjaW5mbwkJMworc2NzaWJvb3QJNQorc2NzaQkJNAorc2lpaW5mbwkJMworc2l0aW5mbwkJMworc2l1aW5mbwkJMworc2V0ZGNyCQk2CQkjIElCTSA0WFggRENSIHJlZ2lzdGVycworc2V0ZW52CQk2CitzbWNpbmZvCQkzCitzcGlpbmZvCQkzCitzdGFjawkJNQorc3RlcAkJNAordGZ0cGJvb3QJNAordXNiYm9vdAkJNQordXNiCQk0Cit2ZXJzaW9uCQk0Cis/CQkxCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLmVib255IGIvZG9jL1JFQURNRS5lYm9ueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmEwZDcwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5lYm9ueQpAQCAtMCwwICsxLDEzOCBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJNIEVib255IEJvYXJkCisKKyAgICAgICAgICAgICAgICAgICAgTGFzdCBVcGRhdGU6IFNlcHRlbWJlciAxMiwgMjAwMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgaGFuZHkgaW5mbyByZWdhcmRpbmcgVS1Cb290IGFuZCB0aGUgSUJNCitFYm9ueSBldmFsdXRhdGlvbiBib2FyZC4gU2VlIHRoZSBSRUFETUUucHBjNDQwIGZvciBhZGRpdGlvbmFsCitpbmZvcm1hdGlvbi4KKworCitTV0lUQ0ggU0VUVElOR1MgJiBKVU1QRVJTCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitIZXJlJ3Mgd2hhdCBJJ3ZlIGJlZW4gdXNpbmcgc3VjY2Vzc2Z1bGx5LiBJZiB5b3UgZmVlbCBpbmNsaW5lZCB0bworY2hhbmdlIHRoaW5ncyAuLi4gcGxlYXNlIHJlYWQgdGhlIGRvY3MhCisKK0RJUFNXICAgVTQ2ICAgICAgICAgVTgwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NXIDEgICAgb2ZmICAgICAgICAgb24KK1NXIDIgICAgb24gICAgICAgICAgb24KK1NXIDMgICAgb24gICAgICAgICAgb24KK1NXIDQgICAgb2ZmICAgICAgICAgb24KK1NXIDUgICAgb24gICAgICAgICAgb2ZmCitTVyA2ICAgIG9uICAgICAgICAgIG9uCitTVyA3ICAgIG9uICAgICAgICAgIG9mZgorU1cgOCAgICBvbiAgICAgICAgICBvZmYKKworSjQxOiBzdHJhcHBlZAorSjQyOiBvcGVuCisKK0FsbCBvdGhlcnMgYXJlIGZhY3RvcnkgZGVmYXVsdC4KKworCitJMkMgaXByb2JlCis9PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGkyYyB1dGlsaXRpZXMgaGF2ZSBiZWVuIHRlc3RlZCBvbiBib3RoIFJldiBCLiBhbmQgUmV2IEMuIGFuZAorbG9vayBnb29kLiBUaGUgQ0ZHX0kyQ19OT1BST0JFUyBtYWNybyBpcyBkZWZpbmVkIHRvIHByZXZlbnQKK3Byb2JpbmcgdGhlIENEQ1Y4NTAgY2xvY2sgY29udHJvbGxlciBhdCBhZGRyZXNzIDB4NjkgKHNpbmNlIHJlYWRpbmcKK2l0IGNhdXNlcyB0aGUgaTJjIGltcGxlbWVudGF0aW9uIHRvIG1pc2JlaGF2ZS4gVGhlIG91dHB1dCBvZgoraXByb2JlIHNob3VsZCBsb29rIGxpa2UgdGhpcyAoYXNzdW1pbmcgeW91IGFyZSBvbmx5IHVzaW5nIGEgc2luZ2xlCitTTy1ESU1NOgorCis9PiBpcHJvYmUKK1ZhbGlkIGNoaXAgYWRkcmVzc2VzOiA1MCA1MyA1NAorRXhjbHVkZWQgY2hpcCBhZGRyZXNzZXM6IDY5CisKKworR0VUVElORyBPVVQgT0YgSTJDIFRST1VCTEUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJZiB5b3UncmUgbGlrZSBtZSAuLi4geW91IG1heSBoYXZlIHNjcmV3ZWQgdXAgeW91ciBib290c3RyYXAgc2VyaWFsCitlZXByb20gLi4uIG9yIHdvcnNlLCB5b3VyIFNQRCBlZXByb20gd2hlbiBleHBlcmltZW50aW5nIHdpdGggdGhlCitpMmMgY29tbWFuZHMuIElmIHNvLCBoZXJlIGFyZSBzb21lIGlkZWFzIG9uIGhvdyB0byBnZXQgb3V0IG9mCit0cm91YmxlOgorCitTZXJpYWwgYm9vdHN0cmFwIGVlcHJvbSBjb3JydXB0aW9uOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1Bvd2VyIGRvd24gdGhlIGJvYXJkIGFuZCBzZXQgdGhlIGZvbGxvd2luZyBzdHJhcHM6CisKK0o0MSAtIG9wZW4KK0o0MiAtIHN0cmFwcGVkCisKK1RoaXMgd2lsbCBzZWxlY3QgdGhlIGRlZmF1bHQgc3lzMCBhbmQgc3lzMSBzZXR0aW5ncyAodGhlIHNlcmlhbAorZWVwcm9tcyBhcmUgbm90IHVzZWQpLiBUaGVuIHBvd2VyIHVwIHRoZSBib2FyZCBhbmQgZml4IHRoZSBzZXJpYWwKK2VlcHJvbSB1c2luZyB0aGUgaW1tIGNvbW1hbmQuIEhlcmUgYXJlIHRoZSB2YWx1ZXMgSSBjdXJyZW50bHkKK3VzZToKKworPT4gaW1kIDUwIDAgMTAKKzAwMDA6IGJmIGEyIDA0IDAxIGFlIDk0IDExIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAgIC4uLi4uLi4uLi4uLi4uLi4KKworPT4gaW1kIDU0IDAgMTAKKzAwMDA6IDhmIGIzIDI0IDAxIDRkIDE0IDExIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAgIC4uJC5NLi4uLi4uLi4uLi4KKworT25jZSB5b3UgaGF2ZSB0aGUgZWVwcm9tcyBzZXQgY29ycmVjdGx5IGNoYW5nZSB0aGUKK0o0MS9KNDIgc3RyYXBzIGFzIHlvdSBkZXNpcmUuCisKK1NQRCBlZXByb20gY29ycnVwdGlvbjoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSSd2ZSBjb3JydXB0ZWQgdGhlIFNQRCBlZXByb20gc2V2ZXJhbCB0aW1lcyAuLi4gcGVyaGFwcyB0b28gbXVjaCBjb2ZmZWUKK2FuZCBub3QgZW5vdWdoIHByZXNlbmNlIG9mIG1pbmQgOy0pLiBCeSBkZWZhdWx0LCB0aGUgZWJvbnkgY29kZSB1c2VzCit0aGUgU1BEIHRvIGluaXRpYWxpemUgdGhlIEREUiBTRFJBTSBjb250cm9sIHJlZ2lzdGVycy4gU28gaWYgdGhlIFNQRAorZWVwcm9tIGlzIGNvcnJ1cHRlZCwgVS1Cb290IHdpbGwgbmV2ZXIgZ2V0IGludG8gcmFtLiBIZXJlJ3MgaG93IEkgZ290CitvdXQgb2YgdGhpcyBzaXR1YXRpb246CisKKzAuIEZpcnN0LCBfYmVmb3JlXyBwbGF5aW5nIHdpdGggdGhlIGkyYyB1dGlsaXRpZXMsIGRvIGFuIGlwcm9iZSwgdGhlbgordXNlIGltZCB0byBjYXB0dXJlIHRoZSB2YXJpb3VzIGRldmljZSBjb250ZW50cyB0byBhIGZpbGUuIFNvbWUgZGF5Cit5b3UgbWF5IGJlIGdsYWQgeW91IGRpZCB0aGlzIC4uLiB0cnVzdCBtZSA6LSkuIE90aGVyd2lzZSB0cnkgdGhlCitmb2xsb3dpbmc6CisKKzEuIEluIHRoZSBpbmNsdWRlL2NvbmZpZ3MvRUJPTlkuaCBmaWxlIGZpbmQgdGhlIGxpbmUgdGhhdCBkZWZpbmVzCit0aGUgQ09ORklHX1NQRF9FRVBST00gbWFjcm8gYW5kIHVuZGVmaW5lIGl0LiBFLmc6CisKKyN1bmRlZiBDT05GSUdfU1BEX0VFUFJPTQorCitUaGlzIHdpbGwgbWFrZSB0aGUgY29kZSB1c2UgZGVmYXVsdCBTRFJBTSBjb250cm9sIHJlZ2lzdGVyCitzZXR0aW5ncyB3aXRob3V0IHVzaW5nIHRoZSBTUEQgZWVwcm9tLgorCisyLiBSZWJ1aWxkIFUtQm9vdAorCiszLiBMb2FkIHRoZSBuZXcgVS1Cb290IGltYWdlIGFuZCByZWJvb3QgZWJvbnkuCisKKzQuIFJlcGFpciB0aGUgU1BEIGVlcHJvbSB1c2luZyB0aGUgaW1tIGNvbW1hbmQuIEhlcmUncyB0aGUgZWVwcm9tCitjb250ZW50cyB0aGF0IHdvcmsgd2l0aCB0aGUgZGVmYXVsdCBTTy1ESU1NIHRoYXQgY29tZXMgd2l0aCB0aGUKK2Vib255IGJvYXJkIChtaWNyb24gOFZERFQxNjRBRy0yNjVBMSkuIE5vdGU6IHRoZXNlIGFyZSBwcm9iYWJseQorX25vdF8gdGhlIGZhY3Rvcnkgc2V0dGluZ3MgLi4uIGJ1dCB0aGV5IHdvcmsuCisKKz0+IGltZCA1MyAwIDEwIDgwCiswMDAwOiA4MCAwOCAwNyAwYyAwYSAwMSA0MCAwMCAwNCA3NSA3NSAwMCA4MCAwOCAwMCAwMSAgICAuLi4uLi5ALi51dS4uLi4uCiswMDEwOiAwZSAwNCAwYyAwMSAwMiAyMCAwMCBhMCA3NSAwMCAwMCA1MCAzYyA1MCAyZCAyMCAgICAuLi4uLiAuLnUuLlA8UC0KKzAwMjA6IDkwIDkwIDUwIDUwIDAwIDAwIDAwIDAwIDAwIDQxIDRiIDM0IDMyIDc1IDAwIDAwICAgIC4uUFAuLi4uLkFLNDJ1Li4KKzAwMzA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDljICAgIC4uLi4uLi4uLi4uLi4uLi4KKzAwNDA6IDJjIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDA4IDM4IDU2IDQ0IDQ0IDU0IDMxIDM2ICAgICwuLi4uLi4uLjhWRERUMTYKKzAwNTA6IDM2IDM0IDQxIDQ3IDJkIDMyIDM2IDM1IDQxIDMxIDIwIDAxIDAwIDAxIDJjIDYzICAgIDY0QUctMjY1QTEgLi4uLGMKKzAwNjA6IDIyIDI1IGFiIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAgICIlLi4uLi4uLi4uLi4uLi4KKzAwNzA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAgIC4uLi4uLi4uLi4uLi4uLi4KKworCitQQ0kgRE9VQkxFLUVOVU1FUkFUSU9OIFdPRVMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJZiB5b3UncmUgbm90IHVzaW5nIFBDSS1YIGNhcmRzIGFuZCBhcmUgc2ltcGx5IHVzaW5nIDMyLWJpdCBhbmQvb3IKKzMzIE1IeiBjYXJkcyB2aWEgZXh0ZW5kZXJzIGFuZCB0aGUgbGlrZSwgeW91IG1heSBub3RpY2UgdGhhdCB0aGUKK2luaXRpYWwgcGNpIHNjYW4gcmVwb3J0cyB2YXJpb3VzIGRldmljZXMgdHdpY2UgLi4uIGFuZCBjb25maWd1cmF0aW9uCitkb2VzIG5vdCBzdWNjZWVkIChvbmUgb3IgbW9yZSBkZXZpY2VzIGFyZSBlbnVtZXJhdGVkIHR3aWNlKS4gVG8gY29ycmVjdAordGhpcyB3ZSByZXBsYWNlZCB0aGUgMksgb2htIHJlc2lzdG9yIG9uIHRoZSBJRFNFTCBsaW5lKHMpIHdpdGggYQorMjIgb2htIHJlc2lzdG9yIGFuZCB0aGUgcHJvYmxlbSB3ZW50IGF3YXkuIFRoaXMgY2hhbmdlIGhhc24ndCBicm9rZW4KK2FueXRoaW5nIHlldCAtLSB1c2UgYXQgeW91ciBvd24gcmlzay4KKworV2UgbmV2ZXIgdGVzdGVkIGFueXRoaW5nIG90aGVyIHRoYW4gMzMgTUh6LzMyLWJpdCBjYXJkcy4gSWYgeW91IGhhdmUKK3RoZSBjaGFuY2UgdG8gZG8gdGhpcywgcGxlYXNlIGxldCBtZSBrbm93IGhvdyB0aGluZ3MgdHVybiBvdXQgOi0pCisKKworCitSZWdhcmRzLAorLS1TY290dAorPHNtY251dHRAYXJ0ZXN5bmNwLmNvbT4KKwpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5wcGM0NDAgYi9kb2MvUkVBRE1FLnBwYzQ0MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2IwYzZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5wcGM0NDAKQEAgLTAsMCArMSwyMDQgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyUEMgNDQwCisKKyAgICAgICAgICAgICAgICAgICAgTGFzdCBVcGRhdGU6IFNlcHRlbWJlciAxMSwgMjAwMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitPVkVSVklFVworPT09PT09PT09PT09CisKK1N1cHBvcnQgZm9yIHRoZSBwcGM0NDAgaXMgY29udGFpbmVkIGluIHRoZSBjcHUvcHBjNDR4IGRpcmVjdG9yeQorYW5kIGVuYWJsZWQgdmlhIHRoZSBDT05GSUdfNDQwIGZsYWcuIEl0IGlzIGxhcmdlbHkgYmFzZWQgb24gdGhlCis0MDVncCBjb2RlLiBBIHNhbXBsZSBib2FyZCBzdXBwb3J0IGltcGxlbWVudGF0aW9uIGlzIGNvbnRhaW5lZAoraW4gdGhlIGJvYXJkL2Vib255IGRpcmVjdG9yeS4KKworQWxsIHRlc3Rpbmcgd2FzIHBlcmZvcm1lZCB1c2luZyB0aGUgSUJNIEVib255IGJvYXJkIHVzaW5nIGJvdGgKK1JldiBCIGFuZCBSZXYgQyBzaWxpY29uLiBIb3dldmVyLCBzaW5jZSB0aGUgUmV2IEIuIHNpbGljb24gaGFzCitleHRlbnNpdmUgZXJyYXRhLCBzdXBwb3J0IGZvciBSZXYgQi4gaXMgbWluaW1hbCAoaXQgYm9vdHMsIGFuZAorZmVhdHVyZXMgc3VjaCBhcyBpMmMsIHBjaSwgdGZ0cGJvb3QsIGV0Yy4gc2VlbSB0byB3b3JrIG9rKS4KK1RoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGFsbCBuZXcgYm9hcmQgZGVzaWducyB3aWxsIGJlIHVzaW5nCitSZXYgQyBvciBsYXRlciBwYXJ0cyAtLSBpZiBub3QsIHlvdSBtYXkgYmUgaW4gZm9yIGEgcm91Z2ggcmlkZSA7LSkKKworVGhlIHBwYzQ0MCBwb3J0IGRvZXMgYSBmYWlyIGpvYiBvZiBrZWVwaW5nICJib2FyZC1zcGVjaWZpYyIgY29kZQorb3V0IG9mIHRoZSAiY3B1LXNwZWNpZmljIiBzb3VyY2UuIFRoZSBnb2FsIG9mIGNvdXJzZSB3YXMgdG8KK3Byb3ZpZGUgbWVjaGFuaXNtcyBmb3IgZWFjaCBib2FyZCB0byBjdXN0b21pemUgd2l0aG91dCBoYXZpbmcKK3RvIGNsdXR0ZXIgdGhlIGNwdS1zcGVjaWZpYyBzb3VyY2Ugd2l0aCBhIGxvdCBvZiBpZmRlZnMuIE1vc3QKK29mIHRoZXNlIG1lY2hhbmlzbXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgorCisKK01FTU9SWSBNQU5BR0VNRU5UCis9PT09PT09PT09PT09PT09PQorCitUaGUgcHBjNDQwIGRvZXNuJ3QgcnVuIGluICJyZWFsIG1vZGUiLiBUaGUgTU1VIG11c3QgYmUgYWN0aXZlCithdCBhbGwgdGltZXMuIEFkZGl0aW9uYWxseSwgdGhlIDQ0MCBpbXBsZW1lbnRzIGEgMzYtYml0IHBoeXNpY2FsCittZW1vcnkgc3BhY2UgdGhhdCBnZXRzIG1hcHBlZCBpbnRvIHRoZSBQb3dlclBDIDMyLWJpdCB2aXJ0dWFsCithZGRyZXNzIHNwYWNlLiBTbyB0aGluZ3MgbGlrZSBtZW1vcnktbWFwcGVkIHBlcmlwaGVyYWxzLCBldGMgbXVzdAorYWxsIGJlIG1hcHBlZCBpbi4gT25jZSB0aGlzIGlzIGRvbmUsIHRoZSAzMi1iaXQgdmlydHVhbCBhZGRyZXNzCitzcGFjZSBpcyB0aGVuIHZpZXdlZCBhcyB0aG91Z2ggaXQgd2VyZSBwaHlzaWNhbCBtZW1vcnkuCisKK0hvd2V2ZXIsIHRoaXMgbWVhbnMgdGhhdCBtZW1vcnksIHBlcmlwaGVyYWxzLCBldGMgY2FuIGJlIGNvbmZpZ3VyZWQKK3RvIGFwcGVhciAobW9zdGx5KSBhbnl3aGVyZSBpbiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlLiBFYWNoIGJvYXJkCittdXN0IGRlZmluZSBpdHMgb3duIG1hcHBpbmdzIHVzaW5nIHRoZSB0bGJ0YWIgKHNlZSBib2FyZC9lYm9ueS9pbml0LlMpLgorVGhlIGFjdHVhbCBUTEIgc2V0dXAgaXMgcGVyZm9ybWVkIGJ5IHRoZSBjcHUtc3BlY2lmaWMgY29kZS4KKworQWx0aG91Z2ggZWFjaCBib2FyZCBpcyBmcmVlIHRvIGRlZmluZSBpdHMgb3duIG1hcHBpbmdzLCB0aGVyZSBhcmUKK3NldmVyYWwgZGVmaW5pdGlvbnMgdG8gYmUgYXdhcmUgb2YuIFRoZXNlIGRlZmluaXRpb25zIG1heSBiZSB1c2VkIGluCit0aGUgY3B1LXNwZWNpZmljIGNvZGUgKHZzLiBib2FyZC1zcGVjaWZpYyBjb2RlKSwgc28geW91IHNob3VsZAorYXQgbGVhc3QgcmV2aWV3IHRoZXNlIGJlZm9yZSBkZWNpZGluZyB0byBtYWtlIGFueSBjaGFuZ2VzIC4uLiBpdAord2lsbCBwcm9iYWJseSBzYXZlIHlvdSBzb21lIGhlYWRhY2hlcyA7LSkKKworQ0ZHX1NEUkFNX0JBU0UgLSBUaGUgdmlydHVhbCBhZGRyZXNzIHdoZXJlIFNEUkFNIGlzIG1hcHBlZCAoYWx3YXlzIDApCisKK0NGR19GTEFTSF9CQVNFIC0gVGhlIHZpcnR1YWwgYWRkcmVzcyB3aGVyZSBGTEFTSCBpcyBtYXBwZWQuCisKK0NGR19QQ0lfTUVNQkFTRSAtIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgd2hlcmUgUENJLWJ1cyBtZW1vcnkgaXMgbWFwcGVkLgorICAgIFRoaXMgbWFwcGluZyBwcm92aWRlcyBhY2Nlc3MgdG8gUENJLWJ1cyBtZW1vcnkuCisKK0NGR19QRVJJUEhFUkFMX0JBU0UgLSBUaGUgdmlydHVhbCBhZGRyZXNzIHdoZXJlIHRoZSA0NDAgbWVtb3J5LW1hcHBlZAorICAgIHBlcmlwaGVyYWxzIGFyZSBtYXBwZWQuIChlLmcuIC0tIFVBUlQgcmVnaXN0ZXJzLCBJSUMgcmVnaXN0ZXJzLCBldGMpLgorCitDRkdfSVNSQU1fQkFTRSAtIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgd2hlcmUgdGhlIDQ0MCBpbnRlcm5hbCBTUkFNIGlzCisgICAgbWFwcGVkLiBUaGUgaW50ZXJuYWwgU1JBTSBpcyBlcXVpdmFsZW50IHRvIDQwNWdwIE9DTSBhbmQgaXMgdXNlZAorICAgIGZvciB0aGUgaW5pdGlhbCBzdGFjay4KKworQ0ZHX1BDSV9CQVNFIC0gVGhlIHZpcnR1YWwgYWRkcmVzcyB3aGVyZSB0aGUgNDQwIFBDSS14IGJyaWRnZSBjb25maWcKKyAgICByZWdpc3RlcnMgYXJlIG1hcHBlZC4KKworQ0ZHX1BDSV9UQVJHQkFTRSAtIFRoZSBQQ0kgYWRkcmVzcyB0aGF0IGlzIG1hcHBlZCB0byB0aGUgdmlydHVhbCBhZGRyZXNzCisgICAgZGVmaW5lZCBieSBDRkdfUENJX01FTUJBU0UuCisKKworVUFSVCAvIFNFUklBTAorPT09PT09PT09PT09PT09PT0KKworVGhlIFVBUlQgcG9ydCB3b3JrcyBmaW5lIHdoZW4gYW4gZXh0ZXJuYWwgc2VyaWFsIGNsb2NrIGlzIHByb3ZpZGVkCisobGlrZSB0aGUgb25lIG9uIHRoZSBFYm9ueSBib2FyZCkgYW5kIHdoZW4gdXNpbmcgaW50ZXJuYWwgY2xvY2tpbmcuCitUaGlzIGlzIGNvbnRyb2xsZWQgd2l0aCB0aGUgQ0ZHX0VYVF9TRVJJQUxfQ0xPQ0sgZmxhZy4gV2hlbiB1c2luZworaW50ZXJuYWwgY2xvY2tpbmcsIHRoZSAiaWRlYWwgYmF1ZCByYXRlIiBzZXR0aW5ncyBpbiB0aGUgNDQwR1AKK3VzZXIgbWFudWFsIGFyZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQuCisKK0NPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyBlbmFibGVzIGludGVycnVwdC1kcml2ZW4gc2VyaWFsIG9wZXJhdGlvbi4KK0J1dCB0aGUgbGFzdCB0aW1lIEkgY2hlY2tlZCwgaW50ZXJydXB0cyB3ZXJlIGluaXRpYWxpemVkIGFmdGVyIHRoZQorc2VyaWFsIHBvcnQgY2F1c2luZyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZQoraGFuZGxlciB0YWJsZS4gVGhpcyB3aWxsIHByb2JhYmx5IGJlIGZpeGVkIHNvb24gLi4uIG9yIGZpeCBpdAoreW91cnNlbGYgYW5kIHN1Ym1pdCBhIHBhdGNoIDotKQorCisKK0kyQworPT09PT09PT09PT09PT09PT0KKworVGhlIGkyYyB1dGlsaXRpZXMgaGF2ZSBiZWVuIHRlc3RlZCBvbiBib3RoIFJldiBCLiBhbmQgUmV2IEMuIGFuZAorbG9vayBnb29kLiBUaGUgaXByb2JlIGNvbW1hbmQgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZCB0bworYWxsb3cgZm9yICdza2lwcGVkJyBhZGRyZXNzZXMuIFNvbWUgaTJjIHNsYXZlcyBhcmUgd3JpdGUgb25seSBhbmQKK2NhdXNlIHByb2JsZW1zIHdoZW4gYSBwcm9iZSAocmVhZCkgaXMgcGVyZm9ybWVkIChmb3IgZXhhbXBsZSB0aGUKK0NEQ1Y4NTAgY2xvY2sgY29udHJvbGxlciBhdCBhZGRyZXNzIDB4Njkgb24gdGhlIGVib255IGJvYXJkKS4KKworVG8gcHJldmVudCBwcm9iaW5nIGNlcnRhaW4gYWRkcmVzc2VzIHlvdSBjYW4gZGVmaW5lIHRoZQorQ0ZHX0kyQ19OT1BST0JFUyBtYWNybyBpbiB5b3VyIGJvYXJkLXNwZWNpZmljIGhlYWRlciBmaWxlLiBXaGVuCitkZWZpbmVkLCBhbGwgc3BlY2lmaWVkIGFkZHJlc3NlcyBhcmUgc2tpcHBlZCBkdXJpbmcgYSBwcm9iZS4KK1RoZSBhZGRyZXNzZXMgdGhhdCBhcmUgc2tpcHBlZCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3V0cHV0CitvZiB0aGUgaXByb2JlIGNvbW1hbmQuCisKK0ZvciBleGFtcGxlLCB0byBwcmV2ZW50IHByb2JpbmcgYWRkcmVzcyAweDY5LCBkZWZpbmUgdGhlIG1hY3JvIGFzCitmb2xsb3dzOgorCisjZGVmaW5lIENGR19JMkNfTk9QUk9CRVMgezB4Njl9CisKK1NpbWlsYXJseSwgdG8gcHJldmVudCBwcm9iaW5nIGFkZHJlc3NlcyAweDY5IGFuZCAweDcwLCBkZWZpbmUgdGhlCittYWNybyBhOgorCisjZGVmaW5lIENGR19JMkNfTk9QUk9CRVMgezB4NjksIDB4NzB9CisKKworRERSIFNEUkFNIENPTlRST0xMRVIKKz09PT09PT09PT09PT09PT09PT09CisKK1NEUkFNIGNvbnRyb2xsZXIgaW50aWFsaXphdGlvbiB1c2luZyBTZXJpYWwgUHJlc2VuY2UgRGV0ZWN0IChTUEQpIGlzCitub3cgc3VwcG9ydGVkICh0aGFua3MgSnVuKS4gSXQgaXMgZW5hYmxlZCBieSBkZWZpbmluZyBDT05GSUdfU1BEX0VFUFJPTS4KK1RoZSBpMmMgZWVwcm9tIGFkZHJlc3NlcyBhcmUgY29udHJvbGxlZCBieSB0aGUgU1BEX0VFUFJPTV9BRERSRVNTIG1hY3JvLgorCitOT1RFOiBUaGUgU1BEX0VFUFJPTV9BRERSRVNTIG1hY3JvIGlzIGRlZmluZWQgZGlmZmVyZW50bHkgdGhhbiBmb3Igb3RoZXIKK3Byb2Nlc3NvcnMuIFRyYWRpdGlvbmFsbHksIGl0IGRlZmluZWQgYSBzaW5nbGUgYWRkcmVzcy4gRm9yIHRoZSA0NDAgaXQKK2RlZmluZXMgYW4gYXJyYXkgb2YgYWRkcmVzc2VzIHRvIHN1cHBvcnQgbXVsdGlwbGUgYmFua3MuIEFkZHJlc3Mgb3JkZXIKK2lzIHNpZ25pZmljYW50OiB0aGUgYWRkcmVzc2VzIGFyZSB1c2VkIGluIG9yZGVyIHRvIHByb2dyYW0gdGhlIEJhbmtOCityZWdpc3RlcnMuIEZvciBleGFtcGxlLCB0d28gYmFua3Mgd2l0aCBpMmMgYWRkcmVzc2VzIG9mIDB4NTMgKGJhbmsgMCkKK2FuZCAweDUyIChiYW5rIDEpIHdvdWxkIGJlIGRlZmluZWQgYXMgZm9sbG93czoKKworI2RlZmluZSBTUERfRUVQUk9NX0FERFJFU1MgezB4NTMsMHg1Mn0KKworCitQQ0ktWCBCUklER0UKKz09PT09PT09PT09PT09PT09PT09CisKK1BDSSBpcyBhbiBhcmVhIHRoYXQgcmVxdWlyZXMgbG90cyBvZiBmbGV4aWJpbGl0eSBzaW5jZSBldmVyeSBib2FyZCBoYXMKK2l0cyBvd24gc2V0IG9mIGNvbnN0cmFpbnRzIGFuZCBjb25maWd1cmF0aW9uLiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZQorNDQwIGltcGxlbWVudGF0aW9uLgorCitDUEMwX1NUUlAxW1BJU0VdIC0tIGlmIHRoZSBQSVNFIHN0cmFwIGJpdCBpcyBub3QgYXNzZXJ0ZWQsIFBDSSBpbml0CitpcyBhYm9ydGVkIGFuZCBhbiBpbmRpY2F0aW9uIGlzIHByaW50ZWQuIFRoaXMgaXMgTk9UIGNvbnNpZGVyZWQgYW4KK2Vycm9yIC0tIG9ubHkgYW4gaW5kaWNhdGlvbiB0aGF0IFBDSSBzaG91bGRuJ3QgYmUgaW5pdGlhbGl6ZWQuIFRoaXMKK2dpdmVzIHlvdSBhIGNoYW5jZSB0byBlZGl0IHRoZSBpMmMgYm9vdHN0cmFwIGVlcHJvbXMgdXNpbmcgdGhlIGkyYwordXRpbGl0aWVzIG9uY2UgeW91IGdldCB0byB0aGUgVS1Cb290IGNvbW1hbmQgcHJvbXB0LiBOT1RFOiB0aGUgZGVmYXVsdAorNDQwIGJvb3RzdHJhcCBvcHRpb25zIChub3QgdXNpbmcgaTJjIGVlcHJvbSkgbmVnYXRlcyB0aGlzIGJpdC4KKworVGhlIGNwdS1zcGVjaWZpYyBjb2RlIHNldHMgdXAgYSBkZWZhdWx0IHBjaV9jb250cm9sbGVyIHN0cnVjdHVyZQordGhhdCBtYXBzIGluIGEgc2luZ2xlIFBDSSBJL08gc3BhY2UgYW5kIFBDSSBtZW1vcnkgc3BhY2UuIFRoZSBJL08KK3NwYWNlIGJlZ2lucyBhdCBQQ0kgSS9PIGFkZHJlc3MgMCBhbmQgdGhlIFBDSSBtZW1vcnkgc3BhY2UgaXMKKzI1NiBNQiBzdGFydGluZyBhdCBQQ0kgYWRkcmVzcyBDRkdfUENJX1RBUkdCQVNFLiBBZnRlciB0aGUKK3BjaV9jb250cm9sbGVyIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgdGhlIGNwdS1zcGVjaWZpYyBjb2RlIHdpbGwKK2NhbGwgdGhlIHJvdXRpbmUgcGNpX3ByZV9pbml0KCkgaWYgdGhlIENGR19QQ0lfUFJFX0lOSVQgZmxhZyBpcworZGVmaW5lZC4gVGhpcyByb3V0aW5lIGlzIGltcGxlbWVudGVkIGJ5IGJvYXJkLXNwZWNpZmljIGNvZGUgJiBpcyB3aGVyZQordGhlIGJvYXJkIGNhbiBvdmVyLXJpZGUvZXh0ZW5kIHRoZSBkZWZhdWx0IHBjaV9jb250cm9sbGVyIHN0cnVjdHVyZQorc2V0dGluZ3MgYW5kIGRvIG90aGVyIHByZS1pbml0aWFsaXphdGlvbiB0YXNrcy4gSWYgcGNpX3ByZV9pbml0KCkKK3JldHVybnMgYSB2YWx1ZSBvZiB6ZXJvLCBQQ0kgaW5pdGlhbGl6YXRpb24gaXMgYWJvcnRlZDsgb3RoZXJ3aXNlIHRoZQorY29udHJvbGxlciBzdHJ1Y3R1cmUgaXMgcmVnaXN0ZXJlZCBhbmQgaW5pdGlhbGl6YXRpb24gY29udGludWVzLgorCitUaGUgZGVmYXVsdCA0NDBHUCBQQ0kgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gaXMgbWluaW1hbCAtLSBpdCBhc3N1bWVzIHRoYXQKK3RoZSBzdHJhcHBpbmcgcmVnaXN0ZXJzIGFyZSBzZXQgYXMgbmVjZXNzYXJ5LiBTaW5jZSB0aGUgc3RyYXBwaW5nIGJpdHMKK3Byb3ZpZGUgdmVyeSBsaW1pdGVkIGZsZXhpYmlsaXR5LCB5b3UgbWF5IHdhbnQgdG8gY3VzdG9taXplIHRoZSBib2FyZHMKK3RhcmdldCBjb25maWd1cmF0aW9uLiBJZiBDRkdfUENJX1RBUkdFVF9JTklUIGlzIGRlZmluZWQsIHRoZSBjcHUtc3BlY2lmaWMKK2NvZGUgd2lsbCBjYWxsIHRoZSByb3V0aW5lIHBjaV90YXJnZXRfaW5pdCgpIHdoaWNoIHlvdSBtdXN0IGltcGxlbWVudAoraW4geW91ciBib2FyZC1zcGVjaWZpYyBjb2RlLgorCitUYXJnZXQgaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVkIGJ5IHRoZSBjcHUtc3BlY2lmaWMgY29kZSBieQoraW5pdGlhbGl6aW5nIHRoZSBzdWJzeXN0ZW0gaWQgYW5kIHN1YnN5c3RlbSB2ZW5kb3IgaWQsIGFuZCB0aGVuIGVuc3VyaW5nCit0aGF0IHRoZSAnZW5hYmxlIGhvc3QgY29uZmlndXJhdGlvbicgYml0IGluIHRoZSBQQ0lYMF9CUkRHT1BUMiBpcyBzZXQuCisKK1RoZSBkZWZhdWx0IFBDSSBtYXN0ZXIgaW5pdGlhbGl6YXRpb24gbWFwcyBpbiAyNTYgTUIgb2YgcGNpIG1lbW9yeQorc3RhcnRpbmcgYXQgUENJIGFkZHJlc3MgQ0ZHX1BDSV9NRU1CQVNFLiBUbyBjdXN0b21pemUgdGhpcywgZGVmaW5lCitQQ0lfTUFTVEVSX0lOSVQuIFRoaXMgd2lsbCBjYWxsIHRoZSByb3V0aW5lIHBjaV9tYXN0ZXJfaW5pdCgpIGluIHlvdXIKK2JvYXJkLXNwZWNpZmljIGNvZGUgcmF0aGVyIHRoYW4gcGVyZm9ybWluZyB0aGUgZGVmYXVsdCBtYXN0ZXIKK2luaXRpYWxpemF0aW9uLgorCitUaGUgZGVjaXNpb24gdG8gcGVyZm9ybSBQQ0kgaG9zdCBjb25maWd1cmF0aW9uIG11c3Qgb2Z0ZW4gYmUgZGV0ZXJtaW5lZAorYXQgcnVuIHRpbWUuIFRoZSBwcGM0NDAgcG9ydCBkaWZmZXJzIGZyb20gbW9zdCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgaW4KK3RoYXQgaXQgcmVxdWlyZXMgdGhlIGJvYXJkIHRvIGRldGVybWluZSBpdHMgaG9zdCBjb25maWd1cmF0aW9uIGF0IHJ1bgordGltZSByYXRoZXIgdGhhbiBieSB1c2luZyBjb21waWxlLXRpbWUgZmxhZ3MuIFRoaXMgc2hvdWxkbid0IGNyZWF0ZSBhCitsYXJnZSBpbXBhY3Qgb24gdGhlIGJvYXJkLXNwZWNpZmljIGNvZGUgc2luY2UgdGhlIGJvYXJkIG9ubHkgbmVlZHMgdG8KK2ltcGxlbWVudCBhIHNpbmdsZSByb3V0aW5lIHRoYXQgcmV0dXJucyBhIHplcm8gb3Igbm9uLXplcm8gdmFsdWU6Citpc19wY2lfaG9zdCgpLgorCitKdXN0aWZpY2F0aW9uIGZvciB0aGlzIGJlY29tZXMgY2xlYXIgd2hlbiBjb25zaWRlcmluZyBzeXN0ZW1zIHJ1bm5pbmcKK2luIGEgY1BDSSBlbnZpcm9ubWVudDoKKworMS4gQXJiaXRlciBzdHJhcHBpbmc6IE1hbnkgY1BDSSBib2FyZHMgcHJvdmlkZSBhbiBleHRlcm5hbCBhcmJpdGVyIChvZnRlbgorcGFydCBvZiB0aGUgUENJLXRvLVBDSSBicmlkZ2UpLiBFdmVuIHRob3VnaCB0aGUgYXJiaXRlciBpcyBleHRlcm5hbCAodGhlCithcmJpdGVyIHN0cmFwcGluZyBpcyBuZWdhdGVkKSwgdGhlIENQVSBtYXkgc3RpbGwgYmUgcmVxdWlyZWQgdG8gcGVyZm9ybQorbG9jYWwgUENJIGJ1cyBjb25maWd1cmF0aW9uLgorCisyLiBIb3N0IG9ubHk6IFBQTUMgYm9hcmRzIG11c3Qgc2FtcGxlIHRoZSBNT05BUkNIIyBzaWduYWwgYXQgcnVuLXRpbWUuCitEZXBlbmRpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNhcnJpZXIgYm9hciwgdGhlIFBQTUMgYm9hcmQgbXVzdAorZGV0ZXJtaW5lIGlmIGl0IHNob3VsZCBjb25maWd1cmUgdGhlIFBDSSBidXMgYXQgcnVuLXRpbWUuIEFuZCBpbiBtb3N0CitjYXNlcywgYWNjZXNzIHRvIHRoZSBNT05BUkNIIyBzaWduYWwgaXMgYm9hcmQtc3BlY2lmaWMgKGUuZy4gdmlhCitib2FyZC1zcGVjaWZpYyBGUEdBIHJlZ2lzdGVycywgZXRjKS4KKworSW4gYW55IGV2ZW50LCB0aGUgaXNfcGNpX2hvc3QoKSByb3V0aW5lIGdpdmVzIGVhY2ggYm9hcmQgdGhlIG9wcG9ydHVuaXR5Cit0byBkZWNpZGUgYXQgcnVuLXRpbWUuIElmIHlvdXIgYm9hcmQgaXMgYWx3YXlzIGNvbmZpZ3VyZWQgYSBjZXJ0YWluIHdheSwKK3RoZW4ganVzdCBoYXJkY29kZSBhIHJldHVybiBvZiAxIG9yIDAgYXMgYXBwcm9wcmlhdGUuCisKKworCitSZWdhcmRzLAorLS1TY290dAorPHNtY251dHRAYXJ0ZXN5bmNwLmNvbT4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy8zYzU4OS5oIGIvZHJpdmVycy8zYzU4OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTdmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzLzNjNTg5LmgKQEAgLTAsMCArMSw0MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMgSGVyYiBQZXllcmwgKGhwZXllcmxAbm92YXRlbC5jYSkgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gMi4gVGhlIG5hbWUKKyAqIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KKyAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorIE9jdG9iZXIgMiwgMTk5NAorCisgTW9kaWZpZWQgYnk6IEFuZHJlcyBWZWdhIEdhcmNpYQorCisgSU5SSUEgLSBTb3BoaWEgQW50aXBvbGlzLCBGcmFuY2UKKyBlLW1haWw6IGF2ZWdhQHNvcGhpYS5pbnJpYS5mcgorIGZpbmdlcjogYXZlZ2FAcGF4LmlucmlhLmZyCisKKyAqLworCisvKgorICogQ3JlYXRlZCBmcm9tIGlmX2VwcmVnLmggYnkgRnJlZCBHcmF5IChmZ3JheUByaWNlLmVkdSkgdG8gc3VwcG9ydCB0aGUKKyAqIDNjNTkwIGZhbWlseS4KKyAqLworCisvKgorICogTW9kaWZpZWQgYnkgU2h1c3VrZSBOaXNpeWFtYSA8c2h1QGF0aGVuYS5xZS5lbmcuaG9rdWRhaS5hYy5qcD4KKyAqIGZvciBldGhlcmJvb3QKKyAqIE1hci4gMTQsIDIwMDAKKyovCisKKy8qCisgKiBFdGhlcm5ldCBzb2Z0d2FyZSBzdGF0dXMgcGVyIGludGVyZmFjZS4KKyAqLworCisvKgorICogU29tZSBnbG9iYWwgY29uc3RhbnRzCisgKi8KKworI2RlZmluZSBUWF9JTklUX1JBVEUgICAgICAgICAxNgorI2RlZmluZSBUWF9JTklUX01BWF9SQVRFICAgICA2NAorI2RlZmluZSBSWF9JTklUX0xBVEVOQ1kgICAgICA2NAorI2RlZmluZSBSWF9JTklUX0VBUkxZX1RIUkVTSCA2NAorI2RlZmluZSBNSU5fUlhfRUFSTFlfVEhSRVNIRiAgIDE2IC8qIG5vdCBsZXNzIHRoYW4gZXRoZXJfaGVhZGVyICovCisjZGVmaW5lIE1JTl9SWF9FQVJMWV9USFJFU0hMICAgNAorCisjZGVmaW5lIEVFUFJPTVNJWkUgICAgICAweDQwCisjZGVmaW5lIE1BWF9FRVBST01CVVNZICAxMDAwCisjZGVmaW5lIFZYX0xBU1RfVEFHICAgICAweGQ3CisjZGVmaW5lIFZYX01BWF9CT0FSRFMgICAxNgorI2RlZmluZSBWWF9JRF9QT1JUICAgICAgMHgxMDAKKworLyoKKyAqIHNvbWUgbWFjcm9zIHRvIGFjY2VzIGxvbmcgbmFtZWQgZmllbGRzCisgKi8KKyNkZWZpbmUgQkFTRSAJKEVMX0JBU0VfQUREUikKKworLyoKKyAqIENvbW1hbmRzIHRvIHJlYWQvd3JpdGUgRUVQUk9NIHRyb3VnaCBFRVBST00gY29tbWFuZCByZWdpc3RlciAoV2luZG93IDAsCisgKiBPZmZzZXQgMHhhKQorICovCisjZGVmaW5lIEVFUFJPTV9DTURfUkQgICAgMHgwMDgwCS8qIFJlYWQ6ICBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfV1IgICAgMHgwMDQwCS8qIFdyaXRlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfRVJBU0UgMHgwMGMwCS8qIEVyYXNlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfRVdFTiAgMHgwMDMwCS8qIEVyYXNlL1dyaXRlIEVuYWJsZTogTm8gZGF0YSByZXF1aXJlZCAqLworCisjZGVmaW5lIEVFUFJPTV9CVVNZCQkoMTw8MTUpCisKKy8qCisgKiBTb21lIHNob3J0IGZ1bmN0aW9ucywgd29ydGggdG8gbGV0IHRoZW0gYmUgYSBtYWNybworICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkgICoKKyAqIFRoZXNlIGRlZmluZSB0aGUgRUVQUk9NIGRhdGEgc3RydWN0dXJlLiAgVGhleSBhcmUgdXNlZCBpbiB0aGUgcHJvYmUKKyAqIGZ1bmN0aW9uIHRvIHZlcmlmeSB0aGUgZXhpc3RlbmNlIG9mIHRoZSBhZGFwdGVyIGFmdGVyIGhhdmluZyBzZW50CisgKiB0aGUgSURfU2VxdWVuY2UuCisgKgorICogVGhlcmUgYXJlIG90aGVycyBidXQgb25seSB0aGUgb25lcyB3ZSB1c2UgYXJlIGRlZmluZWQgaGVyZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRUVQUk9NX05PREVfQUREUl8wCTB4MAkvKiBXb3JkICovCisjZGVmaW5lIEVFUFJPTV9OT0RFX0FERFJfMQkweDEJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fTk9ERV9BRERSXzIJMHgyCS8qIFdvcmQgKi8KKyNkZWZpbmUgRUVQUk9NX1BST0RfSUQJCTB4MwkvKiAweDlbMC1mXTUwICovCisjZGVmaW5lIEVFUFJPTV9NRkdfSUQJCTB4NwkvKiAweDZkNTAgKi8KKyNkZWZpbmUgRUVQUk9NX0FERFJfQ0ZHCQkweDgJLyogQmFzZSBhZGRyICovCisjZGVmaW5lIEVFUFJPTV9SRVNPVVJDRV9DRkcJMHg5CS8qIElSUS4gQml0cyAxMi0xNSAqLworI2RlZmluZSBFRVBST01fT0VNX0FERFJfMAkweGEJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fT0VNX0FERFJfMQkweGIJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fT0VNX0FERFJfMgkweGMJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fU09GVF9JTkZPXzIJMHhmICAgICAvKiBTb2Z0d2FyZSBpbmZvcm1hdGlvbiAyICovCisKKyNkZWZpbmUgTk9fUlhfT1ZOX0FOT01BTFkgICAgICAgKDE8PDUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkJICAqCisgKiBUaGVzZSBhcmUgdGhlIHJlZ2lzdGVycyBmb3IgdGhlIDNDb20gM2M1MDkgYW5kIHRoZWlyIGJpdCBwYXR0ZXJucyB3aGVuICoKKyAqIGFwcGxpY2FibGUuICBUaGV5IGhhdmUgYmVlbiB0YWtlbiBvdXQgdGhlIHRoZSAiRXRoZXJMaW5rIElJSSBQYXJhbGxlbCAgKgorICogVGFza2luZyBFSVNBIGFuZCBJU0EgVGVjaG5pY2FsIFJlZmVyZW5jZSIgIkJldGEgRHJhZnQgMTAvMzAvOTIiIG1hbnVhbCAqCisgKiBmcm9tIDNjb20uCQkJCQkJCQkgICoKKyAqCQkJCQkJCQkJCSAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFZYX0NPTU1BTkQJCTB4MGUJLyogV3JpdGUuIEJBU0UrMHgwZSBpcyBhbHdheXMgYQorCQkJCQkgKiBjb21tYW5kIHJlZy4gKi8KKyNkZWZpbmUgVlhfU1RBVFVTCQkweDBlCS8qIFJlYWQuIEJBU0UrMHgwZSBpcyBhbHdheXMgc3RhdHVzCisJCQkJCSAqIHJlZy4gKi8KKyNkZWZpbmUgVlhfV0lORE9XCQkweDBmCS8qIFJlYWQuIEJBU0UrMHgwZiBpcyBhbHdheXMgd2luZG93CisJCQkJCSAqIHJlZy4gKi8KKy8qCisgKiBXaW5kb3cgMCByZWdpc3RlcnMuIFNldHVwLgorICovCisvKiBXcml0ZSAqLworI2RlZmluZSBWWF9XMF9FRVBST01fREFUQQkweDBjCisjZGVmaW5lIFZYX1cwX0VFUFJPTV9DT01NQU5ECTB4MGEKKyNkZWZpbmUgVlhfVzBfUkVTT1VSQ0VfQ0ZHCTB4MDgKKyNkZWZpbmUgVlhfVzBfQUREUkVTU19DRkcJMHgwNgorI2RlZmluZSBWWF9XMF9DT05GSUdfQ1RSTAkweDA0CisgICAgICAgIC8qIFJlYWQgKi8KKyNkZWZpbmUgVlhfVzBfUFJPRFVDVF9JRAkweDAyCisjZGVmaW5lIFZYX1cwX01GR19JRAkJMHgwMAorCisKKy8qCisgKiBXaW5kb3cgMSByZWdpc3RlcnMuIE9wZXJhdGluZyBTZXQuCisgKi8KKy8qIFdyaXRlICovCisjZGVmaW5lIFZYX1cxX1RYX1BJT19XUl8yCTB4MDIKKyNkZWZpbmUgVlhfVzFfVFhfUElPX1dSXzEJMHgwMAorLyogUmVhZCAqLworI2RlZmluZSBWWF9XMV9GUkVFX1RYCQkweDBjCisjZGVmaW5lIFZYX1cxX1RYX1NUQVRVUwkJMHgwYgkvKiBieXRlICovCisjZGVmaW5lIFZYX1cxX1RJTUVSCQkweDBhCS8qIGJ5dGUgKi8KKyNkZWZpbmUgVlhfVzFfUlhfU1RBVFVTCQkweDA4CisjZGVmaW5lIFZYX1cxX1JYX1BJT19SRF8yCTB4MDIKKyNkZWZpbmUgVlhfVzFfUlhfUElPX1JEXzEJMHgwMAorCisvKgorICogV2luZG93IDIgcmVnaXN0ZXJzLiBTdGF0aW9uIEFkZHJlc3MgU2V0dXAvUmVhZAorICovCisvKiBSZWFkL1dyaXRlICovCisjZGVmaW5lIFZYX1cyX0FERFJfNQkJMHgwNQorI2RlZmluZSBWWF9XMl9BRERSXzQJCTB4MDQKKyNkZWZpbmUgVlhfVzJfQUREUl8zCQkweDAzCisjZGVmaW5lIFZYX1cyX0FERFJfMgkJMHgwMgorI2RlZmluZSBWWF9XMl9BRERSXzEJCTB4MDEKKyNkZWZpbmUgVlhfVzJfQUREUl8wCQkweDAwCisKKy8qCisgKiBXaW5kb3cgMyByZWdpc3RlcnMuIEZJRk8gTWFuYWdlbWVudC4KKyAqLworLyogUmVhZCAqLworI2RlZmluZSBWWF9XM19JTlRFUk5BTF9DRkcJMHgwMAorI2RlZmluZSBWWF9XM19SRVNFVF9PUFQJCTB4MDgKKyNkZWZpbmUgVlhfVzNfRlJFRV9UWAkJMHgwYworI2RlZmluZSBWWF9XM19GUkVFX1JYCQkweDBhCisKKy8qCisgKiBXaW5kb3cgNCByZWdpc3RlcnMuIERpYWdub3N0aWNzLgorICovCisvKiBSZWFkL1dyaXRlICovCisjZGVmaW5lIFZYX1c0X01FRElBX1RZUEUJMHgwYQorI2RlZmluZSBWWF9XNF9DVFJMUl9TVEFUVVMJMHgwOAorI2RlZmluZSBWWF9XNF9ORVRfRElBRwkJMHgwNgorI2RlZmluZSBWWF9XNF9GSUZPX0RJQUcJCTB4MDQKKyNkZWZpbmUgVlhfVzRfSE9TVF9ESUFHCQkweDAyCisjZGVmaW5lIFZYX1c0X1RYX0RJQUcJCTB4MDAKKworLyoKKyAqIFdpbmRvdyA1IFJlZ2lzdGVycy4gIFJlc3VsdHMgYW5kIEludGVybmFsIHN0YXR1cy4KKyAqLworLyogUmVhZCAqLworI2RlZmluZSBWWF9XNV9SRUFEXzBfTUFTSwkweDBjCisjZGVmaW5lIFZYX1c1X0lOVFJfTUFTSwkJMHgwYQorI2RlZmluZSBWWF9XNV9SWF9GSUxURVIJCTB4MDgKKyNkZWZpbmUgVlhfVzVfUlhfRUFSTFlfVEhSRVNICTB4MDYKKyNkZWZpbmUgVlhfVzVfVFhfQVZBSUxfVEhSRVNICTB4MDIKKyNkZWZpbmUgVlhfVzVfVFhfU1RBUlRfVEhSRVNICTB4MDAKKworLyoKKyAqIFdpbmRvdyA2IHJlZ2lzdGVycy4gU3RhdGlzdGljcy4KKyAqLworLyogUmVhZC9Xcml0ZSAqLworI2RlZmluZSBUWF9UT1RBTF9PSwkJMHgwYworI2RlZmluZSBSWF9UT1RBTF9PSwkJMHgwYQorI2RlZmluZSBUWF9ERUZFUlJBTFMJCTB4MDgKKyNkZWZpbmUgUlhfRlJBTUVTX09LCQkweDA3CisjZGVmaW5lIFRYX0ZSQU1FU19PSwkJMHgwNgorI2RlZmluZSBSWF9PVkVSUlVOUwkJMHgwNQorI2RlZmluZSBUWF9DT0xMSVNJT05TCQkweDA0CisjZGVmaW5lIFRYX0FGVEVSXzFfQ09MTElTSU9OCTB4MDMKKyNkZWZpbmUgVFhfQUZURVJfWF9DT0xMSVNJT05TCTB4MDIKKyNkZWZpbmUgVFhfTk9fU1FFCQkweDAxCisjZGVmaW5lIFRYX0NEX0xPU1QJCTB4MDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvbW1hbmQgcmVnaXN0ZXIuIEFsbCB3aW5kb3dzLgorICoKKyAqIDE2IGJpdCByZWdpc3Rlci4KKyAqICAgICAxNS0xMTogIDUtYml0IGNvZGUgZm9yIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQuCisgKiAgICAgMTAtMDogICAxMS1iaXQgYXJnIGlmIGFueS4gRm9yIGNvbW1hbmRzIHdpdGggbm8gYXJnczsKKyAqCSAgICAgIHRoaXMgY2FuIGJlIHNldCB0byBhbnl0aGluZy4KKyAqLworI2RlZmluZSBHTE9CQUxfUkVTRVQJCSh1bnNpZ25lZCBzaG9ydCkgMHgwMDAwCS8qIFdhaXQgYXQgbGVhc3QgMW1zCisJCQkJCQkJICogYWZ0ZXIgaXNzdWluZyAqLworI2RlZmluZSBXSU5ET1dfU0VMRUNUCQkodW5zaWduZWQgc2hvcnQpICgweDE8PDExKQorI2RlZmluZSBTVEFSVF9UUkFOU0NFSVZFUgkodW5zaWduZWQgc2hvcnQpICgweDI8PDExKQkvKiBSZWFkIEFERFJfQ0ZHIHJlZyB0bworCQkJCQkJCSAqIGRldGVybWluZSB3aGV0aGVyCisJCQkJCQkJICogdGhpcyBpcyBuZWVkZWQuIElmCisJCQkJCQkJICogc287IHdhaXQgODAwIHVTZWMKKwkJCQkJCQkgKiBiZWZvcmUgdXNpbmcgdHJhbnMtCisJCQkJCQkJICogY2VpdmVyLiAqLworI2RlZmluZSBSWF9ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDM8PDExKQkvKiBzdGF0ZSBkaXNhYmxlZCBvbgorCQkJCQkJCSAqIHBvd2VyLXVwICovCisjZGVmaW5lIFJYX0VOQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHg0PDwxMSkKKyNkZWZpbmUgUlhfUkVTRVQJCSh1bnNpZ25lZCBzaG9ydCkgKDB4NTw8MTEpCisjZGVmaW5lIFJYX0RJU0NBUkRfVE9QX1BBQ0sJKHVuc2lnbmVkIHNob3J0KSAoMHg4PDwxMSkKKyNkZWZpbmUgVFhfRU5BQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDk8PDExKQorI2RlZmluZSBUWF9ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweGE8PDExKQorI2RlZmluZSBUWF9SRVNFVAkJKHVuc2lnbmVkIHNob3J0KSAoMHhiPDwxMSkKKyNkZWZpbmUgUkVRX0lOVFIJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Yzw8MTEpCisvKgorICogVGhlIGZvbGxvd2luZyBDXyogYWNrbm93bGVkZ2UgdGhlIHZhcmlvdXMgaW50ZXJydXB0cy4gU29tZSBvZiB0aGVtIGRvbid0CisgKiBkbyBhbnl0aGluZy4gIFNlZSB0aGUgbWFudWFsLgorICovCisjZGVmaW5lIEFDS19JTlRSCQkodW5zaWduZWQgc2hvcnQpICgweDY4MDApCisjCWRlZmluZSBDX0lOVFJfTEFUQ0gJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHgxKQorIwlkZWZpbmUgQ19DQVJEX0ZBSUxVUkUJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHgyKQorIwlkZWZpbmUgQ19UWF9DT01QTEVURQkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDQpCisjCWRlZmluZSBDX1RYX0FWQUlMCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4OCkKKyMJZGVmaW5lIENfUlhfQ09NUExFVEUJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHgxMCkKKyMJZGVmaW5lIENfUlhfRUFSTFkJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHgyMCkKKyMJZGVmaW5lIENfSU5UX1JRRAkJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHg0MCkKKyMJZGVmaW5lIENfVVBEX1NUQVRTCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4ODApCisjZGVmaW5lIFNFVF9JTlRSX01BU0sJCSh1bnNpZ25lZCBzaG9ydCkgKDB4ZTw8MTEpCisjZGVmaW5lIFNFVF9SRF8wX01BU0sJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Zjw8MTEpCisjZGVmaW5lIFNFVF9SWF9GSUxURVIJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTA8PDExKQorIwlkZWZpbmUgRklMX0lORElWSURVQUwJKHVuc2lnbmVkIHNob3J0KSAoMHgxKQorIwlkZWZpbmUgRklMX01VTFRJQ0FTVCAgICAgKHVuc2lnbmVkIHNob3J0KSAoMHgwMikKKyMJZGVmaW5lIEZJTF9CUkRDU1QgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4MDQpCisjCWRlZmluZSBGSUxfUFJPTUlTQyAgICAgICAodW5zaWduZWQgc2hvcnQpICgweDA4KQorI2RlZmluZSBTRVRfUlhfRUFSTFlfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTE8PDExKQorI2RlZmluZSBTRVRfVFhfQVZBSUxfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTI8PDExKQorI2RlZmluZSBTRVRfVFhfU1RBUlRfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTM8PDExKQorI2RlZmluZSBTVEFUU19FTkFCTEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTU8PDExKQorI2RlZmluZSBTVEFUU19ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDE2PDwxMSkKKyNkZWZpbmUgU1RPUF9UUkFOU0NFSVZFUgkodW5zaWduZWQgc2hvcnQpICgweDE3PDwxMSkKKworLyoKKyAqIFN0YXR1cyByZWdpc3Rlci4gQWxsIHdpbmRvd3MuCisgKgorICogICAgIDE1LTEzOiAgV2luZG93IG51bWJlcigwLTcpLgorICogICAgIDEyOiAgICAgQ29tbWFuZF9pbl9wcm9ncmVzcy4KKyAqICAgICAxMTogICAgIHJlc2VydmVkLgorICogICAgIDEwOiAgICAgcmVzZXJ2ZWQuCisgKiAgICAgOTogICAgICByZXNlcnZlZC4KKyAqICAgICA4OiAgICAgIHJlc2VydmVkLgorICogICAgIDc6ICAgICAgVXBkYXRlIFN0YXRpc3RpY3MuCisgKiAgICAgNjogICAgICBJbnRlcnJ1cHQgUmVxdWVzdGVkLgorICogICAgIDU6ICAgICAgUlggRWFybHkuCisgKiAgICAgNDogICAgICBSWCBDb21wbGV0ZS4KKyAqICAgICAzOiAgICAgIFRYIEF2YWlsYWJsZS4KKyAqICAgICAyOiAgICAgIFRYIENvbXBsZXRlLgorICogICAgIDE6ICAgICAgQWRhcHRlciBGYWlsdXJlLgorICogICAgIDA6ICAgICAgSW50ZXJydXB0IExhdGNoLgorICovCisjZGVmaW5lIFNfSU5UUl9MQVRDSAkJKHVuc2lnbmVkIHNob3J0KSAoMHgxKQorI2RlZmluZSBTX0NBUkRfRkFJTFVSRQkJKHVuc2lnbmVkIHNob3J0KSAoMHgyKQorI2RlZmluZSBTX1RYX0NPTVBMRVRFCQkodW5zaWduZWQgc2hvcnQpICgweDQpCisjZGVmaW5lIFNfVFhfQVZBSUwJCSh1bnNpZ25lZCBzaG9ydCkgKDB4OCkKKyNkZWZpbmUgU19SWF9DT01QTEVURQkJKHVuc2lnbmVkIHNob3J0KSAoMHgxMCkKKyNkZWZpbmUgU19SWF9FQVJMWQkJKHVuc2lnbmVkIHNob3J0KSAoMHgyMCkKKyNkZWZpbmUgU19JTlRfUlFECQkodW5zaWduZWQgc2hvcnQpICgweDQwKQorI2RlZmluZSBTX1VQRF9TVEFUUwkJKHVuc2lnbmVkIHNob3J0KSAoMHg4MCkKKyNkZWZpbmUgU19DT01NQU5EX0lOX1BST0dSRVNTCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTAwMCkKKworI2RlZmluZSBWWF9CVVNZX1dBSVQgd2hpbGUgKGludyhCQVNFICsgVlhfU1RBVFVTKSAmIFNfQ09NTUFORF9JTl9QUk9HUkVTUykKKworLyogQWRkcmVzcyBDb25maWcuIFJlZ2lzdGVyLgorICogV2luZG93IDAvUG9ydCAwNgorICovCisKKyNkZWZpbmUgQUNGX0NPTk5FQ1RPUl9CSVRTCTE0CisjZGVmaW5lIEFDRl9DT05ORUNUT1JfVVRQCTAKKyNkZWZpbmUgQUNGX0NPTk5FQ1RPUl9BVUkJMQorI2RlZmluZSBBQ0ZfQ09OTkVDVE9SX0JOQwkzCisKKyNkZWZpbmUgSU5URVJOQUxfQ09OTkVDVE9SX0JJVFMgMjAKKyNkZWZpbmUgSU5URVJOQUxfQ09OTkVDVE9SX01BU0sgMHgwMTcwMDAwMAorCisvKgorICogRklGTyBSZWdpc3RlcnMuIFJYIFN0YXR1cy4KKyAqCisgKiAgICAgMTU6ICAgICBJbmNvbXBsZXRlIG9yIEZJRk8gZW1wdHkuCisgKiAgICAgMTQ6ICAgICAxOiBFcnJvciBpbiBSWCBQYWNrZXQgICAwOiBJbmNvbXBsZXRlIG9yIG5vIGVycm9yLgorICogICAgIDEzLTExOiAgVHlwZSBvZiBlcnJvci4KKyAqCSAgICAgIDEwMDAgPSBPdmVycnVuLgorICoJICAgICAgMTAxMSA9IFJ1biBQYWNrZXQgRXJyb3IuCisgKgkgICAgICAxMTAwID0gQWxpZ25tZW50IEVycm9yLgorICoJICAgICAgMTEwMSA9IENSQyBFcnJvci4KKyAqCSAgICAgIDEwMDEgPSBPdmVyc2l6ZSBQYWNrZXQgRXJyb3IgKD4xNTE0IGJ5dGVzKQorICoJICAgICAgMDAxMCA9IERyaWJibGUgQml0cy4KKyAqCSAgICAgIChhbGwgb3RoZXIgZXJyb3IgY29kZXMsIG5vIGVycm9ycy4pCisgKgorICogICAgIDEwLTA6ICAgUlggQnl0ZXMgKDAtMTUxNCkKKyAqLworI2RlZmluZSBFUlJfSU5DT01QTEVURSAgKHVuc2lnbmVkIHNob3J0KSAoMHg4MDAwKQorI2RlZmluZSBFUlJfUlggICAgICAgICAgKHVuc2lnbmVkIHNob3J0KSAoMHg0MDAwKQorI2RlZmluZSBFUlJfTUFTSyAgICAgICAgKHVuc2lnbmVkIHNob3J0KSAoMHg3ODAwKQorI2RlZmluZSBFUlJfT1ZFUlJVTiAgICAgKHVuc2lnbmVkIHNob3J0KSAoMHg0MDAwKQorI2RlZmluZSBFUlJfUlVOVCAgICAgICAgKHVuc2lnbmVkIHNob3J0KSAoMHg1ODAwKQorI2RlZmluZSBFUlJfQUxJR05NRU5UICAgKHVuc2lnbmVkIHNob3J0KSAoMHg2MDAwKQorI2RlZmluZSBFUlJfQ1JDICAgICAgICAgKHVuc2lnbmVkIHNob3J0KSAoMHg2ODAwKQorI2RlZmluZSBFUlJfT1ZFUlNJWkUgICAgKHVuc2lnbmVkIHNob3J0KSAoMHg0ODAwKQorI2RlZmluZSBFUlJfRFJJQkJMRSAgICAgKHVuc2lnbmVkIHNob3J0KSAoMHgxMDAwKQorCisvKgorICogVFggU3RhdHVzLgorICoKKyAqICAgUmVwb3J0cyB0aGUgdHJhbnNtaXQgc3RhdHVzIG9mIGEgY29tcGxldGVkIHRyYW5zbWlzc2lvbi4gV3JpdGluZyB0aGlzCisgKiAgIHJlZ2lzdGVyIHBvcHMgdGhlIHRyYW5zbWl0IGNvbXBsZXRpb24gc3RhY2suCisgKgorICogICBXaW5kb3cgMS9Qb3J0IDB4MGIuCisgKgorICogICAgIDc6ICAgICAgQ29tcGxldGUKKyAqICAgICA2OiAgICAgIEludGVycnVwdCBvbiBzdWNjZXNzZnVsIHRyYW5zbWlzc2lvbiByZXF1ZXN0ZWQuCisgKiAgICAgNTogICAgICBKYWJiZXIgRXJyb3IgKFRQIE9ubHksIFRYIFJlc2V0IHJlcXVpcmVkLiApCisgKiAgICAgNDogICAgICBVbmRlcnJ1biAoVFggUmVzZXQgcmVxdWlyZWQuICkKKyAqICAgICAzOiAgICAgIE1heGltdW0gQ29sbGlzaW9ucy4KKyAqICAgICAyOiAgICAgIFRYIFN0YXR1cyBPdmVyZmxvdy4KKyAqICAgICAxLTA6ICAgIFVuZGVmaW5lZC4KKyAqCisgKi8KKyNkZWZpbmUgVFhTX0NPTVBMRVRFCQkweDgwCisjZGVmaW5lIFRYU19JTlRSX1JFUQkJMHg0MAorI2RlZmluZSBUWFNfSkFCQkVSCQkweDIwCisjZGVmaW5lIFRYU19VTkRFUlJVTgkJMHgxMAorI2RlZmluZSBUWFNfTUFYX0NPTExJU0lPTgkweDgKKyNkZWZpbmUgVFhTX1NUQVRVU19PVkVSRkxPVwkweDQKKworI2RlZmluZSBSU19BVUkJCQkoMTw8NSkKKyNkZWZpbmUgUlNfQk5DCQkJKDE8PDQpCisjZGVmaW5lIFJTX1VUUAkJCSgxPDwzKQorI2RlZmluZQlSU19UNAkJCSgxPDwwKQorI2RlZmluZQlSU19UWAkJCSgxPDwxKQorI2RlZmluZQlSU19GWAkJCSgxPDwyKQorI2RlZmluZQlSU19NSUkJCQkoMTw8NikKKworCisvKgorICogRklGTyBTdGF0dXMgKFdpbmRvdyA0KQorICoKKyAqICAgU3VwcG9ydHMgRklGTyBkaWFnbm9zdGljcworICoKKyAqICAgV2luZG93IDQvUG9ydCAweDA0LjEKKyAqCisgKiAgICAgMTU6CTE9UlggcmVjZWl2aW5nIChSTykuIFNldCB3aGVuIGEgcGFja2V0IGlzIGJlaW5nIHJlY2VpdmVkCisgKgkJaW50byB0aGUgUlggRklGTy4KKyAqICAgICAxNDoJUmVzZXJ2ZWQKKyAqICAgICAxMzoJMT1SWCB1bmRlcnJ1biAoUk8pLiBHZW5lcmF0ZXMgQWRhcHRlciBGYWlsdXJlIGludGVycnVwdC4KKyAqCQlSZXF1aXJlcyBSWCBSZXNldCBvciBHbG9iYWwgUmVzZXQgY29tbWFuZCB0byByZWNvdmVyLgorICoJCUl0IGlzIGdlbmVyYXRlZCB3aGVuIHlvdSByZWFkIHBhc3QgdGhlIGVuZCBvZiBhIHBhY2tldCAtCisgKgkJcmVhZGluZyBwYXN0IHdoYXQgaGFzIGJlZW4gcmVjZWl2ZWQgc28gZmFyIHdpbGwgZ2l2ZSBiYWQKKyAqCQlkYXRhLgorICogICAgIDEyOgkxPVJYIHN0YXR1cyBvdmVycnVuIChSTykuIFNldCB3aGVuIHRoZXJlIGFyZSBhbHJlYWR5IDgKKyAqCQlwYWNrZXRzIGluIHRoZSBSWCBGSUZPLiBXaGlsZSB0aGlzIGJpdCBpcyBzZXQsIG5vIGFkZGl0aW9uYWwKKyAqCQlwYWNrZXRzIGFyZSByZWNlaXZlZC4gUmVxdWlyZXMgbm8gYWN0aW9uIG9uIHRoZSBwYXJ0IG9mCisgKgkJdGhlIGhvc3QuIFRoZSBjb25kaXRpb24gaXMgY2xlYXJlZCBvbmNlIGEgcGFja2V0IGhhcyBiZWVuCisgKgkJcmVhZCBvdXQgb2YgdGhlIFJYIEZJRk8uCisgKiAgICAgMTE6CTE9Ulggb3ZlcnJ1biAoUk8pLiBTZXQgd2hlbiB0aGUgUlggRklGTyBpcyBmdWxsICh0aGVyZQorICoJCW1heSBub3QgYmUgYW4gb3ZlcnJ1biBwYWNrZXQgeWV0KS4gV2hpbGUgdGhpcyBiaXQgaXMgc2V0LAorICoJCW5vIGFkZGl0aW9uYWwgcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkIChzb21lIGFkZGl0aW9uYWwKKyAqCQlieXRlcyBjYW4gc3RpbGwgYmUgcGVuZGluZyBiZXR3ZWVuIHRoZSB3aXJlIGFuZCB0aGUgUlgKKyAqCQlGSUZPKS4gUmVxdWlyZXMgbm8gYWN0aW9uIG9uIHRoZSBwYXJ0IG9mIHRoZSBob3N0LiBUaGUKKyAqCQljb25kaXRpb24gaXMgY2xlYXJlZCBvbmNlIGEgZmV3IGJ5dGVzIGhhdmUgYmVlbiByZWFkIG91dAorICoJCWZyb20gdGhlIFJYIEZJRk8uCisgKiAgICAgMTA6CTE9VFggb3ZlcnJ1biAoUk8pLiBHZW5lcmF0ZXMgYWRhcHRlciBmYWlsdXJlIGludGVycnVwdC4KKyAqCQlSZXF1aXJlcyBUWCBSZXNldCBvciBHbG9iYWwgUmVzZXQgY29tbWFuZCB0byByZWNvdmVyLgorICoJCURpc2FibGVzIFRyYW5zbWl0dGVyLgorICogICAgIDktODoJVW5hc3NpZ25lZC4KKyAqICAgICA3LTA6CUJ1aWx0IGluIHNlbGYgdGVzdCBiaXRzIGZvciB0aGUgUlggYW5kIFRYIEZJRk8ncy4KKyAqLworI2RlZmluZSBGSUZPU19SWF9SRUNFSVZJTkcJKHVuc2lnbmVkIHNob3J0KSAweDgwMDAKKyNkZWZpbmUgRklGT1NfUlhfVU5ERVJSVU4JKHVuc2lnbmVkIHNob3J0KSAweDIwMDAKKyNkZWZpbmUgRklGT1NfUlhfU1RBVFVTX09WRVJSVU4JKHVuc2lnbmVkIHNob3J0KSAweDEwMDAKKyNkZWZpbmUgRklGT1NfUlhfT1ZFUlJVTgkodW5zaWduZWQgc2hvcnQpIDB4MDgwMAorI2RlZmluZSBGSUZPU19UWF9PVkVSUlVOCSh1bnNpZ25lZCBzaG9ydCkgMHgwNDAwCisKKy8qCisgKiBNaXNjIGRlZmluZXMgZm9yIHZhcmlvdXMgdGhpbmdzLgorICovCisjZGVmaW5lIFRBR19BREFQVEVSICAgICAgICAgICAgICAgICAgICAgMHhkMAorI2RlZmluZSBBQ1RJVkFURV9BREFQVEVSX1RPX0NPTkZJRyAgICAgIDB4ZmYKKyNkZWZpbmUgRU5BQkxFX0RSUV9JUlEgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTUZHX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwNmQgIC8qIGBUQ00nICovCisjZGVmaW5lIFBST0RfSUQgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDkwCisjZGVmaW5lIEdPX1dJTkRPVyh4KQkJb3V0dyhXSU5ET1dfU0VMRUNUfCh4KSxCQVNFK1ZYX0NPTU1BTkQpCisjZGVmaW5lIEpBQkJFUl9HVUFSRF9FTkFCTEUJMHg0MAorI2RlZmluZSBMSU5LQkVBVF9FTkFCTEUJCTB4ODAKKyNkZWZpbmUJRU5BQkxFX1VUUAkJKEpBQkJFUl9HVUFSRF9FTkFCTEUgfCBMSU5LQkVBVF9FTkFCTEUpCisjZGVmaW5lIERJU0FCTEVfVVRQCQkweDAKKyNkZWZpbmUgUlhfQllURVNfTUFTSwkJKHVuc2lnbmVkIHNob3J0KSAoMHgwN2ZmKQorI2RlZmluZSBSWF9FUlJPUiAgICAgICAgMHg0MDAwCisjZGVmaW5lIFJYX0lOQ09NUExFVEUgICAweDgwMDAKKyNkZWZpbmUgVFhfSU5ESUNBVEUJCTE8PDE1CisjZGVmaW5lIGlzX2VlcHJvbV9idXN5KGIpCShpbncoKGIpK1ZYX1cwX0VFUFJPTV9DT01NQU5EKSZFRVBST01fQlVTWSkKKworI2RlZmluZQlWWF9JT1NJWkUJMHgyMAorCisjZGVmaW5lIFZYX0NPTk5FQ1RPUlMgOAorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvNTcwMXJscy5jIGIvZHJpdmVycy81NzAxcmxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0MDllNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvNTcwMXJscy5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnJvYWRjb20gQkNNNTcwMCBMaW51eCBOZXR3b3JrIERyaXZlciwgQ29weXJpZ2h0IChjKSAyMDAwIEJyb2FkY29tICAgICAgICAgKi8KKy8qIENvcnBvcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICAgICovCisvKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAgICAqLworLyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgbG9jYXRlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBJTkNMVURFXzU3MDFfQVhfRklYCisKKyNpbmNsdWRlICJiY201NzB4X21tLmgiCisjaW5jbHVkZSAiNTcwMXJscy5oIgorCitMTV9TVEFUVVMgTE1fTG9hZFJsc0Zpcm13YXJlKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKyAgVDNfRldJTUdfSU5GTyBGd0ltZ0luZm87CisKKyAgRndJbWdJbmZvLlN0YXJ0QWRkcmVzcyA9IHQzRndTdGFydEFkZHI7CisgIEZ3SW1nSW5mby5UZXh0LkJ1ZmZlciA9IChQTE1fVUlOVDgpdDNGd1RleHQ7CisgIEZ3SW1nSW5mby5UZXh0Lk9mZnNldCAgPSB0M0Z3VGV4dEFkZHI7CisgIEZ3SW1nSW5mby5UZXh0Lkxlbmd0aCAgPSB0M0Z3VGV4dExlbjsKKyAgRndJbWdJbmZvLlJPbmx5RGF0YS5CdWZmZXIgPSAoUExNX1VJTlQ4KXQzRndSb2RhdGE7CisgIEZ3SW1nSW5mby5ST25seURhdGEuT2Zmc2V0ICA9IHQzRndSb2RhdGFBZGRyOworICBGd0ltZ0luZm8uUk9ubHlEYXRhLkxlbmd0aCAgPSB0M0Z3Um9kYXRhTGVuOworICBGd0ltZ0luZm8uRGF0YS5CdWZmZXIgPSAoUExNX1VJTlQ4KXQzRndEYXRhOworICBGd0ltZ0luZm8uRGF0YS5PZmZzZXQgID0gdDNGd0RhdGFBZGRyOworICBGd0ltZ0luZm8uRGF0YS5MZW5ndGggID0gdDNGd0RhdGFMZW47CisKKyAgaWYgKExNX0xvYWRGaXJtd2FyZShwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICZGd0ltZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgVDNfUlhfQ1BVX0lEIHwgVDNfVFhfQ1BVX0lELAorICAgICAgICAgICAgICAgICAgICAgIFQzX1JYX0NQVV9JRCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNlbmRpZiAvKiBJTkNMVURFXzU3MDFfQVhfRklYICovCmRpZmYgLS1naXQgYS9kcml2ZXJzLzU3MDFybHMuaCBiL2RyaXZlcnMvNTcwMXJscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjEyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzLzU3MDFybHMuaApAQCAtMCwwICsxLDE5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCcm9hZGNvbSBCQ001NzAwIExpbnV4IE5ldHdvcmsgRHJpdmVyLCBDb3B5cmlnaHQgKGMpIDIwMDAgQnJvYWRjb20gICAgICAgICAqLworLyogQ29ycG9yYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAgKi8KKy8qIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICAgICovCisvKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBsb2NhdGVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVTMyOworaW50IHQzRndSZWxlYXNlTWFqb3IgPSAweDA7CitpbnQgdDNGd1JlbGVhc2VNaW5vciA9IDB4MDsKK2ludCB0M0Z3UmVsZWFzZUZpeCA9IDB4MDsKK1UzMiB0M0Z3U3RhcnRBZGRyID0gMHgwODAwMDAwMDsKK1UzMiB0M0Z3VGV4dEFkZHIgPSAweDA4MDAwMDAwOworaW50IHQzRndUZXh0TGVuID0gMHg5YzA7CitVMzIgdDNGd1JvZGF0YUFkZHIgPSAweDA4MDAwOWMwOworaW50IHQzRndSb2RhdGFMZW4gPSAweDYwOworVTMyIHQzRndEYXRhQWRkciA9IDB4MDgwMDBhNDA7CitpbnQgdDNGd0RhdGFMZW4gPSAweDIwOworVTMyIHQzRndTYnNzQWRkciA9IDB4MDgwMDBhNjA7CitpbnQgdDNGd1Nic3NMZW4gPSAweGM7CitVMzIgdDNGd0Jzc0FkZHIgPSAweDA4MDAwYTcwOworaW50IHQzRndCc3NMZW4gPSAweDEwOworVTMyIHQzRndUZXh0WygweDljMC80KSArIDFdID0geworMHgwLAorMHgxMDAwMDAwMywgMHgwLCAweGQsIDB4ZCwKKzB4M2MxZDA4MDAsIDB4MzdiZDNmZmMsIDB4M2EwZjAyMSwgMHgzYzEwMDgwMCwKKzB4MjYxMDAwMDAsIDB4ZTAwMDAxOCwgMHgwLCAweGQsCisweDNjMWQwODAwLCAweDM3YmQzZmZjLCAweDNhMGYwMjEsIDB4M2MxMDA4MDAsCisweDI2MTAwMDM0LCAweGUwMDAyMWMsIDB4MCwgMHhkLAorMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZlMCwKKzB4M2MxY2MwMDAsIDB4YWZiZjAwMTgsIDB4YWY4MDY4MGMsIDB4ZTAwMDA0YywKKzB4MjQxYjIxMDUsIDB4OTc4NTAwMDAsIDB4OTc4NzAwMDIsIDB4OTc4MjAwMmMsCisweDk3ODMwMDJlLCAweDNjMDQwODAwLCAweDI0ODQwOWMwLCAweGFmYTAwMDE0LAorMHgyMTQwMCwgMHg2MjE4MjUsIDB4NTJjMDAsIDB4YWZhMzAwMTAsCisweDhmODYwMDEwLCAweGU1MjgyNSwgMHhlMDAwMDYwLCAweDI0MDcwMTAyLAorMHgzYzAyYWMwMCwgMHgzNDQyMDEwMCwgMHgzYzAzYWMwMSwgMHgzNDYzMDEwMCwKKzB4YWY4MjA0OTAsIDB4M2MwMmZmZmYsIDB4YWY4MjA0OTQsIDB4YWY4MzA0OTgsCisweGFmODIwNDljLCAweDI0MDIwMDAxLCAweGFmODI1Y2UwLCAweGUwMDAwM2YsCisweGFmODI1ZDAwLCAweGUwMDAxNDAsIDB4MCwgMHg4ZmJmMDAxOCwKKzB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyNDAyZmZmZiwgMHhhZjgyNTQwNCwKKzB4OGY4MzU0MDAsIDB4MzQ2MzA0MDAsIDB4YWY4MzU0MDAsIDB4YWY4MjU0MDQsCisweDNjMDIwODAwLCAweDI0NDIwMDM0LCAweGFmODI1NDFjLCAweDNlMDAwMDgsCisweGFmODA1NDAwLCAweDAsIDB4MCwgMHgzYzAyMDgwMCwKKzB4MzQ0MjMwMDAsIDB4M2MwMzA4MDAsIDB4MzQ2MzMwMDAsIDB4M2MwNDA4MDAsCisweDM0ODQzN2ZmLCAweDNjMDEwODAwLCAweGFjMjIwYTY0LCAweDI0MDIwMDQwLAorMHgzYzAxMDgwMCwgMHhhYzIyMGE2OCwgMHgzYzAxMDgwMCwgMHhhYzIwMGE2MCwKKzB4YWM2MDAwMDAsIDB4MjQ2MzAwMDQsIDB4ODMxMDJiLCAweDUwNDBmZmZkLAorMHhhYzYwMDAwMCwgMHgzZTAwMDA4LCAweDAsIDB4ODA0ODIxLAorMHg4ZmFhMDAxMCwgMHgzYzAyMDgwMCwgMHg4YzQyMGE2MCwgMHgzYzA0MDgwMCwKKzB4OGM4NDBhNjgsIDB4OGZhYjAwMTQsIDB4MjQ0MzAwMDEsIDB4NDQxMDJiLAorMHgzYzAxMDgwMCwgMHhhYzIzMGE2MCwgMHgxNDQwMDAwMywgMHg0MDIxLAorMHgzYzAxMDgwMCwgMHhhYzIwMGE2MCwgMHgzYzAyMDgwMCwgMHg4YzQyMGE2MCwKKzB4M2MwMzA4MDAsIDB4OGM2MzBhNjQsIDB4OTEyNDAwMDAsIDB4MjExNDAsCisweDQzMTAyMSwgMHg0ODEwMjEsIDB4MjUwODAwMDEsIDB4YTA0NDAwMDAsCisweDI5MDIwMDA4LCAweDE0NDBmZmY0LCAweDI1MjkwMDAxLCAweDNjMDIwODAwLAorMHg4YzQyMGE2MCwgMHgzYzAzMDgwMCwgMHg4YzYzMGE2NCwgMHg4Zjg0NjgwYywKKzB4MjExNDAsIDB4NDMxMDIxLCAweGFjNDQwMDA4LCAweGFjNDUwMDBjLAorMHhhYzQ2MDAxMCwgMHhhYzQ3MDAxNCwgMHhhYzRhMDAxOCwgMHgzZTAwMDA4LAorMHhhYzRiMDAxYywgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MjAwMDAwOCwKKzB4MCwgMHhhMDAwMWUzLCAweDNjMGEwMDAxLCAweGEwMDAxZTMsCisweDNjMGEwMDAyLCAweGEwMDAxZTMsIDB4MCwgMHhhMDAwMWUzLAorMHgwLCAweGEwMDAxZTMsIDB4MCwgMHhhMDAwMWUzLAorMHgwLCAweGEwMDAxZTMsIDB4MCwgMHhhMDAwMWUzLAorMHgwLCAweGEwMDAxZTMsIDB4MCwgMHhhMDAwMWUzLAorMHgwLCAweGEwMDAxZTMsIDB4MCwgMHhhMDAwMWUzLAorMHgzYzBhMDAwNywgMHhhMDAwMWUzLCAweDNjMGEwMDA4LCAweGEwMDAxZTMsCisweDNjMGEwMDA5LCAweGEwMDAxZTMsIDB4MCwgMHhhMDAwMWUzLAorMHgwLCAweGEwMDAxZTMsIDB4M2MwYTAwMGIsIDB4YTAwMDFlMywKKzB4M2MwYTAwMGMsIDB4YTAwMDFlMywgMHgzYzBhMDAwZCwgMHhhMDAwMWUzLAorMHgwLCAweGEwMDAxZTMsIDB4MCwgMHhhMDAwMWUzLAorMHgzYzBhMDAwZSwgMHhhMDAwMWUzLCAweDAsIDB4YTAwMDFlMywKKzB4MCwgMHhhMDAwMWUzLCAweDAsIDB4YTAwMDFlMywKKzB4MCwgMHhhMDAwMWUzLCAweDAsIDB4YTAwMDFlMywKKzB4MCwgMHhhMDAwMWUzLCAweDAsIDB4YTAwMDFlMywKKzB4MCwgMHhhMDAwMWUzLCAweDNjMGEwMDEzLCAweGEwMDAxZTMsCisweDNjMGEwMDE0LCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgwLAorMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZlMCwKKzB4MTgyMSwgMHgxMDIxLCAweGFmYmYwMDE4LCAweGFmYjEwMDE0LAorMHhhZmIwMDAxMCwgMHgzYzAxMDgwMCwgMHgyMjA4MjEsIDB4YWMyMDBhNzAsCisweDNjMDEwODAwLCAweDIyMDgyMSwgMHhhYzIwMGE3NCwgMHgzYzAxMDgwMCwKKzB4MjIwODIxLCAweGFjMjAwYTc4LCAweDI0NjMwMDAxLCAweDE4NjBmZmY1LAorMHgyNDQyMDAwYywgMHgyNDExMDAwMSwgMHg4ZjkwNjgxMCwgMHgzMjAyMDAwNCwKKzB4MTQ0MDAwMDUsIDB4MjQwNDAwMDEsIDB4M2MwMjA4MDAsIDB4OGM0MjBhNzgsCisweDE4NDAwMDAzLCAweDIwMjEsIDB4ZTAwMDE4MiwgMHgwLAorMHgzMjAyMDAwMSwgMHgxMDQwMDAwMywgMHgwLCAweGUwMDAxNjksCisweDAsIDB4YTAwMDE1MywgMHhhZjkxNTAyOCwgMHg4ZmJmMDAxOCwKKzB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwKKzB4M2MwNTA4MDAsIDB4OGNhNTBhNzAsIDB4M2MwNjA4MDAsIDB4OGNjNjBhODAsCisweDNjMDcwODAwLCAweDhjZTcwYTc4LCAweDI3YmRmZmUwLCAweDNjMDQwODAwLAorMHgyNDg0MDlkMCwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHhlMDAwMDYwLAorMHhhZmEwMDAxNCwgMHhlMDAwMTdiLCAweDIwMjEsIDB4OGZiZjAwMTgsCisweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjQwMjAwMDEsIDB4OGY4MzY4MTAsCisweDgyMTAwNCwgMHgyMTAyNywgMHg2MjE4MjQsIDB4M2UwMDAwOCwKKzB4YWY4MzY4MTAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjQsIDB4MTA4MDAwMmUsCisweGFmYjAwMDIwLCAweDhmODI1Y2VjLCAweGFmYTIwMDE4LCAweDhmODI1Y2VjLAorMHgzYzEwMDgwMCwgMHgyNjEwMGE3OCwgMHhhZmEyMDAxYywgMHgzNDAyODAwMCwKKzB4YWY4MjVjZWMsIDB4OGUwMjAwMDAsIDB4MTg0MDAwMTYsIDB4MCwKKzB4M2MwMjA4MDAsIDB4OTQ0MjBhNzQsIDB4OGZhMzAwMWMsIDB4MjIxYzAsCisweGFjODMwMDA0LCAweDhmYTIwMDFjLCAweDNjMDEwODAwLCAweGUwMDAyMDEsCisweGFjMjIwYTc0LCAweDEwNDAwMDA1LCAweDAsIDB4OGUwMjAwMDAsCisweDI0NDIwMDAxLCAweGEwMDAxZGYsIDB4YWUwMjAwMDAsIDB4M2MwMjA4MDAsCisweDhjNDIwYTcwLCAweDIxYzAyLCAweDMyMWMwLCAweGEwMDAxYzUsCisweGFmYTIwMDFjLCAweGUwMDAyMDEsIDB4MCwgMHgxMDQwMDAxZiwKKzB4MCwgMHg4ZTAyMDAwMCwgMHg4ZmEzMDAxYywgMHgyNDQyMDAwMSwKKzB4M2MwMTA4MDAsIDB4YWMyMzBhNzAsIDB4M2MwMTA4MDAsIDB4YWMyMzBhNzQsCisweGEwMDAxZGYsIDB4YWUwMjAwMDAsIDB4M2MxMDA4MDAsIDB4MjYxMDBhNzgsCisweDhlMDIwMDAwLCAweDE4NDAwMDI4LCAweDAsIDB4ZTAwMDIwMSwKKzB4MCwgMHgxNDQwMDAyNCwgMHgwLCAweDhlMDIwMDAwLAorMHgzYzAzMDgwMCwgMHg4YzYzMGE3MCwgMHgyNDQyZmZmZiwgMHhhZmEzMDAxYywKKzB4MTg0MDAwMDYsIDB4YWUwMjAwMDAsIDB4MzE0MDIsIDB4MjIxYzAsCisweDhjODIwMDA0LCAweDNjMDEwODAwLCAweGFjMjIwYTcwLCAweDk3YTIwMDFlLAorMHgyNDQyZmYwMCwgMHgyYzQyMDMwMCwgMHgxNDQwMDAwYiwgMHgyNDAyNDAwMCwKKzB4M2MwNDA4MDAsIDB4MjQ4NDA5ZGMsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsCisweDhmYTYwMDFjLCAweDI0MDUwMDA4LCAweGUwMDAwNjAsIDB4MzgyMSwKKzB4YTAwMDFkZiwgMHgwLCAweGFmODI1Y2Y4LCAweDNjMDIwODAwLAorMHg4YzQyMGE0MCwgMHg4ZmEzMDAxYywgMHgyNDQyMDAwMSwgMHhhZjgzNWNmOCwKKzB4M2MwMTA4MDAsIDB4YWMyMjBhNDAsIDB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsCisweDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4MjdiZGZmZTAsIDB4M2MwNDA4MDAsCisweDI0ODQwOWU4LCAweDI4MjEsIDB4MzAyMSwgMHgzODIxLAorMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHhlMDAwMDYwLCAweGFmYTAwMDE0LAorMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDhmODI2ODBjLAorMHg4Zjg1NjgwYywgMHgyMTgyNywgMHgzMTgyYiwgMHgzMTgyMywKKzB4NDMxMDI0LCAweDQ0MTAyMSwgMHhhMjI4MmIsIDB4MTBhMDAwMDYsCisweDAsIDB4NDAxODIxLCAweDhmODI2ODBjLCAweDQzMTAyYiwKKzB4MTQ0MGZmZmQsIDB4MCwgMHgzZTAwMDA4LCAweDAsCisweDNjMDQwODAwLCAweDhjODQwMDAwLCAweDNjMDMwODAwLCAweDhjNjMwYTQwLAorMHg2NDEwMmIsIDB4NTQ0MDAwMDIsIDB4ODMxMDIzLCAweDY0MTAyMywKKzB4MmM0MjAwMDgsIDB4M2UwMDAwOCwgMHgzODQyMDAwMSwgMHgyN2JkZmZlMCwKKzB4ODAyODIxLCAweDNjMDQwODAwLCAweDI0ODQwYTAwLCAweDMwMjEsCisweDM4MjEsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsIDB4ZTAwMDA2MCwKKzB4YWZhMDAwMTQsIDB4YTAwMDIxNiwgMHgwLCAweDhmYmYwMDE4LAorMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDAsIDB4MjdiZGZmZTAsCisweDNjMWNjMDAwLCAweGFmYmYwMDE4LCAweGUwMDAwNGMsIDB4YWY4MDY4MGMsCisweDNjMDQwODAwLCAweDI0ODQwYTEwLCAweDM4MDI4MjEsIDB4MzAyMSwKKzB4MzgyMSwgMHhhZmEwMDAxMCwgMHhlMDAwMDYwLCAweGFmYTAwMDE0LAorMHgyNDAyZmZmZiwgMHhhZjgyNTQwNCwgMHgzYzAyMDBhYSwgMHhlMDAwMjM0LAorMHhhZjgyNTQzNCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLAorMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZlOCwKKzB4YWZiMDAwMTAsIDB4MjQxMDAwMDEsIDB4YWZiZjAwMTQsIDB4M2MwMWMwMDMsCisweGFjMjAwMDAwLCAweDhmODI2ODEwLCAweDMwNDIyMDAwLCAweDEwNDAwMDAzLAorMHgwLCAweGUwMDAyNDYsIDB4MCwgMHhhMDAwMjNhLAorMHhhZjkwNTQyOCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LAorMHgyN2JkMDAxOCwgMHgyN2JkZmZmOCwgMHg4Zjg0NWQwYywgMHgzYzAyMDBmZiwKKzB4M2MwMzA4MDAsIDB4OGM2MzBhNTAsIDB4MzQ0MmZmZjgsIDB4ODIxMDI0LAorMHgxMDQzMDAxZSwgMHgzYzA1MDBmZiwgMHgzNGE1ZmZmOCwgMHgzYzA2YzAwMywKKzB4M2MwNzQwMDAsIDB4ODUxODI0LCAweDhjNjIwMDEwLCAweDNjMDEwODAwLAorMHhhYzIzMGE1MCwgMHgzMDQyMDAwOCwgMHgxMDQwMDAwNSwgMHg4NzEwMjUsCisweDhjYzIwMDAwLCAweDI0NDIwMDAxLCAweGFjYzIwMDAwLCAweDg3MTAyNSwKKzB4YWY4MjVkMGMsIDB4OGZhMjAwMDAsIDB4MjQ0MjAwMDEsIDB4YWZhMjAwMDAsCisweDhmYTIwMDAwLCAweDhmYTIwMDAwLCAweDI0NDIwMDAxLCAweGFmYTIwMDAwLAorMHg4ZmEyMDAwMCwgMHg4Zjg0NWQwYywgMHgzYzAzMDgwMCwgMHg4YzYzMGE1MCwKKzB4ODUxMDI0LCAweDE0NDNmZmU4LCAweDg1MTgyNCwgMHgyN2JkMDAwOCwKKzB4M2UwMDAwOCwgMHgwLCAweDAsIDB4MCB9OworVTMyIHQzRndSb2RhdGFbKDB4NjAvNCkgKyAxXSA9IHsKKzB4MzUzNzMwMzEsIDB4NzI2YzczNDEsIDB4MCwKKzB4MCwgMHg1Mzc3NDU3NiwgMHg2NTZlNzQzMCwgMHgwLAorMHg3MjZjNzA0NSwgMHg3NjY1NmU3NCwgMHgzMTAwMDAwMCwgMHg1NTZlNmI2ZSwKKzB4NDU3NjZlNzQsIDB4MCwgMHgwLCAweDAsCisweDAsIDB4NjY2MTc0NjEsIDB4NmM0NTcyNzIsIDB4MCwKKzB4MCwgMHg0ZDYxNjk2ZSwgMHg0MzcwNzU0MiwgMHgwLAorMHgwLCAweDAgfTsKK1UzMiB0M0Z3RGF0YVsoMHgyMC80KSArIDFdID0geworMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwLCAweDAsIDB4MCwKKzB4MCwgMHgwIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbTU3MHhfYXV0b25lZy5oIGIvZHJpdmVycy9iY201NzB4X2F1dG9uZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWZjYzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iY201NzB4X2F1dG9uZWcuaApAQCAtMCwwICsxLDQxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCcm9hZGNvbSBCQ001NzAwIExpbnV4IE5ldHdvcmsgRHJpdmVyLCBDb3B5cmlnaHQgKGMpIDIwMDEgQnJvYWRjb20gICAgICAgICAqLworLyogQ29ycG9yYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAgKi8KKy8qIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICAgICovCisvKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBsb2NhdGVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgQVVUT05FR19ICisjZGVmaW5lIEFVVE9ORUdfSAorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENvbnN0YW50cy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQU5fTElOS19USU1FUl9JTlRFUlZBTF9VUyAgICAgICAgICAgOTAwMCAgICAgICAvKiAxMG1zICovCisKKy8qIFRSVUUsIEZBTFNFICovCisjZGVmaW5lIEFOX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQU5fRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1haW4gZGF0YSBzdHJ1Y3R1cmUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgODAyLjN6IGF1dG8tbmVnb3RhdGlvbiBzdGF0ZSAqLworLyogdmFyaWFibGVzIGFzIHNob3duIGluIEZpZ3VyZSAzNy02IG9mIHRoZSBJRUVFIDgwMi4zeiBzcGVjaWZpY2F0aW9uLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBDdXJyZW50IGF1dG8tbmVnb3RpYXRpb24gc3RhdGUuICovCisgICAgdW5zaWduZWQgbG9uZyBTdGF0ZTsKKyAgICAjZGVmaW5lIEFOX1NUQVRFX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSBBTl9TVEFURV9BTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgQU5fU1RBVEVfQU5fUkVTVEFSVF9JTklUICAgICAgICAgICAgICAgIDIKKyAgICAjZGVmaW5lIEFOX1NUQVRFX0FOX1JFU1RBUlQgICAgICAgICAgICAgICAgICAgICAzCisgICAgI2RlZmluZSBBTl9TVEFURV9ESVNBQkxFX0xJTktfT0sgICAgICAgICAgICAgICAgNAorICAgICNkZWZpbmUgQU5fU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVCAgICAgICAgICAgIDUKKyAgICAjZGVmaW5lIEFOX1NUQVRFX0FCSUxJVFlfREVURUNUICAgICAgICAgICAgICAgICA2CisgICAgI2RlZmluZSBBTl9TVEFURV9BQ0tfREVURUNUX0lOSVQgICAgICAgICAgICAgICAgNworICAgICNkZWZpbmUgQU5fU1RBVEVfQUNLX0RFVEVDVCAgICAgICAgICAgICAgICAgICAgIDgKKyAgICAjZGVmaW5lIEFOX1NUQVRFX0NPTVBMRVRFX0FDS19JTklUICAgICAgICAgICAgICA5CisgICAgI2RlZmluZSBBTl9TVEFURV9DT01QTEVURV9BQ0sgICAgICAgICAgICAgICAgICAgMTAKKyAgICAjZGVmaW5lIEFOX1NUQVRFX0lETEVfREVURUNUX0lOSVQgICAgICAgICAgICAgICAxMQorICAgICNkZWZpbmUgQU5fU1RBVEVfSURMRV9ERVRFQ1QgICAgICAgICAgICAgICAgICAgIDEyCisgICAgI2RlZmluZSBBTl9TVEFURV9MSU5LX09LICAgICAgICAgICAgICAgICAgICAgICAgMTMKKyAgICAjZGVmaW5lIEFOX1NUQVRFX05FWFRfUEFHRV9XQUlUX0lOSVQgICAgICAgICAgICAxNAorICAgICNkZWZpbmUgQU5fU1RBVEVfTkVYVF9QQUdFX1dBSVQgICAgICAgICAgICAgICAgIDE2CisKKyAgICAvKiBMaW5rIHRpbWVyLiAqLworICAgIHVuc2lnbmVkIGxvbmcgTGlua1RpbWVfdXM7CisKKyAgICAvKiBDdXJyZW50IHRpbWUuICovCisgICAgdW5zaWduZWQgbG9uZyBDdXJyZW50VGltZV91czsKKworICAgIC8qIE5lZWQgdGhlc2UgdmFsdWVzIGZvciBjb25zaXN0ZW5jeSBjaGVjay4gKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBBYmlsaXR5TWF0Y2hDZmc7CisKKyAgICAvKiBBYmlsaXR5LCBpZGxlLCBhbmQgYWNrIG1hdGNoIGZ1bmN0aW9ucy4gKi8KKyAgICB1bnNpZ25lZCBsb25nIEFiaWxpdHlNYXRjaENudDsKKyAgICBjaGFyIEFiaWxpdHlNYXRjaDsKKyAgICBjaGFyIElkbGVNYXRjaDsKKyAgICBjaGFyIEFja01hdGNoOworCisgICAgLyogVHggY29uZmlnIGRhdGEgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgLyogVGhlIFR4Q29uZmlnIHJlZ2lzdGVyIGlzIGFycmFuZ2VkIGFzIGZvbGxvd3M6ICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBNU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExTQiAgKi8KKyAgICAgICAgLyogKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsgICovCisgICAgICAgIC8qIHwgRDd8IEQ2fCBENXwgRDR8IEQzfCBEMnwgRDF8IEQwfEQxNXxEMTR8RDEzfEQxMnxEMTF8RDEwfCBEOXwgRDh8ICAqLworICAgICAgICAvKiArLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKyAgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBENzoxOyAgICAgICAgLyogUFMxICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDY6MTsgICAgICAgIC8qIEhEICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDU6MTsgICAgICAgIC8qIEZEICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDQ6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMzoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQyOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDE6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMDoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQxNToxOyAgICAgICAvKiBOUCAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQxNDoxOyAgICAgICAvKiBBQ0sgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMTM6MTsgICAgICAgLyogUkYyICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDEyOjE7ICAgICAgIC8qIFJGMSAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQxMToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQxMDoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQ5OjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDg6MTsgICAgICAgIC8qIFBTMiAqLworI2Vsc2UgLyogQklHX0VORElBTl9IT1NUICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDg6MTsgICAgICAgIC8qIFBTMiAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQ5OjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDEwOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDExOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDEyOjE7ICAgICAgIC8qIFJGMSAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQxMzoxOyAgICAgICAvKiBSRjIgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMTQ6MTsgICAgICAgLyogQUNLICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDE1OjE7ICAgICAgIC8qIE5QICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDA6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQyOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDM6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBENDoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQ1OjE7ICAgICAgICAvKiBGRCAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQ2OjE7ICAgICAgICAvKiBIRCAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQ3OjE7ICAgICAgICAvKiBQUzEgKi8KKyNlbmRpZgorICAgICAgICB9IGJpdHM7CisKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgQXNVU0hPUlQ7CisKKyAgICAgICAgI2RlZmluZSBEOF9QUzIgICAgICAgICAgICAgICAgICAgICAgYml0cy5EOAorICAgICAgICAjZGVmaW5lIEQxMl9SRjEgICAgICAgICAgICAgICAgICAgICBiaXRzLkQxMgorICAgICAgICAjZGVmaW5lIEQxM19SRjIgICAgICAgICAgICAgICAgICAgICBiaXRzLkQxMworICAgICAgICAjZGVmaW5lIEQxNF9BQ0sgICAgICAgICAgICAgICAgICAgICBiaXRzLkQxNAorICAgICAgICAjZGVmaW5lIEQxNV9OUCAgICAgICAgICAgICAgICAgICAgICBiaXRzLkQxNQorICAgICAgICAjZGVmaW5lIEQ1X0ZEICAgICAgICAgICAgICAgICAgICAgICBiaXRzLkQ1CisgICAgICAgICNkZWZpbmUgRDZfSEQgICAgICAgICAgICAgICAgICAgICAgIGJpdHMuRDYKKyAgICAgICAgI2RlZmluZSBEN19QUzEgICAgICAgICAgICAgICAgICAgICAgYml0cy5ENworICAgIH0gVHhDb25maWc7CisKKyAgICAvKiBSeCBjb25maWcgZGF0YSAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICAvKiBUaGUgUnhDb25maWcgcmVnaXN0ZXIgaXMgYXJyYW5nZWQgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIE1TQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFNCICAqLworICAgICAgICAvKiArLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKyAgKi8KKyAgICAgICAgLyogfCBEN3wgRDZ8IEQ1fCBENHwgRDN8IEQyfCBEMXwgRDB8RDE1fEQxNHxEMTN8RDEyfEQxMXxEMTB8IEQ5fCBEOHwgICovCisgICAgICAgIC8qICstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rICAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworI2lmZGVmIEJJR19FTkRJQU5fSE9TVAorCSAgICB1bnNpZ25lZCBpbnQgRDc6MTsgICAgICAgIC8qIFBTMSAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQ2OjE7ICAgICAgICAvKiBIRCAqLworCSAgICB1bnNpZ25lZCBpbnQgRDU6MTsgICAgICAgIC8qIEZEICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDQ6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMzoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQyOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDE6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMDoxOworICAJICAgIHVuc2lnbmVkIGludCBEMTU6MTsgICAgICAgLyogTlAgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMTQ6MTsgICAgICAgLyogQUNLICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDEzOjE7ICAgICAgIC8qIFJGMiAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQxMjoxOyAgICAgICAvKiBSRjEgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMTE6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMTA6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEOToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQ4OjE7ICAgICAgICAvKiBQUzIgKi8KKyNlbHNlIC8qIEJJR19FTkRJQU5fSE9TVCAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQ4OjE7ICAgICAgICAvKiBQUzIgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEOToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQxMDoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQxMToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQxMjoxOyAgICAgICAvKiBSRjEgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMTM6MTsgICAgICAgLyogUkYyICovCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDE0OjE7ICAgICAgIC8qIEFDSyAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQxNToxOyAgICAgICAvKiBOUCAqLworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQwOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDE6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBEMjoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IEQzOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRDQ6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBENToxOyAgICAgICAgLyogRkQgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBENjoxOyAgICAgICAgLyogSEQgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBENzoxOyAgICAgICAgLyogUFMxICovCisjZW5kaWYKKyAgICAgICAgfSBiaXRzOworCisgICAgICAgIHVuc2lnbmVkIHNob3J0IEFzVVNIT1JUOworICAgIH0gUnhDb25maWc7CisKKyAgICAjZGVmaW5lIEFOX0NPTkZJR19OUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyAgICAjZGVmaW5lIEFOX0NPTkZJR19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyAgICAjZGVmaW5lIEFOX0NPTkZJR19SRjIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyAgICAjZGVmaW5lIEFOX0NPTkZJR19SRjEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyAgICAjZGVmaW5lIEFOX0NPTkZJR19QUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyAgICAjZGVmaW5lIEFOX0NPTkZJR19QUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyAgICAjZGVmaW5lIEFOX0NPTkZJR19IRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyAgICAjZGVmaW5lIEFOX0NPTkZJR19GRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKworCisgICAgLyogTWFuYWdlbWVudCByZWdpc3RlcnMuICovCisKKyAgICAvKiBDb250cm9sIHJlZ2lzdGVyLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGFuX2VuYWJsZToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGxvb3BiYWNrOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVzZXQ6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCByZXN0YXJ0X2FuOjE7CisgICAgICAgIH0gYml0czsKKworICAgICAgICB1bnNpZ25lZCBzaG9ydCBBc1VTSE9SVDsKKworICAgICAgICAjZGVmaW5lIG1yX2FuX2VuYWJsZSAgICAgICAgICAgICAgICBNcjAuYml0cy5hbl9lbmFibGUKKyAgICAgICAgI2RlZmluZSBtcl9sb29wYmFjayAgICAgICAgICAgICAgICAgTXIwLmJpdHMubG9vcGJhY2sKKyAgICAgICAgI2RlZmluZSBtcl9tYWluX3Jlc2V0ICAgICAgICAgICAgICAgTXIwLmJpdHMucmVzZXQKKyAgICAgICAgI2RlZmluZSBtcl9yZXN0YXJ0X2FuICAgICAgICAgICAgICAgTXIwLmJpdHMucmVzdGFydF9hbgorICAgIH0gTXIwOworCisgICAgLyogU3RhdHVzIHJlZ2lzdGVyLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGFuX2NvbXBsZXRlOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGlua19vazoxOworICAgICAgICB9IGJpdHM7CisKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgQXNVU0hPUlQ7CisKKyAgICAgICAgI2RlZmluZSBtcl9hbl9jb21wbGV0ZSAgICAgICAgICAgICAgTXIxLmJpdHMuYW5fY29tcGxldGUKKyAgICAgICAgI2RlZmluZSBtcl9saW5rX29rICAgICAgICAgICAgICAgICAgTXIxLmJpdHMubGlua19vaworICAgIH0gTXIxOworCisgICAgLyogQWR2ZXJ0aXNlbWVudCByZWdpc3Rlci4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF80OjU7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBoYWxmX2R1cGxleDoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHN5bV9wYXVzZToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGFzeW1fcGF1c2U6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF8xMTozOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlbW90ZV9mYXVsdDE6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCByZW1vdGVfZmF1bHQyOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMTQ6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBuZXh0X3BhZ2U6MTsKKyAgICAgICAgfSBiaXRzOworCisgICAgICAgIHVuc2lnbmVkIHNob3J0IEFzVVNIT1JUOworCisgICAgICAgICNkZWZpbmUgbXJfYWR2X2Z1bGxfZHVwbGV4ICAgICAgICAgIE1yNC5iaXRzLmZ1bGxfZHVwbGV4CisgICAgICAgICNkZWZpbmUgbXJfYWR2X2hhbGZfZHVwbGV4ICAgICAgICAgIE1yNC5iaXRzLmhhbGZfZHVwbGV4CisgICAgICAgICNkZWZpbmUgbXJfYWR2X3N5bV9wYXVzZSAgICAgICAgICAgIE1yNC5iaXRzLnN5bV9wYXVzZQorICAgICAgICAjZGVmaW5lIG1yX2Fkdl9hc3ltX3BhdXNlICAgICAgICAgICBNcjQuYml0cy5hc3ltX3BhdXNlCisgICAgICAgICNkZWZpbmUgbXJfYWR2X3JlbW90ZV9mYXVsdDEgICAgICAgIE1yNC5iaXRzLnJlbW90ZV9mYXVsdDEKKyAgICAgICAgI2RlZmluZSBtcl9hZHZfcmVtb3RlX2ZhdWx0MiAgICAgICAgTXI0LmJpdHMucmVtb3RlX2ZhdWx0MgorICAgICAgICAjZGVmaW5lIG1yX2Fkdl9uZXh0X3BhZ2UgICAgICAgICAgICBNcjQuYml0cy5uZXh0X3BhZ2UKKyAgICB9IE1yNDsKKworICAgIC8qIExpbmsgcGFydG5lciBhZHZlcnRpc2VtZW50IHJlZ2lzdGVyLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzQ6NTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBscF9mdWxsX2R1cGxleDoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGxwX2hhbGZfZHVwbGV4OjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbHBfc3ltX3BhdXNlOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbHBfYXN5bV9wYXVzZToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzExOjM7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbHBfcmVtb3RlX2ZhdWx0MToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGxwX3JlbW90ZV9mYXVsdDI6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBscF9hY2s6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBscF9uZXh0X3BhZ2U6MTsKKyAgICAgICAgfSBiaXRzOworCisgICAgICAgIHVuc2lnbmVkIHNob3J0IEFzVVNIT1JUOworCisgICAgICAgICNkZWZpbmUgbXJfbHBfYWR2X2Z1bGxfZHVwbGV4ICAgICAgIE1yNS5iaXRzLmxwX2Z1bGxfZHVwbGV4CisgICAgICAgICNkZWZpbmUgbXJfbHBfYWR2X2hhbGZfZHVwbGV4ICAgICAgIE1yNS5iaXRzLmxwX2hhbGZfZHVwbGV4CisgICAgICAgICNkZWZpbmUgbXJfbHBfYWR2X3N5bV9wYXVzZSAgICAgICAgIE1yNS5iaXRzLmxwX3N5bV9wYXVzZQorICAgICAgICAjZGVmaW5lIG1yX2xwX2Fkdl9hc3ltX3BhdXNlICAgICAgICBNcjUuYml0cy5scF9hc3ltX3BhdXNlCisgICAgICAgICNkZWZpbmUgbXJfbHBfYWR2X3JlbW90ZV9mYXVsdDEgICAgIE1yNS5iaXRzLmxwX3JlbW90ZV9mYXVsdDEKKyAgICAgICAgI2RlZmluZSBtcl9scF9hZHZfcmVtb3RlX2ZhdWx0MiAgICAgTXI1LmJpdHMubHBfcmVtb3RlX2ZhdWx0MgorICAgICAgICAjZGVmaW5lIG1yX2xwX2Fkdl9uZXh0X3BhZ2UgICAgICAgICBNcjUuYml0cy5scF9uZXh0X3BhZ2UKKyAgICB9IE1yNTsKKworICAgIC8qIEF1dG8tbmVnb3RpYXRpb24gZXhwYW5zaW9uIHJlZ2lzdGVyLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzA6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBwYWdlX3JlY2VpdmVkOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmV4dF9wYWdlYWJsZToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzE1OjEzOworICAgICAgICB9IGJpdHM7CisKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgQXNVU0hPUlQ7CisgICAgfSBNcjY7CisKKyAgICAvKiBBdXRvLW5lZ290aWF0aW9uIG5leHQgcGFnZSB0cmFuc21pdCByZWdpc3Rlci4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb2RlX2ZpZWxkOjExOworICAgICAgICAgICAgdW5zaWduZWQgaW50IHRvZ2dsZToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGFjazI6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBtZXNzYWdlX3BhZ2U6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF8xNDoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG5leHRfcGFnZToxOworICAgICAgICB9IGJpdHM7CisKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgQXNVU0hPUlQ7CisKKyAgICAgICAgI2RlZmluZSBtcl9ucF90eCAgICAgICAgICAgICAgICAgICAgTXI3LkFzVVNIT1JUCisgICAgfSBNcjc7CisKKyAgICAvKiBBdXRvLW5lZ290aWF0aW9uIGxpbmsgcGFydG5lciBhYmlsaXR5IHJlZ2lzdGVyLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvZGVfZmllbGQ6MTE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdG9nZ2xlOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWNrMjoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG1lc3NhZ2VfcGFnZToxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGFjazoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG5leHRfcGFnZToxOworICAgICAgICB9IGJpdHM7CisKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgQXNVU0hPUlQ7CisKKyAgICAgICAgI2RlZmluZSBtcl9scF9ucF9yeCAgICAgICAgICAgICAgICAgTXI4LkFzVVNIT1JUCisgICAgfSBNcjg7CisKKyAgICAvKiBFeHRlbmRlZCBzdGF0dXMgcmVnaXN0ZXIuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMTE6MTI7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmFzZTEwMDBfdF9oZDoxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGJhc2UxMDAwX3RfZmQ6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYXNlMTAwMF94X2hkOjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmFzZTEwMDBfeF9mZDoxOworICAgICAgICB9IGJpdHM7CisKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgQXNVU0hPUlQ7CisgICAgfSBNcjE1OworCisgICAgLyogTWlzY2VsbGFuZW91cyBzdGF0ZSB2YXJpYWJsZXMuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdG9nZ2xlX3R4OjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdG9nZ2xlX3J4OjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnBfcng6MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBwYWdlX3J4OjE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnBfbG9hZGVkOjE7CisgICAgICAgIH0gYml0czsKKworICAgICAgICB1bnNpZ25lZCBzaG9ydCBBc1VTSE9SVDsKKworICAgICAgICAjZGVmaW5lIG1yX3RvZ2dsZV90eCAgICAgICAgICAgICAgICBNck1pc2MuYml0cy50b2dnbGVfdHgKKyAgICAgICAgI2RlZmluZSBtcl90b2dnbGVfcnggICAgICAgICAgICAgICAgTXJNaXNjLmJpdHMudG9nZ2xlX3J4CisgICAgICAgICNkZWZpbmUgbXJfbnBfcnggICAgICAgICAgICAgICAgICAgIE1yTWlzYy5iaXRzLm5wX3J4CisgICAgICAgICNkZWZpbmUgbXJfcGFnZV9yeCAgICAgICAgICAgICAgICAgIE1yTWlzYy5iaXRzLnBhZ2VfcngKKyAgICAgICAgI2RlZmluZSBtcl9ucF9sb2FkZWQgICAgICAgICAgICAgICAgTXJNaXNjLmJpdHMubnBfbG9hZGVkCisgICAgfSBNck1pc2M7CisKKworICAgIC8qIEltcGxlbWVudCBzcGVjaWZpY3MgKi8KKworICAgIC8qIFBvaW50ZXIgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmUuICovCisgICAgdm9pZCAqcENvbnRleHQ7Cit9IEFOX1NUQVRFX0lORk8sICpQQU5fU1RBVEVfSU5GTzsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSZXR1cm4gY29kZSBvZiBBdXRvbmVnODAyM3ouICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGVudW0KK3sKKyAgICBBVVRPTkVHX1NUQVRVU19PSyAgICAgICAgICAgICAgID0gMCwKKyAgICBBVVRPTkVHX1NUQVRVU19ET05FICAgICAgICAgICAgID0gMSwKKyAgICBBVVRPTkVHX1NUQVRVU19USU1FUl9FTkFCTEVEICAgID0gMiwKKyAgICBBVVRPTkVHX1NUQVRVU19GQUlMRUQgICAgICAgICAgID0gMHhmZmZmZmZmCit9IEFVVE9ORUdfU1RBVFVTLCAqUEFVVE9ORUdfU1RBVFVTOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBVVRPTkVHX1NUQVRVUyBBdXRvbmVnODAyM3ooUEFOX1NUQVRFX0lORk8gcEFuSW5mbyk7Cit2b2lkIEF1dG9uZWdJbml0KFBBTl9TVEFURV9JTkZPIHBBbkluZm8pOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBvcy1kZXBlbmRlbnQgbW9kdWxlLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNTV9BblR4Q29uZmlnKFBBTl9TVEFURV9JTkZPIHBBbkluZm8pOwordm9pZCBNTV9BblR4SWRsZShQQU5fU1RBVEVfSU5GTyBwQW5JbmZvKTsKK2NoYXIgTU1fQW5SeENvbmZpZyhQQU5fU1RBVEVfSU5GTyBwQW5JbmZvLCB1bnNpZ25lZCBzaG9ydCAqcFJ4Q29uZmlnKTsKKworCisKKyNlbmRpZiAvKiBBVVRPTkVHX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY201NzB4X2RlYnVnLmggYi9kcml2ZXJzL2JjbTU3MHhfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTY4OGNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iY201NzB4X2RlYnVnLmgKQEAgLTAsMCArMSwxMTEgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCcm9hZGNvbSBCQ001NzAwIExpbnV4IE5ldHdvcmsgRHJpdmVyLCBDb3B5cmlnaHQgKGMpIDIwMDAgQnJvYWRjb20gICAgICAgICAqLworLyogQ29ycG9yYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAgKi8KKy8qIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICAgICovCisvKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBsb2NhdGVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAwMi8yNS8wMCBIYXYgS2hhdXYgICAgICAgIEluaXRpYWwgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBERUJVR19ICisjZGVmaW5lIERFQlVHX0gKKworI2lmZGVmIFZYV09SS1MKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlYnVnIG1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb2RlIHBhdGggZm9yIGNvbnRyb2xsaW5nIG91dHB1dCBkZWJ1ZyBtZXNzYWdlcy4gKi8KKy8qIERlZmluZSB5b3VyIGNvZGUgcGF0aCBoZXJlLiAqLworI2RlZmluZSBDUF9JTklUICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAKKyNkZWZpbmUgQ1BfU0VORCAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwCisjZGVmaW5lIENQX1JDViAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMAorI2RlZmluZSBDUF9JTlQgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAKKyNkZWZpbmUgQ1BfVUlOSVQgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwCisjZGVmaW5lIENQX1JFU0VUICAgICAgICAgICAgICAgICAgICAweDIwMDAwMAorCisjZGVmaW5lIENQX0FMTCAgICAgICAgICAgICAgICAgICAgICAoQ1BfSU5JVCB8IENQX1NFTkQgfCBDUF9SQ1YgfCBDUF9JTlQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUF9SRVNFVCB8IENQX1VJTklUKQorCisjZGVmaW5lIENQX01BU0sgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisKKworLyogRGVidWcgbWVzc2FnZSBsZXZlbHMuICovCisjZGVmaW5lIExWX1ZFUkJPU0UgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIExWX0lORk9STSAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIExWX1dBUk4gICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIExWX0ZBVEFMICAgICAgICAgICAgICAgICAgICAweDAwCisKKyNkZWZpbmUgTFZfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCisKKy8qIENvZGUgcGF0aCBhbmQgbWVzc3NhZ2UgbGV2ZWwgY29tYmluZWQuICBUaGVzZSBhcmUgdGhlIGZpcnN0IGFyZ3VtZW50IG9mICovCisvKiB0aGUgRGJnTWVzc2FnZSBtYWNyby4gKi8KKyNkZWZpbmUgSU5JVF9WICAgICAgICAgICAgICAgICAgICAgIChDUF9JTklUIHwgTFZfVkVSQk9TRSkKKyNkZWZpbmUgSU5JVF9JICAgICAgICAgICAgICAgICAgICAgIChDUF9JTklUIHwgTFZfSU5GT1JNKQorI2RlZmluZSBJTklUX1cgICAgICAgICAgICAgICAgICAgICAgKENQX0lOSVQgfCBMVl9XQVJOKQorI2RlZmluZSBTRU5EX1YgICAgICAgICAgICAgICAgICAgICAgKENQX1NFTkQgfCBMVl9WRVJCT1NFKQorI2RlZmluZSBTRU5EX0kgICAgICAgICAgICAgICAgICAgICAgKENQX1NFTkQgfCBMVl9JTkZPUk0pCisjZGVmaW5lIFNFTkRfVyAgICAgICAgICAgICAgICAgICAgICAoQ1BfU0VORCB8IExWX1dBUk4pCisjZGVmaW5lIFJDVl9WICAgICAgICAgICAgICAgICAgICAgICAoQ1BfUkNWIHwgTFZfVkVSQk9TRSkKKyNkZWZpbmUgUkNWX0kgICAgICAgICAgICAgICAgICAgICAgIChDUF9SQ1YgfCBMVl9JTkZPUk0pCisjZGVmaW5lIFJDVl9XICAgICAgICAgICAgICAgICAgICAgICAoQ1BfUkNWIHwgTFZfV0FSTikKKyNkZWZpbmUgSU5UX1YgICAgICAgICAgICAgICAgICAgICAgIChDUF9JTlQgfCBMVl9WRVJCT1NFKQorI2RlZmluZSBJTlRfSSAgICAgICAgICAgICAgICAgICAgICAgKENQX0lOVCB8IExWX0lORk9STSkKKyNkZWZpbmUgSU5UX1cgICAgICAgICAgICAgICAgICAgICAgIChDUF9JTlQgfCBMVl9XQVJOKQorI2RlZmluZSBVSU5JVF9WICAgICAgICAgICAgICAgICAgICAgKENQX1VJTklUIHwgTFZfVkVSQk9TRSkKKyNkZWZpbmUgVUlOSVRfSSAgICAgICAgICAgICAgICAgICAgIChDUF9VSU5JVCB8IExWX0lORk9STSkKKyNkZWZpbmUgVUlOSVRfVyAgICAgICAgICAgICAgICAgICAgIChDUF9VSU5JVCB8IExWX1dBUk4pCisjZGVmaW5lIFJFU0VUX1YgICAgICAgICAgICAgICAgICAgICAoQ1BfUkVTRVQgfCBMVl9WRVJCT1NFKQorI2RlZmluZSBSRVNFVF9JICAgICAgICAgICAgICAgICAgICAgKENQX1JFU0VUIHwgTFZfSU5GT1JNKQorI2RlZmluZSBSRVNFVF9XICAgICAgICAgICAgICAgICAgICAgKENQX1JFU0VUIHwgTFZfV0FSTikKKyNkZWZpbmUgQ1BBTExfViAgICAgICAgICAgICAgICAgICAgIChDUF9BTEwgfCBMVl9WRVJCT1NFKQorI2RlZmluZSBDUEFMTF9JICAgICAgICAgICAgICAgICAgICAgKENQX0FMTCB8IExWX0lORk9STSkKKyNkZWZpbmUgQ1BBTExfVyAgICAgICAgICAgICAgICAgICAgIChDUF9BTEwgfCBMVl9XQVJOKQorCisKKy8qIEFsbCBjb2RlIHBhdGggbWVzc2FnZSBsZXZlbHMuICovCisjZGVmaW5lIEZBVEFMICAgICAgICAgICAgICAgICAgICAgICAoQ1BfQUxMIHwgTFZfRkFUQUwpCisjZGVmaW5lIFdBUk4gICAgICAgICAgICAgICAgICAgICAgICAoQ1BfQUxMIHwgTFZfV0FSTikKKyNkZWZpbmUgSU5GT1JNICAgICAgICAgICAgICAgICAgICAgIChDUF9BTEwgfCBMVl9JTkZPUk0pCisjZGVmaW5lIFZFUkJPU0UgICAgICAgICAgICAgICAgICAgICAoQ1BfQUxMIHwgTFZfVkVSQk9TRSkKKworCisvKiBUaGVzZSBjb25zdGFudHMgY29udHJvbCB0aGUgbWVzc2FnZSBvdXRwdXQuICovCisvKiBTZXQgeW91ciBkZWJ1ZyBtZXNzYWdlIG91dHB1dCBsZXZlbCBhbmQgY29kZSBwYXRoIGhlcmUuICovCisjaWZuZGVmIERCR19NU0dfQ1AKKyNkZWZpbmUgREJHX01TR19DUCAgICAgICAgICAgICAgICAgIENQX0FMTCAgICAgIC8qIFdoZXJlIHRvIG91dHB1dCBtZXNzYWdlcy4gKi8KKyNlbmRpZgorCisjaWZuZGVmIERCR19NU0dfTFYKKyNkZWZpbmUgREJHX01TR19MViAgICAgICAgICAgICAgICAgIExWX1ZFUkJPU0UgIC8qIExldmVsIG9mIG1lc3NhZ2Ugb3V0cHV0LiAqLworI2VuZGlmCisKKy8qIERiZ01lc3NhZ2UgbWFjcm8uICovCisjaWYgREJHCisjZGVmaW5lIERiZ01lc3NhZ2UoQ05UUkwsIE1FU1NBR0UpICBcCisgICAgaWYoKENOVFJMICYgREJHX01TR19DUCkgJiYgKChDTlRSTCAmIExWX01BU0spIDw9IERCR19NU0dfTFYpKSBcCisgICAgICAgIHByaW50ZiBNRVNTQUdFCisjZGVmaW5lIERiZ0JyZWFrKCkgICAgICAgICAgICAgICAgIERiZ0JyZWFrUG9pbnQoKQorI3VuZGVmIFNUQVRJQworI2RlZmluZSBTVEFUSUMKKyNlbHNlCisjZGVmaW5lIERiZ01lc3NhZ2UoQ05UUkwsIE1FU1NBR0UpCisjZGVmaW5lIERiZ0JyZWFrKCkKKyN1bmRlZiBTVEFUSUMKKyNkZWZpbmUgU1RBVElDIHN0YXRpYworI2VuZGlmIC8qIERCRyAqLworCisKKworI2VuZGlmIC8qIERFQlVHX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY201NzB4X2xtLmggYi9kcml2ZXJzL2JjbTU3MHhfbG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA3M2E4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iY201NzB4X2xtLmgKQEAgLTAsMCArMSw0NjkgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCcm9hZGNvbSBCQ001NzAwIExpbnV4IE5ldHdvcmsgRHJpdmVyLCBDb3B5cmlnaHQgKGMpIDIwMDAgQnJvYWRjb20gICAgICAgICAqLworLyogQ29ycG9yYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAgKi8KKy8qIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICAgICovCisvKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBsb2NhdGVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAwMi8yNS8wMCBIYXYgS2hhdXYgICAgICAgIEluaXRpYWwgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBMTV9ICisjZGVmaW5lIExNX0gKKworI2luY2x1ZGUgImJjbTU3MHhfcXVldWUuaCIKKyNpbmNsdWRlICJiY201NzB4X2JpdHMuaCIKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCYXNpYyB0eXBlcy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgY2hhciAgICAgICAgICAgTE1fQ0hBUiwgICAgKlBMTV9DSEFSOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICBMTV9VSU5ULCAgICAqUExNX1VJTlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIExNX1VJTlQ4LCAgICpQTE1fVUlOVDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IExNX1VJTlQxNiwgICpQTE1fVUlOVDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICBMTV9VSU5UMzIsICAqUExNX1VJTlQzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgTE1fQ09VTlRFUiwgKlBMTV9DT1VOVEVSOwordHlwZWRlZiB2b2lkICAgICAgICAgICBMTV9WT0lELCAgICAqUExNX1ZPSUQ7Cit0eXBlZGVmIGNoYXIgICAgICAgICAgIExNX0JPT0wsICAgICpQTE1fQk9PTDsKKworLyogNjRiaXQgdmFsdWUuICovCit0eXBlZGVmIHN0cnVjdCB7CisjaWZkZWYgQklHX0VORElBTl9IT1NUCisgICAgTE1fVUlOVDMyIEhpZ2g7CisgICAgTE1fVUlOVDMyIExvdzsKKyNlbHNlIC8qIEJJR19FTkRJQU5fSE9TVCAqLworICAgIExNX1VJTlQzMiBMb3c7CisgICAgTE1fVUlOVDMyIEhpZ2g7CisjZW5kaWYgLyogIUJJR19FTkRJQU5fSE9TVCAqLworfSBMTV9VSU5UNjQsICpQTE1fVUlOVDY0OworCit0eXBlZGVmIExNX1VJTlQ2NCBMTV9QSFlTSUNBTF9BRERSRVNTLCAqUExNX1BIWVNJQ0FMX0FERFJFU1M7CisKKy8qIHZvaWQgTE1fSU5DX1BIWVNJQ0FMX0FERFJFU1MoUExNX1BIWVNJQ0FMX0FERFJFU1MgcEFkZHIsTE1fVUlOVDMyIEluY1NpemUpICovCisjZGVmaW5lIExNX0lOQ19QSFlTSUNBTF9BRERSRVNTKHBBZGRyLCBJbmNTaXplKSAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExNX1VJTlQzMiBPcmdMb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9yZ0xvdyA9IChwQWRkciktPkxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChwQWRkciktPkxvdyArPSBJbmNTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKChwQWRkciktPkxvdyA8IE9yZ0xvdykgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAocEFkZHIpLT5IaWdoKys7IC8qIFdyYXAgYXJvdW5kLiAqLyAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICAgICAgICAgICAgICAgICgodm9pZCAqKSAwKQorI2VuZGlmIC8qIE5VTEwgKi8KKworI2lmbmRlZiBPRkZTRVRPRgorI2RlZmluZSBPRkZTRVRPRihfcywgX20pICAgIChNTV9VSU5UX1BUUigmKCgoX3MgKikgMCktPl9tKSkpCisjZW5kaWYgLyogT0ZGU0VUT0YgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTaW1wbGUgbWFjcm9zLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJU19FVEhfQlJPQURDQVNUKF9wRXRoQWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCh1bnNpZ25lZCBjaGFyICopIChfcEV0aEFkZHIpKVswXSA9PSAoKHVuc2lnbmVkIGNoYXIpIDB4ZmYpKQorCisjZGVmaW5lIElTX0VUSF9NVUxUSUNBU1QoX3BFdGhBZGRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKHVuc2lnbmVkIGNoYXIgKikgKF9wRXRoQWRkcikpWzBdICYgKCh1bnNpZ25lZCBjaGFyKSAweDAxKSkKKworI2RlZmluZSBJU19FVEhfQUREUkVTU19FUVVBTChfcEV0aGVyQWRkcjEsIF9wRXRoZXJBZGRyMikgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCgodW5zaWduZWQgY2hhciAqKSAoX3BFdGhlckFkZHIxKSlbMF0gPT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCh1bnNpZ25lZCBjaGFyICopIChfcEV0aGVyQWRkcjIpKVswXSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKHVuc2lnbmVkIGNoYXIgKikgKF9wRXRoZXJBZGRyMSkpWzFdID09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKHVuc2lnbmVkIGNoYXIgKikgKF9wRXRoZXJBZGRyMikpWzFdKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgodW5zaWduZWQgY2hhciAqKSAoX3BFdGhlckFkZHIxKSlbMl0gPT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgodW5zaWduZWQgY2hhciAqKSAoX3BFdGhlckFkZHIyKSlbMl0pICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCh1bnNpZ25lZCBjaGFyICopIChfcEV0aGVyQWRkcjEpKVszXSA9PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCh1bnNpZ25lZCBjaGFyICopIChfcEV0aGVyQWRkcjIpKVszXSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKHVuc2lnbmVkIGNoYXIgKikgKF9wRXRoZXJBZGRyMSkpWzRdID09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKHVuc2lnbmVkIGNoYXIgKikgKF9wRXRoZXJBZGRyMikpWzRdKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgodW5zaWduZWQgY2hhciAqKSAoX3BFdGhlckFkZHIxKSlbNV0gPT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgodW5zaWduZWQgY2hhciAqKSAoX3BFdGhlckFkZHIyKSlbNV0pKQorCisjZGVmaW5lIENPUFlfRVRIX0FERFJFU1MoX1NyYywgX0RzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgodW5zaWduZWQgY2hhciAqKSAoX0RzdCkpWzBdID0gKCh1bnNpZ25lZCBjaGFyICopIChfU3JjKSlbMF07ICAgICAgICAgIFwKKyAgICAoKHVuc2lnbmVkIGNoYXIgKikgKF9Ec3QpKVsxXSA9ICgodW5zaWduZWQgY2hhciAqKSAoX1NyYykpWzFdOyAgICAgICAgICBcCisgICAgKCh1bnNpZ25lZCBjaGFyICopIChfRHN0KSlbMl0gPSAoKHVuc2lnbmVkIGNoYXIgKikgKF9TcmMpKVsyXTsgICAgICAgICAgXAorICAgICgodW5zaWduZWQgY2hhciAqKSAoX0RzdCkpWzNdID0gKCh1bnNpZ25lZCBjaGFyICopIChfU3JjKSlbM107ICAgICAgICAgIFwKKyAgICAoKHVuc2lnbmVkIGNoYXIgKikgKF9Ec3QpKVs0XSA9ICgodW5zaWduZWQgY2hhciAqKSAoX1NyYykpWzRdOyAgICAgICAgICBcCisgICAgKCh1bnNpZ25lZCBjaGFyICopIChfRHN0KSlbNV0gPSAoKHVuc2lnbmVkIGNoYXIgKikgKF9TcmMpKVs1XTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDb25zdGFudHMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVUSEVSTkVUX0FERFJFU1NfU0laRSAgICAgICAgICAgNgorI2RlZmluZSBFVEhFUk5FVF9QQUNLRVRfSEVBREVSX1NJWkUgICAgIDE0CisjZGVmaW5lIE1JTl9FVEhFUk5FVF9QQUNLRVRfU0laRSAgICAgICAgNjQgICAgICAvKiB3aXRoIDQgYnl0ZSBjcmMuICovCisjZGVmaW5lIE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRSAgICAgICAgMTUxOCAgICAvKiB3aXRoIDQgYnl0ZSBjcmMuICovCisjZGVmaW5lIE1JTl9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkMgNjAKKyNkZWZpbmUgTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQyAxNTE0CisjZGVmaW5lIE1BWF9FVEhFUk5FVF9QQUNLRVRfQlVGRkVSX1NJWkUgMTUzNiAgICAvKiBBIG5pY2UgZXZlbiBudW1iZXIuICovCisKKyNpZm5kZWYgTE1fTUFYX01DX1RBQkxFX1NJWkUKKyNkZWZpbmUgTE1fTUFYX01DX1RBQkxFX1NJWkUgICAgICAgICAgICAzMgorI2VuZGlmIC8qIExNX01BWF9NQ19UQUJMRV9TSVpFICovCisjZGVmaW5lIExNX01DX0VOVFJZX1NJWkUgICAgICAgICAgICAgICAgKEVUSEVSTkVUX0FERFJFU1NfU0laRSsxKQorI2RlZmluZSBMTV9NQ19JTlNUQU5DRV9DT1VOVF9JTkRFWCAgICAgIChMTV9NQ19FTlRSWV9TSVpFLTEpCisKKworLyogUmVjZWl2ZSBmaWx0ZXIgbWFza3MuICovCisjZGVmaW5lIExNX0FDQ0VQVF9VTklDQVNUICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIExNX0FDQ0VQVF9NVUxUSUNBU1QgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIExNX0FDQ0VQVF9BTExfTVVMVElDQVNUICAgICAgICAgMHgwMDA0CisjZGVmaW5lIExNX0FDQ0VQVF9CUk9BRENBU1QgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIExNX0FDQ0VQVF9FUlJPUl9QQUNLRVQgICAgICAgICAgMHgwMDEwCisKKyNkZWZpbmUgTE1fUFJPTUlTQ1VPVVNfTU9ERSAgICAgICAgICAgICAweDEwMDAwCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUENJIHJlZ2lzdGVycy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SRUcgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVHICAgICAgICAgICAgICAgMHgwMgorCisjZGVmaW5lIFBDSV9DT01NQU5EX1JFRyAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBQQ0lfSU9fU1BBQ0VfRU5BQkxFICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQQ0lfTUVNX1NQQUNFX0VOQUJMRSAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQQ0lfQlVTTUFTVEVSX0VOQUJMRSAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBQQ0lfTUVNT1JZX1dSSVRFX0lOVkFMSURBVEUgICAgIDB4MDAxMAorI2RlZmluZSBQQ0lfUEFSSVRZX0VSUk9SX0VOQUJMRSAgICAgICAgIDB4MDA0MAorI2RlZmluZSBQQ0lfU1lTVEVNX0VSUk9SX0VOQUJMRSAgICAgICAgIDB4MDEwMAorI2RlZmluZSBQQ0lfRkFTVF9CQUNLX1RPX0JBQ0tfRU5BQkxFICAgIDB4MDIwMAorCisjZGVmaW5lIFBDSV9TVEFUVVNfUkVHICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBQQ0lfUkVWX0lEX1JFRyAgICAgICAgICAgICAgICAgIDB4MDgKKworI2RlZmluZSBQQ0lfQ0FDSEVfTElORV9TSVpFX1JFRyAgICAgICAgIDB4MGMKKworI2RlZmluZSBQQ0lfSU9fQkFTRV9BRERSX1JFRyAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUENJX0lPX0JBU0VfQUREUl9NQVNLICAgICAgICAgICAweGZmZmZmZmYwCisKKyNkZWZpbmUgUENJX01FTV9CQVNFX0FERFJfTE9XICAgICAgICAgICAweDEwCisjZGVmaW5lIFBDSV9NRU1fQkFTRV9BRERSX0hJR0ggICAgICAgICAgMHgxNAorCisjZGVmaW5lIFBDSV9TVUJTWVNURU1fVkVORE9SX0lEX1JFRyAgICAgMHgyYworI2RlZmluZSBQQ0lfU1VCU1lTVEVNX0lEX1JFRyAgICAgICAgICAgIDB4MmUKKyNkZWZpbmUgUENJX0lOVF9MSU5FX1JFRyAgICAgICAgICAgICAgICAweDNjCisKKyNkZWZpbmUgUENJWF9DQVBfUkVHICAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFBDSVhfRU5BQkxFX1JFTEFYRURfT1JERVJJTkcgICAgQklUXzE3CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGcmFnbWVudCBzdHJ1Y3R1cmUuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTE1fVUlOVDMyIEZyYWdTaXplOworICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgRnJhZ0J1ZjsKK30gTE1fRlJBRywgKlBMTV9GUkFHOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogRnJhZ0NvdW50IGlzIGluaXRpYWxpemVkIGZvciB0aGUgY2FsbGVyIHRvIHRoZSBtYXhpbXVtIGFycmF5IHNpemUsIG9uICovCisgICAgLyogcmV0dXJuIEZyYWdDb3VudCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBhY3R1YWwgZnJhZ21lbnRzIGluIHRoZSBhcnJheS4gKi8KKyAgICBMTV9VSU5UMzIgRnJhZ0NvdW50OworCisgICAgLyogVG90YWwgYnVmZmVyIHNpemUuICovCisgICAgTE1fVUlOVDMyIFRvdGFsU2l6ZTsKKworICAgIC8qIEZyYWdtZW50IGFycmF5IGJ1ZmZlci4gKi8KKyAgICBMTV9GUkFHIEZyYWdtZW50c1sxXTsKK30gTE1fRlJBR19MSVNULCAqUExNX0ZSQUdfTElTVDsKKworI2RlZmluZSBERUNMQVJFX0ZSQUdfTElTVF9CVUZGRVJfVFlQRShfRlJBR19MSVNUX1RZUEVfTkFNRSwgX01BWF9GUkFHX0NPVU5UKSBcCisgICAgdHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE1fRlJBR19MSVNUIEZyYWdMaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTV9GUkFHIEZyYWdMaXN0QnVmZmVyW19NQVhfRlJBR19DT1VOVC0xXTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBfRlJBR19MSVNUX1RZUEVfTkFNRSwgKlAjI19GUkFHX0xJU1RfVFlQRV9OQU1FCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU3RhdHVzIGNvZGVzLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTE1fU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgTE1fU1RBVFVTX0lOVEVSUlVQVF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIExNX1NUQVRVU19JTlRFUlJVUFRfTk9UX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIExNX1NUQVRVU19MSU5LX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBMTV9TVEFUVVNfTElOS19ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTE1fU1RBVFVTX0xJTktfU0VUVElOR19NSVNNQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICA2CisKKyNkZWZpbmUgTE1fU1RBVFVTX1RPT19NQU5ZX0ZSQUdNRU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIExNX1NUQVRVU19UUkFOU01JVF9BQk9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBMTV9TVEFUVVNfVFJBTlNNSVRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTE1fU1RBVFVTX1JFQ0VJVkVfQUJPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBMTV9TVEFUVVNfUkVDRUlWRV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIExNX1NUQVRVU19JTlZBTElEX1BBQ0tFVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgTE1fU1RBVFVTX09VVF9PRl9NQVBfUkVHSVNURVJTICAgICAgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBMTV9TVEFUVVNfVU5LTk9XTl9BREFQVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKK3R5cGVkZWYgTE1fVUlOVCBMTV9TVEFUVVMsICpQTE1fU1RBVFVTOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJlcXVlc3RlZCBtZWRpYSB0eXBlLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQk5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTBNQlBTICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwTUJQU19GVUxMX0RVUExFWCAgICAgICAgICA0CisjZGVmaW5lIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDBNQlBTICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTAwTUJQU19GVUxMX0RVUExFWCAgICAgICAgIDYKKyNkZWZpbmUgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwMDBNQlBTICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDAwTUJQU19GVUxMX0RVUExFWCAgICAgICAgOAorI2RlZmluZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9GSUJFUl8xMDBNQlBTICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfRklCRVJfMTAwTUJQU19GVUxMX0RVUExFWCAgICAgICAxMAorI2RlZmluZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9GSUJFUl8xMDAwTUJQUyAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0ZJQkVSXzEwMDBNQlBTX0ZVTExfRFVQTEVYICAgICAgMTIKKyNkZWZpbmUgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfTUFDX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAweGZmZmUKKyNkZWZpbmUgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfUEhZX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAweGZmZmYKKwordHlwZWRlZiBMTV9VSU5UMzIgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUsICpQTE1fUkVRVUVTVEVEX01FRElBX1RZUEU7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVkaWEgdHlwZS4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTE1fTUVESUFfVFlQRV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBMTV9NRURJQV9UWVBFX0FVVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTE1fTUVESUFfVFlQRV9VVFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExNX01FRElBX1RZUEVfQk5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBMTV9NRURJQV9UWVBFX0FVSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTE1fTUVESUFfVFlQRV9GSUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisKK3R5cGVkZWYgTE1fVUlOVDMyIExNX01FRElBX1RZUEUsICpQTE1fTUVESUFfVFlQRTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMaW5lIHNwZWVkLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMTV9MSU5FX1NQRUVEX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTE1fTElORV9TUEVFRF8xME1CUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExNX0xJTkVfU1BFRURfMTAwTUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKwordHlwZWRlZiBMTV9VSU5UMzIgTE1fTElORV9TUEVFRCwgKlBMTV9MSU5FX1NQRUVEOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIER1cGxleCBtb2RlLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMTV9EVVBMRVhfTU9ERV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTE1fRFVQTEVYX01PREVfSEFMRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExNX0RVUExFWF9NT0RFX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCit0eXBlZGVmIExNX1VJTlQzMiBMTV9EVVBMRVhfTU9ERSwgKlBMTV9EVVBMRVhfTU9ERTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQb3dlciBzdGF0ZS4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTE1fUE9XRVJfU1RBVEVfRDAgICAgICAgMAorI2RlZmluZSBMTV9QT1dFUl9TVEFURV9EMSAgICAgICAxCisjZGVmaW5lIExNX1BPV0VSX1NUQVRFX0QyICAgICAgIDIKKyNkZWZpbmUgTE1fUE9XRVJfU1RBVEVfRDMgICAgICAgMworCit0eXBlZGVmIExNX1VJTlQzMiBMTV9QT1dFUl9TVEFURSwgKlBMTV9QT1dFUl9TVEFURTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUYXNrIG9mZmxvYWRpbmcuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExNX1RBU0tfT0ZGTE9BRF9OT05FICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTE1fVEFTS19PRkZMT0FEX1RYX0lQX0NIRUNLU1VNICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBMTV9UQVNLX09GRkxPQURfUlhfSVBfQ0hFQ0tTVU0gICAgICAgICAgMHgwMDAyCisjZGVmaW5lIExNX1RBU0tfT0ZGTE9BRF9UWF9UQ1BfQ0hFQ0tTVU0gICAgICAgICAweDAwMDQKKyNkZWZpbmUgTE1fVEFTS19PRkZMT0FEX1JYX1RDUF9DSEVDS1NVTSAgICAgICAgIDB4MDAwOAorI2RlZmluZSBMTV9UQVNLX09GRkxPQURfVFhfVURQX0NIRUNLU1VNICAgICAgICAgMHgwMDEwCisjZGVmaW5lIExNX1RBU0tfT0ZGTE9BRF9SWF9VRFBfQ0hFQ0tTVU0gICAgICAgICAweDAwMjAKKyNkZWZpbmUgTE1fVEFTS19PRkZMT0FEX1RDUF9TRUdNRU5UQVRJT04gICAgICAgIDB4MDA0MAorCit0eXBlZGVmIExNX1VJTlQzMiBMTV9UQVNLX09GRkxPQUQsICpQTE1fVEFTS19PRkZMT0FEOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZsb3cgY29udHJvbC4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTE1fRkxPV19DT05UUk9MX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0UgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTE1fRkxPV19DT05UUk9MX1JYX1RYX1BBVVNFIChMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSB8IFwKKyAgICBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UpCisKKy8qIFRoaXMgdmFsdWUgY2FuIGJlIG9yLWVkIHdpdGggUkVDRUlWRV9QQVVTRSBhbmQgVFJBTlNNSVRfUEFVU0UuICBJZiB0aGUgKi8KKy8qIGF1dG8tbmVnb3RpYXRpb24gaXMgZGlzYWJsZWQgYW5kIHRoZSBSRUNFSVZFX1BBVVNFIGFuZCBUUkFOU01JVF9QQVVTRSAqLworLyogYml0cyBhcmUgc2V0LCB0aGVuIGZsb3cgY29udHJvbCBpcyBlbmFibGVkIHJlZ2FyZGxlc3Mgb2YgbGluayBwYXJ0bmVyJ3MgKi8KKy8qIGZsb3cgY29udHJvbCBjYXBhYmlsaXR5LiAqLworI2RlZmluZSBMTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRSAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCit0eXBlZGVmIExNX1VJTlQzMiBMTV9GTE9XX0NPTlRST0wsICpQTE1fRkxPV19DT05UUk9MOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdha2UgdXAgbW9kZS4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTE1fV0FLRV9VUF9NT0RFX05PTkUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTE1fV0FLRV9VUF9NT0RFX01BR0lDX1BBQ0tFVCAgICAgICAgICAgIDEKKyNkZWZpbmUgTE1fV0FLRV9VUF9NT0RFX05XVUYgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTE1fV0FLRV9VUF9NT0RFX0xJTktfQ0hBTkdFICAgICAgICAgICAgIDQKKwordHlwZWRlZiBMTV9VSU5UMzIgTE1fV0FLRV9VUF9NT0RFLCAqUExNX1dBS0VfVVBfTU9ERTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDb3VudGVycy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTE1fQ09VTlRFUl9GUkFNRVNfWE1JVFRFRF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExNX0NPVU5URVJfRlJBTUVTX1JFQ0VJVkVEX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMTV9DT1VOVEVSX0VSUk9SRURfVFJBTlNNSVRfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTE1fQ09VTlRFUl9FUlJPUkVEX1JFQ0VJVkVfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIExNX0NPVU5URVJfUkNWX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBMTV9DT1VOVEVSX0FMSUdOTUVOVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTE1fQ09VTlRFUl9TSU5HTEVfQ09MTElTSU9OX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIExNX0NPVU5URVJfTVVMVElQTEVfQ09MTElTSU9OX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBMTV9DT1VOVEVSX0ZSQU1FU19ERUZFUlJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTE1fQ09VTlRFUl9NQVhfQ09MTElTSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIExNX0NPVU5URVJfUkNWX09WRVJSVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTE1fQ09VTlRFUl9YTUlUX1VOREVSUlVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBMTV9DT1VOVEVSX1VOSUNBU1RfRlJBTUVTX1hNSVQgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIExNX0NPVU5URVJfTVVMVElDQVNUX0ZSQU1FU19YTUlUICAgICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgTE1fQ09VTlRFUl9CUk9BRENBU1RfRlJBTUVTX1hNSVQgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBMTV9DT1VOVEVSX1VOSUNBU1RfRlJBTUVTX1JDViAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIExNX0NPVU5URVJfTVVMVElDQVNUX0ZSQU1FU19SQ1YgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTE1fQ09VTlRFUl9CUk9BRENBU1RfRlJBTUVTX1JDViAgICAgICAgICAgICAgICAgICAgICAgICAxNworCit0eXBlZGVmIExNX1VJTlQzMiBMTV9DT1VOVEVSX1RZUEUsICpQTE1fQ09VTlRFUl9UWVBFOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZvcndhcmQgZGVmaW5pdGlvbi4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9MTV9ERVZJQ0VfQkxPQ0sgKlBMTV9ERVZJQ0VfQkxPQ0s7Cit0eXBlZGVmIHN0cnVjdCBfTE1fUEFDS0VUICpQTE1fUEFDS0VUOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMTV9TVEFUVVMgTE1fR2V0QWRhcHRlckluZm8oUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9Jbml0aWFsaXplQWRhcHRlcihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX1Jlc2V0QWRhcHRlcihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX0Rpc2FibGVJbnRlcnJ1cHQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9FbmFibGVJbnRlcnJ1cHQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9TZW5kUGFja2V0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKK0xNX1NUQVRVUyBMTV9TZXJ2aWNlSW50ZXJydXB0cyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX1F1ZXVlUnhQYWNrZXRzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fU2V0UmVjZWl2ZU1hc2soUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWFzayk7CitMTV9TVEFUVVMgTE1fSGFsdChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX0Fib3J0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fTXVsdGljYXN0QWRkKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1VJTlQ4IHBNY0FkZHJlc3MpOworTE1fU1RBVFVTIExNX011bHRpY2FzdERlbChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwTWNBZGRyZXNzKTsKK0xNX1NUQVRVUyBMTV9NdWx0aWNhc3RDbGVhcihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX1NldE1hY0FkZHJlc3MoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcE1hY0FkZHJlc3MpOworTE1fU1RBVFVTIExNX0xvb3BiYWNrQWRkcmVzcyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwQWRkcmVzcyk7CisKK0xNX1VJTlQzMiBMTV9HZXRDcmNDb3VudGVyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CisKK0xNX1dBS0VfVVBfTU9ERSBMTV9QTUNhcGFiaWxpdGllcyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX053dWZBZGQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQnl0ZU1hc2tTaXplLAorICAgIExNX1VJTlQ4ICpwQnl0ZU1hc2ssIExNX1VJTlQ4ICpwUGF0dGVybik7CitMTV9TVEFUVVMgTE1fTnd1ZlJlbW92ZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCeXRlTWFza1NpemUsCisgICAgTE1fVUlOVDggKnBCeXRlTWFzaywgTE1fVUlOVDggKnBQYXR0ZXJuKTsKK0xNX1NUQVRVUyBMTV9TZXRQb3dlclN0YXRlKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fUE9XRVJfU1RBVEUgUG93ZXJMZXZlbCk7CisKK0xNX1ZPSUQgTE1fUmVhZFBoeShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBQaHlSZWcsCisgICAgUExNX1VJTlQzMiBwRGF0YTMyKTsKK0xNX1ZPSUQgTE1fV3JpdGVQaHkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgUGh5UmVnLAorICAgIExNX1VJTlQzMiBEYXRhMzIpOworCitMTV9TVEFUVVMgTE1fQ29udHJvbExvb3BCYWNrKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIENvbnRyb2wpOworTE1fU1RBVFVTIExNX1NldHVwUGh5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitpbnQgTE1fQmxpbmtMRUQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQmxpbmtEdXJhdGlvbik7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhlc2UgYXJlIHRoZSBPUyBzcGVjaWZpYyBmdW5jdGlvbnMgY2FsbGVkIGJ5IExNQUMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMTV9TVEFUVVMgTU1fUmVhZENvbmZpZzE2KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwKKyAgICBMTV9VSU5UMTYgKnBWYWx1ZTE2KTsKK0xNX1NUQVRVUyBNTV9Xcml0ZUNvbmZpZzE2KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwKKyAgICBMTV9VSU5UMTYgVmFsdWUxNik7CitMTV9TVEFUVVMgTU1fUmVhZENvbmZpZzMyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwKKyAgICBMTV9VSU5UMzIgKnBWYWx1ZTMyKTsKK0xNX1NUQVRVUyBNTV9Xcml0ZUNvbmZpZzMyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwKKyAgICBMTV9VSU5UMzIgVmFsdWUzMik7CitMTV9TVEFUVVMgTU1fTWFwTWVtQmFzZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIE1NX01hcElvQmFzZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIE1NX0luZGljYXRlUnhQYWNrZXRzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTU1fSW5kaWNhdGVUeFBhY2tldHMoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBNTV9TdGFydFR4RG1hKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKK0xNX1NUQVRVUyBNTV9Db21wbGV0ZVR4RG1hKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKK0xNX1NUQVRVUyBNTV9BbGxvY2F0ZU1lbW9yeShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCbG9ja1NpemUsCisgICAgUExNX1ZPSUQgKnBNZW1vcnlCbG9ja1ZpcnQpOworTE1fU1RBVFVTIE1NX0FsbG9jYXRlU2hhcmVkTWVtb3J5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIEJsb2NrU2l6ZSwKKyAgICBQTE1fVk9JRCAqcE1lbW9yeUJsb2NrVmlydCwgUExNX1BIWVNJQ0FMX0FERFJFU1MgcE1lbW9yeUJsb2NrUGh5LAorICAgIExNX0JPT0wgQ2FjaGVkKTsKK0xNX1NUQVRVUyBNTV9HZXRDb25maWcoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBNTV9JbmRpY2F0ZVN0YXR1cyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1NUQVRVUyBTdGF0dXMpOworTE1fU1RBVFVTIE1NX0luaXRpYWxpemVVbVBhY2tldHMoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBNTV9GcmVlUnhCdWZmZXIoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpOworTE1fU1RBVFVTIE1NX0NvYWxlc2NlVHhCdWZmZXIoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpOworTE1fU1RBVFVTIExNX01idWZXb3JrQXJvdW5kKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fU2V0TGlua1NwZWVkKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJCSAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlKTsKKworI2lmIElOQ0xVREVfNTcwM19BMF9GSVgKK0xNX1NUQVRVUyBMTV9Mb2FkNTcwM0RtYVdGaXJtd2FyZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworI2VuZGlmCisKKworI2VuZGlmIC8qIExNX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY201NzB4X21tLmggYi9kcml2ZXJzL2JjbTU3MHhfbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWRkMGQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iY201NzB4X21tLmgKQEAgLTAsMCArMSwxNjAgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCcm9hZGNvbSBCQ001NzAwIExpbnV4IE5ldHdvcmsgRHJpdmVyLCBDb3B5cmlnaHQgKGMpIDIwMDAgQnJvYWRjb20gICAgICAgICAqLworLyogQ29ycG9yYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAgKi8KKy8qIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICAgICovCisvKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBsb2NhdGVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTU1fSAorI2RlZmluZSBNTV9ICisKKyNkZWZpbmUgX19yYXdfcmVhZGwgcmVhZGwKKyNkZWZpbmUgX19yYXdfd3JpdGVsIHdyaXRlbAorCisjZGVmaW5lIEJJR19FTkRJQU5fSE9TVCAxCisjZGVmaW5lIHJlYWRsKGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCopKGFkZHIpKQorI2RlZmluZSB3cml0ZWwoYixhZGRyKSAoKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSkgPSAoYikpCisKKy8qIERlZmluZSBtZW1vcnkgYmFycmllciBmdW5jdGlvbiBoZXJlIGlmIG5lZWRlZCAqLworI2RlZmluZSB3bWIoKQorI2RlZmluZSBtZW1iYXIoKQorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgImJjbTU3MHhfbG0uaCIKKyNpbmNsdWRlICJiY201NzB4X3F1ZXVlLmgiCisjaW5jbHVkZSAidGlnb24zLmgiCisjaW5jbHVkZSA8cGNpLmg+CisKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBUUlVFICAxCisjZGVmaW5lIEVSUk9SIC0xCisKKyNpZiBEQkcKKyNkZWZpbmUgU1RBVElDCisjZWxzZQorI2RlZmluZSBTVEFUSUMgc3RhdGljCisjZW5kaWYKKworZXh0ZXJuIGludCBNTV9QYWNrZXRfRGVzY19TaXplOworCisjZGVmaW5lIE1NX1BBQ0tFVF9ERVNDX1NJWkUgTU1fUGFja2V0X0Rlc2NfU2l6ZQorCitERUNMQVJFX1FVRVVFX1RZUEUoVU1fUlhfUEFDS0VUX1EsIE1BWF9SWF9QQUNLRVRfREVTQ19DT1VOVCsxKTsKKworI2RlZmluZSBNQVhfTUVNIDE2CisKKy8qIFN5bmNoICovCit0eXBlZGVmIGludCBtdXRleF90OwordHlwZWRlZiBpbnQgc3BpbmxvY2tfdDsKKworLyogRW1iZWRkZWQgZGV2aWNlIGNvbnRyb2wgKi8KK3R5cGVkZWYgc3RydWN0IF9VTV9ERVZJQ0VfQkxPQ0sgeworCUxNX0RFVklDRV9CTE9DSyBsbV9kZXY7CisgICAgICAgIHBjaV9kZXZfdCBwZGV2OworCWNoYXIgKm5hbWU7CisJdm9pZCAqbWVtX2xpc3RbTUFYX01FTV07CisJZG1hX2FkZHJfdCBkbWFfbGlzdFtNQVhfTUVNXTsKKwlpbnQgbWVtX3NpemVfbGlzdFtNQVhfTUVNXTsKKwlpbnQgbWVtX2xpc3RfbnVtOworICAgICAgICBpbnQgbXR1OworICAgICAgICBpbnQgaW5kZXg7CisJaW50IG9wZW5lZDsKKwlpbnQgZGVsYXllZF9saW5rX2luZDsgLyogRGVsYXkgbGluayBzdGF0dXMgZHVyaW5nIGluaXRpYWwgbG9hZCAqLworCWludCBhZGFwdGVyX2p1c3RfaW5pdGVkOyAvKiB0aGUgZmlyc3QgZmV3IHNlY29uZHMgYWZ0ZXIgaW5pdC4gKi8KKwlpbnQgc3B1cmlvdXNfaW50OyAgICAgICAgICAgIC8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLworCWludCB0aW1lcl9pbnRlcnZhbDsKKwlpbnQgYWRhcHRpdmVfZXhwaXJ5OworCWludCBjcmNfY291bnRlcl9leHBpcnk7ICAgICAgICAgLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCisJaW50IHBvbGxfdGliX2V4cGlyeTsgICAgICAgICAvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KKyAgICAgICAgaW50IHR4X2Z1bGw7CisJaW50IHR4X3F1ZXVlZDsKKwlpbnQgbGluZV9zcGVlZDsJCS8qIGluIE1icHMsIDAgaWYgbGluayBpcyBkb3duICovCisJVU1fUlhfUEFDS0VUX1Egcnhfb3V0X29mX2J1Zl9xOworCWludCByeF9vdXRfb2ZfYnVmOworCWludCByeF9sb3dfYnVmX3RocmVzaDsgLyogY2hhbmdlZCB0byByeF9idWZfcmVwbF90aHJlc2ggKi8KKwlpbnQgcnhfYnVmX3JlcGxfcGFuaWNfdGhyZXNoOworCWludCByeF9idWZfYWxpZ247ICAgICAgICAgICAgLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCisJaW50IGRvX2dsb2JhbF9sb2NrOworICAgICAgICBtdXRleF90IGdsb2JhbF9sb2NrOworICAgICAgICBtdXRleF90IHVuZGlfbG9jazsKKwlsb25nIHVuZGlfZmxhZ3M7CisJdm9sYXRpbGUgaW50IGludGVycnVwdDsKKwlpbnQgdGFza2xldF9wZW5kaW5nOworCWludCB0YXNrbGV0X2J1c3k7CSAgICAgLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCisgICAgICAgIGludCByeF9wa3Q7CisgICAgICAgIGludCB0eF9wa3Q7CisjaWZkZWYgTklDRV9TVVBQT1JUICAgLyogdW5zdXBwb3J0ZWQsIHRoaXMgaXMgYSBsaW51eCBpb2N0bCAqLworCXZvaWQgKCpuaWNlX3J4KSh2b2lkKiwgdm9pZCogKTsKKwl2b2lkKiBuaWNlX2N0eDsKKyNlbmRpZiAvKiBOSUNFX1NVUFBPUlQgKi8KKwlpbnQgcnhfYWRhcHRpdmVfY29hbGVzY2U7CisJdW5zaWduZWQgaW50IHJ4X2xhc3RfY250OworCXVuc2lnbmVkIGludCB0eF9sYXN0X2NudDsKKwl1bnNpZ25lZCBpbnQgcnhfY3Vycl9jb2FsZXNjZV9mcmFtZXM7CisJdW5zaWduZWQgaW50IHJ4X2N1cnJfY29hbGVzY2VfdGlja3M7CisJdW5zaWduZWQgaW50IHR4X2N1cnJfY29hbGVzY2VfZnJhbWVzOyAgLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCisjaWYgVElHT04zX0RFQlVHICAgICAgICAgIC8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLworICAgICAgICB1aW50IHR4X3pjX2NvdW50OworICAgICAgICB1aW50IHR4X2Noa3N1bV9jb3VudDsKKyAgICAgICAgdWludCB0eF9oaW1lbV9jb3VudDsKKyAgICAgICAgdWludCByeF9nb29kX2Noa3N1bV9jb3VudDsKKyNlbmRpZgorICAgICAgICB1bnNpZ25lZCBpbnQgcnhfYmFkX2Noa3N1bV9jb3VudDsgICAvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHJ4X21pc2NfZXJyb3JzOyAgICAgICAgLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCit9IFVNX0RFVklDRV9CTE9DSywgKlBVTV9ERVZJQ0VfQkxPQ0s7CisKKworLyogUGh5c2ljYWwvUENJIERNQSBhZGRyZXNzICovCit0eXBlZGVmIHVuaW9uIHsKKyAgICAgICAgZG1hX2FkZHJfdCBkbWFfbWFwOworfSBkbWFfbWFwX3Q7CisKKy8qIFBhY2tldCAqLwordHlwZWRlZiBzdHJ1Y3QKK19VTV9QQUNLRVQgeworICAgIExNX1BBQ0tFVCBsbV9wYWNrZXQ7CisgICAgdm9pZCogc2tidWZmOyAgICAgIC8qIEFkZHJlc3Mgb2YgcGFja2V0IGJ1ZmZlciAqLworfSBVTV9QQUNLRVQsICpQVU1fUEFDS0VUOworCisjZGVmaW5lIE1NX0FDUVVJUkVfVU5ESV9MT0NLKF9wRGV2aWNlKQorI2RlZmluZSBNTV9SRUxFQVNFX1VORElfTE9DSyhfcERldmljZSkKKyNkZWZpbmUgTU1fQUNRVUlSRV9JTlRfTE9DSyhfcERldmljZSkKKyNkZWZpbmUgTU1fUkVMRUFTRV9JTlRfTE9DSyhfcERldmljZSkKKyNkZWZpbmUgTU1fVUlOVF9QVFIoX3B0cikgICAoKHVuc2lnbmVkIGxvbmcpIChfcHRyKSkKKworLyogTWFjcm8gZm9yIHNldHRpbmcgNjRiaXQgYWRkcmVzcyBzdHJ1Y3QgKi8KKyNkZWZpbmUgc2V0XzY0Yml0X2FkZHIocGFkZHIsIGxvdywgaGlnaCkgXAorICAgICAgICAocGFkZHIpLT5Mb3cgPSBsb3c7ICAgICAgICAgICAgIFwKKyAgICAgICAgKHBhZGRyKS0+SGlnaCA9IGhpZ2g7CisKKy8qIEFzc3VtZSB0aGF0IFBDSSBjb250cm9sbGVyJ3MgdmlldyBvZiBob3N0IG1lbW9yeSBpcyBzYW1lIGFzIGhvc3QgKi8KKworI2RlZmluZSBNRU1fVE9fUENJX1BIWVMoYWRkcikgKGFkZHIpCisKK2V4dGVybiB2b2lkIE1NX1NldEFkZHIgKExNX1BIWVNJQ0FMX0FERFJFU1MgKnBhZGRyLCBkbWFfYWRkcl90IGFkZHIpOworZXh0ZXJuIHZvaWQgTU1fU2V0VDNBZGRyKFQzXzY0QklUX0hPU1RfQUREUiAqcGFkZHIsIGRtYV9hZGRyX3QgYWRkcik7CitleHRlcm4gdm9pZCBNTV9NYXBUeERtYSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQkJIHN0cnVjdCBfTE1fUEFDS0VUICpwUGFja2V0LCBUM182NEJJVF9IT1NUX0FERFIgKnBhZGRyLAorCQkJIExNX1VJTlQzMiAqbGVuLCBpbnQgZnJhZyk7CitleHRlcm4gdm9pZCBNTV9NYXBSeERtYSAoIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJCSAgc3RydWN0IF9MTV9QQUNLRVQgKnBQYWNrZXQsCisJCQkgIFQzXzY0QklUX0hPU1RfQUREUiAqcGFkZHIpOworCisKKy8qIEJTUCBuZWVkcyB0byBwcm92aWRlIHN5c1VzZWNEZWxheSBhbmQgc3lzU2VyaWFsUHJpbnRTdHJpbmcgKi8KK2V4dGVybiB2b2lkIHN5c1NlcmlhbFByaW50U3RyaW5nIChjaGFyICpzKTsKKyNkZWZpbmUgTU1fV2FpdCh1c2VjKSB1ZGVsYXkodXNlYykKKworLyogRGVmaW5lIG1lbW9yeSBiYXJyaWVyIGZ1bmN0aW9uIGhlcmUgaWYgbmVlZGVkICovCisjZGVmaW5lIHdtYigpCisKKyNpZiAwCisjZGVmaW5lIGNwdV90b19sZTMyKHZhbCkgTE9OR1NXQVAodmFsKQorI2VuZGlmCisjZW5kaWYgLyogTU1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY201NzB4X3F1ZXVlLmggYi9kcml2ZXJzL2JjbTU3MHhfcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzMyYWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iY201NzB4X3F1ZXVlLmgKQEAgLTAsMCArMSwzOTkgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCcm9hZGNvbSBCQ001NzAwIExpbnV4IE5ldHdvcmsgRHJpdmVyLCBDb3B5cmlnaHQgKGMpIDIwMDAgQnJvYWRjb20gICAgICAgICAqLworLyogQ29ycG9yYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAgKi8KKy8qIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICAgICovCisvKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBsb2NhdGVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFF1ZXVlIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICB2b2lkICAgICAgICAgIFFRX0luaXRRdWV1ZShQUVFfQ09OVEFJTkVSIHBRdWV1ZSkgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgY2hhciAgICAgICAgICBRUV9GdWxsKFBRUV9DT05UQUlORVIgcFF1ZXVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGNoYXIgICAgICAgICAgUVFfRW1wdHkoUFFRX0NPTlRBSU5FUiBwUXVldWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICB1bnNpZ25lZCBpbnQgUVFfR2V0U2l6ZShQUVFfQ09OVEFJTkVSIHBRdWV1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICB1bnNpZ25lZCBpbnQgUVFfR2V0RW50cnlDbnQoUFFRX0NPTlRBSU5FUiBwUXVldWUpICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBjaGFyICAgICAgICAgIFFRX1B1c2hIZWFkKFBRUV9DT05UQUlORVIgcFF1ZXVlLCBQUVFfRU5UUlkgcEVudHJ5KSAgICAgICAqLworLyogICAgY2hhciAgICAgICAgICBRUV9QdXNoVGFpbChQUVFfQ09OVEFJTkVSIHBRdWV1ZSwgUFFRX0VOVFJZIHBFbnRyeSkgICAgICAgKi8KKy8qICAgIFBRUV9FTlRSWSAgICAgUVFfUG9wSGVhZChQUVFfQ09OVEFJTkVSIHBRdWV1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBQUVFfRU5UUlkgICAgIFFRX1BvcFRhaWwoUFFRX0NPTlRBSU5FUiBwUXVldWUpICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUFFRX0VOVFJZICAgICBRUV9HZXRIZWFkKFBRUV9DT05UQUlORVIgcFF1ZXVlLCB1bnNpZ25lZCBpbnQgSWR4KSAgICAgICAqLworLyogICAgUFFRX0VOVFJZICAgICBRUV9HZXRUYWlsKFBRUV9DT05UQUlORVIgcFF1ZXVlLCB1bnNpZ25lZCBpbnQgSWR4KSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgMDIvMjUvMDAgSGF2IEtoYXV2ICAgICAgICBJbml0aWFsIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQkNNX1FVRVVFX0gKKyNkZWZpbmUgQkNNX1FVRVVFX0gKKyNpZm5kZWYgRU1CRURERUQKKyNkZWZpbmUgRU1CRURERUQgMQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBRdWV1ZSBkZWZpbml0aW9ucy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEVudHJ5IGZvciBxdWV1ZWluZy4gKi8KK3R5cGVkZWYgdm9pZCAqUFFRX0VOVFJZOworCisvKiBMaW51eCBBdG9taWMgT3BzIHN1cHBvcnQgKi8KK3R5cGVkZWYgc3RydWN0IHsgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisKKworLyoKKyAqIFRoaXMgY29tYmluYXRpb24gb2YgYGlubGluZScgYW5kIGBleHRlcm4nIGhhcyBhbG1vc3QgdGhlIGVmZmVjdCBvZiBhCisgKiBtYWNyby4gIFRoZSB3YXkgdG8gdXNlIGl0IGlzIHRvIHB1dCBhIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gYSBoZWFkZXIKKyAqIGZpbGUgd2l0aCB0aGVzZSBrZXl3b3JkcywgYW5kIHB1dCBhbm90aGVyIGNvcHkgb2YgdGhlIGRlZmluaXRpb24KKyAqIChsYWNraW5nIGBpbmxpbmUnIGFuZCBgZXh0ZXJuJykgaW4gYSBsaWJyYXJ5IGZpbGUuICBUaGUgZGVmaW5pdGlvbiBpbgorICogdGhlIGhlYWRlciBmaWxlIHdpbGwgY2F1c2UgbW9zdCBjYWxscyB0byB0aGUgZnVuY3Rpb24gdG8gYmUgaW5saW5lZC4KKyAqIElmIGFueSB1c2VzIG9mIHRoZSBmdW5jdGlvbiByZW1haW4sIHRoZXkgd2lsbCByZWZlciB0byB0aGUgc2luZ2xlIGNvcHkKKyAqIGluIHRoZSBsaWJyYXJ5LgorICovCitleHRlcm4gX19pbmxpbmUgdm9pZAorYXRvbWljX3NldChhdG9taWNfdCogZW50cnksIGludCB2YWwpCit7CisgICAgZW50cnktPmNvdW50ZXIgPSB2YWw7Cit9CitleHRlcm4gX19pbmxpbmUgaW50CithdG9taWNfcmVhZChhdG9taWNfdCogZW50cnkpCit7CisgICAgcmV0dXJuIGVudHJ5LT5jb3VudGVyOworfQorZXh0ZXJuIF9faW5saW5lIHZvaWQKK2F0b21pY19pbmMoYXRvbWljX3QqIGVudHJ5KQoreworICAgIGlmKGVudHJ5KQorCWVudHJ5LT5jb3VudGVyKys7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCithdG9taWNfZGVjKGF0b21pY190KiBlbnRyeSkKK3sKKyAgICBpZihlbnRyeSkKKwllbnRyeS0+Y291bnRlci0tOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorYXRvbWljX3N1YihpbnQgYSwgYXRvbWljX3QqIGVudHJ5KQoreworICAgIGlmKGVudHJ5KQorCWVudHJ5LT5jb3VudGVyIC09IGE7Cit9CitleHRlcm4gX19pbmxpbmUgdm9pZAorYXRvbWljX2FkZChpbnQgYSwgYXRvbWljX3QqIGVudHJ5KQoreworICAgIGlmKGVudHJ5KQorCWVudHJ5LT5jb3VudGVyICs9IGE7Cit9CisKKworLyogUXVldWUgaGVhZGVyIC0tIGJhc2UgdHlwZS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgSGVhZDsKKyAgICB1bnNpZ25lZCBpbnQgVGFpbDsKKyAgICB1bnNpZ25lZCBpbnQgU2l6ZTsKKyAgICBhdG9taWNfdCBFbnRyeUNudDsKKyAgICBQUVFfRU5UUlkgQXJyYXlbMV07Cit9IFFRX0NPTlRBSU5FUiwgKlBRUV9DT05UQUlORVI7CisKKworLyogRGVjbGFyZSBxdWV1ZSB0eXBlIG1hY3JvLiAqLworI2RlZmluZSBERUNMQVJFX1FVRVVFX1RZUEUoX1FVRVVFX1RZUEUsIF9RVUVVRV9TSVpFKSAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBRUV9DT05UQUlORVIgQ29udGFpbmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFFRX0VOVFJZIEVudHJ5QnVmZmVyW19RVUVVRV9TSVpFXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBfUVVFVUVfVFlQRSwgKlAjI19RVUVVRV9UWVBFCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ29tcGlsYXRpb24gc3dpdGNoZXMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgREJHCisjdW5kZWYgUVFfTk9fT1ZFUkZMT1dfQ0hFQ0sKKyN1bmRlZiBRUV9OT19VTkRFUkZMT1dfQ0hFQ0sKKyNlbmRpZiAvKiBEQkcgKi8KKworI2lmZGVmIFFRX1VTRV9NQUNST1MKKy8qIG5vdGRvbmUgKi8KKyNlbHNlCisKKyNpZmRlZiBRUV9OT19JTkxJTkUKKyNkZWZpbmUgX19pbmxpbmUKKyNlbmRpZiAvKiBRUV9OT19JTkxJTkUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gX19pbmxpbmUgdm9pZAorUVFfSW5pdFF1ZXVlKAorUFFRX0NPTlRBSU5FUiBwUXVldWUsCit1bnNpZ25lZCBpbnQgUXVldWVTaXplKSB7CisgICAgcFF1ZXVlLT5IZWFkID0gMDsKKyAgICBwUXVldWUtPlRhaWwgPSAwOworICAgIHBRdWV1ZS0+U2l6ZSA9IFF1ZXVlU2l6ZSsxOworICAgIGF0b21pY19zZXQoJnBRdWV1ZS0+RW50cnlDbnQsIDApOworfSAvKiBRUV9Jbml0UXVldWUgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIF9faW5saW5lIGNoYXIKK1FRX0Z1bGwoCitQUVFfQ09OVEFJTkVSIHBRdWV1ZSkgeworICAgIHVuc2lnbmVkIGludCBOZXdIZWFkOworCisgICAgTmV3SGVhZCA9IChwUXVldWUtPkhlYWQgKyAxKSAlIHBRdWV1ZS0+U2l6ZTsKKworICAgIHJldHVybihOZXdIZWFkID09IHBRdWV1ZS0+VGFpbCk7Cit9IC8qIFFRX0Z1bGwgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIF9faW5saW5lIGNoYXIKK1FRX0VtcHR5KAorUFFRX0NPTlRBSU5FUiBwUXVldWUpIHsKKyAgICByZXR1cm4ocFF1ZXVlLT5IZWFkID09IHBRdWV1ZS0+VGFpbCk7Cit9IC8qIFFRX0VtcHR5ICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK1FRX0dldFNpemUoCitQUVFfQ09OVEFJTkVSIHBRdWV1ZSkgeworICAgIHJldHVybiBwUXVldWUtPlNpemU7Cit9IC8qIFFRX0dldFNpemUgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludAorUVFfR2V0RW50cnlDbnQoCitQUVFfQ09OVEFJTkVSIHBRdWV1ZSkgeworICAgIHJldHVybiBhdG9taWNfcmVhZCgmcFF1ZXVlLT5FbnRyeUNudCk7Cit9IC8qIFFRX0dldEVudHJ5Q250ICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVFJVRSBlbnRyeSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZBTFNFIHF1ZXVlIGlzIGZ1bGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIF9faW5saW5lIGNoYXIKK1FRX1B1c2hIZWFkKAorUFFRX0NPTlRBSU5FUiBwUXVldWUsCitQUVFfRU5UUlkgcEVudHJ5KSB7CisgICAgdW5zaWduZWQgaW50IEhlYWQ7CisKKyAgICBIZWFkID0gKHBRdWV1ZS0+SGVhZCArIDEpICUgcFF1ZXVlLT5TaXplOworCisjaWYgIWRlZmluZWQoUVFfTk9fT1ZFUkZMT1dfQ0hFQ0spCisgICAgaWYoSGVhZCA9PSBwUXVldWUtPlRhaWwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSAvKiBpZiAqLworI2VuZGlmIC8qIFFRX05PX09WRVJGTE9XX0NIRUNLICovCisKKyAgICBwUXVldWUtPkFycmF5W3BRdWV1ZS0+SGVhZF0gPSBwRW50cnk7CisgICAgd21iKCk7CisgICAgcFF1ZXVlLT5IZWFkID0gSGVhZDsKKyAgICBhdG9taWNfaW5jKCZwUXVldWUtPkVudHJ5Q250KTsKKworICAgIHJldHVybiAtMTsKK30gLyogUVFfUHVzaEhlYWQgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUUlVFIGVudHJ5IHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRkFMU0UgcXVldWUgaXMgZnVsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gX19pbmxpbmUgY2hhcgorUVFfUHVzaFRhaWwoCitQUVFfQ09OVEFJTkVSIHBRdWV1ZSwKK1BRUV9FTlRSWSBwRW50cnkpIHsKKyAgICB1bnNpZ25lZCBpbnQgVGFpbDsKKworICAgIFRhaWwgPSBwUXVldWUtPlRhaWw7CisgICAgaWYoVGFpbCA9PSAwKSB7CisgICAgICAgIFRhaWwgPSBwUXVldWUtPlNpemU7CisgICAgfSAvKiBpZiAqLworICAgIFRhaWwtLTsKKworI2lmICFkZWZpbmVkKFFRX05PX09WRVJGTE9XX0NIRUNLKQorICAgIGlmKFRhaWwgPT0gcFF1ZXVlLT5IZWFkKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gLyogaWYgKi8KKyNlbmRpZiAvKiBRUV9OT19PVkVSRkxPV19DSEVDSyAqLworCisgICAgcFF1ZXVlLT5BcnJheVtUYWlsXSA9IHBFbnRyeTsKKyAgICB3bWIoKTsKKyAgICBwUXVldWUtPlRhaWwgPSBUYWlsOworICAgIGF0b21pY19pbmMoJnBRdWV1ZS0+RW50cnlDbnQpOworCisgICAgcmV0dXJuIC0xOworfSAvKiBRUV9QdXNoVGFpbCAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gX19pbmxpbmUgUFFRX0VOVFJZCitRUV9Qb3BIZWFkKAorUFFRX0NPTlRBSU5FUiBwUXVldWUpIHsKKyAgICB1bnNpZ25lZCBpbnQgSGVhZDsKKyAgICBQUVFfRU5UUlkgRW50cnk7CisKKyAgICBIZWFkID0gcFF1ZXVlLT5IZWFkOworCisjaWYgIWRlZmluZWQoUVFfTk9fVU5ERVJGTE9XX0NIRUNLKQorICAgIGlmKEhlYWQgPT0gcFF1ZXVlLT5UYWlsKSB7CisgICAgICAgIHJldHVybiAoUFFRX0VOVFJZKSAwOworICAgIH0gLyogaWYgKi8KKyNlbmRpZiAvKiBRUV9OT19VTkRFUkZMT1dfQ0hFQ0sgKi8KKworICAgIGlmKEhlYWQgPT0gMCkgeworICAgICAgICBIZWFkID0gcFF1ZXVlLT5TaXplOworICAgIH0gLyogaWYgKi8KKyAgICBIZWFkLS07CisKKyAgICBFbnRyeSA9IHBRdWV1ZS0+QXJyYXlbSGVhZF07CisjaWZkZWYgRU1CRURERUQKKyAgICBtZW1iYXIoKTsKKyNlbHNlCisgICAgbWIoKTsKKyNlbmRpZgorICAgIHBRdWV1ZS0+SGVhZCA9IEhlYWQ7CisgICAgYXRvbWljX2RlYygmcFF1ZXVlLT5FbnRyeUNudCk7CisKKyAgICByZXR1cm4gRW50cnk7Cit9IC8qIFFRX1BvcEhlYWQgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIF9faW5saW5lIFBRUV9FTlRSWQorUVFfUG9wVGFpbCgKK1BRUV9DT05UQUlORVIgcFF1ZXVlKSB7CisgICAgdW5zaWduZWQgaW50IFRhaWw7CisgICAgUFFRX0VOVFJZIEVudHJ5OworCisgICAgVGFpbCA9IHBRdWV1ZS0+VGFpbDsKKworI2lmICFkZWZpbmVkKFFRX05PX1VOREVSRkxPV19DSEVDSykKKyAgICBpZihUYWlsID09IHBRdWV1ZS0+SGVhZCkgeworICAgICAgICByZXR1cm4gKFBRUV9FTlRSWSkgMDsKKyAgICB9IC8qIGlmICovCisjZW5kaWYgLyogUVFfTk9fVU5ERVJGTE9XX0NIRUNLICovCisKKyAgICBFbnRyeSA9IHBRdWV1ZS0+QXJyYXlbVGFpbF07CisjaWZkZWYgRU1CRURERUQKKyAgICBtZW1iYXIoKTsKKyNlbHNlCisgICAgbWIoKTsKKyNlbmRpZgorICAgIHBRdWV1ZS0+VGFpbCA9IChUYWlsICsgMSkgJSBwUXVldWUtPlNpemU7CisgICAgYXRvbWljX2RlYygmcFF1ZXVlLT5FbnRyeUNudCk7CisKKyAgICByZXR1cm4gRW50cnk7Cit9IC8qIFFRX1BvcFRhaWwgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIF9faW5saW5lIFBRUV9FTlRSWQorUVFfR2V0SGVhZCgKKyAgICBQUVFfQ09OVEFJTkVSIHBRdWV1ZSwKKyAgICB1bnNpZ25lZCBpbnQgSWR4KQoreworICAgIGlmKElkeCA+PSBhdG9taWNfcmVhZCgmcFF1ZXVlLT5FbnRyeUNudCkpCisgICAgeworICAgICAgICByZXR1cm4gKFBRUV9FTlRSWSkgMDsKKyAgICB9CisKKyAgICBpZihwUXVldWUtPkhlYWQgPiBJZHgpCisgICAgeworICAgICAgICBJZHggPSBwUXVldWUtPkhlYWQgLSBJZHg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIElkeCA9IHBRdWV1ZS0+U2l6ZSAtIChJZHggLSBwUXVldWUtPkhlYWQpOworICAgIH0KKyAgICBJZHgtLTsKKworICAgIHJldHVybiBwUXVldWUtPkFycmF5W0lkeF07Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBfX2lubGluZSBQUVFfRU5UUlkKK1FRX0dldFRhaWwoCisgICAgUFFRX0NPTlRBSU5FUiBwUXVldWUsCisgICAgdW5zaWduZWQgaW50IElkeCkKK3sKKyAgICBpZihJZHggPj0gYXRvbWljX3JlYWQoJnBRdWV1ZS0+RW50cnlDbnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChQUVFfRU5UUlkpIDA7CisgICAgfQorCisgICAgSWR4ICs9IHBRdWV1ZS0+VGFpbDsKKyAgICBpZihJZHggPj0gcFF1ZXVlLT5TaXplKQorICAgIHsKKyAgICAgICAgSWR4ID0gSWR4IC0gcFF1ZXVlLT5TaXplOworICAgIH0KKworICAgIHJldHVybiBwUXVldWUtPkFycmF5W0lkeF07Cit9CisKKyNlbmRpZiAvKiBRUV9VU0VfTUFDUk9TICovCisKKworCisjZW5kaWYgLyogUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZmJfY29uc29sZS5jIGIvZHJpdmVycy9jZmJfY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMmZhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NmYl9jb25zb2xlLmMKQEAgLTAsMCArMSw5MTIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgRUxURUMgRWxla3Ryb25payBBRworICogRnJhbmsgR290dHNjaGxpbmcgPGZnb3R0c2NobGluZ0BlbHRlYy5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogY2ZiX2NvbnNvbGUuYworICoKKyAqIENvbG9yIEZyYW1lYnVmZmVyIENvbnNvbGUgZHJpdmVyIGZvciA4LzE1LzE2LzI0LzMyIGJpdHMgcGVyIHBpeGVsLgorICoKKyAqIEF0IHRoZSBtb21lbnQgb25seSB0aGUgOHgxNiBmb250IGlzIHRlc3RlZCBhbmQgdGhlIGZvbnQgZm9yZS0gYW5kCisgKiBiYWNrZ3JvdW5kIGNvbG9yIGlzIGxpbWl0ZWQgdG8gYmxhY2svd2hpdGUvZ3JheSBjb2xvcnMuIFRoZSBMaW51eAorICogbG9nbyBjYW4gYmUgcGxhY2VkIGluIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBhbmQgYWRkaXRpb25hbCBib2FyZAorICogaW5mb3JtYXRpb24gc3RyaW5ncyAodGhhdCBub3JtYWx5IGdvZXMgdG8gc2VyaWFsIHBvcnQpIGNhbiBiZSBkcmF3ZWQuCisgKgorICogVGhlIGNvbnNvbGUgZHJpdmVyIGNhbiB1c2UgdGhlIHN0YW5kYXJkIFBDIGtleWJvYXJkIGludGVyZmFjZSAoaTgwNDIpCisgKiBmb3IgY2hhcmFjdGVyIGlucHV0LiBDaGFyYWN0ZXIgb3V0cHV0IGdvZXMgdG8gYSBtZW1vcnkgbWFwcGVkIHZpZGVvCisgKiBmcmFtZWJ1ZmZlciB3aXRoIGxpdHRsZSBvciBiaWctZW5kaWFuIG9yZ2FuaXNhdGlvbi4KKyAqIFdpdGggZW52aXJvbm1lbnQgc2V0dGluZyAnY29uc29sZT1zZXJpYWwnIHRoZSBjb25zb2xlIGkvbyBjYW4gYmUKKyAqIGZvcmNlZCB0byBzZXJpYWwgcG9ydC4KKworIFRoZSBkcml2ZXIgdXNlcyBncmFwaGljIHNwZWNpZmljIGRlZmluZXMvcGFyYW1ldGVycy9mdW5jdGlvbnM6CisKKyAoZm9yIFNNSSBMeW54RSBncmFwaGljIGNoaXApCisKKyBDT05GSUdfVklERU9fU01JX0xZTlhFTSAtIHVzZSBncmFwaGljIGRyaXZlciBmb3IgU01JIDcxMCw3MTIsODEwCisgVklERU9fRkJfTElUVExFX0VORElBTiAgLSBmcmFtZWJ1ZmZlciBvcmdhbmlzYXRpb24gZGVmYXVsdDogYmlnIGVuZGlhbgorIFZJREVPX0hXX1JFQ1RGSUxMICAgICAgIC0gZ3JhcGhpYyBkcml2ZXIgc3VwcG9ydHMgaGFyZHdhcmUgcmVjdGFuZ2xlIGZpbGwKKyBWSURFT19IV19CSVRCTFQgICAgICAgICAtIGdyYXBoaWMgZHJpdmVyIHN1cHBvcnRzIGhhcmR3YXJlIGJpdCBibHQKKworIENvbnNvbGUgUGFyYW1ldGVycyBhcmUgc2V0IGJ5IGdyYXBoaWMgZHJpdmVycyBnbG9iYWwgc3RydWN0OgorCisgVklERU9fVklTSUJMRV9DT0xTICAgICAgICAgIC0geCByZXNvbHV0aW9uCisgVklERU9fVklTSUJMRV9ST1dTICAgICAgICAgIC0geSByZXNvbHV0aW9uCisgVklERU9fUElYRUxfU0laRSAgICAgICAgICAgIC0gc3RvcmFnZSBzaXplIGluIGJ5dGUgcGVyIHBpeGVsCisgVklERU9fREFUQV9GT1JNQVQgICAgICAgICAgIC0gZ3JhcGhpY2FsIGRhdGEgZm9ybWF0IEdERgorIFZJREVPX0ZCX0FEUlMgICAgICAgICAgICAgICAtIHN0YXJ0IG9mIHZpZGVvIG1lbW9yeQorCisgQ09ORklHX0k4MDQyX0tCRCAgICAgICAgICAgIC0gQVQgS2V5Ym9hcmQgZHJpdmVyIGZvciBpODA0MgorIFZJREVPX0tCRF9JTklUX0ZDVCAgICAgICAgICAtIGluaXQgZnVuY3Rpb24gZm9yIGtleWJvYXJkCisgVklERU9fVFNUQ19GQ1QgICAgICAgICAgICAgIC0ga2V5Ym9hcmRfdHN0YyBmdW5jdGlvbgorIFZJREVPX0dFVENfRkNUICAgICAgICAgICAgICAtIGtleWJvYXJkX2dldGMgZnVuY3Rpb24KKworIENPTkZJR19DT05TT0xFX0NVUlNPUiAgICAgICAtIG9uL29mZiBkcmF3aW5nIGN1cnNvciBpcyBkb25lIHdpdGggZGVsYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wIGluIFZJREVPX1RTVENfRkNUIChpODA0MikKKyBDRkdfQ09OU09MRV9CTElOS19DT1VOVCAgICAgLSB2YWx1ZSBmb3IgZGVsYXkgbG9vcCAtIGJsaW5rIHJhdGUKKyBDT05GSUdfQ09OU09MRV9USU1FICAgICAgICAgLSBkaXNwbGF5IHRpbWUvZGF0ZSBpbiB1cHBlciByaWdodCBjb3JuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgQ0ZHX0NNRF9EQVRFIGFuZCBDT05GSUdfQ09OU09MRV9DVVJTT1IKKyBDT05GSUdfVklERU9fTE9HTyAgICAgICAgICAgLSBkaXNwbGF5IExpbnV4IExvZ28gaW4gdXBwZXIgbGVmdCBjb3JuZXIKKyBDT05GSUdfQ09OU09MRV9FWFRSQV9JTkZPICAgLSBkaXNwbGF5IGFkZGl0aW9uYWwgYm9hcmQgaW5mb3JtYXRpb24gc3RyaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbm9ybWFseSBnb2VzIHRvIHNlcmlhbCBwb3J0LiBUaGlzIGRlZmluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzIGEgYm9hcmQgc3BlY2lmaWMgZnVuY3Rpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fZHJhd3N0cmluZyAoVklERU9fSU5GT19YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJREVPX0lORk9fWSArIGkqVklERU9fRk9OVF9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBmaWxscyBhIGluZm8gYnVmZmVyIGF0IGk9cm93LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYTogYm9hcmQvZWx0ZWMvYmFiN3h4LgorQ09ORklHX1ZHQV9BU19TSU5HTEVfREVWSUNFICAtIElmIHNldCB0aGUgZnJhbWVidWZmZXIgZGV2aWNlIHdpbGwgYmUgaW5pdGlhbGlzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhbiBvdXRwdXQgb25seSBkZXZpY2UuIFRoZSBLZXlib2FyZCBkcml2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIG5vdCBiZSBzZXQtdXAuIFRoaXMgbWF5IGJlIHVzZWQsIGlmIHlvdQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgbm9uZSBvciBtb3JlIHRoYW4gb25lIEtleWJvYXJkIGRldmljZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVNCIEtleWJvYXJkLCBBVCBLZXlib2FyZCkuCisKK0NPTkZJR19WSURFT19TV19DVVJTT1I6ICAgICAgLSBEcmF3cyBhIGN1cnNvciBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIuIE5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxpbmtpbmcgaXMgcHJvdmlkZWQuIFVzZXMgdGhlIG1hY3JvcyBDVVJTT1JfU0VUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIENVUlNPUl9PRkYuCitDT05GSUdfVklERU9fSFdfQ1VSU09SOiAgICAgIC0gVXNlcyB0aGUgaGFyZHdhcmUgY3Vyc29yIGNhcGFiaWxpdHkgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYyBjaGlwLiBVc2VzIHRoZSBtYWNybyBDVVJTT1JfU0VULgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVEVOVElPTjogSWYgYm9vdGluZyBhbiBPUywgdGhlIGRpc3BsYXkgZHJpdmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBkaXNhYmxlIHRoZSBoYXJkd2FyZSByZWdpc3RlciBvZiB0aGUgZ3JhcGhpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaXAuIE90aGVyd2lzZSBhIGJsaW5raW5nIGZpZWxkIGlzIGRpc3BsYXllZAorKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX0NGQl9DT05TT0xFCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENvbnNvbGUgZGV2aWNlIGRlZmluZXMgd2l0aCBTTUkgZ3JhcGhpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFueSBvdGhlciBncmFwaGljIG11c3QgY2hhbmdlIHRoaXMgc2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmICBDT05GSUdfVklERU9fU01JX0xZTlhFTQorCisjZGVmaW5lIFZJREVPX0ZCX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgVklERU9fSFdfUkVDVEZJTEwKKyNkZWZpbmUgVklERU9fSFdfQklUQkxUCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVmaW5lcyBmb3IgdGhlIENUNjkwMDAgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmICBDT05GSUdfVklERU9fQ1Q2OTAwMAorCisjZGVmaW5lIFZJREVPX0ZCX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgVklERU9fSFdfUkVDVEZJTEwKKyNkZWZpbmUgVklERU9fSFdfQklUQkxUCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW5jbHVkZSB2aWRlb19mYi5oIGFmdGVyIGRlZmluaXRpb25zIG9mIFZJREVPX0hXX1JFQ1RGSUxMIGV0YyAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHZpZGVvX2ZiLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHNvbWUgTWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVklERU9fVklTSUJMRV9DT0xTICAgICAgKHBHRC0+d2luU2l6ZVgpCisjZGVmaW5lIFZJREVPX1ZJU0lCTEVfUk9XUyAgICAgIChwR0QtPndpblNpemVZKQorI2RlZmluZSBWSURFT19QSVhFTF9TSVpFICAgICAgICAocEdELT5nZGZCeXRlc1BQKQorI2RlZmluZSBWSURFT19EQVRBX0ZPUk1BVCAgICAgICAocEdELT5nZGZJbmRleCkKKyNkZWZpbmUgVklERU9fRkJfQURSUyAgICAgICAgICAgKHBHRC0+ZnJhbWVBZHJzKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDb25zb2xlIGRldmljZSBkZWZpbmVzIHdpdGggaTgwNDIga2V5Ym9hcmQgY29udHJvbGxlciAgICAgICAgICAgICAgICAgICAgICovCisvKiBBbnkgb3RoZXIga2V5Ym9hcmQgY29udHJvbGxlciBtdXN0IGNoYW5nZSB0aGlzIHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiAgQ09ORklHX0k4MDQyX0tCRAorI2luY2x1ZGUgPGk4MDQyLmg+CisKKyNkZWZpbmUgVklERU9fS0JEX0lOSVRfRkNUICAgICAgaTgwNDJfa2JkX2luaXQoKQorI2RlZmluZSBWSURFT19UU1RDX0ZDVCAgICAgICAgICBpODA0Ml90c3RjCisjZGVmaW5lIFZJREVPX0dFVENfRkNUICAgICAgICAgIGk4MDQyX2dldGMKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDb25zb2xlIGRldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxkZXZpY2VzLmg+CisjaW5jbHVkZSA8dmlkZW9fZm9udC5oPgorI2lmZGVmIENGR19DTURfREFURQorI2luY2x1ZGUgPHJ0Yy5oPgorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ3Vyc29yIGRlZmluaXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ09ORklHX0NPTlNPTEVfQ1VSU09SOiAgVXNlcyBhIHRpbWVyIGZ1bmN0aW9uIChzZWUgZHJpdmVycy9pODA0Mi5jKSB0byAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoZSBjdXJzb3IgYmxpbmsuIFVzZXMgdGhlIG1hY3JvcyBDVVJTT1JfT0ZGICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgYW5kIENVUlNPUl9PTi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ09ORklHX1ZJREVPX1NXX0NVUlNPUjogRHJhd3MgYSBjdXJzb3IgYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyLiBObyAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgYmxpbmtpbmcgaXMgcHJvdmlkZWQuIFVzZXMgdGhlIG1hY3JvcyBDVVJTT1JfU0VUICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgYW5kIENVUlNPUl9PRkYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ09ORklHX1ZJREVPX0hXX0NVUlNPUjogVXNlcyB0aGUgaGFyZHdhcmUgY3Vyc29yIGNhcGFiaWxpdHkgb2YgdGhlICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYyBjaGlwLiBVc2VzIHRoZSBtYWNybyBDVVJTT1JfU0VULiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgQVRURU5USU9OOiBJZiBib290aW5nIGFuIE9TLCB0aGUgZGlzcGxheSBkcml2ZXIgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBkaXNhYmxlIHRoZSBoYXJkd2FyZSByZWdpc3RlciBvZiB0aGUgZ3JhcGhpYyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgY2hpcC4gT3RoZXJ3aXNlIGEgYmxpbmtpbmcgZmllbGQgaXMgZGlzcGxheWVkICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKENPTkZJR19DT05TT0xFX0NVUlNPUikgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19WSURFT19TV19DVVJTT1IpICYmIFwKKyAgICAhZGVmaW5lZChDT05GSUdfVklERU9fSFdfQ1VSU09SKQorLyogbm8gQ3Vyc29yIGRlZmluZWQgKi8KKyNkZWZpbmUgQ1VSU09SX09OCisjZGVmaW5lIENVUlNPUl9PRkYKKyNkZWZpbmUgQ1VSU09SX1NFVAorI2VuZGlmCisKKyNpZmRlZiAgQ09ORklHX0NPTlNPTEVfQ1VSU09SCisjaWZkZWYgIENVUlNPUl9PTgorI2Vycm9yICBvbmx5IG9uZSBvZiBDT05GSUdfQ09OU09MRV9DVVJTT1IsQ09ORklHX1ZJREVPX1NXX0NVUlNPUixDT05GSUdfVklERU9fSFdfQ1VSU09SIGNhbiBiZSBkZWZpbmVkCisjZW5kaWYKK3ZvaWQgICAgY29uc29sZV9jdXJzb3IgKGludCBzdGF0ZSk7CisjZGVmaW5lIENVUlNPUl9PTiAgY29uc29sZV9jdXJzb3IoMSk7CisjZGVmaW5lIENVUlNPUl9PRkYgY29uc29sZV9jdXJzb3IoMCk7CisjZGVmaW5lIENVUlNPUl9TRVQKKyNpZm5kZWYgQ09ORklHX0k4MDQyX0tCRAorI3dhcm5pbmcgQ3Vyc29yIGRyYXdpbmcgb24vb2ZmIG5lZWRzIHRpbWVyIGZ1bmN0aW9uIHMuYS4gZHJpdmVycy9pODA0Mi5jCisjZW5kaWYKKyNlbHNlCisjaWZkZWYgIENPTkZJR19DT05TT0xFX1RJTUUKKyNlcnJvciAgQ09ORklHX0NPTlNPTEVfQ1VSU09SIG11c3QgYmUgZGVmaW5lZCBmb3IgQ09ORklHX0NPTlNPTEVfVElNRQorI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0NPTlNPTEVfQ1VSU09SICovCisKKyNpZmRlZiAgQ09ORklHX1ZJREVPX1NXX0NVUlNPUgorI2lmZGVmICBDVVJTT1JfT04KKyNlcnJvciAgb25seSBvbmUgb2YgQ09ORklHX0NPTlNPTEVfQ1VSU09SLENPTkZJR19WSURFT19TV19DVVJTT1IsQ09ORklHX1ZJREVPX0hXX0NVUlNPUiBjYW4gYmUgZGVmaW5lZAorI2VuZGlmCisjZGVmaW5lIENVUlNPUl9PTgorI2RlZmluZSBDVVJTT1JfT0ZGIHZpZGVvX3B1dGNoYXIoY29uc29sZV9jb2wgKiBWSURFT19GT05UX1dJRFRILFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGVfcm93ICogVklERU9fRk9OVF9IRUlHSFQsICcgJyk7CisjZGVmaW5lIENVUlNPUl9TRVQgdmlkZW9fc2V0X2N1cnNvcigpOworI2VuZGlmIC8qIENPTkZJR19WSURFT19TV19DVVJTT1IgKi8KKworCisjaWZkZWYgQ09ORklHX1ZJREVPX0hXX0NVUlNPUgorI2lmZGVmICBDVVJTT1JfT04KKyNlcnJvciAgb25seSBvbmUgb2YgQ09ORklHX0NPTlNPTEVfQ1VSU09SLENPTkZJR19WSURFT19TV19DVVJTT1IsQ09ORklHX1ZJREVPX0hXX0NVUlNPUiBjYW4gYmUgZGVmaW5lZAorI2VuZGlmCisjZGVmaW5lIENVUlNPUl9PTgorI2RlZmluZSBDVVJTT1JfT0ZGCisjZGVmaW5lIENVUlNPUl9TRVQgdmlkZW9fc2V0X2h3X2N1cnNvcihjb25zb2xlX2NvbCAqIFZJREVPX0ZPTlRfV0lEVEgsIFwKKyAgICAgICAgICAgICAgICAgIChjb25zb2xlX3JvdyAqIFZJREVPX0ZPTlRfSEVJR0hUKSArIFZJREVPX0xPR09fSEVJR0hUKTsKKyNlbmRpZiAgLyogQ09ORklHX1ZJREVPX0hXX0NVUlNPUiAqLworCisjaWZkZWYgIENPTkZJR19WSURFT19MT0dPCisjZGVmaW5lIExJTlVYX0xPR09fV0lEVEggICAgICAgIDgwCisjZGVmaW5lIExJTlVYX0xPR09fSEVJR0hUICAgICAgIDgwCisjZGVmaW5lIExJTlVYX0xPR09fQ09MT1JTICAgICAgIDIxNAorI2RlZmluZSBMSU5VWF9MT0dPX0xVVF9PRkZTRVQgICAweDIwCisjZGVmaW5lIF9faW5pdGRhdGEKKyNpbmNsdWRlIDxsaW51eF9sb2dvLmg+CisjZGVmaW5lIFZJREVPX0xPR09fV0lEVEggICAgICAgIExJTlVYX0xPR09fV0lEVEgKKyNkZWZpbmUgVklERU9fTE9HT19IRUlHSFQgICAgICAgTElOVVhfTE9HT19IRUlHSFQKKworI2RlZmluZSBWSURFT19JTkZPX1ggICAgICAgICAgICAoVklERU9fTE9HT19XSURUSCkKKyNkZWZpbmUgVklERU9fSU5GT19ZICAgICAgICAgICAgKFZJREVPX0ZPTlRfSEVJR0hULzIpCisjZWxzZQorI2RlZmluZSBWSURFT19MT0dPX1dJRFRIICAgICAgICAwCisjZGVmaW5lIFZJREVPX0xPR09fSEVJR0hUICAgICAgIDAKKyNlbmRpZgorCisjZGVmaW5lIFZJREVPX0NPTFMgICAgICAgICAgICAgIFZJREVPX1ZJU0lCTEVfQ09MUworI2RlZmluZSBWSURFT19ST1dTICAgICAgICAgICAgICBWSURFT19WSVNJQkxFX1JPV1MKKyNkZWZpbmUgVklERU9fU0laRSAgICAgICAgICAgICAgKFZJREVPX1JPV1MqVklERU9fQ09MUypWSURFT19QSVhFTF9TSVpFKQorI2RlZmluZSBWSURFT19QSVhfQkxPQ0tTICAgICAgICAoVklERU9fU0laRSA+PiAyKQorI2RlZmluZSBWSURFT19MSU5FX0xFTiAgICAgICAgICAoVklERU9fQ09MUypWSURFT19QSVhFTF9TSVpFKQorI2RlZmluZSBWSURFT19CVVJTVF9MRU4gICAgICAgICAoVklERU9fQ09MUy84KQorCisjaWZkZWYgIENPTkZJR19WSURFT19MT0dPCisjZGVmaW5lIENPTlNPTEVfUk9XUyAgICAgICAgICAgICgoVklERU9fUk9XUyAtIFZJREVPX0xPR09fSEVJR0hUKSAvIFZJREVPX0ZPTlRfSEVJR0hUKQorI2Vsc2UKKyNkZWZpbmUgQ09OU09MRV9ST1dTICAgICAgICAgICAgKFZJREVPX1JPV1MgLyBWSURFT19GT05UX0hFSUdIVCkKKyNlbmRpZgorCisjZGVmaW5lIENPTlNPTEVfQ09MUyAgICAgICAgICAgIChWSURFT19DT0xTIC8gVklERU9fRk9OVF9XSURUSCkKKyNkZWZpbmUgQ09OU09MRV9ST1dfU0laRSAgICAgICAgKFZJREVPX0ZPTlRfSEVJR0hUICogVklERU9fTElORV9MRU4pCisjZGVmaW5lIENPTlNPTEVfUk9XX0ZJUlNUICAgICAgICh2aWRlb19jb25zb2xlX2FkZHJlc3MpCisjZGVmaW5lIENPTlNPTEVfUk9XX1NFQ09ORCAgICAgICh2aWRlb19jb25zb2xlX2FkZHJlc3MgKyBDT05TT0xFX1JPV19TSVpFKQorI2RlZmluZSBDT05TT0xFX1JPV19MQVNUICAgICAgICAodmlkZW9fY29uc29sZV9hZGRyZXNzICsgQ09OU09MRV9TSVpFIC0gQ09OU09MRV9ST1dfU0laRSkKKyNkZWZpbmUgQ09OU09MRV9TSVpFICAgICAgICAgICAgKENPTlNPTEVfUk9XX1NJWkUgKiBDT05TT0xFX1JPV1MpCisjZGVmaW5lIENPTlNPTEVfU0NST0xMX1NJWkUgICAgIChDT05TT0xFX1NJWkUgLSBDT05TT0xFX1JPV19TSVpFKQorCisvKiBNYWNyb3MgKi8KKyNpZmRlZiAgVklERU9fRkJfTElUVExFX0VORElBTgorI2RlZmluZSBTV0FQMTYoeCkgICAgICAgICgoKCh4KSAmIDB4MDBmZikgPDwgOCkgfCAoICh4KSA+PiA4KSkKKyNkZWZpbmUgU1dBUDMyKHgpICAgICAgICAoKCgoeCkgJiAweDAwMDAwMGZmKSA8PCAyNCkgfCAoKCh4KSAmIDB4MDAwMGZmMDApIDw8IDgpfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwZmYwMDAwKSA+PiAgOCkgfCAoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDI0KSApCisjZGVmaW5lIFNIT1JUU1dBUDMyKHgpICAgKCgoKHgpICYgMHgwMDAwMDBmZikgPDwgIDgpIHwgKCgoeCkgJiAweDAwMDBmZjAwKSA+PiA4KXxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMGZmMDAwMCkgPDwgIDgpIHwgKCgoeCkgJiAweGZmMDAwMDAwKSA+PiA4KSApCisjZWxzZQorI2RlZmluZSBTV0FQMTYoeCkgICAgICAgICh4KQorI2RlZmluZSBTV0FQMzIoeCkgICAgICAgICh4KQorI2RlZmluZSBTSE9SVFNXQVAzMih4KSAgICh4KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKERFQlVHX0NGQl9DT05TT0xFKQorI2RlZmluZSBQUklOVEQoeCkgICAgICAgICBwcmludGYoeCkKKyNlbHNlCisjZGVmaW5lIFBSSU5URCh4KQorI2VuZGlmCisKKworI2lmZGVmIENPTkZJR19DT05TT0xFX0VYVFJBX0lORk8KK2V4dGVybiB2b2lkIHZpZGVvX2dldF9pbmZvX3N0ciAoICAgIC8qIHNldHVwIGEgYm9hcmQgc3RyaW5nOiB0eXBlLCBzcGVlZCwgZXRjLiAqLworICAgIGludCBsaW5lX251bWJlciwgICAgICAgIC8qIGxvY2F0aW9uIHRvIHBsYWNlIGluZm8gc3RyaW5nIGJlc2lkZSBsb2dvICovCisgICAgY2hhciAqaW5mbyAgICAgICAgICAgICAgLyogYnVmZmVyIGZvciBpbmZvIHN0cmluZyAqLworICAgICk7CisKKyNlbmRpZgorCisvKiBMb2NhbHMgKi8KK3N0YXRpYyBHcmFwaGljRGV2aWNlICpwR0Q7CS8qIFBvaW50ZXIgdG8gR3JhcGhpYyBhcnJheSAqLworCitzdGF0aWMgdm9pZCAqdmlkZW9fZmJfYWRkcmVzczsgICAgICAgICAgLyogZnJhbWUgYnVmZmVyIGFkZHJlc3MgKi8KK3N0YXRpYyB2b2lkICp2aWRlb19jb25zb2xlX2FkZHJlc3M7ICAgICAvKiBjb25zb2xlIGJ1ZmZlciBzdGFydCBhZGRyZXNzICovCisKK3N0YXRpYyBpbnQgY29uc29sZV9jb2wgPSAwOyAvKiBjdXJzb3IgY29sICovCitzdGF0aWMgaW50IGNvbnNvbGVfcm93ID0gMDsgLyogY3Vyc29yIHJvdyAqLworCitzdGF0aWMgdTMyIGVvcngsIGZneCwgYmd4OyAgLyogY29sb3IgcGF0cyAqLworCitzdGF0aWMgY29uc3QgaW50IHZpZGVvX2ZvbnRfZHJhd190YWJsZThbXSA9IHsKKyAgICAgICAgICAgIDB4MDAwMDAwMDAsIDB4MDAwMDAwZmYsIDB4MDAwMGZmMDAsIDB4MDAwMGZmZmYsCisgICAgICAgICAgICAweDAwZmYwMDAwLCAweDAwZmYwMGZmLCAweDAwZmZmZjAwLCAweDAwZmZmZmZmLAorICAgICAgICAgICAgMHhmZjAwMDAwMCwgMHhmZjAwMDBmZiwgMHhmZjAwZmYwMCwgMHhmZjAwZmZmZiwKKyAgICAgICAgICAgIDB4ZmZmZjAwMDAsIDB4ZmZmZjAwZmYsIDB4ZmZmZmZmMDAsIDB4ZmZmZmZmZmYgfTsKKworc3RhdGljIGNvbnN0IGludCB2aWRlb19mb250X2RyYXdfdGFibGUxNVtdID0geworICAgICAgICAgICAgMHgwMDAwMDAwMCwgMHgwMDAwN2ZmZiwgMHg3ZmZmMDAwMCwgMHg3ZmZmN2ZmZiB9OworCitzdGF0aWMgY29uc3QgaW50IHZpZGVvX2ZvbnRfZHJhd190YWJsZTE2W10gPSB7CisgICAgICAgICAgICAweDAwMDAwMDAwLCAweDAwMDBmZmZmLCAweGZmZmYwMDAwLCAweGZmZmZmZmZmIH07CisKK3N0YXRpYyBjb25zdCBpbnQgdmlkZW9fZm9udF9kcmF3X3RhYmxlMjRbMTZdWzNdID0geworICAgICAgICAgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCisgICAgICAgICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDBmZmZmZmYgfSwKKyAgICAgICAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwZmZmZiwgMHhmZjAwMDAwMCB9LAorICAgICAgICAgICAgeyAweDAwMDAwMDAwLCAweDAwMDBmZmZmLCAweGZmZmZmZmZmIH0sCisgICAgICAgICAgICB7IDB4MDAwMDAwZmYsIDB4ZmZmZjAwMDAsIDB4MDAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgMHgwMDAwMDBmZiwgMHhmZmZmMDAwMCwgMHgwMGZmZmZmZiB9LAorICAgICAgICAgICAgeyAweDAwMDAwMGZmLCAweGZmZmZmZmZmLCAweGZmMDAwMDAwIH0sCisgICAgICAgICAgICB7IDB4MDAwMDAwZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYgfSwKKyAgICAgICAgICAgIHsgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAorICAgICAgICAgICAgeyAweGZmZmZmZjAwLCAweDAwMDAwMDAwLCAweDAwZmZmZmZmIH0sCisgICAgICAgICAgICB7IDB4ZmZmZmZmMDAsIDB4MDAwMGZmZmYsIDB4ZmYwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgMHhmZmZmZmYwMCwgMHgwMDAwZmZmZiwgMHhmZmZmZmZmZiB9LAorICAgICAgICAgICAgeyAweGZmZmZmZmZmLCAweGZmZmYwMDAwLCAweDAwMDAwMDAwIH0sCisgICAgICAgICAgICB7IDB4ZmZmZmZmZmYsIDB4ZmZmZjAwMDAsIDB4MDBmZmZmZmYgfSwKKyAgICAgICAgICAgIHsgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZjAwMDAwMCB9LAorICAgICAgICAgICAgeyAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmIH0gfTsKKworc3RhdGljIGNvbnN0IGludCB2aWRlb19mb250X2RyYXdfdGFibGUzMlsxNl1bNF0gPSB7CisgICAgICAgICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMGZmZmZmZiB9LAorICAgICAgICAgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwZmZmZmZmLCAweDAwMDAwMDAwIH0sCisgICAgICAgICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYgfSwKKyAgICAgICAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMGZmZmZmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAorICAgICAgICAgICAgeyAweDAwMDAwMDAwLCAweDAwZmZmZmZmLCAweDAwMDAwMDAwLCAweDAwZmZmZmZmIH0sCisgICAgICAgICAgICB7IDB4MDAwMDAwMDAsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIDB4MDAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiB9LAorICAgICAgICAgICAgeyAweDAwZmZmZmZmLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCisgICAgICAgICAgICB7IDB4MDBmZmZmZmYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDBmZmZmZmYgfSwKKyAgICAgICAgICAgIHsgMHgwMGZmZmZmZiwgMHgwMDAwMDAwMCwgMHgwMGZmZmZmZiwgMHgwMDAwMDAwMCB9LAorICAgICAgICAgICAgeyAweDAwZmZmZmZmLCAweDAwMDAwMDAwLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmIH0sCisgICAgICAgICAgICB7IDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgMHgwMDAwMDAwMCwgMHgwMGZmZmZmZiB9LAorICAgICAgICAgICAgeyAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCAweDAwMDAwMDAwIH0sCisgICAgICAgICAgICB7IDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYgfSB9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQgdmlkZW9fZHJhd2NoYXJzIChpbnQgeHgsIGludCB5eSwgdW5zaWduZWQgY2hhciAqcywgaW50IGNvdW50KQoreworICAgIHU4ICAqY2RhdCwgKmRlc3QsICpkZXN0MDsKKyAgICBpbnQgcm93cywgb2Zmc2V0LCBjOworCisgICAgb2Zmc2V0ID0geXkgKiBWSURFT19MSU5FX0xFTiArIHh4ICogVklERU9fUElYRUxfU0laRTsKKyAgICBkZXN0MCA9IHZpZGVvX2ZiX2FkZHJlc3MgKyBvZmZzZXQ7CisKKyAgICBzd2l0Y2ggKFZJREVPX0RBVEFfRk9STUFUKQorICAgIHsKKyAgICBjYXNlIEdERl9fOEJJVF9JTkRFWDoKKyAgICBjYXNlIEdERl9fOEJJVF8zMzJSR0I6CisgICAgICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICB7CisgICAgICAgIGMgPSAqcyA7CisgICAgICAgIGNkYXQgPSB2aWRlb19mb250ZGF0YSArIGMgKiBWSURFT19GT05UX0hFSUdIVDsKKyAgICAgICAgZm9yIChyb3dzID0gVklERU9fRk9OVF9IRUlHSFQsIGRlc3QgPSBkZXN0MDsgcm93cy0tOyBkZXN0ICs9IFZJREVPX0xJTkVfTEVOKQorICAgICAgICB7CisgICAgICAgICAgICB1OCBiaXRzID0gKmNkYXQrKzsKKyAgICAgICAgICAgICgodTMyICopZGVzdClbMF0gPSAodmlkZW9fZm9udF9kcmF3X3RhYmxlOFtiaXRzID4+IDRdICYgZW9yeCkgXiBiZ3g7CisgICAgICAgICAgICAoKHUzMiAqKWRlc3QpWzFdID0gKHZpZGVvX2ZvbnRfZHJhd190YWJsZThbYml0cyAmIDE1XSAmIGVvcngpIF4gYmd4OworICAgICAgICB9CisgICAgICAgIGRlc3QwICs9IFZJREVPX0ZPTlRfV0lEVEggKiBWSURFT19QSVhFTF9TSVpFOworICAgICAgICBzKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdERl8xNUJJVF81NTVSR0I6CisgICAgICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICB7CisgICAgICAgIGMgPSAqcyA7CisgICAgICAgIGNkYXQgPSB2aWRlb19mb250ZGF0YSArIGMgKiBWSURFT19GT05UX0hFSUdIVDsKKyAgICAgICAgZm9yIChyb3dzID0gVklERU9fRk9OVF9IRUlHSFQsIGRlc3QgPSBkZXN0MDsgcm93cy0tOyBkZXN0ICs9IFZJREVPX0xJTkVfTEVOKQorICAgICAgICB7CisgICAgICAgICAgICB1OCBiaXRzID0gKmNkYXQrKzsKKyAgICAgICAgICAgICgodTMyICopZGVzdClbMF0gPSBTSE9SVFNXQVAzMigodmlkZW9fZm9udF9kcmF3X3RhYmxlMTVbYml0cyA+PiA2XSAmIGVvcngpIF4gYmd4KTsKKyAgICAgICAgICAgICgodTMyICopZGVzdClbMV0gPSBTSE9SVFNXQVAzMigodmlkZW9fZm9udF9kcmF3X3RhYmxlMTVbYml0cyA+PiA0ICYgM10gJiBlb3J4KSBeIGJneCk7CisgICAgICAgICAgICAoKHUzMiAqKWRlc3QpWzJdID0gU0hPUlRTV0FQMzIoKHZpZGVvX2ZvbnRfZHJhd190YWJsZTE1W2JpdHMgPj4gMiAmIDNdICYgZW9yeCkgXiBiZ3gpOworICAgICAgICAgICAgKCh1MzIgKilkZXN0KVszXSA9IFNIT1JUU1dBUDMyKCh2aWRlb19mb250X2RyYXdfdGFibGUxNVtiaXRzICYgM10gJiBlb3J4KSBeIGJneCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0MCArPSBWSURFT19GT05UX1dJRFRIICogVklERU9fUElYRUxfU0laRTsKKyAgICAgICAgICAgIHMrKyA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdERl8xNkJJVF81NjVSR0I6CisgICAgICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICB7CisgICAgICAgIGMgPSAqcyA7CisgICAgICAgIGNkYXQgPSB2aWRlb19mb250ZGF0YSArIGMgKiBWSURFT19GT05UX0hFSUdIVDsKKyAgICAgICAgZm9yIChyb3dzID0gVklERU9fRk9OVF9IRUlHSFQsIGRlc3QgPSBkZXN0MDsgcm93cy0tOyBkZXN0ICs9IFZJREVPX0xJTkVfTEVOKQorICAgICAgICB7CisgICAgICAgICAgICB1OCBiaXRzID0gKmNkYXQrKzsKKyAgICAgICAgICAgICgodTMyICopZGVzdClbMF0gPSBTSE9SVFNXQVAzMigodmlkZW9fZm9udF9kcmF3X3RhYmxlMTZbYml0cyA+PiA2XSAmIGVvcngpIF4gYmd4KTsKKyAgICAgICAgICAgICgodTMyICopZGVzdClbMV0gPSBTSE9SVFNXQVAzMigodmlkZW9fZm9udF9kcmF3X3RhYmxlMTZbYml0cyA+PiA0ICYgM10gJiBlb3J4KSBeIGJneCk7CisgICAgICAgICAgICAoKHUzMiAqKWRlc3QpWzJdID0gU0hPUlRTV0FQMzIoKHZpZGVvX2ZvbnRfZHJhd190YWJsZTE2W2JpdHMgPj4gMiAmIDNdICYgZW9yeCkgXiBiZ3gpOworICAgICAgICAgICAgKCh1MzIgKilkZXN0KVszXSA9IFNIT1JUU1dBUDMyKCh2aWRlb19mb250X2RyYXdfdGFibGUxNltiaXRzICYgM10gJiBlb3J4KSBeIGJneCk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdDAgKz0gVklERU9fRk9OVF9XSURUSCAqIFZJREVPX1BJWEVMX1NJWkU7CisgICAgICAgIHMrKyA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdERl8zMkJJVF9YODg4UkdCOgorICAgICAgICB3aGlsZSAoY291bnQtLSkKKyAgICAgICAgeworICAgICAgICBjID0gKnMgOworICAgICAgICBjZGF0ID0gdmlkZW9fZm9udGRhdGEgKyBjICogVklERU9fRk9OVF9IRUlHSFQ7CisgICAgICAgIGZvciAocm93cyA9IFZJREVPX0ZPTlRfSEVJR0hULCBkZXN0ID0gZGVzdDA7IHJvd3MtLTsgZGVzdCArPSBWSURFT19MSU5FX0xFTikKKyAgICAgICAgeworICAgICAgICAgICAgdTggYml0cyA9ICpjZGF0Kys7CisgICAgICAgICAgICAoKHUzMiAqKWRlc3QpWzBdID0gU1dBUDMyKCh2aWRlb19mb250X2RyYXdfdGFibGUzMltiaXRzID4+IDRdWzBdICYgZW9yeCkgXiBiZ3gpOworICAgICAgICAgICAgKCh1MzIgKilkZXN0KVsxXSA9IFNXQVAzMigodmlkZW9fZm9udF9kcmF3X3RhYmxlMzJbYml0cyA+PiA0XVsxXSAmIGVvcngpIF4gYmd4KTsKKyAgICAgICAgICAgICgodTMyICopZGVzdClbMl0gPSBTV0FQMzIoKHZpZGVvX2ZvbnRfZHJhd190YWJsZTMyW2JpdHMgPj4gNF1bMl0gJiBlb3J4KSBeIGJneCk7CisgICAgICAgICAgICAoKHUzMiAqKWRlc3QpWzNdID0gU1dBUDMyKCh2aWRlb19mb250X2RyYXdfdGFibGUzMltiaXRzID4+IDRdWzNdICYgZW9yeCkgXiBiZ3gpOworICAgICAgICAgICAgKCh1MzIgKilkZXN0KVs0XSA9IFNXQVAzMigodmlkZW9fZm9udF9kcmF3X3RhYmxlMzJbYml0cyAmIDE1XVswXSAmIGVvcngpIF4gYmd4KTsKKyAgICAgICAgICAgICgodTMyICopZGVzdClbNV0gPSBTV0FQMzIoKHZpZGVvX2ZvbnRfZHJhd190YWJsZTMyW2JpdHMgJiAxNV1bMV0gJiBlb3J4KSBeIGJneCk7CisgICAgICAgICAgICAoKHUzMiAqKWRlc3QpWzZdID0gU1dBUDMyKCh2aWRlb19mb250X2RyYXdfdGFibGUzMltiaXRzICYgMTVdWzJdICYgZW9yeCkgXiBiZ3gpOworICAgICAgICAgICAgKCh1MzIgKilkZXN0KVs3XSA9IFNXQVAzMigodmlkZW9fZm9udF9kcmF3X3RhYmxlMzJbYml0cyAmIDE1XVszXSAmIGVvcngpIF4gYmd4KTsKKyAgICAgICAgfQorICAgICAgICBkZXN0MCArPSBWSURFT19GT05UX1dJRFRIICogVklERU9fUElYRUxfU0laRTsKKyAgICAgICAgcysrIDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgR0RGXzI0QklUXzg4OFJHQjoKKyAgICAgICAgd2hpbGUgKGNvdW50LS0pCisgICAgICAgIHsKKyAgICAgICAgYyA9ICpzIDsKKyAgICAgICAgY2RhdCA9IHZpZGVvX2ZvbnRkYXRhICsgYyAqIFZJREVPX0ZPTlRfSEVJR0hUOworICAgICAgICBmb3IgKHJvd3MgPSBWSURFT19GT05UX0hFSUdIVCwgZGVzdCA9IGRlc3QwOyByb3dzLS07IGRlc3QgKz0gVklERU9fTElORV9MRU4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4IGJpdHMgPSAqY2RhdCsrOworICAgICAgICAgICAgKCh1MzIgKilkZXN0KVswXSA9ICh2aWRlb19mb250X2RyYXdfdGFibGUyNFtiaXRzID4+IDRdWzBdICYgZW9yeCkgXiBiZ3g7CisgICAgICAgICAgICAoKHUzMiAqKWRlc3QpWzFdID0gKHZpZGVvX2ZvbnRfZHJhd190YWJsZTI0W2JpdHMgPj4gNF1bMV0gJiBlb3J4KSBeIGJneDsKKyAgICAgICAgICAgICgodTMyICopZGVzdClbMl0gPSAodmlkZW9fZm9udF9kcmF3X3RhYmxlMjRbYml0cyA+PiA0XVsyXSAmIGVvcngpIF4gYmd4OworICAgICAgICAgICAgKCh1MzIgKilkZXN0KVszXSA9ICh2aWRlb19mb250X2RyYXdfdGFibGUyNFtiaXRzICYgMTVdWzBdICYgZW9yeCkgXiBiZ3g7CisgICAgICAgICAgICAoKHUzMiAqKWRlc3QpWzRdID0gKHZpZGVvX2ZvbnRfZHJhd190YWJsZTI0W2JpdHMgJiAxNV1bMV0gJiBlb3J4KSBeIGJneDsKKyAgICAgICAgICAgICgodTMyICopZGVzdClbNV0gPSAodmlkZW9fZm9udF9kcmF3X3RhYmxlMjRbYml0cyAmIDE1XVsyXSAmIGVvcngpIF4gYmd4OworICAgICAgICB9CisgICAgICAgIGRlc3QwICs9IFZJREVPX0ZPTlRfV0lEVEggKiBWSURFT19QSVhFTF9TSVpFOworICAgICAgICBzKysgOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdmlkZW9fZHJhd3N0cmluZyhpbnQgeHgsIGludCB5eSwgdW5zaWduZWQgY2hhciAqcykKK3sKKyAgICB2aWRlb19kcmF3Y2hhcnMgKHh4LCB5eSwgcywgc3RybGVuKHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB2aWRlb19wdXRjaGFyKGludCB4eCwgaW50IHl5LCB1bnNpZ25lZCBjaGFyIGMpCit7CisjaWZkZWYgQ09ORklHX1ZJREVPX0xPR08KKyAgICB2aWRlb19kcmF3Y2hhcnMgKHh4LCB5eSArIFZJREVPX0xPR09fSEVJR0hULCAmYywgMSk7CisjZWxzZQorICAgIHZpZGVvX2RyYXdjaGFycyAoeHgsIHl5LCAmYywgMSk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoQ09ORklHX0NPTlNPTEVfQ1VSU09SKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT19TV19DVVJTT1IpCitzdGF0aWMgdm9pZCB2aWRlb19zZXRfY3Vyc29yKHZvaWQpCit7CisgICAgLyogc3dhcCBkcmF3aW5nIGNvbG9ycyAqLworICAgIGVvcnggPSBmZ3g7CisgICAgZmd4ICA9IGJneDsKKyAgICBiZ3ggID0gZW9yeDsKKyAgICBlb3J4ID0gZmd4IF4gYmd4OworICAgIC8qIGRyYXcgY3Vyc29yICovCisgICAgdmlkZW9fcHV0Y2hhciAoY29uc29sZV9jb2wgKiBWSURFT19GT05UX1dJRFRILAorICAgICAgICAgICAgICAgICAgIGNvbnNvbGVfcm93ICogVklERU9fRk9OVF9IRUlHSFQsICcgJyk7CisgICAgLyogcmVzdG9yZSBkcmF3aW5nIGNvbG9ycyAqLworICAgIGVvcnggPSBmZ3g7CisgICAgZmd4ICA9IGJneDsKKyAgICBiZ3ggID0gZW9yeDsKKyAgICBlb3J4ID0gZmd4IF4gYmd4OworfQorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX0NPTlNPTEVfQ1VSU09SCit2b2lkIGNvbnNvbGVfY3Vyc29yIChpbnQgc3RhdGUpCit7CisgICAgc3RhdGljIGludCBsYXN0X3N0YXRlID0gMDsKKyNpZmRlZiBDT05GSUdfQ09OU09MRV9USU1FCisgICAgc3RydWN0IHJ0Y190aW1lIHRtOworICAgIGNoYXIgaW5mb1sxNl07CisKKyAgICAvKiB0aW1lIHVwZGF0ZSBvbmx5IGlmIGN1cnNvciBpcyBvbiAoZmFzdGVyIHNjcm9sbCkgKi8KKyAgICBpZiAoc3RhdGUpCisgICAgeworICAgIHJ0Y19nZXQgKCZ0bSk7CisKKyAgICBzcHJpbnRmKGluZm8sICIgJTAyZDolMDJkOiUwMmQgIiwgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOworICAgIHZpZGVvX2RyYXdzdHJpbmcoVklERU9fVklTSUJMRV9DT0xTLTEwKlZJREVPX0ZPTlRfV0lEVEgsCisgICAgICAgICAgICAgVklERU9fSU5GT19ZLCBpbmZvKTsKKworICAgIHNwcmludGYoaW5mbywgIiUwMmQuJTAyZC4lMDRkIiwgdG0udG1fbWRheSwgdG0udG1fbW9uLCB0bS50bV95ZWFyKTsKKyAgICB2aWRlb19kcmF3c3RyaW5nKFZJREVPX1ZJU0lCTEVfQ09MUy0xMCpWSURFT19GT05UX1dJRFRILAorICAgICAgICAgICAgIFZJREVPX0lORk9fWSsxKlZJREVPX0ZPTlRfSEVJR0hULCBpbmZvKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChzdGF0ZSAmJiAobGFzdF9zdGF0ZSAhPSBzdGF0ZSkpCisgICAgeworICAgICAgICB2aWRlb19zZXRfY3Vyc29yKCk7CisgICAgfQorCisgICAgaWYgKCFzdGF0ZSAmJiAobGFzdF9zdGF0ZSAhPSBzdGF0ZSkpCisgICAgeworICAgICAgICAvKiBjbGVhciBjdXJzb3IgKi8KKyAgICAgICAgdmlkZW9fcHV0Y2hhciAoY29uc29sZV9jb2wgKiBWSURFT19GT05UX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlX3JvdyAqIFZJREVPX0ZPTlRfSEVJR0hULCAnICcpOworICAgIH0KKworICAgIGxhc3Rfc3RhdGUgPSBzdGF0ZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVklERU9fSFdfUkVDVEZJTEwKK3N0YXRpYyB2b2lkIG1lbXNldGwgKGludCAqcCwgaW50IGMsIGludCB2KQoreworICAgIHdoaWxlIChjLS0pCisgICAgICAgICoocCsrKSA9IHY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFZJREVPX0hXX0JJVEJMVAorc3RhdGljIHZvaWQgbWVtY3B5bCAoaW50ICpkLCBpbnQgKnMsIGludCBjKQoreworICAgIHdoaWxlIChjLS0pCisgICAgICAgICooZCsrKSA9ICoocysrKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNvbnNvbGVfc2Nyb2xsdXAgKHZvaWQpCit7CisgICAgLyogY29weSB1cCByb3dzIGlnbm9yaW5nIHRoZSBmaXJzdCBvbmUgKi8KKworI2lmZGVmIFZJREVPX0hXX0JJVEJMVAorICAgIHZpZGVvX2h3X2JpdGJsdCAoCisgICAgVklERU9fUElYRUxfU0laRSwgICAgIC8qIGJ5dGVzIHBlciBwaXhlbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAvKiBzb3VyY2UgcG9zIHggKi8KKyAgICBWSURFT19MT0dPX0hFSUdIVCArIFZJREVPX0ZPTlRfSEVJR0hULCAvKiBzb3VyY2UgcG9zIHkgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgLyogZGVzdCBwb3MgeCAqLworICAgIFZJREVPX0xPR09fSEVJR0hULCAgICAvKiBkZXN0IHBvcyB5ICovCisgICAgVklERU9fVklTSUJMRV9DT0xTLCAgIC8qIGZyYW1lIHdpZHRoICovCisgICAgVklERU9fVklTSUJMRV9ST1dTIC0gVklERU9fTE9HT19IRUlHSFQgLSBWSURFT19GT05UX0hFSUdIVCAvKiBmcmFtZSBoZWlnaHQgKi8KKyAgICApOworI2Vsc2UKKyAgICBtZW1jcHlsIChDT05TT0xFX1JPV19GSVJTVCwgQ09OU09MRV9ST1dfU0VDT05ELCBDT05TT0xFX1NDUk9MTF9TSVpFID4+IDIpOworI2VuZGlmCisKKyAgICAvKiBjbGVhciB0aGUgbGFzdCBvbmUgKi8KKyNpZmRlZiBWSURFT19IV19SRUNURklMTAorICAgIHZpZGVvX2h3X3JlY3RmaWxsICgKKyAgICBWSURFT19QSVhFTF9TSVpFLCAgICAgLyogYnl0ZXMgcGVyIHBpeGVsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgIC8qIGRlc3QgcG9zIHggKi8KKyAgICBWSURFT19WSVNJQkxFX1JPV1MgLSBWSURFT19GT05UX0hFSUdIVCwgIC8qIGRlc3QgcG9zIHkgKi8KKyAgICBWSURFT19WSVNJQkxFX0NPTFMsICAgLyogZnJhbWUgd2lkdGggKi8KKyAgICBWSURFT19GT05UX0hFSUdIVCwgICAgLyogZnJhbWUgaGVpZ2h0ICovCisgICAgQ09OU09MRV9CR19DT0wgICAgICAgICAgLyogZmlsbCBjb2xvciAqLworICAgICk7CisjZWxzZQorICAgIG1lbXNldGwgKENPTlNPTEVfUk9XX0xBU1QsIENPTlNPTEVfUk9XX1NJWkUgPj4gMiwgQ09OU09MRV9CR19DT0wpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgY29uc29sZV9iYWNrICh2b2lkKQoreworICAgIENVUlNPUl9PRkYKKyAgICBjb25zb2xlX2NvbC0tOworCisgICAgaWYgKGNvbnNvbGVfY29sIDwgMCkKKyAgICB7CisgICAgICAgIGNvbnNvbGVfY29sID0gQ09OU09MRV9DT0xTIC0gMTsKKyAgICAgICAgY29uc29sZV9yb3ctLTsKKyAgICAgICAgaWYgKGNvbnNvbGVfcm93IDwgMCkKKyAgICAgICAgY29uc29sZV9yb3cgPSAwOworICAgIH0KKyAgICB2aWRlb19wdXRjaGFyIChjb25zb2xlX2NvbCAqIFZJREVPX0ZPTlRfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgY29uc29sZV9yb3cgKiBWSURFT19GT05UX0hFSUdIVCwgJyAnKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBjb25zb2xlX25ld2xpbmUgKHZvaWQpCit7CisgICAgQ1VSU09SX09GRgorICAgIGNvbnNvbGVfcm93Kys7CisgICAgY29uc29sZV9jb2wgPSAwOworCisgICAgLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBzY3JvbGwgdGhlIHRlcm1pbmFsICovCisgICAgaWYgKGNvbnNvbGVfcm93ID49IENPTlNPTEVfUk9XUykKKyAgICB7CisgICAgLyogU2Nyb2xsIGV2ZXJ5dGhpbmcgdXAgKi8KKyAgICBjb25zb2xlX3Njcm9sbHVwICgpOworCisgICAgLyogRGVjcmVtZW50IHJvdyBudW1iZXIgKi8KKyAgICBjb25zb2xlX3Jvdy0tOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHZpZGVvX3B1dGMgKGNvbnN0IGNoYXIgYykKK3sKKyAgICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgMTM6IC8qIGlnbm9yZSAqLworICAgICAgICBicmVhazsKKworICAgIGNhc2UgJ1xuJzogLyogbmV4dCBsaW5lICovCisgICAgICAgIGNvbnNvbGVfbmV3bGluZSgpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgOTogICAgLyogdGFiIDggKi8KKyAgICAgICAgQ1VSU09SX09GRgorICAgICAgICBjb25zb2xlX2NvbCB8PSAgMHgwMDA4OworICAgICAgICBjb25zb2xlX2NvbCAmPSB+MHgwMDA3OworCisgICAgICAgIGlmIChjb25zb2xlX2NvbCA+PSBDT05TT0xFX0NPTFMpCisgICAgICAgICAgICBjb25zb2xlX25ld2xpbmUoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDg6ICAgIC8qIGJhY2tzcGFjZSAqLworICAgICAgICBjb25zb2xlX2JhY2soKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiAvKiBkcmF3IHRoZSBjaGFyICovCisgICAgICAgIHZpZGVvX3B1dGNoYXIgKGNvbnNvbGVfY29sICogVklERU9fRk9OVF9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZV9yb3cgKiBWSURFT19GT05UX0hFSUdIVCwgYyk7CisgICAgICAgIGNvbnNvbGVfY29sKysgOworCisgICAgICAgIC8qIGNoZWNrIGZvciBuZXdsaW5lICovCisgICAgICAgIGlmIChjb25zb2xlX2NvbCA+PSBDT05TT0xFX0NPTFMpCisgICAgICAgICAgICBjb25zb2xlX25ld2xpbmUoKTsKKyAgICB9CisgICAgQ1VSU09SX1NFVAorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHZpZGVvX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit7CisgICAgaW50IGNvdW50ID0gc3RybGVuKHMpOworCisgICAgd2hpbGUoY291bnQtLSkKKyAgICAgICAgdmlkZW9fcHV0YygqcysrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX1ZJREVPX0xPR08KK3ZvaWQgbG9nb19wbG90ICh2b2lkICpzY3JlZW4sIGludCB3aWR0aCwgaW50IHgsIGludCB5KQoreworICAgIGludCBza2lwID0gKHdpZHRoIC0gTElOVVhfTE9HT19XSURUSCkgKiBWSURFT19QSVhFTF9TSVpFLAorICAgICAgICB4Y291bnQsIGksCisgICAgICAgIHljb3VudCA9IExJTlVYX0xPR09fSEVJR0hUOworICAgIHVuc2lnbmVkIGNoYXIKKyAgICAgICAgKnNvdXJjZSA9IGxpbnV4X2xvZ28sCisgICAgICAgICpkZXN0ICAgPSAodW5zaWduZWQgY2hhciAqKSBzY3JlZW4gKyAoKHkgKiB3aWR0aCAqIFZJREVPX1BJWEVMX1NJWkUpICsgeCksCisgICAgICAgIHIsIGcsIGI7CisKKyAgICBpZiAoVklERU9fREFUQV9GT1JNQVQgPT0gR0RGX184QklUX0lOREVYKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IExJTlVYX0xPR09fQ09MT1JTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHIgPSAodW5zaWduZWQgY2hhcilsaW51eF9sb2dvX3JlZCAgW2ldOworICAgICAgICAgICAgZyA9ICh1bnNpZ25lZCBjaGFyKWxpbnV4X2xvZ29fZ3JlZW5baV07CisgICAgICAgICAgICBiID0gKHVuc2lnbmVkIGNoYXIpbGludXhfbG9nb19ibHVlIFtpXTsKKyAgICAgICAgICAgIHZpZGVvX3NldF9sdXQgKExJTlVYX0xPR09fTFVUX09GRlNFVCArIGksIHIsIGcsIGIpOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKHljb3VudC0tKQorICAgIHsKKyAgICB4Y291bnQgPSBMSU5VWF9MT0dPX1dJRFRIOworICAgIHdoaWxlICh4Y291bnQtLSkKKyAgICB7CisgICAgICAgIHIgPSAodW5zaWduZWQgY2hhcilsaW51eF9sb2dvX3JlZCAgWypzb3VyY2UgLSBMSU5VWF9MT0dPX0xVVF9PRkZTRVRdOworICAgICAgICBnID0gKHVuc2lnbmVkIGNoYXIpbGludXhfbG9nb19ncmVlblsqc291cmNlIC0gTElOVVhfTE9HT19MVVRfT0ZGU0VUXTsKKyAgICAgICAgYiA9ICh1bnNpZ25lZCBjaGFyKWxpbnV4X2xvZ29fYmx1ZSBbKnNvdXJjZSAtIExJTlVYX0xPR09fTFVUX09GRlNFVF07CisKKyAgICAgICAgc3dpdGNoIChWSURFT19EQVRBX0ZPUk1BVCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEdERl9fOEJJVF9JTkRFWDoKKyAgICAgICAgICAgICpkZXN0ID0gKnNvdXJjZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdERl9fOEJJVF8zMzJSR0I6CisgICAgICAgICAgICAqZGVzdCA9ICgocj4+NSk8PDUpIHwgKChnPj41KTw8MikgfCAoYj4+Nik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHREZfMTVCSVRfNTU1UkdCOgorICAgICAgICAgICAgKih1bnNpZ25lZCBzaG9ydCAqKWRlc3QgPQorICAgICAgICAgICAgU1dBUDE2KCh1bnNpZ25lZCBzaG9ydCkoKChyPj4zKTw8MTApIHwgKChnPj4zKTw8NSkgfCAoYj4+MykpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdERl8xNkJJVF81NjVSR0I6CisgICAgICAgICAgICAqKHVuc2lnbmVkIHNob3J0ICopZGVzdCA9CisgICAgICAgICAgICBTV0FQMTYoKHVuc2lnbmVkIHNob3J0KSgoKHI+PjMpPDwxMSkgfCAoKGc+PjIpPDw1KSB8IChiPj4zKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0RGXzMyQklUX1g4ODhSR0I6CisgICAgICAgICAgICAqKHVuc2lnbmVkIGxvbmcgICopZGVzdCA9CisgICAgICAgICAgICBTV0FQMzIoKHVuc2lnbmVkIGxvbmcpKChyPDwxNikgfCAoZzw8OCkgfCBiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHREZfMjRCSVRfODg4UkdCOgorI2lmZGVmIFZJREVPX0ZCX0xJVFRMRV9FTkRJQU4KKyAgICAgICAgICAgIGRlc3RbMF0gPSBiOworICAgICAgICAgICAgZGVzdFsxXSA9IGc7CisgICAgICAgICAgICBkZXN0WzJdID0gcjsKKyNlbHNlCisgICAgICAgICAgICBkZXN0WzBdID0gcjsKKyAgICAgICAgICAgIGRlc3RbMV0gPSBnOworICAgICAgICAgICAgZGVzdFsyXSA9IGI7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNvdXJjZSsrOworICAgICAgICBkZXN0ICs9IFZJREVPX1BJWEVMX1NJWkU7CisgICAgfQorICAgIGRlc3QgKz0gc2tpcDsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCAqdmlkZW9fbG9nbyAodm9pZCkKK3sKKyAgICBjaGFyIGluZm9bMTI4XTsKKworICAgIGxvZ29fcGxvdCAodmlkZW9fZmJfYWRkcmVzcywgVklERU9fQ09MUywgMCwgMCk7CisKKyAgICBzcHJpbnRmKGluZm8sICIgJXMgKCVzIC0gJXMpIiwgVV9CT09UX1ZFUlNJT04sIF9fREFURV9fLCBfX1RJTUVfXyk7CisgICAgdmlkZW9fZHJhd3N0cmluZyAoVklERU9fSU5GT19YLCBWSURFT19JTkZPX1ksIGluZm8pOworCisjaWZkZWYgQ09ORklHX0NPTlNPTEVfRVhUUkFfSU5GTworICAgIHsKKyAgICBpbnQgaSwgbiA9ICgoVklERU9fTE9HT19IRUlHSFQtVklERU9fRk9OVF9IRUlHSFQpL1ZJREVPX0ZPTlRfSEVJR0hUKTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgICB2aWRlb19nZXRfaW5mb19zdHIgKGksIGluZm8pOworICAgICAgICBpZiAoKmluZm8pCisgICAgICAgIHZpZGVvX2RyYXdzdHJpbmcgKFZJREVPX0lORk9fWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVklERU9fSU5GT19ZICsgaSpWSURFT19GT05UX0hFSUdIVCwgaW5mbyk7CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuICh2aWRlb19mYl9hZGRyZXNzICsgVklERU9fTE9HT19IRUlHSFQgKiBWSURFT19MSU5FX0xFTik7Cit9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdmlkZW9faW5pdCh2b2lkKQoreworICAgIHVuc2lnbmVkIGNoYXIgY29sb3I4OworCisgICAgaWYgKChwR0Q9dmlkZW9faHdfaW5pdCgpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICB2aWRlb19mYl9hZGRyZXNzID0gKHZvaWQqKVZJREVPX0ZCX0FEUlM7CisjaWZkZWYgQ09ORklHX1ZJREVPX0hXX0NVUlNPUgorICAgIHZpZGVvX2luaXRfaHdfY3Vyc29yKFZJREVPX0ZPTlRfV0lEVEgsIFZJREVPX0ZPTlRfSEVJR0hUKTsKKyNlbmRpZgorCisgICAgLyogSW5pdCBkcmF3aW5nIHBhdHMgKi8KKyAgICBzd2l0Y2ggKFZJREVPX0RBVEFfRk9STUFUKQorICAgIHsKKyAgICBjYXNlIEdERl9fOEJJVF9JTkRFWDoKKyAgICAgICAgdmlkZW9fc2V0X2x1dCAoMHgwMSwgQ09OU09MRV9GR19DT0wsIENPTlNPTEVfRkdfQ09MLCBDT05TT0xFX0ZHX0NPTCk7CisgICAgICAgIHZpZGVvX3NldF9sdXQgKDB4MDAsIENPTlNPTEVfQkdfQ09MLCBDT05TT0xFX0JHX0NPTCwgQ09OU09MRV9CR19DT0wpOworICAgICAgICBmZ3ggPSAweDAxMDEwMTAxOworICAgICAgICBiZ3ggPSAweDAwMDAwMDAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdERl9fOEJJVF8zMzJSR0I6CisgICAgICAgIGNvbG9yOCA9ICgoQ09OU09MRV9GR19DT0wgJiAweGUwKSB8ICgoQ09OU09MRV9GR19DT0w+PjMpICYgMHgxYykgfCBDT05TT0xFX0ZHX0NPTD4+Nik7CisgICAgICAgIGZneCA9IChjb2xvcjg8PDI0KSB8IChjb2xvcjg8PDE2KSB8IChjb2xvcjg8PDgpIHwgY29sb3I4OworICAgICAgICBjb2xvcjggPSAoKENPTlNPTEVfQkdfQ09MICYgMHhlMCkgfCAoKENPTlNPTEVfQkdfQ09MPj4zKSAmIDB4MWMpIHwgQ09OU09MRV9CR19DT0w+PjYpOworICAgICAgICBiZ3ggPSAoY29sb3I4PDwyNCkgfCAoY29sb3I4PDwxNikgfCAoY29sb3I4PDw4KSB8IGNvbG9yODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHREZfMTVCSVRfNTU1UkdCOgorICAgICAgICBmZ3ggPSAoKChDT05TT0xFX0ZHX0NPTD4+Myk8PDI2KSB8ICgoQ09OU09MRV9GR19DT0w+PjMpPDwyMSkgfCAoKENPTlNPTEVfRkdfQ09MPj4zKTw8MTYpIHwKKyAgICAgICAgICAgKChDT05TT0xFX0ZHX0NPTD4+Myk8PDEwKSB8ICgoQ09OU09MRV9GR19DT0w+PjMpPDw1KSAgfCAgKENPTlNPTEVfRkdfQ09MPj4zKSk7CisgICAgICAgIGJneCA9ICgoKENPTlNPTEVfQkdfQ09MPj4zKTw8MjYpIHwgKChDT05TT0xFX0JHX0NPTD4+Myk8PDIxKSB8ICgoQ09OU09MRV9CR19DT0w+PjMpPDwxNikgfAorICAgICAgICAgICAoKENPTlNPTEVfQkdfQ09MPj4zKTw8MTApIHwgKChDT05TT0xFX0JHX0NPTD4+Myk8PDUpICB8ICAoQ09OU09MRV9CR19DT0w+PjMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHREZfMTZCSVRfNTY1UkdCOgorICAgICAgICBmZ3ggPSAoKChDT05TT0xFX0ZHX0NPTD4+Myk8PDI3KSB8ICgoQ09OU09MRV9GR19DT0w+PjIpPDwyMSkgfCAoKENPTlNPTEVfRkdfQ09MPj4zKTw8MTYpIHwKKyAgICAgICAgICAgKChDT05TT0xFX0ZHX0NPTD4+Myk8PDExKSB8ICgoQ09OU09MRV9GR19DT0w+PjIpPDw1KSAgfCAgKENPTlNPTEVfRkdfQ09MPj4zKSk7CisgICAgICAgIGJneCA9ICgoKENPTlNPTEVfQkdfQ09MPj4zKTw8MjcpIHwgKChDT05TT0xFX0JHX0NPTD4+Mik8PDIxKSB8ICgoQ09OU09MRV9CR19DT0w+PjMpPDwxNikgfAorICAgICAgICAgICAoKENPTlNPTEVfQkdfQ09MPj4zKTw8MTEpIHwgKChDT05TT0xFX0JHX0NPTD4+Mik8PDUpICB8ICAoQ09OU09MRV9CR19DT0w+PjMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHREZfMzJCSVRfWDg4OFJHQjoKKyAgICAgICAgZmd4ID0gKENPTlNPTEVfRkdfQ09MPDwxNikgfCAoQ09OU09MRV9GR19DT0w8PDgpIHwgQ09OU09MRV9GR19DT0w7CisgICAgICAgIGJneCA9IChDT05TT0xFX0JHX0NPTDw8MTYpIHwgKENPTlNPTEVfQkdfQ09MPDw4KSB8IENPTlNPTEVfQkdfQ09MOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdERl8yNEJJVF84ODhSR0I6CisgICAgICAgIGZneCA9IChDT05TT0xFX0ZHX0NPTDw8MjQpIHwgKENPTlNPTEVfRkdfQ09MPDwxNikgfCAoQ09OU09MRV9GR19DT0w8PDgpIHwgQ09OU09MRV9GR19DT0w7CisgICAgICAgIGJneCA9IChDT05TT0xFX0JHX0NPTDw8MjQpIHwgKENPTlNPTEVfQkdfQ09MPDwxNikgfCAoQ09OU09MRV9CR19DT0w8PDgpIHwgQ09OU09MRV9CR19DT0w7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBlb3J4ID0gZmd4IF4gYmd4OworCisjaWZkZWYgQ09ORklHX1ZJREVPX0xPR08KKyAgICAvKiBQbG90IHRoZSBsb2dvIGFuZCBnZXQgc3RhcnQgcG9pbnQgb2YgY29uc29sZSAqLworICAgIFBSSU5URCgiVmlkZW86IERyYXdpbmcgdGhlIGxvZ28gLi4uXG4iKTsKKyAgICB2aWRlb19jb25zb2xlX2FkZHJlc3MgPSB2aWRlb19sb2dvKCk7CisjZWxzZQorICAgIHZpZGVvX2NvbnNvbGVfYWRkcmVzcyA9IHZpZGVvX2ZiX2FkZHJlc3M7CisjZW5kaWYKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGNvbnNvbGUgKi8KKyAgICBjb25zb2xlX2NvbCAgPSAwOworICAgIGNvbnNvbGVfcm93ICA9IDA7CisKKyAgICByZXR1cm4gMCA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZHJ2X3ZpZGVvX2luaXQgKHZvaWQpCit7CisgICAgaW50IHNraXBfZGV2X2luaXQ7CisgICAgZGV2aWNlX3QgY29uc29sZV9kZXY7CisgICAgY2hhciAqcGVudjsKKworICAgIHNraXBfZGV2X2luaXQgPSAwOworCisgICAgIC8qIEZvcmNlIGNvbnNvbGUgaS9vIHRvIHNlcmlhbCA/ICovCisgICAgaWYgKChwZW52ID0gZ2V0ZW52ICgiY29uc29sZSIpKSAhPSBOVUxMKQorICAgICAgICBpZiAoc3RyY21wIChwZW52LCAic2VyaWFsIikgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAvKiBJbml0IHZpZGVvIGNoaXAgLSByZXR1cm5zIHdpdGggZnJhbWVidWZmZXIgY2xlYXJlZCAqLworICAgIGlmICh2aWRlb19pbml0KCkgPT0gLTEpCisgICAgICAgIHNraXBfZGV2X2luaXQgPSAxOworI2lmZGVmIENPTkZJR19WR0FfQVNfU0lOR0xFX0RFVklDRQorICAgLyogRGV2aWNlcyBWR0EgYW5kIEtleWJvYXJkIHdpbGwgYmUgYXNzaWduZWQgc2VwZXJhdGVseSAqLworICAgIC8qIEluaXQgdmdhIGRldmljZSAqLworICAgIGlmICghc2tpcF9kZXZfaW5pdCkKKyAgICB7CisgICAgICAgIG1lbXNldCAoJmNvbnNvbGVfZGV2LCAwLCBzaXplb2YoY29uc29sZV9kZXYpKTsKKyAgICAgICAgc3RyY3B5KGNvbnNvbGVfZGV2Lm5hbWUsICJ2Z2EiKTsKKyAgICAgICAgY29uc29sZV9kZXYuZXh0ICAgPSBERVZfRVhUX1ZJREVPOyAgICAvKiBWaWRlbyBleHRlbnNpb25zICovCisgICAgICAgIGNvbnNvbGVfZGV2LmZsYWdzID0gREVWX0ZMQUdTX09VVFBVVCB8IERFVl9GTEFHU19TWVNURU07CisgICAgICAgIGNvbnNvbGVfZGV2LnB1dGMgID0gdmlkZW9fcHV0YzsgICAgICAgIC8qICdwdXRjJyBmdW5jdGlvbiAqLworICAgICAgICBjb25zb2xlX2Rldi5wdXRzICA9IHZpZGVvX3B1dHM7ICAgICAgICAvKiAncHV0cycgZnVuY3Rpb24gKi8KKyAgICAgICAgY29uc29sZV9kZXYudHN0YyAgPSBOVUxMOyAgICAgICAgICAgICAgLyogJ3RzdGMnIGZ1bmN0aW9uICovCisgICAgICAgIGNvbnNvbGVfZGV2LmdldGMgID0gTlVMTDsgICAgICAgICAgICAgIC8qICdnZXRjJyBmdW5jdGlvbiAqLworCisgICAgICAgIGlmIChkZXZpY2VfcmVnaXN0ZXIgKCZjb25zb2xlX2RldikgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbHNlCisgICAgUFJJTlREKCJLQkQ6IEtleWJvYXJkIGluaXQgLi4uXG4iKTsKKyAgICBpZiAoVklERU9fS0JEX0lOSVRfRkNUID09IC0xKQorICAgICAgICBza2lwX2Rldl9pbml0ID0gMTsKKworICAgIC8qIEluaXQgY29uc29sZSBkZXZpY2UgKi8KKyAgICBpZiAoIXNraXBfZGV2X2luaXQpCisgICAgeworICAgICAgICBtZW1zZXQgKCZjb25zb2xlX2RldiwgMCwgc2l6ZW9mKGNvbnNvbGVfZGV2KSk7CisgICAgICAgIHN0cmNweShjb25zb2xlX2Rldi5uYW1lLCAiY29uc29sZSIpOworICAgICAgICBjb25zb2xlX2Rldi5leHQgICA9IERFVl9FWFRfVklERU87ICAgIC8qIFZpZGVvIGV4dGVuc2lvbnMgKi8KKyAgICAgICAgY29uc29sZV9kZXYuZmxhZ3MgPSBERVZfRkxBR1NfT1VUUFVUIHwgREVWX0ZMQUdTX0lOUFVUIHwgREVWX0ZMQUdTX1NZU1RFTTsKKyAgICAgICAgY29uc29sZV9kZXYucHV0YyAgPSB2aWRlb19wdXRjOyAgICAgICAgLyogJ3B1dGMnIGZ1bmN0aW9uICovCisgICAgICAgIGNvbnNvbGVfZGV2LnB1dHMgID0gdmlkZW9fcHV0czsgICAgICAgIC8qICdwdXRzJyBmdW5jdGlvbiAqLworICAgICAgICBjb25zb2xlX2Rldi50c3RjICA9IFZJREVPX1RTVENfRkNUOyAgICAvKiAndHN0YycgZnVuY3Rpb24gKi8KKyAgICAgICAgY29uc29sZV9kZXYuZ2V0YyAgPSBWSURFT19HRVRDX0ZDVDsgICAgLyogJ2dldGMnIGZ1bmN0aW9uICovCisKKyAgICAgICAgaWYgKGRldmljZV9yZWdpc3RlciAoJmNvbnNvbGVfZGV2KSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19WR0FfQVNfU0lOR0xFX0RFVklDRSAqLworICAgIC8qIE5vIGNvbnNvbGUgZGV2IGF2YWlsYWJsZSAqLworICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX0NGQl9DT05TT0xFICovCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3M4OTAwLmMgYi9kcml2ZXJzL2NzODkwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYzdjMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NzODkwMC5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ2lycnVzIExvZ2ljIENTODkwMEEgRXRoZXJuZXQKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBCZW4gV2lsbGlhbXNvbiA8YmVud0Bwb2JveC5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGxvYWRlZCBpbnRvIFNSQU0gaW4gYm9vdHN0cmFwIG1vZGUsIHdoZXJlIGl0IHdhaXRzCisgKiBmb3IgY29tbWFuZHMgb24gVUFSVDEgdG8gcmVhZCBhbmQgd3JpdGUgbWVtb3J5LCBqdW1wIHRvIGNvZGUgZXRjLgorICogQSBkZXNpZ24gZ29hbCBmb3IgdGhpcyBwcm9ncmFtIGlzIHRvIGJlIGVudGlyZWx5IGluZGVwZW5kZW50IG9mIHRoZQorICogdGFyZ2V0IGJvYXJkLiAgQW55dGhpbmcgd2l0aCBhIENMLVBTNzExMSBvciBFUDcyMTEgc2hvdWxkIGJlIGFibGUgdG8gcnVuCisgKiB0aGlzIGNvZGUgaW4gYm9vdHN0cmFwIG1vZGUuICBBbGwgdGhlIGJvYXJkIHNwZWNpZmljcyBjYW4gYmUgaGFuZGxlZCBvbgorICogdGhlIGhvc3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlICJjczg5MDAuaCIKKyNpbmNsdWRlIDxuZXQuaD4KKworI2lmZGVmIENPTkZJR19EUklWRVJfQ1M4OTAwCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisKKworLyogcGFja2V0IHBhZ2UgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLworCisjaWZkZWYgQ1M4OTAwX0JVUzMyCisvKiB3ZSBkb24ndCBuZWVkIDE2IGJpdCBpbml0aWFsaXNhdGlvbiBvbiAzMiBiaXQgYnVzICovCisjZGVmaW5lIGdldF9yZWdfaW5pdF9idXMoeCkgZ2V0X3JlZygoeCkpCisjZWxzZQorc3RhdGljIHVuc2lnbmVkIHNob3J0IGdldF9yZWdfaW5pdF9idXMoaW50IHJlZ25vKQoreworICAgIC8qIGZvcmNlIDE2IGJpdCBidXNtb2RlICovCisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjOworICAgIGMgPSBDUzg5MDBfQlVTMTZfMDsKKyAgICBjID0gQ1M4OTAwX0JVUzE2XzE7CisgICAgYyA9IENTODkwMF9CVVMxNl8wOworICAgIGMgPSBDUzg5MDBfQlVTMTZfMTsKKyAgICBjID0gQ1M4OTAwX0JVUzE2XzA7CisKKyAgICBDUzg5MDBfUFBUUiA9IHJlZ25vOworICAgIHJldHVybiAodW5zaWduZWQgc2hvcnQpIENTODkwMF9QREFUQTsKK30KKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK2dldF9yZWcoaW50IHJlZ25vKQoreworICAgIENTODkwMF9QUFRSID0gcmVnbm87CisgICAgcmV0dXJuICh1bnNpZ25lZCBzaG9ydCkgQ1M4OTAwX1BEQVRBOworfQorCisKK3N0YXRpYyB2b2lkIHB1dF9yZWcoaW50IHJlZ25vLCB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisgICAgQ1M4OTAwX1BQVFIgPSByZWdubzsKKyAgICBDUzg5MDBfUERBVEEgPSB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGV0aF9yZXNldCh2b2lkKQoreworICAgIGludCB0bW87CisgICAgdW5zaWduZWQgc2hvcnQgdXM7CisKKyAgICAvKiByZXNldCBOSUMgKi8KKyAgICBwdXRfcmVnKFBQX1NlbGZDVEwsIGdldF9yZWcoUFBfU2VsZkNUTCkgfCBQUF9TZWxmQ1RMX1Jlc2V0ICk7CisKKyAgICAvKiB3YWl0IGZvciAyMDBtcyAqLworICAgIHVkZWxheSgyMDAwMDApOworICAgIC8qIFdhaXQgdW50aWwgdGhlIGNoaXAgaXMgcmVzZXQgKi8KKworICAgIHRtbyA9IGdldF90aW1lcigwKSArIDEgKiBDRkdfSFo7CisgICAgd2hpbGUgKCgoKHVzID0gZ2V0X3JlZ19pbml0X2J1cyhQUF9TZWxmU1RBVCkpICYgUFBfU2VsZlNUQVRfSW5pdEQpID09IDApCisJICAgJiYgdG1vIDwgZ2V0X3RpbWVyKDApKQorICAgICAgLypOT1AqLzsKK30KKwordm9pZCBjczg5MDBfZ2V0X2VuZXRhZGRyICh1Y2hhciAqYWRkcikKK3sKKyAgICBpbnQgaTsKKyAgICAvKiB2ZXJpZnkgY2hpcCBpZCAqLworICAgIGlmIChnZXRfcmVnX2luaXRfYnVzKFBQX0NoaXBJRCkgIT0gMHg2MzBlKQorCXJldHVybjsKKyAgICBldGhfcmVzZXQoKTsKKyAgICBpZiAoKGdldF9yZWcoUFBfU2VsZlNUKSAmIChQUF9TZWxmU1RBVF9FRVBST00gfCBQUF9TZWxmU1RBVF9FRVBST01fT0spKSA9PQorCSAgICAgIChQUF9TZWxmU1RBVF9FRVBST018UFBfU2VsZlNUQVRfRUVQUk9NX09LKSkgeworCS8qIExvYWQgdGhlIE1BQyBmcm9tIEVFUFJPTSAqLworCWZvciAoaT0wOyBpPDYvMjsgaSsrKSB7CisJICAgIHVuc2lnbmVkIGludCBBZGRyOworCSAgICBBZGRyID0gZ2V0X3JlZyhQUF9JQStpKjIpOworCSAgICBhZGRyW2kqMl0gPSBBZGRyICYgMHhGRjsKKwkgICAgYWRkcltpKjIrMV0gPSBBZGRyID4+IDg7CisJfQorICAgIH0KK30KKwordm9pZCBldGhfaGFsdCggdm9pZCApCit7CisgICAgLyogZGlzYWJsZSB0cmFuc21pdHRlci9yZWNlaXZlciBtb2RlICovCisgICAgcHV0X3JlZyhQUF9MaW5lQ1RMLCAwKTsKKworICAgIC8qICJzaHV0ZG93biIgdG8gc2hvdyBDaGlwSUQgb3Iga2VybmVsIHdvdWxkbid0IGZpbmQgaGUgY3M4OTAwIC4uLiAqLworICAgIGdldF9yZWdfaW5pdF9idXMoUFBfQ2hpcElEKTsKK30KKworaW50IGV0aF9pbml0KCBiZF90ICpiZCApCit7CisKKyAgICAvKiB2ZXJpZnkgY2hpcCBpZCAqLworICAgIGlmIChnZXRfcmVnX2luaXRfYnVzKFBQX0NoaXBJRCkgIT0gMHg2MzBlKQorICAgIHsKKwlwcmludGYoICJDUzg5MDAgRXRoZXJuZXQgY2hpcCBub3QgZm91bmQ/IVxuIiApOworCXJldHVybiAwOworICAgIH0KKworICAgIGV0aF9yZXNldCgpOworICAgIC8qIHNldCB0aGUgZXRoZXJuZXQgYWRkcmVzcyAqLworICAgIHB1dF9yZWcoUFBfSUEgKyAwLCBiZC0+YmlfZW5ldGFkZHJbMF0gfCAoYmQtPmJpX2VuZXRhZGRyWzFdIDw8IDgpKTsKKyAgICBwdXRfcmVnKFBQX0lBICsgMiwgYmQtPmJpX2VuZXRhZGRyWzJdIHwgKGJkLT5iaV9lbmV0YWRkclszXSA8PCA4KSk7CisgICAgcHV0X3JlZyhQUF9JQSArIDQsIGJkLT5iaV9lbmV0YWRkcls0XSB8IChiZC0+YmlfZW5ldGFkZHJbNV0gPDwgOCkpOworCisgICAgLyogcmVjZWl2ZSBvbmx5IGVycm9yIGZyZWUgcGFja2V0cyBhZGRyZXNzZWQgdG8gdGhpcyBjYXJkICovCisgICAgcHV0X3JlZyhQUF9SeENUTCwgUFBfUnhDVExfSUEgfCBQUF9SeENUTF9Ccm9hZGNhc3QgfCBQUF9SeENUTF9SeE9LKTsKKworICAgIC8qIGRvIG5vdCBnZW5lcmF0ZSBhbnkgaW50ZXJydXB0cyBvbiByZWNlaXZlIG9wZXJhdGlvbnMgKi8KKyAgICBwdXRfcmVnKFBQX1J4Q0ZHLCAwKTsKKworICAgIC8qIGRvIG5vdCBnZW5lcmF0ZSBhbnkgaW50ZXJydXB0cyBvbiB0cmFuc21pdCBvcGVyYXRpb25zICovCisgICAgcHV0X3JlZyhQUF9UeENGRywgMCk7CisKKyAgICAvKiBkbyBub3QgZ2VuZXJhdGUgYW55IGludGVycnVwdHMgb24gYnVmZmVyIG9wZXJhdGlvbnMgKi8KKyAgICBwdXRfcmVnKFBQX0J1ZkNGRywgMCk7CisKKyAgICAvKiBlbmFibGUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIgbW9kZSAqLworICAgIHB1dF9yZWcoUFBfTGluZUNUTCwgUFBfTGluZUNUTF9SeCB8IFBQX0xpbmVDVExfVHgpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEdldCBhIGRhdGEgYmxvY2sgdmlhIEV0aGVybmV0ICovCitleHRlcm4gaW50IGV0aF9yeCh2b2lkKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIHNob3J0IHJ4bGVuOworICAgIHVuc2lnbmVkIHNob3J0ICphZGRyOworICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKworICAgIHN0YXR1cyA9IGdldF9yZWcoUFBfUkVSKTsKKworICAgIGlmICgoc3RhdHVzICYgUFBfUkVSX1J4T0spID09IDApCisgICAgICByZXR1cm4gMDsKKworICAgIHN0YXR1cyA9IENTODkwMF9SVERBVEE7ICAgICAgIC8qIHN0YXQgKi8KKyAgICByeGxlbiA9IENTODkwMF9SVERBVEE7ICAgICAgICAvKiBsZW4gKi8KKworICAgIGlmKHJ4bGVuID4gUEtUU0laRV9BTElHTiArIFBLVEFMSUdOKQorICAgICAgcHJpbnRmKCJwYWNrZXQgdG9vIGJpZyFcbiIpOworCisgICAgZm9yKGFkZHIgPSAodW5zaWduZWQgc2hvcnQgKilOZXRSeFBhY2tldHNbMF0sIGkgPSByeGxlbiA+PiAxOyBpID4gMDsgaS0tICkKKyAgICAgICphZGRyKysgPSBDUzg5MDBfUlREQVRBOworICAgIGlmKHJ4bGVuICYgMSkKKyAgICAgICphZGRyKysgPSBDUzg5MDBfUlREQVRBOworCisgICAgLyogUGFzcyB0aGUgcGFja2V0IHVwIHRvIHRoZSBwcm90b2NvbCBsYXllcnMuICovCisgICAgTmV0UmVjZWl2ZShOZXRSeFBhY2tldHNbMF0sIHJ4bGVuKTsKKworICAgIHJldHVybiByeGxlbjsKK30KKworLyogU2VuZCBhIGRhdGEgYmxvY2sgdmlhIEV0aGVybmV0LiAqLworZXh0ZXJuIGludCBldGhfc2VuZCh2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpCit7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmFkZHI7CisgICAgaW50IHRtbzsKKyAgICB1bnNpZ25lZCBzaG9ydCBzOworCityZXRyeToKKyAgICAvKiBpbml0aWF0ZSBhIHRyYW5zbWl0IHNlcXVlbmNlICovCisgICAgQ1M4OTAwX1R4Q01EID0gUFBfVHhDbWRfVHhTdGFydF9GdWxsOworICAgIENTODkwMF9UeExFTiA9IGxlbmd0aDsKKworICAgIC8qIFRlc3QgdG8gc2VlIGlmIHRoZSBjaGlwIGhhcyBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGUgcGFja2V0ICovCisgICAgaWYgKChnZXRfcmVnKFBQX0J1c1NUQVQpICYgUFBfQnVzU1RBVF9UeFJEWSkgPT0gMCkgeworCS8qIE9vcHMuLi4gdGhpcyBzaG91bGQgbm90IGhhcHBlbiEgKi8KKwlwcmludGYoImNzOiB1bmFibGUgdG8gc2VuZCBwYWNrZXQ7IHJldHJ5aW5nLi4uXG4iKTsKKwlmb3IgKHRtbyA9IGdldF90aW1lcigwKSArIDUgKiBDRkdfSFo7IGdldF90aW1lcigwKSA8IHRtbzsgKQorCSAgLypOT1AqLzsKKwlldGhfcmVzZXQoKTsKKwlnb3RvIHJldHJ5OworICAgIH0KKworICAgIC8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgcGFja2V0ICovCisgICAgLyogYXNzdW1lIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzICovCisgICAgZm9yKGFkZHIgPSBwYWNrZXQ7IGxlbmd0aCA+IDA7IGxlbmd0aCAtPSAyICkKKyAgICAgIENTODkwMF9SVERBVEEgPSAqYWRkcisrOworCisgICAgLyogd2FpdCBmb3IgdHJhbnNmZXIgdG8gc3VjY2VlZCAqLworICAgIHRtbyA9IGdldF90aW1lcigwKSArIDUgKiBDRkdfSFo7CisgICAgd2hpbGUoKHMgPSBnZXRfcmVnKFBQX1RFUikgJiB+MHgxRikgPT0gMCkKKyAgICB7CisJaWYgKGdldF90aW1lcigwKSA+PSB0bW8pCisJICBicmVhazsKKyAgICB9CisKKyAgICAgIC8qIG5vdGhpbmcgKi8gOworICAgIGlmICgocyAmIChQUF9URVJfQ1JTIHwgUFBfVEVSX1R4T0spKSAhPSBQUF9URVJfVHhPSykgeworCXByaW50ZigiXG50cmFuc21pc3Npb24gZXJyb3IgJSN4XG4iLCBzKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTU1BTkRTICYgQ0ZHX05FVCAqLworCisjZW5kaWYgLyogQ09ORklHX0RSSVZFUl9DUzg5MDAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3Q2OTAwMC5jIGIvZHJpdmVycy9jdDY5MDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2MmY3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3Q2OTAwMC5jCkBAIC0wLDAgKzEsMTQ4NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGVuaXMgUGV0ZXIsIE1QTCBBRyBTd2l0emVybGFuZAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBwb3J0ZWQgZnJvbSBjdGZiLmMgKGxpbnV4IGtlcm5lbCkgZm9yIHRoZSBVLUJvb3QKKyAqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBHZXQgUGFyYW1ldGVycyBmb3IgdGhlIHZpZGVvIG1vZGU6CisgIFBhcmFtZXRlcnMgY2FuIGJlIHNldCB2aWEgdGhlIHZhcmlhYmxlICJ2aWRlb21vZGUiIGluIHRoZSBlbnZpcm9ubWVudC4KKyAgMiBkaWZlcmVudCB3YXlzIGFyZSBwb3NzaWJsZToKKyAgInZpZGVvbW9kZT0zMDEiICAgLSAzMDEgaXMgYSBoZXhhZGVjaW1hbCBudW1iZXIgZGVzY3JpYmluZyB0aGUgVkVTQQorICAgICAgICAgICAgICAgICAgICAgIG1vZGUuIEZvbGxvd2luZyBtb2RlcyBhcmUgaW1wbGVtZW50ZWQ6CisKKyAgICAgICAgICAgICAgICAgICAgICBDb2xvcnMgICAgNjQweDQ4MCA4MDB4NjAwIDEwMjR4NzY4IDExNTJ4ODY0CisgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgIDggYml0cyB8ICAweDMwMSAgIDB4MzAzICAgIDB4MzA1ICAgIDB4MTYxCisgICAgICAgICAgICAgICAgICAgICAxNSBiaXRzIHwgIDB4MzEwICAgMHgzMTMgICAgMHgzMTYgICAgMHgxNjIKKyAgICAgICAgICAgICAgICAgICAgIDE2IGJpdHMgfCAgMHgzMTEgICAweDMxNCAgICAweDMxNyAgICAweDE2MworICAgICAgICAgICAgICAgICAgICAgMjQgYml0cyB8ICAweDMxMiAgIDB4MzE1ICAgIDB4MzE4ICAgICAgPworICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgInZpZGVvbW9kZT1ib290YXJncyIKKyAgICAgICAgICAgICAgICAgICAtIHRoZSBwYXJhbWV0ZXJzIGFyZSBwYXJzZWQgZnJvbSB0aGUgYm9vdGFyZ3MuCisgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvcm1hdCBpcyAiTkFNRTpWQUxVRSxOQU1FOlZBTFVFIiBldGMuCisgICAgICAgICAgICAgICAgICAgICAgRXguOgorICAgICAgICAgICAgICAgICAgICAgICJib290YXJncz12aWRlbz1jdGZiOng6ODAwLHk6NjAwLGRlcHRoOjE2LHBjbGs6MjUwMDAiCisgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVycyBub3QgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgd2lsbCBiZSB0YWtlbiBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgbW9kZSwgd2hpY2ggaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgICAgICAgbW9kZTowICA2NDB4NDgweDI0CisgICAgICAgICAgICAgICAgICAgICAgbW9kZToxICA4MDB4NjAweDE2CisgICAgICAgICAgICAgICAgICAgICAgbW9kZToyICAxMDI0eDc2OHg4CisgICAgICAgICAgICAgICAgICAgICAgbW9kZTozICA5NjB4NzIweDI0CisgICAgICAgICAgICAgICAgICAgICAgbW9kZTo0ICAxMTUyeDg2NHgxNgorICAgICAgICAgICAgICAgICAgICAgIGlmICJtb2RlIiBpcyBub3QgcHJvdmlkZWQgd2l0aGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICBtb2RlOjAgaXMgYXNzdW1lZC4KKyAgICAgICAgICAgICAgICAgICAgICBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgc3VwcG9ydGVkOgorICAgICAgICAgICAgICAgICAgICAgIHggICAgICAgeHJlcyA9IHZpc2libGUgcmVzb2x1dGlvbiBob3Jpem9udGFsCisgICAgICAgICAgICAgICAgICAgICAgeSAgICAgICB5cmVzID0gdmlzaWJsZSByZXNvbHV0aW9uIHZlcnRpY2FsCisgICAgICAgICAgICAgICAgICAgICAgcGNsayAgICBwaXhlbGNsb2NrcyBpbiBwaWNvIHNlYworICAgICAgICAgICAgICAgICAgICAgIGxlICAgICAgbGVmdF9tYXJnaW5nIHRpbWUgZnJvbSBzeW5jIHRvIHBpY3R1cmUgaW4gcGl4ZWxjbG9ja3MKKyAgICAgICAgICAgICAgICAgICAgICByaSAgICAgIHJpZ2h0X21hcmdpbmcgdGltZSBmcm9tIHBpY3R1cmUgdG8gc3luYyBpbiBwaXhlbGNsb2NrcworICAgICAgICAgICAgICAgICAgICAgIHVwICAgICAgdXBwZXJfbWFyZ2luIHRpbWUgZnJvbSBzeW5jIHRvIHBpY3R1cmUKKyAgICAgICAgICAgICAgICAgICAgICBsbyAgICAgIGxvd2VyX21hcmdpbgorICAgICAgICAgICAgICAgICAgICAgIGhzICAgICAgaHN5bmNfbGVuIGxlbmd0aCBvZiBob3Jpem9udGFsIHN5bmMKKyAgICAgICAgICAgICAgICAgICAgICB2cyAgICAgIHZzeW5jX2xlbiBsZW5ndGggb2YgdmVydGljYWwgc3luYworICAgICAgICAgICAgICAgICAgICAgIHN5bmMgICAgc2VlIEZCX1NZTkNfKgorICAgICAgICAgICAgICAgICAgICAgIHZtb2RlICAgc2VlIEZCX1ZNT0RFXyoKKyAgICAgICAgICAgICAgICAgICAgICBkZXB0aCAgIENvbG9yIGRlcHRoIGluIGJpdHMgcGVyIHBpeGVsCisgICAgICAgICAgICAgICAgICAgICAgQWxsIG90aGVyIHBhcmFtZXRlcnMgaW4gdGhlIHZhcmlhYmxlIGJvb3RhcmdzIGFyZSBpZ25vcmVkLgorICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc2V0IHRoZSBwYXJhbWV0ZXJzIGRpcmVjdCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSAidmlkZW9tb2RlIiwgb3IgaW4gYW5vdGhlciB2YXJpYWJsZSBpLmUuCisgICAgICAgICAgICAgICAgICAgICAgIm15dmlkZW8iIGFuZCBzZXR0aW5nIHRoZSB2YXJpYWJsZSAidmlkZW9tb2RlPW15dmlkZW8iLi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19WSURFTworCisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8dmlkZW9fZmIuaD4KKworI2lmZGVmIENPTkZJR19WSURFT19DVDY5MDAwCisKKy8qIGRlYnVnICovCisjdW5kZWYgVkdBX0RFQlVHCisjdW5kZWYgVkdBX0RVTVBfUkVHCisjaWZkZWYgVkdBX0RFQlVHCisjZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKKyNlbHNlCisjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikKKyNlbmRpZgorCisvKiBNYWNyb3MgKi8KKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbiggYSwgYiApICggKCBhICkgPCAoIGIgKSApID8gKCBhICkgOiAoIGIgKQorI2VuZGlmCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoIGEsIGIgKSAoICggYSApID4gKCBiICkgKSA/ICggYSApIDogKCBiICkKKyNlbmRpZgorI2lmZGVmIG1pbm1heAorI2Vycm9yICJ0ZXJtIG1pbm1heCBhbHJlYWR5IHVzZWQuIgorI2VuZGlmCisjZGVmaW5lIG1pbm1heCggYSwgeCwgYiApIG1heCggKCBhICksIG1pbiggKCB4ICksICggYiApICkgKQorI2RlZmluZSBOX0VMVFMoIHggKSAoIHNpemVvZiggeCApIC8gc2l6ZW9mKCB4WyAwIF0gKSApCisKKy8qIENUIFJlZ2lzdGVyIE9mZnNldHMgKi8KKyNkZWZpbmUgQ1RfQVJfTwkJCTB4M2MwCS8qIEluZGV4IGFuZCBEYXRhIHdyaXRlIHBvcnQgb2YgdGhlIGF0dHJpYnV0ZSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ1RfR1JfTwkJCTB4M2NlCS8qIEluZGV4IHBvcnQgb2YgdGhlIEdyYXBoaWMgQ29udHJvbGxlciBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ1RfU1JfTwkJCTB4M2M0CS8qIEluZGV4IHBvcnQgb2YgdGhlIFNlcXVlbmNlciBDb250cm9sbGVyICovCisjZGVmaW5lIENUX0NSX08JCQkweDNkNAkvKiBJbmRleCBwb3J0IG9mIHRoZSBDUlQgQ29udHJvbGxlciAqLworI2RlZmluZSBDVF9YUl9PCQkJMHgzZDYJLyogRXh0ZW5kZWQgUmVnaXN0ZXIgaW5kZXggKi8KKyNkZWZpbmUgQ1RfTVNSX1dfTwkJMHgzYzIJLyogTWlzYy4gT3V0cHV0IFJlZ2lzdGVyICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBDVF9MVVRfTUFTS19PCQkweDNjNgkvKiBDb2xvciBQYWxldHRlIE1hc2sgKi8KKyNkZWZpbmUgQ1RfTFVUX1NUQVJUX08JCTB4M2M4CS8qIENvbG9yIFBhbGV0dGUgV3JpdGUgTW9kZSBJbmRleCAqLworI2RlZmluZSBDVF9MVVRfUkdCX08JCTB4M2M5CS8qIENvbG9yIFBhbGV0dGUgRGF0YSBQb3J0ICovCisjZGVmaW5lIENUX1NUQVRVU19SRUcwX08JMHgzYzIJLyogU3RhdHVzIFJlZ2lzdGVyIDAgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgQ1RfU1RBVFVTX1JFRzFfTwkweDNkYQkvKiBJbnB1dCBTdGF0dXMgUmVnaXN0ZXIgMSAocmVhZCBvbmx5KSAqLworCisjZGVmaW5lIENUX0ZQX08JCQkweDNkMAkvKiBJbmRleCBwb3J0IG9mIHRoZSBGbGF0IHBhbmVsIFJlZ2lzdGVycyAqLworI2RlZmluZSBDVF9NUl9PCQkJMHgzZDIJLyogSW5kZXggUG9ydCBvZiB0aGUgTXVsdGltZWRpYSBFeHRlbnNpb24gKi8KKworLyogZGVmaW5lcyBmb3IgdGhlIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJSMDBfbwkJMHg0MDAwMDAJLyogU291cmNlIGFuZCBEZXN0aW5hdGlvbiBTcGFuIFJlZ2lzdGVyICovCisjZGVmaW5lIEJSMDFfbwkJMHg0MDAwMDQJLyogUGF0dGVybi9Tb3VyY2UgRXhwYW5zaW9uIEJhY2tncm91bmQgQ29sb3IgJiBUcmFuc3BhcmVuY3kgS2V5IFJlZ2lzdGVyICovCisjZGVmaW5lIEJSMDJfbwkJMHg0MDAwMDgJLyogUGF0dGVybi9Tb3VyY2UgRXhwYW5zaW9uIEZvcmVncm91bmQgQ29sb3IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQlIwM19vCQkweDQwMDAwQwkvKiBNb25vY2hyb21lIFNvdXJjZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEJSMDRfbwkJMHg0MDAwMTAJLyogQml0QkxUIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQlIwNV9vCQkweDQwMDAxNAkvKiBQYXR0ZXJuIEFkZHJlc3MgUmVnaXN0ZSAqLworI2RlZmluZSBCUjA2X28JCTB4NDAwMDE4CS8qIFNvdXJjZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIEJSMDdfbwkJMHg0MDAwMUMJLyogRGVzdGluYXRpb24gQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBCUjA4X28JCTB4NDAwMDIwCS8qIERlc3RpbmF0aW9uIFdpZHRoICYgSGVpZ2h0IFJlZ2lzdGVyICovCisjZGVmaW5lIEJSMDlfbwkJMHg0MDAwMjQJLyogU291cmNlIEV4cGFuc2lvbiBCYWNrZ3JvdW5kIENvbG9yICYgVHJhbnNwYXJlbmN5IEtleSBSZWdpc3RlciAqLworI2RlZmluZSBCUjBBX28JCTB4NDAwMDI4CS8qIFNvdXJjZSBFeHBhbnNpb24gRm9yZWdyb3VuZCBDb2xvciBSZWdpc3RlciAqLworCisjZGVmaW5lIENVUlNPUl9TSVpFCTB4MTAwMAkvKiBpbiBLQnl0ZSBmb3IgSFcgQ3Vyc29yICovCisjZGVmaW5lIFBBVFRFUk5fQURSCShwR0QtPmRwckJhc2UgKyBDVVJTT1JfU0laRSkJLyogcGF0dGVybiBNZW1vcnkgYWZ0ZXIgQ3Vyc29yIE1lbW9yeSAqLworI2RlZmluZSBQQVRURVJOX1NJWkUJOCo4KjQJLyogNCBCeXRlcyBwZXIgUGl4ZWwgOCB4IDggUGl4ZWwgKi8KKyNkZWZpbmUgQUNDRUxNRU1PUlkJKENVUlNPUl9TSVpFICsgUEFUVEVSTl9TSVpFKQkvKiByZXNlcnZlZCBNZW1vcnkgZm9yIEJJVEJsdCBhbmQgaHcgY3Vyc29yICovCisKKy8qIFNvbWUgTW9kZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBGQl9TWU5DX0hPUl9ISUdIX0FDVAkxCS8qIGhvcml6b250YWwgc3luYyBoaWdoIGFjdGl2ZSAgKi8KKyNkZWZpbmUgRkJfU1lOQ19WRVJUX0hJR0hfQUNUCTIJLyogdmVydGljYWwgc3luYyBoaWdoIGFjdGl2ZSAgICAqLworI2RlZmluZSBGQl9TWU5DX0VYVAkJNAkvKiBleHRlcm5hbCBzeW5jICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX1NZTkNfQ09NUF9ISUdIX0FDVAk4CS8qIGNvbXBvc2l0ZSBzeW5jIGhpZ2ggYWN0aXZlICAgKi8KKyNkZWZpbmUgRkJfU1lOQ19CUk9BRENBU1QJMTYJLyogYnJvYWRjYXN0IHZpZGVvIHRpbWluZ3MgICAgICAqLworCQkJCQkvKiB2dG90YWwgPSAxNDRkLzI4OG4vNTc2aSA9PiBQQUwgICovCisJCQkJCS8qIHZ0b3RhbCA9IDEyMWQvMjQybi80ODRpID0+IE5UU0MgKi8KKyNkZWZpbmUgRkJfU1lOQ19PTl9HUkVFTgkzMgkvKiBzeW5jIG9uIGdyZWVuICovCisKKyNkZWZpbmUgRkJfVk1PREVfTk9OSU5URVJMQUNFRCAgMAkvKiBub24gaW50ZXJsYWNlZCAqLworI2RlZmluZSBGQl9WTU9ERV9JTlRFUkxBQ0VECTEJLyogaW50ZXJsYWNlZCAgICovCisjZGVmaW5lIEZCX1ZNT0RFX0RPVUJMRQkJMgkvKiBkb3VibGUgc2NhbiAqLworI2RlZmluZSBGQl9WTU9ERV9NQVNLCQkyNTUKKworI2RlZmluZSBGQl9WTU9ERV9ZV1JBUAkJMjU2CS8qIHl3cmFwIGluc3RlYWQgb2YgcGFubmluZyAgICAgKi8KKyNkZWZpbmUgRkJfVk1PREVfU01PT1RIX1hQQU4JNTEyCS8qIHNtb290aCB4cGFuIHBvc3NpYmxlIChpbnRlcm5hbGx5IHVzZWQpICovCisjZGVmaW5lIEZCX1ZNT0RFX0NPTlVQREFURQk1MTIJLyogZG9uJ3QgdXBkYXRlIHgveW9mZnNldCAgICAgICAqLworCisjZGVmaW5lIHRleHQJCQkwCisjZGVmaW5lIGZudHdpZHRoCQk4CisKKy8qIHRhYmxlIGZvciBWR0EgSW5pdGlhbGl6YXRpb24gICovCit0eXBlZGVmIHN0cnVjdCB7CisJY29uc3QgdW5zaWduZWQgY2hhciByZWc7CisJY29uc3QgdW5zaWduZWQgY2hhciB2YWw7Cit9IENUX0NGR19UQUJMRTsKKworLyogdGhpcyB0YWJsZSBwcm92aWRlcyBzb21lIGJhc2ljIGluaXRpYWxpc2F0aW9ucyBzdWNoIGFzIE1lbW9yeSBDbG9jayBldGMgKi8KK3N0YXRpYyBDVF9DRkdfVEFCTEUgeHJlZ1tdID0geworCXsweDA5LCAweDAxfSwJCS8qIENSVCBDb250cm9sbGVyIEV4dGVuc2lvbnMgRW5hYmxlICovCisJezB4MEEsIDB4MDJ9LAkJLyogRnJhbWUgQnVmZmVyIE1hcHBpbmcgKi8KKwl7MHgwQiwgMHgwMX0sCQkvKiBQQ0kgV3JpdGUgQnVyc3Qgc3VwcG9ydCAqLworCXsweDIwLCAweDAwfSwJCS8qIEJpdEJMVCBDb25maWd1cmF0aW9uICovCisJezB4NDAsIDB4MDN9LAkJLyogTWVtb3J5IEFjY2VzcyBDb250cm9sICovCisJezB4NjAsIDB4MDB9LAkJLyogVmlkZW8gUGluIENvbnRyb2wgKi8KKwl7MHg2MSwgMHgwMH0sCQkvKiBEUE1TIFN5bmNoIGNvbnRyb2wgKi8KKwl7MHg2MiwgMHgwMH0sCQkvKiBHUElPIFBpbiBDb250cm9sICovCisJezB4NjMsIDB4QkR9LAkJLyogR1BJTyBQaW4gRGF0YSAqLworCXsweDY3LCAweDAwfSwJCS8qIFBpbiBUcmktU3RhdGUgKi8KKwl7MHg4MCwgMHg4MH0sCQkvKiBQaXhlbCBQaXBlbGluZSBDb25maWcgMCByZWdpc3RlciAqLworCXsweEEwLCAweDAwfSwJCS8qIEN1cnNvciAxIENvbnRyb2wgUmVnICovCisJezB4QTEsIDB4MDB9LAkJLyogQ3Vyc29yIDEgVmVydGljYWwgRXh0ZW5zaW9uIFJlZyAqLworCXsweEEyLCAweDAwfSwJCS8qIEN1cnNvciAxIEJhc2UgQWRkcmVzcyBMb3cgKi8KKwl7MHhBMywgMHgwMH0sCQkvKiBDdXJzb3IgMSBCYXNlIEFkZHJlc3MgSGlnaCAqLworCXsweEE0LCAweDAwfSwJCS8qIEN1cnNvciAxIFgtUG9zaXRpb24gTG93ICovCisJezB4QTUsIDB4MDB9LAkJLyogQ3Vyc29yIDEgWC1Qb3NpdGlvbiBIaWdoICovCisJezB4QTYsIDB4MDB9LAkJLyogQ3Vyc29yIDEgWS1Qb3NpdGlvbiBMb3cgKi8KKwl7MHhBNywgMHgwMH0sCQkvKiBDdXJzb3IgMSBZLVBvc2l0aW9uIEhpZ2ggKi8KKwl7MHhBOCwgMHgwMH0sCQkvKiBDdXJzb3IgMiBDb250cm9sIFJlZyAqLworCXsweEE5LCAweDAwfSwJCS8qIEN1cnNvciAyIFZlcnRpY2FsIEV4dGVuc2lvbiBSZWcgKi8KKwl7MHhBQSwgMHgwMH0sCQkvKiBDdXJzb3IgMiBCYXNlIEFkZHJlc3MgTG93ICovCisJezB4QUIsIDB4MDB9LAkJLyogQ3Vyc29yIDIgQmFzZSBBZGRyZXNzIEhpZ2ggKi8KKwl7MHhBQywgMHgwMH0sCQkvKiBDdXJzb3IgMiBYLVBvc2l0aW9uIExvdyAqLworCXsweEFELCAweDAwfSwJCS8qIEN1cnNvciAyIFgtUG9zaXRpb24gSGlnaCAqLworCXsweEFFLCAweDAwfSwJCS8qIEN1cnNvciAyIFktUG9zaXRpb24gTG93ICovCisJezB4QUYsIDB4MDB9LAkJLyogQ3Vyc29yIDIgWS1Qb3NpdGlvbiBIaWdoICovCisJezB4QzAsIDB4N0R9LAkJLyogRG90IENsb2NrIDAgVkNPIE0tRGl2aXNvciAqLworCXsweEMxLCAweDA3fSwJCS8qIERvdCBDbG9jayAwIFZDTyBOLURpdmlzb3IgKi8KKwl7MHhDMywgMHgzNH0sCQkvKiBEb3QgQ2xvY2sgMCBEaXZpc29yIHNlbGVjdCAqLworCXsweEM0LCAweDU1fSwJCS8qIERvdCBDbG9jayAxIFZDTyBNLURpdmlzb3IgKi8KKwl7MHhDNSwgMHgwOX0sCQkvKiBEb3QgQ2xvY2sgMSBWQ08gTi1EaXZpc29yICovCisJezB4QzcsIDB4MjR9LAkJLyogRG90IENsb2NrIDEgRGl2aXNvciBzZWxlY3QgKi8KKwl7MHhDOCwgMHg3RH0sCQkvKiBEb3QgQ2xvY2sgMiBWQ08gTS1EaXZpc29yICovCisJezB4QzksIDB4MDd9LAkJLyogRG90IENsb2NrIDIgVkNPIE4tRGl2aXNvciAqLworCXsweENCLCAweDM0fSwJCS8qIERvdCBDbG9jayAyIERpdmlzb3Igc2VsZWN0ICovCisJezB4Q0MsIDB4Mzh9LAkJLyogTWVtb3J5IENsb2NrIDAgVkNPIE0tRGl2aXNvciAqLworCXsweENELCAweDAzfSwJCS8qIE1lbW9yeSBDbG9jayAwIFZDTyBOLURpdmlzb3IgKi8KKwl7MHhDRSwgMHg5MH0sCQkvKiBNZW1vcnkgQ2xvY2sgMCBEaXZpc29yIHNlbGVjdCAqLworCXsweENGLCAweDA2fSwJCS8qIENsb2NrIENvbmZpZyAqLworCXsweEQwLCAweDBGfSwJCS8qIFBvd2VyIERvd24gKi8KKwl7MHhEMSwgMHgwMX0sCQkvKiBQb3dlciBEb3duIEJpdEJMVCAqLworCXsweEZGLCAweEZGfQkJLyogZW5kIG9mIHRhYmxlICovCit9OworLyogQ2xvY2sgQ29uZmlnOgorICogPT09PT09PT09PT09PQorICoKKyAqIFBEIFJlZ2lzdGVyczoKKyAqIC0tLS0tLS0tLS0tLS0KKyAqIEJpdDIgYW5kIEJpdDQuLjYgYXJlIHVzZWQgZm9yIHRoZSBMb29wIERpdmlzb3IgYW5kIFBvc3QgRGl2aXNvci4KKyAqIFRoZXkgYXJlIGVuY29kZWQgYXMgZm9sbG93czoKKyAqCisgKiArLS0tKy0tLS0tLS0tLS0tLS0tKworICogfCAyIHwgTG9vcCBEaXZpc29yIHwKKyAqICstLS0rLS0tLS0tLS0tLS0tLS0rCisgKiB8IDEgfCAxICAgICAgICAgICAgfAorICogKy0tLSstLS0tLS0tLS0tLS0tLSsKKyAqIHwgMCB8IDQgICAgICAgICAgICB8CisgKiArLS0tKy0tLS0tLS0tLS0tLS0tKworICogTm90ZTogVGhlIE1lbW9yeSBDbG9jayBkb2VzIG5vdCBoYXZlIGEgTG9vcCBEaXZpc29yLgorICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKworICogfCA2IHwgNSB8IDQgfCBQb3N0IERpdmlzb3IgfAorICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKworICogfCAwIHwgMCB8IDAgfCAxICAgICAgICAgICAgfAorICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKworICogfCAwIHwgMCB8IDEgfCAyICAgICAgICAgICAgfAorICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKworICogfCAwIHwgMSB8IDAgfCA0ICAgICAgICAgICAgfAorICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKworICogfCAwIHwgMSB8IDEgfCA4ICAgICAgICAgICAgfAorICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKworICogfCAxIHwgMCB8IDAgfCAxNiAgICAgICAgICAgfAorICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKworICogfCAxIHwgMCB8IDEgfCAzMiAgICAgICAgICAgfAorICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKworICogfCAxIHwgMSB8IFggfCByZXNlcnZlZCAgICAgfAorICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKworICoKKyAqIEFsbCBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBpbiB0aGVzZSByZWdpc3RlcnMuCisgKgorICogQ2xvY2sgVkNPIE0gUmVnaXN0ZXJzOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhlc2UgUmVnaXN0ZXJzIGNvbnRhaW4gdGhlIE0gVmFsdWUgLTIuCisgKgorICogQ2xvY2sgVkNPIE4gUmVnaXN0ZXJzOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhlc2UgUmVnaXN0ZXJzIGNvbnRhaW4gdGhlIE4gVmFsdWUgLTIuCisgKgorICogRm9ybXVsYXM6CisgKiAtLS0tLS0tLS0KKyAqIEZ2Y28gPSAoRnJlZiAqIExvb3AgRGl2aXNvciAqIE0vTiksIHdoZXJlYXMgMTAwTUh6IDwgRnZjbyA8IDIyME1IegorICogRm91dCA9IEZ2Y28gLyBQb3N0IERpdmlzb3IKKyAqCisgKiBEb3QgQ2xrMCAoZGVmYXVsdCAyNU1Ieik6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdmNvID0gMTQuMzE4ICogMTI3IC8gOSA9IDIwMi4wNDVNSHoKKyAqIEZvdXQgPSAyMDIuMDQ1TUh6IC8gOCA9IDI1LjI1TUh6CisgKiBQb3N0IERpdmlzb3IgPSA4CisgKiBMb29wIERpdmlzb3IgPSAxCisgKiBYUkMwID0gKE0gLSAyKSA9IDEyNSA9IDB4N0QKKyAqIFhSQzEgPSAoTiAtIDIpID0gNyAgID0gMHgwNworICogWFJDMyA9ICAgICAgICAgICAgICAgICAweDM0CisgKgorICogRG90IENsazEgKGRlZmF1bHQgMjhNSHopOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnZjbyA9IDE0LjMxOCAqIDg3IC8gMTEgPSAxMTMuMjRNSHoKKyAqIEZvdXQgPSAxMTMuMjRNSHogLyA0ID0gMjguMzFNSHoKKyAqIFBvc3QgRGl2aXNvciA9IDQKKyAqIExvb3AgRGl2aXNvciA9IDEKKyAqIFhSQzQgPSAoTSAtIDIpID0gODUgPSAweDU1CisgKiBYUkM1ID0gKE4gLSAyKSA9IDkgID0gMHgwOQorICogWFJDNyA9ICAgICAgICAgICAgICAgIDB4MjQKKyAqCisgKiBEb3QgQ2xrMiAodmFyaWFibGUgZm9yIGV4dGVuZGVkIG1vZGVzIHNldCB0byAyNU1Ieik6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdmNvID0gMTQuMzE4ICogMTI3IC8gOSA9IDIwMi4wNDVNSHoKKyAqIEZvdXQgPSAyMDIuMDQ1TUh6IC8gOCA9IDI1LjI1TUh6CisgKiBQb3N0IERpdmlzb3IgPSA4CisgKiBMb29wIERpdmlzb3IgPSAxCisgKiBYUkM4ID0gKE0gLSAyKSA9IDEyNSA9IDB4N0QKKyAqIFhSQzkgPSAoTiAtIDIpID0gNyAgID0gMHgwNworICogWFJDQiA9ICAgICAgICAgICAgICAgICAweDM0CisgKgorICogTWVtb3J5IENsayBmb3IgbW9zdCBtb2RlcyA+NTBNSHo6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdmNvID0gMTQuMzE4ICogNTggLyA1ID0gMTY2TUh6CisgKiBGb3V0ID0gMTY2TUh6IC8gMiAgICAgID0gODNNSHoKKyAqIFBvc3QgRGl2aXNvciA9IDIKKyAqIFhSQ0MgPSAoTSAtIDIpID0gNTcgID0gMHgzOAorICogWFJDRCA9IChOIC0gMikgPSAzICAgPSAweDAzCisgKiBYUkNFID0gICAgICAgICAgICAgICAgIDB4OTAKKyAqCisgKiBOb3RlIEJpdDcgZW5hYmxlcyB0aGUgY2xvY2sgc291cmNlIGZyb20gdGhlIFZDTworICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXNvbHV0aW9uIFN0cnVjdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBjdGZiX3Jlc19tb2RlcyB7CisJaW50IHhyZXM7CQkvKiB2aXNpYmxlIHJlc29sdXRpb24gICAgICAgICAgICovCisJaW50IHlyZXM7CisJLyogVGltaW5nOiBBbGwgdmFsdWVzIGluIHBpeGNsb2NrcywgZXhjZXB0IHBpeGNsb2NrIChvZiBjb3Vyc2UpICovCisJaW50IHBpeGNsb2NrOwkJLyogcGl4ZWwgY2xvY2sgaW4gcHMgKHBpY28gc2Vjb25kcykgKi8KKwlpbnQgbGVmdF9tYXJnaW47CS8qIHRpbWUgZnJvbSBzeW5jIHRvIHBpY3R1cmUgICAgKi8KKwlpbnQgcmlnaHRfbWFyZ2luOwkvKiB0aW1lIGZyb20gcGljdHVyZSB0byBzeW5jICAgICovCisJaW50IHVwcGVyX21hcmdpbjsJLyogdGltZSBmcm9tIHN5bmMgdG8gcGljdHVyZSAgICAqLworCWludCBsb3dlcl9tYXJnaW47CisJaW50IGhzeW5jX2xlbjsJCS8qIGxlbmd0aCBvZiBob3Jpem9udGFsIHN5bmMgICAgKi8KKwlpbnQgdnN5bmNfbGVuOwkJLyogbGVuZ3RoIG9mIHZlcnRpY2FsIHN5bmMgICAgICAqLworCWludCBzeW5jOwkJLyogc2VlIEZCX1NZTkNfKiAgICAgICAgICAgICAgICAqLworCWludCB2bW9kZTsJCS8qIHNlZSBGQl9WTU9ERV8qICAgICAgICAgICAgICAgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZlc2EgTW9kZSBTdHJ1Y3QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgY3RmYl92ZXNhX21vZGVzIHsKKwlpbnQgdmVzYW5yOwkJLyogVmVzYSBudW1iZXIgYXMgaW4gTElMTyAoVkVTQSBOciArIDB4MjAwfSAqLworCWludCByZXNpbmRleDsJCS8qIGluZGV4IHRvIHJlc29sdXRpb24gc3RydWN0ICovCisJaW50IGJpdHNfcGVyX3BpeGVsOwkvKiBicHAgKi8KK307CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hpcHMgc3RydWN0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBjdGZiX2NoaXBzX3Byb3BlcnRpZXMgeworCWludCBkZXZpY2VfaWQ7CQkvKiBQQ0kgRGV2aWNlIElEICovCisJdW5zaWduZWQgbG9uZyBtYXhfbWVtOwkvKiBtZW1vcnkgZm9yIGZyYW1lIGJ1ZmZlciAqLworCWludCB2bGRfc2V0OwkJLyogdmFsdWUgb2YgVkxEIGlmIGJpdDIgaW4gY2xvY2sgY29udHJvbCBpcyBzZXQgKi8KKwlpbnQgdmxkX25vdF9zZXQ7CS8qIHZhbHVlIG9mIFZMRCBpZiBiaXQyIGluIGNsb2NrIGNvbnRyb2wgaXMgc2V0ICovCisJaW50IG1uX2RpZmY7CQkvKiBkaWZmZXJlbmNlIGJldHdlZW4gTS9OIFZhbHVlICsgbW5fZGlmZiA9IE0vTiBSZWdpc3RlciAqLworCWludCBtbl9taW47CQkvKiBtaW4gdmFsdWUgb2YgTS9OIFZhbHVlICovCisJaW50IG1uX21heDsJCS8qIG1heCB2YWx1ZSBvZiBNL04gVmFsdWUgKi8KKwlpbnQgdmNvX21pbjsJCS8qIFZDTyBNaW4gaW4gTUh6ICovCisJaW50IHZjb19tYXg7CQkvKiBWQ08gTWF4IGluIE1IeiAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjdGZiX2NoaXBzX3Byb3BlcnRpZXMgY2hpcHNbXSA9IHsKKwl7UENJX0RFVklDRV9JRF9DVF82OTAwMCwgMHgyMDAwMDAsIDEsIDQsIC0yLCAzLCAyNTcsIDEwMCwgMjIwfSwKKwl7UENJX0RFVklDRV9JRF9DVF82NTU1NSwgMHgxMDAwMDAsIDE2LCA0LCAwLCAxLCAyNTUsIDQ4LCAyMjB9LAkvKiBOT1QgVEVTVEVEICovCisJezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CS8qIFRlcm1pbmF0b3IgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgVmlkZW8gTW9kZXM6CitDb2xvdXJzICAgNjQweDQwMCA2NDB4NDgwIDgwMHg2MDAgMTAyNHg3NjggMTE1Mng4NjQgMTI4MHgxMDI0IDE2MDB4MTIwMAorLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyA0IGJpdHMgfCAgICA/ICAgICAgID8gICAgIDB4MzAyICAgICAgPyAgICAgICAgPyAgICAgICAgPyAgICAgICAgID8KKyA4IGJpdHMgfCAgMHgzMDAgICAweDMwMSAgIDB4MzAzICAgIDB4MzA1ICAgIDB4MTYxICAgIDB4MzA3ICAgICAweDMxQworMTUgYml0cyB8ICAgID8gICAgIDB4MzEwICAgMHgzMTMgICAgMHgzMTYgICAgMHgxNjIgICAgMHgzMTkgICAgIDB4MzFECisxNiBiaXRzIHwgICAgPyAgICAgMHgzMTEgICAweDMxNCAgICAweDMxNyAgICAweDE2MyAgICAweDMxQSAgICAgMHgzMUUKKzI0IGJpdHMgfCAgICA/ICAgICAweDMxMiAgIDB4MzE1ICAgIDB4MzE4ICAgICAgPyAgICAgIDB4MzFCICAgICAweDMxRgorMzIgYml0cyB8ICAgID8gICAgICAgPyAgICAgICA/ICAgICAgICA/ICAgICAgMHgxNjQgICAgICA/CisqLworCisjZGVmaW5lIFJFU19NT0RFXzY0MHg0ODAgCTAKKyNkZWZpbmUgUkVTX01PREVfODAweDYwMCAJMQorI2RlZmluZSBSRVNfTU9ERV8xMDI0eDc2OCAJMgorI2RlZmluZSBSRVNfTU9ERV85NjBfNzIwCTMKKyNkZWZpbmUgUkVTX01PREVfMTE1Mng4NjQgCTQKKyNkZWZpbmUgUkVTX01PREVTX0NPVU5UCQk1CisKKyNkZWZpbmUgVkVTQV9NT0RFU19DT1VOVCAxNQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGN0ZmJfdmVzYV9tb2RlcyB2ZXNhX21vZGVzW1ZFU0FfTU9ERVNfQ09VTlRdID0geworCXsweDMwMSwgUkVTX01PREVfNjQweDQ4MCwgOH0sCisJezB4MzEwLCBSRVNfTU9ERV82NDB4NDgwLCAxNX0sCisJezB4MzExLCBSRVNfTU9ERV82NDB4NDgwLCAxNn0sCisJezB4MzEyLCBSRVNfTU9ERV82NDB4NDgwLCAyNH0sCisJezB4MzAzLCBSRVNfTU9ERV84MDB4NjAwLCA4fSwKKwl7MHgzMTMsIFJFU19NT0RFXzgwMHg2MDAsIDE1fSwKKwl7MHgzMTQsIFJFU19NT0RFXzgwMHg2MDAsIDE2fSwKKwl7MHgzMTUsIFJFU19NT0RFXzgwMHg2MDAsIDI0fSwKKwl7MHgzMDUsIFJFU19NT0RFXzEwMjR4NzY4LCA4fSwKKwl7MHgzMTYsIFJFU19NT0RFXzEwMjR4NzY4LCAxNX0sCisJezB4MzE3LCBSRVNfTU9ERV8xMDI0eDc2OCwgMTZ9LAorCXsweDMxOCwgUkVTX01PREVfMTAyNHg3NjgsIDI0fSwKKwl7MHgxNjEsIFJFU19NT0RFXzExNTJ4ODY0LCA4fSwKKwl7MHgxNjIsIFJFU19NT0RFXzExNTJ4ODY0LCAxNX0sCisJezB4MTYzLCBSRVNfTU9ERV8xMTUyeDg2NCwgMTZ9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGN0ZmJfcmVzX21vZGVzIHJlc19tb2RlX2luaXRbUkVTX01PREVTX0NPVU5UXSA9IHsKKwkvKiB4ICAgICB5IHBpeGNsayAgIGxlICByaSAgdXAgIGxvICAgaHMgdnMgIHMgIHZtb2RlICovCisJezY0MCwgNDgwLCAzOTcyMSwgNDAsIDI0LCAzMiwgMTEsIDk2LCAyLCAwLAorCSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKKwl7ODAwLCA2MDAsIDI3Nzc4LCA2NCwgMjQsIDIyLCAxLCA3MiwgMiwgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRH0sCisJezEwMjQsIDc2OCwgMTUzODQsIDE2OCwgOCwgMjksIDMsIDE0NCwgNCwgMCwKKwkgRkJfVk1PREVfTk9OSU5URVJMQUNFRH0sCisJezk2MCwgNzIwLCAxMzEwMCwgMTYwLCA0MCwgMzIsIDgsIDgwLCA0LCAwLAorCSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKKwl7MTE1MiwgODY0LCAxMjAwNCwgMjAwLCA2NCwgMzIsIDE2LCA4MCwgNCwgMCwKKwkgRkJfVk1PREVfTk9OSU5URVJMQUNFRH0KK307CisKKy8qCisgKiBUaGUgR3JhcGhpYyBEZXZpY2UKKyAqLworR3JhcGhpY0RldmljZSBjdGZiOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBMb3cgTGV2ZWwgUm91dGluZXMKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFJlYWQgQ1QgSVNBIHJlZ2lzdGVyCisqLworI2lmZGVmIFZHQV9ERUJVRworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2N0UmVhZCAodW5zaWduZWQgc2hvcnQgaW5kZXgpCit7CisJR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikgJiBjdGZiOworCWlmIChpbmRleCA9PSBDVF9BUl9PKQorCQkvKiBzeW5jaCB0aGUgRmxpcCBGbG9wICovCisJCWluOCAocEdELT5pc2FCYXNlICsgQ1RfU1RBVFVTX1JFRzFfTyk7CisKKwlyZXR1cm4gKGluOCAocEdELT5pc2FCYXNlICsgaW5kZXgpKTsKK30KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogV3JpdGUgQ1QgSVNBIHJlZ2lzdGVyCisqLworc3RhdGljIHZvaWQKK2N0V3JpdGUgKHVuc2lnbmVkIHNob3J0IGluZGV4LCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSAmIGN0ZmI7CisKKwlvdXQ4ICgocEdELT5pc2FCYXNlICsgaW5kZXgpLCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBSZWFkIENUIElTQSByZWdpc3RlciBpbmRleGVkCisqLworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2N0UmVhZF9pICh1bnNpZ25lZCBzaG9ydCBpbmRleCwgY2hhciByZWcpCit7CisJR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikgJiBjdGZiOworCWlmIChpbmRleCA9PSBDVF9BUl9PKQorCQkvKiBzeW5jaCB0aGUgRmxpcCBGbG9wICovCisJCWluOCAocEdELT5pc2FCYXNlICsgQ1RfU1RBVFVTX1JFRzFfTyk7CisJb3V0OCAoKHBHRC0+aXNhQmFzZSArIGluZGV4KSwgcmVnKTsKKwlyZXR1cm4gKGluOCAocEdELT5pc2FCYXNlICsgaW5kZXggKyAxKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFdyaXRlIENUIElTQSByZWdpc3RlciBpbmRleGVkCisqLworc3RhdGljIHZvaWQKK2N0V3JpdGVfaSAodW5zaWduZWQgc2hvcnQgaW5kZXgsIGNoYXIgcmVnLCBjaGFyIHZhbCkKK3sKKwlHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSAmIGN0ZmI7CisJaWYgKGluZGV4ID09IENUX0FSX08pIHsKKwkJLyogc3luY2ggdGhlIEZsaXAgRmxvcCAqLworCQlpbjggKHBHRC0+aXNhQmFzZSArIENUX1NUQVRVU19SRUcxX08pOworCQlvdXQ4ICgocEdELT5pc2FCYXNlICsgaW5kZXgpLCByZWcpOworCQlvdXQ4ICgocEdELT5pc2FCYXNlICsgaW5kZXgpLCB2YWwpOworCX0gZWxzZSB7CisJCW91dDggKChwR0QtPmlzYUJhc2UgKyBpbmRleCksIHJlZyk7CisJCW91dDggKChwR0QtPmlzYUJhc2UgKyBpbmRleCArIDEpLCB2YWwpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogV3JpdGUgYSB0YWJsZSBvZiBDVCBJU0EgcmVnaXN0ZXIKKyovCitzdGF0aWMgdm9pZAorY3RMb2FkUmVncyAodW5zaWduZWQgc2hvcnQgaW5kZXgsIENUX0NGR19UQUJMRSAqIHJlZ1RhYikKK3sKKwl3aGlsZSAocmVnVGFiLT5yZWcgIT0gMHhGRikgeworCQljdFdyaXRlX2kgKGluZGV4LCByZWdUYWItPnJlZywgcmVnVGFiLT52YWwpOworCQlyZWdUYWIrKzsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitTZXRBclJlZ3MgKHZvaWQpCit7CisJaW50IGksIHRtcDsKKworCWZvciAoaSA9IDA7IGkgPCAweDEwOyBpKyspCisJCWN0V3JpdGVfaSAoQ1RfQVJfTywgaSwgaSk7CisJaWYgKHRleHQpCisJCXRtcCA9IDB4MDQ7CisJZWxzZQorCQl0bXAgPSAweDQxOworCisJY3RXcml0ZV9pIChDVF9BUl9PLCAweDEwLCB0bXApOwkvKiBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwljdFdyaXRlX2kgKENUX0FSX08sIDB4MTEsIDB4MDApOwkvKiBPdmVyc2NhbiBDb2xvciBSZWdpc3RlciAqLworCWN0V3JpdGVfaSAoQ1RfQVJfTywgMHgxMiwgMHgwZik7CS8qIE1lbW9yeSBQbGFuZSBFbmFibGUgUmVnaXN0ZXIgKi8KKwlpZiAoZm50d2lkdGggPT0gOSkKKwkJdG1wID0gMHgwODsKKwllbHNlCisJCXRtcCA9IDB4MDA7CisJY3RXcml0ZV9pIChDVF9BUl9PLCAweDEzLCB0bXApOwkvKiBIb3Jpem9udGFsIFBpeGVsIFBhbm5pbmcgKi8KKwljdFdyaXRlX2kgKENUX0FSX08sIDB4MTQsIDB4MDApOwkvKiBDb2xvciBTZWxlY3QgUmVnaXN0ZXIgICAgKi8KKwljdFdyaXRlIChDVF9BUl9PLCAweDIwKTsJLyogZW5hYmxlIHZpZGVvICAgICAgICAgICAgICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitTZXRHclJlZ3MgKHZvaWQpCit7CQkJCS8qIFNldCBHcmFwaGljcyBNb2RlICovCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMHgwNTsgaSsrKQorCQljdFdyaXRlX2kgKENUX0dSX08sIGksIDApOworCWlmICh0ZXh0KSB7CisJCWN0V3JpdGVfaSAoQ1RfR1JfTywgMHgwNSwgMHgxMCk7CisJCWN0V3JpdGVfaSAoQ1RfR1JfTywgMHgwNiwgMHgwMik7CisJfSBlbHNlIHsKKwkJY3RXcml0ZV9pIChDVF9HUl9PLCAweDA1LCAweDQwKTsKKwkJY3RXcml0ZV9pIChDVF9HUl9PLCAweDA2LCAweDA1KTsKKwl9CisJY3RXcml0ZV9pIChDVF9HUl9PLCAweDA3LCAweDBmKTsKKwljdFdyaXRlX2kgKENUX0dSX08sIDB4MDgsIDB4ZmYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorU2V0U3JSZWdzICh2b2lkKQoreworCWludCB0bXAgPSAwOworCisJY3RXcml0ZV9pIChDVF9TUl9PLCAweDAwLCAweDAwKTsJLyogcmVzZXQgKi8KKwkvKnJyKCBzciwgMHgwMSwgdG1wICk7CisJICAgaWYoIGZudHdpZHRoID09IDggKSB0bXAgfD0gMHgwMTsgZWxzZSB0bXAgJj0gfjB4MDE7CisJICAgd3IoIHNyLCAweDAxLCB0bXAgKTsgICovCisJaWYgKGZudHdpZHRoID09IDgpCisJCWN0V3JpdGVfaSAoQ1RfU1JfTywgMHgwMSwgMHgwMSk7CS8qIENsb2NraW5nIE1vZGUgUmVnaXN0ZXIgKi8KKwllbHNlCisJCWN0V3JpdGVfaSAoQ1RfU1JfTywgMHgwMSwgMHgwMCk7CS8qIENsb2NraW5nIE1vZGUgUmVnaXN0ZXIgKi8KKwljdFdyaXRlX2kgKENUX1NSX08sIDB4MDIsIDB4MGYpOwkvKiBFbmFibGUgQ1BVIHdyIGFjY2VzcyB0byBnaXZlbiBtZW1vcnkgcGxhbmUgKi8KKwljdFdyaXRlX2kgKENUX1NSX08sIDB4MDMsIDB4MDApOwkvKiBDaGFyYWN0ZXIgTWFwIFNlbGVjdCBSZWdpc3RlciAqLworCWlmICh0ZXh0KQorCQl0bXAgPSAweDAyOworCWVsc2UKKwkJdG1wID0gMHgwZTsKKwljdFdyaXRlX2kgKENUX1NSX08sIDB4MDQsIHRtcCk7CS8qIEVuYWJsZSBDUFUgYWNjZXNzZXMgdG8gdGhlIHJlc3Qgb2YgdGhlIDI1NktCCisJCQkJCSAgIHRvdGFsIFZHQSBtZW1vcnkgYmV5b25kIHRoZSBmaXJzdCA2NEtCIGFuZCBzZXQKKwkJCQkJICAgZmIgbWFwcGluZyBtb2RlLiAqLworCWN0V3JpdGVfaSAoQ1RfU1JfTywgMHgwMCwgMHgwMyk7CS8qIGVuYWJsZSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorU2V0Qml0c1BlclBpeGVsSW50b1hyUmVncyAoaW50IGJwcCkKK3sKKwl1bnNpZ25lZCBpbnQgbiA9IChicHAgPj4gMyksIHRtcDsJLyogb25seSBmb3IgMTUsIDgsIDE2LCAyNCBicHAgKi8KKwlzdGF0aWMgY2hhciBtZFs0XSA9IHsgMHgwNCwgMHgwMiwgMHgwNSwgMHgwNiB9OwkvKiBEaXNwbGF5Q29sb3JNb2RlICovCisJc3RhdGljIGNoYXIgb2ZmWzRdID0geyB+MHgyMCwgfjB4MzAsIH4weDIwLCB+MHgxMCB9OwkvKiBtYXNrICovCisJc3RhdGljIGNoYXIgb25bNF0gPSB7IDB4MTAsIDB4MDAsIDB4MTAsIDB4MjAgfTsJLyogbWFzayAqLworCWlmIChicHAgPT0gMTUpCisJCW4gPSAwOworCXRtcCA9IGN0UmVhZF9pIChDVF9YUl9PLCAweDIwKTsKKwl0bXAgJj0gb2ZmW25dOworCXRtcCB8PSBvbltuXTsKKwljdFdyaXRlX2kgKENUX1hSX08sIDB4MjAsIHRtcCk7CS8qIEJpdEJMVCBDb25maWd1cmF0aW9uICovCisJY3RXcml0ZV9pIChDVF9YUl9PLCAweDgxLCBtZFtuXSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitTZXRDclJlZ3MgKHN0cnVjdCBjdGZiX3Jlc19tb2RlcyAqdmFyLCBpbnQgYml0c19wZXJfcGl4ZWwpCit7CQkJCS8qIGhlIC1sZS0gICBodHwwICAgIGhkIC1yaS0gaHMgICAgIC1oLSAgICAgIGhlICovCisJdW5zaWduZWQgY2hhciBjclsweDdhXTsKKwlpbnQgaSwgdG1wOworCXVuc2lnbmVkIGludCBoZCwgaHMsIGhlLCBodCwgaGJlOwkvKiBIb3Jpem9udGFsLiAgKi8KKwl1bnNpZ25lZCBpbnQgdmQsIHZzLCB2ZSwgdnQ7CS8qIHZlcnRpY2FsICovCisJdW5zaWduZWQgaW50IGJwcCwgd2QsIGRibHNjYW4sIGludGVybGFjZWQsIGJjYXN0LCBDcnRIYWxmTGluZTsKKwl1bnNpZ25lZCBpbnQgQ29tcFN5bmNDaGFyQ2xrRGVsYXksIENvbXBTeW5jUGl4ZWxDbGtEZWxheTsKKwl1bnNpZ25lZCBpbnQgTlRTQ19QQUxfSG9yaXpvbnRhbFB1bHNlV2lkdGgsIEJsRGVsYXlDdHJsOworCXVuc2lnbmVkIGludCBIb3Jpem9udGFsRXF1YWxpemF0aW9uUHVsc2VzOworCXVuc2lnbmVkIGludCBIb3Jpem9udGFsU2VycmF0aW9uMVN0YXJ0LCBIb3Jpem9udGFsU2VycmF0aW9uMlN0YXJ0OworCisJY29uc3QgaW50IExpbmVDb21wYXJlID0gMHgzZmY7CisJdW5zaWduZWQgaW50IFRleHRTY2FuTGluZXMgPSAxOwkvKiB0aGlzIGlzIGluIGZhY3QgYSB2ZXJ0aWNhbCB6b29tIGZhY3RvciAgICovCisJdW5zaWduZWQgaW50IFJBTURBQ19CbGFua1BlZGVzdGFsRW5hYmxlID0gMDsJLyogMT1lbi0sIDA9ZGlzYWJsZSwgc2VlIFhSODIgKi8KKworCWhkID0gKHZhci0+eHJlcykgLyA4OwkvKiBIRGlzcC4gICovCisJaHMgPSAodmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4pIC8gODsJLyogSHNTdHJ0ICAqLworCWhlID0gKHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luICsgdmFyLT5oc3luY19sZW4pIC8gODsJLyogSHNFbmQgICAqLworCWh0ID0gKHZhci0+bGVmdF9tYXJnaW4gKyB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuKSAvIDg7CS8qIEhUb3RhbCAgKi8KKwloYmUgPSBodCAtIDE7CQkvKiBIQmxhbmtFbmFibGUgdG9kbyBkb2N1IHdhbnRzIGh0IGhlcmUsIGJ1dCBpdCBkb2VzIG5vdCB3b3JrICovCisJLyogdmUgLXVwLSAgdnR8MCAgICB2ZCAtbG8tIHZzICAgICAtdi0gICAgICB2ZSAqLworCXZkID0gdmFyLT55cmVzOwkJLyogVkRpc3BsYXkgICAqLworCXZzID0gdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW47CS8qIFZTeW5jU3RhcnQgKi8KKwl2ZSA9IHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW47CS8qIFZTeW5jRW5kICovCisJdnQgPSB2YXItPnVwcGVyX21hcmdpbiArIHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW47CS8qIFZUb3RhbCAgKi8KKwlicHAgPSBiaXRzX3Blcl9waXhlbDsKKwlkYmxzY2FuID0gKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9ET1VCTEUpID8gMSA6IDA7CisJaW50ZXJsYWNlZCA9IHZhci0+dm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEOworCWJjYXN0ID0gdmFyLT5zeW5jICYgRkJfU1lOQ19CUk9BRENBU1Q7CisJQ3J0SGFsZkxpbmUgPSBiY2FzdCA/IChoZCA+PiAxKSA6IDA7CisJQmxEZWxheUN0cmwgPSBiY2FzdCA/IDEgOiAwOworCUNvbXBTeW5jQ2hhckNsa0RlbGF5ID0gMDsJLyogMiBiaXQgKi8KKwlDb21wU3luY1BpeGVsQ2xrRGVsYXkgPSAwOwkvKiAzIGJpdCAqLworCWlmIChiY2FzdCkgeworCQlOVFNDX1BBTF9Ib3Jpem9udGFsUHVsc2VXaWR0aCA9IDc7CS8qKCB2YXItPmhzeW5jX2xlbiA+PiAxICkgKyAxICovCisJCUhvcml6b250YWxFcXVhbGl6YXRpb25QdWxzZXMgPSAwOwkvKiBpbnZlcnNlIHZhbHVlICovCisJCUhvcml6b250YWxTZXJyYXRpb24xU3RhcnQgPSAzMTsJLyogKCBodCA+PiAxICkgKi8KKwkJSG9yaXpvbnRhbFNlcnJhdGlvbjJTdGFydCA9IDg5OwkvKiAoIGh0ID4+IDEgKSAqLworCX0gZWxzZSB7CisJCU5UU0NfUEFMX0hvcml6b250YWxQdWxzZVdpZHRoID0gMDsKKwkJLyogNCBiaXQ6IGhzeW5jIHB1bHNlIHdpZHRoID0gKCAoIENSNzRbNDowXSAtIENSNzRbNV0gKQorCQkgKiAvIDIgKSArIDEgLS0+IENSNzRbNDowXSA9IDIqKGhzLTEpICsgQ1I3NFs1XSAqLworCQlIb3Jpem9udGFsRXF1YWxpemF0aW9uUHVsc2VzID0gMTsJLyogaW52ZXJzZSB2YWx1ZSAqLworCQlIb3Jpem9udGFsU2VycmF0aW9uMVN0YXJ0ID0gMDsJLyogKCBodCA+PiAxICkgKi8KKwkJSG9yaXpvbnRhbFNlcnJhdGlvbjJTdGFydCA9IDA7CS8qICggaHQgPj4gMSApICovCisJfQorCisJaWYgKGJwcCA9PSAxNSkKKwkJYnBwID0gMTY7CisJd2QgPSB2YXItPnhyZXMgKiBicHAgLyA2NDsJLyogZG91YmxlIHdvcmRzIHBlciBsaW5lICovCisJaWYgKGludGVybGFjZWQpIHsJLyogd2UgZGl2aWRlIGFsbCB2ZXJ0aWNhbCB0aW1pbmdzLCBleGVwdCB2ZCAqLworCQl2cyA+Pj0gMTsKKwkJdmUgPj49IDE7CisJCXZ0ID4+PSAxOworCX0KKwltZW1zZXQgKGNyLCAwLCBzaXplb2YgKGNyKSk7CisJY3JbMHgwMF0gPSAweGZmICYgKGh0IC0gNSk7CisJY3JbMHgwMV0gPSBoZCAtIDE7CS8qIHNvbGw6NGYgaXN0IDU5ICovCisJY3JbMHgwMl0gPSBoZDsKKwljclsweDAzXSA9IChoYmUgJiAweDFGKSB8IDB4ODA7CS8qIGhkICsgaHQgLSBoZCAgKi8KKwljclsweDA0XSA9IGhzOworCWNyWzB4MDVdID0gKChoYmUgJiAweDIwKSA8PCAyKSB8IChoZSAmIDB4MWYpOworCWNyWzB4MDZdID0gKHZ0IC0gMikgJiAweEZGOworCWNyWzB4MzBdID0gKHZ0IC0gMikgPj4gODsKKwljclsweDA3XSA9ICgodnQgJiAweDEwMCkgPj4gOCkKKwkgICAgfCAoKHZkICYgMHgxMDApID4+IDcpCisJICAgIHwgKCh2cyAmIDB4MTAwKSA+PiA2KQorCSAgICB8ICgodnMgJiAweDEwMCkgPj4gNSkKKwkgICAgfCAoKExpbmVDb21wYXJlICYgMHgxMDApID4+IDQpCisJICAgIHwgKCh2dCAmIDB4MjAwKSA+PiA0KQorCSAgICB8ICgodmQgJiAweDIwMCkgPj4gMykKKwkgICAgfCAoKHZzICYgMHgyMDApID4+IDIpOworCWNyWzB4MDhdID0gMHgwMDsKKwljclsweDA5XSA9IChkYmxzY2FuIDw8IDcpCisJICAgIHwgKChMaW5lQ29tcGFyZSAmIDB4MjAwKSA+PiAzKQorCSAgICB8ICgodnMgJiAweDIwMCkgPj4gNCkKKwkgICAgfCAoVGV4dFNjYW5MaW5lcyAtIDEpOworCWNyWzB4MTBdID0gdnMgJiAweGZmOwkvKiBWU3luY1B1bHNlU3RhcnQgKi8KKwljclsweDMyXSA9ICh2cyAmIDB4ZjAwKSA+PiA4OwkvKiBWU3luY1B1bHNlU3RhcnQgKi8KKwljclsweDExXSA9ICh2ZSAmIDB4MGYpOwkvKiB8IDB4MjA7ICAgICAgKi8KKwljclsweDEyXSA9ICh2ZCAtIDEpICYgMHhmZjsJLyogTGluZUNvdW50ICAqLworCWNyWzB4MzFdID0gKCh2ZCAtIDEpICYgMHhmMDApID4+IDg7CS8qIExpbmVDb3VudCAqLworCWNyWzB4MTNdID0gd2QgJiAweGZmOworCWNyWzB4NDFdID0gKHdkICYgMHhmMDApID4+IDg7CisJY3JbMHgxNV0gPSB2cyAmIDB4ZmY7CisJY3JbMHgzM10gPSAodnMgJiAweGYwMCkgPj4gODsKKwljclsweDM4XSA9ICgweDEwMCAmIChodCAtIDUpKSA+PiA4OworCWNyWzB4M0NdID0gMHhjMCAmIGhiZTsKKwljclsweDE2XSA9ICh2dCAtIDEpICYgMHhmZjsJLyogdmJlIC0gZG9jdSB3YW50cyB2dCBoZXJlLCAqLworCWNyWzB4MTddID0gMHhlMzsJLyogYnV0IGl0IGRvZXMgbm90IHdvcmsgKi8KKwljclsweDE4XSA9IDB4ZmYgJiBMaW5lQ29tcGFyZTsKKwljclsweDIyXSA9IDB4ZmY7CS8qIHRvZG8/ICovCisJY3JbMHg3MF0gPSBpbnRlcmxhY2VkID8gKDB4ODAgfCBDcnRIYWxmTGluZSkgOiAweDAwOwkvKiBjaGVjazoweGE2ICAqLworCWNyWzB4NzFdID0gMHg4MCB8IChSQU1EQUNfQmxhbmtQZWRlc3RhbEVuYWJsZSA8PCA2KQorCSAgICB8IChCbERlbGF5Q3RybCA8PCA1KQorCSAgICB8ICgoMHgwMyAmIENvbXBTeW5jQ2hhckNsa0RlbGF5KSA8PCAzKQorCSAgICB8ICgweDA3ICYgQ29tcFN5bmNQaXhlbENsa0RlbGF5KTsJLyogdG9kbzogc2VlIFhSODIgKi8KKwljclsweDcyXSA9IEhvcml6b250YWxTZXJyYXRpb24xU3RhcnQ7CisJY3JbMHg3M10gPSBIb3Jpem9udGFsU2VycmF0aW9uMlN0YXJ0OworCWNyWzB4NzRdID0gKEhvcml6b250YWxFcXVhbGl6YXRpb25QdWxzZXMgPDwgNSkKKwkgICAgfCBOVFNDX1BBTF9Ib3Jpem9udGFsUHVsc2VXaWR0aDsKKwkvKiB0b2RvOiBjdDY5MDAwIGhhcyBhbHNvIDB4NzUtNzkgKi8KKwkvKiBub3cgc2V0IHRoZSByZWdpc3RlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IDB4MGQ7IGkrKykgewkvKkNSMDAgLi4gQ1IwRCAqLworCQljdFdyaXRlX2kgKENUX0NSX08sIGksIGNyW2ldKTsKKwl9CisJZm9yIChpID0gMHgxMDsgaSA8PSAweDE4OyBpKyspIHsJLypDUjEwIC4uIENSMTggKi8KKwkJY3RXcml0ZV9pIChDVF9DUl9PLCBpLCBjcltpXSk7CisJfQorCWkgPSAweDIyOwkJLypDUjIyICovCisJY3RXcml0ZV9pIChDVF9DUl9PLCBpLCBjcltpXSk7CisJZm9yIChpID0gMHgzMDsgaSA8PSAweDMzOyBpKyspIHsJLypDUjMwIC4uIENSMzMgKi8KKwkJY3RXcml0ZV9pIChDVF9DUl9PLCBpLCBjcltpXSk7CisJfQorCWkgPSAweDM4OwkJLypDUjM4ICovCisJY3RXcml0ZV9pIChDVF9DUl9PLCBpLCBjcltpXSk7CisJaSA9IDB4M0M7CQkvKkNSM0MgKi8KKwljdFdyaXRlX2kgKENUX0NSX08sIGksIGNyW2ldKTsKKwlmb3IgKGkgPSAweDQwOyBpIDw9IDB4NDE7IGkrKykgewkvKkNSNDAgLi4gQ1I0MSAqLworCQljdFdyaXRlX2kgKENUX0NSX08sIGksIGNyW2ldKTsKKwl9CisJZm9yIChpID0gMHg3MDsgaSA8PSAweDc0OyBpKyspIHsJLypDUjcwIC4uIENSNzQgKi8KKwkJY3RXcml0ZV9pIChDVF9DUl9PLCBpLCBjcltpXSk7CisJfQorCXRtcCA9IGN0UmVhZF9pIChDVF9DUl9PLCAweDQwKTsKKwl0bXAgJj0gMHgwZjsKKwl0bXAgfD0gMHg4MDsKKwljdFdyaXRlX2kgKENUX0NSX08sIDB4NDAsIHRtcCk7CS8qIFN0YXJ0QWRkcmVzc0VuYWJsZSAqLworfQorCisvKiBwaXhlbGNsb2NrIGNvbnRyb2wgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgV2UgaGF2ZSBhIHJhdGlvbmFsIG51bWJlciBwL3EgYW5kIG5lZWQgYW4gbS9uIHdoaWNoIGlzIHZlcnkgY2xvc2UgdG8gcC9xCisgYnV0IGhhcyBtIGFuZCBuIHdpdGhpbiBtbm1pbiBhbmQgbW5tYXguIFdlIGhhdmUgbm8gZmxvYXRpbmcgcG9pbnQgaW4gdGhlCisga2VybmVsLiBXZSBjYW4gdXNlIGxvbmcgbG9uZyB3aXRob3V0IGRpdmlkZS4gQW5kIHdlIGhhdmUgdGltZSB0byBjb21wdXRlLi4uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgaW50CitGaW5kQmVzdFBRRml0dGluZ01OICh1bnNpZ25lZCBpbnQgcCwgdW5zaWduZWQgaW50IHEsIHVuc2lnbmVkIGludCBtbm1pbiwKKwkJICAgICB1bnNpZ25lZCBpbnQgbW5tYXgsIHVuc2lnbmVkIGludCAqcG0sIHVuc2lnbmVkIGludCAqcG4pCit7CisJLyogdGhpcyBjb2RlIGlzIG5vdCBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWJsZSBidXQgZ29vZCBmb3Igb3VyIG51bWJlciByYW5nZXMgKi8KKwl1bnNpZ25lZCBpbnQgbiA9IG1ubWluLCBtID0gMDsKKwlsb25nIGxvbmcgaW50IEwgPSAwLCBQID0gcCwgUSA9IHEsIEggPSBQID4+IDE7CisJbG9uZyBsb25nIGludCBEID0gMHg3ZmZmZmZmZmZmZmZmZmZMTDsKKwlmb3IgKG4gPSBtbm1pbjsgbiA8PSBtbm1heDsgbisrKSB7CisJCW0gPSBtbm1pbjsJLyogcC9xIH4gbS9uIC0+IHAqbiB+IG0qcSAtPiBwKm4teCpxIH4gMCAqLworCQlMID0gUCAqIG4gLSBtICogUTsJLyogbiAqIHZjbyAtIG0gKiBmcmVmIHNob3VsZCBiZSBuZWFyIDAgKi8KKwkJd2hpbGUgKEwgPiAwICYmIG0gPCBtbm1heCkgeworCQkJTCAtPSBxOwkvKiBkaWZmZXJlbmNlIGlzIGdyZWF0ZXIgYXMgMCBzdWJ0cmFjdCBmcmVmICovCisJCQltKys7CS8qIGFuZCBpbmNyZW1lbnQgbSAqLworCQl9CisJCS8qIGRpZmZlcmVuY2UgaXMgbGVzcyBvciBlcXVhbCB0aGFuIDAgb3IgbSA+IG1heGltdW0gKi8KKwkJaWYgKG0gPiBtbm1heCkKKwkJCWJyZWFrOwkvKiBubyBzb2x1dGlvbjogaWYgd2UgaW5jcmVhc2UgbiB3ZSBnZXQgdGhlIHNhbWUgc2l0dWF0aW9uICovCisJCS8qIEwgaXMgPD0gMCBub3cgKi8KKwkJaWYgKC1MID4gSCAmJiBtID4gbW5taW4pIHsJLyogaWYgZGlmZmVyZW5jZSA+IHRoZSBoYWxmIGZyZWYgKi8KKwkJCUwgKz0gcTsJLyogd2UgdGFrZSB0aGUgc2l0dWF0aW9uIGJlZm9yZSAqLworCQkJbS0tOwkvKiBiZWNhdXNlIGl0cyBjbG9zZXIgdG8gMCAqLworCQl9CisJCUwgPSAoTCA8IDApID8gLUwgOiArTDsJLyogYWJzb2x1dGUgdmFsdWUgKi8KKwkJaWYgKEQgPCBMKQkvKiBpZiBsYXN0IGRpZmZlcmVuY2Ugd2FzIGJldHRlciB0YWtlIG5leHQgbiAqLworCQkJY29udGludWU7CisJCUQgPSBMOworCQkqcG0gPSBtOworCQkqcG4gPSBuOwkvKiAga2VlcCBpbXByb3ZlZCBkYXRhICovCisJCWlmIChEID09IDApCisJCQlicmVhazsJLyogYmVzdCByZXN1bHQgd2UgY2FuIGdldCAqLworCX0KKwlyZXR1cm4gKHVuc2lnbmVkIGludCkgKDB4ZmZmZmZmZmYgJiBEKTsKK30KKworLyogdGhhdCBpcyB0aGUgaGFyZHdhcmUgPCA2OTAwMCB3ZSBoYXZlIHRvIG1hbmFnZQorICstLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgKy0tKworIHwgUkVGQ0xLICB8X198TlRTQyBEaXZpc29yIFNlbGVjdHxfX3xGVkNPIFJlZmVyZW5jZSBEaXZpc29yfF9ffPdOfF9fCisgfCAxNC4zTUh6IHwgIHwoTlRTQ0RTKSAo9zEsIPc1KSAgfCAgfFNlbGVjdCAoUkRTKSAo9zEsIPc0KSB8ICB8ICB8ICB8CisgKy0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICArLS0rICB8CisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdmNvICAgICAgICAgICAgICAgICAgICAgIGZvdXQKKyB8ICstLS0tLS0tLSsgICstLS0tLS0tLS0tLS0rICArLS0tLS0rICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsgICArLS0tLSsKKyArLXwgUGhhc2UgIHxfX3xDaGFyZ2UgUHVtcCB8X198IFZDTyB8X19fX198UG9zdCBEaXZpc29yIChQRCkgIHxfX198Q0xLIHwtLS0+CisgKy18IERldGVjdCB8ICB8JiBGaWx0ZXIgVkNPfCAgfCAgICAgfCAgfCAgfPcxLCAyLCA0LCA4LCAxNiwgMzJ8ICAgfCAgICB8CisgfCArLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tKyAgKy0tLS0tKyAgfCAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rICAgKy0tLS0rCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgKy0tKyAgICstLS0tLS0tLS0tLS0tLS0rICAgICAgICAgIHwKKyB8X19fX3z3TXxfX198VkNPIExvb3AgRGl2aWRlfF9fX19fX19fX198CisgICAgICB8ICB8ICAgfChWTEQpKPc0LCD3MTYpIHwKKyAgICAgICstLSsgICArLS0tLS0tLS0tLS0tLS0tKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICB0aGF0IGlzIHRoZSBoYXJkd2FyZSA+PSA2OTAwMCB3ZSBoYXZlIHRvIG1hbmFnZQorICstLS0tLS0tLS0rICArLS0rCisgfCBSRUZDTEsgIHxfX3z3TnxfXworIHwgMTQuM01IeiB8ICB8ICB8ICB8CisgKy0tLS0tLS0tLSsgICstLSsgIHwKKyAgX19fX19fX19fX19fX19fX19ffAorIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnZjbyAgICAgICAgICAgICAgICAgICAgICBmb3V0CisgfCArLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tKyAgKy0tLS0tKyAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rICAgKy0tLS0rCisgKy18IFBoYXNlICB8X198Q2hhcmdlIFB1bXAgfF9ffCBWQ08gfF9fX19ffFBvc3QgRGl2aXNvciAoUEQpICB8X19ffENMSyB8LS0tPgorICstfCBEZXRlY3QgfCAgfCYgRmlsdGVyIFZDT3wgIHwgICAgIHwgIHwgIHz3MSwgMiwgNCwgOCwgMTYsIDMyfCAgIHwgICAgfAorIHwgKy0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLSsgICstLS0tLSsgIHwgICstLS0tLS0tLS0tLS0tLS0tLS0tKyAgICstLS0tKworIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICstLSsgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICB8CisgfF9fX1989018X19ffFZDTyBMb29wIERpdmlkZXxfX19fX19fX19ffAorICAgICAgfCAgfCAgIHwoVkxEKSj3MSwg9zQpICB8CisgICAgICArLS0rICAgKy0tLS0tLS0tLS0tLS0tLSsKKworCisqLworCisjZGVmaW5lIFZJREVPX0ZSRUYgMTQzMTgxODA7CS8qIEh6ICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorUmVhZFBpeENsY2tGcm9tWHJSZWdzQmFjayAoc3RydWN0IGN0ZmJfY2hpcHNfcHJvcGVydGllcyAqcGFyYW0pCit7CisJdW5zaWduZWQgaW50IG0sIG4sIHZsZCwgcGQsIFBELCBmcmVmLCB4cl9jYiwgaSwgcGl4Y2xvY2s7CisJaSA9IDA7CisJcGl4Y2xvY2sgPSAtMTsKKwlmcmVmID0gVklERU9fRlJFRjsKKwltID0gY3RSZWFkX2kgKENUX1hSX08sIDB4YzgpOworCW4gPSBjdFJlYWRfaSAoQ1RfWFJfTywgMHhjOSk7CisJbSAtPSBwYXJhbS0+bW5fZGlmZjsKKwluIC09IHBhcmFtLT5tbl9kaWZmOworCXhyX2NiID0gY3RSZWFkX2kgKENUX1hSX08sIDB4Y2IpOworCVBEID0gKDB4NzAgJiB4cl9jYikgPj4gNDsKKwlwZCA9IDE7CisJZm9yIChpID0gMDsgaSA8IFBEOyBpKyspIHsKKwkJcGQgKj0gMjsKKwl9CisJdmxkID0gKDB4MDQgJiB4cl9jYikgPyBwYXJhbS0+dmxkX3NldCA6IHBhcmFtLT52bGRfbm90X3NldDsKKwlpZiAobiAqIHZsZCAqIG0pIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHAgPSAxMDAwMDAwMDAwMDAwTEwgKiBwZCAqIG47CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBxID0gKGxvbmcgbG9uZykgZnJlZiAqIHZsZCAqIG07CisJCXdoaWxlICgocCA+IDB4ZmZmZmZmZmZMTCkgfHwgKHEgPiAweGZmZmZmZmZmTEwpKSB7CisJCQlwID4+PSAxOwkvKiBjYW4ndCBkaXZpZGUgd2l0aCBsb25nIGxvbmcgc28gd2Ugc2NhbGUgZG93biAqLworCQkJcSA+Pj0gMTsKKwkJfQorCQlwaXhjbG9jayA9ICh1bnNpZ25lZCkgcCAvICh1bnNpZ25lZCkgcTsKKwl9IGVsc2UKKwkJcHJpbnRmICgiSW52YWxpZCBkYXRhIGluIHhyIHJlZ3MuXG4iKTsKKwlyZXR1cm4gcGl4Y2xvY2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitGaW5kQW5kU2V0UGxsUGFyYW1JbnRvWHJSZWdzICh1bnNpZ25lZCBpbnQgcGl4ZWxjbG9jaywKKwkJCSAgICAgIHN0cnVjdCBjdGZiX2NoaXBzX3Byb3BlcnRpZXMgKnBhcmFtKQoreworCXVuc2lnbmVkIGludCBtLCBuLCB2bGQsIHBkLCBQRCwgZnJlZiwgeHJfY2I7CisJdW5zaWduZWQgaW50IGZ2Y29taW4sIGZ2Y29tYXgsIHBjbGNrbWluLCBwY2xja21heCwgcGNsazsKKwl1bnNpZ25lZCBpbnQgcGZyZXEsIGZ2Y28sIG5ld19waXhjbG9jazsKKworCWZyZWYgPSBWSURFT19GUkVGOworCXBkID0gMTsKKwlQRCA9IDA7CisJZnZjb21pbiA9IHBhcmFtLT52Y29fbWluOworCWZ2Y29tYXggPSBwYXJhbS0+dmNvX21heDsJLyogTUh6ICovCisJcGNsY2ttaW4gPSAxMDAwMDAwIC8gZnZjb21heCArIDE7CS8qICAgNDU0NiAqLworCXBjbGNrbWF4ID0gMzIwMDAwMDAgLyBmdmNvbWluIC0gMTsJLyogNjY2NjY1ICovCisJcGNsayA9IG1pbm1heCAocGNsY2ttaW4sIHBpeGVsY2xvY2ssIHBjbGNrbWF4KTsJLyogcHMgcHAgKi8KKwlwZnJlcSA9IDI1MCAqICg0MDAwMDAwMDAwVSAvIHBjbGspOworCWZ2Y28gPSBwZnJlcTsJCS8qIEh6ICovCisJbmV3X3BpeGNsb2NrID0gMDsKKwl3aGlsZSAoZnZjbyA8IGZ2Y29taW4gKiAxMDAwMDAwKSB7CisJCS8qIGRvdWJsZSBWQ08gc3RhcnRpbmcgd2l0aCB0aGUgcGl4ZWxjbG9jayBmcmVxdWVuY3kKKwkJICogYXMgbG9uZyBhcyBpdCBpcyBsb3dlciB0aGFuIHRoZSBtaW5pbWFsIFZDTyBmcmVxdWVuY3kgKi8KKwkJZnZjbyAqPSAyOworCQlwZCAqPSAyOworCQlQRCsrOworCX0KKwkvKiBmdmNvIGlzIGV4YWN0bHkgcGQgKiBwaXhlbGNsb2NrIGFuZCBoaWdoZXIgdGhhbiB0aGUgbmlubWFsIFZDTyBmcmVxdWVuY3kgKi8KKwl2bGQgPSAocGFyYW0tPnZsZF9zZXQgPiBwYXJhbS0+dmxkX25vdF9zZXQpID8KKwkgICAgcGFyYW0tPnZsZF9ub3Rfc2V0IDogcGFyYW0tPnZsZF9zZXQ7CisJLyogc3RhcnQgd2l0aCBsb3dlciBWTEQgKGhpZ2hlciBWTEQgaXMgTk9UIHlldCBpbXBsZW1lbnRlZCAqLworCUZpbmRCZXN0UFFGaXR0aW5nTU4gKGZ2Y28gLyB2bGQsIGZyZWYsIHBhcmFtLT5tbl9taW4sIHBhcmFtLT5tbl9tYXgsICZtLCAmbik7CS8qIHJkcyA9IDEgKi8KKwltICs9IHBhcmFtLT5tbl9kaWZmOworCW4gKz0gcGFyYW0tPm1uX2RpZmY7CisJUFJJTlRGICgiVkNPICVkLCBwZCAlZCwgbSAlZCBuICVkIHZsZCAlZCBcbiIsIGZ2Y28sIHBkLCBtLCBuLCB2bGQpOworCXhyX2NiID0gKCgweDcgJiBQRCkgPDwgNCkgfCAodmxkID09IHBhcmFtLT52bGRfc2V0ID8gMHgwNCA6IDApOworCS8qIEFsbCBmb3VyIG9mIHRoZSByZWdpc3RlcnMgdXNlZCBmb3IgZG90IGNsb2NrIDIgKFhSQzggLSBYUkNCKSBtdXN0IGJlCisJICogd3JpdHRlbiwgYW5kIGluIG9yZGVyIGZyb20gWFJDOCB0byBYUkNCLCBiZWZvcmUgdGhlIGhhcmR3YXJlIHdpbGwKKwkgKiB1cGRhdGUgdGhlIHN5bnRoZXNpemVyIHMgc2V0dGluZ3MuCisJICovCisJY3RXcml0ZV9pIChDVF9YUl9PLCAweGM4LCBtKTsKKwljdFdyaXRlX2kgKENUX1hSX08sIDB4YzksIG4pOwkvKiB4cmNhIGRvZXMgbm90IGV4aXN0IGluIENUNjkwMDAgYW5kIENUNjkwMzAgKi8KKwljdFdyaXRlX2kgKENUX1hSX08sIDB4Y2EsIDApOwkvKiBiZWNhdXNlIG9mIGEgaHcgYnVnIEkgZ3Vlc3MsIGJ1dCB3ZSB3cml0ZSAqLworCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHhjYiwgeHJfY2IpOwkvKiAwIHRvIGl0IGZvciBzYXZldHkgKi8KKwluZXdfcGl4Y2xvY2sgPSBSZWFkUGl4Q2xja0Zyb21YclJlZ3NCYWNrIChwYXJhbSk7CisJUFJJTlRGICgicGl4ZWxjbG9jay5zZXQgPSAlZCwgcGl4ZWxjbG9jay5yZWFsID0gJWQgXG4iLAorCQlwaXhlbGNsb2NrLCBuZXdfcGl4Y2xvY2spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorU2V0TXNyUmVncyAoc3RydWN0IGN0ZmJfcmVzX21vZGVzICptb2RlKQoreworCXVuc2lnbmVkIGNoYXIgaF9zeW5jaF9oaWdoLCB2X3N5bmNoX2hpZ2g7CisKKwloX3N5bmNoX2hpZ2ggPSAobW9kZS0+c3luYyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUKSA/IDAgOiAweDQwOwkvKiBob3Jpem9udGFsIFN5bmNoIEhpZ2ggYWN0aXZlICovCisJdl9zeW5jaF9oaWdoID0gKG1vZGUtPnN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpID8gMCA6IDB4ODA7CS8qIHZlcnRpY2FsIFN5bmNoIEhpZ2ggYWN0aXZlICovCisJY3RXcml0ZSAoQ1RfTVNSX1dfTywgKGhfc3luY2hfaGlnaCB8IHZfc3luY2hfaGlnaCB8IDB4MjkpKTsKKwkvKiB1cHBlcjY0Sz09MHgyMCwgQ0xDMnNlbGVjdD09MHgwOCwgUkFNZW5hYmxlPT0weDAyISh0b2RvKSwgQ0dBPT0weDAxCisJICogU2VsZWN0cyB0aGUgdXBwZXIgNjRLQiBwYWdlLkJpdDU9MQorCSAqIENMSzIgKGxlZnQgcmVzZXJ2ZWQgaW4gc3RhbmRhcmQgVkdBKSBCaXQzfDI9MXwwCisJICogRGlzYWJsZXMgQ1BVIGFjY2VzcyB0byBmcmFtZSBidWZmZXIuIEJpdDE9MAorCSAqIFNldHMgdGhlIEkvTyBhZGRyZXNzIGRlY29kZSBmb3IgU1QwMSwgRkNSLCBhbmQgYWxsIENSIHJlZ2lzdGVycworCSAqIHRvIHRoZSAzRHggSS9PIGFkZHJlc3MgcmFuZ2UgKENHQSBlbXVsYXRpb24pLiBCaXQwPTEKKwkgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBWR0FfRFVNUF9SRUcKKworc3RhdGljIHZvaWQKK2N0RGlzcFJlZ3MgKHVuc2lnbmVkIHNob3J0IGluZGV4LCBpbnQgZnJvbSwgaW50IHRvKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCWludCBpOworCisJZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyspIHsKKwkJc3RhdHVzID0gY3RSZWFkX2kgKGluZGV4LCBpKTsKKwkJcHJpbnRmICgiJTAyWDogaXMgJTAyWFxuIiwgaSwgc3RhdHVzKTsKKwl9Cit9CisKK3ZvaWQKK3ZpZGVvX2R1bXBfcmVnICh2b2lkKQoreworCWludCBpOworCisJcHJpbnRmICgiRXh0ZW5kZWQgUmVnczpcbiIpOworCWN0RGlzcFJlZ3MgKENUX1hSX08sIDAsIDB4Qyk7CisJY3REaXNwUmVncyAoQ1RfWFJfTywgMHhlLCAweGYpOworCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4MjAsIDB4MjEpOworCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4NDAsIDB4NTApOworCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4NjAsIDB4NjQpOworCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4NjcsIDB4NjgpOworCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4NzAsIDB4NzIpOworCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4ODAsIDB4ODMpOworCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4QTAsIDB4QjApOworCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4QzAsIDB4RDMpOworCXByaW50ZiAoIlNlcXVlbmNlciBSZWdzOlxuIik7CisJY3REaXNwUmVncyAoQ1RfU1JfTywgMCwgMHg4KTsKKwlwcmludGYgKCJHcmFwaGljIFJlZ3M6XG4iKTsKKwljdERpc3BSZWdzIChDVF9HUl9PLCAwLCAweDkpOworCXByaW50ZiAoIkNSVCBSZWdzOlxuIik7CisJY3REaXNwUmVncyAoQ1RfQ1JfTywgMCwgMHgxOSk7CisJY3REaXNwUmVncyAoQ1RfQ1JfTywgMHgyMiwgMHgyMyk7CisJY3REaXNwUmVncyAoQ1RfQ1JfTywgMHgzMCwgMHgzNCk7CisJY3REaXNwUmVncyAoQ1RfQ1JfTywgMHgzOCwgMHgzOSk7CisJY3REaXNwUmVncyAoQ1RfQ1JfTywgMHgzQywgMHgzRCk7CisJY3REaXNwUmVncyAoQ1RfQ1JfTywgMHg0MCwgMHg0Mik7CisJY3REaXNwUmVncyAoQ1RfQ1JfTywgMHg3MCwgMHg4MCk7CisJLyogZG9uJ3QgZGlzcGxheSB0aGUgYXR0cmlidXRlcyAqLworfQorCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19WSURFT19IV19DVVJTT1IKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldCBIYXJkd2FyZSBDdXJzb3IgaW4gUGl4ZWwKKyAqLwordm9pZAordmlkZW9fc2V0X2h3X2N1cnNvciAoaW50IHgsIGludCB5KQoreworCWludCBzaWdfeCA9IDAsIHNpZ195ID0gMDsKKwlpZiAoeCA8IDApIHsKKwkJeCAqPSAtMTsKKwkJc2lnX3ggPSAxOworCX0KKwlpZiAoeSA8IDApIHsKKwkJeSAqPSAtMTsKKwkJc2lnX3kgPSAxOworCX0KKwljdFdyaXRlX2kgKENUX1hSX08sIDB4YTQsIHggJiAweGZmKTsKKwljdFdyaXRlX2kgKENUX1hSX08sIDB4YTUsICh4ID4+IDgpICYgMHg3KTsKKwljdFdyaXRlX2kgKENUX1hSX08sIDB4YTYsIHkgJiAweGZmKTsKKwljdFdyaXRlX2kgKENUX1hSX08sIDB4YTcsICh5ID4+IDgpICYgMHg3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdCBIYXJkd2FyZSBDdXJzb3IuIFRvIGtub3cgdGhlIHNpemUgb2YgdGhlIEN1cnNvciwKKyAqIHdlIGhhdmUgdG8ga25vdyB0aGUgRm9udCBzaXplLgorICovCit2b2lkCit2aWRlb19pbml0X2h3X2N1cnNvciAoaW50IGZvbnRfd2lkdGgsIGludCBmb250X2hlaWdodCkKK3sKKwl1bnNpZ25lZCBjaGFyIHhyXzgwOworCXVuc2lnbmVkIGxvbmcgKmN1cnMsIHBhdHRlcm47CisJaW50IGk7CisJaW50IGN1cnNvcl9zdGFydDsKKwlHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSAmIGN0ZmI7CisKKwljdXJzb3Jfc3RhcnQgPSBwR0QtPmRwckJhc2U7CisJeHJfODAgPSBjdFJlYWRfaSAoQ1RfWFJfTywgMHg4MCk7CisJLyogc2V0IHN0YXJ0IGFkZHJlc3MgKi8KKwljdFdyaXRlX2kgKENUX1hSX08sIDB4YTIsIChjdXJzb3Jfc3RhcnQgPj4gOCkgJiAweGYwKTsKKwljdFdyaXRlX2kgKENUX1hSX08sIDB4YTMsIChjdXJzb3Jfc3RhcnQgPj4gMTYpICYgMHgzZik7CisJLyogc2V0IGN1cnNvciBzaGFwZSAqLworCWN1cnMgPSAodW5zaWduZWQgbG9uZyAqKSBjdXJzb3Jfc3RhcnQ7CisJaSA9IDA7CisJd2hpbGUgKGkgPCAweDQwMCkgeworCQljdXJzW2krK10gPSAweGZmZmZmZmZmOwkvKiBBTkQgbWFzayAqLworCQljdXJzW2krK10gPSAweGZmZmZmZmZmOwkvKiBBTkQgbWFzayAqLworCQljdXJzW2krK10gPSAwOwkvKiBYT1IgbWFzayAqLworCQljdXJzW2krK10gPSAwOwkvKiBYT1IgbWFzayAqLworCQkvKiBUcmFuc3BhcmVudCAqLworCX0KKwlwYXR0ZXJuID0gMHhmZmZmZmZmZiA+PiBmb250X3dpZHRoOworCWkgPSAwOworCXdoaWxlIChpIDwgKGZvbnRfaGVpZ2h0ICogMikpIHsKKwkJY3Vyc1tpKytdID0gcGF0dGVybjsJLyogQU5EIG1hc2sgKi8KKwkJY3Vyc1tpKytdID0gcGF0dGVybjsJLyogQU5EIG1hc2sgKi8KKwkJY3Vyc1tpKytdID0gMDsJLyogWE9SIG1hc2sgKi8KKwkJY3Vyc1tpKytdID0gMDsJLyogWE9SIG1hc2sgKi8KKwkJLyogQ3Vyc29yIENvbG9yIDAgKi8KKwl9CisJLyogc2V0IGJsaW5rIHJhdGUgKi8KKwljdFdyaXRlX2kgKENUX0ZQX08sIDB4MTksIDB4Zik7CisKKwkvKiBzZXQgY3Vyc29ycyBjb2xvcnMgKi8KKwl4cl84MCA9IGN0UmVhZF9pIChDVF9YUl9PLCAweDgwKTsKKwl4cl84MCB8PSAweDE7CQkvKiBhbHRlcm5hdGUgcGFsZXR0ZSBzZWxlY3QgKi8KKwljdFdyaXRlX2kgKENUX1hSX08sIDB4ODAsIHhyXzgwKTsKKwl2aWRlb19zZXRfbHV0ICg0LCBDT05TT0xFX0ZHX0NPTCwgQ09OU09MRV9GR19DT0wsIENPTlNPTEVfRkdfQ09MKTsKKwkvKiBwb3NpdGlvbiA0IGlzIGNvbG9yIDAgY3Vyc29yIDAgKi8KKwl4cl84MCAmPSAweGZlOwkJLyogbm9ybWFsIHBhbGV0dGUgc2VsZWN0ICovCisJY3RXcml0ZV9pIChDVF9YUl9PLCAweDgwLCB4cl84MCk7CisJLyogY3Vyc29yIGVuYWJsZSAqLworCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHhhMCwgMHg5MSk7CisJeHJfODAgfD0gMHgxMDsJCS8qIGVuYWJsZSBod2N1cnNvciAqLworCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHg4MCwgeHJfODApOworCXZpZGVvX3NldF9od19jdXJzb3IgKDAsIDApOworfQorI2VuZGlmCQkJCS8qIENPTkZJR19WSURFT19IV19DVVJTT1IgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV2FpdCBmb3IgQml0Qmx0IHJlYWR5CisgKi8KK3N0YXRpYyBpbnQKK3ZpZGVvX3dhaXRfYml0Ymx0ICh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBicjA0OworCWludCBpID0gMDsKKwlicjA0ID0gaW4zMnIgKGFkZHIpOworCXdoaWxlIChicjA0ICYgMHg4MDAwMDAwMCkgeworCQl1ZGVsYXkgKDEpOworCQlicjA0ID0gaW4zMnIgKGFkZHIpOworCQlpZiAoaSsrID4gMTAwMDAwMCkgeworCQkJcHJpbnRmICgiRVJST1IgVGltZW91dCAlbHhcbiIsIGJyMDQpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldCB1cCBCaXRCbHQgUmVnaXN0cnMKKyAqLworc3RhdGljIHZvaWQKK1NldERyYXdpbmdFbmdpbmUgKGludCBiaXRzX3Blcl9waXhlbCkKK3sKKwl1bnNpZ25lZCBsb25nIGJyMDQsIGJyMDA7CisJdW5zaWduZWQgY2hhciB0bXA7CisKKwlHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSAmIGN0ZmI7CisKKwl0bXAgPSBjdFJlYWRfaSAoQ1RfWFJfTywgMHgyMCk7CS8qIEJpdEJMVCBDb25maWd1cmF0aW9uICovCisJdG1wIHw9IDB4MDI7CQkvKiByZXNldCBCaXRCTFQgKi8KKwljdFdyaXRlX2kgKENUX1hSX08sIDB4MjAsIHRtcCk7CS8qIEJpdEJMVCBDb25maWd1cmF0aW9uICovCisJdWRlbGF5ICgxMCk7CisJdG1wICY9IDB4ZmQ7CQkvKiByZWxlYXNlIHJlc2V0IEJpdEJMVCAqLworCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHgyMCwgdG1wKTsJLyogQml0QkxUIENvbmZpZ3VyYXRpb24gKi8KKwl2aWRlb193YWl0X2JpdGJsdCAocEdELT5wY2lCYXNlICsgQlIwNF9vKTsKKworCS8qIHNldCBwYXR0ZXJuIEFkZHJlc3MgKi8KKwlvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDVfbywgUEFUVEVSTl9BRFIgJiAweDAwM2ZmZmY4KTsKKwlicjA0ID0gMDsKKwlpZiAoYml0c19wZXJfcGl4ZWwgPT0gMSkgeworCQlicjA0IHw9IDB4MDAwNDAwMDA7CS8qIG1vbm9jaG9tZSBQYXR0ZXJuICovCisJCWJyMDQgfD0gMHgwMDAwMTAwMDsJLyogbW9ub2Nob21lIHNvdXJjZSAqLworCX0KKwlicjAwID0gKChwR0QtPndpblNpemVYICogcEdELT5nZGZCeXRlc1BQKSA8PCAxNikgKyAocEdELT53aW5TaXplWCAqIHBHRC0+Z2RmQnl0ZXNQUCk7CS8qIGJ5dGVzIHBlciBzY2FubGluZSAqLworCW91dDMyciAocEdELT5wY2lCYXNlICsgQlIwMF9vLCBicjAwKTsJLyogKi8KKwlvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDhfbywgKDEwIDw8IDE2KSArIDEwKTsJLyogZHVtbXkgKi8KKwlvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDRfbywgYnIwNCk7CS8qIHdyaXRlIGFsbCAwICovCisJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA3X28sIDApOwkvKiBkZXN0aW5hdGlvbiAqLworCXZpZGVvX3dhaXRfYml0Ymx0IChwR0QtPnBjaUJhc2UgKyBCUjA0X28pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZXQgUGFyYW1ldGVycyBmb3IgdGhlIHZpZGVvIG1vZGU6CisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJldHVybnMgdGhlIGxlbmd0aCB0byB0aGUgbmV4dCBzZXBlcmF0b3IKKyAqLworc3RhdGljIGludAordmlkZW9fZ2V0X3BhcmFtX2xlbiAoY2hhciAqc3RhcnQsIGNoYXIgc2VwKQoreworCWludCBpID0gMDsKKwl3aGlsZSAoKCpzdGFydCAhPSAwKSAmJiAoKnN0YXJ0ICE9IHNlcCkpIHsKKwkJc3RhcnQrKzsKKwkJaSsrOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludAordmlkZW9fc2VhcmNoX3BhcmFtIChjaGFyICpzdGFydCwgY2hhciAqcGFyYW0pCit7CisJaW50IGxlbiwgdG90YWxsZW4sIGk7CisJY2hhciAqcCA9IHN0YXJ0OworCWxlbiA9IHN0cmxlbiAocGFyYW0pOworCXRvdGFsbGVuID0gbGVuICsgc3RybGVuIChzdGFydCk7CisJZm9yIChpID0gMDsgaSA8IHRvdGFsbGVuOyBpKyspIHsKKwkJaWYgKHN0cm5jbXAgKHArKywgcGFyYW0sIGxlbikgPT0gMCkKKwkJCXJldHVybiAoaSk7CisJfQorCXJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBHZXQgcGFyYW1ldGVyIHZpYSB0aGUgZW52aXJvbm1lbnQgYXMgaXQgaXMgZG9uZSBmb3IgdGhlCisqIGxpbnV4IGtlcm5lbCBpLmU6CisqIHZpZGVvPWN0ZmI6eDo4MDAseHY6MTI4MCx5OjYwMCx5djoxMDI0LGRlcHRoOjE2LG1vZGU6MCxwY2xrOjI1MDAwLAorKiAgICAgICBsZTo1NixyaTo0OCx1cDoyNixsbzo1LGhzOjE1Mix2czoyLHN5bmM6MCx2bW9kZTowLGFjY2VsOjAKKyoKKyogcGVudiBpcyBhIHBvaW50ZXIgdG8gdGhlIGVudmlyb25tZW50LCBjb250YWluaW5nIHRoZSBzdHJpbmcsIG9yIHRoZSBuYW1lIG9mCisqIGFub3RoZXIgZW52aXJvbm1lbnQgdmFyaWFibGUuIEl0IGNvdWxkIGV2ZW4gYmUgdGhlIHRlcm0gImJvb3RhcmdzIgorKi8KKworI2RlZmluZSBHRVRfT1BUSU9OKG5hbWUsdmFyKSAJCQkJXAorCQlpZihzdHJuY21wKHAsbmFtZSxzdHJsZW4obmFtZSkpPT0wKSB7IAlcCisJCQl2YWxfcz1wK3N0cmxlbihuYW1lKTsgCQlcCisJCQl2YXI9c2ltcGxlX3N0cnRvdWwodmFsX3MsIE5VTEwsIDEwKTsgXAorCQl9CisKK3N0YXRpYyBpbnQKK3ZpZGVvX2dldF9wYXJhbXMgKHN0cnVjdCBjdGZiX3Jlc19tb2RlcyAqcFBhciwgY2hhciAqcGVudikKK3sKKwljaGFyICpwLCAqcywgKnZhbF9zOworCWludCBpID0gMCwgdDsKKwlpbnQgYnBwOworCWludCBtb2RlOworCS8qIGZpcnN0IHNlYXJjaCBmb3IgdGhlIGVudmlyb25tZW50IGNvbnRhaW5pbmcgdGhlIHJlYWwgcGFyYW0gc3RyaW5nICovCisJcyA9IHBlbnY7CisJaWYgKChwID0gZ2V0ZW52IChzKSkgIT0gTlVMTCkgeworCQlzID0gcDsKKwl9CisJLyogaW4gY2FzZSBvZiB0aGUgYm9vdGFyZ3MgbGluZSwgd2UgaGF2ZSB0byBzdGFydAorCSAqIGFmdGVyICJ2aWRlbz1jdGZiOiIKKwkgKi8KKwlpID0gdmlkZW9fc2VhcmNoX3BhcmFtIChzLCAidmlkZW89Y3RmYjoiKTsKKwlpZiAoaSA+PSAwKSB7CisJCXMgKz0gaTsKKwkJcyArPSBzdHJsZW4gKCJ2aWRlbz1jdGZiOiIpOworCX0KKwkvKiBzZWFyY2ggZm9yIG1vZGUgYXMgYSBkZWZhdWx0IHZhbHVlICovCisJcCA9IHM7CisJdCA9IDA7CisJbW9kZSA9IDA7CQkvKiBkZWZhdWx0ICovCisJd2hpbGUgKChpID0gdmlkZW9fZ2V0X3BhcmFtX2xlbiAocCwgJywnKSkgIT0gMCkgeworCQlHRVRfT1BUSU9OICgibW9kZToiLCBtb2RlKQorCQkgICAgcCArPSBpOworCQlpZiAoKnAgIT0gMCkKKwkJCXArKzsJLyogc2tpcCAnLCcgKi8KKwl9CisJaWYgKG1vZGUgPj0gUkVTX01PREVTX0NPVU5UKQorCQltb2RlID0gMDsKKwkqcFBhciA9IHJlc19tb2RlX2luaXRbbW9kZV07CS8qIGNvcHkgZGVmYXVsdCB2YWx1ZXMgKi8KKwlicHAgPSAyNCAtICgobW9kZSAlIDMpICogOCk7CisJcCA9IHM7CQkJLyogcmVzdGFydCAqLworCXdoaWxlICgoaSA9IHZpZGVvX2dldF9wYXJhbV9sZW4gKHAsICcsJykpICE9IDApIHsKKwkJR0VUX09QVElPTiAoIng6IiwgcFBhci0+eHJlcykKKwkJICAgIEdFVF9PUFRJT04gKCJ5OiIsIHBQYXItPnlyZXMpCisJCSAgICBHRVRfT1BUSU9OICgibGU6IiwgcFBhci0+bGVmdF9tYXJnaW4pCisJCSAgICBHRVRfT1BUSU9OICgicmk6IiwgcFBhci0+cmlnaHRfbWFyZ2luKQorCQkgICAgR0VUX09QVElPTiAoInVwOiIsIHBQYXItPnVwcGVyX21hcmdpbikKKwkJICAgIEdFVF9PUFRJT04gKCJsbzoiLCBwUGFyLT5sb3dlcl9tYXJnaW4pCisJCSAgICBHRVRfT1BUSU9OICgiaHM6IiwgcFBhci0+aHN5bmNfbGVuKQorCQkgICAgR0VUX09QVElPTiAoInZzOiIsIHBQYXItPnZzeW5jX2xlbikKKwkJICAgIEdFVF9PUFRJT04gKCJzeW5jOiIsIHBQYXItPnN5bmMpCisJCSAgICBHRVRfT1BUSU9OICgidm1vZGU6IiwgcFBhci0+dm1vZGUpCisJCSAgICBHRVRfT1BUSU9OICgicGNsazoiLCBwUGFyLT5waXhjbG9jaykKKwkJICAgIEdFVF9PUFRJT04gKCJkZXB0aDoiLCBicHApCisJCSAgICBwICs9IGk7CisJCWlmICgqcCAhPSAwKQorCQkJcCsrOwkvKiBza2lwICcsJyAqLworCX0KKwlyZXR1cm4gYnBwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBzdXBwb3J0ZWQgVmlkZW8gQ2hpcHMKKyovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3VwcG9ydGVkW10gPSB7CisJe1BDSV9WRU5ET1JfSURfQ1QsIFBDSV9ERVZJQ0VfSURfQ1RfNjkwMDB9LAorCXt9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBJbml0IHZpZGVvIGNoaXAKKyovCit2b2lkICoKK3ZpZGVvX2h3X2luaXQgKHZvaWQpCit7CisJR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikgJiBjdGZiOworCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZDsKKwlwY2lfZGV2X3QgZGV2YnVzZm47CisJaW50IHZpZGVvbW9kZTsKKwl1bnNpZ25lZCBsb25nIHQxLCBoc3luY2gsIHZzeW5jaDsKKwl1bnNpZ25lZCBpbnQgcGNpX21lbV9iYXNlLCAqdm07CisJaW50IHRtcCwgaSwgYml0c19wZXJfcGl4ZWw7CisJY2hhciAqcGVudjsKKwlzdHJ1Y3QgY3RmYl9yZXNfbW9kZXMgKnJlc19tb2RlOworCXN0cnVjdCBjdGZiX3Jlc19tb2RlcyB2YXJfbW9kZTsKKwlzdHJ1Y3QgY3RmYl9jaGlwc19wcm9wZXJ0aWVzICpjaGlwc19wYXJhbTsKKwkvKiBTZWFyY2ggZm9yIHZpZGVvIGNoaXAgKi8KKworCWlmICgoZGV2YnVzZm4gPSBwY2lfZmluZF9kZXZpY2VzIChzdXBwb3J0ZWQsIDApKSA8IDApIHsKKyNpZmRlZiBDT05GSUdfVklERU9fT05CT0FSRAorCQlwcmludGYgKCJWaWRlbzogQ29udHJvbGxlciBub3QgZm91bmQgIVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKiBQQ0kgc2V0dXAgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkIChkZXZidXNmbiwgUENJX0NPTU1BTkQsCisJCQkJKFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX0lPKSk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQgKGRldmJ1c2ZuLCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlX2lkKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKGRldmJ1c2ZuLCBQQ0lfQkFTRV9BRERSRVNTXzAsICZwY2lfbWVtX2Jhc2UpOworCXBjaV9tZW1fYmFzZSA9IHBjaV9tZW1fdG9fcGh5cyAoZGV2YnVzZm4sIHBjaV9tZW1fYmFzZSk7CisKKwkvKiBnZXQgY2hpcHMgcGFyYW1zICovCisJZm9yIChjaGlwc19wYXJhbSA9IChzdHJ1Y3QgY3RmYl9jaGlwc19wcm9wZXJ0aWVzICopICZjaGlwc1swXTsKKwkgICAgIGNoaXBzX3BhcmFtLT5kZXZpY2VfaWQgIT0gMDsgY2hpcHNfcGFyYW0rKykgeworCQlpZiAoY2hpcHNfcGFyYW0tPmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwl9CisJaWYgKGNoaXBzX3BhcmFtLT5kZXZpY2VfaWQgPT0gMCkgeworI2lmZGVmIENPTkZJR19WSURFT19PTkJPQVJECisJCXByaW50ZiAoIlZpZGVvOiBjb250cm9sbGVyIDB4JVggbm90IHN1cHBvcnRlZFxuIiwgZGV2aWNlX2lkKTsKKyNlbmRpZgorCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogc3VwcG9ydGVkIFZpZGVvIGNvbnRyb2xsZXIgZm91bmQgKi8KKwlwcmludGYgKCJWaWRlbzogIik7CisKKwl0bXAgPSAwOworCXZpZGVvbW9kZSA9IDB4MzAxOworCS8qIGdldCB2aWRlbyBtb2RlIHZpYSBlbnZpcm9ubWVudCAqLworCWlmICgocGVudiA9IGdldGVudiAoInZpZGVvbW9kZSIpKSAhPSBOVUxMKSB7CisJCS8qIGRlY2VpZGUgaWYgaXQgaXMgYSBzdHJpbmcgKi8KKwkJaWYgKHBlbnZbMF0gPD0gJzknKSB7CisJCQl2aWRlb21vZGUgPSAoaW50KSBzaW1wbGVfc3RydG91bCAocGVudiwgTlVMTCwgMTYpOworCQkJdG1wID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXRtcCA9IDE7CisJfQorCWlmICh0bXApIHsKKwkJLyogcGFyYW1ldGVyIGFyZSB2ZXNhIG1vZGVzICovCisJCS8qIHNlYXJjaCBwYXJhbXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IFZFU0FfTU9ERVNfQ09VTlQ7IGkrKykgeworCQkJaWYgKHZlc2FfbW9kZXNbaV0udmVzYW5yID09IHZpZGVvbW9kZSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSBWRVNBX01PREVTX0NPVU5UKSB7CisJCQlwcmludGYgKCJubyBWRVNBIE1vZGUgZm91bmQsIHN3aXRjaGluZyB0byBtb2RlIDB4MzAxICIpOworCQkJaSA9IDA7CisJCX0KKwkJcmVzX21vZGUgPQorCQkgICAgKHN0cnVjdCBjdGZiX3Jlc19tb2RlcyAqKSAmcmVzX21vZGVfaW5pdFt2ZXNhX21vZGVzW2ldLgorCQkJCQkJCSAgICAgcmVzaW5kZXhdOworCQliaXRzX3Blcl9waXhlbCA9IHZlc2FfbW9kZXNbaV0uYml0c19wZXJfcGl4ZWw7CisJfSBlbHNlIHsKKworCQlyZXNfbW9kZSA9IChzdHJ1Y3QgY3RmYl9yZXNfbW9kZXMgKikgJnZhcl9tb2RlOworCQliaXRzX3Blcl9waXhlbCA9IHZpZGVvX2dldF9wYXJhbXMgKHJlc19tb2RlLCBwZW52KTsKKwl9CisKKwkvKiBjYWxjdWxhdGUgYXZhaWxhYmxlIGNvbG9yIGRlcHRoIGZvciBjb250cm9sbGVyIG1lbW9yeSAqLworCWlmIChiaXRzX3Blcl9waXhlbCA9PSAxNSkKKwkJdG1wID0gMjsKKwllbHNlCisJCXRtcCA9IGJpdHNfcGVyX3BpeGVsID4+IDM7CS8qIC84ICovCisJaWYgKCgoY2hpcHNfcGFyYW0tPm1heF9tZW0gLQorCSAgICAgIEFDQ0VMTUVNT1JZKSAvIChyZXNfbW9kZS0+eHJlcyAqIHJlc19tb2RlLT55cmVzKSkgPCB0bXApIHsKKwkJdG1wID0KKwkJICAgICgoY2hpcHNfcGFyYW0tPm1heF9tZW0gLQorCQkgICAgICBBQ0NFTE1FTU9SWSkgLyAocmVzX21vZGUtPnhyZXMgKiByZXNfbW9kZS0+eXJlcykpOworCQlpZiAodG1wID09IDApIHsKKwkJCXByaW50ZgorCQkJICAgICgiTm8gbWF0Y2hpbmcgdmlkZW9tb2RlIGZvdW5kIC4tPiByZWR1Y2UgcmVzb2x1dGlvblxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZiAoIlN3aXRjaGluZyBiYWNrIHRvICVkIEJpdHMgcGVyIFBpeGVsICIsCisJCQkJdG1wIDw8IDMpOworCQkJYml0c19wZXJfcGl4ZWwgPSB0bXAgPDwgMzsKKwkJfQorCX0KKworCS8qIGNhbGN1bGF0ZSBoc3luY2ggYW5kIHZzeW5jaCBmcmVxIChpbmZvIG9ubHkpICovCisJdDEgPSAocmVzX21vZGUtPmxlZnRfbWFyZ2luICsgcmVzX21vZGUtPnhyZXMgKworCSAgICAgIHJlc19tb2RlLT5yaWdodF9tYXJnaW4gKyByZXNfbW9kZS0+aHN5bmNfbGVuKSAvIDg7CisJdDEgKj0gODsKKwl0MSAqPSByZXNfbW9kZS0+cGl4Y2xvY2s7CisJdDEgLz0gMTAwMDsKKwloc3luY2ggPSAxMDAwMDAwMDAwTCAvIHQxOworCXQxICo9CisJICAgIChyZXNfbW9kZS0+dXBwZXJfbWFyZ2luICsgcmVzX21vZGUtPnlyZXMgKworCSAgICAgcmVzX21vZGUtPmxvd2VyX21hcmdpbiArIHJlc19tb2RlLT52c3luY19sZW4pOworCXQxIC89IDEwMDA7CisJdnN5bmNoID0gMTAwMDAwMDAwMEwgLyB0MTsKKworCS8qIGZpbGwgaW4gR3JhcGhpYyBkZXZpY2Ugc3RydWN0ICovCisJc3ByaW50ZiAocEdELT5tb2RlSWRlbnQsICIlZHglZHglZCAlbGRrSHogJWxkSHoiLCByZXNfbW9kZS0+eHJlcywKKwkJIHJlc19tb2RlLT55cmVzLCBiaXRzX3Blcl9waXhlbCwgKGhzeW5jaCAvIDEwMDApLAorCQkgKHZzeW5jaCAvIDEwMDApKTsKKwlwcmludGYgKCIlc1xuIiwgcEdELT5tb2RlSWRlbnQpOworCXBHRC0+d2luU2l6ZVggPSByZXNfbW9kZS0+eHJlczsKKwlwR0QtPndpblNpemVZID0gcmVzX21vZGUtPnlyZXM7CisJcEdELT5wbG5TaXplWCA9IHJlc19tb2RlLT54cmVzOworCXBHRC0+cGxuU2l6ZVkgPSByZXNfbW9kZS0+eXJlczsKKwlzd2l0Y2ggKGJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA4OgorCQlwR0QtPmdkZkJ5dGVzUFAgPSAxOworCQlwR0QtPmdkZkluZGV4ID0gR0RGX184QklUX0lOREVYOworCQlicmVhazsKKwljYXNlIDE1OgorCQlwR0QtPmdkZkJ5dGVzUFAgPSAyOworCQlwR0QtPmdkZkluZGV4ID0gR0RGXzE1QklUXzU1NVJHQjsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJcEdELT5nZGZCeXRlc1BQID0gMjsKKwkJcEdELT5nZGZJbmRleCA9IEdERl8xNkJJVF81NjVSR0I7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXBHRC0+Z2RmQnl0ZXNQUCA9IDM7CisJCXBHRC0+Z2RmSW5kZXggPSBHREZfMjRCSVRfODg4UkdCOworCQlicmVhazsKKwl9CisJcEdELT5pc2FCYXNlID0gQ0ZHX0lTQV9JT19CQVNFX0FERFJFU1M7CisJcEdELT5wY2lCYXNlID0gcGNpX21lbV9iYXNlOworCXBHRC0+ZnJhbWVBZHJzID0gcGNpX21lbV9iYXNlOworCXBHRC0+bWVtU2l6ZSA9IGNoaXBzX3BhcmFtLT5tYXhfbWVtOworCS8qIEN1cnNvciBTdGFydCBBZGRyZXNzICovCisJcEdELT5kcHJCYXNlID0KKwkgICAgKHBHRC0+d2luU2l6ZVggKiBwR0QtPndpblNpemVZICogcEdELT5nZGZCeXRlc1BQKSArIHBjaV9tZW1fYmFzZTsKKwlpZiAoKHBHRC0+ZHByQmFzZSAmIDB4MGZmZikgIT0gMCkgeworCQkvKiBhbGxpZ24gaXQgKi8KKwkJcEdELT5kcHJCYXNlICY9IDB4ZmZmZmYwMDA7CisJCXBHRC0+ZHByQmFzZSArPSAweDAwMDAxMDAwOworCX0KKwlQUklOVEYgKCJDdXJzb3IgU3RhcnQgJXggUGF0dGVybiBTdGFydCAleFxuIiwgcEdELT5kcHJCYXNlLAorCQlQQVRURVJOX0FEUik7CisJcEdELT52cHJCYXNlID0gcGNpX21lbV9iYXNlOwkvKiBEdW1teSAqLworCXBHRC0+Y3ByQmFzZSA9IHBjaV9tZW1fYmFzZTsJLyogRHVtbXkgKi8KKwkvKiBzZXQgdXAgSGFyZHdhcmUgKi8KKworCWN0V3JpdGUgKENUX01TUl9XX08sIDB4MDEpOworCisJLyogc2V0IHRoZSBleHRlbmRlZCBSZWdpc3RlcnMgKi8KKwljdExvYWRSZWdzIChDVF9YUl9PLCB4cmVnKTsKKwkvKiBzZXQgYXRyaWJ1dGUgcmVnaXN0ZXJzICovCisJU2V0QXJSZWdzICgpOworCS8qIHNldCBHcmFwaGljcyByZWdpc3RlciAqLworCVNldEdyUmVncyAoKTsKKwkvKiBzZXQgc2VxdWVuY2VyICovCisJU2V0U3JSZWdzICgpOworCisJLyogc2V0IG1zciAqLworCVNldE1zclJlZ3MgKHJlc19tb2RlKTsKKworCS8qIHNldCBDUlQgUmVnaXN0ZXJzICovCisJU2V0Q3JSZWdzIChyZXNfbW9kZSwgYml0c19wZXJfcGl4ZWwpOworCS8qIHNldCBjb2xvciBtb2RlICovCisJU2V0Qml0c1BlclBpeGVsSW50b1hyUmVncyAoYml0c19wZXJfcGl4ZWwpOworCisJLyogc2V0IFBMTCAqLworCUZpbmRBbmRTZXRQbGxQYXJhbUludG9YclJlZ3MgKHJlc19tb2RlLT5waXhjbG9jaywgY2hpcHNfcGFyYW0pOworCisJY3RXcml0ZV9pIChDVF9TUl9PLCAwLCAweDAzKTsJLyogY2xlYXIgc3luY2hyb25vdXMgcmVzZXQgKi8KKwkvKiBDbGVhciB2aWRlbyBtZW1vcnkgKi8KKwlpID0gcEdELT5tZW1TaXplIC8gNDsKKwl2bSA9ICh1bnNpZ25lZCBpbnQgKikgcEdELT5wY2lCYXNlOworCXdoaWxlIChpLS0pCisJCSp2bSsrID0gMDsKKwlTZXREcmF3aW5nRW5naW5lIChiaXRzX3Blcl9waXhlbCk7CisjaWZkZWYgVkdBX0RVTVBfUkVHCisJdmlkZW9fZHVtcF9yZWcgKCk7CisjZW5kaWYKKworCXJldHVybiAoKHZvaWQgKikgJmN0ZmIpOworfQorCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogU2V0IGEgUkdCIGNvbG9yIGluIHRoZSBMVVQgKDggYml0IGluZGV4KQorKi8KK3ZvaWQKK3ZpZGVvX3NldF9sdXQgKHVuc2lnbmVkIGludCBpbmRleCwJLyogY29sb3IgbnVtYmVyICovCisJICAgICAgIHVuc2lnbmVkIGNoYXIgciwJLyogcmVkICovCisJICAgICAgIHVuc2lnbmVkIGNoYXIgZywJLyogZ3JlZW4gKi8KKwkgICAgICAgdW5zaWduZWQgY2hhciBiCS8qIGJsdWUgKi8KKyAgICApCit7CisKKwljdFdyaXRlIChDVF9MVVRfTUFTS19PLCAweGZmKTsKKworCWN0V3JpdGUgKENUX0xVVF9TVEFSVF9PLCAoY2hhcikgaW5kZXgpOworCisJY3RXcml0ZSAoQ1RfTFVUX1JHQl9PLCByKTsJLyogcmVkICovCisJY3RXcml0ZSAoQ1RfTFVUX1JHQl9PLCBnKTsJLyogZ3JlZW4gKi8KKwljdFdyaXRlIChDVF9MVVRfUkdCX08sIGIpOwkvKiBibHVlICovCisJdWRlbGF5ICgxKTsKKwljdFdyaXRlIChDVF9MVVRfTUFTS19PLCAweGZmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRHJhd2luZyBlbmdpbmUgZmlsbCBvbiBzY3JlZW4gcmVnaW9uCisqLwordm9pZAordmlkZW9faHdfcmVjdGZpbGwgKHVuc2lnbmVkIGludCBicHAsCS8qIGJ5dGVzIHBlciBwaXhlbCAqLworCQkgICB1bnNpZ25lZCBpbnQgZHN0X3gsCS8qIGRlc3QgcG9zIHggKi8KKwkJICAgdW5zaWduZWQgaW50IGRzdF95LAkvKiBkZXN0IHBvcyB5ICovCisJCSAgIHVuc2lnbmVkIGludCBkaW1feCwJLyogZnJhbWUgd2lkdGggKi8KKwkJICAgdW5zaWduZWQgaW50IGRpbV95LAkvKiBmcmFtZSBoZWlnaHQgKi8KKwkJICAgdW5zaWduZWQgaW50IGNvbG9yCS8qIGZpbGwgY29sb3IgKi8KKyAgICApCit7CisJR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikgJiBjdGZiOworCXVuc2lnbmVkIGxvbmcgKnAsIGJyMDQ7CisKKwl2aWRlb193YWl0X2JpdGJsdCAocEdELT5wY2lCYXNlICsgQlIwNF9vKTsKKworCXAgPSAodW5zaWduZWQgbG9uZyAqKSBQQVRURVJOX0FEUjsKKwlkaW1feCAqPSBicHA7CisJaWYgKGJwcCA9PSAzKQorCQlicHArKzsJCS8qIDI0Qml0IG5lZWRzIGEgMzJiaXQgcGF0dGVybiAqLworCW1lbXNldCAocCwgY29sb3IsIChicHAgKiBzaXplb2YgKHVuc2lnbmVkIGNoYXIpICogOCAqIDgpKTsJLyogOCB4IDggcGF0dGVybiBkYXRhICovCisJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA3X28sICgocEdELT53aW5TaXplWCAqIGRzdF95KSArIGRzdF94KSAqIHBHRC0+Z2RmQnl0ZXNQUCk7CS8qIGRlc3RpbmF0aW9uICovCisJYnIwNCA9IGluMzJyIChwR0QtPnBjaUJhc2UgKyBCUjA0X28pICYgMHhmZmZmZmYwMDsKKwlicjA0IHw9IDB4RjA7CQkvKiB3cml0ZSBQYXR0ZXJuIFAgLT4gRCAqLworCW91dDMyciAocEdELT5wY2lCYXNlICsgQlIwNF9vLCBicjA0KTsJLyogKi8KKwlvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDhfbywgKGRpbV95IDw8IDE2KSArIGRpbV94KTsJLyogc3RhcnRzIHRoZSBCSVRCbHQgKi8KKwl2aWRlb193YWl0X2JpdGJsdCAocEdELT5wY2lCYXNlICsgQlIwNF9vKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRHJhd2luZyBlbmdpbmUgYml0Ymx0IHdpdGggc2NyZWVuIHJlZ2lvbgorKi8KK3ZvaWQKK3ZpZGVvX2h3X2JpdGJsdCAodW5zaWduZWQgaW50IGJwcCwJLyogYnl0ZXMgcGVyIHBpeGVsICovCisJCSB1bnNpZ25lZCBpbnQgc3JjX3gsCS8qIHNvdXJjZSBwb3MgeCAqLworCQkgdW5zaWduZWQgaW50IHNyY195LAkvKiBzb3VyY2UgcG9zIHkgKi8KKwkJIHVuc2lnbmVkIGludCBkc3RfeCwJLyogZGVzdCBwb3MgeCAqLworCQkgdW5zaWduZWQgaW50IGRzdF95LAkvKiBkZXN0IHBvcyB5ICovCisJCSB1bnNpZ25lZCBpbnQgZGltX3gsCS8qIGZyYW1lIHdpZHRoICovCisJCSB1bnNpZ25lZCBpbnQgZGltX3kJLyogZnJhbWUgaGVpZ2h0ICovCisgICAgKQoreworCUdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopICYgY3RmYjsKKwl1bnNpZ25lZCBsb25nIGJyMDQ7CisKKwlicjA0ID0gaW4zMnIgKHBHRC0+cGNpQmFzZSArIEJSMDRfbyk7CisKKwkvKiB0byBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbiBkdWUgdG8gb3ZlcmxhcCwgd2UgaGF2ZSB0bworCSAqIGZpbmQgb3V0IGlmLCBhbmQgaG93IHRoZSBmcmFtZXMgb3ZlcmxhcHMgKi8KKwlpZiAoc3JjX3ggPCBkc3RfeCkgeworCQkvKiBzcmMgaXMgbW9yZSBsZWZ0IHRoYW4gZGVzdAorCQkgKiB0aGUgZnJhbWUgbWF5IG92ZXJsYXAgLT4gc3RhcnQgZnJvbSByaWdodCB0byBsZWZ0ICovCisJCWJyMDQgfD0gMHgwMDAwMDEwMDsJLyogc2V0IGJpdCA4ICovCisJCXNyY194ICs9IGRpbV94OworCQlkc3RfeCArPSBkaW1feDsKKwl9IGVsc2UgeworCQlicjA0ICY9IDB4ZmZmZmZlZmY7CS8qIGNsZWFyIGJpdCA4IGxlZnQgdG8gcmlnaHQgKi8KKwl9CisJaWYgKHNyY195IDwgZHN0X3kpIHsKKwkJLyogc3JjIGlzIGhpZ2hlciB0aGFuIGRzdAorCQkgKiB0aGUgZnJhbWUgbWF5IG92ZXJsYXAgPT4gc3RhcnQgZnJvbSBib3R0b20gKi8KKwkJYnIwNCB8PSAweDAwMDAwMjAwOwkvKiBzZXQgYml0IDkgKi8KKwkJc3JjX3kgKz0gZGltX3k7CisJCWRzdF95ICs9IGRpbV95OworCX0gZWxzZSB7CisJCWJyMDQgJj0gMHhmZmZmZmRmZjsJLyogY2xlYXIgYml0IDkgdG9wIHRvIGJvdHRvbSAqLworCX0KKwlkaW1feCAqPSBicHA7CisJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA2X28sICgocEdELT53aW5TaXplWCAqIHNyY195KSArIHNyY194KSAqIHBHRC0+Z2RmQnl0ZXNQUCk7CS8qIHNvdXJjZSAqLworCW91dDMyciAocEdELT5wY2lCYXNlICsgQlIwN19vLCAoKHBHRC0+d2luU2l6ZVggKiBkc3RfeSkgKyBkc3RfeCkgKiBwR0QtPmdkZkJ5dGVzUFApOwkvKiBkZXN0aW5hdGlvbiAqLworCWJyMDQgJj0gMHhmZmZmZmYwMDsKKwlicjA0IHw9IDB4MDAwMDAwQ0M7CS8qIFMgLT4gRCAqLworCW91dDMyciAocEdELT5wY2lCYXNlICsgQlIwNF9vLCBicjA0KTsJLyogKi8KKwlvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDhfbywgKGRpbV95IDw8IDE2KSArIGRpbV94KTsJLyogc3RhcnQgdGhlIEJJVEJsdCAqLworCXZpZGVvX3dhaXRfYml0Ymx0IChwR0QtPnBjaUJhc2UgKyBCUjA0X28pOworfQorCisjZW5kaWYJCQkJLyogQ09ORklHX0NUNjkwMDAgKi8KKworI2VuZGlmCQkJCS8qIENPTkZJR19WSURFTyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kYzIxMTR4LmMgYi9kcml2ZXJzL2RjMjExNHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTE0N2MwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kYzIxMTR4LmMKQEAgLTAsMCArMSw3MjAgQEAKKy8qCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgXAorCSYmIGRlZmluZWQoQ09ORklHX1RVTElQKQorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8cGNpLmg+CisKKyN1bmRlZiBERUJVRworI3VuZGVmIERFQlVHX1NST00KKyN1bmRlZiBERUJVR19TUk9NMgorCisjdW5kZWYgVVBEQVRFX1NST00KKworLyogUENJIFJlZ2lzdGVycy4KKyAqLworI2RlZmluZSBQQ0lfQ0ZEQV9QU00JCTB4NDMKKworI2RlZmluZSBDRlJWX1JOCQkweDAwMDAwMGYwCS8qIFJldmlzaW9uIE51bWJlciAqLworCisjZGVmaW5lIFdBS0VVUAkJMHgwMAkJLyogUG93ZXIgU2F2aW5nIFdha2V1cCAqLworI2RlZmluZSBTTEVFUAkJMHg4MAkJLyogUG93ZXIgU2F2aW5nIFNsZWVwIE1vZGUgKi8KKworI2RlZmluZSBEQzIxMTR4X0JSSwkweDAwMjAJCS8qIENGUlYgYnJlYWsgYmV0d2VlbiBEQzIxMTQyICYgREMyMTE0MyAqLworCisvKiBFdGhlcm5ldCBjaGlwIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZSBERTRYNV9CTVIJMHgwMDAJCS8qIEJ1cyBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X1RQRAkweDAwOAkJLyogVHJhbnNtaXQgUG9sbCBEZW1hbmQgUmVnICovCisjZGVmaW5lIERFNFg1X1JSQkEJMHgwMTgJCS8qIFJYIFJpbmcgQmFzZSBBZGRyZXNzIFJlZyAqLworI2RlZmluZSBERTRYNV9UUkJBCTB4MDIwCQkvKiBUWCBSaW5nIEJhc2UgQWRkcmVzcyBSZWcgKi8KKyNkZWZpbmUgREU0WDVfU1RTCTB4MDI4CQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfT01SCTB4MDMwCQkvKiBPcGVyYXRpb24gTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBERTRYNV9TSUNSCTB4MDY4CQkvKiBTSUEgQ29ubmVjdGl2aXR5IFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X0FQUk9NCTB4MDQ4CQkvKiBFdGhlcm5ldCBBZGRyZXNzIFBST00gKi8KKworLyogUmVnaXN0ZXIgYml0cy4KKyAqLworI2RlZmluZSBCTVJfU1dSCQkweDAwMDAwMDAxCS8qIFNvZnR3YXJlIFJlc2V0ICovCisjZGVmaW5lIFNUU19UUwkJMHgwMDcwMDAwMAkvKiBUcmFuc21pdCBQcm9jZXNzIFN0YXRlICovCisjZGVmaW5lIFNUU19SUwkJMHgwMDBlMDAwMAkvKiBSZWNlaXZlIFByb2Nlc3MgU3RhdGUgKi8KKyNkZWZpbmUgT01SX1NUCQkweDAwMDAyMDAwCS8qIFN0YXJ0L1N0b3AgVHJhbnNtaXNzaW9uIENvbW1hbmQgKi8KKyNkZWZpbmUgT01SX1NSCQkweDAwMDAwMDAyCS8qIFN0YXJ0L1N0b3AgUmVjZWl2ZSAqLworI2RlZmluZSBPTVJfUFMJCTB4MDAwNDAwMDAJLyogUG9ydCBTZWxlY3QgKi8KKyNkZWZpbmUgT01SX1NEUAkJMHgwMjAwMDAwMAkvKiBTRCBQb2xhcml0eSAtIE1VU1QgQkUgQVNTRVJURUQgKi8KKyNkZWZpbmUgT01SX1BNCQkweDAwMDAwMDgwCS8qIFBhc3MgQWxsIE11bHRpY2FzdCAqLworCisvKiBEZXNjcmlwdG9yIGJpdHMuCisgKi8KKyNkZWZpbmUgUl9PV04JCTB4ODAwMDAwMDAJLyogT3duIEJpdCAqLworI2RlZmluZSBSRF9SRVIJCTB4MDIwMDAwMDAJLyogUmVjZWl2ZSBFbmQgT2YgUmluZyAqLworI2RlZmluZSBSRF9MUwkJMHgwMDAwMDEwMAkvKiBMYXN0IERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgUkRfRVMJCTB4MDAwMDgwMDAJLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBURF9URVIJCTB4MDIwMDAwMDAJLyogVHJhbnNtaXQgRW5kIE9mIFJpbmcgKi8KKyNkZWZpbmUgVF9PV04JCTB4ODAwMDAwMDAJLyogT3duIEJpdCAqLworI2RlZmluZSBURF9MUwkJMHg0MDAwMDAwMAkvKiBMYXN0IFNlZ21lbnQgKi8KKyNkZWZpbmUgVERfRlMJCTB4MjAwMDAwMDAJLyogRmlyc3QgU2VnbWVudCAqLworI2RlZmluZSBURF9FUwkJMHgwMDAwODAwMAkvKiBFcnJvciBTdW1tYXJ5ICovCisjZGVmaW5lIFREX1NFVAkJMHgwODAwMDAwMAkvKiBTZXR1cCBQYWNrZXQgKi8KKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCisjZGVmaW5lIFNST01fV1JJVEVfQ01ECTUKKyNkZWZpbmUgU1JPTV9SRUFEX0NNRAk2CisjZGVmaW5lIFNST01fRVJBU0VfQ01ECTcKKworI2RlZmluZSBTUk9NX0hXQURECSAgICAweDAwMTQJLyogSGFyZHdhcmUgQWRkcmVzcyBvZmZzZXQgaW4gU1JPTSAqLworI2RlZmluZSBTUk9NX1JECQkweDAwMDA0MDAwCS8qIFJlYWQgZnJvbSBCb290IFJPTSAqLworI2RlZmluZSBFRV9EQVRBX1dSSVRFCTB4MDQJLyogRUVQUk9NIGNoaXAgZGF0YSBpbi4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfMAkJMHg0ODAxCisjZGVmaW5lIEVFX1dSSVRFXzEJCTB4NDgwNQorI2RlZmluZSBFRV9EQVRBX1JFQUQJMHgwOAkvKiBFRVBST00gY2hpcCBkYXRhIG91dC4gKi8KKyNkZWZpbmUgU1JPTV9TUgkJMHgwMDAwMDgwMAkvKiBTZWxlY3QgU2VyaWFsIFJPTSB3aGVuIHNldCAqLworCisjZGVmaW5lIERUX0lOCQkweDAwMDAwMDA0CS8qIFNlcmlhbCBEYXRhIEluICovCisjZGVmaW5lIERUX0NMSwkJMHgwMDAwMDAwMgkvKiBTZXJpYWwgUk9NIENsb2NrICovCisjZGVmaW5lIERUX0NTCQkweDAwMDAwMDAxCS8qIFNlcmlhbCBST00gQ2hpcCBTZWxlY3QgKi8KKworI2RlZmluZSBQT0xMX0RFTUFORAkxCisKKyNkZWZpbmUgUkVTRVRfREU0WDUoZGV2KSB7XAorICAgIGludCBpO1wKKyAgICBpPUlOTChkZXYsIERFNFg1X0JNUik7XAorICAgIHVkZWxheSgxMDAwKTtcCisgICAgT1VUTChkZXYsIGkgfCBCTVJfU1dSLCBERTRYNV9CTVIpO1wKKyAgICB1ZGVsYXkoMTAwMCk7XAorICAgIE9VVEwoZGV2LCBpLCBERTRYNV9CTVIpO1wKKyAgICB1ZGVsYXkoMTAwMCk7XAorICAgIGZvciAoaT0wO2k8NTtpKyspIHtJTkwoZGV2LCBERTRYNV9CTVIpOyB1ZGVsYXkoMTAwMDApO31cCisgICAgdWRlbGF5KDEwMDApO1wKK30KKworI2RlZmluZSBTVEFSVF9ERTRYNShkZXYpIHtcCisgICAgczMyIG9tcjsgXAorICAgIG9tciA9IElOTChkZXYsIERFNFg1X09NUik7XAorICAgIG9tciB8PSBPTVJfU1QgfCBPTVJfU1I7XAorICAgIE9VVEwoZGV2LCBvbXIsIERFNFg1X09NUik7CQkvKiBFbmFibGUgdGhlIFRYIGFuZC9vciBSWCAqL1wKK30KKworI2RlZmluZSBTVE9QX0RFNFg1KGRldikge1wKKyAgICBzMzIgb21yOyBcCisgICAgb21yID0gSU5MKGRldiwgREU0WDVfT01SKTtcCisgICAgb21yICY9IH4oT01SX1NUfE9NUl9TUik7XAorICAgIE9VVEwoZGV2LCBvbXIsIERFNFg1X09NUik7CQkvKiBEaXNhYmxlIHRoZSBUWCBhbmQvb3IgUlggKi8gXAorfQorCisjZGVmaW5lIE5VTV9SWF9ERVNDIFBLVEJVRlNSWAorI2RlZmluZSBOVU1fVFhfREVTQyAxCQkJLyogTnVtYmVyIG9mIFRYIGRlc2NyaXB0b3JzICAgKi8KKyNkZWZpbmUgUlhfQlVGRl9TWiAgUEtUU0laRV9BTElHTgorCisjZGVmaW5lIFRPVVRfTE9PUCAgIDEwMDAwMDAKKworI2RlZmluZSBTRVRVUF9GUkFNRV9MRU4gMTkyCisjZGVmaW5lIEVUSF9BTEVOCTYKKworCitzdHJ1Y3QgZGU0eDVfZGVzYyB7CisJdm9sYXRpbGUgczMyIHN0YXR1czsKKwl1MzIgZGVzMTsKKwl1MzIgYnVmOworCXUzMiBuZXh0OworfTsKKworc3RhdGljIHN0cnVjdCBkZTR4NV9kZXNjIHJ4X3JpbmdbTlVNX1JYX0RFU0NdOyAvKiBSWCBkZXNjcmlwdG9yIHJpbmcgICAgICAgICAqLworc3RhdGljIHN0cnVjdCBkZTR4NV9kZXNjIHR4X3JpbmdbTlVNX1RYX0RFU0NdOyAvKiBUWCBkZXNjcmlwdG9yIHJpbmcgICAgICAgICAqLworc3RhdGljIGludCByeF9uZXc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSWCBkZXNjcmlwdG9yIHJpbmcgcG9pbnRlciAqLworc3RhdGljIGludCB0eF9uZXc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUWCBkZXNjcmlwdG9yIHJpbmcgcG9pbnRlciAqLworCitzdGF0aWMgY2hhciByeFJpbmdTaXplOworc3RhdGljIGNoYXIgdHhSaW5nU2l6ZTsKKworc3RhdGljIHZvaWQgIHNlbmR0b19zcm9tKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyKTsKK3N0YXRpYyBpbnQgICBnZXRmcm9tX3Nyb20oc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgdV9sb25nIGFkZHIpOworc3RhdGljIGludCAgIGRvX2VlcHJvbV9jbWQoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYWRkciwgaW50IGNtZCwgaW50IGNtZF9sZW4pOworc3RhdGljIGludCAgIGRvX3JlYWRfZWVwcm9tKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2FkZHIsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKTsKK3N0YXRpYyBpbnQgICByZWFkX3Nyb20oc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYWRkciwgaW50IGluZGV4KTsKKyNpZmRlZiBVUERBVEVfU1JPTQorc3RhdGljIGludCAgIHdyaXRlX3Nyb20oc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYWRkciwgaW50IGluZGV4LCBpbnQgbmV3X3ZhbHVlKTsKK3N0YXRpYyB2b2lkICB1cGRhdGVfc3JvbShzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCBiZF90ICpiaXMpOworI2VuZGlmCitzdGF0aWMgdm9pZCAgcmVhZF9od19hZGRyKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGJkX3QgKiBiaXMpOworc3RhdGljIHZvaWQgIHNlbmRfc2V0dXBfZnJhbWUoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCAqIGJpcyk7CisKK3N0YXRpYyBpbnQgICBkYzIxeDR4X2luaXQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCogYmlzKTsKK3N0YXRpYyBpbnQgICBkYzIxeDR4X3NlbmQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgdm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQgICBkYzIxeDR4X3JlY3Yoc3RydWN0IGV0aF9kZXZpY2UqIGRldik7CitzdGF0aWMgdm9pZCAgZGMyMXg0eF9oYWx0KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpOworI2lmZGVmIENPTkZJR19UVUxJUF9TRUxFQ1RfTUVESUEKK2V4dGVybiB2b2lkICBkYzIxeDR4X3NlbGVjdF9tZWRpYShzdHJ1Y3QgZXRoX2RldmljZSogZGV2KTsKKyNlbmRpZgorCisjZGVmaW5lIHBoeXNfdG9fYnVzKGEpCXBjaV9waHlzX3RvX21lbSgocGNpX2Rldl90KWRldi0+cHJpdiwgYSkKKworc3RhdGljIGludCBJTkwoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgdV9sb25nIGFkZHIpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdV9sb25nICopKGFkZHIgKyBkZXYtPmlvYmFzZSkpOworfQorCitzdGF0aWMgdm9pZCBPVVRMKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGludCBjb21tYW5kLCB1X2xvbmcgYWRkcikKK3sKKwkqKHZvbGF0aWxlIHVfbG9uZyAqKShhZGRyICsgZGV2LT5pb2Jhc2UpID0gY3B1X3RvX2xlMzIoY29tbWFuZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzdXBwb3J0ZWRbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfREVDLCBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9GQVNUIH0sCisJeyBQQ0lfVkVORE9SX0lEX0RFQywgUENJX0RFVklDRV9JRF9ERUNfMjExNDIgfSwKKwl7IH0KK307CisKK2ludCBkYzIxeDR4X2luaXRpYWxpemUoYmRfdCAqYmlzKQoreworCWludCAgICAgICAgICAgICAJaWR4PTA7CisJaW50ICAgICAgICAgICAgIAljYXJkX251bWJlciA9IDA7CisJaW50ICAgICAgICAgICAgIAljZnJ2OworCXVuc2lnbmVkIGNoYXIgICAJdGltZXI7CisJcGNpX2Rldl90CQlkZXZidXNmbjsKKwl1bnNpZ25lZCBpbnQJCWlvYmFzZTsKKwl1bnNpZ25lZCBzaG9ydAkJc3RhdHVzOworCXN0cnVjdCBldGhfZGV2aWNlKiAJZGV2OworCisJd2hpbGUoMSkgeworCQlkZXZidXNmbiA9ICBwY2lfZmluZF9kZXZpY2VzKHN1cHBvcnRlZCwgaWR4KyspOworCQlpZiAoZGV2YnVzZm4gPT0gLTEpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogR2V0IHRoZSBjaGlwIGNvbmZpZ3VyYXRpb24gcmV2aXNpb24gcmVnaXN0ZXIuICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXZidXNmbiwgUENJX1JFVklTSU9OX0lELCAmY2Zydik7CisKKwkJaWYgKChjZnJ2ICYgQ0ZSVl9STikgPCBEQzIxMTR4X0JSSyApIHsKKwkJCXByaW50ZigiRXJyb3I6IFRoZSBjaGlwIGlzIG5vdCBEQzIxMTQzLlxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldmJ1c2ZuLCBQQ0lfQ09NTUFORCwgJnN0YXR1cyk7CisJCXN0YXR1cyB8PQorI2lmZGVmIENPTkZJR19UVUxJUF9VU0VfSU8KKwkJICBQQ0lfQ09NTUFORF9JTyB8CisjZWxzZQorCQkgIFBDSV9DT01NQU5EX01FTU9SWSB8CisjZW5kaWYKKwkJICBQQ0lfQ09NTUFORF9NQVNURVI7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXZidXNmbiwgUENJX0NPTU1BTkQsIHN0YXR1cyk7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2YnVzZm4sIFBDSV9DT01NQU5ELCAmc3RhdHVzKTsKKwkJaWYgKCEoc3RhdHVzICYgUENJX0NPTU1BTkRfSU8pKSB7CisJCQlwcmludGYoIkVycm9yOiBDYW4gbm90IGVuYWJsZSBJL08gYWNjZXNzLlxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKHN0YXR1cyAmIFBDSV9DT01NQU5EX0lPKSkgeworCQkJcHJpbnRmKCJFcnJvcjogQ2FuIG5vdCBlbmFibGUgSS9PIGFjY2Vzcy5cbiIpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIShzdGF0dXMgJiBQQ0lfQ09NTUFORF9NQVNURVIpKSB7CisJCQlwcmludGYoIkVycm9yOiBDYW4gbm90IGVuYWJsZSBCdXMgTWFzdGVyaW5nLlxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIENoZWNrIHRoZSBsYXRlbmN5IHRpbWVyIGZvciB2YWx1ZXMgPj0gMHg2MC4gKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2YnVzZm4sIFBDSV9MQVRFTkNZX1RJTUVSLCAmdGltZXIpOworCisJCWlmICh0aW1lciA8IDB4NjApIHsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXZidXNmbiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4NjApOworCQl9CisKKyNpZmRlZiBDT05GSUdfVFVMSVBfVVNFX0lPCisJCS8qIHJlYWQgQkFSIGZvciBtZW1vcnkgc3BhY2UgYWNjZXNzICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXZidXNmbiwgUENJX0JBU0VfQUREUkVTU18wLCAmaW9iYXNlKTsKKwkJaW9iYXNlICY9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKyNlbHNlCisJCS8qIHJlYWQgQkFSIGZvciBtZW1vcnkgc3BhY2UgYWNjZXNzICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXZidXNmbiwgUENJX0JBU0VfQUREUkVTU18xLCAmaW9iYXNlKTsKKwkJaW9iYXNlICY9IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisjZW5kaWYKKworI2lmZGVmIERFQlVHCisJCXByaW50ZigiZGMyMXg0eDogREVDIDIxMTQyIFBDSSBEZXZpY2UgQDB4JXhcbiIsIGlvYmFzZSk7CisjZW5kaWYKKworCQlkZXYgPSAoc3RydWN0IGV0aF9kZXZpY2UqKSBtYWxsb2Moc2l6ZW9mICpkZXYpOworCisJCXNwcmludGYoZGV2LT5uYW1lLCAiZGMyMXg0eCMlZCIsIGNhcmRfbnVtYmVyKTsKKyNpZmRlZiBDT05GSUdfVFVMSVBfVVNFX0lPCisJCWRldi0+aW9iYXNlID0gcGNpX2lvX3RvX3BoeXMoZGV2YnVzZm4sIGlvYmFzZSk7CisjZWxzZQorCQlkZXYtPmlvYmFzZSA9IHBjaV9tZW1fdG9fcGh5cyhkZXZidXNmbiwgaW9iYXNlKTsKKyNlbmRpZgorCQlkZXYtPnByaXYgICA9ICh2b2lkKikgZGV2YnVzZm47CisJCWRldi0+aW5pdCAgID0gZGMyMXg0eF9pbml0OworCQlkZXYtPmhhbHQgICA9IGRjMjF4NHhfaGFsdDsKKwkJZGV2LT5zZW5kICAgPSBkYzIxeDR4X3NlbmQ7CisJCWRldi0+cmVjdiAgID0gZGMyMXg0eF9yZWN2OworCisJCS8qIEVuc3VyZSB3ZSdyZSBub3Qgc2xlZXBpbmcuICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXZidXNmbiwgUENJX0NGREFfUFNNLCBXQUtFVVApOworCisJCXVkZWxheSgxMCAqIDEwMDApOworCisJCXJlYWRfaHdfYWRkcihkZXYsIGJpcyk7CisKKwkJZXRoX3JlZ2lzdGVyKGRldik7CisKKwkJY2FyZF9udW1iZXIrKzsKKwl9CisKKwlyZXR1cm4gY2FyZF9udW1iZXI7Cit9CisKK3N0YXRpYyBpbnQgZGMyMXg0eF9pbml0KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGJkX3QqIGJpcykKK3sKKwlpbnQJCWk7CisJaW50CQlkZXZidXNmbiA9IChpbnQpIGRldi0+cHJpdjsKKworCS8qIEVuc3VyZSB3ZSdyZSBub3Qgc2xlZXBpbmcuICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldmJ1c2ZuLCBQQ0lfQ0ZEQV9QU00sIFdBS0VVUCk7CisKKwlSRVNFVF9ERTRYNShkZXYpOworCisJaWYgKChJTkwoZGV2LCBERTRYNV9TVFMpICYgKFNUU19UUyB8IFNUU19SUykpICE9IDApIHsKKwkJcHJpbnRmKCJFcnJvcjogQ2Fubm90IHJlc2V0IGV0aGVybmV0IGNvbnRyb2xsZXIuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgQ09ORklHX1RVTElQX1NFTEVDVF9NRURJQQorCWRjMjF4NHhfc2VsZWN0X21lZGlhKGRldik7CisjZWxzZQorCU9VVEwoZGV2LCBPTVJfU0RQIHwgT01SX1BTIHwgT01SX1BNLCBERTRYNV9PTVIpOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgeworCQlyeF9yaW5nW2ldLnN0YXR1cyA9IGNwdV90b19sZTMyKFJfT1dOKTsKKwkJcnhfcmluZ1tpXS5kZXMxID0gY3B1X3RvX2xlMzIoUlhfQlVGRl9TWik7CisJCXJ4X3JpbmdbaV0uYnVmID0gY3B1X3RvX2xlMzIocGh5c190b19idXMoKHUzMikgTmV0UnhQYWNrZXRzW2ldKSk7CisJCXJ4X3JpbmdbaV0ubmV4dCA9IDA7CisJfQorCisJZm9yIChpPTA7IGkgPCBOVU1fVFhfREVTQzsgaSsrKSB7CisJCXR4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkJdHhfcmluZ1tpXS5kZXMxID0gMDsKKwkJdHhfcmluZ1tpXS5idWYgPSAwOworCQl0eF9yaW5nW2ldLm5leHQgPSAwOworCX0KKworCXJ4UmluZ1NpemUgPSBOVU1fUlhfREVTQzsKKwl0eFJpbmdTaXplID0gTlVNX1RYX0RFU0M7CisKKwkvKiBXcml0ZSB0aGUgZW5kIG9mIGxpc3QgbWFya2VyIHRvIHRoZSBkZXNjcmlwdG9yIGxpc3RzLiAqLworCXJ4X3JpbmdbcnhSaW5nU2l6ZSAtIDFdLmRlczEgfD0gY3B1X3RvX2xlMzIoUkRfUkVSKTsKKwl0eF9yaW5nW3R4UmluZ1NpemUgLSAxXS5kZXMxIHw9IGNwdV90b19sZTMyKFREX1RFUik7CisKKwkvKiBUZWxsIHRoZSBhZGFwdGVyIHdoZXJlIHRoZSBUWC9SWCByaW5ncyBhcmUgbG9jYXRlZC4gKi8KKwlPVVRMKGRldiwgcGh5c190b19idXMoKHUzMikgJnJ4X3JpbmcpLCBERTRYNV9SUkJBKTsKKwlPVVRMKGRldiwgcGh5c190b19idXMoKHUzMikgJnR4X3JpbmcpLCBERTRYNV9UUkJBKTsKKworCVNUQVJUX0RFNFg1KGRldik7CisKKwl0eF9uZXcgPSAwOworCXJ4X25ldyA9IDA7CisKKwlzZW5kX3NldHVwX2ZyYW1lKGRldiwgYmlzKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRjMjF4NHhfc2VuZChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpCit7CisJaW50CQlzdGF0dXMgPSAtMTsKKwlpbnQJCWk7CisKKwlpZiAobGVuZ3RoIDw9IDApIHsKKwkJcHJpbnRmKCIlczogYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgZGV2LT5uYW1lLCBsZW5ndGgpOworCQlnb3RvIERvbmU7CisJfQorCisJZm9yKGkgPSAwOyB0eF9yaW5nW3R4X25ld10uc3RhdHVzICYgY3B1X3RvX2xlMzIoVF9PV04pOyBpKyspIHsKKwkJaWYgKGkgPj0gVE9VVF9MT09QKSB7CisJCQlwcmludGYoIiVzOiB0eCBlcnJvciBidWZmZXIgbm90IHJlYWR5XG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBEb25lOworCQl9CisJfQorCisJdHhfcmluZ1t0eF9uZXddLmJ1ZiAgICA9IGNwdV90b19sZTMyKHBoeXNfdG9fYnVzKCh1MzIpIHBhY2tldCkpOworCXR4X3JpbmdbdHhfbmV3XS5kZXMxICAgPSBjcHVfdG9fbGUzMihURF9URVIgfCBURF9MUyB8IFREX0ZTIHwgbGVuZ3RoKTsKKwl0eF9yaW5nW3R4X25ld10uc3RhdHVzID0gY3B1X3RvX2xlMzIoVF9PV04pOworCisJT1VUTChkZXYsIFBPTExfREVNQU5ELCBERTRYNV9UUEQpOworCisJZm9yKGkgPSAwOyB0eF9yaW5nW3R4X25ld10uc3RhdHVzICYgY3B1X3RvX2xlMzIoVF9PV04pOyBpKyspIHsKKwkJaWYgKGkgPj0gVE9VVF9MT09QKSB7CisJCQlwcmludGYoIi4lczogdHggYnVmZmVyIG5vdCByZWFkeVxuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gRG9uZTsKKwkJfQorCX0KKworCWlmIChsZTMyX3RvX2NwdSh0eF9yaW5nW3R4X25ld10uc3RhdHVzKSAmIFREX0VTKSB7CisjaWYgMCAvKiB0ZXN0LW9ubHkgKi8KKwkJcHJpbnRmKCJUWCBlcnJvciBzdGF0dXMgPSAweCUwOFhcbiIsCisJCSAgICAgICBsZTMyX3RvX2NwdSh0eF9yaW5nW3R4X25ld10uc3RhdHVzKSk7CisjZW5kaWYKKwkJZ290byBEb25lOworCX0KKworCXN0YXR1cyA9IGxlbmd0aDsKKworIERvbmU6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkYzIxeDR4X3JlY3Yoc3RydWN0IGV0aF9kZXZpY2UqIGRldikKK3sKKwlzMzIJCXN0YXR1czsKKwlpbnQJCWxlbmd0aCAgICA9IDA7CisKKwlmb3IgKCA7IDsgKSB7CisJCXN0YXR1cyA9IChzMzIpbGUzMl90b19jcHUocnhfcmluZ1tyeF9uZXddLnN0YXR1cyk7CisKKwkJaWYgKHN0YXR1cyAmIFJfT1dOKSB7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBSRF9MUykgeworCQkJLyogVmFsaWQgZnJhbWUgc3RhdHVzLgorCQkJICovCisJCQlpZiAoc3RhdHVzICYgUkRfRVMpIHsKKworCQkJCS8qIFRoZXJlIHdhcyBhbiBlcnJvci4KKwkJCQkgKi8KKwkJCQlwcmludGYoIlJYIGVycm9yIHN0YXR1cyA9IDB4JTA4WFxuIiwgc3RhdHVzKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogQSB2YWxpZCBmcmFtZSByZWNlaXZlZC4KKwkJCQkgKi8KKwkJCQlsZW5ndGggPSAobGUzMl90b19jcHUocnhfcmluZ1tyeF9uZXddLnN0YXR1cykgPj4gMTYpOworCisJCQkJLyogUGFzcyB0aGUgcGFja2V0IHVwIHRvIHRoZSBwcm90b2NvbAorCQkJCSAqIGxheWVycy4KKwkJCQkgKi8KKwkJCQlOZXRSZWNlaXZlKE5ldFJ4UGFja2V0c1tyeF9uZXddLCBsZW5ndGggLSA0KTsKKwkJCX0KKworCQkJLyogQ2hhbmdlIGJ1ZmZlciBvd25lcnNoaXAgZm9yIHRoaXMgZnJhbWUsIGJhY2sKKwkJCSAqIHRvIHRoZSBhZGFwdGVyLgorCQkJICovCisJCQlyeF9yaW5nW3J4X25ld10uc3RhdHVzID0gY3B1X3RvX2xlMzIoUl9PV04pOworCQl9CisKKwkJLyogVXBkYXRlIGVudHJ5IGluZm9ybWF0aW9uLgorCQkgKi8KKwkJcnhfbmV3ID0gKHJ4X25ldyArIDEpICUgcnhSaW5nU2l6ZTsKKwl9CisKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCBkYzIxeDR4X2hhbHQoc3RydWN0IGV0aF9kZXZpY2UqIGRldikKK3sKKwlpbnQJCWRldmJ1c2ZuID0gKGludCkgZGV2LT5wcml2OworCisJU1RPUF9ERTRYNShkZXYpOworCU9VVEwoZGV2LCAwLCBERTRYNV9TSUNSKTsKKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXZidXNmbiwgUENJX0NGREFfUFNNLCBTTEVFUCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfc2V0dXBfZnJhbWUoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCAqYmlzKQoreworCWludAkJaTsKKwljaGFyCXNldHVwX2ZyYW1lW1NFVFVQX0ZSQU1FX0xFTl07CisJY2hhciAJKnBhID0gJnNldHVwX2ZyYW1lWzBdOworCisJbWVtc2V0KHBhLCAweGZmLCBTRVRVUF9GUkFNRV9MRU4pOworCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJKihwYSArIChpICYgMSkpID0gZGV2LT5lbmV0YWRkcltpXTsKKwkJaWYgKGkgJiAweDAxKSB7CisJCQlwYSArPSA0OworCQl9CisJfQorCisJZm9yKGkgPSAwOyB0eF9yaW5nW3R4X25ld10uc3RhdHVzICYgY3B1X3RvX2xlMzIoVF9PV04pOyBpKyspIHsKKwkJaWYgKGkgPj0gVE9VVF9MT09QKSB7CisJCQlwcmludGYoIiVzOiB0eCBlcnJvciBidWZmZXIgbm90IHJlYWR5XG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBEb25lOworCQl9CisJfQorCisJdHhfcmluZ1t0eF9uZXddLmJ1ZiA9IGNwdV90b19sZTMyKHBoeXNfdG9fYnVzKCh1MzIpICZzZXR1cF9mcmFtZVswXSkpOworCXR4X3JpbmdbdHhfbmV3XS5kZXMxID0gY3B1X3RvX2xlMzIoVERfVEVSIHwgVERfU0VUfCBTRVRVUF9GUkFNRV9MRU4pOworCXR4X3JpbmdbdHhfbmV3XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihUX09XTik7CisKKwlPVVRMKGRldiwgUE9MTF9ERU1BTkQsIERFNFg1X1RQRCk7CisKKwlmb3IoaSA9IDA7IHR4X3JpbmdbdHhfbmV3XS5zdGF0dXMgJiBjcHVfdG9fbGUzMihUX09XTik7IGkrKykgeworCQlpZiAoaSA+PSBUT1VUX0xPT1ApIHsKKwkJCXByaW50ZigiJXM6IHR4IGJ1ZmZlciBub3QgcmVhZHlcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIERvbmU7CisJCX0KKwl9CisKKwlpZiAobGUzMl90b19jcHUodHhfcmluZ1t0eF9uZXddLnN0YXR1cykgIT0gMHg3RkZGRkZGRikgeworCQlwcmludGYoIlRYIGVycm9yIHN0YXR1czIgPSAweCUwOFhcbiIsIGxlMzJfdG9fY3B1KHR4X3JpbmdbdHhfbmV3XS5zdGF0dXMpKTsKKwl9CitEb25lOgorCXJldHVybjsKK30KKworLyogU1JPTSBSZWFkIGFuZCB3cml0ZSByb3V0aW5lcy4KKyAqLworCitzdGF0aWMgdm9pZAorc2VuZHRvX3Nyb20oc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgdV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHIpCit7CisJT1VUTChkZXYsIGNvbW1hbmQsIGFkZHIpOworCXVkZWxheSgxKTsKK30KKworc3RhdGljIGludAorZ2V0ZnJvbV9zcm9tKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIHVfbG9uZyBhZGRyKQoreworCXMzMiB0bXA7CisKKwl0bXAgPSBJTkwoZGV2LCBhZGRyKTsKKwl1ZGVsYXkoMSk7CisKKwlyZXR1cm4gdG1wOworfQorCisvKiBOb3RlOiB0aGlzIHJvdXRpbmUgcmV0dXJucyBleHRyYSBkYXRhIGJpdHMgZm9yIHNpemUgZGV0ZWN0aW9uLiAqLworc3RhdGljIGludCBkb19yZWFkX2VlcHJvbShzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCB1X2xvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCByZXR2YWwgPSAwOworCWludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgKFNST01fUkVBRF9DTUQgPDwgYWRkcl9sZW4pOworCisJc2VuZHRvX3Nyb20oZGV2LCBTUk9NX1JEIHwgU1JPTV9TUiwgaW9hZGRyKTsKKwlzZW5kdG9fc3JvbShkZXYsIFNST01fUkQgfCBTUk9NX1NSIHwgRFRfQ1MsIGlvYWRkcik7CisKKyNpZmRlZiBERUJVR19TUk9NCisJcHJpbnRmKCIgRUVQUk9NIHJlYWQgYXQgJWQgIiwgbG9jYXRpb24pOworI2VuZGlmCisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDQgKyBhZGRyX2xlbjsgaSA+PSAwOyBpLS0pIHsKKwkJc2hvcnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX0RBVEFfV1JJVEUgOiAwOworCQlzZW5kdG9fc3JvbShkZXYsIFNST01fUkQgfCBTUk9NX1NSIHwgRFRfQ1MgfCBkYXRhdmFsLCBpb2FkZHIpOworCQl1ZGVsYXkoMTApOworCQlzZW5kdG9fc3JvbShkZXYsIFNST01fUkQgfCBTUk9NX1NSIHwgRFRfQ1MgfCBkYXRhdmFsIHwgRFRfQ0xLLCBpb2FkZHIpOworCQl1ZGVsYXkoMTApOworI2lmZGVmIERFQlVHX1NST00yCisJCXByaW50ZigiJVgiLCBnZXRmcm9tX3Nyb20oZGV2LCBpb2FkZHIpICYgMTUpOworI2VuZGlmCisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGdldGZyb21fc3JvbShkZXYsIGlvYWRkcikgJiBFRV9EQVRBX1JFQUQpID8gMSA6IDApOworCX0KKworCXNlbmR0b19zcm9tKGRldiwgU1JPTV9SRCB8IFNST01fU1IgfCBEVF9DUywgaW9hZGRyKTsKKworI2lmZGVmIERFQlVHX1NST00yCisJcHJpbnRmKCIgOiVYOiIsIGdldGZyb21fc3JvbShkZXYsIGlvYWRkcikgJiAxNSk7CisjZW5kaWYKKworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCXNlbmR0b19zcm9tKGRldiwgU1JPTV9SRCB8IFNST01fU1IgfCBEVF9DUyB8IERUX0NMSywgaW9hZGRyKTsKKwkJdWRlbGF5KDEwKTsKKyNpZmRlZiBERUJVR19TUk9NMgorCQlwcmludGYoIiVYIiwgZ2V0ZnJvbV9zcm9tKGRldiwgaW9hZGRyKSAmIDE1KTsKKyNlbmRpZgorCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChnZXRmcm9tX3Nyb20oZGV2LCBpb2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwkJc2VuZHRvX3Nyb20oZGV2LCBTUk9NX1JEIHwgU1JPTV9TUiB8IERUX0NTLCBpb2FkZHIpOworCQl1ZGVsYXkoMTApOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwlzZW5kdG9fc3JvbShkZXYsIFNST01fUkQgfCBTUk9NX1NSLCBpb2FkZHIpOworCisjaWZkZWYgREVCVUdfU1JPTTIKKwlwcmludGYoIiBFRVBST00gdmFsdWUgYXQgJWQgaXMgJTUuNXguXG4iLCBsb2NhdGlvbiwgcmV0dmFsKTsKKyNlbmRpZgorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogVGhpcyBleGVjdXRlcyBhIGdlbmVyaWMgRUVQUk9NIGNvbW1hbmQsIHR5cGljYWxseSBhIHdyaXRlIG9yIHdyaXRlIGVuYWJsZS4KKyAgIEl0IHJldHVybnMgdGhlIGRhdGEgb3V0cHV0IGZyb20gdGhlIEVFUFJPTSwgYW5kIHRodXMgbWF5IGFsc28gYmUgdXNlZCBmb3IKKyAgIHJlYWRzLiAqLworc3RhdGljIGludCBkb19lZXByb21fY21kKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2FkZHIsIGludCBjbWQsIGludCBjbWRfbGVuKQoreworCXVuc2lnbmVkIHJldHZhbCA9IDA7CisKKyNpZmRlZiBERUJVR19TUk9NCisJcHJpbnRmKCIgRUVQUk9NIG9wIDB4JXg6ICIsIGNtZCk7CisjZW5kaWYKKworCXNlbmR0b19zcm9tKGRldixTUk9NX1JEIHwgU1JPTV9TUiB8IERUX0NTIHwgRFRfQ0xLLCBpb2FkZHIpOworCisJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisJZG8geworCQlzaG9ydCBkYXRhdmFsID0gKGNtZCAmICgxIDw8IGNtZF9sZW4pKSA/IEVFX1dSSVRFXzEgOiBFRV9XUklURV8wOworCQlzZW5kdG9fc3JvbShkZXYsZGF0YXZhbCwgaW9hZGRyKTsKKwkJdWRlbGF5KDEwKTsKKworI2lmZGVmIERFQlVHX1NST00yCisJCXByaW50ZigiJVgiLCBnZXRmcm9tX3Nyb20oZGV2LGlvYWRkcikgJiAxNSk7CisjZW5kaWYKKworCQlzZW5kdG9fc3JvbShkZXYsZGF0YXZhbCB8IERUX0NMSywgaW9hZGRyKTsKKwkJdWRlbGF5KDEwKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoZ2V0ZnJvbV9zcm9tKGRldixpb2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwl9IHdoaWxlICgtLWNtZF9sZW4gPj0gMCk7CisJc2VuZHRvX3Nyb20oZGV2LFNST01fUkQgfCBTUk9NX1NSIHwgRFRfQ1MsIGlvYWRkcik7CisKKwkvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisJc2VuZHRvX3Nyb20oZGV2LFNST01fUkQgfCBTUk9NX1NSLCBpb2FkZHIpOworCisjaWZkZWYgREVCVUdfU1JPTQorCXByaW50ZigiIEVFUFJPTSByZXN1bHQgaXMgMHglNS41eC5cbiIsIHJldHZhbCk7CisjZW5kaWYKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9zcm9tKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2FkZHIsIGludCBpbmRleCkKK3sKKwlpbnQgZWVfYWRkcl9zaXplID0gZG9fcmVhZF9lZXByb20oZGV2LCBpb2FkZHIsIDB4ZmYsIDgpICYgMHg0MDAwMCA/IDggOiA2OworCisJcmV0dXJuIGRvX2VlcHJvbV9jbWQoZGV2LCBpb2FkZHIsCisJCQkgICAgICgoKFNST01fUkVBRF9DTUQgPDwgZWVfYWRkcl9zaXplKSB8IGluZGV4KSA8PCAxNikKKwkJCSAgICAgfCAweGZmZmYsIDMgKyBlZV9hZGRyX3NpemUgKyAxNik7Cit9CisKKyNpZmRlZiBVUERBVEVfU1JPTQorc3RhdGljIGludCB3cml0ZV9zcm9tKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2FkZHIsIGludCBpbmRleCwgaW50IG5ld192YWx1ZSkKK3sKKwlpbnQgZWVfYWRkcl9zaXplID0gZG9fcmVhZF9lZXByb20oZGV2LCBpb2FkZHIsIDB4ZmYsIDgpICYgMHg0MDAwMCA/IDggOiA2OworCWludCBpOworCXVuc2lnbmVkIHNob3J0IG5ld3ZhbDsKKworCXVkZWxheSgxMCoxMDAwKTsgLyogdGVzdC1vbmx5ICovCisKKyNpZmRlZiBERUJVR19TUk9NCisJcHJpbnRmKCJlZV9hZGRyX3NpemU9JWQuXG4iLCBlZV9hZGRyX3NpemUpOworCXByaW50ZigiV3JpdGluZyBuZXcgZW50cnkgMHglNC40eCB0byBvZmZzZXQgJWQuXG4iLCBuZXdfdmFsdWUsIGluZGV4KTsKKyNlbmRpZgorCisJLyogRW5hYmxlIHByb2dyYW1taW5nIG1vZGVzLiAqLworCWRvX2VlcHJvbV9jbWQoZGV2LCBpb2FkZHIsICgweDRmIDw8IChlZV9hZGRyX3NpemUtNCkpLCAzK2VlX2FkZHJfc2l6ZSk7CisKKwkvKiBEbyB0aGUgYWN0dWFsIHdyaXRlLiAqLworCWRvX2VlcHJvbV9jbWQoZGV2LCBpb2FkZHIsCisJCSAgICAgICgoKFNST01fV1JJVEVfQ01EPDxlZV9hZGRyX3NpemUpfGluZGV4KSA8PCAxNikgfCBuZXdfdmFsdWUsCisJCSAgICAgIDMgKyBlZV9hZGRyX3NpemUgKyAxNik7CisKKwkvKiBQb2xsIGZvciB3cml0ZSBmaW5pc2hlZC4gKi8KKwlzZW5kdG9fc3JvbShkZXYsIFNST01fUkQgfCBTUk9NX1NSIHwgRFRfQ1MsIGlvYWRkcik7CisJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspCQkJLyogVHlwaWNhbCAyMDAwIHRpY2tzICovCisJCWlmIChnZXRmcm9tX3Nyb20oZGV2LCBpb2FkZHIpICYgRUVfREFUQV9SRUFEKQorCQkJYnJlYWs7CisKKyNpZmRlZiBERUJVR19TUk9NCisJcHJpbnRmKCIgV3JpdGUgZmluaXNoZWQgYWZ0ZXIgJWQgdGlja3MuXG4iLCBpKTsKKyNlbmRpZgorCisJLyogRGlzYWJsZSBwcm9ncmFtbWluZy4gKi8KKwlkb19lZXByb21fY21kKGRldiwgaW9hZGRyLCAoMHg0MCA8PCAoZWVfYWRkcl9zaXplLTQpKSwgMyArIGVlX2FkZHJfc2l6ZSk7CisKKwkvKiBBbmQgcmVhZCB0aGUgcmVzdWx0LiAqLworCW5ld3ZhbCA9IGRvX2VlcHJvbV9jbWQoZGV2LCBpb2FkZHIsCisJCQkgICAgICAgKCgoU1JPTV9SRUFEX0NNRDw8ZWVfYWRkcl9zaXplKXxpbmRleCkgPDwgMTYpCisJCQkgICAgICAgfCAweGZmZmYsIDMgKyBlZV9hZGRyX3NpemUgKyAxNik7CisjaWZkZWYgREVCVUdfU1JPTQorCXByaW50ZigiICBOZXcgdmFsdWUgYXQgb2Zmc2V0ICVkIGlzICU0LjR4LlxuIiwgaW5kZXgsIG5ld3ZhbCk7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCByZWFkX2h3X2FkZHIoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgYmRfdCAqYmlzKQoreworCXVfc2hvcnQgdG1wLCAqcCA9IChzaG9ydCAqKSgmZGV2LT5lbmV0YWRkclswXSk7CisJaW50IGksIGogPSAwOworCisJZm9yIChpID0gMDsgaSA8IChFVEhfQUxFTiA+PiAxKTsgaSsrKSB7CisJCXRtcCA9IHJlYWRfc3JvbShkZXYsIERFNFg1X0FQUk9NLCAoKFNST01fSFdBREQgPj4gMSkgKyBpKSk7CisJCSpwID0gbGUxNl90b19jcHUodG1wKTsKKwkJaiArPSAqcCsrOworCX0KKworCWlmICgoaiA9PSAwKSB8fCAoaiA9PSAweDJmZmZkKSkgeworCQltZW1zZXQgKGRldi0+ZW5ldGFkZHIsIDAsIEVUSF9BTEVOKTsKKyNpZmRlZiBERUJVRworCQlwcmludGYoIldhcm5pbmc6IGNhbid0IHJlYWQgSFcgYWRkcmVzcyBmcm9tIFNST00uXG4iKTsKKyNlbmRpZgorCQlnb3RvIERvbmU7CisJfQorCisJcmV0dXJuOworCitEb25lOgorI2lmZGVmIFVQREFURV9TUk9NCisJdXBkYXRlX3Nyb20oZGV2LCBiaXMpOworI2VuZGlmCisJcmV0dXJuOworfQorCisjaWZkZWYgVVBEQVRFX1NST00KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zcm9tKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGJkX3QgKmJpcykKK3sKKwlpbnQgaTsKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgZWVwcm9tWzB4NDBdID0geworCQkweDE0MGIsIDB4NjYxMCwgMHgwMDAwLCAweDAwMDAsIAkvKiAwMCAqLworCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIAkvKiAwNCAqLworCQkweDAwYTMsIDB4MDEwMywgMHgwMDAwLCAweDAwMDAsICAJLyogMDggKi8KKwkJMHgwMDAwLCAweDFmMDAsIDB4MDAwMCwgMHgwMDAwLCAJLyogMGMgKi8KKwkJMHgwMTA4LCAweDAzOGQsIDB4MDAwMCwgMHgwMDAwLCAgCS8qIDEwICovCisJCTB4ZTA3OCwgMHgwMDAxLCAweDAwNDAsIDB4MDAxOCwgCS8qIDE0ICovCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgIAkvKiAxOCAqLworCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIAkvKiAxYyAqLworCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsICAJLyogMjAgKi8KKwkJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAJLyogMjQgKi8KKwkJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAgCS8qIDI4ICovCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCS8qIDJjICovCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgIAkvKiAzMCAqLworCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIAkvKiAzNCAqLworCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsICAJLyogMzggKi8KKwkJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0ZTA3LAkJLyogM2MgKi8KKwl9OworCisJLyogRXRoZXJuZXQgQWRkci4uLiAqLworCWVlcHJvbVsweDBhXSA9ICgoYmlzLT5iaV9lbmV0YWRkclsxXSAmIDB4ZmYpIDw8IDgpIHwgKGJpcy0+YmlfZW5ldGFkZHJbMF0gJiAweGZmKTsKKwllZXByb21bMHgwYl0gPSAoKGJpcy0+YmlfZW5ldGFkZHJbM10gJiAweGZmKSA8PCA4KSB8IChiaXMtPmJpX2VuZXRhZGRyWzJdICYgMHhmZik7CisJZWVwcm9tWzB4MGNdID0gKChiaXMtPmJpX2VuZXRhZGRyWzVdICYgMHhmZikgPDwgOCkgfCAoYmlzLT5iaV9lbmV0YWRkcls0XSAmIDB4ZmYpOworCisJZm9yIChpPTA7IGk8MHg0MDsgaSsrKQorCXsKKwkJd3JpdGVfc3JvbShkZXYsIERFNFg1X0FQUk9NLCBpLCBlZXByb21baV0pOworCX0KK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTgwNDIuYyBiL2RyaXZlcnMvaTgwNDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTI0ZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pODA0Mi5jCkBAIC0wLDAgKzEsNjU1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyIEVMVEVDIEVsZWt0cm9uaWsgQUcKKyAqIEZyYW5rIEdvdHRzY2hsaW5nIDxmZ290dHNjaGxpbmdAZWx0ZWMuZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogaTgwNDIuYyAtIEludGVsIDgwNDIga2V5Ym9hcmQgZHJpdmVyIHJvdXRpbmVzICovCisKKy8qIGluY2x1ZGVzICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19JODA0Ml9LQkQKKworI2luY2x1ZGUgPGk4MDQyLmg+CisKKy8qIGRlZmluZXMgKi8KKworI2lmZGVmIENPTkZJR19DT05TT0xFX0NVUlNPUgorZXh0ZXJuIHZvaWQgY29uc29sZV9jdXJzb3IgKGludCBzdGF0ZSk7CitzdGF0aWMgaW50IGJsaW5rQ291bnQgPSBDRkdfQ09OU09MRV9CTElOS19DT1VOVDsKK3N0YXRpYyBpbnQgY3Vyc29yX3N0YXRlID0gMDsKKyNlbmRpZgorCisvKiBsb2NhbHMgKi8KKworc3RhdGljIGludCAga2JkX2lucHV0ICAgID0gLTE7ICAgICAgICAgIC8qIG5vIGlucHV0IHlldCAqLworc3RhdGljIGludCAga2JkX21hcHBpbmcgID0gS0JEX1VTOyAgICAgIC8qIGRlZmF1bHQgVVMga2V5Ym9hcmQgKi8KK3N0YXRpYyBpbnQgIGtiZF9mbGFncyAgICA9IE5PUk1BTDsgICAgICAvKiBhZnRlciByZXNldCAqLworc3RhdGljIGludCAga2JkX3N0YXRlICAgID0gMDsgICAgICAgICAgIC8qIHVuc2hpZnQgY29kZSAqLworCitzdGF0aWMgdm9pZCBrYmRfY29udl9jaGFyICh1bnNpZ25lZCBjaGFyIHNjYW5fY29kZSk7CitzdGF0aWMgdm9pZCBrYmRfbGVkX3NldCAodm9pZCk7CitzdGF0aWMgdm9pZCBrYmRfbm9ybWFsICh1bnNpZ25lZCBjaGFyIHNjYW5fY29kZSk7CitzdGF0aWMgdm9pZCBrYmRfc2hpZnQgKHVuc2lnbmVkIGNoYXIgc2Nhbl9jb2RlKTsKK3N0YXRpYyB2b2lkIGtiZF9jdHJsICh1bnNpZ25lZCBjaGFyIHNjYW5fY29kZSk7CitzdGF0aWMgdm9pZCBrYmRfbnVtICh1bnNpZ25lZCBjaGFyIHNjYW5fY29kZSk7CitzdGF0aWMgdm9pZCBrYmRfY2FwcyAodW5zaWduZWQgY2hhciBzY2FuX2NvZGUpOworc3RhdGljIHZvaWQga2JkX3Njcm9sbCAodW5zaWduZWQgY2hhciBzY2FuX2NvZGUpOworc3RhdGljIHZvaWQga2JkX2FsdCAodW5zaWduZWQgY2hhciBzY2FuX2NvZGUpOworc3RhdGljIGludCAga2JkX2lucHV0X2VtcHR5ICh2b2lkKTsKK3N0YXRpYyBpbnQgIGtiZF9yZXNldCAodm9pZCk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtiZF9mY3RfbWFwIFsxNDRdID0KKyAgICB7IC8qIGtiZF9mY3RfbWFwIHRhYmxlIGZvciBzY2FuIGNvZGUgKi8KKyAgICAwLCAgIEFTLCAgIEFTLCAgIEFTLCAgIEFTLCAgIEFTLCAgIEFTLCAgIEFTLCAvKiBzY2FuICAwLSA3ICovCisgICBBUywgICBBUywgICBBUywgICBBUywgICBBUywgICBBUywgICBBUywgICBBUywgLyogc2NhbiAgOC0gRiAqLworICAgQVMsICAgQVMsICAgQVMsICAgQVMsICAgQVMsICAgQVMsICAgQVMsICAgQVMsIC8qIHNjYW4gMTAtMTcgKi8KKyAgIEFTLCAgIEFTLCAgIEFTLCAgIEFTLCAgIEFTLCAgIENOLCAgIEFTLCAgIEFTLCAvKiBzY2FuIDE4LTFGICovCisgICBBUywgICBBUywgICBBUywgICBBUywgICBBUywgICBBUywgICBBUywgICBBUywgLyogc2NhbiAyMC0yNyAqLworICAgQVMsICAgQVMsICAgU0gsICAgQVMsICAgQVMsICAgQVMsICAgQVMsICAgQVMsIC8qIHNjYW4gMjgtMkYgKi8KKyAgIEFTLCAgIEFTLCAgIEFTLCAgIEFTLCAgIEFTLCAgIEFTLCAgIFNILCAgIEFTLCAvKiBzY2FuIDMwLTM3ICovCisgICBBUywgICBBUywgICBDUCwgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAgMCwgLyogc2NhbiAzOC0zRiAqLworICAgIDAsICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgTk0sICAgU1QsICAgRVMsIC8qIHNjYW4gNDAtNDcgKi8KKyAgIEVTLCAgIEVTLCAgIEVTLCAgIEVTLCAgIEVTLCAgIEVTLCAgIEVTLCAgIEVTLCAvKiBzY2FuIDQ4LTRGICovCisgICBFUywgICBFUywgICBFUywgICBFUywgICAwLCAgICAwLCAgICBBUywgICAgMCwgLyogc2NhbiA1MC01NyAqLworICAgIDAsICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgIDAsIC8qIHNjYW4gNTgtNUYgKi8KKyAgICAwLCAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgICAwLCAvKiBzY2FuIDYwLTY3ICovCisgICAgMCwgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAgMCwgLyogc2NhbiA2OC02RiAqLworICAgQVMsICAgMCwgICAgMCwgICAgQVMsICAgMCwgICAgMCwgICAgQVMsICAgIDAsIC8qIHNjYW4gNzAtNzcgKi8KKyAgICAwLCAgIEFTLCAgIDAsICAgIDAsICAgIDAsICAgIEFTLCAgIDAsICAgICAwLCAvKiBzY2FuIDc4LTdGICovCisgICBBUywgICBDTiwgICBBUywgICBBUywgICBBSywgICBTVCwgICBFWCwgICBFWCwgLyogZW5oYW5jZWQgICAqLworICAgQVMsICAgRVgsICAgRVgsICAgQVMsICAgRVgsICAgQVMsICAgRVgsICAgRVggIC8qIGVuaGFuY2VkICAgKi8KKyAgICB9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBrYmRfa2V5X21hcCBbMl1bNV1bMTQ0XSA9CisgICAgeworICAgIHsgLyogVVMga2V5Ym9hcmQgKi8KKyAgICB7IC8qIHVuc2hpZnQgY29kZSAqLworICAgIDAsICAweDFiLCAgICcxJywgICAnMicsICAgJzMnLCAgICc0JywgICAnNScsICAgJzYnLCAgICAvKiBzY2FuICAwLSA3ICovCisgICc3JywgICAnOCcsICAgJzknLCAgICcwJywgICAnLScsICAgJz0nLCAgMHgwOCwgICdcdCcsICAgIC8qIHNjYW4gIDgtIEYgKi8KKyAgJ3EnLCAgICd3JywgICAnZScsICAgJ3InLCAgICd0JywgICAneScsICAgJ3UnLCAgICdpJywgICAgLyogc2NhbiAxMC0xNyAqLworICAnbycsICAgJ3AnLCAgICdbJywgICAnXScsICAnXHInLCAgIENOLCAgICAnYScsICAgJ3MnLCAgICAvKiBzY2FuIDE4LTFGICovCisgICdkJywgICAnZicsICAgJ2cnLCAgICdoJywgICAnaicsICAgJ2snLCAgICdsJywgICAnOycsICAgIC8qIHNjYW4gMjAtMjcgKi8KKyAnXCcnLCAgICdgJywgICBTSCwgICAnXFwnLCAgICd6JywgICAneCcsICAgJ2MnLCAgICd2JywgICAgLyogc2NhbiAyOC0yRiAqLworICAnYicsICAgJ24nLCAgICdtJywgICAnLCcsICAgJy4nLCAgICcvJywgICBTSCwgICAgJyonLCAgICAvKiBzY2FuIDMwLTM3ICovCisgICcgJywgICAnICcsICAgQ1AsICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIC8qIHNjYW4gMzgtM0YgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICBOTSwgICAgU1QsICAgICc3JywgICAgLyogc2NhbiA0MC00NyAqLworICAnOCcsICAgJzknLCAgICctJywgICAnNCcsICAgJzUnLCAgICc2JywgICAnKycsICAgJzEnLCAgICAvKiBzY2FuIDQ4LTRGICovCisgICcyJywgICAnMycsICAgJzAnLCAgICcuJywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIC8qIHNjYW4gNTAtNTcgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgLyogc2NhbiA1OC01RiAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAvKiBzY2FuIDYwLTY3ICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIC8qIHNjYW4gNjgtNkYgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgLyogc2NhbiA3MC03NyAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAvKiBzY2FuIDc4LTdGICovCisgICdccicsICAgQ04sICAgJy8nLCAgICcqJywgICAnICcsICAgIFNULCAgICdGJywgICAnQScsICAgIC8qIGV4dGVuZGVkICovCisgICAgMCwgICAnRCcsICAgJ0MnLCAgICAgMCwgICAnQicsICAgICAwLCAgICAnQCcsICAnUCcgICAgIC8qIGV4dGVuZGVkICovCisgICAgfSwKKyAgICB7IC8qIHNoaWZ0IGNvZGUgKi8KKyAgICAwLCAgMHgxYiwgICAnIScsICAgJ0AnLCAgICcjJywgICAnJCcsICAgJyUnLCAgICdeJywgICAgLyogc2NhbiAgMC0gNyAqLworICAnJicsICAgJyonLCAgICcoJywgICAnKScsICAgJ18nLCAgICcrJywgIDB4MDgsICAnXHQnLCAgICAvKiBzY2FuICA4LSBGICovCisgICdRJywgICAnVycsICAgJ0UnLCAgICdSJywgICAnVCcsICAgJ1knLCAgICdVJywgICAnSScsICAgIC8qIHNjYW4gMTAtMTcgKi8KKyAgJ08nLCAgICdQJywgICAneycsICAgJ30nLCAgJ1xyJywgICBDTiwgICAgJ0EnLCAgICdTJywgICAgLyogc2NhbiAxOC0xRiAqLworICAnRCcsICAgJ0YnLCAgICdHJywgICAnSCcsICAgJ0onLCAgICdLJywgICAnTCcsICAgJzonLCAgICAvKiBzY2FuIDIwLTI3ICovCisgICciJywgICAnficsICAgU0gsICAgICd8JywgICAnWicsICAgJ1gnLCAgICdDJywgICAnVicsICAgIC8qIHNjYW4gMjgtMkYgKi8KKyAgJ0InLCAgICdOJywgICAnTScsICAgJzwnLCAgICc+JywgICAnPycsICAgU0gsICAgICcqJywgICAgLyogc2NhbiAzMC0zNyAqLworICAnICcsICAgJyAnLCAgIENQLCAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAvKiBzY2FuIDM4LTNGICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgTk0sICAgIFNULCAgICAnNycsICAgIC8qIHNjYW4gNDAtNDcgKi8KKyAgJzgnLCAgICc5JywgICAnLScsICAgJzQnLCAgICc1JywgICAnNicsICAgJysnLCAgICcxJywgICAgLyogc2NhbiA0OC00RiAqLworICAnMicsICAgJzMnLCAgICcwJywgICAnLicsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAvKiBzY2FuIDUwLTU3ICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIC8qIHNjYW4gNTgtNUYgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgLyogc2NhbiA2MC02NyAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAvKiBzY2FuIDY4LTZGICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIC8qIHNjYW4gNzAtNzcgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgLyogc2NhbiA3OC03RiAqLworICAnXHInLCAgIENOLCAgICcvJywgICAnKicsICAgJyAnLCAgICBTVCwgICAnRicsICAgJ0EnLCAgICAvKiBleHRlbmRlZCAqLworICAgIDAsICAgJ0QnLCAgICdDJywgICAgIDAsICAgJ0InLCAgICAgMCwgICAnQCcsICAgJ1AnICAgICAvKiBleHRlbmRlZCAqLworICAgIH0sCisgICAgeyAvKiBjb250cm9sIGNvZGUgKi8KKyAweGZmLCAgMHgxYiwgIDB4ZmYsICAweDAwLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgICAgLyogc2NhbiAgMC0gNyAqLworIDB4MWUsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweDFmLCAgMHhmZiwgIDB4ZmYsICAnXHQnLCAgICAvKiBzY2FuICA4LSBGICovCisgMHgxMSwgIDB4MTcsICAweDA1LCAgMHgxMiwgIDB4MTQsICAweDE5LCAgMHgxNSwgIDB4MDksICAgIC8qIHNjYW4gMTAtMTcgKi8KKyAweDBmLCAgMHgxMCwgIDB4MWIsICAweDFkLCAgJ1xyJywgICBDTiwgICAweDAxLCAgMHgxMywgICAgLyogc2NhbiAxOC0xRiAqLworIDB4MDQsICAweDA2LCAgMHgwNywgIDB4MDgsICAweDBhLCAgMHgwYiwgIDB4MGMsICAweGZmLCAgICAvKiBzY2FuIDIwLTI3ICovCisgMHhmZiwgIDB4MWMsICAgU0gsICAgMHhmZiwgIDB4MWEsICAweDE4LCAgMHgwMywgIDB4MTYsICAgIC8qIHNjYW4gMjgtMkYgKi8KKyAweDAyLCAgMHgwZSwgIDB4MGQsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAgU0gsICAgMHhmZiwgICAgLyogc2NhbiAzMC0zNyAqLworIDB4ZmYsICAweGZmLCAgIENQLCAgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgICAvKiBzY2FuIDM4LTNGICovCisgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAgTk0sICAgIFNULCAgIDB4ZmYsICAgIC8qIHNjYW4gNDAtNDcgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgICAgLyogc2NhbiA0OC00RiAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgICAvKiBzY2FuIDUwLTU3ICovCisgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAgIC8qIHNjYW4gNTgtNUYgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgICAgLyogc2NhbiA2MC02NyAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgICAvKiBzY2FuIDY4LTZGICovCisgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAgIC8qIHNjYW4gNzAtNzcgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgICAgLyogc2NhbiA3OC03RiAqLworICAnXHInLCAgIENOLCAgICcvJywgICAnKicsICAgJyAnLCAgICBTVCwgIDB4ZmYsICAweGZmLCAgICAvKiBleHRlbmRlZCAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmICAgICAvKiBleHRlbmRlZCAqLworICAgIH0sCisgICAgeyAvKiBub24gbnVtZXJpYyBjb2RlICovCisgICAgMCwgIDB4MWIsICAgJzEnLCAgICcyJywgICAnMycsICAgJzQnLCAgICc1JywgICAnNicsICAgIC8qIHNjYW4gIDAtIDcgKi8KKyAgJzcnLCAgICc4JywgICAnOScsICAgJzAnLCAgICctJywgICAnPScsICAweDA4LCAgJ1x0JywgICAgLyogc2NhbiAgOC0gRiAqLworICAncScsICAgJ3cnLCAgICdlJywgICAncicsICAgJ3QnLCAgICd5JywgICAndScsICAgJ2knLCAgICAvKiBzY2FuIDEwLTE3ICovCisgICdvJywgICAncCcsICAgJ1snLCAgICddJywgICdccicsICAgQ04sICAgICdhJywgICAncycsICAgIC8qIHNjYW4gMTgtMUYgKi8KKyAgJ2QnLCAgICdmJywgICAnZycsICAgJ2gnLCAgICdqJywgICAnaycsICAgJ2wnLCAgICc7JywgICAgLyogc2NhbiAyMC0yNyAqLworICdcJycsICAgJ2AnLCAgIFNILCAgICdcXCcsICAgJ3onLCAgICd4JywgICAnYycsICAgJ3YnLCAgICAvKiBzY2FuIDI4LTJGICovCisgICdiJywgICAnbicsICAgJ20nLCAgICcsJywgICAnLicsICAgJy8nLCAgIFNILCAgICAnKicsICAgIC8qIHNjYW4gMzAtMzcgKi8KKyAgJyAnLCAgICcgJywgICBDUCwgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgLyogc2NhbiAzOC0zRiAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIE5NLCAgICBTVCwgICAgJ3cnLCAgICAvKiBzY2FuIDQwLTQ3ICovCisgICd4JywgICAneScsICAgJ2wnLCAgICd0JywgICAndScsICAgJ3YnLCAgICdtJywgICAncScsICAgIC8qIHNjYW4gNDgtNEYgKi8KKyAgJ3InLCAgICdzJywgICAncCcsICAgJ24nLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgLyogc2NhbiA1MC01NyAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAvKiBzY2FuIDU4LTVGICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIC8qIHNjYW4gNjAtNjcgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgLyogc2NhbiA2OC02RiAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAvKiBzY2FuIDcwLTc3ICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIC8qIHNjYW4gNzgtN0YgKi8KKyAgJ1xyJywgICBDTiwgICAnLycsICAgJyonLCAgICcgJywgICAgU1QsICAgJ0YnLCAgICdBJywgICAgLyogZXh0ZW5kZWQgKi8KKyAgICAwLCAgICdEJywgICAnQycsICAgICAwLCAgICdCJywgICAgIDAsICAgICdAJywgICdQJyAgICAgLyogZXh0ZW5kZWQgKi8KKyAgICB9LAorICAgIHsgLyogcmlnaHQgYWx0IG1vZGUgLSBub3QgdXNlZCBpbiBVUyBrZXlib2FyZCAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuICAwIC0gNyAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuICA4IC0gRiAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDEwIC0xNyAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDE4IC0xRiAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDIwIC0yNyAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDI4IC0yRiAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDMwIC0zNyAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDM4IC0zRiAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDQwIC00NyAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDQ4IC00RiAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDUwIC01NyAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDU4IC01RiAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDYwIC02NyAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDY4IC02RiAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDcwIC03NyAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDc4IC03RiAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBleHRlbmRlZCAgICAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmICAvKiBleHRlbmRlZCAgICAqLworICAgIH0KKyAgICB9LAorICAgIHsgLyogZ2VybWFuIGtleWJvYXJkICovCisgICAgeyAvKiB1bnNoaWZ0IGNvZGUgKi8KKyAgICAwLCAgMHgxYiwgICAnMScsICAgJzInLCAgICczJywgICAnNCcsICAgJzUnLCAgICc2JywgLyogc2NhbiAgMC0gNyAqLworICAnNycsICAgJzgnLCAgICc5JywgICAnMCcsICAweGUxLCAgJ1wnJywgIDB4MDgsICAnXHQnLCAvKiBzY2FuICA4LSBGICovCisgICdxJywgICAndycsICAgJ2UnLCAgICdyJywgICAndCcsICAgJ3onLCAgICd1JywgICAnaScsIC8qIHNjYW4gMTAtMTcgKi8KKyAgJ28nLCAgICdwJywgIDB4ODEsICAgJysnLCAgJ1xyJywgICBDTiwgICAgJ2EnLCAgICdzJywgLyogc2NhbiAxOC0xRiAqLworICAnZCcsICAgJ2YnLCAgICdnJywgICAnaCcsICAgJ2onLCAgICdrJywgICAnbCcsICAweDk0LCAvKiBzY2FuIDIwLTI3ICovCisgMHg4NCwgICAnXicsICAgU0gsICAgICcjJywgICAneScsICAgJ3gnLCAgICdjJywgICAndicsIC8qIHNjYW4gMjgtMkYgKi8KKyAgJ2InLCAgICduJywgICAnbScsICAgJywnLCAgICcuJywgICAnLScsICAgU0gsICAgICcqJywgLyogc2NhbiAzMC0zNyAqLworICAnICcsICAgJyAnLCAgIENQLCAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAvKiBzY2FuIDM4LTNGICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgTk0sICAgIFNULCAgICAnNycsIC8qIHNjYW4gNDAtNDcgKi8KKyAgJzgnLCAgICc5JywgICAnLScsICAgJzQnLCAgICc1JywgICAnNicsICAgJysnLCAgICcxJywgLyogc2NhbiA0OC00RiAqLworICAnMicsICAgJzMnLCAgICcwJywgICAnLCcsICAgICAwLCAgICAgMCwgICAnPCcsICAgICAwLCAvKiBzY2FuIDUwLTU3ICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIC8qIHNjYW4gNTgtNUYgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgLyogc2NhbiA2MC02NyAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAvKiBzY2FuIDY4LTZGICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIC8qIHNjYW4gNzAtNzcgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgLyogc2NhbiA3OC03RiAqLworICAnXHInLCAgIENOLCAgICcvJywgICAnKicsICAgJyAnLCAgICBTVCwgICAnRicsICAgJ0EnLCAvKiBleHRlbmRlZCAqLworICAgIDAsICAgJ0QnLCAgICdDJywgICAgIDAsICAgJ0InLCAgICAgMCwgICAgJ0AnLCAgJ1AnICAvKiBleHRlbmRlZCAqLworICAgIH0sCisgICAgeyAvKiBzaGlmdCBjb2RlICovCisgICAgMCwgIDB4MWIsICAgJyEnLCAgICciJywgIDB4MTUsICAgJyQnLCAgICclJywgICAnJicsIC8qIHNjYW4gIDAtIDcgKi8KKyAgJy8nLCAgICcoJywgICAnKScsICAgJz0nLCAgICc/JywgICAnYCcsICAweDA4LCAgJ1x0JywgLyogc2NhbiAgOC0gRiAqLworICAnUScsICAgJ1cnLCAgICdFJywgICAnUicsICAgJ1QnLCAgICdaJywgICAnVScsICAgJ0knLCAvKiBzY2FuIDEwLTE3ICovCisgICdPJywgICAnUCcsICAweDlhLCAgICcqJywgICdccicsICAgQ04sICAgICdBJywgICAnUycsIC8qIHNjYW4gMTgtMUYgKi8KKyAgJ0QnLCAgICdGJywgICAnRycsICAgJ0gnLCAgICdKJywgICAnSycsICAgJ0wnLCAgMHg5OSwgLyogc2NhbiAyMC0yNyAqLworIDB4OGUsICAweGY4LCAgIFNILCAgICdcJycsICAgJ1knLCAgICdYJywgICAnQycsICAgJ1YnLCAvKiBzY2FuIDI4LTJGICovCisgICdCJywgICAnTicsICAgJ00nLCAgICc7JywgICAnOicsICAgJ18nLCAgIFNILCAgICAnKicsIC8qIHNjYW4gMzAtMzcgKi8KKyAgJyAnLCAgICcgJywgICBDUCwgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgLyogc2NhbiAzOC0zRiAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIE5NLCAgICBTVCwgICAgJzcnLCAvKiBzY2FuIDQwLTQ3ICovCisgICc4JywgICAnOScsICAgJy0nLCAgICc0JywgICAnNScsICAgJzYnLCAgICcrJywgICAnMScsIC8qIHNjYW4gNDgtNEYgKi8KKyAgJzInLCAgICczJywgICAnMCcsICAgJywnLCAgICAgMCwgICAgIDAsICAgJz4nLCAgICAgMCwgLyogc2NhbiA1MC01NyAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAvKiBzY2FuIDU4LTVGICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIC8qIHNjYW4gNjAtNjcgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgLyogc2NhbiA2OC02RiAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAvKiBzY2FuIDcwLTc3ICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIC8qIHNjYW4gNzgtN0YgKi8KKyAgJ1xyJywgICBDTiwgICAnLycsICAgJyonLCAgICcgJywgICAgU1QsICAgJ0YnLCAgICdBJywgLyogZXh0ZW5kZWQgKi8KKyAgICAwLCAgICdEJywgICAnQycsICAgICAwLCAgICdCJywgICAgIDAsICAgJ0AnLCAgICdQJyAgLyogZXh0ZW5kZWQgKi8KKyAgICB9LAorICAgIHsgLyogY29udHJvbCBjb2RlICovCisgMHhmZiwgIDB4MWIsICAweGZmLCAgMHgwMCwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIC8qIHNjYW4gIDAtIDcgKi8KKyAweDFlLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHgxZiwgIDB4ZmYsICAweGZmLCAgJ1x0JywgLyogc2NhbiAgOC0gRiAqLworIDB4MTEsICAweDE3LCAgMHgwNSwgIDB4MTIsICAweDE0LCAgMHgxOSwgIDB4MTUsICAweDA5LCAvKiBzY2FuIDEwLTE3ICovCisgMHgwZiwgIDB4MTAsICAweDFiLCAgMHgxZCwgICdccicsICAgQ04sICAgMHgwMSwgIDB4MTMsIC8qIHNjYW4gMTgtMUYgKi8KKyAweDA0LCAgMHgwNiwgIDB4MDcsICAweDA4LCAgMHgwYSwgIDB4MGIsICAweDBjLCAgMHhmZiwgLyogc2NhbiAyMC0yNyAqLworIDB4ZmYsICAweDFjLCAgIFNILCAgIDB4ZmYsICAweDFhLCAgMHgxOCwgIDB4MDMsICAweDE2LCAvKiBzY2FuIDI4LTJGICovCisgMHgwMiwgIDB4MGUsICAweDBkLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgIFNILCAgIDB4ZmYsIC8qIHNjYW4gMzAtMzcgKi8KKyAweGZmLCAgMHhmZiwgICBDUCwgICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiAzOC0zRiAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgIE5NLCAgICBTVCwgICAweGZmLCAvKiBzY2FuIDQwLTQ3ICovCisgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIC8qIHNjYW4gNDgtNEYgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiA1MC01NyAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDU4LTVGICovCisgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIC8qIHNjYW4gNjAtNjcgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiA2OC02RiAqLworIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAvKiBzY2FuIDcwLTc3ICovCisgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIC8qIHNjYW4gNzgtN0YgKi8KKyAgJ1xyJywgICBDTiwgICAnLycsICAgJyonLCAgICcgJywgICAgU1QsICAweGZmLCAgMHhmZiwgLyogZXh0ZW5kZWQgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiAgLyogZXh0ZW5kZWQgKi8KKyAgICB9LAorICAgIHsgLyogbm9uIG51bWVyaWMgY29kZSAqLworICAgIDAsICAweDFiLCAgICcxJywgICAnMicsICAgJzMnLCAgICc0JywgICAnNScsICAgJzYnLCAvKiBzY2FuICAwLSA3ICovCisgICc3JywgICAnOCcsICAgJzknLCAgICcwJywgIDB4ZTEsICAnXCcnLCAgMHgwOCwgICdcdCcsIC8qIHNjYW4gIDgtIEYgKi8KKyAgJ3EnLCAgICd3JywgICAnZScsICAgJ3InLCAgICd0JywgICAneicsICAgJ3UnLCAgICdpJywgLyogc2NhbiAxMC0xNyAqLworICAnbycsICAgJ3AnLCAgMHg4MSwgICAnKycsICAnXHInLCAgIENOLCAgICAnYScsICAgJ3MnLCAvKiBzY2FuIDE4LTFGICovCisgICdkJywgICAnZicsICAgJ2cnLCAgICdoJywgICAnaicsICAgJ2snLCAgICdsJywgIDB4OTQsIC8qIHNjYW4gMjAtMjcgKi8KKyAweDg0LCAgICdeJywgICBTSCwgICAgICAwLCAgICd5JywgICAneCcsICAgJ2MnLCAgICd2JywgLyogc2NhbiAyOC0yRiAqLworICAnYicsICAgJ24nLCAgICdtJywgICAnLCcsICAgJy4nLCAgICctJywgICBTSCwgICAgJyonLCAvKiBzY2FuIDMwLTM3ICovCisgICcgJywgICAnICcsICAgQ1AsICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIC8qIHNjYW4gMzgtM0YgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICBOTSwgICAgU1QsICAgICd3JywgLyogc2NhbiA0MC00NyAqLworICAneCcsICAgJ3knLCAgICdsJywgICAndCcsICAgJ3UnLCAgICd2JywgICAnbScsICAgJ3EnLCAvKiBzY2FuIDQ4LTRGICovCisgICdyJywgICAncycsICAgJ3AnLCAgICduJywgICAgIDAsICAgICAwLCAgICc8JywgICAgIDAsIC8qIHNjYW4gNTAtNTcgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgLyogc2NhbiA1OC01RiAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAvKiBzY2FuIDYwLTY3ICovCisgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsIC8qIHNjYW4gNjgtNkYgKi8KKyAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgLyogc2NhbiA3MC03NyAqLworICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAvKiBzY2FuIDc4LTdGICovCisgICdccicsICAgQ04sICAgJy8nLCAgICcqJywgICAnICcsICAgIFNULCAgICdGJywgICAnQScsIC8qIGV4dGVuZGVkICovCisgICAgMCwgICAnRCcsICAgJ0MnLCAgICAgMCwgICAnQicsICAgICAwLCAgICAnQCcsICAnUCcgIC8qIGV4dGVuZGVkICovCisgICAgfSwKKyAgICB7IC8qIFJpZ2h0IGFsdCBtb2RlIC0gaXMgdXNlZCBpbiBHZXJtYW4ga2V5Ym9hcmQgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiAgMCAtIDcgKi8KKyAgJ3snLCAgICdbJywgICAnXScsICAgJ30nLCAgJ1xcJywgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiAgOCAtIEYgKi8KKyAgJ0AnLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiAxMCAtMTcgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAgJ34nLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiAxOCAtMUYgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiAyMCAtMjcgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiAyOCAtMkYgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZTYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiAzMCAtMzcgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiAzOCAtM0YgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiA0MCAtNDcgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiA0OCAtNEYgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAgJ3wnLCAgMHhmZiwgLyogc2NhbiA1MCAtNTcgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiA1OCAtNUYgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiA2MCAtNjcgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiA2OCAtNkYgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiA3MCAtNzcgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogc2NhbiA3OCAtN0YgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgLyogZXh0ZW5kZWQgICAgKi8KKyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiAgLyogZXh0ZW5kZWQgICAgKi8KKyAgICB9CisgICAgfQorICAgIH07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGV4dF9rZXlfbWFwIFtdID0KKyAgICB7CisgICAgMHgxYywgICAvKiBrZXlwYWQgZW50ZXIgKi8KKyAgICAweDFkLCAgIC8qIHJpZ2h0IGNvbnRyb2wgKi8KKyAgICAweDM1LCAgIC8qIGtleXBhZCBzbGFzaCAqLworICAgIDB4MzcsICAgLyogcHJpbnQgc2NyZWVuICovCisgICAgMHgzOCwgICAvKiByaWdodCBhbHQgKi8KKyAgICAweDQ2LCAgIC8qIGJyZWFrICovCisgICAgMHg0NywgICAvKiBlZGl0cGFkIGhvbWUgKi8KKyAgICAweDQ4LCAgIC8qIGVkaXRwYWQgdXAgKi8KKyAgICAweDQ5LCAgIC8qIGVkaXRwYWQgcGd1cCAqLworICAgIDB4NGIsICAgLyogZWRpdHBhZCBsZWZ0ICovCisgICAgMHg0ZCwgICAvKiBlZGl0cGFkIHJpZ2h0ICovCisgICAgMHg0ZiwgICAvKiBlZGl0cGFkIGVuZCAqLworICAgIDB4NTAsICAgLyogZWRpdHBhZCBkbiAqLworICAgIDB4NTEsICAgLyogZWRpdHBhZCBwZ2RuICovCisgICAgMHg1MiwgICAvKiBlZGl0cGFkIGlucyAqLworICAgIDB4NTMsICAgLyogZWRpdHBhZCBkZWwgKi8KKyAgICAweDAwICAgIC8qIG1hcCBlbmQgKi8KKyAgICB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGk4MDQyX2tiZF9pbml0IC0gcmVzZXQga2V5Ym9hcmQgYW5kIGluaXQgc3RhdGUgZmxhZ3MKKyAqLworaW50IGk4MDQyX2tiZF9pbml0ICh2b2lkKQoreworICAgIGludCBrZXltYXAsIHRyeTsKKyAgICBjaGFyICpwZW52OworCisgICAgLyogSW5pdCBrZXlib2FyZCBkZXZpY2UgKGRlZmF1bHQgVVMgbGF5b3V0KSAqLworICAgIGtleW1hcCA9IEtCRF9VUzsKKyAgICBpZiAoKHBlbnYgPSBnZXRlbnYgKCJrZXltYXAiKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChzdHJuY21wIChwZW52LCAiZGUiLCAzKSA9PSAwKQorICAgICAgICBrZXltYXAgPSBLQkRfR0VSOworICAgIH0KKworICAgIGZvciAodHJ5ID0gMDsgdHJ5IDwgS0JEX1JFU0VUX1RSSUVTOyB0cnkrKykKKyAgICB7CisgICAgICAgIGlmIChrYmRfcmVzZXQoKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBrYmRfbWFwcGluZyAgID0ga2V5bWFwOworICAgICAgICAgICAga2JkX2ZsYWdzICAgICA9IE5PUk1BTDsKKyAgICAgICAgICAgIGtiZF9zdGF0ZSAgICAgPSAwOworICAgICAgICAgICAga2JkX2xlZF9zZXQoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBpODA0Ml90c3RjIC0gdGVzdCBpZiBrZXlib2FyZCBpbnB1dCBpcyBhdmFpbGFibGUKKyAqICAgICAgICAgICAgICBvcHRpb246IGN1cnNvciBibGlua2luZyBpZiBjYWxsZWQgaW4gYSBsb29wCisgKi8KK2ludCBpODA0Ml90c3RjICh2b2lkKQoreworICAgIHVuc2lnbmVkIGNoYXIgc2Nhbl9jb2RlID0gMDsKKworI2lmZGVmIENPTkZJR19DT05TT0xFX0NVUlNPUgorICAgIGlmICgtLWJsaW5rQ291bnQgPT0gMCkKKyAgICB7CisgICAgICAgIGN1cnNvcl9zdGF0ZSBePSAxOworICAgICAgICBjb25zb2xlX2N1cnNvciAoY3Vyc29yX3N0YXRlKTsKKyAgICAgICAgYmxpbmtDb3VudCA9IENGR19DT05TT0xFX0JMSU5LX0NPVU5UOworICAgICAgICB1ZGVsYXkgKDEwKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICgoaW44IChJODA0Ml9TVEFUVVNfUkVHKSAmIDB4MDEpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNjYW5fY29kZSA9IGluOCAoSTgwNDJfREFUQV9SRUcpOworICAgICAgICBpZiAoc2Nhbl9jb2RlID09IDB4ZmEpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBrYmRfY29udl9jaGFyKHNjYW5fY29kZSk7CisKKyAgICAgICAgaWYgKGtiZF9pbnB1dCAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGk4MDQyX2dldGMgLSB3YWl0IHRpbGwga2V5Ym9hcmQgaW5wdXQgaXMgYXZhaWxhYmxlCisgKiAgICAgICAgICAgICAgb3B0aW9uOiB0dXJuIG9uL29mZiBjdXJzb3Igd2hpbGUgd2FpdGluZworICovCitpbnQgaTgwNDJfZ2V0YyAodm9pZCkKK3sKKyAgICBpbnQgcmV0X2NocjsKKyAgICB1bnNpZ25lZCBjaGFyIHNjYW5fY29kZTsKKworICAgIHdoaWxlIChrYmRfaW5wdXQgPT0gLTEpCisgICAgeworICAgICAgICB3aGlsZSAoKGluOCAoSTgwNDJfU1RBVFVTX1JFRykgJiAweDAxKSA9PSAwKQorICAgICAgICB7CisjaWZkZWYgQ09ORklHX0NPTlNPTEVfQ1VSU09SCisgICAgICAgICAgICBpZiAoLS1ibGlua0NvdW50PT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnNvcl9zdGF0ZSBePSAxOworICAgICAgICAgICAgICAgIGNvbnNvbGVfY3Vyc29yIChjdXJzb3Jfc3RhdGUpOworICAgICAgICAgICAgICAgIGJsaW5rQ291bnQgPSBDRkdfQ09OU09MRV9CTElOS19DT1VOVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVkZWxheSAoMTApOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBzY2FuX2NvZGUgPSBpbjggKEk4MDQyX0RBVEFfUkVHKTsKKworICAgICAgICBpZiAoc2Nhbl9jb2RlICE9IDB4ZmEpCisgICAgICAgIGtiZF9jb252X2NoYXIgKHNjYW5fY29kZSk7CisgICAgfQorICAgIHJldF9jaHIgPSBrYmRfaW5wdXQ7CisgICAga2JkX2lucHV0ID0gLTE7CisgICAgcmV0dXJuIHJldF9jaHI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQga2JkX2NvbnZfY2hhciAodW5zaWduZWQgY2hhciBzY2FuX2NvZGUpCit7CisgICAgaWYgKHNjYW5fY29kZSA9PSAweGUwKQorICAgIHsKKyAgICAgICAga2JkX2ZsYWdzIHw9IEVYVDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGlmIGhpZ2ggYml0IG9mIHNjYW5fY29kZSwgc2V0IGJyZWFrIGZsYWcgKi8KKyAgICBpZiAoc2Nhbl9jb2RlICYgMHg4MCkKKyAgICAgICAga2JkX2ZsYWdzIHw9ICBCUks7CisgICAgZWxzZQorICAgICAgICBrYmRfZmxhZ3MgJj0gfkJSSzsKKworICAgIGlmICgoc2Nhbl9jb2RlID09IDB4ZTEpIHx8IChrYmRfZmxhZ3MgJiBFMSkpCisgICAgeworICAgICAgICBpZiAoc2Nhbl9jb2RlID09IDB4ZTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGtiZF9mbGFncyBePSBCUks7ICAgICAvKiByZXNldCB0aGUgYnJlYWsgZmxhZyAqLworICAgICAgICAgICAga2JkX2ZsYWdzIF49IEUxOyAgICAgIC8qIGJpdHdpc2UgRVhPUiB3aXRoIEUxIGZsYWcgKi8KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2Nhbl9jb2RlICY9IDB4N2Y7CisKKyAgICBpZiAoa2JkX2ZsYWdzICYgRVhUKQorICAgIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAga2JkX2ZsYWdzIF49IEVYVDsKKyAgICAgICAgZm9yIChpPTA7IGV4dF9rZXlfbWFwW2ldOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChleHRfa2V5X21hcFtpXSA9PSBzY2FuX2NvZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2Nhbl9jb2RlID0gMHg4MCArIGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbm90IGZvdW5kID8gKi8KKyAgICAgICAgaWYgKCFleHRfa2V5X21hcFtpXSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGtiZF9mY3RfbWFwIFtzY2FuX2NvZGVdKQorICAgIHsKKyAgICBjYXNlIEFTOiAga2JkX25vcm1hbCAoc2Nhbl9jb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTSDogIGtiZF9zaGlmdCAoc2Nhbl9jb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDTjogIGtiZF9jdHJsIChzY2FuX2NvZGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5NOiAga2JkX251bSAoc2Nhbl9jb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDUDogIGtiZF9jYXBzIChzY2FuX2NvZGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNUOiAga2JkX3Njcm9sbCAoc2Nhbl9jb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBSzogIGtiZF9hbHQgKHNjYW5fY29kZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQga2JkX25vcm1hbCAodW5zaWduZWQgY2hhciBzY2FuX2NvZGUpCit7CisgICAgdW5zaWduZWQgY2hhciBjaHI7CisKKyAgICBpZiAoKGtiZF9mbGFncyAmIEJSSykgPT0gTk9STUFMKQorICAgIHsKKyAgICAgICBjaHIgPSBrYmRfa2V5X21hcCBba2JkX21hcHBpbmddW2tiZF9zdGF0ZV1bc2Nhbl9jb2RlXTsKKyAgICAgICBpZiAoKGNociA9PSAweGZmKSB8fCAoY2hyID09IDB4MDApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiBjYXBzIGxvY2sgY29udmVydCB1cHBlciB0byBsb3dlciAqLworICAgICAgICBpZiAoKChrYmRfZmxhZ3MgJiBDQVBTKSA9PSBDQVBTKSAmJiAoY2hyID49ICdhJyAmJiBjaHIgPD0gJ3onKSkKKyAgICAgICB7CisgICAgICAgICAgIGNociAtPSAnYScgLSAnQSc7CisgICAgICAgfQorICAgICAgIGtiZF9pbnB1dCA9IGNocjsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQga2JkX3NoaWZ0ICh1bnNpZ25lZCBjaGFyIHNjYW5fY29kZSkKK3sKKyAgICBpZiAoKGtiZF9mbGFncyAmIEJSSykgPT0gQlJLKQorICAgIHsKKyAgICAgICAga2JkX3N0YXRlID0gQVM7CisgICAgICAgIGtiZF9mbGFncyAmPSAoflNISUZUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICBrYmRfc3RhdGUgPSBTSDsKKyAgICAgICBrYmRfZmxhZ3MgfD0gU0hJRlQ7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGtiZF9jdHJsICh1bnNpZ25lZCBjaGFyIHNjYW5fY29kZSkKK3sKKyAgICBpZiAoKGtiZF9mbGFncyAmIEJSSykgPT0gQlJLKQorICAgIHsKKyAgICAgICBrYmRfc3RhdGUgPSBBUzsKKyAgICAgICBrYmRfZmxhZ3MgJj0gKH5DVFJMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICBrYmRfc3RhdGUgPSBDTjsKKyAgICAgICBrYmRfZmxhZ3MgfD0gQ1RSTDsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQga2JkX2NhcHMgKHVuc2lnbmVkIGNoYXIgc2Nhbl9jb2RlKQoreworICAgIGlmICgoa2JkX2ZsYWdzICYgQlJLKSA9PSBOT1JNQUwpCisgICAgeworICAgICAgIGtiZF9mbGFncyBePSBDQVBTOworICAgICAgIGtiZF9sZWRfc2V0ICgpOyAgICAgICAgICAgIC8qIHVwZGF0ZSBrZXlib2FyZCBMRUQgKi8KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQga2JkX251bSAodW5zaWduZWQgY2hhciBzY2FuX2NvZGUpCit7CisgICAgaWYgKChrYmRfZmxhZ3MgJiBCUkspID09IE5PUk1BTCkKKyAgICB7CisgICAgICAga2JkX2ZsYWdzIF49IE5VTTsKKyAgICAgICBrYmRfc3RhdGUgPSAoa2JkX2ZsYWdzICYgTlVNKSA/IEFTIDogTk07CisgICAgICAga2JkX2xlZF9zZXQgKCk7ICAgICAgICAgICAgLyogdXBkYXRlIGtleWJvYXJkIExFRCAqLworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBrYmRfc2Nyb2xsICh1bnNpZ25lZCBjaGFyIHNjYW5fY29kZSkKK3sKKyAgICBpZiAoKGtiZF9mbGFncyAmIEJSSykgPT0gTk9STUFMKQorICAgIHsKKyAgICAgICAga2JkX2ZsYWdzIF49IFNUUDsKKyAgICAgICAga2JkX2xlZF9zZXQgKCk7ICAgICAgICAgICAgLyogdXBkYXRlIGtleWJvYXJkIExFRCAqLworICAgICAgICBpZiAoa2JkX2ZsYWdzICYgU1RQKQorICAgICAgICAgICAga2JkX2lucHV0ID0gMHgxMzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAga2JkX2lucHV0ID0gMHgxMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGtiZF9hbHQgKHVuc2lnbmVkIGNoYXIgc2Nhbl9jb2RlKQoreworICAgIGlmICgoa2JkX2ZsYWdzICYgQlJLKSA9PSBCUkspCisgICAgeworICAgICAgICBrYmRfc3RhdGUgPSBBUzsKKyAgICAgICAga2JkX2ZsYWdzICY9ICh+QUxUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAga2JkX3N0YXRlID0gQUs7CisgICAgICAgIGtiZF9mbGFncyAmPSBBTFQ7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGtiZF9sZWRfc2V0ICh2b2lkKQoreworICAgIGtiZF9pbnB1dF9lbXB0eSgpOworICAgIG91dDggKEk4MDQyX0RBVEFfUkVHLCAweGVkKTsgICAgICAgIC8qIFNFVCBMRUQgY29tbWFuZCAqLworICAgIGtiZF9pbnB1dF9lbXB0eSgpOworICAgIG91dDggKEk4MDQyX0RBVEFfUkVHLCAoa2JkX2ZsYWdzICYgMHg3KSk7ICAgIC8qIExFRCBiaXRzIG9ubHkgKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGtiZF9pbnB1dF9lbXB0eSAodm9pZCkKK3sKKyAgICBpbnQga2JkVGltZW91dCA9IEtCRF9USU1FT1VUOworCisgICAgLyogd2FpdCBmb3IgaW5wdXQgYnVmIGVtcHR5ICovCisgICAgd2hpbGUgKChpbjggKEk4MDQyX1NUQVRVU19SRUcpICYgMHgwMikgJiYga2JkVGltZW91dC0tKQorICAgICAgICB1ZGVsYXkoMTAwMCk7CisKKyAgICByZXR1cm4ga2JkVGltZW91dDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBrYmRfcmVzZXQgKHZvaWQpCit7CisgICAgaWYgKGtiZF9pbnB1dF9lbXB0eSgpID09IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIG91dDggKEk4MDQyX0RBVEFfUkVHLCAweGZmKTsKKworICAgIHVkZWxheSgyNTAwMDApOworCisgICAgaWYgKGtiZF9pbnB1dF9lbXB0eSgpID09IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIG91dDggKEk4MDQyX0RBVEFfUkVHLCAweDYwKTsKKworICAgIGlmIChrYmRfaW5wdXRfZW1wdHkoKSA9PSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBvdXQ4IChJODA0Ml9EQVRBX1JFRywgMHg0NSk7CisKKworICAgIGlmIChrYmRfaW5wdXRfZW1wdHkoKSA9PSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBvdXQ4IChJODA0Ml9DT01NQU5EX1JFRywgMHhhZSk7CisKKyAgICBpZiAoa2JkX2lucHV0X2VtcHR5KCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfSTgwNDJfS0JEICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25zODczMDguYyBiL2RyaXZlcnMvbnM4NzMwOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNGQzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25zODczMDguYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogUm9iIFRheWxvciwgRmx5aW5nIFBpZyBTeXN0ZW1zLiByb2J0QGZseWluZ3BpZy5jb20uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgQ0ZHX05TODczMDgKKworI2luY2x1ZGUgPG5zODczMDguaD4KKwordm9pZCBpbml0aWFsaXNlX25zODczMDggKHZvaWQpCit7CisjaWZkZWYgQ0ZHX05TODczMDhfUFMyTU9ECisJdW5zaWduZWQgY2hhciBkYXRhOworCisJLyoKKwkgKiBTd2l0Y2ggZmxvcHB5IGRyaXZlIHRvIFBTLzIgbW9kZS4KKwkgKi8KKwlyZWFkX3BucF9jb25maWcoU1VQT0VSSU9fQ09ORjEsICZkYXRhKTsKKwlkYXRhICY9IDB4RkI7CisJd3JpdGVfcG5wX2NvbmZpZyhTVVBPRVJJT19DT05GMSwgZGF0YSk7CisjZW5kaWYKKworI2lmIChDRkdfTlM4NzMwOF9ERVZTICYgQ0ZHX05TODczMDhfS0JDMSkKKwlQTlBfU0VUX0RFVklDRV9CQVNFKExERVZfS0JDMSwgQ0ZHX05TODczMDhfS0JDMV9CQVNFKTsKKwl3cml0ZV9wbnBfY29uZmlnKExVTl9DT05GSUdfUkVHLCAwKTsKKwl3cml0ZV9wbnBfY29uZmlnKENCQVNFX0hJR0gsIDB4MDApOworCXdyaXRlX3BucF9jb25maWcoQ0JBU0VfTE9XLCAweDY0KTsKKyNlbmRpZgorCisjaWYgKENGR19OUzg3MzA4X0RFVlMgJiBDRkdfTlM4NzMwOF9NT1VTRSkKKwlQTlBfQUNUSVZBVEVfREVWSUNFKExERVZfTU9VU0UpOworI2VuZGlmCisKKyNpZiAoQ0ZHX05TODczMDhfREVWUyAmIENGR19OUzg3MzA4X1JUQ19BUEMpCisJUE5QX1NFVF9ERVZJQ0VfQkFTRShMREVWX1JUQ19BUEMsIENGR19OUzg3MzA4X1JUQ19CQVNFKTsKKyNlbmRpZgorCisjaWYgKENGR19OUzg3MzA4X0RFVlMgJiBDRkdfTlM4NzMwOF9GREMpCisJUE5QX1NFVF9ERVZJQ0VfQkFTRShMREVWX0ZEQywgQ0ZHX05TODczMDhfRkRDX0JBU0UpOworCXdyaXRlX3BucF9jb25maWcoTFVOX0NPTkZJR19SRUcsIDB4NDApOworI2VuZGlmCisKKyNpZiAoQ0ZHX05TODczMDhfREVWUyAmIENGR19OUzg3MzA4X1JBUlApCisJUE5QX1NFVF9ERVZJQ0VfQkFTRShMREVWX1BBUlAsIENGR19OUzg3MzA4X0xQVF9CQVNFKTsKKyNlbmRpZgorCisjaWYgKENGR19OUzg3MzA4X0RFVlMgJiBDRkdfTlM4NzMwOF9VQVJUMSkKKwlQTlBfU0VUX0RFVklDRV9CQVNFKExERVZfVUFSVDEsIENGR19OUzg3MzA4X1VBUlQxX0JBU0UpOworI2VuZGlmCisKKyNpZiAoQ0ZHX05TODczMDhfREVWUyAmIENGR19OUzg3MzA4X1VBUlQyKQorCVBOUF9TRVRfREVWSUNFX0JBU0UoTERFVl9VQVJUMiwgQ0ZHX05TODczMDhfVUFSVDJfQkFTRSk7CisjZW5kaWYKKworI2lmIChDRkdfTlM4NzMwOF9ERVZTICYgQ0ZHX05TODczMDhfR1BJTykKKwlQTlBfU0VUX0RFVklDRV9CQVNFKExERVZfR1BJTywgQ0ZHX05TODczMDhfR1BJT19CQVNFKTsKKyNlbmRpZgorCisjaWYgKENGR19OUzg3MzA4X0RFVlMgJiBDRkdfTlM4NzMwOF9QT1dSTUFOKQorI2lmbmRlZiBDRkdfTlM4NzMwOF9QV01BTl9CQVNFCisJUE5QX0FDVElWQVRFX0RFVklDRShMREVWX1BPV1JNQU4pOworI2Vsc2UKKwlQTlBfU0VUX0RFVklDRV9CQVNFKExERVZfUE9XUk1BTiwgQ0ZHX05TODczMDhfUFdNQU5fQkFTRSk7CisKKwkvKgorCSAqIEVuYWJsZSBhbGwgdW5pdHMKKwkgKi8KKwl3cml0ZV9wbV9yZWcoQ0ZHX05TODczMDhfUFdNQU5fQkFTRSwgUFdNX0ZFUjEsIDB4N2QpOworCXdyaXRlX3BtX3JlZyhDRkdfTlM4NzMwOF9QV01BTl9CQVNFLCBQV01fRkVSMiwgMHg4Nyk7CisKKyNpZmRlZiBDRkdfTlM4NzMwOF9QTUMxCisJd3JpdGVfcG1fcmVnKENGR19OUzg3MzA4X1BXTUFOX0JBU0UsIFBXTV9QTUMxLCBDRkdfTlM4NzMwOF9QTUMxKTsKKyNlbmRpZgorCisjaWZkZWYgQ0ZHX05TODczMDhfUE1DMgorCXdyaXRlX3BtX3JlZyhDRkdfTlM4NzMwOF9QV01BTl9CQVNFLCBQV01fUE1DMiwgQ0ZHX05TODczMDhfUE1DMik7CisjZW5kaWYKKworI2lmZGVmIENGR19OUzg3MzA4X1BNQzMKKwl3cml0ZV9wbV9yZWcoQ0ZHX05TODczMDhfUFdNQU5fQkFTRSwgUFdNX1BNQzMsIENGR19OUzg3MzA4X1BNQzMpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgQ0ZHX05TODczMDhfQ1MwX0JBU0UKKwlQTlBfUEdDU19DU0xJTkVfQkFTRSgwLCBDRkdfTlM4NzMwOF9DUzBfQkFTRSk7CisJUE5QX1BHQ1NfQ1NMSU5FX0NPTkYoMCwgQ0ZHX05TODczMDhfQ1MwX0NPTkYpOworI2VuZGlmCisKKyNpZmRlZiBDRkdfTlM4NzMwOF9DUzFfQkFTRQorCVBOUF9QR0NTX0NTTElORV9CQVNFKDEsIENGR19OUzg3MzA4X0NTMV9CQVNFKTsKKwlQTlBfUEdDU19DU0xJTkVfQ09ORigxLCBDRkdfTlM4NzMwOF9DUzFfQ09ORik7CisjZW5kaWYKKworI2lmZGVmIENGR19OUzg3MzA4X0NTMl9CQVNFCisJUE5QX1BHQ1NfQ1NMSU5FX0JBU0UoMiwgQ0ZHX05TODczMDhfQ1MyX0JBU0UpOworCVBOUF9QR0NTX0NTTElORV9DT05GKDIsIENGR19OUzg3MzA4X0NTMl9DT05GKTsKKyNlbmRpZgorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpLmMgYi9kcml2ZXJzL3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTg0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjaS5jCkBAIC0wLDAgKzEsNTAzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogQW5kcmVhcyBIZXBwZWwgPGFoZXBwZWxAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBQQ0kgcm91dGluZXMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfUENJCisKKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8Y21kX2Jvb3QuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8cGNpLmg+CisKKyNpZmRlZiBERUJVRworI2RlZmluZSBERUJVR0YoeC4uLikgcHJpbnRmKHgpCisjZWxzZQorI2RlZmluZSBERUJVR0YoeC4uLikKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKgorICoKKyAqLworCisjZGVmaW5lIFBDSV9IT1NFX09QKHJ3LCBzaXplLCB0eXBlKQkJCQkJCVwKK2ludCBwY2lfaG9zZV8jI3J3IyNfY29uZmlnXyMjc2l6ZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIAkJCVwKKwkJCQkgIHBjaV9kZXZfdCBkZXYsIAkJCQlcCisJCQkJICBpbnQgb2Zmc2V0LCB0eXBlIHZhbHVlKQkJCVwKK3sJCQkJCQkJCQkJXAorCXJldHVybiBob3NlLT5ydyMjXyMjc2l6ZShob3NlLCBkZXYsIG9mZnNldCwgdmFsdWUpOwkJCVwKK30KKworUENJX0hPU0VfT1AocmVhZCwgYnl0ZSwgdTggKikKK1BDSV9IT1NFX09QKHJlYWQsIHdvcmQsIHUxNiAqKQorUENJX0hPU0VfT1AocmVhZCwgZHdvcmQsIHUzMiAqKQorUENJX0hPU0VfT1Aod3JpdGUsIGJ5dGUsIHU4KQorUENJX0hPU0VfT1Aod3JpdGUsIHdvcmQsIHUxNikKK1BDSV9IT1NFX09QKHdyaXRlLCBkd29yZCwgdTMyKQorCisjZGVmaW5lIFBDSV9PUChydywgc2l6ZSwgdHlwZSwgZXJyb3JfY29kZSkJCQkJCVwKK2ludCBwY2lfIyNydyMjX2NvbmZpZ18jI3NpemUocGNpX2Rldl90IGRldiwgaW50IG9mZnNldCwgdHlwZSB2YWx1ZSkJCVwKK3sJCQkJCQkJCQkJXAorCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zZShQQ0lfQlVTKGRldikpOwkJXAorCQkJCQkJCQkJCVwKKwlpZiAoIWhvc2UpCQkJCQkJCQlcCisJewkJCQkJCQkJCVwKKwkJZXJyb3JfY29kZTsJCQkJCQkJXAorCQlyZXR1cm4gLTE7CQkJCQkJCVwKKwl9CQkJCQkJCQkJXAorCQkJCQkJCQkJCVwKKwlyZXR1cm4gcGNpX2hvc2VfIyNydyMjX2NvbmZpZ18jI3NpemUoaG9zZSwgZGV2LCBvZmZzZXQsIHZhbHVlKTsJCVwKK30KKworUENJX09QKHJlYWQsIGJ5dGUsIHU4ICosICp2YWx1ZSA9IDB4ZmYpCitQQ0lfT1AocmVhZCwgd29yZCwgdTE2ICosICp2YWx1ZSA9IDB4ZmZmZikKK1BDSV9PUChyZWFkLCBkd29yZCwgdTMyICosICp2YWx1ZSA9IDB4ZmZmZmZmZmYpCitQQ0lfT1Aod3JpdGUsIGJ5dGUsIHU4LCApCitQQ0lfT1Aod3JpdGUsIHdvcmQsIHUxNiwgKQorUENJX09QKHdyaXRlLCBkd29yZCwgdTMyLCApCisKKyNkZWZpbmUgUENJX1JFQURfVklBX0RXT1JEX09QKHNpemUsIHR5cGUsIG9mZl9tYXNrKQkJCQlcCitpbnQgcGNpX2hvc2VfcmVhZF9jb25maWdfIyNzaXplIyNfdmlhX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwJXAorCQkJCQlwY2lfZGV2X3QgZGV2LCAJCQkJXAorCQkJCQlpbnQgb2Zmc2V0LCB0eXBlIHZhbCkJCQlcCit7CQkJCQkJCQkJCVwKKwl1MzIgdmFsMzI7CQkJCQkJCQlcCisJCQkJCQkJCQkJXAorCWlmIChwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIG9mZnNldCAmIDB4ZmMsICZ2YWwzMikgPCAwKQlcCisJCXJldHVybiAtMTsJCQkJCQkJXAorCQkJCQkJCQkJCVwKKwkqdmFsID0gKHZhbDMyID4+ICgob2Zmc2V0ICYgKGludClvZmZfbWFzaykgKiA4KSk7CQkJXAorCQkJCQkJCQkJCVwKKwlyZXR1cm4gMDsJCQkJCQkJCVwKK30KKworI2RlZmluZSBQQ0lfV1JJVEVfVklBX0RXT1JEX09QKHNpemUsIHR5cGUsIG9mZl9tYXNrLCB2YWxfbWFzaykJCQlcCitpbnQgcGNpX2hvc2Vfd3JpdGVfY29uZmlnXyMjc2l6ZSMjX3ZpYV9kd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCVwKKwkJCQkJICAgICBwY2lfZGV2X3QgZGV2LCAJCQlcCisJCQkJCSAgICAgaW50IG9mZnNldCwgdHlwZSB2YWwpCQlcCit7CQkJCQkJCQkJCVwKKwl1MzIgdmFsMzIsIG1hc2ssIGxkYXRhOwkJCQkJCQlcCisJCQkJCQkJCQkJXAorCWlmIChwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIG9mZnNldCAmIDB4ZmMsICZ2YWwzMikgPCAwKQlcCisJCXJldHVybiAtMTsJCQkJCQkJXAorCQkJCQkJCQkJCVwKKwltYXNrID0gdmFsX21hc2s7CQkJCQkJCVwKKwlsZGF0YSA9ICgoKHVuc2lnbmVkIGxvbmcpdmFsKSAmIG1hc2spIDw8ICgob2Zmc2V0ICYgKGludClvZmZfbWFzaykgKiA4KTtcCisJbWFzayA8PD0gKChtYXNrICYgKGludClvZmZfbWFzaykgKiA4KTsJCQkJCVwKKwl2YWwzMiA9ICh2YWwzMiAmIH5tYXNrKSB8IGxkYXRhOwkJCQkJXAorCQkJCQkJCQkJCVwKKwlpZiAocGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgb2Zmc2V0ICYgMHhmYywgdmFsMzIpIDwgMCkJXAorCQlyZXR1cm4gLTE7CQkJCQkJCVwKKwkJCQkJCQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCQlcCit9CisKK1BDSV9SRUFEX1ZJQV9EV09SRF9PUChieXRlLCB1OCAqLCAweDAzKQorUENJX1JFQURfVklBX0RXT1JEX09QKHdvcmQsIHUxNiAqLCAweDAyKQorUENJX1dSSVRFX1ZJQV9EV09SRF9PUChieXRlLCB1OCwgMHgwMywgMHgwMDAwMDBmZikKK1BDSV9XUklURV9WSUFfRFdPUkRfT1Aod29yZCwgdTE2LCAweDAyLCAweDAwMDBmZmZmKQorCisvKgorICoKKyAqLworCitzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlX2hlYWQgPSBOVUxMOworCit2b2lkIHBjaV9yZWdpc3Rlcl9ob3NlKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKipwaG9zZSA9ICZob3NlX2hlYWQ7CisKKwl3aGlsZSgqcGhvc2UpCisJCXBob3NlID0gJigqcGhvc2UpLT5uZXh0OworCisJaG9zZS0+bmV4dCA9IE5VTEw7CisKKwkqcGhvc2UgPSBob3NlOworfQorCitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIHBjaV9idXNfdG9faG9zZShpbnQgYnVzKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKworCWZvciAoaG9zZSA9IGhvc2VfaGVhZDsgaG9zZTsgaG9zZSA9IGhvc2UtPm5leHQpCisJCWlmIChidXMgPj0gaG9zZS0+Zmlyc3RfYnVzbm8gJiYKKwkJICAgIGJ1cyA8PSBob3NlLT5sYXN0X2J1c25vKQorCQkJcmV0dXJuIGhvc2U7CisKKwlyZXR1cm4gTlVMTDsKK30KKworcGNpX2Rldl90IHBjaV9maW5kX2RldmljZXMoc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkcywgaW50IGluZGV4KQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqIGhvc2U7CisJdTE2IHZlbmRvciwgZGV2aWNlOworCXU4IGhlYWRlcl90eXBlOworCXBjaV9kZXZfdCBiZGY7CisJaW50IGksIGJ1cywgZm91bmRfbXVsdGkgPSAwOworCisJZm9yIChob3NlID0gaG9zZV9oZWFkOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkKKwl7CisjaWYgQ0ZHX1NDU0lfU0NBTl9CVVNfUkVWRVJTRQorCQlmb3IgKGJ1cyA9IGhvc2UtPmxhc3RfYnVzbm87IGJ1cyA+PSBob3NlLT5maXJzdF9idXNubzsgYnVzLS0pCisjZWxzZQorCQlmb3IgKGJ1cyA9IGhvc2UtPmZpcnN0X2J1c25vOyBidXMgPD0gaG9zZS0+bGFzdF9idXNubzsgYnVzKyspCisjZW5kaWYKKwkJCWZvciAoYmRmID0gUENJX0JERihidXMsMCwwKTsKKyNpZmRlZiBDT05GSUdfRUxQUEMKKwkJCSAgICAgYmRmIDwgUENJX0JERihidXMsUENJX01BWF9QQ0lfREVWSUNFUy0xLFBDSV9NQVhfUENJX0ZVTkNUSU9OUy0xKTsKKyNlbHNlCisJCQkgICAgIGJkZiA8IFBDSV9CREYoYnVzKzEsMCwwKTsKKyNlbmRpZgorCQkJICAgICBiZGYgKz0gUENJX0JERigwLDAsMSkpCisJCQl7CisJCQkJaWYgKCFQQ0lfRlVOQyhiZGYpKQorCQkJCXsKKwkJCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoYmRmLAorCQkJCQkJCSAgICAgUENJX0hFQURFUl9UWVBFLAorCQkJCQkJCSAgICAgJmhlYWRlcl90eXBlKTsKKworCQkJCQlmb3VuZF9tdWx0aSA9IGhlYWRlcl90eXBlICYgMHg4MDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKCFmb3VuZF9tdWx0aSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJkZiwKKwkJCQkJCSAgICAgUENJX1ZFTkRPUl9JRCwKKwkJCQkJCSAgICAgJnZlbmRvcik7CisJCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoYmRmLAorCQkJCQkJICAgICBQQ0lfREVWSUNFX0lELAorCQkJCQkJICAgICAmZGV2aWNlKTsKKworCQkJCWZvciAoaT0wOyBpZHNbaV0udmVuZG9yICE9IDA7IGkrKykKKwkJCQkJaWYgKHZlbmRvciA9PSBpZHNbaV0udmVuZG9yICYmCisJCQkJCSAgICBkZXZpY2UgPT0gaWRzW2ldLmRldmljZSkKKwkJCQkJeworCQkJCQkJaWYgKGluZGV4IDw9IDApCisJCQkJCQkJcmV0dXJuIGJkZjsKKworCQkJCQkJaW5kZXgtLTsKKwkJCQkJfQorCQkJfQorCX0KKworCXJldHVybiAoLTEpOworfQorCitwY2lfZGV2X3QgcGNpX2ZpbmRfZGV2aWNlKHVuc2lnbmVkIGludCB2ZW5kb3IsIHVuc2lnbmVkIGludCBkZXZpY2UsIGludCBpbmRleCkKK3sKKwlzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRzWzJdID0ge3t9LCB7MCwgMH19OworCisJaWRzWzBdLnZlbmRvciA9IHZlbmRvcjsKKwlpZHNbMF0uZGV2aWNlID0gZGV2aWNlOworCisJcmV0dXJuIHBjaV9maW5kX2RldmljZXMoaWRzLCBpbmRleCk7Cit9CisKKy8qCisgKgorICovCisKK3Vuc2lnbmVkIGxvbmcgcGNpX2hvc2VfcGh5c190b19idXMoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHBjaV9yZWdpb24gKnJlczsKKwl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOworCWludCBpOworCisJaWYgKCFob3NlKQorCXsKKwkJcHJpbnRmKCJwY2lfaG9zZV9waHlzX3RvX2J1czogJXNcbiIsICJpbnZhbGlkIGhvc2UiKTsKKwkJZ290byBEb25lOworCX0KKworCWZvciAoaT0wOyBpPGhvc2UtPnJlZ2lvbl9jb3VudDsgaSsrKQorCXsKKwkJcmVzID0gJmhvc2UtPnJlZ2lvbnNbaV07CisKKwkJaWYgKCgocmVzLT5mbGFncyBeIGZsYWdzKSAmIFBDSV9SRUdJT05fVFlQRSkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWJ1c19hZGRyID0gcGh5c19hZGRyIC0gcmVzLT5waHlzX3N0YXJ0ICsgcmVzLT5idXNfc3RhcnQ7CisKKwkJaWYgKGJ1c19hZGRyID49IHJlcy0+YnVzX3N0YXJ0ICYmCisJCSAgICBidXNfYWRkciA8ICByZXMtPmJ1c19zdGFydCArIHJlcy0+c2l6ZSkKKwkJeworCQkJcmV0dXJuIGJ1c19hZGRyOworCQl9CisJfQorCisJcHJpbnRmKCJwY2lfaG9zZV9waHlzX3RvX2J1czogJXNcbiIsICJpbnZhbGlkIHBoeXNpY2FsIGFkZHJlc3MiKTsKKworIERvbmU6CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgcGNpX2hvc2VfYnVzX3RvX3BoeXMoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCisJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgcGNpX3JlZ2lvbiAqcmVzOworCWludCBpOworCisJaWYgKCFob3NlKQorCXsKKwkJcHJpbnRmKCJwY2lfaG9zZV9idXNfdG9fcGh5czogJXNcbiIsICJpbnZhbGlkIGhvc2UiKTsKKwkJZ290byBEb25lOworCX0KKworCWZvciAoaT0wOyBpPGhvc2UtPnJlZ2lvbl9jb3VudDsgaSsrKQorCXsKKwkJcmVzID0gJmhvc2UtPnJlZ2lvbnNbaV07CisKKwkJaWYgKCgocmVzLT5mbGFncyBeIGZsYWdzKSAmIFBDSV9SRUdJT05fVFlQRSkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChidXNfYWRkciA+PSByZXMtPmJ1c19zdGFydCAmJgorCQkgICAgYnVzX2FkZHIgPCAgcmVzLT5idXNfc3RhcnQgKyByZXMtPnNpemUpCisJCXsKKwkJCXJldHVybiBidXNfYWRkciAtIHJlcy0+YnVzX3N0YXJ0ICsgcmVzLT5waHlzX3N0YXJ0OworCQl9CisJfQorCisJcHJpbnRmKCJwY2lfaG9zZV9idXNfdG9fcGh5czogJXNcbiIsICJpbnZhbGlkIHBoeXNpY2FsIGFkZHJlc3MiKTsKKworIERvbmU6CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICovCisKK2ludCBwY2lfaG9zZV9jb25maWdfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCSAgIHBjaV9kZXZfdCBkZXYsCisJCQkgICB1bnNpZ25lZCBsb25nIGlvLAorCQkJICAgdW5zaWduZWQgbG9uZyBtZW0sCisJCQkgICB1bnNpZ25lZCBsb25nIGNvbW1hbmQpCit7CisJdW5zaWduZWQgaW50IGJhcl9yZXNwb25zZSwgYmFyX3NpemUsIGJhcl92YWx1ZSwgb2xkX2NvbW1hbmQ7CisJdW5zaWduZWQgY2hhciBwaW47CisJaW50IGJhciwgZm91bmRfbWVtNjQ7CisKKwlERUJVR0YoIlBDSSBDb25maWc6IEkvTz0weCVseCwgTWVtb3J5PTB4JWx4LCBDb21tYW5kPTB4JWx4XG4iLCBpbywgbWVtLCBjb21tYW5kKTsKKworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIFBDSV9DT01NQU5ELCAwKTsKKworCWZvciAoYmFyID0gUENJX0JBU0VfQUREUkVTU18wOyBiYXIgPCBQQ0lfQkFTRV9BRERSRVNTXzU7IGJhciArPSA0KQorCXsKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgYmFyLCAweGZmZmZmZmZmKTsKKwkJcGNpX2hvc2VfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBiYXIsICZiYXJfcmVzcG9uc2UpOworCisJCWlmICghYmFyX3Jlc3BvbnNlKQorCQkJY29udGludWU7CisKKwkJZm91bmRfbWVtNjQgPSAwOworCisJCS8qIENoZWNrIHRoZSBCQVIgdHlwZSBhbmQgc2V0IG91ciBhZGRyZXNzIG1hc2sgKi8KKwkJaWYgKGJhcl9yZXNwb25zZSAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UpCisJCXsKKwkJCWJhcl9zaXplID0gfihiYXJfcmVzcG9uc2UgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0spICsgMTsKKwkJCWJhcl92YWx1ZSA9IGlvOworCisJCQlpbyA9ICgoaW8gLSAxKSB8IChiYXJfc2l6ZSAtIDEpKSArIDE7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoIChiYXJfcmVzcG9uc2UgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0spID09CisJCQkgICAgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpCisJCQkJZm91bmRfbWVtNjQgPSAxOworCisJCQliYXJfc2l6ZSA9IH4oYmFyX3Jlc3BvbnNlICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSykgKyAxOworCQkJYmFyX3ZhbHVlID0gbWVtOworCisJCQltZW0gPSAoKG1lbSAtIDEpIHwgKGJhcl9zaXplIC0gMSkpICsgMTsKKwkJfQorCisJCS8qIFdyaXRlIGl0IG91dCBhbmQgdXBkYXRlIG91ciBsaW1pdCAqLworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBiYXIsIGJhcl92YWx1ZSk7CisKKwkJaWYgKGZvdW5kX21lbTY0KQorCQl7CisJCQliYXIgKz0gNDsKKwkJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIGJhciwgMHgwMDAwMDAwMCk7CisJCX0KKwl9CisKKwkvKiBDb25maWd1cmUgQ2FjaGUgTGluZSBTaXplIFJlZ2lzdGVyICovCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAweDA4KTsKKworCS8qIENvbmZpZ3VyZSBMYXRlbmN5IFRpbWVyICovCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdCBsaW5lLCBpZiBkZXZpY2Ugc2F5cyBpdCB3YW50cyB0byB1c2UgaW50ZXJydXB0cyAqLworCXBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisJaWYgKHBpbiAhPSAwKQorCXsKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIDB4ZmYpOworCX0KKworCXBjaV9ob3NlX3JlYWRfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsICZvbGRfY29tbWFuZCk7CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsCisJCQkJICAgIChvbGRfY29tbWFuZCAmIDB4ZmZmZjAwMDApIHwgY29tbWFuZCApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICovCisKK3N0cnVjdCBwY2lfY29uZmlnX3RhYmxlICpwY2lfZmluZF9jb25maWcoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCQkgdW5zaWduZWQgc2hvcnQgY2xhc3MsCisJCQkJCSB1bnNpZ25lZCBpbnQgdmVuZG9yLAorCQkJCQkgdW5zaWduZWQgaW50IGRldmljZSwKKwkJCQkJIHVuc2lnbmVkIGludCBidXMsCisJCQkJCSB1bnNpZ25lZCBpbnQgZGV2LAorCQkJCQkgdW5zaWduZWQgaW50IGZ1bmMpCit7CisJc3RydWN0IHBjaV9jb25maWdfdGFibGUgKnRhYmxlOworCisJZm9yICh0YWJsZSA9IGhvc2UtPmNvbmZpZ190YWJsZTsgdGFibGUgJiYgdGFibGUtPnZlbmRvcjsgdGFibGUrKykKKwl7CisJCWlmICgodGFibGUtPnZlbmRvciA9PSBQQ0lfQU5ZX0lEIHx8IHRhYmxlLT52ZW5kb3IgPT0gdmVuZG9yKSAmJgorCQkgICAgKHRhYmxlLT5kZXZpY2UgPT0gUENJX0FOWV9JRCB8fCB0YWJsZS0+ZGV2aWNlID09IGRldmljZSkgJiYKKwkJICAgICh0YWJsZS0+Y2xhc3MgID09IFBDSV9BTllfSUQgfHwgdGFibGUtPmNsYXNzICA9PSBjbGFzcykgICYmCisJCSAgICAodGFibGUtPmJ1cyAgICA9PSBQQ0lfQU5ZX0lEIHx8IHRhYmxlLT5idXMgICAgPT0gYnVzKSAgICAmJgorCQkgICAgKHRhYmxlLT5kZXYgICAgPT0gUENJX0FOWV9JRCB8fCB0YWJsZS0+ZGV2ICAgID09IGRldikgICAgJiYKKwkJICAgICh0YWJsZS0+ZnVuYyAgID09IFBDSV9BTllfSUQgfHwgdGFibGUtPmZ1bmMgICA9PSBmdW5jKSkKKwkJeworCQkJcmV0dXJuIHRhYmxlOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgcGNpX2NmZ2Z1bmNfY29uZmlnX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkgICAgICAgcGNpX2Rldl90IGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqZW50cnkpCit7CisJcGNpX2hvc2VfY29uZmlnX2RldmljZShob3NlLCBkZXYsIGVudHJ5LT5wcml2WzBdLCBlbnRyeS0+cHJpdlsxXSwgZW50cnktPnByaXZbMl0pOworfQorCit2b2lkIHBjaV9jZmdmdW5jX2RvX25vdGhpbmcoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJICAgIHBjaV9kZXZfdCBkZXYsIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICplbnRyeSkKK3sKK30KKworLyoKKyAqCisgKi8KKworZXh0ZXJuIHZvaWQgcGNpYXV0b19jb25maWdfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworZXh0ZXJuIHZvaWQgcGNpYXV0b19jb25maWdfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldik7CisKK2ludCBwY2lfaG9zZV9zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMpCit7CisJdW5zaWduZWQgaW50IHN1Yl9idXMsIGZvdW5kX211bHRpPTA7CisJdW5zaWduZWQgc2hvcnQgdmVuZG9yLCBkZXZpY2UsIGNsYXNzOworCXVuc2lnbmVkIGNoYXIgaGVhZGVyX3R5cGU7CisJc3RydWN0IHBjaV9jb25maWdfdGFibGUgKmNmZzsKKwlwY2lfZGV2X3QgZGV2OworCisJc3ViX2J1cyA9IGJ1czsKKworCWZvciAoZGV2ID0gIFBDSV9CREYoYnVzLDAsMCk7CisJICAgICBkZXYgPCAgUENJX0JERihidXMsUENJX01BWF9QQ0lfREVWSUNFUy0xLFBDSV9NQVhfUENJX0ZVTkNUSU9OUy0xKTsKKwkgICAgIGRldiArPSBQQ0lfQkRGKDAsMCwxKSkKKwl7CisjaWZuZGVmIENPTkZJR180MDVHUCAvKiBkb24ndCBza2lwIGhvc3QgYnJpZGdlIG9uIHBwYzQwNWdwICovCisJCS8qIFNraXAgb3VyIGhvc3QgYnJpZGdlICovCisJCWlmICggZGV2ID09IFBDSV9CREYoaG9zZS0+Zmlyc3RfYnVzbm8sMCwwKSApCisJCQljb250aW51ZTsKKyNlbmRpZgorCisJCWlmIChQQ0lfRlVOQyhkZXYpICYmICFmb3VuZF9tdWx0aSkKKwkJCWNvbnRpbnVlOworCisJCXBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZoZWFkZXJfdHlwZSk7CisKKwkJcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9WRU5ET1JfSUQsICZ2ZW5kb3IpOworCisJCWlmICh2ZW5kb3IgIT0gMHhmZmZmICYmIHZlbmRvciAhPSAweDAwMDApCisJCXsKKworCQkJaWYgKCFQQ0lfRlVOQyhkZXYpKQorCQkJCWZvdW5kX211bHRpID0gaGVhZGVyX3R5cGUgJiAweDgwOworCisJCQlERUJVR0YoIlBDSSBTY2FuOiBGb3VuZCBCdXMgJWQsIERldmljZSAlZCwgRnVuY3Rpb24gJWRcbiIsCisJCQkgICAgUENJX0JVUyhkZXYpLCBQQ0lfREVWKGRldiksIFBDSV9GVU5DKGRldikgKTsKKworCQkJcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9ERVZJQ0VfSUQsICZkZXZpY2UpOworCQkJcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9DTEFTU19ERVZJQ0UsICZjbGFzcyk7CisKKwkJCWNmZyA9IHBjaV9maW5kX2NvbmZpZyhob3NlLCBjbGFzcywgdmVuZG9yLCBkZXZpY2UsCisJCQkJCSAgICAgIFBDSV9CVVMoZGV2KSwgUENJX0RFVihkZXYpLCBQQ0lfRlVOQyhkZXYpKTsKKwkJCWlmIChjZmcpCisJCQkJY2ZnLT5jb25maWdfZGV2aWNlKGhvc2UsIGRldiwgY2ZnKTsKKyNpZmRlZiBDT05GSUdfUENJX1BOUAorCQkJZWxzZQorCQkJCXBjaWF1dG9fY29uZmlnX2RldmljZShob3NlLCBkZXYpOworI2VuZGlmCisJCQlpZiAoaG9zZS0+Zml4dXBfaXJxKQorCQkJCWhvc2UtPmZpeHVwX2lycShob3NlLCBkZXYpOworCisjaWZkZWYgQ09ORklHX1BDSV9TQ0FOX1NIT1cKKwkJCS8qIFNraXAgb3VyIGhvc3QgYnJpZGdlICovCisJCQlpZiAoIGRldiAhPSBQQ0lfQkRGKGhvc2UtPmZpcnN0X2J1c25vLDAsMCkgKSB7CisJCQkgICAgdW5zaWduZWQgY2hhciBpbnRfbGluZTsKKworCQkJICAgIHBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsCisJCQkJCQkgICAgICAmaW50X2xpbmUpOworCQkJICAgIHByaW50ZigiICAgICAgICAlMDJ4ICAlMDJ4ICAlMDR4ICAlMDR4ICAlMDR4ICAlMDJ4XG4iLAorCQkJCSAgIFBDSV9CVVMoZGV2KSwgUENJX0RFVihkZXYpLCB2ZW5kb3IsIGRldmljZSwgY2xhc3MsCisJCQkJICAgaW50X2xpbmUpOworCQkJfQorI2VuZGlmCisJCX0KKwl9CisKKwlyZXR1cm4gc3ViX2J1czsKK30KKworaW50IHBjaV9ob3NlX3NjYW4oc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworI2lmZGVmIENPTkZJR19QQ0lfUE5QCisJcGNpYXV0b19jb25maWdfaW5pdChob3NlKTsKKyNlbmRpZgorCXJldHVybiBwY2lfaG9zZV9zY2FuX2J1cyhob3NlLCBob3NlLT5maXJzdF9idXNubyk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaV9hdXRvLmMgYi9kcml2ZXJzL3BjaV9hdXRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2NWVlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpX2F1dG8uYwpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIGFyY2gvcHBjL2tlcm5lbC9wY2lfYXV0by5jCisgKgorICogUENJIGF1dG9jb25maWd1cmF0aW9uIGxpYnJhcnkKKyAqCisgKiBBdXRob3I6IE1hdHQgUG9ydGVyIDxtcG9ydGVyQG12aXN0YS5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMDAgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfUENJCisKKyNpbmNsdWRlIDxwY2kuaD4KKworI3VuZGVmIERFQlVHCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREVCVUdGKHguLi4pIHByaW50Zih4KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdGKHguLi4pCisjZW5kaWYgLyogREVCVUcgKi8KKworI2RlZmluZQlQQ0lBVVRPX0lERV9NT0RFX01BU0sJCTB4MDUKKworLyoKKyAqCisgKi8KKwordm9pZCBwY2lhdXRvX3JlZ2lvbl9pbml0KHN0cnVjdCBwY2lfcmVnaW9uKiByZXMpCit7CisJcmVzLT5idXNfbG93ZXIgPSByZXMtPmJ1c19zdGFydDsKK30KKwordm9pZCBwY2lhdXRvX3JlZ2lvbl9hbGlnbihzdHJ1Y3QgcGNpX3JlZ2lvbiAqcmVzLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmVzLT5idXNfbG93ZXIgPSAoKHJlcy0+YnVzX2xvd2VyIC0gMSkgfCAoc2l6ZSAtIDEpKSArIDE7Cit9CisKK2ludCBwY2lhdXRvX3JlZ2lvbl9hbGxvY2F0ZShzdHJ1Y3QgcGNpX3JlZ2lvbiogcmVzLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50ICpiYXIpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKCFyZXMpCisJeworCQlERUJVR0YoIk5vIHJlc291cmNlIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJYWRkciA9ICgocmVzLT5idXNfbG93ZXIgLSAxKSB8IChzaXplIC0gMSkpICsgMTsKKworCWlmIChhZGRyIC0gcmVzLT5idXNfc3RhcnQgKyBzaXplID4gcmVzLT5zaXplKQorCXsKKwkJREVCVUdGKCJObyByb29tIGluIHJlc291cmNlIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmVzLT5idXNfbG93ZXIgPSBhZGRyICsgc2l6ZTsKKworCURFQlVHRigiYWRkcmVzcz0weCVseCIsIGFkZHIpOworCisJKmJhciA9IGFkZHI7CisJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwkqYmFyID0gMHhmZmZmZmZmZjsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKgorICovCisKK3ZvaWQgcGNpYXV0b19zZXR1cF9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJICBwY2lfZGV2X3QgZGV2LCBpbnQgYmFyc19udW0sCisJCQkgIHN0cnVjdCBwY2lfcmVnaW9uICptZW0sCisJCQkgIHN0cnVjdCBwY2lfcmVnaW9uICppbykKK3sKKwl1bnNpZ25lZCBpbnQgYmFyX3ZhbHVlLCBiYXJfcmVzcG9uc2UsIGJhcl9zaXplOworCXVuc2lnbmVkIGludCBjbWRzdGF0ID0gMDsKKwlzdHJ1Y3QgcGNpX3JlZ2lvbiAqYmFyX3JlczsKKwlpbnQgYmFyLCBiYXJfbnIgPSAwOworCWludCBmb3VuZF9tZW02NCA9IDA7CisKKwlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIFBDSV9DT01NQU5ELCAmY21kc3RhdCk7CisJY21kc3RhdCA9IChjbWRzdGF0ICYgfihQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHwgUENJX0NPTU1BTkRfTUFTVEVSOworCisJZm9yIChiYXIgPSBQQ0lfQkFTRV9BRERSRVNTXzA7IGJhciA8PSBQQ0lfQkFTRV9BRERSRVNTXzAgKyAoYmFyc19udW0qNCk7IGJhciArPSA0KQorCXsKKwkJLyogVGlja2xlIHRoZSBCQVIgYW5kIGdldCB0aGUgcmVzcG9uc2UgKi8KKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgYmFyLCAweGZmZmZmZmZmKTsKKwkJcGNpX2hvc2VfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBiYXIsICZiYXJfcmVzcG9uc2UpOworCisJCS8qIElmIEJBUiBpcyBub3QgaW1wbGVtZW50ZWQgZ28gdG8gdGhlIG5leHQgQkFSICovCisJCWlmICghYmFyX3Jlc3BvbnNlKQorCQkJY29udGludWU7CisKKwkJZm91bmRfbWVtNjQgPSAwOworCisJCS8qIENoZWNrIHRoZSBCQVIgdHlwZSBhbmQgc2V0IG91ciBhZGRyZXNzIG1hc2sgKi8KKwkJaWYgKGJhcl9yZXNwb25zZSAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UpCisJCXsKKwkJCWJhcl9zaXplID0gfihiYXJfcmVzcG9uc2UgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0spICsgMTsKKwkJCWJhcl9yZXMgPSBpbzsKKworCQkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogQkFSICVkLCBJL08sIHNpemU9MHgleCwgIiwgYmFyX25yLCBiYXJfc2l6ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoIChiYXJfcmVzcG9uc2UgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0spID09CisJCQkgICAgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpCisJCQkJZm91bmRfbWVtNjQgPSAxOworCisJCQliYXJfc2l6ZSA9IH4oYmFyX3Jlc3BvbnNlICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSykgKyAxOworCQkJYmFyX3JlcyA9IG1lbTsKKworCQkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogQkFSICVkLCBNZW0sIHNpemU9MHgleCwgIiwgYmFyX25yLCBiYXJfc2l6ZSk7CisJCX0KKworCQlpZiAocGNpYXV0b19yZWdpb25fYWxsb2NhdGUoYmFyX3JlcywgYmFyX3NpemUsICZiYXJfdmFsdWUpID09IDApCisJCXsKKwkJCS8qIFdyaXRlIGl0IG91dCBhbmQgdXBkYXRlIG91ciBsaW1pdCAqLworCQkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgYmFyLCBiYXJfdmFsdWUpOworCisJCQkvKgorCQkJICogSWYgd2UgYXJlIGEgNjQtYml0IGRlY29kZXIgdGhlbiBpbmNyZW1lbnQgdG8gdGhlCisJCQkgKiB1cHBlciAzMiBiaXRzIG9mIHRoZSBiYXIgYW5kIGZvcmNlIGl0IHRvIGxvY2F0ZQorCQkJICogaW4gdGhlIGxvd2VyIDRHQiBvZiBtZW1vcnkuCisJCQkgKi8KKwkJCWlmIChmb3VuZF9tZW02NCkKKwkJCXsKKwkJCQliYXIgKz0gNDsKKwkJCQlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBiYXIsIDB4MDAwMDAwMDApOworCQkJfQorCisJCQljbWRzdGF0IHw9IChiYXJfcmVzcG9uc2UgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA/CisJCQkJUENJX0NPTU1BTkRfSU8gOiBQQ0lfQ09NTUFORF9NRU1PUlk7CisJCX0KKworCQlERUJVR0YoIlxuIik7CisKKwkJYmFyX25yKys7CisJfQorCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsIGNtZHN0YXQpOworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgMHgwOCk7CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaWF1dG9fcHJlc2Nhbl9zZXR1cF9icmlkZ2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCQkgcGNpX2Rldl90IGRldiwgaW50IHN1Yl9idXMpCit7CisJc3RydWN0IHBjaV9yZWdpb24gKnBjaV9tZW0gPSBob3NlLT5wY2lfbWVtOworCXN0cnVjdCBwY2lfcmVnaW9uICpwY2lfaW8gPSBob3NlLT5wY2lfaW87CisJdW5zaWduZWQgaW50IGNtZHN0YXQ7CisKKwlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIFBDSV9DT01NQU5ELCAmY21kc3RhdCk7CisKKwkvKiBDb25maWd1cmUgYnVzIG51bWJlciByZWdpc3RlcnMgKi8KKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9QUklNQVJZX0JVUywgUENJX0JVUyhkZXYpKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9TRUNPTkRBUllfQlVTLCBzdWJfYnVzICsgMSk7CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfU1VCT1JESU5BVEVfQlVTLCAweGZmKTsKKworCWlmIChwY2lfbWVtKQorCXsKKwkJLyogUm91bmQgbWVtb3J5IGFsbG9jYXRvciB0byAxTUIgYm91bmRhcnkgKi8KKwkJcGNpYXV0b19yZWdpb25fYWxpZ24ocGNpX21lbSwgMHgxMDAwMDApOworCisJCS8qIFNldCB1cCBtZW1vcnkgYW5kIEkvTyBmaWx0ZXIgbGltaXRzLCBhc3N1bWUgMzItYml0IEkvTyBzcGFjZSAqLworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9NRU1PUllfQkFTRSwKKwkJCQkJKHBjaV9tZW0tPmJ1c19sb3dlciAmIDB4ZmZmMDAwMDApID4+IDE2KTsKKworCQljbWRzdGF0IHw9IFBDSV9DT01NQU5EX01FTU9SWTsKKwl9CisKKwlpZiAocGNpX2lvKQorCXsKKwkJLyogUm91bmQgSS9PIGFsbG9jYXRvciB0byA0S0IgYm91bmRhcnkgKi8KKwkJcGNpYXV0b19yZWdpb25fYWxpZ24ocGNpX2lvLCAweDEwMDApOworCisJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0lPX0JBU0UsCisJCQkJCShwY2lfaW8tPmJ1c19sb3dlciAmIDB4MDAwMGYwMDApID4+IDgpOworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9JT19CQVNFX1VQUEVSMTYsCisJCQkJCShwY2lfaW8tPmJ1c19sb3dlciAmIDB4ZmZmZjAwMDApID4+IDE2KTsKKworCQljbWRzdGF0IHw9IFBDSV9DT01NQU5EX0lPOworCX0KKworCS8qIFdlIGRvbid0IHN1cHBvcnQgcHJlZmV0Y2hhYmxlIG1lbW9yeSBmb3Igbm93LCBzbyBkaXNhYmxlICovCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwgMHgxMDAwKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9QUkVGX01FTU9SWV9MSU1JVCwgMHgxMDAwKTsKKworCS8qIEVuYWJsZSBtZW1vcnkgYW5kIEkvTyBhY2Nlc3NlcywgZW5hYmxlIGJ1cyBtYXN0ZXIgKi8KKwlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgY21kc3RhdCB8IFBDSV9DT01NQU5EX01BU1RFUik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaWF1dG9fcG9zdHNjYW5fc2V0dXBfYnJpZGdlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkJICBwY2lfZGV2X3QgZGV2LCBpbnQgc3ViX2J1cykKK3sKKwlzdHJ1Y3QgcGNpX3JlZ2lvbiAqcGNpX21lbSA9IGhvc2UtPnBjaV9tZW07CisJc3RydWN0IHBjaV9yZWdpb24gKnBjaV9pbyA9IGhvc2UtPnBjaV9pbzsKKworCS8qIENvbmZpZ3VyZSBidXMgbnVtYmVyIHJlZ2lzdGVycyAqLworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX1NVQk9SRElOQVRFX0JVUywgc3ViX2J1cyk7CisKKwlpZiAocGNpX21lbSkKKwl7CisJCS8qIFJvdW5kIG1lbW9yeSBhbGxvY2F0b3IgdG8gMU1CIGJvdW5kYXJ5ICovCisJCXBjaWF1dG9fcmVnaW9uX2FsaWduKHBjaV9tZW0sIDB4MTAwMDAwKTsKKworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9NRU1PUllfTElNSVQsCisJCQkJCShwY2lfbWVtLT5idXNfbG93ZXItMSkgPj4gMTYpOworCX0KKworCWlmIChwY2lfaW8pCisJeworCQkvKiBSb3VuZCBJL08gYWxsb2NhdG9yIHRvIDRLQiBib3VuZGFyeSAqLworCQlwY2lhdXRvX3JlZ2lvbl9hbGlnbihwY2lfaW8sIDB4MTAwMCk7CisKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU9fTElNSVQsCisJCQkJCSgocGNpX2lvLT5idXNfbG93ZXItMSkgJiAweDAwMDBmMDAwKSA+PiA4KTsKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfSU9fTElNSVRfVVBQRVIxNiwKKwkJCQkJKChwY2lfaW8tPmJ1c19sb3dlci0xKSAmIDB4ZmZmZjAwMDApID4+IDE2KTsKKwl9Cit9CisKKy8qCisgKgorICovCisKK3ZvaWQgcGNpYXV0b19jb25maWdfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJaW50IGk7CisKKwlob3NlLT5wY2lfaW8gPSBob3NlLT5wY2lfbWVtID0gTlVMTDsKKworCWZvciAoaT0wOyBpPGhvc2UtPnJlZ2lvbl9jb3VudDsgaSsrKQorCXsKKwkJc3dpdGNoKGhvc2UtPnJlZ2lvbnNbaV0uZmxhZ3MpCisJCXsKKwkJY2FzZSBQQ0lfUkVHSU9OX0lPOgorCQkJaWYgKCFob3NlLT5wY2lfaW8gfHwKKwkJCSAgICBob3NlLT5wY2lfaW8tPnNpemUgPCBob3NlLT5yZWdpb25zW2ldLnNpemUpCisJCQkJaG9zZS0+cGNpX2lvID0gaG9zZS0+cmVnaW9ucyArIGk7CisJCQlicmVhazsKKwkJY2FzZSBQQ0lfUkVHSU9OX01FTToKKwkJCWlmICghaG9zZS0+cGNpX21lbSB8fAorCQkJICAgIGhvc2UtPnBjaV9tZW0tPnNpemUgPCBob3NlLT5yZWdpb25zW2ldLnNpemUpCisJCQkJaG9zZS0+cGNpX21lbSA9IGhvc2UtPnJlZ2lvbnMgKyBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKworCisJaWYgKGhvc2UtPnBjaV9tZW0pCisJeworCQlwY2lhdXRvX3JlZ2lvbl9pbml0KGhvc2UtPnBjaV9tZW0pOworCisJCURFQlVHRigiUENJIEF1dG9jb25maWc6IE1lbW9yeSByZWdpb246IFslbHgtJWx4XVxuIiwKKwkJICAgIGhvc2UtPnBjaV9tZW0tPmJ1c19zdGFydCwKKwkJICAgIGhvc2UtPnBjaV9tZW0tPmJ1c19zdGFydCArIGhvc2UtPnBjaV9tZW0tPnNpemUgLSAxKTsKKwl9CisKKwlpZiAoaG9zZS0+cGNpX2lvKQorCXsKKwkJcGNpYXV0b19yZWdpb25faW5pdChob3NlLT5wY2lfaW8pOworCisJCURFQlVHRigiUENJIEF1dG9jb25maWc6IEkvTyByZWdpb246IFslbHgtJWx4XVxuIiwKKwkJICAgIGhvc2UtPnBjaV9pby0+YnVzX3N0YXJ0LAorCQkgICAgaG9zZS0+cGNpX2lvLT5idXNfc3RhcnQgKyBob3NlLT5wY2lfaW8tPnNpemUgLSAxKTsKKwl9Cit9CisKK3ZvaWQgcGNpYXV0b19jb25maWdfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldikKK3sKKwl1bnNpZ25lZCBpbnQgc3ViX2J1czsKKwl1bnNpZ25lZCBzaG9ydCBjbGFzczsKKwl1bnNpZ25lZCBjaGFyIHByZ19pZmFjZTsKKworCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfQ0xBU1NfREVWSUNFLCAmY2xhc3MpOworCisJc3dpdGNoKGNsYXNzKQorCXsKKwljYXNlIFBDSV9DTEFTU19CUklER0VfUENJOgorCQlwY2lhdXRvX3NldHVwX2RldmljZShob3NlLCBkZXYsIDIsIGhvc2UtPnBjaV9tZW0sIGhvc2UtPnBjaV9pbyk7CisKKwkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogRm91bmQgUDJQIGJyaWRnZSwgZGV2aWNlICVkXG4iLCBQQ0lfREVWKGRldikpOworCisJCXBjaWF1dG9fcHJlc2Nhbl9zZXR1cF9icmlkZ2UoaG9zZSwgZGV2LCBQQ0lfQlVTKGRldikpOworCisJCXN1Yl9idXMgPSBwY2lfaG9zZV9zY2FuX2J1cyhob3NlLCBQQ0lfQlVTKGRldikrMSk7CisKKwkJcGNpYXV0b19wb3N0c2Nhbl9zZXR1cF9icmlkZ2UoaG9zZSwgZGV2LCBzdWJfYnVzKTsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9DTEFTU19TVE9SQUdFX0lERToKKwkJcGNpX2hvc2VfcmVhZF9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9DTEFTU19QUk9HLCAmcHJnX2lmYWNlKTsKKwkJaWYgKCEocHJnX2lmYWNlICYgUENJQVVUT19JREVfTU9ERV9NQVNLKSkKKwkJCXsKKwkJCQlERUJVR0YoIlBDSSBBdXRvY29uZmlnOiBTa2lwcGluZyBsZWdhY3kgbW9kZSBJREUgY29udHJvbGxlclxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCisJCXBjaWF1dG9fc2V0dXBfZGV2aWNlKGhvc2UsIGRldiwgNiwgaG9zZS0+cGNpX21lbSwgaG9zZS0+cGNpX2lvKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwY2lhdXRvX3NldHVwX2RldmljZShob3NlLCBkZXYsIDYsIGhvc2UtPnBjaV9tZW0sIGhvc2UtPnBjaV9pbyk7CisJCWJyZWFrOworCX0KK30KKworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNuZXQuYyBiL2RyaXZlcnMvcGNuZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjljZDJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY25ldC5jCkBAIC0wLDAgKzEsNTI2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyIFdvbGZnYW5nIEdyYW5kZWdnZXIsIHdnQGRlbnguZGUuCisgKgorICogVGhpcyBkcml2ZXIgZm9yIEFNRCBQQ25ldCBuZXR3b3JrIGNvbnRyb2xsZXJzIGlzIGRlcml2ZWQgZnJvbSB0aGUKKyAqIExpbnV4IGRyaXZlciBwY25ldDMyLmMgd3JpdHRlbiAxOTk2LTE5OTkgYnkgVGhvbWFzIEJvZ2VuZG9lcmZlci4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8cGNpLmg+CisKKyNpZiAwCisjZGVmaW5lCVBDTkVUX0RFQlVHX0xFVkVMCTAgLyogMD1vZmYsIDE9aW5pdCwgMj1yeC90eCAqLworI2VuZGlmCisKKyNpZiBQQ05FVF9ERUJVR19MRVZFTCA+IDAKKyNkZWZpbmUJREVCVUcxKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQorI2lmIFBDTkVUX0RFQlVHX0xFVkVMID4gMQorI2RlZmluZQlERUJVRzIoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVRzIoZm10LGFyZ3MuLi4pCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIERFQlVHMShmbXQsYXJncy4uLikKKyNkZWZpbmUgREVCVUcyKGZtdCxhcmdzLi4uKQorI2VuZGlmCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgXAorICAgICYmIGRlZmluZWQoQ09ORklHX1BDTkVUKQorCisjaWYgIWRlZmluZWQoQ09ORl9QQ05FVF83OUM5NzMpICYmIGRlZmluZWQoQ09ORl9QQ05FVF83OUM5NzUpCisjZXJyb3IgIk1hY3JvIGZvciBQQ25ldCBjaGlwIHZlcnNpb24gaXMgbm90IGRlZmluZWQhIgorI2VuZGlmCisKKy8qCisgKiBTZXQgdGhlIG51bWJlciBvZiBUeCBhbmQgUnggYnVmZmVycywgdXNpbmcgTG9nXzIoIyBidWZmZXJzKS4KKyAqIFJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMgYXJlIDQgVHggYnVmZmVycywgYW5kIDE2IFJ4IGJ1ZmZlcnMuCisgKiBUaGF0IHRyYW5zbGF0ZXMgdG8gMiAoNCA9PSAyXl4yKSBhbmQgNCAoMTYgPT0gMl5eNCkuCisgKi8KKyNkZWZpbmUgUENORVRfTE9HX1RYX0JVRkZFUlMJMAorI2RlZmluZSBQQ05FVF9MT0dfUlhfQlVGRkVSUwkyCisKKyNkZWZpbmUgVFhfUklOR19TSVpFCQkoMSA8PCAoUENORVRfTE9HX1RYX0JVRkZFUlMpKQorI2RlZmluZSBUWF9SSU5HX0xFTl9CSVRTCSgoUENORVRfTE9HX1RYX0JVRkZFUlMpIDw8IDEyKQorCisjZGVmaW5lIFJYX1JJTkdfU0laRQkJKDEgPDwgKFBDTkVUX0xPR19SWF9CVUZGRVJTKSkKKyNkZWZpbmUgUlhfUklOR19MRU5fQklUUwkoKFBDTkVUX0xPR19SWF9CVUZGRVJTKSA8PCA0KQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1NDQKKworLyogVGhlIFBDTkVUIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IHBjbmV0X3J4X2hlYWQgeworICAgIHUzMiBiYXNlOworICAgIHMxNiBidWZfbGVuZ3RoOworICAgIHMxNiBzdGF0dXM7CisgICAgdTMyIG1zZ19sZW5ndGg7CisgICAgdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IHBjbmV0X3R4X2hlYWQgeworICAgIHUzMiBiYXNlOworICAgIHMxNiBsZW5ndGg7CisgICAgczE2IHN0YXR1czsKKyAgICB1MzIgbWlzYzsKKyAgICB1MzIgcmVzZXJ2ZWQ7Cit9OworCisvKiBUaGUgUENORVQgMzItQml0IGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCitzdHJ1Y3QgcGNuZXRfaW5pdF9ibG9jayB7CisgICAgdTE2IG1vZGU7CisgICAgdTE2IHRsZW5fcmxlbjsKKyAgICB1OAlwaHlzX2FkZHJbNl07CisgICAgdTE2IHJlc2VydmVkOworICAgIHUzMiBmaWx0ZXJbMl07CisgICAgLyogUmVjZWl2ZSBhbmQgdHJhbnNtaXQgcmluZyBiYXNlLCBhbG9uZyB3aXRoIGV4dHJhIGJpdHMuICovCisgICAgdTMyIHJ4X3Jpbmc7CisgICAgdTMyIHR4X3Jpbmc7CisgICAgdTMyIHJlc2VydmVkMjsKK307CisKK3R5cGVkZWYgc3RydWN0IHBjbmV0X3ByaXYgeworICAgIHN0cnVjdCBwY25ldF9yeF9oZWFkICAgIHJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKyAgICBzdHJ1Y3QgcGNuZXRfdHhfaGVhZCAgICB0eF9yaW5nW1RYX1JJTkdfU0laRV07CisgICAgc3RydWN0IHBjbmV0X2luaXRfYmxvY2sgaW5pdF9ibG9jazsKKyAgICAvKiBSZWNlaXZlIEJ1ZmZlciBzcGFjZSAqLworICAgIHVuc2lnbmVkIGNoYXIgcnhfYnVmW1JYX1JJTkdfU0laRV1bUEtUX0JVRl9TWiArIDRdOworICAgIGludCBjdXJfcng7CisgICAgaW50IGN1cl90eDsKK30gcGNuZXRfcHJpdl90OworCitzdGF0aWMgcGNuZXRfcHJpdl90ICpscDsKKworLyogT2Zmc2V0cyBmcm9tIGJhc2UgSS9PIGFkZHJlc3MgZm9yIFdJTyBtb2RlICovCisjZGVmaW5lIFBDTkVUX1JEUAkJMHgxMAorI2RlZmluZSBQQ05FVF9SQVAJCTB4MTIKKyNkZWZpbmUgUENORVRfUkVTRVQJCTB4MTQKKyNkZWZpbmUgUENORVRfQkRQCQkweDE2CisKK3N0YXRpYyB1MTYgcGNuZXRfcmVhZF9jc3IgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGludCBpbmRleCkKK3sKKyAgICBvdXR3IChpbmRleCwgZGV2LT5pb2Jhc2UrUENORVRfUkFQKTsKKyAgICByZXR1cm4gaW53IChkZXYtPmlvYmFzZStQQ05FVF9SRFApOworfQorCitzdGF0aWMgdm9pZCBwY25ldF93cml0ZV9jc3IgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGludCBpbmRleCwgdTE2IHZhbCkKK3sKKyAgICBvdXR3IChpbmRleCwgZGV2LT5pb2Jhc2UrUENORVRfUkFQKTsKKyAgICBvdXR3ICh2YWwsIGRldi0+aW9iYXNlK1BDTkVUX1JEUCk7Cit9CisKK3N0YXRpYyB1MTYgcGNuZXRfcmVhZF9iY3IgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGludCBpbmRleCkKK3sKKyAgICBvdXR3IChpbmRleCwgZGV2LT5pb2Jhc2UrUENORVRfUkFQKTsKKyAgICByZXR1cm4gaW53IChkZXYtPmlvYmFzZStQQ05FVF9CRFApOworfQorCitzdGF0aWMgdm9pZCBwY25ldF93cml0ZV9iY3IgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGludCBpbmRleCwgdTE2IHZhbCkKK3sKKyAgICBvdXR3IChpbmRleCwgZGV2LT5pb2Jhc2UrUENORVRfUkFQKTsKKyAgICBvdXR3ICh2YWwsIGRldi0+aW9iYXNlK1BDTkVUX0JEUCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0X3Jlc2V0IChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworICAgIGludyAoZGV2LT5pb2Jhc2UrUENORVRfUkVTRVQpOworfQorCitzdGF0aWMgaW50IHBjbmV0X2NoZWNrIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworICAgIG91dHcgKDg4LCBkZXYtPmlvYmFzZStQQ05FVF9SQVApOworICAgIHJldHVybiAoaW53IChkZXYtPmlvYmFzZStQQ05FVF9SQVApID09IDg4KTsKK30KKworc3RhdGljIGludCAgcGNuZXRfaW5pdCggc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCAqYmlzKTsKK3N0YXRpYyBpbnQgIHBjbmV0X3NlbmQgKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIHZvbGF0aWxlIHZvaWQgKnBhY2tldCwKKwkJCWludCBsZW5ndGgpOworc3RhdGljIGludCAgcGNuZXRfcmVjdiAoc3RydWN0IGV0aF9kZXZpY2UqIGRldik7CitzdGF0aWMgdm9pZCBwY25ldF9oYWx0IChzdHJ1Y3QgZXRoX2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgIHBjbmV0X3Byb2JlKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGJkX3QgKmJpcywgaW50IGRldl9udW0pOworCisjZGVmaW5lIFBDSV9UT19NRU0oZCxhKSBwY2lfcGh5c190b19tZW0oKHBjaV9kZXZfdClkLT5wcml2LCAodV9sb25nKShhKSkKKyNkZWZpbmUgUENJX1RPX01FTV9MRShkLGEpICh1MzIpKGNwdV90b19sZTMyKFBDSV9UT19NRU0oZCxhKSkpCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzdXBwb3J0ZWRbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9MQU5DRSB9LAorCXsgfQorfTsKKworCitpbnQgcGNuZXRfaW5pdGlhbGl6ZShiZF90ICpiaXMpCit7CisgICAgcGNpX2Rldl90IGRldmJ1c2ZuOworICAgIHN0cnVjdCBldGhfZGV2aWNlKiBkZXY7CisgICAgdTE2IGNvbW1hbmQsIHN0YXR1czsKKyAgICBpbnQgZGV2X25yID0gMDsKKworICAgIERFQlVHMSgiXG5wY25ldF9pbml0aWFsaXplLi4uXG4iKTsKKworICAgIGZvciAoZGV2X25yID0gMDsgOyBkZXZfbnIrKykgeworCisJLyoKKwkgKiBGaW5kIHRoZSBQQ25ldCBQQ0kgZGV2aWNlKHMpLgorCSAqLworCWlmICgoZGV2YnVzZm4gPSBwY2lfZmluZF9kZXZpY2VzKHN1cHBvcnRlZCwgZGV2X25yKSkgPCAwKSB7CisJICAgIGJyZWFrOworCX0KKworCS8qCisJICogQWxsb2NhdGUgYW5kIHByZS1maWxsIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgorCSAqLworCWRldiA9IChzdHJ1Y3QgZXRoX2RldmljZSopIG1hbGxvYyhzaXplb2YgKmRldik7CisJZGV2LT5wcml2ID0gKHZvaWQgKilkZXZidXNmbjsKKwlzcHJpbnRmKGRldi0+bmFtZSwgInBjbmV0IyVkIiwgZGV2X25yKTsKKworCS8qCisJICogU2V0dXAgdGhlIFBDSSBkZXZpY2UuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldmJ1c2ZuLCBQQ0lfQkFTRV9BRERSRVNTXzAsICZkZXYtPmlvYmFzZSk7CisJZGV2LT5pb2Jhc2UgJj0gfjB4ZjsKKworCURFQlVHMSgiJXM6IGRldmJ1c2ZuPTB4JXggaW9iYXNlPTB4JXg6ICIsCisJICAgICAgIGRldi0+bmFtZSwgZGV2YnVzZm4sIGRldi0+aW9iYXNlKTsKKworCWNvbW1hbmQgPSBQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01BU1RFUjsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2YnVzZm4sIFBDSV9DT01NQU5ELCBjb21tYW5kKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXZidXNmbiwgUENJX0NPTU1BTkQsICZzdGF0dXMpOworCWlmICgoc3RhdHVzICYgY29tbWFuZCkgIT0gY29tbWFuZCkgeworCSAgICBwcmludGYoIiVzOiBDb3VsZG4ndCBlbmFibGUgSU8gYWNjZXNzIG9yIEJ1cyBNYXN0ZXJpbmdcbiIsCisJCSAgIGRldi0+bmFtZSk7CisJICAgIGZyZWUoZGV2KTsKKwkgICAgY29udGludWU7CisJfQorCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldmJ1c2ZuLCBQQ0lfTEFURU5DWV9USU1FUiwgMHg0MCk7CisKKwkvKgorCSAqIFByb2JlIHRoZSBQQ25ldCBjaGlwLgorCSAqLworCWlmIChwY25ldF9wcm9iZShkZXYsIGJpcywgZGV2X25yKSA8IDApIHsKKwkgICAgZnJlZShkZXYpOworCSAgICBjb250aW51ZTsKKwl9CisKKwkvKgorCSAqIFNldHVwIGRldmljZSBzdHJ1Y3R1cmUgYW5kIHJlZ2lzdGVyIHRoZSBkcml2ZXIuCisJICovCisJZGV2LT5pbml0ICAgPSBwY25ldF9pbml0OworCWRldi0+aGFsdCAgID0gcGNuZXRfaGFsdDsKKwlkZXYtPnNlbmQgICA9IHBjbmV0X3NlbmQ7CisJZGV2LT5yZWN2ICAgPSBwY25ldF9yZWN2OworCisJZXRoX3JlZ2lzdGVyKGRldik7CisgICAgfQorCisgICAgdWRlbGF5KDEwICogMTAwMCk7CisKKyAgICByZXR1cm4gZGV2X25yOworfQorCitzdGF0aWMgaW50IHBjbmV0X3Byb2JlKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGJkX3QgKmJpcywgaW50IGRldl9ucikKK3sKKyAgICBpbnQgY2hpcF92ZXJzaW9uOworICAgIGNoYXIgKmNoaXBuYW1lOworI2lmZGVmIFBDTkVUX0hBU19QUk9NCisgICAgaW50IGk7CisjZW5kaWYKKworICAgIC8qIFJlc2V0IHRoZSBQQ25ldCBjb250cm9sbGVyICovCisgICAgcGNuZXRfcmVzZXQoZGV2KTsKKworICAgIC8qIENoZWNrIGlmIHJlZ2lzdGVyIGFjY2VzcyBpcyB3b3JraW5nICovCisgICAgaWYgKHBjbmV0X3JlYWRfY3NyKGRldiwgMCkgIT0gNCB8fCAhcGNuZXRfY2hlY2soZGV2KSkgeworCXByaW50ZigiJXM6IENTUiByZWdpc3RlciBhY2Nlc3MgY2hlY2sgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBJZGVudGlmeSB0aGUgY2hpcCAqLworICAgIGNoaXBfdmVyc2lvbiA9IHBjbmV0X3JlYWRfY3NyKGRldiwgODgpIHwgKHBjbmV0X3JlYWRfY3NyKGRldiw4OSkgPDwgMTYpOworICAgIGlmICgoY2hpcF92ZXJzaW9uICYgMHhmZmYpICE9IDB4MDAzKQorICAgICAgIHJldHVybiAtMTsKKyAgICBjaGlwX3ZlcnNpb24gPSAoY2hpcF92ZXJzaW9uID4+IDEyKSAmIDB4ZmZmZjsKKyAgICBzd2l0Y2ggKGNoaXBfdmVyc2lvbikgeworI2lmZGVmIENPTkZJR19QQ05FVF83OUM5NzMKKyAgICBjYXNlIDB4MjYyNToKKwljaGlwbmFtZSA9ICJQQ25ldC9GQVNUIElJSSA3OUM5NzMiOyAvKiBQQ0kgKi8KKwlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ05FVF83OUM5NzUKKyAgICBjYXNlIDB4MjYyNzoKKwljaGlwbmFtZSA9ICJQQ25ldC9GQVNUIElJSSA3OUM5NzUiOyAvKiBQQ0kgKi8KKwlicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisJcHJpbnRmKCIlczogUENuZXQgdmVyc2lvbiAlI3ggbm90IHN1cHBvcnRlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBjaGlwX3ZlcnNpb24pOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBERUJVRzEoIkFNRCAlc1xuIiwgY2hpcG5hbWUpOworCisjaWZkZWYgUENORVRfSEFTX1BST00KKyAgICAvKgorICAgICAqIEluIG1vc3QgY2hpcHMsIGFmdGVyIGEgY2hpcCByZXNldCwgdGhlIGV0aGVybmV0IGFkZHJlc3MgaXMgcmVhZCBmcm9tCisgICAgICogdGhlIHN0YXRpb24gYWRkcmVzcyBQUk9NIGF0IHRoZSBiYXNlIGFkZHJlc3MgYW5kIHByb2dyYW1tZWQgaW50byB0aGUKKyAgICAgKiAiUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlcnMiIENTUjEyLTE0LgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXZhbCA9IHBjbmV0X3JlYWRfY3NyKGRldiwgaSsxMikgJiAweDBmZmZmOworCS8qIFRoZXJlIG1heSBiZSBlbmRpYW5uZXNzIGlzc3VlcyBoZXJlLiAqLworCWRldi0+ZGV2X2FkZHJbMippXSA9IHZhbCAmIDB4MGZmOworCWRldi0+ZGV2X2FkZHJbMippKzFdID0gKHZhbCA+PiA4KSAmIDB4MGZmOworICAgIH0KKyNlbmRpZiAvKiBQQ05FVF9IQVNfUFJPTSAqLworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXRfaW5pdChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCBiZF90ICpiaXMpCit7CisgICAgaW50IGksIHZhbDsKKyAgICB1MzIgYWRkcjsKKworICAgIERFQlVHMSgiJXM6IHBjbmV0X2luaXQuLi5cbiIsIGRldi0+bmFtZSk7CisKKyAgICAvKiBTd2l0Y2ggcGNuZXQgdG8gMzJiaXQgbW9kZSAqLworICAgIHBjbmV0X3dyaXRlX2JjciAoZGV2LCAyMCwgMik7CisKKyNpZmRlZiBDT05GSUdfUE42MgorICAgIC8qIFNldHVwIExFRCByZWdpc3RlcnMgKi8KKyAgICB2YWwgPSBwY25ldF9yZWFkX2JjciAoZGV2LCAyKSB8IDB4MTAwMDsKKyAgICBwY25ldF93cml0ZV9iY3IgKGRldiwgMiwgdmFsKTsgICAgLyogZW5hYmxlIExFRFBFICovCisgICAgcGNuZXRfd3JpdGVfYmNyIChkZXYsIDQsIDB4NTA4MCk7IC8qIDEwME1CaXQgKi8KKyAgICBwY25ldF93cml0ZV9iY3IgKGRldiwgNSwgMHg0MGMwKTsgLyogTE5LU0UgKi8KKyAgICBwY25ldF93cml0ZV9iY3IgKGRldiwgNiwgMHg0MDkwKTsgLyogVFggQWN0aXZpdHkgKi8KKyAgICBwY25ldF93cml0ZV9iY3IgKGRldiwgNywgMHg0MDg0KTsgLyogUlggQWN0aXZpdHkgKi8KKyNlbmRpZgorCisgICAgLyogU2V0L3Jlc2V0IGF1dG9zZWxlY3QgYml0ICovCisgICAgdmFsID0gcGNuZXRfcmVhZF9iY3IgKGRldiwgMikgJiB+MjsKKyAgICB2YWwgfD0gMjsKKyAgICBwY25ldF93cml0ZV9iY3IgKGRldiwgMiwgdmFsKTsKKworICAgIC8qIEVuYWJsZSBhdXRvIG5lZ290aWF0ZSwgc2V0dXAsIGRpc2FibGUgZmQgKi8KKyAgICB2YWwgPSBwY25ldF9yZWFkX2JjcihkZXYsIDMyKSAmIH4weDk4OworICAgIHZhbCB8PSAweDIwOworICAgIHBjbmV0X3dyaXRlX2JjcihkZXYsIDMyLCB2YWwpOworCisgICAgLyoKKyAgICAgKiBXZSBvbmx5IG1haW50YWluIG9uZSBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGUgZHJpdmVycyB3aWxsIG5ldmVyCisgICAgICogYmUgdXNlZCBjb25jdXJyZW50bHkuIEluIDMyYml0IG1vZGUgdGhlIFJYIGFuZCBUWCByaW5nIGVudHJpZXMKKyAgICAgKiBtdXN0IGJlIGFsaWduZWQgb24gMTYtYnl0ZSBib3VuZGFyaWVzLgorICAgICAqLworICAgIGlmIChscCA9PSBOVUxMKSB7CisJYWRkciA9ICh1MzIpbWFsbG9jKHNpemVvZihwY25ldF9wcml2X3QpICsgMHgxMCk7CisJYWRkciA9IChhZGRyICsgMHhmKSAmIH4weGY7CisJbHAgPSAocGNuZXRfcHJpdl90ICopYWRkcjsKKyAgICB9CisKKyAgICBscC0+aW5pdF9ibG9jay5tb2RlID0gY3B1X3RvX2xlMTYoMHgwMDAwKTsKKyAgICBscC0+aW5pdF9ibG9jay5maWx0ZXJbMF0gPSAweDAwMDAwMDAwOworICAgIGxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4MDAwMDAwMDA7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemUgdGhlIFJ4IHJpbmcuCisgICAgICovCisgICAgbHAtPmN1cl9yeCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJbHAtPnJ4X3JpbmdbaV0uYmFzZSA9IFBDSV9UT19NRU1fTEUoZGV2LCBscC0+cnhfYnVmW2ldKTsKKwlscC0+cnhfcmluZ1tpXS5idWZfbGVuZ3RoID0gY3B1X3RvX2xlMTYoLVBLVF9CVUZfU1opOworCWxwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IGNwdV90b19sZTE2KDB4ODAwMCk7CisJREVCVUcxKCJSeCVkOiBiYXNlPTB4JXggYnVmX2xlbmd0aD0weCV4IHN0YXR1cz0weCV4XG4iLAorCSAgICAgICBpLCBscC0+cnhfcmluZ1tpXS5iYXNlLCBscC0+cnhfcmluZ1tpXS5idWZfbGVuZ3RoLAorCSAgICAgICBscC0+cnhfcmluZ1tpXS5zdGF0dXMpOworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSB0aGUgVHggcmluZy4gVGhlIFR4IGJ1ZmZlciBhZGRyZXNzIGlzIGZpbGxlZCBpbiBhcworICAgICAqIG5lZWRlZCwgYnV0IHdlIGRvIG5lZWQgdG8gY2xlYXIgdGhlIHVwcGVyIG93bmVyc2hpcCBiaXQuCisgICAgICovCisgICAgbHAtPmN1cl90eCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJbHAtPnR4X3JpbmdbaV0uYmFzZSA9IDA7CisJbHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldHVwIEluaXQgQmxvY2suCisgICAgICovCisgICAgREVCVUcxKCJJbml0IGJsb2NrIGF0IDB4JXA6IE1BQyIsICZscC0+aW5pdF9ibG9jayk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJbHAtPmluaXRfYmxvY2sucGh5c19hZGRyW2ldID0gZGV2LT5lbmV0YWRkcltpXTsKKwlERUJVRzEoIiAlMDJ4IiwgbHAtPmluaXRfYmxvY2sucGh5c19hZGRyW2ldKTsKKyAgICB9CisKKyAgICBscC0+aW5pdF9ibG9jay50bGVuX3JsZW4gPSBjcHVfdG9fbGUxNihUWF9SSU5HX0xFTl9CSVRTIHwKKwkJCQkJICAgUlhfUklOR19MRU5fQklUUyk7CisgICAgbHAtPmluaXRfYmxvY2sucnhfcmluZyA9IFBDSV9UT19NRU1fTEUoZGV2LCBscC0+cnhfcmluZyk7CisgICAgbHAtPmluaXRfYmxvY2sudHhfcmluZyA9IFBDSV9UT19NRU1fTEUoZGV2LCBscC0+dHhfcmluZyk7CisKKyAgICBERUJVRzEoIlxudGxlbl9ybGVuPTB4JXggcnhfcmluZz0weCV4IHR4X3Jpbmc9MHgleFxuIiwKKwkgICBscC0+aW5pdF9ibG9jay50bGVuX3JsZW4sCisJICAgbHAtPmluaXRfYmxvY2sucnhfcmluZywgbHAtPmluaXRfYmxvY2sudHhfcmluZyk7CisKKyAgICAvKgorICAgICAqIFRlbGwgdGhlIGNvbnRyb2xsZXIgd2hlcmUgdGhlIEluaXQgQmxvY2sgaXMgbG9jYXRlZC4KKyAgICAgKi8KKyAgICBhZGRyID0gUENJX1RPX01FTShkZXYsICZscC0+aW5pdF9ibG9jayk7CisgICAgcGNuZXRfd3JpdGVfY3NyKGRldiwgMSwgYWRkciAmIDB4ZmZmZik7CisgICAgcGNuZXRfd3JpdGVfY3NyKGRldiwgMiwgKGFkZHIgPj4gMTYpICYgMHhmZmZmKTsKKworICAgIHBjbmV0X3dyaXRlX2NzciAoZGV2LCA0LCAweDA5MTUpOworICAgIHBjbmV0X3dyaXRlX2NzciAoZGV2LCAwLCAweDAwMDEpOyAvKiBzdGFydCAqLworCisgICAgLyogV2FpdCBmb3IgSW5pdCBEb25lIGJpdCAqLworICAgIGZvciAoaSA9IDEwMDAwOyBpID4gMDsgaS0tKSB7CisJaWYgKHBjbmV0X3JlYWRfY3NyIChkZXYsIDApICYgMHgwMTAwKQorCSAgICBicmVhazsKKwl1ZGVsYXkoMTApOworICAgIH0KKyAgICBpZiAoaSA8PSAwKSB7CisJcHJpbnRmKCIlczogVElNRU9VVDogY29udHJvbGxlciBpbml0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwlwY25ldF9yZXNldCAoZGV2KTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZpbmFsbHkgc3RhcnQgbmV0d29yayBjb250cm9sbGVyIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwY25ldF93cml0ZV9jc3IgKGRldiwgMCwgMHgwMDAyKTsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBjbmV0X3NlbmQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgdm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgcGt0X2xlbikKK3sKKyAgICBpbnQgaSwgc3RhdHVzOworICAgIHN0cnVjdCBwY25ldF90eF9oZWFkICplbnRyeSA9ICZscC0+dHhfcmluZ1tscC0+Y3VyX3R4XTsKKworICAgIERFQlVHMigiVHglZDogJWQgYnl0ZXMgZnJvbSAweCVwICIsIGxwLT5jdXJfdHgsIHBrdF9sZW4sIHBhY2tldCk7CisKKyAgICAvKiBXYWl0IGZvciBjb21wbGV0aW9uIGJ5IHRlc3RpbmcgdGhlIE9XTiBiaXQgKi8KKyAgICBmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJc3RhdHVzID0gbGUxNl90b19jcHUoZW50cnktPnN0YXR1cyk7CisJaWYgKChzdGF0dXMgJiAweDgwMDApID09IDApCisJICAgIGJyZWFrOworCXVkZWxheSgxMDApOworCURFQlVHMigiLiIpOworICAgIH0KKyAgICBpZiAoaSA8PSAwKSB7CisJcHJpbnRmKCIlczogVElNRU9VVDogVHglZCBmYWlsZWQgKHN0YXR1cyA9IDB4JXgpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGxwLT5jdXJfdHgsIHN0YXR1cyk7CisJcGt0X2xlbiA9IDA7CisJZ290byBmYWlsdXJlOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0dXAgVHggcmluZy4gQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLAorICAgICAqIHNldCB0aGUgc3RhdHVzIHdpdGggdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdC4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSAweDgzMDA7CisgICAgZW50cnktPmxlbmd0aCA9IGxlMTZfdG9fY3B1KC1wa3RfbGVuKTsKKyAgICBlbnRyeS0+bWlzYyAgID0gMHgwMDAwMDAwMDsKKyAgICBlbnRyeS0+YmFzZSAgID0gUENJX1RPX01FTV9MRShkZXYsIHBhY2tldCk7CisgICAgZW50cnktPnN0YXR1cyA9IGxlMTZfdG9fY3B1KHN0YXR1cyk7CisKKyAgICAvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwuICovCisgICAgcGNuZXRfd3JpdGVfY3NyIChkZXYsIDAsIDB4MDAwOCk7CisKKyBmYWlsdXJlOgorICAgIGlmICgrK2xwLT5jdXJfdHggPj0gVFhfUklOR19TSVpFKQorCWxwLT5jdXJfdHggPSAwOworCisgICAgREVCVUcyKCJkb25lXG4iKTsKKyAgICByZXR1cm4gcGt0X2xlbjsKK30KKworc3RhdGljIGludCBwY25ldF9yZWN2KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgICAgc3RydWN0IHBjbmV0X3J4X2hlYWQgKmVudHJ5OworICAgIGludCBwa3RfbGVuID0gMDsKKyAgICB1MTYgc3RhdHVzOworCisgICAgd2hpbGUgKDEpIHsKKwllbnRyeSA9ICZscC0+cnhfcmluZ1tscC0+Y3VyX3J4XTsKKwkvKgorCSAqIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuCisJICovCisJaWYgKCgoc3RhdHVzID0gbGUxNl90b19jcHUoZW50cnktPnN0YXR1cykpICYgMHg4MDAwKSAhPSAwKSB7CisJICAgIGJyZWFrOworCX0KKwlzdGF0dXMgPj49IDg7CisKKwlpZiAoc3RhdHVzICE9IDB4MDMpIHsJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCisJICAgIHByaW50ZigiJXM6IFJ4JWQiLCBkZXYtPm5hbWUsIGxwLT5jdXJfcngpOworCSAgICBERUJVRzEoIiAoc3RhdHVzPTB4JXgpIiwgc3RhdHVzKTsKKwkgICAgaWYgKHN0YXR1cyAmIDB4MjApIHByaW50ZigiIEZyYW1lIik7CisJICAgIGlmIChzdGF0dXMgJiAweDEwKSBwcmludGYoIiBPdmVyZmxvdyIpOworCSAgICBpZiAoc3RhdHVzICYgMHgwOCkgcHJpbnRmKCIgQ1JDIik7CisJICAgIGlmIChzdGF0dXMgJiAweDA0KSBwcmludGYoIiBGaWZvIik7CisJICAgIHByaW50ZigiIEVycm9yXG4iKTsKKwkgICAgZW50cnktPnN0YXR1cyAmPSBsZTE2X3RvX2NwdSgweDAzZmYpOworCisJfSBlbHNlIHsKKworCSAgICBwa3RfbGVuID0gKGxlMzJfdG9fY3B1KGVudHJ5LT5tc2dfbGVuZ3RoKSAmIDB4ZmZmKSAtIDQ7CisJICAgIGlmIChwa3RfbGVuIDwgNjApIHsKKwkJcHJpbnRmKCIlczogUnglZDogaW52YWxpZCBwYWNrZXQgbGVuZ3RoICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBscC0+Y3VyX3J4LCBwa3RfbGVuKTsKKwkgICAgfSBlbHNlIHsKKwkJTmV0UmVjZWl2ZShscC0+cnhfYnVmW2xwLT5jdXJfcnhdLCBwa3RfbGVuKTsKKwkJREVCVUcyKCJSeCVkOiAlZCBieXRlcyBmcm9tIDB4JXBcbiIsCisJCSAgICAgICBscC0+Y3VyX3J4LCBwa3RfbGVuLCBscC0+cnhfYnVmW2xwLT5jdXJfcnhdKTsKKwkgICAgfQorCX0KKwllbnRyeS0+c3RhdHVzIHw9IGNwdV90b19sZTE2KDB4ODAwMCk7CisKKwlpZiAoKytscC0+Y3VyX3J4ID49IFJYX1JJTkdfU0laRSkKKwkgICAgbHAtPmN1cl9yeCA9IDA7CisgICAgfQorICAgIHJldHVybiBwa3RfbGVuOworfQorCitzdGF0aWMgdm9pZCBwY25ldF9oYWx0KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgICAgaW50IGk7CisKKyAgICBERUJVRzEoIiVzOiBwY25ldF9oYWx0Li4uXG4iLCBkZXYtPm5hbWUpOworCisgICAgLyogUmVzZXQgdGhlIFBDbmV0IGNvbnRyb2xsZXIgKi8KKyAgICBwY25ldF9yZXNldCAoZGV2KTsKKworICAgIC8qIFdhaXQgZm9yIFN0b3AgYml0ICovCisgICAgZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkgeworCWlmIChwY25ldF9yZWFkX2NzciAoZGV2LCAwKSAmIDB4NCkKKwkgICAgYnJlYWs7CisJdWRlbGF5KDEwKTsKKyAgICB9CisgICAgaWYgKGkgPD0gMCkgeworCXByaW50ZigiJXM6IFRJTUVPVVQ6IGNvbnRyb2xsZXIgcmVzZXQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NtaUx5bnhFTS5jIGIvZHJpdmVycy9zbWlMeW54RU0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQ1YTMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zbWlMeW54RU0uYwpAQCAtMCwwICsxLDEwNTkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDE5OTctMjAwMiBFTFRFQyBFbGVrdHJvbmlrIEFHCisgKiBGcmFuayBHb3R0c2NobGluZyA8ZmdvdHRzY2hsaW5nQGVsdGVjLmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBzbWlMeW54RU0uYworICoKKyAqIFNpbGljb24gTW90aW9uIGdyYXBoaWMgaW50ZXJmYWNlIGZvciBzbTgxMC9zbTcxMC9zbTcxMiBhY2NlbGVyYXRvcgorICoKKyAqIG1vZGlmaWNhdGlvbiBoaXN0b3J5CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICogMDQtMTgtMjAwMiBSZXdyaXR0ZW4gZm9yIFUtQm9vdCA8ZmdvdHRzY2hsaW5nQGVsdGVjLmRlPi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fU01JX0xZTlhFTSkKKworI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPHZpZGVvX2ZiLmg+CisKKy8qCisgKiBFeHBvcnQgR3JhcGhpYyBEZXZpY2UKKyAqLworR3JhcGhpY0RldmljZSBzbWk7CisKKy8qCisgKiBTTUkgNzEwLzcxMiBoYXZlIDRNQiBpbnRlcm5hbCBSQU07IFNNSSA4MTAgMk1CIGludGVybmFsICsgMk1CIGV4dGVybmFsCisgKi8KKyNkZWZpbmUgVklERU9fTUVNX1NJWkUgIDB4NDAwMDAwCisKKy8qCisgKiBTdXBwb3J0ZWQgdmlkZW8gbW9kZXMgZm9yIFNNSSBMeW54IEUvRU0vRU0rCisgKi8KKyNkZWZpbmUgVklERU9fTU9ERVMgICAgICAgICAgICAgNworI2RlZmluZSBEVUFMXzgwMF82MDAgICAgICAgICAgICAwICAgLyogU01JNzEwOlZHQTE6NzVIeiAgICAgKHBpdGNoPTE2MDApICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgVkdBMjo2MC8xMjBIeiAocGl0Y2g9MTYwMCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNNSTgxMDpWR0ExOjc1SHogICAgIChwaXRjaD0xNjAwKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgIFZHQTI6NzVIeiAgICAgKHBpdGNoPTE2MDApICovCisjZGVmaW5lIERVQUxfMTAyNF83NjggICAgICAgICAgIDEgICAvKiBWR0ExOjc1SHogVkdBMjo3M0h6IChwaXRjaD0yMDQ4KSAgKi8KKyNkZWZpbmUgU0lOR0xFXzgwMF82MDAgICAgICAgICAgMiAgIC8qIFZHQTE6NzVIeiAocGl0Y2g9ODAwKSAgICAgICAgICAgICAqLworI2RlZmluZSBTSU5HTEVfMTAyNF83NjggICAgICAgICAzICAgLyogVkdBMTo3NUh6IChwaXRjaD0xMDI0KSAgICAgICAgICAgICovCisjZGVmaW5lIFNJTkdMRV8xMjgwXzEwMjQgICAgICAgIDQgICAvKiBWR0ExOjc1SHogKHBpdGNoPTEyODApICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFZfTU9ERV9DQ0lSICAgICAgICAgICAgNSAgIC8qIFZHQTE6NTBIeiAoaD03MjA7dj01NzY7cGl0Y2g9NzIwKSAqLworI2RlZmluZSBUVl9NT0RFX0VJQSAgICAgICAgICAgICA2ICAgLyogVkdBMTo2MEh6IChoPTcyMDt2PTQ4NDtwaXRjaD03MjApICovCisKKworLyoKKyAqIElTQSBtYXBwZWQgcmVncworICovCisjZGVmaW5lIFNNSV9JTkRYX0M0ICAgICAgICAgICAgIChwR0QtPmlzYUJhc2UgKyAweDAzYzQpICAgIC8qIGluZGV4IHJlZyAqLworI2RlZmluZSBTTUlfREFUQV9DNSAgICAgICAgICAgICAocEdELT5pc2FCYXNlICsgMHgwM2M1KSAgICAvKiBkYXRhIHJlZyAqLworI2RlZmluZSBTTUlfSU5EWF9ENCAgICAgICAgICAgICAocEdELT5pc2FCYXNlICsgMHgwM2Q0KSAgICAvKiBpbmRleCByZWcgKi8KKyNkZWZpbmUgU01JX0RBVEFfRDUgICAgICAgICAgICAgKHBHRC0+aXNhQmFzZSArIDB4MDNkNSkgICAgLyogZGF0YSByZWcgKi8KKyNkZWZpbmUgU01JX0lORFhfQ0UgICAgICAgICAgICAgKHBHRC0+aXNhQmFzZSArIDB4MDNjZSkgICAgLyogaW5kZXggcmVnICovCisjZGVmaW5lIFNNSV9EQVRBX0NGICAgICAgICAgICAgIChwR0QtPmlzYUJhc2UgKyAweDAzY2YpICAgIC8qIGRhdGEgcmVnICovCisjZGVmaW5lIFNNSV9MT0NLX1JFRyAgICAgICAgICAgIChwR0QtPmlzYUJhc2UgKyAweDAzYzMpICAgIC8qIHVubG9jay9sb2NrIGV4dCBjcnQgcmVnICovCisjZGVmaW5lIFNNSV9NSVNDX1JFRyAgICAgICAgICAgIChwR0QtPmlzYUJhc2UgKyAweDAzYzIpICAgIC8qIG1pc2MgcmVnICovCisjZGVmaW5lIFNNSV9MVVRfTUFTSyAgICAgICAgICAgIChwR0QtPmlzYUJhc2UgKyAweDAzYzYpICAgIC8qIGx1dCBtYXNrIHJlZyAqLworI2RlZmluZSBTTUlfTFVUX1NUQVJUICAgICAgICAgICAocEdELT5pc2FCYXNlICsgMHgwM2M4KSAgICAvKiBsdXQgc3RhcnQgaW5kZXggKi8KKyNkZWZpbmUgU01JX0xVVF9SR0IgICAgICAgICAgICAgKHBHRC0+aXNhQmFzZSArIDB4MDNjOSkgICAgLyogbHV0IGNvbG9ycyBhdXRvIGluY3IuKi8KKworCisvKgorICogVmlkZW8gcHJvY2Vzc29yIGNvbnRyb2wKKyovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50ICAgY29udHJvbDsKKyAgICB1bnNpZ25lZCBpbnQgICBjb2xvcktleTsKKyAgICB1bnNpZ25lZCBpbnQgICBjb2xvcktleU1hc2s7CisgICAgdW5zaWduZWQgaW50ICAgc3RhcnQ7CisgICAgdW5zaWduZWQgc2hvcnQgb2Zmc2V0OworICAgIHVuc2lnbmVkIHNob3J0IHdpZHRoOworICAgIHVuc2lnbmVkIGludCAgIGZpZm9QcmlvOworICAgIHVuc2lnbmVkIGludCAgIGZpZm9FUkw7CisgICAgdW5zaWduZWQgaW50ICAgWVVWdG9SR0I7Cit9IFNtaVZpZGVvUHJvYzsKKworLyoKKyAqIFZpZGVvIHdpbmRvdyBjb250cm9sCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBzaG9ydCB0b3A7CisgICAgdW5zaWduZWQgc2hvcnQgbGVmdDsKKyAgICB1bnNpZ25lZCBzaG9ydCBib3R0b207CisgICAgdW5zaWduZWQgc2hvcnQgcmlnaHQ7CisgICAgdW5zaWduZWQgaW50ICAgc3JjU3RhcnQ7CisgICAgdW5zaWduZWQgc2hvcnQgd2lkdGg7CisgICAgdW5zaWduZWQgc2hvcnQgb2Zmc2V0OworICAgIHVuc2lnbmVkIGNoYXIgIGhTdHJldGNoOworICAgIHVuc2lnbmVkIGNoYXIgIHZTdHJldGNoOworfSBTbWlWaWRlb1dpbjsKKworLyoKKyAqIENhcHR1cmUgcG9ydCBjb250cm9sCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgICBjb250cm9sOworICAgIHVuc2lnbmVkIHNob3J0IHRvcENsaXA7CisgICAgdW5zaWduZWQgc2hvcnQgbGVmdENsaXA7CisgICAgdW5zaWduZWQgc2hvcnQgc3JjSGVpZ2h0OworICAgIHVuc2lnbmVkIHNob3J0IHNyY1dpZHRoOworICAgIHVuc2lnbmVkIGludCAgIHNyY0J1ZlN0YXJ0MTsKKyAgICB1bnNpZ25lZCBpbnQgICBzcmNCdWZTdGFydDI7CisgICAgdW5zaWduZWQgc2hvcnQgc3JjT2Zmc2V0OworICAgIHVuc2lnbmVkIHNob3J0IGZpZm9Db250cm9sOworfSBTbWlDYXB0dXJlUG9ydDsKKworCisKKy8qCisgKiBSZWdpc3RlciB2YWx1ZXMgZm9yIGNvbW1vbiB2aWRlbyBtb2RlcworICovCitzdGF0aWMgY2hhciBTTUlfU0NSWzIyXSA9IHsKKyAgICAvKiBhbGwgbW9kZXMgKi8KKyAgICAweDEwLCAweGZmLCAweDExLCAweGZmLCAweDEyLCAweGZmLCAweDEzLCAweGZmLCAweDE0LCAweDAwLCAweDE1LCAweDkwLAorICAgIDB4MTYsIDB4MTAsIDB4MTcsIDB4MmMsIDB4MTgsIDB4YjEsIDB4MTksIDB4MjAsIDB4MWEsIDB4MDEKK307CisKK3N0YXRpYyBjaGFyIFNNSV9FWFRfQ1JUW1ZJREVPX01PREVTXVsyNF0gPSB7CisgICAgeyAvKiBEVUFMXzgwMF82MDBfOCAqLworICAgIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsCisgICAgMHgzNiwgMHgwMCwgMHgzYiwgMHgwMCwgMHgzYywgMHgwMCwgMHgzZCwgMHgwMCwgMHgzZSwgMHgwMCwgMHgzZiwgMHgwMAorICAgIH0sCisgICAgeyAvKiBEVUFMXzEwMjRfNzY4XzggKi8KKyAgICAweDMwLCAweDAwLCAweDMxLCAweDAwLCAweDMyLCAweDAwLCAweDMzLCAweDAwLCAweDM0LCAweDAwLCAweDM1LCAweDAwLAorICAgIDB4MzYsIDB4MDAsIDB4M2IsIDB4MDAsIDB4M2MsIDB4MDAsIDB4M2QsIDB4MDAsIDB4M2UsIDB4MDAsIDB4M2YsIDB4MDAKKyAgICB9LAorICAgIHsgLyogU0lOR0xFXzgwMF82MDBfOCAqLworICAgIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsCisgICAgMHgzNiwgMHgwMCwgMHgzYiwgMHgwMCwgMHgzYywgMHgwMCwgMHgzZCwgMHgwMCwgMHgzZSwgMHgwMCwgMHgzZiwgMHgwMAorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfMTAyNF83NjhfOCAqLworICAgIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsCisgICAgMHgzNiwgMHgwMCwgMHgzYiwgMHgwMCwgMHgzYywgMHgwMCwgMHgzZCwgMHgwMCwgMHgzZSwgMHgwMCwgMHgzZiwgMHgwMAorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfMTI4MF8xMDI0XzggKi8KKyAgICAweDMwLCAweDA5LCAweDMxLCAweDAwLCAweDMyLCAweDAwLCAweDMzLCAweDAwLCAweDM0LCAweDAwLCAweDM1LCAweDAwLAorICAgIDB4MzYsIDB4MDAsIDB4M2IsIDB4MDAsIDB4M2MsIDB4MDAsIDB4M2QsIDB4MDAsIDB4M2UsIDB4MDAsIDB4M2YsIDB4MDAKKyAgICB9LAorICAgIHsgLyogVFZfTU9ERV9DQ0lSICovCisgICAgMHgzMCwgMHg4MCwgMHgzMSwgMHgyYiwgMHgzMiwgMHgwNiwgMHgzMywgMHgwMSwgMHgzNCwgMHgyNiwgMHgzNSwgMHg4OCwKKyAgICAweDM2LCAweDAyLCAweDM4LCAweDExLCAweDM5LCAweDExLCAweDNhLCAweDIwLCAweDNlLCAweGEzLCAweDNmLCAweDAwCisgICAgfSwKKyAgICB7IC8qIFRWX01PREVfRUlBICovCisgICAgMHgzMCwgMHg4MCwgMHgzMSwgMHgyYiwgMHgzMiwgMHgwNiwgMHgzMywgMHgwMCwgMHgzNCwgMHhmOCwgMHgzNSwgMHg4OCwKKyAgICAweDM2LCAweDAyLCAweDM4LCAweDExLCAweDM5LCAweDExLCAweDNhLCAweDIwLCAweDNlLCAweGEzLCAweDNmLCAweDAwCisgICAgfSwKK307CisKK3N0YXRpYyBjaGFyIFNNSV9DUlRDUltWSURFT19NT0RFU11bNTBdID0geworICAgIHsgLyogRFVBTF84MDBfNjAwXzggKi8KKyAgICAweDAwLCAweDdmLCAweDAxLCAweDYzLCAweDAyLCAweDYzLCAweDAzLCAweDAwLCAweDA0LCAweDY4LCAweDA1LCAweDEyLAorICAgIDB4MDYsIDB4NmYsIDB4MDcsIDB4ZjAsIDB4MDgsIDB4MDAsIDB4MDksIDB4NjAsIDB4MGEsIDB4MDAsIDB4MGIsIDB4MDAsCisgICAgMHgwYywgMHgwMCwgMHgwZCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwZiwgMHgwMCwgMHgxMCwgMHg1OSwgMHgxMSwgMHgyYywKKyAgICAweDEyLCAweDU3LCAweDEzLCAweDY0LCAweDE0LCAweDQwLCAweDE1LCAweDU3LCAweDE2LCAweDAwLCAweDE3LCAweGUzLAorICAgIDB4MTgsIDB4ZmYKKyAgICB9LAorICAgIHsgLyogRFVBTF8xMDI0Xzc2OF84ICovCisgICAgMHgwMCwgMHg5ZiwgMHgwMSwgMHg3ZiwgMHgwMiwgMHg3ZiwgMHgwMywgMHgwMCwgMHgwNCwgMHg4MiwgMHgwNSwgMHgwZSwKKyAgICAweDA2LCAweDFlLCAweDA3LCAweGY1LCAweDA4LCAweDAwLCAweDA5LCAweDYwLCAweDBhLCAweDAwLCAweDBiLCAweDAwLAorICAgIDB4MGMsIDB4MDAsIDB4MGQsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MTAsIDB4MDEsIDB4MTEsIDB4MjQsCisgICAgMHgxMiwgMHhmZiwgMHgxMywgMHg4MCwgMHgxNCwgMHg0MCwgMHgxNSwgMHhmZiwgMHgxNiwgMHgwMCwgMHgxNywgMHhlMywKKyAgICAweDE4LCAweGZmCisgICAgfSwKKyAgICB7IC8qIFNJTkdMRV84MDBfNjAwXzggKi8KKyAgICAweDAwLCAweDdmLCAweDAxLCAweDYzLCAweDAyLCAweDYzLCAweDAzLCAweDAwLCAweDA0LCAweDY4LCAweDA1LCAweDEyLAorICAgIDB4MDYsIDB4NmYsIDB4MDcsIDB4ZjAsIDB4MDgsIDB4MDAsIDB4MDksIDB4NjAsIDB4MGEsIDB4MDAsIDB4MGIsIDB4MDAsCisgICAgMHgwYywgMHgwMCwgMHgwZCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwZiwgMHgwMCwgMHgxMCwgMHg1OSwgMHgxMSwgMHgyYywKKyAgICAweDEyLCAweDU3LCAweDEzLCAweDMyLCAweDE0LCAweDQwLCAweDE1LCAweDU3LCAweDE2LCAweDAwLCAweDE3LCAweGUzLAorICAgIDB4MTgsIDB4ZmYKKyAgICB9LAorICAgIHsgLyogU0lOR0xFXzEwMjRfNzY4XzggKi8KKyAgICAweDAwLCAweDlmLCAweDAxLCAweDdmLCAweDAyLCAweDdmLCAweDAzLCAweDAwLCAweDA0LCAweDgyLCAweDA1LCAweDBlLAorICAgIDB4MDYsIDB4MWUsIDB4MDcsIDB4ZjUsIDB4MDgsIDB4MDAsIDB4MDksIDB4NjAsIDB4MGEsIDB4MDAsIDB4MGIsIDB4MDAsCisgICAgMHgwYywgMHgwMCwgMHgwZCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwZiwgMHgwMCwgMHgxMCwgMHgwMSwgMHgxMSwgMHgyNCwKKyAgICAweDEyLCAweGZmLCAweDEzLCAweDQwLCAweDE0LCAweDQwLCAweDE1LCAweGZmLCAweDE2LCAweDAwLCAweDE3LCAweGUzLAorICAgIDB4MTgsIDB4ZmYKKyAgICB9LAorICAgIHsgLyogU0lOR0xFXzEyODBfMTAyNF84ICovCisgICAgMHgwMCwgMHhjZSwgMHgwMSwgMHg5ZiwgMHgwMiwgMHg5ZiwgMHgwMywgMHgwMCwgMHgwNCwgMHhhMiwgMHgwNSwgMHgxMiwKKyAgICAweDA2LCAweDJhLCAweDA3LCAweDVhLCAweDA4LCAweDAwLCAweDA5LCAweDYwLCAweDBhLCAweDAwLCAweDBiLCAweDAwLAorICAgIDB4MGMsIDB4MDAsIDB4MGQsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MTAsIDB4MDEsIDB4MTEsIDB4MjMsCisgICAgMHgxMiwgMHhmZiwgMHgxMywgMHg1MCwgMHgxNCwgMHg0MCwgMHgxNSwgMHhmZiwgMHgxNiwgMHgwMCwgMHgxNywgMHhlMywKKyAgICAweDE4LCAweGZmCisgICAgfSwKKyAgICB7IC8qIFRWX01PREVfQ0NJUiAqLworICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4NTksIDB4MDIsIDB4NjMsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjksIDB4MDUsIDB4MTAsCisgICAgMHgwNiwgMHg3MiwgMHgwNywgMHhmMCwgMHgwOCwgMHgwMCwgMHgwOSwgMHg2MCwgMHgwYSwgMHgwMCwgMHgwYiwgMHgwMCwKKyAgICAweDBjLCAweDAwLCAweDBkLCAweDAwLCAweDBlLCAweDAwLCAweDBmLCAweDAwLCAweDEwLCAweDU4LCAweDExLCAweDJjLAorICAgIDB4MTIsIDB4NTcsIDB4MTMsIDB4MmQsIDB4MTQsIDB4NDAsIDB4MTUsIDB4NTcsIDB4MTYsIDB4MDAsIDB4MTcsIDB4ZTMsCisgICAgMHgxOCwgMHhmZgorICAgIH0sCisgICAgeyAvKiBUVl9NT0RFX0VJQSAqLworICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4NTksIDB4MDIsIDB4NjMsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjksIDB4MDUsIDB4MTAsCisgICAgMHgwNiwgMHg3MiwgMHgwNywgMHhmMCwgMHgwOCwgMHgwMCwgMHgwOSwgMHg2MCwgMHgwYSwgMHgwMCwgMHgwYiwgMHgwMCwKKyAgICAweDBjLCAweDAwLCAweDBkLCAweDAwLCAweDBlLCAweDAwLCAweDBmLCAweDAwLCAweDEwLCAweDU4LCAweDExLCAweDJjLAorICAgIDB4MTIsIDB4NTcsIDB4MTMsIDB4MmQsIDB4MTQsIDB4NDAsIDB4MTUsIDB4NTcsIDB4MTYsIDB4MDAsIDB4MTcsIDB4ZTMsCisgICAgMHgxOCwgMHhmZgorICAgIH0sCit9OworCitzdGF0aWMgY2hhciBTTUlfU0VRUlsxMF0gPSB7CisgICAgMHgwMCwgMHgwMywgMHgwMSwgMHgwMSwgMHgwMiwgMHgwZiwgMHgwMywgMHgwMywgMHgwNCwgMHgwZQorfTsKKworc3RhdGljIGNoYXIgU01JX1BDUltWSURFT19NT0RFU11bOF0gPSB7CisgICAgeyAvKiBEVUFMXzgwMF82MDBfOCAqLworICAgIDB4MjAsIDB4MDQsIDB4MjEsIDB4MjAsIDB4MjIsIDB4MDAsIDB4MjMsIDB4MDAKKyAgICB9LAorICAgIHsgLyogRFVBTF8xMDI0Xzc2OF84ICovCisgICAgMHgyMCwgMHgwNCwgMHgyMSwgMHgyMCwgMHgyMiwgMHgwMCwgMHgyMywgMHgwMAorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfODAwXzYwMF84ICovCisgICAgMHgyMCwgMHgwNCwgMHgyMSwgMHgzMCwgMHgyMiwgMHgwMiwgMHgyMywgMHgwMAorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfMTAyNF83NjhfOCAqLworICAgIDB4MjAsIDB4MDQsIDB4MjEsIDB4MzAsIDB4MjIsIDB4MDIsIDB4MjMsIDB4MDAKKyAgICB9LAorICAgIHsgLyogU0lOR0xFXzEyODBfMTAyNF84ICovCisgICAgMHgyMCwgMHgwNCwgMHgyMSwgMHgzMCwgMHgyMiwgMHgwMiwgMHgyMywgMHgwMAorICAgIH0sCisgICAgeyAvKiBUVl9NT0RFX0NDSVIgKi8KKyAgICAweDIwLCAweDA0LCAweDIxLCAweDMwLCAweDIyLCAweDAyLCAweDIzLCAweDAwCisgICAgfSwKKyAgICB7IC8qIFRWX01PREVfRUlBICovCisgICAgMHgyMCwgMHgwNCwgMHgyMSwgMHgzMCwgMHgyMiwgMHgwMiwgMHgyMywgMHgwMAorICAgIH0sCit9OworCitzdGF0aWMgY2hhciBTTUlfTUNSW1ZJREVPX01PREVTXVs2XSA9IHsKKyAgICB7IC8qIERVQUxfODAwXzYwMF84ICovCisgICAgMHg2MCwgMHgwMSwgMHg2MSwgMHgwMCwgMHg2MiwgMHg3YQorICAgIH0sCisgICAgeyAvKiBEVUFMXzEwMjRfNzY4XzggKi8KKyAgICAweDYwLCAweDAxLCAweDYxLCAweDAwLCAweDYyLCAweDdhCisgICAgfSwKKyAgICB7IC8qIFNJTkdMRV84MDBfNjAwXzggKi8KKyAgICAweDYwLCAweDAwLCAweDYxLCAweDAwLCAweDYyLCAweDM0CisgICAgfSwKKyAgICB7IC8qIFNJTkdMRV8xMDI0Xzc2OF84ICovCisgICAgMHg2MCwgMHgwMCwgMHg2MSwgMHgwMCwgMHg2MiwgMHhmZQorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfMTI4MF8xMDI0XzggKi8KKyAgICAweDYwLCAweDAwLCAweDYxLCAweDAwLCAweDYyLCAweGZlCisgICAgfSwKKyAgICB7IC8qIFRWX01PREVfQ0NJUiAqLworICAgIDB4NjAsIDB4MDAsIDB4NjEsIDB4MDAsIDB4NjIsIDB4MzQKKyAgICB9LAorICAgIHsgLyogVFZfTU9ERV9FSUEgKi8KKyAgICAweDYwLCAweDAwLCAweDYxLCAweDAwLCAweDYyLCAweDM0CisgICAgfSwKK307CisKK3N0YXRpYyBjaGFyIFNNSV9DQ1JbVklERU9fTU9ERVNdWzE4XSA9IHsKKyAgICB7IC8qIERVQUxfODAwXzYwMF84ICovCisgICAgMHg2NSwgMHgzNCwgMHg2OCwgMHg1MCwgMHg2OSwgMHgwNSwgMHg2YSwgMHg1MywgMHg2YiwgMHgxNSwgMHg2YywgMHgxNSwKKyAgICAweDZkLCAweDA2LCAweDZlLCAweDNkLCAweDZmLCAweDEyCisgICAgfSwKKyAgICB7IC8qIERVQUxfMTAyNF83NjhfOCAqLworICAgIDB4NjUsIDB4MDAsIDB4NjgsIDB4NTAsIDB4NjksIDB4MDYsIDB4NmEsIDB4NTMsIDB4NmIsIDB4MTUsIDB4NmMsIDB4MGIsCisgICAgMHg2ZCwgMHgwMiwgMHg2ZSwgMHgwYiwgMHg2ZiwgMHgwMgorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfODAwXzYwMF84ICovCisgICAgMHg2NSwgMHgzNCwgMHg2OCwgMHg0MCwgMHg2OSwgMHgwMywgMHg2YSwgMHg1MywgMHg2YiwgMHgxNSwgMHg2YywgMHgxNSwKKyAgICAweDZkLCAweDA2LCAweDZlLCAweDNkLCAweDZmLCAweDEyCisgICAgfSwKKyAgICB7IC8qIFNJTkdMRV8xMDI0Xzc2OF84ICovCisgICAgMHg2NSwgMHgwMCwgMHg2OCwgMHg1MCwgMHg2OSwgMHgwMywgMHg2YSwgMHg1MywgMHg2YiwgMHgxNSwgMHg2YywgMHgwYiwKKyAgICAweDZkLCAweDAyLCAweDZlLCAweDBiLCAweDZmLCAweDAyCisgICAgfSwKKyAgICB7IC8qIFNJTkdMRV8xMjgwXzEwMjRfOCAqLworICAgIDB4NjUsIDB4MDAsIDB4NjgsIDB4NTAsIDB4NjksIDB4MDMsIDB4NmEsIDB4NTMsIDB4NmIsIDB4MTUsIDB4NmMsIDB4ZDksCisgICAgMHg2ZCwgMHgxNywgMHg2ZSwgMHhkOSwgMHg2ZiwgMHgxNworICAgIH0sCisgICAgeyAvKiBUVl9NT0RFX0NDSVIgKi8KKyAgICAweDY1LCAweDA3LCAweDY4LCAweGMwLCAweDY5LCAweDgxLCAweDZhLCAweDUzLCAweDZiLCAweDE1LCAweDZjLCAweDE1LAorICAgIDB4NmQsIDB4MDYsIDB4NmUsIDB4M2QsIDB4NmYsIDB4MTIKKyAgICB9LAorICAgIHsgLyogVFZfTU9ERV9FSUEgKi8KKyAgICAweDY1LCAweDA3LCAweDY4LCAweGMwLCAweDY5LCAweDgxLCAweDZhLCAweDUzLCAweDZiLCAweDE1LCAweDZjLCAweDE1LAorICAgIDB4NmQsIDB4MDYsIDB4NmUsIDB4M2QsIDB4NmYsIDB4MTIKKyAgICB9LAorfTsKKworc3RhdGljIGNoYXIgU01JX1NIVkdBW1ZJREVPX01PREVTXVsyNF0gPSB7CisgICAgeyAvKiBEVUFMXzgwMF82MDBfOCAqLworICAgIDB4NDAsIDB4N2YsIDB4NDEsIDB4NjMsIDB4NDIsIDB4MDAsIDB4NDMsIDB4NjgsIDB4NDQsIDB4MTIsIDB4NDUsIDB4NmYsCisgICAgMHg0NiwgMHg1NywgMHg0NywgMHgwMCwgMHg0OCwgMHg1OSwgMHg0OSwgMHgwYywgMHg0YSwgMHhhMCwgMHg0YiwgMHgyMCwKKyAgICB9LAorICAgIHsgLyogRFVBTF8xMDI0Xzc2OF84ICovCisgICAgMHg0MCwgMHg5ZiwgMHg0MSwgMHg3ZiwgMHg0MiwgMHgwMCwgMHg0MywgMHg4MiwgMHg0NCwgMHgwZSwgMHg0NSwgMHgxZSwKKyAgICAweDQ2LCAweGZmLCAweDQ3LCAweDAwLCAweDQ4LCAweDAwLCAweDQ5LCAweDAzLCAweDRhLCAweGU1LCAweDRiLCAweDIwLAorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfODAwXzYwMF84ICovCisgICAgMHg0MCwgMHg3ZiwgMHg0MSwgMHg2MywgMHg0MiwgMHgwMCwgMHg0MywgMHg2OCwgMHg0NCwgMHgxMiwgMHg0NSwgMHg2ZiwKKyAgICAweDQ2LCAweDU3LCAweDQ3LCAweDAwLCAweDQ4LCAweDU5LCAweDQ5LCAweDBjLCAweDRhLCAweGEwLCAweDRiLCAweDIwLAorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfMTAyNF83NjhfOCAqLworICAgIDB4NDAsIDB4OWYsIDB4NDEsIDB4N2YsIDB4NDIsIDB4MDAsIDB4NDMsIDB4ODIsIDB4NDQsIDB4MGUsIDB4NDUsIDB4MWUsCisgICAgMHg0NiwgMHhmZiwgMHg0NywgMHgwMCwgMHg0OCwgMHgwMSwgMHg0OSwgMHgwNCwgMHg0YSwgMHhhNSwgMHg0YiwgMHgyMCwKKyAgICB9LAorICAgIHsgLyogU0lOR0xFXzEyODBfMTAyNF84ICovCisgICAgMHg0MCwgMHhjZSwgMHg0MSwgMHg5ZiwgMHg0MiwgMHgwMCwgMHg0MywgMHhhMiwgMHg0NCwgMHgxMiwgMHg0NSwgMHgyYSwKKyAgICAweDQ2LCAweGZmLCAweDQ3LCAweDAwLCAweDQ4LCAweDAxLCAweDQ5LCAweDAzLCAweDRhLCAweDRhLCAweDRiLCAweDIwLAorICAgIH0sCisgICAgeyAvKiBUVl9NT0RFX0NDSVIgKi8KKyAgICAweDQwLCAweDZkLCAweDQxLCAweDU5LCAweDQyLCAweDAwLCAweDQzLCAweDYwLCAweDQ0LCAweDA5LCAweDQ1LCAweDM4LAorICAgIDB4NDYsIDB4MjUsIDB4NDcsIDB4MDUsIDB4NDgsIDB4MmEsIDB4NDksIDB4MDAsIDB4NGEsIDB4NGQsIDB4NGIsIDB4MDAsCisgICAgfSwKKyAgICB7IC8qIFRWX01PREVfRUlBICovCisgICAgMHg0MCwgMHg2ZCwgMHg0MSwgMHg1OSwgMHg0MiwgMHgwMCwgMHg0MywgMHg2MCwgMHg0NCwgMHgwOSwgMHg0NSwgMHgwNiwKKyAgICAweDQ2LCAweGY3LCAweDQ3LCAweDA1LCAweDQ4LCAweGZhLCAweDQ5LCAweDAwLCAweDRhLCAweDQxLCAweDRiLCAweDAwLAorICAgIH0sCit9OworCisKK3N0YXRpYyBjaGFyIFNNSV9HUFJbVklERU9fTU9ERVNdWzEyXSA9IHsKKyAgICB7IC8qIERVQUxfODAwXzYwMF84ICovCisgICAgMHg3MCwgMHgwMCwgMHg3MSwgMHhhMiwgMHg3MiwgMHgwZiwgMHg3MywgMHgzMCwgMHg3NCwgMHg0MCwgMHg3NSwgMHgwMAorICAgIH0sCisgICAgeyAvKiBEVUFMXzEwMjRfNzY4XzggKi8KKyAgICAweDcwLCAweDAwLCAweDcxLCAweGEyLCAweDcyLCAweDBmLCAweDczLCAweDMwLCAweDc0LCAweDQwLCAweDc1LCAweDAwCisgICAgfSwKKyAgICB7IC8qIFNJTkdMRV84MDBfNjAwXzggKi8KKyAgICAweDcwLCAweDAwLCAweDcxLCAweGEyLCAweDcyLCAweDBmLCAweDczLCAweDMwLCAweDc0LCAweDQwLCAweDc1LCAweDAwCisgICAgfSwKKyAgICB7IC8qIFNJTkdMRV8xMDI0Xzc2OF84ICovCisgICAgMHg3MCwgMHgwMCwgMHg3MSwgMHhhMiwgMHg3MiwgMHgwZiwgMHg3MywgMHgzMCwgMHg3NCwgMHg0MCwgMHg3NSwgMHgwMAorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfMTI4MF8xMDI0XzggKi8KKyAgICAweDcwLCAweDAwLCAweDcxLCAweGEyLCAweDcyLCAweDBmLCAweDczLCAweDMwLCAweDc0LCAweDQwLCAweDc1LCAweDAwCisgICAgfSwKKyAgICB7IC8qIFRWX01PREVfQ0NJUiAqLworICAgIDB4NzAsIDB4ODIsIDB4NzEsIDB4OGQsIDB4NzIsIDB4MGMsIDB4NzMsIDB4MzIsIDB4NzQsIDB4MDksIDB4NzUsIDB4MjgKKyAgICB9LAorICAgIHsgLyogVFZfTU9ERV9FSUEgKi8KKyAgICAweDcwLCAweDgyLCAweDcxLCAweDhkLCAweDcyLCAweDBjLCAweDczLCAweDMyLCAweDc0LCAweDA5LCAweDc1LCAweDI4CisgICAgfSwKK307CisKK3N0YXRpYyBjaGFyIFNNSV9IQ1JbVklERU9fTU9ERVNdWzIyXSA9IHsKKyAgICB7IC8qIERVQUxfODAwXzYwMF84ICovCisgICAgMHg4MCwgMHhmZiwgMHg4MSwgMHgwNywgMHg4MiwgMHgwMCwgMHg4MywgMHhmZiwgMHg4NCwgMHhmZiwgMHg4OCwgMHgwMCwKKyAgICAweDg5LCAweDAyLCAweDhhLCAweDgwLCAweDhiLCAweDAxLCAweDhjLCAweGZmLCAweDhkLCAweDAwCisgICAgfSwKKyAgICB7IC8qIERVQUxfMTAyNF83NjhfOCAqLworICAgIDB4ODAsIDB4ZmYsIDB4ODEsIDB4MDcsIDB4ODIsIDB4MDAsIDB4ODMsIDB4ZmYsIDB4ODQsIDB4ZmYsIDB4ODgsIDB4MDAsCisgICAgMHg4OSwgMHgwMiwgMHg4YSwgMHg4MCwgMHg4YiwgMHgwMSwgMHg4YywgMHhmZiwgMHg4ZCwgMHgwMAorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfODAwXzYwMF84ICovCisgICAgMHg4MCwgMHhmZiwgMHg4MSwgMHgwNywgMHg4MiwgMHgwMCwgMHg4MywgMHhmZiwgMHg4NCwgMHhmZiwgMHg4OCwgMHgwMCwKKyAgICAweDg5LCAweDAyLCAweDhhLCAweDgwLCAweDhiLCAweDAxLCAweDhjLCAweGZmLCAweDhkLCAweDAwCisgICAgfSwKKyAgICB7IC8qIFNJTkdMRV8xMDI0Xzc2OF84ICovCisgICAgMHg4MCwgMHhmZiwgMHg4MSwgMHgwNywgMHg4MiwgMHgwMCwgMHg4MywgMHhmZiwgMHg4NCwgMHhmZiwgMHg4OCwgMHgwMCwKKyAgICAweDg5LCAweDAyLCAweDhhLCAweDgwLCAweDhiLCAweDAxLCAweDhjLCAweGZmLCAweDhkLCAweDAwCisgICAgfSwKKyAgICB7IC8qIFNJTkdMRV8xMjgwXzEwMjRfOCAqLworICAgIDB4ODAsIDB4ZmYsIDB4ODEsIDB4MDcsIDB4ODIsIDB4MDAsIDB4ODMsIDB4ZmYsIDB4ODQsIDB4ZmYsIDB4ODgsIDB4MDAsCisgICAgMHg4OSwgMHgwMiwgMHg4YSwgMHg4MCwgMHg4YiwgMHgwMSwgMHg4YywgMHhmZiwgMHg4ZCwgMHgwMAorICAgIH0sCisgICAgeyAvKiBUVl9NT0RFX0NDSVIgKi8KKyAgICAweDgwLCAweGZmLCAweDgxLCAweDA3LCAweDgyLCAweDAwLCAweDgzLCAweGZmLCAweDg0LCAweGZmLCAweDg4LCAweDAwLAorICAgIDB4ODksIDB4MDIsIDB4OGEsIDB4ODAsIDB4OGIsIDB4MDEsIDB4OGMsIDB4ZmYsIDB4OGQsIDB4MDAKKyAgICB9LAorICAgIHsgLyogVFZfTU9ERV9FSUEgKi8KKyAgICAweDgwLCAweGZmLCAweDgxLCAweDA3LCAweDgyLCAweDAwLCAweDgzLCAweGZmLCAweDg0LCAweGZmLCAweDg4LCAweDAwLAorICAgIDB4ODksIDB4MDIsIDB4OGEsIDB4ODAsIDB4OGIsIDB4MDEsIDB4OGMsIDB4ZmYsIDB4OGQsIDB4MDAKKyAgICB9LAorfTsKKworc3RhdGljIGNoYXIgU01JX0ZQUltWSURFT19NT0RFU11bODhdID0geworICAgIHsgLyogRFVBTF84MDBfNjAwXzggKi8KKyAgICAweDMwLCAweDM2LCAweDMxLCAweDgzLCAweDMyLCAweDM4LCAweDMzLCAweDAwLCAweDM0LCAweDQwLCAweDNlLCAweDAzLAorICAgIDB4M2YsIDB4ZmYsIDB4NDAsIDB4NjQsIDB4NDEsIDB4MDAsIDB4NDIsIDB4MDAsIDB4NDMsIDB4MDAsIDB4NDQsIDB4YzgsCisgICAgMHg0NSwgMHgwMiwgMHg0NiwgMHgwMCwgMHg0NywgMHhmYywgMHg0OCwgMHgyMCwgMHg0OSwgMHgxYywgMHg0YSwgMHg0MSwKKyAgICAweDRiLCAweGEwLCAweDRjLCAweDAwLAorICAgIDB4NTAsIDB4MDQsIDB4NTEsIDB4NDgsIDB4NTIsIDB4ODMsIDB4NTMsIDB4NjMsIDB4NTQsIDB4NjcsIDB4NTUsIDB4NzEsCisgICAgMHg1NiwgMHg1NywgMHg1NywgMHg1OSwgMHg1OCwgMHgwMywgMHg1OSwgMHgwMCwgMHg1YSwgMHg0YSwKKyAgICAweGExLCAweDAwLCAweGEyLCAweDAwLCAweGEzLCAweDAwLCAweGE0LCAweDAwLCAweGE4LCAweDAwLCAweGE5LCAweDAwLAorICAgIDB4YWEsIDB4ZGYsIDB4YWIsIDB4N2YsIDB4YWMsIDB4MDAsIDB4YWQsIDB4NDEsIDB4YWUsIDB4MDAsIDB4YWYsIDB4MDAsCisgICAgMHhhMCwgMHg0NAorICAgIH0sCisgICAgeyAvKiBEVUFMXzEwMjRfNzY4XzggKi8KKyAgICAweDMwLCAweDNhLCAweDMxLCAweDgzLCAweDMyLCAweDM4LCAweDMzLCAweDAwLCAweDM0LCAweDQwLCAweDNlLCAweDAwLAorICAgIDB4M2YsIDB4MDAsIDB4NDAsIDB4ODAsIDB4NDEsIDB4MDAsIDB4NDIsIDB4MDAsIDB4NDMsIDB4MDAsIDB4NDQsIDB4MDAsCisgICAgMHg0NSwgMHg0MiwgMHg0NiwgMHgwMCwgMHg0NywgMHhmYywgMHg0OCwgMHgyMCwgMHg0OSwgMHgxYywgMHg0YSwgMHg0MSwKKyAgICAweDRiLCAweGEwLCAweDRjLCAweDAwLAorICAgIDB4NTAsIDB4MDYsIDB4NTEsIDB4NjgsIDB4NTIsIDB4YTcsIDB4NTMsIDB4N2YsIDB4NTQsIDB4ODMsIDB4NTUsIDB4MjUsCisgICAgMHg1NiwgMHhmZiwgMHg1NywgMHgwMywgMHg1OCwgMHgwNCwgMHg1OSwgMHgwMCwgMHg1YSwgMHhjMiwKKyAgICAweGExLCAweDAwLCAweGEyLCAweDAwLCAweGEzLCAweDAwLCAweGE0LCAweDAwLCAweGE4LCAweDAwLCAweGE5LCAweDAwLAorICAgIDB4YWEsIDB4ZGYsIDB4YWIsIDB4N2YsIDB4YWMsIDB4MDAsIDB4YWQsIDB4NDEsIDB4YWUsIDB4MDAsIDB4YWYsIDB4MDAsCisgICAgMHhhMCwgMHg0NAorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfODAwXzYwMF84ICovCisgICAgMHgzMCwgMHgzNiwgMHgzMSwgMHg4MiwgMHgzMiwgMHgzOCwgMHgzMywgMHgwMCwgMHgzNCwgMHg0MCwgMHgzZSwgMHgwMywKKyAgICAweDNmLCAweGZmLCAweDQwLCAweDY0LCAweDQxLCAweDAwLCAweDQyLCAweDAwLCAweDQzLCAweDAwLCAweDQ0LCAweGM4LAorICAgIDB4NDUsIDB4MDIsIDB4NDYsIDB4MDAsIDB4NDcsIDB4ZmMsIDB4NDgsIDB4MjAsIDB4NDksIDB4MWMsIDB4NGEsIDB4MDAsCisgICAgMHg0YiwgMHhhMCwgMHg0YywgMHgwMCwKKyAgICAweDUwLCAweDA0LCAweDUxLCAweDQ4LCAweDUyLCAweDgzLCAweDUzLCAweDYzLCAweDU0LCAweDY3LCAweDU1LCAweDcxLAorICAgIDB4NTYsIDB4NTcsIDB4NTcsIDB4NTksIDB4NTgsIDB4MDMsIDB4NTksIDB4MDAsIDB4NWEsIDB4NGEsCisgICAgMHhhMSwgMHgwMCwgMHhhMiwgMHgwMCwgMHhhMywgMHgwMCwgMHhhNCwgMHgwMCwgMHhhOCwgMHgwMCwgMHhhOSwgMHgwMCwKKyAgICAweGFhLCAweGRmLCAweGFiLCAweDdmLCAweGFjLCAweDAwLCAweGFkLCAweDQxLCAweGFlLCAweDAwLCAweGFmLCAweDAwLAorICAgIDB4YTAsIDB4NDQKKyAgICB9LAorICAgIHsgLyogU0lOR0xFXzEwMjRfNzY4XzggKi8KKyAgICAweDMwLCAweDNhLCAweDMxLCAweDgyLCAweDMyLCAweDM4LCAweDMzLCAweDAwLCAweDM0LCAweDQwLCAweDNlLCAweDAwLAorICAgIDB4M2YsIDB4MDAsIDB4NDAsIDB4ODAsIDB4NDEsIDB4MDAsIDB4NDIsIDB4MDAsIDB4NDMsIDB4MDAsIDB4NDQsIDB4MDAsCisgICAgMHg0NSwgMHg0MiwgMHg0NiwgMHgwMCwgMHg0NywgMHhmYywgMHg0OCwgMHgyMCwgMHg0OSwgMHgxYywgMHg0YSwgMHgxMSwKKyAgICAweDRiLCAweGEwLCAweDRjLCAweDAwLAorICAgIDB4NTAsIDB4MDYsIDB4NTEsIDB4NjgsIDB4NTIsIDB4YTcsIDB4NTMsIDB4N2YsIDB4NTQsIDB4ODMsIDB4NTUsIDB4MjQsCisgICAgMHg1NiwgMHhmZiwgMHg1NywgMHgwMywgMHg1OCwgMHgwNCwgMHg1OSwgMHgwMCwgMHg1YSwgMHhjMiwKKyAgICAweGExLCAweDAwLCAweGEyLCAweDAwLCAweGEzLCAweDAwLCAweGE0LCAweDAwLCAweGE4LCAweDAwLCAweGE5LCAweDAwLAorICAgIDB4YWEsIDB4ZGYsIDB4YWIsIDB4N2YsIDB4YWMsIDB4MDAsIDB4YWQsIDB4NDEsIDB4YWUsIDB4MDAsIDB4YWYsIDB4MDAsCisgICAgMHhhMCwgMHg0NAorICAgIH0sCisgICAgeyAvKiBTSU5HTEVfMTI4MF8xMDI0XzggKi8KKyAgICAweDMwLCAweDNlLCAweDMxLCAweDgyLCAweDMyLCAweDM4LCAweDMzLCAweDAwLCAweDM0LCAweDQwLCAweDNlLCAweDAwLAorICAgIDB4M2YsIDB4MDAsIDB4NDAsIDB4YTAsIDB4NDEsIDB4MDAsIDB4NDIsIDB4MDAsIDB4NDMsIDB4MDAsIDB4NDQsIDB4MDAsCisgICAgMHg0NSwgMHg0MiwgMHg0NiwgMHgwMCwgMHg0NywgMHhmYywgMHg0OCwgMHgyMCwgMHg0OSwgMHgxYywgMHg0YSwgMHgxMSwKKyAgICAweDRiLCAweGEwLCAweDRjLCAweDAwLAorICAgIDB4NTAsIDB4MDgsIDB4NTEsIDB4ODgsIDB4NTIsIDB4ZDMsIDB4NTMsIDB4OWYsIDB4NTQsIDB4YTMsIDB4NTUsIDB4MmEsCisgICAgMHg1NiwgMHhmZiwgMHg1NywgMHgwNCwgMHg1OCwgMHgwMCwgMHg1OSwgMHgwMCwgMHg1YSwgMHg2MywKKyAgICAweGExLCAweDAwLCAweGEyLCAweDAwLCAweGEzLCAweDAwLCAweGE0LCAweDAwLCAweGE4LCAweDAwLCAweGE5LCAweDAwLAorICAgIDB4YWEsIDB4ZGYsIDB4YWIsIDB4N2YsIDB4YWMsIDB4MDAsIDB4YWQsIDB4NDEsIDB4YWUsIDB4MDAsIDB4YWYsIDB4MDAsCisgICAgMHhhMCwgMHg0NAorICAgIH0sCisgICAgeyAvKiBUVl9NT0RFX0NDSVIgKi8KKyAgICAweDMwLCAweDI0LCAweDMxLCAweDg0LCAweDMyLCAweDIwLCAweDMzLCAweDA5LCAweDM0LCAweGYwLCAweDNlLCAweDAzLAorICAgIDB4M2YsIDB4ZmYsIDB4NDAsIDB4NjQsIDB4NDEsIDB4MDAsIDB4NDIsIDB4MDAsIDB4NDMsIDB4MDAsIDB4NDQsIDB4YzgsCisgICAgMHg0NSwgMHgwMiwgMHg0NiwgMHgwMCwgMHg0NywgMHhmYywgMHg0OCwgMHgyMCwgMHg0OSwgMHgxYywgMHg0YSwgMHgwMCwKKyAgICAweDRiLCAweGEwLCAweDRjLCAweDAwLAorICAgIDB4NTAsIDB4MDQsIDB4NTEsIDB4NDgsIDB4NTIsIDB4ODMsIDB4NTMsIDB4NjMsIDB4NTQsIDB4NjgsIDB4NTUsIDB4NzMsCisgICAgMHg1NiwgMHg1NywgMHg1NywgMHg1OCwgMHg1OCwgMHgwNCwgMHg1OSwgMHg1NywgMHg1YSwgMHg3YiwKKyAgICAweGExLCAweDEwLCAweGEyLCAweGFiLCAweGEzLCAweDk4LCAweGE0LCAweGMxLCAweGE4LCAweDhjLCAweGE5LCAweDA1LAorICAgIDB4YWEsIDB4MTcsIDB4YWIsIDB4MzUsIDB4YWMsIDB4NDEsIDB4YWQsIDB4NjgsIDB4YWUsIDB4MDAsIDB4YWYsIDB4MDAsCisgICAgMHhhMCwgMHgwMAorICAgIH0sCisgICAgeyAvKiBUVl9NT0RFX0VJQSAqLworICAgIDB4MzAsIDB4MjQsIDB4MzEsIDB4ODQsIDB4MzIsIDB4MjAsIDB4MzMsIDB4MDksIDB4MzQsIDB4ZjAsIDB4M2UsIDB4MDMsCisgICAgMHgzZiwgMHhmZiwgMHg0MCwgMHg2NCwgMHg0MSwgMHgwMCwgMHg0MiwgMHgwMCwgMHg0MywgMHgwMCwgMHg0NCwgMHhjOCwKKyAgICAweDQ1LCAweDAyLCAweDQ2LCAweDAwLCAweDQ3LCAweGZjLCAweDQ4LCAweDIwLCAweDQ5LCAweDFjLCAweDRhLCAweDAwLAorICAgIDB4NGIsIDB4YTAsIDB4NGMsIDB4MDAsCisgICAgMHg1MCwgMHgwNCwgMHg1MSwgMHg0OCwgMHg1MiwgMHg4MywgMHg1MywgMHg2MywgMHg1NCwgMHg2OCwgMHg1NSwgMHg3MywKKyAgICAweDU2LCAweDU3LCAweDU3LCAweDU4LCAweDU4LCAweDA0LCAweDU5LCAweDU3LCAweDVhLCAweDdiLAorICAgIDB4YTEsIDB4MTAsIDB4YTIsIDB4YWIsIDB4YTMsIDB4OTgsIDB4YTQsIDB4YzEsIDB4YTgsIDB4OGMsIDB4YTksIDB4MDUsCisgICAgMHhhYSwgMHgxNywgMHhhYiwgMHgzNSwgMHhhYywgMHg0MSwgMHhhZCwgMHg2OCwgMHhhZSwgMHgwMCwgMHhhZiwgMHgwMCwKKyAgICAweGEwLCAweDAwCisgICAgfSwKK307CisKK3N0YXRpYyBjaGFyIFNNSV9HQ1JbMThdID0geworICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDUsIDB4NDAsCisgICAgMHgwNiwgMHgwNSwgMHgwNywgMHgwZiwgMHgwOCwgMHhmZgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogUmVhZCBTTUkgSVNBIHJlZ2lzdGVyCisqLworc3RhdGljIGNoYXIgc21pUmVhZCAodW5zaWduZWQgc2hvcnQgaW5kZXgsIGNoYXIgcmVnKQoreworICAgIHJlZ2lzdGVyIEdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopJnNtaTsKKworICAgIG91dDggKChwR0QtPmlzYUJhc2UgKyBpbmRleCksIHJlZyk7CisgICAgcmV0dXJuIChpbjggKHBHRC0+aXNhQmFzZSArIGluZGV4ICsgMSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBXcml0ZSBTTUkgSVNBIHJlZ2lzdGVyCisqLworc3RhdGljIHZvaWQgc21pV3JpdGUgKHVuc2lnbmVkIHNob3J0IGluZGV4LCBjaGFyIHJlZywgY2hhciB2YWwpCit7CisgICAgcmVnaXN0ZXIgR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikmc21pOworCisgICAgb3V0OCAoKHBHRC0+aXNhQmFzZSArIGluZGV4KSwgcmVnKTsKKyAgICBvdXQ4ICgocEdELT5pc2FCYXNlICsgaW5kZXggKyAxKSwgdmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogV3JpdGUgYSB0YWJsZSBvZiBTTUkgSVNBIHJlZ2lzdGVyCisqLworc3RhdGljIHZvaWQgc21pTG9hZFJlZ3MgKAorICAgIHVuc2lnbmVkIGludCBpUmVnLAorICAgIHVuc2lnbmVkIGludCBkUmVnLAorICAgIGNoYXIgICAgICAgICAqcmVnVGFiLAorICAgIHVuc2lnbmVkIGludCB0YWJTaXplCisgICAgKQoreworICAgIHJlZ2lzdGVyIGludCBpOworCisgICAgZm9yIChpPTA7IGk8dGFiU2l6ZTsgaSs9MikKKyAgICB7CisgICAgICAgIG91dDggKGlSZWcsIHJlZ1RhYltpXSk7CisgICAgICAgIG91dDggKGRSZWcsIHJlZ1RhYltpKzFdKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEluaXQgY2FwdHVyZSBwb3J0IHJlZ2lzdGVycworKi8KK3N0YXRpYyB2b2lkIHNtaUluaXRDYXB0dXJlUG9ydCAodm9pZCkKK3sKKyAgICBTbWlDYXB0dXJlUG9ydCBzbWlDUCA9IHsgMHgwMTQwMDYwMCwgMHgzMCwgMHg0MCwgNDgwLCA2NDAsIDAsIDAsIDI1NjAsIDYgfTsKKyAgICByZWdpc3RlciBHcmFwaGljRGV2aWNlICpwR0QgID0gKEdyYXBoaWNEZXZpY2UgKikmc21pOworICAgIHJlZ2lzdGVyIFNtaUNhcHR1cmVQb3J0ICpwQ1AgPSAoU21pQ2FwdHVyZVBvcnQgKikmc21pQ1A7CisKKyAgICBvdXQzMnIgKChwR0QtPmNwckJhc2UgKyAweDAwMDQpLCAoKHBDUC0+dG9wQ2xpcDw8MTYpICAgfCBwQ1AtPmxlZnRDbGlwKSk7CisgICAgb3V0MzJyICgocEdELT5jcHJCYXNlICsgMHgwMDA4KSwgKChwQ1AtPnNyY0hlaWdodDw8MTYpIHwgcENQLT5zcmNXaWR0aCkpOworICAgIG91dDMyciAoKHBHRC0+Y3ByQmFzZSArIDB4MDAwYyksIHBDUC0+c3JjQnVmU3RhcnQxLzgpOworICAgIG91dDMyciAoKHBHRC0+Y3ByQmFzZSArIDB4MDAxMCksIHBDUC0+c3JjQnVmU3RhcnQyLzgpOworICAgIG91dDMyciAoKHBHRC0+Y3ByQmFzZSArIDB4MDAxNCksIHBDUC0+c3JjT2Zmc2V0LzgpOworICAgIG91dDMyciAoKHBHRC0+Y3ByQmFzZSArIDB4MDAxOCksIHBDUC0+Zmlmb0NvbnRyb2wpOworICAgIG91dDMyciAoKHBHRC0+Y3ByQmFzZSArIDB4MDAwMCksIHBDUC0+Y29udHJvbCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogSW5pdCB2aWRlbyBwcm9jZXNzb3IgcmVnaXN0ZXJzCisqLworc3RhdGljIHZvaWQgc21pSW5pdFZpZGVvUHJvY2Vzc29yICh2b2lkKQoreworICAgIFNtaVZpZGVvUHJvYyBzbWlWUCA9IHsgMHgxMDAwMDAsIDAsIDAsIDAsIDAsIDE2MDAsIDB4MTIwMDU0MywgNCwgMHhlZGVkZWQgfTsKKyAgICBTbWlWaWRlb1dpbiAgc21pVlcgPSB7IDAsIDAsIDU5OSwgNzk5LCAwLCAxNjAwLCAwLCAwLCAwIH07CisgICAgcmVnaXN0ZXIgR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikmc21pOworICAgIHJlZ2lzdGVyIFNtaVZpZGVvUHJvYyAgKnBWUCA9IChTbWlWaWRlb1Byb2MgKikmc21pVlA7CisgICAgcmVnaXN0ZXIgU21pVmlkZW9XaW4gKnBWV2luID0gKFNtaVZpZGVvV2luICopJnNtaVZXOworCisgICAgcFZQLT53aWR0aCAgICA9IHBHRC0+cGxuU2l6ZVggKiBwR0QtPmdkZkJ5dGVzUFA7CisgICAgcFZQLT5jb250cm9sIHw9IHBHRC0+Z2RmSW5kZXggPDwgMTY7CisgICAgcFZXaW4tPmJvdHRvbSA9IHBHRC0+d2luU2l6ZVkgLSAxOworICAgIHBWV2luLT5yaWdodCAgPSBwR0QtPndpblNpemVYIC0gMTsKKyAgICBwVldpbi0+d2lkdGggID0gcFZQLT53aWR0aDsKKworICAgIC8qIGNvbG9yIGtleSAqLworICAgIG91dDMyciAoKHBHRC0+dnByQmFzZSArIDB4MDAwNCksIHBWUC0+Y29sb3JLZXkpOworCisgICAgIC8qIGNvbG9yIGtleSBtYXNrICovCisgICAgb3V0MzJyICgocEdELT52cHJCYXNlICsgMHgwMDA4KSwgcFZQLT5jb2xvcktleU1hc2spOworCisgICAgLyogZGF0YSBzcmMgc3RhcnQgYWRycyAqLworICAgIG91dDMyciAoKHBHRC0+dnByQmFzZSArIDB4MDAwYyksIHBWUC0+c3RhcnQgLyA4KTsKKworICAgIC8qIGRhdGEgd2lkdGggYW5kIG9mZnNldCAqLworICAgIG91dDMyciAoKHBHRC0+dnByQmFzZSArIDB4MDAxMCksCisgICAgICAgICgocFZQLT5vZmZzZXQgICAvIDggKiBwR0QtPmdkZkJ5dGVzUFApIDw8IDE2KSB8CisgICAgICAgICAocEdELT5wbG5TaXplWCAvIDggKiBwR0QtPmdkZkJ5dGVzUFApKTsKKworICAgIC8qIHZpZGVvIHdpbmRvdyAxICovCisgICAgb3V0MzJyICgocEdELT52cHJCYXNlICsgMHgwMDE0KSwKKyAgICAgICAgKChwVldpbi0+dG9wIDw8IDE2KSB8IHBWV2luLT5sZWZ0KSk7CisKKyAgICBvdXQzMnIgKChwR0QtPnZwckJhc2UgKyAweDAwMTgpLAorICAgICAgICAoKHBWV2luLT5ib3R0b20gPDwgMTYpIHwgcFZXaW4tPnJpZ2h0KSk7CisKKyAgICBvdXQzMnIgKChwR0QtPnZwckJhc2UgKyAweDAwMWMpLCBwVldpbi0+c3JjU3RhcnQgLyA4KTsKKworICAgIG91dDMyciAoKHBHRC0+dnByQmFzZSArIDB4MDAyMCksCisgICAgICAgICgoKHBWV2luLT5vZmZzZXQgLyA4KSA8PCAxNikgfCAocFZXaW4tPndpZHRoIC8gOCkpKTsKKworICAgIG91dDMyciAoKHBHRC0+dnByQmFzZSArIDB4MDAyNCksCisgICAgICAgICgoKHBWV2luLT5oU3RyZXRjaCkgPDwgOCkgfCBwVldpbi0+dlN0cmV0Y2gpKTsKKworICAgIC8qIHZpZGVvIHdpbmRvdyAyICovCisgICAgb3V0MzJyICgocEdELT52cHJCYXNlICsgMHgwMDI4KSwKKyAgICAgICAgKChwVldpbi0+dG9wIDw8IDE2KSB8IHBWV2luLT5sZWZ0KSk7CisKKyAgICBvdXQzMnIgKChwR0QtPnZwckJhc2UgKyAweDAwMmMpLAorICAgICAgICAoKHBWV2luLT5ib3R0b20gPDwgMTYpIHwgcFZXaW4tPnJpZ2h0KSk7CisKKyAgICBvdXQzMnIgKChwR0QtPnZwckJhc2UgKyAweDAwMzApLAorICAgICAgICBwVldpbi0+c3JjU3RhcnQgLyA4KTsKKworICAgIG91dDMyciAoKHBHRC0+dnByQmFzZSArIDB4MDAzNCksCisgICAgICAgICgoKHBWV2luLT5vZmZzZXQgLyA4KSA8PCAxNikgfCAocFZXaW4tPndpZHRoIC8gOCkpKTsKKworICAgIG91dDMyciAoKHBHRC0+dnByQmFzZSArIDB4MDAzOCksCisgICAgICAgICgoKHBWV2luLT5oU3RyZXRjaCkgPDwgOCkgfCBwVldpbi0+dlN0cmV0Y2gpKTsKKworICAgIC8qIGZpZm8gcHJpbyBjb250cm9sICovCisgICAgb3V0MzJyICgocEdELT52cHJCYXNlICsgMHgwMDU0KSwgcFZQLT5maWZvUHJpbyk7CisKKyAgICAvKiBmaWZvIGVtcHR5IHJlcXVlc3QgbGV2ZWxsICovCisgICAgb3V0MzJyICgocEdELT52cHJCYXNlICsgMHgwMDU4KSwgcFZQLT5maWZvRVJMKTsKKworICAgIC8qIGNvbnZlcnNpb24gY29uc3RhbnQgKi8KKyAgICBvdXQzMnIgKChwR0QtPnZwckJhc2UgKyAweDAwNWMpLCBwVlAtPllVVnRvUkdCKTsKKworICAgIC8qIHZwciBjb250cm9sIHdvcmQgKi8KKyAgICBvdXQzMnIgKChwR0QtPnZwckJhc2UgKyAweDAwMDApLCBwVlAtPmNvbnRyb2wpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW5pdCBkcmF3aW5nIGVuZ2luZSByZWdpc3RlcnMKKyAqLworc3RhdGljIHZvaWQgc21pSW5pdERyYXdpbmdFbmdpbmUgKHZvaWQpCit7CisgICAgR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikmc21pOworICAgIHVuc2lnbmVkIGludCB2YWw7CisKKyAgICAvKiBkb24ndCBzdGFydCBub3cgKi8KKyAgICBvdXQzMnIgKChwR0QtPmRwckJhc2UgKyAweDAwMGMpLCAweDAwMGYwMDAwKTsKKworICAgIC8qIHNldCByb3AyIHRvIGNvcHlwZW4gKi8KKyAgICB2YWwgPSAweGZmZmYzZmYwICYgaW4zMnIgKChwR0QtPmRwckJhc2UgKyAweDAwMGMpKTsKKyAgICBvdXQzMnIgKChwR0QtPmRwckJhc2UgKyAweDAwMGMpLCAodmFsIHwgMHg4MDAwIHwgMHgwYykpOworCisgICAgLyogc2V0IGNsaXAgcmVjdCAqLworICAgIG91dDMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAyYyksIDApOworICAgIG91dDMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAzMCksCisgICAgICAgICgocEdELT53aW5TaXplWTw8MTYpIHwgcEdELT53aW5TaXplWCAqIHBHRC0+Z2RmQnl0ZXNQUCApKTsKKworICAgIC8qIHNyYyByb3cgcGl0Y2ggKi8KKyAgICB2YWwgPSAweGZmZmYwMDAwICYgKGluMzJyICgocEdELT5kcHJCYXNlICsgMHgwMDEwKSkpOworICAgIG91dDMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAxMCksCisgICAgICAgICh2YWwgfCBwR0QtPnBsblNpemVYICogcEdELT5nZGZCeXRlc1BQKSk7CisKKyAgICAvKiBkc3Qgcm93IHBpdGNoICovCisgICAgdmFsID0gMHgwMDAwZmZmZiAmIChpbjMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAxMCkpKTsKKyAgICBvdXQzMnIgKChwR0QtPmRwckJhc2UgKyAweDAwMTApLAorICAgICAgICAoKChwR0QtPnBsblNpemVYICogcEdELT5nZGZCeXRlc1BQKTw8MTYpIHwgdmFsKSk7CisKKyAgICAvKiB3aW5kb3cgd2lkdGggc3JjL2RzdCAqLworICAgIG91dDMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAzYyksCisgICAgICAgICgoKHBHRC0+cGxuU2l6ZVggKiBwR0QtPmdkZkJ5dGVzUFAgJiAweDBmZmYpPDwxNikgfAorICAgICAgICAgIChwR0QtPnBsblNpemVYICogcEdELT5nZGZCeXRlc1BQICYgMHgwZmZmKSkpOworICAgIG91dDE2ciAoKHBHRC0+ZHByQmFzZSArIDB4MDAxZSksIDB4MDAwMCk7CisKKyAgICAvKiBzcmMgYmFzZSBhZHJzICovCisgICAgb3V0MzJyICgocEdELT5kcHJCYXNlICsgMHgwMDQwKSwKKyAgICAgICAgKCgocEdELT5mcmFtZUFkcnMvOCkgJiAweDAwMGZmZmZmKSkpOworCisgICAgLyogZHN0IGJhc2UgYWRycyAqLworICAgIG91dDMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDA0NCksCisgICAgICAgICgoKHBHRC0+ZnJhbWVBZHJzLzgpICYgMHgwMDBmZmZmZikpKTsKKworICAgIC8qIGZvcmVncm91bmQgY29sb3IgKi8KKyAgICBvdXQzMnIgKChwR0QtPmRwckJhc2UgKyAweDAwMTQpLCBwR0QtPmZnKTsKKworICAgIC8qIGJhY2tncm91bmQgY29sb3IgKi8KKyAgICBvdXQzMnIgKChwR0QtPmRwckJhc2UgKyAweDAwMTgpLCBwR0QtPmJnKTsKKworICAgIC8qIHhjb2xvciAqLworICAgIG91dDMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAyMCksIDB4MDBmZmZmZmYpOworCisgICAgLyogeGNvbG9yIG1hc2sgKi8KKyAgICBvdXQzMnIgKChwR0QtPmRwckJhc2UgKyAweDAwMjQpLCAweDAwZmZmZmZmKTsKKworICAgIC8qIGJpdCBtYXNrICovCisgICAgb3V0MzJyICgocEdELT5kcHJCYXNlICsgMHgwMDI4KSwgMHgwMGZmZmZmZik7CisKKyAgICAvKiBsb2FkIG1vbm8gcGF0dGVybiAqLworICAgIG91dDMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAzNCksIDApOworICAgIG91dDMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAzOCksIDApOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3VwcG9ydGVkW10gPSB7CisgICAgeyBQQ0lfVkVORE9SX0lEX1NNSSwgUENJX0RFVklDRV9JRF9TTUlfNzEwIH0sCisgICAgeyBQQ0lfVkVORE9SX0lEX1NNSSwgUENJX0RFVklDRV9JRF9TTUlfNzEyIH0sCisgICAgeyBQQ0lfVkVORE9SX0lEX1NNSSwgUENJX0RFVklDRV9JRF9TTUlfODEwIH0sCisgICAgeyB9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEluaXQgdmlkZW8gY2hpcCB3aXRoIGNvbW1vbiBMaW51eCBncmFwaGljIG1vZGVzIChsaWxvKQorKi8KK3ZvaWQgKnZpZGVvX2h3X2luaXQgKHZvaWQpCit7CisgICAgR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikmc21pOworICAgIHVuc2lnbmVkIHNob3J0IGRldmljZV9pZDsKKyAgICBwY2lfZGV2X3QgZGV2YnVzZm47CisgICAgaW50IHZpZGVvbW9kZTsKKyAgICB1bnNpZ25lZCBpbnQgcGNpX21lbV9iYXNlLCAqdm0sIGk7CisgICAgdW5zaWduZWQgaW50IGdkZlRhYltdID0geyAxLCAyLCAyLCA0LCAzLCAxIH07CisgICAgY2hhciAqcGVudjsKKyAgICBjaGFyICpnZGZNb2Rlc1tdID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICI4IEJpdCBJbmRleCBDb2xvciIsCisgICAgICAgICAgICAiMTUgQml0IDUtNS01IFJHQiIsCisgICAgICAgICAgICAiMTYgQml0IDUtNi01IFJHQiIsCisgICAgICAgICAgICAiMzIgQml0IFgtOC04LTggUkdCIiwKKyAgICAgICAgICAgICIyNCBCaXQgOC04LTggUkdCIiwKKyAgICAgICAgICAgICI4IEJpdCAzLTMtMiBSR0IiCisgICAgICAgICAgICB9OworICAgIGludCB2Z2FNb2Rlc1sxNl1bMl0gPQorICAgICAgICAgICAgeworICAgICAgICAgICAgezc2OSwgLTF9LCB7NzcxLCAweDAwMDAyfSwgezc3MywgMHgwMDAwM30sIHs3NzUsIDB4MDAwMDR9LAorICAgICAgICAgICAgezc4NCwgLTF9LCB7Nzg3LCAweDEwMDAyfSwgezc5MCwgMHgxMDAwM30sIHs3OTMsIDB4MTAwMDR9LAorICAgICAgICAgICAgezc4NSwgLTF9LCB7Nzg4LCAweDIwMDAyfSwgezc5MSwgMHgyMDAwM30sIHs3OTQsIDB4MjAwMDR9LAorICAgICAgICAgICAgezc4NiwgLTF9LCB7Nzg5LCAweDQwMDAyfSwgezc5MiwgMHg0MDAwM30sIHs3OTUsIDB4NDAwMDR9CisgICAgICAgICAgICB9OworCisgICAgLyogU2VhcmNoIGZvciB2aWRlbyBjaGlwICovCisgICAgcHJpbnRmKCJWaWRlbzogIik7CisKKyAgICBpZiAoKGRldmJ1c2ZuID0gcGNpX2ZpbmRfZGV2aWNlcyhzdXBwb3J0ZWQsIDApKSA8IDApCisgICAgeworICAgICAgICBwcmludGYgKCJDb250cm9sbGVyIG5vdCBmb3VuZCAhXG4iKTsKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICB9CisKKyAgICAvKiBQQ0kgc2V0dXAgKi8KKyAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkIChkZXZidXNmbiwgUENJX0NPTU1BTkQsIChQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9JTykpOworICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkIChkZXZidXNmbiwgUENJX0RFVklDRV9JRCwgJmRldmljZV9pZCk7CisgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkIChkZXZidXNmbiwgUENJX0JBU0VfQUREUkVTU18wLCAmcGNpX21lbV9iYXNlKTsKKyAgICBwY2lfbWVtX2Jhc2UgPSBwY2lfbWVtX3RvX3BoeXMgKGRldmJ1c2ZuLCBwY2lfbWVtX2Jhc2UpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdmlkZW8gY29udHJvbGxlciAqLworICAgIGlmICgocGVudiA9IGdldGVudiAoInZpZGVvbW9kZSIpKSAhPSBOVUxMKQorICAgICAgICB2aWRlb21vZGUgPSAoaW50KXNpbXBsZV9zdHJ0b3VsIChwZW52LCBOVUxMLCAxNik7CisgICAgZWxzZQorICAgICAgICB2aWRlb21vZGUgPSAweDMwMzsgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgODAweDYwMCA4IGJpdCBpbmRleCBjb2xvciAqLworCisgICAgLyogQ29tcGFyZSB3aXRoIGNvbW1vbiB2Z2EgbW9kZSBudW1iZXJzICovCisgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh2Z2FNb2Rlc1tpXVswXSA9PSB2aWRlb21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2Z2FNb2Rlc1tpXVsxXSA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlZpZGVvbW9kZSBub3Qgc3VwcG9ydGVkICFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7ICAgICAgICAgICAgICAgIC8qIG1vZGUgbm90IHN1cHBvcnRlZCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEdELT5tb2RlID0gdmdhTW9kZXNbaV1bMV07ICAgICAgICAvKiB1c2UgZHJpdmVyIGludC4gbW9kZSBudW1iZXIgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRXh0cmFjdCBncmFwaGljIGRhdGEgZm9ybWF0ICovCisgICAgcEdELT5nZGZJbmRleCA9IChwR0QtPm1vZGUgJiAweDAwMDcwMDAwKSA+PiAxNjsKKyAgICBpZiAocEdELT5nZGZJbmRleCA+IDUpCisgICAgICAgIHBHRC0+Z2RmSW5kZXggPSAwOworICAgIHBHRC0+Z2RmQnl0ZXNQUCA9IGdkZlRhYltwR0QtPmdkZkluZGV4XTsKKworICAgIC8qIEV4dHJhY3QgZ3JhcGhpYyByZXNvbHV0aW9uICovCisgICAgcEdELT5tb2RlICY9IDB4ZjsKKworICAgIC8qIEV4aXQgZm9yIG5vdCBzdXBwb3J0ZWQgcmVzb2x1dGlvbnMgKi8KKyAgICBpZiAoKChwR0QtPm1vZGU9PURVQUxfODAwXzYwMCkgfHwgKHBHRC0+bW9kZT09RFVBTF8xMDI0Xzc2OCkpICYmIChwR0QtPmdkZkJ5dGVzUFAgPiAxKSkKKyAgICB7CisgICAgICAgIHByaW50ZiAoIkR1YWwgc2NyZWVuIGZvciAxQlBQIG9ubHkgIVxuIik7CisgICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgfQorCisgICAgaWYgKChwR0QtPm1vZGU9PVNJTkdMRV8xMjgwXzEwMjQpICYmIChwR0QtPmdkZkJ5dGVzUFA9PTQpKQorICAgIHsKKyAgICAgICAgcHJpbnRmICgiT3V0IG9mIG1lbW9yeSAhXG4iKTsKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICB9CisKKyAgICAvKiBTZXQgZ3JhcGhpYyBwYXJhbWV0ZXJzICovCisgICAgc3dpdGNoIChwR0QtPm1vZGUpCisgICAgeworICAgIGNhc2UgRFVBTF84MDBfNjAwOgorICAgICAgICAgICAgcEdELT53aW5TaXplWCA9IDgwMDsKKyAgICAgICAgICAgIHBHRC0+d2luU2l6ZVkgPSA2MDA7CisgICAgICAgICAgICBwR0QtPnBsblNpemVYID0gMTYwMDsKKyAgICAgICAgICAgIHBHRC0+cGxuU2l6ZVkgPSA2MDA7CisgICAgICAgICAgICBzcHJpbnRmIChwR0QtPm1vZGVJZGVudCwgIkR1YWwgU2NyZWVuIDgwMHg2MDAgd2l0aCAlcyIsIGdkZk1vZGVzW3BHRC0+Z2RmSW5kZXhdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFVBTF8xMDI0Xzc2ODoKKyAgICAgICAgICAgIHBHRC0+d2luU2l6ZVggPSAxMDI0OworICAgICAgICAgICAgcEdELT53aW5TaXplWSA9IDc2ODsKKyAgICAgICAgICAgIHBHRC0+cGxuU2l6ZVggPSAyMDQ4OworICAgICAgICAgICAgcEdELT5wbG5TaXplWSA9IDc2ODsKKyAgICAgICAgICAgIHNwcmludGYgKHBHRC0+bW9kZUlkZW50LCAiRHVhbCBTY3JlZW4gMTAyNHg3Njggd2l0aCAlcyIsIGdkZk1vZGVzW3BHRC0+Z2RmSW5kZXhdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0lOR0xFXzgwMF82MDA6CisgICAgICAgICAgICBwR0QtPndpblNpemVYID0gODAwOworICAgICAgICAgICAgcEdELT53aW5TaXplWSA9IDYwMDsKKyAgICAgICAgICAgIHBHRC0+cGxuU2l6ZVggPSA4MDA7CisgICAgICAgICAgICBwR0QtPnBsblNpemVZID0gNjAwOworICAgICAgICAgICAgc3ByaW50ZiAocEdELT5tb2RlSWRlbnQsICJTaW5nbGUgU2NyZWVuIDgwMHg2MDAgd2l0aCAlcyIsIGdkZk1vZGVzW3BHRC0+Z2RmSW5kZXhdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0lOR0xFXzEwMjRfNzY4OgorICAgICAgICAgICAgcEdELT53aW5TaXplWCA9IDEwMjQ7CisgICAgICAgICAgICBwR0QtPndpblNpemVZID0gNzY4OworICAgICAgICAgICAgcEdELT5wbG5TaXplWCA9IDEwMjQ7CisgICAgICAgICAgICBwR0QtPnBsblNpemVZID0gNzY4OworICAgICAgICAgICAgc3ByaW50ZiAocEdELT5tb2RlSWRlbnQsIlNpbmdsZSBTY3JlZW4gMTAyNHg3Njggd2l0aCAlcyIsIGdkZk1vZGVzW3BHRC0+Z2RmSW5kZXhdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFZfTU9ERV9DQ0lSOgorICAgICAgICAgICAgcEdELT53aW5TaXplWCA9IDcyMDsKKyAgICAgICAgICAgIHBHRC0+d2luU2l6ZVkgPSA1NzY7CisgICAgICAgICAgICBwR0QtPnBsblNpemVYID0gNzIwOworICAgICAgICAgICAgcEdELT5wbG5TaXplWSA9IDU3NjsKKyAgICAgICAgICAgIHNwcmludGYgKHBHRC0+bW9kZUlkZW50LCAiVFYgTW9kZSBDQ0lSIHdpdGggJXMiLCBnZGZNb2Rlc1twR0QtPmdkZkluZGV4XSk7CisgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIFRWX01PREVfRUlBOgorICAgICAgICAgICAgcEdELT53aW5TaXplWCA9IDcyMDsKKyAgICAgICAgICAgIHBHRC0+d2luU2l6ZVkgPSA0ODQ7CisgICAgICAgICAgICBwR0QtPnBsblNpemVYID0gNzIwOworICAgICAgICAgICAgcEdELT5wbG5TaXplWSA9IDQ4NDsKKyAgICAgICAgICAgIHNwcmludGYgKHBHRC0+bW9kZUlkZW50LCAiVFYgTW9kZSBFSUEgd2l0aCAlcyIsIGdkZk1vZGVzW3BHRC0+Z2RmSW5kZXhdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0lOR0xFXzEyODBfMTAyNDoKKyAgICAgICAgICAgIHBHRC0+d2luU2l6ZVggPSAxMjgwOworICAgICAgICAgICAgcEdELT53aW5TaXplWSA9IDEwMjQ7CisgICAgICAgICAgICBwR0QtPnBsblNpemVYID0gMTI4MDsKKyAgICAgICAgICAgIHBHRC0+cGxuU2l6ZVkgPSAxMDI0OworICAgICAgICAgICAgc3ByaW50ZiAocEdELT5tb2RlSWRlbnQsICJTaW5nbGUgU2NyZWVuIDEyODB4MTAyNCB3aXRoICVzIiwgZ2RmTW9kZXNbcEdELT5nZGZJbmRleF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZigiVmlkZW9tb2RlIG5vdCBzdXBwb3J0ZWQgIVxuIik7CisgICAgICAgICAgICByZXR1cm4gKE5VTEwpOworICAgIH0KKworCisgICAgcEdELT5pc2FCYXNlID0gQ0ZHX0lTQV9JTzsKKyAgICBwR0QtPnBjaUJhc2UgPSBwY2lfbWVtX2Jhc2U7CisgICAgcEdELT5kcHJCYXNlID0gKHBjaV9tZW1fYmFzZSArIDB4NDAwMDAwICsgMHg4MDAwKTsKKyAgICBwR0QtPnZwckJhc2UgPSAocGNpX21lbV9iYXNlICsgMHg0MDAwMDAgKyAweGMwMDApOworICAgIHBHRC0+Y3ByQmFzZSA9IChwY2lfbWVtX2Jhc2UgKyAweDQwMDAwMCArIDB4ZTAwMCk7CisgICAgcEdELT5mcmFtZUFkcnMgPSBwY2lfbWVtX2Jhc2U7CisgICAgcEdELT5tZW1TaXplID0gVklERU9fTUVNX1NJWkU7CisKKyAgICAvKiBUdXJuIG9mZiBkaXNwbGF5ICovCisgICAgc21pV3JpdGUgKDB4M2M0LCAweDAxLCAweDIwKTsKKworICAgIC8qIFVubG9jayBleHQuIGNydCByZWdzICovCisgICAgb3V0OCAoU01JX0xPQ0tfUkVHLCAweDQwKTsKKworICAgIC8qIFNldCBSZWdpc3RlciBiYXNlIHRvIGlzYSAzZHggZm9yIDM/eCByZWdzIChjb2xvciBtb2RlKSAqLworICAgIG91dDggKFNNSV9NSVNDX1JFRywgMHgyYik7CisKKyAgICAvKiBVbmxvY2sgY3J0IHJlZ3MgMC03ICovCisgICAgc21pV3JpdGUgKDB4M2Q0LCAweDExLCAweDBlKTsKKworICAgIC8qIFN5dGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgICBzbWlMb2FkUmVncyAoU01JX0lORFhfQzQsIFNNSV9EQVRBX0M1LAorICAgICAgICAgU01JX1NDUiwgc2l6ZW9mKFNNSV9TQ1IpKTsKKworICAgIC8qIGV4dGVudGVkIENSVCBSZWdpc3RlciAqLworICAgIHNtaUxvYWRSZWdzIChTTUlfSU5EWF9ENCwgU01JX0RBVEFfRDUsCisgICAgICAgICBTTUlfRVhUX0NSVFtwR0QtPm1vZGVdLCBzaXplb2YoU01JX0VYVF9DUlQpL1ZJREVPX01PREVTKTsKKworICAgIC8qIFNlcXVlbmNlciBSZWdpc3RlciAqLworICAgIHNtaUxvYWRSZWdzIChTTUlfSU5EWF9DNCwgU01JX0RBVEFfQzUsCisgICAgICAgICBTTUlfU0VRUiwgc2l6ZW9mKFNNSV9TRVFSKSk7CisKKyAgICAvKiBQb3dlciBDb250cm9sIFJlZ2lzdGVyICovCisgICAgc21pTG9hZFJlZ3MgKFNNSV9JTkRYX0M0LCBTTUlfREFUQV9DNSwKKyAgICAgICAgIFNNSV9QQ1JbcEdELT5tb2RlXSwgc2l6ZW9mKFNNSV9QQ1IpL1ZJREVPX01PREVTKTsKKworICAgIC8qIE1lbW9yeSBDb250cm9sIFJlZ2lzdGVyICovCisgICAgc21pTG9hZFJlZ3MgKFNNSV9JTkRYX0M0LCBTTUlfREFUQV9DNSwKKyAgICAgICAgIFNNSV9NQ1JbcEdELT5tb2RlXSwgc2l6ZW9mKFNNSV9NQ1IpL1ZJREVPX01PREVTKTsKKworICAgIC8qIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgICBzbWlMb2FkUmVncyAoU01JX0lORFhfQzQsIFNNSV9EQVRBX0M1LAorICAgICAgICAgU01JX0NDUltwR0QtPm1vZGVdLCBzaXplb2YoU01JX0NDUikvVklERU9fTU9ERVMpOworCisgICAgLyogU2hhZG93IFZHQSBSZWdpc3RlciAqLworICAgIHNtaUxvYWRSZWdzIChTTUlfSU5EWF9ENCwgU01JX0RBVEFfRDUsCisgICAgICAgICBTTUlfU0hWR0FbcEdELT5tb2RlXSwgc2l6ZW9mKFNNSV9TSFZHQSkvVklERU9fTU9ERVMpOworCisgICAgLyogR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVyICovCisgICAgc21pTG9hZFJlZ3MgKFNNSV9JTkRYX0M0LCBTTUlfREFUQV9DNSwKKyAgICAgICAgIFNNSV9HUFJbcEdELT5tb2RlXSwgc2l6ZW9mKFNNSV9HUFIpL1ZJREVPX01PREVTKTsKKworICAgIC8qIEhhcmR3YXJlIEN1c29yIFJlZ2lzdGVyICovCisgICAgc21pTG9hZFJlZ3MgKFNNSV9JTkRYX0M0LCBTTUlfREFUQV9DNSwKKyAgICAgICAgIFNNSV9IQ1JbcEdELT5tb2RlXSwgc2l6ZW9mKFNNSV9IQ1IpL1ZJREVPX01PREVTKTsKKworICAgIC8qIEZsYXQgUGFuZWwgUmVnaXN0ZXIgKi8KKyAgICBzbWlMb2FkUmVncyAoU01JX0lORFhfQzQsIFNNSV9EQVRBX0M1LAorICAgICAgICAgU01JX0ZQUltwR0QtPm1vZGVdLCBzaXplb2YoU01JX0ZQUikvVklERU9fTU9ERVMpOworCisgICAgLyogQ1JUQyBSZWdpc3RlciAqLworICAgIHNtaUxvYWRSZWdzIChTTUlfSU5EWF9ENCwgU01JX0RBVEFfRDUsCisgICAgICAgICBTTUlfQ1JUQ1JbcEdELT5tb2RlXSwgc2l6ZW9mKFNNSV9DUlRDUikvVklERU9fTU9ERVMpOworCisgICAgLyogR3JhcGhpY3MgQ29udHJvbGxlciBSZWdpc3RlciAqLworICAgIHNtaUxvYWRSZWdzIChTTUlfSU5EWF9DRSwgU01JX0RBVEFfQ0YsCisgICAgICAgICBTTUlfR0NSLCBzaXplb2YoU01JX0dDUikpOworCisgICAgLyogUGF0Y2ggbWVtb3J5IGFuZCByZWZyZXNoIHNldHRpbmdzIGZvciBTTUk3MTAgKi8KKyAgICBpZiAoZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfU01JXzcxMCkKKyAgICB7CisgICAgdW5zaWduZWQgY2hhciByZWcgPSBzbWlSZWFkICgweDNjNCwgMHg2Mik7CisKKyAgICAvKiBleHRlcm5hbCBtZW1vcnkgZGlzYWJsZWQgKi8KKyAgICBzbWlXcml0ZSAoMHgzYzQsIDB4NjIsIChyZWcgJiAweGZiKSk7CisgICAgLyogbWVtb3J5IGNsb2NrICovCisgICAgc21pV3JpdGUgKDB4M2M0LCAweDZhLCAweDc1KTsKKyAgICB9CisKKyAgICAvKiBQYXRjaCBtZW1vcnkgYW5kIHJlZnJlc2ggc2V0dGluZ3MgZm9yIFNNSTcxMiAqLworICAgIGlmIChkZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9TTUlfNzEyKQorICAgIHsKKyAgICB1bnNpZ25lZCBjaGFyIHJlZyA9IHNtaVJlYWQgKDB4M2M0LCAweDYyKTsKKworICAgIC8qIElMIHJ1bnMgYXQgTUNMSzsgNjRiaXQgYnVzOyBleHRlcm5hbCBtZW1vcnkgZGlzYWJsZWQgKi8KKyAgICBzbWlXcml0ZSAoMHgzYzQsIDB4NjIsIChyZWcgfCAweGM0KSk7CisgICAgLyogbWVtb3J5IGNsb2NrICovCisgICAgc21pV3JpdGUgKDB4M2M0LCAweDZhLCAweDgwKTsKKyAgICB9CisKKyAgICAvKiBQYXRjaCBjbG9jayBzZXR0aW5ncyBmb3IgU01JODEwICovCisgICAgaWYgKGRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1NNSV84MTApCisgICAgeworICAgIC8qIGNsb2NrIGNvbnRyb2wgKi8KKyAgICBzbWlXcml0ZSAoMHgzYzQsIDB4NjksIDB4MDMpOworICAgIH0KKworICAgIC8qIFZpZGVvIHByb2Nlc3NvciBkZWZhdWx0IHNldHVwICovCisgICAgc21pSW5pdFZpZGVvUHJvY2Vzc29yICgpOworCisgICAgLyogQ2FwdHVyZSBwb3J0IGRlZmF1bHQgc2V0dXAgKi8KKyAgICBzbWlJbml0Q2FwdHVyZVBvcnQgKCk7CisKKyAgICAvKiBEcmF3aW5nIGVuZ2luZSBkZWZhdWx0IHNldHVwICovCisgICAgc21pSW5pdERyYXdpbmdFbmdpbmUgKCk7CisKKyAgICAvKiBUdXJuIG9uIGRpc3BsYXkgKi8KKyAgICBzbWlXcml0ZSAoMHgzYzQsIDB4MDEsIDB4MDEpOworCisgICAgLyogQ2xlYXIgdmlkZW8gbWVtb3J5ICovCisgICAgaSA9IHBHRC0+bWVtU2l6ZS80OworICAgIHZtID0gKHVuc2lnbmVkIGludCAqKXBHRC0+cGNpQmFzZTsKKyAgICB3aGlsZShpLS0pCisgICAgKnZtKysgPSAwOworCisgICAgcHJpbnRmKCJtb2RlPSV4IC0gJXNcbiIsIHZpZGVvbW9kZSwgcEdELT5tb2RlSWRlbnQpOworICAgIHJldHVybiAoKHZvaWQqKSZzbWkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBEcmF3aW5nIGVuZ2luZSBmaWxsIG9uIHNjcmVlbiByZWdpb24KKyovCit2b2lkIHZpZGVvX2h3X3JlY3RmaWxsICgKKyAgICB1bnNpZ25lZCBpbnQgYnBwLCAgICAgICAgICAgICAvKiBieXRlcyBwZXIgcGl4ZWwgKi8KKyAgICB1bnNpZ25lZCBpbnQgZHN0X3gsICAgICAgICAgICAvKiBkZXN0IHBvcyB4ICovCisgICAgdW5zaWduZWQgaW50IGRzdF95LCAgICAgICAgICAgLyogZGVzdCBwb3MgeSAqLworICAgIHVuc2lnbmVkIGludCBkaW1feCwgICAgICAgICAgIC8qIGZyYW1lIHdpZHRoICovCisgICAgdW5zaWduZWQgaW50IGRpbV95LCAgICAgICAgICAgLyogZnJhbWUgaGVpZ2h0ICovCisgICAgdW5zaWduZWQgaW50IGNvbG9yICAgICAgICAgICAgLyogZmlsbCBjb2xvciAqLworICAgICApCit7CisgICAgcmVnaXN0ZXIgR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikmc21pOworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjb250cm9sOworCisgICAgZGltX3ggKj0gYnBwOworCisgICAgb3V0MzJyICgocEdELT5kcHJCYXNlICsgMHgwMDE0KSwgY29sb3IpOworICAgIG91dDMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAwNCksICgoZHN0X3g8PDE2KSB8IGRzdF95KSk7CisgICAgb3V0MzJyICgocEdELT5kcHJCYXNlICsgMHgwMDA4KSwgKChkaW1feDw8MTYpIHwgZGltX3kpKTsKKworICAgIGNvbnRyb2wgPSAweDAwMDBmZmZmICYgIGluMzJyICgocEdELT5kcHJCYXNlICsgMHgwMDBjKSk7CisKKyAgICBjb250cm9sIHw9IDB4ODAwMTAwMDA7CisKKyAgICBvdXQzMnIgKChwR0QtPmRwckJhc2UgKyAweDAwMGMpLCAgY29udHJvbCk7CisKKyAgICAvKiBXYWl0IGZvciBkcmF3aW5nIHByb2Nlc3NvciAqLworICAgIGRvCisgICAgeworICAgIG91dDggKChwR0QtPmlzYUJhc2UgKyAweDNjNCksIDB4MTYpOworICAgIH0gd2hpbGUgKGluOCAocEdELT5pc2FCYXNlICsgMHgzYzUpICYgMHgwOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIERyYXdpbmcgZW5naW5lIGJpdGJsdCB3aXRoIHNjcmVlbiByZWdpb24KKyovCit2b2lkIHZpZGVvX2h3X2JpdGJsdCAoCisgICAgdW5zaWduZWQgaW50IGJwcCwgICAgICAgICAgICAgLyogYnl0ZXMgcGVyIHBpeGVsICovCisgICAgdW5zaWduZWQgaW50IHNyY194LCAgICAgICAgICAgLyogc291cmNlIHBvcyB4ICovCisgICAgdW5zaWduZWQgaW50IHNyY195LCAgICAgICAgICAgLyogc291cmNlIHBvcyB5ICovCisgICAgdW5zaWduZWQgaW50IGRzdF94LCAgICAgICAgICAgLyogZGVzdCBwb3MgeCAqLworICAgIHVuc2lnbmVkIGludCBkc3RfeSwgICAgICAgICAgIC8qIGRlc3QgcG9zIHkgKi8KKyAgICB1bnNpZ25lZCBpbnQgZGltX3gsICAgICAgICAgICAvKiBmcmFtZSB3aWR0aCAqLworICAgIHVuc2lnbmVkIGludCBkaW1feSAgICAgICAgICAgIC8qIGZyYW1lIGhlaWdodCAqLworICAgICkKK3sKKyAgICByZWdpc3RlciBHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSZzbWk7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGNvbnRyb2w7CisKKyAgICBkaW1feCAqPSBicHA7CisKKyAgICBpZiAoKHNyY195PGRzdF95KSB8fCAoKHNyY195PT1kc3RfeSkgJiYgKHNyY194PGRzdF94KSkpCisgICAgeworICAgIG91dDMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAwMCksICgoKHNyY194K2RpbV94LTEpPDwxNikgfCAoc3JjX3krZGltX3ktMSkpKTsKKyAgICBvdXQzMnIgKChwR0QtPmRwckJhc2UgKyAweDAwMDQpLCAoKChkc3RfeCtkaW1feC0xKTw8MTYpIHwgKGRzdF95K2RpbV95LTEpKSk7CisgICAgY29udHJvbCA9IDB4ODgwMDAwMDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgb3V0MzJyICgocEdELT5kcHJCYXNlICsgMHgwMDAwKSwgKChzcmNfeDw8MTYpIHwgc3JjX3kpKTsKKyAgICBvdXQzMnIgKChwR0QtPmRwckJhc2UgKyAweDAwMDQpLCAoKGRzdF94PDwxNikgfCBkc3RfeSkpOworICAgIGNvbnRyb2wgPSAweDgwMDAwMDAwOworICAgIH0KKworICAgIG91dDMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAwOCksICgoZGltX3g8PDE2KSB8IGRpbV95KSk7CisgICAgY29udHJvbCB8PSAoMHgwMDAwZmZmZiAmICBpbjMyciAoKHBHRC0+ZHByQmFzZSArIDB4MDAwYykpKTsKKyAgICBvdXQzMnIgKChwR0QtPmRwckJhc2UgKyAweDAwMGMpLCBjb250cm9sKTsKKworICAgIC8qIFdhaXQgZm9yIGRyYXdpbmcgcHJvY2Vzc29yICovCisgICAgZG8KKyAgICB7CisgICAgb3V0OCAoKHBHRC0+aXNhQmFzZSArIDB4M2M0KSwgMHgxNik7CisgICAgfSB3aGlsZSAoaW44IChwR0QtPmlzYUJhc2UgKyAweDNjNSkgJiAweDA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogU2V0IGEgUkdCIGNvbG9yIGluIHRoZSBMVVQgKDggYml0IGluZGV4KQorKi8KK3ZvaWQgdmlkZW9fc2V0X2x1dCAoCisgICAgdW5zaWduZWQgaW50IGluZGV4LCAgICAgICAgICAgLyogY29sb3IgbnVtYmVyICovCisgICAgdW5zaWduZWQgY2hhciByLCAgICAgICAgICAgICAgLyogcmVkICovCisgICAgdW5zaWduZWQgY2hhciBnLCAgICAgICAgICAgICAgLyogZ3JlZW4gKi8KKyAgICB1bnNpZ25lZCBjaGFyIGIgICAgICAgICAgICAgICAvKiBibHVlICovCisgICAgKQoreworICAgIHJlZ2lzdGVyIEdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopJnNtaTsKKworICAgIG91dDggKFNNSV9MVVRfTUFTSywgIDB4ZmYpOworCisgICAgb3V0OCAoU01JX0xVVF9TVEFSVCwgKGNoYXIpaW5kZXgpOworCisgICAgb3V0OCAoU01JX0xVVF9SR0IsIHI+PjIpOyAgICAvKiByZWQgKi8KKyAgICB1ZGVsYXkgKDEwKTsKKyAgICBvdXQ4IChTTUlfTFVUX1JHQiwgZz4+Mik7ICAgIC8qIGdyZWVuICovCisgICAgdWRlbGF5ICgxMCk7CisgICAgb3V0OCAoU01JX0xVVF9SR0IsIGI+PjIpOyAgICAvKiBibHVlICovCisgICAgdWRlbGF5ICgxMCk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfVklERU9fU01JX0xZTlhFTSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aWdvbjMuYyBiL2RyaXZlcnMvdGlnb24zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4Mzc0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdGlnb24zLmMKQEAgLTAsMCArMSw2MjIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJyb2FkY29tIEJDTTU3MDAgTGludXggTmV0d29yayBEcml2ZXIsIENvcHlyaWdodCAoYykgMjAwMCBCcm9hZGNvbSAgICAgICAgICovCisvKiBDb3Jwb3JhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICAqLworLyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgICAgKi8KKy8qIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGxvY2F0ZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSAiYmNtNTcweF9tbS5oIgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgIWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAorCWRlZmluZWQoQ09ORklHX1RJR09OMykKKyNpZmRlZiBDT05GSUdfQk1XCisjaW5jbHVkZSA8bXBjODI0eC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KKworI2RlZmluZSBFTUJFRERFRCAxCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTG9jYWwgZnVuY3Rpb25zLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTE1fU1RBVFVTIExNX0Fib3J0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fUXVldWVSeFBhY2tldHMoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKKworc3RhdGljIExNX1NUQVRVUyBMTV9UcmFuc2xhdGVSZXF1ZXN0ZWRNZWRpYVR5cGUoCisgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlLAorICAgIFBMTV9NRURJQV9UWVBFIHBNZWRpYVR5cGUsIFBMTV9MSU5FX1NQRUVEIHBMaW5lU3BlZWQsCisgICAgUExNX0RVUExFWF9NT0RFIHBEdXBsZXhNb2RlKTsKKworc3RhdGljIExNX1NUQVRVUyBMTV9Jbml0QmNtNTQweFBoeShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworCitfX2lubGluZSBzdGF0aWMgTE1fVk9JRCBMTV9TZXJ2aWNlUnhJbnRlcnJ1cHQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK19faW5saW5lIHN0YXRpYyBMTV9WT0lEIExNX1NlcnZpY2VUeEludGVycnVwdChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworCitzdGF0aWMgTE1fU1RBVFVTIExNX0ZvcmNlQXV0b05lZ0JjbTU0MHhQaHkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFJlcXVlc3RlZE1lZGlhVHlwZSk7CitzdGF0aWMgTE1fU1RBVFVTIExNX0ZvcmNlQXV0b05lZyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlKTsKK3N0YXRpYyBMTV9VSU5UMzIgR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworU1RBVElDIExNX1NUQVRVUyBMTV9TZXRGbG93Q29udHJvbChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisgICAgTE1fVUlOVDMyIExvY2FsUGh5QWQsIExNX1VJTlQzMiBSZW1vdGVQaHlBZCk7CisjaWYgSU5DTFVERV9UQklfU1VQUE9SVAorU1RBVElDIExNX1NUQVRVUyBMTV9TZXR1cEZpYmVyUGh5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitTVEFUSUMgTE1fU1RBVFVTIExNX0luaXRCY204MDB4UGh5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CisjZW5kaWYKK1NUQVRJQyBMTV9TVEFUVVMgTE1fU2V0dXBDb3BwZXJQaHkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK1NUQVRJQyBQTE1fQURBUFRFUl9JTkZPIExNX0dldEFkYXB0ZXJJbmZvQnlTc2lkKExNX1VJTlQxNiBTdmlkLCBMTV9VSU5UMTYgU3NpZCk7CitTVEFUSUMgTE1fU1RBVFVTIExNX0RtYVRlc3QoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcEJ1ZmZlclZpcnQsCisgICAgICAgICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgQnVmZmVyUGh5LCBMTV9VSU5UMzIgQnVmZmVyU2l6ZSk7CitTVEFUSUMgTE1fU1RBVFVTIExNX0hhbHRDcHUoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLExNX1VJTlQzMiBjcHVfbnVtYmVyKTsKK1NUQVRJQyBMTV9TVEFUVVMgTE1fUmVzZXRDaGlwKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitTVEFUSUMgTE1fU1RBVFVTIExNX1Rlc3Q0R0JvdW5kYXJ5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0LAorICAgIFBUM19TTkRfQkQgcFNlbmRCZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFeHRlcm5hbCBmdW5jdGlvbnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMTV9TVEFUVVMgTE1fTG9hZFJsc0Zpcm13YXJlKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9VSU5UMzIKK0xNX1JlZ1JkSW5kKAorUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorTE1fVUlOVDMyIFJlZ2lzdGVyKSB7CisgICAgTE1fVUlOVDMyIFZhbHVlMzI7CisKKyNpZiBQQ0lYX1RBUkdFVF9XT1JLQVJPVU5ECisgICAgTU1fQUNRVUlSRV9VTkRJX0xPQ0socERldmljZSk7CisjZW5kaWYKKyAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9SRUdfQUREUl9SRUcsIFJlZ2lzdGVyKTsKKyAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX1JFR19EQVRBX1JFRywgJlZhbHVlMzIpOworI2lmIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQKKyAgICBNTV9SRUxFQVNFX1VORElfTE9DSyhwRGV2aWNlKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIFZhbHVlMzI7Cit9IC8qIExNX1JlZ1JkSW5kICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xNX1ZPSUQKK0xNX1JlZ1dySW5kKAorUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorTE1fVUlOVDMyIFJlZ2lzdGVyLAorTE1fVUlOVDMyIFZhbHVlMzIpIHsKKworI2lmIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQKKyAgICBNTV9BQ1FVSVJFX1VORElfTE9DSyhwRGV2aWNlKTsKKyNlbmRpZgorICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX1JFR19BRERSX1JFRywgUmVnaXN0ZXIpOworICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX1JFR19EQVRBX1JFRywgVmFsdWUzMik7CisjaWYgUENJWF9UQVJHRVRfV09SS0FST1VORAorICAgIE1NX1JFTEVBU0VfVU5ESV9MT0NLKHBEZXZpY2UpOworI2VuZGlmCit9IC8qIExNX1JlZ1dySW5kICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xNX1VJTlQzMgorTE1fTWVtUmRJbmQoCitQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCitMTV9VSU5UMzIgTWVtQWRkcikgeworICAgIExNX1VJTlQzMiBWYWx1ZTMyOworCisgICAgTU1fQUNRVUlSRV9VTkRJX0xPQ0socERldmljZSk7CisjaWZkZWYgQklHX0VORElBTl9IT1NUCisgICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfTUVNX1dJTl9BRERSX1JFRywgTWVtQWRkcik7CisgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBQY2lDZmcuTWVtV2luZG93RGF0YSk7CisgICAgLyogICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLHVJbnRNZW0uTWJ1ZlsoTWVtQWRkciAmIDB4N2ZmZikvNF0pOyAqLworI2Vsc2UKKyAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0FERFJfUkVHLCBNZW1BZGRyKTsKKyAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX01FTV9XSU5fREFUQV9SRUcsICZWYWx1ZTMyKTsKKyNlbmRpZgorICAgIE1NX1JFTEVBU0VfVU5ESV9MT0NLKHBEZXZpY2UpOworCisgICAgcmV0dXJuIFZhbHVlMzI7Cit9IC8qIExNX01lbVJkSW5kICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xNX1ZPSUQKK0xNX01lbVdySW5kKAorUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorTE1fVUlOVDMyIE1lbUFkZHIsCitMTV9VSU5UMzIgVmFsdWUzMikgeworICAgIE1NX0FDUVVJUkVfVU5ESV9MT0NLKHBEZXZpY2UpOworI2lmZGVmIEJJR19FTkRJQU5fSE9TVAorICAgIFJFR19XUihwRGV2aWNlLFBjaUNmZy5NZW1XaW5kb3dCYXNlQWRkcixNZW1BZGRyKTsKKyAgICBSRUdfV1IocERldmljZSx1SW50TWVtLk1idWZbKE1lbUFkZHIgJiAweDdmZmYpLzRdLFZhbHVlMzIpOworI2Vsc2UKKyAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0FERFJfUkVHLCBNZW1BZGRyKTsKKyAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0RBVEFfUkVHLCBWYWx1ZTMyKTsKKyNlbmRpZgorICAgIE1NX1JFTEVBU0VfVU5ESV9MT0NLKHBEZXZpY2UpOworfSAvKiBMTV9NZW1XckluZCAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9TVEFUVVMKK0xNX1F1ZXVlUnhQYWNrZXRzKAorUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKSB7CisgICAgTE1fU1RBVFVTIExtc3RhdHVzOworICAgIFBMTV9QQUNLRVQgcFBhY2tldDsKKyAgICBQVDNfUkNWX0JEIHBSY3ZCZDsKKyAgICBMTV9VSU5UMzIgU3RkQmRBZGRlZCA9IDA7CisjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAorICAgIExNX1VJTlQzMiBKdW1ib0JkQWRkZWQgPSAwOworI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKworICAgIExtc3RhdHVzID0gTE1fU1RBVFVTX1NVQ0NFU1M7CisKKyAgICBwUGFja2V0ID0gKFBMTV9QQUNLRVQpIFFRX1BvcEhlYWQoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKKyAgICB3aGlsZShwUGFja2V0KSB7CisgICAgICAgIHN3aXRjaChwUGFja2V0LT51LlJ4LlJjdlByb2RSaW5nKSB7CisjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAorICAgICAgICAgICAgY2FzZSBUM19KVU1CT19SQ1ZfUFJPRF9SSU5HOiAgICAgICAgLyogSnVtYm8gUmVjZWl2ZSBSaW5nLiAqLworICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yLiAqLworICAgICAgICAgICAgICAgIHBSY3ZCZCA9CisgICAgICAgICAgICAgICAgICAgICZwRGV2aWNlLT5wUnhKdW1ib0JkVmlydFtwRGV2aWNlLT5SeEp1bWJvUHJvZElkeF07CisgICAgICAgICAgICAgICAgcFJjdkJkLT5GbGFncyA9IFJDVl9CRF9GTEFHX0VORCB8IFJDVl9CRF9GTEFHX0pVTUJPX1JJTkc7CisgICAgICAgICAgICAgICAgcFJjdkJkLT5MZW4gPSAoTE1fVUlOVDE2KSBwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZTsKKworICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHJlY2VpdmUgYnVmZmVyIHBvaW50ZXIgKi8KKyNpZiAwIC8qIEppbW15LCBkZWxldGVkIGluIG5ldyAqLworICAgICAgICAgICAgICAgIHBSY3ZCZC0+SG9zdEFkZHIuTG93ID0gcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclBoeS5Mb3c7CisgICAgICAgICAgICAgICAgcFJjdkJkLT5Ib3N0QWRkci5IaWdoID0gcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclBoeS5IaWdoOworI2VuZGlmCisgICAgICAgICAgICAgICAgTU1fTWFwUnhEbWEocERldmljZSwgcFBhY2tldCwgJnBSY3ZCZC0+SG9zdEFkZHIpOworCisgICAgICAgICAgICAgICAgLyogVGhlIG9wYXF1ZSBmaWVsZCBtYXkgcG9pbnQgdG8gYW4gb2Zmc2V0IGZyb20gYSBmaXggYWRkci4gKi8KKyAgICAgICAgICAgICAgICBwUmN2QmQtPk9wYXF1ZSA9IChMTV9VSU5UMzIpIChNTV9VSU5UX1BUUihwUGFja2V0KSAtCisgICAgICAgICAgICAgICAgICAgIE1NX1VJTlRfUFRSKHBEZXZpY2UtPnBQYWNrZXREZXNjQmFzZSkpOworCisgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBwcm9kdWNlciBpbmRleC4gKi8KKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCA9IChwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCArIDEpICYKKyAgICAgICAgICAgICAgICAgICAgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVF9NQVNLOworCisgICAgICAgICAgICAgICAgSnVtYm9CZEFkZGVkKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCisgICAgICAgICAgICBjYXNlIFQzX1NURF9SQ1ZfUFJPRF9SSU5HOiAgICAgIC8qIFN0YW5kYXJkIFJlY2VpdmUgUmluZy4gKi8KKyAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBidWZmZXIgZGVzY3JpcHRvci4gKi8KKyAgICAgICAgICAgICAgICBwUmN2QmQgPSAmcERldmljZS0+cFJ4U3RkQmRWaXJ0W3BEZXZpY2UtPlJ4U3RkUHJvZElkeF07CisgICAgICAgICAgICAgICAgcFJjdkJkLT5GbGFncyA9IFJDVl9CRF9GTEFHX0VORDsKKyAgICAgICAgICAgICAgICBwUmN2QmQtPkxlbiA9IE1BWF9TVERfUkNWX0JVRkZFUl9TSVpFOworCisgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBidWZmZXIgcG9pbnRlciAqLworI2lmIDAgIC8qIEppbW15LCBkZWxldGVkIGluIG5ldyByZXBsYWNlZCB3aXRoIE1NX01hcFJ4RG1hICovCisgICAgICAgICAgICAgICAgcFJjdkJkLT5Ib3N0QWRkci5Mb3cgPSBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyUGh5LkxvdzsKKyAgICAgICAgICAgICAgICBwUmN2QmQtPkhvc3RBZGRyLkhpZ2ggPSBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyUGh5LkhpZ2g7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBNTV9NYXBSeERtYShwRGV2aWNlLCBwUGFja2V0LCAmcFJjdkJkLT5Ib3N0QWRkcik7CisKKyAgICAgICAgICAgICAgICAvKiBUaGUgb3BhcXVlIGZpZWxkIG1heSBwb2ludCB0byBhbiBvZmZzZXQgZnJvbSBhIGZpeCBhZGRyLiAqLworICAgICAgICAgICAgICAgIHBSY3ZCZC0+T3BhcXVlID0gKExNX1VJTlQzMikgKE1NX1VJTlRfUFRSKHBQYWNrZXQpIC0KKyAgICAgICAgICAgICAgICAgICAgTU1fVUlOVF9QVFIocERldmljZS0+cFBhY2tldERlc2NCYXNlKSk7CisKKyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIHByb2R1Y2VyIGluZGV4LiAqLworICAgICAgICAgICAgICAgIHBEZXZpY2UtPlJ4U3RkUHJvZElkeCA9IChwRGV2aWNlLT5SeFN0ZFByb2RJZHggKyAxKSAmCisgICAgICAgICAgICAgICAgICAgIFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UX01BU0s7CisKKyAgICAgICAgICAgICAgICBTdGRCZEFkZGVkKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVDNfVU5LTk9XTl9SQ1ZfUFJPRF9SSU5HOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMbXN0YXR1cyA9IExNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IC8qIHN3aXRjaCAqLworCisgICAgICAgIC8qIEJhaWwgb3V0IGlmIHRoZXJlIGlzIGFueSBlcnJvci4gKi8KKyAgICAgICAgaWYoTG1zdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcFBhY2tldCA9IChQTE1fUEFDS0VUKSBRUV9Qb3BIZWFkKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lcik7CisgICAgfSAvKiB3aGlsZSAqLworCisgICAgd21iKCk7CisgICAgLyogVXBkYXRlIHRoZSBwcm9jZWR1cmUgaW5kZXguICovCisgICAgaWYoU3RkQmRBZGRlZCkKKyAgICB7CisgICAgICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlJjdlN0ZFByb2RJZHguTG93LCBwRGV2aWNlLT5SeFN0ZFByb2RJZHgpOworICAgIH0KKyNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCisgICAgaWYoSnVtYm9CZEFkZGVkKQorICAgIHsKKyAgICAgICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guUmN2SnVtYm9Qcm9kSWR4LkxvdywKKyAgICAgICAgICAgIHBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4KTsKKyAgICB9CisjZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCisgICAgcmV0dXJuIExtc3RhdHVzOworfSAvKiBMTV9RdWV1ZVJ4UGFja2V0cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU1RBVElDIExNX1ZPSUQKK0xNX052cmFtSW5pdCgKKyAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisgICAgTE1fVUlOVDMyIFZhbHVlMzI7CisgICAgTE1fVUlOVDMyIGo7CisKKyAgICAvKiBJbnRpYWxpemUgY2xvY2sgcGVyaW9kIGFuZCBzdGF0ZSBtYWNoaW5lLiAqLworICAgIFZhbHVlMzIgPSBTRUVQUk9NX0FERFJfQ0xLX1BFUkQoU0VFUFJPTV9DTE9DS19QRVJJT0QpIHwKKyAgICAgICAgU0VFUFJPTV9BRERSX0ZTTV9SRVNFVDsKKyAgICBSRUdfV1IocERldmljZSwgR3JjLkVlcHJvbUFkZHIsIFZhbHVlMzIpOworCisgICAgZm9yKGogPSAwOyBqIDwgMTAwOyBqKyspCisgICAgeworICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICB9CisKKyAgICAvKiBTZXJpYWwgZWVwcm9tIGFjY2VzcyB1c2luZyB0aGUgR3JjLkVlcHJvbUFkZHIvRWVwcm9tRGF0YSByZWdpc3RlcnMuICovCisgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBHcmMuTG9jYWxDdHJsKTsKKyAgICBSRUdfV1IocERldmljZSwgR3JjLkxvY2FsQ3RybCwgVmFsdWUzMiB8IEdSQ19NSVNDX0xPQ0FMX0NUUkxfQVVUT19TRUVQUk9NKTsKKworICAgIC8qIFNldCB0aGUgNTcwMSBjb21wYXRpYmlsaXR5IG1vZGUgaWYgd2UgYXJlIHVzaW5nIEVFUFJPTS4gKi8KKyAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDAgJiYKKyAgICAgICAgVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19BU0lDX1JFVl81NzAxKQorICAgIHsKKyAgICAgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBOdnJhbS5Db25maWcxKTsKKyAgICAgICAgaWYoKFZhbHVlMzIgJiBGTEFTSF9JTlRFUkZBQ0VfRU5BQkxFKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBVc2UgdGhlIG5ldyBpbnRlcmZhY2UgdG8gcmVhZCBFRVBST00uICovCisgICAgICAgICAgICBWYWx1ZTMyICY9IH5GTEFTSF9DT01QQVRfQllQQVNTOworCisgICAgICAgICAgICBSRUdfV1IocERldmljZSwgTnZyYW0uQ29uZmlnMSwgVmFsdWUzMik7CisgICAgICAgIH0KKyAgICB9Cit9IC8qIExNX052UmFtSW5pdCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU1RBVElDIExNX1NUQVRVUworTE1fRWVwcm9tUmVhZCgKKyAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisgICAgTE1fVUlOVDMyIE9mZnNldCwKKyAgICBMTV9VSU5UMzIgKnBEYXRhKQoreworICAgIExNX1VJTlQzMiBWYWx1ZTMyOworICAgIExNX1VJTlQzMiBBZGRyOworICAgIExNX1VJTlQzMiBEZXY7CisgICAgTE1fVUlOVDMyIGo7CisKKyAgICBpZihPZmZzZXQgPiBTRUVQUk9NX0NISVBfU0laRSkKKyAgICB7CisgICAgICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBEZXYgPSBPZmZzZXQgLyBTRUVQUk9NX0NISVBfU0laRTsKKyAgICBBZGRyID0gT2Zmc2V0ICUgU0VFUFJPTV9DSElQX1NJWkU7CisKKyAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIEdyYy5FZXByb21BZGRyKTsKKyAgICBWYWx1ZTMyICY9IH4oU0VFUFJPTV9BRERSX0FERFJFU1NfTUFTSyB8IFNFRVBST01fQUREUl9ERVZfSURfTUFTSyB8CisgICAgICAgIFNFRVBST01fQUREUl9SV19NQVNLKTsKKyAgICBSRUdfV1IocERldmljZSwgR3JjLkVlcHJvbUFkZHIsIFZhbHVlMzIgfCBTRUVQUk9NX0FERFJfREVWX0lEKERldikgfAorICAgICAgICBTRUVQUk9NX0FERFJfQUREUkVTUyhBZGRyKSB8IFNFRVBST01fQUREUl9TVEFSVCB8IFNFRVBST01fQUREUl9SRUFEKTsKKworICAgIGZvcihqID0gMDsgaiA8IDEwMDA7IGorKykKKyAgICB7CisgICAgICAgIFZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgR3JjLkVlcHJvbUFkZHIpOworICAgICAgICBpZihWYWx1ZTMyICYgU0VFUFJPTV9BRERSX0NPTVBMRVRFKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICB9CisKKyAgICBpZihWYWx1ZTMyICYgU0VFUFJPTV9BRERSX0NPTVBMRVRFKQorICAgIHsKKyAgICAgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBHcmMuRWVwcm9tRGF0YSk7CisgICAgICAgICpwRGF0YSA9IFZhbHVlMzI7CisKKyAgICAgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKK30gLyogTE1fRWVwcm9tUmVhZCAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTVEFUSUMgTE1fU1RBVFVTCitMTV9OdnJhbVJlYWQoCisgICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorICAgIExNX1VJTlQzMiBPZmZzZXQsCisgICAgTE1fVUlOVDMyICpwRGF0YSkKK3sKKyAgICBMTV9VSU5UMzIgVmFsdWUzMjsKKyAgICBMTV9TVEFUVVMgU3RhdHVzOworICAgIExNX1VJTlQzMiBqOworCisgICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisgICAgICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKKyAgICB7CisgICAgICAgIFN0YXR1cyA9IExNX0VlcHJvbVJlYWQocERldmljZSwgT2Zmc2V0LCBwRGF0YSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIERldGVybWluZSBpZiB3ZSBoYXZlIGZsYXNoIG9yIEVFUFJPTS4gKi8KKyAgICAgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBOdnJhbS5Db25maWcxKTsKKyAgICAgICAgaWYoVmFsdWUzMiAmIEZMQVNIX0lOVEVSRkFDRV9FTkFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMzIgJiBGTEFTSF9TU1JBTV9CVUZGRVJSRURfTU9ERSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPZmZzZXQgPSAoKE9mZnNldC9CVUZGRVJFRF9GTEFTSF9QQUdFX1NJWkUpIDw8CisgICAgICAgICAgICAgICAgICAgIEJVRkZFUkVEX0ZMQVNIX1BBR0VfUE9TKSArCisgICAgICAgICAgICAgICAgICAgIChPZmZzZXQgJSBCVUZGRVJFRF9GTEFTSF9QQUdFX1NJWkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE52cmFtLlN3QXJiLCBTV19BUkJfUkVRX1NFVDEpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUkVHX1JEKHBEZXZpY2UsIE52cmFtLlN3QXJiKSAmIFNXX0FSQl9HTlQxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTU1fV2FpdCgyMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPT0gMTAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVhZCBmcm9tIGZsYXNoIG9yIEVFUFJPTSB3aXRoIHRoZSBuZXcgNTcwMy8wMiBpbnRlcmZhY2UuICovCisgICAgICAgIFJFR19XUihwRGV2aWNlLCBOdnJhbS5BZGRyLCBPZmZzZXQgJiBOVlJBTV9BRERSRVNTX01BU0spOworCisgICAgICAgIFJFR19XUihwRGV2aWNlLCBOdnJhbS5DbWQsIE5WUkFNX0NNRF9SRCB8IE5WUkFNX0NNRF9ET19JVCB8CisgICAgICAgICAgICBOVlJBTV9DTURfRklSU1QgfCBOVlJBTV9DTURfTEFTVCB8IE5WUkFNX0NNRF9ET05FKTsKKworICAgICAgICAvKiBXYWl0IGZvciB0aGUgZG9uZSBiaXQgdG8gY2xlYXIuICovCisgICAgICAgIGZvcihqID0gMDsgaiA8IDUwMDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKworICAgICAgICAgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBOdnJhbS5DbWQpOworICAgICAgICAgICAgaWYoIShWYWx1ZTMyICYgTlZSQU1fQ01EX0RPTkUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogV2FpdCBmb3IgdGhlIGRvbmUgYml0LiAqLworICAgICAgICBpZighKFZhbHVlMzIgJiBOVlJBTV9DTURfRE9ORSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IDUwMDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1NX1dhaXQoMTApOworCisgICAgICAgICAgICAgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBOdnJhbS5DbWQpOworICAgICAgICAgICAgICAgIGlmKFZhbHVlMzIgJiBOVlJBTV9DTURfRE9ORSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1NX1dhaXQoMTApOworCisgICAgICAgICAgICAgICAgICAgICpwRGF0YSA9IFJFR19SRChwRGV2aWNlLCBOdnJhbS5SZWFkRGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQ2hhbmdlIHRoZSBlbmRpYW5lc3MuICovCisgICAgICAgICAgICAgICAgICAgICpwRGF0YSA9ICgoKnBEYXRhICYgMHhmZikgPDwgMjQpfCAoKCpwRGF0YSAmIDB4ZmYwMCkgPDwgOCl8CisgICAgICAgICAgICAgICAgICAgICAgICAoKCpwRGF0YSAmIDB4ZmYwMDAwKSA+PiA4KSB8ICgoKnBEYXRhID4+IDI0KSAmIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFJFR19XUihwRGV2aWNlLCBOdnJhbS5Td0FyYiwgU1dfQVJCX1JFUV9DTFIxKTsKKyAgICAgICAgaWYoVmFsdWUzMiAmIE5WUkFNX0NNRF9ET05FKQorICAgICAgICB7CisgICAgICAgICAgICBTdGF0dXMgPSBMTV9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0YXR1cyA9IExNX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFN0YXR1czsKK30gLyogTE1fTnZyYW1SZWFkICovCisKKworU1RBVElDIHZvaWQKK0xNX1JlYWRWUEQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworICAgIExNX1VJTlQzMiBWcGRfYXJyWzI1Ni80XTsKKyAgICBMTV9VSU5UOCAqVnBkID0gKExNX1VJTlQ4ICopICZWcGRfYXJyWzBdOworICAgIExNX1VJTlQzMiAqVnBkX2RwdHIgPSAmVnBkX2FyclswXTsKKyAgICBMTV9VSU5UMzIgVmFsdWUzMjsKKyAgICB1bnNpZ25lZCBpbnQgajsKKworICAgIC8qIFJlYWQgUE4gZnJvbSBWUEQgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqICs9IDQsIFZwZF9kcHRyKysgKQorICAgIHsKKyAgICAgICAgaWYgKExNX052cmFtUmVhZChwRGV2aWNlLCAweDEwMCArIGosICZWYWx1ZTMyKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICAgICAgcHJpbnRmKCJCQ001NzB4OiBMTV9SZWFkVlBEOiBWUEQgcmVhZCBmYWlsZWQiCisJCSAgICIgKG5vIEVFUFJPTSBvbmJvYXJkKVxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgKlZwZF9kcHRyID0gY3B1X3RvX2xlMzIoVmFsdWUzMik7CisgICAgfQorICAgIGZvciAoaiA9IDA7IGogPCAyNTY7ICkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBWcGRfcl9sZW47CisgICAgICAgIHVuc2lnbmVkIGludCBWcGRfcl9lbmQ7CisKKyAgICAgICAgaWYgKChWcGRbal0gPT0gMHg4MikgfHwgKFZwZFtqXSA9PSAweDkxKSkKKyAgICAgICAgeworICAgICAgICAgICAgaiA9IGogKyAzICsgVnBkW2ogKyAxXSArIChWcGRbaiArIDJdIDw8IDgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFZwZFtqXSA9PSAweDkwKQorICAgICAgICB7CisgICAgICAgICAgICBWcGRfcl9sZW4gPSAgVnBkW2ogKyAxXSArIChWcGRbaiArIDJdIDw8IDgpOworICAgICAgICAgICAgaiArPSAzOworICAgICAgICAgICAgVnBkX3JfZW5kID0gVnBkX3JfbGVuICsgajsKKyAgICAgICAgICAgIHdoaWxlIChqIDwgVnBkX3JfZW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoVnBkW2pdID09ICdQJykgJiYgKFZwZFtqICsgMV0gPT0gJ04nKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4gPSBWcGRbaiArIDJdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMjQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwRGV2aWNlLT5QYXJ0Tm8sICZWcGRbaiArIDNdLCBsZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoVnBkW2ogKyAyXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBqID0gaiArIFZwZFtqICsgMl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworU1RBVElDIHZvaWQKK0xNX1JlYWRCb290Q29kZVZlcnNpb24oUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworICAgIExNX1VJTlQzMiBWYWx1ZTMyLCBvZmZzZXQsIHZlcl9vZmZzZXQ7CisgICAgaW50IGk7CisKKyAgICBpZiAoTE1fTnZyYW1SZWFkKHBEZXZpY2UsIDB4MCwgJlZhbHVlMzIpICE9IExNX1NUQVRVU19TVUNDRVNTKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFZhbHVlMzIgIT0gMHhhYTU1OTk2NikKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChMTV9OdnJhbVJlYWQocERldmljZSwgMHhjLCAmb2Zmc2V0KSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuOworCisgICAgb2Zmc2V0ID0gKChvZmZzZXQgJiAweGZmKSA8PCAyNCl8ICgob2Zmc2V0ICYgMHhmZjAwKSA8PCA4KXwKKyAgICAgICAgKChvZmZzZXQgJiAweGZmMDAwMCkgPj4gOCkgfCAoKG9mZnNldCA+PiAyNCkgJiAweGZmKTsKKyAgICBpZiAoTE1fTnZyYW1SZWFkKHBEZXZpY2UsIG9mZnNldCwgJlZhbHVlMzIpICE9IExNX1NUQVRVU19TVUNDRVNTKQorICAgICAgICByZXR1cm47CisgICAgaWYgKChWYWx1ZTMyID09IDB4MDMwMDAwMGUpICYmCisgICAgICAgIChMTV9OdnJhbVJlYWQocERldmljZSwgb2Zmc2V0ICsgNCwgJlZhbHVlMzIpID09IExNX1NUQVRVU19TVUNDRVNTKSAmJgorICAgICAgICAoVmFsdWUzMiA9PSAwKSkgeworCisgICAgICAgIGlmIChMTV9OdnJhbVJlYWQocERldmljZSwgb2Zmc2V0ICsgOCwgJnZlcl9vZmZzZXQpICE9IExNX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB2ZXJfb2Zmc2V0ID0gKCh2ZXJfb2Zmc2V0ICYgMHhmZjAwMDApID4+IDgpIHwKKyAgICAgICAgICAgICgodmVyX29mZnNldCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDQpIHsKKyAgICAgICAgICAgIGlmIChMTV9OdnJhbVJlYWQocERldmljZSwgb2Zmc2V0ICsgdmVyX29mZnNldCArIGksICZWYWx1ZTMyKSAhPQorICAgICAgICAgICAgICAgIExNX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooKExNX1VJTlQzMiAqKSAmcERldmljZS0+Qm9vdENvZGVWZXJbaV0pID0gY3B1X3RvX2xlMzIoVmFsdWUzMik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNoYXIgYzsKKworICAgICAgICBpZiAoTE1fTnZyYW1SZWFkKHBEZXZpY2UsIDB4OTQsICZWYWx1ZTMyKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpID0gMDsKKyAgICAgICAgYyA9ICgoVmFsdWUzMiAmIDB4ZmYwMDAwKSA+PiAxNik7CisKKyAgICAgICAgaWYgKGMgPCAxMCkgeworICAgICAgICAgICAgcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IGMgKyAnMCc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gKGMgLyAxMCkgKyAnMCc7CisgICAgICAgICAgICBwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gKGMgJSAxMCkgKyAnMCc7CisgICAgICAgIH0KKyAgICAgICAgcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9ICcuJzsKKyAgICAgICAgYyA9IChWYWx1ZTMyICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisgICAgICAgIGlmIChjIDwgMTApIHsKKyAgICAgICAgICAgIHBEZXZpY2UtPkJvb3RDb2RlVmVyW2krK10gPSBjICsgJzAnOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IChjIC8gMTApICsgJzAnOworICAgICAgICAgICAgcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IChjICUgMTApICsgJzAnOworICAgICAgICB9CisgICAgICAgIHBEZXZpY2UtPkJvb3RDb2RlVmVyW2ldID0gMDsKKyAgICB9Cit9CisKK1NUQVRJQyB2b2lkCitMTV9HZXRCdXNTcGVlZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisgICAgTE1fVUlOVDMyIFBjaVN0YXRlID0gcERldmljZS0+UGNpU3RhdGU7CisgICAgTE1fVUlOVDMyIENsb2NrQ3RybDsKKyAgICBjaGFyICpTcGVlZFN0ciA9ICIiOworCisgICAgaWYgKFBjaVN0YXRlICYgVDNfUENJX1NUQVRFXzMyQklUX1BDSV9CVVMpCisgICAgeworICAgICAgICBzdHJjcHkocERldmljZS0+QnVzU3BlZWRTdHIsICIzMi1iaXQgIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0cmNweShwRGV2aWNlLT5CdXNTcGVlZFN0ciwgIjY0LWJpdCAiKTsKKyAgICB9CisgICAgaWYgKFBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkKKyAgICB7CisgICAgICAgIHN0cmNhdChwRGV2aWNlLT5CdXNTcGVlZFN0ciwgIlBDSSAiKTsKKyAgICAgICAgaWYgKFBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0hJR0hfQlVTX1NQRUVEKQorICAgICAgICB7CisgICAgICAgICAgICBTcGVlZFN0ciA9ICI2Nk1IeiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTcGVlZFN0ciA9ICIzM01IeiI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RyY2F0KHBEZXZpY2UtPkJ1c1NwZWVkU3RyLCAiUENJWCAiKTsKKyAgICAgICAgaWYgKHBEZXZpY2UtPkJvbmRJZCA9PSBHUkNfTUlTQ19CRF9JRF81NzA0Q0lPQkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNwZWVkU3RyID0gIjEzM01IeiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDbG9ja0N0cmwgPSBSRUdfUkQocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCkgJiAweDFmOworICAgICAgICAgICAgc3dpdGNoIChDbG9ja0N0cmwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgU3BlZWRTdHIgPSAiMzNNSHoiOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgU3BlZWRTdHIgPSAiNTBNSHoiOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgU3BlZWRTdHIgPSAiNjZNSHoiOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgU3BlZWRTdHIgPSAiMTAwTUh6IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIFNwZWVkU3RyID0gIjEzM01IeiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3RyY2F0KHBEZXZpY2UtPkJ1c1NwZWVkU3RyLCBTcGVlZFN0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGRlZmF1bHQgcGFyYW1ldGVycyBhbmQgcmVhZHMgdGhlIFBDSSAgICAgICAgICAgKi8KKy8qICAgIGNvbmZpZ3VyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTCitMTV9HZXRBZGFwdGVySW5mbygKK1BMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKyAgICBQTE1fQURBUFRFUl9JTkZPIHBBZGFwdGVySW5mbzsKKyAgICBMTV9VSU5UMzIgVmFsdWUzMjsKKyAgICBMTV9TVEFUVVMgU3RhdHVzOworICAgIExNX1VJTlQzMiBqOworICAgIExNX1VJTlQzMiBFZVNpZ0ZvdW5kOworICAgIExNX1VJTlQzMiBFZVBoeVR5cGVTZXJkZXMgPSAwOworICAgIExNX1VJTlQzMiBFZVBoeUxlZE1vZGUgPSAwOworICAgIExNX1VJTlQzMiBFZVBoeUlkID0gMDsKKworICAgIC8qIEdldCBEZXZpY2UgSWQgYW5kIFZlbmRvciBJZCAqLworICAgIFN0YXR1cyA9IE1NX1JlYWRDb25maWczMihwRGV2aWNlLCBQQ0lfVkVORE9SX0lEX1JFRywgJlZhbHVlMzIpOworICAgIGlmKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBTdGF0dXM7CisgICAgfQorICAgIHBEZXZpY2UtPlBjaVZlbmRvcklkID0gKExNX1VJTlQxNikgVmFsdWUzMjsKKyAgICBwRGV2aWNlLT5QY2lEZXZpY2VJZCA9IChMTV9VSU5UMTYpIChWYWx1ZTMyID4+IDE2KTsKKworICAgIC8qIElmIHdlIGFyZSBub3QgZ2V0dGluZyB0aGUgd3JpdGUgYWRhcHRlciwgZXhpdC4gKi8KKyAgICBpZigoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwMCkgJiYKKyAgICAgICAoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwMSkgJiYKKyAgICAgICAoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwMikgJiYKKyAgICAgICAoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwMngpICYmCisgICAgICAgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDJGRSkgJiYKKyAgICAgICAoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwMykgJiYKKyAgICAgICAoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwM3gpICYmCisgICAgICAgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIFN0YXR1cyA9IE1NX1JlYWRDb25maWczMihwRGV2aWNlLCBQQ0lfUkVWX0lEX1JFRywgJlZhbHVlMzIpOworICAgIGlmKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBTdGF0dXM7CisgICAgfQorICAgIHBEZXZpY2UtPlBjaVJldklkID0gKExNX1VJTlQ4KSBWYWx1ZTMyOworCisgICAgLyogR2V0IElSUS4gKi8KKyAgICBTdGF0dXMgPSBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJX0lOVF9MSU5FX1JFRywgJlZhbHVlMzIpOworICAgIGlmKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBTdGF0dXM7CisgICAgfQorICAgIHBEZXZpY2UtPklycSA9IChMTV9VSU5UOCkgVmFsdWUzMjsKKworICAgIC8qIEdldCBpbnRlcnJ1cHQgcGluLiAqLworICAgIHBEZXZpY2UtPkludFBpbiA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gOCk7CisKKyAgICAvKiBHZXQgY2hpcCByZXZpc2lvbiBpZC4gKi8KKyAgICBTdGF0dXMgPSBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX01JU0NfSE9TVF9DVFJMX1JFRywgJlZhbHVlMzIpOworICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9IFZhbHVlMzIgPj4gMTY7CisKKyAgICAvKiBHZXQgc3Vic3lzdGVtIHZlbmRvci4gKi8KKyAgICBTdGF0dXMgPSBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSURfUkVHLCAmVmFsdWUzMik7CisgICAgaWYoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czsKKyAgICB9CisgICAgcERldmljZS0+U3Vic3lzdGVtVmVuZG9ySWQgPSAoTE1fVUlOVDE2KSBWYWx1ZTMyOworCisgICAgLyogR2V0IFBDSSBzdWJzeXN0ZW0gaWQuICovCisgICAgcERldmljZS0+U3Vic3lzdGVtSWQgPSAoTE1fVUlOVDE2KSAoVmFsdWUzMiA+PiAxNik7CisKKyAgICAvKiBHZXQgdGhlIGNhY2hlIGxpbmUgc2l6ZS4gKi8KKyAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJX0NBQ0hFX0xJTkVfU0laRV9SRUcsICZWYWx1ZTMyKTsKKyAgICBwRGV2aWNlLT5DYWNoZUxpbmVTaXplID0gKExNX1VJTlQ4KSBWYWx1ZTMyOworICAgIHBEZXZpY2UtPlNhdmVkQ2FjaGVMaW5lUmVnID0gVmFsdWUzMjsKKworICAgIGlmKHBEZXZpY2UtPkNoaXBSZXZJZCAhPSBUM19DSElQX0lEXzU3MDNfQTEgJiYKKyAgICAgICAgcERldmljZS0+Q2hpcFJldklkICE9IFQzX0NISVBfSURfNTcwM19BMiAmJgorICAgICAgICBwRGV2aWNlLT5DaGlwUmV2SWQgIT0gVDNfQ0hJUF9JRF81NzA0X0EwKQorICAgIHsKKyAgICAgICAgcERldmljZS0+VW5kaUZpeCA9IEZBTFNFOworICAgIH0KKyNpZiAhUENJWF9UQVJHRVRfV09SS0FST1VORAorICAgIHBEZXZpY2UtPlVuZGlGaXggPSBGQUxTRTsKKyNlbmRpZgorICAgIC8qIE1hcCB0aGUgbWVtb3J5IGJhc2UgdG8gc3lzdGVtIGFkZHJlc3Mgc3BhY2UuICovCisgICAgaWYgKCFwRGV2aWNlLT5VbmRpRml4KQorICAgIHsKKyAgICAgICAgU3RhdHVzID0gTU1fTWFwTWVtQmFzZShwRGV2aWNlKTsKKyAgICAgICAgaWYoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOworICAgICAgICB9CisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIG1lbW9yeSB2aWV3IHBvaW50ZXIuICovCisgICAgICAgIHBEZXZpY2UtPnBNZW1WaWV3ID0gKFBUM19TVERfTUVNX01BUCkgcERldmljZS0+cE1hcHBlZE1lbUJhc2U7CisgICAgfQorCisjaWYgUENJWF9UQVJHRVRfV09SS0FST1VORAorICAgIC8qIHN0b3JlIHdoZXRoZXIgd2UgYXJlIGluIFBDSSBhcmUgUENJLVggbW9kZSAqLworICAgIHBEZXZpY2UtPkVuYWJsZVBjaVhGaXggPSBGQUxTRTsKKworICAgIE1NX1JlYWRDb25maWczMihwRGV2aWNlLCBUM19QQ0lfU1RBVEVfUkVHLCAmVmFsdWUzMik7CisgICAgaWYoKFZhbHVlMzIgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogRW5hYmxlIFBDSS1YIHdvcmthcm91bmQgb25seSBpZiB3ZSBhcmUgcnVubmluZyBvbiA1NzAwIEJYLiAqLworICAgICAgICBpZihUM19DSElQX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0NISVBfUkVWXzU3MDBfQlgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEZXZpY2UtPkVuYWJsZVBjaVhGaXggPSBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwRGV2aWNlLT5VbmRpRml4KQorICAgIHsKKyAgICAgICAgcERldmljZS0+RW5hYmxlUGNpWEZpeCA9IFRSVUU7CisgICAgfQorI2VuZGlmCisgICAgLyogQnggYnVnOiBkdWUgdG8gdGhlICJieXRlX2VuYWJsZSBidWciIGluIFBDSS1YIG1vZGUsIHRoZSBwb3dlciAqLworICAgIC8qIG1hbmFnZW1lbnQgcmVnaXN0ZXIgbWF5IGJlIGNsb2JiZXJlZCB3aGljaCBtYXkgY2F1c2UgdGhlICovCisgICAgLyogQkNNNTcwMCB0byBnbyBpbnRvIEQzIHN0YXRlLiAgV2hpbGUgaW4gdGhpcyBzdGF0ZSwgd2Ugd2lsbCAqLworICAgIC8qIG5vdCBoYXZlIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXIgYWNjZXNzLiAgQXMgYSB3b3JrYXJvdW5kLCB3ZSAqLworICAgIC8qIG5lZWQgdG8gcmVzdG9yZSB0aGUgZGV2aWNlIHRvIEQwIHN0YXRlLiAqLworICAgIE1NX1JlYWRDb25maWczMihwRGV2aWNlLCBUM19QQ0lfUE1fU1RBVFVTX0NUUkxfUkVHLCAmVmFsdWUzMik7CisgICAgVmFsdWUzMiB8PSBUM19QTV9QTUVfQVNTRVJURUQ7CisgICAgVmFsdWUzMiAmPSB+VDNfUE1fUE9XRVJfU1RBVEVfTUFTSzsKKyAgICBWYWx1ZTMyIHw9IFQzX1BNX1BPV0VSX1NUQVRFX0QwOworICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX1BNX1NUQVRVU19DVFJMX1JFRywgVmFsdWUzMik7CisKKyAgICAvKiByZWFkIHRoZSBjdXJyZW50IFBDSSBjb21tYW5kIHdvcmQgKi8KKyAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJX0NPTU1BTkRfUkVHLCAmVmFsdWUzMik7CisKKyAgICAvKiBNYWtlIHN1cmUgYnVzLW1hc3RlcmluZyBpcyBlbmFibGVkLiAqLworICAgIFZhbHVlMzIgfD0gUENJX0JVU01BU1RFUl9FTkFCTEU7CisKKyNpZiBQQ0lYX1RBUkdFVF9XT1JLQVJPVU5ECisgICAgLyogaWYgd2UgYXJlIGluIFBDSS1YIG1vZGUsIGFsc28gbWFrZSBzdXJlIG1lbS1tYXBwaW5nIGFuZCBTRVJSIy9QRVJSIworICAgICAgICBhcmUgZW5hYmxlZCAqLworICAgIGlmIChwRGV2aWNlLT5FbmFibGVQY2lYRml4ID09IFRSVUUpIHsKKyAgICAgICAgVmFsdWUzMiB8PSAoUENJX01FTV9TUEFDRV9FTkFCTEUgfCBQQ0lfU1lTVEVNX0VSUk9SX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgICAgIFBDSV9QQVJJVFlfRVJST1JfRU5BQkxFKTsKKyAgICB9CisgICAgaWYgKHBEZXZpY2UtPlVuZGlGaXgpCisgICAgeworICAgICAgICBWYWx1ZTMyICY9IH5QQ0lfTUVNX1NQQUNFX0VOQUJMRTsKKyAgICB9CisKKyNlbmRpZgorCisgICAgaWYocERldmljZS0+RW5hYmxlTVdJKQorICAgIHsKKyAgICAgICAgVmFsdWUzMiB8PSBQQ0lfTUVNT1JZX1dSSVRFX0lOVkFMSURBVEU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBWYWx1ZTMyICY9ICh+UENJX01FTU9SWV9XUklURV9JTlZBTElEQVRFKTsKKyAgICB9CisKKyAgICAvKiBFcnJvciBvdXQgaWYgbWVtLW1hcHBpbmcgaXMgTk9UIGVuYWJsZWQgZm9yIFBDSSBzeXN0ZW1zICovCisgICAgaWYgKCEoVmFsdWUzMiB8IFBDSV9NRU1fU1BBQ0VfRU5BQkxFKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiBzYXZlIHRoZSB2YWx1ZSB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgaW50byB0aGUgUENJIGNvbW1hbmQgd29yZCAqLworICAgIHBEZXZpY2UtPlBjaUNvbW1hbmRTdGF0dXNXb3JkcyA9IFZhbHVlMzI7CisKKyAgICBTdGF0dXMgPSBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFBDSV9DT01NQU5EX1JFRywgVmFsdWUzMik7CisgICAgaWYoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czsKKyAgICB9CisKKyAgICAvKiBTZXQgcG93ZXIgc3RhdGUgdG8gRDAuICovCisgICAgTE1fU2V0UG93ZXJTdGF0ZShwRGV2aWNlLCBMTV9QT1dFUl9TVEFURV9EMCk7CisKKyNpZmRlZiBCSUdfRU5ESUFOX1BDSQorICAgIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCA9CisgICAgICAgIE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCB8CisgICAgICAgIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9JTkRJUkVDVF9BQ0NFU1MgfAorICAgICAgICBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfRU5ESUFOX1dPUkRfU1dBUCB8CisgICAgICAgIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9QQ0lfU1RBVEVfUkVHX1JXOworI2Vsc2UgLyogTm8gQ1BVIFN3YXAgbW9kZXMgZm9yIFBDSSBJTyAqLworCisgICAgLyogU2V0dXAgdGhlIG1vZGUgcmVnaXN0ZXJzLiAqLworICAgIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCA9CisgICAgICAgIE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCB8CisgICAgICAgIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9FTkRJQU5fV09SRF9TV0FQIHwKKyNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKKyAgICAgICAgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX0VORElBTl9CWVRFX1NXQVAgfAorI2VuZGlmIC8qIEJJR19FTkRJQU5fSE9TVCAqLworICAgICAgICBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfSU5ESVJFQ1RfQUNDRVNTIHwKKyAgICAgICAgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX1BDSV9TVEFURV9SRUdfUlc7CisjZW5kaWYgLyogIUJJR19FTkRJQU5fUENJICovCisKKyAgICAvKiB3cml0ZSB0byBQQ0kgbWlzYyBob3N0IGN0ciBmaXJzdCBpbiBvcmRlciB0byBlbmFibGUgaW5kaXJlY3QgYWNjZXNzZXMgKi8KKyAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NSVNDX0hPU1RfQ1RSTF9SRUcsIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCk7CisKKyAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLk1pc2NIb3N0Q3RybCwgcERldmljZS0+TWlzY0hvc3RDdHJsKTsKKworI2lmZGVmIEJJR19FTkRJQU5fUENJCisgICAgVmFsdWUzMiA9IEdSQ19NT0RFX1dPUkRfU1dBUF9EQVRBfAorCSAgICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQTsKKyNlbHNlCisvKiBObyBDUFUgU3dhcCBtb2RlcyBmb3IgUENJIElPICovCisjaWZkZWYgQklHX0VORElBTl9IT1NUCisgICAgVmFsdWUzMiA9IEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSB8CisgICAgICAgICAgICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQTsKKyNlbHNlCisgICAgVmFsdWUzMiA9IEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSB8IEdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBOworI2VuZGlmCisjZW5kaWYgLyogIUJJR19FTkRJQU5fUENJICovCisKKyAgICBSRUdfV1IocERldmljZSwgR3JjLk1vZGUsIFZhbHVlMzIpOworCisgICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKQorICAgIHsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxIHwKKyAgICAgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEpOworICAgIH0KKyAgICBNTV9XYWl0KDQwKTsKKworICAgIC8qIEVuYWJsZSBpbmRpcmVjdCBtZW1vcnkgYWNjZXNzICovCisgICAgUkVHX1dSKHBEZXZpY2UsIE1lbUFyYml0ZXIuTW9kZSwgVDNfTUVNX0FSQklURVJfTU9ERV9FTkFCTEUpOworCisgICAgaWYgKFJFR19SRChwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsKSAmIFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLKQorICAgIHsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLIHwKKyAgICAgICAgICAgICAgICBUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSyk7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSyk7CisgICAgICAgIE1NX1dhaXQoNDApOyAgLyogcmVxdWlyZWQgZGVsYXkgaXMgMjd1c2VjICovCisgICAgfQorICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCAwKTsKKyAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLk1lbVdpbmRvd0Jhc2VBZGRyLCAwKTsKKworI2lmIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQKKyAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX1NUQVRFX1JFRywgJlZhbHVlMzIpOworICAgIGlmICgocERldmljZS0+RW5hYmxlUGNpWEZpeCA9PSBGQUxTRSkgJiYKKyAgICAgICAgKChWYWx1ZTMyICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAorICAgICAgICAgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCB8fAorICAgICAgICAgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMiB8fAorICAgICAgICAgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CNSkKKyAgICAgICAgeworICAgICAgICAgICAgX19yYXdfd3JpdGVsKDAsICYocERldmljZS0+cE1lbVZpZXctPnVJbnRNZW0uTWVtQmxvY2szMktbMHgzMDBdKSk7CisgICAgICAgICAgICBfX3Jhd193cml0ZWwoMCwgJihwRGV2aWNlLT5wTWVtVmlldy0+dUludE1lbS5NZW1CbG9jazMyS1sweDMwMV0pKTsKKyAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCAmKHBEZXZpY2UtPnBNZW1WaWV3LT51SW50TWVtLk1lbUJsb2NrMzJLWzB4MzAxXSkpOworICAgICAgICAgICAgaWYgKF9fcmF3X3JlYWRsKCYocERldmljZS0+cE1lbVZpZXctPnVJbnRNZW0uTWVtQmxvY2szMktbMHgzMDBdKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERldmljZS0+RW5hYmxlUGNpWEZpeCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyNpZiAxCisgICAgLyoKKyAgICAqICBUaGlzIGNvZGUgd2FzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWxzZSBibG9jayBiZWxvdywgYnV0IHRoYXQncworICAgICogIGEgYnVnIGlmIG5vZGUgYWRkcmVzcyBpbiBzaGFyZWQgbWVtb3J5LgorICAgICovCisgICAgTU1fV2FpdCg1MCk7CisgICAgTE1fTnZyYW1Jbml0KHBEZXZpY2UpOworI2VuZGlmCisgICAgLyogR2V0IHRoZSBub2RlIGFkZHJlc3MuICBGaXJzdCB0cnkgdG8gZ2V0IGluIGZyb20gdGhlIHNoYXJlZCBtZW1vcnkuICovCisgICAgLyogSWYgdGhlIHNpZ25hdHVyZSBpcyBub3QgcHJlc2VudCwgdGhlbiBnZXQgaXQgZnJvbSB0aGUgTlZSQU0uICovCisgICAgVmFsdWUzMiA9IE1FTV9SRF9PRkZTRVQocERldmljZSwgVDNfTUFDX0FERFJfSElHSF9NQUlMQk9YKTsKKyAgICBpZigoVmFsdWUzMiA+PiAxNikgPT0gMHg0ODRiKQorICAgIHsKKworICAgICAgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1swXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gOCk7CisgICAgICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzFdID0gKExNX1VJTlQ4KSBWYWx1ZTMyOworCisgICAgICAgIFZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUKHBEZXZpY2UsIFQzX01BQ19BRERSX0xPV19NQUlMQk9YKTsKKworICAgICAgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1syXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gMjQpOworICAgICAgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1szXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gMTYpOworICAgICAgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1s0XSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gOCk7CisgICAgICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzVdID0gKExNX1VJTlQ4KSBWYWx1ZTMyOworCisgICAgICAgIFN0YXR1cyA9IExNX1NUQVRVU19TVUNDRVNTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTdGF0dXMgPSBMTV9OdnJhbVJlYWQocERldmljZSwgMHg3YywgJlZhbHVlMzIpOworICAgICAgICBpZihTdGF0dXMgPT0gTE1fU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzBdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAxNik7CisgICAgICAgICAgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1sxXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gMjQpOworCisgICAgICAgICAgICBTdGF0dXMgPSBMTV9OdnJhbVJlYWQocERldmljZSwgMHg4MCwgJlZhbHVlMzIpOworCisgICAgICAgICAgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1syXSA9IChMTV9VSU5UOCkgVmFsdWUzMjsKKyAgICAgICAgICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzNdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiA4KTsKKyAgICAgICAgICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzRdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAxNik7CisgICAgICAgICAgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1s1XSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gMjQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQXNzaWduIGEgZGVmYXVsdCBhZGRyZXNzLiAqLworICAgIGlmKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisjaWZuZGVmIEVNQkVEREVECisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGdldCBNQUMgYWRkciBmcm9tIE5WUkFNLiBVc2luZyBkZWZhdWx0LlxuIik7CisjZW5kaWYKKyAgICAgICAgcERldmljZS0+Tm9kZUFkZHJlc3NbMF0gPSAweDAwOyBwRGV2aWNlLT5Ob2RlQWRkcmVzc1sxXSA9IDB4MTA7CisgICAgICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzJdID0gMHgxODsgcERldmljZS0+Tm9kZUFkZHJlc3NbM10gPSAweDY4OworICAgICAgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1s0XSA9IDB4NjE7IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzVdID0gMHg3NjsKKyAgICB9CisKKyAgICBwRGV2aWNlLT5QZXJtYW5lbnROb2RlQWRkcmVzc1swXSA9IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzBdOworICAgIHBEZXZpY2UtPlBlcm1hbmVudE5vZGVBZGRyZXNzWzFdID0gcERldmljZS0+Tm9kZUFkZHJlc3NbMV07CisgICAgcERldmljZS0+UGVybWFuZW50Tm9kZUFkZHJlc3NbMl0gPSBwRGV2aWNlLT5Ob2RlQWRkcmVzc1syXTsKKyAgICBwRGV2aWNlLT5QZXJtYW5lbnROb2RlQWRkcmVzc1szXSA9IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzNdOworICAgIHBEZXZpY2UtPlBlcm1hbmVudE5vZGVBZGRyZXNzWzRdID0gcERldmljZS0+Tm9kZUFkZHJlc3NbNF07CisgICAgcERldmljZS0+UGVybWFuZW50Tm9kZUFkZHJlc3NbNV0gPSBwRGV2aWNlLT5Ob2RlQWRkcmVzc1s1XTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgdmFsdWVzLiAqLworICAgIHBEZXZpY2UtPk5vVHhQc2V1ZG9IZHJDaGtzdW0gPSBGQUxTRTsKKyAgICBwRGV2aWNlLT5Ob1J4UHNldWRvSGRyQ2hrc3VtID0gRkFMU0U7CisgICAgcERldmljZS0+TmljU2VuZEJkID0gRkFMU0U7CisgICAgcERldmljZS0+VHhQYWNrZXREZXNjQ250ID0gREVGQVVMVF9UWF9QQUNLRVRfREVTQ19DT1VOVDsKKyAgICBwRGV2aWNlLT5SeFN0ZERlc2NDbnQgPSBERUZBVUxUX1NURF9SQ1ZfREVTQ19DT1VOVDsKKyAgICBwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrcyA9IERFRkFVTFRfUlhfQ09BTEVTQ0lOR19USUNLUzsKKyAgICBwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrcyA9IERFRkFVTFRfVFhfQ09BTEVTQ0lOR19USUNLUzsKKyAgICBwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lcyA9IERFRkFVTFRfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVM7CisgICAgcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXMgPSBERUZBVUxUX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTOworICAgIHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0gQkFEX0RFRkFVTFRfVkFMVUU7CisgICAgcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSBCQURfREVGQVVMVF9WQUxVRTsKKyAgICBwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9IEJBRF9ERUZBVUxUX1ZBTFVFOworICAgIHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID0gQkFEX0RFRkFVTFRfVkFMVUU7CisgICAgcERldmljZS0+U3RhdHNDb2FsZXNjaW5nVGlja3MgPSBERUZBVUxUX1NUQVRTX0NPQUxFU0NJTkdfVElDS1M7CisgICAgcERldmljZS0+RW5hYmxlTVdJID0gRkFMU0U7CisgICAgcERldmljZS0+VHhNdHUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDOworICAgIHBEZXZpY2UtPlJ4TXR1ID0gTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQzsKKyAgICBwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9IEZBTFNFOworICAgIHBEZXZpY2UtPlBoeUludE1vZGUgPSBUM19QSFlfSU5UX01PREVfQVVUTzsKKyAgICBwRGV2aWNlLT5MaW5rQ2huZ01vZGUgPSBUM19MSU5LX0NITkdfTU9ERV9BVVRPOworICAgIHBEZXZpY2UtPkxlZE1vZGUgPSBMRURfTU9ERV9BVVRPOworICAgIHBEZXZpY2UtPlJlc2V0UGh5T25Jbml0ID0gVFJVRTsKKyAgICBwRGV2aWNlLT5EZWxheVBjaUdyYW50ID0gVFJVRTsKKyAgICBwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMgPSBGQUxTRTsKKyAgICBwRGV2aWNlLT5PbmVEbWFBdE9uY2UgPSBCQURfREVGQVVMVF9WQUxVRTsKKworICAgIHBEZXZpY2UtPkRtYU1idWZMb3dNYXJrID0gVDNfREVGX0RNQV9NQlVGX0xPV19XTUFSS19KVU1CTzsKKyAgICBwRGV2aWNlLT5SeE1hY01idWZMb3dNYXJrID0gVDNfREVGX1JYX01BQ19NQlVGX0xPV19XTUFSS19KVU1CTzsKKyAgICBwRGV2aWNlLT5NYnVmSGlnaE1hcmsgPSBUM19ERUZfTUJVRl9ISUdIX1dNQVJLX0pVTUJPOworCisgICAgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTzsKKyAgICBwRGV2aWNlLT5UYXNrT2ZmbG9hZENhcCA9IExNX1RBU0tfT0ZGTE9BRF9OT05FOworICAgIHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwID0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0U7CisgICAgcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7CisjaWYgSU5DTFVERV9UQklfU1VQUE9SVAorICAgIHBEZXZpY2UtPlBvbGxUYmlMaW5rID0gQkFEX0RFRkFVTFRfVkFMVUU7CisjZW5kaWYKKworICAgIHN3aXRjaCAoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSkKKyAgICB7CisgICAgY2FzZSBUM19BU0lDX1JFVl81NzA0OgorICAgICAgICBwRGV2aWNlLT5NYnVmQmFzZSA9IFQzX05JQ19NQlVGX1BPT0xfQUREUjsKKyAgICAgICAgcERldmljZS0+TWJ1ZlNpemUgPSBUM19OSUNfTUJVRl9QT09MX1NJWkU2NDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcERldmljZS0+TWJ1ZkJhc2UgPSBUM19OSUNfTUJVRl9QT09MX0FERFI7CisgICAgICAgIHBEZXZpY2UtPk1idWZTaXplID0gVDNfTklDX01CVUZfUE9PTF9TSVpFOTY7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBEZXZpY2UtPkxpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOworICAgIHBEZXZpY2UtPlF1ZXVlUnhQYWNrZXRzID0gVFJVRTsKKworICAgIHBEZXZpY2UtPkVuYWJsZVdpcmVTcGVlZCA9IFRSVUU7CisKKyNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCisgICAgcERldmljZS0+UnhKdW1ib0Rlc2NDbnQgPSBERUZBVUxUX0pVTUJPX1JDVl9ERVNDX0NPVU5UOworI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKworICAgIC8qIE1ha2UgdGhpcyBpcyBhIGtub3duIGFkYXB0ZXIuICovCisgICAgcEFkYXB0ZXJJbmZvID0gTE1fR2V0QWRhcHRlckluZm9CeVNzaWQocERldmljZS0+U3Vic3lzdGVtVmVuZG9ySWQsCisgICAgICAgIHBEZXZpY2UtPlN1YnN5c3RlbUlkKTsKKworICAgIHBEZXZpY2UtPkJvbmRJZCA9IFJFR19SRChwRGV2aWNlLCBHcmMuTWlzY0NmZykgJiBHUkNfTUlTQ19CRF9JRF9NQVNLOworICAgIGlmIChwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwMCAmJgorICAgICAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwMSAmJgorICAgICAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwMkZFICYmCisgICAgICAgIHBEZXZpY2UtPkJvbmRJZCAhPSBHUkNfTUlTQ19CRF9JRF81NzAzICYmCisgICAgICAgIHBEZXZpY2UtPkJvbmRJZCAhPSBHUkNfTUlTQ19CRF9JRF81NzAzUyAmJgorICAgICAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwNCAmJgorICAgICAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwNENJT0JFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExNX1NUQVRVU19VTktOT1dOX0FEQVBURVI7CisgICAgfQorCisgICAgcERldmljZS0+U3BsaXRNb2RlRW5hYmxlID0gU1BMSVRfTU9ERV9ESVNBQkxFOworICAgIGlmICgocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkgJiYKKyAgICAgICAgKHBEZXZpY2UtPkJvbmRJZCA9PSBHUkNfTUlTQ19CRF9JRF81NzA0Q0lPQkUpKQorICAgIHsKKyAgICAgICAgcERldmljZS0+U3BsaXRNb2RlRW5hYmxlID0gU1BMSVRfTU9ERV9FTkFCTEU7CisgICAgICAgIHBEZXZpY2UtPlNwbGl0TW9kZU1heFJlcSA9IFNQTElUX01PREVfNTcwNF9NQVhfUkVROworICAgIH0KKworICAgIC8qIEdldCBFZXByb20gaW5mby4gKi8KKyAgICBWYWx1ZTMyID0gTUVNX1JEX09GRlNFVChwRGV2aWNlLCBUM19OSUNfREFUQV9TSUdfQUREUik7CisgICAgaWYgKFZhbHVlMzIgPT0gVDNfTklDX0RBVEFfU0lHKQorICAgIHsKKyAgICAgICAgRWVTaWdGb3VuZCA9IFRSVUU7CisgICAgICAgIFZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUKHBEZXZpY2UsIFQzX05JQ19EQVRBX05JQ19DRkdfQUREUik7CisKKyAgICAgICAgLyogRGV0ZXJtaW5lIFBIWSB0eXBlLiAqLworICAgICAgICBzd2l0Y2ggKFZhbHVlMzIgJiBUM19OSUNfQ0ZHX1BIWV9UWVBFX01BU0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVDNfTklDX0NGR19QSFlfVFlQRV9DT1BQRVI6CisgICAgICAgICAgICAgICAgRWVQaHlUeXBlU2VyZGVzID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVDNfTklDX0NGR19QSFlfVFlQRV9GSUJFUjoKKyAgICAgICAgICAgICAgICBFZVBoeVR5cGVTZXJkZXMgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEVlUGh5VHlwZVNlcmRlcyA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogRGV0ZXJtaW5lIFBIWSBsZWQgbW9kZS4gKi8KKyAgICAgICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisgICAgICAgICAgICBUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChWYWx1ZTMyICYgVDNfTklDX0NGR19MRURfTU9ERV9NQVNLKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVDNfTklDX0NGR19MRURfTU9ERV9UUklQTEVfU1BFRUQ6CisgICAgICAgICAgICAgICAgICAgIEVlUGh5TGVkTW9kZSA9IExFRF9NT0RFX1RIUkVFX0xJTks7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBUM19OSUNfQ0ZHX0xFRF9NT0RFX0xJTktfU1BFRUQ6CisgICAgICAgICAgICAgICAgICAgIEVlUGh5TGVkTW9kZSA9IExFRF9NT0RFX0xJTksxMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9BVVRPOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChWYWx1ZTMyICYgVDNfTklDX0NGR19MRURfTU9ERV9NQVNLKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVDNfTklDX0NGR19MRURfTU9ERV9PUEVOX0RSQUlOOgorICAgICAgICAgICAgICAgICAgICBFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9PUEVOX0RSQUlOOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVDNfTklDX0NGR19MRURfTU9ERV9PVVRQVVQ6CisgICAgICAgICAgICAgICAgICAgIEVlUGh5TGVkTW9kZSA9IExFRF9NT0RFX09VVFBVVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9BVVRPOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAzX0ExIHx8CisgICAgICAgICAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAzX0EyKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFbmFibGUgRUVQUk9NIHdyaXRlIHByb3RlY3Rpb24uICovCisgICAgICAgICAgICBpZihWYWx1ZTMyICYgVDNfTklDX0VFUFJPTV9XUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5FZXByb21XcCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgdGhlIFBIWSBJZC4gKi8KKyAgICAgICAgVmFsdWUzMiA9IE1FTV9SRF9PRkZTRVQocERldmljZSwgVDNfTklDX0RBVEFfUEhZX0lEX0FERFIpOworICAgICAgICBpZiAoVmFsdWUzMikKKyAgICAgICAgeworICAgICAgICAgICAgRWVQaHlJZCA9ICgoKFZhbHVlMzIgJiBUM19OSUNfUEhZX0lEMV9NQVNLKSA+PiAxNikgJgorICAgICAgICAgICAgICAgIFBIWV9JRDFfT1VJX01BU0spIDw8IDEwOworCisgICAgICAgICAgICBWYWx1ZTMyID0gVmFsdWUzMiAmIFQzX05JQ19QSFlfSUQyX01BU0s7CisKKyAgICAgICAgICAgIEVlUGh5SWQgfD0gKChWYWx1ZTMyICYgUEhZX0lEMl9PVUlfTUFTSykgPDwgMTYpIHwKKyAgICAgICAgICAgICAgKFZhbHVlMzIgJiBQSFlfSUQyX01PREVMX01BU0spIHwgKFZhbHVlMzIgJiBQSFlfSUQyX1JFVl9NQVNLKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEVlUGh5SWQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEVlU2lnRm91bmQgPSBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIFBIWSBhZGRyZXNzLiAqLworICAgIHBEZXZpY2UtPlBoeUFkZHIgPSBQSFlfREVWSUNFX0lEOworCisgICAgLyogRGlzYWJsZSBhdXRvIHBvbGxpbmcuICovCisgICAgcERldmljZS0+TWlNb2RlID0gMHhjMDAwMDsKKyAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7CisgICAgTU1fV2FpdCg0MCk7CisKKyAgICAvKiBHZXQgdGhlIFBIWSBpZC4gKi8KKyAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9JRDFfUkVHLCAmVmFsdWUzMik7CisgICAgcERldmljZS0+UGh5SWQgPSAoVmFsdWUzMiAmIFBIWV9JRDFfT1VJX01BU0spIDw8IDEwOworCisgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfSUQyX1JFRywgJlZhbHVlMzIpOworICAgIHBEZXZpY2UtPlBoeUlkIHw9ICgoVmFsdWUzMiAmIFBIWV9JRDJfT1VJX01BU0spIDw8IDE2KSB8CisgICAgICAoVmFsdWUzMiAmIFBIWV9JRDJfTU9ERUxfTUFTSykgfCAoVmFsdWUzMiAmIFBIWV9JRDJfUkVWX01BU0spOworCisgICAgLyogU2V0IHRoZSBFbmFibGVUYmkgZmxhZyB0byBmYWxzZSBpZiB3ZSBoYXZlIGEgY29wcGVyIFBIWS4gKi8KKyAgICBzd2l0Y2gocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykKKyAgICB7CisgICAgICAgIGNhc2UgUEhZX0JDTTU0MDBfUEhZX0lEOgorICAgICAgICAgICAgcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBIWV9CQ001NDAxX1BIWV9JRDoKKyAgICAgICAgICAgIHBEZXZpY2UtPkVuYWJsZVRiaSA9IEZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQSFlfQkNNNTQxMV9QSFlfSUQ6CisgICAgICAgICAgICBwRGV2aWNlLT5FbmFibGVUYmkgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUEhZX0JDTTU3MDFfUEhZX0lEOgorICAgICAgICAgICAgcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBIWV9CQ001NzAzX1BIWV9JRDoKKyAgICAgICAgICAgIHBEZXZpY2UtPkVuYWJsZVRiaSA9IEZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQSFlfQkNNNTcwNF9QSFlfSUQ6CisgICAgICAgICAgICBwRGV2aWNlLT5FbmFibGVUYmkgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUEhZX0JDTTgwMDJfUEhZX0lEOgorICAgICAgICAgICAgcERldmljZS0+RW5hYmxlVGJpID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIGlmIChwQWRhcHRlckluZm8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERldmljZS0+UGh5SWQgPSBwQWRhcHRlckluZm8tPlBoeUlkOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPkVuYWJsZVRiaSA9IHBBZGFwdGVySW5mby0+U2VyZGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoRWVTaWdGb3VuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5QaHlJZCA9IEVlUGh5SWQ7CisgICAgICAgICAgICAgICAgcERldmljZS0+RW5hYmxlVGJpID0gRWVQaHlUeXBlU2VyZGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogQmFpbCBvdXQgaWYgd2UgZG9uJ3Qga25vdyB0aGUgY29wcGVyIFBIWSBpZC4gKi8KKyAgICBpZihVTktOT1dOX1BIWV9JRChwRGV2aWNlLT5QaHlJZCkgJiYgIXBEZXZpY2UtPkVuYWJsZVRiaSkKKyAgICB7CisgICAgICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDMpCisgICAgeworICAgICAgICBpZigocERldmljZS0+U2F2ZWRDYWNoZUxpbmVSZWcgJiAweGZmMDApIDwgMHg0MDAwKQorICAgICAgICB7CisgICAgICAgICAgICBwRGV2aWNlLT5TYXZlZENhY2hlTGluZVJlZyAmPSAweGZmZmYwMGZmOworICAgICAgICAgICAgcERldmljZS0+U2F2ZWRDYWNoZUxpbmVSZWcgfD0gMHg0MDAwOworICAgICAgICB9CisgICAgfQorICAgIC8qIENoYW5nZSBkcml2ZXIgcGFyYW1ldGVycy4gKi8KKyAgICBTdGF0dXMgPSBNTV9HZXRDb25maWcocERldmljZSk7CisgICAgaWYoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czsKKyAgICB9CisKKyNpZiBJTkNMVURFXzU3MDFfQVhfRklYCisgICAgaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTAgfHwKKyAgICAgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCkKKyAgICB7CisgICAgICAgIHBEZXZpY2UtPlJlc2V0UGh5T25Jbml0ID0gVFJVRTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgcGh5IGxpbmsgc3RhdHVzLiAqLworICAgIGlmKCFwRGV2aWNlLT5FbmFibGVUYmkpCisgICAgeworICAgICAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisgICAgICAgIExNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKworICAgICAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGxpbmsgcmVzZXQgdGhlIFBIWS4gKi8KKyAgICAgICAgaWYoIShWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpIHx8IHBEZXZpY2UtPlJlc2V0UGh5T25Jbml0KQorICAgICAgICB7CisKKyAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgUEhZX0NUUkxfUEhZX1JFU0VUKTsKKworICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgMTAwOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisKKyAgICAgICAgICAgICAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgJlZhbHVlMzIpOworICAgICAgICAgICAgICAgIGlmKFZhbHVlMzIgJiYgIShWYWx1ZTMyICYgUEhZX0NUUkxfUEhZX1JFU0VUKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1NX1dhaXQoNDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworI2lmIElOQ0xVREVfNTcwMV9BWF9GSVgKKyAgICAgICAgICAgIC8qIDU3MDFfQVhfQlggYnVnOiAgb25seSBhZHZlcnRpc2VzIDEwbWIgc3BlZWQuICovCisgICAgICAgICAgICBpZihwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0EwIHx8CisgICAgICAgICAgICAgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIFZhbHVlMzIgPSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRCB8CisgICAgICAgICAgICAgICAgICAgIFBIWV9BTl9BRF8xMEJBU0VUX0hBTEYgfCBQSFlfQU5fQURfMTBCQVNFVF9GVUxMIHwKKyAgICAgICAgICAgICAgICAgICAgUEhZX0FOX0FEXzEwMEJBU0VUWF9GVUxMIHwgUEhZX0FOX0FEXzEwMEJBU0VUWF9IQUxGOworICAgICAgICAgICAgICAgIFZhbHVlMzIgfD0gR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyhwRGV2aWNlKTsKKyAgICAgICAgICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBQSFlfQU5fQURfUkVHLCBWYWx1ZTMyKTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7CisKKyAgICAgICAgICAgICAgICBWYWx1ZTMyID0gQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfSEFMRiB8CisgICAgICAgICAgICAgICAgICAgIEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0ZVTEwgfCBCQ001NDBYX0NPTkZJR19BU19NQVNURVIgfAorICAgICAgICAgICAgICAgICAgICBCQ001NDBYX0VOQUJMRV9DT05GSUdfQVNfTUFTVEVSOworICAgICAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfMTAwMEJBU0VUX0NUUkxfUkVHLCBWYWx1ZTMyKTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSBWYWx1ZTMyOworCisgICAgICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgUEhZX0NUUkxfUkVHLCBQSFlfQ1RSTF9BVVRPX05FR19FTkFCTEUgfAorICAgICAgICAgICAgICAgICAgICBQSFlfQ1RSTF9SRVNUQVJUX0FVVE9fTkVHKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTgsIDB4MGMwMCk7CisgICAgICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgMHgxNywgMHgyMDFmKTsKKyAgICAgICAgICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDE1LCAweDJhYWEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDFjLCAweDhkNjgpOworICAgICAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MWMsIDB4OGQ2OCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBFbmFibGUgRXRoZXJuZXRAV2lyZVNwZWVkLiAqLworICAgICAgICAgICAgaWYocERldmljZS0+RW5hYmxlV2lyZVNwZWVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTgsIDB4NzAwNyk7CisgICAgICAgICAgICAgICAgTE1fUmVhZFBoeShwRGV2aWNlLCAweDE4LCAmVmFsdWUzMik7CisgICAgICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgMHgxOCwgVmFsdWUzMiB8IEJJVF8xNSB8IEJJVF80KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFR1cm4gb2ZmIHRhcCBwb3dlciBtYW5hZ2VtZW50LiAqLworICAgIGlmKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTQwMV9QSFlfSUQpCisgICAgeworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDAxX0FVWF9DVFJMLCAweDBjMjApOworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHgwMDEyKTsKKyAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgxODA0KTsKKyAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMyk7CisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MTIwNCk7CisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDgwMDYpOworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDAxMzIpOworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHg4MDA2KTsKKyAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgwMjMyKTsKKyAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MjAxZik7CisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MGEyMCk7CisKKyAgICAgICAgTU1fV2FpdCg0MCk7CisgICAgfQorCisjaWYgSU5DTFVERV9UQklfU1VQUE9SVAorICAgIHBEZXZpY2UtPklnbm9yZVRiaUxpbmtDaGFuZ2UgPSBGQUxTRTsKKworICAgIGlmKHBEZXZpY2UtPkVuYWJsZVRiaSkKKyAgICB7CisgICAgICAgIHBEZXZpY2UtPldha2VVcE1vZGVDYXAgPSBMTV9XQUtFX1VQX01PREVfTk9ORTsKKyAgICAgICAgcERldmljZS0+UGh5SW50TW9kZSA9IFQzX1BIWV9JTlRfTU9ERV9MSU5LX1JFQURZOworICAgICAgICBpZiAoKHBEZXZpY2UtPlBvbGxUYmlMaW5rID09IEJBRF9ERUZBVUxUX1ZBTFVFKSB8fAorICAgICAgICAgICAgcERldmljZS0+RGlzYWJsZUF1dG9OZWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEZXZpY2UtPlBvbGxUYmlMaW5rID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcERldmljZS0+UG9sbFRiaUxpbmsgPSBGQUxTRTsKKyAgICB9CisjZW5kaWYgLyogSU5DTFVERV9UQklfU1VQUE9SVCAqLworCisgICAgLyogVXNlVGFnZ2VkU3RhdHVzIGlzIG9ubHkgdmFsaWQgZm9yIDU3MDEgYW5kIGxhdGVyLiAqLworICAgIGlmIChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCisgICAgeworICAgICAgICBwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMgPSBGQUxTRTsKKworICAgICAgICBwRGV2aWNlLT5Db2FsZXNjZU1vZGUgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRGV2aWNlLT5Db2FsZXNjZU1vZGUgPSBIT1NUX0NPQUxFU0NFX0NMRUFSX1RJQ0tTX09OX1JYX0JEX0VWRU5UIHwKKyAgICAgICAgICAgIEhPU1RfQ09BTEVTQ0VfQ0xFQVJfVElDS1NfT05fVFhfQkRfRVZFTlQ7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBzdGF0dXMgYmxvY2sgc2l6ZS4gKi8KKyAgICBpZihUM19DSElQX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0NISVBfUkVWXzU3MDBfQVggJiYKKyAgICAgICAgVDNfQ0hJUF9SRVYocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19DSElQX1JFVl81NzAwX0JYKQorICAgIHsKKyAgICAgICAgcERldmljZS0+Q29hbGVzY2VNb2RlIHw9IEhPU1RfQ09BTEVTQ0VfMzJfQllURV9TVEFUVVNfTU9ERTsKKyAgICB9CisKKyAgICAvKiBDaGVjayB0aGUgRFVSSU5HX0lOVCBjb2FsZXNjaW5nIHRpY2tzIHBhcmFtZXRlcnMuICovCisgICAgaWYocERldmljZS0+VXNlVGFnZ2VkU3RhdHVzKQorICAgIHsKKyAgICAgICAgaWYocERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPT0gQkFEX0RFRkFVTFRfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0KKyAgICAgICAgICAgICAgICBERUZBVUxUX1JYX0NPQUxFU0NJTkdfVElDS1NfRFVSSU5HX0lOVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgICBwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9CisgICAgICAgICAgICAgICAgREVGQVVMVF9UWF9DT0FMRVNDSU5HX1RJQ0tTX0RVUklOR19JTlQ7CisgICAgICAgIH0KKworICAgICAgICBpZihwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPQorICAgICAgICAgICAgICAgIERFRkFVTFRfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVNfRFVSSU5HX0lOVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgICBwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9CisgICAgICAgICAgICAgICAgREVGQVVMVF9UWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FU19EVVJJTkdfSU5UOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgICBwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZihwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYocERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPT0gQkFEX0RFRkFVTFRfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgICBwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCisgICAgaWYocERldmljZS0+UnhNdHUgPD0gKE1BWF9TVERfUkNWX0JVRkZFUl9TSVpFIC0gOCAvKiBDUkMgKi8pKQorICAgIHsKKyAgICAgICAgcERldmljZS0+UnhKdW1ib0Rlc2NDbnQgPSAwOworICAgICAgICBpZihwRGV2aWNlLT5SeE10dSA8PSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDKQorICAgICAgICB7CisgICAgICAgICAgICBwRGV2aWNlLT5SeE10dSA9IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcERldmljZS0+UnhKdW1ib0J1ZmZlclNpemUgPSAocERldmljZS0+UnhNdHUgKyA4IC8qIENSQyArIFZMQU4gKi8gKworICAgICAgICAgICAgQ09NTU9OX0NBQ0hFX0xJTkVfU0laRS0xKSAmIH5DT01NT05fQ0FDSEVfTElORV9NQVNLOworCisgICAgICAgIGlmKHBEZXZpY2UtPlJ4SnVtYm9CdWZmZXJTaXplID4gTUFYX0pVTUJPX1JDVl9CVUZGRVJfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgcERldmljZS0+UnhKdW1ib0J1ZmZlclNpemUgPSBERUZBVUxUX0pVTUJPX1JDVl9CVUZGRVJfU0laRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPlJ4TXR1ID0gcERldmljZS0+UnhKdW1ib0J1ZmZlclNpemUgLSA4IC8qIENSQyArIFZMQU4gKi87CisgICAgICAgIH0KKyAgICAgICAgcERldmljZS0+VHhNdHUgPSBwRGV2aWNlLT5SeE10dTsKKworICAgIH0KKyNlbHNlCisgICAgcERldmljZS0+UnhNdHUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDOworI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKworICAgIHBEZXZpY2UtPlJ4UGFja2V0RGVzY0NudCA9CisjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAorICAgICAgICBwRGV2aWNlLT5SeEp1bWJvRGVzY0NudCArCisjZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworICAgICAgICBwRGV2aWNlLT5SeFN0ZERlc2NDbnQ7CisKKyAgICBpZihwRGV2aWNlLT5UeE10dSA8IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkMpCisgICAgeworICAgICAgICBwRGV2aWNlLT5UeE10dSA9IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkM7CisgICAgfQorCisgICAgaWYocERldmljZS0+VHhNdHUgPiBNQVhfSlVNQk9fVFhfQlVGRkVSX1NJWkUpCisgICAgeworICAgICAgICBwRGV2aWNlLT5UeE10dSA9IE1BWF9KVU1CT19UWF9CVUZGRVJfU0laRTsKKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgdGhlIHByb3BlciB3YXlzIHRvIGdldCBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQuICovCisgICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUTykKKyAgICB7CisgICAgICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkKKyAgICAgICAgeworICAgICAgICAgICAgcERldmljZS0+UGh5SW50TW9kZSA9IFQzX1BIWV9JTlRfTU9ERV9NSV9JTlRFUlJVUFQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRGV2aWNlLT5QaHlJbnRNb2RlID0gVDNfUEhZX0lOVF9NT0RFX0xJTktfUkVBRFk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZihwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcpCisgICAgeworICAgICAgICAvKiBBdXRvLXBvbGxpbmcgZG9lcyBub3Qgd29yayBvbiA1NzAwX0FYIGFuZCA1NzAwX0JYLiAqLworICAgICAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEZXZpY2UtPlBoeUludE1vZGUgPSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRGV0ZXJtaW5lIHRoZSBtZXRob2QgdG8gZ2V0IGxpbmsgY2hhbmdlIHN0YXR1cy4gKi8KKyAgICBpZihwRGV2aWNlLT5MaW5rQ2huZ01vZGUgPT0gVDNfTElOS19DSE5HX01PREVfQVVUTykKKyAgICB7CisgICAgICAgIC8qIFRoZSBsaW5rIHN0YXR1cyBiaXQgaW4gdGhlIHN0YXR1cyBibG9jayBkb2VzIG5vdCB3b3JrIG9uIDU3MDBfQVggKi8KKyAgICAgICAgLyogYW5kIDU3MDBfQlggY2hpcHMuICovCisgICAgICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkKKyAgICAgICAgeworICAgICAgICAgICAgcERldmljZS0+TGlua0NobmdNb2RlID0gVDNfTElOS19DSE5HX01PREVfVVNFX1NUQVRVU19SRUc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRGV2aWNlLT5MaW5rQ2huZ01vZGUgPSBUM19MSU5LX0NITkdfTU9ERV9VU0VfU1RBVFVTX0JMT0NLOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUIHx8CisgICAgICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkKKyAgICB7CisgICAgICAgIHBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9IFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfUkVHOworICAgIH0KKworICAgIC8qIENvbmZpZ3VyZSBQSFkgbGVkIG1vZGUuICovCisgICAgaWYocERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9BVVRPKQorICAgIHsKKyAgICAgICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisgICAgICAgICAgICBUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBEZXZpY2UtPlN1YnN5c3RlbVZlbmRvcklkID09IFQzX1NWSURfREVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5MZWRNb2RlID0gTEVEX01PREVfTElOSzEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEZXZpY2UtPkxlZE1vZGUgPSBMRURfTU9ERV9USFJFRV9MSU5LOworCisgICAgICAgICAgICAgICAgaWYoRWVTaWdGb3VuZCAmJiBFZVBoeUxlZE1vZGUgIT0gTEVEX01PREVfQVVUTykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPkxlZE1vZGUgPSBFZVBoeUxlZE1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBidWc/IDU3MDEgaW4gTElOSzEwIG1vZGUgZG9lcyBub3Qgc2VlbSB0byB3b3JrIHdoZW4gKi8KKyAgICAgICAgICAgIC8qIFBoeUludE1vZGUgaXMgTElOS19SRUFEWS4gKi8KKyAgICAgICAgICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMCAmJgorI2lmIElOQ0xVREVfVEJJX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5FbmFibGVUYmkgPT0gRkFMU0UgJiYKKyNlbmRpZgorICAgICAgICAgICAgICAgIHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfTElOSzEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEZXZpY2UtPlBoeUludE1vZGUgPSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9IFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfUkVHOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihwRGV2aWNlLT5FbmFibGVUYmkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERldmljZS0+TGVkTW9kZSA9IExFRF9NT0RFX1RIUkVFX0xJTks7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihFZVNpZ0ZvdW5kICYmIEVlUGh5TGVkTW9kZSAhPSBMRURfTU9ERV9BVVRPKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEZXZpY2UtPkxlZE1vZGUgPSBFZVBoeUxlZE1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERldmljZS0+TGVkTW9kZSA9IExFRF9NT0RFX09QRU5fRFJBSU47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFbmFibGUgT25lRG1hQXRPbmNlLiAqLworICAgIGlmKHBEZXZpY2UtPk9uZURtYUF0T25jZSA9PSBCQURfREVGQVVMVF9WQUxVRSkKKyAgICB7CisgICAgICAgIHBEZXZpY2UtPk9uZURtYUF0T25jZSA9IEZBTFNFOworICAgIH0KKworICAgIGlmIChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKyAgICAgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAorICAgICAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0IwIHx8CisgICAgICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjIpCisgICAgeworICAgICAgICBwRGV2aWNlLT5Xb2xTcGVlZCA9IFdPTF9TUEVFRF8xME1COworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRGV2aWNlLT5Xb2xTcGVlZCA9IFdPTF9TUEVFRF8xMDBNQjsKKyAgICB9CisKKyAgICAvKiBPZmZsb2FkaW5ncy4gKi8KKyAgICBwRGV2aWNlLT5UYXNrVG9PZmZsb2FkID0gTE1fVEFTS19PRkZMT0FEX05PTkU7CisKKyAgICAvKiBUdXJuIG9mZiB0YXNrIG9mZmxvYWRpbmcgb24gQXguICovCisgICAgaWYocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMF9CMCkKKyAgICB7CisgICAgICAgIHBEZXZpY2UtPlRhc2tPZmZsb2FkQ2FwICY9IH4oTE1fVEFTS19PRkZMT0FEX1RYX1RDUF9DSEVDS1NVTSB8CisgICAgICAgICAgICBMTV9UQVNLX09GRkxPQURfVFhfVURQX0NIRUNLU1VNKTsKKyAgICB9CisgICAgcERldmljZS0+UGNpU3RhdGUgPSBSRUdfUkQocERldmljZSwgUGNpQ2ZnLlBjaVN0YXRlKTsKKyAgICBMTV9SZWFkVlBEKHBEZXZpY2UpOworICAgIExNX1JlYWRCb290Q29kZVZlcnNpb24ocERldmljZSk7CisgICAgTE1fR2V0QnVzU3BlZWQocERldmljZSk7CisKKyAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIExNX0dldEFkYXB0ZXJJbmZvICovCisKK1NUQVRJQyBQTE1fQURBUFRFUl9JTkZPCitMTV9HZXRBZGFwdGVySW5mb0J5U3NpZCgKKyAgICBMTV9VSU5UMTYgU3ZpZCwKKyAgICBMTV9VSU5UMTYgU3NpZCkKK3sKKyAgICBzdGF0aWMgTE1fQURBUFRFUl9JTkZPIEFkYXB0ZXJBcnJbXSA9CisgICAgeworICAgICAgICB7IFQzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDBBNiwgUEhZX0JDTTU0MDFfUEhZX0lELCAwfSwKKyAgICAgICAgeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxQTUsIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCisgICAgICAgIHsgVDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMFQ2LCBQSFlfQkNNODAwMl9QSFlfSUQsIDF9LAorICAgICAgICB7IFQzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDBBOSwgMCwgMSB9LAorICAgICAgICB7IFQzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFUMSwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKKyAgICAgICAgeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxVDgsIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCisgICAgICAgIHsgVDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUE3LCAwLCAxfSwKKyAgICAgICAgeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxQTEwLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorICAgICAgICB7IFQzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFBMTIsIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCisgICAgICAgIHsgVDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwM0F4MSwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKKyAgICAgICAgeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAzQXgyLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorCisgICAgICAgIHsgVDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0M5OTZULCBQSFlfQkNNNTQwMV9QSFlfSUQsIDAgfSwKKyAgICAgICAgeyBUM19TVklEXzNDT00sIFQzX1NTSURfM0NPTV8zQzk5NkJULCBQSFlfQkNNNTcwMV9QSFlfSUQsIDAgfSwKKyAgICAgICAgeyBUM19TVklEXzNDT00sIFQzX1NTSURfM0NPTV8zQzk5NlNYLCAwLCAxIH0sCisgICAgICAgIHsgVDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0MxMDAwVCwgUEhZX0JDTTU3MDFfUEhZX0lELCAwIH0sCisgICAgICAgIHsgVDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0M5NDBCUjAxLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDAgfSwKKworICAgICAgICB7IFQzX1NWSURfREVMTCwgVDNfU1NJRF9ERUxMX1ZJUEVSLCBQSFlfQkNNNTQwMV9QSFlfSUQsIDAgfSwKKyAgICAgICAgeyBUM19TVklEX0RFTEwsIFQzX1NTSURfREVMTF9KQUdVQVIsIFBIWV9CQ001NDAxX1BIWV9JRCwgMCB9LAorICAgICAgICB7IFQzX1NWSURfREVMTCwgVDNfU1NJRF9ERUxMX01FUkxPVCwgUEhZX0JDTTU0MTFfUEhZX0lELCAwIH0sCisgICAgICAgIHsgVDNfU1ZJRF9ERUxMLCBUM19TU0lEX0RFTExfU0xJTV9NRVJMT1QsIFBIWV9CQ001NDExX1BIWV9JRCwgMCB9LAorCisgICAgICAgIHsgVDNfU1ZJRF9DT01QQVEsIFQzX1NTSURfQ09NUEFRX0JBTlNIRUUsIFBIWV9CQ001NzAxX1BIWV9JRCwgMCB9LAorICAgICAgICB7IFQzX1NWSURfQ09NUEFRLCBUM19TU0lEX0NPTVBBUV9CQU5TSEVFXzIsIFBIWV9CQ001NzAxX1BIWV9JRCwgMCB9LAorICAgICAgICB7IFQzX1NWSURfQ09NUEFRLCBUM19TU0lEX0NPTVBBUV9DSEFOR0VMSU5HLCAwLCAxIH0sCisgICAgICAgIHsgVDNfU1ZJRF9DT01QQVEsIFQzX1NTSURfQ09NUEFRX05DNzc4MCwgUEhZX0JDTTU3MDFfUEhZX0lELCAwIH0sCisgICAgICAgIHsgVDNfU1ZJRF9DT01QQVEsIFQzX1NTSURfQ09NUEFRX05DNzc4MF8yLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDAgfSwKKworICAgIH07CisgICAgTE1fVUlOVDMyIGo7CisKKyAgICBmb3IoaiA9IDA7IGogPCBzaXplb2YoQWRhcHRlckFycikvc2l6ZW9mKExNX0FEQVBURVJfSU5GTyk7IGorKykKKyAgICB7CisgICAgICAgIGlmKEFkYXB0ZXJBcnJbal0uU3ZpZCA9PSBTdmlkICYmIEFkYXB0ZXJBcnJbal0uU3NpZCA9PSBTc2lkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gJkFkYXB0ZXJBcnJbal07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgcm91dGluZSBzZXRzIHVwIHJlY2VpdmUvdHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0aW9ucyBxdWV1ZXMuICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTCitMTV9Jbml0aWFsaXplQWRhcHRlcigKK1BMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKyAgICBMTV9QSFlTSUNBTF9BRERSRVNTIE1lbVBoeTsKKyAgICBQTE1fVUlOVDggcE1lbVZpcnQ7CisgICAgUExNX1BBQ0tFVCBwUGFja2V0OworICAgIExNX1NUQVRVUyBTdGF0dXM7CisgICAgTE1fVUlOVDMyIFNpemU7CisgICAgTE1fVUlOVDMyIGo7CisKKyAgICAvKiBTZXQgcG93ZXIgc3RhdGUgdG8gRDAuICovCisgICAgTE1fU2V0UG93ZXJTdGF0ZShwRGV2aWNlLCBMTV9QT1dFUl9TVEFURV9EMCk7CisKKyAgICAvKiBJbnRpYWxpemUgdGhlIHF1ZXVlcy4gKi8KKyAgICBRUV9Jbml0UXVldWUoJnBEZXZpY2UtPlJ4UGFja2V0UmVjZWl2ZWRRLkNvbnRhaW5lciwKKyAgICAgICAgTUFYX1JYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKKyAgICBRUV9Jbml0UXVldWUoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLAorICAgICAgICBNQVhfUlhfUEFDS0VUX0RFU0NfQ09VTlQpOworCisgICAgUVFfSW5pdFF1ZXVlKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lcixNQVhfVFhfUEFDS0VUX0RFU0NfQ09VTlQpOworICAgIFFRX0luaXRRdWV1ZSgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lcixNQVhfVFhfUEFDS0VUX0RFU0NfQ09VTlQpOworICAgIFFRX0luaXRRdWV1ZSgmcERldmljZS0+VHhQYWNrZXRYbWl0dGVkUS5Db250YWluZXIsTUFYX1RYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKKworICAgIC8qIEFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgZm9yOiBzdGF0dXMgYmxvY2ssIHRoZSBidWZmZXJzIGZvciByZWNlaXZlICovCisgICAgLyogcmluZ3MgLS0gc3RhbmRhcmQsIG1pbmksIGp1bWJvLCBhbmQgcmV0dXJuIHJpbmdzLiAqLworICAgIFNpemUgPSBUM19TVEFUVVNfQkxPQ0tfU0laRSArIHNpemVvZihUM19TVEFUU19CTE9DSykgKworICAgICAgICBUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZihUM19SQ1ZfQkQpICsKKyNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCisgICAgICAgIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YoVDNfUkNWX0JEKSArCisjZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworICAgICAgICBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZihUM19SQ1ZfQkQpOworCisgICAgLyogTWVtb3J5IGZvciBob3N0IGJhc2VkIFNlbmQgQkQuICovCisgICAgaWYocERldmljZS0+TmljU2VuZEJkID09IEZBTFNFKQorICAgIHsKKyAgICAgICAgU2l6ZSArPSBzaXplb2YoVDNfU05EX0JEKSAqIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgYmxvY2suICovCisgICAgU3RhdHVzID0gTU1fQWxsb2NhdGVTaGFyZWRNZW1vcnkocERldmljZSwgU2l6ZSwgKFBMTV9WT0lEKSAmcE1lbVZpcnQsICZNZW1QaHksIEZBTFNFKTsKKyAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gU3RhdHVzOworICAgIH0KKworICAgIC8qIFByb2dyYW0gRE1BIFJlYWQvV3JpdGUgKi8KKyAgICBpZiAocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfTk9UX1BDSV9YX0JVUykKKyAgICB7CisgICAgICAgIHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgPSAweDc2M2YwMDBmOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgPSAweDc2MWYwMDAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCA9IDB4NzYxYjAwMGY7CisgICAgICAgIH0KKyAgICAgICAgaWYocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwM19BMSB8fAorICAgICAgICAgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwM19BMikKKyAgICAgICAgeworICAgICAgICAgICAgcERldmljZS0+T25lRG1hQXRPbmNlID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDMpCisgICAgeworICAgICAgICBwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsICY9IDB4ZmZmZmZmZjA7CisgICAgfQorCisgICAgaWYocERldmljZS0+T25lRG1hQXRPbmNlKQorICAgIHsKKyAgICAgICAgcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCB8PSBETUFfQ1RSTF9XUklURV9PTkVfRE1BX0FUX09OQ0U7CisgICAgfQorICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuRG1hUmVhZFdyaXRlQ3RybCwgcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCk7CisKKyAgICBpZiAoTE1fRG1hVGVzdChwRGV2aWNlLCBwTWVtVmlydCwgTWVtUGh5LCAweDQwMCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgLyogU3RhdHVzIGJsb2NrLiAqLworICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0ID0gKFBUM19TVEFUVVNfQkxPQ0spIHBNZW1WaXJ0OworICAgIHBEZXZpY2UtPlN0YXR1c0Jsa1BoeSA9IE1lbVBoeTsKKyAgICBwTWVtVmlydCArPSBUM19TVEFUVVNfQkxPQ0tfU0laRTsKKyAgICBMTV9JTkNfUEhZU0lDQUxfQUREUkVTUygmTWVtUGh5LCBUM19TVEFUVVNfQkxPQ0tfU0laRSk7CisKKyAgICAvKiBTdGF0aXN0aWNzIGJsb2NrLiAqLworICAgIHBEZXZpY2UtPnBTdGF0c0Jsa1ZpcnQgPSAoUFQzX1NUQVRTX0JMT0NLKSBwTWVtVmlydDsKKyAgICBwRGV2aWNlLT5TdGF0c0Jsa1BoeSA9IE1lbVBoeTsKKyAgICBwTWVtVmlydCArPSBzaXplb2YoVDNfU1RBVFNfQkxPQ0spOworICAgIExNX0lOQ19QSFlTSUNBTF9BRERSRVNTKCZNZW1QaHksIHNpemVvZihUM19TVEFUU19CTE9DSykpOworCisgICAgLyogUmVjZWl2ZSBzdGFuZGFyZCBCRCBidWZmZXIuICovCisgICAgcERldmljZS0+cFJ4U3RkQmRWaXJ0ID0gKFBUM19SQ1ZfQkQpIHBNZW1WaXJ0OworICAgIHBEZXZpY2UtPlJ4U3RkQmRQaHkgPSBNZW1QaHk7CisKKyAgICBwTWVtVmlydCArPSBUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZihUM19SQ1ZfQkQpOworICAgIExNX0lOQ19QSFlTSUNBTF9BRERSRVNTKCZNZW1QaHksCisgICAgICAgIFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UICogc2l6ZW9mKFQzX1JDVl9CRCkpOworCisjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAorICAgIC8qIFJlY2VpdmUganVtYm8gQkQgYnVmZmVyLiAqLworICAgIHBEZXZpY2UtPnBSeEp1bWJvQmRWaXJ0ID0gKFBUM19SQ1ZfQkQpIHBNZW1WaXJ0OworICAgIHBEZXZpY2UtPlJ4SnVtYm9CZFBoeSA9IE1lbVBoeTsKKworICAgIHBNZW1WaXJ0ICs9IFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YoVDNfUkNWX0JEKTsKKyAgICBMTV9JTkNfUEhZU0lDQUxfQUREUkVTUygmTWVtUGh5LAorICAgICAgICBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICogc2l6ZW9mKFQzX1JDVl9CRCkpOworI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKworICAgIC8qIFJlY2VpdmUgcmV0dXJuIEJEIGJ1ZmZlci4gKi8KKyAgICBwRGV2aWNlLT5wUmN2UmV0QmRWaXJ0ID0gKFBUM19SQ1ZfQkQpIHBNZW1WaXJ0OworICAgIHBEZXZpY2UtPlJjdlJldEJkUGh5ID0gTWVtUGh5OworCisgICAgcE1lbVZpcnQgKz0gVDNfUkNWX1JFVFVSTl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YoVDNfUkNWX0JEKTsKKyAgICBMTV9JTkNfUEhZU0lDQUxfQUREUkVTUygmTWVtUGh5LAorICAgICAgICBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZihUM19SQ1ZfQkQpKTsKKworICAgIC8qIFNldCB1cCBTZW5kIEJELiAqLworICAgIGlmKHBEZXZpY2UtPk5pY1NlbmRCZCA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIHBEZXZpY2UtPnBTZW5kQmRWaXJ0ID0gKFBUM19TTkRfQkQpIHBNZW1WaXJ0OworICAgICAgICBwRGV2aWNlLT5TZW5kQmRQaHkgPSBNZW1QaHk7CisKKyAgICAgICAgcE1lbVZpcnQgKz0gc2l6ZW9mKFQzX1NORF9CRCkgKiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVDsKKyAgICAgICAgTE1fSU5DX1BIWVNJQ0FMX0FERFJFU1MoJk1lbVBoeSwKKyAgICAgICAgICAgIHNpemVvZihUM19TTkRfQkQpICogVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRGV2aWNlLT5wU2VuZEJkVmlydCA9IChQVDNfU05EX0JEKQorICAgICAgICAgICAgcERldmljZS0+cE1lbVZpZXctPnVJbnRNZW0uRmlyc3QzMmsuQnVmZmVyRGVzYzsKKyAgICAgICAgcERldmljZS0+U2VuZEJkUGh5LkhpZ2ggPSAwOworICAgICAgICBwRGV2aWNlLT5TZW5kQmRQaHkuTG93ID0gVDNfTklDX1NORF9CVUZGRVJfREVTQ19BRERSOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgcGFja2V0IGRlc2NyaXB0b3JzLiAqLworICAgIFNpemUgPSAocERldmljZS0+UnhQYWNrZXREZXNjQ250ICsKKyAgICAgICAgcERldmljZS0+VHhQYWNrZXREZXNjQ250KSAqIE1NX1BBQ0tFVF9ERVNDX1NJWkU7CisgICAgU3RhdHVzID0gTU1fQWxsb2NhdGVNZW1vcnkocERldmljZSwgU2l6ZSwgKFBMTV9WT0lEICopICZwUGFja2V0KTsKKyAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gU3RhdHVzOworICAgIH0KKyAgICBwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UgPSAoUExNX1ZPSUQpIHBQYWNrZXQ7CisKKyAgICAvKiBDcmVhdGUgdHJhbnNtaXQgcGFja2V0IGRlc2NyaXB0b3JzIGZyb20gdGhlIG1lbW9yeSBibG9jayBhbmQgYWRkIHRoZW0gKi8KKyAgICAvKiB0byB0aGUgVHhQYWNrZXRGcmVlUSBmb3IgZWFjaCBzZW5kIHJpbmcuICovCisgICAgZm9yKGogPSAwOyBqIDwgcERldmljZS0+VHhQYWNrZXREZXNjQ250OyBqKyspCisgICAgeworICAgICAgICAvKiBSaW5nIGluZGV4LiAqLworICAgICAgICBwUGFja2V0LT5GbGFncyA9IDA7CisKKyAgICAgICAgLyogUXVldWUgdGhlIGRlc2NyaXB0b3IgaW4gdGhlIFR4UGFja2V0RnJlZVEgb2YgdGhlICdrJyByaW5nLiAqLworICAgICAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCisgICAgICAgIC8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yLiAgTU1fUEFDS0VUX0RFU0NfU0laRSAqLworICAgICAgICAvKiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW5jbHVkaW5nIHRoZSAqLworICAgICAgICAvKiBvcy1zcGVjaWZpYyBleHRlbnNpb25zIGluIHRoZSBVTV9QQUNLRVQgc3RydWN0dXJlLiAqLworICAgICAgICBwUGFja2V0ID0gKFBMTV9QQUNLRVQpICgoUExNX1VJTlQ4KSBwUGFja2V0ICsgTU1fUEFDS0VUX0RFU0NfU0laRSk7CisgICAgfSAvKiBmb3Ioai4uICovCisKKyAgICAvKiBDcmVhdGUgcmVjZWl2ZSBwYWNrZXQgZGVzY3JpcHRvcnMgZnJvbSB0aGUgbWVtb3J5IGJsb2NrIGFuZCBhZGQgdGhlbSAqLworICAgIC8qIHRvIHRoZSBSeFBhY2tldEZyZWVRLiAgQ3JlYXRlIHRoZSBTdGFuZGFyZCBwYWNrZXQgZGVzY3JpcHRvcnMuICovCisgICAgZm9yKGogPSAwOyBqIDwgcERldmljZS0+UnhTdGREZXNjQ250OyBqKyspCisgICAgeworICAgICAgICAvKiBSZWNlaXZlIHByb2R1Y2VyIHJpbmcuICovCisgICAgICAgIHBQYWNrZXQtPnUuUnguUmN2UHJvZFJpbmcgPSBUM19TVERfUkNWX1BST0RfUklORzsKKworICAgICAgICAvKiBSZWNlaXZlIGJ1ZmZlciBzaXplLiAqLworICAgICAgICBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyU2l6ZSA9IE1BWF9TVERfUkNWX0JVRkZFUl9TSVpFOworCisgICAgICAgIC8qIEFkZCB0aGUgZGVzY3JpcHRvciB0byBSeFBhY2tldEZyZWVRLiAqLworICAgICAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCisgICAgICAgIC8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yLiAgTU1fUEFDS0VUX0RFU0NfU0laRSAqLworICAgICAgICAvKiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW5jbHVkaW5nIHRoZSAqLworICAgICAgICAvKiBvcy1zcGVjaWZpYyBleHRlbnNpb25zIGluIHRoZSBVTV9QQUNLRVQgc3RydWN0dXJlLiAqLworICAgICAgICBwUGFja2V0ID0gKFBMTV9QQUNLRVQpICgoUExNX1VJTlQ4KSBwUGFja2V0ICsgTU1fUEFDS0VUX0RFU0NfU0laRSk7CisgICAgfSAvKiBmb3IgKi8KKworI2lmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQKKyAgICAvKiBDcmVhdGUgdGhlIEp1bWJvIHBhY2tldCBkZXNjcmlwdG9ycy4gKi8KKyAgICBmb3IoaiA9IDA7IGogPCBwRGV2aWNlLT5SeEp1bWJvRGVzY0NudDsgaisrKQorICAgIHsKKyAgICAgICAgLyogUmVjZWl2ZSBwcm9kdWNlciByaW5nLiAqLworICAgICAgICBwUGFja2V0LT51LlJ4LlJjdlByb2RSaW5nID0gVDNfSlVNQk9fUkNWX1BST0RfUklORzsKKworICAgICAgICAvKiBSZWNlaXZlIGJ1ZmZlciBzaXplLiAqLworICAgICAgICBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyU2l6ZSA9IHBEZXZpY2UtPlJ4SnVtYm9CdWZmZXJTaXplOworCisgICAgICAgIC8qIEFkZCB0aGUgZGVzY3JpcHRvciB0byBSeFBhY2tldEZyZWVRLiAqLworICAgICAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCisgICAgICAgIC8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yLiAgTU1fUEFDS0VUX0RFU0NfU0laRSAqLworICAgICAgICAvKiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW5jbHVkaW5nIHRoZSAqLworICAgICAgICAvKiBvcy1zcGVjaWZpYyBleHRlbnNpb25zIGluIHRoZSBVTV9QQUNLRVQgc3RydWN0dXJlLiAqLworICAgICAgICBwUGFja2V0ID0gKFBMTV9QQUNLRVQpICgoUExNX1VJTlQ4KSBwUGFja2V0ICsgTU1fUEFDS0VUX0RFU0NfU0laRSk7CisgICAgfSAvKiBmb3IgKi8KKyNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSBwYWNrZXQgZGVzY3JpcHRvcnMuICovCisgICAgU3RhdHVzID0gTU1fSW5pdGlhbGl6ZVVtUGFja2V0cyhwRGV2aWNlKTsKKyAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gU3RhdHVzOworICAgIH0gLyogaWYgKi8KKworICAgIC8qIERlZmF1bHQgcmVjZWl2ZSBtYXNrLiAqLworICAgIHBEZXZpY2UtPlJlY2VpdmVNYXNrID0gTE1fQUNDRVBUX01VTFRJQ0FTVCB8IExNX0FDQ0VQVF9CUk9BRENBU1QgfAorICAgICAgICBMTV9BQ0NFUFRfVU5JQ0FTVDsKKworICAgIC8qIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gdGhlIGZpcnN0IDMyayBtZW1vcnkgd2luZG93IG9yIE5pY1NlbmRCZC4gKi8KKyAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLk1lbVdpbmRvd0Jhc2VBZGRyLCAwKTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlLiAqLworICAgIFN0YXR1cyA9IExNX1Jlc2V0QWRhcHRlcihwRGV2aWNlKTsKKyAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gU3RhdHVzOworICAgIH0KKworICAgIC8qIFdlIGFyZSBkb25lIHdpdGggaW5pdGlhbGl6YXRpb24uICovCisgICAgcERldmljZS0+SW5pdERvbmUgPSBUUlVFOworCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfSAvKiBMTV9Jbml0aWFsaXplQWRhcHRlciAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIEVuYWJsZXMvRGlzYWJsZXMgYSBnaXZlbiBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTCitMTV9DbnRybEJsb2NrKAorUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorTE1fVUlOVDMyIG1hc2ssTE1fVUlOVDMyIGNudHJsKQoreworICAgIExNX1VJTlQzMiBqLGksZGF0YTsKKyAgICBMTV9VSU5UMzIgTWF4V2FpdENudDsKKworICAgIE1heFdhaXRDbnQgPSAyOworICAgIGogPSAwOworCisgICAgZm9yKGkgPSAwIDsgaSA8IDMyOyBpKyspCisgICAgeworICAgICAgICBpZighKG1hc2sgJiAoMSA8PCBpKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzd2l0Y2ggKDEgPDwgaSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUM19CTE9DS19ETUFfUkQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IFJFR19SRChwRGV2aWNlLCBEbWFSZWFkLk1vZGUpOworICAgICAgICAgICAgICAgIGlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSAmPSB+RE1BX1JFQURfTU9ERV9FTkFCTEU7CisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBEbWFSZWFkLk1vZGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoUkVHX1JEKHBEZXZpY2UsIERtYVJlYWQuTW9kZSkgJiBETUFfUkVBRF9NT0RFX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBEbWFSZWFkLk1vZGUsIGRhdGEgfCBETUFfUkVBRF9NT0RFX0VOQUJMRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVDNfQkxPQ0tfRE1BX0NPTVA6CisgICAgICAgICAgICAgICAgZGF0YSA9IFJFR19SRChwRGV2aWNlLERtYUNvbXAuTW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKGNudHJsID09IExNX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhICY9IH5ETUFfQ09NUF9NT0RFX0VOQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIERtYUNvbXAuTW9kZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShSRUdfUkQocERldmljZSwgRG1hQ29tcC5Nb2RlKSAmIERNQV9DT01QX01PREVfRU5BQkxFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1NX1dhaXQoMTApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIERtYUNvbXAuTW9kZSwgZGF0YSB8IERNQV9DT01QX01PREVfRU5BQkxFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUM19CTE9DS19SWF9CRF9JTklUSUFUT1I6CisgICAgICAgICAgICAgICAgZGF0YSA9IFJFR19SRChwRGV2aWNlLCBSY3ZCZEluLk1vZGUpOworICAgICAgICAgICAgICAgIGlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSAmPSB+UkNWX0JEX0lOX01PREVfRU5BQkxFOworICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgUmN2QmRJbi5Nb2RlLGRhdGEpOworICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoUkVHX1JEKHBEZXZpY2UsIFJjdkJkSW4uTW9kZSkgJiBSQ1ZfQkRfSU5fTU9ERV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgUmN2QmRJbi5Nb2RlLGRhdGEgfCBSQ1ZfQkRfSU5fTU9ERV9FTkFCTEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFQzX0JMT0NLX1JYX0JEX0NPTVA6CisgICAgICAgICAgICAgICAgZGF0YSA9IFJFR19SRChwRGV2aWNlLCBSY3ZCZENvbXAuTW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKGNudHJsID09IExNX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhICY9IH5SQ1ZfQkRfQ09NUF9NT0RFX0VOQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkJkQ29tcC5Nb2RlLGRhdGEpOworICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoUkVHX1JEKHBEZXZpY2UsIFJjdkJkQ29tcC5Nb2RlKSAmIFJDVl9CRF9DT01QX01PREVfRU5BQkxFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1NX1dhaXQoMTApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkJkQ29tcC5Nb2RlLGRhdGEgfCBSQ1ZfQkRfQ09NUF9NT0RFX0VOQUJMRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVDNfQkxPQ0tfRE1BX1dSOgorICAgICAgICAgICAgICAgIGRhdGEgPSBSRUdfUkQocERldmljZSwgRG1hV3JpdGUuTW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKGNudHJsID09IExNX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhICY9IH5ETUFfV1JJVEVfTU9ERV9FTkFCTEU7CisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBEbWFXcml0ZS5Nb2RlLGRhdGEpOworCisgICAgICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShSRUdfUkQocERldmljZSwgRG1hV3JpdGUuTW9kZSkgJiBETUFfV1JJVEVfTU9ERV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgRG1hV3JpdGUuTW9kZSxkYXRhIHwgRE1BX1dSSVRFX01PREVfRU5BQkxFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUM19CTE9DS19NU0lfSEFORExFUjoKKyAgICAgICAgICAgICAgICBkYXRhID0gUkVHX1JEKHBEZXZpY2UsIE1zaS5Nb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgJj0gfk1TSV9NT0RFX0VOQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1zaS5Nb2RlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighKFJFR19SRChwRGV2aWNlLCBNc2kuTW9kZSkgJiBNU0lfTU9ERV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgTXNpLk1vZGUsIGRhdGEgfE1TSV9NT0RFX0VOQUJMRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVDNfQkxPQ0tfUlhfTElTVF9QTE1UOgorICAgICAgICAgICAgICAgIGRhdGEgPSBSRUdfUkQocERldmljZSwgUmN2TGlzdFBsbXQuTW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKGNudHJsID09IExNX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhICY9IH5SQ1ZfTElTVF9QTE1UX01PREVfRU5BQkxFOworICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgUmN2TGlzdFBsbXQuTW9kZSxkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighKFJFR19SRChwRGV2aWNlLCBSY3ZMaXN0UGxtdC5Nb2RlKSAmIFJDVl9MSVNUX1BMTVRfTU9ERV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgUmN2TGlzdFBsbXQuTW9kZSxkYXRhIHwgUkNWX0xJU1RfUExNVF9NT0RFX0VOQUJMRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVDNfQkxPQ0tfUlhfTElTVF9TRUxFQ1RPUjoKKyAgICAgICAgICAgICAgICBkYXRhID0gUkVHX1JEKHBEZXZpY2UsIFJjdkxpc3RTZWwuTW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKGNudHJsID09IExNX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhICY9IH5SQ1ZfTElTVF9TRUxfTU9ERV9FTkFCTEU7CisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBSY3ZMaXN0U2VsLk1vZGUsZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShSRUdfUkQocERldmljZSwgUmN2TGlzdFNlbC5Nb2RlKSAmIFJDVl9MSVNUX1NFTF9NT0RFX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBSY3ZMaXN0U2VsLk1vZGUsZGF0YSB8UkNWX0xJU1RfU0VMX01PREVfRU5BQkxFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUM19CTE9DS19SWF9EQVRBX0lOSVRJQVRPUjoKKyAgICAgICAgICAgICAgICBkYXRhID0gUkVHX1JEKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUpOworICAgICAgICAgICAgICAgIGlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSAmPSB+UkNWX0RBVEFfQkRfSU5fTU9ERV9FTkFCTEU7CisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQmRJbi5Nb2RlLGRhdGEpOworICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoUkVHX1JEKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUpICYgUkNWX0RBVEFfQkRfSU5fTU9ERV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgUmN2RGF0YUJkSW4uTW9kZSwgZGF0YSB8IFJDVl9EQVRBX0JEX0lOX01PREVfRU5BQkxFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUM19CTE9DS19SWF9EQVRBX0NPTVA6CisgICAgICAgICAgICAgICAgZGF0YSA9IFJFR19SRChwRGV2aWNlLCBSY3ZEYXRhQ29tcC5Nb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgJj0gflJDVl9EQVRBX0NPTVBfTU9ERV9FTkFCTEU7CisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQ29tcC5Nb2RlLGRhdGEpOworICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoUkVHX1JEKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUpICYgUkNWX0RBVEFfQ09NUF9NT0RFX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQ29tcC5Nb2RlLGRhdGEgfCBSQ1ZfREFUQV9DT01QX01PREVfRU5BQkxFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUM19CTE9DS19IT1NUX0NPQUxFU0lORzoKKyAgICAgICAgICAgICAgICBkYXRhID0gUkVHX1JEKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgJj0gfkhPU1RfQ09BTEVTQ0VfRU5BQkxFOworICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLk1vZGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoUkVHX1JEKHBEZXZpY2UsIFNuZEJkSW4uTW9kZSkgJiBIT1NUX0NPQUxFU0NFX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuTW9kZSwgZGF0YSB8IEhPU1RfQ09BTEVTQ0VfRU5BQkxFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUM19CTE9DS19NQUNfUlhfRU5HSU5FOgorICAgICAgICAgICAgICAgIGlmKGNudHJsID09IExNX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5SeE1vZGUgJj0gflJYX01PREVfRU5BQkxFOworICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIHBEZXZpY2UtPlJ4TW9kZSk7CisgICAgICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShSRUdfUkQocERldmljZSwgTWFjQ3RybC5SeE1vZGUpICYgUlhfTU9ERV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcERldmljZS0+UnhNb2RlIHw9IFJYX01PREVfRU5BQkxFOworICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIHBEZXZpY2UtPlJ4TW9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFQzX0JMT0NLX01CVUZfQ0xVU1RFUl9GUkVFOgorICAgICAgICAgICAgICAgIGRhdGEgPSBSRUdfUkQocERldmljZSwgTWJ1ZkNsdXN0ZXJGcmVlLk1vZGUpOworICAgICAgICAgICAgICAgIGlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSAmPSB+TUJVRl9DTFVTVEVSX0ZSRUVfTU9ERV9FTkFCTEU7CisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYnVmQ2x1c3RlckZyZWUuTW9kZSxkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighKFJFR19SRChwRGV2aWNlLCBNYnVmQ2x1c3RlckZyZWUuTW9kZSkgJiBNQlVGX0NMVVNURVJfRlJFRV9NT0RFX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYnVmQ2x1c3RlckZyZWUuTW9kZSwgZGF0YSB8IE1CVUZfQ0xVU1RFUl9GUkVFX01PREVfRU5BQkxFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUM19CTE9DS19TRU5EX0JEX0lOSVRJQVRPUjoKKyAgICAgICAgICAgICAgICBkYXRhID0gUkVHX1JEKHBEZXZpY2UsIFNuZEJkSW4uTW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKGNudHJsID09IExNX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhICY9IH5TTkRfQkRfSU5fTU9ERV9FTkFCTEU7CisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZEluLk1vZGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoUkVHX1JEKHBEZXZpY2UsIFNuZEJkSW4uTW9kZSkgJiBTTkRfQkRfSU5fTU9ERV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgU25kQmRJbi5Nb2RlLCBkYXRhICB8IFNORF9CRF9JTl9NT0RFX0VOQUJMRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVDNfQkxPQ0tfU0VORF9CRF9DT01QOgorICAgICAgICAgICAgICAgIGRhdGEgPSBSRUdfUkQocERldmljZSwgU25kQmRDb21wLk1vZGUpOworICAgICAgICAgICAgICAgIGlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSAmPSB+U05EX0JEX0NPTVBfTU9ERV9FTkFCTEU7CisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZENvbXAuTW9kZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShSRUdfUkQocERldmljZSwgU25kQmRDb21wLk1vZGUpICYgU05EX0JEX0NPTVBfTU9ERV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgU25kQmRDb21wLk1vZGUsIGRhdGEgfCBTTkRfQkRfQ09NUF9NT0RFX0VOQUJMRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVDNfQkxPQ0tfU0VORF9CRF9TRUxFQ1RPUjoKKyAgICAgICAgICAgICAgICBkYXRhID0gUkVHX1JEKHBEZXZpY2UsIFNuZEJkU2VsLk1vZGUpOworICAgICAgICAgICAgICAgIGlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSAmPSB+U05EX0JEX1NFTF9NT0RFX0VOQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIFNuZEJkU2VsLk1vZGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoUkVHX1JEKHBEZXZpY2UsIFNuZEJkU2VsLk1vZGUpICYgU05EX0JEX1NFTF9NT0RFX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZFNlbC5Nb2RlLCBkYXRhIHwgU05EX0JEX1NFTF9NT0RFX0VOQUJMRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVDNfQkxPQ0tfU0VORF9EQVRBX0lOSVRJQVRPUjoKKyAgICAgICAgICAgICAgICBkYXRhID0gUkVHX1JEKHBEZXZpY2UsIFNuZERhdGFJbi5Nb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgJj0gflQzX1NORF9EQVRBX0lOX01PREVfRU5BQkxFOworICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgU25kRGF0YUluLk1vZGUsZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShSRUdfUkQocERldmljZSwgU25kRGF0YUluLk1vZGUpICYgVDNfU05EX0RBVEFfSU5fTU9ERV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgU25kRGF0YUluLk1vZGUsZGF0YSB8IFQzX1NORF9EQVRBX0lOX01PREVfRU5BQkxFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUM19CTE9DS19TRU5EX0RBVEFfQ09NUDoKKyAgICAgICAgICAgICAgICBkYXRhID0gUkVHX1JEKHBEZXZpY2UsIFNuZERhdGFDb21wLk1vZGUpOworICAgICAgICAgICAgICAgIGlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSAmPSB+U05EX0RBVEFfQ09NUF9NT0RFX0VOQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIFNuZERhdGFDb21wLk1vZGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoUkVHX1JEKHBEZXZpY2UsIFNuZERhdGFDb21wLk1vZGUpICYgU05EX0RBVEFfQ09NUF9NT0RFX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBTbmREYXRhQ29tcC5Nb2RlLGRhdGEgfCBTTkRfREFUQV9DT01QX01PREVfRU5BQkxFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUM19CTE9DS19NQUNfVFhfRU5HSU5FOgorICAgICAgICAgICAgICAgIGlmKGNudHJsID09IExNX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5UeE1vZGUgJj0gflRYX01PREVfRU5BQkxFOworICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5UeE1vZGUsIHBEZXZpY2UtPlR4TW9kZSk7CisgICAgICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShSRUdfUkQocERldmljZSwgTWFjQ3RybC5UeE1vZGUpICYgVFhfTU9ERV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcERldmljZS0+VHhNb2RlIHw9IFRYX01PREVfRU5BQkxFOworICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5UeE1vZGUsIHBEZXZpY2UtPlR4TW9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFQzX0JMT0NLX01FTV9BUkJJVE9SOgorICAgICAgICAgICAgICAgIGRhdGEgPSBSRUdfUkQocERldmljZSwgTWVtQXJiaXRlci5Nb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgJj0gflQzX01FTV9BUkJJVEVSX01PREVfRU5BQkxFOworICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgTWVtQXJiaXRlci5Nb2RlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighKFJFR19SRChwRGV2aWNlLCBNZW1BcmJpdGVyLk1vZGUpICYgVDNfTUVNX0FSQklURVJfTU9ERV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgTWVtQXJiaXRlci5Nb2RlLGRhdGF8VDNfTUVNX0FSQklURVJfTU9ERV9FTkFCTEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFQzX0JMT0NLX01CVUZfTUFOQUdFUjoKKyAgICAgICAgICAgICAgICBkYXRhID0gUkVHX1JEKHBEZXZpY2UsIEJ1Zk1nci5Nb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgJj0gfkJVRk1HUl9NT0RFX0VOQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5Nb2RlLGRhdGEpOworICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoUkVHX1JEKHBEZXZpY2UsIEJ1Zk1nci5Nb2RlKSAmIEJVRk1HUl9NT0RFX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTW9kZSxkYXRhIHwgIEJVRk1HUl9NT0RFX0VOQUJMRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVDNfQkxPQ0tfTUFDX0dMT0JBTDoKKyAgICAgICAgICAgICAgICBpZihjbnRybCA9PSBMTV9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcERldmljZS0+TWFjTW9kZSAmPSB+KE1BQ19NT0RFX0VOQUJMRV9UREUgfAorICAgICAgICAgICAgICAgICAgICAgICAgTUFDX01PREVfRU5BQkxFX1JERSB8CisgICAgICAgICAgICAgICAgICAgICAgICBNQUNfTU9ERV9FTkFCTEVfRkhERSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPk1hY01vZGUgfD0gKE1BQ19NT0RFX0VOQUJMRV9UREUgfAorICAgICAgICAgICAgICAgICAgICAgICAgTUFDX01PREVfRU5BQkxFX1JERSB8CisgICAgICAgICAgICAgICAgICAgICAgICBNQUNfTU9ERV9FTkFCTEVfRkhERSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfSAvKiBzd2l0Y2ggKi8KKworICAgICAgICBpZihqID49IE1heFdhaXRDbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIHJlaW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xNX1NUQVRVUworTE1fUmVzZXRBZGFwdGVyKAorUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworICAgIExNX1VJTlQzMiBWYWx1ZTMyOworICAgIExNX1VJTlQxNiBWYWx1ZTE2OworICAgIExNX1VJTlQzMiBqLCBrOworCisgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHQuICovCisgICAgTE1fRGlzYWJsZUludGVycnVwdChwRGV2aWNlKTsKKworICAgIC8qIE1heSBnZXQgYSBzcHVyaW91cyBpbnRlcnJ1cHQgKi8KKyAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzID0gU1RBVFVTX0JMT0NLX1VQREFURUQ7CisKKyAgICAvKiBEaXNhYmxlIHRyYW5zbWl0IGFuZCByZWNlaXZlIERNQSBlbmdpbmVzLiAgQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMuICovCisgICAgaWYocERldmljZS0+SW5pdERvbmUpCisgICAgeworICAgICAgICBMTV9BYm9ydChwRGV2aWNlKTsKKyAgICB9CisKKyAgICBwRGV2aWNlLT5TaHV0dGluZ0Rvd24gPSBGQUxTRTsKKworICAgIExNX1Jlc2V0Q2hpcChwRGV2aWNlKTsKKworICAgIC8qIEJ1ZzogQXRobG9uIGZpeCBmb3IgQjMgc2lsaWNvbiBvbmx5LiAgVGhpcyBiaXQgZG9lcyBub3QgZG8gYW55dGhpbmcgKi8KKyAgICAvKiBpbiBvdGhlciBjaGlwIHJldmlzaW9ucy4gKi8KKyAgICBpZihwRGV2aWNlLT5EZWxheVBjaUdyYW50KQorICAgIHsKKyAgICAgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsKTsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIFZhbHVlMzIgfCBCSVRfMzEpOworICAgIH0KKworICAgIGlmKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDRfQTApCisgICAgeworICAgICAgICBpZiAoIShwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSk7CisgICAgICAgICAgICBWYWx1ZTMyIHw9IFQzX1BDSV9TVEFURV9SRVRSWV9TQU1FX0RNQTsKKyAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuUGNpU3RhdGUsIFZhbHVlMzIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRW5hYmxlIFRhZ2dlZFN0YXR1cyBtb2RlLiAqLworICAgIGlmKHBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cykKKyAgICB7CisgICAgICAgIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCB8PSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfVEFHR0VEX1NUQVRVU19NT0RFOworICAgIH0KKworICAgIC8qIFJlc3RvcmUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLworICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgUENJX0NBQ0hFX0xJTkVfU0laRV9SRUcsCisgICAgICAgIHBEZXZpY2UtPlNhdmVkQ2FjaGVMaW5lUmVnKTsKKyAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lEX1JFRywKKyAgICAgICAgKHBEZXZpY2UtPlN1YnN5c3RlbUlkIDw8IDE2KSB8IHBEZXZpY2UtPlN1YnN5c3RlbVZlbmRvcklkKTsKKworICAgIC8qIENsZWFyIHRoZSBzdGF0aXN0aWNzIGJsb2NrLiAqLworICAgIGZvcihqID0gMHgwMzAwOyBqIDwgMHgwYjAwOyBqKyspCisgICAgeworICAgICAgICBNRU1fV1JfT0ZGU0VUKHBEZXZpY2UsIGosIDApOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpcyBCbG9jayAqLworICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgPSAwOworICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZTdGRDb25JZHggPSAwOworICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZKdW1ib0NvbklkeCA9IDA7CisgICAgcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdk1pbmlDb25JZHggPSAwOworCisgICAgZm9yKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICB7CisgICAgICAgcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPklkeFtqXS5SY3ZQcm9kSWR4ID0gMDsKKyAgICAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+SWR4W2pdLlNlbmRDb25JZHggPSAwOworICAgIH0KKworICAgIGZvcihrID0gMDsgayA8IFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UIDtrKyspCisgICAgeworICAgICAgIHBEZXZpY2UtPnBSeFN0ZEJkVmlydFtrXS5Ib3N0QWRkci5IaWdoID0gMDsKKyAgICAgICBwRGV2aWNlLT5wUnhTdGRCZFZpcnRba10uSG9zdEFkZHIuTG93ID0gMDsKKyAgICB9CisKKyNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCisgICAgLyogUmVjZWl2ZSBqdW1ibyBCRCBidWZmZXIuICovCisgICAgZm9yKGsgPSAwOyBrIDwgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVDsgaysrKQorICAgIHsKKyAgICAgICAgcERldmljZS0+cFJ4SnVtYm9CZFZpcnRba10uSG9zdEFkZHIuSGlnaCA9IDA7CisgICAgICAgIHBEZXZpY2UtPnBSeEp1bWJvQmRWaXJ0W2tdLkhvc3RBZGRyLkxvdyA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLkRtYVJlYWRXcml0ZUN0cmwsIHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwpOworCisgICAgLyogR1JDIG1vZGUgY29udHJvbCByZWdpc3Rlci4gKi8KKyNpZmRlZiBCSUdfRU5ESUFOX1BDSSAgICAvKiBKaW1teSwgdGhpcyBpZmRlZiBibG9jayBkZWxldGVkIGluIG5ldyBjb2RlISAqLworICAgIFZhbHVlMzIgPQorICAgICAgICBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQSB8CisgICAgICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSB8CisgICAgICAgIEdSQ19NT0RFX0lOVF9PTl9NQUNfQVRUTiB8CisgICAgICAgIEdSQ19NT0RFX0hPU1RfU1RBQ0tfVVA7CisjZWxzZQorICAgIC8qIE5vIENQVSBTd2FwIG1vZGVzIGZvciBQQ0kgSU8gKi8KKyAgICBWYWx1ZTMyID0KKyNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKKyAgICAgICAgR1JDX01PREVfQllURV9TV0FQX05PTl9GUkFNRV9EQVRBIHwKKyAgICAgICAgR1JDX01PREVfV09SRF9TV0FQX05PTl9GUkFNRV9EQVRBIHwKKyAgICAgICAgR1JDX01PREVfQllURV9TV0FQX0RBVEEgfAorICAgICAgICBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQSB8CisjZWxzZQorICAgICAgICBHUkNfTU9ERV9XT1JEX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfAorICAgICAgICBHUkNfTU9ERV9CWVRFX1NXQVBfREFUQSB8CisgICAgICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9EQVRBIHwKKyNlbmRpZgorICAgICAgICBHUkNfTU9ERV9JTlRfT05fTUFDX0FUVE4gfAorICAgICAgICBHUkNfTU9ERV9IT1NUX1NUQUNLX1VQOworI2VuZGlmIC8qICFCSUdfRU5ESUFOX1BDSSAqLworCisgICAgLyogQ29uZmlndXJlIHNlbmQgQkQgbW9kZS4gKi8KKyAgICBpZihwRGV2aWNlLT5OaWNTZW5kQmQgPT0gRkFMU0UpCisgICAgeworICAgICAgICBWYWx1ZTMyIHw9IEdSQ19NT0RFX0hPU1RfU0VORF9CRFM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZhbHVlMzIgfD0gR1JDX01PREVfNFhfTklDX0JBU0VEX1NFTkRfUklOR1M7CisgICAgfQorCisgICAgLyogQ29uZmlndXJlIHBzZXVkbyBjaGVja3N1bSBtb2RlLiAqLworICAgIGlmKHBEZXZpY2UtPk5vVHhQc2V1ZG9IZHJDaGtzdW0pCisgICAgeworICAgICAgICBWYWx1ZTMyIHw9IEdSQ19NT0RFX1RYX05PX1BTRVVET19IRUFERVJfQ0hLU1VNOworICAgIH0KKworICAgIGlmKHBEZXZpY2UtPk5vUnhQc2V1ZG9IZHJDaGtzdW0pCisgICAgeworICAgICAgICBWYWx1ZTMyIHw9IEdSQ19NT0RFX1JYX05PX1BTRVVET19IRUFERVJfQ0hLU1VNOworICAgIH0KKworICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTW9kZSwgVmFsdWUzMik7CisKKyAgICAvKiBTZXR1cCB0aGUgdGltZXIgcHJlc2NhbGFyIHJlZ2lzdGVyLiAqLworICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTWlzY0NmZywgNjUgPDwgMSk7ICAgICAgLyogQ2xvY2sgaXMgYWx3YXN5IDY2TWh6LiAqLworCisgICAgLyogU2V0IHVwIHRoZSBNQlVGIHBvb2wgYmFzZSBhZGRyZXNzIGFuZCBzaXplLiAqLworICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1ZlBvb2xBZGRyLCBwRGV2aWNlLT5NYnVmQmFzZSk7CisgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5NYnVmUG9vbFNpemUsIHBEZXZpY2UtPk1idWZTaXplKTsKKworICAgIC8qIFNldCB1cCB0aGUgRE1BIGRlc2NyaXB0b3IgcG9vbCBiYXNlIGFkZHJlc3MgYW5kIHNpemUuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5EbWFEZXNjUG9vbEFkZHIsIFQzX05JQ19ETUFfREVTQ19QT09MX0FERFIpOworICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuRG1hRGVzY1Bvb2xTaXplLCBUM19OSUNfRE1BX0RFU0NfUE9PTF9TSVpFKTsKKworICAgIC8qIENvbmZpZ3VyZSBNQlVGIGFuZCBUaHJlc2hvbGQgd2F0ZXJtYXJrcyAqLworICAgIC8qIENvbmZpZ3VyZSB0aGUgRE1BIHJlYWQgTUJVRiBsb3cgd2F0ZXIgbWFyay4gKi8KKyAgICBpZihwRGV2aWNlLT5EbWFNYnVmTG93TWFyaykKKyAgICB7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1ZlJlYWREbWFMb3dXYXRlck1hcmssCisgICAgICAgICAgICBwRGV2aWNlLT5EbWFNYnVmTG93TWFyayk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHBEZXZpY2UtPlR4TXR1IDwgTUFYX0VUSEVSTkVUX1BBQ0tFVF9CVUZGRVJfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5NYnVmUmVhZERtYUxvd1dhdGVyTWFyaywKKyAgICAgICAgICAgICAgICBUM19ERUZfRE1BX01CVUZfTE9XX1dNQVJLKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1ZlJlYWREbWFMb3dXYXRlck1hcmssCisgICAgICAgICAgICAgICAgVDNfREVGX0RNQV9NQlVGX0xPV19XTUFSS19KVU1CTyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgdGhlIE1BQyBSeCBNQlVGIGxvdyB3YXRlciBtYXJrLiAqLworICAgIGlmKHBEZXZpY2UtPlJ4TWFjTWJ1Zkxvd01hcmspCisgICAgeworICAgICAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1idWZNYWNSeExvd1dhdGVyTWFyaywKKyAgICAgICAgICAgIHBEZXZpY2UtPlJ4TWFjTWJ1Zkxvd01hcmspOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZihwRGV2aWNlLT5UeE10dSA8IE1BWF9FVEhFUk5FVF9QQUNLRVRfQlVGRkVSX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1Zk1hY1J4TG93V2F0ZXJNYXJrLAorICAgICAgICAgICAgICAgIFQzX0RFRl9SWF9NQUNfTUJVRl9MT1dfV01BUkspOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5NYnVmTWFjUnhMb3dXYXRlck1hcmssCisgICAgICAgICAgICAgICAgVDNfREVGX1JYX01BQ19NQlVGX0xPV19XTUFSS19KVU1CTyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgdGhlIE1CVUYgaGlnaCB3YXRlciBtYXJrLiAqLworICAgIGlmKHBEZXZpY2UtPk1idWZIaWdoTWFyaykKKyAgICB7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1ZkhpZ2hXYXRlck1hcmssIHBEZXZpY2UtPk1idWZIaWdoTWFyayk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHBEZXZpY2UtPlR4TXR1IDwgTUFYX0VUSEVSTkVUX1BBQ0tFVF9CVUZGRVJfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5NYnVmSGlnaFdhdGVyTWFyaywKKyAgICAgICAgICAgICAgICBUM19ERUZfTUJVRl9ISUdIX1dNQVJLKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1ZkhpZ2hXYXRlck1hcmssCisgICAgICAgICAgICAgICAgVDNfREVGX01CVUZfSElHSF9XTUFSS19KVU1CTyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLkRtYUxvd1dhdGVyTWFyaywgVDNfREVGX0RNQV9ERVNDX0xPV19XTUFSSyk7CisgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5EbWFIaWdoV2F0ZXJNYXJrLCBUM19ERUZfRE1BX0RFU0NfSElHSF9XTUFSSyk7CisKKyAgICAvKiBFbmFibGUgYnVmZmVyIG1hbmFnZXIuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5Nb2RlLCBCVUZNR1JfTU9ERV9FTkFCTEUgfCBCVUZNR1JfTU9ERV9BVFROX0VOQUJMRSk7CisKKyAgICBmb3IoaiA9IDAgO2ogPCAyMDAwOyBqKyspCisgICAgeworICAgICAgICBpZihSRUdfUkQocERldmljZSwgQnVmTWdyLk1vZGUpICYgQlVGTUdSX01PREVfRU5BQkxFKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIE1NX1dhaXQoMTApOworICAgIH0KKworICAgIGlmKGogPj0gMjAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgdGhlIEZUUXMuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIEZ0cS5SZXNldCwgMHhmZmZmZmZmZik7CisgICAgUkVHX1dSKHBEZXZpY2UsIEZ0cS5SZXNldCwgMCk7CisKKyAgICAvKiBXYWl0IHVudGlsIEZUUSBpcyByZWFkeSAqLworICAgIGZvcihqID0gMDsgaiA8IDIwMDA7IGorKykKKyAgICB7CisgICAgICAgIGlmKFJFR19SRChwRGV2aWNlLCBGdHEuUmVzZXQpID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgfQorCisgICAgaWYoaiA+PSAyMDAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIFN0YW5kYXJkIFJlY2VpdmUgUkNCLiAqLworICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQmRJbi5TdGRSY3ZSY2IuSG9zdFJpbmdBZGRyLkhpZ2gsCisgICAgICAgIHBEZXZpY2UtPlJ4U3RkQmRQaHkuSGlnaCk7CisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLlN0ZFJjdlJjYi5Ib3N0UmluZ0FkZHIuTG93LAorICAgICAgICBwRGV2aWNlLT5SeFN0ZEJkUGh5Lkxvdyk7CisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLlN0ZFJjdlJjYi51Lk1heExlbl9GbGFncywKKyAgICAgICAgTUFYX1NURF9SQ1ZfQlVGRkVSX1NJWkUgPDwgMTYpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgSnVtYm8gUmVjZWl2ZSBSQ0IuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLkp1bWJvUmN2UmNiLnUuTWF4TGVuX0ZsYWdzLAorICAgICAgICBUM19SQ0JfRkxBR19SSU5HX0RJU0FCTEVEKTsKKyNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLkp1bWJvUmN2UmNiLkhvc3RSaW5nQWRkci5IaWdoLAorICAgICAgICBwRGV2aWNlLT5SeEp1bWJvQmRQaHkuSGlnaCk7CisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLkp1bWJvUmN2UmNiLkhvc3RSaW5nQWRkci5Mb3csCisgICAgICAgIHBEZXZpY2UtPlJ4SnVtYm9CZFBoeS5Mb3cpOworCisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLkp1bWJvUmN2UmNiLnUuTWF4TGVuX0ZsYWdzLCAwKTsKKworI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKworICAgIC8qIEluaXRpYWxpemUgdGhlIE1pbmkgUmVjZWl2ZSBSQ0IuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1pbmlSY3ZSY2IudS5NYXhMZW5fRmxhZ3MsCisgICAgICAgIFQzX1JDQl9GTEFHX1JJTkdfRElTQUJMRUQpOworCisgICAgeworICAgICAgICBSRUdfV1IocERldmljZSwgUmN2RGF0YUJkSW4uU3RkUmN2UmNiLk5pY1JpbmdBZGRyLAorICAgICAgICAgICAgKExNX1VJTlQzMikgVDNfTklDX1NURF9SQ1ZfQlVGRkVSX0RFU0NfQUREUik7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQmRJbi5KdW1ib1JjdlJjYi5OaWNSaW5nQWRkciwKKyAgICAgICAgICAgIChMTV9VSU5UMzIpIFQzX05JQ19KVU1CT19SQ1ZfQlVGRkVSX0RFU0NfQUREUik7CisgICAgfQorCisgICAgLyogUmVjZWl2ZSBCRCBSaW5nIHJlcGxlbmlzaCB0aHJlc2hvbGQuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkJkSW4uU3RkUmN2VGhyZXNob2xkLCBwRGV2aWNlLT5SeFN0ZERlc2NDbnQvOCk7CisjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAorICAgIFJFR19XUihwRGV2aWNlLCBSY3ZCZEluLkp1bWJvUmN2VGhyZXNob2xkLCBwRGV2aWNlLT5SeEp1bWJvRGVzY0NudC84KTsKKyNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisKKyAgICAvKiBEaXNhYmxlIGFsbCB0aGUgdW51c2VkIHJpbmdzLiAqLworICAgIGZvcihqID0gMDsgaiA8IFQzX01BWF9TRU5EX1JDQl9DT1VOVDsgaisrKSB7CisgICAgICAgIE1FTV9XUihwRGV2aWNlLCBTZW5kUmNiW2pdLnUuTWF4TGVuX0ZsYWdzLCBUM19SQ0JfRkxBR19SSU5HX0RJU0FCTEVEKTsKKyAgICB9IC8qIGZvciAqLworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgaW5kaWNlcy4gKi8KKyAgICBwRGV2aWNlLT5TZW5kUHJvZElkeCA9IDA7CisgICAgcERldmljZS0+U2VuZENvbklkeCA9IDA7CisKKyAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5TZW5kSG9zdFByb2RJZHhbMF0uTG93LCAwKTsKKyAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5TZW5kTmljUHJvZElkeFswXS5Mb3csIDApOworCisgICAgLyogU2V0IHVwIGhvc3Qgb3IgTklDIGJhc2VkIHNlbmQgUkNCLiAqLworICAgIGlmKHBEZXZpY2UtPk5pY1NlbmRCZCA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIE1FTV9XUihwRGV2aWNlLCBTZW5kUmNiWzBdLkhvc3RSaW5nQWRkci5IaWdoLAorICAgICAgICAgICAgcERldmljZS0+U2VuZEJkUGh5LkhpZ2gpOworICAgICAgICBNRU1fV1IocERldmljZSwgU2VuZFJjYlswXS5Ib3N0UmluZ0FkZHIuTG93LAorICAgICAgICAgICAgcERldmljZS0+U2VuZEJkUGh5Lkxvdyk7CisKKyAgICAgICAgLyogU2V0IHVwIHRoZSBOSUMgcmluZyBhZGRyZXNzIGluIHRoZSBSQ0IuICovCisgICAgICAgIE1FTV9XUihwRGV2aWNlLCBTZW5kUmNiWzBdLk5pY1JpbmdBZGRyLFQzX05JQ19TTkRfQlVGRkVSX0RFU0NfQUREUik7CisKKyAgICAgICAgLyogU2V0dXAgdGhlIFJDQi4gKi8KKyAgICAgICAgTUVNX1dSKHBEZXZpY2UsIFNlbmRSY2JbMF0udS5NYXhMZW5fRmxhZ3MsCisgICAgICAgICAgICBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVCA8PCAxNik7CisKKyAgICAgICAgZm9yKGsgPSAwOyBrIDwgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQ7IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERldmljZS0+cFNlbmRCZFZpcnRba10uSG9zdEFkZHIuSGlnaCA9IDA7CisgICAgICAgICAgICBwRGV2aWNlLT5wU2VuZEJkVmlydFtrXS5Ib3N0QWRkci5Mb3cgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE1FTV9XUihwRGV2aWNlLCBTZW5kUmNiWzBdLkhvc3RSaW5nQWRkci5IaWdoLCAwKTsKKyAgICAgICAgTUVNX1dSKHBEZXZpY2UsIFNlbmRSY2JbMF0uSG9zdFJpbmdBZGRyLkxvdywgMCk7CisgICAgICAgIE1FTV9XUihwRGV2aWNlLCBTZW5kUmNiWzBdLk5pY1JpbmdBZGRyLAorICAgICAgICAgICAgcERldmljZS0+U2VuZEJkUGh5Lkxvdyk7CisKKyAgICAgICAgZm9yKGsgPSAwOyBrIDwgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQ7IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgX19yYXdfd3JpdGVsKDAsICYocERldmljZS0+cFNlbmRCZFZpcnRba10uSG9zdEFkZHIuSGlnaCkpOworICAgICAgICAgICAgX19yYXdfd3JpdGVsKDAsICYocERldmljZS0+cFNlbmRCZFZpcnRba10uSG9zdEFkZHIuTG93KSk7CisgICAgICAgICAgICBfX3Jhd193cml0ZWwoMCwgJihwRGV2aWNlLT5wU2VuZEJkVmlydFtrXS51MS5MZW5fRmxhZ3MpKTsKKyAgICAgICAgICAgIHBEZXZpY2UtPlNoYWRvd1NlbmRCZFtrXS5Ib3N0QWRkci5IaWdoID0gMDsKKyAgICAgICAgICAgIHBEZXZpY2UtPlNoYWRvd1NlbmRCZFtrXS51MS5MZW5fRmxhZ3MgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGF0b21pY19zZXQoJnBEZXZpY2UtPlNlbmRCZExlZnQsIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5ULTEpOworCisgICAgLyogQ29uZmlndXJlIHRoZSByZWNlaXZlIHJldHVybiByaW5ncy4gKi8KKyAgICBmb3IoaiA9IDA7IGogPCBUM19NQVhfUkNWX1JFVFVSTl9SQ0JfQ09VTlQ7IGorKykKKyAgICB7CisgICAgICAgIE1FTV9XUihwRGV2aWNlLCBSY3ZSZXRSY2Jbal0udS5NYXhMZW5fRmxhZ3MsIFQzX1JDQl9GTEFHX1JJTkdfRElTQUJMRUQpOworICAgIH0KKworICAgIHBEZXZpY2UtPlJjdlJldENvbklkeCA9IDA7CisKKyAgICBNRU1fV1IocERldmljZSwgUmN2UmV0UmNiWzBdLkhvc3RSaW5nQWRkci5IaWdoLAorICAgICAgICBwRGV2aWNlLT5SY3ZSZXRCZFBoeS5IaWdoKTsKKyAgICBNRU1fV1IocERldmljZSwgUmN2UmV0UmNiWzBdLkhvc3RSaW5nQWRkci5Mb3csCisgICAgICAgIHBEZXZpY2UtPlJjdlJldEJkUGh5Lkxvdyk7CisKKyAgICAvKiBTZXQgdXAgdGhlIE5JQyByaW5nIGFkZHJlc3MgaW4gdGhlIFJDQi4gKi8KKyAgICAvKiBOb3QgdmVyeSBjbGVhciBmcm9tIHRoZSBzcGVjLiAgSSBhbSBndWVzc2luZyB0aGF0IGZvciBSZWNlaXZlICovCisgICAgLyogUmV0dXJuIFJpbmcsIE5pY1JpbmdBZGRyIGlzIG5vdCB1c2VkLiAqLworICAgIE1FTV9XUihwRGV2aWNlLCBSY3ZSZXRSY2JbMF0uTmljUmluZ0FkZHIsIDApOworCisgICAgLyogU2V0dXAgdGhlIFJDQi4gKi8KKyAgICBNRU1fV1IocERldmljZSwgUmN2UmV0UmNiWzBdLnUuTWF4TGVuX0ZsYWdzLAorICAgICAgICBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCA8PCAxNik7CisKKyAgICAvKiBSZWluaXRpYWxpemUgUlggcmluZyBwcm9kdWNlciBpbmRleCAqLworICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlJjdlN0ZFByb2RJZHguTG93LCAwKTsKKyAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5SY3ZKdW1ib1Byb2RJZHguTG93LCAwKTsKKyAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5SY3ZNaW5pUHJvZElkeC5Mb3csIDApOworCisjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAorICAgIHBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4ID0gMDsKKyAgICBwRGV2aWNlLT5SeEp1bWJvUXVldWVkQ250ID0gMDsKKyNlbmRpZgorCisgICAgLyogUmVpbml0aWFsaXplIG91ciBjb3B5IG9mIHRoZSBpbmRpY2VzLiAqLworICAgIHBEZXZpY2UtPlJ4U3RkUHJvZElkeCA9IDA7CisgICAgcERldmljZS0+UnhTdGRRdWV1ZWRDbnQgPSAwOworCisjaWYgVDNfSlVNQk9fUkNWX0VOVFJZX0NPVU5UCisgICAgcERldmljZS0+UnhKdW1ib1Byb2RJZHggPSAwOworI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9FTlRSWV9DT1VOVCAqLworCisgICAgLyogQ29uZmlndXJlIHRoZSBNQUMgYWRkcmVzcy4gKi8KKyAgICBMTV9TZXRNYWNBZGRyZXNzKHBEZXZpY2UsIHBEZXZpY2UtPk5vZGVBZGRyZXNzKTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIHRyYW5zbWl0IHJhbmRvbSBiYWNrb2ZmIHNlZWQuICovCisgICAgVmFsdWUzMiA9IChwRGV2aWNlLT5Ob2RlQWRkcmVzc1swXSArIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzFdICsKKyAgICAgICAgcERldmljZS0+Tm9kZUFkZHJlc3NbMl0gKyBwRGV2aWNlLT5Ob2RlQWRkcmVzc1szXSArCisgICAgICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzRdICsgcERldmljZS0+Tm9kZUFkZHJlc3NbNV0pICYKKyAgICAgICAgTUFDX1RYX0JBQ0tPRkZfU0VFRF9NQVNLOworICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlR4QmFja29mZlNlZWQsIFZhbHVlMzIpOworCisgICAgLyogUmVjZWl2ZSBNVFUuICBGcmFtZXMgbGFyZ2VyIHRoYW4gdGhlIE1UVSBpcyBtYXJrZWQgYXMgb3ZlcnNpemVkLiAqLworICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk10dVNpemUsIHBEZXZpY2UtPlJ4TXR1ICsgOCk7ICAgLyogQ1JDICsgVkxBTi4gKi8KKworICAgIC8qIENvbmZpZ3VyZSBUaW1lIHNsb3QvSVBHIHBlciA4MDIuMyAqLworICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlR4TGVuZ3RocywgMHgyNjIwKTsKKworICAgIC8qCisgICAgICogQ29uZmlndXJlIFJlY2VpdmUgUnVsZXMgc28gdGhhdCBwYWNrZXRzIGRvbid0IG1hdGNoCisgICAgICogUHJvZ3JhbW1ibGUgcnVsZSB3aWxsIGJlIHF1ZXVlZCB0byBSZXR1cm4gUmluZyAxCisgICAgICovCisgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUmN2UnVsZUNmZywgUlhfUlVMRV9ERUZBVUxUX0NMQVNTKTsKKworICAgIC8qCisgICAgICogQ29uZmlndXJlIHRvIGhhdmUgMTYgQ2xhc3NlcyBvZiBTZXJ2aWNlcyAoQ09TKSBhbmQgb25lCisgICAgICogcXVldWUgcGVyIGNsYXNzLiAgQmFkIGZyYW1lcyBhcmUgcXVldWVkIHRvIFJSUiMxLgorICAgICAqIEFuZCBmcmFtZXMgZG9uJ3QgbWF0Y2ggcnVsZXMgYXJlIGFsc28gcXVldWVkIHRvIENPUyMxLgorICAgICAqLworICAgIFJFR19XUihwRGV2aWNlLCBSY3ZMaXN0UGxtdC5Db25maWcsIDB4MTgxKTsKKworICAgIC8qIEVuYWJsZSBSZWNlaXZlIFBsYWNlbWVudCBTdGF0aXN0aWNzICovCisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkxpc3RQbG10LlN0YXRzRW5hYmxlTWFzaywweGZmZmZmZik7CisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkxpc3RQbG10LlN0YXRzQ3RybCwgUkNWX0xJU1RfU1RBVFNfRU5BQkxFKTsKKworICAgIC8qIEVuYWJsZSBTZW5kIERhdGEgSW5pdGF0b3IgU3RhdGlzdGljcyAqLworICAgIFJFR19XUihwRGV2aWNlLCBTbmREYXRhSW4uU3RhdHNFbmFibGVNYXNrLDB4ZmZmZmZmKTsKKyAgICBSRUdfV1IocERldmljZSwgU25kRGF0YUluLlN0YXRzQ3RybCwKKyAgICAgICAgVDNfU05EX0RBVEFfSU5fU1RBVFNfQ1RSTF9FTkFCTEUgfCBcCisgICAgICAgIFQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRkFTVEVSX1VQREFURSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBob3N0IGNvYWxlc2Npbmcgc3RhdGUgbWFjaGluZSBiZWZvcmUgY29uZmlndXJpbmcgaXQncyAqLworICAgIC8qIHBhcmFtZXRlcnMuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlLCAwKTsKKyAgICBmb3IoaiA9IDA7IGogPCAyMDAwOyBqKyspCisgICAgeworICAgICAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlKTsKKyAgICAgICAgaWYoIShWYWx1ZTMyICYgSE9TVF9DT0FMRVNDRV9FTkFCTEUpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICB9CisKKyAgICAvKiBIb3N0IGNvYWxlc2NpbmcgY29uZmlndXJhdGlvbnMuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5SeENvYWxlc2NpbmdUaWNrcywgcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3MpOworICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuVHhDb2FsZXNjaW5nVGlja3MsIHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzKTsKKyAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlJ4TWF4Q29hbGVzY2VkRnJhbWVzLAorICAgICAgICBwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lcyk7CisgICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5UeE1heENvYWxlc2NlZEZyYW1lcywKKyAgICAgICAgcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXMpOworICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuUnhDb2FsZXNjZWRUaWNrRHVyaW5nSW50LAorICAgICAgICBwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCk7CisgICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5UeENvYWxlc2NlZFRpY2tEdXJpbmdJbnQsCisgICAgICAgIHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50KTsKKyAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50LAorICAgICAgICBwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCk7CisgICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5UeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCwKKyAgICAgICAgcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhdHVzIGJsb2NrLiAgVGhlIE5JQyB3aWxsIERNQSAqLworICAgIC8qIHRoZSBzdGF0dXMgYmxvY2sgdG8gdGhpcyBtZW1vcnkgd2hpY2ggcmVzaWRlcyBvbiB0aGUgaG9zdC4gKi8KKyAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlN0YXR1c0Jsa0hvc3RBZGRyLkhpZ2gsCisgICAgICAgIHBEZXZpY2UtPlN0YXR1c0Jsa1BoeS5IaWdoKTsKKyAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlN0YXR1c0Jsa0hvc3RBZGRyLkxvdywKKyAgICAgICAgcERldmljZS0+U3RhdHVzQmxrUGh5Lkxvdyk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGF0aXN0aWNzIGJsb2NrLiAgVGhlIE5JQyB3aWxsIERNQSAqLworICAgIC8qIHRoZSBzdGF0aXN0aWNzIHRvIHRoaXMgYmxvY2sgb2YgbWVtb3J5LiAqLworICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuU3RhdHNCbGtIb3N0QWRkci5IaWdoLAorICAgICAgICBwRGV2aWNlLT5TdGF0c0Jsa1BoeS5IaWdoKTsKKyAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlN0YXRzQmxrSG9zdEFkZHIuTG93LAorICAgICAgICBwRGV2aWNlLT5TdGF0c0Jsa1BoeS5Mb3cpOworCisgICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0c0NvYWxlc2NpbmdUaWNrcywKKyAgICAgICAgcERldmljZS0+U3RhdHNDb2FsZXNjaW5nVGlja3MpOworCisgICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0c0Jsa05pY0FkZHIsIDB4MzAwKTsKKyAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlN0YXR1c0Jsa05pY0FkZHIsMHhiMDApOworCisgICAgLyogRW5hYmxlIEhvc3QgQ29hbGVzaW5nIHN0YXRlIG1hY2hpbmUgKi8KKyAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLk1vZGUsIEhPU1RfQ09BTEVTQ0VfRU5BQkxFIHwKKyAgICAgICAgcERldmljZS0+Q29hbGVzY2VNb2RlKTsKKworICAgIC8qIEVuYWJsZSB0aGUgUmVjZWl2ZSBCRCBDb21wbGV0aW9uIHN0YXRlIG1hY2hpbmUuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkJkQ29tcC5Nb2RlLCBSQ1ZfQkRfQ09NUF9NT0RFX0VOQUJMRSB8CisgICAgICAgIFJDVl9CRF9DT01QX01PREVfQVRUTl9FTkFCTEUpOworCisgICAgLyogRW5hYmxlIHRoZSBSZWNlaXZlIExpc3QgUGxhY2VtZW50IHN0YXRlIG1hY2hpbmUuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkxpc3RQbG10Lk1vZGUsIFJDVl9MSVNUX1BMTVRfTU9ERV9FTkFCTEUpOworCisgICAgLyogRW5hYmxlIHRoZSBSZWNlaXZlIExpc3QgU2VsZWN0b3Igc3RhdGUgbWFjaGluZS4gKi8KKyAgICBSRUdfV1IocERldmljZSwgUmN2TGlzdFNlbC5Nb2RlLCBSQ1ZfTElTVF9TRUxfTU9ERV9FTkFCTEUgfAorICAgICAgICBSQ1ZfTElTVF9TRUxfTU9ERV9BVFROX0VOQUJMRSk7CisKKyAgICAvKiBFbmFibGUgdHJhbnNtaXQgRE1BLCBjbGVhciBzdGF0aXN0aWNzLiAqLworICAgIHBEZXZpY2UtPk1hY01vZGUgPSAgTUFDX01PREVfRU5BQkxFX1RYX1NUQVRJU1RJQ1MgfAorICAgICAgICBNQUNfTU9ERV9FTkFCTEVfUlhfU1RBVElTVElDUyB8IE1BQ19NT0RFX0VOQUJMRV9UREUgfAorICAgICAgICBNQUNfTU9ERV9FTkFCTEVfUkRFIHwgTUFDX01PREVfRU5BQkxFX0ZIREU7CisgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSB8CisgICAgICAgIE1BQ19NT0RFX0NMRUFSX1JYX1NUQVRJU1RJQ1MgfCBNQUNfTU9ERV9DTEVBUl9UWF9TVEFUSVNUSUNTKTsKKworICAgIC8qIEdSQyBtaXNjZWxsYW5lb3VzIGxvY2FsIGNvbnRyb2wgcmVnaXN0ZXIuICovCisgICAgcERldmljZS0+R3JjTG9jYWxDdHJsID0gR1JDX01JU0NfTE9DQUxfQ1RSTF9JTlRfT05fQVRUTiB8CisgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfQVVUT19TRUVQUk9NOworCisgICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKQorICAgIHsKKyAgICAgICAgcERldmljZS0+R3JjTG9jYWxDdHJsIHw9IEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEgfAorICAgICAgICAgICAgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDE7CisgICAgfQorCisgICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCk7CisgICAgTU1fV2FpdCg0MCk7CisKKyAgICAvKiBSZXNldCBSWCBjb3VudGVycy4gKi8KKyAgICBmb3IoaiA9IDA7IGogPCBzaXplb2YoTE1fUlhfQ09VTlRFUlMpOyBqKyspCisgICAgeworICAgICAgICAoKFBMTV9VSU5UOCkgJnBEZXZpY2UtPlJ4Q291bnRlcnMpW2pdID0gMDsKKyAgICB9CisKKyAgICAvKiBSZXNldCBUWCBjb3VudGVycy4gKi8KKyAgICBmb3IoaiA9IDA7IGogPCBzaXplb2YoTE1fVFhfQ09VTlRFUlMpOyBqKyspCisgICAgeworICAgICAgICAoKFBMTV9VSU5UOCkgJnBEZXZpY2UtPlR4Q291bnRlcnMpW2pdID0gMDsKKyAgICB9CisKKyAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5JbnRlcnJ1cHRbMF0uTG93LCAwKTsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIENvbXBsZXRpb24gc3RhdGUgbWFjaGluZS4gKi8KKyAgICBSRUdfV1IocERldmljZSwgRG1hQ29tcC5Nb2RlLCBETUFfQ09NUF9NT0RFX0VOQUJMRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIERNQSBXcml0ZSBzdGF0ZSBtYWNoaW5lLiAqLworICAgIFZhbHVlMzIgPSBETUFfV1JJVEVfTU9ERV9FTkFCTEUgfAorICAgICAgICBETUFfV1JJVEVfTU9ERV9UQVJHRVRfQUJPUlRfQVRUTl9FTkFCTEUgfAorICAgICAgICBETUFfV1JJVEVfTU9ERV9NQVNURVJfQUJPUlRfQVRUTl9FTkFCTEUgfAorICAgICAgICBETUFfV1JJVEVfTU9ERV9QQVJJVFlfRVJST1JfQVRUTl9FTkFCTEUgfAorICAgICAgICBETUFfV1JJVEVfTU9ERV9BRERSX09WRVJGTE9XX0FUVE5fRU5BQkxFIHwKKyAgICAgICAgRE1BX1dSSVRFX01PREVfRklGT19PVkVSUlVOX0FUVE5fRU5BQkxFIHwKKyAgICAgICAgRE1BX1dSSVRFX01PREVfRklGT19VTkRFUlJVTl9BVFROX0VOQUJMRSB8CisgICAgICAgIERNQV9XUklURV9NT0RFX0ZJRk9fT1ZFUlJFQURfQVRUTl9FTkFCTEUgfAorICAgICAgICBETUFfV1JJVEVfTU9ERV9MT05HX1JFQURfQVRUTl9FTkFCTEU7CisgICAgUkVHX1dSKHBEZXZpY2UsIERtYVdyaXRlLk1vZGUsIFZhbHVlMzIpOworCisgICAgaWYgKCEocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSkKKyAgICB7CisgICAgICAgIGlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzA0X0EwKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZTE2ID0gUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5QY2lYQ29tbWFuZCk7CisgICAgICAgICAgICBWYWx1ZTE2ICY9IH4oUENJWF9DTURfTUFYX1NQTElUX01BU0sgfCBQQ0lYX0NNRF9NQVhfQlVSU1RfTUFTSyk7CisgICAgICAgICAgICBWYWx1ZTE2IHw9ICgoUENJWF9DTURfTUFYX0JVUlNUX0NQSU9CIDw8IFBDSVhfQ01EX01BWF9CVVJTVF9TSEwpICYKKyAgICAgICAgICAgICAgICBQQ0lYX0NNRF9NQVhfQlVSU1RfTUFTSyk7CisgICAgICAgICAgICBpZiAocERldmljZS0+U3BsaXRNb2RlRW5hYmxlID09IFNQTElUX01PREVfRU5BQkxFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlMTYgfD0gKHBEZXZpY2UtPlNwbGl0TW9kZU1heFJlcSA8PCBQQ0lYX0NNRF9NQVhfU1BMSVRfU0hMKQorICAgICAgICAgICAgICAgICAgICYgUENJWF9DTURfTUFYX1NQTElUX01BU0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLlBjaVhDb21tYW5kLCBWYWx1ZTE2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEVuYWJsZSB0aGUgUmVhZCBETUEgc3RhdGUgbWFjaGluZS4gKi8KKyAgICBWYWx1ZTMyID0gRE1BX1JFQURfTU9ERV9FTkFCTEUgfAorICAgICAgICBETUFfUkVBRF9NT0RFX1RBUkdFVF9BQk9SVF9BVFROX0VOQUJMRSB8CisgICAgICAgIERNQV9SRUFEX01PREVfTUFTVEVSX0FCT1JUX0FUVE5fRU5BQkxFIHwKKyAgICAgICAgRE1BX1JFQURfTU9ERV9QQVJJVFlfRVJST1JfQVRUTl9FTkFCTEUgfAorICAgICAgICBETUFfUkVBRF9NT0RFX0FERFJfT1ZFUkZMT1dfQVRUTl9FTkFCTEUgfAorICAgICAgICBETUFfUkVBRF9NT0RFX0ZJRk9fT1ZFUlJVTl9BVFROX0VOQUJMRSB8CisgICAgICAgIERNQV9SRUFEX01PREVfRklGT19VTkRFUlJVTl9BVFROX0VOQUJMRSB8CisgICAgICAgIERNQV9SRUFEX01PREVfRklGT19PVkVSUkVBRF9BVFROX0VOQUJMRSB8CisgICAgICAgIERNQV9SRUFEX01PREVfTE9OR19SRUFEX0FUVE5fRU5BQkxFOworCisgICAgaWYgKHBEZXZpY2UtPlNwbGl0TW9kZUVuYWJsZSA9PSBTUExJVF9NT0RFX0VOQUJMRSkKKyAgICB7CisgICAgICAgIFZhbHVlMzIgfD0gRE1BX1JFQURfTU9ERV9TUExJVF9FTkFCTEU7CisgICAgfQorICAgIFJFR19XUihwRGV2aWNlLCBEbWFSZWFkLk1vZGUsIFZhbHVlMzIpOworCisgICAgLyogRW5hYmxlIHRoZSBSZWNlaXZlIERhdGEgQ29tcGxldGlvbiBzdGF0ZSBtYWNoaW5lLiAqLworICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQ29tcC5Nb2RlLCBSQ1ZfREFUQV9DT01QX01PREVfRU5BQkxFIHwKKyAgICAgICAgUkNWX0RBVEFfQ09NUF9NT0RFX0FUVE5fRU5BQkxFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgTWJ1ZiBDbHVzdGVyIEZyZWUgc3RhdGUgbWFjaGluZS4gKi8KKyAgICBSRUdfV1IocERldmljZSwgTWJ1ZkNsdXN0ZXJGcmVlLk1vZGUsIE1CVUZfQ0xVU1RFUl9GUkVFX01PREVfRU5BQkxFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgU2VuZCBEYXRhIENvbXBsZXRpb24gc3RhdGUgbWFjaGluZS4gKi8KKyAgICBSRUdfV1IocERldmljZSwgU25kRGF0YUNvbXAuTW9kZSwgU05EX0RBVEFfQ09NUF9NT0RFX0VOQUJMRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFNlbmQgQkQgQ29tcGxldGlvbiBzdGF0ZSBtYWNoaW5lLiAqLworICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZENvbXAuTW9kZSwgU05EX0JEX0NPTVBfTU9ERV9FTkFCTEUgfAorICAgICAgICBTTkRfQkRfQ09NUF9NT0RFX0FUVE5fRU5BQkxFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgUmVjZWl2ZSBCRCBJbml0aWF0b3Igc3RhdGUgbWFjaGluZS4gKi8KKyAgICBSRUdfV1IocERldmljZSwgUmN2QmRJbi5Nb2RlLCBSQ1ZfQkRfSU5fTU9ERV9FTkFCTEUgfAorICAgICAgICBSQ1ZfQkRfSU5fTU9ERV9CRF9JTl9ESUFCTEVEX1JDQl9BVFROX0VOQUJMRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBJbml0aWF0b3Igc3RhdGUgbWFjaGluZS4gKi8KKyAgICBSRUdfV1IocERldmljZSwgUmN2RGF0YUJkSW4uTW9kZSwgUkNWX0RBVEFfQkRfSU5fTU9ERV9FTkFCTEUgfAorICAgICAgICBSQ1ZfREFUQV9CRF9JTl9NT0RFX0lOVkFMSURfUklOR19TSVpFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgU2VuZCBEYXRhIEluaXRpYXRvciBzdGF0ZSBtYWNoaW5lLiAqLworICAgIFJFR19XUihwRGV2aWNlLCBTbmREYXRhSW4uTW9kZSwgVDNfU05EX0RBVEFfSU5fTU9ERV9FTkFCTEUpOworCisgICAgLyogRW5hYmxlIHRoZSBTZW5kIEJEIEluaXRpYXRvciBzdGF0ZSBtYWNoaW5lLiAqLworICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZEluLk1vZGUsIFNORF9CRF9JTl9NT0RFX0VOQUJMRSB8CisgICAgICAgIFNORF9CRF9JTl9NT0RFX0FUVE5fRU5BQkxFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgU2VuZCBCRCBTZWxlY3RvciBzdGF0ZSBtYWNoaW5lLiAqLworICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZFNlbC5Nb2RlLCBTTkRfQkRfU0VMX01PREVfRU5BQkxFIHwKKyAgICAgICAgU05EX0JEX1NFTF9NT0RFX0FUVE5fRU5BQkxFKTsKKworI2lmIElOQ0xVREVfNTcwMV9BWF9GSVgKKyAgICAvKiBMb2FkIHRoZSBmaXJtd2FyZSBmb3IgdGhlIDU3MDFfQTAgd29ya2Fyb3VuZC4gKi8KKyAgICBpZihwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0EwKQorICAgIHsKKyAgICAgICAgTE1fTG9hZFJsc0Zpcm13YXJlKHBEZXZpY2UpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogRW5hYmxlIHRoZSB0cmFuc21pdHRlci4gKi8KKyAgICBwRGV2aWNlLT5UeE1vZGUgPSBUWF9NT0RFX0VOQUJMRTsKKyAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5UeE1vZGUsIHBEZXZpY2UtPlR4TW9kZSk7CisKKyAgICAvKiBFbmFibGUgdGhlIHJlY2VpdmVyLiAqLworICAgIHBEZXZpY2UtPlJ4TW9kZSA9IFJYX01PREVfRU5BQkxFOworICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSwgcERldmljZS0+UnhNb2RlKTsKKworICAgIGlmIChwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXApCisgICAgeworICAgICAgICBwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXAgPSBGQUxTRTsKKyAgICAgICAgcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBwRGV2aWNlLT5XYWtlVXBEaXNhYmxlQXV0b05lZzsKKyAgICAgICAgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0gcERldmljZS0+V2FrZVVwUmVxdWVzdGVkTWVkaWFUeXBlOworICAgIH0KKworICAgIC8qIERpc2FibGUgYXV0byBwb2xsaW5nLiAqLworICAgIHBEZXZpY2UtPk1pTW9kZSA9IDB4YzAwMDA7CisgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUpOworCisgICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisgICAgICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKKyAgICB7CisgICAgICAgIFZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZihwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX09VVFBVVCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLCBWYWx1ZTMyKTsKKworICAgIC8qIEFjdGl2YXRlIExpbmsgdG8gZW5hYmxlIE1BQyBzdGF0ZSBtYWNoaW5lICovCisgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlTdGF0dXMsIE1JX1NUQVRVU19FTkFCTEVfTElOS19TVEFUVVNfQVRUTik7CisKKyAgICBpZiAocERldmljZS0+RW5hYmxlVGJpKQorICAgIHsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBSWF9NT0RFX1JFU0VUKTsKKyAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSwgcERldmljZS0+UnhNb2RlKTsKKyAgICAgICAgaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDNfQTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlNlcmRlc0NmZywgMHg2MTYwMDApOworICAgICAgICB9CisgICAgfQorICAgIC8qIFNldHVwIHRoZSBwaHkgY2hpcC4gKi8KKyAgICBMTV9TZXR1cFBoeShwRGV2aWNlKTsKKworICAgIGlmICghcERldmljZS0+RW5hYmxlVGJpKSB7CisgICAgICAgIC8qIENsZWFyIENSQyBzdGF0cyAqLworICAgICAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIDB4MWUsICZWYWx1ZTMyKTsKKyAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgMHgxZSwgVmFsdWUzMiB8IDB4ODAwMCk7CisgICAgICAgIExNX1JlYWRQaHkocERldmljZSwgMHgxNCwgJlZhbHVlMzIpOworICAgIH0KKworICAgIC8qIFNldCB1cCB0aGUgcmVjZWl2ZSBtYXNrLiAqLworICAgIExNX1NldFJlY2VpdmVNYXNrKHBEZXZpY2UsIHBEZXZpY2UtPlJlY2VpdmVNYXNrKTsKKworICAgIC8qIFF1ZXVlIFJ4IHBhY2tldCBidWZmZXJzLiAqLworICAgIGlmKHBEZXZpY2UtPlF1ZXVlUnhQYWNrZXRzKQorICAgIHsKKyAgICAgICAgTE1fUXVldWVSeFBhY2tldHMocERldmljZSk7CisgICAgfQorCisgICAgLyogRW5hYmxlIGludGVycnVwdCB0byB0aGUgaG9zdC4gKi8KKyAgICBpZihwRGV2aWNlLT5Jbml0RG9uZSkKKyAgICB7CisgICAgICAgIExNX0VuYWJsZUludGVycnVwdChwRGV2aWNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIExNX1Jlc2V0QWRhcHRlciAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyByb3V0aW5lIGRpc2FibGVzIHRoZSBhZGFwdGVyIGZyb20gZ2VuZXJhdGluZyBpbnRlcnJ1cHRzLiAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTE1fU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9TVEFUVVMKK0xNX0Rpc2FibGVJbnRlcnJ1cHQoCisgICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuTWlzY0hvc3RDdHJsLCBwRGV2aWNlLT5NaXNjSG9zdEN0cmwgfAorICAgICAgICBNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpOworICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LkludGVycnVwdFswXS5Mb3csIDEpOworCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIHJvdXRpbmUgZW5hYmxlcyB0aGUgYWRhcHRlciB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzLiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xNX1NUQVRVUworTE1fRW5hYmxlSW50ZXJydXB0KAorICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKyAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLk1pc2NIb3N0Q3RybCwgcERldmljZS0+TWlzY0hvc3RDdHJsICYKKyAgICAgICAgfk1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCk7CisgICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guSW50ZXJydXB0WzBdLkxvdywgMCk7CisKKyAgICBpZihwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICYgU1RBVFVTX0JMT0NLX1VQREFURUQpCisgICAgeworICAgICAgICBSRUdfV1IocERldmljZSwgR3JjLkxvY2FsQ3RybCwgcERldmljZS0+R3JjTG9jYWxDdHJsIHwKKyAgICAgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfU0VUX0lOVCk7CisgICAgfQorCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIHJvdXRpbmUgcHV0cyBhIHBhY2tldCBvbiB0aGUgd2lyZSBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IERNQSAgICAgICAqLworLyogICAgZGVzY3JpcHRvciBhdmFpbGFibGU7IG90aGVyd2lzZSB0aGUgcGFja2V0IGlzIHF1ZXVlZCBmb3IgbGF0ZXIgICAgICAgICAgKi8KKy8qICAgIHRyYW5zbWlzc2lvbi4gIElmIHRoZSBzZWNvbmQgYXJndWUgaXMgTlVMTCwgdGhpcyByb3V0aW5lIHdpbGwgcHV0ICAgICAgICovCisvKiAgICB0aGUgcXVldWVkIHBhY2tldCBvbiB0aGUgd2lyZSBpZiBwb3NzaWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAwCitMTV9TVEFUVVMKK0xNX1NlbmRQYWNrZXQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpCit7CisgICAgTE1fVUlOVDMyIEZyYWdDb3VudDsKKyAgICBQVDNfU05EX0JEIHBTZW5kQmQ7CisgICAgUFQzX1NORF9CRCBwU2hhZG93U2VuZEJkOworICAgIExNX1VJTlQzMiBWYWx1ZTMyLCBMZW47CisgICAgTE1fVUlOVDMyIElkeDsKKworICAgIGlmIChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApIHsKKyAgICAgICAgcmV0dXJuIExNXzU3MDBTZW5kUGFja2V0KHBEZXZpY2UsIHBQYWNrZXQpOworICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgU2VuZEJkTGVmdCBjb3VudC4gKi8KKyAgICBhdG9taWNfc3ViKHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50LCAmcERldmljZS0+U2VuZEJkTGVmdCk7CisKKyAgICAvKiBJbml0YWxpemUgdGhlIHNlbmQgYnVmZmVyIGRlc2NyaXB0b3JzLiAqLworICAgIElkeCA9IHBEZXZpY2UtPlNlbmRQcm9kSWR4OworCisgICAgcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFtJZHhdOworCisgICAgLyogTmV4dCBwcm9kdWNlciBpbmRleC4gKi8KKyAgICBpZiAocERldmljZS0+TmljU2VuZEJkID09IFRSVUUpCisgICAgeworICAgICAgICBUM182NEJJVF9IT1NUX0FERFIgcGFkZHI7CisKKyAgICAgICAgcFNoYWRvd1NlbmRCZCA9ICZwRGV2aWNlLT5TaGFkb3dTZW5kQmRbSWR4XTsKKyAgICAgICAgZm9yKEZyYWdDb3VudCA9IDA7IDsgKQorICAgICAgICB7CisgICAgICAgICAgICBNTV9NYXBUeERtYShwRGV2aWNlLCBwUGFja2V0LCAmcGFkZHIsICZMZW4sIEZyYWdDb3VudCk7CisgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwb2ludGVyIHRvIHRoZSBzZW5kIGJ1ZmZlciBmcmFnbWVudC4gKi8KKyAgICAgICAgICAgIGlmIChwYWRkci5IaWdoICE9IHBTaGFkb3dTZW5kQmQtPkhvc3RBZGRyLkhpZ2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKHBhZGRyLkhpZ2gsICYocFNlbmRCZC0+SG9zdEFkZHIuSGlnaCkpOworICAgICAgICAgICAgICAgIHBTaGFkb3dTZW5kQmQtPkhvc3RBZGRyLkhpZ2ggPSBwYWRkci5IaWdoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19yYXdfd3JpdGVsKHBhZGRyLkxvdywgJihwU2VuZEJkLT5Ib3N0QWRkci5Mb3cpKTsKKworICAgICAgICAgICAgLyogU2V0dXAgdGhlIGNvbnRyb2wgZmxhZ3MgYW5kIHNlbmQgYnVmZmVyIHNpemUuICovCisgICAgICAgICAgICBWYWx1ZTMyID0gKExlbiA8PCAxNikgfCBwUGFja2V0LT5GbGFnczsKKworICAgICAgICAgICAgSWR4ID0gKElkeCArIDEpICYgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKworICAgICAgICAgICAgRnJhZ0NvdW50Kys7CisgICAgICAgICAgICBpZiAoRnJhZ0NvdW50ID49IHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlMzIgfD0gU05EX0JEX0ZMQUdfRU5EOworICAgICAgICAgICAgICAgIGlmIChWYWx1ZTMyICE9IHBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChWYWx1ZTMyLCAmKHBTZW5kQmQtPnUxLkxlbl9GbGFncykpOworICAgICAgICAgICAgICAgICAgICBwU2hhZG93U2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocFBhY2tldC0+RmxhZ3MgJiBTTkRfQkRfRkxBR19WTEFOX1RBRykgeworICAgICAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwocFBhY2tldC0+VmxhblRhZywgJihwU2VuZEJkLT51Mi5WbGFuVGFnKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChWYWx1ZTMyICE9IHBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChWYWx1ZTMyLCAmKHBTZW5kQmQtPnUxLkxlbl9GbGFncykpOworICAgICAgICAgICAgICAgICAgICBwU2hhZG93U2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocFBhY2tldC0+RmxhZ3MgJiBTTkRfQkRfRkxBR19WTEFOX1RBRykgeworICAgICAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwocFBhY2tldC0+VmxhblRhZywgJihwU2VuZEJkLT51Mi5WbGFuVGFnKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU2VuZEJkKys7CisgICAgICAgICAgICBwU2hhZG93U2VuZEJkKys7CisgICAgICAgICAgICBpZiAoSWR4ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFswXTsKKyAgICAgICAgICAgICAgICBwU2hhZG93U2VuZEJkID0gJnBEZXZpY2UtPlNoYWRvd1NlbmRCZFswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBmb3IgKi8KKworICAgICAgICAvKiBQdXQgdGhlIHBhY2tldCBkZXNjcmlwdG9yIGluIHRoZSBBY3RpdmVRLiAqLworICAgICAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisKKyAgICAgICAgd21iKCk7CisgICAgICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlNlbmROaWNQcm9kSWR4WzBdLkxvdywgSWR4KTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IoRnJhZ0NvdW50ID0gMDsgOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXIgdG8gdGhlIHNlbmQgYnVmZmVyIGZyYWdtZW50LiAqLworICAgICAgICAgICAgTU1fTWFwVHhEbWEocERldmljZSwgcFBhY2tldCwgJnBTZW5kQmQtPkhvc3RBZGRyLCAmTGVuLCBGcmFnQ291bnQpOworCisgICAgICAgICAgICBwU2VuZEJkLT51Mi5WbGFuVGFnID0gcFBhY2tldC0+VmxhblRhZzsKKworICAgICAgICAgICAgLyogU2V0dXAgdGhlIGNvbnRyb2wgZmxhZ3MgYW5kIHNlbmQgYnVmZmVyIHNpemUuICovCisgICAgICAgICAgICBWYWx1ZTMyID0gKExlbiA8PCAxNikgfCBwUGFja2V0LT5GbGFnczsKKworICAgICAgICAgICAgSWR4ID0gKElkeCArIDEpICYgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKworICAgICAgICAgICAgRnJhZ0NvdW50Kys7CisgICAgICAgICAgICBpZiAoRnJhZ0NvdW50ID49IHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzIgfCBTTkRfQkRfRkxBR19FTkQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNlbmRCZC0+dTEuTGVuX0ZsYWdzID0gVmFsdWUzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTZW5kQmQrKzsKKyAgICAgICAgICAgIGlmIChJZHggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2VuZEJkID0gJnBEZXZpY2UtPnBTZW5kQmRWaXJ0WzBdOworICAgICAgICAgICAgfQorICAgICAgICB9IC8qIGZvciAqLworCisgICAgICAgIC8qIFB1dCB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW4gdGhlIEFjdGl2ZVEuICovCisgICAgICAgIFFRX1B1c2hUYWlsKCZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKworICAgICAgICB3bWIoKTsKKyAgICAgICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guU2VuZEhvc3RQcm9kSWR4WzBdLkxvdywgSWR4KTsKKworICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgcHJvZHVjZXIgaW5kZXguICovCisgICAgcERldmljZS0+U2VuZFByb2RJZHggPSBJZHg7CisKKyAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworTE1fU1RBVFVTCitMTV9TZW5kUGFja2V0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQoreworICAgIExNX1VJTlQzMiBGcmFnQ291bnQ7CisgICAgUFQzX1NORF9CRCBwU2VuZEJkLCBwVG1wU2VuZEJkLCBwU2hhZG93U2VuZEJkOworICAgIFQzX1NORF9CRCBOaWNTZW5kQmRBcnJbTUFYX0ZSQUdNRU5UX0NPVU5UXTsKKyAgICBMTV9VSU5UMzIgU3RhcnRJZHgsIElkeDsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgLyogSW5pdGFsaXplIHRoZSBzZW5kIGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KKyAgICAgICAgU3RhcnRJZHggPSBJZHggPSBwRGV2aWNlLT5TZW5kUHJvZElkeDsKKworICAgICAgICBpZiAocERldmljZS0+TmljU2VuZEJkKQorICAgICAgICB7CisgICAgICAgICAgICBwVG1wU2VuZEJkID0gcFNlbmRCZCA9ICZOaWNTZW5kQmRBcnJbMF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwVG1wU2VuZEJkID0gcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFtJZHhdOworICAgICAgICB9CisKKyAgICAgICAgLyogTmV4dCBwcm9kdWNlciBpbmRleC4gKi8KKyAgICAgICAgZm9yKEZyYWdDb3VudCA9IDA7IDsgKQorICAgICAgICB7CisgICAgICAgICAgICBMTV9VSU5UMzIgVmFsdWUzMiwgTGVuOworCisgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwb2ludGVyIHRvIHRoZSBzZW5kIGJ1ZmZlciBmcmFnbWVudC4gKi8KKyAgICAgICAgICAgIE1NX01hcFR4RG1hKHBEZXZpY2UsIHBQYWNrZXQsICZwU2VuZEJkLT5Ib3N0QWRkciwgJkxlbiwgRnJhZ0NvdW50KTsKKworICAgICAgICAgICAgcFNlbmRCZC0+dTIuVmxhblRhZyA9IHBQYWNrZXQtPlZsYW5UYWc7CisKKyAgICAgICAgICAgIC8qIFNldHVwIHRoZSBjb250cm9sIGZsYWdzIGFuZCBzZW5kIGJ1ZmZlciBzaXplLiAqLworICAgICAgICAgICAgVmFsdWUzMiA9IChMZW4gPDwgMTYpIHwgcFBhY2tldC0+RmxhZ3M7CisKKyAgICAgICAgICAgIElkeCA9IChJZHggKyAxKSAmIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7CisKKyAgICAgICAgICAgIEZyYWdDb3VudCsrOworICAgICAgICAgICAgaWYgKEZyYWdDb3VudCA+PSBwUGFja2V0LT51LlR4LkZyYWdDb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyIHwgU05EX0JEX0ZMQUdfRU5EOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU2VuZEJkKys7CisgICAgICAgICAgICBpZiAoKElkeCA9PSAwKSAmJiAhcERldmljZS0+TmljU2VuZEJkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0gLyogZm9yICovCisgICAgICAgIGlmIChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChMTV9UZXN0NEdCb3VuZGFyeShwRGV2aWNlLCBwUGFja2V0LCBwVG1wU2VuZEJkKSA9PQorICAgICAgICAgICAgICAgIExNX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChNTV9Db2FsZXNjZVR4QnVmZmVyKHBEZXZpY2UsIHBQYWNrZXQpICE9IExNX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUVFfUHVzaEhlYWQoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgLyogUHV0IHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbiB0aGUgQWN0aXZlUS4gKi8KKyAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisKKyAgICBpZiAocERldmljZS0+TmljU2VuZEJkKQorICAgIHsKKyAgICAgICAgcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFtTdGFydElkeF07CisgICAgICAgIHBTaGFkb3dTZW5kQmQgPSAmcERldmljZS0+U2hhZG93U2VuZEJkW1N0YXJ0SWR4XTsKKworICAgICAgICB3aGlsZSAoU3RhcnRJZHggIT0gSWR4KQorICAgICAgICB7CisgICAgICAgICAgICBMTV9VSU5UMzIgVmFsdWUzMjsKKworICAgICAgICAgICAgaWYgKChWYWx1ZTMyID0gcFRtcFNlbmRCZC0+SG9zdEFkZHIuSGlnaCkgIT0KKyAgICAgICAgICAgICAgICBwU2hhZG93U2VuZEJkLT5Ib3N0QWRkci5IaWdoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChWYWx1ZTMyLCAmKHBTZW5kQmQtPkhvc3RBZGRyLkhpZ2gpKTsKKyAgICAgICAgICAgICAgICBwU2hhZG93U2VuZEJkLT5Ib3N0QWRkci5IaWdoID0gVmFsdWUzMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19yYXdfd3JpdGVsKHBUbXBTZW5kQmQtPkhvc3RBZGRyLkxvdywgJihwU2VuZEJkLT5Ib3N0QWRkci5Mb3cpKTsKKworICAgICAgICAgICAgaWYgKChWYWx1ZTMyID0gcFRtcFNlbmRCZC0+dTEuTGVuX0ZsYWdzKSAhPQorICAgICAgICAgICAgICAgIHBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoVmFsdWUzMiwgJihwU2VuZEJkLT51MS5MZW5fRmxhZ3MpKTsKKyAgICAgICAgICAgICAgICBwU2hhZG93U2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocFBhY2tldC0+RmxhZ3MgJiBTTkRfQkRfRkxBR19WTEFOX1RBRykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwocFRtcFNlbmRCZC0+dTIuVmxhblRhZywgJihwU2VuZEJkLT51Mi5WbGFuVGFnKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YXJ0SWR4ID0gKFN0YXJ0SWR4ICsgMSkgJiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVF9NQVNLOworICAgICAgICAgICAgaWYgKFN0YXJ0SWR4ID09IDApCisgICAgICAgICAgICAgICAgcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFswXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwU2VuZEJkKys7CisgICAgICAgICAgICBwVG1wU2VuZEJkKys7CisgICAgICAgIH0KKyAgICAgICAgd21iKCk7CisgICAgICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlNlbmROaWNQcm9kSWR4WzBdLkxvdywgSWR4KTsKKworICAgICAgICBpZihUM19DSElQX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0NISVBfUkVWXzU3MDBfQlgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlNlbmROaWNQcm9kSWR4WzBdLkxvdywgSWR4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3bWIoKTsKKyAgICAgICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guU2VuZEhvc3RQcm9kSWR4WzBdLkxvdywgSWR4KTsKKworICAgICAgICBpZihUM19DSElQX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0NISVBfUkVWXzU3MDBfQlgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlNlbmRIb3N0UHJvZElkeFswXS5Mb3csIElkeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVcGRhdGUgdGhlIFNlbmRCZExlZnQgY291bnQuICovCisgICAgYXRvbWljX3N1YihwUGFja2V0LT51LlR4LkZyYWdDb3VudCwgJnBEZXZpY2UtPlNlbmRCZExlZnQpOworCisgICAgLyogVXBkYXRlIHRoZSBwcm9kdWNlciBpbmRleC4gKi8KKyAgICBwRGV2aWNlLT5TZW5kUHJvZElkeCA9IElkeDsKKworICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKworU1RBVElDIExNX1NUQVRVUworTE1fVGVzdDRHQm91bmRhcnkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQsCisgICAgUFQzX1NORF9CRCBwU2VuZEJkKQoreworICAgIGludCBGcmFnQ291bnQ7CisgICAgTE1fVUlOVDMyIElkeCwgQmFzZSwgTGVuOworCisgICAgSWR4ID0gcERldmljZS0+U2VuZFByb2RJZHg7CisgICAgZm9yKEZyYWdDb3VudCA9IDA7IDsgKQorICAgIHsKKyAgICAgICAgTGVuID0gcFNlbmRCZC0+dTEuTGVuX0ZsYWdzID4+IDE2OworICAgICAgICBpZiAoKChCYXNlID0gcFNlbmRCZC0+SG9zdEFkZHIuTG93KSA+IDB4ZmZmZmRjYzApICYmCisgICAgICAgICAgICAocFNlbmRCZC0+SG9zdEFkZHIuSGlnaCA9PSAwKSAmJgorICAgICAgICAgICAgKChCYXNlICsgOCArIExlbikgPCBCYXNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIEZyYWdDb3VudCsrOworICAgICAgICBpZiAoRnJhZ0NvdW50ID49IHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwU2VuZEJkKys7CisgICAgICAgIGlmICghcERldmljZS0+TmljU2VuZEJkKQorICAgICAgICB7CisgICAgICAgICAgICBJZHggPSAoSWR4ICsgMSkgJiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVF9NQVNLOworICAgICAgICAgICAgaWYgKElkeCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK19faW5saW5lIHN0YXRpYyB1bnNpZ25lZCBsb25nCitDb21wdXRlQ3JjMzIoCit1bnNpZ25lZCBjaGFyICpwQnVmZmVyLAordW5zaWduZWQgbG9uZyBCdWZmZXJTaXplKSB7CisgICAgdW5zaWduZWQgbG9uZyBSZWc7CisgICAgdW5zaWduZWQgbG9uZyBUbXA7CisgICAgdW5zaWduZWQgbG9uZyBqLCBrOworCisgICAgUmVnID0gMHhmZmZmZmZmZjsKKworICAgIGZvcihqID0gMDsgaiA8IEJ1ZmZlclNpemU7IGorKykKKyAgICB7CisgICAgICAgIFJlZyBePSBwQnVmZmVyW2pdOworCisgICAgICAgIGZvcihrID0gMDsgayA8IDg7IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgVG1wID0gUmVnICYgMHgwMTsKKworICAgICAgICAgICAgUmVnID4+PSAxOworCisgICAgICAgICAgICBpZihUbXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVnIF49IDB4ZWRiODgzMjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gflJlZzsKK30gLyogQ29tcHV0ZUNyYzMyICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgcm91dGluZSBzZXRzIHRoZSByZWNlaXZlIGNvbnRyb2wgcmVnaXN0ZXIgYWNjb3JkaW5nIHRvIFJlY2VpdmVNYXNrICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTCitMTV9TZXRSZWNlaXZlTWFzaygKK1BMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKK0xNX1VJTlQzMiBNYXNrKSB7CisgICAgTE1fVUlOVDMyIFJlY2VpdmVNYXNrOworICAgIExNX1VJTlQzMiBSeE1vZGU7CisgICAgTE1fVUlOVDMyIGosIGs7CisKKyAgICBSZWNlaXZlTWFzayA9IE1hc2s7CisKKyAgICBSeE1vZGUgPSBwRGV2aWNlLT5SeE1vZGU7CisKKyAgICBpZihNYXNrICYgTE1fQUNDRVBUX1VOSUNBU1QpCisgICAgeworICAgICAgICBNYXNrICY9IH5MTV9BQ0NFUFRfVU5JQ0FTVDsKKyAgICB9CisKKyAgICBpZihNYXNrICYgTE1fQUNDRVBUX01VTFRJQ0FTVCkKKyAgICB7CisgICAgICAgIE1hc2sgJj0gfkxNX0FDQ0VQVF9NVUxUSUNBU1Q7CisgICAgfQorCisgICAgaWYoTWFzayAmIExNX0FDQ0VQVF9BTExfTVVMVElDQVNUKQorICAgIHsKKyAgICAgICAgTWFzayAmPSB+TE1fQUNDRVBUX0FMTF9NVUxUSUNBU1Q7CisgICAgfQorCisgICAgaWYoTWFzayAmIExNX0FDQ0VQVF9CUk9BRENBU1QpCisgICAgeworICAgICAgICBNYXNrICY9IH5MTV9BQ0NFUFRfQlJPQURDQVNUOworICAgIH0KKworICAgIFJ4TW9kZSAmPSB+UlhfTU9ERV9QUk9NSVNDVU9VU19NT0RFOworICAgIGlmKE1hc2sgJiBMTV9QUk9NSVNDVU9VU19NT0RFKQorICAgIHsKKyAgICAgICAgUnhNb2RlIHw9IFJYX01PREVfUFJPTUlTQ1VPVVNfTU9ERTsKKyAgICAgICAgTWFzayAmPSB+TE1fUFJPTUlTQ1VPVVNfTU9ERTsKKyAgICB9CisKKyAgICBSeE1vZGUgJj0gfihSWF9NT0RFX0FDQ0VQVF9SVU5UUyB8IFJYX01PREVfQUNDRVBUX09WRVJTSVpFRCk7CisgICAgaWYoTWFzayAmIExNX0FDQ0VQVF9FUlJPUl9QQUNLRVQpCisgICAgeworICAgICAgICBSeE1vZGUgfD0gUlhfTU9ERV9BQ0NFUFRfUlVOVFMgfCBSWF9NT0RFX0FDQ0VQVF9PVkVSU0laRUQ7CisgICAgICAgIE1hc2sgJj0gfkxNX0FDQ0VQVF9FUlJPUl9QQUNLRVQ7CisgICAgfQorCisgICAgLyogTWFrZSBzdXJlIGFsbCB0aGUgYml0cyBhcmUgdmFsaWQgYmVmb3JlIGNvbW1pdHRpbmcgY2hhbmdlcy4gKi8KKyAgICBpZihNYXNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworICAgIH0KKworICAgIC8qIENvbW1pdCB0aGUgbmV3IGZpbHRlci4gKi8KKyAgICBwRGV2aWNlLT5SeE1vZGUgPSBSeE1vZGU7CisgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBSeE1vZGUpOworCisgICAgcERldmljZS0+UmVjZWl2ZU1hc2sgPSBSZWNlaXZlTWFzazsKKworICAgIC8qIFNldCB1cCB0aGUgTUMgaGFzaCB0YWJsZS4gKi8KKyAgICBpZihSZWNlaXZlTWFzayAmIExNX0FDQ0VQVF9BTExfTVVMVElDQVNUKQorICAgIHsKKyAgICAgICAgZm9yKGsgPSAwOyBrIDwgNDsgaysrKQorICAgICAgICB7CisgICAgICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5IYXNoUmVnW2tdLCAweGZmZmZmZmZmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKFJlY2VpdmVNYXNrICYgTE1fQUNDRVBUX01VTFRJQ0FTVCkKKyAgICB7CisgICAgICAgIExNX1VJTlQzMiBIYXNoUmVnWzRdOworCisgICAgICAgIEhhc2hSZWdbMF0gPSAwOyBIYXNoUmVnWzFdID0gMDsgSGFzaFJlZ1syXSA9IDA7IEhhc2hSZWdbM10gPSAwOworICAgICAgICBmb3IoaiA9IDA7IGogPCBwRGV2aWNlLT5NY0VudHJ5Q291bnQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgTE1fVUlOVDMyIFJlZ0luZGV4OworICAgICAgICAgICAgTE1fVUlOVDMyIEJpdHBvczsKKyAgICAgICAgICAgIExNX1VJTlQzMiBDcmMzMjsKKworICAgICAgICAgICAgQ3JjMzIgPSBDb21wdXRlQ3JjMzIocERldmljZS0+TWNUYWJsZVtqXSwgRVRIRVJORVRfQUREUkVTU19TSVpFKTsKKworICAgICAgICAgICAgLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgNyBiaXRzIG9mIHRoZSBDUkMzMiAobm8gaW52ZXJzaW9uKSwgKi8KKyAgICAgICAgICAgIC8qIGFyZSB1c2VkIHRvIGluZGV4IGludG8gb25lIG9mIHRoZSBwb3NzaWJsZSAxMjggYml0IHBvc2l0aW9ucy4gKi8KKyAgICAgICAgICAgIEJpdHBvcyA9IH5DcmMzMiAmIDB4N2Y7CisKKyAgICAgICAgICAgIC8qIEhhc2ggcmVnaXN0ZXIgaW5kZXguICovCisgICAgICAgICAgICBSZWdJbmRleCA9IChCaXRwb3MgJiAweDYwKSA+PiA1OworCisgICAgICAgICAgICAvKiBCaXQgdG8gdHVybiBvbiB3aXRoaW4gYSBoYXNoIHJlZ2lzdGVyLiAqLworICAgICAgICAgICAgQml0cG9zICY9IDB4MWY7CisKKyAgICAgICAgICAgIC8qIEVuYWJsZSB0aGUgbXVsdGljYXN0IGJpdC4gKi8KKyAgICAgICAgICAgIEhhc2hSZWdbUmVnSW5kZXhdIHw9ICgxIDw8IEJpdHBvcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBSRVZfQVggaGFzIHByb2JsZW0gd2l0aCBtdWx0aWNhc3QgZmlsdGVyaW5nIHdoZXJlIGl0IHVzZXMgYm90aCAqLworICAgICAgICAvKiBEQSBhbmQgU0EgdG8gcGVyZm9ybSBoYXNoaW5nLiAqLworICAgICAgICBmb3IoayA9IDA7IGsgPCA0OyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLkhhc2hSZWdba10sIEhhc2hSZWdba10pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFJlamVjdCBhbGwgbXVsdGljYXN0IGZyYW1lcy4gKi8KKyAgICAgICAgZm9yKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5IYXNoUmVnW2pdLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEJ5IGRlZmF1bHQsIFRpZ29uMyB3aWxsIGFjY2VwdCBicm9hZGNhc3QgZnJhbWVzLiAgV2UgbmVlZCB0byBzZXR1cCAqLworICAgIGlmKFJlY2VpdmVNYXNrICYgTE1fQUNDRVBUX0JST0FEQ0FTVCkKKyAgICB7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMV9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uUnVsZSwKKyAgICAgICAgICAgIFJFSkVDVF9CUk9BRENBU1RfUlVMRTFfUlVMRSAmIFJDVl9ESVNBQkxFX1JVTEVfTUFTSyk7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMV9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uVmFsdWUsCisgICAgICAgICAgICBSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1ZBTFVFICYgUkNWX0RJU0FCTEVfUlVMRV9NQVNLKTsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUyX1JFSkVDVF9CUk9BRENBU1RfSURYXS5SdWxlLAorICAgICAgICAgICAgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9SVUxFICYgUkNWX0RJU0FCTEVfUlVMRV9NQVNLKTsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUyX1JFSkVDVF9CUk9BRENBU1RfSURYXS5WYWx1ZSwKKyAgICAgICAgICAgIFJFSkVDVF9CUk9BRENBU1RfUlVMRTFfVkFMVUUgJiBSQ1ZfRElTQUJMRV9SVUxFX01BU0spOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTFfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlJ1bGUsCisgICAgICAgICAgICBSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1JVTEUpOworICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTFfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlZhbHVlLAorICAgICAgICAgICAgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9WQUxVRSk7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMl9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uUnVsZSwKKyAgICAgICAgICAgIFJFSkVDVF9CUk9BRENBU1RfUlVMRTJfUlVMRSk7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMl9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uVmFsdWUsCisgICAgICAgICAgICBSRUpFQ1RfQlJPQURDQVNUX1JVTEUyX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKiBkaXNhYmxlIHRoZSByZXN0IG9mIHRoZSBydWxlcy4gKi8KKyAgICBmb3IoaiA9IFJDVl9MQVNUX1JVTEVfSURYOyBqIDwgMTY7IGorKykKKyAgICB7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW2pdLlJ1bGUsIDApOworICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tqXS5WYWx1ZSwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfSAvKiBMTV9TZXRSZWNlaXZlTWFzayAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgYW5kIHB1dCB0aGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyIGVuZ2luZXMgaW4gICAqLworLyogICAgYW4gaWRsZSBzdGF0ZS4gIEFsc28gYWJvcnRzIGFsbCBwZW5kaW5nIHNlbmQgcmVxdWVzdHMgYW5kIHJlY2VpdmUgICAgICAgKi8KKy8qICAgIGJ1ZmZlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTCitMTV9BYm9ydCgKK1BMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKyAgICBQTE1fUEFDS0VUIHBQYWNrZXQ7CisgICAgTE1fVUlOVCBJZHg7CisKKyAgICBMTV9EaXNhYmxlSW50ZXJydXB0KHBEZXZpY2UpOworCisgICAgLyogRGlzYWJsZSBhbGwgdGhlIHN0YXRlIG1hY2hpbmVzLiAqLworICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19NQUNfUlhfRU5HSU5FLExNX0RJU0FCTEUpOworICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19SWF9CRF9JTklUSUFUT1IsTE1fRElTQUJMRSk7CisgICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX1JYX0xJU1RfUExNVCxMTV9ESVNBQkxFKTsKKyAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfUlhfTElTVF9TRUxFQ1RPUixMTV9ESVNBQkxFKTsKKyAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfUlhfREFUQV9JTklUSUFUT1IsTE1fRElTQUJMRSk7CisgICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX1JYX0RBVEFfQ09NUCxMTV9ESVNBQkxFKTsKKyAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfUlhfQkRfQ09NUCxMTV9ESVNBQkxFKTsKKworICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19TRU5EX0JEX1NFTEVDVE9SLExNX0RJU0FCTEUpOworICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19TRU5EX0JEX0lOSVRJQVRPUixMTV9ESVNBQkxFKTsKKyAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfU0VORF9EQVRBX0lOSVRJQVRPUixMTV9ESVNBQkxFKTsKKyAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfRE1BX1JELExNX0RJU0FCTEUpOworICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19TRU5EX0RBVEFfQ09NUCxMTV9ESVNBQkxFKTsKKyAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfRE1BX0NPTVAsTE1fRElTQUJMRSk7CisgICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX1NFTkRfQkRfQ09NUCxMTV9ESVNBQkxFKTsKKworICAgIC8qIENsZWFyIFRERSBiaXQgKi8KKyAgICBwRGV2aWNlLT5NYWNNb2RlICY9IH5NQUNfTU9ERV9FTkFCTEVfVERFOworICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOworCisgICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX01BQ19UWF9FTkdJTkUsTE1fRElTQUJMRSk7CisgICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX0hPU1RfQ09BTEVTSU5HLExNX0RJU0FCTEUpOworICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19ETUFfV1IsTE1fRElTQUJMRSk7CisgICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX01CVUZfQ0xVU1RFUl9GUkVFLExNX0RJU0FCTEUpOworCisgICAgLyogUmVzZXQgYWxsIEZUUXMgKi8KKyAgICBSRUdfV1IocERldmljZSwgRnRxLlJlc2V0LCAweGZmZmZmZmZmKTsKKyAgICBSRUdfV1IocERldmljZSwgRnRxLlJlc2V0LCAweDApOworCisgICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX01CVUZfTUFOQUdFUixMTV9ESVNBQkxFKTsKKyAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfTUVNX0FSQklUT1IsTE1fRElTQUJMRSk7CisKKyAgICBNTV9BQ1FVSVJFX0lOVF9MT0NLKHBEZXZpY2UpOworCisgICAgLyogQWJvcnQgcGFja2V0cyB0aGF0IGhhdmUgYWxyZWFkeSBxdWV1ZWQgdG8gZ28gb3V0LiAqLworICAgIHBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgUVFfUG9wSGVhZCgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lcik7CisgICAgd2hpbGUocFBhY2tldCkKKyAgICB7CisKKyAgICAgICAgcFBhY2tldC0+UGFja2V0U3RhdHVzID0gTE1fU1RBVFVTX1RSQU5TTUlUX0FCT1JURUQ7CisgICAgICAgIHBEZXZpY2UtPlR4Q291bnRlcnMuVHhQYWNrZXRBYm9ydGVkQ250Kys7CisKKyAgICAgICAgYXRvbWljX2FkZChwUGFja2V0LT51LlR4LkZyYWdDb3VudCwgJnBEZXZpY2UtPlNlbmRCZExlZnQpOworCisgICAgICAgIFFRX1B1c2hUYWlsKCZwRGV2aWNlLT5UeFBhY2tldFhtaXR0ZWRRLkNvbnRhaW5lciwgcFBhY2tldCk7CisKKyAgICAgICAgcFBhY2tldCA9IChQTE1fUEFDS0VUKQorICAgICAgICAgICAgUVFfUG9wSGVhZCgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lcik7CisgICAgfQorCisgICAgLyogQ2xlYW51cCB0aGUgcmVjZWl2ZSByZXR1cm4gcmluZ3MuICovCisgICAgTE1fU2VydmljZVJ4SW50ZXJydXB0KHBEZXZpY2UpOworCisgICAgLyogRG9uJ3Qgd2FudCB0byBpbmRpY2F0ZSByeCBwYWNrZXRzIGluIE5kaXMgbWluaXBvcnQgc2h1dGRvd24gY29udGV4dC4gKi8KKyAgICAvKiBEb2luZyBzbyBtYXkgY2F1c2Ugc3lzdGVtIGNyYXNoLiAqLworICAgIGlmKCFwRGV2aWNlLT5TaHV0dGluZ0Rvd24pCisgICAgeworICAgICAgICAvKiBJbmRpY2F0ZSBwYWNrZXRzIHRvIHRoZSBwcm90b2NvbC4gKi8KKyAgICAgICAgTU1fSW5kaWNhdGVUeFBhY2tldHMocERldmljZSk7CisKKyAgICAgICAgLyogSW5kaWNhdGUgcmVjZWl2ZWQgcGFja2V0cyB0byB0aGUgcHJvdG9jb2xzLiAqLworICAgICAgICBNTV9JbmRpY2F0ZVJ4UGFja2V0cyhwRGV2aWNlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogTW92ZSB0aGUgcmVjZWl2ZSBwYWNrZXQgZGVzY3JpcHRvcnMgaW4gdGhlIFJlY2VpdmVkUSB0byB0aGUgKi8KKyAgICAgICAgLyogZnJlZSBxdWV1ZS4gKi8KKyAgICAgICAgZm9yKDsgOykKKyAgICAgICAgeworICAgICAgICAgICAgcFBhY2tldCA9IChQTE1fUEFDS0VUKSBRUV9Qb3BIZWFkKAorICAgICAgICAgICAgICAgICZwRGV2aWNlLT5SeFBhY2tldFJlY2VpdmVkUS5Db250YWluZXIpOworICAgICAgICAgICAgaWYocFBhY2tldCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFuIHVwIHRoZSBTdGQgUmVjZWl2ZSBQcm9kdWNlciByaW5nLiAqLworICAgIElkeCA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZTdGRDb25JZHg7CisKKyAgICB3aGlsZShJZHggIT0gcERldmljZS0+UnhTdGRQcm9kSWR4KSB7CisgICAgICAgIHBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgKE1NX1VJTlRfUFRSKHBEZXZpY2UtPnBQYWNrZXREZXNjQmFzZSkgKworICAgICAgICAgICAgTU1fVUlOVF9QVFIocERldmljZS0+cFJ4U3RkQmRWaXJ0W0lkeF0uT3BhcXVlKSk7CisKKyAgICAgICAgUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKworICAgICAgICBJZHggPSAoSWR4ICsgMSkgJiBUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVF9NQVNLOworICAgIH0gLyogd2hpbGUgKi8KKworICAgIC8qIFJlaW5pdGlhbGl6ZSBvdXIgY29weSBvZiB0aGUgaW5kaWNlcy4gKi8KKyAgICBwRGV2aWNlLT5SeFN0ZFByb2RJZHggPSAwOworCisjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAorICAgIC8qIENsZWFuIHVwIHRoZSBKdW1ibyBSZWNlaXZlIFByb2R1Y2VyIHJpbmcuICovCisgICAgSWR4ID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdkp1bWJvQ29uSWR4OworCisgICAgd2hpbGUoSWR4ICE9IHBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4KSB7CisgICAgICAgIHBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgKE1NX1VJTlRfUFRSKHBEZXZpY2UtPnBQYWNrZXREZXNjQmFzZSkgKworICAgICAgICAgICAgTU1fVUlOVF9QVFIocERldmljZS0+cFJ4SnVtYm9CZFZpcnRbSWR4XS5PcGFxdWUpKTsKKworICAgICAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCisgICAgICAgIElkeCA9IChJZHggKyAxKSAmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKyAgICB9IC8qIHdoaWxlICovCisKKyAgICAvKiBSZWluaXRpYWxpemUgb3VyIGNvcHkgb2YgdGhlIGluZGljZXMuICovCisgICAgcERldmljZS0+UnhKdW1ib1Byb2RJZHggPSAwOworI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKworICAgIE1NX1JFTEVBU0VfSU5UX0xPQ0socERldmljZSk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBzdGF0aXN0aXMgQmxvY2sgKi8KKyAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzID0gMDsKKyAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+UmN2U3RkQ29uSWR4ID0gMDsKKyAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+UmN2SnVtYm9Db25JZHggPSAwOworICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZNaW5pQ29uSWR4ID0gMDsKKworICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30gLyogTE1fQWJvcnQgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRGlzYWJsZSB0aGUgaW50ZXJydXB0IGFuZCBwdXQgdGhlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciBlbmdpbmVzIGluICAgKi8KKy8qICAgIGFuIGlkbGUgc3RhdGUuICBBYm9ydHMgYWxsIHBlbmRpbmcgc2VuZCByZXF1ZXN0cyBhbmQgcmVjZWl2ZSBidWZmZXJzLiAgICovCisvKiAgICBBbHNvIGZyZWUgYWxsIHRoZSByZWNlaXZlIGJ1ZmZlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xNX1NUQVRVUworTE1fSGFsdCgKK1BMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkgeworICAgIFBMTV9QQUNLRVQgcFBhY2tldDsKKyAgICBMTV9VSU5UMzIgRW50cnlDbnQ7CisKKyAgICBMTV9BYm9ydChwRGV2aWNlKTsKKworICAgIC8qIEdldCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHF1ZXVlLiAqLworICAgIEVudHJ5Q250ID0gUVFfR2V0RW50cnlDbnQoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKKworICAgIC8qIE1ha2Ugc3VyZSBhbGwgdGhlIHBhY2tldHMgaGF2ZSBiZWVuIGFjY291bnRlZCBmb3IuICovCisgICAgZm9yKEVudHJ5Q250ID0gMDsgRW50cnlDbnQgPCBwRGV2aWNlLT5SeFBhY2tldERlc2NDbnQ7IEVudHJ5Q250KyspCisgICAgeworICAgICAgICBwUGFja2V0ID0gKFBMTV9QQUNLRVQpIFFRX1BvcEhlYWQoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKKyAgICAgICAgaWYgKHBQYWNrZXQgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIE1NX0ZyZWVSeEJ1ZmZlcihwRGV2aWNlLCBwUGFja2V0KTsKKworICAgICAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworICAgIH0KKworICAgIExNX1Jlc2V0Q2hpcChwRGV2aWNlKTsKKworICAgIC8qIFJlc3RvcmUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLworICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgUENJX0NBQ0hFX0xJTkVfU0laRV9SRUcsCisgICAgICAgIHBEZXZpY2UtPlNhdmVkQ2FjaGVMaW5lUmVnKTsKKyAgICBMTV9SZWdXckluZChwRGV2aWNlLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRF9SRUcsCisgICAgICAgIChwRGV2aWNlLT5TdWJzeXN0ZW1JZCA8PCAxNikgfCBwRGV2aWNlLT5TdWJzeXN0ZW1WZW5kb3JJZCk7CisKKyAgICAvKiBSZXByb2dyYW0gdGhlIE1BQyBhZGRyZXNzLiAqLworICAgIExNX1NldE1hY0FkZHJlc3MocERldmljZSwgcERldmljZS0+Tm9kZUFkZHJlc3MpOworCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfSAvKiBMTV9IYWx0ICovCisKKworU1RBVElDIExNX1NUQVRVUworTE1fUmVzZXRDaGlwKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKyAgICBMTV9VSU5UMzIgVmFsdWUzMjsKKyAgICBMTV9VSU5UMzIgajsKKworICAgIC8qIFdhaXQgZm9yIGFjY2VzcyB0byB0aGUgbnZyYW0gaW50ZXJmYWNlIGJlZm9yZSByZXNldHRpbmcuICBUaGlzIGlzICovCisgICAgLyogYSB3b3JrYXJvdW5kIHRvIHByZXZlbnQgRUVQUk9NIGNvcnJ1cHRpb24uICovCisgICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19BU0lDX1JFVl81NzAwICYmCisgICAgICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMSkKKyAgICB7CisgICAgICAgIC8qIFJlcXVlc3QgYWNjZXNzIHRvIHRoZSBmbGFzaCBpbnRlcmZhY2UuICovCisgICAgICAgIFJFR19XUihwRGV2aWNlLCBOdnJhbS5Td0FyYiwgU1dfQVJCX1JFUV9TRVQxKTsKKworICAgICAgICBmb3IoaiA9IDA7IGogPCAxMDAwMDA7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBOdnJhbS5Td0FyYik7CisgICAgICAgICAgICBpZihWYWx1ZTMyICYgU1dfQVJCX0dOVDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdsb2JhbCByZXNldC4gKi8KKyAgICBSRUdfV1IocERldmljZSwgR3JjLk1pc2NDZmcsIEdSQ19NSVNDX0NGR19DT1JFX0NMT0NLX1JFU0VUKTsKKyAgICBNTV9XYWl0KDQwKTsgTU1fV2FpdCg0MCk7IE1NX1dhaXQoNDApOworCisgICAgLyogbWFrZSBzdXJlIHdlIHJlLWVuYWJsZSBpbmRpcmVjdCBhY2Nlc3NlcyAqLworICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX01JU0NfSE9TVF9DVFJMX1JFRywKKyAgICAgICAgcERldmljZS0+TWlzY0hvc3RDdHJsKTsKKworICAgIC8qIFNldCBNQVggUENJIHJldHJ5IHRvIHplcm8uICovCisgICAgVmFsdWUzMiA9IFQzX1BDSV9TVEFURV9QQ0lfUk9NX0VOQUJMRSB8IFQzX1BDSV9TVEFURV9QQ0lfUk9NX1JFVFJZX0VOQUJMRTsKKyAgICBpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkKKyAgICB7CisgICAgICAgIGlmICghKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlMzIgfD0gVDNfUENJX1NUQVRFX1JFVFJZX1NBTUVfRE1BOworICAgICAgICB9CisgICAgfQorICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX1NUQVRFX1JFRywgVmFsdWUzMik7CisKKyAgICAvKiBSZXN0b3JlIFBDSSBjb21tYW5kIHJlZ2lzdGVyLiAqLworICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgUENJX0NPTU1BTkRfUkVHLAorICAgICAgICBwRGV2aWNlLT5QY2lDb21tYW5kU3RhdHVzV29yZHMpOworCisgICAgLyogRGlzYWJsZSBQQ0ktWCByZWxheGVkIG9yZGVyaW5nIGJpdC4gKi8KKyAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJWF9DQVBfUkVHLCAmVmFsdWUzMik7CisgICAgVmFsdWUzMiAmPSB+UENJWF9FTkFCTEVfUkVMQVhFRF9PUkRFUklORzsKKyAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFBDSVhfQ0FQX1JFRywgVmFsdWUzMik7CisKKyAgICAvKiBFbmFibGUgbWVtb3J5IGFyYml0ZXIuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIE1lbUFyYml0ZXIuTW9kZSwgVDNfTUVNX0FSQklURVJfTU9ERV9FTkFCTEUpOworCisjaWZkZWYgQklHX0VORElBTl9QQ0kgICAgICAvKiBUaGlzIGZyb20gamZkICovCisgICAgICAgIFZhbHVlMzIgPSBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQXwKKyAgICAgICAgICAgICAgICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQTsKKyNlbHNlCisjaWZkZWYgQklHX0VORElBTl9IT1NUCisgICAgLyogUmVjb25maWd1cmUgdGhlIG1vZGUgcmVnaXN0ZXIuICovCisgICAgVmFsdWUzMiA9IEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSB8CisgICAgICAgICAgICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSB8CisgICAgICAgICAgICAgIEdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBIHwKKyAgICAgICAgICAgICAgR1JDX01PREVfV09SRF9TV0FQX0RBVEE7CisjZWxzZQorICAgIC8qIFJlY29uZmlndXJlIHRoZSBtb2RlIHJlZ2lzdGVyLiAqLworICAgIFZhbHVlMzIgPSBHUkNfTU9ERV9CWVRFX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfCBHUkNfTU9ERV9CWVRFX1NXQVBfREFUQTsKKyNlbmRpZgorI2VuZGlmCisgICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Nb2RlLCBWYWx1ZTMyKTsKKworICAgIC8qIFByZXZlbnQgUFhFIGZyb20gcmVzdGFydGluZy4gKi8KKyAgICBNRU1fV1JfT0ZGU0VUKHBEZXZpY2UsIDB4MGI1MCwgVDNfTUFHSUNfTlVNKTsKKworICAgIGlmKHBEZXZpY2UtPkVuYWJsZVRiaSkgeworICAgICAgICBwRGV2aWNlLT5NYWNNb2RlID0gTUFDX01PREVfUE9SVF9NT0RFX1RCSTsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgTUFDX01PREVfUE9SVF9NT0RFX1RCSSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCAwKTsKKyAgICB9CisKKyAgICAvKiBXYWl0IGZvciB0aGUgZmlybXdhcmUgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uLiAqLworICAgIGZvcihqID0gMDsgaiA8IDEwMDAwMDsgaisrKQorICAgIHsKKyAgICAgICAgTU1fV2FpdCgxMCk7CisKKyAgICAgICAgVmFsdWUzMiA9IE1FTV9SRF9PRkZTRVQocERldmljZSwgMHgwYjUwKTsKKyAgICAgICAgaWYoVmFsdWUzMiA9PSB+VDNfTUFHSUNfTlVNKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworX19pbmxpbmUgc3RhdGljIHZvaWQKK0xNX1NlcnZpY2VUeEludGVycnVwdCgKK1BMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkgeworICAgIFBMTV9QQUNLRVQgcFBhY2tldDsKKyAgICBMTV9VSU5UMzIgSHdDb25JZHg7CisgICAgTE1fVUlOVDMyIFN3Q29uSWR4OworCisgICAgSHdDb25JZHggPSBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+SWR4WzBdLlNlbmRDb25JZHg7CisKKyAgICAvKiBHZXQgb3VyIGNvcHkgb2YgdGhlIGNvbnN1bWVyIGluZGV4LiAgVGhlIGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworICAgIC8qIHRoYXQgYXJlIGluIGJldHdlZW4gdGhlIGNvbnN1bWVyIGluZGljZXMgYXJlIGZyZWVkLiAqLworICAgIFN3Q29uSWR4ID0gcERldmljZS0+U2VuZENvbklkeDsKKworICAgIC8qIE1vdmUgdGhlIHBhY2tldHMgZnJvbSB0aGUgVHhQYWNrZXRBY3RpdmVRIHRoYXQgYXJlIHNlbnQgb3V0IHRvICovCisgICAgLyogdGhlIFR4UGFja2V0WG1pdHRlZFEuICBQYWNrZXRzIHRoYXQgYXJlIHNlbnQgdXNlIHRoZSAqLworICAgIC8qIGRlc2NyaXB0b3JzIHRoYXQgYXJlIGJldHdlZW4gU3dDb25JZHggYW5kIEh3Q29uSWR4LiAqLworICAgIHdoaWxlKFN3Q29uSWR4ICE9IEh3Q29uSWR4KQorICAgIHsKKyAgICAgICAgLyogR2V0IHRoZSBwYWNrZXQgdGhhdCB3YXMgc2VudCBmcm9tIHRoZSBUeFBhY2tldEFjdGl2ZVEuICovCisgICAgICAgIHBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgUVFfUG9wSGVhZCgKKyAgICAgICAgICAgICZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyKTsKKworICAgICAgICAvKiBTZXQgdGhlIHJldHVybiBzdGF0dXMuICovCisgICAgICAgIHBQYWNrZXQtPlBhY2tldFN0YXR1cyA9IExNX1NUQVRVU19TVUNDRVNTOworCisgICAgICAgIC8qIFB1dCB0aGUgcGFja2V0IGluIHRoZSBUeFBhY2tldFhtaXR0ZWRRIGZvciBpbmRpY2F0aW9uIGxhdGVyLiAqLworICAgICAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+VHhQYWNrZXRYbWl0dGVkUS5Db250YWluZXIsIHBQYWNrZXQpOworCisgICAgICAgIC8qIE1vdmUgdG8gdGhlIG5leHQgcGFja2V0J3MgQkQuICovCisgICAgICAgIFN3Q29uSWR4ID0gKFN3Q29uSWR4ICsgcFBhY2tldC0+dS5UeC5GcmFnQ291bnQpICYKKyAgICAgICAgICAgIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7CisKKyAgICAgICAgLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgdW51c2VkIEJEcy4gKi8KKyAgICAgICAgYXRvbWljX2FkZChwUGFja2V0LT51LlR4LkZyYWdDb3VudCwgJnBEZXZpY2UtPlNlbmRCZExlZnQpOworCisgICAgICAgIC8qIEdldCB0aGUgbmV3IHVwZGF0ZWQgSHdDb25JZHguICovCisgICAgICAgIEh3Q29uSWR4ID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPklkeFswXS5TZW5kQ29uSWR4OworICAgIH0gLyogd2hpbGUgKi8KKworICAgIC8qIFNhdmUgdGhlIG5ldyBTd0NvbklkeC4gKi8KKyAgICBwRGV2aWNlLT5TZW5kQ29uSWR4ID0gU3dDb25JZHg7CisKK30gLyogTE1fU2VydmljZVR4SW50ZXJydXB0ICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK19faW5saW5lIHN0YXRpYyB2b2lkCitMTV9TZXJ2aWNlUnhJbnRlcnJ1cHQoCitQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpIHsKKyAgICBQTE1fUEFDS0VUIHBQYWNrZXQ7CisgICAgUFQzX1JDVl9CRCBwUmN2QmQ7CisgICAgTE1fVUlOVDMyIEh3UmN2UmV0UHJvZElkeDsKKyAgICBMTV9VSU5UMzIgU3dSY3ZSZXRDb25JZHg7CisKKyAgICAvKiBMb29wIHRocnUgdGhlIHJlY2VpdmUgcmV0dXJuIHJpbmdzIGZvciByZWNlaXZlZCBwYWNrZXRzLiAqLworICAgIEh3UmN2UmV0UHJvZElkeCA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5JZHhbMF0uUmN2UHJvZElkeDsKKworICAgIFN3UmN2UmV0Q29uSWR4ID0gcERldmljZS0+UmN2UmV0Q29uSWR4OworICAgIHdoaWxlKFN3UmN2UmV0Q29uSWR4ICE9IEh3UmN2UmV0UHJvZElkeCkKKyAgICB7CisgICAgICAgIHBSY3ZCZCA9ICZwRGV2aWNlLT5wUmN2UmV0QmRWaXJ0W1N3UmN2UmV0Q29uSWR4XTsKKworICAgICAgICAvKiBHZXQgdGhlIHJlY2VpdmVkIHBhY2tldCBkZXNjcmlwdG9yLiAqLworICAgICAgICBwUGFja2V0ID0gKFBMTV9QQUNLRVQpIChNTV9VSU5UX1BUUihwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UpICsKKyAgICAgICAgICAgIE1NX1VJTlRfUFRSKHBSY3ZCZC0+T3BhcXVlKSk7CisKKyAgICAgICAgLyogQ2hlY2sgdGhlIGVycm9yIGZsYWcuICovCisgICAgICAgIGlmKHBSY3ZCZC0+RXJyb3JGbGFnICYmCisgICAgICAgICAgICBwUmN2QmQtPkVycm9yRmxhZyAhPSBSQ1ZfQkRfRVJSX09ERF9OSUJCTEVEX1JDVkRfTUlJKQorICAgICAgICB7CisgICAgICAgICAgICBwUGFja2V0LT5QYWNrZXRTdGF0dXMgPSBMTV9TVEFUVVNfRkFJTFVSRTsKKworICAgICAgICAgICAgcERldmljZS0+UnhDb3VudGVycy5SeFBhY2tldEVyckNudCsrOworCisgICAgICAgICAgICBpZihwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfQkFEX0NSQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyQ3JjQ250Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9DT0xMX0RFVEVDVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyQ29sbENudCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfTElOS19MT1NUX0RVUklOR19QS1QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERldmljZS0+UnhDb3VudGVycy5SeEVyckxpbmtMb3N0Q250Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9QSFlfREVDT0RFX0VSUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyUGh5RGVjb2RlQ250Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9PRERfTklCQkxFRF9SQ1ZEX01JSSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyT2RkTmliYmxlQ250Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9NQUNfQUJPUlQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERldmljZS0+UnhDb3VudGVycy5SeEVyck1hY0Fib3J0Q250Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9MRU5fTFRfNjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERldmljZS0+UnhDb3VudGVycy5SeEVyclNob3J0UGFja2V0Q250Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9UUlVOQ19OT19SRVNPVVJDRVMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERldmljZS0+UnhDb3VudGVycy5SeEVyck5vUmVzb3VyY2VDbnQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX0dJQU5UX0ZSQU1FX1JDVkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERldmljZS0+UnhDb3VudGVycy5SeEVyckxhcmdlUGFja2V0Q250Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUGFja2V0LT5QYWNrZXRTdGF0dXMgPSBMTV9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIHBQYWNrZXQtPlBhY2tldFNpemUgPSBwUmN2QmQtPkxlbiAtIDQ7CisKKyAgICAgICAgICAgIHBQYWNrZXQtPkZsYWdzID0gcFJjdkJkLT5GbGFnczsKKyAgICAgICAgICAgIGlmKHBSY3ZCZC0+RmxhZ3MgJiBSQ1ZfQkRfRkxBR19WTEFOX1RBRykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUGFja2V0LT5WbGFuVGFnID0gcFJjdkJkLT5WbGFuVGFnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwUGFja2V0LT51LlJ4LlRjcFVkcENoZWNrc3VtID0gcFJjdkJkLT5UY3BVZHBDa3N1bTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFB1dCB0aGUgcGFja2V0IGRlc2NyaXB0b3IgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgcGFja2V0ICovCisgICAgICAgIC8qIGJ1ZmZlciBpbiB0aGUgUnhQYWNrZXRSZWNlaXZlZFEgZm9yIGluZGljYXRpb24gbGF0ZXIuICovCisgICAgICAgIFFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldFJlY2VpdmVkUS5Db250YWluZXIsIHBQYWNrZXQpOworCisgICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IGJ1ZmZlciBkZXNjcmlwdG9yLiAqLworICAgICAgICBTd1JjdlJldENvbklkeCA9IChTd1JjdlJldENvbklkeCArIDEpICYKKyAgICAgICAgICAgIFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UX01BU0s7CisKKyAgICAgICAgLyogR2V0IHRoZSB1cGRhdGVkIEh3UmN2UmV0UHJvZElkeC4gKi8KKyAgICAgICAgSHdSY3ZSZXRQcm9kSWR4ID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPklkeFswXS5SY3ZQcm9kSWR4OworICAgIH0gLyogd2hpbGUgKi8KKworICAgIHBEZXZpY2UtPlJjdlJldENvbklkeCA9IFN3UmN2UmV0Q29uSWR4OworCisgICAgLyogVXBkYXRlIHRoZSByZWNlaXZlIHJldHVybiByaW5nIGNvbnN1bWVyIGluZGV4LiAqLworICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlJjdlJldENvbklkeFswXS5Mb3csIFN3UmN2UmV0Q29uSWR4KTsKK30gLyogTE1fU2VydmljZVJ4SW50ZXJydXB0ICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgaXMgdGhlIGludGVycnVwdCBldmVudCBoYW5kbGVyIHJvdXRpbmUuIEl0IGFja25vd2xlZGdlcyBhbGwgICAgICAgICovCisvKiAgICBwZW5kaW5nIGludGVycnVwdHMgYW5kIHByb2Nlc3MgYWxsIHBlbmRpbmcgZXZlbnRzLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xNX1NUQVRVUworTE1fU2VydmljZUludGVycnVwdHMoCisgICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworICAgIExNX1VJTlQzMiBWYWx1ZTMyOworICAgIGludCBTZXJ2aWNlUGh5SW50ID0gRkFMU0U7CisKKyAgICAvKiBTZXR1cCB0aGUgcGh5IGNoaXAgd2hlbmV2ZXIgdGhlIGxpbmsgc3RhdHVzIGNoYW5nZXMuICovCisgICAgaWYocERldmljZS0+TGlua0NobmdNb2RlID09IFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfUkVHKQorICAgIHsKKyAgICAgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7CisgICAgICAgIGlmKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFZhbHVlMzIgJiBNQUNfU1RBVFVTX01JX0lOVEVSUlVQVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXJ2aWNlUGh5SW50ID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKFZhbHVlMzIgJiBNQUNfU1RBVFVTX0xJTktfU1RBVEVfQ0hBTkdFRCkKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmljZVBoeUludCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYocERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyAmIFNUQVRVU19CTE9DS19MSU5LX0NIQU5HRURfU1RBVFVTKQorICAgICAgICB7CisgICAgICAgICAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzID0gU1RBVFVTX0JMT0NLX1VQREFURUQgfAorICAgICAgICAgICAgICAgIChwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICYgflNUQVRVU19CTE9DS19MSU5LX0NIQU5HRURfU1RBVFVTKTsKKyAgICAgICAgICAgIFNlcnZpY2VQaHlJbnQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorI2lmIElOQ0xVREVfVEJJX1NVUFBPUlQKKyAgICBpZiAocERldmljZS0+SWdub3JlVGJpTGlua0NoYW5nZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgU2VydmljZVBoeUludCA9IEZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIGlmIChTZXJ2aWNlUGh5SW50ID09IFRSVUUpCisgICAgeworICAgICAgICBMTV9TZXR1cFBoeShwRGV2aWNlKTsKKyAgICB9CisKKyAgICAvKiBTZXJ2aWNlIHJlY2VpdmUgYW5kIHRyYW5zbWl0IGludGVycnVwdHMuICovCisgICAgTE1fU2VydmljZVJ4SW50ZXJydXB0KHBEZXZpY2UpOworICAgIExNX1NlcnZpY2VUeEludGVycnVwdChwRGV2aWNlKTsKKworICAgIC8qIE5vIHNwaW5sb2NrIGZvciB0aGlzIHF1ZXVlIHNpbmNlIHRoaXMgcm91dGluZSBpcyBzZXJpYWxpemVkLiAqLworICAgIGlmKCFRUV9FbXB0eSgmcERldmljZS0+UnhQYWNrZXRSZWNlaXZlZFEuQ29udGFpbmVyKSkKKyAgICB7CisgICAgICAgIC8qIEluZGljYXRlIHJlY2VpdmUgcGFja2V0cy4gKi8KKyAgICAgICAgTU1fSW5kaWNhdGVSeFBhY2tldHMocERldmljZSk7CisJLyogICAgICAgTE1fUXVldWVSeFBhY2tldHMocERldmljZSk7ICovCisgICAgfQorCisgICAgLyogTm8gc3BpbmxvY2sgZm9yIHRoaXMgcXVldWUgc2luY2UgdGhpcyByb3V0aW5lIGlzIHNlcmlhbGl6ZWQuICovCisgICAgaWYoIVFRX0VtcHR5KCZwRGV2aWNlLT5UeFBhY2tldFhtaXR0ZWRRLkNvbnRhaW5lcikpCisgICAgeworICAgICAgICBNTV9JbmRpY2F0ZVR4UGFja2V0cyhwRGV2aWNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIExNX1NlcnZpY2VJbnRlcnJ1cHRzICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xNX1NUQVRVUworTE1fTXVsdGljYXN0QWRkKAorUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorUExNX1VJTlQ4IHBNY0FkZHJlc3MpIHsKKyAgICBQTE1fVUlOVDggcEVudHJ5OworICAgIExNX1VJTlQzMiBqOworCisgICAgcEVudHJ5ID0gcERldmljZS0+TWNUYWJsZVswXTsKKyAgICBmb3IoaiA9IDA7IGogPCBwRGV2aWNlLT5NY0VudHJ5Q291bnQ7IGorKykKKyAgICB7CisgICAgICAgIGlmKElTX0VUSF9BRERSRVNTX0VRVUFMKHBFbnRyeSwgcE1jQWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZvdW5kIGEgbWF0Y2gsIGluY3JlbWVudCB0aGUgaW5zdGFuY2UgY291bnQuICovCisgICAgICAgICAgICBwRW50cnlbTE1fTUNfSU5TVEFOQ0VfQ09VTlRfSU5ERVhdICs9IDE7CisKKyAgICAgICAgICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorCisgICAgICAgIHBFbnRyeSArPSBMTV9NQ19FTlRSWV9TSVpFOworICAgIH0KKworICAgIGlmKHBEZXZpY2UtPk1jRW50cnlDb3VudCA+PSBMTV9NQVhfTUNfVEFCTEVfU0laRSkKKyAgICB7CisgICAgICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwRW50cnkgPSBwRGV2aWNlLT5NY1RhYmxlW3BEZXZpY2UtPk1jRW50cnlDb3VudF07CisKKyAgICBDT1BZX0VUSF9BRERSRVNTKHBNY0FkZHJlc3MsIHBFbnRyeSk7CisgICAgcEVudHJ5W0xNX01DX0lOU1RBTkNFX0NPVU5UX0lOREVYXSA9IDE7CisKKyAgICBwRGV2aWNlLT5NY0VudHJ5Q291bnQrKzsKKworICAgIExNX1NldFJlY2VpdmVNYXNrKHBEZXZpY2UsIHBEZXZpY2UtPlJlY2VpdmVNYXNrIHwgTE1fQUNDRVBUX01VTFRJQ0FTVCk7CisKKyAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIExNX011bHRpY2FzdEFkZCAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9TVEFUVVMKK0xNX011bHRpY2FzdERlbCgKK1BMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKK1BMTV9VSU5UOCBwTWNBZGRyZXNzKSB7CisgICAgUExNX1VJTlQ4IHBFbnRyeTsKKyAgICBMTV9VSU5UMzIgajsKKworICAgIHBFbnRyeSA9IHBEZXZpY2UtPk1jVGFibGVbMF07CisgICAgZm9yKGogPSAwOyBqIDwgcERldmljZS0+TWNFbnRyeUNvdW50OyBqKyspCisgICAgeworICAgICAgICBpZihJU19FVEhfQUREUkVTU19FUVVBTChwRW50cnksIHBNY0FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGb3VuZCBhIG1hdGNoLCBkZWNyZW1lbnQgdGhlIGluc3RhbmNlIGNvdW50LiAqLworICAgICAgICAgICAgcEVudHJ5W0xNX01DX0lOU1RBTkNFX0NPVU5UX0lOREVYXSAtPSAxOworCisgICAgICAgICAgICAvKiBObyBtb3JlIGluc3RhbmNlIGxlZnQsIHJlbW92ZSB0aGUgYWRkcmVzcyBmcm9tIHRoZSB0YWJsZS4gKi8KKyAgICAgICAgICAgIC8qIE1vdmUgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHRhYmxlIHRvIHRoZSBkZWxldGUgc2xvdC4gKi8KKyAgICAgICAgICAgIGlmKHBFbnRyeVtMTV9NQ19JTlNUQU5DRV9DT1VOVF9JTkRFWF0gPT0gMCAmJgorICAgICAgICAgICAgICAgIHBEZXZpY2UtPk1jRW50cnlDb3VudCA+IDEpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBDT1BZX0VUSF9BRERSRVNTKAorICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5NY1RhYmxlW3BEZXZpY2UtPk1jRW50cnlDb3VudC0xXSwgcEVudHJ5KTsKKyAgICAgICAgICAgICAgICBwRW50cnlbTE1fTUNfSU5TVEFOQ0VfQ09VTlRfSU5ERVhdID0KKyAgICAgICAgICAgICAgICAgICAgcERldmljZS0+TWNUYWJsZVtwRGV2aWNlLT5NY0VudHJ5Q291bnQtMV0KKyAgICAgICAgICAgICAgICAgICAgW0xNX01DX0lOU1RBTkNFX0NPVU5UX0lOREVYXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBEZXZpY2UtPk1jRW50cnlDb3VudC0tOworCisgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIHJlY2VpdmUgbWFzayBpZiB0aGUgdGFibGUgaXMgZW1wdHkuICovCisgICAgICAgICAgICBpZihwRGV2aWNlLT5NY0VudHJ5Q291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMTV9TZXRSZWNlaXZlTWFzayhwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5SZWNlaXZlTWFzayAmIH5MTV9BQ0NFUFRfTVVMVElDQVNUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworICAgICAgICB9CisKKyAgICAgICAgcEVudHJ5ICs9IExNX01DX0VOVFJZX1NJWkU7CisgICAgfQorCisgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworfSAvKiBMTV9NdWx0aWNhc3REZWwgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTCitMTV9NdWx0aWNhc3RDbGVhcigKK1BMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkgeworICAgIHBEZXZpY2UtPk1jRW50cnlDb3VudCA9IDA7CisKKyAgICBMTV9TZXRSZWNlaXZlTWFzayhwRGV2aWNlLCBwRGV2aWNlLT5SZWNlaXZlTWFzayAmIH5MTV9BQ0NFUFRfTVVMVElDQVNUKTsKKworICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30gLyogTE1fTXVsdGljYXN0Q2xlYXIgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTCitMTV9TZXRNYWNBZGRyZXNzKAorICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKyAgICBQTE1fVUlOVDggcE1hY0FkZHJlc3MpCit7CisgICAgTE1fVUlOVDMyIGo7CisKKyAgICBmb3IoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5NYWNBZGRyW2pdLkhpZ2gsCisgICAgICAgICAgICAocE1hY0FkZHJlc3NbMF0gPDwgOCkgfCBwTWFjQWRkcmVzc1sxXSk7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1hY0FkZHJbal0uTG93LAorICAgICAgICAgICAgKHBNYWNBZGRyZXNzWzJdIDw8IDI0KSB8IChwTWFjQWRkcmVzc1szXSA8PCAxNikgfAorICAgICAgICAgICAgKHBNYWNBZGRyZXNzWzRdIDw8IDgpIHwgcE1hY0FkZHJlc3NbNV0pOworICAgIH0KKworICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFNldHMgdXAgdGhlIGRlZmF1bHQgbGluZSBzcGVlZCwgYW5kIGR1cGxleCBtb2RlcyBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkICovCisvKiAgICBtZWRpYSB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBOb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBMTV9TVEFUVVMKK0xNX1RyYW5zbGF0ZVJlcXVlc3RlZE1lZGlhVHlwZSgKK0xNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFJlcXVlc3RlZE1lZGlhVHlwZSwKK1BMTV9NRURJQV9UWVBFIHBNZWRpYVR5cGUsCitQTE1fTElORV9TUEVFRCBwTGluZVNwZWVkLAorUExNX0RVUExFWF9NT0RFIHBEdXBsZXhNb2RlKSB7CisgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX0FVVE87CisgICAgKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEX1VOS05PV047CisgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfVU5LTk9XTjsKKworICAgIC8qIGRldGVybWluZSBtZWRpYSB0eXBlICovCisgICAgc3dpdGNoKFJlcXVlc3RlZE1lZGlhVHlwZSkgeworICAgICAgICBjYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0JOQzoKKyAgICAgICAgICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9CTkM7CisgICAgICAgICAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTBNQlBTOworICAgICAgICAgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQX0FVVE86CisgICAgICAgICAgICAqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTBNQlBTOgorICAgICAgICAgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKKyAgICAgICAgICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xME1CUFM7CisgICAgICAgICAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTBNQlBTX0ZVTExfRFVQTEVYOgorICAgICAgICAgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKKyAgICAgICAgICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xME1CUFM7CisgICAgICAgICAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTAwTUJQUzoKKyAgICAgICAgICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7CisgICAgICAgICAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwTUJQUzsKKyAgICAgICAgICAgICpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDBNQlBTX0ZVTExfRFVQTEVYOgorICAgICAgICAgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKKyAgICAgICAgICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDBNQlBTOworICAgICAgICAgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwMDBNQlBTOgorICAgICAgICAgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKKyAgICAgICAgICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKKyAgICAgICAgICAgICpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDAwTUJQU19GVUxMX0RVUExFWDoKKyAgICAgICAgICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7CisgICAgICAgICAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7CisgICAgICAgICAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9GSUJFUl8xMDBNQlBTOgorICAgICAgICAgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX0ZJQkVSOworICAgICAgICAgICAgKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7CisgICAgICAgICAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9GSUJFUl8xMDBNQlBTX0ZVTExfRFVQTEVYOgorICAgICAgICAgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX0ZJQkVSOworICAgICAgICAgICAgKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7CisgICAgICAgICAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9GSUJFUl8xMDAwTUJQUzoKKyAgICAgICAgICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9GSUJFUjsKKyAgICAgICAgICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKKyAgICAgICAgICAgICpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0ZJQkVSXzEwMDBNQlBTX0ZVTExfRFVQTEVYOgorICAgICAgICAgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX0ZJQkVSOworICAgICAgICAgICAgKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTOworICAgICAgICAgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9IC8qIHN3aXRjaCAqLworCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfSAvKiBMTV9UcmFuc2xhdGVSZXF1ZXN0ZWRNZWRpYVR5cGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExNX1NUQVRVU19MSU5LX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBMTV9TVEFUVVNfTElOS19ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBMTV9TVEFUVVMKK0xNX0luaXRCY201NDB4UGh5KAorUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworICAgIExNX0xJTkVfU1BFRUQgQ3VycmVudExpbmVTcGVlZDsKKyAgICBMTV9EVVBMRVhfTU9ERSBDdXJyZW50RHVwbGV4TW9kZTsKKyAgICBMTV9TVEFUVVMgQ3VycmVudExpbmtTdGF0dXM7CisgICAgTE1fVUlOVDMyIFZhbHVlMzI7CisgICAgTE1fVUlOVDMyIGo7CisKKyNpZiAxICAvKiBqbWI6IGJ1Z2ZpeCAtLSBtb3ZlZCBoZXJlLCBvdXQgb2YgY29kZSB0aGF0IHNldHMgaW5pdGlhbCBwd3Igc3RhdGUgKi8KKyAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDAxX0FVWF9DVFJMLCAweDIpOworI2VuZGlmCisgICAgaWYoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NDAxX1BIWV9JRCkKKyAgICB7CisgICAgICAgIExNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKyAgICAgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCisgICAgICAgIGlmKCFwRGV2aWNlLT5Jbml0RG9uZSkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZighKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykpCisgICAgICAgIHsKKyAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MDFfQVVYX0NUUkwsICAweDBjMjApOworCisgICAgICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHgwMDEyKTsKKyAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MTgwNCk7CisKKyAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDAwMTMpOworICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgxMjA0KTsKKworICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4ODAwNik7CisgICAgICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDAxMzIpOworCisgICAgICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHg4MDA2KTsKKyAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MDIzMik7CisKKyAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDIwMWYpOworICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgwYTIwKTsKKworICAgICAgICAgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgMTAwMDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1NX1dhaXQoMTApOworCisgICAgICAgICAgICAgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworICAgICAgICAgICAgICAgIGlmKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1NX1dhaXQoNDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9SRVZfTUFTSykgPT0gUEhZX0JDTTU0MDFfQjBfUkVWKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCEoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKSAmJgorICAgICAgICAgICAgICAgICAgICAocERldmljZS0+T2xkTGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwME1CUFMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgUEhZX0NUUkxfUkVHLCBQSFlfQ1RSTF9QSFlfUkVTRVQpOworICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCAxMDA7IGorKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTU1fV2FpdCgxMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIExNX1JlYWRQaHkocERldmljZSwgUEhZX0NUUkxfUkVHLCAmVmFsdWUzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighKFZhbHVlMzIgJiBQSFlfQ1RSTF9QSFlfUkVTRVQpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX1dhaXQoNDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwMV9BVVhfQ1RSTCwgIDB4MGMyMCk7CisKKyAgICAgICAgICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMik7CisgICAgICAgICAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MTgwNCk7CisKKyAgICAgICAgICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMyk7CisgICAgICAgICAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MTIwNCk7CisKKyAgICAgICAgICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4ODAwNik7CisgICAgICAgICAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MDEzMik7CisKKyAgICAgICAgICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4ODAwNik7CisgICAgICAgICAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MDIzMik7CisKKyAgICAgICAgICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MjAxZik7CisgICAgICAgICAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MGEyMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAorICAgICAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0IwKQorICAgIHsKKyAgICAgICAgLyogQnVnOiA1NzAxIEEwLCBCMCBUWCBDUkMgd29ya2Fyb3VuZC4gKi8KKyAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgMHgxNSwgMHgwYTc1KTsKKyAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgMHgxYywgMHg4YzY4KTsKKyAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgMHgxYywgMHg4ZDY4KTsKKyAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgMHgxYywgMHg4YzY4KTsKKyAgICB9CisKKyAgICAvKiBBY2tub3dsZWRnZSBpbnRlcnJ1cHRzLiAqLworICAgIExNX1JlYWRQaHkocERldmljZSwgQkNNNTQwWF9JTlRfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworICAgIExNX1JlYWRQaHkocERldmljZSwgQkNNNTQwWF9JTlRfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKyAgICBpZihwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9NSV9JTlRFUlJVUFQpCisgICAgeworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0lOVF9NQVNLX1JFRywgfkJDTTU0MFhfSU5UX0xJTktfQ0hBTkdFKTsKKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgUEhZIGxlZCBtb2RlLiAqLworICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSB8fAorICAgICAgICAoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSkKKyAgICB7CisgICAgICAgIGlmKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfVEhSRUVfTElOSykKKyAgICAgICAgeworICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9FWFRfQ1RSTF9SRUcsCisgICAgICAgICAgICAgICAgQkNNNTQwWF9FWFRfQ1RSTF9MSU5LM19MRURfTU9ERSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0VYVF9DVFJMX1JFRywgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0RPV047CisKKyAgICAvKiBHZXQgY3VycmVudCBsaW5rIGFuZCBkdXBsZXggbW9kZS4gKi8KKyAgICBmb3IoaiA9IDA7IGogPCAxMDA7IGorKykKKyAgICB7CisgICAgICAgIExNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKyAgICAgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCisgICAgICAgIGlmKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgTU1fV2FpdCg0MCk7CisgICAgfQorCisgICAgaWYoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKQorICAgIHsKKworICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgbGluZSBhbmQgZHVwbGV4IHNldHRpbmdzLiAqLworICAgICAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIEJDTTU0MFhfQVVYX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKyAgICAgICAgZm9yKGogPSAwOyBqIDwgMjAwMDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKworICAgICAgICAgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBCQ001NDBYX0FVWF9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisgICAgICAgICAgICBpZihWYWx1ZTMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoKFZhbHVlMzIgJiBCQ001NDBYX0FVWF9TUEVFRF9NQVNLKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTTU0MFhfQVVYXzEwQkFTRVRfSEQ6CisgICAgICAgICAgICAgICAgQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTBNQlBTOworICAgICAgICAgICAgICAgIEN1cnJlbnREdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBCQ001NDBYX0FVWF8xMEJBU0VUX0ZEOgorICAgICAgICAgICAgICAgIEN1cnJlbnRMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwTUJQUzsKKyAgICAgICAgICAgICAgICBDdXJyZW50RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0ZVTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQkNNNTQwWF9BVVhfMTAwQkFTRVRYX0hEOgorICAgICAgICAgICAgICAgIEN1cnJlbnRMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7CisgICAgICAgICAgICAgICAgQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEJDTTU0MFhfQVVYXzEwMEJBU0VUWF9GRDoKKyAgICAgICAgICAgICAgICBDdXJyZW50TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDBNQlBTOworICAgICAgICAgICAgICAgIEN1cnJlbnREdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBCQ001NDBYX0FVWF8xMDBCQVNFVF9IRDoKKyAgICAgICAgICAgICAgICBDdXJyZW50TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKKyAgICAgICAgICAgICAgICBDdXJyZW50RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQkNNNTQwWF9BVVhfMTAwQkFTRVRfRkQ6CisgICAgICAgICAgICAgICAgQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7CisgICAgICAgICAgICAgICAgQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICAgICAgQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICBDdXJyZW50RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX1VOS05PV047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBNYWtlIHN1cmUgd2UgYXJlIGluIGF1dG8tbmVnIG1vZGUuICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAyMDA7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsICZWYWx1ZTMyKTsKKyAgICAgICAgICAgIGlmKFZhbHVlMzIgJiYgVmFsdWUzMiAhPSAweDdmZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKFZhbHVlMzIgPT0gMCAmJiBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0KKyAgICAgICAgICAgICAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTBNQlBTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVzZSB0aGUgY3VycmVudCBsaW5lIHNldHRpbmdzIGZvciAiYXV0byIgbW9kZS4gKi8KKyAgICAgICAgaWYocERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0FVVE8gfHwKKyAgICAgICAgICAgIHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9PSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfQVVUTykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUzMiAmIFBIWV9DVFJMX0FVVE9fTkVHX0VOQUJMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0FDVElWRTsKKworICAgICAgICAgICAgICAgIC8qIFdlIG1heSBiZSBleGl0aW5nIGxvdyBwb3dlciBtb2RlIGFuZCB0aGUgbGluayBpcyBpbiAqLworICAgICAgICAgICAgICAgIC8qIDEwbWIuICBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gcmVzdGFydCBhdXRvbmVnLiAqLworICAgICAgICAgICAgICAgIExNX1JlYWRQaHkocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsICZWYWx1ZTMyKTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSBWYWx1ZTMyOworICAgICAgICAgICAgICAgIC8qIDU3MDJGRSBzdXBwb3J0cyAxMC8xMDBNYiBvbmx5LiAqLworICAgICAgICAgICAgICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMyB8fAorICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwMkZFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIShWYWx1ZTMyICYgKEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0hBTEYgfAorICAgICAgICAgICAgICAgICAgICAgICAgQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfRlVMTCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19TRVRUSU5HX01JU01BVENIOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogRm9yY2UgbGluZSBzZXR0aW5ncy4gKi8KKyAgICAgICAgICAgIC8qIFVzZSB0aGUgY3VycmVudCBzZXR0aW5nIGlmIGl0IG1hdGNoZXMgdGhlIHVzZXIncyByZXF1ZXN0ZWQgKi8KKyAgICAgICAgICAgIC8qIHNldHRpbmcuICovCisgICAgICAgICAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgJlZhbHVlMzIpOworICAgICAgICAgICAgaWYoKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBDdXJyZW50TGluZVNwZWVkKSAmJgorICAgICAgICAgICAgICAgIChwRGV2aWNlLT5EdXBsZXhNb2RlID09IEN1cnJlbnREdXBsZXhNb2RlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnICYmCisgICAgICAgICAgICAgICAgICAgICEoVmFsdWUzMiAmIFBIWV9DVFJMX0FVVE9fTkVHX0VOQUJMRSkpIHx8CisgICAgICAgICAgICAgICAgICAgICghcERldmljZS0+RGlzYWJsZUF1dG9OZWcgJiYKKyAgICAgICAgICAgICAgICAgICAgKFZhbHVlMzIgJiBQSFlfQ1RSTF9BVVRPX05FR19FTkFCTEUpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfQUNUSVZFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfU0VUVElOR19NSVNNQVRDSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFNhdmUgbGluZSBzZXR0aW5ncy4gKi8KKyAgICAgICAgcERldmljZS0+TGluZVNwZWVkID0gQ3VycmVudExpbmVTcGVlZDsKKyAgICAgICAgcERldmljZS0+RHVwbGV4TW9kZSA9IEN1cnJlbnREdXBsZXhNb2RlOworICAgICAgICBwRGV2aWNlLT5NZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKKyAgICB9CisKKyAgICByZXR1cm4gQ3VycmVudExpbmtTdGF0dXM7Cit9IC8qIExNX0luaXRCY201NDB4UGh5ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTCitMTV9TZXRGbG93Q29udHJvbCgKKyAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisgICAgTE1fVUlOVDMyIExvY2FsUGh5QWQsCisgICAgTE1fVUlOVDMyIFJlbW90ZVBoeUFkKQoreworICAgIExNX0ZMT1dfQ09OVFJPTCBGbG93Q2FwOworCisgICAgLyogUmVzb2x2ZSBmbG93IGNvbnRyb2wuICovCisgICAgRmxvd0NhcCA9IExNX0ZMT1dfQ09OVFJPTF9OT05FOworCisgICAgLyogU2VlIFRhYmxlIDI4Qi0zIG9mIDgwMi4zYWItMTk5OSBzcGVjLiAqLworICAgIGlmKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0UpCisgICAgeworICAgICAgICBpZihMb2NhbFBoeUFkICYgUEhZX0FOX0FEX1BBVVNFX0NBUEFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKExvY2FsUGh5QWQgJiBQSFlfQU5fQURfQVNZTV9QQVVTRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihSZW1vdGVQaHlBZCAmIFBIWV9MSU5LX1BBUlRORVJfUEFVU0VfQ0FQQUJMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZsb3dDYXAgPSBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UgfAorICAgICAgICAgICAgICAgICAgICAgICAgTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoUmVtb3RlUGh5QWQgJiBQSFlfTElOS19QQVJUTkVSX0FTWU1fUEFVU0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGbG93Q2FwID0gTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKFJlbW90ZVBoeUFkICYgUEhZX0xJTktfUEFSVE5FUl9QQVVTRV9DQVBBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmxvd0NhcCA9IExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihMb2NhbFBoeUFkICYgUEhZX0FOX0FEX0FTWU1fUEFVU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChSZW1vdGVQaHlBZCAmIFBIWV9MSU5LX1BBUlRORVJfUEFVU0VfQ0FQQUJMRSkgJiYKKyAgICAgICAgICAgICAgICAoUmVtb3RlUGh5QWQgJiBQSFlfTElOS19QQVJUTkVSX0FTWU1fUEFVU0UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZsb3dDYXAgPSBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRmxvd0NhcCA9IHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwOworICAgIH0KKworICAgIC8qIEVuYWJsZS9kaXNhYmxlIHJ4IFBBVVNFLiAqLworICAgIHBEZXZpY2UtPlJ4TW9kZSAmPSB+UlhfTU9ERV9FTkFCTEVfRkxPV19DT05UUk9MOworICAgIGlmKEZsb3dDYXAgJiBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSAmJgorICAgICAgICAocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgPT0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0UgfHwKKyAgICAgICAgcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSkpCisgICAgeworICAgICAgICBwRGV2aWNlLT5GbG93Q29udHJvbCB8PSBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRTsKKyAgICAgICAgcERldmljZS0+UnhNb2RlIHw9IFJYX01PREVfRU5BQkxFX0ZMT1dfQ09OVFJPTDsKKworICAgIH0KKyAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIHBEZXZpY2UtPlJ4TW9kZSk7CisKKyAgICAvKiBFbmFibGUvZGlzYWJsZSB0eCBQQVVTRS4gKi8KKyAgICBwRGV2aWNlLT5UeE1vZGUgJj0gflRYX01PREVfRU5BQkxFX0ZMT1dfQ09OVFJPTDsKKyAgICBpZihGbG93Q2FwICYgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFICYmCisgICAgICAgIChwRGV2aWNlLT5GbG93Q29udHJvbENhcCA9PSBMTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRSB8fAorICAgICAgICBwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSkpCisgICAgeworICAgICAgICBwRGV2aWNlLT5GbG93Q29udHJvbCB8PSBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0U7CisgICAgICAgIHBEZXZpY2UtPlR4TW9kZSB8PSBUWF9NT0RFX0VOQUJMRV9GTE9XX0NPTlRST0w7CisKKyAgICB9CisgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuVHhNb2RlLCBwRGV2aWNlLT5UeE1vZGUpOworCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCisKKyNpZiBJTkNMVURFX1RCSV9TVVBQT1JUCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NUQVRJQyBMTV9TVEFUVVMKK0xNX0luaXRCY204MDB4UGh5KAorICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKyAgICBMTV9VSU5UMzIgVmFsdWUzMjsKKyAgICBMTV9VSU5UMzIgajsKKworICAgIFZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgTWFjQ3RybC5TdGF0dXMpOworCisgICAgLyogUmVzZXQgdGhlIFNFUkRFUyBkdXJpbmcgaW5pdCBhbmQgd2hlbiB3ZSBoYXZlIGxpbmsuICovCisgICAgaWYoIXBEZXZpY2UtPkluaXREb25lIHx8IFZhbHVlMzIgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpCisgICAgeworICAgICAgICAvKiBTZXQgUExMIGxvY2sgcmFuZ2UuICovCisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTYsIDB4ODAwNyk7CisKKyAgICAgICAgLyogU29mdHdhcmUgcmVzZXQuICovCisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MDAsIDB4ODAwMCk7CisKKyAgICAgICAgLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUuICovCisgICAgICAgIGZvcihqID0gMDsgaiA8IDUwMDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbmZpZyBtb2RlOyBzZWxldGN0IFBNQS9DaCAxIHJlZ3MuICovCisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTAsIDB4ODQxMSk7CisKKyAgICAgICAgLyogRW5hYmxlIGF1dG8tbG9jayBhbmQgY29tZGV0LCBzZWxlY3QgdHhjbGsgZm9yIHR4LiAqLworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDExLCAweDBhMTApOworCisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTgsIDB4MDBhMCk7CisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTYsIDB4NDFmZik7CisKKyAgICAgICAgLyogQXNzZXJ0IGFuZCBkZWFzc2VydCBQT1IuICovCisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTMsIDB4MDQwMCk7CisgICAgICAgIE1NX1dhaXQoNDApOworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDEzLCAweDAwMDApOworCisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTEsIDB4MGE1MCk7CisgICAgICAgIE1NX1dhaXQoNDApOworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDExLCAweDBhMTApOworCisgICAgICAgIC8qIERlbGF5IGZvciBzaWduYWwgdG8gc3RhYmlsaXplLiAqLworICAgICAgICBmb3IoaiA9IDA7IGogPCAxNTAwMDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERlc2VsZWN0IHRoZSBjaGFubmVsIHJlZ2lzdGVyIHNvIHdlIGNhbiByZWFkIHRoZSBQSFkgaWQgbGF0ZXIuICovCisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTAsIDB4ODAxMSk7CisgICAgfQorCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTVEFUSUMgTE1fU1RBVFVTCitMTV9TZXR1cEZpYmVyUGh5KAorICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKyAgICBMTV9TVEFUVVMgQ3VycmVudExpbmtTdGF0dXM7CisgICAgQVVUT05FR19TVEFUVVMgQW5TdGF0dXMgPSAwOworICAgIExNX1VJTlQzMiBWYWx1ZTMyOworICAgIExNX1VJTlQzMiBDbnQ7CisgICAgTE1fVUlOVDMyIGosIGs7CisKKyAgICBwRGV2aWNlLT5NYWNNb2RlICY9IH4oTUFDX01PREVfSEFMRl9EVVBMRVggfCBNQUNfTU9ERV9QT1JUX01PREVfTUFTSyk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBzZW5kX2NvbmZpZyByZWdpc3Rlci4gKi8KKyAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5UeEF1dG9OZWcsIDApOworCisgICAgLyogRW5hYmxlIFRCSSBhbmQgZnVsbCBkdXBsZXggbW9kZS4gKi8KKyAgICBwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9UQkk7CisgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBCQ004MDAyIFNFUkRFUyBQSFkuICovCisgICAgc3dpdGNoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spCisgICAgeworICAgICAgICBjYXNlIFBIWV9CQ004MDAyX1BIWV9JRDoKKyAgICAgICAgICAgIExNX0luaXRCY204MDB4UGh5KHBEZXZpY2UpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIEVuYWJsZSBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQuICovCisgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWFjRXZlbnQsIE1BQ19FVkVOVF9FTkFCTEVfTElOS19TVEFURV9DSEFOR0VEX0FUVE4pOworCisgICAgLyogRGVmYXVsdCB0byBsaW5rIGRvd24uICovCisgICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOworCisgICAgLyogR2V0IHRoZSBsaW5rIHN0YXR1cy4gKi8KKyAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKTsKKyAgICBpZihWYWx1ZTMyICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKQorICAgIHsKKyAgICAgICAgaWYoKHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9PSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPKSB8fAorICAgICAgICAgICAgKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID09IEZBTFNFKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogYXV0by1uZWdvdGlhdGlvbiBtb2RlLiAqLworICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgYXV0b25lZyBkZWZhdWx0IGNhcGFpYmxpdGllcy4gKi8KKyAgICAgICAgICAgIEF1dG9uZWdJbml0KCZwRGV2aWNlLT5BbkluZm8pOworCisgICAgICAgICAgICAvKiBTZXQgdGhlIGNvbnRleHQgcG9pbnRlciB0byBwb2ludCB0byB0aGUgbWFpbiBkZXZpY2Ugc3RydWN0dXJlLiAqLworICAgICAgICAgICAgcERldmljZS0+QW5JbmZvLnBDb250ZXh0ID0gcERldmljZTsKKworICAgICAgICAgICAgLyogU2V0dXAgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnQgcmVnaXN0ZXIuICovCisgICAgICAgICAgICBWYWx1ZTMyID0gR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyhwRGV2aWNlKTsKKyAgICAgICAgICAgIGlmKFZhbHVlMzIgJiBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5BbkluZm8ubXJfYWR2X3N5bV9wYXVzZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERldmljZS0+QW5JbmZvLm1yX2Fkdl9zeW1fcGF1c2UgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihWYWx1ZTMyICYgUEhZX0FOX0FEX0FTWU1fUEFVU0UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERldmljZS0+QW5JbmZvLm1yX2Fkdl9hc3ltX3BhdXNlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5BbkluZm8ubXJfYWR2X2FzeW1fcGF1c2UgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBUcnkgdG8gYXV0b25lZyB1cCB0byBzaXggdGltZXMuICovCisgICAgICAgICAgICBpZiAocERldmljZS0+SWdub3JlVGJpTGlua0NoYW5nZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbnQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENudCA9IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgQ250OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuVHhBdXRvTmVnLCAwKTsKKworICAgICAgICAgICAgICAgIFZhbHVlMzIgPSBwRGV2aWNlLT5NYWNNb2RlICYgfk1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLOworICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIFZhbHVlMzIpOworICAgICAgICAgICAgICAgIE1NX1dhaXQoMjApOworCisgICAgICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSB8CisgICAgICAgICAgICAgICAgICAgIE1BQ19NT0RFX1NFTkRfQ09ORklHUyk7CisKKyAgICAgICAgICAgICAgICBNTV9XYWl0KDIwKTsKKworICAgICAgICAgICAgICAgIHBEZXZpY2UtPkFuSW5mby5TdGF0ZSA9IEFOX1NUQVRFX1VOS05PV047CisgICAgICAgICAgICAgICAgcERldmljZS0+QW5JbmZvLkN1cnJlbnRUaW1lX3VzID0gMDsKKworICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBHcmMuVGltZXIsIDApOworICAgICAgICAgICAgICAgIGZvcihrID0gMDsgKHBEZXZpY2UtPkFuSW5mby5DdXJyZW50VGltZV91cyA8IDc1MDAwKSAmJgorICAgICAgICAgICAgICAgICAgICAoayA8IDc1MDAwKTsgaysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQW5TdGF0dXMgPSBBdXRvbmVnODAyM3ooJnBEZXZpY2UtPkFuSW5mbyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKEFuU3RhdHVzID09IEFVVE9ORUdfU1RBVFVTX0RPTkUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoQW5TdGF0dXMgPT0gQVVUT05FR19TVEFUVVNfRkFJTEVEKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5BbkluZm8uQ3VycmVudFRpbWVfdXMgPSBSRUdfUkQocERldmljZSwgR3JjLlRpbWVyKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZigoQW5TdGF0dXMgPT0gQVVUT05FR19TVEFUVVNfRE9ORSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKEFuU3RhdHVzID09IEFVVE9ORUdfU1RBVFVTX0ZBSUxFRCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogPj0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cykgJgorICAgICAgICAgICAgICAgICAgICAgICAgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFN0b3Agc2VuZGluZyBjb25maWdzLiAqLworICAgICAgICAgICAgTU1fQW5UeElkbGUoJnBEZXZpY2UtPkFuSW5mbyk7CisKKyAgICAgICAgICAgIC8qIFJlc29sdmUgZmxvdyBjb250cm9sIHNldHRpbmdzLiAqLworICAgICAgICAgICAgaWYoKEFuU3RhdHVzID09IEFVVE9ORUdfU1RBVFVTX0RPTkUpICYmCisgICAgICAgICAgICAgICAgcERldmljZS0+QW5JbmZvLm1yX2FuX2NvbXBsZXRlICYmIHBEZXZpY2UtPkFuSW5mby5tcl9saW5rX29rICYmCisgICAgICAgICAgICAgICAgcERldmljZS0+QW5JbmZvLm1yX2xwX2Fkdl9mdWxsX2R1cGxleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE1fVUlOVDMyIFJlbW90ZVBoeUFkOworICAgICAgICAgICAgICAgIExNX1VJTlQzMiBMb2NhbFBoeUFkOworCisgICAgICAgICAgICAgICAgTG9jYWxQaHlBZCA9IDA7CisgICAgICAgICAgICAgICAgaWYocERldmljZS0+QW5JbmZvLm1yX2Fkdl9zeW1fcGF1c2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMb2NhbFBoeUFkIHw9IFBIWV9BTl9BRF9QQVVTRV9DQVBBQkxFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKHBEZXZpY2UtPkFuSW5mby5tcl9hZHZfYXN5bV9wYXVzZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExvY2FsUGh5QWQgfD0gUEhZX0FOX0FEX0FTWU1fUEFVU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUmVtb3RlUGh5QWQgPSAwOworICAgICAgICAgICAgICAgIGlmKHBEZXZpY2UtPkFuSW5mby5tcl9scF9hZHZfc3ltX3BhdXNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmVtb3RlUGh5QWQgfD0gUEhZX0xJTktfUEFSVE5FUl9QQVVTRV9DQVBBQkxFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKHBEZXZpY2UtPkFuSW5mby5tcl9scF9hZHZfYXN5bV9wYXVzZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJlbW90ZVBoeUFkIHw9IFBIWV9MSU5LX1BBUlRORVJfQVNZTV9QQVVTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMTV9TZXRGbG93Q29udHJvbChwRGV2aWNlLCBMb2NhbFBoeUFkLCBSZW1vdGVQaHlBZCk7CisKKyAgICAgICAgICAgICAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0FDVElWRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzMDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1NX1dhaXQoMjApOworICAgICAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cywgTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorICAgICAgICAgICAgICAgICAgICBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKTsKKyAgICAgICAgICAgICAgICBNTV9XYWl0KDIwKTsKKyAgICAgICAgICAgICAgICBpZiAoKFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cykgJgorICAgICAgICAgICAgICAgICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfCBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocERldmljZS0+UG9sbFRiaUxpbmspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7CisgICAgICAgICAgICAgICAgaWYgKFZhbHVlMzIgJiBNQUNfU1RBVFVTX1JFQ0VJVklOR19DRkcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5JZ25vcmVUYmlMaW5rQ2hhbmdlID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcERldmljZS0+SWdub3JlVGJpTGlua0NoYW5nZSA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgTWFjQ3RybC5TdGF0dXMpOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0RPV04gJiYKKyAgICAgICAgICAgICAgICAgKFZhbHVlMzIgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpICYmCisgICAgICAgICAgICAgICAgICgoVmFsdWUzMiAmIE1BQ19TVEFUVVNfUkVDRUlWSU5HX0NGRykgPT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19BQ1RJVkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXZSBhcmUgZm9yY2luZyBsaW5lIHNwZWVkLiAqLworICAgICAgICAgICAgcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJj0gfkxNX0ZMT1dfQ09OVFJPTF9BVVRPX1BBVVNFOworICAgICAgICAgICAgTE1fU2V0Rmxvd0NvbnRyb2wocERldmljZSwgMCwgMCk7CisKKyAgICAgICAgICAgIEN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfQUNUSVZFOworICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSB8CisgICAgICAgICAgICAgICAgTUFDX01PREVfU0VORF9DT05GSUdTKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBTZXQgdGhlIGxpbmsgcG9sYXJpdHkgYml0LiAqLworICAgIHBEZXZpY2UtPk1hY01vZGUgJj0gfk1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSk7CisKKyAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzID0gU1RBVFVTX0JMT0NLX1VQREFURUQgfAorICAgICAgICAocERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyAmIH5TVEFUVVNfQkxPQ0tfTElOS19DSEFOR0VEX1NUQVRVUyk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMTAwOyBqKyspCisgICAgeworICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5TdGF0dXMsIE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKyAgICAgICAgICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpOworICAgICAgICBNTV9XYWl0KDUpOworICAgICAgICBpZiAoKFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cykgJgorICAgICAgICAgICAgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCkpID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKTsKKyAgICBpZigoVmFsdWUzMiAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgPT0gMCkKKyAgICB7CisgICAgICAgIEN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfRE9XTjsKKyAgICAgICAgaWYgKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlIHwKKyAgICAgICAgICAgICAgICBNQUNfTU9ERV9TRU5EX0NPTkZJR1MpOworICAgICAgICAgICAgTU1fV2FpdCgxKTsKKyAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgY3VycmVudCBsaW5rIHN0YXR1cy4gKi8KKyAgICBpZihDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19BQ1RJVkUpCisgICAgeworICAgICAgICBwRGV2aWNlLT5MaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTOworICAgICAgICBwRGV2aWNlLT5EdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwgTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgfAorICAgICAgICAgICAgTEVEX0NUUkxfMTAwME1CUFNfTEVEX09OKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcERldmljZS0+TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF9VTktOT1dOOworICAgICAgICBwRGV2aWNlLT5EdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfVU5LTk9XTjsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwgTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgfAorICAgICAgICAgICAgTEVEX0NUUkxfT1ZFUlJJREVfVFJBRkZJQ19MRUQpOworICAgIH0KKworICAgIC8qIEluZGljYXRlIGxpbmsgc3RhdHVzLiAqLworICAgIGlmIChwRGV2aWNlLT5MaW5rU3RhdHVzICE9IEN1cnJlbnRMaW5rU3RhdHVzKSB7CisgICAgICAgIHBEZXZpY2UtPkxpbmtTdGF0dXMgPSBDdXJyZW50TGlua1N0YXR1czsKKyAgICAgICAgTU1fSW5kaWNhdGVTdGF0dXMocERldmljZSwgQ3VycmVudExpbmtTdGF0dXMpOworICAgIH0KKworICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBJTkNMVURFX1RCSV9TVVBQT1JUICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9TVEFUVVMKK0xNX1NldHVwQ29wcGVyUGh5KAorICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKyAgICBMTV9TVEFUVVMgQ3VycmVudExpbmtTdGF0dXM7CisgICAgTE1fVUlOVDMyIFZhbHVlMzI7CisKKyAgICAvKiBBc3N1bWUgdGhlcmUgaXMgbm90IGxpbmsgZmlyc3QuICovCisgICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOworCisgICAgLyogRGlzYWJsZSBwaHkgbGluayBjaGFuZ2UgYXR0ZW50aW9uLiAqLworICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1hY0V2ZW50LCAwKTsKKworICAgIC8qIENsZWFyIGxpbmsgY2hhbmdlIGF0dGVudGlvbi4gKi8KKyAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5TdGF0dXMsIE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKyAgICAgICAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCk7CisKKyAgICAvKiBEaXNhYmxlIGF1dG8tcG9sbGluZyBmb3IgdGhlIG1vbWVudC4gKi8KKyAgICBwRGV2aWNlLT5NaU1vZGUgPSAweGMwMDAwOworICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1pTW9kZSwgcERldmljZS0+TWlNb2RlKTsKKyAgICBNTV9XYWl0KDQwKTsKKworICAgIC8qIERldGVybWluZSB0aGUgcmVxdWVzdGVkIGxpbmUgc3BlZWQgYW5kIGR1cGxleC4gKi8KKyAgICBwRGV2aWNlLT5PbGRMaW5lU3BlZWQgPSBwRGV2aWNlLT5MaW5lU3BlZWQ7CisgICAgTE1fVHJhbnNsYXRlUmVxdWVzdGVkTWVkaWFUeXBlKHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSwKKyAgICAgICAgJnBEZXZpY2UtPk1lZGlhVHlwZSwgJnBEZXZpY2UtPkxpbmVTcGVlZCwgJnBEZXZpY2UtPkR1cGxleE1vZGUpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgcGh5IGNoaXAuICovCisgICAgc3dpdGNoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spCisgICAgeworICAgICAgICBjYXNlIFBIWV9CQ001NDAwX1BIWV9JRDoKKyAgICAgICAgY2FzZSBQSFlfQkNNNTQwMV9QSFlfSUQ6CisgICAgICAgIGNhc2UgUEhZX0JDTTU0MTFfUEhZX0lEOgorICAgICAgICBjYXNlIFBIWV9CQ001NzAxX1BIWV9JRDoKKyAgICAgICAgY2FzZSBQSFlfQkNNNTcwM19QSFlfSUQ6CisgICAgICAgIGNhc2UgUEhZX0JDTTU3MDRfUEhZX0lEOgorICAgICAgICAgICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9Jbml0QmNtNTQweFBoeShwRGV2aWNlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZihDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19TRVRUSU5HX01JU01BVENIKQorICAgIHsKKyAgICAgICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOworICAgIH0KKworICAgIC8qIFNldHVwIGZsb3cgY29udHJvbC4gKi8KKyAgICBwRGV2aWNlLT5GbG93Q29udHJvbCA9IExNX0ZMT1dfQ09OVFJPTF9OT05FOworICAgIGlmKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0FDVElWRSkKKyAgICB7CisgICAgICAgIExNX0ZMT1dfQ09OVFJPTCBGbG93Q2FwOyAgICAgLyogRmxvdyBjb250cm9sIGNhcGFiaWxpdHkuICovCisKKyAgICAgICAgRmxvd0NhcCA9IExNX0ZMT1dfQ09OVFJPTF9OT05FOworCisgICAgICAgIGlmKHBEZXZpY2UtPkR1cGxleE1vZGUgPT0gTE1fRFVQTEVYX01PREVfRlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocERldmljZS0+RGlzYWJsZUF1dG9OZWcgPT0gRkFMU0UgfHwKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTyB8fAorICAgICAgICAgICAgICAgIHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9PSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfQVVUTykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMTV9VSU5UMzIgRXhwZWN0ZWRQaHlBZDsKKyAgICAgICAgICAgICAgICBMTV9VSU5UMzIgTG9jYWxQaHlBZDsKKyAgICAgICAgICAgICAgICBMTV9VSU5UMzIgUmVtb3RlUGh5QWQ7CisKKyAgICAgICAgICAgICAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsICZMb2NhbFBoeUFkKTsKKwkJcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBMb2NhbFBoeUFkOworICAgICAgICAgICAgICAgIExvY2FsUGh5QWQgJj0gKFBIWV9BTl9BRF9BU1lNX1BBVVNFIHwgUEhZX0FOX0FEX1BBVVNFX0NBUEFCTEUpOworCisgICAgICAgICAgICAgICAgRXhwZWN0ZWRQaHlBZCA9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MocERldmljZSk7CisKKyAgICAgICAgICAgICAgICBpZihMb2NhbFBoeUFkICE9IEV4cGVjdGVkUGh5QWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0RPV047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExNX1JlYWRQaHkocERldmljZSwgUEhZX0xJTktfUEFSVE5FUl9BQklMSVRZX1JFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICZSZW1vdGVQaHlBZCk7CisKKyAgICAgICAgICAgICAgICAgICAgTE1fU2V0Rmxvd0NvbnRyb2wocERldmljZSwgTG9jYWxQaHlBZCwgUmVtb3RlUGh5QWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmPSB+TE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0U7CisgICAgICAgICAgICAgICAgTE1fU2V0Rmxvd0NvbnRyb2wocERldmljZSwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19ET1dOKQorICAgIHsKKyAgICAgICAgTE1fRm9yY2VBdXRvTmVnKHBEZXZpY2UsIHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSk7CisKKyAgICAgICAgLyogSWYgd2UgZm9yY2UgbGluZSBzcGVlZCwgd2UgbWFrZSBnZXQgbGluayByaWdodCBhd2F5LiAqLworICAgICAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisgICAgICAgIExNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKyAgICAgICAgaWYoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0FDVElWRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdNSUkgaW50ZXJmYWNlLiAqLworICAgIHBEZXZpY2UtPk1hY01vZGUgJj0gfk1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLOworICAgIGlmKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0FDVElWRSkKKyAgICB7CisgICAgICAgIGlmKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwME1CUFMgfHwKKyAgICAgICAgICAgIHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwTUJQUykKKyAgICAgICAgeworICAgICAgICAgICAgcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfTUlJOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIE1BQyB0byBvcGVyYXRlIGluIHRoZSBhcHByb3ByaWF0ZSBkdXBsZXggbW9kZS4gKi8KKyAgICBwRGV2aWNlLT5NYWNNb2RlICY9IH5NQUNfTU9ERV9IQUxGX0RVUExFWDsKKyAgICBpZihwRGV2aWNlLT5EdXBsZXhNb2RlID09IExNX0RVUExFWF9NT0RFX0hBTEYpCisgICAgeworICAgICAgICBwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX0hBTEZfRFVQTEVYOworICAgIH0KKworICAgIC8qIFNldCB0aGUgbGluayBwb2xhcml0eSBiaXQuICovCisgICAgcERldmljZS0+TWFjTW9kZSAmPSB+TUFDX01PREVfTElOS19QT0xBUklUWTsKKyAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCisgICAgeworICAgICAgICBpZigocERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9MSU5LMTApIHx8CisgICAgICAgICAgICAgKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0FDVElWRSAmJgorICAgICAgICAgICAgIHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwTUJQUykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEZXZpY2UtPk1hY01vZGUgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFKQorICAgICAgICB7CisgICAgICAgICAgICBwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgTEVEIG1vZGUuICovCisgICAgICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAorICAgICAgICAgICAgVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfT1VUUFVUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLkxlZEN0cmwsIFZhbHVlMzIpOworICAgIH0KKworICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOworCisgICAgLyogRW5hYmxlIGF1dG8gcG9sbGluZy4gKi8KKyAgICBpZihwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcpCisgICAgeworICAgICAgICBwRGV2aWNlLT5NaU1vZGUgfD0gTUlfTU9ERV9BVVRPX1BPTExJTkdfRU5BQkxFOworICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7CisgICAgfQorCisgICAgLyogRW5hYmxlIHBoeSBsaW5rIGNoYW5nZSBhdHRlbnRpb24uICovCisgICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUKQorICAgIHsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWFjRXZlbnQsIE1BQ19FVkVOVF9FTkFCTEVfTUlfSU5URVJSVVBUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWFjRXZlbnQsCisgICAgICAgICAgICBNQUNfRVZFTlRfRU5BQkxFX0xJTktfU1RBVEVfQ0hBTkdFRF9BVFROKTsKKyAgICB9CisgICAgaWYgKChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApICYmCisgICAgICAgIChDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19BQ1RJVkUpICYmCisgICAgICAgIChwRGV2aWNlLT5MaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xMDAwTUJQUykgJiYKKyAgICAgICAgKCgocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSAmJgorICAgICAgICAgIChwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9CVVNfU1BFRURfSElHSCkpIHx8CisgICAgICAgICAhKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkpKQorICAgIHsKKyAgICAgICAgTU1fV2FpdCgxMjApOworICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5TdGF0dXMsIE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKyAgICAgICAgICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpOworICAgICAgICBNRU1fV1JfT0ZGU0VUKHBEZXZpY2UsIFQzX0ZJUk1XQVJFX01BSUxCT1gsCisgICAgICAgICAgICBUM19NQUdJQ19OVU1fRElTQUJMRV9ETUFXX09OX0xJTktfQ0hBTkdFKTsKKyAgICB9CisKKyAgICAvKiBJbmRpY2F0ZSBsaW5rIHN0YXR1cy4gKi8KKyAgICBpZiAocERldmljZS0+TGlua1N0YXR1cyAhPSBDdXJyZW50TGlua1N0YXR1cykgeworICAgICAgICBwRGV2aWNlLT5MaW5rU3RhdHVzID0gQ3VycmVudExpbmtTdGF0dXM7CisgICAgICAgIE1NX0luZGljYXRlU3RhdHVzKHBEZXZpY2UsIEN1cnJlbnRMaW5rU3RhdHVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIExNX1NldHVwQ29wcGVyUGh5ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTCitMTV9TZXR1cFBoeSgKKyAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisgICAgTE1fU1RBVFVTIExtU3RhdHVzOworICAgIExNX1VJTlQzMiBWYWx1ZTMyOworCisjaWYgSU5DTFVERV9UQklfU1VQUE9SVAorICAgIGlmKHBEZXZpY2UtPkVuYWJsZVRiaSkKKyAgICB7CisgICAgICAgIExtU3RhdHVzID0gTE1fU2V0dXBGaWJlclBoeShwRGV2aWNlKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIElOQ0xVREVfVEJJX1NVUFBPUlQgKi8KKyAgICB7CisgICAgICAgIExtU3RhdHVzID0gTE1fU2V0dXBDb3BwZXJQaHkocERldmljZSk7CisgICAgfQorICAgIGlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzA0X0EwKQorICAgIHsKKyAgICAgICAgaWYgKCEocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBQY2lDZmcuUGNpU3RhdGUpOworICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSwKKyAgICAgICAgICAgICAgICBWYWx1ZTMyIHwgVDNfUENJX1NUQVRFX1JFVFJZX1NBTUVfRE1BKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTKSAmJgorICAgICAgICAocERldmljZS0+RHVwbGV4TW9kZSA9PSBMTV9EVVBMRVhfTU9ERV9IQUxGKSkKKyAgICB7CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlR4TGVuZ3RocywgMHgyNmZmKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuVHhMZW5ndGhzLCAweDI2MjApOworICAgIH0KKworICAgIHJldHVybiBMbVN0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9WT0lECitMTV9SZWFkUGh5KAorUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorTE1fVUlOVDMyIFBoeVJlZywKK1BMTV9VSU5UMzIgcERhdGEzMikgeworICAgIExNX1VJTlQzMiBWYWx1ZTMyOworICAgIExNX1VJTlQzMiBqOworCisgICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKQorICAgIHsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUgJgorICAgICAgICAgICAgfk1JX01PREVfQVVUT19QT0xMSU5HX0VOQUJMRSk7CisgICAgICAgIE1NX1dhaXQoNDApOworICAgIH0KKworICAgIFZhbHVlMzIgPSAocERldmljZS0+UGh5QWRkciA8PCBNSV9DT01fRklSU1RfUEhZX0FERFJfQklUKSB8CisgICAgICAgICgoUGh5UmVnICYgTUlfQ09NX1BIWV9SRUdfQUREUl9NQVNLKSA8PCBNSV9DT01fRklSU1RfUEhZX1JFR19BRERSX0JJVCkgfAorICAgICAgICBNSV9DT01fQ01EX1JFQUQgfCBNSV9DT01fU1RBUlQ7CisKKyAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaUNvbSwgVmFsdWUzMik7CisKKyAgICBmb3IoaiA9IDA7IGogPCAyMDsgaisrKQorICAgIHsKKyAgICAgICAgTU1fV2FpdCgyNSk7CisKKyAgICAgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLk1pQ29tKTsKKworICAgICAgICBpZighKFZhbHVlMzIgJiBNSV9DT01fQlVTWSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1NX1dhaXQoNSk7CisgICAgICAgICAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIE1hY0N0cmwuTWlDb20pOworICAgICAgICAgICAgVmFsdWUzMiAmPSBNSV9DT01fUEhZX0RBVEFfTUFTSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoVmFsdWUzMiAmIE1JX0NPTV9CVVNZKQorICAgIHsKKyAgICAgICAgVmFsdWUzMiA9IDA7CisgICAgfQorCisgICAgKnBEYXRhMzIgPSBWYWx1ZTMyOworCisgICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKQorICAgIHsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUpOworICAgICAgICBNTV9XYWl0KDQwKTsKKyAgICB9Cit9IC8qIExNX1JlYWRQaHkgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fVk9JRAorTE1fV3JpdGVQaHkoCitQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCitMTV9VSU5UMzIgUGh5UmVnLAorTE1fVUlOVDMyIERhdGEzMikgeworICAgIExNX1VJTlQzMiBWYWx1ZTMyOworICAgIExNX1VJTlQzMiBqOworCisgICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKQorICAgIHsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUgJgorICAgICAgICAgICAgfk1JX01PREVfQVVUT19QT0xMSU5HX0VOQUJMRSk7CisgICAgICAgIE1NX1dhaXQoNDApOworICAgIH0KKworICAgIFZhbHVlMzIgPSAocERldmljZS0+UGh5QWRkciA8PCBNSV9DT01fRklSU1RfUEhZX0FERFJfQklUKSB8CisgICAgICAgICgoUGh5UmVnICYgTUlfQ09NX1BIWV9SRUdfQUREUl9NQVNLKSA8PCBNSV9DT01fRklSU1RfUEhZX1JFR19BRERSX0JJVCkgfAorICAgICAgICAoRGF0YTMyICYgTUlfQ09NX1BIWV9EQVRBX01BU0spIHwgTUlfQ09NX0NNRF9XUklURSB8IE1JX0NPTV9TVEFSVDsKKworICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1pQ29tLCBWYWx1ZTMyKTsKKworICAgIGZvcihqID0gMDsgaiA8IDIwOyBqKyspCisgICAgeworICAgICAgICBNTV9XYWl0KDI1KTsKKworICAgICAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIE1hY0N0cmwuTWlDb20pOworCisgICAgICAgIGlmKCEoVmFsdWUzMiAmIE1JX0NPTV9CVVNZKSkKKyAgICAgICAgeworICAgICAgICAgICAgTU1fV2FpdCg1KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKQorICAgIHsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUpOworICAgICAgICBNTV9XYWl0KDQwKTsKKyAgICB9Cit9IC8qIExNX1dyaXRlUGh5ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9TVEFUVVMKK0xNX1NldFBvd2VyU3RhdGUoCitQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCitMTV9QT1dFUl9TVEFURSBQb3dlckxldmVsKSB7CisgICAgTE1fVUlOVDMyIFBtZVN1cHBvcnQ7CisgICAgTE1fVUlOVDMyIFZhbHVlMzI7CisgICAgTE1fVUlOVDMyIFBtQ3RybDsKKworICAgIC8qIG1ha2Ugc3VyZWluZGlyZWN0IGFjY2Vzc2VzIGFyZSBlbmFibGVkKi8KKyAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NSVNDX0hPU1RfQ1RSTF9SRUcsIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCk7CisKKyAgICAvKiBDbGVhciB0aGUgUE1FX0FTU0VSVCBiaXQgYW5kIHRoZSBwb3dlciBzdGF0ZSBiaXRzLiAgQWxzbyBlbmFibGUgKi8KKyAgICAvKiB0aGUgUE1FIGJpdC4gKi8KKyAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX1BNX1NUQVRVU19DVFJMX1JFRywgJlBtQ3RybCk7CisKKyAgICBQbUN0cmwgfD0gVDNfUE1fUE1FX0FTU0VSVEVEOworICAgIFBtQ3RybCAmPSB+VDNfUE1fUE9XRVJfU1RBVEVfTUFTSzsKKworICAgIC8qIFNldCB0aGUgYXBwcm9wcmlhdGUgcG93ZXIgc3RhdGUuICovCisgICAgaWYoUG93ZXJMZXZlbCA9PSBMTV9QT1dFUl9TVEFURV9EMCkKKyAgICB7CisKKyAgICAgICAgLyogQnJpbmcgdGhlIGNhcmQgb3V0IG9mIGxvdyBwb3dlciBtb2RlLiAqLworICAgICAgICBQbUN0cmwgfD0gVDNfUE1fUE9XRVJfU1RBVEVfRDA7CisgICAgICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX1BNX1NUQVRVU19DVFJMX1JFRywgUG1DdHJsKTsKKworICAgICAgICBSRUdfV1IocERldmljZSwgR3JjLkxvY2FsQ3RybCwgcERldmljZS0+R3JjTG9jYWxDdHJsKTsKKyAgICAgICAgTU1fV2FpdCAoNDApOworI2lmIDAgICAvKiBCdWdmaXggYnkgam1iLi4uY2FuJ3QgY2FsbCBXcml0ZVBoeSBoZXJlIGJlY2F1c2UgcERldmljZSBub3QgZnVsbHkgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwMV9BVVhfQ1RSTCwgMHgwMik7CisjZW5kaWYKKworICAgICAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UgaWYoUG93ZXJMZXZlbCA9PSBMTV9QT1dFUl9TVEFURV9EMSkKKyAgICB7CisgICAgICAgIFBtQ3RybCB8PSBUM19QTV9QT1dFUl9TVEFURV9EMTsKKyAgICB9CisgICAgZWxzZSBpZihQb3dlckxldmVsID09IExNX1BPV0VSX1NUQVRFX0QyKQorICAgIHsKKyAgICAgICAgUG1DdHJsIHw9IFQzX1BNX1BPV0VSX1NUQVRFX0QyOworICAgIH0KKyAgICBlbHNlIGlmKFBvd2VyTGV2ZWwgPT0gTE1fUE9XRVJfU1RBVEVfRDMpCisgICAgeworICAgICAgICBQbUN0cmwgfD0gVDNfUE1fUE9XRVJfU1RBVEVfRDM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisgICAgUG1DdHJsIHw9IFQzX1BNX1BNRV9FTkFCTEU7CisKKyAgICAvKiBNYXNrIG91dCBhbGwgaW50ZXJydXB0cyBzbyBMTV9TZXR1cFBoeSB3b24ndCBiZSBjYWxsZWQgd2hpbGUgd2UgYXJlICovCisgICAgLyogc2V0dGluZyBuZXcgbGluZSBzcGVlZC4gKi8KKyAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5NaXNjSG9zdEN0cmwpOworICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuTWlzY0hvc3RDdHJsLCBWYWx1ZTMyIHwgTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UKTsKKworICAgIGlmKCFwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXApCisgICAgeworICAgICAgICBwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXAgPSBUUlVFOworICAgICAgICBwRGV2aWNlLT5XYWtlVXBEaXNhYmxlQXV0b05lZyA9IHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnOworICAgICAgICBwRGV2aWNlLT5XYWtlVXBSZXF1ZXN0ZWRNZWRpYVR5cGUgPSBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGU7CisgICAgfQorCisgICAgLyogRm9yY2UgYXV0by1uZWdvdGlhdGlvbiB0byAxMCBsaW5lIHNwZWVkLiAqLworICAgIHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gRkFMU0U7CisgICAgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwTUJQUzsKKyAgICBMTV9TZXR1cFBoeShwRGV2aWNlKTsKKworICAgIC8qIFB1dCB0aGUgZHJpdmVyIGluIHRoZSBpbml0aWFsIHN0YXRlLCBhbmQgZ28gdGhyb3VnaCB0aGUgcG93ZXIgZG93biAqLworICAgIC8qIHNlcXVlbmNlLiAqLworICAgIExNX0hhbHQocERldmljZSk7CisKKyAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX1BNX0NBUF9SRUcsICZQbWVTdXBwb3J0KTsKKworICAgIGlmIChwRGV2aWNlLT5XYWtlVXBNb2RlQ2FwICE9IExNX1dBS0VfVVBfTU9ERV9OT05FKQorICAgIHsKKworICAgICAgICAvKiBFbmFibGUgV09MLiAqLworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDAxX0FVWF9DVFJMLCAweDVhKTsKKyAgICAgICAgTU1fV2FpdCg0MCk7CisKKyAgICAgICAgLyogU2V0IExFRCBtb2RlLiAqLworICAgICAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKyAgICAgICAgICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX09VVFBVVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFZhbHVlMzIgPSBNQUNfTU9ERV9QT1JUX01PREVfTUlJOworICAgICAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfTElOSzEwIHx8CisgICAgICAgICAgICAgICAgcERldmljZS0+V29sU3BlZWQgPT0gV09MX1NQRUVEXzEwTUIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUzMiB8PSBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiB8PSBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZOworICAgICAgICB9CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIFZhbHVlMzIpOworICAgICAgICBNTV9XYWl0KDQwKTsgTU1fV2FpdCg0MCk7IE1NX1dhaXQoNDApOworCisgICAgICAgIC8qIEFsd2F5cyBlbmFibGUgbWFnaWMgcGFja2V0IHdha2UtdXAgaWYgd2UgaGF2ZSB2YXV4LiAqLworICAgICAgICBpZigoUG1lU3VwcG9ydCAmIFQzX1BDSV9QTV9DQVBfUE1FX0QzQ09MRCkgJiYKKyAgICAgICAgICAgIChwRGV2aWNlLT5XYWtlVXBNb2RlQ2FwICYgTE1fV0FLRV9VUF9NT0RFX01BR0lDX1BBQ0tFVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlMzIgfD0gTUFDX01PREVfREVURUNUX01BR0lDX1BBQ0tFVF9FTkFCTEU7CisgICAgICAgIH0KKworICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCBWYWx1ZTMyKTsKKworICAgICAgICAvKiBFbmFibGUgdGhlIHJlY2VpdmVyLiAqLworICAgICAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIFJYX01PREVfRU5BQkxFKTsKKyAgICB9CisKKyAgICAvKiBEaXNhYmxlIHR4L3J4IGNsb2NrcywgYW5kIHNlbGV0ZWN0IGFuIGFsdGVybmF0ZSBjbG9jay4gKi8KKyAgICBpZihwRGV2aWNlLT5Xb2xTcGVlZCA9PSBXT0xfU1BFRURfMTAwTUIpCisgICAgeworICAgICAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKyAgICAgICAgICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiA9IFQzX1BDSV9ESVNBQkxFX1JYX0NMT0NLIHwgVDNfUENJX0RJU0FCTEVfVFhfQ0xPQ0sgfAorICAgICAgICAgICAgICAgIFQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiA9IFQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLOworICAgICAgICB9CisgICAgICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBWYWx1ZTMyKTsKKworICAgICAgICBNTV9XYWl0KDQwKTsKKworICAgICAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKyAgICAgICAgICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiA9IFQzX1BDSV9ESVNBQkxFX1JYX0NMT0NLIHwgVDNfUENJX0RJU0FCTEVfVFhfQ0xPQ0sgfAorICAgICAgICAgICAgICAgIFQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLIHwgVDNfUENJXzQ0TUhaX0NPUkVfQ0xPQ0s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZTMyID0gVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0sgfAorICAgICAgICAgICAgICAgIFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLOworICAgICAgICB9CisKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIFZhbHVlMzIpOworCisgICAgICAgIE1NX1dhaXQoNDApOworCisgICAgICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAorICAgICAgICAgICAgVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZTMyID0gVDNfUENJX0RJU0FCTEVfUlhfQ0xPQ0sgfCBUM19QQ0lfRElTQUJMRV9UWF9DTE9DSyB8CisgICAgICAgICAgICAgICAgVDNfUENJXzQ0TUhaX0NPUkVfQ0xPQ0s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZTMyID0gVDNfUENJXzQ0TUhaX0NPUkVfQ0xPQ0s7CisgICAgICAgIH0KKworICAgICAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgVmFsdWUzMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAorICAgICAgICAgICAgVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZTMyID0gVDNfUENJX0RJU0FCTEVfUlhfQ0xPQ0sgfCBUM19QQ0lfRElTQUJMRV9UWF9DTE9DSyB8CisgICAgICAgICAgICAgICAgVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0sgfAorICAgICAgICAgICAgICAgIFQzX1BDSV9QT1dFUl9ET1dOX1BDSV9QTEwxMzM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZTMyID0gVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0sgfAorICAgICAgICAgICAgICAgIFQzX1BDSV9QT1dFUl9ET1dOX1BDSV9QTEwxMzM7CisgICAgICAgIH0KKworICAgICAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgVmFsdWUzMik7CisgICAgfQorCisgICAgTU1fV2FpdCg0MCk7CisKKyAgICBpZighcERldmljZS0+RWVwcm9tV3AgJiYgKHBEZXZpY2UtPldha2VVcE1vZGVDYXAgIT0gTE1fV0FLRV9VUF9NT0RFX05PTkUpKQorICAgIHsKKyAgICAgICAgLyogU3dpdGNoIGFkYXB0ZXIgdG8gYXV4aWxsaWFyeSBwb3dlci4gKi8KKyAgICAgICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisgICAgICAgICAgICBUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdQSU8wID0gMSwgR1BJTzEgPSAxLCBHUElPMiA9IDAuICovCisgICAgICAgICAgICBSRUdfV1IocERldmljZSwgR3JjLkxvY2FsQ3RybCwgcERldmljZS0+R3JjTG9jYWxDdHJsIHwKKyAgICAgICAgICAgICAgICBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UwIHwKKyAgICAgICAgICAgICAgICBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxIHwKKyAgICAgICAgICAgICAgICBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UyIHwKKyAgICAgICAgICAgICAgICBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMCB8CisgICAgICAgICAgICAgICAgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDEpOworICAgICAgICAgICAgICAgIE1NX1dhaXQoNDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogR1BJTzAgPSAwLCBHUElPMSA9IDEsIEdQSU8yID0gMS4gKi8KKyAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfAorICAgICAgICAgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgfAorICAgICAgICAgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEgfAorICAgICAgICAgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTIgfAorICAgICAgICAgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxIHwKKyAgICAgICAgICAgICAgICBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMik7CisgICAgICAgICAgICAgICAgTU1fV2FpdCg0MCk7CisKKyAgICAgICAgICAgIC8qIEdQSU8wID0gMSwgR1BJTzEgPSAxLCBHUElPMiA9IDEuICovCisgICAgICAgICAgICBSRUdfV1IocERldmljZSwgR3JjLkxvY2FsQ3RybCwgcERldmljZS0+R3JjTG9jYWxDdHJsIHwKKyAgICAgICAgICAgICAgICBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UwIHwKKyAgICAgICAgICAgICAgICBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxIHwKKyAgICAgICAgICAgICAgICBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UyIHwKKyAgICAgICAgICAgICAgICBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMCB8CisgICAgICAgICAgICAgICAgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDEgfAorICAgICAgICAgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQyKTsKKyAgICAgICAgICAgICAgICBNTV9XYWl0KDQwKTsKKworICAgICAgICAgICAgLyogR1BJTzAgPSAxLCBHUElPMSA9IDEsIEdQSU8yID0gMC4gKi8KKyAgICAgICAgICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfAorICAgICAgICAgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgfAorICAgICAgICAgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEgfAorICAgICAgICAgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTIgfAorICAgICAgICAgICAgICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQwIHwKKyAgICAgICAgICAgICAgICBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMSk7CisgICAgICAgICAgICAgICAgTU1fV2FpdCg0MCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIHBoeSB0byBsb3cgcG93ZXIgbW9kZS4gKi8KKyAgICAvKiBQdXQgdGhlIHRoZSBoYXJkd2FyZSBpbiBsb3cgcG93ZXIgbW9kZS4gKi8KKyAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9QTV9TVEFUVVNfQ1RSTF9SRUcsIFBtQ3RybCk7CisKKyAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9IC8qIExNX1NldFBvd2VyU3RhdGUgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIExNX1VJTlQzMgorR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncygKKyAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisgICAgTE1fVUlOVDMyIFZhbHVlMzI7CisKKyAgICBWYWx1ZTMyID0gMDsKKworICAgIC8qIEF1dG8gbmVnb3RpYXRpb24gZmxvdyBjb250cm9sIG9ubHkgd2hlbiBhdXRvbmVnb3RpYXRpb24gaXMgZW5hYmxlZC4gKi8KKyAgICBpZihwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9PSBGQUxTRSB8fAorICAgICAgICBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTyB8fAorICAgICAgICBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQX0FVVE8pCisgICAgeworICAgICAgICAvKiBQbGVhc2UgcmVmZXIgdG8gVGFibGUgMjhCLTMgb2YgdGhlIDgwMi4zYWItMTk5OSBzcGVjLiAqLworICAgICAgICBpZigocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgPT0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0UpIHx8CisgICAgICAgICAgICAoKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0UpICYmCisgICAgICAgICAgICAocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UpKSkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiB8PSBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZTMyIHw9IFBIWV9BTl9BRF9BU1lNX1BBVVNFOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiB8PSBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRSB8IFBIWV9BTl9BRF9BU1lNX1BBVVNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFZhbHVlMzI7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTE1fU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBMTV9TVEFUVVMKK0xNX0ZvcmNlQXV0b05lZ0JjbTU0MHhQaHkoCitQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCitMTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGUpCit7CisgICAgTE1fTUVESUFfVFlQRSBNZWRpYVR5cGU7CisgICAgTE1fTElORV9TUEVFRCBMaW5lU3BlZWQ7CisgICAgTE1fRFVQTEVYX01PREUgRHVwbGV4TW9kZTsKKyAgICBMTV9VSU5UMzIgTmV3UGh5Q3RybDsKKyAgICBMTV9VSU5UMzIgVmFsdWUzMjsKKyAgICBMTV9VSU5UMzIgQ250OworCisgICAgLyogR2V0IHRoZSBpbnRlcmZhY2UgdHlwZSwgbGluZSBzcGVlZCwgYW5kIGR1cGxleCBtb2RlLiAqLworICAgIExNX1RyYW5zbGF0ZVJlcXVlc3RlZE1lZGlhVHlwZShSZXF1ZXN0ZWRNZWRpYVR5cGUsICZNZWRpYVR5cGUsICZMaW5lU3BlZWQsCisgICAgICAgICZEdXBsZXhNb2RlKTsKKworICAgIGlmIChwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXApCisgICAgeworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywgMCk7CisgICAgICAgIHBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IDA7CisgICAgICAgIFZhbHVlMzIgPSBQSFlfQU5fQURfMTBCQVNFVF9GVUxMIHwgUEhZX0FOX0FEXzEwQkFTRVRfSEFMRjsKKyAgICAgICAgaWYgKHBEZXZpY2UtPldvbFNwZWVkID09IFdPTF9TUEVFRF8xMDBNQikKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiB8PSBQSFlfQU5fQURfMTAwQkFTRVRYX0ZVTEwgfCBQSFlfQU5fQURfMTAwQkFTRVRYX0hBTEY7CisgICAgICAgIH0KKyAgICAgICAgVmFsdWUzMiB8PSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRDsKKyAgICAgICAgVmFsdWUzMiB8PSBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzKHBEZXZpY2UpOworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBQSFlfQU5fQURfUkVHLCBWYWx1ZTMyKTsKKyAgICAgICAgcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOworICAgIH0KKyAgICAvKiBTZXR1cCB0aGUgYXV0by1uZWdvdGlhdGlvbiBhZHZlcnRpc2VtZW50IHJlZ2lzdGVyLiAqLworICAgIGVsc2UgaWYoTGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfVU5LTk9XTikKKyAgICB7CisgICAgICAgIC8qIFNldHVwIHRoZSAxMC8xMDAgTWJwcyBhdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgcmVnaXN0ZXIuICovCisgICAgICAgIFZhbHVlMzIgPSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRCB8CisgICAgICAgICAgICBQSFlfQU5fQURfMTBCQVNFVF9IQUxGIHwgUEhZX0FOX0FEXzEwQkFTRVRfRlVMTCB8CisgICAgICAgICAgICBQSFlfQU5fQURfMTAwQkFTRVRYX0ZVTEwgfCBQSFlfQU5fQURfMTAwQkFTRVRYX0hBTEY7CisgICAgICAgIFZhbHVlMzIgfD0gR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyhwRGV2aWNlKTsKKworICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBQSFlfQU5fQURfUkVHLCBWYWx1ZTMyKTsKKyAgICAgICAgcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOworCisgICAgICAgIC8qIEFkdmVydGlzZSAxMDAwTWJwcyAqLworICAgICAgICBWYWx1ZTMyID0gQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfSEFMRiB8IEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0ZVTEw7CisKKyNpZiBJTkNMVURFXzU3MDFfQVhfRklYCisgICAgICAgIC8qIEJ1Zzogd29ya2Fyb3VuZCBmb3IgQ1JDIGVycm9yIGluIGdpZ2FiaXQgbW9kZSB3aGVuIHdlIGFyZSBpbiAqLworICAgICAgICAvKiBzbGF2ZSBtb2RlLiAgVGhpcyB3aWxsIGZvcmNlIHRoZSBQSFkgdG8gb3BlcmF0ZSBpbiAqLworICAgICAgICAvKiBtYXN0ZXIgbW9kZS4gKi8KKyAgICAgICAgaWYocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAorICAgICAgICAgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUzMiB8PSBCQ001NDBYX0NPTkZJR19BU19NQVNURVIgfAorICAgICAgICAgICAgICAgIEJDTTU0MFhfRU5BQkxFX0NPTkZJR19BU19NQVNURVI7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfMTAwMEJBU0VUX0NUUkxfUkVHLCBWYWx1ZTMyKTsKKyAgICAgICAgcERldmljZS0+YWR2ZXJ0aXNpbmcxMDAwID0gVmFsdWUzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoTGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwME1CUFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlMzIgPSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRDsKKyAgICAgICAgICAgIFZhbHVlMzIgfD0gR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyhwRGV2aWNlKTsKKworICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgUEhZX0FOX0FEX1JFRywgVmFsdWUzMik7CisgICAgICAgICAgICBwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7CisKKyAgICAgICAgICAgIGlmKER1cGxleE1vZGUgIT0gTE1fRFVQTEVYX01PREVfRlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZTMyID0gQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfSEFMRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZTMyID0gQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfRlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsIFZhbHVlMzIpOworICAgICAgICAgICAgcERldmljZS0+YWR2ZXJ0aXNpbmcxMDAwID0gVmFsdWUzMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKExpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwME1CUFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfMTAwMEJBU0VUX0NUUkxfUkVHLCAwKTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IDA7CisKKyAgICAgICAgICAgIGlmKER1cGxleE1vZGUgIT0gTE1fRFVQTEVYX01PREVfRlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZTMyID0gUEhZX0FOX0FEXzEwMEJBU0VUWF9IQUxGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlMzIgPSBQSFlfQU5fQURfMTAwQkFTRVRYX0ZVTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZhbHVlMzIgfD0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0Q7CisgICAgICAgICAgICBWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MocERldmljZSk7CisKKyAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsIFZhbHVlMzIpOworICAgICAgICAgICAgcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoTGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTBNQlBTKQorICAgICAgICB7CisgICAgICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywgMCk7CisgICAgICAgICAgICBwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSAwOworCisgICAgICAgICAgICBpZihEdXBsZXhNb2RlICE9IExNX0RVUExFWF9NT0RFX0ZVTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUzMiA9IFBIWV9BTl9BRF8xMEJBU0VUX0hBTEY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUzMiA9IFBIWV9BTl9BRF8xMEJBU0VUX0ZVTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZhbHVlMzIgfD0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0Q7CisgICAgICAgICAgICBWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MocERldmljZSk7CisKKyAgICAgICAgICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsIFZhbHVlMzIpOworICAgICAgICAgICAgcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRm9yY2UgbGluZSBzcGVlZCBpZiBhdXRvLW5lZ290aWF0aW9uIGlzIGRpc2FibGVkLiAqLworICAgIGlmKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnICYmIExpbmVTcGVlZCAhPSBMTV9MSU5FX1NQRUVEX1VOS05PV04pCisgICAgeworICAgICAgICAvKiBUaGlzIGNvZGUgcGF0aCBpcyBleGVjdXRlZCBvbmx5IHdoZW4gdGhlcmUgaXMgbGluay4gKi8KKyAgICAgICAgcERldmljZS0+TWVkaWFUeXBlID0gTWVkaWFUeXBlOworICAgICAgICBwRGV2aWNlLT5MaW5lU3BlZWQgPSBMaW5lU3BlZWQ7CisgICAgICAgIHBEZXZpY2UtPkR1cGxleE1vZGUgPSBEdXBsZXhNb2RlOworCisgICAgICAgIC8qIEZvcmNlIGxpbmUgc2VlcGQuICovCisgICAgICAgIE5ld1BoeUN0cmwgPSAwOworICAgICAgICBzd2l0Y2goTGluZVNwZWVkKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIExNX0xJTkVfU1BFRURfMTBNQlBTOgorICAgICAgICAgICAgICAgIE5ld1BoeUN0cmwgfD0gUEhZX0NUUkxfU1BFRURfU0VMRUNUXzEwTUJQUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTE1fTElORV9TUEVFRF8xMDBNQlBTOgorICAgICAgICAgICAgICAgIE5ld1BoeUN0cmwgfD0gUEhZX0NUUkxfU1BFRURfU0VMRUNUXzEwME1CUFM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExNX0xJTkVfU1BFRURfMTAwME1CUFM6CisgICAgICAgICAgICAgICAgTmV3UGh5Q3RybCB8PSBQSFlfQ1RSTF9TUEVFRF9TRUxFQ1RfMTAwME1CUFM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE5ld1BoeUN0cmwgfD0gUEhZX0NUUkxfU1BFRURfU0VMRUNUXzEwMDBNQlBTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYoRHVwbGV4TW9kZSA9PSBMTV9EVVBMRVhfTU9ERV9GVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBOZXdQaHlDdHJsIHw9IFBIWV9DVFJMX0ZVTExfRFVQTEVYX01PREU7CisgICAgICAgIH0KKworICAgICAgICAvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgUEhZX0NUUkwgaXMgYWxyZWFkeSB3aGF0IHdlIHdhbnRlZC4gKi8KKyAgICAgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsICZWYWx1ZTMyKTsKKyAgICAgICAgaWYoVmFsdWUzMiAhPSBOZXdQaHlDdHJsKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUZW1wb3JhcnkgYnJpbmcgdGhlIGxpbmsgZG93biBiZWZvcmUgZm9yY2luZyBsaW5lIHNwZWVkLiAqLworICAgICAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgUEhZX0NUUkxfUkVHLCBQSFlfQ1RSTF9MT09QQkFDS19NT0RFKTsKKworICAgICAgICAgICAgLyogV2FpdCBmb3IgbGluayB0byBnbyBkb3duLiAqLworICAgICAgICAgICAgZm9yKENudCA9IDA7IENudCA8IDE1MDAwOyBDbnQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNTV9XYWl0KDEwKTsKKworICAgICAgICAgICAgICAgIExNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKyAgICAgICAgICAgICAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisKKyAgICAgICAgICAgICAgICBpZighKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNTV9XYWl0KDQwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsIE5ld1BoeUN0cmwpOworICAgICAgICAgICAgTU1fV2FpdCg0MCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTE1fV3JpdGVQaHkocERldmljZSwgUEhZX0NUUkxfUkVHLCBQSFlfQ1RSTF9BVVRPX05FR19FTkFCTEUgfAorICAgICAgICAgICAgUEhZX0NUUkxfUkVTVEFSVF9BVVRPX05FRyk7CisgICAgfQorCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfSAvKiBMTV9Gb3JjZUF1dG9OZWdCY201NDB4UGh5ICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBMTV9TVEFUVVMKK0xNX0ZvcmNlQXV0b05lZygKK1BMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKK0xNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFJlcXVlc3RlZE1lZGlhVHlwZSkKK3sKKyAgICBMTV9TVEFUVVMgTG1TdGF0dXM7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBwaHkgY2hpcC4gKi8KKyAgICBzd2l0Y2gocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykKKyAgICB7CisgICAgICAgIGNhc2UgUEhZX0JDTTU0MDBfUEhZX0lEOgorICAgICAgICBjYXNlIFBIWV9CQ001NDAxX1BIWV9JRDoKKyAgICAgICAgY2FzZSBQSFlfQkNNNTQxMV9QSFlfSUQ6CisgICAgICAgIGNhc2UgUEhZX0JDTTU3MDFfUEhZX0lEOgorICAgICAgICBjYXNlIFBIWV9CQ001NzAzX1BIWV9JRDoKKyAgICAgICAgY2FzZSBQSFlfQkNNNTcwNF9QSFlfSUQ6CisgICAgICAgICAgICBMbVN0YXR1cyA9IExNX0ZvcmNlQXV0b05lZ0JjbTU0MHhQaHkocERldmljZSwgUmVxdWVzdGVkTWVkaWFUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMbVN0YXR1cyA9IExNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIExtU3RhdHVzOworfSAvKiBMTV9Gb3JjZUF1dG9OZWcgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9TVEFUVVMgTE1fTG9hZEZpcm13YXJlKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFQzX0ZXSU1HX0lORk8gcEZ3SW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMTV9VSU5UMzIgTG9hZENwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTE1fVUlOVDMyIFN0YXJ0Q3B1KQoreworICAgIExNX1VJTlQzMiBpOworICAgIExNX1VJTlQzMiBhZGRyZXNzOworCisgICAgaWYgKExvYWRDcHUgJiBUM19SWF9DUFVfSUQpCisgICAgeworICAgICAgICBpZiAoTE1fSGFsdENwdShwRGV2aWNlLFQzX1JYX0NQVV9JRCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpcnN0IG9mIGFsbCBjbGVhciBzY3JhY2ggcGFkIG1lbW9yeSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgVDNfUlhfQ1BVX1NQQURfU0laRTsgaSs9NCkKKyAgICAgICAgeworICAgICAgICAgICAgTE1fUmVnV3JJbmQocERldmljZSxUM19SWF9DUFVfU1BBRF9BRERSK2ksMCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb3B5IGNvZGUgZmlyc3QgKi8KKyAgICAgICAgYWRkcmVzcyA9IFQzX1JYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5UZXh0Lk9mZnNldCAmIDB4ZmZmZik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gcEZ3SW1nLT5UZXh0Lkxlbmd0aDsgaSs9NCkKKyAgICAgICAgeworICAgICAgICAgICAgTE1fUmVnV3JJbmQocERldmljZSxhZGRyZXNzK2ksCisgICAgICAgICAgICAgICAgICAgICAgICAoKExNX1VJTlQzMiAqKXBGd0ltZy0+VGV4dC5CdWZmZXIpW2kvNF0pOworICAgICAgICB9CisKKyAgICAgICAgYWRkcmVzcyA9IFQzX1JYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5ST25seURhdGEuT2Zmc2V0ICYgMHhmZmZmKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBwRndJbWctPlJPbmx5RGF0YS5MZW5ndGg7IGkrPTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIExNX1JlZ1dySW5kKHBEZXZpY2UsYWRkcmVzcytpLAorICAgICAgICAgICAgICAgICAgICAgICAgKChMTV9VSU5UMzIgKilwRndJbWctPlJPbmx5RGF0YS5CdWZmZXIpW2kvNF0pOworICAgICAgICB9CisKKyAgICAgICAgYWRkcmVzcyA9IFQzX1JYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5EYXRhLk9mZnNldCAmIDB4ZmZmZik7CisgICAgICAgIGZvciAoaT0gMDsgaSA8PSBwRndJbWctPkRhdGEuTGVuZ3RoOyBpKz00KQorICAgICAgICB7CisgICAgICAgICAgICBMTV9SZWdXckluZChwRGV2aWNlLGFkZHJlc3MraSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoTE1fVUlOVDMyICopcEZ3SW1nLT5EYXRhLkJ1ZmZlcilbaS80XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoTG9hZENwdSAmIFQzX1RYX0NQVV9JRCkKKyAgICB7CisgICAgICAgIGlmIChMTV9IYWx0Q3B1KHBEZXZpY2UsVDNfVFhfQ1BVX0lEKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisKKyAgICAgICAgLyogRmlyc3Qgb2YgYWxsIGNsZWFyIHNjcmFjaCBwYWQgbWVtb3J5ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBUM19UWF9DUFVfU1BBRF9TSVpFOyBpKz00KQorICAgICAgICB7CisgICAgICAgICAgICBMTV9SZWdXckluZChwRGV2aWNlLFQzX1RYX0NQVV9TUEFEX0FERFIraSwwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvcHkgY29kZSBmaXJzdCAqLworICAgICAgICBhZGRyZXNzID0gVDNfVFhfQ1BVX1NQQURfQUREUiArIChwRndJbWctPlRleHQuT2Zmc2V0ICYgMHhmZmZmKTsKKyAgICAgICAgZm9yIChpPSAwOyBpIDw9IHBGd0ltZy0+VGV4dC5MZW5ndGg7IGkrPTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIExNX1JlZ1dySW5kKHBEZXZpY2UsYWRkcmVzcytpLAorICAgICAgICAgICAgICAgICAgICAgICAgKChMTV9VSU5UMzIgKilwRndJbWctPlRleHQuQnVmZmVyKVtpLzRdKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkZHJlc3MgPSBUM19UWF9DUFVfU1BBRF9BRERSICsgKHBGd0ltZy0+Uk9ubHlEYXRhLk9mZnNldCAmIDB4ZmZmZik7CisgICAgICAgIGZvciAoaT0gMDsgaSA8PSBwRndJbWctPlJPbmx5RGF0YS5MZW5ndGg7IGkrPTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIExNX1JlZ1dySW5kKHBEZXZpY2UsYWRkcmVzcytpLAorICAgICAgICAgICAgICAgICAgICAgICAgKChMTV9VSU5UMzIgKilwRndJbWctPlJPbmx5RGF0YS5CdWZmZXIpW2kvNF0pOworICAgICAgICB9CisKKyAgICAgICAgYWRkcmVzcyA9IFQzX1RYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5EYXRhLk9mZnNldCAmIDB4ZmZmZik7CisgICAgICAgIGZvciAoaT0gMDsgaSA8PSBwRndJbWctPkRhdGEuTGVuZ3RoOyBpKz00KQorICAgICAgICB7CisgICAgICAgICAgICBMTV9SZWdXckluZChwRGV2aWNlLGFkZHJlc3MraSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoTE1fVUlOVDMyICopcEZ3SW1nLT5EYXRhLkJ1ZmZlcilbaS80XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoU3RhcnRDcHUgJiBUM19SWF9DUFVfSUQpCisgICAgeworICAgICAgICAvKiBTdGFydCBSeCBDUFUgKi8KKyAgICAgICAgUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLlBDLHBGd0ltZy0+U3RhcnRBZGRyZXNzKTsKKyAgICAgICAgZm9yIChpID0gMCA7IGkgPCA1OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocEZ3SW1nLT5TdGFydEFkZHJlc3MgPT0gUkVHX1JEKHBEZXZpY2UscnhDcHUucmVnLlBDKSkKKyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIFJFR19XUihwRGV2aWNlLHJ4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7CisgICAgICAgICAgUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLm1vZGUsQ1BVX01PREVfSEFMVCk7CisgICAgICAgICAgUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLlBDLHBGd0ltZy0+U3RhcnRBZGRyZXNzKTsKKyAgICAgICAgICBNTV9XYWl0KDEwMDApOworICAgICAgICB9CisKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLm1vZGUsIDApOworICAgIH0KKworICAgIGlmIChTdGFydENwdSAmIFQzX1RYX0NQVV9JRCkKKyAgICB7CisgICAgICAgIC8qIFN0YXJ0IFR4IENQVSAqLworICAgICAgICBSRUdfV1IocERldmljZSx0eENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOworICAgICAgICBSRUdfV1IocERldmljZSx0eENwdS5yZWcuUEMscEZ3SW1nLT5TdGFydEFkZHJlc3MpOworICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IDU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChwRndJbWctPlN0YXJ0QWRkcmVzcyA9PSBSRUdfUkQocERldmljZSx0eENwdS5yZWcuUEMpKQorICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsdHhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKKyAgICAgICAgICBSRUdfV1IocERldmljZSx0eENwdS5yZWcubW9kZSxDUFVfTU9ERV9IQUxUKTsKKyAgICAgICAgICBSRUdfV1IocERldmljZSx0eENwdS5yZWcuUEMscEZ3SW1nLT5TdGFydEFkZHJlc3MpOworICAgICAgICAgIE1NX1dhaXQoMTAwMCk7CisgICAgICAgIH0KKworICAgICAgICBSRUdfV1IocERldmljZSx0eENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOworICAgICAgICBSRUdfV1IocERldmljZSx0eENwdS5yZWcubW9kZSwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCitTVEFUSUMgTE1fU1RBVFVTIExNX0hhbHRDcHUoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLExNX1VJTlQzMiBjcHVfbnVtYmVyKQoreworICAgIExNX1VJTlQzMiBpOworCisgICAgaWYgKGNwdV9udW1iZXIgPT0gVDNfUlhfQ1BVX0lEKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMCA7IGkgPCAxMDAwMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBSRUdfV1IocERldmljZSxyeENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLm1vZGUsQ1BVX01PREVfSEFMVCk7CisKKyAgICAgICAgICAgIGlmIChSRUdfUkQocERldmljZSxyeENwdS5yZWcubW9kZSkgJiBDUFVfTU9ERV9IQUxUKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIFJFR19XUihwRGV2aWNlLHJ4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7CisgICAgICAgIFJFR19XUihwRGV2aWNlLHJ4Q3B1LnJlZy5tb2RlLENQVV9NT0RFX0hBTFQpOworICAgICAgICBNTV9XYWl0KDEwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMCA7IGkgPCAxMDAwMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBSRUdfV1IocERldmljZSx0eENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsdHhDcHUucmVnLm1vZGUsQ1BVX01PREVfSEFMVCk7CisKKyAgICAgICAgICAgIGlmIChSRUdfUkQocERldmljZSx0eENwdS5yZWcubW9kZSkgJiBDUFVfTU9ERV9IQUxUKQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuICgoIGkgPT0gMTAwMDApID8gTE1fU1RBVFVTX0ZBSUxVUkUgOiBMTV9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKworaW50CitMTV9CbGlua0xFRChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCbGlua0R1cmF0aW9uU2VjKQoreworCUxNX1VJTlQzMiBPbGRjZmc7CisJaW50IGo7CisJaW50IHJldCA9IDA7CisKKwlpZihCbGlua0R1cmF0aW9uU2VjID09IDApCisJeworCQlyZXR1cm4gMDsKKyAgICAgICAgfQorCWlmKEJsaW5rRHVyYXRpb25TZWMgPiAxMjApCisgICAgICAgIHsKKwkgICAgICAgIEJsaW5rRHVyYXRpb25TZWMgPSAxMjA7CisJfQorCisJT2xkY2ZnID0gUkVHX1JEKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCk7CisJZm9yKGogPSAwOyBqIDwgQmxpbmtEdXJhdGlvblNlYyAqIDI7IGorKykKKwl7CisJCWlmKGogJSAyKQorCQl7CisJCSAgICAgICAgLyogVHVybiBvbiB0aGUgTEVEcy4gKi8KKwkJCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLkxlZEN0cmwsCisJCQkJTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgfAorCQkJCUxFRF9DVFJMXzEwMDBNQlBTX0xFRF9PTiB8CisJCQkJTEVEX0NUUkxfMTAwTUJQU19MRURfT04gfAorCQkJCUxFRF9DVFJMXzEwTUJQU19MRURfT04gfAorCQkJCUxFRF9DVFJMX09WRVJSSURFX1RSQUZGSUNfTEVEIHwKKwkJCQlMRURfQ1RSTF9CTElOS19UUkFGRklDX0xFRCB8CisJCQkJTEVEX0NUUkxfVFJBRkZJQ19MRUQpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgICAgIC8qIFR1cm4gb2ZmIHRoZSBMRURzLiAqLworCQkJUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwKKwkJCQlMRURfQ1RSTF9PVkVSUklERV9MSU5LX0xFRCB8CisJCQkJTEVEX0NUUkxfT1ZFUlJJREVfVFJBRkZJQ19MRUQpOworCQl9CisKKyNpZm5kZWYgRU1CRURERUQKKyAgICAgICAgICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKyAgICAgICAgICAgICAgICBpZiAoc2NoZWR1bGVfdGltZW91dChIWi8yKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVFI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHVkZWxheSgxMDAwMDApOyAgLyogMXMgc2xlZXAgKi8KKyNlbmRpZgorCX0KKwlSRUdfV1IocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLCBPbGRjZmcpOworCXJldHVybiByZXQ7Cit9CisKK2ludCB0M19kb19kbWEoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgaG9zdF9hZGRyX3BoeSwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICBpbnQgZG1hX3JlYWQpCit7CisgICAgVDNfRE1BX0RFU0MgZG1hX2Rlc2M7CisgICAgaW50IGk7CisgICAgTE1fVUlOVDMyIGRtYV9kZXNjX2FkZHI7CisgICAgTE1fVUlOVDMyIHZhbHVlMzI7CisKKyAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1vZGUsIDApOworICAgIFJFR19XUihwRGV2aWNlLCBGdHEuUmVzZXQsIDApOworCisgICAgZG1hX2Rlc2MuaG9zdF9hZGRyLkhpZ2ggPSBob3N0X2FkZHJfcGh5LkhpZ2g7CisgICAgZG1hX2Rlc2MuaG9zdF9hZGRyLkxvdyA9IGhvc3RfYWRkcl9waHkuTG93OworICAgIGRtYV9kZXNjLm5pY19tYnVmID0gMHgyMTAwOworICAgIGRtYV9kZXNjLmxlbiA9IGxlbmd0aDsKKyAgICBkbWFfZGVzYy5mbGFncyA9IDB4MDAwMDAwMDQ7IC8qIEdlbmVyYXRlIFJ4LUNQVSBldmVudCAqLworCisgICAgaWYgKGRtYV9yZWFkKQorICAgIHsKKyAgICAgICAgZG1hX2Rlc2MuY3FpZF9zcWlkID0gKFQzX1FJRF9SWF9CRF9DT01QIDw8IDgpIHwKKyAgICAgICAgICAgIFQzX1FJRF9ETUFfSElHSF9QUklfUkVBRDsKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIERtYVJlYWQuTW9kZSwgRE1BX1JFQURfTU9ERV9FTkFCTEUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkbWFfZGVzYy5jcWlkX3NxaWQgPSAoVDNfUUlEX1JYX0RBVEFfQ09NUCA8PCA4KSB8CisgICAgICAgICAgICBUM19RSURfRE1BX0hJR0hfUFJJX1dSSVRFOworICAgICAgICBSRUdfV1IocERldmljZSwgRG1hV3JpdGUuTW9kZSwgRE1BX1dSSVRFX01PREVfRU5BQkxFKTsKKyAgICB9CisKKyAgICBkbWFfZGVzY19hZGRyID0gVDNfTklDX0RNQV9ERVNDX1BPT0xfQUREUjsKKworICAgIC8qIFdyaXRpbmcgdGhpcyBETUEgZGVzY3JpcHRvciB0byBETUEgbWVtb3J5ICovCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihUM19ETUFfREVTQyk7IGkgKz0gNCkKKyAgICB7CisgICAgICAgIHZhbHVlMzIgPSAqKChQTE1fVUlOVDMyKSAoKChQTE1fVUlOVDgpICZkbWFfZGVzYykgKyBpKSk7CisgICAgICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX01FTV9XSU5fQUREUl9SRUcsIGRtYV9kZXNjX2FkZHIraSk7CisgICAgICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX01FTV9XSU5fREFUQV9SRUcsIGNwdV90b19sZTMyKHZhbHVlMzIpKTsKKyAgICB9CisgICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfTUVNX1dJTl9BRERSX1JFRywgMCk7CisKKyAgICBpZiAoZG1hX3JlYWQpCisgICAgICAgIFJFR19XUihwRGV2aWNlLCBGdHEuRG1hSGlnaFJlYWRGdHFGaWZvRW5xdWV1ZURlcXVldWUsIGRtYV9kZXNjX2FkZHIpOworICAgIGVsc2UKKyAgICAgICAgUkVHX1dSKHBEZXZpY2UsIEZ0cS5EbWFIaWdoV3JpdGVGdHFGaWZvRW5xdWV1ZURlcXVldWUsIGRtYV9kZXNjX2FkZHIpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQwOyBpKyspCisgICAgeworICAgICAgICBpZiAoZG1hX3JlYWQpCisgICAgICAgICAgICB2YWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIEZ0cS5SY3ZCZENvbXBGdHFGaWZvRW5xdWV1ZURlcXVldWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIEZ0cS5SY3ZEYXRhQ29tcEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZSk7CisKKyAgICAgICAgaWYgKCh2YWx1ZTMyICYgMHhmZmZmKSA9PSBkbWFfZGVzY19hZGRyKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgTU1fV2FpdCgxMCk7CisgICAgfQorCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCitTVEFUSUMgTE1fU1RBVFVTCitMTV9EbWFUZXN0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1VJTlQ4IHBCdWZmZXJWaXJ0LAorICAgICAgICAgICBMTV9QSFlTSUNBTF9BRERSRVNTIEJ1ZmZlclBoeSwgTE1fVUlOVDMyIEJ1ZmZlclNpemUpCit7CisgICAgaW50IGo7CisgICAgTE1fVUlOVDMyICpwdHI7CisgICAgaW50IGRtYV9zdWNjZXNzID0gMDsKKworICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMCAmJgorICAgICAgICBUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDEpCisgICAgeworICAgICAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorICAgIHdoaWxlICghZG1hX3N1Y2Nlc3MpCisgICAgeworICAgICAgICAvKiBGaWxsIGRhdGEgd2l0aCBpbmNyZW1lbnRhbCBwYXR0ZXJucyAqLworICAgICAgICBwdHIgPSAoTE1fVUlOVDMyICopcEJ1ZmZlclZpcnQ7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBCdWZmZXJTaXplLzQ7IGorKykKKyAgICAgICAgICAgICpwdHIrKyA9IGo7CisKKyAgICAgICAgaWYgKHQzX2RvX2RtYShwRGV2aWNlLEJ1ZmZlclBoeSxCdWZmZXJTaXplLCAxKSA9PSBMTV9TVEFUVVNfRkFJTFVSRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworICAgICAgICB9CisKKyAgICAgICAgTU1fV2FpdCg0MCk7CisgICAgICAgIHB0ciA9IChMTV9VSU5UMzIgKilwQnVmZmVyVmlydDsKKyAgICAgICAgLyogRmlsbCBkYXRhIHdpdGggemVybyAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgQnVmZmVyU2l6ZS80OyBqKyspCisgICAgICAgICAgICAqcHRyKysgPSAwOworCisgICAgICAgIGlmICh0M19kb19kbWEocERldmljZSxCdWZmZXJQaHksQnVmZmVyU2l6ZSwgMCkgPT0gTE1fU1RBVFVTX0ZBSUxVUkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorCisgICAgICAgIE1NX1dhaXQoNDApOworICAgICAgICAvKiBDaGVjayBmb3IgZGF0YSAqLworICAgICAgICBwdHIgPSAoTE1fVUlOVDMyICopcEJ1ZmZlclZpcnQ7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBCdWZmZXJTaXplLzQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCpwdHIrKyAhPSBqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgocERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCAmIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZX01BU0spCisgICAgICAgICAgICAgICAgICAgID09IERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsID0gKHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgJgorICAgICAgICAgICAgICAgICAgICAgICAgIH5ETUFfQ1RSTF9XUklURV9CT1VOREFSWV9NQVNLKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzE2OworICAgICAgICAgICAgICAgICAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLkRtYVJlYWRXcml0ZUN0cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaiA9PSAoQnVmZmVyU2l6ZS80KSkKKyAgICAgICAgICAgIGRtYV9zdWNjZXNzID0gMTsKKyAgICB9CisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorI2VuZGlmIC8qIENGR19DTURfTkVULCAhQ09ORklHX05FVF9NVUxUSSwgQ09ORklHX1RJR09OMyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aWdvbjMuaCBiL2RyaXZlcnMvdGlnb24zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzMGFjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdGlnb24zLmgKQEAgLTAsMCArMSwzNDY5IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnJvYWRjb20gQkNNNTcwMCBMaW51eCBOZXR3b3JrIERyaXZlciwgQ29weXJpZ2h0IChjKSAyMDAwIEJyb2FkY29tICAgICAgICAgKi8KKy8qIENvcnBvcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICAgICovCisvKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAgICAqLworLyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgbG9jYXRlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVElHT04zX0gKKyNkZWZpbmUgVElHT04zX0gKKworI2luY2x1ZGUgImJjbTU3MHhfbG0uaCIKKyNpZiBJTkNMVURFX1RCSV9TVVBQT1JUCisjaW5jbHVkZSAiYmNtNTcweF9hdXRvbmVnLmgiCisjZW5kaWYKKworCisvKiBpbyBkZWZpbmVzICovCisjaWYgIWRlZmluZWQoQklHX0VORElBTl9IT1NUKQorI2RlZmluZSByZWFkbChhZGRyKSBcCisgICAgICAgICAgICAgIChMT05HU1dBUCgoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYWRkcikpKSkKKyNkZWZpbmUgd3JpdGVsKGIsYWRkcikgXAorICAgICAgICAgICAgICAoKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGFkZHIpKSA9IChMT05HU1dBUChiKSkpCisjZWxzZQorI2lmIDAgLyogIWRlZmluZWQoUFBDNjAzKSAqLworI2RlZmluZSByZWFkbChhZGRyKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQqKSgweGEwMDAwMDAwICsgKHVuc2lnbmVkIGxvbmcpKGFkZHIpKSkKKyNkZWZpbmUgd3JpdGVsKGIsYWRkcikgKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICsgMHhhMDAwMDAwMCkpID0gKGIpKQorI2Vsc2UKKyNpZiAxCisjZGVmaW5lIHJlYWRsKGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCopKGFkZHIpKQorI2RlZmluZSB3cml0ZWwoYixhZGRyKSAoKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSkgPSAoYikpCisjZWxzZQorZXh0ZXJuIGludCBzcHJpbnRmKGNoYXIqIGJ1ZiwgY29uc3QgY2hhciogZiwgLi4uKTsKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQgcmVhZGwodm9pZCogYWRkcil7CisgICAgY2hhciBidWZbMTI4XTsKKyAgICB1bnNpZ25lZCBpbnQgdG1wID0gKCoodm9sYXRpbGUgdW5zaWduZWQgaW50KikoYWRkcikpOworICAgIHNwcmludGYoYnVmLCIlczolczogcmVhZCAweCV4IGZyb20gMHgleFxuIixfX0ZJTEVfXyxfX0xJTkVfXyx0bXAsYWRkciwwLDApOworICAgIHN5c1NlcmlhbFByaW50U3RyaW5nKGJ1Zik7CisgICAgcmV0dXJuIHRtcDsKK30KK3N0YXRpYyBfX2lubGluZSB2b2lkIHdyaXRlbCh1bnNpZ25lZCBpbnQgYiwgdW5zaWduZWQgaW50IGFkZHIpeworICAgIGNoYXIgYnVmWzEyOF07CisgICAgKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoYWRkcikpID0gKGIpKTsKKyAgICBzcHJpbnRmKGJ1ZiwiJXM6JXM6IHdyaXRlIDB4JXggdG8gMHgleFxuIixfX0ZJTEVfXyxfX0xJTkVfXyxiLGFkZHIsMCwwKTsKKyAgICBzeXNTZXJpYWxQcmludFN0cmluZyhidWYpOworfQorI2VuZGlmCisjZW5kaWYgLyogUFBDNjAzICovCisjZW5kaWYKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENvbnN0YW50cy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1heGltIG51bWJlciBvZiBwYWNrZXQgZGVzY3JpcHRvcnMgdXNlZCBmb3Igc2VuZGluZyBwYWNrZXRzLiAqLworI2RlZmluZSBNQVhfVFhfUEFDS0VUX0RFU0NfQ09VTlQgICAgICAgICAgICA2MDAKKyNkZWZpbmUgREVGQVVMVF9UWF9QQUNLRVRfREVTQ19DT1VOVCAgICAgICAgMgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBwYWNrZXQgZGVzY3JpcHRvcnMgdXNlZCBmb3IgcmVjZWl2aW5nIHBhY2tldHMuICovCisjaWYgVDNfSlVNQk9fUkNCX0VOVFJZX0NPVU5UCisjZGVmaW5lIE1BWF9SWF9QQUNLRVRfREVTQ19DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVCArIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQpCisjZWxzZQorI2RlZmluZSBNQVhfUlhfUEFDS0VUX0RFU0NfQ09VTlQgICAgICAgICAgICA4MDAKKyNlbmRpZgorI2RlZmluZSBERUZBVUxUX1JYX1BBQ0tFVF9ERVNDX0NPVU5UICAgICAgICAyCisKKy8qIFRocmVzaGhvbGQgZm9yIGRvdWJsZSBjb3B5aW5nIHNtYWxsIHR4IHBhY2tldHMuICAwIHdpbGwgZGlzYWJsZSBkb3VibGUgKi8KKy8qIGNvcHlpbmcgb2Ygc21hbGwgVHggcGFja2V0cy4gKi8KKyNkZWZpbmUgREVGQVVMVF9UWF9DT1BZX0JVRkZFUl9TSVpFICAgICAgICAgMAorI2RlZmluZSBNSU5fVFhfQ09QWV9CVUZGRVJfU0laRSAgICAgICAgICAgICA2NAorI2RlZmluZSBNQVhfVFhfQ09QWV9CVUZGRVJfU0laRSAgICAgICAgICAgICA1MTIKKworLyogQ2FjaGUgbGluZS4gKi8KKyNkZWZpbmUgQ09NTU9OX0NBQ0hFX0xJTkVfU0laRSAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBDT01NT05fQ0FDSEVfTElORV9NQVNLICAgICAgICAgICAgICAoQ09NTU9OX0NBQ0hFX0xJTkVfU0laRS0xKQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBmcmFnbWVudCB3ZSBjYW4gaGFuZGxlLiAqLworI2lmbmRlZiBNQVhfRlJBR01FTlRfQ09VTlQKKyNkZWZpbmUgTUFYX0ZSQUdNRU5UX0NPVU5UICAgICAgICAgICAgICAgICAgMzIKKyNlbmRpZgorCisvKiBCMCBidWcuICovCisjZGVmaW5lIEJDTTU3MDBfQlhfTUlOX0ZSQUdfU0laRSAgICAgICAgICAgIDEwCisjZGVmaW5lIEJDTTU3MDBfQlhfTUlOX0ZSQUdfQlVGX1NJWkUgICAgICAgIDE2ICAvKiBuaWNlIGFsaWduZWQgc2l6ZS4gKi8KKyNkZWZpbmUgQkNNNTcwMF9CWF9NSU5fRlJBR19CVUZfU0laRV9NQVNLICAgKEJDTTU3MDBfQlhfTUlOX0ZSQUdfQlVGX1NJWkUtMSkKKyNkZWZpbmUgQkNNNTcwMF9CWF9UWF9DT1BZX0JVRl9TSVpFICAgICAgICAgKEJDTTU3MDBfQlhfTUlOX0ZSQUdfQlVGX1NJWkUgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9GUkFHTUVOVF9DT1VOVCkKKworLyogTUFHSUMgbnVtYmVyLiAqLworLyogI2RlZmluZSBUM19NQUdJQ19OVU0gICAgICAgICAgICAgICAgICAgICAgICAnS2V2VCcgKi8KKyNkZWZpbmUgVDNfRklSTVdBUkVfTUFJTEJPWCAgICAgICAgICAgICAgICAweDBiNTAKKyNkZWZpbmUgVDNfTUFHSUNfTlVNICAgICAgICAgICAgICAgICAgICAgICAweDRCNjU3NjU0CisjZGVmaW5lIFQzX01BR0lDX05VTV9ESVNBQkxFX0RNQVdfT05fTElOS19DSEFOR0UgMHg0ODYxNzY0YgorCisjZGVmaW5lIFQzX05JQ19EQVRBX1NJR19BRERSICAgICAgICAgICAgICAgMHgwYjU0CisjZGVmaW5lIFQzX05JQ19EQVRBX1NJRyAgICAgICAgICAgICAgICAgICAgMHg0YjY1NzY1NAorCisjZGVmaW5lIFQzX05JQ19EQVRBX05JQ19DRkdfQUREUiAgICAgICAgICAgMHgwYjU4CisjZGVmaW5lIFQzX05JQ19DRkdfTEVEX01PREVfVU5LTk9XTiAgICAgICAgQklUX05PTkUKKyNkZWZpbmUgVDNfTklDX0NGR19MRURfTU9ERV9UUklQTEVfU1BFRUQgICBCSVRfMgorI2RlZmluZSBUM19OSUNfQ0ZHX0xFRF9NT0RFX0xJTktfU1BFRUQgICAgIEJJVF8zCisjZGVmaW5lIFQzX05JQ19DRkdfTEVEX01PREVfT1BFTl9EUkFJTiAgICAgQklUXzIKKyNkZWZpbmUgVDNfTklDX0NGR19MRURfTU9ERV9PVVRQVVQgICAgICAgICBCSVRfMworI2RlZmluZSBUM19OSUNfQ0ZHX0xFRF9NT0RFX01BU0sgICAgICAgICAgIChCSVRfMiB8IEJJVF8zKQorI2RlZmluZSBUM19OSUNfQ0ZHX1BIWV9UWVBFX1VOS05PV04gICAgICAgICBCSVRfTk9ORQorI2RlZmluZSBUM19OSUNfQ0ZHX1BIWV9UWVBFX0NPUFBFUiAgICAgICAgICBCSVRfNAorI2RlZmluZSBUM19OSUNfQ0ZHX1BIWV9UWVBFX0ZJQkVSICAgICAgICAgICBCSVRfNQorI2RlZmluZSBUM19OSUNfQ0ZHX1BIWV9UWVBFX01BU0sgICAgICAgICAgICAoQklUXzQgfCBCSVRfNSkKKyNkZWZpbmUgVDNfTklDX0NGR19FTkFCTEVfV09MICAgICAgICAgICAgICAgQklUXzYKKyNkZWZpbmUgVDNfTklDX0NGR19FTkFCTEVfQVNGICAgICAgICAgICAgICAgQklUXzcKKyNkZWZpbmUgVDNfTklDX0VFUFJPTV9XUCAgICAgICAgICAgICAgICAgICAgQklUXzgKKworI2RlZmluZSBUM19OSUNfREFUQV9QSFlfSURfQUREUiAgICAgICAgICAgIDB4MGI3NAorI2RlZmluZSBUM19OSUNfUEhZX0lEMV9NQVNLICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgVDNfTklDX1BIWV9JRDJfTUFTSyAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisKKyNkZWZpbmUgVDNfQ01EX01BSUxCT1ggICAgICAgICAgICAgICAgICAgICAgMHgwYjc4CisjZGVmaW5lIFQzX0NNRF9OSUNEUlZfQUxJVkUgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgVDNfQ01EX05JQ0RSVl9QQVVTRV9GVyAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBUM19DTURfTklDRFJWX0lQVjRBRERSX0NIQU5HRSAgICAgICAweDAzCisjZGVmaW5lIFQzX0NNRF9OSUNEUlZfSVBWNkFERFJfQ0hBTkdFICAgICAgIDB4MDQKKyNkZWZpbmUgVDNfQ01EXzU3MDNBMF9GSVhfRE1BRldfRE1BUiAgICAgICAgMHgwNQorI2RlZmluZSBUM19DTURfNTcwM0EwX0ZJWF9ETUFGV19ETUFXICAgICAgICAweDA2CisKKyNkZWZpbmUgVDNfQ01EX0xFTkdUSF9NQUlMQk9YICAgICAgICAgICAgICAgMHgwYjdjCisjZGVmaW5lIFQzX0NNRF9EQVRBX01BSUxCT1ggICAgICAgICAgICAgICAgIDB4MGI4MAorCisjZGVmaW5lIFQzX0FTRl9GV19TVEFUVVNfTUFJTEJPWCAgICAgICAgICAgIDB4MGMwMAorCisjZGVmaW5lIFQzX0RSVl9TVEFURV9NQUlMQk9YICAgICAgICAgICAgICAgIDB4MGMwNAorI2RlZmluZSBUM19EUlZfU1RBVEVfU1RBUlQgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFQzX0RSVl9TVEFURV9VTkxPQUQgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgVDNfRFJWX1NUQVRFX1dPTCAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBUM19EUlZfU1RBVEVfU1VTUEVORCAgICAgICAgICAgICAgICAweDA0CisKKyNkZWZpbmUgVDNfRldfUkVTRVRfVFlQRV9NQUlMQk9YICAgICAgICAgICAgMHgwYzA4CisKKyNkZWZpbmUgVDNfTUFDX0FERFJfSElHSF9NQUlMQk9YICAgICAgICAgICAgMHgwYzE0CisjZGVmaW5lIFQzX01BQ19BRERSX0xPV19NQUlMQk9YICAgICAgICAgICAgIDB4MGMxOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSGFyZHdhcmUgY29uc3RhbnRzLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNlbmQgcmluZzogIG11c3QgYmUgNTEyLiAqLworI2RlZmluZSBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVCAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRfTUFTSyAgICAgICAgKFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5ULTEpCisKKy8qIE51bWJlciBvZiBzZW5kIFJDQnMuICBNYXkgYmUgMS0xNiBidXQgZm9yIG5vdywgb25seSBzdXBwb3J0IG9uZS4gKi8KKyNkZWZpbmUgVDNfTUFYX1NFTkRfUkNCX0NPVU5UICAgICAgICAgICAgICAgMTYKKworLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIFN0YW5kYXJkIFJlY2VpdmUgUkNCLiAgTXVzdCBiZSA1MTIgZW50cmllcy4gKi8KKyNkZWZpbmUgVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlQgICAgICAgICAgNTEyCisjZGVmaW5lIFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UX01BU0sgICAgIChUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVC0xKQorI2RlZmluZSBERUZBVUxUX1NURF9SQ1ZfREVTQ19DT1VOVCAgICAgICAgICAyMDAgICAgLyogTXVzdCBiZSA8IDUxMi4gKi8KKyNkZWZpbmUgTUFYX1NURF9SQ1ZfQlVGRkVSX1NJWkUgICAgICAgICAgICAgMHg2MDAKKworLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIE1pbmkgUmVjZWl2ZSBSQ0IuICBUaGlzIHZhbHVlIGNhbiBlaXRoZXIgYmUgKi8KKy8qIDAsIDEwMjQuICBDdXJyZW50bHkgTWluaSBSZWNlaXZlIFJDQiBpcyBkaXNhYmxlZC4gKi8KKyNpZm5kZWYgVDNfTUlOSV9SQ1ZfUkNCX0VOVFJZX0NPVU5UCisjZGVmaW5lIFQzX01JTklfUkNWX1JDQl9FTlRSWV9DT1VOVCAgICAgICAgIDAKKyNlbmRpZiAvKiBUM19NSU5JX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKyNkZWZpbmUgVDNfTUlOSV9SQ1ZfUkNCX0VOVFJZX0NPVU5UX01BU0sgICAgKFQzX01JTklfUkNWX1JDQl9FTlRSWV9DT1VOVC0xKQorI2RlZmluZSBNQVhfTUlOSV9SQ1ZfQlVGRkVSX1NJWkUgICAgICAgICAgICA1MTIKKyNkZWZpbmUgREVGQVVMVF9NSU5JX1JDVl9CVUZGRVJfU0laRSAgICAgICAgNjQKKyNkZWZpbmUgREVGQVVMVF9NSU5JX1JDVl9ERVNDX0NPVU5UICAgICAgICAgMTAwICAgIC8qIE11c3QgYmUgPCAxMDI0LiAqLworCisvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgSnVtYm8gUmVjZWl2ZSBSQ0IuICBUaGlzIHZhbHVlIG11c3QgMjU2IG9yIDAuICovCisvKiBDdXJyZW50bHksIEp1bWJvIFJlY2VpdmUgUkNCIGlzIGRpc2FibGVkLiAqLworI2lmbmRlZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCisjZGVmaW5lIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgICAgICAgIDAKKyNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisjZGVmaW5lIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlRfTUFTSyAgIChUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5ULTEpCisKKyNkZWZpbmUgTUFYX0pVTUJPX1JDVl9CVUZGRVJfU0laRSAgICAgICAgICAgKDEwICogMTAyNCkgLyogPiAxNTE0ICovCisjZGVmaW5lIERFRkFVTFRfSlVNQk9fUkNWX0JVRkZFUl9TSVpFICAgICAgICg0ICogMTAyNCkgLyogPiAxNTE0ICovCisjZGVmaW5lIERFRkFVTFRfSlVNQk9fUkNWX0RFU0NfQ09VTlQgICAgICAgIDEyOCAgICAgLyogTXVzdCBiZSA8IDI1Ni4gKi8KKworI2RlZmluZSBNQVhfSlVNQk9fVFhfQlVGRkVSX1NJWkUgICAgICAgICAgICAoOCAqIDEwMjQpIC8qID4gMTUxNCAqLworI2RlZmluZSBERUZBVUxUX0pVTUJPX1RYX0JVRkZFUl9TSVpFICAgICAgICAoNCAqIDEwMjQpIC8qID4gMTUxNCAqLworCisvKiBOdW1iZXIgb2YgcmVjZWl2ZSByZXR1cm4gUkNCcy4gIE1heWJlIDEtMTYgYnV0IGZvciBub3csIG9ubHkgc3VwcG9ydCBvbmUuICovCisjZGVmaW5lIFQzX01BWF9SQ1ZfUkVUVVJOX1JDQl9DT1VOVCAgICAgICAgIDE2CisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIGEgUmVjZWl2ZSBSZXR1cm4gcmluZy4gIFRoaXMgdmFsdWUgaXMgZWl0aGVyIDEwMjQgKi8KKy8qIG9yIDIwNDguICovCisjaWZuZGVmIFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UCisjZGVmaW5lIFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UICAgICAgIDEwMjQKKyNlbmRpZiAvKiBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCAqLworI2RlZmluZSBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVF9NQVNLICAoVDNfUkNWX1JFVFVSTl9SQ0JfRU5UUllfQ09VTlQtMSkKKworCisvKiBEZWZhdWx0IGNvYWxlc2NpbmcgcGFyYW1ldGVycy4gKi8KKyNkZWZpbmUgREVGQVVMVF9SWF9DT0FMRVNDSU5HX1RJQ0tTICAgICAgICAgMTAwCisjZGVmaW5lIE1BWF9SWF9DT0FMRVNDSU5HX1RJQ0tTICAgICAgICAgICAgIDUwMAorI2RlZmluZSBERUZBVUxUX1RYX0NPQUxFU0NJTkdfVElDS1MgICAgICAgICA0MDAKKyNkZWZpbmUgTUFYX1RYX0NPQUxFU0NJTkdfVElDS1MgICAgICAgICAgICAgNTAwCisjZGVmaW5lIERFRkFVTFRfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVMgICAgIDEwCisjZGVmaW5lIE1BWF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUyAgICAgICAgIDEwMAorI2RlZmluZSBBREFQVElWRV9MT19SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUyAgICA1CisjZGVmaW5lIEFEQVBUSVZFX0hJX1JYX01BWF9DT0FMRVNDRURfRlJBTUVTICAgIDQyCisjZGVmaW5lIEFEQVBUSVZFX0xPX1JYX0NPQUxFU0NJTkdfVElDS1MgICAgICAgICA1MAorI2RlZmluZSBBREFQVElWRV9ISV9SWF9DT0FMRVNDSU5HX1RJQ0tTICAgICAgICAgMzAwCisjZGVmaW5lIEFEQVBUSVZFX0xPX1BLVF9USFJFU0ggICAgICAgICAgICAgIDMwMDAwCisjZGVmaW5lIEFEQVBUSVZFX0hJX1BLVF9USFJFU0ggICAgICAgICAgICAgIDc0MDAwCisjZGVmaW5lIERFRkFVTFRfVFhfTUFYX0NPQUxFU0NFRF9GUkFNRVMgICAgIDQwCisjZGVmaW5lIEFEQVBUSVZFX0xPX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTICAgIDI1CisjZGVmaW5lIEFEQVBUSVZFX0hJX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTICAgIDc1CisjZGVmaW5lIE1BWF9UWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUyAgICAgICAgIDEwMAorCisjZGVmaW5lIERFRkFVTFRfUlhfQ09BTEVTQ0lOR19USUNLU19EVVJJTkdfSU5UICAgICAgICAgIDI1CisjZGVmaW5lIERFRkFVTFRfVFhfQ09BTEVTQ0lOR19USUNLU19EVVJJTkdfSU5UICAgICAgICAgIDI1CisjZGVmaW5lIERFRkFVTFRfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVNfRFVSSU5HX0lOVCAgICAgIDUKKyNkZWZpbmUgREVGQVVMVF9UWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FU19EVVJJTkdfSU5UICAgICAgNQorCisjZGVmaW5lIEJBRF9ERUZBVUxUX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKworI2RlZmluZSBERUZBVUxUX1NUQVRTX0NPQUxFU0NJTkdfVElDS1MgICAgICAxMDAwMDAwCisjZGVmaW5lIE1BWF9TVEFUU19DT0FMRVNDSU5HX1RJQ0tTICAgICAgICAgIDM2MDAwMDAwMDBVCisKKworLyogUmVjZWl2ZSBCRCBSZXBsZW5pc2ggdGhyZXNob2xkcy4gKi8KKyNkZWZpbmUgREVGQVVMVF9SQ1ZfU1REX0JEX1JFUExFTklTSF9USFJFU0hPTEQgICAgICA0CisjZGVmaW5lIERFRkFVTFRfUkNWX0pVTUJPX0JEX1JFUExFTklTSF9USFJFU0hPTEQgICAgNAorCisjZGVmaW5lIFNQTElUX01PREVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTUExJVF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBTUExJVF9NT0RFXzU3MDRfTUFYX1JFUSAgICAgICAgICAgICAgICAgICAgIDMKKworLyogTWF4aW11bSBwaHlzaWNhbCBmcmFnbWVudCBzaXplLiAqLworI2RlZmluZSBNQVhfRlJBR01FTlRfU0laRSAgICAgICAgICAgICAgICAgICAoNjQgKiAxMDI0KQorCisKKy8qIFN0YW5kYXJkIHZpZXcuICovCisjZGVmaW5lIFQzX1NURF9WSUVXX1NJWkUgICAgICAgICAgICAgICAgICAgICg2NCAqIDEwMjQpCisjZGVmaW5lIFQzX0ZMQVRfVklFV19TSVpFICAgICAgICAgICAgICAgICAgICgzMiAqIDEwMjQgKiAxMDI0KQorCisKKy8qIEJ1ZmZlciBkZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyBvbiB0aGUgTklDJ3MgbWVtb3J5LiAqLworCisjZGVmaW5lIFQzX05JQ19TTkRfQlVGRkVSX0RFU0NfQUREUiAgICAgICAgIDB4NDAwMAorI2RlZmluZSBUM19OSUNfU1REX1JDVl9CVUZGRVJfREVTQ19BRERSICAgICAweDYwMDAKKyNkZWZpbmUgVDNfTklDX0pVTUJPX1JDVl9CVUZGRVJfREVTQ19BRERSICAgMHg3MDAwCisKKyNkZWZpbmUgVDNfTklDX1NURF9SQ1ZfQlVGRkVSX0RFU0NfQUREUl9FWFRfTUVNICAgICAweGMwMDAKKyNkZWZpbmUgVDNfTklDX0pVTUJPX1JDVl9CVUZGRVJfREVTQ19BRERSX0VYVF9NRU0gICAweGQwMDAKKyNkZWZpbmUgVDNfTklDX01JTklfUkNWX0JVRkZFUl9ERVNDX0FERFJfRVhUX01FTSAgICAweGUwMDAKKworI2RlZmluZSBUM19OSUNfU05EX0JVRkZFUl9ERVNDX1NJWkUgICAgICAgICAoVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihUM19TTkRfQkQpIC8gNCkKKworI2RlZmluZSBUM19OSUNfU1REX1JDVl9CVUZGRVJfREVTQ19TSVpFICAgICAoVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlQgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihUM19SQ1ZfQkQpIC8gNCkKKworI2RlZmluZSBUM19OSUNfSlVNQk9fUkNWX0JVRkZFUl9ERVNDX1NJWkUgICAoVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFQzX0VYVF9SQ1ZfQkQpIC8gNCkKKworCisvKiBNQlVGIHBvb2wuICovCisjZGVmaW5lIFQzX05JQ19NQlVGX1BPT0xfQUREUiAgICAgICAgICAgICAgIDB4ODAwMAorLyogI2RlZmluZSBUM19OSUNfTUJVRl9QT09MX1NJWkUgICAgICAgICAgICAgICAweDE4MDAwICovCisjZGVmaW5lIFQzX05JQ19NQlVGX1BPT0xfU0laRTk2ICAgICAgICAgICAgIDB4MTgwMDAKKyNkZWZpbmUgVDNfTklDX01CVUZfUE9PTF9TSVpFNjQgICAgICAgICAgICAgMHgxMDAwMAorCisKKyNkZWZpbmUgVDNfTklDX01CVUZfUE9PTF9BRERSX0VYVF9NRU0gICAgICAgMHgyMDAwMAorCisvKiBETUEgZGVzY3JpcHRvciBwb29sICovCisjZGVmaW5lIFQzX05JQ19ETUFfREVTQ19QT09MX0FERFIgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBUM19OSUNfRE1BX0RFU0NfUE9PTF9TSVpFICAgICAgICAgICAweDIwMDAgICAgICAvKiA4S0IuICovCisKKyNkZWZpbmUgVDNfREVGX0RNQV9NQlVGX0xPV19XTUFSSyAgICAgICAgICAgMHg0MAorI2RlZmluZSBUM19ERUZfUlhfTUFDX01CVUZfTE9XX1dNQVJLICAgICAgICAweDIwCisjZGVmaW5lIFQzX0RFRl9NQlVGX0hJR0hfV01BUksgICAgICAgICAgICAgIDB4NjAKKworI2RlZmluZSBUM19ERUZfRE1BX01CVUZfTE9XX1dNQVJLX0pVTUJPICAgICAzMDQKKyNkZWZpbmUgVDNfREVGX1JYX01BQ19NQlVGX0xPV19XTUFSS19KVU1CTyAgMTUyCisjZGVmaW5lIFQzX0RFRl9NQlVGX0hJR0hfV01BUktfSlVNQk8gICAgICAgIDM4MAorCisjZGVmaW5lIFQzX0RFRl9ETUFfREVTQ19MT1dfV01BUksgICAgICAgICAgIDUKKyNkZWZpbmUgVDNfREVGX0RNQV9ERVNDX0hJR0hfV01BUksgICAgICAgICAgMTAKKworLyogTWF4aW11bSBzaXplIG9mIGdpYW50IFRDUCBwYWNrZXQgY2FuIGJlIHNlbnQgKi8KKyNkZWZpbmUgVDNfVENQX1NFR19NQVhfT0ZGTE9BRF9TSVpFICAgICAgICAgNjQqMTAwMAorI2RlZmluZSBUM19UQ1BfU0VHX01JTl9OVU1fU0VHICAgICAgICAgICAgICAyMAorCisjZGVmaW5lIFQzX1JYX0NQVV9JRCAgICAweDEKKyNkZWZpbmUgVDNfVFhfQ1BVX0lEICAgIDB4MgorI2RlZmluZSBUM19SWF9DUFVfU1BBRF9BRERSICAweDMwMDAwCisjZGVmaW5lIFQzX1JYX0NQVV9TUEFEX1NJWkUgIDB4NDAwMAorI2RlZmluZSBUM19UWF9DUFVfU1BBRF9BRERSICAweDM0MDAwCisjZGVmaW5lIFQzX1RYX0NQVV9TUEFEX1NJWkUgIDB4NDAwMAorCit0eXBlZGVmIHN0cnVjdCBUM19ESVJfRU5UUlkKK3sKKyAgUExNX1VJTlQ4IEJ1ZmZlcjsKKyAgTE1fVUlOVDMyIE9mZnNldDsKKyAgTE1fVUlOVDMyIExlbmd0aDsKK30gVDNfRElSX0VOVFJZLCpQVDNfRElSX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBUM19GV0lNR19JTkZPCit7CisgIExNX1VJTlQzMiBTdGFydEFkZHJlc3M7CisgIFQzX0RJUl9FTlRSWSBUZXh0OworICBUM19ESVJfRU5UUlkgUk9ubHlEYXRhOworICBUM19ESVJfRU5UUlkgRGF0YTsKKyAgVDNfRElSX0VOVFJZIFNic3M7CisgIFQzX0RJUl9FTlRSWSBCc3M7Cit9IFQzX0ZXSU1HX0lORk8sICpQVDNfRldJTUdfSU5GTzsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaWdvbjMgUENJIFJlZ2lzdGVycy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFQzX1BDSV9JRF9CQ001NzAwICAgICAgICAgICAgICAgICAgIDB4MTY0NDE0ZTQKKyNkZWZpbmUgVDNfUENJX0lEX0JDTTU3MDEgICAgICAgICAgICAgICAgICAgMHgxNjQ1MTRlNAorI2RlZmluZSBUM19QQ0lfSURfQkNNNTcwMiAgICAgICAgICAgICAgICAgICAweDE2NDYxNGU0CisjZGVmaW5lIFQzX1BDSV9JRF9CQ001NzAyeCAgICAgICAgICAgICAgICAgIDB4MTZBNjE0ZTQKKyNkZWZpbmUgVDNfUENJX0lEX0JDTTU3MDMgICAgICAgICAgICAgICAgICAgMHgxNjQ3MTRlNAorI2RlZmluZSBUM19QQ0lfSURfQkNNNTcwM3ggICAgICAgICAgICAgICAgICAweDE2QTcxNGU0CisjZGVmaW5lIFQzX1BDSV9JRF9CQ001NzAyRkUgICAgICAgICAgICAgICAgIDB4MTY0RDE0ZTQKKyNkZWZpbmUgVDNfUENJX0lEX0JDTTU3MDQgICAgICAgICAgICAgICAgICAgMHgxNjQ4MTRlNAorCisjZGVmaW5lIFQzX1BDSV9WRU5ET1JfSUQgICAgICAgICAgICAgICAgICAgIChUM19QQ0lfSUQgJiAweGZmZmYpCisjZGVmaW5lIFQzX1BDSV9ERVZJQ0VfSUQgICAgICAgICAgICAgICAgICAgIChUM19QQ0lfSUQgPj4gMTYpCisKKyNkZWZpbmUgVDNfUENJX01JU0NfSE9TVF9DVFJMX1JFRyAgICAgICAgICAgMHg2OAorCisvKiBUaGUgbW9zdCBzaWduaWZpY2FudCAxNmJpdCBvZiByZWdpc3RlciAweDY4LiAqLworLyogQ2hpcElkOjQsIENoaXBSZXY6NCwgTWV0YWxSZXY6OCAqLworI2RlZmluZSBUM19DSElQX0lEXzU3MDBfQTAgICAgICAgICAgICAgICAgICAweDcwMDAKKyNkZWZpbmUgVDNfQ0hJUF9JRF81NzAwX0ExICAgICAgICAgICAgICAgICAgMHg3MDAxCisjZGVmaW5lIFQzX0NISVBfSURfNTcwMF9CMCAgICAgICAgICAgICAgICAgIDB4NzEwMAorI2RlZmluZSBUM19DSElQX0lEXzU3MDBfQjEgICAgICAgICAgICAgICAgICAweDcxMDEKKyNkZWZpbmUgVDNfQ0hJUF9JRF81NzAwX0MwICAgICAgICAgICAgICAgICAgMHg3MjAwCisKKyNkZWZpbmUgVDNfQ0hJUF9JRF81NzAxX0EwICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFQzX0NISVBfSURfNTcwMV9CMCAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBUM19DSElQX0lEXzU3MDFfQjIgICAgICAgICAgICAgICAgICAweDAxMDIKKyNkZWZpbmUgVDNfQ0hJUF9JRF81NzAxX0I1ICAgICAgICAgICAgICAgICAgMHgwMTA1CisKKyNkZWZpbmUgVDNfQ0hJUF9JRF81NzAzX0EwICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFQzX0NISVBfSURfNTcwM19BMSAgICAgICAgICAgICAgICAgIDB4MTAwMQorI2RlZmluZSBUM19DSElQX0lEXzU3MDNfQTIgICAgICAgICAgICAgICAgICAweDEwMDIKKworI2RlZmluZSBUM19DSElQX0lEXzU3MDRfQTAgICAgICAgICAgICAgICAgICAweDIwMDAKKworLyogQ2hpcCBJZC4gKi8KKyNkZWZpbmUgVDNfQVNJQ19SRVYoX0NoaXBSZXZJZCkgICAgICAgICAgICAgKChfQ2hpcFJldklkKSA+PiAxMikKKyNkZWZpbmUgVDNfQVNJQ19SRVZfNTcwMCAgICAgICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBUM19BU0lDX1JFVl81NzAxICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFQzX0FTSUNfUkVWXzU3MDMgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgVDNfQVNJQ19SRVZfNTcwNCAgICAgICAgICAgICAgICAgICAgMHgwMgorCisKKy8qIENoaXAgaWQgYW5kIHJldmlzaW9uLiAqLworI2RlZmluZSBUM19DSElQX1JFVihfQ2hpcFJldklkKSAgICAgICAgICAgICAoKF9DaGlwUmV2SWQpID4+IDgpCisjZGVmaW5lIFQzX0NISVBfUkVWXzU3MDBfQVggICAgICAgICAgICAgICAgIDB4NzAKKyNkZWZpbmUgVDNfQ0hJUF9SRVZfNTcwMF9CWCAgICAgICAgICAgICAgICAgMHg3MQorI2RlZmluZSBUM19DSElQX1JFVl81NzAwX0NYICAgICAgICAgICAgICAgICAweDcyCisjZGVmaW5lIFQzX0NISVBfUkVWXzU3MDFfQVggICAgICAgICAgICAgICAgIDB4MDAKKworLyogTWV0YWwgcmV2aXNpb24uICovCisjZGVmaW5lIFQzX01FVEFMX1JFVihfQ2hpcFJldklkKSAgICAgICAgICAgICgoX0NoaXBSZXZJZCkgJiAweGZmKQorI2RlZmluZSBUM19NRVRBTF9SRVZfQTAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFQzX01FVEFMX1JFVl9BMSAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgVDNfTUVUQUxfUkVWX0IwICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBUM19NRVRBTF9SRVZfQjEgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFQzX01FVEFMX1JFVl9CMiAgICAgICAgICAgICAgICAgICAgIDB4MDIKKworI2RlZmluZSBUM19QQ0lfUkVHX0NMT0NLX0NUUkwgICAgICAgICAgICAgICAweDc0CisKKyNkZWZpbmUgVDNfUENJX0RJU0FCTEVfUlhfQ0xPQ0sgICAgICAgICAgICAgQklUXzEwCisjZGVmaW5lIFQzX1BDSV9ESVNBQkxFX1RYX0NMT0NLICAgICAgICAgICAgIEJJVF8xMQorI2RlZmluZSBUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSyAgICAgICBCSVRfMTIKKyNkZWZpbmUgVDNfUENJX1BPV0VSX0RPV05fUENJX1BMTDEzMyAgICAgICAgQklUXzE1CisjZGVmaW5lIFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLICAgICAgICAgICAgIEJJVF8xOAorCisKKyNkZWZpbmUgVDNfUENJX1JFR19BRERSX1JFRyAgICAgICAgICAgICAgICAgMHg3OAorI2RlZmluZSBUM19QQ0lfUkVHX0RBVEFfUkVHICAgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgVDNfUENJX01FTV9XSU5fQUREUl9SRUcgICAgICAgICAgICAgMHg3YworI2RlZmluZSBUM19QQ0lfTUVNX1dJTl9EQVRBX1JFRyAgICAgICAgICAgICAweDg0CisKKyNkZWZpbmUgVDNfUENJX1BNX0NBUF9SRUcgICAgICAgICAgICAgICAgICAgMHg0OAorCisjZGVmaW5lIFQzX1BDSV9QTV9DQVBfUE1FX0QzQ09MRCAgICAgICAgICAgIEJJVF8zMQorI2RlZmluZSBUM19QQ0lfUE1fQ0FQX1BNRV9EM0hPVCAgICAgICAgICAgICBCSVRfMzAKKworI2RlZmluZSBUM19QQ0lfUE1fU1RBVFVTX0NUUkxfUkVHICAgICAgICAgICAweDRjCisKKyNkZWZpbmUgVDNfUE1fUE9XRVJfU1RBVEVfTUFTSyAgICAgICAgICAgICAgKEJJVF8wIHwgQklUXzEpCisjZGVmaW5lIFQzX1BNX1BPV0VSX1NUQVRFX0QwICAgICAgICAgICAgICAgIEJJVF9OT05FCisjZGVmaW5lIFQzX1BNX1BPV0VSX1NUQVRFX0QxICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFQzX1BNX1BPV0VSX1NUQVRFX0QyICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFQzX1BNX1BPV0VSX1NUQVRFX0QzICAgICAgICAgICAgICAgIChCSVRfMCB8IEJJVF8xKQorCisjZGVmaW5lIFQzX1BNX1BNRV9FTkFCTEUgICAgICAgICAgICAgICAgICAgIEJJVF84CisjZGVmaW5lIFQzX1BNX1BNRV9BU1NFUlRFRCAgICAgICAgICAgICAgICAgIEJJVF8xNQorCisKKy8qIFBDSSBzdGF0ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgVDNfUENJX1NUQVRFX1JFRyAgICAgICAgICAgICAgICAgICAgMHg3MAorCisjZGVmaW5lIFQzX1BDSV9TVEFURV9GT1JDRV9SRVNFVCAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFQzX1BDSV9TVEFURV9JTlRfTk9UX0FDVElWRSAgICAgICAgIEJJVF8xCisjZGVmaW5lIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUgIEJJVF8yCisjZGVmaW5lIFQzX1BDSV9TVEFURV9CVVNfU1BFRURfSElHSCAgICAgICAgIEJJVF8zCisjZGVmaW5lIFQzX1BDSV9TVEFURV8zMkJJVF9QQ0lfQlVTICAgICAgICAgIEJJVF80CisKKworLyogQnJvYWRjb20gc3Vic3lzdGVtL3N1YnZlbmRvciBJRHMuICovCisjZGVmaW5lIFQzX1NWSURfQlJPQURDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNGU0CisKKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMEE2ICAgICAgICAgICAgICAgICAweDE2NDQKKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUE1ICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMFQ2ICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEJDTTgwMDIgKi8KKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMEE5ICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIEFnaWxlbnQgKi8KKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMVQxICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMVQ4ICAgICAgICAgICAgICAgICAweDAwMDYKKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUE3ICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIEFnaWxlbnQgKi8KKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUExMCAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUExMiAgICAgICAgICAgICAgICAweDgwMDgKKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwM0F4MSAgICAgICAgICAgICAgICAweDAwMDkKKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwM0F4MiAgICAgICAgICAgICAgICAweDgwMDkKKworLyogM0NPTSBzdWJzeXN0ZW0vc3VidmVuZG9yIElEcy4gKi8KKyNkZWZpbmUgVDNfU1ZJRF8zQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwYjcKKworI2RlZmluZSBUM19TU0lEXzNDT01fM0M5OTZUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBUM19TU0lEXzNDT01fM0M5OTZCVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNgorI2RlZmluZSBUM19TU0lEXzNDT01fM0M5OTZDVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMgorI2RlZmluZSBUM19TU0lEXzNDT01fM0M5OTdUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMworI2RlZmluZSBUM19TU0lEXzNDT01fM0MxMDAwVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNworI2RlZmluZSBUM19TU0lEXzNDT01fM0M5NDBCUjAxICAgICAgICAgICAgICAgICAgICAgIDB4MTAwOAorCisvKiBGaWJlciBib2FyZHMuICovCisjZGVmaW5lIFQzX1NTSURfM0NPTV8zQzk5NlNYICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA0CisjZGVmaW5lIFQzX1NTSURfM0NPTV8zQzk5N1NYICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA1CisKKworLyogRGVsbCBzdWJzeXN0ZW0vc3VidmVuZG9yIElEcy4gKi8KKworI2RlZmluZSBUM19TVklEX0RFTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAyOAorCisjZGVmaW5lIFQzX1NTSURfREVMTF9WSVBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQxCisjZGVmaW5lIFQzX1NTSURfREVMTF9KQUdVQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA2CisjZGVmaW5lIFQzX1NTSURfREVMTF9NRVJMT1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA5CisjZGVmaW5lIFQzX1NTSURfREVMTF9TTElNX01FUkxPVCAgICAgICAgICAgICAgICAgICAgMHgwMTBhCisKKy8qIENvbXBhcSBzdWJzeXN0ZW0vc3VidmVuZG9yIElEcyAqLworCisjZGVmaW5lIFQzX1NWSURfQ09NUEFRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZTExCisKKyNkZWZpbmUgVDNfU1NJRF9DT01QQVFfQkFOU0hFRSAgICAgICAgICAgICAgICAgICAgICAweDAwN2MKKyNkZWZpbmUgVDNfU1NJRF9DT01QQVFfQkFOU0hFRV8yICAgICAgICAgICAgICAgICAgICAweDAwOWEKKyNkZWZpbmUgVDNfU1NJRF9DT01QQVFfQ0hBTkdFTElORyAgICAgICAgICAgICAgICAgICAweDAwN2QKKyNkZWZpbmUgVDNfU1NJRF9DT01QQVFfTkM3NzgwICAgICAgICAgICAgICAgICAgICAgICAweDAwODUKKyNkZWZpbmUgVDNfU1NJRF9DT01QQVFfTkM3NzgwXzIgICAgICAgICAgICAgICAgICAgICAweDAwOTkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTUlJIHJlZ2lzdGVycy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIFBIWV9DVFJMX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorCisjZGVmaW5lIFBIWV9DVFJMX1NQRUVEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVF82IHwgQklUXzEzKQorI2RlZmluZSBQSFlfQ1RSTF9TUEVFRF9TRUxFQ1RfMTBNQlBTICAgICAgICAgICAgICAgIEJJVF9OT05FCisjZGVmaW5lIFBIWV9DVFJMX1NQRUVEX1NFTEVDVF8xMDBNQlBTICAgICAgICAgICAgICAgQklUXzEzCisjZGVmaW5lIFBIWV9DVFJMX1NQRUVEX1NFTEVDVF8xMDAwTUJQUyAgICAgICAgICAgICAgQklUXzYKKyNkZWZpbmUgUEhZX0NUUkxfQ09MTElTSU9OX1RFU1RfRU5BQkxFICAgICAgICAgICAgICBCSVRfNworI2RlZmluZSBQSFlfQ1RSTF9GVUxMX0RVUExFWF9NT0RFICAgICAgICAgICAgICAgICAgIEJJVF84CisjZGVmaW5lIFBIWV9DVFJMX1JFU1RBUlRfQVVUT19ORUcgICAgICAgICAgICAgICAgICAgQklUXzkKKyNkZWZpbmUgUEhZX0NUUkxfSVNPTEFURV9QSFkgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTAKKyNkZWZpbmUgUEhZX0NUUkxfTE9XRVJfUE9XRVJfTU9ERSAgICAgICAgICAgICAgICAgICBCSVRfMTEKKyNkZWZpbmUgUEhZX0NUUkxfQVVUT19ORUdfRU5BQkxFICAgICAgICAgICAgICAgICAgICBCSVRfMTIKKyNkZWZpbmUgUEhZX0NUUkxfTE9PUEJBQ0tfTU9ERSAgICAgICAgICAgICAgICAgICAgICBCSVRfMTQKKyNkZWZpbmUgUEhZX0NUUkxfUEhZX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTUKKworCisvKiBTdGF0dXMgcmVnaXN0ZXIuICovCisjZGVmaW5lIFBIWV9TVEFUVVNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIFBIWV9TVEFUVVNfTElOS19QQVNTICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgUEhZX1NUQVRVU19BVVRPX05FR19DT01QTEVURSAgICAgICAgICAgICAgICBCSVRfNQorCisKKy8qIFBoeSBJZCByZWdpc3RlcnMuICovCisjZGVmaW5lIFBIWV9JRDFfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBQSFlfSUQxX09VSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCisjZGVmaW5lIFBIWV9JRDJfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBQSFlfSUQyX1JFVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwZgorI2RlZmluZSBQSFlfSUQyX01PREVMX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNmMAorI2RlZmluZSBQSFlfSUQyX09VSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmMwMAorCisKKy8qIEF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgUEhZX0FOX0FEX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisKKyNkZWZpbmUgUEhZX0FOX0FEX0FTWU1fUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTEKKyNkZWZpbmUgUEhZX0FOX0FEX1BBVVNFX0NBUEFCTEUgICAgICAgICAgICAgICAgICAgICBCSVRfMTAKKyNkZWZpbmUgUEhZX0FOX0FEXzEwQkFTRVRfSEFMRiAgICAgICAgICAgICAgICAgICAgICBCSVRfNQorI2RlZmluZSBQSFlfQU5fQURfMTBCQVNFVF9GVUxMICAgICAgICAgICAgICAgICAgICAgIEJJVF82CisjZGVmaW5lIFBIWV9BTl9BRF8xMDBCQVNFVFhfSEFMRiAgICAgICAgICAgICAgICAgICAgQklUXzcKKyNkZWZpbmUgUEhZX0FOX0FEXzEwMEJBU0VUWF9GVUxMICAgICAgICAgICAgICAgICAgICBCSVRfOAorI2RlZmluZSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRCAgICAgICAgICAgIDB4MDEKKworCisvKiBBdXRvLW5lZ290aWF0aW9uIExpbmsgUGFydG5lciBBYmlsaXR5IHJlZ2lzdGVyLiAqLworI2RlZmluZSBQSFlfTElOS19QQVJUTkVSX0FCSUxJVFlfUkVHICAgICAgICAgICAgICAgIDB4MDUKKworI2RlZmluZSBQSFlfTElOS19QQVJUTkVSX0FTWU1fUEFVU0UgICAgICAgICAgICAgICAgIEJJVF8xMQorI2RlZmluZSBQSFlfTElOS19QQVJUTkVSX1BBVVNFX0NBUEFCTEUgICAgICAgICAgICAgIEJJVF8xMAorCisKKy8qIEF1dG8tbmVnb3RpYXRpb24gZXhwYW5zaW9uIHJlZ2lzdGVyLiAqLworI2RlZmluZSBQSFlfQU5fRVhQQU5TSU9OX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCQ001NDAwIGFuZCBCQ001NDAxIHBoeSBpbmZvLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQSFlfREVWSUNFX0lEICAgICAgICAgICAxCisKKy8qIE9VSTogYml0IDMxLTEwOyAgIE1vZGVsIzogYml0IDktNDsgICBSZXYjIGJpdCAzLTAuICovCisjZGVmaW5lIFBIWV9VTktOT1dOX1BIWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQSFlfQkNNNTQwMF9QSFlfSUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAwMDgwNDAKKyNkZWZpbmUgUEhZX0JDTTU0MDFfUEhZX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwMDA4MDUwCisjZGVmaW5lIFBIWV9CQ001NDExX1BIWV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDAwODA3MAorI2RlZmluZSBQSFlfQkNNNTcwMV9QSFlfSUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAwMDgxMTAKKyNkZWZpbmUgUEhZX0JDTTU3MDNfUEhZX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwMDA4MTYwCisjZGVmaW5lIFBIWV9CQ001NzA0X1BIWV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDAwODE5MAorI2RlZmluZSBQSFlfQkNNODAwMl9QSFlfSUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAwMTAxNDAKKworI2RlZmluZSBQSFlfQkNNNTQwMV9CMF9SRVYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBQSFlfQkNNNTQwMV9CMl9SRVYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MworI2RlZmluZSBQSFlfQkNNNTQwMV9DMF9SRVYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NgorCisjZGVmaW5lIFBIWV9JRF9PVUlfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmMwMAorI2RlZmluZSBQSFlfSURfTU9ERUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzZjAKKyNkZWZpbmUgUEhZX0lEX1JFVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIFBIWV9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBIWV9JRF9PVUlfTUFTSyB8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIWV9JRF9NT0RFTF9NQVNLKQorCisKKyNkZWZpbmUgVU5LTk9XTl9QSFlfSUQoeCkgICAoKCgoeCkgJiBQSFlfSURfTUFTSykgIT0gUEhZX0JDTTU0MDBfUEhZX0lEKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiBQSFlfSURfTUFTSykgIT0gUEhZX0JDTTU0MDFfUEhZX0lEKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiBQSFlfSURfTUFTSykgIT0gUEhZX0JDTTU0MTFfUEhZX0lEKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiBQSFlfSURfTUFTSykgIT0gUEhZX0JDTTU3MDFfUEhZX0lEKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiBQSFlfSURfTUFTSykgIT0gUEhZX0JDTTU3MDNfUEhZX0lEKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiBQSFlfSURfTUFTSykgIT0gUEhZX0JDTTU3MDRfUEhZX0lEKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiBQSFlfSURfTUFTSykgIT0gUEhZX0JDTTgwMDJfUEhZX0lEKSkKKworCisKKy8qIDEwMDBCYXNlLVQgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcgICAgICAgICAgICAgICAgICAweDA5CisKKyNkZWZpbmUgQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfSEFMRiAgICAgICAgICAgICAgICBCSVRfOAorI2RlZmluZSBCQ001NDBYX0FOX0FEXzEwMDBCQVNFVF9GVUxMICAgICAgICAgICAgICAgIEJJVF85CisjZGVmaW5lIEJDTTU0MFhfQ09ORklHX0FTX01BU1RFUiAgICAgICAgICAgICAgICAgICAgQklUXzExCisjZGVmaW5lIEJDTTU0MFhfRU5BQkxFX0NPTkZJR19BU19NQVNURVIgICAgICAgICAgICAgQklUXzEyCisKKworLyogRXh0ZW5kZWQgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQkNNNTQwWF9FWFRfQ1RSTF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisKKyNkZWZpbmUgQkNNNTQwWF9FWFRfQ1RSTF9MSU5LM19MRURfTU9ERSAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBCQ001NDBYX0VYVF9DVFJMX1RCSSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xNQorCisvKiBQSFkgZXh0ZW5kZWQgc3RhdHVzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCQ001NDBYX0VYVF9TVEFUVVNfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MTEKKworI2RlZmluZSBCQ001NDBYX0VYVF9TVEFUVVNfTElOS19QQVNTICAgICAgICAgICAgICAgIEJJVF84CisKKworLyogRFNQIENvZWZmaWNpZW50IFJlYWQvV3JpdGUgUG9ydC4gKi8KKyNkZWZpbmUgQkNNNTQwWF9EU1BfUldfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE1CisKKworLyogRFNQIENvZWZpY2llbnQgQWRkcmVzcyBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcgICAgICAgICAgICAgICAgICAgICAweDE3CisKKyNkZWZpbmUgQkNNNTQwWF9EU1BfVEFQX05VTUJFUl9NQVNLICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEJDTTU0MFhfRFNQX0FHQ19BICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBCQ001NDBYX0RTUF9BR0NfQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQkNNNTQwWF9EU1BfTVNFX1BBSVJfU1RBVFVTICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEJDTTU0MFhfRFNQX1NPRlRfREVDSVNJT04gICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBCQ001NDBYX0RTUF9QSEFTRV9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQkNNNTQwWF9EU1BfU0tFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEJDTTU0MFhfRFNQX1BPV0VSX1NBVkVSX1VQUEVSX0JPVU5EICAgICAgICAgMHgwNgorI2RlZmluZSBCQ001NDBYX0RTUF9QT1dFUl9TQVZFUl9MT1dFUl9CT1VORCAgICAgICAgIDB4MDcKKyNkZWZpbmUgQkNNNTQwWF9EU1BfTEFTVF9FQ0hPICAgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEJDTTU0MFhfRFNQX0ZSRVFVRU5DWSAgICAgICAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBCQ001NDBYX0RTUF9QTExfQkFORFdJRFRIICAgICAgICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgQkNNNTQwWF9EU1BfUExMX1BIQVNFX09GRlNFVCAgICAgICAgICAgICAgICAweDBiCisKKyNkZWZpbmUgQkNNNTQwWF9EU1BfRklMVEVSX0RDT0ZGU0VUICAgICAgICAgICAgICAgICAoQklUXzEwIHwgQklUXzExKQorI2RlZmluZSBCQ001NDBYX0RTUF9GSUxURVJfRkVYVDMgICAgICAgICAgICAgICAgICAgIChCSVRfOCB8IEJJVF85IHwgQklUXzExKQorI2RlZmluZSBCQ001NDBYX0RTUF9GSUxURVJfRkVYVDIgICAgICAgICAgICAgICAgICAgIChCSVRfOSB8IEJJVF8xMSkKKyNkZWZpbmUgQkNNNTQwWF9EU1BfRklMVEVSX0ZFWFQxICAgICAgICAgICAgICAgICAgICAoQklUXzggfCBCSVRfMTEpCisjZGVmaW5lIEJDTTU0MFhfRFNQX0ZJTFRFUl9GRVhUMCAgICAgICAgICAgICAgICAgICAgQklUXzExCisjZGVmaW5lIEJDTTU0MFhfRFNQX0ZJTFRFUl9ORVhUMyAgICAgICAgICAgICAgICAgICAgKEJJVF84IHwgQklUXzkgfCBCSVRfMTApCisjZGVmaW5lIEJDTTU0MFhfRFNQX0ZJTFRFUl9ORVhUMiAgICAgICAgICAgICAgICAgICAgKEJJVF85IHwgQklUXzEwKQorI2RlZmluZSBCQ001NDBYX0RTUF9GSUxURVJfTkVYVDEgICAgICAgICAgICAgICAgICAgIChCSVRfOCB8IEJJVF8xMCkKKyNkZWZpbmUgQkNNNTQwWF9EU1BfRklMVEVSX05FWFQwICAgICAgICAgICAgICAgICAgICBCSVRfMTAKKyNkZWZpbmUgQkNNNTQwWF9EU1BfRklMVEVSX0VDSE8gICAgICAgICAgICAgICAgICAgICAoQklUXzggfCBCSVRfOSkKKyNkZWZpbmUgQkNNNTQwWF9EU1BfRklMVEVSX0RGRSAgICAgICAgICAgICAgICAgICAgICBCSVRfOQorI2RlZmluZSBCQ001NDBYX0RTUF9GSUxURVJfRkZFICAgICAgICAgICAgICAgICAgICAgIEJJVF84CisKKyNkZWZpbmUgQkNNNTQwWF9EU1BfQ09OVFJPTF9BTExfRklMVEVSUyAgICAgICAgICAgICBCSVRfMTIKKworI2RlZmluZSBCQ001NDBYX0RTUF9TRUxfQ0hfMCAgICAgICAgICAgICAgICAgICAgICAgIEJJVF9OT05FCisjZGVmaW5lIEJDTTU0MFhfRFNQX1NFTF9DSF8xICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEzCisjZGVmaW5lIEJDTTU0MFhfRFNQX1NFTF9DSF8yICAgICAgICAgICAgICAgICAgICAgICAgQklUXzE0CisjZGVmaW5lIEJDTTU0MFhfRFNQX1NFTF9DSF8zICAgICAgICAgICAgICAgICAgICAgICAgKEJJVF8xMyB8IEJJVF8xNCkKKworI2RlZmluZSBCQ001NDBYX0NPTlRST0xfQUxMX0NIQU5ORUxTICAgICAgICAgICAgICAgIEJJVF8xNQorCisKKy8qIEF1eGlsbGlhcnkgQ29udHJvbCBSZWdpc3RlciAoU2hhZG93IFJlZ2lzdGVyKSAqLworI2RlZmluZSBCQ001NDAxX0FVWF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgKKworI2RlZmluZSBCQ001NDAxX1NIQURPV19TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBCQ001NDAxX1NIQURPV19TRUxfTk9STUFMICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQkNNNTQwMV9TSEFET1dfU0VMXzEwQkFTRVQgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEJDTTU0MDFfU0hBRE9XX1NFTF9QT1dFUl9DT05UUk9MICAgICAgICAgICAgMHgwMgorI2RlZmluZSBCQ001NDAxX1NIQURPV19TRUxfSVBfUEhPTkUgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgQkNNNTQwMV9TSEFET1dfU0VMX01JU0NfVEVTVDEgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEJDTTU0MDFfU0hBRE9XX1NFTF9NSVNDX1RFU1QyICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBCQ001NDAxX1NIQURPV19TRUxfSVBfUEhPTkVfU0VFRCAgICAgICAgICAgIDB4MDYKKworCisvKiBTaGFkb3cgcmVnaXN0ZXIgc2VsZWN0b3IgPT0gJzAwMCcgKi8KKyNkZWZpbmUgQkNNNTQwMV9TSERXX05PUk1BTF9ESUFHX01PREUgICAgICAgICAgICAgICBCSVRfMworI2RlZmluZSBCQ001NDAxX1NIRFdfTk9STUFMX0RJU0FCTEVfTUJQICAgICAgICAgICAgIEJJVF80CisjZGVmaW5lIEJDTTU0MDFfU0hEV19OT1JNQUxfRElTQUJMRV9MT1dfUFdSICAgICAgICAgQklUXzUKKyNkZWZpbmUgQkNNNTQwMV9TSERXX05PUk1BTF9ESVNBQkxFX0lOVl9QUkYgICAgICAgICBCSVRfNgorI2RlZmluZSBCQ001NDAxX1NIRFdfTk9STUFMX0RJU0FCTEVfUFJGICAgICAgICAgICAgIEJJVF83CisjZGVmaW5lIEJDTTU0MDFfU0hEV19OT1JNQUxfUlhfU0xJQ0lOR19OT1JNQUwgICAgICAgQklUX05PTkUKKyNkZWZpbmUgQkNNNTQwMV9TSERXX05PUk1BTF9SWF9TTElDSU5HXzREICAgICAgICAgICBCSVRfOAorI2RlZmluZSBCQ001NDAxX1NIRFdfTk9STUFMX1JYX1NMSUNJTkdfM0xWTF8xRCAgICAgIEJJVF85CisjZGVmaW5lIEJDTTU0MDFfU0hEV19OT1JNQUxfUlhfU0xJQ0lOR181TFZMXzFEICAgICAgKEJJVF84IHwgQklUXzkpCisjZGVmaW5lIEJDTTU0MDFfU0hEV19OT1JNQUxfVFhfNkRCX0NPRElORyAgICAgICAgICAgQklUXzEwCisjZGVmaW5lIEJDTTU0MDFfU0hEV19OT1JNQUxfRU5BQkxFX1NNX0RTUF9DTE9DSyAgICAgQklUXzExCisjZGVmaW5lIEJDTTU0MDFfU0hEV19OT1JNQUxfRURHRVJBVEVfQ1RSTF80TlMgICAgICAgQklUX05PTkUKKyNkZWZpbmUgQkNNNTQwMV9TSERXX05PUk1BTF9FREdFUkFURV9DVFJMXzVOUyAgICAgICBCSVRfMTIKKyNkZWZpbmUgQkNNNTQwMV9TSERXX05PUk1BTF9FREdFUkFURV9DVFJMXzNOUyAgICAgICBCSVRfMTMKKyNkZWZpbmUgQkNNNTQwMV9TSERXX05PUk1BTF9FREdFUkFURV9DVFJMXzBOUyAgICAgICAoQklUXzEyIHwgQklUXzEzKQorI2RlZmluZSBCQ001NDAxX1NIRFdfTk9STUFMX0VYVF9QQUNLRVRfTEVOR1RIICAgICAgIEJJVF8xNAorI2RlZmluZSBCQ001NDAxX1NIRFdfTk9STUFMX0VYVEVSTkFMX0xPT1BCQUNLICAgICAgIEJJVF8xNQorCisKKy8qIEF1eGlsbGlhcnkgc3RhdHVzIHN1bW1hcnkuICovCisjZGVmaW5lIEJDTTU0MFhfQVVYX1NUQVRVU19SRUcgICAgICAgICAgICAgICAgICAgICAgMHgxOQorCisjZGVmaW5lIEJDTTU0MFhfQVVYX0xJTktfUEFTUyAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgQkNNNTQwWF9BVVhfU1BFRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAoQklUXzggfCBCSVRfOSB8IEJJVF8xMCkKKyNkZWZpbmUgQkNNNTQwWF9BVVhfMTBCQVNFVF9IRCAgICAgICAgICAgICAgICAgICAgICBCSVRfOAorI2RlZmluZSBCQ001NDBYX0FVWF8xMEJBU0VUX0ZEICAgICAgICAgICAgICAgICAgICAgIEJJVF85CisjZGVmaW5lIEJDTTU0MFhfQVVYXzEwMEJBU0VUWF9IRCAgICAgICAgICAgICAgICAgICAgKEJJVF84IHwgQklUXzkpCisjZGVmaW5lIEJDTTU0MFhfQVVYXzEwMEJBU0VUNCAgICAgICAgICAgICAgICAgICAgICAgQklUXzEwCisjZGVmaW5lIEJDTTU0MFhfQVVYXzEwMEJBU0VUWF9GRCAgICAgICAgICAgICAgICAgICAgKEJJVF84IHwgQklUXzEwKQorI2RlZmluZSBCQ001NDBYX0FVWF8xMDBCQVNFVF9IRCAgICAgICAgICAgICAgICAgICAgIChCSVRfOSB8IEJJVF8xMCkKKyNkZWZpbmUgQkNNNTQwWF9BVVhfMTAwQkFTRVRfRkQgICAgICAgICAgICAgICAgICAgICAoQklUXzggfCBCSVRfOSB8IEJJVF8xMCkKKworCisvKiBJbnRlcnJ1cHQgc3RhdHVzLiAqLworI2RlZmluZSBCQ001NDBYX0lOVF9TVEFUVVNfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MWEKKworI2RlZmluZSBCQ001NDBYX0lOVF9MSU5LX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIEJDTTU0MFhfSU5UX1NQRUVEX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgQkNNNTQwWF9JTlRfRFVQTEVYX0NIQU5HRSAgICAgICAgICAgICAgICAgICBCSVRfMworI2RlZmluZSBCQ001NDBYX0lOVF9BVVRPX05FR19QQUdFX1JYICAgICAgICAgICAgICAgIEJJVF8xMAorCisKKy8qIEludGVycnVwdCBtYXNrIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCQ001NDBYX0lOVF9NQVNLX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MWIKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgdm9sYXRpbGUgTE1fVUlOVDggVDNfOEJJVF9SRUdJU1RFUiwgKlBUM184QklUX1JFR0lTVEVSOwordHlwZWRlZiB2b2xhdGlsZSBMTV9VSU5UMTYgVDNfMTZCSVRfUkVHSVNURVIsICpQVDNfMTZCSVRfUkVHSVNURVI7Cit0eXBlZGVmIHZvbGF0aWxlIExNX1VJTlQzMiBUM18zMkJJVF9SRUdJU1RFUiwgKlBUM18zMkJJVF9SRUdJU1RFUjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIEJpZyBlbmRpYW4gZm9ybWF0LiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIEhpZ2g7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTG93OworfSBUM182NEJJVF9SRUdJU1RFUiwgKlBUM182NEJJVF9SRUdJU1RFUjsKKwordHlwZWRlZiBUM182NEJJVF9SRUdJU1RFUiBUM182NEJJVF9IT1NUX0FERFIsICpQVDNfNjRCSVRfSE9TVF9BRERSOworCisjZGVmaW5lIFQzX05VTV9PRl9ETUFfREVTQyAgICAyNTYKKyNkZWZpbmUgVDNfTlVNX09GX01CVUYgICAgICAgIDc2OAorCit0eXBlZGVmIHN0cnVjdAoreworICBUM182NEJJVF9SRUdJU1RFUiBob3N0X2FkZHI7CisgIFQzXzMyQklUX1JFR0lTVEVSIG5pY19tYnVmOworICBUM18xNkJJVF9SRUdJU1RFUiBsZW47CisgIFQzXzE2QklUX1JFR0lTVEVSIGNxaWRfc3FpZDsKKyAgVDNfMzJCSVRfUkVHSVNURVIgZmxhZ3M7CisgIFQzXzMyQklUX1JFR0lTVEVSIG9wYXF1ZTE7CisgIFQzXzMyQklUX1JFR0lTVEVSIG9wYXF1ZTI7CisgIFQzXzMyQklUX1JFR0lTVEVSIG9wYXF1ZTM7Cit9VDNfRE1BX0RFU0MsICpQVDNfRE1BX0RFU0M7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmluZyBjb250cm9sIGJsb2NrLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFQzXzY0QklUX1JFR0lTVEVSIEhvc3RSaW5nQWRkcjsKKworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKKyAgICAgICAgICAgIFQzXzE2QklUX1JFR0lTVEVSIE1heExlbjsKKyAgICAgICAgICAgIFQzXzE2QklUX1JFR0lTVEVSIEZsYWdzOworI2Vsc2UgLyogQklHX0VORElBTl9IT1NUICovCisgICAgICAgICAgICBUM18xNkJJVF9SRUdJU1RFUiBGbGFnczsKKyAgICAgICAgICAgIFQzXzE2QklUX1JFR0lTVEVSIE1heExlbjsKKyNlbmRpZgorICAgICAgICB9IHM7CisKKyAgICAgICAgVDNfMzJCSVRfUkVHSVNURVIgTWF4TGVuX0ZsYWdzOworICAgIH0gdTsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY1JpbmdBZGRyOworfSBUM19SQ0IsICpQVDNfUkNCOworCisjZGVmaW5lIFQzX1JDQl9GTEFHX1VTRV9FWFRfUkVDVl9CRCAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFQzX1JDQl9GTEFHX1JJTkdfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU3RhdHVzIGJsb2NrLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNpemUgb2Ygc3RhdHVzIGJsb2NrIGlzIGFjdHVhbGx5IDB4NTAgYnl0ZXMuICBVc2UgMHg4MCBieXRlcyBmb3IKKyAqIGNhY2hlIGxpbmUgYWxpZ25tZW50LgorICovCisjZGVmaW5lIFQzX1NUQVRVU19CTE9DS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9sYXRpbGUgTE1fVUlOVDMyIFN0YXR1czsKKyAgICAjZGVmaW5lIFNUQVRVU19CTE9DS19VUERBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgU1RBVFVTX0JMT0NLX0xJTktfQ0hBTkdFRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgIEJJVF8xCisgICAgI2RlZmluZSBTVEFUVVNfQkxPQ0tfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKworICAgIHZvbGF0aWxlIExNX1VJTlQzMiBTdGF0dXNUYWc7CisKKyNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgUmN2U3RkQ29uSWR4OworICAgIHZvbGF0aWxlIExNX1VJTlQxNiBSY3ZKdW1ib0NvbklkeDsKKworICAgIHZvbGF0aWxlIExNX1VJTlQxNiBSZXNlcnZlZDI7CisgICAgdm9sYXRpbGUgTE1fVUlOVDE2IFJjdk1pbmlDb25JZHg7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICB2b2xhdGlsZSBMTV9VSU5UMTYgU2VuZENvbklkeDsgICAvKiBTZW5kIGNvbnN1bWVyIGluZGV4LiAqLworICAgICAgICB2b2xhdGlsZSBMTV9VSU5UMTYgUmN2UHJvZElkeDsgICAvKiBSZWNlaXZlIHByb2R1Y2VyIGluZGV4LiAqLworICAgIH0gSWR4WzE2XTsKKyNlbHNlIC8qIEJJR19FTkRJQU5fSE9TVCAqLworICAgIHZvbGF0aWxlIExNX1VJTlQxNiBSY3ZKdW1ib0NvbklkeDsKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgUmN2U3RkQ29uSWR4OworCisgICAgdm9sYXRpbGUgTE1fVUlOVDE2IFJjdk1pbmlDb25JZHg7CisgICAgdm9sYXRpbGUgTE1fVUlOVDE2IFJlc2VydmVkMjsKKworICAgIHN0cnVjdCB7CisgICAgICAgIHZvbGF0aWxlIExNX1VJTlQxNiBSY3ZQcm9kSWR4OyAgIC8qIFJlY2VpdmUgcHJvZHVjZXIgaW5kZXguICovCisgICAgICAgIHZvbGF0aWxlIExNX1VJTlQxNiBTZW5kQ29uSWR4OyAgIC8qIFNlbmQgY29uc3VtZXIgaW5kZXguICovCisgICAgfSBJZHhbMTZdOworI2VuZGlmCit9IFQzX1NUQVRVU19CTE9DSywgKlBUM19TVEFUVVNfQkxPQ0s7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvcnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVDNfNjRCSVRfSE9TVF9BRERSIEhvc3RBZGRyOworCisjaWZkZWYgQklHX0VORElBTl9IT1NUCisgICAgdm9sYXRpbGUgTE1fVUlOVDE2IEluZGV4OworICAgIHZvbGF0aWxlIExNX1VJTlQxNiBMZW47CisKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgVHlwZTsKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgRmxhZ3M7CisKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgSXBDa3N1bTsKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgVGNwVWRwQ2tzdW07CisKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgRXJyb3JGbGFnOworICAgIHZvbGF0aWxlIExNX1VJTlQxNiBWbGFuVGFnOworI2Vsc2UgLyogQklHX0VORElBTl9IT1NUICovCisgICAgdm9sYXRpbGUgTE1fVUlOVDE2IExlbjsKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgSW5kZXg7CisKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgRmxhZ3M7CisgICAgdm9sYXRpbGUgTE1fVUlOVDE2IFR5cGU7CisKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgVGNwVWRwQ2tzdW07CisgICAgdm9sYXRpbGUgTE1fVUlOVDE2IElwQ2tzdW07CisKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgVmxhblRhZzsKKyAgICB2b2xhdGlsZSBMTV9VSU5UMTYgRXJyb3JGbGFnOworI2VuZGlmCisKKyAgICB2b2xhdGlsZSBMTV9VSU5UMzIgUmVzZXJ2ZWQ7CisgICAgdm9sYXRpbGUgTE1fVUlOVDMyIE9wYXF1ZTsKK30gVDNfUkNWX0JELCAqUFQzX1JDVl9CRDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVDNfNjRCSVRfSE9TVF9BRERSIEhvc3RBZGRyWzNdOworCisjaWZkZWYgQklHX0VORElBTl9IT1NUCisgICAgTE1fVUlOVDE2IExlbjE7CisgICAgTE1fVUlOVDE2IExlbjI7CisKKyAgICBMTV9VSU5UMTYgTGVuMzsKKyAgICBMTV9VSU5UMTYgUmVzZXJ2ZWQxOworI2Vsc2UgLyogQklHX0VORElBTl9IT1NUICovCisgICAgTE1fVUlOVDE2IExlbjI7CisgICAgTE1fVUlOVDE2IExlbjE7CisKKyAgICBMTV9VSU5UMTYgUmVzZXJ2ZWQxOworICAgIExNX1VJTlQxNiBMZW4zOworI2VuZGlmCisKKyAgICBUM19SQ1ZfQkQgU3RkUmN2QmQ7Cit9IFQzX0VYVF9SQ1ZfQkQsICpQVDNfRVhUX1JDVl9CRDsKKworCisvKiBFcnJvciBmbGFncy4gKi8KKyNkZWZpbmUgUkNWX0JEX0VSUl9CQURfQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUkNWX0JEX0VSUl9DT0xMX0RFVEVDVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUkNWX0JEX0VSUl9MSU5LX0xPU1RfRFVSSU5HX1BLVCAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUkNWX0JEX0VSUl9QSFlfREVDT0RFX0VSUiAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUkNWX0JEX0VSUl9PRERfTklCQkxFRF9SQ1ZEX01JSSAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgUkNWX0JEX0VSUl9NQUNfQUJPUlQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgUkNWX0JEX0VSUl9MRU5fTFRfNjQgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgUkNWX0JEX0VSUl9UUlVOQ19OT19SRVNPVVJDRVMgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgUkNWX0JEX0VSUl9HSUFOVF9GUkFNRV9SQ1ZEICAgICAgICAgICAgICAgICAweDAxMDAKKworCisvKiBCdWZmZXIgZGVzY3JpcHRvciBmbGFncy4gKi8KKyNkZWZpbmUgUkNWX0JEX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUkNWX0JEX0ZMQUdfSlVNQk9fUklORyAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgUkNWX0JEX0ZMQUdfVkxBTl9UQUcgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgUkNWX0JEX0ZMQUdfRlJBTUVfSEFTX0VSUk9SICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgUkNWX0JEX0ZMQUdfTUlOSV9SSU5HICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgUkNWX0JEX0ZMQUdfSVBfQ0hLU1VNX0ZJRUxEICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgUkNWX0JEX0ZMQUdfVENQX1VEUF9DSEtTVU1fRklFTEQgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgUkNWX0JEX0ZMQUdfVENQX1BBQ0tFVCAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTZW5kIGJ1ZmZlciBkZXNjcmlwdG9yLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFQzXzY0QklUX0hPU1RfQUREUiBIb3N0QWRkcjsKKworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKKyAgICAgICAgICAgIExNX1VJTlQxNiBMZW47CisgICAgICAgICAgICBMTV9VSU5UMTYgRmxhZ3M7CisjZWxzZSAvKiBCSUdfRU5ESUFOX0hPU1QgKi8KKyAgICAgICAgICAgIExNX1VJTlQxNiBGbGFnczsKKyAgICAgICAgICAgIExNX1VJTlQxNiBMZW47CisjZW5kaWYKKyAgICAgICAgfSBzMTsKKworICAgICAgICBMTV9VSU5UMzIgTGVuX0ZsYWdzOworICAgIH0gdTE7CisKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisjaWZkZWYgQklHX0VORElBTl9IT1NUCisgICAgICAgICAgICBMTV9VSU5UMTYgUmVzZXJ2ZWQ7CisgICAgICAgICAgICBMTV9VSU5UMTYgVmxhblRhZzsKKyNlbHNlIC8qIEJJR19FTkRJQU5fSE9TVCAqLworICAgICAgICAgICAgTE1fVUlOVDE2IFZsYW5UYWc7CisgICAgICAgICAgICBMTV9VSU5UMTYgUmVzZXJ2ZWQ7CisjZW5kaWYKKyAgICAgICAgfSBzMjsKKworICAgICAgICBMTV9VSU5UMzIgVmxhblRhZzsKKyAgICB9IHUyOworfSBUM19TTkRfQkQsICpQVDNfU05EX0JEOworCisKKy8qIFNlbmQgYnVmZmVyIGRlc2NyaXB0b3IgZmxhZ3MuICovCisjZGVmaW5lIFNORF9CRF9GTEFHX1RDUF9VRFBfQ0tTVU0gICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFNORF9CRF9GTEFHX0lQX0NLU1VNICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFNORF9CRF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFNORF9CRF9GTEFHX0lQX0ZSQUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFNORF9CRF9GTEFHX0lQX0ZSQUdfRU5EICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFNORF9CRF9GTEFHX1ZMQU5fVEFHICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFNORF9CRF9GTEFHX0NPQUxfTk9XICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFNORF9CRF9GTEFHX0NQVV9QUkVfRE1BICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFNORF9CRF9GTEFHX0NQVV9QT1NUX0RNQSAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFNORF9CRF9GTEFHX0lOU0VSVF9TUkNfQUREUiAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFNORF9CRF9GTEFHX0NIT09TRV9TUkNfQUREUiAgICAgICAgICAgICAgICAgMHg2MDAwCisjZGVmaW5lIFNORF9CRF9GTEFHX0RPTlRfR0VOX0NSQyAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisKKy8qIE1CVUZzICovCit0eXBlZGVmIHN0cnVjdCBUM19NQlVGX0ZSQU1FX0RFU0MgeworI2lmZGVmIEJJR19FTkRJQU5fSE9TVAorICBMTV9VSU5UMzIgc3RhdHVzX2NvbnRyb2w7CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgTE1fVUlOVDggY3FpZDsKKyAgICAgIExNX1VJTlQ4IHJlc2VydmVkMTsKKyAgICAgIExNX1VJTlQxNiBsZW5ndGg7CisgICAgfXMxOworICAgIExNX1VJTlQzMiB3b3JkOworICB9dTE7CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBMTV9VSU5UMTYgaXBfaGRyX3N0YXJ0OworICAgICAgTE1fVUlOVDE2IHRjcF91ZHBfaGRyX3N0YXJ0OworICAgIH1zMjsKKworICAgIExNX1VJTlQzMiB3b3JkOworICB9dTI7CisKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBMTV9VSU5UMTYgZGF0YV9zdGFydDsKKyAgICAgIExNX1VJTlQxNiB2bGFuX2lkOworICAgIH1zMzsKKworICAgIExNX1VJTlQzMiB3b3JkOworICB9dTM7CisKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBMTV9VSU5UMTYgaXBfY2hlY2tzdW07CisgICAgICBMTV9VSU5UMTYgdGNwX3VkcF9jaGVja3N1bTsKKyAgICB9czQ7CisKKyAgICBMTV9VSU5UMzIgd29yZDsKKyAgfXU0OworCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgTE1fVUlOVDE2IHBzZXVkb19jaGVja3N1bTsKKyAgICAgIExNX1VJTlQxNiBjaGVja3N1bV9zdGF0dXM7CisgICAgfXM1OworCisgICAgTE1fVUlOVDMyIHdvcmQ7CisgIH11NTsKKworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIExNX1VJTlQxNiBydWxlX21hdGNoOworICAgICAgTE1fVUlOVDggY2xhc3M7CisgICAgICBMTV9VSU5UOCBydXB0OworICAgIH1zNjsKKworICAgIExNX1VJTlQzMiB3b3JkOworICB9dTY7CisKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBMTV9VSU5UMTYgcmVzZXJ2ZWQyOworICAgICAgTE1fVUlOVDE2IG1idWZfbnVtOworICAgIH1zNzsKKworICAgIExNX1VJTlQzMiB3b3JkOworICB9dTc7CisKKyAgTE1fVUlOVDMyIHJlc2VydmVkMzsKKyAgTE1fVUlOVDMyIHJlc2VydmVkNDsKKyNlbHNlCisgIExNX1VJTlQzMiBzdGF0dXNfY29udHJvbDsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBMTV9VSU5UMTYgbGVuZ3RoOworICAgICAgTE1fVUlOVDggIHJlc2VydmVkMTsKKyAgICAgIExNX1VJTlQ4ICBjcWlkOworICAgIH1zMTsKKyAgICBMTV9VSU5UMzIgd29yZDsKKyAgfXUxOworICB1bmlvbiB7CisgICAgc3RydWN0CisgICAgeworICAgICAgTE1fVUlOVDE2IHRjcF91ZHBfaGRyX3N0YXJ0OworICAgICAgTE1fVUlOVDE2IGlwX2hkcl9zdGFydDsKKyAgICB9czI7CisKKyAgICBMTV9VSU5UMzIgd29yZDsKKyAgfXUyOworCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgTE1fVUlOVDE2IHZsYW5faWQ7CisgICAgICBMTV9VSU5UMTYgZGF0YV9zdGFydDsKKyAgICB9czM7CisKKyAgICBMTV9VSU5UMzIgd29yZDsKKyAgfXUzOworCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgTE1fVUlOVDE2IHRjcF91ZHBfY2hlY2tzdW07CisgICAgICBMTV9VSU5UMTYgaXBfY2hlY2tzdW07CisgICAgfXM0OworCisgICAgTE1fVUlOVDMyIHdvcmQ7CisgIH11NDsKKworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIExNX1VJTlQxNiBjaGVja3N1bV9zdGF0dXM7CisgICAgICBMTV9VSU5UMTYgcHNldWRvX2NoZWNrc3VtOworICAgIH1zNTsKKworICAgIExNX1VJTlQzMiB3b3JkOworICB9dTU7CisKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBMTV9VSU5UOCBydXB0OworICAgICAgTE1fVUlOVDggY2xhc3M7CisgICAgICBMTV9VSU5UMTYgcnVsZV9tYXRjaDsKKyAgICB9czY7CisKKyAgICBMTV9VSU5UMzIgd29yZDsKKyAgfXU2OworCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgTE1fVUlOVDE2IG1idWZfbnVtOworICAgICAgTE1fVUlOVDE2IHJlc2VydmVkMjsKKyAgICB9czc7CisKKyAgICBMTV9VSU5UMzIgd29yZDsKKyAgfXU3OworCisgIExNX1VJTlQzMiByZXNlcnZlZDM7CisgIExNX1VJTlQzMiByZXNlcnZlZDQ7CisjZW5kaWYKK31UM19NQlVGX0ZSQU1FX0RFU0MsKlBUM19NQlVGX0ZSQU1FX0RFU0M7CisKK3R5cGVkZWYgc3RydWN0IFQzX01CVUZfSERSIHsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICB1bnNpZ25lZCBpbnQgQzoxOworICAgICAgdW5zaWduZWQgaW50IEY6MTsKKyAgICAgIHVuc2lnbmVkIGludCByZXNlcnZlZDE6NzsKKyAgICAgIHVuc2lnbmVkIGludCBuZXh0X21idWY6MTY7CisgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOjc7CisgICAgfXMxOworCisgICAgTE1fVUlOVDMyIHdvcmQ7CisgIH11MTsKKworICBMTV9VSU5UMzIgbmV4dF9mcmFtZV9wdHI7Cit9VDNfTUJVRl9IRFIsICpQVDNfTUJVRl9IRFI7CisKK3R5cGVkZWYgc3RydWN0IFQzX01CVUYKK3sKKyAgVDNfTUJVRl9IRFIgaGRyOworICB1bmlvbgorICB7CisgICAgc3RydWN0IHsKKyAgICAgIFQzX01CVUZfRlJBTUVfREVTQyBmcmFtZV9oZHI7CisgICAgICBMTV9VSU5UMzIgZGF0YVsyMF07CisgICAgfXMxOworCisgICAgc3RydWN0IHsKKyAgICAgIExNX1VJTlQzMiBkYXRhWzMwXTsKKyAgICB9czI7CisgIH1ib2R5OworfVQzX01CVUYsICpQVDNfTUJVRjsKKworI2RlZmluZSBUM19NQlVGX0JBU0UgICAoVDNfTklDX01CVUZfUE9PTF9BRERSID4+IDcpCisjZGVmaW5lIFQzX01CVUZfRU5EICAgICgoVDNfTklDX01CVUZfUE9PTF9BRERSICsgVDNfTklDX01CVUZfUE9PTF9TSVpFKSA+PiA3KQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFN0YXRpc3RpY3MgYmxvY2suICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTE1fVUlOVDggUmVzZXJ2ZWQwWzB4NDAwLTB4MzAwXTsKKworICAgIC8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIE1BQy4gKi8KKyAgICBUM182NEJJVF9SRUdJU1RFUiBpZkhDSW5PY3RldHM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgUmVzZXJ2ZWQxOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNGcmFnbWVudHM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgaWZIQ0luVWNhc3RQa3RzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmSENJbk11bHRpY2FzdFBrdHM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgaWZIQ0luQnJvYWRjYXN0UGt0czsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNGQ1NFcnJvcnM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzQWxpZ25tZW50RXJyb3JzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIHhvblBhdXNlRnJhbWVzUmVjZWl2ZWQ7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgeG9mZlBhdXNlRnJhbWVzUmVjZWl2ZWQ7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgbWFjQ29udHJvbEZyYW1lc1JlY2VpdmVkOworICAgIFQzXzY0QklUX1JFR0lTVEVSIHhvZmZTdGF0ZUVudGVyZWQ7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzRnJhbWVzVG9vTG9uZzsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzSmFiYmVyczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzVW5kZXJzaXplUGt0czsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBpblJhbmdlTGVuZ3RoRXJyb3I7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgb3V0UmFuZ2VMZW5ndGhFcnJvcjsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czY0T2N0ZXRzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzNjVPY3RldHN0bzEyN09jdGV0czsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czEyOE9jdGV0c3RvMjU1T2N0ZXRzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzMjU2T2N0ZXRzdG81MTFPY3RldHM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHM1MTJPY3RldHN0bzEwMjNPY3RldHM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHMxMDI0T2N0ZXRzdG8xNTIyT2N0ZXRzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzMTUyM09jdGV0c3RvMjA0N09jdGV0czsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czIwNDhPY3RldHN0bzQwOTVPY3RldHM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHM0MDk2T2N0ZXRzdG84MTkxT2N0ZXRzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzODE5Mk9jdGV0c3RvOTAyMk9jdGV0czsKKworICAgIFQzXzY0QklUX1JFR0lTVEVSIFVudXNlZDFbMzddOworCisgICAgLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFRyYW5zbWl0IE1BQy4gKi8KKyAgICBUM182NEJJVF9SRUdJU1RFUiBpZkhDT3V0T2N0ZXRzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIFJlc2VydmVkMjsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzQ29sbGlzaW9uczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBvdXRYb25TZW50OworICAgIFQzXzY0QklUX1JFR0lTVEVSIG91dFhvZmZTZW50OworICAgIFQzXzY0QklUX1JFR0lTVEVSIGZsb3dDb250cm9sRG9uZTsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNJbnRlcm5hbE1hY1RyYW5zbWl0RXJyb3JzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c1NpbmdsZUNvbGxpc2lvbkZyYW1lczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNNdWx0aXBsZUNvbGxpc2lvbkZyYW1lczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNEZWZlcnJlZFRyYW5zbWlzc2lvbnM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgUmVzZXJ2ZWQzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0V4Y2Vzc2l2ZUNvbGxpc2lvbnM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzTGF0ZUNvbGxpc2lvbnM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMlRpbWVzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDNUaW1lczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQ0VGltZXM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkNVRpbWVzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDZUaW1lczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQ3VGltZXM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkOFRpbWVzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDlUaW1lczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQxMFRpbWVzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDExVGltZXM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMTJUaW1lczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQxM1RpbWVzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDE0VGltZXM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMTVUaW1lczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBpZkhDT3V0VWNhc3RQa3RzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmSENPdXRNdWx0aWNhc3RQa3RzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmSENPdXRCcm9hZGNhc3RQa3RzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0NhcnJpZXJTZW5zZUVycm9yczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBpZk91dERpc2NhcmRzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmT3V0RXJyb3JzOworCisgICAgVDNfNjRCSVRfUkVHSVNURVIgVW51c2VkMlszMV07CisKKyAgICAvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgUmVjZWl2ZSBMaXN0IFBsYWNlbWVudC4gKi8KKyAgICBUM182NEJJVF9SRUdJU1RFUiBDT1NJZkhDSW5Qa3RzWzE2XTsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBDT1NGcmFtZXNEcm9wcGVkRHVlVG9GaWx0ZXJzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY0RtYVdyaXRlUXVldWVGdWxsOworICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY0RtYVdyaXRlSGlnaFByaVF1ZXVlRnVsbDsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNOb01vcmVSeEJEczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBpZkluRGlzY2FyZHM7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgaWZJbkVycm9yczsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNSZWN2VGhyZXNob2xkSGl0OworCisgICAgVDNfNjRCSVRfUkVHSVNURVIgVW51c2VkM1s5XTsKKworICAgIC8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBTZW5kIERhdGEgSW5pdGlhdG9yLiAqLworICAgIFQzXzY0QklUX1JFR0lTVEVSIENPU0lmSENPdXRQa3RzWzE2XTsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNEbWFSZWFkUXVldWVGdWxsOworICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY0RtYVJlYWRIaWdoUHJpUXVldWVGdWxsOworICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY1NlbmREYXRhQ29tcFF1ZXVlRnVsbDsKKworICAgIC8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBIb3N0IENvYWxlc2NpbmcuICovCisgICAgVDNfNjRCSVRfUkVHSVNURVIgbmljUmluZ1NldFNlbmRQcm9kSW5kZXg7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgbmljUmluZ1N0YXR1c1VwZGF0ZTsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNJbnRlcnJ1cHRzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY0F2b2lkZWRJbnRlcnJ1cHRzOworICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY1NlbmRUaHJlc2hvbGRIaXQ7CisKKyAgICBMTV9VSU5UOCBSZXNlcnZlZDRbMHhiMDAtMHg5YzBdOworfSBUM19TVEFUU19CTE9DSywgKlBUM19TVEFUU19CTE9DSzsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVDNfMTZCSVRfUkVHSVNURVIgVmVuZG9ySWQ7CisgICAgVDNfMTZCSVRfUkVHSVNURVIgRGV2aWNlSWQ7CisKKyAgICBUM18xNkJJVF9SRUdJU1RFUiBDb21tYW5kOworICAgIFQzXzE2QklUX1JFR0lTVEVSIFN0YXR1czsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIENsYXNzQ29kZVJldklkOworCisgICAgVDNfOEJJVF9SRUdJU1RFUiBDYWNoZUxpbmVTaXplOworICAgIFQzXzhCSVRfUkVHSVNURVIgTGF0ZW5jeVRpbWVyOworICAgIFQzXzhCSVRfUkVHSVNURVIgSGVhZGVyVHlwZTsKKyAgICBUM184QklUX1JFR0lTVEVSIEJpc3Q7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNZW1CYXNlQWRkckxvdzsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNZW1CYXNlQWRkckhpZ2g7CisKKyAgICBMTV9VSU5UOCBVbnVzZWQxWzIwXTsKKworICAgIFQzXzE2QklUX1JFR0lTVEVSIFN1YnN5c3RlbVZlbmRvcklkOworICAgIFQzXzE2QklUX1JFR0lTVEVSIFN1YnN5c3RlbUlkOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgUm9tQmFzZUFkZHI7CisKKyAgICBUM184QklUX1JFR0lTVEVSIFBjaVhDYXBpYmxpdHlQdHI7CisgICAgTE1fVUlOVDggVW51c2VkMls3XTsKKworICAgIFQzXzhCSVRfUkVHSVNURVIgSW50TGluZTsKKyAgICBUM184QklUX1JFR0lTVEVSIEludFBpbjsKKyAgICBUM184QklUX1JFR0lTVEVSIE1pbkdudDsKKyAgICBUM184QklUX1JFR0lTVEVSIE1heExhdDsKKworICAgIFQzXzhCSVRfUkVHSVNURVIgUGNpWENhcGFiaWxpdGllczsKKyAgICBUM184QklUX1JFR0lTVEVSIFBtQ2FwYWJpbGl0eVB0cjsKKyAgICBUM18xNkJJVF9SRUdJU1RFUiBQY2lYQ29tbWFuZDsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFBjaVhTdGF0dXM7CisKKyAgICBUM184QklUX1JFR0lTVEVSIFBtQ2FwYWJpbGl0eUlkOworICAgIFQzXzhCSVRfUkVHSVNURVIgVnBkQ2FwYWJpbGl0eVB0cjsKKyAgICBUM18xNkJJVF9SRUdJU1RFUiBQbUNhcGFiaWxpdGllczsKKworICAgIFQzXzE2QklUX1JFR0lTVEVSIFBtQ3RybFN0YXR1czsKKyAgICAjZGVmaW5lIFBNX0NUUkxfUE1FX1NUQVRVUyAgICAgICAgICAgIEJJVF8xNQorICAgICNkZWZpbmUgUE1fQ1RSTF9QTUVfRU5BQkxFICAgICAgICAgICAgQklUXzgKKyAgICAjZGVmaW5lIFBNX0NUUkxfUE1FX1BPV0VSX1NUQVRFX0QwICAgIDAKKyAgICAjZGVmaW5lIFBNX0NUUkxfUE1FX1BPV0VSX1NUQVRFX0QxICAgIDEKKyAgICAjZGVmaW5lIFBNX0NUUkxfUE1FX1BPV0VSX1NUQVRFX0QyICAgIDIKKyAgICAjZGVmaW5lIFBNX0NUUkxfUE1FX1BPV0VSX1NUQVRFX0QzSCAgIDMKKworICAgIFQzXzhCSVRfUkVHSVNURVIgQnJpZGdlU3VwcG9ydEV4dDsKKyAgICBUM184QklUX1JFR0lTVEVSIFBtRGF0YTsKKworICAgIFQzXzhCSVRfUkVHSVNURVIgVnBkQ2FwYWJpbGl0eUlkOworICAgIFQzXzhCSVRfUkVHSVNURVIgTXNpQ2FwYWJpbGl0eVB0cjsKKyAgICBUM18xNkJJVF9SRUdJU1RFUiBWcGRBZGRyRmxhZzsKKyAgICAjZGVmaW5lIFZQRF9GTEFHX1dSSVRFICAgICAgKDEgPDwgMTUpCisgICAgI2RlZmluZSBWUERfRkxBR19SV19NQVNLICAgICgxIDw8IDE1KQorICAgICNkZWZpbmUgVlBEX0ZMQUdfUkVBRCAgICAgICAwCisKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFZwZERhdGE7CisKKyAgICBUM184QklUX1JFR0lTVEVSIE1zaUNhcGFiaWxpdHlJZDsKKyAgICBUM184QklUX1JFR0lTVEVSIE5leHRDYXBhYmlsaXR5UHRyOworICAgIFQzXzE2QklUX1JFR0lTVEVSIE1zaUN0cmw7CisgICAgI2RlZmluZSBNU0lfQ1RSTF82NEJJVF9DQVAgICAgICgxIDw8IDcpCisgICAgI2RlZmluZSBNU0lfQ1RSTF9NU0dfRU5BQkxFKHgpICh4IDw8IDQpCisgICAgI2RlZmluZSBNU0lfQ1RSTF9NU0dfQ0FQKHgpICAgICh4IDw8IDEpCisgICAgI2RlZmluZSBNU0lfQ1RSTF9FTkFCTEUgICAgICAgICgxIDw8IDApCisKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1zaUFkZHJMb3c7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTXNpQWRkckhpZ2g7CisKKyAgICBUM18xNkJJVF9SRUdJU1RFUiBNc2lEYXRhOworICAgIFQzXzE2QklUX1JFR0lTVEVSIFVudXNlZDM7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNaXNjSG9zdEN0cmw7CisgICAgI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9DTEVBUl9JTlQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyAgICAjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9FTkRJQU5fQllURV9TV0FQICAgICAgICAgIEJJVF8yCisgICAgI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfRU5ESUFOX1dPUkRfU1dBUCAgICAgICAgICBCSVRfMworICAgICNkZWZpbmUgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX1BDSV9TVEFURV9SRUdfUlcgICAgICAgICAgQklUXzQKKyAgICAjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9DTEtfUkVHX1JXICAgICAgICAgICAgICAgIEJJVF81CisgICAgI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfUkVHX1dPUkRfU1dBUCAgICAgICAgICAgICBCSVRfNgorICAgICNkZWZpbmUgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX0lORElSRUNUX0FDQ0VTUyAgICAgICAgICAgQklUXzcKKyAgICAjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9JTlRfTUFTS19NT0RFICAgICAgICAgICAgIEJJVF84CisgICAgI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfVEFHR0VEX1NUQVRVU19NT0RFICAgICAgICBCSVRfOQorCisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hUmVhZFdyaXRlQ3RybDsKKyAgICAjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZX01BU0sgICAgICAgICAgICAoQklUXzExIHwgQklUXzEyIHwgQklUXzEzKQorICAgICNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfRElTQUJMRSAgICAgICAgIDAKKyAgICAjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzE2ICAgICAgICAgICAgICBCSVRfMTEKKyAgICAjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzMyICAgICAgICAgICAgICBCSVRfMTIKKyAgICAjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzY0ICAgICAgICAgICAgICAoQklUXzEyIHwgQklUXzExKQorICAgICNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfMTI4ICAgICAgICAgICAgIEJJVF8xMworICAgICNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfMjU2ICAgICAgICAgICAgIChCSVRfMTMgfCBCSVRfMTEpCisgICAgI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV81MTIgICAgICAgICAgICAgKEJJVF8xMyB8IEJJVF8xMikKKyAgICAjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzEwMjQgICAgICAgICAgICAoQklUXzEzIHwgQklUXzEyIHwgQklUXzExKQorICAgICNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfT05FX0RNQV9BVF9PTkNFICAgICAgICAgIEJJVF8xNAorCisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBQY2lTdGF0ZTsKKyAgICAjZGVmaW5lIFQzX1BDSV9TVEFURV9GT1JDRV9QQ0lfUkVTRVQgICAgICAgICAgICAgICAgICAgIEJJVF8wCisgICAgI2RlZmluZSBUM19QQ0lfU1RBVEVfSU5URVJSVVBUX05PVF9BQ1RJVkUgICAgICAgICAgICAgICBCSVRfMQorICAgICNkZWZpbmUgVDNfUENJX1NUQVRFX05PVF9QQ0lfWF9CVVMgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyAgICAjZGVmaW5lIFQzX1BDSV9TVEFURV9ISUdIX0JVU19TUEVFRCAgICAgICAgICAgICAgICAgICAgIEJJVF8zCisgICAgI2RlZmluZSBUM19QQ0lfU1RBVEVfMzJCSVRfUENJX0JVUyAgICAgICAgICAgICAgICAgICAgICBCSVRfNAorICAgICNkZWZpbmUgVDNfUENJX1NUQVRFX1BDSV9ST01fRU5BQkxFICAgICAgICAgICAgICAgICAgICAgQklUXzUKKyAgICAjZGVmaW5lIFQzX1BDSV9TVEFURV9QQ0lfUk9NX1JFVFJZX0VOQUJMRSAgICAgICAgICAgICAgIEJJVF82CisgICAgI2RlZmluZSBUM19QQ0lfU1RBVEVfRkxBVF9WSUVXICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfOAorICAgICNkZWZpbmUgVDNfUENJX1NUQVRFX1JFVFJZX1NBTUVfRE1BICAgICAgICAgICAgICAgICAgICAgQklUXzEzCisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBDbG9ja0N0cmw7CisgICAgI2RlZmluZSBUM19QQ0lfQ0xLQ1RSTF9UWENQVV9DTEtfRElTQUJMRSAgICAgICAgICAgICAgICBCSVRfMTEKKyAgICAjZGVmaW5lIFQzX1BDSV9DTEtDVFJMX1JYQ1BVX0NMS19ESVNBQkxFICAgICAgICAgICAgICAgIEJJVF8xMAorICAgICNkZWZpbmUgVDNfUENJX0NMS0NUUkxfQ09SRV9DTEtfRElTQUJMRSAgICAgICAgICAgICAgICAgQklUXzkKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJlZ0Jhc2VBZGRyOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTWVtV2luZG93QmFzZUFkZHI7CisKKyNpZmRlZiBOSUNfQ1BVX1ZJRVcKKyAgLyogVGhlc2UgcmVnaXN0ZXJzIGFyZSBPTkxZIHZpc2libGUgdG8gTklDIENQVSAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFBvd2VyQ29uc3VtZWQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgUG93ZXJEaXNzaXBhdGVkOworI2Vsc2UgLyogTklDX0NQVV9WSUVXICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgUmVnRGF0YTsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNZW1XaW5kb3dEYXRhOworI2VuZGlmIC8qICFOSUNfQ1BVX1ZJRVcgKi8KKworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGVDdHJsOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTWlzY0NmZzsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1pc2NMb2NhbEN0cmw7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBVbnVzZWQ0OworCisgICAgLyogTk9URTogQmlnL0xpdHRsZS1lbmRpYW4gY2xhcmlmaWNhdGlvbiBuZWVkZWQuICBBcmUgdGhlc2UgcmVnaXN0ZXIgKi8KKyAgICAvKiBpbiBiaWcgb3IgbGl0dGxlIGVuZGlhbiBmb3JtYXRlLiAqLworICAgIFQzXzY0QklUX1JFR0lTVEVSIFN0ZFJpbmdQcm9kSWR4OworICAgIFQzXzY0QklUX1JFR0lTVEVSIFJjdlJldFJpbmdDb25JZHg7CisgICAgVDNfNjRCSVRfUkVHSVNURVIgU25kUHJvZElkeDsKKworICAgIExNX1VJTlQ4IFVudXNlZDVbODBdOworfSBUM19QQ0lfQ09ORklHVVJBVElPTiwgKlBUM19QQ0lfQ09ORklHVVJBVElPTjsKKworI2RlZmluZSBQQ0lYX0NNRF9NQVhfU1BMSVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzAKKyNkZWZpbmUgUENJWF9DTURfTUFYX1NQTElUX1NITCAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBQQ0lYX0NNRF9NQVhfQlVSU1RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMGMKKyNkZWZpbmUgUENJWF9DTURfTUFYX0JVUlNUX1NITCAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQQ0lYX0NNRF9NQVhfQlVSU1RfQ1BJT0IgICAgICAgICAgICAgICAgICAgICAgICAyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNYWMgY29udHJvbCByZWdpc3RlcnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogTUFDIG1vZGUgY29udHJvbC4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworICAgICNkZWZpbmUgTUFDX01PREVfR0xPQkFMX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgTUFDX01PREVfSEFMRl9EVVBMRVggICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorICAgICNkZWZpbmUgTUFDX01PREVfUE9SVF9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAoQklUXzIgfCBCSVRfMykKKyAgICAjZGVmaW5lIE1BQ19NT0RFX1BPUlRfTU9ERV9UQkkgICAgICAgICAgICAgICAgICAgICAgKEJJVF8yIHwgQklUXzMpCisgICAgI2RlZmluZSBNQUNfTU9ERV9QT1JUX01PREVfR01JSSAgICAgICAgICAgICAgICAgICAgIEJJVF8zCisgICAgI2RlZmluZSBNQUNfTU9ERV9QT1JUX01PREVfTUlJICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCisgICAgI2RlZmluZSBNQUNfTU9ERV9QT1JUX01PREVfTk9ORSAgICAgICAgICAgICAgICAgICAgIEJJVF9OT05FCisgICAgI2RlZmluZSBNQUNfTU9ERV9QT1JUX0lOVEVSTkFMX0xPT1BCQUNLICAgICAgICAgICAgIEJJVF80CisgICAgI2RlZmluZSBNQUNfTU9ERV9UQUdHRURfTUFDX0NPTlRST0wgICAgICAgICAgICAgICAgIEJJVF83CisgICAgI2RlZmluZSBNQUNfTU9ERV9UWF9CVVJTVElORyAgICAgICAgICAgICAgICAgICAgICAgIEJJVF84CisgICAgI2RlZmluZSBNQUNfTU9ERV9NQVhfREVGRVIgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF85CisgICAgI2RlZmluZSBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMAorICAgICNkZWZpbmUgTUFDX01PREVfRU5BQkxFX1JYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICBCSVRfMTEKKyAgICAjZGVmaW5lIE1BQ19NT0RFX0NMRUFSX1JYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgQklUXzEyCisgICAgI2RlZmluZSBNQUNfTU9ERV9GTFVTSF9SWF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgIEJJVF8xMworICAgICNkZWZpbmUgTUFDX01PREVfRU5BQkxFX1RYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICBCSVRfMTQKKyAgICAjZGVmaW5lIE1BQ19NT0RFX0NMRUFSX1RYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgQklUXzE1CisgICAgI2RlZmluZSBNQUNfTU9ERV9GTFVTSF9UWF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgIEJJVF8xNgorICAgICNkZWZpbmUgTUFDX01PREVfU0VORF9DT05GSUdTICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTcKKyAgICAjZGVmaW5lIE1BQ19NT0RFX0RFVEVDVF9NQUdJQ19QQUNLRVRfRU5BQkxFICAgICAgICAgQklUXzE4CisgICAgI2RlZmluZSBNQUNfTU9ERV9BQ1BJX1BPV0VSX09OX0VOQUJMRSAgICAgICAgICAgICAgIEJJVF8xOQorICAgICNkZWZpbmUgTUFDX01PREVfRU5BQkxFX01JUCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjAKKyAgICAjZGVmaW5lIE1BQ19NT0RFX0VOQUJMRV9UREUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIxCisgICAgI2RlZmluZSBNQUNfTU9ERV9FTkFCTEVfUkRFICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yMgorICAgICNkZWZpbmUgTUFDX01PREVfRU5BQkxFX0ZIREUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjMKKworICAgIC8qIE1BQyBzdGF0dXMgKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisgICAgI2RlZmluZSBNQUNfU1RBVFVTX1BDU19TWU5DRUQgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisgICAgI2RlZmluZSBNQUNfU1RBVFVTX1NJR05BTF9ERVRFQ1RFRCAgICAgICAgICAgICAgICAgIEJJVF8xCisgICAgI2RlZmluZSBNQUNfU1RBVFVTX1JFQ0VJVklOR19DRkcgICAgICAgICAgICAgICAgICAgIEJJVF8yCisgICAgI2RlZmluZSBNQUNfU1RBVFVTX0NGR19DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgIEJJVF8zCisgICAgI2RlZmluZSBNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgIEJJVF80CisgICAgI2RlZmluZSBNQUNfU1RBVFVTX1BPUlRfREVDT0RFX0VSUk9SICAgICAgICAgICAgICAgIEJJVF8xMAorICAgICNkZWZpbmUgTUFDX1NUQVRVU19MSU5LX1NUQVRFX0NIQU5HRUQgICAgICAgICAgICAgICBCSVRfMTIKKyAgICAjZGVmaW5lIE1BQ19TVEFUVVNfTUlfQ09NUExFVElPTiAgICAgICAgICAgICAgICAgICAgQklUXzIyCisgICAgI2RlZmluZSBNQUNfU1RBVFVTX01JX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgIEJJVF8yMworICAgICNkZWZpbmUgTUFDX1NUQVRVU19BUF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjQKKyAgICAjZGVmaW5lIE1BQ19TVEFUVVNfT0RJX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI1CisgICAgI2RlZmluZSBNQUNfU1RBVFVTX1JYX1NUQVRTX09WRVJSVU4gICAgICAgICAgICAgICAgIEJJVF8yNgorICAgICNkZWZpbmUgTUFDX1NUQVRVU19UWF9TVEFUU19PVkVSUlVOICAgICAgICAgICAgICAgICBCSVRfMjcKKworICAgIC8qIEV2ZW50IEVuYWJsZSAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1hY0V2ZW50OworICAgICNkZWZpbmUgTUFDX0VWRU5UX0VOQUJMRV9QT1JUX0RFQ09ERV9FUlIgICAgICAgICAgICBCSVRfMTAKKyAgICAjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfTElOS19TVEFURV9DSEFOR0VEX0FUVE4gICAgQklUXzEyCisgICAgI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX01JX0NPTVBMRVRJT04gICAgICAgICAgICAgIEJJVF8yMgorICAgICNkZWZpbmUgTUFDX0VWRU5UX0VOQUJMRV9NSV9JTlRFUlJVUFQgICAgICAgICAgICAgICBCSVRfMjMKKyAgICAjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfQVBfRVJST1IgICAgICAgICAgICAgICAgICAgQklUXzI0CisgICAgI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX09ESV9FUlJPUiAgICAgICAgICAgICAgICAgIEJJVF8yNQorICAgICNkZWZpbmUgTUFDX0VWRU5UX0VOQUJMRV9SWF9TVEFUU19PVkVSUlVOICAgICAgICAgICBCSVRfMjYKKyAgICAjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfVFhfU1RBVFNfT1ZFUlJVTiAgICAgICAgICAgQklUXzI3CisKKyAgICAvKiBMZWQgY29udHJvbC4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBMZWRDdHJsOworICAgICNkZWZpbmUgTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgTEVEX0NUUkxfMTAwME1CUFNfTEVEX09OICAgICAgICAgICAgICAgICAgICBCSVRfMQorICAgICNkZWZpbmUgTEVEX0NUUkxfMTAwTUJQU19MRURfT04gICAgICAgICAgICAgICAgICAgICBCSVRfMgorICAgICNkZWZpbmUgTEVEX0NUUkxfMTBNQlBTX0xFRF9PTiAgICAgICAgICAgICAgICAgICAgICBCSVRfMworICAgICNkZWZpbmUgTEVEX0NUUkxfT1ZFUlJJREVfVFJBRkZJQ19MRUQgICAgICAgICAgICAgICBCSVRfNAorICAgICNkZWZpbmUgTEVEX0NUUkxfQkxJTktfVFJBRkZJQ19MRUQgICAgICAgICAgICAgICAgICBCSVRfNQorICAgICNkZWZpbmUgTEVEX0NUUkxfVFJBRkZJQ19MRUQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNgorICAgICNkZWZpbmUgTEVEX0NUUkxfMTAwME1CUFNfTEVEX1NUQVRVUyAgICAgICAgICAgICAgICBCSVRfNworICAgICNkZWZpbmUgTEVEX0NUUkxfMTAwTUJQU19MRURfU1RBVFVTICAgICAgICAgICAgICAgICBCSVRfOAorICAgICNkZWZpbmUgTEVEX0NUUkxfMTBNQlBTX0xFRF9TVEFUVVMgICAgICAgICAgICAgICAgICBCSVRfOQorICAgICNkZWZpbmUgTEVEX0NUUkxfVFJBRkZJQ19MRURfU1RBVFVTICAgICAgICAgICAgICAgICBCSVRfMTAKKyAgICAjZGVmaW5lIExFRF9DVFJMX01BQ19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUX05PTkUKKyAgICAjZGVmaW5lIExFRF9DVFJMX1BIWV9NT0RFXzEgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzExCisgICAgI2RlZmluZSBMRURfQ1RSTF9QSFlfTU9ERV8yICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMgorICAgICNkZWZpbmUgTEVEX0NUUkxfQkxJTktfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICAweDdmZjgwMDAwCisgICAgI2RlZmluZSBMRURfQ1RSTF9PVkVSUklERV9CTElOS19QRVJJT0QgICAgICAgICAgICAgIEJJVF8xOQorICAgICNkZWZpbmUgTEVEX0NUUkxfT1ZFUlJJREVfQkxJTktfUkFURSAgICAgICAgICAgICAgICBCSVRfMzEKKworICAgIC8qIE1BQyBhZGRyZXNzZXMuICovCisgICAgc3RydWN0IHsKKyAgICAgICAgVDNfMzJCSVRfUkVHSVNURVIgSGlnaDsgICAgICAgICAgICAgLyogVXBwZXIgMiBieXRlcy4gKi8KKyAgICAgICAgVDNfMzJCSVRfUkVHSVNURVIgTG93OyAgICAgICAgICAgICAgLyogTG93ZXIgNCBieXRlcy4gKi8KKyAgICB9IE1hY0FkZHJbNF07CisKKyAgICAvKiBBQ1BJIE1idWYgcG9pbnRlci4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBBY3BpTWJ1ZlB0cjsKKworICAgIC8qIEFDUEkgTGVuZ3RoIGFuZCBPZmZzZXQuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgQWNwaUxlbmd0aE9mZnNldDsKKyAgICAjZGVmaW5lIEFDUElfTEVOR1RIX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisgICAgI2RlZmluZSBBQ1BJX09GRlNFVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGZmZjAwMDAKKyAgICAjZGVmaW5lIEFDUElfTEVOR1RIKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeAorICAgICNkZWZpbmUgQUNQSV9PRkZTRVQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDE2KQorCisgICAgLyogVHJhbnNtaXQgcmFuZG9tIGJhY2tvZmYuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgVHhCYWNrb2ZmU2VlZDsKKyAgICAjZGVmaW5lIE1BQ19UWF9CQUNLT0ZGX1NFRURfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgzZmYKKworICAgIC8qIFJlY2VpdmUgTVRVICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTXR1U2l6ZTsKKyAgICAjZGVmaW5lIE1BQ19SWF9NVFVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisKKyAgICAvKiBHaWdhYml0IFBDUyBUZXN0LiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFBjc1Rlc3Q7CisgICAgI2RlZmluZSBNQUNfUENTX1RFU1RfREFUQV9QQVRURVJOX01BU0sgICAgICAgICAgICAgIDB4MGZmZmZmCisgICAgI2RlZmluZSBNQUNfUENTX1RFU1RfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yMAorCisgICAgLyogVHJhbnNtaXQgR2lnYWJpdCBBdXRvLU5lZ290aWF0aW9uLiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4QXV0b05lZzsKKyAgICAjZGVmaW5lIE1BQ19BTl9UWF9BTl9EQVRBX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisKKyAgICAvKiBSZWNlaXZlIEdpZ2FiaXQgQXV0by1OZWdvdGlhdGlvbi4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBSeEF1dG9OZWc7CisgICAgI2RlZmluZSBNQUNfQU5fUlhfQU5fREFUQV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCisgICAgLyogTUkgQ29tbXVuaWNhdGlvbi4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNaUNvbTsKKyAgICAjZGVmaW5lIE1JX0NPTV9DTURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVF8yNiB8IEJJVF8yNykKKyAgICAjZGVmaW5lIE1JX0NPTV9DTURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI2CisgICAgI2RlZmluZSBNSV9DT01fQ01EX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yNworICAgICNkZWZpbmUgTUlfQ09NX1JFQURfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjgKKyAgICAjZGVmaW5lIE1JX0NPTV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI5CisgICAgI2RlZmluZSBNSV9DT01fQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yOQorCisgICAgI2RlZmluZSBNSV9DT01fUEhZX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MWYKKyAgICAjZGVmaW5lIE1JX0NPTV9GSVJTVF9QSFlfQUREUl9CSVQgICAgICAgICAgICAgICAgICAgMjEKKworICAgICNkZWZpbmUgTUlfQ09NX1BIWV9SRUdfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDFmCisgICAgI2RlZmluZSBNSV9DT01fRklSU1RfUEhZX1JFR19BRERSX0JJVCAgICAgICAgICAgICAgIDE2CisKKyAgICAjZGVmaW5lIE1JX0NPTV9QSFlfREFUQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisKKyAgICAvKiBNSSBTdGF0dXMuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTWlTdGF0dXM7CisgICAgI2RlZmluZSBNSV9TVEFUVVNfRU5BQkxFX0xJTktfU1RBVFVTX0FUVE4gICAgICAgICAgIEJJVF8wCisKKyAgICAvKiBNSSBNb2RlLiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1pTW9kZTsKKyAgICAjZGVmaW5lIE1JX01PREVfQ0xPQ0tfU1BFRURfMTBNSFogICAgICAgICAgICAgICAgICAgQklUXzAKKyAgICAjZGVmaW5lIE1JX01PREVfVVNFX1NIT1JUX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgQklUXzEKKyAgICAjZGVmaW5lIE1JX01PREVfQVVUT19QT0xMSU5HX0VOQUJMRSAgICAgICAgICAgICAgICAgQklUXzQKKyAgICAjZGVmaW5lIE1JX01PREVfQ09SRV9DTE9DS19TUEVFRF82Mk1IWiAgICAgICAgICAgICAgQklUXzE1CisKKyAgICAvKiBBdXRvLXBvbGxpbmcgc3RhdHVzLiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIEF1dG9Qb2xsU3RhdHVzOworICAgICNkZWZpbmUgQVVUT19QT0xMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorCisgICAgLyogVHJhbnNtaXQgTUFDIG1vZGUuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgVHhNb2RlOworICAgICNkZWZpbmUgVFhfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgVFhfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorICAgICNkZWZpbmUgVFhfTU9ERV9FTkFCTEVfRkxPV19DT05UUk9MICAgICAgICAgICAgICAgICBCSVRfNAorICAgICNkZWZpbmUgVFhfTU9ERV9FTkFCTEVfQklHX0JBQ0tPRkYgICAgICAgICAgICAgICAgICBCSVRfNQorICAgICNkZWZpbmUgVFhfTU9ERV9FTkFCTEVfTE9OR19QQVVTRSAgICAgICAgICAgICAgICAgICBCSVRfNgorCisgICAgLyogVHJhbnNtaXQgTUFDIHN0YXR1cy4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBUeFN0YXR1czsKKyAgICAjZGVmaW5lIFRYX1NUQVRVU19SWF9DVVJSRU5UTFlfWE9GRkVEICAgICAgICAgICAgICAgQklUXzAKKyAgICAjZGVmaW5lIFRYX1NUQVRVU19TRU5UX1hPRkYgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyAgICAjZGVmaW5lIFRYX1NUQVRVU19TRU5UX1hPTiAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyAgICAjZGVmaW5lIFRYX1NUQVRVU19MSU5LX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKKyAgICAjZGVmaW5lIFRYX1NUQVRVU19PRElfVU5ERVJSVU4gICAgICAgICAgICAgICAgICAgICAgQklUXzQKKyAgICAjZGVmaW5lIFRYX1NUQVRVU19PRElfT1ZFUlJVTiAgICAgICAgICAgICAgICAgICAgICAgQklUXzUKKworICAgIC8qIFRyYW5zbWl0IE1BQyBsZW5ndGguICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgVHhMZW5ndGhzOworICAgICNkZWZpbmUgVFhfTEVOX1NMT1RfVElNRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweGZmCisgICAgI2RlZmluZSBUWF9MRU5fSVBHX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGYwMAorICAgICNkZWZpbmUgVFhfTEVOX0lQR19DUlNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAoQklUXzEyIHwgQklUXzEzKQorCisgICAgLyogUmVjZWl2ZSBNQUMgbW9kZS4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBSeE1vZGU7CisgICAgI2RlZmluZSBSWF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisgICAgI2RlZmluZSBSWF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisgICAgI2RlZmluZSBSWF9NT0RFX0VOQUJMRV9GTE9XX0NPTlRST0wgICAgICAgICAgICAgICAgIEJJVF8yCisgICAgI2RlZmluZSBSWF9NT0RFX0tFRVBfTUFDX0NPTlRST0wgICAgICAgICAgICAgICAgICAgIEJJVF8zCisgICAgI2RlZmluZSBSWF9NT0RFX0tFRVBfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF80CisgICAgI2RlZmluZSBSWF9NT0RFX0FDQ0VQVF9PVkVSU0laRUQgICAgICAgICAgICAgICAgICAgIEJJVF81CisgICAgI2RlZmluZSBSWF9NT0RFX0FDQ0VQVF9SVU5UUyAgICAgICAgICAgICAgICAgICAgICAgIEJJVF82CisgICAgI2RlZmluZSBSWF9NT0RFX0xFTkdUSF9DSEVDSyAgICAgICAgICAgICAgICAgICAgICAgIEJJVF83CisgICAgI2RlZmluZSBSWF9NT0RFX1BST01JU0NVT1VTX01PREUgICAgICAgICAgICAgICAgICAgIEJJVF84CisgICAgI2RlZmluZSBSWF9NT0RFX05PX0NSQ19DSEVDSyAgICAgICAgICAgICAgICAgICAgICAgIEJJVF85CisgICAgI2RlZmluZSBSWF9NT0RFX0tFRVBfVkxBTl9UQUcgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMAorCisgICAgLyogUmVjZWl2ZSBNQUMgc3RhdHVzLiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4U3RhdHVzOworICAgICNkZWZpbmUgUlhfU1RBVFVTX1JFTU9URV9UUkFOU01JVFRFUl9YT0ZGRUQgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgUlhfU1RBVFVTX1hPRkZfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICBCSVRfMQorICAgICNkZWZpbmUgUlhfU1RBVFVTX1hPTl9SRUNFSVZFRCAgICAgICAgICAgICAgICAgICAgICBCSVRfMgorCisgICAgLyogSGFzaCByZWdpc3RlcnMuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgSGFzaFJlZ1s0XTsKKworICAgIC8qIFJlY2VpdmUgcGxhY2VtZW50IHJ1bGVzIHJlZ2lzdGVycy4gKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICBUM18zMkJJVF9SRUdJU1RFUiBSdWxlOworICAgICAgICBUM18zMkJJVF9SRUdJU1RFUiBWYWx1ZTsKKyAgICB9IFJjdlJ1bGVzWzE2XTsKKworICAgICNkZWZpbmUgUkNWX0RJU0FCTEVfUlVMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDdmZmZmZmZmCisKKyAgICAjZGVmaW5lIFJDVl9SVUxFMV9SRUpFQ1RfQlJPQURDQVNUX0lEWCAgICAgICAgICAgICAgMHgwMAorICAgICNkZWZpbmUgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9SVUxFICAgICAgICAgICAgICAgICAweGMyMDAwMDAwCisgICAgI2RlZmluZSBSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1ZBTFVFICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKworICAgICNkZWZpbmUgUkNWX1JVTEUyX1JFSkVDVF9CUk9BRENBU1RfSURYICAgICAgICAgICAgICAweDAxCisgICAgI2RlZmluZSBSRUpFQ1RfQlJPQURDQVNUX1JVTEUyX1JVTEUgICAgICAgICAgICAgICAgIDB4ODYwMDAwMDQKKyAgICAjZGVmaW5lIFJFSkVDVF9CUk9BRENBU1RfUlVMRTJfVkFMVUUgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorCisjaWYgSU5DTFVERV81NzAxX0FYX0ZJWAorICAgICNkZWZpbmUgUkNWX0xBU1RfUlVMRV9JRFggICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZWxzZQorICAgICNkZWZpbmUgUkNWX0xBU1RfUlVMRV9JRFggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZW5kaWYKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdlJ1bGVDZmc7CisgICAgI2RlZmluZSBSWF9SVUxFX0RFRkFVTFRfQ0xBU1MgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCisKKyAgICBMTV9VSU5UOCBSZXNlcnZlZDFbMTQwXTsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlcmRlc0NmZzsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTZXJkZXNTdGF0dXM7CisKKyAgICBMTV9VSU5UOCBSZXNlcnZlZDJbMTA0XTsKKworICAgIHZvbGF0aWxlIExNX1VJTlQ4IFR4TWFjU3RhdGVbMTZdOworICAgIHZvbGF0aWxlIExNX1VJTlQ4IFJ4TWFjU3RhdGVbMjBdOworCisgICAgTE1fVUlOVDggUmVzZXJ2ZWQzWzQ3Nl07CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBSeFN0YXRzWzI2XTsKKworICAgIExNX1VJTlQ4IFJlc2VydmVkNFsyNF07CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBUeFN0YXRzWzI4XTsKKworICAgIExNX1VJTlQ4IFJlc2VydmVkNVs3ODRdOworfSBUM19NQUNfQ09OVFJPTCwgKlBUM19NQUNfQ09OVFJPTDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTZW5kIGRhdGEgaW5pdGlhdG9yIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisgICAgI2RlZmluZSBUM19TTkRfREFUQV9JTl9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgVDNfU05EX0RBVEFfSU5fTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyAgICAjZGVmaW5lIFQzX1NORF9EQVRBX0lOX01PREVfU1RBVFNfT0ZMV19BVFROX0VOQUJMRSAgICAgIEJJVF8yCisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisgICAgI2RlZmluZSBUM19TTkRfREFUQV9JTl9TVEFUVVNfU1RBVFNfT0ZMV19BVFROICAgICAgICAgICBCSVRfMgorCisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNDdHJsOworICAgICNkZWZpbmUgVDNfU05EX0RBVEFfSU5fU1RBVFNfQ1RSTF9FTkFCTEUgICAgICAgICAgICAgICAgQklUXzAKKyAgICAjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRkFTVEVSX1VQREFURSAgICAgICAgIEJJVF8xCisgICAgI2RlZmluZSBUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0NMRUFSICAgICAgICAgICAgICAgICBCSVRfMgorICAgICNkZWZpbmUgVDNfU05EX0RBVEFfSU5fU1RBVFNfQ1RSTF9GTFVTSCAgICAgICAgICAgICAgICAgQklUXzMKKyAgICAjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRk9SQ0VfWkVSTyAgICAgICAgICAgIEJJVF80CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0VuYWJsZU1hc2s7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNJbmNNYXNrOworCisgICAgTE1fVUlOVDggUmVzZXJ2ZWRbMTA4XTsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIENsYXNzT2ZTZXJ2Q250WzE2XTsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFSZWFkUUZ1bGxDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hUHJpb3JpdHlSZWFkUUZ1bGxDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgU2RjUUZ1bGxDbnQ7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNSaW5nU2V0U2VuZFByb2RJZHhDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzVXBkYXRlZENudDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBJbnRlcnJ1cHRzQ250OworICAgIFQzXzMyQklUX1JFR0lTVEVSIEF2b2lkSW50ZXJydXB0c0NudDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kVGhyZXNob2xkSGl0Q250OworCisgICAgLyogVW51c2VkIHNwYWNlLiAqLworICAgIExNX1VJTlQ4IFVudXNlZFs4MDBdOworfSBUM19TRU5EX0RBVEFfSU5JVElBVE9SLCAqUFQzX1NFTkRfREFUQV9JTklUSUFUT1I7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VuZCBkYXRhIGNvbXBsZXRpb24gY29udHJvbCByZWdpc3RlcnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyAgICAjZGVmaW5lIFNORF9EQVRBX0NPTVBfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisgICAgI2RlZmluZSBTTkRfREFUQV9DT01QX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorCisgICAgLyogVW51c2VkIHNwYWNlLiAqLworICAgIExNX1VJTlQ4IFVudXNlZFsxMDIwXTsKK30gVDNfU0VORF9EQVRBX0NPTVBMRVRJT04sICpQVDNfU0VORF9EQVRBX0NPTVBMRVRJT047CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VuZCBCRCBSaW5nIFNlbGVjdG9yIENvbnRyb2wgUmVnaXN0ZXJzLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisgICAgI2RlZmluZSBTTkRfQkRfU0VMX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgU05EX0JEX1NFTF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyAgICAjZGVmaW5lIFNORF9CRF9TRUxfTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIEJJVF8yCisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisgICAgI2RlZmluZSBTTkRfQkRfU0VMX1NUQVRVU19FUlJPUl9BVFROICAgICAgICAgICAgICAgICAgICBCSVRfMgorCisgICAgVDNfMzJCSVRfUkVHSVNURVIgSHdEaWFnOworCisgICAgLyogVW51c2VkIHNwYWNlLiAqLworICAgIExNX1VJTlQ4IFVudXNlZDFbNTJdOworCisgICAgLyogU2VuZCBCRCBSaW5nIFNlbGVjdG9yIExvY2FsIE5JQyBTZW5kIEJEIENvbnN1bWVyIEluZGV4LiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY1NlbmRCZFNlbENvbklkeFsxNl07CisKKyAgICAvKiBVbnVzZWQgc3BhY2UuICovCisgICAgTE1fVUlOVDggVW51c2VkMls4OTZdOworfSBUM19TRU5EX0JEX1NFTEVDVE9SLCAqUFQzX1NFTkRfQkRfU0VMRUNUT1I7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VuZCBCRCBpbml0aWF0b3IgY29udHJvbCByZWdpc3RlcnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyAgICAjZGVmaW5lIFNORF9CRF9JTl9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisgICAgI2RlZmluZSBTTkRfQkRfSU5fTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorICAgICNkZWZpbmUgU05EX0JEX0lOX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyAgICAjZGVmaW5lIFNORF9CRF9JTl9TVEFUVVNfRVJST1JfQVRUTiAgICAgICAgICAgICAgICAgICAgIEJJVF8yCisKKyAgICAvKiBTZW5kIEJEIGluaXRpYXRvciBsb2NhbCBOSUMgc2VuZCBCRCBwcm9kdWNlciBpbmRleC4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNTZW5kQmRJblByb2RJZHhbMTZdOworCisgICAgLyogVW51c2VkIHNwYWNlLiAqLworICAgIExNX1VJTlQ4IFVudXNlZDJbOTUyXTsKK30gVDNfU0VORF9CRF9JTklUSUFUT1IsICpQVDNfU0VORF9CRF9JTklUSUFUT1I7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VuZCBCRCBDb21wbGV0aW9uIENvbnRyb2wuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyAgICAjZGVmaW5lIFNORF9CRF9DT01QX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisgICAgI2RlZmluZSBTTkRfQkRfQ09NUF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorICAgICNkZWZpbmUgU05EX0JEX0NPTVBfTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgQklUXzIKKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWQyWzEwMjBdOworfSBUM19TRU5EX0JEX0NPTVBMRVRJT04sICpQVDNfU0VORF9CRF9DT01QTEVUSU9OOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJlY2VpdmUgbGlzdCBwbGFjZW1lbnQgY29udHJvbCByZWdpc3RlcnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogTW9kZS4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworICAgICNkZWZpbmUgUkNWX0xJU1RfUExNVF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyAgICAjZGVmaW5lIFJDVl9MSVNUX1BMTVRfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisgICAgI2RlZmluZSBSQ1ZfTElTVF9QTE1UX01PREVfQ0xBU1MwX0FUVE5fRU5BQkxFICAgICAgICAgICBCSVRfMgorICAgICNkZWZpbmUgUkNWX0xJU1RfUExNVF9NT0RFX01BUFBJTkdfT09SX0FUVE5fRU5BQkxFICAgICAgQklUXzMKKyAgICAjZGVmaW5lIFJDVl9MSVNUX1BMTVRfTU9ERV9TVEFUU19PRkxPV19BVFROX0VOQUJMRSAgICAgIEJJVF80CisKKyAgICAvKiBTdGF0dXMuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworICAgICNkZWZpbmUgUkNWX0xJU1RfUExNVF9TVEFUVVNfQ0xBU1MwX0FUVE4gICAgICAgICAgICAgICAgQklUXzIKKyAgICAjZGVmaW5lIFJDVl9MSVNUX1BMTVRfU1RBVFVTX01BUFBJTkdfQVRUTiAgICAgICAgICAgICAgIEJJVF8zCisgICAgI2RlZmluZSBSQ1ZfTElTVF9QTE1UX1NUQVRVU19TVEFUU19PRkxPV19BVFROICAgICAgICAgICBCSVRfNAorCisgICAgLyogUmVjZWl2ZSBzZWxlY3RvciBsaXN0IGxvY2sgcmVnaXN0ZXIuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTG9jazsKKyAgICAjZGVmaW5lIFJDVl9MSVNUX1NFTF9MT0NLX1JFUVVFU1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4ZmZmZgorICAgICNkZWZpbmUgUkNWX0xJU1RfU0VMX0xPQ0tfR1JBTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorCisgICAgLyogU2VsZWN0b3Igbm9uLWVtcHR5IGJpdHMuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTm9uRW1wdHlCaXRzOworICAgICNkZWZpbmUgUkNWX0xJU1RfU0VMX05PTl9FTVBUWV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisKKyAgICAvKiBSZWNlaXZlIGxpc3QgcGxhY2VtZW50IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgQ29uZmlnOworCisgICAgLyogUmVjZWl2ZSBMaXN0IFBsYWNlbWVudCBzdGF0aXN0aWNzIENvbnRyb2wuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNDdHJsOworI2RlZmluZSBSQ1ZfTElTVF9TVEFUU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgUkNWX0xJU1RfU1RBVFNfRkFTVF9VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisKKyAgICAvKiBSZWNlaXZlIExpc3QgUGxhY2VtZW50IHN0YXRpc3RpY3MgRW5hYmxlIE1hc2suICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNFbmFibGVNYXNrOworCisgICAgLyogUmVjZWl2ZSBMaXN0IFBsYWNlbWVudCBzdGF0aXN0aWNzIEluY3JlbWVudCBNYXNrLiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXRzSW5jTWFzazsKKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWQxWzIyNF07CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBUM18zMkJJVF9SRUdJU1RFUiBIZWFkOworICAgICAgICBUM18zMkJJVF9SRUdJU1RFUiBUYWlsOworICAgICAgICBUM18zMkJJVF9SRUdJU1RFUiBDb3VudDsKKworICAgICAgICAvKiBVbnVzZWQgc3BhY2UuICovCisgICAgICAgIExNX1VJTlQ4IFVudXNlZFs0XTsKKyAgICB9IFJjdlNlbGVjdG9yTGlzdFsxNl07CisKKyAgICAvKiBMb2NhbCBzdGF0aXN0aWNzIGNvdW50ZXIuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgQ2xhc3NPZlNlcnZDbnRbMTZdOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgRHJvcER1ZVRvRmlsdGVyQ250OworICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYVdyaXRlUUZ1bGxDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFByaW9yaXR5V3JpdGVRRnVsbENudDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBOb01vcmVSZWNlaXZlQmRDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgSWZJbkRpc2NhcmRzQ250OworICAgIFQzXzMyQklUX1JFR0lTVEVSIElmSW5FcnJvcnNDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2VGhyZXNob2xkSGl0Q250OworCisgICAgLyogQW5vdGhlciB1bnVzZWQgc3BhY2UuICovCisgICAgTE1fVUlOVDggVW51c2VkMls0MjBdOworfSBUM19SQ1ZfTElTVF9QTEFDRU1FTlQsICpQVDNfUkNWX0xJU1RfUExBQ0VNRU5UOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBJbml0aWF0b3IgQ29udHJvbC4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBNb2RlLiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisgICAgI2RlZmluZSBSQ1ZfREFUQV9CRF9JTl9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgIEJJVF8wCisgICAgI2RlZmluZSBSQ1ZfREFUQV9CRF9JTl9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgIEJJVF8xCisgICAgI2RlZmluZSBSQ1ZfREFUQV9CRF9JTl9NT0RFX0pVTUJPX0JEX05FRURFRCAgICAgICAgIEJJVF8yCisgICAgI2RlZmluZSBSQ1ZfREFUQV9CRF9JTl9NT0RFX0ZSQU1FX1RPT19CSUcgICAgICAgICAgIEJJVF8zCisgICAgI2RlZmluZSBSQ1ZfREFUQV9CRF9JTl9NT0RFX0lOVkFMSURfUklOR19TSVpFICAgICAgIEJJVF80CisKKyAgICAvKiBTdGF0dXMuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworICAgICNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fU1RBVFVTX0pVTUJPX0JEX05FRURFRCAgICAgICBCSVRfMgorICAgICNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fU1RBVFVTX0ZSQU1FX1RPT19CSUcgICAgICAgICBCSVRfMworICAgICNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fU1RBVFVTX0lOVkFMSURfUklOR19TSVpFICAgICBCSVRfNAorCisgICAgLyogU3BsaXQgZnJhbWUgbWluaXVtIHNpemUuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3BsaXRGcmFtZU1pblNpemU7CisKKyAgICAvKiBVbnVzZWQgc3BhY2UuICovCisgICAgTE1fVUlOVDggVW51c2VkMVsweDI0NDAtMHgyNDBjXTsKKworICAgIC8qIFJlY2VpdmUgUkNCcy4gKi8KKyAgICBUM19SQ0IgSnVtYm9SY3ZSY2I7CisgICAgVDNfUkNCIFN0ZFJjdlJjYjsKKyAgICBUM19SQ0IgTWluaVJjdlJjYjsKKworICAgIC8qIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBSaW5nIEluaXRpYXRvciBMb2NhbCBOSUMgUmVjZWl2ZSAqLworICAgIC8qIEJEIENvbnN1bWJlciBJbmRleC4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNKdW1ib0NvbklkeDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNTdGRDb25JZHg7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTmljTWluaUNvbklkeDsKKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWQyWzRdOworCisgICAgLyogUmVjZWl2ZSBEYXRhIGFuZCBSZWNlaXZlIEJEIEluaXRpYXRvciBMb2NhbCBSZWNlaXZlIFJldHVybiBQcm9kSWR4LiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFCZFByb2RJZHhbMTZdOworCisgICAgLyogUmVjZWl2ZSBEYXRhIGFuZCBSZWNlaXZlIEJEIEluaXRpYXRvciBIYXJkd2FyZSBEaWFnbm9zdGljLiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIEh3RGlhZzsKKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWQzWzgyOF07Cit9IFQzX1JDVl9EQVRBX0JEX0lOSVRJQVRPUiwgKlBUM19SQ1ZfREFUQV9CRF9JTklUSUFUT1I7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmVjZWl2ZSBEYXRhIENvbXBsZXRpb24gQ29udHJvbCBSZWdpc3Rlcy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworICAgICNkZWZpbmUgUkNWX0RBVEFfQ09NUF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyAgICAjZGVmaW5lIFJDVl9EQVRBX0NPTVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisgICAgI2RlZmluZSBSQ1ZfREFUQV9DT01QX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICBCSVRfMgorCisgICAgLyogVW51c2VkIHNwYWNlZC4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWRbMTAyMF07Cit9IFQzX1JDVl9EQVRBX0NPTVBMRVRJT04sICpQVDNfUkNWX0RBVEFfQ09NUExFVElPTjsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisgICAgI2RlZmluZSBSQ1ZfQkRfSU5fTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgUkNWX0JEX0lOX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyAgICAjZGVmaW5lIFJDVl9CRF9JTl9NT0RFX0JEX0lOX0RJQUJMRURfUkNCX0FUVE5fRU5BQkxFICAgIEJJVF8yCisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisgICAgI2RlZmluZSBSQ1ZfQkRfSU5fU1RBVFVTX0JEX0lOX0RJQUJMRURfUkNCX0FUVE4gICAgICAgICBCSVRfMgorCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTmljSnVtYm9SY3ZQcm9kSWR4OworICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY1N0ZFJjdlByb2RJZHg7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTmljTWluaVJjdlByb2RJZHg7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNaW5pUmN2VGhyZXNob2xkOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0ZFJjdlRocmVzaG9sZDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBKdW1ib1JjdlRocmVzaG9sZDsKKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWRbOTkyXTsKK30gVDNfUkNWX0JEX0lOSVRJQVRPUiwgKlBUM19SQ1ZfQkRfSU5JVElBVE9SOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJlY2VpdmUgQkQgQ29tcGxldGlvbiBDb250cm9sIFJlZ2lzdGVycy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworICAgICNkZWZpbmUgUkNWX0JEX0NPTVBfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyAgICAjZGVmaW5lIFJDVl9CRF9DT01QX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisgICAgI2RlZmluZSBSQ1ZfQkRfQ09NUF9NT0RFX0FUVE5fRU5BQkxFICAgICAgICAgICAgICAgICAgICBCSVRfMgorCisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworICAgICNkZWZpbmUgUkNWX0JEX0NPTVBfU1RBVFVTX0VSUk9SX0FUVE4gICAgICAgICAgICAgICAgICAgQklUXzIKKworICAgIFQzXzMyQklUX1JFR0lTVEVSICBOaWNKdW1ib1JjdkJkUHJvZElkeDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiAgTmljU3RkUmN2QmRQcm9kSWR4OworICAgIFQzXzMyQklUX1JFR0lTVEVSICBOaWNNaW5pUmN2QmRQcm9kSWR4OworCisgICAgLyogVW51c2VkIHNwYWNlLiAqLworICAgIExNX1VJTlQ4IFVudXNlZFsxMDA0XTsKK30gVDNfUkNWX0JEX0NPTVBMRVRJT04sICpQVDNfUkNWX0JEX0NPTVBMRVRJT047CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmVjZWl2ZSBsaXN0IHNlbGVjdG9yIGNvbnRyb2wgcmVnaXN0ZXIuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyAgICAjZGVmaW5lIFJDVl9MSVNUX1NFTF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisgICAgI2RlZmluZSBSQ1ZfTElTVF9TRUxfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorICAgICNkZWZpbmUgUkNWX0xJU1RfU0VMX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgQklUXzIKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyAgICAjZGVmaW5lIFJDVl9MSVNUX1NFTF9TVEFUVVNfRVJST1JfQVRUTiAgICAgICAgICAgICAgICAgIEJJVF8yCisKKyAgICAvKiBVbnVzZWQgc3BhY2UuICovCisgICAgTE1fVUlOVDggVW51c2VkWzEwMTZdOworfSBUM19SQ1ZfTElTVF9TRUxFQ1RPUiwgKlBUM19SQ1ZfTElTVF9TRUxFQ1RPUjsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNYnVmIGNsdXN0ZXIgZnJlZSByZWdpc3RlcnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgTUJVRl9DTFVTVEVSX0ZSRUVfTU9ERV9SRVNFVCAgICBCSVRfMAorI2RlZmluZSBNQlVGX0NMVVNURVJfRlJFRV9NT0RFX0VOQUJMRSAgIEJJVF8xCisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisKKyAgICAvKiBVbnVzZWQgc3BhY2UuICovCisgICAgTE1fVUlOVDggVW51c2VkWzEwMTZdOworfSBUM19NQlVGX0NMVVNURVJfRlJFRSwgKlBUM19NQlVGX0NMVVNURVJfRlJFRTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBIb3N0IGNvYWxlc2NpbmcgY29udHJvbCByZWdpc3RlcnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogTW9kZS4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9BVFROICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMgorICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9OT1cgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMworICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9GVUxMX1NUQVRVU19NT0RFICAgICAgICAgICAgICBCSVRfTk9ORQorICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV82NF9CWVRFX1NUQVRVU19NT0RFICAgICAgICAgICBCSVRfNworICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV8zMl9CWVRFX1NUQVRVU19NT0RFICAgICAgICAgICBCSVRfOAorICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9DTEVBUl9USUNLU19PTl9SWF9CRF9FVkVOVCAgICBCSVRfOQorICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9DTEVBUl9USUNLU19PTl9UWF9CRF9FVkVOVCAgICBCSVRfMTAKKyAgICAjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfTk9fSU5UX09OX0NPQUxFU0NFX05PV19NT0RFICAgQklUXzExCisgICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFX05PX0lOVF9PTl9GT1JDRV9ETUFEX01PREUgICAgIEJJVF8xMgorCisgICAgLyogU3RhdHVzLiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyAgICAjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfRVJST1JfQVRUTiAgICAgICAgICAgICAgICAgICAgQklUXzIKKworICAgIC8qIFJlY2VpdmUgY29hbGVzY2luZyB0aWNrcy4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBSeENvYWxlc2NpbmdUaWNrczsKKworICAgIC8qIFNlbmQgY29hbGVzY2luZyB0aWNrcy4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBUeENvYWxlc2NpbmdUaWNrczsKKworICAgIC8qIFJlY2VpdmUgbWF4IGNvYWxlc2NlZCBmcmFtZXMuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgUnhNYXhDb2FsZXNjZWRGcmFtZXM7CisKKyAgICAvKiBTZW5kIG1heCBjb2FsZXNjZWQgZnJhbWVzLiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4TWF4Q29hbGVzY2VkRnJhbWVzOworCisgICAgLyogUmVjZWl2ZSBjb2FsZXNjaW5nIHRpY2tzIGR1cmluZyBpbnRlcnJ1cHQuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgUnhDb2FsZXNjZWRUaWNrRHVyaW5nSW50OworCisgICAgLyogU2VuZCBjb2FsZXNjaW5nIHRpY2tzIGR1cmluZyBpbnRlcnJ1cHQuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgVHhDb2FsZXNjZWRUaWNrRHVyaW5nSW50OworCisgICAgLyogUmVjZWl2ZSBtYXggY29hbGVzY2VkIGZyYW1lcyBkdXJpbmcgaW50ZXJydXB0LiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50OworCisgICAgLyogU2VuZCBtYXggY29hbGVzY2VkIGZyYW1lcyBkdXJpbmcgaW50ZXJydXB0LiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50OworCisgICAgLyogU3RhdGlzdGljcyB0aWNrLiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXRzQ29hbGVzY2luZ1RpY2tzOworCisgICAgLyogVW51c2VkIHNwYWNlLiAqLworICAgIExNX1VJTlQ4IFVudXNlZDJbNF07CisKKyAgICAvKiBTdGF0aXN0aWNzIGhvc3QgYWRkcmVzcy4gKi8KKyAgICBUM182NEJJVF9SRUdJU1RFUiBTdGF0c0Jsa0hvc3RBZGRyOworCisgICAgLyogU3RhdHVzIGJsb2NrIGhvc3QgYWRkcmVzcy4qLworICAgIFQzXzY0QklUX1JFR0lTVEVSIFN0YXR1c0Jsa0hvc3RBZGRyOworCisgICAgLyogU3RhdGlzdGljcyBOSUMgYWRkcmVzcy4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0Jsa05pY0FkZHI7CisKKyAgICAvKiBTdGF0dXN0IGJsb2NrIE5JQyBhZGRyZXNzLiAqLworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1c0Jsa05pY0FkZHI7CisKKyAgICAvKiBGbG93IGF0dGVudGlvbiByZWdpc3RlcnMuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgRmxvd0F0dG47CisKKyAgICAvKiBVbnVzZWQgc3BhY2UuICovCisgICAgTE1fVUlOVDggVW51c2VkM1s0XTsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY0p1bWJvUmN2QmRDb25JZHg7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTmljU3RkUmN2QmRDb25JZHg7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTmljTWluaVJjdkJkQ29uSWR4OworCisgICAgLyogVW51c2VkIHNwYWNlLiAqLworICAgIExNX1VJTlQ4IFVudXNlZDRbMzZdOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTmljUmV0UHJvZElkeFsxNl07CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTmljU25kQmRDb25JZHhbMTZdOworCisgICAgLyogVW51c2VkIHNwYWNlLiAqLworICAgIExNX1VJTlQ4IFVudXNlZDVbNzY4XTsKK30gVDNfSE9TVF9DT0FMRVNDSU5HLCAqUFQzX0hPU1RfQ09BTEVTQ0lORzsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNZW1vcnkgYXJiaXRlciByZWdpc3RlcnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgVDNfTUVNX0FSQklURVJfTU9ERV9SRVNFVCAgICAgICBCSVRfMAorI2RlZmluZSBUM19NRU1fQVJCSVRFUl9NT0RFX0VOQUJMRSAgICAgIEJJVF8xCisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBBcmJUcmFwQWRkckxvdzsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBBcmJUcmFwQWRkckhpZ2g7CisKKyAgICAvKiBVbnVzZWQgc3BhY2UuICovCisgICAgTE1fVUlOVDggVW51c2VkWzEwMDhdOworfSBUM19NRU1fQVJCSVRFUiwgKlBUM19NRU1fQVJCSVRFUjsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCdWZmZXIgbWFuYWdlciBjb250cm9sIHJlZ2lzdGVyLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisgICAgI2RlZmluZSBCVUZNR1JfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisgICAgI2RlZmluZSBCVUZNR1JfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisgICAgI2RlZmluZSBCVUZNR1JfTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIEJJVF8yCisgICAgI2RlZmluZSBCVUZNR1JfTU9ERV9CTV9URVNUICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8zCisgICAgI2RlZmluZSBCVUZNR1JfTU9ERV9NQlVGX0xPV19BVFROX0VOQUJMRSAgICAgICAgICAgIEJJVF80CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisgICAgI2RlZmluZSBCVUZNR1JfU1RBVFVTX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCisgICAgI2RlZmluZSBCVUZNR1JfU1RBVFVTX01CVUZfTE9XICAgICAgICAgICAgICAgICAgICAgIEJJVF80CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNYnVmUG9vbEFkZHI7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZlBvb2xTaXplOworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZSZWFkRG1hTG93V2F0ZXJNYXJrOworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZNYWNSeExvd1dhdGVyTWFyazsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNYnVmSGlnaFdhdGVyTWFyazsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4Q3B1TWJ1ZkFsbG9jUmVxOworICAgICNkZWZpbmUgQlVGTUdSX01CVUZfQUxMT0NfQklUICAgICAgICAgICAgICAgICAgICAgQklUXzMxCisgICAgVDNfMzJCSVRfUkVHSVNURVIgUnhDcHVNYnVmQWxsb2NSZXNwOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1TWJ1ZkFsbG9jUmVxOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1TWJ1ZkFsbG9jUmVzcDsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYURlc2NQb29sQWRkcjsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFEZXNjUG9vbFNpemU7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTG93V2F0ZXJNYXJrOworICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hXYXRlck1hcms7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBSeENwdURtYUFsbG9jUmVxOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4Q3B1RG1hQWxsb2NSZXNwOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1RG1hQWxsb2NSZXE7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgVHhDcHVEbWFBbGxvY1Jlc3A7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBId2RpYWdbM107CisKKyAgICAvKiBVbnVzZWQgc3BhY2UuICovCisgICAgTE1fVUlOVDggVW51c2VkWzkzNl07Cit9IFQzX0JVRkZFUl9NQU5BR0VSLCAqUFQzX0JVRkZFUl9NQU5BR0VSOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJlYWQgRE1BIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisgICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisgICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisgICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX1RBUkdFVF9BQk9SVF9BVFROX0VOQUJMRSAgICAgIEJJVF8yCisgICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX01BU1RFUl9BQk9SVF9BVFROX0VOQUJMRSAgICAgIEJJVF8zCisgICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX1BBUklUWV9FUlJPUl9BVFROX0VOQUJMRSAgICAgIEJJVF80CisgICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0FERFJfT1ZFUkZMT1dfQVRUTl9FTkFCTEUgICAgIEJJVF81CisgICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0ZJRk9fT1ZFUlJVTl9BVFROX0VOQUJMRSAgICAgIEJJVF82CisgICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0ZJRk9fVU5ERVJSVU5fQVRUTl9FTkFCTEUgICAgIEJJVF83CisgICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0ZJRk9fT1ZFUlJFQURfQVRUTl9FTkFCTEUgICAgIEJJVF84CisgICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX0xPTkdfUkVBRF9BVFROX0VOQUJMRSAgICAgICAgIEJJVF85CisgICAgI2RlZmluZSBETUFfUkVBRF9NT0RFX1NQTElUX0VOQUJMRSAgICAgICAgICAgICAgICAgIEJJVF8xMQorICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9TUExJVF9SRVNFVCAgICAgICAgICAgICAgICAgICBCSVRfMTIKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyAgICAjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19UQVJHRVRfQUJPUlRfQVRUTiAgICAgICAgICAgQklUXzIKKyAgICAjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19NQVNURVJfQUJPUlRfQVRUTiAgICAgICAgICAgQklUXzMKKyAgICAjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19QQVJJVFlfRVJST1JfQVRUTiAgICAgICAgICAgQklUXzQKKyAgICAjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19BRERSX09WRVJGTE9XX0FUVE4gICAgICAgICAgQklUXzUKKyAgICAjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19GSUZPX09WRVJSVU5fQVRUTiAgICAgICAgICAgQklUXzYKKyAgICAjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19GSUZPX1VOREVSUlVOX0FUVE4gICAgICAgICAgQklUXzcKKyAgICAjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19GSUZPX09WRVJSRUFEX0FUVE4gICAgICAgICAgQklUXzgKKyAgICAjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19MT05HX1JFQURfQVRUTiAgICAgICAgICAgICAgQklUXzkKKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWRbMTAxNl07Cit9IFQzX0RNQV9SRUFELCAqUFQzX0RNQV9SRUFEOworCit0eXBlZGVmIHVuaW9uIFQzX0NQVQoreworICBzdHJ1Y3QKKyAgeworICAgIFQzXzMyQklUX1JFR0lTVEVSIG1vZGU7CisgICAgI2RlZmluZSBDUFVfTU9ERV9IQUxUICAgQklUXzEwCisgICAgI2RlZmluZSBDUFVfTU9ERV9SRVNFVCAgQklUXzAKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBzdGF0ZTsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBFdmVudE1hc2s7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgcmVzZXJ2ZWQxWzRdOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFBDOworICAgIFQzXzMyQklUX1JFR0lTVEVSIEluc3RydWN0aW9uOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFNwYWRVbmRlcmZsb3c7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgV2F0Y2hkb2dDbGVhcjsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBXYXRjaGRvZ1ZlY3RvcjsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBXYXRjaGRvZ1NhdmVkUEM7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgSGFyZHdhcmVCcDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiByZXNlcnZlZDJbM107CisgICAgVDNfMzJCSVRfUkVHSVNURVIgV2F0Y2hkb2dTYXZlZFN0YXRlOworICAgIFQzXzMyQklUX1JFR0lTVEVSIExhc3RCcmNoQWRkcjsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTcGFkVW5kZXJmbG93U2V0OworICAgIFQzXzMyQklUX1JFR0lTVEVSIHJlc2VydmVkM1soMHgyMDAtMHg1MCkvNF07CisgICAgVDNfMzJCSVRfUkVHSVNURVIgUmVnc1szMl07CisgICAgVDNfMzJCSVRfUkVHSVNURVIgcmVzZXJ2ZWQ0WygweDQwMC0weDI4MCkvNF07CisgIH1yZWc7Cit9VDNfQ1BVLCAqUFQzX0NQVTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdyaXRlIERNQSBjb250cm9sIHJlZ2lzdGVycy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfVEFSR0VUX0FCT1JUX0FUVE5fRU5BQkxFICAgICBCSVRfMgorICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfTUFTVEVSX0FCT1JUX0FUVE5fRU5BQkxFICAgICBCSVRfMworICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfUEFSSVRZX0VSUk9SX0FUVE5fRU5BQkxFICAgICBCSVRfNAorICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfQUREUl9PVkVSRkxPV19BVFROX0VOQUJMRSAgICBCSVRfNQorICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfRklGT19PVkVSUlVOX0FUVE5fRU5BQkxFICAgICBCSVRfNgorICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfRklGT19VTkRFUlJVTl9BVFROX0VOQUJMRSAgICBCSVRfNworICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfRklGT19PVkVSUkVBRF9BVFROX0VOQUJMRSAgICBCSVRfOAorICAgICNkZWZpbmUgRE1BX1dSSVRFX01PREVfTE9OR19SRUFEX0FUVE5fRU5BQkxFICAgICAgICBCSVRfOQorCisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworICAgICNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19UQVJHRVRfQUJPUlRfQVRUTiAgICAgICAgICBCSVRfMgorICAgICNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19NQVNURVJfQUJPUlRfQVRUTiAgICAgICAgICBCSVRfMworICAgICNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19QQVJJVFlfRVJST1JfQVRUTiAgICAgICAgICBCSVRfNAorICAgICNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19BRERSX09WRVJGTE9XX0FUVE4gICAgICAgICBCSVRfNQorICAgICNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19GSUZPX09WRVJSVU5fQVRUTiAgICAgICAgICBCSVRfNgorICAgICNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19GSUZPX1VOREVSUlVOX0FUVE4gICAgICAgICBCSVRfNworICAgICNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19GSUZPX09WRVJSRUFEX0FUVE4gICAgICAgICBCSVRfOAorICAgICNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19MT05HX1JFQURfQVRUTiAgICAgICAgICAgICBCSVRfOQorCisgICAgLyogVW51c2VkIHNwYWNlLiAqLworICAgIExNX1VJTlQ4IFVudXNlZFsxMDE2XTsKK30gVDNfRE1BX1dSSVRFLCAqUFQzX0RNQV9XUklURTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNYWlsYm94IHJlZ2lzdGVycy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBJbnRlcnJ1cHQgbWFpbGJveCByZWdpc3RlcnMuICovCisgICAgVDNfNjRCSVRfUkVHSVNURVIgSW50ZXJydXB0WzRdOworCisgICAgLyogR2VuZXJhbCBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKyAgICBUM182NEJJVF9SRUdJU1RFUiBHZW5lcmFsWzhdOworCisgICAgLyogUmVsb2FkIHN0YXRpc3RpY3MgbWFpbGJveC4gKi8KKyAgICBUM182NEJJVF9SRUdJU1RFUiBSZWxvYWRTdGF0OworCisgICAgLyogUmVjZWl2ZSBCRCByaW5nIHByb2R1Y2VyIGluZGV4IHJlZ2lzdGVycy4gKi8KKyAgICBUM182NEJJVF9SRUdJU1RFUiBSY3ZTdGRQcm9kSWR4OworICAgIFQzXzY0QklUX1JFR0lTVEVSIFJjdkp1bWJvUHJvZElkeDsKKyAgICBUM182NEJJVF9SRUdJU1RFUiBSY3ZNaW5pUHJvZElkeDsKKworICAgIC8qIFJlY2VpdmUgcmV0dXJuIHJpbmcgY29uc3VtZXIgaW5kZXggcmVnaXN0ZXJzLiAqLworICAgIFQzXzY0QklUX1JFR0lTVEVSIFJjdlJldENvbklkeFsxNl07CisKKyAgICAvKiBTZW5kIEJEIHJpbmcgaG9zdCBwcm9kdWNlciBpbmRleCByZWdpc3RlcnMuICovCisgICAgVDNfNjRCSVRfUkVHSVNURVIgU2VuZEhvc3RQcm9kSWR4WzE2XTsKKworICAgIC8qIFNlbmQgQkQgcmluZyBuaWMgcHJvZHVjZXIgaW5kZXggcmVnaXN0ZXJzLiAqLworICAgIFQzXzY0QklUX1JFR0lTVEVSIFNlbmROaWNQcm9kSWR4WzE2XTsKK31UM19NQUlMQk9YLCAqUFQzX01BSUxCT1g7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUM19NQUlMQk9YIE1haWxib3g7CisKKyAgICAvKiBQcmlvcml0eSBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBIaWdoUHJpb3JpdHlFdmVudFZlY3RvcjsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBIaWdoUHJpb3JpdHlFdmVudE1hc2s7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTG93UHJpb3JpdHlFdmVudFZlY3RvcjsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBMb3dQcmlvcml0eUV2ZW50TWFzazsKKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWRbNDk2XTsKK30gVDNfR1JDX01BSUxCT1gsICpQVDNfR1JDX01BSUxCT1g7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZsb3cgdGhyb3VnaCBxdWV1ZXMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgUmVzZXQ7CisKKyAgICBMTV9VSU5UOCBVbnVzZWRbMTJdOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsUmVhZEZ0cUN0cmw7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsUmVhZEZ0cUZ1bGxDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsUmVhZEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxSZWFkRnRxRmlmb1dyaXRlUGVlazsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hSZWFkRnRxQ3RybDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoUmVhZEZ0cUZ1bGxDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFJlYWRGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFJlYWRGdHFGaWZvV3JpdGVQZWVrOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hQ29tcERpc2NhcmRGdHFDdHJsOworICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUNvbXBEaXNjYXJkRnRxRnVsbENudDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFDb21wRGlzY2FyZEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFDb21wRGlzY2FyZEZ0cUZpZm9Xcml0ZVBlZWs7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kQmRDb21wRnRxQ3RybDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kQmRDb21wRnRxRnVsbENudDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kQmRDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmRCZENvbXBGdHFGaWZvV3JpdGVQZWVrOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFJbml0aWF0b3JGdHFDdHJsOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhSW5pdGlhdG9yRnRxRnVsbENudDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUluaXRpYXRvckZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUluaXRpYXRvckZ0cUZpZm9Xcml0ZVBlZWs7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxXcml0ZUZ0cUN0cmw7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsV3JpdGVGdHFGdWxsQ250OworICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYU5vcm1hbFdyaXRlRnRxRmlmb0VucXVldWVEZXF1ZXVlOworICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYU5vcm1hbFdyaXRlRnRxRmlmb1dyaXRlUGVlazsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hXcml0ZUZ0cUN0cmw7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFdyaXRlRnRxRnVsbENudDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoV3JpdGVGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFdyaXRlRnRxRmlmb1dyaXRlUGVlazsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTFGdHFDdHJsOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTFGdHFGdWxsQ250OworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTFGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMUZ0cUZpZm9Xcml0ZVBlZWs7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUNvbXBGdHFDdHJsOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhQ29tcEZ0cUZ1bGxDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhQ29tcEZ0cUZpZm9Xcml0ZVBlZWs7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBIb3N0Q29hbGVzY2VGdHFDdHJsOworICAgIFQzXzMyQklUX1JFR0lTVEVSIEhvc3RDb2FsZXNjZUZ0cUZ1bGxDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgSG9zdENvYWxlc2NlRnRxRmlmb0VucXVldWVEZXF1ZXVlOworICAgIFQzXzMyQklUX1JFR0lTVEVSIEhvc3RDb2FsZXNjZUZ0cUZpZm9Xcml0ZVBlZWs7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNYWNUeEZ0cUN0cmw7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTWFjVHhGdHFGdWxsQ250OworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1hY1R4RnRxRmlmb0VucXVldWVEZXF1ZXVlOworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1hY1R4RnRxRmlmb1dyaXRlUGVlazsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZDbHVzdEZyZWVGdHFDdHJsOworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZDbHVzdEZyZWVGdHFGdWxsQ250OworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZDbHVzdEZyZWVGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZkNsdXN0RnJlZUZ0cUZpZm9Xcml0ZVBlZWs7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZCZENvbXBGdHFDdHJsOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkJkQ29tcEZ0cUZ1bGxDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2QmRDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkJkQ29tcEZ0cUZpZm9Xcml0ZVBlZWs7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZMaXN0UGxtdEZ0cUN0cmw7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2TGlzdFBsbXRGdHFGdWxsQ250OworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkxpc3RQbG10RnRxRmlmb0VucXVldWVEZXF1ZXVlOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkxpc3RQbG10RnRxRmlmb1dyaXRlUGVlazsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFCZEluaXRpYXRvckZ0cUN0cmw7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUJkSW5pdGlhdG9yRnRxRnVsbENudDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQmRJbml0aWF0b3JGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUJkSW5pdGlhdG9yRnRxRmlmb1dyaXRlUGVlazsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFDb21wRnRxQ3RybDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQ29tcEZ0cUZ1bGxDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUNvbXBGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUNvbXBGdHFGaWZvV3JpdGVQZWVrOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMkZ0cUN0cmw7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMkZ0cUZ1bGxDbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMkZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTd1R5cGUyRnRxRmlmb1dyaXRlUGVlazsKKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWQyWzczNl07Cit9IFQzX0ZUUSwgKlBUM19GVFE7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVzc2FnZSBzaWduYWxlZCBpbnRlcnJ1cHQgcmVnaXN0ZXJzLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIE1TSV9NT0RFX1JFU0VUICAgICAgIEJJVF8wCisjZGVmaW5lIE1TSV9NT0RFX0VOQUJMRSAgICAgIEJJVF8xCisgICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTXNpRmlmb0FjY2VzczsKKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWRbMTAxMl07Cit9IFQzX01TR19TSUdOQUxFRF9JTlQsICpQVDNfTVNHX1NJR05BTEVEX0lOVDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBETUEgQ29tcGxldGlvbiByZWdpc3Rlcy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworICAgICNkZWZpbmUgRE1BX0NPTVBfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgRE1BX0NPTVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorCisgICAgLyogVW51c2VkIHNwYWNlLiAqLworICAgIExNX1VJTlQ4IFVudXNlZFsxMDIwXTsKK30gVDNfRE1BX0NPTVBMRVRJT04sICpQVDNfRE1BX0NPTVBMRVRJT047CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR1JDIHJlZ2lzdGVycy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBNb2RlIGNvbnRyb2wgcmVnaXN0ZXIuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyAgICAjZGVmaW5lIEdSQ19NT0RFX1VQREFURV9PTl9DT0FMRVNDSU5HICAgICAgICAgICAgICAgQklUXzAKKyAgICAjZGVmaW5lIEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSAgICAgICAgICAgQklUXzEKKyAgICAjZGVmaW5lIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSAgICAgICAgICAgQklUXzIKKyAgICAjZGVmaW5lIEdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBICAgICAgICAgICAgICAgICAgICAgQklUXzQKKyAgICAjZGVmaW5lIEdSQ19NT0RFX1dPUkRfU1dBUF9EQVRBICAgICAgICAgICAgICAgICAgICAgQklUXzUKKyAgICAjZGVmaW5lIEdSQ19NT0RFX1NQTElUX0hFQURFUl9NT0RFICAgICAgICAgICAgICAgICAgQklUXzgKKyAgICAjZGVmaW5lIEdSQ19NT0RFX05PX0ZSQU1FX0NSQUNLSU5HICAgICAgICAgICAgICAgICAgQklUXzkKKyAgICAjZGVmaW5lIEdSQ19NT0RFX0lOQ0xVREVfQ1JDICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEwCisgICAgI2RlZmluZSBHUkNfTU9ERV9BTExPV19CQURfRlJBTUVTICAgICAgICAgICAgICAgICAgIEJJVF8xMQorICAgICNkZWZpbmUgR1JDX01PREVfTk9fSU5URVJSVVBUX09OX1NFTkRTICAgICAgICAgICAgICBCSVRfMTMKKyAgICAjZGVmaW5lIEdSQ19NT0RFX05PX0lOVEVSUlVQVF9PTl9SRUNFSVZFICAgICAgICAgICAgQklUXzE0CisgICAgI2RlZmluZSBHUkNfTU9ERV9GT1JDRV8zMkJJVF9QQ0lfQlVTX01PREUgICAgICAgICAgIEJJVF8xNQorICAgICNkZWZpbmUgR1JDX01PREVfSE9TVF9TVEFDS19VUCAgICAgICAgICAgICAgICAgICAgICBCSVRfMTYKKyAgICAjZGVmaW5lIEdSQ19NT0RFX0hPU1RfU0VORF9CRFMgICAgICAgICAgICAgICAgICAgICAgQklUXzE3CisgICAgI2RlZmluZSBHUkNfTU9ERV9UWF9OT19QU0VVRE9fSEVBREVSX0NIS1NVTSAgICAgICAgIEJJVF8yMAorICAgICNkZWZpbmUgR1JDX01PREVfUlhfTk9fUFNFVURPX0hFQURFUl9DSEtTVU0gICAgICAgICBCSVRfMjMKKyAgICAjZGVmaW5lIEdSQ19NT0RFX0lOVF9PTl9UWF9DUFVfQVRUTiAgICAgICAgICAgICAgICAgQklUXzI0CisgICAgI2RlZmluZSBHUkNfTU9ERV9JTlRfT05fUlhfQ1BVX0FUVE4gICAgICAgICAgICAgICAgIEJJVF8yNQorICAgICNkZWZpbmUgR1JDX01PREVfSU5UX09OX01BQ19BVFROICAgICAgICAgICAgICAgICAgICBCSVRfMjYKKyAgICAjZGVmaW5lIEdSQ19NT0RFX0lOVF9PTl9ETUFfQVRUTiAgICAgICAgICAgICAgICAgICAgQklUXzI3CisgICAgI2RlZmluZSBHUkNfTU9ERV9JTlRfT05fRkxPV19BVFROICAgICAgICAgICAgICAgICAgIEJJVF8yOAorICAgICNkZWZpbmUgR1JDX01PREVfNFhfTklDX0JBU0VEX1NFTkRfUklOR1MgICAgICAgICAgICBCSVRfMjkKKyAgICAjZGVmaW5lIEdSQ19NT0RFX01VTFRJQ0FTVF9GUkFNRV9FTkFCTEUgICAgICAgICAgICAgQklUXzMwCisKKyAgICAvKiBNaXNjIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuICovCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTWlzY0NmZzsKKyAgICAjZGVmaW5lIEdSQ19NSVNDX0NGR19DT1JFX0NMT0NLX1JFU0VUICAgICAgICAgICAgICAgQklUXzAKKyAgICAjZGVmaW5lIEdSQ19NSVNDX1BSRVNDQUxBUl9USU1FUl9NQVNLICAgICAgICAgICAgICAgMHhmZQorICAgICNkZWZpbmUgR1JDX01JU0NfQkRfSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDFlMDAwCisgICAgI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzAwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMWUwMDAKKyAgICAjZGVmaW5lIEdSQ19NSVNDX0JEX0lEXzU3MDEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorICAgICNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisgICAgI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzAzUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyAgICAjZGVmaW5lIEdSQ19NSVNDX0JEX0lEXzU3MDJGRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorICAgICNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisgICAgI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzA0Q0lPQkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKworICAgIC8qIE1pc2NlbGxhbmVvdXMgbG9jYWwgY29udHJvbCByZWdpc3Rlci4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBMb2NhbEN0cmw7CisgICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0lOVF9BQ1RJVkUgICAgICAgICAgICAgIEJJVF8wCisgICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0NMRUFSX0lOVCAgICAgICAgICAgICAgIEJJVF8xCisgICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX1NFVF9JTlQgICAgICAgICAgICAgICAgIEJJVF8yCisgICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0lOVF9PTl9BVFROICAgICAgICAgICAgIEJJVF8zCisgICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fSU5QVVQwICAgICAgICAgICAgIEJJVF84CisgICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fSU5QVVQxICAgICAgICAgICAgIEJJVF85CisgICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fSU5QVVQyICAgICAgICAgICAgIEJJVF8xMAorICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMCAgICAgICAgICAgICAgICBCSVRfMTEKKyAgICAjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEgICAgICAgICAgICAgICAgQklUXzEyCisgICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UyICAgICAgICAgICAgICAgIEJJVF8xMworICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDAgICAgICAgICAgICBCSVRfMTQKKyAgICAjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxICAgICAgICAgICAgQklUXzE1CisgICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMiAgICAgICAgICAgIEJJVF8xNgorICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9FTkFCTEVfRVhUX01FTU9SWSAgICAgICBCSVRfMTcKKyAgICAjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfQkFOS19TRUxFQ1QgICAgICAgICAgICAgQklUXzIxCisgICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX1NTUkFNX1RZUEUgICAgICAgICAgICAgIEJJVF8yMgorCisgICAgI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzI1NksgICAgIDAKKyAgICAjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfNTEySyAgICAgKDEgPDwgMTgpCisgICAgI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzEwMjRLICAgICgyIDw8IDE4KQorICAgICNkZWZpbmUgR1JDX01JU0NfTUVNU0laRV8yMDQ4SyAgICAoMyA8PCAxOCkKKyAgICAjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfNDA5NksgICAgKDQgPDwgMTgpCisgICAgI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzgxOTJLICAgICg1IDw8IDE4KQorICAgICNkZWZpbmUgR1JDX01JU0NfTUVNU0laRV8xNk0gICAgICAoNiA8PCAxOCkKKyAgICAjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfQVVUT19TRUVQUk9NICAgICAgICAgICAgQklUXzI0CisKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFRpbWVyOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgUnhDcHVFdmVudDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBSeFRpbWVyUmVmOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4Q3B1U2VtYXBob3JlOworICAgIFQzXzMyQklUX1JFR0lTVEVSIFJlbW90ZVJ4Q3B1QXR0bjsKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1RXZlbnQ7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgVHhUaW1lclJlZjsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBUeENwdVNlbWFwaG9yZTsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBSZW1vdGVUeENwdUF0dG47CisKKyAgICBUM182NEJJVF9SRUdJU1RFUiBNZW1vcnlQb3dlclVwOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgRWVwcm9tQWRkcjsKKyAgICAjZGVmaW5lIFNFRVBST01fQUREUl9XUklURSAgICAgICAwCisgICAgI2RlZmluZSBTRUVQUk9NX0FERFJfUkVBRCAgICAgICAgKDEgPDwgMzEpCisgICAgI2RlZmluZSBTRUVQUk9NX0FERFJfUldfTUFTSyAgICAgMHg4MDAwMDAwMAorICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX0NPTVBMRVRFICAgICgxIDw8IDMwKQorICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX0ZTTV9SRVNFVCAgICgxIDw8IDI5KQorICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX0RFVl9JRCh4KSAgICh4IDw8IDI2KQorICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX0RFVl9JRF9NQVNLIDB4MWMwMDAwMDAKKyAgICAjZGVmaW5lIFNFRVBST01fQUREUl9TVEFSVCAgICAgICAoMSA8PCAyNSkKKyAgICAjZGVmaW5lIFNFRVBST01fQUREUl9DTEtfUEVSRCh4KSAoeCA8PCAxNikKKyAgICAjZGVmaW5lIFNFRVBST01fQUREUl9BRERSRVNTKHgpICAoeCAmIDB4ZmZmYykKKyAgICAjZGVmaW5lIFNFRVBST01fQUREUl9BRERSRVNTX01BU0sgMHgwMDAwZmZmZgorCisgICAgI2RlZmluZSBTRUVQUk9NX0NMT0NLX1BFUklPRCAgICAgICAgNjAKKyAgICAjZGVmaW5lIFNFRVBST01fQ0hJUF9TSVpFICAgICAgICAgICAoNjQgKiAxMDI0KQorCisgICAgVDNfMzJCSVRfUkVHSVNURVIgRWVwcm9tRGF0YTsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBFZXByb21DdHJsOworCisgICAgVDNfMzJCSVRfUkVHSVNURVIgTWRpQ3RybDsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTZXByb21EZWxheTsKKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWRbOTQ4XTsKK30gVDNfR1JDLCAqUFQzX0dSQzsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTlZSQU0gY29udHJvbCByZWdpc3RlcnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFQzXzMyQklUX1JFR0lTVEVSIENtZDsKKyAgICAjZGVmaW5lIE5WUkFNX0NNRF9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyAgICAjZGVmaW5lIE5WUkFNX0NNRF9ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKKyAgICAjZGVmaW5lIE5WUkFNX0NNRF9ET19JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzQKKyAgICAjZGVmaW5lIE5WUkFNX0NNRF9XUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzUKKyAgICAjZGVmaW5lIE5WUkFNX0NNRF9SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUX05PTkUKKyAgICAjZGVmaW5lIE5WUkFNX0NNRF9FUkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzYKKyAgICAjZGVmaW5lIE5WUkFNX0NNRF9GSVJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzcKKyAgICAjZGVmaW5lIE5WUkFNX0NNRF9MQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzgKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBXcml0ZURhdGE7CisKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBBZGRyOworICAgICNkZWZpbmUgTlZSQU1fQUREUkVTU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmZmZgorCisgICAgVDNfMzJCSVRfUkVHSVNURVIgUmVhZERhdGE7CisKKyAgICAvKiBGbGFzaCBjb25maWcgMSByZWdpc3Rlci4gKi8KKyAgICBUM18zMkJJVF9SRUdJU1RFUiBDb25maWcxOworICAgICNkZWZpbmUgRkxBU0hfSU5URVJGQUNFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorICAgICNkZWZpbmUgRkxBU0hfU1NSQU1fQlVGRkVSUkVEX01PREUgICAgICAgICAgICAgICAgICBCSVRfMQorICAgICNkZWZpbmUgRkxBU0hfUEFTU19USFJVX01PREUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMgorICAgICNkZWZpbmUgRkxBU0hfQklUX0JBTkdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMworICAgICNkZWZpbmUgRkxBU0hfQ09NUEFUX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMzEKKworICAgIC8qIEJ1ZmZlcmVkIGZsYXNoIChBdG1lbDogQVQ0NURCMDExQikgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKyAgICAjZGVmaW5lIEJVRkZFUkVEX0ZMQVNIX1BBR0VfUE9TICAgICAgICAgOQorICAgICNkZWZpbmUgQlVGRkVSRURfRkxBU0hfQllURV9BRERSX01BU0sgICAoKDE8PEJVRkZFUkVEX0ZMQVNIX1BBR0VfUE9TKSAtIDEpCisgICAgI2RlZmluZSBCVUZGRVJFRF9GTEFTSF9QQUdFX1NJWkUgICAgICAgIDI2NAorICAgICNkZWZpbmUgQlVGRkVSRURfRkxBU0hfUEhZX1BBR0VfU0laRSAgICA1MTIKKworICAgIFQzXzMyQklUX1JFR0lTVEVSIENvbmZpZzI7CisgICAgVDNfMzJCSVRfUkVHSVNURVIgQ29uZmlnMzsKKyAgICBUM18zMkJJVF9SRUdJU1RFUiBTd0FyYjsKKyAgICAjZGVmaW5lIFNXX0FSQl9SRVFfU0VUMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyAgICAjZGVmaW5lIFNXX0FSQl9SRVFfU0VUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyAgICAjZGVmaW5lIFNXX0FSQl9SRVFfU0VUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyAgICAjZGVmaW5lIFNXX0FSQl9SRVFfU0VUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKKyAgICAjZGVmaW5lIFNXX0FSQl9SRVFfQ0xSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzQKKyAgICAjZGVmaW5lIFNXX0FSQl9SRVFfQ0xSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzUKKyAgICAjZGVmaW5lIFNXX0FSQl9SRVFfQ0xSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzYKKyAgICAjZGVmaW5lIFNXX0FSQl9SRVFfQ0xSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzcKKyAgICAjZGVmaW5lIFNXX0FSQl9HTlQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzgKKyAgICAjZGVmaW5lIFNXX0FSQl9HTlQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzkKKyAgICAjZGVmaW5lIFNXX0FSQl9HTlQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEwCisgICAgI2RlZmluZSBTV19BUkJfR05UMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMQorICAgICNkZWZpbmUgU1dfQVJCX1JFUTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTIKKyAgICAjZGVmaW5lIFNXX0FSQl9SRVExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEzCisgICAgI2RlZmluZSBTV19BUkJfUkVRMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xNAorICAgICNkZWZpbmUgU1dfQVJCX1JFUTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTUKKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWRbOTg4XTsKK30gVDNfTlZSQU0sICpQVDNfTlZSQU07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5JQydzIGludGVybmFsIG1lbW9yeS4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBQYWdlIHplcm8gZm9yIHRoZSBpbnRlcm5hbCBDUFVzLiAqLworICAgIExNX1VJTlQ4IFBhZ2VaZXJvWzB4MTAwXTsgICAgICAgICAgICAgICAvKiAweDAwMDAgKi8KKworICAgIC8qIFNlbmQgUkNCcy4gKi8KKyAgICBUM19SQ0IgU2VuZFJjYlsxNl07ICAgICAgICAgICAgICAgICAgICAgLyogMHgwMTAwICovCisKKyAgICAvKiBSZWNlaXZlIFJldHVybiBSQ0JzLiAqLworICAgIFQzX1JDQiBSY3ZSZXRSY2JbMTZdOyAgICAgICAgICAgICAgICAgICAvKiAweDAyMDAgKi8KKworICAgIC8qIFN0YXRpc3RpY3MgYmxvY2suICovCisgICAgVDNfU1RBVFNfQkxPQ0sgU3RhdHNCbGs7ICAgICAgICAgICAgICAgIC8qIDB4MDMwMCAqLworCisgICAgLyogU3RhdHVzIGJsb2NrLiAqLworICAgIFQzX1NUQVRVU19CTE9DSyBTdGF0dXNCbGs7ICAgICAgICAgICAgICAvKiAweDBiMDAgKi8KKworICAgIC8qIFJlc2VydmVkIGZvciBzb2Z0d2FyZS4gKi8KKyAgICBMTV9VSU5UOCBSZXNlcnZlZFsxMjAwXTsgICAgICAgICAgICAgICAgLyogMHgwYjUwICovCisKKyAgICAvKiBVbm1hcHBlZCByZWdpb24uICovCisgICAgTE1fVUlOVDggVW5tYXBwZWRbNDA5Nl07ICAgICAgICAgICAgICAgIC8qIDB4MTAwMCAqLworCisgICAgLyogRE1BIGRlc2NyaXB0b3JzLiAqLworICAgIExNX1VJTlQ4IERtYURlc2NbODE5Ml07ICAgICAgICAgICAgICAgICAvKiAweDIwMDAgKi8KKworICAgIC8qIEJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KKyAgICBMTV9VSU5UOCBCdWZmZXJEZXNjWzE2Mzg0XTsgICAgICAgICAgICAgLyogMHg0MDAwICovCit9IFQzX0ZJUlNUXzMyS19TUkFNLCAqUFQzX0ZJUlNUXzMyS19TUkFNOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1lbW9yeSBsYXlvdXQuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLworICAgIFQzX1BDSV9DT05GSUdVUkFUSU9OIFBjaUNmZzsKKworICAgIC8qIFVudXNlZC4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWQxWzB4MTAwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMTAwICovCisKKyAgICAvKiBNYWlsYm94IC4gKi8KKyAgICBUM19NQUlMQk9YIE1haWxib3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMjAwICovCisKKyAgICAvKiBNQUMgY29udHJvbCByZWdpc3RlcnMuICovCisgICAgVDNfTUFDX0NPTlRST0wgTWFjQ3RybDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDQwMCAqLworCisgICAgLyogU2VuZCBkYXRhIGluaXRpYXRvciBjb250cm9sIHJlZ2lzdGVycy4gKi8KKyAgICBUM19TRU5EX0RBVEFfSU5JVElBVE9SIFNuZERhdGFJbjsgICAgICAgICAgICAgICAgICAgLyogMHgwYzAwICovCisKKyAgICAvKiBTZW5kIGRhdGEgY29tcGxldGlvbiBDb250cm9sIHJlZ2lzdGVycy4gKi8KKyAgICBUM19TRU5EX0RBVEFfQ09NUExFVElPTiBTbmREYXRhQ29tcDsgICAgICAgICAgICAgICAgLyogMHgxMDAwICovCisKKyAgICAvKiBTZW5kIEJEIHJpbmcgc2VsZWN0b3IuICovCisgICAgVDNfU0VORF9CRF9TRUxFQ1RPUiBTbmRCZFNlbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTQwMCAqLworCisgICAgLyogU2VuZCBCRCBpbml0aWF0b3IgY29udHJvbCByZWdpc3RlcnMuICovCisgICAgVDNfU0VORF9CRF9JTklUSUFUT1IgU25kQmRJbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTgwMCAqLworCisgICAgLyogU2VuZCBCRCBjb21wbGV0aW9uIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworICAgIFQzX1NFTkRfQkRfQ09NUExFVElPTiBTbmRCZENvbXA7ICAgICAgICAgICAgICAgICAgICAvKiAweDFjMDAgKi8KKworICAgIC8qIFJlY2VpdmUgbGlzdCBwbGFjZW1lbnQgY29udHJvbCByZWdpc3RlcnMuICovCisgICAgVDNfUkNWX0xJU1RfUExBQ0VNRU5UIFJjdkxpc3RQbG10OyAgICAgICAgICAgICAgICAgIC8qIDB4MjAwMCAqLworCisgICAgLyogUmVjZWl2ZSBEYXRhIGFuZCBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sLiAqLworICAgIFQzX1JDVl9EQVRBX0JEX0lOSVRJQVRPUiBSY3ZEYXRhQmRJbjsgICAgICAgICAgICAgICAvKiAweDI0MDAgKi8KKworICAgIC8qIFJlY2VpdmUgRGF0YSBDb21wbGV0aW9uIENvbnRyb2wgKi8KKyAgICBUM19SQ1ZfREFUQV9DT01QTEVUSU9OIFJjdkRhdGFDb21wOyAgICAgICAgICAgICAgICAgLyogMHgyODAwICovCisKKyAgICAvKiBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sIFJlZ2lzdGVycy4gKi8KKyAgICBUM19SQ1ZfQkRfSU5JVElBVE9SIFJjdkJkSW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgyYzAwICovCisKKyAgICAvKiBSZWNlaXZlIEJEIENvbXBsZXRpb24gQ29udHJvbCBSZWdpc3RlcnMuICovCisgICAgVDNfUkNWX0JEX0NPTVBMRVRJT04gUmN2QmRDb21wOyAgICAgICAgICAgICAgICAgICAgIC8qIDB4MzAwMCAqLworCisgICAgLyogUmVjZWl2ZSBsaXN0IHNlbGVjdG9yIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworICAgIFQzX1JDVl9MSVNUX1NFTEVDVE9SIFJjdkxpc3RTZWw7ICAgICAgICAgICAgICAgICAgICAvKiAweDM0MDAgKi8KKworICAgIC8qIE1idWYgY2x1c3RlciBmcmVlIHJlZ2lzdGVycy4gKi8KKyAgICBUM19NQlVGX0NMVVNURVJfRlJFRSBNYnVmQ2x1c3RlckZyZWU7ICAgICAgICAgICAgICAgLyogMHgzODAwICovCisKKyAgICAvKiBIb3N0IGNvYWxlc2NpbmcgY29udHJvbCByZWdpc3RlcnMuICovCisgICAgVDNfSE9TVF9DT0FMRVNDSU5HIEhvc3RDb2FsZXNjZTsgICAgICAgICAgICAgICAgICAgIC8qIDB4M2MwMCAqLworCisgICAgLyogTWVtb3J5IGFyYml0ZXIgY29udHJvbCByZWdpc3RlcnMuICovCisgICAgVDNfTUVNX0FSQklURVIgTWVtQXJiaXRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NDAwMCAqLworCisgICAgLyogQnVmZmVyIG1hbmdlciBjb250cm9sIHJlZ2lzdGVycy4gKi8KKyAgICBUM19CVUZGRVJfTUFOQUdFUiBCdWZNZ3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg0NDAwICovCisKKyAgICAvKiBSZWFkIERNQSBjb250cm9sIHJlZ2lzdGVycy4gKi8KKyAgICBUM19ETUFfUkVBRCBEbWFSZWFkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg0ODAwICovCisKKyAgICAvKiBXcml0ZSBETUEgY29udHJvbCByZWdpc3RlcnMuICovCisgICAgVDNfRE1BX1dSSVRFIERtYVdyaXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NGMwMCAqLworCisgICAgVDNfQ1BVIHJ4Q3B1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NTAwMCAqLworICAgIFQzX0NQVSB0eENwdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDU0MDAgKi8KKworICAgIC8qIE1haWxib3hlcy4gKi8KKyAgICBUM19HUkNfTUFJTEJPWCBHcmNNYWlsYm94OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg1ODAwICovCisKKyAgICAvKiBGbG93IFRocm91Z2ggcXVldWVzLiAqLworICAgIFQzX0ZUUSBGdHE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDVjMDAgKi8KKworICAgIC8qIE1lc3NhZ2Ugc2lnbmFsZWQgaW50ZXJydXB0IHJlZ2lzdGVzLiAqLworICAgIFQzX01TR19TSUdOQUxFRF9JTlQgTXNpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDYwMDAgKi8KKworICAgIC8qIERNQSBjb21wbGV0aW9uIHJlZ2lzdGVycy4gKi8KKyAgICBUM19ETUFfQ09NUExFVElPTiBEbWFDb21wOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg2NDAwICovCisKKyAgICAvKiBHUkMgcmVnaXN0ZXJzLiAqLworICAgIFQzX0dSQyBHcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDY4MDAgKi8KKworICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KKyAgICBMTV9VSU5UOCBVbnVzZWQyWzEwMjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg2YzAwICovCisKKyAgICAvKiBOVlJBTSByZWdpc3RlcnMuICovCisgICAgVDNfTlZSQU0gTnZyYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NzAwMCAqLworCisgICAgLyogVW51c2VkIHNwYWNlLiAqLworICAgIExNX1VJTlQ4IFVudXNlZDNbMzA3Ml07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDc0MDAgKi8KKworICAgIC8qIFRoZSAzMmsgbWVtb3J5IHdpbmRvdyBpbnRvIHRoZSBOSUMncyAqLworICAgIC8qIGludGVybmFsIG1lbW9yeS4gIFRoZSBtZW1vcnkgd2luZG93IGlzICovCisgICAgLyogY29udHJvbGxlZCBieSB0aGUgTWVtb3J5IFdpbmRvdyBCYXNlICovCisgICAgLyogQWRkcmVzcyByZWdpc3Rlci4gIFRoaXMgcmVnaXN0ZXIgaXMgbG9jYXRlZCAqLworICAgIC8qIGluIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZS4gKi8KKyAgICB1bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg4MDAwICovCisgICAgICAgIFQzX0ZJUlNUXzMyS19TUkFNIEZpcnN0MzJrOworCisgICAgICAgIC8qIFVzZSB0aGUgbWVtb3J5IHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgdG8gZGV0ZXJtaW5lIHRoZSAqLworICAgICAgICAvKiBNQlVGIHNlZ21lbnQuICovCisgICAgICAgIExNX1VJTlQzMiBNYnVmWzMyNzY4LzRdOworICAgICAgICBMTV9VSU5UMzIgTWVtQmxvY2szMktbMzI3NjgvNF07CisgICAgfSB1SW50TWVtOworfSBUM19TVERfTUVNX01BUCwgKlBUM19TVERfTUVNX01BUDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQWRhcHRlciBpbmZvLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMTV9VSU5UMTYgU3ZpZDsKKyAgICBMTV9VSU5UMTYgU3NpZDsKKyAgICBMTV9VSU5UMzIgUGh5SWQ7CisgICAgTE1fVUlOVDMyIFNlcmRlczsgICAvKiAwID0gY29wcGVyIFBIWSwgMSA9IFNlcmRlcyAqLworfSBMTV9BREFQVEVSX0lORk8sICpQTE1fQURBUFRFUl9JTkZPOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQYWNrZXQgcXVldWVzLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworREVDTEFSRV9RVUVVRV9UWVBFKExNX1JYX1BBQ0tFVF9RLCBNQVhfUlhfUEFDS0VUX0RFU0NfQ09VTlQpOworREVDTEFSRV9RVUVVRV9UWVBFKExNX1RYX1BBQ0tFVF9RLCBNQVhfVFhfUEFDS0VUX0RFU0NfQ09VTlQpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFR4IGNvdW50ZXJzLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExNX0NPVU5URVIgVHhQYWNrZXRHb29kQ250OworICAgIExNX0NPVU5URVIgVHhCeXRlc0dvb2RDbnQ7CisgICAgTE1fQ09VTlRFUiBUeFBhY2tldEFib3J0ZWRDbnQ7CisgICAgTE1fQ09VTlRFUiBOb1NlbmRCZExlZnRDbnQ7CisgICAgTE1fQ09VTlRFUiBOb01hcFJlZ2lzdGVyTGVmdENudDsKKyAgICBMTV9DT1VOVEVSIFRvb01hbnlGcmFnbWVudHNDbnQ7CisgICAgTE1fQ09VTlRFUiBOb1R4UGFja2V0RGVzY0NudDsKK30gTE1fVFhfQ09VTlRFUlMsICpQTE1fVFhfQ09VTlRFUlM7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUnggY291bnRlcnMuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTE1fQ09VTlRFUiBSeFBhY2tldEdvb2RDbnQ7CisgICAgTE1fQ09VTlRFUiBSeEJ5dGVzR29vZENudDsKKyAgICBMTV9DT1VOVEVSIFJ4UGFja2V0RXJyQ250OworICAgIExNX0NPVU5URVIgUnhFcnJDcmNDbnQ7CisgICAgTE1fQ09VTlRFUiBSeEVyckNvbGxDbnQ7CisgICAgTE1fQ09VTlRFUiBSeEVyckxpbmtMb3N0Q250OworICAgIExNX0NPVU5URVIgUnhFcnJQaHlEZWNvZGVDbnQ7CisgICAgTE1fQ09VTlRFUiBSeEVyck9kZE5pYmJsZUNudDsKKyAgICBMTV9DT1VOVEVSIFJ4RXJyTWFjQWJvcnRDbnQ7CisgICAgTE1fQ09VTlRFUiBSeEVyclNob3J0UGFja2V0Q250OworICAgIExNX0NPVU5URVIgUnhFcnJOb1Jlc291cmNlQ250OworICAgIExNX0NPVU5URVIgUnhFcnJMYXJnZVBhY2tldENudDsKK30gTE1fUlhfQ09VTlRFUlMsICpQTE1fUlhfQ09VTlRFUlM7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmVjZWl2ZSBwcm9kdWNlciByaW5ncy4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgZW51bSB7CisgICAgVDNfVU5LTk9XTl9SQ1ZfUFJPRF9SSU5HICAgID0gMCwKKyAgICBUM19TVERfUkNWX1BST0RfUklORyAgICAgICAgPSAxLAorICAgIFQzX01JTklfUkNWX1BST0RfUklORyAgICAgICA9IDIsCisgICAgVDNfSlVNQk9fUkNWX1BST0RfUklORyAgICAgID0gMworfSBUM19SQ1ZfUFJPRF9SSU5HLCAqUFQzX1JDVl9QUk9EX1JJTkc7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUGFja2V0IGRlc2NyaXB0b3IuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExNX1BBQ0tFVF9TSUdOQVRVUkVfVFggICAgICAgICAgICAgIDB4Njg2MTc2NmIKKyNkZWZpbmUgTE1fUEFDS0VUX1NJR05BVFVSRV9SWCAgICAgICAgICAgICAgMHg2Yjc2NjE2OAorCit0eXBlZGVmIHN0cnVjdCBfTE1fUEFDS0VUIHsKKyAgICAvKiBTZXQgaW4gTE0uICovCisgICAgTE1fU1RBVFVTIFBhY2tldFN0YXR1czsKKworICAgIC8qIFNldCBpbiBMTSBmb3IgUngsIGluIFVNIGZvciBUeC4gKi8KKyAgICBMTV9VSU5UMzIgUGFja2V0U2l6ZTsKKworICAgIExNX1VJTlQxNiBGbGFnczsKKworICAgIExNX1VJTlQxNiBWbGFuVGFnOworCisgICAgdW5pb24geworICAgICAgICAvKiBTZW5kIGluZm8uICovCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAvKiBTZXQgdXAgYnkgVU0uICovCisgICAgICAgICAgICBMTV9VSU5UMzIgRnJhZ0NvdW50OworCisgICAgICAgIH0gVHg7CisKKyAgICAgICAgLyogUmVjZWl2ZSBpbmZvLiAqLworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgLyogVGhpcyBkZXNjcmlwdG9yIGJlbG9uZ3MgdG8gZWl0aGVyIFN0ZCwgTWluaSwgb3IgSnVtYm8gcmluZy4gKi8KKyAgICAgICAgICAgIFQzX1JDVl9QUk9EX1JJTkcgUmN2UHJvZFJpbmc7CisKKyAgICAgICAgICAgIC8qIFJlY2VpdmUgYnVmZmVyIHNpemUgKi8KKyAgICAgICAgICAgIExNX1VJTlQzMiBSeEJ1ZmZlclNpemU7CisKKyAgICAgICAgICAgIC8qIENoZWNrc3VtIGluZm9ybWF0aW9uLiAqLworICAgICAgICAgICAgTE1fVUlOVDE2IElwQ2hlY2tzdW07CisgICAgICAgICAgICBMTV9VSU5UMTYgVGNwVWRwQ2hlY2tzdW07CisKKyAgICAgICAgfSBSeDsKKyAgICB9IHU7Cit9IExNX1BBQ0tFVDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaWdvbjMgZGV2aWNlIGJsb2NrLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0xNX0RFVklDRV9CTE9DSyB7CisgICAgaW50IGluZGV4OyAvKiBEZXZpY2UgSUQgKi8KKyAgICAvKiBNZW1vcnkgdmlldy4gKi8KKyAgICBQVDNfU1REX01FTV9NQVAgcE1lbVZpZXc7CisKKyAgICAvKiBCYXNlIGFkZHJlc3Mgb2YgdGhlIGJsb2NrIG9mIG1lbW9yeSBpbiB3aGljaCB0aGUgTE1fUEFDS0VUIGRlc2NyaXB0b3JzICovCisgICAgLyogYXJlIGFsbG9jYXRlZCBmcm9tLiAqLworICAgIFBMTV9WT0lEIHBQYWNrZXREZXNjQmFzZTsKKworICAgIExNX1VJTlQzMiBNaXNjSG9zdEN0cmw7CisgICAgTE1fVUlOVDMyIEdyY0xvY2FsQ3RybDsKKyAgICBMTV9VSU5UMzIgRG1hUmVhZFdyaXRlQ3RybDsKKyAgICBMTV9VSU5UMzIgUGNpU3RhdGU7CisKKyAgICAvKiBSeCBpbmZvICovCisgICAgTE1fVUlOVDMyIFJ4U3RkRGVzY0NudDsKKyAgICBMTV9VSU5UMzIgUnhTdGRRdWV1ZWRDbnQ7CisgICAgTE1fVUlOVDMyIFJ4U3RkUHJvZElkeDsKKworICAgIFBUM19SQ1ZfQkQgcFJ4U3RkQmRWaXJ0OworICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgUnhTdGRCZFBoeTsKKworICAgIExNX1VJTlQzMiBSeFBhY2tldERlc2NDbnQ7CisgICAgTE1fUlhfUEFDS0VUX1EgUnhQYWNrZXRGcmVlUTsKKyAgICBMTV9SWF9QQUNLRVRfUSBSeFBhY2tldFJlY2VpdmVkUTsKKworICAgIC8qIFJlY2VpdmUgaW5mby4gKi8KKyAgICBQVDNfUkNWX0JEIHBSY3ZSZXRCZFZpcnQ7CisgICAgTE1fUEhZU0lDQUxfQUREUkVTUyBSY3ZSZXRCZFBoeTsKKyAgICBMTV9VSU5UMzIgUmN2UmV0Q29uSWR4OworCisjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAorICAgIExNX1VJTlQzMiBSeEp1bWJvRGVzY0NudDsKKyAgICBMTV9VSU5UMzIgUnhKdW1ib0J1ZmZlclNpemU7CisgICAgTE1fVUlOVDMyIFJ4SnVtYm9RdWV1ZWRDbnQ7CisKKyAgICBMTV9VSU5UMzIgUnhKdW1ib1Byb2RJZHg7CisKKyAgICBQVDNfUkNWX0JEIHBSeEp1bWJvQmRWaXJ0OworICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgUnhKdW1ib0JkUGh5OworI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKworICAgIC8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBieSB0aGUgdXBwZXIgbW9kdWxlIHRvIGluZm9ybSB0aGUgcHJvdG9jb2wgKi8KKyAgICAvKiBvZiB0aGUgbWF4aW11bSB0cmFuc21pdC9yZWNlaXZlIHBhY2tldCBzaXplLiAqLworICAgIExNX1VJTlQzMiBUeE10dTsgICAgLyogRG9lcyBub3QgaW5jbHVkZSBDUkMuICovCisgICAgTE1fVUlOVDMyIFJ4TXR1OyAgICAvKiBEb2VzIG5vdCBpbmNsdWRlIENSQy4gKi8KKworICAgIC8qIFdlIG5lZWQgdG8gc2hhZG93IHRoZSBFTUFDLCBSeCwgVHggbW9kZSByZWdpc3RlcnMuICBXaXRoIEIwIHNpbGljb24sICovCisgICAgLyogd2UgbWF5IGhhdmUgcHJvYmxlbXMgcmVhZGluZyBhbnkgTUFDIHJlZ2lzdGVycyBpbiAxMG1iIG1vZGUuICovCisgICAgTE1fVUlOVDMyIE1hY01vZGU7CisgICAgTE1fVUlOVDMyIFJ4TW9kZTsKKyAgICBMTV9VSU5UMzIgVHhNb2RlOworCisgICAgLyogTWlNb2RlIHJlZ2lzdGVyLiAqLworICAgIExNX1VJTlQzMiBNaU1vZGU7CisKKyAgICAvKiBIb3N0IGNvYWxlc2NlIG1vZGUgcmVnaXN0ZXIuICovCisgICAgTE1fVUlOVDMyIENvYWxlc2NlTW9kZTsKKworICAgIC8qIFNlbmQgaW5mby4gKi8KKyAgICBMTV9VSU5UMzIgVHhQYWNrZXREZXNjQ250OworCisgICAgLyogVHggaW5mby4gKi8KKyAgICBMTV9UWF9QQUNLRVRfUSBUeFBhY2tldEZyZWVROworICAgIExNX1RYX1BBQ0tFVF9RIFR4UGFja2V0QWN0aXZlUTsKKyAgICBMTV9UWF9QQUNLRVRfUSBUeFBhY2tldFhtaXR0ZWRROworCisgICAgLyogUG9pbnRlcnMgdG8gU2VuZEJkLiAqLworICAgIFBUM19TTkRfQkQgcFNlbmRCZFZpcnQ7CisgICAgTE1fUEhZU0lDQUxfQUREUkVTUyBTZW5kQmRQaHk7ICAvKiBPbmx5IHZhbGlkIGZvciBIb3N0IGJhc2VkIFNlbmQgQkQuICovCisKKyAgICAvKiBTZW5kIHByb2R1Y2VyIGFuZCBjb25zdW1lciBpbmRpY2VzLiAqLworICAgIExNX1VJTlQzMiBTZW5kUHJvZElkeDsKKyAgICBMTV9VSU5UMzIgU2VuZENvbklkeDsKKworICAgIC8qIE51bWJlciBvZiBCRCBsZWZ0LiAqLworICAgIGF0b21pY190IFNlbmRCZExlZnQ7CisKKyAgICBUM19TTkRfQkQgU2hhZG93U2VuZEJkW1QzX1NFTkRfUkNCX0VOVFJZX0NPVU5UXTsKKworICAgIC8qIENvdW50ZXJzLiAqLworICAgIExNX1JYX0NPVU5URVJTIFJ4Q291bnRlcnM7CisgICAgTE1fVFhfQ09VTlRFUlMgVHhDb3VudGVyczsKKworICAgIC8qIEhvc3QgY29hbGVzY2luZyBwYXJhbWV0ZXJzLiAqLworICAgIExNX1VJTlQzMiBSeENvYWxlc2NpbmdUaWNrczsKKyAgICBMTV9VSU5UMzIgVHhDb2FsZXNjaW5nVGlja3M7CisgICAgTE1fVUlOVDMyIFJ4TWF4Q29hbGVzY2VkRnJhbWVzOworICAgIExNX1VJTlQzMiBUeE1heENvYWxlc2NlZEZyYW1lczsKKyAgICBMTV9VSU5UMzIgU3RhdHNDb2FsZXNjaW5nVGlja3M7CisgICAgTE1fVUlOVDMyIFJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50OworICAgIExNX1VJTlQzMiBUeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludDsKKyAgICBMTV9VSU5UMzIgUnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQ7CisgICAgTE1fVUlOVDMyIFR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50OworCisgICAgLyogRE1BIHdhdGVyIG1hcmtzLiAqLworICAgIExNX1VJTlQzMiBEbWFNYnVmTG93TWFyazsKKyAgICBMTV9VSU5UMzIgUnhNYWNNYnVmTG93TWFyazsKKyAgICBMTV9VSU5UMzIgTWJ1ZkhpZ2hNYXJrOworCisgICAgLyogU3RhdHVzIGJsb2NrLiAqLworICAgIFBUM19TVEFUVVNfQkxPQ0sgcFN0YXR1c0Jsa1ZpcnQ7CisgICAgTE1fUEhZU0lDQUxfQUREUkVTUyBTdGF0dXNCbGtQaHk7CisKKyAgICAvKiBTdGF0aXN0aWNzIGJsb2NrLiAqLworICAgIFBUM19TVEFUU19CTE9DSyBwU3RhdHNCbGtWaXJ0OworICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgU3RhdHNCbGtQaHk7CisKKyAgICAvKiBDdXJyZW50IHJlY2VpdmUgbWFzay4gKi8KKyAgICBMTV9VSU5UMzIgUmVjZWl2ZU1hc2s7CisKKyAgICAvKiBUYXNrIG9mZmxvYWQgY2FwYWJpbGl0aWVzLiAqLworICAgIExNX1RBU0tfT0ZGTE9BRCBUYXNrT2ZmbG9hZENhcDsKKworICAgIC8qIFRhc2sgb2ZmbG9hZCBzZWxlY3RlZC4gKi8KKyAgICBMTV9UQVNLX09GRkxPQUQgVGFza1RvT2ZmbG9hZDsKKworICAgIC8qIFdha2UgdXAgY2FwYWJpbGl0eS4gKi8KKyAgICBMTV9XQUtFX1VQX01PREUgV2FrZVVwTW9kZUNhcDsKKworICAgIC8qIFdha2UgdXAgY2FwYWJpbGl0eS4gKi8KKyAgICBMTV9XQUtFX1VQX01PREUgV2FrZVVwTW9kZTsKKworICAgIC8qIEZsb3cgY29udHJvbC4gKi8KKyAgICBMTV9GTE9XX0NPTlRST0wgRmxvd0NvbnRyb2xDYXA7CisgICAgTE1fRkxPV19DT05UUk9MIEZsb3dDb250cm9sOworCisgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgUENJIE1XSS4gKi8KKyAgICBMTV9VSU5UMzIgRW5hYmxlTVdJOworCisgICAgLyogRW5hYmxlIDU3MDEgdGFnZ2VkIHN0YXR1cyBtb2RlLiAqLworICAgIExNX1VJTlQzMiBVc2VUYWdnZWRTdGF0dXM7CisKKyAgICAvKiBOSUMgd2lsbCBub3QgY29tcHV0ZSB0aGUgcHNldWRvIGhlYWRlciBjaGVja3N1bS4gIFRoZSBkcml2ZXIgb3IgT1MgKi8KKyAgICAvKiBtdXN0IHNlZWQgdGhlIGNoZWNrc3VtIGZpZWxkIHdpdGggdGhlIHBzZXVkbyBjaGVja3N1bS4gKi8KKyAgICBMTV9VSU5UMzIgTm9UeFBzZXVkb0hkckNoa3N1bTsKKworICAgIC8qIFRoZSByZWNlaXZlIGNoZWNrc3VtIGluIHRoZSBCRCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBwc2V1ZG8gY2hlY2tzdW0uICovCisgICAgLyogVGhlIE9TIG9yIHRoZSBkcml2ZXIgbXVzdCBjYWxjdWxhdGUgdGhlIHBzZXVkbyBjaGVja3N1bSBhbmQgYWRkIGl0IHRvICovCisgICAgLyogdGhlIGNoZWNrc3VtIGluIHRoZSBCRC4gKi8KKyAgICBMTV9VSU5UMzIgTm9SeFBzZXVkb0hkckNoa3N1bTsKKworICAgIC8qIEN1cnJlbnQgbm9kZSBhZGRyZXNzLiAqLworICAgIExNX1VJTlQ4IE5vZGVBZGRyZXNzWzhdOworCisgICAgLyogVGhlIGFkYXB0ZXIncyBub2RlIGFkZHJlc3MuICovCisgICAgTE1fVUlOVDggUGVybWFuZW50Tm9kZUFkZHJlc3NbOF07CisKKyAgICAvKiBBZGFwdGVyIGluZm8uICovCisgICAgTE1fVUlOVDE2IEJ1c051bTsKKyAgICBMTV9VSU5UOCBEZXZOdW07CisgICAgTE1fVUlOVDggRnVuY3ROdW07CisgICAgTE1fVUlOVDE2IFBjaVZlbmRvcklkOworICAgIExNX1VJTlQxNiBQY2lEZXZpY2VJZDsKKyAgICBMTV9VSU5UMzIgQm9uZElkOworICAgIExNX1VJTlQ4IElycTsKKyAgICBMTV9VSU5UOCBJbnRQaW47CisgICAgTE1fVUlOVDggQ2FjaGVMaW5lU2l6ZTsKKyAgICBMTV9VSU5UOCBQY2lSZXZJZDsKKyNpZiBQQ0lYX1RBUkdFVF9XT1JLQVJPVU5ECisJTE1fVUlOVDMyIEVuYWJsZVBjaVhGaXg7CisjZW5kaWYKKyAgICBMTV9VSU5UMzIgVW5kaUZpeDsgICAvKiBuZXcsIGppbW15ICovCisgICAgTE1fVUlOVDMyIFBjaUNvbW1hbmRTdGF0dXNXb3JkczsKKyAgICBMTV9VSU5UMzIgQ2hpcFJldklkOworICAgIExNX1VJTlQxNiBTdWJzeXN0ZW1WZW5kb3JJZDsKKyAgICBMTV9VSU5UMTYgU3Vic3lzdGVtSWQ7CisjaWYgMCAgLyogSmltbXksIGRlbGV0ZWQgaW4gbmV3IGRyaXZlciAqLworICAgIExNX1VJTlQzMiBNZW1CYXNlTG93OworICAgIExNX1VJTlQzMiBNZW1CYXNlSGlnaDsKKyAgICBMTV9VSU5UMzIgTWVtQmFzZVNpemU7CisjZW5kaWYKKyAgICBQTE1fVUlOVDggcE1hcHBlZE1lbUJhc2U7CisKKyAgICAvKiBTYXZlZCBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgZm9yIHJlc3RvcmluZyBhZnRlciBhIHJlc2V0LiAqLworICAgIExNX1VJTlQzMiBTYXZlZENhY2hlTGluZVJlZzsKKworICAgIC8qIFBoeSBpbmZvLiAqLworICAgIExNX1VJTlQzMiBQaHlBZGRyOworICAgIExNX1VJTlQzMiBQaHlJZDsKKworICAgIC8qIFJlcXVlc3RlZCBwaHkgc2V0dGluZ3MuICovCisgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlOworCisgICAgLyogRGlzYWJsZSBhdXRvLW5lZ290aWF0aW9uLiAqLworICAgIExNX1VJTlQzMiBEaXNhYmxlQXV0b05lZzsKKworICAgIC8qIFdheXMgZm9yIHRoZSBNQUMgdG8gZ2V0IGxpbmsgY2hhbmdlIGludGVycnVwdC4gKi8KKyAgICBMTV9VSU5UMzIgUGh5SW50TW9kZTsKKyAgICAjZGVmaW5lIFQzX1BIWV9JTlRfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSBUM19QSFlfSU5UX01PREVfTElOS19SRUFEWSAgICAgICAgICAgICAgICAgIDIKKyAgICAjZGVmaW5lIFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcgICAgICAgICAgICAgICAgMworCisgICAgLyogV2F5cyB0byBkZXRlcm1pbmUgbGluayBjaGFuZ2Ugc3RhdHVzLiAqLworICAgIExNX1VJTlQzMiBMaW5rQ2huZ01vZGU7CisgICAgI2RlZmluZSBUM19MSU5LX0NITkdfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lIFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfUkVHICAgICAgICAgICAgMQorICAgICNkZWZpbmUgVDNfTElOS19DSE5HX01PREVfVVNFX1NUQVRVU19CTE9DSyAgICAgICAgICAyCisKKworICAgIC8qIExFRCBtb2RlLiAqLworICAgIExNX1VJTlQzMiBMZWRNb2RlOworCisgICAgI2RlZmluZSBMRURfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworICAgIC8qIDU3MDAvMDEgTEVEIG1vZGUuICovCisgICAgI2RlZmluZSBMRURfTU9ERV9USFJFRV9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lIExFRF9NT0RFX0xJTksxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisgICAgLyogNTcwMy8wMi8wNCBMRUQgbW9kZS4gKi8KKyAgICAjZGVmaW5lIExFRF9NT0RFX09QRU5fRFJBSU4gICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgTEVEX01PREVfT1VUUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKyAgICAvKiBXT0wgU3BlZWQgKi8KKyAgICBMTV9VSU5UMzIgV29sU3BlZWQ7CisgICAgI2RlZmluZSBXT0xfU1BFRURfMTBNQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lIFdPTF9TUEVFRF8xMDBNQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisgICAgLyogUmVzZXQgdGhlIFBIWSBvbiBpbml0aWFsaXphdGlvbi4gKi8KKyAgICBMTV9VSU5UMzIgUmVzZXRQaHlPbkluaXQ7CisKKyAgICBMTV9VSU5UMzIgUmVzdG9yZU9uV2FrZVVwOworICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFdha2VVcFJlcXVlc3RlZE1lZGlhVHlwZTsKKyAgICBMTV9VSU5UMzIgV2FrZVVwRGlzYWJsZUF1dG9OZWc7CisKKyAgICAvKiBDdXJyZW50IHBoeSBzZXR0aW5ncy4gKi8KKyAgICBMTV9NRURJQV9UWVBFIE1lZGlhVHlwZTsKKyAgICBMTV9MSU5FX1NQRUVEIExpbmVTcGVlZDsKKyAgICBMTV9MSU5FX1NQRUVEIE9sZExpbmVTcGVlZDsKKyAgICBMTV9EVVBMRVhfTU9ERSBEdXBsZXhNb2RlOworICAgIExNX1NUQVRVUyBMaW5rU3RhdHVzOworICAgIExNX1VJTlQzMiBhZHZlcnRpc2luZzsgICAgIC8qIEppbW15LCBuZXchICovCisgICAgTE1fVUlOVDMyIGFkdmVydGlzaW5nMTAwMDsgLyogSmltbXksIG5ldyEgKi8KKworICAgIC8qIE11bHRpY2FzdCBhZGRyZXNzIGxpc3QuICovCisgICAgTE1fVUlOVDMyIE1jRW50cnlDb3VudDsKKyAgICBMTV9VSU5UOCBNY1RhYmxlW0xNX01BWF9NQ19UQUJMRV9TSVpFXVtMTV9NQ19FTlRSWV9TSVpFXTsKKworICAgIC8qIFVzZSBOSUMgb3IgSG9zdCBiYXNlZCBzZW5kIEJELiAqLworICAgIExNX1VJTlQzMiBOaWNTZW5kQmQ7CisKKyAgICAvKiBBdGhsb24gZml4LiAqLworICAgIExNX1VJTlQzMiBEZWxheVBjaUdyYW50OworCisgICAgLyogRW5hYmxlIE9uZURtYUF0T25jZSAqLworICAgIExNX1VJTlQzMiBPbmVEbWFBdE9uY2U7CisKKyAgICAvKiBTcGxpdCBNb2RlIGZsYWdzLCBKaW1teSBuZXcgKi8KKyAgICBMTV9VSU5UMzIgU3BsaXRNb2RlRW5hYmxlOworICAgIExNX1VJTlQzMiBTcGxpdE1vZGVNYXhSZXE7CisKKyAgICAvKiBJbml0IGZsYWcuICovCisgICAgTE1fQk9PTCBJbml0RG9uZTsKKworICAgIC8qIFNodXRkb3duIGZsYWcuICBTZXQgYnkgdGhlIHVwcGVyIG1vZHVsZS4gKi8KKyAgICBMTV9CT09MIFNodXR0aW5nRG93bjsKKworICAgIC8qIEZsYWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gY2FsbCBMTV9RdWV1ZVJ4UGFja2V0cyBvciBub3QgaW4gKi8KKyAgICAvKiBMTV9SZXNldEFkYXB0ZXIgcm91dGluZS4gKi8KKyAgICBMTV9CT09MIFF1ZXVlUnhQYWNrZXRzOworCisgICAgTE1fVUlOVDMyIE1idWZCYXNlOworICAgIExNX1VJTlQzMiBNYnVmU2l6ZTsKKworICAgIC8qIFRSVUUgaWYgd2UgaGF2ZSBhIFNFUkRFUyBQSFkuICovCisgICAgTE1fVUlOVDMyIEVuYWJsZVRiaTsKKworICAgIC8qIEV0aGVybmV0QFdpcmVTcGVlZC4gKi8KKyAgICBMTV9VSU5UMzIgRW5hYmxlV2lyZVNwZWVkOworCisgICAgTE1fVUlOVDMyIEVlcHJvbVdwOworCisjaWYgSU5DTFVERV9UQklfU1VQUE9SVAorICAgIC8qIEF1dG9uZWcgc3RhdGUgaW5mby4gKi8KKyAgICBBTl9TVEFURV9JTkZPIEFuSW5mbzsKKyAgICBMTV9VSU5UMzIgUG9sbFRiaUxpbms7CisgICAgTE1fVUlOVDMyIElnbm9yZVRiaUxpbmtDaGFuZ2U7CisjZW5kaWYKKyAgICBjaGFyIFBhcnROb1syNF07CisgICAgY2hhciBCb290Q29kZVZlclsxNl07CisgICAgY2hhciBCdXNTcGVlZFN0clsyNF07IC8qIEppbW15LCBuZXchICovCisgICAgTE1fVUlOVDMyIFBoeUNyY0NvdW50OworfSBMTV9ERVZJQ0VfQkxPQ0s7CisKKworI2RlZmluZSBUM19SRUdfQ1BVX1ZJRVcgICAgICAgICAgICAgICAweGMwMDAwMDAwCisKKyNkZWZpbmUgVDNfQkxPQ0tfRE1BX1JEICAgICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgVDNfQkxPQ0tfRE1BX0NPTVAgICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgVDNfQkxPQ0tfUlhfQkRfSU5JVElBVE9SICAgICAgKDEgPDwgMikKKyNkZWZpbmUgVDNfQkxPQ0tfUlhfQkRfQ09NUCAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgVDNfQkxPQ0tfRE1BX1dSICAgICAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgVDNfQkxPQ0tfTVNJX0hBTkRMRVIgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgVDNfQkxPQ0tfUlhfTElTVF9QTE1UICAgICAgICAgKDEgPDwgNikKKyNkZWZpbmUgVDNfQkxPQ0tfUlhfTElTVF9TRUxFQ1RPUiAgICAgKDEgPDwgNykKKyNkZWZpbmUgVDNfQkxPQ0tfUlhfREFUQV9JTklUSUFUT1IgICAgKDEgPDwgOCkKKyNkZWZpbmUgVDNfQkxPQ0tfUlhfREFUQV9DT01QICAgICAgICAgKDEgPDwgOSkKKyNkZWZpbmUgVDNfQkxPQ0tfSE9TVF9DT0FMRVNJTkcgICAgICAgKDEgPDwgMTApCisjZGVmaW5lIFQzX0JMT0NLX01BQ19SWF9FTkdJTkUgICAgICAgICgxIDw8IDExKQorI2RlZmluZSBUM19CTE9DS19NQlVGX0NMVVNURVJfRlJFRSAgICAoMSA8PCAxMikKKyNkZWZpbmUgVDNfQkxPQ0tfU0VORF9CRF9JTklUSUFUT1IgICAgKDEgPDwgMTMpCisjZGVmaW5lIFQzX0JMT0NLX1NFTkRfQkRfQ09NUCAgICAgICAgICgxIDw8IDE0KQorI2RlZmluZSBUM19CTE9DS19TRU5EX0JEX1NFTEVDVE9SICAgICAoMSA8PCAxNSkKKyNkZWZpbmUgVDNfQkxPQ0tfU0VORF9EQVRBX0lOSVRJQVRPUiAgKDEgPDwgMTYpCisjZGVmaW5lIFQzX0JMT0NLX1NFTkRfREFUQV9DT01QICAgICAgICgxIDw8IDE3KQorI2RlZmluZSBUM19CTE9DS19NQUNfVFhfRU5HSU5FICAgICAgICAoMSA8PCAxOCkKKyNkZWZpbmUgVDNfQkxPQ0tfTUVNX0FSQklUT1IgICAgICAgICAgKDEgPDwgMTkpCisjZGVmaW5lIFQzX0JMT0NLX01CVUZfTUFOQUdFUiAgICAgICAgICgxIDw8IDIwKQorI2RlZmluZSBUM19CTE9DS19NQUNfR0xPQkFMICAgICAgICAgICAoMSA8PCAyMSkKKworI2RlZmluZSBMTV9FTkFCTEUgICAgICAgICAgICAgICAxCisjZGVmaW5lIExNX0RJU0FCTEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBSWF9DUFVfRVZUX1NXMCAgICAgICAgICAgICAgMAorI2RlZmluZSBSWF9DUFVfRVZUX1NXMSAgICAgICAgICAgICAgMQorI2RlZmluZSBSWF9DUFVfRVZUX1JMUCAgICAgICAgICAgICAgMgorI2RlZmluZSBSWF9DUFVfRVZUX1NXMyAgICAgICAgICAgICAgMworI2RlZmluZSBSWF9DUFVfRVZUX1JMUyAgICAgICAgICAgICAgNAorI2RlZmluZSBSWF9DUFVfRVZUX1NXNCAgICAgICAgICAgICAgNQorI2RlZmluZSBSWF9DUFVfRVZUX1JYX0JEX0NPTVAgICAgICAgNgorI2RlZmluZSBSWF9DUFVfRVZUX1NXNSAgICAgICAgICAgICAgNworI2RlZmluZSBSWF9DUFVfRVZUX1JESSAgICAgICAgICAgICAgOAorI2RlZmluZSBSWF9DUFVfRVZUX0RNQV9XUiAgICAgICAgICAgOQorI2RlZmluZSBSWF9DUFVfRVZUX0RNQV9SRCAgICAgICAgICAgMTAKKyNkZWZpbmUgUlhfQ1BVX0VWVF9TV1EgICAgICAgICAgICAgIDExCisjZGVmaW5lIFJYX0NQVV9FVlRfU1c2ICAgICAgICAgICAgICAxMgorI2RlZmluZSBSWF9DUFVfRVZUX1JEQyAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgUlhfQ1BVX0VWVF9TVzcgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFJYX0NQVV9FVlRfSE9TVF9DT0FMRVMgICAgICAxNQorI2RlZmluZSBSWF9DUFVfRVZUX1NXOCAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUlhfQ1BVX0VWVF9ISUdIX0RNQV9XUiAgICAgIDE3CisjZGVmaW5lIFJYX0NQVV9FVlRfSElHSF9ETUFfUkQgICAgICAxOAorI2RlZmluZSBSWF9DUFVfRVZUX1NXOSAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgUlhfQ1BVX0VWVF9ETUFfQVRUTiAgICAgICAgIDIwCisjZGVmaW5lIFJYX0NQVV9FVlRfTE9XX1BfTUJPWCAgICAgICAyMQorI2RlZmluZSBSWF9DUFVfRVZUX0hJR0hfUF9NQk9YICAgICAgMjIKKyNkZWZpbmUgUlhfQ1BVX0VWVF9TVzEwICAgICAgICAgICAgIDIzCisjZGVmaW5lIFJYX0NQVV9FVlRfVFhfQ1BVX0FUVE4gICAgICAyNAorI2RlZmluZSBSWF9DUFVfRVZUX01BQ19BVFROICAgICAgICAgMjUKKyNkZWZpbmUgUlhfQ1BVX0VWVF9SWF9DUFVfQVRUTiAgICAgIDI2CisjZGVmaW5lIFJYX0NQVV9FVlRfRkxPV19BVFROICAgICAgICAyNworI2RlZmluZSBSWF9DUFVfRVZUX1NXMTEgICAgICAgICAgICAgMjgKKyNkZWZpbmUgUlhfQ1BVX0VWVF9USU1FUiAgICAgICAgICAgIDI5CisjZGVmaW5lIFJYX0NQVV9FVlRfU1cxMiAgICAgICAgICAgICAzMAorI2RlZmluZSBSWF9DUFVfRVZUX1NXMTMgICAgICAgICAgICAgMzEKKworLyogUlgtQ1BVIGV2ZW50ICovCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9TV19FVkVOVDAgICAgICAoMSA8PCBSWF9DUFVfRVZUX1NXMCkKKyNkZWZpbmUgUlhfQ1BVX0VWRU5UX1NXX0VWRU5UMSAgICAgICgxIDw8IFJYX0NQVV9FVlRfU1cxKQorI2RlZmluZSBSWF9DUFVfRVZFTlRfUkxQICAgICAgICAgICAgKDEgPDwgUlhfQ1BVX0VWVF9STFApCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9TV19FVkVOVDMgICAgICAoMSA8PCBSWF9DUFVfRVZUX1NXMykKKyNkZWZpbmUgUlhfQ1BVX0VWRU5UX1JMUyAgICAgICAgICAgICgxIDw8IFJYX0NQVV9FVlRfUkxTKQorI2RlZmluZSBSWF9DUFVfRVZFTlRfU1dfRVZFTlQ0ICAgICAgKDEgPDwgUlhfQ1BVX0VWVF9TVzQpCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9SWF9CRF9DT01QICAgICAoMSA8PCBSWF9DUFVfRVZUX1JYX0JEX0NPTVApCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9TV19FVkVOVDUgICAgICAoMSA8PCBSWF9DUFVfRVZUX1NXNSkKKyNkZWZpbmUgUlhfQ1BVX0VWRU5UX1JESSAgICAgICAgICAgICgxIDw8IFJYX0NQVV9FVlRfUkRJKQorI2RlZmluZSBSWF9DUFVfRVZFTlRfRE1BX1dSICAgICAgICAgKDEgPDwgUlhfQ1BVX0VWVF9ETUFfV1IpCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9ETUFfUkQgICAgICAgICAoMSA8PCBSWF9DUFVfRVZUX0RNQV9SRCkKKyNkZWZpbmUgUlhfQ1BVX0VWRU5UX1NXUSAgICAgICAgICAgICgxIDw8IFJYX0NQVV9FVlRfU1dRKQorI2RlZmluZSBSWF9DUFVfRVZFTlRfU1dfRVZFTlQ2ICAgICAgKDEgPDwgUlhfQ1BVX0VWVF9TVzYpCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9SREMgICAgICAgICAgICAoMSA8PCBSWF9DUFVfRVZUX1JEQykKKyNkZWZpbmUgUlhfQ1BVX0VWRU5UX1NXX0VWRU5UNyAgICAgICgxIDw8IFJYX0NQVV9FVlRfU1c3KQorI2RlZmluZSBSWF9DUFVfRVZFTlRfSE9TVF9DT0FMRVMgICAgKDEgPDwgUlhfQ1BVX0VWVF9IT1NUX0NPQUxFUykKKyNkZWZpbmUgUlhfQ1BVX0VWRU5UX1NXX0VWRU5UOCAgICAgICgxIDw8IFJYX0NQVV9FVlRfU1c4KQorI2RlZmluZSBSWF9DUFVfRVZFTlRfSElHSF9ETUFfV1IgICAgKDEgPDwgUlhfQ1BVX0VWVF9ISUdIX0RNQV9XUikKKyNkZWZpbmUgUlhfQ1BVX0VWRU5UX0hJR0hfRE1BX1JEICAgICgxIDw8IFJYX0NQVV9FVlRfSElHSF9ETUFfUkQpCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9TV19FVkVOVDkgICAgICAoMSA8PCBSWF9DUFVfRVZUX1NXOSkKKyNkZWZpbmUgUlhfQ1BVX0VWRU5UX0RNQV9BVFROICAgICAgICgxIDw8IFJYX0NQVV9FVlRfRE1BX0FUVE4pCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9MT1dfUF9NQk9YICAgICAoMSA8PCBSWF9DUFVfRVZUX0xPV19QX01CT1gpCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9ISUdIX1BfTUJPWCAgICAoMSA8PCBSWF9DUFVfRVZUX0hJR0hfUF9NQk9YKQorI2RlZmluZSBSWF9DUFVfRVZFTlRfU1dfRVZFTlQxMCAgICAgKDEgPDwgUlhfQ1BVX0VWVF9TVzEwKQorI2RlZmluZSBSWF9DUFVfRVZFTlRfVFhfQ1BVX0FUVE4gICAgKDEgPDwgUlhfQ1BVX0VWVF9UWF9DUFVfQVRUTikKKyNkZWZpbmUgUlhfQ1BVX0VWRU5UX01BQ19BVFROICAgICAgICgxIDw8IFJYX0NQVV9FVlRfTUFDX0FUVE4pCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9SWF9DUFVfQVRUTiAgICAoMSA8PCBSWF9DUFVfRVZUX1JYX0NQVV9BVFROKQorI2RlZmluZSBSWF9DUFVfRVZFTlRfRkxPV19BVFROICAgICAgKDEgPDwgUlhfQ1BVX0VWVF9GTE9XX0FUVE4pCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9TV19FVkVOVDExICAgICAoMSA8PCBSWF9DUFVfRVZUX1NXMTEpCisjZGVmaW5lIFJYX0NQVV9FVkVOVF9USU1FUiAgICAgICAgICAoMSA8PCBSWF9DUFVfRVZUX1RJTUVSKQorI2RlZmluZSBSWF9DUFVfRVZFTlRfU1dfRVZFTlQxMiAgICAgKDEgPDwgUlhfQ1BVX0VWVF9TVzEyKQorI2RlZmluZSBSWF9DUFVfRVZFTlRfU1dfRVZFTlQxMyAgICAgKDEgPDwgUlhfQ1BVX0VWVF9TVzEzKQorCisjZGVmaW5lIFJYX0NQVV9NQVNLIChSWF9DUFVfRVZFTlRfU1dfRVZFTlQwIHwgXAorCQkgICAgIFJYX0NQVV9FVkVOVF9STFAgfCBcCisJCSAgICAgUlhfQ1BVX0VWRU5UX1JESSB8IFwKKwkJICAgICBSWF9DUFVfRVZFTlRfUkRDKQorCisjZGVmaW5lIFRYX0NQVV9FVlRfU1cwICAgICAgICAgICAgICAwCisjZGVmaW5lIFRYX0NQVV9FVlRfU1cxICAgICAgICAgICAgICAxCisjZGVmaW5lIFRYX0NQVV9FVlRfU1cyICAgICAgICAgICAgICAyCisjZGVmaW5lIFRYX0NQVV9FVlRfU1czICAgICAgICAgICAgICAzCisjZGVmaW5lIFRYX0NQVV9FVlRfVFhfTUFDICAgICAgICAgICA0CisjZGVmaW5lIFRYX0NQVV9FVlRfU1c0ICAgICAgICAgICAgICA1CisjZGVmaW5lIFRYX0NQVV9FVlRfU0JEQyAgICAgICAgICAgICA2CisjZGVmaW5lIFRYX0NQVV9FVlRfU1c1ICAgICAgICAgICAgICA3CisjZGVmaW5lIFRYX0NQVV9FVlRfU0RJICAgICAgICAgICAgICA4CisjZGVmaW5lIFRYX0NQVV9FVlRfRE1BX1dSICAgICAgICAgICA5CisjZGVmaW5lIFRYX0NQVV9FVlRfRE1BX1JEICAgICAgICAgICAxMAorI2RlZmluZSBUWF9DUFVfRVZUX1NXUSAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgVFhfQ1BVX0VWVF9TVzYgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFRYX0NQVV9FVlRfU0RDICAgICAgICAgICAgICAxMworI2RlZmluZSBUWF9DUFVfRVZUX1NXNyAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgVFhfQ1BVX0VWVF9IT1NUX0NPQUxFUyAgICAgIDE1CisjZGVmaW5lIFRYX0NQVV9FVlRfU1c4ICAgICAgICAgICAgICAxNgorI2RlZmluZSBUWF9DUFVfRVZUX0hJR0hfRE1BX1dSICAgICAgMTcKKyNkZWZpbmUgVFhfQ1BVX0VWVF9ISUdIX0RNQV9SRCAgICAgIDE4CisjZGVmaW5lIFRYX0NQVV9FVlRfU1c5ICAgICAgICAgICAgICAxOQorI2RlZmluZSBUWF9DUFVfRVZUX0RNQV9BVFROICAgICAgICAgMjAKKyNkZWZpbmUgVFhfQ1BVX0VWVF9MT1dfUF9NQk9YICAgICAgIDIxCisjZGVmaW5lIFRYX0NQVV9FVlRfSElHSF9QX01CT1ggICAgICAyMgorI2RlZmluZSBUWF9DUFVfRVZUX1NXMTAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgVFhfQ1BVX0VWVF9SWF9DUFVfQVRUTiAgICAgIDI0CisjZGVmaW5lIFRYX0NQVV9FVlRfTUFDX0FUVE4gICAgICAgICAyNQorI2RlZmluZSBUWF9DUFVfRVZUX1RYX0NQVV9BVFROICAgICAgMjYKKyNkZWZpbmUgVFhfQ1BVX0VWVF9GTE9XX0FUVE4gICAgICAgIDI3CisjZGVmaW5lIFRYX0NQVV9FVlRfU1cxMSAgICAgICAgICAgICAyOAorI2RlZmluZSBUWF9DUFVfRVZUX1RJTUVSICAgICAgICAgICAgMjkKKyNkZWZpbmUgVFhfQ1BVX0VWVF9TVzEyICAgICAgICAgICAgIDMwCisjZGVmaW5lIFRYX0NQVV9FVlRfU1cxMyAgICAgICAgICAgICAzMQorCisKKy8qIFRYLUNQVSBldmVudCAqLworI2RlZmluZSBUWF9DUFVfRVZFTlRfU1dfRVZFTlQwICAgICAgKDEgPDwgVFhfQ1BVX0VWVF9TVzApCisjZGVmaW5lIFRYX0NQVV9FVkVOVF9TV19FVkVOVDEgICAgICAoMSA8PCBUWF9DUFVfRVZUX1NXMSkKKyNkZWZpbmUgVFhfQ1BVX0VWRU5UX1NXX0VWRU5UMiAgICAgICgxIDw8IFRYX0NQVV9FVlRfU1cyKQorI2RlZmluZSBUWF9DUFVfRVZFTlRfU1dfRVZFTlQzICAgICAgKDEgPDwgVFhfQ1BVX0VWVF9TVzMpCisjZGVmaW5lIFRYX0NQVV9FVkVOVF9UWF9NQUMgICAgICAgICAoMSA8PCBUWF9DUFVfRVZUX1RYX01BQykKKyNkZWZpbmUgVFhfQ1BVX0VWRU5UX1NXX0VWRU5UNCAgICAgICgxIDw8IFRYX0NQVV9FVlRfU1c0KQorI2RlZmluZSBUWF9DUFVfRVZFTlRfU0JEQyAgICAgICAgICAgKDEgPDwgVFhfQ1BVX0VWVF9TQkRDKQorI2RlZmluZSBUWF9DUFVfRVZFTlRfU1dfRVZFTlQ1ICAgICAgKDEgPDwgVFhfQ1BVX0VWVF9TVzUpCisjZGVmaW5lIFRYX0NQVV9FVkVOVF9TREkgICAgICAgICAgICAoMSA8PCBUWF9DUFVfRVZUX1NESSkKKyNkZWZpbmUgVFhfQ1BVX0VWRU5UX0RNQV9XUiAgICAgICAgICgxIDw8IFRYX0NQVV9FVlRfRE1BX1dSKQorI2RlZmluZSBUWF9DUFVfRVZFTlRfRE1BX1JEICAgICAgICAgKDEgPDwgVFhfQ1BVX0VWVF9ETUFfUkQpCisjZGVmaW5lIFRYX0NQVV9FVkVOVF9TV1EgICAgICAgICAgICAoMSA8PCBUWF9DUFVfRVZUX1NXUSkKKyNkZWZpbmUgVFhfQ1BVX0VWRU5UX1NXX0VWRU5UNiAgICAgICgxIDw8IFRYX0NQVV9FVlRfU1c2KQorI2RlZmluZSBUWF9DUFVfRVZFTlRfU0RDICAgICAgICAgICAgKDEgPDwgVFhfQ1BVX0VWVF9TREMpCisjZGVmaW5lIFRYX0NQVV9FVkVOVF9TV19FVkVOVDcgICAgICAoMSA8PCBUWF9DUFVfRVZUX1NXNykKKyNkZWZpbmUgVFhfQ1BVX0VWRU5UX0hPU1RfQ09BTEVTICAgICgxIDw8IFRYX0NQVV9FVlRfSE9TVF9DT0FMRVMpCisjZGVmaW5lIFRYX0NQVV9FVkVOVF9TV19FVkVOVDggICAgICAoMSA8PCBUWF9DUFVfRVZUX1NXOCkKKyNkZWZpbmUgVFhfQ1BVX0VWRU5UX0hJR0hfRE1BX1dSICAgICgxIDw8IFRYX0NQVV9FVlRfSElHSF9ETUFfV1IpCisjZGVmaW5lIFRYX0NQVV9FVkVOVF9ISUdIX0RNQV9SRCAgICAoMSA8PCBUWF9DUFVfRVZUX0hJR0hfRE1BX1JEKQorI2RlZmluZSBUWF9DUFVfRVZFTlRfU1dfRVZFTlQ5ICAgICAgKDEgPDwgVFhfQ1BVX0VWVF9TVzkpCisjZGVmaW5lIFRYX0NQVV9FVkVOVF9ETUFfQVRUTiAgICAgICAoMSA8PCBUWF9DUFVfRVZUX0RNQV9BVFROKQorI2RlZmluZSBUWF9DUFVfRVZFTlRfTE9XX1BfTUJPWCAgICAgKDEgPDwgVFhfQ1BVX0VWVF9MT1dfUF9NQk9YKQorI2RlZmluZSBUWF9DUFVfRVZFTlRfSElHSF9QX01CT1ggICAgKDEgPDwgVFhfQ1BVX0VWVF9ISUdIX1BfTUJPWCkKKyNkZWZpbmUgVFhfQ1BVX0VWRU5UX1NXX0VWRU5UMTAgICAgICgxIDw8IFRYX0NQVV9FVlRfU1cxMCkKKyNkZWZpbmUgVFhfQ1BVX0VWRU5UX1JYX0NQVV9BVFROICAgICgxIDw8IFRYX0NQVV9FVlRfUlhfQ1BVX0FUVE4pCisjZGVmaW5lIFRYX0NQVV9FVkVOVF9NQUNfQVRUTiAgICAgICAoMSA8PCBUWF9DUFVfRVZUX01BQ19BVFROKQorI2RlZmluZSBUWF9DUFVfRVZFTlRfVFhfQ1BVX0FUVE4gICAgKDEgPDwgVFhfQ1BVX0VWVF9UWF9DUFVfQVRUTikKKyNkZWZpbmUgVFhfQ1BVX0VWRU5UX0ZMT1dfQVRUTiAgICAgICgxIDw8IFRYX0NQVV9FVlRfRkxPV19BVFROKQorI2RlZmluZSBUWF9DUFVfRVZFTlRfU1dfRVZFTlQxMSAgICAgKDEgPDwgVFhfQ1BVX0VWVF9TVzExKQorI2RlZmluZSBUWF9DUFVfRVZFTlRfVElNRVIgICAgICAgICAgKDEgPDwgVFhfQ1BVX0VWVF9USU1FUikKKyNkZWZpbmUgVFhfQ1BVX0VWRU5UX1NXX0VWRU5UMTIgICAgICgxIDw8IFRYX0NQVV9FVlRfU1cxMikKKyNkZWZpbmUgVFhfQ1BVX0VWRU5UX1NXX0VWRU5UMTMgICAgICgxIDw8IFRYX0NQVV9FVlRfU1cxMykKKworCisjZGVmaW5lIFRYX0NQVV9NQVNLIChUWF9DUFVfRVZFTlRfU1dfRVZFTlQwIHwgXAorCQkgICAgIFRYX0NQVV9FVkVOVF9TREkgIHwgXAorCQkgICAgIFRYX0NQVV9FVkVOVF9TREMpCisKKworI2RlZmluZSBUM19GVFFfVFlQRTFfVU5ERVJGTE9XX0JJVCAgICgxIDw8IDI5KQorI2RlZmluZSBUM19GVFFfVFlQRTFfUEFTU19CSVQgICAgICAgICgxIDw8IDMwKQorI2RlZmluZSBUM19GVFFfVFlQRTFfU0tJUF9CSVQgICAgICAgICgxIDw8IDMxKQorCisjZGVmaW5lIFQzX0ZUUV9UWVBFMl9VTkRFUkZMT1dfQklUICAgKDEgPDwgMTMpCisjZGVmaW5lIFQzX0ZUUV9UWVBFMl9QQVNTX0JJVCAgICAgICAgKDEgPDwgMTQpCisjZGVmaW5lIFQzX0ZUUV9UWVBFMl9TS0lQX0JJVCAgICAgICAgKDEgPDwgMTUpCisKKyNkZWZpbmUgVDNfUUlEX0RNQV9SRUFEICAgICAgICAgICAgICAgMQorI2RlZmluZSBUM19RSURfRE1BX0hJR0hfUFJJX1JFQUQgICAgICAyCisjZGVmaW5lIFQzX1FJRF9ETUFfQ09NUF9EWCAgICAgICAgICAgIDMKKyNkZWZpbmUgVDNfUUlEX1NFTkRfQkRfQ09NUCAgICAgICAgICAgNAorI2RlZmluZSBUM19RSURfU0VORF9EQVRBX0lOSVRJQVRPUiAgICA1CisjZGVmaW5lIFQzX1FJRF9ETUFfV1JJVEUgICAgICAgICAgICAgIDYKKyNkZWZpbmUgVDNfUUlEX0RNQV9ISUdIX1BSSV9XUklURSAgICAgNworI2RlZmluZSBUM19RSURfU1dfVFlQRV8xICAgICAgICAgICAgICA4CisjZGVmaW5lIFQzX1FJRF9TRU5EX0RBVEFfQ09NUCAgICAgICAgIDkKKyNkZWZpbmUgVDNfUUlEX0hPU1RfQ09BTEVTQ0lORyAgICAgICAgMTAKKyNkZWZpbmUgVDNfUUlEX01BQ19UWCAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgVDNfUUlEX01CVUZfQ0xVU1RFUl9GUkVFICAgICAgMTIKKyNkZWZpbmUgVDNfUUlEX1JYX0JEX0NPTVAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgVDNfUUlEX1JYX0xJU1RfUExNICAgICAgICAgICAgMTQKKyNkZWZpbmUgVDNfUUlEX1JYX0RBVEFfQkRfSU5JVElBVE9SICAgMTUKKyNkZWZpbmUgVDNfUUlEX1JYX0RBVEFfQ09NUCAgICAgICAgICAgMTYKKyNkZWZpbmUgVDNfUUlEX1NXX1RZUEUyICAgICAgICAgICAgICAgMTcKKworTE1fU1RBVFVTIExNX0xvYWRGaXJtd2FyZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBUM19GV0lNR19JTkZPIHBGd0ltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTE1fVUlOVDMyIExvYWRDcHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExNX1VJTlQzMiBTdGFydENwdSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBOSUMgcmVnaXN0ZXIgcmVhZC93cml0ZSBtYWNyb3MuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgMCAgLyogSmltbXkgKi8KKy8qIE1BQyByZWdpc3RlciBhY2Nlc3MuICovCitMTV9VSU5UMzIgTE1fUmVnUmRJbmQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgUmVnaXN0ZXIpOworTE1fVk9JRCBMTV9SZWdXckluZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBSZWdpc3RlciwKKyAgICBMTV9VSU5UMzIgVmFsdWUzMik7CisKKy8qIE1BQyBtZW1vcnkgYWNjZXNzLiAqLworTE1fVUlOVDMyIExNX01lbVJkSW5kKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE1lbUFkZHIpOworTE1fVk9JRCBMTV9NZW1XckluZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBNZW1BZGRyLAorICAgIExNX1VJTlQzMiBWYWx1ZTMyKTsKKworI2lmIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQKKworLyogdXNlIG1lbW9yeS1tYXBwZWQgYWNjZXNzZXMgZm9yIG1haWxib3hlcyBhbmQgcmVhZHMsIFVOREkgYWNjZXNzZXMKKyAgIGZvciB3cml0ZXMgdG8gYWxsIG90aGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBSRUdfUkQocERldmljZSwgT2Zmc2V0TmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVhZGwoJigocERldmljZSktPnBNZW1WaWV3LT5PZmZzZXROYW1lKSkKKworI2RlZmluZSBSRUdfV1IocERldmljZSwgT2Zmc2V0TmFtZSwgVmFsdWUzMikgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoT0ZGU0VUT0YoVDNfU1REX01FTV9NQVAsIE9mZnNldE5hbWUpID49MHgyMDAgKSAmJiAgICAgICAgIFwKKyAgICAgIChPRkZTRVRPRihUM19TVERfTUVNX01BUCwgT2Zmc2V0TmFtZSkgPDB4NDAwKSkgfHwJICAgICAgICAgXAorCSAoKHBEZXZpY2UpLT5FbmFibGVQY2lYRml4ID09IEZBTFNFKSkgPyAgICAgICAgICAgICAgICAgIFwKKyAgICAodm9pZCkgd3JpdGVsKFZhbHVlMzIsICYoKHBEZXZpY2UpLT5wTWVtVmlldy0+T2Zmc2V0TmFtZSkpIDogXAorICAgIExNX1JlZ1dySW5kKHBEZXZpY2UsIE9GRlNFVE9GKFQzX1NURF9NRU1fTUFQLCBPZmZzZXROYW1lKSwgVmFsdWUzMikKKworI2RlZmluZSBNQl9SRUdfUkQocERldmljZSwgT2Zmc2V0TmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVhZGwoJigocERldmljZSktPnBNZW1WaWV3LT5PZmZzZXROYW1lKSkKKworI2RlZmluZSBNQl9SRUdfV1IocERldmljZSwgT2Zmc2V0TmFtZSwgVmFsdWUzMikgICAgICAgICAgICAgICAgICBcCisgICAgd3JpdGVsKFZhbHVlMzIsICYoKHBEZXZpY2UpLT5wTWVtVmlldy0+T2Zmc2V0TmFtZSkpCisKKyNkZWZpbmUgUkVHX1JEX09GRlNFVChwRGV2aWNlLCBPZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlYWRsKCYoKExNX1VJTlQ4ICopIChwRGV2aWNlKS0+cE1lbVZpZXcgKyBPZmZzZXQpKQorCisjZGVmaW5lIFJFR19XUl9PRkZTRVQocERldmljZSwgT2Zmc2V0LCBWYWx1ZTMyKSAgICAgICAgICAgICAgICAgIFwKKwkoKChPZmZzZXQgPj0weDIwMCApICYmIChPZmZzZXQgPCAweDQwMCkpIHx8CQkgXAorCSAoKHBEZXZpY2UpLT5FbmFibGVQY2lYRml4ID09IEZBTFNFKSkgPwkgICAJCSBcCisgICAgKHZvaWQpIHdyaXRlbChWYWx1ZTMyLCAoKExNX1VJTlQ4ICopIChwRGV2aWNlKS0+cE1lbVZpZXcgKyBPZmZzZXQpKSA6IFwKKyAgICBMTV9SZWdXckluZChwRGV2aWNlLCBPZmZzZXQsIFZhbHVlMzIpCisKKyNkZWZpbmUgTUVNX1JEKHBEZXZpY2UsIEFkZHJOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExNX01lbVJkSW5kKHBEZXZpY2UsIE9GRlNFVE9GKFQzX0ZJUlNUXzMyS19TUkFNLCBBZGRyTmFtZSkpCisjZGVmaW5lIE1FTV9XUihwRGV2aWNlLCBBZGRyTmFtZSwgVmFsdWUzMikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMTV9NZW1XckluZChwRGV2aWNlLCBPRkZTRVRPRihUM19GSVJTVF8zMktfU1JBTSwgQWRkck5hbWUpLCBWYWx1ZTMyKQorCisjZGVmaW5lIE1FTV9SRF9PRkZTRVQocERldmljZSwgT2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMTV9NZW1SZEluZChwRGV2aWNlLCBPZmZzZXQpCisjZGVmaW5lIE1FTV9XUl9PRkZTRVQocERldmljZSwgT2Zmc2V0LCBWYWx1ZTMyKSAgICAgICAgICAgICAgICAgIFwKKyAgICBMTV9NZW1XckluZChwRGV2aWNlLCBPZmZzZXQsIFZhbHVlMzIpCisKKyNlbHNlIC8qIG5vcm1hbCB0YXJnZXQgYWNjZXNzIHBhdGggYmVsb3cgKi8KKworLyogUmVnaXN0ZXIgYWNjZXNzLiAqLworI2RlZmluZSBSRUdfUkQocERldmljZSwgT2Zmc2V0TmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWFkbCgmKChwRGV2aWNlKS0+cE1lbVZpZXctPk9mZnNldE5hbWUpKQorI2RlZmluZSBSRUdfV1IocERldmljZSwgT2Zmc2V0TmFtZSwgVmFsdWUzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3cml0ZWwoVmFsdWUzMiwgJigocERldmljZSktPnBNZW1WaWV3LT5PZmZzZXROYW1lKSkKKworI2RlZmluZSBSRUdfUkRfT0ZGU0VUKHBEZXZpY2UsIE9mZnNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWFkbCgoKExNX1VJTlQ4ICopIChwRGV2aWNlKS0+cE1lbVZpZXcgKyBPZmZzZXQpKQorI2RlZmluZSBSRUdfV1JfT0ZGU0VUKHBEZXZpY2UsIE9mZnNldCwgVmFsdWUzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3cml0ZWwoVmFsdWUzMiwgKChMTV9VSU5UOCAqKSAocERldmljZSktPnBNZW1WaWV3ICsgT2Zmc2V0KSkKKworCisvKiBUaGVyZSBjb3VsZCBiZSBwcm9ibGVtIGFjY2VzcyB0aGUgbWVtb3J5IHdpbmRvdyBkaXJlY3RseS4gIEZvciBub3csICovCisvKiB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggdGhlIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRU1fUkQocERldmljZSwgQWRkck5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMTV9NZW1SZEluZChwRGV2aWNlLCBPRkZTRVRPRihUM19GSVJTVF8zMktfU1JBTSwgQWRkck5hbWUpKQorI2RlZmluZSBNRU1fV1IocERldmljZSwgQWRkck5hbWUsIFZhbHVlMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMTV9NZW1XckluZChwRGV2aWNlLCBPRkZTRVRPRihUM19GSVJTVF8zMktfU1JBTSwgQWRkck5hbWUpLCBWYWx1ZTMyKQorCisjZGVmaW5lIE1FTV9SRF9PRkZTRVQocERldmljZSwgT2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExNX01lbVJkSW5kKHBEZXZpY2UsIE9mZnNldCkKKyNkZWZpbmUgTUVNX1dSX09GRlNFVChwRGV2aWNlLCBPZmZzZXQsIFZhbHVlMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTE1fTWVtV3JJbmQocERldmljZSwgT2Zmc2V0LCBWYWx1ZTMyKQorCisjZW5kaWYgIC8qIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQgKi8KKworI2VuZGlmICAvKiBKaW1teSwgbWVyZ2luZyAqLworCisgIC8qIEppbW15Li4ucmVzdCBvZiBmaWxlIGlzIG5ldyBzdHVmZiEgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBOSUMgcmVnaXN0ZXIgcmVhZC93cml0ZSBtYWNyb3MuICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNQUMgcmVnaXN0ZXIgYWNjZXNzLiAqLworTE1fVUlOVDMyIExNX1JlZ1JkSW5kKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFJlZ2lzdGVyKTsKK0xNX1ZPSUQgTE1fUmVnV3JJbmQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgUmVnaXN0ZXIsCisgICAgTE1fVUlOVDMyIFZhbHVlMzIpOworCisvKiBNQUMgbWVtb3J5IGFjY2Vzcy4gKi8KK0xNX1VJTlQzMiBMTV9NZW1SZEluZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBNZW1BZGRyKTsKK0xNX1ZPSUQgTE1fTWVtV3JJbmQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWVtQWRkciwKKyAgICBMTV9VSU5UMzIgVmFsdWUzMik7CisKKyNkZWZpbmUgTUJfUkVHX1dSKHBEZXZpY2UsIE9mZnNldE5hbWUsIFZhbHVlMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKHBEZXZpY2UpLT5VbmRpRml4KSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE1fUmVnV3JJbmQocERldmljZSwgT0ZGU0VUT0YoVDNfU1REX01FTV9NQVAsIE9mZnNldE5hbWUpKzB4NTYwMCwgICAgIFwKKyAgICAgICAgICAgIFZhbHVlMzIpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZvaWQpIF9fcmF3X3dyaXRlbChWYWx1ZTMyLCAmKChwRGV2aWNlKS0+cE1lbVZpZXctPk9mZnNldE5hbWUpKQorCisjZGVmaW5lIE1CX1JFR19SRChwRGV2aWNlLCBPZmZzZXROYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgocERldmljZSktPlVuZGlGaXgpID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExNX1JlZ1JkSW5kKHBEZXZpY2UsIE9GRlNFVE9GKFQzX1NURF9NRU1fTUFQLCBPZmZzZXROYW1lKSsweDU2MDApIDogICBcCisgICAgICAgIF9fcmF3X3JlYWRsKCYoKHBEZXZpY2UpLT5wTWVtVmlldy0+T2Zmc2V0TmFtZSkpKQorCisjZGVmaW5lIFJFR19SRChwRGV2aWNlLCBPZmZzZXROYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgocERldmljZSktPlVuZGlGaXgpID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExNX1JlZ1JkSW5kKHBEZXZpY2UsIE9GRlNFVE9GKFQzX1NURF9NRU1fTUFQLCBPZmZzZXROYW1lKSkgOiAgICAgICAgICBcCisgICAgICAgIF9fcmF3X3JlYWRsKCYoKHBEZXZpY2UpLT5wTWVtVmlldy0+T2Zmc2V0TmFtZSkpKQorCisjaWYgUENJWF9UQVJHRVRfV09SS0FST1VORAorCisjZGVmaW5lIFJFR19XUihwRGV2aWNlLCBPZmZzZXROYW1lLCBWYWx1ZTMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAoKHBEZXZpY2UpLT5FbmFibGVQY2lYRml4ID09IEZBTFNFKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh2b2lkKSBfX3Jhd193cml0ZWwoVmFsdWUzMiwgJigocERldmljZSktPnBNZW1WaWV3LT5PZmZzZXROYW1lKSkgOiAgICAgIFwKKyAgICBMTV9SZWdXckluZChwRGV2aWNlLCBPRkZTRVRPRihUM19TVERfTUVNX01BUCwgT2Zmc2V0TmFtZSksIFZhbHVlMzIpCisKKyNlbHNlCisKKyNkZWZpbmUgUkVHX1dSKHBEZXZpY2UsIE9mZnNldE5hbWUsIFZhbHVlMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19yYXdfd3JpdGVsKFZhbHVlMzIsICYoKHBEZXZpY2UpLT5wTWVtVmlldy0+T2Zmc2V0TmFtZSkpCisKKyNlbmRpZgorCisjZGVmaW5lIE1FTV9SRChwRGV2aWNlLCBBZGRyTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExNX01lbVJkSW5kKHBEZXZpY2UsIE9GRlNFVE9GKFQzX0ZJUlNUXzMyS19TUkFNLCBBZGRyTmFtZSkpCisjZGVmaW5lIE1FTV9XUihwRGV2aWNlLCBBZGRyTmFtZSwgVmFsdWUzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExNX01lbVdySW5kKHBEZXZpY2UsIE9GRlNFVE9GKFQzX0ZJUlNUXzMyS19TUkFNLCBBZGRyTmFtZSksIFZhbHVlMzIpCisKKyNkZWZpbmUgTUVNX1JEX09GRlNFVChwRGV2aWNlLCBPZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTE1fTWVtUmRJbmQocERldmljZSwgT2Zmc2V0KQorI2RlZmluZSBNRU1fV1JfT0ZGU0VUKHBEZXZpY2UsIE9mZnNldCwgVmFsdWUzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMTV9NZW1XckluZChwRGV2aWNlLCBPZmZzZXQsIFZhbHVlMzIpCisKKyNlbmRpZiAvKiBUSUdPTjNfSCAqLworCmRpZmYgLS1naXQgYS9kdHQvZHMxNjIxLmMgYi9kdHQvZHMxNjIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyNWY2NAotLS0gL2Rldi9udWxsCisrKyBiL2R0dC9kczE2MjEuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogRXJpayBUaGVpc2VuLCAgV2F2ZSA3IE9wdGljcywgZXRoZWlzZW5AbWluZHNwcmluZy5jb20uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIERhbGxhcyBTZW1pY29uZHVjdG9yJ3MgRFMxNjIxIERpZ2l0YWwgVGhlcm1vbWV0ZXIgYW5kIFRoZXJtb3N0YXQuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX0RUVF9EUzE2MjEKKyNpZiAhZGVmaW5lZChDRkdfRUVQUk9NX1BBR0VfV1JJVEVfRU5BQkxFKSB8fCBcCisgICAgICAgIChDRkdfRUVQUk9NX1BBR0VfV1JJVEVfQklUUyA8IDEpCisjIGVycm9yICJDRkdfRUVQUk9NX1BBR0VfV1JJVEVfRU5BQkxFIG11c3QgYmUgZGVmaW5lZCBhbmQgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0JJVFMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSB0byB1c2UgQ09ORklHX0RUVF9EUzE2MjEiCisjZW5kaWYKKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDxkdHQuaD4KKworLyoKKyAqIERldmljZSBjb2RlCisgKi8KKyNkZWZpbmUgRFRUX0kyQ19ERVZfQ09ERSAweDQ4CQkJLyogRGFsbGFzIFNlbWkncyBEUzE2MjEgKi8KKworaW50IGR0dF9yZWFkKGludCBzZW5zb3IsIGludCByZWcpCit7CisgICAgaW50IGRsZW47CisgICAgdWNoYXIgZGF0YVsyXTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHNlbnNvciBhZGRyZXNzIGFuZCBjb21tYW5kLgorICAgICAqCisgICAgICovCisgICAgc2Vuc29yID0gRFRUX0kyQ19ERVZfQ09ERSArIChzZW5zb3IgJiAweDA3KTsgLyogQ2FsY3VsYXRlIGFkZHIgb2YgZHMxNjIxKi8KKworICAgIC8qCisgICAgICogUHJlcGFyZSB0byBoYW5kbGUgMiBieXRlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBpZiAoKHJlZyA9PSBEVFRfUkVBRF9URU1QKSB8fAorCShyZWcgPT0gRFRUX1RFTVBfSElHSCkgfHwgKHJlZyA9PSBEVFRfVEVNUF9MT1cpKQorCWRsZW4gPSAyOworICAgIGVsc2UKKwlkbGVuID0gMTsKKworICAgIC8qCisgICAgICogTm93IHRyeSB0byByZWFkIHRoZSByZWdpc3Rlci4KKyAgICAgKi8KKyAgICBpZiAoaTJjX3JlYWQoc2Vuc29yLCByZWcsIDEsIGRhdGEsIGRsZW4pICE9IDApCisJcmV0dXJuIDE7CisKKyAgICAvKgorICAgICAqIEhhbmRsZSAyIGJ5dGUgcmVzdWx0LgorICAgICAqLworICAgIGlmIChkbGVuID09IDIpCisJcmV0dXJuICgoaW50KSgoc2hvcnQpZGF0YVsxXSArICgoKHNob3J0KWRhdGFbMF0pIDw8IDgpKSk7CisKKyAgICByZXR1cm4gKGludClkYXRhWzBdOworfSAvKiBkdHRfcmVhZCgpICovCisKKworaW50IGR0dF93cml0ZShpbnQgc2Vuc29yLCBpbnQgcmVnLCBpbnQgdmFsKQoreworICAgIGludCBkbGVuOworICAgIHVjaGFyIGRhdGFbMl07CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSBzZW5zb3IgYWRkcmVzcyBhbmQgcmVnaXN0ZXIuCisgICAgICoKKyAgICAgKi8KKyAgICBzZW5zb3IgPSBEVFRfSTJDX0RFVl9DT0RFICsgKHNlbnNvciAmIHNlbnNvcik7CisKKyAgICAvKgorICAgICAqIEhhbmRsZSB2YXJpb3VzIGRhdGEgc2l6ZXMuCisgICAgICovCisgICAgaWYgKChyZWcgPT0gRFRUX1JFQURfVEVNUCkgfHwKKwkocmVnID09IERUVF9URU1QX0hJR0gpIHx8IChyZWcgPT0gRFRUX1RFTVBfTE9XKSkgeworCWRsZW4gPSAyOworCWRhdGFbMF0gPSAoY2hhcikoKHZhbCA+PiA4KSAmIDB4ZmYpOwkvKiBNU0IgZmlyc3QgKi8KKwlkYXRhWzFdID0gKGNoYXIpKHZhbCAmIDB4ZmYpOworICAgIH0KKyAgICBlbHNlIGlmICgocmVnID09IERUVF9XUklURV9TVEFSVF9DT05WKSB8fCAocmVnID09IERUVF9XUklURV9TVE9QX0NPTlYpKSB7CisJZGxlbiA9IDA7CisJZGF0YVswXSA9IChjaGFyKTA7CisJZGF0YVsxXSA9IChjaGFyKTA7CisgICAgfQorICAgIGVsc2UgeworCWRsZW4gPSAxOworCWRhdGFbMF0gPSAoY2hhcikodmFsICYgMHhmZik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXcml0ZSB2YWx1ZSB0byBkZXZpY2UuCisgICAgICovCisgICAgaWYgKGkyY193cml0ZShzZW5zb3IsIHJlZywgMSwgZGF0YSwgZGxlbikgIT0gMCkKKwlyZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfSAvKiBkdHRfd3JpdGUoKSAqLworCisKK3N0YXRpYyBpbnQgX2R0dF9pbml0KGludCBzZW5zb3IpCit7CisgICAgaW50IHZhbDsKKworICAgIC8qCisgICAgICogU2V0dXAgSGlnaCBUZW1wLgorICAgICAqLworICAgIHZhbCA9ICgoQ0ZHX0RUVF9NQVhfVEVNUCAqIDIpIDw8IDcpICYgMHhmZjgwOworICAgIGlmIChkdHRfd3JpdGUoc2Vuc29yLCBEVFRfVEVNUF9ISUdILCB2YWwpICE9IDApCisJcmV0dXJuIDE7CisgICAgdWRlbGF5KDUwMDAwKTsJCQkJLyogTWF4IDUwbXMgKi8KKworICAgIC8qCisgICAgICogU2V0dXAgTG93IFRlbXAgLSBoeXN0ZXJlc2lzLgorICAgICAqLworICAgIHZhbCA9ICgoKENGR19EVFRfTUFYX1RFTVAgLSBDRkdfRFRUX0hZU1RFUkVTSVMpICogMikgPDwgNykgJiAweGZmODA7CisgICAgaWYgKGR0dF93cml0ZShzZW5zb3IsIERUVF9URU1QX0xPVywgdmFsKSAhPSAwKQorCXJldHVybiAxOworICAgIHVkZWxheSg1MDAwMCk7CQkJCS8qIE1heCA1MG1zICovCisKKyAgICAvKgorICAgICAqIFNldHVwIGNvbmZpZ3VyYXRvbiByZWdpc3RlcgorICAgICAqCisgICAgICogQ2xlYXIgVEhGICYgVExGLCBSZXNlcnZlZCA9IDEsIFBvbGFyaXR5ID0gQWN0aXZlIExvdywgT25lIFNob3QgPSBZRVMKKyAgICAgKgorICAgICAqIFdlIHJ1biBpbiBwb2xsZWQgbW9kZSwgc2luY2UgdGhlcmUgaXNuJ3QgYW55IHdheSB0byBrbm93IGlmIHRoaXMKKyAgICAgKiBsb3VzeSBkZXZpY2UgaXMgcmVhZHkgdG8gcHJvdmlkZSB0ZW1wZXJhdHVyZSByZWFkaW5ncyBvbiBwb3dlciB1cC4KKyAgICAgKi8KKyAgICB2YWwgPSAweDk7CisgICAgaWYgKGR0dF93cml0ZShzZW5zb3IsIERUVF9DT05GSUcsIHZhbCkgIT0gMCkKKwlyZXR1cm4gMTsKKyAgICB1ZGVsYXkoNTAwMDApOwkJCQkvKiBNYXggNTBtcyAqLworCisgICAgcmV0dXJuIDA7Cit9IC8qIF9kdHRfaW5pdCgpICovCisKKworaW50IGR0dF9pbml0ICh2b2lkKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgc2Vuc29yc1tdID0gQ09ORklHX0RUVF9TRU5TT1JTOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzZW5zb3JzKTsgaSsrKSB7CisJaWYgKF9kdHRfaW5pdChzZW5zb3JzW2ldKSAhPSAwKQorCSAgICBwcmludGYoIkRUVCVkOiAgRkFJTEVEXG4iLCBpKzEpOworCWVsc2UKKwkgICAgcHJpbnRmKCJEVFQlZDogICVpIENcbiIsIGkrMSwgZHR0X2dldF90ZW1wKHNlbnNvcnNbaV0pKTsKKyAgICB9CisKKyAgICByZXR1cm4gKDApOworfSAvKiBkdHRfaW5pdCgpICovCisKKworaW50IGR0dF9nZXRfdGVtcChpbnQgc2Vuc29yKQoreworICAgIGludCBpOworCisgICAgLyoKKyAgICAgKiBTdGFydCBhIGNvbnZlcnNpb24sIG1heSB0YWtlIHVwIHRvIDEgc2Vjb25kLgorICAgICAqLworICAgIGR0dF93cml0ZShzZW5zb3IsIERUVF9XUklURV9TVEFSVF9DT05WLCAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IDEwOyBpKyspIHsKKwl1ZGVsYXkoMTAwMDAwKTsKKwlpZiAoZHR0X3JlYWQoc2Vuc29yLCBEVFRfQ09ORklHKSAmIDB4ODApCisJICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAoZHR0X3JlYWQoc2Vuc29yLCBEVFRfUkVBRF9URU1QKSAvIDI1Nik7Cit9IC8qIGR0dF9nZXRfdGVtcCgpICovCisKKworI2VuZGlmIC8qIENPTkZJR19EVFRfRFMxNjIxICovCisKZGlmZiAtLWdpdCBhL2R0dC9sbTc1LmMgYi9kdHQvbG03NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzBhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kdHQvbG03NS5jCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBCaWxsIEh1bnRlciwgIFdhdmUgNyBPcHRpY3MsIHdpbGxpYW1odW50ZXJAbWVkaWFvbmUubmV0CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIE9uIFNlbWljb25kdWN0b3IncyBMTTc1IFRlbXBlcmF0dXJlIFNlbnNvcgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19EVFRfTE03NQorI2lmICFkZWZpbmVkKENGR19FRVBST01fUEFHRV9XUklURV9FTkFCTEUpIHx8IFwKKwkoQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0JJVFMgPCAxKQorIyBlcnJvciAiQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0VOQUJMRSBtdXN0IGJlIGRlZmluZWQgYW5kIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTIG11c3QgYmUgZ3JlYXRlciB0aGFuICAxIHRvIHVzZSBDT05GSUdfRFRUX0xNNzUiCisjZW5kaWYKKworI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGR0dC5oPgorCisKKy8qCisgKiBEZXZpY2UgY29kZQorICovCisjZGVmaW5lIERUVF9JMkNfREVWX0NPREUgMHg0OAkJCS8qIE9OIFNlbWkncyBMTTc1IGRldmljZSAqLworCitpbnQgZHR0X3JlYWQoaW50IHNlbnNvciwgaW50IHJlZykKK3sKKyAgICBpbnQgZGxlbjsKKyAgICB1Y2hhciBkYXRhWzJdOworCisgICAgLyoKKyAgICAgKiBWYWxpZGF0ZSAncmVnJyBwYXJhbQorICAgICAqLworICAgIGlmKChyZWcgPCAwKSB8fCAocmVnID4gMykpCisJcmV0dXJuIC0xOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgc2Vuc29yIGFkZHJlc3MgYW5kIHJlZ2lzdGVyLgorICAgICAqLworICAgIHNlbnNvciA9IERUVF9JMkNfREVWX0NPREUgKyAoc2Vuc29yICYgMHgwNyk7IC8qIGNhbGN1bGF0ZSBhZGRyZXNzIG9mIGxtNzUgKi8KKworICAgIC8qCisgICAgICogUHJlcGFyZSB0byBoYW5kbGUgMiBieXRlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBpZiAoKHJlZyA9PSBEVFRfUkVBRF9URU1QKSB8fAorCShyZWcgPT0gRFRUX1RFTVBfSFlTVCkgfHwKKwkocmVnID09IERUVF9URU1QX1NFVCkpCisJZGxlbiA9IDI7CisgICAgZWxzZQorCWRsZW4gPSAxOworCisgICAgLyoKKyAgICAgKiBOb3cgdHJ5IHRvIHJlYWQgdGhlIHJlZ2lzdGVyLgorICAgICAqLworICAgIGlmIChpMmNfcmVhZChzZW5zb3IsIHJlZywgMSwgZGF0YSwgZGxlbikgIT0gMCkKKwlyZXR1cm4gLTE7CisKKyAgICAvKgorICAgICAqIEhhbmRsZSAyIGJ5dGUgcmVzdWx0LgorICAgICAqLworICAgIGlmIChkbGVuID09IDIpCisJcmV0dXJuICgoaW50KSgoc2hvcnQpZGF0YVsxXSArICgoKHNob3J0KWRhdGFbMF0pIDw8IDgpKSk7CisKKworICAgIHJldHVybiAoaW50KWRhdGFbMF07Cit9IC8qIGR0dF9yZWFkKCkgKi8KKworCitpbnQgZHR0X3dyaXRlKGludCBzZW5zb3IsIGludCByZWcsIGludCB2YWwpCit7CisgICAgaW50IGRsZW47CisgICAgdWNoYXIgZGF0YVsyXTsKKworICAgIC8qCisgICAgICogVmFsaWRhdGUgJ3JlZycgcGFyYW0KKyAgICAgKi8KKyAgICBpZiAoKHJlZyA8IDApIHx8IChyZWcgPiAzKSkKKwlyZXR1cm4gMTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHNlbnNvciBhZGRyZXNzIGFuZCByZWdpc3Rlci4KKyAgICAgKi8KKyAgICBzZW5zb3IgPSBEVFRfSTJDX0RFVl9DT0RFICsgKHNlbnNvciAmIDB4MDcpOyAvKiBjYWxjdWxhdGUgYWRkcmVzcyBvZiBsbTc1ICovCisKKyAgICAvKgorICAgICAqIEhhbmRsZSAyIGJ5dGUgdmFsdWVzLgorICAgICAqLworICAgIGlmICgocmVnID09IERUVF9SRUFEX1RFTVApIHx8CisJKHJlZyA9PSBEVFRfVEVNUF9IWVNUKSB8fAorCShyZWcgPT0gRFRUX1RFTVBfU0VUKSkgeworCWRsZW4gPSAyOworCWRhdGFbMF0gPSAoY2hhcikoKHZhbCA+PiA4KSAmIDB4ZmYpOwkvKiBNU0IgZmlyc3QgKi8KKwlkYXRhWzFdID0gKGNoYXIpKHZhbCAmIDB4ZmYpOworICAgIH0gZWxzZSB7CisJZGxlbiA9IDE7CisJZGF0YVswXSA9IChjaGFyKSh2YWwgJiAweGZmKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdyaXRlIHZhbHVlIHRvIHJlZ2lzdGVyLgorICAgICAqLworICAgIGlmIChpMmNfd3JpdGUoc2Vuc29yLCByZWcsIDEsIGRhdGEsIGRsZW4pICE9IDApCisJcmV0dXJuIDE7CisKKyAgICByZXR1cm4gMDsKK30gLyogZHR0X3dyaXRlKCkgKi8KKworCitzdGF0aWMgaW50IF9kdHRfaW5pdChpbnQgc2Vuc29yKQoreworICAgIGludCB2YWw7CisKKyAgICAvKgorICAgICAqIFNldHVwIFRTRVQgKCB0cmlwIHBvaW50ICkgcmVnaXN0ZXIKKyAgICAgKi8KKyAgICB2YWwgPSAoKENGR19EVFRfTUFYX1RFTVAgKiAyKSA8PCA3KSAmIDB4ZmY4MDsgLyogdHJpcCAqLworICAgIGlmIChkdHRfd3JpdGUoc2Vuc29yLCBEVFRfVEVNUF9TRVQsIHZhbCkgIT0gMCkKKwlyZXR1cm4gMTsKKworICAgIC8qCisgICAgICogU2V0dXAgVEhZU1QgKCB1bnRyaXAgcG9pbnQgKSByZWdpc3RlciAtIEh5c3RlcmVzaXMKKyAgICAgKi8KKyAgICB2YWwgPSAoKChDRkdfRFRUX01BWF9URU1QIC0gQ0ZHX0RUVF9IWVNURVJFU0lTKSAqIDIpIDw8IDcpICYgMHhmZjgwOworICAgIGlmIChkdHRfd3JpdGUoc2Vuc29yLCBEVFRfVEVNUF9IWVNULCB2YWwpICE9IDApCisJcmV0dXJuIDE7CisKKyAgICAvKgorICAgICAqIFNldHVwIGNvbmZpZ3VyYXRvbiByZWdpc3RlcgorICAgICAqLworICAgIC8qIGNvbmZpZyA9IDYgc2FtcGxlIGludGVncmF0aW9uLCBpbnQgbW9kZSwgYWN0aXZlIGxvdywgYW5kIGVuYWJsZSAqLworICAgIHZhbCA9IDB4MTg7CisgICAgaWYgKGR0dF93cml0ZShzZW5zb3IsIERUVF9DT05GSUcsIHZhbCkgIT0gMCkKKwlyZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfSAvKiBfZHR0X2luaXQoKSAqLworCisKK2ludCBkdHRfaW5pdCAodm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyIHNlbnNvcnNbXSA9IENPTkZJR19EVFRfU0VOU09SUzsKKyAgICBjb25zdCBjaGFyICpjb25zdCBoZWFkZXIgPSAiRFRUOiAgICI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNlbnNvcnMpOyBpKyspIHsKKwlpZiAoX2R0dF9pbml0KHNlbnNvcnNbaV0pICE9IDApCisJICAgIHByaW50ZigiJXMlZCBGQUlMRUQgSU5JVFxuIiwgaGVhZGVyLCBpKzEpOworCWVsc2UKKwkgICAgcHJpbnRmKCIlcyVkIGlzICVpIENcbiIsIGhlYWRlciwgaSsxLAorCQkgICBkdHRfZ2V0X3RlbXAoc2Vuc29yc1tpXSkpOworICAgIH0KKworICAgIHJldHVybiAoMCk7Cit9IC8qIGR0dF9pbml0KCkgKi8KKworaW50IGR0dF9nZXRfdGVtcChpbnQgc2Vuc29yKQoreworICAgIHJldHVybiAoZHR0X3JlYWQoc2Vuc29yLCBEVFRfUkVBRF9URU1QKSAvIDI1Nik7Cit9IC8qIGR0dF9nZXRfdGVtcCgpICovCisKKyNlbmRpZiAvKiBDT05GSUdfRFRUX0xNNzUgKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hbHRlcmEuaCBiL2luY2x1ZGUvYWx0ZXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmNzJkYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYWx0ZXJhLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogUmljaCBJcmVsYW5kLCBFbnRlcmFzeXMgTmV0d29ya3MsIHJpcmVsYW5kQGVudGVyYXN5cy5jb20uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxmcGdhLmg+CisKKyNpZm5kZWYgX0FMVEVSQV9IXworI2RlZmluZSBfQUxURVJBX0hfCisKKy8qCisgKiBOb3RlIHRoYXQgdGhpcyBpcyBqdXN0ICBBbHRlcmEgRlBHQSBpbnRlcmZhY2UgYm9pbGVycGxhdGUuCisgKiBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBBbHRlcmEgZGV2aWNlcyB5ZXQuCisgKgorICogU2VlIGluY2x1ZGUveGlsaW54LmggZm9yIGEgd29ya2luZyBleGFtcGxlLgorICovCisKKy8qIEluIHlvdXIgYm9hcmQncyBjb25maWcuaCBmaWxlIHlvdSBzaG91bGQgZGVmaW5lIENPTkZJR19GUEdBIGFzIHN1Y2g6CisgKgkjZGVmaW5lIENPTkZJR19GUEdBIAkoQ0ZHX0FMVEVSQV94eHggfCBDRkdfQUxURVJBX0lGX3h4eCApCisgKi8KKworLyogQWx0ZXJhIE1vZGVsIGRlZmluaXRpb25zICovCisjZGVmaW5lIENGR19BTFRFUkFfeHh4eAkJKCBDRkdfRlBHQV9BTFRFUkEgfCBDRkdfRlBHQV9ERVYoIDB4MSApKQorLyogQWRkIG5ldyBtb2RlbHMgaGVyZSAqLworCisvKiBBbHRlcmEgSW50ZXJmYWNlIGRlZmluaXRpb25zICovCisjZGVmaW5lIENGR19BTFRFUkFfSUZfeHh4CQlDRkdfRlBHQV9JRiggMHgxICkKKy8qIEFkZCBuZXcgaW50ZXJmYWNlcyBoZXJlICovCisKK3R5cGVkZWYgZW51bSB7ICAgICAgICAgICAgICAgICAgICAgLyogdHlwZWRlZiBBbHRlcmFfaWZhY2UgKi8KKyAgICBtaW5fYWx0ZXJhX2lmYWNlX3R5cGUsICAgICAgICAvKiBpbnNlcnQgYWxsIG5ldyB0eXBlcyBhZnRlciB0aGlzICovCisvKiBBZGQgbmV3IGludGVyZmFjZXMgaGVyZSAqLworICAgIG1heF9hbHRlcmFfaWZhY2VfdHlwZSAgICAgICAgIC8qIGluc2VydCBhbGwgbmV3IHR5cGVzIGJlZm9yZSB0aGlzICovCit9IEFsdGVyYV9pZmFjZTsgICAgICAgICAgICAgICAgICAgLyogZW5kLCB0eXBlZGVmIEFsdGVyYV9pZmFjZSAqLworCit0eXBlZGVmIGVudW0geyAgICAgICAgICAgICAgICAgICAgIC8qIHR5cGVkZWYgQWx0ZXJhX0ZhbWlseSAqLworICAgIG1pbl9hbHRlcmFfdHlwZSwgICAgICAgICAgICAgIC8qIGluc2VydCBhbGwgbmV3IHR5cGVzIGFmdGVyIHRoaXMgKi8KKy8qIEFkZCBuZXcgbW9kZWxzIGhlcmUgKi8KKyAgICBtYXhfYWx0ZXJhX3R5cGUgICAgICAgICAgICAgICAvKiBpbnNlcnQgYWxsIG5ldyB0eXBlcyBiZWZvcmUgdGhpcyAqLworfSBBbHRlcmFfRmFtaWx5OyAgICAgICAgICAgICAgICAgIC8qIGVuZCwgdHlwZWRlZiBBbHRlcmFfRmFtaWx5ICovCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgLyogdHlwZWRlZiBBbHRlcmFfZGVzYyAqLworICAgIEFsdGVyYV9GYW1pbHkgICAgZmFtaWx5OyAgICAgIC8qIHBhcnQgdHlwZSAqLworICAgIEFsdGVyYV9pZmFjZSAgICAgaWZhY2U7ICAgICAgIC8qIGludGVyZmFjZSB0eXBlICovCisgICAgc2l6ZV90ICAgICAgICAgICAgc2l6ZTsgICAgICAgIC8qIGJ5dGVzIG9mIGRhdGEgcGFydCBjYW4gYWNjZXB0ICovCisgICAgdm9pZCAqICAgICAgICAgICAgYmFzZTsgICAgICAgIC8qIGJhc2UgaW50ZXJmYWNlIGFkZHJlc3MgKi8KK30gQWx0ZXJhX2Rlc2M7ICAgICAgICAgICAgICAgICAgICAvKiBlbmQsIHR5cGVkZWYgQWx0ZXJhX2Rlc2MgKi8KKworZXh0ZXJuIGludCBhbHRlcmFfbG9hZCggQWx0ZXJhX2Rlc2MgKmRlc2MsIHZvaWQgKmltYWdlLCBzaXplX3Qgc2l6ZSApOworZXh0ZXJuIGludCBhbHRlcmFfZHVtcCggQWx0ZXJhX2Rlc2MgKmRlc2MsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJzaXplICk7CitleHRlcm4gaW50IGFsdGVyYV9pbmZvKCBBbHRlcmFfZGVzYyAqZGVzYyApOworZXh0ZXJuIGludCBhbHRlcmFfcmVsb2MoIEFsdGVyYV9kZXNjICpkZXNjLCB1bG9uZyByZWxvY19vZmYgKTsKKworI2VuZGlmICAvKiBfQUxURVJBX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYml0b3BzLmggYi9pbmNsdWRlL2FzbS1hcm0vYml0b3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczMzg1OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9iaXRvcHMuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk1LCBSdXNzZWxsIEtpbmcuCisgKiBWYXJpb3VzIGJpdHMgYW5kIHBpZWNlcyBjb3B5cmlnaHRzIGluY2x1ZGU6CisgKiAgTGludXMgVG9ydmFsZHMgKHRlc3RfYml0KS4KKyAqCisgKiBiaXQgMCBpcyB0aGUgTFNCIG9mIGFkZHI7IGJpdCAzMiBpcyB0aGUgTFNCIG9mIChhZGRyKzEpLgorICoKKyAqIFBsZWFzZSBub3RlIHRoYXQgdGhlIGNvZGUgaW4gdGhpcyBmaWxlIHNob3VsZCBuZXZlciBiZSBpbmNsdWRlZAorICogZnJvbSB1c2VyIHNwYWNlLiAgTWFueSBvZiB0aGVzZSBhcmUgbm90IGltcGxlbWVudGVkIGluIGFzc2VtYmxlcgorICogc2luY2UgdGhleSB3b3VsZCBiZSB0b28gY29zdGx5LiAgQWxzbywgdGhleSByZXF1aXJlIHByaXZpbGVkZ2VkCisgKiBpbnN0cnVjdGlvbnMgKHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIGZyb20gdXNlciBtb2RlKSB0byBlbnN1cmUKKyAqIHRoYXQgdGhleSBhcmUgYXRvbWljLgorICovCisKKyNpZm5kZWYgX19BU01fQVJNX0JJVE9QU19ICisjZGVmaW5lIF9fQVNNX0FSTV9CSVRPUFNfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKQlkbyB7IH0gd2hpbGUgKDApCisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIHRvIGtlZXAgZ2NjIC1XYWxsIGhhcHB5LgorICovCitleHRlcm4gdm9pZCBzZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKK3sKKwkoKHVuc2lnbmVkIGNoYXIgKikgYWRkcilbbnIgPj4gM10gfD0gKDFVIDw8IChuciAmIDcpKTsKK30KKworZXh0ZXJuIHZvaWQgY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQoreworCSgodW5zaWduZWQgY2hhciAqKSBhZGRyKVtuciA+PiAzXSAmPSB+KDFVIDw8IChuciAmIDcpKTsKK30KKworZXh0ZXJuIHZvaWQgY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKTsKKworc3RhdGljIGlubGluZSB2b2lkIF9fY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJKCh1bnNpZ25lZCBjaGFyICopIGFkZHIpW25yID4+IDNdIF49ICgxVSA8PCAobnIgJiA3KSk7Cit9CisKK2V4dGVybiBpbnQgdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKTsKKworc3RhdGljIGlubGluZSBpbnQgX190ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKG5yICYgNyk7CisJdW5zaWduZWQgaW50IG9sZHZhbDsKKworCW9sZHZhbCA9ICgodW5zaWduZWQgY2hhciAqKSBhZGRyKVtuciA+PiAzXTsKKwkoKHVuc2lnbmVkIGNoYXIgKikgYWRkcilbbnIgPj4gM10gPSBvbGR2YWwgfCBtYXNrOworCXJldHVybiBvbGR2YWwgJiBtYXNrOworfQorCitleHRlcm4gaW50IHRlc3RfYW5kX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKTsKKworc3RhdGljIGlubGluZSBpbnQgX190ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAobnIgJiA3KTsKKwl1bnNpZ25lZCBpbnQgb2xkdmFsOworCisJb2xkdmFsID0gKCh1bnNpZ25lZCBjaGFyICopIGFkZHIpW25yID4+IDNdOworCSgodW5zaWduZWQgY2hhciAqKSBhZGRyKVtuciA+PiAzXSA9IG9sZHZhbCAmIH5tYXNrOworCXJldHVybiBvbGR2YWwgJiBtYXNrOworfQorCitleHRlcm4gaW50IHRlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcik7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChuciAmIDcpOworCXVuc2lnbmVkIGludCBvbGR2YWw7CisKKwlvbGR2YWwgPSAoKHVuc2lnbmVkIGNoYXIgKikgYWRkcilbbnIgPj4gM107CisJKCh1bnNpZ25lZCBjaGFyICopIGFkZHIpW25yID4+IDNdID0gb2xkdmFsIF4gbWFzazsKKwlyZXR1cm4gb2xkdmFsICYgbWFzazsKK30KKworZXh0ZXJuIGludCBmaW5kX2ZpcnN0X3plcm9fYml0KHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBzaXplKTsKK2V4dGVybiBpbnQgZmluZF9uZXh0X3plcm9fYml0KHZvaWQgKiBhZGRyLCBpbnQgc2l6ZSwgaW50IG9mZnNldCk7CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgZG9lc24ndCBuZWVkIHRvIGJlIGF0b21pYy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGVzdF9iaXQoaW50IG5yLCBjb25zdCB2b2lkICogYWRkcikKK3sKKyAgICByZXR1cm4gKCh1bnNpZ25lZCBjaGFyICopIGFkZHIpW25yID4+IDNdICYgKDFVIDw8IChuciAmIDcpKTsKK30KKworLyoKKyAqIGZmeiA9IEZpbmQgRmlyc3QgWmVybyBpbiB3b3JkLiBVbmRlZmluZWQgaWYgbm8gemVybyBleGlzdHMsCisgKiBzbyBjb2RlIHNob3VsZCBjaGVjayBhZ2FpbnN0IH4wVUwgZmlyc3QuLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZmZ6KHVuc2lnbmVkIGxvbmcgd29yZCkKK3sKKwlpbnQgazsKKworCXdvcmQgPSB+d29yZDsKKwlrID0gMzE7CisJaWYgKHdvcmQgJiAweDAwMDBmZmZmKSB7IGsgLT0gMTY7IHdvcmQgPDw9IDE2OyB9CisJaWYgKHdvcmQgJiAweDAwZmYwMDAwKSB7IGsgLT0gODsgIHdvcmQgPDw9IDg7ICB9CisJaWYgKHdvcmQgJiAweDBmMDAwMDAwKSB7IGsgLT0gNDsgIHdvcmQgPDw9IDQ7ICB9CisJaWYgKHdvcmQgJiAweDMwMDAwMDAwKSB7IGsgLT0gMjsgIHdvcmQgPDw9IDI7ICB9CisJaWYgKHdvcmQgJiAweDQwMDAwMDAwKSB7IGsgLT0gMTsgfQorICAgICAgICByZXR1cm4gazsKK30KKworLyoKKyAqIGZmczogZmluZCBmaXJzdCBiaXQgc2V0LiBUaGlzIGlzIGRlZmluZWQgdGhlIHNhbWUgd2F5IGFzCisgKiB0aGUgbGliYyBhbmQgY29tcGlsZXIgYnVpbHRpbiBmZnMgcm91dGluZXMsIHRoZXJlZm9yZQorICogZGlmZmVycyBpbiBzcGlyaXQgZnJvbSB0aGUgYWJvdmUgZmZ6IChtYW4gZmZzKS4KKyAqLworCisjZGVmaW5lIGZmcyh4KSBnZW5lcmljX2Zmcyh4KQorCisvKgorICogaHdlaWdodE46IHJldHVybnMgdGhlIGhhbW1pbmcgd2VpZ2h0IChpLmUuIHRoZSBudW1iZXIKKyAqIG9mIGJpdHMgc2V0KSBvZiBhIE4tYml0IHdvcmQKKyAqLworCisjZGVmaW5lIGh3ZWlnaHQzMih4KSBnZW5lcmljX2h3ZWlnaHQzMih4KQorI2RlZmluZSBod2VpZ2h0MTYoeCkgZ2VuZXJpY19od2VpZ2h0MTYoeCkKKyNkZWZpbmUgaHdlaWdodDgoeCkgZ2VuZXJpY19od2VpZ2h0OCh4KQorCisjZGVmaW5lIGV4dDJfc2V0X2JpdAkJCXRlc3RfYW5kX3NldF9iaXQKKyNkZWZpbmUgZXh0Ml9jbGVhcl9iaXQJCQl0ZXN0X2FuZF9jbGVhcl9iaXQKKyNkZWZpbmUgZXh0Ml90ZXN0X2JpdAkJCXRlc3RfYml0CisjZGVmaW5lIGV4dDJfZmluZF9maXJzdF96ZXJvX2JpdAlmaW5kX2ZpcnN0X3plcm9fYml0CisjZGVmaW5lIGV4dDJfZmluZF9uZXh0X3plcm9fYml0CQlmaW5kX25leHRfemVyb19iaXQKKworLyogQml0bWFwIGZ1bmN0aW9ucyBmb3IgdGhlIG1pbml4IGZpbGVzeXN0ZW0uICovCisjZGVmaW5lIG1pbml4X3Rlc3RfYW5kX3NldF9iaXQobnIsYWRkcikJdGVzdF9hbmRfc2V0X2JpdChucixhZGRyKQorI2RlZmluZSBtaW5peF9zZXRfYml0KG5yLGFkZHIpCQlzZXRfYml0KG5yLGFkZHIpCisjZGVmaW5lIG1pbml4X3Rlc3RfYW5kX2NsZWFyX2JpdChucixhZGRyKQl0ZXN0X2FuZF9jbGVhcl9iaXQobnIsYWRkcikKKyNkZWZpbmUgbWluaXhfdGVzdF9iaXQobnIsYWRkcikJCXRlc3RfYml0KG5yLGFkZHIpCisjZGVmaW5lIG1pbml4X2ZpbmRfZmlyc3RfemVyb19iaXQoYWRkcixzaXplKQlmaW5kX2ZpcnN0X3plcm9fYml0KGFkZHIsc2l6ZSkKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9BUk1fQklUT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wcm9jLWFybXYvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1hcm0vcHJvYy1hcm12L3B0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNzA4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vcHJvYy1hcm12L3B0cmFjZS5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9wcm9jLWFybXYvcHRyYWNlLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBfX0FTTV9QUk9DX1BUUkFDRV9ICisjZGVmaW5lIF9fQVNNX1BST0NfUFRSQUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjZGVmaW5lIFVTUjI2X01PREUJMHgwMAorI2RlZmluZSBGSVEyNl9NT0RFCTB4MDEKKyNkZWZpbmUgSVJRMjZfTU9ERQkweDAyCisjZGVmaW5lIFNWQzI2X01PREUJMHgwMworI2RlZmluZSBVU1JfTU9ERQkweDEwCisjZGVmaW5lIEZJUV9NT0RFCTB4MTEKKyNkZWZpbmUgSVJRX01PREUJMHgxMgorI2RlZmluZSBTVkNfTU9ERQkweDEzCisjZGVmaW5lIEFCVF9NT0RFCTB4MTcKKyNkZWZpbmUgVU5EX01PREUJMHgxYgorI2RlZmluZSBTWVNURU1fTU9ERQkweDFmCisjZGVmaW5lIE1PREVfTUFTSwkweDFmCisjZGVmaW5lIFRfQklUCQkweDIwCisjZGVmaW5lIEZfQklUCQkweDQwCisjZGVmaW5lIElfQklUCQkweDgwCisjZGVmaW5lIENDX1ZfQklUCSgxIDw8IDI4KQorI2RlZmluZSBDQ19DX0JJVAkoMSA8PCAyOSkKKyNkZWZpbmUgQ0NfWl9CSVQJKDEgPDwgMzApCisjZGVmaW5lIENDX05fQklUCSgxIDw8IDMxKQorI2RlZmluZSBQQ01BU0sJCTAKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogdGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgd2F5IHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBvbiB0aGUKKyAgIHN0YWNrIGR1cmluZyBhIHN5c3RlbSBjYWxsLiAqLworCitzdHJ1Y3QgcHRfcmVncyB7CisJbG9uZyB1cmVnc1sxOF07Cit9OworCisjZGVmaW5lIEFSTV9jcHNyCXVyZWdzWzE2XQorI2RlZmluZSBBUk1fcGMJCXVyZWdzWzE1XQorI2RlZmluZSBBUk1fbHIJCXVyZWdzWzE0XQorI2RlZmluZSBBUk1fc3AJCXVyZWdzWzEzXQorI2RlZmluZSBBUk1faXAJCXVyZWdzWzEyXQorI2RlZmluZSBBUk1fZnAJCXVyZWdzWzExXQorI2RlZmluZSBBUk1fcjEwCQl1cmVnc1sxMF0KKyNkZWZpbmUgQVJNX3I5CQl1cmVnc1s5XQorI2RlZmluZSBBUk1fcjgJCXVyZWdzWzhdCisjZGVmaW5lIEFSTV9yNwkJdXJlZ3NbN10KKyNkZWZpbmUgQVJNX3I2CQl1cmVnc1s2XQorI2RlZmluZSBBUk1fcjUJCXVyZWdzWzVdCisjZGVmaW5lIEFSTV9yNAkJdXJlZ3NbNF0KKyNkZWZpbmUgQVJNX3IzCQl1cmVnc1szXQorI2RlZmluZSBBUk1fcjIJCXVyZWdzWzJdCisjZGVmaW5lIEFSTV9yMQkJdXJlZ3NbMV0KKyNkZWZpbmUgQVJNX3IwCQl1cmVnc1swXQorI2RlZmluZSBBUk1fT1JJR19yMAl1cmVnc1sxN10KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSB1c2VyX21vZGUocmVncykJXAorCSgoKHJlZ3MpLT5BUk1fY3BzciAmIDB4ZikgPT0gMCkKKworI2lmZGVmIENPTkZJR19BUk1fVEhVTUIKKyNkZWZpbmUgdGh1bWJfbW9kZShyZWdzKSBcCisJKCgocmVncyktPkFSTV9jcHNyICYgVF9CSVQpKQorI2Vsc2UKKyNkZWZpbmUgdGh1bWJfbW9kZShyZWdzKSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIHByb2Nlc3Nvcl9tb2RlKHJlZ3MpIFwKKwkoKHJlZ3MpLT5BUk1fY3BzciAmIE1PREVfTUFTSykKKworI2RlZmluZSBpbnRlcnJ1cHRzX2VuYWJsZWQocmVncykgXAorCSghKChyZWdzKS0+QVJNX2Nwc3IgJiBJX0JJVCkpCisKKyNkZWZpbmUgZmFzdF9pbnRlcnJ1cHRzX2VuYWJsZWQocmVncykgXAorCSghKChyZWdzKS0+QVJNX2Nwc3IgJiBGX0JJVCkpCisKKyNkZWZpbmUgY29uZGl0aW9uX2NvZGVzKHJlZ3MpIFwKKwkoKHJlZ3MpLT5BUk1fY3BzciAmIChDQ19WX0JJVHxDQ19DX0JJVHxDQ19aX0JJVHxDQ19OX0JJVCkpCisKKy8qIEFyZSB0aGUgY3VycmVudCByZWdpc3RlcnMgc3VpdGFibGUgZm9yIHVzZXIgbW9kZT8KKyAqICh1c2VkIHRvIG1haW50YWluIHNlY3VyaXR5IGluIHNpZ25hbCBoYW5kbGVycykKKyAqLworc3RhdGljIGlubGluZSBpbnQgdmFsaWRfdXNlcl9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICgocmVncy0+QVJNX2Nwc3IgJiAweGYpID09IDAgJiYKKwkgICAgKHJlZ3MtPkFSTV9jcHNyICYgKEZfQklUfElfQklUKSkgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIEZvcmNlIENQU1IgdG8gc29tZXRoaW5nIGxvZ2ljYWwuLi4KKwkgKi8KKwlyZWdzLT5BUk1fY3BzciAmPSAoQ0NfVl9CSVR8Q0NfQ19CSVR8Q0NfWl9CSVR8Q0NfTl9CSVR8MHgxMCk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3UtYm9vdC1hcm0uaCBiL2luY2x1ZGUvYXNtLWFybS91LWJvb3QtYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1YjFlNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS91LWJvb3QtYXJtLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFsZXggWnVlcGtlIDxhenVAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfVV9CT09UX0FSTV9IXworI2RlZmluZSBfVV9CT09UX0FSTV9IXwkxCisKKy8qIGZvciB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcywgc2VlIHN0YXJ0LlMgKi8KK2V4dGVybiB1bG9uZyBfYXJtYm9vdF9zdGFydDsJLyogY29kZSBzdGFydCAqLworZXh0ZXJuIHVsb25nIF9hcm1ib290X2VuZF9kYXRhOwkvKiBjb2RlICsgZGF0YSBlbmQgKi8KK2V4dGVybiB1bG9uZyBfYXJtYm9vdF9lbmQ7CS8qIEJTUyBlbmQgKi8KK2V4dGVybiB1bG9uZyBJUlFfU1RBQ0tfU1RBUlQ7CS8qIHRvcCBvZiBJUlEgc3RhY2sgKi8KK2V4dGVybiB1bG9uZyBGSVFfU1RBQ0tfU1RBUlQ7CS8qIHRvcCBvZiBGSVEgc3RhY2sgKi8KK2V4dGVybiB1bG9uZyBfYXJtYm9vdF9yZWFsX2VuZDsJLyogZmlyc3QgdXNhYmxlIFJBTSBhZGRyZXNzICovCisKKy8qIGNwdS8uLi4vY3B1LmMgKi8KK2ludAljcHVfaW5pdCh2b2lkKTsKK2ludAljbGVhbnVwX2JlZm9yZV9saW51eCh2b2lkKTsKKworLyogYm9hcmQvLi4uLy4uLiAqLworaW50CWJvYXJkX2luaXQodm9pZCk7CitpbnQJZHJhbV9pbml0ICh2b2lkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBIZXJlIGlzIGEgbGlzdCBvZiBzb21lIHByb3RvdHlwZXMgd2hpY2ggYXJlIGluY29tcGF0aWJsZSB0bwkqLworLyogdGhlIFUtQm9vdCBpbXBsZW1lbnRhdGlvbgkJCQkJKi8KKy8qIFRvIGJlIGZpeGVkIQkJCQkJCQkqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBjb21tb24vY21kX252ZWRpdC5jICovCit2b2lkCXNldGVudgkJKGNoYXIgKiwgY2hhciAqKTsKKworLyogY3B1Ly4uLi9pbnRlcnJ1cHQuYyAqLwordm9pZAlyZXNldF90aW1lcl9tYXNrZWQJKHZvaWQpOwordWxvbmcJZ2V0X3RpbWVyX21hc2tlZAkodm9pZCk7Cit2b2lkCXVkZWxheV9tYXNrZWQJCSh1bnNpZ25lZCBsb25nIHVzZWMpOworCisjZW5kaWYJLyogX1VfQk9PVF9BUk1fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS91LWJvb3QuaCBiL2luY2x1ZGUvYXNtLWFybS91LWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2IwZTRhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL3UtYm9vdC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBBbGV4IFp1ZXBrZSA8YXp1QHN5c2dvLmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX1VfQk9PVF9IXworI2RlZmluZSBfVV9CT09UX0hfCTEKKwordHlwZWRlZiBzdHJ1Y3QgYmRfaW5mbyB7CisgICAgaW50CQkJYmlfYmF1ZHJhdGU7CS8qIHNlcmlhbCBjb25zb2xlIGJhdWRyYXRlICovCisgICAgdW5zaWduZWQgbG9uZwliaV9pcF9hZGRyOwkvKiBJUCBBZGRyZXNzICovCisgICAgdW5zaWduZWQgY2hhcgliaV9lbmV0YWRkcls2XTsgLyogRXRoZXJuZXQgYWRyZXNzICovCisgICAgc3RydWN0IGVudmlyb25tZW50X3MJICAgICAgICpiaV9lbnY7CisgICAgdWxvbmcJICAgICAgICBiaV9hcmNoX251bWJlcjsJLyogdW5pcXVlIGlkIGZvciB0aGlzIGJvYXJkICovCisgICAgdWxvbmcJICAgICAgICBiaV9ib290X3BhcmFtczsJLyogd2hlcmUgdGhpcyBib2FyZCBleHBlY3RzIHBhcmFtcyAqLworICAgIHN0cnVjdAkJCQkvKiBSQU0gY29uZmlndXJhdGlvbiAqLworICAgIHsKKwl1bG9uZyBzdGFydDsKKwl1bG9uZyBzaXplOworICAgIH0gCQkJYmlfZHJhbVtDT05GSUdfTlJfRFJBTV9CQU5LU107Cit9IGJkX3Q7CisKKyNkZWZpbmUgYmlfZW52X2RhdGEgYmlfZW52LT5kYXRhCisjZGVmaW5lIGJpX2Vudl9jcmMgIGJpX2Vudi0+Y3JjCisKKyNlbmRpZgkvKiBfVV9CT09UX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NtZF9ic3AuaCBiL2luY2x1ZGUvY21kX2JzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOWQ1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NtZF9ic3AuaApAQCAtMCwwICsxLDMxMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9DTURfQlNQX0hfCisjZGVmaW5lIF9DTURfQlNQX0hfCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisKKy8qIC0tLS0tIExXTU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19MV01PTikKKworI2RlZmluZQlDTURfVEJMX0JTUAlNS19DTURfVEJMX0VOVFJZKAkJCQkJXAorCSJwaWMiLAkzLAk0LAkxLAlkb19waWMsCQkJCQlcCisJInBpYyAgICAgLSByZWFkIGFuZCB3cml0ZSBQSUMgcmVnaXN0ZXJzXG4iLAkJCQlcCisJInJlYWQgIHJlZyAgICAgIC0gcmVhZCBQSUMgcmVnaXN0ZXIgYHJlZydcbiIJCQkJXAorCSJwaWMgd3JpdGUgcmVnIHZhbCAgLSB3cml0ZSB2YWx1ZSBgdmFsJyB0byBQSUMgcmVnaXN0ZXIgYHJlZydcbiIJXAorKSwgIE1LX0NNRF9UQkxfRU5UUlkoCQkJCQkJCQlcCisJImtiZCIsCTMsCTEsCTEsCWRvX2tiZCwJCQkJCVwKKwkia2JkICAgICAtIHJlYWQga2V5Ym9hcmQgc3RhdHVzXG4iLAkJCQkJXAorCU5VTEwJCQkJCQkJCQlcCispLCAgTUtfQ01EX1RCTF9FTlRSWSgJCQkJCQkJCVwKKwkibHNiIiwJMywJMiwJMSwJZG9fbHNiLAkJCQkJXAorCSJsc2IgICAgIC0gY2hlY2sgYW5kIHNldCBMU0Igc3dpdGNoXG4iLAkJCQkJXAorCSJvbiAgLSBzd2l0Y2ggTFNCIG9uXG4iCQkJCQkJCVwKKwkibHNiIG9mZiAtIHN3aXRjaCBMU0Igb2ZmXG4iCQkJCQkJXAorCSJsc2IgICAgIC0gcHJpbnQgY3VycmVudCBzZXR0aW5nXG4iCQkJCQlcCispLAoraW50IGRvX3BpYyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOworaW50IGRvX2tiZCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOworaW50IGRvX2xzYiAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOworCisjZW5kaWYJLyogQ09ORklHX0xXTU9OICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogLS0tLS0gUENVIEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1BDVV9FKQorCisjZGVmaW5lIENNRF9UQkxfQlNQCU1LX0NNRF9UQkxfRU5UUlkoCQkJCQlcCisJInB1bWEiLAk0LAk0LAkxLAlkb19wdW1hLAkJCQlcCisJInB1bWEgICAgLSBhY2Nlc3MgUFVNQSBGUEdBXG4iLAkJCQkJCVwKKwkic3RhdHVzIC0gcHJpbnQgUFVNQSBzdGF0dXNcbiIJCQkJCQlcCisJInB1bWEgbG9hZCBhZGRyIGxlbiAtIGxvYWQgUFVNQSBjb25maWd1cmF0aW9uIGRhdGFcbiIJCQlcCispLAoraW50IGRvX3B1bWEgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKKworI2VuZGlmCS8qIENPTkZJR19QQ1VfRSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tIENDTS9TQ00gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DQ00pIHx8IGRlZmluZWQoQ09ORklHX1NDTSkKKworI2RlZmluZSBDTURfVEJMX0JTUAlNS19DTURfVEJMX0VOVFJZKAkJCQkJXAorCSJmcGdhIiwJNCwJNCwJMSwJZG9fZnBnYSwJCQkJXAorCSJmcGdhICAgIC0gYWNjZXNzIEZQR0EocylcbiIsCQkJCQkJXAorCSJmcGdhIHN0YXR1cyBbbmFtZV0gLSBwcmludCBGUEdBIHN0YXR1c1xuIgkJCQlcCisJImZwZ2EgcmVzZXQgIFtuYW1lXSAtIHJlc2V0IEZQR0FcbiIJCQkJCVwKKwkiZnBnYSBsb2FkIFtuYW1lXSBhZGRyIC0gbG9hZCBGUEdBIGNvbmZpZ3VyYXRpb24gZGF0YVxuIgkJXAorKSwKK2ludCBkb19mcGdhIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisKKyNlbmRpZgkvKiBDT05GSUdfQ0NNLCBDT05GSUdfU0NNICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogLS0tLS0gUElQNDA1IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QSVA0MDUpCisKKyNkZWZpbmUJQ01EX1RCTF9CU1AgTUtfQ01EX1RCTF9FTlRSWSgJCQkJXAorCSJwaXA0MDUiLAk0LAk2LAkxLAlkb19waXA0MDUsCQkJXAorCSJwaXA0MDUgIC0gUElQNDA1IHNwZWNpZmljIENtZHNcbiIsCQkJCQlcCisJImZsYXNoIG1lbSBbU3JjQWRkcl0gLSB1cGRhdGVzIFUtQm9vdCB3aXRoIGltYWdlIGluIG1lbW9yeVxuIgkJCQkJXAorCSJwaXA0MDUgZmxhc2ggZmxvcHB5IFtTcmNBZGRyXSAtIHVwZGF0ZXMgVS1Cb290IHdpdGggaW1hZ2UgZnJvbSBmbG9wcHlcbiIJCQkJCVwKKwkicGlwNDA1IGZsYXNoIG1wcyAtIHVwZGF0ZXMgVS1Cb290IHdpdGggaW1hZ2UgZnJvbSBNUFNcbiIJCQkJCVwKKyksCitpbnQgZG9fcGlwNDA1IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisKKyNlbmRpZiAvKiBDT05GSUdfUElQNDA1ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIC0tLS0tIE1JUDQwNSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWYgZGVmaW5lZChDT05GSUdfTUlQNDA1KQorCisjZGVmaW5lCUNNRF9UQkxfQlNQIE1LX0NNRF9UQkxfRU5UUlkoCQkJCVwKKwkibWlwNDA1IiwJNCwJNiwJMSwJZG9fbWlwNDA1LAkJCVwKKwkibWlwNDA1ICAtIE1JUDQwNSBzcGVjaWZpYyBDbWRzXG4iLAkJCQkJXAorCSJmbGFzaCBtZW0gW1NyY0FkZHJdIC0gdXBkYXRlcyBVLUJvb3Qgd2l0aCBpbWFnZSBpbiBtZW1vcnlcbiIJCQkJCVwKKwkibWlwNDA1IGZsYXNoIG1wcyAtIHVwZGF0ZXMgVS1Cb290IHdpdGggaW1hZ2UgZnJvbSBNUFNcbiIJCQkJCVwKKyksCitpbnQgZG9fbWlwNDA1IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisKKyNlbmRpZiAvKiBDT05GSUdfTUlQNDA1ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogLS0tLS0gREFTQV9TSU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19EQVNBX1NJTSkKKworI2RlZmluZQlDTURfVEJMX0JTUCBNS19DTURfVEJMX0VOVFJZKAkJCQkgICAgICAgICAgICAgICAgXAorCSJwY2k5MDU0IiwJNywJMywJMSwJZG9fcGNpOTA1NCwJCQlcCisJInBjaTkwNTQgLSBQTFggUENJOTA1NCBFRVBST00gYWNjZXNzXG4iLAkJCQlcCisJInBjaTkwNTQgaW5mbyAtIHByaW50IEVFUFJPTSB2YWx1ZXNcbiIJCSAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkicGNpOTA1NCB1cGRhdGUgLSB1cGRhdGVzIEVFUFJPTSB3aXRoIGRlZmF1bHQgdmFsdWVzXG4iCQkJXAorKSwKK2ludCBkb19wY2k5MDU0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisKKyNlbmRpZiAvKiBDT05GSUdfREFTQV9TSU0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tLSBIWU1PRCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWYgZGVmaW5lZChDT05GSUdfSFlNT0QpCisKKyNkZWZpbmUJQ01EX1RCTF9CU1AJTUtfQ01EX1RCTF9FTlRSWSgJCQkJXAorCSJmcGdhIiwJNCwJNiwJMSwJZG9fZnBnYSwJCQlcCisJImZwZ2EgICAgLSBGUEdBIHN1Yi1zeXN0ZW1cbiIsCQkJCQlcCisJImxvYWQgW3R5cGVdIGFkZHIgc2l6ZVxuIgkJCQkJXAorCSIgIC0gd3JpdGUgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBhdCBtZW1vcnkgYWRkcmVzcyBgYWRkcicsXG4iCVwKKwkiICAgIHNpemUgYHNpemUnIGJ5dGVzLCBpbnRvIHRoZSBGUEdBIG9mIHR5cGUgYHR5cGUnIChlaXRoZXJcbiIJXAorCSIgICAgYG1haW4nIG9yIGBtZXp6JywgZGVmYXVsdCBgbWFpbicpLiBlLmcuXG4iCQkJXAorCSIgICAgICAgIGBmcGdhIGxvYWQgMTAwMDAwIDdkOGYnXG4iCQkJCVwKKwkiICAgIGxvYWRzIHRoZSBtYWluIEZQR0Egd2l0aCBjb25maWcgZGF0YSBhdCBhZGRyZXNzIDEwMDAwMFxuIglcCisJIiAgICBIRVgsIHNpemUgN2Q4ZiBIRVggKDMyMTQzIERFQykgYnl0ZXNcbiIJCQlcCisJImZwZ2EgdGZ0cCBmaWxlIGFkZHJcbiIJCQkJCQlcCisJIiAgLSB0cmFuc2ZlcnMgYGZpbGUnIGZyb20gdGhlIHRmdHAgc2VydmVyIGludG8gbWVtb3J5IGF0XG4iCVwKKwkiICAgIGFkZHJlc3MgYGFkZHInLCB0aGVuIHdyaXRlcyB0aGUgZW50aXJlIGZpbGUgY29udGVudHNcbiIJXAorCSIgICAgaW50byB0aGUgbWFpbiBGUEdBXG4iCQkJCQlcCisJImZwZ2Egc3RvcmUgYWRkclxuIgkJCQkJCVwKKwkiICAtIHJlYWQgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gdGhlIG1haW4gRlBHQSAodGhlIG1lenpcbiIJXAorCSIgICAgRlBHQSBpcyB3cml0ZS1vbmx5KSwgaW50byBhZGRyZXNzIGBhZGRyJy4gVGhlcmUgbXVzdCBiZVxuIglcCisJIiAgICBlbm91Z2ggbWVtb3J5IGF2YWlsYWJsZSBhdCBgYWRkcicgdG8gaG9sZCBhbGwgdGhlIGNvbmZpZ1xuIlwKKwkiICAgIGRhdGEgLSB0aGUgc2l6ZSBvZiB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IFZDOj8/P1xuIglcCisJImZwZ2EgaW5mb1xuIgkJCQkJCQlcCisJIiAgLSBwcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgSHltb2QgRlBHQSwgbmFtZWx5IHRoZVxuIglcCisJIiAgICBtZW1vcnkgYWRkcmVzc2VzIGF0IHdoaWNoIHRoZSBmb3VyIEZQR0EgbG9jYWwgYnVzXG4iCVwKKwkiICAgIGFkZHJlc3Mgc3BhY2VzIGFwcGVhciBpbiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZVxuIglcCispLCBNS19DTURfVEJMX0VOVFJZKAkJCQkJCQlcCisJImVlY2xlYXIiLCA0LAkxLAkwLAlkb19lZWNsLAkJCVwKKwkiZWVjbGVhciAtIENsZWFyIHRoZSBlZXByb20gb24gYSBIeW1vZCBib2FyZCBcbiIsCQlcCisJIlt0eXBlXVxuIgkJCQkJCQlcCisJIiAgLSB3cml0ZSB6ZXJvZXMgaW50byB0aGUgRUVQUk9NIG9uIHRoZSBib2FyZCBvZiB0eXBlIGB0eXBlJ1xuIlwKKwkiICAgIChgdHlwZScgaXMgZWl0aGVyIGBtYWluJyBvciBgbWV6eicgLSBkZWZhdWx0IGBtYWluJylcbiIJXAorCSIgICAgTm90ZTogdGhlIEVFUFJPTSB3cml0ZSBlbmFibGUganVtcGVyIG11c3QgYmUgaW5zdGFsbGVkXG4iCVwKKyksCitpbnQgZG9fZnBnYSAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOworaW50IGRvX2VlY2wgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKKworI2VuZGlmCS8qIENPTkZJR19IWU1PRCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDUkFZNDA1IChMMSkgKi8KKyNpZiBkZWZpbmVkIChDT05GSUdfQ1JBWUwxKQorI2RlZmluZQlDTURfVEJMX0JTUCBNS19DTURfVEJMX0VOVFJZKAkJCQkJCVwKKwkiTDFjbWQiLAk1LAk0LAkxLAlkb19jcmF5TDEsCQkJXAorCSJMMWNtZCAgLSBMMSB1cGRhdGUsIHNldHVwLCBjb21tYW5kcyBcbiIsCQkJCVwKKwkiTDFjbWQgdXBkYXRlIC0gdXBkYXRlIGZsYXNoIGltYWdlcyBmcm9tIGhvc3RcbiIJCQlcCisJIkwxY21kIGJvb3QgLSBuZnMgb3IgcmFtYm9vdCBMMVxuIgkJCQkJXAorKSwKK2ludCBkb19jcmF5TDEgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKKyNlbmRpZiAvKiBDT05GSUdfQ1JBWTQwNSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkIChDT05GSUdfRVZCNjQyNjApCisvKiAtLS0tLSBFVkI2NDI2MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBDT05GSUdfWlVNQV9WMgorI2RlZmluZSBDTURfVEJMX0JTUCAgWlVNQV9UQkxfRU5UUlkKKworI2RlZmluZSBaVU1BX1RCTF9FTlRSWQlNS19DTURfVEJMX0VOVFJZKAkJCQlcCisJInppbml0IiwJIDUsCSAxLAkgMCwJIGRvX3p1bWFfaW5pdF9wYmIsCVwKKwkiemluaXQgICAtIGluaXQgenVtYSBwYmJcbiIsCQkJCQlcCisJIlxuIgkJCQkJCQkJXAorCSIgICAgLSBpbml0IHp1bWEgcGJiXG4iCQkJCQkJXAorKSwgTUtfQ01EX1RCTF9FTlRSWSgJCQkJCQkJXAorCSJ6ZHRlc3QiLAkgIDYsCSAgMywJICAxLAkgIGRvX3p1bWFfdGVzdF9kbWEsCVwKKwkiemR0ZXN0ICAtIHJ1biBkbWEgdGVzdFxuIiwJCQkJCVwKKwkiW2NtZCBbY291bnRdXVxuIgkJCQkJCVwKKwkiICAgIC0gcnVuIGRtYSBjbWQgKHc9MCx2PTEsY3A9MixjbXA9Myx3aT00LHZpPTUpLCBjb3VudCBieXRlc1xuIiBcCispLCBNS19DTURfVEJMX0VOVFJZKAkJCQkJCQlcCisJInptaW5pdCIsCSAgNSwJICAxLAkgIDAsCSAgZG9fenVtYV9pbml0X21ib3gsCVwKKwkiem1pbml0ICAtIGluaXQgenVtYSBtYm94XG4iLAkJCQlcCisJIlxuIgkJCQkJCQkJXAorCSIgICAgLSBpbml0IHp1bWEgbWJveFxuIgkJCQkJXAorKSwKKworaW50IGRvX3p1bWFfaW5pdF9wYmIgIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CitpbnQgZG9fenVtYV90ZXN0X2RtYSAgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKK2ludCBkb196dW1hX2luaXRfbWJveCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOworCit2b2lkIHp1bWFfaW5pdF9wYmIodm9pZCk7CitpbnQgenVtYV9tYm94X2luaXQodm9pZCk7CitpbnQgenVtYV90ZXN0X2RtYShpbnQgY21kLCBpbnQgc2l6ZSk7CisjZWxzZQorI2RlZmluZSBDTURfVEJMX0JTUAorI2VuZGlmIC8qIFpVTUFfTlRMICovCisKKyNlbmRpZiAvKiBDT05GSUdfRVZCNjQyNjAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tLVc3Ty0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKENPTkZJR19XN08pCisKKyNkZWZpbmUgQ01EX1RCTF9CU1AgTUtfQ01EX1RCTF9FTlRSWSgJCQlcCisJICAidnBkIiwJMywJMiwJMSwJZG9fdnBkLCBcCisJICAidnBkICAgICAtIFJlYWQgVml0YWwgUHJvZHVjdCBEYXRhXG4iLAlcCisJICAiW2Rldl9hZGRyXVxuIgkJCQlcCisJICAiICAgICAgICAtIFJlYWQgVlBEIERhdGEgZnJvbSBkZWZhdWx0IGFkZHJlc3MsIG9yIGRldmljZSBhZGRyZXNzICdkZXZfYWRkcicuXG4iIFwKKyksCisKK2V4dGVybiBpbnQgZG9fdnBkIChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKKworI2VuZGlmCS8qIENPTkZJR19XN08gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tIFBDSVBQQzIgLyBQQ0lQUEM2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QQ0lQUEMyKSB8fCBkZWZpbmVkKENPTkZJR19QQ0lQUEM2KQorI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCisjZGVmaW5lIENNRF9UQkxfQlNQIE1LX0NNRF9UQkxfRU5UUlkoCQkJXAorCSJ3ZCIsCTMsCTIsCTEsCWRvX3dkLAkJCQkJXAorCSJ3ZCAgICAgIC0gY2hlY2sgYW5kIHNldCB3YXRjaGRvZ1xuIiwJCQkJCVwKKwkib24gICAtIHN3aXRjaCB3YXRjaERvZyBvblxuIgkJCQkJCQlcCisJIndkIG9mZiAgLSBzd2l0Y2ggd2F0Y2hkb2cgb2ZmXG4iCQkJCQkJXAorCSJ3ZCAgICAgIC0gcHJpbnQgY3VycmVudCBzdGF0dXNcbiIJCQkJCVwKKyksCisKK2V4dGVybiBpbnQgZG9fd2QgKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOworCisjZWxzZQorI2RlZmluZSBDTURfVEJMX0JTUAorI2VuZGlmICAvKiBDT05GSUdfV0FUQ0hET0cgKi8KKworI2VuZGlmCS8qIENPTkZJR19QQ0lQUEMyICwgQ09ORklHX1BDSVBQQzYgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tLSBQTjYyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QTjYyKQorCisjZGVmaW5lIENNRF9UQkxfQlNQIE1LX0NNRF9UQkxfRU5UUlkoCQkJCVwKKwkibG9hZHBjaSIsCTUsCTIsCTEsCWRvX2xvYWRwY2ksIAlcCisJImxvYWRwY2kgLSBsb2FkIGJpbmFyeSBmaWxlIG92ZXIgUENJXG4iLAkJXAorCSJbYWRkcl1cbiIJCQkJCQlcCisJIiAgICAtIGxvYWQgYmluYXJ5IGZpbGUgb3ZlciBQQ0kgdG8gYWRkcmVzcyAnYWRkcidcbiIJXAorKSwgTUtfQ01EX1RCTF9FTlRSWSggCSAJIAkgCSAJIAlcCisJImxlZCIgICAgLAkzLAkzLAkxLAlkb19sZWQsIAlcCisJImxlZCAgICAgLSBzZXQgTEVEIDAuLjExIG9uIHRoZSBQTjYyIGJvYXJkXG4iLAkJXAorCSJpIGZ1blxuIgkJCQkJCVwKKwkiICAgIC0gc2V0ICdpJ3RoIExFRCB0byBmdW5jdGlvbiAnZnVuJ1xuIgkJXAorKSwKKworZXh0ZXJuIGludCBkb19sb2FkcGNpIChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKK2V4dGVybiBpbnQgZG9fbGVkIChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKKyNlbmRpZiAvKiBDT05GSUdfUE42MiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tIFRSQUIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19UUkFCKQorCisjZGVmaW5lCUNNRF9UQkxfQlNQCU1LX0NNRF9UQkxfRU5UUlkoCQkJCQlcCisJImtiZCIsCTMsCTEsCTEsCWRvX2tiZCwJCQkJCVwKKwkia2JkICAgICAtIHJlYWQga2V5Ym9hcmQgc3RhdHVzXG4iLAkJCQkJXAorCU5VTEwJCQkJCQkJCQlcCispLAorCitpbnQgZG9fa2JkIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisKKyNlbmRpZgkvKiBDT05GSUdfVFJBQiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNlbHNlCisjZGVmaW5lIENNRF9UQkxfQlNQCisjZW5kaWYJLyogQ0ZHX0NNRF9CU1AgKi8KKworLyogLS0tLS0gUjM2ME1QSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1IzNjBNUEkpCisKKyNkZWZpbmUJQ01EX1RCTF9CU1AJTUtfQ01EX1RCTF9FTlRSWSgJCQkJCVwKKwkia2JkIiwJMywJMSwJMSwJZG9fa2JkLAkJCQkJXAorCSJrYmQgICAgIC0gcmVhZCBrZXlib2FyZCBzdGF0dXNcbiIsCQkJCQlcCisJTlVMTAkJCQkJCQkJCVwKKyksCisKK2ludCBkb19rYmQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKKworI2VuZGlmCS8qIENPTkZJR19SMzYwTVBJICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2VuZGlmCS8qIF9DTURfQlNQX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQk1XLmggYi9pbmNsdWRlL2NvbmZpZ3MvQk1XLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRmZDY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9CTVcuaApAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICoKKyAqIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZSBDVTgyNCBib2FyZC4KKyAqCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogYm9hcmQvY29uZmlnLmggLSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGJvYXJkIHNwZWNpZmljCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKworI2RlZmluZSBDT05GSUdfTVBDODI0WAkJMQorI2RlZmluZSBDT05GSUdfTVBDODI0NQkJMQorI2RlZmluZSBDT05GSUdfQk1XCQkxCisKKyNkZWZpbmUgQ09ORklHX0JDTTU3MHgJCTEgLyogVXNlIEJyb2FkY29tIEJDTTU3MHggRXRoZXJuZXQgRHJpdmVyICovCisjZGVmaW5lCUNPTkZJR19USUdPTjMJCTEKKworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAorI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorCisjZGVmaW5lIENPTkZJR19DTE9DS1NfSU5fTUhaCTEJLyogY2xvY2tzIHBhc3NzZWQgdG8gTGludXggaW4gTUh6CSovCisKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSBGRjgyMDAwMCIJLyogYXV0b2Jvb3QgY29tbWFuZAkqLworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKKworI2RlZmluZSBDRkdfTUFYX0RPQ19ERVZJQ0UgICAgICAxIC8qIE9ubHkgdXNlIE9uYm9hcmQgVFNPUC0xNk1CIGRldmljZSAqLworI2RlZmluZSBET0NfUEFTU0lWRV9QUk9CRSAgICAgICAxCisjZGVmaW5lIENGR19ET0NfU1VQUE9SVF8yMDAwICAgIDEKKyNkZWZpbmUgQ0ZHX0RPQ19TVVBQT1JUX01JTExFTk5JVU0gMQorI2RlZmluZSBDRkdfRE9DX1NIT1JUX1RJTUVPVVQgICAgMQorI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAl8IFwKKwkJCQlDRkdfQ01EX0RBVEUJfCBcCisJCQkJQ0ZHX0NNRF9ET0MJfCBcCisJCQkJQ0ZHX0NNRF9FTEYJfCBcCisJCQkJMCApCisjaWYgMAorI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBDRkdfQ01EX0RIQ1AgfCBcCisJCQkJIENGR19DTURfUENJIHwgQ0ZHX0NNRF9ET0MgfCBDRkdfQ01EX0RBVEUpCisKKyNkZWZpbmUgQ09ORklHX1BDSQkJMQorI2RlZmluZSBDT05GSUdfUENJX1BOUAkJMQkvKiBQQ0kgcGx1Zy1hbmQtcGxheSAqLworI2VuZGlmCisKKy8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkKKyAqLworI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCisjZGVmaW5lIENGR19QUk9NUFQJIj0+IgkgICAgICAgIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisKKy8qIFByaW50IEJ1ZmZlciBTaXplCisgKi8KKyNkZWZpbmUgQ0ZHX1BCU0laRQkoQ0ZHX0NCU0laRSArIHNpemVvZihDRkdfUFJPTVBUKSArIDE2KQorCisjZGVmaW5lIENGR19NQVhBUkdTCTgJCS8qIE1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDAwMTAwMDAwCS8qIERlZmF1bHQgbG9hZCBhZGRyZXNzCQkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFydCBhZGRyZXNzZXMgZm9yIHRoZSBmaW5hbCBtZW1vcnkgY29uZmlndXJhdGlvbgorICogKFNldCB1cCBieSB0aGUgc3RhcnR1cCBjb2RlKQorICogUGxlYXNlIG5vdGUgdGhhdCBDRkdfU0RSQU1fQkFTRSBfbXVzdF8gc3RhcnQgYXQgMAorICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCSAgICAweDAwMDAwMDAwCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UwX1BSRUxJTSAgICAgIDB4RkZGMDAwMDAgICAgICAvKiBGTEFTSCBiYW5rIG9uIFJDUyMwICovCisjZGVmaW5lIENGR19GTEFTSF9CQVNFMV9QUkVMSU0gICAgICAweEZGODAwMDAwICAgICAgLyogRkxBU0ggYmFuayBvbiBSQ1MjMSAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRSAgQ0ZHX01PTklUT1JfQkFTRQorI2RlZmluZSBDRkdfRkxBU0hfQkFOS1MJCXsgQ0ZHX0ZMQVNIX0JBU0UwX1BSRUxJTSAsIENGR19GTEFTSF9CQVNFMV9QUkVMSU0gfQorCisvKiBldmVuIHRob3VnaCBGTEFTSFBfQkFTRSBpcyBGRjgwMDAwMCwgd2l0aCA0TUIgaXMgUkNTMCwgdGhlCisgKiByZXNldCB2ZWN0b3IgaXMgYWN0dWFsbHkgbG9jYXRlZCBhdCBGRkIwMDEwMCwgYnV0IHRoZSA4MjQ1CisgKiB0YWtlcyBjYXJlIG9mIHVzLgorICovCisjZGVmaW5lIENGR19SRVNFVF9BRERSRVNTICAgMHhGRkYwMDEwMAorCisjZGVmaW5lIENGR19FVU1CX0FERFIJICAgIDB4RkMwMDAwMDAKKworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFICAgIFRFWFRfQkFTRQorCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkgICAgKDI1NiA8PCAxMCkgLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IJKi8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JICAgICgyMDQ4IDw8IDEwKSAvKiBSZXNlcnZlIDJNQiBmb3IgbWFsbG9jKCkJKi8KKworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVCAgIDB4MDAwMDQwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkJKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECSAgICAweDA0MDAwMDAwCS8qIDAgLi4uIDMyIE1CIGluIERSQU0JCSovCisKKwkvKiBNYXhpbXVtIGFtb3VudCBvZiBSQU0uCisJICovCisjZGVmaW5lIENGR19NQVhfUkFNX1NJWkUgICAgMHgwNDAwMDAwMAkvKiAwIC4uIDY0IE1CIG9mIChTKURSQU0gKi8KKworCisjaWYgQ0ZHX01PTklUT1JfQkFTRSA+PSBDRkdfRkxBU0hfQkFTRQorI3VuZGVmIENGR19SQU1CT09UCisjZWxzZQorI2RlZmluZSBDRkdfUkFNQk9PVAorI2VuZGlmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbnMgZm9yIGluaXRpYWwgc3RhY2sgcG9pbnRlciBhbmQgZGF0YSBhcmVhCisgKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIgQ0ZHX1NEUkFNX0JBU0UgKyBDRkdfTU9OSVRPUl9MRU4KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORCAgIDB4MkYwMCAgLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBEUFJBTSAgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUgIDEyOCAgLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQgIChDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisjZGVmaW5lIENGR19JTklUX1NQX09GRlNFVCAgQ0ZHX0dCTF9EQVRBX09GRlNFVAorCisvKgorICogTG93IExldmVsIENvbmZpZ3VyYXRpb24gU2V0dGluZ3MKKyAqIChhZGRyZXNzIG1hcHBpbmdzLCByZWdpc3RlciBpbml0aWFsIHZhbHVlcywgZXRjLikKKyAqIFlvdSBzaG91bGQga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgaWYgeW91IG1ha2UgY2hhbmdlcyBoZXJlLgorICogRm9yIHRoZSBkZXRhaWwgZGVzY3JpcHRpb24gcmVmZXIgdG8gdGhlIE1QQzgyNDAgdXNlcidzIG1hbnVhbC4KKyAqLworCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgIDMzMDAwMDAwCS8qIGV4dGVybmFsIGZyZXF1ZW5jeSB0byBwbGwgKi8KKyNkZWZpbmUgQ0ZHX0haCQkgICAgIDEwMDAKKworI2RlZmluZSBDRkdfRVRIX0RFVl9GTgkgICAgIDB4NzgwMAorI2RlZmluZSBDRkdfRVRIX0lPQkFTRQkgICAgIDB4MDAxMDQwMDAKKworCS8qIEJpdC1maWVsZCB2YWx1ZXMgZm9yIE1DQ1IxLgorCSAqLworI2RlZmluZSBDRkdfUk9NTkFMCSAgICAweGYKKyNkZWZpbmUgQ0ZHX1JPTUZBTAkgICAgMHgxZgorI2RlZmluZSBDRkdfREJVU19TSVpFICAgICAgIDB4MworCisJLyogQml0LWZpZWxkIHZhbHVlcyBmb3IgTUNDUjIuCisJICovCisjZGVmaW5lIENGR19UU1dBSVQJICAgIDB4NQkJICAgIC8qIFRyYW5zYWN0aW9uIFN0YXJ0IFdhaXQgU3RhdGVzIHRpbWVyICovCisjZGVmaW5lIENGR19SRUZJTlQJICAgIDB4NDAwCSAgICAvKiBSZWZyZXNoIGludGVydmFsCUZJWE1FOiB3YXMgMHQ0MzAJCSovCisKKwkvKiBCdXJzdCBUbyBQcmVjaGFyZ2UuIEJpdHMgb2YgdGhpcyB2YWx1ZSBnbyB0byBNQ0NSMyBhbmQgTUNDUjQuCisJICovCisjZGVmaW5lIENGR19CU1RPUFJFCSAgICAwCQkvKiBGSVhNRTogd2FzIDE5MiAqLworCisJLyogQml0LWZpZWxkIHZhbHVlcyBmb3IgTUNDUjMuCisJICovCisjZGVmaW5lIENGR19SRUZSRUMJICAgIDIJICAgIC8qIFJlZnJlc2ggdG8gYWN0aXZhdGUgaW50ZXJ2YWwgKi8KKworCS8qIEJpdC1maWVsZCB2YWx1ZXMgZm9yIE1DQ1I0LgorCSAqLworI2RlZmluZSBDRkdfUFJFVE9BQ1QJICAgIDIJICAgIC8qIFByZWNoYXJnZSB0byBhY3RpdmF0ZSBpbnRlcnZhbCBGSVhNRTogd2FzIDIJKi8KKyNkZWZpbmUgQ0ZHX0FDVFRPUFJFCSAgICA1CSAgICAvKiBBY3RpdmF0ZSB0byBQcmVjaGFyZ2UgaW50ZXJ2YWwgRklYTUU6IHdhcyA1CSovCisjZGVmaW5lIENGR19TRE1PREVfQ0FTX0xBVCAgMwkgICAgLyogU0RNT0RFIENBUyBsYXRhbmN5ICovCisjZGVmaW5lIENGR19TRE1PREVfV1JBUAkgICAgMAkgICAgLyogU0RNT0RFIHdyYXAgdHlwZQkqLworI2RlZmluZSBDRkdfU0RNT0RFX0JVUlNUTEVOIDMJICAgIC8qIFNETU9ERSBCdXJzdCBsZW5ndGggKi8KKyNkZWZpbmUgQ0ZHX0FDVE9SVwkgICAgMHhhCQkvKiBGSVhNRSB3YXMgMiAqLworI2RlZmluZSBDRkdfUkVHSVNURVJEX1RZUEVfQlVGRkVSIDEKKworI2RlZmluZSBDRkdfUEdNQVggICAgICAgICAgIDB4MCAvKiBob3cgbG9uZyB0aGUgODI0MCByZWF0aW5zIHRoZSBjdXJyZW50bHkgYWNjZXNzZWQgcGFnZSBpbiBtZW1vcnkgRklYTUU6IHdhcyAweDMyKi8KKworI2RlZmluZSBDRkdfU0RSQU1fRFNDRAkweDIwCS8qIFNEUkFNIGRhdGEgaW4gc2FtcGxlIGNsb2NrIGRlbGF5IC0gbm90ZSBib3R0b20gMyBiaXRzIE1VU1QgYmUgMCAqLworCisvKiBNZW1vcnkgYmFuayBzZXR0aW5ncy4KKyAqIE9ubHkgYml0cyAyMC0yOSBhcmUgYWN0dWFsbHkgdXNlZCBmcm9tIHRoZXNlIHZhbGVzIHRvIHNldCB0aGUKKyAqIHN0YXJ0L2VuZCBhZGRyZXNzZXMuIFRoZSB1cHBlciB0d28gYml0cyB3aWxsIGFsd2F5cyBiZSAwLCBhbmQgdGhlIGxvd2VyCisgKiAyMCBiaXRzIHdpbGwgYmUgMHgwMDAwMCBmb3IgYSBzdGFydCBhZGRyZXNzLCBvciAweGZmZmZmIGZvciBhbiBlbmQKKyAqIGFkZHJlc3MuIFJlZmVyIHRvIHRoZSBNUEM4MjQwIGJvb2suCisgKi8KKworI2RlZmluZSBDRkdfQkFOSzBfU1RBUlQJICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTkswX0VORAkgICAgKENGR19NQVhfUkFNX1NJWkUgLSAxKQorI2RlZmluZSBDRkdfQkFOSzBfRU5BQkxFICAgIDEKKyNkZWZpbmUgQ0ZHX0JBTksxX1NUQVJUCSAgICAweDNmZjAwMDAwCisjZGVmaW5lIENGR19CQU5LMV9FTkQJICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0JBTksxX0VOQUJMRSAgICAwCisjZGVmaW5lIENGR19CQU5LMl9TVEFSVAkgICAgMHgzZmYwMDAwMAorI2RlZmluZSBDRkdfQkFOSzJfRU5ECSAgICAweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LMl9FTkFCTEUgICAgMAorI2RlZmluZSBDRkdfQkFOSzNfU1RBUlQJICAgIDB4M2ZmMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTkszX0VORAkgICAgMHgzZmZmZmZmZgorI2RlZmluZSBDRkdfQkFOSzNfRU5BQkxFICAgIDAKKyNkZWZpbmUgQ0ZHX0JBTks0X1NUQVJUCSAgICAweDNmZjAwMDAwCisjZGVmaW5lIENGR19CQU5LNF9FTkQJICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0JBTks0X0VOQUJMRSAgICAwCisjZGVmaW5lIENGR19CQU5LNV9TVEFSVAkgICAgMHgzZmYwMDAwMAorI2RlZmluZSBDRkdfQkFOSzVfRU5ECSAgICAweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LNV9FTkFCTEUgICAgMAorI2RlZmluZSBDRkdfQkFOSzZfU1RBUlQJICAgIDB4M2ZmMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks2X0VORAkgICAgMHgzZmZmZmZmZgorI2RlZmluZSBDRkdfQkFOSzZfRU5BQkxFICAgIDAKKyNkZWZpbmUgQ0ZHX0JBTks3X1NUQVJUCSAgICAweDNmZjAwMDAwCisjZGVmaW5lIENGR19CQU5LN19FTkQJICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0JBTks3X0VOQUJMRSAgICAwCisKKyNkZWZpbmUgQ0ZHX09EQ1IJICAgIDB4ZmYKKworI2RlZmluZSBDT05GSUdfUENJICAgICAgICAgICAgICAxIC8qIEluY2x1ZGUgUENJIHN1cHBvcnQgKi8KKyN1bmRlZiBDT05GSUdfUENJX1BOUAorCisvKiBQQ0kgTWVtb3J5IHNwYWNlKHMpICovCisjZGVmaW5lIFBDSV9NRU1fU1BBQ0UxX1NUQVJUCTB4ODAwMDAwMDAKKyNkZWZpbmUgUENJX01FTV9TUEFDRTJfU1RBUlQJMHhmZDAwMDAwMAorCisvKiBST00gU3BhY2VzICovCisjaW5jbHVkZSAiLi4vYm9hcmQvYm13L2Jtdy5oIgorCisvKiBCQVQgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDRkdfSUJBVDBMICAoQ0ZHX1NEUkFNX0JBU0UgfCBCQVRMX1BQXzEwIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUMFUgIChDRkdfU0RSQU1fQkFTRSB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19JQkFUMUwgICgweDcwMDAwMDAwIHwgQkFUTF9QUF8xMCB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDFVICAoMHg3MDAwMDAwMCB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19JQkFUMkwgICgweDgwMDAwMDAwIHwgQkFUTF9QUF8xMCB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDJVICAoMHg4MDAwMDAwMCB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19JQkFUM0wgICgweEYwMDAwMDAwIHwgQkFUTF9QUF8xMCB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDNVICAoMHhGMDAwMDAwMCB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19EQkFUMEwgIENGR19JQkFUMEwKKyNkZWZpbmUgQ0ZHX0RCQVQwVSAgQ0ZHX0lCQVQwVQorI2RlZmluZSBDRkdfREJBVDFMICBDRkdfSUJBVDFMCisjZGVmaW5lIENGR19EQkFUMVUgIENGR19JQkFUMVUKKyNkZWZpbmUgQ0ZHX0RCQVQyTCAgQ0ZHX0lCQVQyTAorI2RlZmluZSBDRkdfREJBVDJVICBDRkdfSUJBVDJVCisjZGVmaW5lIENGR19EQkFUM0wgIENGR19JQkFUM0wKKyNkZWZpbmUgQ0ZHX0RCQVQzVSAgQ0ZHX0lCQVQzVQorCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCSAgICAoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCAqLworCisvKgorICogRkxBU0ggb3JnYW5pemF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkwCS8qIE1heCBudW1iZXIgb2YgZmxhc2ggYmFua3MJICAgICovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAk2NAkvKiBNYXggbnVtYmVyIG9mIHNlY3RvcnMgcGVyICBmbGFzaCAqLworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpICovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpICovCisKKy8qCisgKiBXYXJpbmluZzogZW52aXJvbm1lbnQgaXMgbm90IEVNQkVEREVEIGluIHRoZSBVLUJvb3QgY29kZS4KKyAqIEl0J3Mgc3RvcmVkIGluIGZsYXNoIHNlcGFyYXRlbHkuCisgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9OVlJBTSAgICAgIDEKKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUgICAgIDEKKyNkZWZpbmUgQ0ZHX05WUkFNX0FDQ0VTU19ST1VUSU5FIDEKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkweDdjMDA0MDAwIC8qIHJpZ2h0IGF0IHRoZSBzdGFydCBvZiBOVlJBTSAgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDFmZjAJLyogU2l6ZSBvZiB0aGUgRW52aXJvbm1lbnQgLSA4SwkgICAqLworI2RlZmluZSBDRkdfRU5WX09GRlNFVAkJMAkvKiBzdGFydGluZyByaWdodCBhdCB0aGUgYmVnaW5uaW5nICovCisKKy8qCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgICAqLworI2VuZGlmCisKKy8qCisgKiBJbnRlcm5hbCBEZWZpbml0aW9ucworICoKKyAqIEJvb3QgRmxhZ3MKKyAqLworI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CQkgICAgKi8KKworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NDTS5oIGIvaW5jbHVkZS9jb25maWdzL0NDTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMDI0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ0NNLmgKQEAgLTAsMCArMSw0NzIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYm9hcmQgc3BlY2lmaWMsIGZvciBTaWVtZW5zIENhcmQgQ29udHJvbGxlciBNb2R1bGUKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisjdW5kZWYJQ0NNXzgwTUh6CQkJLyogZGVmaW5lIGZvciA4MCBNSHogQ1BVIG9ubHkgKi8KKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKworI2RlZmluZSBDT05GSUdfTVBDODYwICAgICAgICAgICAxICAgLyogVGhpcyBpcyBhIE1QQzg2MCBDUFUgLi4uICovCisjZGVmaW5lIENPTkZJR19DQ00gICAgICAgICAgICAgIDEgICAvKiBvbiBhIENhcmQgQ29udHJvbGxlciBNb2R1bGUgICovCisKKyNkZWZpbmUgQ09ORklHXzh4eF9DT05TX1NNQzEgICAgMSAgIC8qIENvbnNvbGUgaXMgb24gU01DMSAgICAgICAqLworI3VuZGVmICBDT05GSUdfOHh4X0NPTlNfU01DMgorI3VuZGVmICBDT05GSUdfOHh4X0NPTlNfTk9ORQorCisvKiAgRU5WSVJPTk1FTlQgKi8KKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAxOTIwMCAgICAgICAgIC8qIGNvbnNvbGUgYmF1ZHJhdGUgaW4gYnBzICAgICovCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAgIDIgICAgICAgICAgICAgLyogYXV0b2Jvb3QgYWZ0ZXIgMiBzZWNvbmRzICAgKi8KKyNkZWZpbmUgQ09ORklHX0NMT0NLU19JTl9NSFogICAgMSAgICAgICAgICAgICAvKiBjbG9ja3MgcGFzc3NlZCB0byBMaW51eCBpbiBNSHogKi8KKworI2RlZmluZSBDT05GSUdfSVBBRERSICAgICAgICAgICAxOTIuMTY4LjAuNDIKKyNkZWZpbmUgQ09ORklHX05FVE1BU0sgICAgICAgICAgMjU1LjI1NS4yNTUuMAorI2RlZmluZSBDT05GSUdfR0FURVdBWUlQICAgICAgICAwLjAuMC4wCisjZGVmaW5lIENPTkZJR19TRVJWRVJJUCAgICAgICAgIDE5Mi4xNjguMC4yNTQKKworI2RlZmluZSBDT05GSUdfSE9TVE5BTUUgICAgICAgICBDQ00KKworI2RlZmluZSBDT05GSUdfTE9BREFERFIgICAgICAgICA0MDE4MDAwMAorCisjdW5kZWYJQ09ORklHX0JPT1RBUkdTCisKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5EICAgICAgInNldGVudiBib290YXJncyAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lbT0kKG1lbSkgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb290PS9kZXYvcmFtIHJ3IGlwPSQoaXBhZGRyKTokKHNlcnZlcmlwKTokKGdhdGV3YXlpcCk6JChuZXRtYXNrKTokKGhvc3RuYW1lKTo6b2ZmICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3RfOHh4PXRpbWVvdXQ6MzYwMDsgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJib290bSIKKworI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLworI3VuZGVmCUNGR19MT0FEU19CQVVEX0NIQU5HRQkvKiBkb24ndCBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KKworI2RlZmluZQlDT05GSUdfV0FUQ0hET0cJCTEJLyogd2F0Y2hkb2cgZW5hYmxlZAkJKi8KKworI3VuZGVmCUNPTkZJR19TVEFUVVNfTEVECQkvKiBTdGF0dXMgTEVEIGRpc2FibGVkCQkqLworCisjZGVmaW5lCUNPTkZJR19QUkFNCQk1MTIJLyogcmVzZXJ2ZSA1MTJrQiAicHJvdGVjdGVkIFJBTSIqLworCisjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLworCisjZGVmaW5lCUNPTkZJR19TUEkJCQkvKiBlbmFibGUgU1BJIGRyaXZlcgkJKi8KKyNkZWZpbmUJQ09ORklHX1NQSV9YCQkJLyogMTYgYml0IEVFUFJPTSBhZGRyZXNzaW5nCSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9mZnNldCB0byBpbml0aWFsIFNQSSBidWZmZXJzIGluIERQUkFNICh1c2VkIGlmIHRoZSBlbnZpcm9ubWVudAorICogaXMgaW4gdGhlIFNQSSBFRVBST00pOiBXZSBuZWVkIGEgNTIwIGJ5dGUgc2NyYXRjaCBEUFJBTSBhcmVhIHRvCisgKiB1c2UgYXQgYW4gZWFybHkgc3RhZ2UuIEl0IGlzIHVzZWQgYmV0d2VlbiB0aGUgdHdvIGluaXRpYWxpemF0aW9uCisgKiBjYWxscyAoc3BpX2luaXRfZigpIGFuZCBzcGlfaW5pdF9yKCkpLiBUaGUgdmFsdWUgMHhCMDAgbWFrZXMgaXQKKyAqIGZhciBlbm91Z2ggZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgYXJlYSAoYXMgd2VsbCBhcyBmcm9tIHRoZQorICogc3RhY2sgcG9pbnRlcikuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIENGR19TUElfSU5JVF9PRkZTRVQJCTB4QjAwCisKKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0JJVFMJNQkvKiAzMi1ieXRlIHBhZ2Ugc2l6ZQkqLworCisKKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04JCS8qIG5vZCB1c2VkIHlldAkJCSovCisjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCisKKyNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKworI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKKwkJCQlDRkdfQ01EX0RIQ1AJfCBcCisJCQkJQ0ZHX0NNRF9EQVRFCXwgXAorCQkJCUNGR19DTURfRUVQUk9NCXwgXAorCQkJCUNGR19DTURfQlNQCSkKKworLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLworI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2Vsc2UKKyNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZW5kaWYKKyNkZWZpbmUJQ0ZHX1BCU0laRSAoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lCUNGR19NQVhBUkdTCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDEwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwMEYwMDAwMAkvKiAxIC4uLiAxNU1CIGluIERSQU0JKi8KKworI2RlZmluZQlDRkdfTE9BRF9BRERSCQkweDAwMTAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzCSovCisKKy8qIEV0aGVybmV0IGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gZG9uZSB1c2luZyBwb3J0IHBpbnMgKi8KKyNkZWZpbmUgQ0ZHX1BBX0VUSF9SRVNFVCAJMHgwMjAwCQkvKiBQQSAgNgkqLworI2RlZmluZSBDRkdfUEFfRVRIX01ERElTCTB4NDAwMAkJLyogUEEgIDEJKi8KKyNkZWZpbmUgQ0ZHX1BCX0VUSF9QT1dFUkRPV04JMHgwMDAwMDgwMAkvKiBQQiAyMAkqLworI2RlZmluZSBDRkdfUEJfRVRIX0NGRzEJCTB4MDAwMDA0MDAJLyogUEIgMjEJKi8KKyNkZWZpbmUgQ0ZHX1BCX0VUSF9DRkcyCQkweDAwMDAwMjAwCS8qIFBCIDIyCSovCisjZGVmaW5lIENGR19QQl9FVEhfQ0ZHMwkJMHgwMDAwMDEwMAkvKiBQQiAyMwkqLworCisvKiBFdGhlcm5ldCBzZXR0aW5nczoKKyAqIE1ESU8gbm90IGRpc2FibGVkLCBhdXRvbmVnb3RpYXRpb24sIDEwLzEwME1icHMsIGhhbGYvZnVsbCBkdXBsZXgKKyAqLworI2RlZmluZSBDRkdfRVRIX01ERElTX1ZBTFVFCTAKKyNkZWZpbmUgQ0ZHX0VUSF9DRkcxX1ZBTFVFCTEKKyNkZWZpbmUgQ0ZHX0VUSF9DRkcyX1ZBTFVFCTEKKyNkZWZpbmUgQ0ZHX0VUSF9DRkczX1ZBTFVFCTEKKworLyogUFVNQSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIENGR19QQ19QVU1BX1BST0cJMHgwMjAwCQkvKiBQQyAgNiAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDX1BVTUFfRE9ORQkweDAwMDgJCS8qIFBDIDEyCSovCisjZGVmaW5lIENGR19QQ19QVU1BX0lOSVQJMHgwMDA0CQkvKiBQQyAxMwkqLworCisjZGVmaW5lCUNGR19IWgkJMTAwMAkJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcwkqLworCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKy8qCisgKiBMb3cgTGV2ZWwgQ29uZmlndXJhdGlvbiBTZXR0aW5ncworICogKGFkZHJlc3MgbWFwcGluZ3MsIHJlZ2lzdGVyIGluaXRpYWwgdmFsdWVzLCBldGMuKQorICogWW91IHNob3VsZCBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBpZiB5b3UgbWFrZSBjaGFuZ2VzIGhlcmUuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVybmFsIE1lbW9yeSBNYXBwZWQgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBDRkdfSU1NUgkJMHhGMDAwMDAwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWZpbml0aW9ucyBmb3IgaW5pdGlhbCBzdGFjayBwb2ludGVyIGFuZCBkYXRhIGFyZWEgKGluIERQUkFNKQorICovCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCUNGR19JTU1SCisjZGVmaW5lCUNGR19JTklUX1JBTV9FTkQJMHgyRjAwCS8qIEVuZCBvZiB1c2VkIGFyZWEgaW4gRFBSQU0JKi8KKyNkZWZpbmUJQ0ZHX0dCTF9EQVRBX1NJWkUJNjQgIC8qIHNpemUgaW4gYnl0ZXMgcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfT0ZGU0VUCShDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisjZGVmaW5lCUNGR19JTklUX1NQX09GRlNFVAlDRkdfR0JMX0RBVEFfT0ZGU0VUCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFkZHJlc3MgYWNjZXNzZWQgdG8gcmVzZXQgdGhlIGJvYXJkIC0gbXVzdCBub3QgYmUgbWFwcGVkL2Fzc2lnbmVkCisgKi8KKyNkZWZpbmUJQ0ZHX1JFU0VUX0FERFJFU1MJMHhGRUZGRkZGRgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFydCBhZGRyZXNzZXMgZm9yIHRoZSBmaW5hbCBtZW1vcnkgY29uZmlndXJhdGlvbgorICogKFNldCB1cCBieSB0aGUgc3RhcnR1cCBjb2RlKQorICogUGxlYXNlIG5vdGUgdGhhdCBDRkdfU0RSQU1fQkFTRSBfbXVzdF8gc3RhcnQgYXQgMAorICovCisjZGVmaW5lCUNGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweDQwMDAwMDAwCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUJQ0ZHX01PTklUT1JfTEVOCQkoMjU2IDw8IDEwKQkvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uaXRvcgkqLworI2Vsc2UKKyNkZWZpbmUJQ0ZHX01PTklUT1JfTEVOCQkoMTkyIDw8IDEwKQkvKiBSZXNlcnZlIDE5MiBrQiBmb3IgTW9uaXRvcgkqLworI2VuZGlmCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJQ0ZHX0ZMQVNIX0JBU0UKKyNkZWZpbmUJQ0ZHX01BTExPQ19MRU4JCSgxMjggPDwgMTApCS8qIFJlc2VydmUgMTI4IGtCIGZvciBtYWxsb2MoKQkqLworCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZQlDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eAkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGTEFTSCBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTIJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJCSovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAk2NwkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAJKi8KKworI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkxMjAwMDAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKGluIG1zKQkqLworI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAk1MDAJLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKGluIG1zKQkqLworCisjaWYgMQorLyogU3RhcnQgcG9ydCB3aXRoIGVudmlyb25tZW50IGluIGZsYXNoOyBzd2l0Y2ggdG8gU1BJIEVFUFJPTSBsYXRlciAqLworI2RlZmluZQlDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUJQ0ZHX0VOVl9PRkZTRVQJCTB4ODAwMAkvKiAgIE9mZnNldCAgIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLworI2RlZmluZQlDRkdfRU5WX1NJWkUJCTB4NDAwMAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLworI2Vsc2UKKy8qIEZpbmFsIHZlcnNpb246IGVudmlyb25tZW50IGluIEVFUFJPTSAqLworI2RlZmluZSBDRkdfRU5WX0lTX0lOX0VFUFJPTQkxCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUCQkyMDQ4CisjZGVmaW5lIENGR19FTlZfU0laRQkJMjA0OAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEhhcmR3YXJlIEluZm9ybWF0aW9uIEJsb2NrCisgKi8KKyNkZWZpbmUgQ0ZHX0hXSU5GT19PRkZTRVQJMHgwMDAzRkZDMAkvKiBvZmZzZXQgb2YgSFcgSW5mbyBibG9jayAqLworI2RlZmluZSBDRkdfSFdJTkZPX1NJWkUJCTB4MDAwMDAwNDAJLyogc2l6ZSAgIG9mIEhXIEluZm8gYmxvY2sgKi8KKyNkZWZpbmUgQ0ZHX0hXSU5GT19NQUdJQwkweDU0NTE0RDM4CS8qICdUUU04JyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU1lQQ1IgLSBTeXN0ZW0gUHJvdGVjdGlvbiBDb250cm9sCQkJCTExLTkKKyAqIFNZUENSIGNhbiBvbmx5IGJlIHdyaXR0ZW4gb25jZSBhZnRlciByZXNldCEKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNvZnR3YXJlICYgQnVzIE1vbml0b3IgVGltZXIgbWF4LCBCdXMgTW9uaXRvciBlbmFibGUsIFNXIFdhdGNoZG9nIGZyZWV6ZQorICovCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisjZGVmaW5lIENGR19TWVBDUgkoU1lQQ1JfU1dUQyB8IFNZUENSX0JNVCB8IFNZUENSX0JNRSB8IFNZUENSX1NXRiB8IFwKKwkJCSBTWVBDUl9TV0UgIHwgU1lQQ1JfU1dSSXwgU1lQQ1JfU1dQKQorI2Vsc2UKKyNkZWZpbmUgQ0ZHX1NZUENSCShTWVBDUl9TV1RDIHwgU1lQQ1JfQk1UIHwgU1lQQ1JfQk1FIHwgU1lQQ1JfU1dGIHwgU1lQQ1JfU1dQKQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNJVU1DUiAtIFNJVSBNb2R1bGUgQ29uZmlndXJhdGlvbgkJCQkxMS02CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB3ZSBtdXN0IGFjdGl2YXRlIEdQTDUgaW4gdGhlIFNJVU1DUiBmb3IgQ0FOCisgKi8KKyNkZWZpbmUgQ0ZHX1NJVU1DUgkoU0lVTUNSX0RCR0MxMSB8IFNJVU1DUl9EQlBDMDAgfCBTSVVNQ1JfTUxSQzAxKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUQlNDUiAtIFRpbWUgQmFzZSBTdGF0dXMgYW5kIENvbnRyb2wJCQkJMTEtMjYKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENsZWFyIFJlZmVyZW5jZSBJbnRlcnJ1cHQgU3RhdHVzLCBUaW1lYmFzZSBmcmVlemluZyBlbmFibGVkCisgKi8KKyNkZWZpbmUgQ0ZHX1RCU0NSCShUQlNDUl9SRUZBIHwgVEJTQ1JfUkVGQiB8IFRCU0NSX1RCRikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUlRDU0MgLSBSZWFsLVRpbWUgQ2xvY2sgU3RhdHVzIGFuZCBDb250cm9sIFJlZ2lzdGVyCQkxMS0yNworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIENGR19SVENTQwkoUlRDU0NfU0VDIHwgUlRDU0NfQUxSIHwgUlRDU0NfUlRGfCBSVENTQ19SVEUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBJU0NSIC0gUGVyaW9kaWMgSW50ZXJydXB0IFN0YXR1cyBhbmQgQ29udHJvbAkJMTEtMzEKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENsZWFyIFBlcmlvZGljIEludGVycnVwdCBTdGF0dXMsIEludGVycnVwdCBUaW1lciBmcmVlemluZyBlbmFibGVkCisgKi8KKyNkZWZpbmUgQ0ZHX1BJU0NSCShQSVNDUl9QUyB8IFBJU0NSX1BJVEYpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBMUFJDUiAtIFBMTCwgTG93LVBvd2VyLCBhbmQgUmVzZXQgQ29udHJvbCBSZWdpc3RlcgkJMTUtMzAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlc2V0IFBMTCBsb2NrIHN0YXR1cyBzdGlja3kgYml0LCB0aW1lciBleHBpcmVkIHN0YXR1cyBiaXQgYW5kIHRpbWVyCisgKiBpbnRlcnJ1cHQgc3RhdHVzIGJpdAorICoKKyAqIElmIHRoaXMgaXMgYSA4MCBNSHogQ1BVLCBzZXQgUExMIG11bHRpcGxpY2F0aW9uIGZhY3RvciB0byA1ICg1KjE2PTgwKSEKKyAqLworI2lmZGVmCUNDTV84ME1IegkvKiBmb3IgODAgTUh6LCB3ZSB1c2UgYSAxNiBNSHogY2xvY2sgKiA1ICovCisjZGVmaW5lIENGR19QTFBSQ1IJCQkJCQkJXAorCQkoICg1LTEpPDxQTFBSQ1JfTUZfU0hJRlQgfCBQTFBSQ1JfVEVYUFMgfCBQTFBSQ1JfVE1JU1QgKQorI2Vsc2UJCQkvKiB1cCB0byA1MCBNSHogd2UgdXNlIGEgMToxIGNsb2NrICovCisjZGVmaW5lIENGR19QTFBSQ1IJKFBMUFJDUl9TUExTUyB8IFBMUFJDUl9URVhQUyB8IFBMUFJDUl9UTUlTVCkKKyNlbmRpZgkvKiBDQ01fODBNSHogKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU0NDUiAtIFN5c3RlbSBDbG9jayBhbmQgcmVzZXQgQ29udHJvbCBSZWdpc3RlcgkJMTUtMjcKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNldCBjbG9jayBvdXRwdXQsIHRpbWViYXNlIGFuZCBSVEMgc291cmNlIGFuZCBkaXZpZGVyLAorICogcG93ZXIgbWFuYWdlbWVudCBhbmQgc29tZSBvdGhlciBpbnRlcm5hbCBjbG9ja3MKKyAqLworI2RlZmluZSBTQ0NSX01BU0sJU0NDUl9FQkRGMTEKKyNpZmRlZglDQ01fODBNSHoJLyogZm9yIDgwIE1Ieiwgd2UgdXNlIGEgMTYgTUh6IGNsb2NrICogNSAqLworI2RlZmluZSBDRkdfU0NDUgkoLyogU0NDUl9UQlMgIHwgKi8gXAorCQkJIFNDQ1JfQ09NMDAgICB8IFNDQ1JfREZTWU5DMDAgfCBTQ0NSX0RGQlJHMDAgIHwgXAorCQkJIFNDQ1JfREZOTDAwMCB8IFNDQ1JfREZOSDAwMCAgfCBTQ0NSX0RGTENEMDAwIHwgXAorCQkJIFNDQ1JfREZBTENEMDApCisjZWxzZQkJCS8qIHVwIHRvIDUwIE1IeiB3ZSB1c2UgYSAxOjEgY2xvY2sgKi8KKyNkZWZpbmUgQ0ZHX1NDQ1IJKFNDQ1JfVEJTICAgICB8IFwKKwkJCSBTQ0NSX0NPTTAwICAgfCBTQ0NSX0RGU1lOQzAwIHwgU0NDUl9ERkJSRzAwICB8IFwKKwkJCSBTQ0NSX0RGTkwwMDAgfCBTQ0NSX0RGTkgwMDAgIHwgU0NDUl9ERkxDRDAwMCB8IFwKKwkJCSBTQ0NSX0RGQUxDRDAwKQorI2VuZGlmCS8qIENDTV84ME1IeiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSW50ZXJydXB0IExldmVscworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIENGR19DUE1fSU5URVJSVVBUCTEzCS8qIFNJVV9MRVZFTDYJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNkZWZpbmUgQ0ZHX0RFUgkwCisKKy8qCisgKiBJbml0IE1lbW9yeSBDb250cm9sbGVyOgorICoKKyAqIEJSMC8xIGFuZCBPUjAvMSAoRkxBU0gpCisgKi8KKworI2RlZmluZSBGTEFTSF9CQVNFMF9QUkVMSU0JMHg0MDAwMDAwMAkvKiBGTEFTSCBiYW5rICMwCSovCisjZGVmaW5lIEZMQVNIX0JBU0UxX1BSRUxJTQkweDYwMDAwMDAwCS8qIEZMQVNIIGJhbmsgIzAJKi8KKworLyogdXNlZCB0byByZS1tYXAgRkxBU0ggYm90aCB3aGVuIHN0YXJ0aW5nIGZyb20gU1JBTSBvciBGTEFTSDoKKyAqIHJlc3RyaWN0IGFjY2VzcyBlbm91Z2ggdG8ga2VlcCBTUkFNIHdvcmtpbmcgKGlmIGFueSkKKyAqIGJ1dCBub3QgdG9vIG11Y2ggdG8gbWVkZGxlIHdpdGggRkxBU0ggYWNjZXNzZXMKKyAqLworI2RlZmluZSBDRkdfUkVNQVBfT1JfQU0JCTB4ODAwMDAwMDAJLyogT1IgYWRkciBtYXNrICovCisjZGVmaW5lIENGR19QUkVMSU1fT1JfQU0JMHhFMDAwMDAwMAkvKiBPUiBhZGRyIG1hc2sgKi8KKworLyogRkxBU0ggdGltaW5nOiBBQ1MgPSAxMSwgVFJMWCA9IDAsIENTTlQgPSAxLCBTQ1kgPSA1LCBFSFRSID0gMQkqLworI2RlZmluZSBDRkdfT1JfVElNSU5HX0ZMQVNICShPUl9DU05UX1NBTSAgfCBPUl9BQ1NfRElWMiB8IE9SX0JJIHwgXAorCQkJCSBPUl9TQ1lfNV9DTEsgfCBPUl9FSFRSKQorCisjZGVmaW5lIENGR19PUjBfUkVNQVAJKENGR19SRU1BUF9PUl9BTSAgfCBDRkdfT1JfVElNSU5HX0ZMQVNIKQorI2RlZmluZSBDRkdfT1IwX1BSRUxJTQkoQ0ZHX1BSRUxJTV9PUl9BTSB8IENGR19PUl9USU1JTkdfRkxBU0gpCisjZGVmaW5lIENGR19CUjBfUFJFTElNCSgoRkxBU0hfQkFTRTBfUFJFTElNICYgQlJfQkFfTVNLKSB8IEJSX1YgKQorCisjZGVmaW5lIENGR19PUjFfUkVNQVAJQ0ZHX09SMF9SRU1BUAorI2RlZmluZSBDRkdfT1IxX1BSRUxJTQlDRkdfT1IwX1BSRUxJTQorI2RlZmluZSBDRkdfQlIxX1BSRUxJTQkoKEZMQVNIX0JBU0UxX1BSRUxJTSAmIEJSX0JBX01TSykgfCBCUl9WICkKKworLyoKKyAqIEJSMiBhbmQgT1IyIChTRFJBTSkKKyAqCisgKi8KKyNkZWZpbmUgU0RSQU1fQkFTRTJfUFJFTElNCTB4MDAwMDAwMDAJLyogU0RSQU0gYmFuayAjMAkqLworI2RlZmluZSBTRFJBTV9CQVNFM19QUkVMSU0JMHgyMDAwMDAwMAkvKiBTRFJBTSBiYW5rICMxCSovCisjZGVmaW5lCVNEUkFNX01BWF9TSVpFCQkweDA0MDAwMDAwCS8qIG1heCA2NCBNQiBwZXIgYmFuawkqLworCisvKiBTRFJBTSB0aW1pbmc6IE11bHRpcGxleGVkIGFkZHJlc3NlcywgR1BMNSBvdXRwdXQgdG8gR1BMNV9BIChkb24ndCBjYXJlKQkqLworI2RlZmluZSBDRkdfT1JfVElNSU5HX1NEUkFNCTB4MDAwMDBBMDAKKworI2RlZmluZSBDRkdfT1IyX1BSRUxJTQkoQ0ZHX1BSRUxJTV9PUl9BTSB8IENGR19PUl9USU1JTkdfU0RSQU0gKQorI2RlZmluZSBDRkdfQlIyX1BSRUxJTQkoKFNEUkFNX0JBU0UyX1BSRUxJTSAmIEJSX0JBX01TSykgfCBCUl9NU19VUE1BIHwgQlJfViApCisKKy8qCisgKiBCUjMgYW5kIE9SMyAoQ0FOIENvbnRyb2xsZXIpCisgKi8KKyNkZWZpbmUJQ0ZHX0NBTl9CQVNFCQkweEMwMDAwMDAwCS8qIENBTiBtYXBwZWQgYXQgMHhDMDAwMDAwMAkqLworI2RlZmluZSBDRkdfQ0FOX09SX0FNCQkweEZGRkY4MDAwCS8qIDMyIGtCIGFkZHJlc3MgbWFzawkJKi8KKyNkZWZpbmUgQ0ZHX09SM19DQU4JCShDRkdfQ0FOX09SX0FNIHwgT1JfRzVMQSB8IE9SX0JJKQorI2RlZmluZSBDRkdfQlIzX0NBTgkJKChDRkdfQ0FOX0JBU0UgJiBCUl9CQV9NU0spIHwgXAorCQkJCQlCUl9QU184IHwgQlJfTVNfVVBNQiB8IEJSX1YgKQorCisvKgorICogQlI0L09SNDogUFVNQSBDb25maWcKKyAqCisgKiBNZW1vcnkgY29udHJvbGxlciB3aWxsIGJlIHVzZWQgaW4gMiBtb2RlczoKKyAqCisgKiAtICJyZWFkIiBtb2RlOgorICoJQlI0OiAweDEwMTAwODAxCQlPUjQ6IDB4ZmZmZjg1MjAKKyAqIC0gImxvYWQiIG1vZGUgKGNoaXAgc2VsZWN0IG9uIFVQTSBCKToKKyAqCUJSNDogMHgxMDEwMDRjMQkJT1I0OiAweGZmZmY4NjAwCisgKgorICogRGVmYXVsdCBpbml0aWFsaXphdGlvbiBpcyBpbiAicmVhZCIgbW9kZQorICovCisjZGVmaW5lIFBVTUFfQ09ORl9CQVNFCQkweDEwMTAwMDAwCS8qIFBVTUEgQ29uZmlnICovCisjZGVmaW5lIFBVTUFfQ09ORl9PUl9BTQkJMHhGRkZGODAwMAkvKiAzMiBrQiAqLworI2RlZmluZQlQVU1BX0NPTkZfTE9BRF9USU1JTkcJKE9SX0FDU19ESVYyCSB8IE9SX1NDWV8yX0NMSykKKyNkZWZpbmUgUFVNQV9DT05GX1JFQURfVElNSU5HCShPUl9HNUxBIHwgT1JfQkkgfCBPUl9TQ1lfMl9DTEspCisKKyNkZWZpbmUgUFVNQV9DT05GX0JSX0xPQUQJKChQVU1BX0NPTkZfQkFTRSAmIEJSX0JBX01TSykgfCBcCisJCQkJCUJSX1BTXzggIHwgQlJfTVNfVVBNQiB8IEJSX1YpCisjZGVmaW5lIFBVTUFfQ09ORl9PUl9MT0FECShQVU1BX0NPTkZfT1JfQU0gfCBQVU1BX0NPTkZfTE9BRF9USU1JTkcpCisKKyNkZWZpbmUgUFVNQV9DT05GX0JSX1JFQUQJKChQVU1BX0NPTkZfQkFTRSAmIEJSX0JBX01TSykgfCBCUl9QU18xNiB8IEJSX1YpCisjZGVmaW5lIFBVTUFfQ09ORl9PUl9SRUFECShQVU1BX0NPTkZfT1JfQU0gfCBQVU1BX0NPTkZfUkVBRF9USU1JTkcpCisKKyNkZWZpbmUgQ0ZHX0JSNF9QUkVMSU0JCVBVTUFfQ09ORl9CUl9SRUFECisjZGVmaW5lIENGR19PUjRfUFJFTElNCQlQVU1BX0NPTkZfT1JfUkVBRAorCisvKgorICogQlI1L09SNTogUFVNQTogU01BIEJ1cyA4IEJpdAorICoJQlI1OiAweDEwMjAwNDAxCQlPUjU6IDB4ZmZlMDAxMGEKKyAqLworI2RlZmluZSBQVU1BX1NNQThfQkFTRQkJMHgxMDIwMDAwMAkvKiBQVU1BIFNNQSBCdXMgOCBCaXQgKi8KKyNkZWZpbmUgUFVNQV9TTUE4X09SX0FNCQkweEZGRTAwMDAwCS8qIDIgTUIgKi8KKyNkZWZpbmUgUFVNQV9TTUE4X1RJTUlORwkoT1JfQkkgfCBPUl9TQ1lfMF9DTEsgfCBPUl9FSFRSKQorCisjZGVmaW5lIENGR19CUjVfUFJFTElNCQkoKFBVTUFfU01BOF9CQVNFICYgQlJfQkFfTVNLKSB8IEJSX1BTXzggfCBCUl9WKQorI2RlZmluZSBDRkdfT1I1X1BSRUxJTQkJKFBVTUFfU01BOF9PUl9BTSB8IFBVTUFfU01BOF9USU1JTkcgfCBPUl9TRVRBKQorCisvKgorICogQlI2L09SNjogUFVNQTogU01BIEJ1cyAxNiBCaXQKKyAqCUJSNjogMHgxMDYwMDgwMQkJT1I2OiAweGZmZTAwMTBhCisgKi8KKyNkZWZpbmUgUFVNQV9TTUExNl9CQVNFCQkweDEwNjAwMDAwCS8qIFBVTUEgU01BIEJ1cyAxNiBCaXQgKi8KKyNkZWZpbmUgUFVNQV9TTUExNl9PUl9BTQkweEZGRTAwMDAwCS8qIDIgTUIgKi8KKyNkZWZpbmUgUFVNQV9TTUExNl9USU1JTkcJKE9SX0JJIHwgT1JfU0NZXzBfQ0xLIHwgT1JfRUhUUikKKworI2RlZmluZSBDRkdfQlI2X1BSRUxJTQkJKChQVU1BX1NNQTE2X0JBU0UgJiBCUl9CQV9NU0spIHwgQlJfUFNfMTYgfCBCUl9WKQorI2RlZmluZSBDRkdfT1I2X1BSRUxJTQkJKFBVTUFfU01BMTZfT1JfQU0gfCBQVU1BX1NNQTE2X1RJTUlORyB8IE9SX1NFVEEpCisKKy8qCisgKiBCUjcvT1I3OiBQVU1BOiBleHRlcm5hbCBGbGFzaAorICoJQlI3OiAweDEwYTAwODAxCQlPUjc6IDB4ZmUwMDAxMGEKKyAqLworI2RlZmluZSBQVU1BX0ZMQVNIX0JBU0UJCTB4MTBBMDAwMDAJLyogUFVNQSBleHRlcm5hbCBGbGFzaCAqLworI2RlZmluZSBQVU1BX0ZMQVNIX09SX0FNCTB4RkUwMDAwMDAJLyogMzIgTUIgKi8KKyNkZWZpbmUgUFVNQV9GTEFTSF9USU1JTkcJKE9SX0JJIHwgT1JfU0NZXzBfQ0xLIHwgT1JfRUhUUikKKworI2RlZmluZSBDRkdfQlI3X1BSRUxJTQkJKChQVU1BX0ZMQVNIX0JBU0UgJiBCUl9CQV9NU0spIHwgQlJfUFNfMTYgfCBCUl9WKQorI2RlZmluZSBDRkdfT1I3X1BSRUxJTQkJKFBVTUFfRkxBU0hfT1JfQU0gfCBQVU1BX0ZMQVNIX1RJTUlORyB8IE9SX1NFVEEpCisKKworLyoKKyAqIE1lbW9yeSBQZXJpb2RpYyBUaW1lciBQcmVzY2FsZXIKKyAqLworCisvKiBwZXJpb2RpYyB0aW1lciBmb3IgcmVmcmVzaCAqLworI2RlZmluZSBDRkdfTUFNUl9QVEEJOTcJCS8qIHN0YXJ0IHdpdGggZGl2aWRlciBmb3IgMTAwIE1IegkqLworCisvKiByZWZyZXNoIHJhdGUgMTUuNiB1cyAoPSA2NCBtcyAvIDRLID0gNjIuNCAvIHF1YWQgYnVyc3RzKSBmb3IgPD0gMTI4IE1CaXQJKi8KKyNkZWZpbmUgQ0ZHX01QVFBSXzJCS180SwlNUFRQUl9QVFBfRElWMTYJCS8qIHNldHRpbmcgZm9yIDIgYmFua3MJKi8KKyNkZWZpbmUgQ0ZHX01QVFBSXzFCS180SwlNUFRQUl9QVFBfRElWMzIJCS8qIHNldHRpbmcgZm9yIDEgYmFuawkqLworCisvKiByZWZyZXNoIHJhdGUgNy44IHVzICg9IDY0IG1zIC8gOEsgPSAzMS4yIC8gcXVhZCBidXJzdHMpIGZvciAyNTYgTUJpdAkJKi8KKyNkZWZpbmUgQ0ZHX01QVFBSXzJCS184SwlNUFRQUl9QVFBfRElWOAkJLyogc2V0dGluZyBmb3IgMiBiYW5rcwkqLworI2RlZmluZSBDRkdfTVBUUFJfMUJLXzhLCU1QVFBSX1BUUF9ESVYxNgkJLyogc2V0dGluZyBmb3IgMSBiYW5rCSovCisKKy8qCisgKiBNQU1SIHNldHRpbmdzIGZvciBTRFJBTQorICovCisKKy8qIDggY29sdW1uIFNEUkFNICovCisjZGVmaW5lIENGR19NQU1SXzhDT0wJKChDRkdfTUFNUl9QVEEgPDwgTUFNUl9QVEFfU0hJRlQpICB8IE1BTVJfUFRBRQkgICAgfAlcCisJCQkgTUFNUl9BTUFfVFlQRV8wIHwgTUFNUl9EU0FfMV9DWUNMIHwgTUFNUl9HMENMQV9BMTEgfAlcCisJCQkgTUFNUl9STEZBXzFYCSB8IE1BTVJfV0xGQV8xWAkgICB8IE1BTVJfVExGQV80WCkKKy8qIDkgY29sdW1uIFNEUkFNICovCisjZGVmaW5lIENGR19NQU1SXzlDT0wJKChDRkdfTUFNUl9QVEEgPDwgTUFNUl9QVEFfU0hJRlQpICB8IE1BTVJfUFRBRQkgICAgfAlcCisJCQkgTUFNUl9BTUFfVFlQRV8xIHwgTUFNUl9EU0FfMV9DWUNMIHwgTUFNUl9HMENMQV9BMTAgfAlcCisJCQkgTUFNUl9STEZBXzFYCSB8IE1BTVJfV0xGQV8xWAkgICB8IE1BTVJfVExGQV80WCkKKworCisvKgorICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUJQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjk4MzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUuaApAQCAtMCwwICsxLDMzMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogU3RlZmFuIFJvZXNlLCBlc2QgZ21iaCBnZXJtYW55LCBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBib2FyZC9jb25maWcuaCAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYm9hcmQgc3BlY2lmaWMKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworCisjZGVmaW5lIENPTkZJR180MDVHUAkJMQkvKiBUaGlzIGlzIGEgUFBDNDA1IENQVQkJKi8KKyNkZWZpbmUgQ09ORklHXzR4eAkJMQkvKiAuLi5tZW1iZXIgb2YgUFBDNHh4IGZhbWlseSAgICovCisjZGVmaW5lIENPTkZJR19DUENJNDA1CQkxCS8qIC4uLm9uIGEgQ1BDSTQwNSBib2FyZAkqLworCisjZGVmaW5lIENPTkZJR19CT0FSRF9QUkVfSU5JVCAgIDEgICAgICAgLyogY2FsbCBib2FyZF9wcmVfaW5pdCgpICAgICAgICAqLworCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgICAgIDMzMDAwMDAwIC8qIGV4dGVybmFsIGZyZXF1ZW5jeSB0byBwbGwgICAqLworCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMJLyogYXV0b2Jvb3QgYWZ0ZXIgMyBzZWNvbmRzCSovCisKKyNpZiAwCisjZGVmaW5lIENPTkZJR19QUkVCT09UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImNyYzMyIGYwMjA3MDA0IGZmYyAwOyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiaWYgY21wIDAgZjAyMDcwMDAgMTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJ0aGVuO2VjaG8gT2xkIENSQyBpcyBjb3JyZWN0O2NyYzMyIGYwMjA3MDA0IGZmNCBmMDIwNzAwMDsiICAgICAgICAgICAgIFwKKyAgICAgICAgImVsc2U7ZWNobyBPbGQgQ1JDIGlzIGJhZDtmaSIKKyNlbmRpZgorCisjdW5kZWYJQ09ORklHX0JPT1RBUkdTCisjZGVmaW5lIENPTkZJR19SQU1CT09UQ09NTUFORAkJCQkJCQlcCisJInNldGVudiBib290YXJncyByb290PS9kZXYvcmFtIHJ3IG5mc3Jvb3Q9JChzZXJ2ZXJpcCk6JChyb290cGF0aCkgIglcCisJImlwPSQoaXBhZGRyKTokKHNlcnZlcmlwKTokKGdhdGV3YXlpcCk6JChuZXRtYXNrKTokKGhvc3RuYW1lKTo6b2ZmOyIJXAorCSJib290bSBmZmMwMDAwMCBmZmNhMDAwMCIKKyNkZWZpbmUgQ09ORklHX05GU0JPT1RDT01NQU5ECQkJCQkJCVwKKwkic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgbmZzcm9vdD0kKHNlcnZlcmlwKTokKHJvb3RwYXRoKSAiCVwKKwkiaXA9JChpcGFkZHIpOiQoc2VydmVyaXApOiQoZ2F0ZXdheWlwKTokKG5ldG1hc2spOiQoaG9zdG5hbWUpOjpvZmY7IglcCisJImJvb3RtIGZmYzAwMDAwIgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQgQ09ORklHX1JBTUJPT1RDT01NQU5ECisKKyNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KKyNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCisKKyNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCisjZGVmaW5lCUNPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCisKKyNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCisJCQkJQ0ZHX0NNRF9QQ0kJfCBcCisJCQkJQ0ZHX0NNRF9JUlEJfCBcCisJCQkJQ0ZHX0NNRF9JREUJfCBcCisJCQkJQ0ZHX0NNRF9FTEYJfCBcCisJCQkJQ0ZHX0NNRF9FRVBST00gICkKKworI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgorI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgorCisvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCisjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKyN1bmRlZiAgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCisKKyNkZWZpbmUJQ09ORklHX1NEUkFNX0JBTkswCTEJLyogaW5pdCBvbmJvYXJkIFNEUkFNIGJhbmsgMAkqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCisKKyN1bmRlZglDRkdfSFVTSF9QQVJTRVIJCQkvKiB1c2UgImh1c2giIGNvbW1hbmQgcGFyc2VyCSovCisjaWZkZWYJQ0ZHX0hVU0hfUEFSU0VSCisjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgorI2VuZGlmCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZWxzZQorI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbmRpZgorI2RlZmluZSBDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX01BWEFSR1MJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDRkdfREVWSUNFX05VTExERVYgICAgICAxICAgICAgIC8qIGluY2x1ZGUgbnVsbGRldiBkZXZpY2UgICAgICAgKi8KKworI2RlZmluZSBDRkdfQ09OU09MRV9JTkZPX1FVSUVUICAxICAgICAgIC8qIGRvbid0IHByaW50IGNvbnNvbGUgQCBzdGFydHVwKi8KKworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDA0MDAwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MEMwMDAwMAkvKiA0IC4uLiAxMiBNQiBpbiBEUkFNCSovCisKKyN1bmRlZiAgQ0ZHX0VYVF9TRVJJQUxfQ0xPQ0sgICAgICAgICAgIC8qIG5vIGV4dGVybmFsIHNlcmlhbCBjbG9jayB1c2VkICovCisjZGVmaW5lIENGR19JR05PUkVfNDA1X1VBUlRfRVJSQVRBXzU5ICAgLyogaWdub3JlIHBwYzQwNWdwIGVycmF0YSAjNTkgICAqLworI2RlZmluZSBDRkdfQkFTRV9CQVVEICAgICAgIDY5MTIwMAorCisvKiBUaGUgZm9sbG93aW5nIHRhYmxlIGluY2x1ZGVzIHRoZSBzdXBwb3J0ZWQgYmF1ZHJhdGVzICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgICAgIFwKKyAgICAgICAgeyAzMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCAgICAgXAorICAgICAgICAgNTc2MDAsIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsIDkyMTYwMCB9CisKKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDEwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfRVhUQkRJTkZPCTEJCS8qIFRvIHVzZSBleHRlbmRlZCBib2FyZF9pbnRvIChiZF90KSAqLworCisjZGVmaW5lCUNGR19IWgkJMTAwMAkJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcwkqLworCisjZGVmaW5lIENPTkZJR19aRVJPX0JPT1RERUxBWV9DSEVDSwkvKiBjaGVjayBmb3Iga2V5cHJlc3Mgb24gYm9vdGRlbGF5PT0wICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBDSSBzdHVmZgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIFBDSV9IT1NUX0FEQVBURVIgMCAgICAgICAgICAgICAgLyogY29uZmlndXJlIGFzIHBjaSBhZGFwdGVyICAgICAqLworI2RlZmluZSBQQ0lfSE9TVF9GT1JDRSAgMSAgICAgICAgICAgICAgIC8qIGNvbmZpZ3VyZSBhcyBwY2kgaG9zdCAgICAgICAgKi8KKyNkZWZpbmUgUENJX0hPU1RfQVVUTyAgIDIgICAgICAgICAgICAgICAvKiBkZXRlY3RlZCB2aWEgYXJiaXRlciBlbmFibGUgICovCisKKyNkZWZpbmUgQ09ORklHX1BDSQkJCS8qIGluY2x1ZGUgcGNpIHN1cHBvcnQJICAgICAgICAqLworI2RlZmluZSBDT05GSUdfUENJX0hPU1QJUENJX0hPU1RfQVVUTyAgIC8qIHNlbGVjdCBwY2kgaG9zdCBmdW5jdGlvbiAgICAgKi8KKyNkZWZpbmUgQ09ORklHX1BDSV9QTlAJCQkvKiBkbyBwY2kgcGx1Zy1hbmQtcGxheSAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzb3VyY2UgY29uZmlndXJhdGlvbiAgICAgICAqLworCisjZGVmaW5lIENPTkZJR19QQ0lfU0NBTl9TSE9XICAgICAgICAgICAgLyogcHJpbnQgcGNpIGRldmljZXMgQCBzdGFydHVwICAqLworCisjZGVmaW5lIENGR19QQ0lfU1VCU1lTX1ZFTkRPUklEIDB4MTJGRSAgLyogUENJIFZlbmRvciBJRDogZXNkIGdtYmggICAgICAqLworI2RlZmluZSBDRkdfUENJX1NVQlNZU19ERVZJQ0VJRCAweDA0MDUgIC8qIFBDSSBEZXZpY2UgSUQ6IENQQ0ktNDA1ICAgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfREVWSUNFSUQyIDB4MDQwNiAvKiBQQ0kgRGV2aWNlIElEOiBDUENJLTQwNS1BICAgICovCisjZGVmaW5lIENGR19QQ0lfQ0xBU1NDT0RFICAgICAgIDB4MGIyMCAgLyogUENJIENsYXNzIENvZGU6IFByb2Nlc3Nvci9QUEMqLworI2RlZmluZSBDRkdfUENJX1BUTTFMQSAgMHgwMDAwMDAwMCAgICAgIC8qIHBvaW50IHRvIHNkcmFtICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0xTVMgIDB4ZmMwMDAwMDEgICAgICAvKiA2NE1CLCBlbmFibGUgaGFyZC13aXJlZCB0byAxICovCisjZGVmaW5lIENGR19QQ0lfUFRNMVBDSSAweDAwMDAwMDAwICAgICAgLyogSG9zdDogdXNlIHRoaXMgcGNpIGFkZHJlc3MgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTJMQSAgMHhmZmMwMDAwMCAgICAgIC8qIHBvaW50IHRvIGZsYXNoICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0yTVMgIDB4ZmZjMDAwMDEgICAgICAvKiA0TUIsIGVuYWJsZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMlBDSSAweDA0MDAwMDAwICAgICAgLyogSG9zdDogdXNlIHRoaXMgcGNpIGFkZHJlc3MgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJREUvQVRBIHN0dWZmCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyN1bmRlZiAgQ09ORklHX0lERV84eHhfRElSRUNUICAgICAgICAgICAgICAgLyogbm8gcGNtY2lhIGludGVyZmFjZSByZXF1aXJlZCAqLworI3VuZGVmICBDT05GSUdfSURFX0xFRCAgICAgICAgICAgICAgICAgIC8qIG5vIGxlZCBmb3IgaWRlIHN1cHBvcnRlZCAgICAgKi8KKyN1bmRlZiAgQ09ORklHX0lERV9SRVNFVCAgICAgICAgICAgICAgICAvKiBubyByZXNldCBmb3IgaWRlIHN1cHBvcnRlZCAgICovCisKKyNkZWZpbmUJQ0ZHX0lERV9NQVhCVVMJICAgICAgICAxCQkvKiBtYXguIDEgSURFIGJ1c3NlcwkqLworI2RlZmluZQlDRkdfSURFX01BWERFVklDRQkoQ0ZHX0lERV9NQVhCVVMqMSkgLyogbWF4LiAxIGRyaXZlcyBwZXIgSURFIGJ1cyAqLworCisjZGVmaW5lCUNGR19BVEFfQkFTRV9BRERSCTB4RjAxMDAwMDAKKyNkZWZpbmUJQ0ZHX0FUQV9JREUwX09GRlNFVAkweDAwMDAKKworI2RlZmluZSBDRkdfQVRBX0RBVEFfT0ZGU0VUCTB4MDAwMAkvKiBPZmZzZXQgZm9yIGRhdGEgSS9PCQkJKi8KKyNkZWZpbmUJQ0ZHX0FUQV9SRUdfT0ZGU0VUCTB4MDAwMAkvKiBPZmZzZXQgZm9yIG5vcm1hbCByZWdpc3RlciBhY2Nlc3NlcwkqLworI2RlZmluZSBDRkdfQVRBX0FMVF9PRkZTRVQJMHgwMDAwCS8qIE9mZnNldCBmb3IgYWx0ZXJuYXRlIHJlZ2lzdGVycwkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFydCBhZGRyZXNzZXMgZm9yIHRoZSBmaW5hbCBtZW1vcnkgY29uZmlndXJhdGlvbgorICogKFNldCB1cCBieSB0aGUgc3RhcnR1cCBjb2RlKQorICogUGxlYXNlIG5vdGUgdGhhdCBDRkdfU0RSQU1fQkFTRSBfbXVzdF8gc3RhcnQgYXQgMAorICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZGRkQwMDAwCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJQ0ZHX0ZMQVNIX0JBU0UKKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMTkyICogMTAyNCkJLyogUmVzZXJ2ZSAxOTYga0IgZm9yIE1vbml0b3IJKi8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSgxMjggKiAxMDI0KQkvKiBSZXNlcnZlIDEyOCBrQiBmb3IgbWFsbG9jKCkJKi8KKworLyoKKyAqIEZvciBib290aW5nIExpbnV4LCB0aGUgYm9hcmQgaW5mbyBhbmQgY29tbWFuZCBsaW5lIGRhdGEKKyAqIGhhdmUgdG8gYmUgaW4gdGhlIGZpcnN0IDggTUIgb2YgbWVtb3J5LCBzaW5jZSB0aGlzIGlzCisgKiB0aGUgbWF4aW11bSBtYXBwZWQgYnkgdGhlIExpbnV4IGtlcm5lbCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKi8KKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXggKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZMQVNIIG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMgkvKiBtYXggbnVtYmVyIG9mIG1lbW9yeSBiYW5rcwkJKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTI1NgkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAJKi8KKworI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkxMjAwMDAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKGluIG1zKQkqLworI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAk1MDAJLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKGluIG1zKQkqLworCisjZGVmaW5lIENGR19GTEFTSF9XT1JEX1NJWkUgICAgIHVuc2lnbmVkIHNob3J0ICAvKiBmbGFzaCB3b3JkIHNpemUgKHdpZHRoKSAgICAgICovCisjZGVmaW5lIENGR19GTEFTSF9BRERSMCAgICAgICAgIDB4NTU1NSAgLyogMXN0IGFkZHJlc3MgZm9yIGZsYXNoIGNvbmZpZyBjeWNsZXMgICovCisjZGVmaW5lIENGR19GTEFTSF9BRERSMSAgICAgICAgIDB4MkFBQSAgLyogMm5kIGFkZHJlc3MgZm9yIGZsYXNoIGNvbmZpZyBjeWNsZXMgICovCisvKgorICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBhZGRlZCBmb3IgYnVnZ3kgSU9QNDgwIGJ5dGUgaW50ZXJmYWNlLgorICogQWxsIG90aGVyIGJvYXJkcyBzaG91bGQgdXNlIHRoZSBzdGFuZGFyZCB2YWx1ZXMgKENQQ0k0MDUgZXRjLikKKyAqLworI2RlZmluZSBDRkdfRkxBU0hfUkVBRDAgICAgICAgICAweDAwMDAgIC8qIDAgaXMgc3RhbmRhcmQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRkxBU0hfUkVBRDEgICAgICAgICAweDAwMDEgIC8qIDEgaXMgc3RhbmRhcmQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRkxBU0hfUkVBRDIgICAgICAgICAweDAwMDIgIC8qIDIgaXMgc3RhbmRhcmQgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIENGR19GTEFTSF9FTVBUWV9JTkZPICAgICAgICAgICAgLyogcHJpbnQgJ0UnIGZvciBlbXB0eSBzZWN0b3Igb24gZmxpbmZvICovCisKKyNpZiAxIC8qIFVzZSBOVlJBTSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBOVlJBTSBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfRU5WX0lTX0lOX05WUkFNCTEJLyogdXNlIE5WUkFNIGZvciBlbnZpcm9ubWVudCB2YXJzCSovCisjZGVmaW5lIENGR19OVlJBTV9CQVNFX0FERFIJMHhmMDIwMDAwMAkJLyogTlZSQU0gYmFzZSBhZGRyZXNzCSovCisjZGVmaW5lIENGR19OVlJBTV9TSVpFCQkoMzIqMTAyNCkJCS8qIE5WUkFNIHNpemUJCSovCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHgxMDAwCQkvKiBTaXplIG9mIEVudmlyb25tZW50IHZhcnMJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQlcCisJKENGR19OVlJBTV9CQVNFX0FERFIrQ0ZHX05WUkFNX1NJWkUtQ0ZHX0VOVl9TSVpFKQkvKiBFbnYJKi8KKyNkZWZpbmUgQ0ZHX05WUkFNX1ZYV09SS1NfT0ZGUwkweDY5MDAJCS8qIE9mZnNldCBmb3IgVnhXb3JrcyBldGgtYWRkcgkqLworCisjZWxzZSAvKiBVc2UgRUVQUk9NIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKworI2RlZmluZSBDRkdfRU5WX0lTX0lOX0VFUFJPTSAgICAxICAgICAgIC8qIHVzZSBFRVBST00gZm9yIGVudmlyb25tZW50IHZhcnMgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9PRkZTRVQgICAgICAgICAgMHgwMDAgICAvKiBlbnZpcm9ubWVudCBzdGFydHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgRUVQUk9NICovCisjZGVmaW5lIENGR19FTlZfU0laRSAgICAgICAgICAgIDB4MjAwICAgLyogNTEyIGJ5dGVzIG1heSBiZSB1c2VkIGZvciBlbnYgdmFycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0b3RhbCBzaXplIG9mIGEgQ0FUMjRXQzA4IGlzIDEwMjQgYnl0ZXMgKi8KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJMkMgRUVQUk9NIChDQVQyNFdDMDgpIGZvciBlbnZpcm9ubWVudAorICovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJCS8qIEkyYyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCisKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDUwCS8qIEVFUFJPTSBDQVQyOFdDMDgJCSovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOCTEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KKy8qIG1hc2sgb2YgYWRkcmVzcyBiaXRzIHRoYXQgb3ZlcmZsb3cgaW50byB0aGUgIkVFUFJPTSBjaGlwIGFkZHJlc3MiICAgICovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfT1ZFUkZMT1cJMHgwNworI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfQklUUyA0CS8qIFRoZSBDYXRhbHlzdCBDQVQyNFdDMDggaGFzCSovCisJCQkJCS8qIDE2IGJ5dGUgcGFnZSB3cml0ZSBtb2RlIHVzaW5nKi8KKwkJCQkJLyogbGFzdAk0IGJpdHMgb2YgdGhlIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTEwICAgLyogYW5kIHRha2VzIHVwIHRvIDEwIG1zZWMgKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0VOQUJMRQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBJQk0gNDA1IENQVXMJCQkqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKyNlbmRpZgorCisvKgorICogSW5pdCBNZW1vcnkgQ29udHJvbGxlcjoKKyAqCisgKiBCUjAvMSBhbmQgT1IwLzEgKEZMQVNIKQorICovCisKKyNkZWZpbmUgRkxBU0hfQkFTRTBfUFJFTElNCTB4RkY4MDAwMDAJLyogRkxBU0ggYmFuayAjMAkqLworI2RlZmluZSBGTEFTSF9CQVNFMV9QUkVMSU0JMHhGRkMwMDAwMAkvKiBGTEFTSCBiYW5rICMxCSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dGVybmFsIEJ1cyBDb250cm9sbGVyIChFQkMpIFNldHVwCisgKi8KKworLyogTWVtb3J5IEJhbmsgMCAoRmxhc2ggQmFuayAwKSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCMEFQICAgICAgICAgICAweDkyMDE1NDgwCisjZGVmaW5lIENGR19FQkNfUEIwQ1IgICAgICAgICAgIDB4RkZDNUEwMDAgIC8qIEJBUz0weEZGQyxCUz00TUIsQlU9Ui9XLEJXPTE2Yml0ICovCisKKy8qIE1lbW9yeSBCYW5rIDEgKEZsYXNoIEJhbmsgMSkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjFBUCAgICAgICAgICAgMHg5MjAxNTQ4MAorI2RlZmluZSBDRkdfRUJDX1BCMUNSICAgICAgICAgICAweEZGODVBMDAwICAvKiBCQVM9MHhGRjgsQlM9NE1CLEJVPVIvVyxCVz0xNmJpdCAqLworCisvKiBNZW1vcnkgQmFuayAyIChDQU4wLCAxLCAyLCBDb2Rlc3dpdGNoKSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEIyQVAgICAgICAgICAgIDB4MDEwMDUzQzAgIC8qIEJXVD0yLFdCTj0xLFdCRj0xLFRIPTEsUkU9MSxTT1I9MSxCRU09MSAqLworI2RlZmluZSBDRkdfRUJDX1BCMkNSICAgICAgICAgICAweEYwMDE4MDAwICAvKiBCQVM9MHhGMDAsQlM9MU1CLEJVPVIvVyxCVz04Yml0ICAqLworCisvKiBNZW1vcnkgQmFuayAzIChDb21wYWN0Rmxhc2ggSURFKSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEIzQVAgICAgICAgICAgIDB4MDEwMDUzQzAgIC8qIEJXVD0yLFdCTj0xLFdCRj0xLFRIPTEsUkU9MSxTT1I9MSxCRU09MSAqLworI2RlZmluZSBDRkdfRUJDX1BCM0NSICAgICAgICAgICAweEYwMTFBMDAwICAvKiBCQVM9MHhGMDEsQlM9MU1CLEJVPVIvVyxCVz0xNmJpdCAqLworCisvKiBNZW1vcnkgQmFuayA0IChOVlJBTSkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEI0QVAgICAgICAgICAgIDB4MDEwMDUyODAgIC8qIFRXVD0yLFdCTj0xLFdCRj0xLFRIPTEsU09SPTEgICAgICovCisjZGVmaW5lIENGR19FQkNfUEI0Q1IgICAgICAgICAgIDB4RjAyMTgwMDAgIC8qIEJBUz0weEYwMixCUz0xTUIsQlU9Ui9XLEJXPThiaXQgICovCisKKy8qIE1lbW9yeSBCYW5rIDUgKFF1YXJ0KSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjVBUCAgICAgICAgICAgMHgwNDAwNUI4MCAgLyogVFdUPTgsV0JOPTEsV0JGPTEsVEg9NSxSRT0xLFNPUj0xKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjVDUiAgICAgICAgICAgMHhGMDMxODAwMCAgLyogQkFTPTB4RjAzLEJTPTFNQixCVT1SL1csQlc9OGJpdCAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRlBHQSBzdHVmZgorICovCisKKy8qIEZQR0EgcHJvZ3JhbSBwaW4gY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDRkdfRlBHQV9QUkcgICAgICAgICAgICAweDA0MDAwMDAwICAvKiBGUEdBIHByb2dyYW0gcGluIChwcGMgb3V0cHV0KSAqLworI2RlZmluZSBDRkdfRlBHQV9DTEsgICAgICAgICAgICAweDAyMDAwMDAwICAvKiBGUEdBIGNsayBwaW4gKHBwYyBvdXRwdXQpICAgICAqLworI2RlZmluZSBDRkdfRlBHQV9EQVRBICAgICAgICAgICAweDAxMDAwMDAwICAvKiBGUEdBIGRhdGEgcGluIChwcGMgb3V0cHV0KSAgICAqLworI2RlZmluZSBDRkdfRlBHQV9JTklUICAgICAgICAgICAweDAwNDAwMDAwICAvKiBGUEdBIGluaXQgcGluIChwcGMgaW5wdXQpICAgICAqLworI2RlZmluZSBDRkdfRlBHQV9ET05FICAgICAgICAgICAweDAwODAwMDAwICAvKiBGUEdBIGRvbmUgcGluIChwcGMgaW5wdXQpICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWZpbml0aW9ucyBmb3IgaW5pdGlhbCBzdGFjayBwb2ludGVyIGFuZCBkYXRhIGFyZWEgKGluIGRhdGEgY2FjaGUpCisgKi8KKyNpZiAxIC8qIHRlc3Qtb25seSAqLworI2RlZmluZSBDRkdfSU5JVF9EQ0FDSEVfQ1MgICAgICA3ICAgICAgIC8qIHVzZSBjcyAjIDcgZm9yIGRhdGEgY2FjaGUgbWVtb3J5ICAgICovCisKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIgICAgICAgMHg0MDAwMDAwMCAgLyogdXNlIGRhdGEgY2FjaGUgICAgICAgICAgICAgICAgICAqLworI2Vsc2UKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJMHgwMGRmMDAwMCAvKiBpbnNpZGUgb2YgU0RSQU0gICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5EICAgICAgICAweDIwMDAgIC8qIEVuZCBvZiB1c2VkIGFyZWEgaW4gUkFNICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFICAgICAgMTI4ICAvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVCAgICAoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQgICAgICBDRkdfR0JMX0RBVEFfT0ZGU0VUCisKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTMzODI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmgKQEAgLTAsMCArMSwzNzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFN0ZWZhbiBSb2VzZSwgZXNkIGdtYmggZ2VybWFueSwgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogYm9hcmQvY29uZmlnLmggLSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGJvYXJkIHNwZWNpZmljCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKworI2RlZmluZSBDT05GSUdfNDA1R1AJCTEJLyogVGhpcyBpcyBhIFBQQzQwNSBDUFUJCSovCisjZGVmaW5lIENPTkZJR180eHgJCTEJLyogLi4ubWVtYmVyIG9mIFBQQzR4eCBmYW1pbHkgICAqLworI2RlZmluZSBDT05GSUdfQ1BDSTQwNQkJMQkvKiAuLi5vbiBhIENQQ0k0MDUgYm9hcmQJKi8KKyNkZWZpbmUgQ09ORklHX0NQQ0k0MDVfVkVSMiAgICAgMSAgICAgICAvKiAuLi52ZXJzaW9uIDIgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ09ORklHX0JPQVJEX1BSRV9JTklUICAgMSAgICAgICAvKiBjYWxsIGJvYXJkX3ByZV9pbml0KCkgICAgICAgICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgICAgMzMzMzMzMzMgLyogZXh0ZXJuYWwgZnJlcXVlbmN5IHRvIHBsbCAgICovCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk5NjAwCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwkvKiBhdXRvYm9vdCBhZnRlciAzIHNlY29uZHMJKi8KKworI2lmIDAKKyNkZWZpbmUgQ09ORklHX1BSRUJPT1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiY3JjMzIgZjAyMDcwMDQgZmZjIDA7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJpZiBjbXAgMCBmMDIwNzAwMCAxOyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInRoZW47ZWNobyBPbGQgQ1JDIGlzIGNvcnJlY3Q7Y3JjMzIgZjAyMDcwMDQgZmY0IGYwMjA3MDAwOyIgICAgICAgICAgICAgXAorICAgICAgICAiZWxzZTtlY2hvIE9sZCBDUkMgaXMgYmFkO2ZpIgorI2VuZGlmCisKKyN1bmRlZglDT05GSUdfQk9PVEFSR1MKKyNkZWZpbmUgQ09ORklHX1JBTUJPT1RDT01NQU5ECQkJCQkJCVwKKwkic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcncgbmZzcm9vdD0kKHNlcnZlcmlwKTokKHJvb3RwYXRoKSAiCVwKKwkiaXA9JChpcGFkZHIpOiQoc2VydmVyaXApOiQoZ2F0ZXdheWlwKTokKG5ldG1hc2spOiQoaG9zdG5hbWUpOjpvZmY7IglcCisJImJvb3RtIGZmYzAwMDAwIGZmY2EwMDAwIgorI2RlZmluZSBDT05GSUdfTkZTQk9PVENPTU1BTkQJCQkJCQkJXAorCSJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyBuZnNyb290PSQoc2VydmVyaXApOiQocm9vdHBhdGgpICIJXAorCSJpcD0kKGlwYWRkcik6JChzZXJ2ZXJpcCk6JChnYXRld2F5aXApOiQobmV0bWFzayk6JChob3N0bmFtZSk6Om9mZjsiCVwKKwkiYm9vdG0gZmZjMDAwMDAiCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORCBDT05GSUdfUkFNQk9PVENPTU1BTkQKKworI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLworI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KKworI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KKyNkZWZpbmUJQ09ORklHX1BIWV9BRERSCQkwCS8qIFBIWSBhZGRyZXNzCQkJKi8KKworI2RlZmluZSBDT05GSUdfUlRDX000OFQzNUEJMQkJLyogU1QgRWxlY3Ryb25pY3MgTTQ4IHRpbWVrZWVwZXIgKi8KKworI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKKwkJCQlDRkdfQ01EX1BDSQl8IFwKKwkJCQlDRkdfQ01EX0lSUQl8IFwKKwkJCQlDRkdfQ01EX0lERQl8IFwKKwkJCQlDRkdfQ01EX0VMRgl8IFwKKwkJCQlDRkdfQ01EX0RBVEUJfCBcCisJCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKKwkJCQlDRkdfQ01EX0kyQwl8IFwKKwkJCQlDRkdfQ01EX0VFUFJPTSAgKQorCisjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCisjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCisKKy8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KKyNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworI3VuZGVmICBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KKworI2RlZmluZQlDT05GSUdfU0RSQU1fQkFOSzAJMQkvKiBpbml0IG9uYm9hcmQgU0RSQU0gYmFuayAwCSovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCisjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKworI3VuZGVmCUNGR19IVVNIX1BBUlNFUgkJCS8qIHVzZSAiaHVzaCIgY29tbWFuZCBwYXJzZXIJKi8KKyNpZmRlZglDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCisjZW5kaWYKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbHNlCisjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2VuZGlmCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENGR19ERVZJQ0VfTlVMTERFViAgICAgIDEgICAgICAgLyogaW5jbHVkZSBudWxsZGV2IGRldmljZSAgICAgICAqLworCisjZGVmaW5lIENGR19DT05TT0xFX0lORk9fUVVJRVQgIDEgICAgICAgLyogZG9uJ3QgcHJpbnQgY29uc29sZSBAIHN0YXJ0dXAqLworCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDQwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwQzAwMDAwCS8qIDQgLi4uIDEyIE1CIGluIERSQU0JKi8KKworI3VuZGVmICBDRkdfRVhUX1NFUklBTF9DTE9DSyAgICAgICAgICAgLyogbm8gZXh0ZXJuYWwgc2VyaWFsIGNsb2NrIHVzZWQgKi8KKyNkZWZpbmUgQ0ZHX0lHTk9SRV80MDVfVUFSVF9FUlJBVEFfNTkgICAvKiBpZ25vcmUgcHBjNDA1Z3AgZXJyYXRhICM1OSAgICovCisjZGVmaW5lIENGR19CQVNFX0JBVUQgICAgICAgNjkxMjAwCisKKy8qIFRoZSBmb2xsb3dpbmcgdGFibGUgaW5jbHVkZXMgdGhlIHN1cHBvcnRlZCBiYXVkcmF0ZXMgKi8KKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFICAgICAgXAorICAgICAgICB7IDMwMCwgNjAwLCAxMjAwLCAyNDAwLCA0ODAwLCA5NjAwLCAxOTIwMCwgMzg0MDAsICAgICBcCisgICAgICAgICA1NzYwMCwgMTE1MjAwLCAyMzA0MDAsIDQ2MDgwMCwgOTIxNjAwIH0KKworI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MTAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19FWFRCRElORk8JMQkJLyogVG8gdXNlIGV4dGVuZGVkIGJvYXJkX2ludG8gKGJkX3QpICovCisKKyNkZWZpbmUJQ0ZHX0haCQkxMDAwCQkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzCSovCisKKyNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCS8qIGNoZWNrIGZvciBrZXlwcmVzcyBvbiBib290ZGVsYXk9PTAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUENJIHN0dWZmCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgUENJX0hPU1RfQURBUFRFUiAwICAgICAgICAgICAgICAvKiBjb25maWd1cmUgYXMgcGNpIGFkYXB0ZXIgICAgICovCisjZGVmaW5lIFBDSV9IT1NUX0ZPUkNFICAxICAgICAgICAgICAgICAgLyogY29uZmlndXJlIGFzIHBjaSBob3N0ICAgICAgICAqLworI2RlZmluZSBQQ0lfSE9TVF9BVVRPICAgMiAgICAgICAgICAgICAgIC8qIGRldGVjdGVkIHZpYSBhcmJpdGVyIGVuYWJsZSAgKi8KKworI2RlZmluZSBDT05GSUdfUENJCQkJLyogaW5jbHVkZSBwY2kgc3VwcG9ydAkgICAgICAgICovCisjZGVmaW5lIENPTkZJR19QQ0lfSE9TVAlQQ0lfSE9TVF9BVVRPICAgLyogc2VsZWN0IHBjaSBob3N0IGZ1bmN0aW9uICAgICAqLworI2RlZmluZSBDT05GSUdfUENJX1BOUAkJCS8qIGRvIHBjaSBwbHVnLWFuZC1wbGF5ICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNvdXJjZSBjb25maWd1cmF0aW9uICAgICAgICovCisKKyNkZWZpbmUgQ09ORklHX1BDSV9TQ0FOX1NIT1cgICAgICAgICAgICAvKiBwcmludCBwY2kgZGV2aWNlcyBAIHN0YXJ0dXAgICovCisKKyNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfVkVORE9SSUQgMHgxMkZFICAvKiBQQ0kgVmVuZG9yIElEOiBlc2QgZ21iaCAgICAgICovCisjZGVmaW5lIENGR19QQ0lfU1VCU1lTX0RFVklDRUlEIDB4MDQwNSAgLyogUENJIERldmljZSBJRDogQ1BDSS00MDUgICAgICAqLworI2RlZmluZSBDRkdfUENJX1NVQlNZU19ERVZJQ0VJRDIgMHgwNDA2IC8qIFBDSSBEZXZpY2UgSUQ6IENQQ0ktNDA1LUEgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9DTEFTU0NPREUgICAgICAgMHgwYjIwICAvKiBQQ0kgQ2xhc3MgQ29kZTogUHJvY2Vzc29yL1BQQyovCisjZGVmaW5lIENGR19QQ0lfUFRNMUxBICAweDAwMDAwMDAwICAgICAgLyogcG9pbnQgdG8gc2RyYW0gICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTFNUyAgMHhmYzAwMDAwMSAgICAgIC8qIDY0TUIsIGVuYWJsZSBoYXJkLXdpcmVkIHRvIDEgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0xUENJIDB4MDAwMDAwMDAgICAgICAvKiBIb3N0OiB1c2UgdGhpcyBwY2kgYWRkcmVzcyAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMkxBICAweGZmYzAwMDAwICAgICAgLyogcG9pbnQgdG8gZmxhc2ggICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTJNUyAgMHhmZmMwMDAwMSAgICAgIC8qIDRNQiwgZW5hYmxlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0yUENJIDB4MDQwMDAwMDAgICAgICAvKiBIb3N0OiB1c2UgdGhpcyBwY2kgYWRkcmVzcyAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElERS9BVEEgc3R1ZmYKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI3VuZGVmICBDT05GSUdfSURFXzh4eF9ESVJFQ1QgICAgICAgICAgICAgICAvKiBubyBwY21jaWEgaW50ZXJmYWNlIHJlcXVpcmVkICovCisjdW5kZWYgIENPTkZJR19JREVfTEVEICAgICAgICAgICAgICAgICAgLyogbm8gbGVkIGZvciBpZGUgc3VwcG9ydGVkICAgICAqLworI2RlZmluZSBDT05GSUdfSURFX1JFU0VUCTEJLyogcmVzZXQgZm9yIGlkZSBzdXBwb3J0ZWQJKi8KKworI2RlZmluZQlDRkdfSURFX01BWEJVUwkgICAgICAgIDEJCS8qIG1heC4gMSBJREUgYnVzc2VzCSovCisjZGVmaW5lCUNGR19JREVfTUFYREVWSUNFCShDRkdfSURFX01BWEJVUyoxKSAvKiBtYXguIDEgZHJpdmVzIHBlciBJREUgYnVzICovCisKKyNkZWZpbmUJQ0ZHX0FUQV9CQVNFX0FERFIJMHhGMDEwMDAwMAorI2RlZmluZQlDRkdfQVRBX0lERTBfT0ZGU0VUCTB4MDAwMAorCisjZGVmaW5lIENGR19BVEFfREFUQV9PRkZTRVQJMHgwMDAwCS8qIE9mZnNldCBmb3IgZGF0YSBJL08JCQkqLworI2RlZmluZQlDRkdfQVRBX1JFR19PRkZTRVQJMHgwMDAwCS8qIE9mZnNldCBmb3Igbm9ybWFsIHJlZ2lzdGVyIGFjY2Vzc2VzCSovCisjZGVmaW5lIENGR19BVEFfQUxUX09GRlNFVAkweDAwMDAJLyogT2Zmc2V0IGZvciBhbHRlcm5hdGUgcmVnaXN0ZXJzCSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXJ0IGFkZHJlc3NlcyBmb3IgdGhlIGZpbmFsIG1lbW9yeSBjb25maWd1cmF0aW9uCisgKiAoU2V0IHVwIGJ5IHRoZSBzdGFydHVwIGNvZGUpCisgKiBQbGVhc2Ugbm90ZSB0aGF0IENGR19TRFJBTV9CQVNFIF9tdXN0XyBzdGFydCBhdCAwCisgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4RkZGQzAwMDAKKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlDRkdfRkxBU0hfQkFTRQorI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgyNTYgKiAxMDI0KQkvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uaXRvcgkqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDEyOCAqIDEwMjQpCS8qIFJlc2VydmUgMTI4IGtCIGZvciBtYWxsb2MoKQkqLworCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRkxBU0ggb3JnYW5pemF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkyCS8qIG1heCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzCQkqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMjU2CS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcAkqLworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAgICAgdW5zaWduZWQgc2hvcnQgIC8qIGZsYXNoIHdvcmQgc2l6ZSAod2lkdGgpICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0FERFIwICAgICAgICAgMHg1NTU1ICAvKiAxc3QgYWRkcmVzcyBmb3IgZmxhc2ggY29uZmlnIGN5Y2xlcyAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0FERFIxICAgICAgICAgMHgyQUFBICAvKiAybmQgYWRkcmVzcyBmb3IgZmxhc2ggY29uZmlnIGN5Y2xlcyAgKi8KKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGFkZGVkIGZvciBidWdneSBJT1A0ODAgYnl0ZSBpbnRlcmZhY2UuCisgKiBBbGwgb3RoZXIgYm9hcmRzIHNob3VsZCB1c2UgdGhlIHN0YW5kYXJkIHZhbHVlcyAoQ1BDSTQwNSBldGMuKQorICovCisjZGVmaW5lIENGR19GTEFTSF9SRUFEMCAgICAgICAgIDB4MDAwMCAgLyogMCBpcyBzdGFuZGFyZCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19GTEFTSF9SRUFEMSAgICAgICAgIDB4MDAwMSAgLyogMSBpcyBzdGFuZGFyZCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19GTEFTSF9SRUFEMiAgICAgICAgIDB4MDAwMiAgLyogMiBpcyBzdGFuZGFyZCAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8gICAgICAgICAgICAvKiBwcmludCAnRScgZm9yIGVtcHR5IHNlY3RvciBvbiBmbGluZm8gKi8KKworI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSyAgICAwICAgICAgICAgICAvKiB1c2UgZm9yIEpGRlMyICovCisjZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MgICAgIDEgICAgICAgICAgIC8qICEgc2Vjb25kIGJhbmsgY29udGFpbnMgVS1Cb290ICovCisKKyNpZiAwIC8qIFVzZSBOVlJBTSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBOVlJBTSBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfRU5WX0lTX0lOX05WUkFNCTEJLyogdXNlIE5WUkFNIGZvciBlbnZpcm9ubWVudCB2YXJzCSovCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHgwZmY4CQkvKiBTaXplIG9mIEVudmlyb25tZW50IHZhcnMJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQlcCisJKENGR19OVlJBTV9CQVNFX0FERFIrQ0ZHX05WUkFNX1NJWkUtKENGR19FTlZfU0laRSs4KSkJLyogRW52CSovCisKKyNlbHNlIC8qIFVzZSBFRVBST00gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyAqLworCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRUVQUk9NICAgIDEgICAgICAgLyogdXNlIEVFUFJPTSBmb3IgZW52aXJvbm1lbnQgdmFycyAqLworI2RlZmluZSBDRkdfRU5WX09GRlNFVCAgICAgICAgICAweDAwMCAgIC8qIGVudmlyb25tZW50IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFICAgICAgICAgICAgMHg4MDAgICAvKiAyMDQ4IGJ5dGVzIG1heSBiZSB1c2VkIGZvciBlbnYgdmFycyovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvdGFsIHNpemUgb2YgYSBDQVQyNFdDMTYgaXMgMjA0OCBieXRlcyAqLworI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX05WUkFNX0JBU0VfQUREUgkweGYwMjAwMDAwCQkvKiBOVlJBTSBiYXNlIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX05WUkFNX1NJWkUJCSgzMioxMDI0KQkJLyogTlZSQU0gc2l6ZQkJKi8KKyNkZWZpbmUgQ0ZHX05WUkFNX1ZYV09SS1NfT0ZGUwkweDY5MDAJCS8qIE9mZnNldCBmb3IgVnhXb3JrcyBldGgtYWRkcgkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJMkMgRUVQUk9NIChDQVQyNFdDMTYpIGZvciBlbnZpcm9ubWVudAorICovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJCS8qIEkyYyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCisKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDUwCS8qIEVFUFJPTSBDQVQyOFdDMDgJCSovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOCTEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KKy8qIG1hc2sgb2YgYWRkcmVzcyBiaXRzIHRoYXQgb3ZlcmZsb3cgaW50byB0aGUgIkVFUFJPTSBjaGlwIGFkZHJlc3MiICAgICovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfT1ZFUkZMT1cJMHgwNworI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfQklUUyA0CS8qIFRoZSBDYXRhbHlzdCBDQVQyNFdDMDggaGFzCSovCisJCQkJCS8qIDE2IGJ5dGUgcGFnZSB3cml0ZSBtb2RlIHVzaW5nKi8KKwkJCQkJLyogbGFzdAk0IGJpdHMgb2YgdGhlIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTEwICAgLyogYW5kIHRha2VzIHVwIHRvIDEwIG1zZWMgKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0VOQUJMRQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgSUJNIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZSAgICAgKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCisjZW5kaWYKKworLyoKKyAqIEluaXQgTWVtb3J5IENvbnRyb2xsZXI6CisgKgorICogQlIwLzEgYW5kIE9SMC8xIChGTEFTSCkKKyAqLworCisjZGVmaW5lIEZMQVNIX0JBU0UwX1BSRUxJTQkweEZGODAwMDAwCS8qIEZMQVNIIGJhbmsgIzAJKi8KKyNkZWZpbmUgRkxBU0hfQkFTRTFfUFJFTElNCTB4RkZDMDAwMDAJLyogRkxBU0ggYmFuayAjMQkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBCdXMgQ29udHJvbGxlciAoRUJDKSBTZXR1cAorICovCisKKy8qIE1lbW9yeSBCYW5rIDAgKEZsYXNoIEJhbmsgMCkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjBBUCAgICAgICAgICAgMHg5MjAxNTQ4MAorI2RlZmluZSBDRkdfRUJDX1BCMENSICAgICAgICAgICAweEZGQzVBMDAwICAvKiBCQVM9MHhGRkMsQlM9NE1CLEJVPVIvVyxCVz0xNmJpdCAqLworCisvKiBNZW1vcnkgQmFuayAxIChGbGFzaCBCYW5rIDEpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEIxQVAgICAgICAgICAgIDB4OTIwMTU0ODAKKyNkZWZpbmUgQ0ZHX0VCQ19QQjFDUiAgICAgICAgICAgMHhGRjg1QTAwMCAgLyogQkFTPTB4RkY4LEJTPTRNQixCVT1SL1csQlc9MTZiaXQgKi8KKworLyogTWVtb3J5IEJhbmsgMiAoQ0FOMCwgMSkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCMkFQICAgICAgICAgICAweDAxMDA1M0MwICAvKiBCV1Q9MixXQk49MSxXQkY9MSxUSD0xLFJFPTEsU09SPTEsQkVNPTEgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjJDUiAgICAgICAgICAgMHhGMDAxODAwMCAgLyogQkFTPTB4RjAwLEJTPTFNQixCVT1SL1csQlc9OGJpdCAgKi8KKworLyogTWVtb3J5IEJhbmsgMyAoQ29tcGFjdEZsYXNoIElERSkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCM0FQICAgICAgICAgICAweDAxMDA1M0MwICAvKiBCV1Q9MixXQk49MSxXQkY9MSxUSD0xLFJFPTEsU09SPTEsQkVNPTEgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjNDUiAgICAgICAgICAgMHhGMDExQTAwMCAgLyogQkFTPTB4RjAxLEJTPTFNQixCVT1SL1csQlc9MTZiaXQgKi8KKworLyogTWVtb3J5IEJhbmsgNCAoTlZSQU0vUlRDKSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCNEFQICAgICAgICAgICAweDAxMDA1MjgwICAvKiBUV1Q9MixXQk49MSxXQkY9MSxUSD0xLFNPUj0xICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCNENSICAgICAgICAgICAweEYwMjE4MDAwICAvKiBCQVM9MHhGMDIsQlM9MU1CLEJVPVIvVyxCVz04Yml0ICAqLworCisvKiBNZW1vcnkgQmFuayA1IChvcHRpb25hbCBRdWFydCkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEI1QVAgICAgICAgICAgIDB4MDQwMDVCODAgIC8qIFRXVD04LFdCTj0xLFdCRj0xLFRIPTUsUkU9MSxTT1I9MSovCisjZGVmaW5lIENGR19FQkNfUEI1Q1IgICAgICAgICAgIDB4RjAzMTgwMDAgIC8qIEJBUz0weEYwMyxCUz0xTUIsQlU9Ui9XLEJXPThiaXQgICovCisKKy8qIE1lbW9yeSBCYW5rIDYgKEZQR0EgaW50ZXJuYWwpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjZBUCAgICAgICAgICAgMHgwMTAwNTNDMCAgLyogQldUPTIsV0JOPTEsV0JGPTEsVEg9MSxSRT0xLFNPUj0xLEJFTT0xICovCisjZGVmaW5lIENGR19FQkNfUEI2Q1IgICAgICAgICAgIDB4RjA0MUEwMDAgIC8qIEJBUz0weEYwMSxCUz0xTUIsQlU9Ui9XLEJXPTE2Yml0ICovCisjZGVmaW5lIENGR19GUEdBX0JBU0VfQUREUiAgICAgIDB4RjA0MDAwMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRlBHQSBzdHVmZgorICovCisvKiBGUEdBIGludGVybmFsIHJlZ3MgKi8KKyNkZWZpbmUgQ0ZHX0ZQR0FfTU9ERSAgICAgICAgICAgMHgwMAorI2RlZmluZSBDRkdfRlBHQV9TVEFUVVMgICAgICAgICAweDAyCisjZGVmaW5lIENGR19GUEdBX1RTICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQ0ZHX0ZQR0FfVFNfTE9XICAgICAgICAgMHgwNgorI2RlZmluZSBDRkdfRlBHQV9UU19DQVAwICAgICAgICAweDEwCisjZGVmaW5lIENGR19GUEdBX1RTX0NBUDBfTE9XICAgIDB4MTIKKyNkZWZpbmUgQ0ZHX0ZQR0FfVFNfQ0FQMSAgICAgICAgMHgxNAorI2RlZmluZSBDRkdfRlBHQV9UU19DQVAxX0xPVyAgICAweDE2CisjZGVmaW5lIENGR19GUEdBX1RTX0NBUDIgICAgICAgIDB4MTgKKyNkZWZpbmUgQ0ZHX0ZQR0FfVFNfQ0FQMl9MT1cgICAgMHgxYQorI2RlZmluZSBDRkdfRlBHQV9UU19DQVAzICAgICAgICAweDFjCisjZGVmaW5lIENGR19GUEdBX1RTX0NBUDNfTE9XICAgIDB4MWUKKworLyogRlBHQSBNb2RlIFJlZyAqLworI2RlZmluZSBDRkdfRlBHQV9NT0RFX0NGX1JFU0VUICAweDAwMDEKKyNkZWZpbmUgQ0ZHX0ZQR0FfTU9ERV9UU19JUlFfRU5BQkxFIDB4MDEwMAorI2RlZmluZSBDRkdfRlBHQV9NT0RFX1RTX0lSUV9DTEVBUiAgMHgxMDAwCisjZGVmaW5lIENGR19GUEdBX01PREVfVFNfQ0xFQVIgIDB4MjAwMAorCisvKiBGUEdBIFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgQ0ZHX0ZQR0FfU1RBVFVTX0RJUDAgICAgMHgwMDAxCisjZGVmaW5lIENGR19GUEdBX1NUQVRVU19ESVAxICAgIDB4MDAwMgorI2RlZmluZSBDRkdfRlBHQV9TVEFUVVNfRElQMiAgICAweDAwMDQKKyNkZWZpbmUgQ0ZHX0ZQR0FfU1RBVFVTX0ZMQVNIICAgMHgwMDA4CisjZGVmaW5lIENGR19GUEdBX1NUQVRVU19UU19JUlEgIDB4MTAwMAorCisjZGVmaW5lIENGR19GUEdBX1NQQVJUQU4yICAgICAgIDEgICAgICAgICAgIC8qIHVzaW5nIFhpbGlueCBTcGFydGFuIDIgbm93ICAgICovCisjZGVmaW5lIENGR19GUEdBX01BWF9TSVpFICAgICAgIDMyKjEwMjQgICAgIC8qIDMya0J5dGUgaXMgZW5vdWdoIGZvciBYQzJTMTUgICovCisKKy8qIEZQR0EgcHJvZ3JhbSBwaW4gY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDRkdfRlBHQV9QUkcgICAgICAgICAgICAweDA0MDAwMDAwICAvKiBGUEdBIHByb2dyYW0gcGluIChwcGMgb3V0cHV0KSAqLworI2RlZmluZSBDRkdfRlBHQV9DTEsgICAgICAgICAgICAweDAyMDAwMDAwICAvKiBGUEdBIGNsayBwaW4gKHBwYyBvdXRwdXQpICAgICAqLworI2RlZmluZSBDRkdfRlBHQV9EQVRBICAgICAgICAgICAweDAxMDAwMDAwICAvKiBGUEdBIGRhdGEgcGluIChwcGMgb3V0cHV0KSAgICAqLworI2RlZmluZSBDRkdfRlBHQV9JTklUICAgICAgICAgICAweDAwMDEwMDAwICAvKiBGUEdBIGluaXQgcGluIChwcGMgaW5wdXQpICAgICAqLworI2RlZmluZSBDRkdfRlBHQV9ET05FICAgICAgICAgICAweDAwMDA4MDAwICAvKiBGUEdBIGRvbmUgcGluIChwcGMgaW5wdXQpICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWZpbml0aW9ucyBmb3IgaW5pdGlhbCBzdGFjayBwb2ludGVyIGFuZCBkYXRhIGFyZWEgKGluIGRhdGEgY2FjaGUpCisgKi8KKyNpZiAxIC8qIHRlc3Qtb25seSAqLworI2RlZmluZSBDRkdfSU5JVF9EQ0FDSEVfQ1MgICAgICA3ICAgICAgIC8qIHVzZSBjcyAjIDcgZm9yIGRhdGEgY2FjaGUgbWVtb3J5ICAgICovCisKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIgICAgICAgMHg0MDAwMDAwMCAgLyogdXNlIGRhdGEgY2FjaGUgICAgICAgICAgICAgICAgICAqLworI2Vsc2UKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJMHgwMGRmMDAwMCAvKiBpbnNpZGUgb2YgU0RSQU0gICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5EICAgICAgICAweDIwMDAgIC8qIEVuZCBvZiB1c2VkIGFyZWEgaW4gUkFNICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFICAgICAgMTI4ICAvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVCAgICAoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQgICAgICBDRkdfR0JMX0RBVEFfT0ZGU0VUCisKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQQ0lJU0VSNC5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0lJU0VSNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOGQ3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSUlTRVI0LmgKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFN0ZWZhbiBSb2VzZSwgZXNkIGdtYmggZ2VybWFueSwgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogYm9hcmQvY29uZmlnLmggLSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGJvYXJkIHNwZWNpZmljCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKworI2RlZmluZSBDT05GSUdfNDA1R1AJCTEJLyogVGhpcyBpcyBhIFBQQzQwNSBDUFUJCSovCisjZGVmaW5lIENPTkZJR180eHgJCTEJLyogLi4ubWVtYmVyIG9mIFBQQzR4eCBmYW1pbHkgICAqLworI2RlZmluZSBDT05GSUdfQ1BDSUlTRVI0CTEJLyogLi4ub24gYSBDUENJSVNFUjQgYm9hcmQJKi8KKworI2RlZmluZSBDT05GSUdfQk9BUkRfUFJFX0lOSVQgICAxICAgICAgIC8qIGNhbGwgYm9hcmRfcHJlX2luaXQoKSAgICAgICAgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRICAgICAyNTAwMDAwMCAvKiBleHRlcm5hbCBmcmVxdWVuY3kgdG8gcGxsICAgKi8KKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCS8qIGF1dG9ib290IGFmdGVyIDMgc2Vjb25kcwkqLworCisjdW5kZWYJQ09ORklHX0JPT1RBUkdTCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gZmZmMDAwMDAiCisKKyNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KKyNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCisKKyNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCisjZGVmaW5lCUNPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCisKKyNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCisJCQkJQ0ZHX0NNRF9QQ0kJfCBcCisJCQkJQ0ZHX0NNRF9JUlEJfCBcCisJCQkJQ0ZHX0NNRF9FTEYJfCBcCisJCQkJQ0ZHX0NNRF9FRVBST00gICkKKworLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLworI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCisKKyNkZWZpbmUJQ09ORklHX1NEUkFNX0JBTkswCTEJLyogaW5pdCBvbmJvYXJkIFNEUkFNIGJhbmsgMAkqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2Vsc2UKKyNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZW5kaWYKKyNkZWZpbmUgQ0ZHX1BCU0laRSAoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19NQVhBUkdTCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisKKyNkZWZpbmUgQ0ZHX0NPTlNPTEVfSU5GT19RVUlFVCAgMSAgICAgICAvKiBkb24ndCBwcmludCBjb25zb2xlIEAgc3RhcnR1cCovCisKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwNDAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDBDMDAwMDAJLyogNCAuLi4gMTIgTUIgaW4gRFJBTQkqLworCisjZGVmaW5lIENGR19FWFRfU0VSSUFMX0NMT0NLICAgIDE4NDMyMDAgIC8qIHVzZSBleHRlcm5hbCBzZXJpYWwgY2xvY2sgICAqLworCisvKiBUaGUgZm9sbG93aW5nIHRhYmxlIGluY2x1ZGVzIHRoZSBzdXBwb3J0ZWQgYmF1ZHJhdGVzICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgICAgIFwKKyAgICAgICAgeyAzMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCAgICAgXAorICAgICAgICAgNTc2MDAsIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsIDkyMTYwMCB9CisKKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDEwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfRVhUQkRJTkZPCTEJCS8qIFRvIHVzZSBleHRlbmRlZCBib2FyZF9pbnRvIChiZF90KSAqLworCisjZGVmaW5lCUNGR19IWgkJMTAwMAkJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcwkqLworCisjZGVmaW5lIENPTkZJR19aRVJPX0JPT1RERUxBWV9DSEVDSwkvKiBjaGVjayBmb3Iga2V5cHJlc3Mgb24gYm9vdGRlbGF5PT0wICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBDSSBzdHVmZgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIFBDSV9IT1NUX0FEQVBURVIgMCAgICAgICAgICAgICAgLyogY29uZmlndXJlIGFyIHBjaSBhZGFwdGVyICAgICAqLworI2RlZmluZSBQQ0lfSE9TVF9GT1JDRSAgMSAgICAgICAgICAgICAgIC8qIGNvbmZpZ3VyZSBhcyBwY2kgaG9zdCAgICAgICAgKi8KKyNkZWZpbmUgUENJX0hPU1RfQVVUTyAgIDIgICAgICAgICAgICAgICAvKiBkZXRlY3RlZCB2aWEgYXJiaXRlciBlbmFibGUgICovCisKKyNkZWZpbmUgQ09ORklHX1BDSQkJCS8qIGluY2x1ZGUgcGNpIHN1cHBvcnQJICAgICAgICAqLworI2RlZmluZSBDT05GSUdfUENJX0hPU1QJUENJX0hPU1RfQVVUTyAgIC8qIHNlbGVjdCBwY2kgaG9zdCBmdW5jdGlvbiAgICAgKi8KKyNkZWZpbmUgQ09ORklHX1BDSV9QTlAJCQkvKiBkbyBwY2kgcGx1Zy1hbmQtcGxheSAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzb3VyY2UgY29uZmlndXJhdGlvbiAgICAgICAqLworCisjZGVmaW5lIENGR19QQ0lfU1VCU1lTX1ZFTkRPUklEIDB4MTJGRSAgLyogUENJIFZlbmRvciBJRDogZXNkIGdtYmggICAgICAqLworI2RlZmluZSBDRkdfUENJX1NVQlNZU19ERVZJQ0VJRCAweDA0MDQgIC8qIFBDSSBEZXZpY2UgSUQ6IENQQ0ktSVNFUjQgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0xTEEgIDB4MDAwMDAwMDAgICAgICAvKiBwb2ludCB0byBzZHJhbSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMU1TICAweGZmMDAwMDAxICAgICAgLyogMTZNQiwgZW5hYmxlIGhhcmQtd2lyZWQgdG8gMSAqLworI2RlZmluZSBDRkdfUENJX1BUTTFQQ0kgMHgwMDAwMDAwMCAgICAgIC8qIEhvc3Q6IHVzZSB0aGlzIHBjaSBhZGRyZXNzICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0yTEEgIDB4ZmZlMDAwMDAgICAgICAvKiBwb2ludCB0byBmbGFzaCAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMk1TICAweGZmZTAwMDAxICAgICAgLyogMk1CLCBlbmFibGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTJQQ0kgMHgwNDAwMDAwMCAgICAgIC8qIEhvc3Q6IHVzZSB0aGlzIHBjaSBhZGRyZXNzICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhcnQgYWRkcmVzc2VzIGZvciB0aGUgZmluYWwgbWVtb3J5IGNvbmZpZ3VyYXRpb24KKyAqIChTZXQgdXAgYnkgdGhlIHN0YXJ0dXAgY29kZSkKKyAqIFBsZWFzZSBub3RlIHRoYXQgQ0ZHX1NEUkFNX0JBU0UgX211c3RfIHN0YXJ0IGF0IDAKKyAqLworI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRkZDMDAwMAorI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCUNGR19GTEFTSF9CQVNFCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiAqIDEwMjQpCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoMTI4ICogMTAyNCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIG1hbGxvYygpCSovCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGTEFTSCBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJCSovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkyNTYJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJMTIwMDAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlIChpbiBtcykJKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJNTAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlIChpbiBtcykJKi8KKworI2RlZmluZSBDRkdfRkxBU0hfV09SRF9TSVpFICAgICB1bnNpZ25lZCBzaG9ydCAgLyogZmxhc2ggd29yZCBzaXplICh3aWR0aCkgICAgICAqLworI2RlZmluZSBDRkdfRkxBU0hfQUREUjAgICAgICAgICAweDU1NTUgIC8qIDFzdCBhZGRyZXNzIGZvciBmbGFzaCBjb25maWcgY3ljbGVzICAqLworI2RlZmluZSBDRkdfRkxBU0hfQUREUjEgICAgICAgICAweDJBQUEgIC8qIDJuZCBhZGRyZXNzIGZvciBmbGFzaCBjb25maWcgY3ljbGVzICAqLworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgYWRkZWQgZm9yIGJ1Z2d5IElPUDQ4MCBieXRlIGludGVyZmFjZS4KKyAqIEFsbCBvdGhlciBib2FyZHMgc2hvdWxkIHVzZSB0aGUgc3RhbmRhcmQgdmFsdWVzIChDUENJNDA1IGV0Yy4pCisgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1JFQUQwICAgICAgICAgMHgwMDAwICAvKiAwIGlzIHN0YW5kYXJkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1JFQUQxICAgICAgICAgMHgwMDAxICAvKiAxIGlzIHN0YW5kYXJkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1JFQUQyICAgICAgICAgMHgwMDAyICAvKiAyIGlzIHN0YW5kYXJkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDRkdfRkxBU0hfRU1QVFlfSU5GTyAgICAgICAgICAgIC8qIHByaW50ICdFJyBmb3IgZW1wdHkgc2VjdG9yIG9uIGZsaW5mbyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJMkMgRUVQUk9NIChDQVQyNFdDMDgpIGZvciBlbnZpcm9ubWVudAorICovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJCS8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCisKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDUwCS8qIEVFUFJPTSBDQVQyOFdDMDgJCSovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOCTEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KKy8qIG1hc2sgb2YgYWRkcmVzcyBiaXRzIHRoYXQgb3ZlcmZsb3cgaW50byB0aGUgIkVFUFJPTSBjaGlwIGFkZHJlc3MiICAgICovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfT1ZFUkZMT1cJMHgwNworI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfQklUUyA0CS8qIFRoZSBDYXRhbHlzdCBDQVQyNFdDMDggaGFzCSovCisJCQkJCS8qIDE2IGJ5dGUgcGFnZSB3cml0ZSBtb2RlIHVzaW5nKi8KKwkJCQkJLyogbGFzdAk0IGJpdHMgb2YgdGhlIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTEwICAgLyogYW5kIHRha2VzIHVwIHRvIDEwIG1zZWMgKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0VOQUJMRQorCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRUVQUk9NICAgIDEgICAgICAgLyogdXNlIEVFUFJPTSBmb3IgZW52aXJvbm1lbnQgdmFycyAqLworI2RlZmluZSBDRkdfRU5WX09GRlNFVCAgICAgICAgICAweDAwMCAgIC8qIGVudmlyb25tZW50IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFICAgICAgICAgICAgMHgzMDAgICAvKiA3NjggYnl0ZXMgbWF5IGJlIHVzZWQgZm9yIGVudiB2YXJzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvdGFsIHNpemUgb2YgYSBDQVQyNFdDMDggaXMgMTAyNCBieXRlcyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBJQk0gNDA1IENQVXMJCQkqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKyNlbmRpZgorCisvKgorICogSW5pdCBNZW1vcnkgQ29udHJvbGxlcjoKKyAqCisgKiBCUjAvMSBhbmQgT1IwLzEgKEZMQVNIKQorICovCisKKyNkZWZpbmUgRkxBU0hfQkFTRTBfUFJFTElNCTB4RkZGMDAwMDAJLyogRkxBU0ggYmFuayAjMAkqLworI2RlZmluZSBGTEFTSF9CQVNFMV9QUkVMSU0JMAkJLyogRkxBU0ggYmFuayAjMQkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBCdXMgQ29udHJvbGxlciAoRUJDKSBTZXR1cAorICovCisKKy8qIE1lbW9yeSBCYW5rIDAgKEZsYXNoIEJhbmsgMCkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjBBUCAgICAgICAgICAgMHg5MjAxNTQ4MAorI2RlZmluZSBDRkdfRUJDX1BCMENSICAgICAgICAgICAweEZGQzVBMDAwICAvKiBCQVM9MHhGRkMsQlM9NE1CLEJVPVIvVyxCVz0xNmJpdCAqLworCisvKiBNZW1vcnkgQmFuayAxIChVYXJ0IDhiaXQpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEIxQVAgICAgICAgICAgIDB4MDEwMDA0ODAgIC8qIFRXVD0yLFRIPTIsbm8gUmVhZHksQkVNPTAsU09SPTEgICovCisjZGVmaW5lIENGR19FQkNfUEIxQ1IgICAgICAgICAgIDB4RjAwMTgwMDAgIC8qIEJBUz0weEYwMCxCUz0xTUIsQlU9Ui9XLEJXPThiaXQgICovCisKKy8qIE1lbW9yeSBCYW5rIDIgKFVhcnQgMzJiaXQpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjJBUCAgICAgICAgICAgMHgwMDAwMDRjMCAgLyogbm8gUmVhZHksIEJFTT0xICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjJDUiAgICAgICAgICAgMHhGMDExQzAwMCAgLyogQkFTPTB4RjAxLEJTPTFNQixCVT1SL1csQlc9MzJiaXQgKi8KKworLyogTWVtb3J5IEJhbmsgMyAoRlBHQSBSZXNldCkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCM0FQICAgICAgICAgICAweDAxMDAwNEMwICAvKiBubyBSZWFkeSwgQkVNPTEgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCM0NSICAgICAgICAgICAweEYwMjFBMDAwICAvKiBCQVM9MHhGMDIsQlM9MU1CLEJVPVIvVyxCVz0xNmJpdCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWZpbml0aW9ucyBmb3IgaW5pdGlhbCBzdGFjayBwb2ludGVyIGFuZCBkYXRhIGFyZWEgKGluIERQUkFNKQorICovCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCTB4MDBkZjAwMDAgLyogaW5zaWRlIG9mIFNEUkFNICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJMHgwZjAwCS8qIEVuZCBvZiB1c2VkIGFyZWEgaW4gUkFNCSAgICAgICAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQk2NCAgLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworCisvKgorICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1JBWUwxLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1JBWUwxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEwZDk2NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUkFZTDEuaApAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqIERhdmlkIFVwZGVncmFmZiwgQ3JheSwgSW5jLiAgZGF2ZUBjcmF5LmNvbTogb3VyIDQwNSBpcyB3YWxudXQtbGl0ZS4uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKy8qCisgKiBib2FyZC9jb25maWcuaCAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYm9hcmQgc3BlY2lmaWMKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisjZGVmaW5lIENPTkZJR19DUkFZTDEKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisKKyNkZWZpbmUgQ09ORklHXzQwNUdQCQkxCS8qIFRoaXMgaXMgYSBQUEM0MDUgQ1BVCSovCisjZGVmaW5lIENPTkZJR180eHgJCSAgICAxICAgLyogLi4ubWVtYmVyIG9mIFBQQzQwNSBmYW1pbHkgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAyNTAwMDAwMAorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLworI2RlZmluZSBDT05GSUdfTUlJCQkgICAgMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUJQ09ORklHX1BIWV9BRERSCQkxCS8qIFBIWSBhZGRyZXNzOyBoYW5kbGluZyBvZiBFTkVUICovCisjZGVmaW5lIENPTkZJR19CT0FSRF9QUkVfSU5JVCAxIC8qIHNldHVwIGZvciA0MDVncCAqLworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IJMQkvKiBzbyB0aGF0IGEgbWlzY19pbml0X3IoKSBpcyBjYWxsZWQgKi8KKworLyogc2V0IFBSQU0gdG8ga2VlcCBVLUJvb3Qgb3V0LCBtZW09IHRvIGtlZXAgbGludXggb3V0LCBhbmQgaW5pdHJkX2hpIHRvCisgKiBrZWVwIHBvc3NpYmxlIGluaXRyZCByYW1kaXNrIGRlY29tcHJlc3Npb24gb3V0LiAgVGhpcyBpcyBpbiBrICgxMDI0IGJ5dGVzKQorICNkZWZpbmUgQ09ORklHX1BSQU0JCQkxNgorICovCisjZGVmaW5lCUNPTkZJR19MT0FEQUREUgkJMHgxMDAwMDAKKyN1bmRlZiBDT05GSUdfQk9PVEFSR1MKKworLyogdGhlIGxvZ2ljIGlzIHRoYXQgYm9vdGluZyBpcyBkcml2ZW4gYnkgd2hhdCBlbnYgdmFycyBnZXQgc2V0IGZyb20gREhDUC4KKyAqIE5vcm1hbCBESENQIHNldHMgdGhpbmdzIGxpa2Ugc2VydmVyaXAsIHJvb3RwYXRoLCBldGMuCisgKiBpZiBwcmludGVudgorICovCisjZGVmaW5lCUNGR19BVVRPTE9BRAkJInllcyIKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJkaGNwOyJcCisJInNldGVudiBib290YXJncyBkZXZmcz1tb3VudDsiXAorCSJzZXRlbnYgYm9vdGFyZ3MgaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDokbmV0bWFzazo6Om9mZiAkYm9vdGFyZ3M7IlwKKwkiaWYgcHJpbnRlbnYgaW5pdHJkOyJcCisJInRoZW47IiBcCisJICJzZXRlbnYgaW5pdHJkX2hpICRtZW07IlwKKwkgInRmdHAgMTAwMDAwMCAkaW5pdHJkOyJcCisJICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbTAgcncgY3dzcm9vdD0kc2VydmVyaXA6JHJvb3RwYXRoICRib290YXJnczsiXAorCSAiYm9vdG0gMTAwMDAwIDEwMDAwMDA7IlwKKwkiZWxzZTsiXAorCSAic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcm8gbmZzcm9vdD0kc2VydmVyaXA6JHJvb3RwYXRoICRib290YXJnczsiXAorCSAiYm9vdG0gMTAwMDAwOyJcCisJImZpOyIKKworI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTICIiCisKKy8qCisgKiAuLmR1cmluZyBleHBlcmltZW50cy4uCisgI2RlZmluZSBDT05GSUdfU0VSVkVSSVAgICAgICAgICAxMC4wLjAuMQorICNkZWZpbmUgQ09ORklHX0VUSEFERFIgICAgICAgICAgMDA6NDA6YTY6ODA6MTQ6NQorICovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQyAgICAgICAgIDEJCS8qIGhhcmR3YXJlIHN1cHBvcnQgZm9yIGkyYyAqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECQkgICAgNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcwkqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkgICAgMHg3RgorI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSICAgICAweDU3CisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOIDEKKyNkZWZpbmUgQ09ORklHX0lERU5UX1NUUklORyAgICAgIkNyYXkgTDEiCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFICAgICAxCisjZGVmaW5lCUNGR19IWgkJICAgICAgICAgICAgIDEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcwkqLworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIJCQkxCisjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJCSI+ICIKKworCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkgKFwKKwlDRkdfQ01EX0JESXxcCisJQ0ZHX0NNRF9JTUl8XAorCUNGR19DTURfRkxBU0h8XAorCUNGR19DTURfTUVNT1JZfFwKKwlDRkdfQ01EX05FVHxcCisJQ0ZHX0NNRF9FTlZ8XAorCUNGR19DTURfQ09OU09MRXxcCisJQ0ZHX0NNRF9BU0tFTlZ8XAorCUNGR19DTURfRUNIT3xcCisJQ0ZHX0NNRF9JTU1BUHxcCisJQ0ZHX0NNRF9SRUdJTkZPfFwKKwlDRkdfQ01EX0RIQ1B8XAorCUNGR19DTURfREFURXxcCisJQ0ZHX0NNRF9SVU58XAorCUNGR19DTURfSTJDfFwKKwlDRkdfQ01EX0VFUFJPTXxcCisJQ0ZHX0NNRF9TRVRHRVREQ1IpCisKKy8qCisgKiBvcHRpb25hbCBCT09UUCAvIERIQ1AgZmllbGRzCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgKFwKKwlDT05GSUdfQk9PVFBfVkVORE9SRVh8XAorCUNPTkZJR19CT09UUF9TVUJORVRNQVNLfFwKKwlDT05GSUdfQk9PVFBfR0FURVdBWXxcCisJQ09ORklHX0JPT1RQX0ROU3xcCisJQ09ORklHX0JPT1RQX0hPU1ROQU1FfFwKKwlDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFfFwKKwlDT05GSUdfQk9PVFBfQk9PVFBBVEgpCisKKy8qCisgKiBiYXVkcy4gIEp1c3QgdG8gbWFrZSBpdCBjb21waWxlOyBpbiBvdXIgY2FzZSwgSSByZWFkIHRoZSBiYXNlX2JhdWQKKyAqIGZyb20gdGhlIERDUiBhbnl3YXksIHNvIGl0cyBraW5kYS10aWVkIHRvIHRoZSBhYm92ZSByZWYuIGNsb2NrIHdoaWNoIGluIHR1cm4KKyAqIGRyaXZlcyB0aGUgc3lzdGVtIGNsb2NrLgorICovCisjZGVmaW5lIENGR19CQVNFX0JBVUQgICAgICAgNDAzMjI1CisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgXAorICAgIHszMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDB9CisKKy8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KKyNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJCQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkxNgkJCQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLworCisKKyNkZWZpbmUgQ0ZHX0xPQURfQUREUiAgIAkweDEwMDAwMC8qIHdoZXJlIHRvIGxvYWQgd2hhdCB3ZSBnZXQgZnJvbSBURlRQICovCisjZGVmaW5lIENGR19URlRQX0xPQURBRERSCUNGR19MT0FEX0FERFIKKyNkZWZpbmUgQ0ZHX0VYVEJESU5GTwkJMQkvKiBUbyB1c2UgZXh0ZW5kZWQgYm9hcmRfaW50byAoYmRfdCkgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhcnQgYWRkcmVzc2VzIGZvciB0aGUgZmluYWwgbWVtb3J5IGNvbmZpZ3VyYXRpb24KKyAqIChTZXQgdXAgYnkgdGhlIHN0YXJ0dXAgY29kZSkKKyAqIFBsZWFzZSBub3RlIHRoYXQgQ0ZHX1NEUkFNX0JBU0UgX211c3RfIHN0YXJ0IGF0IDAKKyAqLworI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRkMwMDAwMAorI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQorCisjaWZuZGVmICBDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMTI4ICogMTAyNCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIE1vbml0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9PRkZTRVQJCTB4M0QwMDAwCisjZWxzZQorI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgxOTIgKiAxMDI0KQkvKiBSZXNlcnZlIDE5MiBrQiBmb3IgTW9uaXRvcgkqLworI2RlZmluZSBDRkdfRU5WX09GRlNFVAkJMHgzRkUwMDAKKyNlbmRpZgorCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoMTI4ICogMTAyNCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIG1hbGxvYygpCSovCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGTEFTSCBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCSAxCQkvKiBtYXggbnVtYmVyIG9mIG1lbW9yeSBiYW5rcwkJKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCSA2NAkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwCSovCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUIDEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUIDUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpCSovCisKKy8qIEJFRyBFTlZJUk9OTkVNRU5UIEZMQVNIOiBuZWVkcyB0byBiZSBhIHdob2xlIEZsYXNoU2VjdG9yICAqLworI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEJLyogdXNlIEZMQVNIIGZvciBlbnZpcm9ubWVudCB2YXJzICovCisjZGVmaW5lCUNGR19FTlZfU0laRQkJMHgxMDAwCSAvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLworI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDEwMDAwCSAvKiBzZWUgUkVBRE1FIC0gZW52IHNlY3RvciB0b3RhbCBzaXplCSovCisKKy8qIE1lbW9yeSB0ZXN0czogVS1Cb290IHJlbG9jYXRlcyBpdHNlbGYgdG8gdGhlIHRvcCBvZiBSYW0sIHNvIGl0cyBhdAorICogMzJtZWctKDEyOGsrc29tZV9tYWxsb2Nfc3BhY2UrY29weS1vZi1FTlYgc2VjdG9yKS4uCisgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX1NJWkUJCTMyCQkvKiBtZWdzIG9mIHJhbSAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDIwMDAgIC8qIG1lbXRlc3Qgd29ya3MgZnJvbSB0aGUgZW5kIG9mICovCisJCQkJCQkJCQkvKiB0aGUgZXhjZXB0aW9uIHZlY3RvciB0YWJsZSAqLworCQkJCQkJCQkJLyogdG8gdGhlIGVuZCBvZiB0aGUgRFJBTSAgKi8KKwkJCQkJCQkJCS8qIGxlc3MgbW9uaXRvciBhbmQgbWFsbG9jIGFyZWEgKi8KKyNkZWZpbmUgQ0ZHX1NUQUNLX1VTQUdFCQkweDEwMDAwIC8qIFJlc2VydmUgNjRrIGZvciB0aGUgc3RhY2sgdXNhZ2UgKi8KKyNkZWZpbmUgQ0ZHX01FTV9FTkRfVVNBR0UJKCBDRkdfTU9OSVRPUl9MRU4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENGR19NQUxMT0NfTEVOIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDRkdfRU5WX1NFQ1RfU0laRSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ0ZHX1NUQUNLX1VTQUdFICkKKworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCShDRkdfU0RSQU1fU0laRSAqIDEwMjQgKiAxMDI0IC0gQ0ZHX01FTV9FTkRfVVNBR0UpCisvKiBFTkQgRU5WSVJPTk5FTUVOVCBGTEFTSCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uLiAgT25seSB1c2VkIHRvIC4uPz8gY2xlYXIgaXQsIEkgZ3Vlc3MuLgorICovCisjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCisKKy8qCisgKiBJbml0IE1lbW9yeSBDb250cm9sbGVyOgorICoKKyAqIEJSMC8xIGFuZCBPUjAvMSAoRkxBU0gpCisgKi8KKworI2RlZmluZSBGTEFTSF9CQVNFMF9QUkVMSU0JQ0ZHX0ZMQVNIX0JBU0UJLyogRkxBU0ggYmFuayAjMAkqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb25zIGZvciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgYW5kIGRhdGEgYXJlYSAoaW4gT25DaGlwTWVtICkKKyAqLworI2lmIDAKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIgICAgICAgMHg0MDAwMDAwMCAgLyogdXNlIGRhdGEgY2FjaGUgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5EICAgICAgICAweDIwMDAgIC8qIEVuZCBvZiB1c2VkIGFyZWEgaW4gUkFNICAgICAgICAgICAgICovCisjZWxzZQorI2RlZmluZSBDRkdfVEVNUF9TVEFDS19PQ00JMQorI2RlZmluZSBDRkdfT0NNX0RBVEFfQUREUgkweEYwMDAwMDAwCisjZGVmaW5lIENGR19PQ01fREFUQV9TSVpFCTB4MTAwMAorI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUglDRkdfT0NNX0RBVEFfQUREUiAJLyogaW5zaWRlIG9mIE9uIENoaXAgU1JBTSAgICAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECUNGR19PQ01fREFUQV9TSVpFCS8qIEVuZCBvZiBPbiBDaGlwIFNSQU0JICAgICAqLworI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJNjQJLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbnMgZm9yIFNlcmlhbCBQcmVzZW5jZSBEZXRlY3QgRUVQUk9NIGFkZHJlc3MKKyAqLworI2RlZmluZSBFRVBST01fV1JJVEVfQUREUkVTUyAweEEwCisjZGVmaW5lIEVFUFJPTV9SRUFEX0FERFJFU1MgIDB4QTEKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NVODI0LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1U4MjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDM4ZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL0NVODI0LmgKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqCisgKiBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgQ1U4MjQgYm9hcmQuCisgKgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGJvYXJkL2NvbmZpZy5oIC0gY29uZmlndXJhdGlvbiBvcHRpb25zLCBib2FyZCBzcGVjaWZpYworICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisKKyNkZWZpbmUgQ09ORklHX01QQzgyNFgJCTEKKyNkZWZpbmUgQ09ORklHX01QQzgyNDAJCTEKKyNkZWZpbmUgQ09ORklHX0NVODI0CQkxCisKKworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAorI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorCisjZGVmaW5lIENPTkZJR19DTE9DS1NfSU5fTUhaCTEJLyogY2xvY2tzIHBhc3NzZWQgdG8gTGludXggaW4gTUh6CSovCisKKyNkZWZpbmUgQ09ORklHX1BSRUJPT1QJImVjaG87ZWNobyBUeXBlIFwicnVuIGZsYXNoX25mc1wiIHRvIG1vdW50IHJvb3QgZmlsZXN5c3RlbSBvdmVyIE5GUztlY2hvIgorCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gRkUwMjAwMDAiCS8qIGF1dG9ib290IGNvbW1hbmQJKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CisKKyNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKworI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKKwkJCQlDRkdfQ01EX0RIQ1AJfCBcCisJCQkJQ0ZHX0NNRF9QQ0kJfCBcCisJCQkJMC8qIENGR19DTURfREFURSAqLwkpCisKKy8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkKKyAqLworI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCisjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisKKyNpZiAxCisjZGVmaW5lCUNGR19IVVNIX1BBUlNFUgkJMQkvKiB1c2UgImh1c2giIGNvbW1hbmQgcGFyc2VyCSovCisjZW5kaWYKKyNpZmRlZglDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCisjZW5kaWYKKworLyogUHJpbnQgQnVmZmVyIFNpemUKKyAqLworI2RlZmluZSBDRkdfUEJTSVpFCShDRkdfQ0JTSVpFICsgc2l6ZW9mKENGR19QUk9NUFQpICsgMTYpCisKKyNkZWZpbmUJQ0ZHX01BWEFSR1MJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDAwMTAwMDAwCS8qIERlZmF1bHQgbG9hZCBhZGRyZXNzCQkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFydCBhZGRyZXNzZXMgZm9yIHRoZSBmaW5hbCBtZW1vcnkgY29uZmlndXJhdGlvbgorICogKFNldCB1cCBieSB0aGUgc3RhcnR1cCBjb2RlKQorICogUGxlYXNlIG5vdGUgdGhhdCBDRkdfU0RSQU1fQkFTRSBfbXVzdF8gc3RhcnQgYXQgMAorICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCSAgICAweDAwMDAwMDAwCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCSAgICAweEZGMDAwMDAwCisKKyNkZWZpbmUgQ0ZHX1JFU0VUX0FERFJFU1MgICAweEZGRjAwMTAwCisKKyNkZWZpbmUgQ0ZHX0VVTUJfQUREUgkgICAgMHhGQ0UwMDAwMAorCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UgICAgVEVYVF9CQVNFCisKKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCSAgICAoMjU2IDw8IDEwKSAvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uaXRvcgkqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkgICAgKDEyOCA8PCAxMCkgLyogUmVzZXJ2ZSAxMjgga0IgZm9yIG1hbGxvYygpCSovCisKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQgICAweDAwMDA0MDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkgICAgMHgwMjAwMDAwMAkvKiAwIC4uLiAzMiBNQiBpbiBEUkFNCQkqLworCisJLyogTWF4aW11bSBhbW91bnQgb2YgUkFNLgorCSAqLworI2RlZmluZSBDRkdfTUFYX1JBTV9TSVpFICAgIDB4MTAwMDAwMDAKKworCisjaWYgQ0ZHX01PTklUT1JfQkFTRSA+PSBDRkdfRkxBU0hfQkFTRQorI3VuZGVmIENGR19SQU1CT09UCisjZWxzZQorI2RlZmluZSBDRkdfUkFNQk9PVAorI2VuZGlmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbnMgZm9yIGluaXRpYWwgc3RhY2sgcG9pbnRlciBhbmQgZGF0YSBhcmVhCisgKi8KKworCS8qIFNpemUgaW4gYnl0ZXMgcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YQorCSAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRSAgICAxMjgKKworI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUiAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5EICAgICAgMHgxMDAwCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQgIChDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisKKy8qCisgKiBOUzE2NTUwIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKworI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQk0CisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkoMTQ3NDU2MDAgLyAyKQorCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJMHhGRTgwMDA4MAorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00yCTB4RkU4MDAwQzAKKworLyoKKyAqIExvdyBMZXZlbCBDb25maWd1cmF0aW9uIFNldHRpbmdzCisgKiAoYWRkcmVzcyBtYXBwaW5ncywgcmVnaXN0ZXIgaW5pdGlhbCB2YWx1ZXMsIGV0Yy4pCisgKiBZb3Ugc2hvdWxkIGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIGlmIHlvdSBtYWtlIGNoYW5nZXMgaGVyZS4KKyAqIEZvciB0aGUgZGV0YWlsIGRlc2NyaXB0aW9uIHJlZmVyIHRvIHRoZSBNUEM4MjQwIHVzZXIncyBtYW51YWwuCisgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRICAzMzAwMDAwMAorI2RlZmluZSBDRkdfSFoJCSAgICAgMTAwMAorCisJLyogQml0LWZpZWxkIHZhbHVlcyBmb3IgTUNDUjEuCisJICovCisjZGVmaW5lIENGR19ST01OQUwJICAgIDAKKyNkZWZpbmUgQ0ZHX1JPTUZBTAkgICAgNworCisJLyogQml0LWZpZWxkIHZhbHVlcyBmb3IgTUNDUjIuCisJICovCisjZGVmaW5lIENGR19SRUZJTlQJICAgIDQzMAkgICAgLyogUmVmcmVzaCBpbnRlcnZhbAkJCSovCisKKwkvKiBCdXJzdCBUbyBQcmVjaGFyZ2UuIEJpdHMgb2YgdGhpcyB2YWx1ZSBnbyB0byBNQ0NSMyBhbmQgTUNDUjQuCisJICovCisjZGVmaW5lIENGR19CU1RPUFJFCSAgICAxOTIKKworCS8qIEJpdC1maWVsZCB2YWx1ZXMgZm9yIE1DQ1IzLgorCSAqLworI2RlZmluZSBDRkdfUkVGUkVDCSAgICAyCSAgICAvKiBSZWZyZXNoIHRvIGFjdGl2YXRlIGludGVydmFsCSovCisjZGVmaW5lIENGR19SRExBVAkgICAgMwkgICAgLyogRGF0YSBsYXRhbmN5IGZyb20gcmVhZCBjb21tYW5kCSovCisKKwkvKiBCaXQtZmllbGQgdmFsdWVzIGZvciBNQ0NSNC4KKwkgKi8KKyNkZWZpbmUgQ0ZHX1BSRVRPQUNUCSAgICAyCSAgICAvKiBQcmVjaGFyZ2UgdG8gYWN0aXZhdGUgaW50ZXJ2YWwJKi8KKyNkZWZpbmUgQ0ZHX0FDVFRPUFJFCSAgICA1CSAgICAvKiBBY3RpdmF0ZSB0byBQcmVjaGFyZ2UgaW50ZXJ2YWwJKi8KKyNkZWZpbmUgQ0ZHX1NETU9ERV9DQVNfTEFUICAyCSAgICAvKiBTRE1PREUgQ0FTIGxhdGFuY3kJCSovCisjZGVmaW5lIENGR19TRE1PREVfV1JBUAkgICAgMAkgICAgLyogU0RNT0RFIHdyYXAgdHlwZQkJCSovCisjZGVmaW5lIENGR19TRE1PREVfQlVSU1RMRU4gMgkgICAgLyogU0RNT0RFIEJ1cnN0IGxlbmd0aAkJKi8KKyNkZWZpbmUgQ0ZHX0FDVE9SVwkgICAgMgorI2RlZmluZSBDRkdfUkVHSVNURVJEX1RZUEVfQlVGRkVSIDEKKworLyogTWVtb3J5IGJhbmsgc2V0dGluZ3MuCisgKiBPbmx5IGJpdHMgMjAtMjkgYXJlIGFjdHVhbGx5IHVzZWQgZnJvbSB0aGVzZSB2YWxlcyB0byBzZXQgdGhlCisgKiBzdGFydC9lbmQgYWRkcmVzc2VzLiBUaGUgdXBwZXIgdHdvIGJpdHMgd2lsbCBhbHdheXMgYmUgMCwgYW5kIHRoZSBsb3dlcgorICogMjAgYml0cyB3aWxsIGJlIDB4MDAwMDAgZm9yIGEgc3RhcnQgYWRkcmVzcywgb3IgMHhmZmZmZiBmb3IgYW4gZW5kCisgKiBhZGRyZXNzLiBSZWZlciB0byB0aGUgTVBDODI0MCBib29rLgorICovCisKKyNkZWZpbmUgQ0ZHX0JBTkswX1NUQVJUCSAgICAweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LMF9FTkQJICAgIChDRkdfTUFYX1JBTV9TSVpFIC0gMSkKKyNkZWZpbmUgQ0ZHX0JBTkswX0VOQUJMRSAgICAxCisjZGVmaW5lIENGR19CQU5LMV9TVEFSVAkgICAgMHgzZmYwMDAwMAorI2RlZmluZSBDRkdfQkFOSzFfRU5ECSAgICAweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LMV9FTkFCTEUgICAgMAorI2RlZmluZSBDRkdfQkFOSzJfU1RBUlQJICAgIDB4M2ZmMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTksyX0VORAkgICAgMHgzZmZmZmZmZgorI2RlZmluZSBDRkdfQkFOSzJfRU5BQkxFICAgIDAKKyNkZWZpbmUgQ0ZHX0JBTkszX1NUQVJUCSAgICAweDNmZjAwMDAwCisjZGVmaW5lIENGR19CQU5LM19FTkQJICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0JBTkszX0VOQUJMRSAgICAwCisjZGVmaW5lIENGR19CQU5LNF9TVEFSVAkgICAgMHgzZmYwMDAwMAorI2RlZmluZSBDRkdfQkFOSzRfRU5ECSAgICAweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LNF9FTkFCTEUgICAgMAorI2RlZmluZSBDRkdfQkFOSzVfU1RBUlQJICAgIDB4M2ZmMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks1X0VORAkgICAgMHgzZmZmZmZmZgorI2RlZmluZSBDRkdfQkFOSzVfRU5BQkxFICAgIDAKKyNkZWZpbmUgQ0ZHX0JBTks2X1NUQVJUCSAgICAweDNmZjAwMDAwCisjZGVmaW5lIENGR19CQU5LNl9FTkQJICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0JBTks2X0VOQUJMRSAgICAwCisjZGVmaW5lIENGR19CQU5LN19TVEFSVAkgICAgMHgzZmYwMDAwMAorI2RlZmluZSBDRkdfQkFOSzdfRU5ECSAgICAweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LN19FTkFCTEUgICAgMAorCisjZGVmaW5lIENGR19PRENSCSAgICAweGZmCisKKyNkZWZpbmUgQ0ZHX0lCQVQwTCAgKENGR19TRFJBTV9CQVNFIHwgQkFUTF9QUF8xMCB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDBVICAoQ0ZHX1NEUkFNX0JBU0UgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKworI2RlZmluZSBDRkdfSUJBVDFMICAoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRMX1BQXzEwIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUMVUgIChDRkdfSU5JVF9SQU1fQUREUiB8IEJBVFVfQkxfMTI4SyB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19JQkFUMkwgICgweDgwMDAwMDAwIHwgQkFUTF9QUF8xMCB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDJVICAoMHg4MDAwMDAwMCB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19JQkFUM0wgICgweEZDMDAwMDAwIHwgQkFUTF9QUF8xMCB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDNVICAoMHhGQzAwMDAwMCB8IEJBVFVfQkxfNjRNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisKKyNkZWZpbmUgQ0ZHX0RCQVQwTCAgQ0ZHX0lCQVQwTAorI2RlZmluZSBDRkdfREJBVDBVICBDRkdfSUJBVDBVCisjZGVmaW5lIENGR19EQkFUMUwgIENGR19JQkFUMUwKKyNkZWZpbmUgQ0ZHX0RCQVQxVSAgQ0ZHX0lCQVQxVQorI2RlZmluZSBDRkdfREJBVDJMICBDRkdfSUJBVDJMCisjZGVmaW5lIENGR19EQkFUMlUgIENGR19JQkFUMlUKKyNkZWZpbmUgQ0ZHX0RCQVQzTCAgQ0ZHX0lCQVQzTAorI2RlZmluZSBDRkdfREJBVDNVICBDRkdfSUJBVDNVCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJICAgICg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZMQVNIIG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMgkvKiBNYXggbnVtYmVyIG9mIGZsYXNoIGJhbmtzCQkqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMzkJLyogTWF4IG51bWJlciBvZiBzZWN0b3JzIGluIG9uZSBiYW5rCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJMTIwMDAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlIChpbiBtcykJKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJNTAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlIChpbiBtcykJKi8KKworCS8qIFdhcmluaW5nOiBlbnZpcm9ubWVudCBpcyBub3QgRU1CRURERUQgaW4gdGhlIFUtQm9vdCBjb2RlLgorCSAqIEl0J3Mgc3RvcmVkIGluIGZsYXNoIHNlcGFyYXRlbHkuCisJICovCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJICAgIDEKKyNpZiAwCisjZGVmaW5lIENGR19FTlZfQUREUgkJMHhGRjAwODAwMAorI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4ODAwMAkvKiBTaXplIG9mIHRoZSBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKyNlbHNlCisjZGVmaW5lIENGR19FTlZfQUREUgkJMHhGRkZDMDAwMAorI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4NDAwMAkvKiBTaXplIG9mIHRoZSBFbnZpcm9ubWVudAkJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9PRkZTRVQJCTAJLyogc3RhcnRpbmcgcmlnaHQgYXQgdGhlIGJlZ2lubmluZwkqLworI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDQwMDAwIC8qIFNpemUgb2YgdGhlIEVudmlyb25tZW50IFNlY3RvcgkqLworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENhY2hlIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLworI2VuZGlmCisKKy8qCisgKiBJbnRlcm5hbCBEZWZpbml0aW9ucworICoKKyAqIEJvb3QgRmxhZ3MKKyAqLworI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CQkJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUENJIHN0dWZmCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgQ09ORklHX1BDSQkJCS8qIGluY2x1ZGUgcGNpIHN1cHBvcnQJCQkqLworI3VuZGVmIENPTkZJR19QQ0lfUE5QCisKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkJLyogTXVsdGkgZXRoZXJuZXQgY2FyZHMgc3VwcG9ydCAJKi8KKworI2RlZmluZSBDT05GSUdfVFVMSVAKKyNkZWZpbmUgQ09ORklHX1RVTElQX1VTRV9JTworCisjZGVmaW5lIENGR19FVEhfREVWX0ZOCSAgICAgMHg3ODAwCisjZGVmaW5lIENGR19FVEhfSU9CQVNFCSAgICAgMHgwMDEwNDAwMAorCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0RVNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvRFU0MDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmY0MGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL0RVNDA1LmgKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFN0ZWZhbiBSb2VzZSwgZXNkIGdtYmggZ2VybWFueSwgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogYm9hcmQvY29uZmlnLmggLSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGJvYXJkIHNwZWNpZmljCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKworI2RlZmluZSBDT05GSUdfNDA1R1AJCTEJLyogVGhpcyBpcyBhIFBQQzQwNSBDUFUJCSovCisjZGVmaW5lIENPTkZJR180eHgJCTEJLyogLi4ubWVtYmVyIG9mIFBQQzR4eCBmYW1pbHkgICAqLworI2RlZmluZSBDT05GSUdfRFU0MDUJICAgICAgICAxCS8qIC4uLm9uIGEgRFU0MDUgYm9hcmQJICAgICAgICAqLworCisjZGVmaW5lIENPTkZJR19CT0FSRF9QUkVfSU5JVCAgIDEgICAgICAgLyogY2FsbCBib2FyZF9wcmVfaW5pdCgpICAgICAgICAqLworCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgICAgIDI1MDAwMDAwIC8qIGV4dGVybmFsIGZyZXF1ZW5jeSB0byBwbGwgICAqLworCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMJLyogYXV0b2Jvb3QgYWZ0ZXIgMyBzZWNvbmRzCSovCisKKyN1bmRlZglDT05GSUdfQk9PVEFSR1MKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSBmZmYwMDAwMCIKKworI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLworI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KKworI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KKyNkZWZpbmUJQ09ORklHX1BIWV9BRERSCQkwCS8qIFBIWSBhZGRyZXNzCQkJKi8KKworI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKKwkJCQlDRkdfQ01EX1BDSQl8IFwKKwkJCQlDRkdfQ01EX0lSUQl8IFwKKwkJCQlDRkdfQ01EX0lERQl8IFwKKwkJCQlDRkdfQ01EX0VMRgl8IFwKKwkJCQlDRkdfQ01EX0RBVEUJfCBcCisJCQkJQ0ZHX0NNRF9FRVBST00gICkKKworI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgorI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgorCisvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCisjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKyN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KKworI2RlZmluZSBDT05GSUdfUlRDX01DMTQ2ODE4ICAgICAgICAgICAgIC8qIEJRMzI4NSBpcyBNQzE0NjgxOCBjb21wYXRpYmxlKi8KKyNkZWZpbmUgQ0ZHX1JUQ19SRUdfQkFTRV9BRERSCSAweEYwMDAwMDgwIC8qIFJUQyBCYXNlIEFkZHJlc3MgICAgICAgICAqLworCisjZGVmaW5lCUNPTkZJR19TRFJBTV9CQU5LMAkxCS8qIGluaXQgb25ib2FyZCBTRFJBTSBiYW5rIDAJKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbHNlCisjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2VuZGlmCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENGR19DT05TT0xFX0lORk9fUVVJRVQgIDEgICAgICAgLyogZG9uJ3QgcHJpbnQgY29uc29sZSBAIHN0YXJ0dXAqLworCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDQwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwQzAwMDAwCS8qIDQgLi4uIDEyIE1CIGluIERSQU0JKi8KKworI2RlZmluZSBDRkdfRVhUX1NFUklBTF9DTE9DSyAgICAxMTA1OTIwMCAgLyogdXNlIGV4dGVybmFsIHNlcmlhbCBjbG9jayAgKi8KKworLyogVGhlIGZvbGxvd2luZyB0YWJsZSBpbmNsdWRlcyB0aGUgc3VwcG9ydGVkIGJhdWRyYXRlcyAqLworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUgICAgICBcCisgICAgICAgIHsgMzAwLCA2MDAsIDEyMDAsIDI0MDAsIDQ4MDAsIDk2MDAsIDE5MjAwLCAzODQwMCwgICAgIFwKKyAgICAgICAgIDU3NjAwLCAxMTUyMDAsIDIzMDQwMCwgNDYwODAwLCA5MjE2MDAgfQorCisjZGVmaW5lIENGR19MT0FEX0FERFIJMHgxMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX0VYVEJESU5GTwkxCQkvKiBUbyB1c2UgZXh0ZW5kZWQgYm9hcmRfaW50byAoYmRfdCkgKi8KKworI2RlZmluZQlDRkdfSFoJCTEwMDAJCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MJKi8KKworI2RlZmluZSBDT05GSUdfWkVST19CT09UREVMQVlfQ0hFQ0sJLyogY2hlY2sgZm9yIGtleXByZXNzIG9uIGJvb3RkZWxheT09MCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQQ0kgc3R1ZmYKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBQQ0lfSE9TVF9BREFQVEVSIDAgICAgICAgICAgICAgIC8qIGNvbmZpZ3VyZSBhciBwY2kgYWRhcHRlciAgICAgKi8KKyNkZWZpbmUgUENJX0hPU1RfRk9SQ0UgIDEgICAgICAgICAgICAgICAvKiBjb25maWd1cmUgYXMgcGNpIGhvc3QgICAgICAgICovCisjZGVmaW5lIFBDSV9IT1NUX0FVVE8gICAyICAgICAgICAgICAgICAgLyogZGV0ZWN0ZWQgdmlhIGFyYml0ZXIgZW5hYmxlICAqLworCisjZGVmaW5lIENPTkZJR19QQ0kJCQkvKiBpbmNsdWRlIHBjaSBzdXBwb3J0CSAgICAgICAgKi8KKyNkZWZpbmUgQ09ORklHX1BDSV9IT1NUCVBDSV9IT1NUX0FVVE8gICAvKiBzZWxlY3QgcGNpIGhvc3QgZnVuY3Rpb24gICAgICovCisjZGVmaW5lIENPTkZJR19QQ0lfUE5QCQkJLyogZG8gcGNpIHBsdWctYW5kLXBsYXkgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gICAgICAgKi8KKworI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDEyRkUgIC8qIFBDSSBWZW5kb3IgSUQ6IGVzZCBnbWJoICAgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfREVWSUNFSUQgMHgwNDA0ICAvKiBQQ0kgRGV2aWNlIElEOiBDUENJLUlTRVI0ICAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMUxBICAweDAwMDAwMDAwICAgICAgLyogcG9pbnQgdG8gc2RyYW0gICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTFNUyAgMHhmZjAwMDAwMSAgICAgIC8qIDE2TUIsIGVuYWJsZSBoYXJkLXdpcmVkIHRvIDEgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0xUENJIDB4MDAwMDAwMDAgICAgICAvKiBIb3N0OiB1c2UgdGhpcyBwY2kgYWRkcmVzcyAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMkxBICAweGZmZTAwMDAwICAgICAgLyogcG9pbnQgdG8gZmxhc2ggICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTJNUyAgMHhmZmUwMDAwMSAgICAgIC8qIDJNQiwgZW5hYmxlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0yUENJIDB4MDQwMDAwMDAgICAgICAvKiBIb3N0OiB1c2UgdGhpcyBwY2kgYWRkcmVzcyAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElERS9BVEEgc3R1ZmYKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI3VuZGVmICBDT05GSUdfSURFXzh4eF9ESVJFQ1QgICAgICAgICAgIC8qIG5vIHBjbWNpYSBpbnRlcmZhY2UgcmVxdWlyZWQgKi8KKyN1bmRlZiAgQ09ORklHX0lERV9MRUQgICAgICAgICAgICAgICAgICAvKiBubyBsZWQgZm9yIGlkZSBzdXBwb3J0ZWQgICAgICovCisjdW5kZWYgIENPTkZJR19JREVfUkVTRVQgICAgICAgICAgICAgICAgLyogbm8gcmVzZXQgZm9yIGlkZSBzdXBwb3J0ZWQgICAqLworCisjZGVmaW5lCUNGR19JREVfTUFYQlVTCSAgICAgICAgMQkJLyogbWF4LiAxIElERSBidXNzZXMJKi8KKyNkZWZpbmUJQ0ZHX0lERV9NQVhERVZJQ0UJKENGR19JREVfTUFYQlVTKjEpIC8qIG1heC4gMSBkcml2ZXMgcGVyIElERSBidXMgKi8KKworI2RlZmluZQlDRkdfQVRBX0JBU0VfQUREUgkweEYwMTAwMDAwCisjZGVmaW5lCUNGR19BVEFfSURFMF9PRkZTRVQJMHgwMDAwCisKKyNkZWZpbmUgQ0ZHX0FUQV9EQVRBX09GRlNFVAkweDAwMDAJLyogT2Zmc2V0IGZvciBkYXRhIEkvTwkJCSovCisjZGVmaW5lCUNGR19BVEFfUkVHX09GRlNFVAkweDAwMDAJLyogT2Zmc2V0IGZvciBub3JtYWwgcmVnaXN0ZXIgYWNjZXNzZXMJKi8KKyNkZWZpbmUgQ0ZHX0FUQV9BTFRfT0ZGU0VUCTB4MDAwMAkvKiBPZmZzZXQgZm9yIGFsdGVybmF0ZSByZWdpc3RlcnMJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhcnQgYWRkcmVzc2VzIGZvciB0aGUgZmluYWwgbWVtb3J5IGNvbmZpZ3VyYXRpb24KKyAqIChTZXQgdXAgYnkgdGhlIHN0YXJ0dXAgY29kZSkKKyAqIFBsZWFzZSBub3RlIHRoYXQgQ0ZHX1NEUkFNX0JBU0UgX211c3RfIHN0YXJ0IGF0IDAKKyAqLworI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRkZEMDAwMAorI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCUNGR19GTEFTSF9CQVNFCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDE5MiAqIDEwMjQpCS8qIFJlc2VydmUgMTkyIGtCIGZvciBNb25pdG9yCSovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoMTI4ICogMTAyNCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIG1hbGxvYygpCSovCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGTEFTSCBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTIJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJCSovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkyNTYJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJMTIwMDAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlIChpbiBtcykJKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJNTAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlIChpbiBtcykJKi8KKworI2RlZmluZSBDRkdfRkxBU0hfV09SRF9TSVpFICAgICB1bnNpZ25lZCBzaG9ydCAgLyogZmxhc2ggd29yZCBzaXplICh3aWR0aCkgICAgICAqLworI2RlZmluZSBDRkdfRkxBU0hfQUREUjAgICAgICAgICAweDU1NTUgIC8qIDFzdCBhZGRyZXNzIGZvciBmbGFzaCBjb25maWcgY3ljbGVzICAqLworI2RlZmluZSBDRkdfRkxBU0hfQUREUjEgICAgICAgICAweDJBQUEgIC8qIDJuZCBhZGRyZXNzIGZvciBmbGFzaCBjb25maWcgY3ljbGVzICAqLworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgYWRkZWQgZm9yIGJ1Z2d5IElPUDQ4MCBieXRlIGludGVyZmFjZS4KKyAqIEFsbCBvdGhlciBib2FyZHMgc2hvdWxkIHVzZSB0aGUgc3RhbmRhcmQgdmFsdWVzIChDUENJNDA1IGV0Yy4pCisgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1JFQUQwICAgICAgICAgMHgwMDAwICAvKiAwIGlzIHN0YW5kYXJkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1JFQUQxICAgICAgICAgMHgwMDAxICAvKiAxIGlzIHN0YW5kYXJkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1JFQUQyICAgICAgICAgMHgwMDAyICAvKiAyIGlzIHN0YW5kYXJkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDRkdfRkxBU0hfRU1QVFlfSU5GTyAgICAgICAgICAgIC8qIHByaW50ICdFJyBmb3IgZW1wdHkgc2VjdG9yIG9uIGZsaW5mbyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJMkMgRUVQUk9NIChDQVQyNFdDMDgpIGZvciBlbnZpcm9ubWVudAorICovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJCS8qIEkyYyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCisKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDUwCS8qIEVFUFJPTSBDQVQyOFdDMDgJCSovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOCTEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KKy8qIG1hc2sgb2YgYWRkcmVzcyBiaXRzIHRoYXQgb3ZlcmZsb3cgaW50byB0aGUgIkVFUFJPTSBjaGlwIGFkZHJlc3MiICAgICovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfT1ZFUkZMT1cJMHgwNworI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfQklUUyA0CS8qIFRoZSBDYXRhbHlzdCBDQVQyNFdDMDggaGFzCSovCisJCQkJCS8qIDE2IGJ5dGUgcGFnZSB3cml0ZSBtb2RlIHVzaW5nKi8KKwkJCQkJLyogbGFzdAk0IGJpdHMgb2YgdGhlIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTEwICAgLyogYW5kIHRha2VzIHVwIHRvIDEwIG1zZWMgKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0VOQUJMRQorCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRUVQUk9NICAgIDEgICAgICAgLyogdXNlIEVFUFJPTSBmb3IgZW52aXJvbm1lbnQgdmFycyAqLworI2RlZmluZSBDRkdfRU5WX09GRlNFVCAgICAgICAgICAweDAwMCAgIC8qIGVudmlyb25tZW50IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFICAgICAgICAgICAgMHg0MDAgICAvKiAxMDI0IGJ5dGVzIG1heSBiZSB1c2VkIGZvciBlbnYgdmFycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0b3RhbCBzaXplIG9mIGEgQ0FUMjRXQzA4IGlzIDEwMjQgYnl0ZXMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2FjaGUgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgSUJNIDQwNSBDUFVzCQkJKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCisjZW5kaWYKKworLyoKKyAqIEluaXQgTWVtb3J5IENvbnRyb2xsZXI6CisgKgorICogQlIwLzEgYW5kIE9SMC8xIChGTEFTSCkKKyAqLworCisjZGVmaW5lIEZMQVNIX0JBU0UwX1BSRUxJTQkweEZGODAwMDAwCS8qIEZMQVNIIGJhbmsgIzAJKi8KKyNkZWZpbmUgRkxBU0hfQkFTRTFfUFJFTElNCTB4RkZDMDAwMDAJLyogRkxBU0ggYmFuayAjMQkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBCdXMgQ29udHJvbGxlciAoRUJDKSBTZXR1cAorICovCisKKyNkZWZpbmUgRkxBU0gwX0JBICAgICAgIDB4RkZDMDAwMDAgICAgICAgICAgLyogRkxBU0ggMCBCYXNlIEFkZHJlc3MgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkxBU0gxX0JBICAgICAgIDB4RkY4MDAwMDAgICAgICAgICAgLyogRkxBU0ggMSBCYXNlIEFkZHJlc3MgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FOX0JBICAgICAgICAgIDB4RjAwMDAwMDAgICAgICAgICAgLyogQ0FOIEJhc2UgQWRkcmVzcyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFVBUlRfQkEgICAgICAgIDB4RjAzMDAwMDAgICAgICAgICAgLyogRFVBUlQgQmFzZSBBZGRyZXNzICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZfQkEgICAgICAgICAgIDB4RjAxMDAwMDAgICAgICAgICAgLyogQ29tcGFjdEZsYXNoIEJhc2UgQWRkcmVzcyAgICAgICAgKi8KKyNkZWZpbmUgU1JBTV9CQSAgICAgICAgIDB4RjAyMDAwMDAgICAgICAgICAgLyogU1JBTSBCYXNlIEFkZHJlc3MgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFVSQUdfSU9fQkEgICAgIDB4RjA0MDAwMDAgICAgICAgICAgLyogRFVSQUcgQnVzIElPIEJhc2UgQWRkcmVzcyAgICAgICAgKi8KKyNkZWZpbmUgRFVSQUdfTUVNX0JBICAgIDB4RjA1MDAwMDAgICAgICAgICAgLyogRFVSQUcgQnVzIE1lbSBCYXNlIEFkZHJlc3MgICAgICAgKi8KKworI2RlZmluZSBGUEdBX01PREVfUkVHICAgKERVQVJUX0JBKzB4ODApICAgICAvKiBGUEdBIE1vZGUgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLworCisvKiBNZW1vcnkgQmFuayAwIChGbGFzaCBCYW5rIDApIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEIwQVAgICAweDkyMDE1NDgwCisjZGVmaW5lIENGR19FQkNfUEIwQ1IgICBGTEFTSDBfQkEgfCAweDVBMDAwIC8qIEJBUz0weEZGQyxCUz00TUIsQlU9Ui9XLEJXPTE2Yml0ICovCisKKy8qIE1lbW9yeSBCYW5rIDEgKEZsYXNoIEJhbmsgMSkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjFBUCAgIDB4OTIwMTU0ODAKKyNkZWZpbmUgQ0ZHX0VCQ19QQjFDUiAgIEZMQVNIMV9CQSB8IDB4NUEwMDAgLyogQkFTPTB4RkY4LEJTPTRNQixCVT1SL1csQlc9MTZiaXQgKi8KKworLyogTWVtb3J5IEJhbmsgMiAoQ0FOMCkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCMkFQICAgMHgwMTAwNTNDMCAgIC8qIEJXVD0yLFdCTj0xLFdCRj0xLFRIPTEsUkU9MSxTT1I9MSxCRU09MSAqLworI2RlZmluZSBDRkdfRUJDX1BCMkNSICAgQ0FOX0JBIHwgMHgxODAwMCAgICAvKiBCQVM9MHhGMDAsQlM9MU1CLEJVPVIvVyxCVz04Yml0ICAqLworCisvKiBNZW1vcnkgQmFuayAzIChEVUFSVCkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEIzQVAgICAweDAxMDA1M0MwICAgLyogQldUPTIsV0JOPTEsV0JGPTEsVEg9MSxSRT0xLFNPUj0xLEJFTT0xICovCisjZGVmaW5lIENGR19FQkNfUEIzQ1IgICBEVUFSVF9CQSB8IDB4MTgwMDAgIC8qIEJBUz0weEYwMyxCUz0xTUIsQlU9Ui9XLEJXPThiaXQgICovCisKKy8qIE1lbW9yeSBCYW5rIDQgKENvbXBhY3RGbGFzaCBJREUpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjRBUCAgIDB4MDEwMDUzQzAgICAvKiBCV1Q9MixXQk49MSxXQkY9MSxUSD0xLFJFPTEsU09SPTEsQkVNPTEgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjRDUiAgIENGX0JBIHwgMHgxQTAwMCAgICAgLyogQkFTPTB4RjAxLEJTPTFNQixCVT1SL1csQlc9MTZiaXQgKi8KKworLyogTWVtb3J5IEJhbmsgNSAoU1JBTSkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCNUFQICAgMHgwMTAwNTNDMCAgIC8qIEJXVD0yLFdCTj0xLFdCRj0xLFRIPTEsUkU9MSxTT1I9MSxCRU09MSAqLworI2RlZmluZSBDRkdfRUJDX1BCNUNSICAgU1JBTV9CQSB8IDB4MUEwMDAgICAvKiBCQVM9MHhGMDIsQlM9MU1CLEJVPVIvVyxCVz0xNmJpdCAqLworCisvKiBNZW1vcnkgQmFuayA2IChEVVJBRyBCdXMgSU8gU3BhY2UpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEI2QVAgICAweDAxMDA1M0MwICAgLyogQldUPTIsV0JOPTEsV0JGPTEsVEg9MSxSRT0xLFNPUj0xLEJFTT0xICovCisjZGVmaW5lIENGR19FQkNfUEI2Q1IgICBEVVJBR19JT19CQSB8IDB4MTgwMDAgLyogQkFTPTB4RjA0LEJTPTFNQixCVT1SL1csQlc9OGJpdCovCisKKy8qIE1lbW9yeSBCYW5rIDcgKERVUkFHIEJ1cyBNZW0gU3BhY2UpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjdBUCAgIDB4MDEwMDUzQzAgICAvKiBCV1Q9MixXQk49MSxXQkY9MSxUSD0xLFJFPTEsU09SPTEsQkVNPTEgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjdDUiAgIERVUkFHX01FTV9CQSB8IDB4MTgwMDAgLyogQkFTPTB4RjA1LEJTPTFNQixCVT1SL1csQlc9OGJpdCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb25zIGZvciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgYW5kIGRhdGEgYXJlYSAoaW4gRFBSQU0pCisgKi8KKworLyogdXNlIG9uIGNoaXAgbWVtb3J5ICggT0NNICkgZm9yIHRlbXBlcmFyeSBzdGFjayB1bnRpbCBzZHJhbSBpcyB0ZXN0ZWQgKi8KKyNkZWZpbmUgQ0ZHX1RFTVBfU1RBQ0tfT0NNICAgICAgICAxCisKKy8qIE9uIENoaXAgTWVtb3J5IGxvY2F0aW9uICovCisjZGVmaW5lIENGR19PQ01fREFUQV9BRERSCTB4RjgwMDAwMDAKKyNkZWZpbmUgQ0ZHX09DTV9EQVRBX1NJWkUJMHgxMDAwCisKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJQ0ZHX09DTV9EQVRBX0FERFIgLyogaW5zaWRlIG9mIFNEUkFNCQkqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECUNGR19PQ01fREFUQV9TSVpFIC8qIEVuZCBvZiB1c2VkIGFyZWEgaW4gUkFNCSovCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFICAgICAgMTI4ICAvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVCAgICAoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQgICAgICBDRkdfR0JMX0RBVEFfT0ZGU0VUCisKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0VWQjY0MjYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvRVZCNjQyNjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTdlMWY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL0VWQjY0MjYwLmgKQEAgLTAsMCArMSw0MjggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBib2FyZC9jb25maWcuaCAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYm9hcmQgc3BlY2lmaWMKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGdhbGlsZW8vY29yZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICIuLi9ib2FyZC9ldmI2NDI2MC9sb2NhbC5oIgorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworCisjZGVmaW5lIENPTkZJR19FVkI2NDI2MAkJMQkvKiB0aGlzIGlzIGFuIEVWQjY0MjYwIGJvYXJkCSovCisjZGVmaW5lIENGR19HVF82NDI2eCAgICAgICAgR1RfNjQyNjAgLyogd2l0aCBhIDY0MjYwIHN5c3RlbSBjb250cm9sbGVyICovCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkzODQwMCAJLyogY29uc29sZSBiYXVkcmF0ZSA9IDM4NDAwCSovCisKKyN1bmRlZglDT05GSUdfRUNDCQkJLyogZW5hYmxlIEVDQyBzdXBwb3J0ICovCisvKiAjZGVmaW5lIENPTkZJR19FVkI2NDI2MF83NTBDWCAgMSAqLyAgICAgIC8qIFN1cHBvcnQgdGhlIEVWQi02NDI2MC03NTBDWCBCb2FyZCAqLworCisvKiB3aGljaCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgdG8gY2FsbCBmb3IgdGhpcyBib2FyZCAqLworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IJMQorI2RlZmluZSBDT05GSUdfQk9BUkRfUFJFX0lOSVQJMQorCisjaWZuZGVmIENPTkZJR19FVkI2NDI2MF83NTBDWAorI2RlZmluZSBDRkdfQk9BUkRfTkFNRQkJIkVWQjY0MjYwIgorI2Vsc2UKKyNkZWZpbmUgQ0ZHX0JPQVJEX05BTUUgICAgICAgICAiRVZCNjQyNjAtNzUwQ1giCisjZW5kaWYKKworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgbGV0IHlvdSBzZWxlY3Qgd2hhdCBzZXJpYWwgeW91IHdhbnQgdG8gdXNlCisgKiBmb3IgeW91ciBjb25zb2xlIGRyaXZlci4KKyAqCisgKiB3aGF0IHRvIGRvOgorICogdG8gdXNlIHRoZSBEVUFSVCwgdW5kZWYgQ09ORklHX01QU0MuICBJZiB5b3UgaGF2ZSBoYWNrZWQgYSBzZXJpYWwKKyAqIGNhYmxlIG9udG8gdGhlIHNlY29uZCBEVUFSVCBjaGFubmVsLCBjaGFuZ2UgdGhlIENGR19EVUFSVCBwb3J0IGZyb20gMQorICogdG8gMCBiZWxvdy4KKyAqCisgKiB0byB1c2UgdGhlIE1QU0MsICNkZWZpbmUgQ09ORklHX01QU0MuICBJZiB5b3UgaGF2ZSB3aXJlZCB1cCBhbm90aGVyCisgKiBtcHNjIGNoYW5uZWwsIGNoYW5nZSBDT05GSUdfTVBTQ19QT1JUIHRvIHRoZSBkZXNpcmVkIHZhbHVlLgorICovCisjZGVmaW5lCUNPTkZJR19NUFNDCisjZGVmaW5lIENPTkZJR19NUFNDX1BPUlQJMAorCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkgICAgICAgIC8qIGF0dGVtcHQgYWxsIGF2YWlsYWJsZSBhZGFwdGVycyAqLworCisvKiBkZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBlbmFibGUgR1QgTUFDIGZpbHRlcmluZyAqLworI2RlZmluZSBDT05GSUdfR1RfVVNFX01BQ19IQVNIX1RBQkxFCisKKyN1bmRlZiBDT05GSUdfRVRIRVJfUE9SVF9NSUkJLyogdXNlIFJNSUkgKi8KKworI2lmIDEKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQkvKiBhdXRvYm9vdCBkaXNhYmxlZAkJKi8KKyNlbHNlCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMJKi8KKyNlbmRpZgorI2RlZmluZSBDT05GSUdfWkVST19CT09UREVMQVlfQ0hFQ0sKKworI3VuZGVmCUNPTkZJR19CT09UQVJHUworI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJCQkJCQkgICAgIFwKKwkiYm9vdHAgJiYgIiAJCQkJCQkgICAgIFwKKwkic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgbmZzcm9vdD0kc2VydmVyaXA6JHJvb3RwYXRoICIgXAorCSJpcD0kaXBhZGRyOiRzZXJ2ZXJpcDokZ2F0ZXdheWlwOiIgXAorCSIkbmV0bWFzazokaG9zdG5hbWU6ZXRoMDpub25lOyAmJiAiIFwKKwkiYm9vdG0iCisKKyNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMAkvKiBlY2hvIG9mZiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCisjZGVmaW5lCUNGR19MT0FEU19CQVVEX0NIQU5HRQkJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlcwkqLworCisjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCisjdW5kZWYJQ09ORklHX0FMVElWRUMgICAgICAgICAgICAgICAgICAvKiB1bmRlZiB0byBkaXNhYmxlICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAorCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorCisKKyNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfQVNLRU5WKQorCisvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCisjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCisjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZWxzZQorI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbmRpZgorI2RlZmluZQlDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUJQ0ZHX01BWEFSR1MJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDAwNDAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDAwQzAwMDAwCS8qIDQgLi4uIDEyIE1CIGluIERSQU0JKi8KKworI2RlZmluZQlDRkdfTE9BRF9BRERSCQkweDAwMzAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzCSovCisKKyNkZWZpbmUJQ0ZHX0haCQkJMTAwMAkJLyogZGVjciBmcmVxOiAxbXMgdGlja3MJKi8KKyNkZWZpbmUgQ0ZHX0JVU19IWgkJMTAwMDAwMDAwCS8qIDEwMCBNSHoJCSovCisjZGVmaW5lIENGR19CVVNfQ0xLCQlDRkdfQlVTX0haCisKKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDAgfQorCisjaWZkZWYgQ09ORklHX0VWQjY0MjYwXzc1MENYCisjZGVmaW5lIENPTkZJR183NTBDWAorI2RlZmluZSBDRkdfQlJPS0VOX0NMMgorI2VuZGlmCisKKy8qCisgKiBMb3cgTGV2ZWwgQ29uZmlndXJhdGlvbiBTZXR0aW5ncworICogKGFkZHJlc3MgbWFwcGluZ3MsIHJlZ2lzdGVyIGluaXRpYWwgdmFsdWVzLCBldGMuKQorICogWW91IHNob3VsZCBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBpZiB5b3UgbWFrZSBjaGFuZ2VzIGhlcmUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbnMgZm9yIGluaXRpYWwgc3RhY2sgcG9pbnRlciBhbmQgZGF0YSBhcmVhCisgKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJMHg0MDAwMDAwMAorI2RlZmluZQlDRkdfSU5JVF9SQU1fRU5ECTB4MTAwMAorI2RlZmluZQlDRkdfR0JMX0RBVEFfU0laRQkxMjggIC8qIHNpemUgaW4gYnl0ZXMgcmVzZXJ2ZWQgZm9yIGluaXQgZGF0YSAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfT0ZGU0VUCShDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisjZGVmaW5lIENGR19JTklUX1JBTV9MT0NLCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhcnQgYWRkcmVzc2VzIGZvciB0aGUgZmluYWwgbWVtb3J5IGNvbmZpZ3VyYXRpb24KKyAqIChTZXQgdXAgYnkgdGhlIHN0YXJ0dXAgY29kZSkKKyAqIFBsZWFzZSBub3RlIHRoYXQgQ0ZHX1NEUkFNX0JBU0UgX211c3RfIHN0YXJ0IGF0IDAKKyAqLworI2RlZmluZQlDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhmZmYwMDAwMAorI2RlZmluZSBDRkdfUkVTRVRfQUREUkVTUwkweGZmZjAwMTAwCisjZGVmaW5lCUNGR19NT05JVE9SX0xFTgkJKDI1NiA8PCAxMCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IgKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlDRkdfRkxBU0hfQkFTRQorI2RlZmluZQlDRkdfTUFMTE9DX0xFTgkJKDI1NiA8PCAxMCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIG1hbGxvYyAqLworCisvKiBhcmVhcyB0byBtYXAgZGlmZmVyZW50IHRoaW5ncyB3aXRoIHRoZSBHVCBpbiBwaHlzaWNhbCBzcGFjZSAqLworI2RlZmluZSBDRkdfRFJBTV9CQU5LUwkJNAorI2RlZmluZSBDRkdfREZMX0dUX1JFR1MJCTB4MTQwMDAwMDAJLyogYm9vdCB0aW1lIEdUX1JFR1MgKi8KKworLyogV2hhdCB0byBwdXQgaW4gdGhlIGJhdHMuICovCisjZGVmaW5lIENGR19NSVNDX1JFR0lPTl9CQVNFCTB4ZjAwMDAwMDAKKworLyogUGVyaXBoZXJhbCBEZXZpY2Ugc2VjdGlvbiAqLworI2RlZmluZSBDRkdfR1RfUkVHUwkJMHhmODAwMDAwMAorI2RlZmluZSBDRkdfREVWX0JBU0UJCTB4ZmMwMDAwMDAKKworI2RlZmluZSBDRkdfREVWMF9TUEFDRQkJQ0ZHX0RFVl9CQVNFCisjZGVmaW5lIENGR19ERVYxX1NQQUNFCQkoQ0ZHX0RFVjBfU1BBQ0UgKyBDRkdfREVWMF9TSVpFKQorI2RlZmluZSBDRkdfREVWMl9TUEFDRQkJKENGR19ERVYxX1NQQUNFICsgQ0ZHX0RFVjFfU0laRSkKKyNkZWZpbmUgQ0ZHX0RFVjNfU1BBQ0UJCShDRkdfREVWMl9TUEFDRSArIENGR19ERVYyX1NJWkUpCisKKyNkZWZpbmUgQ0ZHX0RFVjBfU0laRQkJIF84TSAvKiBldmI2NDI2MCBzcmFtICBAIDB4ZmMwMC4wMDAwICovCisjZGVmaW5lIENGR19ERVYxX1NJWkUJCSBfOE0gLyogZXZiNjQyNjAgcnRjICAgQCAweGZjODAuMDAwMCAqLworI2RlZmluZSBDRkdfREVWMl9TSVpFCQlfMTZNIC8qIGV2YjY0MjYwIGR1YXJ0IEAgMHhmZDAwLjAwMDAgKi8KKyNkZWZpbmUgQ0ZHX0RFVjNfU0laRQkJXzE2TSAvKiBldmI2NDI2MCBmbGFzaCBAIDB4ZmUwMC4wMDAwICovCisKKyNkZWZpbmUgQ0ZHX0RFVjBfUEFSCQkweDIwMjA1MDkzCisjZGVmaW5lIENGR19ERVYxX1BBUgkJMHhjZmNmZmZmZgorI2RlZmluZSBDRkdfREVWMl9QQVIJCTB4YzAwNTliZDQKKyNkZWZpbmUgQ0ZHXzhCSVRfQk9PVF9QQVIJMHhjMDBiNWU3YworI2RlZmluZSBDRkdfMzJCSVRfQk9PVF9QQVIJMHhjNGE4MjQxYworICAgICAgICAvKiAgIGMgICAgNCAgICBhICAgICAgOCAgICAgMiAgICAgNCAgICAxICAgICAgYwkJKi8KKyAgICAgICAgLyogMzMgMjJ8MjIyMnwyMiAyMnwxMTEgMXwxMSAxMXwxIDEgIHwgICAgfAkJKi8KKyAgICAgICAgLyogMTAgOTh8NzY1NHwzMiAxMHw5ODcgNnw1NCAzMnwxIDA5OHw3IDY1NHwzIDIxMAkqLworICAgICAgICAvKiAxMXwwMHwwMTAwfDEwIDEwfDEwMHwwIDAwfDEwIDB8MTAwIDB8MDAxIDF8MTAwCSovCisgICAgICAgIC8qICAzfCAwfC4uLi4gLi58IDJ8IDQgfCAgMCB8ICA0IHwgIDggIHwgIDMgIHwgNAkqLworCisjaWYgMCAvKiBXcm9uZz8/IE5UTCAqLworI2RlZmluZSBDRkdfTVBQX0NPTlRST0xfMAkweDUzNTQxNzE3CS8qIEluaXRBY3QgRU9UWzRdIERCdXJzdCBUQ0VuWzFdICovCisJCQkJCQkvKiBETUFBY2tbMTowXSBHTlQwWzE6MF0gKi8KKyNlbHNlCisjZGVmaW5lIENGR19NUFBfQ09OVFJPTF8wCTB4NTM1NDc3NzcJLyogSW5pdEFjdCBFT1RbNF0gREJ1cnN0IFRDRW5bMV0gKi8KKwkJCQkJCS8qIFJFUTBbMTowXSBHTlQwWzE6MF0gKi8KKyNlbmRpZgorI2RlZmluZSBDRkdfTVBQX0NPTlRST0xfMQkweDQ0MDA5OTExCS8qIFRDRW5bNF0gVENUY250WzRdIEdQUFsxMzoxMl0gKi8KKwkJCQkJCS8qIERNQVJlcVs0XSBETUFBY2tbNF0gV0ROTUkgV0RFICovCisjaWYgMCAvKiBXcm9uZz8/IE5UTCAqLworI2RlZmluZSBDRkdfTVBQX0NPTlRST0xfMgkweDQwMDkxODE4CS8qIFRDVGNudFswXSBHUFBbMjI6MjFdIEJDbGtJbiAqLworCQkJCQkJLyogRE1BQWNrWzE6MF0gR05UMVsxOjBdICovCisjZWxzZQorI2RlZmluZSBDRkdfTVBQX0NPTlRST0xfMgkweDQwMDk4ODg4CS8qIFRDVGNudFswXSAqLworCQkJCQkJLyogR1BQWzIyXSAoUlMyMzJJbnRCIG9yIFBDSTFJbnQpICovCisJCQkJCQkvKiBHUFBbMjFdIChSUzMyM0ludEEpICovCisJCQkJCQkvKiBCQ2xrSW4gKi8KKwkJCQkJCS8qIFJFUTFbMTowXSBHTlQxWzE6MF0gKi8KKyNlbmRpZgorCisjaWYgMCAvKiBXcm9uZz8/IE5UTCAqLworIyBkZWZpbmUgQ0ZHX01QUF9DT05UUk9MXzMJMHgwMDA5MDA2NgkvKiBHUFBbMzE6MjldIEJDbGtPdXQwICovCisJCQkJCQkvKiBHUFBbMjc6MjZdIEludFsxOjBdICovCisjZWxzZQorIyBkZWZpbmUgQ0ZHX01QUF9DT05UUk9MXzMJMHgyMjA5MDA2NiAgICAgIC8qIE1SRVEgTUdOVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR1BQWzI5XSAgICAoUENJMUludCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJDbGtPdXQwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHUFBbMjddICAgIChQQ0kwSW50KSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR1BQWzI2XSAgICAoUnRjSW50IG9yIFBDSTFJbnQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDUFVJbnRbMjU6MjRdICovCisjZW5kaWYKKworIyBkZWZpbmUgQ0ZHX1NFUklBTF9QT1JUX01VWAkweDAwMDAwMTAyCS8qIDA9aGlaICAxPU1QU0MwIDI9RVRIIDAgYW5kIDIgUk1JSSAqLworCisjaWYgMCAvKiBXcm9uZz8/IC0gTlRMICovCisjIGRlZmluZSBDRkdfR1BQX0xFVkVMX0NPTlRST0wJMHgwMDAwMDJjNgorI2Vsc2UKKyMgZGVmaW5lIENGR19HUFBfTEVWRUxfQ09OVFJPTAkweDJjNjAwMDAwCS8qIDAwMTAgMTEwMCAwMTEwIDAwMDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdwcFsyOV0gKi8KKwkJCQkJCS8qIGdwcFsyNzoyNl0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdwcFsyMjoyMV0gKi8KKworIyBkZWZpbmUgQ0ZHX1NEUkFNX0NPTkZJRwkweGQ4ZTE4MjAwCS8qIDB4NDQ4ICovCisJCQkJLyogaWRtYXMgdXNlIGJ1ZmZlciAxLDEKKwkJCQkgICBjb21tIHVzZSBidWZmZXIgMAorCQkJCSAgIHBjaSB1c2UgYnVmZmVyIDEsMQorCQkJCSAgIGNwdSB1c2UgYnVmZmVyIDAKKwkJCQkgICBub3JtYWwgbG9hZCAoc2VlIGFsc28gaWZkZWYgSFZMKQorCQkJCSAgIHN0YW5kYXJkIFNEUkFNIChzZWUgYWxzbyBpZmRlZiBSRUcpCisJCQkJICAgbm9uIHN0YWdnZXJlZCByZWZyZXNoICovCisJCQkJLyogMzE6MjYgIDI1IDIzICAyMCAxOSAxOCAxNiAqLworCQkJCS8qIDExMDExMCAwMCAxMTEgMCAgMCAgMDAgMSAqLworCQkJCS8qIHJlZnJlc2hfY291bnQ9MHgyMDAKKwkJCQkgICBwaGlzaWNhbCBpbnRlcmxlYXZpbmcgZGlzYWJsZQorCQkJCSAgIHZpcnR1YWwgaW50ZXJsZWF2aW5nIGVuYWJsZSAqLworCQkJCS8qIDE1IDE0IDEzOjAgKi8KKwkJCQkvKiAxICAwICAweDIwMCAqLworI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0RVQVJUX0lPCQlDRkdfREVWMl9TUEFDRQorI2RlZmluZSBDRkdfRFVBUlRfQ0hBTgkJMQkJLyogY2hhbm5lbCB0byB1c2UgZm9yIGNvbnNvbGUgKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfQ0hBTjEKKyNkZWZpbmUgQ0ZHX0lOSVRfQ0hBTjIKKworI2RlZmluZSBTUkFNX0JBU0UJCUNGR19ERVYwX1NQQUNFCisjZGVmaW5lIFNSQU1fU0laRQkJMHgwMDEwMDAwMAkJLyogMSBNQiBvZiBzcmFtICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUENJIHN0dWZmCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBQQ0lfSE9TVF9BREFQVEVSIDAgICAgICAgICAgICAgIC8qIGNvbmZpZ3VyZSBhciBwY2kgYWRhcHRlciAgICAgKi8KKyNkZWZpbmUgUENJX0hPU1RfRk9SQ0UgIDEgICAgICAgICAgICAgICAvKiBjb25maWd1cmUgYXMgcGNpIGhvc3QgICAgICAgICovCisjZGVmaW5lIFBDSV9IT1NUX0FVVE8gICAyICAgICAgICAgICAgICAgLyogZGV0ZWN0ZWQgdmlhIGFyYml0ZXIgZW5hYmxlICAqLworCisjZGVmaW5lIENPTkZJR19QQ0kgICAgICAgICAgICAgICAgICAgICAgLyogaW5jbHVkZSBwY2kgc3VwcG9ydCAgICAgICAgICAqLworI2RlZmluZSBDT05GSUdfUENJX0hPU1QgUENJX0hPU1RfRk9SQ0UgIC8qIHNlbGVjdCBwY2kgaG9zdCBmdW5jdGlvbiAgICAgKi8KKyNkZWZpbmUgQ09ORklHX1BDSV9QTlAgICAgICAgICAgICAgICAgICAvKiBkbyBwY2kgcGx1Zy1hbmQtcGxheSAgICAgICAgICovCisKKy8qIFBDSSBNRU1PUlkgTUFQIHNlY3Rpb24gKi8KKyNkZWZpbmUgQ0ZHX1BDSTBfTUVNX0JBU0UJMHg4MDAwMDAwMAorI2RlZmluZSBDRkdfUENJMF9NRU1fU0laRQlfMTI4TQorI2RlZmluZSBDRkdfUENJMV9NRU1fQkFTRQkweDg4MDAwMDAwCisjZGVmaW5lIENGR19QQ0kxX01FTV9TSVpFCV8xMjhNCisKKyNkZWZpbmUgQ0ZHX1BDSTBfMF9NRU1fU1BBQ0UJKENGR19QQ0kwX01FTV9CQVNFKQorI2RlZmluZSBDRkdfUENJMV8wX01FTV9TUEFDRQkoQ0ZHX1BDSTFfTUVNX0JBU0UpCisKKworCisvKiBQQ0kgSS9PIE1BUCBzZWN0aW9uICovCisjZGVmaW5lIENGR19QQ0kwX0lPX0JBU0UJMHhmYTAwMDAwMAorI2RlZmluZSBDRkdfUENJMF9JT19TSVpFCV8xNk0KKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fQkFTRQkweGZiMDAwMDAwCisjZGVmaW5lIENGR19QQ0kxX0lPX1NJWkUJXzE2TQorCisjZGVmaW5lIENGR19QQ0kwX0lPX1NQQUNFCShDRkdfUENJMF9JT19CQVNFKQorI2RlZmluZSBDRkdfUENJMF9JT19TUEFDRV9QQ0kJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9JT19TUEFDRQkoQ0ZHX1BDSTFfSU9fQkFTRSkKKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fU1BBQ0VfUENJCTB4MDAwMDAwMDAKKworLyoKKyAqIE5TMTY1NTAgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENGR19OUzE2NTUwCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUJLTQKKworI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCTM2ODY0MDAKKworI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xCShDRkdfRFVBUlRfSU8gKyAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00yCShDRkdfRFVBUlRfSU8gKyAweDIwKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluaXRpYWwgQkFUIG1hcHBpbmdzCisgKi8KKworLyogTk9URVM6CisgKiAxKSBHVUFSREVEIGFuZCBXUklURV9USFJVIG5vdCBhbGxvd2VkIGluIElCQVRTCisgKiAyKSBDQUNIRUlOSElCSVQgYW5kIFdSSVRFVEhST1VHSCBub3QgYWxsb3dlZCB0b2dldGhlciBpbiBzYW1lIEJBVAorICovCisKKy8qIFNEUkFNICovCisjZGVmaW5lIENGR19JQkFUMEwgKENGR19TRFJBTV9CQVNFIHwgQkFUTF9QUF9SVyB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDBVIChDRkdfU0RSQU1fQkFTRSB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2RlZmluZSBDRkdfREJBVDBMIChDRkdfU0RSQU1fQkFTRSB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19EQkFUMFUgQ0ZHX0lCQVQwVQorCisvKiBpbml0IHJhbSAqLworI2RlZmluZSBDRkdfSUJBVDFMICAoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRMX1BQX1JXIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUMVUgIChDRkdfSU5JVF9SQU1fQUREUiB8IEJBVFVfQkxfMTI4SyB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2RlZmluZSBDRkdfREJBVDFMICBDRkdfSUJBVDFMCisjZGVmaW5lIENGR19EQkFUMVUgIENGR19JQkFUMVUKKworLyogUENJMCwgUENJMSBpbiBvbmUgQkFUICovCisjZGVmaW5lIENGR19JQkFUMkwgQkFUTF9OT19BQ0NFU1MKKyNkZWZpbmUgQ0ZHX0lCQVQyVSBDRkdfREJBVDJVCisjZGVmaW5lIENGR19EQkFUMkwgKENGR19QQ0kwX01FTV9CQVNFIHwgQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX1BQX1JXIHwgQkFUTF9HVUFSREVEU1RPUkFHRSkKKyNkZWZpbmUgQ0ZHX0RCQVQyVSAoQ0ZHX1BDSTBfTUVNX0JBU0UgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKworLyogR1QgcmVncywgYm9vdHJvbSwgYWxsIHRoZSBkZXZpY2VzLCBQQ0kgSS9PICovCisjZGVmaW5lIENGR19JQkFUM0wgKENGR19NSVNDX1JFR0lPTl9CQVNFIHwgQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX1BQX1JXKQorI2RlZmluZSBDRkdfSUJBVDNVIChDRkdfTUlTQ19SRUdJT05fQkFTRSB8IEJBVFVfVlMgfCBCQVRVX1ZQIHwgQkFUVV9CTF8yNTZNKQorI2RlZmluZSBDRkdfREJBVDNMIChDRkdfTUlTQ19SRUdJT05fQkFTRSB8IEJBVExfQ0FDSEVJTkhJQklUIHwgQkFUTF9QUF9SVyB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19EQkFUM1UgQ0ZHX0lCQVQzVQorCisvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MgKGZvciBjb21wYXRhYmlsaXR5KSBkZWZhdWx0cyAqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECTQwMDAwMAorI2RlZmluZSBDRkdfSTJDX1NMQVZFCTB4N0YKKworLyogSTJDIGFkZHJlc3NlcyBmb3IgdGhlIHR3byBESU1NIFNQRCBjaGlwcyAqLworI2lmbmRlZiBDT05GSUdfRVZCNjQyNjBfNzUwQ1gKKyNkZWZpbmUgRElNTTBfSTJDX0FERFIJMHg1NgorI2RlZmluZSBESU1NMV9JMkNfQUREUgkweDU0CisjZWxzZSAvKiBDT05GSUdfRVZCNjQyNjBfNzUwQ1ggLSBvbmx5IGhhcyAxIERJTU0gKi8KKyNkZWZpbmUgRElNTTBfSTJDX0FERFIgIDB4NTQKKyNkZWZpbmUgRElNTTFfSTJDX0FERFIJMHg1NAorI2VuZGlmCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lCUNGR19CT09UTUFQU1oJCSg4PDwyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGTEFTSCBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTIJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTY3CS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENGR19FWFRSQV9GTEFTSF9ERVZJQ0UJREVWSUNFMwkvKiBleHRyYSBmbGFzaCBhdCBkZXZpY2UgMyAqLworI2RlZmluZSBDRkdfRVhUUkFfRkxBU0hfV0lEVEgJNAkvKiAzMiBiaXQgKi8KKworI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkxMjAwMDAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKGluIG1zKSAqLworI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAk1MDAJLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKGluIG1zKSAqLworI2RlZmluZSBDRkdfRkxBU0hfQ0ZJCQkxCisKKyNkZWZpbmUJQ0ZHX0VOVl9JU19JTl9GTEFTSAkxCisjZGVmaW5lCUNGR19FTlZfU0laRQkJMHgxMDAwCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4MTAwMDAKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSICAgIChDRkdfRkxBU0hfQkFTRStDRkdfTU9OSVRPUl9MRU4tQ0ZHX0VOVl9TRUNUX1NJWkUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENhY2hlIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEwyQ1Igc2V0dXAgLS0gbWFrZSBzdXJlIHRoaXMgaXMgcmlnaHQgZm9yIHlvdXIgYm9hcmQhCisgKiBsb29rIGluIGluY2x1ZGUvbXBjNzR4eC5oIGZvciB0aGUgZGVmaW5lcyB1c2VkIGhlcmUKKyAqLworCisjZGVmaW5lIENGR19MMgorCisjaWZkZWYgQ09ORklHXzc1MENYCisjZGVmaW5lIEwyX0lOSVQgMAorI2Vsc2UKKyNkZWZpbmUgTDJfSU5JVCAgCShMMkNSX0wyU0laXzJNIHwgTDJDUl9MMkNMS18zIHwgTDJDUl9MMlJBTV9CVVJTVCB8IFwKKwkJCUwyQ1JfTDJPSF81IHwgTDJDUl9MMkNUTCB8IEwyQ1JfTDJXVCkKKyNlbmRpZgorCisjZGVmaW5lIEwyX0VOQUJMRQkoTDJfSU5JVCB8IEwyQ1JfTDJFKQorCisvKgorICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUJQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJICAgICovCisKKyNkZWZpbmUgQ0ZHX0JPQVJEX0FTTV9JTklUICAgICAgMQorCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVVTRU5LSS5oIGIvaW5jbHVkZS9jb25maWdzL01VU0VOS0kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc2NWEzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL01VU0VOS0kuaApAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICoKKyAqIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZSBNVVNFTktJIGJvYXJkLgorICoKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBib2FyZC9jb25maWcuaCAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYm9hcmQgc3BlY2lmaWMKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworCisjZGVmaW5lIENPTkZJR19NUEM4MjRYCQkxCisjZGVmaW5lIENPTkZJR19NUEM4MjQ1CQkxCisjZGVmaW5lIENPTkZJR19NVVNFTktJCQkxCisKKworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAorI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQorCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMKQorCisvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpIAkqLworCisjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI3VuZGVmIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCisjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworCisvKiBQcmludCBCdWZmZXIgU2l6ZQorICovCisjZGVmaW5lIENGR19QQlNJWkUJKENGR19DQlNJWkUgKyBzaXplb2YoQ0ZHX1BST01QVCkgKyAxNikKKyNkZWZpbmUgQ0ZHX01BWEFSR1MJOAkJLyogTWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MDAxMDAwMDAJLyogRGVmYXVsdCBsb2FkIGFkZHJlc3MJCSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBDSSBzdHVmZgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIENPTkZJR19QQ0kgICAgICAJCS8qIGluY2x1ZGUgcGNpIHN1cHBvcnQgICAgICAgICAgKi8KKyN1bmRlZiBDT05GSUdfUENJX1BOUAorCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJCS8qIE11bHRpIGV0aGVybmV0IGNhcmRzIHN1cHBvcnQgKi8KKworI2RlZmluZSBDT05GSUdfVFVMSVAKKworI2RlZmluZSBQQ0lfRU5FVDBfSU9BRERSCQkweDgwMDAwMDAwCisjZGVmaW5lIFBDSV9FTkVUMF9NRU1BRERSCQkweDgwMDAwMDAwCisjZGVmaW5lIFBDSV9FTkVUMV9JT0FERFIJCTB4ODEwMDAwMDAKKyNkZWZpbmUgUENJX0VORVQxX01FTUFERFIJCTB4ODEwMDAwMDAKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFydCBhZGRyZXNzZXMgZm9yIHRoZSBmaW5hbCBtZW1vcnkgY29uZmlndXJhdGlvbgorICogKFNldCB1cCBieSB0aGUgc3RhcnR1cCBjb2RlKQorICogUGxlYXNlIG5vdGUgdGhhdCBDRkdfU0RSQU1fQkFTRSBfbXVzdF8gc3RhcnQgYXQgMAorICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCSAgICAweDAwMDAwMDAwCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UwX1BSRUxJTSAgICAgIDB4RkY4MDAwMDAgICAgICAvKiBGTEFTSCBiYW5rIG9uIFJDUyMwICovCisjZGVmaW5lIENGR19GTEFTSF9CQVNFMV9QUkVMSU0gICAgICAweEZGMDAwMDAwICAgICAgLyogRkxBU0ggYmFuayBvbiBSQ1MjMSAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRSAgQ0ZHX0ZMQVNIX0JBU0UwX1BSRUxJTQorCisvKiBldmVuIHRob3VnaCBGTEFTSFBfQkFTRSBpcyBGRjgwMDAwMCwgd2l0aCA0TUIgaXMgUkNTMCwgdGhlCisgKiByZXNldCB2ZWN0b3IgaXMgYWN0dWFsbHkgbG9jYXRlZCBhdCBGRkIwMDEwMCwgYnV0IHRoZSA4MjQ1CisgKiB0YWtlcyBjYXJlIG9mIHVzLgorICovCisjZGVmaW5lIENGR19SRVNFVF9BRERSRVNTICAgMHhGRkYwMDEwMAorCisjZGVmaW5lIENGR19FVU1CX0FERFIJICAgIDB4RkMwMDAwMDAKKworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFICAgIFRFWFRfQkFTRQorI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JICAgICgyNTYgPDwgMTApIC8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCSAgICAoMTI4IDw8IDEwKSAvKiBSZXNlcnZlIDEyOCBrQiBmb3IgbWFsbG9jKCkJKi8KKworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVCAgIDB4MDAwMDQwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkJKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECSAgICAweDAyMDAwMDAwCS8qIDAgLi4uIDMyIE1CIGluIERSQU0JCSovCisKKwkvKiBNYXhpbXVtIGFtb3VudCBvZiBSQU0uCisJICovCisjZGVmaW5lIENGR19NQVhfUkFNX1NJWkUgICAgMHgwODAwMDAwMAkvKiAwIC4uIDEyOCBNQiBvZiAoUylEUkFNICovCisKKworI2lmIENGR19NT05JVE9SX0JBU0UgPj0gQ0ZHX0ZMQVNIX0JBU0UKKyN1bmRlZiBDRkdfUkFNQk9PVAorI2Vsc2UKKyNkZWZpbmUgQ0ZHX1JBTUJPT1QKKyNlbmRpZgorCisvKgorICogTlMxNjU1MCBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUJMQorCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJZ2V0X2J1c19mcmVxKDApCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkoQ0ZHX0VVTUJfQUREUiArIDB4NDUwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMgkoQ0ZHX0VVTUJfQUREUiArIDB4NDYwMCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbnMgZm9yIGluaXRpYWwgc3RhY2sgcG9pbnRlciBhbmQgZGF0YSBhcmVhCisgKi8KKworLyogI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFICAgICAgICBURVhUX0JBU0UgKi8KKy8qI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRSAgICAyNTYqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRSAgICAgIDEyOAorI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUiAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5EICAgICAgMHgxMDAwCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQgIChDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisKKworLyoKKyAqIExvdyBMZXZlbCBDb25maWd1cmF0aW9uIFNldHRpbmdzCisgKiAoYWRkcmVzcyBtYXBwaW5ncywgcmVnaXN0ZXIgaW5pdGlhbCB2YWx1ZXMsIGV0Yy4pCisgKiBZb3Ugc2hvdWxkIGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIGlmIHlvdSBtYWtlIGNoYW5nZXMgaGVyZS4KKyAqIEZvciB0aGUgZGV0YWlsIGRlc2NyaXB0aW9uIHJlZmVyIHRvIHRoZSBNUEM4MjQwIHVzZXIncyBtYW51YWwuCisgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRICAzMzMzMzMzMwkvKiBleHRlcm5hbCBmcmVxdWVuY3kgdG8gcGxsICovCisjZGVmaW5lIENGR19IWgkJICAgICAxMDAwCisKKwkvKiBCaXQtZmllbGQgdmFsdWVzIGZvciBNQ0NSMS4KKwkgKi8KKyNkZWZpbmUgQ0ZHX1JPTU5BTAkgICAgNworI2RlZmluZSBDRkdfUk9NRkFMCSAgICAxMQorI2RlZmluZSBDRkdfREJVU19TSVpFICAgICAgIDB4MworCisJLyogQml0LWZpZWxkIHZhbHVlcyBmb3IgTUNDUjIuCisJICovCisjZGVmaW5lIENGR19UU1dBSVQJICAgIDB4NQkJICAgIC8qIFRyYW5zYWN0aW9uIFN0YXJ0IFdhaXQgU3RhdGVzIHRpbWVyICovCisjZGVmaW5lIENGR19SRUZJTlQJICAgIDB4NDAwCSAgICAvKiBSZWZyZXNoIGludGVydmFsCUZJWE1FOiB3YXMgMHQ0MzAJCSovCisKKwkvKiBCdXJzdCBUbyBQcmVjaGFyZ2UuIEJpdHMgb2YgdGhpcyB2YWx1ZSBnbyB0byBNQ0NSMyBhbmQgTUNDUjQuCisJICovCisjZGVmaW5lIENGR19CU1RPUFJFCSAgICAxMjEKKworCS8qIEJpdC1maWVsZCB2YWx1ZXMgZm9yIE1DQ1IzLgorCSAqLworI2RlZmluZSBDRkdfUkVGUkVDCSAgICA4CSAgICAvKiBSZWZyZXNoIHRvIGFjdGl2YXRlIGludGVydmFsICovCisKKwkvKiBCaXQtZmllbGQgdmFsdWVzIGZvciBNQ0NSNC4KKwkgKi8KKyNkZWZpbmUgQ0ZHX1BSRVRPQUNUCSAgICAzCSAgICAvKiBQcmVjaGFyZ2UgdG8gYWN0aXZhdGUgaW50ZXJ2YWwgRklYTUU6IHdhcyAyCSovCisjZGVmaW5lIENGR19BQ1RUT1BSRQkgICAgNQkgICAgLyogQWN0aXZhdGUgdG8gUHJlY2hhcmdlIGludGVydmFsIEZJWE1FOiB3YXMgNQkqLworI2RlZmluZSBDRkdfQUNUT1JXCSAgICAzCQkvKiBGSVhNRSB3YXMgMiAqLworI2RlZmluZSBDRkdfU0RNT0RFX0NBU19MQVQgIDMJICAgIC8qIFNETU9ERSBDQVMgbGF0YW5jeSAqLworI2RlZmluZSBDRkdfU0RNT0RFX1dSQVAJICAgIDAJICAgIC8qIFNETU9ERSB3cmFwIHR5cGUJKi8KKyNkZWZpbmUgQ0ZHX1JFR0lTVEVSRF9UWVBFX0JVRkZFUiAxCisjZGVmaW5lIENGR19FWFRST00JICAgIDEKKyNkZWZpbmUgQ0ZHX1JFR0RJTU0JICAgIDAKKworI2RlZmluZSBDRkdfUEdNQVggICAgICAgICAgIDB4MzIgLyogaG93IGxvbmcgdGhlIDgyNDAgcmVhdGlucyB0aGUgY3VycmVudGx5IGFjY2Vzc2VkIHBhZ2UgaW4gbWVtb3J5IEZJWE1FOiB3YXMgMHgzMiovCisKKyNkZWZpbmUgQ0ZHX1NEUkFNX0RTQ0QJMHgyMAkvKiBTRFJBTSBkYXRhIGluIHNhbXBsZSBjbG9jayBkZWxheSAtIG5vdGUgYm90dG9tIDMgYml0cyBNVVNUIGJlIDAgKi8KKworLyogTWVtb3J5IGJhbmsgc2V0dGluZ3MuCisgKiBPbmx5IGJpdHMgMjAtMjkgYXJlIGFjdHVhbGx5IHVzZWQgZnJvbSB0aGVzZSB2YWxlcyB0byBzZXQgdGhlCisgKiBzdGFydC9lbmQgYWRkcmVzc2VzLiBUaGUgdXBwZXIgdHdvIGJpdHMgd2lsbCBhbHdheXMgYmUgMCwgYW5kIHRoZSBsb3dlcgorICogMjAgYml0cyB3aWxsIGJlIDB4MDAwMDAgZm9yIGEgc3RhcnQgYWRkcmVzcywgb3IgMHhmZmZmZiBmb3IgYW4gZW5kCisgKiBhZGRyZXNzLiBSZWZlciB0byB0aGUgTVBDODI0MCBib29rLgorICovCisKKyNkZWZpbmUgQ0ZHX0JBTkswX1NUQVJUCSAgICAweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LMF9FTkQJICAgIChDRkdfTUFYX1JBTV9TSVpFIC0gMSkKKyNkZWZpbmUgQ0ZHX0JBTkswX0VOQUJMRSAgICAxCisjZGVmaW5lIENGR19CQU5LMV9TVEFSVAkgICAgMHgzZmYwMDAwMAorI2RlZmluZSBDRkdfQkFOSzFfRU5ECSAgICAweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LMV9FTkFCTEUgICAgMAorI2RlZmluZSBDRkdfQkFOSzJfU1RBUlQJICAgIDB4M2ZmMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTksyX0VORAkgICAgMHgzZmZmZmZmZgorI2RlZmluZSBDRkdfQkFOSzJfRU5BQkxFICAgIDAKKyNkZWZpbmUgQ0ZHX0JBTkszX1NUQVJUCSAgICAweDNmZjAwMDAwCisjZGVmaW5lIENGR19CQU5LM19FTkQJICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0JBTkszX0VOQUJMRSAgICAwCisjZGVmaW5lIENGR19CQU5LNF9TVEFSVAkgICAgMHgzZmYwMDAwMAorI2RlZmluZSBDRkdfQkFOSzRfRU5ECSAgICAweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LNF9FTkFCTEUgICAgMAorI2RlZmluZSBDRkdfQkFOSzVfU1RBUlQJICAgIDB4M2ZmMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks1X0VORAkgICAgMHgzZmZmZmZmZgorI2RlZmluZSBDRkdfQkFOSzVfRU5BQkxFICAgIDAKKyNkZWZpbmUgQ0ZHX0JBTks2X1NUQVJUCSAgICAweDNmZjAwMDAwCisjZGVmaW5lIENGR19CQU5LNl9FTkQJICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0JBTks2X0VOQUJMRSAgICAwCisjZGVmaW5lIENGR19CQU5LN19TVEFSVAkgICAgMHgzZmYwMDAwMAorI2RlZmluZSBDRkdfQkFOSzdfRU5ECSAgICAweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LN19FTkFCTEUgICAgMAorCisjZGVmaW5lIENGR19PRENSCSAgICAweGZmCisKKyNkZWZpbmUgQ0ZHX0lCQVQwTCAgKENGR19TRFJBTV9CQVNFIHwgQkFUTF9QUF8xMCB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDBVICAoQ0ZHX1NEUkFNX0JBU0UgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKworI2RlZmluZSBDRkdfSUJBVDFMICAoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRMX1BQXzEwIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUMVUgIChDRkdfSU5JVF9SQU1fQUREUiB8IEJBVFVfQkxfMTI4SyB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19JQkFUMkwgICgweDgwMDAwMDAwIHwgQkFUTF9QUF8xMCB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDJVICAoMHg4MDAwMDAwMCB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19JQkFUM0wgICgweEYwMDAwMDAwIHwgQkFUTF9QUF8xMCB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDNVICAoMHhGMDAwMDAwMCB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19EQkFUMEwgIENGR19JQkFUMEwKKyNkZWZpbmUgQ0ZHX0RCQVQwVSAgQ0ZHX0lCQVQwVQorI2RlZmluZSBDRkdfREJBVDFMICBDRkdfSUJBVDFMCisjZGVmaW5lIENGR19EQkFUMVUgIENGR19JQkFUMVUKKyNkZWZpbmUgQ0ZHX0RCQVQyTCAgQ0ZHX0lCQVQyTAorI2RlZmluZSBDRkdfREJBVDJVICBDRkdfSUJBVDJVCisjZGVmaW5lIENGR19EQkFUM0wgIENGR19JQkFUM0wKKyNkZWZpbmUgQ0ZHX0RCQVQzVSAgQ0ZHX0lCQVQzVQorCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCSAgICAoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGTEFTSCBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTIJLyogTWF4IG51bWJlciBvZiBmbGFzaCBiYW5rcwkJKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTY0CS8qIE1heCBudW1iZXIgb2Ygc2VjdG9ycyBwZXIgZmxhc2gJKi8KKworI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkxMjAwMDAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKGluIG1zKSAqLworI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAk1MDAJLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKGluIG1zKSAqLworCisKKwkvKiBXYXJpbmluZzogZW52aXJvbm1lbnQgaXMgbm90IEVNQkVEREVEIGluIHRoZSBVLUJvb3QgY29kZS4KKwkgKiBJdCdzIHN0b3JlZCBpbiBmbGFzaCBzZXBhcmF0ZWx5LgorCSAqLworI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICSAgICAxCisjZGVmaW5lIENGR19FTlZfQUREUgkJMHhGRkZGMDAwMAorI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MDAwMTAwMDAgLyogU2l6ZSBvZiB0aGUgRW52aXJvbm1lbnQJCSovCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4MjAwMDAgLyogU2l6ZSBvZiB0aGUgRW52aXJvbm1lbnQgU2VjdG9yCSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENhY2hlIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLworI2VuZGlmCisKKy8qCisgKiBJbnRlcm5hbCBEZWZpbml0aW9ucworICoKKyAqIEJvb3QgRmxhZ3MKKyAqLworI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CQkJKi8KKworCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVZTMS5oIGIvaW5jbHVkZS9jb25maWdzL01WUzEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTBmYThmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL01WUzEuaApAQCAtMCwwICsxLDQwNiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogYm9hcmQvY29uZmlnLmggLSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGJvYXJkIHNwZWNpZmljCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKworI2RlZmluZSBDT05GSUdfTVBDODIzCQkxCS8qIFRoaXMgaXMgYSBNUEM4MjMgQ1BVCQkqLworI2RlZmluZSBDT05GSUdfTVZTCQkxCS8qIC4uLm9uIGEgTVZzZW5zb3IgbW9kdWxlCSovCisjZGVmaW5lIENPTkZJR19NVlNfMTZCSVRfRkxBU0gJCS8qIC4uLndpdGggMTYtYml0IGZsYXNoIGFjY2VzcwkqLworI2RlZmluZSBDT05GSUdfOHh4X0dDTEtfRlJFUQk1MDAwMDAwMC8qIC4uLiBhbmQgYSA1MCBNSHogQ1BVCQkqLworCisjZGVmaW5lCUNPTkZJR19DTE9DS1NfSU5fTUhaCTEJLyogY2xvY2tzIHBhc3NzZWQgdG8gTGludXggaW4gTUh6ICovCisKKyN1bmRlZglDT05GSUdfOHh4X0NPTlNfU01DMQkJLyogQ29uc29sZSBpcyAqTk9UKiBvbiBTTUMxCSovCisjZGVmaW5lCUNPTkZJR184eHhfQ09OU19TTUMyCTEJLyogQ29uc29sZSBpcyBvbiBTTUMyCQkqLworI3VuZGVmCUNPTkZJR184eHhfQ09OU19OT05FCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCS8qIGNvbnNvbGUgYmF1ZHJhdGUgCQkqLworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgdGhpcyBtYW55IHNlY29uZHMJKi8KKworI2RlZmluZSBDT05GSUdfUFJFQk9PVAkJImVjaG87ZWNobyBUbyBtb3VudCByb290IG92ZXIgTkZTIHVzZSBcInJ1biBib290bmV0XCI7ZWNobyBUbyBtb3VudCByb290IGZyb20gRkxBU0ggdXNlICBcInJ1biBib290Zmxhc2hcIjtlY2hvIgorI2RlZmluZQlDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvbXRkYmxvY2syIHJ3IgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJCQkJCQlcCisgICAgImJvb3RwOyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlcCisgICAgInNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3IG5mc3Jvb3Q9JChzZXJ2ZXJpcCk6JChyb290cGF0aCkgIiBcCisgICAgImlwPSQoaXBhZGRyKTokKHNlcnZlcmlwKTokKGdhdGV3YXlpcCk6JChuZXRtYXNrKTokKGhvc3RuYW1lKTo6b2ZmOyAiICAgXAorICAgICJib290bSIKKworI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLworI3VuZGVmCUNGR19MT0FEU19CQVVEX0NIQU5HRQkJLyogZG9uJ3QgYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCisKKyNkZWZpbmUJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQvZW5hYmxlZAkqLworCisjdW5kZWYJQ09ORklHX1NUQVRVU19MRUQJCS8qIFN0YXR1cyBMRUQgZGlzYWJsZWQvZW5hYmxlZAkqLworCisjdW5kZWYgIENPTkZJR19DQU5fRFJJVkVSICAgICAgIC8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZCAgKi8KKworI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfVkVORE9SRVggKQorCisjdW5kZWYgQ09ORklHX01BQ19QQVJUSVRJT04KKyN1bmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgorCisjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLworCisvKiBNVnNlbnNvciB1c2VzIGEgcmVhbGx5IG1pbmltYWwgVS1Cb290ICEgKi8KKyNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ0ZHX0NNRF9MT0FEUwl8IFwKKwkJCQlDRkdfQ01EX0xPQURCCXwgXAorCQkJCUNGR19DTURfSU1JCXwgXAorCQkJCUNGR19DTURfRkxBU0gJfCBcCisJCQkJQ0ZHX0NNRF9NRU1PUlkJfCBcCisJCQkJQ0ZHX0NNRF9ORVQJfCBcCisJCQkJQ0ZHX0NNRF9ESENQCXwgXAorCQkJCUNGR19DTURfRU5WCXwgXAorCQkJCUNGR19DTURfQk9PVEQJfCBcCisJCQkJQ0ZHX0NNRF9SVU4JKQorCisvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCisjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyN1bmRlZglDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUJQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworCisjdW5kZWYgIENGR19IVVNIX1BBUlNFUgkJCS8qIEh1c2ggcGFyc2UgZm9yIFUtQm9vdCA/PyAqLworI2lmZGVmICBDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAgICAgIj4gIgorI2VuZGlmCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZWxzZQorI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbmRpZgorI2RlZmluZQlDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUJQ0ZHX01BWEFSR1MJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDA0MDAwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MEMwMDAwMAkvKiA0IC4uLiAxMiBNQiBpbiBEUkFNCSovCisKKyNkZWZpbmUJQ0ZHX0xPQURfQUREUgkJMHgxMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MJKi8KKworI2RlZmluZQlDRkdfSFoJCTEwMDAJCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MJKi8KKworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorCisvKgorICogTG93IExldmVsIENvbmZpZ3VyYXRpb24gU2V0dGluZ3MKKyAqIChhZGRyZXNzIG1hcHBpbmdzLCByZWdpc3RlciBpbml0aWFsIHZhbHVlcywgZXRjLikKKyAqIFlvdSBzaG91bGQga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgaWYgeW91IG1ha2UgY2hhbmdlcyBoZXJlLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbnRlcm5hbCBNZW1vcnkgTWFwcGVkIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQ0ZHX0lNTVIJCTB4RkZGMDAwMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbnMgZm9yIGluaXRpYWwgc3RhY2sgcG9pbnRlciBhbmQgZGF0YSBhcmVhIChpbiBEUFJBTSkKKyAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUglDRkdfSU1NUgorI2RlZmluZQlDRkdfSU5JVF9SQU1fRU5ECTB4MkYwMAkvKiBFbmQgb2YgdXNlZCBhcmVhIGluIERQUkFNCSovCisjZGVmaW5lCUNGR19HQkxfREFUQV9TSVpFCTY0ICAvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorI2RlZmluZQlDRkdfSU5JVF9TUF9PRkZTRVQJQ0ZHX0dCTF9EQVRBX09GRlNFVAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFydCBhZGRyZXNzZXMgZm9yIHRoZSBmaW5hbCBtZW1vcnkgY29uZmlndXJhdGlvbgorICogKFNldCB1cCBieSB0aGUgc3RhcnR1cCBjb2RlKQorICogUGxlYXNlIG5vdGUgdGhhdCBDRkdfU0RSQU1fQkFTRSBfbXVzdF8gc3RhcnQgYXQgMAorICovCisjZGVmaW5lCUNGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweDQwMDAwMDAwCisKKyNkZWZpbmUJQ0ZHX01PTklUT1JfTEVOCQkoMTI4IDw8IDEwKQkvKiBSZXNlcnZlIDE5MiBrQiBmb3IgTW9uaXRvcgkqLworCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJQ0ZHX0ZMQVNIX0JBU0UKKyNkZWZpbmUJQ0ZHX01BTExPQ19MRU4JCSgxMjggPDwgMTApCS8qIFJlc2VydmUgMTI4IGtCIGZvciBtYWxsb2MoKQkqLworCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZQlDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eAkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGTEFTSCBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJCSovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAk3MQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKGZvciBBTUQzMjBEQiBjaGlwKQkqLworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpCSovCisKKyNkZWZpbmUJQ0ZHX0VOVl9JU19JTl9GTEFTSAkxCisKKy8qIDRNQiBmbGFzaCAtIHVzZSBib3R0b20gc2VjdG9ycyBvZiBhIGJvdHRvbSBib290IHNlY3RvciBmbGFzaCAoMTYgYml0IGFjY2VzcykgKi8KKyNkZWZpbmUJQ0ZHX0VOVl9PRkZTRVQJCTB4ODAwMAkvKiBPZmZzZXQgb2YgRW52aXJvbm1lbnQgU2VjdG9yCShib3R0b20gYm9vdCBzZWN0b3IpICovCisjZGVmaW5lCUNGR19FTlZfU0laRQkJMHgyMDAwCS8qIFVzZWQgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgOGsJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2FjaGUgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTWVBDUiAtIFN5c3RlbSBQcm90ZWN0aW9uIENvbnRyb2wJCQkJMTEtOQorICogU1lQQ1IgY2FuIG9ubHkgYmUgd3JpdHRlbiBvbmNlIGFmdGVyIHJlc2V0IQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU29mdHdhcmUgJiBCdXMgTW9uaXRvciBUaW1lciBtYXgsIEJ1cyBNb25pdG9yIGVuYWJsZSwgU1cgV2F0Y2hkb2cgZnJlZXplCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKyNkZWZpbmUgQ0ZHX1NZUENSICAgKFNZUENSX1NXVEMgfCBTWVBDUl9CTVQgfCBTWVBDUl9CTUUgfCBTWVBDUl9TV0YgfCBcCisgICAgICAgICAgICAgU1lQQ1JfU1dFICB8IFNZUENSX1NXUkl8IFNZUENSX1NXUCkKKyNlbHNlCisjZGVmaW5lIENGR19TWVBDUiAgIChTWVBDUl9TV1RDIHwgU1lQQ1JfQk1UIHwgU1lQQ1JfQk1FIHwgU1lQQ1JfU1dGIHwgU1lQQ1JfU1dQKQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNJVU1DUiAtIFNJVSBNb2R1bGUgQ29uZmlndXJhdGlvbgkJCQkxMS02CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQQ01DSUEgY29uZmlnLiwgbXVsdGktZnVuY3Rpb24gcGluIHRyaS1zdGF0ZQorICovCisjZGVmaW5lIENGR19TSVVNQ1IgIChTSVVNQ1JfREJHQzAwIHwgU0lVTUNSX0RCUEMwMCB8IFNJVU1DUl9NTFJDMDEpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRCU0NSIC0gVGltZSBCYXNlIFN0YXR1cyBhbmQgQ29udHJvbAkJCQkxMS0yNgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2xlYXIgUmVmZXJlbmNlIEludGVycnVwdCBTdGF0dXMsIFRpbWViYXNlIGZyZWV6aW5nIGVuYWJsZWQKKyAqLworI2RlZmluZSBDRkdfVEJTQ1IJKFRCU0NSX1JFRkEgfCBUQlNDUl9SRUZCIHwgVEJTQ1JfVEJGKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSVENTQyAtIFJlYWwtVGltZSBDbG9jayBTdGF0dXMgYW5kIENvbnRyb2wgUmVnaXN0ZXIJCTExLTI3CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgQ0ZHX1JUQ1NDCShSVENTQ19TRUMgfCBSVENTQ19BTFIgfCBSVENTQ19SVEZ8IFJUQ1NDX1JURSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUElTQ1IgLSBQZXJpb2RpYyBJbnRlcnJ1cHQgU3RhdHVzIGFuZCBDb250cm9sCQkxMS0zMQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2xlYXIgUGVyaW9kaWMgSW50ZXJydXB0IFN0YXR1cywgSW50ZXJydXB0IFRpbWVyIGZyZWV6aW5nIGVuYWJsZWQKKyAqLworI2RlZmluZSBDRkdfUElTQ1IJKFBJU0NSX1BTIHwgUElTQ1JfUElURikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUExQUkNSIC0gUExMLCBMb3ctUG93ZXIsIGFuZCBSZXNldCBDb250cm9sIFJlZ2lzdGVyCQkxNS0zMAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVzZXQgUExMIGxvY2sgc3RhdHVzIHN0aWNreSBiaXQsIHRpbWVyIGV4cGlyZWQgc3RhdHVzIGJpdCBhbmQgdGltZXIKKyAqIGludGVycnVwdCBzdGF0dXMgYml0CisgKgorICovCisjZGVmaW5lIENGR19QTFBSQ1IJKFBMUFJDUl9TUExTUyB8IFBMUFJDUl9URVhQUyB8IFBMUFJDUl9UTUlTVCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU0NDUiAtIFN5c3RlbSBDbG9jayBhbmQgcmVzZXQgQ29udHJvbCBSZWdpc3RlcgkJMTUtMjcKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNldCBjbG9jayBvdXRwdXQsIHRpbWViYXNlIGFuZCBSVEMgc291cmNlIGFuZCBkaXZpZGVyLAorICogcG93ZXIgbWFuYWdlbWVudCBhbmQgc29tZSBvdGhlciBpbnRlcm5hbCBjbG9ja3MKKyAqLworI2RlZmluZSBTQ0NSX01BU0sJU0NDUl9FQkRGMTEKKyNkZWZpbmUgQ0ZHX1NDQ1IJKFNDQ1JfVEJTICAgICB8IFwKKwkJCSBTQ0NSX0NPTTAwICAgfCBTQ0NSX0RGU1lOQzAwIHwgU0NDUl9ERkJSRzAwICB8IFwKKwkJCSBTQ0NSX0RGTkwwMDAgfCBTQ0NSX0RGTkgwMDAgIHwgU0NDUl9ERkxDRDAwMCB8IFwKKwkJCSBTQ0NSX0RGQUxDRDAwKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQQ01DSUEgc3R1ZmYKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNkZWZpbmUgQ0ZHX1BDTUNJQV9NRU1fQUREUgkoMHhFMDAwMDAwMCkKKyNkZWZpbmUgQ0ZHX1BDTUNJQV9NRU1fU0laRQkoIDY0IDw8IDIwICkKKyNkZWZpbmUgQ0ZHX1BDTUNJQV9ETUFfQUREUgkoMHhFNDAwMDAwMCkKKyNkZWZpbmUgQ0ZHX1BDTUNJQV9ETUFfU0laRQkoIDY0IDw8IDIwICkKKyNkZWZpbmUgQ0ZHX1BDTUNJQV9BVFRSQl9BRERSCSgweEU4MDAwMDAwKQorI2RlZmluZSBDRkdfUENNQ0lBX0FUVFJCX1NJWkUJKCA2NCA8PCAyMCApCisjZGVmaW5lIENGR19QQ01DSUFfSU9fQUREUgkoMHhFQzAwMDAwMCkKKyNkZWZpbmUgQ0ZHX1BDTUNJQV9JT19TSVpFCSggNjQgPDwgMjAgKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJREUvQVRBIHN0dWZmIChTdXBwb3J0cyBJREUgaGFyZGRpc2sgb24gUENNQ0lBIEFkYXB0ZXIpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZQlDT05GSUdfSURFX1BDQ0FSRAkwCS8qICoqRE9OJ1QqKiBVc2UgSURFIHdpdGggUEMgQ2FyZCBBZGFwdGVyCSovCisKKyN1bmRlZglDT05GSUdfSURFX1BDTUNJQQkJLyogRGlyZWN0IElERSAgICBub3Qgc3VwcG9ydGVkCSovCisjdW5kZWYJQ09ORklHX0lERV9MRUQJCQkvKiBMRUQgICBmb3IgaWRlIG5vdCBzdXBwb3J0ZWQJKi8KKyN1bmRlZglDT05GSUdfSURFX1JFU0VUCQkvKiByZXNldCBmb3IgaWRlIG5vdCBzdXBwb3J0ZWQJKi8KKworI2RlZmluZSBDRkdfSURFX01BWEJVUwkJMAkvKiBtYXguIG5vLiBvZiBJREUgYnVzZXMJCQkqLworI2RlZmluZSBDRkdfSURFX01BWERFVklDRQkwCS8qIG1heC4gbm8uIG9mIGRyaXZlcyBwZXIgSURFIGJ1cwkqLworCisKKyNkZWZpbmUgQ0ZHX0FUQV9JREUwX09GRlNFVAkweDAwMDAKKworI2RlZmluZSBDRkdfQVRBX0JBU0VfQUREUglDRkdfUENNQ0lBX01FTV9BRERSCisKKy8qIE9mZnNldCBmb3IgZGF0YSBJL08JCQkqLworI2RlZmluZSBDRkdfQVRBX0RBVEFfT0ZGU0VUCShDRkdfUENNQ0lBX01FTV9TSVpFICsgMHgzMjApCisKKy8qIE9mZnNldCBmb3Igbm9ybWFsIHJlZ2lzdGVyIGFjY2Vzc2VzCSovCisjZGVmaW5lIENGR19BVEFfUkVHX09GRlNFVAkoMiAqIENGR19QQ01DSUFfTUVNX1NJWkUgKyAweDMyMCkKKworLyogT2Zmc2V0IGZvciBhbHRlcm5hdGUgcmVnaXN0ZXJzCSovCisjZGVmaW5lIENGR19BVEFfQUxUX09GRlNFVAkweDAxMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKy8qI2RlZmluZQlDRkdfREVSCTB4MjAwMjAwMEYqLworI2RlZmluZSBDRkdfREVSCTAKKworLyoKKyAqIEluaXQgTWVtb3J5IENvbnRyb2xsZXI6CisgKgorICogQlIwLzEgYW5kIE9SMC8xIChGTEFTSCkKKyAqLworCisjZGVmaW5lIEZMQVNIX0JBU0UwX1BSRUxJTQkweDQwMDAwMDAwCS8qIEZMQVNIIGJhbmsgIzAJKi8KKyN1bmRlZiBGTEFTSF9CQVNFMV9QUkVMSU0KKworLyogdXNlZCB0byByZS1tYXAgRkxBU0ggYm90aCB3aGVuIHN0YXJ0aW5nIGZyb20gU1JBTSBvciBGTEFTSDoKKyAqIHJlc3RyaWN0IGFjY2VzcyBlbm91Z2ggdG8ga2VlcCBTUkFNIHdvcmtpbmcgKGlmIGFueSkKKyAqIGJ1dCBub3QgdG9vIG11Y2ggdG8gbWVkZGxlIHdpdGggRkxBU0ggYWNjZXNzZXMKKyAqLworI2RlZmluZSBDRkdfUkVNQVBfT1JfQU0JCTB4ODAwMDAwMDAJLyogT1IgYWRkciBtYXNrICovCisjZGVmaW5lIENGR19QUkVMSU1fT1JfQU0JMHhFMDAwMDAwMAkvKiBPUiBhZGRyIG1hc2sgKi8KKworCisvKgorICogRkxBU0ggdGltaW5nOgorICovCisvKiA1MCBNSHogQ1BVIC0gNTAgTUh6IGJ1czogQUNTID0gMDAsIFRSTFggPSAxLCBDU05UID0gMSwgU0NZID0gMiwgRUhUUiA9IDEgKi8KKyNkZWZpbmUgQ0ZHX09SX1RJTUlOR19GTEFTSAkoT1JfQUNTX0RJVjEgIHwgT1JfVFJMWCB8IE9SX0NTTlRfU0FNIHwgXAorCQkJCSBPUl9TQ1lfMl9DTEsgfCBPUl9FSFRSIHwgT1JfQkkpCisvKiBGTEFTSCB0aW1pbmc6IEFDUyA9IDExLCBUUkxYID0gMCwgQ1NOVCA9IDEsIFNDWSA9IDUsIEVIVFIgPSAxCSovCisvKgorI2RlZmluZSBDRkdfT1JfVElNSU5HX0ZMQVNICShPUl9DU05UX1NBTSAgfCBPUl9BQ1NfRElWMiB8IE9SX0JJIHwgXAorCQkJCSBPUl9TQ1lfNV9DTEsgfCBPUl9FSFRSKQorKi8KKworI2RlZmluZSBDRkdfT1IwX1JFTUFQCShDRkdfUkVNQVBfT1JfQU0gIHwgQ0ZHX09SX1RJTUlOR19GTEFTSCkKKyNkZWZpbmUgQ0ZHX09SMF9QUkVMSU0JKENGR19QUkVMSU1fT1JfQU0gfCBDRkdfT1JfVElNSU5HX0ZMQVNIKQorI2lmZGVmIENPTkZJR19NVlNfMTZCSVRfRkxBU0gKKyNkZWZpbmUgQ0ZHX0JSMF9QUkVMSU0JKChGTEFTSF9CQVNFMF9QUkVMSU0gJiBCUl9CQV9NU0spIHwgQlJfUFNfMTYgfCBCUl9WICkKKyNlbHNlCisjZGVmaW5lIENGR19CUjBfUFJFTElNCSgoRkxBU0hfQkFTRTBfUFJFTElNICYgQlJfQkFfTVNLKSB8IEJSX1BTXzMyIHwgQlJfViApCisjZW5kaWYKKworI3VuZGVmIENGR19PUjFfUkVNQVAKKyN1bmRlZiBDRkdfT1IxX1BSRUxJTQorI3VuZGVmIENGR19CUjFfUFJFTElNCisvKgorICogQlIyLzMgYW5kIE9SMi8zIChTRFJBTSkKKyAqCisgKi8KKyNkZWZpbmUgU0RSQU1fQkFTRTJfUFJFTElNCTB4MDAwMDAwMDAJLyogU0RSQU0gYmFuayAjMAkqLworI3VuZGVmIFNEUkFNX0JBU0UzX1BSRUxJTQorI2RlZmluZQlTRFJBTV9NQVhfU0laRQkJMHgwNDAwMDAwMAkvKiBtYXggNjQgTUIgcGVyIGJhbmsJKi8KKworLyogU0RSQU0gdGltaW5nOiBNdWx0aXBsZXhlZCBhZGRyZXNzZXMsIEdQTDUgb3V0cHV0IHRvIEdQTDVfQSAoZG9uJ3QgY2FyZSkJKi8KKyNkZWZpbmUgQ0ZHX09SX1RJTUlOR19TRFJBTQkweDAwMDAwQTAwCisKKyNkZWZpbmUgQ0ZHX09SMl9QUkVMSU0JKENGR19QUkVMSU1fT1JfQU0gfCBDRkdfT1JfVElNSU5HX1NEUkFNICkKKyNkZWZpbmUgQ0ZHX0JSMl9QUkVMSU0JKChTRFJBTV9CQVNFMl9QUkVMSU0gJiBCUl9CQV9NU0spIHwgQlJfTVNfVVBNQSB8IEJSX1YgKQorCisjdW5kZWYgQ0ZHX09SM19QUkVMSU0KKyN1bmRlZiBDRkdfQlIzX1BSRUxJTQorCisKKy8qCisgKiBNZW1vcnkgUGVyaW9kaWMgVGltZXIgUHJlc2NhbGVyCisgKgorICogVGhlIERpdmlkZXIgZm9yIFBUQSAocmVmcmVzaCB0aW1lcikgY29uZmlndXJhdGlvbiBpcyBiYXNlZCBvbiBhbgorICogZXhhbXBsZSBTRFJBTSBjb25maWd1cmF0aW9uICg2NCBNQml0LCBvbmUgYmFuaykuIFRoZSBhZGp1c3RtZW50IHRvCisgKiB0aGUgbnVtYmVyIG9mIGNoaXAgc2VsZWN0cyAoTkNTKSBhbmQgdGhlIGFjdHVhbGx5IG5lZWRlZCByZWZyZXNoCisgKiByYXRlIGlzIGRvbmUgYnkgc2V0dGluZyBNUFRQUi4KKyAqCisgKiBQVEEgaXMgY2FsY3VsYXRlZCBmcm9tCisgKglQVEEgPSAoZ2NsayAqIFRyZWZyZXNoKSAvICgoMiBeICgyICogREZCUkcpKSAqIFBUUCAqIE5DUykKKyAqCisgKglnY2xrCSAgQ1BVIGNsb2NrIChub3QgYnVzIGNsb2NrISkKKyAqCVRyZWZyZXNoICBSZWZyZXNoIGN5Y2xlICogNCAoZm91ciB3b3JkIGJ1cnN0cyB1c2VkKQorICoKKyAqIDQwOTYgIFJvd3MgZnJvbSBTRFJBTSBleGFtcGxlIGNvbmZpZ3VyYXRpb24KKyAqIDEwMDAgIGZhY3RvciBzIC0+IG1zCisgKiAgIDMyICBQVFAgKHByZS1kaXZpZGVyIGZyb20gTVBUUFIpIGZyb20gU0RSQU0gZXhhbXBsZSBjb25maWd1cmF0aW9uCisgKiAgICA0ICBOdW1iZXIgb2YgcmVmcmVzaCBjeWNsZXMgcGVyIHBlcmlvZAorICogICA2NCAgUmVmcmVzaCBjeWNsZSBpbiBtcyBwZXIgbnVtYmVyIG9mIHJvd3MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEaXZpZGVyID0gNDA5NiAqIDMyICogMTAwMCAvICg0ICogNjQpID0gNTEyMDAwCisgKgorICogNTAgTUh6ID0+IDUwLjAwMC4wMDAgLyBEaXZpZGVyID0gIDk4CisgKiA2NiBNaHogPT4gNjYuMDAwLjAwMCAvIERpdmlkZXIgPSAxMjkKKyAqIDgwIE1oeiA9PiA4MC4wMDAuMDAwIC8gRGl2aWRlciA9IDE1NgorICovCisjZGVmaW5lIENGR19NQU1SX1BUQQkJIDk4CisKKy8qIHJlZnJlc2ggcmF0ZSAxNS42IHVzICg9IDY0IG1zIC8gNEsgPSA2Mi40IC8gcXVhZCBidXJzdHMpIGZvciA8PSAxMjggTUJpdAkqLworI2RlZmluZSBDRkdfTVBUUFJfMkJLXzRLCU1QVFBSX1BUUF9ESVYxNgkJLyogc2V0dGluZyBmb3IgMiBiYW5rcwkqLworI2RlZmluZSBDRkdfTVBUUFJfMUJLXzRLCU1QVFBSX1BUUF9ESVYzMgkJLyogc2V0dGluZyBmb3IgMSBiYW5rCSovCisKKy8qIHJlZnJlc2ggcmF0ZSA3LjggdXMgKD0gNjQgbXMgLyA4SyA9IDMxLjIgLyBxdWFkIGJ1cnN0cykgZm9yIDI1NiBNQml0CQkqLworI2RlZmluZSBDRkdfTVBUUFJfMkJLXzhLCU1QVFBSX1BUUF9ESVY4CQkvKiBzZXR0aW5nIGZvciAyIGJhbmtzCSovCisjZGVmaW5lIENGR19NUFRQUl8xQktfOEsJTVBUUFJfUFRQX0RJVjE2CQkvKiBzZXR0aW5nIGZvciAxIGJhbmsJKi8KKworLyoKKyAqIE1BTVIgc2V0dGluZ3MgZm9yIFNEUkFNCisgKi8KKworLyogOCBjb2x1bW4gU0RSQU0gKi8KKyNkZWZpbmUgQ0ZHX01BTVJfOENPTAkoKENGR19NQU1SX1BUQSA8PCBNQU1SX1BUQV9TSElGVCkgIHwgTUFNUl9QVEFFCSAgICB8CVwKKwkJCSBNQU1SX0FNQV9UWVBFXzAgfCBNQU1SX0RTQV8xX0NZQ0wgfCBNQU1SX0cwQ0xBX0ExMSB8CVwKKwkJCSBNQU1SX1JMRkFfMVgJIHwgTUFNUl9XTEZBXzFYCSAgIHwgTUFNUl9UTEZBXzRYKQorLyogOSBjb2x1bW4gU0RSQU0gKi8KKyNkZWZpbmUgQ0ZHX01BTVJfOUNPTAkoKENGR19NQU1SX1BUQSA8PCBNQU1SX1BUQV9TSElGVCkgIHwgTUFNUl9QVEFFCSAgICB8CVwKKwkJCSBNQU1SX0FNQV9UWVBFXzEgfCBNQU1SX0RTQV8xX0NZQ0wgfCBNQU1SX0cwQ0xBX0E3IHwJXAorCQkJIE1BTVJfUkxGQV8xWAkgfCBNQU1SX1dMRkFfMVgJICAgfCBNQU1SX1RMRkFfNFgpCisKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lCUJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL09DUlRDLmggYi9pbmNsdWRlL2NvbmZpZ3MvT0NSVEMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTcxZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL09DUlRDLmgKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFN0ZWZhbiBSb2VzZSwgZXNkIGdtYmggZ2VybWFueSwgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogYm9hcmQvY29uZmlnLmggLSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGJvYXJkIHNwZWNpZmljCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKworI2RlZmluZSBDT05GSUdfNDA1R1AJCTEJLyogVGhpcyBpcyBhIFBQQzQwNSBDUFUJCSovCisjZGVmaW5lIENPTkZJR180eHgJCTEJLyogLi4ubWVtYmVyIG9mIFBQQzR4eCBmYW1pbHkgICAqLworI2RlZmluZSBDT05GSUdfT0NSVEMgICAJCTEJLyogLi4ub24gYSBPQ1JUQyBib2FyZAkgICAgICAgICovCisKKyNkZWZpbmUgQ09ORklHX0JPQVJEX1BSRV9JTklUICAgMSAgICAgICAvKiBjYWxsIGJvYXJkX3ByZV9pbml0KCkgICAgICAgICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgICAgMzMwMDAwMDAgLyogZXh0ZXJuYWwgZnJlcXVlbmN5IHRvIHBsbCAgICovCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk5NjAwCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwkvKiBhdXRvYm9vdCBhZnRlciAzIHNlY29uZHMJKi8KKworI3VuZGVmCUNPTkZJR19CT09UQVJHUworI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQgImdvIGZmZjAwMTAwIgorCisjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCisjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZQkqLworCisjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLworI2RlZmluZQlDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLworCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAorCQkJCUNGR19DTURfUENJCXwgXAorCQkJCUNGR19DTURfSVJRCXwgXAorCQkJCUNGR19DTURfQVNLRU5WCXwgXAorCQkJCUNGR19DTURfRUxGCXwgXAorCQkJCUNGR19DTURfRUVQUk9NICApCisKKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KKyNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KKworLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLworI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisjdW5kZWYgIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLworCisjZGVmaW5lCUNPTkZJR19TRFJBTV9CQU5LMAkxCS8qIGluaXQgb25ib2FyZCBTRFJBTSBiYW5rIDAJKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbHNlCisjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2VuZGlmCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENGR19DT05TT0xFX0lORk9fUVVJRVQgIDEgICAgICAgLyogZG9uJ3QgcHJpbnQgY29uc29sZSBAIHN0YXJ0dXAqLworCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDQwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwQzAwMDAwCS8qIDQgLi4uIDEyIE1CIGluIERSQU0JKi8KKworI3VuZGVmICBDRkdfRVhUX1NFUklBTF9DTE9DSyAgICAgICAgICAgLyogbm8gZXh0ZXJuYWwgc2VyaWFsIGNsb2NrIHVzZWQgKi8KKyNkZWZpbmUgQ0ZHX0lHTk9SRV80MDVfVUFSVF9FUlJBVEFfNTkgICAvKiBpZ25vcmUgcHBjNDA1Z3AgZXJyYXRhICM1OSAgICovCisjZGVmaW5lIENGR19CQVNFX0JBVUQgICAgICAgNjkxMjAwCisKKy8qIFRoZSBmb2xsb3dpbmcgdGFibGUgaW5jbHVkZXMgdGhlIHN1cHBvcnRlZCBiYXVkcmF0ZXMgKi8KKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFICAgICAgXAorICAgICAgICB7IDMwMCwgNjAwLCAxMjAwLCAyNDAwLCA0ODAwLCA5NjAwLCAxOTIwMCwgMzg0MDAsICAgICBcCisgICAgICAgICA1NzYwMCwgMTE1MjAwLCAyMzA0MDAsIDQ2MDgwMCwgOTIxNjAwIH0KKworI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MTAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19FWFRCRElORk8JMQkJLyogVG8gdXNlIGV4dGVuZGVkIGJvYXJkX2ludG8gKGJkX3QpICovCisKKyNkZWZpbmUJQ0ZHX0haCQkxMDAwCQkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzCSovCisKKyNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCS8qIGNoZWNrIGZvciBrZXlwcmVzcyBvbiBib290ZGVsYXk9PTAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUENJIHN0dWZmCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgUENJX0hPU1RfQURBUFRFUiAwICAgICAgICAgICAgICAvKiBjb25maWd1cmUgYXMgcGNpIGFkYXB0ZXIgICAgICovCisjZGVmaW5lIFBDSV9IT1NUX0ZPUkNFICAxICAgICAgICAgICAgICAgLyogY29uZmlndXJlIGFzIHBjaSBob3N0ICAgICAgICAqLworI2RlZmluZSBQQ0lfSE9TVF9BVVRPICAgMiAgICAgICAgICAgICAgIC8qIGRldGVjdGVkIHZpYSBhcmJpdGVyIGVuYWJsZSAgKi8KKworI2RlZmluZSBDT05GSUdfUENJCQkJLyogaW5jbHVkZSBwY2kgc3VwcG9ydAkgICAgICAgICovCisjZGVmaW5lIENPTkZJR19QQ0lfSE9TVAlQQ0lfSE9TVF9BVVRPICAgLyogc2VsZWN0IHBjaSBob3N0IGZ1bmN0aW9uICAgICAqLworI2RlZmluZSBDT05GSUdfUENJX1BOUAkJCS8qIGRvIHBjaSBwbHVnLWFuZC1wbGF5ICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNvdXJjZSBjb25maWd1cmF0aW9uICAgICAgICovCisKKyNkZWZpbmUgQ09ORklHX1BDSV9TQ0FOX1NIT1cgICAgICAgICAgICAvKiBwcmludCBwY2kgZGV2aWNlcyBAIHN0YXJ0dXAgICovCisKKyNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfVkVORE9SSUQgMHgxMkZFICAvKiBQQ0kgVmVuZG9yIElEOiBlc2QgZ21iaCAgICAgICovCisjZGVmaW5lIENGR19QQ0lfU1VCU1lTX0RFVklDRUlEIDB4MDQxMCAgLyogUENJIERldmljZSBJRDogT0NSVEMgICAgICAgICAqLworI2RlZmluZSBDRkdfUENJX0NMQVNTQ09ERSAgICAgICAweDBiMjAgIC8qIFBDSSBDbGFzcyBDb2RlOiBQcm9jZXNzb3IvUFBDKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0xTEEgIDB4MDAwMDAwMDAgICAgICAvKiBwb2ludCB0byBzZHJhbSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMU1TICAweGZjMDAwMDAxICAgICAgLyogNjRNQiwgZW5hYmxlIGhhcmQtd2lyZWQgdG8gMSAqLworI2RlZmluZSBDRkdfUENJX1BUTTFQQ0kgMHgwMDAwMDAwMCAgICAgIC8qIEhvc3Q6IHVzZSB0aGlzIHBjaSBhZGRyZXNzICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0yTEEgIDB4ZmZjMDAwMDAgICAgICAvKiBwb2ludCB0byBmbGFzaCAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMk1TICAweGZmYzAwMDAxICAgICAgLyogNE1CLCBlbmFibGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTJQQ0kgMHgwNDAwMDAwMCAgICAgIC8qIEhvc3Q6IHVzZSB0aGlzIHBjaSBhZGRyZXNzICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhcnQgYWRkcmVzc2VzIGZvciB0aGUgZmluYWwgbWVtb3J5IGNvbmZpZ3VyYXRpb24KKyAqIChTZXQgdXAgYnkgdGhlIHN0YXJ0dXAgY29kZSkKKyAqIFBsZWFzZSBub3RlIHRoYXQgQ0ZHX1NEUkFNX0JBU0UgX211c3RfIHN0YXJ0IGF0IDAKKyAqLworI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRkZEMDAwMAorI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCUNGR19GTEFTSF9CQVNFCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDE5MiAqIDEwMjQpCS8qIFJlc2VydmUgMTkyIGtCIGZvciBNb25pdG9yCSovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoMTI4ICogMTAyNCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIG1hbGxvYygpCSovCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGTEFTSCBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTIJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJCSovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkyNTYJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJMTIwMDAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlIChpbiBtcykJKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJNTAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlIChpbiBtcykJKi8KKworI2RlZmluZSBDRkdfRkxBU0hfV09SRF9TSVpFICAgICB1bnNpZ25lZCBzaG9ydCAgLyogZmxhc2ggd29yZCBzaXplICh3aWR0aCkgICAgICAqLworI2RlZmluZSBDRkdfRkxBU0hfQUREUjAgICAgICAgICAweDU1NTUgIC8qIDFzdCBhZGRyZXNzIGZvciBmbGFzaCBjb25maWcgY3ljbGVzICAqLworI2RlZmluZSBDRkdfRkxBU0hfQUREUjEgICAgICAgICAweDJBQUEgIC8qIDJuZCBhZGRyZXNzIGZvciBmbGFzaCBjb25maWcgY3ljbGVzICAqLworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgYWRkZWQgZm9yIGJ1Z2d5IElPUDQ4MCBieXRlIGludGVyZmFjZS4KKyAqIEFsbCBvdGhlciBib2FyZHMgc2hvdWxkIHVzZSB0aGUgc3RhbmRhcmQgdmFsdWVzIChDUENJNDA1IGV0Yy4pCisgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1JFQUQwICAgICAgICAgMHgwMDAwICAvKiAwIGlzIHN0YW5kYXJkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1JFQUQxICAgICAgICAgMHgwMDAxICAvKiAxIGlzIHN0YW5kYXJkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1JFQUQyICAgICAgICAgMHgwMDAyICAvKiAyIGlzIHN0YW5kYXJkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDRkdfRkxBU0hfRU1QVFlfSU5GTyAgICAgICAgICAgIC8qIHByaW50ICdFJyBmb3IgZW1wdHkgc2VjdG9yIG9uIGZsaW5mbyAqLworCisjaWYgMCAvKiBVc2UgTlZSQU0gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTlZSQU0gb3JnYW5pemF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9OVlJBTQkxCS8qIHVzZSBOVlJBTSBmb3IgZW52aXJvbm1lbnQgdmFycwkqLworI2RlZmluZSBDRkdfTlZSQU1fQkFTRV9BRERSCTB4ZjAyMDAwMDAJCS8qIE5WUkFNIGJhc2UgYWRkcmVzcwkqLworI2RlZmluZSBDRkdfTlZSQU1fU0laRQkJKDMyKjEwMjQpCQkvKiBOVlJBTSBzaXplCQkqLworI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MTAwMAkJLyogU2l6ZSBvZiBFbnZpcm9ubWVudCB2YXJzCSovCisjZGVmaW5lIENGR19FTlZfQUREUgkJXAorCShDRkdfTlZSQU1fQkFTRV9BRERSK0NGR19OVlJBTV9TSVpFLUNGR19FTlZfU0laRSkJLyogRW52CSovCisjZGVmaW5lIENGR19OVlJBTV9WWFdPUktTX09GRlMJMHg2OTAwCQkvKiBPZmZzZXQgZm9yIFZ4V29ya3MgZXRoLWFkZHIJKi8KKworI2Vsc2UgLyogVXNlIEVFUFJPTSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisKKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9FRVBST00gICAgMSAgICAgICAvKiB1c2UgRUVQUk9NIGZvciBlbnZpcm9ubWVudCB2YXJzICovCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUICAgICAgICAgIDB4MDAwICAgLyogZW52aXJvbm1lbnQgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIEVFUFJPTSAqLworI2RlZmluZSBDRkdfRU5WX1NJWkUgICAgICAgICAgICAweDMwMCAgIC8qIDc2OCBieXRlcyBtYXkgYmUgdXNlZCBmb3IgZW52IHZhcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG90YWwgc2l6ZSBvZiBhIENBVDI0V0MwOCBpcyAxMDI0IGJ5dGVzICovCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSTJDIEVFUFJPTSAoQ0FUMjRXQzA4KSBmb3IgZW52aXJvbm1lbnQKKyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCQkvKiBJMmMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0ICovCisjZGVmaW5lIENGR19JMkNfU1BFRUQJCTQwMDAwMAkvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHg3RgorCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFIJMHg1MAkvKiBFRVBST00gQ0FUMjhXQzA4CQkqLworI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTgkxCS8qIEJ5dGVzIG9mIGFkZHJlc3MJCSovCisvKiBtYXNrIG9mIGFkZHJlc3MgYml0cyB0aGF0IG92ZXJmbG93IGludG8gdGhlICJFRVBST00gY2hpcCBhZGRyZXNzIiAgICAqLworI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX09WRVJGTE9XCTB4MDcKKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0JJVFMgNAkvKiBUaGUgQ2F0YWx5c3QgQ0FUMjRXQzA4IGhhcwkqLworCQkJCQkvKiAxNiBieXRlIHBhZ2Ugd3JpdGUgbW9kZSB1c2luZyovCisJCQkJCS8qIGxhc3QJNCBiaXRzIG9mIHRoZSBhZGRyZXNzCSovCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9ERUxBWV9NUwkxMCAgIC8qIGFuZCB0YWtlcyB1cCB0byAxMCBtc2VjICovCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9FTkFCTEUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2FjaGUgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgSUJNIDQwNSBDUFVzCQkJKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCisjZW5kaWYKKworLyoKKyAqIEluaXQgTWVtb3J5IENvbnRyb2xsZXI6CisgKgorICogQlIwLzEgYW5kIE9SMC8xIChGTEFTSCkKKyAqLworCisjZGVmaW5lIEZMQVNIX0JBU0UwX1BSRUxJTQkweEZGODAwMDAwCS8qIEZMQVNIIGJhbmsgIzAJKi8KKyNkZWZpbmUgRkxBU0hfQkFTRTFfUFJFTElNCTB4RkZDMDAwMDAJLyogRkxBU0ggYmFuayAjMQkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBCdXMgQ29udHJvbGxlciAoRUJDKSBTZXR1cAorICovCisKKy8qIE1lbW9yeSBCYW5rIDAgKEZsYXNoIEJhbmsgMCkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjBBUCAgICAgICAgICAgMHg5MjAxNTQ4MAorI2RlZmluZSBDRkdfRUJDX1BCMENSICAgICAgICAgICAweEZGQzVBMDAwICAvKiBCQVM9MHhGRkMsQlM9NE1CLEJVPVIvVyxCVz0xNmJpdCAqLworCisvKiBNZW1vcnkgQmFuayAxIChGbGFzaCBCYW5rIDEpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEIxQVAgICAgICAgICAgIDB4OTIwMTU0ODAKKyNkZWZpbmUgQ0ZHX0VCQ19QQjFDUiAgICAgICAgICAgMHhGRjg1QTAwMCAgLyogQkFTPTB4RkY4LEJTPTRNQixCVT1SL1csQlc9MTZiaXQgKi8KKworLyogTWVtb3J5IEJhbmsgMiAoUExEIC0gRlBHQS1ib290KSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCMkFQICAgICAgICAgICAweDAyMDE1NDgwICAvKiBCTUU9MHgwLFRXVD0weDA0LENTTj0weDAsT0VOPTB4MSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXQk49MHgxLFdCRj0weDEsVEg9MHgyLFJFPTB4MCxTT1I9MHgxLEJFTT0weDAsUEVOPTB4MCovCisjZGVmaW5lIENGR19FQkNfUEIyQ1IgICAgICAgICAgIDB4RjAwMTgwMDAgIC8qIEJBUz0weEYwMCxCUz0xTUIsQlU9Ui9XLEJXPThiaXQgICovCisKKy8qIE1lbW9yeSBCYW5rIDMgKFBMRCAtIE9TTCkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjNBUCAgICAgICAgICAgMHgwMjAxNTQ4MCAgLyogQk1FPTB4MCxUV1Q9MHgwNCxDU049MHgwLE9FTj0weDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0JOPTB4MSxXQkY9MHgxLFRIPTB4MixSRT0weDAsU09SPTB4MSxCRU09MHgwLFBFTj0weDAqLworI2RlZmluZSBDRkdfRUJDX1BCM0NSICAgICAgICAgICAweEYwMTE4MDAwICAvKiBCQVM9MHhGMDEsQlM9MU1CLEJVPVIvVyxCVz04Yml0ICAqLworCisvKiBNZW1vcnkgQmFuayA0IChTcGFydGFuMiAxKSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEI0QVAgICAgICAgICAgIDB4MDIwMTU1ODAgIC8qIEJNRT0weDAsVFdUPTB4MDQsQ1NOPTB4MCxPRU49MHgxICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdCTj0weDEsV0JGPTB4MSxUSD0weDIsUkU9MHgxLFNPUj0weDEsQkVNPTB4MCxQRU49MHgwKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjRDUiAgICAgICAgICAgMHhGMjA5QzAwMCAgLyogQkFTPTB4RjIwLEJTPTE2TUIsQlU9Ui9XLEJXPTMyYml0Ki8KKworLyogTWVtb3J5IEJhbmsgNSAoU3BhcnRhbjIgMikgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCNUFQICAgICAgICAgICAweDAyMDE1NTgwICAvKiBCTUU9MHgwLFRXVD0weDA0LENTTj0weDAsT0VOPTB4MSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXQk49MHgxLFdCRj0weDEsVEg9MHgyLFJFPTB4MSxTT1I9MHgxLEJFTT0weDAsUEVOPTB4MCovCisjZGVmaW5lIENGR19FQkNfUEI1Q1IgICAgICAgICAgIDB4RjMwOUMwMDAgIC8qIEJBUz0weEYzMCxCUz0xNk1CLEJVPVIvVyxCVz0zMmJpdCovCisKKy8qIE1lbW9yeSBCYW5rIDYgKFZpcnRleCAxKSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjZBUCAgICAgICAgICAgMHgwMjAxNTU4MCAgLyogQk1FPTB4MCxUV1Q9MHgwNCxDU049MHgwLE9FTj0weDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0JOPTB4MSxXQkY9MHgxLFRIPTB4MixSRT0weDEsU09SPTB4MSxCRU09MHgwLFBFTj0weDAqLworI2RlZmluZSBDRkdfRUJDX1BCNkNSICAgICAgICAgICAweEY0MDlBMDAwICAvKiBCQVM9MHhGNDAsQlM9MTZNQixCVT1SL1csQlc9MTZiaXQqLworCisvKiBNZW1vcnkgQmFuayA3IChWaXJ0ZXggMikgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEI3QVAgICAgICAgICAgIDB4MDIwMTU1ODAgIC8qIEJNRT0weDAsVFdUPTB4MDQsQ1NOPTB4MCxPRU49MHgxICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdCTj0weDEsV0JGPTB4MSxUSD0weDIsUkU9MHgxLFNPUj0weDEsQkVNPTB4MCxQRU49MHgwKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjdDUiAgICAgICAgICAgMHhGNTA5QTAwMCAgLyogQkFTPTB4RjUwLEJTPTE2TUIsQlU9Ui9XLEJXPTE2Yml0Ki8KKworCisjZGVmaW5lIENGR19FVEhFUk5FVF9NQUNfQUREUiAgIDB4MDAwMDAwMDAgICAgICAvKiBQYXNzIEV0aGVybmV0IE1BQyB0byBWeFdvcmtzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb25zIGZvciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgYW5kIGRhdGEgYXJlYSAoaW4gRFBSQU0pCisgKi8KKworLyogdXNlIG9uIGNoaXAgbWVtb3J5ICggT0NNICkgZm9yIHRlbXBlcmFyeSBzdGFjayB1bnRpbCBzZHJhbSBpcyB0ZXN0ZWQgKi8KKyNkZWZpbmUgQ0ZHX1RFTVBfU1RBQ0tfT0NNICAgICAgICAxCisKKy8qIE9uIENoaXAgTWVtb3J5IGxvY2F0aW9uICovCisjZGVmaW5lIENGR19PQ01fREFUQV9BRERSCTB4RjgwMDAwMDAKKyNkZWZpbmUgQ0ZHX09DTV9EQVRBX1NJWkUJMHgxMDAwCisKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJQ0ZHX09DTV9EQVRBX0FERFIgLyogaW5zaWRlIG9mIFNEUkFNCQkqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECUNGR19PQ01fREFUQV9TSVpFIC8qIEVuZCBvZiB1c2VkIGFyZWEgaW4gUkFNCSovCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFICAgICAgMTI4ICAvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVCAgICAoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQgICAgICBDRkdfR0JMX0RBVEFfT0ZGU0VUCisKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL09SU0cuaCBiL2luY2x1ZGUvY29uZmlncy9PUlNHLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxNjFjNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9PUlNHLmgKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFN0ZWZhbiBSb2VzZSwgZXNkIGdtYmggZ2VybWFueSwgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogYm9hcmQvY29uZmlnLmggLSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGJvYXJkIHNwZWNpZmljCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKworI2RlZmluZSBDT05GSUdfNDA1R1AJCTEJLyogVGhpcyBpcyBhIFBQQzQwNSBDUFUJCSovCisjZGVmaW5lIENPTkZJR180eHgJCTEJLyogLi4ubWVtYmVyIG9mIFBQQzR4eCBmYW1pbHkgICAqLworI2RlZmluZSBDT05GSUdfT1JTRyAgIAkJMQkvKiAuLi5vbiBhIE9SU0cgYm9hcmQJICAgICAgICAqLworCisjZGVmaW5lIENPTkZJR19CT0FSRF9QUkVfSU5JVCAgIDEgICAgICAgLyogY2FsbCBib2FyZF9wcmVfaW5pdCgpICAgICAgICAqLworCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgICAgIDMzMDAwMDAwIC8qIGV4dGVybmFsIGZyZXF1ZW5jeSB0byBwbGwgICAqLworCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMJLyogYXV0b2Jvb3QgYWZ0ZXIgMyBzZWNvbmRzCSovCisKKyN1bmRlZglDT05GSUdfQk9PVEFSR1MKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5EICJnbyBmZmYwMDEwMCIKKworI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLworI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KKworI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KKyNkZWZpbmUJQ09ORklHX1BIWV9BRERSCQkwCS8qIFBIWSBhZGRyZXNzCQkJKi8KKworI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKKwkJCQlDRkdfQ01EX1BDSQl8IFwKKwkJCQlDRkdfQ01EX0lSUQl8IFwKKwkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKKwkJCQlDRkdfQ01EX0VMRgl8IFwKKwkJCQlDRkdfQ01EX0VFUFJPTSAgKQorCisjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCisjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCisKKy8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KKyNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworI3VuZGVmICBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KKworI2RlZmluZQlDT05GSUdfU0RSQU1fQkFOSzAJMQkvKiBpbml0IG9uYm9hcmQgU0RSQU0gYmFuayAwCSovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCisjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZWxzZQorI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbmRpZgorI2RlZmluZSBDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX01BWEFSR1MJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDRkdfQ09OU09MRV9JTkZPX1FVSUVUICAxICAgICAgIC8qIGRvbid0IHByaW50IGNvbnNvbGUgQCBzdGFydHVwKi8KKworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDA0MDAwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MEMwMDAwMAkvKiA0IC4uLiAxMiBNQiBpbiBEUkFNCSovCisKKyN1bmRlZiAgQ0ZHX0VYVF9TRVJJQUxfQ0xPQ0sgICAgICAgICAgIC8qIG5vIGV4dGVybmFsIHNlcmlhbCBjbG9jayB1c2VkICovCisjZGVmaW5lIENGR19JR05PUkVfNDA1X1VBUlRfRVJSQVRBXzU5ICAgLyogaWdub3JlIHBwYzQwNWdwIGVycmF0YSAjNTkgICAqLworI2RlZmluZSBDRkdfQkFTRV9CQVVEICAgICAgIDY5MTIwMAorCisvKiBUaGUgZm9sbG93aW5nIHRhYmxlIGluY2x1ZGVzIHRoZSBzdXBwb3J0ZWQgYmF1ZHJhdGVzICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgICAgIFwKKyAgICAgICAgeyAzMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCAgICAgXAorICAgICAgICAgNTc2MDAsIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsIDkyMTYwMCB9CisKKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDEwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfRVhUQkRJTkZPCTEJCS8qIFRvIHVzZSBleHRlbmRlZCBib2FyZF9pbnRvIChiZF90KSAqLworCisjZGVmaW5lCUNGR19IWgkJMTAwMAkJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcwkqLworCisjZGVmaW5lIENPTkZJR19aRVJPX0JPT1RERUxBWV9DSEVDSwkvKiBjaGVjayBmb3Iga2V5cHJlc3Mgb24gYm9vdGRlbGF5PT0wICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBDSSBzdHVmZgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIFBDSV9IT1NUX0FEQVBURVIgMCAgICAgICAgICAgICAgLyogY29uZmlndXJlIGFzIHBjaSBhZGFwdGVyICAgICAqLworI2RlZmluZSBQQ0lfSE9TVF9GT1JDRSAgMSAgICAgICAgICAgICAgIC8qIGNvbmZpZ3VyZSBhcyBwY2kgaG9zdCAgICAgICAgKi8KKyNkZWZpbmUgUENJX0hPU1RfQVVUTyAgIDIgICAgICAgICAgICAgICAvKiBkZXRlY3RlZCB2aWEgYXJiaXRlciBlbmFibGUgICovCisKKyNkZWZpbmUgQ09ORklHX1BDSQkJCS8qIGluY2x1ZGUgcGNpIHN1cHBvcnQJICAgICAgICAqLworI2RlZmluZSBDT05GSUdfUENJX0hPU1QJUENJX0hPU1RfQURBUFRFUiAvKiBzZWxlY3QgcGNpIGFkYXB0ZXIgICAgICAgICAgKi8KKyN1bmRlZiAgQ09ORklHX1BDSV9QTlAJCQkvKiBubyBwY2kgcGx1Zy1hbmQtcGxheSAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzb3VyY2UgY29uZmlndXJhdGlvbiAgICAgICAqLworCisjdW5kZWYgIENPTkZJR19QQ0lfU0NBTl9TSE9XICAgICAgICAgICAgLyogcHJpbnQgcGNpIGRldmljZXMgQCBzdGFydHVwICAqLworCisjZGVmaW5lIENGR19QQ0lfU1VCU1lTX1ZFTkRPUklEIDB4MTJGRSAgLyogUENJIFZlbmRvciBJRDogZXNkIGdtYmggICAgICAqLworI2RlZmluZSBDRkdfUENJX1NVQlNZU19ERVZJQ0VJRCAweDA0MTEgIC8qIFBDSSBEZXZpY2UgSUQ6IE9SU0cgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9DTEFTU0NPREUgICAgICAgMHgwYjIwICAvKiBQQ0kgQ2xhc3MgQ29kZTogUHJvY2Vzc29yL1BQQyovCisjZGVmaW5lIENGR19QQ0lfUFRNMUxBICAweDAwMDAwMDAwICAgICAgLyogcG9pbnQgdG8gc2RyYW0gICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTFNUyAgMHhmYzAwMDAwMSAgICAgIC8qIDY0TUIsIGVuYWJsZSBoYXJkLXdpcmVkIHRvIDEgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0xUENJIDB4MDAwMDAwMDAgICAgICAvKiBIb3N0OiB1c2UgdGhpcyBwY2kgYWRkcmVzcyAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMkxBICAweGZmYzAwMDAwICAgICAgLyogcG9pbnQgdG8gZmxhc2ggICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTJNUyAgMHhmZmMwMDAwMSAgICAgIC8qIDRNQiwgZW5hYmxlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0yUENJIDB4MDQwMDAwMDAgICAgICAvKiBIb3N0OiB1c2UgdGhpcyBwY2kgYWRkcmVzcyAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXJ0IGFkZHJlc3NlcyBmb3IgdGhlIGZpbmFsIG1lbW9yeSBjb25maWd1cmF0aW9uCisgKiAoU2V0IHVwIGJ5IHRoZSBzdGFydHVwIGNvZGUpCisgKiBQbGVhc2Ugbm90ZSB0aGF0IENGR19TRFJBTV9CQVNFIF9tdXN0XyBzdGFydCBhdCAwCisgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4RkZGRDAwMDAKKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlDRkdfRkxBU0hfQkFTRQorI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgxOTIgKiAxMDI0KQkvKiBSZXNlcnZlIDE5MiBrQiBmb3IgTW9uaXRvcgkqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDEyOCAqIDEwMjQpCS8qIFJlc2VydmUgMTI4IGtCIGZvciBtYWxsb2MoKQkqLworCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRkxBU0ggb3JnYW5pemF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkyCS8qIG1heCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzCQkqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMjU2CS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcAkqLworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAgICAgdW5zaWduZWQgc2hvcnQgIC8qIGZsYXNoIHdvcmQgc2l6ZSAod2lkdGgpICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0FERFIwICAgICAgICAgMHg1NTU1ICAvKiAxc3QgYWRkcmVzcyBmb3IgZmxhc2ggY29uZmlnIGN5Y2xlcyAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0FERFIxICAgICAgICAgMHgyQUFBICAvKiAybmQgYWRkcmVzcyBmb3IgZmxhc2ggY29uZmlnIGN5Y2xlcyAgKi8KKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGFkZGVkIGZvciBidWdneSBJT1A0ODAgYnl0ZSBpbnRlcmZhY2UuCisgKiBBbGwgb3RoZXIgYm9hcmRzIHNob3VsZCB1c2UgdGhlIHN0YW5kYXJkIHZhbHVlcyAoQ1BDSTQwNSBldGMuKQorICovCisjZGVmaW5lIENGR19GTEFTSF9SRUFEMCAgICAgICAgIDB4MDAwMCAgLyogMCBpcyBzdGFuZGFyZCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19GTEFTSF9SRUFEMSAgICAgICAgIDB4MDAwMSAgLyogMSBpcyBzdGFuZGFyZCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19GTEFTSF9SRUFEMiAgICAgICAgIDB4MDAwMiAgLyogMiBpcyBzdGFuZGFyZCAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8gICAgICAgICAgICAvKiBwcmludCAnRScgZm9yIGVtcHR5IHNlY3RvciBvbiBmbGluZm8gKi8KKworI2lmIDAgLyogVXNlIE5WUkFNIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE5WUkFNIG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19FTlZfSVNfSU5fTlZSQU0JMQkvKiB1c2UgTlZSQU0gZm9yIGVudmlyb25tZW50IHZhcnMJKi8KKyNkZWZpbmUgQ0ZHX05WUkFNX0JBU0VfQUREUgkweGYwMjAwMDAwCQkvKiBOVlJBTSBiYXNlIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX05WUkFNX1NJWkUJCSgzMioxMDI0KQkJLyogTlZSQU0gc2l6ZQkJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDEwMDAJCS8qIFNpemUgb2YgRW52aXJvbm1lbnQgdmFycwkqLworI2RlZmluZSBDRkdfRU5WX0FERFIJCVwKKwkoQ0ZHX05WUkFNX0JBU0VfQUREUitDRkdfTlZSQU1fU0laRS1DRkdfRU5WX1NJWkUpCS8qIEVudgkqLworI2RlZmluZSBDRkdfTlZSQU1fVlhXT1JLU19PRkZTCTB4NjkwMAkJLyogT2Zmc2V0IGZvciBWeFdvcmtzIGV0aC1hZGRyCSovCisKKyNlbHNlIC8qIFVzZSBFRVBST00gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyAqLworCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRUVQUk9NICAgIDEgICAgICAgLyogdXNlIEVFUFJPTSBmb3IgZW52aXJvbm1lbnQgdmFycyAqLworI2RlZmluZSBDRkdfRU5WX09GRlNFVCAgICAgICAgICAweDAwMCAgIC8qIGVudmlyb25tZW50IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFICAgICAgICAgICAgMHgzMDAgICAvKiA3NjggYnl0ZXMgbWF5IGJlIHVzZWQgZm9yIGVudiB2YXJzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvdGFsIHNpemUgb2YgYSBDQVQyNFdDMDggaXMgMTAyNCBieXRlcyAqLworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEkyQyBFRVBST00gKENBVDI0V0MwOCkgZm9yIGVudmlyb25tZW50CisgKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCQkJLyogSTJjIHdpdGggaGFyZHdhcmUgc3VwcG9ydCAqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJLyogSTJDIHNwZWVkIGFuZCBzbGF2ZSBhZGRyZXNzICovCisjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YKKworI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSCTB4NTAJLyogRUVQUk9NIENBVDI4V0MwOAkJKi8KKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4JMQkvKiBCeXRlcyBvZiBhZGRyZXNzCQkqLworLyogbWFzayBvZiBhZGRyZXNzIGJpdHMgdGhhdCBvdmVyZmxvdyBpbnRvIHRoZSAiRUVQUk9NIGNoaXAgYWRkcmVzcyIgICAgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVwkweDA3CisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTIDQJLyogVGhlIENhdGFseXN0IENBVDI0V0MwOCBoYXMJKi8KKwkJCQkJLyogMTYgYnl0ZSBwYWdlIHdyaXRlIG1vZGUgdXNpbmcqLworCQkJCQkvKiBsYXN0CTQgYml0cyBvZiB0aGUgYWRkcmVzcwkqLworI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfREVMQVlfTVMJMTAgICAvKiBhbmQgdGFrZXMgdXAgdG8gMTAgbXNlYyAqLworI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfRU5BQkxFCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENhY2hlIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIElCTSA0MDUgQ1BVcwkJCSovCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLworI2VuZGlmCisKKy8qCisgKiBJbml0IE1lbW9yeSBDb250cm9sbGVyOgorICoKKyAqIEJSMC8xIGFuZCBPUjAvMSAoRkxBU0gpCisgKi8KKworI2RlZmluZSBGTEFTSF9CQVNFMF9QUkVMSU0JMHhGRjgwMDAwMAkvKiBGTEFTSCBiYW5rICMwCSovCisjZGVmaW5lIEZMQVNIX0JBU0UxX1BSRUxJTQkweEZGQzAwMDAwCS8qIEZMQVNIIGJhbmsgIzEJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRXh0ZXJuYWwgQnVzIENvbnRyb2xsZXIgKEVCQykgU2V0dXAKKyAqLworCisvKiBNZW1vcnkgQmFuayAwIChGbGFzaCBCYW5rIDApIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEIwQVAgICAgICAgICAgIDB4OTIwMTU0ODAKKyNkZWZpbmUgQ0ZHX0VCQ19QQjBDUiAgICAgICAgICAgMHhGRkM1QTAwMCAgLyogQkFTPTB4RkZDLEJTPTRNQixCVT1SL1csQlc9MTZiaXQgKi8KKworLyogTWVtb3J5IEJhbmsgMSAoRmxhc2ggQmFuayAxKSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCMUFQICAgICAgICAgICAweDkyMDE1NDgwCisjZGVmaW5lIENGR19FQkNfUEIxQ1IgICAgICAgICAgIDB4RkY4NUEwMDAgIC8qIEJBUz0weEZGOCxCUz00TUIsQlU9Ui9XLEJXPTE2Yml0ICovCisKKy8qIE1lbW9yeSBCYW5rIDIgKFBMRCAtIEZQR0EtYm9vdCkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjJBUCAgICAgICAgICAgMHgwMjAxNTQ4MCAgLyogQk1FPTB4MCxUV1Q9MHgwNCxDU049MHgwLE9FTj0weDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0JOPTB4MSxXQkY9MHgxLFRIPTB4MixSRT0weDAsU09SPTB4MSxCRU09MHgwLFBFTj0weDAqLworI2RlZmluZSBDRkdfRUJDX1BCMkNSICAgICAgICAgICAweEYwMDE4MDAwICAvKiBCQVM9MHhGMDAsQlM9MU1CLEJVPVIvVyxCVz04Yml0ICAqLworCisvKiBNZW1vcnkgQmFuayAzIChQTEQgLSBPU0wpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEIzQVAgICAgICAgICAgIDB4MDIwMTU0ODAgIC8qIEJNRT0weDAsVFdUPTB4MDQsQ1NOPTB4MCxPRU49MHgxICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdCTj0weDEsV0JGPTB4MSxUSD0weDIsUkU9MHgwLFNPUj0weDEsQkVNPTB4MCxQRU49MHgwKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjNDUiAgICAgICAgICAgMHhGMDExODAwMCAgLyogQkFTPTB4RjAxLEJTPTFNQixCVT1SL1csQlc9OGJpdCAgKi8KKworLyogTWVtb3J5IEJhbmsgNCAoU3BhcnRhbjIgMSkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCNEFQICAgICAgICAgICAweDAyMDE1NTgwICAvKiBCTUU9MHgwLFRXVD0weDA0LENTTj0weDAsT0VOPTB4MSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXQk49MHgxLFdCRj0weDEsVEg9MHgyLFJFPTB4MSxTT1I9MHgxLEJFTT0weDAsUEVOPTB4MCovCisjZGVmaW5lIENGR19FQkNfUEI0Q1IgICAgICAgICAgIDB4RjIwOUMwMDAgIC8qIEJBUz0weEYyMCxCUz0xNk1CLEJVPVIvVyxCVz0zMmJpdCovCisKKy8qIE1lbW9yeSBCYW5rIDUgKFNwYXJ0YW4yIDIpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjVBUCAgICAgICAgICAgMHgwMjAxNTU4MCAgLyogQk1FPTB4MCxUV1Q9MHgwNCxDU049MHgwLE9FTj0weDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0JOPTB4MSxXQkY9MHgxLFRIPTB4MixSRT0weDEsU09SPTB4MSxCRU09MHgwLFBFTj0weDAqLworI2RlZmluZSBDRkdfRUJDX1BCNUNSICAgICAgICAgICAweEYzMDlDMDAwICAvKiBCQVM9MHhGMzAsQlM9MTZNQixCVT1SL1csQlc9MzJiaXQqLworCisvKiBNZW1vcnkgQmFuayA2IChWaXJ0ZXggMSkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEI2QVAgICAgICAgICAgIDB4MDIwMTU1ODAgIC8qIEJNRT0weDAsVFdUPTB4MDQsQ1NOPTB4MCxPRU49MHgxICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdCTj0weDEsV0JGPTB4MSxUSD0weDIsUkU9MHgxLFNPUj0weDEsQkVNPTB4MCxQRU49MHgwKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjZDUiAgICAgICAgICAgMHhGNDA5QTAwMCAgLyogQkFTPTB4RjQwLEJTPTE2TUIsQlU9Ui9XLEJXPTE2Yml0Ki8KKworLyogTWVtb3J5IEJhbmsgNyAoVmlydGV4IDIpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfRUJDX1BCN0FQICAgICAgICAgICAweDAyMDE1NTgwICAvKiBCTUU9MHgwLFRXVD0weDA0LENTTj0weDAsT0VOPTB4MSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXQk49MHgxLFdCRj0weDEsVEg9MHgyLFJFPTB4MSxTT1I9MHgxLEJFTT0weDAsUEVOPTB4MCovCisjZGVmaW5lIENGR19FQkNfUEI3Q1IgICAgICAgICAgIDB4RjUwOUEwMDAgIC8qIEJBUz0weEY1MCxCUz0xNk1CLEJVPVIvVyxCVz0xNmJpdCovCisKKworI2RlZmluZSBDRkdfRVRIRVJORVRfTUFDX0FERFIgICAweDAwMDAwMDAwICAgICAgLyogUGFzcyBFdGhlcm5ldCBNQUMgdG8gVnhXb3JrcyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWZpbml0aW9ucyBmb3IgaW5pdGlhbCBzdGFjayBwb2ludGVyIGFuZCBkYXRhIGFyZWEgKGluIERQUkFNKQorICovCisKKy8qIHVzZSBvbiBjaGlwIG1lbW9yeSAoIE9DTSApIGZvciB0ZW1wZXJhcnkgc3RhY2sgdW50aWwgc2RyYW0gaXMgdGVzdGVkICovCisjZGVmaW5lIENGR19URU1QX1NUQUNLX09DTSAgICAgICAgMQorCisvKiBPbiBDaGlwIE1lbW9yeSBsb2NhdGlvbiAqLworI2RlZmluZSBDRkdfT0NNX0RBVEFfQUREUgkweEY4MDAwMDAwCisjZGVmaW5lIENGR19PQ01fREFUQV9TSVpFCTB4MTAwMAorCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCUNGR19PQ01fREFUQV9BRERSIC8qIGluc2lkZSBvZiBTRFJBTQkJKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAlDRkdfT0NNX0RBVEFfU0laRSAvKiBFbmQgb2YgdXNlZCBhcmVhIGluIFJBTQkqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRSAgICAgIDEyOCAgLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQgICAgKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUICAgICAgQ0ZHX0dCTF9EQVRBX09GRlNFVAorCisKKy8qCisgKiBJbnRlcm5hbCBEZWZpbml0aW9ucworICoKKyAqIEJvb3QgRmxhZ3MKKyAqLworI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9PWEMuaCBiL2luY2x1ZGUvY29uZmlncy9PWEMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTYwZTRiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL09YQy5oCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGJvYXJkL2NvbmZpZy5oIC0gY29uZmlndXJhdGlvbiBvcHRpb25zLCBib2FyZCBzcGVjaWZpYworICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisKKyNkZWZpbmUgQ09ORklHX01QQzgyNFgJCTEKKyNkZWZpbmUgQ09ORklHX01QQzgyNDAJCTEKKyNkZWZpbmUgQ09ORklHX09YQwkJMQorCisjZGVmaW5lIENPTkZJR19CT0FSRF9QUkVfSU5JVAkxCS8qIENhbGwgYm9hcmRfcHJlX2luaXQJKi8KKworI2RlZmluZSBDT05GSUdfSURFTlRfU1RSSU5HICAgICAiIFtveGNdICIKKworI2RlZmluZSBDT05GSUdfV0FUQ0hET0cJCTEKKyNkZWZpbmUgQ09ORklHX1NIT1dfQUNUSVZJVFkJMQorI2RlZmluZSBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTIDEKKworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAorI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9FTEYpCisKKy8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkJKi8KKyNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCTEJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KQkvKiBQcmludCBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4MDAxMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MJCSovCisjZGVmaW5lIENGR19IWgkJCTEwMDAJCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KKworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IJMQkJLyogY2FsbCBtaXNjX2luaXRfcigpIG9uIGluaXQJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9vdCBvcHRpb25zCisgKi8KKworI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTEwLjAuMC4xCisjZGVmaW5lIENPTkZJR19HQVRFV0FZSVAJMTAuMC4wLjEKKyNkZWZpbmUgQ09ORklHX05FVE1BU0sJCTI1NS4yNTUuMjU1LjAKKyNkZWZpbmUgQ09ORklHX0xPQURBRERSCQkweDEwMDAwCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJIi9tbnQvaWRlMC9wMi91c3IvdGZ0cC9veGMuZWxmIgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInRmdHAgMHgxMDAwMCA7IGJvb3RlbGYgMHgxMDAwMCIKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkxMAorCisjZGVmaW5lIENGR19PWENfR0VORVJBVEVfSVAJMQkJLyogR2VuZXJhdGUgSVAgYXV0b21hdGljYWxseQkqLworI2RlZmluZSBDRkdfT1hDX0lQTUFTSwkJMHgwQTAwMDAwMAkvKiAxMC4wLjAueAkJCSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBDSSBzdHVmZgorICovCisKKyNkZWZpbmUgQ09ORklHX1BDSQkJCQkvKiBpbmNsdWRlIHBjaSBzdXBwb3J0CQkqLworCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJCQkvKiBNdWx0aSBldGhlcm5ldCBjYXJkcyBzdXBwb3J0ICovCisKKyNkZWZpbmUgQ09ORklHX0VFUFJPMTAwCQkJCS8qIEV0aGVybmV0IEV4cHJlc3MgUFJPIDEwMAkqLworCisjZGVmaW5lIFBDSV9FTkVUMF9JT0FERFIJMHg4MDAwMDAwMAorI2RlZmluZSBQQ0lfRU5FVDBfTUVNQUREUgkweDgwMDAwMDAwCisjZGVmaW5lCVBDSV9FTkVUMV9JT0FERFIJMHg4MTAwMDAwMAorI2RlZmluZQlQQ0lfRU5FVDFfTUVNQUREUgkweDgxMDAwMDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZMQVNICisgKi8KKworI2RlZmluZSBDRkdfRkxBU0hfUFJFTElNQkFTRQkweEZGODAwMDAwCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkoMC1mbGFzaF9pbmZvWzBdLnNpemUpCisKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCS8qIG1heCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzCQkqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMzIJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJMTIwMDAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlIChpbiBtcykJKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJNTAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlIChpbiBtcykJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUkFNCisgKi8KKworI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfTUFYX1JBTV9TSVpFCTB4MTAwMDAwMDAKKworI2RlZmluZSBDRkdfUkVTRVRfQUREUkVTUwkweEZGRjAwMTAwCisKKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlURVhUX0JBU0UKKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkweDAwMDMwMDAwCisKKyNpZiAoQ0ZHX01PTklUT1JfQkFTRSA8IENGR19GTEFTSF9QUkVMSU1CQVNFKQorIyBkZWZpbmUgQ0ZHX1JBTUJPT1QJCTEKKyNlbHNlCisjIHVuZGVmIENGR19SQU1CT09UCisjZW5kaWYKKworI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUgkweDQwMDAwMDAwCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJMHgxMDAwCisKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMTI4CisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDUxMiA8PCAxMCkJLyogUmVzZXJ2ZSA1MTIga0IgZm9yIG1hbGxvYygpCSovCisKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDAwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCQkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MDQwMDAwMDAJLyogMCAuLi4gMzIgTUIgaW4gRFJBTQkJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTWVtb3J5IG1hcHBpbmcKKyAqLworCisjZGVmaW5lIENGR19DUExEX0JBU0UJCTB4ZmYwMDAwMDAJLyogQ1BMRCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ0ZHX0NQTERfV0FUQ0hET0cJKENGR19DUExEX0JBU0UpCQkJLyogV2F0Y2hkb2cgKi8KKyNkZWZpbmUgQ0ZHX0NQTERfUkVTRVQJCShDRkdfQ1BMRF9CQVNFICsgMHgwNDAwMDApCS8qIE1pbm9yIHJlc2V0cyAqLworI2RlZmluZSBDRkdfVUFSVF9CQVNFCQkoQ0ZHX0NQTERfQkFTRSArIDB4NzAwMDAwKQkvKiBkZWJ1ZyBVQVJUICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE5TMTY1NTAgQ29uZmlndXJhdGlvbgorICovCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCS00CisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJMTg0MzIwMAorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xCUNGR19VQVJUX0JBU0UKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSTJDIEJ1cworICovCisKKyNkZWZpbmUgQ09ORklHX0kyQwkJMQkJLyogSTJDIHN1cHBvcnQgb24gLi4uICovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJMQkJLyogLi4uIGhhcmR3YXJlIG9uZSAqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcwkqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCQkvKiBJMkMgc2xhdmUgYWRkcmVzcyAqLworCisjZGVmaW5lIENGR19JMkNfRVhQQU5ERVIwX0FERFIJMHgyMAkJLyogUENGODU3NCBleHBhbmRlciAwIGFkZHJlcnIgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19FWFBBTkRFUjFfQUREUgkweDIxCQkvKiBQQ0Y4NTc0IGV4cGFuZGVyIDEgYWRkcmVyciAqLworI2RlZmluZSBDRkdfSTJDX0VYUEFOREVSMl9BRERSCTB4MjYJCS8qIFBDRjg1NzQgZXhwYW5kZXIgMiBhZGRyZXJyICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVudmlyb25tZW50CisgKi8KKworI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkweEZGRjMwMDAwCS8qIE9mZnNldCBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDAwMDEwMDAwCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFICAgIDEJCS8qIEFsbG93IG1vZGlmeWluZyB0aGUgZW52aXJvbm1lbnQgKi8KKworLyoKKyAqIExvdyBMZXZlbCBDb25maWd1cmF0aW9uIFNldHRpbmdzCisgKiAoYWRkcmVzcyBtYXBwaW5ncywgcmVnaXN0ZXIgaW5pdGlhbCB2YWx1ZXMsIGV0Yy4pCisgKiBZb3Ugc2hvdWxkIGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIGlmIHlvdSBtYWtlIGNoYW5nZXMgaGVyZS4KKyAqLworCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgIDMzMDAwMDAwCS8qIGV4dGVybmFsIGZyZXF1ZW5jeSB0byBwbGwgKi8KKyNkZWZpbmUgQ09ORklHX1BMTF9QQ0lfVE9fTUVNX01VTFRJUExJRVIgIDIKKworI2RlZmluZSBDRkdfRVVNQl9BRERSCQkweEZDMDAwMDAwCisKKy8qIE1DQ1IxICovCisjZGVmaW5lIENGR19ST01OQUwJCTAJLyogcm9tL2ZsYXNoIG5leHQgYWNjZXNzIHRpbWUJCSovCisjZGVmaW5lIENGR19ST01GQUwJCTE5CS8qIHJvbS9mbGFzaCBhY2Nlc3MgdGltZQkJKi8KKworLyogTUNDUjIgKi8KKyNkZWZpbmUgQ0ZHX0FTUklTRQkJMTUJLyogQVNSSVNFPTE1IGNsb2NrcwkJCSovCisjZGVmaW5lIENGR19BU0ZBTEwJCTMJLyogQVNGQUxMPTMgY2xvY2tzCQkJKi8KKyNkZWZpbmUgQ0ZHX1JFRklOVAkJMTAwMAkvKiBSRUZJTlQ9MTAwMCBjbG9ja3MJCQkqLworCisvKiBNQ0NSMyAqLworI2RlZmluZSBDRkdfQlNUT1BSRQkJMHgzNWMJLyogQnVyc3QgVG8gUHJlY2hhcmdlCQkJKi8KKyNkZWZpbmUgQ0ZHX1JFRlJFQwkJNwkvKiBSZWZyZXNoIHRvIGFjdGl2YXRlIGludGVydmFsCQkqLworI2RlZmluZSBDRkdfUkRMQVQJCTQJLyogZGF0YSBsYXRlbmN5IGZyb20gcmVhZCBjb21tYW5kCSovCisKKy8qIE1DQ1I0ICovCisjZGVmaW5lIENGR19QUkVUT0FDVAkJMgkvKiBQcmVjaGFyZ2UgdG8gYWN0aXZhdGUgaW50ZXJ2YWwJKi8KKyNkZWZpbmUgQ0ZHX0FDVFRPUFJFCQk1CS8qIEFjdGl2YXRlIHRvIFByZWNoYXJnZSBpbnRlcnZhbAkqLworI2RlZmluZSBDRkdfQUNUT1JXCQkyCS8qIEFjdGl2YXRlIHRvIFIvVwkJCSovCisjZGVmaW5lIENGR19TRE1PREVfQ0FTX0xBVAkzCS8qIFNETU9ERSBDQVMgbGF0ZW5jeQkJCSovCisjZGVmaW5lIENGR19TRE1PREVfV1JBUAkJMAkvKiBTRE1PREUgd3JhcCB0eXBlCQkJKi8KKyNkZWZpbmUgQ0ZHX1NETU9ERV9CVVJTVExFTgkzCS8qIFNETU9ERSBCdXJzdCBsZW5ndGggMj00LCAzPTgJCSovCisjZGVmaW5lIENGR19SRUdJU1RFUkRfVFlQRV9CVUZGRVIgICAxCisKKy8qIG1lbW9yeSBiYW5rIHNldHRpbmdzKi8KKy8qCisgKiBvbmx5IGJpdHMgMjAtMjkgYXJlIGFjdHVhbGx5IHVzZWQgZnJvbSB0aGVzZSB2YWxlcyB0byBzZXQgdGhlCisgKiBzdGFydC9lbmQgYWRkcmVzcyB0aGUgdXBwZXIgdHdvIGJpdHMgd2lsbCBiZSAwLCBhbmQgdGhlIGxvd2VyIDIwCisgKiBiaXRzIHdpbGwgYmUgc2V0IHRvIDB4MDAwMDAgZm9yIGEgc3RhcnQgYWRkcmVzcywgb3IgMHhmZmZmZiBmb3IgYW4KKyAqIGVuZCBhZGRyZXNzCisgKi8KKyNkZWZpbmUgQ0ZHX0JBTkswX1NUQVJUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LMF9FTkQJCShDRkdfTUFYX1JBTV9TSVpFIC0gMSkKKyNkZWZpbmUgQ0ZHX0JBTkswX0VOQUJMRQkxCisjZGVmaW5lIENGR19CQU5LMV9TVEFSVAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzFfRU5ECQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LMV9FTkFCTEUJMAorI2RlZmluZSBDRkdfQkFOSzJfU1RBUlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTksyX0VORAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzJfRU5BQkxFCTAKKyNkZWZpbmUgQ0ZHX0JBTkszX1NUQVJUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LM19FTkQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTkszX0VOQUJMRQkwCisjZGVmaW5lIENGR19CQU5LNF9TVEFSVAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzRfRU5ECQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LNF9FTkFCTEUJMAorI2RlZmluZSBDRkdfQkFOSzVfU1RBUlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks1X0VORAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzVfRU5BQkxFCTAKKyNkZWZpbmUgQ0ZHX0JBTks2X1NUQVJUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LNl9FTkQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks2X0VOQUJMRQkwCisjZGVmaW5lIENGR19CQU5LN19TVEFSVAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzdfRU5ECQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LN19FTkFCTEUJMAorLyoKKyAqIE1lbW9yeSBiYW5rIGVuYWJsZSBiaXRtYXNrLCBzcGVjaWZ5aW5nIHdoaWNoIG9mIHRoZSBiYW5rcyBkZWZpbmVkIGFib3ZlCisgYXJlIGFjdHVhbGx5IHByZXNlbnQuIE1TQiBpcyBmb3IgYmFuayAjNywgTFNCIGlzIGZvciBiYW5rICMwLgorICovCisjZGVmaW5lIENGR19CQU5LX0VOQUJMRQkJMHgwMQorCisjZGVmaW5lIENGR19PRENSCQkweGZmCS8qIGNvbmZpZ3VyZXMgbGluZSBkcml2ZXIgaW1wZWRhbmNlcywJKi8KKwkJCQkJLyogc2VlIDgyNDAgYm9vayBmb3IgYml0IGRlZmluaXRpb25zCSovCisjZGVmaW5lIENGR19QR01BWAkJMHgzMgkvKiBob3cgbG9uZyB0aGUgODI0MCByZXRhaW5zIHRoZQkqLworCQkJCQkvKiBjdXJyZW50bHkgYWNjZXNzZWQgcGFnZSBpbiBtZW1vcnkJKi8KKwkJCQkJLyogc2VlIDgyNDAgYm9vayBmb3IgZGV0YWlscwkJKi8KKworLyogU0RSQU0gMCAtIDI1Nk1CICovCisjZGVmaW5lIENGR19JQkFUMEwJKENGR19TRFJBTV9CQVNFIHwgQkFUTF9QUF8xMCB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDBVCShDRkdfU0RSQU1fQkFTRSB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisvKiBzdGFjayBpbiBEQ0FDSEUgQCAxR0IgKG5vIGJhY2tpbmcgbWVtKSAqLworI2RlZmluZSBDRkdfSUJBVDFMCShDRkdfSU5JVF9SQU1fQUREUiB8IEJBVExfUFBfMTAgfCBCQVRMX01FTUNPSEVSRU5DRSkKKyNkZWZpbmUgQ0ZHX0lCQVQxVQkoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRVX0JMXzEyOEsgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKworLyogUENJIG1lbW9yeSAqLworI2RlZmluZSBDRkdfSUJBVDJMCSgweDgwMDAwMDAwIHwgQkFUTF9QUF8xMCB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDJVCSgweDgwMDAwMDAwIHwgQkFUVV9CTF8yNTZNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisKKy8qIEZsYXNoLCBjb25maWcgYWRkcnMsIGV0YyAqLworI2RlZmluZSBDRkdfSUJBVDNMCSgweEYwMDAwMDAwIHwgQkFUTF9QUF8xMCB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDNVCSgweEYwMDAwMDAwIHwgQkFUVV9CTF8yNTZNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisKKyNkZWZpbmUgQ0ZHX0RCQVQwTAlDRkdfSUJBVDBMCisjZGVmaW5lIENGR19EQkFUMFUJQ0ZHX0lCQVQwVQorI2RlZmluZSBDRkdfREJBVDFMCUNGR19JQkFUMUwKKyNkZWZpbmUgQ0ZHX0RCQVQxVQlDRkdfSUJBVDFVCisjZGVmaW5lIENGR19EQkFUMkwJQ0ZHX0lCQVQyTAorI2RlZmluZSBDRkdfREJBVDJVCUNGR19JQkFUMlUKKyNkZWZpbmUgQ0ZHX0RCQVQzTAlDRkdfSUJBVDNMCisjZGVmaW5lIENGR19EQkFUM1UJQ0ZHX0lCQVQzVQorCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjQwIENQVQkJCSovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCisvKgorICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLworI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUENJNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvUENJNDA1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5YjhkNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9QQ0k0MDUuaApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogU3RlZmFuIFJvZXNlLCBlc2QgZ21iaCBnZXJtYW55LCBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBib2FyZC9jb25maWcuaCAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYm9hcmQgc3BlY2lmaWMKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworCisjZGVmaW5lIENPTkZJR180MDVHUAkJMQkvKiBUaGlzIGlzIGEgUFBDNDA1IENQVQkJKi8KKyNkZWZpbmUgQ09ORklHXzR4eAkJMQkvKiAuLi5tZW1iZXIgb2YgUFBDNHh4IGZhbWlseSAgICovCisjZGVmaW5lIENPTkZJR19QQ0k0MDUJCTEJLyogLi4ub24gYSBQQ0k0MDUgYm9hcmQJICAgICAgICAqLworCisjZGVmaW5lIENPTkZJR19CT0FSRF9QUkVfSU5JVCAgIDEgICAgICAgLyogY2FsbCBib2FyZF9wcmVfaW5pdCgpICAgICAgICAqLworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IJMQkvKiBjYWxsIG1pc2NfaW5pdF9yKCkgb24gaW5pdAkqLworCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgICAgIDI1MDAwMDAwIC8qIGV4dGVybmFsIGZyZXF1ZW5jeSB0byBwbGwgICAqLworCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMJLyogYXV0b2Jvb3QgYWZ0ZXIgMyBzZWNvbmRzCSovCisKKyNpZiAwCisjZGVmaW5lIENPTkZJR19QUkVCT09UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImNyYzMyIGYwMjA3MDA0IGZmYyAwOyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiaWYgY21wIDAgZjAyMDcwMDAgMTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJ0aGVuO2VjaG8gT2xkIENSQyBpcyBjb3JyZWN0O2NyYzMyIGYwMjA3MDA0IGZmNCBmMDIwNzAwMDsiICAgICAgICAgICAgIFwKKyAgICAgICAgImVsc2U7ZWNobyBPbGQgQ1JDIGlzIGJhZDtmaSIKKyNlbmRpZgorCisjdW5kZWYJQ09ORklHX0JPT1RBUkdTCisjaWYgMQorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJCQkJCQkJXAorCSJib290bSBmZmZjMDAwMCIKKyNlbHNlCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkJCQkJCQlcCisJIm13LmwgMCBmZmZmZmZmZjsgbXcubCA0IGZmZmZmZmZmOyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAid2hpbGUgY21wIDAgNCAxOyBkbyBlY2hvIFdhaXRpbmcgZm9yIEhvc3QuLi47ZG9uZTsiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJib290bSA0MDAwMDAiCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLworI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KKworI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KKyNkZWZpbmUJQ09ORklHX1BIWV9BRERSCQkwCS8qIFBIWSBhZGRyZXNzCQkJKi8KKworI2RlZmluZSBDT05GSUdfUlRDX000OFQzNUEJMQkJLyogU1QgRWxlY3Ryb25pY3MgTTQ4IHRpbWVrZWVwZXIgKi8KKworI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKKwkJCQlDRkdfQ01EX1BDSQl8IFwKKwkJCQlDRkdfQ01EX0lSUQl8IFwKKwkJCQlDRkdfQ01EX0VMRgl8IFwKKwkJCQlDRkdfQ01EX0RBVEUJfCBcCisJCQkJQ0ZHX0NNRF9JMkMJfCBcCisJCQkJQ0ZHX0NNRF9FRVBST00gICkKKworLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLworI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisjdW5kZWYgIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLworCisjZGVmaW5lCUNPTkZJR19TRFJBTV9CQU5LMAkxCS8qIGluaXQgb25ib2FyZCBTRFJBTSBiYW5rIDAJKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworCisjZGVmaW5lCUNGR19IVVNIX1BBUlNFUgkJCS8qIHVzZSAiaHVzaCIgY29tbWFuZCBwYXJzZXIJKi8KKyNpZmRlZglDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCisjZW5kaWYKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbHNlCisjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2VuZGlmCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENGR19ERVZJQ0VfTlVMTERFViAgICAgIDEgICAgICAgLyogaW5jbHVkZSBudWxsZGV2IGRldmljZSAgICAgICAqLworCisjZGVmaW5lIENGR19DT05TT0xFX0lORk9fUVVJRVQgIDEgICAgICAgLyogZG9uJ3QgcHJpbnQgY29uc29sZSBAIHN0YXJ0dXAqLworCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDQwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwQzAwMDAwCS8qIDQgLi4uIDEyIE1CIGluIERSQU0JKi8KKworI3VuZGVmICBDRkdfRVhUX1NFUklBTF9DTE9DSyAgICAgICAgICAgLyogbm8gZXh0ZXJuYWwgc2VyaWFsIGNsb2NrIHVzZWQgKi8KKyNkZWZpbmUgQ0ZHX0lHTk9SRV80MDVfVUFSVF9FUlJBVEFfNTkgICAvKiBpZ25vcmUgcHBjNDA1Z3AgZXJyYXRhICM1OSAgICovCisjZGVmaW5lIENGR19CQVNFX0JBVUQgICAgICAgNjkxMjAwCisKKy8qIFRoZSBmb2xsb3dpbmcgdGFibGUgaW5jbHVkZXMgdGhlIHN1cHBvcnRlZCBiYXVkcmF0ZXMgKi8KKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFICAgICAgXAorICAgICAgICB7IDMwMCwgNjAwLCAxMjAwLCAyNDAwLCA0ODAwLCA5NjAwLCAxOTIwMCwgMzg0MDAsICAgICBcCisgICAgICAgICA1NzYwMCwgMTE1MjAwLCAyMzA0MDAsIDQ2MDgwMCwgOTIxNjAwIH0KKworI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MTAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19FWFRCRElORk8JMQkJLyogVG8gdXNlIGV4dGVuZGVkIGJvYXJkX2ludG8gKGJkX3QpICovCisKKyNkZWZpbmUJQ0ZHX0haCQkxMDAwCQkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzCSovCisKKyNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCS8qIGNoZWNrIGZvciBrZXlwcmVzcyBvbiBib290ZGVsYXk9PTAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUENJIHN0dWZmCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgUENJX0hPU1RfQURBUFRFUiAwICAgICAgICAgICAgICAvKiBjb25maWd1cmUgYXMgcGNpIGFkYXB0ZXIgICAgICovCisjZGVmaW5lIFBDSV9IT1NUX0ZPUkNFICAxICAgICAgICAgICAgICAgLyogY29uZmlndXJlIGFzIHBjaSBob3N0ICAgICAgICAqLworI2RlZmluZSBQQ0lfSE9TVF9BVVRPICAgMiAgICAgICAgICAgICAgIC8qIGRldGVjdGVkIHZpYSBhcmJpdGVyIGVuYWJsZSAgKi8KKworI2RlZmluZSBDT05GSUdfUENJCQkJLyogaW5jbHVkZSBwY2kgc3VwcG9ydAkgICAgICAgICovCisjZGVmaW5lIENPTkZJR19QQ0lfSE9TVAlQQ0lfSE9TVF9BREFQVEVSIC8qIHNlbGVjdCBwY2kgaG9zdCBmdW5jdGlvbiAgICAqLworI3VuZGVmICBDT05GSUdfUENJX1BOUAkJCS8qIG5vIHBjaSBwbHVnLWFuZC1wbGF5ICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNvdXJjZSBjb25maWd1cmF0aW9uICAgICAgICovCisKKyNkZWZpbmUgQ09ORklHX1BDSV9TQ0FOX1NIT1cgICAgICAgICAgICAvKiBwcmludCBwY2kgZGV2aWNlcyBAIHN0YXJ0dXAgICovCisKKyNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfVkVORE9SSUQgMHgxMkZFICAvKiBQQ0kgVmVuZG9yIElEOiBlc2QgZ21iaCAgICAgICovCisjZGVmaW5lIENGR19QQ0lfU1VCU1lTX0RFVklDRUlEIDB4MDQwNyAgLyogUENJIERldmljZSBJRDogUENJLTQwNSAgICAgICAqLworI2RlZmluZSBDRkdfUENJX0NMQVNTQ09ERSAgICAgICAweDAyODAgIC8qIFBDSSBDbGFzcyBDb2RlOiBOZXR3b3JrL090aGVyKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0xTEEgIDB4MDAwMDAwMDAgICAgICAvKiBwb2ludCB0byBzZHJhbSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMU1TICAweGZjMDAwMDAxICAgICAgLyogNjRNQiwgZW5hYmxlIGhhcmQtd2lyZWQgdG8gMSAqLworI2RlZmluZSBDRkdfUENJX1BUTTFQQ0kgMHgwMDAwMDAwMCAgICAgIC8qIEhvc3Q6IHVzZSB0aGlzIHBjaSBhZGRyZXNzICAgKi8KKworI2lmIDAgLyogdGVzdC1vbmx5ICovCisjZGVmaW5lIENGR19QQ0lfUFRNMkxBICAweGZmYzAwMDAwICAgICAgLyogcG9pbnQgdG8gZmxhc2ggICAgICAgICAgICAgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTJNUyAgMHhmZmMwMDAwMSAgICAgIC8qIDRNQiwgZW5hYmxlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0yUENJIDB4MDQwMDAwMDAgICAgICAvKiBIb3N0OiB1c2UgdGhpcyBwY2kgYWRkcmVzcyAgICovCisjZWxzZQorI2RlZmluZSBDRkdfUENJX1BUTTJMQSAgMHhlZjYwMDAwMCAgICAgIC8qIHBvaW50IHRvIGludGVybmFsIHJlZ3MgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0yTVMgIDB4ZWY2MDAwMDEgICAgICAvKiA0TUIsIGVuYWJsZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19QQ0lfUFRNMlBDSSAweDA0MDAwMDAwICAgICAgLyogSG9zdDogdXNlIHRoaXMgcGNpIGFkZHJlc3MgICAqLworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXJ0IGFkZHJlc3NlcyBmb3IgdGhlIGZpbmFsIG1lbW9yeSBjb25maWd1cmF0aW9uCisgKiAoU2V0IHVwIGJ5IHRoZSBzdGFydHVwIGNvZGUpCisgKiBQbGVhc2Ugbm90ZSB0aGF0IENGR19TRFJBTV9CQVNFIF9tdXN0XyBzdGFydCBhdCAwCisgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4RkZGRDAwMDAKKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlDRkdfRkxBU0hfQkFTRQorI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgxOTIgKiAxMDI0KQkvKiBSZXNlcnZlIDE5NiBrQiBmb3IgTW9uaXRvcgkqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDEyOCAqIDEwMjQpCS8qIFJlc2VydmUgMTI4IGtCIGZvciBtYWxsb2MoKQkqLworCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRkxBU0ggb3JnYW5pemF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCS8qIG1heCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzCQkqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMjU2CS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcAkqLworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAgICAgdW5zaWduZWQgc2hvcnQgIC8qIGZsYXNoIHdvcmQgc2l6ZSAod2lkdGgpICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0FERFIwICAgICAgICAgMHg1NTU1ICAvKiAxc3QgYWRkcmVzcyBmb3IgZmxhc2ggY29uZmlnIGN5Y2xlcyAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0FERFIxICAgICAgICAgMHgyQUFBICAvKiAybmQgYWRkcmVzcyBmb3IgZmxhc2ggY29uZmlnIGN5Y2xlcyAgKi8KKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGFkZGVkIGZvciBidWdneSBJT1A0ODAgYnl0ZSBpbnRlcmZhY2UuCisgKiBBbGwgb3RoZXIgYm9hcmRzIHNob3VsZCB1c2UgdGhlIHN0YW5kYXJkIHZhbHVlcyAoQ1BDSTQwNSBldGMuKQorICovCisjZGVmaW5lIENGR19GTEFTSF9SRUFEMCAgICAgICAgIDB4MDAwMCAgLyogMCBpcyBzdGFuZGFyZCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19GTEFTSF9SRUFEMSAgICAgICAgIDB4MDAwMSAgLyogMSBpcyBzdGFuZGFyZCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19GTEFTSF9SRUFEMiAgICAgICAgIDB4MDAwMiAgLyogMiBpcyBzdGFuZGFyZCAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8gICAgICAgICAgICAvKiBwcmludCAnRScgZm9yIGVtcHR5IHNlY3RvciBvbiBmbGluZm8gKi8KKworI2lmIDAgLyogVXNlIE5WUkFNIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE5WUkFNIG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19FTlZfSVNfSU5fTlZSQU0JMQkvKiB1c2UgTlZSQU0gZm9yIGVudmlyb25tZW50IHZhcnMJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDBmZjgJCS8qIFNpemUgb2YgRW52aXJvbm1lbnQgdmFycwkqLworI2RlZmluZSBDRkdfRU5WX0FERFIJCVwKKwkoQ0ZHX05WUkFNX0JBU0VfQUREUitDRkdfTlZSQU1fU0laRS0oQ0ZHX0VOVl9TSVpFKzgpKQkvKiBFbnYJKi8KKworI2Vsc2UgLyogVXNlIEVFUFJPTSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisKKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9FRVBST00gICAgMSAgICAgICAvKiB1c2UgRUVQUk9NIGZvciBlbnZpcm9ubWVudCB2YXJzICovCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUICAgICAgICAgIDB4MDAwICAgLyogZW52aXJvbm1lbnQgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIEVFUFJPTSAqLworI2RlZmluZSBDRkdfRU5WX1NJWkUgICAgICAgICAgICAweDQwMCAgIC8qIDEwMjQgYnl0ZXMgbWF5IGJlIHVzZWQgZm9yIGVudiB2YXJzKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG90YWwgc2l6ZSBvZiBhIENBVDI0V0MwOCBpcyAxMDI0IGJ5dGVzICovCisjZW5kaWYKKworI2RlZmluZSBDRkdfTlZSQU1fQkFTRV9BRERSCTB4ZjAyMDAwMDAJCS8qIE5WUkFNIGJhc2UgYWRkcmVzcwkqLworI2RlZmluZSBDRkdfTlZSQU1fU0laRQkJKDMyKjEwMjQpCQkvKiBOVlJBTSBzaXplCQkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJMkMgRUVQUk9NIChDQVQyNFdDMTYpIGZvciBlbnZpcm9ubWVudAorICovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJCS8qIEkyYyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCisKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDUwCS8qIEVFUFJPTSBDQVQyOFdDMDgJCSovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOCTEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KKy8qIG1hc2sgb2YgYWRkcmVzcyBiaXRzIHRoYXQgb3ZlcmZsb3cgaW50byB0aGUgIkVFUFJPTSBjaGlwIGFkZHJlc3MiICAgICovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfT1ZFUkZMT1cJMHgwNworI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfQklUUyA0CS8qIFRoZSBDYXRhbHlzdCBDQVQyNFdDMDggaGFzCSovCisJCQkJCS8qIDE2IGJ5dGUgcGFnZSB3cml0ZSBtb2RlIHVzaW5nKi8KKwkJCQkJLyogbGFzdAk0IGJpdHMgb2YgdGhlIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTEwICAgLyogYW5kIHRha2VzIHVwIHRvIDEwIG1zZWMgKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0VOQUJMRQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBJQk0gNDA1IENQVXMJCQkqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKyNlbmRpZgorCisvKgorICogSW5pdCBNZW1vcnkgQ29udHJvbGxlcjoKKyAqCisgKiBCUjAvMSBhbmQgT1IwLzEgKEZMQVNIKQorICovCisKKyNkZWZpbmUgRkxBU0hfQkFTRTBfUFJFTElNCTB4RkZFMDAwMDAJLyogRkxBU0ggYmFuayAjMAkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBCdXMgQ29udHJvbGxlciAoRUJDKSBTZXR1cAorICovCisKKy8qIE1lbW9yeSBCYW5rIDAgKEZsYXNoIEJhbmsgMCkgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjBBUCAgICAgICAgICAgMHg5MjAxNTQ4MAorI2RlZmluZSBDRkdfRUJDX1BCMENSICAgICAgICAgICAweEZGQzVBMDAwICAvKiBCQVM9MHhGRkMsQlM9NE1CLEJVPVIvVyxCVz0xNmJpdCAqLworCisvKiBNZW1vcnkgQmFuayAxIChOVlJBTS9SVEMpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19FQkNfUEIxQVAgICAgICAgICAgIDB4MDEwMDUyODAgIC8qIFRXVD0yLFdCTj0xLFdCRj0xLFRIPTEsU09SPTEgICAgICovCisjZGVmaW5lIENGR19FQkNfUEIxQ1IgICAgICAgICAgIDB4RjAyMTgwMDAgIC8qIEJBUz0weEYwMixCUz0xTUIsQlU9Ui9XLEJXPThiaXQgICovCisKKy8qIE1lbW9yeSBCYW5rIDIgKENBTjAsIDEpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjJBUCAgICAgICAgICAgMHgwMTAwNTNDMCAgLyogQldUPTIsV0JOPTEsV0JGPTEsVEg9MSxSRT0xLFNPUj0xLEJFTT0xICovCisjZGVmaW5lIENGR19FQkNfUEIyQ1IgICAgICAgICAgIDB4RjAwMTgwMDAgIC8qIEJBUz0weEYwMCxCUz0xTUIsQlU9Ui9XLEJXPThiaXQgICovCisKKy8qIE1lbW9yeSBCYW5rIDMgKEZQR0EgaW50ZXJuYWwpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjNBUCAgICAgICAgICAgMHgwMTAwNTNDMCAgLyogQldUPTIsV0JOPTEsV0JGPTEsVEg9MSxSRT0xLFNPUj0xLEJFTT0xICovCisjZGVmaW5lIENGR19FQkNfUEIzQ1IgICAgICAgICAgIDB4RjA0MUMwMDAgIC8qIEJBUz0weEYwMSxCUz0xTUIsQlU9Ui9XLEJXPTMyYml0ICovCisjZGVmaW5lIENGR19GUEdBX0JBU0VfQUREUiAgICAgIDB4RjA0MDAwMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRlBHQSBzdHVmZgorICovCisvKiBGUEdBIGludGVybmFsIHJlZ3MgKi8KKyNkZWZpbmUgQ0ZHX0ZQR0FfTU9ERSAgICAgICAgICAgMHgwMAorI2RlZmluZSBDRkdfRlBHQV9TVEFUVVMgICAgICAgICAweDAyCisjZGVmaW5lIENGR19GUEdBX1RTICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQ0ZHX0ZQR0FfVFNfTE9XICAgICAgICAgMHgwNgorI2RlZmluZSBDRkdfRlBHQV9UU19DQVAwICAgICAgICAweDEwCisjZGVmaW5lIENGR19GUEdBX1RTX0NBUDBfTE9XICAgIDB4MTIKKyNkZWZpbmUgQ0ZHX0ZQR0FfVFNfQ0FQMSAgICAgICAgMHgxNAorI2RlZmluZSBDRkdfRlBHQV9UU19DQVAxX0xPVyAgICAweDE2CisjZGVmaW5lIENGR19GUEdBX1RTX0NBUDIgICAgICAgIDB4MTgKKyNkZWZpbmUgQ0ZHX0ZQR0FfVFNfQ0FQMl9MT1cgICAgMHgxYQorI2RlZmluZSBDRkdfRlBHQV9UU19DQVAzICAgICAgICAweDFjCisjZGVmaW5lIENGR19GUEdBX1RTX0NBUDNfTE9XICAgIDB4MWUKKworLyogRlBHQSBNb2RlIFJlZyAqLworI2RlZmluZSBDRkdfRlBHQV9NT0RFX0NGX1JFU0VUICAweDAwMDEKKyNkZWZpbmUgQ0ZHX0ZQR0FfTU9ERV9UU19JUlFfRU5BQkxFIDB4MDEwMAorI2RlZmluZSBDRkdfRlBHQV9NT0RFX1RTX0lSUV9DTEVBUiAgMHgxMDAwCisjZGVmaW5lIENGR19GUEdBX01PREVfVFNfQ0xFQVIgIDB4MjAwMAorCisvKiBGUEdBIFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgQ0ZHX0ZQR0FfU1RBVFVTX0RJUDAgICAgMHgwMDAxCisjZGVmaW5lIENGR19GUEdBX1NUQVRVU19ESVAxICAgIDB4MDAwMgorI2RlZmluZSBDRkdfRlBHQV9TVEFUVVNfRElQMiAgICAweDAwMDQKKyNkZWZpbmUgQ0ZHX0ZQR0FfU1RBVFVTX0ZMQVNIICAgMHgwMDA4CisjZGVmaW5lIENGR19GUEdBX1NUQVRVU19UU19JUlEgIDB4MTAwMAorCisjZGVmaW5lIENGR19GUEdBX1NQQVJUQU4yICAgICAgIDEgICAgICAgICAgIC8qIHVzaW5nIFhpbGlueCBTcGFydGFuIDIgbm93ICAgICovCisjZGVmaW5lIENGR19GUEdBX01BWF9TSVpFICAgICAgIDMyKjEwMjQgICAgIC8qIDMya0J5dGUgaXMgZW5vdWdoIGZvciBYQzJTMTUgICovCisKKy8qIEZQR0EgcHJvZ3JhbSBwaW4gY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDRkdfRlBHQV9QUkcgICAgICAgICAgICAweDA0MDAwMDAwICAvKiBGUEdBIHByb2dyYW0gcGluIChwcGMgb3V0cHV0KSAqLworI2RlZmluZSBDRkdfRlBHQV9DTEsgICAgICAgICAgICAweDAyMDAwMDAwICAvKiBGUEdBIGNsayBwaW4gKHBwYyBvdXRwdXQpICAgICAqLworI2RlZmluZSBDRkdfRlBHQV9EQVRBICAgICAgICAgICAweDAxMDAwMDAwICAvKiBGUEdBIGRhdGEgcGluIChwcGMgb3V0cHV0KSAgICAqLworI2RlZmluZSBDRkdfRlBHQV9JTklUICAgICAgICAgICAweDAwNDAwMDAwICAvKiBGUEdBIGluaXQgcGluIChwcGMgaW5wdXQpICAgICAqLworI2RlZmluZSBDRkdfRlBHQV9ET05FICAgICAgICAgICAweDAwODAwMDAwICAvKiBGUEdBIGRvbmUgcGluIChwcGMgaW5wdXQpICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWZpbml0aW9ucyBmb3IgaW5pdGlhbCBzdGFjayBwb2ludGVyIGFuZCBkYXRhIGFyZWEgKGluIGRhdGEgY2FjaGUpCisgKi8KKyNpZiAxIC8qIHRlc3Qtb25seSAqLworI2RlZmluZSBDRkdfSU5JVF9EQ0FDSEVfQ1MgICAgICA3ICAgICAgIC8qIHVzZSBjcyAjIDcgZm9yIGRhdGEgY2FjaGUgbWVtb3J5ICAgICovCisKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIgICAgICAgMHg0MDAwMDAwMCAgLyogdXNlIGRhdGEgY2FjaGUgICAgICAgICAgICAgICAgICAqLworI2Vsc2UKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJMHgwMGRmMDAwMCAvKiBpbnNpZGUgb2YgU0RSQU0gICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5EICAgICAgICAweDIwMDAgIC8qIEVuZCBvZiB1c2VkIGFyZWEgaW4gUkFNICAgICAgICAgICAgICovCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFICAgICAgMTI4ICAvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVCAgICAoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQgICAgICBDRkdfR0JMX0RBVEFfT0ZGU0VUCisKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BJUDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL1BJUDQwNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZmM4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUElQNDA1LmgKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIGJvYXJkL2NvbmZpZy5oIC0gY29uZmlndXJhdGlvbiBvcHRpb25zLCBib2FyZCBzcGVjaWZpYworICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ09ORklHXzQwNUdQCQkxCS8qIFRoaXMgaXMgYSBQUEM0MDUgQ1BVCQkqLworI2RlZmluZSBDT05GSUdfNHh4CQkxCS8qIC4uLm1lbWJlciBvZiBQUEM0eHggZmFtaWx5CSovCisjZGVmaW5lIENPTkZJR19QSVA0MDUJCTEJLyogLi4ub24gYSBQSVA0MDUgYm9hcmQJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENsb2NrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMzMwMDAwMDAgLyogZXh0ZXJuYWwgZnJlcXVlbmN5IHRvIHBsbAkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbW1hbmQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCisJCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCisJCQlDRkdfQ01EX0lERQl8IFwKKwkJCUNGR19DTURfREhDUAl8IFwKKwkJCUNGR19DTURfUENJCXwgXAorCQkJQ0ZHX0NNRF9DQUNIRQl8IFwKKwkJCUNGR19DTURfSVJRCXwgXAorCQkJQ0ZHX0NNRF9FRVBST00JfCBcCisJCQlDRkdfQ01EX0kyQwl8IFwKKwkJCUNGR19DTURfUkVHSU5GTyB8IFwKKwkJCUNGR19DTURfRkRDCXwgXAorCQkJQ0ZHX0NNRF9TQ1NJCXwgXAorCQkJQ0ZHX0NNRF9EQVRFCXwgXAorCQkJQ0ZHX0NNRF9FTEYJfCBcCisJCQlDRkdfQ01EX1VTQgl8IFwKKwkJCUNGR19DTURfTUlJCXwgXAorCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKKwkJCUNGR19DTURfRE9DCXwgXAorCQkJQ0ZHX0NNRF9TQVZFUyAgIHwgXAorCQkJQ0ZHX0NNRF9CU1AJKQorLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAgKGlmIGFueSkgKi8KKyNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworI2RlZmluZQkgQ0ZHX0hVU0hfUEFSU0VSCisjZGVmaW5lCSBDRkdfUFJPTVBUX0hVU0hfUFMyICI+ICIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSTJDIFN0dWZmOgorICogdGhlIFBJUDQwNSBpcyBlcXVpcGVkIHdpdGggYW4gQXRtZWwgMjRDMTI4LzI1NiBFRVBST00gYXQgYWRkcmVzcworICogMHg1My4KKyAqIENhdXRpb246IG9uIHRoZSBzYW1lIGJ1cyBpcyB0aGUgU1BEIChTZXJpYWwgUHJlc2VucyBEZXRlY3QKKyAqIEVFUFJPTSBvZiB0aGUgU0RSQU0KKyAqIFRoZSBBdG1lbCBFRVBST00gdXNlcyAxNkJpdCBhZGRyZXNzaW5nLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCQkJLyogSTJjIHdpdGggaGFyZHdhcmUgc3VwcG9ydCAqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk1MDAwMAkvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHg3RgorCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFIJMHg1MworI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTgkyCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRUVQUk9NICAgIDEgICAgICAgLyogdXNlIEVFUFJPTSBmb3IgZW52aXJvbm1lbnQgdmFycyAqLworI2RlZmluZSBDRkdfRU5WX09GRlNFVCAgICAgICAgICAweDAwMCAgIC8qIGVudmlyb25tZW50IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFICAgICAgICAgICAgMHg4MDAgICAvKiAyIGtCeXRlcyBtYXkgYmUgdXNlZCBmb3IgZW52IHZhcnMgKi8KKworI3VuZGVmIENGR19JMkNfRUVQUk9NX0FERFJfT1ZFUkZMT1cKKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0JJVFMgNgkvKiBUaGUgQXRtZWwgMjRDMTI4LzI1NiBoYXMJKi8KKwkJCQkJLyogNjQgYnl0ZSBwYWdlIHdyaXRlIG1vZGUgdXNpbmcqLworCQkJCQkvKiBsYXN0CTYgYml0cyBvZiB0aGUgYWRkcmVzcwkqLworI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfRU5BQkxFCS8qIGVuYWJsZSBQYWdlIHdyaXRlICovCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9ERUxBWV9NUwkxMAkvKiBhbmQgdGFrZXMgdXAgdG8gMTAgbXNlYyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluaXRpb25zIGZvciBTZXJpYWwgUHJlc2VuY2UgRGV0ZWN0IEVFUFJPTSBhZGRyZXNzCisgKiAodG8gZ2V0IFNEUkFNIHNldHRpbmdzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU1BEX0VFUFJPTV9BRERSRVNTICAgICAgMHg1MAorCisjZGVmaW5lIENPTkZJR19CT0FSRF9QUkVfSU5JVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFbnZpcm9ubWVudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAJLyogU1REIEJhdWRyYXRlICovCisKKworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKKy8qIGF1dG9ib290IChkbyBOT1QgY2hhbmdlIHRoaXMgc2V0IGVudmlyb25tZW50IHZhcmlhYmxlICJib290ZGVsYXkiIHRvIC0xIGluc3RlYWQpICovCisjZGVmaW5lIENPTkZJR19CT09UX1JFVFJZX1RJTUUJLTEwCS8qIGZlYXR1cmUgaXMgYXZhaWFibGUgYnV0IG5vdCBlbmFibGVkICovCisjZGVmaW5lIENPTkZJR19aRVJPX0JPT1RERUxBWV9DSEVDSyAgCS8qIGNoZWNrIGNvbnNvbGUgZXZlbiBpZiBib290ZGVsYXkgPSAwICovCisKKworI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImRpc2tib290IDIwMDAwMCAwOjE7IGJvb3RtIiAvKiBhdXRvYm9vdCBjb21tYW5kCQkqLworI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJjb25zb2xlPXR0eVMwLDk2MDAgcm9vdD0vZGV2L2hkYTUiIC8qIGJvb3QgYXJndW1lbnRzICovCisKKyNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTAuMC4wLjEwMAorI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTEwLjAuMC4xCisjZGVmaW5lIENPTkZJR19QUkVCT09UCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBkZWZpbmVzIGlmIHRoZSBjb25zb2xlIGlzIHN0b3JlZCBpbiB0aGUgZW52aXJvbm1lbnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENGR19DT05TT0xFX0lTX0lOX0VOVgkvKiBzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIGluIGV2aXJvbm1lbnQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRlZmluZXMgaWYgYW4gb3ZlcndyaXRlX2NvbnNvbGUgZnVuY3Rpb24gZXhpc3RzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ0ZHX0NPTlNPTEVfT1ZFUldSSVRFX1JPVVRJTkUKKyNkZWZpbmUgQ0ZHX0NPTlNPTEVfSU5GT19RVUlFVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZGVmaW5lcyBpZiB0aGUgb3ZlcndyaXRlX2NvbnNvbGUgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUKKyAqIGVudmlyb25tZW50CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjdW5kZWYgQ0ZHX0NPTlNPTEVfRU5WX09WRVJXUklURQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGxvYWRzIGNvbmZpZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCisjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZQkqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2Vsc2UKKyNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZW5kaWYKKyNkZWZpbmUgQ0ZHX1BCU0laRSAoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19NQVhBUkdTCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMTAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDBDMDAwMDAJLyogMSAuLi4gMTIgTUIgaW4gRFJBTQkqLworCisjdW5kZWYJQ0ZHX0VYVF9TRVJJQUxfQ0xPQ0sJICAgICAgIC8qIG5vIGV4dGVybmFsIHNlcmlhbCBjbG9jayB1c2VkICovCisjZGVmaW5lIENGR19CQVNFX0JBVUQgICAgICAgNjkxMjAwCisKKy8qIFRoZSBmb2xsb3dpbmcgdGFibGUgaW5jbHVkZXMgdGhlIHN1cHBvcnRlZCBiYXVkcmF0ZXMgKi8KKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCVwKKwl7IDMwMCwgNjAwLCAxMjAwLCAyNDAwLCA0ODAwLCA5NjAwLCAxOTIwMCwgMzg0MDAsICAgICBcCisJIDU3NjAwLCAxMTUyMDAsIDIzMDQwMCwgNDYwODAwLCA5MjE2MDAgfQorCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4MjAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19FWFRCRElORk8JCTEJLyogVG8gdXNlIGV4dGVuZGVkIGJvYXJkX2ludG8gKGJkX3QpICovCisKKyNkZWZpbmUgQ0ZHX0haCQkxMDAwCQkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBDSSBzdHVmZgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIFBDSV9IT1NUX0FEQVBURVIgMCAgICAgICAgICAgICAgLyogY29uZmlndXJlIGFyIHBjaSBhZGFwdGVyICAgICAqLworI2RlZmluZSBQQ0lfSE9TVF9GT1JDRSAgMSAgICAgICAgICAgICAgIC8qIGNvbmZpZ3VyZSBhcyBwY2kgaG9zdCAgICAgICAgKi8KKyNkZWZpbmUgUENJX0hPU1RfQVVUTyAgIDIgICAgICAgICAgICAgICAvKiBkZXRlY3RlZCB2aWEgYXJiaXRlciBlbmFibGUgICovCisKKyNkZWZpbmUgQ09ORklHX1BDSQkJCS8qIGluY2x1ZGUgcGNpIHN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19QQ0lfSE9TVCBQQ0lfSE9TVF9GT1JDRQkvKiBjb25maWd1cmUgYXMgcGNpLWhvc3QJKi8KKyNkZWZpbmUgQ09ORklHX1BDSV9QTlAJCQkvKiBwY2kgcGx1Zy1hbmQtcGxheQkJKi8KKwkJCQkJLyogcmVzb3VyY2UgY29uZmlndXJhdGlvbgkqLworI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDAwMDAJLyogUENJIFZlbmRvciBJRDogdG8tZG8hISEJKi8KKyNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfREVWSUNFSUQgMHgwMDAwCS8qIFBDSSBEZXZpY2UgSUQ6IHRvLWRvISEhCSovCisjZGVmaW5lIENGR19QQ0lfUFRNMUxBCTB4MDAwMDAwMDAJLyogcG9pbnQgdG8gc2RyYW0JCSovCisjZGVmaW5lIENGR19QQ0lfUFRNMU1TCTB4ODAwMDAwMDEJLyogMkdCLCBlbmFibGUgaGFyZC13aXJlZCB0byAxCSovCisjZGVmaW5lIENGR19QQ0lfUFRNMVBDSSAweDAwMDAwMDAwICAgICAgLyogSG9zdDogdXNlIHRoaXMgcGNpIGFkZHJlc3MgICAqLworI2RlZmluZSBDRkdfUENJX1BUTTJMQQkweDAwMDAwMDAwCS8qIGRpc2FibGVkCQkJKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QVE0yTVMJMHgwMDAwMDAwMAkvKiBkaXNhYmxlZAkJCSovCisjZGVmaW5lIENGR19QQ0lfUFRNMlBDSSAweDAwMDAwMDAwICAgICAgLyogSG9zdDogdXNlIHRoaXMgcGNpIGFkZHJlc3MgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFydCBhZGRyZXNzZXMgZm9yIHRoZSBmaW5hbCBtZW1vcnkgY29uZmlndXJhdGlvbgorICogKFNldCB1cCBieSB0aGUgc3RhcnR1cCBjb2RlKQorICogUGxlYXNlIG5vdGUgdGhhdCBDRkdfU0RSQU1fQkFTRSBfbXVzdF8gc3RhcnQgYXQgMAorICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZGRjgwMDAwCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJQ0ZHX0ZMQVNIX0JBU0UKKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoNTEyICogMTAyNCkJLyogUmVzZXJ2ZSA1MTIga0IgZm9yIE1vbml0b3IJKi8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSgxMjggKiAxMDI0KQkvKiBSZXNlcnZlIDEyOCBrQiBmb3IgbWFsbG9jKCkJKi8KKworLyoKKyAqIEZvciBib290aW5nIExpbnV4LCB0aGUgYm9hcmQgaW5mbyBhbmQgY29tbWFuZCBsaW5lIGRhdGEKKyAqIGhhdmUgdG8gYmUgaW4gdGhlIGZpcnN0IDggTUIgb2YgbWVtb3J5LCBzaW5jZSB0aGlzIGlzCisgKiB0aGUgbWF4aW11bSBtYXBwZWQgYnkgdGhlIExpbnV4IGtlcm5lbCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKi8KKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXggKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZMQVNIIG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkvKiBtYXggbnVtYmVyIG9mIG1lbW9yeSBiYW5rcwkJKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTI1NgkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAJKi8KKworI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkxMjAwMDAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKGluIG1zKQkqLworI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAk1MDAJLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKGluIG1zKQkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBJQk0gNDA1IENQVXMJCQkqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKyNlbmRpZgorCisvKgorICogSW5pdCBNZW1vcnkgQ29udHJvbGxlcjoKKyAqLworCisjZGVmaW5lIEZMQVNIX0JBU0UwX1BSRUxJTQkweEZGQzAwMDAwCS8qIEZMQVNIIGJhbmsgIzAJKi8KKyNkZWZpbmUgRkxBU0hfQkFTRTFfUFJFTElNCTAJCS8qIEZMQVNIIGJhbmsgIzEJKi8KKworLyogQ29uZmlndXJhdGlvbiBQb3J0IGxvY2F0aW9uICovCisjZGVmaW5lIENPTkZJR19QT1JUX0FERFIJMHhGNDAwMDAwMAorI2RlZmluZSBNVUxUSV9QVVJQT1NFX1NPQ0tFVF9BRERSIDB4RjgwMDAwMDAKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb25zIGZvciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgYW5kIGRhdGEgYXJlYSAoaW4gT24gQ2hpcCBTUkFNKQorICovCisjZGVmaW5lIENGR19URU1QX1NUQUNLX09DTQkxCisjZGVmaW5lIENGR19PQ01fREFUQV9BRERSCTB4RjAwMDAwMDAKKyNkZWZpbmUgQ0ZHX09DTV9EQVRBX1NJWkUJMHgxMDAwCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCUNGR19PQ01fREFUQV9BRERSIAkvKiBpbnNpZGUgb2YgT24gQ2hpcCBTUkFNICAgICovCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJQ0ZHX09DTV9EQVRBX1NJWkUJLyogRW5kIG9mIE9uIENoaXAgU1JBTQkgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJNjQJCS8qIHNpemUgaW4gYnl0ZXMgcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfT0ZGU0VUCShDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisjZGVmaW5lIENGR19JTklUX1NQX09GRlNFVAlDRkdfR0JMX0RBVEFfT0ZGU0VUCisKKy8qCisgKiBJbnRlcm5hbCBEZWZpbml0aW9ucworICoKKyAqIEJvb3QgRmxhZ3MKKyAqLworI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV4dGVybmFsIHBlcmlwaGVyYWwgYmFzZSBhZGRyZXNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENGR19JU0FfSU9fQkFTRV9BRERSRVNTIDB4RTgwMDAwMDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMYXN0IFN0YWdlIEluaXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXRoZXJuZXQgU3R1ZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCisjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMQkvKiBQSFkgYWRkcmVzcwkJCSovCisjZGVmaW5lIENPTkZJR19DUzg5NTJfUEhZCTEJLyogaXRzIGEgQ1M4OTUyIFBIWQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJUQworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDT05GSUdfUlRDX01DMTQ2ODE4CisjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElERS9BVEEgc3R1ZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENGR19JREVfTUFYQlVTCQkyICAgLyogbWF4LiAyIElERSBidXNzZXMJKi8KKyNkZWZpbmUgQ0ZHX0lERV9NQVhERVZJQ0UJKENGR19JREVfTUFYQlVTKjIpIC8qIG1heC4gMiBkcml2ZXMgcGVyIElERSBidXMgKi8KKworI2RlZmluZSBDRkdfQVRBX0JBU0VfQUREUglDRkdfSVNBX0lPX0JBU0VfQUREUkVTUyAvKiBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX0FUQV9JREUwX09GRlNFVAkweDAxRjAJLyogaWRlMCBvZmZzdGUgKi8KKyNkZWZpbmUgQ0ZHX0FUQV9JREUxX09GRlNFVAkweDAxNzAJLyogaWRlMSBvZmZzZXQgKi8KKyNkZWZpbmUgQ0ZHX0FUQV9EQVRBX09GRlNFVAkwCS8qIGRhdGEgcmVnIG9mZnNldAkqLworI2RlZmluZSBDRkdfQVRBX1JFR19PRkZTRVQJMAkvKiByZWcgb2Zmc2V0ICovCisjZGVmaW5lIENGR19BVEFfQUxUX09GRlNFVAkweDIwMAkvKiBhbHRlcm5hdGUgcmVnaXN0ZXIgb2Zmc2V0ICovCisKKyN1bmRlZglDT05GSUdfSURFXzh4eF9ESVJFQ1QJCS8qIG5vIHBjbWNpYSBpbnRlcmZhY2UgcmVxdWlyZWQgKi8KKyN1bmRlZglDT05GSUdfSURFX0xFRAkJCS8qIG5vIGxlZCBmb3IgaWRlIHN1cHBvcnRlZAkqLworI2RlZmluZSBDT05GSUdfSURFX1JFU0VUCQkvKiByZXNldCBmb3IgaWRlIHN1cHBvcnRlZC4uLgkqLworI2RlZmluZSBDT05GSUdfSURFX1JFU0VUX1JPVVRJTkUJLyogd2l0aCBhIHNwZWNpYWwgcmVzZXQgZnVuY3Rpb24gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQVRBUEkgc3VwcG9ydCAoZXhwZXJpbWVudGFsKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ09ORklHX0FUQVBJCQkJLyogZW5hYmxlIEFUQVBJIFN1cHBvcnQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0NTSSBzdXBwb3J0IChleHBlcmltZW50YWwpIG9ubHkgU1lNNTNDOHh4IHN1cHBvcnRlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ09ORklHX1NDU0lfU1lNNTNDOFhYCisjZGVmaW5lIENGR19TQ1NJX01BWF9MVU4JOAkvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIExVTnMgKi8KKyNkZWZpbmUgQ0ZHX1NDU0lfTUFYX1NDU0lfSUQJNwkvKiBtYXhpbXVtIFNDU0kgSUQgKDAuLjYpICovCisjZGVmaW5lIENGR19TQ1NJX01BWF9ERVZJQ0UJQ0ZHX1NDU0lfTUFYX1NDU0lfSUQgKiBDRkdfU0NTSV9NQVhfTFVOIC8qIG1heGltdW0gVGFyZ2V0IGRldmljZXMgKi8KKyNkZWZpbmUgQ0ZHX1NDU0lfU1BJTl9VUF9USU1FCTIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGlzay1Pbi1DaGlwIGNvbmZpZ3VyYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENGR19NQVhfRE9DX0RFVklDRQkxCS8qIE1heCBudW1iZXIgb2YgRE9DIGRldmljZXMJCSovCisjZGVmaW5lIENGR19ET0NfU0hPUlRfVElNRU9VVAorI2RlZmluZSBDRkdfRE9DX1NVUFBPUlRfMjAwMAorI2RlZmluZSBDRkdfRE9DX1NVUFBPUlRfTUlMTEVOTklVTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBESVNLIFBhcnRpdGlvbiBzdXBwb3J0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgorI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgorI2RlZmluZSBDT05GSUdfSVNPX1BBUlRJVElPTiAvKiBFeHBlcmltZW50YWwgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogS2V5Ym9hcmQgc3VwcG9ydAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ09ORklHX0lTQV9LRVlCT0FSRAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWaWRlbyBzdXBwb3J0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDT05GSUdfVklERU8JCQkvKlRvIGVuYWJsZSB2aWRlbyBjb250cm9sbGVyIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX1ZJREVPX0NUNjkwMDAKKyNkZWZpbmUgQ09ORklHX0NGQl9DT05TT0xFCisjZGVmaW5lIENPTkZJR19WSURFT19MT0dPCisjZGVmaW5lIENPTkZJR19DT05TT0xFX0VYVFJBX0lORk8KKyNkZWZpbmUgQ09ORklHX1ZHQV9BU19TSU5HTEVfREVWSUNFCisjZGVmaW5lIENPTkZJR19WSURFT19TV19DVVJTT1IKKyNkZWZpbmUgQ09ORklHX1ZJREVPX09OQk9BUkQJCS8qIFZpZGVvIGNvbnRyb2xsZXIgaXMgb24tYm9hcmQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVNCIHN1cHBvcnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENPTkZJR19VU0JfVUhDSQorI2RlZmluZSBDT05GSUdfVVNCX0tFWUJPQVJECisjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQorCisvKiBFbmFibGUgbmVlZGVkIGhlbHBlciBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgQ0ZHX0RFVklDRV9ERVJFR0lTVEVSCQkvKiBuZWVkcyBkZXZpY2VfZGVyZWdpc3RlciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWJ1ZyBzdXBwb3J0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJZGVudAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVkVSU0lPTl9UQUcgInJlbGVhc2VkIgorI2RlZmluZSBDT05GSUdfSURFTlRfU1RSSU5HICJcbihjKSAyMDAyIGJ5IE1QTCBBRyBTd2l0emVybGFuZCwgTUVWLTEwMDY2LTAwMSAiIFZFUlNJT05fVEFHCisKKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QTjYyLmggYi9pbmNsdWRlL2NvbmZpZ3MvUE42Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTAxMTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUE42Mi5oCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBHcmFuZGVnZ2VyLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3Z0BkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGJvYXJkL2NvbmZpZy5oIC0gY29uZmlndXJhdGlvbiBvcHRpb25zLCBib2FyZCBzcGVjaWZpYworICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisKKyNkZWZpbmUgQ09ORklHX01QQzgyNFgJCTEKKyNkZWZpbmUgQ09ORklHX01QQzgyNDAJCTEKKyNkZWZpbmUgQ09ORklHX1BONjIJCTEKKworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCisKKworI2RlZmluZSBSRU1PVkVfQ09NTUFORFMgICAgICAgICAoIENGR19DTURfQVVUT1NDUklQVCB8IFwKKyAJCQkJICBDRkdfQ01EX0xPQURTIHwgXAorIAkJCQkgIENGR19DTURfRU5WIHwgXAorIAkJCQkgIENGR19DTURfRkxBU0ggKQorCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCAoQ09ORklHX0NNRF9ERkwgJiB+UkVNT1ZFX0NPTU1BTkRTKSB8XAorCQkJCSAgQ0ZHX0NNRF9QQ0kgfFwKKwkJCQkgIENGR19DTURfQlNQKQorCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTkyMDAJLyogY29uc29sZSBiYXVkcmF0ZQkJKi8KKworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTEJLyogYXV0b2Jvb3QgYWZ0ZXIgbiBzZWNvbmRzCSovCisKKyNkZWZpbmUJQ09ORklHX0NMT0NLU19JTl9NSFoJMQkvKiBjbG9ja3MgcGFzc3NlZCB0byBMaW51eCBpbiBNSHogKi8KKworI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTEwLjAuMC4yMDEKKyNkZWZpbmUgQ09ORklHX0lQQUREUiAJCTEwLjAuMC4yMDAKKyNkZWZpbmUgQ09ORklHX1JPT1RQQVRICQkvb3B0L2VsZGsvcHBjXzgyeHgKKyNkZWZpbmUgQ09ORklHX05FVE1BU0sJCTI1NS4yNTUuMjU1LjAKKyN1bmRlZiBDT05GSUdfQk9PVEFSR1MKKyNpZiAwCisvKiBCb290IExpbnV4IHdpdGggTkZTIHJvb3QgZmlsZXN5c3RlbSAqLworI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQgXAorCQkJInNldGVudiB2ZXJpZnkgeTsiIFwKKyAgICAgICAJCQkic2V0ZW52IGJvb3RhcmdzIGNvbnNvbGU9dHR5UzAsMTkyMDAgbWVtPTMxTSBxdWlldCAiIFwKKwkJCSJyb290PS9kZXYvbmZzIHJ3IG5mc3Jvb3Q9JChzZXJ2ZXJpcCk6JChyb290cGF0aCkgIiBcCisJCQkiaXA9JChpcGFkZHIpOiQoc2VydmVyaXApOjokKG5ldG1hc2spOnBuNjI6ZXRoMDpvZmY7IiBcCisJCQkibG9hZHAgMTAwMDAwOyBib290bSIKKwkJCS8qICJ0ZnRwYm9vdCAxMDAwMDAgcEltYWdlOyBib290bSIgKi8KKyNlbHNlCisvKiBCb290IExpbnV4IHdpdGggUkFNZGlzayBiYXNlZCBmaWxlc3lzdGVtIChpbml0cmQsIEJ1c3lCb3gpICovCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORCBcCisJCQkic2V0ZW52IHZlcmlmeSBuOyIgXAorICAgICAgIAkJCSJzZXRlbnYgYm9vdGFyZ3MgY29uc29sZT10dHlTMCwxOTIwMCBtZW09MzFNIHF1aWV0ICIgXAorCQkJInJvb3Q9L2Rldi9yYW0gcncgIiBcCisJCQkiaXA9JChpcGFkZHIpOiQoc2VydmVyaXApOjokKG5ldG1hc2spOnBuNjI6ZXRoMDpvZmY7IiBcCisJCQkibG9hZHAgMjAwMDAwOyBib290bSIKKyNlbmRpZgorCisvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCisjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCTEJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KQkvKiBQcmludCBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4MDAxMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MJCSovCisjZGVmaW5lIENGR19IWgkJCTEwMDAJCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KKworI2RlZmluZSBDT05GSUdfUFJBTQkJMTAyNAkJLyogcmVzZXJ2ZSAxIE1CIHByb3RlY3RlZCBSQU0JKi8KKworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IJMQkJLyogY2FsbCBtaXNjX2luaXRfcigpIG9uIGluaXQJKi8KKworI2RlZmluZSBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTIDEJCS8qIFNob3cgYm9vdCBwcm9ncmVzcyBvbiBMRURzICAgKi8KKworLyoKKyAqIFBDSSBzdHVmZgorICovCisjZGVmaW5lIENPTkZJR19QQ0kJCQkJLyogaW5jbHVkZSBwY2kgc3VwcG9ydAkJKi8KKyNkZWZpbmUgQ09ORklHX1BDSV9QTlAJCQkJLyogd2UgbmVlZCBQbHVnICduIFBsYXkJCSovCisjaWYgMAorI2RlZmluZSBDT05GSUdfUENJX1NDQU5fU0hPVwkJCS8qIHNob3cgUENJIGF1dG8tc2NhbiBhdCBib290CSovCisjZW5kaWYKKworLyoKKyAqIE5ldHdvcmtpbmcgc3R1ZmYKKyAqLworI2RlZmluZSBDT05GSUdfTkVUX01VTFRJICAgICAgIAkJCS8qIE11bHRpIGV0aGVybmV0IGNhcmRzIHN1cHBvcnQgKi8KKworI2RlZmluZSBDT05GSUdfUENORVQJCQkJLyogdGhlcmUgYXJlIDIgQU1EIFBDbmV0IDc5Qzk3MwkqLworI2RlZmluZSBDT05GSUdfUENORVRfNzlDOTczCisKKyNkZWZpbmUgX0lPX0JBU0UJCTB4ZmUwMDAwMDAJLyogcG9pbnRzIHRvIFBDSSBJL08gc3BhY2UJKi8KKworCisvKgorICogU3RhcnQgYWRkcmVzc2VzIGZvciB0aGUgZmluYWwgbWVtb3J5IGNvbmZpZ3VyYXRpb24KKyAqIChTZXQgdXAgYnkgdGhlIHN0YXJ0dXAgY29kZSkKKyAqIFBsZWFzZSBub3RlIHRoYXQgQ0ZHX1NEUkFNX0JBU0UgX211c3RfIHN0YXJ0IGF0IDAKKyAqLworI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfTUFYX1JBTV9TSVpFCTB4MTAwMDAwMDAKKworI2RlZmluZSBDRkdfUkVTRVRfQUREUkVTUwkweGZmZjAwMTAwCisKKyN1bmRlZglDRkdfUkFNQk9PVAorI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCTB4MDAwMzAwMDAKKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlURVhUX0JBU0UKKworLyojZGVmaW5lIENGR19HQkxfREFUQV9TSVpFICAgIDI1NiovCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTEyOAorCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSICAgCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORCAgICAJMHgxMDAwCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQgCShDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisKKworI2RlZmluZSBDRkdfTk9fRkxBU0gJCTEJCS8qIFRoZXJlIGlzIG5vIEZMQVNIIG1lbW9yeQkqLworCisjZGVmaW5lIENGR19FTlZfSVNfTk9XSEVSRQkxCQkvKiBTdG9yZSBFTlYgaW4gbWVtb3J5IG9ubHkJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9PRkZTRVQJCTB4MDAwMDQwMDAJLyogT2Zmc2V0IG9mIEVudmlyb25tZW50IFNlY3RvciAqLworI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MDAwMDIwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDUxMiA8PCAxMCkJLyogUmVzZXJ2ZSA1MTIga0IgZm9yIG1hbGxvYygpCSovCisKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDAwNDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCQkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MDFmMDAwMDAJLyogMCAuLi4gMzIgTUIgaW4gRFJBTQkJKi8KKworLyoKKyAqIFNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCTEKKworI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCTE4NDMyMDAKKworI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xCTB4ZmY4MDAwMDgKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMgkweGZmODAwMDAwCisKKy8qCisgKiBMb3cgTGV2ZWwgQ29uZmlndXJhdGlvbiBTZXR0aW5ncworICogKGFkZHJlc3MgbWFwcGluZ3MsIHJlZ2lzdGVyIGluaXRpYWwgdmFsdWVzLCBldGMuKQorICogWW91IHNob3VsZCBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBpZiB5b3UgbWFrZSBjaGFuZ2VzIGhlcmUuCisgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRICAzMzMzMzMzMwkvKiBleHRlcm5hbCBmcmVxdWVuY3kgdG8gcGxsICovCisjZGVmaW5lIENPTkZJR19QTExfUENJX1RPX01FTV9NVUxUSVBMSUVSICAzCisKKyNkZWZpbmUgQ0ZHX0VVTUJfQUREUgkJMHhGQ0UwMDAwMAorCisvKiBNQ0NSMSAqLworI2RlZmluZSBDRkdfUk9NTkFMCQkzCS8qIHJvbS9mbGFzaCBuZXh0IGFjY2VzcyB0aW1lCQkqLworI2RlZmluZSBDRkdfUk9NRkFMCQk3CS8qIHJvbS9mbGFzaCBhY2Nlc3MgdGltZQkJKi8KKworLyogTUNDUjIgKi8KKyNkZWZpbmUgQ0ZHX0FTUklTRQkJNgkvKiBBU1JJU0UgaW4gY2xvY2tzCQkJKi8KKyNkZWZpbmUgQ0ZHX0FTRkFMTAkJMTIJLyogQVNGQUxMIGluIGNsb2NrcwkJCSovCisjZGVmaW5lIENGR19SRUZJTlQJCTU2MDAJLyogUkVGSU5UIGluIGNsb2NrcwkJCSovCisKKy8qIE1DQ1IzICovCisjZGVmaW5lIENGR19CU1RPUFJFCQkweDNjZgkvKiBCdXJzdCBUbyBQcmVjaGFyZ2UJCQkqLworI2RlZmluZSBDRkdfUkVGUkVDCQkyCS8qIFJlZnJlc2ggdG8gYWN0aXZhdGUgaW50ZXJ2YWwJCSovCisjZGVmaW5lIENGR19SRExBVAkJMwkvKiBkYXRhIGxhdGVuY3kgZnJvbSByZWFkIGNvbW1hbmQJKi8KKworLyogTUNDUjQgKi8KKyNkZWZpbmUgQ0ZHX1BSRVRPQUNUCQkxCS8qIFByZWNoYXJnZSB0byBhY3RpdmF0ZSBpbnRlcnZhbAkqLworI2RlZmluZSBDRkdfQUNUVE9QUkUJCTMJLyogQWN0aXZhdGUgdG8gUHJlY2hhcmdlIGludGVydmFsCSovCisjZGVmaW5lIENGR19BQ1RPUlcJCTIJLyogQWN0aXZhdGUgdG8gUi9XCQkJKi8KKyNkZWZpbmUgQ0ZHX1NETU9ERV9DQVNfTEFUCTIJLyogU0RNT0RFIENBUyBsYXRlbmN5CQkJKi8KKyNkZWZpbmUgQ0ZHX1NETU9ERV9XUkFQCQkwCS8qIFNETU9ERSBXcmFwIHR5cGUJCQkqLworI2RlZmluZSBDRkdfU0RNT0RFX0JVUlNUTEVOCTIJLyogU0RNT0RFIEJ1cnN0IGxlbmd0aCAyPTQsIDM9OAkJKi8KKyNkZWZpbmUgQ0ZHX1JFR0lTVEVSRF9UWVBFX0JVRkZFUiAgIDEKKworLyogTWVtb3J5IGJhbmsgc2V0dGluZ3M6CisgKgorICogb25seSBiaXRzIDIwLTI5IGFyZSBhY3R1YWxseSB1c2VkIGZyb20gdGhlc2UgdmFsZXMgdG8gc2V0IHRoZQorICogc3RhcnQvcWVuZCBhZGRyZXNzIHRoZSB1cHBlciB0d28gYml0cyB3aWxsIGJlIDAsIGFuZCB0aGUgbG93ZXIgMjAKKyAqIGJpdHMgd2lsbCBiZSBzZXQgdG8gMHgwMDAwMCBmb3IgYSBzdGFydCBhZGRyZXNzLCBvciAweGZmZmZmIGZvciBhbgorICogZW5kIGFkZHJlc3MKKyAqLworI2RlZmluZSBDRkdfQkFOSzBfU1RBUlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTkswX0VORAkJKENGR19NQVhfUkFNX1NJWkUgLSAxKQorI2RlZmluZSBDRkdfQkFOSzBfRU5BQkxFCTEKKyNkZWZpbmUgQ0ZHX0JBTksxX1NUQVJUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LMV9FTkQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTksxX0VOQUJMRQkwCisjZGVmaW5lIENGR19CQU5LMl9TVEFSVAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzJfRU5ECQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LMl9FTkFCTEUJMAorI2RlZmluZSBDRkdfQkFOSzNfU1RBUlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTkszX0VORAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzNfRU5BQkxFCTAKKyNkZWZpbmUgQ0ZHX0JBTks0X1NUQVJUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LNF9FTkQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks0X0VOQUJMRQkwCisjZGVmaW5lIENGR19CQU5LNV9TVEFSVAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzVfRU5ECQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LNV9FTkFCTEUJMAorI2RlZmluZSBDRkdfQkFOSzZfU1RBUlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks2X0VORAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzZfRU5BQkxFCTAKKyNkZWZpbmUgQ0ZHX0JBTks3X1NUQVJUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LN19FTkQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks3X0VOQUJMRQkwCisKKy8qCisgKiBNZW1vcnkgYmFuayBlbmFibGUgYml0bWFzaywgc3BlY2lmeWluZyB3aGljaCBvZiB0aGUgYmFua3MgZGVmaW5lZCBhYm92ZQorICogYXJlIGFjdHVhbGx5IHByZXNlbnQuIE1TQiBpcyBmb3IgYmFuayAjNywgTFNCIGlzIGZvciBiYW5rICMwLgorICovCisjZGVmaW5lIENGR19CQU5LX0VOQUJMRQkJMHgwMQorCisjZGVmaW5lIENGR19PRENSCQkweGZmCS8qIGNvbmZpZ3VyZXMgbGluZSBkcml2ZXIgaW1wZWRhbmNlcywJKi8KKwkJCQkJLyogc2VlIDgyNDAgYm9vayBmb3IgYml0IGRlZmluaXRpb25zCSovCisjZGVmaW5lIENGR19QR01BWAkJMHgzMgkvKiBob3cgbG9uZyB0aGUgODI0MCByZXRhaW5zIHRoZQkqLworCQkJCQkvKiBjdXJyZW50bHkgYWNjZXNzZWQgcGFnZSBpbiBtZW1vcnkJKi8KKwkJCQkJLyogc2VlIDgyNDAgYm9vayBmb3IgZGV0YWlscwkJKi8KKworLyogU0RSQU0gMCAtIDI1Nk1CICovCisjZGVmaW5lIENGR19JQkFUMEwJKENGR19TRFJBTV9CQVNFIHwgQkFUTF9QUF8xMCB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDBVCShDRkdfU0RSQU1fQkFTRSB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19JQkFUMUwJKENGR19JTklUX1JBTV9BRERSIHwgQkFUTF9QUF8xMCB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDFVCShDRkdfSU5JVF9SQU1fQUREUiB8IEJBVFVfQkxfMTI4SyB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisvKiBQQ0kgbWVtb3J5IHNwYWNlICovCisjZGVmaW5lIENGR19JQkFUMkwJKDB4ODAwMDAwMDAgfCBCQVRMX1BQXzEwIHwgQkFUTF9DQUNIRUlOSElCSVQpCisjZGVmaW5lIENGR19JQkFUMlUJKDB4ODAwMDAwMDAgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKworLyogQ29uZmlnIGFkZHJzLCBldGMgKi8KKyNkZWZpbmUgQ0ZHX0lCQVQzTAkoMHhGMDAwMDAwMCB8IEJBVExfUFBfMTAgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQzVQkoMHhGMDAwMDAwMCB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19EQkFUMEwJQ0ZHX0lCQVQwTAorI2RlZmluZSBDRkdfREJBVDBVCUNGR19JQkFUMFUKKyNkZWZpbmUgQ0ZHX0RCQVQxTAlDRkdfSUJBVDFMCisjZGVmaW5lIENGR19EQkFUMVUJQ0ZHX0lCQVQxVQorI2RlZmluZSBDRkdfREJBVDJMCUNGR19JQkFUMkwKKyNkZWZpbmUgQ0ZHX0RCQVQyVQlDRkdfSUJBVDJVCisjZGVmaW5lIENGR19EQkFUM0wJQ0ZHX0lCQVQzTAorI2RlZmluZSBDRkdfREJBVDNVCUNGR19JQkFUM1UKKworLyoKKyAqIEZvciBib290aW5nIExpbnV4LCB0aGUgYm9hcmQgaW5mbyBhbmQgY29tbWFuZCBsaW5lIGRhdGEKKyAqIGhhdmUgdG8gYmUgaW4gdGhlIGZpcnN0IDggTUIgb2YgbWVtb3J5LCBzaW5jZSB0aGlzIGlzCisgKiB0aGUgbWF4aW11bSBtYXBwZWQgYnkgdGhlIExpbnV4IGtlcm5lbCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKi8KKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXggKi8KKworLyoKKyAqIENhY2hlIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNDAgQ1BVCQkJKi8KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLworCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvU2FuZHBvaW50ODI0MC5oIGIvaW5jbHVkZS9jb25maWdzL1NhbmRwb2ludDgyNDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmVmMzIxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL1NhbmRwb2ludDgyNDAuaApAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBib2FyZC9jb25maWcuaCAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYm9hcmQgc3BlY2lmaWMKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworCisjZGVmaW5lIENPTkZJR19NUEM4MjRYCQkxCisjZGVmaW5lIENPTkZJR19NUEM4MjQwCQkxCisjZGVmaW5lIENPTkZJR19TQU5EUE9JTlQJMQorCisjaWYgMAorI2RlZmluZSBVU0VfRElOSzMyCQkxCisjZWxzZQorI3VuZGVmIFVTRV9ESU5LMzIKKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCTEKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKKyNkZWZpbmUgQ09ORklHX0RSQU1fU1BFRUQJMTAwCQkvKiBNSHoJCQkJKi8KKworI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggKENPTkZJR19DTURfREZMICYgfkNGR19DTURfQVVUT1NDUklQVCkgfCBcCisJCQkJICBDRkdfQ01EX0VMRiAgICB8IFwKKwkJCQkgIENGR19DTURfSTJDIAkgfCBcCisJCQkJICBDRkdfQ01EX1NEUkFNCSB8IFwKKwkJCQkgIENGR19DTURfRUVQUk9NIHwgXAorCQkJCSAgQ0ZHX0NNRF9QQ0kgKQorCisvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCisjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCTEJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KQkvKiBQcmludCBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4MDAxMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MJCSovCisjZGVmaW5lIENGR19IWgkJCTEwMDAJCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUENJIHN0dWZmCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgQ09ORklHX1BDSQkJCQkvKiBpbmNsdWRlIHBjaSBzdXBwb3J0CQkqLworI3VuZGVmIENPTkZJR19QQ0lfUE5QCisKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkJCS8qIE11bHRpIGV0aGVybmV0IGNhcmRzIHN1cHBvcnQgKi8KKworI2RlZmluZSBDT05GSUdfRUVQUk8xMDAKKworI2RlZmluZSBQQ0lfRU5FVDBfSU9BRERSCTB4ODAwMDAwMDAKKyNkZWZpbmUgUENJX0VORVQwX01FTUFERFIJMHg4MDAwMDAwMAorI2RlZmluZQlQQ0lfRU5FVDFfSU9BRERSCTB4ODEwMDAwMDAKKyNkZWZpbmUJUENJX0VORVQxX01FTUFERFIJMHg4MTAwMDAwMAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXJ0IGFkZHJlc3NlcyBmb3IgdGhlIGZpbmFsIG1lbW9yeSBjb25maWd1cmF0aW9uCisgKiAoU2V0IHVwIGJ5IHRoZSBzdGFydHVwIGNvZGUpCisgKiBQbGVhc2Ugbm90ZSB0aGF0IENGR19TRFJBTV9CQVNFIF9tdXN0XyBzdGFydCBhdCAwCisgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX01BWF9SQU1fU0laRQkweDEwMDAwMDAwCisKKyNkZWZpbmUgQ0ZHX1JFU0VUX0FERFJFU1MJMHhGRkYwMDEwMAorCisjaWYgZGVmaW5lZCAoVVNFX0RJTkszMikKKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkweDAwMDMwMDAwCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJMHgwMDA5MDAwMAorI2RlZmluZSBDRkdfUkFNQk9PVAkJMQorI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUgkoQ0ZHX01PTklUT1JfQkFTRSArIENGR19NT05JVE9SX0xFTikKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAkweDEwMDAwCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTI1NiAgLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKyNlbHNlCisjdW5kZWYJQ0ZHX1JBTUJPT1QKKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkweDAwMDMwMDAwCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJVEVYVF9CQVNFCisKKy8qI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRSAgICAyNTYqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkxMjgKKworI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUiAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5EICAgICAgMHgxMDAwCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQgIChDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisKKyNlbmRpZgorCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZGRjAwMDAwCisjaWYgMAorI2RlZmluZSBDRkdfRkxBU0hfU0laRQkJKDUxMiAqIDEwMjQpCS8qIHNhbmRwb2ludCBoYXMgdGlueSBlZXByb20JKi8KKyNlbHNlCisjZGVmaW5lIENGR19GTEFTSF9TSVpFCQkoMTAyNCAqIDEwMjQpCS8qIFVuaXR5IGhhcyBvbmJvYXJkIDFNQnl0ZSBmbGFzaCAqLworI2VuZGlmCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQorI2RlZmluZSBDRkdfRU5WX09GRlNFVAkJMHgwMDAwNDAwMAkvKiBPZmZzZXQgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHgwMDAwMjAwMAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoNTEyIDw8IDEwKQkvKiBSZXNlcnZlIDUxMiBrQiBmb3IgbWFsbG9jKCkJKi8KKworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDAwMDAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwNDAwMDAwMAkvKiAwIC4uLiAzMiBNQiBpbiBEUkFNCQkqLworCisjZGVmaW5lIENGR19FVU1CX0FERFIJCTB4RkMwMDAwMDAKKworI2RlZmluZSBDRkdfSVNBX01FTQkJMHhGRDAwMDAwMAorI2RlZmluZSBDRkdfSVNBX0lPCQkweEZFMDAwMDAwCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX1JBTkdFX0JBU0UJMHhGRjAwMDAwMAkvKiBmbGFzaCBtZW1vcnkgYWRkcmVzcyByYW5nZQkqLworI2RlZmluZSBDRkdfRkxBU0hfUkFOR0VfU0laRQkweDAxMDAwMDAwCisjZGVmaW5lIEZMQVNIX0JBU0UwX1BSRUxJTQkweEZGRjAwMDAwCS8qIHNhbmRwb2ludCBmbGFzaAkJKi8KKyNkZWZpbmUgRkxBU0hfQkFTRTFfUFJFTElNCTB4RkYwMDAwMDAJLyogUE1DIG9uYm9hcmQgZmxhc2gJCSovCisKKy8qCisgKiBzZWxlY3QgaTJjIHN1cHBvcnQgY29uZmlndXJhdGlvbgorICoKKyAqIFN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyBhcmUge25vbmUsIHNvZnR3YXJlLCBoYXJkd2FyZX0gZHJpdmVycy4KKyAqIElmIHRoZSBzb2Z0d2FyZSBkcml2ZXIgaXMgY2hvc2VuLCB0aGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsCisgKiBjb25maWd1cmF0aW9uIGl0ZW1zIHRoYXQgdGhlIGRyaXZlciB1c2VzIHRvIGRyaXZlIHRoZSBwb3J0IHBpbnMuCisgKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCQkxCQkvKiBUbyBlbmFibGUgSTJDIHN1cHBvcnQJKi8KKyN1bmRlZiAgQ09ORklHX1NPRlRfSTJDCQkJCS8qIEkyQyBiaXQtYmFuZ2VkCQkqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcwkqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCisKKyNpZmRlZiBDT05GSUdfU09GVF9JMkMKKyNlcnJvciAiU29mdCBJMkMgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuICBQbGVhc2UgcmV2aWV3ISIKKyNkZWZpbmUgSTJDX1BPUlQJCTMgICAgICAgICAgICAgICAvKiBQb3J0IEE9MCwgQj0xLCBDPTIsIEQ9MyAqLworI2RlZmluZSBJMkNfQUNUSVZFCQkoaW9wLT5wZGlyIHw9ICAweDAwMDEwMDAwKQorI2RlZmluZSBJMkNfVFJJU1RBVEUJCShpb3AtPnBkaXIgJj0gfjB4MDAwMTAwMDApCisjZGVmaW5lIEkyQ19SRUFECQkoKGlvcC0+cGRhdCAmIDB4MDAwMTAwMDApICE9IDApCisjZGVmaW5lIEkyQ19TREEoYml0KQkJaWYoYml0KSBpb3AtPnBkYXQgfD0gIDB4MDAwMTAwMDA7IFwKKwkJCQllbHNlICAgIGlvcC0+cGRhdCAmPSB+MHgwMDAxMDAwMAorI2RlZmluZSBJMkNfU0NMKGJpdCkJCWlmKGJpdCkgaW9wLT5wZGF0IHw9ICAweDAwMDIwMDAwOyBcCisJCQkJZWxzZSAgICBpb3AtPnBkYXQgJj0gfjB4MDAwMjAwMDAKKyNkZWZpbmUgSTJDX0RFTEFZCQl1ZGVsYXkoNSkJLyogMS80IEkyQyBjbG9jayBkdXJhdGlvbiAqLworI2VuZGlmIC8qIENPTkZJR19TT0ZUX0kyQyAqLworCisKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDU3CQkvKiBFRVBST00gSVMyNEMwMgkJKi8KKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4JMQkJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0JJVFMJMwkvKiB3cml0ZSBwYWdlIHNpemUJCSovCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9ERUxBWV9NUwkxMAkvKiB0YWtlcyB1cCB0byAxMCBtc2VjCQkqLworCisKKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBTktTCQl7IEZMQVNIX0JBU0UwX1BSRUxJTSAsIEZMQVNIX0JBU0UxX1BSRUxJTSB9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb25zIGZvciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgYW5kIGRhdGEgYXJlYSAoaW4gRFBSQU0pCisgKi8KKworCisjZGVmaW5lIENGR19XSU5CT05EXzgzQzU1MwkxCS8qaGFzIGEgd2luYm9uZCBicmlkZ2UJCQkqLworI2RlZmluZSBDRkdfVVNFX1dJTkJPTkRfSURFCTAJLyp1c2Ugd2luYm9uZCA4M2M1NTMgaW50ZXJuYWwgSURFIGN0cmxyICovCisjZGVmaW5lIENGR19XSU5CT05EX0lTQV9DRkdfQUREUiAgICAweDgwMDA1ODAwCS8qcGNpLWlzYSBicmlkZ2UgY29uZmlnIGFkZHIJKi8KKyNkZWZpbmUgQ0ZHX1dJTkJPTkRfSURFX0NGR19BRERSICAgIDB4ODAwMDU5MDAJLyppZGUgY29uZmlnIGFkZHIJCSovCisKKyNkZWZpbmUgQ0ZHX0lERV9NQVhCVVMJCTIgICAvKiBtYXguIDIgSURFIGJ1c3NlcwkqLworI2RlZmluZSBDRkdfSURFX01BWERFVklDRQkoQ0ZHX0lERV9NQVhCVVMqMikgLyogbWF4LiAyIGRyaXZlcyBwZXIgSURFIGJ1cyAqLworCisvKgorICogTlM4NzMwOCBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX05TODczMDgJCQkvKiBOYXQgU2VtaSBzdXBlci1pbyBjb250cm9sbGVyIG9uIElTQSBidXMgKi8KKworI2RlZmluZSBDRkdfTlM4NzMwOF9CQUREUl8xMAkxCisKKyNkZWZpbmUgQ0ZHX05TODczMDhfREVWUwkoIENGR19OUzg3MzA4X1VBUlQxICAgfCBcCisJCQkJICBDRkdfTlM4NzMwOF9VQVJUMiAgIHwgXAorCQkJCSAgQ0ZHX05TODczMDhfUE9XUk1BTiB8IFwKKwkJCQkgIENGR19OUzg3MzA4X1JUQ19BUEMgKQorCisjdW5kZWYgIENGR19OUzg3MzA4X1BTMk1PRAorCisjZGVmaW5lIENGR19OUzg3MzA4X0NTMF9CQVNFCTB4MDA3NgorI2RlZmluZSBDRkdfTlM4NzMwOF9DUzBfQ09ORgkweDMwCisjZGVmaW5lIENGR19OUzg3MzA4X0NTMV9CQVNFCTB4MDA3NQorI2RlZmluZSBDRkdfTlM4NzMwOF9DUzFfQ09ORgkweDMwCisjZGVmaW5lIENGR19OUzg3MzA4X0NTMl9CQVNFCTB4MDA3NAorI2RlZmluZSBDRkdfTlM4NzMwOF9DUzJfQ09ORgkweDMwCisKKy8qCisgKiBOUzE2NTUwIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKworI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQkxCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkxODQzMjAwCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkoQ0ZHX0lTQV9JTyArIENGR19OUzg3MzA4X1VBUlQxX0JBU0UpCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTIJKENGR19JU0FfSU8gKyBDRkdfTlM4NzMwOF9VQVJUMl9CQVNFKQorCisvKgorICogTG93IExldmVsIENvbmZpZ3VyYXRpb24gU2V0dGluZ3MKKyAqIChhZGRyZXNzIG1hcHBpbmdzLCByZWdpc3RlciBpbml0aWFsIHZhbHVlcywgZXRjLikKKyAqIFlvdSBzaG91bGQga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgaWYgeW91IG1ha2UgY2hhbmdlcyBoZXJlLgorICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgMzMwMDAwMDAJLyogZXh0ZXJuYWwgZnJlcXVlbmN5IHRvIHBsbCAqLworI2RlZmluZSBDT05GSUdfUExMX1BDSV9UT19NRU1fTVVMVElQTElFUiAgMgorCisjZGVmaW5lIENGR19ST01OQUwJCTcJLypyb20vZmxhc2ggbmV4dCBhY2Nlc3MgdGltZQkJKi8KKyNkZWZpbmUgQ0ZHX1JPTUZBTAkJMTEJLypyb20vZmxhc2ggYWNjZXNzIHRpbWUJCQkqLworCisjZGVmaW5lIENGR19SRUZJTlQJNDMwCS8qIG5vIG9mIGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIENCUiByZWZyZXNoIGN5Y2xlcyAqLworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgU0RSQU0gb25seSovCisjZGVmaW5lIENGR19CU1RPUFJFCTEyMQkvKiBCdXJzdCBUbyBQcmVjaGFyZ2UsIHNldHMgb3BlbiBwYWdlIGludGVydmFsICovCisjZGVmaW5lIENGR19SRUZSRUMJCTgJLyogUmVmcmVzaCB0byBhY3RpdmF0ZSBpbnRlcnZhbAkJKi8KKyNkZWZpbmUgQ0ZHX1JETEFUCQk0CS8qIGRhdGEgbGF0ZW5jeSBmcm9tIHJlYWQgY29tbWFuZAkqLworI2RlZmluZSBDRkdfUFJFVE9BQ1QJCTMJLyogUHJlY2hhcmdlIHRvIGFjdGl2YXRlIGludGVydmFsCSovCisjZGVmaW5lIENGR19BQ1RUT1BSRQkJNQkvKiBBY3RpdmF0ZSB0byBQcmVjaGFyZ2UgaW50ZXJ2YWwJKi8KKyNkZWZpbmUgQ0ZHX0FDVE9SVwkJMwkvKiBBY3RpdmF0ZSB0byBSL1cJCQkqLworI2RlZmluZSBDRkdfU0RNT0RFX0NBU19MQVQJMwkvKiBTRE1PREUgQ0FTIGxhdGVuY3kJCQkqLworI2RlZmluZSBDRkdfU0RNT0RFX1dSQVAJCTAJLyogU0RNT0RFIHdyYXAgdHlwZQkJCSovCisjZGVmaW5lIENGR19TRE1PREVfQlVSU1RMRU4JMgkvKiBTRE1PREUgQnVyc3QgbGVuZ3RoIDI9NCwgMz04CQkqLworCisjZGVmaW5lIENGR19SRUdJU1RFUkRfVFlQRV9CVUZGRVIgICAxCisKKy8qIG1lbW9yeSBiYW5rIHNldHRpbmdzKi8KKy8qCisgKiBvbmx5IGJpdHMgMjAtMjkgYXJlIGFjdHVhbGx5IHVzZWQgZnJvbSB0aGVzZSB2YWxlcyB0byBzZXQgdGhlCisgKiBzdGFydC9lbmQgYWRkcmVzcyB0aGUgdXBwZXIgdHdvIGJpdHMgd2lsbCBiZSAwLCBhbmQgdGhlIGxvd2VyIDIwCisgKiBiaXRzIHdpbGwgYmUgc2V0IHRvIDB4MDAwMDAgZm9yIGEgc3RhcnQgYWRkcmVzcywgb3IgMHhmZmZmZiBmb3IgYW4KKyAqIGVuZCBhZGRyZXNzCisgKi8KKyNkZWZpbmUgQ0ZHX0JBTkswX1NUQVJUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LMF9FTkQJCShDRkdfTUFYX1JBTV9TSVpFIC0gMSkKKyNkZWZpbmUgQ0ZHX0JBTkswX0VOQUJMRQkxCisjZGVmaW5lIENGR19CQU5LMV9TVEFSVAkJMHgzZmYwMDAwMAorI2RlZmluZSBDRkdfQkFOSzFfRU5ECQkweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LMV9FTkFCTEUJMAorI2RlZmluZSBDRkdfQkFOSzJfU1RBUlQJCTB4M2ZmMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTksyX0VORAkJMHgzZmZmZmZmZgorI2RlZmluZSBDRkdfQkFOSzJfRU5BQkxFCTAKKyNkZWZpbmUgQ0ZHX0JBTkszX1NUQVJUCQkweDNmZjAwMDAwCisjZGVmaW5lIENGR19CQU5LM19FTkQJCTB4M2ZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0JBTkszX0VOQUJMRQkwCisjZGVmaW5lIENGR19CQU5LNF9TVEFSVAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzRfRU5ECQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LNF9FTkFCTEUJMAorI2RlZmluZSBDRkdfQkFOSzVfU1RBUlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks1X0VORAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzVfRU5BQkxFCTAKKyNkZWZpbmUgQ0ZHX0JBTks2X1NUQVJUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LNl9FTkQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks2X0VOQUJMRQkwCisjZGVmaW5lIENGR19CQU5LN19TVEFSVAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzdfRU5ECQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LN19FTkFCTEUJMAorLyoKKyAqIE1lbW9yeSBiYW5rIGVuYWJsZSBiaXRtYXNrLCBzcGVjaWZ5aW5nIHdoaWNoIG9mIHRoZSBiYW5rcyBkZWZpbmVkIGFib3ZlCisgYXJlIGFjdHVhbGx5IHByZXNlbnQuIE1TQiBpcyBmb3IgYmFuayAjNywgTFNCIGlzIGZvciBiYW5rICMwLgorICovCisjZGVmaW5lIENGR19CQU5LX0VOQUJMRQkJMHgwMQorCisjZGVmaW5lIENGR19PRENSCQkweGZmCS8qIGNvbmZpZ3VyZXMgbGluZSBkcml2ZXIgaW1wZWRhbmNlcywJKi8KKwkJCQkJLyogc2VlIDgyNDAgYm9vayBmb3IgYml0IGRlZmluaXRpb25zCSovCisjZGVmaW5lIENGR19QR01BWAkJMHgzMgkvKiBob3cgbG9uZyB0aGUgODI0MCByZXRhaW5zIHRoZQkqLworCQkJCQkvKiBjdXJyZW50bHkgYWNjZXNzZWQgcGFnZSBpbiBtZW1vcnkJKi8KKwkJCQkJLyogc2VlIDgyNDAgYm9vayBmb3IgZGV0YWlscwkJKi8KKworLyogU0RSQU0gMCAtIDI1Nk1CICovCisjZGVmaW5lIENGR19JQkFUMEwJKENGR19TRFJBTV9CQVNFIHwgQkFUTF9QUF8xMCB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDBVCShDRkdfU0RSQU1fQkFTRSB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisvKiBzdGFjayBpbiBEQ0FDSEUgQCAxR0IgKG5vIGJhY2tpbmcgbWVtKSAqLworI2lmIGRlZmluZWQoVVNFX0RJTkszMikKKyNkZWZpbmUgQ0ZHX0lCQVQxTAkoMHg0MDAwMDAwMCB8IEJBVExfUFBfMDAgKQorI2RlZmluZSBDRkdfSUJBVDFVCSgweDQwMDAwMDAwIHwgQkFUVV9CTF8xMjhLICkKKyNlbHNlCisjZGVmaW5lIENGR19JQkFUMUwJKENGR19JTklUX1JBTV9BRERSIHwgQkFUTF9QUF8xMCB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDFVCShDRkdfSU5JVF9SQU1fQUREUiB8IEJBVFVfQkxfMTI4SyB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2VuZGlmCisKKy8qIFBDSSBtZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX0lCQVQyTAkoMHg4MDAwMDAwMCB8IEJBVExfUFBfMTAgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQyVQkoMHg4MDAwMDAwMCB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisvKiBGbGFzaCwgY29uZmlnIGFkZHJzLCBldGMgKi8KKyNkZWZpbmUgQ0ZHX0lCQVQzTAkoMHhGMDAwMDAwMCB8IEJBVExfUFBfMTAgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQzVQkoMHhGMDAwMDAwMCB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisjZGVmaW5lIENGR19EQkFUMEwJQ0ZHX0lCQVQwTAorI2RlZmluZSBDRkdfREJBVDBVCUNGR19JQkFUMFUKKyNkZWZpbmUgQ0ZHX0RCQVQxTAlDRkdfSUJBVDFMCisjZGVmaW5lIENGR19EQkFUMVUJQ0ZHX0lCQVQxVQorI2RlZmluZSBDRkdfREJBVDJMCUNGR19JQkFUMkwKKyNkZWZpbmUgQ0ZHX0RCQVQyVQlDRkdfSUJBVDJVCisjZGVmaW5lIENGR19EQkFUM0wJQ0ZHX0lCQVQzTAorI2RlZmluZSBDRkdfREJBVDNVCUNGR19JQkFUM1UKKworLyoKKyAqIEZvciBib290aW5nIExpbnV4LCB0aGUgYm9hcmQgaW5mbyBhbmQgY29tbWFuZCBsaW5lIGRhdGEKKyAqIGhhdmUgdG8gYmUgaW4gdGhlIGZpcnN0IDggTUIgb2YgbWVtb3J5LCBzaW5jZSB0aGlzIGlzCisgKiB0aGUgbWF4aW11bSBtYXBwZWQgYnkgdGhlIExpbnV4IGtlcm5lbCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKi8KKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXggKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZMQVNIIG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMgkvKiBtYXggbnVtYmVyIG9mIG1lbW9yeSBiYW5rcwkJKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTIwCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcAkqLworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpCSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENhY2hlIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNDAgQ1BVCQkJKi8KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLworCisKKy8qIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIG1hbnVhbCAqLworCisjZGVmaW5lIENPTkZJR19EUkFNXzUwTUhaCTEKKyNkZWZpbmUgQ09ORklHX1NEUkFNXzUwTUhaCisKKyN1bmRlZglOUl84MjU5X0lOVFMKKyNkZWZpbmUgTlJfODI1OV9JTlRTCQkxCisKKworI2RlZmluZSBDT05GSUdfRElTS19TUElOVVBfVElNRSAxMDAwMDAwCisKKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TYW5kcG9pbnQ4MjQ1LmggYi9pbmNsdWRlL2NvbmZpZ3MvU2FuZHBvaW50ODI0NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDU2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU2FuZHBvaW50ODI0NS5oCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxLCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGJvYXJkL2NvbmZpZy5oIC0gY29uZmlndXJhdGlvbiBvcHRpb25zLCBib2FyZCBzcGVjaWZpYworICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisKKyNkZWZpbmUgQ09ORklHX01QQzgyNFgJCTEKKyNkZWZpbmUgQ09ORklHX01QQzgyNDUJCTEKKyNkZWZpbmUgQ09ORklHX1NBTkRQT0lOVAkxCisKKyNpZiAwCisjZGVmaW5lIFVTRV9ESU5LMzIJCTEKKyNlbHNlCisjdW5kZWYgVVNFX0RJTkszMgorI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgIDMgICAgICAgICAgICAgICAvKiBzZXQgdG8gJzMnIGZvciBvbi1jaGlwIERVQVJUICovCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAorI2RlZmluZSBDT05GSUdfRFJBTV9TUEVFRAkxMDAJCS8qIE1IegkJCQkqLworCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTCB8IFwKKwkJCQkgIENGR19DTURfRUxGICAgIHwgXAorCQkJCSAgQ0ZHX0NNRF9JMkMgCSB8IFwKKwkJCQkgIENGR19DTURfRUVQUk9NIHwgXAorCQkJCSAgQ0ZHX0NNRF9QQ0kgKQorCisvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCisjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCTEJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KQkvKiBQcmludCBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4MDAxMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MJCSovCisjZGVmaW5lIENGR19IWgkJCTEwMDAJCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUENJIHN0dWZmCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgQ09ORklHX1BDSQkJCQkvKiBpbmNsdWRlIHBjaSBzdXBwb3J0CQkqLworI3VuZGVmIENPTkZJR19QQ0lfUE5QCisKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkJCS8qIE11bHRpIGV0aGVybmV0IGNhcmRzIHN1cHBvcnQgKi8KKworI2RlZmluZSBDT05GSUdfRUVQUk8xMDAKKyNkZWZpbmUgQ09ORklHX05BVFNFTUkKKyNkZWZpbmUgQ09ORklHX05TODM4MlgKKworI2RlZmluZSBQQ0lfRU5FVDBfSU9BRERSCTB4ODAwMDAwMDAKKyNkZWZpbmUgUENJX0VORVQwX01FTUFERFIJMHg4MDAwMDAwMAorI2RlZmluZQlQQ0lfRU5FVDFfSU9BRERSCTB4ODEwMDAwMDAKKyNkZWZpbmUJUENJX0VORVQxX01FTUFERFIJMHg4MTAwMDAwMAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXJ0IGFkZHJlc3NlcyBmb3IgdGhlIGZpbmFsIG1lbW9yeSBjb25maWd1cmF0aW9uCisgKiAoU2V0IHVwIGJ5IHRoZSBzdGFydHVwIGNvZGUpCisgKiBQbGVhc2Ugbm90ZSB0aGF0IENGR19TRFJBTV9CQVNFIF9tdXN0XyBzdGFydCBhdCAwCisgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX01BWF9SQU1fU0laRQkweDEwMDAwMDAwCisKKyNkZWZpbmUgQ0ZHX1JFU0VUX0FERFJFU1MJMHhGRkYwMDEwMAorCisjaWYgZGVmaW5lZCAoVVNFX0RJTkszMikKKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkweDAwMDMwMDAwCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJMHgwMDA5MDAwMAorI2RlZmluZSBDRkdfUkFNQk9PVAkJMQorI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUgkoQ0ZHX01PTklUT1JfQkFTRSArIENGR19NT05JVE9SX0xFTikKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAkweDEwMDAwCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTI1NiAgLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKyNlbHNlCisjdW5kZWYJQ0ZHX1JBTUJPT1QKKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkweDAwMDMwMDAwCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJVEVYVF9CQVNFCisKKy8qI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRSAgICAyNTYqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkxMjgKKworI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUiAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5EICAgICAgMHgxMDAwCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQgIChDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisKKyNlbmRpZgorCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZGRjAwMDAwCisjaWYgMAorI2RlZmluZSBDRkdfRkxBU0hfU0laRQkJKDUxMiAqIDEwMjQpCS8qIHNhbmRwb2ludCBoYXMgdGlueSBlZXByb20JKi8KKyNlbHNlCisjZGVmaW5lIENGR19GTEFTSF9TSVpFCQkoMTAyNCAqIDEwMjQpCS8qIFVuaXR5IGhhcyBvbmJvYXJkIDFNQnl0ZSBmbGFzaCAqLworI2VuZGlmCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQorI2RlZmluZSBDRkdfRU5WX09GRlNFVAkJMHgwMDAwNDAwMAkvKiBPZmZzZXQgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHgwMDAwMjAwMAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoNTEyIDw8IDEwKQkvKiBSZXNlcnZlIDUxMiBrQiBmb3IgbWFsbG9jKCkJKi8KKworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDAwMDAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwNDAwMDAwMAkvKiAwIC4uLiAzMiBNQiBpbiBEUkFNCQkqLworCisjZGVmaW5lIENGR19FVU1CX0FERFIJCTB4RkMwMDAwMDAKKworI2RlZmluZSBDRkdfSVNBX01FTQkJMHhGRDAwMDAwMAorI2RlZmluZSBDRkdfSVNBX0lPCQkweEZFMDAwMDAwCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX1JBTkdFX0JBU0UJMHhGRjAwMDAwMAkvKiBmbGFzaCBtZW1vcnkgYWRkcmVzcyByYW5nZQkqLworI2RlZmluZSBDRkdfRkxBU0hfUkFOR0VfU0laRQkweDAxMDAwMDAwCisjZGVmaW5lIEZMQVNIX0JBU0UwX1BSRUxJTQkweEZGRjAwMDAwCS8qIHNhbmRwb2ludCBmbGFzaAkJKi8KKyNkZWZpbmUgRkxBU0hfQkFTRTFfUFJFTElNCTB4RkYwMDAwMDAJLyogUE1DIG9uYm9hcmQgZmxhc2gJCSovCisKKy8qCisgKiBzZWxlY3QgaTJjIHN1cHBvcnQgY29uZmlndXJhdGlvbgorICoKKyAqIFN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyBhcmUge25vbmUsIHNvZnR3YXJlLCBoYXJkd2FyZX0gZHJpdmVycy4KKyAqIElmIHRoZSBzb2Z0d2FyZSBkcml2ZXIgaXMgY2hvc2VuLCB0aGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsCisgKiBjb25maWd1cmF0aW9uIGl0ZW1zIHRoYXQgdGhlIGRyaXZlciB1c2VzIHRvIGRyaXZlIHRoZSBwb3J0IHBpbnMuCisgKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCQkxCQkvKiBUbyBlbmFibGUgSTJDIHN1cHBvcnQJKi8KKyN1bmRlZiAgQ09ORklHX1NPRlRfSTJDCQkJCS8qIEkyQyBiaXQtYmFuZ2VkCQkqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcwkqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCisKKyNpZmRlZiBDT05GSUdfU09GVF9JMkMKKyNlcnJvciAiU29mdCBJMkMgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuICBQbGVhc2UgcmV2aWV3ISIKKyNkZWZpbmUgSTJDX1BPUlQJCTMgICAgICAgICAgICAgICAvKiBQb3J0IEE9MCwgQj0xLCBDPTIsIEQ9MyAqLworI2RlZmluZSBJMkNfQUNUSVZFCQkoaW9wLT5wZGlyIHw9ICAweDAwMDEwMDAwKQorI2RlZmluZSBJMkNfVFJJU1RBVEUJCShpb3AtPnBkaXIgJj0gfjB4MDAwMTAwMDApCisjZGVmaW5lIEkyQ19SRUFECQkoKGlvcC0+cGRhdCAmIDB4MDAwMTAwMDApICE9IDApCisjZGVmaW5lIEkyQ19TREEoYml0KQkJaWYoYml0KSBpb3AtPnBkYXQgfD0gIDB4MDAwMTAwMDA7IFwKKwkJCQllbHNlICAgIGlvcC0+cGRhdCAmPSB+MHgwMDAxMDAwMAorI2RlZmluZSBJMkNfU0NMKGJpdCkJCWlmKGJpdCkgaW9wLT5wZGF0IHw9ICAweDAwMDIwMDAwOyBcCisJCQkJZWxzZSAgICBpb3AtPnBkYXQgJj0gfjB4MDAwMjAwMDAKKyNkZWZpbmUgSTJDX0RFTEFZCQl1ZGVsYXkoNSkJLyogMS80IEkyQyBjbG9jayBkdXJhdGlvbiAqLworI2VuZGlmIC8qIENPTkZJR19TT0ZUX0kyQyAqLworCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFIJMHg1NwkJLyogRUVQUk9NIElTMjRDMDIJCSovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOCTEJCS8qIEJ5dGVzIG9mIGFkZHJlc3MJCSovCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTCTMKKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTEwCS8qIGFuZCB0YWtlcyB1cCB0byAxMCBtc2VjICovCisKKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBTktTCQl7IEZMQVNIX0JBU0UwX1BSRUxJTSAsIEZMQVNIX0JBU0UxX1BSRUxJTSB9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb25zIGZvciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgYW5kIGRhdGEgYXJlYSAoaW4gRFBSQU0pCisgKi8KKworCisjZGVmaW5lIENGR19XSU5CT05EXzgzQzU1MwkxCS8qaGFzIGEgd2luYm9uZCBicmlkZ2UJCQkqLworI2RlZmluZSBDRkdfVVNFX1dJTkJPTkRfSURFCTAJLyp1c2Ugd2luYm9uZCA4M2M1NTMgaW50ZXJuYWwgSURFIGN0cmxyICovCisjZGVmaW5lIENGR19XSU5CT05EX0lTQV9DRkdfQUREUiAgICAweDgwMDA1ODAwCS8qcGNpLWlzYSBicmlkZ2UgY29uZmlnIGFkZHIJKi8KKyNkZWZpbmUgQ0ZHX1dJTkJPTkRfSURFX0NGR19BRERSICAgIDB4ODAwMDU5MDAJLyppZGUgY29uZmlnIGFkZHIJCSovCisKKyNkZWZpbmUgQ0ZHX0lERV9NQVhCVVMJCTIgICAvKiBtYXguIDIgSURFIGJ1c3NlcwkqLworI2RlZmluZSBDRkdfSURFX01BWERFVklDRQkoQ0ZHX0lERV9NQVhCVVMqMikgLyogbWF4LiAyIGRyaXZlcyBwZXIgSURFIGJ1cyAqLworCisvKgorICogTlM4NzMwOCBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX05TODczMDgJCQkvKiBOYXQgU2VtaSBzdXBlci1pbyBjb250cm9sbGVyIG9uIElTQSBidXMgKi8KKworI2RlZmluZSBDRkdfTlM4NzMwOF9CQUREUl8xMAkxCisKKyNkZWZpbmUgQ0ZHX05TODczMDhfREVWUwkoIENGR19OUzg3MzA4X1VBUlQxICAgfCBcCisJCQkJICBDRkdfTlM4NzMwOF9VQVJUMiAgIHwgXAorCQkJCSAgQ0ZHX05TODczMDhfUE9XUk1BTiB8IFwKKwkJCQkgIENGR19OUzg3MzA4X1JUQ19BUEMgKQorCisjdW5kZWYgIENGR19OUzg3MzA4X1BTMk1PRAorCisjZGVmaW5lIENGR19OUzg3MzA4X0NTMF9CQVNFCTB4MDA3NgorI2RlZmluZSBDRkdfTlM4NzMwOF9DUzBfQ09ORgkweDMwCisjZGVmaW5lIENGR19OUzg3MzA4X0NTMV9CQVNFCTB4MDA3NQorI2RlZmluZSBDRkdfTlM4NzMwOF9DUzFfQ09ORgkweDMwCisjZGVmaW5lIENGR19OUzg3MzA4X0NTMl9CQVNFCTB4MDA3NAorI2RlZmluZSBDRkdfTlM4NzMwOF9DUzJfQ09ORgkweDMwCisKKy8qCisgKiBOUzE2NTUwIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKworI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQkxCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkxODQzMjAwCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkoQ0ZHX0lTQV9JTyArIENGR19OUzg3MzA4X1VBUlQxX0JBU0UpCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTIJKENGR19JU0FfSU8gKyBDRkdfTlM4NzMwOF9VQVJUMl9CQVNFKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00zCShDRkdfRVVNQl9BRERSICsgMHg0NTAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT000CShDRkdfRVVNQl9BRERSICsgMHg0NjAwKQorCisvKgorICogTG93IExldmVsIENvbmZpZ3VyYXRpb24gU2V0dGluZ3MKKyAqIChhZGRyZXNzIG1hcHBpbmdzLCByZWdpc3RlciBpbml0aWFsIHZhbHVlcywgZXRjLikKKyAqIFlvdSBzaG91bGQga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgaWYgeW91IG1ha2UgY2hhbmdlcyBoZXJlLgorICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgMzMzMzMzMzMJLyogZXh0ZXJuYWwgZnJlcXVlbmN5IHRvIHBsbCAqLworCisjZGVmaW5lIENGR19ST01OQUwJCTcJLypyb20vZmxhc2ggbmV4dCBhY2Nlc3MgdGltZQkJKi8KKyNkZWZpbmUgQ0ZHX1JPTUZBTAkJMTEJLypyb20vZmxhc2ggYWNjZXNzIHRpbWUJCQkqLworCisjZGVmaW5lIENGR19SRUZJTlQJNDMwCS8qIG5vIG9mIGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIENCUiByZWZyZXNoIGN5Y2xlcyAqLworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgU0RSQU0gb25seSovCisjZGVmaW5lIENGR19CU1RPUFJFCTEyMQkvKiBCdXJzdCBUbyBQcmVjaGFyZ2UsIHNldHMgb3BlbiBwYWdlIGludGVydmFsICovCisjZGVmaW5lIENGR19SRUZSRUMJCTgJLyogUmVmcmVzaCB0byBhY3RpdmF0ZSBpbnRlcnZhbAkJKi8KKyNkZWZpbmUgQ0ZHX1JETEFUCQk0CS8qIGRhdGEgbGF0ZW5jeSBmcm9tIHJlYWQgY29tbWFuZAkqLworI2RlZmluZSBDRkdfUFJFVE9BQ1QJCTMJLyogUHJlY2hhcmdlIHRvIGFjdGl2YXRlIGludGVydmFsCSovCisjZGVmaW5lIENGR19BQ1RUT1BSRQkJNQkvKiBBY3RpdmF0ZSB0byBQcmVjaGFyZ2UgaW50ZXJ2YWwJKi8KKyNkZWZpbmUgQ0ZHX0FDVE9SVwkJMwkvKiBBY3RpdmF0ZSB0byBSL1cJCQkqLworI2RlZmluZSBDRkdfU0RNT0RFX0NBU19MQVQJMwkvKiBTRE1PREUgQ0FTIGxhdGVuY3kJCQkqLworI2RlZmluZSBDRkdfU0RNT0RFX1dSQVAJCTAJLyogU0RNT0RFIHdyYXAgdHlwZQkJCSovCisjaWYgMAorI2RlZmluZSBDRkdfU0RNT0RFX0JVUlNUTEVOCTIJLyogT0JTT0xFVEUhICBTRE1PREUgQnVyc3QgbGVuZ3RoIDI9NCwgMz04CQkqLworI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX1JFR0lTVEVSRF9UWVBFX0JVRkZFUiAgIDEKKyNkZWZpbmUgQ0ZHX0VYVFJPTSAxCisjZGVmaW5lIENGR19SRUdESU1NIDAKKworCisvKiBtZW1vcnkgYmFuayBzZXR0aW5ncyovCisvKgorICogb25seSBiaXRzIDIwLTI5IGFyZSBhY3R1YWxseSB1c2VkIGZyb20gdGhlc2UgdmFsZXMgdG8gc2V0IHRoZQorICogc3RhcnQvZW5kIGFkZHJlc3MgdGhlIHVwcGVyIHR3byBiaXRzIHdpbGwgYmUgMCwgYW5kIHRoZSBsb3dlciAyMAorICogYml0cyB3aWxsIGJlIHNldCB0byAweDAwMDAwIGZvciBhIHN0YXJ0IGFkZHJlc3MsIG9yIDB4ZmZmZmYgZm9yIGFuCisgKiBlbmQgYWRkcmVzcworICovCisjZGVmaW5lIENGR19CQU5LMF9TVEFSVAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzBfRU5ECQkoQ0ZHX01BWF9SQU1fU0laRSAtIDEpCisjZGVmaW5lIENGR19CQU5LMF9FTkFCTEUJMQorI2RlZmluZSBDRkdfQkFOSzFfU1RBUlQJCTB4M2ZmMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTksxX0VORAkJMHgzZmZmZmZmZgorI2RlZmluZSBDRkdfQkFOSzFfRU5BQkxFCTAKKyNkZWZpbmUgQ0ZHX0JBTksyX1NUQVJUCQkweDNmZjAwMDAwCisjZGVmaW5lIENGR19CQU5LMl9FTkQJCTB4M2ZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0JBTksyX0VOQUJMRQkwCisjZGVmaW5lIENGR19CQU5LM19TVEFSVAkJMHgzZmYwMDAwMAorI2RlZmluZSBDRkdfQkFOSzNfRU5ECQkweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LM19FTkFCTEUJMAorI2RlZmluZSBDRkdfQkFOSzRfU1RBUlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks0X0VORAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzRfRU5BQkxFCTAKKyNkZWZpbmUgQ0ZHX0JBTks1X1NUQVJUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LNV9FTkQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks1X0VOQUJMRQkwCisjZGVmaW5lIENGR19CQU5LNl9TVEFSVAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzZfRU5ECQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19CQU5LNl9FTkFCTEUJMAorI2RlZmluZSBDRkdfQkFOSzdfU1RBUlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks3X0VORAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzdfRU5BQkxFCTAKKy8qCisgKiBNZW1vcnkgYmFuayBlbmFibGUgYml0bWFzaywgc3BlY2lmeWluZyB3aGljaCBvZiB0aGUgYmFua3MgZGVmaW5lZCBhYm92ZQorIGFyZSBhY3R1YWxseSBwcmVzZW50LiBNU0IgaXMgZm9yIGJhbmsgIzcsIExTQiBpcyBmb3IgYmFuayAjMC4KKyAqLworI2RlZmluZSBDRkdfQkFOS19FTkFCTEUJCTB4MDEKKworI2RlZmluZSBDRkdfT0RDUgkJMHhmZgkvKiBjb25maWd1cmVzIGxpbmUgZHJpdmVyIGltcGVkYW5jZXMsCSovCisJCQkJCS8qIHNlZSA4MjQwIGJvb2sgZm9yIGJpdCBkZWZpbml0aW9ucwkqLworI2RlZmluZSBDRkdfUEdNQVgJCTB4MzIJLyogaG93IGxvbmcgdGhlIDgyNDAgcmV0YWlucyB0aGUJKi8KKwkJCQkJLyogY3VycmVudGx5IGFjY2Vzc2VkIHBhZ2UgaW4gbWVtb3J5CSovCisJCQkJCS8qIHNlZSA4MjQwIGJvb2sgZm9yIGRldGFpbHMJCSovCisKKy8qIFNEUkFNIDAgLSAyNTZNQiAqLworI2RlZmluZSBDRkdfSUJBVDBMCShDRkdfU0RSQU1fQkFTRSB8IEJBVExfUFBfMTAgfCBCQVRMX01FTUNPSEVSRU5DRSkKKyNkZWZpbmUgQ0ZHX0lCQVQwVQkoQ0ZHX1NEUkFNX0JBU0UgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKworLyogc3RhY2sgaW4gRENBQ0hFIEAgMUdCIChubyBiYWNraW5nIG1lbSkgKi8KKyNpZiBkZWZpbmVkKFVTRV9ESU5LMzIpCisjZGVmaW5lIENGR19JQkFUMUwJKDB4NDAwMDAwMDAgfCBCQVRMX1BQXzAwICkKKyNkZWZpbmUgQ0ZHX0lCQVQxVQkoMHg0MDAwMDAwMCB8IEJBVFVfQkxfMTI4SyApCisjZWxzZQorI2RlZmluZSBDRkdfSUJBVDFMCShDRkdfSU5JVF9SQU1fQUREUiB8IEJBVExfUFBfMTAgfCBCQVRMX01FTUNPSEVSRU5DRSkKKyNkZWZpbmUgQ0ZHX0lCQVQxVQkoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRVX0JMXzEyOEsgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNlbmRpZgorCisvKiBQQ0kgbWVtb3J5ICovCisjZGVmaW5lIENGR19JQkFUMkwJKDB4ODAwMDAwMDAgfCBCQVRMX1BQXzEwIHwgQkFUTF9DQUNIRUlOSElCSVQpCisjZGVmaW5lIENGR19JQkFUMlUJKDB4ODAwMDAwMDAgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKworLyogRmxhc2gsIGNvbmZpZyBhZGRycywgZXRjICovCisjZGVmaW5lIENGR19JQkFUM0wJKDB4RjAwMDAwMDAgfCBCQVRMX1BQXzEwIHwgQkFUTF9DQUNIRUlOSElCSVQpCisjZGVmaW5lIENGR19JQkFUM1UJKDB4RjAwMDAwMDAgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKworI2RlZmluZSBDRkdfREJBVDBMCUNGR19JQkFUMEwKKyNkZWZpbmUgQ0ZHX0RCQVQwVQlDRkdfSUJBVDBVCisjZGVmaW5lIENGR19EQkFUMUwJQ0ZHX0lCQVQxTAorI2RlZmluZSBDRkdfREJBVDFVCUNGR19JQkFUMVUKKyNkZWZpbmUgQ0ZHX0RCQVQyTAlDRkdfSUJBVDJMCisjZGVmaW5lIENGR19EQkFUMlUJQ0ZHX0lCQVQyVQorI2RlZmluZSBDRkdfREJBVDNMCUNGR19JQkFUM0wKKyNkZWZpbmUgQ0ZHX0RCQVQzVQlDRkdfSUJBVDNVCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGTEFTSCBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTIJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJCSovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkyMAkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAJKi8KKworI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkxMjAwMDAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKGluIG1zKQkqLworI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAk1MDAJLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKGluIG1zKQkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjQwIENQVQkJCSovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCisKKy8qCisgKiBJbnRlcm5hbCBEZWZpbml0aW9ucworICoKKyAqIEJvb3QgRmxhZ3MKKyAqLworI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CQkJKi8KKworCisvKiB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBtYW51YWwgKi8KKworI2RlZmluZSBDT05GSUdfRFJBTV81ME1IWgkxCisjZGVmaW5lIENPTkZJR19TRFJBTV81ME1IWgorCisjdW5kZWYJTlJfODI1OV9JTlRTCisjZGVmaW5lIE5SXzgyNTlfSU5UUwkJMQorCisKKyNkZWZpbmUgQ09ORklHX0RJU0tfU1BJTlVQX1RJTUUgMTAwMDAwMAorCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvWlVNQS5oIGIvaW5jbHVkZS9jb25maWdzL1pVTUEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTc4ZjdlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL1pVTUEuaApAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogSm9zaCBIdWJlciA8aHViZXJAbWNseC5jb20+LCBNaXNzaW9uIENyaXRpY2FsIExpbnV4LCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIGJvYXJkL2NvbmZpZy5oIC0gY29uZmlndXJhdGlvbiBvcHRpb25zLCBib2FyZCBzcGVjaWZpYworICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNkZWZpbmUgQ0ZHX0dUXzY0MjZ4ICAgICAgICBHVF82NDI2MCAvKiB3aXRoIGEgNjQyNjAgc3lzdGVtIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgQ09ORklHX0VUSEVSX1BPUlRfTUlJCS8qIHVzZSB0d28gTUlJIHBvcnRzICovCisjZGVmaW5lIENPTkZJR19JTlRFTF9MWFQ5N1gJLyogSW50ZWwgTFhUOTdYIHBoeSAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGdhbGlsZW8vY29yZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICIuLi9ib2FyZC9ldmI2NDI2MC9sb2NhbC5oIgorCisjZGVmaW5lIENPTkZJR19FVkI2NDI2MAkJMQkvKiB0aGlzIGlzIGFuIEVWQjY0MjYwIGJvYXJkCSovCisjZGVmaW5lIENPTkZJR19aVU1BX1YyCQkxCS8qIGFsd2F5cyBkZWZpbmUgdGhpcyBmb3IgWlVNQSB2MiAqLworCisvKiAjZGVmaW5lIENPTkZJR19aVU1BX1YyX09MRAkxICovCS8qIGJhY2t3YXJkcyBjb21wYXQgZm9yIG9sZCBWMiBib2FyZCAqLworCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMzg0MDAJLyogY29uc29sZSBiYXVkcmF0ZSA9IDM4NDAwCSovCisKKyNkZWZpbmUgQ09ORklHX0VDQwkJCS8qIGVuYWJsZSBFQ0Mgc3VwcG9ydCAqLworCisjZGVmaW5lIENPTkZJR183NTBDWAkJCS8qIHdlIGhhdmUgYSA3NTBDWC9DWGUgKG92ZXJyaWRlIGxvY2FsLmgpICovCisKKy8qIHdoaWNoIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyB0byBjYWxsIGZvciB0aGlzIGJvYXJkICovCisjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgorI2RlZmluZSBDT05GSUdfQk9BUkRfUFJFX0lOSVQKKyNkZWZpbmUgQ0ZHX0JPQVJEX0FTTV9JTklUCisKKyNkZWZpbmUgQ0ZHX0JPQVJEX05BTUUJCSJadW1hIEFQdjIiCisKKyNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCisjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgorCisvKgorICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGxldCB5b3Ugc2VsZWN0IHdoYXQgc2VyaWFsIHlvdSB3YW50IHRvIHVzZQorICogZm9yIHlvdXIgY29uc29sZSBkcml2ZXIuCisgKgorICogd2hhdCB0byBkbzoKKyAqIHRvIHVzZSB0aGUgRFVBUlQsIHVuZGVmIENPTkZJR19NUFNDLgkgSWYgeW91IGhhdmUgaGFja2VkIGEgc2VyaWFsCisgKiBjYWJsZSBvbnRvIHRoZSBzZWNvbmQgRFVBUlQgY2hhbm5lbCwgY2hhbmdlIHRoZSBDRkdfRFVBUlQgcG9ydCBmcm9tIDEKKyAqIHRvIDAgYmVsb3cuCisgKgorICogdG8gdXNlIHRoZSBNUFNDLCAjZGVmaW5lIENPTkZJR19NUFNDLiAgSWYgeW91IGhhdmUgd2lyZWQgdXAgYW5vdGhlcgorICogbXBzYyBjaGFubmVsLCBjaGFuZ2UgQ09ORklHX01QU0NfUE9SVCB0byB0aGUgZGVzaXJlZCB2YWx1ZS4KKyAqLworI2RlZmluZSBDT05GSUdfTVBTQworCisjZGVmaW5lIENPTkZJR19NUFNDX1BPUlQJMAorCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkgICAgICAgIC8qIGF0dGVtcHQgYWxsIGF2YWlsYWJsZSBhZGFwdGVycyAqLworCisvKiBkZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBlbmFibGUgR1QgTUFDIGZpbHRlcmluZyAqLworI2RlZmluZSBDT05GSUdfR1RfVVNFX01BQ19IQVNIX1RBQkxFCisKKyNpZiAxCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCSovCisjZWxzZQorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzCSovCisjZW5kaWYKKyNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCisKKyN1bmRlZglDT05GSUdfQk9PVEFSR1MKKworI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJCQkJCQkJXAorCSJ0ZnRwYm9vdCAmJiAiCQkJCQkJCQlcCisJInNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3IG5mc3Jvb3Q9JHNlcnZlcmlwOiRyb290cGF0aCAiIFwKKwkiaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDoiCQkJCVwKKwkiJG5ldG1hc2s6JGhvc3RuYW1lOmV0aDA6bm9uZSBwYW5pYz01ICYmIGJvb3RtIgorCisjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTAJLyogZWNobyBvZmYgZm9yIHNlcmlhbCBkb3dubG9hZCAqLworI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZXMJKi8KKworI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLworI3VuZGVmCUNPTkZJR19BTFRJVkVDCQkJLyogdW5kZWYgdG8gZGlzYWJsZQkJKi8KKworI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCisJCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisKKyNkZWZpbmUgQ09ORklHX01JSQkJLyogZW5hYmxlIE1JSSBjb21tYW5kcyAqLworCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgXAorCQkJCSBDRkdfQ01EX0FTS0VOViB8IFwKKwkJCQkgQ0ZHX0NNRF9CU1AJfCBcCisJCQkJIENGR19DTURfSkZGUzIJfCBcCisJCQkJIENGR19DTURfTUlJCXwgXAorCQkJCSBDRkdfQ01EX0RBVEUpCisKKy8qIEZsYXNoIGJhbmtzIEpGRlMyIHNob3VsZCB1c2UgKi8KKyNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMQorI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTCTIKKworLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLworI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2Vsc2UKKyNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZW5kaWYKKyNkZWZpbmUgQ0ZHX1BCU0laRSAoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19NQVhBUkdTCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDQwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwMEMwMDAwMAkvKiA0IC4uLiAxMiBNQiBpbiBEUkFNCSovCisKKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHgwMDMwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworCisjZGVmaW5lIENGR19IWgkJCTEwMDAJCS8qIGRlY3IgZnJlcTogMW1zIHRpY2tzICovCisKKyNkZWZpbmUgQ0ZHX0JVU19IWgkJMTMzMDAwMDAwCS8qIDEzMyBNSHoJCSovCisKKyNkZWZpbmUgQ0ZHX0JVU19DTEsJCUNGR19CVVNfSFoKKworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAsIDIzMDQwMCB9CisKKy8qCisgKiBMb3cgTGV2ZWwgQ29uZmlndXJhdGlvbiBTZXR0aW5ncworICogKGFkZHJlc3MgbWFwcGluZ3MsIHJlZ2lzdGVyIGluaXRpYWwgdmFsdWVzLCBldGMuKQorICogWW91IHNob3VsZCBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBpZiB5b3UgbWFrZSBjaGFuZ2VzIGhlcmUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbnMgZm9yIGluaXRpYWwgc3RhY2sgcG9pbnRlciBhbmQgZGF0YSBhcmVhCisgKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJMHg0MDAwMDAwMAorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECTB4MTAwMAorI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkxMjggIC8qIHNpemUgaW4gYnl0ZXMgcmVzZXJ2ZWQgZm9yIGluaXQgZGF0YSAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfT0ZGU0VUCShDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisjZGVmaW5lIENGR19JTklUX1JBTV9MT0NLCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhcnQgYWRkcmVzc2VzIGZvciB0aGUgZmluYWwgbWVtb3J5IGNvbmZpZ3VyYXRpb24KKyAqIChTZXQgdXAgYnkgdGhlIHN0YXJ0dXAgY29kZSkKKyAqIFBsZWFzZSBub3RlIHRoYXQgQ0ZHX1NEUkFNX0JBU0UgX211c3RfIHN0YXJ0IGF0IDAKKyAqLworI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhmZmYwMDAwMAorI2RlZmluZSBDRkdfUkVTRVRfQUREUkVTUwkweGZmZjAwMTAwCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiA8PCAxMCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IgKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlDRkdfRkxBU0hfQkFTRQorI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDI1NiA8PCAxMCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIG1hbGxvYyAqLworCisvKiBhcmVhcyB0byBtYXAgZGlmZmVyZW50IHRoaW5ncyB3aXRoIHRoZSBHVCBpbiBwaHlzaWNhbCBzcGFjZSAqLworI2RlZmluZSBDRkdfRFJBTV9CQU5LUwkJNAorI2RlZmluZSBDRkdfREZMX0dUX1JFR1MJCTB4MTQwMDAwMDAJLyogYm9vdCB0aW1lIEdUX1JFR1MgKi8KKworLyogV2hhdCB0byBwdXQgaW4gdGhlIGJhdHMuICovCisjZGVmaW5lIENGR19NSVNDX1JFR0lPTl9CQVNFCTB4ZjAwMDAwMDAKKworLyogUGVyaXBoZXJhbCBEZXZpY2Ugc2VjdGlvbiAqLworI2RlZmluZSBDRkdfR1RfUkVHUwkJMHhmODAwMDAwMAkvKiBsYXRlciBtYXBwZWQgR1RfUkVHUyAqLworI2RlZmluZSBDRkdfREVWX0JBU0UJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0RFVjBfU0laRQkJXzY0TSAvKiB6dW1hIGZsYXNoIEAgMHhmMDAwLjAwMDAqLworI2RlZmluZSBDRkdfREVWMV9TSVpFCQkgXzhNIC8qIHp1bWEgSURFICAgQCAweGY0MDAuMDAwMCAqLworI2RlZmluZSBDRkdfREVWMl9TSVpFCQkgXzhNIC8qIHVudXNlZCAqLworI2RlZmluZSBDRkdfREVWM19TSVpFCQkgXzhNIC8qIHVudXNlZCAqLworCisjZGVmaW5lIENGR19ERVYwX1BBUgkJMHhjNDk4MjQzYworCS8qICAgICBjICAgIDQgICAgIDkgICAgIDggICAgIDIJICAgIDQgICAgIDMgICAgIGMgKi8KKwkvKiAzMyAyMnwyMjIyfDIyIDIyfDExMSAxfDExIDExfDEgMSAgfAkgICB8ICAgICAgKi8KKwkvKiAxMCA5OHw3NjU0fDMyIDEwfDk4NyA2fDU0IDMyfDEgMDk4fDcgNjU0fDMgMjEwICovCisJLyogMTF8MDB8MDEwMHwxMCAwMXwxMDB8MCAwMHwxMCAwfDEwMCAwfDAxMSAxfDEwMCAqLworCS8qICAzfCAwfC4uLi4gLi58IDF8IDQgfCAgMCB8ICA0IHwgICA4IHwgICA3IHwgNCAgKi8KKworI2RlZmluZSBDRkdfREVWMV9QQVIJCTB4YzAxYjZhYzUKKwkvKiAgICAgYyAgICAwICAgICAxICAgICBiICAgICA2CSAgICBhICAgICBjICAgICA1ICovCisJLyogMzMgMjJ8MjIyMnwyMiAyMnwxMTEgMXwxMSAxMXwxIDEgIHwJICAgfCAgICAgICovCisJLyogMTAgOTh8NzY1NHwzMiAxMHw5ODcgNnw1NCAzMnwxIDA5OHw3IDY1NHwzIDIxMCAqLworCS8qIDExfDAwfDAwMDB8MDAgMDF8MTAxfDEgMDF8MTAgMXwwMTAgMXwxMDAgMHwxMDEgKi8KKwkvKiAgM3wgMHwuLi4uIC4ufCAxfCA1IHwgIDUgfCAgNSB8ICAgNSB8ICAgOCB8IDUgICovCisKKworCisjZGVmaW5lIENGR184QklUX0JPT1RfUEFSCTB4YzAwYjVlN2MKKworI2RlZmluZSBDRkdfTVBQX0NPTlRST0xfMAkweDAwMDA3Nzc3IC8qIEdQUFs3OjRdIDogUkVRMFsxOjBdIEdOVDBbMTowXSAqLworI2RlZmluZSBDRkdfTVBQX0NPTlRST0xfMQkweDAwMDAwMDAwIC8qIEdQUFsxNToxMl0gOiBHUFBbMTE6OF0gKi8KKyNkZWZpbmUgQ0ZHX01QUF9DT05UUk9MXzIJMHgwMDAwODg4OCAvKiBHUFBbMjM6MjBdIDogUkVRMVsxOjBdIEdOVDFbMTowXSAqLworI2RlZmluZSBDRkdfTVBQX0NPTlRST0xfMwkweDAwMDAwMDAwIC8qIEdQUFszMToyOF0gKGludFszOjBdKSAqLworCQkJCQkgICAvKiBHUFBbMjc6MjRdICgyNyBpcyBpbnQ0LCByZXN0IGFyZSBHUFApICovCisKKyNkZWZpbmUgQ0ZHX1NFUklBTF9QT1JUX01VWAkweDAwMDAxMTAxIC8qIDExPU1QU0MxL01QU0MwIDAxPUVUSCwgIDA9b25seSBNSUkgKi8KKyNkZWZpbmUgQ0ZHX0dQUF9MRVZFTF9DT05UUk9MCTB4ZjgwMDAwMDAgLyogaW50ZXJydXB0IGlucHV0czogR1BQWzMxOjI3XSAqLworCisjZGVmaW5lIENGR19TRFJBTV9DT05GSUcJMHhlNGUxODIwMAkvKiAweDQ0OCAqLworCQkJCS8qIGlkbWFzIHVzZSBidWZmZXIgMSwxCisJCQkJICAgY29tbSB1c2UgYnVmZmVyIDEKKwkJCQkgICBwY2kgdXNlIGJ1ZmZlciAwLDAgKHBjaTEtPjAgcGNpMC0+MCkKKwkJCQkgICBjcHUgdXNlIGJ1ZmZlciAxIChSKjE4KQorCQkJCSAgIG5vcm1hbCBsb2FkIChzZWUgYWxzbyBpZmRlZiBIVkwpCisJCQkJICAgc3RhbmRhcmQgU0RSQU0gKHNlZSBhbHNvIGlmZGVmIFJFRykKKwkJCQkgICBub24gc3RhZ2dlcmVkIHJlZnJlc2ggKi8KKwkJCQkvKiAzMToyNiAgMjUgMjMJIDIwIDE5IDE4IDE2ICovCisJCQkJLyogMTExMDAxIDAwIDExMSAwICAwICAwMCAxICovCisKKwkJCQkvKiByZWZyZXNoIGNvdW50PTB4MjAwCisJCQkJICAgcGh5IGludGVybGVhdmUgZGlzYWJsZSAoYnkgZGVmYXVsdCwKKwkJCQkgICBzZXQgbGF0ZXIgYnkgZHJhbSBjb25maWcuLikKKwkJCQkgICB2aXJ0IGludGVybGVhdmUgZW5hYmxlICovCisJCQkJLyogMTUgMTQgMTM6MCAqLworCQkJCS8qIDEgIDAJIDB4MjAwICovCisKKyNkZWZpbmUgQ0ZHX0RFVjBfU1BBQ0UJCUNGR19ERVZfQkFTRQorI2RlZmluZSBDRkdfREVWMV9TUEFDRQkJKENGR19ERVYwX1NQQUNFICsgQ0ZHX0RFVjBfU0laRSkKKyNkZWZpbmUgQ0ZHX0RFVjJfU1BBQ0UJCShDRkdfREVWMV9TUEFDRSArIENGR19ERVYxX1NJWkUpCisjZGVmaW5lIENGR19ERVYzX1NQQUNFCQkoQ0ZHX0RFVjJfU1BBQ0UgKyBDRkdfREVWMl9TSVpFKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQQ0kgc3R1ZmYKKyAqLworCisjZGVmaW5lIFBDSV9IT1NUX0FEQVBURVIJMAkvKiBjb25maWd1cmUgYXIgcGNpIGFkYXB0ZXIJKi8KKyNkZWZpbmUgUENJX0hPU1RfRk9SQ0UJCTEJLyogY29uZmlndXJlIGFzIHBjaSBob3N0CSovCisjZGVmaW5lIFBDSV9IT1NUX0FVVE8JCTIJLyogZGV0ZWN0ZWQgdmlhIGFyYml0ZXIgZW5hYmxlCSovCisKKyNkZWZpbmUgQ09ORklHX1BDSQkJCS8qIGluY2x1ZGUgcGNpIHN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19QQ0lfSE9TVCBQQ0lfSE9TVF9GT1JDRQkvKiBzZWxlY3QgcGNpIGhvc3QgZnVuY3Rpb24JKi8KKyNkZWZpbmUgQ09ORklHX1BDSV9QTlAJCQkvKiBkbyBwY2kgcGx1Zy1hbmQtcGxheQkJKi8KKworLyogUENJIE1FTU9SWSBNQVAgc2VjdGlvbiAqLworI2RlZmluZSBDRkdfUENJMF9NRU1fQkFTRQkweDgwMDAwMDAwCisjZGVmaW5lIENGR19QQ0kwX01FTV9TSVpFCV8xMjhNCisjZGVmaW5lIENGR19QQ0kxX01FTV9CQVNFCTB4ODgwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSTFfTUVNX1NJWkUJXzEyOE0KKworI2RlZmluZSBDRkdfUENJMF8wX01FTV9TUEFDRQkoQ0ZHX1BDSTBfTUVNX0JBU0UpCisjZGVmaW5lIENGR19QQ0kxXzBfTUVNX1NQQUNFCShDRkdfUENJMV9NRU1fQkFTRSkKKworLyogUENJIEkvTyBNQVAgc2VjdGlvbiAqLworI2RlZmluZSBDRkdfUENJMF9JT19CQVNFCTB4ZmEwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSTBfSU9fU0laRQlfMTZNCisjZGVmaW5lIENGR19QQ0kxX0lPX0JBU0UJMHhmYjAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9JT19TSVpFCV8xNk0KKworI2RlZmluZSBDRkdfUENJMF9JT19TUEFDRQkoQ0ZHX1BDSTBfSU9fQkFTRSkKKyNkZWZpbmUgQ0ZHX1BDSTBfSU9fU1BBQ0VfUENJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fU1BBQ0UJKENGR19QQ0kxX0lPX0JBU0UpCisjZGVmaW5lIENGR19QQ0kxX0lPX1NQQUNFX1BDSQkweDAwMDAwMDAwCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbml0aWFsIEJBVCBtYXBwaW5ncworICovCisKKy8qIE5PVEVTOgorICogMSkgR1VBUkRFRCBhbmQgV1JJVEVfVEhSVSBub3QgYWxsb3dlZCBpbiBJQkFUUworICogMikgQ0FDSEVJTkhJQklUIGFuZCBXUklURVRIUk9VR0ggbm90IGFsbG93ZWQgdG9nZXRoZXIgaW4gc2FtZSBCQVQKKyAqLworCisvKiBTRFJBTSAqLworI2RlZmluZSBDRkdfSUJBVDBMIChDRkdfU0RSQU1fQkFTRSB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQwVSAoQ0ZHX1NEUkFNX0JBU0UgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0RCQVQwTCAoQ0ZHX1NEUkFNX0JBU0UgfCBCQVRMX1BQX1JXIHwgQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfREJBVDBVIENGR19JQkFUMFUKKworLyogaW5pdCByYW0gKi8KKyNkZWZpbmUgQ0ZHX0lCQVQxTCAgKENGR19JTklUX1JBTV9BRERSIHwgQkFUTF9QUF9SVyB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDFVICAoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRVX0JMXzEyOEsgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0RCQVQxTCAgQ0ZHX0lCQVQxTAorI2RlZmluZSBDRkdfREJBVDFVICBDRkdfSUJBVDFVCisKKy8qIFBDSTAsIFBDSTEgbWVtb3J5IHNwYWNlIChzdGFydGluZyBhdCBQQ0kwIGJhc2UsIG1hcHBlZCBpbiBvbmUgQkFUKSAqLworI2RlZmluZSBDRkdfSUJBVDJMIEJBVExfTk9fQUNDRVNTCisjZGVmaW5lIENGR19JQkFUMlUgQ0ZHX0RCQVQyVQorI2RlZmluZSBDRkdfREJBVDJMIChDRkdfUENJMF9NRU1fQkFTRSB8IEJBVExfQ0FDSEVJTkhJQklUIHwgQkFUTF9QUF9SVyB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19EQkFUMlUgKENGR19QQ0kwX01FTV9CQVNFIHwgQkFUVV9CTF8yNTZNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisKKy8qIEdUIHJlZ3MsIGJvb3Ryb20sIGFsbCB0aGUgZGV2aWNlcywgUENJIEkvTyAqLworI2RlZmluZSBDRkdfSUJBVDNMIChDRkdfTUlTQ19SRUdJT05fQkFTRSB8IEJBVExfQ0FDSEVJTkhJQklUIHwgQkFUTF9QUF9SVykKKyNkZWZpbmUgQ0ZHX0lCQVQzVSAoQ0ZHX01JU0NfUkVHSU9OX0JBU0UgfCBCQVRVX1ZTIHwgQkFUVV9WUCB8IEJBVFVfQkxfMjU2TSkKKyNkZWZpbmUgQ0ZHX0RCQVQzTCAoQ0ZHX01JU0NfUkVHSU9OX0JBU0UgfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfUFBfUlcgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfREJBVDNVIENGR19JQkFUM1UKKworLyoKKyAqIEZvciBib290aW5nIExpbnV4LCB0aGUgYm9hcmQgaW5mbyBhbmQgY29tbWFuZCBsaW5lIGRhdGEKKyAqIGhhdmUgdG8gYmUgaW4gdGhlIGZpcnN0IDggTUIgb2YgbWVtb3J5LCBzaW5jZSB0aGlzIGlzCisgKiB0aGUgbWF4aW11bSBtYXBwZWQgYnkgdGhlIExpbnV4IGtlcm5lbCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKi8KKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJKDg8PDIwKSAvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRkxBU0ggb3JnYW5pemF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkzCS8qIG1heCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzCSovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkxMzAJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ0ZHX0VYVFJBX0ZMQVNIX0RFVklDRQlERVZJQ0UwIC8qIGV4dHJhIGZsYXNoIGF0IGRldmljZSAwICovCisjZGVmaW5lIENGR19FWFRSQV9GTEFTSF9XSURUSAkyCS8qIDE2IGJpdCAqLworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpICovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpICovCisjZGVmaW5lIENGR19GTEFTSF9DRkkJCTEKKworI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDEwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgxMDAwMCAvKiBzZWUgUkVBRE1FIC0gZW52IHNlY3QgcmVhbCBzaXplICovCisjZGVmaW5lIENGR19FTlZfQUREUgkJKDB4ZmZmODAwMDAgLSBDRkdfRU5WX1NFQ1RfU0laRSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2FjaGUgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgYWxsIE1QQzc0eHggQ1BVcwkJICovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTDJDUiBzZXR1cCAtLSBtYWtlIHN1cmUgdGhpcyBpcyByaWdodCBmb3IgeW91ciBib2FyZCEKKyAqIGxvb2sgaW4gaW5jbHVkZS9tcGM3NHh4LmggZm9yIHRoZSBkZWZpbmVzIHVzZWQgaGVyZQorICovCisKKyNkZWZpbmUgQ0ZHX0wyCisKKyNpZmRlZiBDT05GSUdfNzUwQ1gKKyNkZWZpbmUgTDJfSU5JVAkJMAorI2Vsc2UKKyNkZWZpbmUgTDJfSU5JVAkJKEwyQ1JfTDJTSVpfMk0gfCBMMkNSX0wyQ0xLXzMgfCBMMkNSX0wyUkFNX0JVUlNUIHwgXAorCQkJTDJDUl9MMk9IXzUgfCBMMkNSX0wyQ1RMIHwgTDJDUl9MMldUKQorI2VuZGlmCisKKyNkZWZpbmUgTDJfRU5BQkxFCShMMl9JTklUIHwgTDJDUl9MMkUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWFsIHRpbWUgY2xvY2sKKyAqLworI2RlZmluZSBDT05GSUdfUlRDX0RTMTMwMgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHYWxpbGVvIEkyQyBkcml2ZXIKKyAqLworI2RlZmluZSBDT05GSUdfR1RfSTJDCisKKy8qCisgKiBJbnRlcm5hbCBEZWZpbml0aW9ucworICoKKyAqIEJvb3QgRmxhZ3MKKyAqLworI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkgICAgKi8KKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zaGFubm9uLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2hhbm5vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyODE3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2hhbm5vbi5oCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFsZXggWnVlcGtlIDxhenVAc3lzZ28uZGU+CisgKgorICogQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgU2hhbm5vbi9UdXhTY3JlZW4vSVMyNjMwIFdlYlBob25lIEJvYXJkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBJZiB3ZSBhcmUgZGV2ZWxvcGluZywgd2UgbWlnaHQgd2FudCB0byBzdGFydCBhcm1ib290IGZyb20gcmFtCisgKiBzbyB3ZSBNVVNUIE5PVCBpbml0aWFsaXplIGNyaXRpY2FsIHJlZ3MgbGlrZSBtZW0tdGltaW5nIC4uLgorICovCisKKy8qCisgKiB3ZSBqdXN0IHJ1biBpbiBub24tY3JpdGljYWwgbW9kZSBub3csIGJlY2F1c2Ugd2UgdXNlIHRoZSBJbmZlcm5vLUxvYWRlciB0bworICogYnJpbmcgdXMgdG8gbGl2ZQorICovCisjZGVmaW5lIENPTkZJR19JTkZFUk5PCQkJLyogd2UgYXJlIHVzaW5nIHRoZSBpbmZlcm5vIGJvb3RsZHIgKi8KKyN1bmRlZiBDT05GSUdfSU5JVF9DUklUSUNBTAkJLyogdW5kZWYgZm9yIGRldmVsb3BpbmcgKi8KKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKyNkZWZpbmUgQ09ORklHX1NBMTEwMAkJMQkvKiBUaGlzIGlzIGFuIFNBMTEwMCBDUFUJKi8KKyNkZWZpbmUgQ09ORklHX1NIQU5OT04JCTEJLyogb24gYW4gU0hBTk5PTi9UdXhTY3JlZW4gQm9hcmQgICAgICAqLworCisjdW5kZWYgQ09ORklHX1VTRV9JUlEJCQkvKiB3ZSBkb24ndCBuZWVkIElSUS9GSVEgc3R1ZmYgKi8KKworLyoKKyAqIFNpemUgb2YgbWFsbG9jKCkgcG9vbAorICovCisjZGVmaW5lIENPTkZJR19NQUxMT0NfU0laRQkoQ0ZHX0VOVl9TSVpFICsgMTI4KjEwMjQpCisKKy8qCisgKiBIYXJkd2FyZSBkcml2ZXJzCisgKi8KKyNkZWZpbmUgQ09ORklHX0RSSVZFUl8zQzU4OQkxCisKKy8qCisgKiBzZWxlY3Qgc2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TRVJJQUwzICAgICAgICAgIDEJLyogd2UgdXNlIFNFUklBTCAzICAqLworCisvKiBhbGxvdyB0byBvdmVyd3JpdGUgc2VyaWFsIGFuZCBldGhhZGRyICovCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKKworI2lmIDAgLyogWFhYIC0gY2Fubm90IHRlc3QgSURFIGFueXdheSwgc28gZGlzYWJsZWQgZm9yIG5vdyAtIHdkICovCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCXwgXAorCQkJCSBDRkdfQ01EX1BDTUNJQQl8IFwKKwkJCQkgQ0ZHX0NNRF9JREUpCisjZW5kaWYgLyogMCAqLworCisvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCisjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCisjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJInJvb3Q9cmFtZnMgZGV2ZnM9bW91bnQgY29uc29sZT10dHlTQTAsMTE1MjAwIgorI2RlZmluZSBDT05GSUdfTkVUTUFTSyAgICAgICAgICAyNTUuMjU1LjAuMAorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImhlbHAiCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCisjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUJQ0ZHX1BST01QVAkJIlR1eFNjcmVlbiAjICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZGVmaW5lCUNGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZQlDRkdfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHhjMDQwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHhjMDgwMDAwMAkvKiA0IC4uLiA4IE1CIGluIERSQU0JKi8KKworI3VuZGVmICBDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworCisjZGVmaW5lCUNGR19MT0FEX0FERFIJCTB4ZDAwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MJKi8KKworI2RlZmluZQlDRkdfSFoJCQkzNjg2NDAwCQkvKiBpbmNyZW1lbnRlciBmcmVxOiAzLjY4NjQgTUh6ICovCisjZGVmaW5lIENGR19DUFVTUEVFRAkJMHgwOQkJLyogMTkwIE1IeiBmb3IgU2hhbm5vbiAqLworCisJCQkJCQkvKiB2YWxpZCBiYXVkcmF0ZXMgKi8KKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKworI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgkxCQkvKiBET1MgcGFydGl0aWlvbiBzdXBwb3J0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjgqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworI2lmZGVmIENPTkZJR19VU0VfSVJRCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfSVJRCSg0KjEwMjQpCS8qIElSUSBzdGFjayAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFX0ZJUQkoNCoxMDI0KQkvKiBGSVEgc3RhY2sgKi8KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQaHlzaWNhbCBNZW1vcnkgTWFwCisgKi8KKy8qIEJFIENBUkVGVUwgKi8KKyNkZWZpbmUgQ09ORklHX05SX0RSQU1fQkFOS1MJNAkgICAvKiB3ZSBoYXZlIDQgYmFua3Mgb2YgRURPUkFNICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMQkJMHhjMDAwMDAwMCAvKiBSQU0gQmFuayAjMSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzFfU0laRQkweDAwNDAwMDAwIC8qIDQgTUIgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8yCQkweGM4MDAwMDAwIC8qIFJBTSBCYW5rICMyICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMl9TSVpFCTB4MDA0MDAwMDAgLyogNCBNQiAqLworI2RlZmluZSBQSFlTX1NEUkFNXzMgICAgICAgICAgICAweGQwMDAwMDAwIC8qIFJBTSBCYW5rICMzICovCisjZGVmaW5lIFBIWVNfU0RSQU1fM19TSVpFICAgICAgIDB4MDA0MDAwMDAgLyogNCBNQiAqLworI2RlZmluZSBQSFlTX1NEUkFNXzQgICAgICAgICAgICAweGQ4MDAwMDAwIC8qIFJBTSBCYW5rICM0ICovCisjZGVmaW5lIFBIWVNfU0RSQU1fNF9TSVpFICAgICAgIDB4MDA0MDAwMDAgLyogNCBNQiAqLworCisKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDAwMDAwMDAwIC8qIEZsYXNoIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF9TSVpFCQkweDAwNDAwMDAwIC8qIDQgTUIgKi8KKworI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZMQVNIIGFuZCBlbnZpcm9ubWVudCBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJCSovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkoMzErNCkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwCSovCisKKy8qIHRpbWVvdXQgdmFsdWVzIGFyZSBpbiB0aWNrcyAqLworI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkoMipDRkdfSFopIC8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlICovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCSgyKkNGR19IWikgLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKi8KKworI2RlZmluZQlDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKyNpZmRlZiBDT05GSUdfSU5GRVJOTworLyogd2UgdGFrZSB0aGUgbGFzdCBzZWN0b3IsIDEyOCBLQiBpbiBzaXplLCBidXQgd2Ugb25seSB1c2UgNCBLQiBvZiBpdCBmb3Igc3RhY2sgcmVhc29ucyAqLworI2RlZmluZSBDRkdfRU5WX0FERFIJCShQSFlTX0ZMQVNIXzEgKyAweDAwM0UwMDAwKQkvKiBBZGRyIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLworI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4NDAwMAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLworI2Vsc2UKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoUEhZU19GTEFTSF8xICsgMHgxQzAwMCkJLyogQWRkciBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDQwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQQ01DSUEgc3R1ZmYKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworLyogd2UgcGljayB0aGUgdXBwZXIgb25lICovCisKKyNkZWZpbmUgQ09ORklHX1BDTUNJQV9TTE9UX0EKKworI2RlZmluZSBDRkdfUENNQ0lBX0lPX0FERFIJKDB4MjAwMDAwMDApCisjZGVmaW5lIENGR19QQ01DSUFfSU9fU0laRQkoIDY0IDw8IDIwICkKKyNkZWZpbmUgQ0ZHX1BDTUNJQV9ETUFfQUREUgkoMHgyNDAwMDAwMCkKKyNkZWZpbmUgQ0ZHX1BDTUNJQV9ETUFfU0laRQkoIDY0IDw8IDIwICkKKyNkZWZpbmUgQ0ZHX1BDTUNJQV9BVFRSQl9BRERSCSgweDJDMDAwMDAwKQorI2RlZmluZSBDRkdfUENNQ0lBX0FUVFJCX1NJWkUJKCA2NCA8PCAyMCApCisjZGVmaW5lIENGR19QQ01DSUFfTUVNX0FERFIJKDB4MjgwMDAwMDApCisjZGVmaW5lIENGR19QQ01DSUFfTUVNX1NJWkUJKCA2NCA8PCAyMCApCisKKy8qIGluIGZhY3QsIE1FTSBhbmQgQVRUUkIgYXJlIHN3YXBwZWQgLSBoYXMgdG8gYmUgY29ycmVjdGVkIHNvb24gaW4gY21kX3BjbWNpYSBvciBzbyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJREUvQVRBIHN0dWZmIChTdXBwb3J0cyBJREUgaGFyZGRpc2sgb24gUENNQ0lBIEFkYXB0ZXIpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZQlDT05GSUdfSURFX1BDQ0FSRAkxCS8qIFVzZSBJREUgd2l0aCBQQyBDYXJkCUFkYXB0ZXIJKi8KKworI3VuZGVmCUNPTkZJR19JREVfUENNQ0lBCQkvKiBEaXJlY3QgSURFICAgIG5vdCBzdXBwb3J0ZWQJKi8KKyN1bmRlZglDT05GSUdfSURFX0xFRAkJCS8qIExFRCAgIGZvciBpZGUgbm90IHN1cHBvcnRlZAkqLworI3VuZGVmCUNPTkZJR19JREVfUkVTRVQJCS8qIHJlc2V0IGZvciBpZGUgbm90IHN1cHBvcnRlZAkqLworCisjZGVmaW5lIENGR19JREVfTUFYQlVTCQkxCS8qIG1heC4gMSBJREUgYnVzCQkqLworI2RlZmluZSBDRkdfSURFX01BWERFVklDRQkxCS8qIG1heC4gMSBkcml2ZSBwZXIgSURFIGJ1cwkqLworCisjZGVmaW5lIENGR19BVEFfSURFMF9PRkZTRVQJMHgwMDAwCisKKy8qIGl0J3Mgc2ltcGxlLCBhbGwgcmVncyBhcmUgaW4gSS9PIHNwYWNlICovCisjZGVmaW5lIENGR19BVEFfQkFTRV9BRERSCUNGR19QQ01DSUFfQVRUUkJfQUREUgorCisvKiBPZmZzZXQgZm9yIGRhdGEgSS9PCQkJKi8KKyNkZWZpbmUgQ0ZHX0FUQV9EQVRBX09GRlNFVAkoQ0ZHX0FUQV9CQVNFX0FERFIpCisKKy8qIE9mZnNldCBmb3Igbm9ybWFsIHJlZ2lzdGVyIGFjY2Vzc2VzCSovCisjZGVmaW5lIENGR19BVEFfUkVHX09GRlNFVAkoQ0ZHX0FUQV9CQVNFX0FERFIpCisKKy8qIE9mZnNldCBmb3IgYWx0ZXJuYXRlIHJlZ2lzdGVycwkqLworI2RlZmluZSBDRkdfQVRBX0FMVF9PRkZTRVQJKENGR19BVEFfQkFTRV9BRERSKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy90cmFiLmggYi9pbmNsdWRlL2NvbmZpZ3MvdHJhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOTY3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvdHJhYi5oCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiA8Z2pAZGVueC5kZT4KKyAqCisgKiBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBUUkFCIGJvYXJkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBJZiB3ZSBhcmUgZGV2ZWxvcGluZywgd2UgbWlnaHQgd2FudCB0byBzdGFydCBhcm1ib290IGZyb20gcmFtCisgKiBzbyB3ZSBNVVNUIE5PVCBpbml0aWFsaXplIGNyaXRpY2FsIHJlZ3MgbGlrZSBtZW0tdGltaW5nIC4uLgorICovCisjZGVmaW5lIENPTkZJR19JTklUX0NSSVRJQ0FMCQkvKiB1bmRlZiBmb3IgZGV2ZWxvcGluZyAqLworCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworI2RlZmluZSBDT05GSUdfQVJNOTIwVAkJMQkvKiBUaGlzIGlzIGFuIGFybTkyMHQgQ1BVCSovCisjZGVmaW5lIENPTkZJR19TM0MyNDAwCQkxCS8qIGluIGEgU0FNU1VORyBTM0MyNDAwIFNvQyAgICAgKi8KKyNkZWZpbmUgQ09ORklHX1RSQUIJCTEJLyogb24gYSBUUkFCIEJvYXJkICAgICAgKi8KKyN1bmRlZiBDT05GSUdfVFJBQl81ME1IWgkJLyogcnVuIHRoZSBDUFUgYXQgNTAgTUh6ICovCisKKy8qIGlucHV0IGNsb2NrIG9mIFBMTCAqLworI2RlZmluZSBDT05GSUdfUExMX0lOUFVUX0ZSRVEJMTIwMDAwMDAgLyogVFJBQiBoYXMgMTIgTUh6IGlucHV0IGNsb2NrICovCisKKyN1bmRlZiBDT05GSUdfVVNFX0lSUQkJCS8qIHdlIGRvbid0IG5lZWQgSVJRL0ZJUSBzdHVmZiAqLworCisjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwkgMQkvKiBlbmFibGUgcGFzc2luZyBvZiBBVEFHcwkqLworI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgMQorI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwkgMQorCisvKgorICogU2l6ZSBvZiBtYWxsb2MoKSBwb29sCisgKi8KKyNkZWZpbmUgQ09ORklHX01BTExPQ19TSVpFCShDRkdfRU5WX1NJWkUgKyAxMjgqMTAyNCkKKworLyoKKyAqIEhhcmR3YXJlIGRyaXZlcnMKKyAqLworI2RlZmluZSBDT05GSUdfRFJJVkVSX0NTODkwMAkxCS8qIHdlIGhhdmUgYSBDUzg5MDAgb24tYm9hcmQgKi8KKyNkZWZpbmUgQ1M4OTAwX0JBU0UJCTB4MDcwMDAzMDAgLyogYWdyZWVzIHdpdGggV0lOIENFIFBBICovCisjZGVmaW5lIENTODkwMF9CVVMxNgkJMSAvKiB0aGUgTGludXggZHJpdmVyIGRvZXMgYWNjZXNzZXMgYXMgc2hvcnRzICovCisKKyNkZWZpbmUgQ09ORklHX1ZGRAkJMQkvKiBWRkQgbGluZWFyIGZyYW1lIGJ1ZmZlciBkcml2ZXIgKi8KKyNkZWZpbmUgVkZEX1RFU1RfTE9HTwkJMQkvKiBvdXRwdXQgYSB0ZXN0IGxvZ28gdG8gdGhlIFZGRHMgKi8KKworLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDEgICAgICAgICAgMQkvKiB3ZSB1c2UgU0VSSUFMIDEgb24gVFJBQiAqLworCisjZGVmaW5lIENPTkZJR19IV0ZMT1cJCQkvKiBpbmNsdWRlIFJUUy9DVFMgZmxvdyBjb250cm9sIHN1cHBvcnQJKi8KKworI2RlZmluZSBDT05GSUdfTU9ERU1fU1VQUE9SVAkxCS8qIGVuYWJsZSBtb2RlbSBpbml0aWFsaXphdGlvbiBzdHVmZiAqLworCisjZGVmaW5lCUNPTkZJR19NT0RFTV9LRVlfTUFHSUMJIjIzIgkvKiBob2xkIGRvd24gdGhlc2Uga2V5cyB0byBlbmFibGUgbW9kZW0gKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZW5hYmxlcyBtb2RlbSBkZWJ1Z2dpbmcgc3R1ZmYuIFRoZSBkYmcoKSBhbmQKKyAqICdjaGFyIHNjcmVlblsxMDI0XScgYXJlIHVzZWQgZm9yIGRlYnVnIHByaW50ZnMuIFVuZm9ydHVuYXRlbHksCisgKiBpdCBpcyB1c2FibGUgb25seSBmcm9tIEJESQorICovCisjdW5kZWYgQ09ORklHX01PREVNX1NVUFBPUlRfREVCVUcKKworLyogYWxsb3cgdG8gb3ZlcndyaXRlIHNlcmlhbCBhbmQgZXRoYWRkciAqLworI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQorCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCisKKyNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkxCS8qIFByaW50IHRpbWVzdGFtcCBpbmZvIGZvciBpbWFnZXMgKi8KKworI2lmZGVmIENPTkZJR19IV0ZMT1cKKyNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0FERF9IV0ZMT1cJQ0ZHX0NNRF9IV0ZMT1cKKyNlbHNlCisjZGVmaW5lCUNPTkZJR19DT01NQU5EU19BRERfSFdGTE9XCTAKKyNlbmRpZgorCisjaWZkZWYJQ09ORklHX1ZGRAorI2RlZmluZSBDT05GSUdfQ09NTUFORFNfQUREX1ZGRAkJQ0ZHX0NNRF9WRkQKKyNlbHNlCisjZGVmaW5lIENPTkZJR19DT01NQU5EU19BRERfVkZECQkwCisjZW5kaWYKKworI2lmbmRlZiBVU0VfOTIwVF9NTVUKKyNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoKENPTkZJR19DTURfREZMICYgfkNGR19DTURfQ0FDSEUpIHwgXAorCQkJCSBDRkdfQ01EX0JTUAkJCXwgXAorCQkJCSBDT05GSUdfQ09NTUFORFNfQUREX0hXRkxPVwl8IFwKKwkJCQkgQ09ORklHX0NPTU1BTkRTX0FERF9WRkQJKQorI2Vsc2UKKyNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJCQl8IFwKKwkJCQkgQ0ZHX0NNRF9CU1AJCQl8IFwKKwkJCQkgQ09ORklHX0NPTU1BTkRTX0FERF9IV0ZMT1cJfCBcCisJCQkJIENPTkZJR19DT01NQU5EU19BRERfVkZECSkKKyNlbmRpZgorCisvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCisjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKKyNkZWZpbmUgQ09ORklHX1BSRUJPT1QJCSJlY2hvO2VjaG8gKioqIGJvb3RpbmcgKioqO2VjaG8iCisjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJImNvbnNvbGU9dHR5UzAiCisjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwMDpEMDo5MzowMDo2MToxMQorI2RlZmluZSBDT05GSUdfTkVUTUFTSyAgICAgICAgICAyNTUuMjU1LjI1NS4wCisjZGVmaW5lIENPTkZJR19JUEFERFIJCTE5Mi4xNjguMy4yNworI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTE5Mi4xNjguMy4xCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkicnVuIGZsYXNoX25mcyIKKyNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwlcCisJIm5mc19hcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3ICIgXAorCQkibmZzcm9vdD0kKHNlcnZlcmlwKTokKHJvb3RwYXRoKVwwIiBcCisJInJvb3RwYXRoPS9vcHQvZWxkay9hcm1fOTIwVERJXDAiIFwKKwkicmFtX2FyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcndcMCIgXAorCSJhZGRfbmV0PXNldGVudiBib290YXJncyAkKGJvb3RhcmdzKSBldGhhZGRyPSQoZXRoYWRkcikgIiBcCisJCSJpcD0kKGlwYWRkcik6JChzZXJ2ZXJpcCk6JChnYXRld2F5aXApOiQobmV0bWFzayk6JChob3N0bmFtZSk6Om9mZlwwIiBcCisJImFkZF9taXNjPXNldGVudiBib290YXJncyAkKGJvb3RhcmdzKSBjb25zb2xlPXR0eVMwIHBhbmljPTFcMCIgXAorCSJsb2FkPXRmdHAgMHhDMTAwMDAwIC90ZnRwYm9vdC9UUkFCL3UtYm9vdC5iaW5cMCIgXAorCSJ1cGRhdGU9cHJvdGVjdCBvZmYgMTowLTc7ZXJhIDE6MC03O2NwLmIgMHhjMTAwMDAwIDAgJChmaWxlc2l6ZSk7IiBcCisJCSJzZXRlbnYgZmlsZXNpemU7c2F2ZWVudlwwIiBcCisJImxvYWRmaWxlPS90ZnRwYm9vdC9UUkFCL3BJbWFnZVwwIiBcCisJImxvYWRhZGRyPWM0MDAwMDBcMCIgXAorCSJuZXRfbG9hZD10ZnRwYm9vdCAkKGxvYWRhZGRyKSAkKGxvYWRmaWxlKVwwIiBcCisJIm5ldF9uZnM9cnVuIG5ldF9sb2FkIG5mc19hcmdzIGFkZF9uZXQgYWRkX21pc2M7Ym9vdG1cMCIgXAorCSJrZXJuZWxfYWRkcj0wMDA0MDAwMFwwIiBcCisJImZsYXNoX25mcz1ydW4gbmZzX2FyZ3MgYWRkX25ldCBhZGRfbWlzYztib290bSAkKGtlcm5lbF9hZGRyKVwwIiBcCisJIm1kbV9pbml0MT1BVFpcMCIgXAorCSJtZG1faW5pdDI9QVRTMD0xXDAiIFwKKwkibWRtX2Zsb3dfY29udHJvbD1ydHMvY3RzXDAiCisKKyNpZiAwCS8qIGRpc2FibGVkIGZvciBkZXZlbG9wbWVudCAqLworI2RlZmluZQlDT05GSUdfQVVUT0JPT1RfS0VZRUQJCS8qIEVuYWJsZSBwYXNzd29yZCBwcm90ZWN0aW9uCSovCisjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9QUk9NUFQJIlxuRW50ZXIgcGFzc3dvcmQgLSBhdXRvYm9vdCBpbiAlZCBzZWMuLi5cbiIKKyNkZWZpbmUgQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUgkic3lzdGVtIgkvKiAxc3QgcGFzc3dvcmQJKi8KKyNlbmRpZgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworLyogd2hhdCdzIHRoaXMgPyBpdCdzIG5vdCB1c2VkIGFueXdoZXJlICovCisjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkxCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUJQ0ZHX1BST01QVAkJIlRSQUIgIyAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2RlZmluZQlDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUJQ0ZHX01BWEFSR1MJCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MGMwMDAwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MGQwMDAwMDAJLyogMTYgTUIgaW4gRFJBTQkqLworCisjdW5kZWYgIENGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisKKyNkZWZpbmUJQ0ZHX0xPQURfQUREUgkJMHgwY2YwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcwkqLworCisjaWZkZWYgQ09ORklHX1RSQUJfNTBNSFoKKy8qIHRoZSBQV00gVEltZXIgNCB1c2VzIGEgY291bnRlciBvZiAxNTYyNSBmb3IgMTAgbXMsIHNvIHdlIG5lZWQgKi8KKy8qIGl0IHRvIHdyYXAgMTAwIHRpbWVzICh0b3RhbCAxNTYyNTAwKSB0byBnZXQgMSBzZWMuICovCisvKiB0aGlzIHNob3VsZCBfcmVhbGx5XyBiZSBjYWxjdWxhdGVkICEhICovCisjZGVmaW5lCUNGR19IWgkJCTE1NjI1MDAKKyNlbHNlCisvKiB0aGUgUFdNIFRJbWVyIDQgdXNlcyBhIGNvdW50ZXIgb2YgMTAzOTAgZm9yIDEwIG1zLCBzbyB3ZSBuZWVkICovCisvKiBpdCB0byB3cmFwIDEwMCB0aW1lcyAodG90YWwgMTAzOTAwMCkgdG8gZ2V0IDEgc2VjLiAqLworLyogdGhpcyBzaG91bGQgX3JlYWxseV8gYmUgY2FsY3VsYXRlZCAhISAqLworI2RlZmluZQlDRkdfSFoJCQkxMDM5MDAwCisjZW5kaWYKKworLyogdmFsaWQgYmF1ZHJhdGVzICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCQkvKiBoYXZlIG1pc2NfaW5pdF9yKCkgZnVuY3Rpb24JKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDEyOCoxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisjaWZkZWYgQ09ORklHX1VTRV9JUlEKKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9JUlEJKDQqMTAyNCkJLyogSVJRIHN0YWNrICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfRklRCSg0KjEwMjQpCS8qIEZJUSBzdGFjayAqLworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBoeXNpY2FsIE1lbW9yeSBNYXAKKyAqLworI2RlZmluZSBDT05GSUdfTlJfRFJBTV9CQU5LUwkxCSAgIC8qIHdlIGhhdmUgMSBiYW5rIG9mIERSQU0gKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xCQkweDBjMDAwMDAwIC8qIFNEUkFNIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xX1NJWkUJMHgwMTAwMDAwMCAvKiAxNiBNQiAqLworCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgwMDAwMDAwMCAvKiBGbGFzaCBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfRkxBU0hfU0laRQkJMHgwMDgwMDAwMCAvKiA4IE1CICovCisKKy8qIFRoZSBmb2xsb3dpbmcgI2RlZmluZXMgYXJlIG5lZWRlZCB0byBnZXQgZmxhc2ggZW52aXJvbm1lbnQgcmlnaHQgKi8KKyNkZWZpbmUJQ0ZHX01PTklUT1JfQkFTRQlQSFlTX0ZMQVNIXzEKKyNkZWZpbmUJQ0ZHX01PTklUT1JfTEVOCQkoMjU2IDw8IDEwKQorCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRkxBU0ggYW5kIGVudmlyb25tZW50IG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkvKiBtYXggbnVtYmVyIG9mIG1lbW9yeSBiYW5rcyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJKDcxKQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworLyogdGltZW91dCB2YWx1ZXMgYXJlIGluIHRpY2tzICovCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCSgyKkNGR19IWikgLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJKDIqQ0ZHX0haKSAvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAqLworCisjZGVmaW5lCUNGR19FTlZfSVNfSU5fRkxBU0gJMQorCisvKiBBZGRyZXNzIGFuZCBzaXplIG9mIFByaW1hcnkgRW52aXJvbm1lbnQgU2VjdG9yCSovCisjZGVmaW5lIENGR19FTlZfQUREUgkJKFBIWVNfRkxBU0hfMSArIDB4NDAwMCkKKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDQwMDAKKworLyogQWRkcmVzcyBhbmQgc2l6ZSBvZiBSZWR1bmRhbnQgRW52aXJvbm1lbnQgU2VjdG9yCSovCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUX1JFRFVORAkoQ0ZHX0VOVl9BRERSK0NGR19FTlZfU0laRSkKKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFX1JFRFVORAkoQ0ZHX0VOVl9TSVpFKQorCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3V0eDgyNDUuaCBiL2luY2x1ZGUvY29uZmlncy91dHg4MjQ1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlYzQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy91dHg4MjQ1LmgKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHcmVnb3J5IEUuIEFsbGVuLCBnYWxsZW5AYXJsdXQudXRleGFzLmVkdQorICogTWF0dGhldyBFLiBLYXJnZXIsIGthcmdlckBhcmx1dC51dGV4YXMuZWR1CisgKiBBcHBsaWVkIFJlc2VhcmNoIExhYm9yYXRvcmllcywgVGhlIFVuaXZlcnNpdHkgb2YgVGV4YXMgYXQgQXVzdGluCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqCisgKiBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgdXR4ODI0NSBib2FyZC4KKyAqCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogYm9hcmQvY29uZmlnLmggLSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGJvYXJkIHNwZWNpZmljCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKworI2RlZmluZSBDT05GSUdfTVBDODI0WAkJMQorI2RlZmluZSBDT05GSUdfTVBDODI0NQkJMQorI2RlZmluZSBDT05GSUdfVVRYODI0NQkJMQorI2RlZmluZSBERUJVRwkJCQkxCisKKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJMQorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTU3NjAwCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CisjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9QUk9NUFQgCSJhdXRvYm9vdCBpbiAlZCBzZWNvbmRzXG4iCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gRkY5MjAwMDAgRkY4MDAwMDAiCS8qIGF1dG9ib290IGNvbW1hbmQJKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkicm9vdD0vZGV2L3JhbSBjb25zb2xlPXR0eVMwLDU3NjAwIiAvKiBSQU1kaXNrICovCisjZGVmaW5lIENPTkZJR19FVEhBRERSCQk0MTo1Mjo0Yzo2MTowMDowMQkvKiBNQUMgYWRkcmVzcyAqLworI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTEwLjguMTcuMTA1CisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCisKKyNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9ERkwgfCBDRkdfQ01EX0JESSB8IENGR19DTURfUENJIFwKKwkJCQkJCQkJfCBDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9NRU1PUlkgXAorCQkJCQkJCQl8IENGR19DTURfRU5WIHwgQ0ZHX0NNRF9DT05TT0xFIFwKKwkJCQkJCQkJfCBDRkdfQ01EX0xPQURTIHwgQ0ZHX0NNRF9MT0FEQiBcCisJCQkJCQkJCXwgQ0ZHX0NNRF9JTUkgfCBDRkdfQ01EX0NBQ0hFIFwKKwkJCQkJCQkJfCBDRkdfQ01EX1JVTiB8IENGR19DTURfRUNITyBcCisJCQkJCQkJCXwgQ0ZHX0NNRF9SRUdJTkZPIHwgQ0ZHX0NNRF9ORVRcCisJCQkJCQkJCXwgQ0ZHX0NNRF9ESENQKQorCisvKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCisgKi8KKyNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCisjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworCisvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfUEJTSVpFCShDRkdfQ0JTSVpFICsgc2l6ZW9mKENGR19QUk9NUFQpICsgMTYpCisKKyNkZWZpbmUJQ0ZHX01BWEFSR1MJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDAwMTAwMDAwCS8qIERlZmF1bHQgbG9hZCBhZGRyZXNzCQkqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBDSSBjb25maWd1cmF0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgQ09ORklHX1BDSQkJCQkvKiBpbmNsdWRlIHBjaSBzdXBwb3J0CQkqLworI3VuZGVmIENPTkZJR19QQ0lfUE5QCisjZGVmaW5lIENPTkZJR19QQ0lfU0NBTl9TSE9XCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKKyNkZWZpbmUgQ09ORklHX0VFUFJPMTAwCisKKyNkZWZpbmUgUENJX0VORVQwX0lPQUREUgkweDgwMDAwMDAwCisjZGVmaW5lIFBDSV9FTkVUMF9NRU1BRERSCTB4ODAwMDAwMDAKKyNkZWZpbmUgUENJX0ZJUkVXSVJFX0lPQUREUgkweDgxMDAwMDAwCisjZGVmaW5lIFBDSV9GSVJFV0lSRV9NRU1BRERSCTB4ODEwMDAwMDAKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFydCBhZGRyZXNzZXMgZm9yIHRoZSBmaW5hbCBtZW1vcnkgY29uZmlndXJhdGlvbgorICogKFNldCB1cCBieSB0aGUgc3RhcnR1cCBjb2RlKQorICogUGxlYXNlIG5vdGUgdGhhdCBDRkdfU0RSQU1fQkFTRSBfbXVzdF8gc3RhcnQgYXQgMAorICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCSAgICAweDAwMDAwMDAwCisjZGVmaW5lIENGR19NQVhfUkFNX1NJWkUgICAgMHgxMDAwMDAwMAkvKiBhbW91bnQgb2YgU0RSQU0gICovCisKKworLyogZXZlbiB0aG91Z2ggRkxBU0hQX0JBU0UgaXMgRkY4MDAwMDAsIHdpdGggMk1CIG9uIFJDUzAsIHRoZQorICogcmVzZXQgdmVjdG9yIGlzIGFjdHVhbGx5IGxvY2F0ZWQgYXQgRkY4MDAxMDAsIGJ1dCB0aGUgODI0NQorICogdGFrZXMgY2FyZSBvZiB1cy4KKyAqLworI2RlZmluZSBDRkdfUkVTRVRfQUREUkVTUyAgIDB4RkZGMDAxMDAKKworI2RlZmluZSBDRkdfRVVNQl9BRERSCSAgICAweEZDMDAwMDAwCisKKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRSAgICBURVhUX0JBU0UKKworI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JICAgICgyNTYgPDwgMTApIC8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCSAgICAoMTI4IDw8IDEwKSAvKiBSZXNlcnZlIDEyOCBrQiBmb3IgbWFsbG9jKCkJKi8KKworLyojZGVmaW5lIENGR19EUkFNX1RFU1QJCTEgKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQgICAweDAwMDAzMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JMC4uLjI1NiBNQgkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJICAgIDB4MGZmOGZmYTgJLyogaW4gU0RSQU0sIHNraXBzIGV4Y2VwdGlvbiAqLworCQkJCQkJCQkJCS8qIHZlY3RvcnMgYW5kIFUtQm9vdCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb25zIGZvciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgYW5kIGRhdGEgYXJlYQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRSAgICAxMjgJLyogU2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgKi8KKwkJCQkJCQkJCS8qIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUiAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5EICAgICAgMHgxMDAwCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQgIChDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE5TMTY1NTAgQ29uZmlndXJhdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKworI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQkxCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQlnZXRfYnVzX2ZyZXEoMCkKKworI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xCShDRkdfRVVNQl9BRERSICsgMHg0NTAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00yCShDRkdfRVVNQl9BRERSICsgMHg0NjAwKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb3cgTGV2ZWwgQ29uZmlndXJhdGlvbiBTZXR0aW5ncworICogKGFkZHJlc3MgbWFwcGluZ3MsIHJlZ2lzdGVyIGluaXRpYWwgdmFsdWVzLCBldGMuKQorICogWW91IHNob3VsZCBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBpZiB5b3UgbWFrZSBjaGFuZ2VzIGhlcmUuCisgKiBGb3IgdGhlIGRldGFpbCBkZXNjcmlwdGlvbiByZWZlciB0byB0aGUgTVBDODI0MCB1c2VyJ3MgbWFudWFsLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgIDMzMDAwMDAwCisjZGVmaW5lIENGR19IWgkJCQkxMDAwCisKKyNkZWZpbmUgQ0ZHX0VUSF9ERVZfRk4JICAgICAweDc4MDAKKyNkZWZpbmUgQ0ZHX0VUSF9JT0JBU0UJICAgICAweDAwMTA0MDAwCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJTWVtb3J5IENvbnRyb2wgQ29uZmlndXJhdGlvbiBSZWdpc3RlciB2YWx1ZXMKKyAqCS0gc2VlIHNlYy4gNC4xMiBvZiBNUEM4MjQ1IFVNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE1DQ1IxICovCisjZGVmaW5lIENGR19ST01OQUwJICAgIDAKKyNkZWZpbmUgQ0ZHX1JPTUZBTAkgICAgMgkJCS8qICh0YWNjPTcwbnMpKm1lbV9mcmVxIC0gMiAqLworI2RlZmluZSBDRkdfQkFOSzBfUk9XCTIJCQkvKiBTRFJBTSBiYW5rIDctMCByb3cgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfQkFOSzFfUk9XCTIJCQkvKiAJYml0IGNvdW50ICovCisjZGVmaW5lIENGR19CQU5LMl9ST1cJMAorI2RlZmluZSBDRkdfQkFOSzNfUk9XCTAKKyNkZWZpbmUgQ0ZHX0JBTks0X1JPVwkwCisjZGVmaW5lIENGR19CQU5LNV9ST1cJMAorI2RlZmluZSBDRkdfQkFOSzZfUk9XCTAKKyNkZWZpbmUgQ0ZHX0JBTks3X1JPVwkwCisKKy8qIE1DQ1IyLCByZWZyZXNoIGludGVydmFsIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBDRkdfUkVGSU5UCSAgICA0ODAJICAgIC8qIDMzIE1IeiBTRFJBTSBjbG9jayB3YXMgNDgwICovCisKKy8qIEJ1cnN0IFRvIFByZWNoYXJnZS4gQml0cyBvZiB0aGlzIHZhbHVlIGdvIHRvIE1DQ1IzIGFuZCBNQ0NSNCAqLworI2RlZmluZSBDRkdfQlNUT1BSRQkgICAgMTAyMwkvKiBidXJzdCB0byBwcmVjaGFyZ2VbMC4uOV0sICovCisJCQkJCQkJCS8qIHNldHMgb3BlbiBwYWdlIGludGVydmFsICovCisKKy8qIE1DQ1IzICovCisjZGVmaW5lIENGR19SRUZSRUMJICAgIDUJICAgIC8qIFJlZnJlc2ggdG8gYWN0aXZhdGUgaW50ZXJ2YWwsIHRyYyAqLworCisvKiBNQ0NSNCAqLworI2RlZmluZSBDRkdfUFJFVE9BQ1QJICAgIDIJICAgIC8qIHRycCAqLworI2RlZmluZSBDRkdfQUNUVE9QUkUJICAgIDcJICAgIC8qIHRyY2QgKyAoYnVyc3QgbGVuZ3RoIC0gMSkgKyB0ZHJsICovCisjZGVmaW5lIENGR19TRE1PREVfQ0FTX0xBVCAgMwkgICAgLyogU0RNT0RFIENBUyBsYXRhbmN5ICovCisjZGVmaW5lIENGR19TRE1PREVfV1JBUAkgICAgMAkgICAgLyogU0RNT0RFIHdyYXAgdHlwZSwgc2VxdWVudGlhbCAqLworI2RlZmluZSBDRkdfQUNUT1JXCSAgICAJMgkJLyogdHJjZCBtaW4gKi8KKyNkZWZpbmUgQ0ZHX0RCVVNfU0laRTIJCTEJCS8qIHNldCBmb3IgOC1iaXQgUkNTMSwgY2xlYXIgZm9yIDMyLDY0ICovCisjZGVmaW5lIENGR19SRUdJU1RFUkRfVFlQRV9CVUZGRVIgMQorI2RlZmluZSBDRkdfRVhUUk9NCSAgICAxCisjZGVmaW5lIENGR19SRUdESU1NCSAgICAwCisKKy8qIGNhbGN1bGF0ZSBhY2NvcmRpbmcgdG8gZm9ybXVsYSBpbiBzZWMuIDYtMjIgb2YgODI0NSBVTSAqLworI2RlZmluZSBDRkdfUEdNQVggICAgICAgICAgIDUwCQkvKiBob3cgbG9uZyB0aGUgODI0NSByZXRhaW5zIHRoZSAqLworCQkJCQkJCQkJLyogY3VycmVudGx5IGFjY2Vzc2VkIHBhZ2UgaW4gbWVtb3J5ICovCisJCQkJCQkJCQkvKiB3YXMgNDUgKi8KKworI2RlZmluZSBDRkdfU0RSQU1fRFNDRAkweDIwCS8qIFNEUkFNIGRhdGEgaW4gc2FtcGxlIGNsb2NrIGRlbGF5IC0gbm90ZSAqLworCQkJCQkJCQkvKiBib3R0b20gMyBiaXRzIE1VU1QgYmUgMCAqLworCisjZGVmaW5lIENGR19ETExfTUFYX0RFTEFZCTB4MDQKKyNkZWZpbmUgQ0ZHX0RMTF9FWFRFTkQJMHg4MAorI2RlZmluZSBDRkdfUENJX0hPTERfREVMIDB4MjAKKworCisvKiBNZW1vcnkgYmFuayBzZXR0aW5ncy4KKyAqIE9ubHkgYml0cyAyMC0yOSBhcmUgYWN0dWFsbHkgdXNlZCBmcm9tIHRoZXNlIHZhbHVlcyB0byBzZXQgdGhlCisgKiBzdGFydC9lbmQgYWRkcmVzc2VzLiBUaGUgdXBwZXIgdHdvIGJpdHMgd2lsbCBhbHdheXMgYmUgMCwgYW5kIHRoZSBsb3dlcgorICogMjAgYml0cyB3aWxsIGJlIDB4MDAwMDAgZm9yIGEgc3RhcnQgYWRkcmVzcywgb3IgMHhmZmZmZiBmb3IgYW4gZW5kCisgKiBhZGRyZXNzLiBSZWZlciB0byB0aGUgTVBDODI0NSB1c2VyIG1hbnVhbC4KKyAqLworCisjZGVmaW5lIENGR19CQU5LMF9TVEFSVAkgICAgMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfQkFOSzBfRU5ECSAgICAoQ0ZHX01BWF9SQU1fU0laRS8yIC0gMSkKKyNkZWZpbmUgQ0ZHX0JBTkswX0VOQUJMRSAgICAxCisjZGVmaW5lIENGR19CQU5LMV9TVEFSVAkgICAgQ0ZHX01BWF9SQU1fU0laRS8yCisjZGVmaW5lIENGR19CQU5LMV9FTkQJICAgIChDRkdfTUFYX1JBTV9TSVpFIC0gMSkKKyNkZWZpbmUgQ0ZHX0JBTksxX0VOQUJMRSAgICAxCisjZGVmaW5lIENGR19CQU5LMl9TVEFSVAkgICAgMHgzZmYwMDAwMAkJLyogbm90IGF2YWlsYWJsZSBpbiB0aGlzIGRlc2lnbiAqLworI2RlZmluZSBDRkdfQkFOSzJfRU5ECSAgICAweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LMl9FTkFCTEUgICAgMAorI2RlZmluZSBDRkdfQkFOSzNfU1RBUlQJICAgIDB4M2ZmMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTkszX0VORAkgICAgMHgzZmZmZmZmZgorI2RlZmluZSBDRkdfQkFOSzNfRU5BQkxFICAgIDAKKyNkZWZpbmUgQ0ZHX0JBTks0X1NUQVJUCSAgICAweDNmZjAwMDAwCisjZGVmaW5lIENGR19CQU5LNF9FTkQJICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0JBTks0X0VOQUJMRSAgICAwCisjZGVmaW5lIENGR19CQU5LNV9TVEFSVAkgICAgMHgzZmYwMDAwMAorI2RlZmluZSBDRkdfQkFOSzVfRU5ECSAgICAweDNmZmZmZmZmCisjZGVmaW5lIENGR19CQU5LNV9FTkFCTEUgICAgMAorI2RlZmluZSBDRkdfQkFOSzZfU1RBUlQJICAgIDB4M2ZmMDAwMDAKKyNkZWZpbmUgQ0ZHX0JBTks2X0VORAkgICAgMHgzZmZmZmZmZgorI2RlZmluZSBDRkdfQkFOSzZfRU5BQkxFICAgIDAKKyNkZWZpbmUgQ0ZHX0JBTks3X1NUQVJUCSAgICAweDNmZjAwMDAwCisjZGVmaW5lIENGR19CQU5LN19FTkQJICAgIDB4M2ZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0JBTks3X0VOQUJMRSAgICAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIDQuNCAtIE91dHB1dCBEcml2ZXIgQ29udHJvbCBSZWdpc3RlcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDRkdfT0RDUgkgICAgMHhlNQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiA0LjggLSBFcnJvciBIYW5kbGluZyBSZWdpc3RlcnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ0ZHX0VSUkVOUjEJMHgxMQkvKiBlbmFibGUgU0RSQU0gcmVmcmVzaCBvdmVyZmxvdyBlcnJvciAqLworCisvKiBTRFJBTSAwLTI1NiBNQiAqLworI2RlZmluZSBDRkdfSUJBVDBMICAoQ0ZHX1NEUkFNX0JBU0UgfCBCQVRMX1BQXzEwIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUMFUgIChDRkdfU0RSQU1fQkFTRSB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorCisvKiBzdGFjayBpbiBkY2FjaGUgKi8KKyNkZWZpbmUgQ0ZHX0lCQVQxTCAgKENGR19JTklUX1JBTV9BRERSIHwgQkFUTF9QUF8xMCB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDFVICAoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRVX0JMXzEyOEsgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKworLyogUENJIG1lbW9yeSAqLworI2RlZmluZSBDRkdfSUJBVDJMICAoMHg4MDAwMDAwMCB8IEJBVExfUFBfMTAgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQyVSAgKDB4ODAwMDAwMDAgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKworLyogRmxhc2gsIGNvbmZpZyBhZGRycywgZXRjLiAqLworI2RlZmluZSBDRkdfSUJBVDNMICAoMHhGMDAwMDAwMCB8IEJBVExfUFBfMTAgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQzVSAgKDB4RjAwMDAwMDAgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKworI2RlZmluZSBDRkdfREJBVDBMICBDRkdfSUJBVDBMCisjZGVmaW5lIENGR19EQkFUMFUgIENGR19JQkFUMFUKKyNkZWZpbmUgQ0ZHX0RCQVQxTCAgQ0ZHX0lCQVQxTAorI2RlZmluZSBDRkdfREJBVDFVICBDRkdfSUJBVDFVCisjZGVmaW5lIENGR19EQkFUMkwgIENGR19JQkFUMkwKKyNkZWZpbmUgQ0ZHX0RCQVQyVSAgQ0ZHX0lCQVQyVQorI2RlZmluZSBDRkdfREJBVDNMICBDRkdfSUJBVDNMCisjZGVmaW5lIENGR19EQkFUM1UgIENGR19JQkFUM1UKKworLyoKKyAqIEZvciBib290aW5nIExpbnV4LCB0aGUgYm9hcmQgaW5mbyBhbmQgY29tbWFuZCBsaW5lIGRhdGEKKyAqIGhhdmUgdG8gYmUgaW4gdGhlIGZpcnN0IDggTUIgb2YgbWVtb3J5LCBzaW5jZSB0aGlzIGlzCisgKiB0aGUgbWF4aW11bSBtYXBwZWQgYnkgdGhlIExpbnV4IGtlcm5lbCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKi8KKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkgICAgKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXggKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRkxBU0ggb3JnYW5pemF0aW9uIChBTUQgQU0yOUxWMTE2RCkKKyAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkgICAgMHhGRjgwMDAwMAorCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkvKiBNYXggbnVtYmVyIG9mIGZsYXNoIGJhbmtzICovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkzNQkvKiBNYXggbnVtYmVyIG9mIHNlY3RvcnMgaW4gb25lIGJhbmsgKi8KKworI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkxMjAwMDAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKGluIG1zKQkqLworI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAk1MDAJCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlIChpbiBtcykJKi8KKworCS8qIFdhcm5pbmc6IGVudmlyb25tZW50IGlzIG5vdCBFTUJFRERFRCBpbiB0aGUgVS1Cb290IGNvZGUuCisJICogSXQncyBzdG9yZWQgaW4gZmxhc2ggc2VwYXJhdGVseS4KKwkgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAkgICAgMQorCisjZGVmaW5lIENGR19FTlZfQUREUgkJMHhGRjlGQTAwMAkvKiBmbGFzaCBzZWN0b3IgU0EzMyAqLworI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MjAwMAkJLyogU2l6ZSBvZiB0aGUgRW52aXJvbm1lbnQgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9PRkZTRVQJCTAJCQkvKiBzdGFydGluZyByaWdodCBhdCB0aGUgYmVnaW5uaW5nICovCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4MjAwMCAJCS8qIFNpemUgb2YgdGhlIEVudmlyb25tZW50IFNlY3RvciAqLworCisKKyNpZiBDRkdfTU9OSVRPUl9CQVNFID49IENGR19GTEFTSF9CQVNFCisjdW5kZWYgQ0ZHX1JBTUJPT1QKKyNlbHNlCisjZGVmaW5lIENGR19SQU1CT09UCisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKyNlbmRpZgorCisvKgorICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLworI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCisKKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHR0LmggYi9pbmNsdWRlL2R0dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZDk1ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0dC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEVyaWsgVGhlaXNlbiwgIFdhdmUgNyBPcHRpY3MsIGV0aGVpc2VuQG1pbmRzcHJpbmcuY29tLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBEaWdpdGFsIFRoZXJtb21ldGVycyBhbmQgVGhlcm1vc3RhdHMuCisgKi8KKyNpZm5kZWYgX0RUVF9IXworI2RlZmluZSBfRFRUX0hfCisKKyNpZiBkZWZpbmVkKENPTkZJR19EVFRfTE03NSkgfHwgZGVmaW5lZChDT05GSUdfRFRUX0RTMTYyMSkKKyNkZWZpbmUgQ09ORklHX0RUVAkJCQkvKiBXZSBoYXZlIGEgRFRUICovCisKKyNkZWZpbmUgRFRUX0NPTU1FUkNJQUxfTUFYX1RFTVAJNzAJCS8qIDAgLSArNzAgQyAqLworI2RlZmluZSBEVFRfSU5EVVNUUklBTF9NQVhfVEVNUAk4NQkJLyogLTQwIC0gKzg1IEMgKi8KKyNkZWZpbmUgRFRUX0FVVE9NT1RJVkVfTUFYX1RFTVAJMTA1CQkvKiAtNDAgLSArMTA1IEMgKi8KKyNpZm5kZWYgQ0ZHX0RUVF9NQVhfVEVNUAorI2RlZmluZSBDRkdfRFRUX01BWF9URU1QIERUVF9DT01NRVJDSUFMX01BWF9URU1QCisjZW5kaWYKKyNpZm5kZWYgQ0ZHX0RUVF9IWVNURVJFU0lTCisjZGVmaW5lIENGR19EVFRfSFlTVEVSRVNJUwk1CQkvKiA1IEMgKi8KKyNlbmRpZgorCitleHRlcm4gaW50IGR0dF9pbml0ICh2b2lkKTsKK2V4dGVybiBpbnQgZHR0X3JlYWQoaW50IHNlbnNvciwgaW50IHJlZyk7CitleHRlcm4gaW50IGR0dF93cml0ZShpbnQgc2Vuc29yLCBpbnQgcmVnLCBpbnQgdmFsKTsKK2V4dGVybiBpbnQgZHR0X2dldF90ZW1wKGludCBzZW5zb3IpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19EVFRfTE03NSkKKyNkZWZpbmUgRFRUX1JFQURfVEVNUAkJMHgwCisjZGVmaW5lIERUVF9DT05GSUcJCTB4MQorI2RlZmluZSBEVFRfVEVNUF9IWVNUCQkweDIKKyNkZWZpbmUgRFRUX1RFTVBfU0VUCQkweDMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRFRUX0RTMTYyMSkKKyNkZWZpbmUgRFRUX1JFQURfVEVNUAkJMHhBQQorI2RlZmluZSBEVFRfUkVBRF9DT1VOVEVSCTB4QTgKKyNkZWZpbmUgRFRUX1JFQURfU0xPUEUJCTB4QTkKKyNkZWZpbmUgRFRUX1dSSVRFX1NUQVJUX0NPTlYJMHhFRQorI2RlZmluZSBEVFRfV1JJVEVfU1RPUF9DT05WCTB4MjIKKyNkZWZpbmUgRFRUX1RFTVBfSElHSAkJMHhBMQorI2RlZmluZSBEVFRfVEVNUF9MT1cJCTB4QTIKKyNkZWZpbmUgRFRUX0NPTkZJRwkJMHhBQworI2VuZGlmCisKKyNlbmRpZiAvKiBfRFRUX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Vudmlyb25tZW50LmggYi9pbmNsdWRlL2Vudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4NDY1YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX0VOVklST05NRU5UX0hfCisjZGVmaW5lIF9FTlZJUk9OTUVOVF9IXwkxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSAiZW52aXJvbm1lbnQiIGlzIHN0b3JlZCBhcyBhIGxpc3Qgb2YgJ1wwJyB0ZXJtaW5hdGVkCisgKiAibmFtZT12YWx1ZSIgc3RyaW5ncy4gVGhlIGVuZCBvZiB0aGUgbGlzdCBpcyBtYXJrZWQgYnkgYSBkb3VibGUKKyAqICdcMCcuIE5ldyBlbnRyaWVzIGFyZSBhbHdheXMgYWRkZWQgYXQgdGhlIGVuZC4gRGVsZXRpbmcgYW4gZW50cnkKKyAqIHNoaWZ0cyB0aGUgcmVtYWluaW5nIGVudHJpZXMgdG8gdGhlIGZyb250LiBSZXBsYWNpbmcgYW4gZW50cnkgaXMgYQorICogY29tYmluYXRpb24gb2YgZGVsZXRpbmcgdGhlIG9sZCB2YWx1ZSBhbmQgYWRkaW5nIHRoZSBuZXcgb25lLgorICoKKyAqIFRoZSBlbnZpcm9ubWVudCBpcyBwcmVjZWVkZWQgYnkgYSAzMiBiaXQgQ1JDIG92ZXIgdGhlIGRhdGEgcGFydC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWYgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0ZMQVNIKQorIyBpZm5kZWYgIENGR19FTlZfQUREUgorIyAgZGVmaW5lIENGR19FTlZfQUREUgkoQ0ZHX0ZMQVNIX0JBU0UgKyBDRkdfRU5WX09GRlNFVCkKKyMgZW5kaWYKKyMgaWZuZGVmICBDRkdfRU5WX09GRlNFVAorIyAgZGVmaW5lIENGR19FTlZfT0ZGU0VUIChDRkdfRU5WX0FERFIgLSBDRkdfRkxBU0hfQkFTRSkKKyMgZW5kaWYKKyMgaWYgIWRlZmluZWQoQ0ZHX0VOVl9BRERSX1JFRFVORCkgJiYgZGVmaW5lZChDRkdfRU5WX09GRlNFVF9SRURVTkQpCisjICBkZWZpbmUgQ0ZHX0VOVl9BRERSX1JFRFVORAkoQ0ZHX0ZMQVNIX0JBU0UgKyBDRkdfRU5WX09GRlNFVF9SRURVTkQpCisjIGVuZGlmCisjIGlmbmRlZiAgQ0ZHX0VOVl9TSVpFCisjICBkZWZpbmUgQ0ZHX0VOVl9TSVpFCUNGR19FTlZfU0VDVF9TSVpFCisjIGVuZGlmCisjIGlmIGRlZmluZWQoQ0ZHX0VOVl9BRERSX1JFRFVORCkgJiYgIWRlZmluZWQoQ0ZHX0VOVl9TSVpFX1JFRFVORCkKKyMgIGRlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECUNGR19FTlZfU0laRQorIyBlbmRpZgorIyBpZiAoQ0ZHX0VOVl9BRERSID49IENGR19NT05JVE9SX0JBU0UpICYmIFwKKyAgICAgKENGR19FTlZfQUREUitDRkdfRU5WX1NJWkUpIDw9IChDRkdfTU9OSVRPUl9CQVNFICsgQ0ZHX01PTklUT1JfTEVOKQorIyAgZGVmaW5lIEVOVl9JU19FTUJFRERFRAkxCisjIGVuZGlmCisjIGlmIGRlZmluZWQoQ0ZHX0VOVl9BRERSX1JFRFVORCkgfHwgZGVmaW5lZChDRkdfRU5WX09GRlNFVF9SRURVTkQpCisjICBkZWZpbmUgQ0ZHX1JFRFVOREFORF9FTlZJUk9OTUVOVAkxCisjIGVuZGlmCisjZW5kaWYJLyogQ0ZHX0VOVl9JU19JTl9GTEFTSCAqLworCisKKyNpZmRlZiBDRkdfUkVEVU5EQU5EX0VOVklST05NRU5UCisjIGRlZmluZSBFTlZfSEVBREVSX1NJWkUJKHNpemVvZih1bnNpZ25lZCBsb25nKSArIDEpCisjZWxzZQorIyBkZWZpbmUgRU5WX0hFQURFUl9TSVpFCShzaXplb2YodW5zaWduZWQgbG9uZykpCisjZW5kaWYKKworCisjZGVmaW5lIEVOVl9TSVpFIChDRkdfRU5WX1NJWkUgLSBFTlZfSEVBREVSX1NJWkUpCisKK3R5cGVkZWYJc3RydWN0IGVudmlyb25tZW50X3MgeworCXVuc2lnbmVkIGxvbmcJY3JjOwkJLyogQ1JDMzIgb3ZlciBkYXRhIGJ5dGVzCSovCisjaWZkZWYgQ0ZHX1JFRFVOREFORF9FTlZJUk9OTUVOVAorCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CQkvKiBhY3RpdmUvb2Jzb2xldGUgZmxhZ3MJKi8KKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIJZGF0YVtFTlZfU0laRV07IC8qIEVudmlyb25tZW50IGRhdGEJCSovCit9IGVudl90OworCisjZW5kaWYJLyogX0VOVklST05NRU5UX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9nZW5lcmljLmggYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9nZW5lcmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmODUwZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaApAQCAtMCwwICsxLDE4MCBAQAorI2lmbmRlZiBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSAorI2RlZmluZSBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSAorCisvKgorICogbGludXgvYnl0ZW9yZGVyX2dlbmVyaWMuaAorICogR2VuZXJpYyBCeXRlLXJlb3JkZXJpbmcgc3VwcG9ydAorICoKKyAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4gMTk5NzA3MDcKKyAqICAgIGdhdGhlcmVkIGFsbCB0aGUgZ29vZCBpZGVhcyBmcm9tIGFsbCBhc20tZm9vL2J5dGVvcmRlci5oIGludG8gb25lIGZpbGUsCisgKiAgICBjbGVhbmVkIHRoZW0gdXAuCisgKiAgICBJIGhvcGUgaXQgaXMgY29tcGxpYW50IHdpdGggbm9uLUdDQyBjb21waWxlcnMuCisgKiAgICBJIGRlY2lkZWQgdG8gcHV0IF9fQllURU9SREVSX0hBU19VNjRfXyBpbiBieXRlb3JkZXIuaCwKKyAqICAgIGJlY2F1c2UgSSB3YXNuJ3Qgc3VyZSBpdCB3b3VsZCBiZSBvayB0byBwdXQgaXQgaW4gdHlwZXMuaAorICogICAgVXBncmFkZWQgaXQgdG8gMi4xLjQzCisgKiBGcmFuY29pcy1SZW5lIFJpZGVhdSA8ZmFyZUB0dW5lcy5vcmc+IDE5OTcxMDEyCisgKiAgICBVcGdyYWRlZCBpdCB0byAyLjEuNTcKKyAqICAgIHRvIHBsZWFzZSBMaW51cyBULiwgcmVwbGFjZWQgaHVnZSAjaWZkZWYncyBiZXR3ZWVuIGxpdHRsZS9iaWcgZW5kaWFuCisgKiAgICBieSBuZXN0ZWRseSAjaW5jbHVkZSdkIGZpbGVzLgorICogRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPiAxOTk3MTIwNQorICogICAgTWFkZSBpdCB0byAyLjEuNzE7IG5vdyBhIGZhY2VsaWZ0OgorICogICAgUHV0IGZpbGVzIHVuZGVyIGluY2x1ZGUvbGludXgvYnl0ZW9yZGVyLworICogICAgU3BsaXQgc3dhYiBmcm9tIGdlbmVyaWMgc3VwcG9ydC4KKyAqCisgKiBUT0RPOgorICogICA9IFJlZ3VsYXIga2VybmVsIG1haW50YWluZXJzIGNvdWxkIGFsc28gcmVwbGFjZSBhbGwgdGhlc2UgbWFudWFsCisgKiAgICBieXRlc3dhcCBtYWNyb3MgdGhhdCByZW1haW4sIGRpc3NlbWluYXRlZCBhbW9uZyBkcml2ZXJzLAorICogICAgYWZ0ZXIgc29tZSBncmVwIG9yIHRoZSBzb3VyY2VzLi4uCisgKiAgID0gTGludXMgbWlnaHQgd2FudCB0byByZW5hbWUgYWxsIHRoZXNlIG1hY3JvcyBhbmQgZmlsZXMgdG8gZml0IGhpcyB0YXN0ZSwKKyAqICAgIHRvIGZpdCBoaXMgcGVyc29uYWwgbmFtaW5nIHNjaGVtZS4KKyAqICAgPSBpdCBzZWVtcyB0aGF0IGEgZmV3IGRyaXZlcnMgd291bGQgYWxzbyBhcHByZWNpYXRlCisgKiAgICBueWJibGUgc3dhcHBpbmcgc3VwcG9ydC4uLgorICogICA9IGV2ZXJ5IGFyY2hpdGVjdHVyZSBjb3VsZCBhZGQgdGhlaXIgYnl0ZXN3YXAgbWFjcm8gaW4gYXNtL2J5dGVvcmRlci5oCisgKiAgICBzZWUgaG93IHNvbWUgYXJjaGl0ZWN0dXJlcyBhbHJlYWR5IGRvIChpMzg2LCBhbHBoYSwgcHBjLCBldGMpCisgKiAgID0gY3B1X3RvX2JlWFggYW5kIGJlWFhfdG9fY3B1IG1pZ2h0IHNvbWUgZGF5IG5lZWQgdG8gYmUgd2VsbAorICogICAgZGlzdGluZ3Vpc2hlZCB0aHJvdWdob3V0IHRoZSBrZXJuZWwuIFRoaXMgaXMgbm90IHRoZSBjYXNlIGN1cnJlbnRseSwKKyAqICAgIHNpbmNlIGxpdHRsZSBlbmRpYW4sIGJpZyBlbmRpYW4sIGFuZCBwZHAgZW5kaWFuIG1hY2hpbmVzIG5lZWRuJ3QgaXQuCisgKiAgICBCdXQgdGhpcyBtaWdodCBiZSB0aGUgY2FzZSBmb3IsIHNheSwgYSBwb3J0IG9mIExpbnV4IHRvIDIwLzIxIGJpdAorICogICAgYXJjaGl0ZWN0dXJlcyAoYW5kIEYyMSBMaW51eCBhZGRpY3QgYXJvdW5kPykuCisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB0byBiZSBkZWZpbmVkIGJ5IDxhc20vYnl0ZW9yZGVyLmg+OgorICoKKyAqIENvbnZlcnNpb24gb2YgbG9uZyBhbmQgc2hvcnQgaW50IGJldHdlZW4gbmV0d29yayBhbmQgaG9zdCBmb3JtYXQKKyAqCW50b2hsKF9fdTMyIHgpCisgKgludG9ocyhfX3UxNiB4KQorICoJaHRvbmwoX191MzIgeCkKKyAqCWh0b25zKF9fdTE2IHgpCisgKiBJdCBzZWVtcyB0aGF0IHNvbWUgcHJvZ3JhbXMgKHdoaWNoPyB3aGVyZT8gb3IgcGVyaGFwcyBhIHN0YW5kYXJkPyBQT1NJWD8pCisgKiBtaWdodCBsaWtlIHRoZSBhYm92ZSB0byBiZSBmdW5jdGlvbnMsIG5vdCBtYWNyb3MgKHdoeT8pLgorICogaWYgdGhhdCdzIHRydWUsIHRoZW4gZGV0ZWN0IHRoZW0sIGFuZCB0YWtlIG1lYXN1cmVzLgorICogQW55d2F5LCB0aGUgbWVhc3VyZSBpczogZGVmaW5lIG9ubHkgX19fbnRvaGwgYXMgYSBtYWNybyBpbnN0ZWFkLAorICogYW5kIGluIGEgc2VwYXJhdGUgZmlsZSwgaGF2ZQorICogdW5zaWduZWQgbG9uZyBpbmxpbmUgbnRvaGwoeCl7cmV0dXJuIF9fX250b2hsKHgpO30KKyAqCisgKiBUaGUgc2FtZSBmb3IgY29uc3RhbnQgYXJndW1lbnRzCisgKglfX2NvbnN0YW50X250b2hsKF9fdTMyIHgpCisgKglfX2NvbnN0YW50X250b2hzKF9fdTE2IHgpCisgKglfX2NvbnN0YW50X2h0b25sKF9fdTMyIHgpCisgKglfX2NvbnN0YW50X2h0b25zKF9fdTE2IHgpCisgKgorICogQ29udmVyc2lvbiBvZiBYWC1iaXQgaW50ZWdlcnMgKDE2LSAzMi0gb3IgNjQtKQorICogYmV0d2VlbiBuYXRpdmUgQ1BVIGZvcm1hdCBhbmQgbGl0dGxlL2JpZyBlbmRpYW4gZm9ybWF0CisgKiA2NC1iaXQgc3R1ZmYgb25seSBkZWZpbmVkIGZvciBwcm9wZXIgYXJjaGl0ZWN0dXJlcworICoJY3B1X3RvX1tibF1lWFgoX191WFggeCkKKyAqCVtibF1lWFhfdG9fY3B1KF9fdVhYIHgpCisgKgorICogVGhlIHNhbWUsIGJ1dCB0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHRvIGNvbnZlcnQKKyAqCWNwdV90b19bYmxdZVhYcChfX3VYWCB4KQorICoJW2JsXWVYWF90b19jcHVwKF9fdVhYIHgpCisgKgorICogVGhlIHNhbWUsIGJ1dCBjaGFuZ2UgaW4gc2l0dQorICoJY3B1X3RvX1tibF1lWFhzKF9fdVhYIHgpCisgKglbYmxdZVhYX3RvX2NwdXMoX191WFggeCkKKyAqCisgKiBTZWUgYXNtLWZvby9ieXRlb3JkZXIuaCBmb3IgZXhhbXBsZXMgb2YgaG93IHRvIHByb3ZpZGUKKyAqIGFyY2hpdGVjdHVyZS1vcHRpbWl6ZWQgdmVyc2lvbnMKKyAqCisgKi8KKworCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQorLyoKKyAqIGluc2lkZSB0aGUga2VybmVsLCB3ZSBjYW4gdXNlIG5pY2tuYW1lczsKKyAqIG91dHNpZGUgb2YgaXQsIHdlIG11c3QgYXZvaWQgUE9TSVggbmFtZXNwYWNlIHBvbGx1dGlvbi4uLgorICovCisjZGVmaW5lIGNwdV90b19sZTY0IF9fY3B1X3RvX2xlNjQKKyNkZWZpbmUgbGU2NF90b19jcHUgX19sZTY0X3RvX2NwdQorI2RlZmluZSBjcHVfdG9fbGUzMiBfX2NwdV90b19sZTMyCisjZGVmaW5lIGxlMzJfdG9fY3B1IF9fbGUzMl90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2xlMTYgX19jcHVfdG9fbGUxNgorI2RlZmluZSBsZTE2X3RvX2NwdSBfX2xlMTZfdG9fY3B1CisjZGVmaW5lIGNwdV90b19iZTY0IF9fY3B1X3RvX2JlNjQKKyNkZWZpbmUgYmU2NF90b19jcHUgX19iZTY0X3RvX2NwdQorI2RlZmluZSBjcHVfdG9fYmUzMiBfX2NwdV90b19iZTMyCisjZGVmaW5lIGJlMzJfdG9fY3B1IF9fYmUzMl90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2JlMTYgX19jcHVfdG9fYmUxNgorI2RlZmluZSBiZTE2X3RvX2NwdSBfX2JlMTZfdG9fY3B1CisjZGVmaW5lIGNwdV90b19sZTY0cCBfX2NwdV90b19sZTY0cAorI2RlZmluZSBsZTY0X3RvX2NwdXAgX19sZTY0X3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2xlMzJwIF9fY3B1X3RvX2xlMzJwCisjZGVmaW5lIGxlMzJfdG9fY3B1cCBfX2xlMzJfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fbGUxNnAgX19jcHVfdG9fbGUxNnAKKyNkZWZpbmUgbGUxNl90b19jcHVwIF9fbGUxNl90b19jcHVwCisjZGVmaW5lIGNwdV90b19iZTY0cCBfX2NwdV90b19iZTY0cAorI2RlZmluZSBiZTY0X3RvX2NwdXAgX19iZTY0X3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2JlMzJwIF9fY3B1X3RvX2JlMzJwCisjZGVmaW5lIGJlMzJfdG9fY3B1cCBfX2JlMzJfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fYmUxNnAgX19jcHVfdG9fYmUxNnAKKyNkZWZpbmUgYmUxNl90b19jcHVwIF9fYmUxNl90b19jcHVwCisjZGVmaW5lIGNwdV90b19sZTY0cyBfX2NwdV90b19sZTY0cworI2RlZmluZSBsZTY0X3RvX2NwdXMgX19sZTY0X3RvX2NwdXMKKyNkZWZpbmUgY3B1X3RvX2xlMzJzIF9fY3B1X3RvX2xlMzJzCisjZGVmaW5lIGxlMzJfdG9fY3B1cyBfX2xlMzJfdG9fY3B1cworI2RlZmluZSBjcHVfdG9fbGUxNnMgX19jcHVfdG9fbGUxNnMKKyNkZWZpbmUgbGUxNl90b19jcHVzIF9fbGUxNl90b19jcHVzCisjZGVmaW5lIGNwdV90b19iZTY0cyBfX2NwdV90b19iZTY0cworI2RlZmluZSBiZTY0X3RvX2NwdXMgX19iZTY0X3RvX2NwdXMKKyNkZWZpbmUgY3B1X3RvX2JlMzJzIF9fY3B1X3RvX2JlMzJzCisjZGVmaW5lIGJlMzJfdG9fY3B1cyBfX2JlMzJfdG9fY3B1cworI2RlZmluZSBjcHVfdG9fYmUxNnMgX19jcHVfdG9fYmUxNnMKKyNkZWZpbmUgYmUxNl90b19jcHVzIF9fYmUxNl90b19jcHVzCisjZW5kaWYKKworCisvKgorICogSGFuZGxlIG50b2hsIGFuZCBzdWNoZXMuIFRoZXNlIGhhdmUgdmFyaW91cyBjb21wYXRpYmlsaXR5CisgKiBpc3N1ZXMgLSBsaWtlIHdlIHdhbnQgdG8gZ2l2ZSB0aGUgcHJvdG90eXBlIGV2ZW4gdGhvdWdoIHdlCisgKiBhbHNvIGhhdmUgYSBtYWNybyBmb3IgdGhlbSBpbiBjYXNlIHNvbWUgc3RyYW5nZSBwcm9ncmFtCisgKiB3YW50cyB0byB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSB0aGluZyBvciBzb21ldGhpbmcuLgorICoKKyAqIE5vdGUgdGhhdCB0aGVzZSB1c2VkIHRvIHJldHVybiBhICJsb25nIiBpbiBsaWJjNSwgZXZlbiB0aG91Z2gKKyAqIGxvbmcgaXMgb2Z0ZW4gNjQtYml0IHRoZXNlIGRheXMuLiBUaHVzIHRoZSBjYXN0cy4KKyAqCisgKiBUaGV5IGhhdmUgdG8gYmUgbWFjcm9zIGluIG9yZGVyIHRvIGRvIHRoZSBjb25zdGFudCBmb2xkaW5nCisgKiBjb3JyZWN0bHkgLSBpZiB0aGUgYXJndW1lbnQgcGFzc2VkIGludG8gYSBpbmxpbmUgZnVuY3Rpb24KKyAqIGl0IGlzIG5vIGxvbmdlciBjb25zdGFudCBhY2NvcmRpbmcgdG8gZ2NjLi4KKyAqLworCisjdW5kZWYgbnRvaGwKKyN1bmRlZiBudG9ocworI3VuZGVmIGh0b25sCisjdW5kZWYgaHRvbnMKKworLyoKKyAqIERvIHRoZSBwcm90b3R5cGVzLiBTb21lYm9keSBtaWdodCB3YW50IHRvIHRha2UgdGhlCisgKiBhZGRyZXNzIG9yIHNvbWUgc3VjaCBzaWNrIHRoaW5nLi4KKyAqLworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgKGRlZmluZWQgKF9fR0xJQkNfXykgJiYgX19HTElCQ19fID49IDIpCitleHRlcm4gX191MzIJCQludG9obChfX3UzMik7CitleHRlcm4gX191MzIJCQlodG9ubChfX3UzMik7CisjZWxzZQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50CW50b2hsKHVuc2lnbmVkIGxvbmcgaW50KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGludAlodG9ubCh1bnNpZ25lZCBsb25nIGludCk7CisjZW5kaWYKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBpbnQJbnRvaHModW5zaWduZWQgc2hvcnQgaW50KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBpbnQJaHRvbnModW5zaWduZWQgc2hvcnQgaW50KTsKKworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDIpCisKKyNkZWZpbmUgX19faHRvbmwoeCkgX19jcHVfdG9fYmUzMih4KQorI2RlZmluZSBfX19odG9ucyh4KSBfX2NwdV90b19iZTE2KHgpCisjZGVmaW5lIF9fX250b2hsKHgpIF9fYmUzMl90b19jcHUoeCkKKyNkZWZpbmUgX19fbnRvaHMoeCkgX19iZTE2X3RvX2NwdSh4KQorCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAoZGVmaW5lZCAoX19HTElCQ19fKSAmJiBfX0dMSUJDX18gPj0gMikKKyNkZWZpbmUgaHRvbmwoeCkgX19faHRvbmwoeCkKKyNkZWZpbmUgbnRvaGwoeCkgX19fbnRvaGwoeCkKKyNlbHNlCisjZGVmaW5lIGh0b25sKHgpICgodW5zaWduZWQgbG9uZylfX19odG9ubCh4KSkKKyNkZWZpbmUgbnRvaGwoeCkgKCh1bnNpZ25lZCBsb25nKV9fX250b2hsKHgpKQorI2VuZGlmCisjZGVmaW5lIGh0b25zKHgpIF9fX2h0b25zKHgpCisjZGVmaW5lIG50b2hzKHgpIF9fX250b2hzKHgpCisKKyNlbmRpZiAvKiBPUFRJTUlaRSAqLworCisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcGM4MjR4LmggYi9pbmNsdWRlL21wYzgyNHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Q3ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcGM4MjR4LmgKQEAgLTAsMCArMSw1NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgUm9iIFRheWxvciwgRmx5aW5nIFBpZyBTeXN0ZW1zIEx0ZC4gMjAwMC4KKyAqIENvcHlyaWdodCAoQykgMjAwMSwgSmFtZXMgRG91Z2hlcnR5LCBqZmRAY3Muc3RhbmZvcmQuZWR1CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX01QQzgyNFhfSF9fCisjZGVmaW5lIF9fTVBDODI0WF9IX18KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisvKiBDUFUgVHlwZXMgKi8KKyNkZWZpbmUgQ1BVX1RZUEVfNjAxCQkweDAxCQkvKiBQUEMgNjAxCSBDUFUgKi8KKyNkZWZpbmUgQ1BVX1RZUEVfNjAyCQkweDAyCQkvKiBQUEMgNjAyCSBDUFUgKi8KKyNkZWZpbmUgQ1BVX1RZUEVfNjAzCQkweDAzCQkvKiBQUEMgNjAzCSBDUFUgKi8KKyNkZWZpbmUgQ1BVX1RZUEVfNjAzRQkJMHgwNgkJLyogUFBDIDYwM2UJIENQVSAqLworI2RlZmluZSBDUFVfVFlQRV82MDNQCQkweDA3CQkvKiBQUEMgNjAzcAkgQ1BVICovCisjZGVmaW5lIENQVV9UWVBFXzYwNAkJMHgwNAkJLyogUFBDIDYwNAkgQ1BVICovCisjZGVmaW5lIENQVV9UWVBFXzYwNEUJCTB4MDkJCS8qIFBQQyA2MDRlCSBDUFUgKi8KKyNkZWZpbmUgQ1BVX1RZUEVfNjA0UgkJMHgwYQkJLyogUFBDIDYwNHIJIENQVSAqLworI2RlZmluZSBDUFVfVFlQRV83NTAJCTB4MDgJCS8qIFBQQyA3NTAJIENQVSAqLworI2RlZmluZSBDUFVfVFlQRV84MjQwCQkweDgxCQkvKiBQUEMgODI0MAkgQ1BVICovCisjZGVmaW5lIENQVV9UWVBFXzgyNDUJCTB4ODA4MQkJLyogUFBDIDgyNDUvODI0MSBDUFUgKi8KKyNkZWZpbmUgX0NBQ0hFX0FMSUdOX1NJWkUJMzIJCS8qIGNhY2hlIGxpbmUgc2l6ZSAqLworCisvKiBzcHI5NzYgLSBETUlTUyBkYXRhIHRsYiBtaXNzIGFkZHJlc3MgcmVnaXN0ZXIKKyAqIHNwcjk3NyAtIERDTVAgZGF0YSB0bGIgbWlzcyBjb21wYXJlIHJlZ2lzdGVyCisgKiBzcHI5NzggLSBIQVNIMSBQVEVHMSBhZGRyZXNzIHJlZ2lzdGVyCisgKiBzcHI5ODAgLSBIQVNIMiBQVEVHMiBhZGRyZXNzIHJlZ2lzdGVyCisgKiBJTUlTUyAgLSBpbnN0cnVjdGlvbiB0bGIgbWlzcyBhZGRyZXNzIHJlZ2lzdGVyCisgKiBJQ01QCSAgLSBpbnN0cnVjdGlvbiBUTEIgbWlzIGNvbXBhcmUgcmVnaXN0ZXIKKyAqIFJQQQkgIC0gcmVhbCBwYWdlIGFkZHJlc3MgcmVnaXN0ZXIKKyAqIEhJRDAJICAtIGhhcmR3YXJlIGltcGxlbW50YXRpb24gcmVnaXN0ZXIKKyAqIEhJRDIJICAtIGluc3RydWN0aW9uIGFkZHJlc3MgYnJlYWtwb2ludCByZWdpc3RlcgorICovCisKKy8qIEthaGx1YS9NUEM4MjQwIGRlZmluZXMgKi8KKyNkZWZpbmUgVkVOX0RFVl9JRAkJMHgwMDAyMTA1NwkvKiBWZW5kb3IgYW5kIERldi4gSUQgZm9yIE1QQzEwNiAqLworI2RlZmluZSBLQUhMVUFfSUQJCTB4MDAwMzEwNTcJLyogVmVuZG9yICYgRGV2IElkIGZvciBLYWhsdWEncyBQQ0kgKi8KKyNkZWZpbmUgS0FITFVBMl9JRAkgICAgICAgIDB4MDAwNjEwNTcgICAgICAvKiA4MjQ1IGlzIGFrYSBLYWhsdWEtMiAqLworI2RlZmluZSBCTUNfQkFTRQkJMHg4MDAwMDAwMAkvKiBLYWhsdWEgSUQgaW4gUENJIE1lbW9yeSBzcGFjZSAqLworI2RlZmluZSBDSFJQX1JFR19BRERSCQkweGZlYzAwMDAwCS8qIE1QQzEwNyBDb25maWcsIE1hcCBCICovCisjZGVmaW5lIENIUlBfUkVHX0RBVEEJCTB4ZmVlMDAwMDAJLyogTVBDMTA3IENvbmZpZywgTWFwIEIgKi8KKyNkZWZpbmUgQ0hSUF9JU0FfTUVNX1BIWVMJMHhmZDAwMDAwMAorI2RlZmluZSBDSFJQX0lTQV9NRU1fQlVTCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0hSUF9JU0FfTUVNX1NJWkUJMHgwMTAwMDAwMAorI2RlZmluZSBDSFJQX0lTQV9JT19QSFlTCTB4ZmUwMDAwMDAKKyNkZWZpbmUgQ0hSUF9JU0FfSU9fQlVTCQkweDAwMDAwMDAwCisjZGVmaW5lIENIUlBfSVNBX0lPX1NJWkUJMHgwMDgwMDAwMAorI2RlZmluZSBDSFJQX1BDSV9JT19QSFlTCTB4ZmU4MDAwMDAKKyNkZWZpbmUgQ0hSUF9QQ0lfSU9fQlVTCQkweDAwODAwMDAwCisjZGVmaW5lIENIUlBfUENJX0lPX1NJWkUJMHgwMDQwMDAwMAorI2RlZmluZSBDSFJQX1BDSV9NRU1fUEhZUwkweDgwMDAwMDAwCisjZGVmaW5lIENIUlBfUENJX01FTV9CVVMJMHg4MDAwMDAwMAorI2RlZmluZSBDSFJQX1BDSV9NRU1fU0laRQkweDdkMDAwMDAwCisjZGVmaW5lCUNIUlBfUENJX01FTU9SWV9QSFlTCTB4MDAwMDAwMDAKKyNkZWZpbmUJQ0hSUF9QQ0lfTUVNT1JZX0JVUwkweDAwMDAwMDAwCisjZGVmaW5lIENIUlBfUENJX01FTU9SWV9TSVpFCTB4NDAwMDAwMDAKKyNkZWZpbmUgUFJFUF9SRUdfQUREUgkJMHg4MDAwMGNmOAkvKiBNUEMxMDcgQ29uZmlnLCBNYXAgQSAqLworI2RlZmluZSBQUkVQX1JFR19EQVRBCQkweDgwMDAwY2ZjCS8qIE1QQzEwNyBDb25maWcsIE1hcCBBICovCisjZGVmaW5lIFBSRVBfSVNBX0lPX1BIWVMJMHg4MDAwMDAwMAorI2RlZmluZSBQUkVQX0lTQV9JT19CVVMJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUFJFUF9JU0FfSU9fU0laRQkweDAwODAwMDAwCisjZGVmaW5lIFBSRVBfUENJX0lPX1BIWVMJMHg4MTAwMDAwMAorI2RlZmluZSBQUkVQX1BDSV9JT19CVVMJCTB4MDEwMDAwMDAKKyNkZWZpbmUgUFJFUF9QQ0lfSU9fU0laRQkweDNlODAwMDAwCisjZGVmaW5lIFBSRVBfUENJX01FTV9QSFlTCTB4YzAwMDAwMDAKKyNkZWZpbmUgUFJFUF9QQ0lfTUVNX0JVUwkweDAwMDAwMDAwCisjZGVmaW5lIFBSRVBfUENJX01FTV9TSVpFCTB4M2YwMDAwMDAKKyNkZWZpbmUJUFJFUF9QQ0lfTUVNT1JZX1BIWVMJMHgwMDAwMDAwMAorI2RlZmluZQlQUkVQX1BDSV9NRU1PUllfQlVTCTB4ODAwMDAwMDAKKyNkZWZpbmUJUFJFUF9QQ0lfTUVNT1JZX1NJWkUJMHg4MDAwMDAwMAorI2RlZmluZSBNUEMxMDdfUENJX0NNRAkJMHg4MDAwMDAwNAkvKiBNUEMxMDcgUENJIGNtZCByZWcgKi8KKyNkZWZpbmUgTVBDMTA3X1BDSV9TVEFUIAkweDgwMDAwMDA2CS8qIE1QQzEwNyBQQ0kgc3RhdHVzIHJlZyAqLworI2RlZmluZSBQUk9DX0lOVDFfQURSCQkweDgwMDAwMGE4CS8qIE1QQzEwNyBQcm9jZXNzb3IgaS9mIGNmZzEgKi8KKyNkZWZpbmUgUFJPQ19JTlQyX0FEUgkJMHg4MDAwMDBhYwkvKiBNUEMxMDcgUHJvY2Vzc29yIGkvZiBjZmcyICovCisjZGVmaW5lIE1FTV9DT05UMV9BRFIJCTB4ODAwMDAwZjAJLyogTVBDMTA3IE1lbW9yeSBjb250cm9sIGNvbmZpZy4gMSAqLworI2RlZmluZSBNRU1fQ09OVDJfQURSCQkweDgwMDAwMGY0CS8qIE1QQzEwNyBNZW1vcnkgY29udHJvbCBjb25maWcuIDIgKi8KKyNkZWZpbmUgTUVNX0NPTlQzX0FEUgkJMHg4MDAwMDBmOAkvKiBNUEMxMDcgTWVtb3J5IGNvbnRyb2wgY29uZmlnLiAzICovCisjZGVmaW5lIE1FTV9DT05UNF9BRFIJCTB4ODAwMDAwZmMJLyogTVBDMTA3IE1lbW9yeSBjb250cm9sIGNvbmZpZy4gNCAqLworI2RlZmluZSBNRU1fRVJSRU4xX0FEUgkJMHg4MDAwMDBjMAkvKiBNUEMxMDcgTWVtb3J5IGVycm9yIGVuYWJsZSAxICovCisjZGVmaW5lIE1FTV9TVEFSVDFfQURSCQkweDgwMDAwMDgwCS8qIE1QQzEwNyBNZW1vcnkgc3RhcnRpbmcgYWRkciAqLworI2RlZmluZSBNRU1fU1RBUlQyX0FEUgkJMHg4MDAwMDA4NAkvKiBNUEMxMDcgTWVtb3J5IHN0YXJ0aW5nIGFkZHItbG8gKi8KKyNkZWZpbmUgWE1FTV9TVEFSVDFfQURSIAkweDgwMDAwMDg4CS8qIE1QQzEwNyBFeHRlbmRlZCBtZW0uIHN0YXJ0IGFkZHItaGkqLworI2RlZmluZSBYTUVNX1NUQVJUMl9BRFIgCTB4ODAwMDAwOGMJLyogTVBDMTA3IEV4dGVuZGVkIG1lbS4gc3RhcnQgYWRkci1sbyovCisjZGVmaW5lIE1FTV9FTkQxX0FEUgkJMHg4MDAwMDA5MAkvKiBNUEMxMDcgTWVtb3J5IGVuZGluZyBhZGRyZXNzICovCisjZGVmaW5lIE1FTV9FTkQyX0FEUgkJMHg4MDAwMDA5NAkvKiBNUEMxMDcgTWVtb3J5IGVuZGluZyBhZGRyLWxvICovCisjZGVmaW5lIFhNRU1fRU5EMV9BRFIJCTB4ODAwMDAwOTgJLyogTVBDMTA3IEV4dGVuZGVkIG1lbS4gZW5kIGFkZHJzLWhpICovCisjZGVmaW5lIFhNRU1fRU5EMl9BRFIJCTB4ODAwMDAwOWMJLyogTVBDMTA3IEV4dGVuZGVkIG1lbS4gZW5kIGFkZHJzLWxvKi8KKyNkZWZpbmUgT1VUX0RSVl9DT05UCQkweDgwMDAwMDczCS8qIE1QQzEwNyBPdXRwdXQgRHJpdmVyIENvbnRyb2wgcmVnICovCisjZGVmaW5lIE1FTV9FTl9BRFIJCTB4ODAwMDAwYTAJLyogTWVtb3J5IGJhbmsgZW5hYmxlICovCisjZGVmaW5lIFBBR0VfTU9ERQkJMHg4MDAwMDBhMwkvKiBNUEMxMDcgUGFnZSBNb2RlIENvdW50ZXIvVGltZXIgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRXhjZXB0aW9uIG9mZnNldHMgKFBvd2VyUEMgc3RhbmRhcmQpCisgKi8KKyNkZWZpbmUgRVhDX09GRl9SRVNFUlZFRDAJMHgwMDAwCS8qIFJlc2VydmVkICovCisjZGVmaW5lIEVYQ19PRkZfU1lTX1JFU0VUCTB4MDEwMAkvKiBTeXN0ZW0gcmVzZXQgKi8KKyNkZWZpbmUgRVhDX09GRl9NQUNIX0NIQ0sJMHgwMjAwCS8qIE1hY2hpbmUgQ2hlY2sgKi8KKyNkZWZpbmUgRVhDX09GRl9EQVRBX1NUT1IJMHgwMzAwCS8qIERhdGEgU3RvcmFnZSAqLworI2RlZmluZSBFWENfT0ZGX0lOU19TVE9SCTB4MDQwMAkvKiBJbnN0cnVjdGlvbiBTdG9yYWdlICovCisjZGVmaW5lIEVYQ19PRkZfRVhURVJOQUwJMHgwNTAwCS8qIEV4dGVybmFsICovCisjZGVmaW5lIEVYQ19PRkZfQUxJR04JCTB4MDYwMAkvKiBBbGlnbm1lbnQgKi8KKyNkZWZpbmUgRVhDX09GRl9QUk9HUkFNCQkweDA3MDAJLyogUHJvZ3JhbSAqLworI2RlZmluZSBFWENfT0ZGX0ZQVU5BVkFJTAkweDA4MDAJLyogRmxvYXRpbmctcG9pbnQgVW5hdmFpbGFibGUgKi8KKyNkZWZpbmUgRVhDX09GRl9ERUNSCQkweDA5MDAJLyogRGVjcmVtZW50ZXIgKi8KKyNkZWZpbmUgRVhDX09GRl9SRVNFUlZFRDEJMHgwQTAwCS8qIFJlc2VydmVkICovCisjZGVmaW5lIEVYQ19PRkZfUkVTRVJWRUQyCTB4MEIwMAkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBFWENfT0ZGX1NZU19DQUxMCTB4MEMwMAkvKiBTeXN0ZW0gQ2FsbCAqLworI2RlZmluZSBFWENfT0ZGX1RSQUNFCQkweDBEMDAJLyogVHJhY2UgKi8KKyNkZWZpbmUgRVhDX09GRl9GUFVOQVNTSVNUCTB4MEUwMAkvKiBGbG9hdGluZy1wb2ludCBBc3Npc3QgKi8KKworCS8qIDB4MEUxMCAtIDB4MEZGRiBhcmUgbWFya2VkIHJlc2VydmVkIGluIFRoZSBQb3dlclBDIEFyY2hpdGVjdHVyZSBib29rICovCisJLyogdGhlc2UgZm91bmQgaW4gRElOSyBjb2RlICAtIG1heSBub3QgYXBwbHkgdG8gODI0MCovCisjZGVmaW5lIEVYQ19PRkZfUE1JCQkweDBGMDAJLyogUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRVhDX09GRl9WTVhVSQkJMHgwRjIwCS8qIFZNWCAoQWx0aVZlYykgVW5hdmFpbGFibGUgSW50ZXJydXB0ICovCisKKwkvKiAweDEwMDAgLSAweDJGRkYgYXJlIGltcGxlbWVudGF0aW9uIHNwZWNpZmljICovCisJLyogdGhlc2UgZm91bmQgaW4gRElOSyBjb2RlICAtIG1heSBub3QgYXBwbHkgdG8gODI0MCAqLworI2RlZmluZSBFWENfT0ZGX0lUTUUJCTB4MTAwMAkvKiBJbnN0cnVjdGlvbiBUcmFuc2xhdGlvbiBNaXNzIEV4Y2VwdGlvbiAqLworI2RlZmluZSBFWENfT0ZGX0RMVE1FCQkweDExMDAJLyogRGF0YSBMb2FkIFRyYW5zbGF0aW9uIE1pc3MgRXhjZXB0aW9uICovCisjZGVmaW5lIEVYQ19PRkZfRFNUTUUJCTB4MTIwMAkvKiBEYXRhIFN0b3JlIFRyYW5zbGF0aW9uIE1pc3MgRXhjZXB0aW9uICovCisjZGVmaW5lIEVYQ19PRkZfSUFCRQkJMHgxMzAwCS8qIEluc3RydWN0aW9uIEFkZHIgQnJlYWtwb2ludCBFeGNlcHRpb24gKi8KKyNkZWZpbmUgRVhDX09GRl9TTUlFCQkweDE0MDAJLyogU3lzdGVtIE1hbmFnZW1lbnQgSW50ZXJydXB0IEV4Y2VwdGlvbiAqLworI2RlZmluZSBFWENfT0ZGX0pNRERJCQkweDE2MDAJLyogSmF2YSBNb2RlIGRlbm9ybSBkZXRlY3QgSW50ZXJyIC0tIFdURj8/Ki8KKyNkZWZpbmUgRVhDX09GRl9STVRFCQkweDIwMDAJLyogUnVuIE1vZGUgb3IgVHJhY2UgRXhjZXB0aW9uICovCisKKyNkZWZpbmUgTUFQX0FfQ09ORklHX0FERFJfSElHSAkweDgwMDAJLyogVXBwZXIgaGFsZiBvZiBDT05GSUdfQUREUiBmb3IgTWFwIEEgKi8KKyNkZWZpbmUgTUFQX0FfQ09ORklHX0FERFJfTE9XCTB4MENGOAkvKiBMb3dlciBoYWxmIG9mIENPTkZJR19BRERSIGZvciBNYXAgQSAqLworI2RlZmluZSBNQVBfQV9DT05GSUdfREFUQV9ISUdICTB4ODAwMAkvKiBVcHBlciBoYWxmIG9mIENPTkZJR19EQVQgZm9yIE1hcCBBICovCisjZGVmaW5lIE1BUF9BX0NPTkZJR19EQVRBX0xPVwkweDBDRkMJLyogTG93ZXIgaGFsZiBvZiBDT05GSUdfREFUIGZvciBNYXAgQSAqLworI2RlZmluZSBNQVBfQl9DT05GSUdfQUREUl9ISUdICTB4ZmVjMAkvKiBVcHBlciBoYWxmIG9mIENPTkZJR19BRERSIGZvciBNYXAgQiAqLworI2RlZmluZSBNQVBfQl9DT05GSUdfQUREUl9MT1cJMHgwMDAwCS8qIExvd2VyIGhhbGYgb2YgQ09ORklHX0FERFIgZm9yIE1hcCBCICovCisjZGVmaW5lIE1BUF9CX0NPTkZJR19EQVRBX0hJR0gJMHhmZWUwCS8qIFVwcGVyIGhhbGYgb2YgQ09ORklHX0RBVCBmb3IgTWFwIEIgKi8KKyNkZWZpbmUgTUFQX0JfQ09ORklHX0RBVEFfTE9XCTB4MDAwMAkvKiBMb3dlciBoYWxmIG9mIENPTkZJR19EQVQgZm9yIE1hcCBCICovCisKKworI2lmIGRlZmluZWQoQ0ZHX0FERFJfTUFQX0EpCisjZGVmaW5lIENPTkZJR19BRERSX0hJR0ggICAgTUFQX0FfQ09ORklHX0FERFJfSElHSCAgLyogVXBwZXIgaGFsZiBvZiBDT05GSUdfQUREUiAqLworI2RlZmluZSBDT05GSUdfQUREUl9MT1cJICAgIE1BUF9BX0NPTkZJR19BRERSX0xPVyAgIC8qIExvd2VyIGhhbGYgb2YgQ09ORklHX0FERFIgKi8KKyNkZWZpbmUgQ09ORklHX0RBVEFfSElHSCAgICBNQVBfQV9DT05GSUdfREFUQV9ISUdIICAvKiBVcHBlciBoYWxmIG9mIENPTkZJR19EQVQgKi8KKyNkZWZpbmUgQ09ORklHX0RBVEFfTE9XCSAgICBNQVBfQV9DT05GSUdfREFUQV9MT1cgICAvKiBMb3dlciBoYWxmIG9mIENPTkZJR19EQVQgKi8KKyNlbHNlIC8qIEFzc3VtZSBNYXAgQiwgZGVmYXVsdCAqLworI2RlZmluZSBDT05GSUdfQUREUl9ISUdIICAgIE1BUF9CX0NPTkZJR19BRERSX0hJR0ggIC8qIFVwcGVyIGhhbGYgb2YgQ09ORklHX0FERFIgKi8KKyNkZWZpbmUgQ09ORklHX0FERFJfTE9XCSAgICBNQVBfQl9DT05GSUdfQUREUl9MT1cgICAvKiBMb3dlciBoYWxmIG9mIENPTkZJR19BRERSICovCisjZGVmaW5lIENPTkZJR19EQVRBX0hJR0ggICAgTUFQX0JfQ09ORklHX0RBVEFfSElHSCAgLyogVXBwZXIgaGFsZiBvZiBDT05GSUdfREFUICovCisjZGVmaW5lIENPTkZJR19EQVRBX0xPVwkgICAgTUFQX0JfQ09ORklHX0RBVEFfTE9XICAgLyogTG93ZXIgaGFsZiBvZiBDT05GSUdfREFUICovCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfQUREUgkoQ09ORklHX0FERFJfSElHSCA8PCAxNiB8IENPTkZJR19BRERSX0xPVykKKworI2RlZmluZSBDT05GSUdfREFUQQkoQ09ORklHX0RBVEFfSElHSCA8PCAxNiB8IENPTkZJR19EQVRBX0xPVykKKworLyogTWFjcm9zIHRvIHdyaXRlIHRvIGNvbmZpZyByZWdpc3RlcnMuIGFkZHIgc2hvdWxkIGJlIGEgY29uc3RhbnQgaW4gYWxsIGNhc2VzICovCisKKyNkZWZpbmUgQ09ORklHX1dSSVRFX0JZVEUoIGFkZHIsIGRhdGEgKSBcCisgIF9fYXNtX18gX192b2xhdGlsZV9fKCBcCisgICIgc3R3YnJ4ICUxLCAwLCAlMFxuIFwKKyAgICBzeW5jXG4gXAorICAgIHN0YiAlMywgJTQoJTIpXG4gXAorICAgIHN5bmMgIiBcCisgIDogLyogbm8gb3V0cHV0ICovIFwKKyAgOiAiciIgKENPTkZJR19BRERSKSwgInIiICgoYWRkcikgJiB+MyksIFwKKyAgICAiYiIgKENPTkZJR19EQVRBKSwgInIiIChkYXRhKSwgXAorICAgICJuIiAoKGFkZHIpICYgMykpOworCisjZGVmaW5lIENPTkZJR19XUklURV9IQUxGV09SRCggYWRkciwgZGF0YSApIFwKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKyAgIiBzdHdicnggJTEsIDAsICUwXG4gXAorICAgIHN5bmNcbiBcCisgICAgc3RoYnJ4ICUzLCAlNCwgJTJcbiBcCisgICAgc3luYyAiIFwKKyAgOiAvKiBubyBvdXRwdXQgKi8gXAorICA6ICJyIiAoQ09ORklHX0FERFIpLCAiciIgKChhZGRyKSAmIH4zKSwgXAorICAgICJyIiAoQ09ORklHX0RBVEEpLCAiciIgKGRhdGEpLCBcCisgICAgImIiICgoYWRkcikgJiAzKSk7CisKKy8qIHRoaXMgYXNzdW1lcyBpdCdzIHdyaXRlaW5nIG9uIHdvcmQgYm91bmRhcmllcyovCisjZGVmaW5lIENPTkZJR19XUklURV9XT1JEKCBhZGRyLCBkYXRhICkgXAorICBfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAorICAiIHN0d2JyeCAlMSwgMCwgJTBcbiBcCisgICAgc3luY1xuIFwKKyAgICBzdHdicnggJTMsIDAsICUyXG4gXAorICAgIHN5bmMgIiBcCisgIDogLyogbm8gb3V0cHV0ICovIFwKKyAgOiAiciIgKENPTkZJR19BRERSKSwgInIiIChhZGRyKSwgXAorICAgICJyIiAoQ09ORklHX0RBVEEpLCAiciIgKGRhdGEpKTsKKworLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciByZWFkcyovCisKKyNkZWZpbmUgQ09ORklHX1JFQURfQllURSggYWRkciwgcmVnICkgXAorICBfX2FzbV9fICggXAorICAiIHN0d2JyeCAlMSwgMCwgJTJcbiBcCisgICAgc3luY1xuIFwKKyAgICBsYnoJICAlMCwgJTQoJTMpXG4gXAorICAgIHN5bmMgIiBcCisgIDogIj1yIiAocmVnKSBcCisgIDogInIiICgoYWRkcikgJiB+MyksICJyIiAoQ09ORklHX0FERFIpLCBcCisgICAgImIiIChDT05GSUdfREFUQSksICJuIiAoKGFkZHIpICYgMykpOworCisKKyNkZWZpbmUgQ09ORklHX1JFQURfSEFMRldPUkQoIGFkZHIsIHJlZyApIFwKKyAgX19hc21fXyAoIFwKKyAgIiBzdHdicnggJTEsIDAsICUyXG4gXAorICAgIHN5bmNcbiBcCisgICAgbGhicnggJTAsICU0LCAlM1xuIFwKKyAgICBzeW5jICIgXAorICA6ICI9ciIgKHJlZykgXAorICA6ICJyIiAoKGFkZHIpICYgfjMpLCAiciIgKENPTkZJR19BRERSKSwgXAorICAgICJyIiAoQ09ORklHX0RBVEEpLCBcCisgICAgImIiICgoYWRkcikgJiAzKSk7CisKKy8qIHRoaXMgYXNzdW1lcyBpdCdzIHJlYWRpbmcgb24gd29yZCBib3VuZGFyaWVzKi8KKyNkZWZpbmUgQ09ORklHX1JFQURfV09SRCggYWRkciwgcmVnICkgXAorICBfX2FzbV9fICggXAorICAiIHN0d2JyeCAlMSwgMCwgJTJcbiBcCisgICAgc3luY1xuIFwKKyAgICBsd2JyeCAlMCwgMCwgJTNcbiBcCisgICAgc3luYyAiIFwKKyAgOiAiPXIiIChyZWcpIFwKKyAgOiAiciIgKGFkZHIpLCAiciIgKENPTkZJR19BRERSKSxcCisgICAgInIiIChDT05GSUdfREFUQSkpOworCisvKgorICogIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgJ2FkZHJlc3NlcycuCisgKiAgVGhlc2UgYXJlIGRlc2NyaWJlZCBpbiBjaGFwZXIgNSBvZiB0aGUgODI0MCB1c2VycyBtYW51YWwuCisgKiAgV2hlcmUgdGhlIHJlZ2lzdGVyIGhhcyBhbiBhYnJldmlhdGlvbiBpbiB0aGUgbWFudWFsLCB0aGlzIGhhcworICogIGJlZW4gdXNhZWQgaGVyZSwgb3RoZXJ3aXNlIGEgbmFtZSBpbiBrZWVwaW5nIHdpdGggdGhlIG5vcm0gaGFzCisgKiAgYmVlbiBpbnZlbnRlZC4KKyAqICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSByZWdpc3RlcnMgYXJlbid0IGRvY3VtZW50ZWQgaW4gdGhlIG1hbnVhbC4KKyAqLworCisjZGVmaW5lIFBDSUNSCQkweDgwMDAwMDA0ICAvKiBQQ0kgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lTUgkJMHg4MDAwMDAwNiAgLyogUENJIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSRVZJRAkJMHg4MDAwMDAwOCAgLyogQ1BVIHJldmlzaW9uIGlkICovCisjZGVmaW5lIFBJUgkJMHg4MDAwMDAwOSAgLyogUENJIFByb2dyYW1taW5nIEludGVyZmFjZSBSZWdpc3RlciAqLworI2RlZmluZSBQQkNDUgkJMHg4MDAwMDAwYiAgLyogUENJIEJhc2UgQ2xhc3MgQ29kZSBSZWdpc3RlciAqLworI2RlZmluZSBQQ0xTUgkJMHg4MDAwMDAwYyAgLyogUHJvY2Vzc29yIENhY2hlIExpbmUgU2l6ZSBSZWdpc3RlciAqLworI2RlZmluZSBQTFRSCQkweDgwMDAwMDBkICAvKiBQQ0kgTGF0YW5jeSBUaW1lciBSZWdpc3RlciAqLworI2RlZmluZSBQSFRSCQkweDgwMDAwMDBlICAvKiBQQ0kgSGVhZGVyIFR5cGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQklTVENUUkwJMHg4MDAwMDAwZiAgLyogQklTVCBDb250cm9sICovCisjZGVmaW5lIExNQkFSCQkweDgwMDAwMDEwICAvKiBMb2NhbCBCYXNlIEFkZHJlcyBSZWdpc3RlciAqLworI2RlZmluZSBQQ1NSQkFSCQkweDgwMDAwMDE0ICAvKiBQQ1NSIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBJTFIJCTB4ODAwMDAwM2MgIC8qIFBDSSBJbnRlcnJ1cHQgTGluZSBSZWdpc3RlciAqLworI2RlZmluZSBJUFIJCTB4ODAwMDAwM2QgIC8qIEludGVycnVwdCBQaW4gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlOR05UCQkweDgwMDAwMDNlICAvKiBNSU4gR05JICovCisjZGVmaW5lIE1BWExBVAkJMHg4MDAwMDAzZiAgLyogTUFYIExBVCAqLworI2RlZmluZSBQQ0lBQ1IJCTB4ODAwMDAwNDYgIC8qIFBDSSBBcmJpdGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE1DUjEJCTB4ODAwMDAwNzAgIC8qIFBvd2VyIG1hbmFnZW1lbnQgY29uZmlnLiAxICovCisjZGVmaW5lIFBNQ1IyCQkweDgwMDAwMDcyICAvKiBQb3dlciBtYW5hZ2VtZW50IGNvbmZpZy4gMiAqLworI2RlZmluZSBPRENSCQkweDgwMDAwMDczICAvKiBPdXRwdXQgRHJpdmVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ0xLRENSCQkweDgwMDAwMDc0ICAvKiBDTEsgRHJpdmVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MjQ1KSB8fCBkZWZpbmVkKENPTkZJR19NUEM4MjQxKQorI2RlZmluZSBNSU9DUjEJCTB4ODAwMDAwNzYgIC8qIE1pc2NlbGxhbmVvdXMgSS9PIENvbnRyb2wgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBNSU9DUjIJCTB4ODAwMDAwNzcgIC8qIE1pc2NlbGxhbmVvdXMgSS9PIENvbnRyb2wgUmVnaXN0ZXIgMiAqLworI2VuZGlmCisjZGVmaW5lIEVVTUJCQVIJCTB4ODAwMDAwNzggIC8qIEVtYmVkZGVkIFV0aWxpdGllcyBNZW1vcnkgQmxvY2sgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIEVVTUJCQVJfVkFMCTB4ODA1MDAwMDAgIC8qIFBDSSBSZWxvY2F0aW9uIG9mZnNldCBmb3IgRVVNQiByZWdpb24gKi8KKyNkZWZpbmUgRVVNQlNJWkUJMHgwMDEwMDAwMCAgLyogU2l6ZSBvZiBFVU1CIHJlZ2lvbiAqLworCisjZGVmaW5lIE1TQVIxCQkweDgwMDAwMDgwICAvKiBNZW1vcnkgU3RhcnRpbmcgQWRkcmVzcyBSZWdpc3RlciAxICovCisjZGVmaW5lIE1TQVIyCQkweDgwMDAwMDg0ICAvKiBNZW1vcnkgU3RhcnRpbmcgQWRkcmVzcyBSZWdpc3RlciAyICovCisjZGVmaW5lIEVNU0FSMQkJMHg4MDAwMDA4OCAgLyogRXh0ZW5kZWQgTWVtb3J5IFN0YXJ0aW5nIEFkZHJlc3MgUmVnaXN0ZXIgMSovCisjZGVmaW5lIEVNU0FSMgkJMHg4MDAwMDA4YyAgLyogRXh0ZW5kZWQgTWVtb3J5IFN0YXJ0aW5nIEFkZHJlc3MgUmVnaXN0ZXIgMiovCisjZGVmaW5lIE1FQVIxCQkweDgwMDAwMDkwICAvKiBNZW1vcnkgRW5kaW5nIEFkZHJlc3MgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBNRUFSMgkJMHg4MDAwMDA5NCAgLyogTWVtb3J5IEVuZGluZyBBZGRyZXNzIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRU1FQVIxCQkweDgwMDAwMDk4ICAvKiBFeHRlbmRlZCBNZW1vcnkgRW5kaW5nIEFkZHJlc3MgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBFTUVBUjIJCTB4ODAwMDAwOWMgIC8qIEV4dGVuZGVkIE1lbW9yeSBFbmRpbmcgQWRkcmVzcyBSZWdpc3RlciAyICovCisjZGVmaW5lIE1CRVIJCTB4ODAwMDAwYTAgIC8qIE1lbW9yeSBiYW5rIEVuYWJsZSBSZWdpc3RlciovCisjZGVmaW5lIE1QTVIJCTB4ODAwMDAwYTMgIC8qIE1lbW9yeSBQYWdlIE1vZGUgUmVnaXN0ZXIgKHN0b3JlcyBQR01BWCkgKi8KKyNkZWZpbmUgUElDUjEJCTB4ODAwMDAwYTggIC8qIFByb2Nlc3NvciBJbnRlcmZhY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lIFBJQ1IyCQkweDgwMDAwMGFjICAvKiBQcm9jZXNzb3IgSW50ZXJmYWNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZSBFQ0NTQkVDUgkweDgwMDAwMGI4ICAvKiBFQ0MgU2luZ2xlLUJpdCBFcnJvciBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEVDQ1NCRVRSCTB4ODAwMDAwYjggIC8qIEVDQyBTaW5nbGUtQml0IEVycm9yIFRyaWdnZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVJSRU5SMQkJMHg4MDAwMDBjMCAgLyogRXJyb3IgRW5hYmxlaW5nIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRVJSRU5SMgkJMHg4MDAwMDBjNCAgLyogRXJyb3IgRW5hYmxlaW5nIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRVJSRFIxCQkweDgwMDAwMGMxICAvKiBFcnJvciBEZXRlY3Rpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZSBJUEJFU1IJCTB4ODAwMDAwYzMgIC8qIEludGVybmFsIFByb2Nlc3NvciBFcnJvciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVJSRFIyCQkweDgwMDAwMGM1ICAvKiBFcnJvciBEZXRlY3Rpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZSBQQkVTUgkJMHg4MDAwMDBjNyAgLyogUENJIEJ1cyBFcnJvciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEJFQVIJCTB4ODAwMDAwYzggIC8qIFByb2Nlc3Nvci9QQ0kgQnVzIEVycm9yIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBBTUJPUgkJMHg4MDAwMDBlMCAgLyogQWRkcmVzcyBNYXAgQiBPcHRpb25zIFJlZ2lzdGVyICovCisjZGVmaW5lIE1DQ1IxCQkweDgwMDAwMGYwICAvKiBNZW1vcnkgQ29udHJvbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgTUNDUjIJCTB4ODAwMDAwZjQgIC8qIE1lbW9yeSBDb250cm9sIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZSBNQ0NSMwkJMHg4MDAwMDBmOCAgLyogTWVtb3J5IENvbnRyb2wgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAzICovCisjZGVmaW5lIE1DQ1I0CQkweDgwMDAwMGZjICAvKiBNZW1vcnkgQ29udHJvbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDQgKi8KKworLyogc29tZSB2YWx1ZXMgZm9yIHNvbWUgb2YgdGhlIGFib3ZlICovCisKKyNkZWZpbmUgUElDUjFfQ0ZfQVBBUksJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUElDUjFfTEVfTU9ERQkJMHgwMDAwMDAyMAorI2RlZmluZSBQSUNSMV9TVF9HQVRIX0VOCTB4MDAwMDAwNDAKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MjQwKQorI2RlZmluZSBQSUNSMV9FTl9QQ1MJCTB4MDAwMDAwODAgLyogYWNjb3JkaW5nIHRvIGRpbmsgY29kZSwgc2V0cyB0aGUgODI0MCB0byBoYW5kbGUgcGNpIGNvbmZpZyBzcGFjZSAqLworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODI0NSkgfHwgZGVmaW5lZChDT05GSUdfTVBDODI0MSkKKyNkZWZpbmUgUElDUjFfTk9fQlVTV19DSwkweDAwMDAwMDgwIC8qIG5vIGJ1cyB3aWR0aCBjaGVjayBmb3IgZmxhc2ggd3JpdGVzICovCisjZGVmaW5lIFBJQ1IxX0RFQwkJMHgwMDAwMDEwMCAvKiBUaW1lIEJhc2UgZW5hYmxlIG9uIDgyNDUvODI0MSAqLworI2RlZmluZSBFUkNSMQkJICAgICAgICAweDgwMDAwMGQwICAvKiBFeHRlbmRlZCBST00gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lIEVSQ1IyCQkgICAgICAgIDB4ODAwMDAwZDQgIC8qIEV4dGVuZGVkIFJPTSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRVJDUjMJCSAgICAgICAgMHg4MDAwMDBkOCAgLyogRXh0ZW5kZWQgUk9NIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMyAqLworI2RlZmluZSBFUkNSNAkJICAgICAgICAweDgwMDAwMGRjICAvKiBFeHRlbmRlZCBST00gQ29uZmlndXJhdGlvbiBSZWdpc3RlciA0ICovCisjZGVmaW5lIE1JT0NSMQkJICAgICAgICAweDgwMDAwMDc2ICAvKiBNaXNjZWxsYW5lb3VzIEkvTyBDb250cm9sIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgTUlPQ1IxX0FEUl9YCSAgICAgICAgMHg4MDAwMDA3NCAgLyogTWlzY2VsbGFuZW91cyBJL08gQ29udHJvbCBSZWdpc3RlciAxICovCisjZGVmaW5lIE1JT0NSMV9TSElGVAkgICAgICAgIDIKKyNkZWZpbmUgTUlPQ1IyCQkgICAgICAgIDB4ODAwMDAwNzcgIC8qIE1pc2NlbGxhbmVvdXMgSS9PIENvbnRyb2wgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBNSU9DUjJfQURSX1gJICAgICAgICAweDgwMDAwMDc0ICAvKiBNaXNjZWxsYW5lb3VzIEkvTyBDb250cm9sIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgTUlPQ1IyX1NISUZUCSAgICAgICAgMworI2RlZmluZSBPRENSX0FEUl9YCSAgICAgICAgMHg4MDAwMDA3MAkvKiBPdXRwdXQgRHJpdmVyIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgT0RDUl9TSElGVCAgICAgICAgICAgICAgMworI2RlZmluZSBQTUNSMl9BRFIJICAgICAgICAweDgwMDAwMDcyCS8qIFBvd2VyIE1nbW50IENmZyAyIHJlZ2lzdGVyICovCisjZGVmaW5lIFBNQ1IyX0FEUl9YCSAgICAgICAgMHg4MDAwMDA3MAorI2RlZmluZSBQTUNSMl9TSElGVCAgICAgICAgICAgICAzCisjZGVmaW5lIFBNQ1IxX0FEUgkgICAgICAgIDB4ODAwMDAwNzAJLyogUG93ZXIgTWdtbnQgQ2ZnIDEgcmVpc3RlciAqLworI2Vsc2UKKyNlcnJvciBTcGVjaWZpYyB0eXBlIG9mIE1QQzgyNHggbXVzdCBiZSBkZWZpbmVkIChpLmUuIENPTkZJR19NUEM4MjQwKQorI2VuZGlmCisjZGVmaW5lIFBJQ1IxX0NGX0RQQVJLCQkweDAwMDAwMjAwCisjZGVmaW5lIFBJQ1IxX01DUF9FTgkJMHgwMDAwMDgwMAorI2RlZmluZSBQSUNSMV9GTEFTSF9XUl9FTgkweDAwMDAxMDAwCisjaWZkZWYgQ09ORklHX01QQzgyNDAKKyNkZWZpbmUgUElDUjFfQUREUkVTU19NQVAJMHgwMDAxMDAwMAorI2RlZmluZSBQSVJDMV9NU0sJCTB4ZmYwMDAwMDAKKyNlbmRpZgorI2RlZmluZSBQSUNSMV9QUk9DX1RZUEVfTVNLCTB4MDAwNjAwMDAKKyNkZWZpbmUgUElDUjFfUFJPQ19UWVBFXzYwM0UJMHgwMDA0MDAwMAorI2RlZmluZSBQSUNSMV9SQ1MwCQkweDAwMTAwMDAwCisKKyNkZWZpbmUgUElDUjJfQ0ZfU05PT1BfV1NfTUFTSwkweDAwMGMwMDAwCisjZGVmaW5lIFBJQ1IyX0NGX1NOT09QX1dTXzBXUwkweDAwMDAwMDAwCisjZGVmaW5lIFBJQ1IyX0NGX1NOT09QX1dTXzFXUwkweDAwMDQwMDAwCisjZGVmaW5lIFBJQ1IyX0NGX1NOT09QX1dTXzJXUwkweDAwMDgwMDAwCisjZGVmaW5lIFBJQ1IyX0NGX1NOT09QX1dTXzNXUwkweDAwMGMwMDAwCisjZGVmaW5lIFBJQ1IyX0NGX0FQSEFTRV9XU19NQVNLIDB4MDAwMDAwMGMKKyNkZWZpbmUgUElDUjJfQ0ZfQVBIQVNFX1dTXzBXUwkweDAwMDAwMDAwCisjZGVmaW5lIFBJQ1IyX0NGX0FQSEFTRV9XU18xV1MJMHgwMDAwMDAwNAorI2RlZmluZSBQSUNSMl9DRl9BUEhBU0VfV1NfMldTCTB4MDAwMDAwMDgKKyNkZWZpbmUgUElDUjJfQ0ZfQVBIQVNFX1dTXzNXUwkweDAwMDAwMDBjCisKKyNkZWZpbmUgTUNDUjFfUk9NTkFMX1NISUZUCTI4CisjZGVmaW5lIE1DQ1IxX1JPTU5BTF9NU0sJMHhmMDAwMDAwMAorI2RlZmluZSBNQ0NSMV9ST01GQUxfU0hJRlQJMjMKKyNkZWZpbmUgTUNDUjFfUk9NRkFMX01TSwkweDBmODAwMDAwCisjZGVmaW5lIE1DQ1IxX0RCVVNfU0laRTAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgTUNDUjFfQlVSU1QJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTUNDUjFfTUVNR08JCTB4MDAwODAwMDAKKyNkZWZpbmUgTUNDUjFfU1JFTgkJMHgwMDA0MDAwMAorI2lmIGRlZmluZWQoQ09ORklHX01QQzgyNDApCisjZGVmaW5lIE1DQ1IxX1JBTV9UWVBFCQkweDAwMDIwMDAwCisjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4MjQ1KSB8fCBkZWZpbmVkKENPTkZJR19NUEM4MjQxKQorI2RlZmluZSBNQ0NSMV9TRFJBTV9FTgkJMHgwMDAyMDAwMAorI2Vsc2UKKyNlcnJvciBTcGVjaWZpYyB0eXBlIG9mIE1QQzgyNHggbXVzdCBiZSBkZWZpbmVkIChpLmUuIENPTkZJR19NUEM4MjQwKQorI2VuZGlmCisjZGVmaW5lIE1DQ1IxX1BDS0VOCQkweDAwMDEwMDAwCisjZGVmaW5lIE1DQ1IxX0JBTksxUk9XX1NISUZUCTIKKyNkZWZpbmUgTUNDUjFfQkFOSzJST1dfU0hJRlQJNAorI2RlZmluZSBNQ0NSMV9CQU5LM1JPV19TSElGVAk2CisjZGVmaW5lIE1DQ1IxX0JBTks0Uk9XX1NISUZUCTgKKyNkZWZpbmUgTUNDUjFfQkFOSzVST1dfU0hJRlQJMTAKKyNkZWZpbmUgTUNDUjFfQkFOSzZST1dfU0hJRlQJMTIKKyNkZWZpbmUgTUNDUjFfQkFOSzdST1dfU0hJRlQJMTQKKworI2RlZmluZSBNQ0NSMl9UU19XQUlUX1RJTUVSX01TSyAweGUwMDAwMDAwCisjZGVmaW5lIE1DQ1IyX1RTX1dBSVRfVElNRVJfU0hJRlQgMjkKKyNkZWZpbmUgTUNDUjJfQVNSSVNFX01TSwkweDFlMDAwMDAwCisjZGVmaW5lIE1DQ1IyX0FTUklTRV9TSElGVAkyNQorI2RlZmluZSBNQ0NSMl9BU0ZBTExfTVNLCTB4MDFlMDAwMDAKKyNkZWZpbmUgTUNDUjJfQVNGQUxMX1NISUZUCTIxCisKKyNkZWZpbmUgTUNDUjJfSU5MSU5FX1BBUl9OT1RfRUNDICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgTUNDUjJfV1JJVEVfUEFSSVRZX0NISwkweDAwMDgwMDAwCisjZGVmaW5lIE1DQ1IyX0lOTEZSRF9QQVJFQ0NfQ0hLX0VOICAweDAwMDQwMDAwCisjaWZkZWYgQ09ORklHX01QQzgyNDAKKyNkZWZpbmUgTUNDUjJfRUNDX0VOCQkweDAwMDIwMDAwCisjZGVmaW5lIE1DQ1IyX0VETwkJMHgwMDAxMDAwMAorI2VuZGlmCisjZGVmaW5lIE1DQ1IyX1JFRklOVF9NU0sJMHgwMDAwZmZmYworI2RlZmluZSBNQ0NSMl9SRUZJTlRfU0hJRlQJMgorI2RlZmluZSBNQ0NSMl9SU1ZfUEcJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUNDUjJfUE1XX1BBUgkJMHgwMDAwMDAwMQorCisjZGVmaW5lIE1DQ1IzX0JTVE9QUkUyVE81X01TSwkweGYwMDAwMDAwIC8qQlNUT1BSRVsyLTVdKi8KKyNkZWZpbmUgTUNDUjNfQlNUT1BSRTJUTzVfU0hJRlQgMjgKKyNkZWZpbmUgTUNDUjNfUkVGUkVDX01TSwkweDBmMDAwMDAwCisjZGVmaW5lIE1DQ1IzX1JFRlJFQ19TSElGVAkyNAorI2lmZGVmIENPTkZJR19NUEM4MjQwCisjZGVmaW5lIE1DQ1IzX1JETEFUX01TSwkJMHgwMGYwMDAwMAorI2RlZmluZSBNQ0NSM19SRExBVF9TSElGVAkyMAorI2RlZmluZSBNQ0NSM19DUFgJCTB4MDAwMTAwMDAKKyNkZWZpbmUgTUNDUjNfUkFTNlBfTVNLCQkweDAwMDc4MDAwCisjZGVmaW5lIE1DQ1IzX1JBUzZQX1NISUZUCTE1CisjZGVmaW5lIE1DQ1IzX0NBUzVfTVNLCQkweDAwMDA3MDAwCisjZGVmaW5lIE1DQ1IzX0NBUzVfU0hJRlQJMTIKKyNkZWZpbmUgTUNDUjNfQ1A0X01TSwkJMHgwMDAwMGUwMAorI2RlZmluZSBNQ0NSM19DUDRfU0hJRlQJCTkKKyNkZWZpbmUgTUNDUjNfQ0FTM19NU0sJCTB4MDAwMDAxYzAKKyNkZWZpbmUgTUNDUjNfQ0FTM19TSElGVAk2CisjZGVmaW5lIE1DQ1IzX1JDRDJfTVNLCQkweDAwMDAwMDM4CisjZGVmaW5lIE1DQ1IzX1JDRDJfU0hJRlQJMworI2RlZmluZSBNQ0NSM19SUDFfTVNLCQkweDAwMDAwMDA3CisjZGVmaW5lIE1DQ1IzX1JQMV9TSElGVAkJMAorI2VuZGlmCisKKyNkZWZpbmUgTUNDUjRfUFJFVE9BQ1RfTVNLCTB4ZjAwMDAwMDAKKyNkZWZpbmUgTUNDUjRfUFJFVE9BQ1RfU0hJRlQJMjgKKyNkZWZpbmUgTUNDUjRfQUNUVE9QUkVfTVNLCTB4MGYwMDAwMDAKKyNkZWZpbmUgTUNDUjRfQUNUVE9QUkVfU0hJRlQJMjQKKyNkZWZpbmUgTUNDUjRfV01PREUJCTB4MDA4MDAwMDAKKyNkZWZpbmUgTUNDUjRfSU5MSU5FCQkweDAwNDAwMDAwCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODI0MCkKKyNkZWZpbmUgTUNDUjRfQklUMjEJCTB4MDAyMDAwMDAgLyogdGhpcyBpbmNsdWRlIGNvcyBESU5LIGNvZGUgc2V0cyBpdC0gdW5rbm93biBmdW5jdGlvbiovCisjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4MjQ1KSB8fCBkZWZpbmVkKENPTkZJR19NUEM4MjQxKQorI2RlZmluZSBNQ0NSNF9FWFRST00JCTB4MDAyMDAwMDAgLyogZW5hYmxlcyBFeHRlbmRlZCBST00gc3BhY2UgKi8KKyNlbHNlCisjZXJyb3IgU3BlY2lmaWMgdHlwZSBvZiBNUEM4MjR4IG11c3QgYmUgZGVmaW5lZCAoaS5lLiBDT05GSUdfTVBDODI0MCkKKyNlbmRpZgorI2RlZmluZSBNQ0NSNF9SRUdJU1RFUkVECTB4MDAxMDAwMDAKKyNkZWZpbmUgTUNDUjRfQlNUT1BSRTBUTzFfTVNLCTB4MDAwYzAwMDAgLypCU1RPUFJFWzAtMV0qLworI2RlZmluZSBNQ0NSNF9CU1RPUFJFMFRPMV9TSElGVCAxOAorI2RlZmluZSBNQ0NSNF9SRUdESU1NCQkweDAwMDA4MDAwCisjZGVmaW5lIE1DQ1I0X1NETU9ERV9NU0sJMHgwMDAwN2YwMAorI2RlZmluZSBNQ0NSNF9TRE1PREVfU0hJRlQJOAorI2RlZmluZSBNQ0NSNF9BQ1RUT1JXX01TSwkweDAwMDAwMGYwCisjZGVmaW5lIE1DQ1I0X0FDVFRPUldfU0hJRlQJNAorI2RlZmluZSBNQ0NSNF9CU1RPUFJFNlRPOV9NU0sJMHgwMDAwMDAwZiAvKkJTVE9QUkVbNi05XSovCisjZGVmaW5lIE1DQ1I0X0JTVE9QUkU2VE85X1NISUZUIDAKKyNkZWZpbmUgTUNDUjRfREJVU19TSVpFMl9TSElGVAkxNworCisjZGVmaW5lIE1JQ1JfQUREUl9NQVNLCQkweDBmZjAwMDAwCisjZGVmaW5lIE1JQ1JfQUREUl9TSElGVAkJMjAKKyNkZWZpbmUgTUlDUl9FQUREUl9NQVNLCQkweDMwMDAwMDAwCisjZGVmaW5lIE1JQ1JfRUFERFJfU0hJRlQJMjgKKworI2RlZmluZSBCQVRVX0JFUElfTVNLCQkweGZmZmUwMDAwCisjZGVmaW5lIEJBVFVfQkxfTVNLCQkweDAwMDAxZmZjCisKKyNkZWZpbmUgQkFUVV9CTF8xMjhLCQkweDAwMDAwMDAwCisjZGVmaW5lIEJBVFVfQkxfMjU2SwkJMHgwMDAwMDAwNAorI2RlZmluZSBCQVRVX0JMXzUxMksJCTB4MDAwMDAwMGMKKyNkZWZpbmUgQkFUVV9CTF8xTQkJMHgwMDAwMDAxYworI2RlZmluZSBCQVRVX0JMXzJNCQkweDAwMDAwMDNjCisjZGVmaW5lIEJBVFVfQkxfNE0JCTB4MDAwMDAwN2MKKyNkZWZpbmUgQkFUVV9CTF84TQkJMHgwMDAwMDBmYworI2RlZmluZSBCQVRVX0JMXzE2TQkJMHgwMDAwMDFmYworI2RlZmluZSBCQVRVX0JMXzMyTQkJMHgwMDAwMDNmYworI2RlZmluZSBCQVRVX0JMXzY0TQkJMHgwMDAwMDdmYworI2RlZmluZSBCQVRVX0JMXzEyOE0JCTB4MDAwMDBmZmMKKyNkZWZpbmUgQkFUVV9CTF8yNTZNCQkweDAwMDAxZmZjCisKKyNkZWZpbmUgQkFUVV9WUwkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQkFUVV9WUAkJCTB4MDAwMDAwMDEKKworI2RlZmluZSBCQVRMX0JSUE5fTVNLCQkweGZmZmUwMDAwCisjZGVmaW5lIEJBVExfV0lNR19NU0sJCTB4MDAwMDAwNzgKKworI2RlZmluZSBCQVRMX1dSSVRFVEhST1VHSAkweDAwMDAwMDQwCisjZGVmaW5lIEJBVExfQ0FDSEVJTkhJQklUCTB4MDAwMDAwMjAKKyNkZWZpbmUgQkFUTF9NRU1DT0hFUkVOQ0UJMHgwMDAwMDAxMAorI2RlZmluZSBCQVRMX0dVQVJERURTVE9SQUdFCTB4MDAwMDAwMDgKKworI2RlZmluZSBCQVRMX1BQX01TSwkJMHgwMDAwMDAwMworI2RlZmluZSBCQVRMX1BQXzAwCQkweDAwMDAwMDAwIC8qIE5vIGFjY2VzcyAqLworI2RlZmluZSBCQVRMX1BQXzAxCQkweDAwMDAwMDAxIC8qIFJlYWQtb25seSAqLworI2RlZmluZSBCQVRMX1BQXzEwCQkweDAwMDAwMDAyIC8qIFJlYWQtd3JpdGUgKi8KKyNkZWZpbmUgQkFUTF9QUF8xMQkJMHgwMDAwMDAwMworCisvKgorICogSSdkIGF0dGVtcHQgdG8gZG8gZGVmaW5lcyBmb3IgdGhlIFBQIGJpdHMsIGJ1dCBpdCdzIHVzZSBpcyBhIGJpdAorICogdG9vIGNvbXBsZXgsIHNlZSB0aGUgUG93ZXJQQyBPcGVyYXRpbmcgRW52aXJvbm1lbnQgQXJjaGl0ZWN0dXJlCisgKiBzZWN0aW9uIGluIHRoZSBQb3dlclBjIGFyY2ggYm9vaywgY2hhcHRlciA0LgorICovCisKKy8qZXVtYiBhbmQgZXBpYyBjb25maWcqLworCisjZGVmaW5lIEVQSUNfRlBSCQkweDAwMDQxMDAwCisjZGVmaW5lIEVQSUNfR0NSCQkweDAwMDQxMDIwCisjZGVmaW5lIEVQSUNfRUlDUgkJMHgwMDA0MTAzMAorI2RlZmluZSBFUElDX0VWSQkJMHgwMDA0MTA4MAorI2RlZmluZSBFUElDX1BJCQkJMHgwMDA0MTA5MAorI2RlZmluZSBFUElDX1NWUgkJMHgwMDA0MTBFMAorI2RlZmluZSBFUElDX1RGUlIJCTB4MDAwNDEwRjAKKworLyoKKyAqIE5vdGUgdGhlIGluZm9ybWF0aW9uIGZvciB0aGVzZSBpcyByYXRoZXIgbWFuZ2xlZCBpbiB0aGUgODI0MCBtYW51YWwuCisgKiBUaGVzZSBhcmUgZ3Vlc3Nlcy4KKyAqLworCisjZGVmaW5lIEVQSUNfR1RDQ1IwCQkweDAwMDQxMTAwCisjZGVmaW5lIEVQSUNfR1RDQ1IxCQkweDAwMDQxMTQwCisjZGVmaW5lIEVQSUNfR1RDQ1IyCQkweDAwMDQxMTgwCisjZGVmaW5lIEVQSUNfR1RDQ1IzCQkweDAwMDQxMUMwCisjZGVmaW5lIEVQSUNfR1RCQ1IwCQkweDAwMDQxMTEwCisjZGVmaW5lIEVQSUNfR1RCQ1IxCQkweDAwMDQxMTUwCisjZGVmaW5lIEVQSUNfR1RCQ1IyCQkweDAwMDQxMTkwCisjZGVmaW5lIEVQSUNfR1RCQ1IzCQkweDAwMDQxMUQwCisjZGVmaW5lIEVQSUNfR1RWUFIwCQkweDAwMDQxMTIwCisjZGVmaW5lIEVQSUNfR1RWUFIxCQkweDAwMDQxMTYwCisjZGVmaW5lIEVQSUNfR1RWUFIyCQkweDAwMDQxMWEwCisjZGVmaW5lIEVQSUNfR1RWUFIzCQkweDAwMDQxMWUwCisjZGVmaW5lIEVQSUNfR1REUjAJCTB4MDAwNDExMzAKKyNkZWZpbmUgRVBJQ19HVERSMQkJMHgwMDA0MTE3MAorI2RlZmluZSBFUElDX0dURFIyCQkweDAwMDQxMWIwCisjZGVmaW5lIEVQSUNfR1REUjMJCTB4MDAwNDExZjAKKworI2RlZmluZSBFUElDX0lWUFIwCQkweDAwMDUwMjAwCisjZGVmaW5lIEVQSUNfSVZQUjEJCTB4MDAwNTAyMjAKKyNkZWZpbmUgRVBJQ19JVlBSMgkJMHgwMDA1MDI0MAorI2RlZmluZSBFUElDX0lWUFIzCQkweDAwMDUwMjYwCisjZGVmaW5lIEVQSUNfSVZQUjQJCTB4MDAwNTAyODAKKworI2RlZmluZSBFUElDX1NWUFIwCQkweDAwMDUwMjAwCisjZGVmaW5lIEVQSUNfU1ZQUjEJCTB4MDAwNTAyMjAKKyNkZWZpbmUgRVBJQ19TVlBSMgkJMHgwMDA1MDI0MAorI2RlZmluZSBFUElDX1NWUFIzCQkweDAwMDUwMjYwCisjZGVmaW5lIEVQSUNfU1ZQUjQJCTB4MDAwNTAyODAKKyNkZWZpbmUgRVBJQ19TVlBSNQkJMHgwMDA1MDJBMAorI2RlZmluZSBFUElDX1NWUFI2CQkweDAwMDUwMkMwCisjZGVmaW5lIEVQSUNfU1ZQUjcJCTB4MDAwNTAyRTAKKyNkZWZpbmUgRVBJQ19TVlBSOAkJMHgwMDA1MDMwMAorI2RlZmluZSBFUElDX1NWUFI5CQkweDAwMDUwMzIwCisjZGVmaW5lIEVQSUNfU1ZQUmEJCTB4MDAwNTAzNDAKKyNkZWZpbmUgRVBJQ19TVlBSYgkJMHgwMDA1MDM2MAorI2RlZmluZSBFUElDX1NWUFJjCQkweDAwMDUwMzgwCisjZGVmaW5lIEVQSUNfU1ZQUmQJCTB4MDAwNTAzQTAKKyNkZWZpbmUgRVBJQ19TVlBSZQkJMHgwMDA1MDNDMAorI2RlZmluZSBFUElDX1NWUFJmCQkweDAwMDUwM0UwCisKKy8qIE1QQzgyNDAgQnl0ZSBTd2FwL1BDSSBTdXBwb3J0IE1hY3JvcyAqLworI2RlZmluZSBCWVRFX1NXQVBfMTZfQklUKHgpICAgICggKCgoeCkgJiAweDAwZmYpIDw8IDgpIHwgKCAoeCkgPj4gOCkgKQorI2RlZmluZSBMT05HU1dBUCh4KSAoKCgoeCkgJiAweDAwMDAwMGZmKSA8PCAyNCkgfCAoKCh4KSAmIDB4MDAwMGZmMDApIDw8IDgpfFwKKwkJICAgICAoKCh4KSAmIDB4MDBmZjAwMDApID4+ICA4KSB8ICgoKHgpICYgMHhmZjAwMDAwMCkgPj4gMjQpICkKKyNkZWZpbmUgUENJU1dBUCh4KSAgIExPTkdTV0FQKHgpCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qCisgKiBNUEMxMDcgU3VwcG9ydAorICoKKyAqLwordW5zaWduZWQgaW50IG1wYzgyNHhfbXBjMTA3X2dldHJlZyh1bnNpZ25lZCBpbnQgcmVnTnVtKTsKK3ZvaWQgbXBjODI0eF9tcGMxMDdfc2V0cmVnKHVuc2lnbmVkIGludCByZWdOdW0sIHVuc2lnbmVkIGludCByZWdWYWwpOwordm9pZCBtcGM4MjR4X21wYzEwN193cml0ZTgodW5zaWduZWQgaW50IGFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgZGF0YSk7Cit2b2lkIG1wYzgyNHhfbXBjMTA3X3dyaXRlMTYodW5zaWduZWQgaW50IGFkZHJlc3MsIHVuc2lnbmVkIHNob3J0IGRhdGEpOwordm9pZCBtcGM4MjR4X21wYzEwN193cml0ZTMyKHVuc2lnbmVkIGludCBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgZGF0YSk7Cit1bnNpZ25lZCBjaGFyIG1wYzgyNHhfbXBjMTA3X3JlYWQ4KHVuc2lnbmVkIGludCBhZGRyZXNzKTsKK3Vuc2lnbmVkIHNob3J0IG1wYzgyNHhfbXBjMTA3X3JlYWQxNih1bnNpZ25lZCBpbnQgYWRkcmVzcyk7Cit1bnNpZ25lZCBpbnQgbXBjODI0eF9tcGMxMDdfcmVhZDMyKHVuc2lnbmVkIGludCBhZGRyZXNzKTsKK3Vuc2lnbmVkIGludCBtcGM4MjR4X2V1bW1iYXJfcmVhZCh1bnNpZ25lZCBpbnQgcmVnTnVtKTsKK3ZvaWQgbXBjODI0eF9ldW1tYmFyX3dyaXRlKHVuc2lnbmVkIGludCByZWdOdW0sIHVuc2lnbmVkIGludCByZWdWYWwpOworCisjaWZkZWYgQ09ORklHX1BDSQorc3RydWN0IHBjaV9jb250cm9sbGVyOwordm9pZCBwY2lfY3BtODI0eF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX19NUEM4MjRYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY2kuaCBiL2luY2x1ZGUvcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3NTM3NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcGNpLmgKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEgU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBBbmRyZWFzIEhlcHBlbCA8YWhlcHBlbEBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9vbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX1BDSV9ICisjZGVmaW5lIF9QQ0lfSAorCisvKgorICogVW5kZXIgUENJLCBlYWNoIGRldmljZSBoYXMgMjU2IGJ5dGVzIG9mIGNvbmZpZ3VyYXRpb24gYWRkcmVzcyBzcGFjZSwKKyAqIG9mIHdoaWNoIHRoZSBmaXJzdCA2NCBieXRlcyBhcmUgc3RhbmRhcmRpemVkIGFzIGZvbGxvd3M6CisgKi8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRAkJMHgwMAkvKiAxNiBiaXRzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSUQJCTB4MDIJLyogMTYgYml0cyAqLworI2RlZmluZSBQQ0lfQ09NTUFORAkJMHgwNAkvKiAxNiBiaXRzICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9JTwkJMHgxCS8qIEVuYWJsZSByZXNwb25zZSBpbiBJL08gc3BhY2UgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX01FTU9SWQkweDIJLyogRW5hYmxlIHJlc3BvbnNlIGluIE1lbW9yeSBzcGFjZSAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfTUFTVEVSCTB4NAkvKiBFbmFibGUgYnVzIG1hc3RlcmluZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfU1BFQ0lBTAkweDgJLyogRW5hYmxlIHJlc3BvbnNlIHRvIHNwZWNpYWwgY3ljbGVzICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9JTlZBTElEQVRFIDB4MTAJLyogVXNlIG1lbW9yeSB3cml0ZSBhbmQgaW52YWxpZGF0ZSAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfVkdBX1BBTEVUVEUgMHgyMAkvKiBFbmFibGUgcGFsZXR0ZSBzbm9vcGluZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfUEFSSVRZCTB4NDAJLyogRW5hYmxlIHBhcml0eSBjaGVja2luZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfV0FJVAkweDgwCS8qIEVuYWJsZSBhZGRyZXNzL2RhdGEgc3RlcHBpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1NFUlIJMHgxMDAJLyogRW5hYmxlIFNFUlIgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX0ZBU1RfQkFDSwkweDIwMAkvKiBFbmFibGUgYmFjay10by1iYWNrIHdyaXRlcyAqLworCisjZGVmaW5lIFBDSV9TVEFUVVMJCTB4MDYJLyogMTYgYml0cyAqLworI2RlZmluZSAgUENJX1NUQVRVU19DQVBfTElTVAkweDEwCS8qIFN1cHBvcnQgQ2FwYWJpbGl0eSBMaXN0ICovCisjZGVmaW5lICBQQ0lfU1RBVFVTXzY2TUhaCTB4MjAJLyogU3VwcG9ydCA2NiBNaHogUENJIDIuMSBidXMgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfVURGCQkweDQwCS8qIFN1cHBvcnQgVXNlciBEZWZpbmFibGUgRmVhdHVyZXMgW29ic29sZXRlXSAqLworI2RlZmluZSAgUENJX1NUQVRVU19GQVNUX0JBQ0sJMHg4MAkvKiBBY2NlcHQgZmFzdC1iYWNrIHRvIGJhY2sgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUEFSSVRZCTB4MTAwCS8qIERldGVjdGVkIHBhcml0eSBlcnJvciAqLworI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfTUFTSyAweDYwMAkvKiBERVZTRUwgdGltaW5nICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9GQVNUIDB4MDAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9NRURJVU0gMHgyMDAKKyNkZWZpbmUgIFBDSV9TVEFUVVNfREVWU0VMX1NMT1cgMHg0MDAKKyNkZWZpbmUgIFBDSV9TVEFUVVNfU0lHX1RBUkdFVF9BQk9SVCAweDgwMCAvKiBTZXQgb24gdGFyZ2V0IGFib3J0ICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX1JFQ19UQVJHRVRfQUJPUlQgMHgxMDAwIC8qIE1hc3RlciBhY2sgb2YgIiAqLworI2RlZmluZSAgUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUIDB4MjAwMCAvKiBTZXQgb24gbWFzdGVyIGFib3J0ICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IgMHg0MDAwIC8qIFNldCB3aGVuIHdlIGRyaXZlIFNFUlIgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfREVURUNURURfUEFSSVRZIDB4ODAwMCAvKiBTZXQgb24gcGFyaXR5IGVycm9yICovCisKKyNkZWZpbmUgUENJX0NMQVNTX1JFVklTSU9OCTB4MDgJLyogSGlnaCAyNCBiaXRzIGFyZSBjbGFzcywgbG93IDgKKwkJCQkJICAgcmV2aXNpb24gKi8KKyNkZWZpbmUgUENJX1JFVklTSU9OX0lECQkweDA4CS8qIFJldmlzaW9uIElEICovCisjZGVmaW5lIFBDSV9DTEFTU19QUk9HCQkweDA5CS8qIFJlZy4gTGV2ZWwgUHJvZ3JhbW1pbmcgSW50ZXJmYWNlICovCisjZGVmaW5lIFBDSV9DTEFTU19ERVZJQ0UJMHgwYQkvKiBEZXZpY2UgY2xhc3MgKi8KKyNkZWZpbmUgUENJX0NMQVNTX0NPREUJCTB4MGIJLyogRGV2aWNlIGNsYXNzIGNvZGUgKi8KKyNkZWZpbmUgUENJX0NMQVNTX1NVQl9DT0RFCTB4MGEJLyogRGV2aWNlIHN1Yi1jbGFzcyBjb2RlICovCisKKyNkZWZpbmUgUENJX0NBQ0hFX0xJTkVfU0laRQkweDBjCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfTEFURU5DWV9USU1FUgkweDBkCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfSEVBREVSX1RZUEUJCTB4MGUJLyogOCBiaXRzICovCisjZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfTk9STUFMIDAKKyNkZWZpbmUgIFBDSV9IRUFERVJfVFlQRV9CUklER0UgMQorI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0NBUkRCVVMgMgorCisjZGVmaW5lIFBDSV9CSVNUCQkweDBmCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfQklTVF9DT0RFX01BU0sJMHgwZgkvKiBSZXR1cm4gcmVzdWx0ICovCisjZGVmaW5lIFBDSV9CSVNUX1NUQVJUCQkweDQwCS8qIDEgdG8gc3RhcnQgQklTVCwgMiBzZWNzIG9yIGxlc3MgKi8KKyNkZWZpbmUgUENJX0JJU1RfQ0FQQUJMRQkweDgwCS8qIDEgaWYgQklTVCBjYXBhYmxlICovCisKKy8qCisgKiBCYXNlIGFkZHJlc3NlcyBzcGVjaWZ5IGxvY2F0aW9ucyBpbiBtZW1vcnkgb3IgSS9PIHNwYWNlLgorICogRGVjb2RlZCBzaXplIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHdyaXRpbmcgYSB2YWx1ZSBvZgorICogMHhmZmZmZmZmZiB0byB0aGUgcmVnaXN0ZXIsIGFuZCByZWFkaW5nIGl0IGJhY2suICBPbmx5CisgKiAxIGJpdHMgYXJlIGRlY29kZWQuCisgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18wCTB4MTAJLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzEJMHgxNAkvKiAzMiBiaXRzIFtodHlwZSAwLDEgb25seV0gKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18yCTB4MTgJLyogMzIgYml0cyBbaHR5cGUgMCBvbmx5XSAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzMJMHgxYwkvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfNAkweDIwCS8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU181CTB4MjQJLyogMzIgYml0cyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRSAweDAxCS8qIDAgPSBtZW1vcnksIDEgPSBJL08gKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8gMHgwMQorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkgMHgwMAorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV9NQVNLIDB4MDYKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMzIJMHgwMAkvKiAzMiBiaXQgYWRkcmVzcyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV8xTQkweDAyCS8qIEJlbG93IDFNIFtvYnNvbGV0ZV0gKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQJMHgwNAkvKiA2NCBiaXQgYWRkcmVzcyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fUFJFRkVUQ0gJMHgwOAkvKiBwcmVmZXRjaGFibGU/ICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLCSh+MHgwZlVMKQorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19JT19NQVNLCSh+MHgwM1VMKQorLyogYml0IDEgaXMgcmVzZXJ2ZWQgaWYgYWRkcmVzc19zcGFjZSA9IDEgKi8KKworLyogSGVhZGVyIHR5cGUgMCAobm9ybWFsIGRldmljZXMpICovCisjZGVmaW5lIFBDSV9DQVJEQlVTX0NJUwkJMHgyOAorI2RlZmluZSBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCAweDJjCisjZGVmaW5lIFBDSV9TVUJTWVNURU1fSUQJMHgyZQorI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MJCTB4MzAJLyogQml0cyAzMS4uMTEgYXJlIGFkZHJlc3MsIDEwLi4xIHJlc2VydmVkICovCisjZGVmaW5lICBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFIDB4MDEKKyNkZWZpbmUgUENJX1JPTV9BRERSRVNTX01BU0sJKH4weDdmZlVMKQorCisjZGVmaW5lIFBDSV9DQVBBQklMSVRZX0xJU1QJMHgzNAkvKiBPZmZzZXQgb2YgZmlyc3QgY2FwYWJpbGl0eSBsaXN0IGVudHJ5ICovCisKKy8qIDB4MzUtMHgzYiBhcmUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0lOVEVSUlVQVF9MSU5FCTB4M2MJLyogOCBiaXRzICovCisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfUElOCTB4M2QJLyogOCBiaXRzICovCisjZGVmaW5lIFBDSV9NSU5fR05UCQkweDNlCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfTUFYX0xBVAkJMHgzZgkvKiA4IGJpdHMgKi8KKworLyogSGVhZGVyIHR5cGUgMSAoUENJLXRvLVBDSSBicmlkZ2VzKSAqLworI2RlZmluZSBQQ0lfUFJJTUFSWV9CVVMJCTB4MTgJLyogUHJpbWFyeSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9TRUNPTkRBUllfQlVTCTB4MTkJLyogU2Vjb25kYXJ5IGJ1cyBudW1iZXIgKi8KKyNkZWZpbmUgUENJX1NVQk9SRElOQVRFX0JVUwkweDFhCS8qIEhpZ2hlc3QgYnVzIG51bWJlciBiZWhpbmQgdGhlIGJyaWRnZSAqLworI2RlZmluZSBQQ0lfU0VDX0xBVEVOQ1lfVElNRVIJMHgxYgkvKiBMYXRlbmN5IHRpbWVyIGZvciBzZWNvbmRhcnkgaW50ZXJmYWNlICovCisjZGVmaW5lIFBDSV9JT19CQVNFCQkweDFjCS8qIEkvTyByYW5nZSBiZWhpbmQgdGhlIGJyaWRnZSAqLworI2RlZmluZSBQQ0lfSU9fTElNSVQJCTB4MWQKKyNkZWZpbmUgIFBDSV9JT19SQU5HRV9UWVBFX01BU0sgMHgwZgkvKiBJL08gYnJpZGdpbmcgdHlwZSAqLworI2RlZmluZSAgUENJX0lPX1JBTkdFX1RZUEVfMTYJMHgwMAorI2RlZmluZSAgUENJX0lPX1JBTkdFX1RZUEVfMzIJMHgwMQorI2RlZmluZSAgUENJX0lPX1JBTkdFX01BU0sJfjB4MGYKKyNkZWZpbmUgUENJX1NFQ19TVEFUVVMJCTB4MWUJLyogU2Vjb25kYXJ5IHN0YXR1cyByZWdpc3Rlciwgb25seSBiaXQgMTQgdXNlZCAqLworI2RlZmluZSBQQ0lfTUVNT1JZX0JBU0UJCTB4MjAJLyogTWVtb3J5IHJhbmdlIGJlaGluZCAqLworI2RlZmluZSBQQ0lfTUVNT1JZX0xJTUlUCTB4MjIKKyNkZWZpbmUgIFBDSV9NRU1PUllfUkFOR0VfVFlQRV9NQVNLIDB4MGYKKyNkZWZpbmUgIFBDSV9NRU1PUllfUkFOR0VfTUFTSwl+MHgwZgorI2RlZmluZSBQQ0lfUFJFRl9NRU1PUllfQkFTRQkweDI0CS8qIFByZWZldGNoYWJsZSBtZW1vcnkgcmFuZ2UgYmVoaW5kICovCisjZGVmaW5lIFBDSV9QUkVGX01FTU9SWV9MSU1JVAkweDI2CisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFX01BU0sgMHgwZgorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV8zMiAweDAwCisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFXzY0IDB4MDEKKyNkZWZpbmUgIFBDSV9QUkVGX1JBTkdFX01BU0sJfjB4MGYKKyNkZWZpbmUgUENJX1BSRUZfQkFTRV9VUFBFUjMyCTB4MjgJLyogVXBwZXIgaGFsZiBvZiBwcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlICovCisjZGVmaW5lIFBDSV9QUkVGX0xJTUlUX1VQUEVSMzIJMHgyYworI2RlZmluZSBQQ0lfSU9fQkFTRV9VUFBFUjE2CTB4MzAJLyogVXBwZXIgaGFsZiBvZiBJL08gYWRkcmVzc2VzICovCisjZGVmaW5lIFBDSV9JT19MSU1JVF9VUFBFUjE2CTB4MzIKKy8qIDB4MzQgc2FtZSBhcyBmb3IgaHR5cGUgMCAqLworLyogMHgzNS0weDNiIGlzIHJlc2VydmVkICovCisjZGVmaW5lIFBDSV9ST01fQUREUkVTUzEJMHgzOAkvKiBTYW1lIGFzIFBDSV9ST01fQUREUkVTUywgYnV0IGZvciBodHlwZSAxICovCisvKiAweDNjLTB4M2QgYXJlIHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKyNkZWZpbmUgUENJX0JSSURHRV9DT05UUk9MCTB4M2UKKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1BBUklUWQkweDAxCS8qIEVuYWJsZSBwYXJpdHkgZGV0ZWN0aW9uIG9uIHNlY29uZGFyeSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1NFUlIJMHgwMgkvKiBUaGUgc2FtZSBmb3IgU0VSUiBmb3J3YXJkaW5nICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9OT19JU0EJMHgwNAkvKiBEaXNhYmxlIGJyaWRnaW5nIG9mIElTQSBwb3J0cyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfVkdBCTB4MDgJLyogRm9yd2FyZCBWR0EgYWRkcmVzc2VzICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9NQVNURVJfQUJPUlQgMHgyMCAgLyogUmVwb3J0IG1hc3RlciBhYm9ydHMgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX0JVU19SRVNFVCAweDQwCS8qIFNlY29uZGFyeSBidXMgcmVzZXQgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX0ZBU1RfQkFDSyAweDgwCS8qIEZhc3QgQmFjazJCYWNrIGVuYWJsZWQgb24gc2Vjb25kYXJ5IGludGVyZmFjZSAqLworCisvKiBIZWFkZXIgdHlwZSAyIChDYXJkQnVzIGJyaWRnZXMpICovCisjZGVmaW5lIFBDSV9DQl9DQVBBQklMSVRZX0xJU1QJMHgxNAorLyogMHgxNSByZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfQ0JfU0VDX1NUQVRVUwkweDE2CS8qIFNlY29uZGFyeSBzdGF0dXMgKi8KKyNkZWZpbmUgUENJX0NCX1BSSU1BUllfQlVTCTB4MTgJLyogUENJIGJ1cyBudW1iZXIgKi8KKyNkZWZpbmUgUENJX0NCX0NBUkRfQlVTCQkweDE5CS8qIENhcmRCdXMgYnVzIG51bWJlciAqLworI2RlZmluZSBQQ0lfQ0JfU1VCT1JESU5BVEVfQlVTCTB4MWEJLyogU3Vib3JkaW5hdGUgYnVzIG51bWJlciAqLworI2RlZmluZSBQQ0lfQ0JfTEFURU5DWV9USU1FUgkweDFiCS8qIENhcmRCdXMgbGF0ZW5jeSB0aW1lciAqLworI2RlZmluZSBQQ0lfQ0JfTUVNT1JZX0JBU0VfMAkweDFjCisjZGVmaW5lIFBDSV9DQl9NRU1PUllfTElNSVRfMAkweDIwCisjZGVmaW5lIFBDSV9DQl9NRU1PUllfQkFTRV8xCTB4MjQKKyNkZWZpbmUgUENJX0NCX01FTU9SWV9MSU1JVF8xCTB4MjgKKyNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMAkweDJjCisjZGVmaW5lIFBDSV9DQl9JT19CQVNFXzBfSEkJMHgyZQorI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMAkweDMwCisjZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8wX0hJCTB4MzIKKyNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMQkweDM0CisjZGVmaW5lIFBDSV9DQl9JT19CQVNFXzFfSEkJMHgzNgorI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMQkweDM4CisjZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8xX0hJCTB4M2EKKyNkZWZpbmUgIFBDSV9DQl9JT19SQU5HRV9NQVNLCX4weDAzCisvKiAweDNjLTB4M2QgYXJlIHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKyNkZWZpbmUgUENJX0NCX0JSSURHRV9DT05UUk9MCTB4M2UKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1BBUklUWQkweDAxCS8qIFNpbWlsYXIgdG8gc3RhbmRhcmQgYnJpZGdlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1NFUlIJCTB4MDIKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX0lTQQkJMHgwNAorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfVkdBCQkweDA4CisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9NQVNURVJfQUJPUlQgMHgyMAorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfQ0JfUkVTRVQJMHg0MAkvKiBDYXJkQnVzIHJlc2V0ICovCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF8xNkJJVF9JTlQJMHg4MAkvKiBFbmFibGUgaW50ZXJydXB0IGZvciAxNi1iaXQgY2FyZHMgKi8KKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1BSRUZFVENIX01FTTAgMHgxMDAJLyogUHJlZmV0Y2ggZW5hYmxlIGZvciBib3RoIG1lbW9yeSByZWdpb25zICovCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QUkVGRVRDSF9NRU0xIDB4MjAwCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QT1NUX1dSSVRFUwkweDQwMAorI2RlZmluZSBQQ0lfQ0JfU1VCU1lTVEVNX1ZFTkRPUl9JRCAweDQwCisjZGVmaW5lIFBDSV9DQl9TVUJTWVNURU1fSUQJMHg0MgorI2RlZmluZSBQQ0lfQ0JfTEVHQUNZX01PREVfQkFTRSAweDQ0CS8qIDE2LWJpdCBQQyBDYXJkIGxlZ2FjeSBtb2RlIGJhc2UgYWRkcmVzcyAoRXhDYSkgKi8KKy8qIDB4NDgtMHg3ZiByZXNlcnZlZCAqLworCisvKiBDYXBhYmlsaXR5IGxpc3RzICovCisKKyNkZWZpbmUgUENJX0NBUF9MSVNUX0lECQkwCS8qIENhcGFiaWxpdHkgSUQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfUE0JCTB4MDEJLyogUG93ZXIgTWFuYWdlbWVudCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9BR1AJCTB4MDIJLyogQWNjZWxlcmF0ZWQgR3JhcGhpY3MgUG9ydCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9WUEQJCTB4MDMJLyogVml0YWwgUHJvZHVjdCBEYXRhICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1NMT1RJRAkweDA0CS8qIFNsb3QgSWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfTVNJCQkweDA1CS8qIE1lc3NhZ2UgU2lnbmFsbGVkIEludGVycnVwdHMgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfQ0hTV1AJMHgwNgkvKiBDb21wYWN0UENJIEhvdFN3YXAgKi8KKyNkZWZpbmUgUENJX0NBUF9MSVNUX05FWFQJMQkvKiBOZXh0IGNhcGFiaWxpdHkgaW4gdGhlIGxpc3QgKi8KKyNkZWZpbmUgUENJX0NBUF9GTEFHUwkJMgkvKiBDYXBhYmlsaXR5IGRlZmluZWQgZmxhZ3MgKDE2IGJpdHMpICovCisjZGVmaW5lIFBDSV9DQVBfU0laRU9GCQk0CisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgIFBDSV9QTV9DQVBfVkVSX01BU0sJMHgwMDA3CS8qIFZlcnNpb24gKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0NMT0NLCTB4MDAwOAkvKiBQTUUgY2xvY2sgcmVxdWlyZWQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfQVVYX1BPV0VSCTB4MDAxMAkvKiBBdXhpbGxpYXJ5IHBvd2VyIHN1cHBvcnQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfRFNJCQkweDAwMjAJLyogRGV2aWNlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0QxCQkweDAyMDAJLyogRDEgcG93ZXIgc3RhdGUgc3VwcG9ydCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9EMgkJMHgwNDAwCS8qIEQyIHBvd2VyIHN0YXRlIHN1cHBvcnQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FCQkweDA4MDAJLyogUE1FIHBpbiBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUENJX1BNX0NUUkwJCTQJLyogUE0gY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9TVEFURV9NQVNLIDB4MDAwMwkvKiBDdXJyZW50IHBvd2VyIHN0YXRlIChEMCB0byBEMykgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX1BNRV9FTkFCTEUgMHgwMTAwCS8qIFBNRSBwaW4gZW5hYmxlICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9EQVRBX1NFTF9NQVNLCTB4MWUwMAkvKiBEYXRhIHNlbGVjdCAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9EQVRBX1NDQUxFX01BU0sJMHg2MDAwCS8qIERhdGEgc2NhbGUgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfUE1FX1NUQVRVUyAweDgwMDAJLyogUE1FIHBpbiBzdGF0dXMgKi8KKyNkZWZpbmUgUENJX1BNX1BQQl9FWFRFTlNJT05TCTYJLyogUFBCIHN1cHBvcnQgZXh0ZW5zaW9ucyAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fUFBCX0IyX0IzCTB4NDAJLyogU3RvcCBjbG9jayB3aGVuIGluIEQzaG90ICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9CUENDX0VOQUJMRQkweDgwCS8qIEJ1cyBwb3dlci9jbG9jayBjb250cm9sIGVuYWJsZSAoPz8pICovCisjZGVmaW5lIFBDSV9QTV9EQVRBX1JFR0lTVEVSCTcJLyogKD8/KSAqLworI2RlZmluZSBQQ0lfUE1fU0laRU9GCQk4CisKKy8qIEFHUCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfQUdQX1ZFUlNJT04JCTIJLyogQkNEIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIFBDSV9BR1BfUkZVCQkzCS8qIFJlc3Qgb2YgY2FwYWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBQQ0lfQUdQX1NUQVRVUwkJNAkvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JRX01BU0sgMHhmZjAwMDAwMAkvKiBNYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyAtIDEgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1NCQQkweDAyMDAJLyogU2lkZWJhbmQgYWRkcmVzc2luZyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTXzY0QklUCTB4MDAyMAkvKiA2NC1iaXQgYWRkcmVzc2luZyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX0ZXCTB4MDAxMAkvKiBGVyB0cmFuc2ZlcnMgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SQVRFNAkweDAwMDQJLyogNHggdHJhbnNmZXIgcmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JBVEUyCTB4MDAwMgkvKiAyeCB0cmFuc2ZlciByYXRlIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUkFURTEJMHgwMDAxCS8qIDF4IHRyYW5zZmVyIHJhdGUgc3VwcG9ydGVkICovCisjZGVmaW5lIFBDSV9BR1BfQ09NTUFORAkJOAkvKiBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUlFfTUFTSyAweGZmMDAwMDAwICAvKiBNYXN0ZXI6IE1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfU0JBCTB4MDIwMAkvKiBTaWRlYmFuZCBhZGRyZXNzaW5nIGVuYWJsZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9BR1AJMHgwMTAwCS8qIEFsbG93IHByb2Nlc3Npbmcgb2YgQUdQIHRyYW5zYWN0aW9ucyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EXzY0QklUCTB4MDAyMAkvKiBBbGxvdyBwcm9jZXNzaW5nIG9mIDY0LWJpdCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9GVwkweDAwMTAJLyogRm9yY2UgRlcgdHJhbnNmZXJzICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTQJMHgwMDA0CS8qIFVzZSA0eCByYXRlICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTIJMHgwMDAyCS8qIFVzZSA0eCByYXRlICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTEJMHgwMDAxCS8qIFVzZSA0eCByYXRlICovCisjZGVmaW5lIFBDSV9BR1BfU0laRU9GCQkxMgorCisvKiBTbG90IElkZW50aWZpY2F0aW9uICovCisKKyNkZWZpbmUgUENJX1NJRF9FU1IJCTIJLyogRXhwYW5zaW9uIFNsb3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9TSURfRVNSX05TTE9UUwkweDFmCS8qIE51bWJlciBvZiBleHBhbnNpb24gc2xvdHMgYXZhaWxhYmxlICovCisjZGVmaW5lICBQQ0lfU0lEX0VTUl9GSUMJMHgyMAkvKiBGaXJzdCBJbiBDaGFzc2lzIEZsYWcgKi8KKyNkZWZpbmUgUENJX1NJRF9DSEFTU0lTX05SCTMJLyogQ2hhc3NpcyBOdW1iZXIgKi8KKworLyogTWVzc2FnZSBTaWduYWxsZWQgSW50ZXJydXB0cyByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfTVNJX0ZMQUdTCQkyCS8qIFZhcmlvdXMgZmxhZ3MgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfNjRCSVQJMHg4MAkvKiA2NC1iaXQgYWRkcmVzc2VzIGFsbG93ZWQgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfUVNJWkUJMHg3MAkvKiBNZXNzYWdlIHF1ZXVlIHNpemUgY29uZmlndXJlZCAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU19RTUFTSwkweDBlCS8qIE1heGltdW0gcXVldWUgc2l6ZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfRU5BQkxFCTB4MDEJLyogTVNJIGZlYXR1cmUgZW5hYmxlZCAqLworI2RlZmluZSBQQ0lfTVNJX1JGVQkJMwkvKiBSZXN0IG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgUENJX01TSV9BRERSRVNTX0xPCTQJLyogTG93ZXIgMzIgYml0cyAqLworI2RlZmluZSBQQ0lfTVNJX0FERFJFU1NfSEkJOAkvKiBVcHBlciAzMiBiaXRzIChpZiBQQ0lfTVNJX0ZMQUdTXzY0QklUIHNldCkgKi8KKyNkZWZpbmUgUENJX01TSV9EQVRBXzMyCQk4CS8qIDE2IGJpdHMgb2YgZGF0YSBmb3IgMzItYml0IGRldmljZXMgKi8KKyNkZWZpbmUgUENJX01TSV9EQVRBXzY0CQkxMgkvKiAxNiBiaXRzIG9mIGRhdGEgZm9yIDY0LWJpdCBkZXZpY2VzICovCisKKyNkZWZpbmUgUENJX01BWF9QQ0lfREVWSUNFUwkzMgorI2RlZmluZSBQQ0lfTUFYX1BDSV9GVU5DVElPTlMJOAorCisvKiBJbmNsdWRlIHRoZSBJRCBsaXN0ICovCisKKyNpbmNsdWRlIDxwY2lfaWRzLmg+CisKK3N0cnVjdCBwY2lfcmVnaW9uIHsKKwl1bnNpZ25lZCBsb25nIGJ1c19zdGFydDsJCS8qIFN0YXJ0IG9uIHRoZSBidXMgKi8KKwl1bnNpZ25lZCBsb25nIHBoeXNfc3RhcnQ7CQkvKiBTdGFydCBpbiBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlICovCisJdW5zaWduZWQgbG9uZyBzaXplOwkJCS8qIFNpemUgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCS8qIFJlc291cmNlIGZsYWdzICovCisKKwl1bnNpZ25lZCBsb25nIGJ1c19sb3dlcjsKK307CisKKyNkZWZpbmUgUENJX1JFR0lPTl9NRU0JCTB4MDAwMDAwMDAJLyogUENJIG1lbW9yeSBzcGFjZSAqLworI2RlZmluZSBQQ0lfUkVHSU9OX0lPCQkweDAwMDAwMDAxCS8qIFBDSSBJTyBzcGFjZSAqLworI2RlZmluZSBQQ0lfUkVHSU9OX1RZUEUJCTB4MDAwMDAwMDEKKworI2RlZmluZSBQQ0lfUkVHSU9OX01FTU9SWQkweDAwMDAwMTAwCS8qIFN5c3RlbSBtZW1vcnkgKi8KKyNkZWZpbmUgUENJX1JFR0lPTl9STwkJMHgwMDAwMDIwMAkvKiBSZWFkLW9ubHkgbWVtb3J5ICovCisKK2V4dGVybiBfX2lubGluZV9fIHZvaWQgcGNpX3NldF9yZWdpb24oc3RydWN0IHBjaV9yZWdpb24gKnJlZywKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJ1c19zdGFydCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHBoeXNfc3RhcnQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpIHsKKwlyZWctPmJ1c19zdGFydAk9IGJ1c19zdGFydDsKKwlyZWctPnBoeXNfc3RhcnQgPSBwaHlzX3N0YXJ0OworCXJlZy0+c2l6ZQk9IHNpemU7CisJcmVnLT5mbGFncwk9IGZsYWdzOworfQorCit0eXBlZGVmIGludCBwY2lfZGV2X3Q7CisKKyNkZWZpbmUgUENJX0JVUyhkKQkoKChkKSA+PiAxNikgJiAweGZmKQorI2RlZmluZSBQQ0lfREVWKGQpCSgoKGQpID4+IDExKSAmIDB4MWYpCisjZGVmaW5lIFBDSV9GVU5DKGQpCSgoKGQpID4+IDgpICYgMHg3KQorI2RlZmluZSBQQ0lfQkRGKGIsZCxmKQkoKGIpIDw8IDE2IHwgKGQpIDw8IDExIHwgKGYpIDw8IDgpCisKKyNkZWZpbmUgUENJX0FOWV9JRCAofjApCisKK3N0cnVjdCBwY2lfZGV2aWNlX2lkIHsKKwl1bnNpZ25lZCBpbnQgdmVuZG9yLCBkZXZpY2U7CQkvKiBWZW5kb3IgYW5kIGRldmljZSBJRCBvciBQQ0lfQU5ZX0lEICovCit9OworCitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXI7CisKK3N0cnVjdCBwY2lfY29uZmlnX3RhYmxlIHsKKwl1bnNpZ25lZCBpbnQgdmVuZG9yLCBkZXZpY2U7CQkvKiBWZW5kb3IgYW5kIGRldmljZSBJRCBvciBQQ0lfQU5ZX0lEICovCisJdW5zaWduZWQgaW50IGNsYXNzOwkJCS8qIENsYXNzIElELCBvciAgUENJX0FOWV9JRCAqLworCXVuc2lnbmVkIGludCBidXM7CQkJLyogQnVzIG51bWJlciwgb3IgUENJX0FOWV9JRCAqLworCXVuc2lnbmVkIGludCBkZXY7CQkJLyogRGV2aWNlIG51bWJlciwgb3IgUENJX0FOWV9JRCAqLworCXVuc2lnbmVkIGludCBmdW5jOwkJCS8qIEZ1bmN0aW9uIG51bWJlciwgb3IgUENJX0FOWV9JRCAqLworCisJdm9pZCAoKmNvbmZpZ19kZXZpY2UpKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwgcGNpX2Rldl90IGRldiwKKwkJCSAgICAgIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICopOworCXVuc2lnbmVkIGxvbmcgcHJpdlszXTsKK307CisKK2V4dGVybiB2b2lkIHBjaV9jZmdmdW5jX25vdGhpbmcoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCBwY2lfZGV2X3QgZGV2LAorCQkJCXN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICopOworZXh0ZXJuIHZvaWQgcGNpX2NmZ2Z1bmNfY29uZmlnX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHBjaV9kZXZfdCBkZXYsCisJCQkJICAgICAgc3RydWN0IHBjaV9jb25maWdfdGFibGUgKik7CisKKyNkZWZpbmUgTUFYX1BDSV9SRUdJT05TCQk3CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSBQQ0kgY29udHJvbGxlciAoaG9zdCBicmlkZ2UpCisgKi8KK3N0cnVjdCBwY2lfY29udHJvbGxlciB7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpuZXh0OworCisJaW50IGZpcnN0X2J1c25vOworCWludCBsYXN0X2J1c25vOworCisJdm9sYXRpbGUgdW5zaWduZWQgaW50ICpjZmdfYWRkcjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjZmdfZGF0YTsKKworCXN0cnVjdCBwY2lfcmVnaW9uIHJlZ2lvbnNbTUFYX1BDSV9SRUdJT05TXTsKKwlpbnQgcmVnaW9uX2NvdW50OworCisJc3RydWN0IHBjaV9jb25maWdfdGFibGUgKmNvbmZpZ190YWJsZTsKKworCXZvaWQgKCpmaXh1cF9pcnEpKHN0cnVjdCBwY2lfY29udHJvbGxlciAqLCBwY2lfZGV2X3QpOworCisJLyogTG93LWxldmVsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcm91dGluZXMgKi8KKwlpbnQgKCpyZWFkX2J5dGUpKHN0cnVjdCBwY2lfY29udHJvbGxlciosIHBjaV9kZXZfdCwgaW50IHdoZXJlLCB1OCAqKTsKKwlpbnQgKCpyZWFkX3dvcmQpKHN0cnVjdCBwY2lfY29udHJvbGxlciosIHBjaV9kZXZfdCwgaW50IHdoZXJlLCB1MTYgKik7CisJaW50ICgqcmVhZF9kd29yZCkoc3RydWN0IHBjaV9jb250cm9sbGVyKiwgcGNpX2Rldl90LCBpbnQgd2hlcmUsIHUzMiAqKTsKKwlpbnQgKCp3cml0ZV9ieXRlKShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqLCBwY2lfZGV2X3QsIGludCB3aGVyZSwgdTgpOworCWludCAoKndyaXRlX3dvcmQpKHN0cnVjdCBwY2lfY29udHJvbGxlciosIHBjaV9kZXZfdCwgaW50IHdoZXJlLCB1MTYpOworCWludCAoKndyaXRlX2R3b3JkKShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqLCBwY2lfZGV2X3QsIGludCB3aGVyZSwgdTMyKTsKKworCS8qIFVzZWQgYnkgYXV0byBjb25maWcgKi8KKwlzdHJ1Y3QgcGNpX3JlZ2lvbiAqcGNpX21lbSwgKnBjaV9pbzsKKworCS8qIFVzZWQgYnkgcHBjNDA1IGF1dG9jb25maWcqLworCXN0cnVjdCBwY2lfcmVnaW9uICpwY2lfZmI7Cit9OworCitleHRlcm4gX19pbmxpbmVfXyB2b2lkIHBjaV9zZXRfb3BzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgICBpbnQgKCpyZWFkX2J5dGUpKHN0cnVjdCBwY2lfY29udHJvbGxlciosCisJCQkJCQkgICAgcGNpX2Rldl90LCBpbnQgd2hlcmUsIHU4ICopLAorCQkJCSAgIGludCAoKnJlYWRfd29yZCkoc3RydWN0IHBjaV9jb250cm9sbGVyKiwKKwkJCQkJCSAgICBwY2lfZGV2X3QsIGludCB3aGVyZSwgdTE2ICopLAorCQkJCSAgIGludCAoKnJlYWRfZHdvcmQpKHN0cnVjdCBwY2lfY29udHJvbGxlciosCisJCQkJCQkgICAgIHBjaV9kZXZfdCwgaW50IHdoZXJlLCB1MzIgKiksCisJCQkJICAgaW50ICgqd3JpdGVfYnl0ZSkoc3RydWN0IHBjaV9jb250cm9sbGVyKiwKKwkJCQkJCSAgICAgcGNpX2Rldl90LCBpbnQgd2hlcmUsIHU4KSwKKwkJCQkgICBpbnQgKCp3cml0ZV93b3JkKShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqLAorCQkJCQkJICAgICBwY2lfZGV2X3QsIGludCB3aGVyZSwgdTE2KSwKKwkJCQkgICBpbnQgKCp3cml0ZV9kd29yZCkoc3RydWN0IHBjaV9jb250cm9sbGVyKiwKKwkJCQkJCSAgICAgIHBjaV9kZXZfdCwgaW50IHdoZXJlLCB1MzIpKSB7CisJaG9zZS0+cmVhZF9ieXRlICAgPSByZWFkX2J5dGU7CisJaG9zZS0+cmVhZF93b3JkICAgPSByZWFkX3dvcmQ7CisJaG9zZS0+cmVhZF9kd29yZCAgPSByZWFkX2R3b3JkOworCWhvc2UtPndyaXRlX2J5dGUgID0gd3JpdGVfYnl0ZTsKKwlob3NlLT53cml0ZV93b3JkICA9IHdyaXRlX3dvcmQ7CisJaG9zZS0+d3JpdGVfZHdvcmQgPSB3cml0ZV9kd29yZDsKK30KKworZXh0ZXJuIHZvaWQgcGNpX3NldHVwX2luZGlyZWN0KHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfaG9zZV9idXNfdG9fcGh5cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9ob3NlX3BoeXNfdG9fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCisjZGVmaW5lIHBjaV9waHlzX3RvX2J1cyhkZXYsIGFkZHIsIGZsYWdzKSBcCisJcGNpX2hvc2VfcGh5c190b19idXMocGNpX2J1c190b19ob3NlKFBDSV9CVVMoZGV2KSksIChhZGRyKSwgKGZsYWdzKSkKKyNkZWZpbmUgcGNpX2J1c190b19waHlzKGRldiwgYWRkciwgZmxhZ3MpIFwKKwlwY2lfaG9zZV9idXNfdG9fcGh5cyhwY2lfYnVzX3RvX2hvc2UoUENJX0JVUyhkZXYpKSwgKGFkZHIpLCAoZmxhZ3MpKQorCisjZGVmaW5lIHBjaV9waHlzX3RvX21lbShkZXYsIGFkZHIpCXBjaV9waHlzX3RvX2J1cygoZGV2KSwgKGFkZHIpLCBQQ0lfUkVHSU9OX01FTSkKKyNkZWZpbmUgcGNpX21lbV90b19waHlzKGRldiwgYWRkcikJcGNpX2J1c190b19waHlzKChkZXYpLCAoYWRkciksIFBDSV9SRUdJT05fTUVNKQorI2RlZmluZSBwY2lfcGh5c190b19pbyhkZXYsIGFkZHIpCXBjaV9waHlzX3RvX2J1cygoZGV2KSwgKGFkZHIpLCBQQ0lfUkVHSU9OX0lPKQorI2RlZmluZSBwY2lfaW9fdG9fcGh5cyhkZXYsIGFkZHIpCXBjaV9idXNfdG9fcGh5cygoZGV2KSwgKGFkZHIpLCBQQ0lfUkVHSU9OX0lPKQorCitleHRlcm4gaW50IHBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCSAgICAgcGNpX2Rldl90IGRldiwgaW50IHdoZXJlLCB1OCAqdmFsKTsKK2V4dGVybiBpbnQgcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICAgICBwY2lfZGV2X3QgZGV2LCBpbnQgd2hlcmUsIHUxNiAqdmFsKTsKK2V4dGVybiBpbnQgcGNpX2hvc2VfcmVhZF9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCSAgICAgIHBjaV9kZXZfdCBkZXYsIGludCB3aGVyZSwgdTMyICp2YWwpOworZXh0ZXJuIGludCBwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICAgICAgcGNpX2Rldl90IGRldiwgaW50IHdoZXJlLCB1OCB2YWwpOworZXh0ZXJuIGludCBwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICAgICAgcGNpX2Rldl90IGRldiwgaW50IHdoZXJlLCB1MTYgdmFsKTsKK2V4dGVybiBpbnQgcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgICAgICAgcGNpX2Rldl90IGRldiwgaW50IHdoZXJlLCB1MzIgdmFsKTsKKworZXh0ZXJuIGludCBwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2X3QgZGV2LCBpbnQgd2hlcmUsIHU4ICp2YWwpOworZXh0ZXJuIGludCBwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2X3QgZGV2LCBpbnQgd2hlcmUsIHUxNiAqdmFsKTsKK2V4dGVybiBpbnQgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXZfdCBkZXYsIGludCB3aGVyZSwgdTMyICp2YWwpOworZXh0ZXJuIGludCBwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2Rldl90IGRldiwgaW50IHdoZXJlLCB1OCB2YWwpOworZXh0ZXJuIGludCBwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpX2Rldl90IGRldiwgaW50IHdoZXJlLCB1MTYgdmFsKTsKK2V4dGVybiBpbnQgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2X3QgZGV2LCBpbnQgd2hlcmUsIHUzMiB2YWwpOworCitleHRlcm4gaW50IHBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGVfdmlhX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkJICAgICAgIHBjaV9kZXZfdCBkZXYsIGludCB3aGVyZSwgdTggKnZhbCk7CitleHRlcm4gaW50IHBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmRfdmlhX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkJICAgICAgIHBjaV9kZXZfdCBkZXYsIGludCB3aGVyZSwgdTE2ICp2YWwpOworZXh0ZXJuIGludCBwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZV92aWFfZHdvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCQkJcGNpX2Rldl90IGRldiwgaW50IHdoZXJlLCB1OCB2YWwpOworZXh0ZXJuIGludCBwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZF92aWFfZHdvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCQkJcGNpX2Rldl90IGRldiwgaW50IHdoZXJlLCB1MTYgdmFsKTsKKworZXh0ZXJuIHZvaWQgcGNpX3JlZ2lzdGVyX2hvc2Uoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlKTsKK2V4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIHBjaV9idXNfdG9faG9zZShpbnQgYnVzKTsKKworZXh0ZXJuIGludCBwY2lfaG9zZV9zY2FuKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CitleHRlcm4gaW50IHBjaV9ob3NlX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1cyk7CisKK2V4dGVybiB2b2lkIHBjaWF1dG9fcmVnaW9uX2luaXQoc3RydWN0IHBjaV9yZWdpb24qIHJlcyk7CitleHRlcm4gdm9pZCBwY2lhdXRvX3JlZ2lvbl9hbGlnbihzdHJ1Y3QgcGNpX3JlZ2lvbiAqcmVzLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIGludCBwY2lhdXRvX3JlZ2lvbl9hbGxvY2F0ZShzdHJ1Y3QgcGNpX3JlZ2lvbiogcmVzLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50ICpiYXIpOworZXh0ZXJuIHZvaWQgcGNpYXV0b19zZXR1cF9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCSBwY2lfZGV2X3QgZGV2LCBpbnQgYmFyc19udW0sCisJCQkJIHN0cnVjdCBwY2lfcmVnaW9uICptZW0sCisJCQkJIHN0cnVjdCBwY2lfcmVnaW9uICppbyk7Cit2b2lkIHBjaWF1dG9fY29uZmlnX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYpOworCitleHRlcm4gcGNpX2Rldl90IHBjaV9maW5kX2RldmljZSAodW5zaWduZWQgaW50IHZlbmRvciwgdW5zaWduZWQgaW50IGRldmljZSwgaW50IGluZGV4KTsKK2V4dGVybiBwY2lfZGV2X3QgcGNpX2ZpbmRfZGV2aWNlcyAoc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkcywgaW50IGluZGV4KTsKKworZXh0ZXJuIGludCBwY2lfaG9zZV9jb25maWdfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgIHBjaV9kZXZfdCBkZXYsCisJCQkJICB1bnNpZ25lZCBsb25nIGlvLAorCQkJCSAgdW5zaWduZWQgbG9uZyBtZW0sCisJCQkJICB1bnNpZ25lZCBsb25nIGNvbW1hbmQpOworCisjaWZkZWYgQ09ORklHX01QQzgyNFgKK2V4dGVybiB2b2lkIHBjaV9tcGM4MjR4X2luaXQgKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisjZW5kaWYKKworI2VuZGlmCS8qIF9QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zbWlMeW54RU0uaCBiL2luY2x1ZGUvc21pTHlueEVNLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkMmYyNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc21pTHlueEVNLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDE5OTctMjAwMiBFTFRFQyBFbGVrdHJvbmlrIEFHCisgKiBGcmFuayBHb3R0c2NobGluZyA8ZmdvdHRzY2hsaW5nQGVsdGVjLmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBzbWlMeW54RU0uaAorICogU2lsaWNvbiBNb3Rpb24gZ3JhcGhpYyBpbnRlcmZhY2UgZm9yIHNtODEwL3NtNzEwL3NtNzEyIGFjY2VsZXJhdG9yCisgKgorICoKKyAqICBtb2RpZmljYXRpb24gaGlzdG9yeQorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgMDQtMTgtMjAwMiBSZXdyaXR0ZW4gZm9yIFUtQm9vdCA8ZmdvdHRzY2hsaW5nQGVsdGVjLmRlPi4KKyAqLworCisjaWZuZGVmIF9TTUlfTFlOWF9FTV9IXworI2RlZmluZSBfU01JX0xZTlhfRU1fSF8KKworLyoKKyAqIFNNSSA3MTAvNzEyIGhhdmUgNE1CIGludGVybmFsIFJBTTsgU01JIDgxMCAyTUIgaW50ZXJuYWwgKyAyTUIgZXh0ZXJuYWwKKyAqLworI2RlZmluZSBWSURFT19NRU1fU0laRSAgMHg0MDAwMDAKKworLyoKKyAqIFN1cHBvcnRlZCB2aWRlbyBtb2RlcyBmb3IgU01JIEx5bnggRS9FTS9FTSsKKyAqLworI2RlZmluZSBWSURFT19NT0RFUyAgICAgICAgICAgICA3CisjZGVmaW5lIERVQUxfODAwXzYwMCAgICAgICAgICAgIDAgICAvKiBTTUk3MTA6VkdBMTo3NUh6ICAgICAocGl0Y2g9MTYwMCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICBWR0EyOjYwLzEyMEh6IChwaXRjaD0xNjAwKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU01JODEwOlZHQTE6NzVIeiAgICAgKHBpdGNoPTE2MDApICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgVkdBMjo3NUh6ICAgICAocGl0Y2g9MTYwMCkgKi8KKyNkZWZpbmUgRFVBTF8xMDI0Xzc2OCAgICAgICAgICAgMSAgIC8qIFZHQTE6NzVIeiBWR0EyOjczSHogKHBpdGNoPTIwNDgpICAqLworI2RlZmluZSBTSU5HTEVfODAwXzYwMCAgICAgICAgICAyICAgLyogVkdBMTo3NUh6IChwaXRjaD04MDApICAgICAgICAgICAgICovCisjZGVmaW5lIFNJTkdMRV8xMDI0Xzc2OCAgICAgICAgIDMgICAvKiBWR0ExOjc1SHogKHBpdGNoPTEwMjQpICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lOR0xFXzEyODBfMTAyNCAgICAgICAgNCAgIC8qIFZHQTE6NzVIeiAocGl0Y2g9MTI4MCkgICAgICAgICAgICAqLworI2RlZmluZSBUVl9NT0RFX0NDSVIgICAgICAgICAgICA1ICAgLyogVkdBMTo1MEh6IChoPTcyMDt2PTU3NjtwaXRjaD03MjApICovCisjZGVmaW5lIFRWX01PREVfRUlBICAgICAgICAgICAgIDYgICAvKiBWR0ExOjYwSHogKGg9NzIwO3Y9NDg0O3BpdGNoPTcyMCkgKi8KKworCisvKgorICogSVNBIG1hcHBlZCByZWdzCisgKi8KKyNkZWZpbmUgU01JX0lORFhfQzQgICAgICAgICAgICAgKHBHRC0+aXNhQmFzZSArIDB4MDNjNCkgICAgLyogaW5kZXggcmVnICovCisjZGVmaW5lIFNNSV9EQVRBX0M1ICAgICAgICAgICAgIChwR0QtPmlzYUJhc2UgKyAweDAzYzUpICAgIC8qIGRhdGEgcmVnICovCisjZGVmaW5lIFNNSV9JTkRYX0Q0ICAgICAgICAgICAgIChwR0QtPmlzYUJhc2UgKyAweDAzZDQpICAgIC8qIGluZGV4IHJlZyAqLworI2RlZmluZSBTTUlfREFUQV9ENSAgICAgICAgICAgICAocEdELT5pc2FCYXNlICsgMHgwM2Q1KSAgICAvKiBkYXRhIHJlZyAqLworI2RlZmluZSBTTUlfSU5EWF9DRSAgICAgICAgICAgICAocEdELT5pc2FCYXNlICsgMHgwM2NlKSAgICAvKiBpbmRleCByZWcgKi8KKyNkZWZpbmUgU01JX0RBVEFfQ0YgICAgICAgICAgICAgKHBHRC0+aXNhQmFzZSArIDB4MDNjZikgICAgLyogZGF0YSByZWcgKi8KKyNkZWZpbmUgU01JX0xPQ0tfUkVHICAgICAgICAgICAgKHBHRC0+aXNhQmFzZSArIDB4MDNjMykgICAgLyogdW5sb2NrL2xvY2sgZXh0IGNydCByZWcgKi8KKyNkZWZpbmUgU01JX01JU0NfUkVHICAgICAgICAgICAgKHBHRC0+aXNhQmFzZSArIDB4MDNjMikgICAgLyogbWlzYyByZWcgKi8KKyNkZWZpbmUgU01JX0xVVF9NQVNLICAgICAgICAgICAgKHBHRC0+aXNhQmFzZSArIDB4MDNjNikgICAgLyogbHV0IG1hc2sgcmVnICovCisjZGVmaW5lIFNNSV9MVVRfU1RBUlQgICAgICAgICAgIChwR0QtPmlzYUJhc2UgKyAweDAzYzgpICAgIC8qIGx1dCBzdGFydCBpbmRleCAqLworI2RlZmluZSBTTUlfTFVUX1JHQiAgICAgICAgICAgICAocEdELT5pc2FCYXNlICsgMHgwM2M5KSAgICAvKiBsdXQgY29sb3JzIGF1dG8gaW5jci4qLworCisKKy8qCisgKiBWaWRlbyBwcm9jZXNzb3IgY29udHJvbAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50ICAgY29udHJvbDsKKyAgICB1bnNpZ25lZCBpbnQgICBjb2xvcktleTsKKyAgICB1bnNpZ25lZCBpbnQgICBjb2xvcktleU1hc2s7CisgICAgdW5zaWduZWQgaW50ICAgc3RhcnQ7CisgICAgdW5zaWduZWQgc2hvcnQgb2Zmc2V0OworICAgIHVuc2lnbmVkIHNob3J0IHdpZHRoOworICAgIHVuc2lnbmVkIGludCAgIGZpZm9QcmlvOworICAgIHVuc2lnbmVkIGludCAgIGZpZm9FUkw7CisgICAgdW5zaWduZWQgaW50ICAgWVVWdG9SR0I7Cit9IFNtaVZpZGVvUHJvYzsKKworLyoKKyAqIFZpZGVvIHdpbmRvdyBjb250cm9sCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBzaG9ydCB0b3A7CisgICAgdW5zaWduZWQgc2hvcnQgbGVmdDsKKyAgICB1bnNpZ25lZCBzaG9ydCBib3R0b207CisgICAgdW5zaWduZWQgc2hvcnQgcmlnaHQ7CisgICAgdW5zaWduZWQgaW50ICAgc3JjU3RhcnQ7CisgICAgdW5zaWduZWQgc2hvcnQgd2lkdGg7CisgICAgdW5zaWduZWQgc2hvcnQgb2Zmc2V0OworICAgIHVuc2lnbmVkIGNoYXIgIGhTdHJldGNoOworICAgIHVuc2lnbmVkIGNoYXIgIHZTdHJldGNoOworfSBTbWlWaWRlb1dpbjsKKworLyoKKyAqIENhcHR1cmUgcG9ydCBjb250cm9sCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgICBjb250cm9sOworICAgIHVuc2lnbmVkIHNob3J0IHRvcENsaXA7CisgICAgdW5zaWduZWQgc2hvcnQgbGVmdENsaXA7CisgICAgdW5zaWduZWQgc2hvcnQgc3JjSGVpZ2h0OworICAgIHVuc2lnbmVkIHNob3J0IHNyY1dpZHRoOworICAgIHVuc2lnbmVkIGludCAgIHNyY0J1ZlN0YXJ0MTsKKyAgICB1bnNpZ25lZCBpbnQgICBzcmNCdWZTdGFydDI7CisgICAgdW5zaWduZWQgc2hvcnQgc3JjT2Zmc2V0OworICAgIHVuc2lnbmVkIHNob3J0IGZpZm9Db250cm9sOworfSBTbWlDYXB0dXJlUG9ydDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRXhwb3J0IEdyYXBoaWMgRHJpdmVyIENvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgaXNhQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgcGNpQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgZHByQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgdnByQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgY3ByQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVBZHJzOworICAgIHVuc2lnbmVkIGludCBtZW1TaXplOworICAgIHVuc2lnbmVkIGludCBtb2RlOworICAgIHVuc2lnbmVkIGludCBnZGZJbmRleDsKKyAgICB1bnNpZ25lZCBpbnQgZ2RmQnl0ZXNQUDsKKyAgICB1bnNpZ25lZCBpbnQgZmc7CisgICAgdW5zaWduZWQgaW50IGJnOworICAgIHVuc2lnbmVkIGludCBwbG5TaXplWDsKKyAgICB1bnNpZ25lZCBpbnQgcGxuU2l6ZVk7CisgICAgdW5zaWduZWQgaW50IHdpblNpemVYOworICAgIHVuc2lnbmVkIGludCB3aW5TaXplWTsKKyAgICBjaGFyIG1vZGVJZGVudFs4MF07Cit9IEdyYXBoaWNEZXZpY2U7CisKK2V4dGVybiBHcmFwaGljRGV2aWNlIHNtaTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRXhwb3J0IEdyYXBoaWMgRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgKnZpZGVvX2h3X2luaXQgKHZvaWQpOyAgICAgICAvKiByZXR1cm5zIEdyYXBoaWNEZXZpY2Ugc3RydWN0IG9yIE5VTEwgKi8KKwordm9pZCB2aWRlb19od19iaXRibHQgKAorICAgIHVuc2lnbmVkIGludCBicHAsICAgICAgICAgICAgIC8qIGJ5dGVzIHBlciBwaXhlbCAqLworICAgIHVuc2lnbmVkIGludCBzcmNfeCwgICAgICAgICAgIC8qIHNvdXJjZSBwb3MgeCAqLworICAgIHVuc2lnbmVkIGludCBzcmNfeSwgICAgICAgICAgIC8qIHNvdXJjZSBwb3MgeSAqLworICAgIHVuc2lnbmVkIGludCBkc3RfeCwgICAgICAgICAgIC8qIGRlc3QgcG9zIHggKi8KKyAgICB1bnNpZ25lZCBpbnQgZHN0X3ksICAgICAgICAgICAvKiBkZXN0IHBvcyB5ICovCisgICAgdW5zaWduZWQgaW50IGRpbV94LCAgICAgICAgICAgLyogZnJhbWUgd2lkdGggKi8KKyAgICB1bnNpZ25lZCBpbnQgZGltX3kgICAgICAgICAgICAvKiBmcmFtZSBoZWlnaHQgKi8KKyAgICApOworCit2b2lkIHZpZGVvX2h3X3JlY3RmaWxsICgKKyAgICB1bnNpZ25lZCBpbnQgYnBwLCAgICAgICAgICAgICAvKiBieXRlcyBwZXIgcGl4ZWwgKi8KKyAgICB1bnNpZ25lZCBpbnQgZHN0X3gsICAgICAgICAgICAvKiBkZXN0IHBvcyB4ICovCisgICAgdW5zaWduZWQgaW50IGRzdF95LCAgICAgICAgICAgLyogZGVzdCBwb3MgeSAqLworICAgIHVuc2lnbmVkIGludCBkaW1feCwgICAgICAgICAgIC8qIGZyYW1lIHdpZHRoICovCisgICAgdW5zaWduZWQgaW50IGRpbV95LCAgICAgICAgICAgLyogZnJhbWUgaGVpZ2h0ICovCisgICAgdW5zaWduZWQgaW50IGNvbG9yICAgICAgICAgICAgLyogZmlsbCBjb2xvciAqLworICAgICApOworCit2b2lkIHZpZGVvX3NldF9sdXQgKAorICAgIHVuc2lnbmVkIGludCBpbmRleCwgICAgICAgICAgIC8qIGNvbG9yIG51bWJlciAqLworICAgIHVuc2lnbmVkIGNoYXIgciwgICAgICAgICAgICAgIC8qIHJlZCAqLworICAgIHVuc2lnbmVkIGNoYXIgZywgICAgICAgICAgICAgIC8qIGdyZWVuICovCisgICAgdW5zaWduZWQgY2hhciBiICAgICAgICAgICAgICAgLyogYmx1ZSAqLworICAgICk7CisKKyNlbmRpZiAvKl9TTUlfTFlOWF9FTV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zcGFydGFuMi5oIGIvaW5jbHVkZS9zcGFydGFuMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODA2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NwYXJ0YW4yLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogUmljaCBJcmVsYW5kLCBFbnRlcmFzeXMgTmV0d29ya3MsIHJpcmVsYW5kQGVudGVyYXN5cy5jb20uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX1NQQVJUQU4yX0hfCisjZGVmaW5lIF9TUEFSVEFOMl9IXworCisjaW5jbHVkZSA8eGlsaW54Lmg+CisKK2V4dGVybiBpbnQgU3BhcnRhbjJfbG9hZCggWGlsaW54X2Rlc2MgKmRlc2MsIHZvaWQgKmltYWdlLCBzaXplX3Qgc2l6ZSApOworZXh0ZXJuIGludCBTcGFydGFuMl9kdW1wKCBYaWxpbnhfZGVzYyAqZGVzYywgdm9pZCAqYnVmLCBzaXplX3QgYnNpemUgKTsKK2V4dGVybiBpbnQgU3BhcnRhbjJfaW5mbyggWGlsaW54X2Rlc2MgKmRlc2MgKTsKK2V4dGVybiBpbnQgU3BhcnRhbjJfcmVsb2MoIFhpbGlueF9kZXNjICpkZXNjLCB1bG9uZyByZWxvY19vZmYgKTsKKworLyogU2xhdmUgUGFyYWxsZWwgSW1wbGVtZW50YXRpb24gZnVuY3Rpb24gdGFibGUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlYaWxpbnhfcHJlX2ZuCXByZTsKKwlYaWxpbnhfcGdtX2ZuCXBnbTsKKwlYaWxpbnhfaW5pdF9mbglpbml0OworCVhpbGlueF9lcnJfZm4JZXJyOworCVhpbGlueF9kb25lX2ZuCWRvbmU7CisJWGlsaW54X2Nsa19mbgljbGs7CisJWGlsaW54X2NzX2ZuCWNzOworCVhpbGlueF93cl9mbgl3cjsKKwlYaWxpbnhfcmRhdGFfZm4JcmRhdGE7CisJWGlsaW54X3dkYXRhX2ZuCXdkYXRhOworCVhpbGlueF9idXN5X2ZuCWJ1c3k7CisJWGlsaW54X2Fib3J0X2ZuCWFib3J0OworCVhpbGlueF9wb3N0X2ZuCXBvc3Q7CisJaW50ICAgICAgICAgICAJcmVsb2NhdGVkOworfSBYaWxpbnhfU3BhcnRhbjJfU2xhdmVfUGFyYWxsZWxfZm5zOworCisvKiBTbGF2ZSBTZXJpYWwgSW1wbGVtZW50YXRpb24gZnVuY3Rpb24gdGFibGUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlYaWxpbnhfcGdtX2ZuCXBnbTsKKwlYaWxpbnhfY2xrX2ZuCWNsazsKKwlYaWxpbnhfcmRhdGFfZm4JcmRhdGE7CisJWGlsaW54X3dkYXRhX2ZuCXdkYXRhOworCWludCAgICAgICAgICAgCXJlbG9jYXRlZDsKK30gWGlsaW54X1NwYXJ0YW4yX1NsYXZlX1NlcmlhbF9mbnM7CisKKy8qIERldmljZSBJbWFnZSBTaXplcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNwYXJ0YW4tSUkgKDIuNVYpICovCisjZGVmaW5lIFhJTElOWF9YQzJTMTVfU0laRSAgCTE5NzcyOC84CisjZGVmaW5lIFhJTElOWF9YQzJTMzBfU0laRSAgCTMzNjgwMC84CisjZGVmaW5lIFhJTElOWF9YQzJTNTBfU0laRSAgCTU1OTIzMi84CisjZGVmaW5lIFhJTElOWF9YQzJTMTAwX1NJWkUgCTc4MTI0OC84CisjZGVmaW5lIFhJTElOWF9YQzJTMTUwX1NJWkUgCTEwNDAxMjgvOAorCisvKiBEZXNjcmlwdG9yIE1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNwYXJ0YW4tSUkgZGV2aWNlcyAqLworI2RlZmluZSBYSUxJTlhfWEMyUzE1X0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1NwYXJ0YW4yLCBpZmFjZSwgWElMSU5YX1hDMlMxNV9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMyUzMwX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1NwYXJ0YW4yLCBpZmFjZSwgWElMSU5YX1hDMlMzMF9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMyUzUwX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1NwYXJ0YW4yLCBpZmFjZSwgWElMSU5YX1hDMlM1MF9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMyUzEwMF9ERVNDKGlmYWNlLCBmbl90YWJsZSwgY29va2llKSBcCit7IFhpbGlueF9TcGFydGFuMiwgaWZhY2UsIFhJTElOWF9YQzJTMTAwX1NJWkUsIGZuX3RhYmxlLCBjb29raWUgfQorCisjZGVmaW5lIFhJTElOWF9YQzJTMTUwX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1NwYXJ0YW4yLCBpZmFjZSwgWElMSU5YX1hDMlMxNTBfU0laRSwgZm5fdGFibGUsIGNvb2tpZSB9CisKKyNlbmRpZiAvKiBfU1BBUlRBTjJfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdGF0dXNfbGVkLmggYi9pbmNsdWRlL3N0YXR1c19sZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjJkZTNlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zdGF0dXNfbGVkLmgKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY29kZSBpcyB0byBzaWduYWwgdGhlIG9wZXJhdGlvbmFsIHN0YXR1cyBvZiBhCisgKiB0YXJnZXQgd2hpY2ggdXN1YWxseSBib290cyBvdmVyIHRoZSBuZXR3b3JrOyB3aGlsZSBydW5uaW5nIGluCisgKiBQQ0Jvb3QsIGEgc3RhdHVzIExFRCBpcyBibGlua2luZy4gQXMgc29vbiBhcyBhIHZhbGlkIEJPT1RQIHJlcGx5CisgKiBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLCB0aGUgTEVEIGlzIHR1cm5lZCBvZmYuIFRoZSBMaW51eAorICoga2VybmVsLCBvbmNlIGl0IGlzIHJ1bm5pbmcsIHdpbGwgc3RhcnQgYmxpbmtpbmcgdGhlIExFRCBhZ2FpbiwKKyAqIHdpdGggYW5vdGhlciBmcmVxdWVuY3kuCisgKi8KKworI2lmbmRlZiBfU1RBVFVTX0xFRF9IXworI2RlZmluZQlfU1RBVFVTX0xFRF9IXworCisjaWZkZWYgQ09ORklHX1NUQVRVU19MRUQKKworI2RlZmluZSBTVEFUVVNfTEVEX09GRgkJMAorI2RlZmluZSBTVEFUVVNfTEVEX0JMSU5LSU5HCTEKKyNkZWZpbmUgU1RBVFVTX0xFRF9PTgkJMgorCit2b2lkIHN0YXR1c19sZWRfdGljayAodW5zaWduZWQgbG9uZyB0aW1lc3RhbXApOwordm9pZCBzdGF0dXNfbGVkX3NldCAgKGludCBsZWQsIGludCBzdGF0ZSk7CisKKy8qKioqKiAgVFFNOHh4TCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChDT05GSUdfVFFNOHh4TCkKKyMgZGVmaW5lIFNUQVRVU19MRURfUEFSCQlpbV9jcG0uY3BfcGJwYXIKKyMgZGVmaW5lIFNUQVRVU19MRURfRElSCQlpbV9jcG0uY3BfcGJkaXIKKyMgZGVmaW5lIFNUQVRVU19MRURfT0RSCQlpbV9jcG0uY3BfcGJvZHIKKyMgZGVmaW5lIFNUQVRVU19MRURfREFUCQlpbV9jcG0uY3BfcGJkYXQKKworIyBkZWZpbmUgU1RBVFVTX0xFRF9CSVQJCTB4MDAwMDAwMDEKKyMgZGVmaW5lIFNUQVRVU19MRURfUEVSSU9ECShDRkdfSFogLyAyKQorIyBkZWZpbmUgU1RBVFVTX0xFRF9TVEFURQlTVEFUVVNfTEVEX0JMSU5LSU5HCisKKyMgZGVmaW5lIFNUQVRVU19MRURfQUNUSVZFCTEJCS8qIExFRCBvbiBmb3IgYml0ID09IDEJKi8KKworIyBkZWZpbmUgU1RBVFVTX0xFRF9CT09UCTAJCS8qIExFRCAwIHVzZWQgZm9yIGJvb3Qgc3RhdHVzICovCisKKy8qKioqKiAgTVZTIHYxICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VsaWYgKGRlZmluZWQoQ09ORklHX01WUykgJiYgQ09ORklHX01WUyA8IDIpCisjIGRlZmluZSBTVEFUVVNfTEVEX1BBUgkJaW1faW9wb3J0LmlvcF9wZHBhcgorIyBkZWZpbmUgU1RBVFVTX0xFRF9ESVIJCWltX2lvcG9ydC5pb3BfcGRkaXIKKyMgdW5kZWYgIFNUQVRVU19MRURfT0RSCisjIGRlZmluZSBTVEFUVVNfTEVEX0RBVAkJaW1faW9wb3J0LmlvcF9wZGRhdAorCisjIGRlZmluZSBTVEFUVVNfTEVEX0JJVAkJMHgwMDAwMDAwMQorIyBkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QJKENGR19IWiAvIDIpCisjIGRlZmluZSBTVEFUVVNfTEVEX1NUQVRFCVNUQVRVU19MRURfQkxJTktJTkcKKworIyBkZWZpbmUgU1RBVFVTX0xFRF9BQ1RJVkUJMQkJLyogTEVEIG9uIGZvciBiaXQgPT0gMQkqLworCisjIGRlZmluZSBTVEFUVVNfTEVEX0JPT1QJMAkJLyogTEVEIDAgdXNlZCBmb3IgYm9vdCBzdGF0dXMgKi8KKworLyoqKioqICBFVFhfMDk0ICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHX0VUWDA5NCkKKworIyBkZWZpbmUgU1RBVFVTX0xFRF9QQVIJCWltX2lvcG9ydC5pb3BfcGRwYXIKKyMgZGVmaW5lIFNUQVRVU19MRURfRElSCQlpbV9pb3BvcnQuaW9wX3BkZGlyCisjIHVuZGVmICBTVEFUVVNfTEVEX09EUgorIyBkZWZpbmUgU1RBVFVTX0xFRF9EQVQJCWltX2lvcG9ydC5pb3BfcGRkYXQKKworIyBkZWZpbmUgU1RBVFVTX0xFRF9CSVQJCTB4MDAwMDAwMDEKKyMgZGVmaW5lIFNUQVRVU19MRURfUEVSSU9ECShDRkdfSFogLyAyKQorIyBkZWZpbmUgU1RBVFVTX0xFRF9TVEFURQlTVEFUVVNfTEVEX0JMSU5LSU5HCisKKyMgZGVmaW5lIFNUQVRVU19MRURfQUNUSVZFCTAJCS8qIExFRCBvbiBmb3IgYml0ID09IDAJKi8KKworIyBkZWZpbmUgU1RBVFVTX0xFRF9CT09UCTAJCS8qIExFRCAwIHVzZWQgZm9yIGJvb3Qgc3RhdHVzICovCisKKy8qKioqKiAgR0VOODYwVCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VsaWYgZGVmaW5lZChDT05GSUdfR0VOODYwVCkKKworIyBkZWZpbmUgU1RBVFVTX0xFRF9QQVIJCQlpbV9pb3BvcnQuaW9wX3BhcGFyCisjIGRlZmluZSBTVEFUVVNfTEVEX0RJUgkJCWltX2lvcG9ydC5pb3BfcGFkaXIKKyMgZGVmaW5lIFNUQVRVU19MRURfT0RSCQkJaW1faW9wb3J0LmlvcF9wYW9kcgorIyBkZWZpbmUgU1RBVFVTX0xFRF9EQVQJCQlpbV9pb3BvcnQuaW9wX3BhZGF0CisKKyMgZGVmaW5lIFNUQVRVU19MRURfQklUCQkJMHgwODAwCS8qIFJlZCBMRUQgMCBpcyBvbiBQQS40CSovCisjIGRlZmluZSBTVEFUVVNfTEVEX1BFUklPRAkJKENGR19IWiAvIDIpCisjIGRlZmluZSBTVEFUVVNfTEVEX1NUQVRFCQlTVEFUVVNfTEVEX0JMSU5LSU5HCisjIGRlZmluZSBTVEFUVVNfTEVEX0JJVDEJCTB4MDQwMAkvKiBHcm4gTEVEIDEgaXMgb24gUEEuNQkqLworIyBkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QxCQkoQ0ZHX0haIC8gMikKKyMgZGVmaW5lIFNUQVRVU19MRURfU1RBVEUxCQlTVEFUVVNfTEVEX0JMSU5LSU5HCisjIGRlZmluZSBTVEFUVVNfTEVEX0JJVDIJCTB4MDA4MAkvKiBSZWQgTEVEIDIgaXMgb24gUEEuOAkqLworIyBkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QyCQkoQ0ZHX0haIC8gMikKKyMgZGVmaW5lIFNUQVRVU19MRURfU1RBVEUyCQlTVEFUVVNfTEVEX0JMSU5LSU5HCisjIGRlZmluZSBTVEFUVVNfTEVEX0JJVDMJCTB4MDA0MAkvKiBHcm4gTEVEIDMgaXMgb24gUEEuOQkqLworIyBkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QzCQkoQ0ZHX0haIC8gMikKKyMgZGVmaW5lIFNUQVRVU19MRURfU1RBVEUzCQlTVEFUVVNfTEVEX0JMSU5LSU5HCisKKyMgZGVmaW5lIFNUQVRVU19MRURfQUNUSVZFCQkxCS8qIExFRCBvbiBmb3IgYml0ID09IDEJKi8KKyMgZGVmaW5lIFNUQVRVU19MRURfQk9PVAkJMAkvKiBCb290IHN0YXR1cyBvbiBMRUQgMQkqLworCisvKioqKiogIElWTVM4ICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VsaWYgZGVmaW5lZChDT05GSUdfSVZNUzgpCisKKyMgZGVmaW5lIFNUQVRVU19MRURfUEFSCQlpbV9jcG0uY3BfcGJwYXIKKyMgZGVmaW5lIFNUQVRVU19MRURfRElSCQlpbV9jcG0uY3BfcGJkaXIKKyMgZGVmaW5lIFNUQVRVU19MRURfT0RSCQlpbV9jcG0uY3BfcGJvZHIKKyMgZGVmaW5lIFNUQVRVU19MRURfREFUCQlpbV9jcG0uY3BfcGJkYXQKKworIyBkZWZpbmUgU1RBVFVTX0xFRF9CSVQJCTB4MDAwMDAwMTAJLyogTEVEIDAgaXMgb24gUEIuMjcJKi8KKyMgZGVmaW5lIFNUQVRVU19MRURfUEVSSU9ECSgxICogQ0ZHX0haKQorIyBkZWZpbmUgU1RBVFVTX0xFRF9TVEFURQlTVEFUVVNfTEVEX09GRgorIyBkZWZpbmUgU1RBVFVTX0xFRF9CSVQxCTB4MDAwMDAwMjAJLyogTEVEIDEgaXMgb24gUEIuMjYJKi8KKyMgZGVmaW5lIFNUQVRVU19MRURfUEVSSU9EMQkoMSAqIENGR19IWikKKyMgZGVmaW5lIFNUQVRVU19MRURfU1RBVEUxCVNUQVRVU19MRURfT0ZGCisvKiBJREUgTEVEIHVzYWJsZSBmb3Igb3RoZXIgcHVycG9zZXMsIHRvbyAqLworIyBkZWZpbmUgU1RBVFVTX0xFRF9CSVQyCTB4MDAwMDAwMDgJLyogTEVEIDIgaXMgb24gUEIuMjgJKi8KKyMgZGVmaW5lIFNUQVRVU19MRURfUEVSSU9EMgkoMSAqIENGR19IWikKKyMgZGVmaW5lIFNUQVRVU19MRURfU1RBVEUyCVNUQVRVU19MRURfT0ZGCisKKyMgZGVmaW5lIFNUQVRVU19MRURfQUNUSVZFCTEJCS8qIExFRCBvbiBmb3IgYml0ID09IDEJKi8KKworIyBkZWZpbmUgU1RBVFVTX0lMT0NLX1NXSVRDSAkweDAwODAwMDAwCS8qIElMT0NLIHN3aXRjaCBpbiBJUlE0CSovCisKKyMgZGVmaW5lIFNUQVRVU19JTE9DS19QRVJJT0QJKENGR19IWiAvIDEwKQkvKiBhYm91dCBldmVyeSAxMDAgbXMJKi8KKworIyBkZWZpbmUgU1RBVFVTX0xFRF9ZRUxMT1cJMAorIyBkZWZpbmUgU1RBVFVTX0xFRF9HUkVFTgkxCisjIGRlZmluZSBTVEFUVVNfTEVEX0JPT1QJMgkJLyogSURFIExFRCB1c2VkIGZvciBib290IHN0YXR1cyAqLworCisvKioqKiogIElWTUwyNCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VsaWYgZGVmaW5lZChDT05GSUdfSVZNTDI0KQorCisjIGRlZmluZSBTVEFUVVNfTEVEX1BBUgkJaW1fY3BtLmNwX3BicGFyCisjIGRlZmluZSBTVEFUVVNfTEVEX0RJUgkJaW1fY3BtLmNwX3BiZGlyCisjIGRlZmluZSBTVEFUVVNfTEVEX09EUgkJaW1fY3BtLmNwX3Bib2RyCisjIGRlZmluZSBTVEFUVVNfTEVEX0RBVAkJaW1fY3BtLmNwX3BiZGF0CisKKyMgZGVmaW5lIFNUQVRVU19MRURfQklUCQkweDAwMDAwMDEwCS8qIExFRCAwIGlzIG9uIFBCLjI3CSovCisjIGRlZmluZSBTVEFUVVNfTEVEX1BFUklPRAkoMSAqIENGR19IWikKKyMgZGVmaW5lIFNUQVRVU19MRURfU1RBVEUJU1RBVFVTX0xFRF9PRkYKKyMgZGVmaW5lIFNUQVRVU19MRURfQklUMQkweDAwMDAwMDIwCS8qIExFRCAxIGlzIG9uIFBCLjI2CSovCisjIGRlZmluZSBTVEFUVVNfTEVEX1BFUklPRDEJKDEgKiBDRkdfSFopCisjIGRlZmluZSBTVEFUVVNfTEVEX1NUQVRFMQlTVEFUVVNfTEVEX09GRgorLyogSURFIExFRCB1c2FibGUgZm9yIG90aGVyIHB1cnBvc2VzLCB0b28gKi8KKyMgZGVmaW5lIFNUQVRVU19MRURfQklUMgkweDAwMDAwMDA4CS8qIExFRCAyIGlzIG9uIFBCLjI4CSovCisjIGRlZmluZSBTVEFUVVNfTEVEX1BFUklPRDIJKDEgKiBDRkdfSFopCisjIGRlZmluZSBTVEFUVVNfTEVEX1NUQVRFMglTVEFUVVNfTEVEX09GRgorCisjIGRlZmluZSBTVEFUVVNfTEVEX0FDVElWRQkxCQkvKiBMRUQgb24gZm9yIGJpdCA9PSAxCSovCisKKyMgZGVmaW5lIFNUQVRVU19JTE9DS19TV0lUQ0gJMHgwMDAwNDAwMAkvKiBJTE9DSyBpcyBvbiBQQi4xNwkqLworCisjIGRlZmluZSBTVEFUVVNfSUxPQ0tfUEVSSU9ECShDRkdfSFogLyAxMCkJLyogYWJvdXQgZXZlcnkgMTAwIG1zCSovCisKKyMgZGVmaW5lIFNUQVRVU19MRURfWUVMTE9XCTAKKyMgZGVmaW5lIFNUQVRVU19MRURfR1JFRU4JMQorIyBkZWZpbmUgU1RBVFVTX0xFRF9CT09UCTIJCS8qIElERSBMRUQgdXNlZCBmb3IgYm9vdCBzdGF0dXMgKi8KKworLyoqKioqICBMQU5URUMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHX0xBTlRFQykKKworIyBkZWZpbmUgU1RBVFVTX0xFRF9QQVIJCWltX2lvcG9ydC5pb3BfcGRwYXIKKyMgZGVmaW5lIFNUQVRVU19MRURfRElSCQlpbV9pb3BvcnQuaW9wX3BkZGlyCisjIHVuZGVmICBTVEFUVVNfTEVEX09EUgorIyBkZWZpbmUgU1RBVFVTX0xFRF9EQVQJCWltX2lvcG9ydC5pb3BfcGRkYXQKKworIyBpZiBDT05GSUdfTEFURUMgPCAyCisjICBkZWZpbmUgU1RBVFVTX0xFRF9CSVQJMHgxMDAwCisjIGVsc2UKKyMgIGRlZmluZSBTVEFUVVNfTEVEX0JJVAkweDA4MDAKKyMgZW5kaWYKKyMgZGVmaW5lIFNUQVRVU19MRURfUEVSSU9ECShDRkdfSFogLyAyKQorIyBkZWZpbmUgU1RBVFVTX0xFRF9TVEFURQlTVEFUVVNfTEVEX0JMSU5LSU5HCisKKyMgZGVmaW5lIFNUQVRVU19MRURfQUNUSVZFCTAJCS8qIExFRCBvbiBmb3IgYml0ID09IDAgKi8KKworIyBkZWZpbmUgU1RBVFVTX0xFRF9CT09UCTAJCS8qIExFRCAwIHVzZWQgZm9yIGJvb3Qgc3RhdHVzICovCisKKy8qKioqKiAgUENVIEUgIGFuZCAgQ0NNICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZWxpZiAoZGVmaW5lZChDT05GSUdfUENVX0UpIHx8IGRlZmluZWQoQ09ORklHX0NDTSkpCisKKyMgZGVmaW5lIFNUQVRVU19MRURfUEFSCQlpbV9jcG0uY3BfcGJwYXIKKyMgZGVmaW5lIFNUQVRVU19MRURfRElSCQlpbV9jcG0uY3BfcGJkaXIKKyMgZGVmaW5lIFNUQVRVU19MRURfT0RSCQlpbV9jcG0uY3BfcGJvZHIKKyMgZGVmaW5lIFNUQVRVU19MRURfREFUCQlpbV9jcG0uY3BfcGJkYXQKKworIyBkZWZpbmUgU1RBVFVTX0xFRF9CSVQJCTB4MDAwMTAwMDAJLyogZ3JlZW4gTEVEIGlzIG9uIFBCLjE1ICovCisjIGRlZmluZSBTVEFUVVNfTEVEX1BFUklPRAkoQ0ZHX0haIC8gMikKKyMgZGVmaW5lIFNUQVRVU19MRURfU1RBVEUJU1RBVFVTX0xFRF9CTElOS0lORworCisjIGRlZmluZSBTVEFUVVNfTEVEX0FDVElWRQkxCQkvKiBMRUQgb24gZm9yIGJpdCA9PSAxICovCisKKyMgZGVmaW5lIFNUQVRVU19MRURfQk9PVAkwCQkvKiBMRUQgMCB1c2VkIGZvciBib290IHN0YXR1cyAqLworCisvKioqKiogIElDVTg2MiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VsaWYgZGVmaW5lZChDT05GSUdfSUNVODYyKQorCisjIGRlZmluZSBTVEFUVVNfTEVEX1BBUgkJaW1faW9wb3J0LmlvcF9wYXBhcgorIyBkZWZpbmUgU1RBVFVTX0xFRF9ESVIJCWltX2lvcG9ydC5pb3BfcGFkaXIKKyMgZGVmaW5lIFNUQVRVU19MRURfT0RSCQlpbV9pb3BvcnQuaW9wX3Bhb2RyCisjIGRlZmluZSBTVEFUVVNfTEVEX0RBVAkJaW1faW9wb3J0LmlvcF9wYWRhdAorCisjIGRlZmluZSBTVEFUVVNfTEVEX0JJVAkJMHg0MDAwCQkvKiBMRUQgMCBpcyBvbiBQQS4xICovCisjIGRlZmluZSBTVEFUVVNfTEVEX1BFUklPRAkoQ0ZHX0haIC8gMikKKyMgZGVmaW5lIFNUQVRVU19MRURfU1RBVEUJU1RBVFVTX0xFRF9CTElOS0lORworIyBkZWZpbmUgU1RBVFVTX0xFRF9CSVQxCTB4MTAwMAkJLyogTEVEIDEgaXMgb24gUEEuMyAqLworIyBkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QxCShDRkdfSFopCisjIGRlZmluZSBTVEFUVVNfTEVEX1NUQVRFMQlTVEFUVVNfTEVEX09GRgorCisjIGRlZmluZSBTVEFUVVNfTEVEX0FDVElWRQkxCQkvKiBMRUQgb24gZm9yIGJpdCA9PSAxCSovCisKKyMgZGVmaW5lIFNUQVRVU19MRURfQk9PVAkwCQkvKiBMRUQgMCB1c2VkIGZvciBib290IHN0YXR1cyAqLworCisvKioqKiogIFNvbWVvbmUgZWxzZSBkZWZpbmVzIHRoZXNlICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VsaWYgZGVmaW5lZChTVEFUVVNfTEVEX1BBUikKKworICAvKgorICAgKiBBRFZJQ0U6IERlZmluZSBpbiB5b3VyIGJvYXJkIGNvbmZpZ3VyYXRpb24gZmlsZSByYXRoZXIgdGhhbgorICAgKiBmaWxsaW5nIHRoaXMgZmlsZSB1cCB3aXRoIGxvdHMgb2YgY3VzdG9tIGJvYXJkIHN0dWZmLgorICAgKi8KKworLyoqKioqICBOZXRWaWEgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHX05FVFZJQSkKKworI2RlZmluZSBTVEFUVVNfTEVEX1BBUgkJaW1faW9wb3J0LmlvcF9wZHBhcgorI2RlZmluZSBTVEFUVVNfTEVEX0RJUgkJaW1faW9wb3J0LmlvcF9wZGRpcgorI3VuZGVmICBTVEFUVVNfTEVEX09EUgorI2RlZmluZSBTVEFUVVNfTEVEX0RBVAkJaW1faW9wb3J0LmlvcF9wZGRhdAorCisjIGRlZmluZSBTVEFUVVNfTEVEX0JJVAkJMHgwMDgwCQkJLyogUEQuOCAqLworIyBkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QJKENGR19IWiAvIDIpCisjIGRlZmluZSBTVEFUVVNfTEVEX1NUQVRFCVNUQVRVU19MRURfQkxJTktJTkcKKworIyBkZWZpbmUgU1RBVFVTX0xFRF9CSVQxCTB4MDA0MAkJCS8qIFBELjkgKi8KKyMgZGVmaW5lIFNUQVRVU19MRURfUEVSSU9EMQkoQ0ZHX0haIC8gMikKKyMgZGVmaW5lIFNUQVRVU19MRURfU1RBVEUxCVNUQVRVU19MRURfT0ZGCisKKyMgZGVmaW5lIFNUQVRVU19MRURfQUNUSVZFCTAJCS8qIExFRCBvbiBmb3IgYml0ID09IDAJKi8KKyMgZGVmaW5lIFNUQVRVU19MRURfQk9PVAkwCQkvKiBMRUQgMCB1c2VkIGZvciBib290IHN0YXR1cyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2Vsc2UKKyMgZXJyb3IgU3RhdHVzIExFRCBjb25maWd1cmF0aW9uIG1pc3NpbmcKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmCS8qIENPTkZJR19TVEFUVVNfTEVECSovCisKKyNlbmRpZgkvKiBfU1RBVFVTX0xFRF9IXwkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlb19mYi5oIGIvaW5jbHVkZS92aWRlb19mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTQyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3ZpZGVvX2ZiLmgKQEAgLTAsMCArMSwxMTUgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgKiAoQykgQ29weXJpZ2h0IDE5OTctMjAwMiBFTFRFQyBFbGVrdHJvbmlrIEFHCisgKiBGcmFuayBHb3R0c2NobGluZyA8ZmdvdHRzY2hsaW5nQGVsdGVjLmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBzbWlMeW54RU0uaAorICogU2lsaWNvbiBNb3Rpb24gZ3JhcGhpYyBpbnRlcmZhY2UgZm9yIHNtODEwL3NtNzEwL3NtNzEyIGFjY2VsZXJhdG9yCisgKgorICoKKyAqICBtb2RpZmljYXRpb24gaGlzdG9yeQorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgMDQtMTgtMjAwMiBSZXdyaXR0ZW4gZm9yIFUtQm9vdCA8ZmdvdHRzY2hsaW5nQGVsdGVjLmRlPi4KKyAqLworCisjaWZuZGVmIF9WSURFT19GQl9IXworI2RlZmluZSBfVklERU9fRkJfSF8KKworI2RlZmluZSBDT05TT0xFX0JHX0NPTCAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQ09OU09MRV9GR19DT0wgICAgICAgICAgICAweGEwCisKKy8qCisgKiBHcmFwaGljIERhdGEgRm9ybWF0IChHREYpIGJpdHMgZm9yIFZJREVPX0RBVEFfRk9STUFUCisgKi8KKyNkZWZpbmUgR0RGX184QklUX0lOREVYICAgICAgICAgMAorI2RlZmluZSBHREZfMTVCSVRfNTU1UkdCICAgICAgICAxCisjZGVmaW5lIEdERl8xNkJJVF81NjVSR0IgICAgICAgIDIKKyNkZWZpbmUgR0RGXzMyQklUX1g4ODhSR0IgICAgICAgMworI2RlZmluZSBHREZfMjRCSVRfODg4UkdCICAgICAgICA0CisjZGVmaW5lIEdERl9fOEJJVF8zMzJSR0IgICAgICAgIDUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEV4cG9ydCBHcmFwaGljIERyaXZlciBDb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGlzYUJhc2U7CisgICAgdW5zaWduZWQgaW50IHBjaUJhc2U7CisgICAgdW5zaWduZWQgaW50IGRwckJhc2U7CisgICAgdW5zaWduZWQgaW50IHZwckJhc2U7CisgICAgdW5zaWduZWQgaW50IGNwckJhc2U7CisgICAgdW5zaWduZWQgaW50IGZyYW1lQWRyczsKKyAgICB1bnNpZ25lZCBpbnQgbWVtU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgbW9kZTsKKyAgICB1bnNpZ25lZCBpbnQgZ2RmSW5kZXg7CisgICAgdW5zaWduZWQgaW50IGdkZkJ5dGVzUFA7CisgICAgdW5zaWduZWQgaW50IGZnOworICAgIHVuc2lnbmVkIGludCBiZzsKKyAgICB1bnNpZ25lZCBpbnQgcGxuU2l6ZVg7CisgICAgdW5zaWduZWQgaW50IHBsblNpemVZOworICAgIHVuc2lnbmVkIGludCB3aW5TaXplWDsKKyAgICB1bnNpZ25lZCBpbnQgd2luU2l6ZVk7CisgICAgY2hhciBtb2RlSWRlbnRbODBdOworfSBHcmFwaGljRGV2aWNlOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFeHBvcnQgR3JhcGhpYyBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAqdmlkZW9faHdfaW5pdCAodm9pZCk7ICAgICAgIC8qIHJldHVybnMgR3JhcGhpY0RldmljZSBzdHJ1Y3Qgb3IgTlVMTCAqLworCisjaWZkZWYgVklERU9fSFdfQklUQkxUCit2b2lkIHZpZGVvX2h3X2JpdGJsdCAoCisgICAgdW5zaWduZWQgaW50IGJwcCwgICAgICAgICAgICAgLyogYnl0ZXMgcGVyIHBpeGVsICovCisgICAgdW5zaWduZWQgaW50IHNyY194LCAgICAgICAgICAgLyogc291cmNlIHBvcyB4ICovCisgICAgdW5zaWduZWQgaW50IHNyY195LCAgICAgICAgICAgLyogc291cmNlIHBvcyB5ICovCisgICAgdW5zaWduZWQgaW50IGRzdF94LCAgICAgICAgICAgLyogZGVzdCBwb3MgeCAqLworICAgIHVuc2lnbmVkIGludCBkc3RfeSwgICAgICAgICAgIC8qIGRlc3QgcG9zIHkgKi8KKyAgICB1bnNpZ25lZCBpbnQgZGltX3gsICAgICAgICAgICAvKiBmcmFtZSB3aWR0aCAqLworICAgIHVuc2lnbmVkIGludCBkaW1feSAgICAgICAgICAgIC8qIGZyYW1lIGhlaWdodCAqLworICAgICk7CisjZW5kaWYKKworI2lmZGVmIFZJREVPX0hXX1JFQ1RGSUxMCit2b2lkIHZpZGVvX2h3X3JlY3RmaWxsICgKKyAgICB1bnNpZ25lZCBpbnQgYnBwLCAgICAgICAgICAgICAvKiBieXRlcyBwZXIgcGl4ZWwgKi8KKyAgICB1bnNpZ25lZCBpbnQgZHN0X3gsICAgICAgICAgICAvKiBkZXN0IHBvcyB4ICovCisgICAgdW5zaWduZWQgaW50IGRzdF95LCAgICAgICAgICAgLyogZGVzdCBwb3MgeSAqLworICAgIHVuc2lnbmVkIGludCBkaW1feCwgICAgICAgICAgIC8qIGZyYW1lIHdpZHRoICovCisgICAgdW5zaWduZWQgaW50IGRpbV95LCAgICAgICAgICAgLyogZnJhbWUgaGVpZ2h0ICovCisgICAgdW5zaWduZWQgaW50IGNvbG9yICAgICAgICAgICAgLyogZmlsbCBjb2xvciAqLworICAgICApOworI2VuZGlmCisKK3ZvaWQgdmlkZW9fc2V0X2x1dCAoCisgICAgdW5zaWduZWQgaW50IGluZGV4LCAgICAgICAgICAgLyogY29sb3IgbnVtYmVyICovCisgICAgdW5zaWduZWQgY2hhciByLCAgICAgICAgICAgICAgLyogcmVkICovCisgICAgdW5zaWduZWQgY2hhciBnLCAgICAgICAgICAgICAgLyogZ3JlZW4gKi8KKyAgICB1bnNpZ25lZCBjaGFyIGIgICAgICAgICAgICAgICAvKiBibHVlICovCisgICAgKTsKKyNpZmRlZiBDT05GSUdfVklERU9fSFdfQ1VSU09SCit2b2lkIHZpZGVvX3NldF9od19jdXJzb3IoaW50IHgsIGludCB5KTsgLyogeCB5IGluIHBpeGVsICovCit2b2lkIHZpZGVvX2luaXRfaHdfY3Vyc29yKGludCBmb250X3dpZHRoLCBpbnQgZm9udF9oZWlnaHQpOworI2VuZGlmCisKKyNlbmRpZiAvKl9WSURFT19GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aXJ0ZXgyLmggYi9pbmNsdWRlL3ZpcnRleDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTkyMjdiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS92aXJ0ZXgyLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFJpY2ggSXJlbGFuZCwgRW50ZXJhc3lzIE5ldHdvcmtzLCByaXJlbGFuZEBlbnRlcmFzeXMuY29tLgorICogS2VpdGggT3V0d2F0ZXIsIGtlaXRoX291dHdhdGVyQG12aXMuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX1ZJUlRFWDJfSF8KKyNkZWZpbmUgX1ZJUlRFWDJfSF8KKworI2luY2x1ZGUgPHhpbGlueC5oPgorCitleHRlcm4gaW50IFZpcnRleDJfbG9hZCggWGlsaW54X2Rlc2MgKmRlc2MsIHZvaWQgKmltYWdlLCBzaXplX3Qgc2l6ZSApOworZXh0ZXJuIGludCBWaXJ0ZXgyX2R1bXAoIFhpbGlueF9kZXNjICpkZXNjLCB2b2lkICpidWYsIHNpemVfdCBic2l6ZSApOworZXh0ZXJuIGludCBWaXJ0ZXgyX2luZm8oIFhpbGlueF9kZXNjICpkZXNjICk7CitleHRlcm4gaW50IFZpcnRleDJfcmVsb2MoIFhpbGlueF9kZXNjICpkZXNjLCB1bG9uZyByZWxvY19vZmYgKTsKKworLyoKKyAqIFNsYXZlIFNlbGVjdE1hcCBJbXBsZW1lbnRhdGlvbiBmdW5jdGlvbiB0YWJsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVhpbGlueF9wcmVfZm4JcHJlOworCVhpbGlueF9wZ21fZm4JcGdtOworCVhpbGlueF9pbml0X2ZuCWluaXQ7CisJWGlsaW54X2Vycl9mbgllcnI7CisJWGlsaW54X2RvbmVfZm4JZG9uZTsKKwlYaWxpbnhfY2xrX2ZuCWNsazsKKwlYaWxpbnhfY3NfZm4JY3M7CisJWGlsaW54X3dyX2ZuCXdyOworCVhpbGlueF9yZGF0YV9mbglyZGF0YTsKKwlYaWxpbnhfd2RhdGFfZm4Jd2RhdGE7CisJWGlsaW54X2J1c3lfZm4JYnVzeTsKKwlYaWxpbnhfYWJvcnRfZm4JYWJvcnQ7CisJWGlsaW54X3Bvc3RfZm4JcG9zdDsKKwlpbnQgICAgICAgICAgIAlyZWxvY2F0ZWQ7Cit9IFhpbGlueF9WaXJ0ZXgyX1NsYXZlX1NlbGVjdE1hcF9mbnM7CisKKy8qIFNsYXZlIFNlcmlhbCBJbXBsZW1lbnRhdGlvbiBmdW5jdGlvbiB0YWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVhpbGlueF9wZ21fZm4JcGdtOworCVhpbGlueF9jbGtfZm4JY2xrOworCVhpbGlueF9yZGF0YV9mbglyZGF0YTsKKwlYaWxpbnhfd2RhdGFfZm4Jd2RhdGE7CisJaW50ICAgICAgICAgICAJcmVsb2NhdGVkOworfSBYaWxpbnhfVmlydGV4Ml9TbGF2ZV9TZXJpYWxfZm5zOworCisvKiBEZXZpY2UgSW1hZ2UgU2l6ZXMgKGluIGJ5dGVzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWElMSU5YX1hDMlY0MF9TSVpFCQkoMzM4MjA4IC8gOCkKKyNkZWZpbmUgWElMSU5YX1hDMlY4MF9TSVpFCQkoNTk3NDA4IC8gOCkKKyNkZWZpbmUgWElMSU5YX1hDMlYyNTBfU0laRQkJKDE1OTE1ODQgLyA4KQorI2RlZmluZSBYSUxJTlhfWEMyVjUwMF9TSVpFCQkoMjU1Nzg1NyAvIDgpCisjZGVmaW5lIFhJTElOWF9YQzJWMTAwMF9TSVpFCSgzNzQ5NDA4IC8gOCkKKyNkZWZpbmUgWElMSU5YX1hDMlYxNTAwX1NJWkUJKDUxNjYyNDAgLyA4KQorI2RlZmluZSBYSUxJTlhfWEMyVjIwMDBfU0laRQkoNjgwODM1MiAvIDgpCisjZGVmaW5lIFhJTElOWF9YQzJWMzAwMF9TSVpFCSg5NTg5NDA4IC8gOCkKKyNkZWZpbmUgWElMSU5YX1hDMlY0MDAwX1NJWkUJKDE0MjIwMTkyIC8gOCkKKyNkZWZpbmUgWElMSU5YX1hDMlY2MDAwX1NJWkUJKDE5NzUyMDk2IC8gOCkKKyNkZWZpbmUgWElMSU5YX1hDMlY4MDAwX1NJWkUJKDI2MTg1MTIwIC8gOCkKKyNkZWZpbmUgWElMSU5YX1hDMlYxMDAwMF9TSVpFCSgzMzUxOTI2NCAvIDgpCisKKy8qIERlc2NyaXB0b3IgTWFjcm9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBYSUxJTlhfWEMyVjQwX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpCVwKK3sgWGlsaW54X1ZpcnRleDIsIGlmYWNlLCBYSUxJTlhfWEMyVjQwX1NJWkUsIGZuX3RhYmxlLCBjb29raWUgfQorCisjZGVmaW5lIFhJTElOWF9YQzJWODBfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfVmlydGV4MiwgaWZhY2UsIFhJTElOWF9YQzJWODBfU0laRSwgZm5fdGFibGUsIGNvb2tpZSB9CisKKyNkZWZpbmUgWElMSU5YX1hDMlYyNTBfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfVmlydGV4MiwgaWZhY2UsIFhJTElOWF9YQzJWMjUwX1NJWkUsIGZuX3RhYmxlLCBjb29raWUgfQorCisjZGVmaW5lIFhJTElOWF9YQzJWNTAwX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1ZpcnRleDIsIGlmYWNlLCBYSUxJTlhfWEMyVjUwMF9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMyVjEwMDBfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfVmlydGV4MiwgaWZhY2UsIFhJTElOWF9YQzJWMTAwMF9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMyVjE1MDBfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfVmlydGV4MiwgaWZhY2UsIFhJTElOWF9YQzJWMTUwMF9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMyVjIwMDBfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfVmlydGV4MiwgaWZhY2UsIFhJTElOWF9YQzJWMjAwMF9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMyVjMwMDBfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfVmlydGV4MiwgaWZhY2UsIFhJTElOWF9YQzJWMzAwMF9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMyVjQwMDBfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfVmlydGV4MiwgaWZhY2UsIFhJTElOWF9YQzJWNDAwMF9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMyVjYwMDBfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfVmlydGV4MiwgaWZhY2UsIFhJTElOWF9YQzJWNjAwMF9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMyVjgwMDBfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfVmlydGV4MiwgaWZhY2UsIFhJTElOWF9YQzJWODAwMF9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMyVjEwMDAwX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1ZpcnRleDIsIGlmYWNlLCBYSUxJTlhfWEMyVjEwMDAwX1NJWkUsIGZuX3RhYmxlLCBjb29raWUgfQorCisjZW5kaWYgLyogX1ZJUlRFWDJfSF8gKi8KKworLyogdmltOiBzZXQgdHM9NCB0dz03ODogKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGlsaW54LmggYi9pbmNsdWRlL3hpbGlueC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4N2NmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3hpbGlueC5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBSaWNoIElyZWxhbmQsIEVudGVyYXN5cyBOZXR3b3JrcywgcmlyZWxhbmRAZW50ZXJhc3lzLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGZwZ2EuaD4KKworI2lmbmRlZiBfWElMSU5YX0hfCisjZGVmaW5lIF9YSUxJTlhfSF8KKworLyogWGlsaW54IE1vZGVsIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDRkdfU1BBUlRBTjIgCQkJQ0ZHX0ZQR0FfREVWKCAweDEgKQorI2RlZmluZSBDRkdfVklSVEVYX0UgCQkJQ0ZHX0ZQR0FfREVWKCAweDIgKQorI2RlZmluZSBDRkdfVklSVEVYMgkgCQkJQ0ZHX0ZQR0FfREVWKCAweDQgKQorI2RlZmluZSBDRkdfWElMSU5YX1NQQVJUQU4yIAkoQ0ZHX0ZQR0FfWElMSU5YIHwgQ0ZHX1NQQVJUQU4yKQorI2RlZmluZSBDRkdfWElMSU5YX1ZJUlRFWF9FIAkoQ0ZHX0ZQR0FfWElMSU5YIHwgQ0ZHX1ZJUlRFWF9FKQorI2RlZmluZSBDRkdfWElMSU5YX1ZJUlRFWDIJIAkoQ0ZHX0ZQR0FfWElMSU5YIHwgQ0ZHX1ZJUlRFWDIpCisvKiBYWFggLSBBZGQgbmV3IG1vZGVscyBoZXJlICovCisKKworLyogWGlsaW54IEludGVyZmFjZSBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ0ZHX1hJTElOWF9JRl9TUwlDRkdfRlBHQV9JRiggMHgxICkJLyogc2xhdmUgc2VyaWFsIAkqLworI2RlZmluZSBDRkdfWElMSU5YX0lGX01TCUNGR19GUEdBX0lGKCAweDIgKQkvKiBtYXN0ZXIgc2VyaWFsCSovCisjZGVmaW5lIENGR19YSUxJTlhfSUZfU1AJQ0ZHX0ZQR0FfSUYoIDB4NCApCS8qIHNsYXZlIHBhcmFsbGVsIAkqLworI2RlZmluZSBDRkdfWElMSU5YX0lGX0pUQUcJQ0ZHX0ZQR0FfSUYoIDB4OCApCS8qIGp0YWcJCQkJKi8KKyNkZWZpbmUgQ0ZHX1hJTElOWF9JRl9NU00JQ0ZHX0ZQR0FfSUYoIDB4MTAgKQkvKiBtYXN0ZXIgc2VsZWN0bWFwCSovCisjZGVmaW5lIENGR19YSUxJTlhfSUZfU1NNCUNGR19GUEdBX0lGKCAweDIwICkJLyogc2xhdmUgc2VsZWN0bWFwCSovCisKKy8qIFhpbGlueCB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CQkJCQkvKiB0eXBlZGVmIFhpbGlueF9pZmFjZQkqLworCW1pbl94aWxpbnhfaWZhY2VfdHlwZSwJCS8qIGxvdyByYW5nZSBjaGVjayB2YWx1ZSAqLworICAgIHNsYXZlX3NlcmlhbCwJCQkJLyogc2VyaWFsIGRhdGEgYW5kIGV4dGVybmFsIGNsb2NrICovCisgICAgbWFzdGVyX3NlcmlhbCwJCQkJLyogc2VyaWFsIGRhdGEgdy8gaW50ZXJuYWwgY2xvY2sgKG5vdCB1c2VkKSAqLworICAgIHNsYXZlX3BhcmFsbGVsLAkJCQkvKiBwYXJhbGxlbCBkYXRhIHcvIGV4dGVybmFsIGxhdGNoICovCisgICAganRhZ19tb2RlLAkJCQkJLyoganRhZy90YXAgc2VyaWFsIChub3QgdXNlZCApICovCisJbWFzdGVyX3NlbGVjdG1hcCwJCQkvKiBtYXN0ZXIgU2VsZWN0TWFwICh2aXJ0ZXgyKQkJKi8KKwlzbGF2ZV9zZWxlY3RtYXAsCQkJLyogc2xhdmUgU2VsZWN0TWFwICh2aXJ0ZXgyKQkJKi8KKyAgICBtYXhfeGlsaW54X2lmYWNlX3R5cGUJCS8qIGluc2VydCBhbGwgbmV3IHR5cGVzIGJlZm9yZSB0aGlzICovCit9IFhpbGlueF9pZmFjZTsJCQkJCS8qIGVuZCwgdHlwZWRlZiBYaWxpbnhfaWZhY2UgKi8KKwordHlwZWRlZiBlbnVtIHsJCQkJCS8qIHR5cGVkZWYgWGlsaW54X0ZhbWlseSAqLworCW1pbl94aWxpbnhfdHlwZSwJCQkvKiBsb3cgcmFuZ2UgY2hlY2sgdmFsdWUgKi8KKyAgICBYaWxpbnhfU3BhcnRhbjIsCQkJLyogU3BhcnRhbi1JSSBGYW1pbHkgKi8KKyAgICBYaWxpbnhfVmlydGV4RSwJCQkJLyogVmlydGV4LUUgRmFtaWx5ICovCisgICAgWGlsaW54X1ZpcnRleDIsCQkJCS8qIFZpcnRleDIgRmFtaWx5ICovCisgICAgbWF4X3hpbGlueF90eXBlCQkJCS8qIGluc2VydCBhbGwgbmV3IHR5cGVzIGJlZm9yZSB0aGlzICovCit9IFhpbGlueF9GYW1pbHk7CQkJCS8qIGVuZCwgdHlwZWRlZiBYaWxpbnhfRmFtaWx5ICovCisKK3R5cGVkZWYgc3RydWN0IHsJCQkJLyogdHlwZWRlZiBYaWxpbnhfZGVzYyAqLworICAgIFhpbGlueF9GYW1pbHkgICAgZmFtaWx5OwkvKiBwYXJ0IHR5cGUgKi8KKyAgICBYaWxpbnhfaWZhY2UgICAgIGlmYWNlOwkJLyogaW50ZXJmYWNlIHR5cGUgKi8KKyAgICBzaXplX3QgICAgICAgICAgIHNpemU7CQkvKiBieXRlcyBvZiBkYXRhIHBhcnQgY2FuIGFjY2VwdCAqLworCXZvaWQgKiAgICAgICAgICAgaWZhY2VfZm5zOwkvKiBpbnRlcmZhY2UgZnVuY3Rpb24gdGFibGUgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGNvb2tpZTsJLyogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29va2llICovCit9IFhpbGlueF9kZXNjOwkJCQkJLyogZW5kLCB0eXBlZGVmIFhpbGlueF9kZXNjICovCisKKy8qIEdlbmVyaWMgWGlsaW54IEZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBpbnQgeGlsaW54X2xvYWQoIFhpbGlueF9kZXNjICpkZXNjLCB2b2lkICppbWFnZSwgc2l6ZV90IHNpemUgKTsKK2V4dGVybiBpbnQgeGlsaW54X2R1bXAoIFhpbGlueF9kZXNjICpkZXNjLCB2b2lkICpidWYsIHNpemVfdCBic2l6ZSApOworZXh0ZXJuIGludCB4aWxpbnhfaW5mbyggWGlsaW54X2Rlc2MgKmRlc2MgKTsKK2V4dGVybiBpbnQgeGlsaW54X3JlbG9jKCBYaWxpbnhfZGVzYyAqZGVzYywgdWxvbmcgcmVsb2Nfb2Zmc2V0ICk7CisKKy8qIEJvYXJkIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGZ1bmN0aW9uIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBpbnQgKCpYaWxpbnhfcGdtX2ZuKSggaW50IGFzc2VydF9wZ20sIGludCBmbHVzaCwgaW50IGNvb2tpZSApOwordHlwZWRlZiBpbnQgKCpYaWxpbnhfaW5pdF9mbikoIGludCBjb29raWUgKTsKK3R5cGVkZWYgaW50ICgqWGlsaW54X2Vycl9mbikoIGludCBjb29raWUgKTsKK3R5cGVkZWYgaW50ICgqWGlsaW54X2RvbmVfZm4pKCBpbnQgY29va2llICk7Cit0eXBlZGVmIGludCAoKlhpbGlueF9jbGtfZm4pKCBpbnQgYXNzZXJ0X2NsaywgaW50IGZsdXNoLCBpbnQgY29va2llICk7Cit0eXBlZGVmIGludCAoKlhpbGlueF9jc19mbikoIGludCBhc3NlcnRfY3MsIGludCBmbHVzaCwgaW50IGNvb2tpZSApOwordHlwZWRlZiBpbnQgKCpYaWxpbnhfd3JfZm4pKCBpbnQgYXNzZXJ0X3dyaXRlLCBpbnQgZmx1c2gsIGludCBjb29raWUgKTsKK3R5cGVkZWYgaW50ICgqWGlsaW54X3JkYXRhX2ZuKSggdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGNvb2tpZSApOwordHlwZWRlZiBpbnQgKCpYaWxpbnhfd2RhdGFfZm4pKCB1bnNpZ25lZCBjaGFyIGRhdGEsIGludCBmbHVzaCwgaW50IGNvb2tpZSApOwordHlwZWRlZiBpbnQgKCpYaWxpbnhfYnVzeV9mbikoIGludCBjb29raWUgKTsKK3R5cGVkZWYgaW50ICgqWGlsaW54X2Fib3J0X2ZuKSggaW50IGNvb2tpZSApOwordHlwZWRlZiBpbnQgKCpYaWxpbnhfcHJlX2ZuKSggaW50IGNvb2tpZSApOwordHlwZWRlZiBpbnQgKCpYaWxpbnhfcG9zdF9mbikoIGludCBjb29raWUgKTsKKworI2VuZGlmICAvKiBfWElMSU5YX0hfICovCmRpZmYgLS1naXQgYS9saWJfYXJtL191ZGl2c2kzLlMgYi9saWJfYXJtL191ZGl2c2kzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0NTRjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9hcm0vX3VkaXZzaTMuUwpAQCAtMCwwICsxLDc3IEBACisvKiAjIDEgImxpYmdjYzEuUyIgKi8KK0AgbGliZ2NjMSByb3V0aW5lcyBmb3IgQVJNIGNwdS4KK0AgRGl2aXNpb24gcm91dGluZXMsIHdyaXR0ZW4gYnkgUmljaGFyZCBFYXJuc2hhdywgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKK2RpdmlkZW5kCS5yZXEJcjAKK2Rpdmlzb3IJCS5yZXEJcjEKK3Jlc3VsdAkJLnJlcQlyMgorY3VyYml0CQkucmVxCXIzCitpcAkJLnJlcQlyMTIKK3NwCQkucmVxCXIxMworbHIJCS5yZXEJcjE0CitwYwkJLnJlcQlyMTUKKwkudGV4dAorCS5nbG9ibAkgX191ZGl2c2kzCisJLnR5cGUgIF9fdWRpdnNpMyAgICAgICAsZnVuY3Rpb24KKwkuYWxpZ24JMAorIF9fdWRpdnNpMyAgICAgIDoKKwljbXAJZGl2aXNvciwgIzAKKwliZXEJTGRpdjAKKwltb3YJY3VyYml0LCAjMQorCW1vdglyZXN1bHQsICMwCisJY21wCWRpdmlkZW5kLCBkaXZpc29yCisJYmNjCUxnb3RfcmVzdWx0CitMb29wMToKKwlAIFVubGVzcyB0aGUgZGl2aXNvciBpcyB2ZXJ5IGJpZywgc2hpZnQgaXQgdXAgaW4gbXVsdGlwbGVzIG9mCisJQCBmb3VyIGJpdHMsIHNpbmNlIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB1bndpbmRpbmcgaW4gdGhlIG1haW4KKwlAIGRpdmlzaW9uIGxvb3AuICBDb250aW51ZSBzaGlmdGluZyB1bnRpbCB0aGUgZGl2aXNvciBpcworCUAgbGFyZ2VyIHRoYW4gdGhlIGRpdmlkZW5kLgorCWNtcAlkaXZpc29yLCAjMHgxMDAwMDAwMAorCWNtcGNjCWRpdmlzb3IsIGRpdmlkZW5kCisJbW92Y2MJZGl2aXNvciwgZGl2aXNvciwgbHNsICM0CisJbW92Y2MJY3VyYml0LCBjdXJiaXQsIGxzbCAjNAorCWJjYwlMb29wMQorTGJpZ251bToKKwlAIEZvciB2ZXJ5IGJpZyBkaXZpc29ycywgd2UgbXVzdCBzaGlmdCBpdCBhIGJpdCBhdCBhIHRpbWUsIG9yCisJQCB3ZSB3aWxsIGJlIGluIGRhbmdlciBvZiBvdmVyZmxvd2luZy4KKwljbXAJZGl2aXNvciwgIzB4ODAwMDAwMDAKKwljbXBjYwlkaXZpc29yLCBkaXZpZGVuZAorCW1vdmNjCWRpdmlzb3IsIGRpdmlzb3IsIGxzbCAjMQorCW1vdmNjCWN1cmJpdCwgY3VyYml0LCBsc2wgIzEKKwliY2MJTGJpZ251bQorTG9vcDM6CisJQCBUZXN0IGZvciBwb3NzaWJsZSBzdWJ0cmFjdGlvbnMsIGFuZCBub3RlIHdoaWNoIGJpdHMKKwlAIGFyZSBkb25lIGluIHRoZSByZXN1bHQuICBPbiB0aGUgZmluYWwgcGFzcywgdGhpcyBtYXkgc3VidHJhY3QKKwlAIHRvbyBtdWNoIGZyb20gdGhlIGRpdmlkZW5kLCBidXQgdGhlIHJlc3VsdCB3aWxsIGJlIG9rLCBzaW5jZSB0aGUKKwlAICJiaXQiIHdpbGwgaGF2ZSBiZWVuIHNoaWZ0ZWQgb3V0IGF0IHRoZSBib3R0b20uCisJY21wCWRpdmlkZW5kLCBkaXZpc29yCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yCisJb3JyY3MJcmVzdWx0LCByZXN1bHQsIGN1cmJpdAorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzEKKwlvcnJjcwlyZXN1bHQsIHJlc3VsdCwgY3VyYml0LCBsc3IgIzEKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMgorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMyCisJb3JyY3MJcmVzdWx0LCByZXN1bHQsIGN1cmJpdCwgbHNyICMyCisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzMKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCW9ycmNzCXJlc3VsdCwgcmVzdWx0LCBjdXJiaXQsIGxzciAjMworCWNtcAlkaXZpZGVuZCwgIzAJCQlAIEVhcmx5IHRlcm1pbmF0aW9uPworCW1vdm5lcwljdXJiaXQsIGN1cmJpdCwgbHNyICM0CQlAIE5vLCBhbnkgbW9yZSBiaXRzIHRvIGRvPworCW1vdm5lCWRpdmlzb3IsIGRpdmlzb3IsIGxzciAjNAorCWJuZQlMb29wMworTGdvdF9yZXN1bHQ6CisJbW92CXIwLCByZXN1bHQKKwltb3YgCXBjLCBscgorTGRpdjA6CisJc3RyCWxyLCBbc3AsICMtNF0hCisJYmwJIF9fZGl2MCAgICAgICAoUExUKQorCW1vdglyMCwgIzAJCQlAIGFib3V0IGFzIHdyb25nIGFzIGl0IGNvdWxkIGJlCisJbGRtaWEJc3AhLCB7cGN9CisJLnNpemUgIF9fdWRpdnNpMyAgICAgICAsIC4gLSAgX191ZGl2c2kzCisvKiAjIDIzNSAibGliZ2NjMS5TIiAqLworLyogIyAzMjAgImxpYmdjYzEuUyIgKi8KKy8qICMgNDIxICJsaWJnY2MxLlMiICovCisvKiAjIDQzMyAibGliZ2NjMS5TIiAqLworLyogIyA0NTYgImxpYmdjYzEuUyIgKi8KKy8qICMgNTAwICJsaWJnY2MxLlMiICovCisvKiAjIDU4MCAibGliZ2NjMS5TIiAqLwpkaWZmIC0tZ2l0IGEvbGliX2FybS9fdW1vZHNpMy5TIGIvbGliX2FybS9fdW1vZHNpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OWZmYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJfYXJtL191bW9kc2kzLlMKQEAgLTAsMCArMSw4OCBAQAorLyogIyAxICJsaWJnY2MxLlMiICovCitAIGxpYmdjYzEgcm91dGluZXMgZm9yIEFSTSBjcHUuCitAIERpdmlzaW9uIHJvdXRpbmVzLCB3cml0dGVuIGJ5IFJpY2hhcmQgRWFybnNoYXcsIChyZWFybnNoYUBhcm1sdGQuY28udWspCisvKiAjIDE0NSAibGliZ2NjMS5TIiAqLworZGl2aWRlbmQJLnJlcQlyMAorZGl2aXNvcgkJLnJlcQlyMQorb3ZlcmRvbmUJLnJlcQlyMgorY3VyYml0CQkucmVxCXIzCitpcAkJLnJlcQlyMTIKK3NwCQkucmVxCXIxMworbHIJCS5yZXEJcjE0CitwYwkJLnJlcQlyMTUKKwkudGV4dAorCS5nbG9ibAkgX191bW9kc2kzCisJLnR5cGUgIF9fdW1vZHNpMyAgICAgICAsZnVuY3Rpb24KKwkuYWxpZ24gMAorIF9fdW1vZHNpMyAgICAgIDoKKwljbXAJZGl2aXNvciwgIzAKKwliZXEJTGRpdjAKKwltb3YJY3VyYml0LCAjMQorCWNtcAlkaXZpZGVuZCwgZGl2aXNvcgorCW1vdmNjICAJcGMsIGxyCitMb29wMToKKwlAIFVubGVzcyB0aGUgZGl2aXNvciBpcyB2ZXJ5IGJpZywgc2hpZnQgaXQgdXAgaW4gbXVsdGlwbGVzIG9mCisJQCBmb3VyIGJpdHMsIHNpbmNlIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB1bndpbmRpbmcgaW4gdGhlIG1haW4KKwlAIGRpdmlzaW9uIGxvb3AuICBDb250aW51ZSBzaGlmdGluZyB1bnRpbCB0aGUgZGl2aXNvciBpcworCUAgbGFyZ2VyIHRoYW4gdGhlIGRpdmlkZW5kLgorCWNtcAlkaXZpc29yLCAjMHgxMDAwMDAwMAorCWNtcGNjCWRpdmlzb3IsIGRpdmlkZW5kCisJbW92Y2MJZGl2aXNvciwgZGl2aXNvciwgbHNsICM0CisJbW92Y2MJY3VyYml0LCBjdXJiaXQsIGxzbCAjNAorCWJjYwlMb29wMQorTGJpZ251bToKKwlAIEZvciB2ZXJ5IGJpZyBkaXZpc29ycywgd2UgbXVzdCBzaGlmdCBpdCBhIGJpdCBhdCBhIHRpbWUsIG9yCisJQCB3ZSB3aWxsIGJlIGluIGRhbmdlciBvZiBvdmVyZmxvd2luZy4KKwljbXAJZGl2aXNvciwgIzB4ODAwMDAwMDAKKwljbXBjYwlkaXZpc29yLCBkaXZpZGVuZAorCW1vdmNjCWRpdmlzb3IsIGRpdmlzb3IsIGxzbCAjMQorCW1vdmNjCWN1cmJpdCwgY3VyYml0LCBsc2wgIzEKKwliY2MJTGJpZ251bQorTG9vcDM6CisJQCBUZXN0IGZvciBwb3NzaWJsZSBzdWJ0cmFjdGlvbnMuICBPbiB0aGUgZmluYWwgcGFzcywgdGhpcyBtYXkKKwlAIHN1YnRyYWN0IHRvbyBtdWNoIGZyb20gdGhlIGRpdmlkZW5kLCBzbyBrZWVwIHRyYWNrIG9mIHdoaWNoCisJQCBzdWJ0cmFjdGlvbnMgYXJlIGRvbmUsIHdlIGNhbiBmaXggdGhlbSB1cCBhZnRlcndhcmRzLi4uCisJbW92CW92ZXJkb25lLCAjMAorCWNtcAlkaXZpZGVuZCwgZGl2aXNvcgorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvcgorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzEKKwlvcnJjcwlvdmVyZG9uZSwgb3ZlcmRvbmUsIGN1cmJpdCwgcm9yICMxCisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzIKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMgorCW9ycmNzCW92ZXJkb25lLCBvdmVyZG9uZSwgY3VyYml0LCByb3IgIzIKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMzCisJb3JyY3MJb3ZlcmRvbmUsIG92ZXJkb25lLCBjdXJiaXQsIHJvciAjMworCW1vdglpcCwgY3VyYml0CisJY21wCWRpdmlkZW5kLCAjMAkJCUAgRWFybHkgdGVybWluYXRpb24/CisJbW92bmVzCWN1cmJpdCwgY3VyYml0LCBsc3IgIzQJCUAgTm8sIGFueSBtb3JlIGJpdHMgdG8gZG8/CisJbW92bmUJZGl2aXNvciwgZGl2aXNvciwgbHNyICM0CisJYm5lCUxvb3AzCisJQCBBbnkgc3VidHJhY3Rpb25zIHRoYXQgd2Ugc2hvdWxkIG5vdCBoYXZlIGRvbmUgd2lsbCBiZSByZWNvcmRlZCBpbgorCUAgdGhlIHRvcCB0aHJlZSBiaXRzIG9mICJvdmVyZG9uZSIuICBFeGFjdGx5IHdoaWNoIHdlcmUgbm90IG5lZWRlZAorCUAgYXJlIGdvdmVybmVkIGJ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgYml0LCBzdG9yZWQgaW4gaXAuCisJQCBJZiB3ZSB0ZXJtaW5hdGVkIGVhcmx5LCBiZWNhdXNlIGRpdmlkZW5kIGJlY2FtZSB6ZXJvLAorCUAgdGhlbiBub25lIG9mIHRoZSBiZWxvdyB3aWxsIG1hdGNoLCBzaW5jZSB0aGUgYml0IGluIGlwIHdpbGwgbm90IGJlCisJQCBpbiB0aGUgYm90dG9tIG5pYmJsZS4KKwlhbmRzCW92ZXJkb25lLCBvdmVyZG9uZSwgIzB4ZTAwMDAwMDAKKwltb3ZlcSAgCXBjLCBscgkJCQlAIE5vIGZpeHVwcyBuZWVkZWQKKwl0c3QJb3ZlcmRvbmUsIGlwLCByb3IgIzMKKwlhZGRuZQlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCXRzdAlvdmVyZG9uZSwgaXAsIHJvciAjMgorCWFkZG5lCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMyCisJdHN0CW92ZXJkb25lLCBpcCwgcm9yICMxCisJYWRkbmUJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzEKKwltb3YgCXBjLCBscgorTGRpdjA6CisJc3RyCWxyLCBbc3AsICMtNF0hCisJYmwJIF9fZGl2MCAgICAgICAoUExUKQorCW1vdglyMCwgIzAJCQlAIGFib3V0IGFzIHdyb25nIGFzIGl0IGNvdWxkIGJlCisJbGRtaWEJc3AhLCB7cGN9CisJLnNpemUgIF9fdW1vZHNpMyAgICAgICAsIC4gLSAgX191bW9kc2kzCisvKiAjIDMyMCAibGliZ2NjMS5TIiAqLworLyogIyA0MjEgImxpYmdjYzEuUyIgKi8KKy8qICMgNDMzICJsaWJnY2MxLlMiICovCisvKiAjIDQ1NiAibGliZ2NjMS5TIiAqLworLyogIyA1MDAgImxpYmdjYzEuUyIgKi8KKy8qICMgNTgwICJsaWJnY2MxLlMiICovCmRpZmYgLS1naXQgYS9saWJfYXJtL2FybWxpbnV4LmMgYi9saWJfYXJtL2FybWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViOGZhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9hcm0vYXJtbGludXguYwpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBFcmlrIE1vdXcgKEouQS5LLk1vdXdAaXRzLnR1ZGVsZnQubmwpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNtZF9ib290Lmg+CisjaW5jbHVkZSA8aW1hZ2UuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjZGVmaW5lIHRhZ19zaXplKHR5cGUpICAoKHNpemVvZihzdHJ1Y3QgdGFnX2hlYWRlcikgKyBzaXplb2Yoc3RydWN0IHR5cGUpKSA+PiAyKQorI2RlZmluZSB0YWdfbmV4dCh0KSAgICAgKChzdHJ1Y3QgdGFnICopKCh1MzIgKikodCkgKyAodCktPmhkci5zaXplKSkKKworI2lmIGRlZmluZWQgKENPTkZJR19TRVRVUF9NRU1PUllfVEFHUykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19DTURMSU5FX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19JTklUUkRfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX1ZGRCkKK3N0YXRpYyB2b2lkIHNldHVwX3N0YXJ0X3RhZyhiZF90ICpiZCk7CitzdGF0aWMgdm9pZCBzZXR1cF9tZW1vcnlfdGFncyhiZF90ICpiZCk7CitzdGF0aWMgdm9pZCBzZXR1cF9jb21tYW5kbGluZV90YWcoYmRfdCAqYmQsIGNoYXIgKmNvbW1hbmRsaW5lKTsKKyNpZiAwCitzdGF0aWMgdm9pZCBzZXR1cF9yYW1kaXNrX3RhZyhiZF90ICpiZCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHNldHVwX2luaXRyZF90YWcoYmRfdCAqYmQsIHVsb25nIGluaXRyZF9zdGFydCwgdWxvbmcgaW5pdHJkX2VuZCk7CitzdGF0aWMgdm9pZCBzZXR1cF9lbmRfdGFnKGJkX3QgKmJkKTsKKyNpZiBkZWZpbmVkIChDT05GSUdfVkZEKQorc3RhdGljIHZvaWQgc2V0dXBfdmlkZW9sZmJfdGFnKGdkX3QgKmdkKTsKKyNlbmRpZgorCisKK3N0YXRpYyBzdHJ1Y3QgdGFnICpwYXJhbXM7CisjZW5kaWYgLyogQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTIHx8IENPTkZJR19DTURMSU5FX1RBRyB8fCBDT05GSUdfSU5JVFJEX1RBRyAqLworCitleHRlcm4gaW1hZ2VfaGVhZGVyX3QgaGVhZGVyOyAgICAgICAgICAgLyogZnJvbSBjbWRfYm9vdG0uYyAqLworCisKK3ZvaWQgZG9fYm9vdG1fbGludXgoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10sCisJCXVsb25nIGFkZHIsIHVsb25nICpsZW5fcHRyLCBpbnQgICB2ZXJpZnkpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyAgICB1bG9uZyBsZW4gPSAwLCBjaGVja3N1bTsKKyAgICB1bG9uZyBpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQ7CisgICAgdWxvbmcgZGF0YTsKKyAgICB2b2lkICgqdGhlS2VybmVsKShpbnQgemVybywgaW50IGFyY2gpOworICAgIGltYWdlX2hlYWRlcl90ICpoZHIgPSAmaGVhZGVyOworICAgIGJkX3QgKmJkID0gZ2QtPmJkOworI2lmZGVmIENPTkZJR19DTURMSU5FX1RBRworICAgIGNoYXIgKmNvbW1hbmRsaW5lID0gZ2V0ZW52KCJib290YXJncyIpOworI2VuZGlmCisKKyAgICB0aGVLZXJuZWwgPSAodm9pZCAoKikoaW50LCBpbnQpKW50b2hsKGhkci0+aWhfZXApOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBpbml0cmQgaW1hZ2UKKyAgICAgKi8KKyAgICBpZiAoYXJnYyA+PSAzKSB7CisJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKworCXByaW50ZiAoIiMjIExvYWRpbmcgUmFtZGlzayBJbWFnZSBhdCAlMDhseCAuLi5cbiIsIGFkZHIpOworCisJLyogQ29weSBoZWFkZXIgc28gd2UgY2FuIGJsYW5rIENSQyBmaWVsZCBmb3IgcmUtY2FsY3VsYXRpb24gKi8KKwltZW1jcHkgKCZoZWFkZXIsIChjaGFyICopYWRkciwgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSk7CisKKwlpZiAobnRvaGwoaGRyLT5paF9tYWdpYykgIT0gSUhfTUFHSUMpIHsKKwkgICAgcHJpbnRmICgiQmFkIE1hZ2ljIE51bWJlclxuIik7CisJICAgIGRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJfQorCisJZGF0YSA9ICh1bG9uZykmaGVhZGVyOworCWxlbiAgPSBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpOworCisJY2hlY2tzdW0gPSBudG9obChoZHItPmloX2hjcmMpOworCWhkci0+aWhfaGNyYyA9IDA7CisKKwlpZiAoY3JjMzIgKDAsIChjaGFyICopZGF0YSwgbGVuKSAhPSBjaGVja3N1bSkgeworCSAgICBwcmludGYgKCJCYWQgSGVhZGVyIENoZWNrc3VtXG4iKTsKKwkgICAgZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwl9CisKKwlwcmludF9pbWFnZV9oZHIgKGhkcik7CisKKwlkYXRhID0gYWRkciArIHNpemVvZihpbWFnZV9oZWFkZXJfdCk7CisJbGVuICA9IG50b2hsKGhkci0+aWhfc2l6ZSk7CisKKwlpZiAodmVyaWZ5KSB7CisJICAgIHVsb25nIGNzdW0gPSAwOworCisJICAgIHByaW50ZiAoIiAgIFZlcmlmeWluZyBDaGVja3N1bSAuLi4gIik7CisJICAgIGNzdW0gPSBjcmMzMiAoMCwgKGNoYXIgKilkYXRhLCBsZW4pOworCSAgICBpZiAoY3N1bSAhPSBudG9obChoZHItPmloX2RjcmMpKSB7CisJCXByaW50ZiAoIkJhZCBEYXRhIENSQ1xuIik7CisJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJICAgIH0KKwkgICAgcHJpbnRmICgiT0tcbiIpOworCX0KKworCWlmICgoaGRyLT5paF9vcyAgICE9IElIX09TX0xJTlVYKQl8fAorCSAgICAoaGRyLT5paF9hcmNoICE9IElIX0NQVV9BUk0pCXx8CisJICAgIChoZHItPmloX3R5cGUgIT0gSUhfVFlQRV9SQU1ESVNLKQkpIHsKKwkgICAgcHJpbnRmICgiTm8gTGludXggQVJNIFJhbWRpc2sgSW1hZ2VcbiIpOworCSAgICBkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOworCX0KKworCS8qCisJICogTm93IGNoZWNrIGlmIHdlIGhhdmUgYSBtdWx0aWZpbGUgaW1hZ2UKKwkgKi8KKyAgICB9IGVsc2UgaWYgKChoZHItPmloX3R5cGU9PUlIX1RZUEVfTVVMVEkpICYmIChsZW5fcHRyWzFdKSkgeworCXVsb25nIHRhaWwgICAgPSBudG9obChsZW5fcHRyWzBdKSAlIDQ7CisJaW50IGk7CisKKwkvKiBza2lwIGtlcm5lbCBsZW5ndGggYW5kIHRlcm1pbmF0b3IgKi8KKwlkYXRhID0gKHVsb25nKSgmbGVuX3B0clsyXSk7CisJLyogc2tpcCBhbnkgYWRkaXRpb25hbCBpbWFnZSBsZW5ndGggZmllbGRzICovCisJZm9yIChpPTE7IGxlbl9wdHJbaV07ICsraSkKKwkgIGRhdGEgKz0gNDsKKwkvKiBhZGQga2VybmVsIGxlbmd0aCwgYW5kIGFsaWduICovCisJZGF0YSArPSBudG9obChsZW5fcHRyWzBdKTsKKwlpZiAodGFpbCkgeworCSAgICBkYXRhICs9IDQgLSB0YWlsOworCX0KKworCWxlbiAgID0gbnRvaGwobGVuX3B0clsxXSk7CisKKyAgICB9IGVsc2UgeworCS8qCisJICogbm8gaW5pdHJkIGltYWdlCisJICovCisJZGF0YSA9IDA7CisgICAgfQorCisjaWZkZWYJREVCVUcKKyAgICBpZiAoIWRhdGEpIHsKKwlwcmludGYgKCJObyBpbml0cmRcbiIpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGRhdGEpIHsKKwlpbml0cmRfc3RhcnQgPSBkYXRhOworCWluaXRyZF9lbmQgICA9IGluaXRyZF9zdGFydCArIGxlbjsKKyAgICB9IGVsc2UgeworCWluaXRyZF9zdGFydCA9IDA7CisJaW5pdHJkX2VuZCA9IDA7CisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgICBwcmludGYgKCIjIyBUcmFuc2ZlcnJpbmcgY29udHJvbCB0byBMaW51eCAoYXQgYWRkcmVzcyAlMDhseCkgLi4uXG4iLAorCSAgICAodWxvbmcpdGhlS2VybmVsKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0NNRExJTkVfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0lOSVRSRF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfVkZEKQorICAgIHNldHVwX3N0YXJ0X3RhZyhiZCk7CisjaWZkZWYgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCisgICAgc2V0dXBfbWVtb3J5X3RhZ3MoYmQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NNRExJTkVfVEFHCisgICAgc2V0dXBfY29tbWFuZGxpbmVfdGFnKGJkLCBjb21tYW5kbGluZSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSU5JVFJEX1RBRworICAgIHNldHVwX2luaXRyZF90YWcoYmQsIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCk7CisjZW5kaWYKKyNpZiAwCisgICAgc2V0dXBfcmFtZGlza190YWcoYmQpOworI2VuZGlmCisjaWYgZGVmaW5lZCAoQ09ORklHX1ZGRCkKKyAgICBzZXR1cF92aWRlb2xmYl90YWcoZ2QpOworI2VuZGlmCisgICAgc2V0dXBfZW5kX3RhZyhiZCk7CisjZW5kaWYKKworICAgIC8qIHdlIGFzc3VtZSB0aGF0IHRoZSBrZXJuZWwgaXMgaW4gcGxhY2UgKi8KKyAgICBwcmludGYoIlxuU3RhcnRpbmcga2VybmVsIC4uLlxuXG4iKTsKKworICAgIGNsZWFudXBfYmVmb3JlX2xpbnV4KCk7CisKKyAgICB0aGVLZXJuZWwoMCwgYmQtPmJpX2FyY2hfbnVtYmVyKTsKK30KKworCisjaWYgZGVmaW5lZCAoQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0NNRExJTkVfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0lOSVRSRF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfVkZEKQorc3RhdGljIHZvaWQgc2V0dXBfc3RhcnRfdGFnKGJkX3QgKmJkKQoreworICAgIHBhcmFtcyA9IChzdHJ1Y3QgdGFnICopYmQtPmJpX2Jvb3RfcGFyYW1zOworCisgICAgcGFyYW1zLT5oZHIudGFnID0gQVRBR19DT1JFOworICAgIHBhcmFtcy0+aGRyLnNpemUgPSB0YWdfc2l6ZSh0YWdfY29yZSk7CisKKyAgICBwYXJhbXMtPnUuY29yZS5mbGFncyA9IDA7CisgICAgcGFyYW1zLT51LmNvcmUucGFnZXNpemUgPSAwOworICAgIHBhcmFtcy0+dS5jb3JlLnJvb3RkZXYgPSAwOworCisgICAgcGFyYW1zID0gdGFnX25leHQocGFyYW1zKTsKK30KKworCitzdGF0aWMgdm9pZCBzZXR1cF9tZW1vcnlfdGFncyhiZF90ICpiZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMDsgaSA8IENPTkZJR19OUl9EUkFNX0JBTktTOyBpKyspIHsKKwlwYXJhbXMtPmhkci50YWcgPSBBVEFHX01FTTsKKwlwYXJhbXMtPmhkci5zaXplID0gdGFnX3NpemUodGFnX21lbTMyKTsKKworCXBhcmFtcy0+dS5tZW0uc3RhcnQgPSBiZC0+YmlfZHJhbVtpXS5zdGFydDsKKwlwYXJhbXMtPnUubWVtLnNpemUgPSBiZC0+YmlfZHJhbVtpXS5zaXplOworCisJcGFyYW1zID0gdGFnX25leHQocGFyYW1zKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgc2V0dXBfY29tbWFuZGxpbmVfdGFnKGJkX3QgKmJkLCBjaGFyICpjb21tYW5kbGluZSkKK3sKKyAgICBjaGFyICpwOworCisgICAgLyogZWF0IGxlYWRpbmcgd2hpdGUgc3BhY2UgKi8KKyAgICBmb3IocCA9IGNvbW1hbmRsaW5lOyAqcCA9PSAnICc7IHArKykKKyAgICAgIDsKKworICAgIC8qIHNraXAgbm9uLWV4aXN0ZW50IGNvbW1hbmQgbGluZXMgc28gdGhlIGtlcm5lbCB3aWxsIHN0aWxsCisgICAgICogdXNlIGl0cyBkZWZhdWx0IGNvbW1hbmQgbGluZS4KKyAgICAgKi8KKyAgICBpZigqcCA9PSAnXDAnKQorICAgICAgcmV0dXJuOworCisgICAgcGFyYW1zLT5oZHIudGFnID0gQVRBR19DTURMSU5FOworICAgIHBhcmFtcy0+aGRyLnNpemUgPSAoc2l6ZW9mKHN0cnVjdCB0YWdfaGVhZGVyKSArIHN0cmxlbihwKSArIDEgKyA0KSA+PiAyOworCisgICAgc3RyY3B5KHBhcmFtcy0+dS5jbWRsaW5lLmNtZGxpbmUsIHApOworCisgICAgcGFyYW1zID0gdGFnX25leHQocGFyYW1zKTsKK30KKworCisjaWZuZGVmIEFUQUdfSU5JVFJEMgorI2RlZmluZSBBVEFHX0lOSVRSRDIgICAgMHg1NDQyMDAwNQorI2VuZGlmCitzdGF0aWMgdm9pZCBzZXR1cF9pbml0cmRfdGFnKGJkX3QgKmJkLCB1bG9uZyBpbml0cmRfc3RhcnQsIHVsb25nIGluaXRyZF9lbmQpCit7CisgICAgLyogYW4gQVRBR19JTklUUkQgbm9kZSB0ZWxscyB0aGUga2VybmVsIHdoZXJlIHRoZSBjb21wcmVzc2VkCisgICAgICogcmFtZGlzayBjYW4gYmUgZm91bmQuIEFUQUdfUkRJTUcgaXMgYSBiZXR0ZXIgbmFtZSwgYWN0dWFsbHkuCisgICAgICovCisgICAgcGFyYW1zLT5oZHIudGFnID0gQVRBR19JTklUUkQyOworICAgIHBhcmFtcy0+aGRyLnNpemUgPSB0YWdfc2l6ZSh0YWdfaW5pdHJkKTsKKworICAgIHBhcmFtcy0+dS5pbml0cmQuc3RhcnQgPSBpbml0cmRfc3RhcnQ7CisgICAgcGFyYW1zLT51LmluaXRyZC5zaXplID0gaW5pdHJkX2VuZCAtIGluaXRyZF9zdGFydDsKKworICAgIHBhcmFtcyA9IHRhZ19uZXh0KHBhcmFtcyk7Cit9CisKKworI2lmIDAKK3N0YXRpYyB2b2lkIHNldHVwX3JhbWRpc2tfdGFnKGJkX3QgKmJkKQoreworICAgIC8qIGFuIEFUQUdfUkFNRElTSyBub2RlIHRlbGxzIHRoZSBrZXJuZWwgaG93IGxhcmdlIHRoZQorICAgICAqIGRlY29tcHJlc3NlZCByYW1kaXNrIHdpbGwgYmVjb21lLgorICAgICAqLworICAgIHBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfUkFNRElTSzsKKyAgICBwYXJhbXMtPmhkci5zaXplID0gdGFnX3NpemUodGFnX3JhbWRpc2spOworCisgICAgcGFyYW1zLT51LnJhbWRpc2suc3RhcnQgPSAwOworICAgIC8qcGFyYW1zLT51LnJhbWRpc2suc2l6ZSA9IFJBTURJU0tfU0laRTsgKi8KKyAgICBwYXJhbXMtPnUucmFtZGlzay5mbGFncyA9IDE7CS8qIGF1dG9tYXRpY2FsbHkgbG9hZCByYW1kaXNrICovCisKKyAgICBwYXJhbXMgPSB0YWdfbmV4dChwYXJhbXMpOworfQorI2VuZGlmIC8qIDAgKi8KKworI2lmIGRlZmluZWQgKENPTkZJR19WRkQpCitzdGF0aWMgdm9pZCBzZXR1cF92aWRlb2xmYl90YWcoZ2RfdCAqZ2QpCit7CisgICAgLyogQW4gQVRBR19WSURFT0xGQiBub2RlIHRlbGxzIHRoZSBrZXJuZWwgd2hlcmUgYW5kIGhvdyBsYXJnZQorICAgICAqIHRoZSBmcmFtZWJ1ZmZlciBmb3IgdmlkZW8gd2FzIGFsbG9jYXRlZCAoYW1vbmcgb3RoZXIgdGhpbmdzKS4KKyAgICAgKiBOb3RlIHRoYXQgYSBfcGh5c2ljYWxfIGFkZHJlc3MgaXMgcGFzc2VkICEKKyAgICAgKgorICAgICAqIFdlIG9ubHkgdXNlIGl0IHRvIHBhc3MgdGhlIGFkZHJlc3MgYW5kIHNpemUsIHRoZSBvdGhlciBlbnRyaWVzCisgICAgICogaW4gdGhlIHRhZ192aWRlb2xmYiBhcmUgbm90IG9mIGludGVyZXN0LgorICAgICAqLworICAgIHBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfVklERU9MRkI7CisgICAgcGFyYW1zLT5oZHIuc2l6ZSA9IHRhZ19zaXplKHRhZ192aWRlb2xmYik7CisKKyAgICBwYXJhbXMtPnUudmlkZW9sZmIubGZiX2Jhc2UgPSAodTMyKWdkLT5mYl9iYXNlOworICAgIC8qIDcxNjggPSAyNTYqNCo1Ni84IC0gYWN0dWFsbHkgMiBwYWdlcyAoODE5MiBieXRlcykgYXJlIGFsbG9jYXRlZCAqLworICAgIHBhcmFtcy0+dS52aWRlb2xmYi5sZmJfc2l6ZSA9IDcxNjg7CisKKyAgICBwYXJhbXMgPSB0YWdfbmV4dChwYXJhbXMpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNldHVwX2VuZF90YWcoYmRfdCAqYmQpCit7CisgICAgcGFyYW1zLT5oZHIudGFnID0gQVRBR19OT05FOworICAgIHBhcmFtcy0+aGRyLnNpemUgPSAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTIHx8IENPTkZJR19DTURMSU5FX1RBRyB8fCBDT05GSUdfSU5JVFJEX1RBRyAqLwpkaWZmIC0tZ2l0IGEvbGliX2FybS9ib2FyZC5jIGIvbGliX2FybS9ib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ODUyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJfYXJtL2JvYXJkLmMKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGRldmljZXMuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisKKworY29uc3QgY2hhciB2ZXJzaW9uX3N0cmluZ1tdID0KKwlVX0JPT1RfVkVSU0lPTiIgKCIgX19EQVRFX18gIiAtICIgX19USU1FX18gIikiOworCisjaWZkZWYgQ09ORklHX0RSSVZFUl9DUzg5MDAKK2V4dGVybiB2b2lkIGNzODkwMF9nZXRfZW5ldGFkZHIgKHVjaGFyICogYWRkcik7CisjZW5kaWYKKworLyoKKyAqIEJlZ2luIGFuZCBFbmQgb2YgbWVtb3J5IGFyZWEgZm9yIG1hbGxvYygpLCBhbmQgY3VycmVudCAiYnJrIgorICovCitzdGF0aWMgdWxvbmcgbWVtX21hbGxvY19zdGFydCA9IDA7CitzdGF0aWMgdWxvbmcgbWVtX21hbGxvY19lbmQgPSAwOworc3RhdGljIHVsb25nIG1lbV9tYWxsb2NfYnJrID0gMDsKKworc3RhdGljIHZvaWQgbWVtX21hbGxvY19pbml0ICh1bG9uZyBkZXN0X2FkZHIpCit7CisJbWVtX21hbGxvY19zdGFydCA9IGRlc3RfYWRkcjsKKwltZW1fbWFsbG9jX2VuZCA9IGRlc3RfYWRkciArIENPTkZJR19NQUxMT0NfU0laRTsKKwltZW1fbWFsbG9jX2JyayA9IG1lbV9tYWxsb2Nfc3RhcnQ7CisKKwltZW1zZXQgKCh2b2lkICopIG1lbV9tYWxsb2Nfc3RhcnQsIDAsCisJCQltZW1fbWFsbG9jX2VuZCAtIG1lbV9tYWxsb2Nfc3RhcnQpOworfQorCit2b2lkICpzYnJrIChwdHJkaWZmX3QgaW5jcmVtZW50KQoreworCXVsb25nIG9sZCA9IG1lbV9tYWxsb2NfYnJrOworCXVsb25nIG5ldyA9IG9sZCArIGluY3JlbWVudDsKKworCWlmICgobmV3IDwgbWVtX21hbGxvY19zdGFydCkgfHwgKG5ldyA+IG1lbV9tYWxsb2NfZW5kKSkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKwltZW1fbWFsbG9jX2JyayA9IG5ldzsKKworCXJldHVybiAoKHZvaWQgKikgb2xkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdCBVdGlsaXRpZXMJCQkJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29tZSBvZiB0aGlzIGNvZGUgc2hvdWxkIGJlIG1vdmVkIGludG8gdGhlIGNvcmUgZnVuY3Rpb25zLAorICogb3IgZHJvcHBlZCBjb21wbGV0ZWx5LAorICogYnV0IGxldCdzIGdldCBpdCB3b3JraW5nIChhZ2FpbikgZmlyc3QuLi4KKyAqLworCitzdGF0aWMgaW50IGluaXRfYmF1ZHJhdGUgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwl1Y2hhciB0bXBbNjRdOwkvKiBsb25nIGVub3VnaCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisJaW50IGkgPSBnZXRlbnZfciAoImJhdWRyYXRlIiwgdG1wLCBzaXplb2YgKHRtcCkpOworCisJZ2QtPmJhdWRyYXRlID0gKGkgPiAwKQorCQkJPyAoaW50KSBzaW1wbGVfc3RydG91bCAodG1wLCBOVUxMLCAxMCkKKwkJCTogQ09ORklHX0JBVURSQVRFOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBkaXNwbGF5X2Jhbm5lciAodm9pZCkKK3sKKworCXByaW50ZiAoIlxuXG4lc1xuXG4iLCB2ZXJzaW9uX3N0cmluZyk7CisJcHJpbnRmICgiVS1Cb290IGNvZGU6ICUwOGxYIC0+ICUwOGxYICBCU1M6IC0+ICUwOGxYXG4iLAorCQlfYXJtYm9vdF9zdGFydCwgX2FybWJvb3RfZW5kX2RhdGEsIF9hcm1ib290X2VuZCk7CisjaWZkZWYgQ09ORklHX01PREVNX1NVUFBPUlQKKwlwdXRzICgiTW9kZW0gU3VwcG9ydCBlbmFibGVkXG4iKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19VU0VfSVJRCisJcHJpbnRmICgiSVJRIFN0YWNrOiAlMDhseFxuIiwgSVJRX1NUQUNLX1NUQVJUKTsKKwlwcmludGYgKCJGSVEgU3RhY2s6ICUwOGx4XG4iLCBGSVFfU1RBQ0tfU1RBUlQpOworI2VuZGlmCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFdBUk5JTkc6IHRoaXMgY29kZSBsb29rcyAiY2xlYW5lciIgdGhhbiB0aGUgUG93ZXJQQyB2ZXJzaW9uLCBidXQKKyAqIGhhcyB0aGUgZGlzYWR2YW50YWdlIHRoYXQgeW91IGVpdGhlciBnZXQgbm90aGluZywgb3IgZXZlcnl0aGluZy4KKyAqIE9uIFBvd2VyUEMsIHlvdSBtaWdodCBzZWUgIkRSQU06ICIgYmVmb3JlIHRoZSBzeXN0ZW0gaGFuZ3MgLSB3aGljaAorICogZ2l2ZXMgYSBzaW1wbGUgeWV0IGNsZWFyIGluZGljYXRpb24gd2hpY2ggcGFydCBvZiB0aGUKKyAqIGluaXRpYWxpemF0aW9uIGlmIGZhaWxpbmcuCisgKi8KK3N0YXRpYyBpbnQgZGlzcGxheV9kcmFtX2NvbmZpZyAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwlpbnQgaTsKKworCXB1dHMgKCJEUkFNIENvbmZpZ3VyYXRpb246XG4iKTsKKworCWZvcihpPTA7IGk8Q09ORklHX05SX0RSQU1fQkFOS1M7IGkrKykgeworCQlwcmludGYgKCJCYW5rICMlZDogJTA4bHggIiwgaSwgZ2QtPmJkLT5iaV9kcmFtW2ldLnN0YXJ0KTsKKwkJcHJpbnRfc2l6ZSAoZ2QtPmJkLT5iaV9kcmFtW2ldLnNpemUsICJcbiIpOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfZmxhc2hfY29uZmlnICh1bG9uZyBzaXplKQoreworCXB1dHMgKCJGbGFzaDogIik7CisJcHJpbnRfc2l6ZSAoc2l6ZSwgIlxuIik7Cit9CisKKworCisvKgorICogQnJlYXRoIHNvbWUgbGlmZSBpbnRvIHRoZSBib2FyZC4uLgorICoKKyAqIEluaXRpYWxpemUgYW4gU01DIGZvciBzZXJpYWwgY29tbXMsIGFuZCBjYXJyeSBvdXQgc29tZSBoYXJkd2FyZQorICogdGVzdHMuCisgKgorICogVGhlIGZpcnN0IHBhcnQgb2YgaW5pdGlhbGl6YXRpb24gaXMgcnVubmluZyBmcm9tIEZsYXNoIG1lbW9yeTsKKyAqIGl0cyBtYWluIHB1cnBvc2UgaXMgdG8gaW5pdGlhbGl6ZSB0aGUgUkFNIHNvIHRoYXQgd2UKKyAqIGNhbiByZWxvY2F0ZSB0aGUgbW9uaXRvciBjb2RlIHRvIFJBTS4KKyAqLworCisvKgorICogQWxsIGF0dGVtcHRzIHRvIGNvbWUgdXAgd2l0aCBhICJjb21tb24iIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlCisgKiB0aGF0IHdvcmtzIGZvciBhbGwgYm9hcmRzIGFuZCBhcmNoaXRlY3R1cmVzIGZhaWxlZDogc29tZSBvZiB0aGUKKyAqIHJlcXVpcmVtZW50cyBhcmUganVzdCBfdG9vXyBkaWZmZXJlbnQuIFRvIGdldCByaWQgb2YgdGhlIHJlc3VsdGluZworICogbWVzcyBvZiBib2FyZCBkZXBlbmRlbmQgI2lmZGVmJ2VkIGNvZGUgd2Ugbm93IG1ha2UgdGhlIHdob2xlCisgKiBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBjb25maWd1cmFibGUgdG8gdGhlIHVzZXIuCisgKgorICogVGhlIHJlcXVpcmVtZW50cyBmb3IgYW55IG5ldyBpbml0YWxpemF0aW9uIGZ1bmN0aW9uIGlzIHNpbXBsZTogaXQKKyAqIHJlY2VpdmVzIGEgcG9pbnRlciB0byB0aGUgImdsb2JhbCBkYXRhIiBzdHJ1Y3R1cmUgYXMgaXQncyBvbmx5CisgKiBhcmd1bWVudCwgYW5kIHJldHVybnMgYW4gaW50ZWdlciByZXR1cm4gY29kZSwgd2hlcmUgMCBtZWFucworICogImNvbnRpbnVlIiBhbmQgIT0gMCBtZWFucyAiZmF0YWwgZXJyb3IsIGhhbmcgdGhlIHN5c3RlbSIuCisgKi8KK3R5cGVkZWYgaW50IChpbml0X2ZuY190KSAodm9pZCk7CisKK2luaXRfZm5jX3QgKmluaXRfc2VxdWVuY2VbXSA9IHsKKwljcHVfaW5pdCwJCS8qIGJhc2ljIGNwdSBkZXBlbmRlbnQgc2V0dXAgKi8KKwlib2FyZF9pbml0LAkJLyogYmFzaWMgYm9hcmQgZGVwZW5kZW50IHNldHVwICovCisJaW50ZXJydXB0X2luaXQsCQkvKiBzZXQgdXAgZXhjZXB0aW9ucyAqLworCWVudl9pbml0LAkJLyogaW5pdGlhbGl6ZSBlbnZpcm9ubWVudCAqLworCWluaXRfYmF1ZHJhdGUsCQkvKiBpbml0aWFsemUgYmF1ZHJhdGUgc2V0dGluZ3MgKi8KKwlzZXJpYWxfaW5pdCwJCS8qIHNlcmlhbCBjb21tdW5pY2F0aW9ucyBzZXR1cCAqLworCWRpc3BsYXlfYmFubmVyLAorCWRyYW1faW5pdCwJCS8qIGNvbmZpZ3VyZSBhdmFpbGFibGUgUkFNIGJhbmtzICovCisJZGlzcGxheV9kcmFtX2NvbmZpZywKKworCU5VTEwsCit9OworCit2b2lkIHN0YXJ0X2FybWJvb3QgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwl1bG9uZyBzaXplOworCWdkX3QgZ2RfZGF0YTsKKwliZF90IGJkX2RhdGE7CisJaW5pdF9mbmNfdCAqKmluaXRfZm5jX3B0cjsKKyNpZmRlZiBDT05GSUdfVkZECisJdW5zaWduZWQgbG9uZyBhZGRyOworI2VuZGlmCisKKwkvKiBQb2ludGVyIGlzIHdyaXRhYmxlIHNpbmNlIHdlIGFsbG9jYXRlZCBhIHJlZ2lzdGVyIGZvciBpdCAqLworCWdkID0gJmdkX2RhdGE7CisJbWVtc2V0IChnZCwgMCwgc2l6ZW9mIChnZF90KSk7CisJZ2QtPmJkID0gJmJkX2RhdGE7CisJbWVtc2V0IChnZC0+YmQsIDAsIHNpemVvZiAoYmRfdCkpOworCisJZm9yIChpbml0X2ZuY19wdHIgPSBpbml0X3NlcXVlbmNlOyAqaW5pdF9mbmNfcHRyOyArK2luaXRfZm5jX3B0cikgeworCQlpZiAoKCppbml0X2ZuY19wdHIpKCkgIT0gMCkgeworCQkJaGFuZyAoKTsKKwkJfQorCX0KKworCS8qIGNvbmZpZ3VyZSBhdmFpbGFibGUgRkxBU0ggYmFua3MgKi8KKwlzaXplID0gZmxhc2hfaW5pdCAoKTsKKwlkaXNwbGF5X2ZsYXNoX2NvbmZpZyAoc2l6ZSk7CisKKyNpZmRlZiBDT05GSUdfVkZECisjaWZuZGVmIFBBR0VfU0laRQorI2RlZmluZSBQQUdFX1NJWkUgNDA5NgorI2VuZGlmCisJLyoKKwkgKiByZXNlcnZlIG1lbW9yeSBmb3IgVkZEIGRpc3BsYXkgKGFsd2F5cyBmdWxsIHBhZ2VzKQorCSAqLworCS8qIGFybWJvb3RfcmVhbF9lbmQgaXMgZGVmaW5lZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdCAqLworCWFkZHIgPSAoX2FybWJvb3RfcmVhbF9lbmQgKyAoUEFHRV9TSVpFIC0gMSkpICYgfihQQUdFX1NJWkUgLSAxKTsKKwlzaXplID0gdmZkX3NldG1lbSAoYWRkcik7CisJZ2QtPmZiX2Jhc2UgPSBhZGRyOworCS8qIHJvdW5kIHRvIHRoZSBuZXh0IHBhZ2UgYm91bmRhcnkgKi8KKwlhZGRyICs9IHNpemU7CisJYWRkciA9IChhZGRyICsgKFBBR0VfU0laRSAtIDEpKSAmIH4oUEFHRV9TSVpFIC0gMSk7CisJbWVtX21hbGxvY19pbml0IChhZGRyKTsKKyNlbHNlCisJLyogYXJtYm9vdF9yZWFsX2VuZCBpcyBkZWZpbmVkIGluIHRoZSBib2FyZC1zcGVjaWZpYyBsaW5rZXIgc2NyaXB0ICovCisJbWVtX21hbGxvY19pbml0IChfYXJtYm9vdF9yZWFsX2VuZCk7CisjZW5kaWYgLyogQ09ORklHX1ZGRCAqLworCisjaWZkZWYgQ09ORklHX1ZGRAorCS8qIG11c3QgZG8gdGhpcyBhZnRlciB0aGUgZnJhbWVidWZmZXIgaXMgYWxsb2NhdGVkICovCisJZHJ2X3ZmZF9pbml0KCk7CisjZW5kaWYKKwkvKiBpbml0aWFsaXplIGVudmlyb25tZW50ICovCisJZW52X3JlbG9jYXRlICgpOworCisJLyogSVAgQWRkcmVzcyAqLworCWJkX2RhdGEuYmlfaXBfYWRkciA9IGdldGVudl9JUGFkZHIgKCJpcGFkZHIiKTsKKworCS8qIE1BQyBBZGRyZXNzICovCisJeworCQlpbnQgaTsKKwkJdWxvbmcgcmVnOworCQljaGFyICpzLCAqZTsKKwkJdWNoYXIgdG1wWzY0XTsKKworCQlpID0gZ2V0ZW52X3IgKCJldGhhZGRyIiwgdG1wLCBzaXplb2YgKHRtcCkpOworCQlzID0gKGkgPiAwKSA/IHRtcCA6IE5VTEw7CisKKwkJZm9yIChyZWcgPSAwOyByZWcgPCA2OyArK3JlZykgeworCQkJYmRfZGF0YS5iaV9lbmV0YWRkcltyZWddID0gcyA/IHNpbXBsZV9zdHJ0b3VsIChzLCAmZSwgMTYpIDogMDsKKwkJCWlmIChzKQorCQkJCXMgPSAoKmUpID8gZSArIDEgOiBlOworCQl9CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfTUlTQ19JTklUX1IpCisJLyogbWlzY2VsbGFuZW91cyBwbGF0Zm9ybSBkZXBlbmRlbnQgaW5pdGlhbGlzYXRpb25zICovCisJbWlzY19pbml0X3IgKCk7CisjZW5kaWYKKworCS8qIGVuYWJsZSBleGNlcHRpb25zICovCisJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKyNpZmRlZiBDT05GSUdfRFJJVkVSX0NTODkwMAorCWlmICghZ2V0ZW52ICgiZXRoYWRkciIpKSB7CisJCWNzODkwMF9nZXRfZW5ldGFkZHIgKGdkLT5iZC0+YmlfZW5ldGFkZHIpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQk9BUkRfUE9TVF9JTklUCisJYm9hcmRfcG9zdF9pbml0ICgpOworI2VuZGlmCisKKwkvKiBtYWluX2xvb3AoKSBjYW4gcmV0dXJuIHRvIHJldHJ5IGF1dG9ib290LCBpZiBzbyBqdXN0IHJ1biBpdCBhZ2Fpbi4gKi8KKwlmb3IgKDs7KSB7CisJCW1haW5fbG9vcCAoKTsKKwl9CisKKwkvKiBOT1RSRUFDSEVEIC0gbm8gd2F5IG91dCBvZiBjb21tYW5kIGxvb3AgZXhjZXB0IGJvb3RpbmcgKi8KK30KKwordm9pZCBoYW5nICh2b2lkKQoreworCXB1dHMgKCIjIyMgRVJST1IgIyMjIFBsZWFzZSBSRVNFVCB0aGUgYm9hcmQgIyMjXG4iKTsKKwlmb3IgKDs7KTsKK30KKworI2lmZGVmIENPTkZJR19NT0RFTV9TVVBQT1JUCisvKiBjYWxsZWQgZnJvbSBtYWluIGxvb3AgKGNvbW1vbi9tYWluLmMpICovCitleHRlcm4gdm9pZCAgZGJnKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2ludCBtZG1faW5pdCAodm9pZCkKK3sKKwljaGFyIGVudl9zdHJbMTZdOworCWNoYXIgKmluaXRfc3RyOworCWludCBpOworCWV4dGVybiBjaGFyIGNvbnNvbGVfYnVmZmVyW107CisJc3RhdGljIGlubGluZSB2b2lkIG1kbV9yZWFkbGluZShjaGFyICpidWYsIGludCBidWZzaXopOworCWV4dGVybiB2b2lkIGVuYWJsZV9wdXRjKHZvaWQpOworCWV4dGVybiBpbnQgaHdmbG93X29ub2ZmKGludCk7CisKKwllbmFibGVfcHV0YygpOyAvKiBlbmFibGUgc2VyaWFsX3B1dGMoKSAqLworCisjaWZkZWYgQ09ORklHX0hXRkxPVworCWluaXRfc3RyID0gZ2V0ZW52KCJtZG1fZmxvd19jb250cm9sIik7CisJaWYgKGluaXRfc3RyICYmIChzdHJjbXAoaW5pdF9zdHIsICJydHMvY3RzIikgPT0gMCkpCisJCWh3Zmxvd19vbm9mZiAoMSk7CisJZWxzZQorCQlod2Zsb3dfb25vZmYoLTEpOworI2VuZGlmCisKKwlmb3IgKGkgPSAxOztpKyspIHsKKwkJc3ByaW50ZihlbnZfc3RyLCAibWRtX2luaXQlZCIsIGkpOworCQlpZiAoKGluaXRfc3RyID0gZ2V0ZW52KGVudl9zdHIpKSAhPSBOVUxMKSB7CisJCQlzZXJpYWxfcHV0cyhpbml0X3N0cik7CisJCQlzZXJpYWxfcHV0cygiXG4iKTsKKwkJCWZvcig7OykgeworCQkJCW1kbV9yZWFkbGluZShjb25zb2xlX2J1ZmZlciwgQ0ZHX0NCU0laRSk7CisJCQkJZGJnKCJpbmklZDogWyVzXSIsIGksIGNvbnNvbGVfYnVmZmVyKTsKKworCQkJCWlmICgoc3RyY21wKGNvbnNvbGVfYnVmZmVyLCAiT0siKSA9PSAwKSB8fAorCQkJCQkoc3RyY21wKGNvbnNvbGVfYnVmZmVyLCAiRVJST1IiKSA9PSAwKSkgeworCQkJCQlkYmcoImluaSVkOiBjbWQgZG9uZSIsIGkpOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgLyogaW4gY2FzZSB3ZSBhcmUgb3JpZ2luYXRpbmcgY2FsbCAuLi4gKi8KKwkJCQkJaWYgKHN0cm5jbXAoY29uc29sZV9idWZmZXIsICJDT05ORUNUIiwgNykgPT0gMCkgeworCQkJCQkJZGJnKCJpbmklZDogY29ubmVjdCIsIGkpOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCX0KKwkJfSBlbHNlCisJCQlicmVhazsgLyogbm8gaW5pdCBzdHJpbmcgLSBzdG9wIG1vZGVtIGluaXQgKi8KKworCQl1ZGVsYXkoMTAwMDAwKTsKKwl9CisKKwl1ZGVsYXkoMTAwMDAwKTsKKworCS8qIGZpbmFsIHN0YWdlIC0gd2FpdCBmb3IgY29ubmVjdCAqLworCWZvcig7aSA+IDE7KSB7IC8qIGlmICdpJyA+IDEgLSB3YWl0IGZvciBjb25uZWN0aW9uCisJCQkJICBtZXNzYWdlIGZyb20gbW9kZW0gKi8KKwkJbWRtX3JlYWRsaW5lKGNvbnNvbGVfYnVmZmVyLCBDRkdfQ0JTSVpFKTsKKwkJZGJnKCJpbmlfZjogWyVzXSIsIGNvbnNvbGVfYnVmZmVyKTsKKwkJaWYgKHN0cm5jbXAoY29uc29sZV9idWZmZXIsICJDT05ORUNUIiwgNykgPT0gMCkgeworCQkJZGJnKCJpbmlfZjogY29ubmVjdGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiAnaW5saW5lJyAtIFdlIGhhdmUgdG8gZG8gaXQgZmFzdCAqLworc3RhdGljIGlubGluZSB2b2lkIG1kbV9yZWFkbGluZShjaGFyICpidWYsIGludCBidWZzaXopCit7CisJY2hhciBjOworCWNoYXIgKnA7CisJaW50IG47CisKKwluID0gMDsKKwlwID0gYnVmOworCWZvcig7OykgeworCQljID0gc2VyaWFsX2dldGMoKTsKKworCQkvKgkJZGJnKCIoJWMpIiwgYyk7ICovCisKKwkJc3dpdGNoKGMpIHsKKwkJY2FzZSAnXHInOgorCQkJYnJlYWs7CisJCWNhc2UgJ1xuJzoKKwkJCSpwID0gJ1wwJzsKKwkJCXJldHVybjsKKworCQlkZWZhdWx0OgorCQkJaWYobisrID4gYnVmc2l6KSB7CisJCQkJKnAgPSAnXDAnOworCQkJCXJldHVybjsgLyogc2FuaXR5IGNoZWNrICovCisJCQl9CisJCQkqcCA9IGM7CisJCQlwKys7CisJCQlicmVhazsKKwkJfQorCX0KK30KKyNlbmRpZgkvKiBDT05GSUdfTU9ERU1fU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvbGliX2dlbmVyaWMvc3RyaW5nLmMgYi9saWJfZ2VuZXJpYy9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTFlMmUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliX2dlbmVyaWMvc3RyaW5nLmMKQEAgLTAsMCArMSw1NzQgQEAKKy8qCisgKiAgbGludXgvbGliL3N0cmluZy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisvKgorICogc3R1cGlkIGxpYnJhcnkgcm91dGluZXMuLiBUaGUgb3B0aW1pemVkIHZlcnNpb25zIHNob3VsZCBnZW5lcmFsbHkgYmUgZm91bmQKKyAqIGFzIGlubGluZSBjb2RlIGluIDxhc20teHgvc3RyaW5nLmg+CisgKgorICogVGhlc2UgYXJlIGJ1Z2d5IGFzIHdlbGwuLgorICoKKyAqICogRnJpIEp1biAyNSAxOTk5LCBJbmdvIE9lc2VyIDxpb2VAaW5mb3JtYXRpay50dS1jaGVtbml0ei5kZT4KKyAqIC0gIEFkZGVkIHN0cnNlcCgpIHdoaWNoIHdpbGwgcmVwbGFjZSBzdHJ0b2soKSBzb29uIChiZWNhdXNlIHN0cnNlcCgpIGlzCisgKiAgICByZWVudHJhbnQgYW5kIHNob3VsZCBiZSBmYXN0ZXIpLiBVc2Ugb25seSBzdHJzZXAoKSBpbiBuZXcgY29kZSwgcGxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNpZmRlZglDT05GSUdfQVJNCisjdW5kZWYgIF9fSEFWRV9BUkNIX01FTUNNUAorI3VuZGVmICBfX0hBVkVfQVJDSF9NRU1DUFkKKyN1bmRlZiAgX19IQVZFX0FSQ0hfTUVNTU9WRQorI3VuZGVmICBfX0hBVkVfQVJDSF9NRU1TRVQKKyN1bmRlZiAgX19IQVZFX0FSQ0hfQkNPUFkKKyN1bmRlZiAgX19IQVZFX0FSQ0hfU1RSQ0FUCisjdW5kZWYgIF9fSEFWRV9BUkNIX1NUUkNIUgorI3VuZGVmICBfX0hBVkVfQVJDSF9TVFJDTVAKKyN1bmRlZiAgX19IQVZFX0FSQ0hfU1RSQ1BZCisjdW5kZWYgIF9fSEFWRV9BUkNIX1NUUkxFTgorI3VuZGVmICBfX0hBVkVfQVJDSF9TVFJOQ1BZCisjZWxzZQorI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1DTVAKKyNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNQ1BZCisjZGVmaW5lIF9fSEFWRV9BUkNIX01FTU1PVkUKKyNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNU0VUCisjZGVmaW5lIF9fSEFWRV9BUkNIX0JDT1BZCisjZGVmaW5lIF9fSEFWRV9BUkNIX1NUUkNBVAorI2RlZmluZSBfX0hBVkVfQVJDSF9TVFJDTVAKKyNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSQ1BZCisjZGVmaW5lIF9fSEFWRV9BUkNIX1NUUkxFTgorI2RlZmluZSBfX0hBVkVfQVJDSF9TVFJOQ1BZCisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOSUNNUAorLyoqCisgKiBzdHJuaWNtcCAtIENhc2UgaW5zZW5zaXRpdmUsIGxlbmd0aC1saW1pdGVkIHN0cmluZyBjb21wYXJpc29uCisgKiBAczE6IE9uZSBzdHJpbmcKKyAqIEBzMjogVGhlIG90aGVyIHN0cmluZworICogQGxlbjogdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29tcGFyZQorICovCitpbnQgc3RybmljbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbGVuKQoreworCS8qIFllcywgVmlyZ2luaWEsIGl0IGhhZCBiZXR0ZXIgYmUgdW5zaWduZWQgKi8KKwl1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKworCWMxID0gMDsJYzIgPSAwOworCWlmIChsZW4pIHsKKwkJZG8geworCQkJYzEgPSAqczE7IGMyID0gKnMyOworCQkJczErKzsgczIrKzsKKwkJCWlmICghYzEpCisJCQkJYnJlYWs7CisJCQlpZiAoIWMyKQorCQkJCWJyZWFrOworCQkJaWYgKGMxID09IGMyKQorCQkJCWNvbnRpbnVlOworCQkJYzEgPSB0b2xvd2VyKGMxKTsKKwkJCWMyID0gdG9sb3dlcihjMik7CisJCQlpZiAoYzEgIT0gYzIpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tbGVuKTsKKwl9CisJcmV0dXJuIChpbnQpYzEgLSAoaW50KWMyOworfQorI2VuZGlmCisKK2NoYXIgKiBfX19zdHJ0b2s7CisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ1BZCisvKioKKyAqIHN0cmNweSAtIENvcHkgYSAlTlVMIHRlcm1pbmF0ZWQgc3RyaW5nCisgKiBAZGVzdDogV2hlcmUgdG8gY29weSB0aGUgc3RyaW5nIHRvCisgKiBAc3JjOiBXaGVyZSB0byBjb3B5IHRoZSBzdHJpbmcgZnJvbQorICovCitjaGFyICogc3RyY3B5KGNoYXIgKiBkZXN0LGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyICp0bXAgPSBkZXN0OworCisJd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQorCQkvKiBub3RoaW5nICovOworCXJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ1BZCisvKioKKyAqIHN0cm5jcHkgLSBDb3B5IGEgbGVuZ3RoLWxpbWl0ZWQsICVOVUwtdGVybWluYXRlZCBzdHJpbmcKKyAqIEBkZXN0OiBXaGVyZSB0byBjb3B5IHRoZSBzdHJpbmcgdG8KKyAqIEBzcmM6IFdoZXJlIHRvIGNvcHkgdGhlIHN0cmluZyBmcm9tCisgKiBAY291bnQ6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKgorICogTm90ZSB0aGF0IHVubGlrZSB1c2Vyc3BhY2Ugc3RybmNweSwgdGhpcyBkb2VzIG5vdCAlTlVMLXBhZCB0aGUgYnVmZmVyLgorICogSG93ZXZlciwgdGhlIHJlc3VsdCBpcyBub3QgJU5VTC10ZXJtaW5hdGVkIGlmIHRoZSBzb3VyY2UgZXhjZWVkcworICogQGNvdW50IGJ5dGVzLgorICovCitjaGFyICogc3RybmNweShjaGFyICogZGVzdCxjb25zdCBjaGFyICpzcmMsc2l6ZV90IGNvdW50KQoreworCWNoYXIgKnRtcCA9IGRlc3Q7CisKKwl3aGlsZSAoY291bnQtLSAmJiAoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKwkJLyogbm90aGluZyAqLzsKKworCXJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDQVQKKy8qKgorICogc3RyY2F0IC0gQXBwZW5kIG9uZSAlTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIGFub3RoZXIKKyAqIEBkZXN0OiBUaGUgc3RyaW5nIHRvIGJlIGFwcGVuZGVkIHRvCisgKiBAc3JjOiBUaGUgc3RyaW5nIHRvIGFwcGVuZCB0byBpdAorICovCitjaGFyICogc3RyY2F0KGNoYXIgKiBkZXN0LCBjb25zdCBjaGFyICogc3JjKQoreworCWNoYXIgKnRtcCA9IGRlc3Q7CisKKwl3aGlsZSAoKmRlc3QpCisJCWRlc3QrKzsKKwl3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCisJCTsKKworCXJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ0FUCisvKioKKyAqIHN0cm5jYXQgLSBBcHBlbmQgYSBsZW5ndGgtbGltaXRlZCwgJU5VTC10ZXJtaW5hdGVkIHN0cmluZyB0byBhbm90aGVyCisgKiBAZGVzdDogVGhlIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0bworICogQHNyYzogVGhlIHN0cmluZyB0byBhcHBlbmQgdG8gaXQKKyAqIEBjb3VudDogVGhlIG1heGltdW0gbnVtYmVycyBvZiBieXRlcyB0byBjb3B5CisgKgorICogTm90ZSB0aGF0IGluIGNvbnRyYXN0IHRvIHN0cm5jcHksIHN0cm5jYXQgZW5zdXJlcyB0aGUgcmVzdWx0IGlzCisgKiB0ZXJtaW5hdGVkLgorICovCitjaGFyICogc3RybmNhdChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBjb3VudCkKK3sKKwljaGFyICp0bXAgPSBkZXN0OworCisJaWYgKGNvdW50KSB7CisJCXdoaWxlICgqZGVzdCkKKwkJCWRlc3QrKzsKKwkJd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSkgeworCQkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJCSpkZXN0ID0gJ1wwJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB0bXA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDTVAKKy8qKgorICogc3RyY21wIC0gQ29tcGFyZSB0d28gc3RyaW5ncworICogQGNzOiBPbmUgc3RyaW5nCisgKiBAY3Q6IEFub3RoZXIgc3RyaW5nCisgKi8KK2ludCBzdHJjbXAoY29uc3QgY2hhciAqIGNzLGNvbnN0IGNoYXIgKiBjdCkKK3sKKwlyZWdpc3RlciBzaWduZWQgY2hhciBfX3JlczsKKworCXdoaWxlICgxKSB7CisJCWlmICgoX19yZXMgPSAqY3MgLSAqY3QrKykgIT0gMCB8fCAhKmNzKyspCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gX19yZXM7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ01QCisvKioKKyAqIHN0cm5jbXAgLSBDb21wYXJlIHR3byBsZW5ndGgtbGltaXRlZCBzdHJpbmdzCisgKiBAY3M6IE9uZSBzdHJpbmcKKyAqIEBjdDogQW5vdGhlciBzdHJpbmcKKyAqIEBjb3VudDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUKKyAqLworaW50IHN0cm5jbXAoY29uc3QgY2hhciAqIGNzLGNvbnN0IGNoYXIgKiBjdCxzaXplX3QgY291bnQpCit7CisJcmVnaXN0ZXIgc2lnbmVkIGNoYXIgX19yZXMgPSAwOworCisJd2hpbGUgKGNvdW50KSB7CisJCWlmICgoX19yZXMgPSAqY3MgLSAqY3QrKykgIT0gMCB8fCAhKmNzKyspCisJCQlicmVhazsKKwkJY291bnQtLTsKKwl9CisKKwlyZXR1cm4gX19yZXM7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDSFIKKy8qKgorICogc3RyY2hyIC0gRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIGNoYXJhY3RlciBpbiBhIHN0cmluZworICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAqIEBjOiBUaGUgY2hhcmFjdGVyIHRvIHNlYXJjaCBmb3IKKyAqLworY2hhciAqIHN0cmNocihjb25zdCBjaGFyICogcywgaW50IGMpCit7CisJZm9yKDsgKnMgIT0gKGNoYXIpIGM7ICsrcykKKwkJaWYgKCpzID09ICdcMCcpCisJCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gKGNoYXIgKikgczsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlJDSFIKKy8qKgorICogc3RycmNociAtIEZpbmQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIGNoYXJhY3RlciBpbiBhIHN0cmluZworICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAqIEBjOiBUaGUgY2hhcmFjdGVyIHRvIHNlYXJjaCBmb3IKKyAqLworY2hhciAqIHN0cnJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKQoreworICAgICAgIGNvbnN0IGNoYXIgKnAgPSBzICsgc3RybGVuKHMpOworICAgICAgIGRvIHsKKyAgICAgICAgICAgaWYgKCpwID09IChjaGFyKWMpCisgICAgICAgICAgICAgICByZXR1cm4gKGNoYXIgKilwOworICAgICAgIH0gd2hpbGUgKC0tcCA+PSBzKTsKKyAgICAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkxFTgorLyoqCisgKiBzdHJsZW4gLSBGaW5kIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcKKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNpemVkCisgKi8KK3NpemVfdCBzdHJsZW4oY29uc3QgY2hhciAqIHMpCit7CisJY29uc3QgY2hhciAqc2M7CisKKwlmb3IgKHNjID0gczsgKnNjICE9ICdcMCc7ICsrc2MpCisJCS8qIG5vdGhpbmcgKi87CisJcmV0dXJuIHNjIC0gczsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5MRU4KKy8qKgorICogc3RybmxlbiAtIEZpbmQgdGhlIGxlbmd0aCBvZiBhIGxlbmd0aC1saW1pdGVkIHN0cmluZworICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2l6ZWQKKyAqIEBjb3VudDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNlYXJjaAorICovCitzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICogcywgc2l6ZV90IGNvdW50KQoreworCWNvbnN0IGNoYXIgKnNjOworCisJZm9yIChzYyA9IHM7IGNvdW50LS0gJiYgKnNjICE9ICdcMCc7ICsrc2MpCisJCS8qIG5vdGhpbmcgKi87CisJcmV0dXJuIHNjIC0gczsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkRVUAorY2hhciAqIHN0cmR1cChjb25zdCBjaGFyICpzKQoreworCWNoYXIgKm5ldzsKKworCWlmICgocyA9PSBOVUxMKQl8fAorCSAgICAoKG5ldyA9IG1hbGxvYyAoc3RybGVuKHMpICsgMSkpID09IE5VTEwpICkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzdHJjcHkgKG5ldywgcyk7CisJcmV0dXJuIG5ldzsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlNQTgorLyoqCisgKiBzdHJzcG4gLSBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzdWJzdHJpbmcgb2YgQHMgd2hpY2ggb25seQorICogCWNvbnRhaW4gbGV0dGVycyBpbiBAYWNjZXB0CisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICogQGFjY2VwdDogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yCisgKi8KK3NpemVfdCBzdHJzcG4oY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqYWNjZXB0KQoreworCWNvbnN0IGNoYXIgKnA7CisJY29uc3QgY2hhciAqYTsKKwlzaXplX3QgY291bnQgPSAwOworCisJZm9yIChwID0gczsgKnAgIT0gJ1wwJzsgKytwKSB7CisJCWZvciAoYSA9IGFjY2VwdDsgKmEgIT0gJ1wwJzsgKythKSB7CisJCQlpZiAoKnAgPT0gKmEpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCphID09ICdcMCcpCisJCQlyZXR1cm4gY291bnQ7CisJCSsrY291bnQ7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSUEJSSworLyoqCisgKiBzdHJwYnJrIC0gRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHNldCBvZiBjaGFyYWN0ZXJzCisgKiBAY3M6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAqIEBjdDogVGhlIGNoYXJhY3RlcnMgdG8gc2VhcmNoIGZvcgorICovCitjaGFyICogc3RycGJyayhjb25zdCBjaGFyICogY3MsY29uc3QgY2hhciAqIGN0KQoreworCWNvbnN0IGNoYXIgKnNjMSwqc2MyOworCisJZm9yKCBzYzEgPSBjczsgKnNjMSAhPSAnXDAnOyArK3NjMSkgeworCQlmb3IoIHNjMiA9IGN0OyAqc2MyICE9ICdcMCc7ICsrc2MyKSB7CisJCQlpZiAoKnNjMSA9PSAqc2MyKQorCQkJCXJldHVybiAoY2hhciAqKSBzYzE7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJUT0sKKy8qKgorICogc3RydG9rIC0gU3BsaXQgYSBzdHJpbmcgaW50byB0b2tlbnMKKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAY3Q6IFRoZSBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKKyAqCisgKiBXQVJOSU5HOiBzdHJ0b2sgaXMgZGVwcmVjYXRlZCwgdXNlIHN0cnNlcCBpbnN0ZWFkLgorICovCitjaGFyICogc3RydG9rKGNoYXIgKiBzLGNvbnN0IGNoYXIgKiBjdCkKK3sKKwljaGFyICpzYmVnaW4sICpzZW5kOworCisJc2JlZ2luICA9IHMgPyBzIDogX19fc3RydG9rOworCWlmICghc2JlZ2luKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlzYmVnaW4gKz0gc3Ryc3BuKHNiZWdpbixjdCk7CisJaWYgKCpzYmVnaW4gPT0gJ1wwJykgeworCQlfX19zdHJ0b2sgPSBOVUxMOworCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisJc2VuZCA9IHN0cnBicmsoIHNiZWdpbiwgY3QpOworCWlmIChzZW5kICYmICpzZW5kICE9ICdcMCcpCisJCSpzZW5kKysgPSAnXDAnOworCV9fX3N0cnRvayA9IHNlbmQ7CisJcmV0dXJuIChzYmVnaW4pOworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSU0VQCisvKioKKyAqIHN0cnNlcCAtIFNwbGl0IGEgc3RyaW5nIGludG8gdG9rZW5zCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICogQGN0OiBUaGUgY2hhcmFjdGVycyB0byBzZWFyY2ggZm9yCisgKgorICogc3Ryc2VwKCkgdXBkYXRlcyBAcyB0byBwb2ludCBhZnRlciB0aGUgdG9rZW4sIHJlYWR5IGZvciB0aGUgbmV4dCBjYWxsLgorICoKKyAqIEl0IHJldHVybnMgZW1wdHkgdG9rZW5zLCB0b28sIGJlaGF2aW5nIGV4YWN0bHkgbGlrZSB0aGUgbGliYyBmdW5jdGlvbgorICogb2YgdGhhdCBuYW1lLiBJbiBmYWN0LCBpdCB3YXMgc3RvbGVuIGZyb20gZ2xpYmMyIGFuZCBkZS1mYW5jeS1maWVkLgorICogU2FtZSBzZW1hbnRpY3MsIHNsaW1tZXIgc2hhcGUuIDspCisgKi8KK2NoYXIgKiBzdHJzZXAoY2hhciAqKnMsIGNvbnN0IGNoYXIgKmN0KQoreworCWNoYXIgKnNiZWdpbiA9ICpzLCAqZW5kOworCisJaWYgKHNiZWdpbiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWVuZCA9IHN0cnBicmsoc2JlZ2luLCBjdCk7CisJaWYgKGVuZCkKKwkJKmVuZCsrID0gJ1wwJzsKKwkqcyA9IGVuZDsKKworCXJldHVybiBzYmVnaW47Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1TRVQKKy8qKgorICogbWVtc2V0IC0gRmlsbCBhIHJlZ2lvbiBvZiBtZW1vcnkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUKKyAqIEBzOiBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYXJlYS4KKyAqIEBjOiBUaGUgYnl0ZSB0byBmaWxsIHRoZSBhcmVhIHdpdGgKKyAqIEBjb3VudDogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKgorICogRG8gbm90IHVzZSBtZW1zZXQoKSB0byBhY2Nlc3MgSU8gc3BhY2UsIHVzZSBtZW1zZXRfaW8oKSBpbnN0ZWFkLgorICovCit2b2lkICogbWVtc2V0KHZvaWQgKiBzLGludCBjLHNpemVfdCBjb3VudCkKK3sKKwljaGFyICp4cyA9IChjaGFyICopIHM7CisKKwl3aGlsZSAoY291bnQtLSkKKwkJKnhzKysgPSBjOworCisJcmV0dXJuIHM7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9CQ09QWQorLyoqCisgKiBiY29weSAtIENvcHkgb25lIGFyZWEgb2YgbWVtb3J5IHRvIGFub3RoZXIKKyAqIEBzcmM6IFdoZXJlIHRvIGNvcHkgZnJvbQorICogQGRlc3Q6IFdoZXJlIHRvIGNvcHkgdG8KKyAqIEBjb3VudDogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKgorICogTm90ZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgYXMgbWVtY3B5KCksIHdpdGggdGhlIGFyZ3VtZW50cyByZXZlcnNlZC4KKyAqIG1lbWNweSgpIGlzIHRoZSBzdGFuZGFyZCwgYmNvcHkoKSBpcyBhIGxlZ2FjeSBCU0QgZnVuY3Rpb24uCisgKgorICogWW91IHNob3VsZCBub3QgdXNlIHRoaXMgZnVuY3Rpb24gdG8gYWNjZXNzIElPIHNwYWNlLCB1c2UgbWVtY3B5X3RvaW8oKQorICogb3IgbWVtY3B5X2Zyb21pbygpIGluc3RlYWQuCisgKi8KK2NoYXIgKiBiY29weShjb25zdCBjaGFyICogc3JjLCBjaGFyICogZGVzdCwgaW50IGNvdW50KQoreworCWNoYXIgKnRtcCA9IGRlc3Q7CisKKwl3aGlsZSAoY291bnQtLSkKKwkJKnRtcCsrID0gKnNyYysrOworCisJcmV0dXJuIGRlc3Q7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DUFkKKy8qKgorICogbWVtY3B5IC0gQ29weSBvbmUgYXJlYSBvZiBtZW1vcnkgdG8gYW5vdGhlcgorICogQGRlc3Q6IFdoZXJlIHRvIGNvcHkgdG8KKyAqIEBzcmM6IFdoZXJlIHRvIGNvcHkgZnJvbQorICogQGNvdW50OiBUaGUgc2l6ZSBvZiB0aGUgYXJlYS4KKyAqCisgKiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiB0byBhY2Nlc3MgSU8gc3BhY2UsIHVzZSBtZW1jcHlfdG9pbygpCisgKiBvciBtZW1jcHlfZnJvbWlvKCkgaW5zdGVhZC4KKyAqLwordm9pZCAqIG1lbWNweSh2b2lkICogZGVzdCxjb25zdCB2b2lkICpzcmMsc2l6ZV90IGNvdW50KQoreworCWNoYXIgKnRtcCA9IChjaGFyICopIGRlc3QsICpzID0gKGNoYXIgKikgc3JjOworCisJd2hpbGUgKGNvdW50LS0pCisJCSp0bXArKyA9ICpzKys7CisKKwlyZXR1cm4gZGVzdDsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTU1PVkUKKy8qKgorICogbWVtbW92ZSAtIENvcHkgb25lIGFyZWEgb2YgbWVtb3J5IHRvIGFub3RoZXIKKyAqIEBkZXN0OiBXaGVyZSB0byBjb3B5IHRvCisgKiBAc3JjOiBXaGVyZSB0byBjb3B5IGZyb20KKyAqIEBjb3VudDogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKgorICogVW5saWtlIG1lbWNweSgpLCBtZW1tb3ZlKCkgY29wZXMgd2l0aCBvdmVybGFwcGluZyBhcmVhcy4KKyAqLwordm9pZCAqIG1lbW1vdmUodm9pZCAqIGRlc3QsY29uc3Qgdm9pZCAqc3JjLHNpemVfdCBjb3VudCkKK3sKKwljaGFyICp0bXAsICpzOworCisJaWYgKGRlc3QgPD0gc3JjKSB7CisJCXRtcCA9IChjaGFyICopIGRlc3Q7CisJCXMgPSAoY2hhciAqKSBzcmM7CisJCXdoaWxlIChjb3VudC0tKQorCQkJKnRtcCsrID0gKnMrKzsKKwkJfQorCWVsc2UgeworCQl0bXAgPSAoY2hhciAqKSBkZXN0ICsgY291bnQ7CisJCXMgPSAoY2hhciAqKSBzcmMgKyBjb3VudDsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqLS10bXAgPSAqLS1zOworCQl9CisKKwlyZXR1cm4gZGVzdDsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNNUAorLyoqCisgKiBtZW1jbXAgLSBDb21wYXJlIHR3byBhcmVhcyBvZiBtZW1vcnkKKyAqIEBjczogT25lIGFyZWEgb2YgbWVtb3J5CisgKiBAY3Q6IEFub3RoZXIgYXJlYSBvZiBtZW1vcnkKKyAqIEBjb3VudDogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKi8KK2ludCBtZW1jbXAoY29uc3Qgdm9pZCAqIGNzLGNvbnN0IHZvaWQgKiBjdCxzaXplX3QgY291bnQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc3UxLCAqc3UyOworCWludCByZXMgPSAwOworCisJZm9yKCBzdTEgPSBjcywgc3UyID0gY3Q7IDAgPCBjb3VudDsgKytzdTEsICsrc3UyLCBjb3VudC0tKQorCQlpZiAoKHJlcyA9ICpzdTEgLSAqc3UyKSAhPSAwKQorCQkJYnJlYWs7CisJcmV0dXJuIHJlczsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTVNDQU4KKy8qKgorICogbWVtc2NhbiAtIEZpbmQgYSBjaGFyYWN0ZXIgaW4gYW4gYXJlYSBvZiBtZW1vcnkuCisgKiBAYWRkcjogVGhlIG1lbW9yeSBhcmVhCisgKiBAYzogVGhlIGJ5dGUgdG8gc2VhcmNoIGZvcgorICogQHNpemU6IFRoZSBzaXplIG9mIHRoZSBhcmVhLgorICoKKyAqIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQGMsIG9yIDEgYnl0ZSBwYXN0CisgKiB0aGUgYXJlYSBpZiBAYyBpcyBub3QgZm91bmQKKyAqLwordm9pZCAqIG1lbXNjYW4odm9pZCAqIGFkZHIsIGludCBjLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBjaGFyICogcCA9ICh1bnNpZ25lZCBjaGFyICopIGFkZHI7CisKKwl3aGlsZSAoc2l6ZSkgeworCQlpZiAoKnAgPT0gYykKKwkJCXJldHVybiAodm9pZCAqKSBwOworCQlwKys7CisJCXNpemUtLTsKKwl9CisgIAlyZXR1cm4gKHZvaWQgKikgcDsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlNUUgorLyoqCisgKiBzdHJzdHIgLSBGaW5kIHRoZSBmaXJzdCBzdWJzdHJpbmcgaW4gYSAlTlVMIHRlcm1pbmF0ZWQgc3RyaW5nCisgKiBAczE6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAqIEBzMjogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yCisgKi8KK2NoYXIgKiBzdHJzdHIoY29uc3QgY2hhciAqIHMxLGNvbnN0IGNoYXIgKiBzMikKK3sKKwlpbnQgbDEsIGwyOworCisJbDIgPSBzdHJsZW4oczIpOworCWlmICghbDIpCisJCXJldHVybiAoY2hhciAqKSBzMTsKKwlsMSA9IHN0cmxlbihzMSk7CisJd2hpbGUgKGwxID49IGwyKSB7CisJCWwxLS07CisJCWlmICghbWVtY21wKHMxLHMyLGwyKSkKKwkJCXJldHVybiAoY2hhciAqKSBzMTsKKwkJczErKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DSFIKKy8qKgorICogbWVtY2hyIC0gRmluZCBhIGNoYXJhY3RlciBpbiBhbiBhcmVhIG9mIG1lbW9yeS4KKyAqIEBzOiBUaGUgbWVtb3J5IGFyZWEKKyAqIEBjOiBUaGUgYnl0ZSB0byBzZWFyY2ggZm9yCisgKiBAbjogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKgorICogcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBAYywgb3IgJU5VTEwKKyAqIGlmIEBjIGlzIG5vdCBmb3VuZAorICovCit2b2lkICptZW1jaHIoY29uc3Qgdm9pZCAqcywgaW50IGMsIHNpemVfdCBuKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBzOworCXdoaWxlIChuLS0gIT0gMCkgeworICAgICAgICAJaWYgKCh1bnNpZ25lZCBjaGFyKWMgPT0gKnArKykgeworCQkJcmV0dXJuICh2b2lkICopKHAtMSk7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2V0aC5jIGIvbmV0L2V0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMDY0NDAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZXRoLmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEsIDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQorCisjaWZkZWYgQ0ZHX0dUXzY0MjZ4CitleHRlcm4gaW50IGd0NjQyNnhfZXRoX2luaXRpYWxpemUoYmRfdCAqYmlzKTsKKyNlbmRpZgorCitleHRlcm4gaW50IGVlcHJvMTAwX2luaXRpYWxpemUoYmRfdCopOworZXh0ZXJuIGludCBuYXRzZW1pX2luaXRpYWxpemUoYmRfdCopOworZXh0ZXJuIGludCBuczgzODJ4X2luaXRpYWxpemUoYmRfdCopOworZXh0ZXJuIGludCBkYzIxeDR4X2luaXRpYWxpemUoYmRfdCopOworZXh0ZXJuIGludCBwY25ldF9pbml0aWFsaXplKGJkX3QqKTsKK2V4dGVybiBpbnQgZmVjX2luaXRpYWxpemUoYmRfdCopOworZXh0ZXJuIGludCBzY2NfaW5pdGlhbGl6ZShiZF90Kik7CisKK3N0YXRpYyBzdHJ1Y3QgZXRoX2RldmljZSAqZXRoX2RldmljZXMsICpldGhfY3VycmVudDsKKworc3RydWN0IGV0aF9kZXZpY2UgKmV0aF9nZXRfZGV2KHZvaWQpCit7CisJcmV0dXJuIGV0aF9jdXJyZW50OworfQorCitpbnQgZXRoX2dldF9kZXZfaW5kZXggKHZvaWQpCit7CisJc3RydWN0IGV0aF9kZXZpY2UgKmRldjsKKwlpbnQgbnVtID0gMDsKKworCWlmICghZXRoX2RldmljZXMpIHsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJZm9yIChkZXYgPSBldGhfZGV2aWNlczsgZGV2OyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJaWYgKGRldiA9PSBldGhfY3VycmVudCkKKwkJCWJyZWFrOworCQkrK251bTsKKwl9CisKKwlpZiAoZGV2KSB7CisJCXJldHVybiAobnVtKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitpbnQgZXRoX3JlZ2lzdGVyKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IGV0aF9kZXZpY2UgKmQ7CisKKwlpZiAoIWV0aF9kZXZpY2VzKSB7CisJCWV0aF9jdXJyZW50ID0gZXRoX2RldmljZXMgPSBkZXY7CisJfSBlbHNlIHsKKwkJZm9yIChkPWV0aF9kZXZpY2VzOyBkLT5uZXh0IT1ldGhfZGV2aWNlczsgZD1kLT5uZXh0KTsKKwkJZC0+bmV4dCA9IGRldjsKKwl9CisKKwlkZXYtPnN0YXRlID0gRVRIX1NUQVRFX0lOSVQ7CisJZGV2LT5uZXh0ICA9IGV0aF9kZXZpY2VzOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBldGhfaW5pdGlhbGl6ZShiZF90ICpiaXMpCit7CisJdW5zaWduZWQgY2hhciBlbmV0dmFyWzMyXSwgZW52X2VuZXRhZGRyWzZdOworCWludCBpLCBldGhfbnVtYmVyID0gMDsKKwljaGFyICp0bXAsICplbmQ7CisKKwlldGhfZGV2aWNlcyA9IE5VTEw7CisJZXRoX2N1cnJlbnQgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX0VFUFJPMTAwCisJZWVwcm8xMDBfaW5pdGlhbGl6ZShiaXMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RVTElQCisJZGMyMXg0eF9pbml0aWFsaXplKGJpcyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUENORVQKKwlwY25ldF9pbml0aWFsaXplKGJpcyk7CisjZW5kaWYKKyNpZmRlZiBDRkdfR1RfNjQyNngKKwlndDY0MjZ4X2V0aF9pbml0aWFsaXplKGJpcyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkFUU0VNSQorCW5hdHNlbWlfaW5pdGlhbGl6ZShiaXMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX05TODM4MlgKKwluczgzODJ4X2luaXRpYWxpemUoYmlzKTsKKyNlbmRpZgorI2lmZGVmIFNDQ19FTkVUCisJc2NjX2luaXRpYWxpemUoYmlzKTsKKyNlbmRpZgorI2lmZGVmIEZFQ19FTkVUCisJZmVjX2luaXRpYWxpemUoYmlzKTsKKyNlbmRpZgorCisJaWYgKCFldGhfZGV2aWNlcykgeworCQlwdXRzICgiTm8gZXRoZXJuZXQgZm91bmQuXG4iKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZXRoX2RldmljZSAqZGV2ID0gZXRoX2RldmljZXM7CisJCWNoYXIgKmV0aHByaW1lID0gZ2V0ZW52ICgiZXRocHJpbWUiKTsKKworCQlkbyB7CisJCQlpZiAoZXRoX251bWJlcikKKwkJCQlwdXRzICgiLCAiKTsKKworCQkJcHJpbnRmKCIlcyIsIGRldi0+bmFtZSk7CisKKwkJCWlmIChldGhwcmltZSAmJiBzdHJjbXAgKGRldi0+bmFtZSwgZXRocHJpbWUpID09IDApIHsKKwkJCQlldGhfY3VycmVudCA9IGRldjsKKwkJCQlwdXRzICgiIFtQUklNRV0iKTsKKwkJCX0KKworCQkJc3ByaW50ZihlbmV0dmFyLCBldGhfbnVtYmVyID8gImV0aCVkYWRkciIgOiAiZXRoYWRkciIsIGV0aF9udW1iZXIpOworCQkJdG1wID0gZ2V0ZW52IChlbmV0dmFyKTsKKworCQkJZm9yIChpPTA7IGk8NjsgaSsrKSB7CisJCQkJZW52X2VuZXRhZGRyW2ldID0gdG1wID8gc2ltcGxlX3N0cnRvdWwodG1wLCAmZW5kLCAxNikgOiAwOworCQkJCWlmICh0bXApCisJCQkJCXRtcCA9ICgqZW5kKSA/IGVuZCsxIDogZW5kOworCQkJfQorCisJCQlpZiAobWVtY21wKGVudl9lbmV0YWRkciwgIlwwXDBcMFwwXDBcMCIsIDYpKSB7CisJCQkJaWYgKG1lbWNtcChkZXYtPmVuZXRhZGRyLCAiXDBcMFwwXDBcMFwwIiwgNikgJiYKKwkJCQkgICAgbWVtY21wKGRldi0+ZW5ldGFkZHIsIGVudl9lbmV0YWRkciwgNikpCisJCQkJeworCQkJCQlwcmludGYoIlxuV2FybmluZzogJXMgSFcgYWRkcmVzcyBkb24ndCBtYXRjaDpcbiIsIGRldi0+bmFtZSk7CisJCQkJCXByaW50ZigiQWRkcmVzcyBpbiBTUk9NIGlzICAgICAgICAgIgorCQkJCQkgICAgICAgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQkJCQkgICAgICAgZGV2LT5lbmV0YWRkclswXSwgZGV2LT5lbmV0YWRkclsxXSwKKwkJCQkJICAgICAgIGRldi0+ZW5ldGFkZHJbMl0sIGRldi0+ZW5ldGFkZHJbM10sCisJCQkJCSAgICAgICBkZXYtPmVuZXRhZGRyWzRdLCBkZXYtPmVuZXRhZGRyWzVdKTsKKwkJCQkJcHJpbnRmKCJBZGRyZXNzIGluIGVudmlyb25tZW50IGlzICAiCisJCQkJCSAgICAgICAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCQkJCSAgICAgICBlbnZfZW5ldGFkZHJbMF0sIGVudl9lbmV0YWRkclsxXSwKKwkJCQkJICAgICAgIGVudl9lbmV0YWRkclsyXSwgZW52X2VuZXRhZGRyWzNdLAorCQkJCQkgICAgICAgZW52X2VuZXRhZGRyWzRdLCBlbnZfZW5ldGFkZHJbNV0pOworCQkJCX0KKworCQkJCW1lbWNweShkZXYtPmVuZXRhZGRyLCBlbnZfZW5ldGFkZHIsIDYpOworCQkJfQorCisJCQlldGhfbnVtYmVyKys7CisJCQlkZXYgPSBkZXYtPm5leHQ7CisJCX0gd2hpbGUoZGV2ICE9IGV0aF9kZXZpY2VzKTsKKworCQlwdXRjICgnXG4nKTsKKwl9CisKKwlyZXR1cm4gZXRoX251bWJlcjsKK30KKwordm9pZCBldGhfc2V0X2VuZXRhZGRyKGludCBudW0sIGNoYXIgKmFkZHIpIHsKKwlzdHJ1Y3QgZXRoX2RldmljZSAqZGV2OworCXVuc2lnbmVkIGNoYXIgZW5ldGFkZHJbNl07CisJY2hhciAqZW5kOworCWludCBpOworCisjaWZkZWYgREVCVUcKKwlwcmludGYoImV0aF9zZXRfZW5ldGFkZHIobnVtPSVkLCBhZGRyPSVzKVxuIiwgbnVtLCBhZGRyKTsKKyNlbmRpZgorCWlmICghZXRoX2RldmljZXMpCisJCXJldHVybjsKKworCWZvciAoaT0wOyBpPDY7IGkrKykgeworCQllbmV0YWRkcltpXSA9IGFkZHIgPyBzaW1wbGVfc3RydG91bChhZGRyLCAmZW5kLCAxNikgOiAwOworCQlpZiAoYWRkcikKKwkJCWFkZHIgPSAoKmVuZCkgPyBlbmQrMSA6IGVuZDsKKwl9CisKKwlkZXYgPSBldGhfZGV2aWNlczsKKwl3aGlsZShudW0tLSA+IDApIHsKKwkJZGV2ID0gZGV2LT5uZXh0OworCisJCWlmIChkZXYgPT0gZXRoX2RldmljZXMpCisJCQlyZXR1cm47CisJfQorCisjaWZkZWYgREVCVUcKKwlwcmludGYoIlNldHRpbmcgbmV3IEhXIGFkZHJlc3Mgb24gJXNcbiIsIGRldi0+bmFtZSk7CisJcHJpbnRmKCJOZXcgQWRkcmVzcyBpcyAgICAgICAgICAgICAiCisJICAgICAgICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgZGV2LT5lbmV0YWRkclswXSwgZGV2LT5lbmV0YWRkclsxXSwKKwkgICAgICAgZGV2LT5lbmV0YWRkclsyXSwgZGV2LT5lbmV0YWRkclszXSwKKwkgICAgICAgZGV2LT5lbmV0YWRkcls0XSwgZGV2LT5lbmV0YWRkcls1XSk7CisjZW5kaWYKKworCW1lbWNweShkZXYtPmVuZXRhZGRyLCBlbmV0YWRkciwgNik7Cit9CisKK2ludCBldGhfaW5pdChiZF90ICpiaXMpCit7CisJc3RydWN0IGV0aF9kZXZpY2UqIG9sZF9jdXJyZW50OworCisJaWYgKCFldGhfY3VycmVudCkKKwkJcmV0dXJuIDA7CisKKwlvbGRfY3VycmVudCA9IGV0aF9jdXJyZW50OworCWRvIHsKKyNpZmRlZiBERUJVRworCQlwcmludGYoIlRyeWluZyAlc1xuIiwgZXRoX2N1cnJlbnQtPm5hbWUpOworI2VuZGlmCisKKwkJaWYgKGV0aF9jdXJyZW50LT5pbml0KGV0aF9jdXJyZW50LCBiaXMpKSB7CisJCQlldGhfY3VycmVudC0+c3RhdGUgPSBFVEhfU1RBVEVfQUNUSVZFOworCisJCQlwcmludGYoIiVzIGNvbmZpZ3VyZWRcbiIsIGV0aF9jdXJyZW50LT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9CisKKyNpZmRlZiBERUJVRworCQlwdXRzICgiRkFJTFxuIik7CisjZW5kaWYKKworCQlldGhfdHJ5X2Fub3RoZXIoMCk7CisJfSB3aGlsZSAob2xkX2N1cnJlbnQgIT0gZXRoX2N1cnJlbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZXRoX2hhbHQodm9pZCkKK3sKKwlpZiAoIWV0aF9jdXJyZW50KQorCQlyZXR1cm47CisKKwlldGhfY3VycmVudC0+aGFsdChldGhfY3VycmVudCk7CisKKwlldGhfY3VycmVudC0+c3RhdGUgPSBFVEhfU1RBVEVfUEFTU0lWRTsKK30KKworaW50IGV0aF9zZW5kKHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCkKK3sKKwlpZiAoIWV0aF9jdXJyZW50KQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gZXRoX2N1cnJlbnQtPnNlbmQoZXRoX2N1cnJlbnQsIHBhY2tldCwgbGVuZ3RoKTsKK30KKworaW50IGV0aF9yeCh2b2lkKQoreworCWlmICghZXRoX2N1cnJlbnQpCisJCXJldHVybiAtMTsKKworCXJldHVybiBldGhfY3VycmVudC0+cmVjdihldGhfY3VycmVudCk7Cit9CisKK3ZvaWQgZXRoX3RyeV9hbm90aGVyKGludCBmaXJzdF9yZXN0YXJ0KQoreworCXN0YXRpYyBzdHJ1Y3QgZXRoX2RldmljZSAqZmlyc3RfZmFpbGVkID0gTlVMTDsKKworCWlmICghZXRoX2N1cnJlbnQpCisJCXJldHVybjsKKworCWlmIChmaXJzdF9yZXN0YXJ0KQorCXsKKwkJZmlyc3RfZmFpbGVkID0gZXRoX2N1cnJlbnQ7CisJfQorCisJZXRoX2N1cnJlbnQgPSBldGhfY3VycmVudC0+bmV4dDsKKworCWlmIChmaXJzdF9mYWlsZWQgPT0gZXRoX2N1cnJlbnQpCisJeworCQlOZXRSZXN0YXJ0V3JhcCA9IDE7CisJfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Bvc3QvY2FjaGVfOHh4LlMgYi9wb3N0L2NhY2hlXzh4eC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWMyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2NhY2hlXzh4eC5TCkBAIC0wLDAgKzEsNDk1IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmZGVmIENPTkZJR19QT1NUCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODIzKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTVBDODUwKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTVBDODU1KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTVBDODYwKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTVBDODI0WCkKKworI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKworI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfQ0FDSEUKKworCS50ZXh0CisKK2NhY2hlX3Bvc3RfZGludmFsaWRhdGU6CisJbGlzCXIxMCwgSURDX0lOVkFMTEBoCisJbXRzcHIJRENfQ1NULCByMTAKKwlibHIKKworY2FjaGVfcG9zdF9paW52YWxpZGF0ZToKKwlsaXMJcjEwLCBJRENfSU5WQUxMQGgKKwltdHNwcglJQ19DU1QsIHIxMAorCWlzeW5jCisJYmxyCisKK2NhY2hlX3Bvc3RfZGRpc2FibGU6CisJbGlzCXIxMCwgSURDX0RJU0FCTEVAaAorCW10c3ByCURDX0NTVCwgcjEwCisJYmxyCisKK2NhY2hlX3Bvc3RfZHdiOgorCWxpcwlyMTAsIElEQ19FTkFCTEVAaAorCW10c3ByCURDX0NTVCwgcjEwCisJbGlzCXIxMCwgRENfQ0ZXVEBoCisJbXRzcHIJRENfQ1NULCByMTAKKwlibHIKKworY2FjaGVfcG9zdF9kd3Q6CisJbGlzCXIxMCwgSURDX0VOQUJMRUBoCisJbXRzcHIJRENfQ1NULCByMTAKKwlsaXMJcjEwLCBEQ19TRldUQGgKKwltdHNwcglEQ19DU1QsIHIxMAorCWJscgorCitjYWNoZV9wb3N0X2lkaXNhYmxlOgorCWxpcwlyMTAsIElEQ19ESVNBQkxFQGgKKwltdHNwcglJQ19DU1QsIHIxMAorCWlzeW5jCisJYmxyCisKK2NhY2hlX3Bvc3RfaWVuYWJsZToKKwlsaXMJcjEwLCBJRENfRU5BQkxFQGgKKwltdHNwcglJQ19DU1QsIHIxMAorCWlzeW5jCisJYmxyCisKK2NhY2hlX3Bvc3RfaXVubG9jazoKKwlsaXMJcjEwLCBJRENfVU5BTExAaAorCW10c3ByCUlDX0NTVCwgcjEwCisJaXN5bmMKKwlibHIKKworY2FjaGVfcG9zdF9pbG9jazoKKwltdHNwcglJQ19BRFIsIHIzCisJbGlzCXIxMCwgSURDX0xETENLQGgKKwltdHNwcglJQ19DU1QsIHIxMAorCWlzeW5jCisJYmxyCisKKy8qCisgKiB0dXJuIG9uIHRoZSBkYXRhIGNhY2hlCisgKiBzd2l0Y2ggdGhlIGRhdGEgY2FjaGUgdG8gd3JpdGUtYmFjayBvciB3cml0ZS10aHJvdWdoIG1vZGUKKyAqIGludmFsaWRhdGUgdGhlIGRhdGEgY2FjaGUKKyAqIHdyaXRlIHRoZSBuZWdhdGl2ZSBwYXR0ZXJuIHRvIGEgY2FjaGVkIGFyZWEKKyAqIHJlYWQgdGhlIGFyZWEKKyAqCisgKiBUaGUgbmVnYXRpdmUgcGF0dGVybiBtdXN0IGJlIHJlYWQgYXQgdGhlIGxhc3Qgc3RlcAorICovCisJLmdsb2JhbCBjYWNoZV9wb3N0X3Rlc3QxCitjYWNoZV9wb3N0X3Rlc3QxOgorCW1mbHIJcjAKKwlzdHcJcjAsIDQocjEpCisKKwlzdHd1CXIzLCAtNChyMSkKKwlzdHd1CXI0LCAtNChyMSkKKworCWJsCWNhY2hlX3Bvc3RfZHdiCisJYmwJY2FjaGVfcG9zdF9kaW52YWxpZGF0ZQorCisJLyogV3JpdGUgdGhlIG5lZ2F0aXZlIHBhdHRlcm4gdG8gdGhlIHRlc3QgYXJlYSAqLworCWx3eglyMCwgMChyMSkKKwltdGN0cglyMAorCWxpCXIwLCAweGZmCisJbHd6CXIzLCA0KHIxKQorCXN1YmkJcjMsIHIzLCAxCisxOgorCXN0YnUJcjAsIDEocjMpCisJYmRuegkxYgorCisJLyogUmVhZCB0aGUgdGVzdCBhcmVhICovCisJbHd6CXIwLCAwKHIxKQorCW10Y3RyCXIwCisJbHd6CXI0LCA0KHIxKQorCXN1YmkJcjQsIHI0LCAxCisJbGkJcjMsIDAKKzE6CisJbGJ6dQlyMCwgMShyNCkKKwljbXBsaQljcjAsIHIwLCAweGZmCisJYmVxCTJmCisJbGkJcjMsIC0xCisJYgkzZgorMjoKKwliZG56CTFiCiszOgorCisJYmwJY2FjaGVfcG9zdF9kZGlzYWJsZQorCWJsCWNhY2hlX3Bvc3RfZGludmFsaWRhdGUKKworCWFkZGkJcjEsIHIxLCA4CisKKwlsd3oJcjAsIDQocjEpCisJbXRscglyMAorCWJscgorCisvKgorICogdHVybiBvbiB0aGUgZGF0YSBjYWNoZQorICogc3dpdGNoIHRoZSBkYXRhIGNhY2hlIHRvIHdyaXRlLWJhY2sgb3Igd3JpdGUtdGhyb3VnaCBtb2RlCisgKiBpbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlCisgKiB3cml0ZSB0aGUgemVybyBwYXR0ZXJuIHRvIGEgY2FjaGVkIGFyZWEKKyAqIHR1cm4gb2ZmIHRoZSBkYXRhIGNhY2hlCisgKiB3cml0ZSB0aGUgbmVnYXRpdmUgcGF0dGVybiB0byB0aGUgYXJlYQorICogdHVybiBvbiB0aGUgZGF0YSBjYWNoZQorICogcmVhZCB0aGUgYXJlYQorICoKKyAqIFRoZSBuZWdhdGl2ZSBwYXR0ZXJuIG11c3QgYmUgcmVhZCBhdCB0aGUgbGFzdCBzdGVwCisgKi8KKwkuZ2xvYmFsIGNhY2hlX3Bvc3RfdGVzdDIKK2NhY2hlX3Bvc3RfdGVzdDI6CisJbWZscglyMAorCXN0dwlyMCwgNChyMSkKKworCXN0d3UJcjMsIC00KHIxKQorCXN0d3UJcjQsIC00KHIxKQorCisJYmwJY2FjaGVfcG9zdF9kd2IKKwlibAljYWNoZV9wb3N0X2RpbnZhbGlkYXRlCisKKwkvKiBXcml0ZSB0aGUgemVybyBwYXR0ZXJuIHRvIHRoZSB0ZXN0IGFyZWEgKi8KKwlsd3oJcjAsIDAocjEpCisJbXRjdHIJcjAKKwlsaQlyMCwgMAorCWx3eglyMywgNChyMSkKKwlzdWJpCXIzLCByMywgMQorMToKKwlzdGJ1CXIwLCAxKHIzKQorCWJkbnoJMWIKKworCWJsCWNhY2hlX3Bvc3RfZGRpc2FibGUKKworCS8qIFdyaXRlIHRoZSBuZWdhdGl2ZSBwYXR0ZXJuIHRvIHRoZSB0ZXN0IGFyZWEgKi8KKwlsd3oJcjAsIDAocjEpCisJbXRjdHIJcjAKKwlsaQlyMCwgMHhmZgorCWx3eglyMywgNChyMSkKKwlzdWJpCXIzLCByMywgMQorMToKKwlzdGJ1CXIwLCAxKHIzKQorCWJkbnoJMWIKKworCWJsCWNhY2hlX3Bvc3RfZHdiCisKKwkvKiBSZWFkIHRoZSB0ZXN0IGFyZWEgKi8KKwlsd3oJcjAsIDAocjEpCisJbXRjdHIJcjAKKwlsd3oJcjQsIDQocjEpCisJc3ViaQlyNCwgcjQsIDEKKwlsaQlyMywgMAorMToKKwlsYnp1CXIwLCAxKHI0KQorCWNtcGxpCWNyMCwgcjAsIDB4ZmYKKwliZXEJMmYKKwlsaQlyMywgLTEKKwliCTNmCisyOgorCWJkbnoJMWIKKzM6CisKKwlibAljYWNoZV9wb3N0X2RkaXNhYmxlCisJYmwJY2FjaGVfcG9zdF9kaW52YWxpZGF0ZQorCisJYWRkaQlyMSwgcjEsIDgKKworCWx3eglyMCwgNChyMSkKKwltdGxyCXIwCisJYmxyCisKKy8qCisgKiB0dXJuIG9uIHRoZSBkYXRhIGNhY2hlCisgKiBzd2l0Y2ggdGhlIGRhdGEgY2FjaGUgdG8gd3JpdGUtdGhyb3VnaCBtb2RlCisgKiBpbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlCisgKiB3cml0ZSB0aGUgemVybyBwYXR0ZXJuIHRvIGEgY2FjaGVkIGFyZWEKKyAqIGZsdXNoIHRoZSBkYXRhIGNhY2hlCisgKiB3cml0ZSB0aGUgbmVnYXRpdmUgcGF0dGVybiB0byB0aGUgYXJlYQorICogdHVybiBvZmYgdGhlIGRhdGEgY2FjaGUKKyAqIHJlYWQgdGhlIGFyZWEKKyAqCisgKiBUaGUgbmVnYXRpdmUgcGF0dGVybiBtdXN0IGJlIHJlYWQgYXQgdGhlIGxhc3Qgc3RlcAorICovCisJLmdsb2JhbCBjYWNoZV9wb3N0X3Rlc3QzCitjYWNoZV9wb3N0X3Rlc3QzOgorCW1mbHIJcjAKKwlzdHcJcjAsIDQocjEpCisKKwlzdHd1CXIzLCAtNChyMSkKKwlzdHd1CXI0LCAtNChyMSkKKworCWJsCWNhY2hlX3Bvc3RfZGRpc2FibGUKKwlibAljYWNoZV9wb3N0X2RpbnZhbGlkYXRlCisKKwkvKiBXcml0ZSB0aGUgemVybyBwYXR0ZXJuIHRvIHRoZSB0ZXN0IGFyZWEgKi8KKwlsd3oJcjAsIDAocjEpCisJbXRjdHIJcjAKKwlsaQlyMCwgMAorCWx3eglyMywgNChyMSkKKwlzdWJpCXIzLCByMywgMQorMToKKwlzdGJ1CXIwLCAxKHIzKQorCWJkbnoJMWIKKworCWJsCWNhY2hlX3Bvc3RfZHd0CisJYmwJY2FjaGVfcG9zdF9kaW52YWxpZGF0ZQorCisJLyogV3JpdGUgdGhlIG5lZ2F0aXZlIHBhdHRlcm4gdG8gdGhlIHRlc3QgYXJlYSAqLworCWx3eglyMCwgMChyMSkKKwltdGN0cglyMAorCWxpCXIwLCAweGZmCisJbHd6CXIzLCA0KHIxKQorCXN1YmkJcjMsIHIzLCAxCisxOgorCXN0YnUJcjAsIDEocjMpCisJYmRuegkxYgorCisJYmwJY2FjaGVfcG9zdF9kZGlzYWJsZQorCWJsCWNhY2hlX3Bvc3RfZGludmFsaWRhdGUKKworCS8qIFJlYWQgdGhlIHRlc3QgYXJlYSAqLworCWx3eglyMCwgMChyMSkKKwltdGN0cglyMAorCWx3eglyNCwgNChyMSkKKwlzdWJpCXI0LCByNCwgMQorCWxpCXIzLCAwCisxOgorCWxienUJcjAsIDEocjQpCisJY21wbGkJY3IwLCByMCwgMHhmZgorCWJlcQkyZgorCWxpCXIzLCAtMQorCWIJM2YKKzI6CisJYmRuegkxYgorMzoKKworCWFkZGkJcjEsIHIxLCA4CisKKwlsd3oJcjAsIDQocjEpCisJbXRscglyMAorCWJscgorCisvKgorICogdHVybiBvbiB0aGUgZGF0YSBjYWNoZQorICogc3dpdGNoIHRoZSBkYXRhIGNhY2hlIHRvIHdyaXRlLWJhY2sgbW9kZQorICogaW52YWxpZGF0ZSB0aGUgZGF0YSBjYWNoZQorICogd3JpdGUgdGhlIG5lZ2F0aXZlIHBhdHRlcm4gdG8gYSBjYWNoZWQgYXJlYQorICogZmx1c2ggdGhlIGRhdGEgY2FjaGUKKyAqIHdyaXRlIHRoZSB6ZXJvIHBhdHRlcm4gdG8gdGhlIGFyZWEKKyAqIGludmFsaWRhdGUgdGhlIGRhdGEgY2FjaGUKKyAqIHJlYWQgdGhlIGFyZWEKKyAqCisgKiBUaGUgbmVnYXRpdmUgcGF0dGVybiBtdXN0IGJlIHJlYWQgYXQgdGhlIGxhc3Qgc3RlcAorICovCisJLmdsb2JhbCBjYWNoZV9wb3N0X3Rlc3Q0CitjYWNoZV9wb3N0X3Rlc3Q0OgorCW1mbHIJcjAKKwlzdHcJcjAsIDQocjEpCisKKwlzdHd1CXIzLCAtNChyMSkKKwlzdHd1CXI0LCAtNChyMSkKKworCWJsCWNhY2hlX3Bvc3RfZGRpc2FibGUKKwlibAljYWNoZV9wb3N0X2RpbnZhbGlkYXRlCisKKwkvKiBXcml0ZSB0aGUgbmVnYXRpdmUgcGF0dGVybiB0byB0aGUgdGVzdCBhcmVhICovCisJbHd6CXIwLCAwKHIxKQorCW10Y3RyCXIwCisJbGkJcjAsIDB4ZmYKKwlsd3oJcjMsIDQocjEpCisJc3ViaQlyMywgcjMsIDEKKzE6CisJc3RidQlyMCwgMShyMykKKwliZG56CTFiCisKKwlibAljYWNoZV9wb3N0X2R3YgorCWJsCWNhY2hlX3Bvc3RfZGludmFsaWRhdGUKKworCS8qIFdyaXRlIHRoZSB6ZXJvIHBhdHRlcm4gdG8gdGhlIHRlc3QgYXJlYSAqLworCWx3eglyMCwgMChyMSkKKwltdGN0cglyMAorCWxpCXIwLCAwCisJbHd6CXIzLCA0KHIxKQorCXN1YmkJcjMsIHIzLCAxCisxOgorCXN0YnUJcjAsIDEocjMpCisJYmRuegkxYgorCisJYmwJY2FjaGVfcG9zdF9kZGlzYWJsZQorCWJsCWNhY2hlX3Bvc3RfZGludmFsaWRhdGUKKworCS8qIFJlYWQgdGhlIHRlc3QgYXJlYSAqLworCWx3eglyMCwgMChyMSkKKwltdGN0cglyMAorCWx3eglyNCwgNChyMSkKKwlzdWJpCXI0LCByNCwgMQorCWxpCXIzLCAwCisxOgorCWxienUJcjAsIDEocjQpCisJY21wbGkJY3IwLCByMCwgMHhmZgorCWJlcQkyZgorCWxpCXIzLCAtMQorCWIJM2YKKzI6CisJYmRuegkxYgorMzoKKworCWFkZGkJcjEsIHIxLCA4CisKKwlsd3oJcjAsIDQocjEpCisJbXRscglyMAorCWJscgorCitjYWNoZV9wb3N0X3Rlc3Q1XzE6CisJbGkJcjMsIDAKK2NhY2hlX3Bvc3RfdGVzdDVfMjoKKwlsaQlyMywgLTEKKworLyoKKyAqIHR1cm4gb24gdGhlIGluc3RydWN0aW9uIGNhY2hlCisgKiB1bmxvY2sgdGhlIGVudGlyZSBpbnN0cnVjdGlvbiBjYWNoZQorICogaW52YWxpZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUKKyAqIGxvY2sgYSBicmFuY2ggaW5zdHJ1Y3Rpb24gaW4gdGhlIGluc3RydWN0aW9uIGNhY2hlCisgKiByZXBsYWNlIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gd2l0aCAibm9wIgorICoganVtcCB0byB0aGUgYnJhbmNoIGluc3RydWN0aW9uCisgKiBjaGVjayB0aGF0IHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gd2FzIGV4ZWN1dGVkCisqLworCS5nbG9iYWwgY2FjaGVfcG9zdF90ZXN0NQorY2FjaGVfcG9zdF90ZXN0NToKKwltZmxyCXIwCisJc3R3CXIwLCA0KHIxKQorCisJYmwJY2FjaGVfcG9zdF9pZW5hYmxlCisJYmwJY2FjaGVfcG9zdF9pdW5sb2NrCisJYmwJY2FjaGVfcG9zdF9paW52YWxpZGF0ZQorCisJLyogQ29tcHV0ZSByOSA9IGNhY2hlX3Bvc3RfdGVzdDVfcmVsb2MgKi8KKwlibAljYWNoZV9wb3N0X3Rlc3Q1X3JlbG9jCitjYWNoZV9wb3N0X3Rlc3Q1X3JlbG9jOgorCW1mbHIJcjkKKworCS8qIENvcHkgdGhlIHRlc3QgaW5zdHJ1Y3Rpb24gdG8gY2FjaGVfcG9zdF90ZXN0NV9kYXRhICovCisJbGlzCXIzLCAoY2FjaGVfcG9zdF90ZXN0NV8xIC0gY2FjaGVfcG9zdF90ZXN0NV9yZWxvYylAaAorCW9yaQlyMywgcjMsIChjYWNoZV9wb3N0X3Rlc3Q1XzEgLSBjYWNoZV9wb3N0X3Rlc3Q1X3JlbG9jKUBsCisJYWRkCXIzLCByMywgcjkKKwlsaXMJcjQsIChjYWNoZV9wb3N0X3Rlc3Q1X2RhdGEgLSBjYWNoZV9wb3N0X3Rlc3Q1X3JlbG9jKUBoCisJb3JpCXI0LCByNCwgKGNhY2hlX3Bvc3RfdGVzdDVfZGF0YSAtIGNhY2hlX3Bvc3RfdGVzdDVfcmVsb2MpQGwKKwlhZGQJcjQsIHI0LCByOQorCWx3eglyMCwgMChyMykKKwlzdHcJcjAsIDAocjQpCisKKwlibAljYWNoZV9wb3N0X2lpbnZhbGlkYXRlCisKKwkvKiBMb2NrIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gKi8KKwlsaXMJcjMsIChjYWNoZV9wb3N0X3Rlc3Q1X2RhdGEgLSBjYWNoZV9wb3N0X3Rlc3Q1X3JlbG9jKUBoCisJb3JpCXIzLCByMywgKGNhY2hlX3Bvc3RfdGVzdDVfZGF0YSAtIGNhY2hlX3Bvc3RfdGVzdDVfcmVsb2MpQGwKKwlhZGQJcjMsIHIzLCByOQorCWJsCWNhY2hlX3Bvc3RfaWxvY2sKKworCS8qIFJlcGxhY2UgdGhlIHRlc3QgaW5zdHJ1Y3Rpb24gKi8KKwlsaXMJcjMsIChjYWNoZV9wb3N0X3Rlc3Q1XzIgLSBjYWNoZV9wb3N0X3Rlc3Q1X3JlbG9jKUBoCisJb3JpCXIzLCByMywgKGNhY2hlX3Bvc3RfdGVzdDVfMiAtIGNhY2hlX3Bvc3RfdGVzdDVfcmVsb2MpQGwKKwlhZGQJcjMsIHIzLCByOQorCWxpcwlyNCwgKGNhY2hlX3Bvc3RfdGVzdDVfZGF0YSAtIGNhY2hlX3Bvc3RfdGVzdDVfcmVsb2MpQGgKKwlvcmkJcjQsIHI0LCAoY2FjaGVfcG9zdF90ZXN0NV9kYXRhIC0gY2FjaGVfcG9zdF90ZXN0NV9yZWxvYylAbAorCWFkZAlyNCwgcjQsIHI5CisJbHd6CXIwLCAwKHIzKQorCXN0dwlyMCwgMChyNCkKKworCWJsCWNhY2hlX3Bvc3RfaWludmFsaWRhdGUKKworCS8qIEV4ZWN1dGUgdG8gdGhlIHRlc3QgaW5zdHJ1Y3Rpb24gKi8KK2NhY2hlX3Bvc3RfdGVzdDVfZGF0YToKKwlub3AKKworCWJsCWNhY2hlX3Bvc3RfaXVubG9jaworCisJbHd6CXIwLCA0KHIxKQorCW10bHIJcjAKKwlibHIKKworY2FjaGVfcG9zdF90ZXN0Nl8xOgorCWxpCXIzLCAtMQorY2FjaGVfcG9zdF90ZXN0Nl8yOgorCWxpCXIzLCAwCisKKy8qCisgKiB0dXJuIG9uIHRoZSBpbnN0cnVjdGlvbiBjYWNoZQorICogdW5sb2NrIHRoZSBlbnRpcmUgaW5zdHJ1Y3Rpb24gY2FjaGUKKyAqIGludmFsaWRhdGUgdGhlIGluc3RydWN0aW9uIGNhY2hlCisgKiBsb2NrIGEgYnJhbmNoIGluc3RydWN0aW9uIGluIHRoZSBpbnN0cnVjdGlvbiBjYWNoZQorICogcmVwbGFjZSB0aGUgYnJhbmNoIGluc3RydWN0aW9uIHdpdGggIm5vcCIKKyAqIGp1bXAgdG8gdGhlIGJyYW5jaCBpbnN0cnVjdGlvbgorICogY2hlY2sgdGhhdCB0aGUgYnJhbmNoIGluc3RydWN0aW9uIHdhcyBleGVjdXRlZAorICovCisJLmdsb2JhbCBjYWNoZV9wb3N0X3Rlc3Q2CitjYWNoZV9wb3N0X3Rlc3Q2OgorCW1mbHIJcjAKKwlzdHcJcjAsIDQocjEpCisKKwlibAljYWNoZV9wb3N0X2llbmFibGUKKwlibAljYWNoZV9wb3N0X2l1bmxvY2sKKwlibAljYWNoZV9wb3N0X2lpbnZhbGlkYXRlCisKKwkvKiBDb21wdXRlIHI5ID0gY2FjaGVfcG9zdF90ZXN0Nl9yZWxvYyAqLworCWJsCWNhY2hlX3Bvc3RfdGVzdDZfcmVsb2MKK2NhY2hlX3Bvc3RfdGVzdDZfcmVsb2M6CisJbWZscglyOQorCisJLyogQ29weSB0aGUgdGVzdCBpbnN0cnVjdGlvbiB0byBjYWNoZV9wb3N0X3Rlc3Q2X2RhdGEgKi8KKwlsaXMJcjMsIChjYWNoZV9wb3N0X3Rlc3Q2XzEgLSBjYWNoZV9wb3N0X3Rlc3Q2X3JlbG9jKUBoCisJb3JpCXIzLCByMywgKGNhY2hlX3Bvc3RfdGVzdDZfMSAtIGNhY2hlX3Bvc3RfdGVzdDZfcmVsb2MpQGwKKwlhZGQJcjMsIHIzLCByOQorCWxpcwlyNCwgKGNhY2hlX3Bvc3RfdGVzdDZfZGF0YSAtIGNhY2hlX3Bvc3RfdGVzdDZfcmVsb2MpQGgKKwlvcmkJcjQsIHI0LCAoY2FjaGVfcG9zdF90ZXN0Nl9kYXRhIC0gY2FjaGVfcG9zdF90ZXN0Nl9yZWxvYylAbAorCWFkZAlyNCwgcjQsIHI5CisJbHd6CXIwLCAwKHIzKQorCXN0dwlyMCwgMChyNCkKKworCWJsCWNhY2hlX3Bvc3RfaWludmFsaWRhdGUKKworCS8qIFJlcGxhY2UgdGhlIHRlc3QgaW5zdHJ1Y3Rpb24gKi8KKwlsaXMJcjMsIChjYWNoZV9wb3N0X3Rlc3Q2XzIgLSBjYWNoZV9wb3N0X3Rlc3Q2X3JlbG9jKUBoCisJb3JpCXIzLCByMywgKGNhY2hlX3Bvc3RfdGVzdDZfMiAtIGNhY2hlX3Bvc3RfdGVzdDZfcmVsb2MpQGwKKwlhZGQJcjMsIHIzLCByOQorCWxpcwlyNCwgKGNhY2hlX3Bvc3RfdGVzdDZfZGF0YSAtIGNhY2hlX3Bvc3RfdGVzdDZfcmVsb2MpQGgKKwlvcmkJcjQsIHI0LCAoY2FjaGVfcG9zdF90ZXN0Nl9kYXRhIC0gY2FjaGVfcG9zdF90ZXN0Nl9yZWxvYylAbAorCWFkZAlyNCwgcjQsIHI5CisJbHd6CXIwLCAwKHIzKQorCXN0dwlyMCwgMChyNCkKKworCWJsCWNhY2hlX3Bvc3RfaWludmFsaWRhdGUKKworCS8qIEV4ZWN1dGUgdG8gdGhlIHRlc3QgaW5zdHJ1Y3Rpb24gKi8KK2NhY2hlX3Bvc3RfdGVzdDZfZGF0YToKKwlub3AKKworCWx3eglyMCwgNChyMSkKKwltdGxyCXIwCisJYmxyCisKKyNlbmRpZiAvKiBDT05GSUdfTVBDODIzIHx8IE1QQzg1MCB8fCBNUEM4NTUgfHwgTVBDODYwIHx8IE1QQzgyNFggKi8KKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0NBQ0hFICovCisjZW5kaWYgLyogQ09ORklHX1BPU1QgKi8KZGlmZiAtLWdpdCBhL3Bvc3QvY3B1LmMgYi9wb3N0L2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOGZjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2NwdS5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworLyoKKyAqIENQVSB0ZXN0CisgKgorICogVGhpcyB0ZXN0IGNoZWNrcyB0aGUgYXJpdGhtZXRpYyBsb2dpYyB1bml0IChBTFUpIG9mIENQVS4KKyAqIEl0IHRlc3RzIGluZGVwZW5kZW50bHkgdmFyaW91cyBncm91cHMgb2YgaW5zdHJ1Y3Rpb25zIHVzaW5nCisgKiBydW4tdGltZSBtb2RpZmljYXRpb24gb2YgdGhlIGNvZGUgdG8gcmVkdWNlIHRoZSBtZW1vcnkgZm9vdHByaW50LgorICogRm9yIG1vcmUgZGV0YWlscyByZWZlciB0byBwb3N0L2NwdS8gKi5jIGZpbGVzLgorICovCisKKyNpZmRlZiBDT05GSUdfUE9TVAorCisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxwb3N0Lmg+CisKKyNpZiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0NQVQorCitleHRlcm4gaW50IGNwdV9wb3N0X3Rlc3RfY21wICh2b2lkKTsKK2V4dGVybiBpbnQgY3B1X3Bvc3RfdGVzdF9jbXBpICh2b2lkKTsKK2V4dGVybiBpbnQgY3B1X3Bvc3RfdGVzdF90d28gKHZvaWQpOworZXh0ZXJuIGludCBjcHVfcG9zdF90ZXN0X3R3b3ggKHZvaWQpOworZXh0ZXJuIGludCBjcHVfcG9zdF90ZXN0X3RocmVlICh2b2lkKTsKK2V4dGVybiBpbnQgY3B1X3Bvc3RfdGVzdF90aHJlZXggKHZvaWQpOworZXh0ZXJuIGludCBjcHVfcG9zdF90ZXN0X3RocmVlaSAodm9pZCk7CitleHRlcm4gaW50IGNwdV9wb3N0X3Rlc3RfYW5kaSAodm9pZCk7CitleHRlcm4gaW50IGNwdV9wb3N0X3Rlc3Rfc3Jhd2kgKHZvaWQpOworZXh0ZXJuIGludCBjcHVfcG9zdF90ZXN0X3Jsd25tICh2b2lkKTsKK2V4dGVybiBpbnQgY3B1X3Bvc3RfdGVzdF9ybHdpbm0gKHZvaWQpOworZXh0ZXJuIGludCBjcHVfcG9zdF90ZXN0X3Jsd2ltaSAodm9pZCk7CitleHRlcm4gaW50IGNwdV9wb3N0X3Rlc3Rfc3RvcmUgKHZvaWQpOworZXh0ZXJuIGludCBjcHVfcG9zdF90ZXN0X2xvYWQgKHZvaWQpOworZXh0ZXJuIGludCBjcHVfcG9zdF90ZXN0X2NyICh2b2lkKTsKK2V4dGVybiBpbnQgY3B1X3Bvc3RfdGVzdF9iICh2b2lkKTsKK2V4dGVybiBpbnQgY3B1X3Bvc3RfdGVzdF9tdWx0aSAodm9pZCk7CitleHRlcm4gaW50IGNwdV9wb3N0X3Rlc3Rfc3RyaW5nICh2b2lkKTsKK2V4dGVybiBpbnQgY3B1X3Bvc3RfdGVzdF9jb21wbGV4ICh2b2lkKTsKKwordWxvbmcgY3B1X3Bvc3RfbWFrZWNyIChsb25nIHYpCit7CisJdWxvbmcgY3IgPSAwOworCisJaWYgKHYgPCAwKQorCQljciB8PSAweDgwMDAwMDAwOworCWlmICh2ID4gMCkKKwkJY3IgfD0gMHg0MDAwMDAwMDsKKwlpZiAodiA9PSAwKQorCQljciB8PSAweDIwMDAwMDAwOworCisJcmV0dXJuIGNyOworfQorCitpbnQgY3B1X3Bvc3RfdGVzdCAoaW50IGZsYWdzKQoreworCWludCBpYyA9IGljYWNoZV9zdGF0dXMgKCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaWMpCisJCWljYWNoZV9kaXNhYmxlICgpOworCisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjcHVfcG9zdF90ZXN0X2NtcCAoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGNwdV9wb3N0X3Rlc3RfY21waSAoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGNwdV9wb3N0X3Rlc3RfdHdvICgpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gY3B1X3Bvc3RfdGVzdF90d294ICgpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gY3B1X3Bvc3RfdGVzdF90aHJlZSAoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGNwdV9wb3N0X3Rlc3RfdGhyZWV4ICgpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gY3B1X3Bvc3RfdGVzdF90aHJlZWkgKCk7CisJV0FUQ0hET0dfUkVTRVQoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGNwdV9wb3N0X3Rlc3RfYW5kaSAoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGNwdV9wb3N0X3Rlc3Rfc3Jhd2kgKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjcHVfcG9zdF90ZXN0X3Jsd25tICgpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gY3B1X3Bvc3RfdGVzdF9ybHdpbm0gKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjcHVfcG9zdF90ZXN0X3Jsd2ltaSAoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGNwdV9wb3N0X3Rlc3Rfc3RvcmUgKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjcHVfcG9zdF90ZXN0X2xvYWQgKCk7CisJV0FUQ0hET0dfUkVTRVQoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGNwdV9wb3N0X3Rlc3RfY3IgKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjcHVfcG9zdF90ZXN0X2IgKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjcHVfcG9zdF90ZXN0X211bHRpICgpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gY3B1X3Bvc3RfdGVzdF9zdHJpbmcgKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjcHVfcG9zdF90ZXN0X2NvbXBsZXggKCk7CisKKwlpZiAoaWMpCisJCWljYWNoZV9lbmFibGUgKCk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9DUFUgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLwpkaWZmIC0tZ2l0IGEvcG9zdC9jcHUvYi5jIGIvcG9zdC9jcHUvYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTIyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2NwdS9iLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisvKgorICogQ1BVIHRlc3QKKyAqIEJyYW5jaCBpbnN0cnVjdGlvbnM6CQliLCBibCwgYmMKKyAqCisgKiBUaGUgZmlyc3QgMiBpbnN0cnVjdGlvbnMgKGIsIGJsKSBhcmUgdmVyaWZpZWQgYnkganVtcGluZworICogdG8gYSBmaXhlZCBhZGRyZXNzIGFuZCBjaGVja2luZyB3aGV0aGVyIGNvbnRyb2wgd2FzIHRyYW5zZmVyZWQKKyAqIHRvIHRoYXQgdmVyeSBwb2ludC4gRm9yIHRoZSBibCBpbnN0cnVjdGlvbiB0aGUgdmFsdWUgb2YgdGhlCisgKiBsaW5rIHJlZ2lzdGVyIGlzIGNoZWNrZWQgYXMgd2VsbCAodXNpbmcgbWZzcHIpLgorICogVG8gdmVyaWZ5IHRoZSBiYyBpbnN0cnVjdGlvbiB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiB0aGUgQkkvQk8KKyAqIGZpZWxkcywgdGhlIENUUiBhbmQgdGhlIGNvbmRpdGlvbiByZWdpc3RlciB2YWx1ZXMgYXJlCisgKiBjaGVja2VkLiBUaGUgbGlzdCBvZiBzdWNoIGNvbWJpbmF0aW9ucyBpcyBwcmUtYnVpbHQgYW5kCisgKiBsaW5rZWQgaW4gVS1Cb290IGF0IGJ1aWxkIHRpbWUuCisgKi8KKworI2lmZGVmIENPTkZJR19QT1NUCisKKyNpbmNsdWRlIDxwb3N0Lmg+CisjaW5jbHVkZSAiY3B1X2FzbS5oIgorCisjaWYgQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9DUFUKKworZXh0ZXJuIHZvaWQgY3B1X3Bvc3RfZXhlY18xMSAodWxvbmcgKmNvZGUsIHVsb25nICpyZXMsIHVsb25nIG9wMSk7CitleHRlcm4gdm9pZCBjcHVfcG9zdF9leGVjXzMxICh1bG9uZyAqY29kZSwgdWxvbmcgKmN0ciwgdWxvbmcgKmxyLCB1bG9uZyAqanVtcCwKKyAgICB1bG9uZyBjcik7CisKK3N0YXRpYyBpbnQgY3B1X3Bvc3RfdGVzdF9iYyAodWxvbmcgY21kLCB1bG9uZyBibywgdWxvbmcgYmksCisgICAgaW50IHBqdW1wLCBpbnQgZGVjLCBpbnQgbGluaywgdWxvbmcgcGN0ciwgdWxvbmcgY3IpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgdWxvbmcgbHIgPSAwOworICAgIHVsb25nIGN0ciA9IHBjdHI7CisgICAgdWxvbmcganVtcDsKKworICAgIHVuc2lnbmVkIGxvbmcgY29kZVtdID0KKyAgICB7CisJQVNNX01UQ1IoNiksCisJQVNNX01GTFIoNiksCisJQVNNX01UQ1RSKDMpLAorCUFTTV9NVExSKDQpLAorCUFTTV9MSSg1LCAxKSwKKwlBU01fM08oY21kLCBibywgYmksIDgpLAorCUFTTV9MSSg1LCAwKSwKKwlBU01fTUZDVFIoMyksCisJQVNNX01GTFIoNCksCisJQVNNX01UTFIoNiksCisJQVNNX0JMUiwKKyAgICB9OworCisgICAgY3B1X3Bvc3RfZXhlY18zMSAoY29kZSwgJmN0ciwgJmxyLCAmanVtcCwgY3IpOworCisgICAgaWYgKHJldCA9PSAwKQorCXJldCA9IHBqdW1wID09IGp1bXAgPyAwIDogLTE7CisgICAgaWYgKHJldCA9PSAwKQorICAgIHsKKwlpZiAoZGVjKQorCSAgICByZXQgPSBwY3RyID09IGN0ciArIDEgPyAwIDogLTE7CisJZWxzZQorCSAgICByZXQgPSBwY3RyID09IGN0ciA/IDAgOiAtMTsKKyAgICB9CisgICAgaWYgKHJldCA9PSAwKQorICAgIHsKKyAgICAJaWYgKGxpbmspCisgICAgICAgICAgICByZXQgPSBsciA9PSAodWxvbmcpIGNvZGUgKyAyNCA/IDAgOiAtMTsKKwllbHNlCisJICAgIHJldCA9IGxyID09IDAgPyAwIDogLTE7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGNwdV9wb3N0X3Rlc3RfYiAodm9pZCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIGlmIChyZXQgPT0gMCkKKyAgICB7CisgICAgCXVsb25nIGNvZGVbXSA9CisJeworCSAgIEFTTV9NRkxSKDQpLAorCSAgIEFTTV9NVExSKDMpLAorCSAgIEFTTV9CKDQpLAorCSAgIEFTTV9NRkxSKDMpLAorCSAgIEFTTV9NVExSKDQpLAorCSAgIEFTTV9CTFIsCisJfTsKKwl1bG9uZyByZXM7CisKKwljcHVfcG9zdF9leGVjXzExIChjb2RlLCAmcmVzLCAwKTsKKworCXJldCA9IHJlcyA9PSAwID8gMCA6IC0xOworCisgICAgCWlmIChyZXQgIT0gMCkKKyAgICAJeworICAgICAgICAgICAgcG9zdF9sb2cgKCJFcnJvciBhdCBiMSB0ZXN0ICFcbiIpOworICAgIAl9CisgICAgfQorCisgICAgaWYgKHJldCA9PSAwKQorICAgIHsKKyAgICAJdWxvbmcgY29kZVtdID0KKwl7CisJICAgQVNNX01GTFIoNCksCisJICAgQVNNX01UTFIoMyksCisJICAgQVNNX0JMKDQpLAorCSAgIEFTTV9NRkxSKDMpLAorCSAgIEFTTV9NVExSKDQpLAorCSAgIEFTTV9CTFIsCisJfTsKKwl1bG9uZyByZXM7CisKKwljcHVfcG9zdF9leGVjXzExIChjb2RlLCAmcmVzLCAwKTsKKworCXJldCA9IHJlcyA9PSAodWxvbmcpY29kZSArIDEyID8gMCA6IC0xOworCisgICAgCWlmIChyZXQgIT0gMCkKKyAgICAJeworICAgICAgICAgICAgcG9zdF9sb2cgKCJFcnJvciBhdCBiMiB0ZXN0ICFcbiIpOworICAgIAl9CisgICAgfQorCisgICAgaWYgKHJldCA9PSAwKQorICAgIHsKKyAgICAgICAgdWxvbmcgY2MsIGNkOworCWludCBjb25kOworCXVsb25nIGN0cjsKKwlpbnQgbGluazsKKworCWkgPSAwOworCisJZm9yIChjYyA9IDA7IGNjIDwgNCAmJiByZXQgPT0gMDsgY2MrKykKKwl7CisJICAgIGZvciAoY2QgPSAwOyBjZCA8IDQgJiYgcmV0ID09IDA7IGNkKyspCisJICAgIHsKKwkgICAgICAgIGZvciAobGluayA9IDA7IGxpbmsgPD0gMSAmJiByZXQgPT0gMDsgbGluaysrKQorCQl7CisJCSAgICBmb3IgKGNvbmQgPSAwOyBjb25kIDw9IDEgJiYgcmV0ID09IDA7IGNvbmQrKykKKwkJICAgIHsKKwkJICAgICAgICBmb3IgKGN0ciA9IDE7IGN0ciA8PSAyICYmIHJldCA9PSAwOyBjdHIrKykKKwkJCXsKKwkJCSAgICBpbnQgZGVjID0gY2QgPCAyOworCQkJICAgIGludCBjciA9IGNvbmQgPyAweDgwMDAwMDAwIDogMHgwMDAwMDAwMDsKKwkJCSAgICBpbnQganVtcGMgPSBjYyA+PSAyIHx8CisJCQkgICAgICAgICAgICAgICAgKGNjID09IDAgJiYgIWNvbmQpIHx8CisgICAgCQkJICAgIAkJKGNjID09IDEgJiYgY29uZCk7CisJCQkgICAgaW50IGp1bXBkID0gY2QgPj0gMiB8fAorCQkJICAgICAgICAgICAgICAgIChjZCA9PSAwICYmIGN0ciAhPSAxKSB8fAorICAgIAkJCSAgICAJCShjZCA9PSAxICYmIGN0ciA9PSAxKTsKKwkJCSAgICBpbnQganVtcCA9IGp1bXBjICYmIGp1bXBkOworCisJCQkgICAgcmV0ID0gY3B1X3Bvc3RfdGVzdF9iYyAobGluayA/IE9QX0JDTCA6IE9QX0JDLAorCQkJICAgICAgICAoY2MgPDwgMykgKyAoY2QgPDwgMSksIDAsIGp1bXAsIGRlYywgbGluaywKKwkJCQljdHIsIGNyKTsKKworCQkgICAgCSAgICBpZiAocmV0ICE9IDApCisJCSAgICAJICAgIHsKKwkJICAgICAgICAgICAgICAgIHBvc3RfbG9nICgiRXJyb3IgYXQgYjMgdGVzdCAlZCAhXG4iLCBpKTsKKwkJICAgICAgICAgICAgfQorCisJCQkgICAgaSsrOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Bvc3QvY3B1L2NtcC5jIGIvcG9zdC9jcHUvY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5YTI0YwotLS0gL2Rldi9udWxsCisrKyBiL3Bvc3QvY3B1L2NtcC5jCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworLyoKKyAqIENQVSB0ZXN0CisgKiBJbnRlZ2VyIGNvbXBhcmUgaW5zdHJ1Y3Rpb25zOgljbXB3LCBjbXBsdworICoKKyAqIFRvIHZlcmlmeSB0aGVzZSBpbnN0cnVjdGlvbnMgdGhlIHRlc3QgcnVucyB0aGVtIHdpdGgKKyAqIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygb3BlcmFuZHMsIHJlYWRzIHRoZSBjb25kaXRpb24KKyAqIHJlZ2lzdGVyIHZhbHVlIGFuZCBjb21wYXJlcyBpdCB3aXRoIHRoZSBleHBlY3RlZCBvbmUuCisgKiBUaGUgdGVzdCBjb250YWlucyBhIHByZS1idWlsdCB0YWJsZQorICogY29udGFpbmluZyB0aGUgZGVzY3JpcHRpb24gb2YgZWFjaCB0ZXN0IGNhc2U6IHRoZSBpbnN0cnVjdGlvbiwKKyAqIHRoZSB2YWx1ZXMgb2YgdGhlIG9wZXJhbmRzLCB0aGUgY29uZGl0aW9uIGZpZWxkIHRvIHNhdmUKKyAqIHRoZSByZXN1bHQgaW4gYW5kIHRoZSBleHBlY3RlZCByZXN1bHQuCisgKi8KKworI2lmZGVmIENPTkZJR19QT1NUCisKKyNpbmNsdWRlIDxwb3N0Lmg+CisjaW5jbHVkZSAiY3B1X2FzbS5oIgorCisjaWYgQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9DUFUKKworZXh0ZXJuIHZvaWQgY3B1X3Bvc3RfZXhlY18xMiAodWxvbmcgKmNvZGUsIHVsb25nICpyZXMsIHVsb25nIG9wMSwgdWxvbmcgb3AyKTsKKworc3RhdGljIHN0cnVjdCBjcHVfcG9zdF9jbXBfcworeworICAgIHVsb25nIGNtZDsKKyAgICB1bG9uZyBvcDE7CisgICAgdWxvbmcgb3AyOworICAgIHVsb25nIGNyOworICAgIHVsb25nIHJlczsKK30gY3B1X3Bvc3RfY21wX3RhYmxlW10gPQoreworICAgIHsKKwlPUF9DTVBXLAorCTEyMywKKwkxMjMsCisJMiwKKwkweDAyCisgICAgfSwKKyAgICB7CisJT1BfQ01QVywKKwkxMjMsCisJMTMzLAorCTMsCisJMHgwOAorICAgIH0sCisgICAgeworCU9QX0NNUFcsCisJMTIzLAorCS0xMzMsCisJNCwKKwkweDA0CisgICAgfSwKKyAgICB7CisJT1BfQ01QTFcsCisJMTIzLAorCTEyMywKKwkyLAorCTB4MDIKKyAgICB9LAorICAgIHsKKwlPUF9DTVBMVywKKwkxMjMsCisJLTEzMywKKwkzLAorCTB4MDgKKyAgICB9LAorICAgIHsKKwlPUF9DTVBMVywKKwkxMjMsCisJMTEzLAorCTQsCisJMHgwNAorICAgIH0sCit9Oworc3RhdGljIHVuc2lnbmVkIGludCBjcHVfcG9zdF9jbXBfc2l6ZSA9CisgICAgc2l6ZW9mIChjcHVfcG9zdF9jbXBfdGFibGUpIC8gc2l6ZW9mIChzdHJ1Y3QgY3B1X3Bvc3RfY21wX3MpOworCitpbnQgY3B1X3Bvc3RfdGVzdF9jbXAgKHZvaWQpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3B1X3Bvc3RfY21wX3NpemUgJiYgcmV0ID09IDA7IGkrKykKKyAgICB7CisJc3RydWN0IGNwdV9wb3N0X2NtcF9zICp0ZXN0ID0gY3B1X3Bvc3RfY21wX3RhYmxlICsgaTsKKyAgICAJdW5zaWduZWQgbG9uZyBjb2RlW10gPQorCXsKKwkgICAgQVNNXzJDKHRlc3QtPmNtZCwgdGVzdC0+Y3IsIDMsIDQpLAorCSAgICBBU01fTUZDUigzKSwKKwkgICAgQVNNX0JMUgorCX07CisJdWxvbmcgcmVzOworCisJY3B1X3Bvc3RfZXhlY18xMiAoY29kZSwgJiByZXMsIHRlc3QtPm9wMSwgdGVzdC0+b3AyKTsKKworCXJldCA9ICgocmVzID4+ICgyOCAtIDQgKiB0ZXN0LT5jcikpICYgMHhlKSA9PSB0ZXN0LT5yZXMgPyAwIDogLTE7CisKKwlpZiAocmV0ICE9IDApCisJeworCSAgICBwb3N0X2xvZyAoIkVycm9yIGF0IGNtcCB0ZXN0ICVkICFcbiIsIGkpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcG9zdC9jcHUvY21waS5jIGIvcG9zdC9jcHUvY21waS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzJhYWYKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2NwdS9jbXBpLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisvKgorICogQ1BVIHRlc3QKKyAqIEludGVnZXIgY29tcGFyZSBpbnN0cnVjdGlvbnM6CWNtcHdpLCBjbXBsd2kKKyAqCisgKiBUbyB2ZXJpZnkgdGhlc2UgaW5zdHJ1Y3Rpb25zIHRoZSB0ZXN0IHJ1bnMgdGhlbSB3aXRoCisgKiBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIG9wZXJhbmRzLCByZWFkcyB0aGUgY29uZGl0aW9uCisgKiByZWdpc3RlciB2YWx1ZSBhbmQgY29tcGFyZXMgaXQgd2l0aCB0aGUgZXhwZWN0ZWQgb25lLgorICogVGhlIHRlc3QgY29udGFpbnMgYSBwcmUtYnVpbHQgdGFibGUKKyAqIGNvbnRhaW5pbmcgdGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggdGVzdCBjYXNlOiB0aGUgaW5zdHJ1Y3Rpb24sCisgKiB0aGUgdmFsdWVzIG9mIHRoZSBvcGVyYW5kcywgdGhlIGNvbmRpdGlvbiBmaWVsZCB0byBzYXZlCisgKiB0aGUgcmVzdWx0IGluIGFuZCB0aGUgZXhwZWN0ZWQgcmVzdWx0LgorICovCisKKyNpZmRlZiBDT05GSUdfUE9TVAorCisjaW5jbHVkZSA8cG9zdC5oPgorI2luY2x1ZGUgImNwdV9hc20uaCIKKworI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfQ1BVCisKK2V4dGVybiB2b2lkIGNwdV9wb3N0X2V4ZWNfMTEgKHVsb25nICpjb2RlLCB1bG9uZyAqcmVzLCB1bG9uZyBvcDEpOworCitzdGF0aWMgc3RydWN0IGNwdV9wb3N0X2NtcGlfcworeworICAgIHVsb25nIGNtZDsKKyAgICB1bG9uZyBvcDE7CisgICAgdXNob3J0IG9wMjsKKyAgICB1bG9uZyBjcjsKKyAgICB1bG9uZyByZXM7Cit9IGNwdV9wb3N0X2NtcGlfdGFibGVbXSA9Cit7CisgICAgeworCU9QX0NNUFdJLAorCTEyMywKKwkxMjMsCisJMiwKKwkweDAyCisgICAgfSwKKyAgICB7CisJT1BfQ01QV0ksCisJMTIzLAorCTEzMywKKwkzLAorCTB4MDgKKyAgICB9LAorICAgIHsKKwlPUF9DTVBXSSwKKwkxMjMsCisJLTEzMywKKwk0LAorCTB4MDQKKyAgICB9LAorICAgIHsKKwlPUF9DTVBMV0ksCisJMTIzLAorCTEyMywKKwkyLAorCTB4MDIKKyAgICB9LAorICAgIHsKKwlPUF9DTVBMV0ksCisJMTIzLAorCS0xMzMsCisJMywKKwkweDA4CisgICAgfSwKKyAgICB7CisJT1BfQ01QTFdJLAorCTEyMywKKwkxMTMsCisJNCwKKwkweDA0CisgICAgfSwKK307CitzdGF0aWMgdW5zaWduZWQgaW50IGNwdV9wb3N0X2NtcGlfc2l6ZSA9CisgICAgc2l6ZW9mIChjcHVfcG9zdF9jbXBpX3RhYmxlKSAvIHNpemVvZiAoc3RydWN0IGNwdV9wb3N0X2NtcGlfcyk7CisKK2ludCBjcHVfcG9zdF90ZXN0X2NtcGkgKHZvaWQpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3B1X3Bvc3RfY21waV9zaXplICYmIHJldCA9PSAwOyBpKyspCisgICAgeworCXN0cnVjdCBjcHVfcG9zdF9jbXBpX3MgKnRlc3QgPSBjcHVfcG9zdF9jbXBpX3RhYmxlICsgaTsKKyAgICAJdW5zaWduZWQgbG9uZyBjb2RlW10gPQorCXsKKwkgICAgQVNNXzFJQyh0ZXN0LT5jbWQsIHRlc3QtPmNyLCAzLCB0ZXN0LT5vcDIpLAorCSAgICBBU01fTUZDUigzKSwKKwkgICAgQVNNX0JMUgorCX07CisJdWxvbmcgcmVzOworCisJY3B1X3Bvc3RfZXhlY18xMSAoY29kZSwgJiByZXMsIHRlc3QtPm9wMSk7CisKKwlyZXQgPSAoKHJlcyA+PiAoMjggLSA0ICogdGVzdC0+Y3IpKSAmIDB4ZSkgPT0gdGVzdC0+cmVzID8gMCA6IC0xOworCisJaWYgKHJldCAhPSAwKQorCXsKKwkgICAgcG9zdF9sb2cgKCJFcnJvciBhdCBjbXBpIHRlc3QgJWQgIVxuIiwgaSk7CisJfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9wb3N0L2NwdS9jci5jIGIvcG9zdC9jcHUvY3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM4NzI5Ci0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9jcHUvY3IuYwpAQCAtMCwwICsxLDM1NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qCisgKiBDUFUgdGVzdAorICogQ29uZGl0aW9uIHJlZ2lzdGVyIGlzdHJ1Y3Rpb25zOgltdGNyLCBtZmNyLCBtY3J4ciwKKyAqCQkJCQljcmFuZCwgY3JhbmRjLCBjcm9yLCBjcm9yYywgY3J4b3IsCisgKgkJCQkJY3JuYW5kLCBjcm5vciwgY3JlcXYsIG1jcmYKKyAqCisgKiBUaGUgbXRjcmYvbWZjciBpbnN0cnVjdGlvbnMgaXMgdGVzdGVkIGJ5IGxvYWRpbmcgZGlmZmVyZW50CisgKiB2YWx1ZXMgaW50byB0aGUgY29uZGl0aW9uIHJlZ2lzdGVyIChtdGNyZiksIG1vdmluZyBpdHMgdmFsdWUKKyAqIHRvIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIChtZmNyKSBhbmQgY29tcGFyaW5nIHRoaXMgdmFsdWUKKyAqIHdpdGggdGhlIGV4cGVjdGVkIG9uZS4KKyAqIFRoZSBtY3J4ciBpbnN0cnVjdGlvbiBpcyB0ZXN0ZWQgYnkgbG9hZGluZyBhIGZpeGVkIHZhbHVlCisgKiBpbnRvIHRoZSBYRVIgcmVnaXN0ZXIgKG10c3ByKSwgbW92aW5nIFhFUiB2YWx1ZSB0byB0aGUKKyAqIGNvbmRpdGlvbiByZWdpc3RlciAobWNyeHIpLCBtb3ZpbmcgaXQgdG8gYSBnZW5lcmFsLXB1cnBvc2UKKyAqIHJlZ2lzdGVyIChtZmNyKSBhbmQgY29tcGFyaW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHJlZ2lzdGVyIHdpdGgKKyAqIHRoZSBleHBlY3RlZCBvbmUuCisgKiBUaGUgcmVzdCBvZiBpbnN0cnVjdGlvbnMgaXMgdGVzdGVkIGJ5IGxvYWRpbmcgYSBmaXhlZAorICogdmFsdWUgaW50byB0aGUgY29uZGl0aW9uIHJlZ2lzdGVyIChtdGNyZiksIGV4ZWN1dGluZyBlYWNoCisgKiBpbnN0cnVjdGlvbiBzZXZlcmFsIHRpbWVzIHRvIG1vZGlmeSBhbGwgNC1iaXQgY29uZGl0aW9uCisgKiBmaWVsZHMsIG1vdmluZyB0aGUgdmFsdWUgb2YgdGhlIGNvbmRpdGlvbmFsIHJlZ2lzdGVyIHRvIGEKKyAqIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciAobWZjcikgYW5kIGNvbXBhcmluZyBpdCB3aXRoIHRoZQorICogZXhwZWN0ZWQgb25lLgorICovCisKKyNpZmRlZiBDT05GSUdfUE9TVAorCisjaW5jbHVkZSA8cG9zdC5oPgorI2luY2x1ZGUgImNwdV9hc20uaCIKKworI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfQ1BVCisKK2V4dGVybiB2b2lkIGNwdV9wb3N0X2V4ZWNfMTEgKHVsb25nICpjb2RlLCB1bG9uZyAqcmVzLCB1bG9uZyBvcDEpOworZXh0ZXJuIHZvaWQgY3B1X3Bvc3RfZXhlY18yMXggKHVsb25nICpjb2RlLCB1bG9uZyAqb3AxLCB1bG9uZyAqb3AyLCB1bG9uZyBvcDMpOworCitzdGF0aWMgdWxvbmcgY3B1X3Bvc3RfY3JfdGFibGUxW10gPQoreworICAgIDB4YWFhYWFhYWEsCisgICAgMHg1NTU1NTU1NSwKK307CitzdGF0aWMgdW5zaWduZWQgaW50IGNwdV9wb3N0X2NyX3NpemUxID0KKyAgICBzaXplb2YgKGNwdV9wb3N0X2NyX3RhYmxlMSkgLyBzaXplb2YgKHVsb25nKTsKKworc3RhdGljIHN0cnVjdCBjcHVfcG9zdF9jcl9zMiB7CisgICAgdWxvbmcgeGVyOworICAgIHVsb25nIGNyOworfSBjcHVfcG9zdF9jcl90YWJsZTJbXSA9Cit7CisgICAgeworICAgIAkweGEwMDAwMDAwLAorCTEKKyAgICB9LAorICAgIHsKKyAgICAJMHg0MDAwMDAwMCwKKwk1CisgICAgfSwKK307CitzdGF0aWMgdW5zaWduZWQgaW50IGNwdV9wb3N0X2NyX3NpemUyID0KKyAgICBzaXplb2YgKGNwdV9wb3N0X2NyX3RhYmxlMikgLyBzaXplb2YgKHN0cnVjdCBjcHVfcG9zdF9jcl9zMik7CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X3Bvc3RfY3JfczMgeworICAgIHVsb25nIGNyOworICAgIHVsb25nIGNzOworICAgIHVsb25nIGNkOworICAgIHVsb25nIHJlczsKK30gY3B1X3Bvc3RfY3JfdGFibGUzW10gPQoreworICAgIHsKKyAgICAJMHgwMTIzNDU2NywKKwkwLAorCTQsCisJMHgwMTIzMDU2NworICAgIH0sCisgICAgeworICAgIAkweDAxMjM0NTY3LAorCTcsCisJMCwKKwkweDcxMjM0NTY3CisgICAgfSwKK307CitzdGF0aWMgdW5zaWduZWQgaW50IGNwdV9wb3N0X2NyX3NpemUzID0KKyAgICBzaXplb2YgKGNwdV9wb3N0X2NyX3RhYmxlMykgLyBzaXplb2YgKHN0cnVjdCBjcHVfcG9zdF9jcl9zMyk7CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X3Bvc3RfY3JfczQgeworICAgIHVsb25nIGNtZDsKKyAgICB1bG9uZyBjcjsKKyAgICB1bG9uZyBvcDE7CisgICAgdWxvbmcgb3AyOworICAgIHVsb25nIG9wMzsKKyAgICB1bG9uZyByZXM7Cit9IGNwdV9wb3N0X2NyX3RhYmxlNFtdID0KK3sKKyAgICB7CisJT1BfQ1JBTkQsCisgICAgCTB4MDAwMGZmZmYsCisJMCwKKwkxNiwKKwkwLAorICAgIAkweDAwMDBmZmZmCisgICAgfSwKKyAgICB7CisJT1BfQ1JBTkQsCisgICAgCTB4MDAwMGZmZmYsCisJMTYsCisJMTcsCisJMCwKKyAgICAJMHg4MDAwZmZmZgorICAgIH0sCisgICAgeworCU9QX0NSQU5EQywKKyAgICAJMHgwMDAwZmZmZiwKKwkwLAorCTE2LAorCTAsCisgICAgCTB4MDAwMGZmZmYKKyAgICB9LAorICAgIHsKKwlPUF9DUkFOREMsCisgICAgCTB4MDAwMGZmZmYsCisJMTYsCisJMCwKKwkwLAorICAgIAkweDgwMDBmZmZmCisgICAgfSwKKyAgICB7CisJT1BfQ1JPUiwKKyAgICAJMHgwMDAwZmZmZiwKKwkwLAorCTE2LAorCTAsCisgICAgCTB4ODAwMGZmZmYKKyAgICB9LAorICAgIHsKKwlPUF9DUk9SLAorICAgIAkweDAwMDBmZmZmLAorCTAsCisJMSwKKwkwLAorICAgIAkweDAwMDBmZmZmCisgICAgfSwKKyAgICB7CisJT1BfQ1JPUkMsCisgICAgCTB4MDAwMGZmZmYsCisJMCwKKwkxNiwKKwkwLAorICAgIAkweDAwMDBmZmZmCisgICAgfSwKKyAgICB7CisJT1BfQ1JPUkMsCisgICAgCTB4MDAwMGZmZmYsCisJMCwKKwkwLAorCTAsCisgICAgCTB4ODAwMGZmZmYKKyAgICB9LAorICAgIHsKKwlPUF9DUlhPUiwKKyAgICAJMHgwMDAwZmZmZiwKKwkwLAorCTAsCisJMCwKKyAgICAJMHgwMDAwZmZmZgorICAgIH0sCisgICAgeworCU9QX0NSWE9SLAorICAgIAkweDAwMDBmZmZmLAorCTAsCisJMTYsCisJMCwKKyAgICAJMHg4MDAwZmZmZgorICAgIH0sCisgICAgeworCU9QX0NSTkFORCwKKyAgICAJMHgwMDAwZmZmZiwKKwkwLAorCTE2LAorCTAsCisgICAgCTB4ODAwMGZmZmYKKyAgICB9LAorICAgIHsKKwlPUF9DUk5BTkQsCisgICAgCTB4MDAwMGZmZmYsCisJMTYsCisJMTcsCisJMCwKKyAgICAJMHgwMDAwZmZmZgorICAgIH0sCisgICAgeworCU9QX0NSTk9SLAorICAgIAkweDAwMDBmZmZmLAorCTAsCisJMTYsCisJMCwKKyAgICAJMHgwMDAwZmZmZgorICAgIH0sCisgICAgeworCU9QX0NSTk9SLAorICAgIAkweDAwMDBmZmZmLAorCTAsCisJMSwKKwkwLAorICAgIAkweDgwMDBmZmZmCisgICAgfSwKKyAgICB7CisJT1BfQ1JFUVYsCisgICAgCTB4MDAwMGZmZmYsCisJMCwKKwkwLAorCTAsCisgICAgCTB4ODAwMGZmZmYKKyAgICB9LAorICAgIHsKKwlPUF9DUkVRViwKKyAgICAJMHgwMDAwZmZmZiwKKwkwLAorCTE2LAorCTAsCisgICAgCTB4MDAwMGZmZmYKKyAgICB9LAorfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1X3Bvc3RfY3Jfc2l6ZTQgPQorICAgIHNpemVvZiAoY3B1X3Bvc3RfY3JfdGFibGU0KSAvIHNpemVvZiAoc3RydWN0IGNwdV9wb3N0X2NyX3M0KTsKKworaW50IGNwdV9wb3N0X3Rlc3RfY3IgKHZvaWQpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgdW5zaWduZWQgbG9uZyBjcl9zYXY7CisKKyAgICBhc20gKCAibWZjciAlMCIgOiAiPXIiIChjcl9zYXYpIDogKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjcHVfcG9zdF9jcl9zaXplMSAmJiByZXQgPT0gMDsgaSsrKQorICAgIHsKKwl1bG9uZyBjciA9IGNwdV9wb3N0X2NyX3RhYmxlMVtpXTsKKwl1bG9uZyByZXM7CisKKyAgICAJdW5zaWduZWQgbG9uZyBjb2RlW10gPQorCXsKKwkgICAgQVNNX01UQ1IoMyksCisJICAgIEFTTV9NRkNSKDMpLAorCSAgICBBU01fQkxSLAorCX07CisKKwljcHVfcG9zdF9leGVjXzExIChjb2RlLCAmcmVzLCBjcik7CisKKwlyZXQgPSByZXMgPT0gY3IgPyAwIDogLTE7CisKKyAgICAJaWYgKHJldCAhPSAwKQorICAgIAl7CisgICAgICAgICAgICBwb3N0X2xvZyAoIkVycm9yIGF0IGNyMSB0ZXN0ICVkICFcbiIsIGkpOworICAgIAl9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGNwdV9wb3N0X2NyX3NpemUyICYmIHJldCA9PSAwOyBpKyspCisgICAgeworCXN0cnVjdCBjcHVfcG9zdF9jcl9zMiAqdGVzdCA9IGNwdV9wb3N0X2NyX3RhYmxlMiArIGk7CisJdWxvbmcgcmVzOworCXVsb25nIHhlcjsKKworICAgIAl1bnNpZ25lZCBsb25nIGNvZGVbXSA9CisJeworCSAgICBBU01fTVRYRVIoMyksCisJICAgIEFTTV9NQ1JYUih0ZXN0LT5jciksCisJICAgIEFTTV9NRkNSKDMpLAorCSAgICBBU01fTUZYRVIoNCksCisJICAgIEFTTV9CTFIsCisJfTsKKworCWNwdV9wb3N0X2V4ZWNfMjF4IChjb2RlLCAmcmVzLCAmeGVyLCB0ZXN0LT54ZXIpOworCisJcmV0ID0geGVyID09IDAgJiYgKChyZXMgPDwgKDQgKiB0ZXN0LT5jcikpICYgMHhlMDAwMDAwMCkgPT0gdGVzdC0+eGVyID8KKwkgICAgICAwIDogLTE7CisKKyAgICAJaWYgKHJldCAhPSAwKQorICAgIAl7CisgICAgICAgICAgICBwb3N0X2xvZyAoIkVycm9yIGF0IGNyMiB0ZXN0ICVkICFcbiIsIGkpOworICAgIAl9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGNwdV9wb3N0X2NyX3NpemUzICYmIHJldCA9PSAwOyBpKyspCisgICAgeworCXN0cnVjdCBjcHVfcG9zdF9jcl9zMyAqdGVzdCA9IGNwdV9wb3N0X2NyX3RhYmxlMyArIGk7CisJdWxvbmcgcmVzOworCisgICAgCXVuc2lnbmVkIGxvbmcgY29kZVtdID0KKwl7CisJICAgIEFTTV9NVENSKDMpLAorCSAgICBBU01fTUNSRih0ZXN0LT5jZCwgdGVzdC0+Y3MpLAorCSAgICBBU01fTUZDUigzKSwKKwkgICAgQVNNX0JMUiwKKwl9OworCisJY3B1X3Bvc3RfZXhlY18xMSAoY29kZSwgJnJlcywgdGVzdC0+Y3IpOworCisJcmV0ID0gcmVzID09IHRlc3QtPnJlcyA/IDAgOiAtMTsKKworICAgIAlpZiAocmV0ICE9IDApCisgICAgCXsKKyAgICAgICAgICAgIHBvc3RfbG9nICgiRXJyb3IgYXQgY3IzIHRlc3QgJWQgIVxuIiwgaSk7CisgICAgCX0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3B1X3Bvc3RfY3Jfc2l6ZTQgJiYgcmV0ID09IDA7IGkrKykKKyAgICB7CisJc3RydWN0IGNwdV9wb3N0X2NyX3M0ICp0ZXN0ID0gY3B1X3Bvc3RfY3JfdGFibGU0ICsgaTsKKwl1bG9uZyByZXM7CisKKyAgICAJdW5zaWduZWQgbG9uZyBjb2RlW10gPQorCXsKKwkgICAgQVNNX01UQ1IoMyksCisJICAgIEFTTV8xMkYodGVzdC0+Y21kLCB0ZXN0LT5vcDMsIHRlc3QtPm9wMSwgdGVzdC0+b3AyKSwKKwkgICAgQVNNX01GQ1IoMyksCisJICAgIEFTTV9CTFIsCisJfTsKKworCWNwdV9wb3N0X2V4ZWNfMTEgKGNvZGUsICZyZXMsIHRlc3QtPmNyKTsKKworCXJldCA9IHJlcyA9PSB0ZXN0LT5yZXMgPyAwIDogLTE7CisKKyAgICAJaWYgKHJldCAhPSAwKQorICAgIAl7CisgICAgICAgICAgICBwb3N0X2xvZyAoIkVycm9yIGF0IGNyNCB0ZXN0ICVkICFcbiIsIGkpOworICAgIAl9CisgICAgfQorCisgICAgYXNtICggIm10Y3IgJTAiIDogOiAiciIgKGNyX3NhdikpOworCisgICAgcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Bvc3QvY3B1L3RocmVlLmMgYi9wb3N0L2NwdS90aHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDc0NzYKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2NwdS90aHJlZS5jCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworLyoKKyAqIENQVSB0ZXN0CisgKiBUZXJuYXJ5IGluc3RydWN0aW9ucwkJaW5zdHIgckQsckEsckIKKyAqCisgKiBBcml0aG1ldGljIGluc3RydWN0aW9uczoJYWRkLCBhZGRjLCBhZGRlLCBzdWJmLCBzdWJmYywgc3ViZmUsCisgKgkJCQltdWxsdywgbXVsaHcsIG11bGh3dSwgZGl2dywgZGl2d3UKKyAqCisgKiBUaGUgdGVzdCBjb250YWlucyBhIHByZS1idWlsdCB0YWJsZSBvZiBpbnN0cnVjdGlvbnMsIG9wZXJhbmRzIGFuZAorICogZXhwZWN0ZWQgcmVzdWx0cy4gRm9yIGVhY2ggdGFibGUgZW50cnksIHRoZSB0ZXN0IHdpbGwgY3ljbGljYWxseSB1c2UKKyAqIGRpZmZlcmVudCBzZXRzIG9mIG9wZXJhbmQgcmVnaXN0ZXJzIGFuZCByZXN1bHQgcmVnaXN0ZXJzLgorICovCisKKyNpZmRlZiBDT05GSUdfUE9TVAorCisjaW5jbHVkZSA8cG9zdC5oPgorI2luY2x1ZGUgImNwdV9hc20uaCIKKworI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfQ1BVCisKK2V4dGVybiB2b2lkIGNwdV9wb3N0X2V4ZWNfMjIgKHVsb25nICpjb2RlLCB1bG9uZyAqY3IsIHVsb25nICpyZXMsIHVsb25nIG9wMSwKKyAgICB1bG9uZyBvcDIpOworZXh0ZXJuIHVsb25nIGNwdV9wb3N0X21ha2VjciAobG9uZyB2KTsKKworc3RhdGljIHN0cnVjdCBjcHVfcG9zdF90aHJlZV9zCit7CisgICAgdWxvbmcgY21kOworICAgIHVsb25nIG9wMTsKKyAgICB1bG9uZyBvcDI7CisgICAgdWxvbmcgcmVzOworfSBjcHVfcG9zdF90aHJlZV90YWJsZVtdID0KK3sKKyAgICB7CisgICAgCU9QX0FERCwKKwkxMDAsCisJMjAwLAorCTMwMAorICAgIH0sCisgICAgeworICAgIAlPUF9BREQsCisJMTAwLAorCS0yMDAsCisJLTEwMAorICAgIH0sCisgICAgeworICAgIAlPUF9BRERDLAorCTEwMCwKKwkyMDAsCisJMzAwCisgICAgfSwKKyAgICB7CisgICAgCU9QX0FEREMsCisJMTAwLAorCS0yMDAsCisJLTEwMAorICAgIH0sCisgICAgeworICAgIAlPUF9BRERFLAorCTEwMCwKKwkyMDAsCisJMzAwCisgICAgfSwKKyAgICB7CisgICAgCU9QX0FEREUsCisJMTAwLAorCS0yMDAsCisJLTEwMAorICAgIH0sCisgICAgeworICAgIAlPUF9TVUJGLAorCTEwMCwKKwkyMDAsCisJMTAwCisgICAgfSwKKyAgICB7CisgICAgCU9QX1NVQkYsCisJMzAwLAorCTIwMCwKKwktMTAwCisgICAgfSwKKyAgICB7CisgICAgCU9QX1NVQkZDLAorCTEwMCwKKwkyMDAsCisJMTAwCisgICAgfSwKKyAgICB7CisgICAgCU9QX1NVQkZDLAorCTMwMCwKKwkyMDAsCisJLTEwMAorICAgIH0sCisgICAgeworICAgIAlPUF9TVUJGRSwKKwkxMDAsCisJMjAwLAorCTIwMCArIH4xMDAKKyAgICB9LAorICAgIHsKKyAgICAJT1BfU1VCRkUsCisJMzAwLAorCTIwMCwKKwkyMDAgKyB+MzAwCisgICAgfSwKKyAgICB7CisgICAgCU9QX01VTExXLAorCTIwMCwKKwkzMDAsCisJMjAwICogMzAwCisgICAgfSwKKyAgICB7CisgICAgCU9QX01VTEhXLAorCTB4MTAwMDAwMDAsCisJMHgxMDAwMDAwMCwKKwkweDEwMDAwMDAKKyAgICB9LAorICAgIHsKKyAgICAJT1BfTVVMSFdVLAorCTB4ODAwMDAwMDAsCisJMHg4MDAwMDAwMCwKKwkweDQwMDAwMDAwCisgICAgfSwKKyAgICB7CisgICAgCU9QX0RJVlcsCisJLTIwLAorCTUsCisJLTQKKyAgICB9LAorICAgIHsKKyAgICAJT1BfRElWV1UsCisJMHg4MDAwLAorCTB4MjAwLAorCTB4NDAKKyAgICB9LAorfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1X3Bvc3RfdGhyZWVfc2l6ZSA9CisgICAgc2l6ZW9mIChjcHVfcG9zdF90aHJlZV90YWJsZSkgLyBzaXplb2YgKHN0cnVjdCBjcHVfcG9zdF90aHJlZV9zKTsKKworaW50IGNwdV9wb3N0X3Rlc3RfdGhyZWUgKHZvaWQpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgdW5zaWduZWQgaW50IGksIHJlZzsKKyAgICBpbnQgZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNwdV9wb3N0X3RocmVlX3NpemUgJiYgcmV0ID09IDA7IGkrKykKKyAgICB7CisJc3RydWN0IGNwdV9wb3N0X3RocmVlX3MgKnRlc3QgPSBjcHVfcG9zdF90aHJlZV90YWJsZSArIGk7CisKKwlmb3IgKHJlZyA9IDA7IHJlZyA8IDMyICYmIHJldCA9PSAwOyByZWcrKykKKwl7CisJICAgIHVuc2lnbmVkIGludCByZWcwID0gKHJlZyArIDApICUgMzI7CisJICAgIHVuc2lnbmVkIGludCByZWcxID0gKHJlZyArIDEpICUgMzI7CisJICAgIHVuc2lnbmVkIGludCByZWcyID0gKHJlZyArIDIpICUgMzI7CisJICAgIHVuc2lnbmVkIGludCBzdGsgPSByZWcgPCAxNiA/IDMxIDogMTU7CisgICAgCSAgICB1bnNpZ25lZCBsb25nIGNvZGVbXSA9CisJICAgIHsKKwkJQVNNX1NUVyhzdGssIDEsIC00KSwKKwkJQVNNX0FEREkoc3RrLCAxLCAtMjQpLAorCQlBU01fU1RXKDMsIHN0aywgMTIpLAorCQlBU01fU1RXKDQsIHN0aywgMTYpLAorCQlBU01fU1RXKHJlZzAsIHN0aywgOCksCisJCUFTTV9TVFcocmVnMSwgc3RrLCA0KSwKKwkJQVNNX1NUVyhyZWcyLCBzdGssIDApLAorCQlBU01fTFdaKHJlZzEsIHN0aywgMTIpLAorCQlBU01fTFdaKHJlZzAsIHN0aywgMTYpLAorCQlBU01fMTIodGVzdC0+Y21kLCByZWcyLCByZWcxLCByZWcwKSwKKwkJQVNNX1NUVyhyZWcyLCBzdGssIDEyKSwKKwkJQVNNX0xXWihyZWcyLCBzdGssIDApLAorCQlBU01fTFdaKHJlZzEsIHN0aywgNCksCisJCUFTTV9MV1oocmVnMCwgc3RrLCA4KSwKKwkJQVNNX0xXWigzLCBzdGssIDEyKSwKKwkJQVNNX0FEREkoMSwgc3RrLCAyNCksCisJCUFTTV9MV1ooc3RrLCAxLCAtNCksCisJCUFTTV9CTFIsCisJICAgIH07CisgICAgCSAgICB1bnNpZ25lZCBsb25nIGNvZGVjcltdID0KKwkgICAgeworCQlBU01fU1RXKHN0aywgMSwgLTQpLAorCQlBU01fQURESShzdGssIDEsIC0yNCksCisJCUFTTV9TVFcoMywgc3RrLCAxMiksCisJCUFTTV9TVFcoNCwgc3RrLCAxNiksCisJCUFTTV9TVFcocmVnMCwgc3RrLCA4KSwKKwkJQVNNX1NUVyhyZWcxLCBzdGssIDQpLAorCQlBU01fU1RXKHJlZzIsIHN0aywgMCksCisJCUFTTV9MV1oocmVnMSwgc3RrLCAxMiksCisJCUFTTV9MV1oocmVnMCwgc3RrLCAxNiksCisJCUFTTV8xMih0ZXN0LT5jbWQsIHJlZzIsIHJlZzEsIHJlZzApIHwgQklUX0MsCisJCUFTTV9TVFcocmVnMiwgc3RrLCAxMiksCisJCUFTTV9MV1oocmVnMiwgc3RrLCAwKSwKKwkJQVNNX0xXWihyZWcxLCBzdGssIDQpLAorCQlBU01fTFdaKHJlZzAsIHN0aywgOCksCisJCUFTTV9MV1ooMywgc3RrLCAxMiksCisJCUFTTV9BRERJKDEsIHN0aywgMjQpLAorCQlBU01fTFdaKHN0aywgMSwgLTQpLAorCQlBU01fQkxSLAorCSAgICB9OworCSAgICB1bG9uZyByZXM7CisJICAgIHVsb25nIGNyOworCisJICAgIGlmIChyZXQgPT0gMCkKKwkgICAgeworIAkgICAgCWNyID0gMDsKKwkgICAgCWNwdV9wb3N0X2V4ZWNfMjIgKGNvZGUsICYgY3IsICYgcmVzLCB0ZXN0LT5vcDEsIHRlc3QtPm9wMik7CisKKwkgICAgCXJldCA9IHJlcyA9PSB0ZXN0LT5yZXMgJiYgY3IgPT0gMCA/IDAgOiAtMTsKKworCSAgICAJaWYgKHJldCAhPSAwKQorCSAgICAJeworCSAgICAgICAgICAgIHBvc3RfbG9nICgiRXJyb3IgYXQgdGhyZWUgdGVzdCAlZCAhXG4iLCBpKTsKKwkgICAgCX0KKwkgICAgfQorCisJICAgIGlmIChyZXQgPT0gMCkKKwkgICAgeworCSAgICAJY3B1X3Bvc3RfZXhlY18yMiAoY29kZWNyLCAmIGNyLCAmIHJlcywgdGVzdC0+b3AxLCB0ZXN0LT5vcDIpOworCisJICAgIAlyZXQgPSByZXMgPT0gdGVzdC0+cmVzICYmCisJCSAgICAgIChjciAmIDB4ZTAwMDAwMDApID09IGNwdV9wb3N0X21ha2VjciAocmVzKSA/IDAgOiAtMTsKKworCSAgICAJaWYgKHJldCAhPSAwKQorCSAgICAJeworCSAgICAgICAgICAgIHBvc3RfbG9nICgiRXJyb3IgYXQgdGhyZWUgdGVzdCAlZCAhXG4iLCBpKTsKKwkgICAgICAgIH0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoZmxhZykKKyAgICAJZW5hYmxlX2ludGVycnVwdHMoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9wb3N0L2NwdS90aHJlZWkuYyBiL3Bvc3QvY3B1L3RocmVlaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZjAxNzgKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2NwdS90aHJlZWkuYwpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qCisgKiBDUFUgdGVzdAorICogVGVybmFyeSBpbnN0cnVjdGlvbnMJCWluc3RyIHJBLHJTLFVJTU0KKyAqCisgKiBMb2dpYyBpbnN0cnVjdGlvbnM6CQlvcmksIG9yaXMsIHhvcmksIHhvcmlzCisgKgorICogVGhlIHRlc3QgY29udGFpbnMgYSBwcmUtYnVpbHQgdGFibGUgb2YgaW5zdHJ1Y3Rpb25zLCBvcGVyYW5kcyBhbmQKKyAqIGV4cGVjdGVkIHJlc3VsdHMuIEZvciBlYWNoIHRhYmxlIGVudHJ5LCB0aGUgdGVzdCB3aWxsIGN5Y2xpY2FsbHkgdXNlCisgKiBkaWZmZXJlbnQgc2V0cyBvZiBvcGVyYW5kIHJlZ2lzdGVycyBhbmQgcmVzdWx0IHJlZ2lzdGVycy4KKyAqLworCisjaWZkZWYgQ09ORklHX1BPU1QKKworI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlICJjcHVfYXNtLmgiCisKKyNpZiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0NQVQorCitleHRlcm4gdm9pZCBjcHVfcG9zdF9leGVjXzIxICh1bG9uZyAqY29kZSwgdWxvbmcgKmNyLCB1bG9uZyAqcmVzLCB1bG9uZyBvcCk7CitleHRlcm4gdWxvbmcgY3B1X3Bvc3RfbWFrZWNyIChsb25nIHYpOworCitzdGF0aWMgc3RydWN0IGNwdV9wb3N0X3RocmVlaV9zCit7CisgICAgdWxvbmcgY21kOworICAgIHVsb25nIG9wMTsKKyAgICB1c2hvcnQgb3AyOworICAgIHVsb25nIHJlczsKK30gY3B1X3Bvc3RfdGhyZWVpX3RhYmxlW10gPQoreworICAgIHsKKyAgICAJT1BfT1JJLAorCTB4ODAwMDAwMDAsCisJMHhmZmZmLAorCTB4ODAwMGZmZmYKKyAgICB9LAorICAgIHsKKyAgICAJT1BfT1JJUywKKwkweDAwMDA4MDAwLAorCTB4ZmZmZiwKKwkweGZmZmY4MDAwCisgICAgfSwKKyAgICB7CisgICAgCU9QX1hPUkksCisJMHg4MDAwZmZmZiwKKwkweGZmZmYsCisJMHg4MDAwMDAwMAorICAgIH0sCisgICAgeworICAgIAlPUF9YT1JJUywKKwkweDAwMDA4MDAwLAorCTB4ZmZmZiwKKwkweGZmZmY4MDAwCisgICAgfSwKK307CitzdGF0aWMgdW5zaWduZWQgaW50IGNwdV9wb3N0X3RocmVlaV9zaXplID0KKyAgICBzaXplb2YgKGNwdV9wb3N0X3RocmVlaV90YWJsZSkgLyBzaXplb2YgKHN0cnVjdCBjcHVfcG9zdF90aHJlZWlfcyk7CisKK2ludCBjcHVfcG9zdF90ZXN0X3RocmVlaSAodm9pZCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaSwgcmVnOworICAgIGludCBmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3B1X3Bvc3RfdGhyZWVpX3NpemUgJiYgcmV0ID09IDA7IGkrKykKKyAgICB7CisJc3RydWN0IGNwdV9wb3N0X3RocmVlaV9zICp0ZXN0ID0gY3B1X3Bvc3RfdGhyZWVpX3RhYmxlICsgaTsKKworCWZvciAocmVnID0gMDsgcmVnIDwgMzIgJiYgcmV0ID09IDA7IHJlZysrKQorCXsKKwkgICAgdW5zaWduZWQgaW50IHJlZzAgPSAocmVnICsgMCkgJSAzMjsKKwkgICAgdW5zaWduZWQgaW50IHJlZzEgPSAocmVnICsgMSkgJSAzMjsKKwkgICAgdW5zaWduZWQgaW50IHN0ayA9IHJlZyA8IDE2ID8gMzEgOiAxNTsKKyAgICAJICAgIHVuc2lnbmVkIGxvbmcgY29kZVtdID0KKwkgICAgeworCQlBU01fU1RXKHN0aywgMSwgLTQpLAorCQlBU01fQURESShzdGssIDEsIC0xNiksCisJCUFTTV9TVFcoMywgc3RrLCA4KSwKKwkJQVNNX1NUVyhyZWcwLCBzdGssIDQpLAorCQlBU01fU1RXKHJlZzEsIHN0aywgMCksCisJCUFTTV9MV1oocmVnMCwgc3RrLCA4KSwKKwkJQVNNXzExSVgodGVzdC0+Y21kLCByZWcxLCByZWcwLCB0ZXN0LT5vcDIpLAorCQlBU01fU1RXKHJlZzEsIHN0aywgOCksCisJCUFTTV9MV1oocmVnMSwgc3RrLCAwKSwKKwkJQVNNX0xXWihyZWcwLCBzdGssIDQpLAorCQlBU01fTFdaKDMsIHN0aywgOCksCisJCUFTTV9BRERJKDEsIHN0aywgMTYpLAorCQlBU01fTFdaKHN0aywgMSwgLTQpLAorCQlBU01fQkxSLAorCSAgICB9OworCSAgICB1bG9uZyByZXM7CisJICAgIHVsb25nIGNyOworCisgCSAgICBjciA9IDA7CisJICAgIGNwdV9wb3N0X2V4ZWNfMjEgKGNvZGUsICYgY3IsICYgcmVzLCB0ZXN0LT5vcDEpOworCisJICAgIHJldCA9IHJlcyA9PSB0ZXN0LT5yZXMgJiYgY3IgPT0gMCA/IDAgOiAtMTsKKworCSAgICBpZiAocmV0ICE9IDApCisJICAgIHsKKwkgICAgICAgIHBvc3RfbG9nICgiRXJyb3IgYXQgdGhyZWVpIHRlc3QgJWQgIVxuIiwgaSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKGZsYWcpCisgICAgCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcG9zdC9jcHUvdGhyZWV4LmMgYi9wb3N0L2NwdS90aHJlZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzcyMDYzCi0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9jcHUvdGhyZWV4LmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisvKgorICogQ1BVIHRlc3QKKyAqIFRlcm5hcnkgaW5zdHJ1Y3Rpb25zCQlpbnN0ciByQSxyUyxyQgorICoKKyAqIExvZ2ljIGluc3RydWN0aW9uczoJCW9yLCBvcmMsIHhvciwgbmFuZCwgbm9yLCBlcXYKKyAqIFNoaWZ0IGluc3RydWN0aW9uczoJCXNsdywgc3J3LCBzcmF3CisgKgorICogVGhlIHRlc3QgY29udGFpbnMgYSBwcmUtYnVpbHQgdGFibGUgb2YgaW5zdHJ1Y3Rpb25zLCBvcGVyYW5kcyBhbmQKKyAqIGV4cGVjdGVkIHJlc3VsdHMuIEZvciBlYWNoIHRhYmxlIGVudHJ5LCB0aGUgdGVzdCB3aWxsIGN5Y2xpY2FsbHkgdXNlCisgKiBkaWZmZXJlbnQgc2V0cyBvZiBvcGVyYW5kIHJlZ2lzdGVycyBhbmQgcmVzdWx0IHJlZ2lzdGVycy4KKyAqLworCisjaWZkZWYgQ09ORklHX1BPU1QKKworI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlICJjcHVfYXNtLmgiCisKKyNpZiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0NQVQorCitleHRlcm4gdm9pZCBjcHVfcG9zdF9leGVjXzIyICh1bG9uZyAqY29kZSwgdWxvbmcgKmNyLCB1bG9uZyAqcmVzLCB1bG9uZyBvcDEsCisgICAgdWxvbmcgb3AyKTsKK2V4dGVybiB1bG9uZyBjcHVfcG9zdF9tYWtlY3IgKGxvbmcgdik7CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X3Bvc3RfdGhyZWV4X3MKK3sKKyAgICB1bG9uZyBjbWQ7CisgICAgdWxvbmcgb3AxOworICAgIHVsb25nIG9wMjsKKyAgICB1bG9uZyByZXM7Cit9IGNwdV9wb3N0X3RocmVleF90YWJsZVtdID0KK3sKKyAgICB7CisgICAgCU9QX09SLAorCTB4MTIzNCwKKwkweDU2NzgsCisJMHgxMjM0IHwgMHg1Njc4CisgICAgfSwKKyAgICB7CisgICAgCU9QX09SQywKKwkweDEyMzQsCisJMHg1Njc4LAorCTB4MTIzNCB8IH4weDU2NzgKKyAgICB9LAorICAgIHsKKyAgICAJT1BfWE9SLAorCTB4MTIzNCwKKwkweDU2NzgsCisJMHgxMjM0IF4gMHg1Njc4CisgICAgfSwKKyAgICB7CisgICAgCU9QX05BTkQsCisJMHgxMjM0LAorCTB4NTY3OCwKKwl+KDB4MTIzNCAmIDB4NTY3OCkKKyAgICB9LAorICAgIHsKKyAgICAJT1BfTk9SLAorCTB4MTIzNCwKKwkweDU2NzgsCisJfigweDEyMzQgfCAweDU2NzgpCisgICAgfSwKKyAgICB7CisgICAgCU9QX0VRViwKKwkweDEyMzQsCisJMHg1Njc4LAorCX4oMHgxMjM0IF4gMHg1Njc4KQorICAgIH0sCisgICAgeworICAgIAlPUF9TTFcsCisJMHg4MCwKKwkxNiwKKwkweDgwMDAwMAorICAgIH0sCisgICAgeworICAgIAlPUF9TTFcsCisJMHg4MCwKKwkzMiwKKwkwCisgICAgfSwKKyAgICB7CisgICAgCU9QX1NSVywKKwkweDgwMDAwMCwKKwkxNiwKKwkweDgwCisgICAgfSwKKyAgICB7CisgICAgCU9QX1NSVywKKwkweDgwMDAwMCwKKwkzMiwKKwkwCisgICAgfSwKKyAgICB7CisgICAgCU9QX1NSQVcsCisJMHg4MDAwMDAwMCwKKwkzLAorCTB4ZjAwMDAwMDAKKyAgICB9LAorICAgIHsKKyAgICAJT1BfU1JBVywKKwkweDgwMDAsCisJMywKKwkweDEwMDAKKyAgICB9LAorfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1X3Bvc3RfdGhyZWV4X3NpemUgPQorICAgIHNpemVvZiAoY3B1X3Bvc3RfdGhyZWV4X3RhYmxlKSAvIHNpemVvZiAoc3RydWN0IGNwdV9wb3N0X3RocmVleF9zKTsKKworaW50IGNwdV9wb3N0X3Rlc3RfdGhyZWV4ICh2b2lkKQoreworICAgIGludCByZXQgPSAwOworICAgIHVuc2lnbmVkIGludCBpLCByZWc7CisgICAgaW50IGZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjcHVfcG9zdF90aHJlZXhfc2l6ZSAmJiByZXQgPT0gMDsgaSsrKQorICAgIHsKKwlzdHJ1Y3QgY3B1X3Bvc3RfdGhyZWV4X3MgKnRlc3QgPSBjcHVfcG9zdF90aHJlZXhfdGFibGUgKyBpOworCisJZm9yIChyZWcgPSAwOyByZWcgPCAzMiAmJiByZXQgPT0gMDsgcmVnKyspCisJeworCSAgICB1bnNpZ25lZCBpbnQgcmVnMCA9IChyZWcgKyAwKSAlIDMyOworCSAgICB1bnNpZ25lZCBpbnQgcmVnMSA9IChyZWcgKyAxKSAlIDMyOworCSAgICB1bnNpZ25lZCBpbnQgcmVnMiA9IChyZWcgKyAyKSAlIDMyOworCSAgICB1bnNpZ25lZCBpbnQgc3RrID0gcmVnIDwgMTYgPyAzMSA6IDE1OworICAgIAkgICAgdW5zaWduZWQgbG9uZyBjb2RlW10gPQorCSAgICB7CisJCUFTTV9TVFcoc3RrLCAxLCAtNCksCisJCUFTTV9BRERJKHN0aywgMSwgLTI0KSwKKwkJQVNNX1NUVygzLCBzdGssIDEyKSwKKwkJQVNNX1NUVyg0LCBzdGssIDE2KSwKKwkJQVNNX1NUVyhyZWcwLCBzdGssIDgpLAorCQlBU01fU1RXKHJlZzEsIHN0aywgNCksCisJCUFTTV9TVFcocmVnMiwgc3RrLCAwKSwKKwkJQVNNX0xXWihyZWcxLCBzdGssIDEyKSwKKwkJQVNNX0xXWihyZWcwLCBzdGssIDE2KSwKKwkJQVNNXzEyWCh0ZXN0LT5jbWQsIHJlZzIsIHJlZzEsIHJlZzApLAorCQlBU01fU1RXKHJlZzIsIHN0aywgMTIpLAorCQlBU01fTFdaKHJlZzIsIHN0aywgMCksCisJCUFTTV9MV1oocmVnMSwgc3RrLCA0KSwKKwkJQVNNX0xXWihyZWcwLCBzdGssIDgpLAorCQlBU01fTFdaKDMsIHN0aywgMTIpLAorCQlBU01fQURESSgxLCBzdGssIDI0KSwKKwkJQVNNX0xXWihzdGssIDEsIC00KSwKKwkJQVNNX0JMUiwKKwkgICAgfTsKKyAgICAJICAgIHVuc2lnbmVkIGxvbmcgY29kZWNyW10gPQorCSAgICB7CisJCUFTTV9TVFcoc3RrLCAxLCAtNCksCisJCUFTTV9BRERJKHN0aywgMSwgLTI0KSwKKwkJQVNNX1NUVygzLCBzdGssIDEyKSwKKwkJQVNNX1NUVyg0LCBzdGssIDE2KSwKKwkJQVNNX1NUVyhyZWcwLCBzdGssIDgpLAorCQlBU01fU1RXKHJlZzEsIHN0aywgNCksCisJCUFTTV9TVFcocmVnMiwgc3RrLCAwKSwKKwkJQVNNX0xXWihyZWcxLCBzdGssIDEyKSwKKwkJQVNNX0xXWihyZWcwLCBzdGssIDE2KSwKKwkJQVNNXzEyWCh0ZXN0LT5jbWQsIHJlZzIsIHJlZzEsIHJlZzApIHwgQklUX0MsCisJCUFTTV9TVFcocmVnMiwgc3RrLCAxMiksCisJCUFTTV9MV1oocmVnMiwgc3RrLCAwKSwKKwkJQVNNX0xXWihyZWcxLCBzdGssIDQpLAorCQlBU01fTFdaKHJlZzAsIHN0aywgOCksCisJCUFTTV9MV1ooMywgc3RrLCAxMiksCisJCUFTTV9BRERJKDEsIHN0aywgMjQpLAorCQlBU01fTFdaKHN0aywgMSwgLTQpLAorCQlBU01fQkxSLAorCSAgICB9OworCSAgICB1bG9uZyByZXM7CisJICAgIHVsb25nIGNyOworCisJICAgIGlmIChyZXQgPT0gMCkKKwkgICAgeworIAkgICAgCWNyID0gMDsKKwkgICAgCWNwdV9wb3N0X2V4ZWNfMjIgKGNvZGUsICYgY3IsICYgcmVzLCB0ZXN0LT5vcDEsIHRlc3QtPm9wMik7CisKKwkgICAgCXJldCA9IHJlcyA9PSB0ZXN0LT5yZXMgJiYgY3IgPT0gMCA/IDAgOiAtMTsKKworCSAgICAJaWYgKHJldCAhPSAwKQorCSAgICAJeworCSAgICAgICAgICAgIHBvc3RfbG9nICgiRXJyb3IgYXQgdGhyZWV4IHRlc3QgJWQgIVxuIiwgaSk7CisJICAgIAl9CisJICAgIH0KKworCSAgICBpZiAocmV0ID09IDApCisJICAgIHsKKwkgICAgCWNwdV9wb3N0X2V4ZWNfMjIgKGNvZGVjciwgJiBjciwgJiByZXMsIHRlc3QtPm9wMSwgdGVzdC0+b3AyKTsKKworCSAgICAJcmV0ID0gcmVzID09IHRlc3QtPnJlcyAmJgorCQkgICAgICAoY3IgJiAweGUwMDAwMDAwKSA9PSBjcHVfcG9zdF9tYWtlY3IgKHJlcykgPyAwIDogLTE7CisKKwkgICAgCWlmIChyZXQgIT0gMCkKKwkgICAgCXsKKwkgICAgICAgICAgICBwb3N0X2xvZyAoIkVycm9yIGF0IHRocmVleCB0ZXN0ICVkICFcbiIsIGkpOworCSAgICAgICAgfQorCSAgICB9CisJfQorICAgIH0KKworICAgIGlmIChmbGFnKQorICAgIAllbmFibGVfaW50ZXJydXB0cygpOworCisgICAgcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Bvc3QvY3B1L3R3by5jIGIvcG9zdC9jcHUvdHdvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3NTcxNAotLS0gL2Rldi9udWxsCisrKyBiL3Bvc3QvY3B1L3R3by5jCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworLyoKKyAqIENQVSB0ZXN0CisgKiBCaW5hcnkgaW5zdHJ1Y3Rpb25zCQlpbnN0ciByRCxyQQorICoKKyAqIExvZ2ljIGluc3RydWN0aW9uczoJCW5lZworICogQXJpdGhtZXRpYyBpbnN0cnVjdGlvbnM6CWFkZG1lLCBhZGR6ZSwgc3ViZm1lLCBzdWJmemUKKworICogVGhlIHRlc3QgY29udGFpbnMgYSBwcmUtYnVpbHQgdGFibGUgb2YgaW5zdHJ1Y3Rpb25zLCBvcGVyYW5kcyBhbmQKKyAqIGV4cGVjdGVkIHJlc3VsdHMuIEZvciBlYWNoIHRhYmxlIGVudHJ5LCB0aGUgdGVzdCB3aWxsIGN5Y2xpY2FsbHkgdXNlCisgKiBkaWZmZXJlbnQgc2V0cyBvZiBvcGVyYW5kIHJlZ2lzdGVycyBhbmQgcmVzdWx0IHJlZ2lzdGVycy4KKyAqLworCisjaWZkZWYgQ09ORklHX1BPU1QKKworI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlICJjcHVfYXNtLmgiCisKKyNpZiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0NQVQorCitleHRlcm4gdm9pZCBjcHVfcG9zdF9leGVjXzIxICh1bG9uZyAqY29kZSwgdWxvbmcgKmNyLCB1bG9uZyAqcmVzLCB1bG9uZyBvcDEpOworZXh0ZXJuIHVsb25nIGNwdV9wb3N0X21ha2VjciAobG9uZyB2KTsKKworc3RhdGljIHN0cnVjdCBjcHVfcG9zdF90d29fcworeworICAgIHVsb25nIGNtZDsKKyAgICB1bG9uZyBvcDsKKyAgICB1bG9uZyByZXM7Cit9IGNwdV9wb3N0X3R3b190YWJsZVtdID0KK3sKKyAgICB7CisgICAgCU9QX05FRywKKwkzLAorCS0zCisgICAgfSwKKyAgICB7CisgICAgCU9QX05FRywKKwk1LAorCS01CisgICAgfSwKKyAgICB7CisgICAgICAgIE9QX0FERE1FLAorCTYsCisJNQorICAgIH0sCisgICAgeworICAgICAgICBPUF9BRERaRSwKKwk1LAorCTUKKyAgICB9LAorICAgIHsKKyAgICAgICAgT1BfU1VCRk1FLAorCTYsCisJfjYgLSAxCisgICAgfSwKKyAgICB7CisgICAgICAgIE9QX1NVQkZaRSwKKwk1LAorCX41CisgICAgfSwKK307CitzdGF0aWMgdW5zaWduZWQgaW50IGNwdV9wb3N0X3R3b19zaXplID0KKyAgICBzaXplb2YgKGNwdV9wb3N0X3R3b190YWJsZSkgLyBzaXplb2YgKHN0cnVjdCBjcHVfcG9zdF90d29fcyk7CisKK2ludCBjcHVfcG9zdF90ZXN0X3R3byAodm9pZCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaSwgcmVnOworICAgIGludCBmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3B1X3Bvc3RfdHdvX3NpemUgJiYgcmV0ID09IDA7IGkrKykKKyAgICB7CisJc3RydWN0IGNwdV9wb3N0X3R3b19zICp0ZXN0ID0gY3B1X3Bvc3RfdHdvX3RhYmxlICsgaTsKKworCWZvciAocmVnID0gMDsgcmVnIDwgMzIgJiYgcmV0ID09IDA7IHJlZysrKQorCXsKKwkgICAgdW5zaWduZWQgaW50IHJlZzAgPSAocmVnICsgMCkgJSAzMjsKKwkgICAgdW5zaWduZWQgaW50IHJlZzEgPSAocmVnICsgMSkgJSAzMjsKKwkgICAgdW5zaWduZWQgaW50IHN0ayA9IHJlZyA8IDE2ID8gMzEgOiAxNTsKKyAgICAJICAgIHVuc2lnbmVkIGxvbmcgY29kZVtdID0KKwkgICAgeworCQlBU01fU1RXKHN0aywgMSwgLTQpLAorCQlBU01fQURESShzdGssIDEsIC0xNiksCisJCUFTTV9TVFcoMywgc3RrLCA4KSwKKwkJQVNNX1NUVyhyZWcwLCBzdGssIDQpLAorCQlBU01fU1RXKHJlZzEsIHN0aywgMCksCisJCUFTTV9MV1oocmVnMCwgc3RrLCA4KSwKKwkJQVNNXzExKHRlc3QtPmNtZCwgcmVnMSwgcmVnMCksCisJCUFTTV9TVFcocmVnMSwgc3RrLCA4KSwKKwkJQVNNX0xXWihyZWcxLCBzdGssIDApLAorCQlBU01fTFdaKHJlZzAsIHN0aywgNCksCisJCUFTTV9MV1ooMywgc3RrLCA4KSwKKwkJQVNNX0FEREkoMSwgc3RrLCAxNiksCisJCUFTTV9MV1ooc3RrLCAxLCAtNCksCisJCUFTTV9CTFIsCisJICAgIH07CisgICAgCSAgICB1bnNpZ25lZCBsb25nIGNvZGVjcltdID0KKwkgICAgeworCQlBU01fU1RXKHN0aywgMSwgLTQpLAorCQlBU01fQURESShzdGssIDEsIC0xNiksCisJCUFTTV9TVFcoMywgc3RrLCA4KSwKKwkJQVNNX1NUVyhyZWcwLCBzdGssIDQpLAorCQlBU01fU1RXKHJlZzEsIHN0aywgMCksCisJCUFTTV9MV1oocmVnMCwgc3RrLCA4KSwKKwkJQVNNXzExKHRlc3QtPmNtZCwgcmVnMSwgcmVnMCkgfCBCSVRfQywKKwkJQVNNX1NUVyhyZWcxLCBzdGssIDgpLAorCQlBU01fTFdaKHJlZzEsIHN0aywgMCksCisJCUFTTV9MV1oocmVnMCwgc3RrLCA0KSwKKwkJQVNNX0xXWigzLCBzdGssIDgpLAorCQlBU01fQURESSgxLCBzdGssIDE2KSwKKwkJQVNNX0xXWihzdGssIDEsIC00KSwKKwkJQVNNX0JMUiwKKwkgICAgfTsKKwkgICAgdWxvbmcgcmVzOworCSAgICB1bG9uZyBjcjsKKworCSAgICBpZiAocmV0ID09IDApCisJICAgIHsKKyAJICAgIAljciA9IDA7CisJICAgIAljcHVfcG9zdF9leGVjXzIxIChjb2RlLCAmIGNyLCAmIHJlcywgdGVzdC0+b3ApOworCisJICAgIAlyZXQgPSByZXMgPT0gdGVzdC0+cmVzICYmIGNyID09IDAgPyAwIDogLTE7CisKKwkgICAgCWlmIChyZXQgIT0gMCkKKwkgICAgCXsKKwkgICAgICAgICAgICBwb3N0X2xvZyAoIkVycm9yIGF0IHR3byB0ZXN0ICVkICFcbiIsIGkpOworCSAgICAJfQorCSAgICB9CisKKwkgICAgaWYgKHJldCA9PSAwKQorCSAgICB7CisJICAgIAljcHVfcG9zdF9leGVjXzIxIChjb2RlY3IsICYgY3IsICYgcmVzLCB0ZXN0LT5vcCk7CisKKwkgICAgCXJldCA9IHJlcyA9PSB0ZXN0LT5yZXMgJiYKKwkJICAgICAgKGNyICYgMHhlMDAwMDAwMCkgPT0gY3B1X3Bvc3RfbWFrZWNyIChyZXMpID8gMCA6IC0xOworCisJICAgIAlpZiAocmV0ICE9IDApCisJICAgIAl7CisJICAgICAgICAgICAgcG9zdF9sb2cgKCJFcnJvciBhdCB0d28gdGVzdCAlZCAhXG4iLCBpKTsKKwkgICAgICAgIH0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoZmxhZykKKyAgICAJZW5hYmxlX2ludGVycnVwdHMoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9wb3N0L2NwdS90d294LmMgYi9wb3N0L2NwdS90d294LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkOTk1NAotLS0gL2Rldi9udWxsCisrKyBiL3Bvc3QvY3B1L3R3b3guYwpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qCisgKiBDUFUgdGVzdAorICogQmluYXJ5IGluc3RydWN0aW9ucwkJaW5zdHIgckEsclMKKyAqCisgKiBMb2dpYyBpbnN0cnVjdGlvbnM6CQljbnRsencKKyAqIEFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zOglleHRzYiwgZXh0c2gKKworICogVGhlIHRlc3QgY29udGFpbnMgYSBwcmUtYnVpbHQgdGFibGUgb2YgaW5zdHJ1Y3Rpb25zLCBvcGVyYW5kcyBhbmQKKyAqIGV4cGVjdGVkIHJlc3VsdHMuIEZvciBlYWNoIHRhYmxlIGVudHJ5LCB0aGUgdGVzdCB3aWxsIGN5Y2xpY2FsbHkgdXNlCisgKiBkaWZmZXJlbnQgc2V0cyBvZiBvcGVyYW5kIHJlZ2lzdGVycyBhbmQgcmVzdWx0IHJlZ2lzdGVycy4KKyAqLworCisjaWZkZWYgQ09ORklHX1BPU1QKKworI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlICJjcHVfYXNtLmgiCisKKyNpZiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0NQVQorCitleHRlcm4gdm9pZCBjcHVfcG9zdF9leGVjXzIxICh1bG9uZyAqY29kZSwgdWxvbmcgKmNyLCB1bG9uZyAqcmVzLCB1bG9uZyBvcDEpOworZXh0ZXJuIHVsb25nIGNwdV9wb3N0X21ha2VjciAobG9uZyB2KTsKKworc3RhdGljIHN0cnVjdCBjcHVfcG9zdF90d294X3MKK3sKKyAgICB1bG9uZyBjbWQ7CisgICAgdWxvbmcgb3A7CisgICAgdWxvbmcgcmVzOworfSBjcHVfcG9zdF90d294X3RhYmxlW10gPQoreworICAgIHsKKyAgICAJT1BfRVhUU0IsCisJMywKKwkzCisgICAgfSwKKyAgICB7CisgICAgCU9QX0VYVFNCLAorCTB4ZmYsCisJLTEKKyAgICB9LAorICAgIHsKKyAgICAJT1BfRVhUU0gsCisJMywKKwkzCisgICAgfSwKKyAgICB7CisgICAgCU9QX0VYVFNILAorCTB4ZmYsCisJMHhmZgorICAgIH0sCisgICAgeworICAgIAlPUF9FWFRTSCwKKwkweGZmZmYsCisJLTEKKyAgICB9LAorICAgIHsKKyAgICAJT1BfQ05UTFpXLAorCTB4MDAwZmZmZmYsCisJMTIKKyAgICB9LAorfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1X3Bvc3RfdHdveF9zaXplID0KKyAgICBzaXplb2YgKGNwdV9wb3N0X3R3b3hfdGFibGUpIC8gc2l6ZW9mIChzdHJ1Y3QgY3B1X3Bvc3RfdHdveF9zKTsKKworaW50IGNwdV9wb3N0X3Rlc3RfdHdveCAodm9pZCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaSwgcmVnOworICAgIGludCBmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3B1X3Bvc3RfdHdveF9zaXplICYmIHJldCA9PSAwOyBpKyspCisgICAgeworCXN0cnVjdCBjcHVfcG9zdF90d294X3MgKnRlc3QgPSBjcHVfcG9zdF90d294X3RhYmxlICsgaTsKKworCWZvciAocmVnID0gMDsgcmVnIDwgMzIgJiYgcmV0ID09IDA7IHJlZysrKQorCXsKKwkgICAgdW5zaWduZWQgaW50IHJlZzAgPSAocmVnICsgMCkgJSAzMjsKKwkgICAgdW5zaWduZWQgaW50IHJlZzEgPSAocmVnICsgMSkgJSAzMjsKKwkgICAgdW5zaWduZWQgaW50IHN0ayA9IHJlZyA8IDE2ID8gMzEgOiAxNTsKKyAgICAJICAgIHVuc2lnbmVkIGxvbmcgY29kZVtdID0KKwkgICAgeworCQlBU01fU1RXKHN0aywgMSwgLTQpLAorCQlBU01fQURESShzdGssIDEsIC0xNiksCisJCUFTTV9TVFcoMywgc3RrLCA4KSwKKwkJQVNNX1NUVyhyZWcwLCBzdGssIDQpLAorCQlBU01fU1RXKHJlZzEsIHN0aywgMCksCisJCUFTTV9MV1oocmVnMCwgc3RrLCA4KSwKKwkJQVNNXzExWCh0ZXN0LT5jbWQsIHJlZzEsIHJlZzApLAorCQlBU01fU1RXKHJlZzEsIHN0aywgOCksCisJCUFTTV9MV1oocmVnMSwgc3RrLCAwKSwKKwkJQVNNX0xXWihyZWcwLCBzdGssIDQpLAorCQlBU01fTFdaKDMsIHN0aywgOCksCisJCUFTTV9BRERJKDEsIHN0aywgMTYpLAorCQlBU01fTFdaKHN0aywgMSwgLTQpLAorCQlBU01fQkxSLAorCSAgICB9OworICAgIAkgICAgdW5zaWduZWQgbG9uZyBjb2RlY3JbXSA9CisJICAgIHsKKwkJQVNNX1NUVyhzdGssIDEsIC00KSwKKwkJQVNNX0FEREkoc3RrLCAxLCAtMTYpLAorCQlBU01fU1RXKDMsIHN0aywgOCksCisJCUFTTV9TVFcocmVnMCwgc3RrLCA0KSwKKwkJQVNNX1NUVyhyZWcxLCBzdGssIDApLAorCQlBU01fTFdaKHJlZzAsIHN0aywgOCksCisJCUFTTV8xMVgodGVzdC0+Y21kLCByZWcxLCByZWcwKSB8IEJJVF9DLAorCQlBU01fU1RXKHJlZzEsIHN0aywgOCksCisJCUFTTV9MV1oocmVnMSwgc3RrLCAwKSwKKwkJQVNNX0xXWihyZWcwLCBzdGssIDQpLAorCQlBU01fTFdaKDMsIHN0aywgOCksCisJCUFTTV9BRERJKDEsIHN0aywgMTYpLAorCQlBU01fTFdaKHN0aywgMSwgLTQpLAorCQlBU01fQkxSLAorCSAgICB9OworCSAgICB1bG9uZyByZXM7CisJICAgIHVsb25nIGNyOworCisJICAgIGlmIChyZXQgPT0gMCkKKwkgICAgeworIAkgICAgCWNyID0gMDsKKwkgICAgCWNwdV9wb3N0X2V4ZWNfMjEgKGNvZGUsICYgY3IsICYgcmVzLCB0ZXN0LT5vcCk7CisKKwkgICAgCXJldCA9IHJlcyA9PSB0ZXN0LT5yZXMgJiYgY3IgPT0gMCA/IDAgOiAtMTsKKworCSAgICAJaWYgKHJldCAhPSAwKQorCSAgICAJeworCSAgICAgICAgICAgIHBvc3RfbG9nICgiRXJyb3IgYXQgdHdveCB0ZXN0ICVkICFcbiIsIGkpOworCSAgICAJfQorCSAgICB9CisKKwkgICAgaWYgKHJldCA9PSAwKQorCSAgICB7CisJICAgIAljcHVfcG9zdF9leGVjXzIxIChjb2RlY3IsICYgY3IsICYgcmVzLCB0ZXN0LT5vcCk7CisKKwkgICAgCXJldCA9IHJlcyA9PSB0ZXN0LT5yZXMgJiYKKwkJICAgICAgKGNyICYgMHhlMDAwMDAwMCkgPT0gY3B1X3Bvc3RfbWFrZWNyIChyZXMpID8gMCA6IC0xOworCisJICAgIAlpZiAocmV0ICE9IDApCisJICAgIAl7CisJICAgICAgICAgICAgcG9zdF9sb2cgKCJFcnJvciBhdCB0d294IHRlc3QgJWQgIVxuIiwgaSk7CisJICAgICAgICB9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKGZsYWcpCisgICAgCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcG9zdC9ldGhlci5jIGIvcG9zdC9ldGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNDJjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2V0aGVyLmMKQEAgLTAsMCArMSw2NDYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisvKgorICogRXRoZXJuZXQgdGVzdAorICoKKyAqIFRoZSBTZXJpYWwgQ29tbXVuaWNhdGlvbiBDb250cm9sbGVycyAoU0NDKSBsaXN0ZWQgaW4gY3Rscl9saXN0IGFycmF5IGJlbG93CisgKiBhcmUgdGVzdGVkIGluIHRoZSBsb29wYmFjayBldGhlcm5ldCBtb2RlLgorICogVGhlIGNvbnRyb2xsZXJzIGFyZSBjb25maWd1cmVkIGFjY29yZGluZ2x5IGFuZCBzZXZlcmFsIHBhY2tldHMKKyAqIGFyZSB0cmFuc21pdHRlZC4gVGhlIGNvbmZpZ3VyYWJsZSB0ZXN0IHBhcmFtZXRlcnMgYXJlOgorICogICBNSU5fUEFDS0VUX0xFTkdUSCAtIG1pbmltdW0gc2l6ZSBvZiBwYWNrZXQgdG8gdHJhbnNtaXQKKyAqICAgTUFYX1BBQ0tFVF9MRU5HVEggLSBtYXhpbXVtIHNpemUgb2YgcGFja2V0IHRvIHRyYW5zbWl0CisgKiAgIFRFU1RfTlVNIC0gbnVtYmVyIG9mIHRlc3RzCisgKi8KKworI2lmZGVmIENPTkZJR19QT1NUCisKKyNpbmNsdWRlIDxwb3N0Lmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR184eHgpCisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzgyNjApCisjaW5jbHVkZSA8YXNtL2NwbV84MjYwLmg+CisjZWxzZQorI2Vycm9yICJBcHBhcmVudGx5IGEgYmFkIGNvbmZpZ3VyYXRpb24sIHBsZWFzZSBmaXguIgorI2VuZGlmCisKKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisKKyNpZiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0VUSEVSCisKKyNkZWZpbmUgTUlOX1BBQ0tFVF9MRU5HVEgJNjQKKyNkZWZpbmUgTUFYX1BBQ0tFVF9MRU5HVEgJMjU2CisjZGVmaW5lIFRFU1RfTlVNCQkxCisKKyNkZWZpbmUgQ1RMUl9TQ0MgMAorCitleHRlcm4gdm9pZCBzcGlfaW5pdF9mICh2b2lkKTsKK2V4dGVybiB2b2lkIHNwaV9pbml0X3IgKHZvaWQpOworCisvKiBUaGUgbGlzdCBvZiBjb250cm9sbGVycyB0byB0ZXN0ICovCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODIzKQorc3RhdGljIGludCBjdGxyX2xpc3RbXVsyXSA9IHsge0NUTFJfU0NDLCAxfSB9OworI2Vsc2UKK3N0YXRpYyBpbnQgY3Rscl9saXN0W11bMl0gPSB7IH07CisjZW5kaWYKKworI2RlZmluZSBDVFJMX0xJU1RfU0laRSAoc2l6ZW9mKGN0bHJfbGlzdCkgLyBzaXplb2YoY3Rscl9saXN0WzBdKSkKKworc3RhdGljIHN0cnVjdCB7CisJdm9pZCAoKmluaXQpIChpbnQgaW5kZXgpOworCWludCAoKnNlbmQpIChpbnQgaW5kZXgsIHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCk7CisJaW50ICgqcmVjdikgKGludCBpbmRleCwgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKTsKK30gY3Rscl9wcm9jWzFdOworCitzdGF0aWMgY2hhciAqY3Rscl9uYW1lWzFdID0geyAiU0NDIiB9OworCitzdGF0aWMgaW50IHVzZWRfYnlfdWFydFsxXSA9IHsgLTEgfTsKK3N0YXRpYyBpbnQgdXNlZF9ieV9ldGhlclsxXSA9IHsgLTEgfTsKKworLyogRXRoZXJuZXQgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQnVmZmVycyAqLworI2RlZmluZSBEQlVGX0xFTkdUSCAgMTUyMAorCisjZGVmaW5lIFRYX0JVRl9DTlQgMgorCisjZGVmaW5lIFRPVVRfTE9PUCAxMDAKKworc3RhdGljIGNoYXIgdHhidWZbREJVRl9MRU5HVEhdOworCitzdGF0aWMgdWludCByeElkeDsJCS8qIGluZGV4IG9mIHRoZSBjdXJyZW50IFJYIGJ1ZmZlciAqLworc3RhdGljIHVpbnQgdHhJZHg7CQkvKiBpbmRleCBvZiB0aGUgY3VycmVudCBUWCBidWZmZXIgKi8KKworLyoKKyAgKiBTQ0MgRXRoZXJuZXQgVHggYW5kIFJ4IGJ1ZmZlciBkZXNjcmlwdG9ycyBhbGxvY2F0ZWQgYXQgdGhlCisgICogIGltbXItPnVkYXRhX2JkIGFkZHJlc3Mgb24gRHVhbC1Qb3J0IFJBTQorICAqIFByb3ZpZGUgZm9yIERvdWJsZSBCdWZmZXJpbmcKKyAgKi8KKwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgQ29tbW9uQnVmZmVyRGVzY3JpcHRvciB7CisJY2JkX3QgcnhiZFtQS1RCVUZTUlhdOwkJLyogUnggQkQgKi8KKwljYmRfdCB0eGJkW1RYX0JVRl9DTlRdOwkJLyogVHggQkQgKi8KK30gUlRYQkQ7CisKK3N0YXRpYyBSVFhCRCAqcnR4OworCisgIC8qCisgICAqIFNDQyBjYWxsYmFja3MKKyAgICovCisKK3N0YXRpYyB2b2lkIHNjY19pbml0IChpbnQgc2NjX2luZGV4KQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCWJkX3QgKmJkID0gZ2QtPmJkOworCisJc3RhdGljIGludCBwcm9mZltdID0KKwkJCXsgUFJPRkZfU0NDMSwgUFJPRkZfU0NDMiwgUFJPRkZfU0NDMywgUFJPRkZfU0NDNCB9OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgY3BtX2NyW10gPQorCQkJeyBDUE1fQ1JfQ0hfU0NDMSwgQ1BNX0NSX0NIX1NDQzIsIENQTV9DUl9DSF9TQ0MzLAorQ1BNX0NSX0NIX1NDQzQgfTsKKworCWludCBpOworCXNjY19lbmV0X3QgKnByYW1fcHRyOworCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENGR19JTU1SOworCisJaW1tci0+aW1fY3BtLmNwX3NjY1tzY2NfaW5kZXhdLnNjY19nc21ybCAmPQorCQkJfihTQ0NfR1NNUkxfRU5SIHwgU0NDX0dTTVJMX0VOVCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19GQURTKQorI2lmIGRlZmluZWQoQ09ORklHX01QQzg2MFQpCisJLyogVGhlIEZBRFM4NjBUIGRvZXNuJ3QgdXNlIHRoZSBNT0RFTV9FTiBvciBEQVRBX1ZPSUNFIHNpZ25hbHMuICovCisJKigodWludCAqKSBCQ1NSNCkgJj0gfkJDU1I0X0VUSExPT1A7CisJKigodWludCAqKSBCQ1NSNCkgfD0gQkNTUjRfVEZQTERMIHwgQkNTUjRfVFBTUUVMOworCSooKHVpbnQgKikgQkNTUjEpICY9IH5CQ1NSMV9FVEhFTjsKKyNlbHNlCisJKigodWludCAqKSBCQ1NSNCkgJj0gfihCQ1NSNF9FVEhMT09QIHwgQkNTUjRfTU9ERU1fRU4pOworCSooKHVpbnQgKikgQkNTUjQpIHw9IEJDU1I0X1RGUExETCB8IEJDU1I0X1RQU1FFTCB8IEJDU1I0X0RBVEFfVk9JQ0U7CisJKigodWludCAqKSBCQ1NSMSkgJj0gfkJDU1IxX0VUSEVOOworI2VuZGlmCisjZW5kaWYKKworCXByYW1fcHRyID0gKHNjY19lbmV0X3QgKikgJiAoaW1tci0+aW1fY3BtLmNwX2RwYXJhbVtwcm9mZltzY2NfaW5kZXhdXSk7CisKKwlyeElkeCA9IDA7CisJdHhJZHggPSAwOworCisjaWZkZWYgQ0ZHX0FMTE9DX0RQUkFNCisJcnR4ID0gKFJUWEJEICopIChpbW1yLT5pbV9jcG0uY3BfZHBtZW0gKworCQkJCQkgZHByYW1fYWxsb2NfYWxpZ24gKHNpemVvZiAoUlRYQkQpLCA4KSk7CisjZWxzZQorCXJ0eCA9IChSVFhCRCAqKSAoaW1tci0+aW1fY3BtLmNwX2RwbWVtICsgQ1BNX1NDQ19CQVNFKTsKKyNlbmRpZgorCisjaWYgMAorCisjaWYgKGRlZmluZWQoUEFfRU5FVF9SWEQpICYmIGRlZmluZWQoUEFfRU5FVF9UWEQpKQorCS8qIENvbmZpZ3VyZSBwb3J0IEEgcGlucyBmb3IgVHhkIGFuZCBSeGQuCisJICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSAoUEFfRU5FVF9SWEQgfCBQQV9FTkVUX1RYRCk7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+KFBBX0VORVRfUlhEIHwgUEFfRU5FVF9UWEQpOworCWltbXItPmltX2lvcG9ydC5pb3BfcGFvZHIgJj0gflBBX0VORVRfVFhEOworI2VsaWYgKGRlZmluZWQoUEJfRU5FVF9SWEQpICYmIGRlZmluZWQoUEJfRU5FVF9UWEQpKQorCS8qIENvbmZpZ3VyZSBwb3J0IEIgcGlucyBmb3IgVHhkIGFuZCBSeGQuCisJICovCisJaW1tci0+aW1fY3BtLmNwX3BicGFyIHw9IChQQl9FTkVUX1JYRCB8IFBCX0VORVRfVFhEKTsKKwlpbW1yLT5pbV9jcG0uY3BfcGJkaXIgJj0gfihQQl9FTkVUX1JYRCB8IFBCX0VORVRfVFhEKTsKKwlpbW1yLT5pbV9jcG0uY3BfcGJvZHIgJj0gflBCX0VORVRfVFhEOworI2Vsc2UKKyNlcnJvciBDb25maWd1cmF0aW9uIEVycm9yOiBleGFjdGx5IE9ORSBvZiBQQV9FTkVUX1tSVF1YRCwgUEJfRU5FVF9bUlRdWEQgbXVzdCBiZSBkZWZpbmVkCisjZW5kaWYKKworI2lmIGRlZmluZWQoUENfRU5FVF9MQkspCisJLyogQ29uZmlndXJlIHBvcnQgQyBwaW5zIHRvIGRpc2FibGUgRXh0ZXJuYWwgTG9vcGJhY2sKKwkgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IH5QQ19FTkVUX0xCSzsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGlyIHw9IFBDX0VORVRfTEJLOworCWltbXItPmltX2lvcG9ydC5pb3BfcGNzbyAmPSB+UENfRU5FVF9MQks7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RhdCAmPSB+UENfRU5FVF9MQks7CS8qIERpc2FibGUgTG9vcGJhY2sgKi8KKyNlbmRpZiAvKiBQQ19FTkVUX0xCSyAqLworCisJLyogQ29uZmlndXJlIHBvcnQgQyBwaW5zIHRvIGVuYWJsZSBDTFNOIGFuZCBSRU5BLgorCSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGNwYXIgJj0gfihQQ19FTkVUX0NMU04gfCBQQ19FTkVUX1JFTkEpOworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgJj0gfihQQ19FTkVUX0NMU04gfCBQQ19FTkVUX1JFTkEpOworCWltbXItPmltX2lvcG9ydC5pb3BfcGNzbyB8PSAoUENfRU5FVF9DTFNOIHwgUENfRU5FVF9SRU5BKTsKKworCS8qIENvbmZpZ3VyZSBwb3J0IEEgZm9yIFRDTEsgYW5kIFJDTEsuCisJICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSAoUEFfRU5FVF9UQ0xLIHwgUEFfRU5FVF9SQ0xLKTsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyICY9IH4oUEFfRU5FVF9UQ0xLIHwgUEFfRU5FVF9SQ0xLKTsKKworCS8qCisJICogQ29uZmlndXJlIFNlcmlhbCBJbnRlcmZhY2UgY2xvY2sgcm91dGluZyAtLSBzZWUgc2VjdGlvbiAxNi43LjUuMworCSAqIEZpcnN0LCBjbGVhciBhbGwgU0NDIGJpdHMgdG8gemVybywgdGhlbiBzZXQgdGhlIG9uZXMgd2Ugd2FudC4KKwkgKi8KKworCWltbXItPmltX2NwbS5jcF9zaWNyICY9IH5TSUNSX0VORVRfTUFTSzsKKwlpbW1yLT5pbV9jcG0uY3Bfc2ljciB8PSBTSUNSX0VORVRfQ0xLUlQ7CisjZWxzZQorCS8qCisJICogU0NDMiByZWNlaXZlIGNsb2NrIGlzIEJSRzIKKwkgKiBTQ0MyIHRyYW5zbWl0IGNsb2NrIGlzIEJSRzMKKwkgKi8KKwlpbW1yLT5pbV9jcG0uY3BfYnJnYzIgPSAweDAwMDEwMDBDOworCWltbXItPmltX2NwbS5jcF9icmdjMyA9IDB4MDAwMTAwMEM7CisKKwlpbW1yLT5pbV9jcG0uY3Bfc2ljciAmPSB+MHgwMDAwM0YwMDsKKwlpbW1yLT5pbV9jcG0uY3Bfc2ljciB8PSAgMHgwMDAwMGEwMDsKKyNlbmRpZiAvKiAwICovCisKKworCS8qCisJICogSW5pdGlhbGl6ZSBTRENSIC0tIHNlZSBzZWN0aW9uIDE2LjkuMjMuNworCSAqIFNETUEgY29uZmlndXJhdGlvbiByZWdpc3RlcgorCSAqLworCWltbXItPmltX3NpdV9jb25mLnNjX3NkY3IgPSAweDAxOworCisKKwkvKgorCSAqIFNldHVwIFNDQyBFdGhlcm5ldCBQYXJhbWV0ZXIgUkFNCisJICovCisKKwlwcmFtX3B0ci0+c2VuX2dlbnNjYy5zY2NfcmZjciA9IDB4MTg7CS8qIE5vcm1hbCBPcGVyYXRpb24gYW5kIE1vdCBieXRlIG9yZGVyaW5nICovCisJcHJhbV9wdHItPnNlbl9nZW5zY2Muc2NjX3RmY3IgPSAweDE4OwkvKiBNb3QgYnl0ZSBvcmRlcmluZywgTm9ybWFsIGFjY2VzcyAqLworCisJcHJhbV9wdHItPnNlbl9nZW5zY2Muc2NjX21yYmxyID0gREJVRl9MRU5HVEg7CS8qIG1heC4gRVQgcGFja2FnZSBsZW4gMTUyMCAqLworCisJcHJhbV9wdHItPnNlbl9nZW5zY2Muc2NjX3JiYXNlID0gKHVuc2lnbmVkIGludCkgKCZydHgtPnJ4YmRbMF0pOwkvKiBTZXQgUlhCRCB0Ymwgc3RhcnQgYXQgRHVhbCBQb3J0ICovCisJcHJhbV9wdHItPnNlbl9nZW5zY2Muc2NjX3RiYXNlID0gKHVuc2lnbmVkIGludCkgKCZydHgtPnR4YmRbMF0pOwkvKiBTZXQgVFhCRCB0Ymwgc3RhcnQgYXQgRHVhbCBQb3J0ICovCisKKwkvKgorCSAqIFNldHVwIFJlY2VpdmVyIEJ1ZmZlciBEZXNjcmlwdG9ycyAoMTMuMTQuMjQuMTgpCisJICogU2V0dGluZ3M6CisJICogICAgIEVtcHR5LCBXcmFwCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgUEtUQlVGU1JYOyBpKyspIHsKKwkJcnR4LT5yeGJkW2ldLmNiZF9zYyA9IEJEX0VORVRfUlhfRU1QVFk7CisJCXJ0eC0+cnhiZFtpXS5jYmRfZGF0bGVuID0gMDsJLyogUmVzZXQgKi8KKwkJcnR4LT5yeGJkW2ldLmNiZF9idWZhZGRyID0gKHVpbnQpIE5ldFJ4UGFja2V0c1tpXTsKKwl9CisKKwlydHgtPnJ4YmRbUEtUQlVGU1JYIC0gMV0uY2JkX3NjIHw9IEJEX0VORVRfUlhfV1JBUDsKKworCS8qCisJICogU2V0dXAgRXRoZXJuZXQgVHJhbnNtaXR0ZXIgQnVmZmVyIERlc2NyaXB0b3JzICgxMy4xNC4yNC4xOSkKKwkgKiBTZXR0aW5nczoKKwkgKiAgICBBZGQgUEFEcyB0byBTaG9ydCBGUkFNRVMsIFdyYXAsIExhc3QsIFR4IENSQworCSAqLworCisJZm9yIChpID0gMDsgaSA8IFRYX0JVRl9DTlQ7IGkrKykgeworCQlydHgtPnR4YmRbaV0uY2JkX3NjID0KKwkJCQkoQkRfRU5FVF9UWF9QQUQgfCBCRF9FTkVUX1RYX0xBU1QgfCBCRF9FTkVUX1RYX1RDKTsKKwkJcnR4LT50eGJkW2ldLmNiZF9kYXRsZW4gPSAwOwkvKiBSZXNldCAqLworCQlydHgtPnR4YmRbaV0uY2JkX2J1ZmFkZHIgPSAodWludCkgKCZ0eGJ1ZlswXSk7CisJfQorCisJcnR4LT50eGJkW1RYX0JVRl9DTlQgLSAxXS5jYmRfc2MgfD0gQkRfRU5FVF9UWF9XUkFQOworCisJLyoKKwkgKiBFbnRlciBDb21tYW5kOiAgSW5pdGlhbGl6ZSBSeCBQYXJhbXMgZm9yIFNDQworCSAqLworCisJZG8gewkJCQkvKiBTcGluIHVudGlsIHJlYWR5IHRvIGlzc3VlIGNvbW1hbmQgICAgKi8KKwkJX19hc21fXyAoImVpZWlvIik7CisJfSB3aGlsZSAoaW1tci0+aW1fY3BtLmNwX2NwY3IgJiBDUE1fQ1JfRkxHKTsKKwkvKiBJc3N1ZSBjb21tYW5kICovCisJaW1tci0+aW1fY3BtLmNwX2NwY3IgPQorCQkJKChDUE1fQ1JfSU5JVF9SWCA8PCA4KSB8IChjcG1fY3Jbc2NjX2luZGV4XSA8PCA0KSB8CisJCQkgQ1BNX0NSX0ZMRyk7CisJZG8gewkJCQkvKiBTcGluIHVudGlsIGNvbW1hbmQgcHJvY2Vzc2VkICAgICAqLworCQlfX2FzbV9fICgiZWllaW8iKTsKKwl9IHdoaWxlIChpbW1yLT5pbV9jcG0uY3BfY3BjciAmIENQTV9DUl9GTEcpOworCisJLyoKKwkgKiBFdGhlcm5ldCBTcGVjaWZpYyBQYXJhbWV0ZXIgUkFNCisJICogICAgIHNlZSB0YWJsZSAxMy0xNiwgcGcuIDY2MCwKKwkgKiAgICAgcGcuIDY4MSAoZXhhbXBsZSB3aXRoIHN1Z2dlc3RlZCBzZXR0aW5ncykKKwkgKi8KKworCXByYW1fcHRyLT5zZW5fY3ByZXMgPSB+KDB4MCk7CS8qIFByZXNldCBDUkMgKi8KKwlwcmFtX3B0ci0+c2VuX2NtYXNrID0gMHhkZWJiMjBlMzsJLyogQ29uc3RhbnQgTWFzayBmb3IgQ1JDICovCisJcHJhbV9wdHItPnNlbl9jcmNlYyA9IDB4MDsJLyogRXJyb3IgQ291bnRlciBDUkMgKHVudXNlZCkgKi8KKwlwcmFtX3B0ci0+c2VuX2FsZWMgPSAweDA7CS8qIEFsaWdubWVudCBFcnJvciBDb3VudGVyICh1bnVzZWQpICovCisJcHJhbV9wdHItPnNlbl9kaXNmYyA9IDB4MDsJLyogRGlzY2FyZCBGcmFtZSBDb3VudGVyICh1bnVzZWQpICovCisJcHJhbV9wdHItPnNlbl9wYWRzID0gMHg4ODg4OwkvKiBTaG9ydCBGcmFtZSBQQUQgQ2hhcmFjdGVycyAqLworCisJcHJhbV9wdHItPnNlbl9yZXRsaW0gPSAxNTsJLyogUmV0cnkgTGltaXQgVGhyZXNob2xkICovCisJcHJhbV9wdHItPnNlbl9tYXhmbHIgPSAxNTE4OwkvKiBNQVggRnJhbWUgTGVuZ3RoIFJlZ2lzdGVyICovCisJcHJhbV9wdHItPnNlbl9taW5mbHIgPSA2NDsJLyogTUlOIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLworCisJcHJhbV9wdHItPnNlbl9tYXhkMSA9IERCVUZfTEVOR1RIOwkvKiBNQVggRE1BMSBMZW5ndGggUmVnaXN0ZXIgKi8KKwlwcmFtX3B0ci0+c2VuX21heGQyID0gREJVRl9MRU5HVEg7CS8qIE1BWCBETUEyIExlbmd0aCBSZWdpc3RlciAqLworCisJcHJhbV9wdHItPnNlbl9nYWRkcjEgPSAweDA7CS8qIEdyb3VwIEFkZHJlc3MgRmlsdGVyIDEgKHVudXNlZCkgKi8KKwlwcmFtX3B0ci0+c2VuX2dhZGRyMiA9IDB4MDsJLyogR3JvdXAgQWRkcmVzcyBGaWx0ZXIgMiAodW51c2VkKSAqLworCXByYW1fcHRyLT5zZW5fZ2FkZHIzID0gMHgwOwkvKiBHcm91cCBBZGRyZXNzIEZpbHRlciAzICh1bnVzZWQpICovCisJcHJhbV9wdHItPnNlbl9nYWRkcjQgPSAweDA7CS8qIEdyb3VwIEFkZHJlc3MgRmlsdGVyIDQgKHVudXNlZCkgKi8KKworI2RlZmluZSBlYSBiZC0+YmlfZW5ldGFkZHIKKwlwcmFtX3B0ci0+c2VuX3BhZGRyaCA9IChlYVs1XSA8PCA4KSArIGVhWzRdOworCXByYW1fcHRyLT5zZW5fcGFkZHJtID0gKGVhWzNdIDw8IDgpICsgZWFbMl07CisJcHJhbV9wdHItPnNlbl9wYWRkcmwgPSAoZWFbMV0gPDwgOCkgKyBlYVswXTsKKyN1bmRlZiBlYQorCisJcHJhbV9wdHItPnNlbl9wcGVyID0gMHgwOwkvKiBQZXJzaXN0ZW5jZSAodW51c2VkKSAqLworCXByYW1fcHRyLT5zZW5faWFkZHIxID0gMHgwOwkvKiBJbmRpdmlkdWFsIEFkZHJlc3MgRmlsdGVyIDEgKHVudXNlZCkgKi8KKwlwcmFtX3B0ci0+c2VuX2lhZGRyMiA9IDB4MDsJLyogSW5kaXZpZHVhbCBBZGRyZXNzIEZpbHRlciAyICh1bnVzZWQpICovCisJcHJhbV9wdHItPnNlbl9pYWRkcjMgPSAweDA7CS8qIEluZGl2aWR1YWwgQWRkcmVzcyBGaWx0ZXIgMyAodW51c2VkKSAqLworCXByYW1fcHRyLT5zZW5faWFkZHI0ID0gMHgwOwkvKiBJbmRpdmlkdWFsIEFkZHJlc3MgRmlsdGVyIDQgKHVudXNlZCkgKi8KKwlwcmFtX3B0ci0+c2VuX3RhZGRyaCA9IDB4MDsJLyogVG1wIEFkZHJlc3MgKE1TQikgKHVudXNlZCkgKi8KKwlwcmFtX3B0ci0+c2VuX3RhZGRybSA9IDB4MDsJLyogVG1wIEFkZHJlc3MgKHVudXNlZCkgKi8KKwlwcmFtX3B0ci0+c2VuX3RhZGRybCA9IDB4MDsJLyogVG1wIEFkZHJlc3MgKExTQikgKHVudXNlZCkgKi8KKworCS8qCisJICogRW50ZXIgQ29tbWFuZDogIEluaXRpYWxpemUgVHggUGFyYW1zIGZvciBTQ0MKKwkgKi8KKworCWRvIHsJCQkJLyogU3BpbiB1bnRpbCByZWFkeSB0byBpc3N1ZSBjb21tYW5kICAgICovCisJCV9fYXNtX18gKCJlaWVpbyIpOworCX0gd2hpbGUgKGltbXItPmltX2NwbS5jcF9jcGNyICYgQ1BNX0NSX0ZMRyk7CisJLyogSXNzdWUgY29tbWFuZCAqLworCWltbXItPmltX2NwbS5jcF9jcGNyID0KKwkJCSgoQ1BNX0NSX0lOSVRfVFggPDwgOCkgfCAoY3BtX2NyW3NjY19pbmRleF0gPDwgNCkgfAorCQkJIENQTV9DUl9GTEcpOworCWRvIHsJCQkJLyogU3BpbiB1bnRpbCBjb21tYW5kIHByb2Nlc3NlZCAgICAgKi8KKwkJX19hc21fXyAoImVpZWlvIik7CisJfSB3aGlsZSAoaW1tci0+aW1fY3BtLmNwX2NwY3IgJiBDUE1fQ1JfRkxHKTsKKworCS8qCisJICogTWFzayBhbGwgRXZlbnRzIGluIFNDQ00gLSB3ZSB1c2UgcG9sbGluZyBtb2RlCisJICovCisJaW1tci0+aW1fY3BtLmNwX3NjY1tzY2NfaW5kZXhdLnNjY19zY2NtID0gMDsKKworCS8qCisJICogQ2xlYXIgRXZlbnRzIGluIFNDQ0UgLS0gQ2xlYXIgYml0cyBieSB3cml0aW5nIDEncworCSAqLworCisJaW1tci0+aW1fY3BtLmNwX3NjY1tzY2NfaW5kZXhdLnNjY19zY2NlID0gfigweDApOworCisKKwkvKgorCSAqIEluaXRpYWxpemUgR1NNUiBIaWdoIDMyLUJpdHMKKwkgKiBTZXR0aW5nczogIE5vcm1hbCBNb2RlCisJICovCisKKwlpbW1yLT5pbV9jcG0uY3Bfc2NjW3NjY19pbmRleF0uc2NjX2dzbXJoID0gMDsKKworCS8qCisJICogSW5pdGlhbGl6ZSBHU01SIExvdyAzMi1CaXRzLCBidXQgZG8gbm90IEVuYWJsZSBUcmFuc21pdC9SZWNlaXZlCisJICogU2V0dGluZ3M6CisJICogICAgIFRDSSA9IEludmVydAorCSAqICAgICBUUEwgPSAgNDggYml0cworCSAqICAgICBUUFAgPSBSZXBlYXRpbmcgMTAncworCSAqICAgICBMT09QID0gTG9vcGJhY2sKKwkgKiAgICAgTU9ERSA9IEV0aGVybmV0CisJICovCisKKwlpbW1yLT5pbV9jcG0uY3Bfc2NjW3NjY19pbmRleF0uc2NjX2dzbXJsID0gKFNDQ19HU01STF9UQ0kgfAorCQkJCQkJCQkJCQkJU0NDX0dTTVJMX1RQTF80OCB8CisJCQkJCQkJCQkJCQlTQ0NfR1NNUkxfVFBQXzEwIHwKKwkJCQkJCQkJCQkJCVNDQ19HU01STF9ESUFHX0xPT1AgfAorCQkJCQkJCQkJCQkJU0NDX0dTTVJMX01PREVfRU5FVCk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIERTUiAtLSBzZWUgc2VjdGlvbiAxMy4xNC40IChwZy4gNTEzKSB2MC40CisJICovCisKKwlpbW1yLT5pbV9jcG0uY3Bfc2NjW3NjY19pbmRleF0uc2NjX2RzciA9IDB4ZDU1NTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgUFNNUgorCSAqIFNldHRpbmdzOgorCSAqICBDUkMgPSAzMi1CaXQgQ0NJVFQKKwkgKiAgTklCID0gQmVnaW4gc2VhcmNoaW5nIGZvciBTRkQgMjIgYml0cyBhZnRlciBSRU5BCisJICogIExQQiA9IExvb3BiYWNrIEVuYWJsZSAoTmVlZGVkIHdoZW4gRkRFIGlzIHNldCkKKwkgKi8KKwlpbW1yLT5pbV9jcG0uY3Bfc2NjW3NjY19pbmRleF0uc2NjX3BzbXIgPSBTQ0NfUFNNUl9FTkNSQyB8CisJCQlTQ0NfUFNNUl9OSUIyMiB8IFNDQ19QU01SX0xQQjsKKworI2lmIDAKKwkvKgorCSAqIENvbmZpZ3VyZSBFdGhlcm5ldCBURU5BIFNpZ25hbAorCSAqLworCisjaWYgKGRlZmluZWQoUENfRU5FVF9URU5BKSAmJiAhZGVmaW5lZChQQl9FTkVUX1RFTkEpKQorCWltbXItPmltX2lvcG9ydC5pb3BfcGNwYXIgfD0gUENfRU5FVF9URU5BOworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgJj0gflBDX0VORVRfVEVOQTsKKyNlbGlmIChkZWZpbmVkKFBCX0VORVRfVEVOQSkgJiYgIWRlZmluZWQoUENfRU5FVF9URU5BKSkKKwlpbW1yLT5pbV9jcG0uY3BfcGJwYXIgfD0gUEJfRU5FVF9URU5BOworCWltbXItPmltX2NwbS5jcF9wYmRpciB8PSBQQl9FTkVUX1RFTkE7CisjZWxzZQorI2Vycm9yIENvbmZpZ3VyYXRpb24gRXJyb3I6IGV4YWN0bHkgT05FIG9mIFBCX0VORVRfVEVOQSwgUENfRU5FVF9URU5BIG11c3QgYmUgZGVmaW5lZAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BRFMpICYmIGRlZmluZWQoQ09ORklHX01QQzg2MCkKKwkvKgorCSAqIFBvcnQgQyBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIFBIWSxNQzY4MTYwLgorCSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgfD0KKwkJCShQQ19FTkVUX0VUSExPT1AgfCBQQ19FTkVUX1RQRkxETCB8IFBDX0VORVRfVFBTUUVMKTsKKworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkYXQgfD0gUENfRU5FVF9UUEZMREw7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RhdCAmPSB+KFBDX0VORVRfRVRITE9PUCB8IFBDX0VORVRfVFBTUUVMKTsKKwkqKCh1aW50ICopIEJDU1IxKSAmPSB+QkNTUjFfRVRIRU47CisjZW5kaWYgLyogTVBDODYwQURTICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19BTVg4NjApCisJLyoKKwkgKiBQb3J0IEIgaXMgdXNlZCB0byBjb250cm9sIHRoZSBQSFksTUM2ODE2MC4KKwkgKi8KKwlpbW1yLT5pbV9jcG0uY3BfcGJkaXIgfD0KKwkJCShQQl9FTkVUX0VUSExPT1AgfCBQQl9FTkVUX1RQRkxETCB8IFBCX0VORVRfVFBTUUVMKTsKKworCWltbXItPmltX2NwbS5jcF9wYmRhdCB8PSBQQl9FTkVUX1RQRkxETDsKKwlpbW1yLT5pbV9jcG0uY3BfcGJkYXQgJj0gfihQQl9FTkVUX0VUSExPT1AgfCBQQl9FTkVUX1RQU1FFTCk7CisKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGlyIHw9IFBEX0VORVRfRVRIX0VOOworCWltbXItPmltX2lvcG9ydC5pb3BfcGRkYXQgJj0gflBEX0VORVRfRVRIX0VOOworI2VuZGlmIC8qIEFNWDg2MCAqLworCisjZW5kaWYgLyogMCAqLworCisjaWZkZWYgQ09ORklHX1JQWENMQVNTSUMKKwkqKCh1Y2hhciAqKSBCQ1NSMCkgJj0gfkJDU1IwX0VUSExQQks7CisJKigodWNoYXIgKikgQkNTUjApIHw9IChCQ1NSMF9FVEhFTiB8IEJDU1IwX0NPTFRFU1QgfCBCQ1NSMF9GVUxMRFBMWCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SUFhMSVRFCisJKigodWNoYXIgKikgQkNTUjApIHw9IEJDU1IwX0VUSEVOOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUJYCisJYm9hcmRfZXRoZXJfaW5pdCAoKTsKKyNlbmRpZgorCisJLyoKKwkgKiBTZXQgdGhlIEVOVC9FTlIgYml0cyBpbiB0aGUgR1NNUiBMb3cgLS0gRW5hYmxlIFRyYW5zbWl0L1JlY2VpdmUKKwkgKi8KKworCWltbXItPmltX2NwbS5jcF9zY2Nbc2NjX2luZGV4XS5zY2NfZ3NtcmwgfD0KKwkJCShTQ0NfR1NNUkxfRU5SIHwgU0NDX0dTTVJMX0VOVCk7CisKKwkvKgorCSAqIFdvcmsgYXJvdW5kIHRyYW5zbWl0IHByb2JsZW0gd2l0aCBmaXJzdCBldGggcGFja2V0CisJICovCisjaWYgZGVmaW5lZCAoQ09ORklHX0ZBRFMpCisJdWRlbGF5ICgxMDAwMCk7CQkJCS8qIHdhaXQgMTAgbXMgKi8KKyNlbGlmIGRlZmluZWQgKENPTkZJR19BTVg4NjApIHx8IGRlZmluZWQoQ09ORklHX1JQWENMQVNTSUMpCisJdWRlbGF5ICgxMDAwMDApOwkJCS8qIHdhaXQgMTAwIG1zICovCisjZW5kaWYKK30KKworc3RhdGljIGludCBzY2Nfc2VuZCAoaW50IGluZGV4LCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpCit7CisJaW50IGksIGogPSAwOworCisJd2hpbGUgKChydHgtPnR4YmRbdHhJZHhdLmNiZF9zYyAmIEJEX0VORVRfVFhfUkVBRFkpICYmIChqIDwgVE9VVF9MT09QKSkgeworCQl1ZGVsYXkgKDEpOwkJLyogd2lsbCBhbHNvIHRyaWdnZXIgV2QgaWYgbmVlZGVkICovCisJCWorKzsKKwl9CisJaWYgKGogPj0gVE9VVF9MT09QKQorCQlwcmludGYgKCJUWCBub3QgcmVhZHlcbiIpOworCXJ0eC0+dHhiZFt0eElkeF0uY2JkX2J1ZmFkZHIgPSAodWludCkgcGFja2V0OworCXJ0eC0+dHhiZFt0eElkeF0uY2JkX2RhdGxlbiA9IGxlbmd0aDsKKwlydHgtPnR4YmRbdHhJZHhdLmNiZF9zYyB8PQorCQkJKEJEX0VORVRfVFhfUkVBRFkgfCBCRF9FTkVUX1RYX0xBU1QgfCBCRF9FTkVUX1RYX1dSQVApOworCXdoaWxlICgocnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1RYX1JFQURZKSAmJiAoaiA8IFRPVVRfTE9PUCkpIHsKKwkJdWRlbGF5ICgxKTsJCS8qIHdpbGwgYWxzbyB0cmlnZ2VyIFdkIGlmIG5lZWRlZCAqLworCQlqKys7CisJfQorCWlmIChqID49IFRPVVRfTE9PUCkKKwkJcHJpbnRmICgiVFggdGltZW91dFxuIik7CisJaSA9IChydHgtPnR4YmRbdHhJZHhdLgorCQkgY2JkX3NjICYgQkRfRU5FVF9UWF9TVEFUUykgLyogcmV0dXJuIG9ubHkgc3RhdHVzIGJpdHMgKi8gOworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IHNjY19yZWN2IChpbnQgaW5kZXgsIHZvaWQgKnBhY2tldCwgaW50IG1heF9sZW5ndGgpCit7CisJaW50IGxlbmd0aCA9IC0xOworCisJaWYgKHJ0eC0+cnhiZFtyeElkeF0uY2JkX3NjICYgQkRfRU5FVF9SWF9FTVBUWSkgeworCQlnb3RvIERvbmU7CQkvKiBub3RoaW5nIHJlY2VpdmVkICovCisJfQorCisJaWYgKCEocnR4LT5yeGJkW3J4SWR4XS5jYmRfc2MgJiAweDAwM2YpKSB7CisJCWxlbmd0aCA9IHJ0eC0+cnhiZFtyeElkeF0uY2JkX2RhdGxlbiAtIDQ7CisJCW1lbWNweSAocGFja2V0LAorCQkJCSh2b2lkICopIChOZXRSeFBhY2tldHNbcnhJZHhdKSwKKwkJCQlsZW5ndGggPCBtYXhfbGVuZ3RoID8gbGVuZ3RoIDogbWF4X2xlbmd0aCk7CisJfQorCisJLyogR2l2ZSB0aGUgYnVmZmVyIGJhY2sgdG8gdGhlIFNDQy4gKi8KKwlydHgtPnJ4YmRbcnhJZHhdLmNiZF9kYXRsZW4gPSAwOworCisJLyogd3JhcCBhcm91bmQgYnVmZmVyIGluZGV4IHdoZW4gbmVjZXNzYXJ5ICovCisJaWYgKChyeElkeCArIDEpID49IFBLVEJVRlNSWCkgeworCQlydHgtPnJ4YmRbUEtUQlVGU1JYIC0gMV0uY2JkX3NjID0KKwkJCQkoQkRfRU5FVF9SWF9XUkFQIHwgQkRfRU5FVF9SWF9FTVBUWSk7CisJCXJ4SWR4ID0gMDsKKwl9IGVsc2UgeworCQlydHgtPnJ4YmRbcnhJZHhdLmNiZF9zYyA9IEJEX0VORVRfUlhfRU1QVFk7CisJCXJ4SWR4Kys7CisJfQorCisgIERvbmU6CisJcmV0dXJuIGxlbmd0aDsKK30KKworICAvKgorICAgKiBUZXN0IHJvdXRpbmVzCisgICAqLworCitzdGF0aWMgdm9pZCBwYWNrZXRfZmlsbCAoY2hhciAqcGFja2V0LCBpbnQgbGVuZ3RoKQoreworCWNoYXIgYyA9IChjaGFyKSBsZW5ndGg7CisJaW50IGk7CisKKwlwYWNrZXRbMF0gPSAweEZGOworCXBhY2tldFsxXSA9IDB4RkY7CisJcGFja2V0WzJdID0gMHhGRjsKKwlwYWNrZXRbM10gPSAweEZGOworCXBhY2tldFs0XSA9IDB4RkY7CisJcGFja2V0WzVdID0gMHhGRjsKKworCWZvciAoaSA9IDY7IGkgPCBsZW5ndGg7IGkrKykgeworCQlwYWNrZXRbaV0gPSBjKys7CisJfQorfQorCitzdGF0aWMgaW50IHBhY2tldF9jaGVjayAoY2hhciAqcGFja2V0LCBpbnQgbGVuZ3RoKQoreworCWNoYXIgYyA9IChjaGFyKSBsZW5ndGg7CisJaW50IGk7CisKKwlmb3IgKGkgPSA2OyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKHBhY2tldFtpXSAhPSBjKyspCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9jdGxyIChpbnQgY3RsciwgaW50IGluZGV4KQoreworCWludCByZXMgPSAtMTsKKwljaGFyIHBhY2tldF9zZW5kW01BWF9QQUNLRVRfTEVOR1RIXTsKKwljaGFyIHBhY2tldF9yZWN2W01BWF9QQUNLRVRfTEVOR1RIXTsKKwlpbnQgbGVuZ3RoOworCWludCBpOworCWludCBsOworCisJY3Rscl9wcm9jW2N0bHJdLmluaXQgKGluZGV4KTsKKworCWZvciAoaSA9IDA7IGkgPCBURVNUX05VTTsgaSsrKSB7CisJCWZvciAobCA9IE1JTl9QQUNLRVRfTEVOR1RIOyBsIDw9IE1BWF9QQUNLRVRfTEVOR1RIOyBsKyspIHsKKwkJCXBhY2tldF9maWxsIChwYWNrZXRfc2VuZCwgbCk7CisKKwkJCWN0bHJfcHJvY1tjdGxyXS5zZW5kIChpbmRleCwgcGFja2V0X3NlbmQsIGwpOworCisJCQlsZW5ndGggPSBjdGxyX3Byb2NbY3Rscl0ucmVjdiAoaW5kZXgsIHBhY2tldF9yZWN2LAorCQkJCQkJCU1BWF9QQUNLRVRfTEVOR1RIKTsKKworCQkJaWYgKGxlbmd0aCAhPSBsIHx8IHBhY2tldF9jaGVjayAocGFja2V0X3JlY3YsIGxlbmd0aCkgPCAwKSB7CisJCQkJZ290byBEb25lOworCQkJfQorCQl9CisJfQorCisJcmVzID0gMDsKKworICBEb25lOgorCisjaWYgIWRlZmluZWQoQ09ORklHXzh4eF9DT05TX05PTkUpCisJaWYgKHVzZWRfYnlfdWFydFtjdGxyXSA9PSBpbmRleCkgeworCQlzZXJpYWxfaW5pdCAoKTsKKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoU0NDX0VORVQpCisJaWYgKHVzZWRfYnlfZXRoZXJbY3Rscl0gPT0gaW5kZXgpIHsKKwkJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwkJZXRoX2luaXQgKGdkLT5iZCk7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFNDQzIgRXRoZXJuZXQgcGFyYW1ldGVyIFJBTSBzcGFjZSBvdmVybGFwcworCSAqIHRoZSBTUEkgcGFyYW1ldGVyIFJBTSBzcGFjZS4gU28gd2UgbmVlZCB0byByZXN0b3JlCisJICogdGhlIFNQSSBjb25maWd1cmF0aW9uIGFmdGVyIFNDQzIgZXRoZXJuZXQgdGVzdC4KKwkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TUEkpCisJaWYgKGN0bHIgPT0gQ1RMUl9TQ0MgJiYgaW5kZXggPT0gMSkgeworCQlzcGlfaW5pdF9mICgpOworCQlzcGlfaW5pdF9yICgpOworCX0KKyNlbmRpZgorCisJaWYgKHJlcyAhPSAwKSB7CisJCXBvc3RfbG9nICgiZXRoZXJuZXQgJXMlZCB0ZXN0IGZhaWxlZFxuIiwgY3Rscl9uYW1lW2N0bHJdLAorCQkJCSAgaW5kZXggKyAxKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitpbnQgZXRoZXJfcG9zdF90ZXN0IChpbnQgZmxhZ3MpCit7CisJaW50IHJlcyA9IDA7CisJaW50IGk7CisKKyNpZiBkZWZpbmVkKENPTkZJR184eHhfQ09OU19TQ0MxKQorCXVzZWRfYnlfdWFydFtDVExSX1NDQ10gPSAwOworI2VsaWYgZGVmaW5lZChDT05GSUdfOHh4X0NPTlNfU0NDMikKKwl1c2VkX2J5X3VhcnRbQ1RMUl9TQ0NdID0gMTsKKyNlbGlmIGRlZmluZWQoQ09ORklHXzh4eF9DT05TX1NDQzMpCisJdXNlZF9ieV91YXJ0W0NUTFJfU0NDXSA9IDI7CisjZWxpZiBkZWZpbmVkKENPTkZJR184eHhfQ09OU19TQ0M0KQorCXVzZWRfYnlfdWFydFtDVExSX1NDQ10gPSAzOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNDQ19FTkVUKQorCXVzZWRfYnlfZXRoZXJbQ1RMUl9TQ0NdID0gU0NDX0VORVQ7CisjZW5kaWYKKworCWN0bHJfcHJvY1tDVExSX1NDQ10uaW5pdCA9IHNjY19pbml0OworCWN0bHJfcHJvY1tDVExSX1NDQ10uc2VuZCA9IHNjY19zZW5kOworCWN0bHJfcHJvY1tDVExSX1NDQ10ucmVjdiA9IHNjY19yZWN2OworCisJZm9yIChpID0gMDsgaSA8IENUUkxfTElTVF9TSVpFOyBpKyspIHsKKwkJaWYgKHRlc3RfY3RsciAoY3Rscl9saXN0W2ldWzBdLCBjdGxyX2xpc3RbaV1bMV0pICE9IDApIHsKKwkJCXJlcyA9IC0xOworCQl9CisJfQorCisJcmV0dXJuIHJlczsKK30KKworI2VuZGlmIC8qIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfRVRIRVIgKi8KKworI2VuZGlmIC8qIENPTkZJR19QT1NUICovCmRpZmYgLS1naXQgYS9wb3N0L21lbW9yeS5jIGIvcG9zdC9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDU1YTZkCi0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9tZW1vcnkuYwpAQCAtMCwwICsxLDQ4MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qIE1lbW9yeSB0ZXN0CisgKgorICogR2VuZXJhbCBvYnNlcnZhdGlvbnM6CisgKiBvIFRoZSByZWNvbW1lbmRlZCB0ZXN0IHNlcXVlbmNlIGlzIHRvIHRlc3QgdGhlIGRhdGEgbGluZXM6IGlmIHRoZXkgYXJlCisgKiAgIGJyb2tlbiwgbm90aGluZyBlbHNlIHdpbGwgd29yayBwcm9wZXJseS4gIFRoZW4gdGVzdCB0aGUgYWRkcmVzcworICogICBsaW5lcy4gIEZpbmFsbHksIHRlc3QgdGhlIGNlbGxzIGluIHRoZSBtZW1vcnkgbm93IHRoYXQgdGhlIHRlc3QKKyAqICAgcHJvZ3JhbSBrbm93cyB0aGF0IHRoZSBhZGRyZXNzIGFuZCBkYXRhIGxpbmVzIHdvcmsgcHJvcGVybHkuCisgKiAgIFRoaXMgc2VxdWVuY2UgYWxzbyBoZWxwcyBpc29sYXRlIGFuZCBpZGVudGlmeSB3aGF0IGlzIGZhdWx0eS4KKyAqCisgKiBvIEZvciB0aGUgYWRkcmVzcyBsaW5lIHRlc3QsIGl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZSB0aGUgYmFzZQorICogICBhZGRyZXNzIG9mIHRoZSBsb3dlc3QgbWVtb3J5IGxvY2F0aW9uLCB3aGljaCBjYXVzZXMgYSAnMScgYml0IHRvCisgKiAgIHdhbGsgdGhyb3VnaCBhIGZpZWxkIG9mIHplcm9zIG9uIHRoZSBhZGRyZXNzIGxpbmVzIGFuZCB0aGUgaGlnaGVzdAorICogICBtZW1vcnkgbG9jYXRpb24sIHdoaWNoIGNhdXNlcyBhICcwJyBiaXQgdG8gd2FsayB0aHJvdWdoIGEgZmllbGQgb2YKKyAqICAgJzEncyBvbiB0aGUgYWRkcmVzcyBsaW5lLgorICoKKyAqIG8gRmxvYXRpbmcgYnVzZXMgY2FuIGZvb2wgbWVtb3J5IHRlc3RzIGlmIHRoZSB0ZXN0IHJvdXRpbmUgd3JpdGVzCisgKiAgIGEgdmFsdWUgYW5kIHRoZW4gcmVhZHMgaXQgYmFjayBpbW1lZGlhdGVseS4gIFRoZSBwcm9ibGVtIGlzLCB0aGUKKyAqICAgd3JpdGUgd2lsbCBjaGFyZ2UgdGhlIHJlc2lkdWFsIGNhcGFjaXRhbmNlIG9uIHRoZSBkYXRhIGJ1cyBzbyB0aGUKKyAqICAgYnVzIHJldGFpbnMgaXRzIHN0YXRlIGJyaWVmZWx5LiAgV2hlbiB0aGUgdGVzdCBwcm9ncmFtIHJlYWRzIHRoZQorICogICB2YWx1ZSBiYWNrIGltbWVkaWF0ZWx5LCB0aGUgY2FwYWNpdGFuY2Ugb2YgdGhlIGJ1cyBjYW4gYWxsb3cgaXQKKyAqICAgdG8gcmVhZCBiYWNrIHdoYXQgd2FzIHdyaXR0ZW4sIGV2ZW4gdGhvdWdoIHRoZSBtZW1vcnkgY2lyY3VpdHJ5CisgKiAgIGlzIGJyb2tlbi4gIFRvIGF2b2lkIHRoaXMsIHRoZSB0ZXN0IHByb2dyYW0gc2hvdWxkIHdyaXRlIGEgdGVzdAorICogICBwYXR0ZXJuIHRvIHRoZSB0YXJnZXQgbG9jYXRpb24sIHdyaXRlIGEgZGlmZmVyZW50IHBhdHRlcm4gZWxzZXdoZXJlCisgKiAgIHRvIGNoYXJnZSB0aGUgcmVzaWR1YWwgY2FwYWNpdGFuY2UgaW4gYSBkaWZmZXJudCBtYW5uZXIsIHRoZW4gcmVhZAorICogICB0aGUgdGFyZ2V0IGxvY2F0aW9uIGJhY2suCisgKgorICogbyBBbHdheXMgcmVhZCB0aGUgdGFyZ2V0IGxvY2F0aW9uIEVYQUNUTFkgT05DRSBhbmQgc2F2ZSBpdCBpbiBhIGxvY2FsCisgKiAgIHZhcmlhYmxlLiAgVGhlIHByb2JsZW0gd2l0aCByZWFkaW5nIHRoZSB0YXJnZXQgbG9jYXRpb24gbW9yZSB0aGFuCisgKiAgIG9uY2UgaXMgdGhhdCB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHJlYWRzIG1heSB3b3JrIHByb3Blcmx5LAorICogICByZXN1bHRpbmcgaW4gYSBmYWlsZWQgdGVzdCB0aGF0IHRlbGxzIHRoZSBwb29yIHRlY2huaWNpYW4gdGhhdAorICogICAiTWVtb3J5IGVycm9yIGF0IDAwMDAwMDAwLCB3cm90ZSBhYWFhYWFhYSwgcmVhZCBhYWFhYWFhYSIgd2hpY2gKKyAqICAgZG9lc24ndCBoZWxwIGhpbSBvbmUgYml0IGFuZCBjYXVzZXMgcHV6emxlZCBwaG9uZSBjYWxscy4gIEJlZW4gdGhlcmUsCisgKiAgIGRvbmUgdGhhdC4KKyAqCisgKiBEYXRhIGxpbmUgdGVzdDoKKyAqIC0tLS0tLS0tLS0tLS0tLQorICogVGhpcyB0ZXN0cyBkYXRhIGxpbmVzIGZvciBzaG9ydHMgYW5kIG9wZW5zIGJ5IGZvcmNpbmcgYWRqYWNlbnQgZGF0YQorICogdG8gb3Bwb3NpdGUgc3RhdGVzLiBCZWNhdXNlIHRoZSBkYXRhIGxpbmVzIGNvdWxkIGJlIHJvdXRlZCBpbiBhbgorICogYXJiaXRyYXJ5IG1hbm5lciB0aGUgbXVzdCBlbnN1cmUgdGVzdCBwYXR0ZXJucyBlbnN1cmUgdGhhdCBldmVyeSBjYXNlCisgKiBpcyB0ZXN0ZWQuIEJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgc2VyaWVzIG9mIGJpbmFyeSBwYXR0ZXJucyBldmVyeQorICogY29tYmluYXRpb24gb2YgYWRqYWNlbnQgYml0cyBpcyB0ZXN0IHJlZ2FyZGxlc3Mgb2Ygcm91dGluZy4KKyAqCisgKiAgICAgLi4uMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwCisgKiAgICAgLi4uMTEwMDExMDAxMTAwMTEwMDExMDAxMTAwCisgKiAgICAgLi4uMTExMTAwMDAxMTExMDAwMDExMTEwMDAwCisgKiAgICAgLi4uMTExMTExMTEwMDAwMDAwMDExMTExMTExCisgKgorICogQ2FycnlpbmcgdGhpcyBvdXQsIGdpdmVzIHVzIHNpeCBoZXggcGF0dGVybnMgYXMgZm9sbG93czoKKyAqCisgKiAgICAgMHhhYWFhYWFhYWFhYWFhYWFhCisgKiAgICAgMHhjY2NjY2NjY2NjY2NjY2NjCisgKiAgICAgMHhmMGYwZjBmMGYwZjBmMGYwCisgKiAgICAgMHhmZjAwZmYwMGZmMDBmZjAwCisgKiAgICAgMHhmZmZmMDAwMGZmZmYwMDAwCisgKiAgICAgMHhmZmZmZmZmZjAwMDAwMDAwCisgKgorICogVG8gdGVzdCBmb3Igc2hvcnQgYW5kIG9wZW5zIHRvIG90aGVyIHNpZ25hbHMgb24gb3VyIGJvYXJkcywgd2UKKyAqIHNpbXBseSB0ZXN0IHdpdGggdGhlIDEncyBjb21wbGVtbnQgb2YgdGhlIHBhdGVybnMgYXMgd2VsbCwgcmVzdWx0aW5nCisgKiBpbiB0d2VsdmUgcGF0dGVybnMgdG90YWwuCisgKgorICogQWZ0ZXIgd3JpdGluZyBhIHRlc3QgcGF0dGVybi4gYSBzcGVjaWFsIHBhdHRlcm4gMHgwMTIzNDU2Nzg5QUJDREVGIGlzCisgKiB3cml0dGVuIHRvIGEgZGlmZmVyZW50IGFkZHJlc3MgaW4gY2FzZSB0aGUgZGF0YSBsaW5lcyBhcmUgZmxvYXRpbmcuCisgKiBUaHVzLCBpZiBhIGJ5dGUgbGFuZSBmYWlscywgeW91IHdpbGwgc2VlIHBhcnQgb2YgdGhlIHNwZWNpYWwKKyAqIHBhdHRlcm4gaW4gdGhhdCBieXRlIGxhbmUgd2hlbiB0aGUgdGVzdCBydW5zLiAgRm9yIGV4YW1wbGUsIGlmIHRoZQorICogeHhfX3h4eHh4eHh4eHh4eCBieXRlIGxpbmUgZmFpbHMsIHlvdSB3aWxsIHNlZSBhYTIzYWFhYWFhYWFhYWFhCisgKiAoZm9yIHRoZSAnYScgdGVzdCBwYXR0ZXJuKS4KKyAqCisgKiBBZGRyZXNzIGxpbmUgdGVzdDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSB0ZXN0IHRvIHZlcmlmeSB0aGF0IGFsbCB0aGUgYWRkcmVzcyBsaW5lcworICogIGhvb2tlZCB1cCB0byB0aGUgUkFNIHdvcmsgcHJvcGVybHkuICBJZiB0aGVyZSBpcyBhbiBhZGRyZXNzIGxpbmUKKyAqICBmYXVsdCwgaXQgdXN1YWxseSBzaG93cyB1cCBhcyB0d28gZGlmZmVyZW50IGxvY2F0aW9ucyBpbiB0aGUgYWRkcmVzcworICogIG1hcCAocmVsYXRlZCBieSB0aGUgZmF1bHR5IGFkZHJlc3MgbGluZSkgbWFwcGluZyB0byBvbmUgcGh5c2ljYWwKKyAqICBtZW1vcnkgc3RvcmFnZSBsb2NhdGlvbi4gIFRoZSBhcnRpZmFjdCB0aGF0IHNob3dzIHVwIGlzIHdyaXRpbmcgdG8KKyAqICB0aGUgZmlyc3QgbG9jYXRpb24gImNoYW5nZXMiIHRoZSBzZWNvbmQgbG9jYXRpb24uCisgKgorICogVG8gdGVzdCBhbGwgYWRkcmVzcyBsaW5lcywgd2Ugc3RhcnQgd2l0aCB0aGUgZ2l2ZW4gYmFzZSBhZGRyZXNzIGFuZAorICogeG9yIHRoZSBhZGRyZXNzIHdpdGggYSAnMScgYml0IHRvIGZsaXAgb25lIGFkZHJlc3MgbGluZS4gIEZvciBlYWNoCisgKiB0ZXN0LCB3ZSBzaGlmdCB0aGUgJzEnIGJpdCBsZWZ0IHRvIHRlc3QgdGhlIG5leHQgYWRkcmVzcyBsaW5lLgorICoKKyAqIEluIHRoZSBhY3R1YWwgY29kZSwgd2Ugc3RhcnQgd2l0aCBhZGRyZXNzIHNpemVvZih1bG9uZykgc2luY2Ugb3VyCisgKiB0ZXN0IHBhdHRlcm4gd2UgdXNlIGlzIGEgdWxvbmcgYW5kIHRodXMsIGlmIHdlIHRyaWVkIHRvIHRlc3QgbG93ZXIKKyAqIG9yZGVyIGFkZHJlc3MgYml0cywgaXQgd291bGRuJ3Qgd29yayBiZWNhdXNlIG91ciBwYXR0ZXJuIHdvdWxkCisgKiBvdmVyd3JpdGUgaXRzZWxmLgorICoKKyAqIEV4YW1wbGUgZm9yIGEgNCBiaXQgYWRkcmVzcyBzcGFjZSB3aXRoIHRoZSBiYXNlIGF0IDAwMDA6CisgKiAgIDAwMDAgPC0gYmFzZQorICogICAwMDAxIDwtIHRlc3QgMQorICogICAwMDEwIDwtIHRlc3QgMgorICogICAwMTAwIDwtIHRlc3QgMworICogICAxMDAwIDwtIHRlc3QgNAorICogRXhhbXBsZSBmb3IgYSA0IGJpdCBhZGRyZXNzIHNwYWNlIHdpdGggdGhlIGJhc2UgYXQgMDAxMDoKKyAqICAgMDAxMCA8LSBiYXNlCisgKiAgIDAwMTEgPC0gdGVzdCAxCisgKiAgIDAwMDAgPC0gKGJlbG93IHRoZSBiYXNlIGFkZHJlc3MsIHNraXBwZWQpCisgKiAgIDAxMTAgPC0gdGVzdCAyCisgKiAgIDEwMTAgPC0gdGVzdCAzCisgKgorICogVGhlIHRlc3QgbG9jYXRpb25zIGFyZSBzdWNjZXNzaXZlbHkgdGVzdGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgYXJlCisgKiBub3QgIm1pcnJvcmVkIiBvbnRvIHRoZSBiYXNlIGFkZHJlc3MgZHVlIHRvIGEgZmF1bHR5IGFkZHJlc3MgbGluZS4KKyAqIE5vdGUgdGhhdCB0aGUgYmFzZSBhbmQgZWFjaCB0ZXN0IGxvY2F0aW9uIGFyZSByZWxhdGVkIGJ5IG9uZSBhZGRyZXNzCisgKiBsaW5lIGZsaXBwZWQuICBOb3RlIHRoYXQgdGhlIGJhc2UgYWRkcmVzcyBuZWVkIG5vdCBiZSBhbGwgemVyb3MuCisgKgorICogTWVtb3J5IHRlc3RzIDEtNDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGVzZSB0ZXN0cyB2ZXJpZnkgUkFNIHVzaW5nIHNlcXVlbnRpYWwgd3JpdGVzIGFuZCByZWFkcworICogdG8vZnJvbSBSQU0uIFRoZXJlIGFyZSBzZXZlcmFsIHRlc3QgY2FzZXMgdGhhdCB1c2UgZGlmZmVyZW50IHBhdHRlcm5zIHRvCisgKiB2ZXJpZnkgUkFNLiBFYWNoIHRlc3QgY2FzZSBmaWxscyBhIHJlZ2lvbiBvZiBSQU0gd2l0aCBvbmUgcGF0dGVybiBhbmQKKyAqIHRoZW4gcmVhZHMgdGhlIHJlZ2lvbiBiYWNrIGFuZCBjb21wYXJlcyBpdHMgY29udGVudHMgd2l0aCB0aGUgcGF0dGVybi4KKyAqIFRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHVzZWQ6CisgKgorICogIDFhKSB6ZXJvIHBhdHRlcm4gKDB4MDAwMDAwMDApCisgKiAgMWIpIG5lZ2F0aXZlIHBhdHRlcm4gKDB4ZmZmZmZmZmYpCisgKiAgMWMpIGNoZWNrZXJib2FyZCBwYXR0ZXJuICgweDU1NTU1NTU1KQorICogIDFkKSBjaGVja2VyYm9hcmQgcGF0dGVybiAoMHhhYWFhYWFhYSkKKyAqICAyKSAgYml0LWZsaXAgcGF0dGVybiAoKDEgPDwgKG9mZnNldCAlIDMyKSkKKyAqICAzKSAgYWRkcmVzcyBwYXR0ZXJuIChvZmZzZXQpCisgKiAgNCkgIGFkZHJlc3MgcGF0dGVybiAofm9mZnNldCkKKyAqCisgKiBCZWluZyBydW4gaW4gbm9ybWFsIG1vZGUsIHRoZSB0ZXN0IHZlcmlmaWVzIG9ubHkgc21hbGwgNEtiCisgKiByZWdpb25zIG9mIFJBTSBhcm91bmQgZWFjaCAxTWIgYm91bmRhcnkuIEZvciBleGFtcGxlLCBmb3IgNjRNYgorICogUkFNIHRoZSBmb2xsb3dpbmcgYXJlYXMgYXJlIHZlcmlmaWVkOiAweDAwMDAwMDAwLTB4MDAwMDA4MDAsCisgKiAweDAwMGZmODAwLTB4MDAxMDA4MDAsIDB4MDAxZmY4MDAtMHgwMDIwMDgwMCwgLi4uLCAweDAzZmZmODAwLQorICogMHgwNDAwMDAwMC4gSWYgdGhlIHRlc3QgaXMgcnVuIGluIHBvd2VyLWZhaWwgbW9kZSwgaXQgdmVyaWZpZXMKKyAqIHRoZSB3aG9sZSBSQU0uCisgKi8KKworI2lmZGVmIENPTkZJR19QT1NUCisKKyNpbmNsdWRlIDxwb3N0Lmg+CisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKworI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfTUVNT1JZCisKKy8qCisgKiBEZWZpbmUgSU5KRUNUXypfRVJST1JTIGZvciB0ZXN0aW5nIGVycm9yIGRldGVjdGlvbiBpbiB0aGUgcHJlc2VuY2Ugb2YKKyAqIF9nb29kXyBoYXJkd2FyZS4KKyAqLworI3VuZGVmICBJTkpFQ1RfREFUQV9FUlJPUlMKKyN1bmRlZiAgSU5KRUNUX0FERFJFU1NfRVJST1JTCisKKyNpZmRlZiBJTkpFQ1RfREFUQV9FUlJPUlMKKyN3YXJuaW5nICJJbmplY3RpbmcgZGF0YSBsaW5lIGVycm9ycyBmb3IgdGVzdGluZyBwdXJwb3NlcyIKKyNlbmRpZgorCisjaWZkZWYgSU5KRUNUX0FERFJFU1NfRVJST1JTCisjd2FybmluZyAiSW5qZWN0aW5nIGFkZHJlc3MgbGluZSBlcnJvcnMgZm9yIHRlc3RpbmcgcHVycG9zZXMiCisjZW5kaWYKKworCisvKgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGRvdWJsZSB3b3JkIG1vdmUgZnJvbSB0aGUgZGF0YSBhdAorICogdGhlIHNvdXJjZSBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiBhdCB0aGUgZGVzdGluYXRpb24gcG9pbnRlci4KKyAqIFRoaXMgaXMgaGVscGZ1bCBmb3IgdGVzdGluZyBtZW1vcnkgb24gcHJvY2Vzc29ycyB3aGljaCBoYXZlIGEgNjQgYml0CisgKiB3aWRlIGRhdGEgYnVzLgorICoKKyAqIE9uIHRob3NlIFBvd2VyUEMgd2l0aCBGUFUsIHVzZSBhc3NlbWJseSBhbmQgYSBmbG9hdGluZyBwb2ludCBtb3ZlOgorICogdGhpcyBkb2VzIGEgNjQgYml0IG1vdmUuCisgKgorICogRm9yIG90aGVyIHByb2Nlc3NvcnMsIGxldCB0aGUgY29tcGlsZXIgZ2VuZXJhdGUgdGhlIGJlc3QgY29kZSBpdCBjYW4uCisgKi8KK3N0YXRpYyB2b2lkIG1vdmU2NCh1bnNpZ25lZCBsb25nIGxvbmcgKnNyYywgdW5zaWduZWQgbG9uZyBsb25nICpkZXN0KQoreworI2lmIGRlZmluZWQoQ09ORklHX01QQzgyNjApIHx8IGRlZmluZWQoQ09ORklHX01QQzgyNFgpCisJYXNtICgibGZkICAwLCAwKDMpXG5cdCIgLyogZnByMAkgID0gICpzY3IJKi8KKwkgInN0ZmQgMCwgMCg0KSIJCS8qICpkZXN0ICA9ICBmcHIwCSovCisJIDogOiA6ICJmcjAiICk7CQkvKiBDbG9iYmVycyBmcjAJCSovCisgICAgcmV0dXJuOworI2Vsc2UKKwkqZGVzdCA9ICpzcmM7CisjZW5kaWYKK30KKworLyoKKyAqIFRoaXMgaXMgNjQgYml0IHdpZGUgdGVzdCBwYXR0ZXJucy4gIE5vdGUgdGhhdCB0aGV5IHJlc2lkZSBpbiBST00KKyAqICh3aGljaCBwcmVzdW1hYmx5IHdvcmtzKSBhbmQgdGhlIHRlc3RzIHdyaXRlIHRoZW0gdG8gUkFNIHdoaWNoIG1heQorICogbm90IHdvcmsuCisgKgorICogVGhlICJvdGhlcnBhdHRlcm4iIGlzIHdyaXR0ZW4gdG8gZHJpdmUgdGhlIGRhdGEgYnVzIHRvIHZhbHVlcyBvdGhlcgorICogdGhhbiB0aGUgdGVzdCBwYXR0ZXJuLiAgVGhpcyBpcyBmb3IgZGV0ZWN0aW5nIGZsb2F0aW5nIGJ1cyBsaW5lcy4KKyAqCisgKi8KK2NvbnN0IHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgcGF0dGVybltdID0geworICAgIDB4YWFhYWFhYWFhYWFhYWFhYSwKKyAgICAweGNjY2NjY2NjY2NjY2NjY2MsCisgICAgMHhmMGYwZjBmMGYwZjBmMGYwLAorICAgIDB4ZmYwMGZmMDBmZjAwZmYwMCwKKyAgICAweGZmZmYwMDAwZmZmZjAwMDAsCisgICAgMHhmZmZmZmZmZjAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDBmZmZmZmZmZiwKKyAgICAweDAwMDBmZmZmMDAwMGZmZmYsCisgICAgMHgwMGZmMDBmZjAwZmYwMGZmLAorICAgIDB4MGYwZjBmMGYwZjBmMGYwZiwKKyAgICAweDMzMzMzMzMzMzMzMzMzMzMsCisgICAgMHg1NTU1NTU1NTU1NTU1NTU1fTsKK2NvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBvdGhlcnBhdHRlcm4gPSAweDAxMjM0NTY3ODlhYmNkZWY7CisKKworc3RhdGljIGludCBtZW1vcnlfcG9zdF9kYXRhbGluZSh1bnNpZ25lZCBsb25nIGxvbmcgKiBwbWVtKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wNjQ7CisJaW50IG51bV9wYXR0ZXJucyA9IHNpemVvZihwYXR0ZXJuKS8gc2l6ZW9mKHBhdHRlcm5bMF0pOworCWludCBpOworCXVuc2lnbmVkIGludCBoaSwgbG8sIHBhdGhpLCBwYXRsbzsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoIGkgPSAwOyBpIDwgbnVtX3BhdHRlcm5zOyBpKyspIHsKKwkJbW92ZTY0KCh1bnNpZ25lZCBsb25nIGxvbmcgKikmKHBhdHRlcm5baV0pLCBwbWVtKyspOworCQkvKgorCQkgKiBQdXQgYSBkaWZmZXJlbnQgcGF0dGVybiBvbiB0aGUgZGF0YSBsaW5lczogb3RoZXJ3aXNlIHRoZXkKKwkJICogbWF5IGZsb2F0IGxvbmcgZW5vdWdoIHRvIHJlYWQgYmFjayB3aGF0IHdlIHdyb3RlLgorCQkgKi8KKwkJbW92ZTY0KCh1bnNpZ25lZCBsb25nIGxvbmcgKikmb3RoZXJwYXR0ZXJuLCBwbWVtLS0pOworCQltb3ZlNjQocG1lbSwgJnRlbXA2NCk7CisKKyNpZmRlZiBJTkpFQ1RfREFUQV9FUlJPUlMKKwkJdGVtcDY0IF49IDB4MDAwMDgwMDA7CisjZW5kaWYKKworCQlpZiAodGVtcDY0ICE9IHBhdHRlcm5baV0peworCQkJcGF0aGkgPSAocGF0dGVybltpXT4+MzIpICYgMHhmZmZmZmZmZjsKKwkJCXBhdGxvID0gcGF0dGVybltpXSAmIDB4ZmZmZmZmZmY7CisKKwkJCWhpID0gKHRlbXA2ND4+MzIpICYgMHhmZmZmZmZmZjsKKwkJCWxvID0gdGVtcDY0ICYgMHhmZmZmZmZmZjsKKworCQkJcG9zdF9sb2cgKCJNZW1vcnkgKGRhdGUgbGluZSkgZXJyb3IgYXQgJTA4eCwgIgorCQkJCSAgIndyb3RlICUwOHglMDh4LCByZWFkICUwOHglMDh4ICFcbiIsCisJCQkJCSAgcG1lbSwgcGF0aGksIHBhdGxvLCBoaSwgbG8pOworCQkJcmV0ID0gLTE7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtZW1vcnlfcG9zdF9hZGRybGluZSh1bG9uZyAqdGVzdGFkZHIsIHVsb25nICpiYXNlLCB1bG9uZyBzaXplKQoreworCXVsb25nICp0YXJnZXQ7CisJdWxvbmcgKmVuZDsKKwl1bG9uZyByZWFkYmFjazsKKwl1bG9uZyB4b3I7CisJaW50ICAgcmV0ID0gMDsKKworCWVuZCA9IGJhc2UgKyBzaXplOworCXhvciA9IDA7CisJZm9yKHhvciA9IHNpemVvZih1bG9uZyk7IHhvciA+IDA7IHhvciA8PD0gMSkgeworCQl0YXJnZXQgPSAodWxvbmcgKikoKHVsb25nKXRlc3RhZGRyIF4geG9yKTsKKwkJaWYoKHRhcmdldCA+PSBiYXNlKSAmJiAodGFyZ2V0IDwgZW5kKSkgeworCQkJKnRlc3RhZGRyID0gfip0YXJnZXQ7CisJCQlyZWFkYmFjayAgPSAqdGFyZ2V0OworCisjaWZkZWYgSU5KRUNUX0FERFJFU1NfRVJST1JTCisJCQlpZih4b3IgPT0gMHgwMDAwODAwMCkgeworCQkJCXJlYWRiYWNrID0gKnRlc3RhZGRyOworCQkJfQorI2VuZGlmCisJCQlpZihyZWFkYmFjayA9PSAqdGVzdGFkZHIpIHsKKwkJCQlwb3N0X2xvZyAoIk1lbW9yeSAoYWRkcmVzcyBsaW5lKSBlcnJvciBhdCAlMDh4PC0+JTA4eCwgIgorCQkJCSAgCSJYT1IgdmFsdWUgJTA4eCAhXG4iLAorCQkJCQl0ZXN0YWRkciwgdGFyZ2V0LCB4b3IpOworCQkJCXJldCA9IC0xOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWVtb3J5X3Bvc3RfdGVzdDEgKHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJdWxvbmcgKm1lbSA9ICh1bG9uZyAqKSBzdGFydDsKKwl1bG9uZyByZWFkYmFjazsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplIC8gc2l6ZW9mICh1bG9uZyk7IGkrKykgeworCQltZW1baV0gPSB2YWw7CisJCWlmIChpICUgMTAyNCA9PSAwKQorCQkJV0FUQ0hET0dfUkVTRVQgKCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNpemUgLyBzaXplb2YgKHVsb25nKSAmJiByZXQgPT0gMDsgaSsrKSB7CisJCXJlYWRiYWNrID0gbWVtW2ldOworCQlpZiAocmVhZGJhY2sgIT0gdmFsKSB7CisJCQlwb3N0X2xvZyAoIk1lbW9yeSBlcnJvciBhdCAlMDh4LCAiCisJCQkJICAid3JvdGUgJTA4eCwgcmVhZCAlMDh4ICFcbiIsCisJCQkJCSAgbWVtICsgaSwgdmFsLCByZWFkYmFjayk7CisKKwkJCXJldCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgJSAxMDI0ID09IDApCisJCQlXQVRDSERPR19SRVNFVCAoKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1lbW9yeV9wb3N0X3Rlc3QyICh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBpOworCXVsb25nICptZW0gPSAodWxvbmcgKikgc3RhcnQ7CisJdWxvbmcgcmVhZGJhY2s7CisJaW50IHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIHNpemVvZiAodWxvbmcpOyBpKyspIHsKKwkJbWVtW2ldID0gMSA8PCAoaSAlIDMyKTsKKwkJaWYgKGkgJSAxMDI0ID09IDApCisJCQlXQVRDSERPR19SRVNFVCAoKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIHNpemVvZiAodWxvbmcpICYmIHJldCA9PSAwOyBpKyspIHsKKwkJcmVhZGJhY2sgPSBtZW1baV07CisJCWlmIChyZWFkYmFjayAhPSAoMSA8PCAoaSAlIDMyKSkpIHsKKwkJCXBvc3RfbG9nICgiTWVtb3J5IGVycm9yIGF0ICUwOHgsICIKKwkJCQkgICJ3cm90ZSAlMDh4LCByZWFkICUwOHggIVxuIiwKKwkJCQkJICBtZW0gKyBpLCAxIDw8IChpICUgMzIpLCByZWFkYmFjayk7CisKKwkJCXJldCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgJSAxMDI0ID09IDApCisJCQlXQVRDSERPR19SRVNFVCAoKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1lbW9yeV9wb3N0X3Rlc3QzICh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBpOworCXVsb25nICptZW0gPSAodWxvbmcgKikgc3RhcnQ7CisJdWxvbmcgcmVhZGJhY2s7CisJaW50IHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIHNpemVvZiAodWxvbmcpOyBpKyspIHsKKwkJbWVtW2ldID0gaTsKKwkJaWYgKGkgJSAxMDI0ID09IDApCisJCQlXQVRDSERPR19SRVNFVCAoKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIHNpemVvZiAodWxvbmcpICYmIHJldCA9PSAwOyBpKyspIHsKKwkJcmVhZGJhY2sgPSBtZW1baV07CisJCWlmIChyZWFkYmFjayAhPSBpKSB7CisJCQlwb3N0X2xvZyAoIk1lbW9yeSBlcnJvciBhdCAlMDh4LCAiCisJCQkJICAid3JvdGUgJTA4eCwgcmVhZCAlMDh4ICFcbiIsCisJCQkJCSAgbWVtICsgaSwgaSwgcmVhZGJhY2spOworCisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChpICUgMTAyNCA9PSAwKQorCQkJV0FUQ0hET0dfUkVTRVQgKCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtZW1vcnlfcG9zdF90ZXN0NCAodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bG9uZyAqbWVtID0gKHVsb25nICopIHN0YXJ0OworCXVsb25nIHJlYWRiYWNrOworCWludCByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHNpemUgLyBzaXplb2YgKHVsb25nKTsgaSsrKSB7CisJCW1lbVtpXSA9IH5pOworCQlpZiAoaSAlIDEwMjQgPT0gMCkKKwkJCVdBVENIRE9HX1JFU0VUICgpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaXplIC8gc2l6ZW9mICh1bG9uZykgJiYgcmV0ID09IDA7IGkrKykgeworCQlyZWFkYmFjayA9IG1lbVtpXTsKKwkJaWYgKHJlYWRiYWNrICE9IH5pKSB7CisJCQlwb3N0X2xvZyAoIk1lbW9yeSBlcnJvciBhdCAlMDh4LCAiCisJCQkJICAid3JvdGUgJTA4eCwgcmVhZCAlMDh4ICFcbiIsCisJCQkJCSAgbWVtICsgaSwgfmksIHJlYWRiYWNrKTsKKworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoaSAlIDEwMjQgPT0gMCkKKwkJCVdBVENIRE9HX1JFU0VUICgpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWVtb3J5X3Bvc3RfdGVzdHMgKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gbWVtb3J5X3Bvc3RfZGF0YWxpbmUgKChsb25nIGxvbmcgKilzdGFydCk7CisJV0FUQ0hET0dfUkVTRVQgKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBtZW1vcnlfcG9zdF9hZGRybGluZSAoKGxvbmcgKilzdGFydCwgKGxvbmcgKilzdGFydCwgc2l6ZSk7CisJV0FUQ0hET0dfUkVTRVQgKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBtZW1vcnlfcG9zdF9hZGRybGluZSAoKGxvbmcgKikoc3RhcnQgKyBzaXplIC0gOCksCisJCQkJCSAgICAobG9uZyAqKXN0YXJ0LCBzaXplKTsKKwlXQVRDSERPR19SRVNFVCAoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IG1lbW9yeV9wb3N0X3Rlc3QxIChzdGFydCwgc2l6ZSwgMHgwMDAwMDAwMCk7CisJV0FUQ0hET0dfUkVTRVQgKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBtZW1vcnlfcG9zdF90ZXN0MSAoc3RhcnQsIHNpemUsIDB4ZmZmZmZmZmYpOworCVdBVENIRE9HX1JFU0VUICgpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gbWVtb3J5X3Bvc3RfdGVzdDEgKHN0YXJ0LCBzaXplLCAweDU1NTU1NTU1KTsKKwlXQVRDSERPR19SRVNFVCAoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IG1lbW9yeV9wb3N0X3Rlc3QxIChzdGFydCwgc2l6ZSwgMHhhYWFhYWFhYSk7CisJV0FUQ0hET0dfUkVTRVQgKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBtZW1vcnlfcG9zdF90ZXN0MiAoc3RhcnQsIHNpemUpOworCVdBVENIRE9HX1JFU0VUICgpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gbWVtb3J5X3Bvc3RfdGVzdDMgKHN0YXJ0LCBzaXplKTsKKwlXQVRDSERPR19SRVNFVCAoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IG1lbW9yeV9wb3N0X3Rlc3Q0IChzdGFydCwgc2l6ZSk7CisJV0FUQ0hET0dfUkVTRVQgKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbWVtb3J5X3Bvc3RfdGVzdCAoaW50IGZsYWdzKQoreworCWludCByZXQgPSAwOworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCWJkX3QgKmJkID0gZ2QtPmJkOworCXVuc2lnbmVkIGxvbmcgbWVtc2l6ZSA9IChiZC0+YmlfbWVtc2l6ZSA+PSAyNTYgPDwgMjAgPworCQkJCSAyNTYgPDwgMjAgOiBiZC0+YmlfbWVtc2l6ZSkgLSAoMSA8PCAyMCk7CisKKworCWlmIChmbGFncyAmIFBPU1RfUE9XRVJGQUlMKSB7CisJCXJldCA9IG1lbW9yeV9wb3N0X3Rlc3RzIChDRkdfU0RSQU1fQkFTRSwgbWVtc2l6ZSk7CisJfSBlbHNlIHsJCQkvKiBQT1NUX1BPV0VSTk9STUFMICovCisKKwkJdW5zaWduZWQgbG9uZyBpOworCisJCWZvciAoaSA9IDA7IGkgPCAobWVtc2l6ZSA+PiAyMCkgJiYgcmV0ID09IDA7IGkrKykgeworCQkJaWYgKHJldCA9PSAwKQorCQkJCXJldCA9IG1lbW9yeV9wb3N0X3Rlc3RzIChpIDw8IDIwLCAweDgwMCk7CisJCQlpZiAocmV0ID09IDApCisJCQkJcmV0ID0gbWVtb3J5X3Bvc3RfdGVzdHMgKChpIDw8IDIwKSArIDB4ZmY4MDAsIDB4ODAwKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAmIENGR19QT1NUX01FTU9SWSAqLworI2VuZGlmIC8qIENPTkZJR19QT1NUICovCmRpZmYgLS1naXQgYS9ydGMvZHMxNTU2LmMgYi9ydGMvZHMxNTU2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5ZWE1ZQotLS0gL2Rldi9udWxsCisrKyBiL3J0Yy9kczE1NTYuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogQVJJTyBEYXRhIE5ldHdvcmtzLCBJbmMuIGRjaGl1QGFyaW9kYXRhLmNvbQorICoKKyAqIG1vZGlmaWVkIGZvciBEUzE1NTY6CisgKiBGcmFuayBQYW5ubyA8ZnBhbm5vQGRlbHBoaW50ZWNoLmNvbT4sIERlbHBoaW4gVGVjaG5vbG9neSBBRworICoKKyAqIEJhc2VkIG9uIE1vbnRhVmlzdGEgRFMxNzQzIGNvZGUgYW5kIFUtQm9vdCBtYzE0NjgxOCBjb2RlCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIERhdGUgJiBUaW1lIHN1cHBvcnQgZm9yIHRoZSBEUzE1NTYgUlRDCisgKi8KKworLyojZGVmaW5lCVJUQ19ERUJVRyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHJ0Yy5oPgorCisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxNTU2KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorCitzdGF0aWMgdWNoYXIgcnRjX3JlYWQoIHVuc2lnbmVkIGludCBhZGRyICk7CitzdGF0aWMgdm9pZCAgcnRjX3dyaXRlKCB1bnNpZ25lZCBpbnQgYWRkciwgdWNoYXIgdmFsKTsKK3N0YXRpYyB1Y2hhciBiaW4yYmNkICAgKHVuc2lnbmVkIGludCBuKTsKK3N0YXRpYyB1bnNpZ25lZCBiY2QyYmluKHVjaGFyIGMpOworCisjZGVmaW5lIFJUQ19CQVNFCQkoIENGR19OVlJBTV9TSVpFICsgQ0ZHX05WUkFNX0JBU0VfQUREUiApCisKKyNkZWZpbmUgUlRDX1lFQVIJCSggUlRDX0JBU0UgKyAweGYgKQorI2RlZmluZSBSVENfTU9OVEgJCSggUlRDX0JBU0UgKyAweGUgKQorI2RlZmluZSBSVENfREFZX09GX01PTlRICSggUlRDX0JBU0UgKyAweGQgKQorI2RlZmluZSBSVENfREFZX09GX1dFRUsJCSggUlRDX0JBU0UgKyAweGMgKQorI2RlZmluZSBSVENfSE9VUlMJCSggUlRDX0JBU0UgKyAweGIgKQorI2RlZmluZSBSVENfTUlOVVRFUwkJKCBSVENfQkFTRSArIDB4YSApCisjZGVmaW5lIFJUQ19TRUNPTkRTCQkoIFJUQ19CQVNFICsgMHg5ICkKKyNkZWZpbmUgUlRDX0NFTlRVUlkJCSggUlRDX0JBU0UgKyAweDggKQorCisjZGVmaW5lIFJUQ19DT05UUk9MQQkJUlRDX0NFTlRVUlkKKyNkZWZpbmUgUlRDX0NPTlRST0xCCQlSVENfU0VDT05EUworI2RlZmluZSBSVENfQ09OVFJPTEMJCVJUQ19CQVNFCisKKyNkZWZpbmUgUlRDX0NBX1dSSVRFCQkweDgwCisjZGVmaW5lIFJUQ19DQV9SRUFECQkweDQwCisKKyNkZWZpbmUgUlRDX0NCX09TQ19ESVNBQkxFCTB4ODAKKworI2RlZmluZSBSVENfQ0NfQkFUVEVSWV9GTEFHCTB4MTAKKyNkZWZpbmUgUlRDX0NDX0ZSRVFfVEVTVAkweDQwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBydGNfZ2V0KCBzdHJ1Y3QgcnRjX3RpbWUgKnRtcCApCit7CisJdWNoYXIgc2VjLCBtaW4sIGhvdXI7CisJdWNoYXIgbWRheSwgd2RheSwgbW9uLCB5ZWFyOworCisJaW50IGNlbnR1cnk7CisKKwl1Y2hhciByZWdfYTsKKworCXJlZ19hID0gcnRjX3JlYWQoIFJUQ19DT05UUk9MQSApOworCS8qIGxvY2sgY2xvY2sgcmVnaXN0ZXJzIGZvciByZWFkICovCisJcnRjX3dyaXRlKCBSVENfQ09OVFJPTEEsICggcmVnX2EgfCBSVENfQ0FfUkVBRCApKTsKKworCXNlYyAgICAgPSBydGNfcmVhZCggUlRDX1NFQ09ORFMgKTsKKwltaW4gICAgID0gcnRjX3JlYWQoIFJUQ19NSU5VVEVTICk7CisJaG91ciAgICA9IHJ0Y19yZWFkKCBSVENfSE9VUlMgKTsKKwltZGF5ICAgID0gcnRjX3JlYWQoIFJUQ19EQVlfT0ZfTU9OVEggKTsKKwl3ZGF5ICAgID0gcnRjX3JlYWQoIFJUQ19EQVlfT0ZfV0VFSyApOworCW1vbiAgICAgPSBydGNfcmVhZCggUlRDX01PTlRIICk7CisJeWVhciAgICA9IHJ0Y19yZWFkKCBSVENfWUVBUiApOworCWNlbnR1cnkgPSBydGNfcmVhZCggUlRDX0NFTlRVUlkgKTsKKworCS8qIHVubG9jayBjbG9jayByZWdpc3RlcnMgYWZ0ZXIgcmVhZCAqLworCXJ0Y193cml0ZSggUlRDX0NPTlRST0xBLCAoIHJlZ19hICYgflJUQ19DQV9SRUFEICkpOworCisjaWZkZWYgUlRDX0RFQlVHCisJcHJpbnRmKCAiR2V0IFJUQyB5ZWFyOiAlMDJ4IG1vbi9jZW50OiAlMDJ4IG1vbjogJTAyeCBtZGF5OiAlMDJ4IHdkYXk6ICUwMnggIgorCQkiaHI6ICUwMnggbWluOiAlMDJ4IHNlYzogJTAyeFxuIiwKKwkJeWVhciwgY2VudHVyeSwgbW9uLCBtZGF5LCB3ZGF5LAorCQlob3VyLCBtaW4sIHNlYyApOworI2VuZGlmCisJdG1wLT50bV9zZWMgID0gYmNkMmJpbiggc2VjICAmIDB4N0YgKTsKKwl0bXAtPnRtX21pbiAgPSBiY2QyYmluKCBtaW4gICYgMHg3RiApOworCXRtcC0+dG1faG91ciA9IGJjZDJiaW4oIGhvdXIgJiAweDNGICk7CisJdG1wLT50bV9tZGF5ID0gYmNkMmJpbiggbWRheSAmIDB4M0YgKTsKKwl0bXAtPnRtX21vbiAgPSBiY2QyYmluKCBtb24gJiAweDFGICk7CisJdG1wLT50bV93ZGF5ID0gYmNkMmJpbiggd2RheSAmIDB4MDcgKTsKKworCS8qIGdsdWUgeWVhciBmcm9tIGNlbnR1cnkgYW5kIHllYXIgaW4gY2VudHVyeSAqLworCXRtcC0+dG1feWVhciA9IGJjZDJiaW4oIHllYXIgKSArCisJCSggYmNkMmJpbiggY2VudHVyeSAmIDB4M0YgKSAqIDEwMCApOworCisJdG1wLT50bV95ZGF5ID0gMDsKKwl0bXAtPnRtX2lzZHN0PSAwOworI2lmZGVmIFJUQ19ERUJVRworCXByaW50ZiggIkdldCBEQVRFOiAlNGQtJTAyZC0lMDJkICh3ZGF5PSVkKSAgVElNRTogJTJkOiUwMmQ6JTAyZFxuIiwKKwkJdG1wLT50bV95ZWFyLCB0bXAtPnRtX21vbiwgdG1wLT50bV9tZGF5LCB0bXAtPnRtX3dkYXksCisJCXRtcC0+dG1faG91ciwgdG1wLT50bV9taW4sIHRtcC0+dG1fc2VjICk7CisjZW5kaWYKK30KKwordm9pZCBydGNfc2V0KCBzdHJ1Y3QgcnRjX3RpbWUgKnRtcCApCit7CisJdWNoYXIgcmVnX2E7CisjaWZkZWYgUlRDX0RFQlVHCisJcHJpbnRmKCAiU2V0IERBVEU6ICU0ZC0lMDJkLSUwMmQgKHdkYXk9JWQpICBUSU1FOiAlMmQ6JTAyZDolMDJkXG4iLAorCQl0bXAtPnRtX3llYXIsIHRtcC0+dG1fbW9uLCB0bXAtPnRtX21kYXksIHRtcC0+dG1fd2RheSwKKwkJdG1wLT50bV9ob3VyLCB0bXAtPnRtX21pbiwgdG1wLT50bV9zZWMpOworI2VuZGlmCisJLyogbG9jayBjbG9jayByZWdpc3RlcnMgZm9yIHdyaXRlICovCisJcmVnX2EgPSBydGNfcmVhZCggUlRDX0NPTlRST0xBICk7CisJcnRjX3dyaXRlKCBSVENfQ09OVFJPTEEsICggcmVnX2EgfCBSVENfQ0FfV1JJVEUgKSk7CisKKwlydGNfd3JpdGUoIFJUQ19NT05USCwgYmluMmJjZCggdG1wLT50bV9tb24gKSk7CisKKwlydGNfd3JpdGUoIFJUQ19EQVlfT0ZfV0VFSywgYmluMmJjZCggdG1wLT50bV93ZGF5ICkpOworCXJ0Y193cml0ZSggUlRDX0RBWV9PRl9NT05USCwgYmluMmJjZCggdG1wLT50bV9tZGF5ICkpOworCXJ0Y193cml0ZSggUlRDX0hPVVJTLCBiaW4yYmNkKCB0bXAtPnRtX2hvdXIgKSk7CisJcnRjX3dyaXRlKCBSVENfTUlOVVRFUywgYmluMmJjZCggdG1wLT50bV9taW4gKSk7CisJcnRjX3dyaXRlKCBSVENfU0VDT05EUywgYmluMmJjZCggdG1wLT50bV9zZWMgKSk7CisKKwkvKiBicmVhayB5ZWFyIHVwIGludG8gY2VudHVyeSBhbmQgeWVhciBpbiBjZW50dXJ5ICovCisJcnRjX3dyaXRlKCBSVENfWUVBUiwgYmluMmJjZCggdG1wLT50bV95ZWFyICUgMTAwICkpOworCXJ0Y193cml0ZSggUlRDX0NFTlRVUlksIGJpbjJiY2QoIHRtcC0+dG1feWVhciAvIDEwMCApKTsKKworCS8qIHVubG9jayBjbG9jayByZWdpc3RlcnMgYWZ0ZXIgcmVhZCAqLworCXJ0Y193cml0ZSggUlRDX0NPTlRST0xBLCAoIHJlZ19hICAmIH5SVENfQ0FfV1JJVEUgKSk7Cit9CisKK3ZvaWQgcnRjX3Jlc2V0ICh2b2lkKQoreworCXVjaGFyIHJlZ19hLCByZWdfYiwgcmVnX2M7CisKKwlyZWdfYSA9IHJ0Y19yZWFkKCBSVENfQ09OVFJPTEEgKTsKKwlyZWdfYiA9IHJ0Y19yZWFkKCBSVENfQ09OVFJPTEIgKTsKKworCWlmICggcmVnX2IgJiBSVENfQ0JfT1NDX0RJU0FCTEUgKQorCXsKKwkJcHJpbnRmKCAicmVhbC10aW1lLWNsb2NrIHdhcyBzdG9wcGVkLiBOb3cgc3RhcnRpbmcuLi5cbiIgKTsKKwkJcmVnX2EgfD0gUlRDX0NBX1dSSVRFOworCQlyZWdfYiAmPSB+UlRDX0NCX09TQ19ESVNBQkxFOworCisJCXJ0Y193cml0ZSggUlRDX0NPTlRST0xBLCByZWdfYSApOworCQlydGNfd3JpdGUoIFJUQ19DT05UUk9MQiwgcmVnX2IgKTsKKwl9CisKKwkvKiBtYWtlIHN1cmUgcmVhZC93cml0ZSBjbG9jayByZWdpc3RlciBiaXRzIGFyZSBjbGVhcmVkICovCisJcmVnX2EgJj0gfiggUlRDX0NBX1dSSVRFIHwgUlRDX0NBX1JFQUQgKTsKKwlydGNfd3JpdGUoIFJUQ19DT05UUk9MQSwgcmVnX2EgKTsKKworCXJlZ19jID0gcnRjX3JlYWQoIFJUQ19DT05UUk9MQyApOworCWlmICgoIHJlZ19jICYgUlRDX0NDX0JBVFRFUllfRkxBRyApID09IDAgKQorCQlwcmludGYoICJSVEMgYmF0dGVyeSBsb3cuIENsb2NrIHNldHRpbmcgbWF5IG5vdCBiZSByZWxpYWJsZS5cbiIgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdWNoYXIgcnRjX3JlYWQoIHVuc2lnbmVkIGludCBhZGRyICkKK3sKKwl1Y2hhciB2YWwgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKShhZGRyKTsKKyNpZmRlZiBSVENfREVCVUcKKwlwcmludGYoICJydGNfcmVhZDogJXg6JXhcbiIsIGFkZHIsIHZhbCApOworI2VuZGlmCisJcmV0dXJuKCB2YWwgKTsKK30KKworc3RhdGljIHZvaWQgcnRjX3dyaXRlKCB1bnNpZ25lZCBpbnQgYWRkciwgdWNoYXIgdmFsICkKK3sKKyNpZmRlZiBSVENfREVCVUcKKwlwcmludGYoICJydGNfd3JpdGU6ICV4OiV4XG4iLCBhZGRyLCB2YWwgKTsKKyNlbmRpZgorCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopKGFkZHIpID0gdmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgYmNkMmJpbiAodWNoYXIgbikKK3sKKwlyZXR1cm4gKCgoKG4gPj4gNCkgJiAweDBGKSAqIDEwKSArIChuICYgMHgwRikpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBiaW4yYmNkICh1bnNpZ25lZCBpbnQgbikKK3sKKwlyZXR1cm4gKCgobiAvIDEwKSA8PCA0KSB8IChuICUgMTApKTsKK30KKworI2VuZGlmCS8qIENPTkZJR19SVENfRFMxNTU2ICYmIENGR19DTURfREFURSAqLwo=