Lyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAogICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUKICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgogICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBhbmQKICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCgogICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCgogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCgojaW5jbHVkZSAiYmZkLmgiCiNpbmNsdWRlICJiZmR2ZXIuaCIKI2luY2x1ZGUgInN5c2RlcC5oIgojaW5jbHVkZSAiYmZkbGluay5oIgojaW5jbHVkZSAic2FmZS1jdHlwZS5oIgojaW5jbHVkZSAibGliYmZkLmgiCgojaW5jbHVkZSAidm1zLmgiCgojaWZkZWYgSEFWRV9BTExPQ0FfSAojaW5jbHVkZSA8YWxsb2NhLmg+CiNlbmRpZgoKLyogUmVhZCAmIHByb2Nlc3MgZW1oIHJlY29yZAogICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4gICovCgppbnQKX2JmZF92bXNfc2x1cnBfaGRyIChiZmQgKmFiZmQsIGludCBvYmp0eXBlKQp7CiAgdW5zaWduZWQgY2hhciAqcHRyOwogIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CiAgaW50IHN1YnR5cGU7CgogIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZygyLCAiSERSL0VNSFxuIik7CiNlbmRpZgoKICBzd2l0Y2ggKG9ianR5cGUpCiAgICB7CiAgICBjYXNlIE9CSl9TX0NfSERSOgogICAgICBzdWJ0eXBlID0gdm1zX3JlY1sxXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIEVPQkpfU19DX0VNSDoKICAgICAgc3VidHlwZSA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA0KSArIEVWQVhfT0ZGU0VUOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHN1YnR5cGUgPSAtMTsKICAgIH0KCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcoMywgInN1YnR5cGUgJWRcbiIsIHN1YnR5cGUpOwojZW5kaWYKCiAgc3dpdGNoIChzdWJ0eXBlKQogICAgewogICAgY2FzZSBNSERfU19DX01IRDoKICAgICAgLyogTW9kdWxlIGhlYWRlci4gICovCiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzJdOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDMpOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX3RfbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyA1KTsKICAgICAgcHRyID0gdm1zX3JlYyArIDUgKyB2bXNfcmVjWzVdICsgMTsKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwogICAgICBwdHIgKz0gKnB0ciArIDE7CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfdF9kYXRlID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwogICAgICBicmVhazsKCiAgICBjYXNlIE1IRF9TX0NfTE5NOgogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX2NfbG5tID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYgKHJlY19sZW5ndGggLSAyKSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgTUhEX1NfQ19TUkM6CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfY19zcmMgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJViAocmVjX2xlbmd0aCAtIDIpKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNSERfU19DX1RUTDoKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9jX3R0bCA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWIChyZWNfbGVuZ3RoIC0gMikpOwogICAgICBicmVhazsKCiAgICBjYXNlIEVNSF9TX0NfTUhEICsgRVZBWF9PRkZTRVQ6CiAgICAgIC8qIE1vZHVsZSBoZWFkZXIuICAqLwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1s2XTsKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9sX2FyY2gxICA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9sX2FyY2gyICA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfbF9yZWNzaXogPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX3RfbmFtZSAgID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDIwKTsKICAgICAgcHRyID0gdm1zX3JlYyArIDIwICsgdm1zX3JlY1syMF0gKyAxOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX3RfdmVyc2lvbiA9X2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKICAgICAgcHRyICs9ICpwdHIgKyAxOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBFTUhfU19DX0xOTSArIEVWQVhfT0ZGU0VUOgogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX2NfbG5tID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYgKHJlY19sZW5ndGggLSA2KSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgRU1IX1NfQ19TUkMgKyBFVkFYX09GRlNFVDoKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9jX3NyYyA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWIChyZWNfbGVuZ3RoIC0gNikpOwogICAgICBicmVhazsKCiAgICBjYXNlIEVNSF9TX0NfVFRMICsgRVZBWF9PRkZTRVQ6CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfY190dGwgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJViAocmVjX2xlbmd0aCAtIDYpKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNSERfU19DX0NQUjoKICAgIGNhc2UgTUhEX1NfQ19NVEM6CiAgICBjYXNlIE1IRF9TX0NfR1RYOgogICAgY2FzZSBFTUhfU19DX0NQUiArIEVWQVhfT0ZGU0VUOgogICAgY2FzZSBFTUhfU19DX01UQyArIEVWQVhfT0ZGU0VUOgogICAgY2FzZSBFTUhfU19DX0dUWCArIEVWQVhfT0ZGU0VUOgogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKICAgICAgcmV0dXJuIC0xOwogICAgfQoKICByZXR1cm4gMDsKfQoKLyogT3V0cHV0IHJvdXRpbmVzLiAgKi8KCi8qIE1hbnVmYWN0dXJlIGEgVk1TIGxpa2UgdGltZSBvbiBhIHVuaXggYmFzZWQgc3lzdGVtLgogICBzdG9sZW4gZnJvbSBvYmotdm1zLmMuICAqLwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgKgpnZXRfdm1zX3RpbWVfc3RyaW5nICh2b2lkKQp7CiAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGJ1ZlsxOF07CiNpZm5kZWYgVk1TCiNpbmNsdWRlIDx0aW1lLmg+CgogIGNoYXIgKnBudDsKICB0aW1lX3QgdGltZWI7CgogIHRpbWUgKCYgdGltZWIpOwogIHBudCA9IGN0aW1lICgmdGltZWIpOwogIHBudFszXSA9IDA7CiAgcG50WzddID0gMDsKICBwbnRbMTBdID0gMDsKICBwbnRbMTZdID0gMDsKICBwbnRbMjRdID0gMDsKICBzcHJpbnRmICgoY2hhciAqKSB0YnVmLCAiJTJzLSUzcy0lcyAlcyIsCgkgICBwbnQgKyA4LCBwbnQgKyA0LCBwbnQgKyAyMCwgcG50ICsgMTEpOwojZWxzZQojaW5jbHVkZSA8c3RhcmxldC5oPgogIHN0cnVjdAogIHsKICAgIGludCBTaXplOwogICAgdW5zaWduZWQgY2hhciAqUHRyOwogIH0gRGVzY3JpcHRvcjsKICBEZXNjcmlwdG9yLlNpemUgPSAxNzsKICBEZXNjcmlwdG9yLlB0ciA9IHRidWY7CiAgU1lTJEFTQ1RJTSAoMCwgJkRlc2NyaXB0b3IsIDAsIDApOwojZW5kaWYgLyogbm90IFZNUyAqLwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoNiwgInZtc3RpbWVzdHJpbmc6JyVzJ1xuIiwgdGJ1Zik7CiNlbmRpZgoKICByZXR1cm4gdGJ1ZjsKfQoKLyogV3JpdGUgb2JqZWN0IGhlYWRlciBmb3IgYmZkIGFiZmQuICAqLwoKaW50Cl9iZmRfdm1zX3dyaXRlX2hkciAoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkKewogIGFzeW1ib2wgKnN5bWJvbDsKICB1bnNpZ25lZCBpbnQgc3ltbnVtOwogIGludCBoYWRfY2FzZSA9IDA7CiAgaW50IGhhZF9maWxlID0gMDsKCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfaGRyICglcClcbiIsIGFiZmQpOwojZW5kaWYKCiAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgMik7CgogIC8qIE1IRC4gICovCiAgaWYgKG9ianR5cGUgIT0gT0JKX1NfQ19IRFIpCiAgICB7CiAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX01IRCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgRU9CSl9TX0NfU1RSTFZMKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBNQVhfT1VUUkVDX1NJWkUpOwogICAgfQoKICBpZiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkgIT0gMCkKICAgIHsKICAgICAgLyogU3RyaXAgcGF0aCBhbmQgc3VmZml4IGluZm9ybWF0aW9uLiAgKi8KICAgICAgY2hhciAqZm5hbWUsICpmb3V0LCAqZnB0cjsKCiAgICAgIGZwdHIgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKICAgICAgZm5hbWUgPSBhbGxvY2EgKHN0cmxlbiAoZnB0cikgKyAxKTsKICAgICAgc3RyY3B5IChmbmFtZSwgZnB0cik7CiAgICAgIGZvdXQgPSBzdHJyY2hyIChmbmFtZSwgJ10nKTsKICAgICAgaWYgKGZvdXQgPT0gMCkKCWZvdXQgPSBzdHJjaHIgKGZuYW1lLCAnOicpOwogICAgICBpZiAoZm91dCAhPSAwKQoJZm91dCsrOwogICAgICBlbHNlCglmb3V0ID0gZm5hbWU7CgogICAgICAvKiBTdHJpcCAub2JqIHN1ZmZpeC4gICovCiAgICAgIGZwdHIgPSBzdHJyY2hyIChmbmFtZSwgJy4nKTsKICAgICAgaWYgKChmcHRyICE9IDApCgkgICYmIChzdHJjYXNlY21wIChmcHRyLCAiLk9CSiIpID09IDApKQoJKmZwdHIgPSAwOwoKICAgICAgZnB0ciA9IGZvdXQ7CiAgICAgIHdoaWxlICgqZnB0ciAhPSAwKQoJewoJICAqZnB0ciA9IFRPVVBQRVIgKCpmcHRyKTsKCSAgZnB0cisrOwoJICBpZiAoKCpmcHRyID09ICc7JykKCSAgICAgfHwgKChmcHRyIC0gZm91dCkgPiAzMSkpCgkgICAgKmZwdHIgPSAwOwoJfQogICAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgZm91dCk7CiAgICB9CiAgZWxzZQogICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsICJOT05BTUUiKTsKCiAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIEJGRF9WRVJTSU9OX1NUUklORyk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGdldF92bXNfdGltZV9zdHJpbmcgKCksIDE3KTsKICBfYmZkX3Ztc19vdXRwdXRfZmlsbCAoYWJmZCwgMCwgMTcpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIExNTi4gICovCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTE5NKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikiR0FTIHByb0dJUyIsIDEwKTsKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICAvKiBTUkMuICAqLwogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1NSQyk7CgogIGZvciAoc3ltbnVtID0gMDsgc3ltbnVtIDwgYWJmZC0+c3ltY291bnQ7IHN5bW51bSsrKQogICAgewogICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07CgogICAgICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9GSUxFKQoJewoJICBpZiAoc3RybmNtcCAoKGNoYXIgKilzeW1ib2wtPm5hbWUsICI8Q0FTRToiLCA2KSA9PSAwKQoJICAgIHsKCSAgICAgIFBSSVYgKGZsYWdfaGFzaF9sb25nX25hbWVzKSA9IHN5bWJvbC0+bmFtZVs2XSAtICcwJzsKCSAgICAgIFBSSVYgKGZsYWdfc2hvd19hZnRlcl90cnVuYykgPSBzeW1ib2wtPm5hbWVbN10gLSAnMCc7CgoJICAgICAgaWYgKGhhZF9maWxlKQoJCWJyZWFrOwoJICAgICAgaGFkX2Nhc2UgPSAxOwoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIHN5bWJvbC0+bmFtZSwKCQkJCShpbnQpIHN0cmxlbiAoc3ltYm9sLT5uYW1lKSk7CgkgIGlmIChoYWRfY2FzZSkKCSAgICBicmVhazsKCSAgaGFkX2ZpbGUgPSAxOwoJfQogICAgfQoKICBpZiAoc3ltbnVtID09IGFiZmQtPnN5bWNvdW50KQogICAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIm5vbmFtZSIsIDYpOwoKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICAvKiBUVEwuICAqLwogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1RUTCk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIlRUTCIsIDMpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIENQUi4gICovCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfQ1BSKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwKCQkJICh1bnNpZ25lZCBjaGFyICopIkdOVSBCRkQgcG9ydGVkIGJ5IEtsYXVzIEvkbXBmIDE5OTQtMTk5NiIsCgkJCSAzOSk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgcmV0dXJuIDA7Cn0KCi8qIFByb2Nlc3MgRU9NL0VFT00gcmVjb3JkCiAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLiAgKi8KCmludApfYmZkX3Ztc19zbHVycF9lb20gKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpCnsKICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZygyLCAiRU9NL0VFT01cbiIpOwojZW5kaWYKCiAgdm1zX3JlYyA9IFBSSVYgKHZtc19yZWMpOwoKICBpZiAoKG9ianR5cGUgPT0gT0JKX1NfQ19FT00pCiAgICAgfHwgKG9ianR5cGUgPT0gT0JKX1NfQ19FT01XKSkKICAgIHsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIFBSSVYgKGVvbV9kYXRhKS5lb21fbF90b3RhbF9scHMgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgNCk7CiAgICAgIFBSSVYgKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPSAqKHZtc19yZWMgKyA4KTsKCiAgICAgIGlmIChQUklWIChlb21fZGF0YSkuZW9tX2JfY29tY29kID4gMSkKCXsKCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPYmplY3QgbW9kdWxlIE5PVCBlcnJvci1mcmVlICFcbiIpKTsKCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CgkgIHJldHVybiAtMTsKCX0KICAgICAgUFJJViAoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSBGQUxTRTsKICAgICAgaWYgKFBSSVYgKHJlY19zaXplKSA+IDEwKQoJewoJICAgUFJJViAoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSBUUlVFOwoJICAgUFJJViAoZW9tX2RhdGEpLmVvbV9iX3RmcmZsZyA9ICoodm1zX3JlYyArIDkpOwoJICAgUFJJViAoZW9tX2RhdGEpLmVvbV9sX3BzaW5keCA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7CgkgICBQUklWIChlb21fZGF0YSkuZW9tX2xfdGZyYWRyID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDE2KTsKCgkgICBhYmZkLT5zdGFydF9hZGRyZXNzID0gUFJJViAoZW9tX2RhdGEpLmVvbV9sX3RmcmFkcjsKCX0KICAgIH0KICByZXR1cm4gMDsKfQoKLyogV3JpdGUgZW9tIHJlY29yZCBmb3IgYmZkIGFiZmQuICAqLwoKaW50Cl9iZmRfdm1zX3dyaXRlX2VvbSAoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkKewojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2VvbSAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7CiNlbmRpZgoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIG9ianR5cGUsIC0xKTsKICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpIChQUklWICh2bXNfbGlua2FnZV9pbmRleCkgPj4gMSkpOwogIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogQ29tcGxldGlvbiBjb2RlLiAgKi8KICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIEZpbGwgYnl0ZS4gICovCgogIGlmIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpICE9IChiZmRfdm1hKS0xKQogICAgewogICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKCiAgICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5saW5rIik7CiAgICAgIGlmIChzZWN0aW9uID09IDApCgl7CgkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwoJICByZXR1cm4gLTE7Cgl9CiAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykgKHNlY3Rpb24tPmluZGV4KSk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAoJCQkgICAgICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwogICAgfQoKICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsKICByZXR1cm4gMDsKfQo=