LyogQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgKi8KCi8qIHsgZGctZG8gcnVuIH0gKi8KLyogeyBkZy1vcHRpb25zICItc3RkPWM5OSAtcGVkYW50aWMtZXJyb3JzIC1mbm8tc2hvdy1jb2x1bW4iIH0gKi8KCi8qIFRlc3RzIGEgd2hvbGUgYnVuY2ggb2YgdGhpbmdzIGFyZSBjb3JyZWN0bHkgc3RyaW5naWZpZWQuICAqLwoKZXh0ZXJuIGludCBzdHJjbXAgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKZXh0ZXJuIGludCBwdXRzIChjb25zdCBjaGFyICopOwpleHRlcm4gdm9pZCBhYm9ydCAodm9pZCk7CiNkZWZpbmUgZXJyKHN0cikgZG8geyBwdXRzKHN0cik7IGFib3J0KCk7IH0gd2hpbGUgKDApCgojZGVmaW5lIHN0cih4KSAjeAojZGVmaW5lIHhzdHIoeCkgc3RyKHgpCiNkZWZpbmUgc3RydmFyKC4uLikgI19fVkFfQVJHU19fCgojZGVmaW5lIGdsaWJjX3N0cih4KSBnbGliY19zdHIyICh3LCB4KQojZGVmaW5lIGdsaWJjX3N0cjIodywgeCkgI3gKI2RlZmluZSB2ZXIgR0xJQkNfMi4yCgppbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogIHN0ciAoXCk7CQkvKiB7IGRnLXdhcm5pbmcgInZhbGlkIHN0cmluZyIgInN0cihcXCkiIH0gKi8KICBzdHIgKFxcKTsJCS8qIE9LLiAgKi8KICBzdHIgKFxcXCk7CQkvKiB7IGRnLXdhcm5pbmcgInZhbGlkIHN0cmluZyIgInN0cihcXFxcXFwpIiB9ICovCgogIC8qIFRoaXMgYWxzbyBzZXJ2ZXMgYXMgYSB1c2VmdWwgdGVzdCBvZiB0aGUgdmFsdWUgb2YgX19JTkNMVURFX0xFVkVMLiAgKi8KICBpZiAoc3RyY21wICh4c3RyIChfX0lOQ0xVREVfTEVWRUxfXyksICIwIikpCiAgICBlcnIgKCJtYWNybyBleHBhbnNpb24iKTsKCiAgaWYgKHN0cmNtcChzdHIgKF9fSU5DTFVERV9MRVZFTF9fKSwgIl9fSU5DTFVERV9MRVZFTF9fIikpCiAgICBlcnIgKCJtYWNybyBuYW1lIik7CgogIGlmIChzdHJjbXAoc3RyKCksICIiKSB8fCBzdHJjbXAoc3RyKCApLCAiIikpCiAgICBlcnIgKCJlbXB0eSBzdHJpbmciKTsKCiAgaWYgKHN0cmNtcChzdHIgKCJzXG4iKSwgIlwic1xcblwiIikpCiAgICBlcnIgKCJxdW90ZWQgc3RyaW5nIik7CgogIGlmIChzdHJjbXAgKHN0ciAoYSCAIGIpLCAiYSBcMjAwIGIiKSkKICAgIGVyciAoInVucHJpbnRhYmxlIGNoYXIiKTsKCiAgaWYgKHN0cmNtcCAoc3RyICgJYSAgICBiQCBjICAgKSwgImEgYkAgYyIpKQogICAgZXJyICgiaW50ZXJuYWwgd2hpdGVzcGFjZSIpOwoKICBpZiAoc3RyY21wIChzdHIoYSBcbiksICJhIFxuIikpCiAgICBlcnIgKCJiYWNrc2xhc2ggdG9rZW4iKTsKCiAgaWYgKHN0cmNtcCAoc3RydmFyIChmb28sIGJhciksICJmb28sIGJhciIpKQogICAgZXJyICgidmFyaWFibGUgYXJndW1lbnRzIik7CgogIGlmIChzdHJjbXAgKGdsaWJjX3N0ciAodmVyKSwgIkdMSUJDXzIuMiIpKQogICAgZXJyICgid2hpdGVzcGFjZSIpOwoKICByZXR1cm4gMDsKfQo=