LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8bWFsbG9jLmg+CgojaW5jbHVkZSAiZG9zLmgiCiNpbmNsdWRlICJmZG9zLmgiCgoKY29uc3QgY2hhciAqbW9udGggW10gPSB7IkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIn07CgpGc190ICAgIGZzOwpGaWxlX3QgIGZpbGU7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGRvc19vcGVuIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkb3Nfb3BlbihjaGFyICpuYW1lKQp7CiAgICBpbnQgbGc7CiAgICBpbnQgZW50cnk7CiAgICBjaGFyICpmbmFtZTsKCiAgICAvKiBXZSBuZWVkIHRvIHN1cHByZXNzIHRoZSAiIGNoYXIgYXJvdW5kIHRoZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmIChuYW1lIFswXSA9PSAnIicpIHsKCW5hbWUgKys7CiAgICB9CiAgICBsZyA9IHN0cmxlbiAobmFtZSk7CiAgICBpZiAobmFtZSBbbGcgLSAxXSA9PSAnIicpIHsKCW5hbWUgW2xnIC0gMV0gPSAnXDAnOwogICAgfQoKICAgIC8qIE9wZW4gZmlsZSBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKGZzX2luaXQgKCZmcykgPCAwKSB7CglyZXR1cm4gLTE7CiAgICB9CgogICAgLyogSW5pdCB0aGUgZmlsZSBkZXNjcmlwdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBmaWxlLm5hbWUgPSBuYW1lOwogICAgZmlsZS5mcyA9ICZmczsKCiAgICAvKiBmaW5kIHRoZSBzdWJkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmIChvcGVuX3N1YmRpciAoJmZpbGUpIDwgMCkgewoJcmV0dXJuICgtMSk7CiAgICB9CgogICAgZm5hbWUgPSBiYXNlbmFtZSAobmFtZSk7CgogICAgLyogaWYgd2UgdHJ5IHRvIG9wZW4gcm9vdCBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAoKmZuYW1lID09ICdcMCcpIHsKCWZpbGUuZmlsZSA9IGZpbGUuc3ViZGlyOwoJcmV0dXJuICgwKTsKICAgIH0KCiAgICAvKiBmaW5kIHRoZSBmaWxlIGluIHRoZSBzdWJkaXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGVudHJ5ID0gMDsKICAgIGlmICh2ZmF0X2xvb2t1cCAoJmZpbGUuc3ViZGlyLAoJCSAgICAgZmlsZS5mcywKCQkgICAgICZmaWxlLmZpbGUuZGlyLAoJCSAgICAgJmVudHJ5LAoJCSAgICAgMCwKCQkgICAgIGZuYW1lLAoJCSAgICAgQUNDRVBUX0RJUiB8IEFDQ0VQVF9QTEFJTiB8IFNJTkdMRSB8IERPX09QRU4sCgkJICAgICAwLAoJCSAgICAgJmZpbGUuZmlsZSkgIT0gMCkgewoJLyogRmlsZSBub3QgZm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCXByaW50ZiAoIkZpbGUgbm90IGZvdW5kXG4iKTsKCXJldHVybiAoLTEpOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGRvc19yZWFkIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkb3NfcmVhZCAodWxvbmcgYWRkcikKewogICAgaW50IHJlYWQgPSAwLCBuYjsKCiAgICAvKiBUcnkgdG8gYm9vdCBhIGRpcmVjdG9yeSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmIChmaWxlLmZpbGUuZGlyLmF0dHIgJiAoQVRUUl9ESVJFQ1RPUlkgfCBBVFRSX1ZPTFVNRSkpIHsKCXByaW50ZiAoIlVuYWJsZSB0byBib290ICVzICEhXG4iLCBmaWxlLm5hbWUpOwoJcmV0dXJuICgtMSk7CiAgICB9CiAgICB3aGlsZSAocmVhZCA8IGZpbGUuZmlsZS5GaWxlU2l6ZSkgewoJUFJJTlRGICgicmVhZF9maWxlICglbGQpXG4iLCAoZmlsZS5maWxlLkZpbGVTaXplIC0gcmVhZCkpOwoJbmIgPSByZWFkX2ZpbGUgKCZmcywKCQkJJmZpbGUuZmlsZSwKCQkJKGNoYXIgKilhZGRyICsgcmVhZCwKCQkJcmVhZCwKCQkJKGZpbGUuZmlsZS5GaWxlU2l6ZSAtIHJlYWQpKTsKCVBSSU5URiAoInJlYWRfZmlsZSAtPiAlZFxuIiwgbmIpOwoJaWYgKG5iIDwgMCkgewoJICAgIHByaW50ZiAoInJlYWQgZXJyb3JcbiIpOwoJICAgIHJldHVybiAoLTEpOwoJfQoJcmVhZCArPSBuYjsKICAgIH0KICAgIHJldHVybiAocmVhZCk7Cn0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBkb3NfZGlyIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkb3NfZGlyICh2b2lkKQp7CiAgICBpbnQgZW50cnk7CiAgICBEaXJlY3RvcnlfdCBkaXI7CiAgICBjaGFyICpuYW1lOwoKCiAgICBpZiAoKGZpbGUuZmlsZS5kaXIuYXR0ciAmIEFUVFJfRElSRUNUT1JZKSA9PSAwKSB7CglwcmludGYgKCIlczogbm90IGEgZGlyZWN0b3J5ICEhXG4iLCBmaWxlLm5hbWUpOwoJcmV0dXJuICgxKTsKICAgIH0KICAgIGVudHJ5ID0gMDsKICAgIGlmICgobmFtZSA9IG1hbGxvYyAoTUFYX1ZOQU1FTEVOICsgMSkpID09IE5VTEwpIHsKCVBSSU5URiAoIkFsbGNhdGlvbiBlcnJvclxuIik7CglyZXR1cm4gKDEpOwogICAgfQoKICAgIHdoaWxlICh2ZmF0X2xvb2t1cCAoJmZpbGUuZmlsZSwKCQkJZmlsZS5mcywKCQkJJmRpciwKCQkJJmVudHJ5LAoJCQkwLAoJCQlOVUxMLAoJCQlBQ0NFUFRfRElSIHwgQUNDRVBUX1BMQUlOIHwgTUFUQ0hfQU5ZLAoJCQluYW1lLAoJCQlOVUxMKSA9PSAwKSB7CgkvKiBEaXNwbGF5IGZpbGUgaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJcHJpbnRmICgiJTMuM3MgJTlkICVzICUwMmQgJTA0ZCAlMDJkOiUwMmQ6JTAyZCAlc1xuIiwKCQkoZGlyLmF0dHIgJiBBVFRSX0RJUkVDVE9SWSkgPyAiZGlyIiA6ICIgICAiLAoJCV9fbGUzMl90b19jcHUgKGRpci5zaXplKSwKCQltb250aCBbRE9TX01PTlRIICgmZGlyKSAtIDFdLAoJCURPU19EQVkgKCZkaXIpLAoJCURPU19ZRUFSICgmZGlyKSwKCQlET1NfSE9VUiAoJmRpciksCgkJRE9TX01JTlVURSAoJmRpciksCgkJRE9TX1NFQyAoJmRpciksCgkJbmFtZSk7CgogICAgfQogICAgZnJlZSAobmFtZSk7CiAgICByZXR1cm4gKDApOwp9Cg==