LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCiAqICBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE3LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCiAqIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBodHRwczovL2N1cmwuaGF4eC5zZS9kb2NzL2NvcHlyaWdodC5odG1sLgogKgogKiBZb3UgbWF5IG9wdCB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUgYW5kL29yIHNlbGwKICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDT1BZSU5HIGZpbGUuCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioKCgpSRUNFSVZJTkcgQ09PS0lFIElORk9STUFUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVJbmZvICpDdXJsX2Nvb2tpZV9pbml0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IENvb2tpZUluZm8gKmluYywgYm9vbCBuZXdzZXNzaW9uKTsKCiAgICAgICAgSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHN0b3JlIGRhdGEgaW4gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogICAgICAgIGNhbGxlZCBiZWZvcmUgYW55IGNvb2tpZXMgYXJlIHNldC4KCnN0cnVjdCBDb29raWUgKkN1cmxfY29va2llX2FkZChzdHJ1Y3QgQ3VybF9lYXN5ICpkYXRhLAogICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICpjLCBib29sIGh0dHBoZWFkZXIsIGNoYXIgKmxpbmVwdHIsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKTsKCiAgICAgICAgVGhlICdsaW5lcHRyJyBwYXJhbWV0ZXIgaXMgYSBmdWxsICJTZXQtY29va2llOiIgbGluZSBhcwogICAgICAgIHJlY2VpdmVkIGZyb20gYSBzZXJ2ZXIuCgogICAgICAgIFRoZSBmdW5jdGlvbiBuZWVkIHRvIHJlcGxhY2UgcHJldmlvdXNseSBzdG9yZWQgbGluZXMgdGhhdCB0aGlzIG5ldwogICAgICAgIGxpbmUgc3VwZXJjZWVkcy4KCiAgICAgICAgSXQgbWF5IHJlbW92ZSBsaW5lcyB0aGF0IGFyZSBleHBpcmVkLgoKICAgICAgICBJdCBzaG91bGQgcmV0dXJuIGFuIGluZGljYXRpb24gb2Ygc3VjY2Vzcy9lcnJvci4KCgpTRU5ESU5HIENPT0tJRSBJTkZPUk1BVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RydWN0IENvb2tpZXMgKkN1cmxfY29va2llX2dldGxpc3Qoc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdCwgY2hhciAqcGF0aCwgYm9vbCBzZWN1cmUpOwoKICAgICAgICBGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQKICAgICAgICB0aGUgY2xpZW50IHNob3VsZCBzZW5kIHRvIHRoZSBzZXJ2ZXIgaWYgdXNlZCBub3cuIFRoZSBzZWN1cmUKICAgICAgICBib29sZWFuIGluZm9ybXMgdGhlIGNvb2tpZSBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIGlzIGFjaGlldmVkIG9yCiAgICAgICAgbm90LgoKICAgICAgICBJdCBzaGFsbCBvbmx5IHJldHVybiBjb29raWVzIHRoYXQgaGF2ZW4ndCBleHBpcmVkLgoKCkV4YW1wbGUgc2V0IG9mIGNvb2tpZXM6CgogICAgU2V0LWNvb2tpZTogUFJPRFVDVElORk89d2VieHByZXNzOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IFBFUlNPTkFMSVpFPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS9mdGd3OyBzZWN1cmUKICAgIFNldC1jb29raWU6IEZpZEhpc3Q9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRPcmRlcj1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKICAgIFNldC1jb29raWU6IERpc1BlbmQ9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWREaXM9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOgogICAgU2Vzc2lvbl9LZXlANjc5MWE5ZTAtOTAxYS0xMWQwLWExYzgtOWIwMTJjODhhYTc3PW5vbmU7ZXhwaXJlcz1Nb25kYXksCiAgICAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7IGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQoqKioqLwoKCiNpbmNsdWRlICJjdXJsX3NldHVwLmgiCgojaWYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0hUVFApICYmICFkZWZpbmVkKENVUkxfRElTQUJMRV9DT09LSUVTKQoKI2lmZGVmIFVTRV9MSUJQU0wKIyBpbmNsdWRlIDxsaWJwc2wuaD4KI2VuZGlmCgojaW5jbHVkZSAidXJsZGF0YS5oIgojaW5jbHVkZSAiY29va2llLmgiCiNpbmNsdWRlICJzdHJ0b2suaCIKI2luY2x1ZGUgInNlbmRmLmgiCiNpbmNsdWRlICJzbGlzdC5oIgojaW5jbHVkZSAic2hhcmUuaCIKI2luY2x1ZGUgInN0cnRvb2ZmdC5oIgojaW5jbHVkZSAic3RyY2FzZS5oIgojaW5jbHVkZSAiY3VybF9tZW1yY2hyLmgiCiNpbmNsdWRlICJpbmV0X3B0b24uaCIKCi8qIFRoZSBsYXN0IDMgI2luY2x1ZGUgZmlsZXMgc2hvdWxkIGJlIGluIHRoaXMgb3JkZXIgKi8KI2luY2x1ZGUgImN1cmxfcHJpbnRmLmgiCiNpbmNsdWRlICJjdXJsX21lbW9yeS5oIgojaW5jbHVkZSAibWVtZGVidWcuaCIKCnN0YXRpYyB2b2lkIGZyZWVjb29raWUoc3RydWN0IENvb2tpZSAqY28pCnsKICBmcmVlKGNvLT5leHBpcmVzdHIpOwogIGZyZWUoY28tPmRvbWFpbik7CiAgZnJlZShjby0+cGF0aCk7CiAgZnJlZShjby0+c3BhdGgpOwogIGZyZWUoY28tPm5hbWUpOwogIGZyZWUoY28tPnZhbHVlKTsKICBmcmVlKGNvLT5tYXhhZ2UpOwogIGZyZWUoY28tPnZlcnNpb24pOwogIGZyZWUoY28pOwp9CgpzdGF0aWMgYm9vbCB0YWlsbWF0Y2goY29uc3QgY2hhciAqY29va2VfZG9tYWluLCBjb25zdCBjaGFyICpob3N0bmFtZSkKewogIHNpemVfdCBjb29raWVfZG9tYWluX2xlbiA9IHN0cmxlbihjb29rZV9kb21haW4pOwogIHNpemVfdCBob3N0bmFtZV9sZW4gPSBzdHJsZW4oaG9zdG5hbWUpOwoKICBpZihob3N0bmFtZV9sZW4gPCBjb29raWVfZG9tYWluX2xlbikKICAgIHJldHVybiBGQUxTRTsKCiAgaWYoIXN0cmNhc2Vjb21wYXJlKGNvb2tlX2RvbWFpbiwgaG9zdG5hbWUgKyBob3N0bmFtZV9sZW4tY29va2llX2RvbWFpbl9sZW4pKQogICAgcmV0dXJuIEZBTFNFOwoKICAvKiBBIGxlYWQgY2hhciBvZiBjb29raWVfZG9tYWluIGlzIG5vdCAnLicuCiAgICAgUkZDNjI2NSA0LjEuMi4zLiBUaGUgRG9tYWluIEF0dHJpYnV0ZSBzYXlzOgogICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSB2YWx1ZSBvZiB0aGUgRG9tYWluIGF0dHJpYnV0ZSBpcwogICAgICAgImV4YW1wbGUuY29tIiwgdGhlIHVzZXIgYWdlbnQgd2lsbCBpbmNsdWRlIHRoZSBjb29raWUgaW4gdGhlIENvb2tpZQogICAgICAgaGVhZGVyIHdoZW4gbWFraW5nIEhUVFAgcmVxdWVzdHMgdG8gZXhhbXBsZS5jb20sIHd3dy5leGFtcGxlLmNvbSwgYW5kCiAgICAgICB3d3cuY29ycC5leGFtcGxlLmNvbS4KICAgKi8KICBpZihob3N0bmFtZV9sZW4gPT0gY29va2llX2RvbWFpbl9sZW4pCiAgICByZXR1cm4gVFJVRTsKICBpZignLicgPT0gKihob3N0bmFtZSArIGhvc3RuYW1lX2xlbiAtIGNvb2tpZV9kb21haW5fbGVuIC0gMSkpCiAgICByZXR1cm4gVFJVRTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qCiAqIG1hdGNoaW5nIGNvb2tpZSBwYXRoIGFuZCB1cmwgcGF0aAogKiBSRkM2MjY1IDUuMS40IFBhdGhzIGFuZCBQYXRoLU1hdGNoCiAqLwpzdGF0aWMgYm9vbCBwYXRobWF0Y2goY29uc3QgY2hhciAqY29va2llX3BhdGgsIGNvbnN0IGNoYXIgKnJlcXVlc3RfdXJpKQp7CiAgc2l6ZV90IGNvb2tpZV9wYXRoX2xlbjsKICBzaXplX3QgdXJpX3BhdGhfbGVuOwogIGNoYXIgKnVyaV9wYXRoID0gTlVMTDsKICBjaGFyICpwb3M7CiAgYm9vbCByZXQgPSBGQUxTRTsKCiAgLyogY29va2llX3BhdGggbXVzdCBub3QgaGF2ZSBsYXN0ICcvJyBzZXBhcmF0b3IuIGV4OiAvc2FtcGxlICovCiAgY29va2llX3BhdGhfbGVuID0gc3RybGVuKGNvb2tpZV9wYXRoKTsKICBpZigxID09IGNvb2tpZV9wYXRoX2xlbikgewogICAgLyogY29va2llX3BhdGggbXVzdCBiZSAnLycgKi8KICAgIHJldHVybiBUUlVFOwogIH0KCiAgdXJpX3BhdGggPSBzdHJkdXAocmVxdWVzdF91cmkpOwogIGlmKCF1cmlfcGF0aCkKICAgIHJldHVybiBGQUxTRTsKICBwb3MgPSBzdHJjaHIodXJpX3BhdGgsICc/Jyk7CiAgaWYocG9zKQogICAgKnBvcyA9IDB4MDsKCiAgLyogIy1mcmFnbWVudHMgYXJlIGFscmVhZHkgY3V0IG9mZiEgKi8KICBpZigwID09IHN0cmxlbih1cmlfcGF0aCkgfHwgdXJpX3BhdGhbMF0gIT0gJy8nKSB7CiAgICBmcmVlKHVyaV9wYXRoKTsKICAgIHVyaV9wYXRoID0gc3RyZHVwKCIvIik7CiAgICBpZighdXJpX3BhdGgpCiAgICAgIHJldHVybiBGQUxTRTsKICB9CgogIC8qIGhlcmUsIFJGQzYyNjUgNS4xLjQgc2F5cwogICAgIDQuIE91dHB1dCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdXJpLXBhdGggZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyIHVwCiAgICAgICAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgcmlnaHQtbW9zdCAleDJGICgiLyIpLgogICAgIGJ1dCBVUkwgcGF0aCAvaG9nZT9mdWdhPXh4eCBtZWFucyAvaG9nZS9pbmRleC5jZ2k/ZnVnYT14eHggaW4gc29tZSBzaXRlCiAgICAgd2l0aG91dCByZWRpcmVjdC4KICAgICBJZ25vcmUgdGhpcyBhbGdvcml0aG0gYmVjYXVzZSAvaG9nZSBpcyB1cmkgcGF0aCBmb3IgdGhpcyBjYXNlCiAgICAgKHVyaSBwYXRoIGlzIG5vdCAvKS4KICAgKi8KCiAgdXJpX3BhdGhfbGVuID0gc3RybGVuKHVyaV9wYXRoKTsKCiAgaWYodXJpX3BhdGhfbGVuIDwgY29va2llX3BhdGhfbGVuKSB7CiAgICByZXQgPSBGQUxTRTsKICAgIGdvdG8gcGF0aG1hdGNoZWQ7CiAgfQoKICAvKiBub3QgdXNpbmcgY2hlY2twcmVmaXgoKSBiZWNhdXNlIG1hdGNoaW5nIHNob3VsZCBiZSBjYXNlLXNlbnNpdGl2ZSAqLwogIGlmKHN0cm5jbXAoY29va2llX3BhdGgsIHVyaV9wYXRoLCBjb29raWVfcGF0aF9sZW4pKSB7CiAgICByZXQgPSBGQUxTRTsKICAgIGdvdG8gcGF0aG1hdGNoZWQ7CiAgfQoKICAvKiBUaGUgY29va2llLXBhdGggYW5kIHRoZSB1cmktcGF0aCBhcmUgaWRlbnRpY2FsLiAqLwogIGlmKGNvb2tpZV9wYXRoX2xlbiA9PSB1cmlfcGF0aF9sZW4pIHsKICAgIHJldCA9IFRSVUU7CiAgICBnb3RvIHBhdGhtYXRjaGVkOwogIH0KCiAgLyogaGVyZSwgY29va2llX3BhdGhfbGVuIDwgdXJsX3BhdGhfbGVuICovCiAgaWYodXJpX3BhdGhbY29va2llX3BhdGhfbGVuXSA9PSAnLycpIHsKICAgIHJldCA9IFRSVUU7CiAgICBnb3RvIHBhdGhtYXRjaGVkOwogIH0KCiAgcmV0ID0gRkFMU0U7CgpwYXRobWF0Y2hlZDoKICBmcmVlKHVyaV9wYXRoKTsKICByZXR1cm4gcmV0Owp9CgovKgogKiBjb29raWUgcGF0aCBzYW5pdGl6ZQogKi8Kc3RhdGljIGNoYXIgKnNhbml0aXplX2Nvb2tpZV9wYXRoKGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoKQp7CiAgc2l6ZV90IGxlbjsKICBjaGFyICpuZXdfcGF0aCA9IHN0cmR1cChjb29raWVfcGF0aCk7CiAgaWYoIW5ld19wYXRoKQogICAgcmV0dXJuIE5VTEw7CgogIC8qIHNvbWUgc3R1cGlkIHNpdGUgc2VuZHMgcGF0aCBhdHRyaWJ1dGUgd2l0aCAnIicuICovCiAgbGVuID0gc3RybGVuKG5ld19wYXRoKTsKICBpZihuZXdfcGF0aFswXSA9PSAnXCInKSB7CiAgICBtZW1tb3ZlKCh2b2lkICopbmV3X3BhdGgsIChjb25zdCB2b2lkICopKG5ld19wYXRoICsgMSksIGxlbik7CiAgICBsZW4tLTsKICB9CiAgaWYobGVuICYmIChuZXdfcGF0aFtsZW4gLSAxXSA9PSAnXCInKSkgewogICAgbmV3X3BhdGhbbGVuIC0gMV0gPSAweDA7CiAgICBsZW4tLTsKICB9CgogIC8qIFJGQzYyNjUgNS4yLjQgVGhlIFBhdGggQXR0cmlidXRlICovCiAgaWYobmV3X3BhdGhbMF0gIT0gJy8nKSB7CiAgICAvKiBMZXQgY29va2llLXBhdGggYmUgdGhlIGRlZmF1bHQtcGF0aC4gKi8KICAgIGZyZWUobmV3X3BhdGgpOwogICAgbmV3X3BhdGggPSBzdHJkdXAoIi8iKTsKICAgIHJldHVybiBuZXdfcGF0aDsKICB9CgogIC8qIGNvbnZlcnQgL2hvZ2UvIHRvIC9ob2dlICovCiAgaWYobGVuICYmIG5ld19wYXRoW2xlbiAtIDFdID09ICcvJykgewogICAgbmV3X3BhdGhbbGVuIC0gMV0gPSAweDA7CiAgfQoKICByZXR1cm4gbmV3X3BhdGg7Cn0KCi8qCiAqIExvYWQgY29va2llcyBmcm9tIGFsbCBnaXZlbiBjb29raWUgZmlsZXMgKENVUkxPUFRfQ09PS0lFRklMRSkuCiAqCiAqIE5PVEU6IE9PTSBvciBjb29raWUgcGFyc2luZyBmYWlsdXJlcyBhcmUgaWdub3JlZC4KICovCnZvaWQgQ3VybF9jb29raWVfbG9hZGZpbGVzKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCnsKICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdCA9IGRhdGEtPmNoYW5nZS5jb29raWVsaXN0OwogIGlmKGxpc3QpIHsKICAgIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUsIENVUkxfTE9DS19BQ0NFU1NfU0lOR0xFKTsKICAgIHdoaWxlKGxpc3QpIHsKICAgICAgc3RydWN0IENvb2tpZUluZm8gKm5ld2Nvb2tpZXMgPSBDdXJsX2Nvb2tpZV9pbml0KGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+Y29va2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5jb29raWVzZXNzaW9uKTsKICAgICAgaWYoIW5ld2Nvb2tpZXMpCiAgICAgICAgLyogRmFpbHVyZSBtYXkgYmUgZHVlIHRvIE9PTSBvciBhIGJhZCBjb29raWU7IGJvdGggYXJlIGlnbm9yZWQKICAgICAgICAgKiBidXQgb25seSB0aGUgZmlyc3Qgc2hvdWxkIGJlCiAgICAgICAgICovCiAgICAgICAgaW5mb2YoZGF0YSwgImlnbm9yaW5nIGZhaWxlZCBjb29raWVfaW5pdCBmb3IgJXNcbiIsIGxpc3QtPmRhdGEpOwogICAgICBlbHNlCiAgICAgICAgZGF0YS0+Y29va2llcyA9IG5ld2Nvb2tpZXM7CiAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwogICAgfQogICAgY3VybF9zbGlzdF9mcmVlX2FsbChkYXRhLT5jaGFuZ2UuY29va2llbGlzdCk7IC8qIGNsZWFuIHVwIGxpc3QgKi8KICAgIGRhdGEtPmNoYW5nZS5jb29raWVsaXN0ID0gTlVMTDsgLyogZG9uJ3QgZG8gdGhpcyBhZ2FpbiEgKi8KICAgIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7CiAgfQp9CgovKgogKiBzdHJzdG9yZSgpIG1ha2VzIGEgc3RyZHVwKCkgb24gdGhlICduZXdzdHInIGFuZCBpZiAnKnN0cicgaXMgbm9uLU5VTEwKICogdGhhdCB3aWxsIGJlIGZyZWVkIGJlZm9yZSB0aGUgYWxsb2NhdGVkIHN0cmluZyBpcyBzdG9yZWQgdGhlcmUuCiAqCiAqIEl0IGlzIG1lYW50IHRvIGVhc2lseSByZXBsYWNlIHN0cmR1cCgpCiAqLwpzdGF0aWMgdm9pZCBzdHJzdG9yZShjaGFyICoqc3RyLCBjb25zdCBjaGFyICpuZXdzdHIpCnsKICBmcmVlKCpzdHIpOwogICpzdHIgPSBzdHJkdXAobmV3c3RyKTsKfQoKLyoKICogcmVtb3ZlX2V4cGlyZWQoKSByZW1vdmVzIGV4cGlyZWQgY29va2llcy4KICovCnN0YXRpYyB2b2lkIHJlbW92ZV9leHBpcmVkKHN0cnVjdCBDb29raWVJbmZvICpjb29raWVzKQp7CiAgc3RydWN0IENvb2tpZSAqY28sICpueCwgKnB2OwogIGN1cmxfb2ZmX3Qgbm93ID0gKGN1cmxfb2ZmX3QpdGltZShOVUxMKTsKCiAgY28gPSBjb29raWVzLT5jb29raWVzOwogIHB2ID0gTlVMTDsKICB3aGlsZShjbykgewogICAgbnggPSBjby0+bmV4dDsKICAgIGlmKGNvLT5leHBpcmVzICYmIGNvLT5leHBpcmVzIDwgbm93KSB7CiAgICAgIGlmKGNvID09IGNvb2tpZXMtPmNvb2tpZXMpIHsKICAgICAgICBjb29raWVzLT5jb29raWVzID0gY28tPm5leHQ7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcHYtPm5leHQgPSBjby0+bmV4dDsKICAgICAgfQogICAgICBjb29raWVzLT5udW1jb29raWVzLS07CiAgICAgIGZyZWVjb29raWUoY28pOwogICAgfQogICAgZWxzZSB7CiAgICAgIHB2ID0gY287CiAgICB9CiAgICBjbyA9IG54OwogIH0KfQoKLyoKICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhbiBJUCh2NHx2NikgYWRkcmVzcy4KICovCnN0YXRpYyBib29sIGlzaXAoY29uc3QgY2hhciAqZG9tYWluKQp7CiAgc3RydWN0IGluX2FkZHIgYWRkcjsKI2lmZGVmIEVOQUJMRV9JUFY2CiAgc3RydWN0IGluNl9hZGRyIGFkZHI2OwojZW5kaWYKCiAgaWYoQ3VybF9pbmV0X3B0b24oQUZfSU5FVCwgZG9tYWluLCAmYWRkcikKI2lmZGVmIEVOQUJMRV9JUFY2CiAgICAgfHwgQ3VybF9pbmV0X3B0b24oQUZfSU5FVDYsIGRvbWFpbiwgJmFkZHI2KQojZW5kaWYKICAgICkgewogICAgLyogZG9tYWluIG5hbWUgZ2l2ZW4gYXMgSVAgYWRkcmVzcyAqLwogICAgcmV0dXJuIFRSVUU7CiAgfQoKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2FkZCgpCiAqCiAqIEFkZCBhIHNpbmdsZSBjb29raWUgbGluZSB0byB0aGUgY29va2llIGtlZXBpbmcgb2JqZWN0LgogKgogKiBCZSBhd2FyZSB0aGF0IHNvbWV0aW1lcyB3ZSBnZXQgYW4gSVAtb25seSBob3N0IG5hbWUsIGFuZCB0aGF0IG1pZ2h0IGFsc28gYmUKICogYSBudW1lcmljYWwgSVB2NiBhZGRyZXNzLgogKgogKiBSZXR1cm5zIE5VTEwgb24gb3V0IG9mIG1lbW9yeSBvciBpbnZhbGlkIGNvb2tpZS4gVGhpcyBpcyBzdWJvcHRpbWFsLAogKiBhcyB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIHNlcGFyYXRlbHkuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgQ29va2llICoKQ3VybF9jb29raWVfYWRkKHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAvKiBUaGUgJ2RhdGEnIHBvaW50ZXIgaGVyZSBtYXkgYmUgTlVMTCBhdCB0aW1lcywgYW5kIHRodXMKICAgICAgICAgICAgICAgICAgIG11c3Qgb25seSBiZSB1c2VkIHZlcnkgY2FyZWZ1bGx5IGZvciB0aGluZ3MgdGhhdCBjYW4gZGVhbAogICAgICAgICAgICAgICAgICAgd2l0aCBkYXRhIGJlaW5nIE5VTEwuIFN1Y2ggYXMgaW5mb2YoKSBhbmQgc2ltaWxhciAqLwoKICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICpjLAogICAgICAgICAgICAgICAgYm9vbCBodHRwaGVhZGVyLCAvKiBUUlVFIGlmIEhUVFAgaGVhZGVyLXN0eWxlIGxpbmUgKi8KICAgICAgICAgICAgICAgIGNoYXIgKmxpbmVwdHIsICAgLyogZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkb21haW4sIC8qIGRlZmF1bHQgZG9tYWluICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoKSAgIC8qIGZ1bGwgcGF0aCB1c2VkIHdoZW4gdGhpcyBjb29raWUgaXMgc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGdldCBkZWZhdWx0IHBhdGggZm9yIHRoZSBjb29raWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHNldCAqLwp7CiAgc3RydWN0IENvb2tpZSAqY2xpc3Q7CiAgc3RydWN0IENvb2tpZSAqY287CiAgc3RydWN0IENvb2tpZSAqbGFzdGMgPSBOVUxMOwogIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogIGJvb2wgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICBib29sIGJhZGNvb2tpZSA9IEZBTFNFOyAvKiBjb29raWVzIGFyZSBnb29kIGJ5IGRlZmF1bHQuIG1tbW1tIHl1bW15ICovCgojaWZkZWYgVVNFX0xJQlBTTAogIGNvbnN0IHBzbF9jdHhfdCAqcHNsOwojZW5kaWYKCiNpZmRlZiBDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTCiAgKHZvaWQpZGF0YTsKI2VuZGlmCgogIC8qIEZpcnN0LCBhbGxvYyBhbmQgaW5pdCBhIG5ldyBzdHJ1Y3QgZm9yIGl0ICovCiAgY28gPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBDb29raWUpKTsKICBpZighY28pCiAgICByZXR1cm4gTlVMTDsgLyogYmFpbCBvdXQgaWYgd2UncmUgdGhpcyBsb3cgb24gbWVtb3J5ICovCgogIGlmKGh0dHBoZWFkZXIpIHsKICAgIC8qIFRoaXMgbGluZSB3YXMgcmVhZCBvZmYgYSBIVFRQLWhlYWRlciAqLwogICAgY2hhciBuYW1lW01BWF9OQU1FXTsKICAgIGNoYXIgd2hhdFtNQVhfTkFNRV07CiAgICBjb25zdCBjaGFyICpwdHI7CiAgICBjb25zdCBjaGFyICpzZW1pcHRyOwoKICAgIHNpemVfdCBsaW5lbGVuZ3RoID0gc3RybGVuKGxpbmVwdHIpOwogICAgaWYobGluZWxlbmd0aCA+IE1BWF9DT09LSUVfTElORSkgewogICAgICAvKiBkaXNjYXJkIG92ZXJseSBsb25nIGxpbmVzIGF0IG9uY2UgKi8KICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHNlbWlwdHIgPSBzdHJjaHIobGluZXB0ciwgJzsnKTsgLyogZmlyc3QsIGZpbmQgYSBzZW1pY29sb24gKi8KCiAgICB3aGlsZSgqbGluZXB0ciAmJiBJU0JMQU5LKCpsaW5lcHRyKSkKICAgICAgbGluZXB0cisrOwoKICAgIHB0ciA9IGxpbmVwdHI7CiAgICBkbyB7CiAgICAgIC8qIHdlIGhhdmUgYSA8d2hhdD49PHRoaXM+IHBhaXIgb3IgYSBzdGFuZC1hbG9uZSB3b3JkIGhlcmUgKi8KICAgICAgbmFtZVswXSA9IHdoYXRbMF0gPSAwOyAvKiBpbml0IHRoZSBidWZmZXJzICovCiAgICAgIGlmKDEgPD0gc3NjYW5mKHB0ciwgIiUiIE1BWF9OQU1FX1RYVCAiW147XHJcbj1dID0lIgogICAgICAgICAgICAgICAgICAgICBNQVhfTkFNRV9UWFQgIlteO1xyXG5dIiwKICAgICAgICAgICAgICAgICAgICAgbmFtZSwgd2hhdCkpIHsKICAgICAgICAvKiBVc2Ugc3Ryc3RvcmUoKSBiZWxvdyB0byBwcm9wZXJseSBkZWFsIHdpdGggcmVjZWl2ZWQgY29va2llCiAgICAgICAgICAgaGVhZGVycyB0aGF0IGhhdmUgdGhlIHNhbWUgc3RyaW5nIHByb3BlcnR5IHNldCBtb3JlIHRoYW4gb25jZSwKICAgICAgICAgICBhbmQgdGhlbiB3ZSB1c2UgdGhlIGxhc3Qgb25lLiAqLwogICAgICAgIGNvbnN0IGNoYXIgKndoYXRwdHI7CiAgICAgICAgYm9vbCBkb25lID0gRkFMU0U7CiAgICAgICAgYm9vbCBzZXA7CiAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbih3aGF0KTsKICAgICAgICBzaXplX3QgbmxlbiA9IHN0cmxlbihuYW1lKTsKICAgICAgICBjb25zdCBjaGFyICplbmRvZm4gPSAmcHRyWyBubGVuIF07CgogICAgICAgIGluZm9mKGRhdGEsICJjb29raWUgc2l6ZTogbmFtZS92YWwgJWQgKyAlZCBieXRlc1xuIiwKICAgICAgICAgICAgICBubGVuLCBsZW4pOwoKICAgICAgICBpZihubGVuID49IChNQVhfTkFNRS0xKSB8fCBsZW4gPj0gKE1BWF9OQU1FLTEpIHx8CiAgICAgICAgICAgKChubGVuICsgbGVuKSA+IE1BWF9OQU1FKSkgewogICAgICAgICAgLyogdG9vIGxvbmcgaW5kaXZpZHVhbCBuYW1lIG9yIGNvbnRlbnRzLCBvciB0b28gbG9uZyBjb21iaW5hdGlvbiBvZgogICAgICAgICAgICAgbmFtZSArIGNvbnRlbnRzLiBDaHJvbWUgYW5kIEZpcmVmb3ggc3VwcG9ydCA0MDk1IG9yIDQwOTYgYnl0ZXMKICAgICAgICAgICAgIGNvbWJvLiAqLwogICAgICAgICAgZnJlZWNvb2tpZShjbyk7CiAgICAgICAgICBpbmZvZihkYXRhLCAib3ZlcnNpemVkIGNvb2tpZSBkcm9wcGVkLCBuYW1lL3ZhbCAlZCArICVkIGJ5dGVzXG4iLAogICAgICAgICAgICAgICAgbmxlbiwgbGVuKTsKICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KCiAgICAgICAgLyogbmFtZSBlbmRzIHdpdGggYSAnPScgPyAqLwogICAgICAgIHNlcCA9ICgqZW5kb2ZuID09ICc9Jyk/VFJVRTpGQUxTRTsKCiAgICAgICAgaWYobmxlbikgewogICAgICAgICAgZW5kb2ZuLS07IC8qIG1vdmUgdG8gdGhlIGxhc3QgY2hhcmFjdGVyICovCiAgICAgICAgICBpZihJU0JMQU5LKCplbmRvZm4pKSB7CiAgICAgICAgICAgIC8qIHNraXAgdHJhaWxpbmcgc3BhY2VzIGluIG5hbWUgKi8KICAgICAgICAgICAgd2hpbGUoKmVuZG9mbiAmJiBJU0JMQU5LKCplbmRvZm4pICYmIG5sZW4pIHsKICAgICAgICAgICAgICBlbmRvZm4tLTsKICAgICAgICAgICAgICBubGVuLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmFtZVtubGVuXSA9IDA7IC8qIG5ldyBlbmQgb2YgbmFtZSAqLwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogU3RyaXAgb2ZmIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgJ3doYXQnICovCiAgICAgICAgd2hpbGUobGVuICYmIElTQkxBTksod2hhdFtsZW4tMV0pKSB7CiAgICAgICAgICB3aGF0W2xlbi0xXSA9IDA7CiAgICAgICAgICBsZW4tLTsKICAgICAgICB9CgogICAgICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlICd3aGF0JyAqLwogICAgICAgIHdoYXRwdHIgPSB3aGF0OwogICAgICAgIHdoaWxlKCp3aGF0cHRyICYmIElTQkxBTksoKndoYXRwdHIpKQogICAgICAgICAgd2hhdHB0cisrOwoKICAgICAgICBpZighY28tPm5hbWUgJiYgc2VwKSB7CiAgICAgICAgICAvKiBUaGUgdmVyeSBmaXJzdCBuYW1lL3ZhbHVlIHBhaXIgaXMgdGhlIGFjdHVhbCBjb29raWUgbmFtZSAqLwogICAgICAgICAgY28tPm5hbWUgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgICBjby0+dmFsdWUgPSBzdHJkdXAod2hhdHB0cik7CiAgICAgICAgICBpZighY28tPm5hbWUgfHwgIWNvLT52YWx1ZSkgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZighbGVuKSB7CiAgICAgICAgICAvKiB0aGlzIHdhcyBhICI8bmFtZT49IiB3aXRoIG5vIGNvbnRlbnQsIGFuZCB3ZSBtdXN0IGFsbG93CiAgICAgICAgICAgICAnc2VjdXJlJyBhbmQgJ2h0dHBvbmx5JyBzcGVjaWZpZWQgdGhpcyB3ZWlyZGx5ICovCiAgICAgICAgICBkb25lID0gVFJVRTsKICAgICAgICAgIGlmKHN0cmNhc2Vjb21wYXJlKCJzZWN1cmUiLCBuYW1lKSkKICAgICAgICAgICAgY28tPnNlY3VyZSA9IFRSVUU7CiAgICAgICAgICBlbHNlIGlmKHN0cmNhc2Vjb21wYXJlKCJodHRwb25seSIsIG5hbWUpKQogICAgICAgICAgICBjby0+aHR0cG9ubHkgPSBUUlVFOwogICAgICAgICAgZWxzZSBpZihzZXApCiAgICAgICAgICAgIC8qIHRoZXJlIHdhcyBhICc9JyBzbyB3ZSdyZSBub3QgZG9uZSBwYXJzaW5nIHRoaXMgZmllbGQgKi8KICAgICAgICAgICAgZG9uZSA9IEZBTFNFOwogICAgICAgIH0KICAgICAgICBpZihkb25lKQogICAgICAgICAgOwogICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoInBhdGgiLCBuYW1lKSkgewogICAgICAgICAgc3Ryc3RvcmUoJmNvLT5wYXRoLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+cGF0aCkgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOyAvKiBvdXQgb2YgbWVtb3J5IGJhZCAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGZyZWUoY28tPnNwYXRoKTsgLyogaWYgdGhpcyBpcyBzZXQgYWdhaW4gKi8KICAgICAgICAgIGNvLT5zcGF0aCA9IHNhbml0aXplX2Nvb2tpZV9wYXRoKGNvLT5wYXRoKTsKICAgICAgICAgIGlmKCFjby0+c3BhdGgpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoImRvbWFpbiIsIG5hbWUpKSB7CiAgICAgICAgICBib29sIGlzX2lwOwoKICAgICAgICAgIC8qIE5vdywgd2UgbWFrZSBzdXJlIHRoYXQgb3VyIGhvc3QgaXMgd2l0aGluIHRoZSBnaXZlbiBkb21haW4sCiAgICAgICAgICAgICBvciB0aGUgZ2l2ZW4gZG9tYWluIGlzIG5vdCB2YWxpZCBhbmQgdGh1cyBjYW5ub3QgYmUgc2V0LiAqLwoKICAgICAgICAgIGlmKCcuJyA9PSB3aGF0cHRyWzBdKQogICAgICAgICAgICB3aGF0cHRyKys7IC8qIGlnbm9yZSBwcmVjZWRpbmcgZG90ICovCgojaWZuZGVmIFVTRV9MSUJQU0wKICAgICAgICAgIC8qCiAgICAgICAgICAgKiBXaXRob3V0IFBTTCB3ZSBkb24ndCBrbm93IHdoZW4gdGhlIGluY29taW5nIGNvb2tpZSBpcyBzZXQgb24gYQogICAgICAgICAgICogVExEIG9yIG90aGVyd2lzZSAicHJvdGVjdGVkIiBzdWZmaXguIFRvIHJlZHVjZSByaXNrLCB3ZSByZXF1aXJlIGEKICAgICAgICAgICAqIGRvdCBPUiB0aGUgZXhhY3QgaG9zdCBuYW1lIGJlaW5nICJsb2NhbGhvc3QiLgogICAgICAgICAgICovCiAgICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRvdHA7CiAgICAgICAgICAgIC8qIGNoZWNrIGZvciBtb3JlIGRvdHMgKi8KICAgICAgICAgICAgZG90cCA9IHN0cmNocih3aGF0cHRyLCAnLicpOwogICAgICAgICAgICBpZighZG90cCAmJiAhc3RyY2FzZWNvbXBhcmUoImxvY2FsaG9zdCIsIHdoYXRwdHIpKQogICAgICAgICAgICAgIGRvbWFpbiA9ICI6IjsKICAgICAgICAgIH0KI2VuZGlmCgogICAgICAgICAgaXNfaXAgPSBpc2lwKGRvbWFpbiA/IGRvbWFpbiA6IHdoYXRwdHIpOwoKICAgICAgICAgIGlmKCFkb21haW4KICAgICAgICAgICAgIHx8IChpc19pcCAmJiAhc3RyY21wKHdoYXRwdHIsIGRvbWFpbikpCiAgICAgICAgICAgICB8fCAoIWlzX2lwICYmIHRhaWxtYXRjaCh3aGF0cHRyLCBkb21haW4pKSkgewogICAgICAgICAgICBzdHJzdG9yZSgmY28tPmRvbWFpbiwgd2hhdHB0cik7CiAgICAgICAgICAgIGlmKCFjby0+ZG9tYWluKSB7CiAgICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZighaXNfaXApCiAgICAgICAgICAgICAgY28tPnRhaWxtYXRjaCA9IFRSVUU7IC8qIHdlIGFsd2F5cyBkbyB0aGF0IGlmIHRoZSBkb21haW4gbmFtZSB3YXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gKi8KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiB3ZSBkaWQgbm90IGdldCBhIHRhaWxtYXRjaCBhbmQgdGhlbiB0aGUgYXR0ZW1wdGVkIHNldCBkb21haW4KICAgICAgICAgICAgICAgaXMgbm90IGEgZG9tYWluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGhvc3QgYmVsb25ncy4gTWFyayBhcwogICAgICAgICAgICAgICBiYWQuICovCiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgIGluZm9mKGRhdGEsICJza2lwcGVkIGNvb2tpZSB3aXRoIGJhZCB0YWlsbWF0Y2ggZG9tYWluOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgd2hhdHB0cik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoInZlcnNpb24iLCBuYW1lKSkgewogICAgICAgICAgc3Ryc3RvcmUoJmNvLT52ZXJzaW9uLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+dmVyc2lvbikgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZihzdHJjYXNlY29tcGFyZSgibWF4LWFnZSIsIG5hbWUpKSB7CiAgICAgICAgICAvKiBEZWZpbmVkIGluIFJGQzIxMDk6CgogICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgTWF4LUFnZSBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGlmZXRpbWUgb2YgdGhlCiAgICAgICAgICAgICBjb29raWUsIGluIHNlY29uZHMuICBUaGUgZGVsdGEtc2Vjb25kcyB2YWx1ZSBpcyBhIGRlY2ltYWwgbm9uLQogICAgICAgICAgICAgbmVnYXRpdmUgaW50ZWdlci4gIEFmdGVyIGRlbHRhLXNlY29uZHMgc2Vjb25kcyBlbGFwc2UsIHRoZQogICAgICAgICAgICAgY2xpZW50IHNob3VsZCBkaXNjYXJkIHRoZSBjb29raWUuICBBIHZhbHVlIG9mIHplcm8gbWVhbnMgdGhlCiAgICAgICAgICAgICBjb29raWUgc2hvdWxkIGJlIGRpc2NhcmRlZCBpbW1lZGlhdGVseS4KCiAgICAgICAgICAqLwogICAgICAgICAgc3Ryc3RvcmUoJmNvLT5tYXhhZ2UsIHdoYXRwdHIpOwogICAgICAgICAgaWYoIWNvLT5tYXhhZ2UpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoc3RyY2FzZWNvbXBhcmUoImV4cGlyZXMiLCBuYW1lKSkgewogICAgICAgICAgc3Ryc3RvcmUoJmNvLT5leHBpcmVzdHIsIHdoYXRwdHIpOwogICAgICAgICAgaWYoIWNvLT5leHBpcmVzdHIpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICBlbHNlIHRoaXMgaXMgdGhlIHNlY29uZCAob3IgbW9yZSkgbmFtZSB3ZSBkb24ndCBrbm93CiAgICAgICAgICBhYm91dCEgKi8KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAvKiB0aGlzIGlzIGFuICJpbGxlZ2FsIiA8d2hhdD49PHRoaXM+IHBhaXIgKi8KICAgICAgfQoKICAgICAgaWYoIXNlbWlwdHIgfHwgISpzZW1pcHRyKSB7CiAgICAgICAgLyogd2UgYWxyZWFkeSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGNvb2tpZXMgKi8KICAgICAgICBzZW1pcHRyID0gTlVMTDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgcHRyID0gc2VtaXB0ciArIDE7CiAgICAgIHdoaWxlKCpwdHIgJiYgSVNCTEFOSygqcHRyKSkKICAgICAgICBwdHIrKzsKICAgICAgc2VtaXB0ciA9IHN0cmNocihwdHIsICc7Jyk7IC8qIG5vdywgZmluZCB0aGUgbmV4dCBzZW1pY29sb24gKi8KCiAgICAgIGlmKCFzZW1pcHRyICYmICpwdHIpCiAgICAgICAgLyogVGhlcmUgYXJlIG5vIG1vcmUgc2VtaWNvbG9ucywgYnV0IHRoZXJlJ3MgYSBmaW5hbCBuYW1lPXZhbHVlIHBhaXIKICAgICAgICAgICBjb21pbmcgdXAgKi8KICAgICAgICBzZW1pcHRyID0gc3RyY2hyKHB0ciwgJ1wwJyk7CiAgICB9IHdoaWxlKHNlbWlwdHIpOwoKICAgIGlmKGNvLT5tYXhhZ2UpIHsKICAgICAgQ1VSTG9mZnQgb2ZmdDsKICAgICAgb2ZmdCA9IGN1cmx4X3N0cnRvb2ZmdCgoKmNvLT5tYXhhZ2UgPT0gJ1wiJyk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvLT5tYXhhZ2VbMV06JmNvLT5tYXhhZ2VbMF0sIE5VTEwsIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjby0+ZXhwaXJlcyk7CiAgICAgIGlmKG9mZnQgPT0gQ1VSTF9PRkZUX0ZMT1cpCiAgICAgICAgLyogb3ZlcmZsb3csIHVzZWQgbWF4IHZhbHVlICovCiAgICAgICAgY28tPmV4cGlyZXMgPSBDVVJMX09GRl9UX01BWDsKICAgICAgZWxzZSBpZighb2ZmdCkgewogICAgICAgIGlmKENVUkxfT0ZGX1RfTUFYIC0gbm93IDwgY28tPmV4cGlyZXMpCiAgICAgICAgICAvKiB3b3VsZCBvdmVyZmxvdyAqLwogICAgICAgICAgY28tPmV4cGlyZXMgPSBDVVJMX09GRl9UX01BWDsKICAgICAgICBlbHNlCiAgICAgICAgICBjby0+ZXhwaXJlcyArPSBub3c7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoY28tPmV4cGlyZXN0cikgewogICAgICAvKiBOb3RlIHRoYXQgaWYgdGhlIGRhdGUgY291bGRuJ3QgZ2V0IHBhcnNlZCBmb3Igd2hhdGV2ZXIgcmVhc29uLAogICAgICAgICB0aGUgY29va2llIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlc3Npb24gY29va2llICovCiAgICAgIGNvLT5leHBpcmVzID0gY3VybF9nZXRkYXRlKGNvLT5leHBpcmVzdHIsIE5VTEwpOwoKICAgICAgLyogU2Vzc2lvbiBjb29raWVzIGhhdmUgZXhwaXJlcyBzZXQgdG8gMCBzbyBpZiB3ZSBnZXQgdGhhdCBiYWNrCiAgICAgICAgIGZyb20gdGhlIGRhdGUgcGFyc2VyIGxldCdzIGFkZCBhIHNlY29uZCB0byBtYWtlIGl0IGEKICAgICAgICAgbm9uLXNlc3Npb24gY29va2llICovCiAgICAgIGlmKGNvLT5leHBpcmVzID09IDApCiAgICAgICAgY28tPmV4cGlyZXMgPSAxOwogICAgICBlbHNlIGlmKGNvLT5leHBpcmVzIDwgMCkKICAgICAgICBjby0+ZXhwaXJlcyA9IDA7CiAgICB9CgogICAgaWYoIWJhZGNvb2tpZSAmJiAhY28tPmRvbWFpbikgewogICAgICBpZihkb21haW4pIHsKICAgICAgICAvKiBubyBkb21haW4gd2FzIGdpdmVuIGluIHRoZSBoZWFkZXIgbGluZSwgc2V0IHRoZSBkZWZhdWx0ICovCiAgICAgICAgY28tPmRvbWFpbiA9IHN0cmR1cChkb21haW4pOwogICAgICAgIGlmKCFjby0+ZG9tYWluKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgfQogICAgfQoKICAgIGlmKCFiYWRjb29raWUgJiYgIWNvLT5wYXRoICYmIHBhdGgpIHsKICAgICAgLyogTm8gcGF0aCB3YXMgZ2l2ZW4gaW4gdGhlIGhlYWRlciBsaW5lLCBzZXQgdGhlIGRlZmF1bHQuCiAgICAgICAgIE5vdGUgdGhhdCB0aGUgcGFzc2VkLWluIHBhdGggdG8gdGhpcyBmdW5jdGlvbiBNQVkgaGF2ZSBhICc/JyBhbmQKICAgICAgICAgZm9sbG93aW5nIHBhcnQgdGhhdCBNVVNUIG5vdCBiZSBzdG9yZWQgYXMgcGFydCBvZiB0aGUgcGF0aC4gKi8KICAgICAgY2hhciAqcXVlcnlwID0gc3RyY2hyKHBhdGgsICc/Jyk7CgogICAgICAvKiBxdWVyeXAgaXMgd2hlcmUgdGhlIGludGVyZXN0aW5nIHBhcnQgb2YgdGhlIHBhdGggZW5kcywgc28gbm93IHdlCiAgICAgICAgIHdhbnQgdG8gdGhlIGZpbmQgdGhlIGxhc3QgKi8KICAgICAgY2hhciAqZW5kc2xhc2g7CiAgICAgIGlmKCFxdWVyeXApCiAgICAgICAgZW5kc2xhc2ggPSBzdHJyY2hyKHBhdGgsICcvJyk7CiAgICAgIGVsc2UKICAgICAgICBlbmRzbGFzaCA9IG1lbXJjaHIocGF0aCwgJy8nLCAoc2l6ZV90KShxdWVyeXAgLSBwYXRoKSk7CiAgICAgIGlmKGVuZHNsYXNoKSB7CiAgICAgICAgc2l6ZV90IHBhdGhsZW4gPSAoc2l6ZV90KShlbmRzbGFzaC1wYXRoICsgMSk7IC8qIGluY2x1ZGUgZW5kIHNsYXNoICovCiAgICAgICAgY28tPnBhdGggPSBtYWxsb2MocGF0aGxlbiArIDEpOyAvKiBvbmUgZXh0cmEgZm9yIHRoZSB6ZXJvIGJ5dGUgKi8KICAgICAgICBpZihjby0+cGF0aCkgewogICAgICAgICAgbWVtY3B5KGNvLT5wYXRoLCBwYXRoLCBwYXRobGVuKTsKICAgICAgICAgIGNvLT5wYXRoW3BhdGhsZW5dID0gMDsgLyogemVybyB0ZXJtaW5hdGUgKi8KICAgICAgICAgIGNvLT5zcGF0aCA9IHNhbml0aXplX2Nvb2tpZV9wYXRoKGNvLT5wYXRoKTsKICAgICAgICAgIGlmKCFjby0+c3BhdGgpCiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7IC8qIG91dCBvZiBtZW1vcnkgYmFkICovCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgIH0KICAgIH0KCiAgICBpZihiYWRjb29raWUgfHwgIWNvLT5uYW1lKSB7CiAgICAgIC8qIHdlIGRpZG4ndCBnZXQgYSBjb29raWUgbmFtZSBvciBhIGJhZCBvbmUsCiAgICAgICAgIHRoaXMgaXMgYW4gaWxsZWdhbCBsaW5lLCBiYWlsIG91dCAqLwogICAgICBmcmVlY29va2llKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogIH0KICBlbHNlIHsKICAgIC8qIFRoaXMgbGluZSBpcyBOT1QgYSBIVFRQIGhlYWRlciBzdHlsZSBsaW5lLCB3ZSBkbyBvZmZlciBzdXBwb3J0IGZvcgogICAgICAgcmVhZGluZyB0aGUgb2RkIG5ldHNjYXBlIGNvb2tpZXMtZmlsZSBmb3JtYXQgaGVyZSAqLwogICAgY2hhciAqcHRyOwogICAgY2hhciAqZmlyc3RwdHI7CiAgICBjaGFyICp0b2tfYnVmID0gTlVMTDsKICAgIGludCBmaWVsZHM7CgogICAgLyogSUUgaW50cm9kdWNlZCBIVFRQLW9ubHkgY29va2llcyB0byBwcmV2ZW50IFhTUyBhdHRhY2tzLiBDb29raWVzCiAgICAgICBtYXJrZWQgd2l0aCBodHRwT25seSBhZnRlciB0aGUgZG9tYWluIG5hbWUgYXJlIG5vdCBhY2Nlc3NpYmxlCiAgICAgICBmcm9tIGphdmFzY3JpcHRzLCBidXQgc2luY2UgY3VybCBkb2VzIG5vdCBvcGVyYXRlIGF0IGphdmFzY3JpcHQKICAgICAgIGxldmVsLCB3ZSBpbmNsdWRlIHRoZW0gYW55d2F5LiBJbiBGaXJlZm94J3MgY29va2llIGZpbGVzLCB0aGVzZQogICAgICAgbGluZXMgYXJlIHByZWNlZGVkIHdpdGggI0h0dHBPbmx5XyBhbmQgdGhlbiBldmVyeXRoaW5nIGlzCiAgICAgICBhcyB1c3VhbCwgc28gd2Ugc2tpcCAxMCBjaGFyYWN0ZXJzIG9mIHRoZSBsaW5lLi4KICAgICovCiAgICBpZihzdHJuY21wKGxpbmVwdHIsICIjSHR0cE9ubHlfIiwgMTApID09IDApIHsKICAgICAgbGluZXB0ciArPSAxMDsKICAgICAgY28tPmh0dHBvbmx5ID0gVFJVRTsKICAgIH0KCiAgICBpZihsaW5lcHRyWzBdPT0nIycpIHsKICAgICAgLyogZG9uJ3QgZXZlbiB0cnkgdGhlIGNvbW1lbnRzICovCiAgICAgIGZyZWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIC8qIHN0cmlwIG9mZiB0aGUgcG9zc2libGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVycyAqLwogICAgcHRyID0gc3RyY2hyKGxpbmVwdHIsICdccicpOwogICAgaWYocHRyKQogICAgICAqcHRyID0gMDsgLyogY2xlYXIgaXQgKi8KICAgIHB0ciA9IHN0cmNocihsaW5lcHRyLCAnXG4nKTsKICAgIGlmKHB0cikKICAgICAgKnB0ciA9IDA7IC8qIGNsZWFyIGl0ICovCgogICAgZmlyc3RwdHIgPSBzdHJ0b2tfcihsaW5lcHRyLCAiXHQiLCAmdG9rX2J1Zik7IC8qIHRva2VuaXplIGl0IG9uIHRoZSBUQUIgKi8KCiAgICAvKiBOb3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgYW5kIGluaXQgdGhlIHN0cnVjdCB3ZSBhbHJlYWR5IGhhdmUKICAgICAgIGFsbG9jYXRlZCAqLwogICAgZm9yKHB0ciA9IGZpcnN0cHRyLCBmaWVsZHMgPSAwOyBwdHIgJiYgIWJhZGNvb2tpZTsKICAgICAgICBwdHIgPSBzdHJ0b2tfcihOVUxMLCAiXHQiLCAmdG9rX2J1ZiksIGZpZWxkcysrKSB7CiAgICAgIHN3aXRjaChmaWVsZHMpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGlmKHB0clswXT09Jy4nKSAvKiBza2lwIHByZWNlZGluZyBkb3RzICovCiAgICAgICAgICBwdHIrKzsKICAgICAgICBjby0+ZG9tYWluID0gc3RyZHVwKHB0cik7CiAgICAgICAgaWYoIWNvLT5kb21haW4pCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgLyogVGhpcyBmaWVsZCBnb3QgaXRzIGV4cGxhbmF0aW9uIG9uIHRoZSAyM3JkIG9mIE1heSAyMDAxIGJ5CiAgICAgICAgICAgQW5kculzIEdhcmPtYToKCiAgICAgICAgICAgZmxhZzogQSBUUlVFL0ZBTFNFIHZhbHVlIGluZGljYXRpbmcgaWYgYWxsIG1hY2hpbmVzIHdpdGhpbiBhIGdpdmVuCiAgICAgICAgICAgZG9tYWluIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlLiBUaGlzIHZhbHVlIGlzIHNldCBhdXRvbWF0aWNhbGx5IGJ5CiAgICAgICAgICAgdGhlIGJyb3dzZXIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgeW91IHNldCBmb3IgdGhlIGRvbWFpbi4KCiAgICAgICAgICAgQXMgZmFyIGFzIEkgY2FuIHNlZSwgaXQgaXMgc2V0IHRvIHRydWUgd2hlbiB0aGUgY29va2llIHNheXMKICAgICAgICAgICAuZG9tYWluLmNvbSBhbmQgdG8gZmFsc2Ugd2hlbiB0aGUgZG9tYWluIGlzIGNvbXBsZXRlIHd3dy5kb21haW4uY29tCiAgICAgICAgKi8KICAgICAgICBjby0+dGFpbG1hdGNoID0gc3RyY2FzZWNvbXBhcmUocHRyLCAiVFJVRSIpP1RSVUU6RkFMU0U7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICAvKiBJdCB0dXJucyBvdXQsIHRoYXQgc29tZXRpbWVzIHRoZSBmaWxlIGZvcm1hdCBhbGxvd3MgdGhlIHBhdGgKICAgICAgICAgICBmaWVsZCB0byByZW1haW4gbm90IGZpbGxlZCBpbiwgd2UgdHJ5IHRvIGRldGVjdCB0aGlzIGFuZCB3b3JrCiAgICAgICAgICAgYXJvdW5kIGl0ISBBbmRy6XMgR2FyY+1hIG1hZGUgdXMgYXdhcmUgb2YgdGhpcy4uLiAqLwogICAgICAgIGlmKHN0cmNtcCgiVFJVRSIsIHB0cikgJiYgc3RyY21wKCJGQUxTRSIsIHB0cikpIHsKICAgICAgICAgIC8qIG9ubHkgaWYgdGhlIHBhdGggZG9lc24ndCBsb29rIGxpa2UgYSBib29sZWFuIG9wdGlvbiEgKi8KICAgICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKHB0cik7CiAgICAgICAgICBpZighY28tPnBhdGgpCiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY28tPnNwYXRoID0gc2FuaXRpemVfY29va2llX3BhdGgoY28tPnBhdGgpOwogICAgICAgICAgICBpZighY28tPnNwYXRoKSB7CiAgICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYSBwYXRoLCBtYWtlIG9uZSB1cCEgKi8KICAgICAgICBjby0+cGF0aCA9IHN0cmR1cCgiLyIpOwogICAgICAgIGlmKCFjby0+cGF0aCkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgY28tPnNwYXRoID0gc3RyZHVwKCIvIik7CiAgICAgICAgaWYoIWNvLT5zcGF0aCkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgZmllbGRzKys7IC8qIGFkZCBhIGZpZWxkIGFuZCBmYWxsIGRvd24gdG8gc2VjdXJlICovCiAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KICAgICAgY2FzZSAzOgogICAgICAgIGNvLT5zZWN1cmUgPSBzdHJjYXNlY29tcGFyZShwdHIsICJUUlVFIik/VFJVRTpGQUxTRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA0OgogICAgICAgIGlmKGN1cmx4X3N0cnRvb2ZmdChwdHIsIE5VTEwsIDEwLCAmY28tPmV4cGlyZXMpKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA1OgogICAgICAgIGNvLT5uYW1lID0gc3RyZHVwKHB0cik7CiAgICAgICAgaWYoIWNvLT5uYW1lKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA2OgogICAgICAgIGNvLT52YWx1ZSA9IHN0cmR1cChwdHIpOwogICAgICAgIGlmKCFjby0+dmFsdWUpCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZig2ID09IGZpZWxkcykgewogICAgICAvKiB3ZSBnb3QgYSBjb29raWUgd2l0aCBibGFuayBjb250ZW50cywgZml4IGl0ICovCiAgICAgIGNvLT52YWx1ZSA9IHN0cmR1cCgiIik7CiAgICAgIGlmKCFjby0+dmFsdWUpCiAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgZWxzZQogICAgICAgIGZpZWxkcysrOwogICAgfQoKICAgIGlmKCFiYWRjb29raWUgJiYgKDcgIT0gZmllbGRzKSkKICAgICAgLyogd2UgZGlkIG5vdCBmaW5kIHRoZSBzdWZmaWNpZW50IG51bWJlciBvZiBmaWVsZHMgKi8KICAgICAgYmFkY29va2llID0gVFJVRTsKCiAgICBpZihiYWRjb29raWUpIHsKICAgICAgZnJlZWNvb2tpZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICB9CgogIGlmKCFjLT5ydW5uaW5nICYmICAgIC8qIHJlYWQgZnJvbSBhIGZpbGUgKi8KICAgICBjLT5uZXdzZXNzaW9uICYmICAvKiBjbGVhbiBzZXNzaW9uIGNvb2tpZXMgKi8KICAgICAhY28tPmV4cGlyZXMpIHsgICAvKiB0aGlzIGlzIGEgc2Vzc2lvbiBjb29raWUgc2luY2UgaXQgZG9lc24ndCBleHBpcmUhICovCiAgICBmcmVlY29va2llKGNvKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgY28tPmxpdmVjb29raWUgPSBjLT5ydW5uaW5nOwoKICAvKiBub3csIHdlIGhhdmUgcGFyc2VkIHRoZSBpbmNvbWluZyBsaW5lLCB3ZSBtdXN0IG5vdyBjaGVjayBpZiB0aGlzCiAgICAgc3VwZXJjZWVkcyBhbiBhbHJlYWR5IGV4aXN0aW5nIGNvb2tpZSwgd2hpY2ggaXQgbWF5IGlmIHRoZSBwcmV2aW91cyBoYXZlCiAgICAgdGhlIHNhbWUgZG9tYWluIGFuZCBwYXRoIGFzIHRoaXMgKi8KCiAgLyogYXQgZmlyc3QsIHJlbW92ZSBleHBpcmVkIGNvb2tpZXMgKi8KICByZW1vdmVfZXhwaXJlZChjKTsKCiNpZmRlZiBVU0VfTElCUFNMCiAgLyogQ2hlY2sgaWYgdGhlIGRvbWFpbiBpcyBhIFB1YmxpYyBTdWZmaXggYW5kIGlmIHllcywgaWdub3JlIHRoZSBjb29raWUuCiAgICAgVGhpcyBuZWVkcyBhIGxpYnBzbCBjb21waWxlZCB3aXRoIGJ1aWx0aW4gZGF0YS4gKi8KICBpZihkb21haW4gJiYgY28tPmRvbWFpbiAmJiAhaXNpcChjby0+ZG9tYWluKSkgewogICAgcHNsID0gcHNsX2J1aWx0aW4oKTsKICAgIGlmKHBzbCAmJiAhcHNsX2lzX2Nvb2tpZV9kb21haW5fYWNjZXB0YWJsZShwc2wsIGRvbWFpbiwgY28tPmRvbWFpbikpIHsKICAgICAgaW5mb2YoZGF0YSwKICAgICAgICAgICAgImNvb2tpZSAnJXMnIGRyb3BwZWQsIGRvbWFpbiAnJXMnIG11c3Qgbm90IHNldCBjb29raWVzIGZvciAnJXMnXG4iLAogICAgICAgICAgICBjby0+bmFtZSwgZG9tYWluLCBjby0+ZG9tYWluKTsKICAgICAgZnJlZWNvb2tpZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQogIH0KI2VuZGlmCgogIGNsaXN0ID0gYy0+Y29va2llczsKICByZXBsYWNlX29sZCA9IEZBTFNFOwogIHdoaWxlKGNsaXN0KSB7CiAgICBpZihzdHJjYXNlY29tcGFyZShjbGlzdC0+bmFtZSwgY28tPm5hbWUpKSB7CiAgICAgIC8qIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsICovCgogICAgICBpZihjbGlzdC0+ZG9tYWluICYmIGNvLT5kb21haW4pIHsKICAgICAgICBpZihzdHJjYXNlY29tcGFyZShjbGlzdC0+ZG9tYWluLCBjby0+ZG9tYWluKSAmJgogICAgICAgICAgKGNsaXN0LT50YWlsbWF0Y2ggPT0gY28tPnRhaWxtYXRjaCkpCiAgICAgICAgICAvKiBUaGUgZG9tYWlucyBhcmUgaWRlbnRpY2FsICovCiAgICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CiAgICAgIH0KICAgICAgZWxzZSBpZighY2xpc3QtPmRvbWFpbiAmJiAhY28tPmRvbWFpbikKICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CgogICAgICBpZihyZXBsYWNlX29sZCkgewogICAgICAgIC8qIHRoZSBkb21haW5zIHdlcmUgaWRlbnRpY2FsICovCgogICAgICAgIGlmKGNsaXN0LT5zcGF0aCAmJiBjby0+c3BhdGgpIHsKICAgICAgICAgIGlmKHN0cmNhc2Vjb21wYXJlKGNsaXN0LT5zcGF0aCwgY28tPnNwYXRoKSkgewogICAgICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHJlcGxhY2Vfb2xkID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoIWNsaXN0LT5zcGF0aCAmJiAhY28tPnNwYXRoKQogICAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwogICAgICAgIGVsc2UKICAgICAgICAgIHJlcGxhY2Vfb2xkID0gRkFMU0U7CgogICAgICB9CgogICAgICBpZihyZXBsYWNlX29sZCAmJiAhY28tPmxpdmVjb29raWUgJiYgY2xpc3QtPmxpdmVjb29raWUpIHsKICAgICAgICAvKiBCb3RoIGNvb2tpZXMgbWF0Y2hlZCBmaW5lLCBleGNlcHQgdGhhdCB0aGUgYWxyZWFkeSBwcmVzZW50CiAgICAgICAgICAgY29va2llIGlzICJsaXZlIiwgd2hpY2ggbWVhbnMgaXQgd2FzIHNldCBmcm9tIGEgaGVhZGVyLCB3aGlsZQogICAgICAgICAgIHRoZSBuZXcgb25lIGlzbid0ICJsaXZlIiBhbmQgdGh1cyBvbmx5IHJlYWQgZnJvbSBhIGZpbGUuIFdlIGxldAogICAgICAgICAgIGxpdmUgY29va2llcyBzdGF5IGFsaXZlICovCgogICAgICAgIC8qIEZyZWUgdGhlIG5ld2NvbWVyIGFuZCBnZXQgb3V0IG9mIGhlcmUhICovCiAgICAgICAgZnJlZWNvb2tpZShjbyk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KCiAgICAgIGlmKHJlcGxhY2Vfb2xkKSB7CiAgICAgICAgY28tPm5leHQgPSBjbGlzdC0+bmV4dDsgLyogZ2V0IHRoZSBuZXh0LXBvaW50ZXIgZmlyc3QgKi8KCiAgICAgICAgLyogdGhlbiBmcmVlIGFsbCB0aGUgb2xkIHBvaW50ZXJzICovCiAgICAgICAgZnJlZShjbGlzdC0+bmFtZSk7CiAgICAgICAgZnJlZShjbGlzdC0+dmFsdWUpOwogICAgICAgIGZyZWUoY2xpc3QtPmRvbWFpbik7CiAgICAgICAgZnJlZShjbGlzdC0+cGF0aCk7CiAgICAgICAgZnJlZShjbGlzdC0+c3BhdGgpOwogICAgICAgIGZyZWUoY2xpc3QtPmV4cGlyZXN0cik7CiAgICAgICAgZnJlZShjbGlzdC0+dmVyc2lvbik7CiAgICAgICAgZnJlZShjbGlzdC0+bWF4YWdlKTsKCiAgICAgICAgKmNsaXN0ID0gKmNvOyAgLyogdGhlbiBzdG9yZSBhbGwgdGhlIG5ldyBkYXRhICovCgogICAgICAgIGZyZWUoY28pOyAgIC8qIGZyZWUgdGhlIG5ld2x5IGFsbG9jZWQgbWVtb3J5ICovCiAgICAgICAgY28gPSBjbGlzdDsgLyogcG9pbnQgdG8gdGhlIHByZXZpb3VzIHN0cnVjdCBpbnN0ZWFkICovCgogICAgICAgIC8qIFdlIGhhdmUgcmVwbGFjZWQgYSBjb29raWUsIG5vdyBza2lwIHRoZSByZXN0IG9mIHRoZSBsaXN0IGJ1dAogICAgICAgICAgIG1ha2Ugc3VyZSB0aGUgJ2xhc3RjJyBwb2ludGVyIGlzIHByb3Blcmx5IHNldCAqLwogICAgICAgIGRvIHsKICAgICAgICAgIGxhc3RjID0gY2xpc3Q7CiAgICAgICAgICBjbGlzdCA9IGNsaXN0LT5uZXh0OwogICAgICAgIH0gd2hpbGUoY2xpc3QpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBsYXN0YyA9IGNsaXN0OwogICAgY2xpc3QgPSBjbGlzdC0+bmV4dDsKICB9CgogIGlmKGMtPnJ1bm5pbmcpCiAgICAvKiBPbmx5IHNob3cgdGhpcyB3aGVuIE5PVCByZWFkaW5nIHRoZSBjb29raWVzIGZyb20gYSBmaWxlICovCiAgICBpbmZvZihkYXRhLCAiJXMgY29va2llICVzPVwiJXNcIiBmb3IgZG9tYWluICVzLCBwYXRoICVzLCAiCiAgICAgICAgICAiZXhwaXJlICUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgIlxuIiwKICAgICAgICAgIHJlcGxhY2Vfb2xkPyJSZXBsYWNlZCI6IkFkZGVkIiwgY28tPm5hbWUsIGNvLT52YWx1ZSwKICAgICAgICAgIGNvLT5kb21haW4sIGNvLT5wYXRoLCBjby0+ZXhwaXJlcyk7CgogIGlmKCFyZXBsYWNlX29sZCkgewogICAgLyogdGhlbiBtYWtlIHRoZSBsYXN0IGl0ZW0gcG9pbnQgb24gdGhpcyBuZXcgb25lICovCiAgICBpZihsYXN0YykKICAgICAgbGFzdGMtPm5leHQgPSBjbzsKICAgIGVsc2UKICAgICAgYy0+Y29va2llcyA9IGNvOwogICAgYy0+bnVtY29va2llcysrOyAvKiBvbmUgbW9yZSBjb29raWUgaW4gdGhlIGphciAqLwogIH0KCiAgcmV0dXJuIGNvOwp9CgovKgogKiBnZXRfbGluZSgpIG1ha2VzIHN1cmUgdG8gb25seSByZXR1cm4gY29tcGxldGUgd2hvbGUgbGluZXMgdGhhdCBmaXQgaW4gJ2xlbicKICogYnl0ZXMgYW5kIGVuZCB3aXRoIGEgbmV3bGluZS4KICovCnN0YXRpYyBjaGFyICpnZXRfbGluZShjaGFyICpidWYsIGludCBsZW4sIEZJTEUgKmlucHV0KQp7CiAgYm9vbCBwYXJ0aWFsID0gRkFMU0U7CiAgd2hpbGUoMSkgewogICAgY2hhciAqYiA9IGZnZXRzKGJ1ZiwgbGVuLCBpbnB1dCk7CiAgICBpZihiKSB7CiAgICAgIHNpemVfdCBybGVuID0gc3RybGVuKGIpOwogICAgICBpZihybGVuICYmIChiW3JsZW4tMV0gPT0gJ1xuJykpIHsKICAgICAgICBpZihwYXJ0aWFsKSB7CiAgICAgICAgICBwYXJ0aWFsID0gRkFMU0U7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH0KICAgICAgLyogcmVhZCBhIHBhcnRpYWwsIGRpc2NhcmQgdGhlIG5leHQgcGllY2UgdGhhdCBlbmRzIHdpdGggbmV3bGluZSAqLwogICAgICBwYXJ0aWFsID0gVFJVRTsKICAgIH0KICAgIGVsc2UKICAgICAgYnJlYWs7CiAgfQogIHJldHVybiBOVUxMOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2luaXQoKQogKgogKiBJbml0cyBhIGNvb2tpZSBzdHJ1Y3QgdG8gcmVhZCBkYXRhIGZyb20gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogKiBjYWxsZWQgYmVmb3JlIGFueSBjb29raWVzIGFyZSBzZXQuIEZpbGUgbWF5IGJlIE5VTEwuCiAqCiAqIElmICduZXdzZXNzaW9uJyBpcyBUUlVFLCBkaXNjYXJkIGFsbCAic2Vzc2lvbiBjb29raWVzIiBvbiByZWFkIGZyb20gZmlsZS4KICoKICogUmV0dXJucyBOVUxMIG9uIG91dCBvZiBtZW1vcnkuIEludmFsaWQgY29va2llcyBhcmUgaWdub3JlZC4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBDb29raWVJbmZvICpDdXJsX2Nvb2tpZV9pbml0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICppbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmV3c2Vzc2lvbikKewogIHN0cnVjdCBDb29raWVJbmZvICpjOwogIEZJTEUgKmZwID0gTlVMTDsKICBib29sIGZyb21maWxlID0gVFJVRTsKICBjaGFyICpsaW5lID0gTlVMTDsKCiAgaWYoTlVMTCA9PSBpbmMpIHsKICAgIC8qIHdlIGRpZG4ndCBnZXQgYSBzdHJ1Y3QsIGNyZWF0ZSBvbmUgKi8KICAgIGMgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBDb29raWVJbmZvKSk7CiAgICBpZighYykKICAgICAgcmV0dXJuIE5VTEw7IC8qIGZhaWxlZCB0byBnZXQgbWVtb3J5ICovCiAgICBjLT5maWxlbmFtZSA9IHN0cmR1cChmaWxlP2ZpbGU6Im5vbmUiKTsgLyogY29weSB0aGUgbmFtZSBqdXN0IGluIGNhc2UgKi8KICAgIGlmKCFjLT5maWxlbmFtZSkKICAgICAgZ290byBmYWlsOyAvKiBmYWlsZWQgdG8gZ2V0IG1lbW9yeSAqLwogIH0KICBlbHNlIHsKICAgIC8qIHdlIGdvdCBhbiBhbHJlYWR5IGV4aXN0aW5nIG9uZSwgdXNlIHRoYXQgKi8KICAgIGMgPSBpbmM7CiAgfQogIGMtPnJ1bm5pbmcgPSBGQUxTRTsgLyogdGhpcyBpcyBub3QgcnVubmluZywgdGhpcyBpcyBpbml0ICovCgogIGlmKGZpbGUgJiYgIXN0cmNtcChmaWxlLCAiLSIpKSB7CiAgICBmcCA9IHN0ZGluOwogICAgZnJvbWZpbGUgPSBGQUxTRTsKICB9CiAgZWxzZSBpZihmaWxlICYmICEqZmlsZSkgewogICAgLyogcG9pbnRzIHRvIGEgIiIgc3RyaW5nICovCiAgICBmcCA9IE5VTEw7CiAgfQogIGVsc2UKICAgIGZwID0gZmlsZT9mb3BlbihmaWxlLCBGT1BFTl9SRUFEVEVYVCk6TlVMTDsKCiAgYy0+bmV3c2Vzc2lvbiA9IG5ld3Nlc3Npb247IC8qIG5ldyBzZXNzaW9uPyAqLwoKICBpZihmcCkgewogICAgY2hhciAqbGluZXB0cjsKICAgIGJvb2wgaGVhZGVybGluZTsKCiAgICBsaW5lID0gbWFsbG9jKE1BWF9DT09LSUVfTElORSk7CiAgICBpZighbGluZSkKICAgICAgZ290byBmYWlsOwogICAgd2hpbGUoZ2V0X2xpbmUobGluZSwgTUFYX0NPT0tJRV9MSU5FLCBmcCkpIHsKICAgICAgaWYoY2hlY2twcmVmaXgoIlNldC1Db29raWU6IiwgbGluZSkpIHsKICAgICAgICAvKiBUaGlzIGlzIGEgY29va2llIGxpbmUsIGdldCBpdCEgKi8KICAgICAgICBsaW5lcHRyID0gJmxpbmVbMTFdOwogICAgICAgIGhlYWRlcmxpbmUgPSBUUlVFOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGxpbmVwdHIgPSBsaW5lOwogICAgICAgIGhlYWRlcmxpbmUgPSBGQUxTRTsKICAgICAgfQogICAgICB3aGlsZSgqbGluZXB0ciAmJiBJU0JMQU5LKCpsaW5lcHRyKSkKICAgICAgICBsaW5lcHRyKys7CgogICAgICBDdXJsX2Nvb2tpZV9hZGQoZGF0YSwgYywgaGVhZGVybGluZSwgbGluZXB0ciwgTlVMTCwgTlVMTCk7CiAgICB9CiAgICBmcmVlKGxpbmUpOyAvKiBmcmVlIHRoZSBsaW5lIGJ1ZmZlciAqLwoKICAgIGlmKGZyb21maWxlKQogICAgICBmY2xvc2UoZnApOwogIH0KCiAgYy0+cnVubmluZyA9IFRSVUU7ICAgICAgICAgIC8qIG5vdywgd2UncmUgcnVubmluZyAqLwoKICByZXR1cm4gYzsKCmZhaWw6CiAgZnJlZShsaW5lKTsKICBpZighaW5jKQogICAgLyogT25seSBjbGVhbiB1cCBpZiB3ZSBhbGxvY2F0ZWQgaXQgaGVyZSwgYXMgdGhlIG9yaWdpbmFsIGNvdWxkIHN0aWxsIGJlIGluCiAgICAgKiB1c2UgYnkgYSBzaGFyZSBoYW5kbGUgKi8KICAgIEN1cmxfY29va2llX2NsZWFudXAoYyk7CiAgaWYoZnJvbWZpbGUgJiYgZnApCiAgICBmY2xvc2UoZnApOwogIHJldHVybiBOVUxMOyAvKiBvdXQgb2YgbWVtb3J5ICovCn0KCi8qIHNvcnQgdGhpcyBzbyB0aGF0IHRoZSBsb25nZXN0IHBhdGggZ2V0cyBiZWZvcmUgdGhlIHNob3J0ZXIgcGF0aCAqLwpzdGF0aWMgaW50IGNvb2tpZV9zb3J0KGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKewogIHN0cnVjdCBDb29raWUgKmMxID0gKihzdHJ1Y3QgQ29va2llICoqKXAxOwogIHN0cnVjdCBDb29raWUgKmMyID0gKihzdHJ1Y3QgQ29va2llICoqKXAyOwogIHNpemVfdCBsMSwgbDI7CgogIC8qIDEgLSBjb21wYXJlIGNvb2tpZSBwYXRoIGxlbmd0aHMgKi8KICBsMSA9IGMxLT5wYXRoID8gc3RybGVuKGMxLT5wYXRoKSA6IDA7CiAgbDIgPSBjMi0+cGF0aCA/IHN0cmxlbihjMi0+cGF0aCkgOiAwOwoKICBpZihsMSAhPSBsMikKICAgIHJldHVybiAobDIgPiBsMSkgPyAxIDogLTEgOyAvKiBhdm9pZCBzaXplX3QgPD0+IGludCBjb252ZXJzaW9ucyAqLwoKICAvKiAyIC0gY29tcGFyZSBjb29raWUgZG9tYWluIGxlbmd0aHMgKi8KICBsMSA9IGMxLT5kb21haW4gPyBzdHJsZW4oYzEtPmRvbWFpbikgOiAwOwogIGwyID0gYzItPmRvbWFpbiA/IHN0cmxlbihjMi0+ZG9tYWluKSA6IDA7CgogIGlmKGwxICE9IGwyKQogICAgcmV0dXJuIChsMiA+IGwxKSA/IDEgOiAtMSA7ICAvKiBhdm9pZCBzaXplX3QgPD0+IGludCBjb252ZXJzaW9ucyAqLwoKICAvKiAzIC0gY29tcGFyZSBjb29raWUgbmFtZXMgKi8KICBpZihjMS0+bmFtZSAmJiBjMi0+bmFtZSkKICAgIHJldHVybiBzdHJjbXAoYzEtPm5hbWUsIGMyLT5uYW1lKTsKCiAgLyogc29ycnksIGNhbid0IGJlIG1vcmUgZGV0ZXJtaW5pc3RpYyAqLwogIHJldHVybiAwOwp9CgojZGVmaW5lIENMT05FKGZpZWxkKSAgICAgICAgICAgICAgICAgICAgIFwKICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBpZihzcmMtPmZpZWxkKSB7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICBkLT5maWVsZCA9IHN0cmR1cChzcmMtPmZpZWxkKTsgICAgIFwKICAgICAgaWYoIWQtPmZpZWxkKSAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZ290byBmYWlsOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICB9IHdoaWxlKDApCgpzdGF0aWMgc3RydWN0IENvb2tpZSAqZHVwX2Nvb2tpZShzdHJ1Y3QgQ29va2llICpzcmMpCnsKICBzdHJ1Y3QgQ29va2llICpkID0gY2FsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llKSwgMSk7CiAgaWYoZCkgewogICAgQ0xPTkUoZXhwaXJlc3RyKTsKICAgIENMT05FKGRvbWFpbik7CiAgICBDTE9ORShwYXRoKTsKICAgIENMT05FKHNwYXRoKTsKICAgIENMT05FKG5hbWUpOwogICAgQ0xPTkUodmFsdWUpOwogICAgQ0xPTkUobWF4YWdlKTsKICAgIENMT05FKHZlcnNpb24pOwogICAgZC0+ZXhwaXJlcyA9IHNyYy0+ZXhwaXJlczsKICAgIGQtPnRhaWxtYXRjaCA9IHNyYy0+dGFpbG1hdGNoOwogICAgZC0+c2VjdXJlID0gc3JjLT5zZWN1cmU7CiAgICBkLT5saXZlY29va2llID0gc3JjLT5saXZlY29va2llOwogICAgZC0+aHR0cG9ubHkgPSBzcmMtPmh0dHBvbmx5OwogIH0KICByZXR1cm4gZDsKCiAgZmFpbDoKICBmcmVlY29va2llKGQpOwogIHJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfZ2V0bGlzdCgpCiAqCiAqIEZvciBhIGdpdmVuIGhvc3QgYW5kIHBhdGgsIHJldHVybiBhIGxpbmtlZCBsaXN0IG9mIGNvb2tpZXMgdGhhdCB0aGUKICogY2xpZW50IHNob3VsZCBzZW5kIHRvIHRoZSBzZXJ2ZXIgaWYgdXNlZCBub3cuIFRoZSBzZWN1cmUgYm9vbGVhbiBpbmZvcm1zCiAqIHRoZSBjb29raWUgaWYgYSBzZWN1cmUgY29ubmVjdGlvbiBpcyBhY2hpZXZlZCBvciBub3QuCiAqCiAqIEl0IHNoYWxsIG9ubHkgcmV0dXJuIGNvb2tpZXMgdGhhdCBoYXZlbid0IGV4cGlyZWQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IENvb2tpZSAqQ3VybF9jb29raWVfZ2V0bGlzdChzdHJ1Y3QgQ29va2llSW5mbyAqYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VjdXJlKQp7CiAgc3RydWN0IENvb2tpZSAqbmV3Y287CiAgc3RydWN0IENvb2tpZSAqY287CiAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgc3RydWN0IENvb2tpZSAqbWFpbmNvID0gTlVMTDsKICBzaXplX3QgbWF0Y2hlcyA9IDA7CiAgYm9vbCBpc19pcDsKCiAgaWYoIWMgfHwgIWMtPmNvb2tpZXMpCiAgICByZXR1cm4gTlVMTDsgLyogbm8gY29va2llIHN0cnVjdCBvciBubyBjb29raWVzIGluIHRoZSBzdHJ1Y3QgKi8KCiAgLyogYXQgZmlyc3QsIHJlbW92ZSBleHBpcmVkIGNvb2tpZXMgKi8KICByZW1vdmVfZXhwaXJlZChjKTsKCiAgLyogY2hlY2sgaWYgaG9zdCBpcyBhbiBJUCh2NHx2NikgYWRkcmVzcyAqLwogIGlzX2lwID0gaXNpcChob3N0KTsKCiAgY28gPSBjLT5jb29raWVzOwoKICB3aGlsZShjbykgewogICAgLyogb25seSBwcm9jZXNzIHRoaXMgY29va2llIGlmIGl0IGlzIG5vdCBleHBpcmVkIG9yIGhhZCBubyBleHBpcmUKICAgICAgIGRhdGUgQU5EIHRoYXQgaWYgdGhlIGNvb2tpZSByZXF1aXJlcyB3ZSdyZSBzZWN1cmUgd2UgbXVzdCBvbmx5CiAgICAgICBjb250aW51ZSBpZiB3ZSBhcmUhICovCiAgICBpZigoIWNvLT5leHBpcmVzIHx8IChjby0+ZXhwaXJlcyA+IG5vdykpICYmCiAgICAgICAoY28tPnNlY3VyZT9zZWN1cmU6VFJVRSkpIHsKCiAgICAgIC8qIG5vdyBjaGVjayBpZiB0aGUgZG9tYWluIGlzIGNvcnJlY3QgKi8KICAgICAgaWYoIWNvLT5kb21haW4gfHwKICAgICAgICAgKGNvLT50YWlsbWF0Y2ggJiYgIWlzX2lwICYmIHRhaWxtYXRjaChjby0+ZG9tYWluLCBob3N0KSkgfHwKICAgICAgICAgKCghY28tPnRhaWxtYXRjaCB8fCBpc19pcCkgJiYgc3RyY2FzZWNvbXBhcmUoaG9zdCwgY28tPmRvbWFpbikpICkgewogICAgICAgIC8qIHRoZSByaWdodCBwYXJ0IG9mIHRoZSBob3N0IG1hdGNoZXMgdGhlIGRvbWFpbiBzdHVmZiBpbiB0aGUKICAgICAgICAgICBjb29raWUgZGF0YSAqLwoKICAgICAgICAvKiBub3cgY2hlY2sgdGhlIGxlZnQgcGFydCBvZiB0aGUgcGF0aCB3aXRoIHRoZSBjb29raWVzIHBhdGgKICAgICAgICAgICByZXF1aXJlbWVudCAqLwogICAgICAgIGlmKCFjby0+c3BhdGggfHwgcGF0aG1hdGNoKGNvLT5zcGF0aCwgcGF0aCkgKSB7CgogICAgICAgICAgLyogYW5kIG5vdywgd2Uga25vdyB0aGlzIGlzIGEgbWF0Y2ggYW5kIHdlIHNob3VsZCBjcmVhdGUgYW4KICAgICAgICAgICAgIGVudHJ5IGZvciB0aGUgcmV0dXJuLWxpbmtlZC1saXN0ICovCgogICAgICAgICAgbmV3Y28gPSBkdXBfY29va2llKGNvKTsKICAgICAgICAgIGlmKG5ld2NvKSB7CiAgICAgICAgICAgIC8qIHRoZW4gbW9kaWZ5IG91ciBuZXh0ICovCiAgICAgICAgICAgIG5ld2NvLT5uZXh0ID0gbWFpbmNvOwoKICAgICAgICAgICAgLyogcG9pbnQgdGhlIG1haW4gdG8gdXMgKi8KICAgICAgICAgICAgbWFpbmNvID0gbmV3Y287CgogICAgICAgICAgICBtYXRjaGVzKys7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZmFpbDoKICAgICAgICAgICAgLyogZmFpbHVyZSwgY2xlYXIgdXAgdGhlIGFsbG9jYXRlZCBjaGFpbiBhbmQgcmV0dXJuIE5VTEwgKi8KICAgICAgICAgICAgQ3VybF9jb29raWVfZnJlZWxpc3QobWFpbmNvKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjbyA9IGNvLT5uZXh0OwogIH0KCiAgaWYobWF0Y2hlcykgewogICAgLyogTm93IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUgaXMgYSBuYW1lIGFwcGVhcmluZyBtb3JlIHRoYW4KICAgICAgIG9uY2UsIHRoZSBsb25nZXN0IHNwZWNpZmllZCBwYXRoIHZlcnNpb24gY29tZXMgZmlyc3QuIFRvIG1ha2UgdGhpcwogICAgICAgdGhlIHN3aWZ0ZXN0IHdheSwgd2UganVzdCBzb3J0IHRoZW0gYWxsIGJhc2VkIG9uIHBhdGggbGVuZ3RoLiAqLwogICAgc3RydWN0IENvb2tpZSAqKmFycmF5OwogICAgc2l6ZV90IGk7CgogICAgLyogYWxsb2MgYW4gYXJyYXkgYW5kIHN0b3JlIGFsbCBjb29raWUgcG9pbnRlcnMgKi8KICAgIGFycmF5ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llICopICogbWF0Y2hlcyk7CiAgICBpZighYXJyYXkpCiAgICAgIGdvdG8gZmFpbDsKCiAgICBjbyA9IG1haW5jbzsKCiAgICBmb3IoaSA9IDA7IGNvOyBjbyA9IGNvLT5uZXh0KQogICAgICBhcnJheVtpKytdID0gY287CgogICAgLyogbm93IHNvcnQgdGhlIGNvb2tpZSBwb2ludGVycyBpbiBwYXRoIGxlbmd0aCBvcmRlciAqLwogICAgcXNvcnQoYXJyYXksIG1hdGNoZXMsIHNpemVvZihzdHJ1Y3QgQ29va2llICopLCBjb29raWVfc29ydCk7CgogICAgLyogcmVtYWtlIHRoZSBsaW5rZWQgbGlzdCBvcmRlciBhY2NvcmRpbmcgdG8gdGhlIG5ldyBvcmRlciAqLwoKICAgIG1haW5jbyA9IGFycmF5WzBdOyAvKiBzdGFydCBoZXJlICovCiAgICBmb3IoaSA9IDA7IGk8bWF0Y2hlcy0xOyBpKyspCiAgICAgIGFycmF5W2ldLT5uZXh0ID0gYXJyYXlbaSArIDFdOwogICAgYXJyYXlbbWF0Y2hlcy0xXS0+bmV4dCA9IE5VTEw7IC8qIHRlcm1pbmF0ZSB0aGUgbGlzdCAqLwoKICAgIGZyZWUoYXJyYXkpOyAvKiByZW1vdmUgdGhlIHRlbXBvcmFyeSBkYXRhIGFnYWluICovCiAgfQoKICByZXR1cm4gbWFpbmNvOyAvKiByZXR1cm4gdGhlIG5ldyBsaXN0ICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9jbGVhcmFsbCgpCiAqCiAqIENsZWFyIGFsbCBleGlzdGluZyBjb29raWVzIGFuZCByZXNldCB0aGUgY291bnRlci4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgQ3VybF9jb29raWVfY2xlYXJhbGwoc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZXMpCnsKICBpZihjb29raWVzKSB7CiAgICBDdXJsX2Nvb2tpZV9mcmVlbGlzdChjb29raWVzLT5jb29raWVzKTsKICAgIGNvb2tpZXMtPmNvb2tpZXMgPSBOVUxMOwogICAgY29va2llcy0+bnVtY29va2llcyA9IDA7CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfZnJlZWxpc3QoKQogKgogKiBGcmVlIGEgbGlzdCBvZiBjb29raWVzIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgQ3VybF9jb29raWVfZ2V0bGlzdCgpOwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgQ3VybF9jb29raWVfZnJlZWxpc3Qoc3RydWN0IENvb2tpZSAqY28pCnsKICBzdHJ1Y3QgQ29va2llICpuZXh0OwogIHdoaWxlKGNvKSB7CiAgICBuZXh0ID0gY28tPm5leHQ7CiAgICBmcmVlY29va2llKGNvKTsKICAgIGNvID0gbmV4dDsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfY2xlYXJzZXNzKCkKICoKICogRnJlZSBhbGwgc2Vzc2lvbiBjb29raWVzIGluIHRoZSBjb29raWVzIGxpc3QuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEN1cmxfY29va2llX2NsZWFyc2VzcyhzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llcykKewogIHN0cnVjdCBDb29raWUgKmZpcnN0LCAqY3VyciwgKm5leHQsICpwcmV2ID0gTlVMTDsKCiAgaWYoIWNvb2tpZXMgfHwgIWNvb2tpZXMtPmNvb2tpZXMpCiAgICByZXR1cm47CgogIGZpcnN0ID0gY3VyciA9IHByZXYgPSBjb29raWVzLT5jb29raWVzOwoKICBmb3IoOyBjdXJyOyBjdXJyID0gbmV4dCkgewogICAgbmV4dCA9IGN1cnItPm5leHQ7CiAgICBpZighY3Vyci0+ZXhwaXJlcykgewogICAgICBpZihmaXJzdCA9PSBjdXJyKQogICAgICAgIGZpcnN0ID0gbmV4dDsKCiAgICAgIGlmKHByZXYgPT0gY3VycikKICAgICAgICBwcmV2ID0gbmV4dDsKICAgICAgZWxzZQogICAgICAgIHByZXYtPm5leHQgPSBuZXh0OwoKICAgICAgZnJlZWNvb2tpZShjdXJyKTsKICAgICAgY29va2llcy0+bnVtY29va2llcy0tOwogICAgfQogICAgZWxzZQogICAgICBwcmV2ID0gY3VycjsKICB9CgogIGNvb2tpZXMtPmNvb2tpZXMgPSBmaXJzdDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9jbGVhbnVwKCkKICoKICogRnJlZSBhICJjb29raWUgb2JqZWN0IiBwcmV2aW91cyBjcmVhdGVkIHdpdGggQ3VybF9jb29raWVfaW5pdCgpLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBDdXJsX2Nvb2tpZV9jbGVhbnVwKHN0cnVjdCBDb29raWVJbmZvICpjKQp7CiAgaWYoYykgewogICAgZnJlZShjLT5maWxlbmFtZSk7CiAgICBDdXJsX2Nvb2tpZV9mcmVlbGlzdChjLT5jb29raWVzKTsKICAgIGZyZWUoYyk7IC8qIGZyZWUgdGhlIGJhc2Ugc3RydWN0IGFzIHdlbGwgKi8KICB9Cn0KCi8qIGdldF9uZXRzY2FwZV9mb3JtYXQoKQogKgogKiBGb3JtYXRzIGEgc3RyaW5nIGZvciBOZXRzY2FwZSBvdXRwdXQgZmlsZSwgdy9vIGEgbmV3bGluZSBhdCB0aGUgZW5kLgogKgogKiBGdW5jdGlvbiByZXR1cm5zIGEgY2hhciAqIHRvIGEgZm9ybWF0dGVkIGxpbmUuIEhhcyB0byBiZSBmcmVlKClkCiovCnN0YXRpYyBjaGFyICpnZXRfbmV0c2NhcGVfZm9ybWF0KGNvbnN0IHN0cnVjdCBDb29raWUgKmNvKQp7CiAgcmV0dXJuIGFwcmludGYoCiAgICAiJXMiICAgICAvKiBodHRwb25seSBwcmVhbWJsZSAqLwogICAgIiVzJXNcdCIgLyogZG9tYWluICovCiAgICAiJXNcdCIgICAvKiB0YWlsbWF0Y2ggKi8KICAgICIlc1x0IiAgIC8qIHBhdGggKi8KICAgICIlc1x0IiAgIC8qIHNlY3VyZSAqLwogICAgIiUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgIlx0IiAgIC8qIGV4cGlyZXMgKi8KICAgICIlc1x0IiAgIC8qIG5hbWUgKi8KICAgICIlcyIsICAgIC8qIHZhbHVlICovCiAgICBjby0+aHR0cG9ubHk/IiNIdHRwT25seV8iOiIiLAogICAgLyogTWFrZSBzdXJlIGFsbCBkb21haW5zIGFyZSBwcmVmaXhlZCB3aXRoIGEgZG90IGlmIHRoZXkgYWxsb3cKICAgICAgIHRhaWxtYXRjaGluZy4gVGhpcyBpcyBNb3ppbGxhLXN0eWxlLiAqLwogICAgKGNvLT50YWlsbWF0Y2ggJiYgY28tPmRvbWFpbiAmJiBjby0+ZG9tYWluWzBdICE9ICcuJyk/ICIuIjoiIiwKICAgIGNvLT5kb21haW4/Y28tPmRvbWFpbjoidW5rbm93biIsCiAgICBjby0+dGFpbG1hdGNoPyJUUlVFIjoiRkFMU0UiLAogICAgY28tPnBhdGg/Y28tPnBhdGg6Ii8iLAogICAgY28tPnNlY3VyZT8iVFJVRSI6IkZBTFNFIiwKICAgIGNvLT5leHBpcmVzLAogICAgY28tPm5hbWUsCiAgICBjby0+dmFsdWU/Y28tPnZhbHVlOiIiKTsKfQoKLyoKICogY29va2llX291dHB1dCgpCiAqCiAqIFdyaXRlcyBhbGwgaW50ZXJuYWxseSBrbm93biBjb29raWVzIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gU3BlY2lmeQogKiAiLSIgYXMgZmlsZSBuYW1lIHRvIHdyaXRlIHRvIHN0ZG91dC4KICoKICogVGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gb24gd3JpdGUgZmFpbHVyZS4KICovCnN0YXRpYyBpbnQgY29va2llX291dHB1dChzdHJ1Y3QgQ29va2llSW5mbyAqYywgY29uc3QgY2hhciAqZHVtcGhlcmUpCnsKICBzdHJ1Y3QgQ29va2llICpjbzsKICBGSUxFICpvdXQ7CiAgYm9vbCB1c2Vfc3Rkb3V0ID0gRkFMU0U7CiAgY2hhciAqZm9ybWF0X3B0cjsKCiAgaWYoKE5VTEwgPT0gYykgfHwgKDAgPT0gYy0+bnVtY29va2llcykpCiAgICAvKiBJZiB0aGVyZSBhcmUgbm8ga25vd24gY29va2llcywgd2UgZG9uJ3Qgd3JpdGUgb3IgZXZlbiBjcmVhdGUgYW55CiAgICAgICBkZXN0aW5hdGlvbiBmaWxlICovCiAgICByZXR1cm4gMDsKCiAgLyogYXQgZmlyc3QsIHJlbW92ZSBleHBpcmVkIGNvb2tpZXMgKi8KICByZW1vdmVfZXhwaXJlZChjKTsKCiAgaWYoIXN0cmNtcCgiLSIsIGR1bXBoZXJlKSkgewogICAgLyogdXNlIHN0ZG91dCAqLwogICAgb3V0ID0gc3Rkb3V0OwogICAgdXNlX3N0ZG91dCA9IFRSVUU7CiAgfQogIGVsc2UgewogICAgb3V0ID0gZm9wZW4oZHVtcGhlcmUsIEZPUEVOX1dSSVRFVEVYVCk7CiAgICBpZighb3V0KQogICAgICByZXR1cm4gMTsgLyogZmFpbHVyZSAqLwogIH0KCiAgZnB1dHMoIiMgTmV0c2NhcGUgSFRUUCBDb29raWUgRmlsZVxuIgogICAgICAgICIjIGh0dHBzOi8vY3VybC5oYXh4LnNlL2RvY3MvaHR0cC1jb29raWVzLmh0bWxcbiIKICAgICAgICAiIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBsaWJjdXJsISBFZGl0IGF0IHlvdXIgb3duIHJpc2suXG5cbiIsCiAgICAgICAgb3V0KTsKCiAgZm9yKGNvID0gYy0+Y29va2llczsgY287IGNvID0gY28tPm5leHQpIHsKICAgIGlmKCFjby0+ZG9tYWluKQogICAgICBjb250aW51ZTsKICAgIGZvcm1hdF9wdHIgPSBnZXRfbmV0c2NhcGVfZm9ybWF0KGNvKTsKICAgIGlmKGZvcm1hdF9wdHIgPT0gTlVMTCkgewogICAgICBmcHJpbnRmKG91dCwgIiNcbiMgRmF0YWwgbGliY3VybCBlcnJvclxuIik7CiAgICAgIGlmKCF1c2Vfc3Rkb3V0KQogICAgICAgIGZjbG9zZShvdXQpOwogICAgICByZXR1cm4gMTsKICAgIH0KICAgIGZwcmludGYob3V0LCAiJXNcbiIsIGZvcm1hdF9wdHIpOwogICAgZnJlZShmb3JtYXRfcHRyKTsKICB9CgogIGlmKCF1c2Vfc3Rkb3V0KQogICAgZmNsb3NlKG91dCk7CgogIHJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IGN1cmxfc2xpc3QgKmNvb2tpZV9saXN0KHN0cnVjdCBDdXJsX2Vhc3kgKmRhdGEpCnsKICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdCA9IE5VTEw7CiAgc3RydWN0IGN1cmxfc2xpc3QgKmJlZzsKICBzdHJ1Y3QgQ29va2llICpjOwogIGNoYXIgKmxpbmU7CgogIGlmKChkYXRhLT5jb29raWVzID09IE5VTEwpIHx8CiAgICAgIChkYXRhLT5jb29raWVzLT5udW1jb29raWVzID09IDApKQogICAgcmV0dXJuIE5VTEw7CgogIGZvcihjID0gZGF0YS0+Y29va2llcy0+Y29va2llczsgYzsgYyA9IGMtPm5leHQpIHsKICAgIGlmKCFjLT5kb21haW4pCiAgICAgIGNvbnRpbnVlOwogICAgbGluZSA9IGdldF9uZXRzY2FwZV9mb3JtYXQoYyk7CiAgICBpZighbGluZSkgewogICAgICBjdXJsX3NsaXN0X2ZyZWVfYWxsKGxpc3QpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGJlZyA9IEN1cmxfc2xpc3RfYXBwZW5kX25vZHVwKGxpc3QsIGxpbmUpOwogICAgaWYoIWJlZykgewogICAgICBmcmVlKGxpbmUpOwogICAgICBjdXJsX3NsaXN0X2ZyZWVfYWxsKGxpc3QpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGxpc3QgPSBiZWc7CiAgfQoKICByZXR1cm4gbGlzdDsKfQoKc3RydWN0IGN1cmxfc2xpc3QgKkN1cmxfY29va2llX2xpc3Qoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSkKewogIHN0cnVjdCBjdXJsX3NsaXN0ICpsaXN0OwogIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUsIENVUkxfTE9DS19BQ0NFU1NfU0lOR0xFKTsKICBsaXN0ID0gY29va2llX2xpc3QoZGF0YSk7CiAgQ3VybF9zaGFyZV91bmxvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFKTsKICByZXR1cm4gbGlzdDsKfQoKdm9pZCBDdXJsX2ZsdXNoX2Nvb2tpZXMoc3RydWN0IEN1cmxfZWFzeSAqZGF0YSwgaW50IGNsZWFudXApCnsKICBpZihkYXRhLT5zZXQuc3RyW1NUUklOR19DT09LSUVKQVJdKSB7CiAgICBpZihkYXRhLT5jaGFuZ2UuY29va2llbGlzdCkgewogICAgICAvKiBJZiB0aGVyZSBpcyBhIGxpc3Qgb2YgY29va2llIGZpbGVzIHRvIHJlYWQsIGRvIGl0IGZpcnN0IHNvIHRoYXQKICAgICAgICAgd2UgaGF2ZSBhbGwgdGhlIHRvbGQgZmlsZXMgcmVhZCBiZWZvcmUgd2Ugd3JpdGUgdGhlIG5ldyBqYXIuCiAgICAgICAgIEN1cmxfY29va2llX2xvYWRmaWxlcygpIExPQ0tTIGFuZCBVTkxPQ0tTIHRoZSBzaGFyZSBpdHNlbGYhICovCiAgICAgIEN1cmxfY29va2llX2xvYWRmaWxlcyhkYXRhKTsKICAgIH0KCiAgICBDdXJsX3NoYXJlX2xvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFLCBDVVJMX0xPQ0tfQUNDRVNTX1NJTkdMRSk7CgogICAgLyogaWYgd2UgaGF2ZSBhIGRlc3RpbmF0aW9uIGZpbGUgZm9yIGFsbCB0aGUgY29va2llcyB0byBnZXQgZHVtcGVkIHRvICovCiAgICBpZihjb29raWVfb3V0cHV0KGRhdGEtPmNvb2tpZXMsIGRhdGEtPnNldC5zdHJbU1RSSU5HX0NPT0tJRUpBUl0pKQogICAgICBpbmZvZihkYXRhLCAiV0FSTklORzogZmFpbGVkIHRvIHNhdmUgY29va2llcyBpbiAlc1xuIiwKICAgICAgICAgICAgZGF0YS0+c2V0LnN0cltTVFJJTkdfQ09PS0lFSkFSXSk7CiAgfQogIGVsc2UgewogICAgaWYoY2xlYW51cCAmJiBkYXRhLT5jaGFuZ2UuY29va2llbGlzdCkgewogICAgICAvKiBzaW5jZSBub3RoaW5nIGlzIHdyaXR0ZW4sIHdlIGNhbiBqdXN0IGZyZWUgdGhlIGxpc3Qgb2YgY29va2llIGZpbGUKICAgICAgICAgbmFtZXMgKi8KICAgICAgY3VybF9zbGlzdF9mcmVlX2FsbChkYXRhLT5jaGFuZ2UuY29va2llbGlzdCk7IC8qIGNsZWFuIHVwIGxpc3QgKi8KICAgICAgZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3QgPSBOVUxMOwogICAgfQogICAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSwgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwogIH0KCiAgaWYoY2xlYW51cCAmJiAoIWRhdGEtPnNoYXJlIHx8IChkYXRhLT5jb29raWVzICE9IGRhdGEtPnNoYXJlLT5jb29raWVzKSkpIHsKICAgIEN1cmxfY29va2llX2NsZWFudXAoZGF0YS0+Y29va2llcyk7CiAgfQogIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7Cn0KCiNlbmRpZiAvKiBDVVJMX0RJU0FCTEVfSFRUUCB8fCBDVVJMX0RJU0FCTEVfQ09PS0lFUyAqLwo=