LyogcGx1Z2luX2NvbW1vbiAtIFJvdXRpbmVzIGNvbW1vbiB0byBzZXZlcmFsIHBsdWdpbnMKICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDkgIEpvc2ggQ29hbHNvbgogKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNiAgWGlwaC5PcmcgRm91bmRhdGlvbgogKgogKiBPbmx5IHNsaWdodGx5IG1vZGlmaWVkIGNoYXJzZXQuYyBmcm9tOgogKiAgRWFzeVRBRyAtIFRhZyBlZGl0b3IgZm9yIE1QMyBhbmQgT0dHIGZpbGVzCiAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgSOV2YXJkIEt25WxlbiA8aGF2YXJka0B4bW1zLm9yZz4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KICovCgojaWZkZWYgSEFWRV9DT05GSUdfSAojICBpbmNsdWRlIDxjb25maWcuaD4KI2VuZGlmCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgoKI2lmZGVmIEhBVkVfSUNPTlYKI2luY2x1ZGUgPGljb252Lmg+CiNlbmRpZgoKI2lmZGVmIEhBVkVfTEFOR0lORk9fQ09ERVNFVAojaW5jbHVkZSA8bGFuZ2luZm8uaD4KI2VuZGlmCgojaW5jbHVkZSAiY2hhcnNldC5oIgoKCi8qKioqKioqKioqKioqCiAqIEZ1bmN0aW9ucyAqCiAqKioqKioqKioqKioqLwoKY2hhciogRkxBQ19wbHVnaW5fX2NoYXJzZXRfZ2V0X2N1cnJlbnQgKHZvaWQpCnsKCWNoYXIgKmNoYXJzZXQgPSBnZXRlbnYoIkNIQVJTRVQiKTsKCiNpZmRlZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKCWlmICghY2hhcnNldCkKCQljaGFyc2V0ID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7CiNlbmRpZgoJaWYgKCFjaGFyc2V0KQoJCWNoYXJzZXQgPSAiSVNPLTg4NTktMSI7CgoJcmV0dXJuIGNoYXJzZXQ7Cn0KCgojaWZkZWYgSEFWRV9JQ09OVgpjaGFyKiBGTEFDX3BsdWdpbl9fY2hhcnNldF9jb252ZXJ0X3N0cmluZyAoY29uc3QgY2hhciAqc3RyaW5nLCBjaGFyICpmcm9tLCBjaGFyICp0bykKewoJc2l6ZV90IG91dGxlZnQsIG91dHNpemUsIGxlbmd0aDsKCWljb252X3QgY2Q7CgljaGFyICpvdXQsICpvdXRwdHI7Cgljb25zdCBjaGFyICppbnB1dCA9IHN0cmluZzsKCglpZiAoIXN0cmluZykKCQlyZXR1cm4gTlVMTDsKCglsZW5ndGggPSBzdHJsZW4oc3RyaW5nKTsKCglpZiAoKGNkID0gaWNvbnZfb3Blbih0bywgZnJvbSkpID09IChpY29udl90KS0xKQoJewojaWZuZGVmIE5ERUJVRwoJCWZwcmludGYoc3RkZXJyLCAiY29udmVydF9zdHJpbmcoKTogQ29udmVyc2lvbiBub3Qgc3VwcG9ydGVkLiBDaGFyc2V0czogJXMgLT4gJXMiLCBmcm9tLCB0byk7CiNlbmRpZgoJCXJldHVybiBzdHJkdXAoc3RyaW5nKTsKCX0KCgkvKiBEdWUgdG8gYSBHTElCQyBidWcsIHJvdW5kIG91dGJ1Zl9zaXplIHVwIHRvIGEgbXVsdGlwbGUgb2YgNCAqLwoJLyogKyAxIGZvciBudWwgaW4gY2FzZSBsZW4gPT0gMSAqLwoJb3V0c2l6ZSA9ICgobGVuZ3RoICsgMykgJiB+MykgKyAxOwoJaWYob3V0c2l6ZSA8IGxlbmd0aCkgLyogb3ZlcmZsb3cgY2hlY2sgKi8KCQlyZXR1cm4gTlVMTDsKCW91dCA9IG1hbGxvYyhvdXRzaXplKTsKCW91dGxlZnQgPSBvdXRzaXplIC0gMTsKCW91dHB0ciA9IG91dDsKCnJldHJ5OgoJaWYgKGljb252KGNkLCAoY2hhcioqKSZpbnB1dCwgJmxlbmd0aCwgJm91dHB0ciwgJm91dGxlZnQpID09IChzaXplX3QpKC0xKSkKCXsKCQlpbnQgdXNlZDsKCQlzd2l0Y2ggKGVycm5vKQoJCXsKCQkJY2FzZSBFMkJJRzoKCQkJCXVzZWQgPSBvdXRwdHIgLSBvdXQ7CgkJCQlpZigob3V0c2l6ZSAtIDEpICogMiArIDEgPD0gb3V0c2l6ZSkgeyAvKiBvdmVyZmxvdyBjaGVjayAqLwoJCQkJCWZyZWUob3V0KTsKCQkJCQlyZXR1cm4gTlVMTDsKCQkJCX0KCQkJCW91dHNpemUgPSAob3V0c2l6ZSAtIDEpICogMiArIDE7CgkJCQlvdXQgPSByZWFsbG9jKG91dCwgb3V0c2l6ZSk7CgkJCQlvdXRwdHIgPSBvdXQgKyB1c2VkOwoJCQkJb3V0bGVmdCA9IG91dHNpemUgLSAxIC0gdXNlZDsKCQkJCWdvdG8gcmV0cnk7CgkJCWNhc2UgRUlOVkFMOgoJCQkJYnJlYWs7CgkJCWNhc2UgRUlMU0VROgoJCQkJLyogSW52YWxpZCBzZXF1ZW5jZSwgdHJ5IHRvIGdldCB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nICovCgkJCQlpbnB1dCsrOwoJCQkJbGVuZ3RoID0gc3RybGVuKGlucHV0KTsKCQkJCWdvdG8gcmV0cnk7CgkJCWRlZmF1bHQ6CiNpZm5kZWYgTkRFQlVHCgkJCQlmcHJpbnRmKHN0ZGVyciwgImNvbnZlcnRfc3RyaW5nKCk6IENvbnZlcnNpb24gZmFpbGVkLiBJbnB1dHN0cmluZzogJXM7IEVycm9yOiAlcyIsIHN0cmluZywgc3RyZXJyb3IoZXJybm8pKTsKI2VuZGlmCgkJCQlicmVhazsKCQl9Cgl9Cgkqb3V0cHRyID0gJ1wwJzsKCglpY29udl9jbG9zZShjZCk7CglyZXR1cm4gb3V0Owp9CiNlbHNlCmNoYXIqIEZMQUNfcGx1Z2luX19jaGFyc2V0X2NvbnZlcnRfc3RyaW5nIChjb25zdCBjaGFyICpzdHJpbmcsIGNoYXIgKmZyb20sIGNoYXIgKnRvKQp7Cgkodm9pZClmcm9tLCAodm9pZCl0bzsKCWlmICghc3RyaW5nKQoJCXJldHVybiBOVUxMOwoJcmV0dXJuIHN0cmR1cChzdHJpbmcpOwp9CiNlbmRpZgoKI2lmZGVmIEhBVkVfSUNPTlYKaW50IEZMQUNfcGx1Z2luX19jaGFyc2V0X3Rlc3RfY29udmVyc2lvbiAoY2hhciAqZnJvbSwgY2hhciAqdG8pCnsKCWljb252X3QgY2Q7CgoJaWYgKChjZD1pY29udl9vcGVuKHRvLGZyb20pKSA9PSAoaWNvbnZfdCktMSkKCXsKCQkvKiBDb252ZXJzaW9uIG5vdCBzdXBwb3J0ZWQgKi8KCQlyZXR1cm4gMDsKCX0KCWljb252X2Nsb3NlKGNkKTsKCXJldHVybiAxOwp9CiNlbHNlCmludCBGTEFDX3BsdWdpbl9fY2hhcnNldF90ZXN0X2NvbnZlcnNpb24gKGNoYXIgKmZyb20sIGNoYXIgKnRvKQp7Cgkodm9pZClmcm9tLCAodm9pZCl0bzsKCXJldHVybiAxOwp9CiNlbmRpZgo=