LyogY2hlY2t0dHkuYyAtIGxpbmtlZCBpbnRvIGxvZ2luLCBjaGVja3MgdXNlciBhZ2FpbnN0IC9ldGMvdXNlcnR0eQogICBDcmVhdGVkIDI1LUF1Zy05NSBieSBQZXRlciBPcmJhZWsgPHBvZUBkYWltaS5hYXUuZGs+CiAgIEZpeGVkIGJ5IEpEUyBKdW5lIDE5OTYgdG8gY2xlYXIgbGlzdHMgYW5kIGNsb3NlIGZpbGVzCgogICAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KICAgLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAoKKi8KCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoKI2luY2x1ZGUgPHB3ZC5oPgojaW5jbHVkZSA8Z3JwLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgojaW5jbHVkZSA8bmV0ZGIuaD4KI2luY2x1ZGUgPHN5cy9zeXNsb2cuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlICJubHMuaCIKCiNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CiNpZmRlZiBIQVZFX0xJTlVYX01BSk9SX0gKI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiNlbmRpZgoKI2luY2x1ZGUgInBhdGhuYW1lcy5oIgojaW5jbHVkZSAibG9naW4uaCIKI2luY2x1ZGUgInhzdHJuY3B5LmgiCgojaWZuZGVmIFRUWV9NQUpPUgojZGVmaW5lIFRUWV9NQUpPUiA0CiNlbmRpZgoKc3RhdGljIGdpZF90IG15Z3JvdXBzW05HUk9VUFNdOwpzdGF0aWMgaW50ICAgbnVtX2dyb3VwczsKCiNkZWZpbmUgTkFNRUxFTiAxMjgKCi8qIGxpbmtlZCBsaXN0IG9mIG5hbWVzICovCnN0cnVjdCBncnBsaXN0IHsKICAgIHN0cnVjdCBncnBsaXN0ICpuZXh0OwogICAgY2hhciBuYW1lW05BTUVMRU5dOwp9OwogICAgICAgIAplbnVtIFN0YXRlIHsgU3RhdGVVc2VycywgU3RhdGVHcm91cHMsIFN0YXRlQ2xhc3NlcyB9OwoKI2RlZmluZSBDTEFTU05BTUVMRU4gMzIKCnN0cnVjdCB0dHljbGFzcyB7CiAgICBzdHJ1Y3QgZ3JwbGlzdCAqZmlyc3Q7CiAgICBzdHJ1Y3QgdHR5Y2xhc3MgKm5leHQ7CiAgICBjaGFyIGNsYXNzbmFtZVtDTEFTU05BTUVMRU5dOwp9OwoKc3RydWN0IHR0eWNsYXNzICp0dHljbGFzc2VzID0gTlVMTDsKCnN0YXRpYyBpbnQKYW1faW5fZ3JvdXAoY2hhciAqZ3JvdXApCnsKCXN0cnVjdCBncm91cCAqZzsKCWdpZF90ICpnZTsKCQoJZyA9IGdldGdybmFtKGdyb3VwKTsKCWlmIChnKSB7CgkJZm9yIChnZSA9IG15Z3JvdXBzOyBnZSA8IG15Z3JvdXBzICsgbnVtX2dyb3VwczsgZ2UrKykgewoJCQlpZiAoZy0+Z3JfZ2lkPT0gKmdlKSByZXR1cm4gMTsKCQl9Cgl9CiAgICAJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCmZpbmRfZ3JvdXBzKGdpZF90IGRlZmdycCwgY29uc3QgY2hhciAqdXNlcikKewoJbnVtX2dyb3VwcyA9IGdldGdyb3VwcyhOR1JPVVBTLCBteWdyb3Vwcyk7Cn0KCnN0YXRpYyBzdHJ1Y3QgdHR5Y2xhc3MgKgpuZXdfY2xhc3MoY2hhciAqY2xhc3MpCnsKICAgIHN0cnVjdCB0dHljbGFzcyAqdGM7CgogICAgdGMgPSAoc3RydWN0IHR0eWNsYXNzICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHR5Y2xhc3MpKTsKICAgIGlmICh0YyA9PSBOVUxMKSB7CglwcmludGYoXygibG9naW46IG1lbW9yeSBsb3csIGxvZ2luIG1heSBmYWlsXG4iKSk7CglzeXNsb2coTE9HX1dBUk5JTkcsIF8oImNhbid0IG1hbGxvYyBmb3IgdHR5Y2xhc3MiKSk7CglyZXR1cm4gTlVMTDsKICAgIH0KCiAgICB0Yy0+bmV4dCA9IHR0eWNsYXNzZXM7CiAgICB0Yy0+Zmlyc3QgPSBOVUxMOwogICAgeHN0cm5jcHkodGMtPmNsYXNzbmFtZSwgY2xhc3MsIENMQVNTTkFNRUxFTik7CiAgICB0dHljbGFzc2VzID0gdGM7CiAgICByZXR1cm4gdGM7Cn0KCnN0YXRpYyB2b2lkCmFkZF90b19jbGFzcyhzdHJ1Y3QgdHR5Y2xhc3MgKnRjLCBjaGFyICp0dHkpCnsKICAgIHN0cnVjdCBncnBsaXN0ICpnZTsKCiAgICBpZiAodGMgPT0gTlVMTCkgcmV0dXJuOwoKICAgIGdlID0gKHN0cnVjdCBncnBsaXN0ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ3JwbGlzdCkpOwogICAgaWYgKGdlID09IE5VTEwpIHsKCXByaW50ZihfKCJsb2dpbjogbWVtb3J5IGxvdywgbG9naW4gbWF5IGZhaWxcbiIpKTsKCXN5c2xvZyhMT0dfV0FSTklORywgXygiY2FuJ3QgbWFsbG9jIGZvciBncnBsaXN0IikpOwoJcmV0dXJuOwogICAgfQoKICAgIGdlLT5uZXh0ID0gdGMtPmZpcnN0OwogICAgeHN0cm5jcHkoZ2UtPm5hbWUsIHR0eSwgTkFNRUxFTik7CiAgICB0Yy0+Zmlyc3QgPSBnZTsKfQoKCi8qIHJldHVybiB0cnVlIGlmIHR0eSBpcyBhIHB0eS4gVmVyeSBsaW51eCBkZXBlbmRlbnQgKi8Kc3RhdGljIGludAppc2FwdHkoY29uc3QgY2hhciAqdHR5KQp7CiNpZmRlZiBfX2xpbnV4X18KICAgIGNoYXIgZGV2bmFtZVsxMDBdOwogICAgc3RydWN0IHN0YXQgc3RiOwoKICAgIC8qIGF2b2lkIHNucHJpbnRmIC0gb2xkIHN5c3RlbXMgZG8gbm90IGhhdmUgaXQgKi8KICAgIGlmIChzdHJsZW4odHR5KSArIDYgPiBzaXplb2YoZGV2bmFtZSkpCgkgICAgcmV0dXJuIDA7CiAgICBzcHJpbnRmKGRldm5hbWUsICIvZGV2LyVzIiwgdHR5KTsKCiAgICBpZigoc3RhdChkZXZuYW1lLCAmc3RiKSA+PSAwKSAmJiBTX0lTQ0hSKHN0Yi5zdF9tb2RlKSkgewoJICAgIGludCBtYWpvcmRldiA9IG1ham9yKHN0Yi5zdF9yZGV2KTsKCgkgICAgLyogdGhpcyBpcyBmb3IgbGludXggdmVyc2lvbnMgYmVmb3JlIDEuMzogdXNlIG1ham9yIDQgKi8KCSAgICBpZihtYWpvcmRldiA9PSBUVFlfTUFKT1IgJiYgbWlub3Ioc3RiLnN0X3JkZXYpID49IDE5MikKCQkgICAgcmV0dXJuIDE7CgojaWYgZGVmaW5lZChQVFlfU0xBVkVfTUFKT1IpCgkgICAgLyogdGhpcyBpcyBmb3IgbGludXggMS4zIGFuZCBuZXdlcjogdXNlIG1ham9yIDMgKi8KCSAgICBpZihtYWpvcmRldiA9PSBQVFlfU0xBVkVfTUFKT1IpCgkJICAgIHJldHVybiAxOwojZW5kaWYKCiNpZiBkZWZpbmVkKFVOSVg5OF9QVFlfU0xBVkVfTUFKT1IpICYmIGRlZmluZWQoVU5JWDk4X1BUWV9NQUpPUl9DT1VOVCkKCSAgICAvKiB0aGlzIGlzIGZvciBsaW51eCAyLjEuMTE2IGFuZCBuZXdlcjogdXNlIG1ham9ycyAxMzYtMTQzICovCgkgICAgaWYobWFqb3JkZXYgPj0gVU5JWDk4X1BUWV9TTEFWRV9NQUpPUiAmJgoJICAgICAgIG1ham9yZGV2IDwgVU5JWDk4X1BUWV9TTEFWRV9NQUpPUiArIFVOSVg5OF9QVFlfTUFKT1JfQ09VTlQpCgkJICAgIHJldHVybiAxOwojZW5kaWYKCiAgICB9CiNlbmRpZgkvKiBfX2xpbnV4X18gKi8KICAgIHJldHVybiAwOwp9CgoKLyogSVB2NCAtLSBwYXR0ZXJuIGlzIHgueC54LngveS55LnkueSAobmV0L21hc2spKi8Kc3RhdGljIGludApobm1hdGNoX2lwNChjb25zdCBjaGFyICpwYXQpCnsKCWludCB4MSwgeDIsIHgzLCB4NCwgeTEsIHkyLCB5MywgeTQ7Cgl1bnNpZ25lZCBsb25nIHAsIG1hc2ssIGE7Cgl1bnNpZ25lZCBjaGFyICpoYTsKCgkvKiBwYXR0ZXJuIGlzIGFuIElQIFFVQUQgYWRkcmVzcyBhbmQgYSBtYXNrIHgueC54LngveS55LnkueSAqLwoJaWYgKHNzY2FuZihwYXQsICIlZC4lZC4lZC4lZC8lZC4lZC4lZC4lZCIsCgkJCSZ4MSwgJngyLCAmeDMsICZ4NCwgJnkxLCAmeTIsICZ5MywgJnk0KSA8IDgpCgkJcmV0dXJuIDA7CgoJcCA9ICgoKHVuc2lnbmVkIGxvbmcpeDE8PDI0KSsoKHVuc2lnbmVkIGxvbmcpeDI8PDE2KQoJICAgICArKCh1bnNpZ25lZCBsb25nKXgzPDw4KSsoKHVuc2lnbmVkIGxvbmcpeDQpKTsKCW1hc2sgPSAoKCh1bnNpZ25lZCBsb25nKXkxPDwyNCkrKCh1bnNpZ25lZCBsb25nKXkyPDwxNikKCQkrKCh1bnNpZ25lZCBsb25nKXkzPDw4KSsoKHVuc2lnbmVkIGxvbmcpeTQpKTsKCglpZiAoaG9zdGFkZHJlc3NbMF0gPT0gMCkKCQlyZXR1cm4gMDsKCgloYSA9ICh1bnNpZ25lZCBjaGFyICopaG9zdGFkZHJlc3M7CglhID0gKCgodW5zaWduZWQgbG9uZyloYVswXTw8MjQpKygodW5zaWduZWQgbG9uZyloYVsxXTw8MTYpCgkgICAgICsoKHVuc2lnbmVkIGxvbmcpaGFbMl08PDgpKygodW5zaWduZWQgbG9uZyloYVszXSkpOwoJcmV0dXJuICgocCAmIG1hc2spID09IChhICYgbWFzaykpOwp9CgovKiBJUHY2IC0tIHBhdHRlcm4gaXMgW2hleDpoZXg6Li4uLl0vbnVtYmVyIChbbmV0XS9tYXNrKSAqLwpzdGF0aWMgaW50CmhubWF0Y2hfaXA2KGNvbnN0IGNoYXIgKnBhdCkKewoJY2hhciAqcGF0bmV0OwoJY2hhciAqcGF0bWFzazsKCXN0cnVjdCBpbjZfYWRkciBhZGRyOwoJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzOwoJc3RydWN0IHNvY2thZGRyX2luNiBuZXQ7CglpbnQgbWFza19sZW4sIGkgPSAwOwoJY2hhciAqcDsKCglpZiAocGF0ID09IE5VTEwgfHwgKnBhdCAhPSAnWycpCgkJcmV0dXJuIDA7CgoJbWVtY3B5KCZhZGRyLCBob3N0YWRkcmVzcywgc2l6ZW9mKGFkZHIpKTsKCgltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKCWhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OwoJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKCWhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX05VTUVSSUNIT1NUOwoKCXBhdG5ldCA9IHN0cmR1cChwYXQpOwoKCS8qIG1hdGNoIElQdjYgYWRkcmVzcyBhZ2FpbnN0IFtuZXRudW1iZXJdL3ByZWZpeGxlbiAqLwoJaWYgKCEocCA9IHN0cmNocihwYXRuZXQsICddJykpKQoJCWdvdG8gbWlzbWF0Y2g7CgoJKnArKyA9ICdcMCc7CgoJaWYgKCEgKCpwID09ICcvJyAmJiBpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqKHAgKyAxKSkpKQoJCWdvdG8gbWlzbWF0Y2g7CgoJcGF0bWFzayA9IHAgKyAxOwoKCS8qIHByZXBhcmUgbmV0IGFkZHJlc3MgKi8KCWlmIChnZXRhZGRyaW5mbyhwYXRuZXQgKyAxLCBOVUxMLCAmaGludHMsICZyZXMpICE9IDApCgkJZ290byBtaXNtYXRjaDsKCgltZW1jcHkoJm5ldCwgcmVzLT5haV9hZGRyLCBzaXplb2YobmV0KSk7CglmcmVlYWRkcmluZm8ocmVzKTsKCgkvKiBjb252ZXJ0IG1hc2sgdG8gbnVtYmVyICovCglpZiAoKG1hc2tfbGVuID0gYXRvaShwYXRtYXNrKSkgPCAwIHx8IG1hc2tfbGVuID4gMTI4KQoJCWdvdG8gbWlzbWF0Y2g7CgoJLyogY29tcGFyZSAqLwoJd2hpbGUgKG1hc2tfbGVuID4gMCkgewoJCWlmIChtYXNrX2xlbiA8IDMyKSB7CgkJCXVfaW50MzJfdCBtYXNrID0gaHRvbmwofigweGZmZmZmZmZmID4+IG1hc2tfbGVuKSk7CgoJCQlpZiAoKCoodV9pbnQzMl90ICopJmFkZHIuczZfYWRkcltpXSAmIG1hc2spICE9CgkJCSAgICAoKih1X2ludDMyX3QgKikmbmV0LnNpbjZfYWRkci5zNl9hZGRyW2ldICYgbWFzaykpCgkJCQlnb3RvIG1pc21hdGNoOwoJCQlicmVhazsKCQl9CgkJaWYgKCoodV9pbnQzMl90ICopJmFkZHIuczZfYWRkcltpXSAhPQoJCSAgICAqKHVfaW50MzJfdCAqKSZuZXQuc2luNl9hZGRyLnM2X2FkZHJbaV0pCgkJCWdvdG8gbWlzbWF0Y2g7CgkJaSArPSA0OwoJCW1hc2tfbGVuIC09IDMyOwoJfQoKCWZyZWUocGF0bmV0KTsKCXJldHVybiAxOwoKbWlzbWF0Y2g6CglmcmVlKHBhdG5ldCk7CglyZXR1cm4gMDsKfQoKLyogbWF0Y2ggdGhlIGhvc3RuYW1lIGhuIGFnYWluc3QgdGhlIHBhdHRlcm4gcGF0ICovCnN0YXRpYyBpbnQKaG5tYXRjaChjb25zdCBjaGFyICpobiwgY29uc3QgY2hhciAqcGF0KQp7CgoJaWYgKChobiA9PSBOVUxMKSAmJiAoc3RyY21wKHBhdCwgImxvY2FsaG9zdCIpID09IDApKQoJCXJldHVybiAxOwoJaWYgKChobiA9PSBOVUxMKSB8fCAqaG4gPT0gJ1wwJykKCQlyZXR1cm4gMDsKCglpZiAoKnBhdCA+PSAnMCcgJiYgKnBhdCA8PSAnOScpCgkJcmV0dXJuIGhvc3RmYW1pbHkgPT0gQUZfSU5FVCA/IGhubWF0Y2hfaXA0KHBhdCkgOiAwOwoJZWxzZSBpZiAoKnBhdCA9PSAnWycpCgkJcmV0dXJuIGhvc3RmYW1pbHkgPT0gQUZfSU5FVDYgPyBobm1hdGNoX2lwNihwYXQpIDogMDsKCWVsc2UgewoJCS8qIHBhdHRlcm4gaXMgYSBzdWZmaXggb2YgYSBGUUROICovCgkJaW50IAluID0gc3RybGVuKHBhdCksCgkJCW0gPSBzdHJsZW4oaG4pOwoKCQlpZiAobiA+IG0pCgkJCXJldHVybiAwOwoJCXJldHVybiAoc3RyY2FzZWNtcChwYXQsIGhuICsgbSAtIG4pID09IDApOwoJfQp9CgojaWZkZWYgTUFJTl9URVNUX0NIRUNLVFRZCgpjaGFyCWhvc3RhZGRyZXNzWzE2XTsKc2FfZmFtaWx5X3QgaG9zdGZhbWlseTsKY2hhcgkqaG9zdG5hbWU7CnZvaWQJc2xlZXBleGl0KGludCBldmFsKSB7fQkJLyogZHVtbXkgZm9yIHRoaXMgdGVzdCAqLwp2b2lkCWJhZGxvZ2luKGNvbnN0IGNoYXIgKnMpIHt9CS8qIGR1bW15IGZvciB0aGlzIHRlc3QgKi8KCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqaW5mbyA9IE5VTEw7CglzdHJ1Y3QgYWRkcmV4cCB7CgkJY29uc3QgY2hhciAqcmFuZ2U7CgkJY29uc3QgY2hhciAqaXA7Cgl9IGFsaXN0W10gPSB7CgkJeyAiMTMwLjIyNS4xNi4wLzI1NS4yNTUuMjU0LjAiLAkiMTMwLjIyNS4xNi4xIiB9LAoJCXsgIjEzMC4yMjUuMTYuMC8yNTUuMjU1LjI1NC4wIiwJIjEwLjIwLjMwLjEiIH0sCgkJeyAiMTMwLjIyNS4wLjAvMjU1LjI1NC4wLjAiLAkiMTMwLjIyNS4xNi4xIiB9LAoJCXsgIjEzMC4yMjUuMC4wLzI1NS4yNTQuMC4wIiwJIjEzMC4yMjUuMTcuMSIgfSwKCQl7ICIxMzAuMjI1LjAuMC8yNTUuMjU0LjAuMCIsCSIxNTAuMTYwLjE3MC4xODAiIH0sCgkJeyAiWzNmZmU6NTA1OjI6MTo6XS82NCIsCSIzZmZlOjUwNToyOjE6OiIgfSwKCQl7ICJbM2ZmZTo1MDU6MjoxOjpdLzY0IiwJIjNmZmU6NTA1OjI6Mjo6IiB9LAoJCXsgIlszZmZlOjUwNToyOjE6Ol0vNjQiLAkiM2ZmZTo1MDU6MjoxOmZmZmY6ZmZmZjo6IiB9LAoJCXsgTlVMTCwgTlVMTCB9Cgl9LCAqaXRlbTsKCgltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKCWhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKCWhpbnRzLmFpX2ZsYWdzID0gQUlfTlVNRVJJQ0hPU1QgfCAgQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7CgloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwoKCWZvciAoaXRlbSA9IGFsaXN0OyBpdGVtLT5yYW5nZTsgaXRlbSsrKSB7CgoJCXByaW50ZigiaG5tYXRjaCgpIG9uICUtMzBzIDwtLSAlLTE1czogIiwgaXRlbS0+cmFuZ2UsIGl0ZW0tPmlwKTsKCgkJaWYgKGdldGFkZHJpbmZvKGl0ZW0tPmlwLCBOVUxMLCAmaGludHMsICZpbmZvKT09MCAmJiBpbmZvKSB7CgkJCWlmIChpbmZvLT5haV9mYW1pbHkgPT0gQUZfSU5FVCkJewoJCQkgICAgc3RydWN0IHNvY2thZGRyX2luICpzYSA9CgkJCQkgICAgCShzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgaW5mby0+YWlfYWRkcjsKCQkJICAgIG1lbWNweShob3N0YWRkcmVzcywgJihzYS0+c2luX2FkZHIpLAoJCQkJCXNpemVvZihzYS0+c2luX2FkZHIpKTsKCQkJfQoJCQllbHNlIGlmIChpbmZvLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKCQkJICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNhID0KCQkJCSAgICAJKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgaW5mby0+YWlfYWRkcjsKCQkJICAgIG1lbWNweShob3N0YWRkcmVzcywgJihzYS0+c2luNl9hZGRyKSwKCQkJCQlzaXplb2Yoc2EtPnNpbjZfYWRkcikpOwoJCQl9CgkJCWhvc3RmYW1pbHkgPSBpbmZvLT5haV9mYW1pbHk7CgkJCWZyZWVhZGRyaW5mbyhpbmZvKTsKCQkJcHJpbnRmKCIlc1xuIiwgaG5tYXRjaCgiZHVtbXkiLCBpdGVtLT5yYW5nZSkgPwoJCQkJCQkibWF0Y2giIDogIm1pc21hdGNoIik7CgkJfQoJCWVsc2UKCQkJcHJpbnRmKCJnZXRhZGRyaW5mbygpIGZhaWxlZFxuIik7CgoJfQoJcmV0dXJuIDA7Cn0KI2VuZGlmIC8qIE1BSU5fVEVTVF9DSEVDS1RUWSAqLwoKc3RhdGljIGNoYXIgKndkYXlzW10gPSB7ICJzdW4iLCAibW9uIiwgInR1ZSIsICJ3ZWQiLCAidGh1IiwgImZyaSIsICJzYXQiIH07CgovKiBleGFtcGxlIHRpbWVzcGVjczoKCiAgIG1vbjp0dWU6d2VkOjgtMTcKCiAgIG1lYW5pbmcgbW9uZGF5LCB0dWVzZGF5IG9yIHdlZG5lc2RheSBiZXR3ZWVuIDg6MDAgYW5kIDE3OjU5CgogICA0OjU6MTM6ZnJpCgogICBtZWFuaW5nIGZyaWRheXMgZnJvbSA0OjAwIHRvIDU6NTkgYW5kIGZyb20gMTM6MDAgdG8gMTM6NTkKKi8Kc3RhdGljIGludAp0aW1lb2soc3RydWN0IHRtICp0LCBjaGFyICpzcGVjKQp7CiAgICBjaGFyICpwLCAqcTsKICAgIGludCBkYXlvayA9IDA7CiAgICBpbnQgaG91cm9rID0gMDsKICAgIGludCBoLCBoMjsKICAgIGNoYXIgKnNwOwoKICAgIHNwID0gc3BlYzsKICAgIHdoaWxlICgocCA9IHN0cnNlcCgmc3AsICI6IikpKSB7CglpZiAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykgewoJICAgIGggPSBhdG9pKHApOwoJICAgIGlmIChoID09IHQtPnRtX2hvdXIpIGhvdXJvayA9IDE7CgkgICAgaWYgKChxID0gc3RyY2hyKHAsICctJykpICYmIChxWzFdID49ICcwJyAmJiBxWzFdIDw9ICc5JykpIHsKCQloMiA9IGF0b2kocSsxKTsKCQlpZiAoaCA8PSB0LT50bV9ob3VyICYmIHQtPnRtX2hvdXIgPD0gaDIpIGhvdXJvayA9IDE7CgkgICAgfQoJfSBlbHNlIGlmIChzdHJjYXNlY21wKHdkYXlzW3QtPnRtX3dkYXldLCBwKSA9PSAwKSB7CgkgICAgZGF5b2sgPSAxOwoJfQogICAgfQoKICAgIHJldHVybiAoZGF5b2sgJiYgaG91cm9rKTsKfQoKLyogcmV0dXJuIHRydWUgaWYgdHR5IGVxdWFscyBjbGFzcyBvciBpcyBpbiB0aGUgY2xhc3MgZGVmaW5lZCBieSBjbGFzcy4KICAgQWxzbyByZXR1cm4gdHJ1ZSBpZiBob3N0bmFtZSBtYXRjaGVzIHRoZSBob3N0bmFtZSBwYXR0ZXJuLCBjbGFzcwogICBvciBhIHBhdHRlcm4gaW4gdGhlIGNsYXNzIG5hbWVkIGJ5IGNsYXNzLiAqLwpzdGF0aWMgaW50CmluX2NsYXNzKGNvbnN0IGNoYXIgKnR0eSwgY2hhciAqY2xhc3MpCnsKICAgIHN0cnVjdCB0dHljbGFzcyAqdGM7CiAgICBzdHJ1Y3QgZ3JwbGlzdCAqZ2U7CiAgICB0aW1lX3QgdDsKICAgIGNoYXIgKnA7CiAgICBjaGFyIHRpbWVzcGVjWzI1Nl07CiAgICBzdHJ1Y3QgdG0gKnRtOwogICAgY2hhciAqbjsKCiAgICB0aW1lKCZ0KTsKICAgIHRtID0gbG9jYWx0aW1lKCZ0KTsKCiAgICBpZiAoY2xhc3NbMF0gPT0gJ1snKSB7CglpZiAoKHAgPSBzdHJjaHIoY2xhc3MsICddJykpKSB7CgkgICAgKnAgPSAwOwoJICAgIHhzdHJuY3B5KHRpbWVzcGVjLCBjbGFzcysxLCBzaXplb2YodGltZXNwZWMpKTsKCSAgICAqcCA9ICddJzsKCSAgICBpZighdGltZW9rKHRtLCB0aW1lc3BlYykpIHJldHVybiAwOwoJICAgIGNsYXNzID0gcCsxOwoJfQoJLyogcmVhbGx5IG91Z2h0IHRvIHdhcm4gYWJvdXQgc3ludGF4IGVycm9yICovCiAgICB9CgogICAgaWYgKHN0cmNtcCh0dHksIGNsYXNzKSA9PSAwKSByZXR1cm4gMTsKCiAgICBpZiAoKGNsYXNzWzBdID09ICdAJykgJiYgaXNhcHR5KHR0eSkKCSYmIGhubWF0Y2goaG9zdG5hbWUsIGNsYXNzKzEpKSByZXR1cm4gMTsKCiAgICBmb3IgKHRjID0gdHR5Y2xhc3NlczsgdGM7IHRjID0gdGMtPm5leHQpIHsKCWlmIChzdHJjbXAodGMtPmNsYXNzbmFtZSwgY2xhc3MpID09IDApIHsKCSAgICBmb3IgKGdlID0gdGMtPmZpcnN0OyBnZTsgZ2UgPSBnZS0+bmV4dCkgewoKCQluID0gZ2UtPm5hbWU7CgkJaWYgKG5bMF0gPT0gJ1snKSB7CgkJICAgIGlmICgocCA9IHN0cmNocihuLCAnXScpKSkgewoJCQkqcCA9IDA7CgkJCXhzdHJuY3B5KHRpbWVzcGVjLCBuKzEsIHNpemVvZih0aW1lc3BlYykpOwoJCQkqcCA9ICddJzsKCQkJaWYoIXRpbWVvayh0bSwgdGltZXNwZWMpKSBjb250aW51ZTsKCQkJbiA9IHArMTsKCQkgICAgfQoJCSAgICAvKiByZWFsbHkgb3VnaHQgdG8gd2FybiBhYm91dCBzeW50YXggZXJyb3IgKi8KCQl9CgoJCWlmIChzdHJjbXAobiwgdHR5KSA9PSAwKSByZXR1cm4gMTsKCgkJaWYgKChuWzBdID09ICdAJykgJiYgaXNhcHR5KHR0eSkKCQkgICAgJiYgaG5tYXRjaChob3N0bmFtZSwgbisxKSkgcmV0dXJuIDE7CgkgICAgfQoJICAgIHJldHVybiAwOwoJfQogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qIHN0YXJ0IEpEUyAtIFNCQSAqLwpzdGF0aWMgdm9pZCAKZnJlZV9ncm91cChzdHJ1Y3QgZ3JwbGlzdCAqZ2UpCnsKICAgIGlmIChnZSkgewoJbWVtc2V0KGdlLT5uYW1lLCAwLCBOQU1FTEVOKTsKCWZyZWVfZ3JvdXAoZ2UtPm5leHQpOwoJZnJlZShnZS0+bmV4dCk7CglnZS0+bmV4dCA9IE5VTEw7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIApmcmVlX2NsYXNzKHN0cnVjdCB0dHljbGFzcyAqdGMpCnsKICAgIGlmICh0YykgewoJbWVtc2V0KHRjLT5jbGFzc25hbWUsIDAsIENMQVNTTkFNRUxFTik7CglmcmVlX2dyb3VwKHRjLT5maXJzdCk7Cgl0Yy0+Zmlyc3QgPSBOVUxMOwoJZnJlZV9jbGFzcyh0Yy0+bmV4dCk7CglmcmVlKHRjLT5uZXh0KTsKCXRjLT5uZXh0ID0gTlVMTDsKICAgIH0KfQoKc3RhdGljIHZvaWQgCmZyZWVfYWxsKHZvaWQpCnsKICAgIGZyZWVfY2xhc3ModHR5Y2xhc3Nlcyk7CiAgICB0dHljbGFzc2VzID0gTlVMTDsKfQovKiBlbmQgSkRTIC0gU0JBICovCgp2b2lkCmNoZWNrdHR5KGNvbnN0IGNoYXIgKnVzZXIsIGNvbnN0IGNoYXIgKnR0eSwgc3RydWN0IHBhc3N3ZCAqcHdkKQp7CiAgICBGSUxFICpmOwogICAgY2hhciBidWZbMjU2XSwgZGVmYXVsdGJ1ZlsyNTZdOwogICAgY2hhciAqcHRyOwogICAgZW51bSBTdGF0ZSBzdGF0ZSA9IFN0YXRlVXNlcnM7CiAgICBpbnQgZm91bmRfbWF0Y2ggPSAwOwoKICAgIC8qIG5vIC9ldGMvdXNlcnR0eSwgZGVmYXVsdCB0byBhbGxvdyBhY2Nlc3MgKi8KICAgIGlmICghKGYgPSBmb3BlbihfUEFUSF9VU0VSVFRZLCAiciIpKSkgcmV0dXJuOwoKICAgIGlmIChwd2QgPT0gTlVMTCkgewoJZmNsb3NlKGYpOwoJcmV0dXJuOyAgLyogbWlzc3BlbGxlZCB1c2VybmFtZSBoYW5kbGVkIGVsc2V3aGVyZSAqLwogICAgfQoKICAgIGZpbmRfZ3JvdXBzKHB3ZC0+cHdfZ2lkLCB1c2VyKTsKCiAgICBkZWZhdWx0YnVmWzBdID0gMDsKICAgIHdoaWxlKGZnZXRzKGJ1ZiwgMjU1LCBmKSkgewoKCS8qIHN0cmlwIGNvbW1lbnRzICovCglmb3IocHRyID0gYnVmOyBwdHIgPCBidWYgKyAyNTY7IHB0cisrKSAKCSAgaWYoKnB0ciA9PSAnIycpICpwdHIgPSAwOwoKCWlmIChidWZbMF0gPT0gJyonKSB7CgkgICAgeHN0cm5jcHkoZGVmYXVsdGJ1ZiwgYnVmLCAyNTYpOwoJICAgIGNvbnRpbnVlOwoJfQoKCWlmIChzdHJuY21wKCJHUk9VUFMiLCBidWYsIDYpID09IDApIHsKCSAgICBzdGF0ZSA9IFN0YXRlR3JvdXBzOwoJICAgIGNvbnRpbnVlOwoJfSBlbHNlIGlmIChzdHJuY21wKCJVU0VSUyIsIGJ1ZiwgNSkgPT0gMCkgewoJICAgIHN0YXRlID0gU3RhdGVVc2VyczsKCSAgICBjb250aW51ZTsKCX0gZWxzZSBpZiAoc3RybmNtcCgiQ0xBU1NFUyIsIGJ1ZiwgNykgPT0gMCkgewoJICAgIHN0YXRlID0gU3RhdGVDbGFzc2VzOwoJICAgIGNvbnRpbnVlOwoJfQoKCXN0cnRvayhidWYsICIgXHQiKTsKCWlmKChzdGF0ZSA9PSBTdGF0ZVVzZXJzICYmIChzdHJuY21wKHVzZXIsIGJ1ZiwgOCkgPT0gMCkpCgkgICB8fCAoc3RhdGUgPT0gU3RhdGVHcm91cHMgJiYgYW1faW5fZ3JvdXAoYnVmKSkpIHsKCSAgICBmb3VuZF9tYXRjaCA9IDE7ICAvKiB3ZSBmb3VuZCBhIGxpbmUgbWF0Y2hpbmcgdGhlIHVzZXIgKi8KCSAgICB3aGlsZSgocHRyID0gc3RydG9rKE5VTEwsICJcdFxuICIpKSkgewoJCWlmIChpbl9jbGFzcyh0dHksIHB0cikpIHsKCQkgICAgZmNsb3NlKGYpOwoJCSAgICBmcmVlX2FsbCgpOyAvKiBKRFMgKi8KCQkgICAgcmV0dXJuOwoJCX0KCSAgICB9Cgl9IGVsc2UgaWYgKHN0YXRlID09IFN0YXRlQ2xhc3NlcykgewoJICAgIC8qIGRlZmluZSBhIG5ldyB0dHkvaG9zdCBjbGFzcyAqLwoJICAgIHN0cnVjdCB0dHljbGFzcyAqdGMgPSBuZXdfY2xhc3MoYnVmKTsKCgkgICAgd2hpbGUgKChwdHIgPSBzdHJ0b2soTlVMTCwgIlx0XG4gIikpKSB7CgkJYWRkX3RvX2NsYXNzKHRjLCBwdHIpOwoJICAgIH0KCX0KICAgIH0KICAgIGZjbG9zZShmKTsKCiAgICAvKiB1c2VyIGlzIG5vdCBleHBsaWNpdGx5IG1lbnRpb25lZCBpbiAvZXRjL3VzZXJ0dHksIGlmIHRoZXJlIHdhcwogICAgICAgYSBkZWZhdWx0IHJ1bGUsIHVzZSB0aGF0ICovCiAgICBpZiAoZGVmYXVsdGJ1ZlswXSkgewoJc3RydG9rKGRlZmF1bHRidWYsICIgXHQiKTsKCXdoaWxlKChwdHIgPSBzdHJ0b2soTlVMTCwgIlx0XG4gIikpKSB7CgkgICAgaWYgKGluX2NsYXNzKHR0eSwgcHRyKSkgewoJCWZyZWVfYWxsKCk7IC8qIEpEUyAqLwoJCXJldHVybjsKCSAgICB9Cgl9CgoJLyogdGhlcmUgd2FzIGEgZGVmYXVsdCBydWxlLCBidXQgdXNlciBkaWRuJ3QgbWF0Y2gsIHJlamVjdCEgKi8KCXByaW50ZihfKCJMb2dpbiBvbiAlcyBmcm9tICVzIGRlbmllZCBieSBkZWZhdWx0LlxuIiksIHR0eSwgaG9zdG5hbWUpOwoJYmFkbG9naW4odXNlcik7CglzbGVlcGV4aXQoMSk7CiAgICB9CgogICAgaWYgKGZvdW5kX21hdGNoKSB7CgkvKiBpZiB3ZSBnZXQgaGVyZSwgL2V0Yy91c2VydHR5IGV4aXN0cywgdGhlcmUncyBhIGxpbmUKCSAgIG1hdGNoaW5nIG91ciB1c2VybmFtZSwgYnV0IGl0IGRvZXNuJ3QgY29udGFpbiB0aGUKCSAgIG5hbWUgb2YgdGhlIHR0eSB3aGVyZSB0aGUgdXNlciBpcyB0cnlpbmcgdG8gbG9nIGluLgoJICAgU28gZGVueSBhY2Nlc3MhICovCgoJcHJpbnRmKF8oIkxvZ2luIG9uICVzIGZyb20gJXMgZGVuaWVkLlxuIiksIHR0eSwgaG9zdG5hbWUpOwoJYmFkbG9naW4odXNlcik7CglzbGVlcGV4aXQoMSk7CiAgICB9CgogICAgLyogdXNlcnMgbm90IG1hdGNoZWQgaW4gL2V0Yy91c2VydHR5IGFyZSBieSBkZWZhdWx0IGFsbG93ZWQgYWNjZXNzCiAgICAgICBvbiBhbGwgdHR5J3MgKi8KICAgIGZyZWVfYWxsKCk7IC8qIEpEUyAqLwp9Cg==