LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8c3RkbGliLmg+CgojaW5jbHVkZSAiZGVidWdnZXIuaCIKI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKCiNpZmRlZiBfX2kzODZfXwovKgogKiBXZSBrZWVwIHRoaXMgaW5mbyBmb3IgZWFjaCBmcmFtZSwgc28gdGhhdCB3ZSBjYW4KICogZmluZCBsb2NhbCB2YXJpYWJsZSBpbmZvcm1hdGlvbiBjb3JyZWN0bHkuCiAqLwpzdHJ1Y3QgYnRfaW5mbwp7CiAgdW5zaWduZWQgaW50CSAgICAgY3M7CiAgdW5zaWduZWQgaW50CSAgICAgZWlwOwogIHVuc2lnbmVkIGludAkgICAgIHNzOwogIHVuc2lnbmVkIGludAkgICAgIGVicDsKICBzdHJ1Y3Qgc3ltYm9sX2luZm8gZnJhbWU7Cn07CgpzdGF0aWMgaW50IG5mcmFtZTsKc3RhdGljIHN0cnVjdCBidF9pbmZvICogZnJhbWVzID0gTlVMTDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIFdPUkQgYnA7CiAgICBXT1JEIGlwOwogICAgV09SRCBjczsKfSBGUkFNRTE2OwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgRFdPUkQgYnA7CiAgICBEV09SRCBpcDsKICAgIFdPUkQgY3M7Cn0gRlJBTUUzMjsKI2VuZGlmCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBERUJVR19JbmZvU3RhY2sKICoKICogRHVtcCB0aGUgdG9wIG9mIHRoZSBzdGFjawogKi8Kdm9pZCBERUJVR19JbmZvU3RhY2sodm9pZCkKewojaWZkZWYgX19pMzg2X18KICAgIERCR19WQUxVRQl2YWx1ZTsKICAgIAogICAgdmFsdWUudHlwZSA9IE5VTEw7CiAgICB2YWx1ZS5jb29raWUgPSBEVl9UQVJHRVQ7CiAgICB2YWx1ZS5hZGRyLnNlZyA9IERFQlVHX2NvbnRleHQuU2VnU3M7CiAgICB2YWx1ZS5hZGRyLm9mZiA9IERFQlVHX2NvbnRleHQuRXNwOwoKICAgIERFQlVHX1ByaW50ZihEQkdfQ0hOX01FU0csIlN0YWNrIGR1bXA6XG4iKTsKICAgIHN3aXRjaCAoREVCVUdfR2V0U2VsZWN0b3JUeXBlKHZhbHVlLmFkZHIuc2VnKSkKICAgIHsKICAgIGNhc2UgTU9ERV8zMjogLyogMzItYml0IG1vZGUgKi8KICAgICAgIERFQlVHX0V4YW1pbmVNZW1vcnkoICZ2YWx1ZSwgMjQsICd4JyApOwogICAgICAgYnJlYWs7CiAgICBjYXNlIE1PREVfMTY6ICAvKiAxNi1iaXQgbW9kZSAqLwogICAgY2FzZSBNT0RFX1ZNODY6CiAgICAgICAgdmFsdWUuYWRkci5vZmYgJj0gMHhmZmZmOwogICAgICAgIERFQlVHX0V4YW1pbmVNZW1vcnkoICZ2YWx1ZSwgMjQsICd3JyApOwoJYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywgIkJhZCBzZWdtZW50ICglbGQpXG4iLCB2YWx1ZS5hZGRyLnNlZyk7CiAgICB9CiAgICBERUJVR19QcmludGYoREJHX0NITl9NRVNHLCJcbiIpOwojZW5kaWYKfQoKI2lmZGVmIF9faTM4Nl9fCnN0YXRpYyB2b2lkIERFQlVHX0ZvcmNlRnJhbWUoREJHX0FERFIgKnN0YWNrLCBEQkdfQUREUiAqY29kZSwgaW50IGZyYW1lbm8sIGVudW0gZGJnX21vZGUgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9pc3ksIGNvbnN0IGNoYXIgKmNhdmVhdCkKewogICAgaW50IHRoZWZyYW1lID0gbmZyYW1lKys7CiAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKilEQkdfcmVhbGxvYyhmcmFtZXMsCgkJCQkJICAgbmZyYW1lKnNpemVvZihzdHJ1Y3QgYnRfaW5mbykpOwogICAgaWYgKG5vaXN5KQogICAgICBERUJVR19QcmludGYoREJHX0NITl9NRVNHLCIlcyVkICIsICh0aGVmcmFtZSA9PSBjdXJyX2ZyYW1lID8gIj0+IiA6ICIgICIpLAogICAgICAgICAgICAgIGZyYW1lbm8pOwogICAgZnJhbWVzW3RoZWZyYW1lXS5jcyA9IGNvZGUtPnNlZzsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWlwID0gY29kZS0+b2ZmOwogICAgaWYgKG5vaXN5KQogICAgICAgIGZyYW1lc1t0aGVmcmFtZV0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3NBbmRBcmdzKCBjb2RlLCBtb2RlLCBzdGFjay0+b2ZmLCBUUlVFICk7CiAgICBlbHNlCiAgICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCBjb2RlLCBUUlVFLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLnN5bSwgc3RhY2stPm9mZiwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5saXN0KTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uc3MgPSBzdGFjay0+c2VnOwogICAgZnJhbWVzW3RoZWZyYW1lXS5lYnAgPSBzdGFjay0+b2ZmOwogICAgaWYgKG5vaXN5KSB7CiAgICAgIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAobW9kZSAhPSBNT0RFXzMyKSA/ICIgKGJwPSUwNGx4JXMpXG4iIDogIiAoZWJwPSUwOGx4JXMpXG4iLAogICAgICAgICAgICAgICAgICAgIHN0YWNrLT5vZmYsIGNhdmVhdD9jYXZlYXQ6IiIgKTsKICAgIH0KfQoKc3RhdGljIEJPT0wgREVCVUdfRnJhbWUxNihEQkdfVEhSRUFEKiB0aHJlYWQsIERCR19BRERSICphZGRyLCB1bnNpZ25lZCBpbnQgKmNzLCBpbnQgZnJhbWVubywgaW50IG5vaXN5KQp7CiAgICB1bnNpZ25lZCBpbnQJcG9zc2libGVfY3MgPSAwOwogICAgRlJBTUUxNiAJCWZyYW1lOwogICAgdm9pZCoJCXAgPSAodm9pZCopREVCVUdfVG9MaW5lYXIoYWRkcik7CiAgICBEQkdfQUREUgkJY29kZTsKICAgIAogICAgaWYgKCFwKSByZXR1cm4gRkFMU0U7CiAgICAKICAgIGlmICghREVCVUdfUkVBRF9NRU0ocCwgJmZyYW1lLCBzaXplb2YoZnJhbWUpKSkgewogICAgICAgIGlmIChub2lzeSkgREVCVUdfSW52YWxBZGRyKGFkZHIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYgKCFmcmFtZS5icCkgcmV0dXJuIEZBTFNFOwoKICAgIGlmIChmcmFtZS5icCAmIDEpICpjcyA9IGZyYW1lLmNzOwogICAgZWxzZSB7CiAgICAgICAgLyogbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzIGZhciBjYWxsLAoJICogYnV0IGNoZWNrIHdoZXRoZXIgaXQgY291bGQgYmUgYW55d2F5ICovCiAgICAgICAgaWYgKCgoZnJhbWUuY3MmNyk9PTcpICYmIChmcmFtZS5jcyAhPSAqY3MpKSB7CgkgICAgTERUX0VOVFJZCWxlOwoJIAoJICAgIGlmIChHZXRUaHJlYWRTZWxlY3RvckVudHJ5KCB0aHJlYWQtPmhhbmRsZSwgZnJhbWUuY3MsICZsZSkgJiYKCQkobGUuSGlnaFdvcmQuQml0cy5UeXBlICYgMHgwOCkpIHsgLyogY29kZSBzZWdtZW50ICovCgkgICAgICAgIC8qIGl0IGlzIHZlcnkgdW5jb21tb24gdG8gcHVzaCBhIGNvZGUgc2VnbWVudCBjcyBhcwoJCSAqIGEgcGFyYW1ldGVyLCBzbyB0aGlzIHNob3VsZCB3b3JrIGluIG1vc3QgY2FzZXMgKi8KCSAgICAgICAgKmNzID0gcG9zc2libGVfY3MgPSBmcmFtZS5jczsKCSAgICB9Cgl9CiAgICB9CiAgICBjb2RlLnNlZyA9ICpjczsKICAgIGNvZGUub2ZmID0gZnJhbWUuaXA7CiAgICBhZGRyLT5vZmYgPSBmcmFtZS5icCAmIH4xOwogICAgREVCVUdfRm9yY2VGcmFtZShhZGRyLCAmY29kZSwgZnJhbWVubywgTU9ERV8xNiwgbm9pc3ksCiAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlX2NzID8gIiwgZmFyIGNhbGwgYXNzdW1lZCIgOiBOVUxMICk7CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIEJPT0wgREVCVUdfRnJhbWUzMihEQkdfQUREUiAqYWRkciwgdW5zaWduZWQgaW50ICpjcywgaW50IGZyYW1lbm8sIGludCBub2lzeSkKewogICAgRlJBTUUzMiAJCWZyYW1lOwogICAgdm9pZCoJCXAgPSAodm9pZCopREVCVUdfVG9MaW5lYXIoYWRkcik7CiAgICBEQkdfQUREUgkJY29kZTsKICAgIERXT1JECQlvbGRfYnAgPSBhZGRyLT5vZmY7CiAgICAKICAgIGlmICghcCkgcmV0dXJuIEZBTFNFOwogICAgCiAgICBpZiAoIURFQlVHX1JFQURfTUVNKHAsICZmcmFtZSwgc2l6ZW9mKGZyYW1lKSkpIHsKICAgICAgIGlmIChub2lzeSkgREVCVUdfSW52YWxBZGRyKGFkZHIpOwogICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYgKCFmcmFtZS5pcCkgcmV0dXJuIEZBTFNFOwoKICAgIGNvZGUuc2VnID0gKmNzOwogICAgY29kZS5vZmYgPSBmcmFtZS5pcDsKICAgIGFkZHItPm9mZiA9IGZyYW1lLmJwOwogICAgREVCVUdfRm9yY2VGcmFtZShhZGRyLCAmY29kZSwgZnJhbWVubywgTU9ERV8zMiwgbm9pc3ksIE5VTEwpOwogICAgaWYgKGFkZHItPm9mZiA9PSBvbGRfYnApIHJldHVybiBGQUxTRTsKICAgIHJldHVybiBUUlVFOwp9CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgREVCVUdfQmFja1RyYWNlCiAqCiAqIERpc3BsYXkgYSBzdGFjayBiYWNrLXRyYWNlLgogKi8Kdm9pZCBERUJVR19CYWNrVHJhY2UoRFdPUkQgdGlkLCBCT09MIG5vaXN5KQp7CiNpZmRlZiBfX2kzODYKICAgIERCR19BRERSIAkJYWRkciwgc3dfYWRkciwgY29kZSwgdG1wOwogICAgdW5zaWduZWQgaW50IAlzcywgY3M7CiAgICBpbnQgCQlmcmFtZW5vID0gMCwgaXMxNiwgb2s7CiAgICBEV09SRCAJCW5leHRfc3dpdGNoLCBjdXJfc3dpdGNoLCBwOwogICAgU1RBQ0sxNkZSQU1FICAgICAgIAlmcmFtZTE2OwogICAgU1RBQ0szMkZSQU1FICAgICAgIAlmcmFtZTMyOwogICAgY2hhcgkJY2g7CiAgICBDT05URVhUCQljdHg7CiAgICBEQkdfVEhSRUFEKgkJdGhyZWFkOwoKICAgIGludCAJCWNvcHlfbmZyYW1lID0gMDsKICAgIGludAkJCWNvcHlfY3Vycl9mcmFtZSA9IDA7CiAgICBzdHJ1Y3QgYnRfaW5mbyogCWNvcHlfZnJhbWVzID0gTlVMTDsKICAgIAogICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhY2t0cmFjZTpcbiIgKTsKCiAgICBpZiAodGlkID09IERFQlVHX0N1cnJUaWQpCiAgICB7CgkgY3R4ID0gREVCVUdfY29udGV4dDsKCSB0aHJlYWQgPSBERUJVR19DdXJyVGhyZWFkOwoKCSBpZiAoZnJhbWVzKSBEQkdfZnJlZSggZnJhbWVzICk7CgkgLyogZnJhbWVzID0gKHN0cnVjdCBidF9pbmZvICopIERCR19hbGxvYyggc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSApOyAqLwogICAgfQogICAgZWxzZQogICAgewoJIHRocmVhZCA9IERFQlVHX0dldFRocmVhZChERUJVR19DdXJyUHJvY2VzcywgdGlkKTsKCgkgaWYgKCF0aHJlYWQpCgkgewoJICAgICAgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJVbmtub3duIHRocmVhZCBpZCAoMHglMDhseCkgaW4gY3VycmVudCBwcm9jZXNzXG4iLCB0aWQpOwoJICAgICAgcmV0dXJuOwoJIH0KCSBtZW1zZXQoJmN0eCwgMCwgc2l6ZW9mKGN0eCkpOwoJIGN0eC5Db250ZXh0RmxhZ3MgPSBDT05URVhUX0NPTlRST0wgfCBDT05URVhUX1NFR01FTlRTOwoKCSBpZiAoIFN1c3BlbmRUaHJlYWQoIHRocmVhZC0+aGFuZGxlICkgPT0gLTEgfHwKCSAgICAgICFHZXRUaHJlYWRDb250ZXh0KCB0aHJlYWQtPmhhbmRsZSwgJmN0eCApKQoJIHsKCSAgICAgIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQ2FuJ3QgZ2V0IGNvbnRleHQgZm9yIHRocmVhZCBpZCAoMHglMDhseCkgaW4gY3VycmVudCBwcm9jZXNzXG4iLCB0aWQpOwoJICAgICAgcmV0dXJuOwoJIH0KCSAvKiBuZWVkIHRvIGF2b2lkIHRyYXNoaW5nIHN0YWNrIGZyYW1lIGZvciBjdXJyZW50IHRocmVhZCAqLwoJIGNvcHlfbmZyYW1lID0gbmZyYW1lOwoJIGNvcHlfZnJhbWVzID0gZnJhbWVzOwoJIGNvcHlfY3Vycl9mcmFtZSA9IGN1cnJfZnJhbWU7CgkgY3Vycl9mcmFtZSA9IDA7CiAgICB9CgogICAgbmZyYW1lID0gMDsKICAgIGZyYW1lcyA9IE5VTEw7CgogICAgY3MgPSBjdHguU2VnQ3M7CiAgICBzcyA9IGN0eC5TZWdTczsKCiAgICBpZiAoREVCVUdfSXNTZWxlY3RvclN5c3RlbShzcykpIHNzID0gMDsKICAgIGlmIChERUJVR19Jc1NlbGVjdG9yU3lzdGVtKGNzKSkgY3MgPSAwOwoKICAgIC8qIGZpcnN0IHN0YWNrIGZyYW1lIGZyb20gcmVnaXN0ZXJzICovCiAgICBzd2l0Y2ggKERFQlVHX0dldFNlbGVjdG9yVHlwZShzcykpCiAgICB7CiAgICBjYXNlIE1PREVfMzI6CiAgICAgICAgY29kZS5zZWcgPSBjczsKICAgICAgICBjb2RlLm9mZiA9IGN0eC5FaXA7CiAgICAgICAgYWRkci5zZWcgPSBzczsKCWFkZHIub2ZmID0gY3R4LkVicDsKICAgICAgICBERUJVR19Gb3JjZUZyYW1lKCAmYWRkciwgJmNvZGUsIGZyYW1lbm8sIE1PREVfMzIsIG5vaXN5LCBOVUxMICk7CiAgICAgICAgaWYgKCEoY29kZS5zZWcgfHwgY29kZS5vZmYpKSB7CiAgICAgICAgICAgIC8qIHRyeWluZyB0byBleGVjdXRlIGEgbnVsbCBwb2ludGVyLi4uIHl1Y2suLi4KICAgICAgICAgICAgICogaWYgaXQgd2FzIGEgY2FsbCB0byBudWxsLCB0aGUgcmV0dXJuIEVJUCBzaG91bGQgYmUKICAgICAgICAgICAgICogYXZhaWxhYmxlIGF0IFNTOkVTUCwgc28gbGV0J3MgdHJ5IHRvIHJldHJpZXZlIGl0ICovCiAgICAgICAgICAgIHRtcC5zZWcgPSBzczsKICAgICAgICAgICAgdG1wLm9mZiA9IGN0eC5Fc3A7CiAgICAgICAgICAgIGlmIChERUJVR19SRUFEX01FTSgodm9pZCAqKURFQlVHX1RvTGluZWFyKCZ0bXApLCAmY29kZS5vZmYsIHNpemVvZihjb2RlLm9mZikpKSB7CiAgICAgICAgICAgICAgICBERUJVR19Gb3JjZUZyYW1lKCAmYWRkciwgJmNvZGUsICsrZnJhbWVubywgTU9ERV8zMiwgbm9pc3ksICIsIG51bGwgY2FsbCBhc3N1bWVkIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlzMTYgPSBGQUxTRTsKCWJyZWFrOwogICAgY2FzZSBNT0RFXzE2OgogICAgY2FzZSBNT0RFX1ZNODY6CiAgICAgICAgY29kZS5zZWcgPSBjczsKICAgICAgICBjb2RlLm9mZiA9IExPV09SRChjdHguRWlwKTsKICAgICAgICBhZGRyLnNlZyA9IHNzOwoJYWRkci5vZmYgPSBMT1dPUkQoY3R4LkVicCk7CiAgICAgICAgREVCVUdfRm9yY2VGcmFtZSggJmFkZHIsICZjb2RlLCBmcmFtZW5vLCBNT0RFXzE2LCBub2lzeSwgTlVMTCApOwogICAgICAgIGlzMTYgPSBUUlVFOwoJYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc2VnbWVudCAnJXgnXG4iLCBzcyk7CglyZXR1cm47CiAgICB9CgogICAgLyogY3VyX3N3aXRjaCBob2xkcyBhZGRyZXNzIG9mIGN1cnJfc3RhY2sncyBmaWVsZCBpbiBURUIgaW4gZGVidWdnZWUgCiAgICAgKiBhZGRyZXNzIHNwYWNlIAogICAgICovCiAgICBjdXJfc3dpdGNoID0gKERXT1JEKXRocmVhZC0+dGViICsgT0ZGU0VUX09GKFRFQiwgY3VyX3N0YWNrKTsKICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKWN1cl9zd2l0Y2gsICZuZXh0X3N3aXRjaCwgc2l6ZW9mKG5leHRfc3dpdGNoKSkpIHsKICAgICAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQ2FuJ3QgcmVhZCBURUI6Y3VyX3N0YWNrXG4iKTsKCXJldHVybjsKICAgIH0KCiAgICBpZiAoaXMxNikgewogICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKW5leHRfc3dpdGNoLCAmZnJhbWUzMiwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAweCUwOGx4XG4iLCAKCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCSAgICByZXR1cm47Cgl9CgljdXJfc3dpdGNoID0gKERXT1JEKWZyYW1lMzIuZnJhbWUxNjsKCXN3X2FkZHIuc2VnID0gU0VMRUNUT1JPRihjdXJfc3dpdGNoKTsKCXN3X2FkZHIub2ZmID0gT0ZGU0VUT0YoY3VyX3N3aXRjaCk7CiAgICB9IGVsc2UgewogICAgICAgIHRtcC5zZWcgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKCXRtcC5vZmYgPSBPRkZTRVRPRihuZXh0X3N3aXRjaCk7CglwID0gREVCVUdfVG9MaW5lYXIoJnRtcCk7CgkKCWlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKXAsICZmcmFtZTE2LCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCSAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIAoJCQkJICAgICAodW5zaWduZWQgbG9uZykoU1RBQ0sxNkZSQU1FKilwICk7CgkgICAgcmV0dXJuOwoJfQoJY3VyX3N3aXRjaCA9IChEV09SRClmcmFtZTE2LmZyYW1lMzI7Cglzd19hZGRyLnNlZyA9IHNzOwoJc3dfYWRkci5vZmYgPSBjdXJfc3dpdGNoOwogICAgfQogICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopREVCVUdfVG9MaW5lYXIoJnN3X2FkZHIpLCAmY2gsIHNpemVvZihjaCkpKSB7CiAgICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7Cglzd19hZGRyLm9mZiA9IChEV09SRCktMTsKICAgIH0KICAgIAogICAgZm9yIChvayA9IFRSVUU7IG9rOykgewogICAgICAgIGlmICgoZnJhbWVzW2ZyYW1lbm9dLnNzID09IHN3X2FkZHIuc2VnKSAmJgogICAgICAgICAgICBzd19hZGRyLm9mZiAmJiAoZnJhbWVzW2ZyYW1lbm9dLmVicCA+PSBzd19hZGRyLm9mZikpCiAgICAgICAgewoJICAgLyogMTY8LT4zMiBzd2l0Y2guLi4KCSAgICAqIHllcywgSSBrbm93IHRoaXMgaXMgY29uZnVzaW5nLCBpdCBnYXZlIG1lIGEgaGVhZGFjaGUgdG9vICovCgkgICBpZiAoaXMxNikgewoJICAgICAgCgkgICAgICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopbmV4dF9zd2l0Y2gsICZmcmFtZTMyLCBzaXplb2YoU1RBQ0szMkZSQU1FKSkpIHsKCQkgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwgCgkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCQkgIHJldHVybjsKCSAgICAgICB9CgoJICAgICAgIGNvZGUuc2VnICA9IDA7CgkgICAgICAgY29kZS5vZmYgID0gZnJhbWUzMi5yZXRhZGRyOwoJICAgICAgIAoJICAgICAgIGNzID0gMDsKCSAgICAgICBhZGRyLnNlZyA9IDA7CgkgICAgICAgYWRkci5vZmYgPSBmcmFtZTMyLmVicDsKCSAgICAgICBERUJVR19Gb3JjZUZyYW1lKCAmYWRkciwgJmNvZGUsICsrZnJhbWVubywgTU9ERV8zMiwgbm9pc3ksIE5VTEwgKTsKCSAgICAgICAKCSAgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CgkgICAgICAgdG1wLnNlZyA9IFNFTEVDVE9ST0YobmV4dF9zd2l0Y2gpOwoJICAgICAgIHRtcC5vZmYgPSBPRkZTRVRPRihuZXh0X3N3aXRjaCk7CgkgICAgICAgcCA9IERFQlVHX1RvTGluZWFyKCZ0bXApOwoJICAgICAgIAoJICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKXAsICZmcmFtZTE2LCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCQkgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIAoJCQkJCSAgICAodW5zaWduZWQgbG9uZykoU1RBQ0sxNkZSQU1FKilwICk7CgkJICAgcmV0dXJuOwoJICAgICAgIH0KCSAgICAgICBjdXJfc3dpdGNoID0gKERXT1JEKWZyYW1lMTYuZnJhbWUzMjsKCSAgICAgICBzd19hZGRyLnNlZyA9IDA7CgkgICAgICAgc3dfYWRkci5vZmYgPSBjdXJfc3dpdGNoOwoJICAgICAgIAoJICAgICAgIGlzMTYgPSBGQUxTRTsKCSAgIH0gZWxzZSB7CgkgICAgICB0bXAuc2VnID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7CgkgICAgICB0bXAub2ZmID0gT0ZGU0VUT0YobmV4dF9zd2l0Y2gpOwoJICAgICAgcCA9IERFQlVHX1RvTGluZWFyKCZ0bXApOwoJICAgICAgCgkgICAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKilwLCAmZnJhbWUxNiwgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpKSB7CgkJICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsCgkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMTZGUkFNRSopcCApOwoJCSAgcmV0dXJuOwoJICAgICAgfQoJICAgICAgCgkgICAgICBjb2RlLnNlZyAgPSBmcmFtZTE2LmNzOwoJICAgICAgY29kZS5vZmYgID0gZnJhbWUxNi5pcDsKCSAgICAgIAoJICAgICAgY3MgPSBmcmFtZTE2LmNzOwoJICAgICAgYWRkci5zZWcgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKCSAgICAgIGFkZHIub2ZmID0gZnJhbWUxNi5icDsKCSAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCBNT0RFXzE2LCBub2lzeSwgTlVMTCApOwoJICAgICAgCgkgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CgkgICAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKiluZXh0X3N3aXRjaCwgJmZyYW1lMzIsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJCSBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIAoJCQkJCSAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCQkgcmV0dXJuOwoJICAgICAgfQoJICAgICAgY3VyX3N3aXRjaCA9IChEV09SRClmcmFtZTMyLmZyYW1lMTY7CgkgICAgICBzd19hZGRyLnNlZyA9IFNFTEVDVE9ST0YoY3VyX3N3aXRjaCk7CgkgICAgICBzd19hZGRyLm9mZiA9IE9GRlNFVE9GKGN1cl9zd2l0Y2gpOwoJICAgICAgCgkgICAgICBpczE2ID0gVFJVRTsKCSAgIH0KCSAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKURFQlVHX1RvTGluZWFyKCZzd19hZGRyKSwgJmNoLCBzaXplb2YoY2gpKSkgewoJICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7CgkgICAgICBzd19hZGRyLm9mZiA9IChEV09SRCktMTsKCSAgIH0KCX0gZWxzZSB7CgkgICAgLyogb3JkaW5hcnkgc3RhY2sgZnJhbWUgKi8KCSAgIG9rID0gaXMxNiA/IERFQlVHX0ZyYW1lMTYoIHRocmVhZCwgJmFkZHIsICZjcywgKytmcmFtZW5vLCBub2lzeSkKCSAgICAgIDogREVCVUdfRnJhbWUzMiggJmFkZHIsICZjcywgKytmcmFtZW5vLCBub2lzeSk7Cgl9CiAgICB9CiAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiXG4iICk7CgogICAgaWYgKHRpZCAhPSBERUJVR19DdXJyVGlkKQogICAgewoJIFJlc3VtZVRocmVhZCggdGhyZWFkLT5oYW5kbGUgKTsKCSAvKiByZXN0b3JlIHN0YWNrIGZyYW1lIGZvciBjdXJyZW50IHRocmVhZCAqLwoJIGlmIChmcmFtZXMpIERCR19mcmVlKCBmcmFtZXMgKTsKCSBmcmFtZXMgPSBjb3B5X2ZyYW1lczsKCSBuZnJhbWUgPSBjb3B5X25mcmFtZTsKCSBjdXJyX2ZyYW1lID0gY29weV9jdXJyX2ZyYW1lOwogICAgfQojZW5kaWYKfQoKaW50CkRFQlVHX1NldEZyYW1lKGludCBuZXdmcmFtZSkKewojaWZkZWYgX19pMzg2X18KICBpbnQJCXJ0biA9IEZBTFNFOwoKICBjdXJyX2ZyYW1lID0gbmV3ZnJhbWU7CgogIGlmKCBjdXJyX2ZyYW1lID49IG5mcmFtZSApCiAgICB7CiAgICAgIGN1cnJfZnJhbWUgPSBuZnJhbWUgLSAxOwogICAgfQoKICBpZiggY3Vycl9mcmFtZSA8IDAgKQogICAgewogICAgICBjdXJyX2ZyYW1lID0gMDsKICAgIH0KCiAgIGlmKCBmcmFtZXMgJiYgZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3Quc291cmNlZmlsZSAhPSBOVUxMICkKICAgIHsKICAgICAgREVCVUdfTGlzdCgmZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3QsIE5VTEwsIDApOwogICAgfQoKICBydG4gPSBUUlVFOwogIHJldHVybiAocnRuKTsKI2Vsc2UgLyogX19pMzg2X18gKi8KICByZXR1cm4gRkFMU0U7CiNlbmRpZiAvKiBfX2kzODZfXyAqLwp9CgppbnQKREVCVUdfR2V0Q3VycmVudEZyYW1lKHN0cnVjdCBuYW1lX2hhc2ggKiogbmFtZSwgdW5zaWduZWQgaW50ICogZWlwLAoJCSAgICAgIHVuc2lnbmVkIGludCAqIGVicCkKewojaWZkZWYgX19pMzg2X18KICAvKgogICAqIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBiYWNrdHJhY2UsIHRoZW4ganVzdCByZXR1cm4uCiAgICovCiAgaWYoIGZyYW1lcyA9PSBOVUxMICkKICAgIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAvKgogICAqIElmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgY3VycmVudCBmdW5jdGlvbiBpcywgdGhlbiB3ZSBhbHNvIGhhdmUKICAgKiBub3RoaW5nIHRvIHJlcG9ydCBoZXJlLgogICAqLwogIGlmKCBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUuc3ltID09IE5VTEwgKQogICAgewogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICpuYW1lID0gZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bTsKICAqZWlwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVpcDsKICAqZWJwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVicDsKCiAgcmV0dXJuIFRSVUU7CiNlbHNlIC8qIF9faTM4Nl9fICovCiAgcmV0dXJuIEZBTFNFOwojZW5kaWYgLyogX19pMzg2X18gKi8KfQoK