LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmlhc19vYmplY3QuYwogKiBWZXJzaW9uOiAgICAgICAwLjMKICogRGVzY3JpcHRpb246ICAgSUFTIG9iamVjdCBkYXRhYmFzZSBhbmQgZnVuY3Rpb25zCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBUaHUgT2N0ICAxIDIyOjUwOjA0IDE5OTgKICogTW9kaWZpZWQgYXQ6ICAgV2VkIERlYyAxNSAxMToyMzoxNiAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CgpoYXNoYmluX3QgKmlyaWFzX29iamVjdHM7CgovKgogKiAgVXNlZCB3aGVuIGEgbWlzc2luZyB2YWx1ZSBuZWVkcyB0byBiZSByZXR1cm5lZAogKi8Kc3RydWN0IGlhc192YWx1ZSBpcmlhc19taXNzaW5nID0geyBJQVNfTUlTU0lORywgMCwgMCwgMCwgezB9fTsKCi8qCiAqIEZ1bmN0aW9uIHN0cm5kdXAgKHN0ciwgbWF4KQogKgogKiAgICBNeSBvd24ga2VybmVsIHZlcnNpb24gb2Ygc3RybmR1cCEKICoKICogRmFzdGVyLCBjaGVjayBib3VuZGFyeS4uLiBKZWFuIElJCiAqLwpzdGF0aWMgY2hhciAqc3RybmR1cChjaGFyICpzdHIsIGludCBtYXgpCnsKCWNoYXIgKm5ld19zdHI7CglpbnQgbGVuOwoKCS8qIENoZWNrIHN0cmluZyAqLwoJaWYgKHN0ciA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoJLyogQ2hlY2sgbGVuZ3RoLCB0cnVuY2F0ZSAqLwoJbGVuID0gc3RybGVuKHN0cik7CglpZihsZW4gPiBtYXgpCgkJbGVuID0gbWF4OwoKCS8qIEFsbG9jYXRlIG5ldyBzdHJpbmcgKi8KICAgICAgICBuZXdfc3RyID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfQVRPTUlDKTsKICAgICAgICBpZiAobmV3X3N0ciA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qIENvcHkgYW5kIHRydW5jYXRlICovCgltZW1jcHkobmV3X3N0ciwgc3RyLCBsZW4pOwoJbmV3X3N0cltsZW5dID0gJ1wwJzsKCglyZXR1cm4gbmV3X3N0cjsKfQoKLyoKICogRnVuY3Rpb24gaWFzX25ld19vYmplY3QgKG5hbWUsIGlkKQogKgogKiAgICBDcmVhdGUgYSBuZXcgSUFTIG9iamVjdAogKgogKi8Kc3RydWN0IGlhc19vYmplY3QgKmlyaWFzX25ld19vYmplY3QoIGNoYXIgKm5hbWUsIGludCBpZCkKewogICAgICAgIHN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CgoJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJb2JqID0gKHN0cnVjdCBpYXNfb2JqZWN0ICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfb2JqZWN0KSwKCQkJCQkgICAgR0ZQX0FUT01JQyk7CglpZiAob2JqID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBvYmplY3QhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgltZW1zZXQob2JqLCAwLCBzaXplb2YoIHN0cnVjdCBpYXNfb2JqZWN0KSk7CgoJb2JqLT5tYWdpYyA9IElBU19PQkpFQ1RfTUFHSUM7CglvYmotPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQ0xBU1NOQU1FKTsKCW9iai0+aWQgPSBpZDsKCgkvKiBMb2NraW5nIG5vdGVzIDogdGhlIGF0dHJpYiBzcGlubG9jayBoYXMgbG93ZXIgcHJlY2VuZGVuY2UKCSAqIHRoYW4gdGhlIG9iamVjdHMgc3BpbmxvY2suIE5ldmVyIGdyYXAgdGhlIG9iamVjdHMgc3BpbmxvY2sKCSAqIHdoaWxlIGhvbGRpbmcgYW55IGF0dHJpYiBzcGlubG9jayAocmlzayBvZiBkZWFkbG9jaykuIEplYW4gSUkgKi8KCW9iai0+YXR0cmlicyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOwoKCWlmIChvYmotPmF0dHJpYnMgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXMoKSwgVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnMhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJa2ZyZWUob2JqKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglyZXR1cm4gb2JqOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfbmV3X29iamVjdCk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfYXR0cmliIChhdHRyaWIpCiAqCiAqICAgIERlbGV0ZSBnaXZlbiBhdHRyaWJ1dGUgYW5kIGRlYWxsb2NhdGUgYWxsIGl0cyBtZW1vcnkKICoKICovCnN0YXRpYyB2b2lkIF9faXJpYXNfZGVsZXRlX2F0dHJpYihzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliKQp7CglJUkRBX0FTU0VSVChhdHRyaWIgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChhdHRyaWItPm1hZ2ljID09IElBU19BVFRSSUJfTUFHSUMsIHJldHVybjspOwoKCWtmcmVlKGF0dHJpYi0+bmFtZSk7CgoJaXJpYXNfZGVsZXRlX3ZhbHVlKGF0dHJpYi0+dmFsdWUpOwoJYXR0cmliLT5tYWdpYyA9IH5JQVNfQVRUUklCX01BR0lDOwoKCWtmcmVlKGF0dHJpYik7Cn0KCnZvaWQgX19pcmlhc19kZWxldGVfb2JqZWN0KHN0cnVjdCBpYXNfb2JqZWN0ICpvYmopCnsKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CgoJa2ZyZWUob2JqLT5uYW1lKTsKCgloYXNoYmluX2RlbGV0ZShvYmotPmF0dHJpYnMsIChGUkVFX0ZVTkMpIF9faXJpYXNfZGVsZXRlX2F0dHJpYik7CgoJb2JqLT5tYWdpYyA9IH5JQVNfT0JKRUNUX01BR0lDOwoKCWtmcmVlKG9iaik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2RlbGV0ZV9vYmplY3QgKG9iaikKICoKICogICAgUmVtb3ZlIG9iamVjdCBmcm9tIGhhc2hiaW4gYW5kIGRlYWxsb2NhdGUgYWxsIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoCiAqICAgIHdpdGggdGhpcyBvYmplY3QgYW5kIHRoZSBvYmplY3QgaXRzZWxmCiAqCiAqLwppbnQgaXJpYXNfZGVsZXRlX29iamVjdChzdHJ1Y3QgaWFzX29iamVjdCAqb2JqKQp7CglzdHJ1Y3QgaWFzX29iamVjdCAqbm9kZTsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybiAtMTspOwoKCS8qIFJlbW92ZSBmcm9tIGxpc3QgKi8KCW5vZGUgPSBoYXNoYmluX3JlbW92ZV90aGlzKGlyaWFzX29iamVjdHMsIChpcmRhX3F1ZXVlX3QgKikgb2JqKTsKCWlmICghbm9kZSkKCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgb2JqZWN0IGFscmVhZHkgcmVtb3ZlZCFcbiIsCgkJCSAgICBfX0ZVTkNUSU9OX18pOwoKCS8qIERlc3Ryb3kgKi8KCV9faXJpYXNfZGVsZXRlX29iamVjdChvYmopOwoKCXJldHVybiAwOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfZGVsZXRlX29iamVjdCk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfYXR0cmliIChvYmopCiAqCiAqICAgIFJlbW92ZSBhdHRyaWJ1dGUgZnJvbSBoYXNoYmluIGFuZCwgaWYgaXQgd2FzIHRoZSBsYXN0IGF0dHJpYnV0ZSBvZgogKiAgICB0aGUgb2JqZWN0LCByZW1vdmUgdGhlIG9iamVjdCBhcyB3ZWxsLgogKgogKi8KaW50IGlyaWFzX2RlbGV0ZV9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYiwKCQkJaW50IGNsZWFub2JqZWN0KQp7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqbm9kZTsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoYXR0cmliICE9IE5VTEwsIHJldHVybiAtMTspOwoKCS8qIFJlbW92ZSBhdHRyaWJ1dGUgZnJvbSBvYmplY3QgKi8KCW5vZGUgPSBoYXNoYmluX3JlbW92ZV90aGlzKG9iai0+YXR0cmlicywgKGlyZGFfcXVldWVfdCAqKSBhdHRyaWIpOwoJaWYgKCFub2RlKQoJCXJldHVybiAwOyAvKiBBbHJlYWR5IHJlbW92ZWQgb3Igbm9uLWV4aXN0ZW50ICovCgoJLyogRGVhbGxvY2F0ZSBhdHRyaWJ1dGUgKi8KCV9faXJpYXNfZGVsZXRlX2F0dHJpYihub2RlKTsKCgkvKiBDaGVjayBpZiBvYmplY3QgaGFzIHN0aWxsIHNvbWUgYXR0cmlidXRlcywgZGVzdHJveSBpdCBpZiBub25lLgoJICogQXQgZmlyc3QgZ2xhbmNlLCB0aGlzIGxvb2sgZGFuZ2Vyb3VzLCBhcyB0aGUga2VybmVsIHJlZmVyZW5jZQoJICogdmFyaW91cyBJQVMgb2JqZWN0cy4gSG93ZXZlciwgd2Ugb25seSB1c2UgdGhpcyBmdW5jdGlvbiBvbgoJICogdXNlciBhdHRyaWJ1dGVzLCBub3Qga2VybmVsIGF0dHJpYnV0ZXMsIHNvIHRoZXJlIGlzIG5vIHJpc2sKCSAqIG9mIGRlbGV0aW5nIGEga2VybmVsIG9iamVjdCB0aGlzIHdheS4gSmVhbiBJSSAqLwoJbm9kZSA9IChzdHJ1Y3QgaWFzX2F0dHJpYiAqKSBoYXNoYmluX2dldF9maXJzdChvYmotPmF0dHJpYnMpOwoJaWYgKGNsZWFub2JqZWN0ICYmICFub2RlKQoJCWlyaWFzX2RlbGV0ZV9vYmplY3Qob2JqKTsKCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfaW5zZXJ0X29iamVjdCAob2JqKQogKgogKiAgICBJbnNlcnQgYW4gb2JqZWN0IGludG8gdGhlIExNLUlBUyBkYXRhYmFzZQogKgogKi8Kdm9pZCBpcmlhc19pbnNlcnRfb2JqZWN0KHN0cnVjdCBpYXNfb2JqZWN0ICpvYmopCnsKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CgoJaGFzaGJpbl9pbnNlcnQoaXJpYXNfb2JqZWN0cywgKGlyZGFfcXVldWVfdCAqKSBvYmosIDAsIG9iai0+bmFtZSk7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19pbnNlcnRfb2JqZWN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2ZpbmRfb2JqZWN0IChuYW1lKQogKgogKiAgICBGaW5kIG9iamVjdCB3aXRoIGdpdmVuIG5hbWUKICoKICovCnN0cnVjdCBpYXNfb2JqZWN0ICppcmlhc19maW5kX29iamVjdChjaGFyICpuYW1lKQp7CglJUkRBX0FTU0VSVChuYW1lICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CgoJLyogVW5zYWZlIChsb2NraW5nKSwgb2JqZWN0IG1pZ2h0IGNoYW5nZSAqLwoJcmV0dXJuIGhhc2hiaW5fbG9ja19maW5kKGlyaWFzX29iamVjdHMsIDAsIG5hbWUpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfZmluZF9vYmplY3QpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfZmluZF9hdHRyaWIgKG9iaiwgbmFtZSkKICoKICogICAgRmluZCBuYW1lZCBhdHRyaWJ1dGUgaW4gb2JqZWN0CiAqCiAqLwpzdHJ1Y3QgaWFzX2F0dHJpYiAqaXJpYXNfZmluZF9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgY2hhciAqbmFtZSkKewoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIE5VTEw7KTsKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCglhdHRyaWIgPSBoYXNoYmluX2xvY2tfZmluZChvYmotPmF0dHJpYnMsIDAsIG5hbWUpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoKCS8qIFVuc2FmZSAobG9ja2luZyksIGF0dHJpYiBtaWdodCBjaGFuZ2UgKi8KCXJldHVybiBhdHRyaWI7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19maW5kX2F0dHJpYik7CgovKgogKiBGdW5jdGlvbiBpcmlhc19hZGRfYXR0cmlidXRlIChvYmosIGF0dHJpYikKICoKICogICAgQWRkIGF0dHJpYnV0ZSB0byBvYmplY3QKICoKICovCnN0YXRpYyB2b2lkIGlyaWFzX2FkZF9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYiwKCQkJICAgICBpbnQgb3duZXIpCnsKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CgoJSVJEQV9BU1NFUlQoYXR0cmliICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoYXR0cmliLT5tYWdpYyA9PSBJQVNfQVRUUklCX01BR0lDLCByZXR1cm47KTsKCgkvKiBTZXQgaWYgYXR0cmliIGlzIG93bmVkIGJ5IGtlcm5lbCBvciB1c2VyIHNwYWNlICovCglhdHRyaWItPnZhbHVlLT5vd25lciA9IG93bmVyOwoKCWhhc2hiaW5faW5zZXJ0KG9iai0+YXR0cmlicywgKGlyZGFfcXVldWVfdCAqKSBhdHRyaWIsIDAsIGF0dHJpYi0+bmFtZSk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlIChvYmpfbmFtZSwgYXR0cmliX25hbWUsIG5ld192YWx1ZSkKICoKICogICAgQ2hhbmdlIHRoZSB2YWx1ZSBvZiBhbiBvYmplY3RzIGF0dHJpYnV0ZS4KICoKICovCmludCBpcmlhc19vYmplY3RfY2hhbmdlX2F0dHJpYnV0ZShjaGFyICpvYmpfbmFtZSwgY2hhciAqYXR0cmliX25hbWUsCgkJCQkgIHN0cnVjdCBpYXNfdmFsdWUgKm5ld192YWx1ZSkKewoJc3RydWN0IGlhc19vYmplY3QgKm9iajsKCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCS8qIEZpbmQgb2JqZWN0ICovCglvYmogPSBoYXNoYmluX2xvY2tfZmluZChpcmlhc19vYmplY3RzLCAwLCBvYmpfbmFtZSk7CglpZiAob2JqID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gZmluZCBvYmplY3Q6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCgkJCSAgICAgb2JqX25hbWUpOwoJCXJldHVybiAtMTsKCX0KCgkvKiBTbGlnaHRseSB1bnNhZmUgKG9iaiBtaWdodCBnZXQgcmVtb3ZlZCB1bmRlciB1cykgKi8KCXNwaW5fbG9ja19pcnFzYXZlKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgoJLyogRmluZCBhdHRyaWJ1dGUgKi8KCWF0dHJpYiA9IGhhc2hiaW5fZmluZChvYmotPmF0dHJpYnMsIDAsIGF0dHJpYl9uYW1lKTsKCWlmIChhdHRyaWIgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBmaW5kIGF0dHJpYnV0ZTogJXNcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fLCBhdHRyaWJfbmFtZSk7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJCXJldHVybiAtMTsKCX0KCglpZiAoIGF0dHJpYi0+dmFsdWUtPnR5cGUgIT0gbmV3X3ZhbHVlLT50eXBlKSB7CgkJSVJEQV9ERUJVRyggMCwgIiVzKCksIGNoYW5naW5nIHZhbHVlIHR5cGUgbm90IGFsbG93ZWQhXG4iLAoJCQkgICAgX19GVU5DVElPTl9fKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgkJcmV0dXJuIC0xOwoJfQoKCS8qIERlbGV0ZSBvbGQgdmFsdWUgKi8KCWlyaWFzX2RlbGV0ZV92YWx1ZShhdHRyaWItPnZhbHVlKTsKCgkvKiBJbnNlcnQgbmV3IHZhbHVlICovCglhdHRyaWItPnZhbHVlID0gbmV3X3ZhbHVlOwoKCS8qIFN1Y2Nlc3MgKi8KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCXJldHVybiAwOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfb2JqZWN0X2FkZF9pbnRlZ2VyX2F0dHJpYiAob2JqLCBuYW1lLCB2YWx1ZSkKICoKICogICAgQWRkIGFuIGludGVnZXIgYXR0cmlidXRlIHRvIGFuIExNLUlBUyBvYmplY3QKICoKICovCnZvaWQgaXJpYXNfYWRkX2ludGVnZXJfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUsIGludCB2YWx1ZSwKCQkJICAgICAgaW50IG93bmVyKQp7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChuYW1lICE9IE5VTEwsIHJldHVybjspOwoKCWF0dHJpYiA9IChzdHJ1Y3QgaWFzX2F0dHJpYiAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX2F0dHJpYiksCgkJCQkJICAgICAgIEdGUF9BVE9NSUMpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgltZW1zZXQoYXR0cmliLCAwLCBzaXplb2YoIHN0cnVjdCBpYXNfYXR0cmliKSk7CgoJYXR0cmliLT5tYWdpYyA9IElBU19BVFRSSUJfTUFHSUM7CglhdHRyaWItPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSk7CgoJLyogSW5zZXJ0IHZhbHVlICovCglhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUodmFsdWUpOwoKCWlyaWFzX2FkZF9hdHRyaWIob2JqLCBhdHRyaWIsIG93bmVyKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2FkZF9pbnRlZ2VyX2F0dHJpYik7CgogLyoKICogRnVuY3Rpb24gaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIgKG9iaiwgbmFtZSwgb2N0ZXRfc2VxLCBsZW4pCiAqCiAqICAgIEFkZCBhIG9jdGV0IHNlcXVlbmNlIGF0dHJpYnV0ZSB0byBhbiBMTS1JQVMgb2JqZWN0CiAqCiAqLwoKdm9pZCBpcmlhc19hZGRfb2N0c2VxX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBjaGFyICpuYW1lLCBfX3U4ICpvY3RldHMsCgkJCSAgICAgaW50IGxlbiwgaW50IG93bmVyKQp7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CgoJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9jdGV0cyAhPSBOVUxMLCByZXR1cm47KTsKCglhdHRyaWIgPSAoc3RydWN0IGlhc19hdHRyaWIgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc19hdHRyaWIpLAoJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKCWlmIChhdHRyaWIgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoJbWVtc2V0KGF0dHJpYiwgMCwgc2l6ZW9mKCBzdHJ1Y3QgaWFzX2F0dHJpYikpOwoKCWF0dHJpYi0+bWFnaWMgPSBJQVNfQVRUUklCX01BR0lDOwoJYXR0cmliLT5uYW1lID0gc3RybmR1cChuYW1lLCBJQVNfTUFYX0FUVFJJQk5BTUUpOwoKCWF0dHJpYi0+dmFsdWUgPSBpcmlhc19uZXdfb2N0c2VxX3ZhbHVlKCBvY3RldHMsIGxlbik7CgoJaXJpYXNfYWRkX2F0dHJpYihvYmosIGF0dHJpYiwgb3duZXIpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfb2JqZWN0X2FkZF9zdHJpbmdfYXR0cmliIChvYmosIHN0cmluZykKICoKICogICAgQWRkIGEgc3RyaW5nIGF0dHJpYnV0ZSB0byBhbiBMTS1JQVMgb2JqZWN0CiAqCiAqLwp2b2lkIGlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLAoJCQkgICAgIGludCBvd25lcikKewoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKCglhdHRyaWIgPSAoc3RydWN0IGlhc19hdHRyaWIgKikga21hbGxvYyhzaXplb2YoIHN0cnVjdCBpYXNfYXR0cmliKSwKCQkJCQkgICAgICAgR0ZQX0FUT01JQyk7CglpZiAoYXR0cmliID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlidXRlIVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCW1lbXNldChhdHRyaWIsIDAsIHNpemVvZiggc3RydWN0IGlhc19hdHRyaWIpKTsKCglhdHRyaWItPm1hZ2ljID0gSUFTX0FUVFJJQl9NQUdJQzsKCWF0dHJpYi0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9BVFRSSUJOQU1FKTsKCglhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X3N0cmluZ192YWx1ZSh2YWx1ZSk7CgoJaXJpYXNfYWRkX2F0dHJpYihvYmosIGF0dHJpYiwgb3duZXIpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUgKGludGVnZXIpCiAqCiAqICAgIENyZWF0ZSBuZXcgSUFTIGludGVnZXIgdmFsdWUKICoKICovCnN0cnVjdCBpYXNfdmFsdWUgKmlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKGludCBpbnRlZ2VyKQp7CglzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKCgl2YWx1ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpLCBHRlBfQVRPTUlDKTsKCWlmICh2YWx1ZSA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoJbWVtc2V0KHZhbHVlLCAwLCBzaXplb2Yoc3RydWN0IGlhc192YWx1ZSkpOwoKCXZhbHVlLT50eXBlID0gSUFTX0lOVEVHRVI7Cgl2YWx1ZS0+bGVuID0gNDsKCXZhbHVlLT50LmludGVnZXIgPSBpbnRlZ2VyOwoKCXJldHVybiB2YWx1ZTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX25ld19zdHJpbmdfdmFsdWUgKHN0cmluZykKICoKICogICAgQ3JlYXRlIG5ldyBJQVMgc3RyaW5nIHZhbHVlCiAqCiAqIFBlciBJckxNUCAxLjEsIDQuMy4zLjIsIHN0cmluZ3MgYXJlIHVwIHRvIDI1NiBjaGFycyAtIEplYW4gSUkKICovCnN0cnVjdCBpYXNfdmFsdWUgKmlyaWFzX25ld19zdHJpbmdfdmFsdWUoY2hhciAqc3RyaW5nKQp7CglzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKCgl2YWx1ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpLCBHRlBfQVRPTUlDKTsKCWlmICh2YWx1ZSA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoJbWVtc2V0KCB2YWx1ZSwgMCwgc2l6ZW9mKCBzdHJ1Y3QgaWFzX3ZhbHVlKSk7CgoJdmFsdWUtPnR5cGUgPSBJQVNfU1RSSU5HOwoJdmFsdWUtPmNoYXJzZXQgPSBDU19BU0NJSTsKCXZhbHVlLT50LnN0cmluZyA9IHN0cm5kdXAoc3RyaW5nLCBJQVNfTUFYX1NUUklORyk7Cgl2YWx1ZS0+bGVuID0gc3RybGVuKHZhbHVlLT50LnN0cmluZyk7CgoJcmV0dXJuIHZhbHVlOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfbmV3X3N0cmluZ192YWx1ZSk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19uZXdfb2N0c2VxX3ZhbHVlIChvY3RldHMsIGxlbikKICoKICogICAgQ3JlYXRlIG5ldyBJQVMgb2N0ZXQtc2VxdWVuY2UgdmFsdWUKICoKICogUGVyIElyTE1QIDEuMSwgNC4zLjMuMiwgb2N0ZXQtc2VxdWVuY2UgYXJlIHVwIHRvIDEwMjQgYnl0ZXMgLSBKZWFuIElJCiAqLwpzdHJ1Y3QgaWFzX3ZhbHVlICppcmlhc19uZXdfb2N0c2VxX3ZhbHVlKF9fdTggKm9jdHNlcSAsIGludCBsZW4pCnsKCXN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlOwoKCXZhbHVlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc192YWx1ZSksIEdGUF9BVE9NSUMpOwoJaWYgKHZhbHVlID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgltZW1zZXQodmFsdWUsIDAsIHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSk7CgoJdmFsdWUtPnR5cGUgPSBJQVNfT0NUX1NFUTsKCS8qIENoZWNrIGxlbmd0aCAqLwoJaWYobGVuID4gSUFTX01BWF9PQ1RFVF9TVFJJTkcpCgkJbGVuID0gSUFTX01BWF9PQ1RFVF9TVFJJTkc7Cgl2YWx1ZS0+bGVuID0gbGVuOwoKCXZhbHVlLT50Lm9jdF9zZXEgPSBrbWFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUtPnQub2N0X3NlcSA9PSBOVUxMKXsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJa2ZyZWUodmFsdWUpOwoJCXJldHVybiBOVUxMOwoJfQoJbWVtY3B5KHZhbHVlLT50Lm9jdF9zZXEsIG9jdHNlcSAsIGxlbik7CglyZXR1cm4gdmFsdWU7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19uZXdfb2N0c2VxX3ZhbHVlKTsKCnN0cnVjdCBpYXNfdmFsdWUgKmlyaWFzX25ld19taXNzaW5nX3ZhbHVlKHZvaWQpCnsKCXN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlOwoKCXZhbHVlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc192YWx1ZSksIEdGUF9BVE9NSUMpOwoJaWYgKHZhbHVlID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgltZW1zZXQodmFsdWUsIDAsIHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSk7CgoJdmFsdWUtPnR5cGUgPSBJQVNfTUlTU0lORzsKCXZhbHVlLT5sZW4gPSAwOwoKCXJldHVybiB2YWx1ZTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfZGVsZXRlX3ZhbHVlICh2YWx1ZSkKICoKICogICAgRGVsZXRlIElBUyB2YWx1ZQogKgogKi8Kdm9pZCBpcmlhc19kZWxldGVfdmFsdWUoc3RydWN0IGlhc192YWx1ZSAqdmFsdWUpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQodmFsdWUgIT0gTlVMTCwgcmV0dXJuOyk7CgoJc3dpdGNoICh2YWx1ZS0+dHlwZSkgewoJY2FzZSBJQVNfSU5URUdFUjogLyogRmFsbHRocm91Z2ggKi8KCWNhc2UgSUFTX01JU1NJTkc6CgkJLyogTm8gbmVlZCB0byBkZWFsbG9jYXRlICovCgkJYnJlYWs7CgljYXNlIElBU19TVFJJTkc6CgkJLyogRGVhbGxvY2F0ZSBzdHJpbmcgKi8KCQlrZnJlZSh2YWx1ZS0+dC5zdHJpbmcpOwoJCWJyZWFrOwoJY2FzZSBJQVNfT0NUX1NFUToKCQkvKiBEZWFsbG9jYXRlIGJ5dGUgc3RyZWFtICovCgkJIGtmcmVlKHZhbHVlLT50Lm9jdF9zZXEpOwoJCSBicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biB2YWx1ZSB0eXBlIVxuIiwgX19GVU5DVElPTl9fKTsKCQlicmVhazsKCX0KCWtmcmVlKHZhbHVlKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2RlbGV0ZV92YWx1ZSk7Cg==