LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsbXBfZnJhbWUuYwogKiBWZXJzaW9uOiAgICAgICAwLjkKICogRGVzY3JpcHRpb246ICAgSXJMTVAgZnJhbWUgaW1wbGVtZW50YXRpb24KICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFR1ZSBBdWcgMTkgMDI6MDk6NTkgMTk5NwogKiBNb2RpZmllZCBhdDogICBNb24gRGVjIDEzIDEzOjQxOjEyIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CiAqICAgICAKICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAogKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcF9mcmFtZS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvZGlzY292ZXJ5Lmg+CgpzdGF0aWMgc3RydWN0IGxzYXBfY2IgKmlybG1wX2ZpbmRfbHNhcChzdHJ1Y3QgbGFwX2NiICpzZWxmLCBfX3U4IGRsc2FwLCAKCQkJCSAgICAgICBfX3U4IHNsc2FwLCBpbnQgc3RhdHVzLCBoYXNoYmluX3QgKik7CgppbmxpbmUgdm9pZCBpcmxtcF9zZW5kX2RhdGFfcGR1KHN0cnVjdCBsYXBfY2IgKnNlbGYsIF9fdTggZGxzYXAsIF9fdTggc2xzYXAsCgkJCQlpbnQgZXhwZWRpdGVkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7Cglza2ItPmRhdGFbMF0gPSBkbHNhcDsKCXNrYi0+ZGF0YVsxXSA9IHNsc2FwOwoKCWlmIChleHBlZGl0ZWQpIHsKCQlJUkRBX0RFQlVHKDQsICIlcygpLCBzZW5kaW5nIGV4cGVkaXRlZCBkYXRhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWlybGFwX2RhdGFfcmVxdWVzdChzZWxmLT5pcmxhcCwgc2tiLCBUUlVFKTsKCX0gZWxzZQoJCWlybGFwX2RhdGFfcmVxdWVzdChzZWxmLT5pcmxhcCwgc2tiLCBGQUxTRSk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX3NlbmRfbGNmX3BkdSAoZGxzYXAsIHNsc2FwLCBvcGNvZGUsc2tiKQogKgogKiAgICBTZW5kIExpbmsgQ29udHJvbCBGcmFtZSB0byBJckxBUAogKi8Kdm9pZCBpcmxtcF9zZW5kX2xjZl9wZHUoc3RydWN0IGxhcF9jYiAqc2VsZiwgX191OCBkbHNhcCwgX191OCBzbHNhcCwKCQkJX191OCBvcGNvZGUsIHN0cnVjdCBza19idWZmICpza2IpIAp7CglfX3U4ICpmcmFtZTsKCQoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CgkKCWZyYW1lID0gc2tiLT5kYXRhOwoJCglmcmFtZVswXSA9IGRsc2FwIHwgQ09OVFJPTF9CSVQ7CglmcmFtZVsxXSA9IHNsc2FwOwoKCWZyYW1lWzJdID0gb3Bjb2RlOwoKCWlmIChvcGNvZGUgPT0gRElTQ09OTkVDVCkKCQlmcmFtZVszXSA9IDB4MDE7IC8qIFNlcnZpY2UgdXNlciByZXF1ZXN0ICovCgllbHNlCgkJZnJhbWVbM10gPSAweDAwOyAvKiByc3ZkICovCgoJaXJsYXBfZGF0YV9yZXF1ZXN0KHNlbGYtPmlybGFwLCBza2IsIEZBTFNFKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsbXBfaW5wdXQgKHNrYikKICoKICogICAgVXNlZCBieSBJckxBUCB0byBwYXNzIHJlY2VpdmVkIGRhdGEgZnJhbWVzIHRvIElyTE1QIGxheWVyCiAqCiAqLwp2b2lkIGlybG1wX2xpbmtfZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsIAoJCQkJaW50IHVucmVsaWFibGUpCnsKCXN0cnVjdCBsc2FwX2NiICpsc2FwOwoJX191OCAgIHNsc2FwX3NlbDsgICAvKiBTb3VyY2UgKHRoaXMpIExTQVAgYWRkcmVzcyAqLwoJX191OCAgIGRsc2FwX3NlbDsgICAvKiBEZXN0aW5hdGlvbiBMU0FQIGFkZHJlc3MgKi8KCV9fdTggICAqZnA7CgkKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiLT5sZW4gPiAyLCByZXR1cm47KTsKCglmcCA9IHNrYi0+ZGF0YTsKCgkvKgoJICogIFRoZSBuZXh0IHN0YXRlbWVudHMgbWF5IGJlIGNvbmZ1c2luZywgYnV0IHdlIGRvIHRoaXMgc28gdGhhdCAKCSAqICBkZXN0aW5hdGlvbiBMU0FQIG9mIHJlY2VpdmVkIGZyYW1lIGlzIHNvdXJjZSBMU0FQIGluIG91ciB2aWV3CgkgKi8KCXNsc2FwX3NlbCA9IGZwWzBdICYgTFNBUF9NQVNLOyAKCWRsc2FwX3NlbCA9IGZwWzFdOwkKCgkvKgoJICogIENoZWNrIGlmIHRoaXMgaXMgYW4gaW5jb21pbmcgY29ubmVjdGlvbiwgc2luY2Ugd2UgbXVzdCBkZWFsIHdpdGgKCSAqICBpdCBpbiBhIGRpZmZlcmVudCB3YXkgdGhhbiBvdGhlciBlc3RhYmxpc2hlZCBjb25uZWN0aW9ucy4KCSAqLwoJaWYgKChmcFswXSAmIENPTlRST0xfQklUKSAmJiAoZnBbMl0gPT0gQ09OTkVDVF9DTUQpKSB7CgkJSVJEQV9ERUJVRygzLCAiJXMoKSwgaW5jb21pbmcgY29ubmVjdGlvbiwgIgoJCQkgICAic291cmNlIExTQVA9JWQsIGRlc3QgTFNBUD0lZFxuIiwKCQkJICAgX19GVU5DVElPTl9fLCBzbHNhcF9zZWwsIGRsc2FwX3NlbCk7CgkJCgkJLyogVHJ5IHRvIGZpbmQgTFNBUCBhbW9uZyB0aGUgdW5jb25uZWN0ZWQgTFNBUHMgKi8KCQlsc2FwID0gaXJsbXBfZmluZF9sc2FwKHNlbGYsIGRsc2FwX3NlbCwgc2xzYXBfc2VsLCBDT05ORUNUX0NNRCwKCQkJCSAgICAgICBpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMpOwoJCQoJCS8qIE1heWJlIExTQVAgd2FzIGFscmVhZHkgY29ubmVjdGVkLCBzbyB0cnkgb25lIG1vcmUgdGltZSAqLwoJCWlmICghbHNhcCkgewoJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBpbmNvbWluZyBjb25uZWN0aW9uIGZvciBMU0FQIGFscmVhZHkgY29ubmVjdGVkXG4iLCBfX0ZVTkNUSU9OX18pOwoJCQlsc2FwID0gaXJsbXBfZmluZF9sc2FwKHNlbGYsIGRsc2FwX3NlbCwgc2xzYXBfc2VsLCAwLAoJCQkJCSAgICAgICBzZWxmLT5sc2Fwcyk7CgkJfQoJfSBlbHNlCgkJbHNhcCA9IGlybG1wX2ZpbmRfbHNhcChzZWxmLCBkbHNhcF9zZWwsIHNsc2FwX3NlbCwgMCwgCgkJCQkgICAgICAgc2VsZi0+bHNhcHMpOwoJCglpZiAobHNhcCA9PSBOVUxMKSB7CgkJSVJEQV9ERUJVRygyLCAiSXJMTVAsIFNvcnJ5LCBubyBMU0FQIGZvciByZWNlaXZlZCBmcmFtZSFcbiIpOwoJCUlSREFfREVCVUcoMiwgIiVzKCksIHNsc2FwX3NlbCA9ICUwMngsIGRsc2FwX3NlbCA9ICUwMnhcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXywgc2xzYXBfc2VsLCBkbHNhcF9zZWwpOwoJCWlmIChmcFswXSAmIENPTlRST0xfQklUKSB7CgkJCUlSREFfREVCVUcoMiwgIiVzKCksIHJlY2VpdmVkIGNvbnRyb2wgZnJhbWUgJTAyeFxuIiwKCQkJCSAgIF9fRlVOQ1RJT05fXywgZnBbMl0pOwoJCX0gZWxzZSB7CgkJCUlSREFfREVCVUcoMiwgIiVzKCksIHJlY2VpdmVkIGRhdGEgZnJhbWVcbiIsIF9fRlVOQ1RJT05fXyk7CgkJfQoJCXJldHVybjsKCX0KCgkvKiAKCSAqICBDaGVjayBpZiB3ZSByZWNlaXZlZCBhIGNvbnRyb2wgZnJhbWU/IAoJICovCglpZiAoZnBbMF0gJiBDT05UUk9MX0JJVCkgewoJCXN3aXRjaCAoZnBbMl0pIHsKCQljYXNlIENPTk5FQ1RfQ01EOgoJCQlsc2FwLT5sYXAgPSBzZWxmOwoJCQlpcmxtcF9kb19sc2FwX2V2ZW50KGxzYXAsIExNX0NPTk5FQ1RfSU5ESUNBVElPTiwgc2tiKTsKCQkJYnJlYWs7CgkJY2FzZSBDT05ORUNUX0NORjoKCQkJaXJsbXBfZG9fbHNhcF9ldmVudChsc2FwLCBMTV9DT05ORUNUX0NPTkZJUk0sIHNrYik7CgkJCWJyZWFrOwoJCWNhc2UgRElTQ09OTkVDVDoKCQkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgRGlzY29ubmVjdCBpbmRpY2F0aW9uIVxuIiwKCQkJCSAgIF9fRlVOQ1RJT05fXyk7CgkJCWlybG1wX2RvX2xzYXBfZXZlbnQobHNhcCwgTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OLCAKCQkJCQkgICAgc2tiKTsKCQkJYnJlYWs7CgkJY2FzZSBBQ0NFU1NNT0RFX0NNRDoKCQkJSVJEQV9ERUJVRygwLCAiQWNjZXNzIG1vZGUgY21kIG5vdCBpbXBsZW1lbnRlZCFcbiIpOwoJCQlicmVhazsKCQljYXNlIEFDQ0VTU01PREVfQ05GOgoJCQlJUkRBX0RFQlVHKDAsICJBY2Nlc3MgbW9kZSBjbmYgbm90IGltcGxlbWVudGVkIVxuIik7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gY29udHJvbCBmcmFtZSAlMDJ4XG4iLAoJCQkJICAgX19GVU5DVElPTl9fLCBmcFsyXSk7CgkJCWJyZWFrOwoJCX0KCX0gZWxzZSBpZiAodW5yZWxpYWJsZSkgewoJCS8qIE9wdGltaXplIGFuZCBieXBhc3MgdGhlIHN0YXRlIG1hY2hpbmUgaWYgcG9zc2libGUgKi8KCQlpZiAobHNhcC0+bHNhcF9zdGF0ZSA9PSBMU0FQX0RBVEFfVFJBTlNGRVJfUkVBRFkpCgkJCWlybG1wX3VkYXRhX2luZGljYXRpb24obHNhcCwgc2tiKTsKCQllbHNlCgkJCWlybG1wX2RvX2xzYXBfZXZlbnQobHNhcCwgTE1fVURBVEFfSU5ESUNBVElPTiwgc2tiKTsKCX0gZWxzZSB7CQoJCS8qIE9wdGltaXplIGFuZCBieXBhc3MgdGhlIHN0YXRlIG1hY2hpbmUgaWYgcG9zc2libGUgKi8KCQlpZiAobHNhcC0+bHNhcF9zdGF0ZSA9PSBMU0FQX0RBVEFfVFJBTlNGRVJfUkVBRFkpCgkJCWlybG1wX2RhdGFfaW5kaWNhdGlvbihsc2FwLCBza2IpOwoJCWVsc2UKCQkJaXJsbXBfZG9fbHNhcF9ldmVudChsc2FwLCBMTV9EQVRBX0lORElDQVRJT04sIHNrYik7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfdW5pdGRhdGFfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQogKgogKiAgICAKICoKICovCiNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQp2b2lkIGlybG1wX2xpbmtfdW5pdGRhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKCV9fdTggICBzbHNhcF9zZWw7ICAgLyogU291cmNlICh0aGlzKSBMU0FQIGFkZHJlc3MgKi8KCV9fdTggICBkbHNhcF9zZWw7ICAgLyogRGVzdGluYXRpb24gTFNBUCBhZGRyZXNzICovCglfX3U4ICAgcGlkOyAgICAgICAgIC8qIFByb3RvY29sIGlkZW50aWZpZXIgKi8KCV9fdTggICAqZnA7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNrYi0+bGVuID4gMiwgcmV0dXJuOyk7CgoJZnAgPSBza2ItPmRhdGE7CgoJLyoKCSAqICBUaGUgbmV4dCBzdGF0ZW1lbnRzIG1heSBiZSBjb25mdXNpbmcsIGJ1dCB3ZSBkbyB0aGlzIHNvIHRoYXQgCgkgKiAgZGVzdGluYXRpb24gTFNBUCBvZiByZWNlaXZlZCBmcmFtZSBpcyBzb3VyY2UgTFNBUCBpbiBvdXIgdmlldwoJICovCglzbHNhcF9zZWwgPSBmcFswXSAmIExTQVBfTUFTSzsgCglkbHNhcF9zZWwgPSBmcFsxXTsKCXBpZCAgICAgICA9IGZwWzJdOwoJCglpZiAocGlkICYgMHg4MCkgewoJCUlSREFfREVCVUcoMCwgIiVzKCksIGV4dGVuc2lvbiBpbiBQSUQgbm90IHN1cHAhXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCgkvKiBDaGVjayBpZiBmcmFtZSBpcyBhZGRyZXNzZWQgdG8gdGhlIGNvbm5lY3Rpb25sZXNzIExTQVAgKi8KCWlmICgoc2xzYXBfc2VsICE9IExTQVBfQ09OTkxFU1MpIHx8IChkbHNhcF9zZWwgIT0gTFNBUF9DT05OTEVTUykpIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBkcm9wcGluZyBmcmFtZSFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoJCgkvKiBTZWFyY2ggdGhlIGNvbm5lY3Rpb25sZXNzIExTQVAgKi8KCXNwaW5fbG9ja19pcnFzYXZlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7Cglsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcyk7Cgl3aGlsZSAobHNhcCAhPSBOVUxMKSB7CgkJLyoKCQkgKiAgQ2hlY2sgaWYgc291cmNlIExTQVAgYW5kIGRlc3QgTFNBUCBzZWxlY3RvcnMgYW5kIFBJRCBtYXRjaC4KCQkgKi8KCQlpZiAoKGxzYXAtPnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpICYmIAoJCSAgICAobHNhcC0+ZGxzYXBfc2VsID09IGRsc2FwX3NlbCkgJiYgCgkJICAgIChsc2FwLT5waWQgPT0gcGlkKSkgCgkJewkJCQoJCQlicmVhazsKCQl9CgkJbHNhcCA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9uZXh0KGlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcyk7Cgl9CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgoJaWYgKGxzYXApCgkJaXJsbXBfY29ubmxlc3NfZGF0YV9pbmRpY2F0aW9uKGxzYXAsIHNrYik7CgllbHNlIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBmb3VuZCBubyBtYXRjaGluZyBMU0FQIVxuIiwgX19GVU5DVElPTl9fKTsKCX0KfQojZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfZGlzY29ubmVjdF9pbmRpY2F0aW9uIChyZWFzb24sIHVzZXJkYXRhKQogKgogKiAgICBJckxBUCBoYXMgZGlzY29ubmVjdGVkIAogKgogKi8Kdm9pZCBpcmxtcF9saW5rX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwX2NiICpsYXAsIAoJCQkJICAgICAgc3RydWN0IGlybGFwX2NiICppcmxhcCwgCgkJCQkgICAgICBMQVBfUkVBU09OIHJlYXNvbiwgCgkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKGxhcCAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKGxhcC0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CgoJbGFwLT5yZWFzb24gPSByZWFzb247CglsYXAtPmRhZGRyID0gREVWX0FERFJfQU5ZOwoKICAgICAgICAvKiBGSVhNRTogbXVzdCBkbyBzb21ldGhpbmcgd2l0aCB0aGUgc2tiIGlmIGFueSAqLwoJCgkvKgoJICogIEluZm9ybSBzdGF0aW9uIHN0YXRlIG1hY2hpbmUKCSAqLwoJaXJsbXBfZG9fbGFwX2V2ZW50KGxhcCwgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfY29ubmVjdF9pbmRpY2F0aW9uIChxb3MpCiAqCiAqICAgIEluY29taW5nIExBUCBjb25uZWN0aW9uIQogKgogKi8Kdm9pZCBpcmxtcF9saW5rX2Nvbm5lY3RfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwX2NiICpzZWxmLCBfX3UzMiBzYWRkciwgCgkJCQkgICBfX3UzMiBkYWRkciwgc3RydWN0IHFvc19pbmZvICpxb3MsCgkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCgkvKiBDb3B5IFFvUyBzZXR0aW5ncyBmb3IgdGhpcyBzZXNzaW9uICovCglzZWxmLT5xb3MgPSBxb3M7CgoJLyogVXBkYXRlIGRlc3RpbmF0aW9uIGRldmljZSBhZGRyZXNzICovCglzZWxmLT5kYWRkciA9IGRhZGRyOwoJSVJEQV9BU1NFUlQoc2VsZi0+c2FkZHIgPT0gc2FkZHIsIHJldHVybjspOwoKCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLCBMTV9MQVBfQ09OTkVDVF9JTkRJQ0FUSU9OLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxtcF9saW5rX2Nvbm5lY3RfY29uZmlybSAocW9zKQogKgogKiAgICBMQVAgY29ubmVjdGlvbiBjb25maXJtZWQhCiAqCiAqLwp2b2lkIGlybG1wX2xpbmtfY29ubmVjdF9jb25maXJtKHN0cnVjdCBsYXBfY2IgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCAKCQkJCXN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQocW9zICE9IE5VTEwsIHJldHVybjspOwoKCS8qIERvbid0IG5lZWQgdXNlIHRoZSBza2IgZm9yIG5vdyAqLwoKCS8qIENvcHkgUW9TIHNldHRpbmdzIGZvciB0aGlzIHNlc3Npb24gKi8KCXNlbGYtPnFvcyA9IHFvczsKCglpcmxtcF9kb19sYXBfZXZlbnQoc2VsZiwgTE1fTEFQX0NPTk5FQ1RfQ09ORklSTSwgTlVMTCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfZGlzY292ZXJ5X2luZGljYXRpb24gKHNlbGYsIGxvZykKICoKICogICAgRGV2aWNlIGlzIGRpc2NvdmVyaW5nIHVzCiAqCiAqIEl0J3Mgbm90IGFuIGFuc3dlciB0byBvdXIgb3duIGRpc2NvdmVyaWVzLCBqdXN0IGFub3RoZXIgZGV2aWNlIHRyeWluZwogKiB0byBwZXJmb3JtIGRpc2NvdmVyeSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gbWlzcyB0aGUgb3Bwb3J0dW5pdHkKICogdG8gZXhwbG9pdCB0aGlzIGluZm9ybWF0aW9uLCBiZWNhdXNlIDoKICoJbyBXZSBtYXkgbm90IGFjdGl2ZWx5IHBlcmZvcm0gZGlzY292ZXJ5IChqdXN0IHBhc3NpdmUgZGlzY292ZXJ5KQogKglvIFRoaXMgdHlwZSBvZiBkaXNjb3ZlcnkgaXMgbXVjaCBtb3JlIHJlbGlhYmxlLiBJbiBzb21lIGNhc2VzLCBpdAogKgkgIHNlZW0gdGhhdCBsZXNzIHRoYW4gNTAlIG9mIG91ciBkaXNjb3ZlcmllcyBnZXQgYW4gYW5zd2VyLCB3aGlsZQogKgkgIHdlIGFsd2F5cyBnZXQgfjEwMCUgb2YgdGhlc2UuCiAqCW8gTWFrZSBmYXN0ZXIgZGlzY292ZXJ5LCBzdGF0aXN0aWNhbGx5IGRpdmlkZSB0aW1lIG9mIGRpc2NvdmVyeQogKgkgIGV2ZW50cyBieSAyIChpbXBvcnRhbnQgZm9yIHRoZSBsYXRlbmN5IGFzcGVjdCBhbmQgdXNlciBmZWVsKQogKglvIEV2ZW4gaXMgd2UgZG8gYWN0aXZlIGRpc2NvdmVyeSwgdGhlIG90aGVyIG5vZGUgbWlnaHQgbm90CiAqCSAgYW5zd2VyIG91ciBkaXNjb3ZlcmllcyAoZXg6IFBhbG0pLiBUaGUgUGFsbSB3aWxsIGp1c3QgcGVyZm9ybQogKgkgIG9uZSBhY3RpdmUgZGlzY292ZXJ5IGFuZCBjb25uZWN0IGRpcmVjdGx5IHRvIHVzLgogKgogKiBIb3dldmVyLCB3aGVuIGJvdGggZGV2aWNlcyBkaXNjb3ZlciBlYWNoIG90aGVyLCB0aGV5IG1pZ2h0IGF0dGVtcHQgdG8KICogY29ubmVjdCB0byBlYWNoIG90aGVyIGZvbGxvd2luZyB0aGUgZGlzY292ZXJ5IGV2ZW50LCBhbmQgaXQgd291bGQgY3JlYXRlCiAqIGNvbGxpc2lvbnMgb24gdGhlIG1lZGl1bSAoU05STSBiYXR0bGUpLgogKiBUaGUgImZpeCIgZm9yIHRoYXQgaXMgdG8gZGlzYWJsZSBhbGwgY29ubmVjdGlvbiByZXF1ZXN0cyBpbiBJckxBUAogKiBmb3IgMTAwbXMgYWZ0ZXIgYSBkaXNjb3ZlcnkgaW5kaWNhdGlvbiBieSBzZXR0aW5nIHRoZSBtZWRpYV9idXN5IGZsYWcuCiAqIFByZXZpb3VzbHksIHdlIHVzZWQgdG8gcG9zdHBvbmUgdGhlIGV2ZW50IHdoaWNoIHdhcyBxdWl0ZSB1Z2x5LiBOb3cKICogdGhhdCBJckxBUCB0YWtlcyBjYXJlIG9mIHRoaXMgcHJvYmxlbSwganVzdCBwYXNzIHRoZSBldmVudCB1cC4uLgogKgogKiBKZWFuIElJCiAqLwp2b2lkIGlybG1wX2xpbmtfZGlzY292ZXJ5X2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqc2VsZiwgCgkJCQkgICAgIGRpc2NvdmVyeV90ICpkaXNjb3ZlcnkpCnsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKCgkvKiBBZGQgdG8gbWFpbiBsb2csIGNsZWFudXAgKi8KCWlybG1wX2FkZF9kaXNjb3ZlcnkoaXJsbXAtPmNhY2hlbG9nLCBkaXNjb3ZlcnkpOwoJCgkvKiBKdXN0IGhhbmRsZSBpdCB0aGUgc2FtZSB3YXkgYXMgYSBkaXNjb3ZlcnkgY29uZmlybSwKCSAqIGJ5cGFzcyB0aGUgTE1fTEFQIHN0YXRlIG1hY2hpbmUgKHNlZSBiZWxvdykgKi8KCWlybG1wX2Rpc2NvdmVyeV9jb25maXJtKGlybG1wLT5jYWNoZWxvZywgRElTQ09WRVJZX1BBU1NJVkUpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxtcF9saW5rX2Rpc2NvdmVyeV9jb25maXJtIChzZWxmLCBsb2cpCiAqCiAqICAgIENhbGxlZCBieSBJckxBUCB3aXRoIGEgbGlzdCBvZiBkaXNjb3ZlcmllcyBhZnRlciB0aGUgZGlzY292ZXJ5CiAqICAgIHJlcXVlc3QgaGFzIGJlZW4gY2FycmllZCBvdXQuIEEgTlVMTCBsb2cgaXMgcmVjZWl2ZWQgaWYgSXJMQVAKICogICAgd2FzIHVuYWJsZSB0byBjYXJyeSBvdXQgdGhlIGRpc2NvdmVyeSByZXF1ZXN0CiAqCiAqLwp2b2lkIGlybG1wX2xpbmtfZGlzY292ZXJ5X2NvbmZpcm0oc3RydWN0IGxhcF9jYiAqc2VsZiwgaGFzaGJpbl90ICpsb2cpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOwoJCgkvKiBBZGQgdG8gbWFpbiBsb2csIGNsZWFudXAgKi8KCWlybG1wX2FkZF9kaXNjb3ZlcnlfbG9nKGlybG1wLT5jYWNoZWxvZywgbG9nKTsKCgkvKiBQcm9wYWdhdGUgZXZlbnQgdG8gdmFyaW91cyBMU0FQcyByZWdpc3RlcmVkIGZvciBpdC4KCSAqIFdlIGJ5cGFzcyB0aGUgTE1fTEFQIHN0YXRlIG1hY2hpbmUgYmVjYXVzZQoJICoJMSkgV2UgZG8gaXQgcmVnYXJkbGVzcyBvZiB0aGUgTE1fTEFQIHN0YXRlCgkgKgkyKSBJdCBkb2Vzbid0IGFmZmVjdCB0aGUgTE1fTEFQIHN0YXRlCgkgKgkzKSBGYXN0ZXIsIHNsaW1lciwgc2ltcGxlciwgLi4uCgkgKiBKZWFuIElJICovCglpcmxtcF9kaXNjb3ZlcnlfY29uZmlybShpcmxtcC0+Y2FjaGVsb2csIERJU0NPVkVSWV9BQ1RJVkUpOwp9CgojaWZkZWYgQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQCnN0YXRpYyBpbmxpbmUgdm9pZCBpcmxtcF91cGRhdGVfY2FjaGUoc3RydWN0IGxhcF9jYiAqbGFwLAoJCQkJICAgICAgc3RydWN0IGxzYXBfY2IgKmxzYXApCnsKCS8qIFByZXZlbnQgY29uY3VycmVudCByZWFkIHRvIGdldCBnYXJiYWdlICovCglsYXAtPmNhY2hlLnZhbGlkID0gRkFMU0U7CgkvKiBVcGRhdGUgY2FjaGUgZW50cnkgKi8KCWxhcC0+Y2FjaGUuZGxzYXBfc2VsID0gbHNhcC0+ZGxzYXBfc2VsOwoJbGFwLT5jYWNoZS5zbHNhcF9zZWwgPSBsc2FwLT5zbHNhcF9zZWw7CglsYXAtPmNhY2hlLmxzYXAgPSBsc2FwOwoJbGFwLT5jYWNoZS52YWxpZCA9IFRSVUU7Cn0KI2VuZGlmCgovKgogKiBGdW5jdGlvbiBpcmxtcF9maW5kX2hhbmRsZSAoc2VsZiwgZGxzYXBfc2VsLCBzbHNhcF9zZWwsIHN0YXR1cywgcXVldWUpCiAqCiAqICAgIEZpbmQgaGFuZGxlIGFzc29jaWF0ZWQgd2l0aCBkZXN0aW5hdGlvbiBhbmQgc291cmNlIExTQVAKICoKICogQW55IElyREEgY29ubmVjdGlvbiAoTFNBUC9UU0FQKSBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5CiAqIDMgcGFyYW1ldGVycywgdGhlIGxvY2FsIGxzYXAsIHRoZSByZW1vdGUgbHNhcCBhbmQgdGhlIHJlbW90ZSBhZGRyZXNzLiAKICogV2UgbWF5IGluaXRpYXRlIG11bHRpcGxlIGNvbm5lY3Rpb25zIHRvIHRoZSBzYW1lIHJlbW90ZSBzZXJ2aWNlCiAqICh0aGV5IHdpbGwgaGF2ZSBkaWZmZXJlbnQgbG9jYWwgbHNhcCksIGEgcmVtb3RlIGRldmljZSBtYXkgaW5pdGlhdGUKICogbXVsdGlwbGUgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgbG9jYWwgc2VydmljZSAodGhleSB3aWxsIGhhdmUKICogZGlmZmVyZW50IHJlbW90ZSBsc2FwKSwgb3IgbXVsdGlwbGUgZGV2aWNlcyBtYXkgY29ubmVjdCB0byB0aGUgc2FtZQogKiBzZXJ2aWNlIGFuZCBtYXkgdXNlIHRoZSBzYW1lIHJlbW90ZSBsc2FwIChhbmQgdGhleSB3aWxsIGhhdmUKICogZGlmZmVyZW50IHJlbW90ZSBhZGRyZXNzKS4KICogU28sIHdoZXJlIGlzIHRoZSByZW1vdGUgYWRkcmVzcyA/IEVhY2ggTEFQIGNvbm5lY3Rpb24gaXMgbWFkZSB3aXRoCiAqIGEgc2luZ2xlIHJlbW90ZSBkZXZpY2UsIHNvIGltcGx5IGEgc3BlY2lmaWMgcmVtb3RlIGFkZHJlc3MuCiAqIEplYW4gSUkKICovCnN0YXRpYyBzdHJ1Y3QgbHNhcF9jYiAqaXJsbXBfZmluZF9sc2FwKHN0cnVjdCBsYXBfY2IgKnNlbGYsIF9fdTggZGxzYXBfc2VsLAoJCQkJICAgICAgIF9fdTggc2xzYXBfc2VsLCBpbnQgc3RhdHVzLAoJCQkJICAgICAgIGhhc2hiaW5fdCAqcXVldWUpIAp7CglzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgkKCS8qIAoJICogIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UuIFdlIGFzc3VtZSB0aGF0IHRoZSBsYXN0IGZyYW1lCgkgKiAgcmVjZWl2ZWQgaXMgaW4gdGhlIHNhbWUgY29ubmVjdGlvbiBhcyB0aGUgbGFzdCBvbmUsIHNvIGNoZWNrIGluCgkgKiAgY2FjaGUgZmlyc3QgdG8gYXZvaWQgdGhlIGxpbmVhciBzZWFyY2gKCSAqLwojaWZkZWYgQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQCglpZiAoKHNlbGYtPmNhY2hlLnZhbGlkKSAmJiAKCSAgICAoc2VsZi0+Y2FjaGUuc2xzYXBfc2VsID09IHNsc2FwX3NlbCkgJiYgCgkgICAgKHNlbGYtPmNhY2hlLmRsc2FwX3NlbCA9PSBkbHNhcF9zZWwpKSAKCXsKCQlyZXR1cm4gKHNlbGYtPmNhY2hlLmxzYXApOwoJfQojZW5kaWYKCglzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgoJbHNhcCA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChxdWV1ZSk7Cgl3aGlsZSAobHNhcCAhPSBOVUxMKSB7CgkJLyogCgkJICogIElmIHRoaXMgaXMgYW4gaW5jb21pbmcgY29ubmVjdGlvbiwgdGhlbiB0aGUgZGVzdGluYXRpb24gCgkJICogIExTQVAgc2VsZWN0b3IgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQgYXMgTE1fQU5ZIHNvIHRoYXQgCgkJICogIGFueSBjbGllbnQgY2FuIGNvbm5lY3QuIEluIHRoYXQgY2FzZSB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sKCQkgKiAgaWYgdGhlIHNvdXJjZSBMU0FQIChpbiBvdXIgdmlldyEpIG1hdGNoIQoJCSAqLwoJCWlmICgoc3RhdHVzID09IENPTk5FQ1RfQ01EKSAmJiAKCQkgICAgKGxzYXAtPnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpICYmICAgICAgCgkJICAgIChsc2FwLT5kbHNhcF9zZWwgPT0gTFNBUF9BTlkpKSB7CgkJCS8qIFRoaXMgaXMgd2hlcmUgdGhlIGRlc3QgbHNhcCBzZWwgaXMgc2V0IG9uIGluY29taW5nCgkJCSAqIGxzYXBzICovCgkJCWxzYXAtPmRsc2FwX3NlbCA9IGRsc2FwX3NlbDsKCQkJYnJlYWs7CgkJfQoJCS8qCgkJICogIENoZWNrIGlmIHNvdXJjZSBMU0FQIGFuZCBkZXN0IExTQVAgc2VsZWN0b3JzIG1hdGNoLgoJCSAqLwoJCWlmICgobHNhcC0+c2xzYXBfc2VsID09IHNsc2FwX3NlbCkgJiYgCgkJICAgIChsc2FwLT5kbHNhcF9zZWwgPT0gZGxzYXBfc2VsKSkgCgkJCWJyZWFrOwoKCQlsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X25leHQocXVldWUpOwoJfQojaWZkZWYgQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQCglpZihsc2FwKQoJCWlybG1wX3VwZGF0ZV9jYWNoZShzZWxmLCBsc2FwKTsKI2VuZGlmCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCgkvKiBSZXR1cm4gd2hhdCB3ZSd2ZSBmb3VuZCBvciBOVUxMICovCglyZXR1cm4gbHNhcDsKfQo=