LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcwoqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLy8KLy8gdWNvbnYgZGVtb25zdHJhdGlvbiBleGFtcGxlIG9mIElDVSBhbmQgY29kZXBhZ2UgY29udmVyc2lvbgovLyBQdXJwb3NlIGlzIHRvIGJlIGEgc2ltaWxhciB0b29sIGFzIHRoZSBVTklYIGljb252IHByb2dyYW0uCi8vIFNob3dzIHRoZSB1c2FnZSBvZiB0aGUgSUNVIGNsYXNzZXM6IFVuaWNvZGVDb252ZXJ0ZXIsIFVuaWNvZGVTdHJpbmcKLy8KLy8gVXNhZ2U6IHVjb252IFtmbGFnXSBbZmlsZV0KLy8gLWYgW2NvZGVzZXRdICBDb252ZXJ0IGZpbGUgZnJvbSB0aGlzIGNvZGVzZXQKLy8gLXQgW2NvZGVzZXRdICBDb252ZXJ0IGZpbGUgdG8gdGhpcyBjb2RlIHNldAovLyAtbCAgICAgICAgICAgIERpc3BsYXkgYWxsIGF2YWlsYWJsZSBjb252ZXJ0ZXJzCi8vIC14IFt0cmFuc2xpdGVyYXRvcl0gIFJ1biBldmVyeXRoaW5nIHRocm91Z2ggYSB0cmFuc2xpdGVyYXRvcgovLyAtTCAgICAgICAgICAgIERpc3BsYXkgYWxsIGF2YWlsYWJsZSB0cmFuc2xpdGVyYXRvcnMKLy8gSWYgbm8gZmlsZSBpcyBnaXZlbiwgdWNvbnYgdHJpZXMgdG8gcmVhZCBmcm9tIHN0ZGluCi8vIAovLyBUbyBjb21waWxlOiBjKysgLW8gdWNvbnYgLUkke0lDVUhPTUV9L2luY2x1ZGUgLVdhbGwgLWcgdWNvbnYuY3BwIC1MJHtJQ1VIT01FfS9saWIgLWxpY3UtdWMgLWxpY3UtaTE4bgovLwovLyBPcmlnaW5hbCBjb250cmlidXRvciB3YXMgSm9uYXMgVXR0ZXJzdHL2bSA8am9uYXMudXR0ZXJzdHJvbUB2aXR0cmFuLm5vcnJub2Quc2U+IGluIDE5OTkKLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi8vCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKLy8gVGhpcyBpcyB0aGUgVW5pY29kZUNvbnZlcnRlciBoZWFkZXJmaWxlCiNpbmNsdWRlICJ1bmljb2RlL2NvbnZlcnQuaCIKCi8vIFRoaXMgaXMgdGhlIFVuaWNvZGVTdHJpbmcgaGVhZGVyZmlsZQojaW5jbHVkZSAidW5pY29kZS91bmlzdHIuaCIKCi8vIE91ciBtZXNzYWdlIHByaW50ZXIuLgojaW5jbHVkZSAidW5pY29kZS91d21zZy5oIgoKI2lmZGVmIFdJTjMyCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGlvLmg+CiNpbmNsdWRlIDxmY250bC5oPgojZW5kaWYKCiNpZmRlZiBVU0VfVFJBTlNMSVQKIyBpbmNsdWRlICJ1bmljb2RlL3RyYW5zbGl0LmgiCiNlbmRpZgoKc3RhdGljIGNvbnN0IHNpemVfdCBidWZmc2l6ZSA9IDQwOTY7CgovLyBQcmludCBhbGwgYXZhaWxhYmxlIGNvZGVwYWdlIGNvbnZlcnRlcnMKc3RhdGljIHZvaWQgcHJpbnRBbGxDb252ZXJ0ZXJzKCkKewogICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICBpbnQzMl90IG51bTsKICAgIHNpemVfdCBudW1wcmludCA9IDA7CiAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1heGxpbmUgPSA3MDsKCiAgICAvLyBnZXRBdmFpbGFibGUgcmV0dXJucyBhIHN0cmluZy10YWJsZSB3aXRoIGFsbCBhdmFpbGFibGUgY29kZXBhZ2VzCiAgICBjb25zdCBjaGFyKiBjb25zdCogY29udnRhYmxlID0gVW5pY29kZUNvbnZlcnRlcjo6Z2V0QXZhaWxhYmxlTmFtZXMobnVtLCBlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKQogICAgewogICAgICB1X3dtc2coImNhbnRHZXROYW1lcyIsIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgKGludDMyX3QgaSA9IDA7IGk8bnVtLTE7IGkrKykKICAgIHsKICAgICAgICAvLyB1Y252X2dldEF2YWlsYWJsZU5hbWUgZ2V0cyB0aGUgY29kZXBhZ2UgbmFtZSBhdCBhIHNwZWNpZmljCiAgICAgICAgLy8gaW5kZXgKICAgICAgICBudW1wcmludCArPSBwcmludGYoIiUtMjBzIiwgY29udnRhYmxlW2ldKTsKICAgICAgICBpZiAobnVtcHJpbnQ+bWF4bGluZSkKICAgICAgICB7CiAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7CiAgICAgICAgICAgIG51bXByaW50ID0gMDsKICAgICAgICB9CiAgICB9CiAgICBwdXRzKGNvbnZ0YWJsZVtudW0tMV0pOwp9CgovLyBDb252ZXJ0IGEgZmlsZSBmcm9tIG9uZSBlbmNvZGluZyB0byBhbm90aGVyCnN0YXRpYyBVQm9vbCBjb252ZXJ0RmlsZShjb25zdCBjaGFyKiBmcm9tY3BhZ2UsIAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRvY3BhZ2UsIAogICAgICAgICAgICAgICAgIEZJTEUqIGluZmlsZSwgCiAgICAgICAgICAgICAgICAgRklMRSogb3V0ZmlsZSkKewogIFVCb29sIHJldCA9IFRSVUU7CiAgICBVbmljb2RlQ29udmVydGVyKiBjb252ZnJvbSA9IDA7CiAgICBVbmljb2RlQ29udmVydGVyKiBjb252dG8gPSAwOwogICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICBVQm9vbCAgZmx1c2g7CiAgICBjb25zdCBjaGFyKiBjYnVmZml0ZXI7CiAgICBjaGFyKiBidWZmaXRlcjsKICAgIGNvbnN0IHNpemVfdCByZWFkc2l6ZSA9IGJ1ZmZzaXplLTE7CiAgICBjaGFyKiBidWZmID0gMDsKCiAgICBjb25zdCBVQ2hhciogY3VuaWl0ZXI7CiAgICBVQ2hhciogdW5paXRlcjsKICAgIFVDaGFyKiB1bmlidWZmID0gMDsKCiAgICBzaXplX3QgcmQsIHRvdGJ1ZmZzaXplOwoKI2lmIFVTRV9UUkFOU0xJVAogICAgY29uc3QgY2hhciAqdHJhbnNsaXQ7CgogICAgVHJhbnNsaXRlcmF0b3IgKnQgPSBOVUxMOwoKICAgIHRyYW5zbGl0ID0gZ2V0ZW52KCJUUkFOU0xJVCIpOwogICAgaWYodHJhbnNsaXQgIT0gTlVMTCAmJiAqdHJhbnNsaXQpCiAgICAgIHsKICAgICAgICB0ID0gVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZUluc3RhbmNlKFVuaWNvZGVTdHJpbmcodHJhbnNsaXQsICIiKSk7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJPcGVuaW5nIHRyYW5zbGl0ZXJhdG9yOiAlc1xuIiwgdHJhbnNsaXQsIHQpOwogICAgICB9CiNlbmRpZgoKICAgIC8vIENyZWF0ZSBjb2RlcGFnZSBjb252ZXJ0ZXIuIElmIHRoZSBjb2RlcGFnZSBvciBpdHMgYWxpYXNlcyB3ZXJlbid0CiAgICAvLyBhdmFpbGFibGUsIGl0IHJldHVybnMgTlVMTCBhbmQgYSBmYWlsdXJlIGNvZGUKICAgIGNvbnZmcm9tID0gbmV3IFVuaWNvZGVDb252ZXJ0ZXIoZnJvbWNwYWdlLCBlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKQogICAgewogICAgICBVbmljb2RlU3RyaW5nIHN0cihmcm9tY3BhZ2UsIiIpOwogICAgICB1X3dtc2coImNhbnRPcGVuRnJvbUNvZGVzZXQiLHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgIH0KCiAgICBjb252dG8gPSBuZXcgVW5pY29kZUNvbnZlcnRlcih0b2NwYWdlLCBlcnIpOwoKICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkKICAgIHsKICAgICAgVW5pY29kZVN0cmluZyBzdHIodG9jcGFnZSwiIik7CiAgICAgIHVfd21zZygiY2FudE9wZW5Ub0NvZGVzZXQiLHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgIH0KCiAgICAvLyBUbyBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIGFsd2F5cyBpcyBvZiBlbm91Z2ggc2l6ZSwgd2UKICAgIC8vIG11c3QgdGFrZSB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbywgdGhhdCBpcyB0aGUgY2hhcmFjdGVyIGluIHRoZSBjb2RlcGFnZQogICAgLy8gdGhhdCB1c2VzIHRoZSBtb3N0IGJ5dGVzIGFuZCBtdWx0aXBseSBpdCBhZ2FpbnN0IHRoZSBidWZmc2l6ZQogICAgdG90YnVmZnNpemUgPSBidWZmc2l6ZSpjb252dG8tPmdldE1heEJ5dGVzUGVyQ2hhcigpOwogICAgYnVmZiA9IG5ldyBjaGFyW3RvdGJ1ZmZzaXplXTsKICAgIHVuaWJ1ZmYgPSBuZXcgVUNoYXJbYnVmZnNpemVdOwogICAgICAgIAogICAgZG8gIAogICAgewogICAgICAgIHJkID0gZnJlYWQoYnVmZiwgMSwgcmVhZHNpemUsIGluZmlsZSk7CiAgICAgICAgaWYgKGZlcnJvcihpbmZpbGUpICE9IDApCiAgICAgICAgewogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihzdHJlcnJvcihlcnJubyksICIiKTsKICAgICAgICAgICAgdV93bXNnKCJjYW50UmVhZCIsc3RyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgLy8gQ29udmVydCB0aGUgcmVhZCBidWZmZXIgaW50byB0aGUgbmV3IGNvZGluZwogICAgICAgIC8vIEFmdGVyIHRoZSBjYWxsICd1bmlpdGVyJyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbGFzdCBjaGFyYWN0ZXIgdGhhdCB3YXMgY29udmVydGVkCiAgICAgICAgLy8gaW4gdGhlICd1bmlidWZmJy4gCiAgICAgICAgLy8gQWxzbyB0aGUgJ2NidWZmaXRlcicgaXMgcG9zaXRpb25lZCBvbiB0aGUgbGFzdCBjb252ZXJ0ZWQgY2hhcmFjdGVyLgogICAgICAgIC8vIEF0IHRoZSBsYXN0IGNvbnZlcnNpb24gaW4gdGhlIGZpbGUsIGZsdXNoIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBzbyB0aGF0CiAgICAgICAgLy8gd2UgZ2V0IGFsbCBjaGFyYWN0ZXJzIGNvbnZlcnRlZAogICAgICAgIC8vCiAgICAgICAgLy8gVGhlIGNvbnZlcnRlciBtdXN0IGJlIGZsdXNoZWQgYXQgdGhlIGVuZCBvZiBjb252ZXJzaW9uIHNvIHRoYXQgY2hhcmFjdGVycwogICAgICAgIC8vIG9uIGhvbGQgYWxzbyB3aWxsIGJlIHdyaXR0ZW4KICAgICAgICB1bmlpdGVyID0gdW5pYnVmZjsKICAgICAgICBjYnVmZml0ZXIgPSBidWZmOwogICAgICAgIGZsdXNoID0gcmQhPXJlYWRzaXplOyAgICAgICAgCiAgICAgICAgY29udmZyb20tPnRvVW5pY29kZSh1bmlpdGVyLCB1bmlpdGVyK2J1ZmZzaXplLCBjYnVmZml0ZXIsIGNidWZmaXRlcityZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBmbHVzaCwgZXJyKTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKQogICAgICAgIHsKICAgICAgICAgICAgdV93bXNnKCJwcm9ibGVtQ3Z0VG9VIiwgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgLy8gQXQgdGhlIGxhc3QgY29udmVyc2lvbiwgdGhlIGNvbnZlcnRlZCBjaGFyYWN0ZXJzIHNob3VsZCBiZSBlcXVhbCB0byBudW1iZXIKICAgICAgICAvLyBvZiBjaGFycyByZWFkLgogICAgICAgIGlmIChmbHVzaCAmJiBjYnVmZml0ZXIhPShidWZmK3JkKSkKICAgICAgICB7CiAgICAgICAgICAgIHVfd21zZygicHJlbUVuZElucHV0Iik7CiAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIC8vIENvbnZlcnQgdGhlIFVuaWNvZGUgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGNvZGVwYWdlCiAgICAgICAgLy8gQWdhaW4gJ2J1ZmZpdGVyJyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbGFzdCBjb252ZXJ0ZWQgY2hhcmFjdGVyCiAgICAgICAgLy8gQW5kICdjdW5paXRlcicgd2lsbCBiZSBwbGFjZWQgb24gdGhlIGxhc3QgY29udmVydGVkIHVuaWNvZGUgY2hhcmFjdGVyCiAgICAgICAgLy8gQXQgdGhlIGxhc3QgY29udmVyc2lvbiBmbHVzaCBzaG91bGQgYmUgc2V0IHRvIHRydWUgdG8gZW5zdXJlIHRoYXQgCiAgICAgICAgLy8gYWxsIGNoYXJhY3RlcnMgbGVmdCBnZXQgY29udmVydGVkCgogICAgICAgIFVuaWNvZGVTdHJpbmcgdSh1bmlidWZmLCB1bmlpdGVyLXVuaWJ1ZmYpOwogICAgICAgIGJ1ZmZpdGVyID0gYnVmZjsKICAgICAgICBjdW5paXRlciA9IHVuaWJ1ZmY7CgojaWZkZWYgVVNFX1RSQU5TTElUCiAgICAgICAgaWYodCkgCiAgICAgICAgICB7CiAgICAgICAgICAgIHQtPnRyYW5zbGl0ZXJhdGUodSk7CiAgICAgICAgICAgIHUuZXh0cmFjdCgwLCB1Lmxlbmd0aCgpLCB1bmlidWZmLCAwKTsKICAgICAgICAgICAgdW5paXRlciA9IHVuaWJ1ZmYgKyB1Lmxlbmd0aCgpOwogICAgICAgICAgICAKICAgICAgICAgIH0KI2VuZGlmCgogICAgICAgIGNvbnZ0by0+ZnJvbVVuaWNvZGUoYnVmZml0ZXIsIGJ1ZmZpdGVyK3RvdGJ1ZmZzaXplLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VuaWl0ZXIsIGN1bmlpdGVyKyhzaXplX3QpKHVuaWl0ZXItdW5pYnVmZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGZsdXNoLCBlcnIpOwogICAgICAgICAgICAKICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpCiAgICAgICAgewogICAgICAgICAgIHVfd21zZygicHJvYmxlbUN2dEZyb21VIiwgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAvLyBBdCB0aGUgbGFzdCBjb252ZXJzaW9uLCB0aGUgY29udmVydGVkIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGVxdWFsIHRvIG51bWJlcgogICAgICAgIC8vIG9mIGNvbnN1bWVkIGNoYXJhY3RlcnMuCiAgICAgICAgaWYgKGZsdXNoICYmIGN1bmlpdGVyIT0odW5pYnVmZisoc2l6ZV90KSh1bmlpdGVyLXVuaWJ1ZmYpKSkKICAgICAgICB7CiAgICAgICAgICB1X3dtc2coInByZW1FbmQiKTsKICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIC8vIEZpbmFsbHksIHdyaXRlIHRoZSBjb252ZXJ0ZWQgYnVmZmVyIHRvIHRoZSBvdXRwdXQgZmlsZQogICAgICAgIHJkID0gIChzaXplX3QpKGJ1ZmZpdGVyLWJ1ZmYpOwogICAgICAgIGlmIChmd3JpdGUoYnVmZiwgMSwgcmQsIG91dGZpbGUpICE9IHJkKQogICAgICAgIHsKICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKHN0cmVycm9yKGVycm5vKSwiIik7CiAgICAgICAgICB1X3dtc2coImNhbnRXcml0ZSIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICAgICB9CiAgICAgICAgCiAgICB9IHdoaWxlICghZmx1c2gpOyAvLyBTdG9wIHdoZW4gd2UgaGF2ZSBmbHVzaGVkIHRoZSBjb252ZXJ0ZXJzICh0aGlzIG1lYW5zIHRoYXQgaXQncyB0aGUgZW5kIG9mIG91dHB1dCkKCiAgICBnb3RvIG5vcm1hbF9leGl0OwogIGVycm9yX2V4aXQ6CiAgICByZXQgPSBUUlVFOwogIG5vcm1hbF9leGl0OgogICAgaWYgKGNvbnZmcm9tKSBkZWxldGUgY29udmZyb207CiAgICBpZiAoY29udnRvKSBkZWxldGUgY29udnRvOwoKI2lmZGVmIFVTRV9UUkFOU0xJVAogICAgaWYgKCB0ICkgZGVsZXRlIHQ7CiNlbmRpZgoKICAgIC8vIENsb3NlIHRoZSBjcmVhdGVkIGNvbnZlcnRlcnMKICAgIGlmIChidWZmKSBkZWxldGUgW10gYnVmZjsKICAgIGlmICh1bmlidWZmKSBkZWxldGUgW10gdW5pYnVmZjsKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBVUmVzb3VyY2VCdW5kbGUgKmdCdW5kbGUgPSAwOwoKc3RhdGljIHZvaWQgaW5pdE1zZyhjb25zdCBjaGFyICpwbmFtZSkgewogICAgc3RhdGljIGludCBwcyA9IDA7CgogICAgaWYgKCFwcykgewoJY2hhciBkYXRhUGF0aFs1MDBdOwoJVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CgoJcHMgPSAxOwoKCS8qIEdldCBtZXNzYWdlcy4gKi8KCQoJc3RyY3B5KGRhdGFQYXRoLCB1X2dldERhdGFEaXJlY3RvcnkoKSk7CglzdHJjYXQoZGF0YVBhdGgsICJ1Y29udm1zZyIpOwoJCglnQnVuZGxlID0gdV93bXNnX3NldFBhdGgoZGF0YVBhdGgsICZlcnIpOwoJaWYoVV9GQUlMVVJFKGVycikpCgkgICAgewoJCWZwcmludGYoc3RkZXJyLCAiJXM6IHdhcm5pbmc6IGNvdWxkbid0IG9wZW4gcmVzb3VyY2UgYnVuZGxlICVzOiAlc1xuIiwgCgkJCXBuYW1lLAoJCQlkYXRhUGF0aCwKCQkJdV9lcnJvck5hbWUoZXJyKSk7CgkgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICpwbmFtZSwgaW50IGVjb2RlKQp7CiAgY29uc3QgVUNoYXIgKm1zZzsKICBpbnQzMl90ICAgICAgbXNnTGVuOwogIFVFcnJvckNvZGUgIGVyciA9IFVfWkVST19FUlJPUjsKICAgCiAgaW5pdE1zZyhwbmFtZSk7CiAgbXNnID0gdXJlc19nZXRTdHJpbmdCeUtleShnQnVuZGxlLCBlY29kZSA/ICJsY1VzYWdlV29yZCIgOiAidWNVc2FnZVdvcmQiLCAmbXNnTGVuLCAmZXJyKTsKICBVbmljb2RlU3RyaW5nIHVwbmFtZShwbmFtZSk7CiAgVW5pY29kZVN0cmluZyBtbmFtZShtc2csIG1zZ0xlbik7CgogIHVfd21zZygidXNhZ2UiLCBtbmFtZS5nZXRCdWZmZXIoKSwgdXBuYW1lLmdldEJ1ZmZlcigpKTsKICBpZiAoIWVjb2RlKSB7CiAgICBwdXRjaGFyKCdcbicpOwogICAgdV93bXNnKCJoZWxwIik7CiAgfQoKICBleGl0KGVjb2RlKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQp7CiAgICBGSUxFKiBmaWxlID0gMDsKICAgIEZJTEUqIGluZmlsZTsKICAgIGludCAgIHJldCA9IDA7CiAgICBjb25zdCBjaGFyKiBmcm9tY3BhZ2UgPSAwOwogICAgY29uc3QgY2hhciogdG9jcGFnZSA9IDA7CiAgICBjb25zdCBjaGFyKiBpbmZpbGVzdHIgPSAwOwoKICAgIGNoYXIqKiBpdGVyID0gYXJndisxOwogICAgY2hhcioqIGVuZCA9IGFyZ3YrYXJnYzsgICAgCgogICAgY29uc3QgY2hhciAqcG5hbWUgPSAqYXJndjsKCiAgICAvLyBGaXJzdCwgZ2V0IHRoZSBhcmd1bWVudHMgZnJvbSBjb21tYW5kLWxpbmUKICAgIC8vIHRvIGtub3cgdGhlIGNvZGVwYWdlcyB0byBjb252ZXJ0IGJldHdlZW4KICAgIGZvciAoOyBpdGVyIT1lbmQ7IGl0ZXIrKykKICAgIHsKICAgICAgICAvLyBDaGVjayBmb3IgZnJvbSBjaGFyc2V0CiAgICAgICAgaWYgKHN0cmNtcCgiLWYiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItLWZyb20tY29kZSIsICppdGVyKSkKICAgICAgICB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgaWYgKGl0ZXIhPWVuZCkKICAgICAgICAgICAgICAgIGZyb21jcGFnZSA9ICppdGVyOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzdHJjbXAoIi10IiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS10by1jb2RlIiwgKml0ZXIpKQogICAgICAgIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciE9ZW5kKQogICAgICAgICAgICAgICAgdG9jcGFnZSA9ICppdGVyOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzdHJjbXAoIi1sIiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS1saXN0IiwgKml0ZXIpKQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRBbGxDb252ZXJ0ZXJzKCk7CiAgICAgICAgICAgIGdvdG8gbm9ybWFsX2V4aXQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHN0cmNtcCgiLWgiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItLWhlbHAiLCAqaXRlcikpCiAgICAgICAgewogICAgICAgICAgICB1c2FnZShwbmFtZSwgMCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCoqaXRlciA9PSAnLScgJiYgKCppdGVyKVsxXSkgewoJICAgIHVzYWdlKHBuYW1lLCAxKTsKCX0gZWxzZSBpZiAoIWluZmlsZXN0cikgewogICAgICAgICAgICBpbmZpbGVzdHIgPSAqaXRlcjsKICAgICAgICB9IGVsc2UgewoJICAgIHVzYWdlKHBuYW1lLCAxKTsKCX0KICAgIH0KCiAgICBpZiAoZnJvbWNwYWdlPT0wICYmIHRvY3BhZ2U9PTApCiAgICB7CiAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgfQoKICAgIGlmIChmcm9tY3BhZ2U9PTApCiAgICB7CiAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICB1X3dtc2coIm5vRnJvbUNvZGVzZXQiKTsKICAgICAgLy8iTm8gY29udmVyc2lvbiBmcm9tIGNvZGVzZXQgZ2l2ZW4gKHVzZSAtZilcbiIpOwogICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgIH0KICAgIGlmICh0b2NwYWdlPT0wKQogICAgewogICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgdV93bXNnKCJub1RvQ29kZXNldCIpOwogICAgICAvLyAiTm8gY29udmVyc2lvbiB0byBjb2Rlc2V0IGdpdmVuICh1c2UgLXQpXG4iKTsKICAgICAgZ290byBlcnJvcl9leGl0OwogICAgfQoKICAgIC8vIE9wZW4gdGhlIGNvcnJlY3QgaW5wdXQgZmlsZSBvciBjb25uZWN0IHRvIHN0ZGluIGZvciByZWFkaW5nIGlucHV0CiAgICBpZiAoaW5maWxlc3RyIT0wICYmIHN0cmNtcChpbmZpbGVzdHIsICItIikpCiAgICB7CiAgICAgICAgZmlsZSA9IGZvcGVuKGluZmlsZXN0ciwgInJiIik7CiAgICAgICAgaWYgKGZpbGU9PTApCiAgICAgICAgewogICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIxKGluZmlsZXN0ciwiIik7CiAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cjIoc3RyZXJyb3IoZXJybm8pLCIiKTsKICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgdV93bXNnKCJjYW50T3BlbklucHV0RiIsIAogICAgICAgICAgICAgICAgIHN0cjEuZ2V0QnVmZmVyKCksCiAgICAgICAgICAgICAgICAgc3RyMi5nZXRCdWZmZXIoKSk7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaW5maWxlID0gZmlsZTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGluZmlsZSA9IHN0ZGluOwojaWZkZWYgV0lOMzIKICAgICAgICBpZiggc2V0bW9kZSggZmlsZW5vICggc3RkaW4gKSwgT19CSU5BUlkgKSA9PSAtMSApIHsKICAgICAgICAgICAgICAgIHBlcnJvciAoICJDYW5ub3Qgc2V0IHN0ZGluIHRvIGJpbmFyeSBtb2RlIiApOwogICAgICAgICAgICAgICAgZXhpdCgtMSk7CiAgICAgICAgfQojZW5kaWYKICAgIH0KI2lmZGVmIFdJTjMyCiAgaWYoIHNldG1vZGUoIGZpbGVubyAoIHN0ZG91dCApLCBPX0JJTkFSWSApID09IC0xICkgewogICAgICAgICAgcGVycm9yICggIkNhbm5vdCBzZXQgc3Rkb3V0IHRvIGJpbmFyeSBtb2RlIiApOwogICAgICAgICAgZXhpdCgtMSk7CiAgfQojZW5kaWYKICAgIGlmICghY29udmVydEZpbGUoZnJvbWNwYWdlLCB0b2NwYWdlLCBpbmZpbGUsIHN0ZG91dCkpCiAgICAgICAgZ290byBlcnJvcl9leGl0OwoKICAgIGdvdG8gbm9ybWFsX2V4aXQ7CiAgZXJyb3JfZXhpdDoKICAgIHJldCA9IDE7CiAgbm9ybWFsX2V4aXQ6CgogICAgaWYgKGZpbGUhPTApCiAgICAgICAgZmNsb3NlKGZpbGUpOwogICAgcmV0dXJuIHJldDsKfQo=