ZGlmZiAtLWdpdCBhL0NIQU5HRUxPRyBiL0NIQU5HRUxPRwppbmRleCAwYzBkM2QwLi4zNWMyODVkIDEwMDY0NAotLS0gYS9DSEFOR0VMT0cKKysrIGIvQ0hBTkdFTE9HCkBAIC0yLDYgKzIsMTIgQEAKIENoYW5nZXMgc2luY2UgZm9yIFUtQm9vdCAwLjEuMDoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorKiBQYXRjaCBieSBEYW5pZWwgRW5nc3Ry9m0sIDEzIE5vdiAyMDAyOgorICBBZGQgc3VwcG9ydCBmb3IgaTM4NiBhcmNoaXRlY3R1cmUgYW5kIEFNRCBTQzUyMCBib2FyZAorCisqIFBhdGNoIGJ5IFBpZXJyZSBBdWJlcnQsIDEyIE5vdiAyMDAyOgorICBBZGQgc3VwcG9ydCBmb3IgRE9TIGZpbGVzeXN0ZW0gYW5kIGJvb3RpbmcgZnJvbSBET1MgZmxvcHB5IGRpc2sKKwogKiBQYXRjaCBieSBKaW0gU2FuZG96LCAwNyBOb3YgMjAwMjoKICAgSW5jcmVhc2UgbnVtYmVyIG9mIG5ldHdvcmsgUlggYnVmZmVycyAoUEtUQlVGU1JYIGluCiAgICJpbmNsdWRlL25ldC5oIikgZm9yIEVFUFJPMTAwIGJhc2VkIGJvYXJkcyAoZXNwZWNpYWxseSBTUDgyNDApCmRpZmYgLS1naXQgYS9DUkVESVRTIGIvQ1JFRElUUwppbmRleCAyMzU4ODE3Li4wZjdkOTY1IDEwMDY0NAotLS0gYS9DUkVESVRTCisrKyBiL0NSRURJVFMKQEAgLTgzLDYgKzgzLDEwIEBACiBFOiBER0VAc2l4bmV0aW8uY29tCiBEOiBFRVBST00gU3BlZWR1cCwgU1hOSTg1NVQgcG9ydAogCitOOiBEYW5pZWwgRW5nc3Ry9m0KK0U6IGRhbmllbEBvbWljcm9uLnNlCitEOiB4ODYgcG9ydCwgU3VwcG9ydCBmb3Igc2M1MjBfY2RwIGJvYXJkCisKIE46IERyLiBXb2xmZ2FuZyBHcmFuZGVnZ2VyCiBFOiB3Z0BkZW54LmRlCiBEOiBTdXBwb3J0IGZvciBJbnRlcnBoYXNlIDQ1MzkgVDEvRTEvSjEgUE1DLCBQTjYyLCBDQ00sIFNDTSBib2FyZHMKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggY2E1Yzc4ZS4uYzkyNGM2NSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTI1MCw1ICsyNTAsMTYgQEAKIAlkbnAxMTEwCQkJU0ExMTEwCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgeDg2IFN5c3RlbXM6CQkJCQkJCQkjCisjCQkJCQkJCQkJIworIyBNYWludGFpbmVyIE5hbWUsIEVtYWlsIEFkZHJlc3MJCQkJCSMKKyMJQm9hcmQJCQlDUFUJCQkJCSMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworRGFuaWVsIEVuZ3N0cvZtIDxkYW5pZWxAb21pY3Jvbi5zZT4KKworCXNjNTIwX2NkcAkJeDg2CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgRW5kIG9mIE1BSU5UQUlORVJTIGxpc3QJCQkJCQkjCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDY3MzJhMDkuLmQzZTkyZjQgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC03NCw4ICs3NCwxMSBAQAogaWZlcSAoJChBUkNIKSxhcm0pCiBDUk9TU19DT01QSUxFID0gYXJtXzkyMFRESS0KIGVuZGlmCitpZmVxICgkKEFSQ0gpLGkzODYpCisjQ1JPU1NfQ09NUElMRSA9IGkzODYtZWxmLQogZW5kaWYKIGVuZGlmCitlbmRpZgogCiBleHBvcnQJQ1JPU1NfQ09NUElMRQogCkBAIC0xMDAsNyArMTAzLDEwIEBACiAjIFUtQm9vdCBvYmplY3RzLi4uLm9yZGVyIGlzIGltcG9ydGFudCAoaS5lLiBzdGFydCBtdXN0IGJlIGZpcnN0KQogCiBPQkpTICA9CWNwdS8kKENQVSkvc3RhcnQubwotCitpZmVxICgkKENQVSksaTM4NikKK09CSlMgKz0JY3B1LyQoQ1BVKS9zdGFydDE2Lm8KK09CSlMgKz0JY3B1LyQoQ1BVKS9yZXNldC5vCitlbmRpZgogaWZlcSAoJChDUFUpLHBwYzR4eCkKIE9CSlMgKz0JY3B1LyQoQ1BVKS9yZXNldHZlYy5vCiBlbmRpZgpAQCAtMTA4LDcgKzExNCw3IEBACiBMSUJTICA9CWJvYXJkLyQoQk9BUkRESVIpL2xpYiQoQk9BUkQpLmEKIExJQlMgKz0gY3B1LyQoQ1BVKS9saWIkKENQVSkuYQogTElCUyArPSBsaWJfJChBUkNIKS9saWIkKEFSQ0gpLmEKLUxJQlMgKz0gZnMvamZmczIvbGliamZmczIuYQorTElCUyArPSBmcy9qZmZzMi9saWJqZmZzMi5hIGZzL2Zkb3MvbGliZmRvcy5hCiBMSUJTICs9IG5ldC9saWJuZXQuYQogTElCUyArPSBkaXNrL2xpYmRpc2suYQogTElCUyArPSBydGMvbGlicnRjLmEKQEAgLTYyNyw2ICs2MzMsMTUgQEAKIGNzYjIyNl9jb25maWcJOgl1bmNvbmZpZwogCUAuL21rY29uZmlnICQoQDpfY29uZmlnPSkgYXJtIHhzY2FsZSBjc2IyMjYKIAorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBpMzg2CisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBBTUQgU0M1MjAgQ0RQIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc2M1MjBfY2RwX2NvbmZpZwk6CXVuY29uZmlnCisJQC4vbWtjb25maWcgJChAOl9jb25maWc9KSBpMzg2IGkzODYgc2M1MjBfY2RwCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2xlYW46CmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggMjRhZDIwYS4uODk0ZTE5MyAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtNTM2LDYgKzUzNiw3IEBACiAJCUNGR19DTURfRUxGCSAgYm9vdGVsZiwgYm9vdHZ4CiAJCUNGR19DTURfRU5WCSAgc2F2ZWVudgogCQlDRkdfQ01EX0ZEQwkqIEZsb3BweSBEaXNrIFN1cHBvcnQKKwkJQ0ZHX0NNRF9GRE9TCSogRG9zIGRpc2tldHRlIFN1cHBvcnQKIAkJQ0ZHX0NNRF9GTEFTSAkgIGZsaW5mbywgZXJhc2UsIHByb3RlY3QKIAkJQ0ZHX0NNRF9GUEdBCSAgRlBHQSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gc3VwcG9ydAogCQlDRkdfQ01EX0kyQwkqIEkyQyBzZXJpYWwgYnVzIHN1cHBvcnQKQEAgLTExMjcsNiArMTEyOCw3IEBACiAgICAgICAgICAgICAgICAgRGVmaW5lIHRoaXMgdG8gY29udGFpbiBhbnkgbnVtYmVyIG9mIG51bGwgdGVybWluYXRlZAogICAgICAgICAgICAgICAgIHN0cmluZ3MgKHZhcmlhYmxlID0gdmFsdWUgcGFpcnMpIHRoYXQgd2lsbCBiZSBwYXJ0IG9mCiAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgZW52aXJvbWVudCBjb21waWxlZCBpbnRvIHRoZSBib290IGltYWdlLgorCiAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHBsYWNlIHNvbWV0aGluZyBsaWtlIHRoaXMgaW4geW91cgogICAgICAgICAgICAgICAgIGJvYXJkJ3MgY29uZmlnIGZpbGU6CiAKQEAgLTExMzYsOSArMTEzOCw5IEBACiAKICAgICAgICAgICAgICAgICBXYXJuaW5nOiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiBrbm93bGVkZ2UgYWJvdXQgdGhlCiAgICAgICAgICAgICAgICAgaW50ZXJuYWwgZm9ybWF0IGhvdyB0aGUgZW52aXJvbm1lbnQgaXMgc3RvcmVkIGJ5IHRoZQotICAgICAgICAgICAgICAgIFUtQm9vdCBjb2RlLiBUaGlzIGlzIE5PVCBhbiBvZmZpY2lhbCwgZXhwb2VydGVkCisgICAgICAgICAgICAgICAgVS1Cb290IGNvZGUuIFRoaXMgaXMgTk9UIGFuIG9mZmljaWFsLCBleHBvcnRlZAogICAgICAgICAgICAgICAgIGludGVyZmFjZSEgQWx0aG91Z2ggaXQgaXMgdW5saWtlbHkgdGhhdCB0aGlzIGZvcm1hdAotICAgICAgICAgICAgICAgIHdpbGwgY2hhbmdlIHNvb24sIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSBlaXRoZXIuCisgICAgICAgICAgICAgICAgd2lsbCBjaGFuZ2Ugc29vbiwgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSBlaXRoZXIuCiAJCVlvdSBiZXR0ZXIga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgaGVyZS4KIAogICAgICAgICAgICAgICAgIE5vdGU6IG92ZXJseSAoYWIpdXNlIG9mIHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGlzCmRpZmYgLS1naXQgYS9ib2FyZC9zYzUyMF9jZHAvTWFrZWZpbGUgYi9ib2FyZC9zYzUyMF9jZHAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1MDM5MwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NjNTIwX2NkcC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSBsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gc2M1MjBfY2RwLm8gZmxhc2gubyAKK1NPQkpTCTo9IHNjNTIwX2NkcF9hc20ubyBzYzUyMF9jZHBfYXNtMTYubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSBjcnYgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5kZXBlbmQ6CU1ha2VmaWxlICQoU09CSlM6Lm89LlMpICQoT0JKUzoubz0uYykKKwkJJChDQykgLU0gJChDUFBGTEFHUykgJChTT0JKUzoubz0uUykgJChPQkpTOi5vPS5jKSA+ICRACisKKy1pbmNsdWRlIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvc2M1MjBfY2RwL2NvbmZpZy5tayBiL2JvYXJkL3NjNTIwX2NkcC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjZDk5OAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NjNTIwX2NkcC9jb25maWcubWsKQEAgLTAsMCArMSwyNSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDIKKyMgRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIsIGRhbmllbEBvbWljcm9uLnNlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCisKK1RFWFRfQkFTRSA9IDB4Mzg3ZTAwMDAKZGlmZiAtLWdpdCBhL2JvYXJkL3NjNTIwX2NkcC9mbGFzaC5jIGIvYm9hcmQvc2M1MjBfY2RwL2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzNDUxMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NjNTIwX2NkcC9mbGFzaC5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFsZXggWnVlcGtlIDxhenVAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCit1bG9uZyBteWZsdXNoKHZvaWQpOworCisKKyNkZWZpbmUgRkxBU0hfQkFOS19TSVpFIDB4NDAwMDAwCS8qIDQgTUIgKi8KKyNkZWZpbmUgTUFJTl9TRUNUX1NJWkUgIDB4MjAwMDAJCS8qIDEyOCBLQiAqLworCitmbGFzaF9pbmZvX3QgICAgZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsKKworCisjZGVmaW5lIENNRF9SRUFEX0FSUkFZCQkweDAwRjAwMEYwCisjZGVmaW5lIENNRF9VTkxPQ0sxCQkweDAwQUEwMEFBCisjZGVmaW5lIENNRF9VTkxPQ0syCQkweDAwNTUwMDU1CisjZGVmaW5lIENNRF9FUkFTRV9TRVRVUAkJMHgwMDgwMDA4MAorI2RlZmluZSBDTURfRVJBU0VfQ09ORklSTQkweDAwMzAwMDMwCisjZGVmaW5lIENNRF9QUk9HUkFNCQkweDAwQTAwMEEwCisjZGVmaW5lIENNRF9VTkxPQ0tfQllQQVNTCTB4MDAyMDAwMjAKKworI2RlZmluZSBNRU1fRkxBU0hfQUREUjEJCSgqKHZvbGF0aWxlIHUzMiAqKShDRkdfRkxBU0hfQkFTRSArICgweDAwMDAwNTU1IDw8IDIpKSkKKyNkZWZpbmUgTUVNX0ZMQVNIX0FERFIyCQkoKih2b2xhdGlsZSB1MzIgKikoQ0ZHX0ZMQVNIX0JBU0UgKyAoMHgwMDAwMDJBQSA8PCAyKSkpCisKKyNkZWZpbmUgQklUX0VSQVNFX0RPTkUJCTB4MDA4MDAwODAKKyNkZWZpbmUgQklUX1JEWV9NQVNLCQkweDAwODAwMDgwCisjZGVmaW5lIEJJVF9QUk9HUkFNX0VSUk9SCTB4MDAyMDAwMjAKKyNkZWZpbmUgQklUX1RJTUVPVVQJCTB4ODAwMDAwMDAgLyogb3VyIGZsYWcgKi8KKworI2RlZmluZSBSRUFEWSAxCisjZGVmaW5lIEVSUiAgIDIKKyNkZWZpbmUgVE1PICAgNAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKwordWxvbmcgZmxhc2hfaW5pdCh2b2lkKQoreworICAgIGludCBpLCBqOworICAgIHVsb25nIHNpemUgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IENGR19NQVhfRkxBU0hfQkFOS1M7IGkrKykKKyAgICB7CisJdWxvbmcgZmxhc2hiYXNlID0gMDsKKwlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0KKwkgIChBTURfTUFOVUZBQ1QgJiBGTEFTSF9WRU5ETUFTSykgfAorCSAgKEFNRF9JRF9MVjE2MEIgJiBGTEFTSF9UWVBFTUFTSyk7CisJZmxhc2hfaW5mb1tpXS5zaXplID0gRkxBU0hfQkFOS19TSVpFOworCWZsYXNoX2luZm9baV0uc2VjdG9yX2NvdW50ID0gQ0ZHX01BWF9GTEFTSF9TRUNUOworCW1lbXNldChmbGFzaF9pbmZvW2ldLnByb3RlY3QsIDAsIENGR19NQVhfRkxBU0hfU0VDVCk7CisJaWYgKGkgPT0gMCkKKwkgIGZsYXNoYmFzZSA9IFBIWVNfRkxBU0hfMTsKKwllbHNlCisJICBwYW5pYygiY29uZmlndXJlZCB0byBtYW55IGZsYXNoIGJhbmtzIVxuIik7CisJZm9yIChqID0gMDsgaiA8IGZsYXNoX2luZm9baV0uc2VjdG9yX2NvdW50OyBqKyspCisJeworCisJICAgIGlmIChqIDw9IDMpCisJICAgIHsKKwkJLyogMXN0IG9uZSBpcyAzMiBLQiAqLworCQlpZiAoaiA9PSAwKQorCQl7CisJCQlmbGFzaF9pbmZvW2ldLnN0YXJ0W2pdID0gZmxhc2hiYXNlICsgMDsKKwkJfQorCisJCS8qIDJuZCBhbmQgM3JkIGFyZSBib3RoIDE2IEtCICovCisJCWlmICgoaiA9PSAxKSB8fCAoaiA9PSAyKSkKKwkJeworCQkJZmxhc2hfaW5mb1tpXS5zdGFydFtqXSA9IGZsYXNoYmFzZSArIDB4ODAwMCArIChqLTEpKjB4NDAwMDsKKwkJfQorCisJCS8qIDR0aCA2NCBLQiAqLworCQlpZiAoaiA9PSAzKQorCQl7CisJCQlmbGFzaF9pbmZvW2ldLnN0YXJ0W2pdID0gZmxhc2hiYXNlICsgMHgxMDAwMDsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlmbGFzaF9pbmZvW2ldLnN0YXJ0W2pdID0gZmxhc2hiYXNlICsgKGogLSAzKSpNQUlOX1NFQ1RfU0laRTsKKwkgICAgfQorCX0KKwlzaXplICs9IGZsYXNoX2luZm9baV0uc2l6ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFByb3RlY3QgbW9uaXRvciBhbmQgZW52aXJvbm1lbnQgc2VjdG9ycworICAgICAqLworICAgIGZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwKKwkJICBpMzg2Ym9vdF9zdGFydC1DRkdfRkxBU0hfQkFTRSwKKwkJICBpMzg2Ym9vdF9lbmQtQ0ZHX0ZMQVNIX0JBU0UsCisJCSAgJmZsYXNoX2luZm9bMF0pOworCisgICAgZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkgIENGR19FTlZfQUREUiwKKwkJICBDRkdfRU5WX0FERFIgKyBDRkdfRU5WX1NJWkUgLSAxLAorCQkgICZmbGFzaF9pbmZvWzBdKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZsYXNoX3ByaW50X2luZm8gIChmbGFzaF9pbmZvX3QgKmluZm8pCit7CisgICAgaW50IGk7CisKKyAgICBzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spCisgICAgeworICAgIGNhc2UgKEFNRF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKToKKwlwcmludGYoIkFNRDogIik7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlwcmludGYoIlVua25vd24gVmVuZG9yICIpOworCWJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykKKyAgICB7CisgICAgY2FzZSAoQU1EX0lEX0xWMTYwQiAmIEZMQVNIX1RZUEVNQVNLKToKKwlwcmludGYoIjJ4IEFtZDI5RjE2MEJCICgxNk1iaXQpXG4iKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXByaW50ZigiVW5rbm93biBDaGlwIFR5cGVcbiIpOworCWdvdG8gRG9uZTsKKwlicmVhazsKKyAgICB9CisKKyAgICBwcmludGYoIiAgU2l6ZTogJWxkIE1CIGluICVkIFNlY3RvcnNcbiIsCisJICAgaW5mby0+c2l6ZSA+PiAyMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKworICAgIHByaW50ZigiICBTZWN0b3IgU3RhcnQgQWRkcmVzc2VzOiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykKKyAgICB7CisJaWYgKChpICUgNSkgPT0gMCkKKwl7CisJICAgIHByaW50ZiAoIlxuICAgIik7CisJfQorCXByaW50ZiAoIiAlMDhsWCVzIiwgaW5mby0+c3RhcnRbaV0sCisJCWluZm8tPnByb3RlY3RbaV0gPyAiIChSTykiIDogIiAgICAgIik7CisgICAgfQorICAgIHByaW50ZiAoIlxuIik7CisKK0RvbmU6Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitpbnQJZmxhc2hfZXJhc2UgKGZsYXNoX2luZm9fdCAqaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCit7CisgICAgdWxvbmcgcmVzdWx0OworICAgIGludCBpZmxhZywgY2ZsYWcsIHByb3QsIHNlY3Q7CisgICAgaW50IHJjID0gRVJSX09LOworICAgIGludCBjaGlwMSwgY2hpcDI7CisKKyAgICAvKiBmaXJzdCBsb29rIGZvciBwcm90ZWN0aW9uIGJpdHMgKi8KKworICAgIGlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKQorCXJldHVybiBFUlJfVU5LTk9XTl9GTEFTSF9UWVBFOworCisgICAgaWYgKChzX2ZpcnN0IDwgMCkgfHwgKHNfZmlyc3QgPiBzX2xhc3QpKSB7CisJcmV0dXJuIEVSUl9JTlZBTDsKKyAgICB9CisKKyAgICBpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spICE9CisJKEFNRF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKSkgeworCXJldHVybiBFUlJfVU5LTk9XTl9GTEFTSF9WRU5ET1I7CisgICAgfQorCisgICAgcHJvdCA9IDA7CisgICAgZm9yIChzZWN0PXNfZmlyc3Q7IHNlY3Q8PXNfbGFzdDsgKytzZWN0KSB7CisJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pIHsKKwkgICAgcHJvdCsrOworCX0KKyAgICB9CisgICAgaWYgKHByb3QpCisJcmV0dXJuIEVSUl9QUk9URUNURUQ7CisKKyAgICAvKgorICAgICAqIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQKKyAgICAgKiBoZXJlLiBSZW1lbWJlciB0aGF0IG91ciBleGNlcHRpb24gdmVjdG9ycyBhcmUKKyAgICAgKiBhdCBhZGRyZXNzIDAgaW4gdGhlIGZsYXNoLCBhbmQgd2UgZG9uJ3Qgd2FudCBhCisgICAgICogKHRpY2tlcikgZXhjZXB0aW9uIHRvIGhhcHBlbiB3aGlsZSB0aGUgZmxhc2gKKyAgICAgKiBjaGlwIGlzIGluIHByb2dyYW1taW5nIG1vZGUuCisgICAgICovCisgICAgaWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworICAgIC8qIFN0YXJ0IGVyYXNlIG9uIHVucHJvdGVjdGVkIHNlY3RvcnMgKi8KKyAgICBmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0PD1zX2xhc3QgJiYgIWN0cmxjKCk7IHNlY3QrKykKKyAgICB7CisJcHJpbnRmKCJFcmFzaW5nIHNlY3RvciAlMmQgLi4uICIsIHNlY3QpOworCisJLyogYXJtIHNpbXBsZSwgbm9uIGludGVycnVwdCBkZXBlbmRlbnQgdGltZXIgKi8KKwlyZXNldF90aW1lcigpOworCisJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkKKwl7CS8qIG5vdCBwcm90ZWN0ZWQgKi8KKwkgICAgdnVfbG9uZyAqYWRkciA9ICh2dV9sb25nICopKGluZm8tPnN0YXJ0W3NlY3RdKTsKKworCSAgICBNRU1fRkxBU0hfQUREUjEgPSBDTURfVU5MT0NLMTsKKwkgICAgTUVNX0ZMQVNIX0FERFIyID0gQ01EX1VOTE9DSzI7CisJICAgIE1FTV9GTEFTSF9BRERSMSA9IENNRF9FUkFTRV9TRVRVUDsKKworCSAgICBNRU1fRkxBU0hfQUREUjEgPSBDTURfVU5MT0NLMTsKKwkgICAgTUVNX0ZMQVNIX0FERFIyID0gQ01EX1VOTE9DSzI7CisJICAgICphZGRyID0gQ01EX0VSQVNFX0NPTkZJUk07CisKKwkgICAgLyogd2FpdCB1bnRpbCBmbGFzaCBpcyByZWFkeSAqLworCSAgICBjaGlwMSA9IGNoaXAyID0gMDsKKworCSAgICBkbworCSAgICB7CisJCXJlc3VsdCA9ICphZGRyOworCisJCS8qIGNoZWNrIHRpbWVvdXQgKi8KKwkJaWYgKGdldF90aW1lcigwKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKQorCQl7CisJCSAgICBNRU1fRkxBU0hfQUREUjEgPSBDTURfUkVBRF9BUlJBWTsKKwkJICAgIGNoaXAxID0gVE1POworCQkgICAgYnJlYWs7CisJCX0KKworCQlpZiAoIWNoaXAxICYmIChyZXN1bHQgJiAweEZGRkYpICYgQklUX0VSQVNFX0RPTkUpCisJCQljaGlwMSA9IFJFQURZOworCisJCWlmICghY2hpcDEgJiYgKHJlc3VsdCAmIDB4RkZGRikgJiBCSVRfUFJPR1JBTV9FUlJPUikKKwkJCWNoaXAxID0gRVJSOworCisJCWlmICghY2hpcDIgJiYgKHJlc3VsdCA+PiAxNikgJiBCSVRfRVJBU0VfRE9ORSkKKwkJCWNoaXAyID0gUkVBRFk7CisKKwkJaWYgKCFjaGlwMiAmJiAocmVzdWx0ID4+IDE2KSAmIEJJVF9QUk9HUkFNX0VSUk9SKQorCQkJY2hpcDIgPSBFUlI7CisKKwkgICAgfSAgd2hpbGUgKCFjaGlwMSB8fCAhY2hpcDIpOworCisJICAgIE1FTV9GTEFTSF9BRERSMSA9IENNRF9SRUFEX0FSUkFZOworCisJICAgIGlmIChjaGlwMSA9PSBFUlIgfHwgY2hpcDIgPT0gRVJSKQorCSAgICB7CisJCXJjID0gRVJSX1BST0dfRVJST1I7CisJCWdvdG8gb3V0YWhlcmU7CisJICAgIH0KKwkgICAgaWYgKGNoaXAxID09IFRNTykKKwkgICAgeworCQlyYyA9IEVSUl9USU1PVVQ7CisJCWdvdG8gb3V0YWhlcmU7CisJICAgIH0KKworCSAgICBwcmludGYoIm9rLlxuIik7CisJfQorCWVsc2UgLyogaXQgd2FzIHByb3RlY3RlZCAqLworCXsKKwkgICAgcHJpbnRmKCJwcm90ZWN0ZWQhXG4iKTsKKwl9CisgICAgfQorCisgICAgaWYgKGN0cmxjKCkpCisgICAgICBwcmludGYoIlVzZXIgSW50ZXJydXB0IVxuIik7CisKK291dGFoZXJlOgorICAgIC8qIGFsbG93IGZsYXNoIHRvIHNldHRsZSAtIHdhaXQgMTAgbXMgKi8KKyAgICB1ZGVsYXkoMTAwMDApOworCisgICAgaWYgKGlmbGFnKQorICAgICAgZW5hYmxlX2ludGVycnVwdHMoKTsKKworCisgICAgcmV0dXJuIHJjOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5IG1lbW9yeSB0byBmbGFzaAorICovCisKK3ZvbGF0aWxlIHN0YXRpYyBpbnQgd3JpdGVfd29yZCAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKQoreworICAgIHZ1X2xvbmcgKmFkZHIgPSAodnVfbG9uZyAqKWRlc3Q7CisgICAgdWxvbmcgcmVzdWx0OworICAgIGludCByYyA9IEVSUl9PSzsKKyAgICBpbnQgaWZsYWc7CisgICAgaW50IGNoaXAxLCBjaGlwMjsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkCisgICAgICovCisgICAgcmVzdWx0ID0gKmFkZHI7CisgICAgaWYgKChyZXN1bHQgJiBkYXRhKSAhPSBkYXRhKQorICAgICAgICByZXR1cm4gRVJSX05PVF9FUkFTRUQ7CisKKworICAgIC8qCisgICAgICogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dAorICAgICAqIGhlcmUuIFJlbWVtYmVyIHRoYXQgb3VyIGV4Y2VwdGlvbiB2ZWN0b3JzIGFyZQorICAgICAqIGF0IGFkZHJlc3MgMCBpbiB0aGUgZmxhc2gsIGFuZCB3ZSBkb24ndCB3YW50IGEKKyAgICAgKiAodGlja2VyKSBleGNlcHRpb24gdG8gaGFwcGVuIHdoaWxlIHRoZSBmbGFzaAorICAgICAqIGNoaXAgaXMgaW4gcHJvZ3JhbW1pbmcgbW9kZS4KKyAgICAgKi8KKyAgICBpZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisgICAgTUVNX0ZMQVNIX0FERFIxID0gQ01EX1VOTE9DSzE7CisgICAgTUVNX0ZMQVNIX0FERFIyID0gQ01EX1VOTE9DSzI7CisgICAgTUVNX0ZMQVNIX0FERFIxID0gQ01EX1VOTE9DS19CWVBBU1M7CisgICAgKmFkZHIgPSBDTURfUFJPR1JBTTsKKyAgICAqYWRkciA9IGRhdGE7CisKKyAgICAvKiBhcm0gc2ltcGxlLCBub24gaW50ZXJydXB0IGRlcGVuZGVudCB0aW1lciAqLworICAgIHJlc2V0X3RpbWVyKCk7CisKKyAgICAvKiB3YWl0IHVudGlsIGZsYXNoIGlzIHJlYWR5ICovCisgICAgY2hpcDEgPSBjaGlwMiA9IDA7CisgICAgZG8KKyAgICB7CisJcmVzdWx0ID0gKmFkZHI7CisKKwkvKiBjaGVjayB0aW1lb3V0ICovCisJaWYgKGdldF90aW1lcigwKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKQorCXsKKwkgICAgY2hpcDEgPSBFUlIgfCBUTU87CisJICAgIGJyZWFrOworCX0KKwlpZiAoIWNoaXAxICYmICgocmVzdWx0ICYgMHg4MCkgPT0gKGRhdGEgJiAweDgwKSkpCisJCWNoaXAxID0gUkVBRFk7CisKKwlpZiAoIWNoaXAxICYmICgocmVzdWx0ICYgMHhGRkZGKSAmIEJJVF9QUk9HUkFNX0VSUk9SKSkKKwl7CisJCXJlc3VsdCA9ICphZGRyOworCisJCWlmICgocmVzdWx0ICYgMHg4MCkgPT0gKGRhdGEgJiAweDgwKSkKKwkJCWNoaXAxID0gUkVBRFk7CisJCWVsc2UKKwkJCWNoaXAxID0gRVJSOworCX0KKworCWlmICghY2hpcDIgJiYgKChyZXN1bHQgJiAoMHg4MCA8PCAxNikpID09IChkYXRhICYgKDB4ODAgPDwgMTYpKSkpCisJCWNoaXAyID0gUkVBRFk7CisKKwlpZiAoIWNoaXAyICYmICgocmVzdWx0ID4+IDE2KSAmIEJJVF9QUk9HUkFNX0VSUk9SKSkKKwl7CisJCXJlc3VsdCA9ICphZGRyOworCisJCWlmICgocmVzdWx0ICYgKDB4ODAgPDwgMTYpKSA9PSAoZGF0YSAmICgweDgwIDw8IDE2KSkpCisJCQljaGlwMiA9IFJFQURZOworCQllbHNlCisJCQljaGlwMiA9IEVSUjsKKwl9CisKKyAgICB9ICB3aGlsZSAoIWNoaXAxIHx8ICFjaGlwMik7CisKKyAgICAqYWRkciA9IENNRF9SRUFEX0FSUkFZOworCisgICAgaWYgKGNoaXAxID09IEVSUiB8fCBjaGlwMiA9PSBFUlIgfHwgKmFkZHIgIT0gZGF0YSkKKyAgICAgICAgcmMgPSBFUlJfUFJPR19FUlJPUjsKKworICAgIGlmIChpZmxhZykKKyAgICAgIGVuYWJsZV9pbnRlcnJ1cHRzKCk7CisKKworICAgIHJldHVybiByYzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2guCisgKi8KKworaW50IHdyaXRlX2J1ZmYgKGZsYXNoX2luZm9fdCAqaW5mbywgdWNoYXIgKnNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQoreworICAgIHVsb25nIGNwLCB3cCwgZGF0YTsKKyAgICBpbnQgbDsKKyAgICBpbnQgaSwgcmM7CisKKyAgICB3cCA9IChhZGRyICYgfjMpOwkvKiBnZXQgbG93ZXIgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KKworICAgIC8qCisgICAgICogaGFuZGxlIHVuYWxpZ25lZCBzdGFydCBieXRlcworICAgICAqLworICAgIGlmICgobCA9IGFkZHIgLSB3cCkgIT0gMCkgeworCWRhdGEgPSAwOworCWZvciAoaT0wLCBjcD13cDsgaTxsOyArK2ksICsrY3ApIHsKKwkgICAgZGF0YSA9IChkYXRhID4+IDgpIHwgKCoodWNoYXIgKiljcCA8PCAyNCk7CisJfQorCWZvciAoOyBpPDQgJiYgY250PjA7ICsraSkgeworCSAgICBkYXRhID0gKGRhdGEgPj4gOCkgfCAoKnNyYysrIDw8IDI0KTsKKwkgICAgLS1jbnQ7CisJICAgICsrY3A7CisJfQorCWZvciAoOyBjbnQ9PTAgJiYgaTw0OyArK2ksICsrY3ApIHsKKwkgICAgZGF0YSA9IChkYXRhID4+IDgpIHwgKCoodWNoYXIgKiljcCA8PCAyNCk7CisJfQorCisJaWYgKChyYyA9IHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpKSAhPSAwKSB7CisJICAgIHJldHVybiAocmMpOworCX0KKwl3cCArPSA0OworICAgIH0KKworICAgIC8qCisgICAgICogaGFuZGxlIHdvcmQgYWxpZ25lZCBwYXJ0CisgICAgICovCisgICAgd2hpbGUgKGNudCA+PSA0KSB7CisJZGF0YSA9ICooKHZ1X2xvbmcqKXNyYyk7CisJaWYgKChyYyA9IHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpKSAhPSAwKSB7CisJICAgIHJldHVybiAocmMpOworCX0KKwlzcmMgKz0gNDsKKwl3cCAgKz0gNDsKKwljbnQgLT0gNDsKKyAgICB9CisKKyAgICBpZiAoY250ID09IDApIHsKKwlyZXR1cm4gRVJSX09LOworICAgIH0KKworICAgIC8qCisgICAgICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisgICAgICovCisgICAgZGF0YSA9IDA7CisgICAgZm9yIChpPTAsIGNwPXdwOyBpPDQgJiYgY250PjA7ICsraSwgKytjcCkgeworCWRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqc3JjKysgPDwgMjQpOworCS0tY250OworICAgIH0KKyAgICBmb3IgKDsgaTw0OyArK2ksICsrY3ApIHsKKwlkYXRhID0gKGRhdGEgPj4gOCkgfCAoKih1Y2hhciAqKWNwIDw8IDI0KTsKKyAgICB9CisKKyAgICByZXR1cm4gd3JpdGVfd29yZChpbmZvLCB3cCwgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9zYzUyMF9jZHAvc2M1MjBfY2RwLmMgYi9ib2FyZC9zYzUyMF9jZHAvc2M1MjBfY2RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4MThkMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NjNTIwX2NkcC9zYzUyMF9jZHAuYwpAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIgPGRhbmllbEBvbWljcm9uLnNlPi4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2ljL3NjNTIwLmg+CisjaW5jbHVkZSA8YXNtL2ljL2FsaTUxMnguaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBpcnFfaW5pdCh2b2lkKQoreworCQorCS8qIGRpc2FibGUgZ2xvYmFsIGludGVycnVwdCBtb2RlICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BJQ0lDUiwgMHg0MCk7IAorCQorCS8qIHNldCBpcnEwLTcgdG8gZWRnZSAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9NUElDTU9ERSwgMHgwMCk7CisJCisJLyogc2V0IGlycTktMTIgdG8gbGV2ZWwsIGFsbCB0aGUgb3RoZXIgKDgsIDEzLTE1KSBhcmUgZWRnZSAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TTDFQSUNNT0RFLCAweDFlKTsKKwkKKwkvKiBzZXQgaXJxMTYtMjQgKHVudXNlZCBzbGF2ZSBwaWMyKSB0byBsZXZlbCAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TTDJQSUNNT0RFLCAweGZmKTsKKwkKKwkvKiBhY3RpdmUgbG93IHBvbGFyaXR5IG9uIFBJQyBpbnRlcnJ1cHQgcGlucywgCisJICAgYWN0aXZlIGhpZ2ggcG9sYXJpdHkgb24gYWxsIG90aGVyIGlycSBwaW5zICovCisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0lOVFBJTlBPTCwgMCk7CisKKwkvKiBzZXQgaXJxIG51bWJlciBtYXBwaW5nICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQVE1SME1BUCwwKTsgICAgICAgICAgICAvKiBkaXNhYmxlIEdQIHRpbWVyIDAgSU5UICovICAgICAgIAorCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFRNUjFNQVAsMCk7ICAgICAgICAgICAgLyogZGlzYWJsZSBHUCB0aW1lciAxIElOVCAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFRNUjJNQVAsMCk7ICAgICAgICAgICAgLyogZGlzYWJsZSBHUCB0aW1lciAyIElOVCAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSVQwTUFQLDB4MSk7ICAgICAgICAgICAgLyogU2V0IFBJVCB0aW1lciAwIElOVCB0byBJUlEwICovIAorCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSVQxTUFQLDApOyAgICAgICAgICAgICAgLyogZGlhYmxlIFBJVCB0aW1lciAxIElOVCAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSVQyTUFQLDApOyAgICAgICAgICAgICAgLyogZGlhYmxlIFBJVCB0aW1lciAyIElOVCAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRBTUFQLDB4NCk7ICAgICAgICAgLyogU2V0IFBDSSBJTlQgQSB0byBJUlE5ICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVEJNQVAsMHg1KTsgICAgICAgICAvKiBTZXQgUENJIElOVCBCIHRvIElSUTEwICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVENNQVAsMHg2KTsgICAgICAgICAvKiBTZXQgUENJIElOVCBDIHRvIElSUTExICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVERNQVAsMHg3KTsgICAgICAgICAvKiBTZXQgUENJIElOVCBEIHRvIElSUTEyICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RNQUJDSU5UTUFQLDApOyAgICAgICAgICAvKiBkaXNhYmxlIERNQSBJTlQgKi8gCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSU1BUCwwKTsgICAgICAgICAgICAgICAvKiBkaXNhYmxlIFN5bmNocm9uaXVzIHNlcmlhbCBJTlQgKi8KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfV0RUTUFQLDApOyAgICAgICAgICAgICAgIC8qIGRpc2FibGUgV2F0Y2hkb3IgSU5UICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1JUQ01BUCwweDMpOyAgICAgICAgICAgICAvKiBTZXQgUlRDIGludCB0byA4ICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1dQVk1BUCwwKTsgICAgICAgICAgICAgICAvKiBkaXNhYmxlIHdyaXRlIHByb3RlY3QgSU5UICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0lDRU1BUCwweDIpOyAgICAgICAgICAgICAvKiBTZXQgSUNFIERlYnVnIFNlcmllbHBvcnQgSU5UIHRvIElSUTEgKi8KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfRkVSUk1BUCwweDgpOyAgICAgICAgICAgIC8qIFNldCBGUCBlcnJvciBJTlQgdG8gSVJRMTMgKi8KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AwSU1BUCw2KTsgICAgICAgICAgICAgIC8qIFNldCBHUElSUTAgKElTQSBJUlEyKSB0byBJUlE5ICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMUlNQVAsMik7ICAgICAgICAgICAgICAvKiBTZXQgR1BJUlExIChTSU8gSVJRMSkgdG8gSVJRMSAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDJJTUFQLDcpOyAgICAgICAgICAgICAgLyogU2V0IEdQSVJRMiAoSVNBIElSUTEyKSB0byBJUlExMiAqLworCQorCWlmIChDRkdfVVNFX1NJT19VQVJUKSB7CisJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMU1BUCwwKTsgICAgIC8qIGRpc2FibGUgaW50ZXJuYWwgVUFSVDEgSU5UICovCisJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMk1BUCwwKTsgICAgIC8qIGRpc2FibGUgaW50ZXJuYWwgVUFSVDIgSU5UICovCisJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDNJTUFQLDExKTsgICAgIC8qIFNldCBHUElSUTMgKElTQSBJUlEzKSB0byBJUlEzICovIAorCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A0SU1BUCwxMik7ICAgICAvKiBTZXQgR1BJUlE0IChJU0EgSVJRNCkgdG8gSVJRNCAqLworCX0gZWxzZSB7CisJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMU1BUCwxMik7ICAgIC8qIFNldCBpbnRlcm5hbCBVQVJUMiBJTlQgdG8gSVJRNCAqLworCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDJNQVAsMTEpOyAgICAvKiBTZXQgaW50ZXJuYWwgVUFSVDIgSU5UIHRvIElSUTMgKi8KKwkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQM0lNQVAsMCk7ICAgICAgLyogZGlzYWJsZSBHUElSUTMgKElTQSBJUlEzKSAqLyAKKwkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNElNQVAsMCk7ICAgICAgLyogZGlzYWJsZSBHUElSUTQgKElTQSBJUlE0KSAqLworCX0KKwkKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A1SU1BUCwxMyk7ICAgICAgICAgICAgIC8qIFNldCBHUElSUTUgKElTQSBJUlE1KSB0byBJUlE1ICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNklNQVAsMjEpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE2IChJU0EgSVJRNikgdG8gSVJRNiAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDdJTUFQLDIyKTsgICAgICAgICAgICAgLyogU2V0IEdQSVJRNyAoSVNBIElSUTcpIHRvIElSUTcgKi8KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1A4SU1BUCwzKTsgICAgICAgICAgICAgIC8qIFNldCBHUElSUTggKFNJTyBJUlE4KSB0byBJUlE4ICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQOUlNQVAsNCk7ICAgICAgICAgICAgICAvKiBTZXQgR1BJUlE5IChJU0EgSVJROSkgdG8gSVJROSAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDEwSU1BUCw5KTsgICAgICAgICAgICAgLyogU2V0IEdQSVJRMTAgKElTQSBJUlExMCkgdG8gSVJRMTAgKi8gICAgICAgICAgCisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BDSUhPU1RNQVAsMHgxMWYpOyAgICAgICAvKiBNYXAgUENJIGhvc3RicmlkZ2UgSU5UIHRvIE5NSSAqLworCXdyaXRlX21tY3Jfd29yZChTQzUyMF9FQ0NNQVAsMHgxMDApOyAgICAgICAgICAgLyogTWFwIFNEUkFNIEVDQyBmYWlsdXJlIElOVCB0byBOTUkgKi8KKyAKK30KKworLyogUENJIHN0dWZmICovCitzdGF0aWMgdm9pZCBwY2lfc2M1MjBfY2RwX2ZpeHVwX2lycShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYpCit7CisJY2hhciBwaW47CisJaW50IGlycTsKKwkKKwkKKwlwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOworCWlycSA9IHBpbi0xOworCQorCXN3aXRjaCAoUENJX0RFVihkZXYpKSB7CisJY2FzZSAyMDoKKwkJYnJlYWs7CisJY2FzZSAxOToKKwkJaXJxKz0xOworCQlicmVhazsKKwljYXNlIDE4OgorCQlpcnErPTI7CisJCWJyZWFrOworCWNhc2UgMTc6CisJCWlycSs9MzsKKwkJYnJlYWs7CisJZGVmYXVsdDogCisJCXJldHVybjsKKwl9CisJCisJaXJxJj0zOyAvKiB3cmFwIGFyb3VuZCAqLworCWlycSs9OTsgLyogbG93ZXN0IElSUSBpcyA5ICovCisJCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGlycSk7CisjaWYgMAkKKwlwcmludGYoImZpeHVwX2lycTogZGV2aWNlICVkIHBpbiAlYyBpcnEgJWRcbiIsIAorCSAgICAgICBQQ0lfREVWKGRldiksICdBJyArIHBpbiAtMSwgaXJxKTsKKyNlbmRpZgorfQorIAorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBzYzUyMF9jZHBfaG9zZSA9IHsKKwlmaXh1cF9pcnE6IHBjaV9zYzUyMF9jZHBfZml4dXBfaXJxLAorfTsKKwordm9pZCBwY2lfaW5pdCh2b2lkKQoreworCXBjaV9zYzUyMF9pbml0KCZzYzUyMF9jZHBfaG9zZSk7Cit9CisKKworc3RhdGljIHZvaWQgc2lsZW5jZV91YXJ0KGludCBwb3J0KQoreworCW91dGIoMCwgcG9ydCsxKTsKK30KKwordm9pZCBzZXR1cF9hbGlfc2lvKGludCB1YXJ0X3ByaW1hcnkpCit7CisJYWxpNTEyeF9pbml0KCk7CisJCisJYWxpNTEyeF9zZXRfZmRjKEFMSV9FTkFCTEVELCAweDNmMiwgNiwgMCk7CisJYWxpNTEyeF9zZXRfcHAoQUxJX0VOQUJMRUQsIDB4Mjc4LCA3LCAzKTsKKwlhbGk1MTJ4X3NldF91YXJ0KEFMSV9FTkFCTEVELCBBTElfVUFSVDEsIHVhcnRfcHJpbWFyeT8weDNmODoweDNlOCwgNCk7CisJYWxpNTEyeF9zZXRfdWFydChBTElfRU5BQkxFRCwgQUxJX1VBUlQyLCB1YXJ0X3ByaW1hcnk/MHgyZjg6MHgyZTgsIDMpOworCWFsaTUxMnhfc2V0X3J0YyhBTElfRElTQUJMRUQsIDAsIDApOworCWFsaTUxMnhfc2V0X2tiYyhBTElfRU5BQkxFRCwgMSwgMTIpOworCWFsaTUxMnhfc2V0X2NpbyhBTElfRU5BQkxFRCk7CisJCisJLyogSXJEYSBwaW5zICovCisJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTIsIDEsIDAsIDApOworCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDEzLCAxLCAwLCAwKTsKKwkKKwkvKiBTU0kgY2hpcCBzZWxlY3QgcGlucyAqLworCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDE0LCAwLCAwLCAwKTsgIC8qIFNTSV9DUyAqLworCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDE1LCAwLCAwLCAwKTsgIC8qIFNTSV9NViAqLwkJCQkJICAgICAKKwlhbGk1MTJ4X2Npb19mdW5jdGlvbigxNiwgMCwgMSwgMCk7ICAvKiBTU0lfU1BJIyAoaW52ZXJ0ZWQpICovCisKKwkvKiBCb2FyZCBSRVYgcGlucyAqLworCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIwLCAwLCAwLCAxKTsKKwlhbGk1MTJ4X2Npb19mdW5jdGlvbigyMSwgMCwgMCwgMSk7CisJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjIsIDAsIDAsIDEpOworCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIzLCAwLCAwLCAxKTsgICAgICAKK30KKworCisvKiBzZXQgdXAgdGhlIElTQSBidXMgdGltaW5nIGFuZCBzeXN0ZW0gYWRkcmVzcyBtYXBwaW5ncyAqLworc3RhdGljIHZvaWQgYnVzX2luaXQodm9pZCkKK3sKKworCS8qIHNldCB1cCB0aGUgR1AgSU8gcGlucyAqLworCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9QRlMzMV8xNiwgMHhmN2ZmKTsgCS8qIHNldCB0aGUgR1BJTyBwaW4gZnVuY3Rpb24gMzEtMTYgcmVnICovCQkgICAKKwl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPUEZTMTVfMCwgMHhmZmZmKTsgIAkvKiBzZXQgdGhlIEdQSU8gcGluIGZ1bmN0aW9uIDE1LTAgcmVnICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0NTUEZTLCAweGY4KTsgIAkJLyogc2V0IHRoZSBDUyBwaW4gZnVuY3Rpb24gIHJlZyAqLwkKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ0xLU0VMLCAweDcwKTsKKworCQorCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTUlQsIDEpOyAgIC8qIHNldCB0aGUgR1AgQ1Mgb2Zmc2V0ICovICAgIAkKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BDU1BXLCAzKTsgICAvKiBzZXQgdGhlIEdQIENTIHB1bHNlIHdpZHRoICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQQ1NPRkYsIDEpOyAgLyogc2V0IHRoZSBHUCBDUyBvZmZzZXQgKi8KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BSRFcsIDMpOyAgICAvKiBzZXQgdGhlIFJEIHB1bHNlIHdpZHRoICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQUkRPRkYsIDEpOyAgLyogc2V0IHRoZSBHUCBSRCBvZmZzZXQgKi8KKyAgICAgICAgd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQV1JXLCAzKTsgICAgLyogc2V0IHRoZSBHUCBXUiBwdWxzZSB3aWR0aCAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFdST0ZGLCAxKTsgIC8qIHNldCB0aGUgR1AgV1Igb2Zmc2V0ICovCisKKwl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfQk9PVENTQ1RMLCAweDE4MjMpOwkJLyogc2V0IHVwIHRpbWluZyBvZiBCT09UQ1MgKi8gCisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1JPTUNTMUNUTCwgMHgxODIzKTsJCS8qIHNldCB1cCB0aW1pbmcgb2YgUk9NQ1MxICovCisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1JPTUNTMkNUTCwgMHgxODIzKTsJCS8qIHNldCB1cCB0aW1pbmcgb2YgUk9NQ1MyICovIAorCQorCS8qIGFkanVzdCB0aGUgbWVtb3J5IG1hcDoKKwkgKiBieSBkZWZhdWx0IHRoZSBmaXJzdCAyNTZNQiAoMHgwMDAwMDAwMCAtIDB4MGZmZmZmZmYpIGlzIG1hcHBlZCB0byBTRFJBTQorCSAqIGFuZCAyNTZNQiB0byAxRy0xMjhrICAoMHgxMDAwMDAwIC0gMHgzN2ZmZmZmZikgaXMgbWFwcGVkIHRvIFBDSSBtbWlvCisJICogd2UgbmVlZCB0byBtYXAgMUctMTI4ayAtIDFHICgweDM4MDAwMDAwIC0gMHgzZmZmZmZmZikgdG8gQ1MxICovIAorCQorCQkKKwkvKiBTUkFNID0gR1BDUzMgMTI4ayBAIGQwMDAwLWVmZmZmKi8KKwl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMiwgIDB4NGUwMDQwMGQpOwkJCisJCisJLyogSURFMCA9IEdQQ1M2IDFmMC0xZjcgKi8KKwl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMywgIDB4MzgwODAxZjApOwkJCisKKwkvKiBJREUxID0gR1BDUzcgM2Y2ICovCisJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjQsICAweDNjMDAwM2Y2KTsJCQorCS8qIGJvb3RjcyAqLworCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMiwgMHg4YmZmZTgwMCk7CQkKKwkvKiByb21jczIgKi8KKwl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMTMsIDB4Y2JmZmYwMDApOwkJCisJLyogcm9tY3MxICovCisJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjE0LCAweGFiZmZmODAwKTsJCQorCS8qIDY4MCBMRURTICovCisJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjE1LCAweDMwMDAwNjQwKTsJCQorCQorCWFzbSAoIndiaW52ZFxuIik7IC8qIEZsdXNoIGNhY2hlLCByZXEuIGFmdGVyIHNldHRpbmcgdGhlIHVuY2hhY2hlZCBhdHRyaWJ1dGUgb25hIFBBUiAqLwkKKworCWlmIChDRkdfVVNFX1NJT19VQVJUKSB7CisJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwsIHJlYWRfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCkgfCBVQVJUMl9ESVN8VUFSVDFfRElTKTsJCisJCXNldHVwX2FsaV9zaW8oMSk7CisJfSBlbHNlIHsKKwkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCwgcmVhZF9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMKSAmIH4oVUFSVDJfRElTfFVBUlQxX0RJUykpOwkKKwkJc2V0dXBfYWxpX3NpbygwKTsKKwkJc2lsZW5jZV91YXJ0KDB4M2U4KTsKKwkJc2lsZW5jZV91YXJ0KDB4MmU4KTsKKwl9CisKK30KKworCisKKy8qCisgKiBNaXNjZWxhbmVvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGluaXRpYWxpc2F0aW9ucworICovCisKK2ludCBib2FyZF9pbml0KHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisJCisJaW5pdF9zYzUyMCgpOwkKKwlidXNfaW5pdCgpOworCWlycV9pbml0KCk7CisJCQorCS8qIG1heCBkcml2ZSBjdXJyZW50IG9uIFNEUkFNICovCisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0RTQ1RMLCAweDAxMDApOworCQkKKwkvKiBlbnRlciBkZWJ1ZyBtb2RlIGFmdGVyIG5leHQgcmVzZXQgKG9ubHkgaWYganVtcGVyIGlzIGFsc28gc2V0KSAqLworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9SRVNDRkcsIDB4MDgpOworCQorCS8qIGNvbmZpZ3VyZSB0aGUgc29mdHdhcmUgdGltZXIgdG8gMzMuMzMzTUh6ICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NXVE1SQ0ZHLCAwKTsKKwlnZC0+YnVzX2NsayA9IDMzMzMzMDAwOworCQorCXJldHVybiAwOworfQorCitpbnQgZHJhbV9pbml0KHZvaWQpCit7CisJaW5pdF9zYzUyMF9kcmFtKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2hvd19ib290X3Byb2dyZXNzKGludCB2YWwpCit7CisJb3V0Yih2YWwmMHhmZiwgMHg4MCk7CisJb3V0YigodmFsJjB4ZmYwMCk+PjgsIDB4NjgwKTsKK30KKworCitpbnQgbGFzdF9zdGFnZV9pbml0KHZvaWQpCit7CisJaW50IG1pbm9yOworCWludCBtYWpvcjsKKwkKKwltYWpvciA9IG1pbm9yID0gMDsKKwltYWpvciB8PSBhbGk1MTJ4X2Npb19pbigyMyk/MjowOworCW1ham9yIHw9IGFsaTUxMnhfY2lvX2luKDIyKT8xOjA7CisJbWlub3IgfD0gYWxpNTEyeF9jaW9faW4oMjEpPzI6MDsKKwltaW5vciB8PSBhbGk1MTJ4X2Npb19pbigyMCk/MTowOworCQorCXByaW50ZigiQU1EIFNDNTIwIENEUCByZXZpc2lvbiAlZC4lZFxuIiwgbWFqb3IsIG1pbm9yKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3NjNTIwX2NkcC9zYzUyMF9jZHBfYXNtLlMgYi9ib2FyZC9zYzUyMF9jZHAvc2M1MjBfY2RwX2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjU1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYzUyMF9jZHAvc2M1MjBfY2RwX2FzbS5TCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogbm93IHNldHVwIHRoZSBHZW5lcmFsIHB1cnBvc2UgYnVzIHRvIGdpdmUgdXMgYWNjZXNzIHRvIHRoZSBMRURzLgorICogV2UgY2FuIHRoZW4gdXNlIHRoZSBsZWRzIHRvIGRpc3BsYXkgc3RhdHVzIGluZm9ybWF0aW9uLgorICovIAorCitzYzUyMF9jZHBfcmVnaXN0ZXJzOgorLyogc2l6ZSAgICBvZmZzZXQgICAgICAgIHZhbHVlICovCisud29yZCAxIDsgLndvcmQgMHgwNDAgOyAubG9uZyAweDAwICAgICAgIC8qIFNEUkFNIGJ1ZmZlciBjb250cm9sICovCisud29yZCAyIDsgLndvcmQgMHhjMDggOyAubG9uZyAweDAwMDEgICAgIC8qIEdQIENTIG9mZnNldCAqLworLndvcmQgMiA7IC53b3JkIDB4YzA5IDsgLmxvbmcgMHgwMDAzICAgICAvKiBHUCBDUyB3aWR0aCAqLworLndvcmQgMiA7IC53b3JkIDB4YzBhIDsgLmxvbmcgMHgwMDAxICAgICAvKiBHUCBDUyB3aWR0aCAqLworLndvcmQgMiA7IC53b3JkIDB4YzBiIDsgLmxvbmcgMHgwMDAzICAgICAvKiBHUCBSRCBwdWxzZSB3aWR0aCAqLworLndvcmQgMiA7IC53b3JkIDB4YzBjIDsgLmxvbmcgMHgwMDAxICAgICAvKiBHUCBSRCBvZmZzZSAqLworLndvcmQgMiA7IC53b3JkIDB4YzBkIDsgLmxvbmcgMHgwMDAzICAgICAvKiBHUCBXUiBwdWxzZSB3aWR0aCAqLworLndvcmQgMiA7IC53b3JkIDB4YzBlIDsgLmxvbmcgMHgwMDAxICAgICAvKiBHUCBXUiBvZmZzZXQgKi8KKy53b3JkIDIgOyAud29yZCAweGMyYyA7IC5sb25nIDB4MDAwMCAgICAgLyogR1BJTyBkaXJlY3Rpb25yZWcgKi8KKy53b3JkIDIgOyAud29yZCAweGMyYSA7IC5sb25nIDB4MDAwMCAgICAgLyogR1BJTyBkaXJlY3Rpb25yZWcgKi8KKy53b3JkIDIgOyAud29yZCAweGMyMiA7IC5sb25nIDB4ZmZmZiAgICAgLyogR1BJTyBwaW4gZnVuY3Rpb24gMzEtMTYgcmVnICovCisud29yZCAyIDsgLndvcmQgMHhjMjAgOyAubG9uZyAweGZmZmYgICAgIC8qIEdQSU8gcGluIGZ1bmN0aW9uIDE1LTAgcmVnICovCisud29yZCAyIDsgLndvcmQgMHgwYzQgOyAubG9uZyAweDI4MDAwNjgwIC8qIFBBUiAxNSBmb3IgYWNjZXNzIHRvIGxlZCA2ODAgKi8KKy53b3JkIDAgOyAud29yZCAweDAwMCA7IC5sb25nIDB4MDAKKworLyogYm9hcmQgZWFybHkgaW50aWFsaXphdGlvbiAqLworLmdsb2JsIGVhcmx5X2JvYXJkX2luaXQKK2Vhcmx5X2JvYXJkX2luaXQ6CisgICAgICAgIG1vdmwgICAgJHNjNTIwX2NkcF9yZWdpc3RlcnMsJWVzaQoraW5pdF9sb29wOgkKKyAgICAgICAgbW92bCAgICAkMHhmZmZlZjAwMCwlZWRpICAgICAvKiBNTUNSIGJhc2UgdG8gZWRpICovCQkJCQkKKwltb3Z3CSglZXNpKSwgJWJ4ICAgICAgICAgIC8qIGxvYWQgc2l6ZXIgdG8gYnggKi8KKwljbXB3CSQwLCAlYnggICAgICAgICAgICAgIC8qIGlmIHNpZSBpcyAwIHdlJ3JlIGRvbmUgKi8KKwlqZQlkb25lIAorCXhvcmwJJWVkeCwlZWR4CisJbW92dwkyKCVlc2kpLCAlZHggICAgICAgIC8qIGxvYWQgTU1DUiBvZmZzZXQgdG8gZHggKi8KKwlhZGRsCSVlZHgsICVlZGkgICAgICAgICAgLyogYWRkIG9mZnNldCB0byBiYXNlIGluIGVkaSAqLworCW1vdmwJNCglZXNpKSwgJWVheCAgICAgICAvKiBsb2FkIHZhbHVlIGluIGVheCAqLworCWNtcHcJJDEsICVieAorCWplCWJ5dGUgICAgICAgICAgICAgICAgIC8qIGJ5dGUgb3A/ICovCisJY21wdwkkMiwgJWJ4CisJamUJd29yZCAgICAgICAgICAgICAgICAgLyogd29yZCBvcD8gKi8KKwltb3ZsCSVlYXgsICglZWRpKSAgICAgICAgIC8qIG11c3QgYmUgbG9uZywgdGhlbiAqLworCWptcAluZXh0CitieXRlOiAgIG1vdmIgICAgJWFsLCglZWRpKSAgICAgICAgCisJam1wCW5leHQKK3dvcmQ6CW1vdncJJWF4LCglZWRpKQorbmV4dDoJYWRkbAkkOCwgJWVzaSAgICAgICAgICAgICAvKiBhZHZhbmNlIGVzaSAqLworCWptcAlpbml0X2xvb3AKKworCS8qIHRoZSBsZWRzIGFkIDB4ODAgYW5kIDB4NjgwIHNob3VsZCBub3cgd29yayAqLworZG9uZTogICBtb3ZiCSQweDg4LCAlYWwKKwlvdXQJJWFsLCAkMHg4MAorCW1vdncJJDB4NjgwLCAlZHgKKwlvdXQJJWFsLCAlZHgKKworCWptcCAJKiVlYnAJCSAgICAgLyogcmV0dXJuIHRvIGNhbGxlciAqLworCisKKy5nbG9ibCBfX3Nob3dfYm9vdF9wcm9ncmVzcworX19zaG93X2Jvb3RfcHJvZ3Jlc3M6CisJb3V0CSVhbCwgJDB4ODAKKwl4Y2hnCSVhbCwgJWFoCisJbW92dwkkMHg2ODAsICVkeAorCW91dAklYWwsICVkeAorCWptcAkqJWVicAorCQpkaWZmIC0tZ2l0IGEvYm9hcmQvc2M1MjBfY2RwL3NjNTIwX2NkcF9hc20xNi5TIGIvYm9hcmQvc2M1MjBfY2RwL3NjNTIwX2NkcF9hc20xNi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzY2FkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYzUyMF9jZHAvc2M1MjBfY2RwX2FzbTE2LlMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIgPGRhbmllbEBvbWljcm9uLnNlPi4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogMTZiaXQgaW5pdGlhbGl6YXRpb24gY29kZS4KKyAqIFRoaXMgY29kZSBoYXZlIHRvIG1hcCB0aGUgYXJlYSBvZiB0aGUgYm9vdCBmbGFzaAorICogdGhhdCBpcyB1c2VkIGJ5IFUtYm9vdCB0byBpdHMgZmluYWwgZGVzdGluYXRpb24uCisgKi8KKworLnRleHQKKy5zZWN0aW9uIC5zdGFydDE2LCAiYXgiCisuY29kZTE2CisuZ2xvYmwgYm9hcmRfaW5pdDE2Citib2FyZF9pbml0MTY6CisJLyogQWxpYXMgTU1DUiB0byAweGRmMDAwICovCisJbW92dwkkMHhmZmZjLCAlZHgKKwltb3ZsCSQweDgwMGRmMGNiLCAlZWF4CQorCW91dGwJJWVheCwgJWR4CQkKKwkKKwkvKiBTZXQgZHMgdG8gcG9pbnQgdG8gTU1DUiBhbGlhcyAqLworCW1vdncJJDB4ZGYwMCwgJWF4CQkKKwltb3Z3CSVheCwgJWRzCQkgCisJCQorCS8qIE1hcCB0aGUgZW50aXJlIGZsYXNoIGF0IDB4MzgwMDAwMDAgIAorCSAqICh3aXRoIEJPT1RDUyBhbmQgUEFSMTQsIHVzZSAweGFiZmZmODAwIGZvciBST01DUzEpICovCisJbW92bCAgICAkMHhjMCwgJWVkaQorICAgICAgICBtb3ZsCSQweDhiZmZmODAwLCAlZWF4CisgICAgICAgIG1vdmwJJWVheCwgKCVkaSkJCQorCisJLyogRGlzYWJsZSBTRFJBTSB3cml0ZSBidWZmZXIgKi8KKwltb3Z3ICAgICQweDQwLCVkaQorICAgICAgICB4b3J3ICAgICVheCwlYXgKKyAgICAgICAgbW92YiAgICAlYWwsICglZGkpICAgICAgICAgICAgICAKKworCS8qIERpc2FiZSBNTUNSIGFsaWFzICovCisJbW92dwkkMHhmZmZjLCAlZHgKKwltb3ZsCSQweDAwMDAwMGNiLCAlZWF4CQorCW91dGwJJWVheCwgJWR4CQkKKwkKKwkvKiB0aGUgcmV0dXJuIGFkZHJlc3MgaXMgdG9yZWQgaW4gYnAgKi8KKwlqbXAJKiVicAorCQpkaWZmIC0tZ2l0IGEvYm9hcmQvc2M1MjBfY2RwL3UtYm9vdC5sZHMgYi9ib2FyZC9zYzUyMF9jZHAvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzhkM2RiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2M1MjBfY2RwL3UtYm9vdC5sZHMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIsIGRhbmllbEBvbWljcm9uLnNlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCisKK1NFQ1RJT05TCit7CQorCS4gPSAweDM4N2UwMDAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFdoZXJlIGJvb3Rjb2RlIGluIHRoZSBmbGFzaCBpcyBtYXBwZWQgKi8KKwkudGV4dCAgOiB7ICooLnRleHQpOyB9CisJCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKyAgICAgICAgLiA9IDB4NDAwMDAwOyAJICAgICAgICAgICAgICAgICAgICAvKiBSYW0gZGF0YSBzZWdtZW50IHRvIHVzZSAqLworCV9pMzg2Ym9vdF9yb21kYXRhX2Rlc3QgPSBBQlNPTFVURSguKTsKKyAgICAgICAgLmRhdGEgOiBBVCAoIExPQURBRERSKC5yb2RhdGEpICsgU0laRU9GKC5yb2RhdGEpICkgeyAqKC5kYXRhKSB9CisJX2kzODZib290X3JvbWRhdGFfc3RhcnQgPSBMT0FEQUREUiguZGF0YSk7IAkKKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5nb3QgOiBBVCAoIExPQURBRERSKC5kYXRhKSArIFNJWkVPRiguZGF0YSkgKSB7ICooLmdvdCkgfQorCV9pMzg2Ym9vdF9yb21kYXRhX3NpemUgPSBTSVpFT0YoLmRhdGEpICsgU0laRU9GKC5nb3QpOyAJCisKKworICAgICAgICAuID0gQUxJR04oNCk7CisJX2kzODZib290X2Jzc19zdGFydCA9IEFCU09MVVRFKC4pOworICAgICAgICAuYnNzIDogeyAqKC5ic3MpIH0JCisJX2kzODZib290X2Jzc19zaXplID0gU0laRU9GKC5ic3MpOworCQorCQorCS8qIDE2Yml0IHJlYWxtb2RlIHRyYW1wb2xpbmUgY29kZSAqLworCS5yZWFsbW9kZSAweDdjMCA6IEFUICggTE9BREFERFIoLmdvdCkgKyBTSVpFT0YoLmdvdCkgKSB7ICooLnJlYWxtb2RlKSB9CisgICAgCisJX2kzODZib290X3JlYWxtb2RlID0gTE9BREFERFIoLnJlYWxtb2RlKTsKKwlfaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSA9IFNJWkVPRigucmVhbG1vZGUpOworCQorCS8qIDE2Yml0IEJJT1MgZW11bGF0aW9uIGNvZGUgKGp1c3QgZW5vdWdoIHRvIGJvb3QgTGludXgpICovCisJLmJpb3MgMCA6IEFUICggTE9BREFERFIoLnJlYWxtb2RlKSArIFNJWkVPRigucmVhbG1vZGUpICkgeyAqKC5iaW9zKSB9CisgICAgCisJX2kzODZib290X2Jpb3MgPSBMT0FEQUREUiguYmlvcyk7CisJX2kzODZib290X2Jpb3Nfc2l6ZSA9IFNJWkVPRiguYmlvcyk7CisJCisKKwkvKiBUaGUgbG9hZCBhZGRyZXNzZXMgYmVsb3cgYXNzdW1lcyB0aGF0IHRoZSBmbGFzaAorCSAqIHdpbGwgYmUgbWFwcGVkIHNvIHRoYXQgMHgzODdmMDAwMCA9PSAweGZmZmYwMDAwCisJICogYXQgcmVzZXQgdGltZQorCSAqCisJICogVGhlIGZlMDAgYW5kIGZmMDAgb2Zmc2V0cyBvZiB0aGUgc3RhcnQzMiBhbmQgc3RhcnQxNiAKKwkgKiBzZWdtZW50cyBhcmUgYXJiaXRyYXJ5LCB0aGUganVzdCBoYXZlIHRvIGJlIG1hcHBlZAorCSAqIGF0IHJlc2V0IGFuZCB0aGUgY29kZSBoYXZlIHRvIGZpdC4KKwkgKiBUaGUgZmZmMCBvZmZzZXQgb2YgcmVzZXQgaXMgaW1wb3J0YW50LCBob3dldmVyLgorCSAqLworCSAKKwkgCisJLiA9IDB4ZmZmZmZlMDA7CisJLnN0YXJ0MzIgOiBBVCAoMHgzODdmZmUwMCkgeyAqKC5zdGFydDMyKTsgfSAKKwkKKwkuID0gMHhmZjAwOworCS5zdGFydDE2IDogQVQgKDB4Mzg3ZmZmMDApIHsgKiguc3RhcnQxNik7IH0gIAorCQorCS4gPSAweGZmZjA7CisJLnJlc2V0IDogQVQgKDB4Mzg3ZmZmZjApIHsgKigucmVzZXQpOyB9ICAKKwlfaTM4NmJvb3RfZW5kID0gKExPQURBRERSKC5yZXNldCkgKyBTSVpFT0YoLnJlc2V0KSApOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL01ha2VmaWxlIGIvY29tbW9uL01ha2VmaWxlCmluZGV4IDNmNGZmMDEuLjY3Mzg3ZWYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9NYWtlZmlsZQorKysgYi9jb21tb24vTWFrZWZpbGUKQEAgLTMxLDcgKzMxLDcgQEAKIAkgIGNtZF9hdXRvc2NyaXB0Lm8gY21kX2JlZGJ1Zy5vIGNtZF9ib290Lm8gXAogCSAgY21kX2Jvb3RtLm8gY21kX2NhY2hlLm8gY21kX2NvbnNvbGUubyBjbWRfZGF0ZS5vIFwKIAkgIGNtZF9kY3IubyBjbWRfZGlhZy5vIGNtZF9kb2MubyBjbWRfZHR0Lm8gXAotCSAgY21kX2VlcHJvbS5vIGNtZF9lbGYubyBjbWRfZmRjLm8gY21kX2ZsYXNoLm8gXAorCSAgY21kX2VlcHJvbS5vIGNtZF9lbGYubyBjbWRfZmRjLm8gY21kX2Zkb3MubyBjbWRfZmxhc2gubyBcCiAJICBjbWRfZnBnYS5vIGNtZF9pMmMubyBjbWRfaWRlLm8gY21kX2ltbWFwLm8gXAogCSAgY21kX2pmZnMyLm8gY21kX2xvZy5vIGNtZF9tZW0ubyBjbWRfbWlpLm8gY21kX21pc2MubyBcCiAJICBjbWRfbmV0Lm8gY21kX252ZWRpdC5vIGVudl9jb21tb24ubyBcCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2Jvb3RtLmMgYi9jb21tb24vY21kX2Jvb3RtLmMKaW5kZXggNzBjYTk5OS4uYTA1ODdkMCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9ib290bS5jCisrKyBiL2NvbW1vbi9jbWRfYm9vdG0uYwpAQCAtNzAsNiArNzAsMTAgQEAKICNlbmRpZgogc3RhdGljIHZvaWQgcHJpbnRfdHlwZSAoaW1hZ2VfaGVhZGVyX3QgKmhkcik7CiAKKyNpZmRlZiBfX0kzODZfXworaW1hZ2VfaGVhZGVyX3QgKmZha2VfaGVhZGVyKGltYWdlX2hlYWRlcl90ICpoZHIsIHZvaWQgKnB0ciwgaW50IHNpemUpOworI2VuZGlmCisKIC8qCiAgKiAgQ29udGludWUgYm9vdGluZyBhbiBPUyBpbWFnZTsgY2FsbGVyIGFscmVhZHkgaGFzOgogICogIC0gY29waWVkIGltYWdlIGhlYWRlciB0byBnbG9iYWwgdmFyaWFibGUgYGhlYWRlcicKQEAgLTg0LDcgKzg4LDcgQEAKIAkJCSAgdWxvbmcJKmxlbl9wdHIsCS8qIG11bHRpLWZpbGUgaW1hZ2UgbGVuZ3RoIHRhYmxlICovCiAJCQkgIGludAl2ZXJpZnkpOwkvKiBnZXRlbnYoInZlcmlmeSIpWzBdICE9ICduJyAqLwogCi0jaWZuZGVmIENPTkZJR19BUk0KKyNpZmRlZiBDT05GSUdfUFBDCiBzdGF0aWMgYm9vdF9vc19GY24gZG9fYm9vdG1fbGludXg7CiAjZWxzZQogZXh0ZXJuIGJvb3Rfb3NfRmNuIGRvX2Jvb3RtX2xpbnV4OwpAQCAtMTI4LDkgKzEzMiwyMSBAQAogCW1lbW1vdmUgKCZoZWFkZXIsIChjaGFyICopYWRkciwgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSk7CiAKIAlpZiAobnRvaGwoaGRyLT5paF9tYWdpYykgIT0gSUhfTUFHSUMpIHsKKyNpZmRlZiBfX0kzODZfXwkvKiBjb3JyZWN0IGltYWdlIGZvcm1hdCBub3QgaW1wbGVtZW50ZWQgeWV0IC0gZmFrZSBpdCAqLworCQlpZiAoZmFrZV9oZWFkZXIoaGRyLCAodm9pZCopYWRkciwgLTEpICE9IE5VTEwpIHsKKwkJCS8qIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBhZGRpdGlvbiBiZWxvdyAqLworCQkJYWRkciAtPSBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpOworCQkJLyogdHVybm9mIHZlcmlmeSwKKwkJCSAqIGZha2VfaGVhZGVyKCkgZG9lcyBub3QgZmFrZSB0aGUgZGF0YSBjcmMKKwkJCSAqLworCQkJdmVyaWZ5ID0gMDsKKwkJfSBlbHNlCisjZW5kaWYJLyogX19JMzg2X18gKi8KKwkgICAgewogCQlwcmludGYgKCJCYWQgTWFnaWMgTnVtYmVyXG4iKTsKIAkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CiAJCXJldHVybiAxOworCSAgICB9CiAJfQogCVNIT1dfQk9PVF9QUk9HUkVTUyAoMik7CiAKQEAgLTE0OCw3ICsxNjQsNyBAQAogCVNIT1dfQk9PVF9QUk9HUkVTUyAoMyk7CiAKIAkvKiBmb3IgbXVsdGktZmlsZSBpbWFnZXMgd2UgbmVlZCB0aGUgZGF0YSBwYXJ0LCB0b28gKi8KLQlwcmludF9pbWFnZV9oZHIgKChpbWFnZV9oZWFkZXJfdCAqKWFkZHIpOworCXByaW50X2ltYWdlX2hkciAoaGRyKTsKIAogCWRhdGEgPSBhZGRyICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KTsKIAlsZW4gID0gbnRvaGwoaGRyLT5paF9zaXplKTsKQEAgLTE2Niw4ICsxODIsMTcgQEAKIAogCWxlbl9wdHIgPSAodWxvbmcgKilkYXRhOwogCi0JaWYgKGhkci0+aWhfYXJjaCAhPSBJSF9DUFVfUFBDICYmIGhkci0+aWhfYXJjaCAhPSBJSF9DUFVfQVJNKSB7Ci0JCXByaW50ZiAoIlVuc3VwcG9ydGVkIEFyY2hpdGVjdHVyZVxuIik7CisjaWYgZGVmaW5lZChfX1BQQ19fKQorCWlmIChoZHItPmloX2FyY2ggIT0gSUhfQ1BVX1BQQykKKyNlbGlmIGRlZmluZWQoX19BUk1fXykKKwlpZiAoaGRyLT5paF9hcmNoICE9IElIX0NQVV9BUk0pCisjZWxpZiBkZWZpbmVkKF9fSTM4Nl9fKQorCWlmIChoZHItPmloX2FyY2ggIT0gSUhfQ1BVX0kzODYpCisjZWxzZQorIyBlcnJvciBVbmtub3duIENQVSB0eXBlCisjZW5kaWYKKwl7CisJCXByaW50ZiAoIlVuc3VwcG9ydGVkIEFyY2hpdGVjdHVyZSAweCV4XG4iLCBoZHItPmloX2FyY2gpOwogCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC00KTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMjAxLDcgKzIyNiw3IEBACiAKIAlzd2l0Y2ggKGhkci0+aWhfY29tcCkgewogCWNhc2UgSUhfQ09NUF9OT05FOgotCQlpZihoZHItPmloX2xvYWQgPT0gYWRkcikgeworCQlpZihudG9obChoZHItPmloX2xvYWQpID09IGFkZHIpIHsKIAkJCXByaW50ZiAoIiAgIFhJUCAlcyAuLi4gIiwgbmFtZSk7CiAJCX0gZWxzZSB7CiAjaWYgZGVmaW5lZChDT05GSUdfSFdfV0FUQ0hET0cpIHx8IGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQpAQCAtMjk0LDcgKzMxOSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNpZm5kZWYgQ09ORklHX0FSTQorI2lmZGVmIENPTkZJR19QUEMKIHN0YXRpYyB2b2lkCiBkb19ib290bV9saW51eCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsCiAJCWludAlhcmdjLCBjaGFyICphcmd2W10sCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2ZkYy5jIGIvY29tbW9uL2NtZF9mZGMuYwppbmRleCA4ZTZiNzM1Li5lNDViMzM2IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2ZkYy5jCisrKyBiL2NvbW1vbi9jbWRfZmRjLmMKQEAgLTUxLDcgKzUxLDcgQEAKICNpbmNsdWRlIDxydGMuaD4KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRDKQorI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GREMpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpKQogCiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTE5Miw3ICsxOTIsMTAgQEAKIC8qIHJlYWRzIGEgUmVnaXN0ZXIgb2YgdGhlIEZEQyAqLwogdW5zaWduZWQgY2hhciByZWFkX2ZkY19yZWcodW5zaWduZWQgaW50IGFkZHIpCiB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqdmFsID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoQ0ZHX0lTQV9JT19CQVNFX0FERFJFU1MgKyAoYWRkciAqIENGR19JU0FfSU9fU1RSSURFKSArIENGR19JU0FfSU9fT0ZGU0VUKTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICp2YWwgPQorCQkodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShDRkdfSVNBX0lPX0JBU0VfQUREUkVTUyArCisJCQkJCSAgIChhZGRyICogQ0ZHX0lTQV9JT19TVFJJREUpICsKKwkJCQkJICAgQ0ZHX0lTQV9JT19PRkZTRVQpOwogICAgICAgICAKIAlyZXR1cm4gdmFsIFswXTsKIH0KQEAgLTIwMCw3ICsyMDMsMTAgQEAKIC8qIHdyaXRlcyBhIFJlZ2lzdGVyIG9mIHRoZSBGREMgKi8KIHZvaWQgd3JpdGVfZmRjX3JlZyh1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgY2hhciB2YWwpCiB7Ci0gICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnRtcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsgKGFkZHIgKiBDRkdfSVNBX0lPX1NUUklERSkgKyBDRkdfSVNBX0lPX09GRlNFVCk7CisgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnRtcCA9CisJCSh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKENGR19JU0FfSU9fQkFTRV9BRERSRVNTICsKKwkJCQkJICAgKGFkZHIgKiBDRkdfSVNBX0lPX1NUUklERSkgKworCQkJCQkgICBDRkdfSVNBX0lPX09GRlNFVCk7CiAJdG1wWzBdPXZhbDsKIH0KIApAQCAtMjc5LDcgKzI4NSw4IEBACiAJaGVhZCA9IHNlY3QgLyBwRkctPnNlY3Q7IC8qIGhlYWQgbnIgKi8KIAlzZWN0ID0gIHNlY3QgJSBwRkctPnNlY3Q7IC8qIHJlbWFpbmluZyBibG9ja3MgKi8KIAlzZWN0Kys7IC8qIHNlY3RvcnMgYXJlIDEgYmFzZWQgKi8KLQlQUklOVEYoIkNtZCAweCUwMnggVHJhY2sgJWxkLCBIZWFkICVsZCwgU2VjdG9yICVsZCwgRHJpdmUgJWQgKGJsbnIgJWxkKVxuIixwQ01ELT5jbWRbMF0sdHJhY2ssaGVhZCxzZWN0LHBDTUQtPmRyaXZlLHBDTUQtPmJsbnIpOworCVBSSU5URigiQ21kIDB4JTAyeCBUcmFjayAlbGQsIEhlYWQgJWxkLCBTZWN0b3IgJWxkLCBEcml2ZSAlZCAoYmxuciAlbGQpXG4iLAorCQlwQ01ELT5jbWRbMF0sdHJhY2ssaGVhZCxzZWN0LHBDTUQtPmRyaXZlLHBDTUQtPmJsbnIpOwogCiAJaWYoaGVhZHw9MCkgeyAvKiBtYXggaGVhZHMgPSAyICovCiAJCXBDTUQtPmNtZFtEUklWRV09cENNRC0+ZHJpdmUgfCAweDA0OyAvKiBoZWFkIDEgKi8KQEAgLTU4OCw3ICs1OTUsNyBAQAogKiBzZXR1cCB0aGUgZmRjIGFjY29yZGluZyB0aGUgZGF0YXNoZWV0CiAqIGFzc3VtaW5nIGluIFBTMiBNb2RlCiAqLwotaW50IGZkY19zZXR1cChGRENfQ09NTUFORF9TVFJVQ1QgKnBDTUQsCUZEX0dFT19TVFJVQ1QgKnBGRykKK2ludCBmZGNfc2V0dXAoaW50IGRyaXZlLCBGRENfQ09NTUFORF9TVFJVQ1QgKnBDTUQsIEZEX0dFT19TVFJVQ1QgKnBGRykKIHsKIAogCWludCBpOwpAQCAtNjAxLDcgKzYwOCw3IEBACiAJZm9yKGk9MDsgaTwyNTU7IGkrKykgLyogdGhlbiB3ZSB3YWl0IHNvbWUgdGltZSAqLwogCQl1ZGVsYXkoNTAwKTsKIAkvKiB0aGVuLCB3ZSBjbGVhciB0aGUgcmVzZXQgaW4gdGhlIERPUiAqLwotCXBDTUQtPmRyaXZlPUNGR19GRENfRFJJVkVfTlVNQkVSOworCXBDTUQtPmRyaXZlPWRyaXZlOwogCXNlbGVjdF9mZGNfZHJpdmUocENNRCk7CiAJLyogaW5pdGlhbGl6ZSB0aGUgQ0NSICovCiAJd3JpdGVfZmRjX3JlZyhGRENfQ0NSLHBGRy0+cmF0ZSk7CkBAIC02MjEsOSArNjI4LDggQEAKIAkJCVBSSU5URigiU2Vuc2UgSW50ZXJydXB0IGZvciBkcml2ZSAlZCBmYWlsZWRcbiIsaSk7CiAJCX0KIAl9Ci0JLyogYXNzdW1pbmcgZHJpdmUgMCBmb3IgcmVzdCBvZiBjb25maWd1cmF0aW9uCi0JICogaXNzdWUgdGhlIGNvbmZpZ3VyZSBjb21tYW5kICovCi0JcENNRC0+ZHJpdmU9Q0ZHX0ZEQ19EUklWRV9OVU1CRVI7CisJLyogaXNzdWUgdGhlIGNvbmZpZ3VyZSBjb21tYW5kICovCisJcENNRC0+ZHJpdmU9ZHJpdmU7CiAJc2VsZWN0X2ZkY19kcml2ZShwQ01EKTsKIAlwQ01ELT5jbWRbQ09NTUFORF09RkRDX0NNRF9DT05GSUdVUkU7CiAJaWYoZmRjX2lzc3VlX2NtZChwQ01ELHBGRyk9PUZBTFNFKSB7CkBAIC02NDQsNyArNjUwLDc0IEBACiAJLyoJd3JpdGVfZmRjX3JlZyhGRENfRE9SLDB4MDQpOyAqLwogCXJldHVybiBUUlVFOwogfQorI2VuZGlmIC8qICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GREMpfHwoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKSkqLworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKworLyogTG93IGxldmVsIGZ1bmN0aW9ucyBmb3IgdGhlIEZsb3BweS1ET1MgbGF5ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogaW50IGZkY19mZG9zX2luaXQKKyogaW5pdGlhbGl6ZSB0aGUgRkRDIGxheWVyIAorKiAKKyovCitpbnQgZmRjX2Zkb3NfaW5pdCAoaW50IGRyaXZlKQoreworCUZEX0dFT19TVFJVQ1QgKnBGRyA9IChGRF9HRU9fU1RSVUNUICopZmxvcHB5X3R5cGU7CisJRkRDX0NPTU1BTkRfU1RSVUNUICpwQ01EID0gJmNtZDsKKyAgICAKKwkvKiBzZXR1cCBGREMgYW5kIHNjYW4gZm9yIGRyaXZlcyAgKi8KKwlpZihmZGNfc2V0dXAoZHJpdmUscENNRCxwRkcpPT1GQUxTRSkgeworCQlwcmludGYoIlxuKiogRXJyb3IgaW4gc2V0dXAgRkRDICoqXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZihmZGNfY2hlY2tfZHJpdmUocENNRCxwRkcpPT1GQUxTRSkgeworCQlwcmludGYoIlxuKiogRXJyb3IgaW4gY2hlY2tfZHJpdmVzICoqXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZigocENNRC0+ZmxhZ3MmKDE8PGRyaXZlKSk9PTApIHsKKwkJLyogZHJpdmUgbm90IGF2YWlsYWJsZSAqLworCQlwcmludGYoIlxuKiogRHJpdmUgJWQgbm90IGF2YWlsYWJsZSAqKlxuIixkcml2ZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYoKHBDTUQtPmZsYWdzJigweDEwPDxkcml2ZSkpPT0wKSB7CisJCS8qIG5vIGRpc2sgaW5zZXJ0ZWQgKi8KKwkJcHJpbnRmKCJcbioqIE5vIGRpc2sgaW5zZXJ0ZWQgaW4gZHJpdmUgJWQgKipcbiIsZHJpdmUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIG9rLCB3ZSBoYXZlIGEgdmFsaWQgc291cmNlICovCisJcENNRC0+ZHJpdmU9ZHJpdmU7CiAKKwkvKiByZWFkIGZpcnN0IGJsb2NrICovCisJcENNRC0+Ymxucj0wOworICAgICAgICByZXR1cm4gVFJVRTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBpbnQgZmRjX2Zkb3Nfc2VlaworKiBwYXJhbWV0ZXIgaXMgYSBibG9jayBudW1iZXIgCisqLworaW50IGZkY19mZG9zX3NlZWsgKGludCB3aGVyZSkKK3sKKwlGRF9HRU9fU1RSVUNUICpwRkcgPSAoRkRfR0VPX1NUUlVDVCAqKWZsb3BweV90eXBlOworCUZEQ19DT01NQU5EX1NUUlVDVCAqcENNRCA9ICZjbWQ7CisKKyAgICAgICAgcENNRCAtPiBibG5yID0gd2hlcmUgOworICAgICAgICByZXR1cm4gKGZkY19zZWVrIChwQ01ELCBwRkcpKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBpbnQgZmRjX2Zkb3NfcmVhZAorKiAgdGhlIGxlbmd0aCBpcyBpbiBibG9jayBudW1iZXIKKyovCitpbnQgZmRjX2Zkb3NfcmVhZCAodm9pZCAqYnVmZmVyLCBpbnQgbGVuKQoreworCUZEX0dFT19TVFJVQ1QgKnBGRyA9IChGRF9HRU9fU1RSVUNUICopZmxvcHB5X3R5cGU7CisJRkRDX0NPTU1BTkRfU1RSVUNUICpwQ01EID0gJmNtZDsKKworICAgICAgICByZXR1cm4gKGZkY19yZWFkX2RhdGEgKGJ1ZmZlciwgbGVuLCBwQ01ELCBwRkcpKTsKK30KKyNlbmRpZiAgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQykKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBtYWluIHJvdXRpbmUgZG9fZmRjYm9vdAogICovCkBAIC02NzcsNyArNzUwLDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogCS8qIHNldHVwIEZEQyBhbmQgc2NhbiBmb3IgZHJpdmVzICAqLwotCWlmKGZkY19zZXR1cChwQ01ELHBGRyk9PUZBTFNFKSB7CisJaWYoZmRjX3NldHVwKGJvb3RfZHJpdmUscENNRCxwRkcpPT1GQUxTRSkgewogCQlwcmludGYoIlxuKiogRXJyb3IgaW4gc2V0dXAgRkRDICoqXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9mZG9zLmMgYi9jb21tb24vY21kX2Zkb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjNmNDE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2NtZF9mZG9zLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgorICogUGllcnJlIEFVQkVSVCAgcC5hdWJlcnRAc3RhdWJsaS5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogRG9zIGZsb3BweSBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxmZGMuaD4KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRvX2Zkb3Nib290IC0tIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgZG9fZmRvc2Jvb3QoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICplcDsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgcmNvZGUgPSAwOworICAgIGNoYXIgYnVmIFsxMF07CisgICAgaW50IGRyaXZlID0gQ0ZHX0ZEQ19EUklWRV9OVU1CRVI7CisgICAgCisgICAgLyogcHJlLXNldCBsb2FkX2FkZHIgKi8KKyAgICBpZiAoKGVwID0gZ2V0ZW52KCJsb2FkYWRkciIpKSAhPSBOVUxMKSB7CisgICAgICAgIGxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGVwLCBOVUxMLCAxNik7CisgICAgfQorCisgICAgLyogcHJlLXNldCBCb290IGZpbGUgbmFtZSAqLworICAgIGlmICgobmFtZSA9IGdldGVudigiYm9vdGZpbGUiKSkgPT0gTlVMTCkgeworICAgICAgICBuYW1lID0gInBJbWFnZSI7CisgICAgfQorCisgICAgc3dpdGNoIChhcmdjKSB7CisgICAgY2FzZSAxOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisJLyogb25seSBvbmUgYXJnIC0gYWNjZXB0IHR3byBmb3JtczoKKyAgICAgICAgICoganVzdCBsb2FkIGFkZHJlc3MsIG9yIGp1c3QgYm9vdCBmaWxlIG5hbWUuCisgICAgICAgICAqIFRoZSBsYXR0ZXIgZm9ybSBtdXN0IGJlIHdyaXR0ZW4gImZpbGVuYW1lIiBoZXJlLgorICAgICAgICAgKi8gICAgICAgIAorICAgICAgICBpZiAoYXJndlsxXVswXSA9PSAnIicpIHsJLyoganVzdCBib290IGZpbGVuYW1lICovCisgICAgICAgICAgICBuYW1lID0gYXJndiBbMV07CisgICAgICAgIH0gZWxzZSB7CQkJLyogbG9hZCBhZGRyZXNzCSovCisgICAgICAgICAgICBsb2FkX2FkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBsb2FkX2FkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisgICAgICAgIG5hbWUgPSBhcmd2IFsyXTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogSW5pdCBwaHlzaWNhbCBsYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCFmZGNfZmRvc19pbml0IChkcml2ZSkpIHsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICAgIAorICAgIC8qIE9wZW4gZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChkb3Nfb3BlbiAobmFtZSkgPCAwKSB7CisgICAgICAgIHByaW50ZiAoIlVuYWJsZSB0byBvcGVuICVzXG4iLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICgoc2l6ZSA9IGRvc19yZWFkIChsb2FkX2FkZHIpKSA8IDApIHsKKyAgICAgICAgcHJpbnRmICgiYm9vdCBlcnJvclxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBmbHVzaF9jYWNoZSAobG9hZF9hZGRyLCBzaXplKTsKKworICAgIHNwcmludGYoYnVmLCAiJXgiLCBzaXplKTsKKyAgICBzZXRlbnYoImZpbGVzaXplIiwgYnVmKTsKKworICAgIHByaW50ZigiRmxvcHB5IERPUyBsb2FkIGNvbXBsZXRlOiAlZCBieXRlcyBsb2FkZWQgdG8gMHglbHhcbiIsCisgICAgICAgICAgIHNpemUsIGxvYWRfYWRkcik7CisgICAgCisgICAgLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIGF0dGVtcHQgYW4gYXV0by1zdGFydCAqLworICAgIGlmICgoKGVwID0gZ2V0ZW52KCJhdXRvc3RhcnQiKSkgIT0gTlVMTCkgJiYgKHN0cmNtcChlcCwieWVzIikgPT0gMCkpIHsKKyAgICAgICAgY2hhciAqbG9jYWxfYXJnc1syXTsKKyAgICAgICAgZXh0ZXJuIGludCBkb19ib290bSAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CisgICAgICAgIGxvY2FsX2FyZ3NbMF0gPSBhcmd2WzBdOworICAgICAgICBsb2NhbF9hcmdzWzFdID0gTlVMTDsKKyAgICAgICAgcHJpbnRmICgiQXV0b21hdGljIGJvb3Qgb2YgaW1hZ2UgYXQgYWRkciAweCUwOGxYIC4uLlxuIiwgbG9hZF9hZGRyKTsKKyAgICAgICAgcmNvZGUgPSBkb19ib290bSAoY21kdHAsIDAsIDEsIGxvY2FsX2FyZ3MpOworICAgIH0KKyAgICByZXR1cm4gcmNvZGU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRvX2Zkb3NscyAtLSAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IGRvX2Zkb3NscyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBjaGFyICpwYXRoID0gIiI7CisgICAgaW50IGRyaXZlID0gQ0ZHX0ZEQ19EUklWRV9OVU1CRVI7CisgICAgCisgICAgc3dpdGNoIChhcmdjKSB7CisgICAgY2FzZSAxOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHBhdGggPSBhcmd2IFsxXTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogSW5pdCBwaHlzaWNhbCBsYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCFmZGNfZmRvc19pbml0IChkcml2ZSkpIHsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICAgIC8qIE9wZW4gZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChkb3Nfb3BlbiAocGF0aCkgPCAwKSB7CisgICAgICAgIHByaW50ZiAoIlVuYWJsZSB0byBvcGVuICVzXG4iLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAoZG9zX2RpciAoKSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9pZGUuYyBiL2NvbW1vbi9jbWRfaWRlLmMKaW5kZXggOWNiZmUxYi4uZTUxNGNmNyAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9pZGUuYworKysgYi9jb21tb24vY21kX2lkZS5jCkBAIC00NCw2ICs0NCw5IEBACiAjaWZkZWYgQ09ORklHX1NUQVRVU19MRUQKICMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgogI2VuZGlmCisjaWZkZWYgX19JMzg2X18KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwogIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+CkBAIC0xMTQsNyArMTE3LDkgQEAKICNlbmRpZgogfTsKIAorI2lmZGVmIF9fUFBDX18KICNkZWZpbmUJQVRBX0NVUlJfQkFTRShkZXYpCShDRkdfQVRBX0JBU0VfQUREUitpZGVfYnVzX29mZnNldFtJREVfQlVTKGRldildKQorI2VuZGlmCiAKIHN0YXRpYyBpbnQJICAgIGlkZV9idXNfb2tbQ0ZHX0lERV9NQVhCVVNdOwogCkBAIC0xNDIsOSArMTQ3LDExIEBACiAKICNkZWZpbmUgSURFX1NQSU5fVVBfVElNRV9PVVQgNTAwMCAvKiA1IHNlYyBzcGluLXVwIHRpbWVvdXQgKi8KIAotc3RhdGljIHZvaWQgX19pbmxpbmVfXyBvdXRiKGludCBkZXYsIGludCBwb3J0LCB1bnNpZ25lZCBjaGFyIHZhbCk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBfX2lubGluZV9fIGluYihpbnQgZGV2LCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGlkZV9vdXRiKGludCBkZXYsIGludCBwb3J0LCB1bnNpZ25lZCBjaGFyIHZhbCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBfX2lubGluZV9fIGlkZV9pbmIoaW50IGRldiwgaW50IHBvcnQpOworI2lmZGVmIF9fUFBDX18KIHN0YXRpYyB2b2lkIGlucHV0X3N3YXBfZGF0YShpbnQgZGV2LCB1bG9uZyAqc2VjdF9idWYsIGludCB3b3Jkcyk7CisjZW5kaWYKIHN0YXRpYyB2b2lkIGlucHV0X2RhdGEoaW50IGRldiwgdWxvbmcgKnNlY3RfYnVmLCBpbnQgd29yZHMpOwogc3RhdGljIHZvaWQgb3V0cHV0X2RhdGEoaW50IGRldiwgdWxvbmcgKnNlY3RfYnVmLCBpbnQgd29yZHMpOwogc3RhdGljIHZvaWQgaWRlbnRfY3B5ICh1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGludCBsZW4pOwpAQCAtNTE3LDE0ICs1MjQsMTQgQEAKIAkJLyogU2VsZWN0IGRldmljZQogCQkgKi8KIAkJdWRlbGF5ICgxMDAwMDApOwkJLyogMTAwIG1zICovCi0JCW91dGIgKGRldiwgQVRBX0RFVl9IRCwgQVRBX0xCQSB8IEFUQV9ERVZJQ0UoZGV2KSk7CisJCWlkZV9vdXRiIChkZXYsIEFUQV9ERVZfSEQsIEFUQV9MQkEgfCBBVEFfREVWSUNFKGRldikpOwogCQl1ZGVsYXkgKDEwMDAwMCk7CQkvKiAxMDAgbXMgKi8KIAogCQlpID0gMDsKIAkJZG8gewogCQkJdWRlbGF5ICgxMDAwMCk7CQkvKiAxMCBtcyAqLwogCi0JCQljID0gaW5iIChkZXYsIEFUQV9TVEFUVVMpOworCQkJYyA9IGlkZV9pbmIgKGRldiwgQVRBX1NUQVRVUyk7CiAJCQlpKys7CiAJCQlpZiAoaSA+IChBVEFfUkVTRVRfVElNRSAqIDEwMCkpIHsKIAkJCQlwdXRzICgiKiogVGltZW91dCAqKlxuIik7CkBAIC02NzksMzAgKzY4Niw0OCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKyNpZmRlZiBfX1BQQ19fCiBzdGF0aWMgdm9pZCBfX2lubGluZV9fCi1vdXRiKGludCBkZXYsIGludCBwb3J0LCB1bnNpZ25lZCBjaGFyIHZhbCkKK2lkZV9vdXRiKGludCBkZXYsIGludCBwb3J0LCB1bnNpZ25lZCBjaGFyIHZhbCkKIHsKIAkvKiBFbnN1cmUgSS9PIG9wZXJhdGlvbnMgY29tcGxldGUgKi8KIAlfX2FzbV9fIHZvbGF0aWxlKCJlaWVpbyIpOwogCSooKHVjaGFyICopKEFUQV9DVVJSX0JBU0UoZGV2KStwb3J0KSkgPSB2YWw7CiAjaWYgMAotCXByaW50ZiAoIk9VVEI6IDB4JTA4bHggPD09IDB4JTAyeFxuIiwgQVRBX0NVUlJfQkFTRShkZXYpK3BvcnQsIHZhbCk7CisJcHJpbnRmICgiaWRlX291dGI6IDB4JTA4bHggPD09IDB4JTAyeFxuIiwgQVRBX0NVUlJfQkFTRShkZXYpK3BvcnQsIHZhbCk7CiAjZW5kaWYKIH0KKyNlbHNlCS8qICEgX19QUENfXyAqLworc3RhdGljIHZvaWQgX19pbmxpbmVfXworaWRlX291dGIoaW50IGRldiwgaW50IHBvcnQsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCW91dGIodmFsLCBwb3J0KTsKK30KKyNlbmRpZgkvKiBfX1BQQ19fICovCisKIAorI2lmZGVmIF9fUFBDX18KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIF9faW5saW5lX18KLWluYihpbnQgZGV2LCBpbnQgcG9ydCkKK2lkZV9pbmIoaW50IGRldiwgaW50IHBvcnQpCiB7CiAJdWNoYXIgdmFsOwogCS8qIEVuc3VyZSBJL08gb3BlcmF0aW9ucyBjb21wbGV0ZSAqLwogCV9fYXNtX18gdm9sYXRpbGUoImVpZWlvIik7CiAJdmFsID0gKigodWNoYXIgKikoQVRBX0NVUlJfQkFTRShkZXYpK3BvcnQpKTsKICNpZiAwCi0JcHJpbnRmICgiSU5COiAweCUwOGx4ID09PiAweCUwMnhcbiIsIEFUQV9DVVJSX0JBU0UoZGV2KStwb3J0LCB2YWwpOworCXByaW50ZiAoImlkZV9pbmI6IDB4JTA4bHggPT0+IDB4JTAyeFxuIiwgQVRBX0NVUlJfQkFTRShkZXYpK3BvcnQsIHZhbCk7CiAjZW5kaWYKIAlyZXR1cm4gKHZhbCk7CiB9CisjZWxzZQkvKiAhIF9fUFBDX18gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIF9faW5saW5lX18KK2lkZV9pbmIoaW50IGRldiwgaW50IHBvcnQpCit7CisJcmV0dXJuIGluYihwb3J0KTsKK30KKyNlbmRpZgkvKiBfX1BQQ19fICovCiAKKyNpZmRlZiBfX1BQQ19fCiBfX2lubGluZV9fIHVuc2lnbmVkIGxkX2xlMTYoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmFkZHIpCiB7CiAJdW5zaWduZWQgdmFsOwpAQCAtNzIyLDcgKzc0NywxNCBAQAogCQkqZGJ1ZisrID0gbGRfbGUxNihwYnVmKTsKIAl9CiB9CisjZWxzZQkvKiAhIF9fUFBDX18gKi8KKyNkZWZpbmUgaW5wdXRfc3dhcF9kYXRhKHgseSx6KSBpbnB1dF9kYXRhKHgseSx6KQorI2VuZGlmCS8qIF9fUFBDX18gKi8KKworCisKIAorI2lmZGVmIF9fUFBDX18KIHN0YXRpYyB2b2lkCiBvdXRwdXRfZGF0YShpbnQgZGV2LCB1bG9uZyAqc2VjdF9idWYsIGludCB3b3JkcykKIHsKQEAgLTczOCw3ICs3NzAsMTUgQEAKIAkJKnBidWYgPSAqZGJ1ZisrOwogCX0KIH0KKyNlbHNlCS8qICEgX19QUENfXyAqLworc3RhdGljIHZvaWQKK291dHB1dF9kYXRhKGludCBkZXYsIHVsb25nICpzZWN0X2J1ZiwgaW50IHdvcmRzKQoreworCW91dHN3KEFUQV9EQVRBX1JFRywgc2VjdF9idWYsIHdvcmRzPDwxKTsKK30KKyNlbmRpZgkvKiBfX1BQQ19fICovCiAKKyNpZmRlZiBfX1BQQ19fCiBzdGF0aWMgdm9pZAogaW5wdXRfZGF0YShpbnQgZGV2LCB1bG9uZyAqc2VjdF9idWYsIGludCB3b3JkcykKIHsKQEAgLTc1NCw2ICs3OTQsMTQgQEAKIAkJKmRidWYrKyA9ICpwYnVmOwogCX0KIH0KKyNlbHNlCS8qICEgX19QUENfXyAqLworc3RhdGljIHZvaWQKK2lucHV0X2RhdGEoaW50IGRldiwgdWxvbmcgKnNlY3RfYnVmLCBpbnQgd29yZHMpCit7CisJaW5zdyhBVEFfREFUQV9SRUcsIHNlY3RfYnVmLCB3b3JkcyA8PCAxKTsKK30KKworI2VuZGlmCS8qIF9fUFBDX18gKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCkBAIC03NzMsMTkgKzgyMSwxOSBAQAogCWlkZV9sZWQgKERFVklDRV9MRUQoZGV2aWNlKSwgMSk7CS8qIExFRCBvbgkqLwogCS8qIFNlbGVjdCBkZXZpY2UKIAkgKi8KLQlvdXRiIChkZXZpY2UsIEFUQV9ERVZfSEQsIEFUQV9MQkEgfCBBVEFfREVWSUNFKGRldmljZSkpOworCWlkZV9vdXRiIChkZXZpY2UsIEFUQV9ERVZfSEQsIEFUQV9MQkEgfCBBVEFfREVWSUNFKGRldmljZSkpOwogCWRldl9kZXNjLT5pZl90eXBlPUlGX1RZUEVfSURFOwogI2lmZGVmIENPTkZJR19BVEFQSQogCS8qIGNoZWNrIHNpZ25hdHVyZSAqLwotCWlmICgoaW5iKGRldmljZSxBVEFfU0VDVF9DTlQpPT0weDAxKSAmJgotCQkgKGluYihkZXZpY2UsQVRBX1NFQ1RfTlVNKT09MHgwMSkgJiYKLQkJIChpbmIoZGV2aWNlLEFUQV9DWUxfTE9XKT09MHgxNCkgJiYKLQkJIChpbmIoZGV2aWNlLEFUQV9DWUxfSElHSCk9PTB4RUIpKSB7CisJaWYgKChpZGVfaW5iKGRldmljZSxBVEFfU0VDVF9DTlQpID09IDB4MDEpICYmCisJCSAoaWRlX2luYihkZXZpY2UsQVRBX1NFQ1RfTlVNKSA9PSAweDAxKSAmJgorCQkgKGlkZV9pbmIoZGV2aWNlLEFUQV9DWUxfTE9XKSAgPT0gMHgxNCkgJiYKKwkJIChpZGVfaW5iKGRldmljZSxBVEFfQ1lMX0hJR0gpID09IDB4RUIpKSB7CiAJCS8qIEFUQVBJIFNpZ25hdHVyZSBmb3VuZCAqLwogCQlkZXZfZGVzYy0+aWZfdHlwZT1JRl9UWVBFX0FUQVBJOwogCQkvKiBTdGFydCBJZGVudCBDb21tYW5kCiAJCSAqLwotCQlvdXRiIChkZXZpY2UsIEFUQV9DT01NQU5ELCBBVEFQSV9DTURfSURFTlQpOworCQlpZGVfb3V0YiAoZGV2aWNlLCBBVEFfQ09NTUFORCwgQVRBUElfQ01EX0lERU5UKTsKIAkJLyoKIAkJICogV2FpdCBmb3IgY29tcGxldGlvbiAtIEFUQVBJIGRldmljZXMgbmVlZCBtb3JlIHRpbWUKIAkJICogdG8gYmVjb21lIHJlYWR5CkBAIC03OTcsNyArODQ1LDcgQEAKIAl7CiAJCS8qIFN0YXJ0IElkZW50IENvbW1hbmQKIAkJICovCi0JCW91dGIgKGRldmljZSwgQVRBX0NPTU1BTkQsIEFUQV9DTURfSURFTlQpOworCQlpZGVfb3V0YiAoZGV2aWNlLCBBVEFfQ09NTUFORCwgQVRBX0NNRF9JREVOVCk7CiAKIAkJLyogV2FpdCBmb3IgY29tcGxldGlvbgogCQkgKi8KQEAgLTg2NywxNSArOTE1LDE1IEBACiAjaWYgMCAJLyogb25seSB1c2VkIHRvIHRlc3QgdGhlIHBvd2Vyc2F2aW5nIG1vZGUsCiAJICogaWYgZW5hYmxlZCwgdGhlIGRyaXZlIGdvZXMgYWZ0ZXIgNSBzZWMKIAkgKiBpbiBzdGFuZGJ5IG1vZGUgKi8KLQlvdXRiIChkZXZpY2UsIEFUQV9ERVZfSEQsIEFUQV9MQkEgfCBBVEFfREVWSUNFKGRldmljZSkpOworCWlkZV9vdXRiIChkZXZpY2UsIEFUQV9ERVZfSEQsIEFUQV9MQkEgfCBBVEFfREVWSUNFKGRldmljZSkpOwogCWMgPSBpZGVfd2FpdCAoZGV2aWNlLCBJREVfVElNRV9PVVQpOwotCW91dGIgKGRldmljZSwgQVRBX1NFQ1RfQ05ULCAxKTsKLQlvdXRiIChkZXZpY2UsIEFUQV9MQkFfTE9XLCAgMCk7Ci0Jb3V0YiAoZGV2aWNlLCBBVEFfTEJBX01JRCwgIDApOwotCW91dGIgKGRldmljZSwgQVRBX0xCQV9ISUdILCAwKTsKLQlvdXRiIChkZXZpY2UsIEFUQV9ERVZfSEQsICAgQVRBX0xCQQkJfAorCWlkZV9vdXRiIChkZXZpY2UsIEFUQV9TRUNUX0NOVCwgMSk7CisJaWRlX291dGIgKGRldmljZSwgQVRBX0xCQV9MT1csICAwKTsKKwlpZGVfb3V0YiAoZGV2aWNlLCBBVEFfTEJBX01JRCwgIDApOworCWlkZV9vdXRiIChkZXZpY2UsIEFUQV9MQkFfSElHSCwgMCk7CisJaWRlX291dGIgKGRldmljZSwgQVRBX0RFVl9IRCwgICBBVEFfTEJBCQl8CiAJCQkJICAgIEFUQV9ERVZJQ0UoZGV2aWNlKSk7Ci0Jb3V0YiAoZGV2aWNlLCBBVEFfQ09NTUFORCwgIDB4ZTMpOworCWlkZV9vdXRiIChkZXZpY2UsIEFUQV9DT01NQU5ELCAgMHhlMyk7CiAJdWRlbGF5ICg1MCk7CiAJYyA9IGlkZV93YWl0IChkZXZpY2UsIElERV9USU1FX09VVCk7CS8qIGNhbid0IHRha2Ugb3ZlciA1MDAgbXMgKi8KICNlbmRpZgpAQCAtODk3LDcgKzk0NSw3IEBACiAKIAkvKiBTZWxlY3QgZGV2aWNlCiAJICovCi0Jb3V0YiAoZGV2aWNlLCBBVEFfREVWX0hELCBBVEFfTEJBIHwgQVRBX0RFVklDRShkZXZpY2UpKTsKKwlpZGVfb3V0YiAoZGV2aWNlLCBBVEFfREVWX0hELCBBVEFfTEJBIHwgQVRBX0RFVklDRShkZXZpY2UpKTsKIAljID0gaWRlX3dhaXQgKGRldmljZSwgSURFX1RJTUVfT1VUKTsKIAogCWlmIChjICYgQVRBX1NUQVRfQlVTWSkgewpAQCAtOTA3LDcgKzk1NSw3IEBACiAKIAkvKiBmaXJzdCBjaGVjayBpZiB0aGUgZHJpdmUgaXMgaW4gUG93ZXJzYXZpbmcgbW9kZSwgaWYgeWVzLAogCSAqIGluY3JlYXNlIHRoZSB0aW1lb3V0IHZhbHVlICovCi0Jb3V0YiAoZGV2aWNlLCBBVEFfQ09NTUFORCwgIEFUQV9DTURfQ0hLX1BXUik7CisJaWRlX291dGIgKGRldmljZSwgQVRBX0NPTU1BTkQsICBBVEFfQ01EX0NIS19QV1IpOwogCXVkZWxheSAoNTApOwogCiAJYyA9IGlkZV93YWl0IChkZXZpY2UsIElERV9USU1FX09VVCk7CS8qIGNhbid0IHRha2Ugb3ZlciA1MDAgbXMgKi8KQEAgLTkxOSw3ICs5NjcsNyBAQAogCWlmICgoYyAmIEFUQV9TVEFUX0VSUikgPT0gQVRBX1NUQVRfRVJSKSB7CiAJCXByaW50ZiAoIk5vIFBvd2Vyc2F2aW5nIG1vZGUgJVhcbiIsIGMpOwogCX0gZWxzZSB7Ci0JCWMgPSBpbmIoZGV2aWNlLEFUQV9TRUNUX0NOVCk7CisJCWMgPSBpZGVfaW5iKGRldmljZSxBVEFfU0VDVF9DTlQpOwogCQlQUklOVEYoIlBvd2Vyc2F2aW5nICUwMlhcbiIsYyk7CiAJCWlmKGM9PTApCiAJCQlwd3JzYXZlPTE7CkBAIC05MzUsMTQgKzk4MywxNCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlvdXRiIChkZXZpY2UsIEFUQV9TRUNUX0NOVCwgMSk7Ci0JCW91dGIgKGRldmljZSwgQVRBX0xCQV9MT1csICAoYmxrbnIgPj4gIDApICYgMHhGRik7Ci0JCW91dGIgKGRldmljZSwgQVRBX0xCQV9NSUQsICAoYmxrbnIgPj4gIDgpICYgMHhGRik7Ci0JCW91dGIgKGRldmljZSwgQVRBX0xCQV9ISUdILCAoYmxrbnIgPj4gMTYpICYgMHhGRik7Ci0JCW91dGIgKGRldmljZSwgQVRBX0RFVl9IRCwgICBBVEFfTEJBCQl8CisJCWlkZV9vdXRiIChkZXZpY2UsIEFUQV9TRUNUX0NOVCwgMSk7CisJCWlkZV9vdXRiIChkZXZpY2UsIEFUQV9MQkFfTE9XLCAgKGJsa25yID4+ICAwKSAmIDB4RkYpOworCQlpZGVfb3V0YiAoZGV2aWNlLCBBVEFfTEJBX01JRCwgIChibGtuciA+PiAgOCkgJiAweEZGKTsKKwkJaWRlX291dGIgKGRldmljZSwgQVRBX0xCQV9ISUdILCAoYmxrbnIgPj4gMTYpICYgMHhGRik7CisJCWlkZV9vdXRiIChkZXZpY2UsIEFUQV9ERVZfSEQsICAgQVRBX0xCQQkJfAogCQkJCQkgICAgQVRBX0RFVklDRShkZXZpY2UpCXwKIAkJCQkJICAgICgoYmxrbnIgPj4gMjQpICYgMHhGKSApOwotCQlvdXRiIChkZXZpY2UsIEFUQV9DT01NQU5ELCAgQVRBX0NNRF9SRUFEKTsKKwkJaWRlX291dGIgKGRldmljZSwgQVRBX0NPTU1BTkQsICBBVEFfQ01EX1JFQUQpOwogCiAJCXVkZWxheSAoNTApOwogCkBAIC05NjAsNyArMTAwOCw3IEBACiAJCX0KIAogCQlpbnB1dF9kYXRhIChkZXZpY2UsIGJ1ZmZlciwgQVRBX1NFQ1RPUldPUkRTKTsKLQkJKHZvaWQpIGluYiAoZGV2aWNlLCBBVEFfU1RBVFVTKTsJLyogY2xlYXIgSVJRICovCisJCSh2b2lkKSBpZGVfaW5iIChkZXZpY2UsIEFUQV9TVEFUVVMpOwkvKiBjbGVhciBJUlEgKi8KIAogCQkrK247CiAJCSsrYmxrbnI7CkBAIC05ODMsNyArMTAzMSw3IEBACiAKIAkvKiBTZWxlY3QgZGV2aWNlCiAJICovCi0Jb3V0YiAoZGV2aWNlLCBBVEFfREVWX0hELCBBVEFfTEJBIHwgQVRBX0RFVklDRShkZXZpY2UpKTsKKwlpZGVfb3V0YiAoZGV2aWNlLCBBVEFfREVWX0hELCBBVEFfTEJBIHwgQVRBX0RFVklDRShkZXZpY2UpKTsKIAogCXdoaWxlIChibGtjbnQtLSA+IDApIHsKIApAQCAtOTk0LDE0ICsxMDQyLDE0IEBACiAJCQlnb3RvIFdSX09VVDsKIAkJfQogCi0JCW91dGIgKGRldmljZSwgQVRBX1NFQ1RfQ05ULCAxKTsKLQkJb3V0YiAoZGV2aWNlLCBBVEFfTEJBX0xPVywgIChibGtuciA+PiAgMCkgJiAweEZGKTsKLQkJb3V0YiAoZGV2aWNlLCBBVEFfTEJBX01JRCwgIChibGtuciA+PiAgOCkgJiAweEZGKTsKLQkJb3V0YiAoZGV2aWNlLCBBVEFfTEJBX0hJR0gsIChibGtuciA+PiAxNikgJiAweEZGKTsKLQkJb3V0YiAoZGV2aWNlLCBBVEFfREVWX0hELCAgIEFUQV9MQkEJCXwKKwkJaWRlX291dGIgKGRldmljZSwgQVRBX1NFQ1RfQ05ULCAxKTsKKwkJaWRlX291dGIgKGRldmljZSwgQVRBX0xCQV9MT1csICAoYmxrbnIgPj4gIDApICYgMHhGRik7CisJCWlkZV9vdXRiIChkZXZpY2UsIEFUQV9MQkFfTUlELCAgKGJsa25yID4+ICA4KSAmIDB4RkYpOworCQlpZGVfb3V0YiAoZGV2aWNlLCBBVEFfTEJBX0hJR0gsIChibGtuciA+PiAxNikgJiAweEZGKTsKKwkJaWRlX291dGIgKGRldmljZSwgQVRBX0RFVl9IRCwgICBBVEFfTEJBCQl8CiAJCQkJCSAgICBBVEFfREVWSUNFKGRldmljZSkJfAogCQkJCQkgICAgKChibGtuciA+PiAyNCkgJiAweEYpICk7Ci0JCW91dGIgKGRldmljZSwgQVRBX0NPTU1BTkQsICBBVEFfQ01EX1dSSVRFKTsKKwkJaWRlX291dGIgKGRldmljZSwgQVRBX0NPTU1BTkQsICBBVEFfQ01EX1dSSVRFKTsKIAogCQl1ZGVsYXkgKDUwKTsKIApAQCAtMTAxNCw3ICsxMDYyLDcgQEAKIAkJfQogCiAJCW91dHB1dF9kYXRhIChkZXZpY2UsIGJ1ZmZlciwgQVRBX1NFQ1RPUldPUkRTKTsKLQkJYyA9IGluYiAoZGV2aWNlLCBBVEFfU1RBVFVTKTsJLyogY2xlYXIgSVJRICovCisJCWMgPSBpZGVfaW5iIChkZXZpY2UsIEFUQV9TVEFUVVMpOwkvKiBjbGVhciBJUlEgKi8KIAkJKytuOwogCQkrK2Jsa25yOwogCQlidWZmZXIgKz0gQVRBX1NFQ1RPUldPUkRTOwpAQCAtMTA2Myw3ICsxMTExLDcgQEAKIAl1bG9uZyBkZWxheSA9IDEwICogdDsJCS8qIHBvbGwgZXZlcnkgMTAwIHVzICovCiAJdWNoYXIgYzsKIAotCXdoaWxlICgoYyA9IGluYihkZXYsIEFUQV9TVEFUVVMpKSAmIEFUQV9TVEFUX0JVU1kpIHsKKwl3aGlsZSAoKGMgPSBpZGVfaW5iKGRldiwgQVRBX1NUQVRVUykpICYgQVRBX1NUQVRfQlVTWSkgewogCQl1ZGVsYXkgKDEwMCk7CiAJCWlmIChkZWxheS0tID09IDApIHsKIAkJCWJyZWFrOwpAQCAtMTE4OCw2ICsxMjM2LDcgQEAKICNkZWZpbmUgQVRfUFJJTlRGKGZtdCxhcmdzLi4uKQogI2VuZGlmCiAKKyNpZmRlZiBfX1BQQ19fCiAvKiBzaW5jZSBBVEFQSSBtYXkgdXNlIGNvbW1hbmRzIHdpdGggbm90IDQgYnl0ZXMgYWxsaWduZWQgbGVuZ3RoCiAgKiB3ZSBoYXZlIG91ciBvd24gdHJhbnNmZXIgZnVuY3Rpb25zLCAyIGJ5dGVzIGFsbGlnbmVkICovCiBzdGF0aWMgdm9pZApAQCAtMTIxOCw2ICsxMjY3LDIyIEBACiAJfQogfQogCisjZWxzZQkvKiAhIF9fUFBDX18gKi8KK3N0YXRpYyB2b2lkCitvdXRwdXRfZGF0YV9zaG9ydHMoaW50IGRldiwgdXNob3J0ICpzZWN0X2J1ZiwgaW50IHNob3J0cykKK3sKKwlvdXRzdyhBVEFfREFUQV9SRUcsIHNlY3RfYnVmLCBzaG9ydHMpOworfQorCisKK3N0YXRpYyB2b2lkCitpbnB1dF9kYXRhX3Nob3J0cyhpbnQgZGV2LCB1c2hvcnQgKnNlY3RfYnVmLCBpbnQgc2hvcnRzKQoreworCWluc3coQVRBX0RBVEFfUkVHLCBzZWN0X2J1Ziwgc2hvcnRzKTsKK30KKworI2VuZGlmCS8qIF9fUFBDX18gKi8KKwogLyoKICAqIFdhaXQgdW50aWwgKFN0YXR1cyAmIG1hc2spID09IHJlcywgb3IgdGltZW91dCAoaW4gbXMpCiAgKiBSZXR1cm4gbGFzdCBzdGF0dXMKQEAgLTEyMjksOSArMTI5NCw4IEBACiAJdWxvbmcgZGVsYXkgPSAxMCAqIHQ7CQkvKiBwb2xsIGV2ZXJ5IDEwMCB1cyAqLwogCXVjaGFyIGM7CiAKLQljID0gaW5iKGRldixBVEFfREVWX0NUTCk7IC8qIHByZXZlbnRzIHRvIHJlYWQgdGhlIHN0YXR1cyBiZWZvcmUgdmFsaWQgKi8KLQl3aGlsZSAoKChjID0gaW5iKGRldiwgQVRBX1NUQVRVUykpICYgbWFzaykKLQkJCSE9IHJlcykgeworCWMgPSBpZGVfaW5iKGRldixBVEFfREVWX0NUTCk7IC8qIHByZXZlbnRzIHRvIHJlYWQgdGhlIHN0YXR1cyBiZWZvcmUgdmFsaWQgKi8KKwl3aGlsZSAoKChjID0gaWRlX2luYihkZXYsIEFUQV9TVEFUVVMpKSAmIG1hc2spICE9IHJlcykgewogCQkvKiBicmVhayBpZiBlcnJvciBvY2N1cnMgKGRvZXNuJ3QgbWFrZSBzZW5zZSB0byB3YWl0IG1vcmUpICovCiAJCWlmKChjICYgQVRBX1NUQVRfRVJSKT09QVRBX1NUQVRfRVJSKQogCQkJYnJlYWs7CkBAIC0xMjU2LDcgKzEzMjAsNyBAQAogCSAqLwogCW1hc2sgPSBBVEFfU1RBVF9CVVNZfEFUQV9TVEFUX0RSUTsKIAlyZXMgPSAwOwotCW91dGIgKGRldmljZSwgQVRBX0RFVl9IRCwgQVRBX0xCQSB8IEFUQV9ERVZJQ0UoZGV2aWNlKSk7CisJaWRlX291dGIgKGRldmljZSwgQVRBX0RFVl9IRCwgQVRBX0xCQSB8IEFUQV9ERVZJQ0UoZGV2aWNlKSk7CiAJYyA9IGF0YXBpX3dhaXRfbWFzayhkZXZpY2UsQVRBUElfVElNRV9PVVQsbWFzayxyZXMpOwogCWlmICgoYyAmIG1hc2spICE9IHJlcykgewogCQlwcmludGYgKCJBVEFQSV9JU1NVRTogZGV2aWNlICVkIG5vdCByZWFkeSBzdGF0dXMgJVhcbiIsIGRldmljZSxjKTsKQEAgLTEyNjQsMTIgKzEzMjgsMTIgQEAKIAkJZ290byBBSV9PVVQ7CiAJfQogCS8qIHdyaXRlIHRhc2tmaWxlICovCi0Jb3V0YiAoZGV2aWNlLCBBVEFfRVJST1JfUkVHLCAwKTsgLyogbm8gRE1BLCBubyBvdmVybGFwZWQgKi8KLQlvdXRiIChkZXZpY2UsIEFUQV9DWUxfTE9XLCAgKHVuc2lnbmVkIGNoYXIpKGJ1ZmxlbiAmIDB4RkYpKTsKLQlvdXRiIChkZXZpY2UsIEFUQV9DWUxfSElHSCwgKHVuc2lnbmVkIGNoYXIpKChidWZsZW48PDgpICYgMHhGRikpOwotCW91dGIgKGRldmljZSwgQVRBX0RFVl9IRCwgICBBVEFfTEJBIHwgQVRBX0RFVklDRShkZXZpY2UpKTsKKwlpZGVfb3V0YiAoZGV2aWNlLCBBVEFfRVJST1JfUkVHLCAwKTsgLyogbm8gRE1BLCBubyBvdmVybGFwZWQgKi8KKwlpZGVfb3V0YiAoZGV2aWNlLCBBVEFfQ1lMX0xPVywgICh1bnNpZ25lZCBjaGFyKShidWZsZW4gJiAweEZGKSk7CisJaWRlX291dGIgKGRldmljZSwgQVRBX0NZTF9ISUdILCAodW5zaWduZWQgY2hhcikoKGJ1Zmxlbjw8OCkgJiAweEZGKSk7CisJaWRlX291dGIgKGRldmljZSwgQVRBX0RFVl9IRCwgICBBVEFfTEJBIHwgQVRBX0RFVklDRShkZXZpY2UpKTsKIAotCW91dGIgKGRldmljZSwgQVRBX0NPTU1BTkQsICBBVEFQSV9DTURfUEFDS0VUKTsKKwlpZGVfb3V0YiAoZGV2aWNlLCBBVEFfQ09NTUFORCwgIEFUQVBJX0NNRF9QQUNLRVQpOwogCXVkZWxheSAoNTApOwogCiAJbWFzayA9IEFUQV9TVEFUX0RSUXxBVEFfU1RBVF9CVVNZfEFUQV9TVEFUX0VSUjsKQEAgLTEyOTUsNyArMTM1OSw3IEBACiAJYyA9IGF0YXBpX3dhaXRfbWFzayhkZXZpY2UsQVRBUElfVElNRV9PVVQsbWFzayxyZXMpOwogCWlmICgoYyAmIG1hc2spICE9IHJlcyApIHsKIAkJaWYgKGMgJiBBVEFfU1RBVF9FUlIpIHsKLQkJCWVycj0oaW5iKGRldmljZSxBVEFfRVJST1JfUkVHKSk+PjQ7CisJCQllcnI9KGlkZV9pbmIoZGV2aWNlLEFUQV9FUlJPUl9SRUcpKT4+NDsKIAkJCUFUX1BSSU5URigiYXRhcGlfaXNzdWUgMSByZXR1cm5lZCBzZW5zZSBrZXkgJVggc3RhdHVzICUwMlhcbiIsZXJyLGMpOwogCQl9IGVsc2UgewogCQkJcHJpbnRmICgiQVRUQVBJX0lTU1VFOiAobm8gRFJRKSBhZnRlciBzZW5kaW5nIGNjYiAoJXgpICBzdGF0dXMgMHglMDJ4XG4iLCBjY2JbMF0sYyk7CkBAIC0xMzAzLDkgKzEzNjcsOSBAQAogCQl9CiAJCWdvdG8gQUlfT1VUOwogCX0KLQluPWluYihkZXZpY2UsIEFUQV9DWUxfSElHSCk7CisJbj1pZGVfaW5iKGRldmljZSwgQVRBX0NZTF9ISUdIKTsKIAluPDw9ODsKLQluKz1pbmIoZGV2aWNlLCBBVEFfQ1lMX0xPVyk7CisJbis9aWRlX2luYihkZXZpY2UsIEFUQV9DWUxfTE9XKTsKIAlpZihuPmJ1ZmxlbikgewogCQlwcmludGYoIkVSUk9SLCB0cmFuc2ZlciBieXRlcyAlZCByZXF1ZXN0ZWQgb25seSAlZFxuIixuLGJ1Zmxlbik7CiAJCWVycj0weGZmOwpAQCAtMTMyNCw3ICsxMzg4LDcgQEAKIAkJIC8qIHdlIHRyYW5zZmVyIHNob3J0cyAqLwogCQluPj49MTsKIAkJLyogb2sgbm93IGRlY2lkZSBpZiBpdCBpcyBhbiBpbiBvciBvdXRwdXQgKi8KLQkJaWYgKChpbmIoZGV2aWNlLCBBVEFfU0VDVF9DTlQpJjB4MDIpPT0wKSB7CisJCWlmICgoaWRlX2luYihkZXZpY2UsIEFUQV9TRUNUX0NOVCkmMHgwMik9PTApIHsKIAkJCUFUX1BSSU5URigiV3JpdGUgdG8gZGV2aWNlXG4iKTsKIAkJCW91dHB1dF9kYXRhX3Nob3J0cyhkZXZpY2UsKHVuc2lnbmVkIHNob3J0ICopYnVmZmVyLG4pOwogCQl9IGVsc2UgewpAQCAtMTMzNyw3ICsxNDAxLDcgQEAKIAlyZXM9MDsKIAljID0gYXRhcGlfd2FpdF9tYXNrKGRldmljZSxBVEFQSV9USU1FX09VVCxtYXNrLHJlcyk7CiAJaWYgKChjICYgQVRBX1NUQVRfRVJSKSA9PSBBVEFfU1RBVF9FUlIpIHsKLQkJZXJyPShpbmIoZGV2aWNlLEFUQV9FUlJPUl9SRUcpID4+IDQpOworCQllcnI9KGlkZV9pbmIoZGV2aWNlLEFUQV9FUlJPUl9SRUcpID4+IDQpOwogCQlBVF9QUklOVEYoImF0YXBpX2lzc3VlIDIgcmV0dXJuZWQgc2Vuc2Uga2V5ICVYIHN0YXR1cyAlWFxuIixlcnIsYyk7CiAJfSBlbHNlIHsKIAkJZXJyID0gMDsKZGlmZiAtLWdpdCBhL2NvbW1vbi9jb21tYW5kLmMgYi9jb21tb24vY29tbWFuZC5jCmluZGV4IGY3MGNhZDguLmNhYjY4YWIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jb21tYW5kLmMKKysrIGIvY29tbW9uL2NvbW1hbmQuYwpAQCAtNzAsNiArNzAsNyBAQAogCiAjaW5jbHVkZSA8Y21kX3ZmZC5oPgkJLyogbG9hZCBhIGJpdG1hcCB0byB0aGUgVkZEcyBvbiBUUkFCICovCiAjaW5jbHVkZSA8Y21kX2xvZy5oPgorI2luY2x1ZGUgPGNtZF9mZG9zLmg+CiAKIC8qCiAgKiBIRUxQIGNvbW1hbmQKQEAgLTI1Myw2ICsyNTQsOCBAQAogCUNNRF9UQkxfRkNDSU5GTwogCUNNRF9UQkxfRkxFUkFTRQogCUNNRF9UQkxfRkRDCisgICAgICAgIENNRF9UQkxfRkRPU19CT09UCisgICAgICAgIENNRF9UQkxfRkRPU19MUwogCUNNRF9UQkxfRkxJTkZPCiAJQ01EX1RCTF9GUEdBCiAJQ01EX1RCTF9KRkZTMl9GU0lORk8KZGlmZiAtLWdpdCBhL2NwdS9pMzg2L01ha2VmaWxlIGIvY3B1L2kzODYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ4MjM5OAotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9pMzg2L01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9IGxpYiQoQ1BVKS5hCisKK1NUQVJUCT0gc3RhcnQubyBzdGFydDE2Lm8gcmVzZXQubyAKK09CSlMJPSBzZXJpYWwubyBpbnRlcnJ1cHRzLm8gY3B1Lm8gdGltZXIubworCSAgCithbGw6CS5kZXBlbmQgJChTVEFSVCkgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpIGNydiAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLmRlcGVuZDoJTWFrZWZpbGUgJChTVEFSVDoubz0uUykgJChPQkpTOi5vPS5jKQorCQkkKENDKSAtTSAkKENGTEFHUykgJChTVEFSVDoubz0uUykgJChPQkpTOi5vPS5jKSA+ICRACisKK3NpbmNsdWRlIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY3B1L2kzODYvY29uZmlnLm1rIGIvY3B1L2kzODYvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwY2FlYjIKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvaTM4Ni9jb25maWcubWsKQEAgLTAsMCArMSwyNiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDIKKyMgRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIsIGRhbmllbEBvbWljcm9uLnNlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitQTEFURk9STV9SRUxGTEFHUyArPSAjIC1waXBlIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgLWZuby1idWlsdGluIC1ub3N0ZGluYyAtbm9zdGRsaWIKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLW1hcmNoPWkzODYKZGlmZiAtLWdpdCBhL2NwdS9pMzg2L2NwdS5jIGIvY3B1L2kzODYvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5ODIzZgotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9pMzg2L2NwdS5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KKyAqIAorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogQWxleCBadWVwa2UgPGF6dUBzeXNnby5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQ1BVIHNwZWNpZmljIGNvZGUKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorCitpbnQgY3B1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IGRvX3Jlc2V0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWV4dGVybiB2b2lkIHJlc2V0X2NwdSh1bG9uZyBhZGRyKTsKKworCXByaW50ZiAoInJlc2V0dGluZyAuLi5cbiIpOworCXVkZWxheSg1MDAwMCk7CQkJCS8qIHdhaXQgNTAgbXMgKi8KKwlkaXNhYmxlX2ludGVycnVwdHMoKTsKKwlyZXNldF9jcHUoMCk7CisKKwkvKk5PVFJFQUNIRUQqLworCXJldHVybiAwOworfQorCit2b2lkICBmbHVzaF9jYWNoZSAodW5zaWduZWQgbG9uZyBkdW1teTEsIHVuc2lnbmVkIGxvbmcgZHVtbXkyKQoreworCWFzbSgid2JpbnZkXG4iKTsKKwlyZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL2NwdS9pMzg2L2ludGVycnVwdHMuYyBiL2NwdS9pMzg2L2ludGVycnVwdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQ2ODgxCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2kzODYvaW50ZXJydXB0cy5jCkBAIC0wLDAgKzEsNTgzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHN5c2NhbGwuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaTgyNTkuaD4KKyNpbmNsdWRlIDxhc20vaWJtcGMuaD4KKworCisjaWYgMAorLyogZG9uZSAqLworaW50CWludGVycnVwdF9pbml0ICAgICAodm9pZCk7Cit2b2lkCWlycV9pbnN0YWxsX2hhbmRsZXIoaW50LCBpbnRlcnJ1cHRfaGFuZGxlcl90ICosIHZvaWQgKik7Cit2b2lkCWlycV9mcmVlX2hhbmRsZXIgICAoaW50KTsKK3ZvaWQJZW5hYmxlX2ludGVycnVwdHMgICh2b2lkKTsKK2ludAlkaXNhYmxlX2ludGVycnVwdHMgKHZvaWQpOworCisvKiB0b2RvICovCit2b2lkCXRpbWVyX2ludGVycnVwdCAgICAoc3RydWN0IHB0X3JlZ3MgKik7Cit2b2lkCWV4dGVybmFsX2ludGVycnVwdCAoc3RydWN0IHB0X3JlZ3MgKik7Cit2b2lkCXJlc2V0X3RpbWVyCSAgICh2b2lkKTsKK3Vsb25nCWdldF90aW1lcgkgICAodWxvbmcgYmFzZSk7Cit2b2lkCXNldF90aW1lcgkgICAodWxvbmcgdCk7CisKKyNlbmRpZgorCitzdHJ1Y3QgaWR0X2VudHJ5IHsKKwl1MTYJYmFzZV9sb3c7CisJdTE2CXNlbGVjdG9yOworCXU4CXJlczsKKwl1OAlhY2Nlc3M7CisJdTE2CWJhc2VfaGlnaDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKK3N0cnVjdCBpZHRfZW50cnkgaWR0WzI1Nl07CisKKworI2RlZmluZSBNQVhfSVJRIDE2CisKK3R5cGVkZWYgc3RydWN0IGlycV9oYW5kbGVyIHsgCisJc3RydWN0IGlycV9oYW5kbGVyICpuZXh0OworCWludGVycnVwdF9oYW5kbGVyX3QqIGlzcl9mdW5jOworCXZvaWQgKmlzcl9kYXRhOworfSBpcnFfaGFuZGxlcl90OworCisjZGVmaW5lIElSUV9ESVNBQkxFRCAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgeworCWlycV9oYW5kbGVyX3QgKmhhbmRsZXI7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7Cit9IGlycV9kZXNjX3Q7CisKK3N0YXRpYyBpcnFfZGVzY190IGlycV90YWJsZVtNQVhfSVJRXTsKKworCisvKiBzeXNjYWxsIHN0dWZmLCB2ZXJ5IHVudGVzdGVkIAorICogdGhlIGN1cnJlbnQgYXBwcm9hY2ggd2hpY2ggaW5jbHVkZXMgY29weWluZworICogcGFydCBvZiB0aGUgc3RhY2sgd2lsbCB3b3JrIGJhZGx5IGZvciAKKyAqIHZhcmFyZ3MgZnVuY3Rpb25zLgorICogaWYgd2Ugd2VyZSB0byBzdG9yZSB0aGUgdG9wIHRocmVlIHdvcmRzIG9uIHRoZQorICogc3RhY2sgKGVpcCwgc3MsIGVmbGFncykgc29td2hlcmUgYW5kIGFkZCAxNCB0bworICogJWVzcCAuLi4uCisgKi8KK2FzbSgiLmdsb2JsIHN5c2NhbGxfZW50cnlcbiIgXAorICAgICAgICAic3lzY2FsbF9lbnRyeTpcbiIgXAorICAgICAgICAibW92bCAgIDEyKCVlc3ApLCAlZWF4XG4iIFwKKwkibW92bCAgICVlc3AsICVlYnhcbiIgXAorICAgICAgICAiYWRkbCAgICQxNiwgJWVieFxuIiBcCisgICAgICAgICJwdXNobCAgJWVieFxuIiBcCisgICAgICAgICJwdXNobCAgJWVheFxuIiBcCisgICAgICAgICJjYWxsICAgZG9fc3lzY2FsbFxuIiBcCisgICAgICAgICJhZGRsICAgJDgsICVlc3BcbiIgXAorICAgICAgICAiaXJldFxuIik7CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBzeXNjYWxsX2VudHJ5KHZvaWQpOworCitpbnQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkb19zeXNjYWxsKHUzMiBuciwgdTMyICpzdGFjaykKK3sKKwlpZiAobnI8TlJfU1lTQ0FMTFMpIHsKKwkJLyogV2UgY29weSA4IGFyZ3Mgb2YgdGhlIHN5c2NhbGwsCisJCSAqIHRoaXMgd2lsbCBiZSBhIHByb2JsZW0gd2l0aCB0aGUgCisJCSAqIHByaW50ZiBzeXNjYWxsIC4uLi4gKi8KKwkJaW50ICgqZnApKHUzMiwgdTMyLCB1MzIsIHUzMiwKKwkJCSAgdTMyLCB1MzIsIHUzMiwgdTMyKTsKKwkJZnAgPSBzeXNjYWxsX3RibFtucl07CisJCXJldHVybiBmcChzdGFja1swXSwgc3RhY2tbMV0sIHN0YWNrWzJdLCBzdGFja1szXSwKKwkJCQkJICAgICBzdGFja1s0XSwgc3RhY2tbNV0sIHN0YWNrWzZdLCBzdGFja1s3XSk7CisJfQorCQorCXJldHVybiAtMTsKK30KKwkKKworYXNtICgiaXJxX3JldHVybjpcbiIKKyAgICAgIiAgICAgYWRkbCAgJDQsICVlc3BcbiIKKyAgICAgIiAgICAgcG9wYVxuIgorICAgICAiICAgICBpcmV0XG4iKTsKKworYXNtICgiZXhwX3JldHVybjpcbiIKKyAgICAgIiAgICAgYWRkbCAgJDEyLCAlZXNwXG4iCisgICAgICIgICAgIHBvcCAgICVlc3BcbiIKKyAgICAgIiAgICAgcG9wYVxuIgorICAgICAiICAgICBpcmV0XG4iKTsKKworY2hhciBleGNlcHRpb25fc3RhY2tbNDA5Nl07CisKKyNkZWZpbmUgREVDTEFSRV9JTlRFUlJVUFQoeCkgXAorCWFzbSgiLmdsb2JsIGlycV8iI3giXG4iIFwKKwkJICAgICJpcnFfIiN4IjpcbiIgXAorCQkgICAgInB1c2hhIFxuIiBcCisJCSAgICAicHVzaGwgJCIjeCJcbiIgXAorCQkgICAgInB1c2hsICRpcnFfcmV0dXJuXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgImptcCAgIGRvX2lycVxuIik7IFwKKwl2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgaXJxXyMjeCh2b2lkKQorCisjZGVmaW5lIERFQ0xBUkVfRVhDRVBUSU9OKHgsIGYpIFwKKwlhc20oIi5nbG9ibCBleHBfIiN4IlxuIiBcCisJCSAgICAiZXhwXyIjeCI6XG4iIFwKKwkJICAgICJwdXNoYSBcbiIgXAorCQkgICAgIm1vdmwgICAgICVlc3AsICVlYnhcbiIgXAorCQkgICAgIm1vdmwgICAgICRleGNlcHRpb25fc3RhY2ssICVlYXhcbiIgXAorCQkgICAgIm1vdmwgICAgICVlYXgsICVlc3AgXG4iIFwKKwkJICAgICJwdXNobCAgICAlZWJ4XG4iIFwKKwkJICAgICJtb3ZsICAgICAzMiglZXNwKSwgJWVieFxuIiBcCisJCSAgICAieG9ybCAgICAgJWVkeCwgJWVkeFxuIiBcCisJCSAgICAibW92dyAgICAgMzYoJWVzcCksICVkeFxuIiBcCisJCSAgICAicHVzaGwgICAgJWVkeFxuIiBcCisJCSAgICAicHVzaGwgICAgJWVieFxuIiBcCisJCSAgICAicHVzaGwgICAgJCIjeCJcbiIgXAorCQkgICAgInB1c2hsICAgICRleHBfcmV0dXJuXG4iIFwKKwkJICAgICJqbXAgICAgICAiI2YiXG4iKTsgXAorCXZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBleHBfIyN4KHZvaWQpCisKK0RFQ0xBUkVfRVhDRVBUSU9OKDAsIGRpdmlkZV9leGNlcHRpb25fZW50cnkpOyAgICAgIC8qIERpdmlkZSBleGNlcHRpb24gKi8KK0RFQ0xBUkVfRVhDRVBUSU9OKDEsIGRlYnVnX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAgIC8qIERlYnVnIGV4Y2VwdGlvbiAqLworREVDTEFSRV9FWENFUFRJT04oMiwgbm1pX2VudHJ5KTsgICAgICAgICAgICAgICAgICAgLyogTk1JICovCitERUNMQVJFX0VYQ0VQVElPTigzLCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAvKiBCcmVha3BvaW50L0NvcHJvY2Vzc29yIEVycm9yICovCitERUNMQVJFX0VYQ0VQVElPTig0LCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAvKiBPdmVyZmxvdyAqLworREVDTEFSRV9FWENFUFRJT04oNSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAgLyogQm91bmRzICovCitERUNMQVJFX0VYQ0VQVElPTig2LCBpbnZhbGlkX2luc3RydWN0aW9uX2VudHJ5KTsgICAvKiBJbnZhbGlkIGluc3RydWN0aW9uICovCitERUNMQVJFX0VYQ0VQVElPTig3LCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAvKiBEZXZpY2Ugbm90IHByZXNlbnQgKi8KK0RFQ0xBUkVfRVhDRVBUSU9OKDgsIGRvdWJsZV9mYXVsdF9lbnRyeSk7ICAgICAgICAgIC8qIERvdWJsZSBmYXVsdCAqLworREVDTEFSRV9FWENFUFRJT04oOSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAgLyogQ28tcHJvY2Vzc29yIHNlZ21lbnQgb3ZlcnJ1biAqLworREVDTEFSRV9FWENFUFRJT04oMTAsIGludmFsaWRfdHNzX2V4Y2VwdGlvbl9lbnRyeSk7LyogSW52YWxpZCBUU1MgKi8KK0RFQ0xBUkVfRVhDRVBUSU9OKDExLCBzZWdfZmF1bHRfZW50cnkpOyAgICAgICAgICAgIC8qIFNlZ21lbnQgbm90IHByZXNlbnQgKi8KK0RFQ0xBUkVfRVhDRVBUSU9OKDEyLCBzdGFja19mYXVsdF9lbnRyeSk7ICAgICAgICAgIC8qIFN0YWNrIG92ZXJmbG93ICovCitERUNMQVJFX0VYQ0VQVElPTigxMywgZ3BmX2VudHJ5KTsgICAgICAgICAgICAgICAgICAvKiBHUEYgKi8KK0RFQ0xBUkVfRVhDRVBUSU9OKDE0LCBwYWdlX2ZhdWx0X2VudHJ5KTsgICAgICAgICAgIC8qIFBGICovCitERUNMQVJFX0VYQ0VQVElPTigxNSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLworREVDTEFSRV9FWENFUFRJT04oMTYsIGZwX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgKi8KK0RFQ0xBUkVfRVhDRVBUSU9OKDE3LCBhbGlnbm1lbnRfY2hlY2tfZW50cnkpOyAgICAgIC8qIGFsaWdubWVudCBjaGVjayAqLworREVDTEFSRV9FWENFUFRJT04oMTgsIG1hY2hpbmVfY2hlY2tfZW50cnkpOyAgICAgICAgLyogbWFjaGluZSBjaGVjayAqLworREVDTEFSRV9FWENFUFRJT04oMTksIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KK0RFQ0xBUkVfRVhDRVBUSU9OKDIwLCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgIC8qIFJlc2VydmVkICovCitERUNMQVJFX0VYQ0VQVElPTigyMSwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLworREVDTEFSRV9FWENFUFRJT04oMjIsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KK0RFQ0xBUkVfRVhDRVBUSU9OKDIzLCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgIC8qIFJlc2VydmVkICovCitERUNMQVJFX0VYQ0VQVElPTigyNCwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLworREVDTEFSRV9FWENFUFRJT04oMjUsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KK0RFQ0xBUkVfRVhDRVBUSU9OKDI2LCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgIC8qIFJlc2VydmVkICovCitERUNMQVJFX0VYQ0VQVElPTigyNywgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLworREVDTEFSRV9FWENFUFRJT04oMjgsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KK0RFQ0xBUkVfRVhDRVBUSU9OKDI5LCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgIC8qIFJlc2VydmVkICovCitERUNMQVJFX0VYQ0VQVElPTigzMCwgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAvKiBSZXNlcnZlZCAqLworREVDTEFSRV9FWENFUFRJT04oMzEsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KKworREVDTEFSRV9JTlRFUlJVUFQoMCk7CitERUNMQVJFX0lOVEVSUlVQVCgxKTsKK0RFQ0xBUkVfSU5URVJSVVBUKDMpOworREVDTEFSRV9JTlRFUlJVUFQoNCk7CitERUNMQVJFX0lOVEVSUlVQVCg1KTsKK0RFQ0xBUkVfSU5URVJSVVBUKDYpOworREVDTEFSRV9JTlRFUlJVUFQoNyk7CitERUNMQVJFX0lOVEVSUlVQVCg4KTsKK0RFQ0xBUkVfSU5URVJSVVBUKDkpOworREVDTEFSRV9JTlRFUlJVUFQoMTApOworREVDTEFSRV9JTlRFUlJVUFQoMTEpOworREVDTEFSRV9JTlRFUlJVUFQoMTIpOworREVDTEFSRV9JTlRFUlJVUFQoMTMpOworREVDTEFSRV9JTlRFUlJVUFQoMTQpOworREVDTEFSRV9JTlRFUlJVUFQoMTUpOworICAKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkZWZhdWx0X2lzcih2b2lkKTsgCithc20gKCJkZWZhdWx0X2lzcjogaXJldFxuIik7CisKK3ZvaWQgZGlzYWJsZV9pcnEoaW50IGlycSkgCit7CisJaWYgKGlycSA+PSBNQVhfSVJRKSB7CisJCXJldHVybjsKKwl9CisJaXJxX3RhYmxlW2lycV0uc3RhdHVzIHw9IElSUV9ESVNBQkxFRDsKKwkKK30KKwordm9pZCBlbmFibGVfaXJxKGludCBpcnEpIAoreworCWlmIChpcnEgPj0gTUFYX0lSUSkgeworCQlyZXR1cm47CisJfQorCWlycV90YWJsZVtpcnFdLnN0YXR1cyAmPSB+SVJRX0RJU0FCTEVEOworfQorCisvKiBtYXNrcyBvbmUgc3BlY2lmaWMgSVJRIGluIHRoZSBQSUMgKi8KK3N0YXRpYyB2b2lkIHVubWFza19pcnEoaW50IGlycSkKK3sKKwlpbnQgaW1yX3BvcnQ7CisJCisJaWYgKGlycSA+PSBNQVhfSVJRKSB7CisJCXJldHVybjsKKwl9CisJaWYgKGlycSA+IDcpIHsKKwkJaW1yX3BvcnQgPSBTTEFWRV9QSUMgKyBJTVI7CisJfSBlbHNlIHsKKwkJaW1yX3BvcnQgPSBNQVNURVJfUElDICsgSU1SOworCX0KKwkKKwlvdXRiKGluYihpbXJfcG9ydCkmfigxPDwoaXJxJjcpKSwgaW1yX3BvcnQpOworfQorCisKKy8qIHVubWFza3Mgb25lIHNwZWNpZmljIElSUSBpbiB0aGUgUElDICovCitzdGF0aWMgdm9pZCBtYXNrX2lycShpbnQgaXJxKQoreworCWludCBpbXJfcG9ydDsKKwkKKwlpZiAoaXJxID49IE1BWF9JUlEpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoaXJxID4gNykgeworCQlpbXJfcG9ydCA9IFNMQVZFX1BJQyArIElNUjsKKwl9IGVsc2UgeworCQlpbXJfcG9ydCA9IE1BU1RFUl9QSUMgKyBJTVI7CisJfQorCQorCW91dGIoaW5iKGltcl9wb3J0KXwoMTw8KGlycSY3KSksIGltcl9wb3J0KTsgCit9CisKKworLyogaXNzdWUgYSBTcGVjaWZpYyBFbmQgT2YgSW50ZXJydXB0IGluc3RydWNpdG9uICovCitzdGF0aWMgdm9pZCBzcGVjaWZpY19lb2koaW50IGlycSkKK3sKKwkvKiBJZiBpdCBpcyBvbiB0aGUgc2xhdmUgUElDIHRoaXMgaGF2ZSB0byBiZSBwZXJmb3JtZWQgb24KKwkgKiBib3RoIHRoZSBtYXN0ZXIgYW5kIHRoZSBzbGF2ZSBQSUNzICovCisJaWYgKGlycSA+IDcpIHsKKwkJb3V0YihPQ1cyX1NFT0l8KGlycSY3KSwgU0xBVkVfUElDICsgT0NXMik7CisJCWlycSA9IFNFT0lfSVIyOyAgICAgICAgICAgICAgIC8qIGFsc28gZG8gSVIyIG9uIG1hc3RlciAqLworCX0gCisJb3V0YihPQ1cyX1NFT0l8aXJxLCBNQVNURVJfUElDICsgT0NXMik7Cit9CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkb19pcnEoaW50IGlycSkgCit7CisJCisJbWFza19pcnEoaXJxKTsKKwkKKwlpZiAoaXJxX3RhYmxlW2lycV0uc3RhdHVzICYgSVJRX0RJU0FCTEVEKSB7CisJCXVubWFza19pcnEoaXJxKTsKKwkJc3BlY2lmaWNfZW9pKGlycSk7CisJCXJldHVybjsKKwl9CisJCisJCisJaWYgKE5VTEwgIT0gaXJxX3RhYmxlW2lycV0uaGFuZGxlcikgeworCQlpcnFfaGFuZGxlcl90ICpoYW5kbGVyOworCQlmb3IgKGhhbmRsZXIgPSBpcnFfdGFibGVbaXJxXS5oYW5kbGVyOyAKKwkJICAgICBOVUxMIT0gaGFuZGxlcjsgaGFuZGxlciA9IGhhbmRsZXItPm5leHQpIHsKKwkJCWhhbmRsZXItPmlzcl9mdW5jKGhhbmRsZXItPmlzcl9kYXRhKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoaXJxICYgNykgIT0gNykgewkJCQkKKwkJCXByaW50ZigiU3B1cmlvdXMgaXJxICVkXG4iLCBpcnEpOworCQl9CisJfQkJCisJdW5tYXNrX2lycShpcnEpOworCXNwZWNpZmljX2VvaShpcnEpOwkKK30KKworCit2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgdW5rbm93bl9leGNlcHRpb25fZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpIAoreworCXByaW50ZigiVW5rbm93biBFeGNlcHRpb24gJWQgYXQgJTA0eDolMDh4XG4iLCBjYXVzZSwgc2VnLCBpcCk7Cit9CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkaXZpZGVfZXhjZXB0aW9uX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKSAKK3sKKwlwcmludGYoIkRpdmlkZSBFcnJvciAoRGl2aXNpb24gYnkgemVybykgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKKwl3aGlsZSgxKTsKK30KKwordm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGRlYnVnX2V4Y2VwdGlvbl9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykgCit7CisJcHJpbnRmKCJEZWJ1ZyBJbnRlcnJ1cHQgKFNpbmdsZSBzdGVwKSBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOworfQorCit2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgbm1pX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKSAKK3sKKwlwcmludGYoIk5NSSBJbnRlcnJ1cHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKK30KKwkJCit2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgaW52YWxpZF9pbnN0cnVjdGlvbl9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykgCit7CisJcHJpbnRmKCJJbnZhbGlkIEluc3RydWN0aW9uIGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7CisJd2hpbGUoMSk7Cit9CisJCQkJCit2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZG91YmxlX2ZhdWx0X2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKSAKK3sKKwlwcmludGYoIkRvdWJsZSBmYXVsdCBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOworCXdoaWxlKDEpOworfQorCit2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgaW52YWxpZF90c3NfZXhjZXB0aW9uX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKSAKK3sKKwlwcmludGYoIkludmFsaWQgVFNTIGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cit9CisJCQordm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIHNlZ19mYXVsdF9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykgCit7CisJcHJpbnRmKCJTZWdtZW50YXRpb24gZmF1bHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKKwl3aGlsZSgxKTsKK30KKwordm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIHN0YWNrX2ZhdWx0X2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKSAKK3sKKwlwcmludGYoIlN0YWNrIGZhdWx0IGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7CisJd2hpbGUoMSk7Cit9CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBncGZfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpIAoreworCXByaW50ZigiR2VuZXJhbCBwcm90ZWN0aW9uIGZhdWx0IGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cit9CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBwYWdlX2ZhdWx0X2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKSAKK3sKKwlwcmludGYoIlBhZ2UgZmF1bHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKKwl3aGlsZSgxKTsKK30KKwordm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGZwX2V4Y2VwdGlvbl9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykgCit7CisJcHJpbnRmKCJGbG9hdGluZyBwb2ludCBleGNlcHRpb24gYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKK30KKwordm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGFsaWdubWVudF9jaGVja19lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykgCit7CisJcHJpbnRmKCJBbGlnbm1lbnQgY2hlY2sgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKK30KKyAgICAgICAKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBtYWNoaW5lX2NoZWNrX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKSAKK3sKKwlwcmludGYoIk1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cit9CisKKwordm9pZCBpcnFfaW5zdGFsbF9oYW5kbGVyKGludCBpbm8sIGludGVycnVwdF9oYW5kbGVyX3QgKmZ1bmMsIHZvaWQgKnBkYXRhKQoreworCWludCBzdGF0dXM7CisJCisJaWYgKGlubz5NQVhfSVJRKSB7CisJCXJldHVybjsKKwl9CisJCQorCWlmIChOVUxMICE9IGlycV90YWJsZVtpbm9dLmhhbmRsZXIpIHsKKwkJcmV0dXJuOworCX0KKwkKKwlzdGF0dXMgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKwlpcnFfdGFibGVbaW5vXS5oYW5kbGVyID0gbWFsbG9jKHNpemVvZihpcnFfaGFuZGxlcl90KSk7CisJaWYgKE5VTEwgPT0gaXJxX3RhYmxlW2lub10uaGFuZGxlcikgeworCQlyZXR1cm47CisJfQorCQorCW1lbXNldChpcnFfdGFibGVbaW5vXS5oYW5kbGVyLCAwLCBzaXplb2YoaXJxX2hhbmRsZXJfdCkpOworCQorCWlycV90YWJsZVtpbm9dLmhhbmRsZXItPmlzcl9mdW5jID0gZnVuYzsKKwlpcnFfdGFibGVbaW5vXS5oYW5kbGVyLT5pc3JfZGF0YSA9IHBkYXRhOworCWlmIChzdGF0dXMpIHsKKwkJZW5hYmxlX2ludGVycnVwdHMoKTsKKwl9CisJCisJdW5tYXNrX2lycShpbm8pOworCQorCXJldHVybjsKK30KKwordm9pZCBpcnFfZnJlZV9oYW5kbGVyKGludCBpbm8pCit7CisJaW50IHN0YXR1czsKKwlpZiAoaW5vPk1BWF9JUlEpIHsKKwkJcmV0dXJuOworCX0KKwkKKwlzdGF0dXMgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKwltYXNrX2lycShpbm8pOworCWlmIChOVUxMID09IGlycV90YWJsZVtpbm9dLmhhbmRsZXIpIHsKKwkJcmV0dXJuOworCX0KKwlmcmVlKGlycV90YWJsZVtpbm9dLmhhbmRsZXIpOworCWlycV90YWJsZVtpbm9dLmhhbmRsZXI9TlVMTDsKKwlpZiAoc3RhdHVzKSB7CisJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CisJfQorCXJldHVybjsKK30KKworCithc20gKCJpZHRfcHRyOlxuIgorCSIud29yZAkweDgwMFxuIiAvKiBzaXplIG9mIHRoZSB0YWJsZSA4KjI1NiBieXRlcyAqLworCSIubG9uZwlpZHRcbiIJIC8qIG9mZnNldCAqLworCSIud29yZAkweDE4XG4iKTsvKiBkYXRhIHNlZ21lbnQgKi8KKworc3RhdGljIHZvaWQgc2V0X3ZlY3RvcihpbnQgaW50bnVtLCB2b2lkICpyb3V0aW5lKQoreworCWlkdFtpbnRudW1dLmJhc2VfaGlnaCA9ICh1MTYpKCh1MzIpKHJvdXRpbmUpPj4xNik7CQorCWlkdFtpbnRudW1dLmJhc2VfbG93ID0gKHUxNikoKHUzMikocm91dGluZSkmMHhmZmZmKTsJCit9CisKKworaW50IGludGVycnVwdF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJCisJLyogSnVzdCBpbiBjYXNlLi4uICovCisJZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisJCQorCS8qIEluaXRpYWxpemUgdGhlIElEVCBhbmQgc3R1ZmYgKi8KKwkKKwkKKwltZW1zZXQoaXJxX3RhYmxlLCAwLCBzaXplb2YoaXJxX3RhYmxlKSk7CisKKwkvKiBTZXR1cCB0aGUgSURUICovCisJZm9yIChpPTA7aTwyNTY7aSsrKSB7CQkKKwkJaWR0W2ldLmFjY2VzcyA9IDB4OGU7CisJCWlkdFtpXS5yZXMgPSAwOwkKKwkJaWR0W2ldLnNlbGVjdG9yID0gMHgxMDsJCisJCXNldF92ZWN0b3IoaSwgZGVmYXVsdF9pc3IpOworCX0JCisJCisJYXNtICgiY3MgbGlkdCBpZHRfcHRyXG4iKTsKKwkKKwkvKiBTZXR1cCBleGNlcHRpb25zICovCisJc2V0X3ZlY3RvcigweDAwLCBleHBfMCk7CisJc2V0X3ZlY3RvcigweDAxLCBleHBfMSk7CisJc2V0X3ZlY3RvcigweDAyLCBleHBfMik7CisJc2V0X3ZlY3RvcigweDAzLCBleHBfMyk7CisJc2V0X3ZlY3RvcigweDA0LCBleHBfNCk7CisJc2V0X3ZlY3RvcigweDA1LCBleHBfNSk7CisJc2V0X3ZlY3RvcigweDA2LCBleHBfNik7CisJc2V0X3ZlY3RvcigweDA3LCBleHBfNyk7CisJc2V0X3ZlY3RvcigweDA4LCBleHBfOCk7CisJc2V0X3ZlY3RvcigweDA5LCBleHBfOSk7CisJc2V0X3ZlY3RvcigweDBhLCBleHBfMTApOworCXNldF92ZWN0b3IoMHgwYiwgZXhwXzExKTsKKwlzZXRfdmVjdG9yKDB4MGMsIGV4cF8xMik7CisJc2V0X3ZlY3RvcigweDBkLCBleHBfMTMpOworCXNldF92ZWN0b3IoMHgwZSwgZXhwXzE0KTsKKwlzZXRfdmVjdG9yKDB4MGYsIGV4cF8xNSk7CisJc2V0X3ZlY3RvcigweDEwLCBleHBfMTYpOworCXNldF92ZWN0b3IoMHgxMSwgZXhwXzE3KTsKKwlzZXRfdmVjdG9yKDB4MTIsIGV4cF8xOCk7CisJc2V0X3ZlY3RvcigweDEzLCBleHBfMTkpOworCXNldF92ZWN0b3IoMHgxNCwgZXhwXzIwKTsKKwlzZXRfdmVjdG9yKDB4MTUsIGV4cF8yMSk7CisJc2V0X3ZlY3RvcigweDE2LCBleHBfMjIpOworCXNldF92ZWN0b3IoMHgxNywgZXhwXzIzKTsKKwlzZXRfdmVjdG9yKDB4MTgsIGV4cF8yNCk7CisJc2V0X3ZlY3RvcigweDE5LCBleHBfMjUpOworCXNldF92ZWN0b3IoMHgxYSwgZXhwXzI2KTsKKwlzZXRfdmVjdG9yKDB4MWIsIGV4cF8yNyk7CisJc2V0X3ZlY3RvcigweDFjLCBleHBfMjgpOworCXNldF92ZWN0b3IoMHgxZCwgZXhwXzI5KTsKKwlzZXRfdmVjdG9yKDB4MWUsIGV4cF8zMCk7CisJc2V0X3ZlY3RvcigweDFmLCBleHBfMzEpOworCisKKwkvKiBTZXR1cCBpbnRlcnJ1cHRzICovCisJc2V0X3ZlY3RvcigweDIwLCBpcnFfMCk7CisJc2V0X3ZlY3RvcigweDIxLCBpcnFfMSk7CisJc2V0X3ZlY3RvcigweDIzLCBpcnFfMyk7CisJc2V0X3ZlY3RvcigweDI0LCBpcnFfNCk7CisJc2V0X3ZlY3RvcigweDI1LCBpcnFfNSk7CisJc2V0X3ZlY3RvcigweDI2LCBpcnFfNik7CisJc2V0X3ZlY3RvcigweDI3LCBpcnFfNyk7CisJc2V0X3ZlY3RvcigweDI4LCBpcnFfOCk7CisJc2V0X3ZlY3RvcigweDI5LCBpcnFfOSk7CisJc2V0X3ZlY3RvcigweDJhLCBpcnFfMTApOworCXNldF92ZWN0b3IoMHgyYiwgaXJxXzExKTsKKwlzZXRfdmVjdG9yKDB4MmMsIGlycV8xMik7CisJc2V0X3ZlY3RvcigweDJkLCBpcnFfMTMpOworCXNldF92ZWN0b3IoMHgyZSwgaXJxXzE0KTsKKwlzZXRfdmVjdG9yKDB4MmYsIGlycV8xNSk7CisJLyogdmVjdG9ycyAweDMwLTB4M2YgYXJlIHJlc2VydmVkIGZvciBpcnEgMTYtMzEgKi8KKwlzZXRfdmVjdG9yKDB4NDAsIHN5c2NhbGxfZW50cnkpOworCisJCisJLyogTWFzayBhbGwgaW50ZXJydXB0cyAqLworCW91dGIoMHhmZiwgTUFTVEVSX1BJQyArIElNUik7CisJb3V0YigweGZmLCBTTEFWRV9QSUMgKyBJTVIpOworCQorCS8qIE1hc3RlciBQSUMgKi8KKwlvdXRiKElDVzFfU0VMfElDVzFfRUlDVzQsIE1BU1RFUl9QSUMgKyBJQ1cxKTsJCisJb3V0YigweDIwLCBNQVNURVJfUElDICsgSUNXMik7ICAgICAgICAgIC8qIFBsYWNlIG1hc3RlciBQSUMgaW50ZXJydXB0cyBhdCBJTlQyMCAqLworCW91dGIoSVIyLCBNQVNURVJfUElDICsgSUNXMyk7CQkvKiBJQ1czLCBPbmUgc2xldmMgUElDIGlzIHByZXNlbnQgKi8JCisJb3V0YihJQ1c0X1BNLCBNQVNURVJfUElDICsgSUNXNCk7CisJCisJZm9yIChpPTA7aTw4O2krKykgeworCQlvdXRiKE9DVzJfU0VPSXxpLCBNQVNURVJfUElDICsgT0NXMik7CisJfQorCQorCS8qIFNsYXZlIFBJQyAqLworCW91dGIoSUNXMV9TRUx8SUNXMV9FSUNXNCwgU0xBVkVfUElDICsgSUNXMSk7CQorCW91dGIoMHgyOCwgU0xBVkVfUElDICsgSUNXMik7CSAgICAgICAgLyogUGxhY2Ugc2xhdmUgUElDIGludGVycnVwdHMgYXQgSU5UMjggKi8KKwlvdXRiKDB4MDIsIFNMQVZFX1BJQyArIElDVzMpOwkJLyogU2xhdmUgSUQgKi8KKwlvdXRiKElDVzRfUE0sIFNMQVZFX1BJQyArIElDVzQpOyAgICAgICAgCisJCisJZm9yIChpPTA7aTw4O2krKykgeworCQlvdXRiKE9DVzJfU0VPSXxpLCBTTEFWRV9QSUMgKyBPQ1cyKTsKKwl9CisJCisJCisJLyogZW5hYmxlIGNhc2NhZGUgaW50ZXJyZXJ1cHQgKi8KKwlvdXRiKDB4ZmIsIE1BU1RFUl9QSUMgKyBJTVIpOworCW91dGIoMHhmZiwgU0xBVkVfUElDICsgSU1SKTsKKwkKKwkvKiBJdCBpcyBub3cgc2FmZSB0byBlbmFibGUgaW50ZXJydXB0cyAqLworCWVuYWJsZV9pbnRlcnJ1cHRzKCk7IAorCQorCXJldHVybiAwOworfQorCit2b2lkIGVuYWJsZV9pbnRlcnJ1cHRzKHZvaWQpCit7CisJYXNtKCJzdGlcbiIpOworfQorCitpbnQgZGlzYWJsZV9pbnRlcnJ1cHRzKHZvaWQpCit7CisJbG9uZyBmbGFnczsKKwkKKwlhc20gdm9sYXRpbGUgKCJwdXNoZmwgOyBwb3BsICUwIDsgY2xpXG4iIDogIj1nIiAoZmxhZ3MpIDogKTsKKwkKKwlyZXR1cm4gKGZsYWdzJjB4MjAwKTsgLyogSUUgZmxhZ3MgaXMgYml0IDkgKi8KK30KKworCisjaWZkZWYgQ0ZHX1JFU0VUX0dFTkVSSUMKKwordm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGdlbmVyYXRlX2dwZih2b2lkKTsKK2FzbSgiLmdsb2JsIGdlbmVyYXRlX2dwZlxuIiAKKyAgICAiZ2VuZXJhdGVfZ3BmOlxuIiAKKyAgICAibGptcCAgICQweDcwLCAkMHg0NzExNDcxMVxuIik7IC8qIHNlZ21lbnQgMHg3MCBpcyBhbiBhcmJpdHJhcnkgc2VnbWVudCB3aGljaCBkb2VzIG5vdCAKKwkJCQkgICAgKiBleGlzdCAqLwordm9pZCByZXNldF9jcHUodWxvbmcgYWRkcikKK3sKKwlzZXRfdmVjdG9yKDEzLCBnZW5lcmF0ZV9ncGYpOyAgLyogZ2VuZXJhbCBwcm90ZWN0aW9uIGZhdWx0IGhhbmRsZXIgKi8KKwlzZXRfdmVjdG9yKDgsIGdlbmVyYXRlX2dwZik7ICAgLyogZG91YmxlIGZhdWx0IGhhbmRsZXIgKi8KKwlnZW5lcmF0ZV9ncGYoKTsgICAgICAgICAgICAgICAgLyogc3RhcnQgdGhlIHNob3cgKi8KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L2kzODYvcmVzZXQuUyBiL2NwdS9pMzg2L3Jlc2V0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlMzJhOAotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9pMzg2L3Jlc2V0LlMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqICBVLWJvb3QgLSBpMzg2IFN0YXJ0dXAgQ29kZSAKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCU9taWNyb24gQ2V0aSBBQiwgRGFuaWVsIEVuZ3N0cvZtIDxkZW5haWVsQG9taWNyb24uc2U+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogUmVzZXQgdmVjdG9yLCBqdW1wcyB0byBzdGFydDE2LlMgKi8KKworLmV4dGVybiBzdGFydDE2CisKKy5zZWN0aW9uIC5yZXNldCwgImF4IgorLmNvZGUxNgorcmVzZXRfdmVjdG9yOiAKKyAgICAgICAgY2xpCisgICAgICAgIGNsZAorICAgICAgICBqbXAgc3RhcnQxNiAKKworCS5vcmcgMHhmCisJbm9wCisJCmRpZmYgLS1naXQgYS9jcHUvaTM4Ni9zZXJpYWwuYyBiL2NwdS9pMzg2L3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDJlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvaTM4Ni9zZXJpYWwuYwpAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIsIGRhbmllbEBvbWljcm9uLnNlCisgKiAKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICovCisvKgorICogVGhpcyBzb3VyY2UgY29kZSBoYXMgYmVlbiBtYWRlIGF2YWlsYWJsZSB0byB5b3UgYnkgSUJNIG9uIGFuIEFTLUlTCisgKiBiYXNpcy4gIEFueW9uZSByZWNlaXZpbmcgdGhpcyBzb3VyY2UgaXMgbGljZW5zZWQgdW5kZXIgSUJNCisgKiBjb3B5cmlnaHRzIHRvIHVzZSBpdCBpbiBhbnkgd2F5IGhlIG9yIHNoZSBkZWVtcyBmaXQsIGluY2x1ZGluZworICogY29weWluZyBpdCwgbW9kaWZ5aW5nIGl0LCBjb21waWxpbmcgaXQsIGFuZCByZWRpc3RyaWJ1dGluZyBpdCBlaXRoZXIKKyAqIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLiAgTm8gbGljZW5zZSB1bmRlciBJQk0gcGF0ZW50cyBvcgorICogcGF0ZW50IGFwcGxpY2F0aW9ucyBpcyB0byBiZSBpbXBsaWVkIGJ5IHRoZSBjb3B5cmlnaHQgbGljZW5zZS4KKyAqCisgKiBBbnkgdXNlciBvZiB0aGlzIHNvZnR3YXJlIHNob3VsZCB1bmRlcnN0YW5kIHRoYXQgSUJNIGNhbm5vdCBwcm92aWRlCisgKiB0ZWNobmljYWwgc3VwcG9ydCBmb3IgdGhpcyBzb2Z0d2FyZSBhbmQgd2lsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yCisgKiBhbnkgY29uc2VxdWVuY2VzIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBBbnkgcGVyc29uIHdobyB0cmFuc2ZlcnMgdGhpcyBzb3VyY2UgY29kZSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrCisgKiBtdXN0IGluY2x1ZGUgdGhlIElCTSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIHBhcmFncmFwaCwgYW5kIHRoZQorICogcHJlY2VkaW5nIHR3byBwYXJhZ3JhcGhzIGluIHRoZSB0cmFuc2ZlcnJlZCBzb2Z0d2FyZS4KKyAqCisgKiBDT1BZUklHSFQgICBJIEIgTSAgIENPUlBPUkFUSU9OIDE5OTUKKyAqIExJQ0VOU0VEIE1BVEVSSUFMICAtICBQUk9HUkFNIFBST1BFUlRZIE9GIEkgQiBNCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaWJtcGMuaD4KKworI2lmIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2VuZGlmCisKKyNkZWZpbmUgVUFSVF9SQlIgICAgMHgwMAorI2RlZmluZSBVQVJUX1RIUiAgICAweDAwCisjZGVmaW5lIFVBUlRfSUVSICAgIDB4MDEKKyNkZWZpbmUgVUFSVF9JSVIgICAgMHgwMgorI2RlZmluZSBVQVJUX0ZDUiAgICAweDAyCisjZGVmaW5lIFVBUlRfTENSICAgIDB4MDMKKyNkZWZpbmUgVUFSVF9NQ1IgICAgMHgwNAorI2RlZmluZSBVQVJUX0xTUiAgICAweDA1CisjZGVmaW5lIFVBUlRfTVNSICAgIDB4MDYKKyNkZWZpbmUgVUFSVF9TQ1IgICAgMHgwNworI2RlZmluZSBVQVJUX0RMTCAgICAweDAwCisjZGVmaW5lIFVBUlRfRExNICAgIDB4MDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBMaW5lIFN0YXR1cyBSZWdpc3Rlci4KKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgYXN5bmNMU1JEYXRhUmVhZHkxICAgICAgICAgICAgMHgwMQorI2RlZmluZSBhc3luY0xTUk92ZXJydW5FcnJvcjEgICAgICAgICAweDAyCisjZGVmaW5lIGFzeW5jTFNSUGFyaXR5RXJyb3IxICAgICAgICAgIDB4MDQKKyNkZWZpbmUgYXN5bmNMU1JGcmFtaW5nRXJyb3IxICAgICAgICAgMHgwOAorI2RlZmluZSBhc3luY0xTUkJyZWFrSW50ZXJydXB0MSAgICAgICAweDEwCisjZGVmaW5lIGFzeW5jTFNSVHhIb2xkRW1wdHkxICAgICAgICAgIDB4MjAKKyNkZWZpbmUgYXN5bmNMU1JUeFNoaWZ0RW1wdHkxICAgICAgICAgMHg0MAorI2RlZmluZSBhc3luY0xTUlJ4Rmlmb0Vycm9yMSAgICAgICAgICAweDgwCisKKworCisjaWYgQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8IEZpZm8KKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyICpyeF9idWZmZXI7CisJdWxvbmcgcnhfcHV0OworCXVsb25nIHJ4X2dldDsKK30gc2VyaWFsX2J1ZmZlcl90OworCit2b2xhdGlsZSBzdGF0aWMgc2VyaWFsX2J1ZmZlcl90IGJ1Zl9pbmZvOworI2VuZGlmCisKKworc3RhdGljIGludCBzZXJpYWxfZGl2IChpbnQgYmF1ZHJhdGUgKQoreworCQorCXN3aXRjaCAoYmF1ZHJhdGUpIHsKKwljYXNlIDEyMDA6CisJCXJldHVybiA5NjsKKwljYXNlIDk2MDA6CisJCXJldHVybiAxMjsKKwljYXNlIDE5MjAwOgorCQlyZXR1cm4gNjsKKwljYXNlIDM4NDAwOgorCQlyZXR1cm4gMzsKKwljYXNlIDU3NjAwOgorCQlyZXR1cm4gMjsKKwljYXNlIDExNTIwMDoKKwkJcmV0dXJuIDE7CQkKKwl9CisJaGFuZyAoKTsKK30KKworCisvKgorICogTWluaW1hbCBzZXJpYWwgZnVuY3Rpb25zIG5lZWRlZCB0byB1c2Ugb25lIG9mIHRoZSBTTUMgcG9ydHMKKyAqIGFzIHNlcmlhbCBjb25zb2xlIGludGVyZmFjZS4KKyAqLworCitpbnQgc2VyaWFsX2luaXQgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwl2b2xhdGlsZSBjaGFyIHZhbDsKKworCWludCBiZGl2ID0gc2VyaWFsX2RpdihnZC0+YmF1ZHJhdGUpOworICAgIAorCisJb3V0YigweDgwLCBVQVJUMF9CQVNFICsgVUFSVF9MQ1IpOwkvKiBzZXQgRExBQiBiaXQgKi8KKwlvdXRiKGJkaXYsIFVBUlQwX0JBU0UgKyBVQVJUX0RMTCk7CS8qIHNldCBiYXVkcmF0ZSBkaXZpc29yICovCisJb3V0YihiZGl2ID4+IDgsIFVBUlQwX0JBU0UgKyBVQVJUX0RMTSk7Lyogc2V0IGJhdWRyYXRlIGRpdmlzb3IgKi8KKwlvdXRiKDB4MDMsIFVBUlQwX0JBU0UgKyBVQVJUX0xDUik7CS8qIGNsZWFyIERMQUI7IHNldCA4IGJpdHMsIG5vIHBhcml0eSAqLworCW91dGIoMHgwMCwgVUFSVDBfQkFTRSArIFVBUlRfRkNSKTsJLyogZGlzYWJsZSBGSUZPICovCisJb3V0YigweDAwLCBVQVJUMF9CQVNFICsgVUFSVF9NQ1IpOwkvKiBubyBtb2RlbSBjb250cm9sIERUUiBSVFMgKi8KKwl2YWwgPSBpbmIoVUFSVDBfQkFTRSArIFVBUlRfTFNSKTsJLyogY2xlYXIgbGluZSBzdGF0dXMgKi8KKwl2YWwgPSBpbmIoVUFSVDBfQkFTRSArIFVBUlRfUkJSKTsJLyogcmVhZCByZWNlaXZlIGJ1ZmZlciAqLworCW91dGIoMHgwMCwgVUFSVDBfQkFTRSArIFVBUlRfU0NSKTsJLyogc2V0IHNjcmF0Y2hwYWQgKi8KKwlvdXRiKDB4MDAsIFVBUlQwX0JBU0UgKyBVQVJUX0lFUik7CS8qIHNldCBpbnRlcnJ1cHQgZW5hYmxlIHJlZyAqLworCisJcmV0dXJuICgwKTsKK30KKworCit2b2lkIHNlcmlhbF9zZXRicmcgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwl1bnNpZ25lZCBzaG9ydCBiZGl2OworCQorCWJkaXYgPSBzZXJpYWxfZGl2IChnZC0+YmF1ZHJhdGUpOworCisJb3V0YigweDgwLCBVQVJUMF9CQVNFICsgVUFSVF9MQ1IpOwkvKiBzZXQgRExBQiBiaXQgKi8KKwlvdXRiKGJkaXYmMHhmZiwgVUFSVDBfQkFTRSArIFVBUlRfRExMKTsJLyogc2V0IGJhdWRyYXRlIGRpdmlzb3IgKi8KKwlvdXRiKGJkaXYgPj4gOCwgVUFSVDBfQkFTRSArIFVBUlRfRExNKTsvKiBzZXQgYmF1ZHJhdGUgZGl2aXNvciAqLworCW91dGIoMHgwMywgVUFSVDBfQkFTRSArIFVBUlRfTENSKTsJLyogY2xlYXIgRExBQjsgc2V0IDggYml0cywgbm8gcGFyaXR5ICovCit9CisKKwordm9pZCBzZXJpYWxfcHV0YyAoY29uc3QgY2hhciBjKQoreworCWludCBpOworCisJaWYgKGMgPT0gJ1xuJykKKwkJc2VyaWFsX3B1dGMgKCdccicpOworCisJLyogY2hlY2sgVEhSRSBiaXQsIHdhaXQgZm9yIHRyYW5zbWl0ZXIgYXZhaWxhYmxlICovCisJZm9yIChpID0gMTsgaSA8IDM1MDA7IGkrKykgeworCQlpZiAoKGluYiAoVUFSVDBfQkFTRSArIFVBUlRfTFNSKSAmIDB4MjApID09IDB4MjApCisJCQlicmVhazsKKwkJdWRlbGF5ICgxMDApOworCX0KKwlvdXRiKGMsIFVBUlQwX0JBU0UgKyBVQVJUX1RIUik7CS8qIHB1dCBjaGFyYWN0ZXIgb3V0ICovCit9CisKKwordm9pZCBzZXJpYWxfcHV0cyAoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJc2VyaWFsX3B1dGMgKCpzKyspOworCX0KK30KKworCitpbnQgc2VyaWFsX2dldGMgKCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CisKKwl3aGlsZSAoMSkgeworI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKQorCQlXQVRDSERPR19SRVNFVCAoKTsJLyogUmVzZXQgSFcgV2F0Y2hkb2csIGlmIG5lZWRlZCAqLworI2VuZGlmCS8qIENPTkZJR19IV19XQVRDSERPRyAqLworCQlzdGF0dXMgPSBpbmIgKFVBUlQwX0JBU0UgKyBVQVJUX0xTUik7CisJCWlmICgoc3RhdHVzICYgYXN5bmNMU1JEYXRhUmVhZHkxKSAhPSAweDApIHsKKwkJCWJyZWFrOworCQl9CisJCWlmICgoc3RhdHVzICYgKCBhc3luY0xTUkZyYW1pbmdFcnJvcjEgfAorCQkJCWFzeW5jTFNST3ZlcnJ1bkVycm9yMSB8CisJCQkJYXN5bmNMU1JQYXJpdHlFcnJvcjEgIHwKKwkJCQlhc3luY0xTUkJyZWFrSW50ZXJydXB0MSApKSAhPSAwKSB7CisJCQlvdXRiKGFzeW5jTFNSRnJhbWluZ0Vycm9yMSB8CisJCQkgICAgICBhc3luY0xTUk92ZXJydW5FcnJvcjEgfAorCQkJICAgICAgYXN5bmNMU1JQYXJpdHlFcnJvcjEgIHwKKwkJCSAgICAgIGFzeW5jTFNSQnJlYWtJbnRlcnJ1cHQxLCBVQVJUMF9CQVNFICsgVUFSVF9MU1IpOworCQl9CisJfQorCXJldHVybiAoMHgwMDAwMDBmZiAmIChpbnQpIGluYiAoVUFSVDBfQkFTRSkpOworfQorCisKK2ludCBzZXJpYWxfdHN0YyAoKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJc3RhdHVzID0gaW5iIChVQVJUMF9CQVNFICsgVUFSVF9MU1IpOworCWlmICgoc3RhdHVzICYgYXN5bmNMU1JEYXRhUmVhZHkxKSAhPSAweDApIHsKKwkJcmV0dXJuICgxKTsKKwl9CisJaWYgKChzdGF0dXMgJiAoIGFzeW5jTFNSRnJhbWluZ0Vycm9yMSB8CisJCQlhc3luY0xTUk92ZXJydW5FcnJvcjEgfAorCQkJYXN5bmNMU1JQYXJpdHlFcnJvcjEgIHwKKwkJCWFzeW5jTFNSQnJlYWtJbnRlcnJ1cHQxICkpICE9IDApIHsKKwkJb3V0Yihhc3luY0xTUkZyYW1pbmdFcnJvcjEgfAorCQkgICAgICBhc3luY0xTUk92ZXJydW5FcnJvcjEgfAorCQkgICAgICBhc3luY0xTUlBhcml0eUVycm9yMSAgfAorCQkgICAgICBhc3luY0xTUkJyZWFrSW50ZXJydXB0MSwgVUFSVDBfQkFTRSArIFVBUlRfTFNSKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworI2lmIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTworCit2b2lkIHNlcmlhbF9pc3IgKHZvaWQgKmFyZykKK3sKKwlpbnQgc3BhY2U7CisJaW50IGM7CisJY29uc3QgaW50IHJ4X2dldCA9IGJ1Zl9pbmZvLnJ4X2dldDsKKwlpbnQgcnhfcHV0ID0gYnVmX2luZm8ucnhfcHV0OworCisJaWYgKHJ4X2dldCA8PSByeF9wdXQpIHsKKwkJc3BhY2UgPSBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8gLSAocnhfcHV0IC0gcnhfZ2V0KTsKKwl9IGVsc2UgeworCQlzcGFjZSA9IHJ4X2dldCAtIHJ4X3B1dDsKKwl9CisJd2hpbGUgKHNlcmlhbF90c3RjICgpKSB7CisJCWMgPSBzZXJpYWxfZ2V0YyAoKTsKKwkJaWYgKHNwYWNlKSB7CisJCQlidWZfaW5mby5yeF9idWZmZXJbcnhfcHV0KytdID0gYzsKKwkJCXNwYWNlLS07CisJCX0KKwkJaWYgKHJ4X3B1dCA9PSBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8pCisJCQlyeF9wdXQgPSAwOworCQlpZiAoc3BhY2UgPCBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8gLyA0KSB7CisJCQkvKiBTdG9wIGZsb3cgYnkgc2V0dGluZyBSVFMgaW5hY3RpdmUgKi8KKwkJCW91dGIoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NQ1IpICYgKDB4RkYgXiAweDAyKSwKKwkJCSAgICAgIFVBUlQwX0JBU0UgKyBVQVJUX01DUik7CisJCX0KKwl9CisJYnVmX2luZm8ucnhfcHV0ID0gcnhfcHV0OworfQorCit2b2lkIHNlcmlhbF9idWZmZXJlZF9pbml0ICh2b2lkKQoreworCXNlcmlhbF9wdXRzICgiU3dpdGNoaW5nIHRvIGludGVycnVwdCBkcml2ZW4gc2VyaWFsIGlucHV0IG1vZGUuXG4iKTsKKwlidWZfaW5mby5yeF9idWZmZXIgPSBtYWxsb2MgKENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyk7CisJYnVmX2luZm8ucnhfcHV0ID0gMDsKKwlidWZfaW5mby5yeF9nZXQgPSAwOworCisJaWYgKGluYiAoVUFSVDBfQkFTRSArIFVBUlRfTVNSKSAmIDB4MTApIHsKKwkJc2VyaWFsX3B1dHMgKCJDaGVjayBDVFMgc2lnbmFsIHByZXNlbnQgb24gc2VyaWFsIHBvcnQ6IE9LLlxuIik7CisJfSBlbHNlIHsKKwkJc2VyaWFsX3B1dHMgKCJXQVJOSU5HOiBDVFMgc2lnbmFsIG5vdCBwcmVzZW50IG9uIHNlcmlhbCBwb3J0LlxuIik7CisJfQorCisJaXJxX2luc3RhbGxfaGFuZGxlciAoIFZFQ05VTV9VMCAvKlVBUlQwICovLyppbnQgdmVjICovICwKKwkJCSAgICAgIHNlcmlhbF9pc3IgLyppbnRlcnJ1cHRfaGFuZGxlcl90ICpoYW5kbGVyICovICwKKwkJCSAgICAgICh2b2lkICopICZidWZfaW5mbyAvKnZvaWQgKmFyZyAqLyApOworCisJLyogRW5hYmxlICJSWCBEYXRhIEF2YWlsYWJsZSIgSW50ZXJydXB0IG9uIFVBUlQgKi8KKwkvKiBvdXRiKGluYihVQVJUMF9CQVNFICsgVUFSVF9JRVIpIHwweDAxLCBVQVJUMF9CQVNFICsgVUFSVF9JRVIpOyAqLworCW91dGIoMHgwMSwgVUFSVDBfQkFTRSArIFVBUlRfSUVSKTsKKwkvKiBTZXQgRFRSIGFjdGl2ZSAqLworCW91dGIoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NQ1IpIHwgMHgwMSwgVUFSVDBfQkFTRSArIFVBUlRfTUNSKTsKKwkvKiBTdGFydCBmbG93IGJ5IHNldHRpbmcgUlRTIGFjdGl2ZSAqLworCW91dGIoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NQ1IpIHwgMHgwMiwgVUFSVDBfQkFTRSArIFVBUlRfTUNSKTsKKwkvKiBTZXR1cCBVQVJUIEZJRk86IFJYIHRyaWdnZXIgbGV2ZWw6IDQgYnl0ZSwgRW5hYmxlIEZJRk8gKi8KKwlvdXRiKCgxIDw8IDYpIHwgMSwgVUFSVDBfQkFTRSArIFVBUlRfRkNSKTsKK30KKwordm9pZCBzZXJpYWxfYnVmZmVyZWRfcHV0YyAoY29uc3QgY2hhciBjKQoreworCS8qIFdhaXQgZm9yIENUUyAqLworI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKQorCXdoaWxlICghKGluYiAoVUFSVDBfQkFTRSArIFVBUlRfTVNSKSAmIDB4MTApKQorCQlXQVRDSERPR19SRVNFVCAoKTsKKyNlbHNlCisJd2hpbGUgKCEoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NU1IpICYgMHgxMCkpOworI2VuZGlmCisJc2VyaWFsX3B1dGMgKGMpOworfQorCit2b2lkIHNlcmlhbF9idWZmZXJlZF9wdXRzIChjb25zdCBjaGFyICpzKQoreworCXNlcmlhbF9wdXRzIChzKTsKK30KKworaW50IHNlcmlhbF9idWZmZXJlZF9nZXRjICh2b2lkKQoreworCWludCBzcGFjZTsKKwlpbnQgYzsKKwlpbnQgcnhfZ2V0ID0gYnVmX2luZm8ucnhfZ2V0OworCWludCByeF9wdXQ7CisKKyNpZiBkZWZpbmVkKENPTkZJR19IV19XQVRDSERPRykKKwl3aGlsZSAocnhfZ2V0ID09IGJ1Zl9pbmZvLnJ4X3B1dCkKKwkJV0FUQ0hET0dfUkVTRVQgKCk7CisjZWxzZQorCXdoaWxlIChyeF9nZXQgPT0gYnVmX2luZm8ucnhfcHV0KTsKKyNlbmRpZgorCWMgPSBidWZfaW5mby5yeF9idWZmZXJbcnhfZ2V0KytdOworCWlmIChyeF9nZXQgPT0gQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPKQorCQlyeF9nZXQgPSAwOworCWJ1Zl9pbmZvLnJ4X2dldCA9IHJ4X2dldDsKKworCXJ4X3B1dCA9IGJ1Zl9pbmZvLnJ4X3B1dDsKKwlpZiAocnhfZ2V0IDw9IHJ4X3B1dCkgeworCQlzcGFjZSA9IENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyAtIChyeF9wdXQgLSByeF9nZXQpOworCX0gZWxzZSB7CisJCXNwYWNlID0gcnhfZ2V0IC0gcnhfcHV0OworCX0KKwlpZiAoc3BhY2UgPiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8gLyAyKSB7CisJCS8qIFN0YXJ0IGZsb3cgYnkgc2V0dGluZyBSVFMgYWN0aXZlICovCisJCW91dGIoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NQ1IpIHwgMHgwMiwgVUFSVDBfQkFTRSArIFVBUlRfTUNSKTsKKwl9CisKKwlyZXR1cm4gYzsKK30KKworaW50IHNlcmlhbF9idWZmZXJlZF90c3RjICh2b2lkKQoreworCXJldHVybiAoYnVmX2luZm8ucnhfZ2V0ICE9IGJ1Zl9pbmZvLnJ4X3B1dCkgPyAxIDogMDsKK30KKworI2VuZGlmCS8qIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyAqLworCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorLyoKKyAgQVMgSEFSTk9JUyA6IGFjY29yZGluZyB0byBDT05GSUdfS0dEQl9TRVJfSU5ERVgga2dkYiB1c2VzIHNlcmlhbCBwb3J0CisgIG51bWJlciAwIG9yIG51bWJlciAxCisgIC0gaWYgQ09ORklHX0tHREJfU0VSX0lOREVYID0gMSA9PiBzZXJpYWwgcG9ydCBudW1iZXIgMCA6CisgIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gYWxyZWFkeSBkb25lCisgIC0gaWYgQ09ORklHX0tHREJfU0VSX0lOREVYID0gMiA9PiBzZXJpYWwgcG9ydCBudW1iZXIgMSA6CisgIGNvbmZpZ3VyZSBwb3J0IDEgZm9yIHNlcmlhbCBJL08gd2l0aCByYXRlID0gQ09ORklHX0tHREJfQkFVRFJBVEUKKyovCisjaWYgKENPTkZJR19LR0RCX1NFUl9JTkRFWCAmIDIpCit2b2lkIGtnZGJfc2VyaWFsX2luaXQgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwl2b2xhdGlsZSBjaGFyIHZhbDsKKwliZGl2ID0gc2VyaWFsX2RpdiAoQ09ORklHX0tHREJfQkFVRFJBVEUpOworCisJLyoKKwkgKiBJbml0IG9uYm9hcmQgMTY1NTAgVUFSVAorCSAqLworCW91dGIoMHg4MCwgVUFSVDFfQkFTRSArIFVBUlRfTENSKTsJLyogc2V0IERMQUIgYml0ICovCisJb3V0YihiZGl2ICYgMHhmZiksIFVBUlQxX0JBU0UgKyBVQVJUX0RMTCk7CS8qIHNldCBkaXZpc29yIGZvciA5NjAwIGJhdWQgKi8KKwlvdXRiKGJkaXYgPj4gOCksIFVBUlQxX0JBU0UgKyBVQVJUX0RMTSk7CS8qIHNldCBkaXZpc29yIGZvciA5NjAwIGJhdWQgKi8KKwlvdXRiKDB4MDMsIFVBUlQxX0JBU0UgKyBVQVJUX0xDUik7CS8qIGxpbmUgY29udHJvbCA4IGJpdHMgbm8gcGFyaXR5ICovCisJb3V0YigweDAwLCBVQVJUMV9CQVNFICsgVUFSVF9GQ1IpOwkvKiBkaXNhYmxlIEZJRk8gKi8KKwlvdXRiKDB4MDAsIFVBUlQxX0JBU0UgKyBVQVJUX01DUik7CS8qIG5vIG1vZGVtIGNvbnRyb2wgRFRSIFJUUyAqLworCXZhbCA9IGluYihVQVJUMV9CQVNFICsgVUFSVF9MU1IpOwkvKiBjbGVhciBsaW5lIHN0YXR1cyAqLworCXZhbCA9IGluYihVQVJUMV9CQVNFICsgVUFSVF9SQlIpOwkvKiByZWFkIHJlY2VpdmUgYnVmZmVyICovCisJb3V0YigweDAwLCBVQVJUMV9CQVNFICsgVUFSVF9TQ1IpOwkvKiBzZXQgc2NyYXRjaHBhZCAqLworCW91dGIoMHgwMCwgVUFSVDFfQkFTRSArIFVBUlRfSUVSKTsJLyogc2V0IGludGVycnVwdCBlbmFibGUgcmVnICovCit9CisKKwordm9pZCBwdXREZWJ1Z0NoYXIgKGNvbnN0IGNoYXIgYykKK3sKKwlpZiAoYyA9PSAnXG4nKQorCQlzZXJpYWxfcHV0YyAoJ1xyJyk7CisKKwlvdXRiKGMsIFVBUlQxX0JBU0UgKyBVQVJUX1RIUik7CS8qIHB1dCBjaGFyYWN0ZXIgb3V0ICovCisKKwkvKiBjaGVjayBUSFJFIGJpdCwgd2FpdCBmb3IgdHJhbnNmZXIgZG9uZSAqLworCXdoaWxlICgoaW5iKFVBUlQxX0JBU0UgKyBVQVJUX0xTUikgJiAweDIwKSAhPSAweDIwKTsKK30KKworCit2b2lkIHB1dERlYnVnU3RyIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlzZXJpYWxfcHV0YygqcysrKTsKKwl9Cit9CisKKworaW50IGdldERlYnVnQ2hhciAodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlzdGF0dXMgPSBpbmIoVUFSVDFfQkFTRSArIFVBUlRfTFNSKTsKKwkJaWYgKChzdGF0dXMgJiBhc3luY0xTUkRhdGFSZWFkeTEpICE9IDB4MCkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChzdGF0dXMgJiAoIGFzeW5jTFNSRnJhbWluZ0Vycm9yMSB8CisJCQkJYXN5bmNMU1JPdmVycnVuRXJyb3IxIHwKKwkJCQlhc3luY0xTUlBhcml0eUVycm9yMSAgfAorCQkJCWFzeW5jTFNSQnJlYWtJbnRlcnJ1cHQxICkpICE9IDApIHsKKwkJCW91dGIoYXN5bmNMU1JGcmFtaW5nRXJyb3IxIHwKKwkJCSAgICAgYXN5bmNMU1JPdmVycnVuRXJyb3IxIHwKKwkJCSAgICAgYXN5bmNMU1JQYXJpdHlFcnJvcjEgIHwKKwkJCSAgICAgYXN5bmNMU1JCcmVha0ludGVycnVwdDEsIFVBUlQxX0JBU0UgKyBVQVJUX0xTUik7CisJCX0KKwl9CisJcmV0dXJuICgweDAwMDAwMGZmICYgKGludCkgaW5iKFVBUlQxX0JBU0UpKTsKK30KKworCit2b2lkIGtnZGJfaW50ZXJydXB0aWJsZSAoaW50IHllcykKK3sKKwlyZXR1cm47Cit9CisKKyNlbHNlCS8qICEgKENPTkZJR19LR0RCX1NFUl9JTkRFWCAmIDIpICovCisKK3ZvaWQga2dkYl9zZXJpYWxfaW5pdCAodm9pZCkKK3sKKwlzZXJpYWxfcHJpbnRmICgiW29uIHNlcmlhbF0gIik7Cit9CisKK3ZvaWQgcHV0RGVidWdDaGFyIChpbnQgYykKK3sKKwlzZXJpYWxfcHV0YyAoYyk7Cit9CisKK3ZvaWQgcHV0RGVidWdTdHIgKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzZXJpYWxfcHV0cyAoc3RyKTsKK30KKworaW50IGdldERlYnVnQ2hhciAodm9pZCkKK3sKKwlyZXR1cm4gc2VyaWFsX2dldGMgKCk7Cit9CisKK3ZvaWQga2dkYl9pbnRlcnJ1cHRpYmxlIChpbnQgeWVzKQoreworCXJldHVybjsKK30KKyNlbmRpZgkvKiAoQ09ORklHX0tHREJfU0VSX0lOREVYICYgMikgKi8KKyNlbmRpZgkvKiBDRkdfQ01EX0tHREIgKi8KKwpkaWZmIC0tZ2l0IGEvY3B1L2kzODYvc3RhcnQuUyBiL2NwdS9pMzg2L3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1NTU1YwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9pMzg2L3N0YXJ0LlMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiAgVS1ib290IC0gaTM4NiBTdGFydHVwIENvZGUgCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMglPbWljcm9uIENldGkgQUIsIERhbmllbCBFbmdzdHL2bSA8ZGVuYWllbEBvbWljcm9uLnNlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworCQorLnNlY3Rpb24gLnRleHQKKy5jb2RlMzIKKy5nbG9ibCBfc3RhcnQKKy50eXBlIF9zdGFydCwgQGZ1bmN0aW9uCQorLmdsb2JsIF9pMzg2Ym9vdF9zdGFydAorX2kzODZib290X3N0YXJ0OgorX3N0YXJ0OgkJCisgICAgICAgIG1vdmwgICAgJDB4MTgsJWVheCAgICAgICAgIAkvKiBMb2FkIG91ciBzZWdlbWVudCByZWdpc3RlcywgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZ2R0IGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZCBieSBzdGFydDE2LlMgKi8KKyAgICAgICAgbW92dyAgICAlYXgsJWZzCisJbW92dwklYXgsJWRzCisgICAgICAgIG1vdncgICAgJWF4LCVncworICAgICAgICBtb3Z3ICAgICVheCwlZXMKKyAgICAgICAgbW92dyAgICAlYXgsJXNzCisJCisJLyogV2UgY2FsbCBhIGZldyBmdW5jdGlvbnMgaW4gdGhlIGJvYXJkIHN1cHBvcnQgcGFja2FnZQorCSAqIHNpbmNlIHdlIGhhdmUgbm8gc3RhY2sgeWV0IHdlJ2xsIGhhdmUgdG8gdXNlICVlYnAKKwkgKiB0byBzdG9yZSB0aGUgcmV0dXJuIGFkZHJlc3MgKi8KKwkKKwkvKiBFYXJseSBwbGF0Zm9ybSBpbml0IChzZXR1cCBncGlvLCBldGMgKSAqLworCW1vdiAgICAgJGVhcmx5X2JvYXJkX2luaXRfcmV0LCAlZWJwCisJam1wCWVhcmx5X2JvYXJkX2luaXQKK2Vhcmx5X2JvYXJkX2luaXRfcmV0OgorCQorCS8qIFRoZSBfX3BvcnQ4MCBlbnRyeS1wb2ludCBzaG91bGQgYmUgdXNhYmUgYnkgbm93ICovCisJLyogc28gd2UgdHJ5IHRvIGluZGljYXRlIHByb2dyZXNzICovCisJbW92dwkkMHgwMSwgJWF4ICAgIAorCW1vdmwJJC5wcm9ncmVzczAsICVlYnAKKwlqbXAJX19zaG93X2Jvb3RfcHJvZ3Jlc3MKKy5wcm9ncmVzczA6ICAJCisKKwkvKiBzaXplIG1lbW9yeSAqLworCW1vdgkkbWVtX2luaXRfcmV0LCAlZWJwCisJam1wICAgICBtZW1faW5pdAkJCittZW1faW5pdF9yZXQ6CisJCisJLyogY2hlY2sgYW1tb3VudCBvZiBjb25maWd1cmVkIG1lbW9yeSAKKwkgKiAod2UgbmVlZCBhdGxlYXN0IGJzcyBzdGFydCtic3Mgc2l6ZStzdGFjayBzaXplKSAqLwkJCisJbW92bAkkX2kzODZib290X2Jzc19zdGFydCwgJWVjeCAgICAgICAgLyogQlNTIHN0YXJ0ICovCisJYWRkbAkkX2kzODZib290X2Jzc19zaXplLCAlZWN4ICAgICAgICAgLyogQlNTIHNpemUgKi8JCisJYWRkbAkkQ0ZHX1NUQUNLX1NJWkUsICVlY3gKKwljbXBsCSVlY3gsICVlYXggCisJamFlCW1lbV9vaworCQorCS8qIGluZGljYXRlIChsYWNrIG9mKSBwcm9ncmVzcyAqLworCW1vdncJJDB4ODEsICVheCAgICAKKwltb3ZsCSQucHJvZ3Jlc3MwYSwgJWVicAorCWptcAlfX3Nob3dfYm9vdF9wcm9ncmVzcworLnByb2dyZXNzMGE6ICAJCisJam1wIAlkaWUKK21lbV9vazoJCisKKwkvKiBpbmRpY2F0ZSBwcm9ncmVzcyAqLworCW1vdncJJDB4MDIsICVheCAgICAKKwltb3ZsCSQucHJvZ3Jlc3MxLCAlZWJwCisJam1wCV9fc2hvd19ib290X3Byb2dyZXNzCisucHJvZ3Jlc3MxOiAgCQorCisJLyogY3JlYXRlIGEgc3RhY2sgYWZ0ZXIgdGhlIGJzcyAqLworICAgICAgICBtb3ZsICAgICRfaTM4NmJvb3RfYnNzX3N0YXJ0LCAlZWF4CisJYWRkbAkkX2kzODZib290X2Jzc19zaXplLCAlZWF4CisJYWRkbAkkQ0ZHX1NUQUNLX1NJWkUsICVlYXgKKyAgICAgICAgbW92bCAgICAlZWF4LCAlZXNwCisJCisJcHVzaGwJJDAKKwlwb3BsCSVlYXgKKwljbXBsCSQwLCAlZWF4CisJam5lCW5vX3N0YWNrCisJcHVzaAkkMHg1NWFhNTVhYQorCXBvcGwJJWVieAorCWNtcGwJJDB4NTVhYTU1YWEsICVlYngKKwlqZQlzdGFja19vaworCitub19zdGFjazoKKwkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KKwltb3Z3CSQweDgyLCAlYXggICAgCisJbW92bAkkLnByb2dyZXNzMWEsICVlYnAKKwlqbXAJX19zaG93X2Jvb3RfcHJvZ3Jlc3MKKy5wcm9ncmVzczFhOiAgCQorCWptcCBkaWUKKwkKKwkKK3N0YWNrX29rOgkKKwkvKiBpbmRpY2F0ZSBwcm9ncmVzcyAqLworCW1vdncJJDB4MDMsICVheCAgICAKKwltb3ZsCSQucHJvZ3Jlc3MyLCAlZWJwCisJam1wCV9fc2hvd19ib290X3Byb2dyZXNzCisucHJvZ3Jlc3MyOiAgCQorCisJLyogY29weSBkYXRhIHNlY3Rpb24gdG8gcmFtLCBzaXplIG11c3QgYmUgNC1ieXRlIGFsaWduZWQgKi8KKwltb3ZsCSRfaTM4NmJvb3Rfcm9tZGF0YV9kZXN0LCAlZWRpCSAgLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworIAltb3ZsCSRfaTM4NmJvb3Rfcm9tZGF0YV9zdGFydCwgJWVzaQkgIC8qIHNvdXJjZSBhZGRyZXNzICovCisJbW92bAkkX2kzODZib290X3JvbWRhdGFfc2l6ZSwgJWVjeCAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgKi8KKwltb3ZsCSVlY3gsICVlYXgKKwlhbmRsCSQzLCAlZWF4CisJam56CWRhdGFfZmFpbAorCQorCXNocmwJJDIsICVlY3gJICAgICAgICAgICAgICAgICAgLyogY29weSA0IGJ5dGUgZWFjaCB0aW1lICovCisJY2xkCSAKKwljbXBsCSQwLCAlZWN4CisJamUJZGF0YV9vawkKK2RhdGFfc2VnbWVudDoJCisJbW92c2wJCQorCWxvb3AJZGF0YV9zZWdtZW50CisJam1wCWRhdGFfb2sKK2RhdGFfZmFpbDoKKwkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KKwltb3Z3CSQweDgzLCAlYXggICAgCisJbW92bAkkLnByb2dyZXNzMmEsICVlYnAKKwlqbXAJX19zaG93X2Jvb3RfcHJvZ3Jlc3MKKy5wcm9ncmVzczJhOiAgCQorCWptcCAJZGllCisKK2RhdGFfb2s6CQorCisJLyogaW5kaWNhdGUgcHJvZ3Jlc3MgKi8KKwltb3Z3CSQweDA0LCAlYXggICAgCisJbW92bAkkLnByb2dyZXNzMywgJWVicAorCWptcAlfX3Nob3dfYm9vdF9wcm9ncmVzcworLnByb2dyZXNzMzogIAkKKworCS8qIGNsZWFyIGJzcyBzZWN0aW9uIGluIHJhbSwgc2l6ZSBtdXN0IGJlIDQtYnl0ZSBhbGlnbmVkICAqLworCW1vdmwJJF9pMzg2Ym9vdF9ic3Nfc3RhcnQsICVlYXggICAgICAgIC8qIEJTUyBzdGFydCAqLworCW1vdmwJJF9pMzg2Ym9vdF9ic3Nfc2l6ZSwgJWVjeCAgICAgICAgIC8qIEJTUyBzaXplICovCQorCW1vdmwJJWVjeCwgJWVheAorCWFuZGwJJDMsICVlYXgKKwlqbnoJYnNzX2ZhaWwKKwlzaHJsCSQyLCAlZWN4CSAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIDQgYnl0ZSBlYWNoIHRpbWUgKi8KKwljbGQJCSAgICAgIAorCWNtcGwJJDAsICVlY3gKKwlqZQlic3Nfb2sJCitic3M6CQorCW1vdmwJJDAsICglZWRpKQorCWFkZAkkNCwgJWVkaQkJCQorCWxvb3AJYnNzCisJam1wIAlic3Nfb2sKKworYnNzX2ZhaWw6CisJLyogaW5kaWNhdGUgKGxhY2sgb2YpIHByb2dyZXNzICovCisJbW92dwkkMHg4NCwgJWF4ICAgIAorCW1vdmwJJC5wcm9ncmVzczNhLCAlZWJwCisJam1wCV9fc2hvd19ib290X3Byb2dyZXNzCisucHJvZ3Jlc3MzYTogIAkKKwlqbXAgCWRpZQorCitic3Nfb2s6CQorCisJd2JpbnZkCSAKKworCisJLyogaW5kaWNhdGUgcHJvZ3Jlc3MgKi8KKwltb3Z3CSQweDA1LCAlYXggICAgCisJbW92bAkkLnByb2dyZXNzNCwgJWVicAorCWptcAlfX3Nob3dfYm9vdF9wcm9ncmVzcworLnByb2dyZXNzNDoKKworCWNhbGwJc3RhcnRfaTM4NmJvb3QgIC8qIEVudGVyLCBVLWJvb3QhICovCisKKwkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KKwltb3Z3CSQweDg1LCAlYXggICAgCisJbW92bAkkLnByb2dyZXNzNGEsICVlYnAKKwlqbXAJX19zaG93X2Jvb3RfcHJvZ3Jlc3MKKy5wcm9ncmVzczRhOgorCitkaWU6CWhsdAorCWptcAlkaWUKKwlobHQgICAgICAgICAgICAgICAgICAgICAKKworCmRpZmYgLS1naXQgYS9jcHUvaTM4Ni9zdGFydDE2LlMgYi9jcHUvaTM4Ni9zdGFydDE2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwYTVhNgotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9pMzg2L3N0YXJ0MTYuUwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqICBVLWJvb3QgLSBpMzg2IFN0YXJ0dXAgQ29kZSAKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCU9taWNyb24gQ2V0aSBBQiwgRGFuaWVsIEVuZ3N0cvZtIDxkZW5haWVsQG9taWNyb24uc2U+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworCisjZGVmaW5lIEJPT1RfU0VHCTB4ZmZmZjAwMDAJLyogbGluZWFyIHNlZ21lbnQgb2YgYm9vdCBjb2RlICovCisjZGVmaW5lIGEzMgkJLmJ5dGUgMHg2NzsKKyNkZWZpbmUgbzMyCQkuYnl0ZSAweDY2OworCisuc2VjdGlvbiAuc3RhcnQxNiwgImF4IgorLmNvZGUxNgorLmdsb2JsIHN0YXJ0MTYKK3N0YXJ0MTY6IAorCS8qIEZpcnN0IHdlIGxldCB0aGUgQlNQIGRvIHNvbWUgZWFybHkgaW5pdGlhbGl6YXRpb24KKwkgKiB0aGlzIGNvZGUgaGF2ZSB0byBtYXAgdGhlIGZsYXNoIHRvIGl0cyBmaW5hbCBwb3NpdGlvbgorCSAqLworCW1vdgkkYm9hcmRfaW5pdDE2X3JldCwgJWJwCisJam1wCWJvYXJkX2luaXQxNgorYm9hcmRfaW5pdDE2X3JldDoJCisJCisJLyogVHVybiBvZiBjYWNoZSAodGhpcyBtaWdodCByZXF1aXJlIGEgNDg2LWNsYXNzIENQVSkgKi8KKyAgICAgICAgbW92bCAgICAlY3IwLCAlZWF4CisgICAgICAgIG9ybCAgICAgJDA2MDAwMDAwMCwlZWF4CisgICAgICAgIG1vdmwgICAgJWVheCwgJWNyMAorICAgICAgICB3YmludmQgIAkJICAgICAKKwkKKwkvKiBsb2FkIHRoZSBkZXNjcmlwdG9yIHRhYmxlcyAqLworbzMyIGNzCWxpZHQJaWR0X3B0cgorbzMyIGNzCWxnZHQgICAgZ2R0X3B0cgkJIAorCisKKwkvKiBOb3csIHdlIGVudGVyIHByb3RlY3RlZCBtb2RlICovCisgICAgICAgIG1vdmwgICAgJWNyMCwgJWVheCAgICAgICAgICAgICAgIAorICAgICAgICBvcmwgICAgICQxLCVlYXggICAgICAgICAgICAgICAgICAKKyAgICAgICAgbW92bCAgICAlZWF4LCAlY3IwICAgICAgICAgICAgCisJCisJLyogRmx1c2ggdGhlIHByZWZldGNoIHF1ZXVlICovCisgICAgICAgIGptcCAgICAgZmYgICAgICAgIAorZmY6CisKKwkvKiBGaW5hbGx5IGp1bXAgdG8gdGhlIDMyYml0IGluaXRpYWxpemF0aW9uIGNvZGUgKi8KKwltb3Z3CSRjb2RlMzJzdGFydCwgJWF4IAorICAgICAgICBtb3Z3ICAgICVheCwlYnAKK28zMiBjcwlsam1wCSooJWJwKQorCisJLyogNDgtYml0IGZhciBwb2ludGVyICovCitjb2RlMzJzdGFydDoKKwkubG9uZwlfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCAqLworCS53b3JkCTB4MTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VnbWVudCAqLworCitpZHRfcHRyOgorCS53b3JkCTAJCQkJLyogbGltaXQgKi8KKwkubG9uZwkwCQkgICAgICAgCQkvKiBiYXNlICovCisJCitnZHRfcHRyOgorCS53b3JkCTB4MzAJCQkgICAgICAgIC8qIGxpbWl0ICg0OCBieXRlcyA9IDYgR0RUIGVudHJpZXMpICovCisJLmxvbmcJQk9PVF9TRUcgKyBnZHQJICAgICAgICAJLyogYmFzZSAqLworCisJLyogVGhlIEdEVCB0YWJsZSAuLi4gCisJICoKKwkgKiAgICAgICBTZWxlY3RvcglUeXBlIAorCSAqIAkgMHgwMAkJTlVMTAorCSAqIAkgMHgwOAkJVW51c2VkCisJICoJIDB4MTAJCTMyYml0IGNvZGUgCisJICoJIDB4MTgJCTMyYml0IGRhdGEvc3RhY2sKKwkgKgkgMHgyMAkJMTZiaXQgY29kZQorCSAqCSAweDI4CSAJMTZiaXQgZGF0YS9zdGFjaworCSAqLworCitnZHQ6CisJLndvcmQJMCwgMCwgMCwgMAkJCS8qIE5VTEwgICovCisJLndvcmQJMCwgMCwgMCwgMAkJCS8qIHVudXNlZCAqLworCisJLndvcmQJMHhGRkZGCQkJCS8qIDRHYiAtICgweDEwMDAwMCoweDEwMDAgPSA0R2IpICovCisJLndvcmQJMAkJCQkvKiBiYXNlIGFkZHJlc3MgPSAwICovCisJLndvcmQJMHg5QjAwCQkJCS8qIGNvZGUgcmVhZC9leGVjICovCisJLndvcmQJMHgwMENGCQkJCS8qIGdyYW51bGFyaXR5ID0gNDA5NiwgMzg2ICgrNXRoIG5pYmJsZSBvZiBsaW1pdCkgKi8KKworCS53b3JkCTB4RkZGRgkJCQkvKiA0R2IgLSAoMHgxMDAwMDAqMHgxMDAwID0gNEdiKSAqLworCS53b3JkCTB4MAkJCQkvKiBiYXNlIGFkZHJlc3MgPSAwICovCisJLndvcmQJMHg5MzAwCQkJCS8qIGRhdGEgcmVhZC93cml0ZSAqLworCS53b3JkCTB4MDBDRgkJCQkvKiBncmFudWxhcml0eSA9IDQwOTYsIDM4NiAoKzV0aCBuaWJibGUgb2YgbGltaXQpICovCisJCQkJCQkKKwkud29yZAkweEZGRkYJCQkJLyogNjRrYiAqLworCS53b3JkCTAJCQkJLyogYmFzZSBhZGRyZXNzID0gMCAqLworCS53b3JkCTB4OWIwMAkJCQkvKiBkYXRhIHJlYWQvd3JpdGUgKi8KKwkud29yZAkweDAwMTAJCQkJLyogZ3JhbnVsYXJpdHkgPSAxICAoKzV0aCBuaWJibGUgb2YgbGltaXQpICovCisJCisJLndvcmQJMHhGRkZGCQkJCS8qIDY0a2IgKi8KKwkud29yZAkwCQkJCS8qIGJhc2UgYWRkcmVzcyA9IDAgKi8KKwkud29yZAkweDkzMDAJCQkJLyogZGF0YSByZWFkL3dyaXRlICovCisJLndvcmQJMHgwMDEwCQkJCS8qIGdyYW51bGFyaXR5ID0gMSAoKzV0aCBuaWJibGUgb2YgbGltaXQpICovCmRpZmYgLS1naXQgYS9jcHUvaTM4Ni90aW1lci5jIGIvY3B1L2kzODYvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjNjZDZlCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2kzODYvdGltZXIuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIsIGRhbmllbEBvbWljcm9uLnNlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaTgyNTQuaD4KKyNpbmNsdWRlIDxhc20vaWJtcGMuaD4KKworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBzeXN0ZW1fdGlja3M7CitzdGF0aWMgaW50IHRpbWVyX2luaXRfZG9uZSA9MDsKKworc3RhdGljIHZvaWQgdGltZXJfaXNyKHZvaWQgKnVudXNlZCkKK3sKKwlzeXN0ZW1fdGlja3MrKzsKK30KKwordW5zaWduZWQgbG9uZyBnZXRfc3lzdGVtX3RpY2tzKHZvaWQpCit7CisJcmV0dXJuIHN5c3RlbV90aWNrczsKK30KKworI2RlZmluZSBUSU1FUjBfVkFMVUUgMHgwNGFhIC8qIDFrSHogMS45MzE4TUh6IC8gMTAwMCAqLworI2RlZmluZSBUSU1FUjJfVkFMVUUgMHgwYThlIC8qIDQ0MEh6ICovCisKK2ludCB0aW1lcl9pbml0KHZvaWQpCit7CisJc3lzdGVtX3RpY2tzID0gMDsKKwkKKwlpcnFfaW5zdGFsbF9oYW5kbGVyKDAsIHRpbWVyX2lzciwgTlVMTCk7CisJCisJLyogaW5pdGlhbGl6ZSB0aW1lciAwIGFuZCAyIAorCSAqIAorCSAqIFRpbWVyIDAgaXMgdXNlZCB0byBpbmNyZW1lbnQgc3lzdGVtX3RpY2sgMTAwMCB0aW1lcy9zZWMKKwkgKiBUaW1lciAxIHdhcyB1c2VkIGZvciBEUkFNIHJlZnJlc2ggaW4gZWFybHkgUEMncworCSAqIFRpbWVyIDIgaXMgdXNlZCB0byBkcml2ZSB0aGUgc3BlYWtlcgorCSAqICh0byBzdGFzcnQgYSBiZWVwOiB3cml0ZSAzIHRvIHBvcnQgMHg2MSwKKwkgKiB0byBzdG9wIGl0IGFnYWluOiB3cml0ZSAwKQorCSAqLworCQkKKyAgICAgICAgb3V0YihQSVRfQ01EX0NUUjB8UElUX0NNRF9CT1RIfFBJVF9DTURfTU9ERTIsIFBJVF9CQVNFICsgUElUX0NPTU1BTkQpOworCW91dGIoVElNRVIwX1ZBTFVFJjB4ZmYsIFBJVF9CQVNFICsgUElUX1QwKTsKKwlvdXRiKFRJTUVSMF9WQUxVRT4+OCwgUElUX0JBU0UgKyBQSVRfVDApOworCisgICAgICAgIG91dGIoUElUX0NNRF9DVFIyfFBJVF9DTURfQk9USHxQSVRfQ01EX01PREUzLCBQSVRfQkFTRSArIFBJVF9DT01NQU5EKTsKKwlvdXRiKFRJTUVSMl9WQUxVRSYweGZmLCBQSVRfQkFTRSArIFBJVF9UMik7CisJb3V0YihUSU1FUjJfVkFMVUU+PjgsIFBJVF9CQVNFICsgUElUX1QyKTsKKworCXRpbWVyX2luaXRfZG9uZSA9IDE7CisJCisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIENGR19USU1FUl9HRU5FUklDCisKKy8qIHRoZSB1bml0IGZvciB0aGVzZSBpcyBDRkdfSFogKi8KKworLyogRml4TWU6IGltcGxlbWVudCB0aGVzZSAqLwordm9pZCByZXNldF90aW1lciAodm9pZCkKK3sKKwlzeXN0ZW1fdGlja3MgPSAwOworfQorCit1bG9uZyBnZXRfdGltZXIgKHVsb25nIGJhc2UpCit7CisJcmV0dXJuIChzeXN0ZW1fdGlja3MgLSBiYXNlKTsKK30KKwordm9pZCBzZXRfdGltZXIgKHVsb25nIHQpCQoreworCXN5c3RlbV90aWNrcyA9IHQ7Cit9CisKK3N0YXRpYyB1MTYgcmVhZF9waXQodm9pZCkKK3sKKwl1OCBsb3c7CisJb3V0YihQSVRfQ01EX0xBVENILCBQSVRfQkFTRSArIFBJVF9DT01NQU5EKTsKKwlsb3cgPSBpbmIoUElUX0JBU0UgKyBQSVRfVDApOworCXJldHVybiAoKGluYihQSVRfQkFTRSArIFBJVF9UMCkgPDwgOCkgfCBsb3cpOworfQorCisvKiB0aGlzIGlzIG5vdCB2ZXJ5IGV4YWN0ICovCit2b2lkIHVkZWxheSAodW5zaWduZWQgbG9uZyB1c2VjKQorewkKKwlpbnQgY291bnRlcjsKKwlpbnQgd3JhcHM7CisJCisJaWYgKCF0aW1lcl9pbml0X2RvbmUpIHsKKwkJcmV0dXJuOworCX0KKwljb3VudGVyID0gcmVhZF9waXQoKTsKKwl3cmFwcyA9IHVzZWMvMTAwMDsKKwl1c2VjID0gdXNlYyUxMDAwOworCQorCXVzZWMqPTExOTQ7CisJdXNlYy89MTAwMDsKKwl1c2VjKz1jb3VudGVyOyAKKwlpZiAodXNlYyA+IDExOTQpIHsKKwkJdXNlYy09MTE5NDsKKwkJd3JhcHMrKzsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlpbnQgbmV3X2NvdW50ID0gcmVhZF9waXQoKTsKKwkJCisJCWlmICgoKG5ld19jb3VudCA8IHVzZWMpICYmICF3cmFwcykgfHwgd3JhcHMgPCAwKSB7CisJCQlicmVhazsKKwkJfQorCQkKKwkJaWYgKG5ld19jb3VudCA+IGNvdW50ZXIpIHsKKwkJCXdyYXBzLS07CisJCX0KKwkJY291bnRlciA9IG5ld19jb3VudDsKKwl9CisJCit9CisKKyNpZiAwCisvKiB0aGlzIGlzIGEgdmVyc2lvbiB3aXRoIGRlYnVnIG91dHB1dCAqLwordm9pZCBfdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWMpCit7CQorCWludCBjb3VudGVyOworCWludCB3cmFwczsKKwkKKwlpbnQgdXNlYzEsIHVzZWMyLCB1c2VjMzsKKwlpbnQgd3JhcHMxLCB3cmFwczIsIHdyYXBzMywgd3JhcHM0OworCWludCBjdHIxLCBjdHIyLCBjdHIzLCBuY3QxLCBuY3QyOworCWludCBpOworCXVzZWMxPXVzZWM7CisJaWYgKCF0aW1lcl9pbml0X2RvbmUpIHsKKwkJcmV0dXJuOworCX0KKwljb3VudGVyID0gcmVhZF9waXQoKTsKKwljdHIxID0gY291bnRlcjsKKwl3cmFwcyA9IHVzZWMvMTAwMDsKKwl1c2VjID0gdXNlYyUxMDAwOworCQorCXVzZWMyID0gdXNlYzsKKwl3cmFwczEgPSB3cmFwczsKKwkKKwl1c2VjKj0xMTk0OworCXVzZWMvPTEwMDA7CisJdXNlYys9Y291bnRlcjsgCisJaWYgKHVzZWMgPiAxMTk0KSB7CisJCXVzZWMtPTExOTQ7CisJCXdyYXBzKys7CisJfQorCisJdXNlYzMgPSB1c2VjOworCXdyYXBzMiA9IHdyYXBzOworCQorCWN0cjIgPSB3cmFwczMgPSBuY3QxID0gNDcxMTsKKwljdHIzID0gd3JhcHM0ID0gbmN0MiA9IDQ3MTE7CisJaT0wOworCXdoaWxlICgxKSB7CisJCWludCBuZXdfY291bnQgPSByZWFkX3BpdCgpOworCQlpKys7CisJCWlmICgobmV3X2NvdW50IDwgdXNlYyAmJiAhd3JhcHMpIHx8IHdyYXBzIDwgMCkgeworCQkJYnJlYWs7CisJCX0KKwkJCisJCWlmIChuZXdfY291bnQgPiBjb3VudGVyKSB7CisJCQl3cmFwcy0tOworCQl9CisJCWlmIChjdHIyPT00NzExKSB7CisJCQljdHIyID0gY291bnRlcjsKKwkJCXdyYXBzMyA9IHdyYXBzOworCQkJbmN0MSA9IG5ld19jb3VudDsKKwkJfSBlbHNlIHsKKwkJCWN0cjMgPSBjb3VudGVyOworCQkJd3JhcHM0ID0gd3JhcHM7CisJCQluY3QyID0gbmV3X2NvdW50OworCQl9CisJCQorCQljb3VudGVyID0gbmV3X2NvdW50OworCX0KKwkKKwlwcmludGYoInVkZWxheSglZClcbiIsIHVzZWMxKTsKKwlwcmludGYoImNvdW50ZXIgJWRcbiIsIGN0cjEpOworCXByaW50ZigiMTogd3JhcHMgJWQsIHVzZWMgJWRcbiIsIHdyYXBzMSwgdXNlYzIpOworCXByaW50ZigiMjogd3JhcHMgJWQsIHVzZWMgJWRcbiIsIHdyYXBzMiwgdXNlYzMpOworCXByaW50ZigibmV3X2NvdW50WzBdICVkIGNvdW50ZXIgJWQgd3JhcHMgJWRcbiIsIG5jdDEsIGN0cjIsIHdyYXBzMyk7CisJcHJpbnRmKCJuZXdfY291bnRbJWRdICVkIGNvdW50ZXIgJWQgd3JhcHMgJWRcbiIsIGksIG5jdDIsIGN0cjMsIHdyYXBzNCk7CisKKwlwcmludGYoIiVkICVkICVkICVkICVkXG4iLAorCSAgICAgICByZWFkX3BpdCgpLCByZWFkX3BpdCgpLCByZWFkX3BpdCgpLAorCSAgICAgICByZWFkX3BpdCgpLCByZWFkX3BpdCgpKTsKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLWkzODYgYi9kb2MvUkVBRE1FLWkzODYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliM2UxOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUtaTM4NgpAQCAtMCwwICsxLDc0IEBACitUaGlzIGlzIG15IGF0dGVtcHQgdG8gcG9ydCBQUENCb290IHRvIHRoZSBpMzg2IHBsYXRmb3JtLiBUaGlzCit3b3JrIHdhcyBzcG9uc29yZWQgYnkgbXkgZW1wbHllciwgT21pY3JvbiBDZXRpIEFCLiBodHRwOi8vd3d3Lm9taWNyb24uc2UKKworSXQgaXMgY3VycmVudGx5IGNhcGFibGUgb2YgYm9vdGluZyBhIGxpbnV4IGJ6SW1hZ2UgZnJvbSBmbGFzaCBvbgordGhlIEFNRCBTQzUyMCBDRFAgcGxhdGZvcm0uCisKK0l0IHdhcyBvcmlnaW5hbGx5IGJhc2VkIG9uIFBQQ0Jvb3QgdGFrZW4gZnJvbSB0aGUgQ1ZTIE9jdG9iZXIgMjggMjAwMi4gIAorCitUbyBjb21waWxlOgorCisxKSBVbnBhY2sgdGhlIHNvdXJjZSB0cmVlLCBlaXRoZXIgZnJvbSB0aGUgY29tcGxldGUgdGFyYmFsbCBvcgorICAgZnJvbSB0aGUgdmlyZ2luIHNuYXBzaG90ICsgdGhlIHBhdGNoCisgICAKKzIpIENvbmZpZ3VyZSB0aGUgc291cmNlCisgICAkIG1ha2Ugc2M1MjBfY2RwX2NvbWZpZworICAgJCBtYWtlCisgICAKK1RvIHVzZSB0aGlzIGNvZGUgb24gdGhlIENEUDoKKzEpIE1ha2UgYSBzdWl0YWJsZSBrZXJuZWwsIEkgdXNlZCAyLjQuMTkgd2l0aCB0aGUgbXRkLXN1cHBvcnQgdXBkYXRlZAorICAgZnJvbSB0aGUgTVREIENWUyBhbmQgYSBwYXRjaCB0byBhbGxvdyByb290PS9kZXYvbXRkYmxvY2sxIHdoaWNoIEkKKyAgIGluY2x1ZGVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLiAKKyAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBpbiB0aGUgTVREIHNlY3Rpb24gbWlnaHQgYmUgdXNlZnVsOgorICAgCisgICBDT05GSUdfTVREX1BIWVNNQVA9eQorICAgQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTM4MTAwMDAwCisgICBDT05GSUdfTVREX1BIWVNNQVBfTEVOPTdhMDAwMAorICAgQ09ORklHX01URF9QSFlTTUFQX0JVU1dJRFRIPTIKKworCisyKSBQcm9ncmFtIGl0IGluIHRvIHRoZSBDRFAgZmxhc2hiYW5rIHdpdGggcmVtb24KKyAgIHBwY2Jvb3QuYmluIHNob3VsZCBiZSBwcm9ncmFtbWVkIGF0dCBvZmZzZXQgMHg3ZTAwMCBhbmQgdGhlIGtlcm5lbCBhdAorICAgb2Zmc2V0IDAuIElmIHlvdSB3YW50IHRvIHVzZSBhIGpmZnMyIHJvb3QgZmlsZSBzeXN0ZW0gKG5vdCBpbmNsdWRlZCBoZXJlKSwgCisgICBpdCBzaG91bGQgYmUgIHByb2dyYW1tZWQgdG8gb2Zmc2V0IDB4MTAwMDAwLgorICAgCisgICByZW1vbj4gegorICAgcmVtb24+IHlpCisgICByZW1vbj4gbnMgcHBjYm9vdC5iaW4gN2UwMDAwCisgICByZW1vbj4gbnMgYnpJbWFnZSAwCisgICByZW1vbj4gbnMgaW1hZ2UuamZmczIgMTAwMDAwCisKKzMpIENvbm5lY3QgYSB0ZXJtaW5hbCB0byB0aGUgMjVwaW4gc2VyaWFsIHBvcnQgYXQgOTYwMGJwcywgYW5kIHN0YXJ0IHRoZSBDRFAuCisgICAKKyAgIHJlbW9uPiB6CisgICByZW1vbj4gZworCis0KSBQUENib290IHNob3VsZCBvdXRwdXQgc29tZSBtZXNzYWdlIGFuZCBhIHByb21wdCBvbiB0aGUgdGVybWluYWwsIHRvCisgICBzdGFydCB0aGUga2VybmVsIGlzc3VlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKyAgIAorICAgQk9PVD4gYm9vdG0KKyAgIAorNSkgVGhlIGtlcm5lbCBzaG91bGQgYm9vdCwgYW5kIG1vdW50IHRoZSByb290IGZpbGVzeXN0ZW0gaWYgcHJlc2VudC4KKworV2UgaG9wZSB5b3UgZmluZCB0aGlzIHN0dWZmIHVzZWZ1bAorRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIsIGRhbmllbEBvbWljcm9uLnNlCisKKworCistLS0gbGludXgtMi40LjE5LW9yaWcvaW5pdC9kb19tb3VudHMuYwlTYXQgQXVnICAzIDAyOjM5OjQ2IDIwMDIKKysrKyBsaW51eC0yLjQuMTkvaW5pdC9kb19tb3VudHMuYwlNb24gU2VwIDIzIDE2OjIxOjMzIDIwMDIKK0BAIC0yMjQsNiArMjI0LDE0IEBACisgCXsgImZ0bGMiLCAweDJjMTAgfSwKKyAJeyAiZnRsZCIsIDB4MmMxOCB9LAorIAl7ICJtdGRibG9jayIsIDB4MWYwMCB9LAorKwl7ICJtdGRibG9jazAiLCAweDFmMDAgfSwKKysJeyAibXRkYmxvY2sxIiwgMHgxZjAxIH0sCisrCXsgIm10ZGJsb2NrMiIsIDB4MWYwMiB9LAorKwl7ICJtdGRibG9jazMiLCAweDFmMDMgfSwKKysJeyAibXRkYmxvY2s0IiwgMHgxZjA0IH0sCisrCXsgIm10ZGJsb2NrNSIsIDB4MWYwNSB9LAorKwl7ICJtdGRibG9jazYiLCAweDFmMDYgfSwKKysJeyAibXRkYmxvY2s3IiwgMHgxZjA3IH0sCisgCXsgTlVMTCwgMCB9CisgfTsKKyAKZGlmZiAtLWdpdCBhL2RvYy9UT0RPLWkzODYgYi9kb2MvVE9ETy1pMzg2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjljYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvVE9ETy1pMzg2CkBAIC0wLDAgKzEsMzkgQEAKK2kzODYgcG9ydCBtaXNzaW5nIGZlYXR1cmVzOgorKiBpMzg2IGNsZWFuZXNzICh3YmludmxkIGlzIDQ4NisgLi4uICkKKyogUGVudGl1bSBUU0MgdGltZXIvdWRlbGF5CisqIHNldHVwIHRoZSBCSU9TIGRhdGEgYXJlYSBhbmQgQklPUyBlcXVpcG1lbnQgd29yZCB0byByZWZsZWN0IG1hY2hpbmUgY29uZmlnLiAKKyogTWFrZSByZXNldCB3b3JrIChmcm9tIExpbnV4IGFuZCBmcm9tIHRoZSBib290IHByb21wdCkKKyogRE1BLCBGREMsIFJUQywgS0JDIGluaXRpYWxpemF0aW9uCisqIHZpZGVvIGNhcmQgc3VwcG9ydCAoY2FsbCBCSU9TIHRvIGluaXRpYWxpemUsIHVzZSBoZWxwZXIgcm91dHJpbmUgaW4gQlNQIHRvIHNoYWRvdyAKKyAgdmlkZW8gcm9tIGlmIG9uIHBjaSkgYW5kIFBDIGtleWJvYXJkCisqIHNwbGl0IG9mIHBhcnQgb2YgY3B1L2kzODYvaW50ZXJydXB0LmMgdG8gY3B1L2kzODUvZW50cnkuYz8KKyogcmUtZW50cnkgb2YgcHJvdGVjdGVkIG1vZGUgZnJvbSByZWFsIG1vZGUsIHNob3VsZCBiZSBhZGRlZCB0byByZWFsbW9kZV9zd2l0Y2guUyAKKyAgKGFuZCB1c2VkIGJ5IElOVCAxMGggYW5kIElOVCAxNmggaGFuZGxlcnMgZm9yIGNvbnNvbGUgSS9PIGR1cmluZyBlYXJseQorICAgbGludXggYm9vdC4uLikgCisqIG1pc3NpbmcgZnVuY3Rpb25zIGluIGxpYl9pMzg2IGFuZCBjcHUvaTM4NgorKiBzcGVha2VyIGJlZXAgaW50ZXJmYWNlCisKK2kzODYgcG9ydCBidWdzOgorKiBJREUgZG9lcyBub3Qgd29yayAKKworU0M1MjAgbWlzc2luZyBmZWF0dXJlczoKKyogV2F0Y2hkb2cKKyogU0M1MjAgdGltZXIvdWRlbGF5CisqIFNDNTIwIDNyZCBQSUMKKyogU0M1MjAgSUNFIHNlcmlhbAorKiBTQzUyMCBNTUNSIHJlc2V0IAorCitTQzUyMCBDRFAgYm9hcmQgc3VwcG9ydCBtaXNzaW5nIGZlYXR1cmVzOgorKiBTeW5jaHJvbml1cyBzZXJpYWwgcG9ydCBhbmQgc2VyaWVsIEVFUFJPTQorKiBlbnZpcm9ubWVudCBpbiBTRUVQCisqIGVudmlyb25tZW50IGluIGZsYXNoCisqIGVudmlyb25tZW50IGluIHNyYW0KKyogc3RhdHVzIExFRCA/CisqIGZsYXNoIGRyaXZlcgorCitTQzUyMCBDRFAgYm9hcmQgc3VwcG9ydCBidWdzOgorKiAweDY4MCBMRURTIGRvcyBub3Qgd29yayBmb3IgbWUKKyogaXMgaXQgcG9zc2libGUgdG8gbWFrZSBib3RoIHRoZSBpbnRlcm5hbCBzZXJpYWwgcG9ydHMgYW5kIHRoZSAKKyAgcG9ydHMgb24gdGhlIHNpbyB3b3JrIGF0IHRoZSBzYW1lIHRpbWU/CisqIGFsaSBzaW8gY2lvIGxpbmVzPworKiBPbi1ib3JhZCBldGhlcm5ldCBkb2VzIG5vdCB3b3JrIGZyb20gTGludXgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNuZXQuYyBiL2RyaXZlcnMvcGNuZXQuYwppbmRleCBmNjljZDJjLi4xYmE3ZDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbmV0LmMKKysrIGIvZHJpdmVycy9wY25ldC5jCkBAIC0yODgsOCArMjg4LDggQEAKIAl1bnNpZ25lZCBpbnQgdmFsOwogCXZhbCA9IHBjbmV0X3JlYWRfY3NyKGRldiwgaSsxMikgJiAweDBmZmZmOwogCS8qIFRoZXJlIG1heSBiZSBlbmRpYW5uZXNzIGlzc3VlcyBoZXJlLiAqLwotCWRldi0+ZGV2X2FkZHJbMippXSA9IHZhbCAmIDB4MGZmOwotCWRldi0+ZGV2X2FkZHJbMippKzFdID0gKHZhbCA+PiA4KSAmIDB4MGZmOworCWRldi0+ZW5ldGFkZHJbMippICBdID0gIHZhbCAgICAgICAmIDB4MGZmOworCWRldi0+ZW5ldGFkZHJbMippKzFdID0gKHZhbCA+PiA4KSAmIDB4MGZmOwogICAgIH0KICNlbmRpZiAvKiBQQ05FVF9IQVNfUFJPTSAqLwogCkBAIC0zNDksNyArMzQ5LDcgQEAKIAlscC0+cnhfcmluZ1tpXS5iYXNlID0gUENJX1RPX01FTV9MRShkZXYsIGxwLT5yeF9idWZbaV0pOwogCWxwLT5yeF9yaW5nW2ldLmJ1Zl9sZW5ndGggPSBjcHVfdG9fbGUxNigtUEtUX0JVRl9TWik7CiAJbHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gY3B1X3RvX2xlMTYoMHg4MDAwKTsKLQlERUJVRzEoIlJ4JWQ6IGJhc2U9MHgleCBidWZfbGVuZ3RoPTB4JXggc3RhdHVzPTB4JXhcbiIsCisJREVCVUcxKCJSeCVkOiBiYXNlPTB4JXggYnVmX2xlbmd0aD0weCVoeCBzdGF0dXM9MHglaHhcbiIsCiAJICAgICAgIGksIGxwLT5yeF9yaW5nW2ldLmJhc2UsIGxwLT5yeF9yaW5nW2ldLmJ1Zl9sZW5ndGgsCiAJICAgICAgIGxwLT5yeF9yaW5nW2ldLnN0YXR1cyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3lzY2FsbC5TIGIvZXhhbXBsZXMvc3lzY2FsbC5TCmluZGV4IDllODcyNWUuLjk5MzQ0OTAgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3N5c2NhbGwuUworKysgYi9leGFtcGxlcy9zeXNjYWxsLlMKQEAgLTM4LDEyICszOCwyNiBAQAogCXN1YiAgICAgZnAsIGlwLCAjNAogCWxkbWVhICAgZnAsIHtmcCwgc3AsIHBjfQogI2Vsc2UgLyogWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYICovCisKKyNpZmRlZiBDT05GSUdfSTM4NiAvKiBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggKi8KKyNkZWZpbmUgU1lNQk9MX05BTUUoWCkgCVgKKyNkZWZpbmUgU1lNQk9MX05BTUVfTEFCRUwoWCkgCVgjIzoKKwkKKyNkZWZpbmUgU1lTQ0FMTChuYW1lLG4pIFwKKwkuZ2xvYmwgU1lNQk9MX05BTUUobmFtZSkgOyBcCitTWU1CT0xfTkFNRV9MQUJFTChuYW1lKSAgICAgCQkgOyBcCisJcmV0CisKKyNlbmRpZgkvKiBDT05GSUdfSTM4NiAqLworCisjaWZkZWYgQ09ORklHX1BQQwogI2RlZmluZSBTWVNDQUxMKG5hbWUsbikgXAogCS5nbG9ibCBuYW1lCQk7IFwKIG5hbWU6CQkJCTsgXAogCWxpIHIwLG4JCQk7IFwKIAlzYwkJCTsgXAogCWJscgorI2VuZGlmCS8qIENPTkZJR19QUEMgKi8KIAogCS50ZXh0CiAKZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGUKaW5kZXggOWVkMGYxZS4uYWQ3NDk0MiAxMDA2NDQKLS0tIGEvZnMvTWFrZWZpbGUKKysrIGIvZnMvTWFrZWZpbGUKQEAgLTIyLDcgKzIyLDcgQEAKICMKICMKIAotU1VCRElSUwk6PSBqZmZzMgorU1VCRElSUwk6PSBqZmZzMiBmZG9zCiAKIC5kZXBlbmQgYWxsOgogCUBmb3IgZGlyIGluICQoU1VCRElSUykgOyBkbyBcCmRpZmYgLS1naXQgYS9mcy9mZG9zL01ha2VmaWxlIGIvZnMvZmRvcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjBmZmYxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZmRvcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQ5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBTdOR1YmxpIEZhdmVyZ2VzIC0gPHd3dy5zdGF1YmxpLmNvbT4KKyMgUGllcnJlIEFVQkVSVCAgcC5hdWJlcnRAc3RhdWJsaS5jb20KKyMKKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9IGxpYmZkb3MuYQorCitBT0JKUwk9CitDT0JKUwk9IGZhdC5vIHZmYXQubyBkZXYubyBmZG9zLm8gZnMubyBzdWJkaXIubyAKK09CSlMJPSAkKEFPQkpTKSAkKENPQkpTKQorCisjQ1BQRkxBR1MgKz0KKworYWxsOgkkKExJQikgJChBT0JKUykKKworJChMSUIpOgkuZGVwZW5kICQoT0JKUykKKwkkKEFSKSBjcnYgJEAgJChPQkpTKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLmRlcGVuZDoJTWFrZWZpbGUgJChBT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKKwkJJChDQykgLU0gJChDRkxBR1MpICQoQU9CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpID4gJEAKKworc2luY2x1ZGUgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mcy9mZG9zL2Rldi5jIGIvZnMvZmRvcy9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzhkMDdkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZmRvcy9kZXYuYwpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3TkdWJsaSBGYXZlcmdlcyAtIDx3d3cuc3RhdWJsaS5jb20+CisgKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgImRvcy5oIgorI2luY2x1ZGUgImZkb3MuaCIKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpCisKKyNkZWZpbmUgTkJfSEVBRFMgICAgICAgIDIKKyNkZWZpbmUgTkJfVFJBQ0tTICAgICAgIDgwCisjZGVmaW5lIE5CX1NFQ1RPUlMgICAgICAxOAorCisKK3N0YXRpYyBpbnQgbGFzdHdoZXJlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkZXZfb3BlbiAtLSAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IGRldl9vcGVuICh2b2lkKQoreworICAgIGxhc3R3aGVyZSA9IDA7CisgICAgcmV0dXJuICgwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZGV2X3JlYWQgLS0gbGVuIGFuZCB3aGVyZSBhcmUgc2VjdG9ycyBudW1iZXIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IGRldl9yZWFkICh2b2lkICpidWZmZXIsIGludCB3aGVyZSwgaW50IGxlbikKK3sKKyAgICBQUklOVEYgKCJkZXZfcmVhZCAobGVuID0gJWQsIHdoZXJlID0gJWQpXG4iLCBsZW4sIHdoZXJlKTsKKworICAgIC8qIFNpIG9uIG5lIGRlc2lyZSBwYXMgbGlyZSBhIGxhIHBvc2l0aW9uIGNvdXJhbnRlLCBpbCBmYXV0IHVuIHNlZWsgICAgICAqLworICAgIGlmICh3aGVyZSAhPSBsYXN0d2hlcmUpIHsKKyAgICAgICAgaWYgKCFmZGNfZmRvc19zZWVrICh3aGVyZSkpIHsKKyAgICAgICAgICAgIFBSSU5URiAoInNlZWsgZXJyb3IgaW4gZGV2X3JlYWQiKTsKKyAgICAgICAgICAgIGxhc3R3aGVyZSA9IC0xOworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCFmZGNfZmRvc19yZWFkIChidWZmZXIsIGxlbikpIHsKKyAgICAgICAgUFJJTlRGICgicmVhZCBlcnJvclxuIik7CisgICAgICAgIGxhc3R3aGVyZSA9IC0xOworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisgICAgbGFzdHdoZXJlID0gd2hlcmUgKyBsZW47CisgICAgcmV0dXJuICgwKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNoZWNrX2RldiAtLSB2ZXJpZnkgdGhlIGRpc2tldHRlIGZvcm1hdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgY2hlY2tfZGV2IChCb290U2VjdG9yX3QgKmJvb3QsIEZzX3QgKmZzKQoreworICAgIHVuc2lnbmVkIGludCBoZWFkcywgc2VjdG9ycywgdHJhY2tzOworICAgIGludCBCb290UCwgSW5mcDAsIEluZnBYLCBJbmZUbTsKKyAgICBpbnQgc2VjdF9wZXJfdHJhY2s7CisKKyAgICAvKiBEaXNwbGF5IEJvb3QgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBQUklOVEYgKCJKdW1wIHRvIGJvb3QgY29kZSAgICAgICAgICAgICAgICAgIDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAorICAgICAgICAgICAgYm9vdCAtPiBqdW1wIFswXSwgYm9vdCAtPiBqdW1wIFsxXSwgYm9vdCAtPiBqdW1wWzJdKTsKKyAgICBQUklOVEYgKCJPRU0gbmFtZSAmIHZlcnNpb24gICAgICAgICAgICAgICAgICclKi4qcydcbiIsCisgICAgICAgICAgICBCQU5ORVJfTEcsIEJBTk5FUl9MRywgYm9vdCAtPiBiYW5uZXIgKTsKKyAgICBQUklOVEYgKCJCeXRlcyBwZXIgc2VjdG9yIGhvcGVmdWxseSA1MTIgICAgICVkXG4iLAorICAgICAgICAgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBzZWNzaXopKTsKKyAgICBQUklOVEYgKCJDbHVzdGVyIHNpemUgaW4gc2VjdG9ycyAgICAgICAgICAgICVkXG4iLAorICAgICAgICAgICAgYm9vdCAtPiBjbHNpeik7CisgICAgUFJJTlRGICgiTnVtYmVyIG9mIHJlc2VydmVkIChib290KSBzZWN0b3JzICAlZFxuIiwKKyAgICAgICAgICAgIF9fbGUxNl90b19jcHUgKGJvb3QgLT4gbnJzdnNlY3QpKTsKKyAgICBQUklOVEYgKCJOdW1iZXIgb2YgRkFUIHRhYmxlcyBob3BlZnVsbHkgMiAgICVkXG4iLAorICAgICAgICAgICAgYm9vdCAtPiBuZmF0KTsKKyAgICBQUklOVEYgKCJOdW1iZXIgb2YgZGlyZWN0b3J5IHNsb3RzICAgICAgICAgICVkXG4iLAorICAgICAgICAgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBkaXJlbnRzKSk7CisgICAgUFJJTlRGICgiVG90YWwgc2VjdG9ycyBvbiBkaXNrICAgICAgICAgICAgICAlZFxuIiwKKyAgICAgICAgICAgIF9fbGUxNl90b19jcHUgKGJvb3QgLT4gcHNlY3QpKTsKKyAgICBQUklOVEYgKCJNZWRpYSBkZXNjcmlwdG9yPWZpcnN0IGJ5dGUgb2YgRkFUICVkXG4iLAorICAgICAgICAgICAgYm9vdCAtPiBkZXNjcik7CisgICAgUFJJTlRGICgiU2VjdG9ycyBpbiBGQVQgICAgICAgICAgICAgICAgICAgICAlZFxuIiwKKyAgICAgICAgICAgIF9fbGUxNl90b19jcHUgKGJvb3QgLT4gZmF0bGVuKSk7CisgICAgUFJJTlRGICgiU2VjdG9ycy90cmFjayAgICAgICAgICAgICAgICAgICAgICAlZFxuIiwKKyAgICAgICAgICAgIF9fbGUxNl90b19jcHUgKGJvb3QgLT4gbnNlY3QpKTsKKyAgICBQUklOVEYgKCJIZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVkXG4iLAorICAgICAgICAgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBuaGVhZHMpKTsKKyAgICBQUklOVEYgKCJudW1iZXIgb2YgaGlkZGVuIHNlY3RvcnMgICAgICAgICAgICVkXG4iLAorICAgICAgICAgICAgX19sZTMyX3RvX2NwdSAoYm9vdCAtPiBuaHMpKTsKKyAgICBQUklOVEYgKCJiaWcgdG90YWwgc2VjdG9ycyAgICAgICAgICAgICAgICAgICVkXG4iLAorICAgICAgICAgICAgX19sZTMyX3RvX2NwdSAoYm9vdCAtPiBiaWdzZWN0KSk7CisgICAgUFJJTlRGICgicGh5c2ljYWwgZHJpdmUgPyAgICAgICAgICAgICAgICAgICAlZFxuIiwKKyAgICAgICAgICAgIGJvb3QgLT4gcGh5c2RyaXZlKTsKKyAgICBQUklOVEYgKCJyZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICVkXG4iLAorICAgICAgICAgICAgYm9vdCAtPiByZXNlcnZlZCk7CisgICAgUFJJTlRGICgiZG9zID4gNC4wIGRpc2tldHRlICAgICAgICAgICAgICAgICAlZFxuIiwKKyAgICAgICAgICAgIGJvb3QgLT4gZG9zNCk7CisgICAgUFJJTlRGICgic2VyaWFsIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAlZFxuIiwKKyAgICAgICAgICAgIF9fbGUzMl90b19jcHUgKGJvb3QgLT4gc2VyaWFsKSk7CisgICAgUFJJTlRGICgiZGlzayBsYWJlbCAgICAgICAgICAgICAgICAgICAgICAgICAlKi4qc1xuIiwKKyAgICAgICAgICAgIExBQkVMX0xHLCBMQUJFTF9MRywgYm9vdCAtPiBsYWJlbCk7CisgICAgUFJJTlRGICgiRkFUIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAlOC44c1xuIiwKKyAgICAgICAgICAgIGJvb3QgLT4gZmF0X3R5cGUpOworICAgIFBSSU5URiAoInJlc2VydmVkIGJ5IDJNICAgICAgICAgICAgICAgICAgICAgJWRcbiIsCisgICAgICAgICAgICBib290IC0+IHJlc18ybSk7CisgICAgUFJJTlRGICgiMk0gY2hlY2tzdW0gKG5vdCB1c2VkKSAgICAgICAgICAgICAlZFxuIiwKKyAgICAgICAgICAgIGJvb3QgLT4gQ2hlY2tTdW0pOworICAgIFBSSU5URiAoIjJNRiBmb3JtYXQgdmVyc2lvbiAgICAgICAgICAgICAgICAgJWRcbiIsCisgICAgICAgICAgICBib290IC0+IGZtdF8ybWYpOworICAgIFBSSU5URiAoIjEgaWYgd3JpdGUgdHJhY2sgYWZ0ZXIgZm9ybWF0ICAgICAgJWRcbiIsCisgICAgICAgICAgICBib290IC0+IHd0KTsKKyAgICBQUklOVEYgKCJkYXRhIHRyYW5zZmVyIHJhdGUgb24gdHJhY2sgMCAgICAgICVkXG4iLAorICAgICAgICAgICAgYm9vdCAtPiByYXRlXzApOworICAgIFBSSU5URiAoImRhdGEgdHJhbnNmZXIgcmF0ZSBvbiB0cmFjazw+MCAgICAgJWRcbiIsCisgICAgICAgICAgICBib290IC0+IHJhdGVfYW55KTsKKyAgICBQUklOVEYgKCJvZmZzZXQgdG8gYm9vdCBwcm9ncmFtICAgICAgICAgICAgICVkXG4iLAorICAgICAgICAgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBCb290UCkpOworICAgIFBSSU5URiAoIlQxOiBpbmZvcm1hdGlvbiBmb3IgdHJhY2sgMCAgICAgICAgJWRcbiIsCisgICAgICAgICAgICBfX2xlMTZfdG9fY3B1IChib290IC0+IEluZnAwKSk7CisgICAgUFJJTlRGICgiVDI6IGluZm9ybWF0aW9uIGZvciB0cmFjazw+MCAgICAgICAlZFxuIiwKKyAgICAgICAgICAgIF9fbGUxNl90b19jcHUgKGJvb3QgLT4gSW5mcFgpKTsKKyAgICBQUklOVEYgKCJUMzogdHJhY2sgc2VjdG9ycyBzaXplIHRhYmxlICAgICAgICVkXG4iLAorICAgICAgICAgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBJbmZUbSkpOworICAgIFBSSU5URiAoIkZvcm1hdCBkYXRlICAgICAgICAgICAgICAgICAgICAgICAgMHglMDR4XG4iLAorICAgICAgICAgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBEYXRlRikpOworICAgIFBSSU5URiAoIkZvcm1hdCB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgMHglMDR4XG4iLAorICAgICAgICAgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBUaW1lRikpOworICAgIAorCisgICAgLyogaW5mb3JtYXRpb25zIGFyZSBleHRyYWN0ZWQgZnJvbSBib290IHNlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaGVhZHMgPSBfX2xlMTZfdG9fY3B1IChib290IC0+IG5oZWFkcyk7CisgICAgc2VjdG9ycyA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gbnNlY3QpOworICAgIGZzIC0+IHRvdF9zZWN0b3JzID0gX19sZTMyX3RvX2NwdSAoYm9vdCAtPiBiaWdzZWN0KTsKKyAgICBpZiAoX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBwc2VjdCkgIT0gMCkgeworICAgICAgICBmcyAtPiB0b3Rfc2VjdG9ycyA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gcHNlY3QpOworICAgIH0KKyAgICAKKyAgICBzZWN0X3Blcl90cmFjayA9IGhlYWRzICogc2VjdG9yczsKKyAgICB0cmFja3MgPSAoZnMgLT4gdG90X3NlY3RvcnMgKyBzZWN0X3Blcl90cmFjayAtIDEpIC8gc2VjdF9wZXJfdHJhY2s7CisgICAgCisgICAgQm9vdFAgPSBfX2xlMTZfdG9fY3B1IChib290IC0+IEJvb3RQKTsKKyAgICBJbmZwMCA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gSW5mcDApOworICAgIEluZnBYID0gX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBJbmZwWCk7CisgICAgSW5mVG0gPSBfX2xlMTZfdG9fY3B1IChib290IC0+IEluZlRtKTsKKyAgICAKKyAgICBpZiAoYm9vdCAtPiBkb3M0ID09IEVYVEVOREVEX0JPT1QgJiYKKyAgICAgICAgc3RybmNtcCggYm9vdC0+YmFubmVyLCIyTSIsIDIgKSA9PSAwICYmCisgICAgICAgIEJvb3RQIDwgU1pfU1REX1NFQ1RPUiAmJgorICAgICAgICBJbmZwMCA8IFNaX1NURF9TRUNUT1IgJiYKKyAgICAgICAgSW5mcFggPCBTWl9TVERfU0VDVE9SICYmCisgICAgICAgIEluZlRtIDwgU1pfU1REX1NFQ1RPUiAmJgorICAgICAgICBCb290UCA+PSBJbmZUbSArIDIgJiYKKyAgICAgICAgSW5mVG0gPj0gSW5mcFggJiYKKyAgICAgICAgSW5mcFggPj0gSW5mcDAgJiYgCisgICAgICAgIEluZnAwID49IDc2ICkgeworCisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIGlmIChoZWFkcyAhPSBOQl9IRUFEUyB8fAorICAgICAgICB0cmFja3MgIT0gTkJfVFJBQ0tTIHx8CisgICAgICAgIHNlY3RvcnMgIT0gTkJfU0VDVE9SUyB8fAorICAgICAgICBfX2xlMTZfdG9fY3B1IChib290IC0+IHNlY3NpeikgIT0gU1pfU1REX1NFQ1RPUiB8fAorICAgICAgICBmcyAtPiB0b3Rfc2VjdG9ycyA9PSAwIHx8CisgICAgICAgIChmcyAtPiB0b3Rfc2VjdG9ycyAlIHNlY3RvcnMpICE9IDApIHsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICAgIAorICAgIHJldHVybiAoMCk7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9mZG9zL2Rvcy5oIGIvZnMvZmRvcy9kb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTcwMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZmRvcy9kb3MuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3TkdWJsaSBGYXZlcmdlcyAtIDx3d3cuc3RhdWJsaS5jb20+CisgKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX0RPU19IXworI2RlZmluZSBfRE9TX0hfCisKKy8qIERlZmluaXRpb25zIGZvciBEb3MgZGlza2V0dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogR2VuZXJhbCBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTWl9TVERfU0VDVE9SICAgNTEyICAgICAgICAgICAgIC8qIFN0YW5kYXJkIHNlY3RvciBzaXplICAgICAgICAgICAgICAqLworI2RlZmluZSBNRElSX1NJWkUJMzIJCS8qIERpcmVudHJ5IHNpemUgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQVRfQklUUyAgICAgICAgMTIgICAgICAgICAgICAgIC8qIERpc2tldHRlIHVzZSAxMiBiaXRzIGZhdCAgICAgICAgICAqLworCisjZGVmaW5lIE1BWF9QQVRICTEyOAkJLyogTWF4IHNpemUgb2YgdGhlIE1TRE9TIFBBVEggICAgICAgICovCisjZGVmaW5lIE1BWF9ESVJfU0VDUwk2NAkJLyogVGFpbGxlIG1heCBkJ3VuIHJlcGVydG9pcmUgKGVuICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VjdGV1cnMpICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBNaXNjLiBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERFTE1BUksgICAgICAgICAnXHhlNScKKyNkZWZpbmUgRVhURU5ERURfQk9PVCAgICgweDI5KQorI2RlZmluZSBNRURJQV9TVEQgICAgICAgKDB4ZjApCisjZGVmaW5lIEpVTVBfMF8xICAgICAgICAoMHhlOSkKKyNkZWZpbmUgSlVNUF8wXzIgICAgICAgICgweGViKQorCisvKiBCb290IHNpemUgaXMgMjU2IGJ5dGVzLCBidXQgd2UgbmVlZCB0byByZWFkIGFsbW9zdCBhIHNlY3RvciwgdGhlbgorICAgYXNzdW1lIGJvb3RzaXplIGlzIDUxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCT09UU0laRSAgICAgICAgNTEyCisKKy8qIEZhdCBkZWZpbml0aW9ucyBmb3IgMTIgYml0cyBmYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkFUMTJfTUFYX05CICAgIDQwODYKKyNkZWZpbmUgRkFUMTJfTEFTVCAgICAgIDB4MGZmNgorI2RlZmluZSBGQVQxMl9FTkQgICAgICAgMHgwZmZmCisKKy8qIGZpbGUgYXR0cmlidXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVRUUl9SRUFET05MWSAgICAgICAgICAgMHgwMQorI2RlZmluZSBBVFRSX0hJRERFTiAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFUVFJfU1lTVEVNICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQVRUUl9WT0xVTUUgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBBVFRSX0RJUkVDVE9SWSAgICAgICAgICAweDEwCisjZGVmaW5lIEFUVFJfQVJDSElWRSAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQVRUUl9WU0UgICAgICAgICAgICAgICAgMHgwZgorCisvKiBOYW1lIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVYVENBU0UgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQkFTRUNBU0UgICAgICAgICAgICAgICAgMHg4CisKKy8qIERlZmluaXRpb24gb2YgdGhlIGJvb3Qgc2VjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQkFOTkVSX0xHICAgICAgICAgICAgICAgOAorI2RlZmluZSBMQUJFTF9MRyAgICAgICAgICAgICAgICAxMQorCit0eXBlZGVmIHN0cnVjdCBib290c2VjdG9yCit7CisgICAgdW5zaWduZWQgY2hhciBqdW1wIFszXTsJLyogMCAgSnVtcCB0byBib290IGNvZGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBjaGFyIGJhbm5lciBbQkFOTkVSX0xHXTsJLyogMyAgT0VNIG5hbWUgJiB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBzZWNzaXo7CS8qIDExIEJ5dGVzIHBlciBzZWN0b3IgaG9wZWZ1bGx5IDUxMiAgICAgICAgICovCisgICAgdW5zaWduZWQgY2hhciBjbHNpejsJLyogMTMgQ2x1c3RlciBzaXplIGluIHNlY3RvcnMgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBucnN2c2VjdDsJLyogMTQgTnVtYmVyIG9mIHJlc2VydmVkIChib290KSBzZWN0b3JzICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG5mYXQ7CQkvKiAxNiBOdW1iZXIgb2YgRkFUIHRhYmxlcyBob3BlZnVsbHkgMiAgICAgICAqLworICAgIHVuc2lnbmVkIHNob3J0IGRpcmVudHM7CS8qIDE3IE51bWJlciBvZiBkaXJlY3Rvcnkgc2xvdHMgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgc2hvcnQgcHNlY3Q7CS8qIDE5IFRvdGFsIHNlY3RvcnMgb24gZGlzayAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgY2hhciBkZXNjcjsJLyogMjEgTWVkaWEgZGVzY3JpcHRvcj1maXJzdCBieXRlIG9mIEZBVCAgICAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBmYXRsZW47CS8qIDIyIFNlY3RvcnMgaW4gRkFUICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgc2hvcnQgbnNlY3Q7CS8qIDI0IFNlY3RvcnMvdHJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgc2hvcnQgbmhlYWRzOwkvKiAyNiBIZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGludCBuaHM7CSAgICAgICAgLyogMjggbnVtYmVyIG9mIGhpZGRlbiBzZWN0b3JzICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgYmlnc2VjdDsJLyogMzIgYmlnIHRvdGFsIHNlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHBoeXNkcml2ZTsJLyogMzYgcGh5c2ljYWwgZHJpdmUgPyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkOwkvKiAzNyByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgZG9zNDsJCS8qIDM4IGRvcyA+IDQuMCBkaXNrZXR0ZSAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgaW50IHNlcmlhbDsgICAgICAgIC8qIDM5IHNlcmlhbCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgY2hhciBsYWJlbCBbTEFCRUxfTEddOwkvKiA0MyBkaXNrIGxhYmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGNoYXIgZmF0X3R5cGUgWzhdOwkJLyogNTQgRkFUIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHJlc18ybTsJLyogNjIgcmVzZXJ2ZWQgYnkgMk0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIENoZWNrU3VtOwkvKiA2MyAyTSBjaGVja3N1bSAobm90IHVzZWQpICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgZm10XzJtZjsJLyogNjQgMk1GIGZvcm1hdCB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHd0OwkJLyogNjUgMSBpZiB3cml0ZSB0cmFjayBhZnRlciBmb3JtYXQgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHJhdGVfMDsJLyogNjYgZGF0YSB0cmFuc2ZlciByYXRlIG9uIHRyYWNrIDAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHJhdGVfYW55OwkvKiA2NyBkYXRhIHRyYW5zZmVyIHJhdGUgb24gdHJhY2s8PjAgICAgICAgICAqLworICAgIHVuc2lnbmVkIHNob3J0IEJvb3RQOwkvKiA2OCBvZmZzZXQgdG8gYm9vdCBwcm9ncmFtICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIHNob3J0IEluZnAwOwkvKiA3MCBUMTogaW5mb3JtYXRpb24gZm9yIHRyYWNrIDAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIHNob3J0IEluZnBYOwkvKiA3MiBUMjogaW5mb3JtYXRpb24gZm9yIHRyYWNrPD4wICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIHNob3J0IEluZlRtOwkvKiA3NCBUMzogdHJhY2sgc2VjdG9ycyBzaXplIHRhYmxlICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIHNob3J0IERhdGVGOwkvKiA3NiBGb3JtYXQgZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIHNob3J0IFRpbWVGOwkvKiA3OCBGb3JtYXQgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIganVuayBbQk9PVFNJWkUgLSA4MF07CS8qIDgwIHJlbWFpbmluZyBkYXRhICAgICAgICAgICAgICAgICAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgQm9vdFNlY3Rvcl90OworCisvKiBTdHJ1Y3R1cmUgZCd1bmUgZW50cmVlIGRlIHJlcGVydG9pcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBkaXJlY3RvcnkgeworICAgIGNoYXIgbmFtZSBbOF07CQkvKiBmaWxlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGNoYXIgZXh0IFszXTsJCS8qIGZpbGUgZXh0ZW5zaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgY2hhciBhdHRyOwkJLyogYXR0cmlidXRlIGJ5dGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIENhc2U7CQkvKiBjYXNlIG9mIHNob3J0IGZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQgWzldOwkvKiA/PyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgdGltZSBbMl07CS8qIHRpbWUgc3RhbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgY2hhciBkYXRlIFsyXTsJLyogZGF0ZSBzdGFtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBzdGFydDsJLyogc3RhcnRpbmcgY2x1c3RlciBudW1iZXIgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsJICAgICAgICAvKiBzaXplIG9mIHRoZSBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIERpcmVjdG9yeV90OworCisKKworI2RlZmluZSBNQVhfVkZBVF9TVUJFTlRSSUVTIDIwCisjZGVmaW5lIFZTRV9OQU1FTEVOIDEzCisKKyNkZWZpbmUgVlNFMVNJWkUgNQorI2RlZmluZSBWU0UyU0laRSA2CisjZGVmaW5lIFZTRTNTSVpFIDIKKworI2RlZmluZSBWQlVGU0laRSAoKE1BWF9WRkFUX1NVQkVOVFJJRVMgKiBWU0VfTkFNRUxFTikgKyAxKQorCisjZGVmaW5lIE1BWF9WTkFNRUxFTiAoMjU1KQorCisjZGVmaW5lIFZTRV9QUkVTRU5UIDB4MDEKKyNkZWZpbmUgVlNFX0xBU1QgMHg0MAorI2RlZmluZSBWU0VfTUFTSyAweDFmCisKKy8qIEZsYWcgdXNlZCBieSB2ZmF0X2xvb2t1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE9fT1BFTiAgICAgICAgIDEKKyNkZWZpbmUgQUNDRVBUX1BMQUlOICAgIDB4MjAKKyNkZWZpbmUgQUNDRVBUX0RJUiAgICAgIDB4MTAKKyNkZWZpbmUgQUNDRVBUX0xBQkVMICAgIDB4MDgKKyNkZWZpbmUgU0lOR0xFICAgICAgICAgIDIKKyNkZWZpbmUgTUFUQ0hfQU5ZICAgICAgIDB4NDAKKworc3RydWN0IHZmYXRfc3ViZW50cnkgeworICAgIHVuc2lnbmVkIGNoYXIgaWQ7CQkgICAgICAgIC8qIFZTRV9MQVNUIHBvdXIgbGEgZmluLCBWU0VfTUFTSyAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvdXIgdW4gVlNFICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGNoYXIgdGV4dDEgW1ZTRTFTSVpFICogMl07ICAgICAgICAgIC8qIENhcmFjdGVyZXMgZW5jb2RlcyBzdXIgMTYgYml0cyAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgYXR0cmlidXRlOwkgICAgICAgIC8qIDB4MGYgcG91ciBsZXMgVkZBVCAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgaGFzaDE7CQkvKiB0b3Vqb3VycyAwICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHN1bTsJCSAgICAgICAgLyogQ2hlY2tzdW0gZHUgbm9tIGNvdXJ0ICAgICAgICAgICAgICovCisgICAgY2hhciB0ZXh0MiBbVlNFMlNJWkUgKiAyXTsgICAgICAgICAgLyogQ2FyYWN0ZXJlcyBlbmNvZGVzIHN1ciAxNiBiaXRzICAgICovCisgICAgdW5zaWduZWQgY2hhciBzZWN0b3JfbDsgICAgICAgICAgICAgLyogMCBwb3VyIGxlcyBWRkFUICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgY2hhciBzZWN0b3JfdTsJCS8qIDAgcG91ciBsZXMgVkZBVCAgICAgICAgICAgICAgICAgICAqLworICAgIGNoYXIgdGV4dDMgW1ZTRTNTSVpFICogMl07ICAgICAgICAgIC8qIENhcmFjdGVyZXMgZW5jb2RlcyBzdXIgMTYgYml0cyAgICAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOworCitzdHJ1Y3QgdmZhdF9zdGF0ZSB7CisgICAgY2hhciBuYW1lIFtWQlVGU0laRV07CisgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgLyogaXMgbm93IGEgYml0IG1hcCBvZiAzMiBiaXRzICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IHN1YmVudHJpZXM7CisgICAgdW5zaWduZWQgY2hhciBzdW07ICAgICAgLyogbm8gbmVlZCB0byByZW1lbWJlciB0aGUgc3VtIGZvciBlYWNoICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBlbnRyeSwgaXQgaXMgdGhlIHNhbWUgYW55d2F5cyAgICAgICAgICAgICAgICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSA7CisKKy8qIENvbnZlcnNpb24gbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJRE9TX1lFQVIoZGlyKSAoKChkaXIpLT5kYXRlWzFdID4+IDEpICsgMTk4MCkKKyNkZWZpbmUJRE9TX01PTlRIKGRpcikgKCgoKChkaXIpLT5kYXRlWzFdJjB4MSkgPDwgMykgKyAoKGRpciktPmRhdGVbMF0gPj4gNSkpKQorI2RlZmluZQlET1NfREFZKGRpcikgKChkaXIpLT5kYXRlWzBdICYgMHgxZikKKyNkZWZpbmUJRE9TX0hPVVIoZGlyKSAoKGRpciktPnRpbWVbMV0gPj4gMykKKyNkZWZpbmUJRE9TX01JTlVURShkaXIpICgoKCgoZGlyKS0+dGltZVsxXSYweDcpIDw8IDMpICsgKChkaXIpLT50aW1lWzBdID4+IDUpKSkKKyNkZWZpbmUJRE9TX1NFQyhkaXIpICgoKGRpciktPnRpbWVbMF0gJiAweDFmKSAqIDIpCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2ZzL2Zkb3MvZmF0LmMgYi9mcy9mZG9zL2ZhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZGY3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mZG9zL2ZhdC5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTdOR1YmxpIEZhdmVyZ2VzIC0gPHd3dy5zdGF1YmxpLmNvbT4KKyAqIFBpZXJyZSBBVUJFUlQgIHAuYXViZXJ0QHN0YXVibGkuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKworI2luY2x1ZGUgImRvcy5oIgorI2luY2x1ZGUgImZkb3MuaCIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmYXRfZGVjb2RlIC0tIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit1bnNpZ25lZCBpbnQgZmF0X2RlY29kZSAoRnNfdCAqZnMsIHVuc2lnbmVkIGludCBudW0pCit7CisgICAgdW5zaWduZWQgaW50IHN0YXJ0ID0gbnVtICogMyAvIDI7CisgICAgdW5zaWduZWQgY2hhciAqYWRkcmVzcyA9IGZzIC0+IGZhdF9idWYgKyBzdGFydDsKKyAgICAKKyAgICBpZiAobnVtIDwgMiB8fCBzdGFydCArIDEgPiAoZnMgLT4gZmF0X2xlbiAqIFNaX1NURF9TRUNUT1IpKQorICAgICAgICByZXR1cm4gMTsKKyAgICAKKyAgICBpZiAobnVtICYgMSkKKyAgICAgICAgcmV0dXJuICgoYWRkcmVzcyBbMV0gJiAweGZmKSA8PCA0KSB8ICgoYWRkcmVzcyBbMF0gJiAweGYwICkgPj4gNCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gKChhZGRyZXNzIFsxXSAmIDB4ZikgPDwgOCkgfCAoYWRkcmVzcyBbMF0gJiAweGZmICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBjaGVja19mYXQgLS0gCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZmF0IChGc190ICpmcykKK3sKKyAgICBpbnQgaSwgZjsKKworICAgIC8qIENsdXN0ZXIgdmVyaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGZvciAoaSA9IDMgOyBpIDwgZnMgLT4gbnVtX2NsdXM7IGkrKyl7CisgICAgICAgIGYgPSBmYXRfZGVjb2RlIChmcywgaSk7CisgICAgICAgIGlmIChmIDwgRkFUMTJfTEFTVCAmJiBmID4gZnMgLT4gbnVtX2NsdXMpeworICAgICAgICAgICAgLyogV3JvbmcgY2x1c3RlciBudW1iZXIgZGV0ZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICgwKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJlYWRfb25lX2ZhdCAtLSAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCByZWFkX29uZV9mYXQgKEJvb3RTZWN0b3JfdCAqYm9vdCwgRnNfdCAqZnMsIGludCBuZmF0KQoreworICAgIGlmIChkZXZfcmVhZCAoZnMgLT4gZmF0X2J1ZiwKKyAgICAgICAgICAgICAgICAgIChmcyAtPiBmYXRfc3RhcnQgKyBuZmF0ICogZnMgLT4gZmF0X2xlbiksCisgICAgICAgICAgICAgICAgICBmcyAtPiBmYXRfbGVuKSA8IDApIHsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgaWYgKGZzIC0+IGZhdF9idWYgWzBdIHx8IGZzIC0+IGZhdF9idWYgWzFdIHx8IGZzIC0+IGZhdF9idWYgWzJdKSB7CisgICAgICAgIGlmICgoZnMgLT4gZmF0X2J1ZiBbMF0gIT0gYm9vdCAtPiBkZXNjciAmJgorICAgICAgICAgICAgIChmcyAtPiBmYXRfYnVmIFswXSAhPSAweGY5IHx8IGJvb3QgLT4gZGVzY3IgIT0gTUVESUFfU1REKSkgfHwKKyAgICAgICAgICAgIGZzIC0+IGZhdF9idWYgWzBdIDwgTUVESUFfU1REKXsKKyAgICAgICAgICAgIC8qIFVua25vd24gTWVkaWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICB9CisgICAgICAgIGlmIChmcyAtPiBmYXRfYnVmIFsxXSAhPSAweGZmIHx8IGZzIC0+IGZhdF9idWYgWzJdICE9IDB4ZmYpeworICAgICAgICAgICAgLyogRkFUIGRvZXNuJ3Qgc3RhcnQgd2l0aCBnb29kIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnMgLT4gbnVtX2NsdXMgPj0gRkFUMTJfTUFYX05CKSB7CisgICAgICAgIC8qIFRvbyBtdWNoIGNsdXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIHJldHVybiBjaGVja19mYXQgKGZzKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJlYWRfZmF0IC0tIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgcmVhZF9mYXQgKEJvb3RTZWN0b3JfdCAqYm9vdCwgRnNfdCAqZnMpCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZmxlbjsKKyAgICBpbnQgaTsKKworICAgIC8qIEFsbG9jYXRlIEZhdCBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGJ1ZmxlbiA9IGZzIC0+IGZhdF9sZW4gKiBTWl9TVERfU0VDVE9SOworICAgIGlmIChmcyAtPiBmYXRfYnVmKSB7CisgICAgICAgIGZyZWUgKGZzIC0+IGZhdF9idWYpOworICAgIH0KKworICAgIGlmICgoZnMgLT4gZmF0X2J1ZiA9IG1hbGxvYyAoYnVmbGVuKSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisKKyAgICAvKiBUcnkgdG8gcmVhZCBlYWNoIEZhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpPCBmcyAtPiBuYl9mYXQ7IGkrKyl7CisgICAgICAgIGlmIChyZWFkX29uZV9mYXQgKGJvb3QsIGZzLCBpKSA9PSAwKSB7CisgICAgICAgICAgICAvKiBGYXQgaXMgT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBmcyAtPiBudW1fZmF0ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgPT0gZnMgLT4gbmJfZmF0KXsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICAgIAorICAgIGlmIChmcyAtPiBmYXRfbGVuID4gKCgoZnMgLT4gbnVtX2NsdXMgKyAyKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGQVRfQklUUyAvIDQpIC0xICkgLyAyIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICBTWl9TVERfU0VDVE9SICsgMSkpIHsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKKworIAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2Zkb3MvZmRvcy5jIGIvZnMvZmRvcy9mZG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2M2Y0MgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Zkb3MvZmRvcy5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTdOR1YmxpIEZhdmVyZ2VzIC0gPHd3dy5zdGF1YmxpLmNvbT4KKyAqIFBpZXJyZSBBVUJFUlQgIHAuYXViZXJ0QHN0YXVibGkuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlICJkb3MuaCIKKyNpbmNsdWRlICJmZG9zLmgiCisKKworY29uc3QgY2hhciAqbW9udGggW10gPSB7IkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIn07CisKK0ZzX3QgICAgZnM7CitGaWxlX3QgIGZpbGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRvc19vcGVuIC0tIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgZG9zX29wZW4oY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgbGc7CisgICAgaW50IGVudHJ5OworICAgIGNoYXIgKmZuYW1lOworICAgIAorICAgIC8qIFdlIG5lZWQgdG8gc3VwcHJlc3MgdGhlICIgY2hhciBhcm91bmQgdGhlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChuYW1lIFswXSA9PSAnIicpIHsKKyAgICAgICAgbmFtZSArKzsKKyAgICB9CisgICAgbGcgPSBzdHJsZW4gKG5hbWUpOworICAgIGlmIChuYW1lIFtsZyAtIDFdID09ICciJykgeworICAgICAgICBuYW1lIFtsZyAtIDFdID0gJ1wwJzsKKyAgICB9CisKKyAgICAvKiBPcGVuIGZpbGUgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoZnNfaW5pdCAoJmZzKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGZpbGUgZGVzY3JpcHRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGZpbGUubmFtZSA9IG5hbWU7CisgICAgZmlsZS5mcyA9ICZmczsKKyAgICAKKyAgICAvKiBmaW5kIHRoZSBzdWJkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAob3Blbl9zdWJkaXIgKCZmaWxlKSA8IDApIHsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgZm5hbWUgPSBiYXNlbmFtZSAobmFtZSk7CisKKyAgICAvKiBpZiB3ZSB0cnkgdG8gb3BlbiByb290IGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoKmZuYW1lID09ICdcMCcpIHsKKyAgICAgICAgZmlsZS5maWxlID0gZmlsZS5zdWJkaXI7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIAorICAgIC8qIGZpbmQgdGhlIGZpbGUgaW4gdGhlIHN1YmRpciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGVudHJ5ID0gMDsKKyAgICBpZiAodmZhdF9sb29rdXAgKCZmaWxlLnN1YmRpciwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGUuZnMsCisgICAgICAgICAgICAgICAgICAgICAmZmlsZS5maWxlLmRpciwKKyAgICAgICAgICAgICAgICAgICAgICZlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIEFDQ0VQVF9ESVIgfCBBQ0NFUFRfUExBSU4gfCBTSU5HTEUgfCBET19PUEVOLAorICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICZmaWxlLmZpbGUpICE9IDApIHsKKyAgICAgICAgLyogRmlsZSBub3QgZm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcHJpbnRmICgiRmlsZSBub3QgZm91bmRcbiIpOworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZG9zX3JlYWQgLS0gCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludCBkb3NfcmVhZCAodWxvbmcgYWRkcikKK3sKKyAgICBpbnQgcmVhZCA9IDAsIG5iOworCisgICAgLyogVHJ5IHRvIGJvb3QgYSBkaXJlY3RvcnkgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKGZpbGUuZmlsZS5kaXIuYXR0ciAmIChBVFRSX0RJUkVDVE9SWSB8IEFUVFJfVk9MVU1FKSkgeworICAgICAgICBwcmludGYgKCJVbmFibGUgdG8gYm9vdCAlcyAhIVxuIiwgZmlsZS5uYW1lKTsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICAgIHdoaWxlIChyZWFkIDwgZmlsZS5maWxlLkZpbGVTaXplKSB7CisgICAgICAgIFBSSU5URiAoInJlYWRfZmlsZSAoJWxkKVxuIiwgKGZpbGUuZmlsZS5GaWxlU2l6ZSAtIHJlYWQpKTsKKyAgICAgICAgbmIgPSByZWFkX2ZpbGUgKCZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKWFkZHIgKyByZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlLmZpbGUuRmlsZVNpemUgLSByZWFkKSk7CisgICAgICAgIFBSSU5URiAoInJlYWRfZmlsZSAtPiAlZFxuIiwgbmIpOworICAgICAgICBpZiAobmIgPCAwKSB7CisgICAgICAgICAgICBwcmludGYgKCJyZWFkIGVycm9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICB9CisgICAgICAgIHJlYWQgKz0gbmI7CisgICAgfQorICAgIHJldHVybiAocmVhZCk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkb3NfZGlyIC0tIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgZG9zX2RpciAodm9pZCkKK3sKKyAgICBpbnQgZW50cnk7CisgICAgRGlyZWN0b3J5X3QgZGlyOworICAgIGNoYXIgKm5hbWU7CisgICAgCisgICAgCisgICAgaWYgKChmaWxlLmZpbGUuZGlyLmF0dHIgJiBBVFRSX0RJUkVDVE9SWSkgPT0gMCkgeworICAgICAgICBwcmludGYgKCIlczogbm90IGEgZGlyZWN0b3J5ICEhXG4iLCBmaWxlLm5hbWUpOworICAgICAgICByZXR1cm4gKDEpOworICAgIH0KKyAgICBlbnRyeSA9IDA7CisgICAgaWYgKChuYW1lID0gbWFsbG9jIChNQVhfVk5BTUVMRU4gKyAxKSkgPT0gTlVMTCkgeworICAgICAgICBQUklOVEYgKCJBbGxjYXRpb24gZXJyb3JcbiIpOworICAgICAgICByZXR1cm4gKDEpOworICAgIH0KKyAgICAKKyAgICB3aGlsZSAodmZhdF9sb29rdXAgKCZmaWxlLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgQUNDRVBUX0RJUiB8IEFDQ0VQVF9QTEFJTiB8IE1BVENIX0FOWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAwKSB7CisgICAgICAgIC8qIERpc3BsYXkgZmlsZSBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHByaW50ZiAoIiUzLjNzICU5ZCAlcyAlMDJkICUwNGQgJTAyZDolMDJkOiUwMmQgJXNcbiIsCisgICAgICAgICAgICAgICAgKGRpci5hdHRyICYgQVRUUl9ESVJFQ1RPUlkpID8gImRpciIgOiAiICAgIiwKKyAgICAgICAgICAgICAgICBfX2xlMzJfdG9fY3B1IChkaXIuc2l6ZSksCisgICAgICAgICAgICAgICAgbW9udGggW0RPU19NT05USCAoJmRpcikgLSAxXSwKKyAgICAgICAgICAgICAgICBET1NfREFZICgmZGlyKSwKKyAgICAgICAgICAgICAgICBET1NfWUVBUiAoJmRpciksCisgICAgICAgICAgICAgICAgRE9TX0hPVVIgKCZkaXIpLAorICAgICAgICAgICAgICAgIERPU19NSU5VVEUgKCZkaXIpLAorICAgICAgICAgICAgICAgIERPU19TRUMgKCZkaXIpLAorICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICAKKyAgICB9CisgICAgZnJlZSAobmFtZSk7CisgICAgcmV0dXJuICgwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9mZG9zL2Zkb3MuaCBiL2ZzL2Zkb3MvZmRvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDc2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mZG9zL2Zkb3MuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3TkdWJsaSBGYXZlcmdlcyAtIDx3d3cuc3RhdWJsaS5jb20+CisgKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX0ZET1NfSF8KKyNkZWZpbmUgX0ZET1NfSF8KKworCisjdW5kZWYJRkRPU19ERUJVRworCisjaWZkZWYJRkRPU19ERUJVRworI2RlZmluZQlQUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBtZWRpYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgZnMKK3sKKyAgICB1bnNpZ25lZCBsb25nICAgICAgIHRvdF9zZWN0b3JzOworCisgICAgaW50ICAgICAgICAgICAgICAgICBjbHVzdGVyX3NpemU7CisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fY2x1czsKKyAgICAKKyAgICBpbnQgICAgICAgICAgICAgICAgIGZhdF9zdGFydDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGZhdF9sZW47CisgICAgaW50ICAgICAgICAgICAgICAgICBuYl9mYXQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fZmF0OworICAgIAorICAgIGludCAgICAgICAgICAgICAgICAgZGlyX3N0YXJ0OworICAgIGludCAgICAgICAgICAgICAgICAgZGlyX2xlbjsKKworICAgIHVuc2lnbmVkIGNoYXIgICAgICAgKmZhdF9idWY7CisgICAgCit9IEZzX3Q7CisKKy8qIERhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgb25lIGZpbGUgc3lzdGVtIHNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHNsb3QgeworICAgIGludCAoKm1hcCkgKHN0cnVjdCBmcyAqZnMsCisgICAgICAgICAgICAgICAgc3RydWN0IHNsb3QgKmZpbGUsCisgICAgICAgICAgICAgICAgaW50IHdoZXJlLAorICAgICAgICAgICAgICAgIGludCAqbGVuKTsKKyAgICB1bnNpZ25lZCBsb25nIEZpbGVTaXplOworCisgICAgdW5zaWduZWQgc2hvcnQgaW50IEZpcnN0QWJzQ2x1TnI7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IFByZXZpb3VzQWJzQ2x1TnI7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IFByZXZpb3VzUmVsQ2x1TnI7CisKKyAgICBEaXJlY3RvcnlfdCBkaXI7Cit9IFNsb3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZmlsZSB7CisgICAgY2hhciAgICAgICAgICAgICAgICAqbmFtZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIENhc2U7CisgICAgRnNfdCAgICAgICAgICAgICAgICAqZnM7CisgICAgU2xvdF90ICAgICAgICAgICAgICBzdWJkaXI7CisgICAgU2xvdF90ICAgICAgICAgICAgICBmaWxlOworfSBGaWxlX3Q7CisKKworLyogZGV2LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IGRldl9yZWFkICh2b2lkICpidWZmZXIsIGludCB3aGVyZSwgaW50IGxlbik7CitpbnQgZGV2X29wZW4gKHZvaWQpOworaW50IGNoZWNrX2RldiAoQm9vdFNlY3Rvcl90ICpib290LCBGc190ICpmcyk7CisKKy8qIGZhdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3Vuc2lnbmVkIGludCBmYXRfZGVjb2RlIChGc190ICpmcywgdW5zaWduZWQgaW50IG51bSk7CitpbnQgcmVhZF9mYXQgKEJvb3RTZWN0b3JfdCAqYm9vdCwgRnNfdCAqZnMpOworCisvKiB2ZmF0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitpbnQgdmZhdF9sb29rdXAgKFNsb3RfdCAqZGlyLAorICAgICAgICAgICAgICAgICBGc190ICpmcywKKyAgICAgICAgICAgICAgICAgRGlyZWN0b3J5X3QgKmRpcmVudCwKKyAgICAgICAgICAgICAgICAgaW50ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgaW50ICp2ZmF0X3N0YXJ0LAorICAgICAgICAgICAgICAgICBjaGFyICpmaWxlbmFtZSwgCisgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgY2hhciAqb3V0bmFtZSwKKyAgICAgICAgICAgICAgICAgU2xvdF90ICpmaWxlKTsKKworLyogc3ViZGlyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworY2hhciAqYmFzZW5hbWUgKGNoYXIgKm5hbWUpOworaW50IG9wZW5fc3ViZGlyIChGaWxlX3QgKmRlc2MpOworaW50IG9wZW5fZmlsZSAoU2xvdF90ICpmaWxlLCBEaXJlY3RvcnlfdCAqZGlyKTsKK2ludCByZWFkX2ZpbGUgKEZzX3QgKmZzLAorICAgICAgICAgICAgICAgU2xvdF90ICpmaWxlLAorICAgICAgICAgICAgICAgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgaW50IHdoZXJlLAorICAgICAgICAgICAgICAgaW50IGxlbik7Cit2b2lkIGluaXRfc3ViZGlyICh2b2lkKTsKKworLyogZnMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IGZzX2luaXQgKEZzX3QgKmZzKTsKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZnMvZmRvcy9mcy5jIGIvZnMvZmRvcy9mcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YmJkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mZG9zL2ZzLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgorICogUGllcnJlIEFVQkVSVCAgcC5hdWJlcnRAc3RhdWJsaS5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKQorCisjaW5jbHVkZSAiZG9zLmgiCisjaW5jbHVkZSAiZmRvcy5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZpbGxfZnMgLS0gUmVhZCBpbmZvIG9uIGZpbGUgc3lzdGVtIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IGZpbGxfZnMgKEJvb3RTZWN0b3JfdCAqYm9vdCwgRnNfdCAqZnMpCit7CisgICAgCisgICAgZnMgLT4gZmF0X3N0YXJ0ID0gX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBucnN2c2VjdCk7CisgICAgZnMgLT4gZmF0X2xlbiA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gZmF0bGVuKTsKKyAgICBmcyAtPiBuYl9mYXQgPSBib290IC0+IG5mYXQ7CisgICAgCisgICAgZnMgLT4gZGlyX3N0YXJ0ID0gZnMgLT4gZmF0X3N0YXJ0ICsgZnMgLT4gbmJfZmF0ICogZnMgLT4gZmF0X2xlbjsKKyAgICBmcyAtPiBkaXJfbGVuID0gX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBkaXJlbnRzKSAqIE1ESVJfU0laRSAvIFNaX1NURF9TRUNUT1I7CisgICAgZnMgLT4gY2x1c3Rlcl9zaXplID0gYm9vdCAtPiBjbHNpejsKKyAgICBmcyAtPiBudW1fY2x1cyA9IChmcyAtPiB0b3Rfc2VjdG9ycyAtIGZzIC0+IGRpcl9zdGFydCAtIGZzIC0+IGRpcl9sZW4pIC8gZnMgLT4gY2x1c3Rlcl9zaXplOworCisgICAgcmV0dXJuICgwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZnNfaW5pdCAtLSAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IGZzX2luaXQgKEZzX3QgKmZzKQoreworICAgIEJvb3RTZWN0b3JfdCAqYm9vdDsKKworICAgIC8qIEluaXRpYWxpemUgcGh5c2ljYWwgZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChkZXZfb3BlbiAoKSA8IDApIHsKKyAgICAgICAgUFJJTlRGICgiVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIGZkY1xuIik7CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKyAgICBpbml0X3N1YmRpciAoKTsKKyAgICAKKyAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcmVhZCB0aGUgYm9vdCBzZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoKGJvb3QgPSAoQm9vdFNlY3Rvcl90ICopbWFsbG9jIChzaXplb2YgKEJvb3RTZWN0b3JfdCkpKSA9PSBOVUxMKSB7CisgICAgICAgIFBSSU5URiAoIlVuYWJsZSB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgYm9vdCBzZWN0b3JcbiIpOworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisgICAgCisgICAgLyogcmVhZCBib290IHNlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKGRldl9yZWFkIChib290LCAwLCAxKSl7CisgICAgICAgIFBSSU5URiAoIkVycm9yIGR1cmluZyBib290IHNlY3RvciByZWFkXG4iKTsKKyAgICAgICAgZnJlZSAoYm9vdCk7CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIC8qIHdlIHZlcmlmeSBpdCdhIGEgRE9TIGRpc2tldHRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChib290IC0+IGp1bXAgWzBdICE9ICBKVU1QXzBfMSAmJiBib290IC0+IGp1bXAgWzBdICE9ICBKVU1QXzBfMikgeworICAgICAgICBQUklOVEYgKCJOb3QgYSBET1MgZGlza2V0dGVcbiIpOworICAgICAgICBmcmVlIChib290KTsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgaWYgKGJvb3QgLT4gZGVzY3IgPCBNRURJQV9TVEQpIHsKKyAgICAgICAgLyogV2UgaGFuZGxlIG9ubHkgcmVjZW50IG1lZGlhcyAodHlwZSBGMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgUFJJTlRGICgidW5yZWNvZ25pemVkIGRpc2tldHRlIHR5cGVcbiIpOworICAgICAgICBmcmVlIChib290KTsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgaWYgKGNoZWNrX2RldiAoYm9vdCwgZnMpIDwgMCkgeworICAgICAgICBQUklOVEYgKCJCYWQgZGlza2V0dGVcbiIpOworICAgICAgICBmcmVlIChib290KTsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICAgIAorICAgIGlmIChmaWxsX2ZzIChib290LCBmcykgPCAwKSB7CisgICAgICAgIGZyZWUgKGJvb3QpOworCisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIC8qIFJlYWQgRkFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChyZWFkX2ZhdCAoYm9vdCwgZnMpIDwgMCkgeworICAgICAgICBmcmVlIChib290KTsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgZnJlZSAoYm9vdCk7CisgICAgcmV0dXJuICgwKTsKK30KKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvZmRvcy9zdWJkaXIuYyBiL2ZzL2Zkb3Mvc3ViZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMWYyZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Zkb3Mvc3ViZGlyLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgorICogUGllcnJlIEFVQkVSVCAgcC5hdWJlcnRAc3RhdWJsaS5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKQorCisjaW5jbHVkZSAiZG9zLmgiCisjaW5jbHVkZSAiZmRvcy5oIgorCitzdGF0aWMgaW50IGNhY2hlX3NlY3Q7CitzdGF0aWMgdW5zaWduZWQgY2hhciBjYWNoZSBbU1pfU1REX1NFQ1RPUl07CisKKworI2RlZmluZSBtaW4oeCx5KSAoKHgpPCh5KT8oeCk6KHkpKQorCitzdGF0aWMgaW50IGRlc2NlbmQgKFNsb3RfdCAqcGFyZW50LAorICAgICAgICAgICAgIEZzX3QgKmZzLAorICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXRoKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaW5pdF9zdWJkaXIgLS0gCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgaW5pdF9zdWJkaXIgKHZvaWQpCit7CisgICAgY2FjaGVfc2VjdCA9IC0xOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogYmFzZW5hbWUgLS0gCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2NoYXIgKmJhc2VuYW1lIChjaGFyICpuYW1lKQoreworICAgIHJlZ2lzdGVyIGNoYXIgKmNwdHI7CisKKyAgICBpZiAoIW5hbWUgfHwgISpuYW1lKSB7CisgICAgICAgIHJldHVybiAoIiIpOworICAgIH0KKyAgICAKKyAgICBmb3IgKGNwdHI9IG5hbWU7ICpjcHRyKys7ICk7CisgICAgd2hpbGUgKC0tY3B0ciA+PSBuYW1lKSB7CisJaWYgKCpjcHRyID09ICcvJykgICAgeworICAgICAgICAgICAgcmV0dXJuIChjcHRyICsgMSk7CisJfQorICAgIH0KKyAgICByZXR1cm4obmFtZSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByb290X21hcCAtLSAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCByb290X21hcCAoRnNfdCAqZnMsIFNsb3RfdCAqZmlsZSwgaW50IHdoZXJlLCBpbnQgKmxlbikKK3sKKyAgICAqbGVuID0gbWluICgqbGVuLCBmcyAtPiBkaXJfbGVuICogU1pfU1REX1NFQ1RPUiAtIHdoZXJlKTsKKyAgICBpZiAoKmxlbiA8IDAgKSB7CisgICAgICAgICpsZW4gPSAwOworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisgICAgcmV0dXJuIGZzIC0+IGRpcl9zdGFydCAqIFNaX1NURF9TRUNUT1IgKyB3aGVyZTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG5vcm1hbF9tYXAgLS0gCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgbm9ybWFsX21hcCAoRnNfdCAqZnMsIFNsb3RfdCAqZmlsZSwgaW50IHdoZXJlLCBpbnQgKmxlbikKK3sKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBOckNsdTsKKyAgICB1bnNpZ25lZCBzaG9ydCBSZWxDbHVOcjsKKyAgICB1bnNpZ25lZCBzaG9ydCBDdXJDbHVOcjsKKyAgICB1bnNpZ25lZCBzaG9ydCBOZXdDbHVOcjsKKyAgICB1bnNpZ25lZCBzaG9ydCBBYnNDbHVOcjsKKyAgICBpbnQgY2x1c19zaXplOworCisgICAgY2x1c19zaXplID0gZnMgLT4gY2x1c3Rlcl9zaXplICogU1pfU1REX1NFQ1RPUjsKKyAgICBvZmZzZXQgPSB3aGVyZSAlIGNsdXNfc2l6ZTsKKworICAgICpsZW4gPSBtaW4gKCpsZW4sIGZpbGUgLT4gRmlsZVNpemUgLSB3aGVyZSk7CisKKyAgICBpZiAoKmxlbiA8IDAgKSB7CisgICAgICAgICpsZW4gPSAwOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKworICAgIGlmIChmaWxlIC0+IEZpcnN0QWJzQ2x1TnIgPCAyKXsKKyAgICAgICAgKmxlbiA9IDA7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorCisgICAgUmVsQ2x1TnIgPSB3aGVyZSAvIGNsdXNfc2l6ZTsKKwkKKyAgICBpZiAoUmVsQ2x1TnIgPj0gZmlsZSAtPiBQcmV2aW91c1JlbENsdU5yKXsKKyAgICAgICAgQ3VyQ2x1TnIgPSBmaWxlIC0+IFByZXZpb3VzUmVsQ2x1TnI7CisgICAgICAgIEFic0NsdU5yID0gZmlsZSAtPiBQcmV2aW91c0Fic0NsdU5yOworICAgIH0gZWxzZSB7CisgICAgICAgIEN1ckNsdU5yID0gMDsKKyAgICAgICAgQWJzQ2x1TnIgPSBmaWxlIC0+IEZpcnN0QWJzQ2x1TnI7CisgICAgfQorCisKKyAgICBOckNsdSA9IChvZmZzZXQgKyAqbGVuIC0gMSkgLyBjbHVzX3NpemU7CisgICAgd2hpbGUgKEN1ckNsdU5yIDw9IFJlbENsdU5yICsgTnJDbHUpIHsKKyAgICAgICAgaWYgKEN1ckNsdU5yID09IFJlbENsdU5yKXsKKyAgICAgICAgICAgIC8qIHdlIGhhdmUgcmVhY2hlZCB0aGUgYmVnaW5uaW5nIG9mIG91ciB6b25lLiBTYXZlCisgICAgICAgICAgICAgKiBjb29yZGluYXRlcyAqLworICAgICAgICAgICAgZmlsZSAtPiBQcmV2aW91c1JlbENsdU5yID0gUmVsQ2x1TnI7CisgICAgICAgICAgICBmaWxlIC0+IFByZXZpb3VzQWJzQ2x1TnIgPSBBYnNDbHVOcjsKKyAgICAgICAgfQorICAgICAgICBOZXdDbHVOciA9IGZhdF9kZWNvZGUgKGZzLCBBYnNDbHVOcik7CisgICAgICAgIGlmIChOZXdDbHVOciA9PSAxIHx8IE5ld0NsdU5yID09IDApIHsKKyAgICAgICAgICAgIFBSSU5URigiRmF0IHByb2JsZW0gd2hpbGUgZGVjb2RpbmcgJWQgJXhcbiIsIAorICAgICAgICAgICAgICAgICAgICBBYnNDbHVOciwgTmV3Q2x1TnIpOworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEN1ckNsdU5yID09IFJlbENsdU5yICsgTnJDbHUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEN1ckNsdU5yIDwgUmVsQ2x1TnIgJiYgTmV3Q2x1TnIgPT0gRkFUMTJfRU5EKSB7CisgICAgICAgICAgICAqbGVuID0gMDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEN1ckNsdU5yID49IFJlbENsdU5yICYmIE5ld0NsdU5yICE9IEFic0NsdU5yICsgMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBDdXJDbHVOcisrOworICAgICAgICBBYnNDbHVOciA9IE5ld0NsdU5yOworICAgIH0KKworICAgICpsZW4gPSBtaW4gKCpsZW4sICgxICsgQ3VyQ2x1TnIgLSBSZWxDbHVOcikgKiBjbHVzX3NpemUgLSBvZmZzZXQpOworCisgICAgcmV0dXJuICgoKGZpbGUgLT4gUHJldmlvdXNBYnNDbHVOciAtIDIpICogZnMgLT4gY2x1c3Rlcl9zaXplICsKKyAgICAgICAgICAgICBmcyAtPiBkaXJfc3RhcnQgKyBmcyAtPiBkaXJfbGVuKSAqCisgICAgICAgICAgICBTWl9TVERfU0VDVE9SICsgb2Zmc2V0KTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9wZW5fc3ViZGlyIC0tIG9wZW4gdGhlIHN1YmRpciBjb250YWluaW5nIHRoZSBmaWxlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludCBvcGVuX3N1YmRpciAoRmlsZV90ICpkZXNjKQoreworICAgIGNoYXIgKnBhdGhuYW1lOworICAgIGNoYXIgKnRtcCwgKnMsICpwYXRoOworICAgIGNoYXIgdGVybWluYXRvcjsKKyAgICAKKyAgICBpZiAoKHBhdGhuYW1lID0gKGNoYXIgKiltYWxsb2MgKE1BWF9QQVRIKSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisgICAgCisgICAgc3RyY3B5IChwYXRobmFtZSwgZGVzYyAtPiBuYW1lKTsKKyAgICAKKyAgICAvKiBTdXBwcmVzcyBmaWxlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXAgPSBiYXNlbmFtZSAocGF0aG5hbWUpOworICAgICp0bXAgPSAnXDAnOworCisgICAgLyogcm9vdCBkaXJlY3RvcnkgIGluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZGVzYyAtPiBzdWJkaXIuRmlyc3RBYnNDbHVOciA9IDA7CisgICAgZGVzYyAtPiBzdWJkaXIuRmlsZVNpemUgPSAtMTsKKyAgICBkZXNjIC0+IHN1YmRpci5tYXAgPSByb290X21hcDsKKyAgICBkZXNjIC0+IHN1YmRpci5kaXIuYXR0ciA9IEFUVFJfRElSRUNUT1JZOworICAgIAorICAgIHRtcCA9IHBhdGhuYW1lOworICAgIGZvciAocyA9IHRtcDsgOyArK3MpIHsKKyAgICAgICAgaWYgKCpzID09ICcvJyB8fCAqcyA9PSAnXDAnKSB7CisgICAgICAgICAgICBwYXRoID0gdG1wOworICAgICAgICAgICAgdGVybWluYXRvciA9ICpzOworICAgICAgICAgICAgKnMgPSAnXDAnOworICAgICAgICAgICAgaWYgKHMgIT0gdG1wICYmIHN0cmNtcCAocGF0aCwiLiIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlc2NlbmQgKCZkZXNjIC0+IHN1YmRpciwgZGVzYyAtPiBmcywgcGF0aCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZyZWUgKHBhdGhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRlcm1pbmF0b3IgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wID0gcyArIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZnJlZSAocGF0aG5hbWUpOworICAgIHJldHVybiAoMCk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkZXNjZW5kIC0tIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IGRlc2NlbmQgKFNsb3RfdCAqcGFyZW50LAorICAgICAgICAgICAgIEZzX3QgKmZzLAorICAgICAgICAgICAgIGNoYXIgKnBhdGgpCit7CisgICAgaW50IGVudHJ5OworICAgIFNsb3RfdCBTdWJEaXI7CisKKyAgICBpZihwYXRoWzBdID09ICdcMCcgfHwgc3RyY21wIChwYXRoLCAiLiIpID09IDApIHsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgCisKKyAgICBlbnRyeSA9IDA7CisgICAgaWYgKHZmYXRfbG9va3VwIChwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICBmcywKKyAgICAgICAgICAgICAgICAgICAgICYoU3ViRGlyLmRpciksCisgICAgICAgICAgICAgICAgICAgICAmZW50cnksCisgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIEFDQ0VQVF9ESVIgfCBTSU5HTEUgfCBET19PUEVOLAorICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICZTdWJEaXIpID09IDApIHsKKyAgICAgICAgKnBhcmVudCA9IFN1YkRpcjsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICBpZiAoc3RyY21wKHBhdGgsICIuLiIpID09IDApIHsKKyAgICAgICAgcGFyZW50IC0+IEZpbGVTaXplID0gLTE7CisgICAgICAgIHBhcmVudCAtPiBGaXJzdEFic0NsdU5yID0gMDsKKyAgICAgICAgcGFyZW50IC0+IG1hcCA9IHJvb3RfbWFwOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgICByZXR1cm4gKC0xKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9wZW5fZmlsZSAtLSAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IG9wZW5fZmlsZSAoU2xvdF90ICpmaWxlLCBEaXJlY3RvcnlfdCAqZGlyKQoreworICAgIGludCBmaXJzdDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CisKKyAgICBmaXJzdCA9IF9fbGUxNl90b19jcHUgKGRpciAtPiBzdGFydCk7CisKKyAgICBpZihmaXJzdCA9PSAwICYmCisgICAgICAgKGRpciAtPiBhdHRyICYgQVRUUl9ESVJFQ1RPUlkpICE9IDApIHsKKyAgICAgICAgZmlsZSAtPiBGaXJzdEFic0NsdU5yID0gMDsKKyAgICAgICAgZmlsZSAtPiBGaWxlU2l6ZSA9IC0xOworICAgICAgICBmaWxlIC0+IG1hcCA9IHJvb3RfbWFwOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKwkKKyAgICBpZiAoKGRpciAtPiBhdHRyICYgQVRUUl9ESVJFQ1RPUlkpICE9IDApIHsKKyAgICAgICAgc2l6ZSA9ICgxVUwgPDwgMzEpIC0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNpemUgPSBfX2xlMzJfdG9fY3B1IChkaXIgLT4gc2l6ZSk7CisgICAgfQorCisgICAgZmlsZSAtPiBtYXAgPSBub3JtYWxfbWFwOworICAgIGZpbGUgLT4gRmlyc3RBYnNDbHVOciA9IGZpcnN0OworICAgIGZpbGUgLT4gUHJldmlvdXNSZWxDbHVOciA9IDB4ZmZmZjsKKyAgICBmaWxlIC0+IEZpbGVTaXplID0gc2l6ZTsKKyAgICByZXR1cm4gKDApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcmVhZF9maWxlIC0tIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgcmVhZF9maWxlIChGc190ICpmcywKKyAgICAgICAgICAgICAgIFNsb3RfdCAqZmlsZSwKKyAgICAgICAgICAgICAgIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgIGludCB3aGVyZSwKKyAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgaW50IHBvczsKKyAgICBpbnQgcmVhZCwgbmIsIHNlY3QsIG9mZnNldDsKKyAgICAKKyAgICBwb3MgPSBmaWxlIC0+IG1hcCAoZnMsIGZpbGUsIHdoZXJlLCAmbGVuKTsKKyAgICBpZiAgKHBvcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICAvKiBDb21wdXRlIHNlY3RvciBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzZWN0ID0gcG9zIC8gU1pfU1REX1NFQ1RPUjsKKyAgICBvZmZzZXQgPSBwb3MgJSBTWl9TVERfU0VDVE9SOworICAgIHJlYWQgPSAwOworICAgIAorICAgIGlmIChvZmZzZXQpIHsKKyAgICAgICAgLyogUmVhZCBkb2Vzbid0IHN0YXJ0IGF0IHRoZSBzZWN0b3IgYmVnaW5uaW5nLiBXZSBuZWVkIHRvIHVzZSBvdXIgICAgKi8KKyAgICAgICAgLyogY2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNlY3QgIT0gY2FjaGVfc2VjdCkgeworICAgICAgICAgICAgaWYgKGRldl9yZWFkIChjYWNoZSwgc2VjdCwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWNoZV9zZWN0ID0gc2VjdDsKKyAgICAgICAgfQorICAgICAgICBuYiA9IG1pbiAobGVuLCBTWl9TVERfU0VDVE9SIC0gb2Zmc2V0KTsKKyAgICAgICAgCisgICAgICAgIG1lbWNweSAoYnVmLCBjYWNoZSArIG9mZnNldCwgbmIpOworICAgICAgICByZWFkICs9IG5iOworICAgICAgICBsZW4gLT0gbmI7CisgICAgICAgIHNlY3QgKz0gMTsKKyAgICB9CisKKyAgICBpZiAobGVuID4gU1pfU1REX1NFQ1RPUikgeworICAgICAgICBuYiA9IChsZW4gLSAxKSAvIFNaX1NURF9TRUNUT1I7CisgICAgICAgIGlmIChkZXZfcmVhZCAoYnVmICsgcmVhZCwgc2VjdCwgbmIpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuICgocmVhZCkgPyByZWFkIDogLTEpOworICAgICAgICB9CisgICAgICAgIC8qIHVwZGF0ZSBzZWN0b3IgcG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHNlY3QgKz0gbmI7CisKKyAgICAgICAgLyogVXBkYXRlIGJ5dGUgcG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgbmIgKj0gU1pfU1REX1NFQ1RPUjsKKyAgICAgICAgcmVhZCArPSBuYjsKKyAgICAgICAgbGVuIC09IG5iOworICAgIH0KKworICAgIGlmIChsZW4pIHsKKyAgICAgICAgaWYgKHNlY3QgIT0gY2FjaGVfc2VjdCkgeworICAgICAgICAgICAgaWYgKGRldl9yZWFkIChjYWNoZSwgc2VjdCwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgocmVhZCkgPyByZWFkIDogLTEpOworICAgICAgICAgICAgICAgIGNhY2hlX3NlY3QgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhY2hlX3NlY3QgPSBzZWN0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtZW1jcHkgKGJ1ZiArIHJlYWQsIGNhY2hlLCBsZW4pOworICAgICAgICByZWFkICs9IGxlbjsKKyAgICB9CisgICAgcmV0dXJuIChyZWFkKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvZmRvcy92ZmF0LmMgYi9mcy9mZG9zL3ZmYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODI4Nzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZmRvcy92ZmF0LmMKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgorICogUGllcnJlIEFVQkVSVCAgcC5hdWJlcnRAc3RhdWJsaS5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKQorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKKyNpbmNsdWRlICJkb3MuaCIKKyNpbmNsdWRlICJmZG9zLmgiCisKK3N0YXRpYyBpbnQgZGlyX3JlYWQgKEZzX3QgKmZzLAorICAgICAgICAgICAgICAgICAgICAgU2xvdF90ICpkaXIsCisgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlfdCAqZGlyZW50LAorICAgICAgICAgICAgICAgICAgICAgaW50IG51bSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2ZmF0X3N0YXRlICp2KTsKKworc3RhdGljIGludCB1bmljb2RlX3JlYWQgKGNoYXIgKmluLCBjaGFyICpvdXQsIGludCBudW0pOworc3RhdGljIGludCBtYXRjaCAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBzdW1fc2hvcnRuYW1lIChjaGFyICpuYW1lKTsKK3N0YXRpYyBpbnQgY2hlY2tfdmZhdCAoc3RydWN0IHZmYXRfc3RhdGUgKnYsIERpcmVjdG9yeV90ICpkaXIpOworc3RhdGljIGNoYXIgKmNvbnZfbmFtZSAoY2hhciAqbmFtZSwgY2hhciAqZXh0LCBjaGFyIENhc2UsIGNoYXIgKmFucyk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY2xlYXJfdmZhdCAtLSAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgY2xlYXJfdmZhdCAoc3RydWN0IHZmYXRfc3RhdGUgKnYpCit7CisgICAgdiAtPiBzdWJlbnRyaWVzID0gMDsKKyAgICB2IC0+IHN0YXR1cyA9IDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHZmYXRfbG9va3VwIC0tIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgdmZhdF9sb29rdXAgKFNsb3RfdCAqZGlyLAorICAgICAgICAgICAgICAgICBGc190ICpmcywKKyAgICAgICAgICAgICAgICAgRGlyZWN0b3J5X3QgKmRpcmVudCwKKyAgICAgICAgICAgICAgICAgaW50ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgaW50ICp2ZmF0X3N0YXJ0LAorICAgICAgICAgICAgICAgICBjaGFyICpmaWxlbmFtZSwgCisgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgY2hhciAqb3V0bmFtZSwKKyAgICAgICAgICAgICAgICAgU2xvdF90ICpmaWxlKQoreworICAgIGludCBmb3VuZDsKKyAgICBzdHJ1Y3QgdmZhdF9zdGF0ZSB2ZmF0OworICAgIGNoYXIgbmV3ZmlsZSBbVlNFX05BTUVMRU5dOworICAgIGludCB2ZmF0X3ByZXNlbnQgPSAwOworCisgICAgaWYgKCplbnRyeSA9PSAtMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm91bmQgPSAwOworICAgIGNsZWFyX3ZmYXQgKCZ2ZmF0KTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZGlyX3JlYWQgKGZzLCBkaXIsIGRpcmVudCwgKmVudHJ5LCAmdmZhdCkgPCAwKSB7CisgICAgICAgICAgICBpZiAodmZhdF9zdGFydCkgeworICAgICAgICAgICAgICAgICp2ZmF0X3N0YXJ0ID0gKmVudHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKCplbnRyeSkrKzsKKworICAgICAgICAvKiBFbXB0eSBzbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoZGlyZW50IC0+IG5hbWVbMF0gPT0gJ1wwJyl7CisgICAgICAgICAgICBpZiAodmZhdF9zdGFydCA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXJlbnQgLT4gYXR0ciA9PSBBVFRSX1ZTRSkgeworICAgICAgICAgICAgLyogVlNFIGVudHJ5LCBjb250aW51ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoZGlyZW50IC0+IG5hbWUgWzBdID09IERFTE1BUkspIHx8CisgICAgICAgICAgICAgKChkaXJlbnQgLT4gYXR0ciAmIEFUVFJfRElSRUNUT1JZKSAhPSAwICYmCisgICAgICAgICAgICAgIChmbGFncyAmIEFDQ0VQVF9ESVIpID09IDApIHx8CisgICAgICAgICAgICAgKChkaXJlbnQgLT4gYXR0ciAmIEFUVFJfVk9MVU1FKSAhPSAwICYmCisgICAgICAgICAgICAgIChmbGFncyAmIEFDQ0VQVF9MQUJFTCkgPT0gMCkgfHwKKyAgICAgICAgICAgICAoKChkaXJlbnQgLT4gYXR0ciAmIChBVFRSX0RJUkVDVE9SWSB8IEFUVFJfVk9MVU1FKSkgPT0gMCkgJiYKKyAgICAgICAgICAgICAgKGZsYWdzICYgQUNDRVBUX1BMQUlOKSA9PSAwKSkgeworICAgICAgICAgICAgY2xlYXJfdmZhdCAoJnZmYXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2ZmF0X3ByZXNlbnQgPSBjaGVja192ZmF0ICgmdmZhdCwgZGlyZW50KTsKKyAgICAgICAgaWYgKHZmYXRfc3RhcnQpIHsKKyAgICAgICAgICAgICp2ZmF0X3N0YXJ0ID0gKmVudHJ5IC0gMTsKKyAgICAgICAgICAgIGlmICh2ZmF0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAqdmZhdF9zdGFydCAtPSB2ZmF0LnN1YmVudHJpZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGlyZW50IC0+IGF0dHIgJiBBVFRSX1ZPTFVNRSkgeworICAgICAgICAgICAgc3RybmNweSAobmV3ZmlsZSwgZGlyZW50IC0+IG5hbWUsIDgpOworICAgICAgICAgICAgbmV3ZmlsZSBbOF0gPSAnXDAnOworICAgICAgICAgICAgc3RybmNhdCAobmV3ZmlsZSwgZGlyZW50IC0+IGV4dCwgMyk7CisgICAgICAgICAgICBuZXdmaWxlIFsxMV0gPSAnXDAnOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29udl9uYW1lIChkaXJlbnQgLT4gbmFtZSwgZGlyZW50IC0+IGV4dCwgZGlyZW50IC0+IENhc2UsIG5ld2ZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYgTUFUQ0hfQU5ZKSB7CisgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodmZhdF9wcmVzZW50ICYmIG1hdGNoICh2ZmF0Lm5hbWUsIGZpbGVuYW1lKSkgfHwKKyAgICAgICAgICAgIChtYXRjaCAobmV3ZmlsZSwgZmlsZW5hbWUpKSkgeworICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2xlYXJfdmZhdCAoJnZmYXQpOworICAgIH0KKworICAgIGlmIChmb3VuZCkgeworICAgICAgICBpZiAoKGZsYWdzICYgRE9fT1BFTikgJiYgZmlsZSkgeworICAgICAgICAgICAgaWYgKG9wZW5fZmlsZSAoZmlsZSwgZGlyZW50KSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAob3V0bmFtZSkgeworICAgICAgICAgICAgaWYgKHZmYXRfcHJlc2VudCkgeworICAgICAgICAgICAgICAgIHN0cmNweSAob3V0bmFtZSwgdmZhdC5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmNweSAob3V0bmFtZSwgbmV3ZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgZm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB9IGVsc2UgeworICAgICAgICAqZW50cnkgPSAtMTsKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIG5vdCBmb3VuZCAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRpcl9yZWFkIC0tIFJlYWQgb25lIGRpcmVjdG9yeSBlbnRyeQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IGRpcl9yZWFkIChGc190ICpmcywKKyAgICAgICAgICAgICAgU2xvdF90ICpkaXIsCisgICAgICAgICAgICAgIERpcmVjdG9yeV90ICpkaXJlbnQsCisgICAgICAgICAgICAgIGludCBudW0sCisgICAgICAgICAgICAgIHN0cnVjdCB2ZmF0X3N0YXRlICp2KQoreworCisgICAgLyogcmVhZCB0aGUgZGlyZWN0b3J5IGVudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKHJlYWRfZmlsZSAoZnMsCisgICAgICAgICAgICAgICAgICAgZGlyLAorICAgICAgICAgICAgICAgICAgIChjaGFyICopZGlyZW50LAorICAgICAgICAgICAgICAgICAgIG51bSAqIE1ESVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICBNRElSX1NJWkUpICE9IE1ESVJfU0laRSkgeworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisKKyAgICBpZiAodiAmJiAoZGlyZW50IC0+IGF0dHIgPT0gQVRUUl9WU0UpKSB7CisgICAgICAgIHN0cnVjdCB2ZmF0X3N1YmVudHJ5ICp2c2U7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaWQsIGxhc3RfZmxhZzsKKyAgICAgICAgY2hhciAqYzsKKworICAgICAgICB2c2UgPSAoc3RydWN0IHZmYXRfc3ViZW50cnkgKikgZGlyZW50OworICAgICAgICBpZCA9IHZzZSAtPiBpZCAmIFZTRV9NQVNLOworICAgICAgICBsYXN0X2ZsYWcgPSAodnNlIC0+IGlkICYgVlNFX0xBU1QpOworICAgICAgICBpZiAoaWQgPiBNQVhfVkZBVF9TVUJFTlRSSUVTKSB7CisgICAgICAgICAgICAvKiBJbnZhbGlkIFZTRSBlbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyogRGVjb2RlIFZTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYodiAtPiBzdW0gIT0gdnNlIC0+IHN1bSkgeworICAgICAgICAgICAgY2xlYXJfdmZhdCAodik7CisgICAgICAgICAgICB2IC0+IHN1bSA9IHZzZSAtPiBzdW07CisgICAgICAgIH0KKworICAgICAgICAKKyAgICAgICAgdiAtPiBzdGF0dXMgfD0gMSA8PCAoaWQgLSAxKTsKKyAgICAgICAgaWYgKGxhc3RfZmxhZykgeworICAgICAgICAgICAgdiAtPiBzdWJlbnRyaWVzID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBjID0gJih2IC0+IG5hbWUgW1ZTRV9OQU1FTEVOICogKGlkIC0gMSldKTsKKyAgICAgICAgYyArPSB1bmljb2RlX3JlYWQgKHZzZS0+dGV4dDEsIGMsIFZTRTFTSVpFKTsKKyAgICAgICAgYyArPSB1bmljb2RlX3JlYWQgKHZzZS0+dGV4dDIsIGMsIFZTRTJTSVpFKTsKKyAgICAgICAgYyArPSB1bmljb2RlX3JlYWQgKHZzZS0+dGV4dDMsIGMsIFZTRTNTSVpFKTsKKwkJCisgICAgICAgIGlmIChsYXN0X2ZsYWcpIHsKKyAgICAgICAgICAgICpjID0gJ1wwJzsJICAgICAgICAvKiBOdWxsIHRlcm1pbmF0ZSBsb25nIG5hbWUgICAgICAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICByZXR1cm4gKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB1bmljb2RlX3JlYWQgLS0gCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgdW5pY29kZV9yZWFkIChjaGFyICppbiwgY2hhciAqb3V0LCBpbnQgbnVtKQoreworICAgIGludCBqOworICAgIAorICAgIGZvciAoaiA9IDA7IGogPCBudW07ICsraikgeworICAgICAgICBpZiAoaW4gWzFdKQorICAgICAgICAgICAgKm91dCA9ICdfJzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKm91dCA9IGluIFswXTsKKyAgICAgICAgb3V0ICsrOworICAgICAgICBpbiArPSAyOworICAgIH0KKyAgICByZXR1cm4gbnVtOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtYXRjaCAtLSAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBtYXRjaCAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcCkKK3sKKworICAgIGZvciAoOyAqcCAhPSAnXDAnOyApIHsKKyAgICAgICAgaWYgKHRvdXBwZXIgKCpzKSAhPSB0b3VwcGVyICgqcCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKyAgICAgICAgcCsrOworICAgICAgICBzKys7CisgICAgfQorICAgIAorICAgIGlmICgqcyAhPSAnXDAnKSB7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gKDEpOworICAgIH0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHN1bV9zaG9ydG5hbWUgLS0gCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHN1bV9zaG9ydG5hbWUgKGNoYXIgKm5hbWUpCit7CisgICAgdW5zaWduZWQgY2hhciBzdW07CisgICAgaW50IGo7CisgICAgCisgICAgZm9yIChqID0gc3VtID0gMDsgaiA8IDExOyArK2opIHsKKyAgICAgICAgc3VtID0gKChzdW0gJiAxKSA/IDB4ODAgOiAwKSArIChzdW0gPj4gMSkgKworICAgICAgICAgICAgKG5hbWUgW2pdID8gbmFtZSBbal0gOiAnICcpOworICAgIH0KKyAgICByZXR1cm4gKHN1bSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBjaGVja192ZmF0IC0tIAorICogUmV0dXJuIDEgaWYgbG9uZyBuYW1lIGlzIHZhbGlkLCAwIGVsc2UKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBjaGVja192ZmF0IChzdHJ1Y3QgdmZhdF9zdGF0ZSAqdiwgRGlyZWN0b3J5X3QgKmRpcikKK3sKKyAgICBjaGFyIG5hbWVbMTJdOworICAgIAorICAgIGlmICh2IC0+IHN1YmVudHJpZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgc3RybmNweSAobmFtZSwgZGlyIC0+IG5hbWUsIDgpOworICAgIHN0cm5jcHkgKG5hbWUgKyA4LCBkaXIgLT4gZXh0LCAzKTsKKyAgICBuYW1lIFsxMV0gPSAnXDAnOworICAgIAorICAgIGlmICh2IC0+IHN1bSAhPSBzdW1fc2hvcnRuYW1lIChuYW1lKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgaWYoICh2IC0+IHN0YXR1cyAmICgoMSA8PCB2IC0+IHN1YmVudHJpZXMpIC0gMSkpICE9CisgICAgICAgICgxIDw8IHYgLT4gc3ViZW50cmllcykgLSAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB2LT5uYW1lIFtWU0VfTkFNRUxFTiAqIHYgLT4gc3ViZW50cmllc10gPSAwOworICAgIAorICAgIHJldHVybiAxOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY29udl9uYW1lIC0tIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgY2hhciAqY29udl9uYW1lIChjaGFyICpuYW1lLCBjaGFyICpleHQsIGNoYXIgQ2FzZSwgY2hhciAqYW5zKQoreworICAgIGNoYXIgdG5hbWUgWzldLCB0ZXh0IFs0XTsKKyAgICBpbnQgaTsKKworICAgIGkgPSAwOworICAgIHdoaWxlIChpIDwgOCAmJiBuYW1lIFtpXSAhPSAnICcgJiYgbmFtZSBbaV0gIT0gJ1wwJykgeworICAgICAgICB0bmFtZSBbaV0gPSBuYW1lIFtpXTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICB0bmFtZSBbaV0gPSAnXDAnOworICAgIAorICAgIGlmIChDYXNlICYgQkFTRUNBU0UpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDggJiYgdG5hbWUgW2ldOyBpKyspIHsKKyAgICAgICAgICAgIHRuYW1lIFtpXSA9IHRvbG93ZXIgKHRuYW1lIFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoaSA8IDMgJiYgZXh0IFtpXSAhPSAnICcgJiYgZXh0IFtpXSAhPSAnXDAnKSB7CisgICAgICAgIHRleHQgW2ldID0gZXh0IFtpXTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICB0ZXh0IFtpXSA9ICdcMCc7CisKKyAgICBpZiAoQ2FzZSAmIEVYVENBU0UpeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiB0ZXh0IFtpXTsgaSsrKSB7CisgICAgICAgICAgICB0ZXh0IFtpXSA9IHRvbG93ZXIgKHRleHQgW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgqdGV4dCkgeworICAgICAgICBzdHJjcHkgKGFucywgdG5hbWUpOworICAgICAgICBzdHJjYXQgKGFucywgIi4iKTsKKyAgICAgICAgc3RyY2F0IChhbnMsIHRleHQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RyY3B5KGFucywgdG5hbWUpOworICAgIH0KKyAgICByZXR1cm4gKGFucyk7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pMzg2X2NvbmZpZy5tayBiL2kzODZfY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNmQzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9pMzg2X2NvbmZpZy5tawpAQCAtMCwwICsxLDI0IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ09ORklHX0kzODYgLURfX0kzODZfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9iaXRvcHMuaCBiL2luY2x1ZGUvYXNtLWkzODYvYml0b3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwNjNjYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYml0b3BzLmgKQEAgLTAsMCArMSwzODQgQEAKKyNpZm5kZWYgX0kzODZfQklUT1BTX0gKKyNkZWZpbmUgX0kzODZfQklUT1BTX0gKKworLyoKKyAqIENvcHlyaWdodCAxOTkyLCBMaW51cyBUb3J2YWxkcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qCisgKiBUaGVzZSBoYXZlIHRvIGJlIGRvbmUgd2l0aCBpbmxpbmUgYXNzZW1ibHk6IHRoYXQgd2F5IHRoZSBiaXQtc2V0dGluZworICogaXMgZ3VhcmFudGVlZCB0byBiZSBhdG9taWMuIEFsbCBiaXQgb3BlcmF0aW9ucyByZXR1cm4gMCBpZiB0aGUgYml0CisgKiB3YXMgY2xlYXJlZCBiZWZvcmUgdGhlIG9wZXJhdGlvbiBhbmQgIT0gMCBpZiBpdCB3YXMgbm90LgorICoKKyAqIGJpdCAwIGlzIHRoZSBMU0Igb2YgYWRkcjsgYml0IDMyIGlzIHRoZSBMU0Igb2YgKGFkZHIrMSkuCisgKi8KKworI2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgTE9DS19QUkVGSVggImxvY2sgOyAiCisjZWxzZQorI2RlZmluZSBMT0NLX1BSRUZJWCAiIgorI2VuZGlmCisKKyNkZWZpbmUgQUREUiAoKih2b2xhdGlsZSBsb25nICopIGFkZHIpCisKKy8qKgorICogc2V0X2JpdCAtIEF0b21pY2FsbHkgc2V0IGEgYml0IGluIG1lbW9yeQorICogQG5yOiB0aGUgYml0IHRvIHNldAorICogQGFkZHI6IHRoZSBhZGRyZXNzIHRvIHN0YXJ0IGNvdW50aW5nIGZyb20KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGF0b21pYyBhbmQgbWF5IG5vdCBiZSByZW9yZGVyZWQuICBTZWUgX19zZXRfYml0KCkKKyAqIGlmIHlvdSBkbyBub3QgcmVxdWlyZSB0aGUgYXRvbWljIGd1YXJhbnRlZXMuCisgKiBOb3RlIHRoYXQgQG5yIG1heSBiZSBhbG1vc3QgYXJiaXRyYXJpbHkgbGFyZ2U7IHRoaXMgZnVuY3Rpb24gaXMgbm90CisgKiByZXN0cmljdGVkIHRvIGFjdGluZyBvbiBhIHNpbmdsZS13b3JkIHF1YW50aXR5LgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyggTE9DS19QUkVGSVgKKwkJImJ0c2wgJTEsJTAiCisJCToiPW0iIChBRERSKQorCQk6IklyIiAobnIpKTsKK30KKworLyoqCisgKiBfX3NldF9iaXQgLSBTZXQgYSBiaXQgaW4gbWVtb3J5CisgKiBAbnI6IHRoZSBiaXQgdG8gc2V0CisgKiBAYWRkcjogdGhlIGFkZHJlc3MgdG8gc3RhcnQgY291bnRpbmcgZnJvbQorICoKKyAqIFVubGlrZSBzZXRfYml0KCksIHRoaXMgZnVuY3Rpb24gaXMgbm9uLWF0b21pYyBhbmQgbWF5IGJlIHJlb3JkZXJlZC4KKyAqIElmIGl0J3MgY2FsbGVkIG9uIHRoZSBzYW1lIHJlZ2lvbiBvZiBtZW1vcnkgc2ltdWx0YW5lb3VzbHksIHRoZSBlZmZlY3QKKyAqIG1heSBiZSB0aGF0IG9ubHkgb25lIG9wZXJhdGlvbiBzdWNjZWVkcy4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3NldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3sKKwlfX2FzbV9fKAorCQkiYnRzbCAlMSwlMCIKKwkJOiI9bSIgKEFERFIpCisJCToiSXIiIChucikpOworfQorCisvKioKKyAqIGNsZWFyX2JpdCAtIENsZWFycyBhIGJpdCBpbiBtZW1vcnkKKyAqIEBucjogQml0IHRvIGNsZWFyCisgKiBAYWRkcjogQWRkcmVzcyB0byBzdGFydCBjb3VudGluZyBmcm9tCisgKgorICogY2xlYXJfYml0KCkgaXMgYXRvbWljIGFuZCBtYXkgbm90IGJlIHJlb3JkZXJlZC4gIEhvd2V2ZXIsIGl0IGRvZXMKKyAqIG5vdCBjb250YWluIGEgbWVtb3J5IGJhcnJpZXIsIHNvIGlmIGl0IGlzIHVzZWQgZm9yIGxvY2tpbmcgcHVycG9zZXMsCisgKiB5b3Ugc2hvdWxkIGNhbGwgc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCkgYW5kL29yIHNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCkKKyAqIGluIG9yZGVyIHRvIGVuc3VyZSBjaGFuZ2VzIGFyZSB2aXNpYmxlIG9uIG90aGVyIHByb2Nlc3NvcnMuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIExPQ0tfUFJFRklYCisJCSJidHJsICUxLCUwIgorCQk6Ij1tIiAoQUREUikKKwkJOiJJciIgKG5yKSk7Cit9CisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQorCisvKioKKyAqIF9fY2hhbmdlX2JpdCAtIFRvZ2dsZSBhIGJpdCBpbiBtZW1vcnkKKyAqIEBucjogdGhlIGJpdCB0byBzZXQKKyAqIEBhZGRyOiB0aGUgYWRkcmVzcyB0byBzdGFydCBjb3VudGluZyBmcm9tCisgKgorICogVW5saWtlIGNoYW5nZV9iaXQoKSwgdGhpcyBmdW5jdGlvbiBpcyBub24tYXRvbWljIGFuZCBtYXkgYmUgcmVvcmRlcmVkLgorICogSWYgaXQncyBjYWxsZWQgb24gdGhlIHNhbWUgcmVnaW9uIG9mIG1lbW9yeSBzaW11bHRhbmVvdXNseSwgdGhlIGVmZmVjdAorICogbWF5IGJlIHRoYXQgb25seSBvbmUgb3BlcmF0aW9uIHN1Y2NlZWRzLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiYnRjbCAlMSwlMCIKKwkJOiI9bSIgKEFERFIpCisJCToiSXIiIChucikpOworfQorCisvKioKKyAqIGNoYW5nZV9iaXQgLSBUb2dnbGUgYSBiaXQgaW4gbWVtb3J5CisgKiBAbnI6IEJpdCB0byBjbGVhcgorICogQGFkZHI6IEFkZHJlc3MgdG8gc3RhcnQgY291bnRpbmcgZnJvbQorICoKKyAqIGNoYW5nZV9iaXQoKSBpcyBhdG9taWMgYW5kIG1heSBub3QgYmUgcmVvcmRlcmVkLgorICogTm90ZSB0aGF0IEBuciBtYXkgYmUgYWxtb3N0IGFyYml0cmFyaWx5IGxhcmdlOyB0aGlzIGZ1bmN0aW9uIGlzIG5vdAorICogcmVzdHJpY3RlZCB0byBhY3Rpbmcgb24gYSBzaW5nbGUtd29yZCBxdWFudGl0eS4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBjaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIExPQ0tfUFJFRklYCisJCSJidGNsICUxLCUwIgorCQk6Ij1tIiAoQUREUikKKwkJOiJJciIgKG5yKSk7Cit9CisKKy8qKgorICogdGVzdF9hbmRfc2V0X2JpdCAtIFNldCBhIGJpdCBhbmQgcmV0dXJuIGl0cyBvbGQgdmFsdWUKKyAqIEBucjogQml0IHRvIHNldAorICogQGFkZHI6IEFkZHJlc3MgdG8gY291bnQgZnJvbQorICoKKyAqIFRoaXMgb3BlcmF0aW9uIGlzIGF0b21pYyBhbmQgY2Fubm90IGJlIHJlb3JkZXJlZC4gIAorICogSXQgYWxzbyBpbXBsaWVzIGEgbWVtb3J5IGJhcnJpZXIuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB0ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCit7CisJaW50IG9sZGJpdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCBMT0NLX1BSRUZJWAorCQkiYnRzbCAlMiwlMVxuXHRzYmJsICUwLCUwIgorCQk6Ij1yIiAob2xkYml0KSwiPW0iIChBRERSKQorCQk6IklyIiAobnIpIDogIm1lbW9yeSIpOworCXJldHVybiBvbGRiaXQ7Cit9CisKKy8qKgorICogX190ZXN0X2FuZF9zZXRfYml0IC0gU2V0IGEgYml0IGFuZCByZXR1cm4gaXRzIG9sZCB2YWx1ZQorICogQG5yOiBCaXQgdG8gc2V0CisgKiBAYWRkcjogQWRkcmVzcyB0byBjb3VudCBmcm9tCisgKgorICogVGhpcyBvcGVyYXRpb24gaXMgbm9uLWF0b21pYyBhbmQgY2FuIGJlIHJlb3JkZXJlZC4gIAorICogSWYgdHdvIGV4YW1wbGVzIG9mIHRoaXMgb3BlcmF0aW9uIHJhY2UsIG9uZSBjYW4gYXBwZWFyIHRvIHN1Y2NlZWQKKyAqIGJ1dCBhY3R1YWxseSBmYWlsLiAgWW91IG11c3QgcHJvdGVjdCBtdWx0aXBsZSBhY2Nlc3NlcyB3aXRoIGEgbG9jay4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IF9fdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQoreworCWludCBvbGRiaXQ7CisKKwlfX2FzbV9fKAorCQkiYnRzbCAlMiwlMVxuXHRzYmJsICUwLCUwIgorCQk6Ij1yIiAob2xkYml0KSwiPW0iIChBRERSKQorCQk6IklyIiAobnIpKTsKKwlyZXR1cm4gb2xkYml0OworfQorCisvKioKKyAqIHRlc3RfYW5kX2NsZWFyX2JpdCAtIENsZWFyIGEgYml0IGFuZCByZXR1cm4gaXRzIG9sZCB2YWx1ZQorICogQG5yOiBCaXQgdG8gc2V0CisgKiBAYWRkcjogQWRkcmVzcyB0byBjb3VudCBmcm9tCisgKgorICogVGhpcyBvcGVyYXRpb24gaXMgYXRvbWljIGFuZCBjYW5ub3QgYmUgcmVvcmRlcmVkLiAgCisgKiBJdCBhbHNvIGltcGxpZXMgYSBtZW1vcnkgYmFycmllci4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHRlc3RfYW5kX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQoreworCWludCBvbGRiaXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyggTE9DS19QUkVGSVgKKwkJImJ0cmwgJTIsJTFcblx0c2JibCAlMCwlMCIKKwkJOiI9ciIgKG9sZGJpdCksIj1tIiAoQUREUikKKwkJOiJJciIgKG5yKSA6ICJtZW1vcnkiKTsKKwlyZXR1cm4gb2xkYml0OworfQorCisvKioKKyAqIF9fdGVzdF9hbmRfY2xlYXJfYml0IC0gQ2xlYXIgYSBiaXQgYW5kIHJldHVybiBpdHMgb2xkIHZhbHVlCisgKiBAbnI6IEJpdCB0byBzZXQKKyAqIEBhZGRyOiBBZGRyZXNzIHRvIGNvdW50IGZyb20KKyAqCisgKiBUaGlzIG9wZXJhdGlvbiBpcyBub24tYXRvbWljIGFuZCBjYW4gYmUgcmVvcmRlcmVkLiAgCisgKiBJZiB0d28gZXhhbXBsZXMgb2YgdGhpcyBvcGVyYXRpb24gcmFjZSwgb25lIGNhbiBhcHBlYXIgdG8gc3VjY2VlZAorICogYnV0IGFjdHVhbGx5IGZhaWwuICBZb3UgbXVzdCBwcm90ZWN0IG11bHRpcGxlIGFjY2Vzc2VzIHdpdGggYSBsb2NrLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX190ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3sKKwlpbnQgb2xkYml0OworCisJX19hc21fXygKKwkJImJ0cmwgJTIsJTFcblx0c2JibCAlMCwlMCIKKwkJOiI9ciIgKG9sZGJpdCksIj1tIiAoQUREUikKKwkJOiJJciIgKG5yKSk7CisJcmV0dXJuIG9sZGJpdDsKK30KKworLyogV0FSTklORzogbm9uIGF0b21pYyBhbmQgaXQgY2FuIGJlIHJlb3JkZXJlZCEgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX3Rlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3sKKwlpbnQgb2xkYml0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJidGNsICUyLCUxXG5cdHNiYmwgJTAsJTAiCisJCToiPXIiIChvbGRiaXQpLCI9bSIgKEFERFIpCisJCToiSXIiIChucikgOiAibWVtb3J5Iik7CisJcmV0dXJuIG9sZGJpdDsKK30KKworLyoqCisgKiB0ZXN0X2FuZF9jaGFuZ2VfYml0IC0gQ2hhbmdlIGEgYml0IGFuZCByZXR1cm4gaXRzIG5ldyB2YWx1ZQorICogQG5yOiBCaXQgdG8gc2V0CisgKiBAYWRkcjogQWRkcmVzcyB0byBjb3VudCBmcm9tCisgKgorICogVGhpcyBvcGVyYXRpb24gaXMgYXRvbWljIGFuZCBjYW5ub3QgYmUgcmVvcmRlcmVkLiAgCisgKiBJdCBhbHNvIGltcGxpZXMgYSBtZW1vcnkgYmFycmllci4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHRlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3sKKwlpbnQgb2xkYml0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIExPQ0tfUFJFRklYCisJCSJidGNsICUyLCUxXG5cdHNiYmwgJTAsJTAiCisJCToiPXIiIChvbGRiaXQpLCI9bSIgKEFERFIpCisJCToiSXIiIChucikgOiAibWVtb3J5Iik7CisJcmV0dXJuIG9sZGJpdDsKK30KKworI2lmIDAgLyogRm9vbCBrZXJuZWwtZG9jIHNpbmNlIGl0IGRvZXNuJ3QgZG8gbWFjcm9zIHlldCAqLworLyoqCisgKiB0ZXN0X2JpdCAtIERldGVybWluZSB3aGV0aGVyIGEgYml0IGlzIHNldAorICogQG5yOiBiaXQgbnVtYmVyIHRvIHRlc3QKKyAqIEBhZGRyOiBBZGRyZXNzIHRvIHN0YXJ0IGNvdW50aW5nIGZyb20KKyAqLworc3RhdGljIGludCB0ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiBhZGRyKTsKKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgY29uc3RhbnRfdGVzdF9iaXQoaW50IG5yLCBjb25zdCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3sKKwlyZXR1cm4gKCgxVUwgPDwgKG5yICYgMzEpKSAmICgoKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSBhZGRyKVtuciA+PiA1XSkpICE9IDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCB2YXJpYWJsZV90ZXN0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQoreworCWludCBvbGRiaXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJImJ0bCAlMiwlMVxuXHRzYmJsICUwLCUwIgorCQk6Ij1yIiAob2xkYml0KQorCQk6Im0iIChBRERSKSwiSXIiIChucikpOworCXJldHVybiBvbGRiaXQ7Cit9CisKKyNkZWZpbmUgdGVzdF9iaXQobnIsYWRkcikgXAorKF9fYnVpbHRpbl9jb25zdGFudF9wKG5yKSA/IFwKKyBjb25zdGFudF90ZXN0X2JpdCgobnIpLChhZGRyKSkgOiBcCisgdmFyaWFibGVfdGVzdF9iaXQoKG5yKSwoYWRkcikpKQorCisvKioKKyAqIGZpbmRfZmlyc3RfemVyb19iaXQgLSBmaW5kIHRoZSBmaXJzdCB6ZXJvIGJpdCBpbiBhIG1lbW9yeSByZWdpb24KKyAqIEBhZGRyOiBUaGUgYWRkcmVzcyB0byBzdGFydCB0aGUgc2VhcmNoIGF0CisgKiBAc2l6ZTogVGhlIG1heGltdW0gc2l6ZSB0byBzZWFyY2gKKyAqCisgKiBSZXR1cm5zIHRoZSBiaXQtbnVtYmVyIG9mIHRoZSBmaXJzdCB6ZXJvIGJpdCwgbm90IHRoZSBudW1iZXIgb2YgdGhlIGJ5dGUKKyAqIGNvbnRhaW5pbmcgYSBiaXQuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBmaW5kX2ZpcnN0X3plcm9fYml0KHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBzaXplKQoreworCWludCBkMCwgZDEsIGQyOworCWludCByZXM7CisKKwlpZiAoIXNpemUpCisJCXJldHVybiAwOworCS8qIFRoaXMgbG9va3MgYXQgbWVtb3J5LiBNYXJrIGl0IHZvbGF0aWxlIHRvIHRlbGwgZ2NjIG5vdCB0byBtb3ZlIGl0IGFyb3VuZCAqLworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkibW92bCAkLTEsJSVlYXhcblx0IgorCQkieG9ybCAlJWVkeCwlJWVkeFxuXHQiCisJCSJyZXBlOyBzY2FzbFxuXHQiCisJCSJqZSAxZlxuXHQiCisJCSJ4b3JsIC00KCUlZWRpKSwlJWVheFxuXHQiCisJCSJzdWJsICQ0LCUlZWRpXG5cdCIKKwkJImJzZmwgJSVlYXgsJSVlZHhcbiIKKwkJIjE6XHRzdWJsICUlZWJ4LCUlZWRpXG5cdCIKKwkJInNobGwgJDMsJSVlZGlcblx0IgorCQkiYWRkbCAlJWVkaSwlJWVkeCIKKwkJOiI9ZCIgKHJlcyksICI9JmMiIChkMCksICI9JkQiIChkMSksICI9JmEiIChkMikKKwkJOiIxIiAoKHNpemUgKyAzMSkgPj4gNSksICIyIiAoYWRkciksICJiIiAoYWRkcikpOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogZmluZF9uZXh0X3plcm9fYml0IC0gZmluZCB0aGUgZmlyc3QgemVybyBiaXQgaW4gYSBtZW1vcnkgcmVnaW9uCisgKiBAYWRkcjogVGhlIGFkZHJlc3MgdG8gYmFzZSB0aGUgc2VhcmNoIG9uCisgKiBAb2Zmc2V0OiBUaGUgYml0bnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBhdAorICogQHNpemU6IFRoZSBtYXhpbXVtIHNpemUgdG8gc2VhcmNoCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBmaW5kX25leHRfemVyb19iaXQgKHZvaWQgKiBhZGRyLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nICogcCA9ICgodW5zaWduZWQgbG9uZyAqKSBhZGRyKSArIChvZmZzZXQgPj4gNSk7CisJaW50IHNldCA9IDAsIGJpdCA9IG9mZnNldCAmIDMxLCByZXM7CisJCisJaWYgKGJpdCkgeworCQkvKgorCQkgKiBMb29rIGZvciB6ZXJvIGluIGZpcnN0IGJ5dGUKKwkJICovCisJCV9fYXNtX18oImJzZmwgJTEsJTBcblx0IgorCQkJImpuZSAxZlxuXHQiCisJCQkibW92bCAkMzIsICUwXG4iCisJCQkiMToiCisJCQk6ICI9ciIgKHNldCkKKwkJCTogInIiICh+KCpwID4+IGJpdCkpKTsKKwkJaWYgKHNldCA8ICgzMiAtIGJpdCkpCisJCQlyZXR1cm4gc2V0ICsgb2Zmc2V0OworCQlzZXQgPSAzMiAtIGJpdDsKKwkJcCsrOworCX0KKwkvKgorCSAqIE5vIHplcm8geWV0LCBzZWFyY2ggcmVtYWluaW5nIGZ1bGwgYnl0ZXMgZm9yIGEgemVybworCSAqLworCXJlcyA9IGZpbmRfZmlyc3RfemVyb19iaXQgKHAsIHNpemUgLSAzMiAqIChwIC0gKHVuc2lnbmVkIGxvbmcgKikgYWRkcikpOworCXJldHVybiAob2Zmc2V0ICsgc2V0ICsgcmVzKTsKK30KKworLyoqCisgKiBmZnogLSBmaW5kIGZpcnN0IHplcm8gaW4gd29yZC4KKyAqIEB3b3JkOiBUaGUgd29yZCB0byBzZWFyY2gKKyAqCisgKiBVbmRlZmluZWQgaWYgbm8gemVybyBleGlzdHMsIHNvIGNvZGUgc2hvdWxkIGNoZWNrIGFnYWluc3QgfjBVTCBmaXJzdC4KKyAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBmZnoodW5zaWduZWQgbG9uZyB3b3JkKQoreworCV9fYXNtX18oImJzZmwgJTEsJTAiCisJCToiPXIiICh3b3JkKQorCQk6InIiICh+d29yZCkpOworCXJldHVybiB3b3JkOworfQorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIGZmcyAtIGZpbmQgZmlyc3QgYml0IHNldAorICogQHg6IHRoZSB3b3JkIHRvIHNlYXJjaAorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCB0aGUgc2FtZSB3YXkgYXMKKyAqIHRoZSBsaWJjIGFuZCBjb21waWxlciBidWlsdGluIGZmcyByb3V0aW5lcywgdGhlcmVmb3JlCisgKiBkaWZmZXJzIGluIHNwaXJpdCBmcm9tIHRoZSBhYm92ZSBmZnogKG1hbiBmZnMpLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZmZzKGludCB4KQoreworCWludCByOworCisJX19hc21fXygiYnNmbCAlMSwlMFxuXHQiCisJCSJqbnogMWZcblx0IgorCQkibW92bCAkLTEsJTBcbiIKKwkJIjE6IiA6ICI9ciIgKHIpIDogImciICh4KSk7CisJcmV0dXJuIHIrMTsKK30KKworLyoqCisgKiBod2VpZ2h0TiAtIHJldHVybnMgdGhlIGhhbW1pbmcgd2VpZ2h0IG9mIGEgTi1iaXQgd29yZAorICogQHg6IHRoZSB3b3JkIHRvIHdlaWdoCisgKgorICogVGhlIEhhbW1pbmcgV2VpZ2h0IG9mIGEgbnVtYmVyIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0cyBzZXQgaW4gaXQuCisgKi8KKworI2RlZmluZSBod2VpZ2h0MzIoeCkgZ2VuZXJpY19od2VpZ2h0MzIoeCkKKyNkZWZpbmUgaHdlaWdodDE2KHgpIGdlbmVyaWNfaHdlaWdodDE2KHgpCisjZGVmaW5lIGh3ZWlnaHQ4KHgpIGdlbmVyaWNfaHdlaWdodDgoeCkKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBleHQyX3NldF9iaXQgICAgICAgICAgICAgICAgIF9fdGVzdF9hbmRfc2V0X2JpdAorI2RlZmluZSBleHQyX2NsZWFyX2JpdCAgICAgICAgICAgICAgIF9fdGVzdF9hbmRfY2xlYXJfYml0CisjZGVmaW5lIGV4dDJfdGVzdF9iaXQgICAgICAgICAgICAgICAgdGVzdF9iaXQKKyNkZWZpbmUgZXh0Ml9maW5kX2ZpcnN0X3plcm9fYml0ICAgICBmaW5kX2ZpcnN0X3plcm9fYml0CisjZGVmaW5lIGV4dDJfZmluZF9uZXh0X3plcm9fYml0ICAgICAgZmluZF9uZXh0X3plcm9fYml0CisKKy8qIEJpdG1hcCBmdW5jdGlvbnMgZm9yIHRoZSBtaW5peCBmaWxlc3lzdGVtLiAgKi8KKyNkZWZpbmUgbWluaXhfdGVzdF9hbmRfc2V0X2JpdChucixhZGRyKSBfX3Rlc3RfYW5kX3NldF9iaXQobnIsYWRkcikKKyNkZWZpbmUgbWluaXhfc2V0X2JpdChucixhZGRyKSBfX3NldF9iaXQobnIsYWRkcikKKyNkZWZpbmUgbWluaXhfdGVzdF9hbmRfY2xlYXJfYml0KG5yLGFkZHIpIF9fdGVzdF9hbmRfY2xlYXJfYml0KG5yLGFkZHIpCisjZGVmaW5lIG1pbml4X3Rlc3RfYml0KG5yLGFkZHIpIHRlc3RfYml0KG5yLGFkZHIpCisjZGVmaW5lIG1pbml4X2ZpbmRfZmlyc3RfemVyb19iaXQoYWRkcixzaXplKSBmaW5kX2ZpcnN0X3plcm9fYml0KGFkZHIsc2l6ZSkKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9JMzg2X0JJVE9QU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2J5dGVvcmRlci5oIGIvaW5jbHVkZS9hc20taTM4Ni9ieXRlb3JkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmZiNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9ieXRlb3JkZXIuaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIF9JMzg2X0JZVEVPUkRFUl9ICisjZGVmaW5lIF9JMzg2X0JZVEVPUkRFUl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmZGVmIF9fR05VQ19fCisKKy8qIEZvciBhdm9pZGluZyBic3dhcCBvbiBpMzg2ICovCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZV9fIF9fY29uc3RfXyBfX3UzMiBfX19hcmNoX19zd2FiMzIoX191MzIgeCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2X0JTV0FQCisJX19hc21fXygiYnN3YXAgJTAiIDogIj1yIiAoeCkgOiAiMCIgKHgpKTsKKyNlbHNlCisJX19hc21fXygieGNoZ2IgJWIwLCVoMFxuXHQiCS8qIHN3YXAgbG93ZXIgYnl0ZXMJKi8KKwkJInJvcmwgJDE2LCUwXG5cdCIJLyogc3dhcCB3b3JkcwkJKi8KKwkJInhjaGdiICViMCwlaDAiCQkvKiBzd2FwIGhpZ2hlciBieXRlcwkqLworCQk6Ij1xIiAoeCkKKwkJOiAiMCIgKHgpKTsKKyNlbmRpZgorCXJldHVybiB4OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX2NvbnN0X18gX191MTYgX19fYXJjaF9fc3dhYjE2KF9fdTE2IHgpCit7CisJX19hc21fXygieGNoZ2IgJWIwLCVoMCIJCS8qIHN3YXAgYnl0ZXMJCSovIFwKKwkJOiAiPXEiICh4KSBcCisJCTogICIwIiAoeCkpOyBcCisJCXJldHVybiB4OworfQorCisjZGVmaW5lIF9fYXJjaF9fc3dhYjMyKHgpIF9fX2FyY2hfX3N3YWIzMih4KQorI2RlZmluZSBfX2FyY2hfX3N3YWIxNih4KSBfX19hcmNoX19zd2FiMTYoeCkKKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorIyAgZGVmaW5lIF9fQllURU9SREVSX0hBU19VNjRfXworIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CisKKyNlbmRpZiAvKiBfSTM4Nl9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9nbG9iYWxfZGF0YS5oIGIvaW5jbHVkZS9hc20taTM4Ni9nbG9iYWxfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNGI0MzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2dsb2JhbF9kYXRhLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmCV9fQVNNX0dCTF9EQVRBX0gKKyNkZWZpbmUgX19BU01fR0JMX0RBVEFfSAorLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmUgaXMgcGxhY2VkIGluIHNvbWUgbWVtb3J5IHdpY2ggaXMKKyAqIGF2YWlsYWJsZSB2ZXJ5IGVhcmx5IGFmdGVyIGJvb3QgKGxpa2UgRFBSQU0gb24gTVBDOHh4L01QQzgyeHgsIG9yCisgKiBzb21lIGxvY2tlZCBwYXJ0cyBvZiB0aGUgZGF0YSBjYWNoZSkgdG8gYWxsb3cgZm9yIGEgbWluaW11bSBzZXQgb2YKKyAqIGdsb2JhbCB2YXJpYWJsZXMgZHVyaW5nIHN5c3RlbSBpbml0aWFsaXphdGlvbiAodW50aWwgd2UgaGF2ZSBzZXQKKyAqIHVwIHRoZSBtZW1vcnkgY29udHJvbGxlciBzbyB0aGF0IHdlIGNhbiB1c2UgUkFNKS4KKyAqCisgKiBLZWVwIGl0ICpTTUFMTCogYW5kIHJlbWVtYmVyIHRvIHNldCBDRkdfR0JMX0RBVEFfU0laRSA+IHNpemVvZihnZF90KQorICovCisKK3R5cGVkZWYJc3RydWN0IHsKKwliZF90CQkqYmQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1bnNpZ25lZCBsb25nCWJhdWRyYXRlOworCXVuc2lnbmVkIGxvbmcJaGF2ZV9jb25zb2xlOwkvKiBzZXJpYWxfaW5pdCgpIHdhcyBjYWxsZWQgKi8KKwl1bnNpZ25lZCBsb25nCXJlbG9jX29mZjsJLyogUmVsb2NhdGlvbiBPZmZzZXQgKi8KKwl1bnNpZ25lZCBsb25nCWVudl9hZGRyOwkvKiBBZGRyZXNzICBvZiBFbnZpcm9ubWVudCBzdHJ1Y3QgKi8KKwl1bnNpZ25lZCBsb25nCWVudl92YWxpZDsJLyogQ2hlY2tzdW0gb2YgRW52aXJvbm1lbnQgdmFsaWQ/ICovCisJdW5zaWduZWQgbG9uZwljcHVfY2xrOwkvKiBDUFUgY2xvY2sgaW4gSHohCQkqLworCXVuc2lnbmVkIGxvbmcJYnVzX2NsazsKKwl1bnNpZ25lZCBsb25nCXJhbV9zaXplOwkvKiBSQU0gc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcJcmVzZXRfc3RhdHVzOwkvKiByZXNldCBzdGF0dXMgcmVnaXN0ZXIgYXQgYm9vdCAqLworfSBnZF90OworCisvKgorICogR2xvYmFsIERhdGEgRmxhZ3MKKyAqLworI2RlZmluZQlHRF9GTEdfUkVMT0MJMHgwMDAwMQkJLyogQ29kZSB3YXMgcmVsb2NhdGVkIHRvIFJBTQkJKi8KKyNkZWZpbmUJR0RfRkxHX0RFVklOSVQJMHgwMDAwMgkJLyogRGV2aWNlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQJKi8KKworZXh0ZXJuIGdkX3QgKmdsb2JhbF9kYXRhOworCisjZGVmaW5lIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSICAgICBnZF90ICpnZCA9IGdsb2JhbF9kYXRhCisKKyNlbmRpZiAvKiBfX0FTTV9HQkxfREFUQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2k4MjU0LmggYi9pbmNsdWRlL2FzbS1pMzg2L2k4MjU0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzZjA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaTgyNTQuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworCisvKiBpODI1NC5oIEludGVsIDgyNTQgUElUIHJlZ2lzdGVycyAqLworCisKKyNpZm5kZWYgX0FTTUkzODZfSTgyNTRfSF8KKyNkZWZpbmUgX0FTTUkzODZfSTg5NTRfSF8gICAgICAgMQorCisKKworI2RlZmluZSBQSVRfVDAJCTB4MDAJCS8qIFBJVCBjaGFubmVsIDAgY291bnQvc3RhdHVzICovCisjZGVmaW5lIFBJVF9UMQkJMHgwMQkJLyogUElUIGNoYW5uZWwgMSBjb3VudC9zdGF0dXMgKi8KKyNkZWZpbmUgUElUX1QyCQkweDAyCQkvKiBQSVQgY2hhbm5lbCAyIGNvdW50L3N0YXR1cyAqLworI2RlZmluZSBQSVRfQ09NTUFORAkweDAzCQkvKiBQSVQgbW9kZSBjb250cm9sLCBsYXRjaCBhbmQgcmVhZCBiYWNrICovCisKKy8qIFBJVCBDb21tYW5kIFJlZ2lzdGVyIEJpdCBEZWZpbml0aW9ucyAqLworCisjZGVmaW5lIFBJVF9DTURfQ1RSMAkweDAwCQkvKiBTZWxlY3QgUElUIGNvdW50ZXIgMCAqLworI2RlZmluZSBQSVRfQ01EX0NUUjEJMHg0MAkJLyogU2VsZWN0IFBJVCBjb3VudGVyIDEgKi8KKyNkZWZpbmUgUElUX0NNRF9DVFIyCTB4ODAJCS8qIFNlbGVjdCBQSVQgY291bnRlciAyICovCisKKyNkZWZpbmUgUElUX0NNRF9MQVRDSAkweDAwCQkvKiBDb3VudGVyIExhdGNoIENvbW1hbmQgKi8KKyNkZWZpbmUgUElUX0NNRF9MT1cJMHgxMAkJLyogQWNjZXNzIGNvdW50ZXIgYml0cyA3LTAgKi8KKyNkZWZpbmUgUElUX0NNRF9ISUdICTB4MjAJCS8qIEFjY2VzcyBjb3VudGVyIGJpdHMgMTUtOCAqLworI2RlZmluZSBQSVRfQ01EX0JPVEgJMHgzMAkJLyogQWNjZXNzIGNvdW50ZXIgYml0cyAxNS0wIGluIHR3byBhY2Nlc3NlcyAqLworCisjZGVmaW5lIFBJVF9DTURfTU9ERTAJMHgwMAkJLyogU2VsZWN0IG1vZGUgMCAqLworI2RlZmluZSBQSVRfQ01EX01PREUxCTB4MDIJCS8qIFNlbGVjdCBtb2RlIDEgKi8KKyNkZWZpbmUgUElUX0NNRF9NT0RFMgkweDA0CQkvKiBTZWxlY3QgbW9kZSAyICovCisjZGVmaW5lIFBJVF9DTURfTU9ERTMJMHgwNgkJLyogU2VsZWN0IG1vZGUgMyAqLworI2RlZmluZSBQSVRfQ01EX01PREU0CTB4MDgJCS8qIFNlbGVjdCBtb2RlIDQgKi8KKyNkZWZpbmUgUElUX0NNRF9NT0RFNQkweDBBCQkvKiBTZWxlY3QgbW9kZSA1ICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pODI1OS5oIGIvaW5jbHVkZS9hc20taTM4Ni9pODI1OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTllMGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2k4MjU5LmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIsIGRhbmllbEBvbWljcm9uLnNlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIGk4MjU5LmggaTgyNTkgUElDIFJlZ2lzdGVycyAqLworCisjaWZuZGVmIF9BU01JMzg2X0k4MjU5X0hfCisjZGVmaW5lIF9BU01JMzg2X0k4OTU5X0hfICAgICAgIDEKKworCisvKiBQSUMgSS9PIG1hcHBlZCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBJUlIJCTB4MAkvKiBJbnRlcnJ1cHQgUmVxdWVzdCBSZWdpc3RlciAqLworI2RlZmluZSBJU1IJCTB4MAkvKiBJbi1TZXJ2aWNlIFJlZ2lzdGVyICovCisjZGVmaW5lIElDVzEJCTB4MAkvKiBJbml0aWFsaXphdGlvbiBDb250cm9sIFdvcmQgMSAqLworI2RlZmluZSBPQ1cyCQkweDAJLyogT3BlcmF0aW9uIENvbnRyb2wgV29yZCAyICovCisjZGVmaW5lIE9DVzMJCTB4MAkvKiBPcGVyYXRpb24gQ29udHJvbCBXb3JkIDMgKi8KKyNkZWZpbmUgSUNXMgkJMHgxCS8qIEluaXRpYWxpemF0aW9uIENvbnRyb2wgV29yZCAyICovCisjZGVmaW5lIElDVzMJCTB4MQkvKiBJbml0aWFsaXphdGlvbiBDb250cm9sIFdvcmQgMyAqLworI2RlZmluZSBJQ1c0CQkweDEJLyogSW5pdGlhbGl6YXRpb24gQ29udHJvbCBXb3JkIDQgKi8KKyNkZWZpbmUgSU1SCQkweDEJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKworLyogYml0cyBmb3IgSVJSLCBJTVIsIElTUiBhbmQgSUNXMyAqLworI2RlZmluZQlJUjcJCTB4ODAJLyogSVI3ICovCisjZGVmaW5lCUlSNgkJMHg0MAkvKiBJUjYgKi8KKyNkZWZpbmUJSVI1CQkweDIwCS8qIElSNSAqLworI2RlZmluZQlJUjQJCTB4MTAJLyogSVI0ICovCisjZGVmaW5lCUlSMwkJMHgwOAkvKiBJUjMgKi8KKyNkZWZpbmUJSVIyCQkweDA0CS8qIElSMiAqLworI2RlZmluZQlJUjEJCTB4MDIJLyogSVIxICovCisjZGVmaW5lCUlSMAkJMHgwMQkvKiBJUjAgKi8KKworLyogYml0cyBmb3IgU0VPSSAqLworI2RlZmluZQlTRU9JX0lSNwkweDA3CS8qIElSNyAqLworI2RlZmluZQlTRU9JX0lSNgkweDA2CS8qIElSNiAqLworI2RlZmluZQlTRU9JX0lSNQkweDA1CS8qIElSNSAqLworI2RlZmluZQlTRU9JX0lSNAkweDA0CS8qIElSNCAqLworI2RlZmluZQlTRU9JX0lSMwkweDAzCS8qIElSMyAqLworI2RlZmluZQlTRU9JX0lSMgkweDAyCS8qIElSMiAqLworI2RlZmluZQlTRU9JX0lSMQkweDAxCS8qIElSMSAqLworI2RlZmluZQlTRU9JX0lSMAkweDAwCS8qIElSMCAqLworCisvKiBPQ1cyIGJpdHMgKi8KKyNkZWZpbmUgT0NXMl9SQ0xSCTB4MDAJLyogUm90YXRlL2NsZWFyICovCisjZGVmaW5lIE9DVzJfTkVPSQkweDIwCS8qIE5vbiBzcGVjaWZpYyBFT0kgKi8KKyNkZWZpbmUgT0NXMl9OT1AJMHg0MAkvKiBOT1AgKi8KKyNkZWZpbmUgT0NXMl9TRU9JCTB4NjAJLyogU3BlY2lmaWMgRU9JICovCisjZGVmaW5lIE9DVzJfUlNFVAkweDgwCS8qIFJvdGF0ZS9zZXQgKi8KKyNkZWZpbmUgT0NXMl9SRU9JCTB4QTAJLyogUm90YXRlIG9uIG5vbiBzcGVjaWZpYyBFT0kgKi8KKyNkZWZpbmUgT0NXMl9QU0VUCTB4QzAJLyogUHJpb3JpdHkgU2V0IENvbW1hbmQgKi8KKyNkZWZpbmUgT0NXMl9SU0VPSQkweEUwCS8qIFJvdGF0ZSBvbiBzcGVjaWZpYyBFT0kgKi8KKworLyogSUNXMSBiaXRzICovCisjZGVmaW5lIElDVzFfU0VMCTB4MTAJLyogU2VsZWN0IElDVzEgKi8KKyNkZWZpbmUgSUNXMV9MVElNCTB4MDgJLyogTGV2ZWwtVHJpZ2dlcmVkIEludGVycnVwdCBNb2RlICovCisjZGVmaW5lIElDVzFfQURJCTB4MDQJLyogQWRkcmVzcyBJbnRlcnZhbCAqLworI2RlZmluZSBJQ1cxX1NOR0wJMHgwMgkvKiBTaW5nbGUgUElDICovCisjZGVmaW5lIElDVzFfRUlDVzQJMHgwMQkvKiBFeHBlY3QgaW5pdGlsaXphdGlvbiBJQ1c0ICovCisKKy8qIElDVzIgaXMgdGhlIHN0YXJ0aW5nIHZlY3RvciBudW1iZXIgKi8KKworLyogSUNXMiBpcyBiaXQtbWFzayBvZiBwcmVzZW50IHNsYXZlcyBmb3IgYSBtYXN0ZXIgZGV2aWNlLCAKKyAqIG9yIHRoZSBzbGF2ZSBJRCBmb3IgYSBzbGF2ZSBkZXZpY2UgKi8KKworLyogSUNXNCBiaXRzICovCisjZGVmaW5lCUlDVzRfQUVPSQkweDAyCS8qIEF1dG9tYXRpYyBFT0kgTW9kZSAqLworI2RlZmluZSBJQ1c0X1BNCQkweDAxCS8qIE1pY3JvcHJvY2Vzc29yIE1vZGUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2libXBjLmggYi9pbmNsdWRlL2FzbS1pMzg2L2libXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkZDFkNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaWJtcGMuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UKKyAqIAorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0FTTV9JQk1QQ19IXworI2RlZmluZSBfX0FTTV9JQk1QQ19IXyAxCisKKy8qIG1pc2MgcG9ydHMgaW4gYW4gaWJtIGNvbXBhdGlibGUgcGMgKi8KKworI2RlZmluZSBNQVNURVJfUElDICAgICAgMHgyMAorI2RlZmluZSBQSVRfQkFTRQkweDQwCisjZGVmaW5lIEtCRERBVEEgICAgICAgICAweDYwCisjZGVmaW5lIFNZU0NUTEIgICAgICAgICAweDYyCisjZGVmaW5lIEtCRENNRCAgICAgICAgICAweDY0CisjZGVmaW5lIFNZU0NUTEEgICAgICAgICAweDkyCisjZGVmaW5lIFNMQVZFX1BJQyAgICAgICAweGEwCisKKyNpZiAxCisjZGVmaW5lIFVBUlQwX0JBU0UgICAgIDB4M2Y4CisjZGVmaW5lIFVBUlQxX0JBU0UgICAgIDB4MmY4CisjZWxzZQorLyogRml4TWU6IHVhcnRzIHN3YXBwZWQgKi8KKyNkZWZpbmUgVUFSVDBfQkFTRSAgICAgMHgyZjgKKyNkZWZpbmUgVUFSVDFfQkFTRSAgICAgMHgzZjgKKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pYy9hbGk1MTJ4LmggYi9pbmNsdWRlL2FzbS1pMzg2L2ljL2FsaTUxMnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmMxYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9pYy9hbGk1MTJ4LmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIgPGRhbmllbEBvbWljcm9uLnNlPi4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQVNNX0lDX0FMSTUxMlhfSF8KKyNkZWZpbmUgX19BU01fSUNfQUxJNTEyWF9IXworCisjIGRlZmluZSBBTElfSU5ERVggICAgMHgzZjAKKyMgZGVmaW5lIEFMSV9EQVRBICAgICAweDNmMQorCisjIGRlZmluZSBBTElfRU5BQkxFRCAgMQorIyBkZWZpbmUgQUxJX0RJU0FCTEVEIDAKKworIyBkZWZpbmUgQUxJX1VBUlQxICAgIDAKKyMgZGVmaW5lIEFMSV9VQVJUMiAgICAxCisKKy8qIHNldHVwIGZ1bmN0aW9ucyAqLwordm9pZCBhbGk1MTJ4X2luaXQodm9pZCk7Cit2b2lkIGFsaTUxMnhfc2V0X2ZkYyhpbnQgZW5hYmxlZCwgdTE2IGlvLCB1OCBpcnEsIHU4IGRtYV9jaGFubmVsKTsKK3ZvaWQgYWxpNTEyeF9zZXRfcHAoaW50IGVuYWJsZWQsIHUxNiBpbywgdTggaXJxLCB1OCBkbWFfY2hhbm5lbCk7Cit2b2lkIGFsaTUxMnhfc2V0X3VhcnQoaW50IGVuYWJsZWQsIGludCBpbmRleCwgdTE2IGlvLCB1OCBpcnEpOwordm9pZCBhbGk1MTJ4X3NldF9ydGMoaW50IGVuYWJsZWQsIHUxNiBpbywgdTggaXJxKTsKK3ZvaWQgYWxpNTEyeF9zZXRfa2JjKGludCBlbmFibGVkLCB1OCBrYmNfaXJxLCB1OCBtb3VzZV9pcnEpOwordm9pZCBhbGk1MTJ4X3NldF9jaW8oaW50IGVuYWJsZWQpOworCisKKy8qIGNvbW1vbiBJL08gZnVuY3Rpb25zICovCit2b2lkIGFsaTUxMnhfY2lvX2Z1bmN0aW9uKGludCBwaW4sIGludCBzcGVjaWFsLCBpbnQgaW52LCBpbnQgaW5wdXQpOwordm9pZCBhbGk1MTJ4X2Npb19vdXQoaW50IHBpbiwgaW50IHZhbHVlKTsKK2ludCBhbGk1MTJ4X2Npb19pbihpbnQgcGluKTsKKworLyogbWlzYyBmZWF0dXJlcyAqLwordm9pZCBhbGk1MTJ4X3NldF91YXJ0Ml9pcmRhKGludCBlbmFibGVkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2ljL3NjNTIwLmggYi9pbmNsdWRlL2FzbS1pMzg2L2ljL3NjNTIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwODUwNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaWMvc2M1MjAuaApAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIgPGRhbmllbEBvbWljcm9uLnNlPi4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9BU01fSUNfU0M1MjBfSF8KKyNkZWZpbmUgX0FTTV9JQ19TQzUyMF9IXyAxCisKKy8qIE1lbW9yeSBtYXBwZWQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMsIE1NQ1IgKi8KKyNkZWZpbmUgU0M1MjBfUkVWSUQJCTB4MDAwMAkJLyogRWxhblNDNTIwIE1pY3JvY29udHJvbGxlciBSZXZpc2lvbiBJRCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9DUFVDVEwJCTB4MDAwMgkJLyogQW01eDg2IENQVSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0RSQ0NUTCAgICAgICAgICAgIDB4MDAxMCAgICAgICAgICAvKiBTRFJBTSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0RSQ1RNQ1RMCQkweDAwMTIJCS8qIFNEUkFNIFRpbWluZyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0RSQ0NGRwkJMHgwMDE0CQkvKiBTRFJBTSBCYW5rIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIqLworI2RlZmluZSBTQzUyMF9EUkNCRU5EQURSCTB4MDAxOAkJLyogU0RSQU0gQmFuayAwLTMgRW5kaW5nIEFkZHJlc3MgUmVnaXN0ZXIqLworI2RlZmluZSBTQzUyMF9FQ0NDVEwJCTB4MDAyMAkJLyogRUNDIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfRUNDU1RBCQkweDAwMjEJCS8qIEVDQyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfRUNDQ0tCUE9TCQkweDAwMjIJCS8qIEVDQyBDaGVjayBCaXQgUG9zaXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfRUNDU0JBREQJCTB4MDAyNAkJLyogRUNDIFNpbmdsZS1CaXQgRXJyb3IgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9EQkNUTAkJMHgwMDQwCQkvKiBTRFJBTSBCdWZmZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9CT09UQ1NDVEwJCTB4MDA1MAkJLyogL0JPT1RDUyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1JPTUNTMUNUTAkJMHgwMDU0CQkvKiAvUk9NQ1MxIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfUk9NQ1MyQ1RMCQkweDAwNTYJCS8qIC9ST01DUzIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9IQkNUTAkJMHgwMDYwIAkJLyogSG9zdCBCcmlkZ2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9IQlRHVElSUUNUTAkweDAwNjIJCS8qIEhvc3QgQnJpZGdlIFRhcmdldCBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9IQlRHVElSUVNUQQkweDAwNjQJCS8qIEhvc3QgQnJpZGdlIFRhcmdldCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0hCTVNUSVJRQ1RMCTB4MDA2NgkJLyogSG9zdCBCcmlkZ2UgVGFyZ2V0IEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0hCTVNUSVJRU1RBCTB4MDA2OAkJLyogSG9zdCBCcmlkZ2UgTWFzdGVyIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfTVNUSU5UQURECQkweDAwNmMJCS8qIEhvc3QgQnJpZGdlIE1hc3RlciBJbnRlcnJ1cHQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9TWVNBUkJDVEwJCTB4MDA3MAkJLyogU3lzdGVtIEFyYml0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQ0lBUkJTVEEJCTB4MDA3MQkJLyogUENJIEJ1cyBBcmJpdGVyIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9TWVNBUkJNRU5CCTB4MDA3MgkJLyogU3lzdGVtIEFyYml0ZXIgTWFzdGVyIEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9BUkJQUklDVEwJCTB4MDA3NAkJLyogQXJiaXRlciBQcmlvcml0eSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0FERERFQ0NUTCAgICAgCTB4MDA4MCAJCS8qIEFkZHJlc3MgRGVjb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfV1BWU1RBICAgICAgICAJMHgwMDgyCQkvKiBXcml0ZS1Qcm90ZWN0IFZpb2xhdGlvbiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfUEFSMCAgICAgICAgICAJMHgwMDg4CQkvKiBQcm9ncmFtbWFibGUgQWRkcmVzcyBSZWdpb24gMCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQVIxICAgICAgICAgIAkweDAwOGMgICAgICAgCS8qIFByb2dyYW1tYWJsZSBBZGRyZXNzIFJlZ2lvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1BBUjIgICAgICAgICAgCTB4MDA5MCAgICAgICAJLyogUHJvZ3JhbW1hYmxlIEFkZHJlc3MgUmVnaW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfUEFSMyAgICAgICAgICAJMHgwMDk0ICAgICAgCS8qIFByb2dyYW1tYWJsZSBBZGRyZXNzIFJlZ2lvbiAzIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1BBUjQgICAgICAgICAgCTB4MDA5OCAgICAgICAJLyogUHJvZ3JhbW1hYmxlIEFkZHJlc3MgUmVnaW9uIDQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfUEFSNSAgICAgICAgICAJMHgwMDljICAgICAgIAkvKiBQcm9ncmFtbWFibGUgQWRkcmVzcyBSZWdpb24gNSBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQVI2ICAgICAgICAgCTB4MDBhMCAgICAgIAkvKiBQcm9ncmFtbWFibGUgQWRkcmVzcyBSZWdpb24gNiBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQVI3ICAgICAgICAgIAkweDAwYTQgICAgICAgCS8qIFByb2dyYW1tYWJsZSBBZGRyZXNzIFJlZ2lvbiA3IFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1BBUjggICAgICAgICAgCTB4MDBhOCAgICAgICAJLyogUHJvZ3JhbW1hYmxlIEFkZHJlc3MgUmVnaW9uIDggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfUEFSOSAgICAgICAgICAJMHgwMGFjICAgICAgIAkvKiBQcm9ncmFtbWFibGUgQWRkcmVzcyBSZWdpb24gOSBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQVIxMCAgICAgICAgIAkweDAwYjAgICAgICAgCS8qIFByb2dyYW1tYWJsZSBBZGRyZXNzIFJlZ2lvbiAxMCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQVIxMSAgICAgICAgIAkweDAwYjQgICAgICAgCS8qIFByb2dyYW1tYWJsZSBBZGRyZXNzIFJlZ2lvbiAxMSBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQVIxMiAgICAgICAgIAkweDAwYjggICAgICAgCS8qIFByb2dyYW1tYWJsZSBBZGRyZXNzIFJlZ2lvbiAxMiBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQVIxMyAgICAgICAgIAkweDAwYmMgICAgICAgCS8qIFByb2dyYW1tYWJsZSBBZGRyZXNzIFJlZ2lvbiAxMyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQVIxNCAgICAgICAgIAkweDAwYzAgICAgICAgCS8qIFByb2dyYW1tYWJsZSBBZGRyZXNzIFJlZ2lvbiAxNCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQVIxNQkJMHgwMGM0CQkvKiBQcm9ncmFtbWFibGUgQWRkcmVzcyBSZWdpb24gMTUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BFQ0hPCQkweDBjMDAJCS8qIEdQIEVjaG8gTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9HUENTRFcJCTB4MGMwMQkJLyogR1AgQ2hpcCBTZWxlY3QgRGF0YSBXaWR0aCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9HUENTUVVBTAkJMHgwYzAyCQkvKiBHUCBDaGlwIFNlbGVjdCBRdWFsaWZpY2F0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQQ1NSVAkJMHgwYzA4CQkvKiBHUCBDaGlwIFNlbGVjdCBSZWNvdmVyeSBUaW1lIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQQ1NQVwkJMHgwYzA5CQkvKiBHUCBDaGlwIFNlbGVjdCBQdWxzZSBXaWR0aCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9HUENTT0ZGCQkweDBjMGEJCS8qIEdQIENoaXAgU2VsZWN0IE9mZnNldCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9HUFJEVwkJMHgwYzBiCQkvKiBHUCBSZWFkIFB1bHNlIFdpZHRoIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQUkRPRkYJCTB4MGMwYwkJLyogR1AgUmVhZCBPZmZzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BXUlcJCTB4MGMwZAkJLyogR1AgV3JpdGUgUHVsc2UgV2lkdGggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BXUk9GRgkJMHgwYzBlCQkvKiBHUCBXcml0ZSBPZmZzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BBTEVXCQkweDBjMGYJCS8qIEdQIEFMRSBQdWxzZSBXaWR0aCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9HUEFMRU9GRgkJMHgwYzEwCQkvKiBHUCBBTEUgT2Zmc2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1BJT1BGUzE1XzAJMHgwYzIwCQkvKiBQSU8xNS1QSU8wIFBpbiBGdW5jdGlvbiBTZWxlY3QgKi8KKyNkZWZpbmUgU0M1MjBfUElPUEZTMzFfMTYJMHgwYzIyCQkvKiBQSU8zMS1QSU8xNiBQaW4gRnVuY3Rpb24gU2VsZWN0ICovCisjZGVmaW5lIFNDNTIwX0NTUEZTCQkweDBjMjQJCS8qIENoaXAgU2VsZWN0IFBpbiBGdW5jdGlvbiBTZWxlY3QgKi8KKyNkZWZpbmUgU0M1MjBfQ0xLU0VMCQkweDBjMjYJCS8qIENsb2NrIFNlbGVjdCAqLworI2RlZmluZSBTQzUyMF9EU0NUTAkJMHgwYzI4CQkvKiBEcml2ZSBTdHJlbmd0aCBDb250cm9sICovCisjZGVmaW5lIFNDNTIwX1BJT0RJUjE1XzAJMHgwYzJhCQkvKiBQSU8xNS1QSU8wIERpcmVjdGlvbiAqLworI2RlZmluZSBTQzUyMF9QSU9ESVIzMV8xNgkweDBjMmMJCS8qIFBJTzMxLVBJTzE2IERpcmVjdGlvbiAqLworI2RlZmluZSBTQzUyMF9QSU9EQVRBMTVfMAkweDBjMzAJCS8qIFBJTzE1LVBJTzAgRGF0YSAqLworI2RlZmluZSBTQzUyMF9QSU9EQVRBMzFfMTYJMHgwYzMyCQkvKiBQSU8zMS1QSU8xNiBEYXRhICovCisjZGVmaW5lIFNDNTIwX1BJT1NFVDE1XzAJMHgwYzM0CQkvKiBQSU8xNS1QSU8wIFNldCAqLworI2RlZmluZSBTQzUyMF9QSU9TRVQzMV8xNgkweDBjMzYJCS8qIFBJTzMxLVBJTzE2IFNldCAqLworI2RlZmluZSBTQzUyMF9QSU9DTFIxNV8wCTB4MGMzOAkJLyogUElPMTUtUElPMCBDbGVhciAqLworI2RlZmluZSBTQzUyMF9QSU9DTFIzMV8xNgkweDBjM2EJCS8qIFBJTzMxLVBJTzE2IENsZWFyICovCisjZGVmaW5lIFNDNTIwX1NXVE1STUlMTEkgCTB4MGM2MAkJLyogU29mdHdhcmUgVGltZXIgTWlsbGlzZWNvbmQgQ291bnQgKi8KKyNkZWZpbmUgU0M1MjBfU1dUTVJNSUNSTyAJMHgwYzYyCQkvKiBTb2Z0d2FyZSBUaW1lciBNaWNyb3NlY29uZCBDb3VudCAqLworI2RlZmluZSBTQzUyMF9TV1RNUkNGRyAgIAkweDBjNjQJCS8qIFNvZnR3YXJlIFRpbWVyIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgU0M1MjBfR1BUTVJTVEEJCTB4MGM3MAkJLyogR1AgVGltZXJzIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9HUFRNUjBDVEwJCTB4MGM3MgkJLyogR1AgVGltZXIgMCBNb2RlL0NvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BUTVIwQ05UCQkweDBjNzQJCS8qIEdQIFRpbWVyIDAgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BUTVIwTUFYQ01QQQkweDBjNzYJCS8qIEdQIFRpbWVyIDAgTWF4Y291bnQgQ29tcGFyZSBBIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQVE1SME1BWENNUEIJMHgwYzc4CQkvKiBHUCBUaW1lciAwIE1heGNvdW50IENvbXBhcmUgQiBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9HUFRNUjFDVEwJCTB4MGM3YQkJLyogR1AgVGltZXIgMSBNb2RlL0NvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BUTVIxQ05UCQkweDBjN2MJCS8qIEdQIFRpbWVyIDEgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BUTVIxTUFYQ01QQQkweDBjN2UJCS8qIEdQIFRpbWVyIDEgTWF4Y291bnQgQ29tcGFyZSBSZWdpc3RlciBBICovCisjZGVmaW5lIFNDNTIwX0dQVE1SMU1BWENNUEIJMHgwYzgwCQkvKiBHUCBUaW1lciAxIE1heGNvdW50IENvbXBhcmUgQiBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9HUFRNUjJDVEwJCTB4MGM4MgkJLyogR1AgVGltZXIgMiBNb2RlL0NvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BUTVIyQ05UCQkweDBjODQJCS8qIEdQIFRpbWVyIDIgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BUTVIyTUFYQ01QQQkweDBjOGUJCS8qIEdQIFRpbWVyIDIgTWF4Y291bnQgQ29tcGFyZSBBIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1dEVE1SQ1RMCQkweDBjYjAJCS8qIFdhdGNoZG9nIFRpbWVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfV0RUTVJDTlRMCQkweDBjYjIJCS8qIFdhdGNoZG9nIFRpbWVyIENvdW50IExvdyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9XRFRNUkNOVEgJCTB4MGNiNAkJLyogV2F0Y2hkb2cgVGltZXIgQ291bnQgSGlnaCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9VQVJUMUNUTAkJMHgwY2MwCSAgICAgICAgLyogVUFSVCAxIEdlbmVyYWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9VQVJUMVNUQQkJMHgwY2MxCSAgICAgICAgLyogVUFSVCAxIEdlbmVyYWwgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1VBUlQxRkNSU0hBRAkweDBjYzIJICAgICAgICAvKiBVQVJUIDEgRklGTyBDb250cm9sIFNoYWRvdyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9VQVJUMkNUTAkJMHgwY2M0CSAgICAgICAgLyogVUFSVCAyIEdlbmVyYWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9VQVJUMlNUQQkJMHgwY2M1CSAgICAgICAgLyogVUFSVCAyIEdlbmVyYWwgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1VBUlQyRkNSU0hBRAkweDBjYzYJICAgICAgICAvKiBVQVJUIDIgRklGTyBDb250cm9sIFNoYWRvdyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QSUNJQ1IJCTB4MGQwMAkJLyogSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfTVBJQ01PREUJCTB4MGQwMgkJLyogTWFzdGVyIFBJQyBJbnRlcnJ1cHQgTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9TTDFQSUNNT0RFCTB4MGQwMwkJLyogU2xhdmUgMSBQSUMgSW50ZXJydXB0IE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfU0wyUElDTU9ERQkweDBkMDQJCS8qIFNsYXZlIDIgUElDIEludGVycnVwdCBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1NXSU5UMTZfMQkJMHgwZDA4CQkvKiBTb2Z0d2FyZSBJbnRlcnJ1cHQgMTYtMSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1NXSU5UMjJfMTcJMHgwZDBhCQkvKiBTb2Z0d2FyZSBJbnRlcnJ1cHQgMjItMTcvTk1JIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfSU5UUElOUE9MCQkweDBkMTAJCS8qIEludGVycnVwdCBQaW4gUG9sYXJpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfUENJSE9TVE1BUAkweDBkMTQJCS8qIFBDSSBIb3N0IEJyaWRnZSBJbnRlcnJ1cHQgTWFwcGluIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0VDQ01BUAkJMHgwZDE4CQkvKiBFQ0MgSW50ZXJydXB0IE1hcHBpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BUTVIwTUFQCQkweDBkMWEJCS8qIEdQIFRpbWVyIDAgSW50ZXJydXB0IE1hcHBpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BUTVIxTUFQCQkweDBkMWIJCS8qIEdQIFRpbWVyIDEgSW50ZXJydXB0IE1hcHBpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfR1BUTVIyTUFQCQkweDBkMWMJCS8qIEdQIFRpbWVyIDIgSW50ZXJydXB0IE1hcHBpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfUElUME1BUAkJMHgwZDIwCQkvKiBQSVQwIEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1BJVDFNQVAJCTB4MGQyMQkJLyogUElUMSBJbnRlcnJ1cHQgTWFwcGluZyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QSVQyTUFQCQkweDBkMjIJCS8qIFBJVDIgSW50ZXJydXB0IE1hcHBpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfVUFSVDFNQVAJCTB4MGQyOAkJLyogVUFSVCAxIEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1VBUlQyTUFQCQkweDBkMjkJCS8qIFVBUlQgMiBJbnRlcnJ1cHQgTWFwcGluZyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQ0lJTlRBTUFQCTB4MGQzMAkJLyogUENJIEludGVycnVwdCBBIE1hcHBpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfUENJSU5UQk1BUAkweDBkMzEJCS8qIFBDSSBJbnRlcnJ1cHQgQiBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1BDSUlOVENNQVAJMHgwZDMyCQkvKiBQQ0kgSW50ZXJydXB0IEMgTWFwcGluZyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9QQ0lJTlRETUFQCTB4MGQzMwkJLyogUENJIEludGVycnVwdCBEIE1hcHBpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfRE1BQkNJTlRNQVAJMHgwZDQwCQkvKiBETUEgQnVmZmVyIENoYWluaW5nIEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1NTSU1BUAkJMHgwZDQxCQkvKiBTU0kgSW50ZXJydXB0IE1hcHBpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfV0RUTUFQCQkweDBkNDIJCS8qIFdhdGNoZG9nIFRpbWVyIEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX1JUQ01BUAkJMHgwZDQzCQkvKiBSVEMgSW50ZXJydXB0IE1hcHBpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfV1BWTUFQCQkweDBkNDQJCS8qIFdyaXRlLVByb3RlY3QgSW50ZXJydXB0IE1hcHBpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfSUNFTUFQCQkweDBkNDUJCS8qIEFNRGVidWcgSlRBRyBSWC9UWCBJbnRlcnJ1cHQgTWFwcGluZyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9GRVJSTUFQCQkweDBkNDYJCS8qIEZsb2F0aW5nIFBvaW50IEVycm9yIEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQMElNQVAJCTB4MGQ1MAkJLyogR1BJUlEwIEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQMUlNQVAJCTB4MGQ1MQkJLyogR1BJUlExIEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQMklNQVAJCTB4MGQ1MgkJLyogR1BJUlEyIEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQM0lNQVAJCTB4MGQ1MwkJLyogR1BJUlEzIEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQNElNQVAJCTB4MGQ1NAkJLyogR1BJUlE0IEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQNUlNQVAJCTB4MGQ1NQkJLyogR1BJUlE1IEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQNklNQVAJCTB4MGQ1NgkJLyogR1BJUlE2IEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQN0lNQVAJCTB4MGQ1NwkJLyogR1BJUlE3IEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQOElNQVAJCTB4MGQ1OAkJLyogR1BJUlE4IEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQOUlNQVAJCTB4MGQ1OQkJLyogR1BJUlE5IEludGVycnVwdCBNYXBwaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQMTBJTUFQCQkweDBkNWEJCS8qIEdQSVJRMTAgSW50ZXJydXB0IE1hcHBpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfU1lTSU5GTwkJMHgwZDcwCQkvKiBTeXN0ZW0gQm9hcmQgSW5mb3JtYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfUkVTQ0ZHCQkweDBkNzIJCS8qIFJlc2V0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0M1MjBfUkVTU1RBCQkweDBkNzQJCS8qIFJlc2V0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTQzUyMF9HUERNQU1NSU8JCTB4MGQ4MQkJLyogR1AtRE1BIE1lbW9yeS1NYXBwZWQgSS9PIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDNTIwX0dQRE1BRVhUQ0hNQVBBCTB4MGQ4MgkJLyogR1AtRE1BIFJlc291cmNlIENoYW5uZWwgTWFwIEEgKi8KKyNkZWZpbmUgU0M1MjBfR1BETUFFWFRDSE1BUEIJMHgwZDg0CQkvKiBHUC1ETUEgUmVzb3VyY2UgQ2hhbm5lbCBNYXAgQiAqLworI2RlZmluZSBTQzUyMF9HUERNQUVYVFBHMAkweDBkODYJCS8qIEdQLURNQSBDaGFubmVsIDAgRXh0ZW5kZWQgUGFnZSAqLworI2RlZmluZSBTQzUyMF9HUERNQUVYVFBHMQkweDBkODcJCS8qIEdQLURNQSBDaGFubmVsIDEgRXh0ZW5kZWQgUGFnZSAqLworI2RlZmluZSBTQzUyMF9HUERNQUVYVFBHMgkweDBkODgJCS8qIEdQLURNQSBDaGFubmVsIDIgRXh0ZW5kZWQgUGFnZSAqLworI2RlZmluZSBTQzUyMF9HUERNQUVYVFBHMwkweDBkODkJCS8qIEdQLURNQSBDaGFubmVsIDMgRXh0ZW5kZWQgUGFnZSAqLworI2RlZmluZSBTQzUyMF9HUERNQUVYVFBHNQkweDBkOGEJCS8qIEdQLURNQSBDaGFubmVsIDUgRXh0ZW5kZWQgUGFnZSAqLworI2RlZmluZSBTQzUyMF9HUERNQUVYVFBHNgkweDBkOGIJCS8qIEdQLURNQSBDaGFubmVsIDYgRXh0ZW5kZWQgUGFnZSAqLworI2RlZmluZSBTQzUyMF9HUERNQUVYVFBHNwkweDBkOGMJCS8qIEdQLURNQSBDaGFubmVsIDcgRXh0ZW5kZWQgUGFnZSAqLworI2RlZmluZSBTQzUyMF9HUERNQUVYVFRDMwkweDBkOTAJCS8qIEdQLURNQSBDaGFubmVsIDMgRXh0ZW5kZXIgVHJhbnNmZXIgY291bnQgKi8KKyNkZWZpbmUgU0M1MjBfR1BETUFFWFRUQzUJMHgwZDkxCQkvKiBHUC1ETUEgQ2hhbm5lbCA1IEV4dGVuZGVyIFRyYW5zZmVyIGNvdW50ICovCisjZGVmaW5lIFNDNTIwX0dQRE1BRVhUVEM2CTB4MGQ5MgkJLyogR1AtRE1BIENoYW5uZWwgNiBFeHRlbmRlciBUcmFuc2ZlciBjb3VudCAqLworI2RlZmluZSBTQzUyMF9HUERNQUVYVFRDNwkweDBkOTMJCS8qIEdQLURNQSBDaGFubmVsIDcgRXh0ZW5kZXIgVHJhbnNmZXIgY291bnQgKi8KKyNkZWZpbmUgU0M1MjBfR1BETUFCQ0NUTAkweDBkOTgJCS8qIEJ1ZmZlciBDaGFpbmluZyBDb250cm9sICovCisjZGVmaW5lIFNDNTIwX0dQRE1BQkNTVEEJMHgwZDk5CQkvKiBCdWZmZXIgQ2hhaW5pbmcgU3RhdHVzICovCisjZGVmaW5lIFNDNTIwX0dQRE1BQlNJTlRFTkIJMHgwZDlhCQkvKiBCdWZmZXIgQ2hhaW5pbmcgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBTQzUyMF9HUERNQUJDVkFMCTB4MGQ5YgkJLyogQnVmZmVyIENoYWluaW5nIFZhbGlkICovCisjZGVmaW5lIFNDNTIwX0dQRE1BTlhUQURETDMJMHgwZGEwCQkvKiBHUC1ETUEgQ2hhbm5lbCAzIE5leHQgQWRkcmVzcyBMb3cgKi8KKyNkZWZpbmUgU0M1MjBfR1BETUFOWFRBRERIMwkweDBkYTIJCS8qIEdQLURNQSBDaGFubmVsIDMgTmV4dCBBZGRyZXNzIEhpZ2ggKi8KKyNkZWZpbmUgU0M1MjBfR1BETUFOWFRBRERMNQkweDBkYTQJCS8qIEdQLURNQSBDaGFubmVsIDUgTmV4dCBBZGRyZXNzIExvdyAqLworI2RlZmluZSBTQzUyMF9HUERNQU5YVEFEREg1CTB4MGRhNgkJLyogR1AtRE1BIENoYW5uZWwgNSBOZXh0IEFkZHJlc3MgSGlnaCAqLworI2RlZmluZSBTQzUyMF9HUERNQU5YVEFEREw2CTB4MGRhOAkJLyogR1AtRE1BIENoYW5uZWwgNiBOZXh0IEFkZHJlc3MgTG93ICovCisjZGVmaW5lIFNDNTIwX0dQRE1BTlhUQURESDYJMHgwZGFhCQkvKiBHUC1ETUEgQ2hhbm5lbCA2IE5leHQgQWRkcmVzcyBIaWdoICovCisjZGVmaW5lIFNDNTIwX0dQRE1BTlhUQURETDcJMHgwZGFjCQkvKiBHUC1ETUEgQ2hhbm5lbCA3IE5leHQgQWRkcmVzcyBMb3cgKi8KKyNkZWZpbmUgU0M1MjBfR1BETUFOWFRBRERINwkweDBkYWUJCS8qIEdQLURNQSBDaGFubmVsIDcgTmV4dCBBZGRyZXNzIEhpZ2ggKi8KKyNkZWZpbmUgU0M1MjBfR1BETUFOWFRUQ0wzCTB4MGRiMAkJLyogR1AtRE1BIENoYW5uZWwgMyBOZXh0IFRyYW5zZmVyIENvdW50IExvdyAqLworI2RlZmluZSBTQzUyMF9HUERNQU5YVFRDSDMJMHgwZGIyCQkvKiBHUC1ETUEgQ2hhbm5lbCAzIE5leHQgVHJhbnNmZXIgQ291bnQgSGlnaCAqLworI2RlZmluZSBTQzUyMF9HUERNQU5YVFRDTDUJMHgwZGI0CQkvKiBHUC1ETUEgQ2hhbm5lbCA1IE5leHQgVHJhbnNmZXIgQ291bnQgTG93ICovCisjZGVmaW5lIFNDNTIwX0dQRE1BTlhUVENINQkweDBkYjYJCS8qIEdQLURNQSBDaGFubmVsIDUgTmV4dCBUcmFuc2ZlciBDb3VudCBIaWdoICovCisjZGVmaW5lIFNDNTIwX0dQRE1BTlhUVENMNgkweDBkYjgJCS8qIEdQLURNQSBDaGFubmVsIDYgTmV4dCBUcmFuc2ZlciBDb3VudCBMb3cgKi8KKyNkZWZpbmUgU0M1MjBfR1BETUFOWFRUQ0g2CTB4MGRiYQkJLyogR1AtRE1BIENoYW5uZWwgNiBOZXh0IFRyYW5zZmVyIENvdW50IEhpZ2ggKi8KKyNkZWZpbmUgU0M1MjBfR1BETUFOWFRUQ0w3CTB4MGRiYwkJLyogR1AtRE1BIENoYW5uZWwgNyBOZXh0IFRyYW5zZmVyIENvdW50IExvdyAqLworI2RlZmluZSBTQzUyMF9HUERNQU5YVFRDSDcJMHgwZGJlCQkvKiBHUC1ETUEgQ2hhbm5lbCA3IE5leHQgVHJhbnNmZXIgQ291bnQgSGlnaCAqLworCisvKiBNTUNSIFJlZ2lzdGVyIGJpdHMgKG5vdCBhbGwgb2YgdGhlbSA6KSApICovCisKKy8qIEJJVFMgZm9yIFNDNTIwX0FERERFQ0NUTDogKi8KKyNkZWZpbmUgV1BWX0lOVF9FTkIJCTB4ODAJCS8qIFdyaXRlLVByb3RlY3QgVmlvbGF0aW9uIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgSU9fSE9MRV9ERVNUCQkweDEwCQkvKiBJL08gSG9sZSBBY2Nlc3MgRGVzdGluYXRpb24gKi8KKyNkZWZpbmUgUlRDX0RJUwkJCTB4MDQJCS8qIFJUQyBEaXNhYmxlICovCisjZGVmaW5lIFVBUlQyX0RJUwkJMHgwMgkJLyogVUFSVDIgRGlzYWJsZSAqLworI2RlZmluZSBVQVJUMV9ESVMJCTB4MDEJCS8qIFVBUlQxIERpc2FibGUgKi8KKworLyogYnVzIG1hcHBpbmcgY29uc3RhbnRzICh1c2VkIGZvciBQQ0kgY29yZSBpbml0aWFsaXphdGlvbikgKi8JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgLyogYnVzIG1hcHBpbmcgY29uc3RhbnRzICovCisjZGVmaW5lIFNDNTIwX1JFR19BRERSCQkweDAwMDAwY2Y4ICAgICAKKyNkZWZpbmUgU0M1MjBfUkVHX0RBVEEJCTB4MDAwMDBjZmMKKworCisjZGVmaW5lIFNDNTIwX0lTQV9NRU1fUEhZUwkweDAwMDAwMDAwCisjZGVmaW5lIFNDNTIwX0lTQV9NRU1fQlVTCTB4MDAwMDAwMDAKKyNkZWZpbmUgU0M1MjBfSVNBX01FTV9TSVpFCTB4MDEwMDAwMDAKKworI2RlZmluZSBTQzUyMF9JU0FfSU9fUEhZUwkweDAwMDAwMDAwCisjZGVmaW5lIFNDNTIwX0lTQV9JT19CVVMJMHgwMDAwMDAwMAorI2RlZmluZSBTQzUyMF9JU0FfSU9fU0laRQkweDAwMDAxMDAwCisKKy8qIFBDSSBJL08gc3BhY2UgZnJvbSAweDEwMDAgdG8gMHhmZGZmICovCisjZGVmaW5lIFNDNTIwX1BDSV9JT19QSFlTCTB4MDAwMDEwMDAKKyNkZWZpbmUgU0M1MjBfUENJX0lPX0JVUwkweDAwMDAxMDAwCisjZGVmaW5lIFNDNTIwX1BDSV9JT19TSVpFCTB4MDAwMGVlMDAKKworLyogc3lzdGVtIG1lbW9yeSBmcm9tIDB4MDAwMDAwMDAgdG8gMHgwZmZmZmZmZiAqLworI2RlZmluZQlTQzUyMF9QQ0lfTUVNT1JZX1BIWVMJMHgwMDAwMDAwMAorI2RlZmluZQlTQzUyMF9QQ0lfTUVNT1JZX0JVUwkweDAwMDAwMDAwCisjZGVmaW5lIFNDNTIwX1BDSV9NRU1PUllfU0laRQkweDEwMDAwMDAwCisKKy8qIFBDSSBidXMgbWVtb3J5IGZyb20gMHgxMDAwMDAwMCB0byAweDI3ZmZmZmZmICovCisjZGVmaW5lIFNDNTIwX1BDSV9NRU1fUEhZUwkweDEwMDAwMDAwCisjZGVmaW5lIFNDNTIwX1BDSV9NRU1fQlVTICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgU0M1MjBfUENJX01FTV9TSVpFCTB4MTgwMDAwMDAKKworLyogMHgyODAwMDAwMCAtIDB4M2ZmZmZmZmYgaXMgdXNlZCBieSB0aGUgZmxhc2ggYmFua3MgKi8KKworLyogMHg0MDAwMDAwMCAtIDB4ZmZmZmZmZmYgaXMgbm90IGFkcmVzc2FibGUgYnkgdGhlIFNDNTIwICovCisKKy8qIHV0aWxpdHkgZnVuY3Rpb25zICovCit2b2lkIHdyaXRlX21tY3JfYnl0ZSh1MTYgbW1jciwgdTggZGF0YSk7Cit2b2lkIHdyaXRlX21tY3Jfd29yZCh1MTYgbW1jciwgdTE2IGRhdGEpOwordm9pZCB3cml0ZV9tbWNyX2xvbmcodTE2IG1tY3IsIHUzMiBkYXRhKTsKK3U4IHJlYWRfbW1jcl9ieXRlKHUxNiBtbWNyKTsKK3UxNiByZWFkX21tY3Jfd29yZCh1MTYgbW1jcik7Cit1MzIgcmVhZF9tbWNyX2xvbmcodTE2IG1tY3IpOworCit2b2lkIGluaXRfc2M1MjAodm9pZCk7Cit1bnNpZ25lZCBsb25nIGluaXRfc2M1MjBfZHJhbSh2b2lkKTsKK3ZvaWQgcGNpX3NjNTIwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2lvLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjNTAzYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaW8uaApAQCAtMCwwICsxLDIwNyBAQAorI2lmbmRlZiBfQVNNX0lPX0gKKyNkZWZpbmUgX0FTTV9JT19ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSB4ODYgSU8gaW5zdHJ1Y3Rpb25zCisgKiBpbmIvaW53L2lubC9vdXRiL291dHcvb3V0bCBhbmQgdGhlICJzdHJpbmcgdmVyc2lvbnMiIG9mIHRoZSBzYW1lCisgKiAoaW5zYi9pbnN3L2luc2wvb3V0c2Ivb3V0c3cvb3V0c2wpLiBZb3UgY2FuIGFsc28gdXNlICJwYXVzaW5nIgorICogdmVyc2lvbnMgb2YgdGhlIHNpbmdsZS1JTyBpbnN0cnVjdGlvbnMgKGluYl9wL2lud19wLy4uKS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbm90IG1lYW50IHRvIGJlIG9iZnVzY2F0aW5nOiBpdCdzIGp1c3QgY29tcGxpY2F0ZWQKKyAqIHRvIChhKSBoYW5kbGUgaXQgYWxsIGluIGEgd2F5IHRoYXQgbWFrZXMgZ2NjIGFibGUgdG8gb3B0aW1pemUgaXQKKyAqIGFzIHdlbGwgYXMgcG9zc2libGUgYW5kIChiKSB0cnlpbmcgdG8gYXZvaWQgd3JpdGluZyB0aGUgc2FtZSB0aGluZworICogb3ZlciBhbmQgb3ZlciBhZ2FpbiB3aXRoIHNsaWdodCB2YXJpYXRpb25zIGFuZCBwb3NzaWJseSBtYWtpbmcgYQorICogbWlzdGFrZSBzb21ld2hlcmUuCisgKi8KKworLyoKKyAqIFRoYW5rcyB0byBKYW1lcyB2YW4gQXJ0c2RhbGVuIGZvciBhIGJldHRlciB0aW1pbmctZml4IHRoYW4KKyAqIHRoZSB0d28gc2hvcnQganVtcHM6IHVzaW5nIG91dGIncyB0byBhIG5vbmV4aXN0ZW50IHBvcnQgc2VlbXMKKyAqIHRvIGd1YXJhbnRlZSBiZXR0ZXIgdGltaW5ncyBldmVuIG9uIGZhc3QgbWFjaGluZXMuCisgKgorICogT24gdGhlIG90aGVyIGhhbmQsIEknZCBsaWtlIHRvIGJlIHN1cmUgb2YgYSBub24tZXhpc3RlbnQgcG9ydDoKKyAqIEkgZmVlbCBhIGJpdCB1bnNhZmUgYWJvdXQgdXNpbmcgMHg4MCAoc2hvdWxkIGJlIHNhZmUsIHRob3VnaCkKKyAqCisgKgkJTGludXMKKyAqLworCisgLyoKKyAgKiAgQml0IHNpbXBsaWZpZWQgYW5kIG9wdGltaXplZCBieSBKYW4gSHViaWNrYQorICAqICBTdXBwb3J0IG9mIEJJR01FTSBhZGRlZCBieSBHZXJoYXJkIFdpY2hlcnQsIFNpZW1lbnMgQUcsIEp1bHkgMTk5OS4KKyAgKgorICAqICBpc2FfbWVtc2V0X2lvLCBpc2FfbWVtY3B5X2Zyb21pbywgaXNhX21lbWNweV90b2lvIGFkZGVkLAorICAqICBpc2FfcmVhZFt3bF0gYW5kIGlzYV93cml0ZVt3bF0gZml4ZWQKKyAgKiAgLSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAgKi8KKworI2RlZmluZSBJT19TUEFDRV9MSU1JVCAweGZmZmYKKworCisjaWZkZWYgX19LRVJORUxfXworCisKKy8qCisgKiByZWFkWC93cml0ZVgoKSBhcmUgdXNlZCB0byBhY2Nlc3MgbWVtb3J5IG1hcHBlZCBkZXZpY2VzLiBPbiBzb21lCisgKiBhcmNoaXRlY3R1cmVzIHRoZSBtZW1vcnkgbWFwcGVkIElPIHN0dWZmIG5lZWRzIHRvIGJlIGFjY2Vzc2VkCisgKiBkaWZmZXJlbnRseS4gT24gdGhlIHg4NiBhcmNoaXRlY3R1cmUsIHdlIGp1c3QgcmVhZC93cml0ZSB0aGUKKyAqIG1lbW9yeSBsb2NhdGlvbiBkaXJlY3RseS4KKyAqLworCisjZGVmaW5lIHJlYWRiKGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKGFkZHIpKQorI2RlZmluZSByZWFkdyhhZGRyKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSAoYWRkcikpCisjZGVmaW5lIHJlYWRsKGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoYWRkcikpCisjZGVmaW5lIF9fcmF3X3JlYWRiIHJlYWRiCisjZGVmaW5lIF9fcmF3X3JlYWR3IHJlYWR3CisjZGVmaW5lIF9fcmF3X3JlYWRsIHJlYWRsCisKKyNkZWZpbmUgd3JpdGViKGIsYWRkcikgKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoYWRkcikgPSAoYikpCisjZGVmaW5lIHdyaXRldyhiLGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIChhZGRyKSA9IChiKSkKKyNkZWZpbmUgd3JpdGVsKGIsYWRkcikgKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSA9IChiKSkKKyNkZWZpbmUgX19yYXdfd3JpdGViIHdyaXRlYgorI2RlZmluZSBfX3Jhd193cml0ZXcgd3JpdGV3CisjZGVmaW5lIF9fcmF3X3dyaXRlbCB3cml0ZWwKKworI2RlZmluZSBtZW1zZXRfaW8oYSxiLGMpCW1lbXNldCgoYSksKGIpLChjKSkKKyNkZWZpbmUgbWVtY3B5X2Zyb21pbyhhLGIsYykJbWVtY3B5KChhKSwoYiksKGMpKQorI2RlZmluZSBtZW1jcHlfdG9pbyhhLGIsYykJbWVtY3B5KChhKSwoYiksKGMpKQorCisvKgorICogSVNBIHNwYWNlIGlzICdhbHdheXMgbWFwcGVkJyBvbiBhIHR5cGljYWwgeDg2IHN5c3RlbSwgbm8gbmVlZCB0bworICogZXhwbGljaXRseSBpb3JlbWFwKCkgaXQuIFRoZSBmYWN0IHRoYXQgdGhlIElTQSBJTyBzcGFjZSBpcyBtYXBwZWQKKyAqIHRvIFBBR0VfT0ZGU0VUIGlzIHB1cmUgY29pbmNpZGVuY2UgLSBpdCBkb2VzIG5vdCBtZWFuIElTQSB2YWx1ZXMKKyAqIGFyZSBwaHlzaWNhbCBhZGRyZXNzZXMuIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgcG9pbnRlciBjYW4gYmUKKyAqIHVzZWQgYXMgdGhlIElPLWFyZWEgcG9pbnRlciAoaXQgY2FuIGJlIGlvdW5tYXBwZWQgYXMgd2VsbCwgc28gdGhlCisgKiBhbmFsb2d5IHdpdGggUENJIGlzIHF1aXRlIGxhcmdlKToKKyAqLworI2RlZmluZSBpc2FfcmVhZGIoYSkgcmVhZGIoKGEpKQorI2RlZmluZSBpc2FfcmVhZHcoYSkgcmVhZHcoKGEpKQorI2RlZmluZSBpc2FfcmVhZGwoYSkgcmVhZGwoKGEpKQorI2RlZmluZSBpc2Ffd3JpdGViKGIsYSkgd3JpdGViKGIsKGEpKQorI2RlZmluZSBpc2Ffd3JpdGV3KHcsYSkgd3JpdGV3KHcsKGEpKQorI2RlZmluZSBpc2Ffd3JpdGVsKGwsYSkgd3JpdGVsKGwsKGEpKQorI2RlZmluZSBpc2FfbWVtc2V0X2lvKGEsYixjKQkJbWVtc2V0X2lvKChhKSwoYiksKGMpKQorI2RlZmluZSBpc2FfbWVtY3B5X2Zyb21pbyhhLGIsYykJbWVtY3B5X2Zyb21pbygoYSksKGIpLChjKSkKKyNkZWZpbmUgaXNhX21lbWNweV90b2lvKGEsYixjKQkJbWVtY3B5X3RvaW8oKGEpLChiKSwoYykpCisKKworIAorc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc2lnbmF0dXJlKHVuc2lnbmVkIGxvbmcgaW9fYWRkciwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCit7CisJaW50IHJldHZhbCA9IDA7CisJZG8geworCQlpZiAocmVhZGIoaW9fYWRkcikgIT0gKnNpZ25hdHVyZSkKKwkJCWdvdG8gb3V0OworCQlpb19hZGRyKys7CisJCXNpZ25hdHVyZSsrOworCQlsZW5ndGgtLTsKKwl9IHdoaWxlIChsZW5ndGgpOworCXJldHZhbCA9IDE7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKglpc2FfY2hlY2tfc2lnbmF0dXJlCQktCWZpbmQgQklPUyBzaWduYXR1cmVzCisgKglAaW9fYWRkcjogbW1pbyBhZGRyZXNzIHRvIGNoZWNrIAorICoJQHNpZ25hdHVyZTogIHNpZ25hdHVyZSBibG9jaworICoJQGxlbmd0aDogbGVuZ3RoIG9mIHNpZ25hdHVyZQorICoKKyAqCVBlcmZvcm0gYSBzaWduYXR1cmUgY29tcGFyaXNvbiB3aXRoIHRoZSBJU0EgbW1pbyBhZGRyZXNzIGlvX2FkZHIuCisgKglSZXR1cm5zIDEgb24gYSBtYXRjaC4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIE5ldyBkcml2ZXJzIHNob3VsZCB1c2UgaW9yZW1hcCBhbmQKKyAqCWNoZWNrX3NpZ25hdHVyZS4KKyAqLworIAorCitzdGF0aWMgaW5saW5lIGludCBpc2FfY2hlY2tfc2lnbmF0dXJlKHVuc2lnbmVkIGxvbmcgaW9fYWRkciwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCit7CisJaW50IHJldHZhbCA9IDA7CisJZG8geworCQlpZiAoaXNhX3JlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUpCisJCQlnb3RvIG91dDsKKwkJaW9fYWRkcisrOworCQlzaWduYXR1cmUrKzsKKwkJbGVuZ3RoLS07CisJfSB3aGlsZSAobGVuZ3RoKTsKKwlyZXR2YWwgPSAxOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNpZmRlZiBTTE9XX0lPX0JZX0pVTVBJTkcKKyNkZWZpbmUgX19TTE9XX0RPV05fSU8gIlxuam1wIDFmXG4xOlx0am1wIDFmXG4xOiIKKyNlbHNlCisjZGVmaW5lIF9fU0xPV19ET1dOX0lPICJcbm91dGIgJSVhbCwkMHg4MCIKKyNlbmRpZgorCisjaWZkZWYgUkVBTExZX1NMT1dfSU8KKyNkZWZpbmUgX19GVUxMX1NMT1dfRE9XTl9JTyBfX1NMT1dfRE9XTl9JTyBfX1NMT1dfRE9XTl9JTyBfX1NMT1dfRE9XTl9JTyBfX1NMT1dfRE9XTl9JTworI2Vsc2UKKyNkZWZpbmUgX19GVUxMX1NMT1dfRE9XTl9JTyBfX1NMT1dfRE9XTl9JTworI2VuZGlmCisKKworLyoKKyAqIFRhbGsgYWJvdXQgbWlzdXNpbmcgbWFjcm9zLi4KKyAqLworI2RlZmluZSBfX09VVDEocyx4KSBcCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0IyNzKHVuc2lnbmVkIHggdmFsdWUsIHVuc2lnbmVkIHNob3J0IHBvcnQpIHsKKworI2RlZmluZSBfX09VVDIocyxzMSxzMikgXAorX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXQiICNzICIgJSIgczEgIjAsJSIgczIgIjEiCisKKworI2RlZmluZSBfX09VVChzLHMxLHgpIFwKK19fT1VUMShzLHgpIF9fT1VUMihzLHMxLCJ3IikgOiA6ICJhIiAodmFsdWUpLCAiTmQiIChwb3J0KSk7IH0gXAorX19PVVQxKHMjI19wLHgpIF9fT1VUMihzLHMxLCJ3IikgX19GVUxMX1NMT1dfRE9XTl9JTyA6IDogImEiICh2YWx1ZSksICJOZCIgKHBvcnQpKTt9IAorCisjZGVmaW5lIF9fSU4xKHMpIFwKK3N0YXRpYyBpbmxpbmUgUkVUVVJOX1RZUEUgaW4jI3ModW5zaWduZWQgc2hvcnQgcG9ydCkgeyBSRVRVUk5fVFlQRSBfdjsKKworI2RlZmluZSBfX0lOMihzLHMxLHMyKSBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImluIiAjcyAiICUiIHMyICIxLCUiIHMxICIwIgorCisjZGVmaW5lIF9fSU4ocyxzMSxpLi4uKSBcCitfX0lOMShzKSBfX0lOMihzLHMxLCJ3IikgOiAiPWEiIChfdikgOiAiTmQiIChwb3J0KSAsIyNpICk7IHJldHVybiBfdjsgfSBcCitfX0lOMShzIyNfcCkgX19JTjIocyxzMSwidyIpIF9fRlVMTF9TTE9XX0RPV05fSU8gOiAiPWEiIChfdikgOiAiTmQiIChwb3J0KSAsIyNpICk7IHJldHVybiBfdjsgfSAKKworI2RlZmluZSBfX0lOUyhzKSBcCitzdGF0aWMgaW5saW5lIHZvaWQgaW5zIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQsIHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KSBcCit7IF9fYXNtX18gX192b2xhdGlsZV9fICgicmVwIDsgaW5zIiAjcyBcCis6ICI9RCIgKGFkZHIpLCAiPWMiIChjb3VudCkgOiAiZCIgKHBvcnQpLCIwIiAoYWRkciksIjEiIChjb3VudCkpOyB9CisKKyNkZWZpbmUgX19PVVRTKHMpIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXRzIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQsIGNvbnN0IHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KSBcCit7IF9fYXNtX18gX192b2xhdGlsZV9fICgicmVwIDsgb3V0cyIgI3MgXAorOiAiPVMiIChhZGRyKSwgIj1jIiAoY291bnQpIDogImQiIChwb3J0KSwiMCIgKGFkZHIpLCIxIiAoY291bnQpKTsgfQorCisjZGVmaW5lIFJFVFVSTl9UWVBFIHVuc2lnbmVkIGNoYXIKK19fSU4oYiwiIikKKyN1bmRlZiBSRVRVUk5fVFlQRQorI2RlZmluZSBSRVRVUk5fVFlQRSB1bnNpZ25lZCBzaG9ydAorX19JTih3LCIiKQorI3VuZGVmIFJFVFVSTl9UWVBFCisjZGVmaW5lIFJFVFVSTl9UWVBFIHVuc2lnbmVkIGludAorX19JTihsLCIiKQorI3VuZGVmIFJFVFVSTl9UWVBFCisKK19fT1VUKGIsImIiLGNoYXIpCitfX09VVCh3LCJ3IixzaG9ydCkKK19fT1VUKGwsLGludCkKKworX19JTlMoYikKK19fSU5TKHcpCitfX0lOUyhsKQorCitfX09VVFMoYikKK19fT1VUUyh3KQorX19PVVRTKGwpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wY2kuaCBiL2luY2x1ZGUvYXNtLWkzODYvcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjMTY1YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcGNpLmgKQEAgLTAsMCArMSwzMSBAQAorCisKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX1BDSV9JMzg2X0hfCisjZGVmaW5lIF9QQ0lfSTM4Nl9IXwkxCisKK3ZvaWQgcGNpX3NldHVwX3R5cGUxKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcG9zaXhfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWkzODYvcG9zaXhfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTI5ZjMyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wb3NpeF90eXBlcy5oCkBAIC0wLDAgKzEsODAgQEAKKyNpZm5kZWYgX19BUkNIX0kzODZfUE9TSVhfVFlQRVNfSAorI2RlZmluZSBfX0FSQ0hfSTM4Nl9QT1NJWF9UWVBFU19ICisKKy8qCisgKiBUaGlzIGZpbGUgaXMgZ2VuZXJhbGx5IHVzZWQgYnkgdXNlci1sZXZlbCBzb2Z0d2FyZSwgc28geW91IG5lZWQgdG8KKyAqIGJlIGEgbGl0dGxlIGNhcmVmdWwgYWJvdXQgbmFtZXNwYWNlIHBvbGx1dGlvbiBldGMuICBBbHNvLCB3ZSBjYW5ub3QKKyAqIGFzc3VtZSBHQ0MgaXMgYmVpbmcgdXNlZC4KKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX2Rldl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX2lub190OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9tb2RlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX25saW5rX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX29mZl90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3BpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9pcGNfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9naWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX3NpemVfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9zc2l6ZV90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3B0cmRpZmZfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfdGltZV90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9zdXNlY29uZHNfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfY2xvY2tfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9kYWRkcl90OwordHlwZWRlZiBjaGFyICoJCV9fa2VybmVsX2NhZGRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX3VpZDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX2dpZDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF91aWQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfZ2lkMzJfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9vbGRfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX29sZF9naWRfdDsKKworI2lmZGVmIF9fR05VQ19fCit0eXBlZGVmIGxvbmcgbG9uZwlfX2tlcm5lbF9sb2ZmX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1VTRV9BTEwpCisJaW50CXZhbFsyXTsKKyNlbHNlIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KKwlpbnQJX192YWxbMl07CisjZW5kaWYgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLworfSBfX2tlcm5lbF9mc2lkX3Q7CisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisKKyN1bmRlZglfX0ZEX1NFVAorI2RlZmluZSBfX0ZEX1NFVChmZCxmZHNldHApIFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oImJ0c2wgJTEsJTAiOiBcCisJCQkiPW0iICgqKF9fa2VybmVsX2ZkX3NldCAqKSAoZmRzZXRwKSk6InIiICgoaW50KSAoZmQpKSkKKworI3VuZGVmCV9fRkRfQ0xSCisjZGVmaW5lIF9fRkRfQ0xSKGZkLGZkc2V0cCkgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYnRybCAlMSwlMCI6IFwKKwkJCSI9bSIgKCooX19rZXJuZWxfZmRfc2V0ICopIChmZHNldHApKToiciIgKChpbnQpIChmZCkpKQorCisjdW5kZWYJX19GRF9JU1NFVAorI2RlZmluZSBfX0ZEX0lTU0VUKGZkLGZkc2V0cCkgKF9fZXh0ZW5zaW9uX18gKHsgXAorCQl1bnNpZ25lZCBjaGFyIF9fcmVzdWx0OyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJidGwgJTEsJTIgOyBzZXRiICUwIiBcCisJCQk6Ij1xIiAoX19yZXN1bHQpIDoiciIgKChpbnQpIChmZCkpLCBcCisJCQkibSIgKCooX19rZXJuZWxfZmRfc2V0ICopIChmZHNldHApKSk7IFwKKwkJX19yZXN1bHQ7IH0pKQorCisjdW5kZWYJX19GRF9aRVJPCisjZGVmaW5lIF9fRkRfWkVSTyhmZHNldHApIFwKK2RvIHsgXAorCWludCBfX2QwLCBfX2QxOyBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oImNsZCA7IHJlcCA7IHN0b3NsIiBcCisJCQk6Ij1tIiAoKihfX2tlcm5lbF9mZF9zZXQgKikgKGZkc2V0cCkpLCBcCisJCQkgICI9JmMiIChfX2QwKSwgIj0mRCIgKF9fZDEpIFwKKwkJCToiYSIgKDApLCAiMSIgKF9fRkRTRVRfTE9OR1MpLCBcCisJCQkiMiIgKChfX2tlcm5lbF9mZF9zZXQgKikgKGZkc2V0cCkpIDogIm1lbW9yeSIpOyBcCit9IHdoaWxlICgwKQorCisjZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcHBjYm9vdC1pMzg2LmggYi9pbmNsdWRlL2FzbS1pMzg2L3BwY2Jvb3QtaTM4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDUyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BwY2Jvb3QtaTM4Ni5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9QUENCT09UX0kzODZfSF8KKyNkZWZpbmUgX1BQQ0JPT1RfSTM4Nl9IXwkxCisKKy8qIGZvciB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcywgc2VlIHN0YXJ0LlMgKi8KK2V4dGVybiB1bG9uZyBpMzg2Ym9vdF9zdGFydDsJICAgIC8qIGNvZGUgc3RhcnQgKGluIGZsYXNoKSAqLworZXh0ZXJuIHVsb25nIGkzODZib290X2VuZDsJICAgIC8qIGNvZGUgZW5kIChpbiBmbGFzaCkgKi8KK2V4dGVybiB1bG9uZyBpMzg2Ym9vdF9yb21kYXRhX3N0YXJ0Oy8qIGRhdGFzZWdtZW50IGluIGZsYXNoIChhbHNvIGNvZGUrcm9kYXRhIGVuZCkgKi8KK2V4dGVybiB1bG9uZyBpMzg2Ym9vdF9yb21kYXRhX2Rlc3Q7IC8qIGRhdGEgbG9jYXRpb24gc2VnbWVudCBpbiByYW0gKi8KK2V4dGVybiB1bG9uZyBpMzg2Ym9vdF9yb21kYXRhX3NpemU7IC8qIHNpemUgb2YgZGF0YSBzZWdtZW50ICovCitleHRlcm4gdWxvbmcgaTM4NmJvb3RfYnNzX3N0YXJ0OyAgICAvKiBic3Mgc3RhcnQgKi8KK2V4dGVybiB1bG9uZyBpMzg2Ym9vdF9ic3Nfc2l6ZTsgICAgIC8qIGJzcyBzaXplICovCitleHRlcm4gdWxvbmcgaTM4NmJvb3Rfc3RhY2tfZW5kOyAgICAvKiBmaXJzdCB1c2FibGUgUkFNIGFkZHJlc3MgYWZ0ZXIgYnNzIGFuZCBzdGFjayAqLworZXh0ZXJuIHVsb25nIGkzODZib290X3JhbV9lbmQ7ICAgICAgLyogZW5kIG9mIHJhbSAqLworCitleHRlcm4gdWxvbmcgaTM4NmJvb3RfcmVhbG1vZGU7ICAgICAvKiBzdGFydCBvZiByZWFsbW9kZSBlbnRyeSBjb2RlICovCitleHRlcm4gdWxvbmcgaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZTsvKiBzaXplIG9mIHJlYWxtb2RlIGVudHJ5IGNvZGUgKi8KK2V4dGVybiB1bG9uZyBpMzg2Ym9vdF9iaW9zOyAgICAgICAgIC8qIHN0YXJ0IG9mIEJJT1MgZW11bGF0aW9uIGNvZGUgKi8KK2V4dGVybiB1bG9uZyBpMzg2Ym9vdF9iaW9zX3NpemU7ICAgIC8qIHNpemUgb2YgQklPUyBlbXVsYXRpb24gY29kZSAqLworCisKKy8qIGNwdS8uLi4vY3B1LmMgKi8KK2ludCBjcHVfaW5pdCh2b2lkKTsKK2ludCB0aW1lcl9pbml0KHZvaWQpOworCisvKiBib2FyZC8uLi4vLi4uICovCitpbnQJYm9hcmRfaW5pdCh2b2lkKTsKK2ludAlkcmFtX2luaXQgKHZvaWQpOworCisKKyNlbmRpZgkvKiBfUFBDQk9PVF9JMzg2X0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3B0cmFjZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTllNDY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wdHJhY2UuaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9JMzg2X1BUUkFDRV9ICisjZGVmaW5lIF9JMzg2X1BUUkFDRV9ICisKKyNkZWZpbmUgRUJYIDAKKyNkZWZpbmUgRUNYIDEKKyNkZWZpbmUgRURYIDIKKyNkZWZpbmUgRVNJIDMKKyNkZWZpbmUgRURJIDQKKyNkZWZpbmUgRUJQIDUKKyNkZWZpbmUgRUFYIDYKKyNkZWZpbmUgRFMgNworI2RlZmluZSBFUyA4CisjZGVmaW5lIEZTIDkKKyNkZWZpbmUgR1MgMTAKKyNkZWZpbmUgT1JJR19FQVggMTEKKyNkZWZpbmUgRUlQIDEyCisjZGVmaW5lIENTICAxMworI2RlZmluZSBFRkwgMTQKKyNkZWZpbmUgVUVTUCAxNQorI2RlZmluZSBTUyAgIDE2CisjZGVmaW5lIEZSQU1FX1NJWkUgMTcKKworLyogdGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgd2F5IHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBvbiB0aGUgCisgICBzdGFjayBkdXJpbmcgYSBzeXN0ZW0gY2FsbC4gKi8KKworc3RydWN0IHB0X3JlZ3MgeworCWxvbmcgZWJ4OworCWxvbmcgZWN4OworCWxvbmcgZWR4OworCWxvbmcgZXNpOworCWxvbmcgZWRpOworCWxvbmcgZWJwOworCWxvbmcgZWF4OworCWludCAgeGRzOworCWludCAgeGVzOworCWludCAgeGZzOworCWludCAgeGdzOworCWxvbmcgb3JpZ19lYXg7CisJbG9uZyBlaXA7CisJaW50ICB4Y3M7CisJbG9uZyBlZmxhZ3M7CisJbG9uZyBlc3A7CisJaW50ICB4c3M7Cit9ICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyogQXJiaXRyYXJpbHkgY2hvb3NlIHRoZSBzYW1lIHB0cmFjZSBudW1iZXJzIGFzIHVzZWQgYnkgdGhlIFNwYXJjIGNvZGUuICovCisjZGVmaW5lIFBUUkFDRV9HRVRSRUdTICAgICAgICAgICAgMTIKKyNkZWZpbmUgUFRSQUNFX1NFVFJFR1MgICAgICAgICAgICAxMworI2RlZmluZSBQVFJBQ0VfR0VURlBSRUdTICAgICAgICAgIDE0CisjZGVmaW5lIFBUUkFDRV9TRVRGUFJFR1MgICAgICAgICAgMTUKKyNkZWZpbmUgUFRSQUNFX0dFVEZQWFJFR1MgICAgICAgICAxOAorI2RlZmluZSBQVFJBQ0VfU0VURlBYUkVHUyAgICAgICAgIDE5CisKKyNkZWZpbmUgUFRSQUNFX1NFVE9QVElPTlMgICAgICAgICAyMQorCisvKiBvcHRpb25zIHNldCB1c2luZyBQVFJBQ0VfU0VUT1BUSU9OUyAqLworI2RlZmluZSBQVFJBQ0VfT19UUkFDRVNZU0dPT0QgICAgIDB4MDAwMDAwMDEKKworI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpICgoVk1fTUFTSyAmIChyZWdzKS0+ZWZsYWdzKSB8fCAoMyAmIChyZWdzKS0+eGNzKSkKKyNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5laXApCitleHRlcm4gdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKik7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3JlYWxtb2RlLmggYi9pbmNsdWRlL2FzbS1pMzg2L3JlYWxtb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiNzZjMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcmVhbG1vZGUuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UKKyAqIAorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0FTTV9SRUFMTU9ERV9IXworI2RlZmluZSBfX0FTTV9SRUFMTU9ERV9IXworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworaW50IGJpb3Nfc2V0dXAodm9pZCk7CitpbnQgZW50ZXJfcmVhbG1vZGUodTE2IHNlZywgdTE2IG9mZiwgc3RydWN0IHB0X3JlZ3MgKmluLCBzdHJ1Y3QgcHRfcmVncyAqb3V0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3N0cmluZy5oIGIvaW5jbHVkZS9hc20taTM4Ni9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzc4MjIyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zdHJpbmcuaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIF9fQVNNX0kzODZfU1RSSU5HX0gKKyNkZWZpbmUgX19BU01fSTM4Nl9TVFJJTkdfSAorCisvKgorICogV2UgZG9uJ3QgZG8gaW5saW5lIHN0cmluZyBmdW5jdGlvbnMsIHNpbmNlIHRoZQorICogb3B0aW1pc2VkIGlubGluZSBhc20gdmVyc2lvbnMgYXJlIG5vdCBzbWFsbC4KKyAqLworCisjZGVmaW5lIF9fSEFWRV9BUkNIX1NUUlJDSFIKK2V4dGVybiBjaGFyICogc3RycmNocihjb25zdCBjaGFyICogcywgaW50IGMpOworCisjZGVmaW5lIF9fSEFWRV9BUkNIX1NUUkNIUgorZXh0ZXJuIGNoYXIgKiBzdHJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKTsKKworI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1DUFkKK2V4dGVybiB2b2lkICogbWVtY3B5KHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBfX2tlcm5lbF9zaXplX3QpOworCisjZGVmaW5lIF9fSEFWRV9BUkNIX01FTU1PVkUKK2V4dGVybiB2b2lkICogbWVtbW92ZSh2b2lkICosIGNvbnN0IHZvaWQgKiwgX19rZXJuZWxfc2l6ZV90KTsKKworI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1DSFIKK2V4dGVybiB2b2lkICogbWVtY2hyKGNvbnN0IHZvaWQgKiwgaW50LCBfX2tlcm5lbF9zaXplX3QpOworCisjZGVmaW5lIF9fSEFWRV9BUkNIX01FTVNFVAorZXh0ZXJuIHZvaWQgKiBtZW1zZXQodm9pZCAqLCBpbnQsIF9fa2VybmVsX3NpemVfdCk7CisKKyNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNWkVSTworZXh0ZXJuIHZvaWQgbWVtemVybyh2b2lkICpwdHIsIF9fa2VybmVsX3NpemVfdCBuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3R5cGVzLmggYi9pbmNsdWRlL2FzbS1pMzg2L3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxMDBlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdHlwZXMuaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIF9fQVNNX0kzODZfVFlQRVNfSAorI2RlZmluZSBfX0FTTV9JMzg2X1RZUEVTX0gKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1bW9kZV90OworCisvKgorICogX194eCBpcyBvazogaXQgZG9lc24ndCBwb2xsdXRlIHRoZSBQT1NJWCBuYW1lc3BhY2UuIFVzZSB0aGVzZSBpbiB0aGUKKyAqIGhlYWRlciBmaWxlcyBleHBvcnRlZCB0byB1c2VyIHNwYWNlCisgKi8KKwordHlwZWRlZiBfX3NpZ25lZF9fIGNoYXIgX19zODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3U4OworCit0eXBlZGVmIF9fc2lnbmVkX18gc2hvcnQgX19zMTY7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fdTE2OworCit0eXBlZGVmIF9fc2lnbmVkX18gaW50IF9fczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX191MzI7CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCit0eXBlZGVmIF9fc2lnbmVkX18gbG9uZyBsb25nIF9fczY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX191NjQ7CisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGFyZW4ndCBleHBvcnRlZCBvdXRzaWRlIHRoZSBrZXJuZWwgdG8gYXZvaWQgbmFtZSBzcGFjZSBjbGFzaGVzCisgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisKK3R5cGVkZWYgc2lnbmVkIGNoYXIgczg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdTg7CisKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OworCit0eXBlZGVmIHNpZ25lZCBpbnQgczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOworCit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgczY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdTY0OworCisjZGVmaW5lIEJJVFNfUEVSX0xPTkcgMzIKKworLyogRG1hIGFkZHJlc3NlcyBhcmUgMzItYml0cyB3aWRlLiAgKi8KKwordHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdS1ib290LmggYi9pbmNsdWRlL2FzbS1pMzg2L3UtYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGJjODUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3UtYm9vdC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICogCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogQWxleCBadWVwa2UgPGF6dUBzeXNnby5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9VX0JPT1RfSF8KKyNkZWZpbmUgX1VfQk9PVF9IXwkxCisKK3R5cGVkZWYgc3RydWN0IGJkX2luZm8geworCXVuc2lnbmVkIGxvbmcJYmlfbWVtc3RhcnQ7CS8qIHN0YXJ0IG9mIERSQU0gbWVtb3J5ICovCisJdW5zaWduZWQgbG9uZwliaV9tZW1zaXplOwkvKiBzaXplCSBvZiBEUkFNIG1lbW9yeSBpbiBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcJYmlfZmxhc2hzdGFydDsJLyogc3RhcnQgb2YgRkxBU0ggbWVtb3J5ICovCisJdW5zaWduZWQgbG9uZwliaV9mbGFzaHNpemU7CS8qIHNpemUJIG9mIEZMQVNIIG1lbW9yeSAqLworCXVuc2lnbmVkIGxvbmcJYmlfZmxhc2hvZmZzZXQ7IC8qIHJlc2VydmVkIGFyZWEgZm9yIHN0YXJ0dXAgbW9uaXRvciAqLworCXVuc2lnbmVkIGxvbmcJYmlfc3JhbXN0YXJ0OwkvKiBzdGFydCBvZiBTUkFNIG1lbW9yeSAqLworCXVuc2lnbmVkIGxvbmcJYmlfc3JhbXNpemU7CS8qIHNpemUJIG9mIFNSQU0gbWVtb3J5ICovCisJdW5zaWduZWQgbG9uZwliaV9ib290ZmxhZ3M7CS8qIGJvb3QgLyByZWJvb3QgZmxhZyAoZm9yIEx5bnhPUykgKi8KKwl1bnNpZ25lZCBsb25nCWJpX2lwX2FkZHI7CS8qIElQIEFkZHJlc3MgKi8KKwl1bnNpZ25lZCBjaGFyCWJpX2VuZXRhZGRyWzZdOwkvKiBFdGhlcm5ldCBhZHJlc3MgKi8KKwl1bnNpZ25lZCBzaG9ydAliaV9ldGhzcGVlZDsJLyogRXRoZXJuZXQgc3BlZWQgaW4gTWJwcyAqLworCXVuc2lnbmVkIGxvbmcJYmlfaW50ZnJlcTsJLyogSW50ZXJuYWwgRnJlcSwgaW4gTUh6ICovCisJdW5zaWduZWQgbG9uZwliaV9idXNmcmVxOwkvKiBCdXMgRnJlcSwgaW4gTUh6ICovCisJdW5zaWduZWQgbG9uZwliaV9iYXVkcmF0ZTsJLyogQ29uc29sZSBCYXVkcmF0ZSAqLworCXN0cnVjdCBlbnZpcm9ubWVudF9zCSAgICAgICAqYmlfZW52OworCXN0cnVjdAkJCQkvKiBSQU0gY29uZmlndXJhdGlvbiAqLworCXsgCisJCXVsb25nIHN0YXJ0OworCQl1bG9uZyBzaXplOworCX1iaV9kcmFtW0NPTkZJR19OUl9EUkFNX0JBTktTXTsKK30gYmRfdDsKKworI2RlZmluZSBiaV9lbnZfZGF0YSBiaV9lbnYtPmRhdGEKKyNkZWZpbmUgYmlfZW52X2NyYyAgYmlfZW52LT5jcmMKKworI2VuZGlmCS8qIF9VX0JPT1RfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvemltYWdlLmggYi9pbmNsdWRlL2FzbS1pMzg2L3ppbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODY4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3ppbWFnZS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQorICogCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9BU01fWklNQUdFX0hfCisjZGVmaW5lIF9BU01fWklNQUdFX0hfCisKKy8qIGxpbnV4IGkzODYgekltYWdlL2J6SW1hZ2UgaGVhZGVyLiBPZmZzZXRzIHJlbGF0aXZlIHRvIAorICogdGhlIHN0YXJ0IG9mIHRoZSBpbWFnZSAqLworCisjZGVmaW5lIENNRF9MSU5FX01BR0lDX09GRiAgMHgwMjAgLyogTWFnaWMgMHhhMzNmIGlmIHRoZSBvZmZzZXQgYmVsb3cgaXMgdmFsaWQgKi8KKyNkZWZpbmUgQ01EX0xJTkVfT0ZGU0VUX09GRiAweDAyMiAvKiBPZmZzZXQgdG8gY29tYW5kbGluZSAqLworI2RlZmluZSBTRVRVUF9TRUNUU19PRkYgICAgIDB4MUYxIC8qIFRoZSBzaXplIG9mIHRoZSBzZXR1cCBpbiBzZWN0b3JzICovCisjZGVmaW5lIFJPT1RfRkxBR1NfT0ZGICAgICAgMHgxRjIgLyogSWYgc2V0LCB0aGUgcm9vdCBpcyBtb3VudGVkIHJlYWRvbmx5ICovCisjZGVmaW5lIFZJRF9NT0RFX09GRiAgICAgICAgMHgxRkEgLyogVmlkZW8gbW9kZSBjb250cm9sICovCisjZGVmaW5lIFJPT1RfREVWX09GRiAgICAgICAgMHgxRkMgLyogRGVmYXVsdCByb290IGRldmljZSBudW1iZXIgKi8KKyNkZWZpbmUgQk9PVF9GTEFHX09GRiAgICAgICAweDFGRSAvKiAweEFBNTUgbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEhFQURFUl9PRkYgICAgICAgICAgMHgyMDIgLyogTWFnaWMgc2lnbmF0dXJlICJIZHJTIiAqLworI2RlZmluZSBWRVJTSU9OX09GRiAgICAgICAgIDB4MjA2IC8qIEJvb3QgcHJvdG9jb2wgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUkVBTE1PREVfU1dUQ0hfT0ZGICAweDIwOCAvKiBCb290IGxvYWRlciBob29rIChzZWUgYmVsb3cpICovCisjZGVmaW5lIFNUQVJUX1NZU19PRkYgICAgICAgMHgyMEMgLyogUG9pbnRzIHRvIGtlcm5lbCB2ZXJzaW9uIHN0cmluZyAqLworI2RlZmluZSBUWVBFX09GX0xPQURFUl9PRkYgIDB4MjEwIC8qIEJvb3QgbG9hZGVyIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgTE9BREZMQUdTX09GRiAgICAgICAweDIxMSAvKiBCb290IHByb3RvY29sIG9wdGlvbiBmbGFncyAqLworI2RlZmluZSBTRVRVUF9NT1ZFX1NJWkVfT0ZGIDB4MjEyIC8qIE1vdmUgdG8gaGlnaCBtZW1vcnkgc2l6ZSAodXNlZCB3aXRoIGhvb2tzKSAqLworI2RlZmluZSBDT0RFMzJfU1RBUlRfT0ZGICAgIDB4MjE0IC8qIEJvb3QgbG9hZGVyIGhvb2sgKHNlZSBiZWxvdykgKi8KKyNkZWZpbmUgUkFNRElTS19JTUFHRV9PRkYgICAweDIxOCAvKiBpbml0cmQgbG9hZCBhZGRyZXNzIChzZXQgYnkgYm9vdCBsb2FkZXIpICovCisjZGVmaW5lIFJBTURJU0tfU0laRV9PRkYgICAgMHgyMUMgLyogaW5pdHJkIHNpemUgKHNldCBieSBib290IGxvYWRlcikgKi8KKyNkZWZpbmUgSEVBUF9FTkRfUFRSX09GRiAgICAweDIyNCAvKiBGcmVlIG1lbW9yeSBhZnRlciBzZXR1cCBlbmQgKi8KKyNkZWZpbmUgQ01EX0xJTkVfUFRSX09GRiAgICAweDIyOCAvKiAzMi1iaXQgcG9pbnRlciB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZSAqLworCisKKyNkZWZpbmUgSEVBUF9GTEFHICAgICAgICAgICAweDgwCisjZGVmaW5lIEJJR19LRVJORUxfRkxBRyAgICAgMHgwMQorCisvKiBtYWdpYyBudW1iZXJzICovCisjZGVmaW5lIEtFUk5FTF9NQUdJQyAgICAgICAgMHhhYTU1CisjZGVmaW5lIEtFUk5FTF9WMl9NQUdJQyAgICAgMHg1MzcyNjQ0OAorI2RlZmluZSBDT01NQU5EX0xJTkVfTUFHSUMgIDB4QTMzRgorCisvKiBsaW1pdHMgKi8KKyNkZWZpbmUgQlpJTUFHRV9NQVhfU0laRSAgIDE1KjEwMjQqMTAyNCAgICAgLyogMTVNQiAqLworI2RlZmluZSBaSU1BR0VfTUFYX1NJWkUgICAgNTEyKjEwMjQgICAgICAgICAvKiA1MTJrICovCisjZGVmaW5lIFNFVFVQX01BWF9TSVpFICAgICAzMjc2OAorCisjZGVmaW5lIFNFVFVQX1NUQVJUX09GRlNFVCAweDIwMAorI2RlZmluZSBCWklNQUdFX0xPQURfQUREUiAgMHgxMDAwMDAgCisjZGVmaW5lIFpJTUFHRV9MT0FEX0FERFIgICAweDEwMDAwCisJCit2b2lkICpsb2FkX3ppbWFnZShjaGFyICppbWFnZSwgdW5zaWduZWQgbG9uZyBrZXJuZWxfc2l6ZSwgCisJCSAgdW5zaWduZWQgbG9uZyBpbml0cmRfYWRkciwgdW5zaWduZWQgbG9uZyBpbml0cmRfc2l6ZSwKKwkJICBpbnQgYXV0b19ib290KTsKKwordm9pZCBib290X3ppbWFnZSh2b2lkICpzZXR1cF9iYXNlKTsKK2ltYWdlX2hlYWRlcl90ICpmYWtlX3ppbWFnZV9oZWFkZXIoaW1hZ2VfaGVhZGVyX3QgKmhkciwgdm9pZCAqcHRyLCBpbnQgc2l6ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbWRfY29uZmRlZnMuaCBiL2luY2x1ZGUvY21kX2NvbmZkZWZzLmgKaW5kZXggYTUzMDhiNi4uMjVmMzg2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbWRfY29uZmRlZnMuaAorKysgYi9pbmNsdWRlL2NtZF9jb25mZGVmcy5oCkBAIC03NSw4ICs3NSw4IEBACiAjZGVmaW5lIENGR19DTURfRlBHQQkweDAwMDAwMTAwMDAwMDAwMDAJLyogRlBHQSBjb25maWd1cmF0aW9uIFN1cHBvcnQgICAqLwogI2RlZmluZSBDRkdfQ01EX0hXRkxPVwkweDAwMDAwMjAwMDAwMDAwMDAJLyogUlRTL0NUUyBodyBmbG93IGNvbnRyb2wJKi8KICNkZWZpbmUgQ0ZHX0NNRF9TQVZFUwkweDAwMDAwNDAwMDAwMDAwMDAJLyogc2F2ZSBTIHJlY29yZCBkdW1wCQkqLwotI2RlZmluZSBDRkdfQ01EX1ZGRAkweDAwMDAwODAwMDAwMDAwMDAJLyogRGlzcGxheSBiaXRtYXAgb24gVkZEIGRpc3BsYXkqLwogI2RlZmluZSBDRkdfQ01EX1NQSQkweDAwMDAxMDAwMDAwMDAwMDAJLyogU1BJIHV0aWxpdHkJCQkqLworI2RlZmluZSBDRkdfQ01EX0ZET1MgICAgMHgwMDAwMjAwMDAwMDAwMDAwICAgICAgLyogRmxvcHB5IERPUyBzdXBwb3J0ICAgICAgICAgICAqLwogCiAjZGVmaW5lIENGR19DTURfQUxMCTB4RkZGRkZGRkZGRkZGRkZGRgkvKiBBTEwgY29tbWFuZHMJCQkqLwogCkBAIC05Niw2ICs5Niw3IEBACiAJCQlDRkdfQ01EX0VFUFJPTQl8IFwKIAkJCUNGR19DTURfRUxGCXwgXAogCQkJQ0ZHX0NNRF9GREMJfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBDRkdfQ01EX0ZET1MgICAgfCBcCiAJCQlDRkdfQ01EX0hXRkxPVwl8IFwKIAkJCUNGR19DTURfSTJDCXwgXAogCQkJQ0ZHX0NNRF9JREUJfCBcCkBAIC0xMTAsOSArMTExLDkgQEAKIAkJCUNGR19DTURfU0FWRVMJfCBcCiAJCQlDRkdfQ01EX1NDU0kJfCBcCiAJCQlDRkdfQ01EX1NEUkFNCXwgXAorCQkJQ0ZHX0NNRF9TUEkJfCBcCiAJCQlDRkdfQ01EX1VTQgl8IFwKLQkJCUNGR19DTURfVkZECXwgXAotCQkJQ0ZHX0NNRF9TUEkJKQorCQkJQ0ZHX0NNRF9WRkQJKQogCiAvKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbWRfZmRvcy5oIGIvaW5jbHVkZS9jbWRfZmRvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NDRjN2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NtZF9mZG9zLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3TkdWJsaSBGYXZlcmdlcyAtIDx3d3cuc3RhdWJsaS5jb20+CisgKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBEb3MgZmxvcHB5IHN1cHBvcnQKKyAqLworI2lmbmRlZglfQ01EX0ZET1NfSAorI2RlZmluZQlfQ01EX0ZET1NfSAorCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKQorCisjZGVmaW5lIENNRF9UQkxfRkRPU19CT09UCU1LX0NNRF9UQkxfRU5UUlkoICAgICAgIFwKKwkiZmRvc2Jvb3QiLCA1LAkzLAkwLAlkb19mZG9zYm9vdCwgICAgXAorCSJmZG9zYm9vdC0gYm9vdCBmcm9tIGEgZG9zIGZsb3BweSBmaWxlXG4iLCAgICAgXAorCSJbbG9hZEFkZHJdIFtmaWxlbmFtZV1cbiIgICAgICAgICAgICAgICAgICAgICAgIFwKKyksCisjZGVmaW5lIENNRF9UQkxfRkRPU19MUwkgICAgICAgIE1LX0NNRF9UQkxfRU5UUlkoICAgICAgIFwKKwkiZmRvc2xzIiwgNSwJMiwJMCwJZG9fZmRvc2xzLCAgICAgIFwKKwkiZmRvc2xzICAtIGxpc3QgZmlsZXMgaW4gYSBkaXJlY3RvcnlcbiIsICAgICAgIFwKKwkiW2RpcmVjdG9yeV1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCispLAoraW50IGRvX2Zkb3Nib290IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CitpbnQgZG9fZmRvc2xzIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisKKyNlbHNlCisjZGVmaW5lIENNRF9UQkxfRkRPU19CT09UCisjZGVmaW5lIENNRF9UQkxfRkRPU19MUworI2VuZGlmCisKKyNlbmRpZgkvKiBfQ01EX0ZET1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tb24uaCBiL2luY2x1ZGUvY29tbW9uLmgKaW5kZXggMjExMDFmMS4uYTk1MGNkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21tb24uaAorKysgYi9pbmNsdWRlL2NvbW1vbi5oCkBAIC0xMzAsMTAgKzEzMCwxNSBAQAogaW50CXNhdmVlbnYgICAgICAodm9pZCk7CiAjaWZkZWYgQ09ORklHX1BQQwkJLyogQVJNIHZlcnNpb24gdG8gYmUgZml4ZWQhICovCiB2b2lkIGlubGluZSBzZXRlbnYgICAoY2hhciAqLCBjaGFyICopOworI2Vsc2UKK3ZvaWQgICAgc2V0ZW52ICAgICAgIChjaGFyICosIGNoYXIgKik7CiAjZW5kaWYgLyogQ09ORklHX1BQQyAqLwogI2lmZGVmIENPTkZJR19BUk0KICMgaW5jbHVkZSA8YXNtL3UtYm9vdC1hcm0uaD4JLyogQVJNIHZlcnNpb24gdG8gYmUgZml4ZWQhICovCiAjZW5kaWYgLyogQ09ORklHX0FSTSAqLworI2lmZGVmIENPTkZJR19JMzg2CQkvKiB4ODYgdmVyc2lvbiB0byBiZSBmaXhlZCEgKi8KKyMgaW5jbHVkZSA8YXNtL3BwY2Jvb3QtaTM4Ni5oPiAgCisjZW5kaWYgLyogQ09ORklHX0kzODYgKi8KIAogdm9pZCAgICBwY2lfaW5pdCAgICAgICh2b2lkKTsKIHZvaWQgICAgcGNpaW5mbyAgICAgICAoaW50LCBpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0xBTlRFQy5oIGIvaW5jbHVkZS9jb25maWdzL0xBTlRFQy5oCmluZGV4IGM3Yzc4YWQuLmZlOWVlMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9MQU5URUMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTEFOVEVDLmgKQEAgLTkwLDYgKzkwLDcgQEAKIAkJCQkJICAgICAmIH5DRkdfQ01EX0VFUFJPTQlcCiAJCQkJCSAgICAgJiB+Q0ZHX0NNRF9FTEYJXAogCQkJCQkgICAgICYgfkNGR19DTURfRkRDCVwKKwkJCQkJICAgICAmIH5DRkdfQ01EX0ZET1MJXAogCQkJCQkgICAgICYgfkNGR19DTURfSFdGTE9XCVwKIAkJCQkJICAgICAmIH5DRkdfQ01EX0kyQwlcCiAJCQkJCSAgICAgJiB+Q0ZHX0NNRF9JREUJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzgyNjBBRFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4MjYwQURTLmgKaW5kZXggMTRhZDMxMy4uYjRkODQwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzgyNjBBRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2MEFEUy5oCkBAIC0xMTIsNiArMTEyLDcgQEAKIAkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCiAJCQkJIENGR19DTURfRUxGICAgIHwgXAogCQkJCSBDRkdfQ01EX0ZEQwl8IFwKKwkJCQkgQ0ZHX0NNRF9GRE9TCXwgXAogCQkJCSBDRkdfQ01EX0hXRkxPVwl8IFwKIAkJCQkgQ0ZHX0NNRF9JREUJfCBcCiAJCQkJIENGR19DTURfSkZGUzIJfCBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZXA4MjYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvZXA4MjYwLmgKaW5kZXggNWRiMWYxMy4uMTI4NTMyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2VwODI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9lcDgyNjAuaApAQCAtMjc2LDYgKzI3Niw3IEBACiAJCQkJCX5DRkdfQ01EX0RPQyAgICAmIFwKIAkJCQkJfkNGR19DTURfRUVQUk9NICYgXAogCQkJCQl+Q0ZHX0NNRF9GREMgICAgJiBcCisJCQkJCX5DRkdfQ01EX0ZET1MJJiBcCiAJCQkJCX5DRkdfQ01EX0hXRkxPVwkmIFwKIAkJCQkJfkNGR19DTURfSURFICAgICYgXAogCQkJCQl+Q0ZHX0NNRF9KRkZTMgkmIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9oeW1vZC5oIGIvaW5jbHVkZS9jb25maWdzL2h5bW9kLmgKaW5kZXggYWYzYmE2OC4uNWQyYmVkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2h5bW9kLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2h5bW9kLmgKQEAgLTE0MSw2ICsxNDEsNyBAQAogCQkJCQlDRkdfQ01EX0RPQwl8IFwKIAkJCQkJQ0ZHX0NNRF9FTEYJfCBcCiAJCQkJCUNGR19DTURfRkRDCXwgXAorCQkJCQlDRkdfQ01EX0ZET1MJfCBcCiAJCQkJCUNGR19DTURfSFdGTE9XCXwgXAogCQkJCQlDRkdfQ01EX0lERQl8IFwKIAkJCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYzUyMF9jZHAuaCBiL2luY2x1ZGUvY29uZmlncy9zYzUyMF9jZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Q2Yzc5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL3NjNTIwX2NkcC5oCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIGJvYXJkL2NvbmZpZy5oIC0gY29uZmlndXJhdGlvbiBvcHRpb25zLCBib2FyZCBzcGVjaWZpYworICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisKKyNkZWZpbmUgQ09ORklHX1g4NgkJMQkvKiBUaGlzIGlzIGEgWDg2IENQVQkJKi8KKworI2RlZmluZSBDRkdfU0RSQU1fUFJFQ0hBUkdFX0RFTEFZIDYgICAgIC8qIDZUICovCQorI2RlZmluZSBDRkdfU0RSQU1fUkVGUkVTSF9SQVRFICAgIDc4ICAgIC8qIDcuOHVTIChjaG9pY2VzIGFyZSA3LjgsIDE1LjYsIDMxLjIgb3IgNjIuNXVTKSAqLworI2RlZmluZSBDRkdfU0RSQU1fUkFTX0NBU19ERUxBWSAgIDMgICAgIC8qIDNUICovCisKKy8qIGRlZmluZSBhdCBtb3N0IG9uZSBvZiB0aGVzZSAqLworI3VuZGVmIENGR19TRFJBTV9DQVNfTEFURU5DWV8yVAorI2RlZmluZSBDRkdfU0RSQU1fQ0FTX0xBVEVOQ1lfM1QKKworI2RlZmluZSBDRkdfU0M1MjBfSElHSF9TUEVFRCAgICAwICAgICAgIC8qIDEwMCBvciAxMzNNSHogKi8KKyNkZWZpbmUgQ0ZHX1JFU0VUX0dFTkVSSUMgICAgICAgMSAgICAgICAvKiB1c2UgdHJpcHBsZS1mYXVsdCB0byByZXNldCBjcHUgKi8KKyN1bmRlZiAgQ0ZHX1JFU0VUX1NDNTIwICAgICAgICAgICAgICAgICAvKiB1c2UgU0M1MjAgTU1DUidzIHRvIHJlc2V0IGNwdSAqLworI3VuZGVmICBDRkdfVElNRVJfU0M1MjAgICAgICAgICAgICAgICAgIC8qIHVzZSBTQzUyMCBzd3RpbWVycyAqLworI2RlZmluZSBDRkdfVElNRVJfR0VORVJJQyAgICAgICAxICAgICAgIC8qIHVzZSB0aGUgaTgyNTQgUElUIHRpbWVycyAqLworI3VuZGVmICBDRkdfVElNRVJfVFNDICAgICAgICAgICAgICAgICAgIC8qIHVzZSB0aGUgUGVudGl1bSBUU0MgdGltZXJzICovCisjZGVmaW5lICBDRkdfVVNFX1NJT19VQVJUICAgICAgIDAgICAgICAgLyogcHJlZmVyIHRoZSB1YXJ0cyBvbiB0aGUgU0lPIHRvIHRob3NlCisJCQkJCSAqIGluIHRoZSBTQzUyMCBvbiB0aGUgQ0RQICovCisKKyNkZWZpbmUgQ0ZHX1NUQUNLX1NJWkUgICAgICAgICAgMHg4MDAwICAvKiBTaXplIG9mIGJvb3Rsb2FkZXIgc3RhY2sgKi8KKworI2RlZmluZSBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTIDEKKyNkZWZpbmUgQ09ORklHX0xBU1RfU1RBR0VfSU5JVCAgICAxCisKKy8qCisgKiBTaXplIG9mIG1hbGxvYygpIHBvb2wKKyAqLworI2RlZmluZSBDT05GSUdfTUFMTE9DX1NJWkUJKENGR19FTlZfU0laRSArIDEyOCoxMDI0KQorCisKKy8qIGFsbG93IHRvIG92ZXJ3cml0ZSBzZXJpYWwgYW5kIGV0aGFkZHIgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKKyNkZWZpbmUgQ0ZHX0VOVl9JU19OT1dIRVJFIDEKKyN1bmRlZiBDRkdfRU5WX0lTX0lOX0ZMQVNIIAorI3VuZGVmIENGR19FTlZfSVNfSU5fTlZSQU0gCisjdW5kZWYgQ0ZHX0VOVl9JU19JTkVFUFJPTQorCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAorCisjZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIHwgQ0ZHX0NNRF9KRkZTMiB8IENGR19DTURfSURFIHwgQ0ZHX0NNRF9ORVQpCisKKy8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KKyNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTE1CisjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJInJvb3Q9L2Rldi9tdGRibG9jazAgY29uc29sZT10dHlTMCw5NjAwIgorLyogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDM4MDAwMDAwIiAqLworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCisjZW5kaWYKKworI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSyAgICAwICAgICAgICAgICAvKiB1c2UgZm9yIEpGRlMyICovCisjZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MgICAgIDEgICAgICAgICAgIC8qICAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUJQ0ZHX1BST01QVAkJImJvb3QgPiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2RlZmluZQlDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUJQ0ZHX01BWEFSR1MJCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDAxMDAwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MDEwMDAwMDAJLyogMSAuLi4gMTYgTUIgaW4gRFJBTQkqLworCisjdW5kZWYgIENGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisKKyNkZWZpbmUJQ0ZHX0xPQURfQUREUgkJMHgzODAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcwkqLworCisjZGVmaW5lCUNGR19IWgkJCTEwMjQJCS8qIGluY3JlbWVudGVyIGZyZXE6IDFrSHogKi8KKworCQkJCQkJLyogdmFsaWQgYmF1ZHJhdGVzICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUGh5c2ljYWwgTWVtb3J5IE1hcAorICovCisjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTQJICAgLyogd2UgaGF2ZSA0IGJhbmtzIG9mIERSQU0gKi8KKworCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgzODAwMDAwMCAvKiBGbGFzaCBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfRkxBU0hfU0laRQkJMHgwMDgwMDAwMCAvKiA4IE1CICovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGTEFTSCBhbmQgZW52aXJvbm1lbnQgb3JnYW5pemF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCS8qIG1heCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzCQkqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJNjQJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwCSovCisKKy8qIHRpbWVvdXQgdmFsdWVzIGFyZSBpbiB0aWNrcyAqLworI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkoMipDRkdfSFopIC8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlICovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCSgyKkNGR19IWikgLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKi8KKworI2RlZmluZQlDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoUEhZU19GTEFTSF8xICsgMHg3YTAwMDApCS8qIEFkZHIgb2YgRW52aXJvbm1lbnQgU2VjdG9yCSovCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHg0MDAwCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yCSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGV2aWNlIGRyaXZlcnMKKyAqLworI2RlZmluZSBDT05GSUdfTkVUX01VTFRJICAgICAgICAvKiBNdWx0aSBldGhlcm5ldCBjYXJkcyBzdXBwb3J0ICovCisjZGVmaW5lIENPTkZJR19QQ05FVAorI2RlZmluZSBDT05GSUdfUENORVRfNzlDOTczCisjZGVmaW5lIENPTkZJR19QQ05FVF83OUM5NzUKKyNkZWZpbmUgUENORVRfSEFTX1BST00gICAgICAgICAxCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJREUvQVRBIHN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDRkdfSURFX01BWEJVUwkJMiAgIC8qIG1heC4gMiBJREUgYnVzc2VzCSovCisjZGVmaW5lIENGR19JREVfTUFYREVWSUNFCShDRkdfSURFX01BWEJVUyoyKSAvKiBtYXguIDIgZHJpdmVzIHBlciBJREUgYnVzICovCisKKyNkZWZpbmUgQ0ZHX0FUQV9JREUwX09GRlNFVAkweDAxRjAJLyogaWRlMCBvZmZzdGUgKi8KKyNkZWZpbmUgQ0ZHX0FUQV9JREUxX09GRlNFVAkweDAxNzAJLyogaWRlMSBvZmZzZXQgKi8KKyNkZWZpbmUgQ0ZHX0FUQV9EQVRBX09GRlNFVAkwCS8qIGRhdGEgcmVnIG9mZnNldAkqLworI2RlZmluZSBDRkdfQVRBX1JFR19PRkZTRVQJMAkvKiByZWcgb2Zmc2V0ICovCisjZGVmaW5lIENGR19BVEFfQUxUX09GRlNFVAkweDIwMAkvKiBhbHRlcm5hdGUgcmVnaXN0ZXIgb2Zmc2V0ICovCisKKyN1bmRlZglDT05GSUdfSURFXzh4eF9ESVJFQ1QJCS8qIG5vIHBjbWNpYSBpbnRlcmZhY2UgcmVxdWlyZWQgKi8KKyN1bmRlZglDT05GSUdfSURFX0xFRAkJCS8qIG5vIGxlZCBmb3IgaWRlIHN1cHBvcnRlZAkqLworI3VuZGVmICBDT05GSUdfSURFX1JFU0VUCQkvKiByZXNldCBmb3IgaWRlIHVuc3VwcG9ydGVkLi4uCSovCisjdW5kZWYgIENPTkZJR19JREVfUkVTRVRfUk9VVElORQkvKiBubyBzcGVjaWFsIHJlc2V0IGZ1bmN0aW9uICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFUQVBJIHN1cHBvcnQgKGV4cGVyaW1lbnRhbCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENPTkZJR19BVEFQSQkJCS8qIGVuYWJsZSBBVEFQSSBTdXBwb3J0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERJU0sgUGFydGl0aW9uIHN1cHBvcnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCisjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCisjZGVmaW5lIENPTkZJR19JU09fUEFSVElUSU9OIC8qIEV4cGVyaW1lbnRhbCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBLZXlib2FyZCBzdXBwb3J0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDT05GSUdfSVNBX0tFWUJPQVJECisKKyNpZiAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWaWRlbyBzdXBwb3J0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDT05GSUdfVklERU8JCQkvKlRvIGVuYWJsZSB2aWRlbyBjb250cm9sbGVyIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX1ZJREVPX0NUNjkwMDAKKyNkZWZpbmUgQ09ORklHX0NGQl9DT05TT0xFCisjZGVmaW5lIENPTkZJR19WSURFT19MT0dPCisjZGVmaW5lIENPTkZJR19DT05TT0xFX0VYVFJBX0lORk8KKyNkZWZpbmUgQ09ORklHX1ZHQV9BU19TSU5HTEVfREVWSUNFCisjZGVmaW5lIENPTkZJR19WSURFT19TV19DVVJTT1IKKyNkZWZpbmUgQ09ORklHX1ZJREVPX09OQk9BUkQJCS8qIFZpZGVvIGNvbnRyb2xsZXIgaXMgb24tYm9hcmQgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSVEMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ09ORklHX1JUQ19NQzE0NjgxOAorI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLworCisvKgorICogUENJIHN0dWZmCisgKi8KKyNkZWZpbmUgQ09ORklHX1BDSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5jbHVkZSBwY2kgc3VwcG9ydCAqLworI2RlZmluZSBDT05GSUdfUENJX1BOUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwY2kgcGx1Zy1hbmQtcGxheSAqLworI2RlZmluZSBDT05GSUdfUENJX1NDQU5fU0hPVworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mZGMuaCBiL2luY2x1ZGUvZmRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5MmIwZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZmRjLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3TkdWJsaSBGYXZlcmdlcyAtIDx3d3cuc3RhdWJsaS5jb20+CisgKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX0ZEQ19IXworI2RlZmluZSBfRkRDX0hfCisKKworCisvKiBGdW5jdGlvbnMgcHJvdG90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitpbnQgZmRjX2Zkb3NfaW5pdCAoaW50IGRyaXZlKTsKK2ludCBmZGNfZmRvc19zZWVrIChpbnQgd2hlcmUpOworaW50IGZkY19mZG9zX3JlYWQgKHZvaWQgKmJ1ZmZlciwgaW50IGxlbik7CisKK2ludCBkb3Nfb3BlbihjaGFyICpuYW1lKTsKK2ludCBkb3NfcmVhZCAodWxvbmcgYWRkcik7CitpbnQgZG9zX2RpciAodm9pZCk7CisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RhdC5oIGIvaW5jbHVkZS9saW51eC9zdGF0LmgKaW5kZXggOWZkMzIwNi4uMTM4OTljOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdGF0LmgKKysrIGIvaW5jbHVkZS9saW51eC9zdGF0LmgKQEAgLTY3LDcgKzY3LDcgQEAKIAogI2VuZGlmCS8qIF9fUFBDX18gKi8KIAotI2lmZGVmCV9fQVJNX18KKyNpZiBkZWZpbmVkIChfX0FSTV9fKSB8fCBkZWZpbmVkIChfX0kzODZfXykKIAogc3RydWN0IHN0YXQgewogCXVuc2lnbmVkIHNob3J0IHN0X2RldjsKZGlmZiAtLWdpdCBhL2xpYl9pMzg2L01ha2VmaWxlIGIvbGliX2kzODYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5OTRlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L01ha2VmaWxlCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSBsaWIkKEFSQ0gpLmEKKworQU9CSlMJPSBiaW9zLm8gcmVhbG1vZGVfc3dpdGNoLm8gaWMvc2M1MjBfYXNtLm8KKworQ09CSlMJPSBib2FyZC5vIGJpb3Nfc2V0dXAubyBpMzg2X2xpbnV4Lm8gemltYWdlLm8gcmVhbG1vZGUubyBcCisJICBwY2lfdHlwZTEubyBpYy9zYzUyMC5vIGljL2FsaTUxMngubworCitPQkpTCT0gJChBT0JKUykgJChDT0JKUykKKworJChMSUIpOgkuZGVwZW5kICQoT0JKUykKKwkkKEFSKSBjcnYgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5kZXBlbmQ6CU1ha2VmaWxlICQoQU9CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCisJCSQoQ0MpIC1NICQoQ0ZMQUdTKSAkKEFPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKSA+ICRACisKK3NpbmNsdWRlIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbGliX2kzODYvYmlvcy5TIGIvbGliX2kzODYvYmlvcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNWVhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJfaTM4Ni9iaW9zLlMKQEAgLTAsMCArMSw0NDMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQorICogCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQmFzZWQgb24gbXNiaW9zLmMgZnJvbSByb2xvIDEuNjoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zIEdtYkgKKyAqIEtsZWluLVdpbnRlcm5oZWltLCBHZXJtYW55CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogRHVyaW5nIGl0J3MgaW5pdGlhbGl6YXRpb24gcGhhc2UsIGJlZm9yZSBzd2l0Y2hpbmcgdG8gcHJvdGVjdGVkCisgKiBtb2RlLCB0aGUgTGludXggS2VybmVsIG1ha2VzIGEgZmV3IEJJT1MgY2FsbHMuIFRoaXMgd29uJ3Qgd29yaworICogaWYgdGhlIGJvYXJkIGRvZXMgbm90IGhhdmUgYSBCSU9TLgorICoKKyAqIFRoaXMgaXMgYSB2ZXJ5IG1pbmltYWxpc2ljIEJJT1MgdGhhdCBzdXBwbGllcyBqdXN0IGVub3VnaAorICogZnVuY3Rpb25hbGl0eSB0byBrZWVwIHRoZSBMaW51eCBLZXJuZWwgaGFwcHkuIEl0IGlzIE5PVAorICogYSBnZW5lcmFsIHB1cnBvc2UgcmVwbGFjZW1lbnQgZm9yIGEgcmVhbCBCSU9TICEhCisgKi8KKworI2RlZmluZSBPRkZTX0VTICAgICAgMAorI2RlZmluZSBPRkZTX0dTICAgICAgMgorI2RlZmluZSBPRkZTX0RTICAgICAgNAorI2RlZmluZSBPRkZTX0RJICAgICAgNgorI2RlZmluZSBPRkZTX1NJICAgICAgOAorI2RlZmluZSBPRkZTX0JQICAgICAgMTAKKyNkZWZpbmUgT0ZGU19TUCAgICAgIDEyCisjZGVmaW5lIE9GRlNfQlggICAgICAxNAorI2RlZmluZSBPRkZTX0RYICAgICAgMTYKKyNkZWZpbmUgT0ZGU19DWCAgICAgIDE4CisjZGVmaW5lIE9GRlNfQVggICAgICAyMAorI2RlZmluZSBPRkZTX1ZFQ1RPUiAgMjIKKyNkZWZpbmUgT0ZGU19JUCAgICAgIDI0CisjZGVmaW5lIE9GRlNfQ1MgICAgICAyNgorI2RlZmluZSBPRkZTX0ZMQUdTICAgMjgKKworI2RlZmluZSBTRUdNRU5UICAgICAgMHg0MAorI2RlZmluZSBTVEFDSwkgICAgIDB4ODAwICAJCQkvKiBzdGFjayBhdCAweDQwOjB4ODAwIC0+IDB4ODAwICovCisKKy5zZWN0aW9uIC5iaW9zLCAiYXgiCisuY29kZTE2Cisub3JnIDAKKworLmdsb2JsIHJtX2ludDAwCitybV9pbnQwMDoKKwlwdXNodwkkMAorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQwMQorcm1faW50MDE6CisJcHVzaHcJJDEKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MDIKK3JtX2ludDAyOgorCXB1c2h3CSQyCisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDAzCitybV9pbnQwMzoKKwlwdXNodwkkMworCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQwNAorcm1faW50MDQ6CisJcHVzaHcJJDQKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MDUKK3JtX2ludDA1OgorCXB1c2h3CSQ1CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDA2CitybV9pbnQwNjoKKwlwdXNodwkkNgorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQwNworcm1faW50MDc6CisJcHVzaHcJJDcKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MDgKK3JtX2ludDA4OgorCXB1c2h3CSQ4CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDA5CitybV9pbnQwOToKKwlwdXNodwkkOQorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQwYQorcm1faW50MGE6CisJcHVzaHcJJDEwCisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDBiCitybV9pbnQwYjoKKwlwdXNodwkkMTEKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MGMKK3JtX2ludDBjOgorCXB1c2h3CSQxMgorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQwZAorcm1faW50MGQ6CisJcHVzaHcJJDEzCisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDBlCitybV9pbnQwZToKKwlwdXNodwkkMTQKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MGYKK3JtX2ludDBmOgorCXB1c2h3CSQxNQorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxMAorcm1faW50MTA6CisJcHVzaHcJJDE2CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDExCitybV9pbnQxMToKKwlwdXNodwkkMTcKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MTIKK3JtX2ludDEyOgorCXB1c2h3CSQxOAorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxMworcm1faW50MTM6CisJcHVzaHcJJDE5CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDE0CitybV9pbnQxNDoKKwlwdXNodwkkMjAKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MTUKK3JtX2ludDE1OgorCXB1c2h3CSQyMQorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxNgorcm1faW50MTY6CisJcHVzaHcJJDIyCisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDE3CitybV9pbnQxNzoKKwlwdXNodwkkMjMKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MTgKK3JtX2ludDE4OgorCXB1c2h3CSQyNAorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxOQorcm1faW50MTk6CisJcHVzaHcJJDI1CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDFhCitybV9pbnQxYToKKwlwdXNodwkkMjYKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MWIKK3JtX2ludDFiOgorCXB1c2h3CSQyNworCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxYworcm1faW50MWM6CisJcHVzaHcJJDI4CisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2ludDFkCitybV9pbnQxZDoKKwlwdXNodwkkMjkKKwlqbXAJYW55X2ludGVycnVwdDE2CisuZ2xvYmwgcm1faW50MWUKK3JtX2ludDFlOgorCXB1c2h3CSQzMAorCWptcAlhbnlfaW50ZXJydXB0MTYKKy5nbG9ibCBybV9pbnQxZgorcm1faW50MWY6CisJcHVzaHcJJDMxCisJam1wCWFueV9pbnRlcnJ1cHQxNgorLmdsb2JsIHJtX2RlZl9pbnQKK3JtX2RlZl9pbnQ6CisJaXJldAorCisgCisJLyoKKwkgKiBBbGwgaW50ZXJydXB0IGp1bXB0YWJsZSBlbnRyaWVzIGp1bXAgdG8gaGVyZQorCSAqIGFmdGVyIHB1c2hpbmcgdGhlIGludGVycnVwdCB2ZWN0b3IgbnVtYmVyIG9udG8gdGhlCisJICogc3RhY2suCisJICovCithbnlfaW50ZXJydXB0MTY6CisJcHVzaGEJCQkJCS8qIHNhdmUgZ2VuZXJhbCByZWdpc3RlcnMgKi8KKwlwdXNodwklZHMJCQkJLyogc2F2ZSBzb21lIHNlZ21lbnRzICAgICAqLworCXB1c2h3CSVncworCXB1c2h3CSVlcworCXB1c2h3CSVzcwkJCQkvKiBzYXZlIGNhbGxlcnMgc3RhY2sgc2VnbWVudCAuLiAqLworCXBvcHcJJWdzCQkJCS8qIC4uLiBpbiBncyAqLworCW1vdncJJFNFR01FTlQsJWF4CQkJLyogc2V0dXAgbXkgc2VnbWVudHMgKi8KKwltb3Z3CSVheCwlZHMKKwltb3Z3CSVheCwlZXMKKwltb3Z3CSVheCwlc3MKKwltb3Z3CSVzcCwlYnAKKwltb3Z3CSRTVEFDSywlc3AJCQkvKiBzZXR1cCBCSU9TIHN0YWNrcG9pbnRlciAqLworCitncwltb3Z3CU9GRlNfVkVDVE9SKCVicCksICVheAorCWNtcHcJJDB4MTAsICVheAorCWplCUxpbnRfMTBoICAgICAgICAgCisJY21wdwkkMHgxMSwgJWF4CisJamUJTGludF8xMWgKKwljbXB3CSQweDEzLCAlYXgKKwlqZQlMaW50XzEzaAorCWNtcHcJJDB4MTUsICVheAorCWplCUxpbnRfMTVoCisJY21wdwkkMHgxNiwgJWF4CisJamUJTGludF8xNmgKKwltb3Z3CSQweGZmZmYsICVheAorCWptcAlMb3V0CitMaW50XzEwaDoJCQkJCS8qIFZHQSBCSU9TIHNlcnZpY2VzICovCisJY2FsbAliaW9zXzEwaAorCWptcAlMb3V0CitMaW50XzExaDoJCisJY2FsbAliaW9zXzExaAorCWptcAlMb3V0CitMaW50XzEzaDoJCQkJCS8qIEJJT1MgZGlzayBzZXJ2aWNlcyAqLworCWNhbGwJYmlvc18xM2gKKwlqbXAJTG91dAorTGludF8xNWg6CQkJCQkvKiBNaXNjLiBCSU9TIHNlcnZpY2VzICovCisJY2FsbAliaW9zXzE1aAorCWptcAlMb3V0CitMaW50XzE2aDoJCQkJCS8qIGtleWJvYXJkIHNlcnZpY2VzICovCisJY2FsbAliaW9zXzE2aAorCWptcAlMb3V0CitMb3V0OgkKKwljbXB3CSQwLCAlYXgKKwlqZQlMaGFuZGVsZWQKKwkKKwkvKiBJbnNlcnQgY29kZSBmb3IgdW5oYW5kZWxlZCBJTlRzIGhlcmUuCisJICoKKwkgKiBST0xPIHByaW50cyBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgCisJICogKHdlIGNvdWxkIGRvIHRoYXQgYnV0IHRoZW4gd2UncmUgaW4gMTZiaXQgbW9kZQorCSAqIHNvIHdlJ2xsIGhhdmUgdG8gZ2V0IGJhY2sgaW50byAzMmJpdCBtb2RlCisJICogdG8gdXNlIHRoZSBjb25zb2xlIEkvTyByb3V0aW5lcyAoaWYgd2UgZG8gdGhpcworCSAqIHdlIHNodWxzIG1ha2UgaW50IDB4MTAgYW5kIGludCAweDE2IHdvcmsgYXMgd2VsbCkpCisJICovCitMaGFuZGVsZWQ6CisKKwlwdXNodwklZ3MJCQkJLyogcmVzdG9yZSBjYWxsZXJzIHN0YWNrIHNlZ21lbnQgKi8KKwlwb3B3CSVzcworCW1vdncJJWJwLCVzcAkJCQkvKiByZXN0b3JlIHN0YWNrcG9pbnRlciAqLworCisJcG9wdwklZXMJCQkJLyogcmVzdG9yZSBzZWdtZW50IHNlbGVjdG9ycyAqLworCXBvcHcJJWdzCisJcG9wdwklZHMKKwkKKwlwb3BhCQkJCQkvKiByZXN0b3JlIEdQIHJlZ2lzdGVycyAqLworCWFkZHcJJDIsJXNwCQkJCS8qIGR1bXAgdmVjdG9yIG51bWJlciAqLworCWlyZXQJCQkJCS8qIHJldHVybiBmcm9tIGludGVycnVwdCAqLworCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCSU9TIAlpbnRlcnJ1cHQgMTBoIC0tIFZHQSBzZXJ2aWNlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitiaW9zXzEwaDoKK2dzCW1vdncJT0ZGU19BWCglYnApLCAlYXgKKwlzaHJ3CSQ4LCAlYXgKKwljbXB3CSQweDMsICVheAorCWplCUxjdXJfcG9zCisJY21wdwkkMHhmLCAlYXgKKwlqZQlMdmlkX3N0YXRlCisJY21wdwkkMHgxMiwgJWF4CisJamUJTHZpZF9jZmcKKwltb3Z3CSQweGZmZmYsICVheAorCXJldAorTGN1cl9wb3M6CQkJCQkvKiBSZWFkIEN1cnNvciBQb3NpdGlvbiBhbmQgU2l6ZSAqLworZ3MJbW92dwkkMCwgT0ZGU19DWCglYnApCitncwltb3Z3CSQwLCBPRkZTX0RYKCVicCkKKwl4b3J3CSVheCwgJWF4CisJcmV0CitMdmlkX3N0YXRlOgkJCQkJLyogR2V0IFZpZGVvIFN0YXRlICovCitncwltb3Z3CSQoODAgPDwgOHwweDAzKSwgT0ZGU19BWCglYnApCS8qIDgwIGNvbHVtbnMsIDgweDI1LCAxNiBjb2xvcnMgKi8KK2dzCW1vdncJJDAsIE9GRlNfQlgoJWJwKQorCXhvcncJJWF4LCAlYXgKKwlyZXQKK0x2aWRfY2ZnOgkvKiBWaWRlbyBTdWJzeXN0ZW0gQ29uZmlndXJhdGlvbiAoRUdBL1ZHQSkgKi8KK2dzCW1vdncJJDB4MTAsIE9GRlNfQlgoJWJwKQkJLyogaW5kaWNhdGUgQ0dBL01EQS9IR0EgKi8KKwl4b3J3CSVheCwgJWF4CisJcmV0CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJJT1MgaW50ZXJydXB0IDExaCAtLSBFcXVpcG1lbnQgZGV0ZXJtaW5hdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2Jpb3NfMTFoOgorCW1vdncJYmlvc19lcXVpcG1lbnQsICVheAorZ3MJbW92dwklYXgsIE9GRlNfQVgoJWJwKSAgCisJeG9ydwklYXgsICVheAorCXJldAorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCSU9TIGludGVycnVwdCAxM2ggLS0gRGlzayBzZXJ2aWNlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitiaW9zXzEzaDoKK2dzCW1vdncJT0ZGU19BWCglYnApLCAlYXgKKwlzaHJ3CSQ4LCAlYXgKKwljbXB3CSQweDE1LCAlYXgKKwlqZQlMZnVuY18xNWgKKwltb3Z3CSQweGZmZmYsICVheAorCXJldAorTGZ1bmNfMTVoOgkKK2dzCW1vdncJT0ZGU19BWCglYnApLCAlYXgKKwlhbmR3CSQweGZmLCAlYXgJCQkvKiByZXR1cm4gQUg9MC0+ZHJpdmUgbm90IHByZXNlbnQgKi8KK2dzCW1vdncJJWF4LCBPRkZTX0FYKCVicCkKKwl4b3J3CSVheCwgJWF4CisJcmV0CisJCisJCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJJT1MgaW50ZXJydXB0IDE1aCAtLSBNaXNjZWxsYW5lb3VzIHNlcnZpY2VzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYmlvc18xNWg6Citncwltb3Z3CU9GRlNfQVgoJWJwKSwgJWF4CisJc2hydwkkOCwgJWF4CisJY21wdwkkMHhjMCwgJWF4CisJamUJTGZ1bmNfYzBoCisJY21wdwkkMHhlOCwgJWF4CisJamUJTGZ1bmNfZThoCisJY21wdwkkMHg4OCwgJWF4CisJamUJTGZ1bmNfODhoCisJbW92dwkkMHhmZmZmLCAlYXgKKwlyZXQKKworTGZ1bmNfYzBoOiAJCQkJCS8qIFJldHVybiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXJzIChQUzIgb25seSkgKi8KK2dzCW1vdncJT0ZGU19GTEFHUyglYnApLCAlYXgKKwlvcncJJDEsICVheAkJCQkvKiByZXR1cm4gY2FycnkgLS0gZnVuY3Rpb24gbm90IHN1cHBvcnRlZCAqLworZ3MJbW92dwklYXgsIE9GRlNfRkxBR1MoJWJwKQorCXhvcncJJWF4LCAlYXgKKwlyZXQKKwkKK0xmdW5jX2U4aDoKK2dzCW1vdncJT0ZGU19BWCglYnApLCAlYXgKKwlhbmR3CSQweGZmLCAlYXgKKwljbXB3CSQxLCAlYXgKKwlqZQlMZnVuY19lODAxaAorZ3MJbW92dwlPRkZTX0ZMQUdTKCVicCksICVheAorCW9ydwkkMSwgJWF4CQkJCS8qIHJldHVybiBjYXJyeSAtLSBmdW5jdGlvbiBub3Qgc3VwcG9ydGVkICovCitncwltb3Z3CSVheCwgT0ZGU19GTEFHUyglYnApCisJeG9ydwklYXgsICVheAorCXJldAorCQorTGZ1bmNfZTgwMWg6CQkJCQkvKiBHZXQgbWVtb3J5IHNpemUgZm9yID42NE0gQ29uZmlndXJhdGlvbnMgKi8KKwltb3Z3CSRyYW1faW5fNjRrYl9jaHVua3MsICVheAorCWNtcHcJJDI1NiwgJWF4CisJamEJTG1vcmVfdGhhbl8xNm1iCisJc2hsdwkkNiwgJWF4CQkJCS8qIG11bHRpcGx5IGJ5IDY0ICovCQorZ3MJbW92dwklYXgsIE9GRlNfQVgoJWJwKSAgIAkJLyogcmV0dXJuIG1lbW9yeSBzaXplIGluIDFrYiBjaHVua3MgaW4gQVggYW5kIENYICovCitncwltb3Z3CSVheCwgT0ZGU19DWCglYnApCisJeG9ydwklYXgsICVheAorZ3MJbW92dwklYXgsIE9GRlNfQlgoJWJwKQkJLyogc2V0IEJYIGFuZCBEWCB0byAwKi8KK2dzCW1vdncJJWF4LCBPRkZTX0RYKCVicCkJCitncwltb3Z3CU9GRlNfRkxBR1MoJWJwKSwgJWF4CisJYW5kdwkkMHhmZmZlLCAlYXgJCQkvKiBjbGVhciBjYXJyeSAtLSBmdW5jdGlvbiBzdWNjZWVkZWQgKi8KK2dzCW1vdncJJWF4LCBPRkZTX0ZMQUdTKCVicCkKKwl4b3J3CSVheCwgJWF4CisJcmV0CisJCitMbW9yZV90aGFuXzE2bWI6CisJc3VidwkkMHgxMDAsICVheAkJCS8qIHN1YnRyYWN0IDE2TUIgKi8JCisJCitncwltb3Z3CSQweDNjMDAsIE9GRlNfQVgoJWJwKQkJLyogcmV0dXJuIDB4M2MwMCAoMTZNQi0zODRrKSBpbiBBWCBhbmQgQ1ggKi8KK2dzCW1vdncJJDB4M2MwMCwgT0ZGU19DWCglYnApCitncwltb3Z3CSVheCwgT0ZGU19CWCglYnApCQkvKiBzZXQgQlggYW5kIERYIHRvIG51bWJlciBvZiA2NGtiIGNodW5rcyAtIDI1NiAqLworZ3MJbW92dwklYXgsIE9GRlNfRFgoJWJwKQkKKworZ3MJbW92dwlPRkZTX0ZMQUdTKCVicCksICVheAorCWFuZHcJJDB4ZmZmZSwgJWF4CQkJLyogY2xlYXIgY2FycnkgLS0gZnVuY3Rpb24gc3VjY2VlZGVkICovCitncwltb3Z3CSVheCwgT0ZGU19GTEFHUyglYnApCisJeG9ydwklYXgsICVheAorCXJldAorCitMZnVuY184OGg6CisJbW92dwlyYW1faW5fNjRrYl9jaHVua3MsICVheAorCXN1YncJJDE2LCAlYXgKKwlzaGx3CSQ2LCAlYXgKKwkKK2dzCW1vdncJJWF4LCBPRkZTX0FYKCVicCkJCS8qIHJldHVybiBudW1iZXIgb2Yga2lsb2J5dGVzIGluIGF4ICovCisKK2dzCW1vdncJT0ZGU19GTEFHUyglYnApLCAlYXgKKwlhbmR3CSQweGZmZmUsICVheAkJCS8qIGNsZWFyIGNhcnJ5IC0tIGZ1bmN0aW9uIHN1Y2NlZWRlZCAqLworZ3MJbW92dwklYXgsIE9GRlNfRkxBR1MoJWJwKQorCisJeG9ydwklYXgsICVheAorCXJldAorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCSU9TIGludGVycnVwdCAxNmggLS0ga2V5Ym9hcmQgc2VydmljZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYmlvc18xNmg6Citncwltb3Z3CU9GRlNfQVgoJWJwKSwgJWF4CisJc2hydwkkOCwgJWF4CisJY21wdwkkMHgwMywgJWF4CisJamUJTGZ1bmNfMDNoCisJbW92dwkkMHhmZmZmLCAlYXgKKwlyZXQKK0xmdW5jXzAzaDoKKwl4b3J3CSVheCwgJWF4CQkJLyogZG8gbm90aGluZyAtLSBmdW5jdGlvbiBub3Qgc3VwcG9ydGVkICovCisJcmV0CisKKworLmdsb2JsIHJhbV9pbl82NGtiX2NodW5rcworcmFtX2luXzY0a2JfY2h1bmtzOgorCS53b3JkIAkwCisKKy5nbG9ibCBiaW9zX2VxdWlwbWVudAorYmlvc19lcXVpcG1lbnQ6CisJLndvcmQgCTAKKwpkaWZmIC0tZ2l0IGEvbGliX2kzODYvYmlvc19zZXR1cC5jIGIvbGliX2kzODYvYmlvc19zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzE5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJfaTM4Ni9iaW9zX3NldHVwLmMKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQorICogCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKy8qCisgKiBQYXJ0bHkgYmFzZWQgb24gbXNiaW9zLmMgZnJvbSByb2xvIDEuNjoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zIEdtYkgKKyAqIEtsZWluLVdpbnRlcm5oZWltLCBHZXJtYW55CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3JlYWxtb2RlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgTlVNVkVDVFMJMjU2CisKKyNkZWZpbmUgQklPU19EQVRBICAgICAgICAoKGNoYXIqKTB4NDAwKQorI2RlZmluZSBCSU9TX0RBVEFfU0laRSAgIDI1NgorI2RlZmluZSBCSU9TX0JBU0UgICAgICAgICgoY2hhciopMHhmMDAwMCkKKyNkZWZpbmUgQklPU19DUyAgICAgICAgICAweGYwMDAKKworZXh0ZXJuIHUxNiByYW1faW5fNjRrYl9jaHVua3M7CitleHRlcm4gdTE2IGJpb3NfZXF1aXBtZW50OworZXh0ZXJuIHZvaWQgKnJtX2ludDAwOworZXh0ZXJuIHZvaWQgKnJtX2ludDAxOworZXh0ZXJuIHZvaWQgKnJtX2ludDAyOworZXh0ZXJuIHZvaWQgKnJtX2ludDAzOworZXh0ZXJuIHZvaWQgKnJtX2ludDA0OworZXh0ZXJuIHZvaWQgKnJtX2ludDA1OworZXh0ZXJuIHZvaWQgKnJtX2ludDA2OworZXh0ZXJuIHZvaWQgKnJtX2ludDA3OworZXh0ZXJuIHZvaWQgKnJtX2ludDA4OworZXh0ZXJuIHZvaWQgKnJtX2ludDA5OworZXh0ZXJuIHZvaWQgKnJtX2ludDBhOworZXh0ZXJuIHZvaWQgKnJtX2ludDBiOworZXh0ZXJuIHZvaWQgKnJtX2ludDBjOworZXh0ZXJuIHZvaWQgKnJtX2ludDBkOworZXh0ZXJuIHZvaWQgKnJtX2ludDBlOworZXh0ZXJuIHZvaWQgKnJtX2ludDBmOworZXh0ZXJuIHZvaWQgKnJtX2ludDEwOworZXh0ZXJuIHZvaWQgKnJtX2ludDExOworZXh0ZXJuIHZvaWQgKnJtX2ludDEyOworZXh0ZXJuIHZvaWQgKnJtX2ludDEzOworZXh0ZXJuIHZvaWQgKnJtX2ludDE0OworZXh0ZXJuIHZvaWQgKnJtX2ludDE1OworZXh0ZXJuIHZvaWQgKnJtX2ludDE2OworZXh0ZXJuIHZvaWQgKnJtX2ludDE3OworZXh0ZXJuIHZvaWQgKnJtX2ludDE4OworZXh0ZXJuIHZvaWQgKnJtX2ludDE5OworZXh0ZXJuIHZvaWQgKnJtX2ludDFhOworZXh0ZXJuIHZvaWQgKnJtX2ludDFiOworZXh0ZXJuIHZvaWQgKnJtX2ludDFjOworZXh0ZXJuIHZvaWQgKnJtX2ludDFkOworZXh0ZXJuIHZvaWQgKnJtX2ludDFlOworZXh0ZXJuIHZvaWQgKnJtX2ludDFmOworZXh0ZXJuIHZvaWQgKnJtX2RlZl9pbnQ7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbnN0YWxsIGFuIGludGVycnVwdCB2ZWN0b3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGF0aWMgdm9pZCBzZXR2ZWN0b3IoaW50IHZlY3RvciwgdTE2IHNlZ21lbnQsIHZvaWQgKmhhbmRsZXIpCit7CisJdTE2ICpwdHIgPSAodTE2KikodmVjdG9yKjQpOworCXB0clswXSA9ICgodTMyKWhhbmRsZXIgLSAoc2VnbWVudCA8PCA0KSkmMHhmZmZmOworCXB0clsxXSA9IHNlZ21lbnQ7CisJCisjaWYgMAkKKwlwcmludGYoInNldHZlY3RvcjogaW50JTAyeCAtPiAlMDR4OiUwNHhcbiIsCisJICAgICAgIHZlY3RvciwgcHRyWzFdLCBwdHJbMF0pOworI2VuZGlmCQorfQorCitpbnQgYmlvc19zZXR1cCh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCXN0YXRpYyBpbnQgZG9uZT0wOwkKKwlpbnQgdmVjdG9yOworCQorCWlmIChkb25lKSB7CisJCXJldHVybiAwOworCX0KKwlkb25lID0gMTsKKwkKKwlpZiAoaTM4NmJvb3RfYmlvc19zaXplID4gNjU1MzYpIHsKKwkJcHJpbnRmKCJCSU9TIHRvbyBsYXJnZSAoJWxkIGJ5dGVzLCBtYXggaXMgNjU1MzYpXG4iLCAKKwkJICAgICAgIGkzODZib290X2Jpb3Nfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisJCisJbWVtY3B5KEJJT1NfQkFTRSwgKHZvaWQqKWkzODZib290X2Jpb3MsIGkzODZib290X2Jpb3Nfc2l6ZSk7CisKKwkvKiBjbGVhciBiZGEgKi8KKwltZW1zZXQoQklPU19EQVRBLCAwLCBCSU9TX0RBVEFfU0laRSk7CisJCisJLyogZW50ZXIgc29tZSB2YWx1ZXMgdG8gdGhlIGJkYSAqLworCXdyaXRldygweDNmOCwgQklPU19EQVRBKTsgICAvKiBjb20xIGFkZHIgKi8KKwl3cml0ZXcoMHgyZjgsIEJJT1NfREFUQSsyKTsgLyogY29tMiBhZGRyICovCisJd3JpdGV3KDB4M2U4LCBCSU9TX0RBVEErNCk7IC8qIGNvbTMgYWRkciAqLworCXdyaXRldygweDJlOCwgQklPU19EQVRBKzYpOyAvKiBjb200IGFkZHIgKi8KKwl3cml0ZXcoMHgyNzgsIEJJT1NfREFUQSs4KTsgLyogbHB0MSBhZGRyICovCisJLyoKKwkgKiBUaGUga2VybmVsIHdhbnRzIHRvIHJlYWQgdGhlIGJhc2UgbWVtb3J5IHNpemUKKwkgKiBmcm9tIDQwOjEzLiBQdXQgYSB6ZXJvIHRoZXJlIHRvIGF2b2lkIGFuIGVycm9yIG1lc3NhZ2UKKwkgKi8KKwl3cml0ZXcoMCwgQklPU19EQVRBKzB4MTMpOyAgLyogYmFzZSBtZW1vcnkgc2l6ZSAqLworCisJCisJLyogc2V0dXAgcmVhbG1vZGUgaW50ZXJydXB0IHZlY3RvcnMgKi8JCisJZm9yICh2ZWN0b3IgPSAwOyB2ZWN0b3IgPCBOVU1WRUNUUzsgdmVjdG9yKyspIHsKKwkJc2V0dmVjdG9yKHZlY3RvciwgQklPU19DUywgJnJtX2RlZl9pbnQpOworCX0KKwkKKwlzZXR2ZWN0b3IoMHgwMCwgQklPU19DUywgJnJtX2ludDAwKTsKKwlzZXR2ZWN0b3IoMHgwMSwgQklPU19DUywgJnJtX2ludDAxKTsKKwlzZXR2ZWN0b3IoMHgwMiwgQklPU19DUywgJnJtX2ludDAyKTsKKwlzZXR2ZWN0b3IoMHgwMywgQklPU19DUywgJnJtX2ludDAzKTsKKwlzZXR2ZWN0b3IoMHgwNCwgQklPU19DUywgJnJtX2ludDA0KTsKKwlzZXR2ZWN0b3IoMHgwNSwgQklPU19DUywgJnJtX2ludDA1KTsKKwlzZXR2ZWN0b3IoMHgwNiwgQklPU19DUywgJnJtX2ludDA2KTsKKwlzZXR2ZWN0b3IoMHgwNywgQklPU19DUywgJnJtX2ludDA3KTsKKwlzZXR2ZWN0b3IoMHgwOCwgQklPU19DUywgJnJtX2ludDA4KTsKKwlzZXR2ZWN0b3IoMHgwOSwgQklPU19DUywgJnJtX2ludDA5KTsKKwlzZXR2ZWN0b3IoMHgwYSwgQklPU19DUywgJnJtX2ludDBhKTsKKwlzZXR2ZWN0b3IoMHgwYiwgQklPU19DUywgJnJtX2ludDBiKTsKKwlzZXR2ZWN0b3IoMHgwYywgQklPU19DUywgJnJtX2ludDBjKTsKKwlzZXR2ZWN0b3IoMHgwZCwgQklPU19DUywgJnJtX2ludDBkKTsKKwlzZXR2ZWN0b3IoMHgwZSwgQklPU19DUywgJnJtX2ludDBlKTsKKwlzZXR2ZWN0b3IoMHgwZiwgQklPU19DUywgJnJtX2ludDBmKTsKKwlzZXR2ZWN0b3IoMHgxMCwgQklPU19DUywgJnJtX2ludDEwKTsKKwlzZXR2ZWN0b3IoMHgxMSwgQklPU19DUywgJnJtX2ludDExKTsKKwlzZXR2ZWN0b3IoMHgxMiwgQklPU19DUywgJnJtX2ludDEyKTsKKwlzZXR2ZWN0b3IoMHgxMywgQklPU19DUywgJnJtX2ludDEzKTsKKwlzZXR2ZWN0b3IoMHgxNCwgQklPU19DUywgJnJtX2ludDE0KTsKKwlzZXR2ZWN0b3IoMHgxNSwgQklPU19DUywgJnJtX2ludDE1KTsKKwlzZXR2ZWN0b3IoMHgxNiwgQklPU19DUywgJnJtX2ludDE2KTsKKwlzZXR2ZWN0b3IoMHgxNywgQklPU19DUywgJnJtX2ludDE3KTsKKwlzZXR2ZWN0b3IoMHgxOCwgQklPU19DUywgJnJtX2ludDE4KTsKKwlzZXR2ZWN0b3IoMHgxOSwgQklPU19DUywgJnJtX2ludDE5KTsKKwlzZXR2ZWN0b3IoMHgxYSwgQklPU19DUywgJnJtX2ludDFhKTsKKwlzZXR2ZWN0b3IoMHgxYiwgQklPU19DUywgJnJtX2ludDFiKTsKKwlzZXR2ZWN0b3IoMHgxYywgQklPU19DUywgJnJtX2ludDFjKTsKKwlzZXR2ZWN0b3IoMHgxZCwgQklPU19DUywgJnJtX2ludDFkKTsKKwlzZXR2ZWN0b3IoMHgxZSwgQklPU19DUywgJnJtX2ludDFlKTsKKwlzZXR2ZWN0b3IoMHgxZiwgQklPU19DUywgJnJtX2ludDFmKTsKKworCS8qIGZpbGwgaW4gZGF0YSBhcmVhICovCisJcmFtX2luXzY0a2JfY2h1bmtzID0gZ2QtPnJhbV9zaXplID4+IDE2OworCWJpb3NfZXF1aXBtZW50ID0gMDsgLyogRml4TWUgKi8KKwkKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliX2kzODYvYm9hcmQuYyBiL2xpYl9pMzg2L2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzODYwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L2JvYXJkLmMKQEAgLTAsMCArMSw0NDggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQorICogCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKiAKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGRldmljZXMuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzY2FsbC5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPGlkZS5oPgorCitleHRlcm4gbG9uZyBfaTM4NmJvb3Rfc3RhcnQ7CSAgICAKK2V4dGVybiBsb25nIF9pMzg2Ym9vdF9lbmQ7CSAgICAKK2V4dGVybiBsb25nIF9pMzg2Ym9vdF9yb21kYXRhX3N0YXJ0OworZXh0ZXJuIGxvbmcgX2kzODZib290X3JvbWRhdGFfZGVzdDsgCitleHRlcm4gbG9uZyBfaTM4NmJvb3Rfcm9tZGF0YV9zaXplOyAKK2V4dGVybiBsb25nIF9pMzg2Ym9vdF9ic3Nfc3RhcnQ7ICAgCitleHRlcm4gbG9uZyBfaTM4NmJvb3RfYnNzX3NpemU7ICAgIAorCitleHRlcm4gbG9uZyBfaTM4NmJvb3RfcmVhbG1vZGU7ICAgIAorZXh0ZXJuIGxvbmcgX2kzODZib290X3JlYWxtb2RlX3NpemU7CitleHRlcm4gbG9uZyBfaTM4NmJvb3RfYmlvczsgICAgICAgICAKK2V4dGVybiBsb25nIF9pMzg2Ym9vdF9iaW9zX3NpemU7ICAgIAorCisvKiBUaGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0IGJlY29tZXMgcG9pbnRlcnMKKyAqIHdoaWNoIGlzIHNvbWV3aGF0IGluY29udmVpZW50IC4uLiAqLwordWxvbmcgaTM4NmJvb3Rfc3RhcnQgICAgICAgICA9ICh1bG9uZykmX2kzODZib290X3N0YXJ0OyAgICAgICAgIC8qIGNvZGUgc3RhcnQgKGluIGZsYXNoKSBkZWZpbmVkIGluIHN0YXJ0LlMgKi8KK3Vsb25nIGkzODZib290X2VuZCAgICAgICAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9lbmQ7CSAgICAgICAgLyogY29kZSBlbmQgKGluIGZsYXNoKSAqLwordWxvbmcgaTM4NmJvb3Rfcm9tZGF0YV9zdGFydCA9ICh1bG9uZykmX2kzODZib290X3JvbWRhdGFfc3RhcnQ7IC8qIGRhdGFzZWdtZW50IGluIGZsYXNoIChhbHNvIGNvZGUrcm9kYXRhIGVuZCkgKi8KK3Vsb25nIGkzODZib290X3JvbWRhdGFfZGVzdCAgPSAodWxvbmcpJl9pMzg2Ym9vdF9yb21kYXRhX2Rlc3Q7ICAvKiBkYXRhIGxvY2F0aW9uIHNlZ21lbnQgaW4gcmFtICovCit1bG9uZyBpMzg2Ym9vdF9yb21kYXRhX3NpemUgID0gKHVsb25nKSZfaTM4NmJvb3Rfcm9tZGF0YV9zaXplOyAgLyogc2l6ZSBvZiBkYXRhIHNlZ21lbnQgKi8KK3Vsb25nIGkzODZib290X2Jzc19zdGFydCAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9ic3Nfc3RhcnQ7ICAgICAvKiBic3Mgc3RhcnQgKi8KK3Vsb25nIGkzODZib290X2Jzc19zaXplICAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9ic3Nfc2l6ZTsgICAgICAvKiBic3Mgc2l6ZSAqLworCit1bG9uZyBpMzg2Ym9vdF9yZWFsbW9kZSAgICAgID0gKHVsb25nKSZfaTM4NmJvb3RfcmVhbG1vZGU7ICAgICAgLyogc3RhcnQgb2YgcmVhbG1vZGUgZW50cnkgY29kZSAqLwordWxvbmcgaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSA9ICh1bG9uZykmX2kzODZib290X3JlYWxtb2RlX3NpemU7IC8qIHNpemUgb2YgcmVhbG1vZGUgZW50cnkgY29kZSAqLwordWxvbmcgaTM4NmJvb3RfYmlvcyAgICAgICAgICA9ICh1bG9uZykmX2kzODZib290X2Jpb3M7ICAgICAgICAgIC8qIHN0YXJ0IG9mIEJJT1MgZW11bGF0aW9uIGNvZGUgKi8KK3Vsb25nIGkzODZib290X2Jpb3Nfc2l6ZSAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9iaW9zX3NpemU7ICAgICAvKiBzaXplIG9mIEJJT1MgZW11bGF0aW9uIGNvZGUgKi8KKworCitjb25zdCBjaGFyIHZlcnNpb25fc3RyaW5nW10gPQorCVVfQk9PVF9WRVJTSU9OIiAoIiBfX0RBVEVfXyAiIC0gIiBfX1RJTUVfXyAiKSI7CisKKworLyoKKyAqIEJlZ2luIGFuZCBFbmQgb2YgbWVtb3J5IGFyZWEgZm9yIG1hbGxvYygpLCBhbmQgY3VycmVudCAiYnJrIgorICovCitzdGF0aWMgdWxvbmcgbWVtX21hbGxvY19zdGFydCA9IDA7CitzdGF0aWMgdWxvbmcgbWVtX21hbGxvY19lbmQgPSAwOworc3RhdGljIHVsb25nIG1lbV9tYWxsb2NfYnJrID0gMDsKKworc3RhdGljIGludCBtZW1fbWFsbG9jX2luaXQodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKyAgICAgICAgCisjaWYgMQkKKwkvKiBzdGFydCBtYWxsb2MgYXJlYSByaWdodCBhZnRlciB0aGUgc3RhY2sgKi8KKwltZW1fbWFsbG9jX3N0YXJ0ID0gaTM4NmJvb3RfYnNzX3N0YXJ0ICsgCisJCWkzODZib290X2Jzc19zaXplICsgQ0ZHX1NUQUNLX1NJWkU7CisJbWVtX21hbGxvY19zdGFydCA9IChtZW1fbWFsbG9jX3N0YXJ0KzMpJn4zOworI2Vsc2UKKwltZW1fbWFsbG9jX3N0YXJ0ID0gMHg0MDAwMDA7CisjZW5kaWYJCisjaWYgMQorCS8qIFVzZSBhbGwgYXZhaWxhYmxlIFJBTSBmb3IgbWFsbG9jKCkgKi8KKwltZW1fbWFsbG9jX2VuZCA9IGdkLT5yYW1fc2l6ZTsKKyNlbHNlCQorCS8qIFVzZSBvbmx5ICBDT05GSUdfTUFMTE9DX1NJWkUgYnl0ZXMgb2YgUkFNIGZvciBtYWxsb2MoKSAqLworCW1lbV9tYWxsb2NfZW5kID0gbWVtX21hbGxvY19zdGFydCArIENPTkZJR19NQUxMT0NfU0laRTsKKyNlbmRpZgkKKwltZW1fbWFsbG9jX2JyayA9IG1lbV9tYWxsb2Nfc3RhcnQ7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCAqc2JyayAocHRyZGlmZl90IGluY3JlbWVudCkKK3sKKwl1bG9uZyBvbGQgPSBtZW1fbWFsbG9jX2JyazsKKwl1bG9uZyBuZXcgPSBvbGQgKyBpbmNyZW1lbnQ7CisKKwlpZiAoKG5ldyA8IG1lbV9tYWxsb2Nfc3RhcnQpIHx8IChuZXcgPiBtZW1fbWFsbG9jX2VuZCkpIHsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJbWVtX21hbGxvY19icmsgPSBuZXc7CisKKwlyZXR1cm4gKCh2b2lkICopIG9sZCk7Cit9CisKK2NoYXIgKnN0cm1oeiAoY2hhciAqYnVmLCBsb25nIGh6KQoreworCWxvbmcgbCwgbjsKKwlsb25nIG07CisKKwluID0gaHogLyAxMDAwMDAwTDsKKwlsID0gc3ByaW50ZiAoYnVmLCAiJWxkIiwgbik7CisJbSA9IChoeiAlIDEwMDAwMDBMKSAvIDEwMDBMOworCWlmIChtICE9IDApCisJCXNwcmludGYgKGJ1ZiArIGwsICIuJTAzbGQiLCBtKTsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXQgVXRpbGl0aWVzCQkJCQkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvbWUgb2YgdGhpcyBjb2RlIHNob3VsZCBiZSBtb3ZlZCBpbnRvIHRoZSBjb3JlIGZ1bmN0aW9ucywKKyAqIG9yIGRyb3BwZWQgY29tcGxldGVseSwKKyAqIGJ1dCBsZXQncyBnZXQgaXQgd29ya2luZyAoYWdhaW4pIGZpcnN0Li4uCisgKi8KK3N0YXRpYyB2b2lkIHN5c2NhbGxzX2luaXQgKHZvaWQpCit7CisJc3lzY2FsbF90YmxbU1lTQ0FMTF9NQUxMT0NdID0gKHZvaWQgKikgbWFsbG9jOworCXN5c2NhbGxfdGJsW1NZU0NBTExfRlJFRV0gPSAodm9pZCAqKSBmcmVlOworCisJc3lzY2FsbF90YmxbU1lTQ0FMTF9JTlNUQUxMX0hETFJdID0gKHZvaWQgKikgaXJxX2luc3RhbGxfaGFuZGxlcjsKKwlzeXNjYWxsX3RibFtTWVNDQUxMX0ZSRUVfSERMUl0gPSAodm9pZCAqKSBpcnFfZnJlZV9oYW5kbGVyOworCit9CisKK3N0YXRpYyBpbnQgaW5pdF9iYXVkcmF0ZSAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCXVjaGFyIHRtcFs2NF07CS8qIGxvbmcgZW5vdWdoIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKwlpbnQgaSA9IGdldGVudl9yICgiYmF1ZHJhdGUiLCB0bXAsIHNpemVvZiAodG1wKSk7CisKKwlnZC0+YmF1ZHJhdGUgPSAoaSA+IDApCisJCQk/IChpbnQpIHNpbXBsZV9zdHJ0b3VsICh0bXAsIE5VTEwsIDEwKQorCQkJOiBDT05GSUdfQkFVRFJBVEU7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IGRpc3BsYXlfYmFubmVyICh2b2lkKQoreworCisJcHJpbnRmICgiXG5cbiVzXG5cbiIsIHZlcnNpb25fc3RyaW5nKTsKKwlwcmludGYgKCJVLUJvb3QgY29kZTogJTA4bFggLT4gJTA4bFggIGRhdGE6ICUwOGxYIC0+ICUwOGxYXG4iCisJCSIgICAgICAgIEJTUzogJTA4bFggLT4gJTA4bFggc3RhY2s6ICUwOGxYIC0+ICUwOGxYXG4iLAorCQlpMzg2Ym9vdF9zdGFydCwgaTM4NmJvb3Rfcm9tZGF0YV9zdGFydC0xLAorCQlpMzg2Ym9vdF9yb21kYXRhX2Rlc3QsIGkzODZib290X3JvbWRhdGFfZGVzdCtpMzg2Ym9vdF9yb21kYXRhX3NpemUtMSwKKwkJaTM4NmJvb3RfYnNzX3N0YXJ0LCBpMzg2Ym9vdF9ic3Nfc3RhcnQraTM4NmJvb3RfYnNzX3NpemUtMSwKKwkJaTM4NmJvb3RfYnNzX3N0YXJ0K2kzODZib290X2Jzc19zaXplLCAKKwkJaTM4NmJvb3RfYnNzX3N0YXJ0K2kzODZib290X2Jzc19zaXplK0NGR19TVEFDS19TSVpFLTEpOworCQorCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFdBUk5JTkc6IHRoaXMgY29kZSBsb29rcyAiY2xlYW5lciIgdGhhbiB0aGUgUG93ZXJQQyB2ZXJzaW9uLCBidXQKKyAqIGhhcyB0aGUgZGlzYWR2YW50YWdlIHRoYXQgeW91IGVpdGhlciBnZXQgbm90aGluZywgb3IgZXZlcnl0aGluZy4KKyAqIE9uIFBvd2VyUEMsIHlvdSBtaWdodCBzZWUgIkRSQU06ICIgYmVmb3JlIHRoZSBzeXN0ZW0gaGFuZ3MgLSB3aGljaAorICogZ2l2ZXMgYSBzaW1wbGUgeWV0IGNsZWFyIGluZGljYXRpb24gd2hpY2ggcGFydCBvZiB0aGUKKyAqIGluaXRpYWxpemF0aW9uIGlmIGZhaWxpbmcuCisgKi8KK3N0YXRpYyBpbnQgZGlzcGxheV9kcmFtX2NvbmZpZyAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwlpbnQgaTsKKworCXB1dHMgKCJEUkFNIENvbmZpZ3VyYXRpb246XG4iKTsKKworCWZvciAoaT0wOyBpPENPTkZJR19OUl9EUkFNX0JBTktTOyBpKyspIHsKKwkJcHJpbnRmICgiQmFuayAjJWQ6ICUwOGx4ICIsIGksIGdkLT5iZC0+YmlfZHJhbVtpXS5zdGFydCk7CisJCXByaW50X3NpemUgKGdkLT5iZC0+YmlfZHJhbVtpXS5zaXplLCAiXG4iKTsKKwl9CisJCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheV9mbGFzaF9jb25maWcgKHVsb25nIHNpemUpCit7CisJcHV0cyAoIkZsYXNoOiAiKTsKKwlwcmludF9zaXplIChzaXplLCAiXG4iKTsKK30KKworCisKKy8qCisgKiBCcmVhdGggc29tZSBsaWZlIGludG8gdGhlIGJvYXJkLi4uCisgKgorICogSW5pdGlhbGl6ZSBhbiBTTUMgZm9yIHNlcmlhbCBjb21tcywgYW5kIGNhcnJ5IG91dCBzb21lIGhhcmR3YXJlCisgKiB0ZXN0cy4KKyAqCisgKiBUaGUgZmlyc3QgcGFydCBvZiBpbml0aWFsaXphdGlvbiBpcyBydW5uaW5nIGZyb20gRmxhc2ggbWVtb3J5OworICogaXRzIG1haW4gcHVycG9zZSBpcyB0byBpbml0aWFsaXplIHRoZSBSQU0gc28gdGhhdCB3ZQorICogY2FuIHJlbG9jYXRlIHRoZSBtb25pdG9yIGNvZGUgdG8gUkFNLgorICovCisKKy8qCisgKiBBbGwgYXR0ZW1wdHMgdG8gY29tZSB1cCB3aXRoIGEgImNvbW1vbiIgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UKKyAqIHRoYXQgd29ya3MgZm9yIGFsbCBib2FyZHMgYW5kIGFyY2hpdGVjdHVyZXMgZmFpbGVkOiBzb21lIG9mIHRoZQorICogcmVxdWlyZW1lbnRzIGFyZSBqdXN0IF90b29fIGRpZmZlcmVudC4gVG8gZ2V0IHJpZCBvZiB0aGUgcmVzdWx0aW5nCisgKiBtZXNzIG9mIGJvYXJkIGRlcGVuZGVuZCAjaWZkZWYnZWQgY29kZSB3ZSBub3cgbWFrZSB0aGUgd2hvbGUKKyAqIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGNvbmZpZ3VyYWJsZSB0byB0aGUgdXNlci4KKyAqCisgKiBUaGUgcmVxdWlyZW1lbnRzIGZvciBhbnkgbmV3IGluaXRhbGl6YXRpb24gZnVuY3Rpb24gaXMgc2ltcGxlOiBpdAorICogcmVjZWl2ZXMgYSBwb2ludGVyIHRvIHRoZSAiZ2xvYmFsIGRhdGEiIHN0cnVjdHVyZSBhcyBpdCdzIG9ubHkKKyAqIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBpbnRlZ2VyIHJldHVybiBjb2RlLCB3aGVyZSAwIG1lYW5zCisgKiAiY29udGludWUiIGFuZCAhPSAwIG1lYW5zICJmYXRhbCBlcnJvciwgaGFuZyB0aGUgc3lzdGVtIi4KKyAqLwordHlwZWRlZiBpbnQgKGluaXRfZm5jX3QpICh2b2lkKTsKKworaW5pdF9mbmNfdCAqaW5pdF9zZXF1ZW5jZVtdID0geworCWNwdV9pbml0LAkJLyogYmFzaWMgY3B1IGRlcGVuZGVudCBzZXR1cCAqLworCWJvYXJkX2luaXQsCQkvKiBiYXNpYyBib2FyZCBkZXBlbmRlbnQgc2V0dXAgKi8KKwlkcmFtX2luaXQsCQkvKiBjb25maWd1cmUgYXZhaWxhYmxlIFJBTSBiYW5rcyAqLworCW1lbV9tYWxsb2NfaW5pdCwgICAgICAgIC8qIGRlcGVuZGFudCBvbiBkcmFtX2luaXQgKi8KKwlpbnRlcnJ1cHRfaW5pdCwJCS8qIHNldCB1cCBleGNlcHRpb25zICovCisJdGltZXJfaW5pdCwJCisJZW52X2luaXQsCQkvKiBpbml0aWFsaXplIGVudmlyb25tZW50ICovCisJaW5pdF9iYXVkcmF0ZSwJCS8qIGluaXRpYWx6ZSBiYXVkcmF0ZSBzZXR0aW5ncyAqLworCXNlcmlhbF9pbml0LAkJLyogc2VyaWFsIGNvbW11bmljYXRpb25zIHNldHVwICovCisJZGlzcGxheV9iYW5uZXIsCisJZGlzcGxheV9kcmFtX2NvbmZpZywKKworCU5VTEwsCit9OworCitnZF90ICpnbG9iYWxfZGF0YTsKKwordm9pZCBzdGFydF9pMzg2Ym9vdCAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwljaGFyICpzOworCWludCBpOworCXVsb25nIHNpemU7CisJc3RhdGljIGdkX3QgZ2RfZGF0YTsKKwlzdGF0aWMgYmRfdCBiZF9kYXRhOworCWluaXRfZm5jX3QgKippbml0X2ZuY19wdHI7CisJCisJc2hvd19ib290X3Byb2dyZXNzKDB4MjEpOworCisJZ2QgPSBnbG9iYWxfZGF0YSA9ICZnZF9kYXRhOworCQorCW1lbXNldCAoZ2QsIDAsIHNpemVvZiAoZ2RfdCkpOworCWdkLT5iZCA9ICZiZF9kYXRhOworCW1lbXNldCAoZ2QtPmJkLCAwLCBzaXplb2YgKGJkX3QpKTsKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyMik7CisKKwkKKwlmb3IgKGluaXRfZm5jX3B0ciA9IGluaXRfc2VxdWVuY2UsIGk9MDsgKmluaXRfZm5jX3B0cjsgKytpbml0X2ZuY19wdHIsIGkrKykgeworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MoMHhhMTMwfGkpOworCisJCWlmICgoKmluaXRfZm5jX3B0cikoKSAhPSAwKSB7CisJCQloYW5nICgpOworCQl9CisJfQorCXNob3dfYm9vdF9wcm9ncmVzcygweDIzKTsKKworCS8qIGNvbmZpZ3VyZSBhdmFpbGFibGUgRkxBU0ggYmFua3MgKi8KKwlzaXplID0gZmxhc2hfaW5pdCgpOworCWRpc3BsYXlfZmxhc2hfY29uZmlnKHNpemUpOworCXNob3dfYm9vdF9wcm9ncmVzcygweDI0KTsKKworCXNob3dfYm9vdF9wcm9ncmVzcygweDI1KTsKKworCS8qIGluaXRpYWxpemUgZW52aXJvbm1lbnQgKi8KKwllbnZfcmVsb2NhdGUgKCk7CisJc2hvd19ib290X3Byb2dyZXNzKDB4MjYpOworCisKKwkvKiBJUCBBZGRyZXNzICovCisJYmRfZGF0YS5iaV9pcF9hZGRyID0gZ2V0ZW52X0lQYWRkciAoImlwYWRkciIpOworCisJLyogTUFDIEFkZHJlc3MgKi8KKwl7CisJCWludCBpOworCQl1bG9uZyByZWc7CisJCWNoYXIgKnMsICplOworCQl1Y2hhciB0bXBbNjRdOworCisJCWkgPSBnZXRlbnZfciAoImV0aGFkZHIiLCB0bXAsIHNpemVvZiAodG1wKSk7CisJCXMgPSAoaSA+IDApID8gdG1wIDogTlVMTDsKKworCQlmb3IgKHJlZyA9IDA7IHJlZyA8IDY7ICsrcmVnKSB7CisJCQliZF9kYXRhLmJpX2VuZXRhZGRyW3JlZ10gPSBzID8gc2ltcGxlX3N0cnRvdWwgKHMsICZlLCAxNikgOiAwOworCQkJaWYgKHMpCisJCQkJcyA9ICgqZSkgPyBlICsgMSA6IGU7CisJCX0KKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLyoKKwkgKiBEbyBwY2kgY29uZmlndXJhdGlvbgorCSAqLworCXBjaV9pbml0KCk7CisjZW5kaWYKKworCXNob3dfYm9vdF9wcm9ncmVzcygweDI3KTsKKworCisJZGV2aWNlc19pbml0ICgpOworCisJLyogYWxsb2NhdGUgc3lzY2FsbHMgdGFibGUgKGNvbnNvbGVfaW5pdF9yIHdpbGwgZmlsbCBpdCBpbiAqLworCXN5c2NhbGxfdGJsID0gKHZvaWQgKiopIG1hbGxvYyAoTlJfU1lTQ0FMTFMgKiBzaXplb2YgKHZvaWQgKikpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY29uc29sZSAoYWZ0ZXIgdGhlIHJlbG9jYXRpb24gYW5kIGRldmljZXMgaW5pdCkgKi8KKwljb25zb2xlX2luaXRfcigpOworCXN5c2NhbGxzX2luaXQoKTsKKworI2lmZGVmIENPTkZJR19NSVNDX0lOSVRfUgorCS8qIG1pc2NlbGxhbmVvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGluaXRpYWxpc2F0aW9ucyAqLworCW1pc2NfaW5pdF9yKCk7CisjZW5kaWYKKworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiAoMCkKKwlXQVRDSERPR19SRVNFVCgpOworIyBpZmRlZiBERUJVRworCXB1dHMgKCJSZXNldCBFdGhlcm5ldCBQSFlcbiIpOworIyBlbmRpZgorCXJlc2V0X3BoeSgpOworI2VuZGlmCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpICYmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisJV0FUQ0hET0dfUkVTRVQoKTsKKwlwdXRzICgiUENNQ0lBOiIpOworCXBjbWNpYV9pbml0KCk7CisjZW5kaWYKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisJV0FUQ0hET0dfUkVTRVQoKTsKKwlwdXRzKCJLR0RCOiAgIik7CisJa2dkYl9pbml0KCk7CisjZW5kaWYKKworCS8qIGVuYWJsZSBleGNlcHRpb25zICovCisJZW5hYmxlX2ludGVycnVwdHMgKCk7CisJc2hvd19ib290X3Byb2dyZXNzKDB4MjgpOworCisJLyogTXVzdCBoYXBwZW4gYWZ0ZXIgaW50ZXJydXB0cyBhcmUgaW5pdGlhbGl6ZWQgc2luY2UKKwkgKiBhbiBpcnEgaGFuZGxlciBnZXRzIGluc3RhbGxlZAorCSAqLworI2lmZGVmIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTworCXNlcmlhbF9idWZmZXJlZF9pbml0KCk7CisjZW5kaWYKKyAgICAKKyNpZmRlZiBDT05GSUdfU1RBVFVTX0xFRAorCXN0YXR1c19sZWRfc2V0IChTVEFUVVNfTEVEX0JPT1QsIFNUQVRVU19MRURfQkxJTktJTkcpOworI2VuZGlmCisKKwl1ZGVsYXkgKDIwKTsKKworCXNldF90aW1lciAoMCk7CisKKwkvKiBJbml0aWFsaXplIGZyb20gZW52aXJvbm1lbnQgKi8KKwlpZiAoKHMgPSBnZXRlbnYgKCJsb2FkYWRkciIpKSAhPSBOVUxMKSB7CisJCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxNik7CisJfQorI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKwlpZiAoKHMgPSBnZXRlbnYgKCJib290ZmlsZSIpKSAhPSBOVUxMKSB7CisJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBzLCBzaXplb2YgKEJvb3RGaWxlKSk7CisJfQorI2VuZGlmIC8qIENGR19DTURfTkVUICovCisKKwlXQVRDSERPR19SRVNFVCgpOworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorCVdBVENIRE9HX1JFU0VUKCk7CisJcHV0cygiSURFOiAgICIpOworCWlkZV9pbml0KCk7CisjZW5kaWYgLyogQ0ZHX0NNRF9JREUgKi8KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCisJV0FUQ0hET0dfUkVTRVQoKTsKKwlwdXRzKCJTQ1NJOiAgIik7CisJc2NzaV9pbml0KCk7CisjZW5kaWYKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKwlXQVRDSERPR19SRVNFVCgpOworCXB1dHMgKCJET0M6ICAgIik7CisJZG9jX2luaXQoKTsKKyNlbmRpZgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCisJV0FUQ0hET0dfUkVTRVQoKTsKKwlwdXRzKCJOZXQ6ICAgIik7CisJZXRoX2luaXRpYWxpemUoZ2QtPmJkKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAorCVdBVENIRE9HX1JFU0VUKCk7CisJLyoKKwkgKiBTb21lIHBhcnRzIGNhbiBiZSBvbmx5IGluaXRpYWxpemVkIGlmIGFsbCBvdGhlcnMgKGxpa2UKKwkgKiBJbnRlcnJ1cHRzKSBhcmUgdXAgYW5kIHJ1bm5pbmcgKGkuZS4gdGhlIFBDLXN0eWxlIElTQQorCSAqIGtleWJvYXJkKS4KKwkgKi8KKwlsYXN0X3N0YWdlX2luaXQoKTsKKyNlbmRpZgorCisKKworI2lmZGVmIENPTkZJR19QT1NUCisJcG9zdF9ydW4gKE5VTEwsIFBPU1RfUkFNIHwgcG9zdF9ib290bW9kZV9nZXQoMCkpOworCWlmIChwb3N0X2Jvb3Rtb2RlX2dldCgwKSAmIFBPU1RfUE9XRVJGQUlMKSB7CisJCXBvc3RfYm9vdG1vZGVfY2xlYXIoKTsKKwkJYm9hcmRfcG93ZXJvZmYoKTsKKwl9CisjZW5kaWYKKworCXNob3dfYm9vdF9wcm9ncmVzcygweDI5KTsKKwkKKwkvKiBtYWluX2xvb3AoKSBjYW4gcmV0dXJuIHRvIHJldHJ5IGF1dG9ib290LCBpZiBzbyBqdXN0IHJ1biBpdCBhZ2Fpbi4gKi8KKwlmb3IgKDs7KSB7CisJCW1haW5fbG9vcCAoKTsKKwl9CisKKwkvKiBOT1RSRUFDSEVEIC0gbm8gd2F5IG91dCBvZiBjb21tYW5kIGxvb3AgZXhjZXB0IGJvb3RpbmcgKi8KK30KKwordm9pZCBoYW5nICh2b2lkKQoreworCXB1dHMgKCIjIyMgRVJST1IgIyMjIFBsZWFzZSBSRVNFVCB0aGUgYm9hcmQgIyMjXG4iKTsKKwlmb3IgKDs7KTsKK30KKworCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9pMzg2X2xpbnV4LmMgYi9saWJfaTM4Ni9pMzg2X2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3YTBkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L2kzODZfbGludXguYwpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBFcmlrIE1vdXcgKEouQS5LLk1vdXdAaXRzLnR1ZGVsZnQubmwpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNtZF9ib290Lmg+CisjaW5jbHVkZSA8aW1hZ2UuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS96aW1hZ2UuaD4KKworCitleHRlcm4gaW1hZ2VfaGVhZGVyX3QgaGVhZGVyOyAgICAgICAgICAgLyogZnJvbSBjbWRfYm9vdG0uYyAqLworCisKK2ltYWdlX2hlYWRlcl90ICpmYWtlX2hlYWRlcihpbWFnZV9oZWFkZXJfdCAqaGRyLCB2b2lkICpwdHIsIGludCBzaXplKQoreworCS8qIHRyeSBlYWNoIHN1cHBvcnRlZCBpbWFnZSB0eXBlIGluIG9yZGVyICovCisJaWYgKE5VTEwgIT0gZmFrZV96aW1hZ2VfaGVhZGVyKGhkciwgcHRyLCBzaXplKSkgeworCQlyZXR1cm4gaGRyOworCX0KKwkKKwlyZXR1cm4gTlVMTDsKK30KKworCit2b2lkIGRvX2Jvb3RtX2xpbnV4KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdLAorCQl1bG9uZyBhZGRyLCB1bG9uZyAqbGVuX3B0ciwgaW50ICAgdmVyaWZ5KQoreworCXVsb25nIGJhc2VfcHRyOworCQorCXVsb25nIGxlbiA9IDAsIGNoZWNrc3VtOworCXVsb25nIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZDsKKwl1bG9uZyBkYXRhOworCWltYWdlX2hlYWRlcl90ICpoZHIgPSAmaGVhZGVyOworCQorCS8qCisJICogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gaW5pdHJkIGltYWdlCisJICovCisJaWYgKGFyZ2MgPj0gMykgeworCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCQkKKwkJcHJpbnRmICgiIyMgTG9hZGluZyBSYW1kaXNrIEltYWdlIGF0ICUwOGx4IC4uLlxuIiwgYWRkcik7CisJCQorCQkvKiBDb3B5IGhlYWRlciBzbyB3ZSBjYW4gYmxhbmsgQ1JDIGZpZWxkIGZvciByZS1jYWxjdWxhdGlvbiAqLworCQltZW1jcHkgKCZoZWFkZXIsIChjaGFyICopYWRkciwgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSk7CisJCQorCQlpZiAobnRvaGwoaGRyLT5paF9tYWdpYykgIT0gSUhfTUFHSUMpIHsKKwkJCXByaW50ZiAoIkJhZCBNYWdpYyBOdW1iZXJcbiIpOworCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwkJfQorCQkKKwkJZGF0YSA9ICh1bG9uZykmaGVhZGVyOworCQlsZW4gID0gc2l6ZW9mKGltYWdlX2hlYWRlcl90KTsKKwkJCisJCWNoZWNrc3VtID0gbnRvaGwoaGRyLT5paF9oY3JjKTsKKwkJaGRyLT5paF9oY3JjID0gMDsKKwkJCisJCWlmIChjcmMzMiAoMCwgKGNoYXIgKilkYXRhLCBsZW4pICE9IGNoZWNrc3VtKSB7CisJCQlwcmludGYgKCJCYWQgSGVhZGVyIENoZWNrc3VtXG4iKTsKKwkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJCX0KKwkJCisJCXByaW50X2ltYWdlX2hkciAoaGRyKTsKKwkJCisJCWRhdGEgPSBhZGRyICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KTsKKwkJbGVuICA9IG50b2hsKGhkci0+aWhfc2l6ZSk7CisJCQorCQlpZiAodmVyaWZ5KSB7CisJCQl1bG9uZyBjc3VtID0gMDsKKwkJCQorCQkJcHJpbnRmICgiICAgVmVyaWZ5aW5nIENoZWNrc3VtIC4uLiAiKTsKKwkJCWNzdW0gPSBjcmMzMiAoMCwgKGNoYXIgKilkYXRhLCBsZW4pOworCQkJaWYgKGNzdW0gIT0gbnRvaGwoaGRyLT5paF9kY3JjKSkgeworCQkJCXByaW50ZiAoIkJhZCBEYXRhIENSQ1xuIik7CisJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwkJCX0KKwkJCXByaW50ZiAoIk9LXG4iKTsKKwkJfQorCQkKKwkJaWYgKChoZHItPmloX29zICAgIT0gSUhfT1NfTElOVVgpCXx8CisJCSAgICAoaGRyLT5paF9hcmNoICE9IElIX0NQVV9JMzg2KQl8fAorCQkgICAgKGhkci0+aWhfdHlwZSAhPSBJSF9UWVBFX1JBTURJU0spCSkgeworCQkJcHJpbnRmICgiTm8gTGludXggaTM4NiBSYW1kaXNrIEltYWdlXG4iKTsKKwkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJCX0KKwkJCisJCS8qCisJCSAqIE5vdyBjaGVjayBpZiB3ZSBoYXZlIGEgbXVsdGlmaWxlIGltYWdlCisJCSAqLworCX0gZWxzZSBpZiAoKGhkci0+aWhfdHlwZT09SUhfVFlQRV9NVUxUSSkgJiYgKGxlbl9wdHJbMV0pKSB7CisJCXVsb25nIHRhaWwgICAgPSBudG9obChsZW5fcHRyWzBdKSAlIDQ7CisJCWludCBpOworCQkKKwkJLyogc2tpcCBrZXJuZWwgbGVuZ3RoIGFuZCB0ZXJtaW5hdG9yICovCisJCWRhdGEgPSAodWxvbmcpKCZsZW5fcHRyWzJdKTsKKwkJLyogc2tpcCBhbnkgYWRkaXRpb25hbCBpbWFnZSBsZW5ndGggZmllbGRzICovCisJCWZvciAoaT0xOyBsZW5fcHRyW2ldOyArK2kpCisJCQlkYXRhICs9IDQ7CisJCS8qIGFkZCBrZXJuZWwgbGVuZ3RoLCBhbmQgYWxpZ24gKi8KKwkJZGF0YSArPSBudG9obChsZW5fcHRyWzBdKTsKKwkJaWYgKHRhaWwpIHsKKwkJCWRhdGEgKz0gNCAtIHRhaWw7CisJCX0KKwkJCisJCWxlbiAgID0gbnRvaGwobGVuX3B0clsxXSk7CisJCQorCX0gZWxzZSB7CisJCS8qCisJCSAqIG5vIGluaXRyZCBpbWFnZQorCQkgKi8KKwkJZGF0YSA9IDA7CisJfQorCQorI2lmZGVmCURFQlVHCisJaWYgKCFkYXRhKSB7CisJCXByaW50ZiAoIk5vIGluaXRyZFxuIik7CisJfQorI2VuZGlmCisJCisJaWYgKGRhdGEpIHsKKwkJaW5pdHJkX3N0YXJ0ID0gZGF0YTsKKwkJaW5pdHJkX2VuZCAgID0gaW5pdHJkX3N0YXJ0ICsgbGVuOworCQlwcmludGYgKCIgICBMb2FkaW5nIFJhbWRpc2sgdG8gJTA4bHgsIGVuZCAlMDhseCAuLi4gIiwKKwkJCWluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCk7CisJCW1lbW1vdmUgKCh2b2lkICopaW5pdHJkX3N0YXJ0LCAodm9pZCAqKWRhdGEsIGxlbik7CisJCXByaW50ZiAoIk9LXG4iKTsKKwl9IGVsc2UgeworCQlpbml0cmRfc3RhcnQgPSAwOworCQlpbml0cmRfZW5kID0gMDsKKwl9CisJCisJYmFzZV9wdHIgPSBsb2FkX3ppbWFnZShhZGRyICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSwgbnRvaGwoaGRyLT5paF9zaXplKSwgCisJCQkgICAgICAgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kLWluaXRyZF9zdGFydCwgMCk7CisKKwlpZiAoTlVMTCA9PSBiYXNlX3B0cikgeworCQlwcmludGYgKCIjIyBLZXJuZWwgbG9hZGluZyBmYWlsZWQgLi4uXG4iKTsKKwkJZG9fcmVzZXQoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOworCQkKKwl9CisJCQorI2lmZGVmIERFQlVHCisJcHJpbnRmICgiIyMgVHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gTGludXggKGF0IGFkZHJlc3MgJTA4eCkgLi4uXG4iLAorCQkodTMyKWJhc2VfcHRyKTsKKyNlbmRpZgorCQkKKwkvKiB3ZSBhc3N1bWUgdGhhdCB0aGUga2VybmVsIGlzIGluIHBsYWNlICovCisJcHJpbnRmKCJcblN0YXJ0aW5nIGtlcm5lbCAuLi5cblxuIik7CisJCQorCWJvb3RfemltYWdlKGJhc2VfcHRyKTsKKwkKK30KKworCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9pYy9hbGk1MTJ4LmMgYi9saWJfaTM4Ni9pYy9hbGk1MTJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNzA5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L2ljL2FsaTUxMnguYwpAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIgPGRhbmllbEBvbWljcm9uLnNlPi4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQmFzZWQgb24gc2M1MjBjZHAuYyBmcm9tIHJvbG8gMS42OgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMgR21iSAorICogS2xlaW4tV2ludGVybmhlaW0sIEdlcm1hbnkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaWMvYWxpNTEyeC5oPgorCisKKy8qIEFMSSBNNTEyMyBMb2dpY2FsIGRldmljZSBudW1iZXJzOgorICogMCBGREMKKyAqIDEgdW51c2VkPworICogMiB1bnVzZWQ/CisgKiAzIGxwdAorICogNCBVQVJUMQorICogNSBVQVJUMgorICogNiBSVEMKKyAqIDcgbW91c2Uva2JkCisgKiA4IENJTworICovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU29tZSBhY2Nlc3MgcHJpbWl0aXZlcyBmb3IgdGhlIEFMaSBjaGlwOiAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworc3RhdGljIHZvaWQgYWxpX3dyaXRlKHU4IGluZGV4LCB1OCB2YWx1ZSkKK3sJCisJLyogd3JpdGUgYW4gYXJiaXJhcnkgcmVnaXN0ZXIgKi8KKwlvdXRiKGluZGV4LCBBTElfSU5ERVgpOworCW91dGIodmFsdWUsIEFMSV9EQVRBKTsKK30KKworc3RhdGljIGludCBhbGlfcmVhZCh1OCBpbmRleCkKK3sKKwlvdXRiKGluZGV4LCBBTElfSU5ERVgpOworCXJldHVybiBpbmIoQUxJX0RBVEEpOworfQorCisjZGVmaW5lIEFMSV9PUEVOKCkgXAorCW91dGIoMHg1MSwgQUxJX0RBVEEpOyBcCisJb3V0YigweDIzLCBBTElfREFUQSkJCisKKworI2RlZmluZSBBTElfQ0xPU0UoKSBcCisJb3V0YigweGJiLCBBTElfREFUQSkKKworLyogU2VsZWN0IGEgbG9naWNhbCBkZXZpY2UgKi8KKyNkZWZpbmUgQUxJX1NFTERFVihkZXYpCVwKKwlhbGlfd3JpdGUoMHgwNywgZGV2KQkKKworCit2b2lkIGFsaTUxMnhfaW5pdCh2b2lkKQoreworCUFMSV9PUEVOKCk7CisKKwlhbGlfd3JpdGUoMHgwMiwgMHgwMSk7CS8qIHNvZnQgcmVzZXQgKi8KKwlhbGlfd3JpdGUoMHgwMywgMHgwMyk7CS8qIGRpc2FibGUgYWNjZXNzIHRvIENJT3MgKi8KKwlhbGlfd3JpdGUoMHgyMiwgMHgwMCk7CS8qIGRpc2FibGUgZGlyZWN0IHBvd2VyZG93biAqLworCWFsaV93cml0ZSgweDIzLCAweDAwKTsJLyogZGlzYWJsZSBhdXRvIHBvd2VyZG93biAqLworCWFsaV93cml0ZSgweDI0LCAweDAwKTsJLyogSVIgOCBpcyBhY3RpdmUgaGksIHBpbjI2IGlzIFBESVIgKi8KKworCUFMSV9DTE9TRSgpOworfQorCit2b2lkIGFsaTUxMnhfc2V0X2ZkYyhpbnQgZW5hYmxlZCwgdTE2IGlvLCB1OCBpcnEsIHU4IGRtYV9jaGFubmVsKQoreworCUFMSV9PUEVOKCk7CisJQUxJX1NFTERFVigwKTsKKwkKKwlhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOworCWlmIChlbmFibGVkKSB7CisJCWFsaV93cml0ZSgweDYwLCBpbyA+PiA4KTsKKwkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CisJCWFsaV93cml0ZSgweDcwLCBpcnEpOworCQlhbGlfd3JpdGUoMHg3NCwgZG1hX2NoYW5uZWwpOworCQkKKwkJLyogQVQgbW9kZSwgbm8gZHJpdmUgc3dhcCAqLworCQlhbGlfd3JpdGUoMHhmMCwgMHgwOCk7CisJCWFsaV93cml0ZSgweGYxLCAweDAwKTsKKwkJYWxpX3dyaXRlKDB4ZjIsIDB4ZmYpOworCQlhbGlfd3JpdGUoMHhmNCwgMHgwMCk7CisJfQorCUFMSV9DTE9TRSgpOworfQorCisKK3ZvaWQgYWxpNTEyeF9zZXRfcHAoaW50IGVuYWJsZWQsIHUxNiBpbywgdTggaXJxLCB1OCBkbWFfY2hhbm5lbCkKK3sKKwlBTElfT1BFTigpOworCUFMSV9TRUxERVYoMyk7CisJCisJYWxpX3dyaXRlKDB4MzAsIGVuYWJsZWQ/MTowKTsKKwlpZiAoZW5hYmxlZCkgeworCQlhbGlfd3JpdGUoMHg2MCwgaW8gPj4gOCk7CisJCWFsaV93cml0ZSgweDYxLCBpbyAmIDB4ZmYpOworCQlhbGlfd3JpdGUoMHg3MCwgaXJxKTsKKwkJYWxpX3dyaXRlKDB4NzQsIGRtYV9jaGFubmVsKTsKKwkJCisJCS8qIG1vZGU6IEVQUCAxLjksIEVDUCBGSUZPIHRocmVzaG9sZCA9IDcsIElSUSBhY3RpdmUgbG93ICovCisJCWFsaV93cml0ZSgweGYwLCAweGJjKTsKKwkJLyogMTIgTUh6LCBCdXJzdCBETUEgaW4gRUNQICovCisJCWFsaV93cml0ZSgweGYxLCAweDA1KTsKKwl9CisJQUxJX0NMT1NFKCk7CisKK30KKwordm9pZCBhbGk1MTJ4X3NldF91YXJ0KGludCBlbmFibGVkLCBpbnQgaW5kZXgsIHUxNiBpbywgdTggaXJxKQoreworCUFMSV9PUEVOKCk7CisJQUxJX1NFTERFVihpbmRleD81OjQpOworCQorCWFsaV93cml0ZSgweDMwLCBlbmFibGVkPzE6MCk7CisJaWYgKGVuYWJsZWQpIHsKKwkJYWxpX3dyaXRlKDB4NjAsIGlvID4+IDgpOworCQlhbGlfd3JpdGUoMHg2MSwgaW8gJiAweGZmKTsKKwkJYWxpX3dyaXRlKDB4NzAsIGlycSk7CisJCQorCQlhbGlfd3JpdGUoMHhmMCwgMHgwMCk7CisJCWFsaV93cml0ZSgweGYxLCAweDAwKTsKKwkJCisJCS8qIGh1aD8gd3JpdGUgMHhmMiB0d2ljZSAtIGEgdHlwbyBpbiByb2xvCisJCSAqIG9yIHNvbWUgc2VjcmV0IGFsaSBlcnJhdGE/IFdobyBrbm93cz8gCisJCSAqLworCQlpZiAoaW5kZXgpIHsKKwkJCWFsaV93cml0ZSgweGYyLCAweDAwKTsKKwkJfQorCQlhbGlfd3JpdGUoMHhmMiwgMHgwYyk7CisJfQorCUFMSV9DTE9TRSgpOworCit9CisKK3ZvaWQgYWxpNTEyeF9zZXRfdWFydDJfaXJkYShpbnQgZW5hYmxlZCkKK3sKKwlBTElfT1BFTigpOworCUFMSV9TRUxERVYoNSk7CisJCisJYWxpX3dyaXRlKDB4ZjEsIGVuYWJsZWQ/MHg0ODoweDAwKTsgLyogZnVsbGR1cGxleCBJckRhICovCisJQUxJX0NMT1NFKCk7CisKK30KKwordm9pZCBhbGk1MTJ4X3NldF9ydGMoaW50IGVuYWJsZWQsIHUxNiBpbywgdTggaXJxKQoreworCUFMSV9PUEVOKCk7CisJQUxJX1NFTERFVig2KTsKKwkKKwlhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOworCWlmIChlbmFibGVkKSB7CisJCWFsaV93cml0ZSgweDYwLCBpbyA+PiA4KTsKKwkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CisJCWFsaV93cml0ZSgweDcwLCBpcnEpOworCisJCWFsaV93cml0ZSgweGYwLCAweDAwKTsKKwl9CisJQUxJX0NMT1NFKCk7Cit9CisKK3ZvaWQgYWxpNTEyeF9zZXRfa2JjKGludCBlbmFibGVkLCB1OCBrYmNfaXJxLCB1OCBtb3VzZV9pcnEpCit7CisJQUxJX09QRU4oKTsKKwlBTElfU0VMREVWKDcpOworCQorCWFsaV93cml0ZSgweDMwLCBlbmFibGVkPzE6MCk7CisJaWYgKGVuYWJsZWQpIHsKKwkJYWxpX3dyaXRlKDB4NzAsIGtiY19pcnEpOworCQlhbGlfd3JpdGUoMHg3MiwgbW91c2VfaXJxKTsJCQorCQkKKwkJYWxpX3dyaXRlKDB4ZjAsIDB4MDApOworCX0KKwlBTElfQ0xPU0UoKTsKK30KKworCisvKiBDb21tb24gSS9PCisgKiAKKyAqIChUaGlzIGRlc2NyaXBvdHNpb24gaXMgYmFzZSBvbiBzZXZlcmFsIGluY29tcGV0ZSBzb3VyY2VzCisgKiAgc2luY2UgSSBoYXZlIG5vdCBiZWVuIGFibGUgdG8gb2J0YWluIGFueSBkYXRhc2hlZXQgZm9yIHRoZSBkZXZpY2UKKyAqICB0aGVyZSBtYXkgYmUgc29tZSBtaXMtdW5kZXJzdGFuZGluZ3MgYnVycmllZCBpbiBoZXJlLiAKKyAqICAtLSBEYW5pZWwgZGFuaWVsQG9taWNyb24uc2UpCisgKiAKKyAqIFRoZXJlIGFyZSAyMiBDSU8gcGlucyBudW1iZXJlZAorICogMTAtMTcKKyAqIDIwLTI1CisgKiAzMC0zNworICogCisgKiAyMC0yNCBhcmUgZGVkaWNhdGVkIENJTyBwaW5zLCB0aGUgb3RoZXIgMTcgYXJlIG11bGlwbGV4ZWQgd2l0aAorICogb3RoZXIgZnVuY3Rpb25zLgorICogCisgKiAgICAgICAgICAgU2Vjb25kYXJ5IAorICogQ0lPIFBpbiAgIEZ1bmN0aW9uICAgIERlY3JpcHRpb24KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENJTzEwICAgICBJUlFJTjEgICAgICBJbnRlcnJ1cHQgaW5wdXQgMT8KKyAqIENJTzExICAgICBJUlFJTjIgICAgICBJbnRlcnJ1cHQgaW5wdXQgMj8KKyAqIENJTzEyICAgICBJUlJYICAgICAgICBJckRhIFJlY2VpdmUKKyAqIENJTzEzICAgICBJUlRYICAgICAgICBJckRhIFRyYW5zbWl0CisgKiBDSU8xNCAgICAgUDIxICAgICAgICAgS0JDIFAyMSBmdWNudGlvbgorICogQ0lPMTUgICAgIFAyMCAgICAgICAgIEtCQyBQMjEgZnVjbnRpb24KKyAqIENJTzE2ICAgICBJMkNfQ0xLICAgICBJMkMgQ2xvY2sKKyAqIENJTzE3ICAgICBJMkNfREFUICAgICBJMkMgRGF0YQorICogCisgKiBDSU8yMCAgICAgLQorICogQ0lPMjEgICAgIC0KKyAqIENJTzIyICAgICAtCisgKiBDSU8yMyAgICAgLQorICogQ0lPMjQgICAgIC0KKyAqIENJTzI1ICAgICBMT0NLICAgICAgICBLZXlsb2NrCisgKiAKKyAqIENJTzMwICAgICBLQkNfQ0xLICAgICBLZXliYW9yZCBDbG9jaworICogQ0lPMzEgICAgIENTMEogICAgICAgIEdlbmVyYWwgQ2hpcCBTZWxlY3QgZGVjb2RlciBDUzBKCisgKiBDSU8zMiAgICAgQ1MxSiAgICAgICAgR2VuZXJhbCBDaGlwIFNlbGVjdCBkZWNvZGVyIENTMUoKKyAqIENJTzMzICAgICBBTFRfS0NMSyAgICBBbHRlcm5hdGl2ZSBLZXlib2FyZCBDbG9jaworICogQ0lPMzQgICAgIEFMVF9LREFUICAgIEFsdGVybmF0aXZlIEtleWJvYXJkIERhdGEKKyAqIENJTzM1ICAgICBBTFRfTUNMSyAgICBBbHRlcm5hdGl2ZSBNb3VzZSBDbG9jaworICogQ0lPMzYgICAgIEFMVF9NREFUICAgIEFsdGVybmF0aXZlIE1vdXNlIERhdGEKKyAqIENJTzM3ICAgICBBTFRfS0JDICAgICBBbHRlcm5hdGl2ZSBLQkMgc2VsZWN0CisgKgorICogVGhlIENJTyB1c2UgYSBkb3VibGUgaW5kaXJlY3QgYWRkcmVzcyBzY2hlbWUuIAorICogCisgKiBSZWlnc3RlciAzIGluIHRoZSBTSU8gaXMgdXNlZCB0byBzZWxlY3RnIHdoZXJlIHRoZSBDSU8gCisgKiBJL08gcmVnaXN0ZXJzIHNob3cgdXAgdW5kZXIgZnVuY3Rpb24gOC4gTm90ZSB0aGF0IHRoZXNlCisgKiByZWdpc3RlcnMgY2xhc2ggd2l0aCB0aGUgQ0lPIGZ1bmN0aW9uIHNlbGVjdCByZWdzdGVycywKKyAqIGJlbG93LgorICogCisgKiBTSU8gcmVpZ3N0ZXIgMyAoQ0lPIEFkZHJlc3MgU2VsZWN0aW9uKSBiaXQgZGVmaW5pdGlvbnM6CisgKiBiaXQgNyAgIENJTyBkYXRhIHJlZ2lzdGVyIGVuYWJsZWQKKyAqIGJpdCAxLTAgQ0lPIGluZGlyZWN0IHJlZ2lzdGVycyBzZWxlY3QKKyAqICAgICAJIDAgIGluZGV4ID0gMHhFMCBkYXRhID0gMHhFMQorICogICAgICAgMSAgaW5kZXggPSAweEUyIGRhdGEgPSAweEUzCisgKiAgICAgICAyICBpbmRleCA9IDB4RTQgZGF0YSA9IDB4RTUKKyAqICAgICAgIDMgIGluZGV4ID0gMHhFQSBkYXRhID0gMHhFQgorICogCisgKiBUaGVyZSBhcmUgdGhyZWUgQ0lPIEkvTyByZWdpc3RlciBhY2Nlc3NlZCB2aWEgQ0lPIGluZGV4IGFuZCBDSU8gZGF0YQorICogMHgwMSAgICAgQ0lPIDEwLTE3IGRhdGEKKyAqIDB4MDIgICAgIENJTyAyMC0yNSBkYXRhIChiaXRzIDctNiB1bnVzZWQpCisgKiAweDAzICAgICBDSU8gMzAtMzcgZGF0YQorICogCisgKiAKKyAqIFRoZSBwaW4gZnVuY3Rpb24gaXMgYWNjZXNzZWQgdGhyb3VnaCBub3JtYWwgCisgKiBTSU8gcmVnaXN0ZXJzLCBlYWNoIHJlZ2lzdGVyIGhhdmUgdGhlIHNhbWUgZm9ybWF0OgorICogCisgKiBCaXQgICBGdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgIFZhbHVlCisgKiAwICAgICBJbnB1dC9vdXRwdXQgICAgICAgICAgICAgICAgIDE9aW5wdXQgCisgKiAxICAgICBQb2xhcml0eSBvZiBzaWduYWwgICAgICAgICAgIDE9aW52ZXJ0ZWQKKyAqIDIgICAgIFVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgPz8KKyAqIDMgICAgIEZ1bmN0aW9uIChub3JtYWwgb3Igc3BlY2lhbCkgMT1zcGVjaWFsCisgKiA3LTQgICBVbnVzZWQKKyAqIAorICogU0lPIFJFRworICogMHhlMCAgICAgQ0lPIDEwIENvbmZpZworICogMHhlMSAgICAgQ0lPIDExIENvbmZpZworICogMHhlMiAgICAgQ0lPIDEyIENvbmZpZworICogMHhlMyAgICAgQ0lPIDEzIENvbmZpZworICogMHhlNCAgICAgQ0lPIDE0IENvbmZpZworICogMHhlNSAgICAgQ0lPIDE1IENvbmZpZworICogMHhlNiAgICAgQ0lPIDE2IENvbmZpZworICogMHhlNyAgICAgQ0lPIDE2IENvbmZpZworICoKKyAqIDB4ZTggICAgIENJTyAyMCBDb25maWcKKyAqIDB4ZTkgICAgIENJTyAyMSBDb25maWcKKyAqIDB4ZWEgICAgIENJTyAyMiBDb25maWcKKyAqIDB4ZWIgICAgIENJTyAyMyBDb25maWcKKyAqIDB4ZWMgICAgIENJTyAyNCBDb25maWcKKyAqIDB4ZWQgICAgIENJTyAyNSBDb25maWcKKyAqCisgKiAweGY1ICAgICBDSU8gMzAgQ29uZmlnCisgKiAweGY2ICAgICBDSU8gMzEgQ29uZmlnCisgKiAweGY3ICAgICBDSU8gMzIgQ29uZmlnCisgKiAweGY4ICAgICBDSU8gMzMgQ29uZmlnCisgKiAweGY5ICAgICBDSU8gMzQgQ29uZmlnCisgKiAweGZhICAgICBDSU8gMzUgQ29uZmlnCisgKiAweGZiICAgICBDSU8gMzYgQ29uZmlnCisgKiAweGZjICAgICBDSU8gMzcgQ29uZmlnCisgKiAKKyAqLworCit2b2lkIGFsaTUxMnhfc2V0X2NpbyhpbnQgZW5hYmxlZCkKK3sKKwlpbnQgaTsKKwkKKwlBTElfT1BFTigpOworCWFsaV93cml0ZSgweDMsIDMpOyAgICAvKiBEaXNhYmxlIENJTyBkYXRhIHJlZ2lzdGVyICovCisJCisJQUxJX1NFTERFVig4KTsKKwlhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOworCQorCS8qIHNldCBhbGwgcGlucyB0byBpbnB1dCB0byBzdGFydCB3aXRoICovCisJZm9yIChpPTB4ZTA7aTwweGVlO2krKykgeworCQlhbGlfd3JpdGUoaSwgMSk7CisJfQorCWZvciAoaT0weGY1O2k8MHhmZTtpKyspIHsKKwkJYWxpX3dyaXRlKGksIDEpOworCX0KKwkJCQorCUFMSV9DTE9TRSgpOworfQorCit2b2lkIGFsaTUxMnhfY2lvX2Z1bmN0aW9uKGludCBwaW4sIGludCBzcGVjaWFsLCBpbnQgaW52LCBpbnQgaW5wdXQpCit7CisJdTggZGF0YTsKKwl1OCBhZGRyOworCQorCQorCS8qIHZhbGlkIHBpbnMgYXJlIDEwLTE3LCAyMC0yNSBhbmQgMzAtMzcgKi8KKwlpZiAocGluID49IDEwICYmIHBpbiA8PSAxNykgeyAKKwkJYWRkciA9IDB4ZTArKHBpbi0xMCk7CisJfSBlbHNlIGlmIChwaW4gPj0gMjAgJiYgcGluIDw9IDI1KSB7CisJCWFkZHIgPSAweGU4KyhwaW4tMjApOworCX0gZWxzZSBpZiAocGluID49IDMwICYmIHBpbiA8PSAzNykgeyAKKwkJYWRkciA9IDB4ZjUrKHBpbi0zMCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuOworCX0KKwkKKwlBTElfT1BFTigpOworCUFMSV9TRUxERVYoOCk7CisJCisJYWxpX3dyaXRlKDB4MDMsIDB4MDMpOyAgICAvKiBEaXNhYmxlIENJTyBkYXRhIHJlZ2lzdGVyICovCisJCisJZGF0YT0wOworCWlmIChzcGVjaWFsKSB7CisJCWRhdGEgfD0gMHgwODsKKwl9IGVsc2UgeworCQlpZiAoaW52KSB7CisJCQlkYXRhIHw9IDB4MDI7CisJCX0KKwkJaWYgKGlucHV0KSB7CisJCQlkYXRhIHw9IDB4MDE7CisJCX0KKwl9CisJCisJYWxpX3dyaXRlKGFkZHIsIGRhdGEpOworCQorCUFMSV9DTE9TRSgpOworfQorCit2b2lkIGFsaTUxMnhfY2lvX291dChpbnQgcGluLCBpbnQgdmFsdWUpIAoreworCXU4IHJlZzsKKwl1OCBkYXRhOworCXU4IGJpdDsKKwkKKwkvKiB2YWxpZCBwaW5zIGFyZSAxMC0xNywgMjAtMjUgYW5kIDMwLTM3ICovCisJaWYgKHBpbiA+PSAxMCAmJiBwaW4gPD0gMTcpIHsgCisJCXJlZyA9IDE7CisJCXBpbiAtPSAxMDsKKwl9IGVsc2UgaWYgKHBpbiA+PSAyMCAmJiBwaW4gPD0gMjUpIHsKKwkJcmVnID0gMjsKKwkJcGluIC09IDIwOworCX0gZWxzZSBpZiAocGluID49IDMwICYmIHBpbiA8PSAzNykgeyAKKwkJcmVnID0gMzsKKwkJcGluIC09IDMwOworCX0gZWxzZSB7CisJCXJldHVybjsKKwl9CisJYml0ID0gMSA8PCBwaW47CisJCisJQUxJX09QRU4oKTsKKwlBTElfU0VMREVWKDgpOworCQorCWFsaV93cml0ZSgweDAzLCAweDgzKTsgICAgLyogRW5hYmxlIENJTyBkYXRhIHJlZ2lzdGVyLCB1c2UgZGF0YSBwb3J0IGF0IDB4ZWEgKi8KKwkKKwlhbGlfd3JpdGUoMHhlYSwgcmVnKTsgICAgIC8qIHNlbGVjdCBJL08gcmVnaXN0ZXIgKi8KKwlkYXRhID0gYWxpX3JlYWQoMHhlYik7CisJaWYgKHZhbHVlKSB7CisJCWRhdGEgfD0gYml0OworCX0gZWxzZSB7CisJCWRhdGEgJj0gfmJpdDsKKwl9CisJYWxpX3dyaXRlKDB4ZWIsIGRhdGEpOworCWFsaV93cml0ZSgweGVhLCAwKTsgICAgICAgLyogc2VsZWN0IHJlZ2lzdGVyIDAgKi8KKwlhbGlfd3JpdGUoMHgwMywgMHgwMyk7ICAgIC8qIERpc2FibGUgQ0lPIGRhdGEgcmVnaXN0ZXIgKi8KKwlBTElfQ0xPU0UoKTsKK30KKworaW50IGFsaTUxMnhfY2lvX2luKGludCBwaW4pCit7CisJdTggcmVnOworCXU4IGRhdGE7CisJdTggYml0OworCQorCS8qIHZhbGlkIHBpbnMgYXJlIDEwLTE3LCAyMC0yNSBhbmQgMzAtMzcgKi8KKwlpZiAocGluID49IDEwICYmIHBpbiA8PSAxNykgeyAKKwkJcmVnID0gMTsKKwkJcGluIC09IDEwOworCX0gZWxzZSBpZiAocGluID49IDIwICYmIHBpbiA8PSAyNSkgeworCQlyZWcgPSAyOworCQlwaW4gLT0gMjA7CisJfSBlbHNlIGlmIChwaW4gPj0gMzAgJiYgcGluIDw9IDM3KSB7IAorCQlyZWcgPSAzOworCQlwaW4gLT0gMzA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC0xOyAKKwl9CisJYml0ID0gMSA8PCBwaW47CisJCisJQUxJX09QRU4oKTsKKwlBTElfU0VMREVWKDgpOworCQorCWFsaV93cml0ZSgweDAzLCAweDgzKTsgICAgLyogRW5hYmxlIENJTyBkYXRhIHJlZ2lzdGVyLCB1c2UgZGF0YSBwb3J0IGF0IDB4ZWEgKi8KKwkKKwlhbGlfd3JpdGUoMHhlYSwgcmVnKTsgICAgIC8qIHNlbGVjdCBJL08gcmVnaXN0ZXIgKi8KKwlkYXRhID0gYWxpX3JlYWQoMHhlYik7CisJYWxpX3dyaXRlKDB4ZWEsIDApOyAgICAgICAvKiBzZWxlY3QgcmVnaXN0ZXIgMCAqLworCWFsaV93cml0ZSgweDAzLCAweDAzKTsgICAgLyogRGlzYWJsZSBDSU8gZGF0YSByZWdpc3RlciAqLworCUFMSV9DTE9TRSgpOworCQorCXJldHVybiBkYXRhICYgYml0OyAKK30KKworIApkaWZmIC0tZ2l0IGEvbGliX2kzODYvaWMvc2M1MjAuYyBiL2xpYl9pMzg2L2ljL3NjNTIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwMjYyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L2ljL3NjNTIwLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwKKyAqIGJ1dCBpZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCisKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaWMvc2M1MjAuaD4KKworLyogCisgKiB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYm9hcmRzIGJhc2VkIG9uIHRoZSBBTUQgc2M1MjAgCisgKiAKKyAqIHZvaWQgd3JpdGVfbW1jcl9ieXRlKHUxNiBtbWNyLCB1OCBkYXRhKQorICogdm9pZCB3cml0ZV9tbWNyX3dvcmQodTE2IG1tY3IsIHUxNiBkYXRhKQorICogdm9pZCB3cml0ZV9tbWNyX2xvbmcodTE2IG1tY3IsIHUzMiBkYXRhKQorICogCisgKiB1OCAgIHJlYWRfbW1jcl9ieXRlKHUxNiBtbWNyKQorICogdTE2ICByZWFkX21tY3Jfd29yZCh1MTYgbW1jcikKKyAqIHUzMiAgcmVhZF9tbWNyX2xvbmcodTE2IG1tY3IpCisgKiAKKyAqIHZvaWQgaW5pdF9zYzUyMCh2b2lkKQorICogdW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKKyAqIHZvaWQgcGNpX3NjNTIwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQorICogCisgKiB2b2lkIHJlc2V0X3RpbWVyKHZvaWQpCisgKiB1bG9uZyBnZXRfdGltZXIodWxvbmcgYmFzZSkKKyAqIHZvaWQgc2V0X3RpbWVyKHVsb25nIHQpCisgKiB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpCisgKiAKKyAqLworCitzdGF0aWMgdTMyIG1tY3JfYmFzZT0gMHhmZmZlZjAwMDsKKwordm9pZCB3cml0ZV9tbWNyX2J5dGUodTE2IG1tY3IsIHU4IGRhdGEpCit7CisJd3JpdGViKGRhdGEsIG1tY3IrbW1jcl9iYXNlKTsKK30KKwordm9pZCB3cml0ZV9tbWNyX3dvcmQodTE2IG1tY3IsIHUxNiBkYXRhKQoreworCXdyaXRldyhkYXRhLCBtbWNyK21tY3JfYmFzZSk7CQorfQorCit2b2lkIHdyaXRlX21tY3JfbG9uZyh1MTYgbW1jciwgdTMyIGRhdGEpCit7CisJd3JpdGVsKGRhdGEsIG1tY3IrbW1jcl9iYXNlKTsKK30KKwordTggcmVhZF9tbWNyX2J5dGUodTE2IG1tY3IpCit7CisJcmV0dXJuIHJlYWRiKG1tY3IrbW1jcl9iYXNlKTsKK30KKwordTE2IHJlYWRfbW1jcl93b3JkKHUxNiBtbWNyKQoreworCXJldHVybiByZWFkdyhtbWNyK21tY3JfYmFzZSk7CQorfQorCit1MzIgcmVhZF9tbWNyX2xvbmcodTE2IG1tY3IpCit7CisJcmV0dXJuIHJlYWRsKG1tY3IrbW1jcl9iYXNlKTsKK30KKworCit2b2lkIGluaXRfc2M1MjAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwkKKwkvKiBTZXQgdGhlIFVBUlR4Q1RMIHJlZ2lzdGVyIGF0IGl0J3Mgc2xvd2VyLAorCSAqIGJhdWQgY2xvY2sgZ2l2aW5nIHVzIGEgMS44NDMyIE1IeiByZWZlcmVuY2UgCisJICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQxQ1RMLCA3KTsKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDJDVEwsIDcpOworCQorCS8qIGZpcnN0IHNldCB0aGUgdGltZXIgcGluIG1hcHBpbmcgKi8KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ0xLU0VMLCAweDcyKTsJLyogbm8gY2xvY2sgZnJlcXVlbmN5IHNlbGVjdGVkLCB1c2UgMS4xODkyTUh6ICovCisJCisJLyogZW5hYmxlIFBDSSBidXMgYXJiaXRyZXIgKi8KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1lTQVJCQ1RMLDB4MDIpOyAgLyogZW5hYmxlIGNvbmN1cnJlbnQgbW9kZSAqLworCQorCXdyaXRlX21tY3Jfd29yZChTQzUyMF9TWVNBUkJNRU5CLDB4MWYpOyAvKiBlbmFibGUgZXh0ZXJuYWwgZ3JhbnRzICovCisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0hCQ1RMLDB4MDQpOyAgICAgIC8qIGVuYWJsZSBwb3N0ZWQtd3JpdGVzICovCisKKworCWlmIChDRkdfU0M1MjBfSElHSF9TUEVFRCkgeworCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ1BVQ1RMLCAweDIpOwkvKiBzZXQgaXQgdG8gMTMzIE1IeiBhbmQgd3JpdGUgYmFjayAqLworCQlnZC0+Y3B1X2NsayA9IDEzMzAwMDAwMDsKKwkJcHJpbnRmKCIjIyBDUFUgU3BlZWQgc2V0IHRvIDEzM01IelxuIik7CisJfSBlbHNlIHsKKwkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0NQVUNUTCwgMSk7CS8qIHNldCBDUFUgdG8gMTAwIE1IeiBhbmQgd3JpdGUgYmFjayBjYWNoZSAqLworCQlwcmludGYoIiMjIENQVSBTcGVlZCBzZXQgdG8gMTAwTUh6XG4iKTsKKwkJZ2QtPmNwdV9jbGsgPSAxMDAwMDAwMDA7CisJfQorCQorCisJLyogd2FpdCBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQgKi8KKyAgICAgICAgYXNtKCJtb3ZsCSQweDIwMDAsJSVlY3hcbiIKKwkgICAgIndhaXRfbG9vcDoJcHVzaGwgJSVlY3hcbiIKKwkgICAgInBvcGwJJSVlY3hcbiIKKwkgICAgImxvb3Agd2FpdF9sb29wXG4iOiA6IDogImVjeCIpOworCisJLyogdHVybiBvbiB0aGUgU0RSQU0gd3JpdGUgYnVmZmVyICovCisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RCQ1RMLCAweDExKTsKKworCS8qIHR1cm4gb24gdGhlIGNhY2hlIGFuZCBkaXNhYmxlIHdyaXRlIHRocm91Z2ggKi8KKwlhc20oIm1vdmwJJSVjcjAsICUlZWF4XG4iCisJICAgICJhbmRsCSQweDlmZmZmZmZmLCAlJWVheFxuIgorCSAgICAibW92bAklJWVheCwgJSVjcjBcbiIgIDogOiA6ICJlYXgiKTsKK30KKwordW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwliZF90ICpiZCA9IGdkLT5iZDsKKwkKKwl1MzIgZHJhbV9wcmVzZW50PTA7CisJdTMyIGRyYW1fY3RybDsKKworCWludCB2YWw7CisJCisJaW50IGNhc19wcmVjaGFyZ2VfZGVsYXkgPSBDRkdfU0RSQU1fUFJFQ0hBUkdFX0RFTEFZOwkKKwlpbnQgcmVmcmVzaF9yYXRlICAgICAgICA9IENGR19TRFJBTV9SRUZSRVNIX1JBVEU7CQorCWludCByYXNfY2FzX2RlbGF5ICAgICAgID0gQ0ZHX1NEUkFNX1JBU19DQVNfREVMQVk7CisJCisJLyogc2V0IFNEUkFNIHNwZWVkIGhlcmUgKi8KKwkKKwlyZWZyZXNoX3JhdGUvPTc4OwkKKwlpZiAocmVmcmVzaF9yYXRlPD0xKSB7CisJCXZhbCA9IDA7ICAvKiA3Ljh1cyAqLworCX0gZWxzZSBpZiAocmVmcmVzaF9yYXRlPT0yKSB7CisJCXZhbCA9IDE7ICAvKiAxNS42dXMgKi8KKwl9IGVsc2UgaWYgKHJlZnJlc2hfcmF0ZT09MyB8fCByZWZyZXNoX3JhdGU9PTQpIHsKKwkJdmFsID0gMjsgIC8qIDMxLjJ1cyAqLworCX0gZWxzZSB7CisJCXZhbCA9IDM7ICAvKiA2Mi40dXMgKi8KKwl9CisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RSQ0NUTCwgKHJlYWRfbW1jcl9ieXRlKFNDNTIwX0RSQ0NUTCkgJiAweGNmKSB8ICh2YWw8PDQpKTsKKwkKKwl2YWwgPSByZWFkX21tY3JfYnl0ZShTQzUyMF9EUkNUTUNUTCk7CisJdmFsICY9IDB4ZjA7CisJCisJaWYgKGNhc19wcmVjaGFyZ2VfZGVsYXk9PTMpIHsJCQorCQl2YWwgfD0gMHgwNDsgICAvKiAzVCAqLworCX0gZWxzZSBpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT09NCkgewkJCisJCXZhbCB8PSAweDA4OyAgIC8qIDRUICovCisJfSBlbHNlIGlmIChjYXNfcHJlY2hhcmdlX2RlbGF5PjQpIHsJCQorCQl2YWwgfD0gMHgwYzsKKwl9IAorCQorCWlmIChyYXNfY2FzX2RlbGF5ID4gMykgeworCQl2YWwgfD0gMjsgCisJfSBlbHNlIHsKKwkJdmFsIHw9IDE7IAorCX0KKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfRFJDVE1DVEwsIHZhbCk7CisKKworCS8qIFdlIHJlYWQtYmFjayB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZHJhbQorCSAqIGNvbnRyb2xsZXIgdGhhdCB0aGUgYXNzZW1ibHkgY29kZSB3cm90ZSAqLworCWRyYW1fY3RybCA9IHJlYWRfbW1jcl9sb25nKFNDNTIwX0RSQ0JFTkRBRFIpOworCQorCisJYmQtPmJpX2RyYW1bMF0uc3RhcnQgPSAwOworCWlmIChkcmFtX2N0cmwgJiAweDgwKSB7CisJCS8qIGJhbmsgMCBlbmFibGVkICovCisJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzFdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YpIDw8IDIyOworCQliZC0+YmlfZHJhbVswXS5zaXplID0gYmQtPmJpX2RyYW1bMV0uc3RhcnQ7IAorCisJfSBlbHNlIHsKKwkJYmQtPmJpX2RyYW1bMF0uc2l6ZSA9IDA7CisJCWJkLT5iaV9kcmFtWzFdLnN0YXJ0ID0gYmQtPmJpX2RyYW1bMF0uc3RhcnQ7CisJfQorCQorCWlmIChkcmFtX2N0cmwgJiAweDgwMDApIHsKKwkJLyogYmFuayAxIGVuYWJsZWQgKi8KKwkJZHJhbV9wcmVzZW50ID0gYmQtPmJpX2RyYW1bMl0uc3RhcnQgPSAoZHJhbV9jdHJsICYgMHg3ZjAwKSA8PCAxNDsKKwkJYmQtPmJpX2RyYW1bMV0uc2l6ZSA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0IC0gIGJkLT5iaV9kcmFtWzFdLnN0YXJ0OyAKKwl9IGVsc2UgeworCQliZC0+YmlfZHJhbVsxXS5zaXplID0gMDsKKwkJYmQtPmJpX2RyYW1bMl0uc3RhcnQgPSBiZC0+YmlfZHJhbVsxXS5zdGFydDsKKwl9CisJCisJaWYgKGRyYW1fY3RybCAmIDB4ODAwMDAwKSB7CisJCS8qIGJhbmsgMiBlbmFibGVkICovCisJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzNdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YwMDAwKSA8PCA2OworCQliZC0+YmlfZHJhbVsyXS5zaXplID0gYmQtPmJpX2RyYW1bM10uc3RhcnQgLSAgYmQtPmJpX2RyYW1bMl0uc3RhcnQ7IAorCX0gZWxzZSB7CisJCWJkLT5iaV9kcmFtWzJdLnNpemUgPSAwOworCQliZC0+YmlfZHJhbVszXS5zdGFydCA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0OworCX0gCisJCisJaWYgKGRyYW1fY3RybCAmIDB4ODAwMDAwMDApIHsKKwkJLyogYmFuayAzIGVuYWJsZWQgKi8KKwkJZHJhbV9wcmVzZW50ICA9IChkcmFtX2N0cmwgJiAweDdmMDAwMDAwKSA+PiAyOworCQliZC0+YmlfZHJhbVszXS5zaXplID0gZHJhbV9wcmVzZW50IC0gIGJkLT5iaV9kcmFtWzNdLnN0YXJ0OworCX0gZWxzZSB7CisJCWJkLT5iaV9kcmFtWzNdLnNpemUgPSAwOworCX0KKworCQorI2lmIDAJCisJcHJpbnRmKCJDb25maWd1cmVkICVkIGJ5dGVzIG9mIGRyYW1cbiIsIGRyYW1fcHJlc2VudCk7CisjZW5kaWYJCisJZ2QtPnJhbV9zaXplID0gZHJhbV9wcmVzZW50OworCQorCXJldHVybiBkcmFtX3ByZXNlbnQ7Cit9CisKKworI2lmZGVmIENPTkZJR19QQ0kKKworCisKK3ZvaWQgcGNpX3NjNTIwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKKwlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKKworCS8qIFN5c3RlbSBtZW1vcnkgc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwgCisJCSAgICAgICBTQzUyMF9QQ0lfTUVNT1JZX0JVUywKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfUEhZUywKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJLyogUENJIG1lbW9yeSBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAxLCAKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1fQlVTLAorCQkgICAgICAgU0M1MjBfUENJX01FTV9QSFlTLAorCQkgICAgICAgU0M1MjBfUENJX01FTV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCisJLyogSVNBL1BDSSBtZW1vcnkgc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMiwgCisJCSAgICAgICBTQzUyMF9JU0FfTUVNX0JVUywKKwkJICAgICAgIFNDNTIwX0lTQV9NRU1fUEhZUywKKwkJICAgICAgIFNDNTIwX0lTQV9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIFBDSSBJL08gc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywgCisJCSAgICAgICBTQzUyMF9QQ0lfSU9fQlVTLAorCQkgICAgICAgU0M1MjBfUENJX0lPX1BIWVMsCisJCSAgICAgICBTQzUyMF9QQ0lfSU9fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJLyogSVNBL1BDSSBJL08gc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgNCwgCisJCSAgICAgICBTQzUyMF9JU0FfSU9fQlVTLAorCQkgICAgICAgU0M1MjBfSVNBX0lPX1BIWVMsCisJCSAgICAgICBTQzUyMF9JU0FfSU9fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJaG9zZS0+cmVnaW9uX2NvdW50ID0gNTsKKworCXBjaV9zZXR1cF90eXBlMShob3NlLAorCQkJU0M1MjBfUkVHX0FERFIsCisJCQlTQzUyMF9SRUdfREFUQSk7CisKKwlwY2lfcmVnaXN0ZXJfaG9zZShob3NlKTsKKworCWhvc2UtPmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuKGhvc2UpOworCQorCS8qIGVuYWJsZSB0YXJnZXQgbWVtb3J5IGFjY2VzZXMgb24gaG9zdCBicmlnZSAqLworCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfQ09NTUFORCwgCisJCQkgICAgICBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIpOworCit9CisKKworI2VuZGlmCisKKyNpZmRlZiBDRkdfVElNRVJfU0M1MjAKKworCit2b2lkIHJlc2V0X3RpbWVyKHZvaWQpCit7CisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENOVCwgMCk7CisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENUTCwgMHg2MDAxKTsKKwkKK30KKwordWxvbmcgZ2V0X3RpbWVyKHVsb25nIGJhc2UpCit7CisJLyogZml4bWU6IDMwIG9yIDMzICovCisJcmV0dXJuIAlyZWFkX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDTlQpIC8gMzM7Cit9CisKK3ZvaWQgc2V0X3RpbWVyKHVsb25nIHQpCit7CisJLyogRml4TWU6IHVzZSB0d28gY2FzY2FkZSBjb3VwbGVkIHRpbWVycyAqLworCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDVEwsIDB4NDAwMSk7CisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENOVCwgdCozMyk7CisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENUTCwgMHg2MDAxKTsKK30KKworCit2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpCit7CisJaW50IG09MDsKKwlsb25nIHU7CisJCisJcmVhZF9tbWNyX3dvcmQoU0M1MjBfU1dUTVJNSUxMSSk7CisJcmVhZF9tbWNyX3dvcmQoU0M1MjBfU1dUTVJNSUNSTyk7CisJICAgICAKKyNpZiAwCisJLyogZG8gbm90IGVuYWJsZSB0aGlzIGxpbmUsIHVkZWxheSBpcyB1c2VkIGluIHRoZSBzZXJpYWwgZHJpdmVyIC0+IHJlY3Vyc2lvbiAqLworCXByaW50ZigidWRlbGF5OiAlbGQgbS51ICVkLiVkICB0bS50dSAlZC4lZFxuIiwgdXNlYywgbSwgdSwgdG0sIHR1KTsKKyNlbmRpZgkKKwl3aGlsZSAoMSkgeworCQkKKwkJbSArPSByZWFkX21tY3Jfd29yZChTQzUyMF9TV1RNUk1JTExJKTsKKwkJdSA9IHJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlDUk8pICsgKG0gKiAxMDAwKTsKKwkJCisJCWlmICh1c2VjIDw9IHUpIHsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9pYy9zYzUyMF9hc20uUyBiL2xpYl9pMzg2L2ljL3NjNTIwX2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTEwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJfaTM4Ni9pYy9zYzUyMF9hc20uUwpAQCAtMCwwICsxLDUzMCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIgPGRhbmllbEBvbWljcm9uLnNlPi4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBUaGlzIGZpbGUgaXMgbGFyZ2VseSBiYXNlZCBvbiBjb2RlIG9idG5lZCBmcm9tIEFNRC4gQU1EJ3Mgb3JpZ2luYWwKKyAqIGNvcHlyaWdodCBpcyBpbmNsdWRlZCBiZWxvdyAKKyAqLworCisvKgorICogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICBDb3B5cmlnaHQgMTk5OSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgVGhpcyBzb2Z0d2FyZSBpcyB0aGUgcHJvcGVydHkgb2YgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jICAoQU1EKSAgd2hpY2ggCisgKiAgc3BlY2lmaWNhbGx5IGdyYW50cyB0aGUgdXNlciB0aGUgcmlnaHQgdG8gbW9kaWZ5LCB1c2UgYW5kIGRpc3RyaWJ1dGUgdGhpcyAKKyAqICBzb2Z0d2FyZSBwcm92aWRlZCB0aGlzIENPUFlSSUdIVCBOT1RJQ0UgaXMgbm90IHJlbW92ZWQgb3IgYWx0ZXJlZC4gIEFsbCAKKyAqICBvdGhlciByaWdodHMgYXJlIHJlc2VydmVkIGJ5IEFNRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVFkgCisgKiAgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQgT0YgCisgKiAgVEhJUkQtUEFSVFkgSU5URUxMRUNUVUFMIFBST1BFUlRZLCBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFLgorICogIElOIE5PIEVWRU5UIFNIQUxMIEFNRCBPUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorICogIChJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TUyBPRiBQUk9GSVRTLCBCVVNJTkVTUworICogIElOVEVSUlVQVElPTiwgTE9TUyBPRiBJTkZPUk1BSVRPTikgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBPUiBJTkFCSUxJVFkKKyAqICBUTyBVU0UgVEhFIE1BVEVSSUFMUywgRVZFTiBJRiBBTUQgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqICBTVUNIIERBTUFHRVMuICBCRUNBVVNFIFNPTUUgSlVSU0lESUNUSU9OUyBQUk9ISUJJVCBUSEUgRVhDTFVTSU9OIE9SCisgKiAgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgRk9SIENPTlNFUVVFTlRJQUwgT1IgSU5DSURFTlRBTCBEQU1BR0VTLCBUSEUgQUJPVkUKKyAqICBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgorICogCisgKiAgQU1EIGRvZXMgbm90IGFzc3VtZSBhbnkgcmVzcG9uc2liaWxpdHkgZm9yIGFueSBlcnJvcnMgdGhhdCBtYXkgYXBwZWFyIGluCisgKiAgdGhlIE1hdGVyaWFscyBub3IgYW55IHJlc3BvbnNpYmlsaXR5IHRvIHN1cHBvcnQgb3IgdXBkYXRlIHRoZSBNYXRlcmlhbHMuCisgKiAgQU1EIHJldGFpbnMgdGhlIHJpZ2h0IHRvIG1ha2UgY2hhbmdlcyB0byBpdHMgdGVzdCBzcGVjaWZpY2F0aW9ucyBhdCBhbnkKKyAqICB0aW1lLCB3aXRob3V0IG5vdGljZS4KKyAqIAorICogIFNvIHRoYXQgYWxsIG1heSBiZW5lZml0IGZyb20geW91ciBleHBlcmllbmNlLCBwbGVhc2UgcmVwb3J0ICBhbnkgIHByb2JsZW1zIAorICogIG9yIHN1Z2dlc3Rpb25zIGFib3V0IHRoaXMgc29mdHdhcmUgYmFjayB0byBBTUQuICBQbGVhc2UgaW5jbHVkZSB5b3VyIG5hbWUsIAorICogIGNvbXBhbnksICB0ZWxlcGhvbmUgbnVtYmVyLCAgQU1EIHByb2R1Y3QgcmVxdWlyaW5nIHN1cHBvcnQgYW5kIHF1ZXN0aW9uIG9yIAorICogIHByb2JsZW0gZW5jb3VudGVyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4gICAgICAgICBXb3JsZHdpZGUgc3VwcG9ydCBhbmQgY29udGFjdCAgICAgICAgICAgCisgKiAgRW1iZWRkZWQgUHJvY2Vzc29yIERpdmlzaW9uICAgICAgICAgICAgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGF0OiAgICAgICAgICAgICAgIAorICogIFN5c3RlbXMgRW5naW5lZXJpbmcgICAgICAgICAgICAgICAgICAgICAgIGVwZC5zdXBwb3J0QGFtZC5jb20KKyAqICA1MjA0IEUuIEJlbiBXaGl0ZSBCbHZkLiAgICAgICAgICAgICAgICAgICAgICAgICAgLW9yLQorICogIEF1c3RpbiwgVFggNzg3NDEgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hbWQuY29tL2h0bWwvc3VwcG9ydC90ZWNoc3VwLmh0bWwKKyAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIEFVVEhPUiAgICAgIDogQnVkZHkgRmV5IC0gT3JpZ2luYWwuIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICBGVU5DVElPTkFMIERFU0NSSVBUSU9OOgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBhdXRvZGV0ZWN0IHRoZSBnZW9tZXRyeSBvZiB0aGUgRFJBTS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGNvbHVtbiBiaXRzIGZvciB0aGUgRFJBTQorICogZGV2aWNlcyBpbiB0aGlzIGV4dGVybmFsIGJhbmsuIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIGV4dGVybmFsIGJhbmsKKyAqIGhhcyBiZWVuIGNvbmZpZ3VyZWQgZm9yIGFuIDExLWJpdCBjb2x1bW4gYW5kIGZvciA0IGludGVybmFsIGJhbmtzLiBUaGlzIGdpdmVzCisgKiB1cyB0aGUgbWF4aW11bSBhZGRyZXNzIHJlYWNoIGluIG1lbW9yeS4gQnkgd3JpdGluZyBhIHRlc3QgdmFsdWUgdG8gdGhlIG1heAorICogYWRkcmVzcyBhbmQgbG9jYXRpbmcgd2hlcmUgaXQgYWxpYXNlcyB0bywgd2UgY2FuIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHZhbGlkCisgKiBjb2x1bW4gYml0cy4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGludGVybmFsIGJhbmtzIGVhY2ggRFJBTQorICogZGV2aWNlIGhhcy4gVGhlIGV4dGVybmFsIGJhbmsgKHVuZGVyIHRlc3QpIGlzIGNvbmZpZ3VyZWQgZm9yIG1heGltdW0gcmVhY2gKKyAqIHdpdGggMTEtYml0IGNvbHVtbnMgYW5kIDQgaW50ZXJuYWwgYmFua3MuIFRoaXMgcm91dGluZSB3aWxsIHdyaXRlIHRvIGEgbWF4CisgKiBhZGRyZXNzIChCQTEgYW5kIEJBMCA9IDEpIGFuZCB0aGVuIHJlYWQgZnJvbSBhbiBhZGRyZXNzIHdpdGggQkExPTAgdG8gc2VlIGlmCisgKiB0aGF0IGNvbHVtbiBpcyBhICJkb24ndCBjYXJlIi4gSWYgQkExIGRvZXMgbm90IGFmZmVjdCB3cml0ZS9yZWFkIG9mIGRhdGEsCisgKiB0aGVuIHRoaXMgZGV2aWNlIGhhcyBvbmx5IDIgaW50ZXJuYWwgYmFua3MuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIGVuZGluZyBhZGRyZXNzIGZvciB0aGlzIGV4dGVybmFsCisgKiBiYW5rIG9mIFNEUkFNLiBXZSB3cml0ZSB0byBhIG1heCBhZGRyZXNzIHdpdGggYSBkYXRhIHZhbHVlIGFuZCB0aGVuIGRpc2FibGUKKyAqIHJvdyBhZGRyZXNzIGJpdHMgbG9va2luZyBmb3IgImRvbid0IGNhcmUiIGxvY2F0aW9ucy4gRWFjaCAiZG9uJ3QgY2FyZSIgYml0CisgKiByZXByZXNlbnRzIGEgZGl2aWRpbmcgb2YgdGhlIG1heGltdW0gZGVuc2l0eSAoMTI4TSkgYnkgMi4gQnkgZGl2aWRpbmcgdGhlCisgKiBtYXhpbXVtIG9mIDMyIDRNIGNodW5rcyBpbiBhbiBleHRlcm5hbCBiYW5rIGRvd24gYnkgYWxsIHRoZSAiZG9uJ3QgY2FyZSIgYml0cworICogZGV0ZXJtaW5lZCBkdXJpbmcgc2l6aW5nLCB3ZSBzZXQgdGhlIHByb3BlciBkZW5zaXR5LgorICoKKyAqIFdBUk5JTkdTLgorICogYnAgbXVzdCBiZSBwcmVzZXJ2ZWQgYmVjYXVzZSBpdCBpcyB1c2VkIGZvciByZXR1cm4gbGlua2FnZS4KKyAqCisgKiBFWElUCisgKiBub3RoaW5nIHJldHVybmVkIC0gYnV0IHRoZSBtZW1vcnkgc3Vic3lzdGVtIGlzIGVuYWJsZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLnNlY3Rpb24gLnRleHQKKy5lcXUgICAgICAgICAgICBEUkNDVEwsICAgICAweDBmZmZlZjAxMCAgIC8qIERSQU0gY29udHJvbCByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIERSQ1RNQ1RMLCAgIDB4MGZmZmVmMDEyICAgLyogRFJBTSB0aW1pbmcgY29udHJvbCByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIERSQ0NGRywgICAgIDB4MGZmZmVmMDE0ICAgLyogRFJBTSBiYW5rIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKy5lcXUgICAgICAgICAgICBEUkNCRU5EQURSLCAweDBmZmZlZjAxOCAgIC8qIERSQU0gYmFuayBlbmRpbmcgYWRkcmVzcyByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIEVDQ0NUTCwgICAgIDB4MGZmZmVmMDIwICAgLyogRFJBTSBFQ0MgY29udHJvbCByZWdpc3RlciAqLworLmVxdSAgICAgICAgICAgIERCQ1RMLCAgICAgIDB4MGZmZmVmMDQwICAgLyogRFJBTSBidWZmZXIgY29udHJvbCByZWdpc3RlciAqLworCisuZXF1ICAgICAgICAgICAgQ0FDSEVMSU5FU1osIDB4MDAwMDAwMTAgICAvKiBzaXplIG9mIG91ciBjYWNoZSBsaW5lIChyZWFkIGJ1ZmZlcikgKi8KKy5lcXUgICAgICAgICAgICBDT0wxMV9BRFIsICAweDBlMDAxZTAwICAgIC8qIDExIGNvbCBhZGRycyAqLworLmVxdSAgICAgICAgICAgIENPTDEwX0FEUiwgIDB4MGUwMDBlMDAgICAgLyogMTAgY29sIGFkZHJzICovCisuZXF1ICAgICAgICAgICAgQ09MMDlfQURSLCAgMHgwZTAwMDYwMCAgICAvKiAgOSBjb2wgYWRkcnMgKi8KKy5lcXUgICAgICAgICAgICBDT0wwOF9BRFIsICAweDBlMDAwMjAwICAgIC8qICA4IGNvbCBhZGRycyAqLworLmVxdSAgICAgICAgICAgIFJPVzE0X0FEUiwgIDB4MGYwMDAwMDAgICAgLyogMTQgcm93IGFkZHJzICovCisuZXF1ICAgICAgICAgICAgUk9XMTNfQURSLCAgMHgwNzAwMDAwMCAgICAvKiAxMyByb3cgYWRkcnMgKi8KKy5lcXUgICAgICAgICAgICBST1cxMl9BRFIsICAweDAzMDAwMDAwICAgIC8qIDEyIHJvdyBhZGRycyAqLworLmVxdSAgICAgICAgICAgIFJPVzExX0FEUiwgIDB4MDEwMDAwMDAgICAgLyogMTEgcm93IGFkZHJzL2Fsc28gYmFuayBzd2l0Y2ggKi8KKy5lcXUgICAgICAgICAgICBST1cxMF9BRFIsICAweDAwMDAwMDAwICAgIC8qIDEwIHJvdyBhZGRycy9hbHNvIGJhbmsgc3dpdGNoICovCisuZXF1ICAgICAgICAgICAgQ09MMTFfREFUQSwgMHgwYjBiMGIwYiAgICAvKiAxMSBjb2wgYWRkcnMgKi8KKy5lcXUgICAgICAgICAgICBDT0wxMF9EQVRBLCAweDBhMGEwYTBhICAgIC8qIDEwIGNvbCBkYXRhICovCisuZXF1ICAgICAgICAgICAgQ09MMDlfREFUQSwgMHgwOTA5MDkwOSAgICAvKiAgOSBjb2wgZGF0YSAqLworLmVxdSAgICAgICAgICAgIENPTDA4X0RBVEEsIDB4MDgwODA4MDggICAgLyogIDggY29sIGRhdGEgKi8KKy5lcXUgICAgICAgICAgICBST1cxNF9EQVRBLCAweDNmM2YzZjNmICAgIC8qIDE0IHJvdyBkYXRhIChNQVNLKSAqLworLmVxdSAgICAgICAgICAgIFJPVzEzX0RBVEEsIDB4MWYxZjFmMWYgICAgLyogMTMgcm93IGRhdGEgKE1BU0spICovCisuZXF1ICAgICAgICAgICAgUk9XMTJfREFUQSwgMHgwZjBmMGYwZiAgICAvKiAxMiByb3cgZGF0YSAoTUFTSykgKi8KKy5lcXUgICAgICAgICAgICBST1cxMV9EQVRBLCAweDA3MDcwNzA3ICAgIC8qIDExIHJvdyBkYXRhL2Fsc28gYmFuayBzd2l0Y2ggKE1BU0spICovCisuZXF1ICAgICAgICAgICAgUk9XMTBfREFUQSwgMHhhYWFhYWFhYSAgICAvKiAxMCByb3cgZGF0YS9hbHNvIGJhbmsgc3dpdGNoIChNQVNLKSAqLworCisKKyAvKgorICAqIGluaXRpYWxpemUgZHJhbSBjb250cm9sbGVyIHJlZ2lzdGVycworICAqLworLmdsb2JsIG1lbV9pbml0CittZW1faW5pdDogCisgICAgICAgIHhvcncgICAgJWF4LCVheAorICAgICAgICBtb3ZsICAgICREQkNUTCwgJWVkaSAgICAgICAgICAgICAKK2ZzCW1vdmIgICAgICVhbCwgKCVlZGkpICAgICAgICAgICAgIC8qIGRpc2FibGUgd3JpdGUgYnVmZmVyICovCisKKyAgICAgICAgbW92bCAgICAkRUNDQ1RMLCAlZWRpICAgICAgICAgICAgCitmcwltb3ZiICAgICAlYWwsICglZWRpKSAgICAgICAgICAgICAvKiBkaXNhYmxlIEVDQyAqLworCisgICAgICAgIG1vdmwgICAgJERSQ1RNQ1RMLCAlZWRpICAgICAgICAgICAKKyAgICAgICAgbW92YiAgICAkMHgxRSwlYWwgICAgICAgICAgICAgICAgLyogU2V0IFNEUkFNIHRpbWluZyBmb3Igc2xvd2VzdCAqLworZnMJbW92YiAgICAgJWFsLCAoJWVkaSkKKworIC8qCisgICogc2V0dXAgbG9vcCB0byBkbyA0IGV4dGVybmFsIGJhbmtzIHN0YXJ0aW5nIHdpdGggYmFuayAzCisgICovCisgICAgICAgIG1vdmwgICAgJDB4ZmYwMDAwMDAsJWVheCAgICAgICAgIC8qIGVuYWJsZSBsYXN0IGJhbmsgYW5kIHNldHVwICovCisgICAgICAgIG1vdmwgICAgJERSQ0JFTkRBRFIsICVlZGkgICAgICAgIC8qIGVuZGluZyBhZGRyZXNzIHJlZ2lzdGVyICovCitmcwltb3ZsICAgICAlZWF4LCAoJWVkaSkKKworICAgICAgICBtb3ZsICAgICREUkNDRkcsICVlZGkgICAgICAgICAgICAvKiBzZXR1cCAqLworICAgICAgICBtb3Z3ICAgICQweGJiYmIsJWF4ICAgICAgICAgICAgICAvKiBkcmFtIGNvbmZpZyByZWdpc3RlciBmb3IgICovCitmcwltb3Z3ICAgICVheCwgKCVlZGkpCisKKyAvKgorICAqIGlzc3VlIGEgTk9QIHRvIGFsbCBEUkFNcworICAqLworICAgICAgICBtb3ZsICAgICREUkNDVEwsICVlZGkgICAgICAgICAgICAvKiBzZXR1cCBEUkFNIGNvbnRyb2wgcmVnaXN0ZXIgd2l0aCAqLworICAgICAgICBtb3ZiICAgICQweDEsJWFsICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHJlZnJlc2gsZGlzYWJsZSB3cml0ZSBidWZmZXIgKi8gCitmcwltb3ZiICAgICAlYWwsICglZWRpKQorICAgICAgICBtb3ZsICAgICRDQUNIRUxJTkVTWiwgJWVzaSAgICAgICAvKiBqdXN0IGEgZHVtbXkgYWRkcmVzcyB0byB3cml0ZSBmb3IgKi8gCitmcwltb3Z3ICAgICAlYXgsICglZXNpKQorIC8qCisgICogZGVsYXkgZm9yIDEwMCB1c2VjPyAyMDA/CisgICogKioqKioqdGhpcyBpcyBhIGNsdWRnZSBmb3Igbm93ICoqKioqKioqKioqKioKKyAgKi8KKyAgICAgICAgbW92dyAgICAkMTAwLCVjeAorc2l6ZGVsYXk6IAorICAgICAgICBsb29wICAgIHNpemRlbGF5ICAgICAgICAgICAgICAgICAvKiB3ZSBuZWVkIDEwMCB1c2VjIGhlcmUgKi8KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAvKgorICAqIGlzc3VlIGFsbCBiYW5rcyBwcmVjaGFyZ2UKKyAgKi8KKyAgICAgICAgbW92YiAgICAkMHgyLCVhbCAgICAgICAgICAgICAgICAgLyogQWxsIGJhbmtzIHByZWNoYXJnZSAqLworZnMJbW92YiAgICAgJWFsLCAoJWVkaSkKK2ZzCW1vdncgICAgICVheCwgKCVlc2kpCisKKyAvKgorICAqIGlzc3VlIDIgYXV0byByZWZyZXNoZXMgdG8gYWxsIGJhbmtzIAorICAqLworICAgICAgICBtb3ZiICAgICQweDQsJWFsICAgICAgICAgICAgICAgICAvKiBBdXRvIHJlZnJlc2ggY21kICovCitmcwltb3ZiICAgICAlYWwsICglZWRpKQorICAgICAgICBtb3Z3ICAgICQyLCVjeAorcmVmcmVzaDE6IAorZnMJbW92dyAgICAgJWF4LCAoJWVzaSkKKyAgICAgICAgbG9vcCAgICByZWZyZXNoMQorCisgLyoKKyAgKiBpc3N1ZSBMT0FEIE1PREUgUkVHSVNURVIgY29tbWFuZAorICAqLworICAgICAgICBtb3ZiICAgICQweDMsJWFsICAgICAgICAgICAgICAgICAvKiBMb2FkIG1vZGUgcmVnaXN0ZXIgY21kICovCitmcwltb3ZiICAgICAlYWwsICglZWRpKQorZnMJbW92dyAgICAgJWF4LCAoJWVzaSkKKworIC8qCisgICogaXNzdWUgOCBtb3JlIGF1dG8gcmVmcmVzaGVzIHRvIGFsbCBiYW5rcyAKKyAgKi8gCisgICAgICAgIG1vdmIgICAgJDB4NCwlYWwgICAgICAgICAgICAgICAgIC8qIEF1dG8gcmVmcmVzaCBjbWQgKi8KK2ZzCW1vdmIgICAgICVhbCwgKCVlZGkpCisgICAgICAgIG1vdncgICAgJDgsJWN4CityZWZyZXNoMjogCitmcwltb3Z3ICAgICAlYXgsICglZXNpKQorICAgICAgICBsb29wICAgIHJlZnJlc2gyCisKKyAvKgorICAqIHNldCBjb250cm9sIHJlZ2lzdGVyIHRvIE5PUk1BTCBtb2RlIAorICAqLworICAgICAgICBtb3ZiICAgICQweDAsJWFsICAgICAgICAgICAgICAgICAvKiBOb3JtYWwgbW9kZSB2YWx1ZSAqLworZnMJbW92YiAgICAgJWFsLCAoJWVkaSkKKworIC8qCisgICogc2l6ZSBkcmFtIHN0YXJ0aW5nIHdpdGggZXh0ZXJuYWwgYmFuayAzIG1vdmluZyB0byBleHRlcm5hbCBiYW5rIDAKKyAgKi8KKyAgICAgICAgbW92bCAgICAkMHgzLCVlY3ggICAgICAgICAgICAgICAgLyogc3RhcnQgd2l0aCBleHRlcm5hbCBiYW5rIDMgKi8KKworbmV4dGJhbms6IAorCisgLyoKKyAgKiB3cml0ZSBjb2wgMTEgd3JhcCBhZHIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkQ09MMTFfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gbWF4IGNvbCAoMTEpIHdyYXAgYWRkciAqLworICAgICAgICBtb3ZsICAgICRDT0wxMV9EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciBtYXggc3VwcG9ydGVkIGNvbHVtbnMoMTEpICovCitmcyAgICAgIG1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIG1heCBjb2wgcGF0dGVybiBhdCBtYXggY29sIGFkciAqLworZnMgICAgICBtb3ZsICAgICglZXNpKSwgJWVieCAgICAgICAgICAgICAvKiBvcHRpb25hbCByZWFkICovCisgICAgICAgIGNtcGwgICAgJWVieCwlZWF4ICAgICAgICAgICAgICAgIC8qIHRvIHZlcmlmeSB3cml0ZSAqLworICAgICAgICBqbnogICAgIGJhZF9yYW0gICAgICAgICAgICAgICAgICAvKiB0aGlzIHJhbSBpcyBiYWQgKi8KKyAvKgorICAqIHdyaXRlIGNvbCAxMCB3cmFwIGFkcgorICAqLworCisgICAgICAgIG1vdmwgICAgJENPTDEwX0FEUiwgJWVzaSAgICAgICAgIC8qIHNldCBhZGRyZXNzIHRvIDEwIGNvbCB3cmFwIGFkZHJlc3MgKi8KKyAgICAgICAgbW92bCAgICAkQ09MMTBfREFUQSwgJWVheCAgICAgICAgLyogcGF0dGVybiBmb3IgMTAgY29sIHdyYXAgKi8KK2ZzICAgICAgbW92bCAgICAlZWF4LCAoJWVzaSkgICAgICAgICAgICAgLyogd3JpdGUgMTAgY29sIHBhdHRlcm4gQCAxMCBjb2wgd3JhcCBhZHIgKi8KK2ZzICAgICAgbW92bCAgICAoJWVzaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSBjb2wgOSB3cmFwIGFkcgorICAqLworICAgICAgICBtb3ZsICAgICRDT0wwOV9BRFIsICVlc2kgICAgICAgICAvKiBzZXQgYWRkcmVzcyB0byA5IGNvbCB3cmFwIGFkZHJlc3MgKi8KKyAgICAgICAgbW92bCAgICAkQ09MMDlfREFUQSwgJWVheCAgICAgICAgLyogcGF0dGVybiBmb3IgOSBjb2wgd3JhcCAqLworZnMgICAgICBtb3ZsICAgICVlYXgsICglZXNpKSAgICAgICAgICAgICAvKiB3cml0ZSA5IGNvbCBwYXR0ZXJuIEAgOSBjb2wgd3JhcCBhZHIgKi8KK2ZzICAgICAgbW92bCAgICAoJWVzaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSBjb2wgOCB3cmFwIGFkcgorICAqLworICAgICAgICBtb3ZsICAgICRDT0wwOF9BRFIsICVlc2kgICAgICAgICAvKiBzZXQgYWRkcmVzcyB0byBtaW4oOCkgY29sIHdyYXAgYWRkcmVzcyAqLworICAgICAgICBtb3ZsICAgICRDT0wwOF9EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciBtaW4gKDgpIGNvbCB3cmFwICovCitmcyAgICAgIG1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIG1pbiBjb2wgcGF0dGVybiBAIG1pbiBjb2wgYWRyICovCitmcyAgICAgIG1vdmwgICAgKCVlc2kpLCAlZWJ4ICAgICAgICAgICAgIC8qIG9wdGlvbmFsIHJlYWQgKi8KKyAgICAgICAgY21wbCAgICAlZWJ4LCVlYXggICAgICAgICAgICAgICAgLyogdG8gdmVyaWZ5IHdyaXRlICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbSAgICAgICAgICAgICAgICAgIC8qIHRoaXMgcmFtIGlzIGJhZCAqLworIC8qCisgICogd3JpdGUgcm93IDE0IHdyYXAgYWRyCisgICovCisgICAgICAgIG1vdmwgICAgJFJPVzE0X0FEUiwgJWVzaSAgICAgICAgIC8qIHNldCBhZGRyZXNzIHRvIG1heCByb3cgKDE0KSB3cmFwIGFkZHIgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTRfREFUQSwgJWVheCAgICAgICAgLyogcGF0dGVybiBmb3IgbWF4IHN1cHBvcnRlZCByb3dzKDE0KSAqLworZnMgICAgICBtb3ZsICAgICVlYXgsICglZXNpKSAgICAgICAgICAgICAvKiB3cml0ZSBtYXggcm93IHBhdHRlcm4gYXQgbWF4IHJvdyBhZHIgKi8KK2ZzICAgICAgbW92bCAgICAoJWVzaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSByb3cgMTMgd3JhcCBhZHIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTNfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gMTMgcm93IHdyYXAgYWRkcmVzcyAqLworICAgICAgICBtb3ZsICAgICRST1cxM19EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciAxMyByb3cgd3JhcCAqLworZnMgICAgICBtb3ZsICAgICVlYXgsICglZXNpKSAgICAgICAgICAgICAvKiB3cml0ZSAxMyByb3cgcGF0dGVybiBAIDEzIHJvdyB3cmFwIGFkciAqLworZnMgICAgICBtb3ZsICAgICglZXNpKSwgJWVieCAgICAgICAgICAgICAvKiBvcHRpb25hbCByZWFkICovCisgICAgICAgIGNtcGwgICAgJWVieCwlZWF4ICAgICAgICAgICAgICAgIC8qIHRvIHZlcmlmeSB3cml0ZSAqLworICAgICAgICBqbnogICAgIGJhZF9yYW0gICAgICAgICAgICAgICAgICAvKiB0aGlzIHJhbSBpcyBiYWQgKi8KKyAvKgorICAqIHdyaXRlIHJvdyAxMiB3cmFwIGFkcgorICAqLworICAgICAgICBtb3ZsICAgICRST1cxMl9BRFIsICVlc2kgICAgICAgICAvKiBzZXQgYWRkcmVzcyB0byAxMiByb3cgd3JhcCBhZGRyZXNzICovCisgICAgICAgIG1vdmwgICAgJFJPVzEyX0RBVEEsICVlYXggICAgICAgIC8qIHBhdHRlcm4gZm9yIDEyIHJvdyB3cmFwICovCitmcyAgICAgIG1vdmwgICAgJWVheCwgKCVlc2kpICAgICAgICAgICAgIC8qIHdyaXRlIDEyIHJvdyBwYXR0ZXJuIEAgMTIgcm93IHdyYXAgYWRyICovCitmcyAgICAgIG1vdmwgICAgKCVlc2kpLCAlZWJ4ICAgICAgICAgICAgIC8qIG9wdGlvbmFsIHJlYWQgKi8KKyAgICAgICAgY21wbCAgICAlZWJ4LCVlYXggICAgICAgICAgICAgICAgLyogdG8gdmVyaWZ5IHdyaXRlICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbSAgICAgICAgICAgICAgICAgIC8qIHRoaXMgcmFtIGlzIGJhZCAqLworIC8qCisgICogd3JpdGUgcm93IDExIHdyYXAgYWRyCisgICovCisgICAgICAgIG1vdmwgICAgJFJPVzExX0FEUiwgJWVkaSAgICAgICAgIC8qIHNldCBhZGRyZXNzIHRvIDExIHJvdyB3cmFwIGFkZHJlc3MgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTFfREFUQSwgJWVheCAgICAgICAgLyogcGF0dGVybiBmb3IgMTEgcm93IHdyYXAgKi8KK2ZzICAgICAgbW92bCAgICAlZWF4LCAoJWVkaSkgICAgICAgICAgICAgLyogd3JpdGUgMTEgcm93IHBhdHRlcm4gQCAxMSByb3cgd3JhcCBhZHIgKi8KK2ZzICAgICAgbW92bCAgICAoJWVkaSksICVlYnggICAgICAgICAgICAgLyogb3B0aW9uYWwgcmVhZCAqLworICAgICAgICBjbXBsICAgICVlYngsJWVheCAgICAgICAgICAgICAgICAvKiB0byB2ZXJpZnkgd3JpdGUgKi8KKyAgICAgICAgam56ICAgICBiYWRfcmFtICAgICAgICAgICAgICAgICAgLyogdGhpcyByYW0gaXMgYmFkICovCisgLyoKKyAgKiB3cml0ZSByb3cgMTAgd3JhcCBhZHIgLS0tIHRoaXMgd3JpdGUgaXMgcmVhbGx5IHRvIGRldGVybWluZSBudW1iZXIgb2YgYmFua3MKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTBfQURSLCAlZWRpICAgICAgICAgLyogc2V0IGFkZHJlc3MgdG8gMTAgcm93IHdyYXAgYWRkcmVzcyAqLworICAgICAgICBtb3ZsICAgICRST1cxMF9EQVRBLCAlZWF4ICAgICAgICAvKiBwYXR0ZXJuIGZvciAxMCByb3cgd3JhcCAoQUEpICovCitmcyAgICAgIG1vdmwgICAgJWVheCwgKCVlZGkpICAgICAgICAgICAgIC8qIHdyaXRlIDEwIHJvdyBwYXR0ZXJuIEAgMTAgcm93IHdyYXAgYWRyICovCitmcyAgICAgIG1vdmwgICAgKCVlZGkpLCAlZWJ4ICAgICAgICAgICAgIC8qIG9wdGlvbmFsIHJlYWQgKi8KKyAgICAgICAgY21wbCAgICAlZWJ4LCVlYXggICAgICAgICAgICAgICAgLyogdG8gdmVyaWZ5IHdyaXRlICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbSAgICAgICAgICAgICAgICAgIC8qIHRoaXMgcmFtIGlzIGJhZCAqLworIC8qCisgICogcmVhZCBkYXRhIEAgcm93IDEyIHdyYXAgYWRyIHRvIGRldGVybWluZSAgKiBiYW5rcywgCisgICogYW5kIHJlYWQgZGF0YSBAIHJvdyAxNCB3cmFwIGFkciB0byBkZXRlcm1pbmUgICogcm93cy4KKyAgKiBpZiBkYXRhIEAgcm93IDEyIHdyYXAgYWRyIGlzIG5vdCBBQSwgMTEgb3IgMTIgd2UgaGF2ZSBiYWQgUkFNLgorICAqIGlmIGRhdGEgQCByb3cgMTIgd3JhcCA9PSBBQSwgd2Ugb25seSBoYXZlIDIgYmFua3MsIE5PVCA0IAorICAqIGlmIGRhdGEgQCByb3cgMTIgd3JhcCA9PSAxMSBvciAxMiwgd2UgaGF2ZSA0IGJhbmtzLAorICAqLworICAgICAgICB4b3J3ICAgICVkaSwlZGkgICAgICAgICAgICAgICAgICAvKiB2YWx1ZSBmb3IgMiBiYW5rcyBpbiBESSAqLworZnMgICAgICBtb3ZsICAgICglZXNpKSwgJWVieCAgICAgICAgICAgICAvKiByZWFkIGZyb20gMTIgcm93IHdyYXAgdG8gY2hlY2sgYmFua3MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChlc2kgaXMgc2V0dXAgZnJvbSB0aGUgd3JpdGUgdG8gcm93IDEyIHdyYXApICovCisgICAgICAgIGNtcGwgICAgJWVieCwlZWF4ICAgICAgICAgICAgICAgIC8qIGNoZWNrIGZvciBBQSBwYXR0ZXJuICAoZWF4IGhvbGRzIHRoZSBhYSBwYXR0ZXJuKSAqLworICAgICAgICBqeiAgICAgIG9ubHkyICAgICAgICAgICAgICAgICAgICAvKiBpZiBwYXR0ZXJuID09IEFBLCB3ZSBvbmx5IGhhdmUgMiBiYW5rcyAqLworCisJLyogNCBiYW5rcyAqLworCQorICAgICAgICBtb3Z3ICAgICQ4LCVkaSAgICAgICAgICAgICAgICAgICAvKiB2YWx1ZSBmb3IgNCBiYW5rcyBpbiBESSAoQk5LX0NOVCBiaXQpICovCisgICAgICAgIGNtcGwgICAgJFJPVzExX0RBVEEsICVlYnggICAgICAgIC8qIG9ubHkgb3RoZXIgbGVnaXRpbWF0ZSB2YWx1ZXMgYXJlIDExICovCisgICAgICAgIGp6ICAgICAgb25seTIKKyAgICAgICAgY21wbCAgICAkUk9XMTJfREFUQSwgJWVieCAgICAgICAgLyogYW5kIDEyICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbSAgICAgICAgICAgICAgICAgIC8qIGl0cyBiYWQgaWYgbm90IDExIG9yIDEyISAqLworCQorCS8qIGZhbGwgdGhyb3VnaCAqLworb25seTI6IAorIC8qCisgICogdmFsaWRhdGUgcm93IG1hc2sKKyAgKi8KKyAgICAgICAgbW92bCAgICAkUk9XMTRfQURSLCAlZXNpICAgICAgICAgLyogc2V0IGFkZHJlc3MgYmFjayB0byBtYXggcm93IHdyYXAgYWRkciAqLworZnMgICAgICBtb3ZsICAgICglZXNpKSwgJWVheCAgICAgICAgICAgICAvKiByZWFkIGFjdHVhbCBudW1iZXIgb2Ygcm93cyBAIHJvdzE0IGFkciAqLworCisgICAgICAgIGNtcGwgICAgJFJPVzExX0RBVEEsICVlYXggICAgICAgIC8qIHJvdyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxMSBwYXR0ZXJuICovCisgICAgICAgIGpiICAgICAgYmFkX3JhbQorCisgICAgICAgIGNtcGwgICAgJFJPVzE0X0RBVEEsICVlYXggICAgICAgIC8qIGFuZCByb3cgbXVzdCBiZSBsZXNzIHRoYW4gMTQgcGF0dGVybiAqLworICAgICAgICBqYSAgICAgIGJhZF9yYW0KKworICAgICAgICBjbXBiICAgICVhaCwlYWwgICAgICAgICAgICAgICAgICAvKiB2ZXJpZnkgYWxsIDQgYnl0ZXMgb2YgZHdvcmQgc2FtZSAqLworICAgICAgICBqbnogICAgIGJhZF9yYW0KKyAgICAgICAgbW92bCAgICAlZWF4LCVlYngKKyAgICAgICAgc2hybCAgICAkMTYsJWVieAorICAgICAgICBjbXB3ICAgICVieCwlYXgKKyAgICAgICAgam56ICAgICBiYWRfcmFtCisgLyoKKyAgKiByZWFkIGNvbCAxMSB3cmFwIGFkciBmb3IgcmVhbCBjb2x1bW4gZGF0YSB2YWx1ZQorICAqLworICAgICAgICBtb3ZsICAgICRDT0wxMV9BRFIsICVlc2kgICAgICAgICAvKiBzZXQgYWRkcmVzcyB0byBtYXggY29sICgxMSkgd3JhcCBhZGRyICovCitmcyAgICAgIG1vdmwgICAgKCVlc2kpLCAlZWF4ICAgICAgICAgICAgIC8qIHJlYWQgcmVhbCBjb2wgbnVtYmVyIGF0IG1heCBjb2wgYWRyICovCisgLyoKKyAgKiB2YWxpZGF0ZSBjb2x1bW4gZGF0YQorICAqLworICAgICAgICBjbXBsICAgICRDT0wwOF9EQVRBLCAlZWF4ICAgICAgICAvKiBjb2wgbXVzdCBiZSBncmVhdGVyIHRoYW4gOCBwYXR0ZXJuICovCisgICAgICAgIGpiICAgICAgYmFkX3JhbQorCisgICAgICAgIGNtcGwgICAgJENPTDExX0RBVEEsICVlYXggICAgICAgIC8qIGFuZCByb3cgbXVzdCBiZSBsZXNzIHRoYW4gMTEgcGF0dGVybiAqLworICAgICAgICBqYSAgICAgIGJhZF9yYW0KKworICAgICAgICBzdWJsICAgICRDT0wwOF9EQVRBLCAlZWF4ICAgICAgICAvKiBub3JtYWxpemUgY29sdW1uIGRhdGEgdG8gemVybyAqLworICAgICAgICBqYyAgICAgIGJhZF9yYW0KKyAgICAgICAgY21wYiAgICAlYWgsJWFsICAgICAgICAgICAgICAgICAgLyogdmVyaWZ5IGFsbCA0IGJ5dGVzIG9mIGR3b3JkIGVxdWFsICovCisgICAgICAgIGpueiAgICAgYmFkX3JhbQorICAgICAgICBtb3ZsICAgICVlYXgsJWVkeAorICAgICAgICBzaHJsICAgICQxNiwlZWR4CisgICAgICAgIGNtcHcgICAgJWR4LCVheAorICAgICAgICBqbnogICAgIGJhZF9yYW0KKyAvKgorICAqIG1lcmdlIGJhbmsgYW5kIGNvbCBkYXRhIHRvZ2V0aGVyCisgICovCisgICAgICAgIGFkZHcgICAgJWRpLCVkeCAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIG9mIGJhbmsgYW5kIGNvbCBpbmZvIGluIGRsICovCisgLyoKKyAgKiBmaXggZW5kaW5nIGFkZHIgbWFzayBiYXNlZCB1cG9uIGNvbCBpbmZvCisgICovCisgICAgICAgIG1vdmIgICAgJDMsJWFsCisgICAgICAgIHN1YmIgICAgJWRoLCVhbCAgICAgICAgICAgICAgICAgIC8qIGRoIGNvbnRhaW5zIHRoZSBvdmVyZmxvdyBmcm9tIHRoZSBiYW5rL2NvbCBtZXJnZSAgKi8KKyAgICAgICAgbW92YiAgICAlYmwsJWRoICAgICAgICAgICAgICAgICAgLyogYmwgY29udGFpbnMgdGhlIHJvdyBtYXNrIChhYSwgMDcsIDBmLCAxZiBvciAzZikgKi8KKyAgICAgICAgeGNoZ3cgICAlY3gsJWF4ICAgICAgICAgICAgICAgICAgLyogY3ggPSBheCA9IDMgb3IgMiBkZXBlbmRpbmcgb24gMiBvciA0IGJhbmsgZGV2aWNlICovCisgICAgICAgIHNocmIgICAgJWNsLCVkaAkgICAgICAgICAgICAgICAgIC8qICAqLworICAgICAgICBpbmNiICAgICVkaCAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRpbmcgYWRkciBpcyAxIGdyZWF0ZXIgdGhhbiByZWFsIGVuZCAqLworICAgICAgICB4Y2hndyAgICVjeCwlYXggICAgICAgICAgICAgICAgICAvKiBjeCBpcyBiYW5rIG51bWJlciBhZ2FpbiAqLworIC8qCisgICogaXNzdWUgYWxsIGJhbmtzIHByZWNoYXJnZQorICAqLworYmFkX3JlaW50OiAKKyAgICAgICAgbW92bCAgICAkRFJDQ1RMLCAlZXNpICAgICAgICAgICAgLyogc2V0dXAgRFJBTSBjb250cm9sIHJlZ2lzdGVyIHdpdGggKi8KKyAgICAgICAgbW92YiAgICAkMHgyLCVhbCAgICAgICAgICAgICAgICAgLyogQWxsIGJhbmtzIHByZWNoYXJnZSAqLworZnMJbW92YiAgICAgJWFsLCAoJWVzaSkKKyAgICAgICAgbW92bCAgICAkQ0FDSEVMSU5FU1osICVlc2kgICAgICAgLyogYWRkcmVzcyB0byBpbml0IHJlYWQgYnVmZmVyICovCitmcwltb3Z3ICAgICAlYXgsICglZXNpKQorCisgLyoKKyAgKiB1cGRhdGUgRU5ESU5HIEFERFJFU1MgUkVHSVNURVIKKyAgKi8KKyAgICAgICAgbW92bCAgICAkRFJDQkVOREFEUiwgJWVkaSAgICAgICAgLyogRFJBTSBlbmRpbmcgYWRkcmVzcyByZWdpc3RlciAqLworICAgICAgICBtb3ZsICAgICVlY3gsJWVieAorCWFkZGwJJWVieCwgJWVkaQorZnMJbW92YiAgICAlZGgsICglZWRpKQorIC8qCisgICogdXBkYXRlIENPTkZJRyBSRUdJU1RFUgorICAqLworICAgICAgICB4b3JiICAgICVkaCwlZGgKKyAgICAgICAgbW92dyAgICAkMHgwMGYsJWJ4CisgICAgICAgIG1vdncgICAgJWN4LCVheAorICAgICAgICBzaGx3ICAgICQyLCVheAorICAgICAgICB4Y2hndyAgICVjeCwlYXgKKyAgICAgICAgc2hsdyAgICAlY2wsJWR4CisgICAgICAgIHNobHcgICAgJWNsLCVieAorICAgICAgICBub3R3ICAgICVieAorICAgICAgICB4Y2hndyAgICVjeCwlYXgKKyAgICAgICAgbW92bCAgICAkRFJDQ0ZHLCAlZWRpCitmcwltb3YgICAgICglZWRpKSwgJWF4CisgICAgICAgIGFuZHcgICAgJWJ4LCVheAorICAgICAgICBvcncgICAgICVkeCwlYXgKK2ZzICAgICAgbW92dyAgICAlYXgsICglZWRpKQorICAgICAgICBqY3h6ICAgIGNsZWFudXAKKworICAgICAgICBkZWN3ICAgICVjeAorICAgICAgICBtb3ZsICAgICVlY3gsJWVieAorICAgICAgICBtb3ZsICAgICREUkNCRU5EQURSLCAlZWRpICAgICAgICAvKiBEUkFNIGVuZGluZyBhZGRyZXNzIHJlZ2lzdGVyICovCisgICAgICAgIG1vdmIgICAgJDB4ZmYsJWFsCisJYWRkbAklZWJ4LCAlZWRpCitmcwltb3ZiICAgICVhbCwgKCVlZGkpCisgLyoKKyAgKiBzZXQgY29udHJvbCByZWdpc3RlciB0byBOT1JNQUwgbW9kZSAKKyAgKi8KKyAgICAgICAgbW92bCAgICAkRFJDQ1RMLCAlZXNpICAgICAgICAgICAgLyogc2V0dXAgRFJBTSBjb250cm9sIHJlZ2lzdGVyIHdpdGggKi8KKyAgICAgICAgbW92YiAgICAkMHgwLCVhbCAgICAgICAgICAgICAgICAgLyogTm9ybWFsIG1vZGUgdmFsdWUgKi8KK2ZzCW1vdmIgICAgJWFsLCAoJWVzaSkKKyAgICAgICAgbW92bCAgICAkQ0FDSEVMSU5FU1osICVlc2kgICAgICAgLyogYWRkcmVzcyB0byBpbml0IHJlYWQgYnVmZmVyICovCitmcwltb3Z3ICAgICVheCwgKCVlc2kpCisgICAgICAgIGptcCAgICAgbmV4dGJhbmsKKworY2xlYW51cDogCisgICAgICAgIG1vdmwgICAgJERSQ0JFTkRBRFIsICVlZGkgICAgICAgIC8qIERSQU0gZW5kaW5nIGFkZHJlc3MgcmVnaXN0ZXIgICovCisgICAgICAgIG1vdncgICAgJDQsJWN4CisgICAgICAgIHhvcncgICAgJWF4LCVheAorY2xlYW51cGxwOiAKK2ZzCW1vdmIgICAoJWVkaSksICVhbAorICAgICAgICBvcmIgICAgICVhbCwlYWwKKyAgICAgICAganogICAgICBlbXB0eWJhbmsKKworICAgICAgICBhZGRiICAgICVhaCwlYWwKKyAgICAgICAgam5zICAgICBub3R0b29tdWNoCisKKyAgICAgICAgbW92YiAgICAkMHg3ZiwlYWwKK25vdHRvb211Y2g6IAorICAgICAgICBtb3ZiICAgICVhbCwlYWgKKyAgICAgICAgb3JiICAgICAkMHg4MCwlYWwKK2ZzCW1vdmIgICAgJWFsLCAoJWVkaSkKK2VtcHR5YmFuazogCisgICAgICAgIGluY2wgICAgJWVkaQorICAgICAgICBsb29wICAgIGNsZWFudXBscAorCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fQ0FTX0xBVEVOQ1lfMlQpIHx8IGRlZmluZWQoQ0ZHX1NEUkFNX0NBU19MQVRFTkNZXzNUKQorCS8qIHNldCB0aGUgQ0FTIGxhdGVuY3kgbm93IHNpbmNlIGl0IGlzIGhhcmQgdG8gZG8KKwkgKiB3aGVuIHdlIHJ1biBmcm9tIHRoZSBSQU0gKi8KKwltb3ZsICAgICREUkNUTUNUTCwgJWVkaSAgICAgICAgICAvKiBEUkFNIHRpbWluZyByZWdpc3RlciAqLworCW1vdmIgICAgKCVlZGkpLCAlYWwJCisjaWZkZWYgQ0ZHX1NEUkFNX0NBU19MQVRFTkNZXzJUCisJYW5kYiAgICAkMHhlZiwgJWFsCisjZW5kaWYKKyNpZmRlZiBDRkdfU0RSQU1fQ0FTX0xBVEVOQ1lfM1QKKwlvcmIgICAgICQweDEwLCAlYWwKKyNlbmRpZgkgCisJbW92YiAgICAlYWwsICglZWRpKQorI2VuZGlmCisgICAgICAgIG1vdmwgICAgJERSQ0NUTCwgJWVkaSAgICAgICAgICAgIC8qIERSQU0gQ29udHJvbCByZWdpc3RlciAqLworICAgICAgICBtb3ZiICAgICQweDMsJWFsICAgICAgICAgICAgICAgICAvKiBMb2FkIG1vZGUgcmVnaXN0ZXIgY21kICovCitmcwltb3ZiICAgICAlYWwsICglZWRpKQorZnMJbW92dyAgICAgJWF4LCAoJWVzaSkKKworCisgICAgICAgIG1vdmwgICAgJERSQ0NUTCwgJWVkaSAgICAgICAgICAgIC8qIERSQU0gQ29udHJvbCByZWdpc3RlciAqLworICAgICAgICBtb3ZiICAgICQweDE4LCVhbCAgICAgICAgICAgICAgICAvKiAgRW5hYmxlIHJlZnJlc2ggYW5kIE5PUk1BTCBtb2RlICovCitmcwltb3ZiICAgICVhbCwgKCVlZGkpCisKKyAgICAgICAgam1wICAgICBkcmFtX2RvbmUKKworYmFkX3JhbTogCisgICAgICAgIHhvcmwgICAgJWVkeCwlZWR4CisgICAgICAgIHhvcmwgICAgJWVkaSwlZWRpCisgICAgICAgIGptcCAgICAgYmFkX3JlaW50CisKK2RyYW1fZG9uZTogCisJCisJLyogcmVhZGJhY2sgRFJDQkVOREFEUiBhbmQgcmV0dXJuIHRoZSBudW1iZXIKKwkgKiBvZiBhdmFpbGFibGUgcmFtIGJ5dGVzIGluICVlYXggKi8gCisKKyAgICAgICAgbW92bCAgICAkRFJDQkVOREFEUiwgJWVkaSAgICAgICAgLyogRFJBTSBlbmRpbmcgYWRkcmVzcyByZWdpc3RlciAgKi8KKwkKKwltb3ZsCSglZWRpKSwgJWVheAorCW1vdmwJJWVheCwgJWVjeAorCWFuZGwJJDB4ODAwMDAwMDAsICVlY3gKKwlqegliYW5rMgorCWFuZGwJJDB4N2YwMDAwMDAsICVlYXgKKwlzaHJsCSQyLCAlZWF4IAorCW1vdmwJJWVheCwgJWVieAorCitiYW5rMjogCW1vdmwJKCVlZGkpLCAlZWF4CisJbW92bAklZWF4LCAlZWN4CisJYW5kbAkkMHgwMDgwMDAwMCwgJWVjeAorCWp6CWJhbmsxCisJYW5kbAkkMHgwMDdmMDAwMCwgJWVheAorCXNobGwJJDYsICVlYXggCisJbW92bAklZWF4LCAlZWJ4CisKK2JhbmsxOiAJbW92bAkoJWVkaSksICVlYXgKKwltb3ZsCSVlYXgsICVlY3gKKwlhbmRsCSQweDAwMDA4MDAwLCAlZWN4CisJanoJYmFuazAKKwlhbmRsCSQweDAwMDA3ZjAwLCAlZWF4CisJc2hsbAkkMTQsICVlYXggCisJbW92bAklZWF4LCAlZWJ4CisKK2JhbmswOiAJbW92bAkoJWVkaSksICVlYXgKKwltb3ZsCSVlYXgsICVlY3gKKwlhbmRsCSQweDAwMDAwMDgwLCAlZWN4CisJanoJZG9uZQorCWFuZGwJJDB4MDAwMDAwN2YsICVlYXgKKwlzaGxsCSQyMiwgJWVheCAKKwltb3ZsCSVlYXgsICVlYngKKworZG9uZToJbW92bAklZWJ4LCAlZWF4CisKKwlqbXAJKiVlYnAKZGlmZiAtLWdpdCBhL2xpYl9pMzg2L3BjaV90eXBlMS5jIGIvbGliX2kzODYvcGNpX3R5cGUxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1NzdlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L3BjaV90eXBlMS5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBTdXBwb3J0IGZvciB0eXBlIFBDSSBjb25maWd1cmF0aW9uIGN5Y2xlcy4KKyAqIGJhc2VkIG9uIHBjaV9pbmRpcmVjdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19QQ0kKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworI2RlZmluZSBjZmdfcmVhZCh2YWwsIGFkZHIsIHR5cGUsIG9wKQkqdmFsID0gb3AoKHR5cGUpKGFkZHIpKQorI2RlZmluZSBjZmdfd3JpdGUodmFsLCBhZGRyLCB0eXBlLCBvcCkJb3AoKHZhbCksICh0eXBlICopKGFkZHIpKQorCisjZGVmaW5lIFRZUEUxX1BDSV9PUChydywgc2l6ZSwgdHlwZSwgb3AsIG1hc2spCQkJIFwKK3N0YXRpYyBpbnQJCQkJCQkJCSBcCit0eXBlMV8jI3J3IyNfY29uZmlnXyMjc2l6ZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIAkJIFwKKwkJCSAgICAgIHBjaV9kZXZfdCBkZXYsIGludCBvZmZzZXQsIHR5cGUgdmFsKQkgXAorewkJCQkJCQkJCSBcCisJb3V0bChkZXYgfCAob2Zmc2V0ICYgMHhmYykgfCAweDgwMDAwMDAwLCBob3NlLT5jZmdfYWRkcik7IAkgXAorCWNmZ18jI3J3KHZhbCwgaG9zZS0+Y2ZnX2RhdGEgKyAob2Zmc2V0ICYgbWFzayksIHR5cGUsIG9wKTsJIFwKKwlyZXR1cm4gMDsgICAgCQkJCQkgCQkgXAorfQorCisKK1RZUEUxX1BDSV9PUChyZWFkLCBieXRlLCB1OCAqLCBpbmIsIDMpCitUWVBFMV9QQ0lfT1AocmVhZCwgd29yZCwgdTE2ICosIGludywgMikKK1RZUEUxX1BDSV9PUChyZWFkLCBkd29yZCwgdTMyICosIGlubCwgMCkKKworVFlQRTFfUENJX09QKHdyaXRlLCBieXRlLCB1OCwgb3V0YiwgMykKK1RZUEUxX1BDSV9PUCh3cml0ZSwgd29yZCwgdTE2LCBvdXR3LCAyKQorVFlQRTFfUENJX09QKHdyaXRlLCBkd29yZCwgdTMyLCBvdXRsLCAwKQorCit2b2lkIHBjaV9zZXR1cF90eXBlMShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQoreworCXBjaV9zZXRfb3BzKGhvc2UsCisJCSAgICB0eXBlMV9yZWFkX2NvbmZpZ19ieXRlLAorCQkgICAgdHlwZTFfcmVhZF9jb25maWdfd29yZCwKKwkJICAgIHR5cGUxX3JlYWRfY29uZmlnX2R3b3JkLAorCQkgICAgdHlwZTFfd3JpdGVfY29uZmlnX2J5dGUsCisJCSAgICB0eXBlMV93cml0ZV9jb25maWdfd29yZCwKKwkJICAgIHR5cGUxX3dyaXRlX2NvbmZpZ19kd29yZCk7CisKKwlob3NlLT5jZmdfYWRkciA9ICh1bnNpZ25lZCBpbnQgKikgY2ZnX2FkZHI7CisJaG9zZS0+Y2ZnX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKSBjZmdfZGF0YTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9yZWFsbW9kZS5jIGIvbGliX2kzODYvcmVhbG1vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzIxNDdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliX2kzODYvcmVhbG1vZGUuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UKKyAqIAorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworCisjZGVmaW5lIFJFQUxNT0RFX0JBU0UgICAgKChjaGFyKikweDdjMCkKKyNkZWZpbmUgUkVBTE1PREVfTUFJTEJPWCAoKGNoYXIqKTB4ZTAwKQorCisKK2V4dGVybiBjaGFyIHJlYWxtb2RlX2VudGVyOworCisKK2ludCBlbnRlcl9yZWFsbW9kZSh1MTYgc2VnLCB1MTYgb2ZmLCBzdHJ1Y3QgcHRfcmVncyAqaW4sIHN0cnVjdCBwdF9yZWdzICpvdXQpCit7CisJCisJLyogc2V0dXAgb3V0IHRoaW4gYmlvcyBlbXVsYXRpb24gKi8KKwlpZiAoYmlvc19zZXR1cCgpKSB7CisJCXJldHVybiAtMTsKKwl9CisJCQorCS8qIGNvcHkgdGhlIHJlYWxtb2RlIHN3aXRjaCBjb2RlICovCisJaWYgKGkzODZib290X3JlYWxtb2RlX3NpemUgPiAoUkVBTE1PREVfTUFJTEJPWC1SRUFMTU9ERV9CQVNFKSkgeworCQlwcmludGYoInJlYWxtb2RlIHN3aXRjaCB0b28gbGFyZ2UgKCVsZCBieXRlcywgbWF4IGlzICVkKVxuIiwgCisJCSAgICAgICBpMzg2Ym9vdF9yZWFsbW9kZV9zaXplLCAoUkVBTE1PREVfTUFJTEJPWC1SRUFMTU9ERV9CQVNFKSk7CisJCXJldHVybiAtMTsKKwl9CisJCisJbWVtY3B5KFJFQUxNT0RFX0JBU0UsIGkzODZib290X3JlYWxtb2RlLCBpMzg2Ym9vdF9yZWFsbW9kZV9zaXplKTsKKwkJCisJCisJaW4tPmVpcCA9IG9mZjsKKwlpbi0+eGNzID0gc2VnOworCWlmICgzPmluLT5lc3AgJiAweGZmZmYpIHsKKwkJcHJpbnRmKCJXYXJuaW5nOiBlbnRlcmluZyByZWFsbW9kZSB3aXRoIHNwIDwgNCB3aWxsIGZhaWxcbiIpOworCX0KKwkKKwltZW1jcHkoUkVBTE1PREVfTUFJTEJPWCwgaW4sIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCQorCV9fYXNtX18gdm9sYXRpbGUgKCAKKwkJICJsY2FsbCAkMHgyMCwlMFxuIiAgOiA6ICAiaSIgKCZyZWFsbW9kZV9lbnRlcikgKTsKKworCW1lbWNweShvdXQsIFJFQUxNT0RFX01BSUxCT1gsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCisJcmV0dXJuIG91dC0+ZWF4OworfQorCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9yZWFsbW9kZV9zd2l0Y2guUyBiL2xpYl9pMzg2L3JlYWxtb2RlX3N3aXRjaC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMjEyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJfaTM4Ni9yZWFsbW9kZV9zd2l0Y2guUwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIsIGRhbmllbEBvbWljcm9uLnNlCisgKiAKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKworLyogMzJiaXQgLT4gMTZiaXQgLT4gMzJiaXQgbW9kZSBzd2l0Y2ggY29kZSAqLworCisvKgorICogU3RhY2sgZnJhbWUgYXQgMHhlMDAKKyAqICAgICAgZTAwIGVieDsKKyAqCWUwNCBlY3g7CisgKgllMDggZWR4OworICoJZTBjIGVzaTsKKyAqCWUxMCBlZGk7CisgKgllMTQgZWJwOyAKKyAqCWUxOCBlYXg7CisgKgllMWMgZHM7ICAKKyAqCWUyMCBlczsKKyAqCWUyNCBmczsgIAorICoJZTI4IGdzOworICoJZTJjIG9yaWdfZWF4OworICoJZTMwIGVpcDsKKyAqCWUzNCBjczsKKyAqCWUzOCBlZmxhZ3M7CisgKgllM2MgZXNwOworICoJZTQwIHNzOworICovCisKKyNkZWZpbmUgYTMyCQkuYnl0ZSAweDY3OwkJLyogYWRkcmVzcyBzaXplIHByZWZpeCAzMiAqLworI2RlZmluZSBvMzIJCS5ieXRlIDB4NjY7CQkvKiBvcGVyYW5kIHNpemUgcHJlZml4IDMyICovIAorCisuc2VjdGlvbiAucmVhbG1vZGUsICJheCIKKy5jb2RlMTYKKworCQkJCQkJLyogMTZiaXQgcHJvdGVjdGVkIG1vZGUgY29kZSBoZXJlICovCisuZ2xvYmwgcmVhbG1vZGVfZW50ZXIKK3JlYWxtb2RlX2VudGVyOgorbzMyCXB1c2hhCitvMzIJcHVzaGYKKwljbGkKKyAgICAgICAgc2lkdCAgIAlzYXZlZF9pZHQKKyAgICAgICAgc2dkdCAgICBzYXZlZF9nZHQKKyAgICAgICAgbW92bCAgICAlZXNwLCAlZWF4CisgICAgICAgIG1vdmwgICAgJWVheCwgc2F2ZWRfcHJvdGVjdGVkX21vZGVfZXNwCisJCisJbW92bAkkMHgxMCwgJWVheAorCW1vdmwgICAgJWVheCwgJWVzcAorCW1vdncJJDB4MjgsICVheAorCW1vdncJJWF4LCAlZHMKKwltb3Z3CSVheCwgJWVzCisJbW92dwklYXgsICVmcworCW1vdncJJWF4LCAlZ3MKKworCWxpZHQJcmVhbG1vZGVfaWR0X3B0cgorCW1vdmwJJWNyMCwgJWVheCAgICAgICAgICAgICAgICAJLyogR28gYmFjayBpbnRvIHJlYWwgbW9kZSBieSAqLworCWFuZGwJJDB4N2ZmZmZmZmUsICVlYXggICAgICAgICAJLyogY2xlYXJpbmcgUEUgdG8gMCAqLworCW1vdmwJJWVheCwgJWNyMAorCWxqbXAJJDB4MCwkZG9fcmVhbG1vZGUgICAgICAgICAgICAgCS8qIHN3aXRjaCB0byByZWFsIG1vZGUgKi8KKwkJCQkJCQorZG9fcmVhbG1vZGU6CQkJCQkvKiByZWFsbW9kZSBjb2RlIGZyb20gaGVyZSAqLyAKKwltb3Z3CSVjcywlYXgKKwltb3Z3CSVheCwlZHMKKwltb3Z3CSVheCwlZXMKKwltb3Z3CSVheCwlZnMKKwltb3Z3CSVheCwlZ3MKKwkKKwkJCQkJCS8qIGNyZWF0ZSBhIHRlbXBvcmFyeSBzdGFjayAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwltb3Z3CSQweGMwLCAlYXggICAgICAgICAgICAgCisJbW92dwklYXgsICVzcyAgICAgICAgICAgICAgICAKKwltb3Z3CSQweDIwMCwgJWF4ICAgICAgICAgICAKKwltb3Z3CSVheCwgJXNwIAorCQorCXBvcGwJJWVieAorCXBvcGwJJWVjeAorCXBvcGwJJWVkeAorCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXBvcGwJJWVicAorCXBvcGwJJWVheAorCW1vdmwJJWVheCwgdGVtcF9lYXgKKwlwb3BsCSVlYXgKKwltb3Z3CSVheCwgJWRzCisJcG9wbAklZWF4CisJbW92dwklYXgsICVlcworCXBvcGwJJWVheAorCW1vdncJJWF4LCAlZnMKKwlwb3BsCSVlYXgKKwltb3Z3CSVheCwgJWdzCisJcG9wbAklZWF4CQkJCS8qIG9yaWdfZWF4ICovCisJcG9wbAklZWF4Citjcwltb3Z3CSVheCwgdGVtcF9pcAorCXBvcGwJJWVheAorY3MJbW92dwklYXgsIHRlbXBfY3MKK28zMglwb3BmCisJcG9wbAklZWF4CisJcG9wdwklc3MKKwltb3ZsCSVlYXgsICVlc3AKK2NzCW1vdmwJdGVtcF9lYXgsICVlYXgKKwl3YmludmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VsZi1tb2RpZnlpbmcgY29kZSwKKwkJCQkJCSAqIGJldHRlciBmbHVzaCB0aGUgY2FjaGUgKi8KKwkKKwkuYnl0ZQkweDlhCQkJCS8qIGxjYWxsICovCit0ZW1wX2lwOgorCS53b3JkCTAJICAgICAJCQkvKiBuZXcgaXAgKi8KK3RlbXBfY3M6CQorCS53b3JkICAgMAkJCQkvKiBuZXcgY3MgKi8KK3JlYWxtb2RlX3JldDoKKwkJCQkJCS8qIHNhdmUgZWF4LCBlc3AgYW5kIHNzICovCitjcwltb3ZsCSVlYXgsIHNhdmVkX2VheAorCW1vdmwJJWVzcCwgJWVheAorY3MJbW92bAklZWF4LCBzYXZlZF9lc3AKKwltb3Z3ICAgICVzcywgJWF4Citjcwltb3Z3CSVheCwgc2F2ZWRfc3MKKwkKKwkvKiByZXN0b3JlIHRoZSBzdGFjaywgbm90ZSB0aGF0IHdlIHNldCBzcCB0byAweDI0NDsKKwkgKiBwdF9yZWdzIGlzIDB4NDQgYnl0ZXMgbG9uZyBhbmQgd2UgcHVzaCB0aGUgc3RydWN0dXJlCisJICogYmFja3dhcmRzIG9uIHRvIHRoZSBzdGFjaywgYm90dG9tIGZpcnN0ICovCisJIAorCW1vdncJJDB4YzAsICVheCAgICAgICAgICAgICAKKwltb3Z3CSVheCwgJXNzICAgICAgICAgICAgICAgIAorCW1vdncJJDB4MjQ0LCAlYXggICAgICAgICAgIAorCW1vdncJJWF4LCAlc3AgCisJCisJeG9ybAklZWF4LCVlYXgKK2NzCW1vdncJc2F2ZWRfc3MsICVheAorCXB1c2hsCSVlYXgKK2NzCW1vdmwJc2F2ZWRfZXNwLCAlZWF4CisJcHVzaGwJJWVheAorbzMyCXB1c2hmCisJeG9ybAklZWF4LCVlYXgKK2NzCW1vdncJdGVtcF9jcywgJWF4CisJcHVzaGwJJWVheAorY3MJbW92dwl0ZW1wX2lwLCAlYXgKKwlwdXNobAklZWF4CisJcHVzaGwJJDAKKwltb3Z3CSVncywgJWF4CisJcHVzaGwJJWVheAorCW1vdncJJWZzLCAlYXgKKwlwdXNobAklZWF4CisJbW92dwklZXMsICVheAorCXB1c2hsCSVlYXgKKwltb3Z3CSVkcywgJWF4CisJcHVzaGwJJWVheAorCW1vdmwJc2F2ZWRfZWF4LCAlZWF4CisJcHVzaGwJJWVheAorCXB1c2hsCSVlYnAKKwlwdXNobAklZWRpCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZHgKKwlwdXNobAklZWN4CisJcHVzaGwJJWVieAorCitvMzIgY3MJbGlkdAlzYXZlZF9pZHQKK28zMiBjcwlsZ2R0ICAgIHNhdmVkX2dkdAkJCS8qIFNldCBHRFRSICovCisKKyAgICAgICAgbW92bCAgICAlY3IwLCAlZWF4ICAgICAgICAgICAgICAJLyogR28gYmFjayBpbnRvIHByb3RlY3RlZCBtb2RlICovCisgICAgICAgIG9ybCAgICAgJDEsJWVheCAgICAgICAgICAgICAgICAgCS8qIHJlc2V0IFBFIHRvIDEgKi8KKyAgICAgICAgbW92bCAgICAlZWF4LCAlY3IwICAgICAgICAgICAgICAgCisgICAgICAgIGptcCAgICAgbmV4dF9saW5lICAgICAgICAgICAgICAgCS8qIGZsdXNoIHByZWZldGNoIHF1ZXVlICovCituZXh0X2xpbmU6ICAgIAorICAgICAgICBtb3Z3CSRyZXR1cm5fcHRyLCAlYXggICAgICAgICAgCisgICAgICAgIG1vdncgICAgJWF4LCVicAorbzMyIGNzCWxqbXAJKiglYnApCisKKy5jb2RlMzIKK3Byb3RlY3RlZF9tb2RlOgorICAgICAgICBtb3ZsICAgICQweDE4LCVlYXggICAgICAgICAJCS8qIHJlbG9hZCBHRFRbM10gKi8KKyAgICAgICAgbW92dyAgICAlYXgsJWZzICAgICAgICAgICAgICAgICAJLyogcmVzZXQgRlMgKi8KKwltb3Z3CSVheCwlZHMgICAgICAgICAgICAgICAgCQkvKiByZXNldCBEUyAqLworICAgICAgICBtb3Z3ICAgICVheCwlZ3MgICAgICAgICAgICAgICAgIAkvKiByZXNldCBHUyAqLworICAgICAgICBtb3Z3ICAgICVheCwlZXMgICAgICAgICAgICAgICAgIAkvKiByZXNldCBFUyAqLworICAgICAgICBtb3Z3ICAgICVheCwlc3MgICAgICAgICAgICAgICAgIAkvKiByZXNldCBTUyAqLworICAgICAgICBtb3ZsICAgIHNhdmVkX3Byb3RlY3RlZF9tb2RlX2VzcCwgJWVheAorCW1vdmwJJWVheCwgJWVzcAorCXBvcGYKKwlwb3BhCisgICAgICAgIHJldAorCit0ZW1wX2VheDoKKwkubG9uZwkwCisKK3NhdmVkX3NzOgorCS53b3JkICAgMAorc2F2ZWRfZXNwOgorCS5sb25nCTAKK3NhdmVkX2VheDoKKwkubG9uZwkwCisJCityZWFsbW9kZV9pZHRfcHRyOgorCS53b3JkCTB4NDAwCQkJICAgICAgIAorCS53b3JkCTB4MCwgMHgwCQkKKwkKK3NhdmVkX2dkdDogIAorICAJLndvcmQgCTAsIDAsIDAsIDAKK3NhdmVkX2lkdDoKKyAgCS53b3JkIAkwLCAwLCAwLCAwCisKK3NhdmVkX3Byb3RlY3RlZF9tb2RlX2VzcDoKKwkubG9uZyAJMAorCQorcmV0dXJuX3B0cjoKKwkubG9uZwlwcm90ZWN0ZWRfbW9kZQorCS53b3JkCTB4MTAKZGlmZiAtLWdpdCBhL2xpYl9pMzg2L3ppbWFnZS5jIGIvbGliX2kzODYvemltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwZDQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L3ppbWFnZS5jCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UKKyAqIAorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogCisgKiBMaW51eCBpMzg2IHpJbWFnZSBhbmQgYnpJbWFnZSBsb2FkaW5nCisgKiAKKyAqIGJhc2VkIG9uIHRoZSBwcm9jZHVyZSBkZXNjcmliZWQgaW4gCisgKiBsaW51eC9Eb2N1bWVudGF0aW9uL2kzODYvYm9vdC50eHQKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS96aW1hZ2UuaD4KKyNpbmNsdWRlIDxhc20vcmVhbG1vZGUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKiBNZW1vcnkgbGF5LW91dDoKKyAqIAorICogcmVsYXRpdmUgdG8gc2V0dXBfYmFzZSAod2hpY2ggaXMgMHg5MDAwMCBjdXJyZW50bHkpCisgKiAKKyAqCTB4MDAwMC0weDdGRkYJUmVhbCBtb2RlIGtlcm5lbCAgIAorICoJMHg4MDAwLTB4OEZGRglTdGFjayBhbmQgaGVhcAorICoJMHg5MDAwLTB4OTBGRglLZXJuZWwgY29tbWFuZCBsaW5lCisgKi8KKyNkZWZpbmUgREVGQVVMVF9TRVRVUF9CQVNFICAweDkwMDAwCisjZGVmaW5lIENPTU1BTkRfTElORV9PRkZTRVQgMHg5MDAwCisjZGVmaW5lIEhFQVBfRU5EX09GRlNFVCAgICAgMHg4ZTAwCisKKyNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUgICAyMDQ4CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2NvbW1hbmRfbGluZShjaGFyICpjb21tYW5kX2xpbmUsIGludCBhdXRvX2Jvb3QpCit7CisJY2hhciAqZW52X2NvbW1hbmRfbGluZTsKKwkKKwljb21tYW5kX2xpbmVbMF0gPSAnXDAnOworCQorCWVudl9jb21tYW5kX2xpbmUgPSAgZ2V0ZW52KCJib290YXJncyIpOworCQorCS8qIHNldCBjb25zb2xlPSBhcmd1bWVudCBpZiB3ZSB1c2UgYSBzZXJpYWwgY29uc29sZSAqLworCWlmIChOVUxMID09IHN0cnN0cihlbnZfY29tbWFuZF9saW5lLCAiY29uc29sZT0iKSkgeworCQlpZiAoMD09c3RyY21wKGdldGVudigic3Rkb3V0IiksICJzZXJpYWwiKSkgeworCQkJCisJCQkvKiBXZSBzZWVtIHRvIHVzZSBzZXJpYWwgY29uc29sZSAqLworCQkJc3ByaW50Zihjb21tYW5kX2xpbmUsICJjb25zb2xlPXR0eVMwLCVzICIsIAorCQkJCSBnZXRlbnYoImJhdWRyYXRlIikpOworCQl9CisJfQorCQorCWlmIChhdXRvX2Jvb3QpIHsKKwkJc3RyY2F0KGNvbW1hbmRfbGluZSwgImF1dG8gIik7CisJfQorCQkKKwlpZiAoTlVMTCAhPSBlbnZfY29tbWFuZF9saW5lKSB7CisJCXN0cmNhdChjb21tYW5kX2xpbmUsIGVudl9jb21tYW5kX2xpbmUpOworCX0gCisJCisJCisJcHJpbnRmKCJLZXJuZWwgY29tbWFuZCBsaW5lOiBcIiVzXCJcbiIsIGNvbW1hbmRfbGluZSk7Cit9CisKK3ZvaWQgKmxvYWRfemltYWdlKGNoYXIgKmltYWdlLCB1bnNpZ25lZCBsb25nIGtlcm5lbF9zaXplLCAKKwkJICB1bnNpZ25lZCBsb25nIGluaXRyZF9hZGRyLCB1bnNpZ25lZCBsb25nIGluaXRyZF9zaXplLAorCQkgIGludCBhdXRvX2Jvb3QpCit7CisgICAgICAgIHZvaWQgKnNldHVwX2Jhc2U7CisJaW50IHNldHVwX3NpemU7CisJaW50IGJvb3Rwcm90bzsKKwlpbnQgYmlnX2ltYWdlOworCXZvaWQgKmxvYWRfYWRkcmVzczsKKwkKKwkKKwlzZXR1cF9iYXNlID0gKHZvaWQqKURFRkFVTFRfU0VUVVBfQkFTRTsJLyogYmFzZSBhZGRyZXNzIGZvciByZWFsLW1vZGUgc2VnbWVudCAqLworCQorIAlpZiAoS0VSTkVMX01BR0lDICE9ICoodTE2KikoaW1hZ2UgKyBCT09UX0ZMQUdfT0ZGKSkgeworCQlwcmludGYoIkVycm9yOiBJbnZhbGlkIGtlcm5lbCBtYWdpYyAoZm91bmQgMHglMDR4LCBleHBlY3RlZCAweGFhNTUpXG4iLAorCQkgICAgICAgKih1MTYqKShpbWFnZSArIEJPT1RfRkxBR19PRkYpKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCQorCS8qIGRldGVybWluZSBib290IHByb3RvY29sIHZlcnNpb24gKi8KKwlpZiAoS0VSTkVMX1YyX01BR0lDID09ICoodTMyKikoaW1hZ2UrSEVBREVSX09GRikpIHsKKwkJYm9vdHByb3RvID0gKih1MTYqKShpbWFnZStWRVJTSU9OX09GRik7CisJfSBlbHNlIHsKKwkJLyogVmVyeSBvbGQga2VybmVsICovCisJCWJvb3Rwcm90byA9IDB4MDEwMDsKKwl9CisJCisJLyogZGV0ZXJtaW5lIHNpemUgb2Ygc2V0dXAgKi8KKwlpZiAoMCA9PSAqKHU4KikoaW1hZ2UgKyBTRVRVUF9TRUNUU19PRkYpKSB7CisJCXNldHVwX3NpemUgPSA1ICogNTEyOworCX0gZWxzZSB7CisJCXNldHVwX3NpemUgPSAoKih1OCopKGltYWdlICsgU0VUVVBfU0VDVFNfT0ZGKSArIDEpICogNTEyOworCX0KKwkKKwlpZiAoc2V0dXBfc2l6ZSA+IFNFVFVQX01BWF9TSVpFKSB7CisJCXByaW50ZigiRXJyb3I6IFNldHVwIGlzIHRvbyBsYXJnZSAoJWQgYnl0ZXMpXG4iLCBzZXR1cF9zaXplKTsKKwl9CisJCisJLyogRGV0ZXJtaW5lIGltYWdlIHR5cGUgKi8KKyAgCWJpZ19pbWFnZSA9IChib290cHJvdG8gPj0gMHgwMjAwKSAmJiAoKih1OCopKGltYWdlICsgTE9BREZMQUdTX09GRikgJiBCSUdfS0VSTkVMX0ZMQUcpOworCQorCS8qIERlcmVybWluZSBsb2FkIGFkZHJlc3MgKi8KKwlsb2FkX2FkZHJlc3MgPSAodm9pZCopKGJpZ19pbWFnZSA/IEJaSU1BR0VfTE9BRF9BRERSOlpJTUFHRV9MT0FEX0FERFIpOworCQkJCisJLyogbG9hZCBzZXR1cCAqLworCW1lbW1vdmUoc2V0dXBfYmFzZSwgaW1hZ2UsIHNldHVwX3NpemUpOworCQorCXByaW50ZigiVXNpbmcgYm9vdCBwcm90b2NvbCB2ZXJzaW9uICV4LiUwMnhcbiIsIAorCSAgICAgICAoYm9vdHByb3RvICYgMHhmZjAwKSA+PiA4LCBib290cHJvdG8gJiAweGZmKTsKKwkKKwkKKwlpZiAoYm9vdHByb3RvID09IDB4MDEwMCkgewkJCisJCisJCSoodTE2Kikoc2V0dXBfYmFzZSArIENNRF9MSU5FX01BR0lDX09GRikgPSBDT01NQU5EX0xJTkVfTUFHSUM7CisJCSoodTE2Kikoc2V0dXBfYmFzZSArIENNRF9MSU5FX09GRlNFVF9PRkYpID0gQ09NTUFORF9MSU5FX09GRlNFVDsgCisJCQorCQkvKiBBIHZlcnkgb2xkIGtlcm5lbCBNVVNUIGhhdmUgaXRzIHJlYWwtbW9kZSBjb2RlCisJCSAqIGxvYWRlZCBhdCAweDkwMDAwICovCisJCQorCQlpZiAoKHUzMilzZXR1cF9iYXNlICE9IDB4OTAwMDApIHsKKwkJCS8qIENvcHkgdGhlIHJlYWwtbW9kZSBrZXJuZWwgKi8KKwkJCW1lbW1vdmUoKHZvaWQqKTB4OTAwMDAsIHNldHVwX2Jhc2UsIHNldHVwX3NpemUpOworCQkJLyogQ29weSB0aGUgY29tbWFuZCBsaW5lICovCisJCQltZW1tb3ZlKCh2b2lkKikweDk5MDAwLCBzZXR1cF9iYXNlK0NPTU1BTkRfTElORV9PRkZTRVQsIAorCQkJICAgICAgIENPTU1BTkRfTElORV9TSVpFKTsKKwkJCQorCQkJc2V0dXBfYmFzZSA9ICh2b2lkKikweDkwMDAwOwkJIC8qIFJlbG9jYXRlZCAqLworCQl9CisJCQorCQkvKiBJdCBpcyByZWNvbW1lbmRlZCB0byBjbGVhciBtZW1vcnkgdXAgdG8gdGhlIDMySyBtYXJrICovCisJCW1lbXNldCgodm9pZCopMHg5MDAwMCArIHNldHVwX3NpemUsIDAsIFNFVFVQX01BWF9TSVpFLXNldHVwX3NpemUpOworCX0KKwkKKwlpZiAoYm9vdHByb3RvID49IDB4MDIwMCkgeworCQkqKHU4Kikoc2V0dXBfYmFzZSArIFRZUEVfT0ZfTE9BREVSX09GRikgPSAweGZmOworCQlwcmludGYoIkxpbnV4IGtlcm5lbCB2ZXJzaW9uICVzXG4iLCAKKwkJICAgICAgIChjaGFyKikoc2V0dXBfYmFzZSArIFNFVFVQX1NUQVJUX09GRlNFVCArIAorCQkJICAgICAgICoodTE2Kikoc2V0dXBfYmFzZSArIFNUQVJUX1NZU19PRkYgKyAyKSkpOworCQkKKwkJaWYgKGluaXRyZF9hZGRyKSB7CisJCQlwcmludGYoIkluaXRpYWwgUkFNIGRpc2sgYXQgbGluZWFyIGFkZHJlc3MgMHglMDhseCwgc2l6ZSAlbGQgYnl0ZXNcbiIsCisJCQkgICAgICAgaW5pdHJkX2FkZHIsIGluaXRyZF9zaXplKTsKKwkJCQorCQkJKih1MzIqKShzZXR1cF9iYXNlICsgUkFNRElTS19JTUFHRV9PRkYpID0gaW5pdHJkX2FkZHI7CisJCQkqKHUzMiopKHNldHVwX2Jhc2UgKyBSQU1ESVNLX1NJWkVfT0ZGKT1pbml0cmRfc2l6ZTsKKwkJfQorCX0KKwkKKwlpZiAoYm9vdHByb3RvID49IDB4MDIwMSkgeworCQkqKHUxNiopKHNldHVwX2Jhc2UgKyBIRUFQX0VORF9QVFJfT0ZGKSA9IEhFQVBfRU5EX09GRlNFVDsKKwkJCisJCS8qIENBTl9VU0VfSEVBUCAqLworCQkqKHU4Kikoc2V0dXBfYmFzZSArIExPQURGTEFHU19PRkYpID0gCisJCQkqKHU4Kikoc2V0dXBfYmFzZSArIExPQURGTEFHU19PRkYpIHwgSEVBUF9GTEFHOworCX0KKwkKKwlpZiAoYm9vdHByb3RvID49IDB4MDIwMikgeworCQkqKHUzMiopKHNldHVwX2Jhc2UgKyBDTURfTElORV9QVFJfT0ZGKSA9ICh1MzIpc2V0dXBfYmFzZSArIENPTU1BTkRfTElORV9PRkZTRVQ7CisJfSBlbHNlIGlmIChib290cHJvdG8gPj0gMHgwMjAwKSB7CisJCSoodTE2Kikoc2V0dXBfYmFzZSArIENNRF9MSU5FX01BR0lDX09GRikgPSBDT01NQU5EX0xJTkVfTUFHSUM7CisJCSoodTE2Kikoc2V0dXBfYmFzZSArIENNRF9MSU5FX09GRlNFVF9PRkYpID0gQ09NTUFORF9MSU5FX09GRlNFVDsgCisJCSoodTE2Kikoc2V0dXBfYmFzZSArIFNFVFVQX01PVkVfU0laRV9PRkYpID0gMHg5MTAwOworCX0KKwkKKworCQorCWlmIChiaWdfaW1hZ2UpIHsKKwkJaWYgKChrZXJuZWxfc2l6ZSAtIHNldHVwX3NpemUpID4gQlpJTUFHRV9NQVhfU0laRSkgeyAKKwkJCXByaW50ZigiRXJyb3I6IGJ6SW1hZ2Uga2VybmVsIHRvbyBiaWchIChzaXplOiAlbGQsIG1heDogJWQpXG4iLAorCQkJICAgICAgIGtlcm5lbF9zaXplIC0gc2V0dXBfc2l6ZSwgQlpJTUFHRV9NQVhfU0laRSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwl9IGVsc2UgaWYgKChrZXJuZWxfc2l6ZSAtIHNldHVwX3NpemUpID4gWklNQUdFX01BWF9TSVpFKSB7CisJCXByaW50ZigiRXJyb3I6IHpJbWFnZSBrZXJuZWwgdG9vIGJpZyEgKHNpemU6ICVsZCwgbWF4OiAlZClcbiIsCisJCSAgICAgICBrZXJuZWxfc2l6ZSAtIHNldHVwX3NpemUsIFpJTUFHRV9NQVhfU0laRSk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBidWlsZCBjb21tYW5kIGxpbmUgYXQgQ09NTUFORF9MSU5FX09GRlNFVCAqLworCWJ1aWxkX2NvbW1hbmRfbGluZShzZXR1cF9iYXNlICsgQ09NTUFORF9MSU5FX09GRlNFVCwgYXV0b19ib290KTsKKwkKKyAgICAgICAgcHJpbnRmKCJMb2FkaW5nICVjekltYWdlIGF0IGFkZHJlc3MgMHglMDh4ICglbGQgYnl0ZXMpXG4iLCBiaWdfaW1hZ2UgPyAnYicgOiAnICcsIAorCSAgICAgICAodTMyKWxvYWRfYWRkcmVzcywga2VybmVsX3NpemUgLSBzZXR1cF9zaXplKTsKKworCSAgICAgICAKKwltZW1tb3ZlKGxvYWRfYWRkcmVzcywgaW1hZ2UgKyBzZXR1cF9zaXplLCBrZXJuZWxfc2l6ZSAtIHNldHVwX3NpemUpOworCQorCS8qIHJlYWR5IGZvciBib290aW5nICovCisJcmV0dXJuIHNldHVwX2Jhc2U7Cit9CisKKwordm9pZCBib290X3ppbWFnZSh2b2lkICpzZXR1cF9iYXNlKQoreworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisJCisJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKKwlyZWdzLnhkcyA9ICh1MzIpc2V0dXBfYmFzZSA+PiA0OworCXJlZ3MueHNzID0gMHg4ZTAwOworCXJlZ3MuZXNwID0gMHgyMDA7CisJcmVncy5lZmxhZ3MgPSAwOworCWVudGVyX3JlYWxtb2RlKCgodTMyKXNldHVwX2Jhc2UrU0VUVVBfU1RBUlRfT0ZGU0VUKT4+NCwgMCwgJnJlZ3MsICZyZWdzKTsKK30KKworCitpbWFnZV9oZWFkZXJfdCAqZmFrZV96aW1hZ2VfaGVhZGVyKGltYWdlX2hlYWRlcl90ICpoZHIsIHZvaWQgKnB0ciwgaW50IHNpemUpCit7CQorCS8qIFRoZXJlIGlzIG5vIHdheSB0byBrbm93IHRoZSBzaXplIG9mIGEgekltYWdlIC4uLiAqCisJICogc28gd2UgYXNzdW1lIHRoYXQgMk1CIHdpbGwgYmUgZW5vdWdoIGZvciBub3cgKi8KKyNkZWZpbmUgWklNQUdFX1NJWkUgMHgyMDAwMDAKKwkKKwkvKiBsb2FkIGEgMU1CLCB0aGUgbG9hZGVkIHdpbGwgaGF2ZSB0byBiZSBtb3ZlZCB0byBpdHMgZmluYWwKKwkgKiBwb3NpdGlvbiBhZ2FpbiBsYXRlci4uLiAqLworI2RlZmluZSBaSU1BR0VfTE9BRCAweDEwMDAwMAorCQorCXVsb25nIGNoZWNrc3VtOworCQorIAlpZiAoS0VSTkVMX01BR0lDICE9ICoodTE2KikocHRyICsgQk9PVF9GTEFHX09GRikpIHsKKwkJLyogbm90IGEgekltYWdlIG9yIGJ6SW1hZ2UgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKC0xID09IHNpemUpIHsKKwkJc2l6ZSA9IFpJTUFHRV9TSVpFOworCX0KKyNpZiAwCQorCWNoZWNrc3VtID0gY3JjMzIgKDAsIHB0ciwgc2l6ZSk7CisjZWxzZQorCWNoZWNrc3VtID0gMDsKKyNlbmRpZgkJCisJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSk7CisJCisJLyogQnVpbGQgbmV3IGhlYWRlciAqLworCWhkci0+aWhfbWFnaWMgPSBodG9ubChJSF9NQUdJQyk7CisJaGRyLT5paF90aW1lICA9IDA7CisJaGRyLT5paF9zaXplICA9IGh0b25sKHNpemUpOworCWhkci0+aWhfbG9hZCAgPSBodG9ubChaSU1BR0VfTE9BRCk7CisJaGRyLT5paF9lcCAgICA9IDA7CisJaGRyLT5paF9kY3JjICA9IGh0b25sKGNoZWNrc3VtKTsKKwloZHItPmloX29zICAgID0gSUhfT1NfTElOVVg7CisJaGRyLT5paF9hcmNoICA9IElIX0NQVV9JMzg2OworCWhkci0+aWhfdHlwZSAgPSBJSF9UWVBFX0tFUk5FTDsKKwloZHItPmloX2NvbXAgID0gSUhfQ09NUF9OT05FOworCisJc3RybmNweSgoY2hhciAqKWhkci0+aWhfbmFtZSwgIihub25lKSIsIElIX05NTEVOKTsKKworCWNoZWNrc3VtID0gY3JjMzIoMCwoY29uc3QgY2hhciAqKWhkcixzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKTsKKworCWhkci0+aWhfaGNyYyA9IGh0b25sKGNoZWNrc3VtKTsKKwkKKwlyZXR1cm4gaGRyOworfQo=