LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCioJQ29weXJpZ2h0IChDKSAxOTkyLTE5OTcgTWljaGFlbCBLLiBKb2huc29uLCBqb2huc29ubUByZWRoYXQuY29tICAgICAgKgoqCQkJCQkJCQkJICAgICAqCioJVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgICAgICAgICAgICAgKgoqCVB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGFueSBsYXRlciB2ZXJzaW9uLiAgU2VlIGZpbGUgQ09QWUlORyAgICoKKglmb3IgaW5mb3JtYXRpb24gb24gZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMuCQkJICAgICAqClwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogJExvZzogdHVuZWxwLmMsdiAkCiAqIFJldmlzaW9uIDEuOSAgMTk5OC8wNi8wOCAxOTozNzoxMSAgamFubAogKiBUaHVzIGNvbXBpbGVzIHR1bmVscCB3aXRoIDIuMS4xMDMga2VybmVscwogKgogKiBSZXZpc2lvbiAxLjggIDE5OTcvMDcvMDYgMDA6MTQ6MDYgIGFlYnIKICogRml4ZXMgdG8gc2lsZW5jZSAtV2FsbC4KICoKICogUmV2aXNpb24gMS43ICAxOTk3LzA2LzIwIDE2OjEwOjM4ICBqYW5sCiAqIHR1bmVscCByZWZyZXNoZWQgZnJvbSBhdXRob3JzIGFyY2hpdmUuCiAqCiAqIFJldmlzaW9uIDEuOSAgMTk5Ny8wNi8yMCAxMjo1Njo0MyAgam9obnNvbm0KICogRmluaXNoZWQgZml4aW5nIGxpY2Vuc2UgdGVybXMuCiAqCiAqIFJldmlzaW9uIDEuOCAgMTk5Ny8wNi8yMCAxMjozNDo1OSAgam9obnNvbm0KICogRml4ZWQgY29weXJpZ2h0IGFuZCBsaWNlbnNlLgogKgogKiBSZXZpc2lvbiAxLjcgIDE5OTUvMDMvMjkgMTE6MTY6MjMgIGpvaG5zb25tCiAqIFRZUE8gZml4ZWQuLi4KICoKICogUmV2aXNpb24gMS42ICAxOTk1LzAzLzI5ICAxMToxMjoxNSAgam9obnNvbm0KICogQWRkZWQgdGhpcmQgYXJndW1lbnQgdG8gaW9jdGwgbmVlZGVkIHdpdGggbmV3IGtlcm5lbHMKICoKICogUmV2aXNpb24gMS41ICAxOTk1LzAxLzEzICAxMDozMzo0MyAgam9obnNvbm0KICogQ2hyaXMncyBjaGFuZ2VzIGZvciBuZXcgaW9jdGwgbnVtYmVycyBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICogYW5kIHRoZSByZXNldCBpb2N0bC4KICoKICogUmV2aXNpb24gMS40ICAxOTk1LzAxLzAzICAxNzo0MjoxNCAgam9obnNvbm0KICogLXMgaXNuJ3Qgc3VwcG9zZWQgdG8gdGFrZSBhbiBhcmd1bWVudDsgcmVtb3ZlZCA6IGFmdGVyIHMgaW4gZ2V0b3B0Li4uCiAqCiAqIFJldmlzaW9uIDEuMyAgMTk5NS8wMS8wMyAgMDc6MzY6NDkgIGpvaG5zb25tCiAqIEZpeGVkIHR5cG8KICoKICogUmV2aXNpb24gMS4yICAxOTk1LzAxLzAzICAwNzozMzo0NCAgam9obnNvbm0KICogcmV2aXNpb25zIGZvciBscCBkcml2ZXIgdXBkYXRlcyBpbiBMaW51eCAxLjEuNzYKICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoKICogMTk5OS0wNS0wNyBNZXJnZWQgTFBUUlVTVElSUSBwYXRjaCBieSBBbmRyZWEgQXJjYW5nZWxpICgxOTk4LzExLzI5KSwgYWViCiAqCiAqLwoKI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGZjbnRsLmg+Ci8qICNpbmNsdWRlIDxsaW51eC9mcy5oPiAqLwojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSAibHAuaCIKI2luY2x1ZGUgIm5scy5oIgoKc3RydWN0IGNvbW1hbmQgewogIGxvbmcgb3A7CiAgbG9uZyB2YWw7CiAgc3RydWN0IGNvbW1hbmQgKm5leHQ7Cn07CgoKc3RhdGljIHZvaWQKcHJpbnRfdXNhZ2UoY2hhciAqcHJvZ25hbWUpIHsKICBwcmludGYoXygiVXNhZ2U6ICVzIDxkZXZpY2U+IFsgLWkgPElSUT4gfCAtdCA8VElNRT4gfCAtYyA8Q0hBUlM+IHwgLXcgPFdBSVQ+IHwgXG4iCgkgICAiICAgICAgICAgIC1hIFtvbnxvZmZdIHwgLW8gW29ufG9mZl0gfCAtQyBbb258b2ZmXSB8IC1xIFtvbnxvZmZdIHwgLXMgfCBcbiIKCSAgICIgICAgICAgICAgLVQgW29ufG9mZl0gXVxuIiksCgkgcHJvZ25hbWUpOwogIGV4aXQgKDEpOwp9CgpzdGF0aWMgdm9pZApwcmludF92ZXJzaW9uKGNoYXIgKnByb2duYW1lKSB7CiAgcHJpbnRmKCIlcyAoJXMpXG4iLCBwcm9nbmFtZSwgUEFDS0FHRV9TVFJJTkcpOwp9CgpzdGF0aWMgdm9pZCAqCm15bGxvYyhsb25nIHNpemUpIHsKICB2b2lkICpwdHI7CiAgaWYoIShwdHIgPSAodm9pZCopbWFsbG9jKHNpemUpKSkgewogICAgcGVycm9yKF8oIm1hbGxvYyBlcnJvciIpKTsKICAgIGV4aXQoMik7CiAgfQogIHJldHVybiBwdHI7Cn0KCnN0YXRpYyBjaGFyICpwcm9nbmFtZTsKCnN0YXRpYyBsb25nCmdldF92YWwoY2hhciAqdmFsKSB7CiAgbG9uZyByZXQ7CiAgaWYgKCEoc3NjYW5mKHZhbCwgIiVsZCIsICZyZXQpID09IDEpKSB7CiAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IGJhZCB2YWx1ZVxuIiksIHByb2duYW1lKTsKICAgIGV4aXQoMyk7CiAgfQogIHJldHVybiByZXQ7Cn0KCgpzdGF0aWMgbG9uZwpnZXRfb25vZmYoY2hhciAqdmFsKSB7CiAgaWYgKCFzdHJuY2FzZWNtcCgib24iLCB2YWwsIDIpKQogICAgcmV0dXJuIDE7CiAgcmV0dXJuIDA7Cn0KCmludAptYWluIChpbnQgYXJnYywgY2hhciAqKiBhcmd2KSB7CiAgaW50IGMsIGZkLCBpcnEsIHN0YXR1cywgc2hvd19pcnEsIG9mZnNldCA9IDAsIHJldHZhbDsKICBjaGFyICpmaWxlbmFtZSwgKnA7CiAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKICBzdHJ1Y3QgY29tbWFuZCAqY21kcywgKmNtZHN0OwoKICBwcm9nbmFtZSA9IGFyZ3ZbMF07CiAgaWYgKChwID0gc3RycmNocihwcm9nbmFtZSwgJy8nKSkgIT0gTlVMTCkKCSAgcHJvZ25hbWUgPSBwKzE7CgogIHNldGxvY2FsZShMQ19BTEwsICIiKTsKICBiaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwogIHRleHRkb21haW4oUEFDS0FHRSk7CgogIGlmIChhcmdjIDwgMikgcHJpbnRfdXNhZ2UocHJvZ25hbWUpOwoKICBjbWRzdCA9IGNtZHMgPSBteWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21tYW5kKSk7CiAgY21kcy0+bmV4dCA9IDA7CgogIHNob3dfaXJxID0gMTsKICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgInQ6Yzp3OmE6aTpobzpDOnNxOnJUOnZWIikpICE9IC0xKSB7CiAgICBzd2l0Y2ggKGMpIHsKICAgIGNhc2UgJ2gnOgogICAgICBwcmludF91c2FnZShwcm9nbmFtZSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnaSc6CiAgICAgIGNtZHMtPm9wID0gTFBTRVRJUlE7CiAgICAgIGNtZHMtPnZhbCA9IGdldF92YWwob3B0YXJnKTsKICAgICAgY21kcy0+bmV4dCA9IG15bGxvYyhzaXplb2Yoc3RydWN0IGNvbW1hbmQpKTsKICAgICAgY21kcyA9IGNtZHMtPm5leHQ7IGNtZHMtPm5leHQgPSAwOwogICAgICBicmVhazsKICAgIGNhc2UgJ3QnOgogICAgICBjbWRzLT5vcCA9IExQVElNRTsKICAgICAgY21kcy0+dmFsID0gZ2V0X3ZhbChvcHRhcmcpOwogICAgICBjbWRzLT5uZXh0ID0gbXlsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWFuZCkpOwogICAgICBjbWRzID0gY21kcy0+bmV4dDsgY21kcy0+bmV4dCA9IDA7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnYyc6CiAgICAgIGNtZHMtPm9wID0gTFBDSEFSOwogICAgICBjbWRzLT52YWwgPSBnZXRfdmFsKG9wdGFyZyk7CiAgICAgIGNtZHMtPm5leHQgPSBteWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21tYW5kKSk7CiAgICAgIGNtZHMgPSBjbWRzLT5uZXh0OyBjbWRzLT5uZXh0ID0gMDsKICAgICAgYnJlYWs7CiAgICBjYXNlICd3JzoKICAgICAgY21kcy0+b3AgPSBMUFdBSVQ7CiAgICAgIGNtZHMtPnZhbCA9IGdldF92YWwob3B0YXJnKTsKICAgICAgY21kcy0+bmV4dCA9IG15bGxvYyhzaXplb2Yoc3RydWN0IGNvbW1hbmQpKTsKICAgICAgY21kcyA9IGNtZHMtPm5leHQ7IGNtZHMtPm5leHQgPSAwOwogICAgICBicmVhazsKICAgIGNhc2UgJ2EnOgogICAgICBjbWRzLT5vcCA9IExQQUJPUlQ7CiAgICAgIGNtZHMtPnZhbCA9IGdldF9vbm9mZihvcHRhcmcpOwogICAgICBjbWRzLT5uZXh0ID0gbXlsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWFuZCkpOwogICAgICBjbWRzID0gY21kcy0+bmV4dDsgY21kcy0+bmV4dCA9IDA7CiAgICAgIGJyZWFrOwogICAgY2FzZSAncSc6CiAgICAgIGlmIChnZXRfb25vZmYob3B0YXJnKSkgewogICAgICAgIHNob3dfaXJxPTE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2hvd19pcnE9MDsKICAgICAgfQojaWZkZWYgTFBHRVRTVEFUVVMKICAgIGNhc2UgJ28nOgogICAgICBjbWRzLT5vcCA9IExQQUJPUlRPUEVOOwogICAgICBjbWRzLT52YWwgPSBnZXRfb25vZmYob3B0YXJnKTsKICAgICAgY21kcy0+bmV4dCA9IG15bGxvYyhzaXplb2Yoc3RydWN0IGNvbW1hbmQpKTsKICAgICAgY21kcyA9IGNtZHMtPm5leHQ7IGNtZHMtPm5leHQgPSAwOwogICAgICBicmVhazsKICAgIGNhc2UgJ0MnOgogICAgICBjbWRzLT5vcCA9IExQQ0FSRUZVTDsKICAgICAgY21kcy0+dmFsID0gZ2V0X29ub2ZmKG9wdGFyZyk7CiAgICAgIGNtZHMtPm5leHQgPSBteWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21tYW5kKSk7CiAgICAgIGNtZHMgPSBjbWRzLT5uZXh0OyBjbWRzLT5uZXh0ID0gMDsKICAgICAgYnJlYWs7CiAgICBjYXNlICdzJzoKICAgICAgc2hvd19pcnEgPSAwOwogICAgICBjbWRzLT5vcCA9IExQR0VUU1RBVFVTOwogICAgICBjbWRzLT52YWwgPSAwOwogICAgICBjbWRzLT5uZXh0ID0gbXlsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWFuZCkpOwogICAgICBjbWRzID0gY21kcy0+bmV4dDsgY21kcy0+bmV4dCA9IDA7CiAgICAgIGJyZWFrOwojZW5kaWYKI2lmZGVmIExQUkVTRVQKICAgIGNhc2UgJ3InOgogICAgICBjbWRzLT5vcCA9IExQUkVTRVQ7CiAgICAgIGNtZHMtPnZhbCA9IDA7CiAgICAgIGNtZHMtPm5leHQgPSBteWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21tYW5kKSk7CiAgICAgIGNtZHMgPSBjbWRzLT5uZXh0OyBjbWRzLT5uZXh0ID0gMDsKICAgICAgYnJlYWs7CiNlbmRpZgojaWZkZWYgTFBUUlVTVElSUQogICAgY2FzZSAnVCc6CiAgICAgIC8qIE5vdGU6IHRoaXMgd2lsbCBkbyB0aGUgd3JvbmcgdGhpbmcgb24gMi4wLjM2IHdoZW4gY29tcGlsZWQgdW5kZXIgMi4yLnggKi8KICAgICAgY21kcy0+b3AgPSBMUFRSVVNUSVJROwogICAgICBjbWRzLT52YWwgPSBnZXRfb25vZmYob3B0YXJnKTsKICAgICAgY21kcy0+bmV4dCA9IG15bGxvYyhzaXplb2Yoc3RydWN0IGNvbW1hbmQpKTsKICAgICAgY21kcyA9IGNtZHMtPm5leHQ7IGNtZHMtPm5leHQgPSAwOwogICAgICBicmVhazsKI2VuZGlmCiAgICBjYXNlICd2JzoKICAgIGNhc2UgJ1YnOgogICAgICBwcmludF92ZXJzaW9uKHByb2duYW1lKTsKICAgICAgZXhpdCgwKTsKICAgIGRlZmF1bHQ6CiAgICAgIHByaW50X3VzYWdlKHByb2duYW1lKTsKICAgIH0KICB9CgogIGlmIChvcHRpbmQgIT0gYXJnYy0xKQogICAgcHJpbnRfdXNhZ2UocHJvZ25hbWUpOwoKICBmaWxlbmFtZSA9IHN0cmR1cChhcmd2W29wdGluZF0pOwogIGZkID0gb3BlbihmaWxlbmFtZSwgT19XUk9OTFl8T19OT05CTE9DSywgMCk7CiAgLyogTmVlZCB0byBvcGVuIE9fTk9OQkxPQ0sgaW4gY2FzZSBBQk9SVE9QRU4gaXMgYWxyZWFkeSBzZXQgYW5kCiAgICAgcHJpbnRlciBpcyBvZmYgb3Igb2ZmLWxpbmUgb3IgaW4gYW4gZXJyb3IgY29uZGl0aW9uLiAgT3RoZXJ3aXNlCiAgICAgd2Ugd291bGQgYWJvcnQuLi4gKi8KICBpZiAoZmQgPCAwKSB7CiAgICBwZXJyb3IoZmlsZW5hbWUpOwogICAgcmV0dXJuIC0xOwogIH0KCiAgZnN0YXQoZmQsICZzdGF0YnVmKTsKCiAgaWYoIVNfSVNDSFIoc3RhdGJ1Zi5zdF9tb2RlKSkgewogICAgcHJpbnRmKF8oIiVzOiAlcyBub3QgYW4gbHAgZGV2aWNlLlxuIiksIGFyZ3ZbMF0sIGZpbGVuYW1lKTsKICAgIHByaW50X3VzYWdlKHByb2duYW1lKTsKICB9CgogIC8qIEFsbG93IGZvciBiaW5hcmllcyBjb21waWxlZCB1bmRlciBhIG5ldyBrZXJuZWwgdG8gd29yayBvbiB0aGUgb2xkIG9uZXMgKi8KICAvKiBUaGUgaXJxIGFyZ3VtZW50IHRvIGlvY3RsIGlzbid0IHRvdWNoZWQgYnkgdGhlIG9sZCBrZXJuZWxzLCBidXQgd2UgZG9uJ3QgKi8KICAvKiAgd2FudCB0byBjYXVzZSB0aGUga2VybmVsIHRvIGNvbXBsYWluIGlmIHdlIGFyZSB1c2luZyBhIG5ldyBrZXJuZWwgKi8KICBpZiAoTFBHRVRJUlEgPj0gMHgwNjAwICYmIGlvY3RsKGZkLCBMUEdFVElSUSwgJmlycSkgPCAwICYmIGVycm5vID09IEVJTlZBTCkKICAgIG9mZnNldCA9IDB4MDYwMDsJLyogV2UgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgbmV3IGlvY3RscyAqLwoKICBjbWRzID0gY21kc3Q7CiAgd2hpbGUgKGNtZHMtPm5leHQpIHsKI2lmZGVmIExQR0VUU1RBVFVTCiAgICBpZiAoY21kcy0+b3AgPT0gTFBHRVRTVEFUVVMpIHsKICAgICAgc3RhdHVzID0gMHhkZWFkYmVlZjsKICAgICAgcmV0dmFsID0gaW9jdGwoZmQsIExQR0VUU1RBVFVTIC0gb2Zmc2V0LCAmc3RhdHVzKTsKICAgICAgaWYgKHJldHZhbCA8IDApCiAgICAgIAlwZXJyb3IoIkxQR0VUU1RBVFVTIGVycm9yIik7CiAgICAgIGVsc2UgewogICAgICAgIGlmIChzdGF0dXMgPT0gMHhkZWFkYmVlZikJLyogYSBmZXcgMS4xLjd4IGtlcm5lbHMgd2lsbCBkbyB0aGlzICovCiAgICAgICAgICBzdGF0dXMgPSByZXR2YWw7CglwcmludGYoXygiJXMgc3RhdHVzIGlzICVkIiksIGZpbGVuYW1lLCBzdGF0dXMpOwoJaWYgKCEoc3RhdHVzICYgTFBfUEJVU1kpKSBwcmludGYoXygiLCBidXN5IikpOwoJaWYgKCEoc3RhdHVzICYgTFBfUEFDSykpIHByaW50ZihfKCIsIHJlYWR5IikpOwoJaWYgKChzdGF0dXMgJiBMUF9QT1VUUEEpKSBwcmludGYoXygiLCBvdXQgb2YgcGFwZXIiKSk7CglpZiAoKHN0YXR1cyAmIExQX1BTRUxFQ0QpKSBwcmludGYoXygiLCBvbi1saW5lIikpOwoJaWYgKCEoc3RhdHVzICYgTFBfUEVSUk9SUCkpIHByaW50ZihfKCIsIGVycm9yIikpOwoJcHJpbnRmKCJcbiIpOwogICAgICB9CiAgICB9IGVsc2UKI2VuZGlmIC8qIExQR0VUU1RBVFVTICovCiAgICBpZiAoaW9jdGwoZmQsIGNtZHMtPm9wIC0gb2Zmc2V0LCBjbWRzLT52YWwpIDwgMCkgewogICAgICBwZXJyb3IoInR1bmVscDogaW9jdGwiKTsKICAgIH0KICAgIGNtZHN0ID0gY21kczsKICAgIGNtZHMgPSBjbWRzLT5uZXh0OwogICAgZnJlZShjbWRzdCk7CiAgfQoKICBpZiAoc2hvd19pcnEpIHsKICAgIGlycSA9IDB4ZGVhZGJlZWY7CiAgICByZXR2YWwgPSBpb2N0bChmZCwgTFBHRVRJUlEgLSBvZmZzZXQsICZpcnEpOwogICAgaWYgKHJldHZhbCA9PSAtMSkgewogICAgICBwZXJyb3IoXygiTFBHRVRJUlEgZXJyb3IiKSk7CiAgICAgIGV4aXQoNCk7CiAgICB9CiAgICBpZiAoaXJxID09IDB4ZGVhZGJlZWYpCQkvKiB1cCB0byAxLjEuNzcgd2lsbCBkbyB0aGlzICovCiAgICAgIGlycSA9IHJldHZhbDsKICAgIGlmIChpcnEpCiAgICAgIHByaW50ZihfKCIlcyB1c2luZyBJUlEgJWRcbiIpLCBmaWxlbmFtZSwgaXJxKTsKICAgIGVsc2UKICAgICAgcHJpbnRmKF8oIiVzIHVzaW5nIHBvbGxpbmdcbiIpLCBmaWxlbmFtZSk7CiAgfQoKICBjbG9zZShmZCk7CgogIHJldHVybiAwOwp9Cg==