LyogJElkJCAqLwovKiAKICogQ29weXJpZ2h0IChDKSAyMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAogKi8KI2lmICFkZWZpbmVkKFBKX1NZTUJJQU4pIHx8IFBKX1NZTUJJQU4gPT0gMAojICAgZXJyb3IgVGhpcyBmaWxlIGlzIG9ubHkgZm9yIFN5bWJpYW4gcGxhdGZvcm0KI2VuZGlmCgojaW5jbHVkZSA8cGovY3R5cGUuaD4KI2luY2x1ZGUgPHBqL3N0cmluZy5oPgoKI2luY2x1ZGUgPGYzMmZpbGUuaD4JLyogbGluayBhZ2FpbnN0IGVmc3J2LmxpYgkqLwojaW5jbHVkZSA8aGFsLmg+CS8qIGxpbmsgYWdhaW5zdCBoYWwubGliCQkqLwojaW5jbHVkZSA8dXRmLmg+CS8qIGxpbmsgYWdhaW5zdCBjaGFyY29udi5saWIJKi8KCgpQSl9CRUdJTl9ERUNMCnVuc2lnbmVkIHBqX3N5bWJpYW5vc19nZXRfbW9kZWxfaW5mbyhjaGFyICpidWYsIHVuc2lnbmVkIGJ1Zl9zaXplKTsKdW5zaWduZWQgcGpfc3ltYmlhbm9zX2dldF9wbGF0Zm9ybV9pbmZvKGNoYXIgKmJ1ZiwgdW5zaWduZWQgYnVmX3NpemUpOwp2b2lkIHBqX3N5bWJpYW5vc19nZXRfc2RrX2luZm8ocGpfc3RyX3QgKm5hbWUsIHBqX3VpbnQzMl90ICp2ZXIpOwpQSl9FTkRfREVDTAoKCi8qIEdldCBTeW1iaWFuIHBob25lIG1vZGVsIGluZm8sIHJldHVybmluZyBsZW5ndGggb2YgbW9kZWwgaW5mbyAqLwp1bnNpZ25lZCBwal9zeW1iaWFub3NfZ2V0X21vZGVsX2luZm8oY2hhciAqYnVmLCB1bnNpZ25lZCBidWZfc2l6ZSkKewogICAgcGpfc3RyX3QgbW9kZWxfbmFtZTsKCiAgICAvKiBHZXQgbWFjaGluZSBVSUQgKi8KICAgIFRJbnQgaGFsX3ZhbDsKICAgIEhBTDo6R2V0KEhBTDo6RU1hY2hpbmVVaWQsIGhhbF92YWwpOwogICAgcGpfYW5zaV9zbnByaW50ZihidWYsIGJ1Zl9zaXplLCAiMHglMDhYIiwgaGFsX3ZhbCk7CiAgICBwal9zdHJzZXQyKCZtb2RlbF9uYW1lLCBidWYpOwoKICAgIC8qIEdldCBtb2RlbCBuYW1lICovCiAgICBjb25zdCBwal9zdHJfdCBzdF9jb3B5cmlnaHQgPSB7IihDKSIsIDN9OwogICAgY29uc3QgcGpfc3RyX3Qgc3Rfbm9raWEgPSB7Ik5va2lhIiwgNX07CiAgICBjaGFyIHRtcF9idWZbNjRdOwogICAgcGpfc3RyX3QgdG1wX3N0cjsKCiAgICBfTElUKEtNb2RlbEZpbGVuYW1lLCJaOlxccmVzb3VyY2VcXHZlcnNpb25zXFxtb2RlbC50eHQiKTsKICAgIFJGaWxlIGZpbGU7CiAgICBSRnMgZnM7CiAgICBUSW50IGVycjsKICAgIAogICAgZnMuQ29ubmVjdCgxKTsKICAgIGVyciA9IGZpbGUuT3BlbihmcywgS01vZGVsRmlsZW5hbWUsIEVGaWxlUmVhZCk7CiAgICBpZiAoZXJyID09IEtFcnJOb25lKSB7CglURmlsZVRleHQgdGV4dDsKCXRleHQuU2V0KGZpbGUpOwoJVEJ1ZjE2PDY0PiBNb2RlbE5hbWUxNjsKCWVyciA9IHRleHQuUmVhZChNb2RlbE5hbWUxNik7CglpZiAoZXJyID09IEtFcnJOb25lKSB7CgkgICAgVFB0cjggcHRyOCgoVFVpbnQ4Kil0bXBfYnVmLCBzaXplb2YodG1wX2J1ZikpOwoJICAgIHB0cjguQ29weShNb2RlbE5hbWUxNik7CgkgICAgcGpfc3Ryc2V0KCZ0bXBfc3RyLCB0bXBfYnVmLCBwdHI4Lkxlbmd0aCgpKTsKCSAgICBwal9zdHJ0cmltKCZ0bXBfc3RyKTsKCX0KCWZpbGUuQ2xvc2UoKTsKICAgIH0KICAgIGZzLkNsb3NlKCk7CiAgICBpZiAoZXJyICE9IEtFcnJOb25lKQoJZ290byBvbl9yZXR1cm47CiAgICAKICAgIC8qIFRoZSByZXRyaWV2ZWQgbW9kZWwgbmFtZSBpcyB1c3VhbGx5IGluIGxvbmcgZm9ybWF0LCBlLmc6IAogICAgICogIqkgTm9raWEgTjk1ICgwMS4wMSkiLCAiKEMpIE5va2lhIEU1MiIuIEFzIHdlIG5lZWQgb25seQogICAgICogdGhlIHNob3J0IHZlcnNpb24sIGxldCdzIGNsZWFuIGl0IHVwLgogICAgICovCiAgICAKICAgIC8qIFJlbW92ZSBwcmVjZWRpbmcgbm9uLUFTQ0lJIGNoYXJzLCBlLmc6ICKpIiAqLwogICAgY2hhciAqcCA9IHRtcF9zdHIucHRyOwogICAgd2hpbGUgKCFwal9pc2FzY2lpKCpwKSkgeyBwKys7IH0KICAgIHBqX3N0cnNldCgmdG1wX3N0ciwgcCwgdG1wX3N0ci5zbGVuIC0gKHAgLSB0bXBfc3RyLnB0cikpOwogICAgCiAgICAvKiBSZW1vdmUgIihDKSIgKi8KICAgIHAgPSBwal9zdHJpc3RyKCZ0bXBfc3RyLCAmc3RfY29weXJpZ2h0KTsKICAgIGlmIChwKSB7CglwICs9IHN0X2NvcHlyaWdodC5zbGVuOwoJcGpfc3Ryc2V0KCZ0bXBfc3RyLCBwLCB0bXBfc3RyLnNsZW4gLSAocCAtIHRtcF9zdHIucHRyKSk7CiAgICB9CgogICAgLyogUmVtb3ZlICJOb2tpYSIgKi8KICAgIHAgPSBwal9zdHJpc3RyKCZ0bXBfc3RyLCAmc3Rfbm9raWEpOwogICAgaWYgKHApIHsKCXAgKz0gc3Rfbm9raWEuc2xlbjsKCXBqX3N0cnNldCgmdG1wX3N0ciwgcCwgdG1wX3N0ci5zbGVuIC0gKHAgLSB0bXBfc3RyLnB0cikpOwogICAgfQogICAgCiAgICAvKiBSZW1vdmUgbGFuZ3VhZ2UgdmVyc2lvbiwgZS5nOiAiKDAxLjAxKSIgKi8KICAgIHAgPSBwal9zdHJjaHIoJnRtcF9zdHIsICcoJyk7CiAgICBpZiAocCkgewoJdG1wX3N0ci5zbGVuID0gcCAtIHRtcF9zdHIucHRyOwogICAgfQogICAgCiAgICBwal9zdHJ0cmltKCZ0bXBfc3RyKTsKICAgIAogICAgaWYgKHRtcF9zdHIuc2xlbiA9PSAwKQoJZ290byBvbl9yZXR1cm47CiAgICAKICAgIGlmICgodW5zaWduZWQpdG1wX3N0ci5zbGVuID4gYnVmX3NpemUgLSBtb2RlbF9uYW1lLnNsZW4gLSAzKQoJdG1wX3N0ci5zbGVuID0gYnVmX3NpemUgLSBtb2RlbF9uYW1lLnNsZW4gLSAzOwogICAgCiAgICBwal9zdHJjYXQyKCZtb2RlbF9uYW1lLCAiKCIpOwogICAgcGpfc3RyY2F0KCZtb2RlbF9uYW1lLCAmdG1wX3N0cik7CiAgICBwal9zdHJjYXQyKCZtb2RlbF9uYW1lLCAiKSIpOwogICAgCiAgICAvKiBaZXJvIHRlcm1pbmF0ZSAqLwogICAgYnVmW21vZGVsX25hbWUuc2xlbl0gPSAnXDAnOwogICAgCm9uX3JldHVybjoKICAgIHJldHVybiBtb2RlbF9uYW1lLnNsZW47Cn0KCgovKiBHZXQgcGxhdGZvcm0gaW5mbywgcmV0dXJuZWQgZm9ybWF0IHdpbGwgYmUgIlNlcmllczYwdlguWCIgKi8KdW5zaWduZWQgcGpfc3ltYmlhbm9zX2dldF9wbGF0Zm9ybV9pbmZvKGNoYXIgKmJ1ZiwgdW5zaWduZWQgYnVmX3NpemUpCnsKICAgIC8qIE9TIGluZm8gKi8KICAgIF9MSVQoS1M2MFByb2R1Y3RJREZpbGUsICJTZXJpZXM2MHYqLnNpcyIpOwogICAgX0xJVChLUk9NSW5zdGFsbERpciwgIno6XFxzeXN0ZW1cXGluc3RhbGxcXCIpOwoKICAgIFJGcyBmczsKICAgIFRGaW5kRmlsZSBmZihmcyk7CiAgICBDRGlyKiByZXN1bHQ7CiAgICBwal9zdHJfdCBwbGF0X2luZm8gPSB7TlVMTCwgMH07CiAgICBUSW50IGVycjsKCiAgICBmcy5Db25uZWN0KDEpOwogICAgZXJyID0gZmYuRmluZFdpbGRCeURpcihLUzYwUHJvZHVjdElERmlsZSwgS1JPTUluc3RhbGxEaXIsIHJlc3VsdCk7CiAgICBpZiAoZXJyID09IEtFcnJOb25lKSB7CgllcnIgPSByZXN1bHQtPlNvcnQoRVNvcnRCeU5hbWV8RURlc2NlbmRpbmcpOwoJaWYgKGVyciA9PSBLRXJyTm9uZSkgewoJICAgIFRQdHI4IHRtcF9wdHI4KChUVWludDgqKWJ1ZiwgYnVmX3NpemUpOwoJICAgIGNvbnN0IHBqX3N0cl90IHRtcF9leHQgPSB7Ii5zaXMiLCA0fTsKCSAgICBjaGFyICpwOwoJICAgIAoJICAgIHRtcF9wdHI4LkNvcHkoKCpyZXN1bHQpWzBdLmlOYW1lKTsKCSAgICBwal9zdHJzZXQoJnBsYXRfaW5mbywgYnVmLCAocGpfc2l6ZV90KXRtcF9wdHI4Lkxlbmd0aCgpKTsKCSAgICBwID0gcGpfc3RyaXN0cigmcGxhdF9pbmZvLCAmdG1wX2V4dCk7CgkgICAgaWYgKHApCgkJcGxhdF9pbmZvLnNsZW4gLT0gKHAgLSBwbGF0X2luZm8ucHRyKTsKCX0KCWRlbGV0ZSByZXN1bHQ7CiAgICB9CiAgICBmcy5DbG9zZSgpOwogICAgYnVmW3BsYXRfaW5mby5zbGVuXSA9ICdcMCc7CiAgICAKICAgIHJldHVybiBwbGF0X2luZm8uc2xlbjsKfQoKCi8qIEdldCBTREsgaW5mbyAqLwp2b2lkIHBqX3N5bWJpYW5vc19nZXRfc2RrX2luZm8ocGpfc3RyX3QgKm5hbWUsIHBqX3VpbnQzMl90ICp2ZXIpCnsKICAgIGNvbnN0IHBqX3N0cl90IFM2MCA9IHsiUzYwIiwgM307CiAgICAjaWYgZGVmaW5lZChfX1NFUklFUzYwXzMwX18pCgkqbmFtZSA9IFM2MDsKCSp2ZXIgID0gKDMgPDwgMjQpOwogICAgI2VsaWYgZGVmaW5lZChfX1NFUklFUzYwXzMxX18pCgkqbmFtZSA9IFM2MDsKCSp2ZXIgID0gKDMgPDwgMjQpIHwgKDEgPDwgMTYpOwogICAgI2VsaWYgZGVmaW5lZChfX1M2MF8zMl9fKQoJKm5hbWUgPSBTNjA7CgkqdmVyICA9ICgzIDw8IDI0KSB8ICgyIDw8IDE2KTsKICAgICNlbGlmIGRlZmluZWQoX19TNjBfNTBfXykKCSpuYW1lID0gUzYwOwoJKnZlciAgPSAoNSA8PCAyNCk7CiAgICAjZWxpZiBkZWZpbmVkKF9fTk9LSUFfTjk3X18pCgkqbmFtZSA9IHBqX3N0cigiTjk3Iik7CgkqdmVyICA9ICgxIDw8IDI0KTsKICAgICNlbHNlCgkqbmFtZSA9IHBqX3N0cigiVW5rbm93biIpOwoJKnZlciAgPSAwOwogICAgI2VuZGlmCn0KCg==