LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJ0dHAuYwogKiBWZXJzaW9uOiAgICAgICAxLjIKICogRGVzY3JpcHRpb246ICAgVGlueSBUcmFuc3BvcnQgUHJvdG9jb2wgKFRUUCkgaW1wbGVtZW50YXRpb24KICogU3RhdHVzOiAgICAgICAgU3RhYmxlCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgU3VuIEF1ZyAzMSAyMDoxNDozMSAxOTk3CiAqIE1vZGlmaWVkIGF0OiAgIFdlZCBKYW4gIDUgMTE6MzE6MjcgMjAwMAogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIAogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgogKiAgICAgCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KCiNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9wYXJhbWV0ZXJzLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgoKc3RhdGljIHN0cnVjdCBpcnR0cF9jYiAqaXJ0dHA7CgpzdGF0aWMgdm9pZCBfX2lydHRwX2Nsb3NlX3RzYXAoc3RydWN0IHRzYXBfY2IgKnNlbGYpOwoKc3RhdGljIGludCBpcnR0cF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCgkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyBpbnQgaXJ0dHBfdWRhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyB2b2lkIGlydHRwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAgCgkJCQkJTE1fUkVBU09OIHJlYXNvbiwgc3RydWN0IHNrX2J1ZmYgKik7CnN0YXRpYyB2b2lkIGlydHRwX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKCQkJCSAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwKCQkJCSAgICAgX191OCBoZWFkZXJfc2l6ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyB2b2lkIGlydHRwX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKCQkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwgCgkJCQkgIF9fdTggaGVhZGVyX3NpemUsIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgdm9pZCBpcnR0cF9ydW5fdHhfcXVldWUoc3RydWN0IHRzYXBfY2IgKnNlbGYpOwpzdGF0aWMgdm9pZCBpcnR0cF9ydW5fcnhfcXVldWUoc3RydWN0IHRzYXBfY2IgKnNlbGYpOwoKc3RhdGljIHZvaWQgaXJ0dHBfZmx1c2hfcXVldWVzKHN0cnVjdCB0c2FwX2NiICpzZWxmKTsKc3RhdGljIHZvaWQgaXJ0dHBfZnJhZ21lbnRfc2tiKHN0cnVjdCB0c2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHN0cnVjdCBza19idWZmICppcnR0cF9yZWFzc2VtYmxlX3NrYihzdHJ1Y3QgdHNhcF9jYiAqc2VsZik7CnN0YXRpYyB2b2lkIGlydHRwX3RvZG9fZXhwaXJlZCh1bnNpZ25lZCBsb25nIGRhdGEpOwpzdGF0aWMgaW50IGlydHRwX3BhcmFtX21heF9zZHVfc2l6ZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgCgkJCQkgICAgaW50IGdldCk7CgpzdGF0aWMgdm9pZCBpcnR0cF9mbG93X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgTE9DQUxfRkxPVyBmbG93KTsKc3RhdGljIHZvaWQgaXJ0dHBfc3RhdHVzX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsCgkJCQkgICAgTElOS19TVEFUVVMgbGluaywgTE9DS19TVEFUVVMgbG9jayk7CgovKiBJbmZvcm1hdGlvbiBmb3IgcGFyc2luZyBwYXJhbWV0ZXJzIGluIElyVFRQICovCnN0YXRpYyBwaV9taW5vcl9pbmZvX3QgcGlfbWlub3JfY2FsbF90YWJsZVtdID0gewoJeyBOVUxMLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLwoJeyBpcnR0cF9wYXJhbV9tYXhfc2R1X3NpemUsIFBWX0lOVEVHRVIgfCBQVl9CSUdfRU5ESUFOIH0gLyogMHgwMSAqLwp9OwpzdGF0aWMgcGlfbWFqb3JfaW5mb190IHBpX21ham9yX2NhbGxfdGFibGVbXSA9IHt7IHBpX21pbm9yX2NhbGxfdGFibGUsIDIgfX07CnN0YXRpYyBwaV9wYXJhbV9pbmZvX3QgcGFyYW1faW5mbyA9IHsgcGlfbWFqb3JfY2FsbF90YWJsZSwgMSwgMHgwZiwgNCB9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKiBHTE9CQUwgUFJPQ0VEVVJFUyAqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBGdW5jdGlvbiBpcnR0cF9pbml0ICh2b2lkKQogKgogKiAgICBJbml0aWFsaXplIHRoZSBJclRUUCBsYXllci4gQ2FsbGVkIGJ5IG1vZHVsZSBpbml0aWFsaXphdGlvbiBjb2RlCiAqCiAqLwppbnQgX19pbml0IGlydHRwX2luaXQodm9pZCkKewoJaXJ0dHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJ0dHBfY2IpLCBHRlBfS0VSTkVMKTsKCWlmIChpcnR0cCA9PSBOVUxMKQoJCXJldHVybiAtRU5PTUVNOwoJbWVtc2V0KGlydHRwLCAwLCBzaXplb2Yoc3RydWN0IGlydHRwX2NiKSk7CgoJaXJ0dHAtPm1hZ2ljID0gVFRQX01BR0lDOwoKCWlydHRwLT50c2FwcyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOwoJaWYgKCFpcnR0cC0+dHNhcHMpIHsKCQlJUkRBX0VSUk9SKCIlczogY2FuJ3QgYWxsb2NhdGUgSXJUVFAgaGFzaGJpbiFcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXyk7CgkJa2ZyZWUoaXJ0dHApOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcnR0cF9jbGVhbnVwICh2b2lkKQogKgogKiAgICBDYWxsZWQgYnkgbW9kdWxlIGRlc3RydWN0aW9uL2NsZWFudXAgY29kZQogKgogKi8Kdm9pZCBfX2V4aXQgaXJ0dHBfY2xlYW51cCh2b2lkKSAKewoJLyogQ2hlY2sgZm9yIG1haW4gc3RydWN0dXJlICovCglJUkRBX0FTU0VSVChpcnR0cC0+bWFnaWMgPT0gVFRQX01BR0lDLCByZXR1cm47KTsKCgkvKgoJICogIERlbGV0ZSBoYXNoYmluIGFuZCBjbG9zZSBhbGwgVFNBUCBpbnN0YW5jZXMgaW4gaXQKCSAqLwoJaGFzaGJpbl9kZWxldGUoaXJ0dHAtPnRzYXBzLCAoRlJFRV9GVU5DKSBfX2lydHRwX2Nsb3NlX3RzYXApOwoKCWlydHRwLT5tYWdpYyA9IDA7CgoJLyogRGUtYWxsb2NhdGUgbWFpbiBzdHJ1Y3R1cmUgKi8KCWtmcmVlKGlydHRwKTsKCglpcnR0cCA9IE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKiogU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogRnVuY3Rpb24gaXJ0dHBfc3RhcnRfdG9kb190aW1lciAoc2VsZiwgdGltZW91dCkKICoKICogICAgU3RhcnQgdG9kbyB0aW1lci4KICoKICogTWFkZSBpdCBtb3JlIGVmZmllbnQgYW5kIHVuc2Vuc2l0aXZlIHRvIHJhY2UgY29uZGl0aW9ucyAtIEplYW4gSUkKICovCnN0YXRpYyBpbmxpbmUgdm9pZCBpcnR0cF9zdGFydF90b2RvX3RpbWVyKHN0cnVjdCB0c2FwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKewoJLyogU2V0IG5ldyB2YWx1ZSBmb3IgdGltZXIgKi8KCW1vZF90aW1lcigmc2VsZi0+dG9kb190aW1lciwgamlmZmllcyArIHRpbWVvdXQpOwp9CgovKgogKiBGdW5jdGlvbiBpcnR0cF90b2RvX2V4cGlyZWQgKGRhdGEpCiAqCiAqICAgIFRvZG8gdGltZXIgaGFzIGV4cGlyZWQhCiAqCiAqIE9uZSBvZiB0aGUgcmVzdHJpY3Rpb24gb2YgdGhlIHRpbWVyIGlzIHRoYXQgaXQgaXMgcnVuIG9ubHkgb24gdGhlIHRpbWVyCiAqIGludGVycnVwdCB3aGljaCBydW4gZXZlcnkgMTBtcy4gVGhpcyBtZWFuIHRoYXQgZXZlbiBpZiB5b3Ugc2V0IHRoZSB0aW1lcgogKiB3aXRoIGEgZGVsYXkgb2YgMCwgaXQgbWF5IHRha2UgdXAgdG8gMTBtcyBiZWZvcmUgaXQncyBydW4uCiAqIFNvLCB0byBtaW5pbWlzZSBsYXRlbmN5IGFuZCBrZWVwIGNhY2hlIGZyZXNoLCB3ZSB0cnkgdG8gYXZvaWQgdXNpbmcKICogaXQgYXMgbXVjaCBhcyBwb3NzaWJsZS4KICogTm90ZSA6IHdlIGNhbid0IHVzZSB0YXNrbGV0cywgYmVjYXVzZSB0aGV5IGNhbid0IGJlIGFzeW5jaHJvbm91c2x5CiAqIGtpbGxlZCAobmVlZCB1c2VyIGNvbnRleHQpLCBhbmQgd2UgY2FuJ3QgZ3VhcmFudGVlIHRoYXQgaGVyZS4uLgogKiBKZWFuIElJCiAqLwpzdGF0aWMgdm9pZCBpcnR0cF90b2RvX2V4cGlyZWQodW5zaWduZWQgbG9uZyBkYXRhKQp7CglzdHJ1Y3QgdHNhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBkYXRhOwoKCS8qIENoZWNrIHRoYXQgd2Ugc3RpbGwgZXhpc3QgKi8KCWlmICghc2VsZiB8fCBzZWxmLT5tYWdpYyAhPSBUVFBfVFNBUF9NQUdJQykKCQlyZXR1cm47CgoJSVJEQV9ERUJVRyg0LCAiJXMoaW5zdGFuY2U9JXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOwoKCS8qIFRyeSB0byBtYWtlIHNvbWUgcHJvZ3Jlc3MsIGVzcGVjaWFsbHkgb24gVHggc2lkZSAtIEplYW4gSUkgKi8KCWlydHRwX3J1bl9yeF9xdWV1ZShzZWxmKTsKCWlydHRwX3J1bl90eF9xdWV1ZShzZWxmKTsKCgkvKiBDaGVjayBpZiB0aW1lIGZvciBkaXNjb25uZWN0ICovCglpZiAodGVzdF9iaXQoMCwgJnNlbGYtPmRpc2Nvbm5lY3RfcGVuZCkpIHsKCQkvKiBDaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvIGRpc2Nvbm5lY3QgeWV0ICovCgkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhfcXVldWUpKSB7CgkJCS8qIE1ha2Ugc3VyZSBkaXNjb25uZWN0IGlzIG5vdCBwZW5kaW5nIGFueW1vcmUgKi8KCQkJY2xlYXJfYml0KDAsICZzZWxmLT5kaXNjb25uZWN0X3BlbmQpOwkvKiBGQUxTRSAqLwoKCQkJLyogTm90ZSA6IHNlbGYtPmRpc2Nvbm5lY3Rfc2tiIG1heSBiZSBOVUxMICovCgkJCWlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLCBzZWxmLT5kaXNjb25uZWN0X3NrYiwKCQkJCQkJIFBfTk9STUFMKTsKCQkJc2VsZi0+ZGlzY29ubmVjdF9za2IgPSBOVUxMOwoJCX0gZWxzZSB7CgkJCS8qIFRyeSBhZ2FpbiBsYXRlciAqLwoJCQlpcnR0cF9zdGFydF90b2RvX3RpbWVyKHNlbGYsIEhaLzEwKTsKCgkJCS8qIE5vIHJlYXNvbiB0byB0cnkgYW5kIGNsb3NlIG5vdyAqLwoJCQlyZXR1cm47CgkJfQoJfQoKCS8qIENoZWNrIGlmIGl0J3MgY2xvc2luZyB0aW1lICovCglpZiAoc2VsZi0+Y2xvc2VfcGVuZCkKCQkvKiBGaW5pc2ggY2xlYW51cCAqLwoJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2ZsdXNoX3F1ZXVlcyAoc2VsZikKICoKICogICAgIEZsdXNoZXMgKHJlbW92ZXMgYWxsIGZyYW1lcykgaW4gdHJhbnNpdHQtYnVmZmVyICh0eF9saXN0KQogKi8Kdm9pZCBpcnR0cF9mbHVzaF9xdWV1ZXMoc3RydWN0IHRzYXBfY2IgKnNlbGYpCnsKCXN0cnVjdCBza19idWZmKiBza2I7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwoKCS8qIERlYWxsb2NhdGUgZnJhbWVzIHdhaXRpbmcgdG8gYmUgc2VudCAqLwoJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+dHhfcXVldWUpKSAhPSBOVUxMKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCgkvKiBEZWFsbG9jYXRlIHJlY2VpdmVkIGZyYW1lcyAqLwoJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+cnhfcXVldWUpKSAhPSBOVUxMKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCgkvKiBEZWFsbG9jYXRlIHJlY2VpdmVkIGZyYWdtZW50cyAqLwoJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+cnhfZnJhZ21lbnRzKSkgIT0gTlVMTCkKCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX3JlYXNzZW1ibGUgKHNlbGYpCiAqCiAqICAgIE1ha2VzIGEgbmV3IChjb250aW51b3VzKSBza2Igb2YgYWxsIHRoZSBmcmFnbWVudHMgaW4gdGhlIGZyYWdtZW50CiAqICAgIHF1ZXVlCiAqCiAqLwpzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmlydHRwX3JlYXNzZW1ibGVfc2tiKHN0cnVjdCB0c2FwX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqZnJhZzsKCWludCBuID0gMDsgIC8qIEZyYWdtZW50IGluZGV4ICovCgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiBOVUxMOyk7CgoJSVJEQV9ERUJVRygyLCAiJXMoKSwgc2VsZi0+cnhfc2R1X3NpemU9JWRcbiIsIF9fRlVOQ1RJT05fXywKCQkgICBzZWxmLT5yeF9zZHVfc2l6ZSk7CgoJc2tiID0gZGV2X2FsbG9jX3NrYihUVFBfSEVBREVSICsgc2VsZi0+cnhfc2R1X3NpemUpOwoJaWYgKCFza2IpCgkJcmV0dXJuIE5VTEw7CgoJLyoKCSAqIE5lZWQgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgVFRQIGhlYWRlciBpbiBjYXNlIHRoaXMgc2tiIG5lZWRzIHRvCgkgKiBiZSByZXF1ZXVlZCBpbiBjYXNlIGRlbGl2ZXJ5IGZhaWxlcwoJICovCglza2JfcmVzZXJ2ZShza2IsIFRUUF9IRUFERVIpOwoJc2tiX3B1dChza2IsIHNlbGYtPnJ4X3NkdV9zaXplKTsKCgkvKgoJICogIENvcHkgYWxsIGZyYWdtZW50cyB0byBhIG5ldyBidWZmZXIKCSAqLwoJd2hpbGUgKChmcmFnID0gc2tiX2RlcXVldWUoJnNlbGYtPnJ4X2ZyYWdtZW50cykpICE9IE5VTEwpIHsKCQltZW1jcHkoc2tiLT5kYXRhK24sIGZyYWctPmRhdGEsIGZyYWctPmxlbik7CgkJbiArPSBmcmFnLT5sZW47CgoJCWRldl9rZnJlZV9za2IoZnJhZyk7Cgl9CgoJSVJEQV9ERUJVRygyLAoJCSAgICIlcygpLCBmcmFtZSBsZW49JWQsIHJ4X3NkdV9zaXplPSVkLCByeF9tYXhfc2R1X3NpemU9JWRcbiIsCgkJICAgX19GVU5DVElPTl9fLCBuLCBzZWxmLT5yeF9zZHVfc2l6ZSwgc2VsZi0+cnhfbWF4X3NkdV9zaXplKTsKCS8qIE5vdGUgOiBpcnR0cF9ydW5fcnhfcXVldWUoKSBjYWxjdWxhdGUgc2VsZi0+cnhfc2R1X3NpemUKCSAqIGJ5IHN1bW1pbmcgdGhlIHNpemUgb2YgYWxsIGZyYWdtZW50cywgc28gd2Ugc2hvdWxkIGFsd2F5cwoJICogaGF2ZSBuID09IHNlbGYtPnJ4X3NkdV9zaXplLCBleGNlcHQgaW4gY2FzZXMgd2hlcmUgd2UKCSAqIGRyb3BlZCB0aGUgbGFzdCBmcmFnbWVudCAod2hlbiBzZWxmLT5yeF9zZHVfc2l6ZSBleGNlZWQKCSAqIHNlbGYtPnJ4X21heF9zZHVfc2l6ZSksIHdoZXJlIG4gPCBzZWxmLT5yeF9zZHVfc2l6ZS4KCSAqIEplYW4gSUkgKi8KCUlSREFfQVNTRVJUKG4gPD0gc2VsZi0+cnhfc2R1X3NpemUsIG4gPSBzZWxmLT5yeF9zZHVfc2l6ZTspOwoKCS8qIFNldCB0aGUgbmV3IGxlbmd0aCAqLwoJc2tiX3RyaW0oc2tiLCBuKTsKCglzZWxmLT5yeF9zZHVfc2l6ZSA9IDA7CgoJcmV0dXJuIHNrYjsKfQoKLyoKICogRnVuY3Rpb24gaXJ0dHBfZnJhZ21lbnRfc2tiIChza2IpCiAqCiAqICAgIEZyYWdtZW50cyBhIGZyYW1lIGFuZCBxdWV1ZXMgYWxsIHRoZSBmcmFnbWVudHMgZm9yIHRyYW5zbWlzc2lvbgogKgogKi8Kc3RhdGljIGlubGluZSB2b2lkIGlydHRwX2ZyYWdtZW50X3NrYihzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwKCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBza19idWZmICpmcmFnOwoJX191OCAqZnJhbWU7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoKCS8qCgkgKiAgU3BsaXQgZnJhbWUgaW50byBhIG51bWJlciBvZiBzZWdtZW50cwoJICovCgl3aGlsZSAoc2tiLT5sZW4gPiBzZWxmLT5tYXhfc2VnX3NpemUpIHsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBmcmFnbWVudGluZyAuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CgoJCS8qIE1ha2UgbmV3IHNlZ21lbnQgKi8KCQlmcmFnID0gZGV2X2FsbG9jX3NrYihzZWxmLT5tYXhfc2VnX3NpemUrc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKCQlpZiAoIWZyYWcpCgkJCXJldHVybjsKCgkJc2tiX3Jlc2VydmUoZnJhZywgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKCgkJLyogQ29weSBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIHNrYiBpbnRvIHRoaXMgZnJhZ21lbnQuICovCgkJbWVtY3B5KHNrYl9wdXQoZnJhZywgc2VsZi0+bWF4X3NlZ19zaXplKSwgc2tiLT5kYXRhLAoJCSAgICAgICBzZWxmLT5tYXhfc2VnX3NpemUpOwoKCQkvKiBJbnNlcnQgVFRQIGhlYWRlciwgd2l0aCB0aGUgbW9yZSBiaXQgc2V0ICovCgkJZnJhbWUgPSBza2JfcHVzaChmcmFnLCBUVFBfSEVBREVSKTsKCQlmcmFtZVswXSA9IFRUUF9NT1JFOwoKCQkvKiBIaWRlIHRoZSBjb3BpZWQgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBza2IgKi8KCQlza2JfcHVsbChza2IsIHNlbGYtPm1heF9zZWdfc2l6ZSk7CgoJCS8qIFF1ZXVlIGZyYWdtZW50ICovCgkJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPnR4X3F1ZXVlLCBmcmFnKTsKCX0KCS8qIFF1ZXVlIHdoYXQgaXMgbGVmdCBvZiB0aGUgb3JpZ2luYWwgc2tiICovCglJUkRBX0RFQlVHKDIsICIlcygpLCBxdWV1aW5nIGxhc3Qgc2VnbWVudFxuIiwgX19GVU5DVElPTl9fKTsKCglmcmFtZSA9IHNrYl9wdXNoKHNrYiwgVFRQX0hFQURFUik7CglmcmFtZVswXSA9IDB4MDA7IC8qIENsZWFyIG1vcmUgYml0ICovCgoJLyogUXVldWUgZnJhZ21lbnQgKi8KCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT50eF9xdWV1ZSwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJ0dHBfcGFyYW1fbWF4X3NkdV9zaXplIChzZWxmLCBwYXJhbSkKICoKICogICAgSGFuZGxlIHRoZSBNYXhTZHVTaXplIHBhcmFtZXRlciBpbiB0aGUgY29ubmVjdCBmcmFtZXMsIHRoaXMgZnVuY3Rpb24KICogICAgd2lsbCBiZSBjYWxsZWQgYm90aCB3aGVuIHRoaXMgcGFyYW1ldGVyIG5lZWRzIHRvIGJlIGluc2VydGVkIGludG8sIGFuZAogKiAgICBleHRyYWN0ZWQgZnJvbSB0aGUgY29ubmVjdCBmcmFtZXMKICovCnN0YXRpYyBpbnQgaXJ0dHBfcGFyYW1fbWF4X3NkdV9zaXplKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLAoJCQkJICAgIGludCBnZXQpCnsKCXN0cnVjdCB0c2FwX2NiICpzZWxmOwoKCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKCglpZiAoZ2V0KQoJCXBhcmFtLT5wdi5pID0gc2VsZi0+dHhfbWF4X3NkdV9zaXplOwoJZWxzZQoJCXNlbGYtPnR4X21heF9zZHVfc2l6ZSA9IHBhcmFtLT5wdi5pOwoKCUlSREFfREVCVUcoMSwgIiVzKCksIE1heFNkdVNpemU9JWRcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnB2LmkpOwoKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqIENMSUVOVCBDQUxMUyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKiBMTVAgQ0FMTEJBQ0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBFdmVyeXRoaW5nIGlzIGhhcHBpbHkgbWl4ZWQgdXAuIFdhaXRpbmcgZm9yIG5leHQgY2xlYW4gdXAgLSBKZWFuIElJICovCgovKgogKiBGdW5jdGlvbiBpcnR0cF9vcGVuX3RzYXAgKHN0c2FwLCBub3RpZnkpCiAqCiAqICAgIENyZWF0ZSBUU0FQIGNvbm5lY3Rpb24gZW5kcG9pbnQsCiAqLwpzdHJ1Y3QgdHNhcF9jYiAqaXJ0dHBfb3Blbl90c2FwKF9fdTggc3RzYXBfc2VsLCBpbnQgY3JlZGl0LCBub3RpZnlfdCAqbm90aWZ5KQp7CglzdHJ1Y3QgdHNhcF9jYiAqc2VsZjsKCXN0cnVjdCBsc2FwX2NiICpsc2FwOwoJbm90aWZ5X3QgdHRwX25vdGlmeTsKCglJUkRBX0FTU0VSVChpcnR0cC0+bWFnaWMgPT0gVFRQX01BR0lDLCByZXR1cm4gTlVMTDspOwoKCS8qIFRoZSBJckxNUCBzcGVjIChJckxNUCAxLjEgcDEwKSBzYXlzIHRoYXQgd2UgaGF2ZSB0aGUgcmlnaHQgdG8KCSAqIHVzZSBvbmx5IDB4MDEtMHg2Ri4gT2YgY291cnNlLCB3ZSBjYW4gdXNlIExTQVBfQU5ZIGFzIHdlbGwuCgkgKiBKZWFuSUkgKi8KCWlmKChzdHNhcF9zZWwgIT0gTFNBUF9BTlkpICYmCgkgICAoKHN0c2FwX3NlbCA8IDB4MDEpIHx8IChzdHNhcF9zZWwgPj0gMHg3MCkpKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaW52YWxpZCB0c2FwIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglzZWxmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRzYXBfY2IpLCBHRlBfQVRPTUlDKTsKCWlmIChzZWxmID09IE5VTEwpIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgltZW1zZXQoc2VsZiwgMCwgc2l6ZW9mKHN0cnVjdCB0c2FwX2NiKSk7CglzcGluX2xvY2tfaW5pdCgmc2VsZi0+bG9jayk7CgoJLyogSW5pdGlhbGlzZSB0b2RvIHRpbWVyICovCglpbml0X3RpbWVyKCZzZWxmLT50b2RvX3RpbWVyKTsKCXNlbGYtPnRvZG9fdGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZykgc2VsZjsKCXNlbGYtPnRvZG9fdGltZXIuZnVuY3Rpb24gPSAmaXJ0dHBfdG9kb19leHBpcmVkOwoKCS8qIEluaXRpYWxpemUgY2FsbGJhY2tzIGZvciBJckxNUCB0byB1c2UgKi8KCWlyZGFfbm90aWZ5X2luaXQoJnR0cF9ub3RpZnkpOwoJdHRwX25vdGlmeS5jb25uZWN0X2NvbmZpcm0gPSBpcnR0cF9jb25uZWN0X2NvbmZpcm07Cgl0dHBfbm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbiA9IGlydHRwX2Nvbm5lY3RfaW5kaWNhdGlvbjsKCXR0cF9ub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gaXJ0dHBfZGlzY29ubmVjdF9pbmRpY2F0aW9uOwoJdHRwX25vdGlmeS5kYXRhX2luZGljYXRpb24gPSBpcnR0cF9kYXRhX2luZGljYXRpb247Cgl0dHBfbm90aWZ5LnVkYXRhX2luZGljYXRpb24gPSBpcnR0cF91ZGF0YV9pbmRpY2F0aW9uOwoJdHRwX25vdGlmeS5mbG93X2luZGljYXRpb24gPSBpcnR0cF9mbG93X2luZGljYXRpb247CglpZihub3RpZnktPnN0YXR1c19pbmRpY2F0aW9uICE9IE5VTEwpCgkJdHRwX25vdGlmeS5zdGF0dXNfaW5kaWNhdGlvbiA9IGlydHRwX3N0YXR1c19pbmRpY2F0aW9uOwoJdHRwX25vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CglzdHJuY3B5KHR0cF9ub3RpZnkubmFtZSwgbm90aWZ5LT5uYW1lLCBOT1RJRllfTUFYX05BTUUpOwoKCXNlbGYtPm1hZ2ljID0gVFRQX1RTQVBfTUFHSUM7CglzZWxmLT5jb25uZWN0ZWQgPSBGQUxTRTsKCglza2JfcXVldWVfaGVhZF9pbml0KCZzZWxmLT5yeF9xdWV1ZSk7Cglza2JfcXVldWVfaGVhZF9pbml0KCZzZWxmLT50eF9xdWV1ZSk7Cglza2JfcXVldWVfaGVhZF9pbml0KCZzZWxmLT5yeF9mcmFnbWVudHMpOwoJLyoKCSAqICBDcmVhdGUgTFNBUCBhdCBJckxNUCBsYXllcgoJICovCglsc2FwID0gaXJsbXBfb3Blbl9sc2FwKHN0c2FwX3NlbCwgJnR0cF9ub3RpZnksIDApOwoJaWYgKGxzYXAgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBMU0FQISFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJLyoKCSAqICBJZiB1c2VyIHNwZWNpZmllZCBMU0FQX0FOWSBhcyBzb3VyY2UgVFNBUCBzZWxlY3RvciwgdGhlbiBJckxNUAoJICogIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHdoYXRldmVyIHNvdXJjZSBzZWxlY3RvciB3aGljaCBpcyBmcmVlLCBzbwoJICogIHRoZSBzdHNhcF9zZWwgd2UgaGF2ZSBtaWdodCBub3QgYmUgdmFsaWQgYW55bW9yZQoJICovCglzZWxmLT5zdHNhcF9zZWwgPSBsc2FwLT5zbHNhcF9zZWw7CglJUkRBX0RFQlVHKDQsICIlcygpLCBzdHNhcF9zZWw9JTAyeFxuIiwgX19GVU5DVElPTl9fLCBzZWxmLT5zdHNhcF9zZWwpOwoKCXNlbGYtPm5vdGlmeSA9ICpub3RpZnk7CglzZWxmLT5sc2FwID0gbHNhcDsKCgloYXNoYmluX2luc2VydChpcnR0cC0+dHNhcHMsIChpcmRhX3F1ZXVlX3QgKikgc2VsZiwgKGxvbmcpIHNlbGYsIE5VTEwpOwoKCWlmIChjcmVkaXQgPiBUVFBfUlhfTUFYX0NSRURJVCkKCQlzZWxmLT5pbml0aWFsX2NyZWRpdCA9IFRUUF9SWF9NQVhfQ1JFRElUOwoJZWxzZQoJCXNlbGYtPmluaXRpYWxfY3JlZGl0ID0gY3JlZGl0OwoKCXJldHVybiBzZWxmOwp9CkVYUE9SVF9TWU1CT0woaXJ0dHBfb3Blbl90c2FwKTsKCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2Nsb3NlIChoYW5kbGUpCiAqCiAqICAgIFJlbW92ZSBhbiBpbnN0YW5jZSBvZiBhIFRTQVAuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgZGVhbCB3aXRoIHRoZQogKiAgICBkZWFsbG9jYXRpb24gb2YgdGhlIFRTQVAsIGFuZCByZXNldHRpbmcgb2YgdGhlIFRTQVBzIHZhbHVlczsKICoKICovCnN0YXRpYyB2b2lkIF9faXJ0dHBfY2xvc2VfdHNhcChzdHJ1Y3QgdHNhcF9jYiAqc2VsZikKewoJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CgoJaXJ0dHBfZmx1c2hfcXVldWVzKHNlbGYpOwoKCWRlbF90aW1lcigmc2VsZi0+dG9kb190aW1lcik7CgoJLyogVGhpcyBvbmUgd29uJ3QgYmUgY2xlYW5lZCB1cCBpZiB3ZSBhcmUgZGlzY29ubmVjdF9wZW5kICsgY2xvc2VfcGVuZAoJICogYW5kIHdlIHJlY2VpdmUgYSBkaXNjb25uZWN0X2luZGljYXRpb24gKi8KCWlmIChzZWxmLT5kaXNjb25uZWN0X3NrYikKCQlkZXZfa2ZyZWVfc2tiKHNlbGYtPmRpc2Nvbm5lY3Rfc2tiKTsKCglzZWxmLT5jb25uZWN0ZWQgPSBGQUxTRTsKCXNlbGYtPm1hZ2ljID0gflRUUF9UU0FQX01BR0lDOwoKCWtmcmVlKHNlbGYpOwp9CgovKgogKiBGdW5jdGlvbiBpcnR0cF9jbG9zZSAoc2VsZikKICoKICogICAgUmVtb3ZlIFRTQVAgZnJvbSBsaXN0IG9mIGFsbCBUU0FQcyBhbmQgdGhlbiBkZWFsbG9jYXRlIGFsbCByZXNvdXJjZXMKICogICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVFNBUAogKgogKiBOb3RlIDogYmVjYXVzZSB3ZSAqZnJlZSogdGhlIHRzYXAgc3RydWN0dXJlLCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkKICogb2YgdGhlIGNhbGxlciB0byBtYWtlIHN1cmUgd2UgYXJlIGNhbGxlZCBvbmx5IG9uY2UgYW5kIHRvIGRlYWwgd2l0aAogKiBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbnMuIC0gSmVhbiBJSQogKi8KaW50IGlydHRwX2Nsb3NlX3RzYXAoc3RydWN0IHRzYXBfY2IgKnNlbGYpCnsKCXN0cnVjdCB0c2FwX2NiICp0c2FwOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKCgkvKiBNYWtlIHN1cmUgdHNhcCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgKi8KCWlmIChzZWxmLT5jb25uZWN0ZWQpIHsKCQkvKiBDaGVjayBpZiBkaXNjb25uZWN0IGlzIG5vdCBwZW5kaW5nICovCgkJaWYgKCF0ZXN0X2JpdCgwLCAmc2VsZi0+ZGlzY29ubmVjdF9wZW5kKSkgewoJCQlJUkRBX1dBUk5JTkcoIiVzOiBUU0FQIHN0aWxsIGNvbm5lY3RlZCFcbiIsCgkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJCWlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLCBOVUxMLCBQX05PUk1BTCk7CgkJfQoJCXNlbGYtPmNsb3NlX3BlbmQgPSBUUlVFOwoJCWlydHRwX3N0YXJ0X3RvZG9fdGltZXIoc2VsZiwgSFovMTApOwoKCQlyZXR1cm4gMDsgLyogV2lsbCBiZSBiYWNrISAqLwoJfQoKCXRzYXAgPSBoYXNoYmluX3JlbW92ZShpcnR0cC0+dHNhcHMsIChsb25nKSBzZWxmLCBOVUxMKTsKCglJUkRBX0FTU0VSVCh0c2FwID09IHNlbGYsIHJldHVybiAtMTspOwoKCS8qIENsb3NlIGNvcnJlc3BvbmRpbmcgTFNBUCAqLwoJaWYgKHNlbGYtPmxzYXApIHsKCQlpcmxtcF9jbG9zZV9sc2FwKHNlbGYtPmxzYXApOwoJCXNlbGYtPmxzYXAgPSBOVUxMOwoJfQoKCV9faXJ0dHBfY2xvc2VfdHNhcChzZWxmKTsKCglyZXR1cm4gMDsKfQpFWFBPUlRfU1lNQk9MKGlydHRwX2Nsb3NlX3RzYXApOwoKLyoKICogRnVuY3Rpb24gaXJ0dHBfdWRhdGFfcmVxdWVzdCAoc2VsZiwgc2tiKQogKgogKiAgICBTZW5kIHVucmVsaWFibGUgZGF0YSBvbiB0aGlzIFRTQVAKICoKICovCmludCBpcnR0cF91ZGF0YV9yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJLyogQ2hlY2sgdGhhdCBub3RoaW5nIGJhZCBoYXBwZW5zICovCglpZiAoKHNrYi0+bGVuID09IDApIHx8ICghc2VsZi0+Y29ubmVjdGVkKSkgewoJCUlSREFfREVCVUcoMSwgIiVzKCksIE5vIGRhdGEsIG9yIG5vdCBjb25uZWN0ZWRcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXyk7CgkJZ290byBlcnI7Cgl9CgoJaWYgKHNrYi0+bGVuID4gc2VsZi0+bWF4X3NlZ19zaXplKSB7CgkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVURhdGEgaXMgdG8gbGFyZ2UgZm9yIElyTEFQIVxuIiwKCQkJICAgX19GVU5DVElPTl9fKTsKCQlnb3RvIGVycjsKCX0KCglpcmxtcF91ZGF0YV9yZXF1ZXN0KHNlbGYtPmxzYXAsIHNrYik7CglzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CgoJcmV0dXJuIDA7CgplcnI6CglkZXZfa2ZyZWVfc2tiKHNrYik7CglyZXR1cm4gLTE7Cn0KRVhQT1JUX1NZTUJPTChpcnR0cF91ZGF0YV9yZXF1ZXN0KTsKCgovKgogKiBGdW5jdGlvbiBpcnR0cF9kYXRhX3JlcXVlc3QgKGhhbmRsZSwgc2tiKQogKgogKiAgICBRdWV1ZSBmcmFtZSBmb3IgdHJhbnNtaXNzaW9uLiBJZiBTQVIgaXMgZW5hYmxlZCwgZnJhZ2VtZW50IHRoZSBmcmFtZQogKiAgICBhbmQgcXVldWUgdGhlIGZyYWdtZW50cyBmb3IgdHJhbnNtaXNzaW9uCiAqLwppbnQgaXJ0dHBfZGF0YV9yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglfX3U4ICpmcmFtZTsKCWludCByZXQ7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCglJUkRBX0RFQlVHKDIsICIlcygpIDogcXVldWUgbGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywKCQkgICBza2JfcXVldWVfbGVuKCZzZWxmLT50eF9xdWV1ZSkpOwoKCS8qIENoZWNrIHRoYXQgbm90aGluZyBiYWQgaGFwcGVucyAqLwoJaWYgKChza2ItPmxlbiA9PSAwKSB8fCAoIXNlbGYtPmNvbm5lY3RlZCkpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBObyBkYXRhLCBvciBub3QgY29ubmVjdGVkXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldCA9IC1FTk9UQ09OTjsKCQlnb3RvIGVycjsKCX0KCgkvKgoJICogIENoZWNrIGlmIFNBUiBpcyBkaXNhYmxlZCwgYW5kIHRoZSBmcmFtZSBpcyBsYXJnZXIgdGhhbiB3aGF0IGZpdHMKCSAqICBpbnNpZGUgYW4gSXJMQVAgZnJhbWUKCSAqLwoJaWYgKChzZWxmLT50eF9tYXhfc2R1X3NpemUgPT0gMCkgJiYgKHNrYi0+bGVuID4gc2VsZi0+bWF4X3NlZ19zaXplKSkgewoJCUlSREFfRVJST1IoIiVzOiBTQVIgZGlzYWJsZWQsIGFuZCBkYXRhIGlzIHRvIGxhcmdlIGZvciBJckxBUCFcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0ID0gLUVNU0dTSVpFOwoJCWdvdG8gZXJyOwoJfQoKCS8qCgkgKiAgQ2hlY2sgaWYgU0FSIGlzIGVuYWJsZWQsIGFuZCB0aGUgZnJhbWUgaXMgbGFyZ2VyIHRoYW4gdGhlCgkgKiAgVHhNYXhTZHVTaXplCgkgKi8KCWlmICgoc2VsZi0+dHhfbWF4X3NkdV9zaXplICE9IDApICYmCgkgICAgKHNlbGYtPnR4X21heF9zZHVfc2l6ZSAhPSBUVFBfU0FSX1VOQk9VTkQpICYmCgkgICAgKHNrYi0+bGVuID4gc2VsZi0+dHhfbWF4X3NkdV9zaXplKSkKCXsKCQlJUkRBX0VSUk9SKCIlczogU0FSIGVuYWJsZWQsIGJ1dCBkYXRhIGlzIGxhcmdlciB0aGFuIFR4TWF4U2R1U2l6ZSFcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0ID0gLUVNU0dTSVpFOwoJCWdvdG8gZXJyOwoJfQoJLyoKCSAqICBDaGVjayBpZiB0cmFuc21pdCBxdWV1ZSBpcyBmdWxsCgkgKi8KCWlmIChza2JfcXVldWVfbGVuKCZzZWxmLT50eF9xdWV1ZSkgPj0gVFRQX1RYX01BWF9RVUVVRSkgewoJCS8qCgkJICogIEdpdmUgaXQgYSBjaGFuY2UgdG8gZW1wdHkgaXRzZWxmCgkJICovCgkJaXJ0dHBfcnVuX3R4X3F1ZXVlKHNlbGYpOwoKCQkvKiBEcm9wIHBhY2tldC4gVGhpcyBlcnJvciBjb2RlIHNob3VsZCB0cmlnZ2VyIHRoZSBjYWxsZXIKCQkgKiB0byByZXNlbmQgdGhlIGRhdGEgaW4gdGhlIGNsaWVudCBjb2RlIC0gSmVhbiBJSSAqLwoJCXJldCA9IC1FTk9CVUZTOwoJCWdvdG8gZXJyOwoJfQoKCS8qIFF1ZXVlIGZyYW1lLCBvciBxdWV1ZSBmcmFtZSBzZWdtZW50cyAqLwoJaWYgKChzZWxmLT50eF9tYXhfc2R1X3NpemUgPT0gMCkgfHwgKHNrYi0+bGVuIDwgc2VsZi0+bWF4X3NlZ19zaXplKSkgewoJCS8qIFF1ZXVlIGZyYW1lICovCgkJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHNrYikgPj0gVFRQX0hFQURFUiwgcmV0dXJuIC0xOyk7CgkJZnJhbWUgPSBza2JfcHVzaChza2IsIFRUUF9IRUFERVIpOwoJCWZyYW1lWzBdID0gMHgwMDsgLyogQ2xlYXIgbW9yZSBiaXQgKi8KCgkJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPnR4X3F1ZXVlLCBza2IpOwoJfSBlbHNlIHsKCQkvKgoJCSAqICBGcmFnbWVudCB0aGUgZnJhbWUsIHRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIHF1ZXVlIHRoZQoJCSAqICBmcmFnbWVudHMsIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGZhY3QgdGhlIHRyYW5zbWl0CgkJICogIHF1ZXVlIG1heSBiZSBvdmVyZmlsbGVkIGJ5IGFsbCB0aGUgc2VnbWVudHMgZm9yIGEgbGl0dGxlCgkJICogIHdoaWxlCgkJICovCgkJaXJ0dHBfZnJhZ21lbnRfc2tiKHNlbGYsIHNrYik7Cgl9CgoJLyogQ2hlY2sgaWYgd2UgY2FuIGFjY2VwdCBtb3JlIGRhdGEgZnJvbSBjbGllbnQgKi8KCWlmICgoIXNlbGYtPnR4X3NkdV9idXN5KSAmJgoJICAgIChza2JfcXVldWVfbGVuKCZzZWxmLT50eF9xdWV1ZSkgPiBUVFBfVFhfSElHSF9USFJFU0hPTEQpKSB7CgkJLyogVHggcXVldWUgZmlsbGluZyB1cCwgc28gc3RvcCBjbGllbnQuICovCgkJaWYgKHNlbGYtPm5vdGlmeS5mbG93X2luZGljYXRpb24pIHsKCQkJc2VsZi0+bm90aWZ5LmZsb3dfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsCgkJCQkJCSAgICAgc2VsZiwgRkxPV19TVE9QKTsKCQl9CgkJLyogc2VsZi0+dHhfc2R1X2J1c3kgaXMgdGhlIHN0YXRlIG9mIHRoZSBjbGllbnQuCgkJICogVXBkYXRlIHN0YXRlIGFmdGVyIG5vdGlmeWluZyBjbGllbnQgdG8gYXZvaWQKCQkgKiByYWNlIGNvbmRpdGlvbiB3aXRoIGlydHRwX2Zsb3dfaW5kaWNhdGlvbigpLgoJCSAqIElmIHRoZSBxdWV1ZSBlbXB0eSBpdHNlbGYgYWZ0ZXIgb3VyIHRlc3QgYnV0IGJlZm9yZQoJCSAqIHdlIHNldCB0aGUgZmxhZywgd2Ugd2lsbCBmaXggb3Vyc2VsdmVzIGJlbG93IGluCgkJICogaXJ0dHBfcnVuX3R4X3F1ZXVlKCkuCgkJICogSmVhbiBJSSAqLwoJCXNlbGYtPnR4X3NkdV9idXN5ID0gVFJVRTsKCX0KCgkvKiBUcnkgdG8gbWFrZSBzb21lIHByb2dyZXNzICovCglpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CgoJcmV0dXJuIDA7CgplcnI6CglkZXZfa2ZyZWVfc2tiKHNrYik7CglyZXR1cm4gcmV0Owp9CkVYUE9SVF9TWU1CT0woaXJ0dHBfZGF0YV9yZXF1ZXN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlydHRwX3J1bl90eF9xdWV1ZSAoc2VsZikKICoKICogICAgVHJhbnNtaXQgcGFja2V0cyBxdWV1ZWQgZm9yIHRyYW5zbWlzc2lvbiAoaWYgcG9zc2libGUpCiAqCiAqLwpzdGF0aWMgdm9pZCBpcnR0cF9ydW5fdHhfcXVldWUoc3RydWN0IHRzYXBfY2IgKnNlbGYpCnsKCXN0cnVjdCBza19idWZmICpza2I7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50IG47CgoJSVJEQV9ERUJVRygyLCAiJXMoKSA6IHNlbmRfY3JlZGl0ID0gJWQsIHF1ZXVlX2xlbiA9ICVkXG4iLAoJCSAgIF9fRlVOQ1RJT05fXywKCQkgICBzZWxmLT5zZW5kX2NyZWRpdCwgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhfcXVldWUpKTsKCgkvKiBHZXQgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgdHggcXVldWUsIG90aGVyd2lzZSBkb24ndCB0b3VjaCBpdCAqLwoJaWYgKGlyZGFfbG9jaygmc2VsZi0+dHhfcXVldWVfbG9jaykgPT0gRkFMU0UpCgkJcmV0dXJuOwoKCS8qIFRyeSB0byBzZW5kIG91dCBmcmFtZXMgYXMgbG9uZyBhcyB3ZSBoYXZlIGNyZWRpdHMKCSAqIGFuZCBhcyBsb25nIGFzIExBUCBpcyBub3QgZnVsbC4gSWYgTEFQIGlzIGZ1bGwsIGl0IHdpbGwKCSAqIHBvbGwgdXMgdGhyb3VnaCBpcnR0cF9mbG93X2luZGljYXRpb24oKSAtIEplYW4gSUkgKi8KCXdoaWxlICgoc2VsZi0+c2VuZF9jcmVkaXQgPiAwKSAmJgoJICAgICAgICghaXJsbXBfbGFwX3R4X3F1ZXVlX2Z1bGwoc2VsZi0+bHNhcCkpICYmCgkgICAgICAgKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT50eF9xdWV1ZSkpKQoJewoJCS8qCgkJICogIFNpbmNlIHdlIGNhbiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBmcmFtZXMgY29uY3VycmVudGx5LAoJCSAqICB0aGUgY29kZSBiZWxvdyBpcyBhIGNyaXRpY2FsIHJlZ2lvbiBhbmQgd2UgbXVzdCBhc3N1cmUgdGhhdAoJCSAqICBub2JvZHkgbWVzc2VzIHdpdGggdGhlIGNyZWRpdHMgd2hpbGUgd2UgdXBkYXRlIHRoZW0uCgkJICovCgkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKCgkJbiA9IHNlbGYtPmF2YWlsX2NyZWRpdDsKCQlzZWxmLT5hdmFpbF9jcmVkaXQgPSAwOwoKCQkvKiBPbmx5IHJvb20gZm9yIDEyNyBjcmVkaXRzIGluIGZyYW1lICovCgkJaWYgKG4gPiAxMjcpIHsKCQkJc2VsZi0+YXZhaWxfY3JlZGl0ID0gbi0xMjc7CgkJCW4gPSAxMjc7CgkJfQoJCXNlbGYtPnJlbW90ZV9jcmVkaXQgKz0gbjsKCQlzZWxmLT5zZW5kX2NyZWRpdC0tOwoKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CgoJCS8qCgkJICogIE1vcmUgYml0IG11c3QgYmUgc2V0IGJ5IHRoZSBkYXRhX3JlcXVlc3QoKSBvciBmcmFnbWVudCgpCgkJICogIGZ1bmN0aW9ucwoJCSAqLwoJCXNrYi0+ZGF0YVswXSB8PSAobiAmIDB4N2YpOwoKCQkvKiBEZXRhY2ggZnJvbSBzb2NrZXQuCgkJICogVGhlIGN1cnJlbnQgc2tiIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgc29ja2V0IHRoYXQgc2VudAoJCSAqIGl0IChza2ItPnNrKS4gV2hlbiB3ZSBwYXNzIGl0IHRvIElyTE1QLCB0aGUgc2tiIHdpbGwgYmUKCQkgKiBzdG9yZWQgaW4gaW4gSXJMQVAgKHNlbGYtPnd4X2xpc3QpLiBXaGVuIHdlIGFyZSB3aXRoaW4KCQkgKiBJckxBUCwgd2UgbG9zZSB0aGUgbm90aW9uIG9mIHNvY2tldCwgc28gd2Ugc2hvdWxkIG5vdAoJCSAqIGhhdmUgYSByZWZlcmVuY2UgdG8gYSBzb2NrZXQuIFNvLCB3ZSBkcm9wIGl0IGhlcmUuCgkJICoKCQkgKiBXaHkgZG9lcyBpdCBtYXR0ZXIgPwoJCSAqIFdoZW4gdGhlIHNrYiBpcyBmcmVlZCAoa2ZyZWVfc2tiKSwgaWYgaXQgaXMgYXNzb2NpYXRlZAoJCSAqIHdpdGggYSBzb2NrZXQsIGl0IHJlbGVhc2UgYnVmZmVyIHNwYWNlIG9uIHRoZSBzb2NrZXQKCQkgKiAodGhyb3VnaCBzb2NrX3dmcmVlKCkgYW5kIHNvY2tfZGVmX3dyaXRlX3NwYWNlKCkpLgoJCSAqIElmIHRoZSBzb2NrZXQgbm8gbG9uZ2VyIGV4aXN0LCB3ZSBtYXkgY3Jhc2guIEhhcmQuCgkJICogV2hlbiB3ZSBjbG9zZSBhIHNvY2tldCwgd2UgbWFrZSBzdXJlIHRoYXQgYXNzb2NpYXRlZCBwYWNrZXRzCgkJICogaW4gSXJUVFAgYXJlIGZyZWVkLiBIb3dldmVyLCB3ZSBoYXZlIG5vIHdheSB0byBjYW5jZWwKCQkgKiB0aGUgcGFja2V0IHRoYXQgd2UgaGF2ZSBwYXNzZWQgdG8gSXJMQVAuIFNvLCBpZiBhIHBhY2tldAoJCSAqIHJlbWFpbnMgaW4gSXJMQVAgKHJldHJ5IG9uIHRoZSBsaW5rIG9yIGVsc2UpIGFmdGVyIHdlCgkJICogY2xvc2UgdGhlIHNvY2tldCwgd2UgYXJlIGRlYWQgIQoJCSAqIEplYW4gSUkgKi8KCQlpZiAoc2tiLT5zayAhPSBOVUxMKSB7CgkJCS8qIElyU09DSyBhcHBsaWNhdGlvbiwgSXJPQkVYLCAuLi4gKi8KCQkJc2tiX29ycGhhbihza2IpOwoJCX0KCQkJLyogSXJDT01NIG92ZXIgSXJUVFAsIElyTEFOLCAuLi4gKi8KCgkJLyogUGFzcyB0aGUgc2tiIHRvIElyTE1QIC0gZG9uZSAqLwoJCWlybG1wX2RhdGFfcmVxdWVzdChzZWxmLT5sc2FwLCBza2IpOwoJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKCX0KCgkvKiBDaGVjayBpZiB3ZSBjYW4gYWNjZXB0IG1vcmUgZnJhbWVzIGZyb20gY2xpZW50LgoJICogV2UgZG9uJ3Qgd2FudCB0byB3YWl0IHVudGlsIHRoZSB0b2RvIHRpbWVyIHRvIGRvIHRoYXQsIGFuZCB3ZQoJICogY2FuJ3QgdXNlIHRhc2tsZXRzIChncnIuLi4pLCBzbyB3ZSBhcmUgb2JsaWdlZCB0byBnaXZlIGNvbnRyb2wKCSAqIHRvIGNsaWVudC4gVGhhdCdzIG9rLCB0aGlzIHRlc3Qgd2lsbCBiZSB0cnVlIG5vdCB0b28gb2Z0ZW4KCSAqIChtYXggb25jZSBwZXIgTEFQIHdpbmRvdykgYW5kIHdlIGFyZSBjYWxsZWQgZnJvbSBwbGFjZXMKCSAqIHdoZXJlIHdlIGNhbiBzcGVuZCBhIGJpdCBvZiB0aW1lIGRvaW5nIHN0dWZmLiAtIEplYW4gSUkgKi8KCWlmICgoc2VsZi0+dHhfc2R1X2J1c3kpICYmCgkgICAgKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4X3F1ZXVlKSA8IFRUUF9UWF9MT1dfVEhSRVNIT0xEKSAmJgoJICAgICghc2VsZi0+Y2xvc2VfcGVuZCkpCgl7CgkJaWYgKHNlbGYtPm5vdGlmeS5mbG93X2luZGljYXRpb24pCgkJCXNlbGYtPm5vdGlmeS5mbG93X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLAoJCQkJCQkgICAgIHNlbGYsIEZMT1dfU1RBUlQpOwoKCQkvKiBzZWxmLT50eF9zZHVfYnVzeSBpcyB0aGUgc3RhdGUgb2YgdGhlIGNsaWVudC4KCQkgKiBXZSBkb24ndCByZWFsbHkgaGF2ZSBhIHJhY2UgaGVyZSwgYnV0IGl0J3MgYWx3YXlzIHNhZmVyCgkJICogdG8gdXBkYXRlIG91ciBzdGF0ZSBhZnRlciB0aGUgY2xpZW50IC0gSmVhbiBJSSAqLwoJCXNlbGYtPnR4X3NkdV9idXN5ID0gRkFMU0U7Cgl9CgoJLyogUmVzZXQgbG9jayAqLwoJc2VsZi0+dHhfcXVldWVfbG9jayA9IDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2dpdmVfY3JlZGl0IChzZWxmKQogKgogKiAgICBTZW5kIGEgZGF0YWxlc3MgZmxvd2RhdGEgVFRQLVBEVSBhbmQgZ2l2ZSBhdmFpbGFibGUgY3JlZGl0IHRvIHBlZXIKICogICAgVFNBUAogKi8Kc3RhdGljIGlubGluZSB2b2lkIGlydHRwX2dpdmVfY3JlZGl0KHN0cnVjdCB0c2FwX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiID0gTlVMTDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglpbnQgbjsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwoKCUlSREFfREVCVUcoNCwgIiVzKCkgc2VuZD0lZCxhdmFpbD0lZCxyZW1vdGU9JWRcbiIsCgkJICAgX19GVU5DVElPTl9fLAoJCSAgIHNlbGYtPnNlbmRfY3JlZGl0LCBzZWxmLT5hdmFpbF9jcmVkaXQsIHNlbGYtPnJlbW90ZV9jcmVkaXQpOwoKCS8qIEdpdmUgY3JlZGl0IHRvIHBlZXIgKi8KCXR4X3NrYiA9IGRldl9hbGxvY19za2IoNjQpOwoJaWYgKCF0eF9za2IpCgkJcmV0dXJuOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHR4X3NrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKCgkvKgoJICogIFNpbmNlIHdlIGNhbiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBmcmFtZXMgY29uY3VycmVudGx5LAoJICogIHRoZSBjb2RlIGJlbG93IGlzIGEgY3JpdGljYWwgcmVnaW9uIGFuZCB3ZSBtdXN0IGFzc3VyZSB0aGF0CgkgKiAgbm9ib2R5IG1lc3NlcyB3aXRoIHRoZSBjcmVkaXRzIHdoaWxlIHdlIHVwZGF0ZSB0aGVtLgoJICovCglzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOwoKCW4gPSBzZWxmLT5hdmFpbF9jcmVkaXQ7CglzZWxmLT5hdmFpbF9jcmVkaXQgPSAwOwoKCS8qIE9ubHkgc3BhY2UgZm9yIDEyNyBjcmVkaXRzIGluIGZyYW1lICovCglpZiAobiA+IDEyNykgewoJCXNlbGYtPmF2YWlsX2NyZWRpdCA9IG4gLSAxMjc7CgkJbiA9IDEyNzsKCX0KCXNlbGYtPnJlbW90ZV9jcmVkaXQgKz0gbjsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CgoJc2tiX3B1dCh0eF9za2IsIDEpOwoJdHhfc2tiLT5kYXRhWzBdID0gKF9fdTgpIChuICYgMHg3Zik7CgoJaXJsbXBfZGF0YV9yZXF1ZXN0KHNlbGYtPmxzYXAsIHR4X3NrYik7CglzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX3VkYXRhX2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHNrYikKICoKICogICAgUmVjZWl2ZWQgc29tZSB1bml0LWRhdGEgKHVucmVsaWFibGUpCiAqCiAqLwpzdGF0aWMgaW50IGlydHRwX3VkYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IHRzYXBfY2IgKnNlbGY7CglpbnQgZXJyOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOwoKCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKCgkvKiBKdXN0IHBhc3MgZGF0YSB0byBsYXllciBhYm92ZSAqLwoJaWYgKHNlbGYtPm5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uKSB7CgkJZXJyID0gc2VsZi0+bm90aWZ5LnVkYXRhX2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLAoJCQkJCQkgICAgc2VsZixza2IpOwoJCS8qIFNhbWUgY29tbWVudCBhcyBpbiBpcnR0cF9kb19kYXRhX2luZGljYXRpb24oKSAqLwoJCWlmICghZXJyKSAKCQkJcmV0dXJuIDA7Cgl9CgkvKiBFaXRoZXIgbm8gaGFuZGxlciwgb3IgaGFuZGxlciByZXR1cm5zIGFuIGVycm9yICovCglkZXZfa2ZyZWVfc2tiKHNrYik7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2RhdGFfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgc2tiKQogKgogKiAgICBSZWNlaXZlIHNlZ21lbnQgZnJvbSBJckxNUC4KICoKICovCnN0YXRpYyBpbnQgaXJ0dHBfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IHRzYXBfY2IgKnNlbGY7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50IG47CgoJc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKCgluID0gc2tiLT5kYXRhWzBdICYgMHg3ZjsgICAgIC8qIEV4dHJhY3QgdGhlIGNyZWRpdHMgKi8KCglzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CgoJLyogIERlYWwgd2l0aCBpbmJvdW5kIGNyZWRpdAoJICogIFNpbmNlIHdlIGNhbiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBmcmFtZXMgY29uY3VycmVudGx5LAoJICogIHRoZSBjb2RlIGJlbG93IGlzIGEgY3JpdGljYWwgcmVnaW9uIGFuZCB3ZSBtdXN0IGFzc3VyZSB0aGF0CgkgKiAgbm9ib2R5IG1lc3NlcyB3aXRoIHRoZSBjcmVkaXRzIHdoaWxlIHdlIHVwZGF0ZSB0aGVtLgoJICovCglzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOwoJc2VsZi0+c2VuZF9jcmVkaXQgKz0gbjsKCWlmIChza2ItPmxlbiA+IDEpCgkJc2VsZi0+cmVtb3RlX2NyZWRpdC0tOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOwoKCS8qCgkgKiAgRGF0YSBvciBkYXRhbGVzcyBwYWNrZXQ/IERhdGFsZXNzIGZyYW1lcyBjb250YWlucyBvbmx5IHRoZQoJICogIFRUUF9IRUFERVIuCgkgKi8KCWlmIChza2ItPmxlbiA+IDEpIHsKCQkvKgoJCSAqICBXZSBkb24ndCByZW1vdmUgdGhlIFRUUCBoZWFkZXIsIHNpbmNlIHdlIG11c3QgcHJlc2VydmUgdGhlCgkJICogIG1vcmUgYml0LCBzbyB0aGUgZGVmcmFnbWVudCByb3V0aW5nIGtub3dzIHdoYXQgdG8gZG8KCQkgKi8KCQlza2JfcXVldWVfdGFpbCgmc2VsZi0+cnhfcXVldWUsIHNrYik7Cgl9IGVsc2UgewoJCS8qIERhdGFsZXNzIGZsb3dkYXRhIFRUUC1QRFUgKi8KCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cgl9CgoKCS8qIFB1c2ggZGF0YSB0byB0aGUgaGlnaGVyIGxheWVyLgoJICogV2UgZG8gaXQgc3luY2hyb25vdXNseSBiZWNhdXNlIHJ1bm5pbmcgdGhlIHRvZG8gdGltZXIgZm9yIGVhY2gKCSAqIHJlY2VpdmUgcGFja2V0IHdvdWxkIGJlIHRvbyBtdWNoIG92ZXJoZWFkIGFuZCBsYXRlbmN5LgoJICogQnkgcGFzc2luZyBjb250cm9sIHRvIHRoZSBoaWdoZXIgbGF5ZXIsIHdlIHJ1biB0aGUgcmlzayB0aGF0CgkgKiBpdCBtYXkgdGFrZSB0aW1lIG9yIGdyYWIgYSBsb2NrLiBNb3N0IG9mdGVuLCB0aGUgaGlnaGVyIGxheWVyCgkgKiB3aWxsIG9ubHkgcHV0IHBhY2tldCBpbiBhIHF1ZXVlLgoJICogQW55d2F5LCBwYWNrZXRzIGFyZSBvbmx5IGRyaXBwaW5nIHRocm91Z2ggdGhlIElyREEsIHNvIHdlIGNhbgoJICogaGF2ZSB0aW1lIGJlZm9yZSB0aGUgbmV4dCBwYWNrZXQuCgkgKiBGdXJ0aGVyLCB3ZSBhcmUgcnVuIGZyb20gTkVUX0JILCBzbyB0aGUgd29yc2UgdGhhdCBjYW4gaGFwcGVuIGlzCgkgKiB1cyBtaXNzaW5nIHRoZSBvcHRpbWFsIHRpbWUgdG8gc2VuZCBiYWNrIHRoZSBQRiBiaXQgaW4gTEFQLgoJICogSmVhbiBJSSAqLwoJaXJ0dHBfcnVuX3J4X3F1ZXVlKHNlbGYpOwoKCS8qIFdlIG5vdyBnaXZlIGNyZWRpdHMgdG8gcGVlciBpbiBpcnR0cF9ydW5fcnhfcXVldWUoKS4KCSAqIFdlIG5lZWQgdG8gc2VuZCBjcmVkaXQgKk5PVyosIG90aGVyd2lzZSB3ZSBhcmUgZ29pbmcKCSAqIHRvIG1pc3MgdGhlIG5leHQgVHggd2luZG93LiBUaGUgdG9kbyB0aW1lciBtYXkgdGFrZQoJICogYSB3aGlsZSBiZWZvcmUgaXQncyBydW4uLi4gLSBKZWFuIElJICovCgoJLyoKCSAqIElmIHRoZSBwZWVyIGRldmljZSBoYXMgZ2l2ZW4gdXMgc29tZSBjcmVkaXRzIGFuZCB3ZSBkaWRuJ3QgaGF2ZQogICAgICAgICAqIGFueW9uZSBmcm9tIGJlZm9yZSwgdGhlbiB3ZSBuZWVkIHRvIHNoZWR1bGUgdGhlIHR4IHF1ZXVlLgoJICogV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2Ugb3VyIFR4IGhhdmUgc3RvcHBlZCAoc28gd2UgbWF5IG5vdAoJICogZ2V0IGFueSBMQVAgZmxvdyBpbmRpY2F0aW9uKSBhbmQgdGhlIHVzZXIgbWF5IGJlIHN0b3BwZWQgYXMKCSAqIHdlbGwuIC0gSmVhbiBJSQoJICovCglpZiAoc2VsZi0+c2VuZF9jcmVkaXQgPT0gbikgewoJCS8qIFJlc3RhcnQgcHVzaGluZyBzdHVmZiB0byBMQVAgKi8KCQlpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CgkJLyogTm90ZSA6IHdlIGRvbid0IHdhbnQgdG8gc2NoZWR1bGUgdGhlIHRvZG8gdGltZXIKCQkgKiBiZWNhdXNlIGl0IGhhcyBob3JyaWJsZSBsYXRlbmN5LiBObyB0YXNrbGV0cwoJCSAqIGJlY2F1c2UgdGhlIHRhc2tsZXQgQVBJIGlzIGJyb2tlbi4gLSBKZWFuIElJICovCgl9CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX3N0YXR1c19pbmRpY2F0aW9uIChzZWxmLCByZWFzb24pCiAqCiAqICAgIFN0YXR1c19pbmRpY2F0aW9uLCBqdXN0IHBhc3MgdG8gdGhlIGhpZ2hlciBsYXllci4uLgogKgogKi8Kc3RhdGljIHZvaWQgaXJ0dHBfc3RhdHVzX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsCgkJCQkgICAgTElOS19TVEFUVVMgbGluaywgTE9DS19TVEFUVVMgbG9jaykKewoJc3RydWN0IHRzYXBfY2IgKnNlbGY7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CgoJLyogQ2hlY2sgaWYgY2xpZW50IGhhcyBhbHJlYWR5IGNsb3NlZCB0aGUgVFNBUCBhbmQgZ29uZSBhd2F5ICovCglpZiAoc2VsZi0+Y2xvc2VfcGVuZCkKCQlyZXR1cm47CgoJLyoKCSAqICBJbmZvcm0gc2VydmljZSB1c2VyIGlmIGhlIGhhcyByZXF1ZXN0ZWQgaXQKCSAqLwoJaWYgKHNlbGYtPm5vdGlmeS5zdGF0dXNfaW5kaWNhdGlvbiAhPSBOVUxMKQoJCXNlbGYtPm5vdGlmeS5zdGF0dXNfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsCgkJCQkJICAgICAgIGxpbmssIGxvY2spOwoJZWxzZQoJCUlSREFfREVCVUcoMiwgIiVzKCksIG5vIGhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2Zsb3dfaW5kaWNhdGlvbiAoc2VsZiwgcmVhc29uKQogKgogKiAgICBGbG93X2luZGljYXRpb24gOiBJckxBUCB0ZWxscyB1cyB0byBzZW5kIG1vcmUgZGF0YS4KICoKICovCnN0YXRpYyB2b2lkIGlydHRwX2Zsb3dfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCBMT0NBTF9GTE9XIGZsb3cpCnsKCXN0cnVjdCB0c2FwX2NiICpzZWxmOwoKCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0RFQlVHKDQsICIlcyhpbnN0YW5jZT0lcClcbiIsIF9fRlVOQ1RJT05fXywgc2VsZik7CgoJLyogV2UgYXJlICJwb2xsZWQiIGRpcmVjdGx5IGZyb20gTEFQLCBhbmQgdGhlIExBUCB3YW50IHRvIGZpbGwKCSAqIGl0cyBUeCB3aW5kb3cuIFdlIHdhbnQgdG8gZG8gb3VyIGJlc3QgdG8gc2VuZCBpdCBkYXRhLCBzbyB0aGF0CgkgKiB3ZSBtYXhpbWlzZSB0aGUgd2luZG93LiBPbiB0aGUgb3RoZXIgaGFuZCwgd2Ugd2FudCB0byBsaW1pdCB0aGUKCSAqIGFtb3VudCBvZiB3b3JrIGhlcmUgc28gdGhhdCBMQVAgZG9lc24ndCBoYW5nIGZvcmV2ZXIgd2FpdGluZwoJICogZm9yIHBhY2tldHMuIC0gSmVhbiBJSSAqLwoKCS8qIFRyeSB0byBzZW5kIHNvbWUgcGFja2V0cy4gQ3VycmVudGx5LCBMQVAgY2FsbHMgdXMgZXZlcnkgdGltZQoJICogdGhlcmUgaXMgb25lIGZyZWUgc2xvdCwgc28gd2Ugd2lsbCBzZW5kIG9ubHkgb25lIHBhY2tldC4KCSAqIFRoaXMgYWxsb3cgdGhlIHNjaGVkdWxlciB0byBkbyBpdHMgcm91bmQgcm9iaW4gLSBKZWFuIElJICovCglpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CgoJLyogTm90ZSByZWdhcmRpbmcgdGhlIGludGVycmFjdGlvbiB3aXRoIGhpZ2hlciBsYXllci4KCSAqIGlydHRwX3J1bl90eF9xdWV1ZSgpIG1heSBjYWxsIHRoZSBjbGllbnQgd2hlbiBpdHMgcXVldWUKCSAqIHN0YXJ0IHRvIGVtcHR5LCB2aWEgbm90aWZ5LmZsb3dfaW5kaWNhdGlvbigpLiBJbml0aWFsbHkuCgkgKiBJIHdhbnRlZCB0aGlzIHRvIGhhcHBlbiBpbiBhIHRhc2tsZXQsIHRvIGF2b2lkIGNsaWVudAoJICogZ3JhYmJpbmcgdGhlIENQVSwgYnV0IHdlIGNhbid0IHVzZSB0YXNrbGV0cyBzYWZlbHkuIEFuZCB0aW1lcgoJICogaXMgZGVmaW5pdGVseSB0b28gc2xvdy4KCSAqIFRoaXMgd2lsbCBoYXBwZW4gb25seSBvbmNlIHBlciBMQVAgd2luZG93LCBhbmQgdXN1YWxseSBhdAoJICogdGhlIHRoaXJkIHBhY2tldCAodW5sZXNzIHdpbmRvdyBpcyBzbWFsbGVyKS4gTEFQIGlzIHN0aWxsCgkgKiBkb2luZyBtdHQgYW5kIHNlbmRpbmcgZmlyc3QgcGFja2V0IHNvIGl0J3Mgc29ydCBvZiBPSwoJICogdG8gZG8gdGhhdC4gSmVhbiBJSSAqLwoKCS8qIElmIHdlIG5lZWQgdG8gc2VuZCBkaXNjb25uZWN0LiB0cnkgdG8gZG8gaXQgbm93ICovCglpZihzZWxmLT5kaXNjb25uZWN0X3BlbmQpCgkJaXJ0dHBfc3RhcnRfdG9kb190aW1lcihzZWxmLCAwKTsKfQoKLyoKICogRnVuY3Rpb24gaXJ0dHBfZmxvd19yZXF1ZXN0IChzZWxmLCBjb21tYW5kKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIHVzZWQgYnkgdGhlIHVwcGVyIGxheWVycyB0byB0ZWxsIElyVFRQIHRvIHN0b3AKICogICAgZGVsaXZlcmluZyBmcmFtZXMgaWYgdGhlIHJlY2VpdmUgcXVldWVzIGFyZSBzdGFydGluZyB0byBnZXQgZnVsbCwgb3IKICogICAgdG8gdGVsbCBJclRUUCB0byBzdGFydCBkZWxpdmVyaW5nIGZyYW1lcyBhZ2Fpbi4KICovCnZvaWQgaXJ0dHBfZmxvd19yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBMT0NBTF9GTE9XIGZsb3cpCnsKCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKCglzd2l0Y2ggKGZsb3cpIHsKCWNhc2UgRkxPV19TVE9QOgoJCUlSREFfREVCVUcoMSwgIiVzKCksIGZsb3cgc3RvcFxuIiwgX19GVU5DVElPTl9fKTsKCQlzZWxmLT5yeF9zZHVfYnVzeSA9IFRSVUU7CgkJYnJlYWs7CgljYXNlIEZMT1dfU1RBUlQ6CgkJSVJEQV9ERUJVRygxLCAiJXMoKSwgZmxvdyBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCQlzZWxmLT5yeF9zZHVfYnVzeSA9IEZBTFNFOwoKCQkvKiBDbGllbnQgc2F5IGhlIGNhbiBhY2NlcHQgbW9yZSBkYXRhLCB0cnkgdG8gZnJlZSBvdXIKCQkgKiBxdWV1ZXMgQVNBUCAtIEplYW4gSUkgKi8KCQlpcnR0cF9ydW5fcnhfcXVldWUoc2VsZik7CgoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGZsb3cgY29tbWFuZCFcbiIsIF9fRlVOQ1RJT05fXyk7Cgl9Cn0KRVhQT1JUX1NZTUJPTChpcnR0cF9mbG93X3JlcXVlc3QpOwoKLyoKICogRnVuY3Rpb24gaXJ0dHBfY29ubmVjdF9yZXF1ZXN0IChzZWxmLCBkdHNhcF9zZWwsIGRhZGRyLCBxb3MpCiAqCiAqICAgIFRyeSB0byBjb25uZWN0IHRvIHJlbW90ZSBkZXN0aW5hdGlvbiBUU0FQIHNlbGVjdG9yCiAqCiAqLwppbnQgaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBfX3U4IGR0c2FwX3NlbCwKCQkJICBfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsCgkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwKCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpCnsKCXN0cnVjdCBza19idWZmICp0eF9za2I7CglfX3U4ICpmcmFtZTsKCV9fdTggbjsKCglJUkRBX0RFQlVHKDQsICIlcygpLCBtYXhfc2R1X3NpemU9JWRcbiIsIF9fRlVOQ1RJT05fXywgbWF4X3NkdV9zaXplKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtRUJBRFI7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm4gLUVCQURSOyk7CgoJaWYgKHNlbGYtPmNvbm5lY3RlZCkgewoJCWlmKHVzZXJkYXRhKQoJCQlkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsKCQlyZXR1cm4gLUVJU0NPTk47Cgl9CgoJLyogQW55IHVzZXJkYXRhIHN1cHBsaWVkPyAqLwoJaWYgKHVzZXJkYXRhID09IE5VTEwpIHsKCQl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKCQlpZiAoIXR4X3NrYikKCQkJcmV0dXJuIC1FTk9NRU07CgoJCS8qIFJlc2VydmUgc3BhY2UgZm9yIE1VWF9DT05UUk9MIGFuZCBMQVAgaGVhZGVyICovCgkJc2tiX3Jlc2VydmUodHhfc2tiLCBUVFBfTUFYX0hFQURFUik7Cgl9IGVsc2UgewoJCXR4X3NrYiA9IHVzZXJkYXRhOwoJCS8qCgkJICogIENoZWNrIHRoYXQgdGhlIGNsaWVudCBoYXMgcmVzZXJ2ZWQgZW5vdWdoIHNwYWNlIGZvcgoJCSAqICBoZWFkZXJzCgkJICovCgkJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHVzZXJkYXRhKSA+PSBUVFBfTUFYX0hFQURFUiwKCQkJeyBkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsgcmV0dXJuIC0xOyB9ICk7Cgl9CgoJLyogSW5pdGlhbGl6ZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgKi8KCXNlbGYtPmNvbm5lY3RlZCA9IEZBTFNFOwoJc2VsZi0+YXZhaWxfY3JlZGl0ID0gMDsKCXNlbGYtPnJ4X21heF9zZHVfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKCXNlbGYtPnJ4X3NkdV9zaXplID0gMDsKCXNlbGYtPnJ4X3NkdV9idXN5ID0gRkFMU0U7CglzZWxmLT5kdHNhcF9zZWwgPSBkdHNhcF9zZWw7CgoJbiA9IHNlbGYtPmluaXRpYWxfY3JlZGl0OwoKCXNlbGYtPnJlbW90ZV9jcmVkaXQgPSAwOwoJc2VsZi0+c2VuZF9jcmVkaXQgPSAwOwoKCS8qCgkgKiAgR2l2ZSBhd2F5IG1heCAxMjcgY3JlZGl0cyBmb3Igbm93CgkgKi8KCWlmIChuID4gMTI3KSB7CgkJc2VsZi0+YXZhaWxfY3JlZGl0PW4tMTI3OwoJCW4gPSAxMjc7Cgl9CgoJc2VsZi0+cmVtb3RlX2NyZWRpdCA9IG47CgoJLyogU0FSIGVuYWJsZWQ/ICovCglpZiAobWF4X3NkdV9zaXplID4gMCkgewoJCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh0eF9za2IpID49IChUVFBfTUFYX0hFQURFUiArIFRUUF9TQVJfSEVBREVSKSwKCQkJeyBkZXZfa2ZyZWVfc2tiKHR4X3NrYik7IHJldHVybiAtMTsgfSApOwoKCQkvKiBJbnNlcnQgU0FSIHBhcmFtZXRlcnMgKi8KCQlmcmFtZSA9IHNrYl9wdXNoKHR4X3NrYiwgVFRQX0hFQURFUitUVFBfU0FSX0hFQURFUik7CgoJCWZyYW1lWzBdID0gVFRQX1BBUkFNRVRFUlMgfCBuOwoJCWZyYW1lWzFdID0gMHgwNDsgLyogTGVuZ3RoICovCgkJZnJhbWVbMl0gPSAweDAxOyAvKiBNYXhTZHVTaXplICovCgkJZnJhbWVbM10gPSAweDAyOyAvKiBWYWx1ZSBsZW5ndGggKi8KCgkJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUxNigoX191MTYpIG1heF9zZHVfc2l6ZSksCgkJCSAgICAgIChfX3UxNiAqKShmcmFtZSs0KSk7Cgl9IGVsc2UgewoJCS8qIEluc2VydCBwbGFpbiBUVFAgaGVhZGVyICovCgkJZnJhbWUgPSBza2JfcHVzaCh0eF9za2IsIFRUUF9IRUFERVIpOwoKCQkvKiBJbnNlcnQgaW5pdGlhbCBjcmVkaXQgaW4gZnJhbWUgKi8KCQlmcmFtZVswXSA9IG4gJiAweDdmOwoJfQoKCS8qIENvbm5lY3Qgd2l0aCBJckxNUC4gTm8gUW9TIHBhcmFtZXRlcnMgZm9yIG5vdyAqLwoJcmV0dXJuIGlybG1wX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5sc2FwLCBkdHNhcF9zZWwsIHNhZGRyLCBkYWRkciwgcW9zLAoJCQkJICAgICB0eF9za2IpOwp9CkVYUE9SVF9TWU1CT0woaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2Nvbm5lY3RfY29uZmlybSAoaGFuZGxlLCBxb3MsIHNrYikKICoKICogICAgU2V2aWNlIHVzZXIgY29uZmlybXMgVFNBUCBjb25uZWN0aW9uIHdpdGggcGVlci4KICoKICovCnN0YXRpYyB2b2lkIGlydHRwX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NlZ19zaXplLAoJCQkJICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IHRzYXBfY2IgKnNlbGY7CglpbnQgcGFyYW1ldGVyczsKCWludCByZXQ7CglfX3U4IHBsZW47CglfX3U4IG47CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CgoJc2VsZi0+bWF4X3NlZ19zaXplID0gbWF4X3NlZ19zaXplIC0gVFRQX0hFQURFUjsKCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZSArIFRUUF9IRUFERVI7CgoJLyoKCSAqICBDaGVjayBpZiB3ZSBoYXZlIGdvdCBzb21lIFFvUyBwYXJhbWV0ZXJzIGJhY2shIFRoaXMgc2hvdWxkIGJlIHRoZQoJICogIG5lZ290aWF0ZWQgUW9TIGZvciB0aGUgbGluay4KCSAqLwoJaWYgKHFvcykgewoJCUlSREFfREVCVUcoNCwgIklyVFRQLCBOZWdvdGlhdGVkIEJBVURfUkFURTogJTAyeFxuIiwKCQkgICAgICAgcW9zLT5iYXVkX3JhdGUuYml0cyk7CgkJSVJEQV9ERUJVRyg0LCAiSXJUVFAsIE5lZ290aWF0ZWQgQkFVRF9SQVRFOiAlZCBicHMuXG4iLAoJCSAgICAgICBxb3MtPmJhdWRfcmF0ZS52YWx1ZSk7Cgl9CgoJbiA9IHNrYi0+ZGF0YVswXSAmIDB4N2Y7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgSW5pdGlhbCBzZW5kX2NyZWRpdD0lZFxuIiwgX19GVU5DVElPTl9fLCBuKTsKCglzZWxmLT5zZW5kX2NyZWRpdCA9IG47CglzZWxmLT50eF9tYXhfc2R1X3NpemUgPSAwOwoJc2VsZi0+Y29ubmVjdGVkID0gVFJVRTsKCglwYXJhbWV0ZXJzID0gc2tiLT5kYXRhWzBdICYgMHg4MDsKCglJUkRBX0FTU0VSVChza2ItPmxlbiA+PSBUVFBfSEVBREVSLCByZXR1cm47KTsKCXNrYl9wdWxsKHNrYiwgVFRQX0hFQURFUik7CgoJaWYgKHBhcmFtZXRlcnMpIHsKCQlwbGVuID0gc2tiLT5kYXRhWzBdOwoKCQlyZXQgPSBpcmRhX3BhcmFtX2V4dHJhY3RfYWxsKHNlbGYsIHNrYi0+ZGF0YSsxLAoJCQkJCSAgICAgSVJEQV9NSU4oc2tiLT5sZW4tMSwgcGxlbiksCgkJCQkJICAgICAmcGFyYW1faW5mbyk7CgoJCS8qIEFueSBlcnJvcnMgaW4gdGhlIHBhcmFtZXRlciBsaXN0PyAqLwoJCWlmIChyZXQgPCAwKSB7CgkJCUlSREFfV0FSTklORygiJXM6IGVycm9yIGV4dHJhY3RpbmcgcGFyYW1ldGVyc1xuIiwKCQkJCSAgICAgX19GVU5DVElPTl9fKTsKCQkJZGV2X2tmcmVlX3NrYihza2IpOwoKCQkJLyogRG8gbm90IGFjY2VwdCB0aGlzIGNvbm5lY3Rpb24gYXR0ZW1wdCAqLwoJCQlyZXR1cm47CgkJfQoJCS8qIFJlbW92ZSBwYXJhbWV0ZXJzICovCgkJc2tiX3B1bGwoc2tiLCBJUkRBX01JTihza2ItPmxlbiwgcGxlbisxKSk7Cgl9CgoJSVJEQV9ERUJVRyg0LCAiJXMoKSBzZW5kPSVkLGF2YWlsPSVkLHJlbW90ZT0lZFxuIiwgX19GVU5DVElPTl9fLAoJICAgICAgc2VsZi0+c2VuZF9jcmVkaXQsIHNlbGYtPmF2YWlsX2NyZWRpdCwgc2VsZi0+cmVtb3RlX2NyZWRpdCk7CgoJSVJEQV9ERUJVRygyLCAiJXMoKSwgTWF4U2R1U2l6ZT0lZFxuIiwgX19GVU5DVElPTl9fLAoJCSAgIHNlbGYtPnR4X21heF9zZHVfc2l6ZSk7CgoJaWYgKHNlbGYtPm5vdGlmeS5jb25uZWN0X2NvbmZpcm0pIHsKCQlzZWxmLT5ub3RpZnkuY29ubmVjdF9jb25maXJtKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwgcW9zLAoJCQkJCSAgICAgc2VsZi0+dHhfbWF4X3NkdV9zaXplLAoJCQkJCSAgICAgc2VsZi0+bWF4X2hlYWRlcl9zaXplLCBza2IpOwoJfSBlbHNlCgkJZGV2X2tmcmVlX3NrYihza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcnR0cF9jb25uZWN0X2luZGljYXRpb24gKGhhbmRsZSwgc2tiKQogKgogKiAgICBTb21lIG90aGVyIGRldmljZSBpcyBjb25uZWN0aW5nIHRvIHRoaXMgVFNBUAogKgogKi8Kdm9pZCBpcnR0cF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgc3RydWN0IHFvc19pbmZvICpxb3MsCgkJCSAgICAgIF9fdTMyIG1heF9zZWdfc2l6ZSwgX191OCBtYXhfaGVhZGVyX3NpemUsCgkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCB0c2FwX2NiICpzZWxmOwoJc3RydWN0IGxzYXBfY2IgKmxzYXA7CglpbnQgcGFyYW1ldGVyczsKCWludCByZXQ7CglfX3U4IHBsZW47CglfX3U4IG47CgoJc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoKCWxzYXAgPSAoc3RydWN0IGxzYXBfY2IgKikgc2FwOwoKCXNlbGYtPm1heF9zZWdfc2l6ZSA9IG1heF9zZWdfc2l6ZSAtIFRUUF9IRUFERVI7CglzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemUrVFRQX0hFQURFUjsKCglJUkRBX0RFQlVHKDQsICIlcygpLCBUU0FQIHNlbD0lMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYtPnN0c2FwX3NlbCk7CgoJLyogTmVlZCB0byB1cGRhdGUgZHRzYXBfc2VsIGlmIGl0cyBlcXVhbCB0byBMU0FQX0FOWSAqLwoJc2VsZi0+ZHRzYXBfc2VsID0gbHNhcC0+ZGxzYXBfc2VsOwoKCW4gPSBza2ItPmRhdGFbMF0gJiAweDdmOwoKCXNlbGYtPnNlbmRfY3JlZGl0ID0gbjsKCXNlbGYtPnR4X21heF9zZHVfc2l6ZSA9IDA7CgoJcGFyYW1ldGVycyA9IHNrYi0+ZGF0YVswXSAmIDB4ODA7CgoJSVJEQV9BU1NFUlQoc2tiLT5sZW4gPj0gVFRQX0hFQURFUiwgcmV0dXJuOyk7Cglza2JfcHVsbChza2IsIFRUUF9IRUFERVIpOwoKCWlmIChwYXJhbWV0ZXJzKSB7CgkJcGxlbiA9IHNrYi0+ZGF0YVswXTsKCgkJcmV0ID0gaXJkYV9wYXJhbV9leHRyYWN0X2FsbChzZWxmLCBza2ItPmRhdGErMSwKCQkJCQkgICAgIElSREFfTUlOKHNrYi0+bGVuLTEsIHBsZW4pLAoJCQkJCSAgICAgJnBhcmFtX2luZm8pOwoKCQkvKiBBbnkgZXJyb3JzIGluIHRoZSBwYXJhbWV0ZXIgbGlzdD8gKi8KCQlpZiAocmV0IDwgMCkgewoJCQlJUkRBX1dBUk5JTkcoIiVzOiBlcnJvciBleHRyYWN0aW5nIHBhcmFtZXRlcnNcbiIsCgkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJCWRldl9rZnJlZV9za2Ioc2tiKTsKCgkJCS8qIERvIG5vdCBhY2NlcHQgdGhpcyBjb25uZWN0aW9uIGF0dGVtcHQgKi8KCQkJcmV0dXJuOwoJCX0KCgkJLyogUmVtb3ZlIHBhcmFtZXRlcnMgKi8KCQlza2JfcHVsbChza2IsIElSREFfTUlOKHNrYi0+bGVuLCBwbGVuKzEpKTsKCX0KCglpZiAoc2VsZi0+bm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbikgewoJCXNlbGYtPm5vdGlmeS5jb25uZWN0X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLAoJCQkJCQlxb3MsIHNlbGYtPnR4X21heF9zZHVfc2l6ZSwKCQkJCQkJc2VsZi0+bWF4X2hlYWRlcl9zaXplLCBza2IpOwoJfSBlbHNlCgkJZGV2X2tmcmVlX3NrYihza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcnR0cF9jb25uZWN0X3Jlc3BvbnNlIChoYW5kbGUsIHVzZXJkYXRhKQogKgogKiAgICBTZXJ2aWNlIHVzZXIgaXMgYWNjZXB0aW5nIHRoZSBjb25uZWN0aW9uLCBqdXN0IHBhc3MgaXQgZG93biB0bwogKiAgICBJckxNUCEKICoKICovCmludCBpcnR0cF9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCB0c2FwX2NiICpzZWxmLCBfX3UzMiBtYXhfc2R1X3NpemUsCgkJCSAgIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKewoJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKCV9fdTggKmZyYW1lOwoJaW50IHJldDsKCV9fdTggbjsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiAtMTspOwoKCUlSREFfREVCVUcoNCwgIiVzKCksIFNvdXJjZSBUU0FQIHNlbGVjdG9yPSUwMnhcbiIsIF9fRlVOQ1RJT05fXywKCQkgICBzZWxmLT5zdHNhcF9zZWwpOwoKCS8qIEFueSB1c2VyZGF0YSBzdXBwbGllZD8gKi8KCWlmICh1c2VyZGF0YSA9PSBOVUxMKSB7CgkJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CgkJaWYgKCF0eF9za2IpCgkJCXJldHVybiAtRU5PTUVNOwoKCQkvKiBSZXNlcnZlIHNwYWNlIGZvciBNVVhfQ09OVFJPTCBhbmQgTEFQIGhlYWRlciAqLwoJCXNrYl9yZXNlcnZlKHR4X3NrYiwgVFRQX01BWF9IRUFERVIpOwoJfSBlbHNlIHsKCQl0eF9za2IgPSB1c2VyZGF0YTsKCQkvKgoJCSAqICBDaGVjayB0aGF0IHRoZSBjbGllbnQgaGFzIHJlc2VydmVkIGVub3VnaCBzcGFjZSBmb3IKCQkgKiAgaGVhZGVycwoJCSAqLwoJCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh1c2VyZGF0YSkgPj0gVFRQX01BWF9IRUFERVIsCgkJCXsgZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7IHJldHVybiAtMTsgfSApOwoJfQoKCXNlbGYtPmF2YWlsX2NyZWRpdCA9IDA7CglzZWxmLT5yZW1vdGVfY3JlZGl0ID0gMDsKCXNlbGYtPnJ4X21heF9zZHVfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKCXNlbGYtPnJ4X3NkdV9zaXplID0gMDsKCXNlbGYtPnJ4X3NkdV9idXN5ID0gRkFMU0U7CgoJbiA9IHNlbGYtPmluaXRpYWxfY3JlZGl0OwoKCS8qIEZyYW1lIGhhcyBvbmx5IHNwYWNlIGZvciBtYXggMTI3IGNyZWRpdHMgKDcgYml0cykgKi8KCWlmIChuID4gMTI3KSB7CgkJc2VsZi0+YXZhaWxfY3JlZGl0ID0gbiAtIDEyNzsKCQluID0gMTI3OwoJfQoKCXNlbGYtPnJlbW90ZV9jcmVkaXQgPSBuOwoJc2VsZi0+Y29ubmVjdGVkID0gVFJVRTsKCgkvKiBTQVIgZW5hYmxlZD8gKi8KCWlmIChtYXhfc2R1X3NpemUgPiAwKSB7CgkJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHR4X3NrYikgPj0gKFRUUF9NQVhfSEVBREVSICsgVFRQX1NBUl9IRUFERVIpLAoJCQl7IGRldl9rZnJlZV9za2IodHhfc2tiKTsgcmV0dXJuIC0xOyB9ICk7CgoJCS8qIEluc2VydCBUVFAgaGVhZGVyIHdpdGggU0FSIHBhcmFtZXRlcnMgKi8KCQlmcmFtZSA9IHNrYl9wdXNoKHR4X3NrYiwgVFRQX0hFQURFUitUVFBfU0FSX0hFQURFUik7CgoJCWZyYW1lWzBdID0gVFRQX1BBUkFNRVRFUlMgfCBuOwoJCWZyYW1lWzFdID0gMHgwNDsgLyogTGVuZ3RoICovCgoJCS8qIGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIElSVFRQX01BWF9TRFVfU0laRSwgZnJhbWUrMSwgICovCi8qCQkJCSAgVFRQX1NBUl9IRUFERVIsICZwYXJhbV9pbmZvKSAqLwoKCQlmcmFtZVsyXSA9IDB4MDE7IC8qIE1heFNkdVNpemUgKi8KCQlmcmFtZVszXSA9IDB4MDI7IC8qIFZhbHVlIGxlbmd0aCAqLwoKCQlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTE2KChfX3UxNikgbWF4X3NkdV9zaXplKSwKCQkJICAgICAgKF9fdTE2ICopKGZyYW1lKzQpKTsKCX0gZWxzZSB7CgkJLyogSW5zZXJ0IFRUUCBoZWFkZXIgKi8KCQlmcmFtZSA9IHNrYl9wdXNoKHR4X3NrYiwgVFRQX0hFQURFUik7CgoJCWZyYW1lWzBdID0gbiAmIDB4N2Y7Cgl9CgoJcmV0ID0gaXJsbXBfY29ubmVjdF9yZXNwb25zZShzZWxmLT5sc2FwLCB0eF9za2IpOwoKCXJldHVybiByZXQ7Cn0KRVhQT1JUX1NZTUJPTChpcnR0cF9jb25uZWN0X3Jlc3BvbnNlKTsKCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2R1cCAoc2VsZiwgaW5zdGFuY2UpCiAqCiAqICAgIER1cGxpY2F0ZSBUU0FQLCBjYW4gYmUgdXNlZCBieSBzZXJ2ZXJzIHRvIGNvbmZpcm0gYSBjb25uZWN0aW9uIG9uIGEKICogICAgbmV3IFRTQVAgc28gaXQgY2FuIGtlZXAgbGlzdGVuaW5nIG9uIHRoZSBvbGQgb25lLgogKi8Kc3RydWN0IHRzYXBfY2IgKmlydHRwX2R1cChzdHJ1Y3QgdHNhcF9jYiAqb3JpZywgdm9pZCAqaW5zdGFuY2UpCnsKCXN0cnVjdCB0c2FwX2NiICpuZXc7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJLyogUHJvdGVjdCBvdXIgYWNjZXNzIHRvIHRoZSBvbGQgdHNhcCBpbnN0YW5jZSAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJmlydHRwLT50c2Fwcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCgkvKiBGaW5kIHRoZSBvbGQgaW5zdGFuY2UgKi8KCWlmICghaGFzaGJpbl9maW5kKGlydHRwLT50c2FwcywgKGxvbmcpIG9yaWcsIE5VTEwpKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIGZpbmQgVFNBUFxuIiwgX19GVU5DVElPTl9fKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnR0cC0+dHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJLyogQWxsb2NhdGUgYSBuZXcgaW5zdGFuY2UgKi8KCW5ldyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0c2FwX2NiKSwgR0ZQX0FUT01JQyk7CglpZiAoIW5ldykgewoJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuYWJsZSB0byBrbWFsbG9jXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlydHRwLT50c2Fwcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gTlVMTDsKCX0KCS8qIER1cCAqLwoJbWVtY3B5KG5ldywgb3JpZywgc2l6ZW9mKHN0cnVjdCB0c2FwX2NiKSk7CgoJLyogV2UgZG9uJ3QgbmVlZCB0aGUgb2xkIGluc3RhbmNlIGFueSBtb3JlICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnR0cC0+dHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgoJLyogVHJ5IHRvIGR1cCB0aGUgTFNBUCAobWF5IGZhaWwgaWYgd2Ugd2VyZSB0b28gc2xvdykgKi8KCW5ldy0+bHNhcCA9IGlybG1wX2R1cChvcmlnLT5sc2FwLCBuZXcpOwoJaWYgKCFuZXctPmxzYXApIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBkdXAgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKCQlrZnJlZShuZXcpOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qIE5vdCBldmVyeXRoaW5nIHNob3VsZCBiZSBjb3BpZWQgKi8KCW5ldy0+bm90aWZ5Lmluc3RhbmNlID0gaW5zdGFuY2U7Cglpbml0X3RpbWVyKCZuZXctPnRvZG9fdGltZXIpOwoKCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5ldy0+cnhfcXVldWUpOwoJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmV3LT50eF9xdWV1ZSk7Cglza2JfcXVldWVfaGVhZF9pbml0KCZuZXctPnJ4X2ZyYWdtZW50cyk7CgoJLyogVGhpcyBpcyBsb2NrZWQgKi8KCWhhc2hiaW5faW5zZXJ0KGlydHRwLT50c2FwcywgKGlyZGFfcXVldWVfdCAqKSBuZXcsIChsb25nKSBuZXcsIE5VTEwpOwoKCXJldHVybiBuZXc7Cn0KRVhQT1JUX1NZTUJPTChpcnR0cF9kdXApOwoKLyoKICogRnVuY3Rpb24gaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0IChzZWxmKQogKgogKiAgICBDbG9zZSB0aGlzIGNvbm5lY3Rpb24gcGxlYXNlISBJZiBwcmlvcml0eSBpcyBoaWdoLCB0aGUgcXVldWVkIGRhdGEKICogICAgc2VnbWVudHMsIGlmIGFueSwgd2lsbCBiZSBkZWFsbG9jYXRlZCBmaXJzdAogKgogKi8KaW50IGlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhLAoJCQkgICAgIGludCBwcmlvcml0eSkKewoJaW50IHJldDsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiAtMTspOwoKCS8qIEFscmVhZHkgZGlzY29ubmVjdGVkPyAqLwoJaWYgKCFzZWxmLT5jb25uZWN0ZWQpIHsKCQlJUkRBX0RFQlVHKDQsICIlcygpLCBhbHJlYWR5IGRpc2Nvbm5lY3RlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJaWYgKHVzZXJkYXRhKQoJCQlkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsKCQlyZXR1cm4gLTE7Cgl9CgoJLyogRGlzY29ubmVjdCBhbHJlYWR5IHBlbmRpbmcgPwoJICogV2UgbmVlZCB0byB1c2UgYW4gYXRvbWljIG9wZXJhdGlvbiB0byBwcmV2ZW50IHJlZW50cnkuIFRoaXMKCSAqIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSB2YXJpb3VzIGNvbnRleHQsIGxpa2UgdXNlciwgdGltZXIKCSAqIGZvciBmb2xsb3dpbmcgYSBkaXNjb25uZWN0X2luZGljYXRpb24oKSAoaS5lLiBuZXRfYmgpLgoJICogSmVhbiBJSSAqLwoJaWYodGVzdF9hbmRfc2V0X2JpdCgwLCAmc2VsZi0+ZGlzY29ubmVjdF9wZW5kKSkgewoJCUlSREFfREVCVUcoMCwgIiVzKCksIGRpc2Nvbm5lY3QgYWxyZWFkeSBwZW5kaW5nXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18pOwoJCWlmICh1c2VyZGF0YSkKCQkJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CgoJCS8qIFRyeSB0byBtYWtlIHNvbWUgcHJvZ3Jlc3MgKi8KCQlpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CgkJcmV0dXJuIC0xOwoJfQoKCS8qCgkgKiAgQ2hlY2sgaWYgdGhlcmUgaXMgc3RpbGwgZGF0YSBzZWdtZW50cyBpbiB0aGUgdHJhbnNtaXQgcXVldWUKCSAqLwoJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4X3F1ZXVlKSkgewoJCWlmIChwcmlvcml0eSA9PSBQX0hJR0gpIHsKCQkJLyoKCQkJICogIE5vIG5lZWQgdG8gc2VuZCB0aGUgcXVldWVkIGRhdGEsIGlmIHdlIGFyZQoJCQkgKiAgZGlzY29ubmVjdGluZyByaWdodCBub3cgc2luY2UgdGhlIGRhdGEgd2lsbAoJCQkgKiAgbm90IGhhdmUgYW55IHVzYWJsZSBjb25uZWN0aW9uIHRvIGJlIHNlbnQgb24KCQkJICovCgkJCUlSREFfREVCVUcoMSwgIiVzKCk6IEhpZ2ggcHJpb3JpdHkhISgpXG4iLCBfX0ZVTkNUSU9OX18pOwoJCQlpcnR0cF9mbHVzaF9xdWV1ZXMoc2VsZik7CgkJfSBlbHNlIGlmIChwcmlvcml0eSA9PSBQX05PUk1BTCkgewoJCQkvKgoJCQkgKiAgTXVzdCBkZWxheSBkaXNjb25uZWN0IHVudGlsIGFmdGVyIGFsbCBkYXRhIHNlZ21lbnRzCgkJCSAqICBoYXZlIGJlZW4gc2VudCBhbmQgdGhlIHR4X3F1ZXVlIGlzIGVtcHR5CgkJCSAqLwoJCQkvKiBXZSdsbCByZXVzZSB0aGlzIG9uZSBsYXRlciBmb3IgdGhlIGRpc2Nvbm5lY3QgKi8KCQkJc2VsZi0+ZGlzY29ubmVjdF9za2IgPSB1c2VyZGF0YTsgIC8qIE1heSBiZSBOVUxMICovCgoJCQlpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CgoJCQlpcnR0cF9zdGFydF90b2RvX3RpbWVyKHNlbGYsIEhaLzEwKTsKCQkJcmV0dXJuIC0xOwoJCX0KCX0KCS8qIE5vdGUgOiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGlmIHNlbGYtPnJ4X3F1ZXVlIGlzIGZ1bGwgYW5kIHRoZQoJICogc3RhdGUgb2Ygc2VsZi0+cnhfc2R1X2J1c3kgYmVjYXVzZSB0aGUgZGlzY29ubmVjdCByZXNwb25zZSB3aWxsCgkgKiBiZSBzZW50IGF0IHRoZSBMTVAgbGV2ZWwgKHNvIGV2ZW4gaWYgdGhlIHBlZXIgaGFzIGl0cyBUeCBxdWV1ZQoJICogZnVsbCBvZiBkYXRhKS4gLSBKZWFuIElJICovCgoJSVJEQV9ERUJVRygxLCAiJXMoKSwgRGlzY29ubmVjdGluZyAuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CglzZWxmLT5jb25uZWN0ZWQgPSBGQUxTRTsKCglpZiAoIXVzZXJkYXRhKSB7CgkJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKCQl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKCQlpZiAoIXR4X3NrYikKCQkJcmV0dXJuIC1FTk9NRU07CgoJCS8qCgkJICogIFJlc2VydmUgc3BhY2UgZm9yIE1VWCBhbmQgTEFQIGhlYWRlcgoJCSAqLwoJCXNrYl9yZXNlcnZlKHR4X3NrYiwgVFRQX01BWF9IRUFERVIpOwoKCQl1c2VyZGF0YSA9IHR4X3NrYjsKCX0KCXJldCA9IGlybG1wX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5sc2FwLCB1c2VyZGF0YSk7CgoJLyogVGhlIGRpc2Nvbm5lY3QgaXMgbm8gbG9uZ2VyIHBlbmRpbmcgKi8KCWNsZWFyX2JpdCgwLCAmc2VsZi0+ZGlzY29ubmVjdF9wZW5kKTsJLyogRkFMU0UgKi8KCglyZXR1cm4gcmV0Owp9CkVYUE9SVF9TWU1CT0woaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlydHRwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoc2VsZiwgcmVhc29uKQogKgogKiAgICBEaXNjb25uZWN0IGluZGljYXRpb24sIFRTQVAgZGlzY29ubmVjdGVkIGJ5IHBlZXI/CiAqCiAqLwp2b2lkIGlydHRwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCBMTV9SRUFTT04gcmVhc29uLAoJCQkJIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCB0c2FwX2NiICpzZWxmOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwoKCS8qIFByZXZlbnQgaGlnaGVyIGxheWVyIHRvIHNlbmQgbW9yZSBkYXRhICovCglzZWxmLT5jb25uZWN0ZWQgPSBGQUxTRTsKCgkvKiBDaGVjayBpZiBjbGllbnQgaGFzIGFscmVhZHkgdHJpZWQgdG8gY2xvc2UgdGhlIFRTQVAgKi8KCWlmIChzZWxmLT5jbG9zZV9wZW5kKSB7CgkJLyogSW4gdGhpcyBjYXNlLCB0aGUgaGlnaGVyIGxheWVyIGlzIHByb2JhYmx5IGdvbmUuIERvbid0CgkJICogYm90aGVyIGl0IGFuZCBjbGVhbiB1cCB0aGUgcmVtYWlucyAtIEplYW4gSUkgKi8KCQlpZiAoc2tiKQoJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkJaXJ0dHBfY2xvc2VfdHNhcChzZWxmKTsKCQlyZXR1cm47Cgl9CgoJLyogSWYgd2UgYXJlIGhlcmUsIHdlIGFzc3VtZSB0aGF0IGlzIHRoZSBoaWdoZXIgbGF5ZXIgaXMgc3RpbGwKCSAqIHdhaXRpbmcgZm9yIHRoZSBkaXNjb25uZWN0IG5vdGlmaWNhdGlvbiBhbmQgYWJsZSB0byBwcm9jZXNzIGl0LAoJICogZXZlbiBpZiBoZSB0cmllZCB0byBkaXNjb25uZWN0LiBPdGhlcndpc2UsIGl0IHdvdWxkIGhhdmUgYWxyZWFkeQoJICogYXR0ZW1wdGVkIHRvIGNsb3NlIHRoZSB0c2FwIGFuZCBzZWxmLT5jbG9zZV9wZW5kIHdvdWxkIGJlIFRSVUUuCgkgKiBKZWFuIElJICovCgoJLyogTm8gbmVlZCB0byBub3RpZnkgdGhlIGNsaWVudCBpZiBoYXMgYWxyZWFkeSB0cmllZCB0byBkaXNjb25uZWN0ICovCglpZihzZWxmLT5ub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uKQoJCXNlbGYtPm5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLAoJCQkJCQkgICByZWFzb24sIHNrYik7CgllbHNlCgkJaWYgKHNrYikKCQkJZGV2X2tmcmVlX3NrYihza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcnR0cF9kb19kYXRhX2luZGljYXRpb24gKHNlbGYsIHNrYikKICoKICogICAgVHJ5IHRvIGRlbGl2ZXIgcmVhc3NlbWJsZWQgc2tiIHRvIGxheWVyIGFib3ZlLCBhbmQgcmVxdWV1ZSBpdCBpZiB0aGF0CiAqICAgIGZvciBzb21lIHJlYXNvbiBzaG91bGQgZmFpbC4gV2UgbWFyayByeCBzZHUgYXMgYnVzeSB0byBhcHBseSBiYWNrCiAqICAgIHByZXNzdXJlIGlzIG5lY2Vzc2FyeS4KICovCnN0YXRpYyB2b2lkIGlydHRwX2RvX2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJaW50IGVycjsKCgkvKiBDaGVjayBpZiBjbGllbnQgaGFzIGFscmVhZHkgY2xvc2VkIHRoZSBUU0FQIGFuZCBnb25lIGF3YXkgKi8KCWlmIChzZWxmLT5jbG9zZV9wZW5kKSB7CgkJZGV2X2tmcmVlX3NrYihza2IpOwoJCXJldHVybjsKCX0KCgllcnIgPSBzZWxmLT5ub3RpZnkuZGF0YV9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwgc2tiKTsKCgkvKiBVc3VhbGx5IHRoZSBsYXllciBhYm92ZSB3aWxsIG5vdGlmeSB0aGF0IGl0J3MgaW5wdXQgcXVldWUgaXMKCSAqIHN0YXJ0aW5nIHRvIGdldCBmaWxsZWQgYnkgdXNpbmcgdGhlIGZsb3cgcmVxdWVzdCwgYnV0IHRoaXMgbWF5CgkgKiBiZSBkaWZmaWN1bHQsIHNvIGl0IGNhbiBpbnN0ZWFkIGp1c3QgcmVmdXNlIHRvIGVhdCBpdCBhbmQganVzdAoJICogZ2l2ZSBhbiBlcnJvciBiYWNrCgkgKi8KCWlmIChlcnIpIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpIHJlcXVldWVpbmcgc2tiIVxuIiwgX19GVU5DVElPTl9fKTsKCgkJLyogTWFrZSBzdXJlIHdlIHRha2UgYSBicmVhayAqLwoJCXNlbGYtPnJ4X3NkdV9idXN5ID0gVFJVRTsKCgkJLyogTmVlZCB0byBwdXNoIHRoZSBoZWFkZXIgaW4gYWdhaW4gKi8KCQlza2JfcHVzaChza2IsIFRUUF9IRUFERVIpOwoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIE1ha2Ugc3VyZSBNT1JFIGJpdCBpcyBjbGVhcmVkICovCgoJCS8qIFB1dCBza2IgYmFjayBvbiBxdWV1ZSAqLwoJCXNrYl9xdWV1ZV9oZWFkKCZzZWxmLT5yeF9xdWV1ZSwgc2tiKTsKCX0KfQoKLyoKICogRnVuY3Rpb24gaXJ0dHBfcnVuX3J4X3F1ZXVlIChzZWxmKQogKgogKiAgICAgQ2hlY2sgaWYgd2UgaGF2ZSBhbnkgZnJhbWVzIHRvIGJlIHRyYW5zbWl0dGVkLCBvciBpZiB3ZSBoYXZlIGFueQogKiAgICAgYXZhaWxhYmxlIGNyZWRpdCB0byBnaXZlIGF3YXkuCiAqLwp2b2lkIGlydHRwX3J1bl9yeF9xdWV1ZShzdHJ1Y3QgdHNhcF9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCWludCBtb3JlID0gMDsKCglJUkRBX0RFQlVHKDIsICIlcygpIHNlbmQ9JWQsYXZhaWw9JWQscmVtb3RlPSVkXG4iLCBfX0ZVTkNUSU9OX18sCgkJICAgc2VsZi0+c2VuZF9jcmVkaXQsIHNlbGYtPmF2YWlsX2NyZWRpdCwgc2VsZi0+cmVtb3RlX2NyZWRpdCk7CgoJLyogR2V0IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIHJ4IHF1ZXVlLCBvdGhlcndpc2UgZG9uJ3QgdG91Y2ggaXQgKi8KCWlmIChpcmRhX2xvY2soJnNlbGYtPnJ4X3F1ZXVlX2xvY2spID09IEZBTFNFKQoJCXJldHVybjsKCgkvKgoJICogIFJlYXNzZW1ibGUgYWxsIGZyYW1lcyBpbiByZWNlaXZlIHF1ZXVlIGFuZCBkZWxpdmVyIHRoZW0KCSAqLwoJd2hpbGUgKCFzZWxmLT5yeF9zZHVfYnVzeSAmJiAoc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnJ4X3F1ZXVlKSkpIHsKCQkvKiBUaGlzIGJpdCB3aWxsIHRlbGwgdXMgaWYgaXQncyB0aGUgbGFzdCBmcmFnbWVudCBvciBub3QgKi8KCQltb3JlID0gc2tiLT5kYXRhWzBdICYgMHg4MDsKCgkJLyogUmVtb3ZlIFRUUCBoZWFkZXIgKi8KCQlza2JfcHVsbChza2IsIFRUUF9IRUFERVIpOwoKCQkvKiBBZGQgdGhlIGxlbmd0aCBvZiB0aGUgcmVtYWluaW5nIGRhdGEgKi8KCQlzZWxmLT5yeF9zZHVfc2l6ZSArPSBza2ItPmxlbjsKCgkJLyoKCQkgKiBJZiBTQVIgaXMgZGlzYWJsZWQsIG9yIHVzZXIgaGFzIHJlcXVlc3RlZCBubyByZWFzc2VtYmx5CgkJICogb2YgcmVjZWl2ZWQgZnJhZ21lbnRzIHRoZW4gd2UganVzdCBkZWxpdmVyIHRoZW0KCQkgKiBpbW1lZGlhdGVseS4gVGhpcyBjYW4gYmUgcmVxdWVzdGVkIGJ5IGNsaWVudHMgdGhhdAoJCSAqIGltcGxlbWVudHMgYnl0ZSBzdHJlYW1zIHdpdGhvdXQgYW55IG1lc3NhZ2UgYm91bmRhcmllcwoJCSAqLwoJCWlmIChzZWxmLT5yeF9tYXhfc2R1X3NpemUgPT0gVFRQX1NBUl9ESVNBQkxFKSB7CgkJCWlydHRwX2RvX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IpOwoJCQlzZWxmLT5yeF9zZHVfc2l6ZSA9IDA7CgoJCQljb250aW51ZTsKCQl9CgoJCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBmcmFnbWVudCwgYW5kIG5vdCB0aGUgbGFzdCBmcmFnbWVudCAqLwoJCWlmIChtb3JlKSB7CgkJCS8qCgkJCSAqICBRdWV1ZSB0aGUgZnJhZ21lbnQgaWYgd2Ugc3RpbGwgYXJlIHdpdGhpbiB0aGUKCQkJICogIGxpbWl0cyBvZiB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSByeF9zZHUKCQkJICovCgkJCWlmIChzZWxmLT5yeF9zZHVfc2l6ZSA8PSBzZWxmLT5yeF9tYXhfc2R1X3NpemUpIHsKCQkJCUlSREFfREVCVUcoNCwgIiVzKCksIHF1ZXVlaW5nIGZyYWdcbiIsCgkJCQkJICAgX19GVU5DVElPTl9fKTsKCQkJCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT5yeF9mcmFnbWVudHMsIHNrYik7CgkJCX0gZWxzZSB7CgkJCQkvKiBGcmVlIHRoZSBwYXJ0IG9mIHRoZSBTRFUgdGhhdCBpcyB0b28gYmlnICovCgkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkJCX0KCQkJY29udGludWU7CgkJfQoJCS8qCgkJICogIFRoaXMgaXMgdGhlIGxhc3QgZnJhZ21lbnQsIHNvIHRpbWUgdG8gcmVhc3NlbWJsZSEKCQkgKi8KCQlpZiAoKHNlbGYtPnJ4X3NkdV9zaXplIDw9IHNlbGYtPnJ4X21heF9zZHVfc2l6ZSkgfHwKCQkgICAgKHNlbGYtPnJ4X21heF9zZHVfc2l6ZSA9PSBUVFBfU0FSX1VOQk9VTkQpKQoJCXsKCQkJLyoKCQkJICogQSBsaXR0bGUgb3B0aW1pemluZy4gT25seSBxdWV1ZSB0aGUgZnJhZ21lbnQgaWYKCQkJICogdGhlcmUgYXJlIG90aGVyIGZyYWdtZW50cy4gU2luY2UgaWYgdGhpcyBpcyB0aGUKCQkJICogbGFzdCBhbmQgb25seSBmcmFnbWVudCwgdGhlcmUgaXMgbm8gbmVlZCB0bwoJCQkgKiByZWFzc2VtYmxlIDotKQoJCQkgKi8KCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnJ4X2ZyYWdtZW50cykpIHsKCQkJCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT5yeF9mcmFnbWVudHMsCgkJCQkJICAgICAgIHNrYik7CgoJCQkJc2tiID0gaXJ0dHBfcmVhc3NlbWJsZV9za2Ioc2VsZik7CgkJCX0KCgkJCS8qIE5vdyB3ZSBjYW4gZGVsaXZlciB0aGUgcmVhc3NlbWJsZWQgc2tiICovCgkJCWlydHRwX2RvX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IpOwoJCX0gZWxzZSB7CgkJCUlSREFfREVCVUcoMSwgIiVzKCksIFRydW5jYXRlZCBmcmFtZVxuIiwgX19GVU5DVElPTl9fKTsKCgkJCS8qIEZyZWUgdGhlIHBhcnQgb2YgdGhlIFNEVSB0aGF0IGlzIHRvbyBiaWcgKi8KCQkJZGV2X2tmcmVlX3NrYihza2IpOwoKCQkJLyogRGVsaXZlciBvbmx5IHRoZSB2YWxpZCBidXQgdHJ1bmNhdGVkIHBhcnQgb2YgU0RVICovCgkJCXNrYiA9IGlydHRwX3JlYXNzZW1ibGVfc2tiKHNlbGYpOwoKCQkJaXJ0dHBfZG9fZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CgkJfQoJCXNlbGYtPnJ4X3NkdV9zaXplID0gMDsKCX0KCgkvKgoJICogSXQncyBub3QgdHJpdmlhbCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGNyZWRpdHMgYXJlIGF2YWlsYWJsZQoJICogYnkgaW5jcmVtZW50aW5nIGF0IGVhY2ggcGFja2V0LCBiZWNhdXNlIGRlbGl2ZXJ5IG1heSBmYWlsCgkgKiAoaXJ0dHBfZG9fZGF0YV9pbmRpY2F0aW9uKCkgbWF5IHJlcXVldWUgdGhlIGZyYW1lKSBhbmQgYmVjYXVzZQoJICogd2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgZnJhZ21lbnRhdGlvbi4KCSAqIFdlIHdhbnQgdGhlIG90aGVyIHNpZGUgdG8gc2VuZCB1cCB0byBpbml0aWFsX2NyZWRpdCBwYWNrZXRzLgoJICogV2UgaGF2ZSBzb21lIGZyYW1lcyBpbiBvdXIgcXVldWVzLCBhbmQgd2UgaGF2ZSBhbHJlYWR5IGFsbG93ZWQgaXQKCSAqIHRvIHNlbmQgcmVtb3RlX2NyZWRpdC4KCSAqIE5vIG5lZWQgdG8gc3BpbmxvY2ssIHdyaXRlIGlzIGF0b21pYyBhbmQgc2VsZiBjb3JyZWN0aW5nLi4uCgkgKiBKZWFuIElJCgkgKi8KCXNlbGYtPmF2YWlsX2NyZWRpdCA9IChzZWxmLT5pbml0aWFsX2NyZWRpdCAtCgkJCSAgICAgIChzZWxmLT5yZW1vdGVfY3JlZGl0ICsKCQkJICAgICAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnJ4X3F1ZXVlKSArCgkJCSAgICAgICBza2JfcXVldWVfbGVuKCZzZWxmLT5yeF9mcmFnbWVudHMpKSk7CgoJLyogRG8gd2UgaGF2ZSB0b28gbXVjaCBjcmVkaXRzIHRvIHNlbmQgdG8gcGVlciA/ICovCglpZiAoKHNlbGYtPnJlbW90ZV9jcmVkaXQgPD0gVFRQX1JYX01JTl9DUkVESVQpICYmCgkgICAgKHNlbGYtPmF2YWlsX2NyZWRpdCA+IDApKSB7CgkJLyogU2VuZCBleHBsaWNpdCBjcmVkaXQgZnJhbWUgKi8KCQlpcnR0cF9naXZlX2NyZWRpdChzZWxmKTsKCQkvKiBOb3RlIDogZG8gKk5PVCogY2hlY2sgaWYgdHhfcXVldWUgaXMgbm9uLWVtcHR5LCB0aGF0CgkJICogd2lsbCBwcm9kdWNlIGRlYWRsb2Nrcy4gSSByZXBlYXQgOiBzZW5kIGEgY3JlZGl0IGZyYW1lCgkJICogZXZlbiBpZiB3ZSBoYXZlIHNvbWV0aGluZyB0byBzZW5kIGluIG91ciBUeCBxdWV1ZS4KCQkgKiBJZiB3ZSBoYXZlIGNyZWRpdHMsIGl0IG1lYW5zIHRoYXQgb3VyIFR4IHF1ZXVlIGlzIGJsb2NrZWQuCgkJICoKCQkgKiBMZXQncyBzdXBwb3NlIHRoZSBwZWVyIGNhbid0IGtlZXAgdXAgd2l0aCBvdXIgVHguIEhlIHdpbGwKCQkgKiBmbG93IGNvbnRyb2wgdXMgYnkgbm90IHNlbmRpbmcgdXMgYW55IGNyZWRpdHMsIGFuZCB3ZQoJCSAqIHdpbGwgc3RvcCBUeCBhbmQgc3RhcnQgYWNjdW11bGF0aW5nIGNyZWRpdHMgaGVyZS4KCQkgKiBVcCB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIHBlZXIgd2lsbCBzdG9wIGl0cyBUeCBxdWV1ZSwKCQkgKiBmb3IgbGFjayBvZiBjcmVkaXRzLgoJCSAqIExldCdzIGFzc3VtZSB0aGUgcGVlciBhcHBsaWNhdGlvbiBpcyBzaW5nbGUgdGhyZWFkZWQuCgkJICogSXQgd2lsbCBibG9jayBvbiBUeCBhbmQgbmV2ZXIgY29uc3VtZSBhbnkgUnggYnVmZmVyLgoJCSAqIERlYWRsb2NrLiBHdWFyYW50ZWVkLiAtIEplYW4gSUkKCQkgKi8KCX0KCgkvKiBSZXNldCBsb2NrICovCglzZWxmLT5yeF9xdWV1ZV9sb2NrID0gMDsKfQoKI2lmZGVmIENPTkZJR19QUk9DX0ZTCnN0cnVjdCBpcnR0cF9pdGVyX3N0YXRlIHsKCWludCBpZDsKfTsKCnN0YXRpYyB2b2lkICppcnR0cF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQp7CglzdHJ1Y3QgaXJ0dHBfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKCXN0cnVjdCB0c2FwX2NiICpzZWxmOwoKCS8qIFByb3RlY3Qgb3VyIGFjY2VzcyB0byB0aGUgdHNhcCBsaXN0ICovCglzcGluX2xvY2tfaXJxKCZpcnR0cC0+dHNhcHMtPmhiX3NwaW5sb2NrKTsKCWl0ZXItPmlkID0gMDsKCglmb3IgKHNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJ0dHAtPnRzYXBzKTsgCgkgICAgIHNlbGYgIT0gTlVMTDsKCSAgICAgc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBoYXNoYmluX2dldF9uZXh0KGlydHRwLT50c2FwcykpIHsKCQlpZiAoaXRlci0+aWQgPT0gKnBvcykKCQkJYnJlYWs7CgkJKytpdGVyLT5pZDsKCX0KCQkKCXJldHVybiBzZWxmOwp9CgpzdGF0aWMgdm9pZCAqaXJ0dHBfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQp7CglzdHJ1Y3QgaXJ0dHBfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKCgkrKypwb3M7CgkrK2l0ZXItPmlkOwoJcmV0dXJuICh2b2lkICopIGhhc2hiaW5fZ2V0X25leHQoaXJ0dHAtPnRzYXBzKTsKfQoKc3RhdGljIHZvaWQgaXJ0dHBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXNwaW5fdW5sb2NrX2lycSgmaXJ0dHAtPnRzYXBzLT5oYl9zcGlubG9jayk7Cn0KCnN0YXRpYyBpbnQgaXJ0dHBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCWNvbnN0IHN0cnVjdCBpcnR0cF9pdGVyX3N0YXRlICppdGVyID0gc2VxLT5wcml2YXRlOwoJY29uc3Qgc3RydWN0IHRzYXBfY2IgKnNlbGYgPSB2OwoKCXNlcV9wcmludGYoc2VxLCAiVFNBUCAlZCwgIiwgaXRlci0+aWQpOwoJc2VxX3ByaW50ZihzZXEsICJzdHNhcF9zZWw6ICUwMngsICIsCgkJICAgc2VsZi0+c3RzYXBfc2VsKTsKCXNlcV9wcmludGYoc2VxLCAiZHRzYXBfc2VsOiAlMDJ4XG4iLAoJCSAgIHNlbGYtPmR0c2FwX3NlbCk7CglzZXFfcHJpbnRmKHNlcSwgIiAgY29ubmVjdGVkOiAlcywgIiwKCQkgICBzZWxmLT5jb25uZWN0ZWQ/ICJUUlVFIjoiRkFMU0UiKTsKCXNlcV9wcmludGYoc2VxLCAiYXZhaWwgY3JlZGl0OiAlZCwgIiwKCQkgICBzZWxmLT5hdmFpbF9jcmVkaXQpOwoJc2VxX3ByaW50ZihzZXEsICJyZW1vdGUgY3JlZGl0OiAlZCwgIiwKCQkgICBzZWxmLT5yZW1vdGVfY3JlZGl0KTsKCXNlcV9wcmludGYoc2VxLCAic2VuZCBjcmVkaXQ6ICVkXG4iLAoJCSAgIHNlbGYtPnNlbmRfY3JlZGl0KTsKCXNlcV9wcmludGYoc2VxLCAiICB0eCBwYWNrZXRzOiAlbGQsICIsCgkJICAgc2VsZi0+c3RhdHMudHhfcGFja2V0cyk7CglzZXFfcHJpbnRmKHNlcSwgInJ4IHBhY2tldHM6ICVsZCwgIiwKCQkgICBzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKTsKCXNlcV9wcmludGYoc2VxLCAidHhfcXVldWUgbGVuOiAlZCAiLAoJCSAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4X3F1ZXVlKSk7CglzZXFfcHJpbnRmKHNlcSwgInJ4X3F1ZXVlIGxlbjogJWRcbiIsCgkJICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+cnhfcXVldWUpKTsKCXNlcV9wcmludGYoc2VxLCAiICB0eF9zZHVfYnVzeTogJXMsICIsCgkJICAgc2VsZi0+dHhfc2R1X2J1c3k/ICJUUlVFIjoiRkFMU0UiKTsKCXNlcV9wcmludGYoc2VxLCAicnhfc2R1X2J1c3k6ICVzXG4iLAoJCSAgIHNlbGYtPnJ4X3NkdV9idXN5PyAiVFJVRSI6IkZBTFNFIik7CglzZXFfcHJpbnRmKHNlcSwgIiAgbWF4X3NlZ19zaXplOiAlZCwgIiwKCQkgICBzZWxmLT5tYXhfc2VnX3NpemUpOwoJc2VxX3ByaW50ZihzZXEsICJ0eF9tYXhfc2R1X3NpemU6ICVkLCAiLAoJCSAgIHNlbGYtPnR4X21heF9zZHVfc2l6ZSk7CglzZXFfcHJpbnRmKHNlcSwgInJ4X21heF9zZHVfc2l6ZTogJWRcbiIsCgkJICAgc2VsZi0+cnhfbWF4X3NkdV9zaXplKTsKCglzZXFfcHJpbnRmKHNlcSwgIiAgVXNlZCBieSAoJXMpXG5cbiIsCgkJICAgc2VsZi0+bm90aWZ5Lm5hbWUpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXJ0dHBfc2VxX29wcyA9IHsKCS5zdGFydCAgPSBpcnR0cF9zZXFfc3RhcnQsCgkubmV4dCAgID0gaXJ0dHBfc2VxX25leHQsCgkuc3RvcCAgID0gaXJ0dHBfc2VxX3N0b3AsCgkuc2hvdyAgID0gaXJ0dHBfc2VxX3Nob3csCn07CgpzdGF0aWMgaW50IGlydHRwX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKCWludCByYyA9IC1FTk9NRU07CglzdHJ1Y3QgaXJ0dHBfaXRlcl9zdGF0ZSAqczsKCglzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKCWlmICghcykKCQlnb3RvIG91dDsKCglyYyA9IHNlcV9vcGVuKGZpbGUsICZpcnR0cF9zZXFfb3BzKTsKCWlmIChyYykKCQlnb3RvIG91dF9rZnJlZTsKCglzZXEJICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCXNlcS0+cHJpdmF0ZSA9IHM7CgltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7Cm91dDoKCXJldHVybiByYzsKb3V0X2tmcmVlOgoJa2ZyZWUocyk7Cglnb3RvIG91dDsKfQoKc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcnR0cF9zZXFfZm9wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5vcGVuICAgICAgICAgICA9IGlydHRwX3NlcV9vcGVuLAoJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCgkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCgkucmVsZWFzZQk9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCn07CgojZW5kaWYgLyogUFJPQ19GUyAqLwo=