LyogCiAqIEltcGxlbWVudGF0aW9uIG9mIFZFUi5ETEwKICogCiAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogKi8KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlICJ3aW5kb3dzLmgiCiNpbmNsdWRlICJ3aW4uaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ2ZXIuaCIKI2luY2x1ZGUgImx6ZXhwYW5kLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgIm5lZXhlLmgiCiNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCS8qIE1BS0VfU0VHUFRSICovCiNpbmNsdWRlICJzdGRkZWJ1Zy5oIgojaW5jbHVkZSAiZGVidWcuaCIKI2luY2x1ZGUgInhtYWxsb2MuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgoKI2RlZmluZSBMWlJFQUQod2hhdCkJaWYgKHNpemVvZigqd2hhdCkhPUxaUmVhZChsemZkLE1BS0VfU0VHUFRSKHdoYXQpLHNpemVvZigqd2hhdCkpKSByZXR1cm4gMDsKCmludApyZWFkX25lX2hlYWRlcihIRklMRSBsemZkLHN0cnVjdCBuZV9oZWFkZXJfcyAqbmVoZCkgewoJc3RydWN0CW16X2hlYWRlcl9zCW16aDsKCglMWlNlZWsobHpmZCwwLFNFRUtfU0VUKTsKCWlmIChzaXplb2YobXpoKSE9TFpSZWFkKGx6ZmQsTUFLRV9TRUdQVFIoJm16aCksc2l6ZW9mKG16aCkpKQoJCXJldHVybiAwOwoJaWYgKG16aC5tel9tYWdpYyE9TVpfU0lHTkFUVVJFKQoJCXJldHVybiAwOwoJTFpTZWVrKGx6ZmQsbXpoLm5lX29mZnNldCxTRUVLX1NFVCk7CglMWlJFQUQobmVoZCk7CglpZiAobmVoZC0+bmVfbWFnaWMgPT0gTkVfU0lHTkFUVVJFKSB7CgkJTFpTZWVrKGx6ZmQsbXpoLm5lX29mZnNldCxTRUVLX1NFVCk7CgkJcmV0dXJuIDE7Cgl9CgkvKiBtdXN0IGhhbmRsZSBQRSBmaWxlcyB0b28uIExhdGVyLiAqLwoJcmV0dXJuIDA7Cn0KCgppbnQKZmluZF9uZV9yZXNvdXJjZSgKCUhGSUxFIGx6ZmQsc3RydWN0IG5lX2hlYWRlcl9zICpuZWhkLFNFR1BUUiB0eXBlaWQsU0VHUFRSIHJlc2lkLAoJQllURSAqKnJlc2RhdGEsaW50ICpyZXNsZW4sRFdPUkQgKm9mZgopIHsKCU5FX1RZUEVJTkZPCXRpOwoJTkVfTkFNRUlORk8Jbmk7CglpbnQJCWk7CglXT1JECQlzaGlmdGNvdW50OwoJRFdPUkQJCW5laGRvZmZzZXQ7CgoJbmVoZG9mZnNldD1MWlNlZWsobHpmZCxuZWhkLT5yZXNvdXJjZV90YWJfb2Zmc2V0LFNFRUtfQ1VSKTsKCUxaUkVBRCgmc2hpZnRjb3VudCk7CglkcHJpbnRmX3Jlc291cmNlKHN0ZGVyciwic2hpZnRjb3VudCBpcyAlZFxuIixzaGlmdGNvdW50KTsKCWRwcmludGZfcmVzb3VyY2Uoc3RkZXJyLCJyZWFkaW5nIHJlc291cmNlIHR5cGVpbmZvIGRpci5cbiIpOwoKCWlmICghSElXT1JEKHR5cGVpZCkpIHR5cGVpZCA9IChTRUdQVFIpKExPV09SRCh0eXBlaWQpIHwgMHg4MDAwKTsKCWlmICghSElXT1JEKHJlc2lkKSkgIHJlc2lkICA9IChTRUdQVFIpKExPV09SRChyZXNpZCkgfCAweDgwMDApOwoJd2hpbGUgKDEpIHsKCQlpbnQJc2tpcGZsYWc7CgoJCUxaUkVBRCgmdGkpOwoJCWlmICghdGkudHlwZV9pZCkKCQkJcmV0dXJuIDA7CgkJZHByaW50Zl9yZXNvdXJjZShzdGRlcnIsIiAgICB0aS50eXBlaWQgPSUwNHgsY291bnQ9JWRcbiIsdGkudHlwZV9pZCx0aS5jb3VudCk7CgkJc2tpcGZsYWc9MDsKCQlpZiAoIUhJV09SRCh0eXBlaWQpKSB7CgkJCWlmICgodGkudHlwZV9pZCYweDgwMDApJiYodHlwZWlkIT10aS50eXBlX2lkKSkKCQkJCXNraXBmbGFnPTE7CgkJfSBlbHNlIHsKCQkJaWYgKHRpLnR5cGVfaWQgJiAweDgwMDApIHsKCQkJCXNraXBmbGFnPTE7IAoJCQl9IGVsc2UgewoJCQkJQllURQlsZW47CgkJCQljaGFyCSpzdHI7CgkJCQlEV09SRAl3aGVyZWxlZnQ7CgoJCQkJd2hlcmVsZWZ0PUxaU2VlaygKCQkJCQlsemZkLAoJCQkJCW5laGRvZmZzZXQrbmVoZC0+cmVzb3VyY2VfdGFiX29mZnNldCt0aS50eXBlX2lkLAoJCQkJCVNFRUtfU0VUCgkJCQkpOwoJCQkJTFpSRUFEKCZsZW4pOwoJCQkJc3RyPXhtYWxsb2MobGVuKTsKCQkJCWlmIChsZW4hPUxaUmVhZChsemZkLE1BS0VfU0VHUFRSKHN0ciksbGVuKSkKCQkJCQlyZXR1cm4gMDsKCQkJCWRwcmludGZfcmVzb3VyY2Uoc3RkZXJyLCJyZWFkICVzIHRvIGNvbXBhcmUgaXQgd2l0aCAlc1xuIiwKCQkJCQlzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkKCQkJCSk7CgkJCQlpZiAobHN0cmNtcGkoc3RyLChjaGFyKilQVFJfU0VHX1RPX0xJTih0eXBlaWQpKSkKCQkJCQlza2lwZmxhZz0xOwoJCQkJZnJlZShzdHIpOwoJCQkJTFpTZWVrKGx6ZmQsd2hlcmVsZWZ0LFNFRUtfU0VUKTsKCQkJfQoJCX0KCQlpZiAoc2tpcGZsYWcpIHsKCQkJTFpTZWVrKGx6ZmQsdGkuY291bnQqc2l6ZW9mKG5pKSxTRUVLX0NVUik7CgkJCWNvbnRpbnVlOwoJCX0KCQlmb3IgKGk9MDtpPHRpLmNvdW50O2krKykgewoJCQlXT1JECSpyZGF0YTsKCQkJaW50CWxlbjsKCgkJCUxaUkVBRCgmbmkpOwoJCQlkcHJpbnRmX3Jlc291cmNlKHN0ZGVyciwiCW5pLmlkPSU0eCxvZmZzZXQ9JWQsbGVuZ3RoPSVkXG4iLAoJCQkJbmkuaWQsbmkub2Zmc2V0LG5pLmxlbmd0aAoJCQkpOwoJCQlza2lwZmxhZz0xOwoJCQlpZiAoIUhJV09SRChyZXNpZCkpIHsKCQkJCWlmIChuaS5pZCA9PSByZXNpZCkKCQkJCQlza2lwZmxhZz0wOwoJCQl9IGVsc2UgewoJCQkJaWYgKCEobmkuaWQgJiAweDgwMDApKSB7CgkJCQkJQllURQlsZW47CgkJCQkJY2hhcgkqc3RyOwoJCQkJCURXT1JECXdoZXJlbGVmdDsKCgkJCQkJd2hlcmVsZWZ0PUxaU2VlaygKCQkJCQkJbHpmZCwKCQkJCQkJbmVoZG9mZnNldCtuZWhkLT5yZXNvdXJjZV90YWJfb2Zmc2V0K25pLmlkLAoJCQkJCQlTRUVLX1NFVAoJCQkJCSk7CgkJCQkJTFpSRUFEKCZsZW4pOwoJCQkJCXN0cj14bWFsbG9jKGxlbik7CgkJCQkJaWYgKGxlbiE9TFpSZWFkKGx6ZmQsTUFLRV9TRUdQVFIoc3RyKSxsZW4pKQoJCQkJCQlyZXR1cm4gMDsKCQkJCQlkcHJpbnRmX3Jlc291cmNlKHN0ZGVyciwicmVhZCAlcyB0byBjb21wYXJlIGl0IHdpdGggJXNcbiIsCgkJCQkJCXN0ciwoY2hhciopUFRSX1NFR19UT19MSU4odHlwZWlkKQoJCQkJCSk7CgkJCQkJaWYgKCFsc3RyY21waShzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkpKQoJCQkJCQlza2lwZmxhZz0wOwoJCQkJCWZyZWUoc3RyKTsKCQkJCQlMWlNlZWsobHpmZCx3aGVyZWxlZnQsU0VFS19TRVQpOwoJCQkJfQoJCQl9CgkJCWlmIChza2lwZmxhZykKCQkJCWNvbnRpbnVlOwoJCQlMWlNlZWsobHpmZCwoKGludCluaS5vZmZzZXQ8PHNoaWZ0Y291bnQpLFNFRUtfU0VUKTsKCQkJKm9mZgk9IChpbnQpbmkub2Zmc2V0PDxzaGlmdGNvdW50OwoJCQlsZW4JPSBuaS5sZW5ndGg8PHNoaWZ0Y291bnQ7CgkJCXJkYXRhPShXT1JEKil4bWFsbG9jKGxlbik7CgkJCWlmIChsZW4hPUxaUmVhZChsemZkLE1BS0VfU0VHUFRSKHJkYXRhKSxsZW4pKSB7CgkJCQlmcmVlKHJkYXRhKTsKCQkJCXJldHVybiAwOwoJCQl9CgkJCWRwcmludGZfcmVzb3VyY2Uoc3RkZXJyLCJyZXNvdXJjZSBmb3VuZC5cbiIpOwoJCQkqcmVzZGF0YT0gKEJZVEUqKXJkYXRhOwoJCQkqcmVzbGVuCT0gbGVuOwoJCQlyZXR1cm4gMTsKCQl9Cgl9Cn0KCkRXT1JECkdldEZpbGVSZXNvdXJjZVNpemUoTFBDU1RSIGZpbGVuYW1lLFNFR1BUUiByZXN0eXBlLFNFR1BUUiByZXNpZCxMUERXT1JEIG9mZikgewoJSEZJTEUJbHpmZDsKCU9GU1RSVUNUCW9mczsKCUJZVEUJKnJlc2RhdGE7CglpbnQJcmVzbGVuOwoJc3RydWN0CW5lX2hlYWRlcl9zCW5laGQ7CgoJZnByaW50ZihzdGRlcnIsIkdldEZpbGVSZXNvdXJjZVNpemUoJXMsJWx4LCVseCwlcClcbiIsCgkJZmlsZW5hbWUsKExPTkcpcmVzdHlwZSwoTE9ORylyZXNpZCxvZmYKCSk7CglsemZkPUxaT3BlbkZpbGUoZmlsZW5hbWUsJm9mcyxPRl9SRUFEKTsKCWlmIChsemZkPT0wKQoJCXJldHVybiAwOwoJaWYgKCFyZWFkX25lX2hlYWRlcihsemZkLCZuZWhkKSkgewoJCUxaQ2xvc2UobHpmZCk7CgkJcmV0dXJuIDA7Cgl9CglpZiAoIWZpbmRfbmVfcmVzb3VyY2UobHpmZCwmbmVoZCxyZXN0eXBlLHJlc2lkLCZyZXNkYXRhLCZyZXNsZW4sb2ZmKSkgewoJCUxaQ2xvc2UobHpmZCk7CgkJcmV0dXJuIDA7Cgl9CglmcmVlKHJlc2RhdGEpOwoJTFpDbG9zZShsemZkKTsKCXJldHVybiByZXNsZW47Cn0KCkRXT1JECkdldEZpbGVSZXNvdXJjZShMUENTVFIgZmlsZW5hbWUsU0VHUFRSIHJlc3R5cGUsU0VHUFRSIHJlc2lkLAoJCURXT1JEIG9mZixEV09SRCBkYXRhbGVuLExQVk9JRCBkYXRhCikgewoJSEZJTEUJbHpmZDsKCU9GU1RSVUNUCW9mczsKCUJZVEUJKnJlc2RhdGE7CglpbnQJcmVzbGVuOwoJc3RydWN0CW5lX2hlYWRlcl9zCW5laGQ7CglmcHJpbnRmKHN0ZGVyciwiR2V0RmlsZVJlc291cmNlKCVzLCVseCwlbHgsJWxkLCVsZCwlcClcbiIsCgkJZmlsZW5hbWUsKExPTkcpcmVzdHlwZSwoTE9ORylyZXNpZCxvZmYsZGF0YWxlbixkYXRhCgkpOwoKCWx6ZmQ9TFpPcGVuRmlsZShmaWxlbmFtZSwmb2ZzLE9GX1JFQUQpOwoJaWYgKGx6ZmQ9PTApCgkJcmV0dXJuIDA7CglpZiAoIW9mZikgewoJCWlmICghcmVhZF9uZV9oZWFkZXIobHpmZCwmbmVoZCkpIHsKCQkJTFpDbG9zZShsemZkKTsKCQkJcmV0dXJuIDA7CgkJfQoJCWlmICghZmluZF9uZV9yZXNvdXJjZShsemZkLCZuZWhkLHJlc3R5cGUscmVzaWQsJnJlc2RhdGEsJnJlc2xlbiwmb2ZmKSkgewoJCQlMWkNsb3NlKGx6ZmQpOwoJCQlyZXR1cm4gMDsKCQl9CgkJZnJlZShyZXNkYXRhKTsKCX0KCUxaU2VlayhsemZkLG9mZixTRUVLX1NFVCk7CglpZiAocmVzbGVuPmRhdGFsZW4pCgkJcmVzbGVuPWRhdGFsZW47CglMWlJlYWQobHpmZCxNQUtFX1NFR1BUUihkYXRhKSxyZXNsZW4pOwoJTFpDbG9zZShsemZkKTsKCXJldHVybiByZXNsZW47Cn0KCkRXT1JECkdldEZpbGVWZXJzaW9uSW5mb1NpemUoTFBDU1RSIGZpbGVuYW1lLExQRFdPUkQgaGFuZGxlKSB7CglEV09SRAlsZW4scmV0OwoJQllURQlidWZbNzJdOwoJVlNfRklYRURGSUxFSU5GTyAqdmZmaTsKCglmcHJpbnRmKHN0ZGVyciwiR2V0RmlsZVZlcnNpb25JbmZvU2l6ZSglcywlcClcbiIsZmlsZW5hbWUsaGFuZGxlKTsKCglsZW49R2V0RmlsZVJlc291cmNlU2l6ZShmaWxlbmFtZSxWU19GSUxFX0lORk8sVlNfVkVSU0lPTl9JTkZPLGhhbmRsZSk7CglpZiAoIWxlbikKCQlyZXR1cm4gMDsKCXJldD1HZXRGaWxlUmVzb3VyY2UoCgkJZmlsZW5hbWUsVlNfRklMRV9JTkZPLFZTX1ZFUlNJT05fSU5GTywqaGFuZGxlLHNpemVvZihidWYpLGJ1ZgoJKTsKCWlmICghcmV0KQoJCXJldHVybiAwOwoKCXZmZmk9KFZTX0ZJWEVERklMRUlORk8qKShidWYrMHgxNCk7CglpZiAodmZmaS0+ZHdTaWduYXR1cmUgIT0gVlNfRkZJX1NJR05BVFVSRSkKCQlyZXR1cm4gMDsKCWlmICgqKFdPUkQqKWJ1ZiA8IGxlbikKCQlsZW4gPSAqKFdPUkQqKWJ1ZjsKCWZwcmludGYoc3RkZXJyLCItPnN0cnVjdmVyPSVsZC4lbGQsZmlsZXZlcj0lbGQuJWxkLHByb2R1Y3R2ZXI9JWxkLiVsZCxmbGFnbWFzaz0lbHgsZmxhZ3M9JWx4LE9TPSIsCgkJKHZmZmktPmR3U3RydWNWZXJzaW9uPj4xNiksdmZmaS0+ZHdTdHJ1Y1ZlcnNpb24mMHhGRkZGLAoJCXZmZmktPmR3RmlsZVZlcnNpb25NUyx2ZmZpLT5kd0ZpbGVWZXJzaW9uTFMsCgkJdmZmaS0+ZHdQcm9kdWN0VmVyc2lvbk1TLHZmZmktPmR3UHJvZHVjdFZlcnNpb25MUywKCQl2ZmZpLT5kd0ZpbGVGbGFnc01hc2ssdmZmaS0+ZHdGaWxlRmxhZ3MKCSk7Cglzd2l0Y2ggKHZmZmktPmR3RmlsZU9TJjB4RkZGRjAwMDApIHsKCWNhc2UgVk9TX0RPUzpmcHJpbnRmKHN0ZGVyciwiRE9TLCIpO2JyZWFrOwoJY2FzZSBWT1NfT1MyMTY6ZnByaW50ZihzdGRlcnIsIk9TLzItMTYsIik7YnJlYWs7CgljYXNlIFZPU19PUzIzMjpmcHJpbnRmKHN0ZGVyciwiT1MvMi0zMiwiKTticmVhazsKCWNhc2UgVk9TX05UOmZwcmludGYoc3RkZXJyLCJOVCwiKTticmVhazsKCWNhc2UgVk9TX1VOS05PV046CglkZWZhdWx0OgoJCWZwcmludGYoc3RkZXJyLCJVTktOT1dOKCVsZCksIix2ZmZpLT5kd0ZpbGVPUyYweEZGRkYwMDAwKTticmVhazsKCX0KCXN3aXRjaCAodmZmaS0+ZHdGaWxlT1MgJiAweEZGRkYpIHsKCWNhc2UgVk9TX19CQVNFOmZwcmludGYoc3RkZXJyLCJCQVNFIik7YnJlYWs7CgljYXNlIFZPU19fV0lORE9XUzE2OmZwcmludGYoc3RkZXJyLCJXSU4xNiIpO2JyZWFrOwoJY2FzZSBWT1NfX1dJTkRPV1MzMjpmcHJpbnRmKHN0ZGVyciwiV0lOMzIiKTticmVhazsKCWNhc2UgVk9TX19QTTE2OmZwcmludGYoc3RkZXJyLCJQTTE2Iik7YnJlYWs7CgljYXNlIFZPU19fUE0zMjpmcHJpbnRmKHN0ZGVyciwiUE0zMiIpO2JyZWFrOwoJZGVmYXVsdDpmcHJpbnRmKHN0ZGVyciwiVU5LTk9XTiglbGQpIix2ZmZpLT5kd0ZpbGVPUyYweEZGRkYpO2JyZWFrOwoJfQoJc3dpdGNoICh2ZmZpLT5kd0ZpbGVUeXBlKSB7CglkZWZhdWx0OgoJY2FzZSBWRlRfVU5LTk9XTjoKCQlmcHJpbnRmKHN0ZGVyciwiZmlsZXR5cGU9VW5rbm93biglbGQpIix2ZmZpLT5kd0ZpbGVUeXBlKTsKCQlicmVhazsKCWNhc2UgVkZUX0FQUDpmcHJpbnRmKHN0ZGVyciwiZmlsZXR5cGU9QVBQIik7YnJlYWs7CgljYXNlIFZGVF9ETEw6ZnByaW50ZihzdGRlcnIsImZpbGV0eXBlPURMTCIpO2JyZWFrOwoJY2FzZSBWRlRfRFJWOgoJCWZwcmludGYoc3RkZXJyLCJmaWxldHlwZT1EUlYsIik7CgkJc3dpdGNoKHZmZmktPmR3RmlsZVN1YnR5cGUpIHsKCQlkZWZhdWx0OgoJCWNhc2UgVkZUMl9VTktOT1dOOgoJCQlmcHJpbnRmKHN0ZGVyciwiVU5LTk9XTiglbGQpIix2ZmZpLT5kd0ZpbGVTdWJ0eXBlKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9QUklOVEVSOgoJCQlmcHJpbnRmKHN0ZGVyciwiUFJJTlRFUiIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX0tFWUJPQVJEOgoJCQlmcHJpbnRmKHN0ZGVyciwiS0VZQk9BUkQiKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9MQU5HVUFHRToKCQkJZnByaW50ZihzdGRlcnIsIkxBTkdVQUdFIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfRElTUExBWToKCQkJZnByaW50ZihzdGRlcnIsIkRJU1BMQVkiKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9NT1VTRToKCQkJZnByaW50ZihzdGRlcnIsIk1PVVNFIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfTkVUV09SSzoKCQkJZnByaW50ZihzdGRlcnIsIk5FVFdPUksiKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9TWVNURU06CgkJCWZwcmludGYoc3RkZXJyLCJTWVNURU0iKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9JTlNUQUxMQUJMRToKCQkJZnByaW50ZihzdGRlcnIsIklOU1RBTExBQkxFIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfU09VTkQ6CgkJCWZwcmludGYoc3RkZXJyLCJTT1VORCIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX0NPTU06CgkJCWZwcmludGYoc3RkZXJyLCJDT01NIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfSU5QVVRNRVRIT0Q6CgkJCWZwcmludGYoc3RkZXJyLCJJTlBVVE1FVEhPRCIpOwoJCQlicmVhazsKCQl9CgkJYnJlYWs7CgljYXNlIFZGVF9GT05UOgoJCWZwcmludGYoc3RkZXJyLCJmaWxldHlwZT1GT05ULiIpOwoJCXN3aXRjaCAodmZmaS0+ZHdGaWxlU3VidHlwZSkgewoJCWRlZmF1bHQ6CgkJCWZwcmludGYoc3RkZXJyLCJVTktOT1dOKCVsZCkiLHZmZmktPmR3RmlsZVN1YnR5cGUpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRk9OVF9SQVNURVI6ZnByaW50ZihzdGRlcnIsIlJBU1RFUiIpO2JyZWFrOwoJCWNhc2UgVkZUMl9GT05UX1ZFQ1RPUjpmcHJpbnRmKHN0ZGVyciwiVkVDVE9SIik7YnJlYWs7CgkJY2FzZSBWRlQyX0ZPTlRfVFJVRVRZUEU6ZnByaW50ZihzdGRlcnIsIlRSVUVUWVBFIik7YnJlYWs7CgkJfQoJCWJyZWFrOwoJY2FzZSBWRlRfVlhEOmZwcmludGYoc3RkZXJyLCJmaWxldHlwZT1WWEQiKTticmVhazsKCWNhc2UgVkZUX1NUQVRJQ19MSUI6ZnByaW50ZihzdGRlcnIsImZpbGV0eXBlPVNUQVRJQ19MSUIiKTticmVhazsKCX0KCWZwcmludGYoc3RkZXJyLCJmaWxlZGF0YT0lbHguJWx4XG4iLHZmZmktPmR3RmlsZURhdGVNUyx2ZmZpLT5kd0ZpbGVEYXRlTFMpOwoJcmV0dXJuIGxlbjsKfQoKRFdPUkQgCkdldEZpbGVWZXJzaW9uSW5mbyhMUENTVFIgZmlsZW5hbWUsRFdPUkQgaGFuZGxlLERXT1JEIGRhdGFzaXplLExQVk9JRCBkYXRhKSB7CglmcHJpbnRmKHN0ZGVyciwiR2V0RmlsZVZlcnNpb25JbmZvKCVzLCVsZCwlbGQsJXApXG4tPiIsCgkJZmlsZW5hbWUsaGFuZGxlLGRhdGFzaXplLGRhdGEKCSk7CglyZXR1cm4gR2V0RmlsZVJlc291cmNlKAoJCWZpbGVuYW1lLFZTX0ZJTEVfSU5GTyxWU19WRVJTSU9OX0lORk8saGFuZGxlLGRhdGFzaXplLGRhdGEKCSk7Cn0KCkRXT1JEIApWZXJGaW5kRmlsZSgKCVVJTlQgZmxhZ3MsTFBDU1RSIGZpbGVuYW1lLExQQ1NUUiB3aW5kaXIsTFBDU1RSIGFwcGRpciwKCUxQU1RSIGN1cmRpcixVSU5UICpjdXJkaXJsZW4sTFBTVFIgZGVzdGRpcixVSU5UKmRlc3RkaXJsZW4KKSB7CglmcHJpbnRmKHN0ZGVyciwiVmVyRmluZEZpbGUoJXgsJXMsJXMsJXMsJXAsJWQsJXAsJWQpXG4iLAoJCWZsYWdzLGZpbGVuYW1lLHdpbmRpcixhcHBkaXIsY3VyZGlyLCpjdXJkaXJsZW4sZGVzdGRpciwqZGVzdGRpcmxlbgoJKTsKCXN0cmNweShjdXJkaXIsIlo6XFxST09UXFwuV0lORVxcIik7LypGSVhNRSovCgkqY3VyZGlybGVuPXN0cmxlbihjdXJkaXIpOwoJc3RyY3B5KGRlc3RkaXIsIlo6XFxST09UXFwuV0lORVxcIik7LypGSVhNRSovCgkqZGVzdGRpcmxlbj1zdHJsZW4oZGVzdGRpcik7CglyZXR1cm4gMDsKfQoKRFdPUkQKVmVySW5zdGFsbEZpbGUoCglVSU5UIGZsYWdzLExQQ1NUUiBzcmNmaWxlbmFtZSxMUENTVFIgZGVzdGZpbGVuYW1lLExQQ1NUUiBzcmNkaXIsCglMUENTVFIgZGVzdGRpcixMUFNUUiB0bXBmaWxlLFVJTlQqdG1wZmlsZWxlbgopIHsKCWZwcmludGYoc3RkZXJyLCJWZXJJbnN0YWxsRmlsZSgleCwlcywlcywlcywlcywlcCwlZClcbiIsCgkJZmxhZ3Msc3JjZmlsZW5hbWUsZGVzdGZpbGVuYW1lLHNyY2RpcixkZXN0ZGlyLHRtcGZpbGUsKnRtcGZpbGVsZW4KCSk7CglyZXR1cm4gVklGX1NSQ09MRDsKfQoKLyogRklYTUU6IFRoaXMgdGFibGUgc2hvdWxkLCBvZiBjb3Vyc2UsIGJlIGxhbmd1YWdlIGRlcGVuZGVuZCAqLwpzdGF0aWMgc3RydWN0IG1hcF9pZDJzdHIgewoJVUlOVAlsYW5naWQ7CgljaGFyCSpsYW5nbmFtZTsKfSBsYW5ndWFnZXNbXT17Cgl7MHgwNDAxLCJBcmFiaXNjaCJ9LAoJezB4MDQwMiwiQnVsZ2FyaXNjaCJ9LAoJezB4MDQwMywiS2F0YWxhbmlzY2gifSwKCXsweDA0MDQsIlRyYWRpdGlvbmFsZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDQwNSwiVHNjaGVjaXNjaCJ9LAoJezB4MDQwNiwiRORuaXNjaCJ9LAoJezB4MDQwNywiRGV1dHNjaCJ9LAoJezB4MDQwOCwiR3JpZWNoaXNjaCJ9LAoJezB4MDQwOSwiQW1lcmlrYW5pc2NoZXMgRW5nbGlzY2gifSwKCXsweDA0MEEsIkthc3RpbGlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDQwQiwiRmlubmlzY2gifSwKCXsweDA0MEMsIkZyYW569nNpc2NoIn0sCgl7MHgwNDBELCJIZWJy5GlzY2gifSwKCXsweDA0MEUsIlVuZ2FyaXNjaCJ9LAoJezB4MDQwRiwiSXNs5G5kaXNjaCJ9LAoJezB4MDQxMCwiSXRhbGllbmlzY2gifSwKCXsweDA0MTEsIkphcGFuaXNjaCJ9LAoJezB4MDQxMiwiS29yZWFuaXNjaCJ9LAoJezB4MDQxMywiTmllZGVybORuZGlzY2gifSwKCXsweDA0MTQsIk5vcndlZ2lzY2gtQm9rbWFsIn0sCgl7MHgwNDE1LCJQb2xuaXNjaCJ9LAoJezB4MDQxNiwiQnJhc2lsaWFuaXNjaGVzIFBvcnR1Z2llc2lzY2gifSwKCXsweDA0MTcsIlLkdG9yb21hbmlzY2gifSwKCXsweDA0MTgsIlJ1beRuaXNjaCJ9LAoJezB4MDQxOSwiUnVzc2lzY2gifSwKCXsweDA0MUEsIktyb2F0b3NlcmJpc2NoIChsYXRlaW5pc2NoKSJ9LAoJezB4MDQxQiwiU2xvd2VuaXNjaCJ9LAoJezB4MDQxQywiQWxiYW5pc2NoIn0sCgl7MHgwNDFELCJTY2h3ZWRpc2NoIn0sCgl7MHgwNDFFLCJUaGFpIn0sCgl7MHgwNDFGLCJU/HJraXNjaCJ9LAoJezB4MDQyMCwiVXJkdSJ9LAoJezB4MDQyMSwiQmFoYXNhIn0sCgl7MHgwODA0LCJWZXJlaW5mYWNodGVzIENoaW5lc2lzY2gifSwKCXsweDA4MDcsIlNjaHdlaXplcmRldXRzY2gifSwKCXsweDA4MDksIkJyaXRpc2NoZXMgRW5nbGlzY2gifSwKCXsweDA4MEEsIk1leGlrYW5pc2NoZXMgU3BhbmlzY2gifSwKCXsweDA4MEMsIkJlbGdpc2NoZXMgRnJhbnr2c2lzY2gifSwKCXsweDA4MTAsIlNjaHdlaXplcmlzY2hlcyBJdGFsaWVuaXNjaCJ9LAoJezB4MDgxMywiQmVsZ2lzY2hlcyBOaWVkZXJs5G5kaXNjaCJ9LAoJezB4MDgxNCwiTm9yZ3dlZ2lzY2gtTnlub3JzayJ9LAoJezB4MDgxNiwiUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDgxQSwiU2VyYm9rcmF0aXNjaCAoa3lyaWxsaXNjaCkifSwKCXsweDBDMUMsIkthbmFkaXNjaGVzIEZyYW569nNpc2NoIn0sCgl7MHgxMDBDLCJTY2h3ZWl6ZXJpc2NoZXMgRnJhbnr2c2lzY2gifSwKCXsweDAwMDAsIlVuYmVrYW5udCJ9LAp9OwoKCkRXT1JEClZlckxhbmd1YWdlTmFtZShVSU5UIGxhbmdpZCxMUFNUUiBsYW5nbmFtZSxVSU5UIGxhbmduYW1lbGVuKSB7CglpbnQJaTsKCglmcHJpbnRmKHN0ZGVyciwiVmVyTGFuZ3VhZ2VOYW1lKCVkLCVwLCVkKVxuIixsYW5naWQsbGFuZ25hbWUsbGFuZ25hbWVsZW4pOwoJZm9yIChpPTA7bGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MDtpKyspCgkJaWYgKGxhbmdpZD09bGFuZ3VhZ2VzW2ldLmxhbmdpZCkKCQkJYnJlYWs7CglzdHJuY3B5KGxhbmduYW1lLGxhbmd1YWdlc1tpXS5sYW5nbmFtZSxsYW5nbmFtZWxlbik7CglsYW5nbmFtZVtsYW5nbmFtZWxlbi0xXT0nXDAnOwoJcmV0dXJuIHN0cmxlbihsYW5ndWFnZXNbaV0ubGFuZ25hbWUpOwp9CgpzdHJ1Y3QgZGIgewoJV09SRAluZXh0b2ZmOwoJV09SRAlkYXRhbGVuOwovKiBpbiBtZW1vcnkgc3RydWN0dXJlLi4uICovCgljaGFyCW5hbWVbMV07IAkvKiBwYWRkZWQgdG8gZHdvcmQgYWxpZ25tZW50ICovCi8qIC4uLi4gCgljaGFyCWRhdGFbZGF0YWxlbl07ICAgICBwYWRkZWQgdG8gZHdvcmQgYWxpZ25lbW50CglCWVRFCXN1YmRpcmRhdGFbXTsgICAgICB1bnRpbCBuZXh0b2ZmCiAqLwp9OwoKc3RhdGljIEJZVEUqCl9maW5kX2RhdGEoQllURSAqYmxvY2ssTFBDU1RSIHN0cikgewoJY2hhcgkqbmV4dHNsYXNoOwoJaW50CXN1YnN0cmxlbjsKCXN0cnVjdAlkYgkqZGI7CgoJd2hpbGUgKCpzdHIgJiYgKnN0cj09J1xcJykKCQlzdHIrKzsKCWlmIChOVUxMIT0obmV4dHNsYXNoPXN0cmNocihzdHIsJ1xcJykpKQoJCXN1YnN0cmxlbj1uZXh0c2xhc2gtc3RyOwoJZWxzZQoJCXN1YnN0cmxlbj1zdHJsZW4oc3RyKTsKCWlmIChuZXh0c2xhc2ghPU5VTEwpIHsKCQl3aGlsZSAoKm5leHRzbGFzaCAmJiAqbmV4dHNsYXNoPT0nXFwnKQoJCQluZXh0c2xhc2grKzsKCQlpZiAoISpuZXh0c2xhc2gpCgkJCW5leHRzbGFzaD1OVUxMOwoJfQoKCgl3aGlsZSAoMSkgewoJCWRiPShzdHJ1Y3QgZGIqKWJsb2NrOwoJCWZwcmludGYoc3RkZXJyLCJkYj0lcCxkYi0+bmV4dG9mZj0lZCxkYi0+ZGF0YWxlbj0lZCxkYi0+bmFtZT0lcyxkYi0+ZGF0YT0lc1xuIiwKCQkJZGIsZGItPm5leHRvZmYsZGItPmRhdGFsZW4sZGItPm5hbWUsKGNoYXIqKSgoY2hhciopZGIrNCsoKHN0cmxlbihkYi0+bmFtZSkrNCkmfjMpKQoJCSk7CgkJaWYgKCFkYi0+bmV4dG9mZikKCQkJcmV0dXJuIE5VTEw7CgoJCWZwcmludGYoc3RkZXJyLCJjb21wYXJpbmcgd2l0aCAlc1xuIixkYi0+bmFtZSk7CgkJaWYgKCFzdHJuY21wKGRiLT5uYW1lLHN0cixzdWJzdHJsZW4pKSB7CgkJCWlmIChuZXh0c2xhc2gpCgkJCQlyZXR1cm4gX2ZpbmRfZGF0YSgKCQkJCQlibG9jays0Kygoc3RybGVuKGRiLT5uYW1lKSs0KSZ+MykrKChkYi0+ZGF0YWxlbiszKSZ+MykKCQkJCQksbmV4dHNsYXNoCgkJCQkpOwoJCQllbHNlCgkJCQlyZXR1cm4gYmxvY2s7CgkJfQoJCWJsb2NrPWJsb2NrKygoZGItPm5leHRvZmYrMykmfjMpOwoJfQoKfQoKLyogdGFrZSBjYXJlLCAnYnVmZmVyJyBpcyBOT1QgYSBTRUdQVFIsIGl0IGp1c3QgcG9pbnRzIHRvIG9uZSAqLwpEV09SRApWZXJRdWVyeVZhbHVlKFNFR1BUUiBzZWdibG9jayxMUENTVFIgc3ViYmxvY2ssU0VHUFRSICpidWZmZXIsVUlOVCAqYnVmbGVuKSB7CglCWVRFCSpibG9jaz1QVFJfU0VHX1RPX0xJTihzZWdibG9jayksKmI7CglzdHJ1Y3QJZGIJKmRiOwoJY2hhcgkqczsKCglmcHJpbnRmKHN0ZGVyciwiVmVyUXVlcnlWYWx1ZSglcCwlcywlcCwlZClcbiIsCgkJYmxvY2ssc3ViYmxvY2ssYnVmZmVyLCpidWZsZW4KCSk7CglzPShjaGFyKil4bWFsbG9jKHN0cmxlbigiVlNfVkVSU0lPTl9JTkZPIikrc3RybGVuKHN1YmJsb2NrKSsxKTsKCXN0cmNweShzLCJWU19WRVJTSU9OX0lORk8iKTtzdHJjYXQocyxzdWJibG9jayk7CgliPV9maW5kX2RhdGEoYmxvY2sscyk7CglpZiAoYj09TlVMTCkgewoJCSpidWZsZW49MDsKCQlyZXR1cm4gMDsKCX0KCWRiPShzdHJ1Y3QgZGIqKWI7CgkqYnVmbGVuCT0gZGItPmRhdGFsZW47CgkvKiBsZXQgYiBwb2ludCB0byBkYXRhIGFyZWEgKi8KCWIJPSBiKzQrKChzdHJsZW4oZGItPm5hbWUpKzQpJjMpOwoJLyogbm93IGxvb2sgdXAgd2hhdCB0aGUgcmVzcC4gU0VHUFRSIHdvdWxkIGJlIC4uLiAKCSAqIHdlIGNvdWxkIHVzZSBNQUtFX1NFR1BUUiAsIGJ1dCB3ZSBkb24ndCBuZWVkIHRvCgkgKi8KCSpidWZmZXIJPSAoYi1ibG9jaykrc2VnYmxvY2s7CglmcHJpbnRmKHN0ZGVyciwiCS0+ICVzPSVzXG4iLHN1YmJsb2NrLGIpOwoJcmV0dXJuIDE7Cn0KCi8qCiAgIDIwIEdFVEZJTEVWRVJTSU9OSU5GT1JBVwogICAyMSBWRVJGVEhLX1RIVU5LREFUQTE2CiAgIDIyIFZFUlRIS1NMX1RIVU5LREFUQTE2CiovCg==