ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tYml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1YjczMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCkBAIC0wLDAgKzEsNTczIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBpMmMtYWxnby1iaXQuYyBpMmMgZHJpdmVyIGFsZ29yaXRobXMgZm9yIGJpdC1zaGlmdCBhZGFwdGVycwkJICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBTaW1vbiBHLiBWb2dsCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogV2l0aCBzb21lIGNoYW5nZXMgZnJvbSBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LCBLefZzdGkgTeRsa2tpCisgICA8a21hbGtraUBjYy5odXQuZmk+IGFuZCBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisKKworLyogLS0tLS0gZ2xvYmFsIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgREVCKHgpIGlmIChpMmNfZGVidWc+PTEpIHg7CisjZGVmaW5lIERFQjIoeCkgaWYgKGkyY19kZWJ1Zz49MikgeDsKKyNkZWZpbmUgREVCU1RBVCh4KSBpZiAoaTJjX2RlYnVnPj0zKSB4OyAvKiBwcmludCBzZXZlcmFsIHN0YXRpc3RpY2FsIHZhbHVlcyovCisjZGVmaW5lIERFQlBST1RPKHgpIGlmIChpMmNfZGVidWc+PTkpIHsgeDsgfQorIAkvKiBkZWJ1ZyB0aGUgcHJvdG9jb2wgYnkgc2hvd2luZyB0cmFuc2ZlcnJlZCBiaXRzICovCisKKworLyogLS0tLS0gZ2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKworLyogbW9kdWxlIHBhcmFtZXRlcnM6CisgKi8KK3N0YXRpYyBpbnQgaTJjX2RlYnVnOworc3RhdGljIGludCBiaXRfdGVzdDsJLyogc2VlIGlmIHRoZSBsaW5lLXNldHRpbmcgZnVuY3Rpb25zIHdvcmsJKi8KKworLyogLS0tIHNldHRpbmcgc3RhdGVzIG9uIHRoZSBidXMgd2l0aCB0aGUgcmlnaHQgdGltaW5nOiAtLS0tLS0tLS0tLS0tLS0JKi8KKworI2RlZmluZSBzZXRzZGEoYWRhcCx2YWwpIGFkYXAtPnNldHNkYShhZGFwLT5kYXRhLCB2YWwpCisjZGVmaW5lIHNldHNjbChhZGFwLHZhbCkgYWRhcC0+c2V0c2NsKGFkYXAtPmRhdGEsIHZhbCkKKyNkZWZpbmUgZ2V0c2RhKGFkYXApIGFkYXAtPmdldHNkYShhZGFwLT5kYXRhKQorI2RlZmluZSBnZXRzY2woYWRhcCkgYWRhcC0+Z2V0c2NsKGFkYXAtPmRhdGEpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZGFsbyhzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXApCit7CisJc2V0c2RhKGFkYXAsMCk7CisJdWRlbGF5KGFkYXAtPnVkZWxheSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZGFoaShzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXApCit7CisJc2V0c2RhKGFkYXAsMSk7CisJdWRlbGF5KGFkYXAtPnVkZWxheSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2xsbyhzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXApCit7CisJc2V0c2NsKGFkYXAsMCk7CisJdWRlbGF5KGFkYXAtPnVkZWxheSk7Cit9CisKKy8qCisgKiBSYWlzZSBzY2wgbGluZSwgYW5kIGRvIGNoZWNraW5nIGZvciBkZWxheXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBzbG93ZXIKKyAqIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNjbGhpKHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCisJc2V0c2NsKGFkYXAsMSk7CisKKwkvKiBOb3QgYWxsIGFkYXB0ZXJzIGhhdmUgc2NsIHNlbnNlIGxpbmUuLi4gKi8KKwlpZiAoYWRhcC0+Z2V0c2NsID09IE5VTEwgKSB7CisJCXVkZWxheShhZGFwLT51ZGVsYXkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzdGFydD1qaWZmaWVzOworCXdoaWxlICghIGdldHNjbChhZGFwKSApIHsJCisgCQkvKiB0aGUgaHcga25vd3MgaG93IHRvIHJlYWQgdGhlIGNsb2NrIGxpbmUsCisgCQkgKiBzbyB3ZSB3YWl0IHVudGlsIGl0IGFjdHVhbGx5IGdldHMgaGlnaC4KKyAJCSAqIFRoaXMgaXMgc2FmZXIgYXMgc29tZSBjaGlwcyBtYXkgaG9sZCBpdCBsb3cKKyAJCSAqIHdoaWxlIHRoZXkgYXJlIHByb2Nlc3NpbmcgZGF0YSBpbnRlcm5hbGx5LiAKKyAJCSAqLworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBzdGFydCthZGFwLT50aW1lb3V0KSkgeworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCURFQlNUQVQocHJpbnRrKEtFUk5fREVCVUcgIm5lZWRlZCAlbGQgamlmZmllc1xuIiwgamlmZmllcy1zdGFydCkpOworCXVkZWxheShhZGFwLT51ZGVsYXkpOworCXJldHVybiAwOworfSAKKworCisvKiAtLS0gb3RoZXIgYXV4aWxpYXJ5IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworc3RhdGljIHZvaWQgaTJjX3N0YXJ0KHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCkgCit7CisJLyogYXNzZXJ0OiBzY2wsIHNkYSBhcmUgaGlnaCAqLworCURFQlBST1RPKHByaW50aygiUyAiKSk7CisJc2RhbG8oYWRhcCk7CisJc2NsbG8oYWRhcCk7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19yZXBzdGFydChzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXApIAoreworCS8qIHNjbCwgc2RhIG1heSBub3QgYmUgaGlnaCAqLworCURFQlBST1RPKHByaW50aygiIFNyICIpKTsKKwlzZXRzZGEoYWRhcCwxKTsKKwlzY2xoaShhZGFwKTsKKwl1ZGVsYXkoYWRhcC0+dWRlbGF5KTsKKwkKKwlzZGFsbyhhZGFwKTsKKwlzY2xsbyhhZGFwKTsKK30KKworCitzdGF0aWMgdm9pZCBpMmNfc3RvcChzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXApIAoreworCURFQlBST1RPKHByaW50aygiUFxuIikpOworCS8qIGFzc2VydDogc2NsIGlzIGxvdyAqLworCXNkYWxvKGFkYXApOworCXNjbGhpKGFkYXApOyAKKwlzZGFoaShhZGFwKTsKK30KKworCisKKy8qIHNlbmQgYSBieXRlIHdpdGhvdXQgc3RhcnQgY29uZC4sIGxvb2sgZm9yIGFyYml0cmF0aW9uLCAKKyAgIGNoZWNrIGFja24uIGZyb20gc2xhdmUgKi8KKy8qIHJldHVybnM6CisgKiAxIGlmIHRoZSBkZXZpY2UgYWNrbm93bGVkZ2VkCisgKiAwIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBhY2sKKyAqIC1FVElNRURPVVQgaWYgYW4gZXJyb3Igb2NjdXJyZWQgKHdoaWxlIHJhaXNpbmcgdGhlIHNjbCBsaW5lKQorICovCitzdGF0aWMgaW50IGkyY19vdXRiKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIGNoYXIgYykKK3sKKwlpbnQgaTsKKwlpbnQgc2I7CisJaW50IGFjazsKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOworCisJLyogYXNzZXJ0OiBzY2wgaXMgbG93ICovCisJZm9yICggaT03IDsgaT49MCA7IGktLSApIHsKKwkJc2IgPSBjICYgKCAxIDw8IGkgKTsKKwkJc2V0c2RhKGFkYXAsc2IpOworCQl1ZGVsYXkoYWRhcC0+dWRlbGF5KTsKKwkJREVCUFJPVE8ocHJpbnRrKEtFUk5fREVCVUcgIiVkIixzYiE9MCkpOworCQlpZiAoc2NsaGkoYWRhcCk8MCkgeyAvKiB0aW1lZCBvdXQgKi8KKwkJCXNkYWhpKGFkYXApOyAvKiB3ZSBkb24ndCB3YW50IHRvIGJsb2NrIHRoZSBuZXQgKi8KKwkJCURFQjIocHJpbnRrKEtFUk5fREVCVUcgIiBpMmNfb3V0YjogMHglMDJ4LCB0aW1lb3V0IGF0IGJpdCAjJWRcbiIsIGMmMHhmZiwgaSkpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX07CisJCS8qIGRvIGFyYml0cmF0aW9uIGhlcmU6IAorCQkgKiBpZiAoIHNiICYmICEgZ2V0c2RhKGFkYXApICkgLT4gb3VjaCEgR2V0IG91dCBvZiBoZXJlLgorCQkgKi8KKwkJc2V0c2NsKGFkYXAsIDAgKTsKKwkJdWRlbGF5KGFkYXAtPnVkZWxheSk7CisJfQorCXNkYWhpKGFkYXApOworCWlmIChzY2xoaShhZGFwKTwwKXsgLyogdGltZW91dCAqLworCSAgICBERUIyKHByaW50ayhLRVJOX0RFQlVHICIgaTJjX291dGI6IDB4JTAyeCwgdGltZW91dCBhdCBhY2tcbiIsIGMmMHhmZikpOworCSAgICByZXR1cm4gLUVUSU1FRE9VVDsKKwl9OworCS8qIHJlYWQgYWNrOiBTREEgc2hvdWxkIGJlIHB1bGxlZCBkb3duIGJ5IHNsYXZlICovCisJYWNrPWdldHNkYShhZGFwKTsJLyogYWNrOiBzZGEgaXMgcHVsbGVkIGxvdyAtPnN1Y2Nlc3MuCSAqLworCURFQjIocHJpbnRrKEtFUk5fREVCVUcgIiBpMmNfb3V0YjogMHglMDJ4ICwgZ2V0c2RhKCkgPSAlZFxuIiwgYyAmIDB4ZmYsIGFjaykpOworCisJREVCUFJPVE8oIHByaW50ayhLRVJOX0RFQlVHICJbJTIuMnhdIixjJjB4ZmYpICk7CisJREVCUFJPVE8oaWYgKDA9PWFjayl7IHByaW50ayhLRVJOX0RFQlVHICIgQSAiKTt9IGVsc2UgcHJpbnRrKEtFUk5fREVCVUcgIiBOQSAiKSApOworCXNjbGxvKGFkYXApOworCXJldHVybiAwPT1hY2s7CQkvKiByZXR1cm4gMSBpZiBkZXZpY2UgYWNrZWQJICovCisJLyogYXNzZXJ0OiBzY2wgaXMgbG93IChzZGEgdW5kZWYpICovCit9CisKKworc3RhdGljIGludCBpMmNfaW5iKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXApIAoreworCS8qIHJlYWQgYnl0ZSB2aWEgaTJjIHBvcnQsIHdpdGhvdXQgc3RhcnQvc3RvcCBzZXF1ZW5jZQkqLworCS8qIGFja25vd2xlZGdlIGlzIHNlbnQgaW4gaTJjX3JlYWQuCQkJKi8KKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGluZGF0YT0wOworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisKKwkvKiBhc3NlcnQ6IHNjbCBpcyBsb3cgKi8KKwlzZGFoaShhZGFwKTsKKwlmb3IgKGk9MDtpPDg7aSsrKSB7CisJCWlmIChzY2xoaShhZGFwKTwwKSB7IC8qIHRpbWVvdXQgKi8KKwkJCURFQjIocHJpbnRrKEtFUk5fREVCVUcgIiBpMmNfaW5iOiB0aW1lb3V0IGF0IGJpdCAjJWRcbiIsIDctaSkpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX07CisJCWluZGF0YSAqPSAyOworCQlpZiAoIGdldHNkYShhZGFwKSApIAorCQkJaW5kYXRhIHw9IDB4MDE7CisJCXNjbGxvKGFkYXApOworCX0KKwkvKiBhc3NlcnQ6IHNjbCBpcyBsb3cgKi8KKwlERUIyKHByaW50ayhLRVJOX0RFQlVHICJpMmNfaW5iOiAweCUwMnhcbiIsIGluZGF0YSAmIDB4ZmYpKTsKKworCURFQlBST1RPKHByaW50ayhLRVJOX0RFQlVHICIgMHglMDJ4IiwgaW5kYXRhICYgMHhmZikpOworCXJldHVybiAoaW50KSAoaW5kYXRhICYgMHhmZik7Cit9CisKKy8qCisgKiBTYW5pdHkgY2hlY2sgZm9yIHRoZSBhZGFwdGVyIGhhcmR3YXJlIC0gY2hlY2sgdGhlIHJlYWN0aW9uIG9mCisgKiB0aGUgYnVzIGxpbmVzIG9ubHkgaWYgaXQgc2VlbXMgdG8gYmUgaWRsZS4KKyAqLworc3RhdGljIGludCB0ZXN0X2J1cyhzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFkYXAsIGNoYXIqIG5hbWUpIHsKKwlpbnQgc2NsLHNkYTsKKworCWlmIChhZGFwLT5nZXRzY2w9PU5VTEwpCisJCXByaW50ayhLRVJOX0lORk8gImkyYy1hbGdvLWJpdC5vOiBUZXN0aW5nIFNEQSBvbmx5LCAiCisJCQkiU0NMIGlzIG5vdCByZWFkYWJsZS5cbiIpOworCisJc2RhPWdldHNkYShhZGFwKTsKKwlzY2w9KGFkYXAtPmdldHNjbD09TlVMTD8xOmdldHNjbChhZGFwKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImkyYy1hbGdvLWJpdC5vOiAoMCkgc2NsPSVkLCBzZGE9JWRcbiIsc2NsLHNkYSk7CisJaWYgKCFzY2wgfHwgIXNkYSApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJjLWFsZ28tYml0Lm86ICVzIHNlZW1zIHRvIGJlIGJ1c3kuXG4iLCBuYW1lKTsKKwkJZ290byBiYWlsb3V0OworCX0KKworCXNkYWxvKGFkYXApOworCXNkYT1nZXRzZGEoYWRhcCk7CisJc2NsPShhZGFwLT5nZXRzY2w9PU5VTEw/MTpnZXRzY2woYWRhcCkpOworCXByaW50ayhLRVJOX0RFQlVHICJpMmMtYWxnby1iaXQubzogKDEpIHNjbD0lZCwgc2RhPSVkXG4iLHNjbCxzZGEpOworCWlmICggMCAhPSBzZGEgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTREEgc3R1Y2sgaGlnaCFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCWlmICggMCA9PSBzY2wgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTQ0wgdW5leHBlY3RlZCBsb3cgIgorCQkJIndoaWxlIHB1bGxpbmcgU0RBIGxvdyFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQkJCisKKwlzZGFoaShhZGFwKTsKKwlzZGE9Z2V0c2RhKGFkYXApOworCXNjbD0oYWRhcC0+Z2V0c2NsPT1OVUxMPzE6Z2V0c2NsKGFkYXApKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tYml0Lm86ICgyKSBzY2w9JWQsIHNkYT0lZFxuIixzY2wsc2RhKTsKKwlpZiAoIDAgPT0gc2RhICkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMmMtYWxnby1iaXQubzogU0RBIHN0dWNrIGxvdyFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCWlmICggMCA9PSBzY2wgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTQ0wgdW5leHBlY3RlZCBsb3cgIgorCQkJIndoaWxlIHB1bGxpbmcgU0RBIGhpZ2ghXG4iKTsKKwkJZ290byBiYWlsb3V0OworCX0KKworCXNjbGxvKGFkYXApOworCXNkYT1nZXRzZGEoYWRhcCk7CisJc2NsPShhZGFwLT5nZXRzY2w9PU5VTEw/MDpnZXRzY2woYWRhcCkpOworCXByaW50ayhLRVJOX0RFQlVHICJpMmMtYWxnby1iaXQubzogKDMpIHNjbD0lZCwgc2RhPSVkXG4iLHNjbCxzZGEpOworCWlmICggMCAhPSBzY2wgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTQ0wgc3R1Y2sgaGlnaCFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCWlmICggMCA9PSBzZGEgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTREEgdW5leHBlY3RlZCBsb3cgIgorCQkJIndoaWxlIHB1bGxpbmcgU0NMIGxvdyFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCQorCXNjbGhpKGFkYXApOworCXNkYT1nZXRzZGEoYWRhcCk7CisJc2NsPShhZGFwLT5nZXRzY2w9PU5VTEw/MTpnZXRzY2woYWRhcCkpOworCXByaW50ayhLRVJOX0RFQlVHICJpMmMtYWxnby1iaXQubzogKDQpIHNjbD0lZCwgc2RhPSVkXG4iLHNjbCxzZGEpOworCWlmICggMCA9PSBzY2wgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkyYy1hbGdvLWJpdC5vOiBTQ0wgc3R1Y2sgbG93IVxuIik7CisJCWdvdG8gYmFpbG91dDsKKwl9CisJaWYgKCAwID09IHNkYSApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJjLWFsZ28tYml0Lm86IFNEQSB1bmV4cGVjdGVkIGxvdyAiCisJCQkid2hpbGUgcHVsbGluZyBTQ0wgaGlnaCFcbiIpOworCQlnb3RvIGJhaWxvdXQ7CisJfQorCXByaW50ayhLRVJOX0lORk8gImkyYy1hbGdvLWJpdC5vOiAlcyBwYXNzZWQgdGVzdC5cbiIsbmFtZSk7CisJcmV0dXJuIDA7CitiYWlsb3V0OgorCXNkYWhpKGFkYXApOworCXNjbGhpKGFkYXApOworCXJldHVybiAtRU5PREVWOworfQorCisvKiAtLS0tLSBVdGlsaXR5IGZ1bmN0aW9ucworICovCisKKy8qIHRyeV9hZGRyZXNzIHRyaWVzIHRvIGNvbnRhY3QgYSBjaGlwIGZvciBhIG51bWJlciBvZgorICogdGltZXMgYmVmb3JlIGl0IGdpdmVzIHVwLgorICogcmV0dXJuIHZhbHVlczoKKyAqIDEgY2hpcCBhbnN3ZXJlZAorICogMCBjaGlwIGRpZCBub3QgYW5zd2VyCisgKiAteCB0cmFuc21pc3Npb24gZXJyb3IKKyAqLworc3RhdGljIGlubGluZSBpbnQgdHJ5X2FkZHJlc3Moc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgYWRkciwgaW50IHJldHJpZXMpCit7CisJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwlpbnQgaSxyZXQgPSAtMTsKKwlmb3IgKGk9MDtpPD1yZXRyaWVzO2krKykgeworCQlyZXQgPSBpMmNfb3V0YihpMmNfYWRhcCxhZGRyKTsKKwkJaWYgKHJldD09MSkKKwkJCWJyZWFrOwkvKiBzdWNjZXNzISAqLworCQlpMmNfc3RvcChhZGFwKTsKKwkJdWRlbGF5KDUvKmFkYXAtPnVkZWxheSovKTsKKwkJaWYgKGk9PXJldHJpZXMpICAvKiBubyBzdWNjZXNzICovCisJCQlicmVhazsKKwkJaTJjX3N0YXJ0KGFkYXApOworCQl1ZGVsYXkoYWRhcC0+dWRlbGF5KTsKKwl9CisJREVCMihpZiAoaSkKKwkgICAgIHByaW50ayhLRVJOX0RFQlVHICJpMmMtYWxnby1iaXQubzogVXNlZCAlZCB0cmllcyB0byAlcyBjbGllbnQgYXQgMHglMDJ4IDogJXNcbiIsCisJCSAgICBpKzEsIGFkZHIgJiAxID8gInJlYWQiIDogIndyaXRlIiwgYWRkcj4+MSwKKwkJICAgIHJldD09MSA/ICJzdWNjZXNzIiA6IHJldD09MCA/ICJubyBhY2siIDogImZhaWxlZCwgdGltZW91dD8iICkKKwkgICAgKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNlbmRieXRlcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisJY2hhciBjOworCWNvbnN0IGNoYXIgKnRlbXAgPSBtc2ctPmJ1ZjsKKwlpbnQgY291bnQgPSBtc2ctPmxlbjsKKwl1bnNpZ25lZCBzaG9ydCBuYWtfb2sgPSBtc2ctPmZsYWdzICYgSTJDX01fSUdOT1JFX05BSzsgCisJaW50IHJldHZhbDsKKwlpbnQgd3Jjb3VudD0wOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQljID0gKnRlbXA7CisJCURFQjIoZGV2X2RiZygmaTJjX2FkYXAtPmRldiwgInNlbmRieXRlczogd3JpdGluZyAlMi4yWFxuIiwgYyYweGZmKSk7CisJCXJldHZhbCA9IGkyY19vdXRiKGkyY19hZGFwLGMpOworCQlpZiAoKHJldHZhbD4wKSB8fCAobmFrX29rICYmIChyZXR2YWw9PTApKSkgIHsgLyogb2sgb3IgaWdub3JlZCBOQUsgKi8KKwkJCWNvdW50LS07IAorCQkJdGVtcCsrOworCQkJd3Jjb3VudCsrOworCQl9IGVsc2UgeyAvKiBhcmJpdHJhdGlvbiBvciBubyBhY2tub3dsZWRnZSAqLworCQkJZGV2X2VycigmaTJjX2FkYXAtPmRldiwgInNlbmRieXRlczogZXJyb3IgLSBiYWlsb3V0LlxuIik7CisJCQlpMmNfc3RvcChhZGFwKTsKKwkJCXJldHVybiAocmV0dmFsPDApPyByZXR2YWwgOiAtRUZBVUxUOworCQkJICAgICAgICAvKiBnb3QgYSBiZXR0ZXIgb25lID8/ICovCisJCX0KKyNpZiAwCisJCS8qIGZyb20gYXNtL2RlbGF5LmggKi8KKwkJX19kZWxheShhZGFwLT5tZGVsYXkgKiAobG9vcHNfcGVyX3NlYyAvIDEwMDApICk7CisjZW5kaWYKKwl9CisJcmV0dXJuIHdyY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlYWRieXRlcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCWludCBpbnZhbDsKKwlpbnQgcmRjb3VudD0wOyAgIAkvKiBjb3VudHMgYnl0ZXMgcmVhZCAqLworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisJY2hhciAqdGVtcCA9IG1zZy0+YnVmOworCWludCBjb3VudCA9IG1zZy0+bGVuOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlpbnZhbCA9IGkyY19pbmIoaTJjX2FkYXApOworLypwcmludGsoIiUjMDJ4ICIsaW52YWwpOyBpZiAoICEgKGNvdW50ICUgMTYpICkgcHJpbnRrKCJcbiIpOyAqLworCQlpZiAoaW52YWw+PTApIHsKKwkJCSp0ZW1wID0gaW52YWw7CisJCQlyZGNvdW50Kys7CisJCX0gZWxzZSB7ICAgLyogcmVhZCB0aW1lZCBvdXQgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiaTJjLWFsZ28tYml0Lm86IHJlYWRieXRlczogaTJjX2luYiB0aW1lZCBvdXQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdGVtcCsrOworCQljb3VudC0tOworCisJCWlmIChtc2ctPmZsYWdzICYgSTJDX01fTk9fUkRfQUNLKQorCQkJY29udGludWU7CisKKwkJaWYgKCBjb3VudCA+IDAgKSB7CQkvKiBzZW5kIGFjayAqLworCQkJc2RhbG8oYWRhcCk7CisJCQlERUJQUk9UTyhwcmludGsoIiBBbSAiKSk7CisJCX0gZWxzZSB7CisJCQlzZGFoaShhZGFwKTsJLyogbmVnLiBhY2sgb24gbGFzdCBieXRlICovCisJCQlERUJQUk9UTyhwcmludGsoIiBOQW0gIikpOworCQl9CisJCWlmIChzY2xoaShhZGFwKTwwKSB7CS8qIHRpbWVvdXQgKi8KKwkJCXNkYWhpKGFkYXApOworCQkJcHJpbnRrKEtFUk5fRVJSICJpMmMtYWxnby1iaXQubzogcmVhZGJ5dGVzOiBUaW1lb3V0IGF0IGFja1xuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfTsKKwkJc2NsbG8oYWRhcCk7CisJCXNkYWhpKGFkYXApOworCX0KKwlyZXR1cm4gcmRjb3VudDsKK30KKworLyogZG9BZGRyZXNzIGluaXRpYXRlcyB0aGUgdHJhbnNmZXIgYnkgZ2VuZXJhdGluZyB0aGUgc3RhcnQgY29uZGl0aW9uIChpbgorICogdHJ5X2FkZHJlc3MpIGFuZCB0cmFuc21pdHMgdGhlIGFkZHJlc3MgaW4gdGhlIG5lY2Vzc2FyeSBmb3JtYXQgdG8gaGFuZGxlCisgKiByZWFkcywgd3JpdGVzIGFzIHdlbGwgYXMgMTBiaXQtYWRkcmVzc2VzLgorICogcmV0dXJuczoKKyAqICAwIGV2ZXJ5dGhpbmcgd2VudCBva2F5LCB0aGUgY2hpcCBhY2snZWQsIG9yIElHTk9SRV9OQUsgZmxhZyB3YXMgc2V0CisgKiAteCBhbiBlcnJvciBvY2N1cnJlZCAobGlrZTogLUVSRU1PVEVJTyBpZiB0aGUgZGV2aWNlIGRpZCBub3QgYW5zd2VyLCBvcgorICoJLUVUSU1FRE9VVCwgZm9yIGV4YW1wbGUgaWYgdGhlIGxpbmVzIGFyZSBzdHVjay4uLikgCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJpdF9kb0FkZHJlc3Moc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZykgCit7CisJdW5zaWduZWQgc2hvcnQgZmxhZ3MgPSBtc2ctPmZsYWdzOworCXVuc2lnbmVkIHNob3J0IG5ha19vayA9IG1zZy0+ZmxhZ3MgJiBJMkNfTV9JR05PUkVfTkFLOworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisKKwl1bnNpZ25lZCBjaGFyIGFkZHI7CisJaW50IHJldCwgcmV0cmllczsKKworCXJldHJpZXMgPSBuYWtfb2sgPyAwIDogaTJjX2FkYXAtPnJldHJpZXM7CisJCisJaWYgKCAoZmxhZ3MgJiBJMkNfTV9URU4pICApIHsgCisJCS8qIGEgdGVuIGJpdCBhZGRyZXNzICovCisJCWFkZHIgPSAweGYwIHwgKCggbXNnLT5hZGRyID4+IDcpICYgMHgwMyk7CisJCURFQjIocHJpbnRrKEtFUk5fREVCVUcgImFkZHIwOiAlZFxuIixhZGRyKSk7CisJCS8qIHRyeSBleHRlbmRlZCBhZGRyZXNzIGNvZGUuLi4qLworCQlyZXQgPSB0cnlfYWRkcmVzcyhpMmNfYWRhcCwgYWRkciwgcmV0cmllcyk7CisJCWlmICgocmV0ICE9IDEpICYmICFuYWtfb2spICB7CisJCQlwcmludGsoS0VSTl9FUlIgImRpZWQgYXQgZXh0ZW5kZWQgYWRkcmVzcyBjb2RlLlxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCQkvKiB0aGUgcmVtYWluaW5nIDggYml0IGFkZHJlc3MgKi8KKwkJcmV0ID0gaTJjX291dGIoaTJjX2FkYXAsbXNnLT5hZGRyICYgMHg3Zik7CisJCWlmICgocmV0ICE9IDEpICYmICFuYWtfb2spIHsKKwkJCS8qIHRoZSBjaGlwIGRpZCBub3QgYWNrIC8geG1pc3Npb24gZXJyb3Igb2NjdXJyZWQgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiZGllZCBhdCAybmQgYWRkcmVzcyBjb2RlLlxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCQlpZiAoIGZsYWdzICYgSTJDX01fUkQgKSB7CisJCQlpMmNfcmVwc3RhcnQoYWRhcCk7CisJCQkvKiBva2F5LCBub3cgc3dpdGNoIGludG8gcmVhZGluZyBtb2RlICovCisJCQlhZGRyIHw9IDB4MDE7CisJCQlyZXQgPSB0cnlfYWRkcmVzcyhpMmNfYWRhcCwgYWRkciwgcmV0cmllcyk7CisJCQlpZiAoKHJldCE9MSkgJiYgIW5ha19vaykgeworCQkJCXByaW50ayhLRVJOX0VSUiAiZGllZCBhdCBleHRlbmRlZCBhZGRyZXNzIGNvZGUuXG4iKTsKKwkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CQkvKiBub3JtYWwgN2JpdCBhZGRyZXNzCSovCisJCWFkZHIgPSAoIG1zZy0+YWRkciA8PCAxICk7CisJCWlmIChmbGFncyAmIEkyQ19NX1JEICkKKwkJCWFkZHIgfD0gMTsKKwkJaWYgKGZsYWdzICYgSTJDX01fUkVWX0RJUl9BRERSICkKKwkJCWFkZHIgXj0gMTsKKwkJcmV0ID0gdHJ5X2FkZHJlc3MoaTJjX2FkYXAsIGFkZHIsIHJldHJpZXMpOworCQlpZiAoKHJldCE9MSkgJiYgIW5ha19vaykKKwkJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJpdF94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCisJCSAgICBzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCit7CisJc3RydWN0IGkyY19tc2cgKnBtc2c7CisJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwkKKwlpbnQgaSxyZXQ7CisJdW5zaWduZWQgc2hvcnQgbmFrX29rOworCisJaTJjX3N0YXJ0KGFkYXApOworCWZvciAoaT0wO2k8bnVtO2krKykgeworCQlwbXNnID0gJm1zZ3NbaV07CisJCW5ha19vayA9IHBtc2ctPmZsYWdzICYgSTJDX01fSUdOT1JFX05BSzsgCisJCWlmICghKHBtc2ctPmZsYWdzICYgSTJDX01fTk9TVEFSVCkpIHsKKwkJCWlmIChpKSB7CisJCQkJaTJjX3JlcHN0YXJ0KGFkYXApOworCQkJfQorCQkJcmV0ID0gYml0X2RvQWRkcmVzcyhpMmNfYWRhcCwgcG1zZyk7CisJCQlpZiAoKHJldCAhPSAwKSAmJiAhbmFrX29rKSB7CisJCQkgICAgREVCMihwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tYml0Lm86IE5BSyBmcm9tIGRldmljZSBhZGRyICUyLjJ4IG1zZyAjJWRcbiIKKwkJCQkJLG1zZ3NbaV0uYWRkcixpKSk7CisJCQkgICAgcmV0dXJuIChyZXQ8MCkgPyByZXQgOiAtRVJFTU9URUlPOworCQkJfQorCQl9CisJCWlmIChwbXNnLT5mbGFncyAmIEkyQ19NX1JEICkgeworCQkJLyogcmVhZCBieXRlcyBpbnRvIGJ1ZmZlciovCisJCQlyZXQgPSByZWFkYnl0ZXMoaTJjX2FkYXAsIHBtc2cpOworCQkJREVCMihwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tYml0Lm86IHJlYWQgJWQgYnl0ZXMuXG4iLHJldCkpOworCQkJaWYgKHJldCA8IHBtc2ctPmxlbiApIHsKKwkJCQlyZXR1cm4gKHJldDwwKT8gcmV0IDogLUVSRU1PVEVJTzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHdyaXRlIGJ5dGVzIGZyb20gYnVmZmVyICovCisJCQlyZXQgPSBzZW5kYnl0ZXMoaTJjX2FkYXAsIHBtc2cpOworCQkJREVCMihwcmludGsoS0VSTl9ERUJVRyAiaTJjLWFsZ28tYml0Lm86IHdyb3RlICVkIGJ5dGVzLlxuIixyZXQpKTsKKwkJCWlmIChyZXQgPCBwbXNnLT5sZW4gKSB7CisJCQkJcmV0dXJuIChyZXQ8MCkgPyByZXQgOiAtRVJFTU9URUlPOworCQkJfQorCQl9CisJfQorCWkyY19zdG9wKGFkYXApOworCXJldHVybiBudW07Cit9CisKK3N0YXRpYyB1MzIgYml0X2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMIHwgCisJICAgICAgIEkyQ19GVU5DXzEwQklUX0FERFIgfCBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORzsKK30KKworCisvKiAtLS0tLWV4cG9ydGVkIGFsZ29yaXRobSBkYXRhOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpMmNfYml0X2FsZ28gPSB7CisJLm5hbWUJCT0gIkJpdC1zaGlmdCBhbGdvcml0aG0iLAorCS5pZAkJPSBJMkNfQUxHT19CSVQsCisJLm1hc3Rlcl94ZmVyCT0gYml0X3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBiaXRfZnVuYywKK307CisKKy8qIAorICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAorICovCitpbnQgaTJjX2JpdF9hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmJpdF9hZGFwID0gYWRhcC0+YWxnb19kYXRhOworCisJaWYgKGJpdF90ZXN0KSB7CisJCWludCByZXQgPSB0ZXN0X2J1cyhiaXRfYWRhcCwgYWRhcC0+bmFtZSk7CisJCWlmIChyZXQ8MCkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCURFQjIoZGV2X2RiZygmYWRhcC0+ZGV2LCAiaHcgcm91dGluZXMgcmVnaXN0ZXJlZC5cbiIpKTsKKworCS8qIHJlZ2lzdGVyIG5ldyBhZGFwdGVyIHRvIGkyYyBtb2R1bGUuLi4gKi8KKworCWFkYXAtPmlkIHw9IGkyY19iaXRfYWxnby5pZDsKKwlhZGFwLT5hbGdvID0gJmkyY19iaXRfYWxnbzsKKworCWFkYXAtPnRpbWVvdXQgPSAxMDA7CS8qIGRlZmF1bHQgdmFsdWVzLCBzaG91bGQJKi8KKwlhZGFwLT5yZXRyaWVzID0gMzsJLyogYmUgcmVwbGFjZWQgYnkgZGVmaW5lcwkqLworCisJaTJjX2FkZF9hZGFwdGVyKGFkYXApOworCXJldHVybiAwOworfQorCisKK2ludCBpMmNfYml0X2RlbF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBpMmNfZGVsX2FkYXB0ZXIoYWRhcCk7Cit9CisKK0VYUE9SVF9TWU1CT0woaTJjX2JpdF9hZGRfYnVzKTsKK0VYUE9SVF9TWU1CT0woaTJjX2JpdF9kZWxfYnVzKTsKKworTU9EVUxFX0FVVEhPUigiU2ltb24gRy4gVm9nbCA8c2ltb25AdGsudW5pLWxpbnouYWMuYXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkkyQy1CdXMgYml0LWJhbmdpbmcgYWxnb3JpdGhtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShiaXRfdGVzdCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oaTJjX2RlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKworTU9EVUxFX1BBUk1fREVTQyhiaXRfdGVzdCwgIlRlc3QgdGhlIGxpbmVzIG9mIHRoZSBidXMgdG8gc2VlIGlmIGl0IGlzIHN0dWNrIik7CitNT0RVTEVfUEFSTV9ERVNDKGkyY19kZWJ1ZywKKwkJICJkZWJ1ZyBsZXZlbCAtIDAgb2ZmOyAxIG5vcm1hbDsgMiwzIG1vcmUgdmVyYm9zZTsgOSBiaXQtcHJvdG9jb2wiKTsK