LyoqCiAqIEBmaWxlIGRlYnVnX2xpbmUuYwogKiBEV0FSRiAyIGRlYnVnIGxpbmUgaW5mbyBjcmVhdGlvbiBoZWxwZXIKICoKICogQHJlbWFyayBDb3B5cmlnaHQgMjAwNyBPUHJvZmlsZSBhdXRob3JzCiAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCiAqCiAqIEBhdXRob3IgUGhpbGlwcGUgRWxpZQogKi8KCiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxiZmQuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgoKI2luY2x1ZGUgIm9waml0Y29udi5oIgojaW5jbHVkZSAiaml0ZHVtcC5oIgojaW5jbHVkZSAib3BhZ2VudC5oIgojaW5jbHVkZSAib3BfbGliaWJlcnR5LmgiCiNpbmNsdWRlICJvcF9ncm93YWJsZV9idWZmZXIuaCIKCi8qCiAqIFRlcm1pbm9sb2d5IGNvbWVzIGZyb20gdGhlIFRJUyBEV0FSRiBEZWJ1Z2dpbmcgSW5mb3JtYXRpb24gRm9ybWF0CiAqIHZlcnNpb24gMi4wCiAqLwoKdHlwZWRlZiB1aW50MzJfdCB1d29yZDsKdHlwZWRlZiB1aW50MTZfdCB1aGFsZjsKdHlwZWRlZiBpbnQzMl90ICBzd29yZDsKdHlwZWRlZiBpbnQxNl90ICBzaGFsZjsKdHlwZWRlZiB1aW50OF90ICB1Ynl0ZTsKdHlwZWRlZiBpbnQ4X3QgICBzYnl0ZTsKCi8qCiAqIE1hbnkgb2YgdGhlIGZvbGxvd2luZyBlbnVtIGFyZSBpbmNvbXBsZXRlIGFuZCBkZWZpbmUgb25seSB0aGUgc3Vic2V0CiAqIG9mIERXQVJGIHdlIHVzZS4KICovCmVudW0gbG5zX29wY29kZSB7CglEV19MTlNfY29weT0xLAoJRFdfTE5TX2FkdmFuY2VfcGMsCglEV19MTlNfYWR2YW5jZV9saW5lLAoJRFdfTE5TX3NldF9maWxlLAoJRFdfTE5TX3NldF9jb2x1bW4sCglEV19MTlNfbmVnYXRlX3N0bXQsCglEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrLAoJRFdfTE5TX2NvbnN0X2FkZF9wYywKCURXX0xOU19maXhlZF9hZHZhbmNlX3BjLAoKCS8qIEFkZGluZyBuZXcgb3Bjb2RlIG5lZWRzIGFuIHVwZGF0ZSBvZiB0aGUgc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aAoJICogYXJyYXkgKi8KCglEV19MTlNfbWF4X29wY29kZSwKfTsKCmVudW0gbG5lX29wY29kZSB7CglEV19MTkVfZW5kX3NlcXVlbmNlID0gMSwKCURXX0xORV9zZXRfYWRkcmVzcywKCURXX0xORV9kZWZpbmVfZmlsZQp9OwoKZW51bSBkd190YWcgewoJRFdfVEFHX2NvbXBpbGVfdW5pdCA9IDB4MTEsCn07CgplbnVtIGR3X2F0IHsKCURXX0FUX25hbWUgPSAweDAzLAoJRFdfQVRfc3RtdF9saXN0ID0gMHgxMCwKCURXX0FUX2xvd19wYywKCURXX0FUX2hpZ2hfcGMsCglEV19BVF9sYW5ndWFnZSwKCURXX0FUX2NvbXBkaXIgPSAweDFiLAoJRFdfQVRfcHJvZHVjZXIgPSAweDI1LAp9OwoKZW51bSBkd19jaGlsZHJlbiB7CglEV19DSElMRFJFTl9ubywKCURXX0NISUxEUkVOX3llcwp9OwoKZW51bSBkd19mb3JtIHsKCURXX0ZPUk1fZGF0YTQgPSAweDA2LAp9OwoKc3RydWN0IGRlYnVnX2xpbmVfaGVhZGVyIHsKCS8vIE5vdCBjb3VudGluZyB0aGlzIGZpZWxkCgl1d29yZCB0b3RhbF9sZW5ndGg7CgkvLyB2ZXJzaW9uIG51bWJlciAoMiBjdXJyZW50bHkpCgl1aGFsZiB2ZXJzaW9uOwoJLy8gcmVsYXRpdmUgb2Zmc2V0IGZyb20gbmV4dCBmaWVsZCB0bwoJLy8gcHJvZ3JhbSBzdGF0ZW1lbnQKCXV3b3JkIHByb2xvZ19sZW5ndGg7Cgl1Ynl0ZSBtaW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aDsKCXVieXRlIGRlZmF1bHRfaXNfc3RtdDsKCS8vIGxpbmVfYmFzZSAtIHNlZSBEV0FSRiAyIHNwZWNzCglzYnl0ZSBsaW5lX2Jhc2U7CgkvLyBsaW5lX3JhbmdlIC0gc2VlIERXQVJGIDIgc3BlY3MKCXVieXRlIGxpbmVfcmFuZ2U7CgkvLyBudW1iZXIgb2Ygb3Bjb2RlICsgMQoJdWJ5dGUgb3Bjb2RlX2Jhc2U7CgkvKiBmb2xsb3cgdGhlIGFycmF5IG9mIG9wY29kZSBhcmdzIG5yOiB1Ynl0ZXMgW25yX29wY29kZV9iYXNlXSAqLwoJLyogZm9sbG93IHRoZSBzZWFyY2ggZGlyZWN0b3JpZXMgaW5kZXgsIHplcm8gdGVybWluYXRlZCBzdHJpbmcKCSAqIHRlcm1pbmF0ZWQgYnkgYW4gZW1wdHkgc3RyaW5nLgoJICovCgkvKiBmb2xsb3cgYW4gYXJyYXkgb2YgeyBmaWxlbmFtZSwgTEVCMTI4LCBMRUIxMjgsIExFQjEyOCB9LCBmaXJzdCBpcwoJICogdGhlIGRpcmVjdG9yeSBpbmRleCBlbnRyeSwgMCBtZWFucyBjdXJyZW50IGRpcmVjdG9yeSwgdGhlbiBtdGltZQoJICogYW5kIGZpbGVzaXplLCBsYXN0IGVudHJ5IGlzIGZvbGxvd2VkIGJ5IGVuIGVtcHR5IHN0cmluZy4KCSAqLwoJLyogZm9sbG93IHRoZSBmaXJzdCBwcm9ncmFtIHN0YXRlbWVudCAqLwp9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKLyogRFdBUkYgMiBzcGVjIHRhbGsgb25seSBhYm91dCBvbmUgcG9zc2libGUgY29tcGlsYXRpb24gdW5pdCBoZWFkZXIgd2hpbGUKICogYmludXRpbHMgY2FuIGhhbmRsZSB0d28gZmxhdm91cnMgb2YgZHdhcmYgMiwgMzIgYW5kIDY0IGJpdHMsIHRoaXMgaXMgbm90CiAqIHJlbGF0ZWQgdG8gdGhlIHVzZWQgYXJjaCwgYW4gRUxGIDMyIGNhbiBob2xkIG1vcmUgdGhhbiA0IEdvIG9mIGRlYnVnCiAqIGluZm9ybWF0aW9uLiBGb3Igbm93IHdlIGhhbmRsZSBvbmx5IERXQVJGIDIgMzIgYml0cyBjb21wIHVuaXQuIEl0J2xsIG9ubHkKICogYmVjb21lIGEgcHJvYmxlbSBpZiB3ZSBnZW5lcmF0ZSBtb3JlIHRoYW4gNEdCIG9mIGRlYnVnIGluZm9ybWF0aW9uLgogKi8Kc3RydWN0IGNvbXBpbGF0aW9uX3VuaXRfaGVhZGVyIHsKCXV3b3JkIHRvdGFsX2xlbmd0aDsKCXVoYWxmIHZlcnNpb247Cgl1d29yZCBkZWJ1Z19hYmJyZXZfb2Zmc2V0OwoJdWJ5dGUgcG9pbnRlcl9zaXplOwp9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKLyogZmllbGQgZmlsbGVkIGF0IHJ1biB0aW1lIGFyZSBtYXJrZWQgd2l0aCAtMSAqLwpzdGF0aWMgc3RydWN0IGRlYnVnX2xpbmVfaGVhZGVyIGNvbnN0IGRlZmF1bHRfZGVidWdfbGluZV9oZWFkZXIgPSB7CgktMSwKCTIsCgktMSwKCTEsCS8qIGNvdWxkIGJlIGJldHRlciB3aGVuIG1pbiBpbnN0cnVjdGlvbiBzaXplICE9IDEgKi8KCTEsCS8qIHdlIGRvbid0IHRha2UgY2FyZSBhYm91dCBiYXNpYyBibG9jayAqLwoJLTUsCS8qIHNlbnNpYmxlIHZhbHVlIGZvciBsaW5lIGJhc2UgLi4uICovCgkxNCwgICAgIC8qIC4uLiBhbmQgbGluZSByYW5nZSBhcmUgZ3Vlc3NlZCBzdGF0aWNhbGx5ICovCglEV19MTlNfbWF4X29wY29kZQp9OwoKc3RhdGljIHVieXRlIGNvbnN0IHN0YW5kYXJkX29wY29kZV9sZW5ndGhbRFdfTE5TX21heF9vcGNvZGUgLSAxXSA9CnsKCTAsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDEKfTsKCi8qIGZpZWxkIGZpbGxlZCBhdCBydW4gdGltZSBhcmUgbWFya2VkIHdpdGggLTEgKi8Kc3RhdGljIHN0cnVjdCBjb21waWxhdGlvbl91bml0X2hlYWRlciBjb25zdCBkZWZhdWx0X2NvbXBfdW5pdF9oZWFkZXIgPSB7CgktMSwKCTIsCgkwLCAgICAgLyogd2UgcmV1c2UgdGhlIHNhbWUgYWJicmV2IGVudHJpZXMgZm9yIGFsbCBjb21wIHVuaXQgKi8KCS0xCn07CgoKc3RhdGljIHZvaWQgZW1pdF91d29yZChzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYiwgdXdvcmQgZGF0YSkKewoJYWRkX2RhdGEoYiwgJmRhdGEsIHNpemVvZih1d29yZCkpOwp9CgoKc3RhdGljIHZvaWQgZW1pdF9zdHJpbmcoc3RydWN0IGdyb3dhYmxlX2J1ZmZlciAqIGIsIGNoYXIgY29uc3QgKiBzKQp7CglhZGRfZGF0YShiLCBzLCBzdHJsZW4ocykgKyAxKTsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfdW5zaWduZWRfTEVCMTI4KHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLAoJCQkJIHVuc2lnbmVkIGxvbmcgZGF0YSkKewoJZG8gewoJCXVieXRlIGN1ciA9IGRhdGEgJiAweDdGOwoJCWRhdGEgPj49IDc7CgkJaWYgKGRhdGEpCgkJCWN1ciB8PSAweDgwOwoJCWFkZF9kYXRhKGIsICZjdXIsIDEpOwoJfSB3aGlsZSAoZGF0YSk7Cn0KCgpzdGF0aWMgdm9pZCBlbWl0X3NpZ25lZF9MRUIxMjgoc3RydWN0IGdyb3dhYmxlX2J1ZmZlciAqIGIsIGxvbmcgZGF0YSkKewoJaW50IG1vcmUgPSAxOwoJaW50IG5lZ2F0aXZlID0gZGF0YSA8IDA7CglpbnQgc2l6ZSA9IHNpemVvZihsb25nKSAqIENIQVJfQklUOwoJd2hpbGUgKG1vcmUpIHsKCQl1Ynl0ZSBjdXIgPSBkYXRhICYgMHg3RjsKCQlkYXRhID4+PSA3OwoJCWlmIChuZWdhdGl2ZSkKCQkJZGF0YSB8PSAtICgxIDw8IChzaXplIC0gNykpOwoJCWlmICgoZGF0YSA9PSAwICYmICEoY3VyICYgMHg0MCkpIHx8CgkJICAgIChkYXRhID09IC0xbCAmJiAoY3VyICYgMHg0MCkpKQoJCQltb3JlID0gMDsKCQllbHNlCgkJCWN1ciB8PSAweDgwOwoJCWFkZF9kYXRhKGIsICZjdXIsIDEpOwoJfQp9CgoKc3RhdGljIHZvaWQgZW1pdF9leHRlbmRlZF9vcGNvZGUoc3RydWN0IGdyb3dhYmxlX2J1ZmZlciAqIGIsIHVieXRlIG9wY29kZSwKCQkJCSB2b2lkICogZGF0YSwgc2l6ZV90IGRhdGFfbGVuKQp7CglhZGRfZGF0YShiLCAiIiwgMSk7CgllbWl0X3Vuc2lnbmVkX0xFQjEyOChiLCBkYXRhX2xlbiArIDEpOwoJYWRkX2RhdGEoYiwgJm9wY29kZSwgMSk7CglhZGRfZGF0YShiLCBkYXRhLCBkYXRhX2xlbik7Cn0KCgpzdGF0aWMgdm9pZCBlbWl0X29wY29kZShzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYiwgdWJ5dGUgb3Bjb2RlKQp7CglhZGRfZGF0YShiLCAmb3Bjb2RlLCAxKTsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfb3Bjb2RlX3NpZ25lZChzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYiwKCQkJICAgICAgIHVieXRlIG9wY29kZSwgbG9uZyBkYXRhKQp7CglhZGRfZGF0YShiLCAmb3Bjb2RlLCAxKTsKCWVtaXRfc2lnbmVkX0xFQjEyOChiLCBkYXRhKTsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfb3Bjb2RlX3Vuc2lnbmVkKHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLCB1Ynl0ZSBvcGNvZGUsIAoJCQkJIHVuc2lnbmVkIGxvbmcgZGF0YSkKewoJYWRkX2RhdGEoYiwgJm9wY29kZSwgMSk7CgllbWl0X3Vuc2lnbmVkX0xFQjEyOChiLCBkYXRhKTsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfYWR2YW5jZV9wYyhzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYiwgdW5zaWduZWQgbG9uZyBkZWx0YV9wYykKewoJZW1pdF9vcGNvZGVfdW5zaWduZWQoYiwgRFdfTE5TX2FkdmFuY2VfcGMsIGRlbHRhX3BjKTsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfYWR2YW5jZV9saW5lbm8oc3RydWN0IGdyb3dhYmxlX2J1ZmZlciAqIGIsIGxvbmcgZGVsdGFfbGluZW5vKQp7CgllbWl0X29wY29kZV9zaWduZWQoYiwgRFdfTE5TX2FkdmFuY2VfbGluZSwgZGVsdGFfbGluZW5vKTsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfbG5lX2VuZF9vZl9zZXF1ZW5jZShzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYikKewoJZW1pdF9leHRlbmRlZF9vcGNvZGUoYiwgRFdfTE5FX2VuZF9zZXF1ZW5jZSwgTlVMTCwgMCk7Cn0KCgpzdGF0aWMgdm9pZCBlbWl0X3NldF9maWxlKHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLCB1bnNpZ25lZCBsb25nIGluZGV4KQp7CgllbWl0X29wY29kZV91bnNpZ25lZChiLCBEV19MTlNfc2V0X2ZpbGUsIGluZGV4KTsKfQoKCnN0YXRpYyB2b2lkIGVtaXRfbG5lX2RlZmluZV9maWxlbmFtZShzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYiwKCQkJCSAgICAgY2hhciBjb25zdCAqIGZpbGVuYW1lKQp7CgkvKiBlbWl0X2V4dGVuZGVkX29wY29kZSgpIGNhbid0IGJlIHVzZWQgaGVyZSwgd2UgaGF2ZSBhZGRpdGlvbmFsCgkgKiBkYXRhIHRvIG91dHB1dCBhbmQgdGhlIGxlbiBmaWVsZCB3aWxsIGJlIG1pc2NhbGN1bGF0ZWQuICovCglhZGRfZGF0YShiLCAiIiwgMSk7CgkvKiBzdHJsZW4oZmlsZW5hbWUpICsgemVybyB0ZXJtaW5hdG9yICsgbGVuIGZpZWxkICsgMyBieXRlcyBmb3IgdGhlIGRpcgoJICogZW50cnksIHRpbWVzdGFtcCBhbmQgZmlsZXNpemUgKi8KCWVtaXRfdW5zaWduZWRfTEVCMTI4KGIsIHN0cmxlbihmaWxlbmFtZSkgKyA1KTsKCWVtaXRfb3Bjb2RlKGIsIERXX0xORV9kZWZpbmVfZmlsZSk7CgllbWl0X3N0cmluZyhiLCBmaWxlbmFtZSk7CglhZGRfZGF0YShiLCAiXDBcMFwwIiwgMyk7Cn0KCgpzdGF0aWMgdm9pZCBlbWl0X2xuZV9zZXRfYWRkcmVzcyhzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYiwKCQkJCSB2b2lkIGNvbnN0ICogYWRkcmVzcykKewoJZW1pdF9leHRlbmRlZF9vcGNvZGUoYiwgRFdfTE5FX3NldF9hZGRyZXNzLCAmYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpKTsKfQoKCnN0YXRpYyB1Ynl0ZSBnZXRfc3BlY2lhbF9vcGNvZGUoc3RydWN0IGRlYnVnX2xpbmVfaW5mbyBjb25zdCAqIGxpbmUsCgl1bnNpZ25lZCBpbnQgbGFzdF9saW5lbm8sIHVuc2lnbmVkIGxvbmcgbGFzdF92bWEpCnsKCXVuc2lnbmVkIGludCB0ZW1wOwoJdW5zaWduZWQgbG9uZyBkZWx0YV9hZGRyOwoKCS8qIFNlZSBUSVMgRFdBUkYgRGVidWdnaW5nIEluZm9ybWF0aW9uIEZvcm1hdCB2ZXJzaW9uIDIuMCCnIDYuMi41LjEgKi8KCgl0ZW1wID0gKGxpbmUtPmxpbmVubyAtIGxhc3RfbGluZW5vKSAtCgkJZGVmYXVsdF9kZWJ1Z19saW5lX2hlYWRlci5saW5lX2Jhc2U7CglpZiAodGVtcCA+PSBkZWZhdWx0X2RlYnVnX2xpbmVfaGVhZGVyLmxpbmVfcmFuZ2UpCgkJcmV0dXJuIDA7CgoJZGVsdGFfYWRkciA9IChsaW5lLT52bWEgLSBsYXN0X3ZtYSkgLwoJCWRlZmF1bHRfZGVidWdfbGluZV9oZWFkZXIubWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGg7CgkvKiBUaGlzIGlzIG5vdCBzdWZmaWNpZW50IHRvIGVuc3VyZSBvcGNvZGUgd2lsbCBiZSBpbiBbMC0yNTZdIGJ1dAoJICogc3VmZmljaWVudCB0byBlbnN1cmUgd2hlbiBzdW1taW5nIHdpdGggdGhlIGRlbHRhIGxpbmVubyB3ZSB3aWxsCgkgKiBub3Qgb3ZlcmZsb3cgdGhlIHVuc2lnbmVkIGxvbmcgb3Bjb2RlICovCglpZiAoZGVsdGFfYWRkciA8PSAyNTYgLyBkZWZhdWx0X2RlYnVnX2xpbmVfaGVhZGVyLmxpbmVfcmFuZ2UpIHsKCQl1bnNpZ25lZCBsb25nIG9wY29kZSA9IHRlbXAgKwoJCQkoZGVsdGFfYWRkciAqIGRlZmF1bHRfZGVidWdfbGluZV9oZWFkZXIubGluZV9yYW5nZSkgKwoJCQlkZWZhdWx0X2RlYnVnX2xpbmVfaGVhZGVyLm9wY29kZV9iYXNlOwoKCQlyZXR1cm4gb3Bjb2RlIDw9IDI1NSA/IG9wY29kZSA6IDA7Cgl9CgoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgdm9pZCBlbWl0X2xpbmVub19pbmZvKHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLAoJc3RydWN0IGRlYnVnX2xpbmVfaW5mbyBjb25zdCAqIGxpbmUsIHNpemVfdCBucl9lbnRyeSwKCXVuc2lnbmVkIGxvbmcgY29kZV9hZGRyKQp7CglzaXplX3QgaTsKCgkvKgoJICogTWFjaGluZSBzdGF0ZSBhdCBzdGFydCBvZiBhIHN0YXRlbWVudCBwcm9ncmFtCgkgKiBhZGRyZXNzID0gMAoJICogZmlsZSAgICA9IDEKCSAqIGxpbmUgICAgPSAxCgkgKiBjb2x1bW4gID0gMAoJICogaXNfc3RtdCA9IGRlZmF1bHRfaXNfc3RtdCBhcyBnaXZlbiBpbiB0aGUgZGVidWdfbGluZV9oZWFkZXIKCSAqIGJhc2ljIGJsb2NrID0gMAoJICogZW5kIHNlcXVlbmNlID0gMAoJICovCgoJLyogc3RhcnQgc3RhdGUgb2YgdGhlIHN0YXRlIG1hY2hpbmUgd2UgdGFrZSBjYXJlIG9mICovCgl1bnNpZ25lZCBsb25nIGxhc3Rfdm1hID0gY29kZV9hZGRyOwoJdW5zaWduZWQgaW50IGxhc3RfbGluZW5vID0gMTsKCWNoYXIgY29uc3QgICogY3VyX2ZpbGVuYW1lID0gTlVMTDsKCXVuc2lnbmVkIGxvbmcgY3VyX2ZpbGVfaW5kZXggPSAwOwoKCS8qIEZJWE1FOiByZWxvY2F0YWJsZSBhZGRyZXNzPyAqLwoJZW1pdF9sbmVfc2V0X2FkZHJlc3MoYiwgKHZvaWQgY29uc3QgKiljb2RlX2FkZHIpOwoJZW1pdF9hZHZhbmNlX2xpbmVubyhiLCBsaW5lWzBdLmxpbmVubyAtIGxhc3RfbGluZW5vKTsKCWxhc3RfbGluZW5vID0gbGluZVswXS5saW5lbm87CgllbWl0X2xuZV9kZWZpbmVfZmlsZW5hbWUoYiwgbGluZVswXS5maWxlbmFtZSk7CgljdXJfZmlsZW5hbWUgPSBsaW5lWzBdLmZpbGVuYW1lOwoJZW1pdF9zZXRfZmlsZShiLCArK2N1cl9maWxlX2luZGV4KTsKCWVtaXRfb3Bjb2RlKGIsIERXX0xOU19jb3B5KTsKCQoKCWZvciAoaSA9IDA7IGkgPCBucl9lbnRyeTsgaSsrKSB7CgkJaW50IG5lZWRfY29weSA9IDA7CgkJdWJ5dGUgc3BlY2lhbF9vcGNvZGU7CgoJCWlmICghY3VyX2ZpbGVuYW1lIHx8IHN0cmNtcChjdXJfZmlsZW5hbWUsIGxpbmVbaV0uZmlsZW5hbWUpKSB7CgkJCWVtaXRfbG5lX2RlZmluZV9maWxlbmFtZShiLCBsaW5lW2ldLmZpbGVuYW1lKTsKCQkJY3VyX2ZpbGVuYW1lID0gbGluZVtpXS5maWxlbmFtZTsKCQkJZW1pdF9zZXRfZmlsZShiLCArK2N1cl9maWxlX2luZGV4KTsKCQkJbmVlZF9jb3B5ID0gMTsKCQl9CgkJaWYgKChzcGVjaWFsX29wY29kZSA9IGdldF9zcGVjaWFsX29wY29kZSgmbGluZVtpXSwKCQkJCWxhc3RfbGluZW5vLCBsYXN0X3ZtYSkpICE9IDApIHsKCQkJbGFzdF9saW5lbm8gPSBsaW5lW2ldLmxpbmVubzsKCQkJbGFzdF92bWEgPSBsaW5lW2ldLnZtYTsKCQkJZW1pdF9vcGNvZGUoYiwgc3BlY2lhbF9vcGNvZGUpOwoJCX0gZWxzZSB7CgkJCWlmIChsYXN0X2xpbmVubyAhPSBsaW5lW2ldLmxpbmVubykgewoJCQkJZW1pdF9hZHZhbmNlX2xpbmVubyhiLAoJCQkJCWxpbmVbaV0ubGluZW5vIC0gbGFzdF9saW5lbm8pOwoJCQkJbGFzdF9saW5lbm8gPSBsaW5lW2ldLmxpbmVubzsKCQkJCW5lZWRfY29weSA9IDE7CgkJCX0KCQkJaWYgKGxhc3Rfdm1hICE9IGxpbmVbaV0udm1hKSB7CgkJCQllbWl0X2FkdmFuY2VfcGMoYiwgbGluZVtpXS52bWEgLSBsYXN0X3ZtYSk7CgkJCQlsYXN0X3ZtYSA9IGxpbmVbaV0udm1hOwoJCQkJbmVlZF9jb3B5ID0gMTsKCQkJfQoJCQlpZiAobmVlZF9jb3B5KQoJCQkJZW1pdF9vcGNvZGUoYiwgRFdfTE5TX2NvcHkpOwoJCX0KCX0KfQoKCnN0YXRpYyB2b2lkIGFkZF9kZWJ1Z19saW5lKHN0cnVjdCBncm93YWJsZV9idWZmZXIgKiBiLAoJc3RydWN0IGRlYnVnX2xpbmVfaW5mbyBjb25zdCAqIGxpbmUsIHNpemVfdCBucl9lbnRyeSwKCXVuc2lnbmVkIGxvbmcgY29kZV9hZGRyKQp7CglzdHJ1Y3QgZGVidWdfbGluZV9oZWFkZXIgKiBkYmdfaGVhZGVyOwoJc2l6ZV90IG9sZF9zaXplOwoKCW9sZF9zaXplID0gYi0+c2l6ZTsKCglhZGRfZGF0YShiLCAmZGVmYXVsdF9kZWJ1Z19saW5lX2hlYWRlciwKCQkgc2l6ZW9mKGRlZmF1bHRfZGVidWdfbGluZV9oZWFkZXIpKTsKCWFkZF9kYXRhKGIsICZzdGFuZGFyZF9vcGNvZGVfbGVuZ3RoLCAgc2l6ZW9mKHN0YW5kYXJkX29wY29kZV9sZW5ndGgpKTsKCgkvLyBlbXB0eSBkaXJlY3RvcnkgZW50cnkKCWFkZF9kYXRhKGIsICIiLCAxKTsKCgkvLyBlbXB0eSBmaWxlbmFtZSBkaXJlY3RvcnkKCWFkZF9kYXRhKGIsICIiLCAxKTsKCglkYmdfaGVhZGVyID0gYi0+cCArIG9sZF9zaXplOwoJZGJnX2hlYWRlci0+cHJvbG9nX2xlbmd0aCA9IChiLT5zaXplIC0gb2xkX3NpemUpIC0KCQlvZmZzZXRvZihzdHJ1Y3QgZGVidWdfbGluZV9oZWFkZXIsIG1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoKTsKCgllbWl0X2xpbmVub19pbmZvKGIsIGxpbmUsIG5yX2VudHJ5LCBjb2RlX2FkZHIpOwoKCWVtaXRfbG5lX2VuZF9vZl9zZXF1ZW5jZShiKTsKCglkYmdfaGVhZGVyID0gYi0+cCArIG9sZF9zaXplOwoJZGJnX2hlYWRlci0+dG90YWxfbGVuZ3RoID0gKGItPnNpemUgLSBvbGRfc2l6ZSkgLQoJCW9mZnNldG9mKHN0cnVjdCBkZWJ1Z19saW5lX2hlYWRlciwgdmVyc2lvbik7Cn0KCgpzdGF0aWMgdm9pZCBhZGRfY29tcGlsYXRpb25fdW5pdChzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyICogYiwKCQkJCSBzaXplX3Qgb2Zmc2V0X2RlYnVnX2xpbmUpCnsKCXN0cnVjdCBjb21waWxhdGlvbl91bml0X2hlYWRlciAqIGNvbXBfdW5pdF9oZWFkZXI7CgoJc2l6ZV90IG9sZF9zaXplID0gYi0+c2l6ZTsKCglhZGRfZGF0YShiLCAmZGVmYXVsdF9jb21wX3VuaXRfaGVhZGVyLAoJCSBzaXplb2YoZGVmYXVsdF9jb21wX3VuaXRfaGVhZGVyKSk7CgoJZW1pdF91bnNpZ25lZF9MRUIxMjgoYiwgMSk7CgllbWl0X3V3b3JkKGIsIG9mZnNldF9kZWJ1Z19saW5lKTsKCgljb21wX3VuaXRfaGVhZGVyID0gYi0+cCArIG9sZF9zaXplOwoJY29tcF91bml0X2hlYWRlci0+dG90YWxfbGVuZ3RoID0gKGItPnNpemUgLSBvbGRfc2l6ZSkgLQoJCW9mZnNldG9mKHN0cnVjdCBjb21waWxhdGlvbl91bml0X2hlYWRlciwgdmVyc2lvbik7Cgljb21wX3VuaXRfaGVhZGVyLT5wb2ludGVyX3NpemUgPSBzaXplb2Yodm9pZCAqKTsKfQoKCnN0YXRpYyB2b2lkIGNyZWF0ZV9kZWJ1Z19hYmJyZXYoc3RydWN0IGdyb3dhYmxlX2J1ZmZlciAqIGIpCnsKCWVtaXRfdW5zaWduZWRfTEVCMTI4KGIsIDEpOwoJZW1pdF91bnNpZ25lZF9MRUIxMjgoYiwgRFdfVEFHX2NvbXBpbGVfdW5pdCk7CgllbWl0X3Vuc2lnbmVkX0xFQjEyOChiLCBEV19DSElMRFJFTl95ZXMpOwoJZW1pdF91bnNpZ25lZF9MRUIxMjgoYiwgRFdfQVRfc3RtdF9saXN0KTsKCWVtaXRfdW5zaWduZWRfTEVCMTI4KGIsIERXX0ZPUk1fZGF0YTQpOwoJZW1pdF91bnNpZ25lZF9MRUIxMjgoYiwgMCk7Cn0KCnN0YXRpYyBzdHJ1Y3QgZ3Jvd2FibGVfYnVmZmVyIGJfbGluZTsKc3RhdGljIHN0cnVjdCBncm93YWJsZV9idWZmZXIgYl9kZWJ1Z19pbmZvOwpzdGF0aWMgc3RydWN0IGdyb3dhYmxlX2J1ZmZlciBiX2RlYnVnX2FiYnJldjsKCmludCBpbml0X2RlYnVnX2xpbmVfaW5mbyhiZmQgKiBhYmZkKQp7Cglhc2VjdGlvbiAqIGxpbmVfc2VjdGlvbiwgKiBkZWJ1Z19pbmZvLCAqIGRlYnVnX2FiYnJldjsKCXN0cnVjdCBqaXRlbnRyeV9kZWJ1Z19saW5lICogZGVidWdfbGluZTsKCglpbml0X2J1ZmZlcigmYl9saW5lKTsKCWluaXRfYnVmZmVyKCZiX2RlYnVnX2luZm8pOwoJaW5pdF9idWZmZXIoJmJfZGVidWdfYWJicmV2KTsKCglmb3IgKGRlYnVnX2xpbmUgPSBqaXRlbnRyeV9kZWJ1Z19saW5lX2xpc3Q7CgkgICAgIGRlYnVnX2xpbmU7CgkgICAgIGRlYnVnX2xpbmUgPSBkZWJ1Z19saW5lLT5uZXh0KSB7CgkJc3RydWN0IGpyX2NvZGVfZGVidWdfaW5mbyBjb25zdCAqIHJlYyA9IGRlYnVnX2xpbmUtPmRhdGE7CgkJaWYgKHJlYy0+bnJfZW50cnkpIHsKCQkJc2l6ZV90IGk7CgkJCXZvaWQgY29uc3QgKiBkYXRhID0gcmVjICsgMTsKCQkJc3RydWN0IGRlYnVnX2xpbmVfaW5mbyAqIGRiZ19saW5lID0KCQkJCXhtYWxsb2MocmVjLT5ucl9lbnRyeSAqCgkJCQkJc2l6ZW9mKHN0cnVjdCBkZWJ1Z19saW5lX2luZm8pKTsKCQkJZm9yIChpID0gMDsgaSA8IHJlYy0+bnJfZW50cnk7ICsraSkgewoJCQkJZGJnX2xpbmVbaV0udm1hID0gKih1bnNpZ25lZCBsb25nICopZGF0YTsKCQkJCWRhdGEgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwoJCQkJZGJnX2xpbmVbaV0ubGluZW5vID0gKih1bnNpZ25lZCBpbnQgKilkYXRhOwoJCQkJZGF0YSArPSBzaXplb2YodW5zaWduZWQgaW50KTsKCQkJCWRiZ19saW5lW2ldLmZpbGVuYW1lID0gZGF0YTsKCQkJCWRhdGEgKz0gc3RybGVuKGRhdGEpICsgMTsKCQkJfQoKCQkJYWRkX2NvbXBpbGF0aW9uX3VuaXQoJmJfZGVidWdfaW5mbywgYl9saW5lLnNpemUpOwoJCQlhZGRfZGVidWdfbGluZSgmYl9saW5lLCBkYmdfbGluZSwKCQkJCSAgICAgICByZWMtPm5yX2VudHJ5LCByZWMtPmNvZGVfYWRkcik7CgkJCWNyZWF0ZV9kZWJ1Z19hYmJyZXYoJmJfZGVidWdfYWJicmV2KTsKCgkJCWZyZWUoZGJnX2xpbmUpOwoJCX0KCX0KCQoJbGluZV9zZWN0aW9uID0gY3JlYXRlX3NlY3Rpb24oYWJmZCwgIi5kZWJ1Z19saW5lIiwgYl9saW5lLnNpemUsIDAsCgkJU0VDX0hBU19DT05URU5UU3xTRUNfUkVBRE9OTFl8U0VDX0RFQlVHR0lORyk7CglpZiAoIWxpbmVfc2VjdGlvbikKCQlyZXR1cm4gLTE7CgoJZGVidWdfaW5mbyA9IGNyZWF0ZV9zZWN0aW9uKGFiZmQsICIuZGVidWdfaW5mbyIsIGJfZGVidWdfaW5mby5zaXplLCAwLAoJCVNFQ19IQVNfQ09OVEVOVFN8U0VDX1JFQURPTkxZfFNFQ19ERUJVR0dJTkcpOwogCWlmICghZGVidWdfaW5mbykKCQlyZXR1cm4gLTE7CgoJZGVidWdfYWJicmV2ID0gY3JlYXRlX3NlY3Rpb24oYWJmZCwgIi5kZWJ1Z19hYmJyZXYiLAoJCWJfZGVidWdfYWJicmV2LnNpemUsIDAsCgkJU0VDX0hBU19DT05URU5UU3xTRUNfUkVBRE9OTFl8U0VDX0RFQlVHR0lORyk7CglpZiAoIWRlYnVnX2FiYnJldikKCQlyZXR1cm4gLTE7CgoJcmV0dXJuIDA7Cn0KCgppbnQgZmluYWxpemVfZGVidWdfbGluZV9pbmZvKGJmZCAqIGFiZmQpCnsKCWFzZWN0aW9uICogbGluZV9zZWN0aW9uLCAqIGRlYnVnX2luZm8sICogZGVidWdfYWJicmV2OwoKCWxpbmVfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lKGFiZmQsICIuZGVidWdfbGluZSIpOwoJaWYgKCFsaW5lX3NlY3Rpb24pCgkJcmV0dXJuIC0xOwoKCWRlYnVnX2luZm8gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZShhYmZkLCAiLmRlYnVnX2luZm8iKTsKIAlpZiAoIWRlYnVnX2luZm8pCgkJcmV0dXJuIC0xOwoKCglkZWJ1Z19hYmJyZXYgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZShhYmZkLCAiLmRlYnVnX2FiYnJldiIpOwoJaWYgKCFkZWJ1Z19hYmJyZXYpCgkJcmV0dXJuIC0xOwoKCWZpbGxfc2VjdGlvbl9jb250ZW50KGFiZmQsIGxpbmVfc2VjdGlvbiwgYl9saW5lLnAsIDAsIGJfbGluZS5zaXplKTsKCWZpbGxfc2VjdGlvbl9jb250ZW50KGFiZmQsIGRlYnVnX2luZm8sIGJfZGVidWdfaW5mby5wLAoJCQkgICAgIDAsIGJfZGVidWdfaW5mby5zaXplKTsKCWZpbGxfc2VjdGlvbl9jb250ZW50KGFiZmQsIGRlYnVnX2FiYnJldiwgYl9kZWJ1Z19hYmJyZXYucCwgMCwKCQkJICAgICBiX2RlYnVnX2FiYnJldi5zaXplKTsKCgoJZnJlZV9idWZmZXIoJmJfbGluZSk7CglmcmVlX2J1ZmZlcigmYl9kZWJ1Z19pbmZvKTsKCWZyZWVfYnVmZmVyKCZiX2RlYnVnX2FiYnJldik7CgoJcmV0dXJuIDA7Cn0K