LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmlhc19vYmplY3QuYwogKiBWZXJzaW9uOiAgICAgICAwLjMKICogRGVzY3JpcHRpb246ICAgSUFTIG9iamVjdCBkYXRhYmFzZSBhbmQgZnVuY3Rpb25zCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBUaHUgT2N0ICAxIDIyOjUwOjA0IDE5OTgKICogTW9kaWZpZWQgYXQ6ICAgV2VkIERlYyAxNSAxMToyMzoxNiAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CgpoYXNoYmluX3QgKmlyaWFzX29iamVjdHM7CgovKgogKiAgVXNlZCB3aGVuIGEgbWlzc2luZyB2YWx1ZSBuZWVkcyB0byBiZSByZXR1cm5lZAogKi8Kc3RydWN0IGlhc192YWx1ZSBpcmlhc19taXNzaW5nID0geyBJQVNfTUlTU0lORywgMCwgMCwgMCwgezB9fTsKCi8qCiAqIEZ1bmN0aW9uIHN0cm5kdXAgKHN0ciwgbWF4KQogKgogKiAgICBNeSBvd24ga2VybmVsIHZlcnNpb24gb2Ygc3RybmR1cCEKICoKICogRmFzdGVyLCBjaGVjayBib3VuZGFyeS4uLiBKZWFuIElJCiAqLwpzdGF0aWMgY2hhciAqc3RybmR1cChjaGFyICpzdHIsIGludCBtYXgpCnsKCWNoYXIgKm5ld19zdHI7CglpbnQgbGVuOwoKCS8qIENoZWNrIHN0cmluZyAqLwoJaWYgKHN0ciA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoJLyogQ2hlY2sgbGVuZ3RoLCB0cnVuY2F0ZSAqLwoJbGVuID0gc3RybGVuKHN0cik7CglpZihsZW4gPiBtYXgpCgkJbGVuID0gbWF4OwoKCS8qIEFsbG9jYXRlIG5ldyBzdHJpbmcgKi8KICAgICAgICBuZXdfc3RyID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfQVRPTUlDKTsKICAgICAgICBpZiAobmV3X3N0ciA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qIENvcHkgYW5kIHRydW5jYXRlICovCgltZW1jcHkobmV3X3N0ciwgc3RyLCBsZW4pOwoJbmV3X3N0cltsZW5dID0gJ1wwJzsKCglyZXR1cm4gbmV3X3N0cjsKfQoKLyoKICogRnVuY3Rpb24gaWFzX25ld19vYmplY3QgKG5hbWUsIGlkKQogKgogKiAgICBDcmVhdGUgYSBuZXcgSUFTIG9iamVjdAogKgogKi8Kc3RydWN0IGlhc19vYmplY3QgKmlyaWFzX25ld19vYmplY3QoIGNoYXIgKm5hbWUsIGludCBpZCkKewogICAgICAgIHN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CgoJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlhc19vYmplY3QpLCBHRlBfQVRPTUlDKTsKCWlmIChvYmogPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXMoKSwgVW5hYmxlIHRvIGFsbG9jYXRlIG9iamVjdCFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglvYmotPm1hZ2ljID0gSUFTX09CSkVDVF9NQUdJQzsKCW9iai0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9DTEFTU05BTUUpOwoJb2JqLT5pZCA9IGlkOwoKCS8qIExvY2tpbmcgbm90ZXMgOiB0aGUgYXR0cmliIHNwaW5sb2NrIGhhcyBsb3dlciBwcmVjZW5kZW5jZQoJICogdGhhbiB0aGUgb2JqZWN0cyBzcGlubG9jay4gTmV2ZXIgZ3JhcCB0aGUgb2JqZWN0cyBzcGlubG9jawoJICogd2hpbGUgaG9sZGluZyBhbnkgYXR0cmliIHNwaW5sb2NrIChyaXNrIG9mIGRlYWRsb2NrKS4gSmVhbiBJSSAqLwoJb2JqLT5hdHRyaWJzID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CgoJaWYgKG9iai0+YXR0cmlicyA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlcygpLCBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlicyFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlrZnJlZShvYmopOwoJCXJldHVybiBOVUxMOwoJfQoKCXJldHVybiBvYmo7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19uZXdfb2JqZWN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2RlbGV0ZV9hdHRyaWIgKGF0dHJpYikKICoKICogICAgRGVsZXRlIGdpdmVuIGF0dHJpYnV0ZSBhbmQgZGVhbGxvY2F0ZSBhbGwgaXRzIG1lbW9yeQogKgogKi8Kc3RhdGljIHZvaWQgX19pcmlhc19kZWxldGVfYXR0cmliKHN0cnVjdCBpYXNfYXR0cmliICphdHRyaWIpCnsKCUlSREFfQVNTRVJUKGF0dHJpYiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKGF0dHJpYi0+bWFnaWMgPT0gSUFTX0FUVFJJQl9NQUdJQywgcmV0dXJuOyk7CgoJa2ZyZWUoYXR0cmliLT5uYW1lKTsKCglpcmlhc19kZWxldGVfdmFsdWUoYXR0cmliLT52YWx1ZSk7CglhdHRyaWItPm1hZ2ljID0gfklBU19BVFRSSUJfTUFHSUM7CgoJa2ZyZWUoYXR0cmliKTsKfQoKdm9pZCBfX2lyaWFzX2RlbGV0ZV9vYmplY3Qoc3RydWN0IGlhc19vYmplY3QgKm9iaikKewoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCglrZnJlZShvYmotPm5hbWUpOwoKCWhhc2hiaW5fZGVsZXRlKG9iai0+YXR0cmlicywgKEZSRUVfRlVOQykgX19pcmlhc19kZWxldGVfYXR0cmliKTsKCglvYmotPm1hZ2ljID0gfklBU19PQkpFQ1RfTUFHSUM7CgoJa2ZyZWUob2JqKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfZGVsZXRlX29iamVjdCAob2JqKQogKgogKiAgICBSZW1vdmUgb2JqZWN0IGZyb20gaGFzaGJpbiBhbmQgZGVhbGxvY2F0ZSBhbGwgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGgKICogICAgd2l0aCB0aGlzIG9iamVjdCBhbmQgdGhlIG9iamVjdCBpdHNlbGYKICoKICovCmludCBpcmlhc19kZWxldGVfb2JqZWN0KHN0cnVjdCBpYXNfb2JqZWN0ICpvYmopCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpub2RlOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIC0xOyk7CgoJLyogUmVtb3ZlIGZyb20gbGlzdCAqLwoJbm9kZSA9IGhhc2hiaW5fcmVtb3ZlX3RoaXMoaXJpYXNfb2JqZWN0cywgKGlyZGFfcXVldWVfdCAqKSBvYmopOwoJaWYgKCFub2RlKQoJCUlSREFfREVCVUcoIDAsICIlcygpLCBvYmplY3QgYWxyZWFkeSByZW1vdmVkIVxuIiwKCQkJICAgIF9fRlVOQ1RJT05fXyk7CgoJLyogRGVzdHJveSAqLwoJX19pcmlhc19kZWxldGVfb2JqZWN0KG9iaik7CgoJcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19kZWxldGVfb2JqZWN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2RlbGV0ZV9hdHRyaWIgKG9iaikKICoKICogICAgUmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIGhhc2hiaW4gYW5kLCBpZiBpdCB3YXMgdGhlIGxhc3QgYXR0cmlidXRlIG9mCiAqICAgIHRoZSBvYmplY3QsIHJlbW92ZSB0aGUgb2JqZWN0IGFzIHdlbGwuCiAqCiAqLwppbnQgaXJpYXNfZGVsZXRlX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliLAoJCQlpbnQgY2xlYW5vYmplY3QpCnsKCXN0cnVjdCBpYXNfYXR0cmliICpub2RlOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChhdHRyaWIgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJLyogUmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIG9iamVjdCAqLwoJbm9kZSA9IGhhc2hiaW5fcmVtb3ZlX3RoaXMob2JqLT5hdHRyaWJzLCAoaXJkYV9xdWV1ZV90ICopIGF0dHJpYik7CglpZiAoIW5vZGUpCgkJcmV0dXJuIDA7IC8qIEFscmVhZHkgcmVtb3ZlZCBvciBub24tZXhpc3RlbnQgKi8KCgkvKiBEZWFsbG9jYXRlIGF0dHJpYnV0ZSAqLwoJX19pcmlhc19kZWxldGVfYXR0cmliKG5vZGUpOwoKCS8qIENoZWNrIGlmIG9iamVjdCBoYXMgc3RpbGwgc29tZSBhdHRyaWJ1dGVzLCBkZXN0cm95IGl0IGlmIG5vbmUuCgkgKiBBdCBmaXJzdCBnbGFuY2UsIHRoaXMgbG9vayBkYW5nZXJvdXMsIGFzIHRoZSBrZXJuZWwgcmVmZXJlbmNlCgkgKiB2YXJpb3VzIElBUyBvYmplY3RzLiBIb3dldmVyLCB3ZSBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIG9uCgkgKiB1c2VyIGF0dHJpYnV0ZXMsIG5vdCBrZXJuZWwgYXR0cmlidXRlcywgc28gdGhlcmUgaXMgbm8gcmlzawoJICogb2YgZGVsZXRpbmcgYSBrZXJuZWwgb2JqZWN0IHRoaXMgd2F5LiBKZWFuIElJICovCglub2RlID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGhhc2hiaW5fZ2V0X2ZpcnN0KG9iai0+YXR0cmlicyk7CglpZiAoY2xlYW5vYmplY3QgJiYgIW5vZGUpCgkJaXJpYXNfZGVsZXRlX29iamVjdChvYmopOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhc19pbnNlcnRfb2JqZWN0IChvYmopCiAqCiAqICAgIEluc2VydCBhbiBvYmplY3QgaW50byB0aGUgTE0tSUFTIGRhdGFiYXNlCiAqCiAqLwp2b2lkIGlyaWFzX2luc2VydF9vYmplY3Qoc3RydWN0IGlhc19vYmplY3QgKm9iaikKewoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCgloYXNoYmluX2luc2VydChpcmlhc19vYmplY3RzLCAoaXJkYV9xdWV1ZV90ICopIG9iaiwgMCwgb2JqLT5uYW1lKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2luc2VydF9vYmplY3QpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfZmluZF9vYmplY3QgKG5hbWUpCiAqCiAqICAgIEZpbmQgb2JqZWN0IHdpdGggZ2l2ZW4gbmFtZQogKgogKi8Kc3RydWN0IGlhc19vYmplY3QgKmlyaWFzX2ZpbmRfb2JqZWN0KGNoYXIgKm5hbWUpCnsKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCgkvKiBVbnNhZmUgKGxvY2tpbmcpLCBvYmplY3QgbWlnaHQgY2hhbmdlICovCglyZXR1cm4gaGFzaGJpbl9sb2NrX2ZpbmQoaXJpYXNfb2JqZWN0cywgMCwgbmFtZSk7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19maW5kX29iamVjdCk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19maW5kX2F0dHJpYiAob2JqLCBuYW1lKQogKgogKiAgICBGaW5kIG5hbWVkIGF0dHJpYnV0ZSBpbiBvYmplY3QKICoKICovCnN0cnVjdCBpYXNfYXR0cmliICppcmlhc19maW5kX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBjaGFyICpuYW1lKQp7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoKCWF0dHJpYiA9IGhhc2hiaW5fbG9ja19maW5kKG9iai0+YXR0cmlicywgMCwgbmFtZSk7CglpZiAoYXR0cmliID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CgoJLyogVW5zYWZlIChsb2NraW5nKSwgYXR0cmliIG1pZ2h0IGNoYW5nZSAqLwoJcmV0dXJuIGF0dHJpYjsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfYWRkX2F0dHJpYnV0ZSAob2JqLCBhdHRyaWIpCiAqCiAqICAgIEFkZCBhdHRyaWJ1dGUgdG8gb2JqZWN0CiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhc19hZGRfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIHN0cnVjdCBpYXNfYXR0cmliICphdHRyaWIsCgkJCSAgICAgaW50IG93bmVyKQp7CglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKGF0dHJpYiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKGF0dHJpYi0+bWFnaWMgPT0gSUFTX0FUVFJJQl9NQUdJQywgcmV0dXJuOyk7CgoJLyogU2V0IGlmIGF0dHJpYiBpcyBvd25lZCBieSBrZXJuZWwgb3IgdXNlciBzcGFjZSAqLwoJYXR0cmliLT52YWx1ZS0+b3duZXIgPSBvd25lcjsKCgloYXNoYmluX2luc2VydChvYmotPmF0dHJpYnMsIChpcmRhX3F1ZXVlX3QgKikgYXR0cmliLCAwLCBhdHRyaWItPm5hbWUpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhc19vYmplY3RfY2hhbmdlX2F0dHJpYnV0ZSAob2JqX25hbWUsIGF0dHJpYl9uYW1lLCBuZXdfdmFsdWUpCiAqCiAqICAgIENoYW5nZSB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0cyBhdHRyaWJ1dGUuCiAqCiAqLwppbnQgaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUoY2hhciAqb2JqX25hbWUsIGNoYXIgKmF0dHJpYl9uYW1lLAoJCQkJICBzdHJ1Y3QgaWFzX3ZhbHVlICpuZXdfdmFsdWUpCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgkvKiBGaW5kIG9iamVjdCAqLwoJb2JqID0gaGFzaGJpbl9sb2NrX2ZpbmQoaXJpYXNfb2JqZWN0cywgMCwgb2JqX25hbWUpOwoJaWYgKG9iaiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGZpbmQgb2JqZWN0OiAlc1xuIiwgX19GVU5DVElPTl9fLAoJCQkgICAgIG9ial9uYW1lKTsKCQlyZXR1cm4gLTE7Cgl9CgoJLyogU2xpZ2h0bHkgdW5zYWZlIChvYmogbWlnaHQgZ2V0IHJlbW92ZWQgdW5kZXIgdXMpICovCglzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoKCS8qIEZpbmQgYXR0cmlidXRlICovCglhdHRyaWIgPSBoYXNoYmluX2ZpbmQob2JqLT5hdHRyaWJzLCAwLCBhdHRyaWJfbmFtZSk7CglpZiAoYXR0cmliID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gZmluZCBhdHRyaWJ1dGU6ICVzXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXywgYXR0cmliX25hbWUpOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKCBhdHRyaWItPnZhbHVlLT50eXBlICE9IG5ld192YWx1ZS0+dHlwZSkgewoJCUlSREFfREVCVUcoIDAsICIlcygpLCBjaGFuZ2luZyB2YWx1ZSB0eXBlIG5vdCBhbGxvd2VkIVxuIiwKCQkJICAgIF9fRlVOQ1RJT05fXyk7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJCXJldHVybiAtMTsKCX0KCgkvKiBEZWxldGUgb2xkIHZhbHVlICovCglpcmlhc19kZWxldGVfdmFsdWUoYXR0cmliLT52YWx1ZSk7CgoJLyogSW5zZXJ0IG5ldyB2YWx1ZSAqLwoJYXR0cmliLT52YWx1ZSA9IG5ld192YWx1ZTsKCgkvKiBTdWNjZXNzICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CglyZXR1cm4gMDsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlKTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX29iamVjdF9hZGRfaW50ZWdlcl9hdHRyaWIgKG9iaiwgbmFtZSwgdmFsdWUpCiAqCiAqICAgIEFkZCBhbiBpbnRlZ2VyIGF0dHJpYnV0ZSB0byBhbiBMTS1JQVMgb2JqZWN0CiAqCiAqLwp2b2lkIGlyaWFzX2FkZF9pbnRlZ2VyX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUsCgkJCSAgICAgIGludCBvd25lcikKewoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm47KTsKCglhdHRyaWIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX2F0dHJpYiksIEdGUF9BVE9NSUMpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJYXR0cmliLT5tYWdpYyA9IElBU19BVFRSSUJfTUFHSUM7CglhdHRyaWItPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSk7CgoJLyogSW5zZXJ0IHZhbHVlICovCglhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUodmFsdWUpOwoKCWlyaWFzX2FkZF9hdHRyaWIob2JqLCBhdHRyaWIsIG93bmVyKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2FkZF9pbnRlZ2VyX2F0dHJpYik7CgogLyoKICogRnVuY3Rpb24gaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIgKG9iaiwgbmFtZSwgb2N0ZXRfc2VxLCBsZW4pCiAqCiAqICAgIEFkZCBhIG9jdGV0IHNlcXVlbmNlIGF0dHJpYnV0ZSB0byBhbiBMTS1JQVMgb2JqZWN0CiAqCiAqLwoKdm9pZCBpcmlhc19hZGRfb2N0c2VxX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBjaGFyICpuYW1lLCBfX3U4ICpvY3RldHMsCgkJCSAgICAgaW50IGxlbiwgaW50IG93bmVyKQp7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CgoJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9jdGV0cyAhPSBOVUxMLCByZXR1cm47KTsKCglhdHRyaWIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX2F0dHJpYiksIEdGUF9BVE9NSUMpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJYXR0cmliLT5tYWdpYyA9IElBU19BVFRSSUJfTUFHSUM7CglhdHRyaWItPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSk7CgoJYXR0cmliLT52YWx1ZSA9IGlyaWFzX25ld19vY3RzZXFfdmFsdWUoIG9jdGV0cywgbGVuKTsKCglpcmlhc19hZGRfYXR0cmliKG9iaiwgYXR0cmliLCBvd25lcik7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19hZGRfb2N0c2VxX2F0dHJpYik7CgovKgogKiBGdW5jdGlvbiBpcmlhc19vYmplY3RfYWRkX3N0cmluZ19hdHRyaWIgKG9iaiwgc3RyaW5nKQogKgogKiAgICBBZGQgYSBzdHJpbmcgYXR0cmlidXRlIHRvIGFuIExNLUlBUyBvYmplY3QKICoKICovCnZvaWQgaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgY2hhciAqbmFtZSwgY2hhciAqdmFsdWUsCgkJCSAgICAgaW50IG93bmVyKQp7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CgoJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHZhbHVlICE9IE5VTEwsIHJldHVybjspOwoKCWF0dHJpYiA9IGt6YWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgaWFzX2F0dHJpYiksIEdGUF9BVE9NSUMpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJYXR0cmliLT5tYWdpYyA9IElBU19BVFRSSUJfTUFHSUM7CglhdHRyaWItPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSk7CgoJYXR0cmliLT52YWx1ZSA9IGlyaWFzX25ld19zdHJpbmdfdmFsdWUodmFsdWUpOwoKCWlyaWFzX2FkZF9hdHRyaWIob2JqLCBhdHRyaWIsIG93bmVyKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlIChpbnRlZ2VyKQogKgogKiAgICBDcmVhdGUgbmV3IElBUyBpbnRlZ2VyIHZhbHVlCiAqCiAqLwpzdHJ1Y3QgaWFzX3ZhbHVlICppcmlhc19uZXdfaW50ZWdlcl92YWx1ZShpbnQgaW50ZWdlcikKewoJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CgoJdmFsdWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgl2YWx1ZS0+dHlwZSA9IElBU19JTlRFR0VSOwoJdmFsdWUtPmxlbiA9IDQ7Cgl2YWx1ZS0+dC5pbnRlZ2VyID0gaW50ZWdlcjsKCglyZXR1cm4gdmFsdWU7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlIChzdHJpbmcpCiAqCiAqICAgIENyZWF0ZSBuZXcgSUFTIHN0cmluZyB2YWx1ZQogKgogKiBQZXIgSXJMTVAgMS4xLCA0LjMuMy4yLCBzdHJpbmdzIGFyZSB1cCB0byAyNTYgY2hhcnMgLSBKZWFuIElJCiAqLwpzdHJ1Y3QgaWFzX3ZhbHVlICppcmlhc19uZXdfc3RyaW5nX3ZhbHVlKGNoYXIgKnN0cmluZykKewoJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CgoJdmFsdWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgl2YWx1ZS0+dHlwZSA9IElBU19TVFJJTkc7Cgl2YWx1ZS0+Y2hhcnNldCA9IENTX0FTQ0lJOwoJdmFsdWUtPnQuc3RyaW5nID0gc3RybmR1cChzdHJpbmcsIElBU19NQVhfU1RSSU5HKTsKCXZhbHVlLT5sZW4gPSBzdHJsZW4odmFsdWUtPnQuc3RyaW5nKTsKCglyZXR1cm4gdmFsdWU7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX25ld19vY3RzZXFfdmFsdWUgKG9jdGV0cywgbGVuKQogKgogKiAgICBDcmVhdGUgbmV3IElBUyBvY3RldC1zZXF1ZW5jZSB2YWx1ZQogKgogKiBQZXIgSXJMTVAgMS4xLCA0LjMuMy4yLCBvY3RldC1zZXF1ZW5jZSBhcmUgdXAgdG8gMTAyNCBieXRlcyAtIEplYW4gSUkKICovCnN0cnVjdCBpYXNfdmFsdWUgKmlyaWFzX25ld19vY3RzZXFfdmFsdWUoX191OCAqb2N0c2VxICwgaW50IGxlbikKewoJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CgoJdmFsdWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgl2YWx1ZS0+dHlwZSA9IElBU19PQ1RfU0VROwoJLyogQ2hlY2sgbGVuZ3RoICovCglpZihsZW4gPiBJQVNfTUFYX09DVEVUX1NUUklORykKCQlsZW4gPSBJQVNfTUFYX09DVEVUX1NUUklORzsKCXZhbHVlLT5sZW4gPSBsZW47CgoJdmFsdWUtPnQub2N0X3NlcSA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKCWlmICh2YWx1ZS0+dC5vY3Rfc2VxID09IE5VTEwpewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlrZnJlZSh2YWx1ZSk7CgkJcmV0dXJuIE5VTEw7Cgl9CgltZW1jcHkodmFsdWUtPnQub2N0X3NlcSwgb2N0c2VxICwgbGVuKTsKCXJldHVybiB2YWx1ZTsKfQoKc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X21pc3NpbmdfdmFsdWUodm9pZCkKewoJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CgoJdmFsdWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgl2YWx1ZS0+dHlwZSA9IElBU19NSVNTSU5HOwoJdmFsdWUtPmxlbiA9IDA7CgoJcmV0dXJuIHZhbHVlOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfdmFsdWUgKHZhbHVlKQogKgogKiAgICBEZWxldGUgSUFTIHZhbHVlCiAqCiAqLwp2b2lkIGlyaWFzX2RlbGV0ZV92YWx1ZShzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSkKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKCglzd2l0Y2ggKHZhbHVlLT50eXBlKSB7CgljYXNlIElBU19JTlRFR0VSOiAvKiBGYWxsdGhyb3VnaCAqLwoJY2FzZSBJQVNfTUlTU0lORzoKCQkvKiBObyBuZWVkIHRvIGRlYWxsb2NhdGUgKi8KCQlicmVhazsKCWNhc2UgSUFTX1NUUklORzoKCQkvKiBEZWFsbG9jYXRlIHN0cmluZyAqLwoJCWtmcmVlKHZhbHVlLT50LnN0cmluZyk7CgkJYnJlYWs7CgljYXNlIElBU19PQ1RfU0VROgoJCS8qIERlYWxsb2NhdGUgYnl0ZSBzdHJlYW0gKi8KCQkga2ZyZWUodmFsdWUtPnQub2N0X3NlcSk7CgkJIGJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIHZhbHVlIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWJyZWFrOwoJfQoJa2ZyZWUodmFsdWUpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfZGVsZXRlX3ZhbHVlKTsK