LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgImRlYnVnZ2VyLmgiCiNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCgoKLyoKICogV2Uga2VlcCB0aGlzIGluZm8gZm9yIGVhY2ggZnJhbWUsIHNvIHRoYXQgd2UgY2FuCiAqIGZpbmQgbG9jYWwgdmFyaWFibGUgaW5mb3JtYXRpb24gY29ycmVjdGx5LgogKi8Kc3RydWN0IGJ0X2luZm8KewogIHVuc2lnbmVkIGludAkgICAgIGNzOwogIHVuc2lnbmVkIGludAkgICAgIGVpcDsKICB1bnNpZ25lZCBpbnQJICAgICBzczsKICB1bnNpZ25lZCBpbnQJICAgICBlYnA7CiAgc3RydWN0IHN5bWJvbF9pbmZvIGZyYW1lOwp9OwoKc3RhdGljIGludCBuZnJhbWU7CnN0YXRpYyBzdHJ1Y3QgYnRfaW5mbyAqIGZyYW1lcyA9IE5VTEw7CmludCBjdXJyX2ZyYW1lOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgV09SRCBicDsKICAgIFdPUkQgaXA7CiAgICBXT1JEIGNzOwp9IEZSQU1FMTY7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCBicDsKICAgIERXT1JEIGlwOwogICAgV09SRCBjczsKfSBGUkFNRTMyOwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0luZm9TdGFjawogKgogKiBEdW1wIHRoZSB0b3Agb2YgdGhlIHN0YWNrCiAqLwp2b2lkIERFQlVHX0luZm9TdGFjayh2b2lkKQp7CiAgICBEQkdfQUREUiBhZGRyOwoKICAgIGFkZHIudHlwZSA9IE5VTEw7CiAgICBhZGRyLnNlZyA9IFNTX3JlZygmREVCVUdfY29udGV4dCk7CiAgICBhZGRyLm9mZiA9IEVTUF9yZWcoJkRFQlVHX2NvbnRleHQpOwoKICAgIGZwcmludGYoc3RkZXJyLCJTdGFjayBkdW1wOlxuIik7CiAgICBpZiAoSVNfU0VMRUNUT1JfMzJCSVQoYWRkci5zZWcpKQogICAgeyAgLyogMzItYml0IG1vZGUgKi8KICAgICAgICBERUJVR19FeGFtaW5lTWVtb3J5KCAmYWRkciwgMjQsICd4JyApOwogICAgfQogICAgZWxzZSAgLyogMTYtYml0IG1vZGUgKi8KICAgIHsKICAgICAgICBhZGRyLm9mZiAmPSAweGZmZmY7CiAgICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJmFkZHIsIDI0LCAndycgKTsKICAgIH0KICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOwp9CgoKc3RhdGljIHZvaWQgREVCVUdfRm9yY2VGcmFtZShEQkdfQUREUiAqc3RhY2ssIERCR19BRERSICpjb2RlLCBpbnQgZnJhbWVubywgaW50IGJpdHMsIGludCBub2lzeSkKewogICAgaW50IHRoZWZyYW1lID0gbmZyYW1lKys7CiAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKilEQkdfcmVhbGxvYyhmcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZnJhbWUqc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSk7CiAgICBpZiAobm9pc3kpCiAgICAgIGZwcmludGYoc3RkZXJyLCIlcyVkICIsICh0aGVmcmFtZSA9PSBjdXJyX2ZyYW1lID8gIj0+IiA6ICIgICIpLAogICAgICAgICAgICAgIGZyYW1lbm8pOwogICAgZnJhbWVzW3RoZWZyYW1lXS5jcyA9IGNvZGUtPnNlZzsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWlwID0gY29kZS0+b2ZmOwogICAgaWYgKG5vaXN5KQogICAgICBmcmFtZXNbdGhlZnJhbWVdLmZyYW1lID0gREVCVUdfUHJpbnRBZGRyZXNzQW5kQXJncyggY29kZSwgYml0cywgCgkJCQkJCXN0YWNrLT5vZmYsIFRSVUUgKTsKICAgIGVsc2UKICAgICAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woIGNvZGUsIFRSVUUsIAoJCQkgICAgICAgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUuc3ltLCBzdGFjay0+b2ZmLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLmxpc3QpOwogICAgZnJhbWVzW3RoZWZyYW1lXS5zcyA9IHN0YWNrLT5zZWc7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVicCA9IHN0YWNrLT5vZmY7CiAgICBpZiAobm9pc3kpIHsKICAgICAgZnByaW50Ziggc3RkZXJyLCAoYml0cyA9PSAxNikgPyAiIChicD0lMDRseClcbiIgOiAiIChlYnA9JTA4bHgpXG4iLCBzdGFjay0+b2ZmICk7CiAgICB9Cn0KCnN0YXRpYyBCT09MIERFQlVHX0ZyYW1lMTYoREJHX0FERFIgKmFkZHIsIHVuc2lnbmVkIGludCAqY3MsIGludCBmcmFtZW5vLCBpbnQgbm9pc3kpCnsKICAgIHVuc2lnbmVkIGludCBzcyA9IGFkZHItPnNlZywgcG9zc2libGVfY3MgPSAwOwogICAgRlJBTUUxNiAqZnJhbWUgPSAoRlJBTUUxNiAqKURCR19BRERSX1RPX0xJTihhZGRyKTsKICAgIGludCB0aGVmcmFtZSA9IG5mcmFtZTsKCiAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggYWRkciwgc2l6ZW9mKEZSQU1FMTYpICkpIHJldHVybiBGQUxTRTsKICAgIGlmICghZnJhbWUtPmJwKSByZXR1cm4gRkFMU0U7CiAgICBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgZnByaW50ZihzdGRlcnIsIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCiAgICAgICAgICAgICAgZnJhbWVubyk7CiAgICBpZiAoZnJhbWUtPmJwICYgMSkgKmNzID0gZnJhbWUtPmNzOwogICAgZWxzZSB7CiAgICAgIC8qIG5vdCBleHBsaWNpdGx5IG1hcmtlZCBhcyBmYXIgY2FsbCwKICAgICAgICogYnV0IGNoZWNrIHdoZXRoZXIgaXQgY291bGQgYmUgYW55d2F5ICovCiAgICAgIGlmICgoKGZyYW1lLT5jcyY3KT09NykgJiYgKGZyYW1lLT5jcyAhPSAqY3MpICYmICFJU19TRUxFQ1RPUl9GUkVFKGZyYW1lLT5jcykpIHsKICAgICAgICBsZHRfZW50cnkgdGNzOwogICAgICAgIExEVF9HZXRFbnRyeSggU0VMRUNUT1JfVE9fRU5UUlkoZnJhbWUtPmNzKSwgJnRjcyApOwogICAgICAgIGlmICggdGNzLnR5cGUgPT0gU0VHTUVOVF9DT0RFICkgewogICAgICAgICAgLyogaXQgaXMgdmVyeSB1bmNvbW1vbiB0byBwdXNoIGEgY29kZSBzZWdtZW50IGNzIGFzCiAgICAgICAgICAgKiBhIHBhcmFtZXRlciwgc28gdGhpcyBzaG91bGQgd29yayBpbiBtb3N0IGNhc2VzICovCiAgICAgICAgICAqY3MgPSBwb3NzaWJsZV9jcyA9IGZyYW1lLT5jczsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZyYW1lc1t0aGVmcmFtZV0uY3MgPSBhZGRyLT5zZWcgPSAqY3M7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVpcCA9IGFkZHItPm9mZiA9IGZyYW1lLT5pcDsKICAgIGlmIChub2lzeSkKICAgICAgZnJhbWVzW3RoZWZyYW1lXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGFkZHIsIDE2LCAKCQkJCQkJZnJhbWUtPmJwLCBUUlVFICk7CiAgICBlbHNlCiAgICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCBhZGRyLCBUUlVFLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLnN5bSwgZnJhbWUtPmJwLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLmxpc3QpOwogICAgZnJhbWVzW3RoZWZyYW1lXS5zcyA9IGFkZHItPnNlZyA9IHNzOwogICAgZnJhbWVzW3RoZWZyYW1lXS5lYnAgPSBhZGRyLT5vZmYgPSBmcmFtZS0+YnAgJiB+MTsKICAgIGlmIChub2lzeSkgewogICAgICBmcHJpbnRmKCBzdGRlcnIsICIgKGJwPSUwNGx4IiwgYWRkci0+b2ZmICk7CiAgICAgIGlmIChwb3NzaWJsZV9jcykgewogICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiwgZmFyIGNhbGwgYXNzdW1lZCIgKTsKICAgICAgfQogICAgICBmcHJpbnRmKCBzdGRlcnIsICIpXG4iICk7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIEJPT0wgREVCVUdfRnJhbWUzMihEQkdfQUREUiAqYWRkciwgdW5zaWduZWQgaW50ICpjcywgaW50IGZyYW1lbm8sIGludCBub2lzeSkKewogICAgdW5zaWduZWQgaW50IHNzID0gYWRkci0+c2VnOwogICAgRlJBTUUzMiAqZnJhbWUgPSAoRlJBTUUzMiAqKURCR19BRERSX1RPX0xJTihhZGRyKTsKICAgIGludCB0aGVmcmFtZSA9IG5mcmFtZTsKCiAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggYWRkciwgc2l6ZW9mKEZSQU1FMzIpICkpIHJldHVybiBGQUxTRTsKICAgIGlmICghZnJhbWUtPmlwKSByZXR1cm4gRkFMU0U7CiAgICBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgZnByaW50ZihzdGRlcnIsIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCiAgICAgICAgICAgICAgZnJhbWVubyk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmNzID0gYWRkci0+c2VnID0gKmNzOwogICAgZnJhbWVzW3RoZWZyYW1lXS5laXAgPSBhZGRyLT5vZmYgPSBmcmFtZS0+aXA7CiAgICBpZiAobm9pc3kpCiAgICAgIGZyYW1lc1t0aGVmcmFtZV0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3NBbmRBcmdzKCBhZGRyLCAzMiwgCgkJCQkJCWZyYW1lLT5icCwgVFJVRSApOwogICAgZWxzZQogICAgICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggYWRkciwgVFJVRSwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5zeW0sIGZyYW1lLT5icCwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5saXN0KTsKICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiIChlYnA9JTA4bHgpXG4iLCBmcmFtZS0+YnAgKTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uc3MgPSBhZGRyLT5zZWcgPSBzczsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWJwID0gZnJhbWUtPmJwOwogICAgaWYgKGFkZHItPm9mZiA9PSBmcmFtZS0+YnApIHJldHVybiBGQUxTRTsKICAgIGFkZHItPm9mZiA9IGZyYW1lLT5icDsKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgdm9pZCBERUJVR19Eb0JhY2tUcmFjZShpbnQgbm9pc3kpCnsKICAgIERCR19BRERSIGFkZHIsIHN3X2FkZHI7CiAgICB1bnNpZ25lZCBpbnQgc3MgPSBTU19yZWcoJkRFQlVHX2NvbnRleHQpLCBjcyA9IENTX3JlZygmREVCVUdfY29udGV4dCk7CiAgICBpbnQgZnJhbWVubyA9IDAsIGlzMTYsIG9rOwogICAgRFdPUkQgbmV4dF9zd2l0Y2gsIGN1cl9zd2l0Y2g7CgogICAgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICJCYWNrdHJhY2U6XG4iICk7CgogICAgbmZyYW1lID0gMTsKICAgIGlmIChmcmFtZXMpIERCR19mcmVlKCBmcmFtZXMgKTsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKSBEQkdfYWxsb2MoIHNpemVvZihzdHJ1Y3QgYnRfaW5mbykgKTsKICAgIGZwcmludGYoc3RkZXJyLCIlcyVkICIsKGN1cnJfZnJhbWUgPT0gMCA/ICI9PiIgOiAiICAiKSwgZnJhbWVubyk7CgogICAgaWYgKElTX1NFTEVDVE9SX1NZU1RFTShzcykpIHNzID0gMDsKICAgIGlmIChJU19TRUxFQ1RPUl9TWVNURU0oY3MpKSBjcyA9IDA7CgogICAgLyogZmlyc3Qgc3RhY2sgZnJhbWUgZnJvbSByZWdpc3RlcnMgKi8KICAgIGlmIChJU19TRUxFQ1RPUl8zMkJJVChzcykpCiAgICB7CiAgICAgICAgZnJhbWVzWzBdLmNzID0gYWRkci5zZWcgPSBjczsKICAgICAgICBmcmFtZXNbMF0uZWlwID0gYWRkci5vZmYgPSBFSVBfcmVnKCZERUJVR19jb250ZXh0KTsKICAgICAgICBpZiAobm9pc3kpCiAgICAgICAgICBmcmFtZXNbMF0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3MoICZhZGRyLCAzMiwgVFJVRSApOwogICAgICAgIGVsc2UKCSAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woICZhZGRyLCBUUlVFLCAmZnJhbWVzWzBdLmZyYW1lLnN5bSwgMCwgCgkJCQkJCSZmcmFtZXNbMF0uZnJhbWUubGlzdCk7CiAgICAgICAgZnJhbWVzWzBdLnNzID0gYWRkci5zZWcgPSBzczsKCWZyYW1lc1swXS5lYnAgPSBhZGRyLm9mZiA9IEVCUF9yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiIChlYnA9JTA4eClcbiIsIGZyYW1lc1swXS5lYnAgKTsKICAgICAgICBpczE2ID0gRkFMU0U7CiAgICB9IGVsc2UgewogICAgICAgIGZyYW1lc1swXS5jcyA9IGFkZHIuc2VnID0gY3M7CiAgICAgICAgZnJhbWVzWzBdLmVpcCA9IGFkZHIub2ZmID0gSVBfcmVnKCZERUJVR19jb250ZXh0KTsKICAgICAgICBpZiAobm9pc3kpCiAgICAgICAgICBmcmFtZXNbMF0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3MoICZhZGRyLCAxNiwgVFJVRSApOwogICAgICAgIGVsc2UKCSAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woICZhZGRyLCBUUlVFLCAmZnJhbWVzWzBdLmZyYW1lLnN5bSwgMCwgCgkJCQkJCSZmcmFtZXNbMF0uZnJhbWUubGlzdCk7CiAgICAgICAgZnJhbWVzWzBdLnNzID0gYWRkci5zZWcgPSBzczsKCWZyYW1lc1swXS5lYnAgPSBhZGRyLm9mZiA9IEJQX3JlZygmREVCVUdfY29udGV4dCk7CiAgICAgICAgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICIgKGJwPSUwNHgpXG4iLCBmcmFtZXNbMF0uZWJwICk7CiAgICAgICAgaXMxNiA9IFRSVUU7CiAgICB9CgogICAgbmV4dF9zd2l0Y2ggPSBUSFJFQURfQ3VycmVudCgpLT5jdXJfc3RhY2s7CiAgICBpZiAoaXMxNikgewogICAgICBjdXJfc3dpdGNoID0gKERXT1JEKSgoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCktPmZyYW1lMTY7CiAgICAgIHN3X2FkZHIuc2VnID0gU0VMRUNUT1JPRihjdXJfc3dpdGNoKTsKICAgICAgc3dfYWRkci5vZmYgPSBPRkZTRVRPRihjdXJfc3dpdGNoKTsKICAgIH0gZWxzZSB7CiAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpKChTVEFDSzE2RlJBTUUqKVBUUl9TRUdfVE9fTElOKG5leHRfc3dpdGNoKSktPmZyYW1lMzI7CiAgICAgIHN3X2FkZHIuc2VnID0gc3M7CiAgICAgIHN3X2FkZHIub2ZmID0gY3VyX3N3aXRjaDsKICAgIH0KCiAgICBmb3IgKG9rID0gVFJVRTsgb2s7KSB7CiAgICAgIGlmICgoZnJhbWVzW2ZyYW1lbm9dLnNzID09IHN3X2FkZHIuc2VnKSAmJgogICAgICAgICAgKGZyYW1lc1tmcmFtZW5vXS5lYnAgPj0gc3dfYWRkci5vZmYpKSB7CiAgICAgICAgLyogMTY8LT4zMiBzd2l0Y2guLi4KICAgICAgICAgKiB5ZXMsIEkga25vdyB0aGlzIGlzIGNvbmZ1c2luZywgaXQgZ2F2ZSBtZSBhIGhlYWRhY2hlIHRvbyAqLwogICAgICAgIGlmIChpczE2KSB7CiAgICAgICAgICBTVEFDSzMyRlJBTUUgKmZyYW1lID0gKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2g7CiAgICAgICAgICBEQkdfQUREUiBjb2RlID0geyBOVUxMLCAwLCBmcmFtZS0+cmV0YWRkciB9OwoKICAgICAgICAgIGNzID0gMDsKICAgICAgICAgIGFkZHIuc2VnID0gMDsKICAgICAgICAgIGFkZHIub2ZmID0gZnJhbWUtPmVicDsKICAgICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCAzMiwgbm9pc3kgKTsKCiAgICAgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CiAgICAgICAgICBjdXJfc3dpdGNoID0gKERXT1JEKSgoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCkpLT5mcmFtZTMyOwogICAgICAgICAgc3dfYWRkci5zZWcgPSAwOwogICAgICAgICAgc3dfYWRkci5vZmYgPSBjdXJfc3dpdGNoOwoKICAgICAgICAgIGlzMTYgPSBGQUxTRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgU1RBQ0sxNkZSQU1FICpmcmFtZSA9IChTVEFDSzE2RlJBTUUqKVBUUl9TRUdfVE9fTElOKG5leHRfc3dpdGNoKTsKICAgICAgICAgIERCR19BRERSIGNvZGUgPSB7IE5VTEwsIGZyYW1lLT5jcywgZnJhbWUtPmlwIH07CgogICAgICAgICAgY3MgPSBmcmFtZS0+Y3M7CiAgICAgICAgICBhZGRyLnNlZyA9IFNFTEVDVE9ST0YobmV4dF9zd2l0Y2gpOwogICAgICAgICAgYWRkci5vZmYgPSBmcmFtZS0+YnA7CiAgICAgICAgICBERUJVR19Gb3JjZUZyYW1lKCAmYWRkciwgJmNvZGUsICsrZnJhbWVubywgMTYsIG5vaXN5ICk7CgogICAgICAgICAgbmV4dF9zd2l0Y2ggPSBjdXJfc3dpdGNoOwogICAgICAgICAgY3VyX3N3aXRjaCA9IChEV09SRCkoKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2gpLT5mcmFtZTE2OwogICAgICAgICAgc3dfYWRkci5zZWcgPSBTRUxFQ1RPUk9GKGN1cl9zd2l0Y2gpOwogICAgICAgICAgc3dfYWRkci5vZmYgPSBPRkZTRVRPRihjdXJfc3dpdGNoKTsKCiAgICAgICAgICBpczE2ID0gVFJVRTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogb3JkaW5hcnkgc3RhY2sgZnJhbWUgKi8KICAgICAgICBvayA9IGlzMTYgPyBERUJVR19GcmFtZTE2KCAmYWRkciwgJmNzLCArK2ZyYW1lbm8sIG5vaXN5KQogICAgICAgICAgICAgICAgICA6IERFQlVHX0ZyYW1lMzIoICZhZGRyLCAmY3MsICsrZnJhbWVubywgbm9pc3kpOwogICAgICB9CiAgICB9CiAgICBpZiAobm9pc3kpIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0JhY2tUcmFjZQogKgogKiBEaXNwbGF5IGEgc3RhY2sgYmFjay10cmFjZS4KICovCnZvaWQgREVCVUdfQmFja1RyYWNlKHZvaWQpCnsKICAgIERFQlVHX0RvQmFja1RyYWNlKCBUUlVFICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgREVCVUdfU2lsZW50QmFja1RyYWNlCiAqCiAqIERpc3BsYXkgYSBzdGFjayBiYWNrLXRyYWNlLgogKi8Kdm9pZCBERUJVR19TaWxlbnRCYWNrVHJhY2Uodm9pZCkKewogICAgREVCVUdfRG9CYWNrVHJhY2UoIEZBTFNFICk7Cn0KCmludApERUJVR19TZXRGcmFtZShpbnQgbmV3ZnJhbWUpCnsKICBpbnQJCXJ0biA9IEZBTFNFOwoKICBjdXJyX2ZyYW1lID0gbmV3ZnJhbWU7CgogIGlmKCBjdXJyX2ZyYW1lID49IG5mcmFtZSApCiAgICB7CiAgICAgIGN1cnJfZnJhbWUgPSBuZnJhbWUgLSAxOwogICAgfQoKICBpZiggY3Vycl9mcmFtZSA8IDAgKQogICAgewogICAgICBjdXJyX2ZyYW1lID0gMDsKICAgIH0KCiAgIGlmKCBmcmFtZXMgJiYgZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3Quc291cmNlZmlsZSAhPSBOVUxMICkKICAgIHsKICAgICAgREVCVUdfTGlzdCgmZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3QsIE5VTEwsIDApOwogICAgfQoKICBydG4gPSBUUlVFOwogIHJldHVybiAocnRuKTsKfQoKaW50CkRFQlVHX0dldEN1cnJlbnRGcmFtZShzdHJ1Y3QgbmFtZV9oYXNoICoqIG5hbWUsIHVuc2lnbmVkIGludCAqIGVpcCwKCQkgICAgICB1bnNpZ25lZCBpbnQgKiBlYnApCnsKICAvKgogICAqIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBiYWNrdHJhY2UsIHRoZW4ganVzdCByZXR1cm4uCiAgICovCiAgaWYoIGZyYW1lcyA9PSBOVUxMICkKICAgIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAvKgogICAqIElmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgY3VycmVudCBmdW5jdGlvbiBpcywgdGhlbiB3ZSBhbHNvIGhhdmUKICAgKiBub3RoaW5nIHRvIHJlcG9ydCBoZXJlLgogICAqLwogIGlmKCBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUuc3ltID09IE5VTEwgKQogICAgewogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICpuYW1lID0gZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bTsKICAqZWlwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVpcDsKICAqZWJwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVicDsKCiAgcmV0dXJuIFRSVUU7Cn0KCg==