ZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lycXVldWUuYyBiL25ldC9pcmRhL2lycXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGRkM2VhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJxdWV1ZS5jCkBAIC0wLDAgKzEsOTE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlycXVldWUuYworICogVmVyc2lvbjogICAgICAgMC4zCisgKiBEZXNjcmlwdGlvbjogICBHZW5lcmFsIHF1ZXVlIGltcGxlbWVudGF0aW9uCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBUdWUgSnVuICA5IDEzOjI5OjMxIDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBEZWMgMTIgMTM6NDg6MjIgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogTW9kaWZpZWQgYXQ6ICAgVGh1IEphbiAgNCAxNDoyOToxMCBDRVQgMjAwMQorICogTW9kaWZpZWQgYnk6ICAgTWFyYyBaeW5naWVyIDxtenluZ2llckBmcmVlc3VyZi5mcj4KKyAqIAorICogICAgIENvcHlyaWdodCAoQykgMTk5OC0xOTk5LCBBYWdlIEt2YWxuZXMgPGFhZ2VAY3MudWl0Lm5vPgorICogICAgIENvcHlyaWdodCAoQykgMTk5OCwgRGFnIEJyYXR0bGksIAorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICAgIFRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIHRoZSBWb3J0ZXggT3BlcmF0aW5nIFN5c3RlbSB3cml0dGVuIGJ5IEFhZ2UKKyAqICAgICBLdmFsbmVzLiBBYWdlIGhhcyBhZ3JlZWQgdGhhdCB0aGlzIGNvZGUgY2FuIHVzZSB0aGUgR1BMIGxpY2VuY2UsCisgKiAgICAgYWx0aG91Z2ggaGUgZG9lcyBub3QgdXNlIHRoYXQgbGljZW5jZSBpbiBoaXMgb3duIGNvZGUuCisgKiAgICAgCisgKiAgICAgVGhpcyBjb3B5cmlnaHQgZG9lcyBob3dldmVyIF9ub3RfIGluY2x1ZGUgdGhlIEVMRiBoYXNoKCkgZnVuY3Rpb24KKyAqICAgICB3aGljaCBJIGN1cnJlbnRseSBkb24ndCBrbm93IHdoaWNoIGxpY2VuY2Ugb3IgY29weXJpZ2h0IGl0CisgKiAgICAgaGFzLiBQbGVhc2UgaW5mb3JtIG1lIGlmIHlvdSBrbm93LgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBOT1RFIDoKKyAqIFRoZXJlIGFyZSB2YXJpb3VzIHByb2JsZW1zIHdpdGggdGhpcyBwYWNrYWdlIDoKKyAqCW8gdGhlIGhhc2ggZnVuY3Rpb24gZm9yIGludHMgaXMgcGF0aGV0aWMgKGJ1dCBjb3VsZCBiZSBjaGFuZ2VkKQorICoJbyBsb2NraW5nIGlzIHNvbWV0aW1lIHN1c3BpY2lvdXMgKGVzcGVjaWFsbHkgZHVyaW5nIGVudW1lcmF0aW9uKQorICoJbyBtb3N0IHVzZXJzIGhhdmUgb25seSBhIGZldyBlbGVtZW50cyAoPT0gb3ZlcmhlYWQpCisgKglvIG1vc3QgdXNlcnMgbmV2ZXIgdXNlIHNlYWNoLCBzbyBkb24ndCBiZW5lZml0IGZyb20gaGFzaGluZworICogUHJvYmxlbSBhbHJlYWR5IGZpeGVkIDoKKyAqCW8gbm90IDY0IGJpdCBjb21wbGlhbnQgKG1vc3QgdXNlcnMgZG8gaGFzaHYgPSAoaW50KSBzZWxmKQorICoJbyBoYXNoYmluX3JlbW92ZSgpIGlzIGJyb2tlbiA9PiB1c2UgaGFzaGJpbl9yZW1vdmVfdGhpcygpCisgKiBJIHRoaW5rIG1vc3QgdXNlcnMgd291bGQgYmUgYmV0dGVyIHNlcnZlZCBieSBhIHNpbXBsZSBsaW5rZWQgbGlzdAorICogKGxpa2UgaW5jbHVkZS9saW51eC9saXN0LmgpIHdpdGggYSBnbG9iYWwgc3BpbmxvY2sgcGVyIGxpc3QuCisgKiBKZWFuIElJCisgKi8KKworLyoKKyAqIE5vdGVzIG9uIHRoZSBjb25jdXJyZW50IGFjY2VzcyB0byBoYXNoYmluIGFuZCBvdGhlciBTTVAgaXNzdWVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglIYXNoYmlucyBhcmUgdmVyeSBvZnRlbiBpbiB0aGUgSXJEQSBzdGFjayBhIGdsb2JhbCByZXBvc2l0b3J5IG9mCisgKiBpbmZvcm1hdGlvbiwgYW5kIHRoZXJlZm9yZSB1c2VkIGluIGEgdmVyeSBhc3luY2hyb25vdXMgbWFubmVyIGZvbGxvd2luZworICogdmFyaW91cyBldmVudHMgKGRyaXZlciBjYWxscywgdGltZXJzLCB1c2VyIGNhbGxzLi4uKS4KKyAqCVRoZXJlZm9yZSwgdmVyeSBvZnRlbiBpdCBpcyBoaWdobHkgaW1wb3J0YW50IHRvIGNvbnNpZGVyIHRoZQorICogbWFuYWdlbWVudCBvZiBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgaGFzaGJpbiBhbmQgaG93IHRvIGd1YXJhbnRlZSB0aGUKKyAqIGNvbnNpc3RlbmN5IG9mIHRoZSBvcGVyYXRpb25zIG9uIGl0LgorICoKKyAqCUZpcnN0LCB3ZSBuZWVkIHRvIGRlZmluZSB0aGUgb2JqZWN0aXZlIG9mIGxvY2tpbmcgOgorICoJCTEpIFByb3RlY3QgdXNlciBkYXRhIChjb250ZW50IHBvaW50ZWQgYnkgdGhlIGhhc2hiaW4pCisgKgkJMikgUHJvdGVjdCBoYXNoYmluIHN0cnVjdHVyZSBpdHNlbGYgKGxpbmtlZCBsaXN0IGluIGVhY2ggYmluKQorICoKKyAqCQkJICAgICBPTEQgTE9DS0lORworICoJCQkgICAgIC0tLS0tLS0tLS0tCisgKgorICoJVGhlIHByZXZpb3VzIGxvY2tpbmcgc3RyYXRlZ3ksIGVpdGhlciBIQl9MT0NBTCBvciBIQl9HTE9CQUwgd2VyZQorICogYm90aCBpbmFkZXF1YXRlIGluICpib3RoKiBhc3BlY3QuCisgKgkJbyBIQl9HTE9CQUwgd2FzIHVzaW5nIGEgc3BpbmxvY2sgZm9yIGVhY2ggYmluIChsb2NhbCBsb2NraW5nKS4KKyAqCQlvIEhCX0xPQ0FMIHdhcyBkaXNhYmxpbmcgaXJxIG9uICphbGwqIENQVXMsIHNvIHVzZSBhIHNpbmdsZQorICoJCSAgZ2xvYmFsIHNlbWFwaG9yZS4KKyAqCVRoZSBwcm9ibGVtcyB3ZXJlIDoKKyAqCQlBKSBHbG9iYWwgaXJxIGRpc2FibGluZyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwKKyAqCQlCKSBObyBwcm90ZWN0aW9uIGZvciB0aGUgaGFzaGJpbiBzdHJ1Y3QgZ2xvYmFsIGRhdGEKKyAqCQkJbyBoYXNoYmluX2RlbGV0ZSgpCisgKgkJCW8gaGJfY3VycmVudAorICoJCUMpIE5vIHByb3RlY3Rpb24gZm9yIHVzZXIgZGF0YSBpbiBzb21lIGNhc2VzCisgKgorICoJQSkgSEJfTE9DQUwgdXNlIGdsb2JhbCBpcnEgZGlzYWJsaW5nLCBzbyBkb2Vzbid0IHdvcmsgb24ga2VybmVsCisgKiAyLjUuWC4gRXZlbiB3aGVuIGl0IGlzIHN1cHBvcnRlZCAoa2VybmVsIDIuNC5YIGFuZCBlYXJsaWVyKSwgaXRzCisgKiBwZXJmb3JtYW5jZSBpcyBub3Qgc2F0aXNmYWN0b3J5IG9uIFNNUCBzZXR1cHMuIE1vc3QgaGFzaGJpbnMgd2VyZQorICogSEJfTE9DQUwsIHNvIChBKSBkZWZpbml0ZWx5IG5lZWQgZml4aW5nLgorICoJQikgSEJfTE9DQUwgY291bGQgYmUgbW9kaWZpZWQgdG8gZml4IChCKS4gSG93ZXZlciwgYmVjYXVzZSBIQl9HTE9CQUwKKyAqIGxvY2sgb25seSB0aGUgaW5kaXZpZHVhbCBiaW5zLCBpdCB3aWxsIG5ldmVyIGJlIGFibGUgdG8gbG9jayB0aGUKKyAqIGdsb2JhbCBkYXRhLCBzbyBjYW4ndCBkbyAoQikuCisgKglDKSBTb21lIGZ1bmN0aW9ucyByZXR1cm4gcG9pbnRlciB0byBkYXRhIHRoYXQgaXMgc3RpbGwgaW4gdGhlCisgKiBoYXNoYmluIDoKKyAqCQlvIGhhc2hiaW5fZmluZCgpCisgKgkJbyBoYXNoYmluX2dldF9maXJzdCgpCisgKgkJbyBoYXNoYmluX2dldF9uZXh0KCkKKyAqCUFzIHRoZSBkYXRhIGlzIHN0aWxsIGluIHRoZSBoYXNoYmluLCBpdCBtYXkgYmUgY2hhbmdlZCBvciBmcmVlJ2QKKyAqIHdoaWxlIHRoZSBjYWxsZXIgaXMgZXhhbWluaW1nIHRoZSBkYXRhLiBJbiB0aG9zZSBjYXNlLCBsb2NraW5nIGNhbid0CisgKiBiZSBkb25lIHdpdGhpbiB0aGUgaGFzaGJpbiwgYnV0IG11c3QgaW5jbHVkZSB1c2Ugb2YgdGhlIGRhdGEgd2l0aGluCisgKiB0aGUgY2FsbGVyLgorICoJVGhlIGNhbGxlciBjYW4gZWFzaWx5IGRvIHRoaXMgd2l0aCBIQl9MT0NBTCAoanVzdCBkaXNhYmxlIGlycXMpLgorICogSG93ZXZlciwgdGhpcyBpcyBpbXBvc3NpYmxlIHdpdGggSEJfR0xPQkFMIGJlY2F1c2UgdGhlIGNhbGxlciBoYXMgbm8KKyAqIHdheSB0byBrbm93IHRoZSBwcm9wZXIgYmluLCBzbyBkb24ndCBrbm93IHdoaWNoIHNwaW5sb2NrIHRvIHVzZS4KKyAqCisgKglRdWljayBzdW1tYXJ5IDogY2FuIG5vIGxvbmdlciB1c2UgSEJfTE9DQUwsIGFuZCBIQl9HTE9CQUwgaXMKKyAqIGZ1bmRhbWVudGFsbHkgYnJva2VuIGFuZCB3aWxsIG5ldmVyIHdvcmsuCisgKgorICoJCQkgICAgIE5FVyBMT0NLSU5HCisgKgkJCSAgICAgLS0tLS0tLS0tLS0KKyAqCisgKglUbyBmaXggdGhvc2UgcHJvYmxlbXMsIEkndmUgaW50cm9kdWNlIGEgZmV3IGNoYW5nZXMgaW4gdGhlCisgKiBoYXNoYmluIGxvY2tpbmcgOgorICoJCTEpIE5ldyBIQl9MT0NLIHNjaGVtZQorICoJCTIpIGhhc2hiaW4tPmhiX3NwaW5sb2NrCisgKgkJMykgTmV3IGhhc2hiaW4gdXNhZ2UgcG9saWN5CisgKgorICogSEJfTE9DSyA6CisgKiAtLS0tLS0tCisgKglIQl9MT0NLIGlzIGEgbG9ja2luZyBzY2hlbWUgaW50ZXJtZWRpYXRlIGJldHdlZW4gdGhlIG9sZCBIQl9MT0NBTAorICogYW5kIEhCX0dMT0JBTC4gSXQgdXNlcyBhIHNpbmdsZSBzcGlubG9jayB0byBwcm90ZWN0IHRoZSB3aG9sZSBjb250ZW50CisgKiBvZiB0aGUgaGFzaGJpbi4gQXMgaXQgaXMgYSBzaW5nbGUgc3BpbmxvY2ssIGl0IGNhbiBwcm90ZWN0IHRoZSBnbG9iYWwKKyAqIGRhdGEgb2YgdGhlIGhhc2hiaW4gYW5kIG5vdCBvbmx5IHRoZSBiaW5zIHRoZW1zZWx2ZXMuCisgKglIQl9MT0NLIGNhbiBvbmx5IHByb3RlY3Qgc29tZSBvZiB0aGUgaGFzaGJpbiBjYWxscywgc28gaXQgb25seSBsb2NrCisgKiBjYWxsIHRoYXQgY2FuIGJlIG1hZGUgMTAwJSBzYWZlIGFuZCBsZWF2ZSBvdGhlciBjYWxsIHVucHJvdGVjdGVkLgorICoJSEJfTE9DSyBpbiB0aGVvcnkgaXMgc2xvd2VyIHRoYW4gSEJfR0xPQkFMLCBidXQgYXMgdGhlIGhhc2hiaW4KKyAqIGNvbnRlbnQgaXMgYWx3YXlzIHNtYWxsIGNvbnRlbnRpb24gaXMgbm90IGhpZ2gsIHNvIGl0IGRvZXNuJ3QgbWF0dGVyCisgKiBtdWNoLiBIQl9MT0NLIGlzIHByb2JhYmx5IGZhc3RlciB0aGFuIEhCX0xPQ0FMLgorICoKKyAqIGhhc2hiaW4tPmhiX3NwaW5sb2NrIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglUaGUgc3BpbmxvY2sgdGhhdCBIQl9MT0NLIHVzZXMgaXMgYXZhaWxhYmxlIGZvciBjYWxsZXIsIHNvIHRoYXQKKyAqIHRoZSBjYWxsZXIgY2FuIHByb3RlY3QgdW5wcm90ZWN0ZWQgY2FsbHMgKHNlZSBiZWxvdykuCisgKglJZiB0aGUgY2FsbGVyIHdhbnQgdG8gZG8gZW50aXJlbHkgaXRzIG93biBsb2NraW5nIChIQl9OT0xPQ0spLCBoZQorICogY2FuIGRvIHNvIGFuZCBtYXkgdXNlIHNhZmVseSB0aGlzIHNwaW5sb2NrLgorICoJTG9ja2luZyBpcyBkb25lIGxpa2UgdGhpcyA6CisgKgkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisgKglSZWxlYXNpbmcgdGhlIGxvY2sgOgorICoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisgKgorICogU2FmZSAmIFByb3RlY3RlZCBjYWxscyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglUaGUgZm9sbG93aW5nIGNhbGxzIGFyZSBzYWZlIG9yIHByb3RlY3RlZCB2aWEgSEJfTE9DSyA6CisgKgkJbyBoYXNoYmluX25ldygpCQktPiBzYWZlCisgKgkJbyBoYXNoYmluX2RlbGV0ZSgpCisgKgkJbyBoYXNoYmluX2luc2VydCgpCisgKgkJbyBoYXNoYmluX3JlbW92ZV9maXJzdCgpCisgKgkJbyBoYXNoYmluX3JlbW92ZSgpCisgKgkJbyBoYXNoYmluX3JlbW92ZV90aGlzKCkKKyAqCQlvIEhBU0hCSU5fR0VUX1NJWkUoKQktPiBhdG9taWMKKyAqCisgKglUaGUgZm9sbG93aW5nIGNhbGxzIG9ubHkgcHJvdGVjdCB0aGUgaGFzaGJpbiBpdHNlbGYgOgorICoJCW8gaGFzaGJpbl9sb2NrX2ZpbmQoKQorICoJCW8gaGFzaGJpbl9maW5kX25leHQoKQorICoKKyAqIFVucHJvdGVjdGVkIGNhbGxzIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tCisgKglUaGUgZm9sbG93aW5nIGNhbGxzIG5lZWQgdG8gYmUgcHJvdGVjdGVkIGJ5IHRoZSBjYWxsZXIgOgorICoJCW8gaGFzaGJpbl9maW5kKCkKKyAqCQlvIGhhc2hiaW5fZ2V0X2ZpcnN0KCkKKyAqCQlvIGhhc2hiaW5fZ2V0X25leHQoKQorICoKKyAqIExvY2tpbmcgUG9saWN5IDoKKyAqIC0tLS0tLS0tLS0tLS0tCisgKglJZiB0aGUgaGFzaGJpbiBpcyB1c2VkIG9ubHkgaW4gYSBzaW5nbGUgdGhyZWFkIG9mIGV4ZWN1dGlvbgorICogKGV4cGxpY2l0bHkgb3IgaW1wbGljaXRlbHkpLCB5b3UgY2FuIHVzZSBIQl9OT0xPQ0sKKyAqCUlmIHRoZSBjYWxsaW5nIG1vZHVsZSBhbHJlYWR5IHByb3ZpZGUgY29uY3VycmVudCBhY2Nlc3MgcHJvdGVjdGlvbiwKKyAqIHlvdSBtYXkgdXNlIEhCX05PTE9DSy4KKyAqCisgKglJbiBhbGwgb3RoZXIgY2FzZXMsIHlvdSBuZWVkIHRvIHVzZSBIQl9MT0NLIGFuZCBsb2NrIHRoZSBoYXNoYmluCisgKiBldmVyeSB0aW1lIGJlZm9yZSBjYWxsaW5nIG9uZSBvZiB0aGUgdW5wcm90ZWN0ZWQgY2FsbHMuIFlvdSBhbHNvIG11c3QKKyAqIHVzZSB0aGUgcG9pbnRlciByZXR1cm5lZCBieSB0aGUgdW5wcm90ZWN0ZWQgY2FsbCB3aXRoaW4gdGhlIGxvY2tlZAorICogcmVnaW9uLgorICoKKyAqIEV4dHJhIGNhcmUgZm9yIGVudW1lcmF0aW9uIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgloYXNoYmluX2dldF9maXJzdCgpIGFuZCBoYXNoYmluX2dldF9uZXh0KCkgdXNlIHRoZSBoYXNoYmluIHRvCisgKiBzdG9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiwgaW4gaGJfY3VycmVudC4KKyAqCUFzIGxvbmcgYXMgdGhlIGhhc2hiaW4gcmVtYWlucyBsb2NrZWQsIHRoaXMgaXMgc2FmZS4gSWYgeW91IHVubG9jaworICogdGhlIGhhc2hiaW4sIHRoZSBjdXJyZW50IHBvc2l0aW9uIG1heSBjaGFuZ2UgaWYgYW55Ym9keSBlbHNlIG1vZGlmeQorICogb3IgZW51bWVyYXRlIHRoZSBoYXNoYmluLgorICoJU3VtbWFyeSA6IGRvIHRoZSBmdWxsIGVudW1lcmF0aW9uIHdoaWxlIGxvY2tlZC4KKyAqCisgKglBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHVzZSBoYXNoYmluX2ZpbmRfbmV4dCgpLiBCdXQsIHRoaXMgd2lsbAorICogYmUgc2xvd2VyLCBpcyBtb3JlIGNvbXBsZXggdG8gdXNlIGFuZCBkb2Vzbid0IHByb3RlY3QgdGhlIGhhc2hiaW4KKyAqIGNvbnRlbnQuIFNvLCBjYXJlIGlzIG5lZWRlZCBoZXJlIGFzIHdlbGwuCisgKgorICogT3RoZXIgaXNzdWVzIDoKKyAqIC0tLS0tLS0tLS0tLQorICoJSSBiZWxpZXZlIHRoYXQgd2UgYXJlIG92ZXJkb2luZyBpdCBieSB1c2luZyBzcGluX2xvY2tfaXJxc2F2ZSgpCisgKiBhbmQgd2Ugc2hvdWxkIHVzZSBvbmx5IHNwaW5fbG9ja19iaCgpIG9yIHNpbWlsYXIuIEJ1dCwgSSBkb24ndCBoYXZlCisgKiB0aGUgYmFsbHMgdG8gdHJ5IGl0IG91dC4KKyAqCURvbid0IGJlbGlldmUgdGhhdCBiZWNhdXNlIGhhc2hiaW4gYXJlIG5vdyAoc29tZXdoYXQpIFNNUCBzYWZlCisgKiB0aGF0IHRoZSByZXN0IG9mIHRoZSBjb2RlIGlzLiBIaWdoZXIgbGF5ZXJzIHRlbmQgdG8gYmUgc2FmZXN0LAorICogYnV0IExBUCBhbmQgTE1QIHdvdWxkIG5lZWQgc29tZSBzZXJpb3VzIGRlZGljYXRlZCBsb3ZlLgorICoKKyAqIEplYW4gSUkKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lycXVldWUuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBRVUVVRSBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIYXNoYmluCisgKi8KKyNkZWZpbmUgR0VUX0hBU0hCSU4oeCkgKCB4ICYgSEFTSEJJTl9NQVNLICkKKworLyoKKyAqIEZ1bmN0aW9uIGhhc2ggKG5hbWUpCisgKgorICogICAgVGhpcyBmdW5jdGlvbiBoYXNoIHRoZSBpbnB1dCBzdHJpbmcgJ25hbWUnIHVzaW5nIHRoZSBFTEYgaGFzaAorICogICAgZnVuY3Rpb24gZm9yIHN0cmluZ3MuCisgKi8KK3N0YXRpYyBfX3UzMiBoYXNoKCBjb25zdCBjaGFyKiBuYW1lKQoreworCV9fdTMyIGggPSAwOworCV9fdTMyIGc7CisJCisJd2hpbGUoKm5hbWUpIHsKKwkJaCA9IChoPDw0KSArICpuYW1lKys7CisJCWlmICgoZyA9IChoICYgMHhmMDAwMDAwMCkpKQorCQkJaCBePWc+PjI0OworCQloICY9fmc7CisJfQorCXJldHVybiBoOworfQorCisvKgorICogRnVuY3Rpb24gZW5xdWV1ZV9maXJzdCAocXVldWUsIHByb2MpCisgKgorICogICAgSW5zZXJ0IGl0ZW0gZmlyc3QgaW4gcXVldWUuCisgKgorICovCitzdGF0aWMgdm9pZCBlbnF1ZXVlX2ZpcnN0KGlyZGFfcXVldWVfdCAqKnF1ZXVlLCBpcmRhX3F1ZXVlX3QqIGVsZW1lbnQpCit7CisJCisJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKgorCSAqIENoZWNrIGlmIHF1ZXVlIGlzIGVtcHR5LgorCSAqLworCWlmICggKnF1ZXVlID09IE5VTEwgKSB7CisJCS8qCisJCSAqIFF1ZXVlIGlzIGVtcHR5LiAgSW5zZXJ0IG9uZSBlbGVtZW50IGludG8gdGhlIHF1ZXVlLgorCQkgKi8KKwkJZWxlbWVudC0+cV9uZXh0ID0gZWxlbWVudC0+cV9wcmV2ID0gKnF1ZXVlID0gZWxlbWVudDsKKwkJCisJfSBlbHNlIHsKKwkJLyoKKwkJICogUXVldWUgaXMgbm90IGVtcHR5LiAgSW5zZXJ0IGVsZW1lbnQgaW50byBmcm9udCBvZiBxdWV1ZS4KKwkJICovCisJCWVsZW1lbnQtPnFfbmV4dCAgICAgICAgICA9ICgqcXVldWUpOworCQkoKnF1ZXVlKS0+cV9wcmV2LT5xX25leHQgPSBlbGVtZW50OworCQllbGVtZW50LT5xX3ByZXYgICAgICAgICAgPSAoKnF1ZXVlKS0+cV9wcmV2OworCQkoKnF1ZXVlKS0+cV9wcmV2ICAgICAgICAgPSBlbGVtZW50OworCQkoKnF1ZXVlKSAgICAgICAgICAgICAgICAgPSBlbGVtZW50OworCX0KK30KKworCisvKgorICogRnVuY3Rpb24gZGVxdWV1ZSAocXVldWUpCisgKgorICogICAgUmVtb3ZlIGZpcnN0IGVudHJ5IGluIHF1ZXVlCisgKgorICovCitzdGF0aWMgaXJkYV9xdWV1ZV90ICpkZXF1ZXVlX2ZpcnN0KGlyZGFfcXVldWVfdCAqKnF1ZXVlKQoreworCWlyZGFfcXVldWVfdCAqcmV0OworCisJSVJEQV9ERUJVRyggNCwgImRlcXVldWVfZmlyc3QoKVxuIik7CisJCisJLyoKKwkgKiBTZXQgcmV0dXJuIHZhbHVlCisJICovCisJcmV0ID0gICpxdWV1ZTsKKwkKKwlpZiAoICpxdWV1ZSA9PSBOVUxMICkgeworCQkvKgorCQkgKiBRdWV1ZSB3YXMgZW1wdHkuCisJCSAqLworCX0gZWxzZSBpZiAoICgqcXVldWUpLT5xX25leHQgPT0gKnF1ZXVlICkgeworCQkvKiAKKwkJICogIFF1ZXVlIG9ubHkgY29udGFpbmVkIGEgc2luZ2xlIGVsZW1lbnQuIEl0IHdpbGwgbm93IGJlCisJCSAqICBlbXB0eS4gIAorCQkgKi8KKwkJKnF1ZXVlID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBRdWV1ZSBjb250YWluZWQgc2V2ZXJhbCBlbGVtZW50LiAgUmVtb3ZlIHRoZSBmaXJzdCBvbmUuCisJCSAqLworCQkoKnF1ZXVlKS0+cV9wcmV2LT5xX25leHQgPSAoKnF1ZXVlKS0+cV9uZXh0OworCQkoKnF1ZXVlKS0+cV9uZXh0LT5xX3ByZXYgPSAoKnF1ZXVlKS0+cV9wcmV2OworCQkqcXVldWUgPSAoKnF1ZXVlKS0+cV9uZXh0OworCX0KKwkKKwkvKgorCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBlbnRyeSAob3IgTlVMTCBvZiBxdWV1ZSB3YXMgZW1wdHkpLgorCSAqLworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBkZXF1ZXVlX2dlbmVyYWwgKHF1ZXVlLCBlbGVtZW50KQorICoKKyAqCisgKi8KK3N0YXRpYyBpcmRhX3F1ZXVlX3QgKmRlcXVldWVfZ2VuZXJhbChpcmRhX3F1ZXVlX3QgKipxdWV1ZSwgaXJkYV9xdWV1ZV90KiBlbGVtZW50KQoreworCWlyZGFfcXVldWVfdCAqcmV0OworCQorCUlSREFfREVCVUcoIDQsICJkZXF1ZXVlX2dlbmVyYWwoKVxuIik7CisJCisJLyoKKwkgKiBTZXQgcmV0dXJuIHZhbHVlCisJICovCisJcmV0ID0gICpxdWV1ZTsKKwkJCisJaWYgKCAqcXVldWUgPT0gTlVMTCApIHsKKwkJLyoKKwkJICogUXVldWUgd2FzIGVtcHR5LgorCQkgKi8KKwl9IGVsc2UgaWYgKCAoKnF1ZXVlKS0+cV9uZXh0ID09ICpxdWV1ZSApIHsKKwkJLyogCisJCSAqICBRdWV1ZSBvbmx5IGNvbnRhaW5lZCBhIHNpbmdsZSBlbGVtZW50LiBJdCB3aWxsIG5vdyBiZQorCQkgKiAgZW1wdHkuICAKKwkJICovCisJCSpxdWV1ZSA9IE5VTEw7CisJCQorCX0gZWxzZSB7CisJCS8qCisJCSAqICBSZW1vdmUgc3BlY2lmaWMgZWxlbWVudC4KKwkJICovCisJCWVsZW1lbnQtPnFfcHJldi0+cV9uZXh0ID0gZWxlbWVudC0+cV9uZXh0OworCQllbGVtZW50LT5xX25leHQtPnFfcHJldiA9IGVsZW1lbnQtPnFfcHJldjsKKwkJaWYgKCAoKnF1ZXVlKSA9PSBlbGVtZW50KQorCQkJKCpxdWV1ZSkgPSBlbGVtZW50LT5xX25leHQ7CisJfQorCQorCS8qCisJICogUmV0dXJuIHRoZSByZW1vdmVkIGVudHJ5IChvciBOVUxMIG9mIHF1ZXVlIHdhcyBlbXB0eSkuCisJICovCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBIQVNIQklOIE1BTkFHRU1FTlQgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRnVuY3Rpb24gaGFzaGJpbl9jcmVhdGUgKCB0eXBlLCBuYW1lICkKKyAqCisgKiAgICBDcmVhdGUgaGFzaGJpbiEKKyAqCisgKi8KK2hhc2hiaW5fdCAqaGFzaGJpbl9uZXcoaW50IHR5cGUpCit7CisJaGFzaGJpbl90KiBoYXNoYmluOworCQorCS8qCisJICogQWxsb2NhdGUgbmV3IGhhc2hiaW4KKwkgKi8KKwloYXNoYmluID0ga21hbGxvYyggc2l6ZW9mKGhhc2hiaW5fdCksIEdGUF9BVE9NSUMpOworCWlmICghaGFzaGJpbikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIEluaXRpYWxpemUgc3RydWN0dXJlCisJICovCisJbWVtc2V0KGhhc2hiaW4sIDAsIHNpemVvZihoYXNoYmluX3QpKTsKKwloYXNoYmluLT5oYl90eXBlID0gdHlwZTsKKwloYXNoYmluLT5tYWdpYyA9IEhCX01BR0lDOworCS8vaGFzaGJpbi0+aGJfY3VycmVudCA9IE5VTEw7CisKKwkvKiBNYWtlIHN1cmUgYWxsIHNwaW5sb2NrJ3MgYXJlIHVubG9ja2VkICovCisJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKKwkJc3Bpbl9sb2NrX2luaXQoJmhhc2hiaW4tPmhiX3NwaW5sb2NrKTsKKwl9CisKKwlyZXR1cm4gaGFzaGJpbjsKK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9uZXcpOworCisKKy8qCisgKiBGdW5jdGlvbiBoYXNoYmluX2RlbGV0ZSAoaGFzaGJpbiwgZnJlZV9mdW5jKQorICoKKyAqICAgIERlc3Ryb3kgaGFzaGJpbiwgdGhlIGZyZWVfZnVuYyBjYW4gYmUgYSB1c2VyIHN1cHBsaWVkIHNwZWNpYWwgcm91dGluZSAKKyAqICAgIGZvciBkZWFsbG9jYXRpbmcgdGhpcyBzdHJ1Y3R1cmUgaWYgaXQncyBjb21wbGV4LiBJZiBub3QgdGhlIHVzZXIgY2FuIAorICogICAganVzdCBzdXBwbHkga2ZyZWUsIHdoaWNoIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhlIGpvYi4KKyAqLworaW50IGhhc2hiaW5fZGVsZXRlKCBoYXNoYmluX3QqIGhhc2hiaW4sIEZSRUVfRlVOQyBmcmVlX2Z1bmMpCit7CisJaXJkYV9xdWV1ZV90KiBxdWV1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgaTsKKworCUlSREFfQVNTRVJUKGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiAtMTspOworCQorCS8qIFN5bmNocm9uaXplICovCisJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfQorCisJLyoKKwkgKiAgRnJlZSB0aGUgZW50cmllcyBpbiB0aGUgaGFzaGJpbiwgVE9ETzogdXNlIGhhc2hiaW5fY2xlYXIgd2hlbgorCSAqICBpdCBoYXMgYmVlbiBzaG93biB0byB3b3JrCisJICovCisJZm9yIChpID0gMDsgaSA8IEhBU0hCSU5fU0laRTsgaSArKyApIHsKKwkJcXVldWUgPSBkZXF1ZXVlX2ZpcnN0KChpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlW2ldKTsKKwkJd2hpbGUgKHF1ZXVlICkgeworCQkJaWYgKGZyZWVfZnVuYykKKwkJCQkoKmZyZWVfZnVuYykocXVldWUpOworCQkJcXVldWUgPSBkZXF1ZXVlX2ZpcnN0KCAKKwkJCQkoaXJkYV9xdWV1ZV90KiopICZoYXNoYmluLT5oYl9xdWV1ZVtpXSk7CisJCX0KKwl9CisJCisJLyogQ2xlYW51cCBsb2NhbCBkYXRhICovCisJaGFzaGJpbi0+aGJfY3VycmVudCA9IE5VTEw7CisJaGFzaGJpbi0+bWFnaWMgPSB+SEJfTUFHSUM7CisKKwkvKiBSZWxlYXNlIGxvY2sgKi8KKwlpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfQorCisJLyoKKwkgKiAgRnJlZSB0aGUgaGFzaGJpbiBzdHJ1Y3R1cmUKKwkgKi8KKwlrZnJlZShoYXNoYmluKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoYXNoYmluX2RlbGV0ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKiogSEFTSEJJTiBMSVNUIE9QRVJBVElPTlMgKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRnVuY3Rpb24gaGFzaGJpbl9pbnNlcnQgKGhhc2hiaW4sIGVudHJ5LCBuYW1lKQorICoKKyAqICAgIEluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSBoYXNoYmluCisgKgorICovCit2b2lkIGhhc2hiaW5faW5zZXJ0KGhhc2hiaW5fdCogaGFzaGJpbiwgaXJkYV9xdWV1ZV90KiBlbnRyeSwgbG9uZyBoYXNodiwgCisJCSAgICBjb25zdCBjaGFyKiBuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCBiaW47CisKKwlJUkRBX0RFQlVHKCA0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuOyk7CisKKwkvKgorCSAqIExvY2F0ZSBoYXNoYmluCisJICovCisJaWYgKCBuYW1lICkKKwkJaGFzaHYgPSBoYXNoKCBuYW1lICk7CisJYmluID0gR0VUX0hBU0hCSU4oIGhhc2h2ICk7CisKKwkvKiBTeW5jaHJvbml6ZSAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLworCQorCS8qCisJICogU3RvcmUgbmFtZSBhbmQga2V5CisJICovCisJZW50cnktPnFfaGFzaCA9IGhhc2h2OworCWlmICggbmFtZSApCisJCXN0cmxjcHkoIGVudHJ5LT5xX25hbWUsIG5hbWUsIHNpemVvZihlbnRyeS0+cV9uYW1lKSk7CisJCisJLyoKKwkgKiBJbnNlcnQgbmV3IGVudHJ5IGZpcnN0CisJICovCisJZW5xdWV1ZV9maXJzdCggKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdLAorCQkgICAgICAgZW50cnkpOworCWhhc2hiaW4tPmhiX3NpemUrKzsKKworCS8qIFJlbGVhc2UgbG9jayAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCit9CitFWFBPUlRfU1lNQk9MKGhhc2hiaW5faW5zZXJ0KTsKKworLyogCisgKiAgRnVuY3Rpb24gaGFzaGJpbl9yZW1vdmVfZmlyc3QgKGhhc2hiaW4pCisgKgorICogICAgUmVtb3ZlIGZpcnN0IGVudHJ5IG9mIHRoZSBoYXNoYmluCisgKgorICogTm90ZSA6IHRoaXMgZnVuY3Rpb24gbm8gbG9uZ2VyIHVzZSBoYXNoYmluX3JlbW92ZSgpLCBidXQgZG9lcyB0aGluZ3MKKyAqIHNpbWlsYXIgdG8gaGFzaGJpbl9yZW1vdmVfdGhpcygpLCBzbyBjYW4gYmUgY29uc2lkZXJlZCBzYWZlLgorICogSmVhbiBJSQorICovCit2b2lkICpoYXNoYmluX3JlbW92ZV9maXJzdCggaGFzaGJpbl90ICpoYXNoYmluKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWlyZGFfcXVldWVfdCAqZW50cnkgPSBOVUxMOworCisJLyogU3luY2hyb25pemUgKi8KKwlpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KKworCWVudHJ5ID0gaGFzaGJpbl9nZXRfZmlyc3QoIGhhc2hiaW4pOworCWlmICggZW50cnkgIT0gTlVMTCkgeworCQlpbnQJYmluOworCQlsb25nCWhhc2h2OworCQkvKgorCQkgKiBMb2NhdGUgaGFzaGJpbgorCQkgKi8KKwkJaGFzaHYgPSBlbnRyeS0+cV9oYXNoOworCQliaW4gPSBHRVRfSEFTSEJJTiggaGFzaHYgKTsKKworCQkvKgorCQkgKiBEZXF1ZXVlIHRoZSBlbnRyeS4uLgorCQkgKi8KKwkJZGVxdWV1ZV9nZW5lcmFsKCAoaXJkYV9xdWV1ZV90KiopICZoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0sCisJCQkJIChpcmRhX3F1ZXVlX3QqKSBlbnRyeSApOworCQloYXNoYmluLT5oYl9zaXplLS07CisJCWVudHJ5LT5xX25leHQgPSBOVUxMOworCQllbnRyeS0+cV9wcmV2ID0gTlVMTDsKKworCQkvKgorCQkgKiAgQ2hlY2sgaWYgdGhpcyBpdGVtIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgYW5kIGluCisJCSAqICB0aGF0IGNhc2Ugd2UgbXVzdCByZXNldCBoYl9jdXJyZW50CisJCSAqLworCQlpZiAoIGVudHJ5ID09IGhhc2hiaW4tPmhiX2N1cnJlbnQpCisJCQloYXNoYmluLT5oYl9jdXJyZW50ID0gTlVMTDsKKwl9CisKKwkvKiBSZWxlYXNlIGxvY2sgKi8KKwlpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLworCisJcmV0dXJuIGVudHJ5OworfQorCisKKy8qIAorICogIEZ1bmN0aW9uIGhhc2hiaW5fcmVtb3ZlIChoYXNoYmluLCBoYXNodiwgbmFtZSkKKyAqCisgKiAgICBSZW1vdmUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICoKKyAqICBUaGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgaGlnaGx5IGRpc2NvdXJhZ2VkLCBiZWNhdXNlIHRoZSB3aG9sZQorICogIGNvbmNlcHQgYmVoaW5kIGhhc2hiaW5fcmVtb3ZlKCkgaXMgYnJva2VuLiBJbiBtYW55IGNhc2VzLCBpdCdzIG5vdAorICogIHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgdW5pY2l0eSBvZiB0aGUgaW5kZXggKGVpdGhlciBoYXNodiBvciBuYW1lKSwKKyAqICBsZWFkaW5nIHRvIHJlbW92aW5nIHRoZSBXUk9ORyBlbnRyeS4KKyAqICBUaGUgb25seSBzaW1wbGUgc2FmZSB1c2UgaXMgOgorICoJCWhhc2hiaW5fcmVtb3ZlKGhhc2JpbiwgKGludCkgc2VsZiwgTlVMTCk7CisgKiAgSW4gb3RoZXIgY2FzZSwgeW91IG11c3QgdGhpbmsgaGFyZCB0byBndWFyYW50ZWUgdW5pY2l0eSBvZiB0aGUgaW5kZXguCisgKiAgSmVhbiBJSQorICovCit2b2lkKiBoYXNoYmluX3JlbW92ZSggaGFzaGJpbl90KiBoYXNoYmluLCBsb25nIGhhc2h2LCBjb25zdCBjaGFyKiBuYW1lKQoreworCWludCBiaW4sIGZvdW5kID0gRkFMU0U7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaXJkYV9xdWV1ZV90KiBlbnRyeTsKKworCUlSREFfREVCVUcoIDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoIGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKwlJUkRBX0FTU0VSVCggaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiBOVUxMOyk7CisJCisJLyoKKwkgKiBMb2NhdGUgaGFzaGJpbgorCSAqLworCWlmICggbmFtZSApCisJCWhhc2h2ID0gaGFzaCggbmFtZSApOworCWJpbiA9IEdFVF9IQVNIQklOKCBoYXNodiApOworCisJLyogU3luY2hyb25pemUgKi8KKwlpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KKworCS8qCisJICogU2VhcmNoIGZvciBlbnRyeQorCSAqLworCWVudHJ5ID0gaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdOworCWlmICggZW50cnkgKSB7CisJCWRvIHsKKwkJCS8qCisJCQkgKiBDaGVjayBmb3Iga2V5CisJCQkgKi8KKwkJCWlmICggZW50cnktPnFfaGFzaCA9PSBoYXNodiApIHsKKwkJCQkvKgorCQkJCSAqIE5hbWUgY29tcGFyZSB0b28/CisJCQkJICovCisJCQkJaWYgKCBuYW1lICkgeworCQkJCQlpZiAoIHN0cmNtcCggZW50cnktPnFfbmFtZSwgbmFtZSkgPT0gMCkKKwkJCQkJeworCQkJCQkJZm91bmQgPSBUUlVFOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlmb3VuZCA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWVudHJ5ID0gZW50cnktPnFfbmV4dDsKKwkJfSB3aGlsZSAoIGVudHJ5ICE9IGhhc2hiaW4tPmhiX3F1ZXVlWyBiaW4gXSApOworCX0KKwkKKwkvKgorCSAqIElmIGVudHJ5IHdhcyBmb3VuZCwgZGVxdWV1ZSBpdAorCSAqLworCWlmICggZm91bmQgKSB7CisJCWRlcXVldWVfZ2VuZXJhbCggKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdLAorCQkJCSAoaXJkYV9xdWV1ZV90KikgZW50cnkgKTsKKwkJaGFzaGJpbi0+aGJfc2l6ZS0tOworCisJCS8qCisJCSAqICBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLCBhbmQgaW4KKwkJICogIHRoYXQgY2FzZSB3ZSBtdXN0IHJlc2V0IGhiX2N1cnJlbnQKKwkJICovCisJCWlmICggZW50cnkgPT0gaGFzaGJpbi0+aGJfY3VycmVudCkKKwkJCWhhc2hiaW4tPmhiX2N1cnJlbnQgPSBOVUxMOworCX0KKworCS8qIFJlbGVhc2UgbG9jayAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCisgICAgICAgCisJCisJLyogUmV0dXJuICovCisJaWYgKCBmb3VuZCApIAorCQlyZXR1cm4gZW50cnk7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKwkKK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9yZW1vdmUpOworCisvKiAKKyAqICBGdW5jdGlvbiBoYXNoYmluX3JlbW92ZV90aGlzIChoYXNoYmluLCBlbnRyeSkKKyAqCisgKiAgICBSZW1vdmUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICoKKyAqIEluIHNvbWUgY2FzZXMsIHRoZSB1c2VyIG9mIGhhc2hiaW4gY2FuJ3QgZ3VhcmFudGVlIHRoZSB1bmljaXR5CisgKiBvZiBlaXRoZXIgdGhlIGhhc2h2IG9yIG5hbWUuCisgKiBJbiB0aG9zZSBjYXNlcywgdXNpbmcgdGhlIGFib3ZlIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gY2F1c2UgdHJvdWJsZXMsCisgKiBzbyB3ZSB1c2UgdGhpcyBvbmUgaW5zdGVhZC4uLgorICogQW5kIGJ5IHRoZSB3YXksIGl0J3MgYWxzbyBmYXN0ZXIsIGJlY2F1c2Ugd2Ugc2tpcCB0aGUgc2VhcmNoIHBoYXNlIDstKQorICovCit2b2lkKiBoYXNoYmluX3JlbW92ZV90aGlzKCBoYXNoYmluX3QqIGhhc2hiaW4sIGlyZGFfcXVldWVfdCogZW50cnkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50CWJpbjsKKwlsb25nCWhhc2h2OworCisJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKKwlJUkRBX0FTU0VSVCggZW50cnkgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKwkKKwkvKiBTeW5jaHJvbml6ZSAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLworCisJLyogQ2hlY2sgaWYgdmFsaWQgYW5kIG5vdCBhbHJlYWR5IHJlbW92ZWQuLi4gKi8KKwlpZigoZW50cnktPnFfbmV4dCA9PSBOVUxMKSB8fCAoZW50cnktPnFfcHJldiA9PSBOVUxMKSkgeworCQllbnRyeSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogTG9jYXRlIGhhc2hiaW4KKwkgKi8KKwloYXNodiA9IGVudHJ5LT5xX2hhc2g7CisJYmluID0gR0VUX0hBU0hCSU4oIGhhc2h2ICk7CisKKwkvKgorCSAqIERlcXVldWUgdGhlIGVudHJ5Li4uCisJICovCisJZGVxdWV1ZV9nZW5lcmFsKCAoaXJkYV9xdWV1ZV90KiopICZoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0sCisJCQkgKGlyZGFfcXVldWVfdCopIGVudHJ5ICk7CisJaGFzaGJpbi0+aGJfc2l6ZS0tOworCWVudHJ5LT5xX25leHQgPSBOVUxMOworCWVudHJ5LT5xX3ByZXYgPSBOVUxMOworCisJLyoKKwkgKiAgQ2hlY2sgaWYgdGhpcyBpdGVtIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgYW5kIGluCisJICogIHRoYXQgY2FzZSB3ZSBtdXN0IHJlc2V0IGhiX2N1cnJlbnQKKwkgKi8KKwlpZiAoIGVudHJ5ID09IGhhc2hiaW4tPmhiX2N1cnJlbnQpCisJCWhhc2hiaW4tPmhiX2N1cnJlbnQgPSBOVUxMOworb3V0OgorCS8qIFJlbGVhc2UgbG9jayAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCisKKwlyZXR1cm4gZW50cnk7Cit9CitFWFBPUlRfU1lNQk9MKGhhc2hiaW5fcmVtb3ZlX3RoaXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKiogSEFTSEJJTiBFTlVNRVJBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZ1bmN0aW9uIGhhc2hiaW5fY29tbW9uX2ZpbmQgKGhhc2hiaW4sIGhhc2h2LCBuYW1lKQorICoKKyAqICAgIEZpbmQgaXRlbSB3aXRoIHRoZSBnaXZlbiBoYXNodiBvciBuYW1lCisgKgorICovCit2b2lkKiBoYXNoYmluX2ZpbmQoIGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSApCit7CisJaW50IGJpbjsKKwlpcmRhX3F1ZXVlX3QqIGVudHJ5OworCisJSVJEQV9ERUJVRyggNCwgImhhc2hiaW5fZmluZCgpXG4iKTsKKworCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm4gTlVMTDspOworCisJLyoKKwkgKiBMb2NhdGUgaGFzaGJpbgorCSAqLworCWlmICggbmFtZSApCisJCWhhc2h2ID0gaGFzaCggbmFtZSApOworCWJpbiA9IEdFVF9IQVNIQklOKCBoYXNodiApOworCQorCS8qCisJICogU2VhcmNoIGZvciBlbnRyeQorCSAqLworCWVudHJ5ID0gaGFzaGJpbi0+aGJfcXVldWVbIGJpbl07CisJaWYgKCBlbnRyeSApIHsKKwkJZG8geworCQkJLyoKKwkJCSAqIENoZWNrIGZvciBrZXkKKwkJCSAqLworCQkJaWYgKCBlbnRyeS0+cV9oYXNoID09IGhhc2h2ICkgeworCQkJCS8qCisJCQkJICogTmFtZSBjb21wYXJlIHRvbz8KKwkJCQkgKi8KKwkJCQlpZiAoIG5hbWUgKSB7CisJCQkJCWlmICggc3RyY21wKCBlbnRyeS0+cV9uYW1lLCBuYW1lICkgPT0gMCApIHsKKwkJCQkJCXJldHVybiBlbnRyeTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBlbnRyeTsKKwkJCQl9CisJCQl9CisJCQllbnRyeSA9IGVudHJ5LT5xX25leHQ7CisJCX0gd2hpbGUgKCBlbnRyeSAhPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0gKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9maW5kKTsKKworLyoKKyAqIEZ1bmN0aW9uIGhhc2hiaW5fbG9ja19maW5kIChoYXNoYmluLCBoYXNodiwgbmFtZSkKKyAqCisgKiAgICBGaW5kIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaGFzaHYgb3IgbmFtZQorICoKKyAqIFNhbWUsIGJ1dCB3aXRoIHNwaW5sb2NrIHByb3RlY3Rpb24uLi4KKyAqIEkgY2FsbCBpdCBzYWZlLCBidXQgaXQncyBvbmx5IHNhZmUgd2l0aCByZXNwZWN0IHRvIHRoZSBoYXNoYmluLCBub3QgaXRzCisgKiBjb250ZW50LiAtIEplYW4gSUkKKyAqLwordm9pZCogaGFzaGJpbl9sb2NrX2ZpbmQoIGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSApCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaXJkYV9xdWV1ZV90KiBlbnRyeTsKKworCS8qIFN5bmNocm9uaXplICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFNlYXJjaCBmb3IgZW50cnkKKwkgKi8KKwllbnRyeSA9IChpcmRhX3F1ZXVlX3QqICkgaGFzaGJpbl9maW5kKCBoYXNoYmluLCBoYXNodiwgbmFtZSApOworCisJLyogUmVsZWFzZSBsb2NrICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlbnRyeTsKK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9sb2NrX2ZpbmQpOworCisvKgorICogRnVuY3Rpb24gaGFzaGJpbl9maW5kIChoYXNoYmluLCBoYXNodiwgbmFtZSwgcG5leHQpCisgKgorICogICAgRmluZCBhbiBpdGVtIHdpdGggdGhlIGdpdmVuIGhhc2h2IG9yIG5hbWUsIGFuZCBpdHMgc3VjY2Vzc29yCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvdyB0byBkbyBjb25jdXJyZW50IGVudW1lcmF0aW9ucyB3aXRob3V0IHRoZQorICogbmVlZCB0byBsb2NrIG92ZXIgdGhlIHdob2xlIHNlc3Npb24sIGJlY2F1c2UgdGhlIGNhbGxlciBrZWVwIHRoZQorICogY29udGV4dCBvZiB0aGUgc2VhcmNoLiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgbWlnaHQgZmFpbCBhbmQgcmV0dXJuCisgKiBOVUxMIGlmIHRoZSBlbnRyeSBpcyByZW1vdmVkLiAtIEplYW4gSUkKKyAqLwordm9pZCogaGFzaGJpbl9maW5kX25leHQoIGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSwKKwkJCSB2b2lkICoqIHBuZXh0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWlyZGFfcXVldWVfdCogZW50cnk7CisKKwkvKiBTeW5jaHJvbml6ZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBTZWFyY2ggZm9yIGN1cnJlbnQgZW50cnkKKwkgKiBUaGlzIGFsbG93IHRvIGNoZWNrIGlmIHRoZSBjdXJyZW50IGl0ZW0gaXMgc3RpbGwgaW4gdGhlCisJICogaGFzaGJpbiBvciBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCWVudHJ5ID0gKGlyZGFfcXVldWVfdCogKSBoYXNoYmluX2ZpbmQoIGhhc2hiaW4sIGhhc2h2LCBuYW1lICk7CisKKwkvKgorCSAqIFRyaWNrIGhhc2hiaW5fZ2V0X25leHQoKSB0byByZXR1cm4gd2hhdCB3ZSB3YW50CisJICovCisJaWYoZW50cnkpIHsKKwkJaGFzaGJpbi0+aGJfY3VycmVudCA9IGVudHJ5OworCQkqcG5leHQgPSBoYXNoYmluX2dldF9uZXh0KCBoYXNoYmluICk7CisJfSBlbHNlCisJCSpwbmV4dCA9IE5VTEw7CisKKwkvKiBSZWxlYXNlIGxvY2sgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVudHJ5OworfQorRVhQT1JUX1NZTUJPTChoYXNoYmluX2ZpbmRfbmV4dCk7CisKKy8qCisgKiBGdW5jdGlvbiBoYXNoYmluX2dldF9maXJzdCAoaGFzaGJpbikKKyAqCisgKiAgICBHZXQgYSBwb2ludGVyIHRvIGZpcnN0IGVsZW1lbnQgaW4gaGFzaGJpbiwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCisgKiAgICBjYWxsZWQgYmVmb3JlIGFueSBjYWxscyB0byBoYXNoYmluX2dldF9uZXh0KCkhCisgKgorICovCitpcmRhX3F1ZXVlX3QgKmhhc2hiaW5fZ2V0X2ZpcnN0KCBoYXNoYmluX3QqIGhhc2hiaW4pIAoreworCWlyZGFfcXVldWVfdCAqZW50cnk7CisJaW50IGk7CisKKwlJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKKworCWlmICggaGFzaGJpbiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoIGkgPSAwOyBpIDwgSEFTSEJJTl9TSVpFOyBpICsrICkgeworCQllbnRyeSA9IGhhc2hiaW4tPmhiX3F1ZXVlWyBpXTsKKwkJaWYgKCBlbnRyeSkgeworCQkJaGFzaGJpbi0+aGJfY3VycmVudCA9IGVudHJ5OworCQkJcmV0dXJuIGVudHJ5OworCQl9CisJfQorCS8qCisJICogIERpZCBub3QgZmluZCBhbnkgaXRlbSBpbiBoYXNoYmluCisJICovCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGhhc2hiaW5fZ2V0X2ZpcnN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGhhc2hiaW5fZ2V0X25leHQgKGhhc2hiaW4pCisgKgorICogICAgR2V0IG5leHQgaXRlbSBpbiBoYXNoYmluLiBBIHNlcmllcyBvZiBoYXNoYmluX2dldF9uZXh0KCkgY2FsbHMgbXVzdAorICogICAgYmUgc3RhcnRlZCBieSBhIGNhbGwgdG8gaGFzaGJpbl9nZXRfZmlyc3QoKS4gVGhlIGZ1bmN0aW9uIHJldHVybnMKKyAqICAgIE5VTEwgd2hlbiBhbGwgaXRlbXMgaGF2ZSBiZWVuIHRyYXZlcnNlZAorICogCisgKiBUaGUgY29udGV4dCBvZiB0aGUgc2VhcmNoIGlzIHN0b3JlZCB3aXRoaW4gdGhlIGhhc2hiaW4sIHNvIHlvdSBtdXN0CisgKiBwcm90ZWN0IHlvdXJzZWxmIGZyb20gY29uY3VycmVudCBlbnVtZXJhdGlvbnMuIC0gSmVhbiBJSQorICovCitpcmRhX3F1ZXVlX3QgKmhhc2hiaW5fZ2V0X25leHQoIGhhc2hiaW5fdCAqaGFzaGJpbikKK3sKKwlpcmRhX3F1ZXVlX3QqIGVudHJ5OworCWludCBiaW47CisJaW50IGk7CisKKwlJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKKworCWlmICggaGFzaGJpbi0+aGJfY3VycmVudCA9PSBOVUxMKSB7CisJCUlSREFfQVNTRVJUKCBoYXNoYmluLT5oYl9jdXJyZW50ICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisJCXJldHVybiBOVUxMOworCX0JCisJZW50cnkgPSBoYXNoYmluLT5oYl9jdXJyZW50LT5xX25leHQ7CisJYmluID0gR0VUX0hBU0hCSU4oIGVudHJ5LT5xX2hhc2gpOworCisJLyogIAorCSAqICBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IGJhY2sgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUKKwkgKiAgYWdhaW4gCisJICovCisJaWYgKCBlbnRyeSAhPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0pIHsKKwkJaGFzaGJpbi0+aGJfY3VycmVudCA9IGVudHJ5OworCisJCXJldHVybiBlbnRyeTsKKwl9CisKKwkvKgorCSAqICBDaGVjayB0aGF0IHRoaXMgaXMgbm90IHRoZSBsYXN0IHF1ZXVlIGluIGhhc2hiaW4KKwkgKi8KKwlpZiAoIGJpbiA+PSBIQVNIQklOX1NJWkUpCisJCXJldHVybiBOVUxMOworCQorCS8qCisJICogIE1vdmUgdG8gbmV4dCBxdWV1ZSBpbiBoYXNoYmluCisJICovCisJYmluKys7CisJZm9yICggaSA9IGJpbjsgaSA8IEhBU0hCSU5fU0laRTsgaSsrICkgeworCQllbnRyeSA9IGhhc2hiaW4tPmhiX3F1ZXVlWyBpXTsKKwkJaWYgKCBlbnRyeSkgeworCQkJaGFzaGJpbi0+aGJfY3VycmVudCA9IGVudHJ5OworCQkJCisJCQlyZXR1cm4gZW50cnk7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGhhc2hiaW5fZ2V0X25leHQpOwo=