LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KCiNpbmNsdWRlICJkb3MuaCIKI2luY2x1ZGUgImZkb3MuaCIKCnN0YXRpYyBpbnQgZGlyX3JlYWQgKEZzX3QgKmZzLAoJCSAgICAgU2xvdF90ICpkaXIsCgkJICAgICBEaXJlY3RvcnlfdCAqZGlyZW50LAoJCSAgICAgaW50IG51bSwKCQkgICAgIHN0cnVjdCB2ZmF0X3N0YXRlICp2KTsKCnN0YXRpYyBpbnQgdW5pY29kZV9yZWFkIChjaGFyICppbiwgY2hhciAqb3V0LCBpbnQgbnVtKTsKc3RhdGljIGludCBtYXRjaCAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcCk7CnN0YXRpYyB1bnNpZ25lZCBjaGFyIHN1bV9zaG9ydG5hbWUgKGNoYXIgKm5hbWUpOwpzdGF0aWMgaW50IGNoZWNrX3ZmYXQgKHN0cnVjdCB2ZmF0X3N0YXRlICp2LCBEaXJlY3RvcnlfdCAqZGlyKTsKc3RhdGljIGNoYXIgKmNvbnZfbmFtZSAoY2hhciAqbmFtZSwgY2hhciAqZXh0LCBjaGFyIENhc2UsIGNoYXIgKmFucyk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBjbGVhcl92ZmF0IC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnN0YXRpYyB2b2lkIGNsZWFyX3ZmYXQgKHN0cnVjdCB2ZmF0X3N0YXRlICp2KQp7CiAgICB2IC0+IHN1YmVudHJpZXMgPSAwOwogICAgdiAtPiBzdGF0dXMgPSAwOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHZmYXRfbG9va3VwIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCB2ZmF0X2xvb2t1cCAoU2xvdF90ICpkaXIsCgkJIEZzX3QgKmZzLAoJCSBEaXJlY3RvcnlfdCAqZGlyZW50LAoJCSBpbnQgKmVudHJ5LAoJCSBpbnQgKnZmYXRfc3RhcnQsCgkJIGNoYXIgKmZpbGVuYW1lLAoJCSBpbnQgZmxhZ3MsCgkJIGNoYXIgKm91dG5hbWUsCgkJIFNsb3RfdCAqZmlsZSkKewogICAgaW50IGZvdW5kOwogICAgc3RydWN0IHZmYXRfc3RhdGUgdmZhdDsKICAgIGNoYXIgbmV3ZmlsZSBbVlNFX05BTUVMRU5dOwogICAgaW50IHZmYXRfcHJlc2VudCA9IDA7CgogICAgaWYgKCplbnRyeSA9PSAtMSkgewoJcmV0dXJuIC0xOwogICAgfQoKICAgIGZvdW5kID0gMDsKICAgIGNsZWFyX3ZmYXQgKCZ2ZmF0KTsKICAgIHdoaWxlICgxKSB7CglpZiAoZGlyX3JlYWQgKGZzLCBkaXIsIGRpcmVudCwgKmVudHJ5LCAmdmZhdCkgPCAwKSB7CgkgICAgaWYgKHZmYXRfc3RhcnQpIHsKCQkqdmZhdF9zdGFydCA9ICplbnRyeTsKCSAgICB9CgkgICAgYnJlYWs7Cgl9CgkoKmVudHJ5KSsrOwoKCS8qIEVtcHR5IHNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglpZiAoZGlyZW50IC0+IG5hbWVbMF0gPT0gJ1wwJyl7CgkgICAgaWYgKHZmYXRfc3RhcnQgPT0gMCkgewoJCWJyZWFrOwoJICAgIH0KCSAgICBjb250aW51ZTsKCX0KCglpZiAoZGlyZW50IC0+IGF0dHIgPT0gQVRUUl9WU0UpIHsKCSAgICAvKiBWU0UgZW50cnksIGNvbnRpbnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkgICAgY29udGludWU7Cgl9CglpZiAoIChkaXJlbnQgLT4gbmFtZSBbMF0gPT0gREVMTUFSSykgfHwKCSAgICAgKChkaXJlbnQgLT4gYXR0ciAmIEFUVFJfRElSRUNUT1JZKSAhPSAwICYmCgkgICAgICAoZmxhZ3MgJiBBQ0NFUFRfRElSKSA9PSAwKSB8fAoJICAgICAoKGRpcmVudCAtPiBhdHRyICYgQVRUUl9WT0xVTUUpICE9IDAgJiYKCSAgICAgIChmbGFncyAmIEFDQ0VQVF9MQUJFTCkgPT0gMCkgfHwKCSAgICAgKCgoZGlyZW50IC0+IGF0dHIgJiAoQVRUUl9ESVJFQ1RPUlkgfCBBVFRSX1ZPTFVNRSkpID09IDApICYmCgkgICAgICAoZmxhZ3MgJiBBQ0NFUFRfUExBSU4pID09IDApKSB7CgkgICAgY2xlYXJfdmZhdCAoJnZmYXQpOwoJICAgIGNvbnRpbnVlOwoJfQoKCXZmYXRfcHJlc2VudCA9IGNoZWNrX3ZmYXQgKCZ2ZmF0LCBkaXJlbnQpOwoJaWYgKHZmYXRfc3RhcnQpIHsKCSAgICAqdmZhdF9zdGFydCA9ICplbnRyeSAtIDE7CgkgICAgaWYgKHZmYXRfcHJlc2VudCkgewoJCSp2ZmF0X3N0YXJ0IC09IHZmYXQuc3ViZW50cmllczsKCSAgICB9Cgl9CgoJaWYgKGRpcmVudCAtPiBhdHRyICYgQVRUUl9WT0xVTUUpIHsKCSAgICBzdHJuY3B5IChuZXdmaWxlLCBkaXJlbnQgLT4gbmFtZSwgOCk7CgkgICAgbmV3ZmlsZSBbOF0gPSAnXDAnOwoJICAgIHN0cm5jYXQgKG5ld2ZpbGUsIGRpcmVudCAtPiBleHQsIDMpOwoJICAgIG5ld2ZpbGUgWzExXSA9ICdcMCc7Cgl9CgllbHNlIHsKCSAgICBjb252X25hbWUgKGRpcmVudCAtPiBuYW1lLCBkaXJlbnQgLT4gZXh0LCBkaXJlbnQgLT4gQ2FzZSwgbmV3ZmlsZSk7Cgl9CgoJaWYgKGZsYWdzICYgTUFUQ0hfQU5ZKSB7CgkgICAgZm91bmQgPSAxOwoJICAgIGJyZWFrOwoJfQoKCWlmICgodmZhdF9wcmVzZW50ICYmIG1hdGNoICh2ZmF0Lm5hbWUsIGZpbGVuYW1lKSkgfHwKCSAgICAobWF0Y2ggKG5ld2ZpbGUsIGZpbGVuYW1lKSkpIHsKCSAgICBmb3VuZCA9IDE7CgkgICAgYnJlYWs7Cgl9CgljbGVhcl92ZmF0ICgmdmZhdCk7CiAgICB9CgogICAgaWYgKGZvdW5kKSB7CglpZiAoKGZsYWdzICYgRE9fT1BFTikgJiYgZmlsZSkgewoJICAgIGlmIChvcGVuX2ZpbGUgKGZpbGUsIGRpcmVudCkgPCAwKSB7CgkJcmV0dXJuICgtMSk7CgkgICAgfQoJfQoJaWYgKG91dG5hbWUpIHsKCSAgICBpZiAodmZhdF9wcmVzZW50KSB7CgkJc3RyY3B5IChvdXRuYW1lLCB2ZmF0Lm5hbWUpOwoJICAgIH0KCSAgICBlbHNlIHsKCQlzdHJjcHkgKG91dG5hbWUsIG5ld2ZpbGUpOwoJICAgIH0KCX0KCXJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAgICAvKiBGaWxlIGZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB9IGVsc2UgewoJKmVudHJ5ID0gLTE7CglyZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGUgbm90IGZvdW5kICAgICAgICAgICAgICAgICAgICAqLwogICAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGRpcl9yZWFkIC0tIFJlYWQgb25lIGRpcmVjdG9yeSBlbnRyeQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgaW50IGRpcl9yZWFkIChGc190ICpmcywKCSAgICAgIFNsb3RfdCAqZGlyLAoJICAgICAgRGlyZWN0b3J5X3QgKmRpcmVudCwKCSAgICAgIGludCBudW0sCgkgICAgICBzdHJ1Y3QgdmZhdF9zdGF0ZSAqdikKewoKICAgIC8qIHJlYWQgdGhlIGRpcmVjdG9yeSBlbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKHJlYWRfZmlsZSAoZnMsCgkJICAgZGlyLAoJCSAgIChjaGFyICopZGlyZW50LAoJCSAgIG51bSAqIE1ESVJfU0laRSwKCQkgICBNRElSX1NJWkUpICE9IE1ESVJfU0laRSkgewoJcmV0dXJuICgtMSk7CiAgICB9CgogICAgaWYgKHYgJiYgKGRpcmVudCAtPiBhdHRyID09IEFUVFJfVlNFKSkgewoJc3RydWN0IHZmYXRfc3ViZW50cnkgKnZzZTsKCXVuc2lnbmVkIGNoYXIgaWQsIGxhc3RfZmxhZzsKCWNoYXIgKmM7CgoJdnNlID0gKHN0cnVjdCB2ZmF0X3N1YmVudHJ5ICopIGRpcmVudDsKCWlkID0gdnNlIC0+IGlkICYgVlNFX01BU0s7CglsYXN0X2ZsYWcgPSAodnNlIC0+IGlkICYgVlNFX0xBU1QpOwoJaWYgKGlkID4gTUFYX1ZGQVRfU1VCRU5UUklFUykgewoJICAgIC8qIEludmFsaWQgVlNFIGVudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCSAgICByZXR1cm4gKC0xKTsKCX0KCgoJLyogRGVjb2RlIFZTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWlmKHYgLT4gc3VtICE9IHZzZSAtPiBzdW0pIHsKCSAgICBjbGVhcl92ZmF0ICh2KTsKCSAgICB2IC0+IHN1bSA9IHZzZSAtPiBzdW07Cgl9CgoKCXYgLT4gc3RhdHVzIHw9IDEgPDwgKGlkIC0gMSk7CglpZiAobGFzdF9mbGFnKSB7CgkgICAgdiAtPiBzdWJlbnRyaWVzID0gaWQ7Cgl9CgoJYyA9ICYodiAtPiBuYW1lIFtWU0VfTkFNRUxFTiAqIChpZCAtIDEpXSk7CgljICs9IHVuaWNvZGVfcmVhZCAodnNlLT50ZXh0MSwgYywgVlNFMVNJWkUpOwoJYyArPSB1bmljb2RlX3JlYWQgKHZzZS0+dGV4dDIsIGMsIFZTRTJTSVpFKTsKCWMgKz0gdW5pY29kZV9yZWFkICh2c2UtPnRleHQzLCBjLCBWU0UzU0laRSk7CgoJaWYgKGxhc3RfZmxhZykgewoJICAgICpjID0gJ1wwJzsJICAgICAgICAvKiBOdWxsIHRlcm1pbmF0ZSBsb25nIG5hbWUgICAgICAgICAgICAgICAgICAqLwoJfQoKICAgIH0KICAgIHJldHVybiAoMCk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogdW5pY29kZV9yZWFkIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnN0YXRpYyBpbnQgdW5pY29kZV9yZWFkIChjaGFyICppbiwgY2hhciAqb3V0LCBpbnQgbnVtKQp7CiAgICBpbnQgajsKCiAgICBmb3IgKGogPSAwOyBqIDwgbnVtOyArK2opIHsKCWlmIChpbiBbMV0pCgkgICAgKm91dCA9ICdfJzsKCWVsc2UKCSAgICAqb3V0ID0gaW4gWzBdOwoJb3V0ICsrOwoJaW4gKz0gMjsKICAgIH0KICAgIHJldHVybiBudW07Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogbWF0Y2ggLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIGludCBtYXRjaCAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcCkKewoKICAgIGZvciAoOyAqcCAhPSAnXDAnOyApIHsKCWlmICh0b3VwcGVyICgqcykgIT0gdG91cHBlciAoKnApKSB7CgkgICAgcmV0dXJuICgwKTsKCX0KCXArKzsKCXMrKzsKICAgIH0KCiAgICBpZiAoKnMgIT0gJ1wwJykgewoJcmV0dXJuICgwKTsKICAgIH0KICAgIGVsc2UgewoJcmV0dXJuICgxKTsKICAgIH0KfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHN1bV9zaG9ydG5hbWUgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIHVuc2lnbmVkIGNoYXIgc3VtX3Nob3J0bmFtZSAoY2hhciAqbmFtZSkKewogICAgdW5zaWduZWQgY2hhciBzdW07CiAgICBpbnQgajsKCiAgICBmb3IgKGogPSBzdW0gPSAwOyBqIDwgMTE7ICsraikgewoJc3VtID0gKChzdW0gJiAxKSA/IDB4ODAgOiAwKSArIChzdW0gPj4gMSkgKwoJICAgIChuYW1lIFtqXSA/IG5hbWUgW2pdIDogJyAnKTsKICAgIH0KICAgIHJldHVybiAoc3VtKTsKfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGNoZWNrX3ZmYXQgLS0KICogUmV0dXJuIDEgaWYgbG9uZyBuYW1lIGlzIHZhbGlkLCAwIGVsc2UKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIGludCBjaGVja192ZmF0IChzdHJ1Y3QgdmZhdF9zdGF0ZSAqdiwgRGlyZWN0b3J5X3QgKmRpcikKewogICAgY2hhciBuYW1lWzEyXTsKCiAgICBpZiAodiAtPiBzdWJlbnRyaWVzID09IDApIHsKCXJldHVybiAwOwogICAgfQoKICAgIHN0cm5jcHkgKG5hbWUsIGRpciAtPiBuYW1lLCA4KTsKICAgIHN0cm5jcHkgKG5hbWUgKyA4LCBkaXIgLT4gZXh0LCAzKTsKICAgIG5hbWUgWzExXSA9ICdcMCc7CgogICAgaWYgKHYgLT4gc3VtICE9IHN1bV9zaG9ydG5hbWUgKG5hbWUpKSB7CglyZXR1cm4gMDsKICAgIH0KCiAgICBpZiggKHYgLT4gc3RhdHVzICYgKCgxIDw8IHYgLT4gc3ViZW50cmllcykgLSAxKSkgIT0KCSgxIDw8IHYgLT4gc3ViZW50cmllcykgLSAxKSB7CglyZXR1cm4gMDsKICAgIH0KICAgIHYtPm5hbWUgW1ZTRV9OQU1FTEVOICogdiAtPiBzdWJlbnRyaWVzXSA9IDA7CgogICAgcmV0dXJuIDE7Cn0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBjb252X25hbWUgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIGNoYXIgKmNvbnZfbmFtZSAoY2hhciAqbmFtZSwgY2hhciAqZXh0LCBjaGFyIENhc2UsIGNoYXIgKmFucykKewogICAgY2hhciB0bmFtZSBbOV0sIHRleHQgWzRdOwogICAgaW50IGk7CgogICAgaSA9IDA7CiAgICB3aGlsZSAoaSA8IDggJiYgbmFtZSBbaV0gIT0gJyAnICYmIG5hbWUgW2ldICE9ICdcMCcpIHsKCXRuYW1lIFtpXSA9IG5hbWUgW2ldOwoJaSsrOwogICAgfQogICAgdG5hbWUgW2ldID0gJ1wwJzsKCiAgICBpZiAoQ2FzZSAmIEJBU0VDQVNFKSB7Cglmb3IgKGkgPSAwOyBpIDwgOCAmJiB0bmFtZSBbaV07IGkrKykgewoJICAgIHRuYW1lIFtpXSA9IHRvbG93ZXIgKHRuYW1lIFtpXSk7Cgl9CiAgICB9CgogICAgaSA9IDA7CiAgICB3aGlsZSAoaSA8IDMgJiYgZXh0IFtpXSAhPSAnICcgJiYgZXh0IFtpXSAhPSAnXDAnKSB7Cgl0ZXh0IFtpXSA9IGV4dCBbaV07CglpKys7CiAgICB9CiAgICB0ZXh0IFtpXSA9ICdcMCc7CgogICAgaWYgKENhc2UgJiBFWFRDQVNFKXsKCWZvciAoaSA9IDA7IGkgPCAzICYmIHRleHQgW2ldOyBpKyspIHsKCSAgICB0ZXh0IFtpXSA9IHRvbG93ZXIgKHRleHQgW2ldKTsKCX0KICAgIH0KCiAgICBpZiAoKnRleHQpIHsKCXN0cmNweSAoYW5zLCB0bmFtZSk7CglzdHJjYXQgKGFucywgIi4iKTsKCXN0cmNhdCAoYW5zLCB0ZXh0KTsKICAgIH0KICAgIGVsc2UgewoJc3RyY3B5KGFucywgdG5hbWUpOwogICAgfQogICAgcmV0dXJuIChhbnMpOwp9Cg==