LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8c3RkbGliLmg+CgojaW5jbHVkZSAiZGVidWdnZXIuaCIKI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKCiNpZmRlZiBfX2kzODZfXwovKgogKiBXZSBrZWVwIHRoaXMgaW5mbyBmb3IgZWFjaCBmcmFtZSwgc28gdGhhdCB3ZSBjYW4KICogZmluZCBsb2NhbCB2YXJpYWJsZSBpbmZvcm1hdGlvbiBjb3JyZWN0bHkuCiAqLwpzdHJ1Y3QgYnRfaW5mbwp7CiAgdW5zaWduZWQgaW50CSAgICAgY3M7CiAgdW5zaWduZWQgaW50CSAgICAgZWlwOwogIHVuc2lnbmVkIGludAkgICAgIHNzOwogIHVuc2lnbmVkIGludAkgICAgIGVicDsKICBzdHJ1Y3Qgc3ltYm9sX2luZm8gZnJhbWU7Cn07CgpzdGF0aWMgaW50IG5mcmFtZTsKc3RhdGljIHN0cnVjdCBidF9pbmZvICogZnJhbWVzID0gTlVMTDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIFdPUkQgYnA7CiAgICBXT1JEIGlwOwogICAgV09SRCBjczsKfSBGUkFNRTE2OwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgRFdPUkQgYnA7CiAgICBEV09SRCBpcDsKICAgIFdPUkQgY3M7Cn0gRlJBTUUzMjsKI2VuZGlmCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBERUJVR19JbmZvU3RhY2sKICoKICogRHVtcCB0aGUgdG9wIG9mIHRoZSBzdGFjawogKi8Kdm9pZCBERUJVR19JbmZvU3RhY2sodm9pZCkKewojaWZkZWYgX19pMzg2X18KICAgIERCR19WQUxVRQl2YWx1ZTsKCiAgICB2YWx1ZS50eXBlID0gTlVMTDsKICAgIHZhbHVlLmNvb2tpZSA9IERWX1RBUkdFVDsKICAgIHZhbHVlLmFkZHIuc2VnID0gREVCVUdfY29udGV4dC5TZWdTczsKICAgIHZhbHVlLmFkZHIub2ZmID0gREVCVUdfY29udGV4dC5Fc3A7CgogICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiU3RhY2sgZHVtcDpcbiIpOwogICAgc3dpdGNoIChERUJVR19HZXRTZWxlY3RvclR5cGUodmFsdWUuYWRkci5zZWcpKQogICAgewogICAgY2FzZSBNT0RFXzMyOiAvKiAzMi1iaXQgbW9kZSAqLwogICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJnZhbHVlLCAyNCwgJ3gnICk7CiAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8xNjogIC8qIDE2LWJpdCBtb2RlICovCiAgICBjYXNlIE1PREVfVk04NjoKICAgICAgICB2YWx1ZS5hZGRyLm9mZiAmPSAweGZmZmY7CiAgICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJnZhbHVlLCAyNCwgJ3cnICk7CglicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICBERUJVR19QcmludGYoREJHX0NITl9NRVNHLCAiQmFkIHNlZ21lbnQgKCVsZClcbiIsIHZhbHVlLmFkZHIuc2VnKTsKICAgIH0KICAgIERFQlVHX1ByaW50ZihEQkdfQ0hOX01FU0csIlxuIik7CiNlbmRpZgp9CgojaWZkZWYgX19pMzg2X18Kc3RhdGljIHZvaWQgREVCVUdfRm9yY2VGcmFtZShEQkdfQUREUiAqc3RhY2ssIERCR19BRERSICpjb2RlLCBpbnQgZnJhbWVubywgZW51bSBkYmdfbW9kZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub2lzeSwgY29uc3QgY2hhciAqY2F2ZWF0KQp7CiAgICBpbnQgdGhlZnJhbWUgPSBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKCQkJCQkgICBuZnJhbWUqc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSk7CiAgICBpZiAobm9pc3kpCiAgICAgIERFQlVHX1ByaW50ZihEQkdfQ0hOX01FU0csIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCiAgICAgICAgICAgICAgZnJhbWVubyk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmNzID0gY29kZS0+c2VnOwogICAgZnJhbWVzW3RoZWZyYW1lXS5laXAgPSBjb2RlLT5vZmY7CiAgICBpZiAobm9pc3kpCiAgICAgICAgZnJhbWVzW3RoZWZyYW1lXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGNvZGUsIG1vZGUsIHN0YWNrLT5vZmYsIFRSVUUgKTsKICAgIGVsc2UKICAgICAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woIGNvZGUsIFRSVUUsCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5zeW0sIHN0YWNrLT5vZmYsCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5saXN0KTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uc3MgPSBzdGFjay0+c2VnOwogICAgZnJhbWVzW3RoZWZyYW1lXS5lYnAgPSBzdGFjay0+b2ZmOwogICAgaWYgKG5vaXN5KSB7CiAgICAgIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAobW9kZSAhPSBNT0RFXzMyKSA/ICIgKGJwPSUwNGx4JXMpXG4iIDogIiAoZWJwPSUwOGx4JXMpXG4iLAogICAgICAgICAgICAgICAgICAgIHN0YWNrLT5vZmYsIGNhdmVhdD9jYXZlYXQ6IiIgKTsKICAgIH0KfQoKc3RhdGljIEJPT0wgREVCVUdfRnJhbWUxNihEQkdfVEhSRUFEKiB0aHJlYWQsIERCR19BRERSICphZGRyLCB1bnNpZ25lZCBpbnQgKmNzLCBpbnQgZnJhbWVubywgaW50IG5vaXN5KQp7CiAgICB1bnNpZ25lZCBpbnQJcG9zc2libGVfY3MgPSAwOwogICAgRlJBTUUxNiAJCWZyYW1lOwogICAgdm9pZCoJCXAgPSAodm9pZCopREVCVUdfVG9MaW5lYXIoYWRkcik7CiAgICBEQkdfQUREUgkJY29kZTsKCiAgICBpZiAoIXApIHJldHVybiBGQUxTRTsKCiAgICBpZiAoIURFQlVHX1JFQURfTUVNKHAsICZmcmFtZSwgc2l6ZW9mKGZyYW1lKSkpIHsKICAgICAgICBpZiAobm9pc3kpIERFQlVHX0ludmFsQWRkcihhZGRyKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICAgIGlmICghZnJhbWUuYnApIHJldHVybiBGQUxTRTsKCiAgICBpZiAoZnJhbWUuYnAgJiAxKSAqY3MgPSBmcmFtZS5jczsKICAgIGVsc2UgewogICAgICAgIC8qIG5vdCBleHBsaWNpdGx5IG1hcmtlZCBhcyBmYXIgY2FsbCwKCSAqIGJ1dCBjaGVjayB3aGV0aGVyIGl0IGNvdWxkIGJlIGFueXdheSAqLwogICAgICAgIGlmICgoKGZyYW1lLmNzJjcpPT03KSAmJiAoZnJhbWUuY3MgIT0gKmNzKSkgewoJICAgIExEVF9FTlRSWQlsZTsKCgkgICAgaWYgKEdldFRocmVhZFNlbGVjdG9yRW50cnkoIHRocmVhZC0+aGFuZGxlLCBmcmFtZS5jcywgJmxlKSAmJgoJCShsZS5IaWdoV29yZC5CaXRzLlR5cGUgJiAweDA4KSkgeyAvKiBjb2RlIHNlZ21lbnQgKi8KCSAgICAgICAgLyogaXQgaXMgdmVyeSB1bmNvbW1vbiB0byBwdXNoIGEgY29kZSBzZWdtZW50IGNzIGFzCgkJICogYSBwYXJhbWV0ZXIsIHNvIHRoaXMgc2hvdWxkIHdvcmsgaW4gbW9zdCBjYXNlcyAqLwoJICAgICAgICAqY3MgPSBwb3NzaWJsZV9jcyA9IGZyYW1lLmNzOwoJICAgIH0KCX0KICAgIH0KICAgIGNvZGUuc2VnID0gKmNzOwogICAgY29kZS5vZmYgPSBmcmFtZS5pcDsKICAgIGFkZHItPm9mZiA9IGZyYW1lLmJwICYgfjE7CiAgICBERUJVR19Gb3JjZUZyYW1lKGFkZHIsICZjb2RlLCBmcmFtZW5vLCBNT0RFXzE2LCBub2lzeSwKICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVfY3MgPyAiLCBmYXIgY2FsbCBhc3N1bWVkIiA6IE5VTEwgKTsKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCBERUJVR19GcmFtZTMyKERCR19BRERSICphZGRyLCB1bnNpZ25lZCBpbnQgKmNzLCBpbnQgZnJhbWVubywgaW50IG5vaXN5KQp7CiAgICBGUkFNRTMyIAkJZnJhbWU7CiAgICB2b2lkKgkJcCA9ICh2b2lkKilERUJVR19Ub0xpbmVhcihhZGRyKTsKICAgIERCR19BRERSCQljb2RlOwogICAgRFdPUkQJCW9sZF9icCA9IGFkZHItPm9mZjsKCiAgICBpZiAoIXApIHJldHVybiBGQUxTRTsKCiAgICBpZiAoIURFQlVHX1JFQURfTUVNKHAsICZmcmFtZSwgc2l6ZW9mKGZyYW1lKSkpIHsKICAgICAgIGlmIChub2lzeSkgREVCVUdfSW52YWxBZGRyKGFkZHIpOwogICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYgKCFmcmFtZS5pcCkgcmV0dXJuIEZBTFNFOwoKICAgIGNvZGUuc2VnID0gKmNzOwogICAgY29kZS5vZmYgPSBmcmFtZS5pcDsKICAgIGFkZHItPm9mZiA9IGZyYW1lLmJwOwogICAgREVCVUdfRm9yY2VGcmFtZShhZGRyLCAmY29kZSwgZnJhbWVubywgTU9ERV8zMiwgbm9pc3ksIE5VTEwpOwogICAgaWYgKGFkZHItPm9mZiA9PSBvbGRfYnApIHJldHVybiBGQUxTRTsKICAgIHJldHVybiBUUlVFOwp9CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgREVCVUdfQmFja1RyYWNlCiAqCiAqIERpc3BsYXkgYSBzdGFjayBiYWNrLXRyYWNlLgogKi8Kdm9pZCBERUJVR19CYWNrVHJhY2UoRFdPUkQgdGlkLCBCT09MIG5vaXN5KQp7CiNpZmRlZiBfX2kzODYKICAgIERCR19BRERSIAkJYWRkciwgc3dfYWRkciwgY29kZSwgdG1wOwogICAgdW5zaWduZWQgaW50IAlzcywgY3M7CiAgICBpbnQgCQlmcmFtZW5vID0gMCwgaXMxNiwgb2s7CiAgICBEV09SRCAJCW5leHRfc3dpdGNoLCBjdXJfc3dpdGNoLCBwOwogICAgU1RBQ0sxNkZSQU1FICAgICAgIAlmcmFtZTE2OwogICAgU1RBQ0szMkZSQU1FICAgICAgIAlmcmFtZTMyOwogICAgY2hhcgkJY2g7CiAgICBDT05URVhUCQljdHg7CiAgICBEQkdfVEhSRUFEKgkJdGhyZWFkOwoKICAgIGludCAJCWNvcHlfbmZyYW1lID0gMDsKICAgIGludAkJCWNvcHlfY3Vycl9mcmFtZSA9IDA7CiAgICBzdHJ1Y3QgYnRfaW5mbyogCWNvcHlfZnJhbWVzID0gTlVMTDsKCiAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFja3RyYWNlOlxuIiApOwoKICAgIGlmICh0aWQgPT0gREVCVUdfQ3VyclRpZCkKICAgIHsKCSBjdHggPSBERUJVR19jb250ZXh0OwoJIHRocmVhZCA9IERFQlVHX0N1cnJUaHJlYWQ7CgoJIGlmIChmcmFtZXMpIERCR19mcmVlKCBmcmFtZXMgKTsKCSAvKiBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKikgREJHX2FsbG9jKCBzaXplb2Yoc3RydWN0IGJ0X2luZm8pICk7ICovCiAgICB9CiAgICBlbHNlCiAgICB7CgkgdGhyZWFkID0gREVCVUdfR2V0VGhyZWFkKERFQlVHX0N1cnJQcm9jZXNzLCB0aWQpOwoKCSBpZiAoIXRocmVhZCkKCSB7CgkgICAgICBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIlVua25vd24gdGhyZWFkIGlkICgweCUwOGx4KSBpbiBjdXJyZW50IHByb2Nlc3NcbiIsIHRpZCk7CgkgICAgICByZXR1cm47CgkgfQoJIG1lbXNldCgmY3R4LCAwLCBzaXplb2YoY3R4KSk7CgkgY3R4LkNvbnRleHRGbGFncyA9IENPTlRFWFRfQ09OVFJPTCB8IENPTlRFWFRfU0VHTUVOVFM7CgoJIGlmICggU3VzcGVuZFRocmVhZCggdGhyZWFkLT5oYW5kbGUgKSA9PSAtMSB8fAoJICAgICAgIUdldFRocmVhZENvbnRleHQoIHRocmVhZC0+aGFuZGxlLCAmY3R4ICkpCgkgewoJICAgICAgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJDYW4ndCBnZXQgY29udGV4dCBmb3IgdGhyZWFkIGlkICgweCUwOGx4KSBpbiBjdXJyZW50IHByb2Nlc3NcbiIsIHRpZCk7CgkgICAgICByZXR1cm47CgkgfQoJIC8qIG5lZWQgdG8gYXZvaWQgdHJhc2hpbmcgc3RhY2sgZnJhbWUgZm9yIGN1cnJlbnQgdGhyZWFkICovCgkgY29weV9uZnJhbWUgPSBuZnJhbWU7CgkgY29weV9mcmFtZXMgPSBmcmFtZXM7CgkgY29weV9jdXJyX2ZyYW1lID0gY3Vycl9mcmFtZTsKCSBjdXJyX2ZyYW1lID0gMDsKICAgIH0KCiAgICBuZnJhbWUgPSAwOwogICAgZnJhbWVzID0gTlVMTDsKCiAgICBjcyA9IGN0eC5TZWdDczsKICAgIHNzID0gY3R4LlNlZ1NzOwoKICAgIGlmIChERUJVR19Jc1NlbGVjdG9yU3lzdGVtKHNzKSkgc3MgPSAwOwogICAgaWYgKERFQlVHX0lzU2VsZWN0b3JTeXN0ZW0oY3MpKSBjcyA9IDA7CgogICAgLyogZmlyc3Qgc3RhY2sgZnJhbWUgZnJvbSByZWdpc3RlcnMgKi8KICAgIHN3aXRjaCAoREVCVUdfR2V0U2VsZWN0b3JUeXBlKHNzKSkKICAgIHsKICAgIGNhc2UgTU9ERV8zMjoKICAgICAgICBjb2RlLnNlZyA9IGNzOwogICAgICAgIGNvZGUub2ZmID0gY3R4LkVpcDsKICAgICAgICBhZGRyLnNlZyA9IHNzOwoJYWRkci5vZmYgPSBjdHguRWJwOwogICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgZnJhbWVubywgTU9ERV8zMiwgbm9pc3ksIE5VTEwgKTsKICAgICAgICBpZiAoIShjb2RlLnNlZyB8fCBjb2RlLm9mZikpIHsKICAgICAgICAgICAgLyogdHJ5aW5nIHRvIGV4ZWN1dGUgYSBudWxsIHBvaW50ZXIuLi4geXVjay4uLgogICAgICAgICAgICAgKiBpZiBpdCB3YXMgYSBjYWxsIHRvIG51bGwsIHRoZSByZXR1cm4gRUlQIHNob3VsZCBiZQogICAgICAgICAgICAgKiBhdmFpbGFibGUgYXQgU1M6RVNQLCBzbyBsZXQncyB0cnkgdG8gcmV0cmlldmUgaXQgKi8KICAgICAgICAgICAgdG1wLnNlZyA9IHNzOwogICAgICAgICAgICB0bXAub2ZmID0gY3R4LkVzcDsKICAgICAgICAgICAgaWYgKERFQlVHX1JFQURfTUVNKCh2b2lkICopREVCVUdfVG9MaW5lYXIoJnRtcCksICZjb2RlLm9mZiwgc2l6ZW9mKGNvZGUub2ZmKSkpIHsKICAgICAgICAgICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCBNT0RFXzMyLCBub2lzeSwgIiwgbnVsbCBjYWxsIGFzc3VtZWQiICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaXMxNiA9IEZBTFNFOwoJYnJlYWs7CiAgICBjYXNlIE1PREVfMTY6CiAgICBjYXNlIE1PREVfVk04NjoKICAgICAgICBjb2RlLnNlZyA9IGNzOwogICAgICAgIGNvZGUub2ZmID0gTE9XT1JEKGN0eC5FaXApOwogICAgICAgIGFkZHIuc2VnID0gc3M7CglhZGRyLm9mZiA9IExPV09SRChjdHguRWJwKTsKICAgICAgICBERUJVR19Gb3JjZUZyYW1lKCAmYWRkciwgJmNvZGUsIGZyYW1lbm8sIE1PREVfMTYsIG5vaXN5LCBOVUxMICk7CiAgICAgICAgaXMxNiA9IFRSVUU7CglicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzZWdtZW50ICcleCdcbiIsIHNzKTsKCXJldHVybjsKICAgIH0KCiAgICAvKiBjdXJfc3dpdGNoIGhvbGRzIGFkZHJlc3Mgb2YgY3Vycl9zdGFjaydzIGZpZWxkIGluIFRFQiBpbiBkZWJ1Z2dlZQogICAgICogYWRkcmVzcyBzcGFjZQogICAgICovCiAgICBjdXJfc3dpdGNoID0gKERXT1JEKXRocmVhZC0+dGViICsgT0ZGU0VUX09GKFRFQiwgY3VyX3N0YWNrKTsKICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKWN1cl9zd2l0Y2gsICZuZXh0X3N3aXRjaCwgc2l6ZW9mKG5leHRfc3dpdGNoKSkpIHsKICAgICAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQ2FuJ3QgcmVhZCBURUI6Y3VyX3N0YWNrXG4iKTsKCXJldHVybjsKICAgIH0KCiAgICBpZiAoaXMxNikgewogICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKW5leHRfc3dpdGNoLCAmZnJhbWUzMiwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAweCUwOGx4XG4iLAoJCQkJICAgICAodW5zaWduZWQgbG9uZykoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCApOwoJICAgIHJldHVybjsKCX0KCWN1cl9zd2l0Y2ggPSAoRFdPUkQpZnJhbWUzMi5mcmFtZTE2OwoJc3dfYWRkci5zZWcgPSBTRUxFQ1RPUk9GKGN1cl9zd2l0Y2gpOwoJc3dfYWRkci5vZmYgPSBPRkZTRVRPRihjdXJfc3dpdGNoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgdG1wLnNlZyA9IFNFTEVDVE9ST0YobmV4dF9zd2l0Y2gpOwoJdG1wLm9mZiA9IE9GRlNFVE9GKG5leHRfc3dpdGNoKTsKCXAgPSBERUJVR19Ub0xpbmVhcigmdG1wKTsKCglpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKilwLCAmZnJhbWUxNiwgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpKSB7CgkgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAweCUwOGx4XG4iLAoJCQkJICAgICAodW5zaWduZWQgbG9uZykoU1RBQ0sxNkZSQU1FKilwICk7CgkgICAgcmV0dXJuOwoJfQoJY3VyX3N3aXRjaCA9IChEV09SRClmcmFtZTE2LmZyYW1lMzI7Cglzd19hZGRyLnNlZyA9IHNzOwoJc3dfYWRkci5vZmYgPSBjdXJfc3dpdGNoOwogICAgfQogICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopREVCVUdfVG9MaW5lYXIoJnN3X2FkZHIpLCAmY2gsIHNpemVvZihjaCkpKSB7CiAgICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7Cglzd19hZGRyLm9mZiA9IChEV09SRCktMTsKICAgIH0KCiAgICBmb3IgKG9rID0gVFJVRTsgb2s7KSB7CiAgICAgICAgaWYgKChmcmFtZXNbZnJhbWVub10uc3MgPT0gc3dfYWRkci5zZWcpICYmCiAgICAgICAgICAgIHN3X2FkZHIub2ZmICYmIChmcmFtZXNbZnJhbWVub10uZWJwID49IHN3X2FkZHIub2ZmKSkKICAgICAgICB7CgkgICAvKiAxNjwtPjMyIHN3aXRjaC4uLgoJICAgICogeWVzLCBJIGtub3cgdGhpcyBpcyBjb25mdXNpbmcsIGl0IGdhdmUgbWUgYSBoZWFkYWNoZSB0b28gKi8KCSAgIGlmIChpczE2KSB7CgoJICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKW5leHRfc3dpdGNoLCAmZnJhbWUzMiwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkJICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsCgkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCQkgIHJldHVybjsKCSAgICAgICB9CgoJICAgICAgIGNvZGUuc2VnICA9IDA7CgkgICAgICAgY29kZS5vZmYgID0gZnJhbWUzMi5yZXRhZGRyOwoKCSAgICAgICBjcyA9IDA7CgkgICAgICAgYWRkci5zZWcgPSAwOwoJICAgICAgIGFkZHIub2ZmID0gZnJhbWUzMi5lYnA7CgkgICAgICAgREVCVUdfRm9yY2VGcmFtZSggJmFkZHIsICZjb2RlLCArK2ZyYW1lbm8sIE1PREVfMzIsIG5vaXN5LCBOVUxMICk7CgoJICAgICAgIG5leHRfc3dpdGNoID0gY3VyX3N3aXRjaDsKCSAgICAgICB0bXAuc2VnID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7CgkgICAgICAgdG1wLm9mZiA9IE9GRlNFVE9GKG5leHRfc3dpdGNoKTsKCSAgICAgICBwID0gREVCVUdfVG9MaW5lYXIoJnRtcCk7CgoJICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKXAsICZmcmFtZTE2LCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCQkgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsCgkJCQkJICAgICh1bnNpZ25lZCBsb25nKShTVEFDSzE2RlJBTUUqKXAgKTsKCQkgICByZXR1cm47CgkgICAgICAgfQoJICAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpZnJhbWUxNi5mcmFtZTMyOwoJICAgICAgIHN3X2FkZHIuc2VnID0gMDsKCSAgICAgICBzd19hZGRyLm9mZiA9IGN1cl9zd2l0Y2g7CgoJICAgICAgIGlzMTYgPSBGQUxTRTsKCSAgIH0gZWxzZSB7CgkgICAgICB0bXAuc2VnID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7CgkgICAgICB0bXAub2ZmID0gT0ZGU0VUT0YobmV4dF9zd2l0Y2gpOwoJICAgICAgcCA9IERFQlVHX1RvTGluZWFyKCZ0bXApOwoKCSAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKXAsICZmcmFtZTE2LCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCQkgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwKCQkJCQkgICAodW5zaWduZWQgbG9uZykoU1RBQ0sxNkZSQU1FKilwICk7CgkJICByZXR1cm47CgkgICAgICB9CgoJICAgICAgY29kZS5zZWcgID0gZnJhbWUxNi5jczsKCSAgICAgIGNvZGUub2ZmICA9IGZyYW1lMTYuaXA7CgoJICAgICAgY3MgPSBmcmFtZTE2LmNzOwoJICAgICAgYWRkci5zZWcgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKCSAgICAgIGFkZHIub2ZmID0gZnJhbWUxNi5icDsKCSAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCBNT0RFXzE2LCBub2lzeSwgTlVMTCApOwoKCSAgICAgIG5leHRfc3dpdGNoID0gY3VyX3N3aXRjaDsKCSAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKW5leHRfc3dpdGNoLCAmZnJhbWUzMiwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkJIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwKCQkJCQkgICh1bnNpZ25lZCBsb25nKShTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoICk7CgkJIHJldHVybjsKCSAgICAgIH0KCSAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpZnJhbWUzMi5mcmFtZTE2OwoJICAgICAgc3dfYWRkci5zZWcgPSBTRUxFQ1RPUk9GKGN1cl9zd2l0Y2gpOwoJICAgICAgc3dfYWRkci5vZmYgPSBPRkZTRVRPRihjdXJfc3dpdGNoKTsKCgkgICAgICBpczE2ID0gVFJVRTsKCSAgIH0KCSAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKURFQlVHX1RvTGluZWFyKCZzd19hZGRyKSwgJmNoLCBzaXplb2YoY2gpKSkgewoJICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7CgkgICAgICBzd19hZGRyLm9mZiA9IChEV09SRCktMTsKCSAgIH0KCX0gZWxzZSB7CgkgICAgLyogb3JkaW5hcnkgc3RhY2sgZnJhbWUgKi8KCSAgIG9rID0gaXMxNiA/IERFQlVHX0ZyYW1lMTYoIHRocmVhZCwgJmFkZHIsICZjcywgKytmcmFtZW5vLCBub2lzeSkKCSAgICAgIDogREVCVUdfRnJhbWUzMiggJmFkZHIsICZjcywgKytmcmFtZW5vLCBub2lzeSk7Cgl9CiAgICB9CiAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiXG4iICk7CgogICAgaWYgKHRpZCAhPSBERUJVR19DdXJyVGlkKQogICAgewoJIFJlc3VtZVRocmVhZCggdGhyZWFkLT5oYW5kbGUgKTsKCSAvKiByZXN0b3JlIHN0YWNrIGZyYW1lIGZvciBjdXJyZW50IHRocmVhZCAqLwoJIGlmIChmcmFtZXMpIERCR19mcmVlKCBmcmFtZXMgKTsKCSBmcmFtZXMgPSBjb3B5X2ZyYW1lczsKCSBuZnJhbWUgPSBjb3B5X25mcmFtZTsKCSBjdXJyX2ZyYW1lID0gY29weV9jdXJyX2ZyYW1lOwogICAgfQojZW5kaWYKfQoKaW50CkRFQlVHX1NldEZyYW1lKGludCBuZXdmcmFtZSkKewojaWZkZWYgX19pMzg2X18KICBpbnQJCXJ0biA9IEZBTFNFOwoKICBjdXJyX2ZyYW1lID0gbmV3ZnJhbWU7CgogIGlmKCBjdXJyX2ZyYW1lID49IG5mcmFtZSApCiAgICB7CiAgICAgIGN1cnJfZnJhbWUgPSBuZnJhbWUgLSAxOwogICAgfQoKICBpZiggY3Vycl9mcmFtZSA8IDAgKQogICAgewogICAgICBjdXJyX2ZyYW1lID0gMDsKICAgIH0KCiAgIGlmKCBmcmFtZXMgJiYgZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3Quc291cmNlZmlsZSAhPSBOVUxMICkKICAgIHsKICAgICAgREVCVUdfTGlzdCgmZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3QsIE5VTEwsIDApOwogICAgfQoKICBydG4gPSBUUlVFOwogIHJldHVybiAocnRuKTsKI2Vsc2UgLyogX19pMzg2X18gKi8KICByZXR1cm4gRkFMU0U7CiNlbmRpZiAvKiBfX2kzODZfXyAqLwp9CgppbnQKREVCVUdfR2V0Q3VycmVudEZyYW1lKHN0cnVjdCBuYW1lX2hhc2ggKiogbmFtZSwgdW5zaWduZWQgaW50ICogZWlwLAoJCSAgICAgIHVuc2lnbmVkIGludCAqIGVicCkKewojaWZkZWYgX19pMzg2X18KICAvKgogICAqIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBiYWNrdHJhY2UsIHRoZW4ganVzdCByZXR1cm4uCiAgICovCiAgaWYoIGZyYW1lcyA9PSBOVUxMICkKICAgIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAvKgogICAqIElmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgY3VycmVudCBmdW5jdGlvbiBpcywgdGhlbiB3ZSBhbHNvIGhhdmUKICAgKiBub3RoaW5nIHRvIHJlcG9ydCBoZXJlLgogICAqLwogIGlmKCBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUuc3ltID09IE5VTEwgKQogICAgewogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICpuYW1lID0gZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bTsKICAqZWlwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVpcDsKICAqZWJwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVicDsKCiAgcmV0dXJuIFRSVUU7CiNlbHNlIC8qIF9faTM4Nl9fICovCiAgcmV0dXJuIEZBTFNFOwojZW5kaWYgLyogX19pMzg2X18gKi8KfQoK