ZGlmZiAtLWdpdCBhL2FkYi9hZGIuYyBiL2FkYi9hZGIuYwppbmRleCBkOWY5NmRmLi4wZGE3MjE4IDEwMDY0NAotLS0gYS9hZGIvYWRiLmMKKysrIGIvYWRiL2FkYi5jCkBAIC0zMDIsOCArMzAyLDEwIEBACiB7CiAgICAgYXNvY2tldCAqczsKIAotICAgIEQoImhhbmRsZV9wYWNrZXQoKSAlZFxuIiwgcC0+bXNnLmNvbW1hbmQpOwotCisgICAgRCgiaGFuZGxlX3BhY2tldCgpICVjJWMlYyVjXG4iLCAoKGNoYXIqKSAoJihwLT5tc2cuY29tbWFuZCkpKVswXSwKKyAgICAgICAgICAgICgoY2hhciopICgmKHAtPm1zZy5jb21tYW5kKSkpWzFdLAorICAgICAgICAgICAgKChjaGFyKikgKCYocC0+bXNnLmNvbW1hbmQpKSlbMl0sCisgICAgICAgICAgICAoKGNoYXIqKSAoJihwLT5tc2cuY29tbWFuZCkpKVszXSk7CiAgICAgcHJpbnRfcGFja2V0KCJyZWN2IiwgcCk7CiAKICAgICBzd2l0Y2gocC0+bXNnLmNvbW1hbmQpewpkaWZmIC0tZ2l0IGEvYWRiL2pkd3Bfc2VydmljZS5jIGIvYWRiL2pkd3Bfc2VydmljZS5jCmluZGV4IDBjMjZmN2IuLjI5NmY3MTggMTAwNjQ0Ci0tLSBhL2FkYi9qZHdwX3NlcnZpY2UuYworKysgYi9hZGIvamR3cF9zZXJ2aWNlLmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAvKiBoZXJlJ3MgaG93IHRoZXNlIHRoaW5ncyB3b3JrLgogCkBAIC0zMjAsNiArMzIxLDcgQEAKICAgICAgICAgICAgIHN0cnVjdCBpb3ZlYyAgICAgaW92OwogICAgICAgICAgICAgY2hhciAgICAgICAgICAgICBkdW1teSA9ICchJzsKICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgYnVmZmVyW3NpemVvZihzdHJ1Y3QgY21zZ2hkcikgKyBzaXplb2YoaW50KV07CisgICAgICAgICAgICBpbnQgZmxhZ3M7CiAKICAgICAgICAgICAgIGlvdi5pb3ZfYmFzZSAgICAgICA9ICZkdW1teTsKICAgICAgICAgICAgIGlvdi5pb3ZfbGVuICAgICAgICA9IDE7CkBAIC0zMzcsMTAgKzMzOSwyNyBAQAogICAgICAgICAgICAgY21zZy0+Y21zZ190eXBlICA9IFNDTV9SSUdIVFM7CiAgICAgICAgICAgICAoKGludCopQ01TR19EQVRBKGNtc2cpKVswXSA9IGZkOwogCisgICAgICAgICAgICBmbGFncyA9IGZjbnRsKHByb2MtPnNvY2tldCxGX0dFVEZMLDApOworCisgICAgICAgICAgICBpZiAoZmxhZ3MgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBEKCJmYWlsZWQgdG8gZ2V0IGNudGwgZmxhZ3MgZm9yIHNvY2tldCAlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICBwcm9jLT5waWQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgZ290byBDbG9zZVByb2Nlc3M7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZjbnRsKHByb2MtPnNvY2tldCwgRl9TRVRGTCwgZmxhZ3MgJiB+T19OT05CTE9DSykgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBEKCJmYWlsZWQgdG8gcmVtb3ZlIE9fTk9OQkxPQ0sgZmxhZyBmb3Igc29ja2V0ICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIHByb2MtPnBpZCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBnb3RvIENsb3NlUHJvY2VzczsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgIHJldCA9IHNlbmRtc2cocHJvYy0+c29ja2V0LCAmbXNnLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkYl9jbG9zZShmZCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIEQoInNlbmRpbmcgbmV3IGZpbGUgZGVzY3JpcHRvciB0byBKRFdQICVkIGZhaWxlZDogJXNcbiIsCkBAIC0zNTQsNiArMzczLDEyIEBACiAgICAgICAgICAgICBmb3IgKG4gPSAxOyBuIDwgcHJvYy0+b3V0X2NvdW50OyBuKyspCiAgICAgICAgICAgICAgICAgcHJvYy0+b3V0X2Zkc1tuLTFdID0gcHJvYy0+b3V0X2Zkc1tuXTsKIAorICAgICAgICAgICAgaWYgKGZjbnRsKHByb2MtPnNvY2tldCwgRl9TRVRGTCwgZmxhZ3MpID09IC0xKSB7CisgICAgICAgICAgICAgICAgRCgiZmFpbGVkIHRvIHNldCBPX05PTkJMT0NLIGZsYWcgZm9yIHNvY2tldCAlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICBwcm9jLT5waWQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgZ290byBDbG9zZVByb2Nlc3M7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmICgtLXByb2MtPm91dF9jb3VudCA9PSAwKQogICAgICAgICAgICAgICAgIGZkZXZlbnRfZGVsKCBwcm9jLT5mZGUsIEZERV9XUklURSApOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9hZGIvc29ja2V0cy5jIGIvYWRiL3NvY2tldHMuYwppbmRleCA5ZjFiNTk4Li40MzkyNWU0IDEwMDY0NAotLS0gYS9hZGIvc29ja2V0cy5jCisrKyBiL2FkYi9zb2NrZXRzLmMKQEAgLTY1LDggKzY1LDExIEBACiAgICAgYXNvY2tldCAqcmVzdWx0ID0gTlVMTDsKIAogICAgIGFkYl9tdXRleF9sb2NrKCZzb2NrZXRfbGlzdF9sb2NrKTsKLSAgICBmb3IocyA9IGxvY2FsX3NvY2tldF9saXN0Lm5leHQ7IHMgIT0gJmxvY2FsX3NvY2tldF9saXN0ICYmICFyZXN1bHQ7IHMgPSBzLT5uZXh0KSB7Ci0gICAgICAgIGlmKHMtPmlkID09IGlkKSByZXN1bHQgPSBzOworICAgIGZvciAocyA9IGxvY2FsX3NvY2tldF9saXN0Lm5leHQ7IHMgIT0gJmxvY2FsX3NvY2tldF9saXN0OyBzID0gcy0+bmV4dCkgeworICAgICAgICBpZiAocy0+aWQgPT0gaWQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KICAgICBhZGJfbXV0ZXhfdW5sb2NrKCZzb2NrZXRfbGlzdF9sb2NrKTsKIApAQCAtMzY2LDcgKzM2OSw3IEBACiBhc29ja2V0ICpjcmVhdGVfbG9jYWxfc29ja2V0KGludCBmZCkKIHsKICAgICBhc29ja2V0ICpzID0gY2FsbG9jKDEsIHNpemVvZihhc29ja2V0KSk7Ci0gICAgaWYocyA9PSAwKSBmYXRhbCgiY2Fubm90IGFsbG9jYXRlIHNvY2tldCIpOworICAgIGlmIChzID09IE5VTEwpIGZhdGFsKCJjYW5ub3QgYWxsb2NhdGUgc29ja2V0Iik7CiAgICAgaW5zdGFsbF9sb2NhbF9zb2NrZXQocyk7CiAgICAgcy0+ZmQgPSBmZDsKICAgICBzLT5lbnF1ZXVlID0gbG9jYWxfc29ja2V0X2VucXVldWU7CkBAIC00ODIsNyArNDg1LDcgQEAKICAgICBhc29ja2V0ICpzID0gY2FsbG9jKDEsIHNpemVvZihhcmVtb3Rlc29ja2V0KSk7CiAgICAgYWRpc2Nvbm5lY3QqICBkaXMgPSAmKChhcmVtb3Rlc29ja2V0KilzKS0+ZGlzY29ubmVjdDsKIAotICAgIGlmKHMgPT0gMCkgZmF0YWwoImNhbm5vdCBhbGxvY2F0ZSBzb2NrZXQiKTsKKyAgICBpZiAocyA9PSBOVUxMKSBmYXRhbCgiY2Fubm90IGFsbG9jYXRlIHNvY2tldCIpOwogICAgIHMtPmlkID0gaWQ7CiAgICAgcy0+ZW5xdWV1ZSA9IHJlbW90ZV9zb2NrZXRfZW5xdWV1ZTsKICAgICBzLT5yZWFkeSA9IHJlbW90ZV9zb2NrZXRfcmVhZHk7CkBAIC03NjEsOCArNzY0LDcgQEAKIHsKICAgICBEKCJDcmVhdGluZyBzbWFydCBzb2NrZXQgXG4iKTsKICAgICBhc29ja2V0ICpzID0gY2FsbG9jKDEsIHNpemVvZihhc29ja2V0KSk7Ci0gICAgaWYocyA9PSAwKSBmYXRhbCgiY2Fubm90IGFsbG9jYXRlIHNvY2tldCIpOwotICAgIHMtPmlkID0gMDsKKyAgICBpZiAocyA9PSBOVUxMKSBmYXRhbCgiY2Fubm90IGFsbG9jYXRlIHNvY2tldCIpOwogICAgIHMtPmVucXVldWUgPSBzbWFydF9zb2NrZXRfZW5xdWV1ZTsKICAgICBzLT5yZWFkeSA9IHNtYXJ0X3NvY2tldF9yZWFkeTsKICAgICBzLT5jbG9zZSA9IHNtYXJ0X3NvY2tldF9jbG9zZTsKZGlmZiAtLWdpdCBhL2FkYi91c2JfdmVuZG9ycy5jIGIvYWRiL3VzYl92ZW5kb3JzLmMKaW5kZXggN2NiZDc0MS4uZWZlYjJhMCAxMDA2NDQKLS0tIGEvYWRiL3VzYl92ZW5kb3JzLmMKKysrIGIvYWRiL3VzYl92ZW5kb3JzLmMKQEAgLTY5LDYgKzY5LDggQEAKICNkZWZpbmUgVkVORE9SX0lEX1BBTlRFQ0ggICAgICAgMHgxMEE5CiAvLyBRdWFsY29tbSdzIFVTQiBWZW5kb3IgSUQKICNkZWZpbmUgVkVORE9SX0lEX1FVQUxDT01NICAgICAgMHgwNWM2CisvLyBPbi1UaGUtR28tVmlkZW8ncyBVU0IgVmVuZG9yIElECisjZGVmaW5lIFZFTkRPUl9JRF9PVEdWICAgICAgICAgIDB4MjI1NwogLy8gTkVDJ3MgVVNCIFZlbmRvciBJRAogI2RlZmluZSBWRU5ET1JfSURfTkVDICAgICAgICAgICAweDA0MDkKIC8vIFBhbmFzb25pYyBNb2JpbGUgQ29tbXVuaWNhdGlvbidzIFVTQiBWZW5kb3IgSUQKQEAgLTk2LDYgKzk4LDcgQEAKICAgICBWRU5ET1JfSURfS1lPQ0VSQSwKICAgICBWRU5ET1JfSURfUEFOVEVDSCwKICAgICBWRU5ET1JfSURfUVVBTENPTU0sCisgICAgVkVORE9SX0lEX09UR1YsCiAgICAgVkVORE9SX0lEX05FQywKICAgICBWRU5ET1JfSURfUE1DLAogICAgIFZFTkRPUl9JRF9UT1NISUJBLApAQCAtMTYwLDcgKzE2Myw3IEBACiAvKiBidWlsZHMgdGhlIHBhdGggdG8gdGhlIGFkYiB2ZW5kb3IgaWQgZmlsZS4gcmV0dXJucyAwIGlmIHN1Y2Nlc3MgKi8KIGludCBidWlsZF9wYXRoKGNoYXIqIGJ1ZmYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIqIGZvcm1hdCwgY29uc3QgY2hhciogaG9tZSkKIHsKLSAgICBpZiAoc25wcmludGYoYnVmZiwgbGVuLCBmb3JtYXQsIGhvbWUsIEFORFJPSURfUEFUSCwgQU5EUk9JRF9BREJfSU5JKSA+PSBsZW4pIHsKKyAgICBpZiAoc25wcmludGYoYnVmZiwgbGVuLCBmb3JtYXQsIGhvbWUsIEFORFJPSURfUEFUSCwgQU5EUk9JRF9BREJfSU5JKSA+PSAoc2lnbmVkKWxlbikgewogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9BbmRyb2lkLm1rIGIvZGVidWdnZXJkL0FuZHJvaWQubWsKaW5kZXggM2MxY2YwMi4uY2NjMDAxYiAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL0FuZHJvaWQubWsKKysrIGIvZGVidWdnZXJkL0FuZHJvaWQubWsKQEAgLTUsNyArNSw3IEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9TUkNfRklMRVM6PSBkZWJ1Z2dlcmQuYyBnZXRldmVudC5jIHVud2luZC1hcm0uYyBwci1zdXBwb3J0LmMgdXRpbGl0eS5jCitMT0NBTF9TUkNfRklMRVM6PSBkZWJ1Z2dlcmQuYyBnZXRldmVudC5jIHVud2luZC1hcm0uYyBwci1zdXBwb3J0LmMgdXRpbGl0eS5jIHN5bWJvbF90YWJsZS5jCiBMT0NBTF9DRkxBR1MgOj0gLVdhbGwKIExPQ0FMX01PRFVMRSA6PSBkZWJ1Z2dlcmQKIApkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2RlYnVnZ2VyZC5jIGIvZGVidWdnZXJkL2RlYnVnZ2VyZC5jCmluZGV4IDdjMzYzNjcuLjI0YjdlNzIgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9kZWJ1Z2dlcmQuYworKysgYi9kZWJ1Z2dlcmQvZGVidWdnZXJkLmMKQEAgLTYzLDcgKzYzLDcgQEAKIC8qIExvZyBpbmZvcm1hdGlvbiBvbnRvIHRoZSB0b21ic3RvbmUgKi8KIHZvaWQgX0xPRyhpbnQgdGZkLCBib29sIGluX3RvbWJzdG9uZV9vbmx5LCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLSAgICBjaGFyIGJ1ZlsxMjhdOworICAgIGNoYXIgYnVmWzUxMl07CiAKICAgICB2YV9saXN0IGFwOwogICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwpAQCAtMTA2LDEwICsxMDYsMTEgQEAKIAogICAgIG1pLT5zdGFydCA9IHN0cnRvdWwobGluZSwgMCwgMTYpOwogICAgIG1pLT5lbmQgPSBzdHJ0b3VsKGxpbmUgKyA5LCAwLCAxNik7Ci0gICAgLyogVG8gYmUgZmlsbGVkIGluIHBhcnNlX2V4aWR4X2luZm8gaWYgdGhlIG1hcHBlZCBzZWN0aW9uIHN0YXJ0cyB3aXRoCisgICAgLyogVG8gYmUgZmlsbGVkIGluIHBhcnNlX2VsZl9pbmZvIGlmIHRoZSBtYXBwZWQgc2VjdGlvbiBzdGFydHMgd2l0aAogICAgICAqIGVsZl9oZWFkZXIKICAgICAgKi8KICAgICBtaS0+ZXhpZHhfc3RhcnQgPSBtaS0+ZXhpZHhfZW5kID0gMDsKKyAgICBtaS0+c3ltYm9scyA9IDA7CiAgICAgbWktPm5leHQgPSAwOwogICAgIHN0cmNweShtaS0+bmFtZSwgbGluZSArIDQ5KTsKIApAQCAtMzUzLDcgKzM1NCw3IEBACiAgICAgaWYoc2lnKSBkdW1wX2ZhdWx0X2FkZHIodGZkLCB0aWQsIHNpZyk7CiB9CiAKLXN0YXRpYyB2b2lkIHBhcnNlX2V4aWR4X2luZm8obWFwaW5mbyAqbWlsaXN0LCBwaWRfdCBwaWQpCitzdGF0aWMgdm9pZCBwYXJzZV9lbGZfaW5mbyhtYXBpbmZvICptaWxpc3QsIHBpZF90IHBpZCkKIHsKICAgICBtYXBpbmZvICptaTsKICAgICBmb3IgKG1pID0gbWlsaXN0OyBtaSAhPSBOVUxMOyBtaSA9IG1pLT5uZXh0KSB7CkBAIC0zODMsNiArMzg0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBUcnkgdG8gbG9hZCBzeW1ib2xzIGZyb20gdGhpcyBmaWxlICovCisgICAgICAgICAgICBtaS0+c3ltYm9scyA9IHN5bWJvbF90YWJsZV9jcmVhdGUobWktPm5hbWUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNDIwLDcgKzQyNCw3IEBACiAgICAgICAgIGZjbG9zZShmcCk7CiAgICAgfQogCi0gICAgcGFyc2VfZXhpZHhfaW5mbyhtaWxpc3QsIHRpZCk7CisgICAgcGFyc2VfZWxmX2luZm8obWlsaXN0LCB0aWQpOwogCiAgICAgLyogSWYgc3RhY2sgdW53aW5kZXIgZmFpbHMsIHVzZSB0aGUgZGVmYXVsdCBzb2x1dGlvbiB0byBkdW1wIHRoZSBzdGFjawogICAgICAqIGNvbnRlbnQuCkBAIC00MzksNiArNDQzLDcgQEAKIAogICAgIHdoaWxlKG1pbGlzdCkgewogICAgICAgICBtYXBpbmZvICpuZXh0ID0gbWlsaXN0LT5uZXh0OworICAgICAgICBzeW1ib2xfdGFibGVfZnJlZShtaWxpc3QtPnN5bWJvbHMpOwogICAgICAgICBmcmVlKG1pbGlzdCk7CiAgICAgICAgIG1pbGlzdCA9IG5leHQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3N5bWJvbF90YWJsZS5jIGIvZGVidWdnZXJkL3N5bWJvbF90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MGMwNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQvc3ltYm9sX3RhYmxlLmMKQEAgLTAsMCArMSwxNzggQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgInN5bWJvbF90YWJsZS5oIgorCisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisKKy8vIENvbXBhcmUgZnVuYyBmb3IgcXNvcnQKK3N0YXRpYyBpbnQgcWNvbXBhcihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIHJldHVybiAoKHN0cnVjdCBzeW1ib2wqKWEpLT5hZGRyIC0gKChzdHJ1Y3Qgc3ltYm9sKiliKS0+YWRkcjsKK30KKworLy8gQ29tcGFyZSBmdW5jIGZvciBic2VhcmNoCitzdGF0aWMgaW50IGJjb21wYXIoY29uc3Qgdm9pZCAqYWRkciwgY29uc3Qgdm9pZCAqZWxlbWVudCkKK3sKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2wgPSAoc3RydWN0IHN5bWJvbCopZWxlbWVudDsKKworICAgIGlmKCh1bnNpZ25lZCBpbnQpYWRkciA8IHN5bWJvbC0+YWRkcikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYoKHVuc2lnbmVkIGludClhZGRyIC0gc3ltYm9sLT5hZGRyID49IHN5bWJvbC0+c2l6ZSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqICBDcmVhdGUgYSBzeW1ib2wgdGFibGUgZnJvbSBhIGdpdmVuIGZpbGUKKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZmlsZW5hbWUgLSBGaWxlbmFtZSB0byBwcm9jZXNzCisgKgorICogIFJldHVybnM6CisgKiAgICAgIEEgbmV3bHktYWxsb2NhdGVkIFN5bWJvbFRhYmxlIHN0cnVjdHVyZSwgb3IgTlVMTCBpZiBlcnJvci4KKyAqICAgICAgRnJlZSBzeW1ib2wgdGFibGUgd2l0aCBzeW1ib2xfdGFibGVfZnJlZSgpCisgKi8KK3N0cnVjdCBzeW1ib2xfdGFibGUgKnN5bWJvbF90YWJsZV9jcmVhdGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgc3RydWN0IHN5bWJvbF90YWJsZSAqdGFibGUgPSBOVUxMOworCisgICAgLy8gT3BlbiB0aGUgZmlsZSwgYW5kIG1hcCBpdCBpbnRvIG1lbW9yeQorICAgIHN0cnVjdCBzdGF0IHNiOworICAgIGludCBsZW5ndGg7CisgICAgY2hhciAqYmFzZTsKKworICAgIGludCBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKworICAgIGlmKGZkIDwgMCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBmc3RhdChmZCwgJnNiKTsKKyAgICBsZW5ndGggPSBzYi5zdF9zaXplOworCisgICAgYmFzZSA9IG1tYXAoTlVMTCwgbGVuZ3RoLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisKKyAgICBpZighYmFzZSkgeworICAgICAgICBnb3RvIG91dF9jbG9zZTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSB0aGUgZmlsZSBoZWFkZXIKKyAgICBFbGYzMl9FaGRyICpoZHIgPSAoRWxmMzJfRWhkciopYmFzZTsKKyAgICBFbGYzMl9TaGRyICpzaGRyID0gKEVsZjMyX1NoZHIqKShiYXNlICsgaGRyLT5lX3Nob2ZmKTsKKworICAgIC8vIFNlYXJjaCBmb3IgdGhlIGR5bmFtaWMgc3ltYm9scyBzZWN0aW9uCisgICAgaW50IGR5bnN5bV9pZHggPSAtMTsKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMDsgaSA8IGhkci0+ZV9zaG51bTsgaSsrKSB7CisgICAgICAgIGlmKHNoZHJbaV0uc2hfdHlwZSA9PSBTSFRfRFlOU1lNICkgeworICAgICAgICAgICAgZHluc3ltX2lkeCA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihkeW5zeW1faWR4ID09IC0xKSB7CisgICAgICAgIGdvdG8gb3V0X3VubWFwOworICAgIH0KKworICAgIEVsZjMyX1N5bSAqZHluc3ltcyA9IChFbGYzMl9TeW0qKShiYXNlICsgc2hkcltkeW5zeW1faWR4XS5zaF9vZmZzZXQpOworICAgIGludCBudW1zeW1zID0gc2hkcltkeW5zeW1faWR4XS5zaF9zaXplIC8gc2hkcltkeW5zeW1faWR4XS5zaF9lbnRzaXplOworCisgICAgdGFibGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW1ib2xfdGFibGUpKTsKKyAgICBpZighdGFibGUpIHsKKyAgICAgICAgZ290byBvdXRfdW5tYXA7CisgICAgfQorICAgIHRhYmxlLT5udW1fc3ltYm9scyA9IDA7CisKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBhbmQgY291bnQgaG93IG1hbnkgc3ltYm9scworICAgIC8vIGFyZSBhY3R1YWxseSBkZWZpbmVkCisgICAgZm9yKGkgPSAwOyBpIDwgbnVtc3ltczsgaSsrKSB7CisgICAgICAgIGlmKGR5bnN5bXNbaV0uc3Rfc2huZHggIT0gU0hOX1VOREVGKSB7CisgICAgICAgICAgICB0YWJsZS0+bnVtX3N5bWJvbHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBkeW5zdHJfaWR4ID0gc2hkcltkeW5zeW1faWR4XS5zaF9saW5rOworICAgIGNoYXIgKmR5bnN0ciA9IGJhc2UgKyBzaGRyW2R5bnN0cl9pZHhdLnNoX29mZnNldDsKKworICAgIC8vIE5vdywgY3JlYXRlIGFuIGVudHJ5IGluIG91ciBzeW1ib2wgdGFibGUgc3RydWN0dXJlIGZvciBlYWNoIHN5bWJvbC4uLgorICAgIHRhYmxlLT5zeW1ib2xzID0gbWFsbG9jKHRhYmxlLT5udW1fc3ltYm9scyAqIHNpemVvZihzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgaWYoIXRhYmxlLT5zeW1ib2xzKSB7CisgICAgICAgIGZyZWUodGFibGUpOworICAgICAgICB0YWJsZSA9IE5VTEw7CisgICAgICAgIGdvdG8gb3V0X3VubWFwOworICAgIH0KKworICAgIC8vIC4uLmFuZCBwb3B1bGF0ZSB0aGVtCisgICAgaW50IGogPSAwOworICAgIGZvcihpID0gMDsgaSA8IG51bXN5bXM7IGkrKykgeworICAgICAgICBpZihkeW5zeW1zW2ldLnN0X3NobmR4ICE9IFNITl9VTkRFRikgeworICAgICAgICAgICAgdGFibGUtPnN5bWJvbHNbal0ubmFtZSA9IHN0cmR1cChkeW5zdHIgKyBkeW5zeW1zW2ldLnN0X25hbWUpOworICAgICAgICAgICAgdGFibGUtPnN5bWJvbHNbal0uYWRkciA9IGR5bnN5bXNbaV0uc3RfdmFsdWU7CisgICAgICAgICAgICB0YWJsZS0+c3ltYm9sc1tqXS5zaXplID0gZHluc3ltc1tpXS5zdF9zaXplOworICAgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU29ydCB0aGUgc3ltYm9sIHRhYmxlIGVudHJpZXMsIHNvIHRoZXkgY2FuIGJlIGJzZWFyY2hlZCBsYXRlcgorICAgIHFzb3J0KHRhYmxlLT5zeW1ib2xzLCB0YWJsZS0+bnVtX3N5bWJvbHMsIHNpemVvZihzdHJ1Y3Qgc3ltYm9sKSwgcWNvbXBhcik7CisKK291dF91bm1hcDoKKyAgICBtdW5tYXAoYmFzZSwgbGVuZ3RoKTsKKworb3V0X2Nsb3NlOgorICAgIGNsb3NlKGZkKTsKKworb3V0OgorICAgIHJldHVybiB0YWJsZTsKK30KKworLyoKKyAqIEZyZWUgYSBzeW1ib2wgdGFibGUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgIHRhYmxlIC0gVGFibGUgdG8gZnJlZQorICovCit2b2lkIHN5bWJvbF90YWJsZV9mcmVlKHN0cnVjdCBzeW1ib2xfdGFibGUgKnRhYmxlKQoreworICAgIGludCBpOworCisgICAgaWYoIXRhYmxlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPHRhYmxlLT5udW1fc3ltYm9sczsgaSsrKSB7CisgICAgICAgIGZyZWUodGFibGUtPnN5bWJvbHNbaV0ubmFtZSk7CisgICAgfQorCisgICAgZnJlZSh0YWJsZS0+c3ltYm9scyk7CisgICAgZnJlZSh0YWJsZSk7Cit9CisKKy8qCisgKiBTZWFyY2ggZm9yIGFuIGFkZHJlc3MgaW4gdGhlIHN5bWJvbCB0YWJsZQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgIHRhYmxlIC0gVGFibGUgdG8gc2VhcmNoIGluCisgKiAgICAgIGFkZHIgLSBBZGRyZXNzIHRvIHNlYXJjaCBmb3IuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgQSBwb2ludGVyIHRvIHRoZSBTeW1ib2wgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgKiAgICAgIHN5bWJvbCB3aGljaCBjb250YWlucyB0aGlzIGFkZHJlc3MsIG9yIE5VTEwgaWYgbm8gc3ltYm9sCisgKiAgICAgIGNvbnRhaW5zIGl0LgorICovCitjb25zdCBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xfdGFibGVfbG9va3VwKHN0cnVjdCBzeW1ib2xfdGFibGUgKnRhYmxlLCB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKyAgICBpZighdGFibGUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGJzZWFyY2goKHZvaWQqKWFkZHIsIHRhYmxlLT5zeW1ib2xzLCB0YWJsZS0+bnVtX3N5bWJvbHMsIHNpemVvZihzdHJ1Y3Qgc3ltYm9sKSwgYmNvbXBhcik7Cit9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvc3ltYm9sX3RhYmxlLmggYi9kZWJ1Z2dlcmQvc3ltYm9sX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkMjUyMAotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyZC9zeW1ib2xfdGFibGUuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIFNZTUJPTF9UQUJMRV9ICisjZGVmaW5lIFNZTUJPTF9UQUJMRV9ICisKK3N0cnVjdCBzeW1ib2wgeworICAgIHVuc2lnbmVkIGludCBhZGRyOworICAgIHVuc2lnbmVkIGludCBzaXplOworICAgIGNoYXIgKm5hbWU7Cit9OworCitzdHJ1Y3Qgc3ltYm9sX3RhYmxlIHsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xzOworICAgIGludCBudW1fc3ltYm9sczsKK307CisKK3N0cnVjdCBzeW1ib2xfdGFibGUgKnN5bWJvbF90YWJsZV9jcmVhdGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOwordm9pZCBzeW1ib2xfdGFibGVfZnJlZShzdHJ1Y3Qgc3ltYm9sX3RhYmxlICp0YWJsZSk7Citjb25zdCBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xfdGFibGVfbG9va3VwKHN0cnVjdCBzeW1ib2xfdGFibGUgKnRhYmxlLCB1bnNpZ25lZCBpbnQgYWRkcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3Vud2luZC1hcm0uYyBiL2RlYnVnZ2VyZC91bndpbmQtYXJtLmMKaW5kZXggOTY0MmQyZS4uYjA4MTE2MSAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL3Vud2luZC1hcm0uYworKysgYi9kZWJ1Z2dlcmQvdW53aW5kLWFybS5jCkBAIC0zNyw2ICszNyw4IEBACiAjaW5jbHVkZSA8dW53aW5kLmg+CiAjaW5jbHVkZSAidXRpbGl0eS5oIgogCisjaW5jbHVkZSAic3ltYm9sX3RhYmxlLmgiCisKIHR5cGVkZWYgc3RydWN0IF9aU3Q5dHlwZV9pbmZvIHR5cGVfaW5mbzsgLyogVGhpcyBuYW1lcyBDKysgdHlwZV9pbmZvIHR5cGUgKi8KIAogdm9pZCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgX19jeGFfY2FsbF91bmV4cGVjdGVkKF9VbndpbmRfQ29udHJvbF9CbG9jayAqdWNicCk7CkBAIC0zOTMsNiArMzk1LDcgQEAKICAgICBwaGFzZTJfdnJzICp2cnMgPSAocGhhc2UyX3ZycyopIGNvbnRleHQ7CiAgICAgY29uc3QgbWFwaW5mbyAqbWk7CiAgICAgYm9vbCBvbmx5X2luX3RvbWJzdG9uZSA9ICFhdF9mYXVsdDsKKyAgICBjb25zdCBzdHJ1Y3Qgc3ltYm9sKiBzeW0gPSAwOwogCiAgICAgaWYgKHN0YWNrX2xldmVsIDwgU1RBQ0tfQ09OVEVOVF9ERVBUSCkgewogICAgICAgICBzcF9saXN0W3N0YWNrX2xldmVsXSA9IHZycy0+Y29yZS5yW1JfU1BdOwpAQCAtNDUxLDkgKzQ1NCwyMCBAQAogICAgIHJlbF9wYyA9IHBjOwogICAgIG1pID0gcGNfdG9fbWFwaW5mbyhtYXAsIHBjLCAmcmVsX3BjKTsKIAotICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgCi0gICAgICAgICAiICAgICAgICAgIyUwMmQgIHBjICUwOHggICVzXG4iLCBzdGFja19sZXZlbCwgcmVsX3BjLCAKLSAgICAgICAgIG1pID8gbWktPm5hbWUgOiAiIik7CisgICAgLyogU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgd2hhdCBzeW1ib2wgdGhpcyBzdGFjayBmcmFtZSByZXNpZGVzIGluICovCisgICAgaWYgKG1pICE9IDAgJiYgbWktPnN5bWJvbHMgIT0gMCkgeworICAgICAgICBzeW0gPSBzeW1ib2xfdGFibGVfbG9va3VwKG1pLT5zeW1ib2xzLCByZWxfcGMpOworICAgIH0KKworICAgIGlmIChzeW0pIHsKKyAgICAgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLAorICAgICAgICAgICAgIiAgICAgICAgICMlMDJkICBwYyAlMDh4ICAlcyAoJXMpXG4iLCBzdGFja19sZXZlbCwgcmVsX3BjLAorICAgICAgICAgICAgbWkgPyBtaS0+bmFtZSA6ICIiLCBzeW0tPm5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwKKyAgICAgICAgICAgICIgICAgICAgICAjJTAyZCAgcGMgJTA4eCAgJXNcbiIsIHN0YWNrX2xldmVsLCByZWxfcGMsCisgICAgICAgICAgICBtaSA/IG1pLT5uYW1lIDogIiIpOworICAgIH0KIAogICAgIHJldHVybiBfVVJDX05PX1JFQVNPTjsKIH0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC91dGlsaXR5LmggYi9kZWJ1Z2dlcmQvdXRpbGl0eS5oCmluZGV4IDQ5ZjU5NTEuLjJmZmRmNTYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC91dGlsaXR5LmgKKysrIGIvZGVidWdnZXJkL3V0aWxpdHkuaApAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KIAorI2luY2x1ZGUgInN5bWJvbF90YWJsZS5oIgorCiAjaWZuZGVmIFBUX0FSTV9FWElEWAogI2RlZmluZSBQVF9BUk1fRVhJRFggICAgMHg3MDAwMDAwMSAgICAgIC8qIC5BUk0uZXhpZHggc2VnbWVudCAqLwogI2VuZGlmCkBAIC0zMyw2ICszNSw3IEBACiAgICAgdW5zaWduZWQgZW5kOwogICAgIHVuc2lnbmVkIGV4aWR4X3N0YXJ0OwogICAgIHVuc2lnbmVkIGV4aWR4X2VuZDsKKyAgICBzdHJ1Y3Qgc3ltYm9sX3RhYmxlICpzeW1ib2xzOwogICAgIGNoYXIgbmFtZVtdOwogfSBtYXBpbmZvOwogCmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9lbmdpbmUuYyBiL2Zhc3Rib290L2VuZ2luZS5jCmluZGV4IDhiYTIwMmMuLjQ4MDczZWUgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2VuZ2luZS5jCisrKyBiL2Zhc3Rib290L2VuZ2luZS5jCkBAIC05NywxNCArOTcsMjAgQEAKIHsKICAgICBBY3Rpb24gKmE7CiAgICAgdmFfbGlzdCBhcDsKKyAgICBzaXplX3QgY21kc2l6ZTsKIAogICAgIGEgPSBjYWxsb2MoMSwgc2l6ZW9mKEFjdGlvbikpOwogICAgIGlmIChhID09IDApIGRpZSgib3V0IG9mIG1lbW9yeSIpOwogCiAgICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgdnNwcmludGYoYS0+Y21kLCBmbXQsIGFwKTsKKyAgICBjbWRzaXplID0gdnNucHJpbnRmKGEtPmNtZCwgc2l6ZW9mKGEtPmNtZCksIGZtdCwgYXApOwogICAgIHZhX2VuZChhcCk7CiAKKyAgICBpZiAoY21kc2l6ZSA+PSBzaXplb2YoYS0+Y21kKSkgeworICAgICAgICBmcmVlKGEpOworICAgICAgICBkaWUoIkNvbW1hbmQgbGVuZ3RoICglZCkgZXhjZWVkcyBtYXhpbXVtIHNpemUgKCVkKSIsIGNtZHNpemUsIHNpemVvZihhLT5jbWQpKTsKKyAgICB9CisKICAgICBpZiAoYWN0aW9uX2xhc3QpIHsKICAgICAgICAgYWN0aW9uX2xhc3QtPm5leHQgPSBhOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FyY2gvdGFyZ2V0X2xpbnV4LXg4Ni9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvdGFyZ2V0X2xpbnV4LXg4Ni9BbmRyb2lkQ29uZmlnLmgKaW5kZXggYjk4MDBkZC4uMjE1MmQ2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hcmNoL3RhcmdldF9saW51eC14ODYvQW5kcm9pZENvbmZpZy5oCisrKyBiL2luY2x1ZGUvYXJjaC90YXJnZXRfbGludXgteDg2L0FuZHJvaWRDb25maWcuaApAQCAtMjI3LDcgKzIyNyw3IEBACiAvKgogICogRGVmaW5lIGlmIHdlIGhhdmUgTGludXgncyBkYnVzIAogICovCi0jZGVmaW5lIEhBVkVfREJVUyAxCisvKiAjZGVmaW5lIEhBVkVfREJVUyAxICovCiAKIC8qCiAgKiBEZWZpbmUgaWYgdG0gc3RydWN0IGhhcyB0bV9nbXRvZmYgZmllbGQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3V0aWxzL2xvZy5oIGIvaW5jbHVkZS9jdXRpbHMvbG9nLmgKaW5kZXggZGQ0N2MzNS4uZjYwMjAxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jdXRpbHMvbG9nLmgKKysrIGIvaW5jbHVkZS9jdXRpbHMvbG9nLmgKQEAgLTI5MSwxMSArMjkxLDExIEBACiAgKi8KICNkZWZpbmUgTE9HX0FMV0FZU19GQVRBTF9JRihjb25kLCAuLi4pIFwKICAgICAoIChDT05ESVRJT04oY29uZCkpIFwKLSAgICA/ICgodm9pZClhbmRyb2lkX3ByaW50QXNzZXJ0KCNjb25kLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykpIFwKKyAgICA/ICgodm9pZClhbmRyb2lkX3ByaW50QXNzZXJ0KCNjb25kLCBMT0dfVEFHLCAjIyBfX1ZBX0FSR1NfXykpIFwKICAgICA6ICh2b2lkKTAgKQogCiAjZGVmaW5lIExPR19BTFdBWVNfRkFUQUwoLi4uKSBcCi0gICAgKCAoKHZvaWQpYW5kcm9pZF9wcmludEFzc2VydChOVUxMLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykpICkKKyAgICAoICgodm9pZClhbmRyb2lkX3ByaW50QXNzZXJ0KE5VTEwsIExPR19UQUcsICMjIF9fVkFfQVJHU19fKSkgKQogCiAvKgogICogVmVyc2lvbnMgb2YgTE9HX0FMV0FZU19GQVRBTF9JRiBhbmQgTE9HX0FMV0FZU19GQVRBTCB0aGF0CkBAIC0zMDgsNyArMzA4LDcgQEAKIAogI2Vsc2UKIAotI2RlZmluZSBMT0dfRkFUQUxfSUYoY29uZCwgLi4uKSBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNvbmQsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMT0dfRkFUQUxfSUYoY29uZCwgLi4uKSBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNvbmQsICMjIF9fVkFfQVJHU19fKQogI2RlZmluZSBMT0dfRkFUQUwoLi4uKSBMT0dfQUxXQVlTX0ZBVEFMKF9fVkFfQVJHU19fKQogCiAjZW5kaWYKQEAgLTMxNyw3ICszMTcsNyBAQAogICogQXNzZXJ0aW9uIHRoYXQgZ2VuZXJhdGVzIGEgbG9nIG1lc3NhZ2Ugd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLgogICogU3RyaXBwZWQgb3V0IG9mIHJlbGVhc2UgYnVpbGRzLiAgVXNlcyB0aGUgY3VycmVudCBMT0dfVEFHLgogICovCi0jZGVmaW5lIExPR19BU1NFUlQoY29uZCwgLi4uKSBMT0dfRkFUQUxfSUYoIShjb25kKSwgX19WQV9BUkdTX18pCisjZGVmaW5lIExPR19BU1NFUlQoY29uZCwgLi4uKSBMT0dfRkFUQUxfSUYoIShjb25kKSwgIyMgX19WQV9BUkdTX18pCiAvLyNkZWZpbmUgTE9HX0FTU0VSVChjb25kKSBMT0dfRkFUQUxfSUYoIShjb25kKSwgIkFzc2VydGlvbiBmYWlsZWQ6ICIgI2NvbmQpCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDAzLDggKzQwMywyNCBAQAogI2RlZmluZSBhbmRyb2lkX3ZwcmludExvZyhwcmlvLCBjb25kLCB0YWcsIGZtdC4uLikgXAogICAgIF9fYW5kcm9pZF9sb2dfdnByaW50KHByaW8sIHRhZywgZm10KQogCisvKiBYWFggTWFjcm9zIHRvIHdvcmsgYXJvdW5kIHN5bnRheCBlcnJvcnMgaW4gcGxhY2VzIHdoZXJlIGZvcm1hdCBzdHJpbmcKKyAqIGFyZyBpcyBub3QgcGFzc2VkIHRvIExPR19BU1NFUlQsIExPR19BTFdBWVNfRkFUQUwgb3IgTE9HX0FMV0FZU19GQVRBTF9JRgorICogKGhhcHBlbnMgb25seSBpbiBkZWJ1ZyBidWlsZHMpLgorICovCisKKy8qIFJldHVybnMgMm5kIGFyZy4gIFVzZWQgdG8gc3Vic3RpdHV0ZSBkZWZhdWx0IHZhbHVlIGlmIGNhbGxlcidzIHZhcmFyZyBsaXN0CisgKiBpcyBlbXB0eS4KKyAqLworI2RlZmluZSBfX2FuZHJvaWRfc2Vjb25kKGR1bW15LCBzZWNvbmQsIC4uLikgICAgIHNlY29uZAorCisvKiBJZiBwYXNzZWQgbXVsdGlwbGUgYXJncywgcmV0dXJucyAnLCcgZm9sbG93ZWQgYnkgYWxsIGJ1dCAxc3QgYXJnLCBvdGhlcndpc2UKKyAqIHJldHVybnMgbm90aGluZy4KKyAqLworI2RlZmluZSBfX2FuZHJvaWRfcmVzdChmaXJzdCwgLi4uKSAgICAgICAgICAgICAgICwgIyMgX19WQV9BUkdTX18KKwogI2RlZmluZSBhbmRyb2lkX3ByaW50QXNzZXJ0KGNvbmQsIHRhZywgZm10Li4uKSBcCi0gICAgX19hbmRyb2lkX2xvZ19hc3NlcnQoY29uZCwgdGFnLCBmbXQpCisgICAgX19hbmRyb2lkX2xvZ19hc3NlcnQoY29uZCwgdGFnLCBcCisgICAgICAgIF9fYW5kcm9pZF9zZWNvbmQoMCwgIyMgZm10LCBOVUxMKSBfX2FuZHJvaWRfcmVzdChmbXQpKQogCiAjZGVmaW5lIGFuZHJvaWRfd3JpdGVMb2cocHJpbywgdGFnLCB0ZXh0KSBcCiAgICAgX19hbmRyb2lkX2xvZ193cml0ZShwcmlvLCB0YWcsIHRleHQpCkBAIC00MTMsNyArNDI5LDcgQEAKICAgICBfX2FuZHJvaWRfbG9nX2J3cml0ZSh0YWcsIHBheWxvYWQsIGxlbikKICNkZWZpbmUgYW5kcm9pZF9idFdyaXRlTG9nKHRhZywgdHlwZSwgcGF5bG9hZCwgbGVuKSBcCiAgICAgX19hbmRyb2lkX2xvZ19idHdyaXRlKHRhZywgdHlwZSwgcGF5bG9hZCwgbGVuKQotCQorCiAvLyBUT0RPOiByZW1vdmUgdGhlc2UgcHJvdG90eXBlcyBhbmQgdGhlaXIgdXNlcnMKICNkZWZpbmUgYW5kcm9pZF90ZXN0TG9nKHByaW8sIHRhZykgKDEpCiAjZGVmaW5lIGFuZHJvaWRfd3JpdGV2TG9nKHZlYyxudW0pIGRve313aGlsZSgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXR1dGlscy9kaGNwLmggYi9pbmNsdWRlL25ldHV0aWxzL2RoY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njc5OGM1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXR1dGlscy9kaGNwLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9ORVRVVElMU19ESENQX0hfCisjZGVmaW5lIF9ORVRVVElMU19ESENQX0hfCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IGRvX2RoY3AoY2hhciAqaW5hbWUpOworZXh0ZXJuIGludCBkaGNwX2RvX3JlcXVlc3QoY29uc3QgY2hhciAqaWZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmlwYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpnYXRld2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZG5zMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpkbnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICpsZWFzZSk7CitleHRlcm4gaW50IGRoY3Bfc3RvcChjb25zdCBjaGFyICppZm5hbWUpOworZXh0ZXJuIGludCBkaGNwX3JlbGVhc2VfbGVhc2UoY29uc3QgY2hhciAqaWZuYW1lKTsKK2V4dGVybiBjaGFyICpkaGNwX2dldF9lcnJtc2coKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9ORVRVVElMU19ESENQX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldHV0aWxzL2lmYy5oIGIvaW5jbHVkZS9uZXR1dGlscy9pZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjQ1MjYyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXR1dGlscy9pZmMuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05FVFVUSUxTX0lGQ19IXworI2RlZmluZSBfTkVUVVRJTFNfSUZDX0hfCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IGlmY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWZjX2Nsb3NlKHZvaWQpOworCitleHRlcm4gaW50IGlmY19nZXRfaWZpbmRleChjb25zdCBjaGFyICpuYW1lLCBpbnQgKmlmX2luZGV4cCk7CitleHRlcm4gaW50IGlmY19nZXRfaHdhZGRyKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnB0cik7CisKK2V4dGVybiBpbnQgaWZjX3VwKGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIGludCBpZmNfZG93bihjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIGludCBpZmNfZW5hYmxlKGNvbnN0IGNoYXIgKmlmbmFtZSk7CitleHRlcm4gaW50IGlmY19kaXNhYmxlKGNvbnN0IGNoYXIgKmlmbmFtZSk7CisKK2V4dGVybiBpbnQgaWZjX3Jlc2V0X2Nvbm5lY3Rpb25zKGNvbnN0IGNoYXIgKmlmbmFtZSk7CisKK2V4dGVybiBpbnQgaWZjX3NldF9hZGRyKGNvbnN0IGNoYXIgKm5hbWUsIGluX2FkZHJfdCBhZGRyKTsKK2V4dGVybiBpbnQgaWZjX3NldF9tYXNrKGNvbnN0IGNoYXIgKm5hbWUsIGluX2FkZHJfdCBtYXNrKTsKK2V4dGVybiBpbnQgaWZjX3NldF9od2FkZHIoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqcHRyKTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgaWZjX2FkZF9yb3V0ZSBpbnN0ZWFkLiAqLworZXh0ZXJuIGludCBpZmNfYWRkX2hvc3Rfcm91dGUoY29uc3QgY2hhciAqbmFtZSwgaW5fYWRkcl90IGFkZHIpOworZXh0ZXJuIGludCBpZmNfcmVtb3ZlX2hvc3Rfcm91dGVzKGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIGludCBpZmNfZ2V0X2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lKTsKKy8qIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIGlmY19hZGRfcm91dGUgaW5zdGVhZCAqLworZXh0ZXJuIGludCBpZmNfc2V0X2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCBpbl9hZGRyX3QgZ2F0ZXdheSk7CisvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSBpZmNfYWRkX3JvdXRlIGluc3RlYWQgKi8KK2V4dGVybiBpbnQgaWZjX2NyZWF0ZV9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKm5hbWUsIGluX2FkZHJfdCBhZGRyKTsKK2V4dGVybiBpbnQgaWZjX3JlbW92ZV9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSk7CitleHRlcm4gaW50IGlmY19hZGRfcm91dGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYWRkciwgaW50IHByZWZpeF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZ3cpOworCitleHRlcm4gaW50IGlmY19nZXRfaW5mbyhjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgKmFkZHIsIGluX2FkZHJfdCAqbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZmxhZ3MpOworCitleHRlcm4gaW50IGlmY19jb25maWd1cmUoY29uc3QgY2hhciAqaWZuYW1lLCBpbl9hZGRyX3QgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgbmV0bWFzaywgaW5fYWRkcl90IGdhdGV3YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90IGRuczEsIGluX2FkZHJfdCBkbnMyKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9ORVRVVElMU19JRkNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oIGIvaW5jbHVkZS9waXhlbGZsaW5nZXIvcGl4ZWxmbGluZ2VyLmgKaW5kZXggZGNhMGI5MC4uOGEyYjQ0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9waXhlbGZsaW5nZXIvcGl4ZWxmbGluZ2VyLmgKKysrIGIvaW5jbHVkZS9waXhlbGZsaW5nZXIvcGl4ZWxmbGluZ2VyLmgKQEAgLTMxNSw3ICszMTUsNyBAQAogc3NpemVfdCBnZ2xJbml0KEdHTENvbnRleHQqKiBjb250ZXh0KTsKIHNzaXplX3QgZ2dsVW5pbml0KEdHTENvbnRleHQqIGNvbnRleHQpOwogCi1HR0xpbnQgZ2dsQml0Qmx0aSgKK0dHTGludCBnZ2xCaXRCbGl0KAogICAgICAgICBHR0xDb250ZXh0KiBjLAogICAgICAgICBpbnQgdG11LAogICAgICAgICBHR0xpbnQgY3JvcFs0XSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmggYi9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCmluZGV4IDk3Yjg3M2EuLjhhY2NhNWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaApAQCAtMTY1LDYgKzE2NSw3IEBACiAgICAgeyAwMDY0MCwgQUlEX1NZU1RFTSwgICAgQUlEX1NZU1RFTSwgICAgInN5c3RlbS9ldGMvYmx1ZXRvb3RoL2F1dG9fcGFpcmluZy5jb25mIiB9LAogICAgIHsgMDA0NDQsIEFJRF9SQURJTywgICAgIEFJRF9BVURJTywgICAgICJzeXN0ZW0vZXRjL0F1ZGlvUGFyYTQuY3N2IiB9LAogICAgIHsgMDA1NTUsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgICJzeXN0ZW0vZXRjL3BwcC8qIiB9LAorICAgIHsgMDA1NTUsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgICJzeXN0ZW0vZXRjL3JjLioiIH0sCiAgICAgeyAwMDY0NCwgQUlEX1NZU1RFTSwgICAgQUlEX1NZU1RFTSwgICAgImRhdGEvYXBwLyoiIH0sCiAgICAgeyAwMDY0NCwgQUlEX1NZU1RFTSwgICAgQUlEX1NZU1RFTSwgICAgImRhdGEvYXBwLXByaXZhdGUvKiIgfSwKICAgICB7IDAwNjQ0LCBBSURfQVBQLCAgICAgICBBSURfQVBQLCAgICAgICAiZGF0YS9kYXRhLyoiIH0sCmRpZmYgLS1naXQgYS9pbml0L3V0aWwuYyBiL2luaXQvdXRpbC5jCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMzc3NzU0Yi4uZDhlYzg4ZQotLS0gYS9pbml0L3V0aWwuYworKysgYi9pbml0L3V0aWwuYwpAQCAtNDM5LDggKzQzOSw5IEBACiAgICAgICAgIGlmICh4KSB7CiAgICAgICAgICAgICB4ICs9IDI7CiAgICAgICAgICAgICBuID0gMDsKLSAgICAgICAgICAgIHdoaWxlICgqeCAmJiAhaXNzcGFjZSgqeCkpIHsKLSAgICAgICAgICAgICAgICBoYXJkd2FyZVtuKytdID0gdG9sb3dlcigqeCk7CisgICAgICAgICAgICB3aGlsZSAoKnggJiYgKnggIT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGlmICghaXNzcGFjZSgqeCkpCisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlW24rK10gPSB0b2xvd2VyKCp4KTsKICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICAgaWYgKG4gPT0gMzEpIGJyZWFrOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliZGlza2NvbmZpZy9BbmRyb2lkLm1rIGIvbGliZGlza2NvbmZpZy9BbmRyb2lkLm1rCmluZGV4IDFkMGVjYjQuLmM4ODc5NTUgMTAwNjQ0Ci0tLSBhL2xpYmRpc2tjb25maWcvQW5kcm9pZC5taworKysgYi9saWJkaXNrY29uZmlnL0FuZHJvaWQubWsKQEAgLTMsMTcgKzMsMjUgQEAKIAogaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKIAotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCitjb21tb25Tb3VyY2VzIDo9IFwKIAlkaXNrY29uZmlnLmMgXAogCWRpc2t1dGlscy5jIFwKIAl3cml0ZV9sc3QuYyBcCiAJY29uZmlnX21ici5jCiAKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY29tbW9uU291cmNlcykKIExPQ0FMX01PRFVMRSA6PSBsaWJkaXNrY29uZmlnCiBMT0NBTF9TWVNURU1fU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlibG9nIGxpYmMKLQogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCitpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gJChjb21tb25Tb3VyY2VzKQorTE9DQUxfTU9EVUxFIDo9IGxpYmRpc2tjb25maWdfaG9zdAorTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzCitMT0NBTF9DRkxBR1MgOj0gLU8yIC1nIC1XIC1XYWxsIC1XZXJyb3IgLURfTEFSR0VGSUxFNjRfU09VUkNFCitpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKK2VuZGlmICMgSE9TVF9PUyA9PSBsaW51eAorCiBlbmRpZiAgIyAhIFRBUkdFVF9TSU1VTEFUT1IKZGlmZiAtLWdpdCBhL2xpYmxvZy9sb2dkX3dyaXRlLmMgYi9saWJsb2cvbG9nZF93cml0ZS5jCmluZGV4IDk5MjNiYmEuLmEwYTc1M2IgMTAwNjQ0Ci0tLSBhL2xpYmxvZy9sb2dkX3dyaXRlLmMKKysrIGIvbGlibG9nL2xvZ2Rfd3JpdGUuYwpAQCAtNTYsNyArNTYsNyBAQAogICogdGhlIHNpbXVsYXRvciByYXRoZXIgdGhhbiBhIGRlc2t0b3AgdG9vbCBhbmQgd2FudCB0byB1c2UgdGhlIGRldmljZS4KICAqLwogc3RhdGljIGVudW0gewotICAgIGtMb2dVbmluaXRpYWxpemVkLCBrTG9nTm90QXZhaWxhYmxlLCBrTG9nQXZhaWxhYmxlIAorICAgIGtMb2dVbmluaXRpYWxpemVkLCBrTG9nTm90QXZhaWxhYmxlLCBrTG9nQXZhaWxhYmxlCiB9IGdfbG9nX3N0YXR1cyA9IGtMb2dVbmluaXRpYWxpemVkOwogaW50IF9fYW5kcm9pZF9sb2dfZGV2X2F2YWlsYWJsZSh2b2lkKQogewpAQCAtMTg5LDcgKzE4OSw3IEBACiAKIGludCBfX2FuZHJvaWRfbG9nX3ZwcmludChpbnQgcHJpbywgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCiB7Ci0gICAgY2hhciBidWZbTE9HX0JVRl9TSVpFXTsgICAgCisgICAgY2hhciBidWZbTE9HX0JVRl9TSVpFXTsKIAogICAgIHZzbnByaW50ZihidWYsIExPR19CVUZfU0laRSwgZm10LCBhcCk7CiAKQEAgLTIyMywxMiArMjIzLDIzIEBACiB2b2lkIF9fYW5kcm9pZF9sb2dfYXNzZXJ0KGNvbnN0IGNoYXIgKmNvbmQsIGNvbnN0IGNoYXIgKnRhZywKIAkJCSAgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0gICAgdmFfbGlzdCBhcDsKLSAgICBjaGFyIGJ1ZltMT0dfQlVGX1NJWkVdOyAgICAKKyAgICBjaGFyIGJ1ZltMT0dfQlVGX1NJWkVdOwogCi0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgdnNucHJpbnRmKGJ1ZiwgTE9HX0JVRl9TSVpFLCBmbXQsIGFwKTsKLSAgICB2YV9lbmQoYXApOworICAgIGlmIChmbXQpIHsKKyAgICAgICAgdmFfbGlzdCBhcDsKKyAgICAgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgICAgIHZzbnByaW50ZihidWYsIExPR19CVUZfU0laRSwgZm10LCBhcCk7CisgICAgICAgIHZhX2VuZChhcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTXNnIG5vdCBwcm92aWRlZCwgbG9nIGNvbmRpdGlvbi4gIE4uQi4gRG8gbm90IHVzZSBjb25kIGRpcmVjdGx5IGFzCisgICAgICAgICAqIGZvcm1hdCBzdHJpbmcgYXMgaXQgY291bGQgY29udGFpbiBzcHVyaW91cyAnJScgc3ludGF4IChlLmcuCisgICAgICAgICAqICIlZCIgaW4gImJsb2NrcyVkZXZzID09IDAiKS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChjb25kKQorICAgICAgICAgICAgc25wcmludGYoYnVmLCBMT0dfQlVGX1NJWkUsICJBc3NlcnRpb24gZmFpbGVkOiAlcyIsIGNvbmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHJjcHkoYnVmLCAiVW5zcGVjaWZpZWQgYXNzZXJ0aW9uIGZhaWxlZCIpOworICAgIH0KIAogICAgIF9fYW5kcm9pZF9sb2dfd3JpdGUoQU5EUk9JRF9MT0dfRkFUQUwsIHRhZywgYnVmKTsKIApkaWZmIC0tZ2l0IGEvbGlibmV0dXRpbHMvZGhjcF91dGlscy5jIGIvbGlibmV0dXRpbHMvZGhjcF91dGlscy5jCmluZGV4IDBmOGE2YzQuLmNiMDk2MGYgMTAwNjQ0Ci0tLSBhL2xpYm5ldHV0aWxzL2RoY3BfdXRpbHMuYworKysgYi9saWJuZXR1dGlscy9kaGNwX3V0aWxzLmMKQEAgLTExNSw2ICsxMTUsMTQgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICppcGFkZHJfdG9fc3RyaW5nKGluX2FkZHJfdCBhZGRyKQoreworICAgIHN0cnVjdCBpbl9hZGRyIGluX2FkZHI7CisKKyAgICBpbl9hZGRyLnNfYWRkciA9IGFkZHI7CisgICAgcmV0dXJuIGluZXRfbnRvYShpbl9hZGRyKTsKK30KKwogLyoKICAqIFN0YXJ0IHRoZSBkaGNwIGNsaWVudCBkYWVtb24sIGFuZCB3YWl0IGZvciBpdCB0byBmaW5pc2gKICAqIGNvbmZpZ3VyaW5nIHRoZSBpbnRlcmZhY2UuCkBAIC0xNjUsNyArMTczLDEzIEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgaWYgKHN0cmNtcChwcm9wX3ZhbHVlLCAib2siKSA9PSAwKSB7CisgICAgICAgIGNoYXIgZG5zX3Byb3BfbmFtZVtQUk9QRVJUWV9LRVlfTUFYXTsKICAgICAgICAgZmlsbF9pcF9pbmZvKGludGVyZmFjZSwgaXBhZGRyLCBnYXRld2F5LCBtYXNrLCBkbnMxLCBkbnMyLCBzZXJ2ZXIsIGxlYXNlKTsKKyAgICAgICAgLyogY29weSB0aGUgZGhjcC5YWFguZG5zIHByb3BlcnRpZXMgdG8gbmV0LlhYWC5kbnMgKi8KKyAgICAgICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAibmV0LiVzLmRuczEiLCBpbnRlcmZhY2UpOworICAgICAgICBwcm9wZXJ0eV9zZXQoZG5zX3Byb3BfbmFtZSwgKmRuczEgPyBpcGFkZHJfdG9fc3RyaW5nKCpkbnMxKSA6ICIiKTsKKyAgICAgICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAibmV0LiVzLmRuczIiLCBpbnRlcmZhY2UpOworICAgICAgICBwcm9wZXJ0eV9zZXQoZG5zX3Byb3BfbmFtZSwgKmRuczIgPyBpcGFkZHJfdG9fc3RyaW5nKCpkbnMyKSA6ICIiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc25wcmludGYoZXJybXNnLCBzaXplb2YoZXJybXNnKSwgIkRIQ1AgcmVzdWx0IHdhcyAlcyIsIHByb3BfdmFsdWUpOwpkaWZmIC0tZ2l0IGEvbGlibmV0dXRpbHMvZGhjcGNsaWVudC5jIGIvbGlibmV0dXRpbHMvZGhjcGNsaWVudC5jCmluZGV4IDY3NTViYTEuLmZmMDA0MzIgMTAwNjQ0Ci0tLSBhL2xpYm5ldHV0aWxzL2RoY3BjbGllbnQuYworKysgYi9saWJuZXR1dGlscy9kaGNwY2xpZW50LmMKQEAgLTM2LDggKzM2LDggQEAKIAogI2luY2x1ZGUgPGRpcmVudC5oPgogCisjaW5jbHVkZSA8bmV0dXRpbHMvaWZjLmg+CiAjaW5jbHVkZSAiZGhjcG1zZy5oIgotI2luY2x1ZGUgImlmY191dGlscy5oIgogI2luY2x1ZGUgInBhY2tldC5oIgogCiAjZGVmaW5lIFZFUkJPU0UgMgpAQCAtODUsMTYgKzg1LDEyIEBACiAvLyAgICBleGl0KDEpOwogfQogCi1jb25zdCBjaGFyICppcGFkZHIodWludDMyX3QgYWRkcikKK2NvbnN0IGNoYXIgKmlwYWRkcihpbl9hZGRyX3QgYWRkcikKIHsKLSAgICBzdGF0aWMgY2hhciBidWZbMzJdOworICAgIHN0cnVjdCBpbl9hZGRyIGluX2FkZHI7CiAKLSAgICBzcHJpbnRmKGJ1ZiwiJWQuJWQuJWQuJWQiLAotICAgICAgICAgICAgYWRkciAmIDI1NSwKLSAgICAgICAgICAgICgoYWRkciA+PiA4KSAmIDI1NSksCi0gICAgICAgICAgICAoKGFkZHIgPj4gMTYpICYgMjU1KSwKLSAgICAgICAgICAgIChhZGRyID4+IDI0KSk7Ci0gICAgcmV0dXJuIGJ1ZjsKKyAgICBpbl9hZGRyLnNfYWRkciA9IGFkZHI7CisgICAgcmV0dXJuIGluZXRfbnRvYShpbl9hZGRyKTsKIH0KIAogdHlwZWRlZiBzdHJ1Y3QgZGhjcF9pbmZvIGRoY3BfaW5mbzsKQEAgLTEyOCwzMSArMTI0LDExIEBACiAgICAgKmxlYXNlID0gbGFzdF9nb29kX2luZm8ubGVhc2U7CiB9CiAKLXN0YXRpYyBpbnQgaWZjX2NvbmZpZ3VyZShjb25zdCBjaGFyICppZm5hbWUsIGRoY3BfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgZGhjcF9jb25maWd1cmUoY29uc3QgY2hhciAqaWZuYW1lLCBkaGNwX2luZm8gKmluZm8pCiB7Ci0gICAgY2hhciBkbnNfcHJvcF9uYW1lW1BST1BFUlRZX0tFWV9NQVhdOwotCi0gICAgaWYgKGlmY19zZXRfYWRkcihpZm5hbWUsIGluZm8tPmlwYWRkcikpIHsKLSAgICAgICAgcHJpbnRlcnIoImZhaWxlZCB0byBzZXQgaXBhZGRyICVzOiAlc1xuIiwgaXBhZGRyKGluZm8tPmlwYWRkciksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKGlmY19zZXRfbWFzayhpZm5hbWUsIGluZm8tPm5ldG1hc2spKSB7Ci0gICAgICAgIHByaW50ZXJyKCJmYWlsZWQgdG8gc2V0IG5ldG1hc2sgJXM6ICVzXG4iLCBpcGFkZHIoaW5mby0+bmV0bWFzayksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKGlmY19jcmVhdGVfZGVmYXVsdF9yb3V0ZShpZm5hbWUsIGluZm8tPmdhdGV3YXkpKSB7Ci0gICAgICAgIHByaW50ZXJyKCJmYWlsZWQgdG8gc2V0IGRlZmF1bHQgcm91dGUgJXM6ICVzXG4iLCBpcGFkZHIoaW5mby0+Z2F0ZXdheSksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihkbnNfcHJvcF9uYW1lLCBzaXplb2YoZG5zX3Byb3BfbmFtZSksICJuZXQuJXMuZG5zMSIsIGlmbmFtZSk7Ci0gICAgcHJvcGVydHlfc2V0KGRuc19wcm9wX25hbWUsIGluZm8tPmRuczEgPyBpcGFkZHIoaW5mby0+ZG5zMSkgOiAiIik7Ci0gICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAibmV0LiVzLmRuczIiLCBpZm5hbWUpOwotICAgIHByb3BlcnR5X3NldChkbnNfcHJvcF9uYW1lLCBpbmZvLT5kbnMyID8gaXBhZGRyKGluZm8tPmRuczIpIDogIiIpOwotCiAgICAgbGFzdF9nb29kX2luZm8gPSAqaW5mbzsKLQotICAgIHJldHVybiAwOworICAgIHJldHVybiBpZmNfY29uZmlndXJlKGlmbmFtZSwgaW5mby0+aXBhZGRyLCBpbmZvLT5uZXRtYXNrLCBpbmZvLT5nYXRld2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmRuczEsIGluZm8tPmRuczIpOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqZGhjcF90eXBlX3RvX25hbWUodWludDMyX3QgdHlwZSkKQEAgLTQ0OSw3ICs0MjUsNyBAQAogICAgICAgICAgICAgICAgIHByaW50ZXJyKCJ0aW1lZCBvdXRcbiIpOwogICAgICAgICAgICAgICAgIGlmICggaW5mby50eXBlID09IERIQ1BPRkZFUiApIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRlcnIoIm5vIGFja25vd2xlZGdlbWVudCBmcm9tIERIQ1Agc2VydmVyXG5jb25maWd1cmluZyAlcyB3aXRoIG9mZmVyZWQgcGFyYW1ldGVyc1xuIiwgaWZuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlmY19jb25maWd1cmUoaWZuYW1lLCAmaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaGNwX2NvbmZpZ3VyZShpZm5hbWUsICZpbmZvKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZXJybm8gPSBFVElNRTsKICAgICAgICAgICAgICAgICBjbG9zZShzKTsKQEAgLTUzMCw3ICs1MDYsNyBAQAogICAgICAgICAgICAgaWYgKGluZm8udHlwZSA9PSBESENQQUNLKSB7CiAgICAgICAgICAgICAgICAgcHJpbnRlcnIoImNvbmZpZ3VyaW5nICVzXG4iLCBpZm5hbWUpOwogICAgICAgICAgICAgICAgIGNsb3NlKHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBpZmNfY29uZmlndXJlKGlmbmFtZSwgJmluZm8pOworICAgICAgICAgICAgICAgIHJldHVybiBkaGNwX2NvbmZpZ3VyZShpZm5hbWUsICZpbmZvKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby50eXBlID09IERIQ1BOQUspIHsKICAgICAgICAgICAgICAgICBwcmludGVycigiY29uZmlndXJhdGlvbiByZXF1ZXN0IGRlbmllZFxuIik7CiAgICAgICAgICAgICAgICAgY2xvc2Uocyk7CmRpZmYgLS1naXQgYS9saWJuZXR1dGlscy9pZmNfdXRpbHMuYyBiL2xpYm5ldHV0aWxzL2lmY191dGlscy5jCmluZGV4IGJkZTMzNmYuLjBjYTVmZTYgMTAwNjQ0Ci0tLSBhL2xpYm5ldHV0aWxzL2lmY191dGlscy5jCisrKyBiL2xpYm5ldHV0aWxzL2lmY191dGlscy5jCkBAIC0yNyw4ICsyNywxMiBAQAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCiAjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KICNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjZfcm91dGUuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAKICNpZmRlZiBBTkRST0lECkBAIC00Myw5ICs0NywxMCBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQgaWZjX2N0bF9zb2NrID0gLTE7CitzdGF0aWMgaW50IGlmY19jdGxfc29jazYgPSAtMTsKIHZvaWQgcHJpbnRlcnIoY2hhciAqZm10LCAuLi4pOwogCi1zdGF0aWMgY29uc3QgY2hhciAqaXBhZGRyX3RvX3N0cmluZyh1aW50MzJfdCBhZGRyKQorc3RhdGljIGNvbnN0IGNoYXIgKmlwYWRkcl90b19zdHJpbmcoaW5fYWRkcl90IGFkZHIpCiB7CiAgICAgc3RydWN0IGluX2FkZHIgaW5fYWRkcjsKIApAQCAtNjQsNiArNjksMTcgQEAKICAgICByZXR1cm4gaWZjX2N0bF9zb2NrIDwgMCA/IC0xIDogMDsKIH0KIAoraW50IGlmY19pbml0Nih2b2lkKQoreworICAgIGlmIChpZmNfY3RsX3NvY2s2ID09IC0xKSB7CisgICAgICAgIGlmY19jdGxfc29jazYgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApOworICAgICAgICBpZiAoaWZjX2N0bF9zb2NrNiA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZXJyKCJzb2NrZXQoKSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpZmNfY3RsX3NvY2s2IDwgMCA/IC0xIDogMDsKK30KKwogdm9pZCBpZmNfY2xvc2Uodm9pZCkKIHsKICAgICBpZiAoaWZjX2N0bF9zb2NrICE9IC0xKSB7CkBAIC03Miw2ICs4OCwxNCBAQAogICAgIH0KIH0KIAordm9pZCBpZmNfY2xvc2U2KHZvaWQpCit7CisgICAgaWYgKGlmY19jdGxfc29jazYgIT0gLTEpIHsKKyAgICAgICAgKHZvaWQpY2xvc2UoaWZjX2N0bF9zb2NrNik7CisgICAgICAgIGlmY19jdGxfc29jazYgPSAtMTsKKyAgICB9Cit9CisKIHN0YXRpYyB2b2lkIGlmY19pbml0X2lmcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgaWZyZXEgKmlmcikKIHsKICAgICBtZW1zZXQoaWZyLCAwLCBzaXplb2Yoc3RydWN0IGlmcmVxKSk7CkBAIC04OCw3ICsxMTIsNyBAQAogICAgIHIgPSBpb2N0bChpZmNfY3RsX3NvY2ssIFNJT0NHSUZIV0FERFIsICZpZnIpOwogICAgIGlmKHIgPCAwKSByZXR1cm4gLTE7CiAKLSAgICBtZW1jcHkocHRyLCAmaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgNik7CisgICAgbWVtY3B5KHB0ciwgJmlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIEVUSF9BTEVOKTsKICAgICByZXR1cm4gMDsgICAgCiB9CiAKQEAgLTE0Myw2ICsxNjcsMTcgQEAKICAgICByZXR1cm4gaW9jdGwoaWZjX2N0bF9zb2NrLCBTSU9DU0lGQUREUiwgJmlmcik7CiB9CiAKK2ludCBpZmNfc2V0X2h3YWRkcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpwdHIpCit7CisgICAgaW50IHI7CisgICAgc3RydWN0IGlmcmVxIGlmcjsKKyAgICBpZmNfaW5pdF9pZnIobmFtZSwgJmlmcik7CisKKyAgICBpZnIuaWZyX2h3YWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgbWVtY3B5KCZpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBwdHIsIEVUSF9BTEVOKTsKKyAgICByZXR1cm4gaW9jdGwoaWZjX2N0bF9zb2NrLCBTSU9DU0lGSFdBRERSLCAmaWZyKTsKK30KKwogaW50IGlmY19zZXRfbWFzayhjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgbWFzaykKIHsKICAgICBzdHJ1Y3QgaWZyZXEgaWZyOwpAQCAtMTg1LDQ1ICsyMjAsODAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotCi1pbnQgaWZjX2NyZWF0ZV9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKm5hbWUsIGluX2FkZHJfdCBhZGRyKQoraW5fYWRkcl90IGdldF9pcHY0X25ldG1hc2soaW50IHByZWZpeF9sZW5ndGgpCiB7Ci0gICAgc3RydWN0IHJ0ZW50cnkgcnQ7CisgICAgaW5fYWRkcl90IG1hc2sgPSAwOwogCi0gICAgbWVtc2V0KCZydCwgMCwgc2l6ZW9mKHJ0KSk7Ci0gICAgCi0gICAgcnQucnRfZHN0LnNhX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgcnQucnRfZmxhZ3MgPSBSVEZfVVAgfCBSVEZfR0FURVdBWTsKLSAgICBydC5ydF9kZXYgPSAodm9pZCopIG5hbWU7Ci0gICAgaW5pdF9zb2NrYWRkcl9pbigmcnQucnRfZ2VubWFzaywgMCk7Ci0gICAgaW5pdF9zb2NrYWRkcl9pbigmcnQucnRfZ2F0ZXdheSwgYWRkcik7Ci0gICAgCi0gICAgcmV0dXJuIGlvY3RsKGlmY19jdGxfc29jaywgU0lPQ0FERFJULCAmcnQpOworICAgIG1hc2sgPSB+bWFzayA8PCAoMzIgLSBwcmVmaXhfbGVuZ3RoKTsKKyAgICBtYXNrID0gaHRvbmwobWFzayk7CisKKyAgICByZXR1cm4gbWFzazsKIH0KIAotaW50IGlmY19hZGRfaG9zdF9yb3V0ZShjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgYWRkcikKK2ludCBpZmNfYWRkX2lwdjRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCBzdHJ1Y3QgaW5fYWRkciBkc3QsIGludCBwcmVmaXhfbGVuZ3RoLAorICAgICAgc3RydWN0IGluX2FkZHIgZ3cpCiB7CiAgICAgc3RydWN0IHJ0ZW50cnkgcnQ7CiAgICAgaW50IHJlc3VsdDsKKyAgICBpbl9hZGRyX3QgbmV0bWFzazsKIAogICAgIG1lbXNldCgmcnQsIDAsIHNpemVvZihydCkpOwotICAgIAorCiAgICAgcnQucnRfZHN0LnNhX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgcnQucnRfZmxhZ3MgPSBSVEZfVVAgfCBSVEZfSE9TVDsKLSAgICBydC5ydF9kZXYgPSAodm9pZCopIG5hbWU7Ci0gICAgaW5pdF9zb2NrYWRkcl9pbigmcnQucnRfZHN0LCBhZGRyKTsKLSAgICBpbml0X3NvY2thZGRyX2luKCZydC5ydF9nZW5tYXNrLCAwKTsKLSAgICBpbml0X3NvY2thZGRyX2luKCZydC5ydF9nYXRld2F5LCAwKTsKLSAgICAKKyAgICBydC5ydF9kZXYgPSAodm9pZCopIGlmbmFtZTsKKworICAgIG5ldG1hc2sgPSBnZXRfaXB2NF9uZXRtYXNrKHByZWZpeF9sZW5ndGgpOworICAgIGluaXRfc29ja2FkZHJfaW4oJnJ0LnJ0X2dlbm1hc2ssIG5ldG1hc2spOworICAgIGluaXRfc29ja2FkZHJfaW4oJnJ0LnJ0X2RzdCwgZHN0LnNfYWRkcik7CisgICAgcnQucnRfZmxhZ3MgPSBSVEZfVVA7CisKKyAgICBpZiAocHJlZml4X2xlbmd0aCA9PSAzMikgeworICAgICAgICBydC5ydF9mbGFncyB8PSBSVEZfSE9TVDsKKyAgICB9CisKKyAgICBpZiAoZ3cuc19hZGRyICE9IDApIHsKKyAgICAgICAgcnQucnRfZmxhZ3MgfD0gUlRGX0dBVEVXQVk7CisgICAgICAgIGluaXRfc29ja2FkZHJfaW4oJnJ0LnJ0X2dhdGV3YXksIGd3LnNfYWRkcik7CisgICAgfQorCiAgICAgaWZjX2luaXQoKTsKKworICAgIGlmIChpZmNfY3RsX3NvY2sgPCAwKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCiAgICAgcmVzdWx0ID0gaW9jdGwoaWZjX2N0bF9zb2NrLCBTSU9DQUREUlQsICZydCk7Ci0gICAgaWYgKHJlc3VsdCA8IDAgJiYgZXJybm8gPT0gRUVYSVNUKSB7Ci0gICAgICAgIHJlc3VsdCA9IDA7CisgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVFWElTVCkgeworICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IC1lcnJubzsKKyAgICAgICAgfQogICAgIH0KICAgICBpZmNfY2xvc2UoKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitpbnQgaWZjX2NyZWF0ZV9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKm5hbWUsIGluX2FkZHJfdCBndykKK3sKKyAgICBzdHJ1Y3QgaW5fYWRkciBpbl9kc3QsIGluX2d3OworCisgICAgaW5fZHN0LnNfYWRkciA9IDA7CisgICAgaW5fZ3cuc19hZGRyID0gZ3c7CisKKyAgICByZXR1cm4gaWZjX2FkZF9pcHY0X3JvdXRlKG5hbWUsIGluX2RzdCwgMCwgaW5fZ3cpOworfQorCitpbnQgaWZjX2FkZF9ob3N0X3JvdXRlKGNvbnN0IGNoYXIgKm5hbWUsIGluX2FkZHJfdCBkc3QpCit7CisgICAgc3RydWN0IGluX2FkZHIgaW5fZHN0LCBpbl9ndzsKKworICAgIGluX2RzdC5zX2FkZHIgPSBkc3Q7CisgICAgaW5fZ3cuc19hZGRyID0gMDsKKworICAgIHJldHVybiBpZmNfYWRkX2lwdjRfcm91dGUobmFtZSwgaW5fZHN0LCAzMiwgaW5fZ3cpOworfQorCiBpbnQgaWZjX2VuYWJsZShjb25zdCBjaGFyICppZm5hbWUpCiB7CiAgICAgaW50IHJlc3VsdDsKQEAgLTQyOSwxMCArNDk5LDExOSBAQAogCiAgICAgaWZjX2Nsb3NlKCk7CiAKLSAgICBzbnByaW50ZihkbnNfcHJvcF9uYW1lLCBzaXplb2YoZG5zX3Byb3BfbmFtZSksICJkaGNwLiVzLmRuczEiLCBpZm5hbWUpOworICAgIHNucHJpbnRmKGRuc19wcm9wX25hbWUsIHNpemVvZihkbnNfcHJvcF9uYW1lKSwgIm5ldC4lcy5kbnMxIiwgaWZuYW1lKTsKICAgICBwcm9wZXJ0eV9zZXQoZG5zX3Byb3BfbmFtZSwgZG5zMSA/IGlwYWRkcl90b19zdHJpbmcoZG5zMSkgOiAiIik7Ci0gICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAiZGhjcC4lcy5kbnMyIiwgaWZuYW1lKTsKKyAgICBzbnByaW50ZihkbnNfcHJvcF9uYW1lLCBzaXplb2YoZG5zX3Byb3BfbmFtZSksICJuZXQuJXMuZG5zMiIsIGlmbmFtZSk7CiAgICAgcHJvcGVydHlfc2V0KGRuc19wcm9wX25hbWUsIGRuczIgPyBpcGFkZHJfdG9fc3RyaW5nKGRuczIpIDogIiIpOwogCiAgICAgcmV0dXJuIDA7CiB9CisKK2ludCBpZmNfYWRkX2lwdjZfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCBzdHJ1Y3QgaW42X2FkZHIgZHN0LCBpbnQgcHJlZml4X2xlbmd0aCwKKyAgICAgIHN0cnVjdCBpbjZfYWRkciBndykKK3sKKyAgICBzdHJ1Y3QgaW42X3J0bXNnIHJ0bXNnOworICAgIGludCByZXN1bHQ7CisgICAgaW50IGlmaW5kZXg7CisKKyAgICBtZW1zZXQoJnJ0bXNnLCAwLCBzaXplb2YocnRtc2cpKTsKKworICAgIGlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChpZm5hbWUpOworICAgIGlmIChpZmluZGV4ID09IDApIHsKKyAgICAgICAgcHJpbnRlcnIoImlmX25hbWV0b2luZGV4KCkgZmFpbGVkOiBpbnRlcmZhY2UgJXNcbiIsIGlmbmFtZSk7CisgICAgICAgIHJldHVybiAtRU5YSU87CisgICAgfQorCisgICAgcnRtc2cucnRtc2dfaWZpbmRleCA9IGlmaW5kZXg7CisgICAgcnRtc2cucnRtc2dfZHN0ID0gZHN0OworICAgIHJ0bXNnLnJ0bXNnX2RzdF9sZW4gPSBwcmVmaXhfbGVuZ3RoOworICAgIHJ0bXNnLnJ0bXNnX2ZsYWdzID0gUlRGX1VQOworCisgICAgaWYgKHByZWZpeF9sZW5ndGggPT0gMTI4KSB7CisgICAgICAgIHJ0bXNnLnJ0bXNnX2ZsYWdzIHw9IFJURl9IT1NUOworICAgIH0KKworICAgIGlmIChtZW1jbXAoJmd3LCAmaW42YWRkcl9hbnksIHNpemVvZihpbjZhZGRyX2FueSkpKSB7CisgICAgICAgIHJ0bXNnLnJ0bXNnX2ZsYWdzIHw9IFJURl9HQVRFV0FZOworICAgICAgICBydG1zZy5ydG1zZ19nYXRld2F5ID0gZ3c7CisgICAgfQorCisgICAgaWZjX2luaXQ2KCk7CisKKyAgICBpZiAoaWZjX2N0bF9zb2NrNiA8IDApIHsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisKKyAgICByZXN1bHQgPSBpb2N0bChpZmNfY3RsX3NvY2s2LCBTSU9DQUREUlQsICZydG1zZyk7CisgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVFWElTVCkgeworICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IC1lcnJubzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZmNfY2xvc2U2KCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGlmY19hZGRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCBjb25zdCBjaGFyICpkc3QsIGludCBwcmVmaXhfbGVuZ3RoLAorICAgICAgY29uc3QgY2hhciAqZ3cpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGlwdjRfZHN0LCBpcHY0X2d3OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgaXB2Nl9kc3QsIGlwdjZfZ3c7CisgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWRkcl9haSwgKmd3X2FpOworCisgICAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAgLyogQWxsb3cgSVB2NCBvciBJUHY2ICovCisgICAgaGludHMuYWlfZmxhZ3MgPSBBSV9OVU1FUklDSE9TVDsKKworICAgIHJldCA9IGdldGFkZHJpbmZvKGRzdCwgTlVMTCwgJmhpbnRzLCAmYWRkcl9haSk7CisKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgcHJpbnRlcnIoImdldGFkZHJpbmZvIGZhaWxlZDogaW52YWxpZCBhZGRyZXNzICVzXG4iLCBkc3QpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoZ3cgPT0gTlVMTCkgeworICAgICAgICBpZiAoYWRkcl9haS0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgICAgICBndyA9ICI6OiI7CisgICAgICAgIH0gZWxzZSBpZiAoYWRkcl9haS0+YWlfZmFtaWx5ID09IEFGX0lORVQpIHsKKyAgICAgICAgICAgIGd3ID0gIjAuMC4wLjAiOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gZ2V0YWRkcmluZm8oZ3csIE5VTEwsICZoaW50cywgJmd3X2FpKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgcHJpbnRlcnIoImdldGFkZHJpbmZvIGZhaWxlZDogaW52YWxpZCBnYXRld2F5ICVzXG4iLCBndyk7CisgICAgICAgIGZyZWVhZGRyaW5mbyhhZGRyX2FpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGFkZHJfYWktPmFpX2ZhbWlseSAhPSBnd19haS0+YWlfZmFtaWx5KSB7CisgICAgICAgIHByaW50ZXJyKCJpZmNfYWRkX3JvdXRlOiBkaWZmZXJlbnQgYWRkcmVzcyBmYW1pbGllczogJXMgYW5kICVzXG4iLCBkc3QsIGd3KTsKKyAgICAgICAgZnJlZWFkZHJpbmZvKGFkZHJfYWkpOworICAgICAgICBmcmVlYWRkcmluZm8oZ3dfYWkpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoYWRkcl9haS0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgIG1lbWNweSgmaXB2Nl9kc3QsIGFkZHJfYWktPmFpX2FkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisgICAgICAgIG1lbWNweSgmaXB2Nl9ndywgZ3dfYWktPmFpX2FkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisgICAgICAgIHJldCA9IGlmY19hZGRfaXB2Nl9yb3V0ZShpZm5hbWUsIGlwdjZfZHN0LnNpbjZfYWRkciwgcHJlZml4X2xlbmd0aCwKKyAgICAgICAgICAgICAgaXB2Nl9ndy5zaW42X2FkZHIpOworICAgIH0gZWxzZSBpZiAoYWRkcl9haS0+YWlfZmFtaWx5ID09IEFGX0lORVQpIHsKKyAgICAgICAgbWVtY3B5KCZpcHY0X2RzdCwgYWRkcl9haS0+YWlfYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworICAgICAgICBtZW1jcHkoJmlwdjRfZ3csIGd3X2FpLT5haV9hZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisgICAgICAgIHJldCA9IGlmY19hZGRfaXB2NF9yb3V0ZShpZm5hbWUsIGlwdjRfZHN0LnNpbl9hZGRyLCBwcmVmaXhfbGVuZ3RoLAorICAgICAgICAgICAgICBpcHY0X2d3LnNpbl9hZGRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGVycigiaWZjX2FkZF9yb3V0ZTogZ2V0YWRkcmluZm8gcmV0dXJuZWQgdW4gc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5ICVkXG4iLAorICAgICAgICAgICAgICAgICAgYWRkcl9haS0+YWlfZmFtaWx5KTsKKyAgICAgICAgcmV0ID0gLUVBRk5PU1VQUE9SVDsKKyAgICB9CisKKyAgICBmcmVlYWRkcmluZm8oYWRkcl9haSk7CisgICAgZnJlZWFkZHJpbmZvKGd3X2FpKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGlibmV0dXRpbHMvaWZjX3V0aWxzLmggYi9saWJuZXR1dGlscy9pZmNfdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDliODc0Ny4uMDAwMDAwMAotLS0gYS9saWJuZXR1dGlscy9pZmNfdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfSUZDX1VUSUxTX0hfCi0jZGVmaW5lIF9JRkNfVVRJTFNfSF8KLQotaW50IGlmY19pbml0KHZvaWQpOwotCi1pbnQgaWZjX2dldF9pZmluZGV4KGNvbnN0IGNoYXIgKm5hbWUsIGludCAqaWZfaW5kZXhwKTsKLWludCBpZmNfZ2V0X2h3YWRkcihjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwdHIpOwotCi1pbnQgaWZjX3VwKGNvbnN0IGNoYXIgKm5hbWUpOwotaW50IGlmY19kb3duKGNvbnN0IGNoYXIgKm5hbWUpOwotCi1pbnQgaWZjX3NldF9hZGRyKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGFkZHIpOwotaW50IGlmY19zZXRfbWFzayhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBtYXNrKTsKLQotaW50IGlmY19jcmVhdGVfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBhZGRyKTsKLQotaW50IGlmY19nZXRfaW5mbyhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCAqYWRkciwgdW5zaWduZWQgKm1hc2ssIHVuc2lnbmVkICpmbGFncyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL0FuZHJvaWQubWsgYi9saWJwaXhlbGZsaW5nZXIvQW5kcm9pZC5tawppbmRleCA2NDkxZDI0Li5lZDJhYjVlIDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvQW5kcm9pZC5taworKysgYi9saWJwaXhlbGZsaW5nZXIvQW5kcm9pZC5tawpAQCAtMiwxNyArMiw2IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogIwotIyBBUk12NiBzcGVjaWZpYyBvYmplY3RzCi0jCi0KLWlmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKLUxPQ0FMX0FTRkxBR1MgOj0gLW1hcmNoPWFybXY2Ci1MT0NBTF9TUkNfRklMRVMgOj0gcm90YXRlOTBDV180eDRfMTZ2Ni5TCi1MT0NBTF9NT0RVTEUgOj0gbGlicGl4ZWxmbGluZ2VyX2FybXY2Ci1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi1lbmRpZgotCi0jCiAjIEMvQysrIGFuZCBBUk12NSBvYmplY3RzCiAjCiAKQEAgLTc3LDEwICs2Niw2IEBACiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmhhcmR3YXJlX2xlZ2FjeQogTE9DQUxfQ0ZMQUdTICs9IC1EV0lUSF9MSUJfSEFSRFdBUkUKIGVuZGlmCi0KLWlmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKLUxPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlicGl4ZWxmbGluZ2VyX2FybXY2Ci1lbmRpZgogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiAjCkBAIC05MSw5ICs3Niw2IEBACiBMT0NBTF9NT0RVTEU6PSBsaWJwaXhlbGZsaW5nZXJfc3RhdGljCiBMT0NBTF9TUkNfRklMRVMgOj0gJChQSVhFTEZMSU5HRVJfU1JDX0ZJTEVTKQogTE9DQUxfQ0ZMQUdTIDo9ICQoUElYRUxGTElOR0VSX0NGTEFHUykgCi1pZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCi1MT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnBpeGVsZmxpbmdlcl9hcm12NgotZW5kaWYKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAogCmRpZmYgLS1naXQgYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmNwcCBiL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXIuY3BwCmluZGV4IGQzNzIwYzMuLmZhOWYxYWQgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXIuY3BwCisrKyBiL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXIuY3BwCkBAIC00MzMsNiArNDMzLDE2IEBACiB7CiAgICAgKm1QQysrID0gKGNjPDwyOCkgfCAweDZDRjAwNzAgfCAoUmQ8PDEyKSB8ICgocm90YXRlID4+IDMpIDw8IDEwKSB8IFJtOwogfQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgQml0IG1hbmlwdWxhdGlvbiAoQVJNdjcrIG9ubHkpLi4uCisjZW5kaWYKKworLy8gQml0IG1hbmlwdWxhdGlvbiAoQVJNdjcrIG9ubHkpLi4uCit2b2lkIEFSTUFzc2VtYmxlcjo6VUJGWChpbnQgY2MsIGludCBSZCwgaW50IFJuLCBpbnQgbHNiLCBpbnQgd2lkdGgpCit7CisgICAgKm1QQysrID0gKGNjPDwyOCkgfCAweDdFMDAwMDAgfCAoKHdpZHRoLTEpPDwxNikgfCAoUmQ8PDEyKSB8IChsc2I8PDcpIHwgMHg1MCB8IFJuOworfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmggYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmgKaW5kZXggYTY2N2NiNS4uZTdmMDM4YSAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlci5oCisrKyBiL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXIuaApAQCAtMTI0LDYgKzEyNCw3IEBACiAgICAgdmlydHVhbCB2b2lkIFNNTEFXKGludCBjYywgaW50IHksCiAgICAgICAgICAgICAgICAgaW50IFJkLCBpbnQgUm0sIGludCBScywgaW50IFJuKTsKICAgICB2aXJ0dWFsIHZvaWQgVVhUQjE2KGludCBjYywgaW50IFJkLCBpbnQgUm0sIGludCByb3RhdGUpOworICAgIHZpcnR1YWwgdm9pZCBVQkZYKGludCBjYywgaW50IFJkLCBpbnQgUm4sIGludCBsc2IsIGludCB3aWR0aCk7CiAKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgQVJNQXNzZW1ibGVyKGNvbnN0IEFSTUFzc2VtYmxlciYgcmhzKTsKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXJJbnRlcmZhY2UuaCBiL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXJJbnRlcmZhY2UuaAppbmRleCBmZjZhZjJhLi43OTYzNDJhIDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVySW50ZXJmYWNlLmgKKysrIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlckludGVyZmFjZS5oCkBAIC0yMDYsNiArMjA2LDkgQEAKICAgICAvLyBieXRlL2hhbGYgd29yZCBleHRyYWN0Li4uCiAgICAgdmlydHVhbCB2b2lkIFVYVEIxNihpbnQgY2MsIGludCBSZCwgaW50IFJtLCBpbnQgcm90YXRlKSA9IDA7CiAKKyAgICAvLyBiaXQgbWFuaXB1bGF0aW9uLi4uCisgICAgdmlydHVhbCB2b2lkIFVCRlgoaW50IGNjLCBpbnQgUmQsIGludCBSbiwgaW50IGxzYiwgaW50IHdpZHRoKSA9IDA7CisKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIGNvbnZlbmllbmNlLi4uCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXJQcm94eS5jcHAgYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyUHJveHkuY3BwCmluZGV4IDdjNDIyZGIuLmM1N2Q3ZGEgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXJQcm94eS5jcHAKKysrIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlclByb3h5LmNwcApAQCAtMTk5LDUgKzE5OSw5IEBACiAgICAgbVRhcmdldC0+VVhUQjE2KGNjLCBSZCwgUm0sIHJvdGF0ZSk7CiB9CiAKK3ZvaWQgQVJNQXNzZW1ibGVyUHJveHk6OlVCRlgoaW50IGNjLCBpbnQgUmQsIGludCBSbiwgaW50IGxzYiwgaW50IHdpZHRoKSB7CisgICAgbVRhcmdldC0+VUJGWChjYywgUmQsIFJuLCBsc2IsIHdpZHRoKTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlclByb3h5LmggYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyUHJveHkuaAppbmRleCA5MTM0Y2NlLi44YzdmMjcwIDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyUHJveHkuaAorKysgYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyUHJveHkuaApAQCAtMTE1LDYgKzExNSw3IEBACiAgICAgICAgICAgICAgICAgaW50IFJkLCBpbnQgUm0sIGludCBScywgaW50IFJuKTsKIAogICAgIHZpcnR1YWwgdm9pZCBVWFRCMTYoaW50IGNjLCBpbnQgUmQsIGludCBSbSwgaW50IHJvdGF0ZSk7CisgICAgdmlydHVhbCB2b2lkIFVCRlgoaW50IGNjLCBpbnQgUmQsIGludCBSbiwgaW50IGxzYiwgaW50IHdpZHRoKTsKIAogcHJpdmF0ZToKICAgICBBUk1Bc3NlbWJsZXJJbnRlcmZhY2UqICBtVGFyZ2V0OwpkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL2Rpc2Fzc2VtLmMgYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvZGlzYXNzZW0uYwppbmRleCBjMTdmM2VjLi5hZWI4MDM0IDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvZGlzYXNzZW0uYworKysgYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvZGlzYXNzZW0uYwpAQCAtODEsNiArODEsOCBAQAogICogZyAtIDJuZCBmcCBvcGVyYW5kIChyZWdpc3RlcikgKGJpdHMgMTYtMTgpCiAgKiBoIC0gM3JkIGZwIG9wZXJhbmQgKHJlZ2lzdGVyL2ltbWVkaWF0ZSkgKGJpdHMgMC00KQogICogaiAtIHh0YiByb3RhdGUgbGl0ZXJhbCAoYml0cyAxMC0xMSkKKyAqIGkgLSBiZnggbHNiIGxpdGVyYWwgKGJpdHMgNy0xMSkKKyAqIHcgLSBiZnggd2lkdGggbGl0ZXJhbCAoYml0cyAxNi0yMCkKICAqIGIgLSBicmFuY2ggYWRkcmVzcwogICogdCAtIHRodW1iIGJyYW5jaCBhZGRyZXNzIChiaXRzIDI0LCAwLTIzKQogICogayAtIGJyZWFrcG9pbnQgY29tbWVudCAoYml0cyAwLTMsIDgtMTkpCkBAIC0xMjQsNiArMTI2LDcgQEAKICAgICB7IDB4MGZlMDAwZjAsIDB4MDBhMDAwOTAsICJ1bWxhbCIsCSJTZG5tcyIgfSwKICAgICB7IDB4MGZlMDAwZjAsIDB4MDBlMDAwOTAsICJzbWxhbCIsCSJTZG5tcyIgfSwKICAgICB7IDB4MGZmZjAzZjAsIDB4MDZjZjAwNzAsICJ1eHRiMTYiLCAiZG1qIiB9LAorICAgIHsgMHgwZmUwMDA3MCwgMHgwN2UwMDA1MCwgInViZngiLCAgICJkbWl3IiB9LAogICAgIHsgMHgwZDcwMDAwMCwgMHgwNDIwMDAwMCwgInN0cnQiLAkiZGFXIiB9LAogICAgIHsgMHgwZDcwMDAwMCwgMHgwNDMwMDAwMCwgImxkcnQiLAkiZGFXIiB9LAogICAgIHsgMHgwZDcwMDAwMCwgMHgwNDYwMDAwMCwgInN0cmJ0IiwJImRhVyIgfSwKQEAgLTQxMiw2ICs0MTUsMTQgQEAKIAkJY2FzZSAnaic6CiAJCQlkaS0+ZGlfcHJpbnRmKCJyb3IgIyVkIiwgKChpbnNuID4+IDEwKSAmIDMpIDw8IDMpOwogCQkJYnJlYWs7CisgICAgICAgIC8qIGkgLSBiZnggbHNiIGxpdGVyYWwgKGJpdHMgNy0xMSkgKi8KKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBkaS0+ZGlfcHJpbnRmKCIjJWQiLCAoaW5zbiA+PiA3KSAmIDMxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiB3IC0gYmZ4IHdpZHRoIGxpdGVyYWwgKGJpdHMgMTYtMjApICovCisgICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgZGktPmRpX3ByaW50ZigiIyVkIiwgMSArICgoaW5zbiA+PiAxNikgJiAzMSkpOworICAgICAgICAgICAgYnJlYWs7CiAJCS8qIGIgLSBicmFuY2ggYWRkcmVzcyAqLwogCQljYXNlICdiJzoKIAkJCWJyYW5jaCA9ICgoaW5zbiA8PCAyKSAmIDB4MDNmZmZmZmYpOwpkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL2xvYWRfc3RvcmUuY3BwIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL2xvYWRfc3RvcmUuY3BwCmluZGV4IDkzYzU4MjUuLmVkMjBhMDAgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9sb2FkX3N0b3JlLmNwcAorKysgYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvbG9hZF9zdG9yZS5jcHAKQEAgLTE4LDkgKzE4LDEyIEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0KICNpbmNsdWRlICJjb2RlZmxpbmdlci9HR0xBc3NlbWJsZXIuaCIKIAorI2lmZGVmIF9fQVJNX0FSQ0hfXworI2luY2x1ZGUgPG1hY2hpbmUvY3B1LWZlYXR1cmVzLmg+CisjZW5kaWYKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMTAsNiArMTEzLDIwIEBACiAgICAgYXNzZXJ0KG1hc2tMZW48PTgpOwogICAgIGFzc2VydChoKTsKICAgICAKKyNpZiBfX0FSTV9BUkNIX18gPj0gNworICAgIGNvbnN0IGludCBtYXNrID0gKDE8PG1hc2tMZW4pLTE7CisgICAgaWYgKChoID09IGJpdHMpICYmICFsICYmIChzICE9IGQucmVnKSkgeworICAgICAgICBNT1YoQUwsIDAsIGQucmVnLCBzKTsgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50ID0gcGFja2VkOworICAgIH0gZWxzZSBpZiAoKGggPT0gYml0cykgJiYgbCkgeworICAgICAgICBNT1YoQUwsIDAsIGQucmVnLCByZWdfaW1tKHMsIExTUiwgbCkpOyAgLy8gY29tcG9uZW50ID0gcGFja2VkID4+IGw7CisgICAgfSBlbHNlIGlmICghbCAmJiBpc1ZhbGlkSW1tZWRpYXRlKG1hc2spKSB7CisgICAgICAgIEFORChBTCwgMCwgZC5yZWcsIHMsIGltbShtYXNrKSk7ICAgICAgICAvLyBjb21wb25lbnQgPSBwYWNrZWQgJiBtYXNrOworICAgIH0gZWxzZSBpZiAoIWwgJiYgaXNWYWxpZEltbWVkaWF0ZSh+bWFzaykpIHsKKyAgICAgICAgQklDKEFMLCAwLCBkLnJlZywgcywgaW1tKH5tYXNrKSk7ICAgICAgIC8vIGNvbXBvbmVudCA9IHBhY2tlZCAmIG1hc2s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVUJGWChBTCwgZC5yZWcsIHMsIGwsIG1hc2tMZW4pOyAgICAgICAgIC8vIGNvbXBvbmVudCA9IChwYWNrZWQgJiBtYXNrKSA+PiBsOworICAgIH0KKyNlbHNlCiAgICAgaWYgKGggIT0gYml0cykgewogICAgICAgICBjb25zdCBpbnQgbWFzayA9ICgoMTw8bWFza0xlbiktMSkgPDwgbDsKICAgICAgICAgaWYgKGlzVmFsaWRJbW1lZGlhdGUobWFzaykpIHsKQEAgLTEzMiw2ICsxNDksNyBAQAogICAgIGlmIChzICE9IGQucmVnKSB7CiAgICAgICAgIE1PVihBTCwgMCwgZC5yZWcsIHMpOwogICAgIH0KKyNlbmRpZgogCiAgICAgZC5zID0gbWFza0xlbjsKIH0KZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZC5TIGIvbGlicGl4ZWxmbGluZ2VyL2NvbDMyY2IxNmJsZW5kLlMKaW5kZXggMTQ1MGJkZS4uMTgzMTI1NSAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL2NvbDMyY2IxNmJsZW5kLlMKKysrIGIvbGlicGl4ZWxmbGluZ2VyL2NvbDMyY2IxNmJsZW5kLlMKQEAgLTEsMjAgKzEsMTkgQEAKIC8qIGxpYnMvcGl4ZWxmbGluZ2VyL2NvbDMyY2IxNmJsZW5kLlMKLSoqCi0qKiAoQykgQ09QWVJJR0hUIDIwMDkgQVJNIExpbWl0ZWQuCi0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoqCi0qLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKICAgICAudGV4dAogICAgIC5hbGlnbgpkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL2NvbDMyY2IxNmJsZW5kX25lb24uUyBiL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZF9uZW9uLlMKaW5kZXggMTdiMGQwMS4uY2JkNTRkMSAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL2NvbDMyY2IxNmJsZW5kX25lb24uUworKysgYi9saWJwaXhlbGZsaW5nZXIvY29sMzJjYjE2YmxlbmRfbmVvbi5TCkBAIC0xLDIwICsxLDIwIEBACiAvKiBsaWJzL3BpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZF9uZW9uLlMKLSoqCi0qKiAoQykgQ09QWVJJR0hUIDIwMDkgQVJNIExpbWl0ZWQuCi0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoqCi0qLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKIAogICAgIC50ZXh0CiAgICAgLmFsaWduCmRpZmYgLS1naXQgYS9saWJwaXhlbGZsaW5nZXIvcmFzdGVyLmNwcCBiL2xpYnBpeGVsZmxpbmdlci9yYXN0ZXIuY3BwCmluZGV4IGQ3NTEyMDIuLjMyYjJhOTcgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9yYXN0ZXIuY3BwCisrKyBiL2xpYnBpeGVsZmxpbmdlci9yYXN0ZXIuY3BwCkBAIC0xNDMsNyArMTQzLDcgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLUdHTGludCBnZ2xCaXRCbHRpKEdHTENvbnRleHQqIGNvbiwgaW50IHRtdSwgR0dMaW50IGNyb3BbNF0sIEdHTGludCB3aGVyZVs0XSkKK0dHTGludCBnZ2xCaXRCbGl0KEdHTENvbnRleHQqIGNvbiwgaW50IHRtdSwgR0dMaW50IGNyb3BbNF0sIEdHTGludCB3aGVyZVs0XSkKIHsKICAgICBHR0xfQ09OVEVYVChjLCAodm9pZCopY29uKTsKIApkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL3NjYW5saW5lLmNwcCBiL2xpYnBpeGVsZmxpbmdlci9zY2FubGluZS5jcHAKaW5kZXggYTJmNDNlYi4uOTMxZDY0OCAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL3NjYW5saW5lLmNwcAorKysgYi9saWJwaXhlbGZsaW5nZXIvc2NhbmxpbmUuY3BwCkBAIC0xNTE4LDI2ICsxNTE4LDMgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotZXh0ZXJuICJDIiB2b2lkIGdnbF90ZXN0X2NvZGVnZW4odWludDMyX3QgbiwgdWludDMyX3QgcCwgdWludDMyX3QgdDAsIHVpbnQzMl90IHQxKQotewotI2lmIEFORFJPSURfQVJNX0NPREVHRU4KLSAgICBHR0xDb250ZXh0KiBjOwotICAgIGdnbEluaXQoJmMpOwotICAgIG5lZWRzX3QgbmVlZHM7Ci0gICAgbmVlZHMubiA9IG47Ci0gICAgbmVlZHMucCA9IHA7Ci0gICAgbmVlZHMudFswXSA9IHQwOwotICAgIG5lZWRzLnRbMV0gPSB0MTsKLSAgICBzcDxTY2FubGluZUFzc2VtYmx5PiBhKG5ldyBTY2FubGluZUFzc2VtYmx5KG5lZWRzLCBBU1NFTUJMWV9TQ1JBVENIX1NJWkUpKTsKLSAgICBHR0xBc3NlbWJsZXIgYXNzZW1ibGVyKCBuZXcgQVJNQXNzZW1ibGVyKGEpICk7Ci0gICAgaW50IGVyciA9IGFzc2VtYmxlci5zY2FubGluZShuZWVkcywgKGNvbnRleHRfdCopYyk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHByaW50ZigiZXJyb3IgJTA4eCAoJXMpXG4iLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICB9Ci0gICAgZ2dsVW5pbml0KGMpOwotI2Vsc2UKLSAgICBwcmludGYoIlRoaXMgdGVzdCBydW5zIG9ubHkgb24gQVJNXG4iKTsKLSNlbmRpZgotfQotCmRpZmYgLS1naXQgYS9saWJwaXhlbGZsaW5nZXIvdGVzdHMvY29kZWdlbi9BbmRyb2lkLm1rIGIvbGlicGl4ZWxmbGluZ2VyL3Rlc3RzL2NvZGVnZW4vQW5kcm9pZC5tawppbmRleCAxYmM0MjE0Li5hYTMyMGZjIDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvdGVzdHMvY29kZWdlbi9BbmRyb2lkLm1rCisrKyBiL2xpYnBpeGVsZmxpbmdlci90ZXN0cy9jb2RlZ2VuL0FuZHJvaWQubWsKQEAgLTIsMTIgKzIsMTUgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0JY29kZWdlbi5jcHAKKwljb2RlZ2VuLmNwcC5hcm0KIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIFwKICAgICBsaWJwaXhlbGZsaW5nZXIKIAorTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJc3lzdGVtL2NvcmUvbGlicGl4ZWxmbGluZ2VyCisKIExPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWNvZGVnZW4KIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci90ZXN0cy9jb2RlZ2VuL2NvZGVnZW4uY3BwIGIvbGlicGl4ZWxmbGluZ2VyL3Rlc3RzL2NvZGVnZW4vY29kZWdlbi5jcHAKaW5kZXggMTg2NTg4OC4uOTRlMjQ4MSAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL3Rlc3RzL2NvZGVnZW4vY29kZWdlbi5jcHAKKysrIGIvbGlicGl4ZWxmbGluZ2VyL3Rlc3RzL2NvZGVnZW4vY29kZWdlbi5jcHAKQEAgLTEsOSArMSw1NCBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLWV4dGVybiAiQyIgdm9pZCBnZ2xfdGVzdF9jb2RlZ2VuKAotICAgICAgICB1aW50MzJfdCBuLCB1aW50MzJfdCBwLCB1aW50MzJfdCB0MCwgdWludDMyX3QgdDEpOworI2luY2x1ZGUgInByaXZhdGUvcGl4ZWxmbGluZ2VyL2dnbF9jb250ZXh0LmgiCiAKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJzY2FubGluZS5oIgorCisjaW5jbHVkZSAiY29kZWZsaW5nZXIvQ29kZUNhY2hlLmgiCisjaW5jbHVkZSAiY29kZWZsaW5nZXIvR0dMQXNzZW1ibGVyLmgiCisjaW5jbHVkZSAiY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmgiCisKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjICAgZGVmaW5lIEFORFJPSURfQVJNX0NPREVHRU4gIDEKKyNlbHNlCisjICAgZGVmaW5lIEFORFJPSURfQVJNX0NPREVHRU4gIDAKKyNlbmRpZgorCisjZGVmaW5lIEFTU0VNQkxZX1NDUkFUQ0hfU0laRSAgIDIwNDgKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIFNjYW5saW5lQXNzZW1ibHkgOiBwdWJsaWMgQXNzZW1ibHkgeworICAgIEFzc2VtYmx5S2V5PG5lZWRzX3Q+IG1LZXk7CitwdWJsaWM6CisgICAgU2NhbmxpbmVBc3NlbWJseShuZWVkc190IG5lZWRzLCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBBc3NlbWJseShzaXplKSwgbUtleShuZWVkcykgeyB9CisgICAgY29uc3QgQXNzZW1ibHlLZXk8bmVlZHNfdD4mIGtleSgpIGNvbnN0IHsgcmV0dXJuIG1LZXk7IH0KK307CisKK3N0YXRpYyB2b2lkIGdnbF90ZXN0X2NvZGVnZW4odWludDMyX3QgbiwgdWludDMyX3QgcCwgdWludDMyX3QgdDAsIHVpbnQzMl90IHQxKQoreworI2lmIEFORFJPSURfQVJNX0NPREVHRU4KKyAgICBHR0xDb250ZXh0KiBjOworICAgIGdnbEluaXQoJmMpOworICAgIG5lZWRzX3QgbmVlZHM7CisgICAgbmVlZHMubiA9IG47CisgICAgbmVlZHMucCA9IHA7CisgICAgbmVlZHMudFswXSA9IHQwOworICAgIG5lZWRzLnRbMV0gPSB0MTsKKyAgICBzcDxTY2FubGluZUFzc2VtYmx5PiBhKG5ldyBTY2FubGluZUFzc2VtYmx5KG5lZWRzLCBBU1NFTUJMWV9TQ1JBVENIX1NJWkUpKTsKKyAgICBHR0xBc3NlbWJsZXIgYXNzZW1ibGVyKCBuZXcgQVJNQXNzZW1ibGVyKGEpICk7CisgICAgaW50IGVyciA9IGFzc2VtYmxlci5zY2FubGluZShuZWVkcywgKGNvbnRleHRfdCopYyk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIHByaW50ZigiZXJyb3IgJTA4eCAoJXMpXG4iLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKKyAgICB9CisgICAgZ2dsVW5pbml0KGMpOworI2Vsc2UKKyAgICBwcmludGYoIlRoaXMgdGVzdCBydW5zIG9ubHkgb24gQVJNXG4iKTsKKyNlbmRpZgorfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCiB7CmRpZmYgLS1naXQgYS9saWJzeXN1dGlscy9zcmMvTmV0bGlua0V2ZW50LmNwcCBiL2xpYnN5c3V0aWxzL3NyYy9OZXRsaW5rRXZlbnQuY3BwCmluZGV4IGMyYmE2NDcuLjg2YzFmNDIgMTAwNjQ0Ci0tLSBhL2xpYnN5c3V0aWxzL3NyYy9OZXRsaW5rRXZlbnQuY3BwCisrKyBiL2xpYnN5c3V0aWxzL3NyYy9OZXRsaW5rRXZlbnQuY3BwCkBAIC05MywxMyArOTMsMTEgQEAKIH0KIAogY29uc3QgY2hhciAqTmV0bGlua0V2ZW50OjpmaW5kUGFyYW0oY29uc3QgY2hhciAqcGFyYW1OYW1lKSB7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTkxfUEFSQU1TX01BWDsgaSsrKSB7Ci0gICAgICAgIGlmICghbVBhcmFtc1tpXSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoIXN0cm5jbXAobVBhcmFtc1tpXSwgcGFyYW1OYW1lLCBzdHJsZW4ocGFyYW1OYW1lKSkpCi0gICAgICAgICAgICByZXR1cm4gJm1QYXJhbXNbaV1bc3RybGVuKHBhcmFtTmFtZSkgKyAxXTsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKHBhcmFtTmFtZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IG1QYXJhbXNbaV0gJiYgaSA8IE5MX1BBUkFNU19NQVg7ICsraSkgeworICAgICAgICBjb25zdCBjaGFyICpwdHIgPSBtUGFyYW1zW2ldICsgbGVuOworICAgICAgICBpZiAoIXN0cm5jbXAobVBhcmFtc1tpXSwgcGFyYW1OYW1lLCBsZW4pICYmICpwdHIgPT0gJz0nKQorICAgICAgICAgICAgcmV0dXJuICsrcHRyOwogICAgIH0KIAogICAgIFNMT0dFKCJOZXRsaW5rRXZlbnQ6OkZpbmRQYXJhbSgpOiBQYXJhbWV0ZXIgJyVzJyBub3QgZm91bmQiLCBwYXJhbU5hbWUpOwpkaWZmIC0tZ2l0IGEvbWtzaC9BbmRyb2lkLm1rIGIvbWtzaC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1M2I4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2NCBAQAorIyBDb3B5cmlnaHQgwqkgMjAxMAorIwlUaG9yc3RlbiBHbGFzZXIgPHQuZ2xhc2VyQHRhcmVudC5kZT4KKyMgVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIG1rc2guCisKK0xPQ0FMX1BBVEg6PQkJJChjYWxsIG15LWRpcikKKworCisjIC9zeXN0ZW0vZXRjL21rc2hyYworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFOj0JCW1rc2hyYworTE9DQUxfTU9EVUxFX1RBR1M6PQlzaGVsbF9ta3NoCitMT0NBTF9NT0RVTEVfQ0xBU1M6PQlFVEMKK0xPQ0FMX01PRFVMRV9QQVRIOj0JJChUQVJHRVRfT1VUKS9ldGMKK0xPQ0FMX1NSQ19GSUxFUzo9CSQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisKKyMgL3N5c3RlbS9iaW4vbWtzaAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFOj0JCW1rc2gKK0xPQ0FMX01PRFVMRV9UQUdTOj0Jc2hlbGxfbWtzaAorCisjIG1rc2ggc291cmNlIGZpbGVzCitMT0NBTF9TUkNfRklMRVM6PQlzcmMvbGFsbG9jLmMgc3JjL2VkaXQuYyBzcmMvZXZhbC5jIHNyYy9leGVjLmMgXAorCQkJc3JjL2V4cHIuYyBzcmMvZnVuY3MuYyBzcmMvaGlzdHJhcC5jIHNyYy9qb2JzLmMgXAorCQkJc3JjL2xleC5jIHNyYy9tYWluLmMgc3JjL21pc2MuYyBzcmMvc2hmLmMgXAorCQkJc3JjL3N5bi5jIHNyYy90cmVlLmMgc3JjL3Zhci5jCisKK0xPQ0FMX1NZU1RFTV9TSEFSRURfTElCUkFSSUVTOj0gbGliYworCitMT0NBTF9DX0lOQ0xVREVTOj0JJChMT0NBTF9QQVRIKS9zcmMKKyMgYWRkaXRpb25hbCBmbGFncyBmaXJzdCwgdGhlbiBmcm9tIE1ha2VmcmFnLmluYzogQ0ZMQUdTLCBDUFBGTEFHUworTE9DQUxfQ0ZMQUdTOj0JCS1ETUtTSF9ERUZBVUxUX0VYRUNTSEVMTD1cIi9zeXN0ZW0vYmluL3NoXCIgXAorCQkJLURNS1NIX0RFRkFVTFRfVE1QRElSPVwiL3NxbGl0ZV9zdG10X2pvdXJuYWxzXCIgXAorCQkJLURNS1NIUkNfUEFUSD1cIi9zeXN0ZW0vZXRjL21rc2hyY1wiIFwKKwkJCS1md3JhcHYgXAorCQkJLURNS1NIX0FTU1VNRV9VVEY4PTAgLURNS1NIX05PUFdOQU0gXAorCQkJLURfR05VX1NPVVJDRSBcCisJCQktREhBVkVfQVRUUklCVVRFX0JPVU5ERUQ9MCAtREhBVkVfQVRUUklCVVRFX0ZPUk1BVD0xIFwKKwkJCS1ESEFWRV9BVFRSSUJVVEVfTk9OTlVMTD0xIC1ESEFWRV9BVFRSSUJVVEVfTk9SRVRVUk49MSBcCisJCQktREhBVkVfQVRUUklCVVRFX1VOVVNFRD0xIC1ESEFWRV9BVFRSSUJVVEVfVVNFRD0xIFwKKwkJCS1ESEFWRV9TWVNfUEFSQU1fSD0xIC1ESEFWRV9TWVNfTUtERVZfSD0wIFwKKwkJCS1ESEFWRV9TWVNfTU1BTl9IPTEgLURIQVZFX1NZU19TWVNNQUNST1NfSD0xIFwKKwkJCS1ESEFWRV9HUlBfSD0xIC1ESEFWRV9MSUJHRU5fSD0xIC1ESEFWRV9MSUJVVElMX0g9MCBcCisJCQktREhBVkVfUEFUSFNfSD0xIC1ESEFWRV9TVERCT09MX0g9MSAtREhBVkVfU1RESU5UX0g9MSBcCisJCQktREhBVkVfU1RSSU5HU19IPTEgLURIQVZFX1VMSU1JVF9IPTAgLURIQVZFX1ZBTFVFU19IPTAgXAorCQkJLURIQVZFX0NBTl9JTlRUWVBFUz0xIC1ESEFWRV9DQU5fVUNCSU5UUz0xIFwKKwkJCS1ESEFWRV9DQU5fSU5UOFRZUEU9MSAtREhBVkVfQ0FOX1VDQklOVDg9MSBcCisJCQktREhBVkVfUkxJTV9UPTEgLURIQVZFX1NJR19UPTEgLURIQVZFX1NZU19TSUdOQU1FPTEgXAorCQkJLURIQVZFX1NZU19TSUdMSVNUPTEgLURIQVZFX1NUUlNJR05BTD0wIFwKKwkJCS1ESEFWRV9HRVRSVVNBR0U9MSAtREhBVkVfS0lMTFBHPTEgLURIQVZFX01LTk9EPTAgXAorCQkJLURIQVZFX01LU1RFTVA9MSAtREhBVkVfTklDRT0xIC1ESEFWRV9SRVZPS0U9MCBcCisJCQktREhBVkVfU0VUTE9DQUxFX0NUWVBFPTAgLURIQVZFX0xBTkdJTkZPX0NPREVTRVQ9MCBcCisJCQktREhBVkVfU0VUTU9ERT0xIC1ESEFWRV9TRVRSRVNVR0lEPTEgXAorCQkJLURIQVZFX1NFVEdST1VQUz0xIC1ESEFWRV9TVFJDQVNFU1RSPTEgXAorCQkJLURIQVZFX1NUUkxDUFk9MSAtREhBVkVfRkxPQ0tfREVDTD0xIFwKKwkJCS1ESEFWRV9SRVZPS0VfREVDTD0xIC1ESEFWRV9TWVNfU0lHTElTVF9ERUNMPTEgXAorCQkJLURIQVZFX1BFUlNJU1RFTlRfSElTVE9SWT0wCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWtzaC9NT0RVTEVfTElDRU5TRV9CU0RfTElLRSBiL21rc2gvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKZGlmZiAtLWdpdCBhL21rc2gvTk9USUNFIGIvbWtzaC9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwMDYxZgotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvTk9USUNFCkBAIC0wLDAgKzEsMjEgQEAKK21rc2ggaXMgY292ZXJlZCBieSBUaGUgTWlyT1MgTGljZW5jZToKKworLyotCisgKiBDb3B5cmlnaHQgwqkgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1buKAkAorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCDigJxBUyBJU+KAnSBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29u4oCZcyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLwpkaWZmIC0tZ2l0IGEvbWtzaC9ta21mLnNoIGIvbWtzaC9ta21mLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDA0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL21rbWYuc2gKQEAgLTAsMCArMSwxMjQgQEAKKyMgQ29weXJpZ2h0IMKpIDIwMTAKKyMJVGhvcnN0ZW4gR2xhc2VyIDx0LmdsYXNlckB0YXJlbnQuZGU+CisjIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBta3NoLgorIy0KKyMgSGVscGVyIHNjcmlwdCB0byBsZXQgc3JjL0J1aWxkLnNoIGdlbmVyYXRlIE1ha2VmcmFnLmluYworIyB3aGljaCB3ZSBpbiB0dXJuIHVzZSBpbiB0aGUgbWFudWFsIGNyZWF0aW9uIG9mIEFuZHJvaWQubWsKKyMKKyMgVGhpcyBzY3JpcHQgaXMgc3VwcG9zZWQgdG8gYmUgcnVuIGZyb20vaW5zaWRlIEFPU1AgYnkgdGhlCisjIHBvcnRlciBvZiBta3NoIHRvIEFuZHJvaWQgKGFuZCBvbmx5IG1hbnVhbGx5KS4KKworY2QgIiQoZGlybmFtZSAiJDAiKSIKK3NyY2Rpcj0kKHB3ZCkKK3JtIC1yZiB0bXAKK21rZGlyIHRtcAorY2QgLi4vLi4vLi4KK2Fvc3BkaXI9JChwd2QpCitjZCAkc3JjZGlyL3RtcAorCithZGR2YXIoKSB7CisJX3ZuPSQxOyBzaGlmdAorCisJZXZhbCAkX3ZuPVwiXCQkX3ZuICckKiInCit9CisKK0NGTEFHUz0KK0NQUEZMQUdTPQorTERGTEFHUz0KK0xJQlM9CisKKyMgVGhlIGRlZmluaXRpb25zIGJlbG93IHdlcmUgZ2VuZXJhdGVkIGJ5IGV4YW1pbmluZyB0aGUKKyMgb3V0cHV0IG9mIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKyMgbWFrZSBzaG93Y29tbWFuZHMgb3V0L3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvc3lzdGVtL2Jpbi9ta3NoIDI+JjEgfCB0ZWUgbG9nCisjCisjIFRoZXkgYXJlIG9ubHkgdXNlZCB0byBsZXQgQnVpbGQuc2ggZmluZCB0aGUgY29tcGlsZXIsIGhlYWRlcgorIyBmaWxlcywgbGlua2VyIGFuZCBsaWJyYXJpZXMgdG8gZ2VuZXJhdGUgTWFrZWZyYWcuaW5jIChzaW1pbGFyCisjIHRvIHdoYXQgR05VIGF1dG90b29sc+KAmSBjb25maWd1cmUgc2NyaXB0cyBkbyksIGFuZCBuZXZlciB1c2VkCisjIGR1cmluZyB0aGUgcmVhbCBidWlsZCBwcm9jZXNzLiBXZSBuZWVkIHRoaXMgdG8gcG9ydCBta3NoIHRvCisjIHRoZSBBbmRyb2lkIHBsYXRmb3JtIGFuZCBpdCBpcyBjcnVjaWFsIHRoZXNlIGFyZSBhcyBjbG9zZSBhcworIyBwb3NzaWJsZSB0byB0aGUgdmFsdWVzIHVzZWQgbGF0ZXIuIChZb3UgYWxzbyBtdXN0IGV4YW1wbGUgdGhlCisjIHJlc3VsdHMgZ2F0aGVyZWQgZnJvbSBNYWtlZnJhZy5pbmMgdG8gc2VlIHRoZXkgYXJlIHRoZSBzYW1lCisjIGFjcm9zcyBhbGwgQW5kcm9pZCBwbGF0Zm9ybXMsIG9yIGFkZCBhcHByb3ByaWF0ZSBpZmRlZnMuKQorIyBTaW5jZSB3ZSBubyBsb25nZXIgdXNlIHRoZSBOREssIHRoZSBBT1NQIGhhcyB0byBoYXZlIGJlZW4KKyMgYnVpbHQgYmVmb3JlIHVzaW5nIHRoaXMgc2NyaXB0ICh0YXJnZXR0aW5nIGdlbmVyaWMvZW11bGF0b3IpLgorCitDQz0kYW9zcGRpci9wcmVidWlsdC9saW51eC14ODYvdG9vbGNoYWluL2FybS1lYWJpLTQuNC4wL2Jpbi9hcm0tZWFiaS1nY2MKK2FkZHZhciBDUFBGTEFHUyAtSSRhb3NwZGlyL3N5c3RlbS9jb3JlL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9zeXN0ZW0vY29yZS9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2hhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5L2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvaGFyZHdhcmUvcmlsL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvZGFsdmlrL2xpYm5hdGl2ZWhlbHBlci9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2ZyYW1ld29ya3MvYmFzZS9vcGVuZ2wvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9leHRlcm5hbC9za2lhL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvb3V0L3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvb2JqL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYmMvYXJjaC1hcm0vaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9iaW9uaWMvbGliYy9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9iaW9uaWMvbGliYy9rZXJuZWwvY29tbW9uIFwKKyAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJjL2tlcm5lbC9hcmNoLWFybSBcCisgICAgLUkkYW9zcGRpci9iaW9uaWMvbGlibS9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJtL2luY2x1ZGUvYXJjaC9hcm0gXAorICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYnRocmVhZF9kYi9pbmNsdWRlIFwKKyAgICAtRF9fQVJNX0FSQ0hfNV9fIC1EX19BUk1fQVJDSF81VF9fIC1EX19BUk1fQVJDSF81RV9fIC1EX19BUk1fQVJDSF81VEVfXyBcCisgICAgLUkkYW9zcGRpci9zeXN0ZW0vY29yZS9pbmNsdWRlL2FyY2gvbGludXgtYXJtLyBcCisgICAgLWluY2x1ZGUgJGFvc3BkaXIvc3lzdGVtL2NvcmUvaW5jbHVkZS9hcmNoL2xpbnV4LWFybS9BbmRyb2lkQ29uZmlnLmggXAorICAgIC1EQU5EUk9JRCAtRE5ERUJVRyAtVURFQlVHCithZGR2YXIgQ0ZMQUdTIC1mbm8tZXhjZXB0aW9ucyAtV25vLW11bHRpY2hhciAtbXNvZnQtZmxvYXQgLWZwaWMgXAorICAgIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZ1bndpbmQtdGFibGVzIC1mc3RhY2stcHJvdGVjdG9yIC1mbm8tc2hvcnQtZW51bXMgXAorICAgIC1tYXJjaD1hcm12NXRlIC1tdHVuZT14c2NhbGUgLW10aHVtYi1pbnRlcndvcmsgLWZtZXNzYWdlLWxlbmd0aD0wIFwKKyAgICAtVyAtV2FsbCAtV25vLXVudXNlZCAtV2luaXQtc2VsZiAtV3BvaW50ZXItYXJpdGggLVdlcnJvcj1yZXR1cm4tdHlwZSBcCisgICAgLVdlcnJvcj1ub24tdmlydHVhbC1kdG9yIC1XZXJyb3I9YWRkcmVzcyAtV2Vycm9yPXNlcXVlbmNlLXBvaW50IFwKKyAgICAtV3N0cmljdC1hbGlhc2luZz0yIC1maW5saW5lLWZ1bmN0aW9ucyAtZm5vLWlubGluZS1mdW5jdGlvbnMtY2FsbGVkLW9uY2UgXAorICAgIC1mZ2NzZS1hZnRlci1yZWxvYWQgLWZyZXJ1bi1jc2UtYWZ0ZXItbG9vcCAtZnJlbmFtZS1yZWdpc3RlcnMgLW10aHVtYiBcCisgICAgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1maW5saW5lLWxpbWl0PTY0CithZGR2YXIgTERGTEFHUyAtbm9zdGRsaWIgLUJkeW5hbWljIC1XbCwtVCwkYW9zcGRpci9idWlsZC9jb3JlL2FybWVsZi54IFwKKyAgICAtV2wsLWR5bmFtaWMtbGlua2VyLC9zeXN0ZW0vYmluL2xpbmtlciAtV2wsLS1nYy1zZWN0aW9ucyBcCisgICAgLVdsLC16LG5vY29weXJlbG9jIC1XbCwtLW5vLXVuZGVmaW5lZCBcCisgICAgJGFvc3BkaXIvb3V0L3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvb2JqL2xpYi9jcnRiZWdpbl9keW5hbWljLm8KK2FkZHZhciBMSUJTIC1MJGFvc3BkaXIvb3V0L3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvb2JqL2xpYiBcCisgICAgLVdsLC1ycGF0aC1saW5rPSRhb3NwZGlyL291dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL29iai9saWIgLWxjIFwKKyAgICAkYW9zcGRpci9wcmVidWlsdC9saW51eC14ODYvdG9vbGNoYWluL2FybS1lYWJpLTQuNC4wL2Jpbi8uLi9saWIvZ2NjL2FybS1lYWJpLzQuNC4wL2ludGVyd29yay9saWJnY2MuYSBcCisgICAgJGFvc3BkaXIvb3V0L3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvb2JqL2xpYi9jcnRlbmRfYW5kcm9pZC5vCisKKworIyMjIE92ZXJyaWRlIGZsYWdzCisjIFdlIGRvbuKAmXQgZXZlbiAqc3VwcG9ydCogVVRGLTggYnkgZGVmYXVsdCDimLkKK2FkZHZhciBDUFBGTEFHUyAtRE1LU0hfQVNTVU1FX1VURjg9MAorIyBObyBnZXRwd25hbSgpIGNhbGxzIChhZmZlY3RzICJjZCB+dXNlcm5hbWUvIiBvbmx5KQorYWRkdmFyIENQUEZMQUdTIC1ETUtTSF9OT1BXTkFNCisjIENvbXBpbGUgYW4gZXh0cmEgc21hbGwgbWtzaCAob3B0aW9uYWwpCisjYWRkdmFyIENQUEZMQUdTIC1ETUtTSF9TTUFMTAorIyBMZWF2ZSBvdXQgdGhlIHVsaW1pdCBidWlsdGluCisjYWRkdmFyIENQUEZMQUdTIC1ETUtTSF9OT19MSU1JVFMKKworIyBTZXQgdGFyZ2V0IHBsYXRmb3JtCitUQVJHRVRfT1M9TGludXgKKyMgQnVpbGRpbmcgd2l0aCAtc3RkPWM5OSBvciAtc3RkPWdudTk5IGNsYXNoZXMgd2l0aCBCaW9uaWMgaGVhZGVycworSEFWRV9DQU5fU1RERzk5PTAKK0hBVkVfQ0FOX1NUREM5OT0wCitleHBvcnQgSEFWRV9DQU5fU1RERzk5IEhBVkVfQ0FOX1NUREM5OQorCisjIEFuZHJvaWQteDg2IGRvZXMgbm90IGhhdmUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgUHJvUG9saWNlIFNTUAorIyBhbmQgQU9TUCBhZGRzIHRoZSBmbGFncyBieSBpdHNlbGYgKHNhbWUgZm9yIHdhcm5pbmcgZmxhZ3MpCitIQVZFX0NBTl9GTk9TVFJJQ1RBTElBU0lORz0wCitIQVZFX0NBTl9GU1RBQ0tQUk9URUNUT1JBTEw9MAorSEFWRV9DQU5fV0FMTD0wCitleHBvcnQgSEFWRV9DQU5fRk5PU1RSSUNUQUxJQVNJTkcgSEFWRV9DQU5fRlNUQUNLUFJPVEVDVE9SQUxMIEhBVkVfQ0FOX1dBTEwKKworIyBkaXNhYmxlIHRoZSBta25vZCg4KSBidWlsdC1pbiB0byBnZXQgcmlkIG9mIG5lZWRpbmcgc2V0bW9kZS5jCitIQVZFX01LTk9EPTA7IGV4cG9ydCBIQVZFX01LTk9ECisKKyMgZXZlbiB0aGUgaWRlYSBvZiBwZXJzaXN0ZW50IGhpc3Rvcnkgb24gYSBwaG9uZSBpcyBmdW5ueQorSEFWRV9QRVJTSVNURU5UX0hJU1RPUlk9MDsgZXhwb3J0IEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCisKKyMgLi4uIGFuZCBydW4gaXQhCitleHBvcnQgQ0MgQ1BQRkxBR1MgQ0ZMQUdTIExERkxBR1MgTElCUyBUQVJHRVRfT1MKK3NoIC4uL3NyYy9CdWlsZC5zaCAtTQorcnY9JD8KK3Rlc3QgeDAgPSB4IiRydiIgJiYgbXYgLWYgTWFrZWZyYWcuaW5jIC4uLworY2QgLi4KK3JtIC1yZiB0bXAKK2V4aXQgJHJ2CmRpZmYgLS1naXQgYS9ta3NoL21rc2hyYyBiL21rc2gvbWtzaHJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTVlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL21rc2hyYwpAQCAtMCwwICsxLDI5IEBACisjIENvcHlyaWdodCAoYykgMjAxMAorIwlUaG9yc3RlbiBHbGFzZXIgPHQuZ2xhc2VyQHRhcmVudC5kZT4KKyMgVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIG1rc2guCisjLQorIyBNaW5pbWFsIC9zeXN0ZW0vZXRjL21rc2hyYyBmb3IgQW5kcm9pZAorCis6ICR7VEVSTTo9dnQxMDB9ICR7SE9NRTo9L2RhdGF9ICR7TUtTSDo9L3N5c3RlbS9iaW4vc2h9ICR7SE9TVE5BTUU6PWFuZHJvaWR9Cis6ICR7U0hFTEw6PSRNS1NIfSAke1VTRVI6PSQodHlwZXNldCB4PSQoaWQpOyB4PSR7eCMqXCh9OyBwcmludCAtciAtLSAke3glJVwpKn0pfQoraWYgKCggVVNFUl9JRCApKTsgdGhlbiBQUzE9JyQnOyBlbHNlIFBTMT0nIyc7IGZpCitmdW5jdGlvbiBwcmVjbWQgeworCXR5cGVzZXQgZT0kPworCisJKCggZSApKSAmJiBwcmludCAtbiAiJGV8IgorfQorUFMxPSckKHByZWNtZCkkVVNFUkAkSE9TVE5BTUU6JHtQV0Q6LT99ICciJFBTMSAiCitleHBvcnQgSE9NRSBIT1NUTkFNRSBNS1NIIFBTMSBTSEVMTCBURVJNIFVTRVIKK2FsaWFzIGw9J2xzJworYWxpYXMgbGE9J2wgLWEnCithbGlhcyBsbD0nbCAtbCcKK2FsaWFzIGxvPSdsIC1hIC1sJworCitmb3IgcCBpbiB+Ly5iaW47IGRvCisJW1sgLWQgJHAvLiBdXSB8fCBjb250aW51ZQorCVtbIDokUEFUSDogPSAqOiRwOiogXV0gfHwgUEFUSD0kcDokUEFUSAorZG9uZQorCit1bnNldCBwCisKKzogcGxhY2UgY3VzdG9taXNhdGlvbnMgYWJvdmUgdGhpcyBsaW5lCmRpZmYgLS1naXQgYS9ta3NoL3NyYy8wMC1OT1RFLnR4dCBiL21rc2gvc3JjLzAwLU5PVEUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDRkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy8wMC1OT1RFLnR4dApAQCAtMCwwICsxLDE5IEBACitUaGlzIGlzIG1rc2ggZnJvbSBBbm9uQ1ZTIG9uIDIwMTAtMDgtMjQgd2l0aCB0aGUKK2ZvbGxvd2luZyBmaWxlcyByZW1vdmVkOgor4oCiIE1ha2VmaWxlCisgIChub3QgcGFydCBvZiByZWd1bGFyIG1rc2ggcmVsZWFzZXMgYW55d2F5KQor4oCiIGRvdC5ta3NocmMKKyAgKG5vdCBuZWVkZWQsIHdlIHVzZSBvdXIgb3duIGZvciBBbmRyb2lkKQor4oCiIG1rc2guMQorICAobWFucGFnZTsgYWxzbyBhdmFpbGFibGUgZnJvbSB0aGUgd2ViKQor4oCiIHNldG1vZGUuYworICAobm90IG5lZWRlZCwgd2UgZG9u4oCZdCB1c2UgdGhlIG1rbm9kIGJ1aWx0aW4pCivigKIgc3RybGNweS5jCisgIChub3QgbmVlZGVkLCBiaW9uaWMgcHJvdmlkZXMgdGhpcykKKworVGhlIG1hbnVhbCBwYWdlIGNhbiBiZSBkb3dubG9hZGVkIGFzIFBERiAoSVNPIEE0IHBhcGVyKSBmcm9tCitodHRwczovL3d3dy5taXJic2Qub3JnL01pck9TL2Rpc3QvbWlyL21rc2gvbWtzaC5wZGYgb3IgcmVhZAorb25saW5lIGF0IGh0dHBzOi8vd3d3Lm1pcmJzZC5vcmcvbWFuMS9ta3NoIChIVE1MKS4KKworVGhlcmUgYXJlIGN1cnJlbnRseSBubyBjaGFuZ2VzIHRvIHRoZSBjb2RlIGluIHRoaXMKK3N1YmRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL21rc2gvc3JjL0J1aWxkLnNoIGIvbWtzaC9zcmMvQnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4YjFjYQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL0J1aWxkLnNoCkBAIC0wLDAgKzEsMTYwMCBAQAorIyEvYmluL3NoCitzcmN2ZXJzaW9uPSckTWlyT1M6IHNyYy9iaW4vbWtzaC9CdWlsZC5zaCx2IDEuNDU5IDIwMTAvMDgvMjQgMTU6NDY6MDYgdGcgRXhwICQnCisjLQorIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyMJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorIworIyBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyMgYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisjIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorIyBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyMgbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyMKKyMgVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisjIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorIyBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyMgbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisjIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorIyBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyMgZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisjIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisjLQorIyBQZW9wbGUgYW5hbHlzaW5nIHRoZSBvdXRwdXQgbXVzdCB3aGl0ZWxpc3QgY29uZnRlc3QuYyBmb3IgYW55IGtpbmQKKyMgb2YgY29tcGlsZXIgd2FybmluZyBjaGVja3MgKG1pcnRvY29uZiBpcyBieSBkZXNpZ24gbm90IHF1aWV0KS4KKyMKKyMgRW52aXJvbm1lbnQgdXNlZDoJQ0MgQ0ZMQUdTIENQUEZMQUdTIExERkxBR1MgTElCUyBOT1dBUk4gTlJPRkYKKyMJCQlUQVJHRVRfT1MgVEFSR0VUX09TUkVWCisjIEZlYXR1cmUgc2VsZWN0b3JzOglVU0VfUFJJTlRGX0JVSUxUSU4KKyMgQ1BQRkxBR1MgcmVjb2duaXNlZDoJTUtTSF9BU1NVTUVfVVRGOCBNS1NIX0JJTlNIUkVEVUNFRCBNS1NIX0NMU19TVFJJTkcKKyMJCQlNS1NIX0NPTlNFUlZBVElWRV9GRFMgTUtTSF9NSUROSUdIVEJTRDAxQVNIX0NPTVBBVAorIwkJCU1LU0hfTk9QV05BTSBNS1NIX05PX0xJTUlUUyBNS1NIX1NNQUxMIE1LU0hfU19OT1ZJCisjCQkJTUtTSF9VTkVNUExPWUVEIE1LU0hfREVGQVVMVF9FWEVDU0hFTEwgTUtTSFJDX1BBVEgKKyMJCQlNS1NIX0RFRkFVTFRfVE1QRElSIE1LU0hfQ0xSVE9FT0xfU1RSSU5HIE1LU0hfQTRQQgorCitMQ19BTEw9QworZXhwb3J0IExDX0FMTAorCit2KCkgeworCSRlICIkKiIKKwlldmFsICIkQCIKK30KKwordnYoKSB7CisJX2M9JDEKKwlzaGlmdAorCSRlICJcJCAkKiIgMj4mMQorCWV2YWwgIiRAIiA+dnYub3V0IDI+JjEKKwlzZWQgInMHXgcke19jfSAHIiA8dnYub3V0Cit9CisKK3ZxKCkgeworCWV2YWwgIiRAIgorfQorCitybWYoKSB7CisJZm9yIF9mIGluICIkQCI7IGRvCisJCWNhc2UgJHtfZn0gaW4KKwkJbWtzaC4xKSA7OworCQkqKSBybSAtZiAiJHtfZn0iIDs7CisJCWVzYWMKKwlkb25lCit9CisKK2lmIHRlc3QgLWQgL3Vzci94cGc0L2Jpbi8uID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSMgU29sYXJpczogc29tZSBvZiB0aGUgdG9vbHMgaGF2ZSB3ZWlyZCBiZWhhdmlvdXIsIHVzZSBwb3J0YWJsZSBvbmVzCisJUEFUSD0vdXNyL3hwZzQvYmluOiRQQVRICisJZXhwb3J0IFBBVEgKK2ZpCisKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04reH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwllbXVsYXRlIHNoCisJTlVMTENNRD06CitmaQorCithbGx1PVFXRVJUWVVJT1BBU0RGR0hKS0xaWENWQk5NCithbGxsPXF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tCithbGxuPTAxMjM0NTY3ODkKK2FsbHM9X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KK25sPScKKycKK3RjZm49bm8KK2JpPQordWk9Cithbz0KK2Z4PQorbWU9YGJhc2VuYW1lICIkMCJgCitvcmlnX0NGTEFHUz0kQ0ZMQUdTCitwaGFzZT14CitvbGRpc2hfZWQ9c3Rkb3V0LWVkLG5vLXN0ZGVyci1lZAorCitpZiB0ZXN0IC10IDE7IHRoZW4KKwliaT0nG1sxbScKKwl1aT0nG1s0bScKKwlhbz0nG1swbScKK2ZpCisKK3VwcGVyKCkgeworCWVjaG8gOiIkQCIgfCBzZWQgJ3MvXjovLycgfCB0ciAkYWxsbCAkYWxsdQorfQorCisjIGNsZWFuIHVwIGFmdGVyIGFjX3Rlc3RydW4oKQorYWNfdGVzdGRvbmUoKSB7CisJZXZhbCBIQVZFXyRmdT0kZnYKKwlmcj1ubworCXRlc3QgMCA9ICRmdiB8fCBmcj15ZXMKKwkkZSAiJGJpPT0+ICRmZC4uLiRhbyAkdWkkZnIkYW8kZngiCisJZng9Cit9CisKKyMgYWNfY2FjaGUgbGFiZWw6IHNldHMgZiwgZnUsIGZ2Pz0wCithY19jYWNoZSgpIHsKKwlmPSQxCisJZnU9YHVwcGVyICRmYAorCWV2YWwgZnY9XCRIQVZFXyRmdQorCWNhc2UgJGZ2IGluCisJMHwxKQorCQlmeD0nIChjYWNoZWQpJworCQlyZXR1cm4gMAorCQk7OworCWVzYWMKKwlmdj0wCisJcmV0dXJuIDEKK30KKworIyBhY190ZXN0aW5pdCBsYWJlbCBbIV0gY2hlY2tpZlshXTAgW3NldGxhYmVsaWZjaGVja2lzWyFdMF0gdXNlcm91dHB1dAorIyByZXR1cm5zIDEgaWYgdmFsdWUgd2FzIGNhY2hlZC9pbXBsaWVkLCAwIG90aGVyd2lzZTogY2FsbCBhY190ZXN0ZG9uZQorYWNfdGVzdGluaXQoKSB7CisJaWYgYWNfY2FjaGUgJDE7IHRoZW4KKwkJdGVzdCB4IiQyIiA9IHgiISIgJiYgc2hpZnQKKwkJdGVzdCB4IiQyIiA9IHgiIiB8fCBzaGlmdAorCQlmZD0kezMtJGZ9CisJCWFjX3Rlc3Rkb25lCisJCXJldHVybiAxCisJZmkKKwlmYz0wCisJaWYgdGVzdCB4IiQyIiA9IHgiIjsgdGhlbgorCQlmdD0xCisJZWxzZQorCQlpZiB0ZXN0IHgiJDIiID0geCIhIjsgdGhlbgorCQkJZmM9MQorCQkJc2hpZnQKKwkJZmkKKwkJZXZhbCBmdD1cJEhBVkVfYHVwcGVyICQyYAorCQlzaGlmdAorCWZpCisJZmQ9JHszLSRmfQorCWlmIHRlc3QgJGZjID0gIiRmdCI7IHRoZW4KKwkJZnY9JDIKKwkJZng9JyAoaW1wbGllZCknCisJCWFjX3Rlc3Rkb25lCisJCXJldHVybiAxCisJZmkKKwkkZSAuLi4gJGZkCisJcmV0dXJuIDAKK30KKworIyBwaXBlIC5jIHwgYWNfdGVzdFtuXSBbIV0gbGFiZWwgWyFdIGNoZWNraWZbIV0wIFtzZXRsYWJlbGlmY2hlY2tpc1shXTBdIHVzZXJvdXRwdXQKK2FjX3Rlc3RuKCkgeworCWlmIHRlc3QgeCIkMSIgPSB4IiEiOyB0aGVuCisJCWZyPTEKKwkJc2hpZnQKKwllbHNlCisJCWZyPTAKKwlmaQorCWFjX3Rlc3Rpbml0ICIkQCIgfHwgcmV0dXJuCisJY2F0ID5jb25mdGVzdC5jCisJdnYgJ10nICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiBjb25mdGVzdC5jICRMSUJTICRjY3ByIgorCXRlc3QgJHRjZm4gPSBubyAmJiB0ZXN0IC1mIGEub3V0ICYmIHRjZm49YS5vdXQKKwl0ZXN0ICR0Y2ZuID0gbm8gJiYgdGVzdCAtZiBhLmV4ZSAmJiB0Y2ZuPWEuZXhlCisJdGVzdCAkdGNmbiA9IG5vICYmIHRlc3QgLWYgY29uZnRlc3QgJiYgdGNmbj1jb25mdGVzdAorCWlmIHRlc3QgLWYgJHRjZm47IHRoZW4KKwkJdGVzdCAxID0gJGZyIHx8IGZ2PTEKKwllbHNlCisJCXRlc3QgMCA9ICRmciB8fCBmdj0xCisJZmkKKwl2c2Nhbj0KKwlpZiB0ZXN0ICRwaGFzZSA9IHU7IHRoZW4KKwkJdGVzdCAkY3QgPSBnY2MgJiYgdnNjYW49J3VucmVjb2duaVtzel1lZCcKKwkJdGVzdCAkY3QgPSBocGNjICYmIHZzY2FuPSd1bnN1cHBvcnRlZCcKKwkJdGVzdCAkY3QgPSBwY2MgJiYgdnNjYW49J3Vuc3VwcG9ydGVkJworCQl0ZXN0ICRjdCA9IHN1bnBybyAmJiB2c2Nhbj0nLWUgaWdub3JlZCAtZSB0dXJuZWQub2ZmJworCWZpCisJdGVzdCAtbiAiJHZzY2FuIiAmJiBncmVwICR2c2NhbiB2di5vdXQgPi9kZXYvbnVsbCAyPiYxICYmIGZ2PSRmcgorCXJtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0Lm8gJHt0Y2ZufSogdnYub3V0CisJYWNfdGVzdGRvbmUKK30KKworIyBhY19pZmNwcCBjcHBleHByIFshXSBsYWJlbCBbIV0gY2hlY2tpZlshXTAgW3NldGxhYmVsaWZjaGVja2lzWyFdMF0gdXNlcm91dHB1dAorYWNfaWZjcHAoKSB7CisJZXhwcj0kMTsgc2hpZnQKKwlhY190ZXN0biAiJEAiIDw8LUVPRgorCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoCisJCSMkZXhwcgorCQkgICAgMAorCQkjZWxzZQorCQkvKiBmb3JjZSBhIGZhaWx1cmU6IGV4cHIgaXMgZmFsc2UgKi8KKwkJICAgIHRoaXN3aWxsbmV2ZXJiZWRlZmluZWRJaG9wZSgpCisJCSNlbmRpZgorCQkgICAgKTsgfQorRU9GCisJdGVzdCB4IiQxIiA9IHgiISIgJiYgc2hpZnQKKwlmPSQxCisJZnU9YHVwcGVyICRmYAorCWV2YWwgZnY9XCRIQVZFXyRmdQorCXRlc3QgeCIkZnYiID0geCIxIgorfQorCithY19jcHBmbGFncygpIHsKKwl0ZXN0IHgiJDEiID0geCIiIHx8IGZ1PSQxCisJZnY9JDIKKwl0ZXN0IHgiJDIiID0geCIiICYmIGV2YWwgZnY9XCRIQVZFXyRmdQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFXyRmdT0kZnYiCit9CisKK2FjX3Rlc3QoKSB7CisJYWNfdGVzdG4gIiRAIgorCWFjX2NwcGZsYWdzCit9CisKKyMgYWNfZmxhZ3MgWy1dIGFkZCB2YXJuYW1lIGZsYWdzIFt0ZXh0XQorYWNfZmxhZ3MoKSB7CisJaWYgdGVzdCB4IiQxIiA9IHgiLSI7IHRoZW4KKwkJc2hpZnQKKwkJaGY9MQorCWVsc2UKKwkJaGY9MAorCWZpCisJZmE9JDEKKwl2bj0kMgorCWY9JDMKKwlmdD0kNAorCXRlc3QgeCIkZnQiID0geCIiICYmIGZ0PSJpZiAkZiBjYW4gYmUgdXNlZCIKKwlzYXZlX0NGTEFHUz0kQ0ZMQUdTCisJQ0ZMQUdTPSIkQ0ZMQUdTICRmIgorCWlmIHRlc3QgMSA9ICRoZjsgdGhlbgorCQlhY190ZXN0biBjYW5fJHZuICcnICIkZnQiCisJZWxzZQorCQlhY190ZXN0biBjYW5fJHZuICcnICIkZnQiIDw8LSdFT0YnCisJCQkvKiBldmlsIGFwbydzdHJvcGggaW4gY29tbWVudCB0ZXN0ICovCisJCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0KKwkJRU9GCisJZmkKKwlldmFsIGZ2PVwkSEFWRV9DQU5fYHVwcGVyICR2bmAKKwl0ZXN0IDExID0gJGZhJGZ2IHx8IENGTEFHUz0kc2F2ZV9DRkxBR1MKK30KKworIyBhY19oZWFkZXIgWyFdIGhlYWRlciBbcHJlcmVxIC4uLl0KK2FjX2hlYWRlcigpIHsKKwlpZiB0ZXN0IHgiJDEiID0geCIhIjsgdGhlbgorCQluYT0xCisJCXNoaWZ0CisJZWxzZQorCQluYT0wCisJZmkKKwloZj0kMTsgc2hpZnQKKwlodj1gZWNobyAiJGhmIiB8IHRyIC1kICdcMDEyXDAxNScgfCB0ciAtYyAkYWxsbCRhbGx1JGFsbG4gJGFsbHNgCisJZm9yIGkKKwlkbworCQllY2hvICIjaW5jbHVkZSA8JGk+IiA+PngKKwlkb25lCisJZWNobyAiI2luY2x1ZGUgPCRoZj4iID4+eAorCWVjaG8gJ2ludCBtYWluKHZvaWQpIHsgcmV0dXJuICgwKTsgfScgPj54CisJYWNfdGVzdG4gIiRodiIgIiIgIjwkaGY+IiA8eAorCXJtZiB4CisJdGVzdCAxID0gJG5hIHx8IGFjX2NwcGZsYWdzCit9CisKK2FkZHNyY3MoKSB7CisJaWYgdGVzdCB4IiQxIiA9IHgiISI7IHRoZW4KKwkJZnI9MAorCQlzaGlmdAorCWVsc2UKKwkJZnI9MQorCWZpCisJZXZhbCBpPVwkJDEKKwl0ZXN0ICRmciA9ICIkaSIgJiYgY2FzZSAiICRTUkNTICIgaW4KKwkqXCAkMlwgKikJOzsKKwkqKQkJU1JDUz0iJFNSQ1MgJDIiIDs7CisJZXNhYworfQorCisKK2lmIHRlc3QgLWQgbWtzaCB8fCB0ZXN0IC1kIG1rc2guZXhlOyB0aGVuCisJZWNobyAiJG1lOiBFcnJvcjogLi9ta3NoIGlzIGEgZGlyZWN0b3J5ISIgPiYyCisJZXhpdCAxCitmaQorcm1mIGEuZXhlKiBhLm91dCogY29uZnRlc3QuYyAqY29yZSBsZnQgbWtzaCogbm8gKi5iYyAqLmxsICoubyBcCisgICAgUmVidWlsZC5zaCBzaWduYW1lcy5pbmMgdGVzdC5zaCB4IHZ2Lm91dAorCitjdXJkaXI9YHB3ZGAgc3JjZGlyPWBkaXJuYW1lICIkMCJgIGNoZWNrX2NhdGVnb3JpZXM9Cit0ZXN0IC1uICIkZGlybmFtZSIgfHwgZGlybmFtZT0uCitkc3R2ZXJzaW9uPWBzZWQgLW4gJy9kZWZpbmUgTUtTSF9WRVJTSU9OL3MvXi4qIlwoLipcKSIuKiQvXDEvcCcgJHNyY2Rpci9zaC5oYAorCitlPWVjaG8KK3I9MAorZXE9MAorcG09MAorY209bm9ybWFsCitvcHRmbGFncz0tc3RkLWNvbXBpbGUtb3B0cworbGFzdD0KKworZm9yIGkKK2RvCisJY2FzZSAkbGFzdDokaSBpbgorCWM6Y29tYmluZXxjOmRyYWdvbmVnZ3xjOmxsdm0pCisJCWNtPSRpCisJCWxhc3Q9CisJCTs7CisJYzoqKQorCQllY2hvICIkbWU6IFVua25vd24gb3B0aW9uIC1jICckaSchIiA+JjIKKwkJZXhpdCAxCisJCTs7CisJbzoqKQorCQlvcHRmbGFncz0kaQorCQlsYXN0PQorCQk7OworCTotYykKKwkJbGFzdD1jCisJCTs7CisJOi1jb21iaW5lKQorCQljbT1jb21iaW5lCisJCWVjaG8gIiRtZTogV2FybmluZzogJyRpJyBpcyBkZXByZWNhdGVkLCB1c2UgJy1jIGNvbWJpbmUnIGluc3RlYWQhIiA+JjIKKwkJOzsKKwk6LWcpCisJCSMgY2hlY2tlciwgZGVidWcsIHZhbGdyaW5kIGJ1aWxkCisJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURERUJVRyIKKwkJQ0ZMQUdTPSIkQ0ZMQUdTIC1nMyAtZm5vLWJ1aWx0aW4iCisJCTs7CisJOi1qKQorCQlwbT0xCisJCTs7CisJOi1sbHZtKQorCQljbT1sbHZtCisJCW9wdGZsYWdzPS1zdGQtY29tcGlsZS1vcHRzCisJCWVjaG8gIiRtZTogV2FybmluZzogJyRpJyBpcyBkZXByZWNhdGVkLCB1c2UgJy1jIGxsdm0gLU8nIGluc3RlYWQhIiA+JjIKKwkJOzsKKwk6LWxsdm09KikKKwkJY209bGx2bQorCQlvcHRmbGFncz1gZWNobyAieCRpIiB8IHNlZCAncy9eeC1sbHZtPS8vJ2AKKwkJZWNobyAiJG1lOiBXYXJuaW5nOiAnJGknIGlzIGRlcHJlY2F0ZWQsIHVzZSAnLWMgbGx2bSAtbyAkbGx2bScgaW5zdGVhZCEiID4mMgorCQk7OworCTotTSkKKwkJY209bWFrZWZpbGUKKwkJOzsKKwk6LU8pCisJCW9wdGZsYWdzPS1zdGQtY29tcGlsZS1vcHRzCisJCTs7CisJOi1vKQorCQlsYXN0PW8KKwkJOzsKKwk6LVEpCisJCWVxPTEKKwkJOzsKKwk6LXIpCisJCXI9MQorCQk7OworCTotdikKKwkJZWNobyAiQnVpbGQuc2ggJHNyY3ZlcnNpb24iCisJCWVjaG8gImZvciBta3NoICRkc3R2ZXJzaW9uIgorCQlleGl0IDAKKwkJOzsKKwk6KikKKwkJZWNobyAiJG1lOiBVbmtub3duIG9wdGlvbiAnJGknISIgPiYyCisJCWV4aXQgMQorCQk7OworCSopCisJCWVjaG8gIiRtZTogVW5rbm93biBvcHRpb24gLSckbGFzdCcgJyRpJyEiID4mMgorCQlleGl0IDEKKwkJOzsKKwllc2FjCitkb25lCitpZiB0ZXN0IC1uICIkbGFzdCI7IHRoZW4KKwllY2hvICIkbWU6IE9wdGlvbiAtJyRsYXN0JyBub3QgZm9sbG93ZWQgYnkgYXJndW1lbnQhIiA+JjIKKwlleGl0IDEKK2ZpCisKK1NSQ1M9ImxhbGxvYy5jIGVkaXQuYyBldmFsLmMgZXhlYy5jIGV4cHIuYyBmdW5jcy5jIGhpc3RyYXAuYyIKK1NSQ1M9IiRTUkNTIGpvYnMuYyBsZXguYyBtYWluLmMgbWlzYy5jIHNoZi5jIHN5bi5jIHRyZWUuYyB2YXIuYyIKKworaWYgdGVzdCB4IiRzcmNkaXIiID0geCIuIjsgdGhlbgorCUNQUEZMQUdTPSItSS4gJENQUEZMQUdTIgorZWxzZQorCUNQUEZMQUdTPSItSS4gLUknJHNyY2RpcicgJENQUEZMQUdTIgorZmkKKwordGVzdCB4IiRUQVJHRVRfT1MiID0geCIiICYmIFRBUkdFVF9PUz1gdW5hbWUgLXMgMj4vZGV2L251bGwgfHwgdW5hbWVgCitvc3dhcm49CitjY3BjPS1XYywKK2NjcGw9LVdsLAordHN0cz0KK2NjcHI9J3x8IGZvciBfZiBpbiAke3RjZm59KjsgZG8gdGVzdCB4IiR7X2Z9IiA9IHgibWtzaC4xIiB8fCBybSAtZiAiJHtfZn0iOyBkb25lJworCisjIENvbmZpZ3VyYXRpb24gZGVwZW5kaW5nIG9uIE9TIHJldmlzaW9uLCBvbiBPU2VzIHRoYXQgbmVlZCB0aGVtCitjYXNlICRUQVJHRVRfT1MgaW4KK1FOWCkKKwl0ZXN0IHgiJFRBUkdFVF9PU1JFViIgPSB4IiIgJiYgVEFSR0VUX09TUkVWPWB1bmFtZSAtcmAKKwk7OworZXNhYworCisjIENvbmZpZ3VyYXRpb24gZGVwZW5kaW5nIG9uIE9TIG5hbWUKK2Nhc2UgJFRBUkdFVF9PUyBpbgorQUlYKQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfQUxMX1NPVVJDRSIKKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworQmVPUykKKwlvc3dhcm49JyBhbmQgd2lsbCBjdXJyZW50bHkgbm90IHdvcmsnCisJOzsKK0JTRC9PUykKKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworQ1lHV0lOKikKKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworRGFyd2luKQorCTs7CitEcmFnb25GbHkpCisJOzsKK0ZyZWVCU0QpCisJOzsKK0dOVSkKKwkjIGRlZmluZSBOT19QQVRIX01BWCB0byB1c2UgSHVyZC1vbmx5IGZ1bmN0aW9ucworCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfR05VX1NPVVJDRSAtRE5PX1BBVEhfTUFYIgorCTs7CitHTlUva0ZyZWVCU0QpCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9HTlVfU09VUkNFIgorCTs7CitIYWlrdSkKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1ETUtTSF9BU1NVTUVfVVRGOCIKKwk7OworSFAtVVgpCisJOzsKK0ludGVyaXgpCisJY2NwYz0nLVggJworCWNjcGw9Jy1ZICcKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0FMTF9TT1VSQ0UiCisJOiAke0xJQlM9Jy1sY3J5cHQnfQorCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CitJUklYKikKKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworTGludXgpCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9HTlVfU09VUkNFIgorCTogJHtIQVZFX1JFVk9LRT0wfQorCTs7CitNaWRuaWdodEJTRCkKKwk7OworTWluaXgpCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRE1LU0hfVU5FTVBMT1lFRCAtRE1LU0hfQ09OU0VSVkFUSVZFX0ZEUyIKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX1BPU0lYX1NPVVJDRSAtRF9QT1NJWF8xX1NPVVJDRT0yIC1EX01JTklYIgorCW9sZGlzaF9lZD1uby1zdGRlcnItZWQJCSMgL3Vzci9iaW4vZWQoISkgaXMgYnJva2VuCisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKK01pckJTRCkKKwk7OworTmV0QlNEKQorCTs7CitPcGVuQlNEKQorCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CitPU0YxKQorCUhBVkVfU0lHX1Q9MAkjIGluY29tcGF0aWJsZQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfT1NGX1NPVVJDRSAtRF9QT1NJWF9DX1NPVVJDRT0yMDAxMTJMIgorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfWE9QRU5fU09VUkNFPTYwMCAtRF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQiCisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKK1BsYW45KQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfUE9TSVhfU09VUkNFIC1EX0xJTUlUU19FWFRFTlNJT04iCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9CU0RfRVhURU5TSU9OIC1EX1NVU1YyX1NPVVJDRSIKKwlvc3dhcm49JyBhbmQgd2lsbCBjdXJyZW50bHkgbm90IHdvcmsnCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRE1LU0hfQVNTVU1FX1VURjggLURNS1NIX1VORU1QTE9ZRUQiCisJOzsKK1BXMzIqKQorCUhBVkVfU0lHX1Q9MAkjIGluY29tcGF0aWJsZQorCW9zd2Fybj0nIGFuZCB3aWxsIGN1cnJlbnRseSBub3Qgd29yaycKKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworUU5YKQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfX05PX0VYVF9RTlgiCisJY2FzZSAkVEFSR0VUX09TUkVWIGluCisJWzAxMjM0NV0uKnw2LlswMTIzXS4qfDYuNC5bMDFdKQorCQlvbGRpc2hfZWQ9bm8tc3RkZXJyLWVkCQkjIG9sZGlzaCAvYmluL2VkIGlzIGJyb2tlbgorCQk7OworCWVzYWMKKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworU3VuT1MpCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9CU0RfU09VUkNFIC1EX19FWFRFTlNJT05TX18iCisJOzsKK3N5bGxhYmxlKQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfR05VX1NPVVJDRSIKKwlvc3dhcm49JyBhbmQgd2lsbCBjdXJyZW50bHkgbm90IHdvcmsnCisJOzsKK1VMVFJJWCkKKwk6ICR7Q0M9Y2MgLVlQT1NJWH0KKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1Ec3NpemVfdD1pbnQiCisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKK1VXSU4qKQorCWNjcGM9Jy1ZYywnCisJY2NwbD0nLVlsLCcKKwl0c3RzPSIgMzw+L2Rldi90dHkiCisJb3N3YXJuPSI7IGl0IHdpbGwgY29tcGlsZSwgYnV0IHRoZSB0YXJnZXQiCisJb3N3YXJuPSIkb3N3YXJuJHtubH1wbGF0Zm9ybSBpdHNlbGYgaXMgdmVyeSBmbGFrZXkvdW5yZWxpYWJsZSIKKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworKikKKwlvc3dhcm49JzsgaXQgbWF5IG9yIG1heSBub3Qgd29yaycKKwk7OworZXNhYworCis6ICR7Q0M9Y2N9ICR7TlJPRkY9bnJvZmZ9Cit0ZXN0IDAgPSAkciAmJiBlY2hvIHwgJE5ST0ZGIC12IDI+JjEgfCBncmVwIEdOVSA+L2Rldi9udWxsIDI+JjEgJiYgXAorICAgIE5ST0ZGPSIkTlJPRkYgLWMiCisKKyMgdGhpcyBhaWRzIG1lIGluIHRyYWNpbmcgRlRCRlNlbiB3aXRob3V0IGFjY2VzcyB0byB0aGUgYnVpbGRkCiskZSAiSGkgZnJvbSRhbyAkYmkkc3JjdmVyc2lvbiRhbyBvbjoiCitjYXNlICRUQVJHRVRfT1MgaW4KK0RhcndpbikKKwl2diAnfCcgImh3cHJlZnMgbWFjaGluZV90eXBlIG9zX3R5cGUgb3NfY2xhc3MgPiYyIgorCXZ2ICd8JyAidW5hbWUgLWEgPiYyIgorCTs7CitJUklYKikKKwl2diAnfCcgInVuYW1lIC1hID4mMiIKKwl2diAnfCcgImhpbnYgLXYgPiYyIgorCTs7CitPU0YxKQorCXZ2ICd8JyAidW5hbWUgLWEgPiYyIgorCXZ2ICd8JyAiL3Vzci9zYmluL3NpemVyIC12ID4mMiIKKwk7OworKikKKwl2diAnfCcgInVuYW1lIC1hID4mMiIKKwk7OworZXNhYwordGVzdCAteiAiJG9zd2FybiIgfHwgZWNobyA+JjIgIgorV2FybmluZzogbWtzaCBoYXMgbm90IHlldCBiZWVuIHBvcnRlZCB0byBvciB0ZXN0ZWQgb24geW91cgorb3BlcmF0aW5nIHN5c3RlbSAnJFRBUkdFVF9PUyckb3N3YXJuLiBJZiB5b3UgY2FuIHByb3ZpZGUKK2Egc2hlbGwgYWNjb3VudCB0byB0aGUgZGV2ZWxvcGVyLCB0aGlzIG1heSBpbXByb3ZlOyBwbGVhc2UKK2Ryb3AgdXMgYSBzdWNjZXNzIG9yIGZhaWx1cmUgbm90aWNlIG9yIGV2ZW4gc2VuZCBpbiBkaWZmcy4KKyIKKyRlICIkYmkkbWU6IEJ1aWxkaW5nIHRoZSBNaXJCU0QgS29ybiBTaGVsbCRhbyAkdWkkZHN0dmVyc2lvbiRhbyIKKworIworIyBCZWdpbiBvZiBtaXJ0b2NvbmYgY2hlY2tzCisjCiskZSAkYmkkbWU6IFNjYW5uaW5nIGZvciBmdW5jdGlvbnMuLi4gcGxlYXNlIGlnbm9yZSBhbnkgZXJyb3JzLiRhbworCisjCisjIENvbXBpbGVyOiB3aGljaCBvbmU/CisjCisjIG5vdGVzOgorIyAtIElDQyBkZWZpbmVzIF9fR05VQ19fIHRvbworIyAtIEdDQyBkZWZpbmVzIF9faHB1eCB0b28KKyMgLSBMTFZNK2NsYW5nIGRlZmluZXMgX19HTlVDX18gdG9vCisjIC0gbndjYyBkZWZpbmVzIF9fR05VQ19fIHRvbworQ1BQPSIkQ0MgLUUiCiskZSAuLi4gd2hpY2ggY29tcGlsZXIgc2VlbXMgdG8gYmUgdXNlZAorY2F0ID5jb25mdGVzdC5jIDw8J0VPRicKKyNpZiBkZWZpbmVkKF9fSUNDKSB8fCBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCitjdD1pY2MKKyNlbGlmIGRlZmluZWQoX194bENfXykgfHwgZGVmaW5lZChfX0lCTUNfXykKK2N0PXhsYworI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKQorY3Q9c3VucHJvCisjZWxpZiBkZWZpbmVkKF9fQUNLX18pCitjdD1hY2sKKyNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKQorY3Q9YmNjCisjZWxpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQorY3Q9d2F0Y29tCisjZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pCitjdD1tZXRyb3dlcmtzCisjZWxpZiBkZWZpbmVkKF9fSFBfY2MpCitjdD1ocGNjCisjZWxpZiBkZWZpbmVkKF9fREVDQykgfHwgKGRlZmluZWQoX19vc2ZfXykgJiYgIWRlZmluZWQoX19HTlVDX18pKQorY3Q9ZGVjCisjZWxpZiBkZWZpbmVkKF9fUEdJKQorY3Q9cGdpCisjZWxpZiBkZWZpbmVkKF9fRE1DX18pCitjdD1kbWMKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCitjdD1tc2MKKyNlbGlmIGRlZmluZWQoX19BRFNQQkxBQ0tGSU5fXykgfHwgZGVmaW5lZChfX0FEU1BUU19fKSB8fCBkZWZpbmVkKF9fQURTUDIxMDAwX18pCitjdD1hZHNwCisjZWxpZiBkZWZpbmVkKF9fSUFSX1NZU1RFTVNfSUNDX18pCitjdD1pYXIKKyNlbGlmIGRlZmluZWQoU0RDQykKK2N0PXNkY2MKKyNlbGlmIGRlZmluZWQoX19QQ0NfXykKK2N0PXBjYworI2VsaWYgZGVmaW5lZChfX1RlbkRSQV9fKQorY3Q9dGVuZHJhCisjZWxpZiBkZWZpbmVkKF9fVElOWUNfXykKK2N0PXRjYworI2VsaWYgZGVmaW5lZChfX2xsdm1fXykgJiYgZGVmaW5lZChfX2NsYW5nX18pCitjdD1jbGFuZworI2VsaWYgZGVmaW5lZChfX05XQ0NfXykKK2N0PW53Y2MKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCitjdD1nY2MKKyNlbGlmIGRlZmluZWQoX0NPTVBJTEVSX1ZFUlNJT04pCitjdD1taXBzcHJvCisjZWxpZiBkZWZpbmVkKF9fc2dpKQorY3Q9bWlwc3BybworI2VsaWYgZGVmaW5lZChfX2hwdXgpIHx8IGRlZmluZWQoX19ocHVhKQorY3Q9aHBjYworI2VsaWYgZGVmaW5lZChfX3VsdHJpeCkKK2N0PXVjb2RlCisjZWxzZQorY3Q9dW5rbm93bgorI2VuZGlmCitFT0YKK2N0PXVua25vd24KK3Z2ICddJyAiJENQUCAkQ0ZMQUdTICRDUFBGTEFHUyAkTk9XQVJOIGNvbmZ0ZXN0LmMgfCBncmVwIGN0PSB8IHRyIC1kIFxcXFwwMTUgPngiCitzZWQgJ3MvXi9bIC8nIHgKK2V2YWwgYGNhdCB4YAorcm1mIHggdnYub3V0CitlY2hvICdpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0nID5jb25mdGVzdC5jCitjYXNlICRjdCBpbgorYWNrKQorCSMgd29yayBhcm91bmQgInRoZSBmYW1vdXMgQUNLIGNvbnN0IGJ1ZyIKKwlDUFBGTEFHUz0iLURjb25zdD0gJENQUEZMQUdTIgorCTs7CithZHNwKQorCWVjaG8gPiYyICdXYXJuaW5nOiBBbmFsb2cgRGV2aWNlcyBDKysgY29tcGlsZXIgZm9yIEJsYWNrZmluLCBUaWdlclNIQVJDCisgICAgYW5kIFNIQVJDICgyMTAwMCkgRFNQcyBkZXRlY3RlZC4gVGhpcyBjb21waWxlciBoYXMgbm90IHlldAorICAgIGJlZW4gdGVzdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbWtzaC4gQ29udGludWUgYXQgeW91cgorICAgIG93biByaXNrLCBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4nCisJOzsKK2JjYykKKwllY2hvID4mMiAiV2FybmluZzogQm9ybGFuZCBDKysgQnVpbGRlciBkZXRlY3RlZC4gVGhpcyBjb21waWxlciBtaWdodAorICAgIHByb2R1Y2UgYnJva2VuIGV4ZWN1dGFibGVzLiBDb250aW51ZSBhdCB5b3VyIG93biByaXNrLAorICAgIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLiIKKwk7OworY2xhbmcpCisJIyBkb2VzIG5vdCB3b3JrIHdpdGggY3VycmVudCAiY2NjIiBjb21waWxlciBkcml2ZXIKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC12ZXJzaW9uIgorCSMgdGhpcyB3b3JrcywgZm9yIG5vdworCXZ2ICd8JyAiJHtDTEFORy1jbGFuZ30gLXZlcnNpb24iCisJIyBlbnN1cmUgY29tcGlsZXIgYW5kIGxpbmtlciBhcmUgaW4gc3luYyB1bmxlc3Mgb3ZlcnJpZGRlbgorCWNhc2UgJENDQ19DQzokQ0NDX0xEIGluCisJOiopCTs7CisJKjopCUNDQ19MRD0kQ0NDX0NDOyBleHBvcnQgQ0NDX0xEIDs7CisJZXNhYworCTs7CitkZWMpCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtViIKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOIC1XbCwtViBjb25mdGVzdC5jICRMSUJTIgorCTs7CitkbWMpCisJZWNobyA+JjIgIldhcm5pbmc6IERpZ2l0YWwgTWFycyBDb21waWxlciBkZXRlY3RlZC4gV2hlbiBydW5uaW5nIHVuZGVyIgorCWVjaG8gPiYyICIgICAgVVdJTiwgbWtzaCB0ZW5kcyB0byBiZSB1bnN0YWJsZSBkdWUgdG8gdGhlIGxpbWl0YXRpb25zIgorCWVjaG8gPiYyICIgICAgb2YgdGhpcyBwbGF0Zm9ybS4gQ29udGludWUgYXQgeW91ciBvd24gcmlzaywiCisJZWNobyA+JjIgIiAgICBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4iCisJOzsKK2djYykKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOIC12IGNvbmZ0ZXN0LmMgJExJQlMiCisJdnYgJ3wnICdlY2hvIGAkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyBcCisJICAgIC1kdW1wbWFjaGluZWAgZ2NjYCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOIFwKKwkgICAgJExJQlMgLWR1bXB2ZXJzaW9uYCcKKwk7OworaHBjYykKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOIC1WIGNvbmZ0ZXN0LmMgJExJQlMiCisJOzsKK2lhcikKKwllY2hvID4mMiAnV2FybmluZzogSUFSIFN5c3RlbXMgKGh0dHA6Ly93d3cuaWFyLmNvbSkgY29tcGlsZXIgZm9yIGVtYmVkZGVkCisgICAgc3lzdGVtcyBkZXRlY3RlZC4gVGhpcyB1bnN1cHBvcnRlZCBjb21waWxlciBoYXMgbm90IHlldAorICAgIGJlZW4gdGVzdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbWtzaC4gQ29udGludWUgYXQgeW91cgorICAgIG93biByaXNrLCBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4nCisJOzsKK2ljYykKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC1WIgorCTs7CittZXRyb3dlcmtzKQorCWVjaG8gPiYyICdXYXJuaW5nOiBNZXRyb3dlcmtzIEMgY29tcGlsZXIgZGV0ZWN0ZWQuIFRoaXMgaGFzIG5vdCB5ZXQKKyAgICBiZWVuIHRlc3RlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1rc2guIENvbnRpbnVlIGF0IHlvdXIKKyAgICBvd24gcmlzaywgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuJworCTs7CittaXBzcHJvKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLXZlcnNpb24iCisJOzsKK21zYykKKwljY3ByPQkJIyBlcnJvcmxldmVscyBhcmUgbm90IHJlbGlhYmxlCisJY2FzZSAkVEFSR0VUX09TIGluCisJSW50ZXJpeCkKKwkJaWYgW1sgLW4gJEM4OV9DT01QSUxFUiBdXTsgdGhlbgorCQkJQzg5X0NPTVBJTEVSPWBudHBhdGgycG9zaXggLWMgIiRDODlfQ09NUElMRVIiYAorCQllbHNlCisJCQlDODlfQ09NUElMRVI9Q0wuRVhFCisJCWZpCisJCWlmIFtbIC1uICRDODlfTElOS0VSIF1dOyB0aGVuCisJCQlDODlfTElOS0VSPWBudHBhdGgycG9zaXggLWMgIiRDODlfTElOS0VSImAKKwkJZWxzZQorCQkJQzg5X0xJTktFUj1MSU5LLkVYRQorCQlmaQorCQl2diAnfCcgIiRDODlfQ09NUElMRVIgL0hFTFAgPiYyIgorCQl2diAnfCcgIiRDODlfTElOS0VSIC9MSU5LID4mMiIKKwkJOzsKKwllc2FjCisJOzsKK253Y2MpCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtdmVyc2lvbiIKKwk7OworcGNjKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLXYiCisJOzsKK3BnaSkKKwllY2hvID4mMiAnV2FybmluZzogUEdJIGRldGVjdGVkLiBUaGlzIHVua25vd24gY29tcGlsZXIgaGFzIG5vdCB5ZXQKKyAgICBiZWVuIHRlc3RlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1rc2guIENvbnRpbnVlIGF0IHlvdXIKKyAgICBvd24gcmlzaywgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuJworCTs7CitzZGNjKQorCWVjaG8gPiYyICdXYXJuaW5nOiBzZGNjIChodHRwOi8vc2RjYy5zb3VyY2Vmb3JnZS5uZXQpLCB0aGUgc21hbGwgZGV2aWNlcworICAgIEMgY29tcGlsZXIgZm9yIGVtYmVkZGVkIHN5c3RlbXMgZGV0ZWN0ZWQuIFRoaXMgaGFzIG5vdCB5ZXQKKyAgICBiZWVuIHRlc3RlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1rc2guIENvbnRpbnVlIGF0IHlvdXIKKyAgICBvd24gcmlzaywgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuJworCTs7CitzdW5wcm8pCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAtViBjb25mdGVzdC5jICRMSUJTIgorCTs7Cit0Y2MpCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtdiIKKwk7OwordGVuZHJhKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLVYgMj4mMSB8IFwKKwkgICAgZmdyZXAgLWkgLWUgdmVyc2lvbiAtZSByZWxlYXNlIgorCTs7Cit1Y29kZSkKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC1WIgorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gLVdsLC1WIGNvbmZ0ZXN0LmMgJExJQlMiCisJOzsKK3dhdGNvbSkKKwllY2hvID4mMiAnV2FybmluZzogV2F0Y29tIEMgQ29tcGlsZXIgZGV0ZWN0ZWQuIFRoaXMgY29tcGlsZXIgaGFzIG5vdCB5ZXQKKyAgICBiZWVuIHRlc3RlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1rc2guIENvbnRpbnVlIGF0IHlvdXIKKyAgICBvd24gcmlzaywgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuJworCTs7Cit4bGMpCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtcXZlcnNpb249dmVyYm9zZSIKKwl2diAnfCcgImxkIC1WIgorCTs7CisqKQorCWN0PXVua25vd24KKwk7OworZXNhYworY2FzZSAkY20gaW4KK2RyYWdvbmVnZ3xsbHZtKQorCXZ2ICd8JyAibGxjIC12ZXJzaW9uIgorCTs7Citlc2FjCiskZSAiJGJpPT0+IHdoaWNoIGNvbXBpbGVyIHNlZW1zIHRvIGJlIHVzZWQuLi4kYW8gJHVpJGN0JGFvIgorcm1mIGNvbmZ0ZXN0LmMgY29uZnRlc3QubyBjb25mdGVzdCBhLm91dCogYS5leGUqIHZ2Lm91dAorCisjCisjIENvbXBpbGVyOiB3b3JrcyBhcy1pcywgd2l0aCAtV25vLWVycm9yIGFuZCAtV2Vycm9yCisjCitzYXZlX05PV0FSTj0kTk9XQVJOCitOT1dBUk49CitET1dBUk49CithY19mbGFncyAwIGNvbXBpbGVyX3dvcmtzICcnICdpZiB0aGUgY29tcGlsZXIgd29ya3MnCit0ZXN0IDEgPSAkSEFWRV9DQU5fQ09NUElMRVJfV09SS1MgfHwgZXhpdCAxCitIQVZFX0NPTVBJTEVSX0tOT1dOPTAKK3Rlc3QgJGN0ID0gdW5rbm93biB8fCBIQVZFX0NPTVBJTEVSX0tOT1dOPTEKK2lmIGFjX2lmY3BwICdpZiAwJyBjb21waWxlcl9mYWlscyAnJyBcCisgICAgJ2lmIHRoZSBjb21waWxlciBkb2VzIG5vdCBmYWlsIGNvcnJlY3RseSc7IHRoZW4KKwlzYXZlX0NGTEFHUz0kQ0ZMQUdTCisJOiAke0hBVkVfQ0FOX0RFTEVYRT14fQorCWlmIHRlc3QgJGN0ID0gZG1jOyB0aGVuCisJCUNGTEFHUz0iJENGTEFHUyAke2NjcGx9L0RFTEVYRUNVVEFCTEUiCisJCWFjX3Rlc3RuIGNhbl9kZWxleGUgY29tcGlsZXJfZmFpbHMgMCAnZm9yIHRoZSAvREVMRVhFQ1VUQUJMRSBsaW5rZXIgb3B0aW9uJyA8PC1FT0YKKwkJCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgwKTsgfQorCQlFT0YKKwllbGlmIHRlc3QgJGN0ID0gZGVjOyB0aGVuCisJCUNGTEFHUz0iJENGTEFHUyAke2NjcGx9LW5vbl9zaGFyZWQiCisJCWFjX3Rlc3RuIGNhbl9kZWxleGUgY29tcGlsZXJfZmFpbHMgMCAnZm9yIHRoZSAtbm9uX3NoYXJlZCBsaW5rZXIgb3B0aW9uJyA8PC1FT0YKKwkJCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgwKTsgfQorCQlFT0YKKwllbHNlCisJCWV4aXQgMQorCWZpCisJdGVzdCAxID0gJEhBVkVfQ0FOX0RFTEVYRSB8fCBDRkxBR1M9JHNhdmVfQ0ZMQUdTCisJYWNfdGVzdG4gY29tcGlsZXJfc3RpbGxfZmFpbHMgJycgJ2lmIHRoZSBjb21waWxlciBzdGlsbCBkb2VzIG5vdCBmYWlsIGNvcnJlY3RseScgPDwtRU9GCisJRU9GCisJdGVzdCAxID0gJEhBVkVfQ09NUElMRVJfU1RJTExfRkFJTFMgJiYgZXhpdCAxCitmaQoraWYgYWNfaWZjcHAgJ2lmZGVmIF9fVElOWUNfXycgY291bGRiZV90Y2MgJyEnIGNvbXBpbGVyX2tub3duIDAgXAorICAgICdpZiB0aGlzIGNvdWxkIGJlIHRjYyc7IHRoZW4KKwljdD10Y2MKKwlDUFA9J2NwcCAtRF9fVElOWUNfXycKK2ZpCisKK2lmIHRlc3QgJGN0ID0gc3VucHJvOyB0aGVuCisJdGVzdCB4IiRzYXZlX05PV0FSTiIgPSB4IiIgJiYgc2F2ZV9OT1dBUk49Jy1lcnJ3YXJuPSVub25lJworCWFjX2ZsYWdzIDAgZXJyd2Fybm5vbmUgIiRzYXZlX05PV0FSTiIKKwl0ZXN0IDEgPSAkSEFWRV9DQU5fRVJSV0FSTk5PTkUgfHwgc2F2ZV9OT1dBUk49CisJYWNfZmxhZ3MgMCBlcnJ3YXJuYWxsICItZXJyd2Fybj0lYWxsIgorCXRlc3QgMSA9ICRIQVZFX0NBTl9FUlJXQVJOQUxMICYmIERPV0FSTj0iLWVycndhcm49JWFsbCIKK2VsaWYgdGVzdCAkY3QgPSBocGNjOyB0aGVuCisJc2F2ZV9OT1dBUk49CisJRE9XQVJOPStXZQorZWxpZiB0ZXN0ICRjdCA9IG1pcHNwcm87IHRoZW4KKwlzYXZlX05PV0FSTj0KKwlET1dBUk49Ii1kaWFnX2Vycm9yIDEtMTAwMDAiCitlbGlmIHRlc3QgJGN0ID0gbXNjOyB0aGVuCisJc2F2ZV9OT1dBUk49IiR7Y2NwY30vdyIKKwlET1dBUk49IiR7Y2NwY30vV1giCitlbGlmIHRlc3QgJGN0ID0gZG1jOyB0aGVuCisJc2F2ZV9OT1dBUk49IiR7Y2NwY30tdyIKKwlET1dBUk49IiR7Y2NwY30td3giCitlbGlmIHRlc3QgJGN0ID0gYmNjOyB0aGVuCisJc2F2ZV9OT1dBUk49IiR7Y2NwY30tdyIKKwlET1dBUk49IiR7Y2NwY30tdyEiCitlbGlmIHRlc3QgJGN0ID0gZGVjOyB0aGVuCisJOiAtbXNnXyogZmxhZ3Mgbm90IHVzZWQgeWV0LCBvciBpcyAtdzIgY29ycmVjdD8KK2VsaWYgdGVzdCAkY3QgPSB4bGM7IHRoZW4KKwlzYXZlX05PV0FSTj0tcWZsYWc9aTplCisJRE9XQVJOPS1xZmxhZz1pOmkKK2VsaWYgdGVzdCAkY3QgPSB0ZW5kcmE7IHRoZW4KKwlzYXZlX05PV0FSTj0tdworZWxpZiB0ZXN0ICRjdCA9IHVjb2RlOyB0aGVuCisJc2F2ZV9OT1dBUk49CisJRE9XQVJOPS13MgorZWxzZQorCXRlc3QgeCIkc2F2ZV9OT1dBUk4iID0geCIiICYmIHNhdmVfTk9XQVJOPS1Xbm8tZXJyb3IKKwlhY19mbGFncyAwIHdub2Vycm9yICIkc2F2ZV9OT1dBUk4iCisJdGVzdCAxID0gJEhBVkVfQ0FOX1dOT0VSUk9SIHx8IHNhdmVfTk9XQVJOPQorCWFjX2ZsYWdzIDAgd2Vycm9yIC1XZXJyb3IKKwl0ZXN0IDEgPSAkSEFWRV9DQU5fV0VSUk9SICYmIERPV0FSTj0tV2Vycm9yCitmaQorCit0ZXN0ICRjdCA9IGljYyAmJiBET1dBUk49IiRET1dBUk4gLXdkMTQxOSIKK05PV0FSTj0kc2F2ZV9OT1dBUk4KKworIworIyBDb21waWxlcjogZXh0cmEgZmxhZ3MgKC1PMiAtZiogLVcqIGV0Yy4pCisjCitpPWBlY2hvIDoiJG9yaWdfQ0ZMQUdTIiB8IHNlZCAncy9eOi8vJyB8IHRyIC1jIC1kICRhbGxsJGFsbHUkYWxsbmAKKyMgb3B0aW1pc2F0aW9uOiBvbmx5IGlmIG9yaWdfQ0ZMQUdTIGlzIGVtcHR5Cit0ZXN0IHgiJGkiID0geCIiICYmIGlmIHRlc3QgJGN0ID0gc3VucHJvOyB0aGVuCisJY2F0ID54IDw8LSdFT0YnCisJCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgwKTsgfQorCQkjZGVmaW5lIF9fSURTVFJJTkdfQ09OQ0FUKGwscCkJX19MSU5URURfXyAjIyBsICMjIF8gIyMgcAorCQkjZGVmaW5lIF9fSURTVFJJTkdfRVhQQU5EKGwscCkJX19JRFNUUklOR19DT05DQVQobCxwKQorCQkjZGVmaW5lIHBhZAkJCXZvaWQgX19JRFNUUklOR19FWFBBTkQoX19MSU5FX18seCkodm9pZCkgeyB9CisJRU9GCisJeWVzIHBhZCB8IGhlYWQgLW4gMjU2ID4+eAorCWFjX2ZsYWdzIC0gMSBvdHdvIC14TzIgPHgKKwlybWYgeAorZWxpZiB0ZXN0ICRjdCA9IGhwY2M7IHRoZW4KKwlwaGFzZT11CisJYWNfZmxhZ3MgMSBvdHdvICtPMgorCXBoYXNlPXgKK2VsaWYgdGVzdCAkY3QgPSB4bGM7IHRoZW4KKwlhY19mbGFncyAxIG90aHJlZSAiLU8zIC1xc3RyaWN0IgorCXRlc3QgMSA9ICRIQVZFX0NBTl9PVEhSRUUgfHwgYWNfZmxhZ3MgMSBvdHdvIC1PMgorZWxpZiB0ZXN0ICRjdCA9IHRjYyB8fCB0ZXN0ICRjdCA9IHRlbmRyYTsgdGhlbgorCTogbm8gc3BlY2lhbCBvcHRpbWlzYXRpb24KK2Vsc2UKKwlhY19mbGFncyAxIG90d28gLU8yCisJdGVzdCAxID0gJEhBVkVfQ0FOX09UV08gfHwgYWNfZmxhZ3MgMSBvcHRpbWlzZSAtTworZmkKKyMgb3RoZXIgZmxhZ3M6IGp1c3QgYWRkIHRoZW0gaWYgdGhleSBhcmUgc3VwcG9ydGVkCitpPTAKK2lmIHRlc3QgJGN0ID0gZ2NjOyB0aGVuCisJIyBUaGUgZm9sbG93aW5nIHRlc3RzIHJ1biB3aXRoIC1XZXJyb3IgKGdjYyBvbmx5KSBpZiBwb3NzaWJsZQorCU5PV0FSTj0kRE9XQVJOOyBwaGFzZT11CisJYWNfZmxhZ3MgMSBmbm9zdHJpY3RhbGlhc2luZyAtZm5vLXN0cmljdC1hbGlhc2luZworCWFjX2ZsYWdzIDEgZnN0YWNrcHJvdGVjdG9yYWxsIC1mc3RhY2stcHJvdGVjdG9yLWFsbAorCWFjX2ZsYWdzIDEgZndyYXB2IC1md3JhcHYKKwl0ZXN0ICRjbSA9IGNvbWJpbmUgJiYgYWNfZmxhZ3MgMCBjb21iaW5lIFwKKwkgICAgJy1md2hvbGUtcHJvZ3JhbSAtLWNvbWJpbmUnIFwKKwkgICAgJ2lmIGdjYyBzdXBwb3J0cyAtZndob2xlLXByb2dyYW0gLS1jb21iaW5lJworCWk9MQorZWxpZiB0ZXN0ICRjdCA9IGljYzsgdGhlbgorCWFjX2ZsYWdzIDEgZm5vYnVpbHRpbnNldG1vZGUgLWZuby1idWlsdGluLXNldG1vZGUKKwlhY19mbGFncyAxIGZub3N0cmljdGFsaWFzaW5nIC1mbm8tc3RyaWN0LWFsaWFzaW5nCisJYWNfZmxhZ3MgMSBmc3RhY2tzZWN1cml0eWNoZWNrIC1mc3RhY2stc2VjdXJpdHktY2hlY2sKKwlpPTEKK2VsaWYgdGVzdCAkY3QgPSBzdW5wcm87IHRoZW4KKwlwaGFzZT11CisJYWNfZmxhZ3MgMSB2IC12CisJYWNfZmxhZ3MgMSB4Yzk5IC14Yzk5ICdmb3Igc3VwcG9ydCBvZiBJU08gQzk5JworCWFjX2ZsYWdzIDEgaXBvIC14aXBvICdmb3IgY3Jvc3MtbW9kdWxlIG9wdGltaXNhdGlvbicKKwlwaGFzZT14CitlbGlmIHRlc3QgJGN0ID0gaHBjYzsgdGhlbgorCXBoYXNlPXUKKwlhY19mbGFncyAxIGFnY2MgLUFnY2MgJ2ZvciBzdXBwb3J0IG9mIEdDQyBleHRlbnNpb25zJworCWFjX2ZsYWdzIDEgYWM5OSAtQUM5OSAnZm9yIHN1cHBvcnQgb2YgSVNPIEM5OScKKwlwaGFzZT14CitlbGlmIHRlc3QgJGN0ID0gZGVjOyB0aGVuCisJYWNfZmxhZ3MgMCB2ZXJiIC12ZXJib3NlCisJYWNfZmxhZ3MgMSByb2RhdGEgLXJlYWRvbmx5X3N0cmluZ3MKK2VsaWYgdGVzdCAkY3QgPSBkbWM7IHRoZW4KKwlhY19mbGFncyAxIGRlY2wgIiR7Y2NwY30tciIgJ2ZvciBzdHJpY3QgcHJvdG90eXBlIGNoZWNrcycKKwlhY19mbGFncyAxIHNjaGsgIiR7Y2NwY30tcyIgJ2ZvciBzdGFjayBvdmVyZmxvdyBjaGVja2luZycKK2VsaWYgdGVzdCAkY3QgPSBiY2M7IHRoZW4KKwlhY19mbGFncyAxIHN0cnBvb2wgIiR7Y2NwY30tZCIgJ2lmIHN0cmluZyBwb29saW5nIGNhbiBiZSBlbmFibGVkJworZWxpZiB0ZXN0ICRjdCA9IG1pcHNwcm87IHRoZW4KKwlhY19mbGFncyAxIHhjOTkgLWM5OSAnZm9yIHN1cHBvcnQgb2YgSVNPIEM5OScKKwlhY19mbGFncyAxIGZ1bGx3YXJuIC1mdWxsd2FybiAnZm9yIHJlbWFyayBvdXRwdXQgc3VwcG9ydCcKK2VsaWYgdGVzdCAkY3QgPSBtc2M7IHRoZW4KKwlhY19mbGFncyAxIHN0cnBvb2wgIiR7Y2NwY30vR0YiICdpZiBzdHJpbmcgcG9vbGluZyBjYW4gYmUgZW5hYmxlZCcKKwllY2hvICdpbnQgbWFpbih2b2lkKSB7IGNoYXIgdGVzdFs2NF0gPSAiIjsgcmV0dXJuICgqdGVzdCk7IH0nID54CisJYWNfZmxhZ3MgLSAxIHN0YWNrb24gIiR7Y2NwY30vR1oiICdpZiBzdGFjayBjaGVja3MgY2FuIGJlIGVuYWJsZWQnIDx4CisJYWNfZmxhZ3MgLSAxIHN0Y2thbGwgIiR7Y2NwY30vR2UiICdzdGFjayBjaGVja3MgZm9yIGFsbCBmdW5jdGlvbnMnIDx4CisJYWNfZmxhZ3MgLSAxIHNlY3VjaGsgIiR7Y2NwY30vR1MiICdmb3IgY29tcGlsZXIgc2VjdXJpdHkgY2hlY2tzJyA8eAorCXJtZiB4CisJYWNfZmxhZ3MgMSB3YWxsICIke2NjcGN9L1dhbGwiICd0byBlbmFibGUgYWxsIHdhcm5pbmdzJworCWFjX2ZsYWdzIDEgd3A2NCAiJHtjY3BjfS9XcDY0IiAndG8gZW5hYmxlIDY0LWJpdCB3YXJuaW5ncycKK2VsaWYgdGVzdCAkY3QgPSB4bGM7IHRoZW4KKwlhY19mbGFncyAxIHg5OSAtcWxhbmdsdmw9ZXh0Yzk5CisJdGVzdCAxID0gJEhBVkVfQ0FOX1g5OSB8fCBhY19mbGFncyAxIGM5OSAtcWxhbmdsdmw9c3RkYzk5CisJYWNfZmxhZ3MgMSByb2RhdGEgIi1xcm8gLXFyb2NvbnN0IC1xcm9wdHIiCisJYWNfZmxhZ3MgMSBydGNoZWNrIC1xY2hlY2s9YWxsCisJYWNfZmxhZ3MgMSBydGNoa2MgLXFleHRjaGsKKwlhY19mbGFncyAxIHdmb3JtYXQgIi1xZm9ybWF0PWFsbCAtcWZvcm1hdD1ub3psbiIKKwkjYWNfZmxhZ3MgMSB3cDY0IC1xd2FybjY0CSMgdG9vIHZlcmJvc2UgZm9yIG5vdworZWxpZiB0ZXN0ICRjdCA9IHRlbmRyYTsgdGhlbgorCWFjX2ZsYWdzIDAgeXN5c3RlbSAtWXN5c3RlbQorCXRlc3QgMSA9ICRIQVZFX0NBTl9ZU1lTVEVNICYmIENQUEZMQUdTPSItWXN5c3RlbSAkQ1BQRkxBR1MiCisJYWNfZmxhZ3MgMSBleHRhbnNpIC1YYQorZWxpZiB0ZXN0ICRjdCA9IHRjYzsgdGhlbgorCWFjX2ZsYWdzIDEgYm91bmRzY2hrIC1iCitlbGlmIHRlc3QgJGN0ID0gY2xhbmc7IHRoZW4KKwlpPTEKK2VsaWYgdGVzdCAkY3QgPSBud2NjOyB0aGVuCisJaT0xCisJI2Jyb2tlbiMgYWNfZmxhZ3MgMSBzc3AgLXN0YWNrcHJvdGVjdAorZmkKKyMgZmxhZ3MgY29tbW9uIHRvIGEgc3Vic2V0IG9mIGNvbXBpbGVycyAocnVuIHdpdGggLVdlcnJvciBvbiBnY2MpCitpZiB0ZXN0IDEgPSAkaTsgdGhlbgorCWFjX2ZsYWdzIDEgc3RkZzk5IC1zdGQ9Z251OTkgJ2ZvciBzdXBwb3J0IG9mIElTTyBDOTkgKyBHQ0MgZXh0ZW5zaW9ucycKKwl0ZXN0IDEgPSAkSEFWRV9DQU5fU1RERzk5IHx8IFwKKwkgICAgYWNfZmxhZ3MgMSBzdGRjOTkgLXN0ZD1jOTkgJ2ZvciBzdXBwb3J0IG9mIElTTyBDOTknCisJYWNfZmxhZ3MgMSB3YWxsIC1XYWxsCitmaQorcGhhc2U9eAorCisjIFRoZSBmb2xsb3dpbmcgdGVzdHMgcnVuIHdpdGggLVdlcnJvciBvciBzaW1pbGFyIChhbGwgY29tcGlsZXJzKSBpZiBwb3NzaWJsZQorTk9XQVJOPSRET1dBUk4KK3Rlc3QgJGN0ID0gcGNjICYmIHBoYXNlPXUKKworIworIyBDb21waWxlcjogY2hlY2sgZm9yIHN0dWZmIHRoYXQgb25seSBnZW5lcmF0ZXMgd2FybmluZ3MKKyMKK2FjX3Rlc3QgYXR0cmlidXRlX2JvdW5kZWQgJycgJ2ZvciBfX2F0dHJpYnV0ZV9fKChib3VuZGVkKSknIDw8LSdFT0YnCisJI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDIpCisJLyogZm9yY2UgYSBmYWlsdXJlOiBnY2MgMS40MiBoYXMgYSBmYWxzZSBwb3NpdGl2ZSBoZXJlICovCisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHRoaXN3aWxsbmV2ZXJiZWRlZmluZWRJaG9wZSgpKTsgfQorCSNlbHNlCisJI2luY2x1ZGUgPHN0cmluZy5oPgorCSN1bmRlZiBfX2F0dHJpYnV0ZV9fCisJaW50IHhjb3B5KGNvbnN0IHZvaWQgKiwgdm9pZCAqLCBzaXplX3QpCisJICAgIF9fYXR0cmlidXRlX18oKGJvdW5kZWQgKGJ1ZmZlciwgMSwgMykpKQorCSAgICBfX2F0dHJpYnV0ZV9fKChib3VuZGVkIChidWZmZXIsIDIsIDMpKSk7CisJaW50IG1haW4oaW50IGFjLCBjaGFyICphdltdKSB7IHJldHVybiAoeGNvcHkoYXZbMF0sIGF2Wy0tYWNdLCAxKSk7IH0KKwlpbnQgeGNvcHkoY29uc3Qgdm9pZCAqcywgdm9pZCAqZCwgc2l6ZV90IG4pIHsKKwkJbWVtbW92ZShkLCBzLCBuKTsgcmV0dXJuICgoaW50KW4pOworCX0KKwkjZW5kaWYKK0VPRgorYWNfdGVzdCBhdHRyaWJ1dGVfZm9ybWF0ICcnICdmb3IgX19hdHRyaWJ1dGVfXygoZm9ybWF0KSknIDw8LSdFT0YnCisJI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDIpCisJLyogZm9yY2UgYSBmYWlsdXJlOiBnY2MgMS40MiBoYXMgYSBmYWxzZSBwb3NpdGl2ZSBoZXJlICovCisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHRoaXN3aWxsbmV2ZXJiZWRlZmluZWRJaG9wZSgpKTsgfQorCSNlbHNlCisJI2luY2x1ZGUgPHN0ZGlvLmg+CisJI3VuZGVmIF9fYXR0cmlidXRlX18KKwkjdW5kZWYgcHJpbnRmCisJZXh0ZXJuIGludCBwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworCWludCBtYWluKGludCBhYywgY2hhciAqKmF2KSB7IHJldHVybiAocHJpbnRmKCIlcyVkIiwgKmF2LCBhYykpOyB9CisJI2VuZGlmCitFT0YKK2FjX3Rlc3QgYXR0cmlidXRlX25vbm51bGwgJycgJ2ZvciBfX2F0dHJpYnV0ZV9fKChub25udWxsKSknIDw8LSdFT0YnCisJI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDIpCisJLyogZm9yY2UgYSBmYWlsdXJlOiBnY2MgMS40MiBoYXMgYSBmYWxzZSBwb3NpdGl2ZSBoZXJlICovCisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHRoaXN3aWxsbmV2ZXJiZWRlZmluZWRJaG9wZSgpKTsgfQorCSNlbHNlCisJaW50IGZvbyhjaGFyICpzMSwgY2hhciAqczIpIF9fYXR0cmlidXRlX18oKG5vbm51bGwpKTsKKwlpbnQgYmFyKGNoYXIgKnMxLCBjaGFyICpzMikgX19hdHRyaWJ1dGVfXygobm9ubnVsbCAoMSwgMikpKTsKKwlpbnQgYmF6KGNoYXIgKnMpIF9fYXR0cmlidXRlX18oKG5vbm51bGwgKDEpKSk7CisJaW50IGZvbyhjaGFyICpzMSwgY2hhciAqczIpIHsgcmV0dXJuIChiYXIoczIsIHMxKSk7IH0KKwlpbnQgYmFyKGNoYXIgKnMxLCBjaGFyICpzMikgeyByZXR1cm4gKGJheihzMSkgLSBiYXooczIpKTsgfQorCWludCBiYXooY2hhciAqcykgeyByZXR1cm4gKCpzKTsgfQorCWludCBtYWluKGludCBhYywgY2hhciAqKmF2KSB7IHJldHVybiAoYWMgPT0gZm9vKGF2WzBdLCBhdlthYy0xXSkpOyB9CisJI2VuZGlmCitFT0YKK2FjX3Rlc3QgYXR0cmlidXRlX25vcmV0dXJuICcnICdmb3IgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKScgPDwtJ0VPRicKKwkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMikKKwkvKiBmb3JjZSBhIGZhaWx1cmU6IGdjYyAxLjQyIGhhcyBhIGZhbHNlIHBvc2l0aXZlIGhlcmUgKi8KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9CisJI2Vsc2UKKwkjaW5jbHVkZSA8c3RkbGliLmg+CisJI3VuZGVmIF9fYXR0cmlidXRlX18KKwl2b2lkIGZub3JkKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisJaW50IG1haW4odm9pZCkgeyBmbm9yZCgpOyB9CisJdm9pZCBmbm9yZCh2b2lkKSB7IGV4aXQoMCk7IH0KKwkjZW5kaWYKK0VPRgorYWNfdGVzdCBhdHRyaWJ1dGVfdW51c2VkICcnICdmb3IgX19hdHRyaWJ1dGVfXygodW51c2VkKSknIDw8LSdFT0YnCisJI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDIpCisJLyogZm9yY2UgYSBmYWlsdXJlOiBnY2MgMS40MiBoYXMgYSBmYWxzZSBwb3NpdGl2ZSBoZXJlICovCisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHRoaXN3aWxsbmV2ZXJiZWRlZmluZWRJaG9wZSgpKTsgfQorCSNlbHNlCisJaW50IG1haW4oaW50IGFjIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCBjaGFyICoqYXYKKwkgICAgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpIHsgcmV0dXJuICgwKTsgfQorCSNlbmRpZgorRU9GCithY190ZXN0IGF0dHJpYnV0ZV91c2VkICcnICdmb3IgX19hdHRyaWJ1dGVfXygodXNlZCkpJyA8PC0nRU9GJworCSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAyKQorCS8qIGZvcmNlIGEgZmFpbHVyZTogZ2NjIDEuNDIgaGFzIGEgZmFsc2UgcG9zaXRpdmUgaGVyZSAqLworCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KKwkjZWxzZQorCXN0YXRpYyBjb25zdCBjaGFyIGZub3JkW10gX19hdHRyaWJ1dGVfXygodXNlZCkpID0gIjQyIjsKKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0KKwkjZW5kaWYKK0VPRgorCisjIEVuZCBvZiB0ZXN0cyBydW4gd2l0aCAtV2Vycm9yCitOT1dBUk49JHNhdmVfTk9XQVJOCitwaGFzZT14CisKKyMKKyMgbWtzaDogZmxhdm91cnMgKGZ1bGwvc21hbGwgbWtzaCwgb21pdCBjZXJ0YWluIHN0dWZmKQorIworaWYgYWNfaWZjcHAgJ2lmZGVmIE1LU0hfU01BTEwnIGlzc2V0X01LU0hfU01BTEwgJycgXAorICAgICJpZiBhIHJlZHVjZWQtZmVhdHVyZSBta3NoIGlzIHJlcXVlc3RlZCI7IHRoZW4KKwkjWFhYIHRoaXMgc3Vja3M7IGZpeCBpdCBmb3IgKmFsbCogY29tcGlsZXJzCisJY2FzZSAkY3QgaW4KKwljbGFuZ3xpY2N8bndjYykKKwkJYWNfZmxhZ3MgMSBmbm9pbmxpbmUgLWZuby1pbmxpbmUKKwkJOzsKKwlnY2MpCisJCU5PV0FSTj0kRE9XQVJOOyBwaGFzZT11CisJCWFjX2ZsYWdzIDEgZm5vaW5saW5lIC1mbm8taW5saW5lCisJCU5PV0FSTj0kc2F2ZV9OT1dBUk47IHBoYXNlPXgKKwkJOzsKKwlzdW5wcm8pCisJCWFjX2ZsYWdzIDEgZm5vaW5saW5lIC14aW5saW5lPQorCQk7OworCXhsYykKKwkJYWNfZmxhZ3MgMSBmbm9pbmxpbmUgLXFub2lubGluZQorCQk7OworCWVzYWMKKworCTogJHtIQVZFX01LTk9EPTB9CisJOiAke0hBVkVfTklDRT0wfQorCTogJHtIQVZFX1JFVk9LRT0wfQorCTogJHtIQVZFX1BFUlNJU1RFTlRfSElTVE9SWT0wfQorCWNoZWNrX2NhdGVnb3JpZXM9JGNoZWNrX2NhdGVnb3JpZXMsc21rc2gKKwlIQVZFX0lTU0VUX01LU0hfQ09OU0VSVkFUSVZFX0ZEUz0xCSMgZnJvbSBzaC5oCitmaQorYWNfaWZjcHAgJ2lmZGVmIE1LU0hfQklOU0hSRURVQ0VEJyBpc3NldF9NS1NIX0JJTlNIUkVEVUNFRCAnJyBcCisgICAgImlmIGEgcmVkdWNlZC1mZWF0dXJlIHNoIGlzIHJlcXVlc3RlZCIgJiYgXAorICAgIGNoZWNrX2NhdGVnb3JpZXM9JGNoZWNrX2NhdGVnb3JpZXMsYmluc2gKK2FjX2lmY3BwICdpZmRlZiBNS1NIX1VORU1QTE9ZRUQnIGlzc2V0X01LU0hfVU5FTVBMT1lFRCAnJyBcCisgICAgImlmIG1rc2ggd2lsbCBiZSBidWlsdCB3aXRob3V0IGpvYiBjb250cm9sIiAmJiBcCisgICAgY2hlY2tfY2F0ZWdvcmllcz0kY2hlY2tfY2F0ZWdvcmllcyxhcmdlCithY19pZmNwcCAnaWZkZWYgTUtTSF9BU1NVTUVfVVRGOCcgaXNzZXRfTUtTSF9BU1NVTUVfVVRGOCAnJyBcCisgICAgJ2lmIHRoZSBkZWZhdWx0IFVURi04IG1vZGUgaXMgc3BlY2lmaWVkJyAmJiA6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KK2FjX2lmY3BwICdpZmRlZiBNS1NIX0NPTlNFUlZBVElWRV9GRFMnIGlzc2V0X01LU0hfQ09OU0VSVkFUSVZFX0ZEUyAnJyBcCisgICAgJ2lmIHRyYWRpdGlvbmFsL2NvbnNlcnZhdGl2ZSBmZCB1c2UgaXMgcmVxdWVzdGVkJyAmJiBcCisgICAgY2hlY2tfY2F0ZWdvcmllcz0kY2hlY2tfY2F0ZWdvcmllcyxjb252ZmRzCisKKyMKKyMgRW52aXJvbm1lbnQ6IGhlYWRlcnMKKyMKK2FjX2hlYWRlciBzeXMvcGFyYW0uaAorYWNfaGVhZGVyIHN5cy9ta2Rldi5oIHN5cy90eXBlcy5oCithY19oZWFkZXIgc3lzL21tYW4uaCBzeXMvdHlwZXMuaAorYWNfaGVhZGVyIHN5cy9zeXNtYWNyb3MuaAorYWNfaGVhZGVyIGdycC5oIHN5cy90eXBlcy5oCithY19oZWFkZXIgbGliZ2VuLmgKK2FjX2hlYWRlciBsaWJ1dGlsLmggc3lzL3R5cGVzLmgKK2FjX2hlYWRlciBwYXRocy5oCithY19oZWFkZXIgc3RkYm9vbC5oCithY19oZWFkZXIgc3RkaW50Lmggc3RkYXJnLmgKK2FjX2hlYWRlciBzdHJpbmdzLmggc3lzL3R5cGVzLmgKK2FjX2hlYWRlciB1bGltaXQuaCBzeXMvdHlwZXMuaAorYWNfaGVhZGVyIHZhbHVlcy5oCisKKyMKKyMgRW52aXJvbm1lbnQ6IGRlZmluaXRpb25zCisjCitlY2hvICcjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisvKiBjaGVjayB0aGF0IG9mZl90IGNhbiByZXByZXNlbnQgMl42My0xIGNvcnJlY3RseSwgdGh4IEZTRiAqLworI2RlZmluZSBMQVJHRV9PRkZfVCAoKChvZmZfdCkxIDw8IDYyKSAtIDEgKyAoKG9mZl90KTEgPDwgNjIpKQoraW50IG9mZl90X2lzX2xhcmdlWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxICYmCisgICAgTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjQ3ID09IDEpID8gMSA6IC0xXTsKK2ludCBtYWluKHZvaWQpIHsgcmV0dXJuICgwKTsgfScgPmxmdC5jCithY190ZXN0biBjYW5fbGZzICcnICJmb3IgbGFyZ2UgZmlsZSBzdXBwb3J0IiA8bGZ0LmMKK3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCitDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiCithY190ZXN0biBjYW5fbGZzX3N1cyAnIScgY2FuX2xmcyAwICIuLi4gd2l0aCAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IiA8bGZ0LmMKK2lmIHRlc3QgMCA9ICRIQVZFX0NBTl9MRlNfU1VTOyB0aGVuCisJQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIC1EX0xBUkdFX0ZJTEVTPTEiCisJYWNfdGVzdG4gY2FuX2xmc19haXggJyEnIGNhbl9sZnMgMCAiLi4uIHdpdGggLURfTEFSR0VfRklMRVM9MSIgPGxmdC5jCisJdGVzdCAxID0gJEhBVkVfQ0FOX0xGU19BSVggfHwgQ1BQRkxBR1M9JHNhdmVfQ1BQRkxBR1MKK2ZpCitybWYgbGZ0KgkjIGVuZCBvZiBsYXJnZSBmaWxlIHN1cHBvcnQgdGVzdAorCisjCisjIEVudmlyb25tZW50OiB0eXBlcworIworYWNfdGVzdCBjYW5faW50dHlwZXMgJyEnIHN0ZGludF9oIDEgImZvciBzdGFuZGFyZCAzMi1iaXQgaW50ZWdlciB0eXBlcyIgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHN0ZGRlZi5oPgorCWludCBtYWluKGludCBhYywgY2hhciAqKmF2KSB7IHJldHVybiAoKHVpbnQzMl90KShwdHJkaWZmX3QpKmF2ICsgKGludDMyX3QpYWMpOyB9CitFT0YKK2FjX3Rlc3QgY2FuX3VjYmludHMgJyEnIGNhbl9pbnR0eXBlcyAxICJmb3IgVUNCIDMyLWJpdCBpbnRlZ2VyIHR5cGVzIiA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c3RkZGVmLmg+CisJaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpIHsgcmV0dXJuICgodV9pbnQzMl90KShwdHJkaWZmX3QpKmF2ICsgKGludDMyX3QpYWMpOyB9CitFT0YKK2FjX3Rlc3QgY2FuX2ludDh0eXBlICchJyBzdGRpbnRfaCAxICJmb3Igc3RhbmRhcmQgOC1iaXQgaW50ZWdlciB0eXBlIiA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c3RkZGVmLmg+CisJaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpIHsgcmV0dXJuICgodWludDhfdCkocHRyZGlmZl90KWF2W2FjXSk7IH0KK0VPRgorYWNfdGVzdCBjYW5fdWNiaW50OCAnIScgY2FuX2ludDh0eXBlIDEgImZvciBVQ0IgOC1iaXQgaW50ZWdlciB0eXBlIiA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c3RkZGVmLmg+CisJaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpIHsgcmV0dXJuICgodV9pbnQ4X3QpKHB0cmRpZmZfdClhdlthY10pOyB9CitFT0YKKworYWNfdGVzdCBybGltX3QgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHN5cy90aW1lLmg+CisJI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludCkocmxpbV90KTApOyB9CitFT0YKKworIyBvbmx5IHRlc3RuOiBhZGRlZCBsYXRlciBiZWxvdworYWNfdGVzdG4gc2lnX3QgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHNpZ25hbC5oPgorCSNpbmNsdWRlIDxzdGRkZWYuaD4KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludCkocHRyZGlmZl90KShzaWdfdClraWxsKDAsMCkpOyB9CitFT0YKKworYWNfdGVzdG4gc2lnaGFuZGxlcl90ICchJyBzaWdfdCAwIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzaWduYWwuaD4KKwkjaW5jbHVkZSA8c3RkZGVmLmg+CisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpKHB0cmRpZmZfdCkoc2lnaGFuZGxlcl90KWtpbGwoMCwwKSk7IH0KK0VPRgoraWYgdGVzdCAxID0gJEhBVkVfU0lHSEFORExFUl9UOyB0aGVuCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRHNpZ190PXNpZ2hhbmRsZXJfdCIKKwlIQVZFX1NJR19UPTEKK2ZpCisKK2FjX3Rlc3RuIF9fc2lnaGFuZGxlcl90ICchJyBzaWdfdCAwIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzaWduYWwuaD4KKwkjaW5jbHVkZSA8c3RkZGVmLmg+CisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpKHB0cmRpZmZfdCkoX19zaWdoYW5kbGVyX3Qpa2lsbCgwLDApKTsgfQorRU9GCitpZiB0ZXN0IDEgPSAkSEFWRV9fX1NJR0hBTkRMRVJfVDsgdGhlbgorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURzaWdfdD1fX3NpZ2hhbmRsZXJfdCIKKwlIQVZFX1NJR19UPTEKK2ZpCisKK3Rlc3QgMSA9ICRIQVZFX1NJR19UIHx8IENQUEZMQUdTPSIkQ1BQRkxBR1MgLURzaWdfdD1ub3NpZ190IgorYWNfY3BwZmxhZ3MgU0lHX1QKKworIworIyBFbnZpcm9ubWVudDogc2lnbmFscworIwordGVzdCB4Ik5ldEJTRCIgPSB4IiRUQVJHRVRfT1MiICYmICRlIElnbm9yZSB0aGUgY29tcGF0aWJpbGl0eSB3YXJuaW5nLgorCitmb3Igd2hhdCBpbiBuYW1lIGxpc3Q7IGRvCisJdXdoYXQ9YHVwcGVyICR3aGF0YAorCWFjX3Rlc3RuIHN5c19zaWckd2hhdCAnJyAidGhlIHN5c19zaWcke3doYXR9W10gYXJyYXkiIDw8LUVPRgorCQlleHRlcm4gY29uc3QgY2hhciAqY29uc3Qgc3lzX3NpZyR7d2hhdH1bXTsKKwkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHN5c19zaWcke3doYXR9WzBdWzBdKTsgfQorCUVPRgorCWFjX3Rlc3RuIF9zeXNfc2lnJHdoYXQgJyEnIHN5c19zaWckd2hhdCAwICJ0aGUgX3N5c19zaWcke3doYXR9W10gYXJyYXkiIDw8LUVPRgorCQlleHRlcm4gY29uc3QgY2hhciAqY29uc3QgX3N5c19zaWcke3doYXR9W107CisJCWludCBtYWluKHZvaWQpIHsgcmV0dXJuIChfc3lzX3NpZyR7d2hhdH1bMF1bMF0pOyB9CisJRU9GCisJaWYgZXZhbCAidGVzdCAxID0gXCRIQVZFX19TWVNfU0lHJHV3aGF0IjsgdGhlbgorCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1Ec3lzX3NpZyR3aGF0PV9zeXNfc2lnJHdoYXQiCisJCWV2YWwgIkhBVkVfU1lTX1NJRyR1d2hhdD0xIgorCWZpCisJYWNfY3BwZmxhZ3MgU1lTX1NJRyR1d2hhdAorZG9uZQorCithY190ZXN0IHN0cnNpZ25hbCAnIScgc3lzX3NpZ2xpc3QgMCA8PC0nRU9GJworCSNpbmNsdWRlIDxzdHJpbmcuaD4KKwkjaW5jbHVkZSA8c2lnbmFsLmg+CisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHN0cnNpZ25hbCgxKVswXSk7IH0KK0VPRgorCisjCisjIEVudmlyb25tZW50OiBsaWJyYXJ5IGZ1bmN0aW9ucworIworYWNfdGVzdG4gZmxvY2tfZXggJycgJ2Zsb2NrIGFuZCBtbWFwJyA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKwkjaW5jbHVkZSA8c3lzL21tYW4uaD4KKwkjaW5jbHVkZSA8ZmNudGwuaD4KKwkjaW5jbHVkZSA8c3RkbGliLmg+CisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKCh2b2lkICopbW1hcChOVUxMLCAoc2l6ZV90KWZsb2NrKDAsIExPQ0tfRVgpLAorCSAgICBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCAwLCAob2ZmX3QpMCkgPT0gKHZvaWQgKilOVUxMID8gMSA6CisJICAgIG11bm1hcChOVUxMLCAwKSk7IH0KK0VPRgorCithY190ZXN0IGdldHJ1c2FnZSA8PC0nRU9GJworCSNkZWZpbmUgTUtTSF9JTkNMVURFU19PTkxZCisJI2luY2x1ZGUgInNoLmgiCisJaW50IG1haW4odm9pZCkgeworCQlzdHJ1Y3QgcnVzYWdlIHJ1OworCQlyZXR1cm4gKGdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1KSArCisJCSAgICBnZXRydXNhZ2UoUlVTQUdFX0NISUxEUkVOLCAmcnUpKTsKKwl9CitFT0YKKworYWNfdGVzdCBraWxscGcgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c2lnbmFsLmg+CisJaW50IG1haW4oaW50IGFjLCBjaGFyICphdltdKSB7IHJldHVybiAoYXZbMF1ba2lsbHBnKDEyMywgYWMpXSk7IH0KK0VPRgorCithY190ZXN0IG1rbm9kICcnICdpZiB0byB1c2UgbWtub2QoKSwgbWFrZWRldigpIGFuZCBmcmllbmRzJyA8PC0nRU9GJworCSNkZWZpbmUgTUtTSF9JTkNMVURFU19PTkxZCisJI2luY2x1ZGUgInNoLmgiCisJaW50IG1haW4oaW50IGFjLCBjaGFyICphdltdKSB7CisJCWRldl90IGR2OworCQlkdiA9IG1ha2VkZXYoKHVuc2lnbmVkIGludClhYywgKHVuc2lnbmVkIGludClhdlswXVswXSk7CisJCXJldHVybiAobWtub2QoYXZbMF0sIChtb2RlX3QpMCwgZHYpID8gKGludCltYWpvcihkdikgOgorCQkgICAgKGludCltaW5vcihkdikpOworCX0KK0VPRgorCithY190ZXN0IG1rc3RlbXAgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3RkbGliLmg+CisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludCBtYWluKHZvaWQpIHsgY2hhciB0bXBsW10gPSAiWCI7IHJldHVybiAobWtzdGVtcCh0bXBsKSk7IH0KK0VPRgorCithY190ZXN0IG5pY2UgPDwtJ0VPRicKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKG5pY2UoNCkpOyB9CitFT0YKKworYWNfdGVzdCByZXZva2UgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2lmIEhBVkVfTElCVVRJTF9ICisJI2luY2x1ZGUgPGxpYnV0aWwuaD4KKwkjZW5kaWYKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50IG1haW4oaW50IGFjLCBjaGFyICphdltdKSB7IHJldHVybiAoYWMgKyByZXZva2UoYXZbMF0pKTsgfQorRU9GCisKK2FjX3Rlc3Qgc2V0bG9jYWxlX2N0eXBlICcnICdzZXRsb2NhbGUoTENfQ1RZUEUsICIiKScgPDwtJ0VPRicKKwkjaW5jbHVkZSA8bG9jYWxlLmg+CisJI2luY2x1ZGUgPHN0ZGRlZi5oPgorCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KShwdHJkaWZmX3QpKHZvaWQgKilzZXRsb2NhbGUoTENfQ1RZUEUsICIiKSk7IH0KK0VPRgorCithY190ZXN0IGxhbmdpbmZvX2NvZGVzZXQgc2V0bG9jYWxlX2N0eXBlIDAgJ25sX2xhbmdpbmZvKENPREVTRVQpJyA8PC0nRU9GJworCSNpbmNsdWRlIDxsYW5naW5mby5oPgorCSNpbmNsdWRlIDxzdGRkZWYuaD4KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludCkocHRyZGlmZl90KSh2b2lkICopbmxfbGFuZ2luZm8oQ09ERVNFVCkpOyB9CitFT0YKKworYWNfdGVzdCBzZXRtb2RlIG1rbm9kIDEgPDwtJ0VPRicKKwkvKiBYWFggaW1ha2Ugc3R5bGUgKi8KKwkvKiBYWFggY29uZGl0aW9ucyBjb3JyZWN0PyAqLworCSNpZiBkZWZpbmVkKF9fTVNWQ1JUX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKwkvKiBmb3JjZSBhIGZhaWx1cmU6IFdpbjMyIHNldG1vZGUoKSBpcyBub3Qgd2hhdCB3ZSB3YW50Li4uICovCisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHRoaXN3aWxsbmV2ZXJiZWRlZmluZWRJaG9wZSgpKTsgfQorCSNlbHNlCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsgcmV0dXJuIChnZXRtb2RlKHNldG1vZGUoYXZbMF0pLAorCSAgICAobW9kZV90KWFjKSk7IH0KKwkjZW5kaWYKK0VPRgorCithY190ZXN0IHNldHJlc3VnaWQgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludCBtYWluKHZvaWQpIHsgc2V0cmVzdWlkKDAsMCwwKTsgcmV0dXJuIChzZXRyZXNnaWQoMCwwLDApKTsgfQorRU9GCisKK2FjX3Rlc3Qgc2V0Z3JvdXBzIHNldHJlc3VnaWQgMCA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaWYgSEFWRV9HUlBfSAorCSNpbmNsdWRlIDxncnAuaD4KKwkjZW5kaWYKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50IG1haW4odm9pZCkgeyBnaWRfdCBnaWQgPSAwOyByZXR1cm4gKHNldGdyb3VwcygwLCAmZ2lkKSk7IH0KK0VPRgorCithY190ZXN0IHN0cmNhc2VzdHIgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHN0ZGRlZi5oPgorCSNpbmNsdWRlIDxzdHJpbmcuaD4KKwkjaWYgSEFWRV9TVFJJTkdTX0gKKwkjaW5jbHVkZSA8c3RyaW5ncy5oPgorCSNlbmRpZgorCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgeworCQlyZXR1cm4gKChpbnQpKHB0cmRpZmZfdCkodm9pZCAqKXN0cmNhc2VzdHIoKmF2LCBhdlthY10pKTsKKwl9CitFT0YKKworYWNfdGVzdCBzdHJsY3B5IDw8LSdFT0YnCisJI2luY2x1ZGUgPHN0cmluZy5oPgorCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgeyByZXR1cm4gKHN0cmxjcHkoKmF2LCBhdlsxXSwKKwkgICAgKHNpemVfdClhYykpOyB9CitFT0YKKworIworIyBjaGVjayBoZWFkZXJzIGZvciBkZWNsYXJhdGlvbnMKKyMKK3NhdmVfQ0M9JENDOyBzYXZlX0xERkxBR1M9JExERkxBR1M7IHNhdmVfTElCUz0kTElCUworQ0M9IiRDQyAtYyAtbyAkdGNmbiI7IExERkxBR1M9OyBMSUJTPQorYWNfdGVzdCAnIScgZmxvY2tfZGVjbCBmbG9ja19leCAxICdpZiBmbG9jaygpIGRvZXMgbm90IG5lZWQgdG8gYmUgZGVjbGFyZWQnIDw8LSdFT0YnCisJI2RlZmluZSBNS1NIX0lOQ0xVREVTX09OTFkKKwkjaW5jbHVkZSAic2guaCIKKwlsb25nIGZsb2NrKHZvaWQpOwkJLyogdGhpcyBjbGFzaGVzIGlmIGRlZmluZWQgYmVmb3JlICovCisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpZmxvY2soKSk7IH0KK0VPRgorYWNfdGVzdCAnIScgcmV2b2tlX2RlY2wgcmV2b2tlIDEgJ2lmIHJldm9rZSgpIGRvZXMgbm90IG5lZWQgdG8gYmUgZGVjbGFyZWQnIDw8LSdFT0YnCisJI2RlZmluZSBNS1NIX0lOQ0xVREVTX09OTFkKKwkjaW5jbHVkZSAic2guaCIKKwlsb25nIHJldm9rZSh2b2lkKTsJCS8qIHRoaXMgY2xhc2hlcyBpZiBkZWZpbmVkIGJlZm9yZSAqLworCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KXJldm9rZSgpKTsgfQorRU9GCithY190ZXN0IHN5c19zaWdsaXN0X2RlY2wgc3lzX3NpZ2xpc3QgMSAnaWYgc3lzX3NpZ2xpc3RbXSBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlY2xhcmVkJyA8PC0nRU9GJworCSNkZWZpbmUgTUtTSF9JTkNMVURFU19PTkxZCisJI2luY2x1ZGUgInNoLmgiCisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHN5c19zaWdsaXN0WzBdWzBdKTsgfQorRU9GCitDQz0kc2F2ZV9DQzsgTERGTEFHUz0kc2F2ZV9MREZMQUdTOyBMSUJTPSRzYXZlX0xJQlMKKworIworIyBvdGhlciBjaGVja3MKKyMKK2ZkPSdpZiB0byB1c2UgcGVyc2lzdGVudCBoaXN0b3J5JworYWNfY2FjaGUgUEVSU0lTVEVOVF9ISVNUT1JZIHx8IHRlc3QgMCA9ICRIQVZFX0ZMT0NLX0VYIHx8IGZ2PTEKK3Rlc3QgMSA9ICRmdiB8fCBjaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzLG5vLWhpc3RmaWxlCithY190ZXN0ZG9uZQorYWNfY3BwZmxhZ3MKKworIworIyBDb21waWxlcjogUHJhZXByb2Nlc3NvciAob25seSBpZiBuZWVkZWQpCisjCit0ZXN0IDAgPSAkSEFWRV9TWVNfU0lHTkFNRSAmJiBpZiBhY190ZXN0aW5pdCBjcHBfZGQgJycgXAorICAgICdjaGVja2luZyBpZiB0aGUgQyBQcmVwcm9jZXNzb3Igc3VwcG9ydHMgLWREJzsgdGhlbgorCWVjaG8gJyNkZWZpbmUgZm9vIGJhcicgPmNvbmZ0ZXN0LmMKKwl2diAnXScgIiRDUFAgJENGTEFHUyAkQ1BQRkxBR1MgJE5PV0FSTiAtZEQgY29uZnRlc3QuYyA+eCIKKwlncmVwICcjZGVmaW5lIGZvbyBiYXInIHggPi9kZXYvbnVsbCAyPiYxICYmIGZ2PTEKKwlybWYgY29uZnRlc3QuYyB4IHZ2Lm91dAorCWFjX3Rlc3Rkb25lCitmaQorCisjCisjIEVuZCBvZiBtaXJ0b2NvbmYgY2hlY2tzCisjCiskZSAuLi4gZG9uZS4KKworIyBTb21lIG9wZXJhdGluZyBzeXN0ZW1zIGhhdmUgYW5jaWVudCB2ZXJzaW9ucyBvZiBlZCgxKSB3cml0aW5nCisjIHRoZSBjaGFyYWN0ZXIgY291bnQgdG8gc3RhbmRhcmQgb3V0cHV0OyBjb3BlIGZvciB0aGF0CitlY2hvIHdxID54CitlZCB4IDx4IDI+L2Rldi9udWxsIHwgZ3JlcCAzID4vZGV2L251bGwgMj4mMSAmJiBcCisgICAgY2hlY2tfY2F0ZWdvcmllcz0kY2hlY2tfY2F0ZWdvcmllcywkb2xkaXNoX2VkCitybWYgeCB2di5vdXQKKworaWYgdGVzdCAwID0gJEhBVkVfU1lTX1NJR05BTUU7IHRoZW4KKwlpZiB0ZXN0IDEgPSAkSEFWRV9DUFBfREQ7IHRoZW4KKwkJJGUgR2VuZXJhdGluZyBsaXN0IG9mIHNpZ25hbCBuYW1lcy4uLgorCWVsc2UKKwkJJGUgTm8gbGlzdCBvZiBzaWduYWwgbmFtZXMgYXZhaWxhYmxlIHZpYSBjcHAuIEZhbGxpbmcgYmFjay4uLgorCWZpCisJc2lnc2Vlbj06CisJZWNobyAnI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmbmRlZiBOU0lHCisjaWYgZGVmaW5lZChfTlNJRykKKyNkZWZpbmUgTlNJRyBfTlNJRworI2VsaWYgZGVmaW5lZChTSUdNQVgpCisjZGVmaW5lIE5TSUcgKFNJR01BWCsxKQorI2VuZGlmCisjZW5kaWYKK21rc2hfY2ZnOiBOU0lHJyA+Y29uZnRlc3QuYworCU5TSUc9YHZxICIkQ1BQICRDRkxBR1MgJENQUEZMQUdTICROT1dBUk4gY29uZnRlc3QuYyIgfCBcCisJICAgIGdyZXAgbWtzaF9jZmc6IHwgc2VkICdzL15ta3NoX2NmZzpbCSBdKlwoWzAtOXggKCkrLV0qXCkuKiQvXDEvJ2AKKwljYXNlICROU0lHIGluCisJKltcIFwoXCkrLV0qKSBOU0lHPWBhd2sgIkJFR0lOIHsgcHJpbnQgJE5TSUcgfSJgIDs7CisJZXNhYworCXByaW50Zj1wcmludGYKKwkocHJpbnRmIGhhbGxvKSA+L2Rldi9udWxsIDI+JjEgfHwgcHJpbnRmPWVjaG8KKwl0ZXN0ICRwcmludGYgPSBlY2hvIHx8IE5TSUc9YHByaW50ZiAlZCAiJE5TSUciIDI+L2Rldi9udWxsYAorCSRwcmludGYgIk5TSUc9JE5TSUcgLi4uICIKKwlzaWdzPSJBQlJUIEFMUk0gQlVTIENITEQgQ0xEIENPTlQgRElMIEVNVCBGUEUgSFVQIElMTCBJTkZPIElOVCBJTyBJT1QiCisJc2lncz0iJHNpZ3MgS0lMTCBMT1NUIFBJUEUgUFJPRiBQV1IgUVVJVCBSRVNWIFNBSyBTRUdWIFNUT1AgU1lTIFRFUk0iCisJc2lncz0iJHNpZ3MgVFJBUCBUU1RQIFRUSU4gVFRPVSBVUkcgVVNSMSBVU1IyIFZUQUxSTSBXSU5DSCBYQ1BVIFhGU1oiCisJdGVzdCAxID0gJEhBVkVfQ1BQX0REICYmIHRlc3QgJE5TSUcgLWd0IDEgJiYgc2lncz0iJHNpZ3MgImB2cSBcCisJICAgICIkQ1BQICRDRkxBR1MgJENQUEZMQUdTICROT1dBUk4gLWREIGNvbmZ0ZXN0LmMiIHwgXAorCSAgICBncmVwICdbCSBdU0lHW0EtWjAtOV0qWwkgXScgfCBcCisJICAgIHNlZCAncy9eXCguKlsJIF1TSUdcKVwoW0EtWjAtOV0qXClcKFsJIF0uKlwpJC9cMi8nIHwgc29ydGAKKwl0ZXN0ICROU0lHIC1ndCAxIHx8IHNpZ3M9CisJZm9yIG5hbWUgaW4gJHNpZ3M7IGRvCisJCWVjaG8gJyNpbmNsdWRlIDxzaWduYWwuaD4nID5jb25mdGVzdC5jCisJCWVjaG8gbWtzaF9jZmc6IFNJRyRuYW1lID4+Y29uZnRlc3QuYworCQl2cSAiJENQUCAkQ0ZMQUdTICRDUFBGTEFHUyAkTk9XQVJOIGNvbmZ0ZXN0LmMiIHwgXAorCQkgICAgZ3JlcCBta3NoX2NmZzogfCBcCisJCSAgICBzZWQgJ3MvXm1rc2hfY2ZnOlsJIF0qXChbMC05eF0qXCkuKiQvXDE6JyRuYW1lLworCWRvbmUgfCBncmVwIC12ICdeOicgfCB3aGlsZSBJRlM9OiByZWFkIG5yIG5hbWU7IGRvCisJCXRlc3QgJHByaW50ZiA9IGVjaG8gfHwgbnI9YHByaW50ZiAlZCAiJG5yIiAyPi9kZXYvbnVsbGAKKwkJdGVzdCAkbnIgLWd0IDAgJiYgdGVzdCAkbnIgLWxlICROU0lHIHx8IGNvbnRpbnVlCisJCWNhc2UgJHNpZ3NlZW4gaW4KKwkJKjokbnI6KikgOzsKKwkJKikJZWNobyAiCQl7IFwiJG5hbWVcIiwgJG5yIH0sIgorCQkJc2lnc2Vlbj0kc2lnc2VlbiRucjoKKwkJCSRwcmludGYgIiRuYW1lPSRuciAiID4mMgorCQkJOzsKKwkJZXNhYworCWRvbmUgMj4mMSA+c2lnbmFtZXMuaW5jCisJcm1mIGNvbmZ0ZXN0LmMKKwkkZSBkb25lLgorZmkKKworYWRkc3JjcyAnIScgSEFWRV9TRVRNT0RFIHNldG1vZGUuYworYWRkc3JjcyAnIScgSEFWRV9TVFJMQ1BZIHN0cmxjcHkuYworYWRkc3JjcyBVU0VfUFJJTlRGX0JVSUxUSU4gcHJpbnRmLmMKK3Rlc3QgMSA9ICIkVVNFX1BSSU5URl9CVUlMVElOIiAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ETUtTSF9QUklOVEZfQlVJTFRJTiIKK3Rlc3QgMCA9ICIkSEFWRV9TRVRNT0RFIiAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9DT05GSUdfSCAtRENPTkZJR19IX0ZJTEVOQU1FPVxcXCJzaC5oXFxcIiIKK3Rlc3QgMSA9ICIkSEFWRV9DQU5fVkVSQiIgJiYgQ0ZMQUdTPSIkQ0ZMQUdTIC12ZXJib3NlIgorCiskZSAkYmkkbWU6IEZpbmlzaGVkIGNvbmZpZ3VyYXRpb24gdGVzdGluZywgbm93IHByb2R1Y2luZyBvdXRwdXQuJGFvCisKK2ZpbGVzPQorb2Jqcz0KK3NwPQorY2FzZSAkY3VyZGlyIGluCisqXCAqKQllY2hvICIjIS4vbWtzaCIgPnRlc3Quc2ggOzsKKyopCWVjaG8gIiMhJGN1cmRpci9ta3NoIiA+dGVzdC5zaCA7OworZXNhYworY2F0ID4+dGVzdC5zaCA8PC1FT0YKKwlMQ19BTEw9QyBQQVRIPSckUEFUSCc7IGV4cG9ydCBMQ19BTEwgUEFUSAorCXRlc3QgLW4gIlwkS1NIX1ZFUlNJT04iIHx8IGV4aXQgMQorCWNoZWNrX2NhdGVnb3JpZXM9JGNoZWNrX2NhdGVnb3JpZXMKKwlwcmludCBUZXN0aW5nIG1rc2ggZm9yIGNvbmZvcm1hbmNlOgorCWZncmVwIE1pck9TOiAnJHNyY2Rpci9jaGVjay50JworCWZncmVwIE1JUkJTRCAnJHNyY2Rpci9jaGVjay50JworCXByaW50ICJUaGlzIHNoZWxsIGlzIGFjdHVhbGx5OlxcblxcdFwkS1NIX1ZFUlNJT04iCisJcHJpbnQgJ3Rlc3Quc2ggYnVpbHQgZm9yIG1rc2ggJGRzdHZlcnNpb24nCisJY3N0cj0nXCRvcyA9IGRlZmluZWQgXCReTyA/IFwkXk8gOiAidW5rbm93biI7JworCWNzdHI9IlwkY3N0ciIncHJpbnQgXCRvcyAuICIsIFBlcmwgdmVyc2lvbiAiIC4gXCRdOycKKwlmb3IgcGVybGkgaW4gXCRQRVJMIHBlcmw1IHBlcmwgbm87IGRvCisJCVtbIFwkcGVybGkgPSBubyBdXSAmJiBleGl0IDEKKwkJcGVybG9zPVwkKFwkcGVybGkgLWUgIlwkY3N0ciIpIDI+Ji0gfHwgY29udGludWUKKwkJcHJpbnQgIlBlcmwgaW50ZXJwcmV0ZXIgJ1wkcGVybGknIHJ1bm5pbmcgb24gJ1wkcGVybG9zJyIKKwkJW1sgLW4gXCRwZXJsb3MgXV0gJiYgYnJlYWsKKwlkb25lCisJZXhlYyBcJHBlcmxpICckc3JjZGlyL2NoZWNrLnBsJyAtcyAnJHNyY2Rpci9jaGVjay50JyAtcCAnJGN1cmRpci9ta3NoJyBcJHtjaGVja19jYXRlZ29yaWVzOistQ30gXCR7Y2hlY2tfY2F0ZWdvcmllcyMsfSBcJCokdHN0cworRU9GCitjaG1vZCA3NTUgdGVzdC5zaAordGVzdCAkSEFWRV9DQU5fQ09NQklORSRjbSA9IDBjb21iaW5lICYmIGNtPW5vcm1hbAoraWYgdGVzdCAkY20gPSBsbHZtOyB0aGVuCisJZW1pdGJjPSItZW1pdC1sbHZtIC1jIgorZWxpZiB0ZXN0ICRjbSA9IGRyYWdvbmVnZzsgdGhlbgorCWVtaXRiYz0iLVMgLWZsdG8iCitlbHNlCisJZW1pdGJjPS1jCitmaQorZWNobyBzZXQgLXggPlJlYnVpbGQuc2gKK2ZvciBmaWxlIGluICRTUkNTOyBkbworCW9wPWBlY2hvIHgiJGZpbGUiIHwgc2VkICdzL154XCguKlwpXC5jJC9cMS4vJ2AKKwl0ZXN0IC1mICRmaWxlIHx8IGZpbGU9JHNyY2Rpci8kZmlsZQorCWZpbGVzPSIkZmlsZXMkc3AkZmlsZSIKKwlzcD0nICcKKwllY2hvICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJGVtaXRiYyAkZmlsZSB8fCBleGl0IDEiID4+UmVidWlsZC5zaAorCWlmIHRlc3QgJGNtID0gZHJhZ29uZWdnOyB0aGVuCisJCWVjaG8gIm12ICR7b3B9cyAke29wfWxsIiA+PlJlYnVpbGQuc2gKKwkJZWNobyAibGx2bS1hcyAke29wfWxsIHx8IGV4aXQgMSIgPj5SZWJ1aWxkLnNoCisJCW9ianM9IiRvYmpzJHNwJHtvcH1iYyIKKwllbHNlCisJCW9ianM9IiRvYmpzJHNwJHtvcH1vIgorCWZpCitkb25lCitjYXNlICRjbSBpbgorZHJhZ29uZWdnfGxsdm0pCisJZWNobyAicm0gLWYgbWtzaC5zIiA+PlJlYnVpbGQuc2gKKwllY2hvICJsbHZtLWxpbmsgLW8gLSAkb2JqcyB8IG9wdCAkb3B0ZmxhZ3MgfCBsbGMgLW8gbWtzaC5zIiA+PlJlYnVpbGQuc2gKKwlsb2Jqcz1ta3NoLnMKKwk7OworKikKKwlsb2Jqcz0kb2JqcworCTs7Citlc2FjCitjYXNlICR0Y2ZuIGluCithLmV4ZSkJbWtzaGV4ZT1ta3NoLmV4ZSA7OworKikJbWtzaGV4ZT1ta3NoIDs7Citlc2FjCitlY2hvIHRjZm49JG1rc2hleGUgPj5SZWJ1aWxkLnNoCitlY2hvICIkQ0MgJENGTEFHUyAkTERGTEFHUyAtbyBcJHRjZm4gJGxvYmpzICRMSUJTICRjY3ByIiA+PlJlYnVpbGQuc2gKK2VjaG8gJ3Rlc3QgLWYgJHRjZm4gfHwgZXhpdCAxOyBzaXplICR0Y2ZuJyA+PlJlYnVpbGQuc2gKK2lmIHRlc3QgJGNtID0gbWFrZWZpbGU7IHRoZW4KKwlleHRyYXM9J2VtYWNzZm4uaCBzaC5oIHNoX2ZsYWdzLmggdmFyX3NwZWMuaCcKKwl0ZXN0IDAgPSAkSEFWRV9TWVNfU0lHTkFNRSAmJiBleHRyYXM9IiRleHRyYXMgc2lnbmFtZXMuaW5jIgorCWNhdCA+TWFrZWZyYWcuaW5jIDw8RU9GCisjIE1ha2VmaWxlIGZyYWdtZW50IGZvciBidWlsZGluZyBta3NoICRkc3R2ZXJzaW9uCisKK1BST0c9CQkkbWtzaGV4ZQorTUFOPQkJbWtzaC4xCitTUkNTPQkJJFNSQ1MKK1NSQ1NfRlA9CSRmaWxlcworT0JKU19CUD0JJG9ianMKK0lORFNSQ1M9CSRleHRyYXMKK05PTlNSQ1NfSU5TVD0JZG90Lm1rc2hyYyBcJChNQU4pCitOT05TUkNTX05PSU5TVD0JQnVpbGQuc2ggTWFrZWZpbGUgUmVidWlsZC5zaCBjaGVjay5wbCBjaGVjay50IHRlc3Quc2gKK0NDPQkJJENDCitDRkxBR1M9CQkkQ0ZMQUdTCitDUFBGTEFHUz0JJENQUEZMQUdTCitMREZMQUdTPQkkTERGTEFHUworTElCUz0JCSRMSUJTCisKKyMgbm90IEJTRCBtYWtlIG9ubHk6CisjVlBBVEg9CQkkc3JjZGlyCisjYWxsOiBcJChQUk9HKQorI1wkKFBST0cpOiBcJChPQkpTX0JQKQorIwlcJChDQykgXCQoQ0ZMQUdTKSBcJChMREZMQUdTKSAtbyBcJEAgXCQoT0JKU19CUCkgXCQoTElCUykKKyNcJChPQkpTX0JQKTogXCQoU1JDU19GUCkgXCQoTk9OU1JDUykKKyMuYy5vOgorIwlcJChDQykgXCQoQ0ZMQUdTKSBcJChDUFBGTEFHUykgLWMgXCQ8CisKKyMgZm9yIGFsbCBtYWtlIHZhcmlhbnRzOgorI1JFR1JFU1NfRkxBR1M9CS12CisjcmVncmVzczoKKyMJLi90ZXN0LnNoIFwkKFJFR1JFU1NfRkxBR1MpCisKKyMgZm9yIEJTRCBtYWtlIG9ubHk6CisjLlBBVEg6ICRzcmNkaXIKKyMuaW5jbHVkZSA8YnNkLnByb2cubWs+CitFT0YKKwkkZQorCSRlIEdlbmVyYXRlZCBNYWtlZnJhZy5pbmMgc3VjY2Vzc2Z1bGx5LgorCWV4aXQgMAorZmkKK2lmIHRlc3QgJGNtID0gY29tYmluZTsgdGhlbgorCW9ianM9Ii1vICRta3NoZXhlIgorCWZvciBmaWxlIGluICRTUkNTOyBkbworCQl0ZXN0IC1mICRmaWxlIHx8IGZpbGU9JHNyY2Rpci8kZmlsZQorCQlvYmpzPSIkb2JqcyAkZmlsZSIKKwlkb25lCisJZW1pdGJjPSItZndob2xlLXByb2dyYW0gLS1jb21iaW5lIgorCXYgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkZW1pdGJjICRvYmpzICRMSUJTICRjY3ByIgorZWxpZiB0ZXN0IDEgPSAkcG07IHRoZW4KKwlmb3IgZmlsZSBpbiAkU1JDUzsgZG8KKwkJdGVzdCAtZiAkZmlsZSB8fCBmaWxlPSRzcmNkaXIvJGZpbGUKKwkJdiAiJENDICRDRkxBR1MgJENQUEZMQUdTICRlbWl0YmMgJGZpbGUiICYKKwlkb25lCisJd2FpdAorZWxzZQorCWZvciBmaWxlIGluICRTUkNTOyBkbworCQl0ZXN0ICRjbSA9IGRyYWdvbmVnZyAmJiBcCisJCSAgICBvcD1gZWNobyB4IiRmaWxlIiB8IHNlZCAncy9eeFwoLipcKVwuYyQvXDEuLydgCisJCXRlc3QgLWYgJGZpbGUgfHwgZmlsZT0kc3JjZGlyLyRmaWxlCisJCXYgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkZW1pdGJjICRmaWxlIiB8fCBleGl0IDEKKwkJaWYgdGVzdCAkY20gPSBkcmFnb25lZ2c7IHRoZW4KKwkJCXYgIm12ICR7b3B9cyAke29wfWxsIgorCQkJdiAibGx2bS1hcyAke29wfWxsIiB8fCBleGl0IDEKKwkJZmkKKwlkb25lCitmaQorY2FzZSAkY20gaW4KK2RyYWdvbmVnZ3xsbHZtKQorCXJtZiBta3NoLnMKKwl2ICJsbHZtLWxpbmsgLW8gLSAkb2JqcyB8IG9wdCAkb3B0ZmxhZ3MgfCBsbGMgLW8gbWtzaC5zIgorCTs7Citlc2FjCit0Y2ZuPSRta3NoZXhlCit0ZXN0ICRjbSA9IGNvbWJpbmUgfHwgdiAiJENDICRDRkxBR1MgJExERkxBR1MgLW8gJHRjZm4gJGxvYmpzICRMSUJTICRjY3ByIgordGVzdCAtZiAkdGNmbiB8fCBleGl0IDEKK3Rlc3QgMSA9ICRyIHx8IHYgIiROUk9GRiAtbWRvYyA8JyRzcmNkaXIvbWtzaC4xJyA+bWtzaC5jYXQxIiB8fCBcCisgICAgcm1mIG1rc2guY2F0MQordGVzdCAwID0gJGVxICYmIHYgc2l6ZSAkdGNmbgoraT1pbnN0YWxsCit0ZXN0IC1mIC91c3IvdWNiLyRpICYmIGk9L3Vzci91Y2IvJGkKK3Rlc3QgMSA9ICRlcSAmJiBlPToKKyRlCiskZSBJbnN0YWxsaW5nIHRoZSBzaGVsbDoKKyRlICIjICRpIC1jIC1zIC1vIHJvb3QgLWcgYmluIC1tIDU1NSBta3NoIC9iaW4vbWtzaCIKKyRlICIjIGdyZXAgLXggL2Jpbi9ta3NoIC9ldGMvc2hlbGxzID4vZGV2L251bGwgfHwgZWNobyAvYmluL21rc2ggPj4vZXRjL3NoZWxscyIKKyRlICIjICRpIC1jIC1vIHJvb3QgLWcgYmluIC1tIDQ0NCBkb3QubWtzaHJjIC91c3Ivc2hhcmUvZG9jL21rc2gvZXhhbXBsZXMvIgorJGUKKyRlIEluc3RhbGxpbmcgdGhlIG1hbnVhbDoKK2lmIHRlc3QgLWYgbWtzaC5jYXQxOyB0aGVuCisJJGUgIiMgJGkgLWMgLW8gcm9vdCAtZyBiaW4gLW0gNDQ0IG1rc2guY2F0MSIgXAorCSAgICAiL3Vzci9zaGFyZS9tYW4vY2F0MS9ta3NoLjAiCisJJGUgb3IKK2ZpCiskZSAiIyAkaSAtYyAtbyByb290IC1nIGJpbiAtbSA0NDQgbWtzaC4xIC91c3Ivc2hhcmUvbWFuL21hbjEvbWtzaC4xIgorJGUKKyRlIFJ1biB0aGUgcmVncmVzc2lvbiB0ZXN0IHN1aXRlOiAuL3Rlc3Quc2gKKyRlIFBsZWFzZSBhbHNvIHJlYWQgdGhlIHNhbXBsZSBmaWxlIGRvdC5ta3NocmMgYW5kIHRoZSBmaW5lIG1hbnVhbC4KK2V4aXQgMApkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvY2hlY2sucGwgYi9ta3NoL3NyYy9jaGVjay5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzkzZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvY2hlY2sucGwKQEAgLTAsMCArMSwxMjQxIEBACisjICRNaXJPUzogc3JjL2Jpbi9ta3NoL2NoZWNrLnBsLHYgMS4yMyAyMDA5LzA2LzEwIDE4OjEyOjQzIHRnIFJlbCAkCisjICRPcGVuQlNEOiB0aCx2IDEuMTMgMjAwNi8wNS8xOCAyMToyNzoyMyBtaW9kIEV4cCAkCisjLQorIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKKyMJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorIworIyBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyMgYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisjIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorIyBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyMgbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyMKKyMgVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisjIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorIyBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyMgbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisjIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorIyBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyMgZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisjIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisjLQorIyBFeGFtcGxlIHRlc3Q6CisjCQluYW1lOiBhLXRlc3QKKyMJCWRlc2NyaXB0aW9uOgorIwkJCWEgdGVzdCB0byBzaG93IGhvdyB0ZXN0cyBhcmUgZG9uZQorIwkJYXJndW1lbnRzOiAhLXghLWYhCisjCQlzdGRpbjoKKyMJCQllY2hvIC1uICoKKyMJCQlmYWxzZQorIwkJZXhwZWN0ZWQtc3Rkb3V0OiAhCisjCQkJKgorIwkJZXhwZWN0ZWQtc3RkZXJyOgorIwkJCSsgZWNobyAtbiAqCisjCQkJKyBmYWxzZQorIwkJZXhwZWN0ZWQtZXhpdDogMQorIwkJLS0tCisjCVRoaXMgcnVucyB0aGUgdGVzdC1wcm9ncmFtIChlZywgbWtzaCkgd2l0aCB0aGUgYXJndW1lbnRzIC14IGFuZCAtZiwKKyMJc3RhbmRhcmQgaW5wdXQgaXMgYSBmaWxlIGNvbnRhaW5pbmcgImVjaG8gaGkqXG5mYWxzZVxuIi4gVGhlIHByb2dyYW0KKyMJaXMgZXhwZWN0ZWQgdG8gcHJvZHVjZSAiaGkqIiAobm8gdHJhaWxpbmcgbmV3bGluZSkgb24gc3RhbmRhcmQgb3V0cHV0LAorIwkiKyBlY2hvIGhpKlxuK2ZhbHNlXG4iIG9uIHN0YW5kYXJkIGVycm9yLCBhbmQgYW4gZXhpdCBjb2RlIG9mIDEuCisjCisjCisjIEZvcm1hdCBvZiB0ZXN0IGZpbGVzOgorIyAtIGJsYW5rIGxpbmVzIGFuZCBsaW5lcyBzdGFydGluZyB3aXRoICMgYXJlIGlnbm9yZWQKKyMgLSBhIHRlc3QgZmlsZSBjb250YWlucyBhIHNlcmllcyBvZiB0ZXN0cworIyAtIGEgdGVzdCBpcyBhIHNlcmllcyBvZiB0YWc6dmFsdWUgcGFpcnMgZW5kZWQgd2l0aCBhICItLS0iIGxpbmUKKyMgICAobGVhZGluZy90cmFpbGluZyBzcGFjZXMgYXJlIHN0cmlwcGVkIGZyb20gdGhlIGZpcnN0IGxpbmUgb2YgdmFsdWUpCisjIC0gdGVzdCB0YWdzIGFyZToKKyMJVGFnCQkJRmxhZwlEZXNjcmlwdGlvbgorIwktLS0tLQkJCS0tLS0JLS0tLS0tLS0tLS0KKyMJbmFtZQkJCXIJVGhlIG5hbWUgb2YgdGhlIHRlc3Q7IHNob3VsZCBiZSB1bmlxdWUKKyMJZGVzY3JpcHRpb24JCW0JV2hhdCB0ZXN0IGRvZXMKKyMJYXJndW1lbnRzCQlNCUFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBwcm9ncmFtOworIwkJCQkJZGVmYXVsdCBpcyBubyBhcmd1bWVudHMuCisjCXNjcmlwdAkJCW0JVmFsdWUgaXMgd3JpdHRlbiB0byBhIGZpbGUgd2hpY2gKKyMJCQkJCWlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvZ3JhbQorIwkJCQkJKGFmdGVyIHRoZSBhcmd1bWVudHMgYXJndW1lbnRzKQorIwlzdGRpbgkJCW0JVmFsdWUgaXMgd3JpdHRlbiB0byBhIGZpbGUgd2hpY2ggaXMKKyMJCQkJCXVzZWQgYXMgc3RhbmRhcmQtaW5wdXQgZm9yIHRoZSBwcm9ncmFtOworIwkJCQkJZGVmYXVsdCBpcyB0byB1c2UgL2Rldi9udWxsLgorIwlwZXJsLXNldHVwCQltCVZhbHVlIGlzIGEgcGVybCBzY3JpcHQgd2hpY2ggaXMgZXhlY3V0ZWQKKyMJCQkJCWp1c3QgYmVmb3JlIHRoZSB0ZXN0IGlzIHJ1bi4gVHJ5IHRvCisjCQkJCQlhdm9pZCB1c2luZyB0aGlzLi4uCisjCXBlcmwtY2xlYW51cAkJbQlWYWx1ZSBpcyBhIHBlcmwgc2NyaXB0IHdoaWNoIGlzIGV4ZWN1dGVkCisjCQkJCQlqdXN0IGFmdGVyIHRoZSB0ZXN0IGlzIHJ1bi4gVHJ5IHRvCisjCQkJCQlhdm9pZCB1c2luZyB0aGlzLi4uCisjCWVudi1zZXR1cAkJTQlWYWx1ZSBpcyBhIGxpc3Qgb2YgTkFNRT1WQUxVRSBlbGVtZW50cworIwkJCQkJd2hpY2ggYXJlIHB1dCBpbiB0aGUgZW52aXJvbm1lbnQgYmVmb3JlCisjCQkJCQl0aGUgdGVzdCBpcyBydW4uIElmIHRoZSA9VkFMVUUgaXMKKyMJCQkJCW1pc3NpbmcsIE5BTUUgaXMgcmVtb3ZlZCBmcm9tIHRoZQorIwkJCQkJZW52aXJvbm1lbnQuIFByb2dyYW1zIGFyZSBydW4gd2l0aAorIwkJCQkJdGhlIGZvbGxvd2luZyBtaW5pbWFsIGVudmlyb25tZW50OgorIwkJCQkJICAgIEhPTUUsIExEX0xJQlJBUllfUEFUSCwgTE9DUEFUSCwKKyMJCQkJCSAgICBMT0dOQU1FLCBQQVRILCBTSEVMTCwgVVNFUgorIwkJCQkJKHZhbHVlcyB0YWtlbiBmcm9tIHRoZSBlbnZpcm9ubWVudCBvZgorIwkJCQkJdGhlIHRlc3QgaGFybmVzcykuCisjCQkJCQlFTlYgaXMgc2V0IHRvIC9ub25leGlzdGFudC4KKyMJCQkJCV9fcHJvZ25hbWUgaXMgc2V0IHRvIHRoZSAtcCBhcmd1bWVudC4KKyMJCQkJCV9fcGVybG5hbWUgaXMgc2V0IHRvICReWCAocGVybGV4ZSkuCisjCWZpbGUtc2V0dXAJCW1wcwlVc2VkIHRvIGNyZWF0ZSBmaWxlcywgZGlyZWN0b3JpZXMKKyMJCQkJCWFuZCBzeW1saW5rcy4gRmlyc3Qgd29yZCBpcyBlaXRoZXIKKyMJCQkJCWZpbGUsIGRpciBvciBzeW1saW5rOyBzZWNvbmQgd29yZCBpcworIwkJCQkJcGVybWlzc2lvbnM7IHRoaXMgaXMgZm9sbG93ZWQgYnkgYQorIwkJCQkJcXVvdGVkIHdvcmQgdGhhdCBpcyB0aGUgbmFtZSBvZiB0aGUKKyMJCQkJCWZpbGU7IHRoZSBlbmQtcXVvdGUgc2hvdWxkIGJlIGZvbGxvd2VkCisjCQkJCQlieSBhIG5ld2xpbmUsIHRoZW4gdGhlIGZpbGUgZGF0YQorIwkJCQkJKGlmIGFueSkuIFRoZSBmaXJzdCB3b3JkIG1heSBiZQorIwkJCQkJcHJlY2VkZWQgYnkgYSAhIHRvIHN0cmlwIHRoZSB0cmFpbGluZworIwkJCQkJbmV3bGluZSBpbiBhIHN5bWxpbmsuCisjCWZpbGUtcmVzdWx0CQltcHMJVXNlZCB0byB2ZXJpZnkgYSBmaWxlLCBzeW1saW5rIG9yCisjCQkJCQlkaXJlY3RvcnkgaXMgY3JlYXRlZCBjb3JyZWN0bHkuCisjCQkJCQlUaGUgZmlyc3Qgd29yZCBpcyBlaXRoZXIKKyMJCQkJCWZpbGUsIGRpciBvciBzeW1saW5rOyBzZWNvbmQgd29yZCBpcworIwkJCQkJZXhwZWN0ZWQgcGVybWlzc2lvbnM7IHRoaXJkIHdvcmQKKyMJCQkJCWlzIHVzZXItaWQ7IGZvdXJ0aCBpcyBncm91cC1pZDsKKyMJCQkJCWZpZnRoIGlzICJleGFjdCIgb3IgInBhdHRlcm4iCisjCQkJCQlpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgY29udGVudHMKKyMJCQkJCXdoaWNoIGZvbGxvdyBpcyB0byBiZSBtYXRjaGVkIGV4YWN0bHkKKyMJCQkJCW9yIGlmIGl0IGlzIGEgcmVndWxhciBleHByZXNzaW9uLgorIwkJCQkJVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBxdW90ZWQgbmFtZQorIwkJCQkJb2YgdGhlIGZpbGUgdGhhdCBzaG91bGQgYmUgY3JlYXRlZC4KKyMJCQkJCVRoZSBlbmQtcXVvdGUgc2hvdWxkIGJlIGZvbGxvd2VkCisjCQkJCQlieSBhIG5ld2xpbmUsIHRoZW4gdGhlIGZpbGUgZGF0YQorIwkJCQkJKGlmIGFueSkuIFRoZSBmaXJzdCB3b3JkIG1heSBiZQorIwkJCQkJcHJlY2VkZWQgYnkgYSAhIHRvIHN0cmlwIHRoZSB0cmFpbGluZworIwkJCQkJbmV3bGluZSBpbiB0aGUgZmlsZSBjb250ZW50cy4KKyMJCQkJCVRoZSBwZXJtaXNzaW9ucywgdXNlciBhbmQgZ3JvdXAgZmllbGRzCisjCQkJCQltYXkgYmUgKiBtZWFuaW5nIGFjY2VwdCBhbnkgdmFsdWUuCisjCXRpbWUtbGltaXQJCQlUaW1lIGxpbWl0IC0gdGhlIHByb2dyYW0gaXMgc2VudCBhCisjCQkJCQlTSUdLSUxMIE4gc2Vjb25kcy4gRGVmYXVsdCBpcyBubworIwkJCQkJbGltaXQuCisjCWV4cGVjdGVkLWZhaWwJCQkneWVzJyBpZiB0aGUgdGVzdCBpcyBleHBlY3RlZCB0byBmYWlsLgorIwlleHBlY3RlZC1leGl0CQkJZXhwZWN0ZWQgZXhpdCBjb2RlLiBDYW4gYmUgYSBudW1iZXIsCisjCQkJCQlvciBhIEMgZXhwcmVzc2lvbiB1c2luZyB0aGUgdmFyaWFibGVzCisjCQkJCQllLCBzIGFuZCB3IChleGl0IGNvZGUsIHRlcm1pbmF0aW9uCisjCQkJCQlzaWduYWwsIGFuZCBzdGF0dXMgY29kZSkuCisjCWV4cGVjdGVkLXN0ZG91dAkJbQlXaGF0IHRoZSB0ZXN0IHNob3VsZCBnZW5lcmF0ZSBvbiBzdGRvdXQ7CisjCQkJCQlkZWZhdWx0IGlzIHRvIGV4cGVjdCBubyBvdXRwdXQuCisjCWV4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuCW0JQSBwZXJsIHBhdHRlcm4gd2hpY2ggbWF0Y2hlcyB0aGUKKyMJCQkJCWV4cGVjdGVkIG91dHB1dC4KKyMJZXhwZWN0ZWQtc3RkZXJyCQltCVdoYXQgdGhlIHRlc3Qgc2hvdWxkIGdlbmVyYXRlIG9uIHN0ZGVycjsKKyMJCQkJCWRlZmF1bHQgaXMgdG8gZXhwZWN0IG5vIG91dHB1dC4KKyMJZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm4JbQlBIHBlcmwgcGF0dGVybiB3aGljaCBtYXRjaGVzIHRoZQorIwkJCQkJZXhwZWN0ZWQgc3RhbmRhcmQgZXJyb3IuCisjCWNhdGVnb3J5CQltCVNwZWNpZnkgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZgorIwkJCQkJJ2NhdGVnb3JpZXMnIG9mIHByb2dyYW0gdGhhdCB0aGUgdGVzdAorIwkJCQkJaXMgdG8gYmUgcnVuIGZvci4gQSBjYXRlZ29yeSBjYW4gYmUKKyMJCQkJCW5lZ2F0ZWQgYnkgcHJlZml4aW5nIHRoZSBuYW1lIHdpdGggYSAhLgorIwkJCQkJVGhlIGlkZWEgaXMgdGhhdCBzb21lIHRlc3RzIGluIGEKKyMJCQkJCXRlc3Qgc3VpdGUgbWF5IGFwcGx5IHRvIGEgcGFydGljdWxhcgorIwkJCQkJcHJvZ3JhbSB2ZXJzaW9uIGFuZCBzaG91bGRuJ3QgYmUgcnVuCisjCQkJCQlvbiBvdGhlciB2ZXJzaW9ucy4gVGhlIGNhdGVnb3J5KHMpIG9mCisjCQkJCQl0aGUgcHJvZ3JhbSBiZWluZyB0ZXN0ZWQgY2FuIGJlCisjCQkJCQlzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyMJCQkJCU9uZSBjYXRlZ29yeSBvczpYWFggaXMgcHJlZGVmaW5lZAorIwkJCQkJKFhYWCBpcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lLAorIwkJCQkJZWcsIGxpbnV4LCBkZWNfb3NmKS4KKyMgRmxhZyBtZWFuaW5nczoKKyMJcgl0YWcgaXMgcmVxdWlyZWQgKGVnLCBhIHRlc3QgbXVzdCBoYXZlIGEgbmFtZSB0YWcpLgorIwltCXZhbHVlIGNhbiBiZSBtdWx0aXBsZSBsaW5lcy4gTGluZXMgbXVzdCBiZSBwcmVmaXhlZCB3aXRoCisjCQlhIHRhYi4gSWYgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIGluaXRpYWwgdGFnOnZhbHVlIGxpbmUgaXMKKyMJCQktIGVtcHR5OiB0aGUgaW5pdGlhbCBibGFuayBsaW5lIGlzIHN0cmlwcGVkLgorIwkJCS0gYSBsb25lICE6IHRoZSBsYXN0IG5ld2xpbmUgaW4gdGhlIHZhbHVlIGlzIHN0cmlwcGVkOworIwlNCXZhbHVlIGNhbiBiZSBtdWx0aXBsZSBsaW5lcyAocHJlZml4ZWQgYnkgYSB0YWIpIGFuZCBjb25zaXN0cworIwkJb2YgbXVsdGlwbGUgZmllbGRzLCBkZWxpbWl0ZWQgYnkgYSBmaWVsZCBzZXBhcmF0b3IgY2hhcmFjdGVyLgorIwkJVGhlIHZhbHVlIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIHRoZSBmLXMtYy4KKyMJcAl0YWcgdGFrZXMgcGFyYW1ldGVycyAodXNlZCB3aXRoIG0pLgorIwlzCXRhZyBjYW4gYmUgdXNlZCBzZXZlcmFsIHRpbWVzLgorCit1c2UgUE9TSVggcXcoRUlOVFIpOwordXNlIEdldG9wdDo6U3RkOwordXNlIENvbmZpZzsKKworJG9zID0gZGVmaW5lZCAkXk8gPyAkXk8gOiAndW5rbm93bic7CisKKygkcHJvZyA9ICQwKSA9fiBzIy4qLyMjOworCiskVXNhZ2UgPSA8PEVPRiA7CitVc2FnZTogJHByb2cgWy1zIHRlc3Qtc2V0XSBbLUMgY2F0ZWdvcnldIFstcCBwcm9nXSBbLXZdIFstZSBlPXZdIG5hbWUgLi4uCisJLXAgcAlVc2UgcCBhcyB0aGUgcHJvZ3JhbSB0byB0ZXN0CisJLUMgYwlTcGVjaWZ5IHRoZSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBjYXRlZ29yaWVzIHRoZSBwcm9ncmFtCisJCWJlbG9uZ3MgdG8gKHNlZSBjYXRlZ29yeSBmaWVsZCkuCisJLXMgcwlSZWFkIHRlc3RzIGZyb20gZmlsZSBzOyBpZiBzIGlzIGEgZGlyZWN0b3J5LCBpdCBpcyByZWN1cnNpdmVseQorCQlzY2FuZWQgZm9yIHRlc3QgZmlsZXMgKHdoaWNoIGVuZCBpbiAudCkuCisJLXQgdAlVc2UgdCBhcyBkZWZhdWx0IHRpbWUgbGltaXQgZm9yIHRlc3RzIChkZWZhdWx0IGlzIHVubGltaXRlZCkKKwktUAlwcm9ncmFtICgtcCkgc3RyaW5nIGhhcyBtdWx0aXBsZSB3b3JkcywgYW5kIHRoZSBwcm9ncmFtIGlzIGluCisJCXRoZSBwYXRoIChrbHVkZ2Ugb3B0aW9uKQorCS12CVZlcmJvc2UgbW9kZTogcHJpbnQgcmVhc29uIHRlc3QgZmFpbGVkLgorCS1lIGU9dglTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGUgdG8gdiBmb3IgYWxsIHRlc3RzCisJCShpZiBubyA9diBpcyBnaXZlbiwgdGhlIGN1cnJlbnQgdmFsdWUgaXMgdXNlZCkKKwkJT25seSBvbmUgLWUgb3B0aW9uIGNhbiBiZSBnaXZlbiBhdCB0aGUgbW9tZW50LCBzYWRseS4KKwluYW1lCXNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgdGVzdChzKSB0byBydW47IGlmIG5vbmUgYXJlCisJCXNwZWNpZmllZCwgYWxsIHRlc3RzIGFyZSBydW4uCitFT0YKKworIyBTZWUgY29tbWVudCBhYm92ZSBmb3IgZmxhZyBtZWFuaW5ncworJXRlc3RfZmllbGRzID0gKAorCSduYW1lJywJCQkJJ3InLAorCSdkZXNjcmlwdGlvbicsCQkJJ20nLAorCSdhcmd1bWVudHMnLAkJCSdNJywKKwknc2NyaXB0JywJCQknbScsCisJJ3N0ZGluJywJCQknbScsCisJJ3Blcmwtc2V0dXAnLAkJCSdtJywKKwkncGVybC1jbGVhbnVwJywJCQknbScsCisJJ2Vudi1zZXR1cCcsCQkJJ00nLAorCSdmaWxlLXNldHVwJywJCQknbXBzJywKKwknZmlsZS1yZXN1bHQnLAkJCSdtcHMnLAorCSd0aW1lLWxpbWl0JywJCQknJywKKwknZXhwZWN0ZWQtZmFpbCcsCQknJywKKwknZXhwZWN0ZWQtZXhpdCcsCQknJywKKwknZXhwZWN0ZWQtc3Rkb3V0JywJCSdtJywKKwknZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm4nLAknbScsCisJJ2V4cGVjdGVkLXN0ZGVycicsCQknbScsCisJJ2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuJywJJ20nLAorCSdjYXRlZ29yeScsCQkJJ20nLAorCSk7CisjIEZpbGxlZCBpbiBieSByZWFkX3Rlc3QoKQorJWludGVybmFsX3Rlc3RfZmllbGRzID0gKAorCSc6ZnVsbC1uYW1lJywgMSwJCSMgZmlsZTpuYW1lCisJJzpsb25nLW5hbWUnLCAxLAkJIyBkaXIvZmlsZTpsaW5lbm86bmFtZQorCSk7CisKKyMgQ2F0ZWdvcmllcyBvZiB0aGUgcHJvZ3JhbSB1bmRlciB0ZXN0LiBQcm92aWRlIHRoZSBjdXJyZW50CisjIG9zIGJ5IGRlZmF1bHQuCislY2F0ZWdvcmllcyA9ICgKKwkib3M6JG9zIiwgJzEnCisJKTsKKworJHRlbXBzID0gIi90bXAvcnRzJCQiOworJHRlbXBpID0gIi90bXAvcnRpJCQiOworJHRlbXBvID0gIi90bXAvcnRvJCQiOworJHRlbXBlID0gIi90bXAvcnRlJCQiOworJHRlbXBkaXIgPSAiL3RtcC9ydGQkJCI7CisKKyRuZmFpbGVkID0gMDsKKyRueGZhaWxlZCA9IDA7CiskbnBhc3NlZCA9IDA7CiskbnhwYXNzZWQgPSAwOworCisla25vd25fdGVzdHMgPSAoKTsKKworaWYgKCFnZXRvcHRzKCdDOnA6UHM6dDp2ZTonKSkgeworICAgIHByaW50IFNUREVSUiAkVXNhZ2U7CisgICAgZXhpdCAxOworfQorCitkaWUgIiRwcm9nOiBubyBwcm9ncmFtIHNwZWNpZmllZCAodXNlIC1wKVxuIiBpZiAhZGVmaW5lZCAkb3B0X3A7CitkaWUgIiRwcm9nOiBubyB0ZXN0IHNldCBzcGVjaWZpZWQgKHVzZSAtcylcbiIgaWYgIWRlZmluZWQgJG9wdF9zOworJHRlc3RfcHJvZyA9ICRvcHRfcDsKKyR2ZXJib3NlID0gZGVmaW5lZCAkb3B0X3YgJiYgJG9wdF92OworJHRlc3Rfc2V0ID0gJG9wdF9zOworaWYgKGRlZmluZWQgJG9wdF90KSB7CisgICAgZGllICIkcHJvZzogYmFkIC10IGFyZ3VtZW50IChzaG91bGQgYmUgbnVtYmVyID4gMCk6ICRvcHRfdFxuIgorCWlmICRvcHRfdCAhfiAvXlxkKyQvIHx8ICRvcHRfdCA8PSAwOworICAgICRkZWZhdWx0X3RpbWVfbGltaXQgPSAkb3B0X3Q7Cit9CiskcHJvZ3JhbV9rbHVkZ2UgPSBkZWZpbmVkICRvcHRfUCA/ICRvcHRfUCA6IDA7CisKK2lmIChkZWZpbmVkICRvcHRfQykgeworICAgIGZvcmVhY2ggJGMgKHNwbGl0KCcsJywgJG9wdF9DKSkgeworCSRjID1+IHMvXHMrLy87CisJZGllICIkcHJvZzogY2F0ZWdvcmllcyBjYW4ndCBiZSBuZWdhdGVkIG9uIHRoZSBjb21tYW5kIGxpbmVcbiIKKwkgICAgaWYgKCRjID1+IC9eIS8pOworCSRjYXRlZ29yaWVzeyRjfSA9IDE7CisgICAgfQorfQorCisjIE5vdGUgd2hpY2ggdGVzdHMgYXJlIHRvIGJlIHJ1bi4KKyVkb190ZXN0ID0gKCk7CitncmVwKCRkb190ZXN0eyRffSA9IDEsIEBBUkdWKTsKKyRhbGxfdGVzdHMgPSBAQVJHViA9PSAwOworCisjIFNldCB1cCBhIHZlcnkgbWluaW1hbCBlbnZpcm9ubWVudAorJW5ld19lbnYgPSAoKTsKK2ZvcmVhY2ggJGVudiAoKCdIT01FJywgJ0xEX0xJQlJBUllfUEFUSCcsICdMT0NQQVRIJywgJ0xPR05BTUUnLAorICAnUEFUSCcsICdTSEVMTCcsICdVU0VSJykpIHsKKyAgICAkbmV3X2VudnskZW52fSA9ICRFTlZ7JGVudn0gaWYgZGVmaW5lZCAkRU5WeyRlbnZ9OworfQorJG5ld19lbnZ7J0VOVid9ID0gJy9ub25leGlzdGFudCc7CitpZiAoKCRvcyBlcSAnVk1TJykgfHwgKCRDb25maWd7cGVybHBhdGh9ID1+IG0vJENvbmZpZ3tfZXhlfSQvaSkpIHsKKwkkbmV3X2VudnsnX19wZXJsbmFtZSd9ID0gJENvbmZpZ3twZXJscGF0aH07Cit9IGVsc2UgeworCSRuZXdfZW52eydfX3BlcmxuYW1lJ30gPSAkQ29uZmlne3BlcmxwYXRofSAuICRDb25maWd7X2V4ZX07Cit9CitpZiAoZGVmaW5lZCAkb3B0X2UpIHsKKyAgICAjIFhYWCBuZWVkIGEgd2F5IHRvIGFsbG93IG1hbnkgLWUgYXJndW1lbnRzLi4uCisgICAgaWYgKCRvcHRfZSA9fiAvXihbYS16QS1aX11cdyopKHw9KC4qKSkkLykgeworCSRuZXdfZW52eyQxfSA9ICQyIGVxICcnID8gJEVOVnskMX0gOiAkMzsKKyAgICB9IGVsc2UgeworCWRpZSAiJDA6IGJhZCAtZSBhcmd1bWVudDogJG9wdF9lXG4iOworICAgIH0KK30KKyVvbGRfZW52ID0gJUVOVjsKKworZGllICIkcHJvZzogY291bGRuJ3QgbWFrZSBkaXJlY3RvcnkgJHRlbXBkaXIgLSAkIVxuIiBpZiAhbWtkaXIoJHRlbXBkaXIsIDA3NzcpOworCitjaG9wKCRwd2QgPSBgcHdkIDI+L2Rldi9udWxsYCk7CitkaWUgIiRwcm9nOiBjb3VsZG4ndCBnZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeVxuIiBpZiAkcHdkIGVxICcnOworZGllICIkcHJvZzogY291bGRuJ3QgY2QgdG8gJHB3ZCAtICQhXG4iIGlmICFjaGRpcigkcHdkKTsKKworaWYgKCEkcHJvZ3JhbV9rbHVkZ2UpIHsKKyAgICAkdGVzdF9wcm9nID0gIiRwd2QvJHRlc3RfcHJvZyIgaWYgc3Vic3RyKCR0ZXN0X3Byb2csIDAsIDEpIG5lICcvJzsKKyAgICBkaWUgIiRwcm9nOiAkdGVzdF9wcm9nIGlzIG5vdCBleGVjdXRhYmxlIC0gYnllXG4iCisJaWYgKCEgLXggJHRlc3RfcHJvZyAmJiAkb3MgbmUgJ29zMicpOworfQorCitAdHJhcF9zaWdzID0gKCdURVJNJywgJ1FVSVQnLCAnSU5UJywgJ1BJUEUnLCAnSFVQJyk7CitAU0lHe0B0cmFwX3NpZ3N9ID0gKCdjbGVhbnVwX2V4aXQnKSB4IEB0cmFwX3NpZ3M7CiskY2hpbGRfa2lsbF9vayA9IDA7CiskU0lHeydBTFJNJ30gPSAnY2F0Y2hfc2lnYWxybSc7CisKKyR8ID0gMTsKKworaWYgKC1kICR0ZXN0X3NldCkgeworICAgICRmaWxlX3ByZWZpeF9za2lwID0gbGVuZ3RoKCR0ZXN0X3NldCkgKyAxOworICAgICRyZXQgPSAmcHJvY2Vzc190ZXN0X2RpcigkdGVzdF9zZXQpOworfSBlbHNlIHsKKyAgICAkZmlsZV9wcmVmaXhfc2tpcCA9IDA7CisgICAgJHJldCA9ICZwcm9jZXNzX3Rlc3RfZmlsZSgkdGVzdF9zZXQpOworfQorJmNsZWFudXBfZXhpdCgpIGlmICFkZWZpbmVkICRyZXQ7CisKKyR0b3RfZmFpbGVkID0gJG5mYWlsZWQgKyAkbnhmYWlsZWQ7CiskdG90X3Bhc3NlZCA9ICRucGFzc2VkICsgJG54cGFzc2VkOworaWYgKCR0b3RfZmFpbGVkIHx8ICR0b3RfcGFzc2VkKSB7CisgICAgcHJpbnQgIlRvdGFsIGZhaWxlZDogJHRvdF9mYWlsZWQiOworICAgIHByaW50ICIgKCRueGZhaWxlZCB1bmV4cGVjdGVkKSIgaWYgJG54ZmFpbGVkOworICAgIHByaW50ICIgKGFzIGV4cGVjdGVkKSIgaWYgJG5mYWlsZWQgJiYgISRueGZhaWxlZDsKKyAgICBwcmludCAiXG5Ub3RhbCBwYXNzZWQ6ICR0b3RfcGFzc2VkIjsKKyAgICBwcmludCAiICgkbnhwYXNzZWQgdW5leHBlY3RlZCkiIGlmICRueHBhc3NlZDsKKyAgICBwcmludCAiXG4iOworfQorCismY2xlYW51cF9leGl0KCdvaycpOworCitzdWIKK2NsZWFudXBfZXhpdAoreworICAgIGxvY2FsKCRzaWcsICRleGl0Y29kZSkgPSAoJycsIDEpOworCisgICAgaWYgKCRfWzBdIGVxICdvaycpIHsKKwkkZXhpdGNvZGUgPSAwOworICAgIH0gZWxzaWYgKCRfWzBdIG5lICcnKSB7CisJJHNpZyA9ICRfWzBdOworICAgIH0KKworICAgIHVubGluaygkdGVtcGksICR0ZW1wbywgJHRlbXBlLCAkdGVtcHMpOworICAgICZzY3J1Yl9kaXIoJHRlbXBkaXIpIGlmIGRlZmluZWQgJHRlbXBkaXI7CisgICAgcm1kaXIoJHRlbXBkaXIpIGlmIGRlZmluZWQgJHRlbXBkaXI7CisKKyAgICBpZiAoJHNpZykgeworCSRTSUd7JHNpZ30gPSAnREVGQVVMVCc7CisJa2lsbCAkc2lnLCAkJDsKKwlyZXR1cm47CisgICAgfQorICAgIGV4aXQgJGV4aXRjb2RlOworfQorCitzdWIKK2NhdGNoX3NpZ2Fscm0KK3sKKyAgICAkU0lHeydBTFJNJ30gPSAnY2F0Y2hfc2lnYWxybSc7CisgICAga2lsbCg5LCAkY2hpbGRfcGlkKSBpZiAkY2hpbGRfa2lsbF9vazsKKyAgICAkY2hpbGRfa2lsbGVkID0gMTsKK30KKworc3ViCitwcm9jZXNzX3Rlc3RfZGlyCit7CisgICAgbG9jYWwoJGRpcikgPSBAXzsKKyAgICBsb2NhbCgkcmV0LCAkZmlsZSk7CisgICAgbG9jYWwoQHRvZG8pID0gKCk7CisKKyAgICBpZiAoIW9wZW5kaXIoRElSLCAkZGlyKSkgeworCXByaW50IFNUREVSUiAiJHByb2c6IGNhbid0IG9wZW4gZGlyZWN0b3J5ICRkaXIgLSAkIVxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorICAgIHdoaWxlIChkZWZpbmVkICgkZmlsZSA9IHJlYWRkaXIoRElSKSkpIHsKKwlwdXNoKEB0b2RvLCAkZmlsZSkgaWYgJGZpbGUgPX4gL15bXi5dLipcLnQkLzsKKyAgICB9CisgICAgY2xvc2VkaXIoRElSKTsKKworICAgIGZvcmVhY2ggJGZpbGUgKEB0b2RvKSB7CisJJGZpbGUgPSAiJGRpci8kZmlsZSI7CisJaWYgKC1kICRmaWxlKSB7CisJICAgICRyZXQgPSAmcHJvY2Vzc190ZXN0X2RpcigkZmlsZSk7CisJfSBlbHNpZiAoLWYgXykgeworCSAgICAkcmV0ID0gJnByb2Nlc3NfdGVzdF9maWxlKCRmaWxlKTsKKwl9CisJbGFzdCBpZiAhZGVmaW5lZCAkcmV0OworICAgIH0KKworICAgIHJldHVybiAkcmV0OworfQorCitzdWIKK3Byb2Nlc3NfdGVzdF9maWxlCit7CisgICAgbG9jYWwoJGZpbGUpID0gQF87CisgICAgbG9jYWwoJHJldCk7CisKKyAgICBpZiAoIW9wZW4oSU4sICRmaWxlKSkgeworCXByaW50IFNUREVSUiAiJHByb2c6IGNhbid0IG9wZW4gJGZpbGUgLSAkIVxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorICAgIGJpbm1vZGUoSU4pOworICAgIHdoaWxlICgxKSB7CisJJHJldCA9ICZyZWFkX3Rlc3QoJGZpbGUsIElOLCAqdGVzdCk7CisJbGFzdCBpZiAhZGVmaW5lZCAkcmV0IHx8ICEkcmV0OworCW5leHQgaWYgISRhbGxfdGVzdHMgJiYgISRkb190ZXN0eyR0ZXN0eyduYW1lJ319OworCW5leHQgaWYgISZjYXRlZ29yeV9jaGVjaygqdGVzdCk7CisJJHJldCA9ICZydW5fdGVzdCgqdGVzdCk7CisJbGFzdCBpZiAhZGVmaW5lZCAkcmV0OworICAgIH0KKyAgICBjbG9zZShJTik7CisKKyAgICByZXR1cm4gJHJldDsKK30KKworc3ViCitydW5fdGVzdAoreworICAgIGxvY2FsKCp0ZXN0KSA9IEBfOworICAgIGxvY2FsKCRuYW1lKSA9ICR0ZXN0eyc6ZnVsbC1uYW1lJ307CisKKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsnc3RkaW4nfSkgeworCXJldHVybiB1bmRlZiBpZiAhJndyaXRlX2ZpbGUoJHRlbXBpLCAkdGVzdHsnc3RkaW4nfSk7CisJJGlmaWxlID0gJHRlbXBpOworICAgIH0gZWxzZSB7CisJJGlmaWxlID0gJy9kZXYvbnVsbCc7CisgICAgfQorCisgICAgaWYgKGRlZmluZWQgJHRlc3R7J3NjcmlwdCd9KSB7CisJcmV0dXJuIHVuZGVmIGlmICEmd3JpdGVfZmlsZSgkdGVtcHMsICR0ZXN0eydzY3JpcHQnfSk7CisgICAgfQorCisgICAgcmV0dXJuIHVuZGVmIGlmICEmc2NydWJfZGlyKCR0ZW1wZGlyKTsKKworICAgIGlmICghY2hkaXIoJHRlbXBkaXIpKSB7CisJcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3QgY2QgdG8gJHRlbXBkaXIgLSAkIVxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorCisgICAgaWYgKGRlZmluZWQgJHRlc3R7J2ZpbGUtc2V0dXAnfSkgeworCWxvY2FsKCRpKTsKKwlsb2NhbCgkdHlwZSwgJHBlcm0sICRyZXN0LCAkYywgJGxlbiwgJG5hbWUpOworCisJZm9yICgkaSA9IDA7ICRpIDwgJHRlc3R7J2ZpbGUtc2V0dXAnfTsgJGkrKykgeworCSAgICAkdmFsID0gJHRlc3R7ImZpbGUtc2V0dXA6JGkifTsKKworCSAgICAjIGZvcm1hdCBpczogdHlwZSBwZXJtICJuYW1lIgorCSAgICAoJHR5cGUsICRwZXJtLCAkcmVzdCkgPQorCQlzcGxpdCgnICcsICR2YWwsIDMpOworCSAgICAkYyA9IHN1YnN0cigkcmVzdCwgMCwgMSk7CisJICAgICRsZW4gPSBpbmRleCgkcmVzdCwgJGMsIDEpIC0gMTsKKwkgICAgJG5hbWUgPSBzdWJzdHIoJHJlc3QsIDEsICRsZW4pOworCSAgICAkcmVzdCA9IHN1YnN0cigkcmVzdCwgMiArICRsZW4pOworCSAgICAkcGVybSA9IG9jdCgkcGVybSkgaWYgJHBlcm0gPX4gL15cZCskLzsKKwkgICAgaWYgKCR0eXBlIGVxICdmaWxlJykgeworCQlyZXR1cm4gdW5kZWYgaWYgISZ3cml0ZV9maWxlKCRuYW1lLCAkcmVzdCk7CisJCWlmICghY2htb2QoJHBlcm0sICRuYW1lKSkgeworCQkgICAgcHJpbnQgU1RERVJSCisJCSAgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGNhbid0IGNobW9kICRwZXJtICRuYW1lIC0gJCFcbiI7CisJCSAgICByZXR1cm4gdW5kZWY7CisJCX0KKwkgICAgfSBlbHNpZiAoJHR5cGUgZXEgJ2RpcicpIHsKKwkJaWYgKCFta2RpcigkbmFtZSwgJHBlcm0pKSB7CisJCSAgICBwcmludCBTVERFUlIKKwkJICAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogY2FuJ3QgbWtkaXIgJHBlcm0gJG5hbWUgLSAkIVxuIjsKKwkJICAgIHJldHVybiB1bmRlZjsKKwkJfQorCSAgICB9IGVsc2lmICgkdHlwZSBlcSAnc3ltbGluaycpIHsKKwkJbG9jYWwoJG91bWFzaykgPSB1bWFzaygkcGVybSk7CisJCWxvY2FsKCRyZXQpID0gc3ltbGluaygkcmVzdCwgJG5hbWUpOworCQl1bWFzaygkb3VtYXNrKTsKKwkJaWYgKCEkcmV0KSB7CisJCSAgICBwcmludCBTVERFUlIKKwkgICAgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGNvdWxkbid0IGNyZWF0ZSBzeW1saW5rICRuYW1lIC0gJCFcbiI7CisJCSAgICByZXR1cm4gdW5kZWY7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsncGVybC1zZXR1cCd9KSB7CisJZXZhbCAkdGVzdHsncGVybC1zZXR1cCd9OworCWlmICgkQCBuZSAnJykgeworCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGVycm9yIHJ1bm5pbmcgcGVybC1zZXR1cCAtICRAXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorICAgIH0KKworICAgICRwaWQgPSBmb3JrOworICAgIGlmICghZGVmaW5lZCAkcGlkKSB7CisJcHJpbnQgU1RERVJSICIkcHJvZzogY2FuJ3QgZm9yayAtICQhXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisgICAgaWYgKCEkcGlkKSB7CisJQFNJR3tAdHJhcF9zaWdzfSA9ICgnREVGQVVMVCcpIHggQHRyYXBfc2lnczsKKwkkU0lHeydBTFJNJ30gPSAnREVGQVVMVCc7CisJaWYgKGRlZmluZWQgJHRlc3R7J2Vudi1zZXR1cCd9KSB7CisJICAgIGxvY2FsKCR2YXIsICR2YWwsICRpKTsKKworCSAgICBmb3JlYWNoICR2YXIgKHNwbGl0KHN1YnN0cigkdGVzdHsnZW52LXNldHVwJ30sIDAsIDEpLAorCQkkdGVzdHsnZW52LXNldHVwJ30pKQorCSAgICB7CisJCSRpID0gaW5kZXgoJHZhciwgJz0nKTsKKwkJbmV4dCBpZiAkaSA9PSAwIHx8ICR2YXIgZXEgJyc7CisJCWlmICgkaSA8IDApIHsKKwkJICAgIGRlbGV0ZSAkbmV3X2VudnskdmFyfTsKKwkJfSBlbHNlIHsKKwkJICAgICRuZXdfZW52e3N1YnN0cigkdmFyLCAwLCAkaSl9ID0gc3Vic3RyKCR2YXIsICRpICsgMSk7CisJCX0KKwkgICAgfQorCX0KKwlpZiAoIW9wZW4oU1RESU4sICI8ICRpZmlsZSIpKSB7CisJCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IG9wZW4gJGlmaWxlIGluIGNoaWxkIC0gJCFcbiI7CisJCWtpbGwoJ1RFUk0nLCAkJCk7CisJfQorCWJpbm1vZGUoU1RESU4pOworCWlmICghb3BlbihTVERPVVQsICI+ICR0ZW1wbyIpKSB7CisJCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IG9wZW4gJHRlbXBvIGluIGNoaWxkIC0gJCFcbiI7CisJCWtpbGwoJ1RFUk0nLCAkJCk7CisJfQorCWJpbm1vZGUoU1RET1VUKTsKKwlpZiAoIW9wZW4oU1RERVJSLCAiPiAkdGVtcGUiKSkgeworCQlwcmludCBTVERPVVQgIiRwcm9nOiBjb3VsZG4ndCBvcGVuICR0ZW1wZSBpbiBjaGlsZCAtICQhXG4iOworCQlraWxsKCdURVJNJywgJCQpOworCX0KKwliaW5tb2RlKFNUREVSUik7CisJaWYgKCRwcm9ncmFtX2tsdWRnZSkgeworCSAgICBAYXJndiA9IHNwbGl0KCcgJywgJHRlc3RfcHJvZyk7CisJfSBlbHNlIHsKKwkgICAgQGFyZ3YgPSAoJHRlc3RfcHJvZyk7CisJfQorCWlmIChkZWZpbmVkICR0ZXN0eydhcmd1bWVudHMnfSkgeworCQlwdXNoKEBhcmd2LAorCQkgICAgIHNwbGl0KHN1YnN0cigkdGVzdHsnYXJndW1lbnRzJ30sIDAsIDEpLAorCQkJICAgc3Vic3RyKCR0ZXN0eydhcmd1bWVudHMnfSwgMSkpKTsKKwl9CisJcHVzaChAYXJndiwgJHRlbXBzKSBpZiBkZWZpbmVkICR0ZXN0eydzY3JpcHQnfTsKKworCSNYWFggcmVhbHBhdGhpc2UsIHVzZSB3aGljaC93aGVuY2UgLXAsIG9yIHN0aC4gbGlrZSB0aGF0CisJI1hYWCBpZiAhJHByb2dyYW1fa2x1ZGdlLCB3ZSBnZXQgYnkgd2l0aCBub3QgZG9pbmcgaXQgZm9yIG5vdyB0aG8KKwkkbmV3X2VudnsnX19wcm9nbmFtZSd9ID0gJGFyZ3ZbMF07CisKKwkjIFRoZSBmb2xsb3dpbmcgZG9lc24ndCB3b3JrIHdpdGggcGVybDUuLi4gIE5lZWQgdG8gZG8gaXQgZXhwbGljaXRseSAtIHl1Y2suCisJIyVFTlYgPSAlbmV3X2VudjsKKwlmb3JlYWNoICRrIChrZXlzKCVFTlYpKSB7CisJICAgIGRlbGV0ZSAkRU5WeyRrfTsKKwl9CisJJEVOVnska30gPSAkdiB3aGlsZSAoJGssJHYpID0gZWFjaCAlbmV3X2VudjsKKworCWV4ZWMgeyAkYXJndlswXSB9IEBhcmd2OworCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IGV4ZWN1dGUgJHRlc3RfcHJvZyAtICQhXG4iOworCWtpbGwoJ1RFUk0nLCAkJCk7CisJZXhpdCg5NSk7CisgICAgfQorICAgICRjaGlsZF9waWQgPSAkcGlkOworICAgICRjaGlsZF9raWxsZWQgPSAwOworICAgICRjaGlsZF9raWxsX29rID0gMTsKKyAgICBhbGFybSgkdGVzdHsndGltZS1saW1pdCd9KSBpZiBkZWZpbmVkICR0ZXN0eyd0aW1lLWxpbWl0J307CisgICAgd2hpbGUgKDEpIHsKKwkkeHBpZCA9IHdhaXRwaWQoJHBpZCwgMCk7CisJJGNoaWxkX2tpbGxfb2sgPSAwOworCWlmICgkeHBpZCA8IDApIHsKKwkgICAgbmV4dCBpZiAkISA9PSBFSU5UUjsKKwkgICAgcHJpbnQgU1RERVJSICIkcHJvZzogZXJyb3Igd2FpdGluZyBmb3IgY2hpbGQgLSAkIVxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKwlsYXN0OworICAgIH0KKyAgICAkc3RhdHVzID0gJD87CisgICAgYWxhcm0oMCkgaWYgZGVmaW5lZCAkdGVzdHsndGltZS1saW1pdCd9OworCisgICAgJGZhaWxlZCA9IDA7CisgICAgJHdoeSA9ICcnOworCisgICAgaWYgKCRjaGlsZF9raWxsZWQpIHsKKwkkZmFpbGVkID0gMTsKKwkkd2h5IC49ICJcdHRlc3QgdGltZWQgb3V0IChsaW1pdCBvZiAkdGVzdHsndGltZS1saW1pdCd9IHNlY29uZHMpXG4iOworICAgIH0KKworICAgICRyZXQgPSAmZXZhbF9leGl0KCR0ZXN0eydsb25nLW5hbWUnfSwgJHN0YXR1cywgJHRlc3R7J2V4cGVjdGVkLWV4aXQnfSk7CisgICAgcmV0dXJuIHVuZGVmIGlmICFkZWZpbmVkICRyZXQ7CisgICAgaWYgKCEkcmV0KSB7CisJbG9jYWwoJGV4cGwpOworCisJJGZhaWxlZCA9IDE7CisJaWYgKCgkc3RhdHVzICYgMHhmZikgPT0gMHg3ZikgeworCSAgICAkZXhwbCA9ICJzdG9wcGVkIjsKKwl9IGVsc2lmICgoJHN0YXR1cyAmIDB4ZmYpKSB7CisJICAgICRleHBsID0gInNpZ25hbCAiIC4gKCRzdGF0dXMgJiAweDdmKTsKKwl9IGVsc2UgeworCSAgICAkZXhwbCA9ICJleGl0LWNvZGUgIiAuICgoJHN0YXR1cyA+PiA4KSAmIDB4ZmYpOworCX0KKwkkd2h5IC49CisJIlx0dW5leHBlY3RlZCBleGl0IHN0YXR1cyAkc3RhdHVzICgkZXhwbCksIGV4cGVjdGVkICR0ZXN0eydleHBlY3RlZC1leGl0J31cbiI7CisgICAgfQorCisgICAgJHRtcCA9ICZjaGVja19vdXRwdXQoJHRlc3R7J2xvbmctbmFtZSd9LCAkdGVtcG8sICdzdGRvdXQnLAorCQkkdGVzdHsnZXhwZWN0ZWQtc3Rkb3V0J30sICR0ZXN0eydleHBlY3RlZC1zdGRvdXQtcGF0dGVybid9KTsKKyAgICByZXR1cm4gdW5kZWYgaWYgIWRlZmluZWQgJHRtcDsKKyAgICBpZiAoJHRtcCBuZSAnJykgeworCSRmYWlsZWQgPSAxOworCSR3aHkgLj0gJHRtcDsKKyAgICB9CisKKyAgICAkdG1wID0gJmNoZWNrX291dHB1dCgkdGVzdHsnbG9uZy1uYW1lJ30sICR0ZW1wZSwgJ3N0ZGVycicsCisJCSR0ZXN0eydleHBlY3RlZC1zdGRlcnInfSwgJHRlc3R7J2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuJ30pOworICAgIHJldHVybiB1bmRlZiBpZiAhZGVmaW5lZCAkdG1wOworICAgIGlmICgkdG1wIG5lICcnKSB7CisJJGZhaWxlZCA9IDE7CisJJHdoeSAuPSAkdG1wOworICAgIH0KKworICAgICR0bXAgPSAmY2hlY2tfZmlsZV9yZXN1bHQoKnRlc3QpOworICAgIHJldHVybiB1bmRlZiBpZiAhZGVmaW5lZCAkdG1wOworICAgIGlmICgkdG1wIG5lICcnKSB7CisJJGZhaWxlZCA9IDE7CisJJHdoeSAuPSAkdG1wOworICAgIH0KKworICAgIGlmIChkZWZpbmVkICR0ZXN0eydwZXJsLWNsZWFudXAnfSkgeworCWV2YWwgJHRlc3R7J3BlcmwtY2xlYW51cCd9OworCWlmICgkQCBuZSAnJykgeworCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGVycm9yIHJ1bm5pbmcgcGVybC1jbGVhbnVwIC0gJEBcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisgICAgfQorCisgICAgaWYgKCFjaGRpcigkcHdkKSkgeworCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IGNkIHRvICRwd2QgLSAkIVxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorCisgICAgaWYgKCRmYWlsZWQpIHsKKwlpZiAoISR0ZXN0eydleHBlY3RlZC1mYWlsJ30pIHsKKwkgICAgcHJpbnQgIkZBSUwgJG5hbWVcbiI7CisJICAgICRueGZhaWxlZCsrOworCX0gZWxzZSB7CisJICAgIHByaW50ICJmYWlsICRuYW1lIChhcyBleHBlY3RlZClcbiI7CisJICAgICRuZmFpbGVkKys7CisJfQorCSR3aHkgPSAiXHREZXNjcmlwdGlvbiIKKwkJLiAmd3JhcF9saW5lcygkdGVzdHsnZGVzY3JpcHRpb24nfSwgIiAobWlzc2luZylcbiIpCisJCS4gJHdoeTsKKyAgICB9IGVsc2lmICgkdGVzdHsnZXhwZWN0ZWQtZmFpbCd9KSB7CisJcHJpbnQgIlBBU1MgJG5hbWUgKHVuZXhwZWN0ZWRseSlcbiI7CisJJG54cGFzc2VkKys7CisgICAgfSBlbHNlIHsKKwlwcmludCAicGFzcyAkbmFtZVxuIjsKKwkkbnBhc3NlZCsrOworICAgIH0KKyAgICBwcmludCAkd2h5IGlmICR2ZXJib3NlOworICAgIHJldHVybiAwOworfQorCitzdWIKK2NhdGVnb3J5X2NoZWNrCit7CisgICAgbG9jYWwoKnRlc3QpID0gQF87CisgICAgbG9jYWwoJGMpOworCisgICAgcmV0dXJuIDEgaWYgKCFkZWZpbmVkICR0ZXN0eydjYXRlZ29yeSd9KTsKKyAgICBsb2NhbCgkb2spID0gMDsKKyAgICBmb3JlYWNoICRjIChzcGxpdCgnLCcsICR0ZXN0eydjYXRlZ29yeSd9KSkgeworCSRjID1+IHMvXHMrLy87CisJaWYgKCRjID1+IC9eIS8pIHsKKwkgICAgJGMgPSAkJzsKKwkgICAgcmV0dXJuIDAgaWYgKGRlZmluZWQgJGNhdGVnb3JpZXN7JGN9KTsKKwkgICAgJG9rID0gMTsKKwl9IGVsc2UgeworCSAgICAkb2sgPSAxIGlmIChkZWZpbmVkICRjYXRlZ29yaWVzeyRjfSk7CisJfQorICAgIH0KKyAgICByZXR1cm4gJG9rOworfQorCitzdWIKK3NjcnViX2RpcgoreworICAgIGxvY2FsKCRkaXIpID0gQF87CisgICAgbG9jYWwoQHRvZG8pID0gKCk7CisgICAgbG9jYWwoJGZpbGUpOworCisgICAgaWYgKCFvcGVuZGlyKERJUiwgJGRpcikpIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiBjb3VsZG4ndCBvcGVuIGRpcmVjdG9yeSAkZGlyIC0gJCFcbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICB3aGlsZSAoZGVmaW5lZCAoJGZpbGUgPSByZWFkZGlyKERJUikpKSB7CisJcHVzaChAdG9kbywgJGZpbGUpIGlmICRmaWxlIG5lICcuJyAmJiAkZmlsZSBuZSAnLi4nOworICAgIH0KKyAgICBjbG9zZWRpcihESVIpOworICAgIGZvcmVhY2ggJGZpbGUgKEB0b2RvKSB7CisJJGZpbGUgPSAiJGRpci8kZmlsZSI7CisJaWYgKC1kICRmaWxlKSB7CisJICAgIHJldHVybiB1bmRlZiBpZiAhJnNjcnViX2RpcigkZmlsZSk7CisJICAgIGlmICghcm1kaXIoJGZpbGUpKSB7CisJCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IHJtZGlyICRmaWxlIC0gJCFcbiI7CisJCXJldHVybiB1bmRlZjsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmICghdW5saW5rKCRmaWxlKSkgeworCQlwcmludCBTVERFUlIgIiRwcm9nOiBjb3VsZG4ndCB1bmxpbmsgJGZpbGUgLSAkIVxuIjsKKwkJcmV0dXJuIHVuZGVmOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3ViCit3cml0ZV9maWxlCit7CisgICAgbG9jYWwoJGZpbGUsICRzdHIpID0gQF87CisKKyAgICBpZiAoIW9wZW4oVEVNUCwgIj4gJGZpbGUiKSkgeworCXByaW50IFNUREVSUiAiJHByb2c6IGNhbid0IG9wZW4gJGZpbGUgLSAkIVxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorICAgIGJpbm1vZGUoVEVNUCk7CisgICAgcHJpbnQgVEVNUCAkc3RyOworICAgIGlmICghY2xvc2UoVEVNUCkpIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiBlcnJvciB3cml0aW5nICRmaWxlIC0gJCFcbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3ViCitjaGVja19vdXRwdXQKK3sKKyAgICBsb2NhbCgkbmFtZSwgJGZpbGUsICR3aGF0LCAkZXhwZWN0LCAkZXhwZWN0X3BhdCkgPSBAXzsKKyAgICBsb2NhbCgkZ290KSA9ICcnOworICAgIGxvY2FsKCR3aHkpID0gJyc7CisgICAgbG9jYWwoJHJldCk7CisKKyAgICBpZiAoIW9wZW4oVEVNUCwgIjwgJGZpbGUiKSkgeworCXByaW50IFNUREVSUiAiJHByb2c6JG5hbWUoJHdoYXQpOiBjb3VsZG4ndCBvcGVuICRmaWxlIGFmdGVyIHJ1bm5pbmcgcHJvZ3JhbSAtICQhXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisgICAgYmlubW9kZShURU1QKTsKKyAgICB3aGlsZSAoPFRFTVA+KSB7CisJJGdvdCAuPSAkXzsKKyAgICB9CisgICAgY2xvc2UoVEVNUCk7CisgICAgcmV0dXJuIGNvbXBhcmVfb3V0cHV0KCRuYW1lLCAkd2hhdCwgJGV4cGVjdCwgJGV4cGVjdF9wYXQsICRnb3QpOworfQorCitzdWIKK2NvbXBhcmVfb3V0cHV0Cit7CisgICAgbG9jYWwoJG5hbWUsICR3aGF0LCAkZXhwZWN0LCAkZXhwZWN0X3BhdCwgJGdvdCkgPSBAXzsKKyAgICBsb2NhbCgkd2h5KSA9ICcnOworCisgICAgaWYgKGRlZmluZWQgJGV4cGVjdF9wYXQpIHsKKwkkXyA9ICRnb3Q7CisJJHJldCA9IGV2YWwgIiRleHBlY3RfcGF0IjsKKwlpZiAoJEAgbmUgJycpIHsKKwkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokbmFtZSgkd2hhdCk6IGVycm9yIGV2YWx1YXRpbmcgJHdoYXQgcGF0dGVybjogJGV4cGVjdF9wYXQgLSAkQFxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKwlpZiAoISRyZXQpIHsKKwkgICAgJHdoeSA9ICJcdHVuZXhwZWN0ZWQgJHdoYXQgLSB3YW50ZWQgcGF0dGVybiI7CisJICAgICR3aHkgLj0gJndyYXBfbGluZXMoJGV4cGVjdF9wYXQpOworCSAgICAkd2h5IC49ICJcdGdvdCI7CisJICAgICR3aHkgLj0gJndyYXBfbGluZXMoJGdvdCk7CisJfQorICAgIH0gZWxzZSB7CisJJGV4cGVjdCA9ICcnIGlmICFkZWZpbmVkICRleHBlY3Q7CisJaWYgKCRnb3QgbmUgJGV4cGVjdCkgeworCSAgICAkd2h5IC49ICJcdHVuZXhwZWN0ZWQgJHdoYXQgLSAiIC4gJmZpcnN0X2RpZmYoJGV4cGVjdCwgJGdvdCkgLiAiXG4iOworCSAgICAkd2h5IC49ICJcdHdhbnRlZCI7CisJICAgICR3aHkgLj0gJndyYXBfbGluZXMoJGV4cGVjdCk7CisJICAgICR3aHkgLj0gIlx0Z290IjsKKwkgICAgJHdoeSAuPSAmd3JhcF9saW5lcygkZ290KTsKKwl9CisgICAgfQorICAgIHJldHVybiAkd2h5OworfQorCitzdWIKK3dyYXBfbGluZXMKK3sKKyAgICBsb2NhbCgkc3RyLCAkZW1wdHkpID0gQF87CisgICAgbG9jYWwoJG5vbmwpID0gc3Vic3RyKCRzdHIsIC0xLCAxKSBuZSAiXG4iOworCisgICAgcmV0dXJuIChkZWZpbmVkICRlbXB0eSA/ICRlbXB0eSA6ICIgbm90aGluZ1xuIikgaWYgJHN0ciBlcSAnJzsKKyAgICBzdWJzdHIoJHN0ciwgMCwgMCkgPSAiOlxuIjsKKyAgICAkc3RyID1+IHMvXG4vXG5cdFx0L2c7CisgICAgaWYgKCRub25sKSB7CisJJHN0ciAuPSAiXG5cdFtpbmNvbXBsZXRlIGxhc3QgbGluZV1cbiI7CisgICAgfSBlbHNlIHsKKwljaG9wKCRzdHIpOworCWNob3AoJHN0cik7CisgICAgfQorICAgIHJldHVybiAkc3RyOworfQorCitzdWIKK2ZpcnN0X2RpZmYKK3sKKyAgICBsb2NhbCgkZXhwLCAkZ290KSA9IEBfOworICAgIGxvY2FsKCRsaW5lbm8sICRjaGFyKSA9ICgxLCAxKTsKKyAgICBsb2NhbCgkaSwgJGV4cF9sZW4sICRnb3RfbGVuKTsKKyAgICBsb2NhbCgkY2UsICRjZyk7CisKKyAgICAkZXhwX2xlbiA9IGxlbmd0aCgkZXhwKTsKKyAgICAkZ290X2xlbiA9IGxlbmd0aCgkZ290KTsKKyAgICBpZiAoJGV4cF9sZW4gIT0gJGdvdF9sZW4pIHsKKwlpZiAoJGV4cF9sZW4gPCAkZ290X2xlbikgeworCSAgICBpZiAoc3Vic3RyKCRnb3QsIDAsICRleHBfbGVuKSBlcSAkZXhwKSB7CisJCXJldHVybiAiZ290IHRvbyBtdWNoIG91dHB1dCI7CisJICAgIH0KKwl9IGVsc2lmIChzdWJzdHIoJGV4cCwgMCwgJGdvdF9sZW4pIGVxICRnb3QpIHsKKwkgICAgcmV0dXJuICJnb3QgdG9vIGxpdHRsZSBvdXRwdXQiOworCX0KKyAgICB9CisgICAgZm9yICgkaSA9IDA7ICRpIDwgJGV4cF9sZW47ICRpKyspIHsKKwkkY2UgPSBzdWJzdHIoJGV4cCwgJGksIDEpOworCSRjZyA9IHN1YnN0cigkZ290LCAkaSwgMSk7CisJbGFzdCBpZiAkY2UgbmUgJGNnOworCSRjaGFyKys7CisJaWYgKCRjZSBlcSAiXG4iKSB7CisJICAgICRsaW5lbm8rKzsKKwkgICAgJGNoYXIgPSAxOworCX0KKyAgICB9CisgICAgcmV0dXJuICJmaXJzdCBkaWZmZXJlbmNlOiBsaW5lICRsaW5lbm8sIGNoYXIgJGNoYXIgKHdhbnRlZCAnIgorCS4gJmZvcm1hdF9jaGFyKCRjZSkgLiAiJywgZ290ICciCisJLiAmZm9ybWF0X2NoYXIoJGNnKSAuICInIjsKK30KKworc3ViCitmb3JtYXRfY2hhcgoreworICAgIGxvY2FsKCRjaCwgJHMpOworCisgICAgJGNoID0gb3JkKCRfWzBdKTsKKyAgICBpZiAoJGNoID09IDEwKSB7CisJcmV0dXJuICdcbic7CisgICAgfSBlbHNpZiAoJGNoID09IDEzKSB7CisJcmV0dXJuICdccic7CisgICAgfSBlbHNpZiAoJGNoID09IDgpIHsKKwlyZXR1cm4gJ1xiJzsKKyAgICB9IGVsc2lmICgkY2ggPT0gOSkgeworCXJldHVybiAnXHQnOworICAgIH0gZWxzaWYgKCRjaCA+IDEyNykgeworCSRjaCAtPSAxMjc7CisJJHMgPSAiTS0iOworICAgIH0gZWxzZSB7CisJJHMgPSAnJzsKKyAgICB9CisgICAgaWYgKCRjaCA8IDMyKSB7CisJJHMgLj0gJ14nOworCSRjaCArPSBvcmQoJ0AnKTsKKyAgICB9IGVsc2lmICgkY2ggPT0gMTI3KSB7CisJcmV0dXJuICRzIC4gIl4/IjsKKyAgICB9CisgICAgcmV0dXJuICRzIC4gc3ByaW50ZigiJWMiLCAkY2gpOworfQorCitzdWIKK2V2YWxfZXhpdAoreworICAgIGxvY2FsKCRuYW1lLCAkc3RhdHVzLCAkZXhwZWN0KSA9IEBfOworICAgIGxvY2FsKCRleHByKTsKKyAgICBsb2NhbCgkdywgJGUsICRzKSA9ICgkc3RhdHVzLCAoJHN0YXR1cyA+PiA4KSAmIDB4ZmYsICRzdGF0dXMgJiAweDdmKTsKKworICAgICRlID0gLTEwMDAgaWYgJHN0YXR1cyAmIDB4ZmY7CisgICAgJHMgPSAtMTAwMCBpZiAkcyA9PSAweDdmOworICAgIGlmICghZGVmaW5lZCAkZXhwZWN0KSB7CisJJGV4cHIgPSAnJHcgPT0gMCc7CisgICAgfSBlbHNpZiAoJGV4cGVjdCA9fiAvXih8LSlcZCskLykgeworCSRleHByID0gIlwkZSA9PSAkZXhwZWN0IjsKKyAgICB9IGVsc2UgeworCSRleHByID0gJGV4cGVjdDsKKwkkZXhwciA9fiBzL1xiKFt3c2VdKVxiL1wkJDEvZzsKKwkkZXhwciA9fiBzL1xiKFNJR1tBLVowLTldKylcYi8mJDEvZzsKKyAgICB9CisgICAgJHcgPSBldmFsICRleHByOworICAgIGlmICgkQCBuZSAnJykgeworCXByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogYmFkIGV4cGVjdGVkLWV4aXQgZXhwcmVzc2lvbjogJGV4cGVjdCAoJEApXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisgICAgcmV0dXJuICR3OworfQorCitzdWIKK3JlYWRfdGVzdAoreworICAgIGxvY2FsKCRmaWxlLCAkaW4sICp0ZXN0KSA9IEBfOworICAgIGxvY2FsKCRmaWVsZCwgJHZhbCwgJGZsYWdzLCAkZG9fY2hvcCwgJG5lZWRfcmVkbywgJHN0YXJ0X2xpbmVubyk7CisgICAgbG9jYWwoJWNudCwgJHNmaWVsZCk7CisKKyAgICAldGVzdCA9ICgpOworICAgICVjbnQgPSAoKTsKKyAgICB3aGlsZSAoPCRpbj4pIHsKKwluZXh0IGlmIC9eXHMqJC87CisJbmV4dCBpZiAvXiAqIy87CisJbGFzdCBpZiAvXlxzKi0tLVxzKiQvOworCSRzdGFydF9saW5lbm8gPSAkLiBpZiAhZGVmaW5lZCAkc3RhcnRfbGluZW5vOworCWlmICghL14oWy1cd10rKTpccyoofFxTfFxTLipcUylccyokLykgeworCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiRmaWxlOiQuOiB1bnJlY29nbmlzZWQgbGluZVxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKwkoJGZpZWxkLCAkdmFsKSA9ICgkMSwgJDIpOworCSRzZmllbGQgPSAkZmllbGQ7CisJJGZsYWdzID0gJHRlc3RfZmllbGRzeyRmaWVsZH07CisJaWYgKCFkZWZpbmVkICRmbGFncykgeworCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiRmaWxlOiQuOiB1bnJlY29nbmlzZWQgZmllbGQgXCIkZmllbGRcIlxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKwlpZiAoJGZsYWdzID1+IC9zLykgeworCSAgICBsb2NhbCgkY250KSA9ICRjbnR7JGZpZWxkfSsrOworCSAgICAkdGVzdHskZmllbGR9ID0gJGNudHskZmllbGR9OworCSAgICAkY250ID0gMCBpZiAkY250IGVxICcnOworCSAgICAkc2ZpZWxkIC49ICI6JGNudCI7CisJfSBlbHNpZiAoZGVmaW5lZCAkdGVzdHskZmllbGR9KSB7CisJICAgIHByaW50IFNUREVSUiAiJHByb2c6JGZpbGU6JC46IG11bHRpcGxlIFwiJGZpZWxkXCIgZmllbGRzXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorCSRkb19jaG9wID0gJGZsYWdzICF+IC9tLzsKKwkkbmVlZF9yZWRvID0gMDsKKwlpZiAoJHZhbCBlcSAnJyB8fCAkdmFsIGVxICchJyB8fCAkZmxhZ3MgPX4gL3AvKSB7CisJICAgIGlmICgkZmxhZ3MgPX4gL1tNbV0vKSB7CisJCWlmICgkZmxhZ3MgPX4gL3AvKSB7CisJCSAgICBpZiAoJHZhbCA9fiAvXiEvKSB7CisJCQkkZG9fY2hvcCA9IDE7CisJCQkkdmFsID0gJCc7CisJCSAgICB9IGVsc2UgeworCQkJJGRvX2Nob3AgPSAwOworCQkgICAgfQorCQkgICAgaWYgKCR2YWwgZXEgJycpIHsKKwkJCXByaW50IFNUREVSUgorCQkiJHByb2c6JGZpbGU6JC46IG5vIHBhcmFtZXRlcnMgZ2l2ZW4gZm9yIGZpZWxkIFwiJGZpZWxkXCJcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICBpZiAoJHZhbCBlcSAnIScpIHsKKwkJCSRkb19jaG9wID0gMTsKKwkJICAgIH0KKwkJICAgICR2YWwgPSAnJzsKKwkJfQorCQl3aGlsZSAoPCRpbj4pIHsKKwkJICAgIGxhc3QgaWYgIS9eXHQvOworCQkgICAgJHZhbCAuPSAkJzsKKwkJfQorCQljaG9wICR2YWwgaWYgJGRvX2Nob3A7CisJCSRkb19jaG9wID0gMTsKKwkJJG5lZWRfcmVkbyA9IDE7CisKKwkJIyBTeW50YXggY2hlY2sgb24gZmllbGRzIHRoYXQgY2FuIHNldmVyYWwgaW5zdGFuY2VzCisJCSMgKGNhbiBnaXZlIHVzZWZ1bCBsaW5lIG51bWJlcnMgdGhpcyB3YXkpCisKKwkJaWYgKCRmaWVsZCBlcSAnZmlsZS1zZXR1cCcpIHsKKwkJICAgIGxvY2FsKCR0eXBlLCAkcGVybSwgJHJlc3QsICRjLCAkbGVuLCAkbmFtZSk7CisKKwkJICAgICMgZm9ybWF0IGlzOiB0eXBlIHBlcm0gIm5hbWUiCisJCSAgICBpZiAoJHZhbCAhfiAvXlsgXHRdKihcUyspWyBcdF0rKFxTKylbIFx0XSsoW14gXHRdLiopLykgeworCQkJcHJpbnQgU1RERVJSCisJCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBwYXJhbWV0ZXIgbGluZSBmb3IgZmlsZS1zZXR1cCBmaWVsZFxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJICAgICgkdHlwZSwgJHBlcm0sICRyZXN0KSA9ICgkMSwgJDIsICQzKTsKKwkJICAgIGlmICgkdHlwZSAhfiAvXihmaWxlfGRpcnxzeW1saW5rKSQvKSB7CisJCQlwcmludCBTVERFUlIKKwkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIGZpbGUgdHlwZSBmb3IgZmlsZS1zZXR1cDogJHR5cGVcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCSAgICBpZiAoJHBlcm0gIX4gL15cZCskLykgeworCQkJcHJpbnQgU1RERVJSCisJCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBwZXJtaXNzaW9ucyBmb3IgZmlsZS1zZXR1cDogJHR5cGVcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCSAgICAkYyA9IHN1YnN0cigkcmVzdCwgMCwgMSk7CisJCSAgICBpZiAoKCRsZW4gPSBpbmRleCgkcmVzdCwgJGMsIDEpIC0gMSkgPD0gMCkgeworCQkJcHJpbnQgU1RERVJSCisgICAgIiRwcm9nOiRmaWxlOiQuOiBtaXNzaW5nIGVuZCBxdW90ZSBmb3IgZmlsZSBuYW1lIGluIGZpbGUtc2V0dXA6ICRyZXN0XG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQkgICAgJG5hbWUgPSBzdWJzdHIoJHJlc3QsIDEsICRsZW4pOworCQkgICAgaWYgKCRuYW1lID1+IC9eXC8vIHx8ICRuYW1lID1+IC8oXnxcLylcLlwuKFwvfCQpLykgeworCQkJIyBOb3RlOiB0aGlzIGlzIG5vdCBhIHNlY3VyaXR5IHRoaW5nIC0ganVzdCBhIHNhbml0eQorCQkJIyBjaGVjayAtIGEgdGVzdCBjYW4gc3RpbGwgdXNlIHN5bWxpbmtzIHRvIGdldCBhdCBmaWxlcworCQkJIyBvdXRzaWRlIHRoZSB0ZXN0IGRpcmVjdG9yeS4KKwkJCXByaW50IFNUREVSUgorIiRwcm9nOiRmaWxlOiQuOiBmaWxlIG5hbWUgaW4gZmlsZS1zZXR1cCBpcyBhYnNvbHV0ZSBvciBjb250YWlucyAuLjogJG5hbWVcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCX0KKwkJaWYgKCRmaWVsZCBlcSAnZmlsZS1yZXN1bHQnKSB7CisJCSAgICBsb2NhbCgkdHlwZSwgJHBlcm0sICR1aWQsICRnaWQsICRtYXRjaFR5cGUsCisJCQkgICRyZXN0LCAkYywgJGxlbiwgJG5hbWUpOworCisJCSAgICAjIGZvcm1hdCBpczogdHlwZSBwZXJtIHVpZCBnaWQgbWF0Y2hUeXBlICJuYW1lIgorCQkgICAgaWYgKCR2YWwgIX4gL15ccyooXFMrKVxzKyhcUyspXHMrKFxTKylccysoXFMrKVxzKyhcUyspXHMrKFxTLiopLykgeworCQkJcHJpbnQgU1RERVJSCisJCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBwYXJhbWV0ZXIgbGluZSBmb3IgZmlsZS1yZXN1bHQgZmllbGRcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCSAgICAoJHR5cGUsICRwZXJtLCAkdWlkLCAkZ2lkLCAkbWF0Y2hUeXBlLCAkcmVzdCkKKwkJCT0gKCQxLCAkMiwgJDMsICQ0LCAkNSwgJDYpOworCQkgICAgaWYgKCR0eXBlICF+IC9eKGZpbGV8ZGlyfHN5bWxpbmspJC8pIHsKKwkJCXByaW50IFNUREVSUgorCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgZmlsZSB0eXBlIGZvciBmaWxlLXJlc3VsdDogJHR5cGVcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCSAgICBpZiAoJHBlcm0gIX4gL15cZCskLyAmJiAkcGVybSBuZSAnKicpIHsKKwkJCXByaW50IFNUREVSUgorCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgcGVybWlzc2lvbnMgZm9yIGZpbGUtcmVzdWx0OiAkcGVybVxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJICAgIGlmICgkdWlkICF+IC9eXGQrJC8gJiYgJHVpZCBuZSAnKicpIHsKKwkJCXByaW50IFNUREVSUgorCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgdXNlci1pZCBmb3IgZmlsZS1yZXN1bHQ6ICR1aWRcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCSAgICBpZiAoJGdpZCAhfiAvXlxkKyQvICYmICRnaWQgbmUgJyonKSB7CisJCQlwcmludCBTVERFUlIKKwkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIGdyb3VwLWlkIGZvciBmaWxlLXJlc3VsdDogJGdpZFxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJICAgIGlmICgkbWF0Y2hUeXBlICF+IC9eKGV4YWN0fHBhdHRlcm4pJC8pIHsKKwkJCXByaW50IFNUREVSUgorCQkiJHByb2c6JGZpbGU6JC46IGJhZCBtYXRjaCB0eXBlIGZvciBmaWxlLXJlc3VsdDogJG1hdGNoVHlwZVxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJICAgICRjID0gc3Vic3RyKCRyZXN0LCAwLCAxKTsKKwkJICAgIGlmICgoJGxlbiA9IGluZGV4KCRyZXN0LCAkYywgMSkgLSAxKSA8PSAwKSB7CisJCQlwcmludCBTVERFUlIKKyAgICAiJHByb2c6JGZpbGU6JC46IG1pc3NpbmcgZW5kIHF1b3RlIGZvciBmaWxlIG5hbWUgaW4gZmlsZS1yZXN1bHQ6ICRyZXN0XG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQkgICAgJG5hbWUgPSBzdWJzdHIoJHJlc3QsIDEsICRsZW4pOworCQkgICAgaWYgKCRuYW1lID1+IC9eXC8vIHx8ICRuYW1lID1+IC8oXnxcLylcLlwuKFwvfCQpLykgeworCQkJIyBOb3RlOiB0aGlzIGlzIG5vdCBhIHNlY3VyaXR5IHRoaW5nIC0ganVzdCBhIHNhbml0eQorCQkJIyBjaGVjayAtIGEgdGVzdCBjYW4gc3RpbGwgdXNlIHN5bWxpbmtzIHRvIGdldCBhdCBmaWxlcworCQkJIyBvdXRzaWRlIHRoZSB0ZXN0IGRpcmVjdG9yeS4KKwkJCXByaW50IFNUREVSUgorIiRwcm9nOiRmaWxlOiQuOiBmaWxlIG5hbWUgaW4gZmlsZS1yZXN1bHQgaXMgYWJzb2x1dGUgb3IgY29udGFpbnMgLi46ICRuYW1lXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQl9CisJICAgIH0gZWxzaWYgKCR2YWwgZXEgJycpIHsKKwkJcHJpbnQgU1RERVJSCisJCSAgICAiJHByb2c6JGZpbGU6JC46IG5vIHZhbHVlIGdpdmVuIGZvciBmaWVsZCBcIiRmaWVsZFwiXG4iOworCQlyZXR1cm4gdW5kZWY7CisJICAgIH0KKwl9CisJJHZhbCAuPSAiXG4iIGlmICEkZG9fY2hvcDsKKwkkdGVzdHskc2ZpZWxkfSA9ICR2YWw7CisJcmVkbyBpZiAkbmVlZF9yZWRvOworICAgIH0KKyAgICBpZiAoJF8gZXEgJycpIHsKKwlpZiAoJXRlc3QpIHsKKwkgICAgcHJpbnQgU1RERVJSCisJICAgICAgIiRwcm9nOiRmaWxlOiRzdGFydF9saW5lbm86IGVuZC1vZi1maWxlIHdoaWxlIHJlYWRpbmcgdGVzdFxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICB3aGlsZSAoKCRmaWVsZCwgJHZhbCkgPSBlYWNoICV0ZXN0X2ZpZWxkcykgeworCWlmICgkdmFsID1+IC9yLyAmJiAhZGVmaW5lZCAkdGVzdHskZmllbGR9KSB7CisJICAgIHByaW50IFNUREVSUgorCSAgICAgICIkcHJvZzokZmlsZTokc3RhcnRfbGluZW5vOiByZXF1aXJlZCBmaWVsZCBcIiRmaWVsZFwiIG1pc3NpbmdcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisgICAgfQorCisgICAgJHRlc3R7JzpmdWxsLW5hbWUnfSA9IHN1YnN0cigkZmlsZSwgJGZpbGVfcHJlZml4X3NraXApIC4gIjokdGVzdHsnbmFtZSd9IjsKKyAgICAkdGVzdHsnOmxvbmctbmFtZSd9ID0gIiRmaWxlOiRzdGFydF9saW5lbm86JHRlc3R7J25hbWUnfSI7CisKKyAgICAjIFN5bnRheCBjaGVjayBvbiBzcGVjaWZpYyBmaWVsZHMKKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtZmFpbCd9KSB7CisJaWYgKCR0ZXN0eydleHBlY3RlZC1mYWlsJ30gIX4gL14oeWVzfG5vKSQvKSB7CisJICAgIHByaW50IFNUREVSUgorCSAgICAgICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBiYWQgdmFsdWUgZm9yIGV4cGVjdGVkLWZhaWwgZmllbGRcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisJJHRlc3R7J2V4cGVjdGVkLWZhaWwnfSA9ICQxIGVxICd5ZXMnOworICAgIH0gZWxzZSB7CisJJHRlc3R7J2V4cGVjdGVkLWZhaWwnfSA9IDA7CisgICAgfQorICAgIGlmIChkZWZpbmVkICR0ZXN0eydhcmd1bWVudHMnfSkgeworCWxvY2FsKCRmaXJzdGMpID0gc3Vic3RyKCR0ZXN0eydhcmd1bWVudHMnfSwgMCwgMSk7CisKKwlpZiAoc3Vic3RyKCR0ZXN0eydhcmd1bWVudHMnfSwgLTEsIDEpIG5lICRmaXJzdGMpIHsKKwkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBhcmd1bWVudHMgZmllbGQgZG9lc24ndCBzdGFydCBhbmQgZW5kIHdpdGggdGhlIHNhbWUgY2hhcmFjdGVyXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorICAgIH0KKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZW52LXNldHVwJ30pIHsKKwlsb2NhbCgkZmlyc3RjKSA9IHN1YnN0cigkdGVzdHsnZW52LXNldHVwJ30sIDAsIDEpOworCisJaWYgKHN1YnN0cigkdGVzdHsnZW52LXNldHVwJ30sIC0xLCAxKSBuZSAkZmlyc3RjKSB7CisJICAgIHByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZW52LXNldHVwIGZpZWxkIGRvZXNuJ3Qgc3RhcnQgYW5kIGVuZCB3aXRoIHRoZSBzYW1lIGNoYXJhY3RlclxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKyAgICB9CisgICAgaWYgKGRlZmluZWQgJHRlc3R7J2V4cGVjdGVkLWV4aXQnfSkgeworCWxvY2FsKCR2YWwpID0gJHRlc3R7J2V4cGVjdGVkLWV4aXQnfTsKKworCWlmICgkdmFsID1+IC9eKHwtKVxkKyQvKSB7CisJICAgIGlmICgkdmFsIDwgMCB8fCAkdmFsID4gMjU1KSB7CisJCXByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZXhwZWN0ZWQtZXhpdCB2YWx1ZSAkdmFsIG5vdCBpbiAwLi4yNTVcbiI7CisJCXJldHVybiB1bmRlZjsKKwkgICAgfQorCX0gZWxzaWYgKCR2YWwgIX4gL14oW1xzPD4rLT0qJVwvJnwhKCldfFxiW3dzZV1cYnxcYlNJR1tBLVowLTldK1xiKSskLykgeworCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGJhZCBleHBlY3RlZC1leGl0IGV4cHJlc3Npb246ICR2YWxcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisgICAgfSBlbHNlIHsKKwkkdGVzdHsnZXhwZWN0ZWQtZXhpdCd9ID0gMDsKKyAgICB9CisgICAgaWYgKGRlZmluZWQgJHRlc3R7J2V4cGVjdGVkLXN0ZG91dCd9CisJJiYgZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm4nfSkKKyAgICB7CisJcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBjYW4ndCB1c2UgYm90aCBleHBlY3RlZC1zdGRvdXQgYW5kIGV4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisgICAgaWYgKGRlZmluZWQgJHRlc3R7J2V4cGVjdGVkLXN0ZGVycid9CisJJiYgZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm4nfSkKKyAgICB7CisJcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBjYW4ndCB1c2UgYm90aCBleHBlY3RlZC1zdGRlcnIgYW5kIGV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisgICAgaWYgKGRlZmluZWQgJHRlc3R7J3RpbWUtbGltaXQnfSkgeworCWlmICgkdGVzdHsndGltZS1saW1pdCd9ICF+IC9eXGQrJC8gfHwgJHRlc3R7J3RpbWUtbGltaXQnfSA9PSAwKSB7CisJICAgIHByaW50IFNUREVSUgorCSAgICAgICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBiYWQgdmFsdWUgZm9yIHRpbWUtbGltaXQgZmllbGRcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisgICAgfSBlbHNpZiAoZGVmaW5lZCAkZGVmYXVsdF90aW1lX2xpbWl0KSB7CisJJHRlc3R7J3RpbWUtbGltaXQnfSA9ICRkZWZhdWx0X3RpbWVfbGltaXQ7CisgICAgfQorCisgICAgaWYgKGRlZmluZWQgJGtub3duX3Rlc3RzeyR0ZXN0eyduYW1lJ319KSB7CisJcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiB3YXJuaW5nOiBkdXBsaWNhdGUgdGVzdCBuYW1lICR7dGVzdHsnbmFtZSd9fVxuIjsKKyAgICB9CisgICAgJGtub3duX3Rlc3RzeyR0ZXN0eyduYW1lJ319ID0gMTsKKworICAgIHJldHVybiAxOworfQorCitzdWIKK3R0eV9tc2cKK3sKKyAgICBsb2NhbCgkbXNnKSA9IEBfOworCisgICAgb3BlbihUVFksICI+IC9kZXYvdHR5IikgfHwgcmV0dXJuIDA7CisgICAgcHJpbnQgVFRZICRtc2c7CisgICAgY2xvc2UoVFRZKTsKKyAgICByZXR1cm4gMTsKK30KKworc3ViCituZXZlcl9jYWxsZWRfZnVuY3MKK3sKKwlyZXR1cm4gMDsKKwkmdHR5X21zZygiaGlcbiIpOworCSZuZXZlcl9jYWxsZWRfZnVuY3MoKTsKKwkmY2F0Y2hfc2lnYWxybSgpOworCSRvbGRfZW52eydmb28nfSA9ICdiYXInOworCSRpbnRlcm5hbF90ZXN0X2ZpZWxkc3snZm9vJ30gPSAnYmFyJzsKK30KKworc3ViCitjaGVja19maWxlX3Jlc3VsdAoreworICAgIGxvY2FsKCp0ZXN0KSA9IEBfOworCisgICAgcmV0dXJuICcnIGlmICghZGVmaW5lZCAkdGVzdHsnZmlsZS1yZXN1bHQnfSk7CisKKyAgICBsb2NhbCgkd2h5KSA9ICcnOworICAgIGxvY2FsKCRpKTsKKyAgICBsb2NhbCgkdHlwZSwgJHBlcm0sICR1aWQsICRnaWQsICRyZXN0LCAkYywgJGxlbiwgJG5hbWUpOworICAgIGxvY2FsKEBzdGJ1Zik7CisKKyAgICBmb3IgKCRpID0gMDsgJGkgPCAkdGVzdHsnZmlsZS1yZXN1bHQnfTsgJGkrKykgeworCSR2YWwgPSAkdGVzdHsiZmlsZS1yZXN1bHQ6JGkifTsKKworCSMgZm9ybWF0IGlzOiB0eXBlIHBlcm0gIm5hbWUiCisJKCR0eXBlLCAkcGVybSwgJHVpZCwgJGdpZCwgJG1hdGNoVHlwZSwgJHJlc3QpID0KKwkgICAgc3BsaXQoJyAnLCAkdmFsLCA2KTsKKwkkYyA9IHN1YnN0cigkcmVzdCwgMCwgMSk7CisJJGxlbiA9IGluZGV4KCRyZXN0LCAkYywgMSkgLSAxOworCSRuYW1lID0gc3Vic3RyKCRyZXN0LCAxLCAkbGVuKTsKKwkkcmVzdCA9IHN1YnN0cigkcmVzdCwgMiArICRsZW4pOworCSRwZXJtID0gb2N0KCRwZXJtKSBpZiAkcGVybSA9fiAvXlxkKyQvOworCisJQHN0YnVmID0gbHN0YXQoJG5hbWUpOworCWlmICghQHN0YnVmKSB7CisJICAgICR3aHkgLj0gIlx0ZXhwZWN0ZWQgJHR5cGUgXCIkbmFtZVwiIG5vdCBjcmVhdGVkXG4iOworCSAgICBuZXh0OworCX0KKwlpZiAoJHBlcm0gbmUgJyonICYmICgkc3RidWZbMl0gJiAwNzc3NykgIT0gJHBlcm0pIHsKKwkgICAgJHdoeSAuPSAiXHQkdHlwZSBcIiRuYW1lXCIgaGFzIHVuZXhwZWN0ZWQgcGVybWlzc2lvbnNcbiI7CisJICAgICR3aHkgLj0gc3ByaW50ZigiXHRcdGV4cGVjdGVkIDAlbywgZm91bmQgMCVvXG4iLAorCQkgICAgJHBlcm0sICRzdGJ1ZlsyXSAmIDA3Nzc3KTsKKwl9CisJaWYgKCR1aWQgbmUgJyonICYmICRzdGJ1Zls0XSAhPSAkdWlkKSB7CisJICAgICR3aHkgLj0gIlx0JHR5cGUgXCIkbmFtZVwiIGhhcyB1bmV4cGVjdGVkIHVzZXItaWRcbiI7CisJICAgICR3aHkgLj0gc3ByaW50ZigiXHRcdGV4cGVjdGVkICVkLCBmb3VuZCAlZFxuIiwKKwkJICAgICR1aWQsICRzdGJ1Zls0XSk7CisJfQorCWlmICgkZ2lkIG5lICcqJyAmJiAkc3RidWZbNV0gIT0gJGdpZCkgeworCSAgICAkd2h5IC49ICJcdCR0eXBlIFwiJG5hbWVcIiBoYXMgdW5leHBlY3RlZCBncm91cC1pZFxuIjsKKwkgICAgJHdoeSAuPSBzcHJpbnRmKCJcdFx0ZXhwZWN0ZWQgJWQsIGZvdW5kICVkXG4iLAorCQkgICAgJGdpZCwgJHN0YnVmWzVdKTsKKwl9CisKKwlpZiAoJHR5cGUgZXEgJ2ZpbGUnKSB7CisJICAgIGlmICgtbCBfIHx8ICEgLWYgXykgeworCQkkd2h5IC49ICJcdCR0eXBlIFwiJG5hbWVcIiBpcyBub3QgYSByZWd1bGFyIGZpbGVcbiI7CisJICAgIH0gZWxzZSB7CisJCWxvY2FsICR0bXAgPSAmY2hlY2tfb3V0cHV0KCR0ZXN0eydsb25nLW5hbWUnfSwgJG5hbWUsCisJCQkgICAgIiR0eXBlIGNvbnRlbnRzIGluIFwiJG5hbWVcIiIsCisJCQkgICAgJG1hdGNoVHlwZSBlcSAnZXhhY3QnID8gJHJlc3QgOiB1bmRlZgorCQkJICAgICRtYXRjaFR5cGUgZXEgJ3BhdHRlcm4nID8gJHJlc3QgOiB1bmRlZik7CisJCXJldHVybiB1bmRlZiBpZiAoIWRlZmluZWQgJHRtcCk7CisJCSR3aHkgLj0gJHRtcDsKKwkgICAgfQorCX0gZWxzaWYgKCR0eXBlIGVxICdkaXInKSB7CisJICAgIGlmICgkcmVzdCAhfiAvXlxzKiQvKSB7CisJCXByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZmlsZS1yZXN1bHQgdGVzdCBmb3IgZGlyZWN0b3J5ICRuYW1lIHNob3VsZCBub3QgaGF2ZSBjb250ZW50IHNwZWNpZmllZFxuIjsKKwkJcmV0dXJuIHVuZGVmOworCSAgICB9CisJICAgIGlmICgtbCBfIHx8ICEgLWQgXykgeworCQkkd2h5IC49ICJcdCR0eXBlIFwiJG5hbWVcIiBpcyBub3QgYSBkaXJlY3RvcnlcbiI7CisJICAgIH0KKwl9IGVsc2lmICgkdHlwZSBlcSAnc3ltbGluaycpIHsKKwkgICAgaWYgKCEtbCBfKSB7CisJCSR3aHkgLj0gIlx0JHR5cGUgXCIkbmFtZVwiIGlzIG5vdCBhIHN5bWxpbmtcbiI7CisJICAgIH0gZWxzZSB7CisJCWxvY2FsICRjb250ZW50ID0gcmVhZGxpbmsoJG5hbWUpOworCQlpZiAoIWRlZmluZWQgJGNvbnRlbnQpIHsKKwkJICAgIHByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZmlsZS1yZXN1bHQgdGVzdCBmb3IgJHR5cGUgJG5hbWUgZmFpbGVkIC0gY291bGQgbm90IHJlYWRsaW5rIC0gJCFcbiI7CisJCSAgICByZXR1cm4gdW5kZWY7CisJCX0KKwkJbG9jYWwgJHRtcCA9ICZjb21wYXJlX291dHB1dCgkdGVzdHsnbG9uZy1uYW1lJ30sCisJCQkgICAgIiR0eXBlIGNvbnRlbnRzIGluIFwiJG5hbWVcIiIsCisJCQkgICAgJG1hdGNoVHlwZSBlcSAnZXhhY3QnID8gJHJlc3QgOiB1bmRlZgorCQkJICAgICRtYXRjaFR5cGUgZXEgJ3BhdHRlcm4nID8gJHJlc3QgOiB1bmRlZik7CisJCXJldHVybiB1bmRlZiBpZiAoIWRlZmluZWQgJHRtcCk7CisJCSR3aHkgLj0gJHRtcDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gJHdoeTsKK30KKworc3ViCitIRUxQX01FU1NBR0UKK3sKKyAgICBwcmludCBTVERFUlIgJFVzYWdlOworICAgIGV4aXQgMDsKK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2NoZWNrLnQgYi9ta3NoL3NyYy9jaGVjay50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NGY2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9jaGVjay50CkBAIC0wLDAgKzEsNzQ0NiBAQAorIyAkTWlyT1M6IHNyYy9iaW4vbWtzaC9jaGVjay50LHYgMS4zODggMjAxMC8wOC8yNCAxNTo0Nzo0NCB0ZyBFeHAgJAorIyAkT3BlbkJTRDogYmtzbC1ubC50LHYgMS4yIDIwMDEvMDEvMjggMjM6MDQ6NTYgbmlrbGFzIEV4cCAkCisjICRPcGVuQlNEOiBoaXN0b3J5LnQsdiAxLjUgMjAwMS8wMS8yOCAyMzowNDo1NiBuaWtsYXMgRXhwICQKKyMgJE9wZW5CU0Q6IHJlYWQudCx2IDEuMyAyMDAzLzAzLzEwIDAzOjQ4OjE2IGRhdmlkIEV4cCAkCisjLQorIyBDb3B5cmlnaHQgwqkgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorIwlUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisjCisjIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworIyBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyMgaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW7igJAKKyMgbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisjIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisjCisjIFRoaXMgd29yayBpcyBwcm92aWRlZCDigJxBUyBJU+KAnSBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyMgdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisjIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorIyBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyMgZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisjIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorIyBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyMgb2Ygc2FpZCBwZXJzb27igJlzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorIy0KKyMgWW91IG1heSBhbHNvIHdhbnQgdG8gdGVzdCBJRlMgd2l0aCB0aGUgc2NyaXB0IGF0CisjIGh0dHA6Ly93d3cucmVzZWFyY2guYXR0LmNvbS9+Z3NmL3B1YmxpYy9pZnMuc2gKKworZXhwZWN0ZWQtc3Rkb3V0OgorCUAoIylNSVJCU0QgS1NIIFIzOSAyMDEwLzA4LzI0CitkZXNjcmlwdGlvbjoKKwlDaGVjayB2ZXJzaW9uIG9mIHNoZWxsLgorc3RkaW46CisJZWNobyAkS1NIX1ZFUlNJT04KK25hbWU6IEtTSF9WRVJTSU9OCistLS0KK25hbWU6IHNlbGZ0ZXN0LTEKK2Rlc2NyaXB0aW9uOgorCVJlZ3Jlc3Npb24gdGVzdCBzZWxmLXRlc3RpbmcKK3N0ZGluOgorCWVjaG8gJHtmb286LWJhen0KK2V4cGVjdGVkLXN0ZG91dDoKKwliYXoKKy0tLQorbmFtZTogc2VsZnRlc3QtMgorZGVzY3JpcHRpb246CisJUmVncmVzc2lvbiB0ZXN0IHNlbGYtdGVzdGluZworZW52LXNldHVwOiAhZm9vPWJhciEKK3N0ZGluOgorCWVjaG8gJHtmb286LWJhen0KK2V4cGVjdGVkLXN0ZG91dDoKKwliYXIKKy0tLQorbmFtZTogc2VsZnRlc3QtMworZGVzY3JpcHRpb246CisJUmVncmVzc2lvbiB0ZXN0IHNlbGYtdGVzdGluZworZW52LXNldHVwOiAhRU5WPWZub3JkIQorc3RkaW46CisJZWNobyAiPCRFTlY+IgorZXhwZWN0ZWQtc3Rkb3V0OgorCTxmbm9yZD4KKy0tLQorbmFtZTogc2VsZnRlc3QtZW52CitkZXNjcmlwdGlvbjoKKwlKdXN0IG91dHB1dCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCAoYWx3YXlzIGZhaWxzKQorY2F0ZWdvcnk6IGRpc2FibGVkCitzdGRpbjoKKwlzZXQKKy0tLQorbmFtZTogYWxpYXMtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCByZWN1cnNpb24gaXMgZGV0ZWN0ZWQvYXZvaWRlZCBpbiBhbGlhc2VzLgorc3RkaW46CisJYWxpYXMgZm9vQmFyPWZvb0JhcgorCWZvb0JhcgorCWV4aXQgMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL2Zvb0Jhci4qbm90IGZvdW5kLiovCistLS0KK25hbWU6IGFsaWFzLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgcmVjdXJzaW9uIGlzIGRldGVjdGVkL2F2b2lkZWQgaW4gYWxpYXNlcy4KK3N0ZGluOgorCWFsaWFzIGZvb0Jhcj1iYXJGb28KKwlhbGlhcyBiYXJGb289Zm9vQmFyCisJZm9vQmFyCisJYmFyRm9vCisJZXhpdCAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvZm9vQmFyLipub3QgZm91bmQuKlxuLipiYXJGb28uKm5vdCBmb3VuZC8KKy0tLQorbmFtZTogYWxpYXMtMworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCByZWN1cnNpb24gaXMgZGV0ZWN0ZWQvYXZvaWRlZCBpbiBhbGlhc2VzLgorc3RkaW46CisJYWxpYXMgRWNobz0nZWNobyAnCisJYWxpYXMgZm9vQmFyPWJhckZvbworCWFsaWFzIGJhckZvbz1mb29CYXIKKwlFY2hvIGZvb0JhcgorCXVuYWxpYXMgYmFyRm9vCisJRWNobyBmb29CYXIKK2V4cGVjdGVkLXN0ZG91dDoKKwlmb29CYXIKKwliYXJGb28KKy0tLQorbmFtZTogYWxpYXMtNAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhbGlhcyBleHBhbnNpb24gaXNuJ3QgZG9uZSBvbiBrZXl3b3JkcyAoaW4ga2V5d29yZAorCXBvc3RpdGlvbnMpLgorc3RkaW46CisJYWxpYXMgRWNobz0nZWNobyAnCisJYWxpYXMgd2hpbGU9V2hpbGUKKwl3aGlsZSBmYWxzZTsgZG8gZWNobyBoaSA7IGRvbmUKKwlFY2hvIHdoaWxlCitleHBlY3RlZC1zdGRvdXQ6CisJV2hpbGUKKy0tLQorbmFtZTogYWxpYXMtNQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhbGlhcyBleHBhbnNpb24gZG9uZSBhZnRlciBhbGlhcyB3aXRoIHRyYWlsaW5nIHNwYWNlLgorc3RkaW46CisJYWxpYXMgRWNobz0nZWNobyAnCisJYWxpYXMgZm9vPSdiYXIgc3R1ZmYgJworCWFsaWFzIGJhcj0nQmFyMSBCYXIyICcKKwlhbGlhcyBzdHVmZj0nU3R1ZmYnCisJYWxpYXMgYmxhaD0nQmxhaCcKKwlFY2hvIGZvbyBibGFoCitleHBlY3RlZC1zdGRvdXQ6CisJQmFyMSBCYXIyIFN0dWZmIEJsYWgKKy0tLQorbmFtZTogYWxpYXMtNgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhbGlhcyBleHBhbnNpb24gZG9uZSBhZnRlciBhbGlhcyB3aXRoIHRyYWlsaW5nIHNwYWNlLgorc3RkaW46CisJYWxpYXMgRWNobz0nZWNobyAnCisJYWxpYXMgZm9vPSdiYXIgYmFyJworCWFsaWFzIGJhcj0nQmFyICcKKwlhbGlhcyBibGFoPUJsYWgKKwlFY2hvIGZvbyBibGFoCitleHBlY3RlZC1zdGRvdXQ6CisJQmFyIEJhciBCbGFoCistLS0KK25hbWU6IGFsaWFzLTcKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYWxpYXMgZXhwYW5zaW9uIGRvbmUgYWZ0ZXIgYWxpYXMgd2l0aCB0cmFpbGluZyBzcGFjZQorCWFmdGVyIGEga2V5d29yZC4KK3N0ZGluOgorCWFsaWFzIFg9J2Nhc2UgJworCWFsaWFzIFk9WgorCVggWSBpbiAnWScpIGVjaG8gaXMgeSA7OyBaKSBlY2hvIGlzIHogOyBlc2FjCitleHBlY3RlZC1zdGRvdXQ6CisJaXMgegorLS0tCituYW1lOiBhbGlhcy04CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IG5ld2xpbmVzIGluIGFuIGFsaWFzIGRvbid0IGNhdXNlIHRoZSBjb21tYW5kIHRvIGJlIGxvc3QuCitzdGRpbjoKKwlhbGlhcyBmb289JworCQorCQorCWVjaG8gaGkKKwkKKwkKKwkKKwllY2hvIHRoZXJlCisJCisJCisJJworCWZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJdGhlcmUKKy0tLQorbmFtZTogYWxpYXMtOQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCByZWN1cnNpb24gaXMgZGV0ZWN0ZWQvYXZvaWRlZCBpbiBhbGlhc2VzLgorCVRoaXMgY2hlY2sgZmFpbHMgZm9yIHNsb3cgbWFjaGluZXMgb3IgQ3lnd2luLCByYWlzZQorCXRoZSB0aW1lLWxpbWl0IGNsYXVzZSAoZS5nLiB0byA3KSBpZiB0aGlzIG9jY3Vycy4KK3RpbWUtbGltaXQ6IDMKK3N0ZGluOgorCWVjaG8gLW4gPnRmCisJYWxpYXMgbHM9bHMKKwlscworCWVjaG8gJChscykKKwlleGl0IDAKK2V4cGVjdGVkLXN0ZG91dDoKKwl0ZgorCXRmCistLS0KK25hbWU6IGFsaWFzLTEwCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHJlY3Vyc2lvbiBpcyBkZXRlY3RlZC9hdm9pZGVkIGluIGFsaWFzZXMuCisJUmVncmVzc2lvbiwgaW50cm9kdWNlZCBkdXJpbmcgYW4gb2xkIGJ1Z2ZpeC4KK3N0ZGluOgorCWFsaWFzIGZvbz0ncHJpbnQgaGVsbG8gJworCWFsaWFzIGJhcj0nZm9vIHdvcmxkJworCWVjaG8gJChiYXIpCitleHBlY3RlZC1zdGRvdXQ6CisJaGVsbG8gd29ybGQKKy0tLQorbmFtZTogYXJpdGgtbGF6eS0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IG9ubHkgb25lIHNpZGUgb2YgdGVybmFyeSBvcGVyYXRvciBpcyBldmFsdWF0ZWQKK3N0ZGluOgorCXg9aSs9MgorCXk9ais9MgorCXR5cGVzZXQgLWkgaT0xIGo9MQorCWVjaG8gJCgoMSA/IDIwIDogKHgrPTIpKSkKKwllY2hvICRpLCR4CisJZWNobyAkKCgwID8gKHkrPTIpIDogMzApKQorCWVjaG8gJGosJHkKK2V4cGVjdGVkLXN0ZG91dDoKKwkyMAorCTEsaSs9MgorCTMwCisJMSxqKz0yCistLS0KK25hbWU6IGFyaXRoLWxhenktMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhc3NpZ25tZW50cyBub3QgZG9uZSBvbiBub24tZXZhbHVhdGVkIHNpZGUgb2YgdGVybmFyeQorCW9wZXJhdG9yCitzdGRpbjoKKwl4PWkrPTIKKwl5PWorPTIKKwl0eXBlc2V0IC1pIGk9MSBqPTEKKwllY2hvICQoKDEgPyAyMCA6ICh4Kz0yKSkpCisJZWNobyAkaSwkeAorCWVjaG8gJCgoMCA/ICh5Kz0yKSA6IDMwKSkKKwllY2hvICRpLCR5CitleHBlY3RlZC1zdGRvdXQ6CisJMjAKKwkxLGkrPTIKKwkzMAorCTEsais9MgorLS0tCituYW1lOiBhcml0aC1sYXp5LTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYXNzaWdubWVudHMgbm90IGRvbmUgb24gbm9uLWV2YWx1YXRlZCBzaWRlIG9mIHRlcm5hcnkKKwlvcGVyYXRvciBhbmQgdGhpcyBjb25zdHJ1Y3QgaXMgcGFyc2VkIGNvcnJlY3RseSAoRGViaWFuICM0NDU2NTEpCitzdGRpbjoKKwl4PTQKKwl5PSQoKDAgPyB4PTEgOiAyKSkKKwllY2hvID0gJHggJHkgPQorZXhwZWN0ZWQtc3Rkb3V0OgorCT0gNCAyID0KKy0tLQorbmFtZTogYXJpdGgtdGVybmFyeS1wcmVjLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHByZWNlZGVuY2Ugb2YgdGVybmFyeSBvcGVyYXRvciB2cyBhc3NpZ25tZW50CitzdGRpbjoKKwl0eXBlc2V0IC1pIHg9MgorCXk9JCgoMSA/IDIwIDogeCs9MikpCitleHBlY3RlZC1leGl0OiBlICE9IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8uKjouKjEgXD8gMjAgOiB4XCs9Mi4qbHZhbHVlLipcbiQvCistLS0KK25hbWU6IGFyaXRoLXRlcm5hcnktcHJlYy0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBwcmVjZWRlbmNlIG9mIHRlcm5hcnkgb3BlcmF0b3IgdnMgYXNzaWdubWVudAorc3RkaW46CisJdHlwZXNldCAtaSB4PTIKKwllY2hvICQoKDAgPyB4Kz0yIDogMjApKQorZXhwZWN0ZWQtc3Rkb3V0OgorCTIwCistLS0KK25hbWU6IGFyaXRoLWRpdi1hc3NvYy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBhc3NvY2lhdGl2aXR5IG9mIGRpdmlzaW9uIG9wZXJhdG9yCitzdGRpbjoKKwllY2hvICQoKDIwIC8gMiAvIDIpKQorZXhwZWN0ZWQtc3Rkb3V0OgorCTUKKy0tLQorbmFtZTogYXJpdGgtYXNzb3AtYXNzb2MtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgYXNzb2NpYXRpdml0eSBvZiBhc3NpZ25tZW50LW9wZXJhdG9yIG9wZXJhdG9yCitzdGRpbjoKKwl0eXBlc2V0IC1pIGk9MSBqPTIgaz0zCisJZWNobyAkKChpICs9IGogKz0gaykpCisJZWNobyAkaSwkaiwkaworZXhwZWN0ZWQtc3Rkb3V0OgorCTYKKwk2LDUsMworLS0tCituYW1lOiBhcml0aC11bnNpZ25lZC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiB1bnNpZ25lZCBhcml0aG1ldGljcyB3b3JrCitzdGRpbjoKKwkjIHNpZ25lZCB2cyB1bnNpZ25lZAorCWVjaG8geDEgJCgoLTEpKSAkKCgjLTEpKQorCSMgY2FsY3VsYXRpbmcKKwl0eXBlc2V0IC1pIHZzCisJdHlwZXNldCAtVWkgdnUKKwl2cz00MTIzNDU2Nzg5OyB2dT00MTIzNDU2Nzg5CisJZWNobyB4MiAkdnMgJHZ1CisJKCggdnMgJT0gMjE0NzQ4MzY0NyApKQorCSgoIHZ1ICU9IDIxNDc0ODM2NDcgKSkKKwllY2hvIHgzICR2cyAkdnUKKwl2cz00MTIzNDU2Nzg5OyB2dT00MTIzNDU2Nzg5CisJKCggIyB2cyAlPSAyMTQ3NDgzNjQ3ICkpCisJKCggIyB2dSAlPSAyMTQ3NDgzNjQ3ICkpCisJZWNobyB4NCAkdnMgJHZ1CisJIyBtYWtlIHN1cmUgdGhlIGNhbGN1bGF0aW9uIGRvZXMgbm90IGNoYW5nZSB1bnNpZ25lZCBmbGFnCisJdnM9NDEyMzQ1Njc4OTsgdnU9NDEyMzQ1Njc4OQorCWVjaG8geDUgJHZzICR2dQorCSMgc2hvcnQgZm9ybQorCWVjaG8geDYgJCgoIyB2cyAlIDIxNDc0ODM2NDcpKSAkKCgjIHZ1ICUgMjE0NzQ4MzY0NykpCisJIyBhcnJheSByZWZzCisJc2V0IC1BIHZhCisJdmFbMTk3NTk3MzE0Ml09cmlnaHQKKwl2YVs0MTIzNDU2Nzg5XT13cm9uZworCWVjaG8geDcgJHt2YVsjNDEyMzQ1Njc4OSUyMTQ3NDgzNjQ3XX0KK2V4cGVjdGVkLXN0ZG91dDoKKwl4MSAtMSA0Mjk0OTY3Mjk1CisJeDIgLTE3MTUxMDUwNyA0MTIzNDU2Nzg5CisJeDMgLTE3MTUxMDUwNyA0MTIzNDU2Nzg5CisJeDQgMTk3NTk3MzE0MiAxOTc1OTczMTQyCisJeDUgLTE3MTUxMDUwNyA0MTIzNDU2Nzg5CisJeDYgMTk3NTk3MzE0MiAxOTc1OTczMTQyCisJeDcgcmlnaHQKKy0tLQorbmFtZTogYXJpdGgtbGltaXQzMi0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBhcml0aG1ldGljcyBhcmUgMzIgYml0CitzdGRpbjoKKwkjIHNpZ25lZCB2cyB1bnNpZ25lZAorCWVjaG8geDEgJCgoLTEpKSAkKCgjLTEpKQorCSMgY2FsY3VsYXRpbmcKKwl0eXBlc2V0IC1pIHZzCisJdHlwZXNldCAtVWkgdnUKKwl2cz0yMTQ3NDgzNjQ3OyB2dT0yMTQ3NDgzNjQ3CisJZWNobyB4MiAkdnMgJHZ1CisJbGV0IHZzKysgdnUrKworCWVjaG8geDMgJHZzICR2dQorCXZzPTQyOTQ5NjcyOTU7IHZ1PTQyOTQ5NjcyOTUKKwllY2hvIHg0ICR2cyAkdnUKKwlsZXQgdnMrKyB2dSsrCisJZWNobyB4NSAkdnMgJHZ1CisJbGV0IHZzKysgdnUrKworCWVjaG8geDYgJHZzICR2dQorZXhwZWN0ZWQtc3Rkb3V0OgorCXgxIC0xIDQyOTQ5NjcyOTUKKwl4MiAyMTQ3NDgzNjQ3IDIxNDc0ODM2NDcKKwl4MyAtMjE0NzQ4MzY0OCAyMTQ3NDgzNjQ4CisJeDQgLTEgNDI5NDk2NzI5NQorCXg1IDAgMAorCXg2IDEgMQorLS0tCituYW1lOiBia3NsLW5sLWlnbi0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIG5vdCBjb2xsYXNwZWQgYWZ0ZXIgIworc3RkaW46CisJZWNobyBoaSAjdGhlcmUgXAorCWVjaG8gZm9sa3MKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCWZvbGtzCistLS0KK25hbWU6IGJrc2wtbmwtaWduLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgbm90IGNvbGxhc3BlZCBpbnNpZGUgc2luZ2xlIHF1b3Rlcworc3RkaW46CisJZWNobyAnaGkgXAorCXRoZXJlJworCWVjaG8gZm9sa3MKK2V4cGVjdGVkLXN0ZG91dDoKKwloaSBcCisJdGhlcmUKKwlmb2xrcworLS0tCituYW1lOiBia3NsLW5sLWlnbi0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIG5vdCBjb2xsYXNwZWQgaW5zaWRlIHNpbmdsZSBxdW90ZXMKK3N0ZGluOgorCWNhdCA8PCBcRU9GCisJaGkgXAorCXRoZXJlCisJRU9GCitleHBlY3RlZC1zdGRvdXQ6CisJaGkgXAorCXRoZXJlCistLS0KK25hbWU6IGJrc2wtbmwtaWduLTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGludGVyYWN0aW9uIG9mIGFsaWFzZXMsIHNpbmdsZSBxdW90ZXMgYW5kIGhlcmUtZG9jdW1lbnRzCisJd2l0aCBiYWNrc2xhc2gtbmV3bGluZQorCShkb24ndCBrbm93IHdoYXQgUE9TSVggaGFzIHRvIHNheSBhYm91dCB0aGlzKQorc3RkaW46CisJYT0yCisJYWxpYXMgeD0nZWNobyBoaQorCWNhdCA8PCAiRU9GIgorCWZvb1wKKwliYXIKKwlzb21lJworCXgKKwltb3JlXAorCXN0dWZmJGEKKwlFT0YKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCWZvb1wKKwliYXIKKwlzb21lCisJbW9yZVwKKwlzdHVmZiRhCistLS0KK25hbWU6IGJrc2wtbmwtaWduLTUKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHdoYXQgaGFwcGVucyB3aXRoIGJhY2tzbGFzaCBhdCBlbmQgb2YgaW5wdXQKKwkodGhlIG9sZCBCb3VybmUgc2hlbGwgdHJhc2hlcyB0aGVtOyBzbyBkbyB3ZSkKK3N0ZGluOiAhCisJZWNobyBgZWNobyBmb29cXGBiYXIKKwllY2hvIGhpXAorZXhwZWN0ZWQtc3Rkb3V0OgorCWZvb2JhcgorCWhpCistLS0KKyMKKyMgUGxhY2VzIFxuZXdsaW5lIHNob3VsZCBiZSBjb2xsYXBzZWQKKyMKK25hbWU6IGJrc2wtbmwtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgYmVmb3JlLCBpbiB0aGUgbWlkZGxlIG9mLCBhbmQKKwlhZnRlciB3b3Jkcworc3RkaW46CisJIAkgCVwKKwkJCSBlY2hvIGhpXAorCVRoZXJlLCBcCisJZm9sa3MKK2V4cGVjdGVkLXN0ZG91dDoKKwloaVRoZXJlLCBmb2xrcworLS0tCituYW1lOiBia3NsLW5sLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluICQgc2VxdWVuY2VzCisJKGtzaDkzIGZhaWxzIHRoaXMpCitzdGRpbjoKKwlhPTEyCisJYWI9MTkKKwllY2hvICRcCisJYQorCWVjaG8gJGFcCisJYgorCWVjaG8gJFwKKwl7YX0KKwllY2hvICR7YVwKKwlifQorCWVjaG8gJHthYlwKKwl9CitleHBlY3RlZC1zdGRvdXQ6CisJMTIKKwkxOQorCTEyCisJMTkKKwkxOQorLS0tCituYW1lOiBia3NsLW5sLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluICQoLi4pIGFuZCBgLi4uYCBzZXF1ZW5jZXMKKwkoa3NoOTMgZmFpbHMgdGhpcykKK3N0ZGluOgorCWVjaG8gJFwKKwkoZWNobyBmb29iYXIxKQorCWVjaG8gJChcCisJZWNobyBmb29iYXIyKQorCWVjaG8gJChlY2hvIGZvb1wKKwliYXIzKQorCWVjaG8gJChlY2hvIGZvb2JhcjRcCisJKQorCWVjaG8gYAorCWVjaG8gc3R1ZmYxYAorCWVjaG8gYGVjaG8gc3RcCisJdWZmMmAKK2V4cGVjdGVkLXN0ZG91dDoKKwlmb29iYXIxCisJZm9vYmFyMgorCWZvb2JhcjMKKwlmb29iYXI0CisJc3R1ZmYxCisJc3R1ZmYyCistLS0KK25hbWU6IGJrc2wtbmwtNAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgaW4gJCgoLi4pKSBzZXF1ZW5jZXMKKwkoa3NoOTMgZmFpbHMgdGhpcykKK3N0ZGluOgorCWVjaG8gJFwKKwkoKDErMikpCisJZWNobyAkKFwKKwkoMSsyKzMpKQorCWVjaG8gJCgoXAorCTErMiszKzQpKQorCWVjaG8gJCgoMStcCisJMiszKzQrNSkpCisJZWNobyAkKCgxKzIrMys0KzUrNilcCisJKQorZXhwZWN0ZWQtc3Rkb3V0OgorCTMKKwk2CisJMTAKKwkxNQorCTIxCistLS0KK25hbWU6IGJrc2wtbmwtNQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgaW4gZG91YmxlIHF1b3RlZCBzdHJpbmdzCitzdGRpbjoKKwllY2hvICJcCisJaGkiCisJZWNobyAiZm9vXAorCWJhciIKKwllY2hvICJmb2xrc1wKKwkiCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwlmb29iYXIKKwlmb2xrcworLS0tCituYW1lOiBia3NsLW5sLTYKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluIGhlcmUgZG9jdW1lbnQgZGVsaW1pdGVycworCShrc2g5MyBmYWlscyBzZWNvbmQgcGFydCBvZiB0aGlzKQorc3RkaW46CisJYT0xMgorCWNhdCA8PCBFT1wKKwlGCisJYT0kYQorCWZvb1wKKwliYXIKKwlFT0YKKwljYXQgPDwgRV9PX0YKKwlmb28KKwlFX09fXAorCUYKKwllY2hvIGRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwlhPTEyCisJZm9vYmFyCisJZm9vCisJZG9uZQorLS0tCituYW1lOiBia3NsLW5sLTcKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluIGRvdWJsZS1xdW90ZWQgaGVyZS1kb2N1bWVudAorCWRlbGltaXRlci4KK3N0ZGluOgorCWE9MTIKKwljYXQgPDwgIkVPXAorCUYiCisJYT0kYQorCWZvb1wKKwliYXIKKwlFT0YKKwllY2hvIGRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwlhPSRhCisJZm9vXAorCWJhcgorCWRvbmUKKy0tLQorbmFtZTogYmtzbC1ubC04CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiB2YXJpb3VzIDIrIGNoYXJhY3RlciB0b2tlbnMKKwlkZWxpbWl0ZXIuCisJKGtzaDkzIGZhaWxzIHRoaXMpCitzdGRpbjoKKwllY2hvIGhpICZcCisJJiBlY2hvIHRoZXJlCisJZWNobyBmb28gfFwKKwl8IGVjaG8gYmFyCisJY2F0IDxcCisJPCBFT0YKKwlzdHVmZgorCUVPRgorCWNhdCA8XAorCTxcCisJLSBFT0YKKwkJbW9yZSBzdHVmZgorCUVPRgorCWNhdCA8PFwKKwlFT0YKKwlhYmNkZWYKKwlFT0YKKwllY2hvIGhpID5cCisJPiAvZGV2L251bGwKKwllY2hvICQ/CisJaT0xCisJY2FzZSAkaSBpbgorCShcCisJeHxcCisJMVwKKwkpIGVjaG8gaGk7XAorCTsKKwkoKikgZWNobyBvb3BzCisJZXNhYworZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJdGhlcmUKKwlmb28KKwlzdHVmZgorCW1vcmUgc3R1ZmYKKwlhYmNkZWYKKwkwCisJaGkKKy0tLQorbmFtZTogYmtzbC1ubC05CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFwgYXQgdGhlIGVuZCBvZiBhbiBhbGlhcyBpcyBjb2xsYXBzZWQgd2hlbiBmb2xsb3dlZAorCWJ5IGEgbmV3bGluZQorCShkb24ndCBrbm93IHdoYXQgUE9TSVggaGFzIHRvIHNheSBhYm91dCB0aGlzKQorc3RkaW46CisJYWxpYXMgeD0nZWNobyBoaVwnCisJeAorCWVjaG8gdGhlcmUKK2V4cGVjdGVkLXN0ZG91dDoKKwloaWVjaG8gdGhlcmUKKy0tLQorbmFtZTogYmtzbC1ubC0xMAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpbiBhIGtleXdvcmQgaXMgY29sbGFwc2VkCitzdGRpbjoKKwlpXAorCWYgdHJ1ZTsgdGhlblwKKwkgZWNobyBwYXNzOyBlbFwKKwlzZSBlY2hvIGZhaWw7IGZpCitleHBlY3RlZC1zdGRvdXQ6CisJcGFzcworLS0tCisjCisjIFBsYWNlcyBcbmV3bGluZSBzaG91bGQgYmUgY29sbGFwc2VkIChrc2ggZXh0ZW5zaW9ucykKKyMKK25hbWU6IGJrc2wtbmwta3NoLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFwc2VkIGluIGV4dGVuZGVkIGdsb2JiaW5nCisJKGtzaDkzIGZhaWxzIHRoaXMpCitzdGRpbjoKKwl4eHg9Zm9vCisJY2FzZSAkeHh4IGluCisJKGYqXAorCShcCisJb1wKKwkpXAorCSkgZWNobyBvayA7OworCSopIGVjaG8gYmFkCisJZXNhYworZXhwZWN0ZWQtc3Rkb3V0OgorCW9rCistLS0KK25hbWU6IGJrc2wtbmwta3NoLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFwc2VkIGluICgoLi4uKSkgZXhwcmVzc2lvbnMKKwkoa3NoOTMgZmFpbHMgdGhpcykKK3N0ZGluOgorCWk9MQorCShcCisJKFwKKwlpPWkrMlwKKwkpXAorCSkKKwllY2hvICRpCitleHBlY3RlZC1zdGRvdXQ6CisJMworLS0tCituYW1lOiBicmVhay0xCitkZXNjcmlwdGlvbjoKKwlTZWUgaWYgYnJlYWsgYnJlYWtzIG91dCBvZiBsb29wcworc3RkaW46CisJZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGJyZWFrOyBlY2hvIGJhZC0kaTsgZG9uZQorCWVjaG8gZW5kLTEKKwlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgYnJlYWsgMTsgZWNobyBiYWQtJGk7IGRvbmUKKwllY2hvIGVuZC0yCisJZm9yIGkgaW4gYSBiIGM7IGRvCisJICAgIGZvciBqIGluIHggeSB6OyBkbworCQllY2hvICRpOiRqCisJCWJyZWFrCisJCWVjaG8gYmFkLSRpCisJICAgIGRvbmUKKwkgICAgZWNobyBlbmQtJGkKKwlkb25lCisJZWNobyBlbmQtMworZXhwZWN0ZWQtc3Rkb3V0OgorCWEKKwllbmQtMQorCWEKKwllbmQtMgorCWE6eAorCWVuZC1hCisJYjp4CisJZW5kLWIKKwljOngKKwllbmQtYworCWVuZC0zCistLS0KK25hbWU6IGJyZWFrLTIKK2Rlc2NyaXB0aW9uOgorCVNlZSBpZiBicmVhayBicmVha3Mgb3V0IG9mIG5lc3RlZCBsb29wcworc3RkaW46CisJZm9yIGkgaW4gYSBiIGM7IGRvCisJICAgIGZvciBqIGluIHggeSB6OyBkbworCQllY2hvICRpOiRqCisJCWJyZWFrIDIKKwkJZWNobyBiYWQtJGkKKwkgICAgZG9uZQorCSAgICBlY2hvIGVuZC0kaQorCWRvbmUKKwllY2hvIGVuZAorZXhwZWN0ZWQtc3Rkb3V0OgorCWE6eAorCWVuZAorLS0tCituYW1lOiBicmVhay0zCitkZXNjcmlwdGlvbjoKKwlXaGF0IGlmIGJyZWFrIHVzZWQgb3V0c2lkZSBvZiBhbnkgbG9vcHMKKwkoa3NoODgsa3NoOTMgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaGVyZSkKK3N0ZGluOgorCWJyZWFrCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvLipicmVhay4qLworLS0tCituYW1lOiBicmVhay00CitkZXNjcmlwdGlvbjoKKwlXaGF0IGlmIGJyZWFrIE4gdXNlZCB3aGVuIG9ubHkgTi0xIGxvb3BzCisJKGtzaDg4LGtzaDkzIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUpCitzdGRpbjoKKwlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgYnJlYWsgMjsgZWNobyBiYWQtJGk7IGRvbmUKKwllY2hvIGVuZAorZXhwZWN0ZWQtc3Rkb3V0OgorCWEKKwllbmQKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8uKmJyZWFrLiovCistLS0KK25hbWU6IGJyZWFrLTUKK2Rlc2NyaXB0aW9uOgorCUVycm9yIGlmIGJyZWFrIGFyZ3VtZW50IGlzbid0IGEgbnVtYmVyCitzdGRpbjoKKwlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgYnJlYWsgYWJjOyBlY2hvIG1vcmUtJGk7IGRvbmUKKwllY2hvIGVuZAorZXhwZWN0ZWQtc3Rkb3V0OgorCWEKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLy4qYnJlYWsuKi8KKy0tLQorbmFtZTogY29udGludWUtMQorZGVzY3JpcHRpb246CisJU2VlIGlmIGNvbnRpbnVlIGNvbnRpbnVlcyBsb29wcworc3RkaW46CisJZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGNvbnRpbnVlOyBlY2hvIGJhZC0kaSA7IGRvbmUKKwllY2hvIGVuZC0xCisJZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGNvbnRpbnVlIDE7IGVjaG8gYmFkLSRpOyBkb25lCisJZWNobyBlbmQtMgorCWZvciBpIGluIGEgYiBjOyBkbworCSAgICBmb3IgaiBpbiB4IHkgejsgZG8KKwkJZWNobyAkaTokagorCQljb250aW51ZQorCQllY2hvIGJhZC0kaS0kagorCSAgICBkb25lCisJICAgIGVjaG8gZW5kLSRpCisJZG9uZQorCWVjaG8gZW5kLTMKK2V4cGVjdGVkLXN0ZG91dDoKKwlhCisJYgorCWMKKwllbmQtMQorCWEKKwliCisJYworCWVuZC0yCisJYTp4CisJYTp5CisJYTp6CisJZW5kLWEKKwliOngKKwliOnkKKwliOnoKKwllbmQtYgorCWM6eAorCWM6eQorCWM6egorCWVuZC1jCisJZW5kLTMKKy0tLQorbmFtZTogY29udGludWUtMgorZGVzY3JpcHRpb246CisJU2VlIGlmIGNvbnRpbnVlIGJyZWFrcyBvdXQgb2YgbmVzdGVkIGxvb3BzCitzdGRpbjoKKwlmb3IgaSBpbiBhIGIgYzsgZG8KKwkgICAgZm9yIGogaW4geCB5IHo7IGRvCisJCWVjaG8gJGk6JGoKKwkJY29udGludWUgMgorCQllY2hvIGJhZC0kaS0kagorCSAgICBkb25lCisJICAgIGVjaG8gZW5kLSRpCisJZG9uZQorCWVjaG8gZW5kCitleHBlY3RlZC1zdGRvdXQ6CisJYTp4CisJYjp4CisJYzp4CisJZW5kCistLS0KK25hbWU6IGNvbnRpbnVlLTMKK2Rlc2NyaXB0aW9uOgorCVdoYXQgaWYgY29udGludWUgdXNlZCBvdXRzaWRlIG9mIGFueSBsb29wcworCShrc2g4OCxrc2g5MyBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlKQorc3RkaW46CisJY29udGludWUKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8uKmNvbnRpbnVlLiovCistLS0KK25hbWU6IGNvbnRpbnVlLTQKK2Rlc2NyaXB0aW9uOgorCVdoYXQgaWYgY29udGludWUgTiB1c2VkIHdoZW4gb25seSBOLTEgbG9vcHMKKwkoa3NoODgsa3NoOTMgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaGVyZSkKK3N0ZGluOgorCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBjb250aW51ZSAyOyBlY2hvIGJhZC0kaTsgZG9uZQorCWVjaG8gZW5kCitleHBlY3RlZC1zdGRvdXQ6CisJYQorCWIKKwljCisJZW5kCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvLipjb250aW51ZS4qLworLS0tCituYW1lOiBjb250aW51ZS01CitkZXNjcmlwdGlvbjoKKwlFcnJvciBpZiBjb250aW51ZSBhcmd1bWVudCBpc24ndCBhIG51bWJlcgorc3RkaW46CisJZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGNvbnRpbnVlIGFiYzsgZWNobyBtb3JlLSRpOyBkb25lCisJZWNobyBlbmQKK2V4cGVjdGVkLXN0ZG91dDoKKwlhCitleHBlY3RlZC1leGl0OiBlICE9IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8uKmNvbnRpbnVlLiovCistLS0KK25hbWU6IGNkLWhpc3RvcnkKK2Rlc2NyaXB0aW9uOgorCVRlc3Qgc29tZW9uZSdzIENEIGhpc3RvcnkgcGFja2FnZSAodXNlcyBhcnJheXMpCitzdGRpbjoKKwkjIGdvIHRvIGtub3duIHBsYWNlIGJlZm9yZSBkb2luZyBhbnl0aGluZworCWNkIC8KKwkKKwlhbGlhcyBjZD1fY2QKKwlmdW5jdGlvbiBfY2QKKwl7CisJCXR5cGVzZXQgLWkgY2RsZW4gaQorCQl0eXBlc2V0IHQKKwkKKwkJaWYgWyAkIyAtZXEgMCBdCisJCXRoZW4KKwkJCXNldCAtLSAkSE9NRQorCQlmaQorCQorCQlpZiBbICIkQ0RISVNURklMRSIgLWEgLXIgIiRDREhJU1RGSUxFIiBdICMgaWYgZGlyZWN0b3J5IGhpc3RvcnkgZXhpc3RzCisJCXRoZW4KKwkJCXR5cGVzZXQgQ0RISVNUCisJCQlpPS0xCisJCQl3aGlsZSByZWFkIC1yIHQJCQkjIHJlYWQgZGlyZWN0b3J5IGhpc3RvcnkgZmlsZQorCQkJZG8KKwkJCQlDREhJU1RbaT1pKzFdPSR0CisJCQlkb25lIDwkQ0RISVNURklMRQorCQlmaQorCQorCQlpZiBbICIke0NESElTVFswXX0iICE9ICIkUFdEIiAtYSAiJFBXRCIgIT0gIiIgXQorCQl0aGVuCisJCQlfY2RpbnMJCQkJIyBpbnNlcnQgJFBXRCBpbnRvIGNkIGhpc3RvcnkKKwkJZmkKKwkKKwkJY2RsZW49JHsjQ0RISVNUWypdfQkJCSMgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhpc3RvcnkKKwkKKwkJY2FzZSAiJEAiIGluCisJCS0pCQkJCQkjIGNkIHRvIG5ldyBkaXIKKwkJCWlmIFsgIiRPTERQV0QiID0gIiIgXSAmJiAoKGNkbGVuPjEpKQorCQkJdGhlbgorCQkJCSdwcmludCcgJHtDREhJU1RbMV19CisJCQkJJ2NkJyAke0NESElTVFsxXX0KKwkJCQlfcHdkCisJCQllbHNlCisJCQkJJ2NkJyAkQAorCQkJCV9wd2QKKwkJCWZpCisJCQk7OworCQktbCkJCQkJCSMgcHJpbnQgZGlyZWN0b3J5IGxpc3QKKwkJCXR5cGVzZXQgLVIzIG51bQorCQkJKChpPWNkbGVuKSkKKwkJCXdoaWxlICgoKGk9aS0xKT49MCkpCisJCQlkbworCQkJCW51bT0kaQorCQkJCSdwcmludCcgIiRudW0gJHtDREhJU1RbaV19IgorCQkJZG9uZQorCQkJcmV0dXJuCisJCQk7OworCQktWzAtOV18LVswLTldWzAtOV0pCQkJIyBjZCB0byBkaXIgaW4gbGlzdAorCQkJaWYgKCgoaT0kezEjLX0pPGNkbGVuKSkKKwkJCXRoZW4KKwkJCQkncHJpbnQnICR7Q0RISVNUW2ldfQorCQkJCSdjZCcgJHtDREhJU1RbaV19CisJCQkJX3B3ZAorCQkJZWxzZQorCQkJCSdjZCcgJEAKKwkJCQlfcHdkCisJCQlmaQorCQkJOzsKKwkJLSopCQkJCQkjIGNkIHRvIG1hdGNoZWQgZGlyIGluIGxpc3QKKwkJCXQ9JHsxIy19CisJCQlpPTEKKwkJCXdoaWxlICgoaTxjZGxlbikpCisJCQlkbworCQkJCWNhc2UgJHtDREhJU1RbaV19IGluCisJCQkJKiR0KikKKwkJCQkJJ3ByaW50JyAke0NESElTVFtpXX0KKwkJCQkJJ2NkJyAke0NESElTVFtpXX0KKwkJCQkJX3B3ZAorCQkJCQlicmVhaworCQkJCQk7OworCQkJCWVzYWMKKwkJCQkoKGk9aSsxKSkKKwkJCWRvbmUKKwkJCWlmICgoaT49Y2RsZW4pKQorCQkJdGhlbgorCQkJCSdjZCcgJEAKKwkJCQlfcHdkCisJCQlmaQorCQkJOzsKKwkJKikJCQkJCSMgY2QgdG8gbmV3IGRpcgorCQkJJ2NkJyAkQAorCQkJX3B3ZAorCQkJOzsKKwkJZXNhYworCQorCQlfY2RpbnMJCQkJCSMgaW5zZXJ0ICRQV0QgaW50byBjZCBoaXN0b3J5CisJCisJCWlmIFsgIiRDREhJU1RGSUxFIiBdCisJCXRoZW4KKwkJCWNkbGVuPSR7I0NESElTVFsqXX0JCSMgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhpc3RvcnkKKwkKKwkJCWk9MAorCQkJd2hpbGUgKChpPGNkbGVuKSkKKwkJCWRvCisJCQkJJ3ByaW50JyAtciAke0NESElTVFtpXX0JIyB1cGRhdGUgZGlyZWN0b3J5IGhpc3RvcnkKKwkJCQkoKGk9aSsxKSkKKwkJCWRvbmUgPiRDREhJU1RGSUxFCisJCWZpCisJfQorCQorCWZ1bmN0aW9uIF9jZGlucwkJCQkJIyBpbnNlcnQgJFBXRCBpbnRvIGNkIGhpc3RvcnkKKwl7CQkJCQkJIyBtZWFudCB0byBiZSBjYWxsZWQgb25seSBieSBfY2QKKwkJdHlwZXNldCAtaSBpCisJCisJCSgoaT0wKSkKKwkJd2hpbGUgKChpPCR7I0NESElTVFsqXX0pKQkJIyBzZWUgaWYgZGlyIGlzIGFscmVhZHkgaW4gbGlzdAorCQlkbworCQkJaWYgWyAiJHtDREhJU1RbJGldfSIgPSAiJFBXRCIgXQorCQkJdGhlbgorCQkJCWJyZWFrCisJCQlmaQorCQkJKChpPWkrMSkpCisJCWRvbmUKKwkKKwkJaWYgKChpPjIyKSkJCQkJIyBsaW1pdCBtYXggc2l6ZSBvZiBsaXN0CisJCXRoZW4KKwkJCWk9MjIKKwkJZmkKKwkKKwkJd2hpbGUgKCgoaT1pLTEpPj0wKSkJCQkjIGJ1bXAgb2xkIGRpcnMgaW4gbGlzdAorCQlkbworCQkJQ0RISVNUW2krMV09JHtDREhJU1RbaV19CisJCWRvbmUKKwkKKwkJQ0RISVNUWzBdPSRQV0QJCQkJIyBpbnNlcnQgbmV3IGRpcmVjdG9yeSBpbiBsaXN0CisJfQorCQorCQorCWZ1bmN0aW9uIF9wd2QKKwl7CisJCWlmIFsgLW4gIiRFQ0QiIF0KKwkJdGhlbgorCQkJcHdkIDE+JjYKKwkJZmkKKwl9CisJIyBTdGFydCBvZiB0ZXN0CisJY2QgL3RtcAorCWNkIC9iaW4KKwljZCAvZXRjCisJY2QgLQorCWNkIC0yCisJY2QgLWwKK2V4cGVjdGVkLXN0ZG91dDoKKwkvYmluCisJL3RtcAorCSAgMyAvCisJICAyIC9ldGMKKwkgIDEgL2JpbgorCSAgMCAvdG1wCistLS0KK25hbWU6IGVudi1wcm9tcHQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgcHJvbXB0IG5vdCBwcmludGVkIHdoZW4gcHJvY2Vzc2luZyBFTlYKK2Vudi1zZXR1cDogIUVOVj0uL2ZvbyEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJmb28iCisJWFhYPV8KKwlQUzE9WAorCWZhbHNlICYmIGVjaG8gaG1tbQorYXJndW1lbnRzOiAhLWkhCitzdGRpbjoKKwllY2hvIGhpJHtYWFh9dGhlcmUKK2V4cGVjdGVkLXN0ZG91dDoKKwloaV90aGVyZQorZXhwZWN0ZWQtc3RkZXJyOiAhCisJWFgKKy0tLQorbmFtZTogZXhwYW5kLXVnbHkKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgd2VpcmQgJHtmb28rYmFyfSBjb25zdHJ1Y3RzIGFyZSBwYXJzZWQgY29ycmVjdGx5CitzdGRpbjoKKwkoZWNobyAxICR7SUZTKyd9J3p9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDEKKwkoZWNobyAyICIke0lGUysnfSd6fSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMgorCShlY2hvIDMgImZvbyAke0lGUysnYmFyfSBiYXoiKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDMKKwkoZWNobyAtbiAnNCAnOyBwcmludGYgJyVzXG4nICJmb28gJHtJRlMrImIgICBjIn0gYmF6IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiA0CisJKGVjaG8gLW4gJzUgJzsgcHJpbnRmICclc1xuJyAiZm9vICR7SUZTK2IgICBjfSBiYXoiKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDUKKwkoZWNobyA2ICR7SUZTKyJ9Inp9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDYKKwkoZWNobyA3ICIke0lGUysifSJ6fSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gNworCShlY2hvIDggIiR7SUZTK1wifVwien0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDgKKwkoZWNobyA5ICIke0lGUytcIlx9XCJ6fSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gOQorCShlY2hvIDEwIGZvbyAke0lGUysnYmFyfSBiYXonfSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxMAorCShlY2hvIDExICIkKGVjaG8gIiR7SUZTKyd9J3p9IikiKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDExCisJKGVjaG8gMTIgIiQoZWNobyAke0lGUysnfSd6fSkiKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDEyCisJKGVjaG8gMTMgJHtJRlMrXH16fSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxMworCShlY2hvIDE0ICIke0lGUytcfXp9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxNAorCXU9eDsgKGVjaG8gLW4gJzE1ICc7IHByaW50ZiAnPCVzPiAnICJmb28gJHtJRlMrYSJiJHV7IHsie3tcfWJ9IGMgJHtJRlMrZHt9fSBiYXIiICR7SUZTLWV7fX0gYmF6OyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTUKKwlsPXQ7IChlY2hvIDE2ICR7SUZTK2hgZWNobyAtbiBpICR7SUZTKyRsfWhgZXJlfSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxNgorCWw9dDsgKGVjaG8gMTcgJHtJRlMraCQoZWNobyAtbiBpICR7SUZTKyRsfWgpZXJlfSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxNworCWw9dDsgKGVjaG8gMTggIiR7SUZTK2hgZWNobyAtbiBpICR7SUZTKyRsfWhgZXJlfSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTgKKwlsPXQ7IChlY2hvIDE5ICIke0lGUytoJChlY2hvIC1uIGkgJHtJRlMrJGx9aCllcmV9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxOQorCWw9dDsgKGVjaG8gMjAgJHtJRlMraGBlY2hvIC1uIGkgIiR7SUZTKyRsfSJoYGVyZX0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjAKKwlsPXQ7IChlY2hvIDIxICR7SUZTK2gkKGVjaG8gLW4gaSAiJHtJRlMrJGx9ImgpZXJlfSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyMQorCWw9dDsgKGVjaG8gMjIgIiR7SUZTK2hgZWNobyAtbiBpICIke0lGUyskbH0iaGBlcmV9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyMgorCWw9dDsgKGVjaG8gMjMgIiR7SUZTK2gkKGVjaG8gLW4gaSAiJHtJRlMrJGx9ImgpZXJlfSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjMKKwlrZXk9dmFsdWU7IChlY2hvIC1uICcyNCAnOyBwcmludGYgJyVzXG4nICIke0lGUysnJGtleSd9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyNAorCWtleT12YWx1ZTsgKGVjaG8gLW4gJzI1ICc7IHByaW50ZiAnJXNcbicgIiR7SUZTKyInJGtleScifSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjUJIyBrc2g5Mzog4oCcJyRrZXkn4oCdCisJa2V5PXZhbHVlOyAoZWNobyAtbiAnMjYgJzsgcHJpbnRmICclc1xuJyAke0lGUysnJGtleSd9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDI2CisJa2V5PXZhbHVlOyAoZWNobyAtbiAnMjcgJzsgcHJpbnRmICclc1xuJyAke0lGUysiJyRrZXknIn0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjcKKwkoZWNobyAtbiAnMjggJzsgcHJpbnRmICclc1xuJyAiJHtJRlMrIicieCB+IHgnfSd4Iid9Inh9IiAjJykgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyOAorCXU9eDsgKGVjaG8gLW4gJzI5ICc7IHByaW50ZiAnPCVzPiAnIGZvbyAke0lGUythImIkdXsgeyJ7IHtcfWJ9IGMgJHtJRlMrZHt9fSBiYXIgJHtJRlMtZXt9fSBiYXo7IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyOQorCShlY2hvIC1uICczMCAnOyBwcmludGYgJzwlcz4gJyAke0lGUytmb28gJ2JcCisJYXInIGJhen07IGVjaG8gLikgMj4mLSB8fCAoZWNobyBmYWlsZWQgaW4gMzA7IGVjaG8gZmFpbGVkIGluIDMxKQorCShlY2hvIC1uICczMiAnOyBwcmludGYgJzwlcz4gJyAke0lGUytmb28gImJcCisJYXIiIGJhen07IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzMgorCShlY2hvIC1uICczMyAnOyBwcmludGYgJzwlcz4gJyAiJHtJRlMrZm9vICdiXAorCWFyJyBiYXp9IjsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDMzCisJKGVjaG8gLW4gJzM0ICc7IHByaW50ZiAnPCVzPiAnICIke0lGUytmb28gImJcCisJYXIiIGJhen0iOyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzQKKwkoZWNobyAtbiAnMzUgJzsgcHJpbnRmICc8JXM+ICcgJHt2PWFcIGJ9IHggJHt2PWNcIGR9OyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzUKKwkoZWNobyAtbiAnMzYgJzsgcHJpbnRmICc8JXM+ICcgIiR7dj1hXCBifSIgeCAiJHt2PWNcIGR9IjsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDM2CisJKGVjaG8gLW4gJzM3ICc7IHByaW50ZiAnPCVzPiAnICR7di1hXCBifSB4ICR7di1jXCBkfTsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDM3CisJKGVjaG8gMzggJHtJRlMreCdhJ3l9IC8gIiR7SUZTK3gnYSd5fSIgLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzOAorCWZvbz0ieCdhJ3kiOyAoZWNobyAzOSAke2ZvbyUqJ2EnKn0gLyAiJHtmb28lKidhJyp9IiAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDM5CisJZm9vPSJhIGIgYyI7IChlY2hvIC1uICc0MCAnOyBwcmludGYgJzwlcz4gJyAiJHtmb28jYX0iOyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gNDAKK2V4cGVjdGVkLXN0ZG91dDoKKwkxIH16CisJMiAnJ3p9CisJMyBmb28gJ2JhciBiYXoKKwk0IGZvbyBiICAgYyBiYXoKKwk1IGZvbyBiICAgYyBiYXoKKwk2IH16CisJNyB9egorCTggIiJ6fQorCTkgIn0iegorCTEwIGZvbyBiYXJ9IGJhegorCTExICcnen0KKwkxMiB9egorCTEzIH16CisJMTQgfXoKKwkxNSA8Zm9vIGFieHsge3t7fWIgYyBke30gYmFyPiA8fT4gPGJhej4gLgorCTE2IGhpIHRoZXJlCisJMTcgaGkgdGhlcmUKKwkxOCBoaSB0aGVyZQorCTE5IGhpIHRoZXJlCisJMjAgaGkgdGhlcmUKKwkyMSBoaSB0aGVyZQorCTIyIGhpIHRoZXJlCisJMjMgaGkgdGhlcmUKKwkyNCAndmFsdWUnCisJMjUgJ3ZhbHVlJworCTI2ICRrZXkKKwkyNyAndmFsdWUnCisJMjggJ3ggfiB4Jyd4fSJ4fSIgIworCTI5IDxmb28+IDxhYnh7IHt7PiA8e31iPiA8Yz4gPGR7fT4gPGJhcj4gPH0+IDxiYXo+IC4KKwkzMCA8Zm9vPiA8YlwKKwlhcj4gPGJhej4gLgorCTMyIDxmb28+IDxiYXI+IDxiYXo+IC4KKwkzMyA8Zm9vICdiYXInIGJhej4gLgorCTM0IDxmb28gYmFyIGJhej4gLgorCTM1IDxhPiA8Yj4gPHg+IDxhPiA8Yj4gLgorCTM2IDxhXCBiPiA8eD4gPGFcIGI+IC4KKwkzNyA8YSBiPiA8eD4gPGMgZD4gLgorCTM4IHhheSAvIHgnYSd5IC4KKwkzOSB4JyAvIHgnIC4KKwk0MCA8IGIgYz4gLgorLS0tCituYW1lOiBleHBhbmQtdW5nbG9iLWRibHEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgcmVndWxhciAiJHtmb28rYmFyfSIgY29uc3RydWN0cyBhcmUgcGFyc2VkIGNvcnJlY3RseQorc3RkaW46CisJdT14CisJdGxfbm9ybSgpIHsKKwkJdj0kMgorCQl0ZXN0IHgiJHYiID0geCItIiAmJiB1bnNldCB2CisJCShlY2hvICIkMSBwbHVzIG5vcm0gZm9vICR7disnYmFyJ30gYmF6IikKKwkJKGVjaG8gIiQxIGRhc2ggbm9ybSBmb28gJHt2LSdiYXInfSBiYXoiKQorCQkoZWNobyAiJDEgZXFhbCBub3JtIGZvbyAke3Y9J2Jhcid9IGJheiIpCisJCShlY2hvICIkMSBxc3RuIG5vcm0gZm9vICR7dj8nYmFyJ30gYmF6IikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBxc3RuIG5vcm0gLT4gZXJyb3IiCisJCShlY2hvICIkMSBQTFVTIG5vcm0gZm9vICR7djorJ2Jhcid9IGJheiIpCisJCShlY2hvICIkMSBEQVNIIG5vcm0gZm9vICR7djotJ2Jhcid9IGJheiIpCisJCShlY2hvICIkMSBFUUFMIG5vcm0gZm9vICR7djo9J2Jhcid9IGJheiIpCisJCShlY2hvICIkMSBRU1ROIG5vcm0gZm9vICR7djo/J2Jhcid9IGJheiIpIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgUVNUTiBub3JtIC0+IGVycm9yIgorCX0KKwl0bF9wYXJlbigpIHsKKwkJdj0kMgorCQl0ZXN0IHgiJHYiID0geCItIiAmJiB1bnNldCB2CisJCShlY2hvICIkMSBwbHVzIHBhcm4gZm9vICR7disoYmFyKX0gYmF6IikKKwkJKGVjaG8gIiQxIGRhc2ggcGFybiBmb28gJHt2LShiYXIpfSBiYXoiKQorCQkoZWNobyAiJDEgZXFhbCBwYXJuIGZvbyAke3Y9KGJhcil9IGJheiIpCisJCShlY2hvICIkMSBxc3RuIHBhcm4gZm9vICR7dj8oYmFyKX0gYmF6IikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBxc3RuIHBhcm4gLT4gZXJyb3IiCisJCShlY2hvICIkMSBQTFVTIHBhcm4gZm9vICR7djorKGJhcil9IGJheiIpCisJCShlY2hvICIkMSBEQVNIIHBhcm4gZm9vICR7djotKGJhcil9IGJheiIpCisJCShlY2hvICIkMSBFUUFMIHBhcm4gZm9vICR7djo9KGJhcil9IGJheiIpCisJCShlY2hvICIkMSBRU1ROIHBhcm4gZm9vICR7djo/KGJhcil9IGJheiIpIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgUVNUTiBwYXJuIC0+IGVycm9yIgorCX0KKwl0bF9icmFjZSgpIHsKKwkJdj0kMgorCQl0ZXN0IHgiJHYiID0geCItIiAmJiB1bnNldCB2CisJCShlY2hvICIkMSBwbHVzIGJyYWMgZm9vICR7dithJHV7e3tcfWJ9IGMgJHt2K2R7fX0gYmF6IikKKwkJKGVjaG8gIiQxIGRhc2ggYnJhYyBmb28gJHt2LWEkdXt7e1x9Yn0gYyAke3YtZHt9fSBiYXoiKQorCQkoZWNobyAiJDEgZXFhbCBicmFjIGZvbyAke3Y9YSR1e3t7XH1ifSBjICR7dj1ke319IGJheiIpCisJCShlY2hvICIkMSBxc3RuIGJyYWMgZm9vICR7dj9hJHV7e3tcfWJ9IGMgJHt2P2R7fX0gYmF6IikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBxc3RuIGJyYWMgLT4gZXJyb3IiCisJCShlY2hvICIkMSBQTFVTIGJyYWMgZm9vICR7djorYSR1e3t7XH1ifSBjICR7djorZHt9fSBiYXoiKQorCQkoZWNobyAiJDEgREFTSCBicmFjIGZvbyAke3Y6LWEkdXt7e1x9Yn0gYyAke3Y6LWR7fX0gYmF6IikKKwkJKGVjaG8gIiQxIEVRQUwgYnJhYyBmb28gJHt2Oj1hJHV7e3tcfWJ9IGMgJHt2Oj1ke319IGJheiIpCisJCShlY2hvICIkMSBRU1ROIGJyYWMgZm9vICR7djo/YSR1e3t7XH1ifSBjICR7djo/ZHt9fSBiYXoiKSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIFFTVE4gYnJhYyAtPiBlcnJvciIKKwl9CisJdGxfbm9ybSAxIC0KKwl0bF9ub3JtIDIgJycKKwl0bF9ub3JtIDMgeAorCXRsX3BhcmVuIDQgLQorCXRsX3BhcmVuIDUgJycKKwl0bF9wYXJlbiA2IHgKKwl0bF9icmFjZSA3IC0KKwl0bF9icmFjZSA4ICcnCisJdGxfYnJhY2UgOSB4CitleHBlY3RlZC1zdGRvdXQ6CisJMSBwbHVzIG5vcm0gZm9vICBiYXoKKwkxIGRhc2ggbm9ybSBmb28gJ2JhcicgYmF6CisJMSBlcWFsIG5vcm0gZm9vICdiYXInIGJhegorCTEgcXN0biBub3JtIC0+IGVycm9yCisJMSBQTFVTIG5vcm0gZm9vICBiYXoKKwkxIERBU0ggbm9ybSBmb28gJ2JhcicgYmF6CisJMSBFUUFMIG5vcm0gZm9vICdiYXInIGJhegorCTEgUVNUTiBub3JtIC0+IGVycm9yCisJMiBwbHVzIG5vcm0gZm9vICdiYXInIGJhegorCTIgZGFzaCBub3JtIGZvbyAgYmF6CisJMiBlcWFsIG5vcm0gZm9vICBiYXoKKwkyIHFzdG4gbm9ybSBmb28gIGJhegorCTIgUExVUyBub3JtIGZvbyAgYmF6CisJMiBEQVNIIG5vcm0gZm9vICdiYXInIGJhegorCTIgRVFBTCBub3JtIGZvbyAnYmFyJyBiYXoKKwkyIFFTVE4gbm9ybSAtPiBlcnJvcgorCTMgcGx1cyBub3JtIGZvbyAnYmFyJyBiYXoKKwkzIGRhc2ggbm9ybSBmb28geCBiYXoKKwkzIGVxYWwgbm9ybSBmb28geCBiYXoKKwkzIHFzdG4gbm9ybSBmb28geCBiYXoKKwkzIFBMVVMgbm9ybSBmb28gJ2JhcicgYmF6CisJMyBEQVNIIG5vcm0gZm9vIHggYmF6CisJMyBFUUFMIG5vcm0gZm9vIHggYmF6CisJMyBRU1ROIG5vcm0gZm9vIHggYmF6CisJNCBwbHVzIHBhcm4gZm9vICBiYXoKKwk0IGRhc2ggcGFybiBmb28gKGJhcikgYmF6CisJNCBlcWFsIHBhcm4gZm9vIChiYXIpIGJhegorCTQgcXN0biBwYXJuIC0+IGVycm9yCisJNCBQTFVTIHBhcm4gZm9vICBiYXoKKwk0IERBU0ggcGFybiBmb28gKGJhcikgYmF6CisJNCBFUUFMIHBhcm4gZm9vIChiYXIpIGJhegorCTQgUVNUTiBwYXJuIC0+IGVycm9yCisJNSBwbHVzIHBhcm4gZm9vIChiYXIpIGJhegorCTUgZGFzaCBwYXJuIGZvbyAgYmF6CisJNSBlcWFsIHBhcm4gZm9vICBiYXoKKwk1IHFzdG4gcGFybiBmb28gIGJhegorCTUgUExVUyBwYXJuIGZvbyAgYmF6CisJNSBEQVNIIHBhcm4gZm9vIChiYXIpIGJhegorCTUgRVFBTCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk1IFFTVE4gcGFybiAtPiBlcnJvcgorCTYgcGx1cyBwYXJuIGZvbyAoYmFyKSBiYXoKKwk2IGRhc2ggcGFybiBmb28geCBiYXoKKwk2IGVxYWwgcGFybiBmb28geCBiYXoKKwk2IHFzdG4gcGFybiBmb28geCBiYXoKKwk2IFBMVVMgcGFybiBmb28gKGJhcikgYmF6CisJNiBEQVNIIHBhcm4gZm9vIHggYmF6CisJNiBFUUFMIHBhcm4gZm9vIHggYmF6CisJNiBRU1ROIHBhcm4gZm9vIHggYmF6CisJNyBwbHVzIGJyYWMgZm9vICBjIH0gYmF6CisJNyBkYXNoIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJNyBlcWFsIGJyYWMgZm9vIGF4e3t7fWIgYyBheHt7e31ifSBiYXoKKwk3IHFzdG4gYnJhYyAtPiBlcnJvcgorCTcgUExVUyBicmFjIGZvbyAgYyB9IGJhegorCTcgREFTSCBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTcgRVFBTCBicmFjIGZvbyBheHt7e31iIGMgYXh7e3t9Yn0gYmF6CisJNyBRU1ROIGJyYWMgLT4gZXJyb3IKKwk4IHBsdXMgYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk4IGRhc2ggYnJhYyBmb28gIGMgfSBiYXoKKwk4IGVxYWwgYnJhYyBmb28gIGMgfSBiYXoKKwk4IHFzdG4gYnJhYyBmb28gIGMgfSBiYXoKKwk4IFBMVVMgYnJhYyBmb28gIGMgfSBiYXoKKwk4IERBU0ggYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk4IEVRQUwgYnJhYyBmb28gYXh7e3t9YiBjIGF4e3t7fWJ9IGJhegorCTggUVNUTiBicmFjIC0+IGVycm9yCisJOSBwbHVzIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJOSBkYXNoIGJyYWMgZm9vIHggYyB4fSBiYXoKKwk5IGVxYWwgYnJhYyBmb28geCBjIHh9IGJhegorCTkgcXN0biBicmFjIGZvbyB4IGMgeH0gYmF6CisJOSBQTFVTIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJOSBEQVNIIGJyYWMgZm9vIHggYyB4fSBiYXoKKwk5IEVRQUwgYnJhYyBmb28geCBjIHh9IGJhegorCTkgUVNUTiBicmFjIGZvbyB4IGMgeH0gYmF6CistLS0KK25hbWU6IGV4cGFuZC11bmdsb2ItdW5xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHJlZ3VsYXIgJHtmb28rYmFyfSBjb25zdHJ1Y3RzIGFyZSBwYXJzZWQgY29ycmVjdGx5CitzdGRpbjoKKwl1PXgKKwl0bF9ub3JtKCkgeworCQl2PSQyCisJCXRlc3QgeCIkdiIgPSB4Ii0iICYmIHVuc2V0IHYKKwkJKGVjaG8gJDEgcGx1cyBub3JtIGZvbyAke3YrJ2Jhcid9IGJheikKKwkJKGVjaG8gJDEgZGFzaCBub3JtIGZvbyAke3YtJ2Jhcid9IGJheikKKwkJKGVjaG8gJDEgZXFhbCBub3JtIGZvbyAke3Y9J2Jhcid9IGJheikKKwkJKGVjaG8gJDEgcXN0biBub3JtIGZvbyAke3Y/J2Jhcid9IGJheikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBxc3RuIG5vcm0gLT4gZXJyb3IiCisJCShlY2hvICQxIFBMVVMgbm9ybSBmb28gJHt2OisnYmFyJ30gYmF6KQorCQkoZWNobyAkMSBEQVNIIG5vcm0gZm9vICR7djotJ2Jhcid9IGJheikKKwkJKGVjaG8gJDEgRVFBTCBub3JtIGZvbyAke3Y6PSdiYXInfSBiYXopCisJCShlY2hvICQxIFFTVE4gbm9ybSBmb28gJHt2Oj8nYmFyJ30gYmF6KSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIFFTVE4gbm9ybSAtPiBlcnJvciIKKwl9CisJdGxfcGFyZW4oKSB7CisJCXY9JDIKKwkJdGVzdCB4IiR2IiA9IHgiLSIgJiYgdW5zZXQgdgorCQkoZWNobyAkMSBwbHVzIHBhcm4gZm9vICR7ditcKGJhcicpJ30gYmF6KQorCQkoZWNobyAkMSBkYXNoIHBhcm4gZm9vICR7di1cKGJhcicpJ30gYmF6KQorCQkoZWNobyAkMSBlcWFsIHBhcm4gZm9vICR7dj1cKGJhcicpJ30gYmF6KQorCQkoZWNobyAkMSBxc3RuIHBhcm4gZm9vICR7dj9cKGJhcicpJ30gYmF6KSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIHFzdG4gcGFybiAtPiBlcnJvciIKKwkJKGVjaG8gJDEgUExVUyBwYXJuIGZvbyAke3Y6K1woYmFyJyknfSBiYXopCisJCShlY2hvICQxIERBU0ggcGFybiBmb28gJHt2Oi1cKGJhcicpJ30gYmF6KQorCQkoZWNobyAkMSBFUUFMIHBhcm4gZm9vICR7djo9XChiYXInKSd9IGJheikKKwkJKGVjaG8gJDEgUVNUTiBwYXJuIGZvbyAke3Y6P1woYmFyJyknfSBiYXopIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgUVNUTiBwYXJuIC0+IGVycm9yIgorCX0KKwl0bF9icmFjZSgpIHsKKwkJdj0kMgorCQl0ZXN0IHgiJHYiID0geCItIiAmJiB1bnNldCB2CisJCShlY2hvICQxIHBsdXMgYnJhYyBmb28gJHt2K2EkdXt7e1x9Yn0gYyAke3YrZHt9fSBiYXopCisJCShlY2hvICQxIGRhc2ggYnJhYyBmb28gJHt2LWEkdXt7e1x9Yn0gYyAke3YtZHt9fSBiYXopCisJCShlY2hvICQxIGVxYWwgYnJhYyBmb28gJHt2PWEkdXt7e1x9Yn0gYyAke3Y9ZHt9fSBiYXopCisJCShlY2hvICQxIHFzdG4gYnJhYyBmb28gJHt2P2EkdXt7e1x9Yn0gYyAke3Y/ZHt9fSBiYXopIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgcXN0biBicmFjIC0+IGVycm9yIgorCQkoZWNobyAkMSBQTFVTIGJyYWMgZm9vICR7djorYSR1e3t7XH1ifSBjICR7djorZHt9fSBiYXopCisJCShlY2hvICQxIERBU0ggYnJhYyBmb28gJHt2Oi1hJHV7e3tcfWJ9IGMgJHt2Oi1ke319IGJheikKKwkJKGVjaG8gJDEgRVFBTCBicmFjIGZvbyAke3Y6PWEkdXt7e1x9Yn0gYyAke3Y6PWR7fX0gYmF6KQorCQkoZWNobyAkMSBRU1ROIGJyYWMgZm9vICR7djo/YSR1e3t7XH1ifSBjICR7djo/ZHt9fSBiYXopIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgUVNUTiBicmFjIC0+IGVycm9yIgorCX0KKwl0bF9ub3JtIDEgLQorCXRsX25vcm0gMiAnJworCXRsX25vcm0gMyB4CisJdGxfcGFyZW4gNCAtCisJdGxfcGFyZW4gNSAnJworCXRsX3BhcmVuIDYgeAorCXRsX2JyYWNlIDcgLQorCXRsX2JyYWNlIDggJycKKwl0bF9icmFjZSA5IHgKK2V4cGVjdGVkLXN0ZG91dDoKKwkxIHBsdXMgbm9ybSBmb28gYmF6CisJMSBkYXNoIG5vcm0gZm9vIGJhciBiYXoKKwkxIGVxYWwgbm9ybSBmb28gYmFyIGJhegorCTEgcXN0biBub3JtIC0+IGVycm9yCisJMSBQTFVTIG5vcm0gZm9vIGJhegorCTEgREFTSCBub3JtIGZvbyBiYXIgYmF6CisJMSBFUUFMIG5vcm0gZm9vIGJhciBiYXoKKwkxIFFTVE4gbm9ybSAtPiBlcnJvcgorCTIgcGx1cyBub3JtIGZvbyBiYXIgYmF6CisJMiBkYXNoIG5vcm0gZm9vIGJhegorCTIgZXFhbCBub3JtIGZvbyBiYXoKKwkyIHFzdG4gbm9ybSBmb28gYmF6CisJMiBQTFVTIG5vcm0gZm9vIGJhegorCTIgREFTSCBub3JtIGZvbyBiYXIgYmF6CisJMiBFUUFMIG5vcm0gZm9vIGJhciBiYXoKKwkyIFFTVE4gbm9ybSAtPiBlcnJvcgorCTMgcGx1cyBub3JtIGZvbyBiYXIgYmF6CisJMyBkYXNoIG5vcm0gZm9vIHggYmF6CisJMyBlcWFsIG5vcm0gZm9vIHggYmF6CisJMyBxc3RuIG5vcm0gZm9vIHggYmF6CisJMyBQTFVTIG5vcm0gZm9vIGJhciBiYXoKKwkzIERBU0ggbm9ybSBmb28geCBiYXoKKwkzIEVRQUwgbm9ybSBmb28geCBiYXoKKwkzIFFTVE4gbm9ybSBmb28geCBiYXoKKwk0IHBsdXMgcGFybiBmb28gYmF6CisJNCBkYXNoIHBhcm4gZm9vIChiYXIpIGJhegorCTQgZXFhbCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk0IHFzdG4gcGFybiAtPiBlcnJvcgorCTQgUExVUyBwYXJuIGZvbyBiYXoKKwk0IERBU0ggcGFybiBmb28gKGJhcikgYmF6CisJNCBFUUFMIHBhcm4gZm9vIChiYXIpIGJhegorCTQgUVNUTiBwYXJuIC0+IGVycm9yCisJNSBwbHVzIHBhcm4gZm9vIChiYXIpIGJhegorCTUgZGFzaCBwYXJuIGZvbyBiYXoKKwk1IGVxYWwgcGFybiBmb28gYmF6CisJNSBxc3RuIHBhcm4gZm9vIGJhegorCTUgUExVUyBwYXJuIGZvbyBiYXoKKwk1IERBU0ggcGFybiBmb28gKGJhcikgYmF6CisJNSBFUUFMIHBhcm4gZm9vIChiYXIpIGJhegorCTUgUVNUTiBwYXJuIC0+IGVycm9yCisJNiBwbHVzIHBhcm4gZm9vIChiYXIpIGJhegorCTYgZGFzaCBwYXJuIGZvbyB4IGJhegorCTYgZXFhbCBwYXJuIGZvbyB4IGJhegorCTYgcXN0biBwYXJuIGZvbyB4IGJhegorCTYgUExVUyBwYXJuIGZvbyAoYmFyKSBiYXoKKwk2IERBU0ggcGFybiBmb28geCBiYXoKKwk2IEVRQUwgcGFybiBmb28geCBiYXoKKwk2IFFTVE4gcGFybiBmb28geCBiYXoKKwk3IHBsdXMgYnJhYyBmb28gYyB9IGJhegorCTcgZGFzaCBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTcgZXFhbCBicmFjIGZvbyBheHt7e31iIGMgYXh7e3t9Yn0gYmF6CisJNyBxc3RuIGJyYWMgLT4gZXJyb3IKKwk3IFBMVVMgYnJhYyBmb28gYyB9IGJhegorCTcgREFTSCBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTcgRVFBTCBicmFjIGZvbyBheHt7e31iIGMgYXh7e3t9Yn0gYmF6CisJNyBRU1ROIGJyYWMgLT4gZXJyb3IKKwk4IHBsdXMgYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk4IGRhc2ggYnJhYyBmb28gYyB9IGJhegorCTggZXFhbCBicmFjIGZvbyBjIH0gYmF6CisJOCBxc3RuIGJyYWMgZm9vIGMgfSBiYXoKKwk4IFBMVVMgYnJhYyBmb28gYyB9IGJhegorCTggREFTSCBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTggRVFBTCBicmFjIGZvbyBheHt7e31iIGMgYXh7e3t9Yn0gYmF6CisJOCBRU1ROIGJyYWMgLT4gZXJyb3IKKwk5IHBsdXMgYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk5IGRhc2ggYnJhYyBmb28geCBjIHh9IGJhegorCTkgZXFhbCBicmFjIGZvbyB4IGMgeH0gYmF6CisJOSBxc3RuIGJyYWMgZm9vIHggYyB4fSBiYXoKKwk5IFBMVVMgYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk5IERBU0ggYnJhYyBmb28geCBjIHh9IGJhegorCTkgRVFBTCBicmFjIGZvbyB4IGMgeH0gYmF6CisJOSBRU1ROIGJyYWMgZm9vIHggYyB4fSBiYXoKKy0tLQorbmFtZTogZWdsb2ItYmFkLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgZ2xvYmJpbmcgaXNuJ3QgZG9uZSB3aGVuIGdsb2IgaGFzIHN5bnRheCBlcnJvcgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiY3giCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjeiIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJiYmMiCitzdGRpbjoKKwllY2hvICEoWyopKgorCWVjaG8gKyhhfGJbKSoKK2V4cGVjdGVkLXN0ZG91dDoKKwkhKFsqKSoKKwkrKGF8YlspKgorLS0tCituYW1lOiBlZ2xvYi1iYWQtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBnbG9iYmluZyBpc24ndCBkb25lIHdoZW4gZ2xvYiBoYXMgc3ludGF4IGVycm9yCisJKEFUJlQga3NoIGZhaWxzIHRoaXMgdGVzdCkKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmN4IgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiY3oiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYmJjIgorc3RkaW46CisJZWNobyBbYSooXSopegorZXhwZWN0ZWQtc3Rkb3V0OgorCVthKihdKil6CistLS0KK25hbWU6IGVnbG9iLWluZmluaXRlLXBsdXMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgc2hlbGwgZG9lc24ndCBnbyBpbnRvIGluZmluaXRlIGxvb3AgZXhwYW5kaW5nICsoLi4uKQorCWV4cHJlc3Npb25zLgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYyIKK3RpbWUtbGltaXQ6IDMKK3N0ZGluOgorCWVjaG8gKygpYworCWVjaG8gKygpeAorCWVjaG8gKygqKWMKKwllY2hvICsoKil4CitleHBlY3RlZC1zdGRvdXQ6CisJKygpYworCSsoKXgKKwlhYmMKKwkrKCopeAorLS0tCituYW1lOiBlZ2xvYi1zdWJzdC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGVnbG9iYmluZyBpc24ndCBkb25lIG9uIHN1YnN0aXR1dGlvbiByZXN1bHRzCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjIgorc3RkaW46CisJeD0nQCgqKScKKwllY2hvICR4CitleHBlY3RlZC1zdGRvdXQ6CisJQCgqKQorLS0tCituYW1lOiBlZ2xvYi1ub21hdGNoLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIHBhdHRlcm4gZG9lc24ndCBtYXRjaAorc3RkaW46CisJZWNobyAxOiBuby1maWxlKyhhfGIpc3R1ZmYKKwllY2hvIDI6IG5vLWZpbGUrKGEqKGMpfGIpc3R1ZmYKKwllY2hvIDM6IG5vLWZpbGUrKCgoKGMpKSl8YilzdHVmZgorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6IG5vLWZpbGUrKGF8YilzdHVmZgorCTI6IG5vLWZpbGUrKGEqKGMpfGIpc3R1ZmYKKwkzOiBuby1maWxlKygoKChjKSkpfGIpc3R1ZmYKKy0tLQorbmFtZTogZWdsb2ItbWF0Y2gtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgcGF0dGVybiBtYXRjaGVzIGNvcnJlY3RseQorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiZCIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhY2QiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJhYyIKK3N0ZGluOgorCWVjaG8gMTogYSsoYnxjKWQKKwllY2hvIDI6IGEhKEAoYnxCKSlkCisJZWNobyAzOiAqKGEoYnxjKSkJCSMgKC4uLnwuLi4pIGNhbiBiZSB1c2VkIHdpdGhpbiBYKC4uKQorCWVjaG8gNDogYVtiKihmb298YmFyKV1kCQkjIHBhdHRlcm5zIG5vdCBzcGVjaWFsIGluc2lkZSBbLi4uXQorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6IGFiZCBhY2QKKwkyOiBhY2QKKwkzOiBhYmFjCisJNDogYWJkCistLS0KK25hbWU6IGVnbG9iLWNhc2UtMQorZGVzY3JpcHRpb246CisJU2ltcGxlIG5lZ2F0aW9uIHRlc3RzCitzdGRpbjoKKwljYXNlIGZvbyBpbiAhKGZvb3xiYXIpKSBlY2hvIHllczs7ICopIGVjaG8gbm87OyBlc2FjCisJY2FzZSBiYXIgaW4gIShmb298YmFyKSkgZWNobyB5ZXM7OyAqKSBlY2hvIG5vOzsgZXNhYworZXhwZWN0ZWQtc3Rkb3V0OgorCW5vCisJbm8KKy0tLQorbmFtZTogZWdsb2ItY2FzZS0yCitkZXNjcmlwdGlvbjoKKwlTaW1wbGUga2xlZW5lIHRlc3RzCitzdGRpbjoKKwljYXNlIGZvbyBpbiAqKGF8YlspKSBlY2hvIHllczs7ICopIGVjaG8gbm87OyBlc2FjCisJY2FzZSBmb28gaW4gKihhfGJbKXxmKikgZWNobyB5ZXM7OyAqKSBlY2hvIG5vOzsgZXNhYworCWNhc2UgJyooYXxiWyknIGluICooYXxiWykpIGVjaG8geWVzOzsgKikgZWNobyBubzs7IGVzYWMKK2V4cGVjdGVkLXN0ZG91dDoKKwlubworCXllcworCXllcworLS0tCituYW1lOiBlZ2xvYi10cmltLTEKK2Rlc2NyaXB0aW9uOgorCUVnbG9iYmluZyBpbiB0cmltIGV4cHJlc3Npb25zLi4uCisJKEFUJlQga3NoIGZhaWxzIHRoaXMgLSBkb2NzIHNheSAjIG1hdGNoZXMgc2hvcnRlc3Qgc3RyaW5nLCAjIyBtYXRjaGVzCisJbG9uZ2VzdC4uLikKK3N0ZGluOgorCXg9YWJjZGVmCisJZWNobyAxOiAke3gjYXxhYmN9CisJZWNobyAyOiAke3gjI2F8YWJjfQorCWVjaG8gMzogJHt4JWRlZnxmfQorCWVjaG8gNDogJHt4JSVmfGRlZn0KK2V4cGVjdGVkLXN0ZG91dDoKKwkxOiBiY2RlZgorCTI6IGRlZgorCTM6IGFiY2RlCisJNDogYWJjCistLS0KK25hbWU6IGVnbG9iLXRyaW0tMgorZGVzY3JpcHRpb246CisJQ2hlY2sgZWdsb2JiaW5nIHdvcmtzIGluIHRyaW1zLi4uCitzdGRpbjoKKwl4PWFiY2RlZgorCWVjaG8gMTogJHt4IyooYXxiKWNkfQorCWVjaG8gMjogIiR7eCMqKGF8YiljZH0iCisJZWNobyAzOiAke3gjIiooYXxiKWNkIn0KKwllY2hvIDQ6ICR7eCNhKGJ8Yyl9CitleHBlY3RlZC1zdGRvdXQ6CisJMTogZWYKKwkyOiBlZgorCTM6IGFiY2RlZgorCTQ6IGNkZWYKKy0tLQorbmFtZTogZWdsb2Itc3Vic3RycGwtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgZWdsb2JiaW5nIHdvcmtzIGluIHN1YnN0cy4uLiBhbmQgdGhleSB3b3JrIGF0IGFsbAorc3RkaW46CisJW1sgLW4gJEJBU0hfVkVSU0lPTiBdXSAmJiBzaG9wdCAtcyBleHRnbG9iCisJeD0xMjIyMzIxX2FiL2NkZV9iL2NfMTIyMQorCXk9eHl6CisJZWNobyAxOiAke3gvMn0KKwllY2hvIDI6ICR7eC8vMn0KKwllY2hvIDM6ICR7eC8rKDIpfQorCWVjaG8gNDogJHt4Ly8rKDIpfQorCWVjaG8gNTogJHt4LzIvNH0KKwllY2hvIDY6ICR7eC8vMi80fQorCWVjaG8gNzogJHt4LysoMikvNH0KKwllY2hvIDg6ICR7eC8vKygyKS80fQorCWVjaG8gOTogJHt4L2IvYy9lL2Z9CisJZWNobyAxMDogJHt4L2JcL2MvZS9mfQorCWVjaG8gMTE6ICR7eC9iXC9jL2VcL2Z9CisJZWNobyAxMjogJHt4L2JcL2MvZVxcL2Z9CisJZWNobyAxMzogJHt4L2JcXC9jL2VcXC9mfQorCWVjaG8gMTQ6ICR7eC8vYi9jL2UvZn0KKwllY2hvIDE1OiAke3gvL2JcL2MvZS9mfQorCWVjaG8gMTY6ICR7eC8vYlwvYy9lXC9mfQorCWVjaG8gMTc6ICR7eC8vYlwvYy9lXFwvZn0KKwllY2hvIDE4OiAke3gvL2JcXC9jL2VcXC9mfQorCWVjaG8gMTk6ICR7eC9iXC8qXC9jL3h9CisJZWNobyAyMDogJHt4L1wvLy59CisJZWNobyAyMTogJHt4Ly9cLy8ufQorCWVjaG8gMjI6ICR7eC8vLy59CisJZWNobyAyMzogJHt4Ly8jMS85fQorCWVjaG8gMjQ6ICR7eC8vJTEvOX0KKwllY2hvIDI1OiAke3gvL1wlMS85fQorCWVjaG8gMjY6ICR7eC8vXFwlMS85fQorCWVjaG8gMjc6ICR7eC8vXGEvOX0KKwllY2hvIDI4OiAke3gvL1xcYS85fQorCWVjaG8gMjk6ICR7eC8yLyR5fQorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6IDEyMjMyMV9hYi9jZGVfYi9jXzEyMjEKKwkyOiAxMzFfYWIvY2RlX2IvY18xMQorCTM6IDEzMjFfYWIvY2RlX2IvY18xMjIxCisJNDogMTMxX2FiL2NkZV9iL2NfMTEKKwk1OiAxNDIyMzIxX2FiL2NkZV9iL2NfMTIyMQorCTY6IDE0NDQzNDFfYWIvY2RlX2IvY18xNDQxCisJNzogMTQzMjFfYWIvY2RlX2IvY18xMjIxCisJODogMTQzNDFfYWIvY2RlX2IvY18xNDEKKwk5OiAxMjIyMzIxX2FjL2UvZi9jZGVfYi9jXzEyMjEKKwkxMDogMTIyMjMyMV9hZS9mZGVfYi9jXzEyMjEKKwkxMTogMTIyMjMyMV9hZS9mZGVfYi9jXzEyMjEKKwkxMjogMTIyMjMyMV9hZVwvZmRlX2IvY18xMjIxCisJMTM6IDEyMjIzMjFfYWIvY2RlX2IvY18xMjIxCisJMTQ6IDEyMjIzMjFfYWMvZS9mL2NkZV9jL2UvZi9jXzEyMjEKKwkxNTogMTIyMjMyMV9hZS9mZGVfZS9mXzEyMjEKKwkxNjogMTIyMjMyMV9hZS9mZGVfZS9mXzEyMjEKKwkxNzogMTIyMjMyMV9hZVwvZmRlX2VcL2ZfMTIyMQorCTE4OiAxMjIyMzIxX2FiL2NkZV9iL2NfMTIyMQorCTE5OiAxMjIyMzIxX2F4XzEyMjEKKwkyMDogMTIyMjMyMV9hYi5jZGVfYi9jXzEyMjEKKwkyMTogMTIyMjMyMV9hYi5jZGVfYi5jXzEyMjEKKwkyMjogMTIyMjMyMV9hYi9jZGVfYi9jXzEyMjEKKwkyMzogOTIyMjMyMV9hYi9jZGVfYi9jXzEyMjEKKwkyNDogMTIyMjMyMV9hYi9jZGVfYi9jXzEyMjkKKwkyNTogMTIyMjMyMV9hYi9jZGVfYi9jXzEyMjkKKwkyNjogMTIyMjMyMV9hYi9jZGVfYi9jXzEyMjEKKwkyNzogMTIyMjMyMV85Yi9jZGVfYi9jXzEyMjEKKwkyODogMTIyMjMyMV85Yi9jZGVfYi9jXzEyMjEKKwkyOTogMXh5ejIyMzIxX2FiL2NkZV9iL2NfMTIyMQorLS0tCituYW1lOiBlZ2xvYi1zdWJzdHJwbC0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBhbmNob3JlZCBzdWJzdHJpbmcgcmVwbGFjZW1lbnQgd29ya3MsIGNvcm5lciBjYXNlcworc3RkaW46CisJZm9vPTEyMworCWVjaG8gMTogJHtmb28vIy94fQorCWVjaG8gMjogJHtmb28vJS94fQorCWVjaG8gMzogJHtmb28vIy99CisJZWNobyA0OiAke2Zvby8jfQorCWVjaG8gNTogJHtmb28vJS99CisJZWNobyA2OiAke2Zvby8lfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6IHgxMjMKKwkyOiAxMjN4CisJMzogMTIzCisJNDogMTIzCisJNTogMTIzCisJNjogMTIzCistLS0KK25hbWU6IGVnbG9iLXN1YnN0cnBsLTNhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzdWJzdHJpbmcgcmVwbGFjZW1lbnQgd29ya3Mgd2l0aCB2YXJpYWJsZXMgYW5kIHNsYXNoZXMsIHRvbworc3RkaW46CisJcGZ4PS9ob21lL3VzZXIKKwl3ZD0vaG9tZS91c2VyL3RtcAorCWVjaG8gIiR7d2QvIyRwZngvfn0iCisJZWNobyAiJHt3ZC8jXCRwZngvfn0iCisJZWNobyAiJHt3ZC8jIiRwZngiL359IgorCWVjaG8gIiR7d2QvIyckcGZ4Jy9+fSIKKwllY2hvICIke3dkLyMiXCRwZngiL359IgorCWVjaG8gIiR7d2QvIydcJHBmeCcvfn0iCitleHBlY3RlZC1zdGRvdXQ6CisJfi90bXAKKwkvaG9tZS91c2VyL3RtcAorCX4vdG1wCisJL2hvbWUvdXNlci90bXAKKwkvaG9tZS91c2VyL3RtcAorCS9ob21lL3VzZXIvdG1wCistLS0KK25hbWU6IGVnbG9iLXN1YnN0cnBsLTNiCitkZXNjcmlwdGlvbjoKKwlNb3JlIG9mIHRoaXMsIGJhc2ggZmFpbHMgaXQgKGJhc2g0IHBhc3NlcykKK3N0ZGluOgorCXBmeD0vaG9tZS91c2VyCisJd2Q9L2hvbWUvdXNlci90bXAKKwllY2hvICIke3dkLyMkKGVjaG8gL2hvbWUvdXNlcikvfn0iCisJZWNobyAiJHt3ZC8jIiQoZWNobyAvaG9tZS91c2VyKSIvfn0iCisJZWNobyAiJHt3ZC8jJyQoZWNobyAvaG9tZS91c2VyKScvfn0iCitleHBlY3RlZC1zdGRvdXQ6CisJfi90bXAKKwl+L3RtcAorCS9ob21lL3VzZXIvdG1wCistLS0KK25hbWU6IGVnbG9iLXN1YnN0cnBsLTNjCitkZXNjcmlwdGlvbjoKKwlFdmVuIG1vcmUgd2VpcmQgY2FzZXMKK3N0ZGluOgorCXBmeD0vaG9tZS91c2VyCisJd2Q9JyRwZngvdG1wJworCWVjaG8gMTogJHt3ZC8jJHBmeC9+fQorCWVjaG8gMjogJHt3ZC8jXCRwZngvfn0KKwllY2hvIDM6ICR7d2QvIyIkcGZ4Ii9+fQorCWVjaG8gNDogJHt3ZC8jJyRwZngnL359CisJZWNobyA1OiAke3dkLyMiXCRwZngiL359CisJZWNobyA2OiAke3dkLyMnXCRwZngnL359CisJdHM9J2EvYmEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKScKKwl0cD1hL2IKKwl0cj1jL2QKKwlbWyAtbiAkQkFTSF9WRVJTSU9OIF1dICYmIHNob3B0IC1zIGV4dGdsb2IKKwllY2hvIDc6ICR7dHMvYVwvYi8kdHJ9CisJZWNobyA4OiAke3RzL2FcL2IvXCR0cn0KKwllY2hvIDk6ICR7dHMvJHRwLyR0cn0KKwllY2hvIDEwOiAke3RzL1wkdHAvJHRyfQorCWVjaG8gMTE6ICR7dHMvXFwkdHAvJHRyfQorCWVjaG8gMTI6ICR7dHMvJHRwL2MvZH0KKwllY2hvIDEzOiAke3RzLyR0cC9jXC9kfQorCWVjaG8gMTQ6ICR7dHMvJHRwL2NcXC9kfQorCWVjaG8gMTU6ICR7dHMvKyhhXC9iKS8kdHJ9CisJZWNobyAxNjogJHt0cy8rKGFcL2IpL1wkdHJ9CisJZWNobyAxNzogJHt0cy8rKCR0cCkvJHRyfQorCWVjaG8gMTg6ICR7dHMvKygkdHApL2MvZH0KKwllY2hvIDE5OiAke3RzLysoJHRwKS9jXC9kfQorCWVjaG8gMjU6ICR7dHMvL2FcL2IvJHRyfQorCWVjaG8gMjY6ICR7dHMvL2FcL2IvXCR0cn0KKwllY2hvIDI3OiAke3RzLy8kdHAvJHRyfQorCWVjaG8gMjg6ICR7dHMvLyR0cC9jL2R9CisJZWNobyAyOTogJHt0cy8vJHRwL2NcL2R9CisJZWNobyAzMDogJHt0cy8vKyhhXC9iKS8kdHJ9CisJZWNobyAzMTogJHt0cy8vKyhhXC9iKS9cJHRyfQorCWVjaG8gMzI6ICR7dHMvLysoJHRwKS8kdHJ9CisJZWNobyAzMzogJHt0cy8vKygkdHApL2MvZH0KKwllY2hvIDM0OiAke3RzLy8rKCR0cCkvY1wvZH0KKwl0cD0iKygkdHApIgorCWVjaG8gNDA6ICR7dHMvJHRwLyR0cn0KKwllY2hvIDQxOiAke3RzLy8kdHAvJHRyfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6ICRwZngvdG1wCisJMjogfi90bXAKKwkzOiAkcGZ4L3RtcAorCTQ6IH4vdG1wCisJNTogfi90bXAKKwk2OiB+L3RtcAorCTc6IGMvZGEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTg6ICR0cmEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTk6IGMvZGEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTEwOiBhL2JhL2JjL2QkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwkxMTogYy9kYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJMTI6IGMvZGEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTEzOiBjL2RhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwkxNDogY1wvZGEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTE1OiBjL2QkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwkxNjogJHRyJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJMTc6IGMvZCR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTE4OiBjL2QkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwkxOTogYy9kJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJMjU6IGMvZGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQorCTI2OiAkdHIkdHIkdHAkdHBfJHRyJHRwXyooJHRyKV8qKCR0cCkKKwkyNzogYy9kYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCisJMjg6IGMvZGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQorCTI5OiBjL2RjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKKwkzMDogYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCisJMzE6ICR0ciR0cCR0cF8kdHIkdHBfKigkdHIpXyooJHRwKQorCTMyOiBjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKKwkzMzogYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCisJMzQ6IGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQorCTQwOiBhL2JhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwk0MTogYS9iYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisjCVRoaXMgaXMgd2hhdCBHTlUgYmFzaCBkb2VzOgorIwk0MDogYy9kJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisjCTQxOiBjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKKy0tLQorbmFtZTogZWdsb2ItdXRmOC0xCitkZXNjcmlwdGlvbjoKKwlVVEYtOCBtb2RlIGRpZmZlcmVuY2VzIGZvciBlZ2xvYmJpbmcKK3N0ZGluOgorCXM9YmzDtmQKKwlzZXQgK1UKKwlwcmludCAxOiAke3MlPz8/fSAuCisJcHJpbnQgMjogJHtzL2I/Pz9kL3h9IC4KKwlzZXQgLVUKKwlwcmludCAzOiAke3MlPz8/fSAuCisJcHJpbnQgNDogJHtzL2I/P2QveH0gLgorCXg9bsO2CisJcHJpbnQgNTogJHt4JT99ICR7eCUlP30gLgorCXg9w6RoCisJcHJpbnQgNjogJHt4Iz99ICR7eCMjP30gLgorCXg9gYIKKwlwcmludCA3OiAke3glP30gJHt4JSU/fSAuCisJeD1tw6SACisJcHJpbnQgODogJHt4JT99ICR7eCUlP30gLgorCXg95L2VCisJcHJpbnQgOTogJHt4JT99ICR7eCUlP30gLgorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6IGJsIC4KKwkyOiB4IC4KKwkzOiBiIC4KKwk0OiB4IC4KKwk1OiBuIG4gLgorCTY6IGggaCAuCisJNzoggSCBIC4KKwk4OiBtw6QgbcOkIC4KKwk5OiAuCistLS0KK25hbWU6IGdsb2ItYmFkLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgZ2xvYmJpbmcgaXNuJ3QgZG9uZSB3aGVuIGdsb2IgaGFzIHN5bnRheCBlcnJvcgorZmlsZS1zZXR1cDogZGlyIDc1NSAiW3giCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiW3gvZm9vIgorc3RkaW46CisJZWNobyBbKgorCWVjaG8gKlt4CisJZWNobyBbeC8qCitleHBlY3RlZC1zdGRvdXQ6CisJWyoKKwkqW3gKKwlbeC9mb28KKy0tLQorbmFtZTogZ2xvYi1iYWQtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBzeW1ib2xpYyBsaW5rcyBhcmVuJ3Qgc3RhdCgpJ2QKK2ZpbGUtc2V0dXA6IGRpciA3NTUgImRpciIKK2ZpbGUtc2V0dXA6IHN5bWxpbmsgNjQ0ICJkaXIvYWJjIgorCW5vbi1leGlzdGVudC1maWxlCitzdGRpbjoKKwllY2hvIGQqLyoKKwllY2hvIGQqL2FiYworZXhwZWN0ZWQtc3Rkb3V0OgorCWRpci9hYmMKKwlkaXIvYWJjCistLS0KK25hbWU6IGdsb2ItcmFuZ2UtMQorZGVzY3JpcHRpb246CisJVGVzdCByYW5nZSBtYXRjaGluZworZmlsZS1zZXR1cDogZmlsZSA2NDQgIi5iYyIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmMiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYmJjIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImNiYyIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICItYmMiCitzdGRpbjoKKwllY2hvIFthYi1dKgorCWVjaG8gWy1hYl0qCisJZWNobyBbIS1hYl0qCisJZWNobyBbIWFiXSoKKwllY2hvIFtdYWJdKgorZXhwZWN0ZWQtc3Rkb3V0OgorCS1iYyBhYmMgYmJjCisJLWJjIGFiYyBiYmMKKwljYmMKKwktYmMgY2JjCisJYWJjIGJiYworLS0tCituYW1lOiBnbG9iLXJhbmdlLTIKK2Rlc2NyaXB0aW9uOgorCVRlc3QgcmFuZ2UgbWF0Y2hpbmcKKwkoQVQmVCBrc2ggZmFpbHMgdGhpczsgUE9TSVggc2F5cyBpbnZhbGlkKQorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYyIKK3N0ZGluOgorCWVjaG8gW2EtLV0qCitleHBlY3RlZC1zdGRvdXQ6CisJW2EtLV0qCistLS0KK25hbWU6IGdsb2ItcmFuZ2UtMworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBnbG9iYmluZyBtYXRjaGVzIHRoZSByaWdodCB0aGluZ3MuLi4KKyMgYnJlYWtzIG9uIE1hYyBPU1ggKEhGUysgbm9uLXN0YW5kYXJkIFVuaWNvZGUgY2Fub25pY2FsIGRlY29tcG9zaXRpb24pCitjYXRlZ29yeTogIW9zOmRhcndpbgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImHCYyIKK3N0ZGluOgorCWVjaG8gYVvBLdpdKgorZXhwZWN0ZWQtc3Rkb3V0OgorCWHCYworLS0tCituYW1lOiBnbG9iLXJhbmdlLTQKK2Rlc2NyaXB0aW9uOgorCVJlc3VsdHMgdW5zcGVjaWZpZWQgYWNjb3JkaW5nIHRvIFBPU0lYCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiLmJjIgorc3RkaW46CisJZWNobyBbYS5dKgorZXhwZWN0ZWQtc3Rkb3V0OgorCVthLl0qCistLS0KK25hbWU6IGdsb2ItcmFuZ2UtNQorZGVzY3JpcHRpb246CisJUmVzdWx0cyB1bnNwZWNpZmllZCBhY2NvcmRpbmcgdG8gUE9TSVgKKwkoQVQmVCBrc2ggdHJlYXRzIHRoaXMgbGlrZSBbYS1jYy1lXSopCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImJiYyIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJjYmMiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiZGJjIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImViYyIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICItYmMiCitzdGRpbjoKKwllY2hvIFthLWMtZV0qCitleHBlY3RlZC1zdGRvdXQ6CisJLWJjIGFiYyBiYmMgY2JjIGViYworLS0tCituYW1lOiBoZXJlZG9jLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIG9yZGVyaW5nL2NvbnRlbnQgb2YgcmVkdW5kZW50IGhlcmUgZG9jdW1lbnRzLgorc3RkaW46CisJY2F0IDw8IEVPRjEgPDwgRU9GMgorCWhpCisJRU9GMQorCXRoZXJlCisJRU9GMgorZXhwZWN0ZWQtc3Rkb3V0OgorCXRoZXJlCistLS0KK25hbWU6IGhlcmVkb2MtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgcXVvdGVkIGhlcmUtZG9jIGlzIHByb3RlY3RlZC4KK3N0ZGluOgorCWE9Zm9vCisJY2F0IDw8ICdFT0YnCisJaGlcCisJdGhlcmUkYQorCXN0dWZmCisJRU9cCisJRgorCUVPRgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpXAorCXRoZXJlJGEKKwlzdHVmZgorCUVPXAorCUYKKy0tLQorbmFtZTogaGVyZWRvYy0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IG5ld2xpbmUgaXNuJ3QgbmVlZGVkIGFmdGVyIGhlcmVkb2MtZGVsaW1pdGVyIG1hcmtlci4KK3N0ZGluOiAhCisJY2F0IDw8IEVPRgorCWhpCisJdGhlcmUKKwlFT0YKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCXRoZXJlCistLS0KK25hbWU6IGhlcmVkb2MtNAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhbiBlcnJvciBvY2N1cnMgaWYgdGhlIGhlcmVkb2MtZGVsaW1pdGVyIGlzIG1pc3NpbmcuCitzdGRpbjogIQorCWNhdCA8PCBFT0YKKwloaQorCXRoZXJlCitleHBlY3RlZC1leGl0OiBlID4gMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uKi8KKy0tLQorbmFtZTogaGVyZWRvYy01CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGJhY2tzbGFzaCBxdW90ZXMgYSAkLCBgIGFuZCBcIGFuZCBraWxscyBhIFxuZXdsaW5lCitzdGRpbjoKKwlhPUJBRAorCWI9b2sKKwljYXQgPDwgRU9GCisJaFwke2F9aQorCWhcXCR7Yn1pCisJdGhcYGVjaG8gbm90LXJ1blxgZXJlCisJdGhcXGBlY2hvIGlzLXJ1bmBlcmUKKwlmb2xcXGtzCisJbW9yZVxcCisJbGFzdCBcCisJbGluZQorCUVPRgorZXhwZWN0ZWQtc3Rkb3V0OgorCWgke2F9aQorCWhcb2tpCisJdGhgZWNobyBub3QtcnVuYGVyZQorCXRoXGlzLXJ1bmVyZQorCWZvbFxrcworCW1vcmVcCisJbGFzdCBsaW5lCistLS0KK25hbWU6IGhlcmVkb2MtNgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpbiBpbml0aWFsIGhlcmUtZGVsaW0gd29yZCBkb2Vzbid0IGltcGx5CisJYSBxdW90ZWQgaGVyZS1kb2MuCitzdGRpbjoKKwlhPWkKKwljYXQgPDwgRU9cCisJRgorCWgkYQorCXRoZXJlCisJRU9GCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwl0aGVyZQorLS0tCituYW1lOiBoZXJlZG9jLTcKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgZG91YmxlIHF1b3RlZCAkIGV4cHJlc3Npb25zIGluIGhlcmUgZGVsaW1pdGVycyBhcmUKKwlub3QgZXhwYW5kZWQgYW5kIG1hdGNoIHRoZSBkZWxpbWl0ZXIuCisJUE9TSVggc2F5cyBvbmx5IHF1b3RlIHJlbW92YWwgaXMgYXBwbGllZCB0byB0aGUgZGVsaW1pdGVyLgorc3RkaW46CisJYT1iCisJY2F0IDw8ICJFJGEiCisJaGkKKwloJGEKKwloYgorCUUkYQorCWVjaG8gZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJaCRhCisJaGIKKwlkb25lCistLS0KK25hbWU6IGhlcmVkb2MtOAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBkb3VibGUgcXVvdGVkIGVzY2FwZWQgJCBleHByZXNzaW9ucyBpbiBoZXJlCisJZGVsaW1pdGVycyBhcmUgbm90IGV4cGFuZGVkIGFuZCBtYXRjaCB0aGUgZGVsaW1pdGVyLgorCVBPU0lYIHNheXMgb25seSBxdW90ZSByZW1vdmFsIGlzIGFwcGxpZWQgdG8gdGhlIGRlbGltaXRlcgorCShcIGNvdW50cyBhcyBhIHF1b3RlKS4KK3N0ZGluOgorCWE9YgorCWNhdCA8PCAiRVwkYSIKKwloaQorCWgkYQorCWhcJGEKKwloYgorCWhcYgorCUUkYQorCWVjaG8gZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJaCRhCisJaFwkYQorCWhiCisJaFxiCisJZG9uZQorLS0tCituYW1lOiBoZXJlZG9jLTlhCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGhlcmUgc3RyaW5ncyB3b3JrLgorc3RkaW46CisJYmFyPSJiYXIKKwkJYmF6IgorCXRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PGZvbworCSIkX19wcm9nbmFtZSIgLWMgInRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PGZvbyIKKwl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwiJGJhciIKKwl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwnJGJhcicKKwl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDxcJGJhcgorCXRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PC1mb28KK2V4cGVjdGVkLXN0ZG91dDoKKwlzYmIKKwlzYmIKKwlvbmUKKwkJb25tCisJJG9uZQorCSRvbmUKKwktc2JiCistLS0KK25hbWU6IGhlcmVkb2MtOWIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYSBjb3JuZXIgY2FzZSBvZiBoZXJlIHN0cmluZ3Mgd29ya3MgbGlrZSBiYXNoCitzdGRpbjoKKwlmbm9yZD00MgorCWJhcj0iYmFyCisJCSBcJGZub3JkIGJheiIKKwl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwkYmFyCitleHBlY3RlZC1zdGRvdXQ6CisJb25lICRzYWJlcSBvbm0KK2NhdGVnb3J5OiBiYXNoCistLS0KK25hbWU6IGhlcmVkb2MtOWMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYSBjb3JuZXIgY2FzZSBvZiBoZXJlIHN0cmluZ3Mgd29ya3MgbGlrZSBrc2g5MywgenNoCitzdGRpbjoKKwlmbm9yZD00MgorCWJhcj0iYmFyCisJCSBcJGZub3JkIGJheiIKKwl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwkYmFyCitleHBlY3RlZC1zdGRvdXQ6CisJb25lCisJCSAkc2FiZXEgb25tCistLS0KK25hbWU6IGhlcmVkb2MtOWQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGFub3RoZXIgY29ybmVyIGNhc2Ugb2YgaGVyZSBzdHJpbmdzCitzdGRpbjoKKwl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwgYmFyCitleHBlY3RlZC1zdGRvdXQ6CisJb25lCistLS0KK25hbWU6IGhlcmVkb2MtcXVvdGluZy11bnN1YnN0CitkZXNjcmlwdGlvbjoKKwlDaGVjayBmb3IgY29ycmVjdCBoYW5kbGluZyBvZiBxdW90ZWQgY2hhcmFjdGVycyBpbgorCWhlcmUgZG9jdW1lbnRzIHdpdGhvdXQgc3Vic3RpdHV0aW9uIChtYXJrZXIgaXMgcXVvdGVkKS4KK3N0ZGluOgorCWZvbz1iYXIKKwljYXQgPDwtJ0VPRicKKwkJeCAiIFwiIFwgXFwgJCBcJCBgZWNobyBiYXpgIFxgZWNobyBiYXpcYCAkZm9vIFwkZm9vIHgKKwlFT0YKK2V4cGVjdGVkLXN0ZG91dDoKKwl4ICIgXCIgXCBcXCAkIFwkIGBlY2hvIGJhemAgXGBlY2hvIGJhelxgICRmb28gXCRmb28geAorLS0tCituYW1lOiBoZXJlZG9jLXF1b3Rpbmctc3Vic3QKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGZvciBjb3JyZWN0IGhhbmRsaW5nIG9mIHF1b3RlZCBjaGFyYWN0ZXJzIGluCisJaGVyZSBkb2N1bWVudHMgd2l0aCBzdWJzdGl0dXRpb24gKG1hcmtlciBpcyBub3QgcXVvdGVkKS4KK3N0ZGluOgorCWZvbz1iYXIKKwljYXQgPDwtRU9GCisJCXggIiBcIiBcIFxcICQgXCQgYGVjaG8gYmF6YCBcYGVjaG8gYmF6XGAgJGZvbyBcJGZvbyB4CisJRU9GCitleHBlY3RlZC1zdGRvdXQ6CisJeCAiIFwiIFwgXCAkICQgYmF6IGBlY2hvIGJhemAgYmFyICRmb28geAorLS0tCituYW1lOiBoZXJlZG9jLXRtcGZpbGUtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCisJSGVyZWRvYyBpbiBzaW1wbGUgY29tbWFuZC4KK3N0ZGluOgorCVRNUERJUj0kUFdECisJZXZhbCAnCisJCWNhdCA8PC0gRU9GCisJCWhpCisJCUVPRgorCQlmb3IgaSBpbiBhIGIgOyBkbworCQkJY2F0IDw8LSBFT0YKKwkJCW1vcmUKKwkJCUVPRgorCQlkb25lCisJICAgICcgJgorCXNsZWVwIDEKKwllY2hvIExlZnQgb3ZlcnM6ICoKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCW1vcmUKKwltb3JlCisJTGVmdCBvdmVyczogKgorLS0tCituYW1lOiBoZXJlZG9jLXRtcGZpbGUtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCisJSGVyZWRvYyBpbiBmdW5jdGlvbiwgbXVsdGlwbGUgY2FsbHMgdG8gZnVuY3Rpb24uCitzdGRpbjoKKwlUTVBESVI9JFBXRAorCWV2YWwgJworCQlmb28oKSB7CisJCQljYXQgPDwtIEVPRgorCQkJaGkKKwkJCUVPRgorCQl9CisJCWZvbworCQlmb28KKwkgICAgJyAmCisJc2xlZXAgMQorCWVjaG8gTGVmdCBvdmVyczogKgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJaGkKKwlMZWZ0IG92ZXJzOiAqCistLS0KK25hbWU6IGhlcmVkb2MtdG1wZmlsZS0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28gbGF0ZS4KKwlIZXJlZG9jIGluIGZ1bmN0aW9uIGluIGxvb3AsIG11bHRpcGxlIGNhbGxzIHRvIGZ1bmN0aW9uLgorc3RkaW46CisJVE1QRElSPSRQV0QKKwlldmFsICcKKwkJZm9vKCkgeworCQkJY2F0IDw8LSBFT0YKKwkJCWhpCisJCQlFT0YKKwkJfQorCQlmb3IgaSBpbiBhIGI7IGRvCisJCQlmb28KKwkJCWZvbygpIHsKKwkJCQljYXQgPDwtIEVPRgorCQkJCWZvbGtzICRpCisJCQkJRU9GCisJCQl9CisJCWRvbmUKKwkJZm9vCisJICAgICcgJgorCXNsZWVwIDEKKwllY2hvIExlZnQgb3ZlcnM6ICoKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCWZvbGtzIGIKKwlmb2xrcyBiCisJTGVmdCBvdmVyczogKgorLS0tCituYW1lOiBoZXJlZG9jLXRtcGZpbGUtNAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCisJQmFja2dyb3VuZGVkIHNpbXBsZSBjb21tYW5kIHdpdGggaGVyZSBkb2MKK3N0ZGluOgorCVRNUERJUj0kUFdECisJZXZhbCAnCisJCWNhdCA8PC0gRU9GICYKKwkJaGkKKwkJRU9GCisJICAgICcgJgorCXNsZWVwIDEKKwllY2hvIExlZnQgb3ZlcnM6ICoKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCUxlZnQgb3ZlcnM6ICoKKy0tLQorbmFtZTogaGVyZWRvYy10bXBmaWxlLTUKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgorCUJhY2tncm91bmRlZCBzdWJzaGVsbCBjb21tYW5kIHdpdGggaGVyZSBkb2MKK3N0ZGluOgorCVRNUERJUj0kUFdECisJZXZhbCAnCisJICAgICAgKAorCQlzbGVlcCAxCSMgc28gcGFyZW50IGV4aXRzCisJCWVjaG8gQQorCQljYXQgPDwtIEVPRgorCQloaQorCQlFT0YKKwkJZWNobyBCCisJICAgICAgKSAmCisJICAgICcgJgorCXNsZWVwIDIKKwllY2hvIExlZnQgb3ZlcnM6ICoKK2V4cGVjdGVkLXN0ZG91dDoKKwlBCisJaGkKKwlCCisJTGVmdCBvdmVyczogKgorLS0tCituYW1lOiBoZXJlZG9jLXRtcGZpbGUtNgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCisJSGVyZWRvYyBpbiBwaXBlbGluZS4KK3N0ZGluOgorCVRNUERJUj0kUFdECisJZXZhbCAnCisJCWNhdCA8PC0gRU9GIHwgc2VkICJzL2hpL0hJLyIKKwkJaGkKKwkJRU9GCisJICAgICcgJgorCXNsZWVwIDEKKwllY2hvIExlZnQgb3ZlcnM6ICoKK2V4cGVjdGVkLXN0ZG91dDoKKwlISQorCUxlZnQgb3ZlcnM6ICoKKy0tLQorbmFtZTogaGVyZWRvYy10bXBmaWxlLTcKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgorCUhlcmVkb2MgaW4gYmFja2dyb3VuZGVkIHBpcGVsaW5lLgorc3RkaW46CisJVE1QRElSPSRQV0QKKwlldmFsICcKKwkJY2F0IDw8LSBFT0YgfCBzZWQgJ3MvaGkvSEkvJyAmCisJCWhpCisJCUVPRgorCSAgICAnICYKKwlzbGVlcCAxCisJZWNobyBMZWZ0IG92ZXJzOiAqCitleHBlY3RlZC1zdGRvdXQ6CisJSEkKKwlMZWZ0IG92ZXJzOiAqCistLS0KK25hbWU6IGhlcmVkb2MtdG1wZmlsZS04CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28KKwlsYXRlLiBIZXJlZG9jIGluIGZ1bmN0aW9uLCBiYWNrZ3JvdW5kZWQgY2FsbCB0byBmdW5jdGlvbi4KKwlUaGlzIGNoZWNrIGNhbiBmYWlsIG9uIHNsb3cgbWFjaGluZXMgKDwxMDAgTUh6KSwgb3IgQ3lnd2luLAorCXRoYXQncyBub3JtYWwuCitzdGRpbjoKKwlUTVBESVI9JFBXRAorCSMgQmFja2dyb3VuZCBldmFsIHNvIG1haW4gc2hlbGwgZG9lc24ndCBkbyBwYXJzaW5nCisJZXZhbCAnCisJCWZvbygpIHsKKwkJCWNhdCA8PC0gRU9GCisJCQloaQorCQkJRU9GCisJCX0KKwkJZm9vCisJCSMgc2xlZXAgc28gZXZhbCBjYW4gZGllCisJCShzbGVlcCAxOyBmb28pICYKKwkJKHNsZWVwIDE7IGZvbykgJgorCQlmb28KKwkgICAgJyAmCisJc2xlZXAgMgorCWVjaG8gTGVmdCBvdmVyczogKgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJaGkKKwloaQorCWhpCisJTGVmdCBvdmVyczogKgorLS0tCituYW1lOiBoaXN0b3J5LWJhc2ljCitkZXNjcmlwdGlvbjoKKwlTZWUgaWYgd2UgY2FuIHRlc3QgaGlzdG9yeSBhdCBhbGwKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gaGkKKwlmYyAtbAorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJMQllY2hvIGhpCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1kdXBzCitkZXNjcmlwdGlvbjoKKwlWZXJpZnkgZHVwbGljYXRlcyBhbmQgc3BhY2VzIGFyZSBub3QgZW50ZXJlZAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBoaQorCSBlY2hvIHlvCisJZWNobyBoaQorCWZjIC1sCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwl5bworCWhpCisJMQllY2hvIGhpCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS11bmxpbmsKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGJyb2tlbiBISVNURklMRXMgZG8gbm90IGNhdXNlIHRyb3VibGUKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWZvby9oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitmaWxlLXNldHVwOiBkaXIgNzU1ICJmb28iCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiZm9vL2hpc3QuZmlsZSIKKwlzb21ldGV4dAordGltZS1saW1pdDogNQorcGVybC1zZXR1cDogY2htb2QoMDU1NSwgImZvbyIpOworc3RkaW46CisJZWNobyBoaQorCWZjIC1sCisJY2htb2QgMDc1NSBmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCTEJZWNobyBoaQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLyguKmNhbm5vdCB1bmxpbmsgSElTVEZJTEUuKlxuKT9YKiQvCistLS0KK25hbWU6IGhpc3RvcnktZS1taW51cy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBtb3JlIHJlY2VudCBjb21tYW5kIGlzIGV4ZWN1dGVkCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGhpCisJZWNobyB0aGVyZQorCWZjIC1lIC0KK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCXRoZXJlCisJdGhlcmUKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCplY2hvIHRoZXJlXG5YKiQvCistLS0KK25hbWU6IGhpc3RvcnktZS1taW51cy0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHJlcGVhdGVkIGNvbW1hbmQgaXMgcHJpbnRlZCBiZWZvcmUgY29tbWFuZAorCWlzIHJlLWV4ZWN1dGVkLgorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZXhlYyAyPiYxCisJZWNobyBoaQorCWVjaG8gdGhlcmUKKwlmYyAtZSAtCitleHBlY3RlZC1zdGRvdXQtcGF0dGVybjoKKwkvWCpoaVxuWCp0aGVyZVxuWCplY2hvIHRoZXJlXG50aGVyZVxuWCovCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1lLW1pbnVzLTMKK2Rlc2NyaXB0aW9uOgorCWZjIC1lIC0gZmFpbHMgd2hlbiB0aGVyZSBpcyBubyBoaXN0b3J5CisJKGtzaDkzIGhhcyBhIGJ1ZyB0aGF0IGNhdXNlcyB0aGlzIHRvIGZhaWwpCisJKGtzaDg4IGxvb3BzIG9uIHRoaXMpCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwlmYyAtZSAtCisJZWNobyBvaworZXhwZWN0ZWQtc3Rkb3V0OgorCW9rCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqLio6LipoaXN0b3J5LipcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1lLW1pbnVzLTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmICJmYyAtZSAtIiBjb21tYW5kIG91dHB1dCBnb2VzIHRvIHN0ZG91dC4KK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gYWJjCisJZmMgLWUgLSB8IChyZWFkIHg7IGVjaG8gIkEgJHgiKQorCWVjaG8gb2sKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmMKKwlBIGFiYworCW9rCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqZWNobyBhYmNcblgqLworLS0tCituYW1lOiBoaXN0b3J5LWUtbWludXMtNQorZGVzY3JpcHRpb246CisJZmMgaXMgcmVwbGFjZWQgaW4gaGlzdG9yeSBieSBuZXcgY29tbWFuZC4KK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gYWJjIGRlZgorCWVjaG8gZ2hpIGprbAorCToKKwlmYyAtZSAtIGVjaG8KKwlmYyAtbCAyIDUKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmMgZGVmCisJZ2hpIGprbAorCWdoaSBqa2wKKwkyCWVjaG8gZ2hpIGprbAorCTMJOgorCTQJZWNobyBnaGkgamtsCisJNQlmYyAtbCAyIDUKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCplY2hvIGdoaSBqa2xcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1saXN0LTEKK2Rlc2NyaXB0aW9uOgorCUxpc3QgbGlzdHMgY29ycmVjdCByYW5nZQorCShrc2g4OCBmYWlscyAnY2F1c2UgaXQgbGlzdHMgdGhlIGZjIGNvbW1hbmQpCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyCisJZWNobyBsaW5lIDMKKwlmYyAtbCAtLSAtMgorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMgorCWxpbmUgMworCTIJZWNobyBsaW5lIDIKKwkzCWVjaG8gbGluZSAzCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1saXN0LTIKK2Rlc2NyaXB0aW9uOgorCUxpc3RzIG9sZGVzdCBoaXN0b3J5IGlmIGdpdmVuIHByZS1oaXN0b3JpYyBudW1iZXIKKwkoa3NoOTMgaGFzIGEgYnVnIHRoYXQgY2F1c2VzIHRoaXMgdG8gZmFpbCkKKwkoa3NoODggZmFpbHMgJ2NhdXNlIGl0IGxpc3RzIHRoZSBmYyBjb21tYW5kKQorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMgorCWVjaG8gbGluZSAzCisJZmMgLWwgLS0gLTQwCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyCisJbGluZSAzCisJMQllY2hvIGxpbmUgMQorCTIJZWNobyBsaW5lIDIKKwkzCWVjaG8gbGluZSAzCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1saXN0LTMKK2Rlc2NyaXB0aW9uOgorCUNhbiBnaXZlIG51bWJlciAnb3B0aW9ucycgdG8gZmMKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIKKwllY2hvIGxpbmUgMworCWVjaG8gbGluZSA0CisJZmMgLWwgLTMgLTIKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIKKwlsaW5lIDMKKwlsaW5lIDQKKwkyCWVjaG8gbGluZSAyCisJMwllY2hvIGxpbmUgMworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktbGlzdC00CitkZXNjcmlwdGlvbjoKKwktMSByZWZlcnMgdG8gcHJldmlvdXMgY29tbWFuZAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMgorCWVjaG8gbGluZSAzCisJZWNobyBsaW5lIDQKKwlmYyAtbCAtMSAtMQorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMgorCWxpbmUgMworCWxpbmUgNAorCTQJZWNobyBsaW5lIDQKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LWxpc3QtNQorZGVzY3JpcHRpb246CisJTGlzdCBjb21tYW5kIHN0YXlzIGluIGhpc3RvcnkKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIKKwllY2hvIGxpbmUgMworCWVjaG8gbGluZSA0CisJZmMgLWwgLTEgLTEKKwlmYyAtbCAtMiAtMQorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMgorCWxpbmUgMworCWxpbmUgNAorCTQJZWNobyBsaW5lIDQKKwk0CWVjaG8gbGluZSA0CisJNQlmYyAtbCAtMSAtMQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktbGlzdC02CitkZXNjcmlwdGlvbjoKKwlISVNUU0laRSBsaW1pdHMgYWJvdXQgb2YgaGlzdG9yeSBrZXB0LgorCShrc2g4OCBmYWlscyAnY2F1c2UgaXQgbGlzdHMgdGhlIGZjIGNvbW1hbmQpCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhSElTVFNJWkU9MyEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIKKwllY2hvIGxpbmUgMworCWVjaG8gbGluZSA0CisJZWNobyBsaW5lIDUKKwlmYyAtbAorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMgorCWxpbmUgMworCWxpbmUgNAorCWxpbmUgNQorCTQJZWNobyBsaW5lIDQKKwk1CWVjaG8gbGluZSA1CitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1saXN0LTcKK2Rlc2NyaXB0aW9uOgorCWZjIGFsbG93cyB0b28gb2xkL25ldyBlcnJvcnMgaW4gcmFuZ2Ugc3BlY2lmaWNhdGlvbgorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIUhJU1RTSVpFPTMhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyCisJZWNobyBsaW5lIDMKKwllY2hvIGxpbmUgNAorCWVjaG8gbGluZSA1CisJZmMgLWwgMSAzMAorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMgorCWxpbmUgMworCWxpbmUgNAorCWxpbmUgNQorCTQJZWNobyBsaW5lIDQKKwk1CWVjaG8gbGluZSA1CisJNglmYyAtbCAxIDMwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1saXN0LXItMQorZGVzY3JpcHRpb246CisJdGVzdCAtciBmbGFnIGluIGhpc3RvcnkKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIKKwllY2hvIGxpbmUgMworCWVjaG8gbGluZSA0CisJZWNobyBsaW5lIDUKKwlmYyAtbCAtciAyIDQKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIKKwlsaW5lIDMKKwlsaW5lIDQKKwlsaW5lIDUKKwk0CWVjaG8gbGluZSA0CisJMwllY2hvIGxpbmUgMworCTIJZWNobyBsaW5lIDIKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LWxpc3Qtci0yCitkZXNjcmlwdGlvbjoKKwlJZiBmaXJzdCBpcyBuZXdlciB0aGFuIGxhc3QsIC1yIGlzIGltcGxpZWQuCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyCisJZWNobyBsaW5lIDMKKwllY2hvIGxpbmUgNAorCWVjaG8gbGluZSA1CisJZmMgLWwgNCAyCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyCisJbGluZSAzCisJbGluZSA0CisJbGluZSA1CisJNAllY2hvIGxpbmUgNAorCTMJZWNobyBsaW5lIDMKKwkyCWVjaG8gbGluZSAyCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1saXN0LXItMworZGVzY3JpcHRpb246CisJSWYgZmlyc3QgaXMgbmV3ZXIgdGhhbiBsYXN0LCAtciBpcyBjYW5jZWxsZWQuCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyCisJZWNobyBsaW5lIDMKKwllY2hvIGxpbmUgNAorCWVjaG8gbGluZSA1CisJZmMgLWwgLXIgNCAyCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyCisJbGluZSAzCisJbGluZSA0CisJbGluZSA1CisJMgllY2hvIGxpbmUgMgorCTMJZWNobyBsaW5lIDMKKwk0CWVjaG8gbGluZSA0CitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1zdWJzdC0xCitkZXNjcmlwdGlvbjoKKwlCYXNpYyBzdWJzdGl0dXRpb24KK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gYWJjIGRlZgorCWVjaG8gZ2hpIGprbAorCWZjIC1lIC0gYWJjPUFCICdlY2hvIGEnCitleHBlY3RlZC1zdGRvdXQ6CisJYWJjIGRlZgorCWdoaSBqa2wKKwlBQiBkZWYKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCplY2hvIEFCIGRlZlxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LXN1YnN0LTIKK2Rlc2NyaXB0aW9uOgorCURvZXMgc3Vic3QgZmluZCBwcmV2aW91cyBjb21tYW5kPworYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBhYmMgZGVmCisJZWNobyBnaGkgamtsCisJZmMgLWUgLSBqa2w9WFlaUVJUICdlY2hvIGcnCitleHBlY3RlZC1zdGRvdXQ6CisJYWJjIGRlZgorCWdoaSBqa2wKKwlnaGkgWFlaUVJUCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqZWNobyBnaGkgWFlaUVJUXG5YKiQvCistLS0KK25hbWU6IGhpc3Rvcnktc3Vic3QtMworZGVzY3JpcHRpb246CisJRG9lcyBzdWJzdCBmaW5kIHByZXZpb3VzIGNvbW1hbmQgd2hlbiBubyBhcmd1bWVudHMgZ2l2ZW4KK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gYWJjIGRlZgorCWVjaG8gZ2hpIGprbAorCWZjIC1lIC0gamtsPVhZWlFSVAorZXhwZWN0ZWQtc3Rkb3V0OgorCWFiYyBkZWYKKwlnaGkgamtsCisJZ2hpIFhZWlFSVAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKmVjaG8gZ2hpIFhZWlFSVFxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LXN1YnN0LTQKK2Rlc2NyaXB0aW9uOgorCUdsb2JhbCBzdWJzdGl0dXRpb25zIHdvcmsKKwkoa3NoODggYW5kIGtzaDkzIGRvIG5vdCBoYXZlIC1nIG9wdGlvbikKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gYWJjIGRlZiBhc2pqIHNhZGpoYXNkamggYXNkamhhc2QKKwlmYyAtZSAtIC1nIGE9Rm9vQkFSCitleHBlY3RlZC1zdGRvdXQ6CisJYWJjIGRlZiBhc2pqIHNhZGpoYXNkamggYXNkamhhc2QKKwlGb29CQVJiYyBkZWYgRm9vQkFSc2pqIHNGb29CQVJkamhGb29CQVJzZGpoIEZvb0JBUnNkamhGb29CQVJzZAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKmVjaG8gRm9vQkFSYmMgZGVmIEZvb0JBUnNqaiBzRm9vQkFSZGpoRm9vQkFSc2RqaCBGb29CQVJzZGpoRm9vQkFSc2RcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1zdWJzdC01CitkZXNjcmlwdGlvbjoKKwlNYWtlIHN1cmUgc2VhcmNoZXMgZG9uJ3QgZmluZCBjdXJyZW50IChmYykgY29tbWFuZAorCShrc2g4OC9rc2g5MyBkb24ndCBoYXZlIHRoZSA/IHByZWZpeCB0aGluZyBzbyB0aGV5IGZhaWwgdGhpcyB0ZXN0KQorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBhYmMgZGVmCisJZWNobyBnaGkgamtsCisJZmMgLWUgLSBhYmM9QUIgXD9hYmMKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmMgZGVmCisJZ2hpIGprbAorCUFCIGRlZgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKmVjaG8gQUIgZGVmXG5YKiQvCistLS0KK25hbWU6IGhpc3RvcnktZWQtMS1vbGQKK2Rlc2NyaXB0aW9uOgorCUJhc2ljIChlZCkgZWRpdGluZyB3b3JrcyAoYXNzdW1lcyB5b3UgaGF2ZSBnZW5lcmljIGVkIGVkaXRvcgorCXRoYXQgcHJpbnRzIG5vIHByb21wdHMpLiBUaGlzIGlzIGZvciBvbGRpc2ggZWQoMSkgd2hpY2ggd3JpdGUKKwl0aGUgY2hhcmFjdGVyIGNvdW50IHRvIHN0ZG91dC4KK2NhdGVnb3J5OiBzdGRvdXQtZWQKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gYWJjIGRlZgorCWZjIGVjaG8KKwlzL2FiYy9GT09CQVIvCisJdworCXEKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmMgZGVmCisJMTMKKwkxNgorCUZPT0JBUiBkZWYKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCplY2hvIEZPT0JBUiBkZWZcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1lZC0yLW9sZAorZGVzY3JpcHRpb246CisJQ29ycmVjdCBjb21tYW5kIGlzIGVkaXRlZCB3aGVuIG51bWJlciBnaXZlbgorY2F0ZWdvcnk6IHN0ZG91dC1lZAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMiBpcyBoZXJlCisJZWNobyBsaW5lIDMKKwllY2hvIGxpbmUgNAorCWZjIDIKKwlzL2lzIGhlcmUvaXMgY2hhbmdlZC8KKwl3CisJcQorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMiBpcyBoZXJlCisJbGluZSAzCisJbGluZSA0CisJMjAKKwkyMworCWxpbmUgMiBpcyBjaGFuZ2VkCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqZWNobyBsaW5lIDIgaXMgY2hhbmdlZFxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LWVkLTMtb2xkCitkZXNjcmlwdGlvbjoKKwlOZXdseSBjcmVhdGVkIG11bHRpIGxpbmUgY29tbWFuZHMgc2hvdyB1cCBhcyBzaW5nbGUgY29tbWFuZAorCWluIGhpc3RvcnkuCisJKE5PVEU6IGFkanVzdGVkIGZvciBDT01QTEVYIEhJU1RPUlkgY29tcGlsZSB0aW1lIG9wdGlvbikKKwkoa3NoODggZmFpbHMgJ2NhdXNlIGl0IGxpc3RzIHRoZSBmYyBjb21tYW5kKQorY2F0ZWdvcnk6IHN0ZG91dC1lZAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBhYmMgZGVmCisJZmMgZWNobworCXMvYWJjL0ZPT0JBUi8KKwkkYQorCWVjaG8gYSBuZXcgbGluZQorCS4KKwl3CisJcQorCWZjIC1sCitleHBlY3RlZC1zdGRvdXQ6CisJYWJjIGRlZgorCTEzCisJMzIKKwlGT09CQVIgZGVmCisJYSBuZXcgbGluZQorCTEJZWNobyBhYmMgZGVmCisJMgllY2hvIEZPT0JBUiBkZWYKKwkzCWVjaG8gYSBuZXcgbGluZQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKmVjaG8gRk9PQkFSIGRlZlxuZWNobyBhIG5ldyBsaW5lXG5YKiQvCistLS0KK25hbWU6IGhpc3RvcnktZWQtMQorZGVzY3JpcHRpb246CisJQmFzaWMgKGVkKSBlZGl0aW5nIHdvcmtzIChhc3N1bWVzIHlvdSBoYXZlIGdlbmVyaWMgZWQgZWRpdG9yCisJdGhhdCBwcmludHMgbm8gcHJvbXB0cykuIFRoaXMgaXMgZm9yIG5ld2lzaCBlZCgxKSBhbmQgc3RkZXJyLgorY2F0ZWdvcnk6ICFuby1zdGRlcnItZWQKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gYWJjIGRlZgorCWZjIGVjaG8KKwlzL2FiYy9GT09CQVIvCisJdworCXEKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmMgZGVmCisJRk9PQkFSIGRlZgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKjEzXG4xNlxuZWNobyBGT09CQVIgZGVmXG5YKiQvCistLS0KK25hbWU6IGhpc3RvcnktZWQtMgorZGVzY3JpcHRpb246CisJQ29ycmVjdCBjb21tYW5kIGlzIGVkaXRlZCB3aGVuIG51bWJlciBnaXZlbgorY2F0ZWdvcnk6ICFuby1zdGRlcnItZWQKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIgaXMgaGVyZQorCWVjaG8gbGluZSAzCisJZWNobyBsaW5lIDQKKwlmYyAyCisJcy9pcyBoZXJlL2lzIGNoYW5nZWQvCisJdworCXEKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIgaXMgaGVyZQorCWxpbmUgMworCWxpbmUgNAorCWxpbmUgMiBpcyBjaGFuZ2VkCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqMjBcbjIzXG5lY2hvIGxpbmUgMiBpcyBjaGFuZ2VkXG5YKiQvCistLS0KK25hbWU6IGhpc3RvcnktZWQtMworZGVzY3JpcHRpb246CisJTmV3bHkgY3JlYXRlZCBtdWx0aSBsaW5lIGNvbW1hbmRzIHNob3cgdXAgYXMgc2luZ2xlIGNvbW1hbmQKKwlpbiBoaXN0b3J5LgorY2F0ZWdvcnk6ICFuby1zdGRlcnItZWQKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gYWJjIGRlZgorCWZjIGVjaG8KKwlzL2FiYy9GT09CQVIvCisJJGEKKwllY2hvIGEgbmV3IGxpbmUKKwkuCisJdworCXEKKwlmYyAtbAorZXhwZWN0ZWQtc3Rkb3V0OgorCWFiYyBkZWYKKwlGT09CQVIgZGVmCisJYSBuZXcgbGluZQorCTEJZWNobyBhYmMgZGVmCisJMgllY2hvIEZPT0JBUiBkZWYKKwkzCWVjaG8gYSBuZXcgbGluZQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKjEzXG4zMlxuZWNobyBGT09CQVIgZGVmXG5lY2hvIGEgbmV3IGxpbmVcblgqJC8KKy0tLQorbmFtZTogSUZTLXNwYWNlLTEKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSB0ZXN0LCBkZWZhdWx0IElGUworc3RkaW46CisJc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KKwlzZXQgLS0gQSBCIEMKKwlzaG93YXJncyAxICQqCisJc2hvd2FyZ3MgMiAiJCoiCisJc2hvd2FyZ3MgMyAkQAorCXNob3dhcmdzIDQgIiRAIgorZXhwZWN0ZWQtc3Rkb3V0OgorCSA8MT4gPEE+IDxCPiA8Qz4KKwkgPDI+IDxBIEIgQz4KKwkgPDM+IDxBPiA8Qj4gPEM+CisJIDw0PiA8QT4gPEI+IDxDPgorLS0tCituYW1lOiBJRlMtY29sb24tMQorZGVzY3JpcHRpb246CisJU2ltcGxlIHRlc3QsIElGUz06CitzdGRpbjoKKwlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQorCUlGUz06CisJc2V0IC0tIEEgQiBDCisJc2hvd2FyZ3MgMSAkKgorCXNob3dhcmdzIDIgIiQqIgorCXNob3dhcmdzIDMgJEAKKwlzaG93YXJncyA0ICIkQCIKK2V4cGVjdGVkLXN0ZG91dDoKKwkgPDE+IDxBPiA8Qj4gPEM+CisJIDwyPiA8QTpCOkM+CisJIDwzPiA8QT4gPEI+IDxDPgorCSA8ND4gPEE+IDxCPiA8Qz4KKy0tLQorbmFtZTogSUZTLW51bGwtMQorZGVzY3JpcHRpb246CisJU2ltcGxlIHRlc3QsIElGUz0iIgorc3RkaW46CisJc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KKwlJRlM9IiIKKwlzZXQgLS0gQSBCIEMKKwlzaG93YXJncyAxICQqCisJc2hvd2FyZ3MgMiAiJCoiCisJc2hvd2FyZ3MgMyAkQAorCXNob3dhcmdzIDQgIiRAIgorZXhwZWN0ZWQtc3Rkb3V0OgorCSA8MT4gPEEgQiBDPgorCSA8Mj4gPEFCQz4KKwkgPDM+IDxBIEIgQz4KKwkgPDQ+IDxBIEIgQz4KKy0tLQorbmFtZTogSUZTLXNwYWNlLWNvbG9uLTEKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSB0ZXN0LCBJRlM9PHdoaXRlLXNwYWNlPjoKK3N0ZGluOgorCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9CisJSUZTPSIkSUZTOiIKKwlzZXQgLS0KKwlzaG93YXJncyAxICQqCisJc2hvd2FyZ3MgMiAiJCoiCisJc2hvd2FyZ3MgMyAkQAorCXNob3dhcmdzIDQgIiRAIgorCXNob3dhcmdzIDUgOiAiJEAiCitleHBlY3RlZC1zdGRvdXQ6CisJIDwxPgorCSA8Mj4gPD4KKwkgPDM+CisJIDw0PgorCSA8NT4gPDo+CistLS0KK25hbWU6IElGUy1zcGFjZS1jb2xvbi0yCitkZXNjcmlwdGlvbjoKKwlTaW1wbGUgdGVzdCwgSUZTPTx3aGl0ZS1zcGFjZT46CisJQVQmVCBrc2ggZmFpbHMgdGhpcywgUE9TSVggc2F5cyB0aGUgdGVzdCBpcyBjb3JyZWN0Lgorc3RkaW46CisJc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KKwlJRlM9IiRJRlM6IgorCXNldCAtLQorCXNob3dhcmdzIDoiJEAiCitleHBlY3RlZC1zdGRvdXQ6CisJIDw6PgorLS0tCituYW1lOiBJRlMtc3BhY2UtY29sb24tMworZGVzY3JpcHRpb246CisJU2ltcGxlIHRlc3QsIElGUz08d2hpdGUtc3BhY2U+OgorCXBka3NoIGZhaWxzIGJvdGggb2YgdGhlc2UgdGVzdHMKKwlub3Qgc3VyZSB3aGV0aGVyICMyIGlzIGNvcnJlY3QKK3N0ZGluOgorCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9CisJSUZTPSIkSUZTOiIKKwl4PQorCXNldCAtLQorCXNob3dhcmdzICIkeCRAIiAxCisJc2hvd2FyZ3MgIiRAJHgiIDIKK2V4cGVjdGVkLWZhaWw6IHllcworZXhwZWN0ZWQtc3Rkb3V0OgorCSA8PiA8MT4KKwkgPD4gPDI+CistLS0KK25hbWU6IElGUy1zcGFjZS1jb2xvbi00CitkZXNjcmlwdGlvbjoKKwlTaW1wbGUgdGVzdCwgSUZTPTx3aGl0ZS1zcGFjZT46CitzdGRpbjoKKwlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQorCUlGUz0iJElGUzoiCisJc2V0IC0tCisJc2hvd2FyZ3MgIiRAJEAiCitleHBlY3RlZC1zdGRvdXQ6CisJCistLS0KK25hbWU6IElGUy1zcGFjZS1jb2xvbi01CitkZXNjcmlwdGlvbjoKKwlTaW1wbGUgdGVzdCwgSUZTPTx3aGl0ZS1zcGFjZT46CisJRG9uJ3Qga25vdyB3aGF0IFBPU0lYIHRoaW5rcyBvZiB0aGlzLiAgQVQmVCBrc2ggZG9lcyBub3QgZG8gdGhpcy4KK3N0ZGluOgorCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9CisJSUZTPSIkSUZTOiIKKwlzZXQgLS0KKwlzaG93YXJncyAiJHtAOi19IgorZXhwZWN0ZWQtc3Rkb3V0OgorCSA8PgorLS0tCituYW1lOiBJRlMtc3Vic3QtMQorZGVzY3JpcHRpb246CisJU2ltcGxlIHRlc3QsIElGUz08d2hpdGUtc3BhY2U+Ogorc3RkaW46CisJc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KKwlJRlM9IiRJRlM6IgorCXg9IjpiOiA6IgorCWVjaG8gLW4gJzE6JzsgZm9yIGkgaW4gJHggOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobworCWVjaG8gLW4gJzI6JzsgZm9yIGkgaW4gOmI6OiA7IGRvIGVjaG8gLW4gIiBbJGldIiA7IGRvbmUgOyBlY2hvCisJc2hvd2FyZ3MgMyAkeAorCXNob3dhcmdzIDQgOmI6OgorCXg9ImE6YjoiCisJZWNobyAtbiAnNTonOyBmb3IgaSBpbiAkeCA7IGRvIGVjaG8gLW4gIiBbJGldIiA7IGRvbmUgOyBlY2hvCisJc2hvd2FyZ3MgNiAkeAorCXg9ImE6OmMiCisJZWNobyAtbiAnNzonOyBmb3IgaSBpbiAkeCA7IGRvIGVjaG8gLW4gIiBbJGldIiA7IGRvbmUgOyBlY2hvCisJc2hvd2FyZ3MgOCAkeAorCWVjaG8gLW4gJzk6JzsgZm9yIGkgaW4gJHtGT08tYGVjaG8gLW4gaDppYHRoOmVyZX0gOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobworCXNob3dhcmdzIDEwICR7Rk9PLWBlY2hvIC1uIGg6aWB0aDplcmV9CisJc2hvd2FyZ3MgMTEgIiR7Rk9PLWBlY2hvIC1uIGg6aWB0aDplcmV9IgorCXg9IiBBIDogIEI6OkQiCisJZWNobyAtbiAnMTI6JzsgZm9yIGkgaW4gJHggOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobworCXNob3dhcmdzIDEzICR4CitleHBlY3RlZC1zdGRvdXQ6CisJMTogW10gW2JdIFtdCisJMjogWzpiOjpdCisJIDwzPiA8PiA8Yj4gPD4KKwkgPDQ+IDw6Yjo6PgorCTU6IFthXSBbYl0KKwkgPDY+IDxhPiA8Yj4KKwk3OiBbYV0gW10gW2NdCisJIDw4PiA8YT4gPD4gPGM+CisJOTogW2hdIFtpdGhdIFtlcmVdCisJIDwxMD4gPGg+IDxpdGg+IDxlcmU+CisJIDwxMT4gPGg6aXRoOmVyZT4KKwkxMjogW0FdIFtCXSBbXSBbRF0KKwkgPDEzPiA8QT4gPEI+IDw+IDxEPgorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2UtZXJyLTEKK2Rlc2NyaXB0aW9uOgorCUNhbid0IGhhdmUgMCBiYXNlIChjYXVzZXMgc2hlbGwgdG8gZXhpdCkKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorc3RkaW46CisJdHlwZXNldCAtaSBpCisJaT0zCisJaT0wIzQKKwllY2hvICRpCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXi4qOi4qMCM0LipcbiQvCistLS0KK25hbWU6IGludGVnZXItYmFzZS1lcnItMgorZGVzY3JpcHRpb246CisJQ2FuJ3QgaGF2ZSBtdWx0aXBsZSBiYXNlcyBpbiBhICdjb25zdGFudCcgKGNhdXNlcyBzaGVsbCB0byBleGl0KQorCShrc2g4OCBmYWlscyB0aGlzIHRlc3QpCitleHBlY3RlZC1leGl0OiBlICE9IDAKK3N0ZGluOgorCXR5cGVzZXQgLWkgaQorCWk9MworCWk9MiMxMTAjMTEKKwllY2hvICRpCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXi4qOi4qMiMxMTAjMTEuKlxuJC8KKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLWVyci0zCitkZXNjcmlwdGlvbjoKKwlTeW50YXggZXJyb3JzIGluIGV4cHJlc3Npb25zIGFuZCBlZmZlY3RzIG9uIGJhc2VzCisJKGludGVyYWN0aXZlIHNvIGVycm9ycyBkb24ndCBjYXVzZSBleGl0cykKKwkoa3NoODggZmFpbHMgdGhpcyB0ZXN0IC0gc2hlbGwgZXhpdHMsIGV2ZW4gd2l0aCAtaSkKK2FyZ3VtZW50czogIS1pIQorc3RkaW46CisJUFMxPSAjIG1pbmltaXNlIHByb21wdCBoYXNzbGVzCisJdHlwZXNldCAtaTQgYT0xMAorCXR5cGVzZXQgLWkgYT0yKworCWVjaG8gJGEKKwl0eXBlc2V0IC1pNCBhPTEwCisJdHlwZXNldCAtaTIgYT0yKworCWVjaG8gJGEKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eKFsjXCRdICk/Lio6LioyKy4qXG4uKjouKjIrLipcbiQvCitleHBlY3RlZC1zdGRvdXQ6CisJNCMyMgorCTQjMjIKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLWVyci00CitkZXNjcmlwdGlvbjoKKwlBcmUgaW52YWxpZCBkaWdpdHMgKGFjY29yZGluZyB0byBiYXNlKSBlcnJvcnM/CisJKGtzaDkzIGZhaWxzIHRoaXMgdGVzdCkKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorc3RkaW46CisJdHlwZXNldCAtaSBpOworCWk9MyM0CitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXihbI1wkXSApPy4qOi4qMyM0LipcbiQvCistLS0KK25hbWU6IGludGVnZXItYmFzZS0xCitkZXNjcmlwdGlvbjoKKwlNaXNzaW5nIG51bWJlciBhZnRlciBiYXNlIGlzIHRyZWF0ZWQgYXMgMC4KK3N0ZGluOgorCXR5cGVzZXQgLWkgaQorCWk9MworCWk9MiMKKwllY2hvICRpCitleHBlY3RlZC1zdGRvdXQ6CisJMAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2UtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgJ3N0aWNreW5lc3MnIG9mIGJhc2UgaW4gdmFyaW91cyBzaXR1YXRpb25zCitzdGRpbjoKKwl0eXBlc2V0IC1pIGk9OAorCWVjaG8gJGkKKwllY2hvIC0tLS0tLS0tLS0gQQorCXR5cGVzZXQgLWk0IGo9OAorCWVjaG8gJGoKKwllY2hvIC0tLS0tLS0tLS0gQgorCXR5cGVzZXQgLWkgaz04CisJdHlwZXNldCAtaTQgaz04CisJZWNobyAkaworCWVjaG8gLS0tLS0tLS0tLSBDCisJdHlwZXNldCAtaTQgbAorCWw9MyMxMAorCWVjaG8gJGwKKwllY2hvIC0tLS0tLS0tLS0gRAorCXR5cGVzZXQgLWkgbQorCW09MyMxMAorCWVjaG8gJG0KKwllY2hvIC0tLS0tLS0tLS0gRQorCW49MiMxMQorCXR5cGVzZXQgLWkgbgorCWVjaG8gJG4KKwluPTEwCisJZWNobyAkbgorCWVjaG8gLS0tLS0tLS0tLSBGCisJdHlwZXNldCAtaTggbz0xMgorCXR5cGVzZXQgLWk0IG8KKwllY2hvICRvCisJZWNobyAtLS0tLS0tLS0tIEcKKwl0eXBlc2V0IC1pIHAKKwlsZXQgcD04IzEyCisJZWNobyAkcAorZXhwZWN0ZWQtc3Rkb3V0OgorCTgKKwktLS0tLS0tLS0tIEEKKwk0IzIwCisJLS0tLS0tLS0tLSBCCisJNCMyMAorCS0tLS0tLS0tLS0gQworCTQjMworCS0tLS0tLS0tLS0gRAorCTMjMTAKKwktLS0tLS0tLS0tIEUKKwkyIzExCisJMiMxMDEwCisJLS0tLS0tLS0tLSBGCisJNCMzMAorCS0tLS0tLS0tLS0gRworCTgjMTIKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLTMKK2Rlc2NyaXB0aW9uOgorCU1vcmUgYmFzZSBwYXJzaW5nIChobW0gZG9lc24ndCB0ZXN0IG11Y2guLikKK3N0ZGluOgorCXR5cGVzZXQgLWkgYWEKKwlhYT0xKzEyIzEwKzIKKwllY2hvICRhYQorCXR5cGVzZXQgLWkgYmIKKwliYj0xKyRhYQorCWVjaG8gJGJiCisJdHlwZXNldCAtaSBiYgorCWJiPSRhYQorCWVjaG8gJGJiCisJdHlwZXNldCAtaSBjYworCWNjPSRhYQorCWVjaG8gJGNjCitleHBlY3RlZC1zdGRvdXQ6CisJMTUKKwkxNgorCTE1CisJMTUKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhpbmdzIG5vdCBkZWNsYXJlZCBhcyBpbnRlZ2VycyBhcmUgbm90IG1hZGUgaW50ZWdlcnMsCisJYWxzbywgY2hlY2sgaWYgYmFzZSBpcyBub3QgcmVzZXQgYnkgLWkgd2l0aCBubyBhcmd1bWVudHMuCisJKGtzaDkzIGZhaWxzIC0gcHJpbnRzIDEwIzIwIC0gZ28gZmlndXJlKQorc3RkaW46CisJeHg9MjAKKwlsZXQgeHg9MTAKKwl0eXBlc2V0IC1pIHwgZ3JlcCAnXnh4PScKKwl0eXBlc2V0IC1pNCBhPTEwCisJdHlwZXNldCAtaSBhPTIwCisJZWNobyAkYQorZXhwZWN0ZWQtc3Rkb3V0OgorCTQjMTEwCistLS0KK25hbWU6IGludGVnZXItYmFzZS01CitkZXNjcmlwdGlvbjoKKwlNb3JlIGJhc2Ugc3R1ZmYKK3N0ZGluOgorCXR5cGVzZXQgLWk0IGE9MyMxMAorCWVjaG8gJGEKKwllY2hvIC0tCisJdHlwZXNldCAtaSBqPTMKKwlqPSd+MycKKwllY2hvICRqCisJZWNobyAtLQorCXR5cGVzZXQgLWkgaz0xCisJeFtrPWsrMV09MworCWVjaG8gJGsKKwllY2hvIC0tCisJdHlwZXNldCAtaSBsCisJZm9yIGwgaW4gMSAyKzMgNDsgZG8gZWNobyAkbDsgZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCTQjMworCS0tCisJLTQKKwktLQorCTIKKwktLQorCTEKKwk1CisJNAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2UtNgorZGVzY3JpcHRpb246CisJRXZlbiBtb3JlIGJhc2Ugc3R1ZmYKKwkoa3NoOTMgZmFpbHMgdGhpcyB0ZXN0IC0gcHJpbnRzIDApCitzdGRpbjoKKwl0eXBlc2V0IC1pNyBpCisJaT0KKwllY2hvICRpCitleHBlY3RlZC1zdGRvdXQ6CisJNyMwCistLS0KK25hbWU6IGludGVnZXItYmFzZS03CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IG5vbi1pbnRlZ2VyIHBhcmFtZXRlcnMgZG9uJ3QgZ2V0IGJhc2VzIGFzc2lnbmVkCitzdGRpbjoKKwllY2hvICQoKCB6eiA9IDgjMTAwICkpCisJZWNobyAkenoKK2V4cGVjdGVkLXN0ZG91dDoKKwk2NAorCTY0CistLS0KK25hbWU6IGxpbmVuby1zdGRpbgorZGVzY3JpcHRpb246CisJU2VlIGlmICRMSU5FTk8gaXMgdXBkYXRlZCBhbmQgY2FuIGJlIG1vZGlmaWVkLgorc3RkaW46CisJZWNobyBBICRMSU5FTk8KKwllY2hvIEIgJExJTkVOTworCUxJTkVOTz0yMAorCWVjaG8gQyAkTElORU5PCitleHBlY3RlZC1zdGRvdXQ6CisJQSAxCisJQiAyCisJQyAyMAorLS0tCituYW1lOiBsaW5lbm8taW5jCitkZXNjcmlwdGlvbjoKKwlTZWUgaWYgJExJTkVOTyBpcyBzZXQgZm9yIC4nZCBmaWxlcy4KK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJkb3RmaWxlIgorCWVjaG8gZG90IEEgJExJTkVOTworCWVjaG8gZG90IEIgJExJTkVOTworCUxJTkVOTz0yMAorCWVjaG8gZG90IEMgJExJTkVOTworc3RkaW46CisJZWNobyBBICRMSU5FTk8KKwllY2hvIEIgJExJTkVOTworCS4gLi9kb3RmaWxlCitleHBlY3RlZC1zdGRvdXQ6CisJQSAxCisJQiAyCisJZG90IEEgMQorCWRvdCBCIDIKKwlkb3QgQyAyMAorLS0tCituYW1lOiBsaW5lbm8tZnVuYworZGVzY3JpcHRpb246CisJU2VlIGlmICRMSU5FTk8gaXMgc2V0IGZvciBjb21tYW5kcyBpbiBhIGZ1bmN0aW9uLgorc3RkaW46CisJZWNobyBBICRMSU5FTk8KKwllY2hvIEIgJExJTkVOTworCWJhcigpIHsKKwkgICAgZWNobyBmdW5jIEEgJExJTkVOTworCSAgICBlY2hvIGZ1bmMgQiAkTElORU5PCisJfQorCWJhcgorCWVjaG8gQyAkTElORU5PCitleHBlY3RlZC1zdGRvdXQ6CisJQSAxCisJQiAyCisJZnVuYyBBIDQKKwlmdW5jIEIgNQorCUMgOAorLS0tCituYW1lOiBsaW5lbm8tdW5zZXQKK2Rlc2NyaXB0aW9uOgorCVNlZSBpZiB1bnNldHRpbmcgTElORU5PIG1ha2VzIGl0IG5vbi1tYWdpYy4KK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJkb3RmaWxlIgorCWVjaG8gZG90IEEgJExJTkVOTworCWVjaG8gZG90IEIgJExJTkVOTworc3RkaW46CisJdW5zZXQgTElORU5PCisJZWNobyBBICRMSU5FTk8KKwllY2hvIEIgJExJTkVOTworCWJhcigpIHsKKwkgICAgZWNobyBmdW5jIEEgJExJTkVOTworCSAgICBlY2hvIGZ1bmMgQiAkTElORU5PCisJfQorCWJhcgorCS4gLi9kb3RmaWxlCisJZWNobyBDICRMSU5FTk8KK2V4cGVjdGVkLXN0ZG91dDoKKwlBCisJQgorCWZ1bmMgQQorCWZ1bmMgQgorCWRvdCBBCisJZG90IEIKKwlDCistLS0KK25hbWU6IGxpbmVuby11bnNldC11c2UKK2Rlc2NyaXB0aW9uOgorCVNlZSBpZiB1bnNldHRpbmcgTElORU5PIG1ha2VzIGl0IG5vbi1tYWdpYyBldmVuCisJd2hlbiBpdCBpcyByZS11c2VkLgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImRvdGZpbGUiCisJZWNobyBkb3QgQSAkTElORU5PCisJZWNobyBkb3QgQiAkTElORU5PCitzdGRpbjoKKwl1bnNldCBMSU5FTk8KKwlMSU5FTk89MworCWVjaG8gQSAkTElORU5PCisJZWNobyBCICRMSU5FTk8KKwliYXIoKSB7CisJICAgIGVjaG8gZnVuYyBBICRMSU5FTk8KKwkgICAgZWNobyBmdW5jIEIgJExJTkVOTworCX0KKwliYXIKKwkuIC4vZG90ZmlsZQorCWVjaG8gQyAkTElORU5PCitleHBlY3RlZC1zdGRvdXQ6CisJQSAzCisJQiAzCisJZnVuYyBBIDMKKwlmdW5jIEIgMworCWRvdCBBIDMKKwlkb3QgQiAzCisJQyAzCistLS0KK25hbWU6IGxpbmVuby10cmFwCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBMSU5FTk8gaXMgdHJhY2tlZCBpbiB0cmFwcworc3RkaW46CisJZmFpbCgpIHsKKwkJZWNobyAibGluZSA8JDE+IgorCQlleGl0IDEKKwl9CisJdHJhcCAnZmFpbCAkTElORU5PJyBJTlQgRVJSCisJZmFsc2UKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDw2PgorZXhwZWN0ZWQtZXhpdDogMQorLS0tCituYW1lOiByZWFkLUlGUy0xCitkZXNjcmlwdGlvbjoKKwlTaW1wbGUgdGVzdCwgZGVmYXVsdCBJRlMKK3N0ZGluOgorCWVjaG8gIkEgQiAiID4gSU4KKwl1bnNldCB4IHkgegorCXJlYWQgeCB5IHogPCBJTgorCWVjaG8gMTogInhbJHhdIHlbJHldIHpbJHpdIgorCWVjaG8gMWE6ICR7ei16IG5vdCBzZXR9CisJcmVhZCB4IDwgSU4KKwllY2hvIDI6ICJ4WyR4XSIKK2V4cGVjdGVkLXN0ZG91dDoKKwkxOiB4W0FdIHlbQl0geltdCisJMWE6CisJMjogeFtBIEJdCistLS0KK25hbWU6IHJlYWQta3NoLTEKK2Rlc2NyaXB0aW9uOgorCUlmIG5vIHZhciBzcGVjaWZpZWQsIFJFUExZIGlzIHVzZWQKK3N0ZGluOgorCWVjaG8gImFiYyIgPiBJTgorCXJlYWQgPCBJTgorCWVjaG8gIlskUkVQTFldIjsKK2V4cGVjdGVkLXN0ZG91dDoKKwlbYWJjXQorLS0tCituYW1lOiByZWdyZXNzaW9uLTEKK2Rlc2NyaXB0aW9uOgorCUxleCBhcnJheSBjb2RlIGhhZCBwcm9ibGVtcyB3aXRoIHRoaXMuCitzdGRpbjoKKwllY2hvIGZvb1sKKwluPWJhcgorCWVjaG8gImhpWyAkbiBdPTEiCitleHBlY3RlZC1zdGRvdXQ6CisJZm9vWworCWhpWyBiYXIgXT0xCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMgorZGVzY3JpcHRpb246CisJV2hlbiBQQVRIIGlzIHNldCBiZWZvcmUgcnVubmluZyBhIGNvbW1hbmQsIHRoZSBuZXcgcGF0aCBpcworCW5vdCB1c2VkIGluIGRvaW5nIHRoZSBwYXRoIHNlYXJjaAorCQkkIGVjaG8gZWNobyBoaSA+IC90bXAvcSA7IGNobW9kIGErcnggL3RtcC9xCisJCSQgUEFUSD0vdG1wIHEKKwkJcTogbm90IGZvdW5kCisJCSQKKwlpbiBjb21leGVjKCkgdGhlIHR3byBsaW5lcworCQl3aGlsZSAoKnZwICE9IE5VTEwpCisJCQkodm9pZCkgdHlwZXNldCgqdnArKywgeHh4LCAwKTsKKwluZWVkIHRvIGJlIG1vdmVkIG91dCBvZiB0aGUgc3dpdGNoIHRvIGJlZm9yZSBmaW5kY29tKCkgaXMKKwljYWxsZWQgLSBJIGRvbid0IGtub3cgd2hhdCB0aGlzIHdpbGwgYnJlYWsuCitzdGRpbjoKKwk6ICR7UFdEOi1gcHdkIDI+IC9kZXYvbnVsbGB9CisJOiAke1BXRDo/IlBXRCBub3Qgc2V0IC0gY2FuJ3QgZG8gdGVzdCJ9CisJbWtkaXIgWQorCWNhdCA+IFkveHh4c2NyaXB0IDw8IEVPRgorCSMhL2Jpbi9zaAorCSMgTmVlZCB0byByZXN0b3JlIHBhdGggc28gZWNobyBjYW4gYmUgZm91bmQgKHNvbWUgc2hlbGxzIGRvbid0IGhhdmUKKwkjIGl0IGFzIGEgYnVpbHQtaW4pCisJUEFUSD1cJE9MRFBBVEgKKwllY2hvIGhpCisJZXhpdCAwCisJRU9GCisJY2htb2QgYStyeCBZL3h4eHNjcmlwdAorCWV4cG9ydCBPTERQQVRIPSIkUEFUSCIKKwlQQVRIPSRQV0QvWSB4eHhzY3JpcHQKKwlleGl0ICQ/CitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKy0tLQorbmFtZTogcmVncmVzc2lvbi02CitkZXNjcmlwdGlvbjoKKwlQYXJzaW5nIG9mICQoLi4pIGV4cHJlc3Npb25zIGlzIG5vbi1vcHRpbWFsLiAgSXQgaXMKKwlpbXBvc3NpYmxlIHRvIGhhdmUgYW55IHBhcmVudGhlc2VzIGluc2lkZSB0aGUgZXhwcmVzc2lvbi4KKwlJLmUuLAorCQkkIGtzaCAtYyAnZWNobyAkKGVjaG8gXCggKScKKwkJbm8gY2xvc2luZyBxdW90ZQorCQkkIGtzaCAtYyAnZWNobyAkKGVjaG8gIigiICknCisJCW5vIGNsb3NpbmcgcXVvdGUKKwkJJAorCVRoZSBzb2x1dGlvbiBpcyB0byBoYWNrIHRoZSBwYXJzaW5nIGNsb2RlIGluIGxleC5jLCB0aGUKKwlxdWVzdGlvbiBpcyBob3cgdG8gaGFjayBpdDogc2hvdWxkIGFueSBwYXJlbnRoZXNlcyBiZQorCWVzY2FwZWQgYnkgYSBiYWNrc2xhc2gsIG9yIHNob3VsZCByZWN1cnNpdmUgcGFyc2luZyBiZSBkb25lCisJKHNvIHF1b3RlcyBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gaGlkZSBoZW0pLiAgVGhlIGZvcm1lciBpcworCWVhc2llciwgdGhlIGxhdGVyIGJldHRlci4uLgorc3RkaW46CisJZWNobyAkKGVjaG8gXCgpCitleHBlY3RlZC1zdGRvdXQ6CisJKAorLS0tCituYW1lOiByZWdyZXNzaW9uLTkKK2Rlc2NyaXB0aW9uOgorCUNvbnRpbnVlIGluIGEgZm9yIGxvb3AgZG9lcyBub3Qgd29yayByaWdodDoKKwkJZm9yIGkgaW4gYSBiIGMgOyBkbworCQkJaWYgWyAkaSA9IGIgXSA7IHRoZW4KKwkJCQljb250aW51ZQorCQkJZmkKKwkJCWVjaG8gJGkKKwkJZG9uZQorCVByaW50cyBhIGZvcmV2ZXIuLi4KK3N0ZGluOgorCWZpcnN0PXllcworCWZvciBpIGluIGEgYiBjIDsgZG8KKwkJaWYgWyAkaSA9IGIgXSA7IHRoZW4KKwkJCWlmIFsgJGZpcnN0ID0gbm8gXSA7IHRoZW4KKwkJCQllY2hvICdjb250aW51ZSBpbiBmb3IgbG9vcCBicm9rZW4nCisJCQkJYnJlYWsJIyBob3BlIGJyZWFrIGlzbid0IGJyb2tlbiB0b28gOi0pCisJCQlmaQorCQkJZmlyc3Q9bm8KKwkJCWNvbnRpbnVlCisJCWZpCisJZG9uZQorCWVjaG8gYnllCitleHBlY3RlZC1zdGRvdXQ6CisJYnllCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMTAKK2Rlc2NyaXB0aW9uOgorCVRoZSBmb2xsb3dpbmc6CisJCXNldCAtLSBgZmFsc2VgCisJCWVjaG8gJD8KKwlzaG91bGQgcHJpbnQgMCBhY2NvcmRpbmcgdG8gUE9TSVggKGRhc2gsIGJhc2gsIGtzaDkzLCBwb3NoKQorCWJ1dCBub3QgMCBhY2NvcmRpbmcgdG8gdGhlIGdldG9wdCgxKSBtYW51YWwgcGFnZSwga3NoODgsIGFuZAorCUJvdXJuZSBzaCAoc3VjaCBhcyAvYmluL3NoIG9uIFNvbGFyaXMpLgorCUluIG1rc2ggUjM5Yiwgd2UgaG9ub3VyIFBPU0lYIGV4Y2VwdCB3aGVuIC1vIHNoIGlzIHNldC4KK3N0ZGluOgorCXNob3dmKCkgeworCQlbWyAtbyBwb3NpeCBdXTsgRlBPU0lYPSQoKDEtJD8pKQorCQlbWyAtbyBzaCBdXTsgRlNIPSQoKDEtJD8pKQorCQllY2hvIC1uICJGUE9TSVg9JEZQT1NJWCBGU0g9JEZTSCAiCisJfQorCXNldCArbyBwb3NpeCArbyBzaAorCXNob3dmCisJc2V0IC0tIGBmYWxzZWAKKwllY2hvIHJ2PSQ/CisJc2V0IC1vIHNoCisJc2hvd2YKKwlzZXQgLS0gYGZhbHNlYAorCWVjaG8gcnY9JD8KKwlzZXQgLW8gcG9zaXgKKwlzaG93ZgorCXNldCAtLSBgZmFsc2VgCisJZWNobyBydj0kPworZXhwZWN0ZWQtc3Rkb3V0OgorCUZQT1NJWD0wIEZTSD0wIHJ2PTAKKwlGUE9TSVg9MCBGU0g9MSBydj0xCisJRlBPU0lYPTEgRlNIPTAgcnY9MAorLS0tCituYW1lOiByZWdyZXNzaW9uLTExCitkZXNjcmlwdGlvbjoKKwlUaGUgZm9sbG93aW5nOgorCQl4PS9mb28vYmFyL2JsYWgKKwkJZWNobyAke3gjIyovfQorCXNob3VsZCBlY2hvIGJsYWggYnV0IG9uIHNvbWUgbWFjaGluZXMgZWNob3MgL2Zvby9iYXIvYmxhaC4KK3N0ZGluOgorCXg9L2Zvby9iYXIvYmxhaAorCWVjaG8gJHt4IyMqL30KK2V4cGVjdGVkLXN0ZG91dDoKKwlibGFoCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMTIKK2Rlc2NyaXB0aW9uOgorCUJvdGggb2YgdGhlIGZvbGxvd2luZyBlY2hvcyBwcm9kdWNlIHRoZSBzYW1lIG91dHB1dCB1bmRlciBzaC9rc2guYXR0OgorCQkjIS9iaW4vc2gKKwkJeD0iZm9vCWJhciIKKwkJZWNobyAiYGVjaG8gXCIkeFwiYCIKKwkJZWNobyAiYGVjaG8gIiR4ImAiCisJcGRrc2ggcHJvZHVjZXMgZGlmZmVyZW50IG91dHB1dCBmb3IgdGhlIGZvcm1lciAoZm9vIGluc3RlYWQgb2YgZm9vXHRiYXIpCitzdGRpbjoKKwl4PSJmb28JYmFyIgorCWVjaG8gImBlY2hvIFwiJHhcImAiCisJZWNobyAiYGVjaG8gIiR4ImAiCitleHBlY3RlZC1zdGRvdXQ6CisJZm9vCWJhcgorCWZvbwliYXIKKy0tLQorbmFtZTogcmVncmVzc2lvbi0xMworZGVzY3JpcHRpb246CisJVGhlIGZvbGxvd2luZyBjb21tYW5kIGhhbmdzIGZvcmV2ZXI6CisJCSQgKDogOyBjYXQgL2V0Yy90ZXJtY2FwKSB8IHNsZWVwIDIKKwlUaGlzIGlzIGJlY2F1c2UgdGhlIHNoZWxsIGZvcmtzIGEgc2hlbGwgdG8gcnVuIHRoZSAoLi4pIGNvbW1hbmQKKwlhbmQgdGhpcyBzaGVsbCBoYXMgdGhlIHBpcGUgb3Blbi4gIFdoZW4gdGhlIHNsZWVwIGRpZXMsIHRoZSBjYXQKKwlkb2Vzbid0IGdldCBhIFNJR1BJUEUgJ2NhdXNlIGEgcHJvY2VzcyAoaWUsIHRoZSBzZWNvbmQgc2hlbGwpCisJc3RpbGwgaGFzIHRoZSBwaXBlIG9wZW4uCisJCisJTk9URTogdGhpcyB0ZXN0IHByb3Zva2VzIGEgYml6YXJyZSBidWcgaW4ga3NoOTMgKHNoZWxsIHN0YXJ0cyByZWFkaW5nCisJICAgICAgY29tbWFuZHMgZnJvbSAvZXRjL3Rlcm1jYXAuLikKK3RpbWUtbGltaXQ6IDEwCitzdGRpbjoKKwllY2hvIEEgbGluZSBvZiB0ZXh0IHRoYXQgd2lsbCBiZSBkdXBsaWNhdGVkIHF1aXRlIGEgbnVtYmVyIG9mIHRpbWVzLj4gdDEKKwljYXQgdDEgdDEgdDEgdDEgIHQxIHQxIHQxIHQxICB0MSB0MSB0MSB0MSAgdDEgdDEgdDEgdDEgID4gdDIKKwljYXQgdDIgdDIgdDIgdDIgIHQyIHQyIHQyIHQyICB0MiB0MiB0MiB0MiAgdDIgdDIgdDIgdDIgID4gdDEKKwljYXQgdDEgdDEgdDEgdDEgPiB0MgorCSg6IDsgY2F0IHQyIDI+Ji0pIHwgc2xlZXAgMQorLS0tCituYW1lOiByZWdyZXNzaW9uLTE0CitkZXNjcmlwdGlvbjoKKwlUaGUgY29tbWFuZAorCQkkIChmb29iYXIpIDI+IC9kZXYvbnVsbAorCWdlbmVyYXRlcyBubyBvdXRwdXQgdW5kZXIgL2Jpbi9zaCwgYnV0IHBka3NoIHByb2R1Y2VzIHRoZSBlcnJvcgorCQlmb29iYXI6IG5vdCBmb3VuZAorCUFsc28sIHRoZSBjb21tYW5kCisJCSQgZm9vYmFyIDI+IC9kZXYvbnVsbAorCWdlbmVyYXRlcyBhbiBlcnJvciB1bmRlciAvYmluL3NoIGFuZCBwZGtzaCwgYnV0IEFUJlQga3NoODggcHJvZHVjZXMKKwlubyBlcnJvciAocmVkaXJlY3RlZCB0byAvZGV2L251bGwpLgorc3RkaW46CisJKHlvdS9zaG91bGQvbm90L3NlZS90aGlzL2Vycm9yLzEpIDI+IC9kZXYvbnVsbAorCXlvdS9zaG91bGQvbm90L3NlZS90aGlzL2Vycm9yLzIgMj4gL2Rldi9udWxsCisJdHJ1ZQorLS0tCituYW1lOiByZWdyZXNzaW9uLTE1CitkZXNjcmlwdGlvbjoKKwlUaGUgY29tbWFuZAorCQkkIHdoZW5jZSBmb29iYXIKKwlnZW5lcmF0ZXMgYSBibGFuayBsaW5lIHVuZGVyIHBka3NoIGFuZCBzZXRzIHRoZSBleGl0IHN0YXR1cyB0byAwLgorCUFUJlQga3NoODggZ2VuZXJhdGVzIG5vIG91dHB1dCBhbmQgc2V0cyB0aGUgZXhpdCBzdGF0dXMgdG8gMS4gIEFsc28sCisJdGhlIGNvbW1hbmQKKwkJJCB3aGVuY2UgZm9vYmFyIGNhdAorCWdlbmVyYXRlcyBubyBvdXRwdXQgdW5kZXIgQVQmVCBrc2g4OCAocGRrc2ggZ2VuZXJhdGVzIGEgYmxhbmsgbGluZQorCWFuZCAvYmluL2NhdCkuCitzdGRpbjoKKwl3aGVuY2UgZG9lcy9ub3QvZXhpc3QgPiAvZGV2L251bGwKKwllY2hvIDE6ICQ/CisJZWNobyAyOiAkKHdoZW5jZSBkb2VzL25vdC9leGlzdCB8IHdjIC1sKQorCWVjaG8gMzogJCh3aGVuY2UgZG9lcy9ub3QvZXhpc3QgY2F0IHwgd2MgLWwpCitleHBlY3RlZC1zdGRvdXQ6CisJMTogMQorCTI6IDAKKwkzOiAwCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMTYKK2Rlc2NyaXB0aW9uOgorCSR7dmFyJSVleHByfSBzZWVtcyB0byBiZSBicm9rZW4gaW4gbWFueSBwbGFjZXMuICBPbiB0aGUgbWlwcworCXRoZSBjb21tYW5kcworCQkkIHJlYWQgbGluZSA8IC9ldGMvcGFzc3dkCisJCSQgZWNobyAkbGluZQorCQlyb290OjA6MTouLi4KKwkJJCBlY2hvICR7bGluZSUlOip9CisJCXJvb3QKKwkJJCBlY2hvICRsaW5lCisJCXJvb3QKKwkJJAorCWNoYW5nZSB0aGUgdmFsdWUgb2YgbGluZS4gIE9uIHN1bjRzICYgcGFzLCB0aGUgZWNobyAke2xpbmUlJToqfSBkb2Vzbid0CisJd29yay4gIEhhdmVuJ3QgY2hlY2tlZCBlbHNld2hlcmUuLi4KK3NjcmlwdDoKKwlyZWFkIHgKKwl5PSR4CisJZWNobyAke3glJToqfQorCWVjaG8gJHgKK3N0ZGluOgorCXJvb3Q6YXNkamhhc2Rhc2poczowOjE6Um9vdDovOi9iaW4vc2gKK2V4cGVjdGVkLXN0ZG91dDoKKwlyb290CisJcm9vdDphc2RqaGFzZGFzamhzOjA6MTpSb290Oi86L2Jpbi9zaAorLS0tCituYW1lOiByZWdyZXNzaW9uLTE3CitkZXNjcmlwdGlvbjoKKwlUaGUgY29tbWFuZAorCQkuIC9mb28vYmFyCisJc2hvdWxkIHNldCB0aGUgZXhpdCBzdGF0dXMgdG8gbm9uLXplcm8gKHNoIGFuZCBBVCZUIGtzaDg4IGRvKS4KKwlYWFggZG90aW5nIGEgbm9uIGV4aXN0ZW50IGZpbGUgaXMgYSBmYXRhbCBlcnJvciBmb3IgYSBzY3JpcHQKK3N0ZGluOgorCS4gZG9lcy9ub3QvZXhpc3QKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uPy8KKy0tLQorbmFtZTogcmVncmVzc2lvbi0xOQorZGVzY3JpcHRpb246CisJQm90aCBvZiB0aGUgZm9sbG93aW5nIGVjaG9zIHNob3VsZCBwcm9kdWNlIHRoZSBzYW1lIHRoaW5nLCBidXQgZG9uJ3Q6CisJCSQgeD1mb28vYmFyCisJCSQgZWNobyAke3glLyp9CisJCWZvbworCQkkIGVjaG8gIiR7eCUvKn0iCisJCWZvby9iYXIKK3N0ZGluOgorCXg9Zm9vL2JhcgorCWVjaG8gIiR7eCUvKn0iCitleHBlY3RlZC1zdGRvdXQ6CisJZm9vCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMjEKK2Rlc2NyaXB0aW9uOgorCWJhY2tzbGFzaCBkb2VzIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGluIGNhc2UgbGFiZWxzOgorCSQgeD0nLXgnCisJJCBjYXNlICR4IGluCisJLVw/KSBlY2hvIGhpCisJZXNhYworCWhpCisJJCB4PSctPycKKwkkIGNhc2UgJHggaW4KKwktXFw/KSBlY2hvIGhpCisJZXNhYworCWhpCisJJAorc3RkaW46CisJY2FzZSAteCBpbgorCS1cPykJZWNobyBmYWlsCisJZXNhYworLS0tCituYW1lOiByZWdyZXNzaW9uLTIyCitkZXNjcmlwdGlvbjoKKwlRdW90aW5nIGJhY2txdW90ZXMgaW5zaWRlIGJhY2txdW90ZXMgZG9lc24ndCB3b3JrOgorCSQgZWNobyBgZWNobyBoaSBcYGVjaG8gdGhlcmVcYCBmb2xrc2AKKwlhc2tzIGZvciBtb3JlIGluZm8uICBzaCBhbmQgQVQmVCBrc2g4OCBib3RoIGVjaG8KKwloaSB0aGVyZSBmb2xrcworc3RkaW46CisJZWNobyBgZWNobyBoaSBcYGVjaG8gdGhlcmVcYCBmb2xrc2AKK2V4cGVjdGVkLXN0ZG91dDoKKwloaSB0aGVyZSBmb2xrcworLS0tCituYW1lOiByZWdyZXNzaW9uLTIzCitkZXNjcmlwdGlvbjoKKwkpKSBpcyBub3QgdHJlYXRlZCBgY29ycmVjdGx5JzoKKwkgICAgJCAoZWNobyBoaSA7IChlY2hvIHRoZXJlIDsgZWNobyBmb2xrcykpCisJICAgIG1pc3NpbmcgKCgKKwkgICAgJAorCWluc3RlYWQgb2YgKGFzIHNoIGFuZCBrc2guYXR0KQorCSAgICAkIChlY2hvIGhpIDsgKGVjaG8gdGhlcmUgOyBlY2hvIGZvbGtzKSkKKwkgICAgaGkKKwkgICAgdGhlcmUKKwkgICAgZm9sa3MKKwkgICAgJAorc3RkaW46CisJKCA6IDsgKCA6IDsgZWNobyBoaSkpCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKy0tLQorbmFtZTogcmVncmVzc2lvbi0yNQorZGVzY3JpcHRpb246CisJQ2hlY2sgcmVhZGluZyBzdGRpbiBpbiBhIHdoaWxlIGxvb3AuICBUaGUgcmVhZCBzaG91bGQgb25seSByZWFkCisJYSBzaW5nbGUgbGluZSwgbm90IGEgd2hvbGUgc3RkaW8gYnVmZmVyOyB0aGUgY2F0IHNob3VsZCBnZXQKKwl0aGUgcmVzdC4KK3N0ZGluOgorCShlY2hvIGE7IGVjaG8gYikgfCB3aGlsZSByZWFkIHggOyBkbworCSAgICBlY2hvICR4CisJICAgIGNhdCA+IC9kZXYvbnVsbAorCWRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwlhCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMjYKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHJlYWRpbmcgc3RkaW4gaW4gYSB3aGlsZSBsb29wLiAgVGhlIHJlYWQgc2hvdWxkIHJlYWQgYm90aAorCWxpbmVzLCBub3QganVzdCB0aGUgZmlyc3QuCitzY3JpcHQ6CisJYT0KKwl3aGlsZSBbICIkYSIgIT0geHh4IF0gOyBkbworCSAgICBsYXN0PSR4CisJICAgIHJlYWQgeAorCSAgICBjYXQgL2Rldi9udWxsIHwgc2VkICdzL3gveS8nCisJICAgIGE9eCRhCisJZG9uZQorCWVjaG8gJGxhc3QKK3N0ZGluOgorCWEKKwliCitleHBlY3RlZC1zdGRvdXQ6CisJYgorLS0tCituYW1lOiByZWdyZXNzaW9uLTI3CitkZXNjcmlwdGlvbjoKKwlUaGUgY29tbWFuZAorCQkuIC9kb2VzL25vdC9leGlzdAorCXNob3VsZCBjYXVzZSBhIHNjcmlwdCB0byBleGl0Lgorc3RkaW46CisJLiBkb2VzL25vdC9leGlzdAorCWVjaG8gaGkKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC9kb2VzXC9ub3RcL2V4aXN0LworLS0tCituYW1lOiByZWdyZXNzaW9uLTI4CitkZXNjcmlwdGlvbjoKKwl2YXJpYWJsZSBhc3NpZ25lbWVudHMgbm90IGRldGVjdGVkIHdlbGwKK3N0ZGluOgorCWEueD0xIGVjaG8gaGkKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC9hXC54PTEvCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMjkKK2Rlc2NyaXB0aW9uOgorCWFsaWFzIGV4cGFuc2lvbiBkaWZmZXJlbnQgZnJvbSBBVCZUIGtzaDg4CitzdGRpbjoKKwlhbGlhcyBhPSdmb3IgJyBiPSdpIGluJworCWEgYiBoaSA7IGRvIGVjaG8gJGkgOyBkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKy0tLQorbmFtZTogcmVncmVzc2lvbi0zMAorZGVzY3JpcHRpb246CisJc3RyYW5nZSBjaGFyYWN0ZXJzIGFsbG93ZWQgaW5zaWRlICR7Li4ufQorc3RkaW46CisJZWNobyAke2F7Yn19CitleHBlY3RlZC1leGl0OiBlICE9IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLj8vCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMzEKK2Rlc2NyaXB0aW9uOgorCURvZXMgcmVhZCBoYW5kbGUgcGFydGlhbCBsaW5lcyBjb3JyZWN0bHkKK3NjcmlwdDoKKwlhPSByZXQ9CisJd2hpbGUgWyAiJGEiICE9IHh4eCBdIDsgZG8KKwkgICAgcmVhZCB4IHkgegorCSAgICByZXQ9JD8KKwkgICAgYT14JGEKKwlkb25lCisJZWNobyAiWyR4XSIKKwllY2hvICRyZXQKK3N0ZGluOiAhCisJYSBBIGFBCisJYiBCIEJiCisJYworZXhwZWN0ZWQtc3Rkb3V0OgorCVtjXQorCTEKKy0tLQorbmFtZTogcmVncmVzc2lvbi0zMgorZGVzY3JpcHRpb246CisJRG9lcyByZWFkIHNldCB2YXJpYWJsZXMgdG8gbnVsbCBhdCBlb2Y/CitzY3JpcHQ6CisJYT0KKwl3aGlsZSBbICIkYSIgIT0geHh4IF0gOyBkbworCSAgICByZWFkIHggeSB6CisJICAgIGE9eCRhCisJZG9uZQorCWVjaG8gMTogJHt4LXggbm90IHNldH0gJHt5LXkgbm90IHNldH0gJHt6LXogbm90IHNldH0KKwllY2hvIDI6ICR7eDoreCBub3QgbnVsbH0gJHt5Oit5IG5vdCBudWxsfSAke3o6K3ogbm90IG51bGx9CitzdGRpbjoKKwlhIEEgQWEKKwliIEIgQmIKK2V4cGVjdGVkLXN0ZG91dDoKKwkxOgorCTI6CistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMzMKK2Rlc2NyaXB0aW9uOgorCURvZXMgdW1hc2sgcHJpbnQgYSBsZWFkaW5nIDAgd2hlbiB1bWFzayBpcyAzIGRpZ2l0cz8KK3N0ZGluOgorCXVtYXNrIDIyMgorCXVtYXNrCitleHBlY3RlZC1zdGRvdXQ6CisJMDIyMgorLS0tCituYW1lOiByZWdyZXNzaW9uLTM1CitkZXNjcmlwdGlvbjoKKwlUZW1wb3J5IGZpbGVzIHVzZWQgZm9yIGhlcmUtZG9jcyBpbiBmdW5jdGlvbnMgZ2V0IHRyYXNoZWQgYWZ0ZXIKKwl0aGUgZnVuY3Rpb24gaXMgcGFyc2VkIChiZWZvcmUgaXQgaXMgZXhlY3V0ZWQpCitzdGRpbjoKKwlmMSgpIHsKKwkJY2F0IDw8LSBFT0YKKwkJCUYxCisJCUVPRgorCQlmMigpIHsKKwkJCWNhdCA8PC0gRU9GCisJCQkJRjIKKwkJCUVPRgorCQl9CisJfQorCWYxCisJZjIKKwl1bnNldCAtZiBmMQorCWYyCitleHBlY3RlZC1zdGRvdXQ6CisJRjEKKwlGMgorCUYyCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMzYKK2Rlc2NyaXB0aW9uOgorCUNvbW1hbmQgc3Vic3RpdHV0aW9uIGJyZWFrcyByZWFkaW5nIGluIHdoaWxlIGxvb3AKKwkodGVzdCBmcm9tIDxzamdAdm9pZC56ZW4ub3ouYXU+KQorc3RkaW46CisJKGVjaG8gYWJjZGVmOyBlY2hvOyBlY2hvIDEyMykgfAorCSAgICB3aGlsZSByZWFkIGxpbmUKKwkgICAgZG8KKwkgICAgICAjIHRoZSBmb2xsb3dpbmcgbGluZSBicmVha3MgaXQKKwkgICAgICBjPWBlY2hvICRsaW5lIHwgd2MgLWNgCisJICAgICAgZWNobyAkYworCSAgICBkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJNworCTEKKwk0CistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMzcKK2Rlc2NyaXB0aW9uOgorCU1hY2hpbmVzIHdpdGggYnJva2VuIHRpbWVzKCkgKHJlcG9ydGVkIGJ5IDxzamdAdm9pZC56ZW4ub3ouYXU+KQorCXRpbWUgZG9lcyBub3QgcmVwb3J0IGNvcnJlY3QgcmVhbCB0aW1lCitzdGRpbjoKKwl0aW1lIHNsZWVwIDEKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAhL15ccyowXC4wW1xzXGRdK3JlYWx8XlxzKnJlYWxbXHNdKzArXC4wLworLS0tCituYW1lOiByZWdyZXNzaW9uLTM4CitkZXNjcmlwdGlvbjoKKwlzZXQgLWUgZG9lc24ndCBpZ25vcmUgZXhpdCBjb2RlcyBmb3IgaWYvd2hpbGUvdW50aWwvJiYvfHwvIS4KK2FyZ3VtZW50czogIS1lIQorc3RkaW46CisJaWYgZmFsc2U7IHRoZW4gZWNobyBoaSA7IGZpCisJZmFsc2UgfHwgdHJ1ZQorCWZhbHNlICYmIHRydWUKKwl3aGlsZSBmYWxzZTsgZG8gZWNobyBoaTsgZG9uZQorCWVjaG8gb2sKK2V4cGVjdGVkLXN0ZG91dDoKKwlvaworLS0tCituYW1lOiByZWdyZXNzaW9uLTM5CitkZXNjcmlwdGlvbjoKKwlzZXQgLWU6IGVycm9ycyBpbiBjb21tYW5kIHN1YnN0aXR1dGlvbnMgYXJlbid0IGlnbm9yZWQKKwlOb3QgY2xlYXIgaWYgdGhleSBzaG91bGQgYmUgb3Igbm90Li4uIGJhc2ggcGFzc2VzIGhlcmUKKwl0aGlzIG1heSBhY3R1YWxseSBiZSByZXF1aXJlZCBmb3IgbWFrZSwgc28gY2hhbmdlZCB0aGUKKwl0ZXN0IHRvIG1ha2UgdGhpcyBhbiBta3NoIGZlYXR1cmUsIG5vdCBhIGJ1ZworYXJndW1lbnRzOiAhLWUhCitzdGRpbjoKKwllY2hvIGBmYWxzZTsgZWNobyBoaWAKKyNleHBlY3RlZC1mYWlsOiB5ZXMKKyNleHBlY3RlZC1zdGRvdXQ6CisjCWhpCitleHBlY3RlZC1zdGRvdXQ6CisJCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNDAKK2Rlc2NyaXB0aW9uOgorCVRoaXMgdXNlZCB0byBjYXVzZSBhIGNvcmUgZHVtcAorZW52LXNldHVwOiAhUkFORE9NPTEyIQorc3RkaW46CisJZWNobyBoaQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNDEKK2Rlc2NyaXB0aW9uOgorCWZvbyBzaG91bGQgYmUgc2V0IHRvIGJhciAoc2hvdWxkIG5vdCBiZSBlbXB0eSkKK3N0ZGluOgorCWZvbz1gCisJZWNobyBiYXJgCisJZWNobyAiKCRmb28pIgorZXhwZWN0ZWQtc3Rkb3V0OgorCShiYXIpCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNDIKK2Rlc2NyaXB0aW9uOgorCUNhbid0IHVzZSBjb21tYW5kIGxpbmUgYXNzaWdubWVudHMgdG8gYXNzaWduIHJlYWRvbmx5IHBhcmFtZXRlcnMuCitzdGRpbjoKKwlmb289YmFyCisJcmVhZG9ubHkgZm9vCisJZm9vPXN0dWZmIGVudiB8IGdyZXAgJ15mb28nCitleHBlY3RlZC1leGl0OiBlICE9IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8uKnJlYWQgKm9ubHkuKi8KKy0tLQorbmFtZTogcmVncmVzc2lvbi00MworZGVzY3JpcHRpb246CisJQ2FuIHN1YnNoZWxscyBiZSBwcmVmaXhlZCBieSByZWRpcmVjdGlvbnMgKGhpc3RvcmljYWwgc2hlbGxzIGFsbG93CisJdGhpcykKK3N0ZGluOgorCTwgL2Rldi9udWxsIChzZWQgJ3MvXi9YLycpCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNDUKK2Rlc2NyaXB0aW9uOgorCVBhcmFtZXRlciBhc3NpZ25tZW50cyB3aXRoIFtdIHJlY29nbmlzZWQgY29ycmVjdGx5CitzdGRpbjoKKwlGT089KlsxMl0KKwlCQVI9YWJjWworCU1PUkU9W2FiY10KKwlKVU5LPWFbYmMKKwllY2hvICI8JEZPTz4iCisJZWNobyAiPCRCQVI+IgorCWVjaG8gIjwkTU9SRT4iCisJZWNobyAiPCRKVU5LPiIKK2V4cGVjdGVkLXN0ZG91dDoKKwk8KlsxMl0+CisJPGFiY1s+CisJPFthYmNdPgorCTxhW2JjPgorLS0tCituYW1lOiByZWdyZXNzaW9uLTQ2CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGFsaWFzIGV4cGFuc2lvbiB3b3JrcyBpbiBjb21tYW5kIHN1YnN0aXR1dGlvbnMgYW5kCisJYXQgdGhlIGVuZCBvZiBmaWxlLgorc3RkaW46CisJYWxpYXMgeD0nZWNobyBoaScKKwlGT089ImB4YCAiCisJZWNobyAiWyRGT09dIgorCXgKK2V4cGVjdGVkLXN0ZG91dDoKKwlbaGkgXQorCWhpCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNDcKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYWxpYXNlcyBhcmUgZnVsbHkgcmVhZC4KK3N0ZGluOgorCWFsaWFzIHg9J2VjaG8gaGk7CisJZWNobyB0aGVyZScKKwl4CisJZWNobyBkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwl0aGVyZQorCWRvbmUKKy0tLQorbmFtZTogcmVncmVzc2lvbi00OAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCAoaGVyZSBkb2MpIHRlbXAgZmlsZXMgYXJlIG5vdCBsZWZ0IGJlaGluZCBhZnRlciBhbiBleGVjLgorc3RkaW46CisJbWtkaXIgZm9vIHx8IGV4aXQgMQorCVRNUERJUj0kUFdEL2ZvbyAiJF9fcHJvZ25hbWUiIDw8LSAnRU9GJworCQl4KCkgeworCQkJc2VkICdzL14vWCAvJyA8PCBFX09fRgorCQkJaGkKKwkJCXRoZXJlCisJCQlmb2xrcworCQkJRV9PX0YKKwkJCWVjaG8gImRvbmUgKCQ/KSIKKwkJfQorCQllY2hvPWVjaG87IFsgLXggL2Jpbi9lY2hvIF0gJiYgZWNobz0vYmluL2VjaG8KKwkJZXhlYyAkZWNobyBzdWJ0ZXN0LTEgaGkKKwlFT0YKKwllY2hvIHN1YnRlc3QtMSBmb28vKgorCVRNUERJUj0kUFdEL2ZvbyAiJF9fcHJvZ25hbWUiIDw8LSAnRU9GJworCQllY2hvPWVjaG87IFsgLXggL2Jpbi9lY2hvIF0gJiYgZWNobz0vYmluL2VjaG8KKwkJc2VkICdzL14vWCAvJyA8PCBFX09fRjsgZXhlYyAkZWNobyBzdWJ0ZXN0LTIgaGkKKwkJYQorCQlmZXcKKwkJbGluZXMKKwkJRV9PX0YKKwlFT0YKKwllY2hvIHN1YnRlc3QtMiBmb28vKgorZXhwZWN0ZWQtc3Rkb3V0OgorCXN1YnRlc3QtMSBoaQorCXN1YnRlc3QtMSBmb28vKgorCVggYQorCVggZmV3CisJWCBsaW5lcworCXN1YnRlc3QtMiBoaQorCXN1YnRlc3QtMiBmb28vKgorLS0tCituYW1lOiByZWdyZXNzaW9uLTQ5CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHVuc2V0IHBhcmFtcyB3aXRoIGF0dHJpYnV0ZXMgYXJlIHJlcG9ydGVkIGJ5IHNldCwgdGhvc2UKKwlzYW5zIGF0dHJpYnV0ZXMgYXJlIG5vdC4KK3N0ZGluOgorCXVuc2V0IEZPTyBCQVIKKwllY2hvIFgkRk9PCisJZXhwb3J0IEJBUgorCXR5cGVzZXQgLWkgQkxBSAorCXNldCB8IGdyZXAgRk9PCisJc2V0IHwgZ3JlcCBCQVIKKwlzZXQgfCBncmVwIEJMQUgKK2V4cGVjdGVkLXN0ZG91dDoKKwlYCisJQkFSCisJQkxBSAorLS0tCituYW1lOiByZWdyZXNzaW9uLTUwCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGFsaWFzZXMgZG8gbm90IHVzZSBjb250aW51YXRpb24gcHJvbXB0IGFmdGVyIHRyYWlsaW5nCisJc2VtaS1jb2xvbi4KK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJlbnYiCisJUFMxPVkKKwlQUzI9WAorZW52LXNldHVwOiAhRU5WPS4vZW52IQorYXJndW1lbnRzOiAhLWkhCitzdGRpbjoKKwlhbGlhcyBmb289J2VjaG8gaGkgOyAnCisJZm9vCisJZm9vIGVjaG8gdGhlcmUKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCWhpCisJdGhlcmUKK2V4cGVjdGVkLXN0ZGVycjogIQorCVlZWVkKKy0tLQorbmFtZTogcmVncmVzc2lvbi01MQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBzZXQgYWxsb3dzIGJvdGggK28gYW5kIC1vIG9wdGlvbnMgb24gc2FtZSBjb21tYW5kIGxpbmUuCitzdGRpbjoKKwlzZXQgYSBiIGMKKwlzZXQgLW8gbm9nbG9iICtvIGFsbGV4cG9ydAorCWVjaG8gQTogJCosICoKK2V4cGVjdGVkLXN0ZG91dDoKKwlBOiBhIGIgYywgKgorLS0tCituYW1lOiByZWdyZXNzaW9uLTUyCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGdsb2JiaW5nIHdvcmtzIGluIHBpcGVsaW5lZCBjb21tYW5kcworZmlsZS1zZXR1cDogZmlsZSA2NDQgImVudiIKKwlQUzE9UAorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYyIKKwlzdHVmZgorZW52LXNldHVwOiAhRU5WPS4vZW52IQorYXJndW1lbnRzOiAhLWkhCitzdGRpbjoKKwlzZWQgJ3MvXi9YIC8nIDwgYWIqCisJZWNobyBtYXJrIDEKKwlzZWQgJ3MvXi9YIC8nIDwgYWIqIHwgc2VkICdzL14vWSAvJworCWVjaG8gbWFyayAyCitleHBlY3RlZC1zdGRvdXQ6CisJWCBzdHVmZgorCW1hcmsgMQorCVkgWCBzdHVmZgorCW1hcmsgMgorZXhwZWN0ZWQtc3RkZXJyOiAhCisJUFBQUFAKKy0tLQorbmFtZTogcmVncmVzc2lvbi01MworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBnZXRvcHRzIHdvcmtzIGluIGZ1bmN0aW9ucworc3RkaW46CisJYmZ1bmMoKSB7CisJICAgIGVjaG8gYmZ1bmM6IGVudGVyICIoYXJnczogJCo7IE9QVElORD0kT1BUSU5EKSIKKwkgICAgd2hpbGUgZ2V0b3B0cyBCIG9jOyBkbworCQljYXNlICRvYyBpbgorCQkgIChCKQorCQkgICAgZWNobyBiZnVuYzogQiBvcHRpb24KKwkJICAgIDs7CisJCSAgKCopCisJCSAgICBlY2hvIGJmdW5jOiBvZGQgb3B0aW9uICIoJG9jKSIKKwkJICAgIDs7CisJCWVzYWMKKwkgICAgZG9uZQorCSAgICBlY2hvIGJmdW5jOiBsZWF2ZQorCX0KKwkKKwlmdW5jdGlvbiBrZnVuYyB7CisJICAgIGVjaG8ga2Z1bmM6IGVudGVyICIoYXJnczogJCo7IE9QVElORD0kT1BUSU5EKSIKKwkgICAgd2hpbGUgZ2V0b3B0cyBLIG9jOyBkbworCQljYXNlICRvYyBpbgorCQkgIChLKQorCQkgICAgZWNobyBrZnVuYzogSyBvcHRpb24KKwkJICAgIDs7CisJCSAgKCopCisJCSAgICBlY2hvIGJmdW5jOiBvZGQgb3B0aW9uICIoJG9jKSIKKwkJICAgIDs7CisJCWVzYWMKKwkgICAgZG9uZQorCSAgICBlY2hvIGtmdW5jOiBsZWF2ZQorCX0KKwkKKwlzZXQgLS0gLWYgLWIgLWsgLWwKKwllY2hvICJsaW5lIDE6IE9QVElORD0kT1BUSU5EIgorCWdldG9wdHMga2JmbCBvcHRjCisJZWNobyAibGluZSAyOiByZXQ9JD8sIG9wdGM9JG9wdGMsIE9QVElORD0kT1BUSU5EIgorCWJmdW5jIC1CQkIgYmxhaAorCWVjaG8gImxpbmUgMzogT1BUSU5EPSRPUFRJTkQiCisJZ2V0b3B0cyBrYmZsIG9wdGMKKwllY2hvICJsaW5lIDQ6IHJldD0kPywgb3B0Yz0kb3B0YywgT1BUSU5EPSRPUFRJTkQiCisJa2Z1bmMgLUtLSyBibGFoCisJZWNobyAibGluZSA1OiBPUFRJTkQ9JE9QVElORCIKKwlnZXRvcHRzIGtiZmwgb3B0YworCWVjaG8gImxpbmUgNjogcmV0PSQ/LCBvcHRjPSRvcHRjLCBPUFRJTkQ9JE9QVElORCIKKwllY2hvCisJCisJT1BUSU5EPTEKKwlzZXQgLS0gLWZia2wKKwllY2hvICJsaW5lIDEwOiBPUFRJTkQ9JE9QVElORCIKKwlnZXRvcHRzIGtiZmwgb3B0YworCWVjaG8gImxpbmUgMjA6IHJldD0kPywgb3B0Yz0kb3B0YywgT1BUSU5EPSRPUFRJTkQiCisJYmZ1bmMgLUJCQiBibGFoCisJZWNobyAibGluZSAzMDogT1BUSU5EPSRPUFRJTkQiCisJZ2V0b3B0cyBrYmZsIG9wdGMKKwllY2hvICJsaW5lIDQwOiByZXQ9JD8sIG9wdGM9JG9wdGMsIE9QVElORD0kT1BUSU5EIgorCWtmdW5jIC1LS0sgYmxhaAorCWVjaG8gImxpbmUgNTA6IE9QVElORD0kT1BUSU5EIgorCWdldG9wdHMga2JmbCBvcHRjCisJZWNobyAibGluZSA2MDogcmV0PSQ/LCBvcHRjPSRvcHRjLCBPUFRJTkQ9JE9QVElORCIKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDE6IE9QVElORD0xCisJbGluZSAyOiByZXQ9MCwgb3B0Yz1mLCBPUFRJTkQ9MgorCWJmdW5jOiBlbnRlciAoYXJnczogLUJCQiBibGFoOyBPUFRJTkQ9MikKKwliZnVuYzogQiBvcHRpb24KKwliZnVuYzogQiBvcHRpb24KKwliZnVuYzogbGVhdmUKKwlsaW5lIDM6IE9QVElORD0yCisJbGluZSA0OiByZXQ9MCwgb3B0Yz1iLCBPUFRJTkQ9MworCWtmdW5jOiBlbnRlciAoYXJnczogLUtLSyBibGFoOyBPUFRJTkQ9MSkKKwlrZnVuYzogSyBvcHRpb24KKwlrZnVuYzogSyBvcHRpb24KKwlrZnVuYzogSyBvcHRpb24KKwlrZnVuYzogbGVhdmUKKwlsaW5lIDU6IE9QVElORD0zCisJbGluZSA2OiByZXQ9MCwgb3B0Yz1rLCBPUFRJTkQ9NAorCQorCWxpbmUgMTA6IE9QVElORD0xCisJbGluZSAyMDogcmV0PTAsIG9wdGM9ZiwgT1BUSU5EPTIKKwliZnVuYzogZW50ZXIgKGFyZ3M6IC1CQkIgYmxhaDsgT1BUSU5EPTIpCisJYmZ1bmM6IEIgb3B0aW9uCisJYmZ1bmM6IEIgb3B0aW9uCisJYmZ1bmM6IGxlYXZlCisJbGluZSAzMDogT1BUSU5EPTIKKwlsaW5lIDQwOiByZXQ9MSwgb3B0Yz0/LCBPUFRJTkQ9MgorCWtmdW5jOiBlbnRlciAoYXJnczogLUtLSyBibGFoOyBPUFRJTkQ9MSkKKwlrZnVuYzogSyBvcHRpb24KKwlrZnVuYzogSyBvcHRpb24KKwlrZnVuYzogSyBvcHRpb24KKwlrZnVuYzogbGVhdmUKKwlsaW5lIDUwOiBPUFRJTkQ9MgorCWxpbmUgNjA6IHJldD0xLCBvcHRjPT8sIE9QVElORD0yCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgOyBpcyBub3QgcmVxdWlyZWQgYmVmb3JlIHRoZSB0aGVuIGluIGlmICgoIC4uLiApKSB0aGVuIC4uLgorc3RkaW46CisJaWYgKCggMSApKSB0aGVuCisJICAgIGVjaG8gb2sgZHBhcmVuCisJZmkKKwlpZiBbWyAtbiAxIF1dIHRoZW4KKwkgICAgZWNobyBvayBkYnJhY2tldHMKKwlmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCW9rIGRwYXJlbgorCW9rIGRicmFja2V0cworLS0tCituYW1lOiByZWdyZXNzaW9uLTU1CitkZXNjcmlwdGlvbjoKKwlDaGVjayAke2ZvbzolYmFyfSBpcyBhbGxvd2VkIChrc2g4OCBhbGxvd3MgaXQuLi4pCitzdGRpbjoKKwl4PWZvb1hiYXJYYmxhaAorCWVjaG8gMSAke3glWCp9CisJZWNobyAyICR7eDolWCp9CisJZWNobyAzICR7eCUlWCp9CisJZWNobyA0ICR7eDolJVgqfQorCWVjaG8gNSAke3gjKlh9CisJZWNobyA2ICR7eDojKlh9CisJZWNobyA3ICR7eCMjKlh9CisJZWNobyA4ICR7eDojIypYfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgZm9vWGJhcgorCTIgZm9vWGJhcgorCTMgZm9vCisJNCBmb28KKwk1IGJhclhibGFoCisJNiBiYXJYYmxhaAorCTcgYmxhaAorCTggYmxhaAorLS0tCituYW1lOiByZWdyZXNzaW9uLTU3CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiB0eXBlc2V0IG91dHB1dCBpcyBjb3JyZWN0IGZvcgorCXVuaW5pdGlhbGlzZWQgYXJyYXkgZWxlbWVudHMuCitzdGRpbjoKKwl0eXBlc2V0IC1pIHh4eFs0XQorCWVjaG8gQQorCXR5cGVzZXQgLWkgfCBncmVwIHh4eCB8IHNlZCAncy9eLyAgICAvJworCWVjaG8gQgorCXR5cGVzZXQgfCBncmVwIHh4eCB8IHNlZCAncy9eLyAgICAvJworCQorCXh4eFsxXT0yKzUKKwllY2hvIE0KKwl0eXBlc2V0IC1pIHwgZ3JlcCB4eHggfCBzZWQgJ3MvXi8gICAgLycKKwllY2hvIE4KKwl0eXBlc2V0IHwgZ3JlcCB4eHggfCBzZWQgJ3MvXi8gICAgLycKK2V4cGVjdGVkLXN0ZG91dDoKKwlBCisJICAgIHh4eAorCUIKKwkgICAgdHlwZXNldCAtaSB4eHgKKwlNCisJICAgIHh4eFsxXT03CisJTgorCSAgICB0eXBlc2V0IC1pIHh4eAorLS0tCituYW1lOiByZWdyZXNzaW9uLTU4CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiB0cmFwIGV4aXQgaXMgb2sgKGV4aXQgbm90IG1pc3Rha2VuIGZvciBzaWduYWwgbmFtZSkKK3N0ZGluOgorCXRyYXAgJ2VjaG8gaGknIGV4aXQKKwl0cmFwIGV4aXQgMQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNTkKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmICR7I2FycmF5WypdfSBpcyBjYWxjdWxhdGVkIGNvcnJlY3RseS4KK3N0ZGluOgorCWFbMTJdPWhpCisJYVs4XT10aGVyZQorCWVjaG8gJHsjYVsqXX0KK2V4cGVjdGVkLXN0ZG91dDoKKwkyCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNjAKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGRlZmF1bHQgZXhpdCBzdGF0dXMgaXMgcHJldmlvdXMgY29tbWFuZAorc3RkaW46CisJKHRydWU7IGV4aXQpCisJZWNobyBBICQ/CisJKGZhbHNlOyBleGl0KQorCWVjaG8gQiAkPworCSggKGV4aXQgMTAzKSA7IGV4aXQpCisJZWNobyBDICQ/CitleHBlY3RlZC1zdGRvdXQ6CisJQSAwCisJQiAxCisJQyAxMDMKKy0tLQorbmFtZTogcmVncmVzc2lvbi02MQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgRVhJVCB0cmFwIGlzIGV4ZWN1dGVkIGZvciBzdWIgc2hlbGxzLgorc3RkaW46CisJdHJhcCAnZWNobyBwYXJlbnQgZXhpdCcgRVhJVAorCWVjaG8gc3RhcnQKKwkoZWNobyBBOyBlY2hvIEEgbGFzdCkKKwllY2hvIEIKKwkoZWNobyBDOyB0cmFwICdlY2hvIHN1YiBleGl0JyBFWElUOyBlY2hvIEMgbGFzdCkKKwllY2hvIHBhcmVudCBsYXN0CitleHBlY3RlZC1zdGRvdXQ6CisJc3RhcnQKKwlBCisJQSBsYXN0CisJQgorCUMKKwlDIGxhc3QKKwlzdWIgZXhpdAorCXBhcmVudCBsYXN0CisJcGFyZW50IGV4aXQKKy0tLQorbmFtZTogcmVncmVzc2lvbi02MgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgdGVzdCAtbnQvLW90IHN1Y2NlZWRzIGlmIHNlY29uZChmaXJzdCkgZmlsZSBpcyBtaXNzaW5nLgorc3RkaW46CisJdG91Y2ggYQorCXRlc3QgYSAtbnQgYiAmJiBlY2hvIG50IE9LIHx8IGVjaG8gbnQgQkFECisJdGVzdCBiIC1vdCBhICYmIGVjaG8gb3QgT0sgfHwgZWNobyBvdCBCQUQKK2V4cGVjdGVkLXN0ZG91dDoKKwludCBPSworCW90IE9LCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNjMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHR5cGVzZXQsIGV4cG9ydCwgYW5kIHJlYWRvbmx5IHdvcmsKK3N0ZGluOgorCXsKKwkJZWNobyBGTk9SRC0wCisJCUZOT1JEX0E9MQorCQlGTk9SRF9CPTIKKwkJRk5PUkRfQz0zCisJCUZOT1JEX0Q9NAorCQlGTk9SRF9FPTUKKwkJRk5PUkRfRj02CisJCUZOT1JEX0c9NworCQlGTk9SRF9IPTgKKwkJaW50ZWdlciBGTk9SRF9FIEZOT1JEX0YgRk5PUkRfRyBGTk9SRF9ICisJCWV4cG9ydCBGTk9SRF9DIEZOT1JEX0QgRk5PUkRfRyBGTk9SRF9ICisJCXJlYWRvbmx5IEZOT1JEX0IgRk5PUkRfRCBGTk9SRF9GIEZOT1JEX0gKKwkJZWNobyBGTk9SRC0xCisJCWV4cG9ydAorCQllY2hvIEZOT1JELTIKKwkJZXhwb3J0IC1wCisJCWVjaG8gRk5PUkQtMworCQlyZWFkb25seQorCQllY2hvIEZOT1JELTQKKwkJcmVhZG9ubHkgLXAKKwkJZWNobyBGTk9SRC01CisJCXR5cGVzZXQKKwkJZWNobyBGTk9SRC02CisJCXR5cGVzZXQgLXAKKwkJZWNobyBGTk9SRC03CisJCXR5cGVzZXQgLQorCQllY2hvIEZOT1JELTgKKwl9IHwgZmdyZXAgRk5PUkQKK2V4cGVjdGVkLXN0ZG91dDoKKwlGTk9SRC0wCisJRk5PUkQtMQorCUZOT1JEX0MKKwlGTk9SRF9ECisJRk5PUkRfRworCUZOT1JEX0gKKwlGTk9SRC0yCisJZXhwb3J0IEZOT1JEX0M9MworCWV4cG9ydCBGTk9SRF9EPTQKKwlleHBvcnQgRk5PUkRfRz03CisJZXhwb3J0IEZOT1JEX0g9OAorCUZOT1JELTMKKwlGTk9SRF9CCisJRk5PUkRfRAorCUZOT1JEX0YKKwlGTk9SRF9ICisJRk5PUkQtNAorCXJlYWRvbmx5IEZOT1JEX0I9MgorCXJlYWRvbmx5IEZOT1JEX0Q9NAorCXJlYWRvbmx5IEZOT1JEX0Y9NgorCXJlYWRvbmx5IEZOT1JEX0g9OAorCUZOT1JELTUKKwl0eXBlc2V0IEZOT1JEX0EKKwl0eXBlc2V0IC1yIEZOT1JEX0IKKwl0eXBlc2V0IC14IEZOT1JEX0MKKwl0eXBlc2V0IC14IC1yIEZOT1JEX0QKKwl0eXBlc2V0IC1pIEZOT1JEX0UKKwl0eXBlc2V0IC1pIC1yIEZOT1JEX0YKKwl0eXBlc2V0IC1pIC14IEZOT1JEX0cKKwl0eXBlc2V0IC1pIC14IC1yIEZOT1JEX0gKKwlGTk9SRC02CisJdHlwZXNldCBGTk9SRF9BPTEKKwl0eXBlc2V0IC1yIEZOT1JEX0I9MgorCXR5cGVzZXQgLXggRk5PUkRfQz0zCisJdHlwZXNldCAteCAtciBGTk9SRF9EPTQKKwl0eXBlc2V0IC1pIEZOT1JEX0U9NQorCXR5cGVzZXQgLWkgLXIgRk5PUkRfRj02CisJdHlwZXNldCAtaSAteCBGTk9SRF9HPTcKKwl0eXBlc2V0IC1pIC14IC1yIEZOT1JEX0g9OAorCUZOT1JELTcKKwlGTk9SRF9BPTEKKwlGTk9SRF9CPTIKKwlGTk9SRF9DPTMKKwlGTk9SRF9EPTQKKwlGTk9SRF9FPTUKKwlGTk9SRF9GPTYKKwlGTk9SRF9HPTcKKwlGTk9SRF9IPTgKKwlGTk9SRC04CistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNjQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgd2UgY2FuIHJlZGVmaW5lIGZ1bmN0aW9ucyBjYWxsaW5nIHRpbWUgYnVpbHRpbgorc3RkaW46CisJdCgpIHsKKwkJdGltZSA+L2Rldi9udWxsCisJfQorCXQgMj4vZGV2L251bGwKKwl0KCkgeworCQl0aW1lCisJfQorLS0tCituYW1lOiBzeW50YXgtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBsb25lIGFtcGVyc2FuZCBpcyBhIHN5bnRheCBlcnJvcgorc3RkaW46CisJICYKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL3N5bnRheCBlcnJvci8KKy0tLQorbmFtZTogeHh4LXF1b3RlZC1uZXdsaW5lLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXDxuZXdsaW5lPiB3b3JrcyBpbnNpZGUgb2YgJHt9CitzdGRpbjoKKwlhYmM9MgorCWVjaG8gJHthYlwKKwljfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTIKKy0tLQorbmFtZTogeHh4LXF1b3RlZC1uZXdsaW5lLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXDxuZXdsaW5lPiB3b3JrcyBhdCB0aGUgc3RhcnQgb2YgYSBoZXJlIGRvY3VtZW50CitzdGRpbjoKKwljYXQgPDwgRU9cCisJRgorCWhpCisJRU9GCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKy0tLQorbmFtZTogeHh4LXF1b3RlZC1uZXdsaW5lLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXDxuZXdsaW5lPiB3b3JrcyBhdCB0aGUgZW5kIG9mIGEgaGVyZSBkb2N1bWVudAorc3RkaW46CisJY2F0IDw8IEVPRgorCWhpCisJRU9cCisJRgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCistLS0KK25hbWU6IHh4eC1tdWx0aS1hc3NpZ25tZW50LWNtZAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhc3NpZ25tZW50cyBpbiBhIGNvbW1hbmQgYWZmZWN0IHN1YnNlcXVlbnQgYXNzaWdubWVudHMKKwlpbiB0aGUgc2FtZSBjb21tYW5kCitzdGRpbjoKKwlGT089YWJjCisJRk9PPTEyMyBCQVI9JEZPTworCWVjaG8gJEJBUgorZXhwZWN0ZWQtc3Rkb3V0OgorCTEyMworLS0tCituYW1lOiB4eHgtbXVsdGktYXNzaWdubWVudC1wb3NpeC1jbWQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIGJlaGF2aW91ciBmb3IgbXVsdGlwbGUgYXNzaWdubWVudHMgd2l0aCBhCisJY29tbWFuZCBuYW1lIG1hdGNoZXMgUE9TSVguIFNlZToKKwlodHRwOi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5jb21wLnN0YW5kYXJkcy5wb3NpeC5hdXN0aW4uZ2VuZXJhbC8xOTI1CitzdGRpbjoKKwlYPWEgWT1iOyBYPSRZIFk9JFggIiRfX3Byb2duYW1lIiAtYyAnZWNobyAxICRYICRZIC4nOyBlY2hvIDIgJFggJFkgLgorCXVuc2V0IFggWSBaCisJWD1hIFk9JHtYPWJ9IFo9JFggIiRfX3Byb2duYW1lIiAtYyAnZWNobyAzICRaIC4nCisJdW5zZXQgWCBZIFoKKwlYPWEgWT0ke1g9Yn0gWj0kWDsgZWNobyA0ICRaIC4KK2V4cGVjdGVkLXN0ZG91dDoKKwkxIGIgYSAuCisJMiBhIGIgLgorCTMgYiAuCisJNCBhIC4KKy0tLQorbmFtZTogeHh4LW11bHRpLWFzc2lnbm1lbnQtcG9zaXgtbm9jbWQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIGJlaGF2aW91ciBmb3IgbXVsdGlwbGUgYXNzaWdubWVudHMgd2l0aCBubworCWNvbW1hbmQgbmFtZSBtYXRjaGVzIFBPU0lYIChEZWJpYW4gIzMzNDE4MikuIFNlZToKKwlodHRwOi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5jb21wLnN0YW5kYXJkcy5wb3NpeC5hdXN0aW4uZ2VuZXJhbC8xOTI1CitzdGRpbjoKKwlYPWEgWT1iOyBYPSRZIFk9JFg7IGVjaG8gMSAkWCAkWSAuCitleHBlY3RlZC1zdGRvdXQ6CisJMSBiIGIgLgorLS0tCituYW1lOiB4eHgtbXVsdGktYXNzaWdubWVudC1wb3NpeC1zdWJhc3NpZ24KK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIGJlaGF2aW91ciBmb3IgbXVsdGlwbGUgYXNzaWdubWVudHMgbWF0Y2hlcyBQT1NJWDoKKwktIFRoZSBhc3NpZ25tZW50IHdvcmRzIHNoYWxsIGJlIGV4cGFuZGVkIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbgorCSAgZW52aXJvbm1lbnQuCisJLSBUaGUgYXNzaWdubWVudHMgaGFwcGVuIGluIHRoZSB0ZW1wb3JhcnkgZXhlY3V0aW9uIGVudmlyb25tZW50Lgorc3RkaW46CisJdW5zZXQgWCBZIFoKKwlaPWEgWT0ke1g6PWJ9IHNoIC1jICdlY2hvICskWCsgKyRZKyArJForJworCWVjaG8gLyRYLworCSMgTm93IGZvciB0aGUgc3BlY2lhbCBjYXNlOgorCXVuc2V0IFggWSBaCisJWD0gWT0ke1g6PWJ9IHNoIC1jICdlY2hvICskWCsgKyRZKycKKwllY2hvIC8kWC8KK2V4cGVjdGVkLXN0ZG91dDoKKwkrKyArYisgK2ErCisJL2IvCisJKysgK2IrCisJL2IvCistLS0KK25hbWU6IHh4eC1leGVjLWVudmlyb25tZW50LTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRvIHNlZSBpZiBleGVjIHNldHMgaXQncyBlbnZpcm9ubWVudCBjb3JyZWN0bHkKK3N0ZGluOgorCUZPTz1iYXIgZXhlYyBlbnYKK2V4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuOgorCS8oXnwuKlxuKUZPTz1iYXJcbi8KKy0tLQorbmFtZTogeHh4LWV4ZWMtZW52aXJvbm1lbnQtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdG8gbWFrZSBzdXJlIGV4ZWMgZG9lc24ndCBjaGFuZ2UgZW52aXJvbm1lbnQgaWYgYSBwcm9ncmFtCisJaXNuJ3QgZXhlYy1lZAorc3RkaW46CisJc29ydHByb2c9JCh3aGVuY2UgLXAgc29ydCkgfHwgc29ydHByb2c9Y2F0CisJZW52IHwgJHNvcnRwcm9nIHwgZ3JlcCAtdiAnXlJBTkRPTT0nID5iYXIxCisJRk9PPWJhciBleGVjOyBlbnYgfCAkc29ydHByb2cgfCBncmVwIC12ICdeUkFORE9NPScgPmJhcjIKKwljbXAgLXMgYmFyMSBiYXIyCistLS0KK25hbWU6IGV4ZWMtZnVuY3Rpb24tZW52aXJvbm1lbnQtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgYXNzaWdubWVudHMgaW4gZnVuY3Rpb24gY2FsbHMgYW5kIHdoZXRoZXIgdGhleSBhZmZlY3QKKwl0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQgKGtzaDkzLCBTVVN2NCkKK3N0ZGluOgorCWYoKSB7IGE9MjsgfTsgZygpIHsgYj0zOyBlY2hvIHkkYy07IH07IGE9MSBmOyBiPTI7IGM9MSBnCisJZWNobyB4JGEtJGItIHokYy0KK2V4cGVjdGVkLXN0ZG91dDoKKwl5MS0KKwl4Mi0zLSB6MS0KKy0tLQorbmFtZTogeHh4LXdoYXQtZG8teW91LWNhbGwtdGhpcy0xCitzdGRpbjoKKwllY2hvICIke2ZvbzotImEifSoiCitleHBlY3RlZC1zdGRvdXQ6CisJYSoKKy0tLQorbmFtZTogeHh4LXByZWZpeC1zdHJpcC0xCitzdGRpbjoKKwlmb289J2EgY2RlZicKKwllY2hvICR7Zm9vI2EgY30KK2V4cGVjdGVkLXN0ZG91dDoKKwlkZWYKKy0tLQorbmFtZTogeHh4LXByZWZpeC1zdHJpcC0yCitzdGRpbjoKKwlzZXQgYSBjCisJeD0nYSBjZGVmJworCWVjaG8gJHt4IyQqfQorZXhwZWN0ZWQtc3Rkb3V0OgorCWRlZgorLS0tCituYW1lOiB4eHgtdmFyaWFibGUtc3ludGF4LTEKK3N0ZGluOgorCWVjaG8gJHs6fQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL2JhZCBzdWJzdGl0dXRpb24vCitleHBlY3RlZC1leGl0OiAxCistLS0KK25hbWU6IHh4eC12YXJpYWJsZS1zeW50YXgtMgorc3RkaW46CisJc2V0IDAKKwllY2hvICR7KjowfQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL2JhZCBzdWJzdGl0dXRpb24vCitleHBlY3RlZC1leGl0OiAxCistLS0KK25hbWU6IHh4eC12YXJpYWJsZS1zeW50YXgtMworc3RkaW46CisJc2V0IC1BIGZvbyAwCisJZWNobyAke2Zvb1sqXTowfQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL2JhZCBzdWJzdGl0dXRpb24vCitleHBlY3RlZC1leGl0OiAxCistLS0KK25hbWU6IHh4eC1zdWJzdGl0dXRpb24tZXZhbC1vcmRlcgorZGVzY3JpcHRpb246CisJQ2hlY2sgb3JkZXIgb2YgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucworc3RkaW46CisJaT0xIHg9IHk9CisJc2V0IC1BIEEgYWJjIGRlZiBHSEkgaiBHIGsKKwllY2hvICR7QVt4PShpKz0xKV0jJHtBW3k9KGkrPTIpXX19CisJZWNobyAkeCAkeQorZXhwZWN0ZWQtc3Rkb3V0OgorCUhJCisJMiA0CistLS0KK25hbWU6IHh4eC1zZXQtb3B0aW9uLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIG9wdGlvbiBwYXJzaW5nIGluIHNldAorc3RkaW46CisJc2V0IC12c0EgZm9vIC0tIEEgMSAzIDIKKwllY2hvICR7Zm9vWypdfQorZXhwZWN0ZWQtc3RkZXJyOgorCWVjaG8gJHtmb29bKl19CitleHBlY3RlZC1zdGRvdXQ6CisJMSAyIDMgQQorLS0tCituYW1lOiB4eHgtZXhlYy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGV4ZWMgZXhpdHMgZm9yIGJ1aWx0LWlucworYXJndW1lbnRzOiAhLWkhCitzdGRpbjoKKwlleGVjIGVjaG8gaGkKKwllY2hvIHN0aWxsIGhlcnJlCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLiovCistLS0KK25hbWU6IHh4eC13aGlsZS0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIHdoaWxlIGxvb3BzCisJWFhYIG5lZWQgdG8gZG8gc2FtZSBmb3IgZm9yL3NlbGVjdC91bnRpbCBsb29wcworc3RkaW46CisJaT14CisJd2hpbGUgWyAkaSAhPSB4eHggXSA7IGRvCisJICAgIGk9eCRpCisJICAgIGlmIFsgJGkgPSB4eHggXSA7IHRoZW4KKwkJZmFsc2UKKwkJY29udGludWUKKwkgICAgZmkKKwlkb25lCisJZWNobyBsb29wMT0kPworCQorCWk9eAorCXdoaWxlIFsgJGkgIT0geHh4IF0gOyBkbworCSAgICBpPXgkaQorCSAgICBpZiBbICRpID0geHh4IF0gOyB0aGVuCisJCWZhbHNlCisJCWJyZWFrCisJICAgIGZpCisJZG9uZQorCWVjaG8gbG9vcDI9JD8KKwkKKwlpPXgKKwl3aGlsZSBbICRpICE9IHh4eCBdIDsgZG8KKwkgICAgaT14JGkKKwkgICAgZmFsc2UKKwlkb25lCisJZWNobyBsb29wMz0kPworZXhwZWN0ZWQtc3Rkb3V0OgorCWxvb3AxPTAKKwlsb29wMj0wCisJbG9vcDM9MQorLS0tCituYW1lOiB4eHgtc3RhdHVzLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYmxhbmsgbGluZXMgZG9uJ3QgY2xlYXIgJD8KK2FyZ3VtZW50czogIS1pIQorc3RkaW46CisJKGV4aXQgMSkKKwllY2hvICQ/CisJKGV4aXQgMSkKKwkKKwllY2hvICQ/CisJdHJ1ZQorZXhwZWN0ZWQtc3Rkb3V0OgorCTEKKwkxCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogLy4qLworLS0tCituYW1lOiB4eHgtc3RhdHVzLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgJD8gaXMgcHJlc2VydmVkIGluIHN1YnNoZWxscywgaW5jbHVkZXMsIHRyYXBzLgorc3RkaW46CisJKGV4aXQgMSkKKwkKKwllY2hvIGJsYW5rOiAkPworCQorCShleGl0IDIpCisJKGVjaG8gc3Vic2hlbGw6ICQ/KQorCQorCWVjaG8gJ2VjaG8gaW5jbHVkZTogJD8nID4gZm9vCisJKGV4aXQgMykKKwkuIC4vZm9vCisJCisJdHJhcCAnZWNobyB0cmFwOiAkPycgRVJSCisJKGV4aXQgNCkKKwllY2hvIGV4aXQ6ICQ/CitleHBlY3RlZC1zdGRvdXQ6CisJYmxhbms6IDEKKwlzdWJzaGVsbDogMgorCWluY2x1ZGU6IDMKKwl0cmFwOiA0CisJZXhpdDogNAorLS0tCituYW1lOiB4eHgtY2xlYW4tY2hhcnMtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgTUFHSUMgY2hhcmFjdGVyIGlzIHN0dWZmZWQgY29ycmVjdGx5CitzdGRpbjoKKwllY2hvIGBlY2hvIFujYAorZXhwZWN0ZWQtc3Rkb3V0OgorCVujCistLS0KK25hbWU6IHh4eC1wYXJhbS1zdWJzdC1xbWFyay0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzdXBwcmVzaW9uIG9mIGVycm9yIG1lc3NhZ2Ugd2l0aCBudWxsIHN0cmluZy4gIEFjY29yZGluZyB0bworCVBPU0lYLCBpdCBzaG91bGRuJ3QgcHJpbnQgdGhlIGVycm9yIGFzICd3b3JkJyBpc24ndCBvbW1pdHRlZC4KKwlrc2g4OC85MywgU29sYXJpcyAvYmluL3NoIGFuZCAvdXNyL3hwZzQvYmluL3NoIGFsbCBwcmludCB0aGUgZXJyb3IsCisJdGhhdCdzIHdoeSB0aGUgY29uZGl0aW9uIGlzIHJldmVyc2VkLgorc3RkaW46CisJdW5zZXQgZm9vCisJeD0KKwllY2hvIHgke2Zvbz8keH0KK2V4cGVjdGVkLWV4aXQ6IDEKKyMgUE9TSVgKKyNleHBlY3RlZC1mYWlsOiB5ZXMKKyNleHBlY3RlZC1zdGRlcnItcGF0dGVybjogIS9ub3Qgc2V0LworIyBjb21tb24gdXNlCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogL3BhcmFtZXRlciBudWxsIG9yIG5vdCBzZXQvCistLS0KK25hbWU6IHh4eC1wYXJhbS1fLTEKKyMgZmFpbHMgZHVlIHRvIHdlaXJkbmVzcyBvZiBleGVjdiBzdHVmZgorY2F0ZWdvcnk6ICFvczp1d2luLW50CitkZXNjcmlwdGlvbjoKKwlDaGVjayBjIGZsYWcgaXMgc2V0LgorYXJndW1lbnRzOiAhLWMhZWNobyAiWyQtXSIhCitleHBlY3RlZC1zdGRvdXQtcGF0dGVybjogL15cWy4qYy4qXF0kLworLS0tCituYW1lOiB0aWxkZS1leHBhbmQtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGlsZGUgZXhwYW5zaW9uIGFmdGVyIGVxdWFsIHNpZ25zCitlbnYtc2V0dXA6ICFIT01FPS9zd2VldCEKK3N0ZGluOgorCWVjaG8gJHtBPWE9fX4gYj1+IGM9ZH4gfgorCXNldCArbyBicmFjZWV4cGFuZAorCWVjaG8gJHtBPWE9fX4gYj1+IGM9ZH4gfgorZXhwZWN0ZWQtc3Rkb3V0OgorCWE9L3N3ZWV0IGI9L3N3ZWV0IGM9ZH4gL3N3ZWV0CisJYT1+IGI9fiBjPWR+IC9zd2VldAorLS0tCituYW1lOiBleGl0LWVyci0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzb21lICJleGl0IG9uIGVycm9yIiBjb25kaXRpb25zCitzdGRpbjoKKwlzZXQgLWV4CisJL3Vzci9iaW4vZW52IGZhbHNlICYmIGVjaG8gc29tZXRoaW5nCisJZWNobyBFTkQKK2V4cGVjdGVkLXN0ZG91dDoKKwlFTkQKK2V4cGVjdGVkLXN0ZGVycjoKKwkrIC91c3IvYmluL2VudiBmYWxzZQorCSsgZWNobyBFTkQKKy0tLQorbmFtZTogZXhpdC1lcnItMgorZGVzY3JpcHRpb246CisJQ2hlY2sgc29tZSAiZXhpdCBvbiBlcnJvciIgZWRnZSBjb25kaXRpb25zIChQT1NJWGx5KQorc3RkaW46CisJc2V0IC1leAorCWlmIC91c3IvYmluL2VudiB0cnVlOyB0aGVuCisJCS91c3IvYmluL2VudiBmYWxzZSAmJiBlY2hvIHNvbWV0aGluZworCWZpCisJZWNobyBFTkQKK2V4cGVjdGVkLXN0ZG91dDoKKwlFTkQKK2V4cGVjdGVkLXN0ZGVycjoKKwkrIC91c3IvYmluL2VudiB0cnVlCisJKyAvdXNyL2Jpbi9lbnYgZmFsc2UKKwkrIGVjaG8gRU5ECistLS0KK25hbWU6IGV4aXQtZXJyLTMKK2Rlc2NyaXB0aW9uOgorCXBka3NoIHJlZ3Jlc3Npb24gd2hpY2ggQVQmVCBrc2ggZG9lcyByaWdodAorCVRGTSBzYXlzOiBbc2V0XSAtZSB8IGVycmV4aXQKKwkJRXhpdCAoYWZ0ZXIgZXhlY3V0aW5nIHRoZSBFUlIgdHJhcCkgLi4uCitzdGRpbjoKKwl0cmFwICdlY2hvIEVYSVQnIEVYSVQKKwl0cmFwICdlY2hvIEVSUicgRVJSCisJc2V0IC1lCisJY2QgL1hYWFhYIDI+L2Rldi9udWxsCisJZWNobyBET05FCisJZXhpdCAwCitleHBlY3RlZC1zdGRvdXQ6CisJRVJSCisJRVhJVAorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCistLS0KK25hbWU6IGV4aXQtZXJyLTQKK2Rlc2NyaXB0aW9uOgorCSJzZXQgLWUiIHRlc3Qgc3VpdGUgKFBPU0lYKQorc3RkaW46CisJc2V0IC1lCisJZWNobyBwcmUKKwlpZiB0cnVlIDsgdGhlbgorCQlmYWxzZSAmJiBlY2hvIGZvbworCWZpCisJZWNobyBiYXIKK2V4cGVjdGVkLXN0ZG91dDoKKwlwcmUKKwliYXIKKy0tLQorbmFtZTogZXhpdC1lcnItNQorZGVzY3JpcHRpb246CisJInNldCAtZSIgdGVzdCBzdWl0ZSAoUE9TSVgpCitzdGRpbjoKKwlzZXQgLWUKKwlmb28oKSB7CisJCXdoaWxlIFsgIiQxIiBdOyBkbworCQkJZm9yIEUgaW4gJHg7IGRvCisJCQkJWyAiJDEiID0gIiRFIiBdICYmIHsgc2hpZnQgOyBjb250aW51ZSAyIDsgfQorCQkJZG9uZQorCQkJeD0iJHggJDEiCisJCQlzaGlmdAorCQlkb25lCisJCWVjaG8gJHgKKwl9CisJZWNobyBwcmUKKwlmb28gYSBiIGIgYworCWVjaG8gcG9zdAorZXhwZWN0ZWQtc3Rkb3V0OgorCXByZQorCWEgYiBjCisJcG9zdAorLS0tCituYW1lOiBleGl0LWVyci02CitkZXNjcmlwdGlvbjoKKwkic2V0IC1lIiB0ZXN0IHN1aXRlIChCU0QgbWFrZSkKK2NhdGVnb3J5OiBvczptaXJic2QKK3N0ZGluOgorCW1rZGlyIHpkIHpkL2EgemQvYgorCXByaW50ICdhbGw6XG5cdEBlY2hvIGVpbnNcblx0QGV4aXQgNDJcbicgPnpkL2EvTWFrZWZpbGUKKwlwcmludCAnYWxsOlxuXHRAZWNobyB6d2VpXG4nID56ZC9iL01ha2VmaWxlCisJd2Q9JChwd2QpCisJc2V0IC1lCisJZm9yIGVudHJ5IGluIGEgYjsgZG8gKCAgc2V0IC1lOyAgaWYgW1sgLWQgJHdkL3pkLyRlbnRyeS5pMzg2IF1dOyB0aGVuICBfbmV3ZGlyXz0iJGVudHJ5LmkzODYiOyAgZWxzZSAgX25ld2Rpcl89IiRlbnRyeSI7ICBmaTsgIGlmIFtbIC16ICRfVEhJU0RJUl8gXV07IHRoZW4gIF9uZXh0ZGlyXz0iJF9uZXdkaXJfIjsgIGVsc2UgIF9uZXh0ZGlyXz0iJF9USElTRElSXy8kX25ld2Rpcl8iOyAgZmk7ICBfbWFrZWZpbGVfc3BlY189OyAgW1sgISAtZiAkd2QvemQvJF9uZXdkaXJfL01ha2VmaWxlLmJzZC13cmFwcGVyIF1dICB8fCBfbWFrZWZpbGVfc3BlY189Ii1mIE1ha2VmaWxlLmJzZC13cmFwcGVyIjsgIHN1YnNraXBkaXI9OyAgZm9yIHNraXBkaXIgaW4gOyBkbyAgc3ViZW50cnk9JHtza2lwZGlyIyRlbnRyeX07ICBpZiBbWyAkc3ViZW50cnkgIT0gJHNraXBkaXIgXV07IHRoZW4gIGlmIFtbIC16ICRzdWJlbnRyeSBdXTsgdGhlbiAgZWNobyAiKCRfbmV4dGRpcl8gc2tpcHBlZCkiOyAgYnJlYWs7ICBmaTsgIHN1YnNraXBkaXI9IiRzdWJza2lwZGlyICR7c3ViZW50cnkjL30iOyAgZmk7ICBkb25lOyAgaWYgW1sgLXogJHNraXBkaXIgfHwgLW4gJHN1YmVudHJ5IF1dOyB0aGVuICBlY2hvICI9PT0+ICRfbmV4dGRpcl8iOyAgY2QgJHdkL3pkLyRfbmV3ZGlyXzsgIG1ha2UgU0tJUERJUj0iJHN1YnNraXBkaXIiICRfbWFrZWZpbGVfc3BlY18gIF9USElTRElSXz0iJF9uZXh0ZGlyXyIgICBhbGw7ICBmaTsgICkgZG9uZSAyPiYxIHwgc2VkICJzISR3ZCFXRCFnIgorZXhwZWN0ZWQtc3Rkb3V0OgorCT09PT4gYQorCWVpbnMKKwkqKiogRXJyb3IgY29kZSA0MgorCQorCVN0b3AgaW4gV0QvemQvYSAobGluZSAyIG9mIE1ha2VmaWxlKS4KKy0tLQorbmFtZTogZXhpdC1lbm9lbnQtMQorZGVzY3JpcHRpb246CisJU1VTdjQgc2F5cyB0aGF0IHRoZSBzaGVsbCBzaG91bGQgZXhpdCB3aXRoIDEyNi8xMjcgaW4gc29tZSBzaXR1YXRpb25zCitzdGRpbjoKKwlpPTAKKwkoZWNobzsgZWNobyA6KSA+eAorCSIkX19wcm9nbmFtZSIgLi94ID4vZGV2L251bGwgMj4mMTsgcj0kPzsgZWNobyAkKChpKyspKSAkciAuCisJIiRfX3Byb2duYW1lIiAtYyAuL3ggPi9kZXYvbnVsbCAyPiYxOyByPSQ/OyBlY2hvICQoKGkrKykpICRyIC4KKwllY2hvIGV4aXQgNDIgPngKKwkiJF9fcHJvZ25hbWUiIC4veCA+L2Rldi9udWxsIDI+JjE7IHI9JD87IGVjaG8gJCgoaSsrKSkgJHIgLgorCSIkX19wcm9nbmFtZSIgLWMgLi94ID4vZGV2L251bGwgMj4mMTsgcj0kPzsgZWNobyAkKChpKyspKSAkciAuCisJcm0gLWYgeAorCSIkX19wcm9nbmFtZSIgLi94ID4vZGV2L251bGwgMj4mMTsgcj0kPzsgZWNobyAkKChpKyspKSAkciAuCisJIiRfX3Byb2duYW1lIiAtYyAuL3ggPi9kZXYvbnVsbCAyPiYxOyByPSQ/OyBlY2hvICQoKGkrKykpICRyIC4KK2V4cGVjdGVkLXN0ZG91dDoKKwkwIDAgLgorCTEgMTI2IC4KKwkyIDQyIC4KKwkzIDEyNiAuCisJNCAxMjcgLgorCTUgMTI3IC4KKy0tLQorbmFtZTogZXhpdC1ldmFsLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGV2YWwgdnMgc3Vic3RpdHV0aW9uIGV4aXQgY29kZXMgKGtzaDkzIGFsaWtlKQorc3RkaW46CisJZXZhbCAkKGZhbHNlKQorCWVjaG8gQSAkPworCWV2YWwgJyAkKGZhbHNlKScKKwllY2hvIEIgJD8KKwlldmFsICIgJChmYWxzZSkiCisJZWNobyBDICQ/CisJZXZhbCAiZXZhbCAkKGZhbHNlKSIKKwllY2hvIEQgJD8KKwlldmFsICdldmFsICciJChmYWxzZSkiCisJZWNobyBFICQ/CisJSUZTPSIkSUZTOiIKKwlldmFsICQoZWNobyA6OyBmYWxzZSkKKwllY2hvIEYgJD8KK2V4cGVjdGVkLXN0ZG91dDoKKwlBIDAKKwlCIDEKKwlDIDAKKwlEIDAKKwlFIDAKKwlGIDAKKy0tLQorbmFtZTogdGVzdC1zdGx0LTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGVzdCBhbHNvIGNhbiBoYW5kbGUgc3RyaW5nMSA8IHN0cmluZzIgZXRjLgorc3RkaW46CisJdGVzdCAyMDA1LzEwLzA4ICc8JyAyMDA1LzA4LzIxICYmIGVjaG8gamEgfHwgZWNobyBuZWluCisJdGVzdCAyMDA1LzA4LzIxIFw8IDIwMDUvMTAvMDggJiYgZWNobyBqYSB8fCBlY2hvIG5laW4KKwl0ZXN0IDIwMDUvMTAvMDggJz4nIDIwMDUvMDgvMjEgJiYgZWNobyBqYSB8fCBlY2hvIG5laW4KKwl0ZXN0IDIwMDUvMDgvMjEgXD4gMjAwNS8xMC8wOCAmJiBlY2hvIGphIHx8IGVjaG8gbmVpbgorZXhwZWN0ZWQtc3Rkb3V0OgorCW5laW4KKwlqYQorCWphCisJbmVpbgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46ICEvdW5leHBlY3RlZCBvcC8KKy0tLQorbmFtZTogdGVzdC1wcmVjZWRlbmNlLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGEgd2VpcmQgcHJlY2VkZW5jZSBjYXNlIChhbmQgUE9TSVggZWNobykKK3N0ZGluOgorCXRlc3QgXCggLWYgPSAtZiBcKQorCXJ2PSQ/CisJdGVzdCAtbiAiJFBPU0hfVkVSU0lPTiIgfHwgc2V0IC1vIHNoCisJZWNobyAtZSAkcnYKK2V4cGVjdGVkLXN0ZG91dDoKKwktZSAwCistLS0KK25hbWU6IHRlc3Qtb3B0aW9uLTEKK2Rlc2NyaXB0aW9uOgorCVRlc3QgdGhlIHRlc3QgLW8gb3BlcmF0b3IKK3N0ZGluOgorCXJ1bnRlc3QoKSB7CisJCXRlc3QgLW8gJDE7IGVjaG8gJD8KKwkJWyAtbyAkMSBdOyBlY2hvICQ/CisJCVtbIC1vICQxIF1dOyBlY2hvICQ/CisJfQorCWlmX3Rlc3QoKSB7CisJCXRlc3QgLW8gJDEgLW8gLW8gISQxOyBlY2hvICQ/CisJCVsgLW8gJDEgLW8gLW8gISQxIF07IGVjaG8gJD8KKwkJW1sgLW8gJDEgfHwgLW8gISQxIF1dOyBlY2hvICQ/CisJCXRlc3QgLW8gPyQxOyBlY2hvICQ/CisJfQorCWVjaG8gMHkgJChpZl90ZXN0IHV0ZjgtbW9kZSkgPQorCWVjaG8gMG4gJChpZl90ZXN0IHV0ZjgtaGFjaykgPQorCWVjaG8gMT0gJChydW50ZXN0IHV0ZjgtaGFjaykgPQorCWVjaG8gMj0gJChydW50ZXN0ICF1dGY4LWhhY2spID0KKwllY2hvIDM9ICQocnVudGVzdCA/dXRmOC1oYWNrKSA9CisJc2V0ICtVCisJZWNobyAxKyAkKHJ1bnRlc3QgdXRmOC1tb2RlKSA9CisJZWNobyAyKyAkKHJ1bnRlc3QgIXV0ZjgtbW9kZSkgPQorCWVjaG8gMysgJChydW50ZXN0ID91dGY4LW1vZGUpID0KKwlzZXQgLVUKKwllY2hvIDEtICQocnVudGVzdCB1dGY4LW1vZGUpID0KKwllY2hvIDItICQocnVudGVzdCAhdXRmOC1tb2RlKSA9CisJZWNobyAzLSAkKHJ1bnRlc3QgP3V0ZjgtbW9kZSkgPQorCWVjaG8gPSBzaG9ydCBmbGFncyA9CisJZWNobyAweSAkKGlmX3Rlc3QgLVUpID0KKwllY2hvIDB5ICQoaWZfdGVzdCArVSkgPQorCWVjaG8gMG4gJChpZl90ZXN0IC1fKSA9CisJZWNobyAwbiAkKGlmX3Rlc3QgLVUtKSA9CisJZWNobyAxPSAkKHJ1bnRlc3QgLV8pID0KKwllY2hvIDI9ICQocnVudGVzdCAhLV8pID0KKwllY2hvIDM9ICQocnVudGVzdCA/LV8pID0KKwlzZXQgK1UKKwllY2hvIDErICQocnVudGVzdCAtVSkgPQorCWVjaG8gMisgJChydW50ZXN0ICEtVSkgPQorCWVjaG8gMysgJChydW50ZXN0ID8tVSkgPQorCWVjaG8gMSsgJChydW50ZXN0ICtVKSA9CisJZWNobyAyKyAkKHJ1bnRlc3QgIStVKSA9CisJZWNobyAzKyAkKHJ1bnRlc3QgPytVKSA9CisJc2V0IC1VCisJZWNobyAxLSAkKHJ1bnRlc3QgLVUpID0KKwllY2hvIDItICQocnVudGVzdCAhLVUpID0KKwllY2hvIDMtICQocnVudGVzdCA/LVUpID0KKwllY2hvIDEtICQocnVudGVzdCArVSkgPQorCWVjaG8gMi0gJChydW50ZXN0ICErVSkgPQorCWVjaG8gMy0gJChydW50ZXN0ID8rVSkgPQorZXhwZWN0ZWQtc3Rkb3V0OgorCTB5IDAgMCAwIDAgPQorCTBuIDEgMSAxIDEgPQorCTE9IDEgMSAxID0KKwkyPSAxIDEgMSA9CisJMz0gMSAxIDEgPQorCTErIDEgMSAxID0KKwkyKyAwIDAgMCA9CisJMysgMCAwIDAgPQorCTEtIDAgMCAwID0KKwkyLSAxIDEgMSA9CisJMy0gMCAwIDAgPQorCT0gc2hvcnQgZmxhZ3MgPQorCTB5IDAgMCAwIDAgPQorCTB5IDAgMCAwIDAgPQorCTBuIDEgMSAxIDEgPQorCTBuIDEgMSAxIDEgPQorCTE9IDEgMSAxID0KKwkyPSAxIDEgMSA9CisJMz0gMSAxIDEgPQorCTErIDEgMSAxID0KKwkyKyAwIDAgMCA9CisJMysgMCAwIDAgPQorCTErIDEgMSAxID0KKwkyKyAwIDAgMCA9CisJMysgMCAwIDAgPQorCTEtIDAgMCAwID0KKwkyLSAxIDEgMSA9CisJMy0gMCAwIDAgPQorCTEtIDAgMCAwID0KKwkyLSAxIDEgMSA9CisJMy0gMCAwIDAgPQorLS0tCituYW1lOiBta3NocmMtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB+Ly5ta3NocmMgd29ya3MgY29ycmVjdGx5LgorCVBhcnQgMTogdmVyaWZ5IHVzZXIgZW52aXJvbm1lbnQgaXMgbm90IHJlYWQgKGludGVybmFsKQorc3RkaW46CisJZWNobyB4ICRGTk9SRAorZXhwZWN0ZWQtc3Rkb3V0OgorCXgKKy0tLQorbmFtZTogbWtzaHJjLTJhCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IH4vLm1rc2hyYyB3b3JrcyBjb3JyZWN0bHkuCisJUGFydCAyOiB2ZXJpZnkgbWtzaHJjIGlzIG5vdCByZWFkIChub24taW50ZXJhY3RpdmUgc2hlbGxzKQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIi5ta3NocmMiCisJRk5PUkQ9NDIKK2Vudi1zZXR1cDogIUhPTUU9LiFFTlY9IQorc3RkaW46CisJZWNobyB4ICRGTk9SRAorZXhwZWN0ZWQtc3Rkb3V0OgorCXgKKy0tLQorbmFtZTogbWtzaHJjLTJiCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IH4vLm1rc2hyYyB3b3JrcyBjb3JyZWN0bHkuCisJUGFydCAyOiB2ZXJpZnkgbWtzaHJjIGNhbiBiZSByZWFkIChpbnRlcmFjdGl2ZSBzaGVsbHMpCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiLm1rc2hyYyIKKwlGTk9SRD00MgorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFIT01FPS4hRU5WPSFQUzE9IQorc3RkaW46CisJZWNobyB4ICRGTk9SRAorZXhwZWN0ZWQtc3Rkb3V0OgorCXggNDIKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8oIyApKi8KKy0tLQorbmFtZTogbWtzaHJjLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgfi8ubWtzaHJjIHdvcmtzIGNvcnJlY3RseS4KKwlQYXJ0IDM6IHZlcmlmeSBta3NocmMgY2FuIGJlIHR1cm5lZCBvZmYKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICIubWtzaHJjIgorCUZOT1JEPTQyCitlbnYtc2V0dXA6ICFIT01FPS4hRU5WPW5vbmV4aXN0YW50IQorc3RkaW46CisJZWNobyB4ICRGTk9SRAorZXhwZWN0ZWQtc3Rkb3V0OgorCXgKKy0tLQorbmFtZTogc2gtbW9kZS0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHNoIG1vZGUgdHVybnMgYnJhY2VleHBhbmQgb2ZmCisJYW5kIHRoYXQgdGhhdCB3b3JrcyBjb3JyZWN0bHkKK3N0ZGluOgorCXNldCAtbyBicmFjZWV4cGFuZAorCXNldCArbyBzaAorCVtbICQoc2V0ICtvKSA9PSAqQCgtbyBzaClAKHwgKikgXV0gJiYgZWNobyBzaCB8fCBlY2hvIG5vc2gKKwlbWyAkKHNldCArbykgPT0gKkAoLW8gYnJhY2VleHBhbmQpQCh8ICopIF1dICYmIGVjaG8gYnJleCB8fCBlY2hvIG5vYnJleAorCWVjaG8ge2EsYixjfQorCXNldCArbyBicmFjZWV4cGFuZAorCWVjaG8ge2EsYixjfQorCXNldCAtbyBicmFjZWV4cGFuZAorCWVjaG8ge2EsYixjfQorCXNldCAtbyBzaAorCWVjaG8ge2EsYixjfQorCVtbICQoc2V0ICtvKSA9PSAqQCgtbyBzaClAKHwgKikgXV0gJiYgZWNobyBzaCB8fCBlY2hvIG5vc2gKKwlbWyAkKHNldCArbykgPT0gKkAoLW8gYnJhY2VleHBhbmQpQCh8ICopIF1dICYmIGVjaG8gYnJleCB8fCBlY2hvIG5vYnJleAorCXNldCAtbyBicmFjZWV4cGFuZAorCWVjaG8ge2EsYixjfQorCVtbICQoc2V0ICtvKSA9PSAqQCgtbyBzaClAKHwgKikgXV0gJiYgZWNobyBzaCB8fCBlY2hvIG5vc2gKKwlbWyAkKHNldCArbykgPT0gKkAoLW8gYnJhY2VleHBhbmQpQCh8ICopIF1dICYmIGVjaG8gYnJleCB8fCBlY2hvIG5vYnJleAorZXhwZWN0ZWQtc3Rkb3V0OgorCW5vc2gKKwlicmV4CisJYSBiIGMKKwl7YSxiLGN9CisJYSBiIGMKKwl7YSxiLGN9CisJc2gKKwlub2JyZXgKKwlhIGIgYworCXNoCisJYnJleAorLS0tCituYW1lOiBzaC1tb2RlLTJhCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHNoIG1vZGUgaXMgKm5vdCogYXV0b21hdGljYWxseSB0dXJuZWQgb24KK2NhdGVnb3J5OiAhYmluc2gKK3N0ZGluOgorCWxuIC1zICIkX19wcm9nbmFtZSIga3NoCisJbG4gLXMgIiRfX3Byb2duYW1lIiBzaAorCWxuIC1zICIkX19wcm9nbmFtZSIgLi8ta3NoCisJbG4gLXMgIiRfX3Byb2duYW1lIiAuLy1zaAorCWZvciBzaGVsbCBpbiB7LC19eyxrfXNoOyBkbworCQlwcmludCAtLSAkc2hlbGwgJCguLyRzaGVsbCArbCAtYyBcCisJCSAgICAnW1sgJChzZXQgK28pID09ICpAKC1vIHNoKUAofCAqKSBdXSAmJiBlY2hvIHNoIHx8IGVjaG8gbm9zaCcpCisJZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCXNoIG5vc2gKKwlrc2ggbm9zaAorCS1zaCBub3NoCisJLWtzaCBub3NoCistLS0KK25hbWU6IHNoLW1vZGUtMmIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgc2ggbW9kZSAqaXMqIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uCitjYXRlZ29yeTogYmluc2gKK3N0ZGluOgorCWxuIC1zICIkX19wcm9nbmFtZSIga3NoCisJbG4gLXMgIiRfX3Byb2duYW1lIiBzaAorCWxuIC1zICIkX19wcm9nbmFtZSIgLi8ta3NoCisJbG4gLXMgIiRfX3Byb2duYW1lIiAuLy1zaAorCWZvciBzaGVsbCBpbiB7LC19eyxrfXNoOyBkbworCQlwcmludCAtLSAkc2hlbGwgJCguLyRzaGVsbCArbCAtYyBcCisJCSAgICAnW1sgJChzZXQgK28pID09ICpAKC1vIHNoKUAofCAqKSBdXSAmJiBlY2hvIHNoIHx8IGVjaG8gbm9zaCcpCisJZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCXNoIHNoCisJa3NoIG5vc2gKKwktc2ggc2gKKwkta3NoIG5vc2gKKy0tLQorbmFtZTogcGlwZWxpbmUtMQorZGVzY3JpcHRpb246CisJcGRrc2ggYnVnOiBsYXN0IGNvbW1hbmQgb2YgYSBwaXBlbGluZSBpcyBleGVjdXRlZCBpbiBhCisJc3Vic2hlbGwgLSBtYWtlIHN1cmUgaXQgc3RpbGwgaXMsIHNjcmlwdHMgZGVwZW5kIG9uIGl0CitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjeCIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmN5Igorc3RkaW46CisJZWNobyAqCisJZWNobyBhIHwgd2hpbGUgcmVhZCBkOyBkbworCQllY2hvICRkCisJCWVjaG8gJGQqCisJCWVjaG8gKgorCQlzZXQgLW8gbm9nbG9iCisJCWVjaG8gJGQqCisJCWVjaG8gKgorCWRvbmUKKwllY2hvICoKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmN4IGFiY3kKKwlhCisJYWJjeCBhYmN5CisJYWJjeCBhYmN5CisJYSoKKwkqCisJYWJjeCBhYmN5CistLS0KK25hbWU6IHBpcGVsaW5lLTIKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIHRoYXQgY28tcHJvY2Vzc2VzIHdvcmsgd2l0aCBUQ09NcywgVFBJUEVzIGFuZCBUUEFSRU5zCitzdGRpbjoKKwkiJF9fcHJvZ25hbWUiIC1jICdpPTEwMDsgZWNobyBoaSB8JiB3aGlsZSByZWFkIC1wIGxpbmU7IGRvIGVjaG8gIiQoKGkrKykpICRsaW5lIjsgZG9uZScKKwkiJF9fcHJvZ25hbWUiIC1jICdpPTIwMDsgZWNobyBoaSB8IGNhdCB8JiB3aGlsZSByZWFkIC1wIGxpbmU7IGRvIGVjaG8gIiQoKGkrKykpICRsaW5lIjsgZG9uZScKKwkiJF9fcHJvZ25hbWUiIC1jICdpPTMwMDsgKGVjaG8gaGkgfCBjYXQpIHwmIHdoaWxlIHJlYWQgLXAgbGluZTsgZG8gZWNobyAiJCgoaSsrKSkgJGxpbmUiOyBkb25lJworZXhwZWN0ZWQtc3Rkb3V0OgorCTEwMCBoaQorCTIwMCBoaQorCTMwMCBoaQorLS0tCituYW1lOiBwZXJzaXN0LWhpc3RvcnktMQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgcGVyc2lzdGVudCBoaXN0b3J5IHNhdmluZyB3b3JrcworY2F0ZWdvcnk6ICFuby1oaXN0ZmlsZQorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJY2F0IGhpc3QuZmlsZQorZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm46CisJL2NhdCBoaXN0LmZpbGUvCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogdHlwZXNldC1wYWRkaW5nLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGxlZnQvcmlnaHQganVzdGlmaWNhdGlvbiB3b3JrcyBhcyBwZXIgVEZNCitzdGRpbjoKKwl0eXBlc2V0IC1MMTAgbG49MGhhbGwwCisJdHlwZXNldCAtUjEwIHJuPTBoYWxsMAorCXR5cGVzZXQgLVpMMTAgbHo9MGhhbGwwCisJdHlwZXNldCAtWlIxMCByej0waGFsbDAKKwl0eXBlc2V0IC1aMTAgcng9IiBoYWxsbyAiCisJZWNobyAiPCRsbj4gPCRybj4gPCRsej4gPCRyej4gPCRyeD4iCitleHBlY3RlZC1zdGRvdXQ6CisJPDBoYWxsMCAgICA+IDwgICAgMGhhbGwwPiA8aGFsbDAgICAgID4gPDAwMDAwaGFsbDA+IDwwMDAwIGhhbGxvPgorLS0tCituYW1lOiB0eXBlc2V0LXBhZGRpbmctMgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgYmFzZS0hMTAgaW50ZWdlcnMgYXJlIHBhZGRlZCByaWdodAorc3RkaW46CisJdHlwZXNldCAtVXVpMTYgLUw5IGxuPTE2IzEKKwl0eXBlc2V0IC1VdWkxNiAtUjkgcm49MTYjMQorCXR5cGVzZXQgLVV1aTE2IC1aOSB6bj0xNiMxCisJdHlwZXNldCAtTDkgbHM9MTYjMQorCXR5cGVzZXQgLVI5IHJzPTE2IzEKKwl0eXBlc2V0IC1aOSB6cz0xNiMxCisJZWNobyAiPCRsbj4gPCRybj4gPCR6bj4gPCRscz4gPCRycz4gPCR6cz4iCitleHBlY3RlZC1zdGRvdXQ6CisJPDE2IzEgICAgID4gPCAgICAgMTYjMT4gPDE2IzAwMDAwMT4gPDE2IzEgICAgID4gPCAgICAgMTYjMT4gPDAwMDAwMTYjMT4KKy0tLQorbmFtZTogdXRmOGJvbS0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSBVVEYtOCBCeXRlIE9yZGVyIE1hcmsgaXMgaWdub3JlZCBhcyB0aGUgZmlyc3QKKwltdWx0aWJ5dGUgY2hhcmFjdGVyIG9mIHRoZSBzaGVsbCBpbnB1dCAod2l0aCAtYywgZnJvbSBzdGFuZGFyZAorCWlucHV0LCBhcyBmaWxlLCBvciBhcyBldmFsIGFyZ3VtZW50KSwgYnV0IG5vd2hlcmUgZWxzZQorIyBicmVha3Mgb24gTWFjIE9TWCAoSEZTKyBub24tc3RhbmRhcmQgVW5pY29kZSBjYW5vbmljYWwgZGVjb21wb3NpdGlvbikKK2NhdGVnb3J5OiAhb3M6ZGFyd2luCitzdGRpbjoKKwlta2RpciBmb28KKwlwcmludCAnIyEvYmluL3NoXG5lY2hvIG9obmUnID5mb28vZm5vcmQKKwlwcmludCAnIyEvYmluL3NoXG5lY2hvIG1pdCcgPmZvby/vu79mbm9yZAorCXByaW50ICfvu79mbm9yZFxuZm5vcmRcbu+7v2Zub3JkXG5mbm9yZCcgPmZvby9iYXIKKwlwcmludCBldmFsIFwnJ++7v2Zub3JkXG5mbm9yZFxu77u/Zm5vcmRcbmZub3JkJ1wnID5mb28vem9vCisJc2V0IC1BIGFuemFobCAtLSBmb28vKgorCWVjaG8gZ290ICR7I2FuemFobFsqXX0gZmlsZXMKKwljaG1vZCAreCBmb28vKgorCWV4cG9ydCBQQVRIPSQocHdkKS9mb286JFBBVEgKKwkiJF9fcHJvZ25hbWUiIC1jICfvu79mbm9yZCcKKwllY2hvID0KKwkiJF9fcHJvZ25hbWUiIC1jICfvu79mbm9yZDsgZm5vcmQ7IO+7v2Zub3JkOyBmbm9yZCcKKwllY2hvID0KKwkiJF9fcHJvZ25hbWUiIGZvby9iYXIKKwllY2hvID0KKwkiJF9fcHJvZ25hbWUiIDxmb28vYmFyCisJZWNobyA9CisJIiRfX3Byb2duYW1lIiBmb28vem9vCisJZWNobyA9CisJIiRfX3Byb2duYW1lIiAtYyAnZWNobyDvu786ICQo77u/Zm5vcmQpJworCXJtIC1yZiBmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwlnb3QgNCBmaWxlcworCW9obmUKKwk9CisJb2huZQorCW9obmUKKwltaXQKKwlvaG5lCisJPQorCW9obmUKKwlvaG5lCisJbWl0CisJb2huZQorCT0KKwlvaG5lCisJb2huZQorCW1pdAorCW9obmUKKwk9CisJb2huZQorCW9obmUKKwltaXQKKwlvaG5lCisJPQorCe+7vzogbWl0CistLS0KK25hbWU6IHV0Zjhib20tMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB3ZSBjYW4gZXhlY3V0ZSBCT00tc2hlYmFuZ3MgKGZhaWx1cmVzIG5vdCBmYXRhbCkKKwlYWFggaWYgdGhlIE9TIGNhbiBhbHJlYWR5IGV4ZWN1dGUgdGhlbSwgd2UgbG9zZQorCW5vdGU6IGN5Z3dpbiBleGVjdmUoMikgZG9lc24ndCByZXR1cm4gdG8gdXMgd2l0aCBFTk9FWEVDLCB3ZSBsb3NlCisJbm90ZTogVWx0cml4IHBlcmw1IHQ0IHJldHVybnMgNjUyODAgKGV4aXQtY29kZSAyNTUpIGFuZCBubyB0ZXh0CitjYXRlZ29yeTogIW9zOmN5Z3dpbiwhb3M6dXdpbi1udCwhb3M6dWx0cml4LCFzbWtzaAorZW52LXNldHVwOiAhRk9PPUJBUiEKK3N0ZGluOgorCXByaW50ICcjISciJF9fcHJvZ25hbWUiJ1xucHJpbnQgIjEgYT0kRU5We0ZPT30iOycgPnQxCisJcHJpbnQgJ++7vyMhJyIkX19wcm9nbmFtZSInXG5wcmludCAiMiBhPSRFTlZ7Rk9PfSI7JyA+dDIKKwlwcmludCAnIyEnIiRfX3BlcmxuYW1lIidcbnByaW50ICIzIGE9JEVOVntGT099XG4iOycgPnQzCisJcHJpbnQgJ++7vyMhJyIkX19wZXJsbmFtZSInXG5wcmludCAiNCBhPSRFTlZ7Rk9PfVxuIjsnID50NAorCWNobW9kICt4IHQ/CisJLi90MQorCS4vdDIKKwkuL3QzCisJLi90NAorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgYT0vbm9uZXhpc3RhbnR7Rk9PfQorCTIgYT0vbm9uZXhpc3RhbnR7Rk9PfQorCTMgYT1CQVIKKwk0IGE9QkFSCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvKFVucmVjb2duaXplZCBjaGFyYWN0ZXIgLi4uLiBpZ25vcmVkIGF0IFwuLnQ0IGxpbmUgMSkqLworLS0tCituYW1lOiB1dGY4Ym9tLTMKK2Rlc2NyaXB0aW9uOgorCVJlYWRpbmcgdGhlIFVURi04IEJPTSBzaG91bGQgZW5hYmxlIHRoZSB1dGY4LW1vZGUgZmxhZworc3RkaW46CisJIiRfX3Byb2duYW1lIiAtYyAnOjsgaWYgW1sgJC0gPSAqVSogXV07IHRoZW4gZWNobyAxIG9uOyBlbHNlIGVjaG8gMSBvZmY7IGZpJworCSIkX19wcm9nbmFtZSIgLWMgJ++7vzo7IGlmIFtbICQtID0gKlUqIF1dOyB0aGVuIGVjaG8gMiBvbjsgZWxzZSBlY2hvIDIgb2ZmOyBmaScKK2V4cGVjdGVkLXN0ZG91dDoKKwkxIG9mZgorCTIgb24KKy0tLQorbmFtZTogdXRmOG9wdC0xYQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgdXRmOC1tb2RlIGZsYWcgaXMgbm90IHNldCBhdCBub24taW50ZXJhY3RpdmUgc3RhcnR1cAorY2F0ZWdvcnk6ICFvczpocHV4CitlbnYtc2V0dXA6ICFQUzE9IVBTMj0hTENfQ1RZUEU9ZW5fVVMuVVRGLTghCitzdGRpbjoKKwlpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbgorCQllY2hvIGlzIHNldAorCWVsc2UKKwkJZWNobyBpcyBub3Qgc2V0CisJZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwlpcyBub3Qgc2V0CistLS0KK25hbWU6IHV0ZjhvcHQtMWIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIHV0ZjgtbW9kZSBmbGFnIGlzIG5vdCBzZXQgYXQgbm9uLWludGVyYWN0aXZlIHN0YXJ0dXAKK2NhdGVnb3J5OiBvczpocHV4CitlbnYtc2V0dXA6ICFQUzE9IVBTMj0hTENfQ1RZUEU9ZW5fVVMudXRmOCEKK3N0ZGluOgorCWlmIFtbICQtID0gKlUqIF1dOyB0aGVuCisJCWVjaG8gaXMgc2V0CisJZWxzZQorCQllY2hvIGlzIG5vdCBzZXQKKwlmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCWlzIG5vdCBzZXQKKy0tLQorbmFtZTogdXRmOG9wdC0yYQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgdXRmOC1tb2RlIGZsYWcgaXMgc2V0IGF0IGludGVyYWN0aXZlIHN0YXJ0dXAuCisJLURNS1NIX0FTU1VNRV9VVEY4PTAgPT4gZXhwZWN0ZWQgZmFpbHVyZSwgcGxlYXNlIGlnbm9yZQorCS1ETUtTSF9BU1NVTUVfVVRGOD0xID0+IG5vdCBleHBlY3RlZCwgcGxlYXNlIGludmVzdGlnYXRlCisJLVVNS1NIX0FTU1VNRV9VVEY4ID0+IG5vdCBleHBlY3RlZCwgYnV0IGlmIHlvdXIgT1MgaXMgb2xkLAorCSB0cnkgcGFzc2luZyBIQVZFX1NFVExPQ0FMRV9DVFlQRT0wIHRvIEJ1aWxkLnNoCitjYXRlZ29yeTogIW9zOmhwdXgKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhUFMxPSFQUzI9IUxDX0NUWVBFPWVuX1VTLlVURi04IQorc3RkaW46CisJaWYgW1sgJC0gPSAqVSogXV07IHRoZW4KKwkJZWNobyBpcyBzZXQKKwllbHNlCisJCWVjaG8gaXMgbm90IHNldAorCWZpCitleHBlY3RlZC1zdGRvdXQ6CisJaXMgc2V0CitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvKCMgKSovCistLS0KK25hbWU6IHV0ZjhvcHQtMmIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIHV0ZjgtbW9kZSBmbGFnIGlzIHNldCBhdCBpbnRlcmFjdGl2ZSBzdGFydHVwCisJRXhwZWN0ZWQgZmFpbHVyZSBpZiAtRE1LU0hfQVNTVU1FX1VURjg9MAorY2F0ZWdvcnk6IG9zOmhwdXgKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhUFMxPSFQUzI9IUxDX0NUWVBFPWVuX1VTLnV0ZjghCitzdGRpbjoKKwlpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbgorCQllY2hvIGlzIHNldAorCWVsc2UKKwkJZWNobyBpcyBub3Qgc2V0CisJZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwlpcyBzZXQKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8oIyApKi8KKy0tLQorbmFtZTogdXRmOG9wdC0zCitkZXNjcmlwdGlvbjoKKwlFbnN1cmUgwrFVIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgaG9ub3VyZWQKKwkodGhpcyB0ZXN0IG1heSBwYXNzIGZhbHNlbHkgZGVwZW5kaW5nIG9uIENQUEZMQUdTKQorc3RkaW46CisJZXhwb3J0IGk9MAorCWNvZGU9J2lmIFtbICQtID0gKlUqIF1dOyB0aGVuIGVjaG8gJGkgb247IGVsc2UgZWNobyAkaSBvZmY7IGZpJworCWxldCBpKys7ICIkX19wcm9nbmFtZSIgLVUgLWMgIiRjb2RlIgorCWxldCBpKys7ICIkX19wcm9nbmFtZSIgK1UgLWMgIiRjb2RlIgorCWxldCBpKys7ICIkX19wcm9nbmFtZSIgLVUgLWljICIkY29kZSIKKwlsZXQgaSsrOyAiJF9fcHJvZ25hbWUiICtVIC1pYyAiJGNvZGUiCisJZWNobyAkKCgrK2kpKSBkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJMSBvbgorCTIgb2ZmCisJMyBvbgorCTQgb2ZmCisJNSBkb25lCistLS0KK25hbWU6IGFsaWFzZXMtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgYnVpbHQtaW4gc2hlbGwgYWxpYXNlcyBhcmUgb2theQorY2F0ZWdvcnk6ICFhcmdlCitzdGRpbjoKKwlhbGlhcworCXR5cGVzZXQgLWYKK2V4cGVjdGVkLXN0ZG91dDoKKwlhdXRvbG9hZD0ndHlwZXNldCAtZnUnCisJZnVuY3Rpb25zPSd0eXBlc2V0IC1mJworCWhhc2g9J2FsaWFzIC10JworCWhpc3Rvcnk9J2ZjIC1sJworCWludGVnZXI9J3R5cGVzZXQgLWknCisJbG9jYWw9dHlwZXNldAorCWxvZ2luPSdleGVjIGxvZ2luJworCW5hbWVyZWY9J3R5cGVzZXQgLW4nCisJbm9odXA9J25vaHVwICcKKwlyPSdmYyAtZSAtJworCXNvdXJjZT0nUEFUSD0kUEFUSDouIGNvbW1hbmQgLicKKwlzdG9wPSdraWxsIC1TVE9QJworCXN1c3BlbmQ9J2tpbGwgLVNUT1AgJCQnCisJdHlwZT0nd2hlbmNlIC12JworLS0tCituYW1lOiBhbGlhc2VzLTEtaGFydHo0CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBidWlsdC1pbiBzaGVsbCBhbGlhc2VzIGFyZSBva2F5CitjYXRlZ29yeTogYXJnZQorc3RkaW46CisJYWxpYXMKKwl0eXBlc2V0IC1mCitleHBlY3RlZC1zdGRvdXQ6CisJYXV0b2xvYWQ9J3R5cGVzZXQgLWZ1JworCWZ1bmN0aW9ucz0ndHlwZXNldCAtZicKKwloYXNoPSdhbGlhcyAtdCcKKwloaXN0b3J5PSdmYyAtbCcKKwlpbnRlZ2VyPSd0eXBlc2V0IC1pJworCWxvY2FsPXR5cGVzZXQKKwlsb2dpbj0nZXhlYyBsb2dpbicKKwluYW1lcmVmPSd0eXBlc2V0IC1uJworCW5vaHVwPSdub2h1cCAnCisJcj0nZmMgLWUgLScKKwlzb3VyY2U9J1BBVEg9JFBBVEg6LiBjb21tYW5kIC4nCisJdHlwZT0nd2hlbmNlIC12JworLS0tCituYW1lOiBhbGlhc2VzLTJhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiDigJxzZXQgLW8gc2jigJ0gZGlzYWJsZXMgYnVpbHQtaW4gYWxpYXNlcyAoZXhjZXB0IGEgZmV3KQorY2F0ZWdvcnk6IGRpc2FibGVkCithcmd1bWVudHM6ICEtbyFzaCEKK3N0ZGluOgorCWFsaWFzCisJdHlwZXNldCAtZgorZXhwZWN0ZWQtc3Rkb3V0OgorCWludGVnZXI9J3R5cGVzZXQgLWknCisJbG9jYWw9dHlwZXNldAorLS0tCituYW1lOiBhbGlhc2VzLTNhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBydW5uaW5nIGFzIHNoIGRpc2FibGVzIGJ1aWx0LWluIGFsaWFzZXMgKGV4Y2VwdCBhIGZldykKK2NhdGVnb3J5OiBkaXNhYmxlZAorYXJndW1lbnRzOiAhLW8hc2ghCitzdGRpbjoKKwljcCAiJF9fcHJvZ25hbWUiIHNoCisJLi9zaCAtYyAnYWxpYXM7IHR5cGVzZXQgLWYnCisJcm0gLWYgc2gKK2V4cGVjdGVkLXN0ZG91dDoKKwlpbnRlZ2VyPSd0eXBlc2V0IC1pJworCWxvY2FsPXR5cGVzZXQKKy0tLQorbmFtZTogYWxpYXNlcy0yYgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYg4oCcc2V0IC1vIHNo4oCdIGRvZXMgbm90IGluZmx1ZW5jZSBidWlsdC1pbiBhbGlhc2VzCitjYXRlZ29yeTogIWFyZ2UKK2FyZ3VtZW50czogIS1vIXNoIQorc3RkaW46CisJYWxpYXMKKwl0eXBlc2V0IC1mCitleHBlY3RlZC1zdGRvdXQ6CisJYXV0b2xvYWQ9J3R5cGVzZXQgLWZ1JworCWZ1bmN0aW9ucz0ndHlwZXNldCAtZicKKwloYXNoPSdhbGlhcyAtdCcKKwloaXN0b3J5PSdmYyAtbCcKKwlpbnRlZ2VyPSd0eXBlc2V0IC1pJworCWxvY2FsPXR5cGVzZXQKKwlsb2dpbj0nZXhlYyBsb2dpbicKKwluYW1lcmVmPSd0eXBlc2V0IC1uJworCW5vaHVwPSdub2h1cCAnCisJcj0nZmMgLWUgLScKKwlzb3VyY2U9J1BBVEg9JFBBVEg6LiBjb21tYW5kIC4nCisJc3RvcD0na2lsbCAtU1RPUCcKKwlzdXNwZW5kPSdraWxsIC1TVE9QICQkJworCXR5cGU9J3doZW5jZSAtdicKKy0tLQorbmFtZTogYWxpYXNlcy0zYgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgcnVubmluZyBhcyBzaCBkb2VzIG5vdCBpbmZsdWVuY2UgYnVpbHQtaW4gYWxpYXNlcworY2F0ZWdvcnk6ICFhcmdlCithcmd1bWVudHM6ICEtbyFzaCEKK3N0ZGluOgorCWNwICIkX19wcm9nbmFtZSIgc2gKKwkuL3NoIC1jICdhbGlhczsgdHlwZXNldCAtZicKKwlybSAtZiBzaAorZXhwZWN0ZWQtc3Rkb3V0OgorCWF1dG9sb2FkPSd0eXBlc2V0IC1mdScKKwlmdW5jdGlvbnM9J3R5cGVzZXQgLWYnCisJaGFzaD0nYWxpYXMgLXQnCisJaGlzdG9yeT0nZmMgLWwnCisJaW50ZWdlcj0ndHlwZXNldCAtaScKKwlsb2NhbD10eXBlc2V0CisJbG9naW49J2V4ZWMgbG9naW4nCisJbmFtZXJlZj0ndHlwZXNldCAtbicKKwlub2h1cD0nbm9odXAgJworCXI9J2ZjIC1lIC0nCisJc291cmNlPSdQQVRIPSRQQVRIOi4gY29tbWFuZCAuJworCXN0b3A9J2tpbGwgLVNUT1AnCisJc3VzcGVuZD0na2lsbCAtU1RPUCAkJCcKKwl0eXBlPSd3aGVuY2UgLXYnCistLS0KK25hbWU6IGFsaWFzZXMtMmItaGFydHo0CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiDigJxzZXQgLW8gc2jigJ0gZG9lcyBub3QgaW5mbHVlbmNlIGJ1aWx0LWluIGFsaWFzZXMKK2NhdGVnb3J5OiBhcmdlCithcmd1bWVudHM6ICEtbyFzaCEKK3N0ZGluOgorCWFsaWFzCisJdHlwZXNldCAtZgorZXhwZWN0ZWQtc3Rkb3V0OgorCWF1dG9sb2FkPSd0eXBlc2V0IC1mdScKKwlmdW5jdGlvbnM9J3R5cGVzZXQgLWYnCisJaGFzaD0nYWxpYXMgLXQnCisJaGlzdG9yeT0nZmMgLWwnCisJaW50ZWdlcj0ndHlwZXNldCAtaScKKwlsb2NhbD10eXBlc2V0CisJbG9naW49J2V4ZWMgbG9naW4nCisJbmFtZXJlZj0ndHlwZXNldCAtbicKKwlub2h1cD0nbm9odXAgJworCXI9J2ZjIC1lIC0nCisJc291cmNlPSdQQVRIPSRQQVRIOi4gY29tbWFuZCAuJworCXR5cGU9J3doZW5jZSAtdicKKy0tLQorbmFtZTogYWxpYXNlcy0zYi1oYXJ0ejQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHJ1bm5pbmcgYXMgc2ggZG9lcyBub3QgaW5mbHVlbmNlIGJ1aWx0LWluIGFsaWFzZXMKK2NhdGVnb3J5OiBhcmdlCithcmd1bWVudHM6ICEtbyFzaCEKK3N0ZGluOgorCWNwICIkX19wcm9nbmFtZSIgc2gKKwkuL3NoIC1jICdhbGlhczsgdHlwZXNldCAtZicKKwlybSAtZiBzaAorZXhwZWN0ZWQtc3Rkb3V0OgorCWF1dG9sb2FkPSd0eXBlc2V0IC1mdScKKwlmdW5jdGlvbnM9J3R5cGVzZXQgLWYnCisJaGFzaD0nYWxpYXMgLXQnCisJaGlzdG9yeT0nZmMgLWwnCisJaW50ZWdlcj0ndHlwZXNldCAtaScKKwlsb2NhbD10eXBlc2V0CisJbG9naW49J2V4ZWMgbG9naW4nCisJbmFtZXJlZj0ndHlwZXNldCAtbicKKwlub2h1cD0nbm9odXAgJworCXI9J2ZjIC1lIC0nCisJc291cmNlPSdQQVRIPSRQQVRIOi4gY29tbWFuZCAuJworCXR5cGU9J3doZW5jZSAtdicKKy0tLQorbmFtZTogYWxpYXNlcy1mdW5jZGVmLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIFBPU0lYIGZ1bmN0aW9ucyB0YWtlIHByZWNlZGVuY2VzIG92ZXIgYWxpYXNlcworc3RkaW46CisJYWxpYXMgZm9vPSdlY2hvIG1ha3JvJworCWZvbygpIHsKKwkJZWNobyBmdW5rdGlvbgorCX0KKwlmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwlmdW5rdGlvbgorLS0tCituYW1lOiBhbGlhc2VzLWZ1bmNkZWYtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgUE9TSVggZnVuY3Rpb25zIHRha2UgcHJlY2VkZW5jZXMgb3ZlciBhbGlhc2VzCitzdGRpbjoKKwlhbGlhcyBmb289J2VjaG8gbWFrcm8nCisJZm9vICgpIHsKKwkJZWNobyBmdW5rdGlvbgorCX0KKwlmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwlmdW5rdGlvbgorLS0tCituYW1lOiBhbGlhc2VzLWZ1bmNkZWYtMworZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgYWxpYXNlcyB0YWtlIHByZWNlZGVuY2VzIG92ZXIgS29ybiBmdW5jdGlvbnMKK3N0ZGluOgorCWFsaWFzIGZvbz0nZWNobyBtYWtybycKKwlmdW5jdGlvbiBmb28geworCQllY2hvIGZ1bmt0aW9uCisJfQorCWZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCW1ha3JvCistLS0KK25hbWU6IGFycmF5cy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBLb3JuIFNoZWxsIGFycmF5cyB3b3JrIGFzIGV4cGVjdGVkCitzdGRpbjoKKwl2PSJjIGQiCisJc2V0IC1BIGZvbyAtLSBhIFwkdiAiJHYiICckdicgYgorCWVjaG8gIiR7I2Zvb1sqXX18JHtmb29bMF19fCR7Zm9vWzFdfXwke2Zvb1syXX18JHtmb29bM119fCR7Zm9vWzRdfXwiCitleHBlY3RlZC1zdGRvdXQ6CisJNXxhfCR2fGMgZHwkdnxifAorLS0tCituYW1lOiBhcnJheXMtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgYmFzaC1zdHlsZSBhcnJheXMgd29yayBhcyBleHBlY3RlZAorY2F0ZWdvcnk6ICFzbWtzaAorc3RkaW46CisJdj0iYyBkIgorCWZvbz0oYSBcJHYgIiR2IiAnJHYnIGIpCisJZWNobyAiJHsjZm9vWypdfXwke2Zvb1swXX18JHtmb29bMV19fCR7Zm9vWzJdfXwke2Zvb1szXX18JHtmb29bNF19fCIKK2V4cGVjdGVkLXN0ZG91dDoKKwk1fGF8JHZ8YyBkfCR2fGJ8CistLS0KK25hbWU6IGFycmF5cy0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBhcnJheSBib3VuZHMgYXJlIHVpbnQzMl90CitzdGRpbjoKKwlzZXQgLUEgZm9vIGEgYiBjCisJZm9vWzQwOTddPWQKKwlmb29bMjE0NzQ4MzYzN109ZQorCWVjaG8gJHtmb29bKl19CisJZm9vWy0xXT1mCisJZWNobyAke2Zvb1s0Mjk0OTY3Mjk1XX0gZyAke2Zvb1sqXX0KK2V4cGVjdGVkLXN0ZG91dDoKKwlhIGIgYyBkIGUKKwlmIGcgYSBiIGMgZCBlIGYKKy0tLQorbmFtZTogYXJyYXlzLTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIEtvcm4gU2hlbGwgYXJyYXlzIHdpdGggc3BlY2lmaWVkIGluZGljZXMgd29yayBhcyBleHBlY3RlZAorY2F0ZWdvcnk6ICFzbWtzaAorc3RkaW46CisJdj0iYyBkIgorCXNldCAtQSBmb28gLS0gWzFdPVwkdiBbMl09IiR2IiBbNF09JyR2JyBbMF09YSBbNV09YgorCWVjaG8gIiR7I2Zvb1sqXX18JHtmb29bMF19fCR7Zm9vWzFdfXwke2Zvb1syXX18JHtmb29bM119fCR7Zm9vWzRdfXwke2Zvb1s1XX18IgorZXhwZWN0ZWQtc3Rkb3V0OgorCTV8YXwkdnxjIGR8fCR2fGJ8CistLS0KK25hbWU6IGFycmF5cy01CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBiYXNoLXN0eWxlIGFycmF5cyB3aXRoIHNwZWNpZmllZCBpbmRpY2VzIHdvcmsgYXMgZXhwZWN0ZWQKK2NhdGVnb3J5OiAhc21rc2gKK3N0ZGluOgorCXY9ImMgZCIKKwlmb289KFsxXT1cJHYgWzJdPSIkdiIgWzRdPSckdicgWzBdPWEgWzVdPWIpCisJZWNobyAiJHsjZm9vWypdfXwke2Zvb1swXX18JHtmb29bMV19fCR7Zm9vWzJdfXwke2Zvb1szXX18JHtmb29bNF19fCR7Zm9vWzVdfXwiCisJeD0oWzEyOF09Zm9vIGJhciBiYXopCisJZWNobyBrPSAkeyF4WypdfSAuCisJZWNobyB2PSAke3hbKl19IC4KK2V4cGVjdGVkLXN0ZG91dDoKKwk1fGF8JHZ8YyBkfHwkdnxifAorCWs9IDEyOCAxMjkgMTMwIC4KKwl2PSBmb28gYmFyIGJheiAuCistLS0KK25hbWU6IGFycmF5cy02CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiB3ZSBjYW4gZ2V0IHRoZSBhcnJheSBrZXlzIChpbmRpY2VzKSBmb3IgaW5kZXhlZCBhcnJheXMsCisJS29ybiBzaGVsbCBzdHlsZQorc3RkaW46CisJb2YoKSB7CisJCWk9MAorCQlmb3IgeCBpbiAiJEAiOyBkbworCQkJZWNobyAtbiAiJCgoaSsrKSk8JHg+IgorCQlkb25lCisJCWVjaG8KKwl9CisJZm9vWzFdPWVpbnMKKwlzZXQgfCBncmVwICdeZm9vJworCWVjaG8gPQorCWZvb1swXT16d2VpCisJZm9vWzRdPWRyZWkKKwlzZXQgfCBncmVwICdeZm9vJworCWVjaG8gPQorCWVjaG8gYSAkKG9mICR7Zm9vWypdfSkgPSAkKG9mICR7YmFyWypdfSkgYQorCWVjaG8gYiAkKG9mICIke2Zvb1sqXX0iKSA9ICQob2YgIiR7YmFyWypdfSIpIGIKKwllY2hvIGMgJChvZiAke2Zvb1tAXX0pID0gJChvZiAke2JhcltAXX0pIGMKKwllY2hvIGQgJChvZiAiJHtmb29bQF19IikgPSAkKG9mICIke2JhcltAXX0iKSBkCisJZWNobyBlICQob2YgJHshZm9vWypdfSkgPSAkKG9mICR7IWJhclsqXX0pIGUKKwllY2hvIGYgJChvZiAiJHshZm9vWypdfSIpID0gJChvZiAiJHshYmFyWypdfSIpIGYKKwllY2hvIGcgJChvZiAkeyFmb29bQF19KSA9ICQob2YgJHshYmFyW0BdfSkgZworCWVjaG8gaCAkKG9mICIkeyFmb29bQF19IikgPSAkKG9mICIkeyFiYXJbQF19IikgaAorZXhwZWN0ZWQtc3Rkb3V0OgorCWZvb1sxXT1laW5zCisJPQorCWZvb1swXT16d2VpCisJZm9vWzFdPWVpbnMKKwlmb29bNF09ZHJlaQorCT0KKwlhIDA8endlaT4xPGVpbnM+MjxkcmVpPiA9IGEKKwliIDA8endlaSBlaW5zIGRyZWk+ID0gMDw+IGIKKwljIDA8endlaT4xPGVpbnM+MjxkcmVpPiA9IGMKKwlkIDA8endlaT4xPGVpbnM+MjxkcmVpPiA9IGQKKwllIDA8MD4xPDE+Mjw0PiA9IGUKKwlmIDA8MCAxIDQ+ID0gMDw+IGYKKwlnIDA8MD4xPDE+Mjw0PiA9IGcKKwloIDA8MD4xPDE+Mjw0PiA9IGgKKy0tLQorbmFtZTogYXJyYXlzLTcKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHdlIGNhbiBnZXQgdGhlIGFycmF5IGtleXMgKGluZGljZXMpIGZvciBpbmRleGVkIGFycmF5cywKKwlLb3JuIHNoZWxsIHN0eWxlLCBpbiBzb21lIGNvcm5lciBjYXNlcworc3RkaW46CisJZWNobyAhYXJ6OiAkeyFhcnp9CisJZWNobyAhYXJ6WzBdOiAkeyFhcnpbMF19CisJZWNobyAhYXJ6WzFdOiAkeyFhcnpbMV19CisJYXJ6PWZvbworCWVjaG8gIWFyejogJHshYXJ6fQorCWVjaG8gIWFyelswXTogJHshYXJ6WzBdfQorCWVjaG8gIWFyelsxXTogJHshYXJ6WzFdfQorCXVuc2V0IGFyegorCWVjaG8gIWFyejogJHshYXJ6fQorCWVjaG8gIWFyelswXTogJHshYXJ6WzBdfQorCWVjaG8gIWFyelsxXTogJHshYXJ6WzFdfQorZXhwZWN0ZWQtc3Rkb3V0OgorCSFhcno6IDAKKwkhYXJ6WzBdOgorCSFhcnpbMV06CisJIWFyejogYXJ6CisJIWFyelswXTogMAorCSFhcnpbMV06CisJIWFyejogMAorCSFhcnpbMF06CisJIWFyelsxXToKKy0tLQorbmFtZTogYXJyYXlzLTgKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHNvbWUgYmVoYXZpb3VyYWwgcnVsZXMgZm9yIGFycmF5cy4KK3N0ZGluOgorCWZuYSgpIHsKKwkJc2V0IC1BIGFhIDkKKwl9CisJZm5iKCkgeworCQl0eXBlc2V0IGFiCisJCXNldCAtQSBhYiA5CisJfQorCWZuYygpIHsKKwkJdHlwZXNldCBhYworCQlzZXQgLUEgYWMgOTEKKwkJdW5zZXQgYWMKKwkJc2V0IC1BIGFjIDkyCisJfQorCWZuZCgpIHsKKwkJc2V0ICtBIGFkIDkKKwl9CisJZm5lKCkgeworCQl1bnNldCBhZQorCQlzZXQgK0EgYWUgOQorCX0KKwlmbmYoKSB7CisJCXVuc2V0IGFmWzBdCisJCXNldCArQSBhZiA5CisJfQorCWZuZygpIHsKKwkJdW5zZXQgYWdbKl0KKwkJc2V0ICtBIGFnIDkKKwl9CisJc2V0IC1BIGFhIDEgMgorCXNldCAtQSBhYiAxIDIKKwlzZXQgLUEgYWMgMSAyCisJc2V0IC1BIGFkIDEgMgorCXNldCAtQSBhZSAxIDIKKwlzZXQgLUEgYWYgMSAyCisJc2V0IC1BIGFnIDEgMgorCXNldCAtQSBhaCAxIDIKKwl0eXBlc2V0IC1aMyBhYSBhYiBhYyBhZCBhZSBhZiBhZworCXByaW50IDFhICR7YWFbKl19IC4KKwlwcmludCAxYiAke2FiWypdfSAuCisJcHJpbnQgMWMgJHthY1sqXX0gLgorCXByaW50IDFkICR7YWRbKl19IC4KKwlwcmludCAxZSAke2FlWypdfSAuCisJcHJpbnQgMWYgJHthZlsqXX0gLgorCXByaW50IDFnICR7YWdbKl19IC4KKwlwcmludCAxaCAke2FoWypdfSAuCisJZm5hCisJZm5iCisJZm5jCisJZm5kCisJZm5lCisJZm5mCisJZm5nCisJdHlwZXNldCAtWjUgYWhbKl0KKwlwcmludCAyYSAke2FhWypdfSAuCisJcHJpbnQgMmIgJHthYlsqXX0gLgorCXByaW50IDJjICR7YWNbKl19IC4KKwlwcmludCAyZCAke2FkWypdfSAuCisJcHJpbnQgMmUgJHthZVsqXX0gLgorCXByaW50IDJmICR7YWZbKl19IC4KKwlwcmludCAyZyAke2FnWypdfSAuCisJcHJpbnQgMmggJHthaFsqXX0gLgorZXhwZWN0ZWQtc3Rkb3V0OgorCTFhIDAwMSAwMDIgLgorCTFiIDAwMSAwMDIgLgorCTFjIDAwMSAwMDIgLgorCTFkIDAwMSAwMDIgLgorCTFlIDAwMSAwMDIgLgorCTFmIDAwMSAwMDIgLgorCTFnIDAwMSAwMDIgLgorCTFoIDEgMiAuCisJMmEgOSAuCisJMmIgMDAxIDAwMiAuCisJMmMgOTIgLgorCTJkIDAwOSAwMDIgLgorCTJlIDkgLgorCTJmIDkgMDAyIC4KKwkyZyAwMDkgLgorCTJoIDAwMDAxIDAwMDAyIC4KKy0tLQorbmFtZTogdmFyZXhwYW5kLXN1YnN0ci0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBiYXNoLXN0eWxlIHN1YnN0cmluZyBleHBhbnNpb24gd29ya3MKKwl3aGVuIHVzaW5nIHBvc2l0aXZlIG51bWVyaWNzCitzdGRpbjoKKwl4PWFiY2RlZmdoaQorCXR5cGVzZXQgLWkgeT0xMjM0NTY3ODkKKwl0eXBlc2V0IC1pIDE2IHo9MTIzNDU2Nzg5CSMgMTYjNzViY2QxNQorCWVjaG8gYSB0JHt4OjI6Mn0gJHt5OjI6M30gJHt6OjI6M30gYQorCWVjaG8gYiAke3g6OjN9ICR7eTo6M30gJHt6OjozfSBiCisJZWNobyBjICR7eDoyOn0gJHt5OjI6fSAke3o6Mjp9IGMKKwllY2hvIGQgJHt4OjJ9ICR7eToyfSAke3o6Mn0gZAorCWVjaG8gZSAke3g6Mjo2fSAke3k6Mjo2fSAke3o6Mjo3fSBlCisJZWNobyBmICR7eDoyOjd9ICR7eToyOjd9ICR7ejoyOjh9IGYKKwllY2hvIGcgJHt4OjI6OH0gJHt5OjI6OH0gJHt6OjI6OX0gZworZXhwZWN0ZWQtc3Rkb3V0OgorCWEgdGNkIDM0NSAjNzUgYQorCWIgYWJjIDEyMyAxNiMgYgorCWMgYworCWQgY2RlZmdoaSAzNDU2Nzg5ICM3NWJjZDE1IGQKKwllIGNkZWZnaCAzNDU2NzggIzc1YmNkMSBlCisJZiBjZGVmZ2hpIDM0NTY3ODkgIzc1YmNkMTUgZgorCWcgY2RlZmdoaSAzNDU2Nzg5ICM3NWJjZDE1IGcKKy0tLQorbmFtZTogdmFyZXhwYW5kLXN1YnN0ci0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBiYXNoLXN0eWxlIHN1YnN0cmluZyBleHBhbnNpb24gd29ya3MKKwl3aGVuIHVzaW5nIG5lZ2F0aXZlIG51bWVyaWNzIG9yIGV4cHJlc3Npb25zCitzdGRpbjoKKwl4PWFiY2RlZmdoaQorCXR5cGVzZXQgLWkgeT0xMjM0NTY3ODkKKwl0eXBlc2V0IC1pIDE2IHo9MTIzNDU2Nzg5CSMgMTYjNzViY2QxNQorCW49MgorCWVjaG8gYSAke3g6JG46M30gJHt5OiRuOjN9ICR7ejokbjozfSBhCisJZWNobyBiICR7eDoobik6M30gJHt5OihuKTozfSAke3o6KG4pOjN9IGIKKwllY2hvIGMgJHt4OigtMik6MX0gJHt5OigtMik6MX0gJHt6OigtMik6MX0gYworCWVjaG8gZCB0JHt4OiBuOjJ9ICR7eTogbjozfSAke3o6IG46M30gZAorZXhwZWN0ZWQtc3Rkb3V0OgorCWEgY2RlIDM0NSAjNzUgYQorCWIgY2RlIDM0NSAjNzUgYgorCWMgaCA4IDEgYworCWQgdGNkIDM0NSAjNzUgZAorLS0tCituYW1lOiB2YXJleHBhbmQtc3Vic3RyLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgc29tZSB0aGluZ3MgdGhhdCB3b3JrIGluIGJhc2ggZmFpbC4KKwlUaGlzIGlzIGJ5IGRlc2lnbi4gQW5kIHRoYXQgc29tZSB0aGluZ3MgZmFpbCBpbiBib3RoLgorc3RkaW46CisJZXhwb3J0IHg9YWJjZGVmZ2hpIG49MgorCSIkX19wcm9nbmFtZSIgLWMgJ2VjaG8gdiR7eDoobil9eCcKKwkiJF9fcHJvZ25hbWUiIC1jICdlY2hvIHcke3g6IG59eCcKKwkiJF9fcHJvZ25hbWUiIC1jICdlY2hvIHgke3g6bn14JworCSIkX19wcm9nbmFtZSIgLWMgJ2VjaG8geSR7eDp9eCcKKwkiJF9fcHJvZ25hbWUiIC1jICdlY2hvIHoke3h9eCcKKwkiJF9fcHJvZ25hbWUiIC1jICd4PWFiY2RlZjt5PTEyMztlY2hvICR7eDoke3k6MjoxfToyfScgPi9kZXYvbnVsbCAyPiYxOyBlY2hvICQ/CitleHBlY3RlZC1zdGRvdXQ6CisJdmNkZWZnaGl4CisJd2NkZWZnaGl4CisJemFiY2RlZmdoaXgKKwkxCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkveDpuLipiYWQgc3Vic3RpdHV0aW9uLipcbi4qYmFkIHN1YnN0aXR1dGlvbi8KKy0tLQorbmFtZTogdmFyZXhwYW5kLXN1YnN0ci00CitkZXNjcmlwdGlvbjoKKwlDaGVjayBjb3JuZXIgY2FzZXMgZm9yIHN1YnN0cmluZyBleHBhbnNpb24KK3N0ZGluOgorCXg9YWJjZGVmZ2hpCisJaW50ZWdlciB5PTIKKwllY2hvIGEgJHt4Oih5ID09IDEgPyAyIDogMyk6NH0gYQorZXhwZWN0ZWQtc3Rkb3V0OgorCWEgZGVmZyBhCistLS0KK25hbWU6IHZhcmV4cGFuZC1zdWJzdHItNUEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgc3Vic3RyaW5nIGV4cGFuc2lvbnMgd29yayBvbiBjaGFyYWN0ZXJzCitzdGRpbjoKKwlzZXQgK1UKKwl4PW3DpGgKKwllY2hvIGEgJHt4OjoxfSAke3g6IC0xfSBhCisJZWNobyBiICR7eDo6M30gJHt4OiAtM30gYgorCWVjaG8gYyAke3g6MToyfSAke3g6IC0zOjJ9IGMKKwllY2hvIGQgJHsjeH0gZAorZXhwZWN0ZWQtc3Rkb3V0OgorCWEgbSBoIGEKKwliIG3DpCDDpGggYgorCWMgw6Qgw6QgYworCWQgNCBkCistLS0KK25hbWU6IHZhcmV4cGFuZC1zdWJzdHItNVcKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgc3Vic3RyaW5nIGV4cGFuc2lvbnMgd29yayBvbiBjaGFyYWN0ZXJzCitzdGRpbjoKKwlzZXQgLVUKKwl4PW3DpGgKKwllY2hvIGEgJHt4OjoxfSAke3g6IC0xfSBhCisJZWNobyBiICR7eDo6Mn0gJHt4OiAtMn0gYgorCWVjaG8gYyAke3g6MToxfSAke3g6IC0yOjF9IGMKKwllY2hvIGQgJHsjeH0gZAorZXhwZWN0ZWQtc3Rkb3V0OgorCWEgbSBoIGEKKwliIG3DpCDDpGggYgorCWMgw6Qgw6QgYworCWQgMyBkCistLS0KK25hbWU6IHZhcmV4cGFuZC1zdWJzdHItNgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBzdHJpbmcgc3Vic3RpdHV0aW9uIHdvcmtzIGNvcnJlY3RseQorc3RkaW46CisJZm9vPTEKKwliYXI9MgorCWJhej1xd2VydHl1aW9wCisJZWNobyBhICR7YmF6OiBmb286IGJhcn0KKwllY2hvIGIgJHtiYXo6IGZvbzogJGJhcn0KKwllY2hvIGMgJHtiYXo6ICRmb286IGJhcn0KKwllY2hvIGQgJHtiYXo6ICRmb286ICRiYXJ9CitleHBlY3RlZC1zdGRvdXQ6CisJYSB3ZQorCWIgd2UKKwljIHdlCisJZCB3ZQorLS0tCituYW1lOiB2YXJleHBhbmQtbnVsbC0xCitkZXNjcmlwdGlvbjoKKwlFbnN1cmUgZW1wdHkgc3RyaW5ncyBleHBhbmQgZW1wdGlseQorc3RkaW46CisJcHJpbnQgeCAke2F9ICR7Yn0geQorCXByaW50IHogJHthIz99ICR7YiU/fSB3CisJcHJpbnQgdiAke2E9fSAke2IvYy9kfSB1CitleHBlY3RlZC1zdGRvdXQ6CisJeCB5CisJeiB3CisJdiB1CistLS0KK25hbWU6IHZhcmV4cGFuZC1udWxsLTIKK2Rlc2NyaXB0aW9uOgorCUVuc3VyZSBlbXB0eSBzdHJpbmdzLCB3aGVuIHF1b3RlZCwgYXJlIGV4cGFuZGVkIGFzIGVtcHR5IHN0cmluZ3MKK3N0ZGluOgorCXByaW50ZiAnPCVzPiAnIDEgIiR7YX0iIDIgIiR7YSM/fSIgKyAiJHtiJT99IiAzICIke2E9fSIgKyAiJHtiL2MvZH0iCisJZWNobyAuCitleHBlY3RlZC1zdGRvdXQ6CisJPDE+IDw+IDwyPiA8PiA8Kz4gPD4gPDM+IDw+IDwrPiA8PiAuCistLS0KK25hbWU6IHByaW50LWZ1bm55LWNoYXJzCitkZXNjcmlwdGlvbjoKKwlDaGVjayBwcmludCBidWlsdGluJ3MgY2FwYWJpbGl0eSB0byBvdXRwdXQgZGVzaWduYXRlZCBjaGFyYWN0ZXJzCitzdGRpbjoKKwlwcmludCAnPFwwMTQ0XDAzNDRceERCXHUwMERCXHUyMEFDXHVEQlx4NDA+JworZXhwZWN0ZWQtc3Rkb3V0OgorCTxk5NvDm+KCrMObQD4KKy0tLQorbmFtZTogcHJpbnQtYmtzbC1jCitkZXNjcmlwdGlvbjoKKwlDaGVjayBwcmludCBidWlsdGluJ3MgXGMgZXNjYXBlCitzdGRpbjoKKwlwcmludCAnXGNhJzsgcHJpbnQgYgorZXhwZWN0ZWQtc3Rkb3V0OgorCWFiCistLS0KK25hbWU6IHByaW50LW51bC1jaGFycworZGVzY3JpcHRpb246CisJQ2hlY2sgaGFuZGxpbmcgb2YgTlVMIGNoYXJhY3RlcnMgZm9yIHByaW50IGFuZCByZWFkCisJbm90ZTogc2Vjb25kIGxpbmUgc2hvdWxkIG91dHB1dCDigJw0IDPigJ0gYnV0IHdlIGNhbm5vdAorCWhhbmRsZSBOVUwgY2hhcmFjdGVycyBpbiBzdHJpbmdzIHlldAorc3RkaW46CisJcHJpbnQgJCgoJChwcmludCAnPFwwPicgfCB3YyAtYykpKQorCXg9JChwcmludCAnPFwwPicpCisJcHJpbnQgJCgoJChwcmludCAiJHgiIHwgd2MgLWMpKSkgJHsjeH0KK2V4cGVjdGVkLXN0ZG91dDoKKwk0CisJMyAyCistLS0KK25hbWU6IHByaW50LWVzY2FwZXMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGJhY2tzbGFzaCBleHBhbnNpb24gYnkgdGhlIHByaW50IGJ1aWx0aW4KK3N0ZGluOgorCXByaW50ICdcIFwhXCJcI1wkXCVcJidcXFwnJ1woXClcKlwrXCxcLVwuXC9cMFwxXDJcM1w0XDVcNlw3XDgnIFwKKwkgICAgJ1w5XDpcO1w8XD1cPlw/XEBcQVxCXENcRFxFXEZcR1xIXElcSlxLXExcTVxOXE9cUFxRXFJcU1xUJyBcCisJICAgICdcVVxWXFdcWFxZXFpcW1xcXF1cXlxfXGBcYVxiICBcZFxlXGZcZ1xoXGlcalxrXGxcbVxuXG9ccCcgXAorCSAgICAnXHFcclxzXHRcdVx2XHdceFx5XHpce1x8XH1cficgJ1x1MjBhY2QnICdcVTIwYWNkJyAnXHgxMjMnIFwKKwkgICAgJ1wweCcgJ1wwMTIzJyAnXDAxMjM0JyB8IHsKKwkJdHlwZXNldCAtVXVpMTYgLVoxMSBwb3M9MAorCQl0eXBlc2V0IC1VdWkxNiAtWjUgaHYKKwkJdHlwZXNldCAtaTEgd2M9MHgwQQorCQlkYXNjPQorCQlubD0ke3djIzEjfQorCQl3aGlsZSBJRlM9IHJlYWQgLXIgbGluZTsgZG8KKwkJCWxpbmU9JGxpbmUkbmwKKwkJCXdoaWxlIFtbIC1uICRsaW5lIF1dOyBkbworCQkJCWh2PTEjJHtsaW5lOjoxfQorCQkJCWlmICgoIChwb3MgJiAxNSkgPT0gMCApKTsgdGhlbgorCQkJCQkoKCBwb3MgKSkgJiYgcHJpbnQgIiRkYXNjfCIKKwkJCQkJcHJpbnQgLW4gIiR7cG9zIzE2I30gICIKKwkJCQkJZGFzYz0nIHwnCisJCQkJZmkKKwkJCQlwcmludCAtbiAiJHtodiMxNiN9ICIKKwkJCQlpZiAoKCAoaHYgPCAzMikgfHwgKGh2ID4gMTI2KSApKTsgdGhlbgorCQkJCQlkYXNjPSRkYXNjLgorCQkJCWVsc2UKKwkJCQkJZGFzYz0kZGFzYyR7bGluZTo6MX0KKwkJCQlmaQorCQkJCSgoIChwb3MrKyAmIDE1KSA9PSA3ICkpICYmIHByaW50IC1uIC0tICctICcKKwkJCQlsaW5lPSR7bGluZToxfQorCQkJZG9uZQorCQlkb25lCisJCWlmICgoIChwb3MgJiAxNSkgIT0gMSApKTsgdGhlbgorCQkJd2hpbGUgKCggcG9zICYgMTUgKSk7IGRvCisJCQkJcHJpbnQgLW4gJyAgICcKKwkJCQkoKCAocG9zKysgJiAxNSkgPT0gNyApKSAmJiBwcmludCAtbiAtLSAnLSAnCisJCQlkb25lCisJCQlwcmludCAiJGRhc2N8IgorCQlmaQorCX0KK2V4cGVjdGVkLXN0ZG91dDoKKwkwMDAwMDAwMCAgNUMgMjAgNUMgMjEgNUMgMjIgNUMgMjMgLSA1QyAyNCA1QyAyNSA1QyAyNiA1QyAyNyAgfFwgXCFcIlwjXCRcJVwmXCd8CisJMDAwMDAwMTAgIDVDIDI4IDVDIDI5IDVDIDJBIDVDIDJCIC0gNUMgMkMgNUMgMkQgNUMgMkUgNUMgMkYgIHxcKFwpXCpcK1wsXC1cLlwvfAorCTAwMDAwMDIwICA1QyAzMSA1QyAzMiA1QyAzMyA1QyAzNCAtIDVDIDM1IDVDIDM2IDVDIDM3IDVDIDM4ICB8XDFcMlwzXDRcNVw2XDdcOHwKKwkwMDAwMDAzMCAgMjAgNUMgMzkgNUMgM0EgNUMgM0IgNUMgLSAzQyA1QyAzRCA1QyAzRSA1QyAzRiA1QyAgfCBcOVw6XDtcPFw9XD5cP1x8CisJMDAwMDAwNDAgIDQwIDVDIDQxIDVDIDQyIDVDIDQzIDVDIC0gNDQgMUIgNUMgNDYgNUMgNDcgNUMgNDggIHxAXEFcQlxDXEQuXEZcR1xIfAorCTAwMDAwMDUwICA1QyA0OSA1QyA0QSA1QyA0QiA1QyA0QyAtIDVDIDREIDVDIDRFIDVDIDRGIDVDIDUwICB8XElcSlxLXExcTVxOXE9cUHwKKwkwMDAwMDA2MCAgNUMgNTEgNUMgNTIgNUMgNTMgNUMgNTQgLSAyMCA1QyA1NiA1QyA1NyA1QyA1OCA1QyAgfFxRXFJcU1xUIFxWXFdcWFx8CisJMDAwMDAwNzAgIDU5IDVDIDVBIDVDIDVCIDVDIDVDIDVEIC0gNUMgNUUgNUMgNUYgNUMgNjAgMDcgMDggIHxZXFpcW1xdXF5cX1xgLi58CisJMDAwMDAwODAgIDIwIDIwIDVDIDY0IDFCIDBDIDVDIDY3IC0gNUMgNjggNUMgNjkgNUMgNkEgNUMgNkIgIHwgIFxkLi5cZ1xoXGlcalxrfAorCTAwMDAwMDkwICA1QyA2QyA1QyA2RCAwQSA1QyA2RiA1QyAtIDcwIDIwIDVDIDcxIDBEIDVDIDczIDA5ICB8XGxcbS5cb1xwIFxxLlxzLnwKKwkwMDAwMDBBMCAgMEIgNUMgNzcgNUMgNzkgNUMgN0EgNUMgLSA3QiA1QyA3QyA1QyA3RCA1QyA3RSAyMCAgfC5cd1x5XHpce1x8XH1cfiB8CisJMDAwMDAwQjAgIEUyIDgyIEFDIDY0IDIwIEVGIEJGIEJEIC0gMjAgMTIgMzMgMjAgNzggMjAgNTMgMjAgIHwuLi5kIC4uLiAuMyB4IFMgfAorCTAwMDAwMEMwICA1MyAzNCAwQSAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICB8UzQufAorLS0tCituYW1lOiBkb2xsYXItcXVvdGVkLXN0cmluZ3MKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGJhY2tzbGFzaCBleHBhbnNpb24gYnkgJCfigKYnIHN0cmluZ3MKK3N0ZGluOgorCXByaW50ZiAnJXNcbicgJCdcIFwhXCJcI1wkXCVcJlwnXChcKVwqXCtcLFwtXC5cLyBcMVwyXDNcNFw1XDYnIFwKKwkgICAgJCdhXDBiJyAkJ2FcMDFiJyAkJ1w3XDhcOVw6XDtcPFw9XD5cP1xAXEFcQlxDXERcRVxGXEdcSFxJJyBcCisJICAgICQnXEpcS1xMXE1cTlxPXFBcUVxSXFNcVFxVMVxWXFdcWFxZXFpcW1xcXF1cXlxfXGBcYVxiXGRcZScgXAorCSAgICAkJ1xmXGdcaFxpXGpca1xsXG1cblxvXHBccVxyXHNcdFx1MVx2XHdceDFceVx6XHtcfFx9XH4gJHgnIFwKKwkgICAgJCdcdTIwYWNkJyAkJ1xVMjBhY2QnICQnXHgxMjMnICQnZm5ceDByZCcgJCdcMDIzNCcgJCdcMjM0JyBcCisJICAgICQnXDIzNDUnICQnXGNhJyAkJ1xjIScgJCdcYz8nICQnXGPigqwnICQnYVwKKwliJyB8IHsKKwkJdHlwZXNldCAtVXVpMTYgLVoxMSBwb3M9MAorCQl0eXBlc2V0IC1VdWkxNiAtWjUgaHYKKwkJdHlwZXNldCAtaTEgd2M9MHgwQQorCQlkYXNjPQorCQlubD0ke3djIzEjfQorCQl3aGlsZSBJRlM9IHJlYWQgLXIgbGluZTsgZG8KKwkJCWxpbmU9JGxpbmUkbmwKKwkJCXdoaWxlIFtbIC1uICRsaW5lIF1dOyBkbworCQkJCWh2PTEjJHtsaW5lOjoxfQorCQkJCWlmICgoIChwb3MgJiAxNSkgPT0gMCApKTsgdGhlbgorCQkJCQkoKCBwb3MgKSkgJiYgcHJpbnQgIiRkYXNjfCIKKwkJCQkJcHJpbnQgLW4gIiR7cG9zIzE2I30gICIKKwkJCQkJZGFzYz0nIHwnCisJCQkJZmkKKwkJCQlwcmludCAtbiAiJHtodiMxNiN9ICIKKwkJCQlpZiAoKCAoaHYgPCAzMikgfHwgKGh2ID4gMTI2KSApKTsgdGhlbgorCQkJCQlkYXNjPSRkYXNjLgorCQkJCWVsc2UKKwkJCQkJZGFzYz0kZGFzYyR7bGluZTo6MX0KKwkJCQlmaQorCQkJCSgoIChwb3MrKyAmIDE1KSA9PSA3ICkpICYmIHByaW50IC1uIC0tICctICcKKwkJCQlsaW5lPSR7bGluZToxfQorCQkJZG9uZQorCQlkb25lCisJCWlmICgoIChwb3MgJiAxNSkgIT0gMSApKTsgdGhlbgorCQkJd2hpbGUgKCggcG9zICYgMTUgKSk7IGRvCisJCQkJcHJpbnQgLW4gJyAgICcKKwkJCQkoKCAocG9zKysgJiAxNSkgPT0gNyApKSAmJiBwcmludCAtbiAtLSAnLSAnCisJCQlkb25lCisJCQlwcmludCAiJGRhc2N8IgorCQlmaQorCX0KK2V4cGVjdGVkLXN0ZG91dDoKKwkwMDAwMDAwMCAgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgLSAyOCAyOSAyQSAyQiAyQyAyRCAyRSAyRiAgfCAhIiMkJSYnKCkqKywtLi98CisJMDAwMDAwMTAgIDIwIDAxIDAyIDAzIDA0IDA1IDA2IDBBIC0gNjEgMEEgNjEgMDEgNjIgMEEgMDcgMzggIHwgLi4uLi4uLmEuYS5iLi44fAorCTAwMDAwMDIwICAzOSAzQSAzQiAzQyAzRCAzRSAzRiA0MCAtIDQxIDQyIDQzIDQ0IDFCIDQ2IDQ3IDQ4ICB8OTo7PD0+P0BBQkNELkZHSHwKKwkwMDAwMDAzMCAgNDkgMEEgNEEgNEIgNEMgNEQgNEUgNEYgLSA1MCA1MSA1MiA1MyA1NCAwMSA1NiA1NyAgfEkuSktMTU5PUFFSU1QuVld8CisJMDAwMDAwNDAgIDU4IDU5IDVBIDVCIDVDIDVEIDVFIDVGIC0gNjAgMDcgMDggNjQgMUIgMEEgMEMgNjcgIHxYWVpbXF1eX2AuLmQuLi5nfAorCTAwMDAwMDUwICA2OCA2OSA2QSA2QiA2QyA2RCAwQSA2RiAtIDcwIDcxIDBEIDczIDA5IDAxIDBCIDc3ICB8aGlqa2xtLm9wcS5zLi4ud3wKKwkwMDAwMDA2MCAgMDEgNzkgN0EgN0IgN0MgN0QgN0UgMjAgLSAyNCA3OCAwQSBFMiA4MiBBQyA2NCAwQSAgfC55ent8fX4gJHguLi4uZC58CisJMDAwMDAwNzAgIEVGIEJGIEJEIDBBIEM0IEEzIDBBIDY2IC0gNkUgMEEgMTMgMzQgMEEgOUMgMEEgOUMgIHwuLi4uLi4uZm4uLjQuLi4ufAorCTAwMDAwMDgwICAzNSAwQSAwMSAwQSAwMSAwQSA3RiAwQSAtIDAyIDgyIEFDIDBBIDYxIDBBIDYyIDBBICB8NS4uLi4uLi4uLi4uYS5iLnwKKy0tLQorbmFtZTogZG9sbGFyLXF1b3Rlcy1pbi1oZXJlZG9jcworZGVzY3JpcHRpb246CisJVGhleSBhcmUsIGhvd2V2ZXIsIG5vdCBwYXJzZWQgaW4gaGVyZSBkb2N1bWVudHMKK3N0ZGluOgorCWNhdCA8PEVPRgorCQlkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLworCUVPRgorCWNhdCA8PCQnYVx0YicKKwlhXHRiCisJYQliCitleHBlY3RlZC1zdGRvdXQ6CisJCWRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovCisJYVx0YgorLS0tCituYW1lOiBkb2xsYXItcXVvdGVzLWluLWhlcmVzdHJpbmdzCitkZXNjcmlwdGlvbjoKKwlUaGV5IGFyZSwgbm90IHBhcnNlZCBpbiBoZXJlIHN0cmluZ3MgZWl0aGVyCitzdGRpbjoKKwljYXQgPDw8ImRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovIgorCWNhdCA8PDwnZG9sbGFyID0gc3RyY2hyKHMsICdcJyckJ1wnJyk7CS8qICdcJycgKi8nCisJeD0iZG9sbGFyID0gc3RyY2hyKHMsICckJyk7CS8qICcgKi8iCisJY2F0IDw8PCIkeCIKKwljYXQgPDw8JCdhXEVbMG1cdGInCitleHBlY3RlZC1zdGRvdXQ6CisJZG9sbGFyID0gc3RyY2hyKHMsICckJyk7CS8qICcgKi8KKwlkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLworCWRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovCisJYRtbMG0JYgorLS0tCituYW1lOiBkb3QtbmVlZHMtYXJndW1lbnQKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIERlYmlhbiAjNDE1MTY3IHNvbHV0aW9uOiAnLicgd2l0aG91dCBhcmd1bWVudHMgc2hvdWxkIGZhaWwKK3N0ZGluOgorCSIkX19wcm9nbmFtZSIgLWMgLgorCSIkX19wcm9nbmFtZSIgLWMgc291cmNlCitleHBlY3RlZC1leGl0OiBlICE9IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9cLjogbWlzc2luZyBhcmd1bWVudC4qXG4uKlwuOiBtaXNzaW5nIGFyZ3VtZW50LworLS0tCituYW1lOiBhbGlhcy1mdW5jdGlvbi1uby1jb25mbGljdAorZGVzY3JpcHRpb246CisJbWFrZSBhbGlhc2VzIG5vdCBjb25mbGljdCB3aXRoIGZ1bmN0aW9ucworCW5vdGU6IGZvciBrc2gtbGlrZSBmdW5jdGlvbnMsIHRoZSBvcmRlciBvZiBwcmVmZXJlbmNlIGlzCisJZGlmZmVyZW50OyBiYXNoIG91dHB1dHMgYmF6IGluc3RlYWQgb2YgYmFyIGluIGxpbmUgMiBiZWxvdworc3RkaW46CisJYWxpYXMgZm9vPSdlY2hvIGJhcicKKwlmb28oKSB7CisJCWVjaG8gYmF6CisJfQorCWFsaWFzIGtvcm49J2VjaG8gYmFyJworCWZ1bmN0aW9uIGtvcm4geworCQllY2hvIGJhegorCX0KKwlmb28KKwlrb3JuCisJdW5zZXQgLWYgZm9vCisJZm9vIDI+Ji0gfHwgZWNobyByYWIKK2V4cGVjdGVkLXN0ZG91dDoKKwliYXoKKwliYXIKKwlyYWIKKy0tLQorbmFtZTogYmFzaC1mdW5jdGlvbi1wYXJlbnMKK2Rlc2NyaXB0aW9uOgorCWVuc3VyZSB0aGUga2V5d29yZCBmdW5jdGlvbiBpcyBpZ25vcmVkIHdoZW4gcHJlY2VkaW5nCisJUE9TSVggc3R5bGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIChiYXNoaXNtKQorc3RkaW46CisJbWsoKSB7CisJCWVjaG8gJyMhJyIkX19wcm9nbmFtZSIKKwkJZWNobyAiJDEgeyIKKwkJZWNobyAnCWVjaG8gImJhcj0nXCcnJDAnXCdcIgorCQllY2hvICd9JworCQllY2hvICR7MjotZm9vfQorCX0KKwltayAnZnVuY3Rpb24gZm9vJyA+Zi1rb3JuCisJbWsgJ2ZvbyAoKScgPmYtZGFzaAorCW1rICdmdW5jdGlvbiBmb28gKCknID5mLWJhc2gKKwltayAnZnVuY3Rpb24gc3RvcCAoKScgc3RvcCA+Zi1zdG9wCisJY2htb2QgK3ggZi0qCisJZWNobyAia29ybjogJCguL2Yta29ybikiCisJZWNobyAiZGFzaDogJCguL2YtZGFzaCkiCisJZWNobyAiYmFzaDogJCguL2YtYmFzaCkiCisJZWNobyAic3RvcDogJCguL2Ytc3RvcCkiCitleHBlY3RlZC1zdGRvdXQ6CisJa29ybjogYmFyPSdmb28nCisJZGFzaDogYmFyPScuL2YtZGFzaCcKKwliYXNoOiBiYXI9Jy4vZi1iYXNoJworCXN0b3A6IGJhcj0nLi9mLXN0b3AnCistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtMQorZGVzY3JpcHRpb246CisJY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHdvcmtzCitzdGRpbjoKKwlzZXQgLVUKKwl0eXBlc2V0IC1VdWkxNiBpMD0xI+8gaTE9MSPigqwKKwl0eXBlc2V0IC1pMSBvMGE9NjQKKwl0eXBlc2V0IC1pMSBvMWE9MHgyNjNBCisJdHlwZXNldCAtVXVpMSBvMGI9MHg3RQorCXR5cGVzZXQgLVV1aTEgbzFiPTB4RkREMAorCWludGVnZXIgcHg9MHhDQUZFICdwMD0xIyAnIHAxPTEj4oCmIHBsPTEjZgorCWVjaG8gImluIDwkaTA+IDwkaTE+IgorCWVjaG8gIm91dCA8JHtvMGEjMSN9fCR7bzBiIzEjfT4gPCR7bzFhIzEjfXwke28xYiMxI30+IgorCXR5cGVzZXQgLVV1aTEgaTAgaTEKKwllY2hvICJwYXNzIDwkcHg+IDwkcDA+IDwkcDE+IDwkcGw+IDwke2kwIzEjfXwke2kxIzEjfT4iCisJdHlwZXNldCAtVXVpMTYgdHYxPTEjfiB0djI9MSN/IHR2Mz0xI4AgdHY0PTEjgSB0djU9MSPAIHR2Nj0xI8EgdHY3PTEjwqAgdHY4PTEjwoAKKwllY2hvICJzcGVjWCA8JHt0djEjMTYjfT4gPCR7dHYyIzE2I30+IDwke3R2MyMxNiN9PiA8JHt0djQjMTYjfT4gPCR7dHY1IzE2I30+IDwke3R2NiMxNiN9PiA8JHt0djcjMTYjfT4gPCR7dHY4IzE2I30+IgorCXR5cGVzZXQgLWkxIHR2MSB0djIgdHYzIHR2NCB0djUgdHY2IHR2NyB0djgKKwllY2hvICJzcGVjVyA8JHt0djEjMSN9PiA8JHt0djIjMSN9PiA8JHt0djMjMSN9PiA8JHt0djQjMSN9PiA8JHt0djUjMSN9PiA8JHt0djYjMSN9PiA8JHt0djcjMSN9PiA8JHt0djgjMSN9PiIKKwl0eXBlc2V0IC1pMSB4czE9MHhFRjdGIHhzMj0weEVGODAgeHMzPTB4RkREMAorCWVjaG8gInNwZWNVIDwke3hzMSMxI30+IDwke3hzMiMxI30+IDwke3hzMyMxI30+IgorZXhwZWN0ZWQtc3Rkb3V0OgorCWluIDwxNiNFRkVGPiA8MTYjMjBBQz4KKwlvdXQgPEB8fj4gPOKYunzvt5A+CisJcGFzcyA8MTYjY2FmZT4gPDEjID4gPDEj4oCmPiA8MSNmPiA873zigqw+CisJc3BlY1ggPDdFPiA8N0Y+IDxFRjgwPiA8RUY4MT4gPEVGQzA+IDxFRkMxPiA8QTA+IDw4MD4KKwlzcGVjVyA8fj4gPH8+IDyAPiA8gT4gPMA+IDzBPiA8wqA+IDzCgD4KKwlzcGVjVSA87r2/PiA8gD4gPO+3kD4KKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yYQorZGVzY3JpcHRpb246CisJY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGNvcnJlY3QgY2hhcmFjdGVycworc3RkaW46CisJc2V0IC1VCisJaW50ZWdlciB4PTEjZm9vCisJZWNobyAvJHgvCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvMSNmb286IHVuZXhwZWN0ZWQgJ29vJy8KK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJiCitkZXNjcmlwdGlvbjoKKwljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgY29ycmVjdCBjaGFyYWN0ZXJzCitzdGRpbjoKKwlzZXQgLVUKKwlpbnRlZ2VyIHg9MSPAgAorCWVjaG8gLyR4LworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLzEjwIA6IHVuZXhwZWN0ZWQgJ4AnLworZXhwZWN0ZWQtZXhpdDogZSAhPSAwCistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtMmMxCitkZXNjcmlwdGlvbjoKKwljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgY29ycmVjdCBjaGFyYWN0ZXJzCitzdGRpbjoKKwlzZXQgLVUKKwlpbnRlZ2VyIHg9MSPigKYKKwllY2hvIC8keC8KK2V4cGVjdGVkLXN0ZG91dDoKKwkvMSPigKYvCistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtMmMyCitkZXNjcmlwdGlvbjoKKwljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgY29ycmVjdCBjaGFyYWN0ZXJzCitzdGRpbjoKKwlzZXQgK1UKKwlpbnRlZ2VyIHg9MSPigKYKKwllY2hvIC8keC8KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8xI+KApjogdW5leHBlY3RlZCAngCcvCitleHBlY3RlZC1leGl0OiBlICE9IDAKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yZDEKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBoYW5kbGVzIG9jdGV0cyBva2F5CitzdGRpbjoKKwlzZXQgLVUKKwl0eXBlc2V0IC1pMTYgeD0xI/8KKwllY2hvIC8keC8JIyBpbnZhbGlkIHV0Zi04CitleHBlY3RlZC1zdGRvdXQ6CisJLzE2I2VmZmYvCistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtMmQyCitkZXNjcmlwdGlvbjoKKwljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgaGFuZGxlcyBvY3RldHMKK3N0ZGluOgorCXNldCAtVQorCXR5cGVzZXQgLWkxNiB4PTEjwgorCWVjaG8gLyR4LwkjIGludmFsaWQgMi1ieXRlCitleHBlY3RlZC1zdGRvdXQ6CisJLzE2I2VmYzIvCistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtMmQzCitkZXNjcmlwdGlvbjoKKwljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgaGFuZGxlcyBvY3RldHMKK3N0ZGluOgorCXNldCAtVQorCXR5cGVzZXQgLWkxNiB4PTEj7worCWVjaG8gLyR4LwkjIGludmFsaWQgMi1ieXRlCitleHBlY3RlZC1zdGRvdXQ6CisJLzE2I2VmZWYvCistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtMmQ0CitkZXNjcmlwdGlvbjoKKwljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgaW52YWxpZCBpbnB1dAorc3RkaW46CisJc2V0IC1VCisJdHlwZXNldCAtaTE2IHg9MSPvv8AKKwllY2hvIC8keC8JIyBpbnZhbGlkIDMtYnl0ZQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLzEj77/AOiB1bmV4cGVjdGVkICe/Jy8KK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJkNQorZGVzY3JpcHRpb246CisJY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGludmFsaWQgaW5wdXQKK3N0ZGluOgorCXNldCAtVQorCXR5cGVzZXQgLWkxNiB4PTEjwIAKKwllY2hvIC8keC8JIyBub24tbWluaW1hbGlzdGljCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvMSPAgDogdW5leHBlY3RlZCAngCcvCitleHBlY3RlZC1leGl0OiBlICE9IDAKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yZDYKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBzdG9wcyBhdCBpbnZhbGlkIGlucHV0CitzdGRpbjoKKwlzZXQgLVUKKwl0eXBlc2V0IC1pMTYgeD0xI+CAgAorCWVjaG8gLyR4LwkjIG5vbi1taW5pbWFsaXN0aWMKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8xI+CAgDogdW5leHBlY3RlZCAngCcvCitleHBlY3RlZC1leGl0OiBlICE9IDAKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0zQQorZGVzY3JpcHRpb246CisJc29tZSBzYW1wbGUgY29kZSBmb3IgaGV4ZHVtcGluZworc3RkaW46CisJeworCQlwcmludCAnSGVsbG8sIFdvcmxkIVxcXG7jgZPjgpPjgavjgaHjga/vvIEnCisJCXR5cGVzZXQgLVV1aTE2IGk9MHgxMDAKKwkJIyBjaGFuZ2UgdGhhdCB0byAweEZGIG9uY2Ugd2UgY2FuIGhhbmRsZSBlbWJlZGRlZAorCQkjIE5VTCBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgLyBoZXJlIGRvY3VtZW50cworCQl3aGlsZSAoKCBpKysgPCAweDFGRiApKTsgZG8KKwkJCXByaW50IC1uICJceCR7aSMxNiMxfSIKKwkJZG9uZQorCQlwcmludAorCX0gfCB7CisJCXR5cGVzZXQgLVV1aTE2IC1aMTEgcG9zPTAKKwkJdHlwZXNldCAtVXVpMTYgLVo1IGh2CisJCXR5cGVzZXQgLWkxIHdjPTB4MEEKKwkJZGFzYz0KKwkJbmw9JHt3YyMxI30KKwkJd2hpbGUgSUZTPSByZWFkIC1yIGxpbmU7IGRvCisJCQlsaW5lPSRsaW5lJG5sCisJCQl3aGlsZSBbWyAtbiAkbGluZSBdXTsgZG8KKwkJCQlodj0xIyR7bGluZTo6MX0KKwkJCQlpZiAoKCAocG9zICYgMTUpID09IDAgKSk7IHRoZW4KKwkJCQkJKCggcG9zICkpICYmIHByaW50ICIkZGFzY3wiCisJCQkJCXByaW50IC1uICIke3BvcyMxNiN9ICAiCisJCQkJCWRhc2M9JyB8JworCQkJCWZpCisJCQkJcHJpbnQgLW4gIiR7aHYjMTYjfSAiCisJCQkJaWYgKCggKGh2IDwgMzIpIHx8IChodiA+IDEyNikgKSk7IHRoZW4KKwkJCQkJZGFzYz0kZGFzYy4KKwkJCQllbHNlCisJCQkJCWRhc2M9JGRhc2Mke2xpbmU6OjF9CisJCQkJZmkKKwkJCQkoKCAocG9zKysgJiAxNSkgPT0gNyApKSAmJiBwcmludCAtbiAtLSAnLSAnCisJCQkJbGluZT0ke2xpbmU6MX0KKwkJCWRvbmUKKwkJZG9uZQorCQlpZiAoKCAocG9zICYgMTUpICE9IDEgKSk7IHRoZW4KKwkJCXdoaWxlICgoIHBvcyAmIDE1ICkpOyBkbworCQkJCXByaW50IC1uICcgICAnCisJCQkJKCggKHBvcysrICYgMTUpID09IDcgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJworCQkJZG9uZQorCQkJcHJpbnQgIiRkYXNjfCIKKwkJZmkKKwl9CitleHBlY3RlZC1zdGRvdXQ6CisJMDAwMDAwMDAgIDQ4IDY1IDZDIDZDIDZGIDJDIDIwIDU3IC0gNkYgNzIgNkMgNjQgMjEgNUMgMEEgRTMgIHxIZWxsbywgV29ybGQhXC4ufAorCTAwMDAwMDEwICA4MSA5MyBFMyA4MiA5MyBFMyA4MSBBQiAtIEUzIDgxIEExIEUzIDgxIEFGIEVGIEJDICB8Li4uLi4uLi4uLi4uLi4uLnwKKwkwMDAwMDAyMCAgODEgMEEgMDEgMDIgMDMgMDQgMDUgMDYgLSAwNyAwOCAwOSAwQSAwQiAwQyAwRCAwRSAgfC4uLi4uLi4uLi4uLi4uLi58CisJMDAwMDAwMzAgIDBGIDEwIDExIDEyIDEzIDE0IDE1IDE2IC0gMTcgMTggMTkgMUEgMUIgMUMgMUQgMUUgIHwuLi4uLi4uLi4uLi4uLi4ufAorCTAwMDAwMDQwICAxRiAyMCAyMSAyMiAyMyAyNCAyNSAyNiAtIDI3IDI4IDI5IDJBIDJCIDJDIDJEIDJFICB8LiAhIiMkJSYnKCkqKywtLnwKKwkwMDAwMDA1MCAgMkYgMzAgMzEgMzIgMzMgMzQgMzUgMzYgLSAzNyAzOCAzOSAzQSAzQiAzQyAzRCAzRSAgfC8wMTIzNDU2Nzg5Ojs8PT58CisJMDAwMDAwNjAgIDNGIDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IC0gNDcgNDggNDkgNEEgNEIgNEMgNEQgNEUgIHw/QEFCQ0RFRkdISUpLTE1OfAorCTAwMDAwMDcwICA0RiA1MCA1MSA1MiA1MyA1NCA1NSA1NiAtIDU3IDU4IDU5IDVBIDVCIDVDIDVEIDVFICB8T1BRUlNUVVZXWFlaW1xdXnwKKwkwMDAwMDA4MCAgNUYgNjAgNjEgNjIgNjMgNjQgNjUgNjYgLSA2NyA2OCA2OSA2QSA2QiA2QyA2RCA2RSAgfF9gYWJjZGVmZ2hpamtsbW58CisJMDAwMDAwOTAgIDZGIDcwIDcxIDcyIDczIDc0IDc1IDc2IC0gNzcgNzggNzkgN0EgN0IgN0MgN0QgN0UgIHxvcHFyc3R1dnd4eXp7fH1+fAorCTAwMDAwMEEwICA3RiA4MCA4MSA4MiA4MyA4NCA4NSA4NiAtIDg3IDg4IDg5IDhBIDhCIDhDIDhEIDhFICB8Li4uLi4uLi4uLi4uLi4uLnwKKwkwMDAwMDBCMCAgOEYgOTAgOTEgOTIgOTMgOTQgOTUgOTYgLSA5NyA5OCA5OSA5QSA5QiA5QyA5RCA5RSAgfC4uLi4uLi4uLi4uLi4uLi58CisJMDAwMDAwQzAgIDlGIEEwIEExIEEyIEEzIEE0IEE1IEE2IC0gQTcgQTggQTkgQUEgQUIgQUMgQUQgQUUgIHwuLi4uLi4uLi4uLi4uLi4ufAorCTAwMDAwMEQwICBBRiBCMCBCMSBCMiBCMyBCNCBCNSBCNiAtIEI3IEI4IEI5IEJBIEJCIEJDIEJEIEJFICB8Li4uLi4uLi4uLi4uLi4uLnwKKwkwMDAwMDBFMCAgQkYgQzAgQzEgQzIgQzMgQzQgQzUgQzYgLSBDNyBDOCBDOSBDQSBDQiBDQyBDRCBDRSAgfC4uLi4uLi4uLi4uLi4uLi58CisJMDAwMDAwRjAgIENGIEQwIEQxIEQyIEQzIEQ0IEQ1IEQ2IC0gRDcgRDggRDkgREEgREIgREMgREQgREUgIHwuLi4uLi4uLi4uLi4uLi4ufAorCTAwMDAwMTAwICBERiBFMCBFMSBFMiBFMyBFNCBFNSBFNiAtIEU3IEU4IEU5IEVBIEVCIEVDIEVEIEVFICB8Li4uLi4uLi4uLi4uLi4uLnwKKwkwMDAwMDExMCAgRUYgRjAgRjEgRjIgRjMgRjQgRjUgRjYgLSBGNyBGOCBGOSBGQSBGQiBGQyBGRCBGRSAgfC4uLi4uLi4uLi4uLi4uLi58CisJMDAwMDAxMjAgIEZGIDBBICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgIHwuLnwKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0zVworZGVzY3JpcHRpb246CisJc29tZSBzYW1wbGUgY29kZSBmb3IgaGV4ZHVtcGluZyBVbmljb2RlCitzdGRpbjoKKwlzZXQgLVUKKwl7CisJCXByaW50ICdIZWxsbywgV29ybGQhXFxcbuOBk+OCk+OBq+OBoeOBr++8gScKKwkJdHlwZXNldCAtVXVpMTYgaT0weDEwMAorCQkjIGNoYW5nZSB0aGF0IHRvIDB4RkYgb25jZSB3ZSBjYW4gaGFuZGxlIGVtYmVkZGVkCisJCSMgTlVMIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyAvIGhlcmUgZG9jdW1lbnRzCisJCXdoaWxlICgoIGkrKyA8IDB4MUZGICkpOyBkbworCQkJcHJpbnQgLW4gIlx1JHtpIzE2IzF9IgorCQlkb25lCisJCXByaW50CisJCXByaW50IFxceGZmCQkjIGludmFsaWQgdXRmLTgKKwkJcHJpbnQgXFx4YzIJCSMgaW52YWxpZCAyLWJ5dGUKKwkJcHJpbnQgXFx4ZWZcXHhiZlxceGMwCSMgaW52YWxpZCAzLWJ5dGUKKwkJcHJpbnQgXFx4YzBcXHg4MAkjIG5vbi1taW5pbWFsaXN0aWMKKwkJcHJpbnQgXFx4ZTBcXHg4MFxceDgwCSMgbm9uLW1pbmltYWxpc3RpYworCQlwcmludCAn77+977++77+/JwkjIGVuZCBvZiByYW5nZQorCX0gfCB7CisJCXR5cGVzZXQgLVV1aTE2IC1aMTEgcG9zPTAKKwkJdHlwZXNldCAtVXVpMTYgLVo3IGh2CisJCXR5cGVzZXQgLWkxIHdjPTB4MEEKKwkJdHlwZXNldCAtaSBscG9zCisJCWRhc2M9CisJCW5sPSR7d2MjMSN9CisJCXdoaWxlIElGUz0gcmVhZCAtciBsaW5lOyBkbworCQkJbGluZT0kbGluZSRubAorCQkJbHBvcz0wCisJCQl3aGlsZSAoKCBscG9zIDwgJHsjbGluZX0gKSk7IGRvCisJCQkJd2M9MSMke2xpbmU6KGxwb3MrKyk6MX0KKwkJCQlpZiAoKCAod2MgPCAzMikgfHwgXAorCQkJCSAgICAoKHdjID4gMTI2KSAmJiAod2MgPCAxNjApKSApKTsgdGhlbgorCQkJCQlkY2g9LgorCQkJCWVsaWYgKCggKHdjICYgMHhGRjgwKSA9PSAweEVGODAgKSk7IHRoZW4KKwkJCQkJZGNoPe+/vQorCQkJCWVsc2UKKwkJCQkJZGNoPSR7d2MjMSN9CisJCQkJZmkKKwkJCQlpZiAoKCAocG9zICYgNykgPT0gNyApKTsgdGhlbgorCQkJCQlkYXNjPSRkYXNjJGRjaAorCQkJCQlkY2g9CisJCQkJZWxpZiAoKCAocG9zICYgNykgPT0gMCApKTsgdGhlbgorCQkJCQkoKCBwb3MgKSkgJiYgcHJpbnQgIiRkYXNjfCIKKwkJCQkJcHJpbnQgLW4gIiR7cG9zIzE2I30gICIKKwkJCQkJZGFzYz0nIHwnCisJCQkJZmkKKwkJCQlsZXQgaHY9d2MKKwkJCQlwcmludCAtbiAiJHtodiMxNiN9ICIKKwkJCQkoKCAocG9zKysgJiA3KSA9PSAzICkpICYmIFwKKwkJCQkgICAgcHJpbnQgLW4gLS0gJy0gJworCQkJCWRhc2M9JGRhc2MkZGNoCisJCQlkb25lCisJCWRvbmUKKwkJaWYgKCggcG9zICYgNyApKTsgdGhlbgorCQkJd2hpbGUgKCggcG9zICYgNyApKTsgZG8KKwkJCQlwcmludCAtbiAnICAgICAnCisJCQkJKCggKHBvcysrICYgNykgPT0gMyApKSAmJiBwcmludCAtbiAtLSAnLSAnCisJCQlkb25lCisJCQlwcmludCAiJGRhc2N8IgorCQlmaQorCX0KK2V4cGVjdGVkLXN0ZG91dDoKKwkwMDAwMDAwMCAgMDA0OCAwMDY1IDAwNkMgMDA2QyAtIDAwNkYgMDAyQyAwMDIwIDAwNTcgIHxIZWxsbywgV3wKKwkwMDAwMDAwOCAgMDA2RiAwMDcyIDAwNkMgMDA2NCAtIDAwMjEgMDA1QyAwMDBBIDMwNTMgIHxvcmxkIVwu44GTfAorCTAwMDAwMDEwICAzMDkzIDMwNkIgMzA2MSAzMDZGIC0gRkYwMSAwMDBBIDAwMDEgMDAwMiAgfOOCk+OBq+OBoeOBr++8gS4uLnwKKwkwMDAwMDAxOCAgMDAwMyAwMDA0IDAwMDUgMDAwNiAtIDAwMDcgMDAwOCAwMDA5IDAwMEEgIHwuLi4uLi4uLnwKKwkwMDAwMDAyMCAgMDAwQiAwMDBDIDAwMEQgMDAwRSAtIDAwMEYgMDAxMCAwMDExIDAwMTIgIHwuLi4uLi4uLnwKKwkwMDAwMDAyOCAgMDAxMyAwMDE0IDAwMTUgMDAxNiAtIDAwMTcgMDAxOCAwMDE5IDAwMUEgIHwuLi4uLi4uLnwKKwkwMDAwMDAzMCAgMDAxQiAwMDFDIDAwMUQgMDAxRSAtIDAwMUYgMDAyMCAwMDIxIDAwMjIgIHwuLi4uLiAhInwKKwkwMDAwMDAzOCAgMDAyMyAwMDI0IDAwMjUgMDAyNiAtIDAwMjcgMDAyOCAwMDI5IDAwMkEgIHwjJCUmJygpKnwKKwkwMDAwMDA0MCAgMDAyQiAwMDJDIDAwMkQgMDAyRSAtIDAwMkYgMDAzMCAwMDMxIDAwMzIgIHwrLC0uLzAxMnwKKwkwMDAwMDA0OCAgMDAzMyAwMDM0IDAwMzUgMDAzNiAtIDAwMzcgMDAzOCAwMDM5IDAwM0EgIHwzNDU2Nzg5OnwKKwkwMDAwMDA1MCAgMDAzQiAwMDNDIDAwM0QgMDAzRSAtIDAwM0YgMDA0MCAwMDQxIDAwNDIgIHw7PD0+P0BBQnwKKwkwMDAwMDA1OCAgMDA0MyAwMDQ0IDAwNDUgMDA0NiAtIDAwNDcgMDA0OCAwMDQ5IDAwNEEgIHxDREVGR0hJSnwKKwkwMDAwMDA2MCAgMDA0QiAwMDRDIDAwNEQgMDA0RSAtIDAwNEYgMDA1MCAwMDUxIDAwNTIgIHxLTE1OT1BRUnwKKwkwMDAwMDA2OCAgMDA1MyAwMDU0IDAwNTUgMDA1NiAtIDAwNTcgMDA1OCAwMDU5IDAwNUEgIHxTVFVWV1hZWnwKKwkwMDAwMDA3MCAgMDA1QiAwMDVDIDAwNUQgMDA1RSAtIDAwNUYgMDA2MCAwMDYxIDAwNjIgIHxbXF1eX2BhYnwKKwkwMDAwMDA3OCAgMDA2MyAwMDY0IDAwNjUgMDA2NiAtIDAwNjcgMDA2OCAwMDY5IDAwNkEgIHxjZGVmZ2hpanwKKwkwMDAwMDA4MCAgMDA2QiAwMDZDIDAwNkQgMDA2RSAtIDAwNkYgMDA3MCAwMDcxIDAwNzIgIHxrbG1ub3BxcnwKKwkwMDAwMDA4OCAgMDA3MyAwMDc0IDAwNzUgMDA3NiAtIDAwNzcgMDA3OCAwMDc5IDAwN0EgIHxzdHV2d3h5enwKKwkwMDAwMDA5MCAgMDA3QiAwMDdDIDAwN0QgMDA3RSAtIDAwN0YgMDA4MCAwMDgxIDAwODIgIHx7fH1+Li4uLnwKKwkwMDAwMDA5OCAgMDA4MyAwMDg0IDAwODUgMDA4NiAtIDAwODcgMDA4OCAwMDg5IDAwOEEgIHwuLi4uLi4uLnwKKwkwMDAwMDBBMCAgMDA4QiAwMDhDIDAwOEQgMDA4RSAtIDAwOEYgMDA5MCAwMDkxIDAwOTIgIHwuLi4uLi4uLnwKKwkwMDAwMDBBOCAgMDA5MyAwMDk0IDAwOTUgMDA5NiAtIDAwOTcgMDA5OCAwMDk5IDAwOUEgIHwuLi4uLi4uLnwKKwkwMDAwMDBCMCAgMDA5QiAwMDlDIDAwOUQgMDA5RSAtIDAwOUYgMDBBMCAwMEExIDAwQTIgIHwuLi4uLsKgwqHConwKKwkwMDAwMDBCOCAgMDBBMyAwMEE0IDAwQTUgMDBBNiAtIDAwQTcgMDBBOCAwMEE5IDAwQUEgIHzCo8KkwqXCpsKnwqjCqcKqfAorCTAwMDAwMEMwICAwMEFCIDAwQUMgMDBBRCAwMEFFIC0gMDBBRiAwMEIwIDAwQjEgMDBCMiAgfMKrwqzCrcKuwq/CsMKxwrJ8CisJMDAwMDAwQzggIDAwQjMgMDBCNCAwMEI1IDAwQjYgLSAwMEI3IDAwQjggMDBCOSAwMEJBICB8wrPCtMK1wrbCt8K4wrnCunwKKwkwMDAwMDBEMCAgMDBCQiAwMEJDIDAwQkQgMDBCRSAtIDAwQkYgMDBDMCAwMEMxIDAwQzIgIHzCu8K8wr3CvsK/w4DDgcOCfAorCTAwMDAwMEQ4ICAwMEMzIDAwQzQgMDBDNSAwMEM2IC0gMDBDNyAwMEM4IDAwQzkgMDBDQSAgfMODw4TDhcOGw4fDiMOJw4p8CisJMDAwMDAwRTAgIDAwQ0IgMDBDQyAwMENEIDAwQ0UgLSAwMENGIDAwRDAgMDBEMSAwMEQyICB8w4vDjMONw47Dj8OQw5HDknwKKwkwMDAwMDBFOCAgMDBEMyAwMEQ0IDAwRDUgMDBENiAtIDAwRDcgMDBEOCAwMEQ5IDAwREEgIHzDk8OUw5XDlsOXw5jDmcOafAorCTAwMDAwMEYwICAwMERCIDAwREMgMDBERCAwMERFIC0gMDBERiAwMEUwIDAwRTEgMDBFMiAgfMObw5zDncOew5/DoMOhw6J8CisJMDAwMDAwRjggIDAwRTMgMDBFNCAwMEU1IDAwRTYgLSAwMEU3IDAwRTggMDBFOSAwMEVBICB8w6PDpMOlw6bDp8Oow6nDqnwKKwkwMDAwMDEwMCAgMDBFQiAwMEVDIDAwRUQgMDBFRSAtIDAwRUYgMDBGMCAwMEYxIDAwRjIgIHzDq8Osw63DrsOvw7DDscOyfAorCTAwMDAwMTA4ICAwMEYzIDAwRjQgMDBGNSAwMEY2IC0gMDBGNyAwMEY4IDAwRjkgMDBGQSAgfMOzw7TDtcO2w7fDuMO5w7p8CisJMDAwMDAxMTAgIDAwRkIgMDBGQyAwMEZEIDAwRkUgLSAwMEZGIDAwMEEgRUZGRiAwMDBBICB8w7vDvMO9w77Dvy7vv70ufAorCTAwMDAwMTE4ICBFRkMyIDAwMEEgRUZFRiBFRkJGIC0gRUZDMCAwMDBBIEVGQzAgRUY4MCAgfO+/vS7vv73vv73vv70u77+977+9fAorCTAwMDAwMTIwICAwMDBBIEVGRTAgRUY4MCBFRjgwIC0gMDAwQSBGRkZEIEVGRUYgRUZCRiAgfC7vv73vv73vv70u77+977+977+9fAorCTAwMDAwMTI4ICBFRkJFIEVGRUYgRUZCRiBFRkJGIC0gMDAwQSAgICAgICAgICAgICAgICAgfO+/ve+/ve+/ve+/vS58CistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtNAorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYga3NoOTMtc3R5bGUgYmFzZS1vbmUgaW50ZWdlcnMgd29yaworY2F0ZWdvcnk6ICFzbWtzaAorc3RkaW46CisJc2V0IC1VCisJZWNobyAxICQoKCdhJykpCisJKGVjaG8gMmYgJCgoJ2FhJykpKSAyPiYxIHwgc2VkICJzL15bXiddKicvMnAgJy8iCisJZWNobyAzICQoKCfigKYnKSkKKwl4PSInYSciCisJZWNobyAiNCA8JHg+IgorCWVjaG8gNSAkKCgkeCkpCisJZWNobyA2ICQoKHgpKQorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgOTcKKwkycCAnYWEnOiBtdWx0aS1jaGFyYWN0ZXIgY2hhcmFjdGVyIGNvbnN0YW50CisJMyA4MjMwCisJNCA8J2EnPgorCTUgOTcKKwk2IDk3CistLS0KK25hbWU6IHVsaW1pdC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiB3ZSBjYW4gdXNlIGEgc3BlY2lmaWMgc3ludGF4IGlkaW9tIGZvciB1bGltaXQKK3N0ZGluOgorCWlmICEgeD0kKHVsaW1pdCAtZCkgfHwgW1sgJHggPSB1bmtub3duIF1dOyB0aGVuCisJCSNlY2hvIGV4cGVjdGVkIHRvIGZhaWwgb24gdGhpcyBPUworCQllY2hvIG9rYXkKKwllbHNlCisJCXVsaW1pdCAtZFMgJHggJiYgZWNobyBva2F5CisJZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwlva2F5CistLS0KK25hbWU6IGJhc2hpb3AtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gd29ya3MKKwlQYXJ0IDE6IHRoaXMgaXMgYWxzbyBzdXBwb3J0ZWQgYnkgR05VIGJhc2gKK3N0ZGluOgorCWV4ZWMgMz4mMQorCWZ1bmN0aW9uIHRocmVlb3V0IHsKKwkJZWNobyByYXMKKwkJZWNobyBkd2EgPiYyCisJCWVjaG8gdHJpID4mMworCX0KKwl0aHJlZW91dCAmPmZvbworCWVjaG8gPT09CisJY2F0IGZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCXRyaQorCT09PQorCXJhcworCWR3YQorLS0tCituYW1lOiBiYXNoaW9wLTJhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBHTlUgYmFzaC1saWtlIEkvTyByZWRpcmVjdGlvbiB3b3JrcworCVBhcnQgMjogdGhpcyBpcyAqbm90KiBzdXBwb3J0ZWQgYnkgR05VIGJhc2gKK3N0ZGluOgorCWV4ZWMgMz4mMQorCWZ1bmN0aW9uIHRocmVlb3V0IHsKKwkJZWNobyByYXMKKwkJZWNobyBkd2EgPiYyCisJCWVjaG8gdHJpID4mMworCX0KKwl0aHJlZW91dCAzJj5mb28KKwllY2hvID09PQorCWNhdCBmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwlyYXMKKwk9PT0KKwlkd2EKKwl0cmkKKy0tLQorbmFtZTogYmFzaGlvcC0yYgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gd29ya3MKKwlQYXJ0IDI6IHRoaXMgaXMgKm5vdCogc3VwcG9ydGVkIGJ5IEdOVSBiYXNoCitzdGRpbjoKKwlleGVjIDM+JjEKKwlmdW5jdGlvbiB0aHJlZW91dCB7CisJCWVjaG8gcmFzCisJCWVjaG8gZHdhID4mMgorCQllY2hvIHRyaSA+JjMKKwl9CisJdGhyZWVvdXQgMz5mb28gJj4mMworCWVjaG8gPT09CisJY2F0IGZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCT09PQorCXJhcworCWR3YQorCXRyaQorLS0tCituYW1lOiBiYXNoaW9wLTJjCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBHTlUgYmFzaC1saWtlIEkvTyByZWRpcmVjdGlvbiB3b3JrcworCVBhcnQgMjogdGhpcyBpcyBzdXBwb3J0ZWQgYnkgR05VIGJhc2ggNCBvbmx5CitzdGRpbjoKKwllY2hvIG1pciA+Zm9vCisJc2V0IC1vIG5vY2xvYmJlcgorCWV4ZWMgMz4mMQorCWZ1bmN0aW9uIHRocmVlb3V0IHsKKwkJZWNobyByYXMKKwkJZWNobyBkd2EgPiYyCisJCWVjaG8gdHJpID4mMworCX0KKwl0aHJlZW91dCAmPj5mb28KKwllY2hvID09PQorCWNhdCBmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwl0cmkKKwk9PT0KKwltaXIKKwlyYXMKKwlkd2EKKy0tLQorbmFtZTogYmFzaGlvcC0zYQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gZmFpbHMgY29ycmVjdGx5CisJUGFydCAxOiB0aGlzIGlzIGFsc28gc3VwcG9ydGVkIGJ5IEdOVSBiYXNoCitzdGRpbjoKKwllY2hvIG1pciA+Zm9vCisJc2V0IC1vIG5vY2xvYmJlcgorCWV4ZWMgMz4mMQorCWZ1bmN0aW9uIHRocmVlb3V0IHsKKwkJZWNobyByYXMKKwkJZWNobyBkd2EgPiYyCisJCWVjaG8gdHJpID4mMworCX0KKwl0aHJlZW91dCAmPmZvbworCWVjaG8gPT09CisJY2F0IGZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCT09PQorCW1pcgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uKjogY2Fubm90IChjcmVhdGV8b3ZlcndyaXRlKSAuKi8KKy0tLQorbmFtZTogYmFzaGlvcC0zYgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gZmFpbHMgY29ycmVjdGx5CisJUGFydCAyOiB0aGlzIGlzICpub3QqIHN1cHBvcnRlZCBieSBHTlUgYmFzaAorc3RkaW46CisJZWNobyBtaXIgPmZvbworCXNldCAtbyBub2Nsb2JiZXIKKwlleGVjIDM+JjEKKwlmdW5jdGlvbiB0aHJlZW91dCB7CisJCWVjaG8gcmFzCisJCWVjaG8gZHdhID4mMgorCQllY2hvIHRyaSA+JjMKKwl9CisJdGhyZWVvdXQgJj58Zm9vCisJZWNobyA9PT0KKwljYXQgZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJdHJpCisJPT09CisJcmFzCisJZHdhCistLS0KK25hbWU6IGJhc2hpb3AtNAorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gd29ya3MKKwlQYXJ0IDQ6IHRoaXMgaXMgYWxzbyBzdXBwb3J0ZWQgYnkgR05VIGJhc2gsCisJYnV0IGZhaWxlZCBpbiBzb21lIG1rc2ggdmVyc2lvbnMKK3N0ZGluOgorCWV4ZWMgMz4mMQorCWZ1bmN0aW9uIHRocmVlb3V0IHsKKwkJZWNobyByYXMKKwkJZWNobyBkd2EgPiYyCisJCWVjaG8gdHJpID4mMworCX0KKwlmdW5jdGlvbiBibHViYiB7CisJCVtbIC1lIGJhciBdXSAmJiB0aHJlZW91dCAiJGJmIiAmPmZvbworCX0KKwlibHViYgorCWVjaG8gLW4gPmJhcgorCWJsdWJiCisJZWNobyA9PT0KKwljYXQgZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJdHJpCisJPT09CisJcmFzCisJZHdhCistLS0KK25hbWU6IG1rc2hpb3AtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgZm9yIHN1cHBvcnQgb2YgbW9yZSB0aGFuIDkgZmlsZSBkZXNjcmlwdG9ycworY2F0ZWdvcnk6ICFjb252ZmRzCitzdGRpbjoKKwlyZWFkIC11MTAgZm9vIDEwPDw8IGJhcgorCWVjaG8geCRmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwl4YmFyCistLS0KK25hbWU6IG1rc2hpb3AtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgZm9yIHN1cHBvcnQgb2YgbW9yZSB0aGFuIDkgZmlsZSBkZXNjcmlwdG9ycworY2F0ZWdvcnk6ICFjb252ZmRzCitzdGRpbjoKKwlleGVjIDEyPmZvbworCXByaW50IC11MTIgYmFyCisJZWNobyBiYXogPiYxMgorCWNhdCBmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwliYXIKKwliYXoKKy0tLQorbmFtZTogb2tzaC1zaGNyYXNoCitkZXNjcmlwdGlvbjoKKwlzcmMvcmVncmVzcy9iaW4va3NoL3NoY3Jhc2guc2gsdiAxLjEKK3N0ZGluOgorCWRlcGxpYnM9Ii1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtbG0gLWxYMTEgLWxYZXh0IC91c3IvbG9jYWwvbGliL2xpYmljb252LmxhIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL3BvcnRzL2RldmVsL2dldHRleHQvdy1nZXR0ZXh0LTAuMTAuNDAvZ2V0dGV4dC0wLjEwLjQwL2ludGwvLmxpYnMgL3Vzci9sb2NhbC9saWIvbGliaW50bC5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbGliLmxhIC91c3IvbG9jYWwvbGliL2xpYmdtb2R1bGUubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLUwvdXNyL1gxMVI2L2xpYiAtbGdsaWIgLWxnbW9kdWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2RrLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmd0ay5sYSAtbHRpZmYgLWxqcGVnIC1seiAtbHBuZyAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdka19waXhidWYubGEgLWx6IC1scG5nIC91c3IvbG9jYWwvbGliL2xpYmljb252LmxhIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL3BvcnRzL2RldmVsL2dldHRleHQvdy1nZXR0ZXh0LTAuMTAuNDAvZ2V0dGV4dC0wLjEwLjQwL2ludGwvLmxpYnMgL3Vzci9sb2NhbC9saWIvbGliaW50bC5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbGliLmxhIC1sbSAtbG0gL3Vzci9sb2NhbC9saWIvbGliYXVkaW9maWxlLmxhIC1sbSAtbG0gLWxhdWRpb2ZpbGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJlc2QubGEgLWxtIC1seiAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21lc3VwcG9ydC5sYSAtbG0gLWx6IC1sbSAtbGdsaWIgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZS5sYSAtbFgxMSAtbFhleHQgL3Vzci9sb2NhbC9saWIvbGliaWNvbnYubGEgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvcG9ydHMvZGV2ZWwvZ2V0dGV4dC93LWdldHRleHQtMC4xMC40MC9nZXR0ZXh0LTAuMTAuNDAvaW50bC8ubGlicyAvdXNyL2xvY2FsL2xpYi9saWJpbnRsLmxhIC91c3IvbG9jYWwvbGliL2xpYmdtb2R1bGUubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLUwvdXNyL1gxMVI2L2xpYiAtbGdsaWIgLWxnbW9kdWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2RrLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmd0ay5sYSAtbElDRSAtbFNNIC1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJ1bmdpZi5sYSAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtbG0gLWx6IC1scG5nIC91c3IvbG9jYWwvbGliL2xpYnVuZ2lmLmxhIC1seiAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9YMTFSNi9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2RrX2ltbGliLmxhIC1sbSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmFydF9sZ3BsLmxhIC1sbSAtbHogLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtbElDRSAtbFNNIC1sbSAtbFgxMSAtbFhleHQgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgLWxnZGsgLWxndGsgLUwvdXNyL1gxMVI2L2xpYiAtbG0gLWx6IC1scG5nIC1sdW5naWYgLWx6IC1sanBlZyAtbHRpZmYgLWxqcGVnIC1sZ2RrX2ltbGliIC1sZ2xpYiAtbG0gLWxhdWRpb2ZpbGUgLWxtIC1sYXVkaW9maWxlIC1sZXNkIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWV1aS5sYSAtbHogLWx6IC91c3IvbG9jYWwvbGliL2xpYnhtbC5sYSAtbHogLWx6IC1seiAvdXNyL2xvY2FsL2xpYi9saWJ4bWwubGEgLWxtIC1sWDExIC1sWGV4dCAvdXNyL2xvY2FsL2xpYi9saWJpY29udi5sYSAtTC91c3IvcG9ydHMvZGV2ZWwvZ2V0dGV4dC93LWdldHRleHQtMC4xMC40MC9nZXR0ZXh0LTAuMTAuNDAvaW50bC8ubGlicyAvdXNyL2xvY2FsL2xpYi9saWJpbnRsLmxhIC91c3IvbG9jYWwvbGliL2xpYmdsaWIubGEgL3Vzci9sb2NhbC9saWIvbGliZ21vZHVsZS5sYSAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAvdXNyL2xvY2FsL2xpYi9saWJnZGsubGEgL3Vzci9sb2NhbC9saWIvbGliZ3RrLmxhIC1ML3Vzci9YMTFSNi9saWIgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbGFkZS5sYSAtbHogLWx6IC1seiAvdXNyL2xvY2FsL2xpYi9saWJ4bWwubGEgL3Vzci9sb2NhbC9saWIvbGliZ2xpYi5sYSAtbG0gLWxtIC91c3IvbG9jYWwvbGliL2xpYmF1ZGlvZmlsZS5sYSAtbG0gLWxtIC1sYXVkaW9maWxlIC91c3IvbG9jYWwvbGliL2xpYmVzZC5sYSAtbG0gLWx6IC91c3IvbG9jYWwvbGliL2xpYmdub21lc3VwcG9ydC5sYSAtbG0gLWx6IC1sbSAtbGdsaWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWUubGEgLWxYMTEgLWxYZXh0IC91c3IvbG9jYWwvbGliL2xpYmljb252LmxhIC1ML3Vzci9wb3J0cy9kZXZlbC9nZXR0ZXh0L3ctZ2V0dGV4dC0wLjEwLjQwL2dldHRleHQtMC4xMC40MC9pbnRsLy5saWJzIC91c3IvbG9jYWwvbGliL2xpYmludGwubGEgL3Vzci9sb2NhbC9saWIvbGliZ21vZHVsZS5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtbGdsaWIgLWxnbW9kdWxlIC91c3IvbG9jYWwvbGliL2xpYmdkay5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtbGdsaWIgLWxnbW9kdWxlIC91c3IvbG9jYWwvbGliL2xpYmd0ay5sYSAtbElDRSAtbFNNIC1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJ1bmdpZi5sYSAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtbG0gLWx6IC1seiAvdXNyL2xvY2FsL2xpYi9saWJnZGtfaW1saWIubGEgL3Vzci9sb2NhbC9saWIvbGliYXJ0X2xncGwubGEgLWxtIC1seiAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1sbSAtbFgxMSAtbFhleHQgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgLWxnZGsgLWxndGsgLWxtIC1seiAtbHVuZ2lmIC1seiAtbGpwZWcgLWxqcGVnIC1sZ2RrX2ltbGliIC1sZ2xpYiAtbG0gLWxhdWRpb2ZpbGUgLWxtIC1sYXVkaW9maWxlIC1sZXNkIC91c3IvbG9jYWwvbGliL2xpYmdub21ldWkubGEgLUwvdXNyL1gxMVI2L2xpYiAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdsYWRlLWdub21lLmxhIC91c3IvbG9jYWwvbGliL2xpYmdsaWIubGEgLWxtIC1sbSAvdXNyL2xvY2FsL2xpYi9saWJhdWRpb2ZpbGUubGEgLWxtIC1sbSAtbGF1ZGlvZmlsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmVzZC5sYSAtbG0gLWx6IC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWVzdXBwb3J0LmxhIC1sbSAtbHogLWxtIC1sZ2xpYiAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21lLmxhIC1sWDExIC1sWGV4dCAvdXNyL2xvY2FsL2xpYi9saWJpY29udi5sYSAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9wb3J0cy9kZXZlbC9nZXR0ZXh0L3ctZ2V0dGV4dC0wLjEwLjQwL2dldHRleHQtMC4xMC40MC9pbnRsLy5saWJzIC91c3IvbG9jYWwvbGliL2xpYmludGwubGEgL3Vzci9sb2NhbC9saWIvbGliZ21vZHVsZS5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtTC91c3IvWDExUjYvbGliIC1sZ2xpYiAtbGdtb2R1bGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnZGsubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLUwvdXNyL1gxMVI2L2xpYiAtbGdsaWIgLWxnbW9kdWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ3RrLmxhIC1sSUNFIC1sU00gLWx6IC1scG5nIC91c3IvbG9jYWwvbGliL2xpYnVuZ2lmLmxhIC91c3IvbG9jYWwvbGliL2xpYmpwZWcubGEgLWx0aWZmIC1sbSAtbHogLWxwbmcgL3Vzci9sb2NhbC9saWIvbGlidW5naWYubGEgLWx6IC91c3IvbG9jYWwvbGliL2xpYmpwZWcubGEgLWx0aWZmIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL1gxMVI2L2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnZGtfaW1saWIubGEgLWxtIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliYXJ0X2xncGwubGEgLWxtIC1seiAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1sSUNFIC1sU00gLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtTC91c3IvWDExUjYvbGliIC1sbSAtbHogLWxwbmcgLWx1bmdpZiAtbHogLWxqcGVnIC1sdGlmZiAtbGpwZWcgLWxnZGtfaW1saWIgLWxnbGliIC1sbSAtbGF1ZGlvZmlsZSAtbG0gLWxhdWRpb2ZpbGUgLWxlc2QgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZXVpLmxhIC1ML3Vzci9YMTFSNi9saWIgLUwvdXNyL2xvY2FsL2xpYiIKKwlzcGVjaWFsZGVwbGlicz0iLWxnbm9tZXVpIC1sYXJ0X2xncGwgLWxnZGtfaW1saWIgLWx0aWZmIC1sanBlZyAtbHVuZ2lmIC1scG5nIC1seiAtbFNNIC1sSUNFIC1sZ3RrIC1sZ2RrIC1sZ21vZHVsZSAtbGludGwgLWxYZXh0IC1sWDExIC1sZ25vbWUgLWxnbm9tZXN1cHBvcnQgLWxlc2QgLWxhdWRpb2ZpbGUgLWxtIC1sZ2xpYiIKKwlmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbworCQljYXNlICRkZXBsaWIgaW4KKwkJLUwqKQorCQkJbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgorCQkJOzsKKwkJKikKKwkJCWNhc2UgIiAkc3BlY2lhbGRlcGxpYnMgIiBpbgorCQkJKiIgJGRlcGxpYiAiKikKKwkJCQluZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiOzsKKwkJCWVzYWMKKwkJCTs7CisJCWVzYWMKKwlkb25lCistLS0KK25hbWU6IG9rc2gtdmFyZnVuY3Rpb24tbW9kMQorZGVzY3JpcHRpb246CisJJE9wZW5CU0Q6IHZhcmZ1bmN0aW9uLnNoLHYgMS4xIDIwMDMvMTIvMTUgMDU6Mjg6NDAgb3R0byBFeHAgJAorCUNhbGxpbmcKKwkJRk9PPWJhciBmCisJd2hlcmUgZiBpcyBhIGtzaCBzdHlsZSBmdW5jdGlvbiwgc2hvdWxkIG5vdCBzZXQgRk9PIGluIHRoZSBjdXJyZW50CisJZW52LiBJZiBmIGlzIGEgQm91cm5lIHN0eWxlIGZ1bmN0aW9uLCBGT08gc2hvdWxkIGJlIHNldC4gRnVydGhlcm1vcmUsCisJdGhlIGZ1bmN0aW9uIHNob3VsZCByZWNlaXZlIGEgY29ycmVjdCB2YWx1ZSBvZiBGT08uIEhvd2V2ZXIsIGRpZmZlcmluZworCWZyb20gb2tzaCwgc2V0dGluZyBGT08gaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZiBtdXN0IGNoYW5nZSB0aGUgdmFsdWUgaW4KKwlzZXR0aW5nIEZPTyBpbiB0aGUgZnVuY3Rpb24gaXRzZWxmIHNob3VsZCBub3QgY2hhbmdlIHRoZSB2YWx1ZSBpbgorCWdsb2JhbCBlbnZpcm9ubWVudC4KKwlJbnNwaXJlZCBieSBQUiAyNDUwLgorc3RkaW46CisJZnVuY3Rpb24gayB7CisJCWlmIFsgeCRGT08gIT0geGJhciBdOyB0aGVuCisJCQllY2hvIDEKKwkJCXJldHVybiAxCisJCWZpCisJCXg9JChlbnYgfCBncmVwIEZPTykKKwkJaWYgWyAieCR4IiAhPSAieEZPTz1iYXIiIF07IHRoZW4KKwkJCWVjaG8gMgorCQkJcmV0dXJuIDE7CisJCWZpCisJCUZPTz1mb28KKwkJcmV0dXJuIDAKKwl9CisJYiAoKSB7CisJCWlmIFsgeCRGT08gIT0geGJhciBdOyB0aGVuCisJCQllY2hvIDMKKwkJCXJldHVybiAxCisJCWZpCisJCXg9JChlbnYgfCBncmVwIEZPTykKKwkJaWYgWyAieCR4IiAhPSAieEZPTz1iYXIiIF07IHRoZW4KKwkJCWVjaG8gNAorCQkJcmV0dXJuIDE7CisJCWZpCisJCUZPTz1mb28KKwkJcmV0dXJuIDAKKwl9CisJRk9PPWJhciBrCisJaWYgWyAkPyAhPSAwIF07IHRoZW4KKwkJZXhpdCAxCisJZmkKKwlpZiBbIHgkRk9PICE9IHggXTsgdGhlbgorCQlleGl0IDEKKwlmaQorCUZPTz1iYXIgYgorCWlmIFsgJD8gIT0gMCBdOyB0aGVuCisJCWV4aXQgMQorCWZpCisJaWYgWyB4JEZPTyAhPSB4Zm9vIF07IHRoZW4KKwkJZXhpdCAxCisJZmkKKwlGT089YmFyYmFyCisJRk9PPWJhciBrCisJaWYgWyAkPyAhPSAwIF07IHRoZW4KKwkJZXhpdCAxCisJZmkKKwlpZiBbIHgkRk9PICE9IHhiYXJiYXIgXTsgdGhlbgorCQlleGl0IDEKKwlmaQorCUZPTz1iYXIgYgorCWlmIFsgJD8gIT0gMCBdOyB0aGVuCisJCWV4aXQgMQorCWZpCisJaWYgWyB4JEZPTyAhPSB4Zm9vIF07IHRoZW4KKwkJZXhpdCAxCisJZmkKKy0tLQorbmFtZTogZmQtY2xvZXhlYy0xCitkZXNjcmlwdGlvbjoKKwlWZXJpZnkgdGhhdCBmaWxlIGRlc2NyaXB0b3JzID4gMiBhcmUgcHJpdmF0ZSBmb3IgS29ybiBzaGVsbHMKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJ0ZXN0LnNoIgorCXByaW50IC11MyBGb3dsCitzdGRpbjoKKwlleGVjIDM+JjEKKwkiJF9fcHJvZ25hbWUiIHRlc3Quc2gKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorZXhwZWN0ZWQtc3RkZXJyOgorCXRlc3Quc2hbMV06IHByaW50OiAtdTogMzogYmFkIGZpbGUgZGVzY3JpcHRvcgorLS0tCituYW1lOiBmZC1jbG9leGVjLTIKK2Rlc2NyaXB0aW9uOgorCVZlcmlmeSB0aGF0IGZpbGUgZGVzY3JpcHRvcnMgPiAyIGFyZSBub3QgcHJpdmF0ZSBmb3IgUE9TSVggc2hlbGxzCisJU2VlIERlYmlhbiBCdWcgIzE1NDU0MCwgQ2xvc2VzOiAjNDk5MTM5CitmaWxlLXNldHVwOiBmaWxlIDY0NCAidGVzdC5zaCIKKwlwcmludCAtdTMgRm93bAorc3RkaW46CisJdGVzdCAtbiAiJFBPU0hfVkVSU0lPTiIgfHwgc2V0IC1vIHNoCisJZXhlYyAzPiYxCisJIiRfX3Byb2duYW1lIiB0ZXN0LnNoCitleHBlY3RlZC1zdGRvdXQ6CisJRm93bAorLS0tCituYW1lOiBjb21zdWItMQorZGVzY3JpcHRpb246CisJQ09NU1VCIGFyZSBjdXJyZW50bHkgcGFyc2VkIGJ5IGhhY2tpbmcgbGV4LmMgaW5zdGVhZCBvZgorCXJlY3Vyc2l2ZWx5IChzZWUgcmVncmVzc2lvbi02KTogbWF0Y2hpbmcgcGFyZW50aGVzxJNzIGJ1ZworCUZhaWxzIG9uOiBwZGtzaCBta3NoIGJhc2gyIGJhc2gzIHpzaAorCVBhc3NlcyBvbjogYmFzaDQga3NoOTMKK2V4cGVjdGVkLWZhaWw6IHllcworc3RkaW46CisJZWNobyAkKGNhc2UgMSBpbiAoMSkgZWNobyB5ZXM7OyAoMikgZWNobyBubzs7IGVzYWMpCisJZWNobyAkKGNhc2UgMSBpbiAxKSBlY2hvIHllczs7IDIpIGVjaG8gbm87OyBlc2FjKQorZXhwZWN0ZWQtc3Rkb3V0OgorCXllcworCXllcworLS0tCituYW1lOiBjb21zdWItMgorZGVzY3JpcHRpb246CisJUmVkSGF0IEJaIzQ5Njc5MSDigJMgYW5vdGhlciBjYXNlIG9mIG1pc3NpbmcgcmVjdXJzaW9uCisJaW4gcGFyc2luZyBDT01TVUIgZXhwcmVzc2lvbnMKKwlGYWlscyBvbjogcGRrc2ggbWtzaCBiYXNoMiBiYXNoM8K5IGJhc2g0wrkgenNoCisJUGFzc2VzIG9uOiBrc2g5MworCeKRoCBiYXNoWzM0XSBzZWVtIHRvIGNob2tlIG9uIGNvbW1lbnQgZW5kaW5nIHdpdGggYmFja3NsYXNoLW5ld2xpbmUKK2V4cGVjdGVkLWZhaWw6IHllcworc3RkaW46CisJIyBhIGNvbW1lbnQgd2l0aCAiICcgXAorCXg9JCgKKwllY2hvIHllcworCSMgYSBjb21tZW50IHdpdGggIiAnIFwKKwkpCisJZWNobyAkeAorZXhwZWN0ZWQtc3Rkb3V0OgorCXllcworLS0tCituYW1lOiB0ZXN0LXN0bnplLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIHNob3J0IGZvcm0gWyAkeCBdIHdvcmtzCitzdGRpbjoKKwlpPTAKKwlbIC1uICR4IF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbICR4IF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbIC1uICIkeCIgXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVsgIiR4IiBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJeD0wCisJWyAtbiAkeCBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJWyAkeCBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJWyAtbiAiJHgiIF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbICIkeCIgXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCXg9JzEgLWEgMSA9IDInCisJWyAtbiAkeCBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJWyAkeCBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJWyAtbiAiJHgiIF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbICIkeCIgXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgMAorCTIgMQorCTMgMQorCTQgMQorCTUgMAorCTYgMAorCTcgMAorCTggMAorCTkgMQorCTEwIDEKKwkxMSAwCisJMTIgMAorLS0tCituYW1lOiB0ZXN0LXN0bnplLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIHNob3J0IGZvcm0gW1sgJHggXV0gd29ya3MgKGtzaDkzIGV4dGVuc2lvbikKK3N0ZGluOgorCWk9MAorCVtbIC1uICR4IF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJW1sgJHggXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbWyAtbiAiJHgiIF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJW1sgIiR4IiBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCXg9MAorCVtbIC1uICR4IF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJW1sgJHggXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbWyAtbiAiJHgiIF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJW1sgIiR4IiBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCXg9JzEgLWEgMSA9IDInCisJW1sgLW4gJHggXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbWyAkeCBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVtbIC1uICIkeCIgXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbWyAiJHgiIF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CitleHBlY3RlZC1zdGRvdXQ6CisJMSAxCisJMiAxCisJMyAxCisJNCAxCisJNSAwCisJNiAwCisJNyAwCisJOCAwCisJOSAwCisJMTAgMAorCTExIDAKKwkxMiAwCistLS0KK25hbWU6IGV2ZW50LXN1YnN0LTFhCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0ICchJyBzdWJzdGl0dXRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSB3b3JrcworY2F0ZWdvcnk6ICFzbWtzaAorZmlsZS1zZXR1cDogZmlsZSA3NTUgImZhbHNldHRvIgorCSMhIC9iaW4vc2gKKwllY2hvIG1vbHRvIGJlbmUKKwlleGl0IDQyCitmaWxlLXNldHVwOiBmaWxlIDc1NSAiIWZhbHNlIgorCSMhIC9iaW4vc2gKKwllY2hvIHNpCithcmd1bWVudHM6ICEtaSEKK3N0ZGluOgorCWV4cG9ydCBQQVRIPS46JFBBVEgKKwlmYWxzZXR0bworCWVjaG8geWVhcAorCSFmYWxzZQorZXhwZWN0ZWQtZXhpdDogNDIKK2V4cGVjdGVkLXN0ZG91dDoKKwltb2x0byBiZW5lCisJeWVhcAorCW1vbHRvIGJlbmUKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8uKi8KKy0tLQorbmFtZTogZXZlbnQtc3Vic3QtMWIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgJyEnIHN1YnN0aXR1dGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlIHdvcmtzCisJZXZlbiB3aGVuIGEgc3BhY2Ugc2VwYXJhdGVzIGl0IGZyb20gdGhlIHNlYXJjaCBjb21tYW5kLAorCXdoaWNoIGlzIG5vdCB3aGF0IEdOVSBiYXNoIHByb3ZpZGVzIGJ1dCByZXF1aXJlZCBmb3IgdGhlCisJb3RoZXIgcmVncmVzc2lvbiB0ZXN0cyBiZWxvdyB0byBjaGVjaworY2F0ZWdvcnk6ICFzbWtzaAorZmlsZS1zZXR1cDogZmlsZSA3NTUgImZhbHNldHRvIgorCSMhIC9iaW4vc2gKKwllY2hvIG1vbHRvIGJlbmUKKwlleGl0IDQyCitmaWxlLXNldHVwOiBmaWxlIDc1NSAiISIKKwkjISAvYmluL3NoCisJZWNobyBzaQorYXJndW1lbnRzOiAhLWkhCitzdGRpbjoKKwlleHBvcnQgUEFUSD0uOiRQQVRICisJZmFsc2V0dG8KKwllY2hvIHllYXAKKwkhIGZhbHNlCitleHBlY3RlZC1leGl0OiA0MgorZXhwZWN0ZWQtc3Rkb3V0OgorCW1vbHRvIGJlbmUKKwl5ZWFwCisJbW9sdG8gYmVuZQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLy4qLworLS0tCituYW1lOiBldmVudC1zdWJzdC0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0ICchJyBzdWJzdGl0dXRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZQorCWRvZXMgbm90IGJyZWFrIHRoaW5ncworY2F0ZWdvcnk6ICFzbWtzaAorZmlsZS1zZXR1cDogZmlsZSA3NTUgImZhbHNldHRvIgorCSMhIC9iaW4vc2gKKwllY2hvIG1vbHRvIGJlbmUKKwlleGl0IDQyCitmaWxlLXNldHVwOiBmaWxlIDc1NSAiISIKKwkjISAvYmluL3NoCisJZWNobyBzaQorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwlleHBvcnQgUEFUSD0uOiRQQVRICisJZmFsc2V0dG8KKwllY2hvIHllYXAKKwkhZmFsc2UKKwllY2hvIG1lb3cKKwkhIGZhbHNlCisJZWNobyA9ICQ/CisJaWYKKwkhIGZhbHNlOyB0aGVuIGVjaG8gZm9vOyBlbHNlIGVjaG8gYmFyOyBmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCW1vbHRvIGJlbmUKKwl5ZWFwCisJbW9sdG8gYmVuZQorCW1lb3cKKwltb2x0byBiZW5lCisJPSA0MgorCWZvbworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLy4qLworLS0tCituYW1lOiBldmVudC1zdWJzdC0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0ICchJyBzdWJzdGl0dXRpb24gaW4gbm9uaW50ZXJhY3RpdmUgbW9kZSBpcyBpZ25vcmVkCitjYXRlZ29yeTogIXNta3NoCitmaWxlLXNldHVwOiBmaWxlIDc1NSAiZmFsc2V0dG8iCisJIyEgL2Jpbi9zaAorCWVjaG8gbW9sdG8gYmVuZQorCWV4aXQgNDIKK2ZpbGUtc2V0dXA6IGZpbGUgNzU1ICIhZmFsc2UiCisJIyEgL2Jpbi9zaAorCWVjaG8gc2kKK3N0ZGluOgorCWV4cG9ydCBQQVRIPS46JFBBVEgKKwlmYWxzZXR0bworCWVjaG8geWVhcAorCSFmYWxzZQorCWVjaG8gbWVvdworCSEgZmFsc2UKKwllY2hvID0gJD8KKwlpZgorCSEgZmFsc2U7IHRoZW4gZWNobyBmb287IGVsc2UgZWNobyBiYXI7IGZpCitleHBlY3RlZC1zdGRvdXQ6CisJbW9sdG8gYmVuZQorCXllYXAKKwlzaQorCW1lb3cKKwk9IDAKKwlmb28KKy0tLQorbmFtZTogbm91bnNldC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0ICJzZXQgLXUiIG1hdGNoZXMgKGZ1dHVyZSkgU1VTdjQgcmVxdWlyZW1lbnQKK3N0ZGluOgorCShzZXQgLXUKKwl0cnkoKSB7CisJCWxvY2FsIHYKKwkJZXZhbCB2PVwkJDEKKwkJaWYgW1sgLW4gJHYgXV07IHRoZW4KKwkJCWVjaG8gJDE9bnoKKwkJZWxzZQorCQkJZWNobyAkMT16ZgorCQlmaQorCX0KKwl4PXkKKwkoZWNobyAkeCkKKwllY2hvID0xCisJKGVjaG8gJHkpCisJZWNobyA9MgorCSh0cnkgeCkKKwllY2hvID0zCisJKHRyeSB5KQorCWVjaG8gPTQKKwkodHJ5IDApCisJZWNobyA9NQorCSh0cnkgMikKKwllY2hvID02CisJKHRyeSkKKwllY2hvID03CisJKGVjaG8gYXQ9JEApCisJZWNobyA9OAorCShlY2hvIGFzdGVyaXNrPSQqKQorCWVjaG8gPTkKKwkoZWNobyAkPykKKwllY2hvID0xMAorCShlY2hvICQhKQorCWVjaG8gPTExCisJKGVjaG8gJC0pCisJZWNobyA9MTIKKwkjKGVjaG8gJF8pCisJI2VjaG8gPTEzCisJKGVjaG8gJCMpCisJZWNobyA9MTQKKwkobXlwaWQ9JCQ7IHRyeSBteXBpZCkKKwllY2hvID0xNQorCSkgMj4mMSB8IHNlZCAtZSAncy9eW15dXSpdLy8nIC1lICdzL15bXjpdKjogKi8vJworZXhwZWN0ZWQtc3Rkb3V0OgorCXkKKwk9MQorCXk6IHBhcmFtZXRlciBub3Qgc2V0CisJPTIKKwl4PW56CisJPTMKKwl5OiBwYXJhbWV0ZXIgbm90IHNldAorCT00CisJMD1uegorCT01CisJMjogcGFyYW1ldGVyIG5vdCBzZXQKKwk9NgorCTE6IHBhcmFtZXRlciBub3Qgc2V0CisJPTcKKwlhdD0KKwk9OAorCWFzdGVyaXNrPQorCT05CisJMAorCT0xMAorCSE6IHBhcmFtZXRlciBub3Qgc2V0CisJPTExCisJdXNoCisJPTEyCisJMAorCT0xNAorCW15cGlkPW56CisJPTE1CistLS0KK25hbWU6IG5hbWVyZWYtMQorZGVzY3JpcHRpb246CisJVGVzdHN1aXRlIGZvciBuYW1lcmVmIChib3VuZCB2YXJpYWJsZXMpCitzdGRpbjoKKwliYXI9Z2xvYmFsCisJdHlwZXNldCAtbiBpcjI9YmFyCisJdHlwZXNldCAtbiBpbmQ9aXIyCisJZWNobyAhaW5kOiAkeyFpbmR9CisJZWNobyBpbmQ6ICRpbmQKKwllY2hvICFpcjI6ICR7IWlyMn0KKwllY2hvIGlyMjogJGlyMgorCXR5cGVzZXQgK24gaW5kCisJZWNobyAhaW5kOiAkeyFpbmR9CisJZWNobyBpbmQ6ICRpbmQKKwl0eXBlc2V0IC1uIGlyMj1pbmQKKwllY2hvICFpcjI6ICR7IWlyMn0KKwllY2hvIGlyMjogJGlyMgorCXNldHxncmVwIF5pcjJ8c2VkICdzL14vczE6IC8nCisJdHlwZXNldHxncmVwICcgaXIyJ3xzZWQgLWUgJ3MvXi9zMjogLycgLWUgJ3MvbmFtZXJlZi90eXBlc2V0IC1uLycKKwlzZXQgLUEgYmx1YiAtLSBlMSBlMiBlMworCXR5cGVzZXQgLW4gaW5kPWJsdWIKKwl0eXBlc2V0IC1uIGlyMj1ibHViWzJdCisJZWNobyAhaW5kWzFdOiAkeyFpbmRbMV19CisJZWNobyAhaXIyOiAkIWlyMgorCWVjaG8gaW5kWzFdOiAke2luZFsxXX0KKwllY2hvIGlyMjogJGlyMgorZXhwZWN0ZWQtc3Rkb3V0OgorCSFpbmQ6IGJhcgorCWluZDogZ2xvYmFsCisJIWlyMjogYmFyCisJaXIyOiBnbG9iYWwKKwkhaW5kOiBpbmQKKwlpbmQ6IGlyMgorCSFpcjI6IGluZAorCWlyMjogaXIyCisJczE6IGlyMj1pbmQKKwlzMjogdHlwZXNldCAtbiBpcjIKKwkhaW5kWzFdOiAxCisJIWlyMjogaXIyCisJaW5kWzFdOiBlMgorCWlyMjogZTMKKy0tLQorbmFtZTogbmFtZXJlZi0yZGEKK2Rlc2NyaXB0aW9uOgorCVRlc3RzdWl0ZSBmb3IgbmFtZXJlZiAoYm91bmQgdmFyaWFibGVzKQorCUZ1bmN0aW9ucywgYXJndW1lbnQgZ2l2ZW4gZGlyZWN0bHksIGFmdGVyIGxvY2FsCitzdGRpbjoKKwlmdW5jdGlvbiBmb28geworCQl0eXBlc2V0IGJhcj1sb2thbCBiYXo9YXVjaAorCQl0eXBlc2V0IC1uIHY9YmFyCisJCWVjaG8gZW50ZXJpbmcKKwkJZWNobyAhdjogJHshdn0KKwkJZWNobyAhYmFyOiAkeyFiYXJ9CisJCWVjaG8gIWJhejogJHshYmF6fQorCQllY2hvIGJhcjogJGJhcgorCQllY2hvIHY6ICR2CisJCXY9MTIzCisJCWVjaG8gYmFyOiAkYmFyCisJCWVjaG8gdjogJHYKKwkJZWNobyBleGl0aW5nCisJfQorCWJhcj1nbG9iYWwKKwllY2hvIGJhcjogJGJhcgorCWZvbyBiYXIKKwllY2hvIGJhcjogJGJhcgorZXhwZWN0ZWQtc3Rkb3V0OgorCWJhcjogZ2xvYmFsCisJZW50ZXJpbmcKKwkhdjogYmFyCisJIWJhcjogYmFyCisJIWJhejogYmF6CisJYmFyOiBsb2thbAorCXY6IGxva2FsCisJYmFyOiAxMjMKKwl2OiAxMjMKKwlleGl0aW5nCisJYmFyOiBnbG9iYWwKKy0tLQorbmFtZTogbmFtZXJlZi0zCitkZXNjcmlwdGlvbjoKKwlBZHZhbmNlZCB0ZXN0c3VpdGUgZm9yIGJvdW5kIHZhcmlhYmxlcyAoa3NoOTMgZmFpbHMgdGhpcykKK3N0ZGluOgorCXR5cGVzZXQgLW4gZm9vPWJhcltpXQorCXNldCAtQSBiYXIgLS0gYiBjIGEKKwlmb3IgaSBpbiAwIDEgMiAzOyBkbworCQlwcmludCAkaSAkZm9vIC4KKwlkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJMCBiIC4KKwkxIGMgLgorCTIgYSAuCisJMyAuCistLS0KK25hbWU6IGJldHRlci1wYXJlbnMtMWEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKK3N0ZGluOgorCWlmICggKGVjaG8gZnViYXIpIHwgdHIgdSB4KTsgdGhlbgorCQllY2hvIGphCisJZWxzZQorCQllY2hvIG5laW4KKwlmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCWZ4YmFyCisJamEKKy0tLQorbmFtZTogYmV0dGVyLXBhcmVucy0xYgorZGVzY3JpcHRpb246CisJQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQorc3RkaW46CisJZWNobyAkKCAoZWNobyBmdWJhcikgfCB0ciB1IHgpICQ/CitleHBlY3RlZC1zdGRvdXQ6CisJZnhiYXIgMAorLS0tCituYW1lOiBiZXR0ZXItcGFyZW5zLTJhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCitzdGRpbjoKKwlpZiAoKGVjaG8gZnViYXIpIHwgdHIgdSB4KTsgdGhlbgorCQllY2hvIGphCisJZWxzZQorCQllY2hvIG5laW4KKwlmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCWZ4YmFyCisJamEKKy0tLQorbmFtZTogYmV0dGVyLXBhcmVucy0yYgorZGVzY3JpcHRpb246CisJQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQorc3RkaW46CisJZWNobyAkKChlY2hvIGZ1YmFyKSB8IHRyIHUgeCkgJD8KK2V4cGVjdGVkLXN0ZG91dDoKKwlmeGJhciAwCistLS0KK25hbWU6IGJldHRlci1wYXJlbnMtM2EKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKK3N0ZGluOgorCWlmICggKGVjaG8gZnViYXIpIHwgKHRyIHUgeCkpOyB0aGVuCisJCWVjaG8gamEKKwllbHNlCisJCWVjaG8gbmVpbgorCWZpCitleHBlY3RlZC1zdGRvdXQ6CisJZnhiYXIKKwlqYQorLS0tCituYW1lOiBiZXR0ZXItcGFyZW5zLTNiCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCitzdGRpbjoKKwllY2hvICQoIChlY2hvIGZ1YmFyKSB8ICh0ciB1IHgpKSAkPworZXhwZWN0ZWQtc3Rkb3V0OgorCWZ4YmFyIDAKKy0tLQorbmFtZTogYmV0dGVyLXBhcmVucy00YQorZGVzY3JpcHRpb246CisJQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQorc3RkaW46CisJaWYgKChlY2hvIGZ1YmFyKSB8ICh0ciB1IHgpKTsgdGhlbgorCQllY2hvIGphCisJZWxzZQorCQllY2hvIG5laW4KKwlmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCWZ4YmFyCisJamEKKy0tLQorbmFtZTogYmV0dGVyLXBhcmVucy00YgorZGVzY3JpcHRpb246CisJQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQorc3RkaW46CisJZWNobyAkKChlY2hvIGZ1YmFyKSB8ICh0ciB1IHgpKSAkPworZXhwZWN0ZWQtc3Rkb3V0OgorCWZ4YmFyIDAKKy0tLQorbmFtZTogZWNoby10ZXN0LTEKK2Rlc2NyaXB0aW9uOgorCVRlc3Qgd2hhdCB0aGUgZWNobyBidWlsdGluIGRvZXMgKG1rc2gpCitzdGRpbjoKKwllY2hvIC1uICdmb29ceDQwYmFyJworCWVjaG8gLWUgJ1x0YmF6JworZXhwZWN0ZWQtc3Rkb3V0OgorCWZvb0BiYXIJYmF6CistLS0KK25hbWU6IGVjaG8tdGVzdC0yCitkZXNjcmlwdGlvbjoKKwlUZXN0IHdoYXQgdGhlIGVjaG8gYnVpbHRpbiBkb2VzIChQT1NJWCkKKwlOb3RlOiB0aGlzIGZvbGxvd3MgRGViaWFuIFBvbGljeSAxMC40IHdoaWNoIG1hbmRhdGVzCisJdGhhdCAtbiBzaGFsbCBiZSB0cmVhdGVkIGFzIGFuIG9wdGlvbiwgbm90IFhTSSB3aGljaAorCW1hbmRhdGVzIGl0IHNoYWxsIGJlIHRyZWF0ZWQgYXMgc3RyaW5nIGJ1dCBlc2NhcGVzCisJc2hhbGwgYmUgZXhwYW5kZWQuCitzdGRpbjoKKwl0ZXN0IC1uICIkUE9TSF9WRVJTSU9OIiB8fCBzZXQgLW8gc2gKKwllY2hvIC1uICdmb29ceDQwYmFyJworCWVjaG8gLWUgJ1x0YmF6JworZXhwZWN0ZWQtc3Rkb3V0OgorCWZvb1x4NDBiYXItZSBcdGJhegorLS0tCituYW1lOiB1dGlsaXRpZXMtZ2V0b3B0cy0xCitkZXNjcmlwdGlvbjoKKwlnZXRvcHRzIHNldHMgT1BUSU5EIGNvcnJlY3RseSBmb3IgdW5wYXJzZWQgb3B0aW9uCitzdGRpbjoKKwlzZXQgLS0gLWEgLWEgLXgKKwl3aGlsZSBnZXRvcHRzIDphIG9wdGM7IGRvCisJICAgIGVjaG8gIk9QVEFSRz0kT1BUQVJHLCBPUFRJTkQ9JE9QVElORCwgb3B0Yz0kb3B0Yy4iCisJZG9uZQorCWVjaG8gZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCU9QVEFSRz0sIE9QVElORD0yLCBvcHRjPWEuCisJT1BUQVJHPSwgT1BUSU5EPTMsIG9wdGM9YS4KKwlPUFRBUkc9eCwgT1BUSU5EPTQsIG9wdGM9Py4KKwlkb25lCistLS0KK25hbWU6IHV0aWxpdGllcy1nZXRvcHRzLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIE9QVEFSRworc3RkaW46CisJc2V0IC0tIC1hIE1hcnkgLXgKKwl3aGlsZSBnZXRvcHRzIGE6IG9wdGM7IGRvCisJICAgIGVjaG8gIk9QVEFSRz0kT1BUQVJHLCBPUFRJTkQ9JE9QVElORCwgb3B0Yz0kb3B0Yy4iCisJZG9uZQorCWVjaG8gZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCU9QVEFSRz1NYXJ5LCBPUFRJTkQ9Mywgb3B0Yz1hLgorCU9QVEFSRz0sIE9QVElORD00LCBvcHRjPT8uCisJZG9uZQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uKi14LipvcHRpb24vCistLS0KK25hbWU6IHdjc3dpZHRoLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoZSBuZXcgd2Nzd2lkdGggZmVhdHVyZQorc3RkaW46CisJcz3kvZUKKwlzZXQgK1UKKwlwcmludCBvY3RldHM6ICR7I3N9IC4KKwlwcmludCA4LWJpdCB3aWR0aDogJHslc30gLgorCXNldCAtVQorCXByaW50IGNoYXJhY3RlcnM6ICR7I3N9IC4KKwlwcmludCBjb2x1bW5zOiAkeyVzfSAuCisJcz3vv70KKwlzZXQgK1UKKwlwcmludCBvY3RldHM6ICR7I3N9IC4KKwlwcmludCA4LWJpdCB3aWR0aDogJHslc30gLgorCXNldCAtVQorCXByaW50IGNoYXJhY3RlcnM6ICR7I3N9IC4KKwlwcmludCBjb2x1bW5zOiAkeyVzfSAuCitleHBlY3RlZC1zdGRvdXQ6CisJb2N0ZXRzOiAzIC4KKwk4LWJpdCB3aWR0aDogLTEgLgorCWNoYXJhY3RlcnM6IDEgLgorCWNvbHVtbnM6IDIgLgorCW9jdGV0czogMyAuCisJOC1iaXQgd2lkdGg6IDMgLgorCWNoYXJhY3RlcnM6IDEgLgorCWNvbHVtbnM6IDEgLgorLS0tCituYW1lOiB3Y3N3aWR0aC0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzb21lIGNvcm5lciBjYXNlcworc3RkaW46CisJcHJpbnQgJSAkJSAuCisJc2V0IC1VCisJeD0nYQliJworCXByaW50IGMgJHsleH0gLgorCXNldCArVQorCXg9J2EJYicKKwlwcmludCBkICR7JXh9IC4KK2V4cGVjdGVkLXN0ZG91dDoKKwklICQlIC4KKwljIC0xIC4KKwlkIC0xIC4KKy0tLQorbmFtZTogd2Nzd2lkdGgtMworZGVzY3JpcHRpb246CisJQ2hlY2sgc29tZSBjb3JuZXIgY2FzZXMKK3N0ZGluOgorCXByaW50ICR7JX0gLgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL2JhZCBzdWJzdGl0dXRpb24vCitleHBlY3RlZC1leGl0OiAxCistLS0KK25hbWU6IHdjc3dpZHRoLTRhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzb21lIGNvcm5lciBjYXNlcworc3RkaW46CisJcHJpbnQgJHslKn0gLgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL2JhZCBzdWJzdGl0dXRpb24vCitleHBlY3RlZC1leGl0OiAxCistLS0KK25hbWU6IHdjc3dpZHRoLTRiCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzb21lIGNvcm5lciBjYXNlcworc3RkaW46CisJcHJpbnQgJHslQH0gLgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL2JhZCBzdWJzdGl0dXRpb24vCitleHBlY3RlZC1leGl0OiAxCistLS0KK25hbWU6IHdjc3dpZHRoLTRjCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzb21lIGNvcm5lciBjYXNlcworc3RkaW46CisJOgorCXByaW50ICR7JT99IC4KK2V4cGVjdGVkLXN0ZG91dDoKKwkxIC4KKy0tLQorbmFtZTogcmVhbHBhdGgtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgcHJvcGVyIHJldHVybiB2YWx1ZXMgZm9yIHJlYWxwYXRoCitjYXRlZ29yeTogb3M6bWlyYnNkCitzdGRpbjoKKwl3ZD0kKHJlYWxwYXRoIC4pCisJbWtkaXIgZGlyCisJOj5maWxlCisJOj5kaXIvZmlsZQorCWxuIC1zIGRpciBsbmRpcgorCWxuIC1zIGZpbGUgbG5maWxlCisJbG4gLXMgbml4IGxubml4CisJbG4gLXMgLiBsbnNlbGYKKwlpPTAKKwljaGsoKSB7CisJCXR5cGVzZXQgeCB5CisJCXg9JChyZWFscGF0aCAiJHdkLyQxIiAyPiYxKTsgeT0kPworCQlwcmludCAkKCgrK2kpKSAiPyQxIiA9JHt4IyMqJHdkL30gISR5CisJfQorCWNoayBkaXIKKwljaGsgZGlyLworCWNoayBkaXIvZmlsZQorCWNoayBkaXIvbml4CisJY2hrIGZpbGUKKwljaGsgZmlsZS8KKwljaGsgZmlsZS9maWxlCisJY2hrIGZpbGUvbml4CisJY2hrIG5peAorCWNoayBuaXgvCisJY2hrIG5peC9maWxlCisJY2hrIG5peC9uaXgKKwljaGsgbG5kaXIKKwljaGsgbG5kaXIvCisJY2hrIGxuZGlyL2ZpbGUKKwljaGsgbG5kaXIvbml4CisJY2hrIGxuZmlsZQorCWNoayBsbmZpbGUvCisJY2hrIGxuZmlsZS9maWxlCisJY2hrIGxuZmlsZS9uaXgKKwljaGsgbG5uaXgKKwljaGsgbG5uaXgvCisJY2hrIGxubml4L2ZpbGUKKwljaGsgbG5uaXgvbml4CisJY2hrIGxuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZgorCXJtIGxuc2VsZgorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgP2RpciA9ZGlyICEwCisJMiA/ZGlyLyA9ZGlyICEwCisJMyA/ZGlyL2ZpbGUgPWRpci9maWxlICEwCisJNCA/ZGlyL25peCA9ZGlyL25peCAhMAorCTUgP2ZpbGUgPWZpbGUgITAKKwk2ID9maWxlLyA9ZmlsZS86IE5vdCBhIGRpcmVjdG9yeSAhMjAKKwk3ID9maWxlL2ZpbGUgPWZpbGUvZmlsZTogTm90IGEgZGlyZWN0b3J5ICEyMAorCTggP2ZpbGUvbml4ID1maWxlL25peDogTm90IGEgZGlyZWN0b3J5ICEyMAorCTkgP25peCA9bml4ICEwCisJMTAgP25peC8gPW5peCAhMAorCTExID9uaXgvZmlsZSA9bml4L2ZpbGU6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgITIKKwkxMiA/bml4L25peCA9bml4L25peDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAhMgorCTEzID9sbmRpciA9ZGlyICEwCisJMTQgP2xuZGlyLyA9ZGlyICEwCisJMTUgP2xuZGlyL2ZpbGUgPWRpci9maWxlICEwCisJMTYgP2xuZGlyL25peCA9ZGlyL25peCAhMAorCTE3ID9sbmZpbGUgPWZpbGUgITAKKwkxOCA/bG5maWxlLyA9bG5maWxlLzogTm90IGEgZGlyZWN0b3J5ICEyMAorCTE5ID9sbmZpbGUvZmlsZSA9bG5maWxlL2ZpbGU6IE5vdCBhIGRpcmVjdG9yeSAhMjAKKwkyMCA/bG5maWxlL25peCA9bG5maWxlL25peDogTm90IGEgZGlyZWN0b3J5ICEyMAorCTIxID9sbm5peCA9bml4ICEwCisJMjIgP2xubml4LyA9bml4ICEwCisJMjMgP2xubml4L2ZpbGUgPWxubml4L2ZpbGU6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgITIKKwkyNCA/bG5uaXgvbml4ID1sbm5peC9uaXg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgITIKKwkyNSA/bG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmID1sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGY6IFRvbyBtYW55IGxldmVscyBvZiBzeW1ib2xpYyBsaW5rcyAhNjIKKy0tLQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvZWRpdC5jIGIvbWtzaC9zcmMvZWRpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWRlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9lZGl0LmMKQEAgLTAsMCArMSw1MjQ5IEBACisvKgkkT3BlbkJTRDogZWRpdC5jLHYgMS4zNCAyMDEwLzA1LzIwIDAxOjEzOjA3IGZnc2NoIEV4cCAkCSovCisvKgkkT3BlbkJTRDogZWRpdC5oLHYgMS44IDIwMDUvMDMvMjggMjE6Mjg6MjIgZGVyYWFkdCBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IGVtYWNzLmMsdiAxLjQyIDIwMDkvMDYvMDIgMDY6NDc6NDcgaGFsZXggRXhwICQJKi8KKy8qCSRPcGVuQlNEOiB2aS5jLHYgMS4yNiAyMDA5LzA2LzI5IDIyOjUwOjE5IG1hcnR5bmFzIEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvZWRpdC5jLHYgMS4xOTYgMjAxMC8wNy8yNSAxMTozNTo0MCB0ZyBFeHAgJCIpOworCisvKgorICogaW4gbGF0ZXIgdmVyc2lvbnMgd2UgbWlnaHQgdXNlIGxpYnRlcm1jYXAgZm9yIHRoaXMsIGJ1dCBzaW5jZSBleHRlcm5hbAorICogZGVwZW5kZW5jaWVzIGFyZSBwcm9ibGVtYXRpYywgdGhpcyBoYXMgbm90IHlldCBiZWVuIGRlY2lkZWQgb247IGFub3RoZXIKKyAqIGdvb2Qgc3RyaW5nIGlzICJcMDMzYyIgZXhjZXB0IG9uIGhhcmR3YXJlIHRlcm1pbmFscyBsaWtlIHRoZSBERUMgVlQ0MjAKKyAqIHdoaWNoIGRvIGEgZnVsbCBwb3dlciBjeWNsZSB0aGVuLi4uCisgKi8KKyNpZm5kZWYgTUtTSF9DTFNfU1RSSU5HCisjZGVmaW5lIE1LU0hfQ0xTX1NUUklORwkJIlwwMzNbO0hcMDMzW0oiCisjZW5kaWYKKyNpZm5kZWYgTUtTSF9DTFJUT0VPTF9TVFJJTkcKKyNkZWZpbmUgTUtTSF9DTFJUT0VPTF9TVFJJTkcJIlwwMzNbSyIKKyNlbmRpZgorCisvKiB0dHkgZHJpdmVyIGNoYXJhY3RlcnMgd2UgYXJlIGludGVyZXN0ZWQgaW4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgZXJhc2U7CisJaW50IGtpbGw7CisJaW50IHdlcmFzZTsKKwlpbnQgaW50cjsKKwlpbnQgcXVpdDsKKwlpbnQgZW9mOworfSBYX2NoYXJzOworCitzdGF0aWMgWF9jaGFycyBlZGNoYXJzOworCisvKiB4X2ZjX2dsb2IoKSBmbGFncyAqLworI2RlZmluZSBYQ0ZfQ09NTUFORAlCSVQoMCkJLyogRG8gY29tbWFuZCBjb21wbGV0aW9uICovCisjZGVmaW5lIFhDRl9GSUxFCUJJVCgxKQkvKiBEbyBmaWxlIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgWENGX0ZVTExQQVRICUJJVCgyKQkvKiBjb21tYW5kIGNvbXBsZXRpb246IHN0b3JlIGZ1bGwgcGF0aCAqLworI2RlZmluZSBYQ0ZfQ09NTUFORF9GSUxFIChYQ0ZfQ09NTUFORHxYQ0ZfRklMRSkKKworc3RhdGljIGNoYXIgZWRpdG1vZGU7CitzdGF0aWMgaW50IHh4X2NvbHM7CQkJLyogZm9yIEVtYWNzIG1vZGUgKi8KK3N0YXRpYyBpbnQgbW9kaWZpZWQ7CQkJLyogYnVmZmVyIGhhcyBiZWVuICJtb2RpZmllZCIgKi8KK3N0YXRpYyBjaGFyIGhvbGRidWZbTElORV07CQkvKiBwbGFjZSB0byBob2xkIGxhc3QgZWRpdCBidWZmZXIgKi8KKworc3RhdGljIGludCB4X2dldGModm9pZCk7CitzdGF0aWMgdm9pZCB4X3B1dGNmKGludCk7CitzdGF0aWMgYm9vbCB4X21vZGUoYm9vbCk7CitzdGF0aWMgaW50IHhfZG9fY29tbWVudChjaGFyICosIGludCwgaW50ICopOworc3RhdGljIHZvaWQgeF9wcmludF9leHBhbnNpb25zKGludCwgY2hhciAqY29uc3QgKiwgYm9vbCk7CitzdGF0aWMgaW50IHhfY2ZfZ2xvYihpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCAqLCBpbnQgKiwgY2hhciAqKiosCisgICAgYm9vbCAqKTsKK3N0YXRpYyBpbnQgeF9sb25nZXN0X3ByZWZpeChpbnQsIGNoYXIgKmNvbnN0ICopOworc3RhdGljIGludCB4X2Jhc2VuYW1lKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHhfZnJlZV93b3JkcyhpbnQsIGNoYXIgKiopOworc3RhdGljIGludCB4X2VzY2FwZShjb25zdCBjaGFyICosIHNpemVfdCwgaW50ICgqKShjb25zdCBjaGFyICosIHNpemVfdCkpOworc3RhdGljIGludCB4X2VtYWNzKGNoYXIgKiwgc2l6ZV90KTsKK3N0YXRpYyB2b2lkIHhfaW5pdF9lbWFjcyh2b2lkKTsKK3N0YXRpYyB2b2lkIHhfaW5pdF9wcm9tcHQodm9pZCk7CisjaWYgIU1LU0hfU19OT1ZJCitzdGF0aWMgaW50IHhfdmkoY2hhciAqLCBzaXplX3QpOworI2VuZGlmCisKKyNkZWZpbmUgeF9mbHVzaCgpCXNoZl9mbHVzaChzaGxfb3V0KQorI2lmZGVmIE1LU0hfU01BTEwKKyNkZWZpbmUgeF9wdXRjKGMpCXhfcHV0Y2YoYykKKyNlbHNlCisjZGVmaW5lIHhfcHV0YyhjKQlzaGZfcHV0YygoYyksIHNobF9vdXQpCisjZW5kaWYKKworc3RhdGljIGludCBwYXRoX29yZGVyX2NtcChjb25zdCB2b2lkICphYSwgY29uc3Qgdm9pZCAqYmIpOworc3RhdGljIGNoYXIgKmFkZF9nbG9iKGNvbnN0IGNoYXIgKiwgaW50KQorICAgIE1LU0hfQV9OT05OVUxMKChub25udWxsICgxKSkpCisgICAgTUtTSF9BX0JPVU5ERUQoc3RyaW5nLCAxLCAyKTsKK3N0YXRpYyB2b2lkIGdsb2JfdGFibGUoY29uc3QgY2hhciAqLCBYUHRyViAqLCBzdHJ1Y3QgdGFibGUgKik7CitzdGF0aWMgdm9pZCBnbG9iX3BhdGgoaW50IGZsYWdzLCBjb25zdCBjaGFyICosIFhQdHJWICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IHhfZmlsZV9nbG9iKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGNoYXIgKioqKQorICAgIE1LU0hfQV9OT05OVUxMKChub25udWxsICgyKSkpCisgICAgTUtTSF9BX0JPVU5ERUQoc3RyaW5nLCAyLCAzKTsKK3N0YXRpYyBpbnQgeF9jb21tYW5kX2dsb2IoaW50LCBjb25zdCBjaGFyICosIGludCwgY2hhciAqKiopCisgICAgTUtTSF9BX05PTk5VTEwoKG5vbm51bGwgKDIpKSkKKyAgICBNS1NIX0FfQk9VTkRFRChzdHJpbmcsIDIsIDMpOworc3RhdGljIGludCB4X2xvY2F0ZV93b3JkKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCAqLCBib29sICopOworCitzdGF0aWMgaW50IHhfZV9nZXRtYmMoY2hhciAqKTsKK3N0YXRpYyBpbnQgeF9lX3JlYnVpbGRsaW5lKGNvbnN0IGNoYXIgKik7CisKKy8qICsrKyBnZW5lcmljIGVkaXRpbmcgZnVuY3Rpb25zICsrKyAqLworCisvKiBDYWxsZWQgZnJvbSBtYWluICovCit2b2lkCit4X2luaXQodm9pZCkKK3sKKwkvKiBzZXQgdG8gLTIgdG8gZm9yY2UgaW5pdGlhbCBiaW5kaW5nICovCisJZWRjaGFycy5lcmFzZSA9IGVkY2hhcnMua2lsbCA9IGVkY2hhcnMuaW50ciA9IGVkY2hhcnMucXVpdCA9CisJICAgIGVkY2hhcnMuZW9mID0gLTI7CisJLyogZGVmYXVsdCB2YWx1ZSBmb3IgZGVmaWNpZW50IHN5c3RlbXMgKi8KKwllZGNoYXJzLndlcmFzZSA9IDAyNzsJLyogXlcgKi8KKwl4X2luaXRfZW1hY3MoKTsKK30KKworLyoKKyAqIHJlYWQgYW4gZWRpdGVkIGNvbW1hbmQgbGluZQorICovCitpbnQKK3hfcmVhZChjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaW50IGk7CisKKwl4X21vZGUodHJ1ZSk7CisJbW9kaWZpZWQgPSAxOworCWlmIChGbGFnKEZFTUFDUykgfHwgRmxhZyhGR01BQ1MpKQorCQlpID0geF9lbWFjcyhidWYsIGxlbik7CisjaWYgIU1LU0hfU19OT1ZJCisJZWxzZSBpZiAoRmxhZyhGVkkpKQorCQlpID0geF92aShidWYsIGxlbik7CisjZW5kaWYKKwllbHNlCisJCWkgPSAtMTsJCS8qIGludGVybmFsIGVycm9yICovCisJZWRpdG1vZGUgPSAwOworCXhfbW9kZShmYWxzZSk7CisJcmV0dXJuIChpKTsKK30KKworLyogdHR5IEkvTyAqLworCitzdGF0aWMgaW50Cit4X2dldGModm9pZCkKK3sKKwljaGFyIGM7CisJaW50IG47CisKKwl3aGlsZSAoKG4gPSBibG9ja2luZ19yZWFkKFNURElOX0ZJTEVOTywgJmMsIDEpKSA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisJCWlmICh0cmFwKSB7CisJCQl4X21vZGUoZmFsc2UpOworCQkJcnVudHJhcHMoMCk7CisjaWZkZWYgU0lHV0lOQ0gKKwkJCWlmIChnb3Rfd2luY2gpIHsKKwkJCQljaGFuZ2Vfd2luc3ooKTsKKwkJCQlpZiAoeF9jb2xzICE9IHh4X2NvbHMgJiYgZWRpdG1vZGUgPT0gMSkgeworCQkJCQkvKiByZWRyYXcgbGluZSBpbiBFbWFjcyBtb2RlICovCisJCQkJCXh4X2NvbHMgPSB4X2NvbHM7CisJCQkJCXhfZV9yZWJ1aWxkbGluZShNS1NIX0NMUlRPRU9MX1NUUklORyk7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQl4X21vZGUodHJ1ZSk7CisJCX0KKwlyZXR1cm4gKChuID09IDEpID8gKGludCkodW5zaWduZWQgY2hhciljIDogLTEpOworfQorCitzdGF0aWMgdm9pZAoreF9wdXRjZihpbnQgYykKK3sKKwlzaGZfcHV0YyhjLCBzaGxfb3V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWlzYyBjb21tb24gY29kZSBmb3IgdmkvZW1hY3MgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGFuZGxlIHRoZSBjb21tZW50aW5nL3VuY29tbWVudGluZyBvZiBhIGxpbmUuCisgKiBSZXR1cm5zOgorICoJMSBpZiBhIGNhcnJpYWdlIHJldHVybiBpcyBpbmRpY2F0ZWQgKGNvbW1lbnQgYWRkZWQpCisgKgkwIGlmIG5vIHJldHVybiAoY29tbWVudCByZW1vdmVkKQorICoJLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IgKG5vdCBlbm91Z2ggcm9vbSBmb3IgY29tbWVudCBjaGFycykKKyAqIElmIHN1Y2Nlc3NmdWwsICpsZW5wIGNvbnRhaW5zIHRoZSBuZXcgbGVuZ3RoLiBOb3RlOiBjdXJzb3Igc2hvdWxkIGJlCisgKiBtb3ZlZCB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgYWZ0ZXIgKHVuKWNvbW1lbnRpbmcuCisgKi8KK3N0YXRpYyBpbnQKK3hfZG9fY29tbWVudChjaGFyICpidWYsIGludCBic2l6ZSwgaW50ICpsZW5wKQoreworCWludCBpLCBqLCBsZW4gPSAqbGVucDsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuICgxKTsgLyogc29tZXdoYXQgYXJiaXRyYXJ5IC0gaXQncyB3aGF0IEFUJlQga3NoIGRvZXMgKi8KKworCS8qIEFscmVhZHkgY29tbWVudGVkPyAqLworCWlmIChidWZbMF0gPT0gJyMnKSB7CisJCWJvb2wgc2F3X25sID0gZmFsc2U7CisKKwkJZm9yIChqID0gMCwgaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQkJaWYgKCFzYXdfbmwgfHwgYnVmW2ldICE9ICcjJykKKwkJCQlidWZbaisrXSA9IGJ1ZltpXTsKKwkJCXNhd19ubCA9IGJ1ZltpXSA9PSAnXG4nOworCQl9CisJCSpsZW5wID0gajsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQlpbnQgbiA9IDE7CisKKwkJLyogU2VlIGlmIHRoZXJlJ3Mgcm9vbSBmb3IgdGhlICNzIC0gMSBwZXIgXG4gKi8KKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJaWYgKGJ1ZltpXSA9PSAnXG4nKQorCQkJCW4rKzsKKwkJaWYgKGxlbiArIG4gPj0gYnNpemUpCisJCQlyZXR1cm4gKC0xKTsKKwkJLyogTm93IGFkZCB0aGVtLi4uICovCisJCWZvciAoaSA9IGxlbiwgaiA9IGxlbiArIG47IC0taSA+PSAwOyApIHsKKwkJCWlmIChidWZbaV0gPT0gJ1xuJykKKwkJCQlidWZbLS1qXSA9ICcjJzsKKwkJCWJ1ZlstLWpdID0gYnVmW2ldOworCQl9CisJCWJ1ZlswXSA9ICcjJzsKKwkJKmxlbnAgKz0gbjsKKwkJcmV0dXJuICgxKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb21tb24gZmlsZS9jb21tYW5kIGNvbXBsZXRpb24gY29kZSBmb3IgdmkvZW1hY3MgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCit4X3ByaW50X2V4cGFuc2lvbnMoaW50IG53b3JkcywgY2hhciAqIGNvbnN0ICp3b3JkcywgYm9vbCBpc19jb21tYW5kKQoreworCWJvb2wgdXNlX2NvcHkgPSBmYWxzZTsKKwlpbnQgcHJlZml4X2xlbjsKKwlYUHRyViBsID0geyBOVUxMLCBOVUxMLCBOVUxMIH07CisKKwkvKiBDaGVjayBpZiBhbGwgbWF0Y2hlcyBhcmUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IChpbiB0aGlzCisJICogY2FzZSwgd2Ugd2FudCB0byBvbWl0IHRoZSBkaXJlY3RvcnkgbmFtZSkKKwkgKi8KKwlpZiAoIWlzX2NvbW1hbmQgJiYKKwkgICAgKHByZWZpeF9sZW4gPSB4X2xvbmdlc3RfcHJlZml4KG53b3Jkcywgd29yZHMpKSA+IDApIHsKKwkJaW50IGk7CisKKwkJLyogU3BlY2lhbCBjYXNlIGZvciAxIG1hdGNoIChwcmVmaXggaXMgd2hvbGUgd29yZCkgKi8KKwkJaWYgKG53b3JkcyA9PSAxKQorCQkJcHJlZml4X2xlbiA9IHhfYmFzZW5hbWUod29yZHNbMF0sIE5VTEwpOworCQkvKiBBbnkgKG5vbi10cmFpbGluZykgc2xhc2hlcyBpbiBub24tY29tbW9uIHdvcmQgc3VmZml4ZXM/ICovCisJCWZvciAoaSA9IDA7IGkgPCBud29yZHM7IGkrKykKKwkJCWlmICh4X2Jhc2VuYW1lKHdvcmRzW2ldICsgcHJlZml4X2xlbiwgTlVMTCkgPgorCQkJICAgIHByZWZpeF9sZW4pCisJCQkJYnJlYWs7CisJCS8qIEFsbCBpbiBzYW1lIGRpcmVjdG9yeT8gKi8KKwkJaWYgKGkgPT0gbndvcmRzKSB7CisJCQl3aGlsZSAocHJlZml4X2xlbiA+IDAgJiYgd29yZHNbMF1bcHJlZml4X2xlbiAtIDFdICE9ICcvJykKKwkJCQlwcmVmaXhfbGVuLS07CisJCQl1c2VfY29weSA9IHRydWU7CisJCQlYUGluaXQobCwgbndvcmRzICsgMSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCisJCQkJWFBwdXQobCwgd29yZHNbaV0gKyBwcmVmaXhfbGVuKTsKKwkJCVhQcHV0KGwsIE5VTEwpOworCQl9CisJfQorCS8qCisJICogRW51bWVyYXRlIGV4cGFuc2lvbnMKKwkgKi8KKwl4X3B1dGMoJ1xyJyk7CisJeF9wdXRjKCdcbicpOworCXByX2xpc3QodXNlX2NvcHkgPyAoY2hhciAqKilYUHB0cnYobCkgOiB3b3Jkcyk7CisKKwlpZiAodXNlX2NvcHkpCisJCVhQZnJlZShsKTsgLyogbm90IHhfZnJlZV93b3JkcygpICovCit9CisKKy8qKgorICogRG8gZmlsZSBnbG9iYmluZzoKKyAqCS0gYXBwZW5kcyAqIHRvIChjb3B5IG9mKSBzdHIgaWYgbm8gZ2xvYmJpbmcgY2hhcnMgZm91bmQKKyAqCS0gZG9lcyBleHBhbnNpb24sIGNoZWNrcyBmb3Igbm8gbWF0Y2gsIGV0Yy4KKyAqCS0gc2V0cyAqd29yZHNwIHRvIGFycmF5IG9mIG1hdGNoaW5nIHN0cmluZ3MKKyAqCS0gcmV0dXJucyBudW1iZXIgb2YgbWF0Y2hpbmcgc3RyaW5ncworICovCitzdGF0aWMgaW50Cit4X2ZpbGVfZ2xvYihpbnQgZmxhZ3MgTUtTSF9BX1VOVVNFRCwgY29uc3QgY2hhciAqc3RyLCBpbnQgc2xlbiwgY2hhciAqKip3b3Jkc3ApCit7CisJY2hhciAqdG9nbG9iLCAqKndvcmRzOworCWludCBud29yZHMsIGksIGlkeDsKKwlib29sIGVzY2FwaW5nOworCVhQdHJWIHc7CisJc3RydWN0IHNvdXJjZSAqcywgKnNvbGQ7CisKKwlpZiAoc2xlbiA8IDApCisJCXJldHVybiAoMCk7CisKKwl0b2dsb2IgPSBhZGRfZ2xvYihzdHIsIHNsZW4pOworCisJLyogcmVtb3ZlIGFsbCBlc2NhcGluZyBiYWNrd2FyZCBzbGFzaGVzICovCisJZXNjYXBpbmcgPSBmYWxzZTsKKwlmb3IgKGkgPSAwLCBpZHggPSAwOyB0b2dsb2JbaV07IGkrKykgeworCQlpZiAodG9nbG9iW2ldID09ICdcXCcgJiYgIWVzY2FwaW5nKSB7CisJCQllc2NhcGluZyA9IHRydWU7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBzcGVjaWFsbHkgZXNjYXBlIGVzY2FwZWQgWyBvciAkIG9yIGAgZm9yIGdsb2JiaW5nICovCisJCWlmIChlc2NhcGluZyAmJiAodG9nbG9iW2ldID09ICdbJyB8fAorCQkgICAgdG9nbG9iW2ldID09ICckJyB8fCB0b2dsb2JbaV0gPT0gJ2AnKSkKKwkJCXRvZ2xvYltpZHgrK10gPSBRQ0hBUjsKKworCQl0b2dsb2JbaWR4XSA9IHRvZ2xvYltpXTsKKwkJaWR4Kys7CisJCWlmIChlc2NhcGluZykKKwkJCWVzY2FwaW5nID0gZmFsc2U7CisJfQorCXRvZ2xvYltpZHhdID0gJ1wwJzsKKworCS8qCisJICogQ29udmVydCAiZm9vKiIgKHRvZ2xvYikgdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncyAod29yZHMpCisJICovCisJc29sZCA9IHNvdXJjZTsKKwlzID0gcHVzaHMoU1dTVFIsIEFURU1QKTsKKwlzLT5zdGFydCA9IHMtPnN0ciA9IHRvZ2xvYjsKKwlzb3VyY2UgPSBzOworCWlmICh5eWxleChPTkVXT1JEIHwgTFFDSEFSKSAhPSBMV09SRCkgeworCQlzb3VyY2UgPSBzb2xkOworCQlpbnRlcm5hbF93YXJuaW5nZigiZmlsZWdsb2I6IHN1YnN0aXR1dGUgZXJyb3IiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJc291cmNlID0gc29sZDsKKwlYUGluaXQodywgMzIpOworCWV4cGFuZCh5eWx2YWwuY3AsICZ3LCBET0dMT0IgfCBET1RJTERFIHwgRE9NQVJLRElSUyk7CisJWFBwdXQodywgTlVMTCk7CisJd29yZHMgPSAoY2hhciAqKilYUGNsb3NlKHcpOworCisJZm9yIChud29yZHMgPSAwOyB3b3Jkc1tud29yZHNdOyBud29yZHMrKykKKwkJOworCWlmIChud29yZHMgPT0gMSkgeworCQlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKworCQkvKiBDaGVjayBpZiBnbG9iYmluZyBmYWlsZWQgKHJldHVybmVkIGdsb2IgcGF0dGVybiksCisJCSAqIGJ1dCBiZSBjYXJlZnVsIChFLmcuIHRvZ2xvYiA9PSAiYWIqIiB3aGVuIHRoZSBmaWxlCisJCSAqICJhYioiIGV4aXN0cyBpcyBub3QgYW4gZXJyb3IpLgorCQkgKiBBbHNvLCBjaGVjayBmb3IgZW1wdHkgcmVzdWx0IC0gaGFwcGVucyBpZiB3ZSB0cmllZAorCQkgKiB0byBnbG9iIHNvbWV0aGluZyB3aGljaCBldmFsdWF0ZWQgdG8gYW4gZW1wdHkKKwkJICogc3RyaW5nIChlLmcuLCAiJEZPTyIgd2hlbiB0aGVyZSBpcyBubyBGT08sIGV0YykuCisJCSAqLworCQlpZiAoKHN0cmNtcCh3b3Jkc1swXSwgdG9nbG9iKSA9PSAwICYmCisJCSAgICBzdGF0KHdvcmRzWzBdLCAmc3RhdGIpIDwgMCkgfHwKKwkJICAgIHdvcmRzWzBdWzBdID09ICdcMCcpIHsKKwkJCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKKwkJCXdvcmRzID0gTlVMTDsKKwkJCW53b3JkcyA9IDA7CisJCX0KKwl9CisJYWZyZWUodG9nbG9iLCBBVEVNUCk7CisKKwlpZiAoKCp3b3Jkc3AgPSBud29yZHMgPyB3b3JkcyA6IE5VTEwpID09IE5VTEwgJiYgd29yZHMgIT0gTlVMTCkKKwkJeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOworCisJcmV0dXJuIChud29yZHMpOworfQorCisvKiBEYXRhIHN0cnVjdHVyZSB1c2VkIGluIHhfY29tbWFuZF9nbG9iKCkgKi8KK3N0cnVjdCBwYXRoX29yZGVyX2luZm8geworCWNoYXIgKndvcmQ7CisJaW50IGJhc2U7CisJaW50IHBhdGhfb3JkZXI7Cit9OworCisvKiBDb21wYXJlIHJvdXRpbmUgdXNlZCBpbiB4X2NvbW1hbmRfZ2xvYigpICovCitzdGF0aWMgaW50CitwYXRoX29yZGVyX2NtcChjb25zdCB2b2lkICphYSwgY29uc3Qgdm9pZCAqYmIpCit7CisJY29uc3Qgc3RydWN0IHBhdGhfb3JkZXJfaW5mbyAqYSA9IChjb25zdCBzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvICopYWE7CisJY29uc3Qgc3RydWN0IHBhdGhfb3JkZXJfaW5mbyAqYiA9IChjb25zdCBzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvICopYmI7CisJaW50IHQ7CisKKwl0ID0gc3RyY21wKGEtPndvcmQgKyBhLT5iYXNlLCBiLT53b3JkICsgYi0+YmFzZSk7CisJcmV0dXJuICh0ID8gdCA6IGEtPnBhdGhfb3JkZXIgLSBiLT5wYXRoX29yZGVyKTsKK30KKworc3RhdGljIGludAoreF9jb21tYW5kX2dsb2IoaW50IGZsYWdzLCBjb25zdCBjaGFyICpzdHIsIGludCBzbGVuLCBjaGFyICoqKndvcmRzcCkKK3sKKwljaGFyICp0b2dsb2IsICpwYXQsICpmcGF0aDsKKwlpbnQgbndvcmRzOworCVhQdHJWIHc7CisJc3RydWN0IGJsb2NrICpsOworCisJaWYgKHNsZW4gPCAwKQorCQlyZXR1cm4gKDApOworCisJdG9nbG9iID0gYWRkX2dsb2Ioc3RyLCBzbGVuKTsKKworCS8qIENvbnZlcnQgImZvbyoiICh0b2dsb2IpIHRvIGEgcGF0dGVybiBmb3IgZnV0dXJlIHVzZSAqLworCXBhdCA9IGV2YWxzdHIodG9nbG9iLCBET1BBVCB8IERPVElMREUpOworCWFmcmVlKHRvZ2xvYiwgQVRFTVApOworCisJWFBpbml0KHcsIDMyKTsKKworCWdsb2JfdGFibGUocGF0LCAmdywgJmtleXdvcmRzKTsKKwlnbG9iX3RhYmxlKHBhdCwgJncsICZhbGlhc2VzKTsKKwlnbG9iX3RhYmxlKHBhdCwgJncsICZidWlsdGlucyk7CisJZm9yIChsID0gZS0+bG9jOyBsOyBsID0gbC0+bmV4dCkKKwkJZ2xvYl90YWJsZShwYXQsICZ3LCAmbC0+ZnVucyk7CisKKwlnbG9iX3BhdGgoZmxhZ3MsIHBhdCwgJncsIHBhdGgpOworCWlmICgoZnBhdGggPSBzdHJfdmFsKGdsb2JhbCgiRlBBVEgiKSkpICE9IG51bGwpCisJCWdsb2JfcGF0aChmbGFncywgcGF0LCAmdywgZnBhdGgpOworCisJbndvcmRzID0gWFBzaXplKHcpOworCisJaWYgKCFud29yZHMpIHsKKwkJKndvcmRzcCA9IE5VTEw7CisJCVhQZnJlZSh3KTsKKwkJcmV0dXJuICgwKTsKKwl9CisJLyogU29ydCBlbnRyaWVzICovCisJaWYgKGZsYWdzICYgWENGX0ZVTExQQVRIKSB7CisJCS8qIFNvcnQgYnkgYmFzZW5hbWUsIHRoZW4gcGF0aCBvcmRlciAqLworCQlzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvICppbmZvLCAqbGFzdF9pbmZvID0gTlVMTDsKKwkJY2hhciAqKndvcmRzID0gKGNoYXIgKiopWFBwdHJ2KHcpOworCQlpbnQgaSwgcGF0aF9vcmRlciA9IDA7CisKKwkJaW5mbyA9IChzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvICopCisJCSAgICBhbGxvYyhud29yZHMgKiBzaXplb2Yoc3RydWN0IHBhdGhfb3JkZXJfaW5mbyksIEFURU1QKTsKKwkJZm9yIChpID0gMDsgaSA8IG53b3JkczsgaSsrKSB7CisJCQlpbmZvW2ldLndvcmQgPSB3b3Jkc1tpXTsKKwkJCWluZm9baV0uYmFzZSA9IHhfYmFzZW5hbWUod29yZHNbaV0sIE5VTEwpOworCQkJaWYgKCFsYXN0X2luZm8gfHwgaW5mb1tpXS5iYXNlICE9IGxhc3RfaW5mby0+YmFzZSB8fAorCQkJICAgIHN0cm5jbXAod29yZHNbaV0sIGxhc3RfaW5mby0+d29yZCwgaW5mb1tpXS5iYXNlKSAhPSAwKSB7CisJCQkJbGFzdF9pbmZvID0gJmluZm9baV07CisJCQkJcGF0aF9vcmRlcisrOworCQkJfQorCQkJaW5mb1tpXS5wYXRoX29yZGVyID0gcGF0aF9vcmRlcjsKKwkJfQorCQlxc29ydChpbmZvLCBud29yZHMsIHNpemVvZihzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvKSwKKwkJICAgIHBhdGhfb3JkZXJfY21wKTsKKwkJZm9yIChpID0gMDsgaSA8IG53b3JkczsgaSsrKQorCQkJd29yZHNbaV0gPSBpbmZvW2ldLndvcmQ7CisJCWFmcmVlKGluZm8sIEFURU1QKTsKKwl9IGVsc2UgeworCQkvKiBTb3J0IGFuZCByZW1vdmUgZHVwbGljYXRlIGVudHJpZXMgKi8KKwkJY2hhciAqKndvcmRzID0gKGNoYXIgKiopWFBwdHJ2KHcpOworCQlpbnQgaSwgajsKKworCQlxc29ydCh3b3JkcywgbndvcmRzLCBzaXplb2Yodm9pZCAqKSwgeHN0cmNtcCk7CisJCWZvciAoaSA9IGogPSAwOyBpIDwgbndvcmRzIC0gMTsgaSsrKSB7CisJCQlpZiAoc3RyY21wKHdvcmRzW2ldLCB3b3Jkc1tpICsgMV0pKQorCQkJCXdvcmRzW2orK10gPSB3b3Jkc1tpXTsKKwkJCWVsc2UKKwkJCQlhZnJlZSh3b3Jkc1tpXSwgQVRFTVApOworCQl9CisJCXdvcmRzW2orK10gPSB3b3Jkc1tpXTsKKwkJbndvcmRzID0gajsKKwkJdy5jdXIgPSAodm9pZCAqKikmd29yZHNbal07CisJfQorCisJWFBwdXQodywgTlVMTCk7CisJKndvcmRzcCA9IChjaGFyICoqKVhQY2xvc2Uodyk7CisKKwlyZXR1cm4gKG53b3Jkcyk7Cit9CisKKyNkZWZpbmUgSVNfV09SREMoYykJKCFjdHlwZShjLCBDX0xFWDEpICYmIChjKSAhPSAnXCcnICYmIChjKSAhPSAnIicgJiYgXAorCQkJICAgIChjKSAhPSAnYCcgJiYgKGMpICE9ICc9JyAmJiAoYykgIT0gJzonKQorCitzdGF0aWMgaW50Cit4X2xvY2F0ZV93b3JkKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IHBvcywgaW50ICpzdGFydHAsCisgICAgYm9vbCAqaXNfY29tbWFuZHApCit7CisJaW50IHN0YXJ0LCBlbmQ7CisKKwkvKiBCYWQgY2FsbD8gUHJvYmFibHkgc2hvdWxkIHJlcG9ydCBlcnJvciAqLworCWlmIChwb3MgPCAwIHx8IHBvcyA+IGJ1ZmxlbikgeworCQkqc3RhcnRwID0gcG9zOworCQkqaXNfY29tbWFuZHAgPSBmYWxzZTsKKwkJcmV0dXJuICgwKTsKKwl9CisJLyogVGhlIGNhc2Ugd2hlcmUgcG9zID09IGJ1ZmxlbiBoYXBwZW5zIHRvIHRha2UgY2FyZSBvZiBpdHNlbGYuLi4gKi8KKworCXN0YXJ0ID0gcG9zOworCS8qIEtlZXAgZ29pbmcgYmFja3dhcmRzIHRvIHN0YXJ0IG9mIHdvcmQgKGhhcyBlZmZlY3Qgb2YgYWxsb3dpbmcKKwkgKiBvbmUgYmxhbmsgYWZ0ZXIgdGhlIGVuZCBvZiBhIHdvcmQpCisJICovCisJZm9yICg7IChzdGFydCA+IDAgJiYgSVNfV09SREMoYnVmW3N0YXJ0IC0gMV0pKSB8fAorCSAgICAoc3RhcnQgPiAxICYmIGJ1ZltzdGFydCAtIDJdID09ICdcXCcpOyBzdGFydC0tKQorCQk7CisJLyogR28gZm9yd2FyZHMgdG8gZW5kIG9mIHdvcmQgKi8KKwlmb3IgKGVuZCA9IHN0YXJ0OyBlbmQgPCBidWZsZW4gJiYgSVNfV09SREMoYnVmW2VuZF0pOyBlbmQrKykgeworCQlpZiAoYnVmW2VuZF0gPT0gJ1xcJyAmJiAoZW5kICsgMSkgPCBidWZsZW4pCisJCQllbmQrKzsKKwl9CisKKwlpZiAoaXNfY29tbWFuZHApIHsKKwkJYm9vbCBpc2NtZDsKKwkJaW50IHAgPSBzdGFydCAtIDE7CisKKwkJLyogRmlndXJlIG91dCBpZiB0aGlzIGlzIGEgY29tbWFuZCAqLworCQl3aGlsZSAocCA+PSAwICYmIGtzaF9pc3NwYWNlKGJ1ZltwXSkpCisJCQlwLS07CisJCWlzY21kID0gcCA8IDAgfHwgdnN0cmNocigiO3wmKClgIiwgYnVmW3BdKTsKKwkJaWYgKGlzY21kKSB7CisJCQkvKiBJZiBjb21tYW5kIGhhcyBhIC8sIHBhdGgsIGV0Yy4gaXMgbm90IHNlYXJjaGVkOworCQkJICogb25seSBjdXJyZW50IGRpcmVjdG9yeSBpcyBzZWFyY2hlZCB3aGljaCBpcyBqdXN0CisJCQkgKiBsaWtlIGZpbGUgZ2xvYmJpbmcuCisJCQkgKi8KKwkJCWZvciAocCA9IHN0YXJ0OyBwIDwgZW5kOyBwKyspCisJCQkJaWYgKGJ1ZltwXSA9PSAnLycpCisJCQkJCWJyZWFrOworCQkJaXNjbWQgPSBwID09IGVuZDsKKwkJfQorCQkqaXNfY29tbWFuZHAgPSBpc2NtZDsKKwl9CisJKnN0YXJ0cCA9IHN0YXJ0OworCisJcmV0dXJuIChlbmQgLSBzdGFydCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfY2ZfZ2xvYihpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IHBvcywgaW50ICpzdGFydHAsCisgICAgaW50ICplbmRwLCBjaGFyICoqKndvcmRzcCwgYm9vbCAqaXNfY29tbWFuZHApCit7CisJaW50IGxlbiwgbndvcmRzOworCWNoYXIgKip3b3JkcyA9IE5VTEw7CisJYm9vbCBpc19jb21tYW5kOworCisJbGVuID0geF9sb2NhdGVfd29yZChidWYsIGJ1ZmxlbiwgcG9zLCBzdGFydHAsICZpc19jb21tYW5kKTsKKwlpZiAoIShmbGFncyAmIFhDRl9DT01NQU5EKSkKKwkJaXNfY29tbWFuZCA9IGZhbHNlOworCS8qIERvbid0IGRvIGNvbW1hbmQgZ2xvYmluZyBvbiB6ZXJvIGxlbmd0aCBzdHJpbmdzIC0gaXQgdGFrZXMgdG9vCisJICogbG9uZyBhbmQgaXNuJ3QgdmVyeSB1c2VmdWwuIEZpbGUgZ2xvYnMgYXJlIG1vcmUgbGlrZWx5IHRvIGJlCisJICogdXNlZnVsLCBzbyBhbGxvdyB0aGVzZS4KKwkgKi8KKwlpZiAobGVuID09IDAgJiYgaXNfY29tbWFuZCkKKwkJcmV0dXJuICgwKTsKKworCW53b3JkcyA9IGlzX2NvbW1hbmQgPworCSAgICB4X2NvbW1hbmRfZ2xvYihmbGFncywgYnVmICsgKnN0YXJ0cCwgbGVuLCAmd29yZHMpIDoKKwkgICAgeF9maWxlX2dsb2IoZmxhZ3MsIGJ1ZiArICpzdGFydHAsIGxlbiwgJndvcmRzKTsKKwlpZiAobndvcmRzID09IDApIHsKKwkJKndvcmRzcCA9IE5VTEw7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChpc19jb21tYW5kcCkKKwkJKmlzX2NvbW1hbmRwID0gaXNfY29tbWFuZDsKKwkqd29yZHNwID0gd29yZHM7CisJKmVuZHAgPSAqc3RhcnRwICsgbGVuOworCisJcmV0dXJuIChud29yZHMpOworfQorCisvKiBHaXZlbiBhIHN0cmluZywgY29weSBpdCBhbmQgcG9zc2libHkgYWRkIGEgJyonIHRvIHRoZSBlbmQuCisgKiBUaGUgbmV3IHN0cmluZyBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGNoYXIgKgorYWRkX2dsb2IoY29uc3QgY2hhciAqc3RyLCBpbnQgc2xlbikKK3sKKwljaGFyICp0b2dsb2IsICpzOworCWJvb2wgc2F3X3NsYXNoID0gZmFsc2U7CisKKwlpZiAoc2xlbiA8IDApCisJCXJldHVybiAoTlVMTCk7CisKKwkvKiBmb3IgY2xhbmcncyBzdGF0aWMgYW5hbHlzZXIsIHRoZSBub25udWxsIGF0dHJpYnV0ZSBpc24ndCBlbm91Z2ggKi8KKwlta3NzZXJ0KHN0ciAhPSBOVUxMKTsKKworCXN0cm5kdXB4KHRvZ2xvYiwgc3RyLCBzbGVuICsgMSwgQVRFTVApOyAvKiArIDEgZm9yICIqIiAqLworCXRvZ2xvYltzbGVuXSA9ICdcMCc7CisKKwkvKgorCSAqIElmIHRoZSBwYXRobmFtZSBjb250YWlucyBhIHdpbGRjYXJkIChhbiB1bnF1b3RlZCAnKicsCisJICogJz8nLCBvciAnWycpIG9yIHBhcmFtZXRlciBleHBhbnNpb24gKCckJyksIG9yIGEgfnVzZXJuYW1lCisJICogd2l0aCBubyB0cmFpbGluZyBzbGFzaCwgdGhlbiBpdCBpcyBnbG9iYmVkIGJhc2VkIG9uIHRoYXQKKwkgKiB2YWx1ZSAoaS5lLiwgd2l0aG91dCB0aGUgYXBwZW5kZWQgJyonKS4KKwkgKi8KKwlmb3IgKHMgPSB0b2dsb2I7ICpzOyBzKyspIHsKKwkJaWYgKCpzID09ICdcXCcgJiYgc1sxXSkKKwkJCXMrKzsKKwkJZWxzZSBpZiAoKnMgPT0gJyonIHx8ICpzID09ICdbJyB8fCAqcyA9PSAnPycgfHwgKnMgPT0gJyQnIHx8CisJCSAgICAoc1sxXSA9PSAnKCcgLyopKi8gJiYgLyogKnMgaW4gJyonLCc/JyBhbHJlYWR5IGNoZWNrZWQgKi8KKwkJICAgICgqcyA9PSAnKycgfHwgKnMgPT0gJ0AnIHx8ICpzID09ICchJykpKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKCpzID09ICcvJykKKwkJCXNhd19zbGFzaCA9IHRydWU7CisJfQorCWlmICghKnMgJiYgKCp0b2dsb2IgIT0gJ34nIHx8IHNhd19zbGFzaCkpIHsKKwkJdG9nbG9iW3NsZW5dID0gJyonOworCQl0b2dsb2Jbc2xlbiArIDFdID0gJ1wwJzsKKwl9CisJcmV0dXJuICh0b2dsb2IpOworfQorCisvKgorICogRmluZCBsb25nZXN0IGNvbW1vbiBwcmVmaXgKKyAqLworc3RhdGljIGludAoreF9sb25nZXN0X3ByZWZpeChpbnQgbndvcmRzLCBjaGFyICogY29uc3QgKiB3b3JkcykKK3sKKwlpbnQgaSwgaiwgcHJlZml4X2xlbjsKKwljaGFyICpwOworCisJaWYgKG53b3JkcyA8PSAwKQorCQlyZXR1cm4gKDApOworCisJcHJlZml4X2xlbiA9IHN0cmxlbih3b3Jkc1swXSk7CisJZm9yIChpID0gMTsgaSA8IG53b3JkczsgaSsrKQorCQlmb3IgKGogPSAwLCBwID0gd29yZHNbaV07IGogPCBwcmVmaXhfbGVuOyBqKyspCisJCQlpZiAocFtqXSAhPSB3b3Jkc1swXVtqXSkgeworCQkJCXByZWZpeF9sZW4gPSBqOworCQkJCWJyZWFrOworCQkJfQorCXJldHVybiAocHJlZml4X2xlbik7Cit9CisKK3N0YXRpYyB2b2lkCit4X2ZyZWVfd29yZHMoaW50IG53b3JkcywgY2hhciAqKndvcmRzKQoreworCXdoaWxlIChud29yZHMpCisJCWFmcmVlKHdvcmRzWy0tbndvcmRzXSwgQVRFTVApOworCWFmcmVlKHdvcmRzLCBBVEVNUCk7Cit9CisKKy8qIFJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBiYXNlbmFtZSBvZiBzdHJpbmcgcyAod2hpY2ggZW5kcyBhdCBzZSAtIG5lZWQgbm90CisgKiBiZSBudWxsIHRlcm1pbmF0ZWQpLiBUcmFpbGluZyBzbGFzaGVzIGFyZSBpZ25vcmVkLiBJZiBzIGlzIGp1c3QgYSBzbGFzaCwKKyAqIHRoZW4gdGhlIG9mZnNldCBpcyAwIChhY3R1YWxseSwgbGVuZ3RoIC0gMSkuCisgKglzCQlSZXR1cm4KKyAqCS9ldGMJCTEKKyAqCS9ldGMvCQkxCisgKgkvZXRjLy8JCTEKKyAqCS9ldGMvZm8JCTUKKyAqCWZvbwkJMAorICoJLy8vCQkyCisgKgkJCTAKKyAqLworc3RhdGljIGludAoreF9iYXNlbmFtZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpzZSkKK3sKKwljb25zdCBjaGFyICpwOworCisJaWYgKHNlID09IE5VTEwpCisJCXNlID0gcyArIHN0cmxlbihzKTsKKwlpZiAocyA9PSBzZSkKKwkJcmV0dXJuICgwKTsKKworCS8qIFNraXAgdHJhaWxpbmcgc2xhc2hlcyAqLworCWZvciAocCA9IHNlIC0gMTsgcCA+IHMgJiYgKnAgPT0gJy8nOyBwLS0pCisJCTsKKwlmb3IgKDsgcCA+IHMgJiYgKnAgIT0gJy8nOyBwLS0pCisJCTsKKwlpZiAoKnAgPT0gJy8nICYmIHAgKyAxIDwgc2UpCisJCXArKzsKKworCXJldHVybiAocCAtIHMpOworfQorCisvKgorICogQXBwbHkgcGF0dGVybiBtYXRjaGluZyB0byBhIHRhYmxlOiBhbGwgdGFibGUgZW50cmllcyB0aGF0IG1hdGNoIGEgcGF0dGVybgorICogYXJlIGFkZGVkIHRvIHdwLgorICovCitzdGF0aWMgdm9pZAorZ2xvYl90YWJsZShjb25zdCBjaGFyICpwYXQsIFhQdHJWICp3cCwgc3RydWN0IHRhYmxlICp0cCkKK3sKKwlzdHJ1Y3QgdHN0YXRlIHRzOworCXN0cnVjdCB0YmwgKnRlOworCisJa3R3YWxrKCZ0cywgdHApOworCXdoaWxlICgodGUgPSBrdG5leHQoJnRzKSkpCisJCWlmIChnbWF0Y2h4KHRlLT5uYW1lLCBwYXQsIGZhbHNlKSkgeworCQkJY2hhciAqY3A7CisKKwkJCXN0cmR1cHgoY3AsIHRlLT5uYW1lLCBBVEVNUCk7CisJCQlYUHB1dCgqd3AsIGNwKTsKKwkJfQorfQorCitzdGF0aWMgdm9pZAorZ2xvYl9wYXRoKGludCBmbGFncywgY29uc3QgY2hhciAqcGF0LCBYUHRyViAqd3AsIGNvbnN0IGNoYXIgKmxwYXRoKQoreworCWNvbnN0IGNoYXIgKnNwLCAqcDsKKwljaGFyICp4cCwgKip3b3JkczsKKwlpbnQgc3RhdGVyciwgcGF0aGxlbiwgcGF0bGVuLCBvbGRzaXplLCBuZXdzaXplLCBpLCBqOworCVhTdHJpbmcgeHM7CisKKwlwYXRsZW4gPSBzdHJsZW4ocGF0KSArIDE7CisJc3AgPSBscGF0aDsKKwlYaW5pdCh4cywgeHAsIHBhdGxlbiArIDEyOCwgQVRFTVApOworCXdoaWxlIChzcCkgeworCQl4cCA9IFhzdHJpbmcoeHMsIHhwKTsKKwkJaWYgKCEocCA9IGNzdHJjaHIoc3AsICc6JykpKQorCQkJcCA9IHNwICsgc3RybGVuKHNwKTsKKwkJcGF0aGxlbiA9IHAgLSBzcDsKKwkJaWYgKHBhdGhsZW4pIHsKKwkJCS8qIENvcHkgc3AgaW50byB4cCwgc3R1ZmZpbmcgYW55IE1BR0lDIGNoYXJhY3RlcnMKKwkJCSAqIG9uIHRoZSB3YXkKKwkJCSAqLworCQkJY29uc3QgY2hhciAqcyA9IHNwOworCisJCQlYY2hlY2tOKHhzLCB4cCwgcGF0aGxlbiAqIDIpOworCQkJd2hpbGUgKHMgPCBwKSB7CisJCQkJaWYgKElTTUFHSUMoKnMpKQorCQkJCQkqeHArKyA9IE1BR0lDOworCQkJCSp4cCsrID0gKnMrKzsKKwkJCX0KKwkJCSp4cCsrID0gJy8nOworCQkJcGF0aGxlbisrOworCQl9CisJCXNwID0gcDsKKwkJWGNoZWNrTih4cywgeHAsIHBhdGxlbik7CisJCW1lbWNweSh4cCwgcGF0LCBwYXRsZW4pOworCisJCW9sZHNpemUgPSBYUHNpemUoKndwKTsKKwkJZ2xvYl9zdHIoWHN0cmluZyh4cywgeHApLCB3cCwgMSk7IC8qIG1hcmsgZGlycyAqLworCQluZXdzaXplID0gWFBzaXplKCp3cCk7CisKKwkJLyogQ2hlY2sgdGhhdCBlYWNoIG1hdGNoIGlzIGV4ZWN1dGFibGUuLi4gKi8KKwkJd29yZHMgPSAoY2hhciAqKilYUHB0cnYoKndwKTsKKwkJZm9yIChpID0gaiA9IG9sZHNpemU7IGkgPCBuZXdzaXplOyBpKyspIHsKKwkJCXN0YXRlcnIgPSAwOworCQkJaWYgKChzZWFyY2hfYWNjZXNzKHdvcmRzW2ldLCBYX09LLCAmc3RhdGVycikgPj0gMCkgfHwKKwkJCSAgICAoc3RhdGVyciA9PSBFSVNESVIpKSB7CisJCQkJd29yZHNbal0gPSB3b3Jkc1tpXTsKKwkJCQlpZiAoIShmbGFncyAmIFhDRl9GVUxMUEFUSCkpCisJCQkJCW1lbW1vdmUod29yZHNbal0sIHdvcmRzW2pdICsgcGF0aGxlbiwKKwkJCQkJICAgIHN0cmxlbih3b3Jkc1tqXSArIHBhdGhsZW4pICsgMSk7CisJCQkJaisrOworCQkJfSBlbHNlCisJCQkJYWZyZWUod29yZHNbaV0sIEFURU1QKTsKKwkJfQorCQl3cC0+Y3VyID0gKHZvaWQgKiopJndvcmRzW2pdOworCisJCWlmICghKnNwKyspCisJCQlicmVhazsKKwl9CisJWGZyZWUoeHMsIHhwKTsKK30KKworLyoKKyAqIGlmIGFyZ3VtZW50IHN0cmluZyBjb250YWlucyBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzLCB0aGV5IHdpbGwKKyAqIGJlIGVzY2FwZWQgYW5kIHRoZSByZXN1bHQgd2lsbCBiZSBwdXQgaW50byBlZGl0IGJ1ZmZlciBieQorICoga2V5YmluZGluZy1zcGVjaWZpYyBmdW5jdGlvbgorICovCitzdGF0aWMgaW50Cit4X2VzY2FwZShjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuLCBpbnQgKCpwdXRidWZfZnVuYykoY29uc3QgY2hhciAqLCBzaXplX3QpKQoreworCXNpemVfdCBhZGQgPSAwLCB3bGVuID0gbGVuOworCWNvbnN0IGNoYXIgKmlmcyA9IHN0cl92YWwobG9jYWwoIklGUyIsIDApKTsKKwlpbnQgcnZhbCA9IDA7CisKKwl3aGlsZSAod2xlbiAtIGFkZCA+IDApCisJCWlmICh2c3RyY2hyKCJcIiMkJicoKSo6Ozw9Pj9bXFxge3x9Iiwgc1thZGRdKSB8fAorCQkgICAgdnN0cmNocihpZnMsIHNbYWRkXSkpIHsKKwkJCWlmIChwdXRidWZfZnVuYyhzLCBhZGQpICE9IDApIHsKKwkJCQlydmFsID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwdXRidWZfZnVuYyhzW2FkZF0gPT0gJ1xuJyA/ICInIiA6ICJcXCIsIDEpOworCQkJcHV0YnVmX2Z1bmMoJnNbYWRkXSwgMSk7CisJCQlpZiAoc1thZGRdID09ICdcbicpCisJCQkJcHV0YnVmX2Z1bmMoIiciLCAxKTsKKworCQkJYWRkKys7CisJCQl3bGVuIC09IGFkZDsKKwkJCXMgKz0gYWRkOworCQkJYWRkID0gMDsKKwkJfSBlbHNlCisJCQkrK2FkZDsKKwlpZiAod2xlbiA+IDAgJiYgcnZhbCA9PSAwKQorCQlydmFsID0gcHV0YnVmX2Z1bmMocywgd2xlbik7CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisKKy8qICsrKyBlbWFjcyBlZGl0aW5nIG1vZGUgKysrICovCisKK3N0YXRpYwlBcmVhCWFlZGl0OworI2RlZmluZQlBRURJVAkmYWVkaXQJCS8qIGFyZWEgZm9yIGtpbGwgcmluZyBhbmQgbWFjcm8gZGVmbnMgKi8KKworLyogdmFsdWVzIHJldHVybmVkIGJ5IGtleWJvYXJkIGZ1bmN0aW9ucyAqLworI2RlZmluZQlLU1RECTAKKyNkZWZpbmUJS0VPTAkxCQkvKiBeTSwgXkogKi8KKyNkZWZpbmUJS0lOVFIJMgkJLyogXkcsIF5DICovCisKK3N0cnVjdCB4X2Z0YWIgeworCWludCAoKnhmX2Z1bmMpKGludCBjKTsKKwljb25zdCBjaGFyICp4Zl9uYW1lOworCXNob3J0IHhmX2ZsYWdzOworfTsKKworc3RydWN0IHhfZGVmYmluZGluZ3MgeworCXVuc2lnbmVkIGNoYXIgeGRiX2Z1bmM7CS8qIFhGVU5DXyogKi8KKwl1bnNpZ25lZCBjaGFyIHhkYl90YWI7CisJdW5zaWduZWQgY2hhciB4ZGJfY2hhcjsKK307CisKKyNkZWZpbmUgWEZfQVJHCQkxCS8qIGNvbW1hbmQgdGFrZXMgbnVtYmVyIHByZWZpeCAqLworI2RlZmluZQlYRl9OT0JJTkQJMgkvKiBub3QgYWxsb3dlZCB0byBiaW5kIHRvIGZ1bmN0aW9uICovCisjZGVmaW5lCVhGX1BSRUZJWAk0CS8qIGZ1bmN0aW9uIHNldHMgcHJlZml4ICovCisKKy8qIFNlcGFyYXRvciBmb3IgY29tcGxldGlvbiAqLworI2RlZmluZQlpc19jZnMoYykJKChjKSA9PSAnICcgfHwgKGMpID09ICdcdCcgfHwgKGMpID09ICciJyB8fCAoYykgPT0gJ1wnJykKKy8qIFNlcGFyYXRvciBmb3IgbW90aW9uICovCisjZGVmaW5lCWlzX21mcyhjKQkoIShrc2hfaXNhbG51eChjKSB8fCAoYykgPT0gJyQnIHx8ICgoYykgJiAweDgwKSkpCisKKyNkZWZpbmUgWF9OVEFCUwkJMwkJCS8qIG5vcm1hbCwgbWV0YTEsIG1ldGEyICovCisjZGVmaW5lIFhfVEFCU1oJCTI1NgkJCS8qIHNpemUgb2Yga2V5ZGVmIHRhYmxlcyBldGMgKi8KKworLyogQXJndW1lbnRzIGZvciBkb19jb21wbGV0ZSgpCisgKiAwID0gZW51bWVyYXRlCU0tPQljb21wbGV0ZSBhcyBtdWNoIGFzIHBvc3NpYmxlIGFuZCB0aGVuIGxpc3QKKyAqIDEgPSBjb21wbGV0ZQkJTS1Fc2MKKyAqIDIgPSBsaXN0CQlNLT8KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlDVF9MSVNULAkvKiBsaXN0IHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucyAqLworCUNUX0NPTVBMRVRFLAkvKiBjb21wbGV0ZSB0byBsb25nZXN0IHByZWZpeCAqLworCUNUX0NPTVBMSVNUCS8qIGNvbXBsZXRlIGFuZCB0aGVuIGxpc3QgKGlmIG5vbi1leGFjdCkgKi8KK30gQ29tcF90eXBlOworCisvKgorICogVGhlIGZvbGxvd2luZyBhcmUgdXNlZCBmb3IgbXkgaG9yaXpvbnRhbCBzY3JvbGxpbmcgc3R1ZmYKKyAqLworc3RhdGljIGNoYXIgKnhidWY7CQkvKiBiZWcgaW5wdXQgYnVmZmVyICovCitzdGF0aWMgY2hhciAqeGVuZDsJCS8qIGVuZCBpbnB1dCBidWZmZXIgKi8KK3N0YXRpYyBjaGFyICp4Y3A7CQkvKiBjdXJyZW50IHBvc2l0aW9uICovCitzdGF0aWMgY2hhciAqeGVwOwkJLyogY3VycmVudCBlbmQgKi8KK3N0YXRpYyBjaGFyICp4YnA7CQkvKiBzdGFydCBvZiB2aXNpYmxlIHBvcnRpb24gb2YgaW5wdXQgYnVmZmVyICovCitzdGF0aWMgY2hhciAqeGxwOwkJLyogbGFzdCBjaGFyIHZpc2libGUgb24gc2NyZWVuICovCitzdGF0aWMgaW50IHhfYWRqX29rOworLyoKKyAqIHdlIHVzZSB4X2Fkal9kb25lIHNvIHRoYXQgZnVuY3Rpb25zIGNhbiB0ZWxsCisgKiB3aGV0aGVyIHhfYWRqdXN0KCkgaGFzIGJlZW4gY2FsbGVkIHdoaWxlIHRoZXkgYXJlIGFjdGl2ZS4KKyAqLworc3RhdGljIGludCB4X2Fkal9kb25lOworCitzdGF0aWMgaW50IHhfY29sOworc3RhdGljIGludCB4X2Rpc3BsZW47CitzdGF0aWMgaW50IHhfYXJnOwkJLyogZ2VuZXJhbCBwdXJwb3NlIGFyZyAqLworc3RhdGljIGludCB4X2FyZ19kZWZhdWx0ZWQ7CS8qIHhfYXJnIG5vdCBleHBsaWNpdGx5IHNldDsgZGVmYXVsdGVkIHRvIDEgKi8KKworc3RhdGljIGludCB4bHBfdmFsaWQ7CisKK3N0YXRpYyBjaGFyICoqeF9oaXN0cDsJCS8qIGhpc3RvcnkgcG9zaXRpb24gKi8KK3N0YXRpYyBpbnQgeF9uZXh0Y21kOwkJLyogZm9yIG5ld2xpbmUtYW5kLW5leHQgKi8KK3N0YXRpYyBjaGFyICp4bXA7CQkvKiBtYXJrIHBvaW50ZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHhfbGFzdF9jb21tYW5kOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKCp4X3RhYilbWF9UQUJTWl07CS8qIGtleSBkZWZpbml0aW9uICovCisjaWZuZGVmIE1LU0hfU01BTEwKK3N0YXRpYyBjaGFyICooKnhfYXRhYilbWF9UQUJTWl07CS8qIG1hY3JvIGRlZmluaXRpb25zICovCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHhfYm91bmRbKFhfVEFCU1ogKiBYX05UQUJTICsgNykgLyA4XTsKKyNkZWZpbmUgS0lMTFNJWkUJMjAKK3N0YXRpYyBjaGFyICpraWxsc3RhY2tbS0lMTFNJWkVdOworc3RhdGljIGludCBraWxsc3AsIGtpbGx0cDsKK3N0YXRpYyBpbnQgeF9jdXJwcmVmaXg7CisjaWZuZGVmIE1LU0hfU01BTEwKK3N0YXRpYyBjaGFyICptYWNyb3B0ciA9IE5VTEw7CS8qIGJpbmQga2V5IG1hY3JvIGFjdGl2ZT8gKi8KKyNlbmRpZgorI2lmICFNS1NIX1NfTk9WSQorc3RhdGljIGludCBjdXJfY29sOwkJLyogY3VycmVudCBjb2x1bW4gb24gbGluZSAqLworc3RhdGljIGludCBwd2lkdGg7CQkvKiB3aWR0aCBvZiBwcm9tcHQgKi8KK3N0YXRpYyBpbnQgcHJvbXB0X3RydW5jOwkvKiBob3cgbXVjaCBvZiBwcm9tcHQgdG8gdHJ1bmNhdGUgKi8KK3N0YXRpYyBpbnQgd2lud2lkdGg7CQkvKiB3aWR0aCBvZiB3aW5kb3cgKi8KK3N0YXRpYyBjaGFyICp3YnVmWzJdOwkJLyogd2luZG93IGJ1ZmZlcnMgKi8KK3N0YXRpYyBpbnQgd2J1Zl9sZW47CQkvKiBsZW5ndGggb2Ygd2luZG93IGJ1ZmZlcnMgKHhfY29scyAtIDMpICovCitzdGF0aWMgaW50IHdpbjsJCQkvKiB3aW5kb3cgYnVmZmVyIGluIHVzZSAqLworc3RhdGljIGNoYXIgbW9yZWM7CQkvKiBtb3JlIGNoYXJhY3RlciBhdCByaWdodCBvZiB3aW5kb3cgKi8KK3N0YXRpYyBpbnQgbGFzdHJlZjsJCS8qIGFyZ3VtZW50IHRvIGxhc3QgcmVmcmVzaCgpICovCitzdGF0aWMgaW50IGhvbGRsZW47CQkvKiBsZW5ndGggb2YgaG9sZGJ1ZiAqLworI2VuZGlmCitzdGF0aWMgaW50IHByb21wdF9yZWRyYXc7CS8qIDAgaWYgbmV3bGluZSBmb3JjZWQgYWZ0ZXIgcHJvbXB0ICovCisKK3N0YXRpYyBpbnQgeF9pbnMoY29uc3QgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHhfZGVsZXRlKGludCwgaW50KTsKK3N0YXRpYyBpbnQgeF9id29yZCh2b2lkKTsKK3N0YXRpYyBpbnQgeF9md29yZChpbnQpOworc3RhdGljIHZvaWQgeF9nb3RvKGNoYXIgKik7CitzdGF0aWMgdm9pZCB4X2JzMyhjaGFyICoqKTsKK3N0YXRpYyBpbnQgeF9zaXplX3N0cihjaGFyICopOworc3RhdGljIGludCB4X3NpemUyKGNoYXIgKiwgY2hhciAqKik7CitzdGF0aWMgdm9pZCB4X3pvdHMoY2hhciAqKTsKK3N0YXRpYyB2b2lkIHhfem90YzIoaW50KTsKK3N0YXRpYyB2b2lkIHhfem90YzMoY2hhciAqKik7CitzdGF0aWMgdm9pZCB4X2xvYWRfaGlzdChjaGFyICoqKTsKK3N0YXRpYyBpbnQgeF9zZWFyY2goY2hhciAqLCBpbnQsIGludCk7CisjaWZuZGVmIE1LU0hfU01BTEwKK3N0YXRpYyBpbnQgeF9zZWFyY2hfZGlyKGludCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgeF9tYXRjaChjaGFyICosIGNoYXIgKik7CitzdGF0aWMgdm9pZCB4X3JlZHJhdyhpbnQpOworc3RhdGljIHZvaWQgeF9wdXNoKGludCk7CitzdGF0aWMgY2hhciAqeF9tYXBpbihjb25zdCBjaGFyICosIEFyZWEgKikKKyAgICBNS1NIX0FfTk9OTlVMTCgobm9ubnVsbCAoMSkpKTsKK3N0YXRpYyBjaGFyICp4X21hcG91dChpbnQpOworc3RhdGljIHZvaWQgeF9tYXBvdXQyKGludCwgY2hhciAqKik7CitzdGF0aWMgdm9pZCB4X3ByaW50KGludCwgaW50KTsKK3N0YXRpYyB2b2lkIHhfYWRqdXN0KHZvaWQpOworc3RhdGljIHZvaWQgeF9lX3VuZ2V0YyhpbnQpOworc3RhdGljIGludCB4X2VfZ2V0Yyh2b2lkKTsKK3N0YXRpYyB2b2lkIHhfZV9wdXRjMihpbnQpOworc3RhdGljIHZvaWQgeF9lX3B1dGMzKGNvbnN0IGNoYXIgKiopOworc3RhdGljIHZvaWQgeF9lX3B1dHMoY29uc3QgY2hhciAqKTsKKyNpZm5kZWYgTUtTSF9TTUFMTAorc3RhdGljIGludCB4X2ZvbGRfY2FzZShpbnQpOworI2VuZGlmCitzdGF0aWMgY2hhciAqeF9sYXN0Y3Aodm9pZCk7CitzdGF0aWMgdm9pZCBkb19jb21wbGV0ZShpbnQsIENvbXBfdHlwZSk7CisKK3N0YXRpYyBpbnQgdW5nZXRfY2hhciA9IC0xOworCitzdGF0aWMgaW50IHhfZG9faW5zKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK3N0YXRpYyB2b2lkIGJpbmRfaWZfbm90X2JvdW5kKGludCwgaW50LCBpbnQpOworCitlbnVtIGVtYWNzX2Z1bmNzIHsKKyNkZWZpbmUgRU1BQ1NGTl9FTlVNUworI2luY2x1ZGUgImVtYWNzZm4uaCIKKwlYRlVOQ19NQVgKK307CisKKyNkZWZpbmUgRU1BQ1NGTl9ERUZOUworI2luY2x1ZGUgImVtYWNzZm4uaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCB4X2Z0YWIgeF9mdGFiW10gPSB7CisjZGVmaW5lIEVNQUNTRk5fSVRFTVMKKyNpbmNsdWRlICJlbWFjc2ZuLmgiCisJeyAwLCBOVUxMLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgeF9kZWZiaW5kaW5ncyBjb25zdCB4X2RlZmJpbmRpbmdzW10gPSB7CisJeyBYRlVOQ19kZWxfYmFjaywJCTAsIENUUkwoJz8nKQl9LAorCXsgWEZVTkNfZGVsX2J3b3JkLAkJMSwgQ1RSTCgnPycpCX0sCisJeyBYRlVOQ19lb3RfZGVsLAkJMCwgQ1RSTCgnRCcpCX0sCisJeyBYRlVOQ19kZWxfYmFjaywJCTAsIENUUkwoJ0gnKQl9LAorCXsgWEZVTkNfZGVsX2J3b3JkLAkJMSwgQ1RSTCgnSCcpCX0sCisJeyBYRlVOQ19kZWxfYndvcmQsCQkxLAknaCcJfSwKKwl7IFhGVU5DX212X2J3b3JkLAkJMSwJJ2InCX0sCisJeyBYRlVOQ19tdl9md29yZCwJCTEsCSdmJwl9LAorCXsgWEZVTkNfZGVsX2Z3b3JkLAkJMSwJJ2QnCX0sCisJeyBYRlVOQ19tdl9iYWNrLAkJMCwgQ1RSTCgnQicpCX0sCisJeyBYRlVOQ19tdl9mb3J3LAkJMCwgQ1RSTCgnRicpCX0sCisJeyBYRlVOQ19zZWFyY2hfY2hhcl9mb3J3LAkwLCBDVFJMKCddJykJfSwKKwl7IFhGVU5DX3NlYXJjaF9jaGFyX2JhY2ssCTEsIENUUkwoJ10nKQl9LAorCXsgWEZVTkNfbmV3bGluZSwJCTAsIENUUkwoJ00nKQl9LAorCXsgWEZVTkNfbmV3bGluZSwJCTAsIENUUkwoJ0onKQl9LAorCXsgWEZVTkNfZW5kX29mX3RleHQsCQkwLCBDVFJMKCdfJykJfSwKKwl7IFhGVU5DX2Fib3J0LAkJCTAsIENUUkwoJ0cnKQl9LAorCXsgWEZVTkNfcHJldl9jb20sCQkwLCBDVFJMKCdQJykJfSwKKwl7IFhGVU5DX25leHRfY29tLAkJMCwgQ1RSTCgnTicpCX0sCisJeyBYRlVOQ19ubF9uZXh0X2NvbSwJCTAsIENUUkwoJ08nKQl9LAorCXsgWEZVTkNfc2VhcmNoX2hpc3QsCQkwLCBDVFJMKCdSJykJfSwKKwl7IFhGVU5DX2JlZ19oaXN0LAkJMSwJJzwnCX0sCisJeyBYRlVOQ19lbmRfaGlzdCwJCTEsCSc+Jwl9LAorCXsgWEZVTkNfZ290b19oaXN0LAkJMSwJJ2cnCX0sCisJeyBYRlVOQ19tdl9lbmQsCQkJMCwgQ1RSTCgnRScpCX0sCisJeyBYRlVOQ19tdl9iZWdpbiwJCTAsIENUUkwoJ0EnKQl9LAorCXsgWEZVTkNfZHJhd19saW5lLAkJMCwgQ1RSTCgnTCcpCX0sCisJeyBYRlVOQ19jbHMsCQkJMSwgQ1RSTCgnTCcpCX0sCisJeyBYRlVOQ19tZXRhMSwJCQkwLCBDVFJMKCdbJykJfSwKKwl7IFhGVU5DX21ldGEyLAkJCTAsIENUUkwoJ1gnKQl9LAorCXsgWEZVTkNfa2lsbCwJCQkwLCBDVFJMKCdLJykJfSwKKwl7IFhGVU5DX3lhbmssCQkJMCwgQ1RSTCgnWScpCX0sCisJeyBYRlVOQ19tZXRhX3lhbmssCQkxLAkneScJfSwKKwl7IFhGVU5DX2xpdGVyYWwsCQkwLCBDVFJMKCdeJykJfSwKKwl7IFhGVU5DX2NvbW1lbnQsCQkxLAknIycJfSwKKwl7IFhGVU5DX3RyYW5zcG9zZSwJCTAsIENUUkwoJ1QnKQl9LAorCXsgWEZVTkNfY29tcGxldGUsCQkxLCBDVFJMKCdbJykJfSwKKwl7IFhGVU5DX2NvbXBfbGlzdCwJCTAsIENUUkwoJ0knKQl9LAorCXsgWEZVTkNfY29tcF9saXN0LAkJMSwJJz0nCX0sCisJeyBYRlVOQ19lbnVtZXJhdGUsCQkxLAknPycJfSwKKwl7IFhGVU5DX2V4cGFuZCwJCQkxLAknKicJfSwKKwl7IFhGVU5DX2NvbXBfZmlsZSwJCTEsIENUUkwoJ1gnKQl9LAorCXsgWEZVTkNfY29tcF9jb21tLAkJMiwgQ1RSTCgnWycpCX0sCisJeyBYRlVOQ19saXN0X2NvbW0sCQkyLAknPycJfSwKKwl7IFhGVU5DX2xpc3RfZmlsZSwJCTIsIENUUkwoJ1knKQl9LAorCXsgWEZVTkNfc2V0X21hcmssCQkxLAknICcJfSwKKwl7IFhGVU5DX2tpbGxfcmVnaW9uLAkJMCwgQ1RSTCgnVycpCX0sCisJeyBYRlVOQ194Y2hnX3BvaW50X21hcmssCTIsIENUUkwoJ1gnKQl9LAorCXsgWEZVTkNfbGl0ZXJhbCwJCTAsIENUUkwoJ1YnKQl9LAorCXsgWEZVTkNfdmVyc2lvbiwJCTEsIENUUkwoJ1YnKQl9LAorCXsgWEZVTkNfcHJldl9oaXN0d29yZCwJCTEsCScuJwl9LAorCXsgWEZVTkNfcHJldl9oaXN0d29yZCwJCTEsCSdfJwl9LAorCXsgWEZVTkNfc2V0X2FyZywJCTEsCScwJwl9LAorCXsgWEZVTkNfc2V0X2FyZywJCTEsCScxJwl9LAorCXsgWEZVTkNfc2V0X2FyZywJCTEsCScyJwl9LAorCXsgWEZVTkNfc2V0X2FyZywJCTEsCSczJwl9LAorCXsgWEZVTkNfc2V0X2FyZywJCTEsCSc0Jwl9LAorCXsgWEZVTkNfc2V0X2FyZywJCTEsCSc1Jwl9LAorCXsgWEZVTkNfc2V0X2FyZywJCTEsCSc2Jwl9LAorCXsgWEZVTkNfc2V0X2FyZywJCTEsCSc3Jwl9LAorCXsgWEZVTkNfc2V0X2FyZywJCTEsCSc4Jwl9LAorCXsgWEZVTkNfc2V0X2FyZywJCTEsCSc5Jwl9LAorI2lmbmRlZiBNS1NIX1NNQUxMCisJeyBYRlVOQ19mb2xkX3VwcGVyLAkJMSwJJ1UnCX0sCisJeyBYRlVOQ19mb2xkX3VwcGVyLAkJMSwJJ3UnCX0sCisJeyBYRlVOQ19mb2xkX2xvd2VyLAkJMSwJJ0wnCX0sCisJeyBYRlVOQ19mb2xkX2xvd2VyLAkJMSwJJ2wnCX0sCisJeyBYRlVOQ19mb2xkX2NhcGl0YWxpc2UsCTEsCSdDJwl9LAorCXsgWEZVTkNfZm9sZF9jYXBpdGFsaXNlLAkxLAknYycJfSwKKyNlbmRpZgorCS8qIFRoZXNlIGZvciBhbnNpIGFycm93IGtleXM6IGFyZ3VhYmxlbHkgc2hvdWxkbid0IGJlIGhlcmUgYnkKKwkgKiBkZWZhdWx0LCBidXQgaXRzIHNpbXBsZXIvZmFzdGVyL3NtYWxsZXIgdGhhbiB1c2luZyB0ZXJtY2FwCisJICogZW50cmllcy4KKwkgKi8KKwl7IFhGVU5DX21ldGEyLAkJCTEsCSdbJwl9LAorCXsgWEZVTkNfbWV0YTIsCQkJMSwJJ08nCX0sCisJeyBYRlVOQ19wcmV2X2NvbSwJCTIsCSdBJwl9LAorCXsgWEZVTkNfbmV4dF9jb20sCQkyLAknQicJfSwKKwl7IFhGVU5DX212X2ZvcncsCQkyLAknQycJfSwKKwl7IFhGVU5DX212X2JhY2ssCQkyLAknRCcJfSwKKyNpZm5kZWYgTUtTSF9TTUFMTAorCXsgWEZVTkNfdnRfaGFjaywJCTIsCScxJwl9LAorCXsgWEZVTkNfbXZfYmVnaW4gfCAweDgwLAkyLAknNycJfSwKKwl7IFhGVU5DX212X2JlZ2luLAkJMiwJJ0gnCX0sCisJeyBYRlVOQ19tdl9lbmQgfCAweDgwLAkJMiwJJzQnCX0sCisJeyBYRlVOQ19tdl9lbmQgfCAweDgwLAkJMiwJJzgnCX0sCisJeyBYRlVOQ19tdl9lbmQsCQkJMiwJJ0YnCX0sCisJeyBYRlVOQ19kZWxfY2hhciB8IDB4ODAsCTIsCSczJwl9LAorCXsgWEZVTkNfc2VhcmNoX2hpc3RfdXAgfCAweDgwLAkyLAknNScJfSwKKwl7IFhGVU5DX3NlYXJjaF9oaXN0X2RuIHwgMHg4MCwJMiwJJzYnCX0sCisJLyogbW9yZSBub24tc3RhbmRhcmQgb25lcyAqLworCXsgWEZVTkNfZWRpdF9saW5lLAkJMiwJJ2UnCX0KKyNlbmRpZgorfTsKKworI2lmZGVmIE1LU0hfU01BTEwKK3N0YXRpYyB2b2lkIHhfbW9kaWZpZWQodm9pZCk7CitzdGF0aWMgdm9pZAoreF9tb2RpZmllZCh2b2lkKQoreworCWlmICghbW9kaWZpZWQpIHsKKwkJeF9oaXN0cCA9IGhpc3RwdHIgKyAxOworCQltb2RpZmllZCA9IDE7CisJfQorfQorI2RlZmluZSBYRlVOQ19WQUxVRShmKSAoZikKKyNlbHNlCisjZGVmaW5lIHhfbW9kaWZpZWQoKSBkbyB7CQkJXAorCWlmICghbW9kaWZpZWQpIHsJCQlcCisJCXhfaGlzdHAgPSBoaXN0cHRyICsgMTsJCVwKKwkJbW9kaWZpZWQgPSAxOwkJCVwKKwl9CQkJCQlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKyNkZWZpbmUgWEZVTkNfVkFMVUUoZikgKGYgJiAweDdGKQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3hfZV9nZXRtYmMoY2hhciAqc2J1ZikKK3sKKwlpbnQgYywgcG9zID0gMDsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSAodW5zaWduZWQgY2hhciAqKXNidWY7CisKKwltZW1zZXQoYnVmLCAwLCA0KTsKKwlidWZbcG9zKytdID0gYyA9IHhfZV9nZXRjKCk7CisJaWYgKGMgPT0gLTEpCisJCXJldHVybiAoLTEpOworCWlmIChVVEZNT0RFKSB7CisJCWlmICgoYnVmWzBdID49IDB4QzIpICYmIChidWZbMF0gPCAweEYwKSkgeworCQkJYyA9IHhfZV9nZXRjKCk7CisJCQlpZiAoYyA9PSAtMSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWlmICgoYyAmIDB4QzApICE9IDB4ODApIHsKKwkJCQl4X2VfdW5nZXRjKGMpOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQlidWZbcG9zKytdID0gYzsKKwkJfQorCQlpZiAoKGJ1ZlswXSA+PSAweEUwKSAmJiAoYnVmWzBdIDwgMHhGMCkpIHsKKwkJCS8qIFhYWCB4X2VfdW5nZXRjIGlzIG9uZS1vY3RldCBvbmx5ICovCisJCQlidWZbcG9zKytdID0gYyA9IHhfZV9nZXRjKCk7CisJCQlpZiAoYyA9PSAtMSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0KKwlyZXR1cm4gKHBvcyk7Cit9CisKK3N0YXRpYyB2b2lkCit4X2luaXRfcHJvbXB0KHZvaWQpCit7CisJeF9jb2wgPSBwcm9tcHRsZW4ocHJvbXB0KTsKKwl4X2Fkal9vayA9IDE7CisJcHJvbXB0X3JlZHJhdyA9IDE7CisJaWYgKHhfY29sID49IHh4X2NvbHMpCisJCXhfY29sICU9IHh4X2NvbHM7CisJeF9kaXNwbGVuID0geHhfY29scyAtIDIgLSB4X2NvbDsKKwl4X2Fkal9kb25lID0gMDsKKworCXBwcm9tcHQocHJvbXB0LCAwKTsKKwlpZiAoeF9kaXNwbGVuIDwgMSkgeworCQl4X2NvbCA9IDA7CisJCXhfZGlzcGxlbiA9IHh4X2NvbHMgLSAyOworCQl4X2VfcHV0YzIoJ1xuJyk7CisJCXByb21wdF9yZWRyYXcgPSAwOworCX0KK30KKworc3RhdGljIGludAoreF9lbWFjcyhjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaW50IGMsIGk7CisJdW5zaWduZWQgY2hhciBmOworCisJeGJwID0geGJ1ZiA9IGJ1ZjsgeGVuZCA9IGJ1ZiArIGxlbjsKKwl4bHAgPSB4Y3AgPSB4ZXAgPSBidWY7CisJKnhjcCA9IDA7CisJeGxwX3ZhbGlkID0gdHJ1ZTsKKwl4bXAgPSBOVUxMOworCXhfY3VycHJlZml4ID0gMDsKKwl4X2hpc3RwID0gaGlzdHB0ciArIDE7CisJeF9sYXN0X2NvbW1hbmQgPSBYRlVOQ19lcnJvcjsKKworCXh4X2NvbHMgPSB4X2NvbHM7CisJeF9pbml0X3Byb21wdCgpOworCisJaWYgKHhfbmV4dGNtZCA+PSAwKSB7CisJCWludCBvZmYgPSBzb3VyY2UtPmxpbmUgLSB4X25leHRjbWQ7CisJCWlmIChoaXN0cHRyIC0gaGlzdG9yeSA+PSBvZmYpCisJCQl4X2xvYWRfaGlzdChoaXN0cHRyIC0gb2ZmKTsKKwkJeF9uZXh0Y21kID0gLTE7CisJfQorCWVkaXRtb2RlID0gMTsKKwl3aGlsZSAoMSkgeworCQl4X2ZsdXNoKCk7CisJCWlmICgoYyA9IHhfZV9nZXRjKCkpIDwgMCkKKwkJCXJldHVybiAoMCk7CisKKwkJZiA9IHhfY3VycHJlZml4ID09IC0xID8gWEZVTkNfaW5zZXJ0IDoKKwkJICAgIHhfdGFiW3hfY3VycHJlZml4XVtjXTsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQlpZiAoZiAmIDB4ODApIHsKKwkJCWYgJj0gMHg3RjsKKwkJCWlmICgoaSA9IHhfZV9nZXRjKCkpICE9ICd+JykKKwkJCQl4X2VfdW5nZXRjKGkpOworCQl9CisKKwkJLyogYXZvaWQgYmluZCBrZXkgbWFjcm8gcmVjdXJzaW9uICovCisJCWlmIChtYWNyb3B0ciAmJiBmID09IFhGVU5DX2luc19zdHJpbmcpCisJCQlmID0gWEZVTkNfaW5zZXJ0OworI2VuZGlmCisKKwkJaWYgKCEoeF9mdGFiW2ZdLnhmX2ZsYWdzICYgWEZfUFJFRklYKSAmJgorCQkgICAgeF9sYXN0X2NvbW1hbmQgIT0gWEZVTkNfc2V0X2FyZykgeworCQkJeF9hcmcgPSAxOworCQkJeF9hcmdfZGVmYXVsdGVkID0gMTsKKwkJfQorCQlpID0gYyB8ICh4X2N1cnByZWZpeCA8PCA4KTsKKwkJeF9jdXJwcmVmaXggPSAwOworCQlzd2l0Y2ggKCgqeF9mdGFiW2ZdLnhmX2Z1bmMpKGkpKSB7CisJCWNhc2UgS1NURDoKKwkJCWlmICghKHhfZnRhYltmXS54Zl9mbGFncyAmIFhGX1BSRUZJWCkpCisJCQkJeF9sYXN0X2NvbW1hbmQgPSBmOworCQkJYnJlYWs7CisJCWNhc2UgS0VPTDoKKwkJCWkgPSB4ZXAgLSB4YnVmOworCQkJcmV0dXJuIChpKTsKKwkJY2FzZSBLSU5UUjoJLyogc3BlY2lhbCBjYXNlIGZvciBpbnRlcnJ1cHQgKi8KKwkJCXRyYXBzaWcoU0lHSU5UKTsKKwkJCXhfbW9kZShmYWxzZSk7CisJCQl1bndpbmQoTFNIRUxMKTsKKwkJfQorCQkvKiBhZC1ob2MgaGFjayBmb3IgZml4aW5nIHRoZSBjdXJzb3IgcG9zaXRpb24gKi8KKwkJeF9nb3RvKHhjcCk7CisJfQorfQorCitzdGF0aWMgaW50Cit4X2luc2VydChpbnQgYykKK3sKKwlzdGF0aWMgaW50IGxlZnQgPSAwLCBwb3MsIHNhdmVfYXJnOworCXN0YXRpYyBjaGFyIHN0cls0XTsKKworCS8qCisJICogU2hvdWxkIGFsbG93IHRhYiBhbmQgY29udHJvbCBjaGFycy4KKwkgKi8KKwlpZiAoYyA9PSAwKSB7CisgaW52bWJzOgorCQlsZWZ0ID0gMDsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwlpZiAoVVRGTU9ERSkgeworCQlpZiAoKChjICYgMHhDMCkgPT0gMHg4MCkgJiYgbGVmdCkgeworCQkJc3RyW3BvcysrXSA9IGM7CisJCQlpZiAoIS0tbGVmdCkgeworCQkJCXN0cltwb3NdID0gJ1wwJzsKKwkJCQl4X2FyZyA9IHNhdmVfYXJnOworCQkJCXdoaWxlICh4X2FyZy0tKQorCQkJCQl4X2lucyhzdHIpOworCQkJfQorCQkJcmV0dXJuIChLU1REKTsKKwkJfQorCQlpZiAobGVmdCkgeworCQkJaWYgKHhfY3VycHJlZml4ID09IC0xKSB7CisJCQkJLyogZmx1c2ggaW52YWxpZCBtdWx0aWJ5dGUgKi8KKwkJCQlzdHJbcG9zXSA9ICdcMCc7CisJCQkJd2hpbGUgKHNhdmVfYXJnLS0pCisJCQkJCXhfaW5zKHN0cik7CisJCQl9CisJCX0KKwkJaWYgKChjID49IDB4QzIpICYmIChjIDwgMHhFMCkpCisJCQlsZWZ0ID0gMTsKKwkJZWxzZSBpZiAoKGMgPj0gMHhFMCkgJiYgKGMgPCAweEYwKSkKKwkJCWxlZnQgPSAyOworCQllbHNlIGlmIChjID4gMHg3RikKKwkJCWdvdG8gaW52bWJzOworCQllbHNlCisJCQlsZWZ0ID0gMDsKKwkJaWYgKGxlZnQpIHsKKwkJCXNhdmVfYXJnID0geF9hcmc7CisJCQlwb3MgPSAxOworCQkJc3RyWzBdID0gYzsKKwkJCXJldHVybiAoS1NURCk7CisJCX0KKwl9CisJbGVmdCA9IDA7CisJc3RyWzBdID0gYzsKKwlzdHJbMV0gPSAnXDAnOworCXdoaWxlICh4X2FyZy0tKQorCQl4X2lucyhzdHIpOworCXJldHVybiAoS1NURCk7Cit9CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorc3RhdGljIGludAoreF9pbnNfc3RyaW5nKGludCBjKQoreworCW1hY3JvcHRyID0geF9hdGFiW2MgPj4gOF1bYyAmIDI1NV07CisJLyoKKwkgKiB3ZSBubyBsb25nZXIgbmVlZCB0byBib3RoZXIgY2hlY2tpbmcgaWYgbWFjcm9wdHIgaXMKKwkgKiBub3QgTlVMTCBidXQgZmlyc3QgY2hhciBpcyBOVUw7IHhfZV9nZXRjKCkgZG9lcyBpdAorCSAqLworCXJldHVybiAoS1NURCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAoreF9kb19pbnMoY29uc3QgY2hhciAqY3AsIHNpemVfdCBsZW4pCit7CisJaWYgKHhlcCArIGxlbiA+PSB4ZW5kKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuICgtMSk7CisJfQorCW1lbW1vdmUoeGNwICsgbGVuLCB4Y3AsIHhlcCAtIHhjcCArIDEpOworCW1lbW1vdmUoeGNwLCBjcCwgbGVuKTsKKwl4Y3AgKz0gbGVuOworCXhlcCArPSBsZW47CisJeF9tb2RpZmllZCgpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfaW5zKGNvbnN0IGNoYXIgKnMpCit7CisJY2hhciAqY3AgPSB4Y3A7CisJaW50IGFkaiA9IHhfYWRqX2RvbmU7CisKKwlpZiAoeF9kb19pbnMocywgc3RybGVuKHMpKSA8IDApCisJCXJldHVybiAoLTEpOworCS8qCisJICogeF96b3RzKCkgbWF5IHJlc3VsdCBpbiBhIGNhbGwgdG8geF9hZGp1c3QoKQorCSAqIHdlIHdhbnQgeGNwIHRvIHJlZmxlY3QgdGhlIG5ldyBwb3NpdGlvbi4KKwkgKi8KKwl4bHBfdmFsaWQgPSBmYWxzZTsKKwl4X2xhc3RjcCgpOworCXhfYWRqX29rID0gKHhjcCA+PSB4bHApOworCXhfem90cyhjcCk7CisJaWYgKGFkaiA9PSB4X2Fkal9kb25lKSB7CS8qIGhhcyB4X2FkanVzdCgpIGJlZW4gY2FsbGVkPyAqLworCQkvKiBubyAqLworCQljcCA9IHhscDsKKwkJd2hpbGUgKGNwID4geGNwKQorCQkJeF9iczMoJmNwKTsKKwl9CisJaWYgKHhscCA9PSB4ZXAgLSAxKQorCQl4X3JlZHJhdyh4eF9jb2xzKTsKKwl4X2Fkal9vayA9IDE7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAoreF9kZWxfYmFjayhpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWludCBpID0gMDsKKworCWlmICh4Y3AgPT0geGJ1ZikgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfQorCWRvIHsKKwkJeF9nb3RvKHhjcCAtIDEpOworCX0gd2hpbGUgKCgrK2kgPCB4X2FyZykgJiYgKHhjcCAhPSB4YnVmKSk7CisJeF9kZWxldGUoaSwgZmFsc2UpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZGVsX2NoYXIoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwljaGFyICpjcCwgKmNwMjsKKwlpbnQgaSA9IDA7CisKKwljcCA9IHhjcDsKKwl3aGlsZSAoaSA8IHhfYXJnKSB7CisJCXV0Zl9wdHJhZGp4KGNwLCBjcDIpOworCQlpZiAoY3AyID4geGVwKQorCQkJYnJlYWs7CisJCWNwID0gY3AyOworCQlpKys7CisJfQorCisJaWYgKCFpKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJeF9kZWxldGUoaSwgZmFsc2UpOworCXJldHVybiAoS1NURCk7Cit9CisKKy8qIERlbGV0ZSBuYyBjaGFycyB0byB0aGUgcmlnaHQgb2YgdGhlIGN1cnNvciAoaW5jbHVkaW5nIGN1cnNvciBwb3NpdGlvbikgKi8KK3N0YXRpYyB2b2lkCit4X2RlbGV0ZShpbnQgbmMsIGludCBwdXNoKQoreworCWludCBpLCBuYiwgbnc7CisJY2hhciAqY3A7CisKKwlpZiAobmMgPT0gMCkKKwkJcmV0dXJuOworCisJbncgPSAwOworCWNwID0geGNwOworCWZvciAoaSA9IDA7IGkgPCBuYzsgKytpKSB7CisJCWNoYXIgKmNwMjsKKwkJaW50IGo7CisKKwkJaiA9IHhfc2l6ZTIoY3AsICZjcDIpOworCQlpZiAoY3AyID4geGVwKQorCQkJYnJlYWs7CisJCWNwID0gY3AyOworCQludyArPSBqOworCX0KKwluYiA9IGNwIC0geGNwOworCS8qIG5jID0gaTsgKi8KKworCWlmICh4bXAgIT0gTlVMTCAmJiB4bXAgPiB4Y3ApIHsKKwkJaWYgKHhjcCArIG5iID4geG1wKQorCQkJeG1wID0geGNwOworCQllbHNlCisJCQl4bXAgLT0gbmI7CisJfQorCS8qCisJICogVGhpcyBsZXRzIHVzIHlhbmsgYSB3b3JkIHdlIGhhdmUgZGVsZXRlZC4KKwkgKi8KKwlpZiAocHVzaCkKKwkJeF9wdXNoKG5iKTsKKworCXhlcCAtPSBuYjsKKwltZW1tb3ZlKHhjcCwgeGNwICsgbmIsIHhlcCAtIHhjcCArIDEpOwkvKiBDb3BpZXMgdGhlIE5VTCAqLworCXhfYWRqX29rID0gMDsJCQkvKiBkb24ndCByZWRyYXcgKi8KKwl4bHBfdmFsaWQgPSBmYWxzZTsKKwl4X3pvdHMoeGNwKTsKKwkvKgorCSAqIGlmIHdlIGFyZSBhbHJlYWR5IGZpbGxpbmcgdGhlIGxpbmUsCisJICogdGhlcmUgaXMgbm8gbmVlZCB0byAnICcsJ1xiJy4KKwkgKiBCdXQgaWYgd2UgbXVzdCwgbWFrZSBzdXJlIHdlIGRvIHRoZSBtaW5pbXVtLgorCSAqLworCWlmICgoaSA9IHh4X2NvbHMgLSAyIC0geF9jb2wpID4gMCB8fCB4ZXAgLSB4bHAgPT0gMCkgeworCQludyA9IGkgPSAobncgPCBpKSA/IG53IDogaTsKKwkJd2hpbGUgKGktLSkKKwkJCXhfZV9wdXRjMignICcpOworCQlpZiAoeF9jb2wgPT0geHhfY29scyAtIDIpIHsKKwkJCXhfZV9wdXRjMigoeGVwID4geGxwKSA/ICc+JyA6ICh4YnAgPiB4YnVmKSA/ICc8JyA6ICcgJyk7CisJCQkrK253OworCQl9CisJCXdoaWxlIChudy0tKQorCQkJeF9lX3B1dGMyKCdcYicpOworCX0KKwkvKnhfZ290byh4Y3ApOyovCisJeF9hZGpfb2sgPSAxOworCXhscF92YWxpZCA9IGZhbHNlOworCWNwID0geF9sYXN0Y3AoKTsKKwl3aGlsZSAoY3AgPiB4Y3ApCisJCXhfYnMzKCZjcCk7CisKKwl4X21vZGlmaWVkKCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50Cit4X2RlbF9id29yZChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfZGVsZXRlKHhfYndvcmQoKSwgdHJ1ZSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9tdl9id29yZChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfYndvcmQoKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X212X2Z3b3JkKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9md29yZCgxKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2RlbF9md29yZChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfZGVsZXRlKHhfZndvcmQoMCksIHRydWUpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfYndvcmQodm9pZCkKK3sKKwlpbnQgbmMgPSAwLCBuYiA9IDA7CisJY2hhciAqY3AgPSB4Y3A7CisKKwlpZiAoY3AgPT0geGJ1ZikgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoMCk7CisJfQorCXdoaWxlICh4X2FyZy0tKSB7CisJCXdoaWxlIChjcCAhPSB4YnVmICYmIGlzX21mcyhjcFstMV0pKSB7CisJCQljcC0tOworCQkJbmIrKzsKKwkJfQorCQl3aGlsZSAoY3AgIT0geGJ1ZiAmJiAhaXNfbWZzKGNwWy0xXSkpIHsKKwkJCWNwLS07CisJCQluYisrOworCQl9CisJfQorCXhfZ290byhjcCk7CisJZm9yIChjcCA9IHhjcDsgY3AgPCAoeGNwICsgbmIpOyArK25jKQorCQljcCArPSB1dGZfcHRyYWRqKGNwKTsKKwlyZXR1cm4gKG5jKTsKK30KKworc3RhdGljIGludAoreF9md29yZChpbnQgbW92ZSkKK3sKKwlpbnQgbmMgPSAwOworCWNoYXIgKmNwID0geGNwLCAqY3AyOworCisJaWYgKGNwID09IHhlcCkgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoMCk7CisJfQorCXdoaWxlICh4X2FyZy0tKSB7CisJCXdoaWxlIChjcCAhPSB4ZXAgJiYgaXNfbWZzKCpjcCkpCisJCQljcCsrOworCQl3aGlsZSAoY3AgIT0geGVwICYmICFpc19tZnMoKmNwKSkKKwkJCWNwKys7CisJfQorCWZvciAoY3AyID0geGNwOyBjcDIgPCBjcDsgKytuYykKKwkJY3AyICs9IHV0Zl9wdHJhZGooY3AyKTsKKwlpZiAobW92ZSkKKwkJeF9nb3RvKGNwKTsKKwlyZXR1cm4gKG5jKTsKK30KKworc3RhdGljIHZvaWQKK3hfZ290byhjaGFyICpjcCkKK3sKKwlpZiAoVVRGTU9ERSkKKwkJd2hpbGUgKChjcCA+IHhidWYpICYmICgoKmNwICYgMHhDMCkgPT0gMHg4MCkpCisJCQktLWNwOworCWlmIChjcCA8IHhicCB8fCBjcCA+PSB1dGZfc2tpcGNvbHMoeGJwLCB4X2Rpc3BsZW4pKSB7CisJCS8qIHdlIGFyZSBoZWFkaW5nIG9mZiBzY3JlZW4gKi8KKwkJeGNwID0gY3A7CisJCXhfYWRqdXN0KCk7CisJfSBlbHNlIGlmIChjcCA8IHhjcCkgewkJLyogbW92ZSBiYWNrICovCisJCXdoaWxlIChjcCA8IHhjcCkKKwkJCXhfYnMzKCZ4Y3ApOworCX0gZWxzZSBpZiAoY3AgPiB4Y3ApIHsJCS8qIG1vdmUgZm9yd2FyZCAqLworCQl3aGlsZSAoY3AgPiB4Y3ApCisJCQl4X3pvdGMzKCZ4Y3ApOworCX0KK30KKworc3RhdGljIHZvaWQKK3hfYnMzKGNoYXIgKipwKQoreworCWludCBpOworCisJKCpwKS0tOworCWlmIChVVEZNT0RFKQorCQl3aGlsZSAoKCh1bnNpZ25lZCBjaGFyKSoqcCAmIDB4QzApID09IDB4ODApCisJCQkoKnApLS07CisKKwlpID0geF9zaXplMigqcCwgTlVMTCk7CisJd2hpbGUgKGktLSkKKwkJeF9lX3B1dGMyKCdcYicpOworfQorCitzdGF0aWMgaW50Cit4X3NpemVfc3RyKGNoYXIgKmNwKQoreworCWludCBzaXplID0gMDsKKwl3aGlsZSAoKmNwKQorCQlzaXplICs9IHhfc2l6ZTIoY3AsICZjcCk7CisJcmV0dXJuIChzaXplKTsKK30KKworc3RhdGljIGludAoreF9zaXplMihjaGFyICpjcCwgY2hhciAqKmRjcCkKK3sKKwlpbnQgYyA9ICoodW5zaWduZWQgY2hhciAqKWNwOworCisJaWYgKFVURk1PREUgJiYgKGMgPiAweDdGKSkKKwkJcmV0dXJuICh1dGZfd2lkdGhhZGooY3AsIChjb25zdCBjaGFyICoqKWRjcCkpOworCWlmIChkY3ApCisJCSpkY3AgPSBjcCArIDE7CisJaWYgKGMgPT0gJ1x0JykKKwkJcmV0dXJuICg0KTsJLyogS2x1ZGdlLCB0YWJzIGFyZSBhbHdheXMgZm91ciBzcGFjZXMuICovCisJaWYgKGMgPCAnICcgfHwgYyA9PSAweDdmKQorCQlyZXR1cm4gKDIpOwkvKiBjb250cm9sIHVuc2lnbmVkIGNoYXIgKi8KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAoreF96b3RzKGNoYXIgKnN0cikKK3sKKwlpbnQgYWRqID0geF9hZGpfZG9uZTsKKworCXhfbGFzdGNwKCk7CisJd2hpbGUgKCpzdHIgJiYgc3RyIDwgeGxwICYmIGFkaiA9PSB4X2Fkal9kb25lKQorCQl4X3pvdGMzKCZzdHIpOworfQorCitzdGF0aWMgdm9pZAoreF96b3RjMihpbnQgYykKK3sKKwlpZiAoYyA9PSAnXHQnKSB7CisJCS8qIEtsdWRnZSwgdGFicyBhcmUgYWx3YXlzIGZvdXIgc3BhY2VzLiAqLworCQl4X2VfcHV0cygiICAgICIpOworCX0gZWxzZSBpZiAoYyA8ICcgJyB8fCBjID09IDB4N2YpIHsKKwkJeF9lX3B1dGMyKCdeJyk7CisJCXhfZV9wdXRjMihVTkNUUkwoYykpOworCX0gZWxzZQorCQl4X2VfcHV0YzIoYyk7Cit9CisKK3N0YXRpYyB2b2lkCit4X3pvdGMzKGNoYXIgKipjcCkKK3sKKwl1bnNpZ25lZCBjaGFyIGMgPSAqKih1bnNpZ25lZCBjaGFyICoqKWNwOworCisJaWYgKGMgPT0gJ1x0JykgeworCQkvKiBLbHVkZ2UsIHRhYnMgYXJlIGFsd2F5cyBmb3VyIHNwYWNlcy4gKi8KKwkJeF9lX3B1dHMoIiAgICAiKTsKKwkJKCpjcCkrKzsKKwl9IGVsc2UgaWYgKGMgPCAnICcgfHwgYyA9PSAweDdmKSB7CisJCXhfZV9wdXRjMignXicpOworCQl4X2VfcHV0YzIoVU5DVFJMKGMpKTsKKwkJKCpjcCkrKzsKKwl9IGVsc2UKKwkJeF9lX3B1dGMzKChjb25zdCBjaGFyICoqKWNwKTsKK30KKworc3RhdGljIGludAoreF9tdl9iYWNrKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJaWYgKHhjcCA9PSB4YnVmKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJd2hpbGUgKHhfYXJnLS0pIHsKKwkJeF9nb3RvKHhjcCAtIDEpOworCQlpZiAoeGNwID09IHhidWYpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9tdl9mb3J3KGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJY2hhciAqY3AgPSB4Y3AsICpjcDI7CisKKwlpZiAoeGNwID09IHhlcCkgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfQorCXdoaWxlICh4X2FyZy0tKSB7CisJCXV0Zl9wdHJhZGp4KGNwLCBjcDIpOworCQlpZiAoY3AyID4geGVwKQorCQkJYnJlYWs7CisJCWNwID0gY3AyOworCX0KKwl4X2dvdG8oY3ApOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfc2VhcmNoX2NoYXJfZm9ydyhpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWNoYXIgKmNwID0geGNwOworCWNoYXIgdG1wWzRdOworCisJKnhlcCA9ICdcMCc7CisJaWYgKHhfZV9nZXRtYmModG1wKSA8IDApIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwl3aGlsZSAoeF9hcmctLSkgeworCQlpZiAoKGNwID0gKGNwID09IHhlcCkgPyBOVUxMIDogc3Ryc3RyKGNwICsgMSwgdG1wKSkgPT0gTlVMTCAmJgorCQkgICAgKGNwID0gc3Ryc3RyKHhidWYsIHRtcCkpID09IE5VTEwpIHsKKwkJCXhfZV9wdXRjMig3KTsKKwkJCXJldHVybiAoS1NURCk7CisJCX0KKwl9CisJeF9nb3RvKGNwKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X3NlYXJjaF9jaGFyX2JhY2soaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwljaGFyICpjcCA9IHhjcCwgKnAsIHRtcFs0XTsKKwlib29sIGI7CisKKwlpZiAoeF9lX2dldG1iYyh0bXApIDwgMCkgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfQorCWZvciAoOyB4X2FyZy0tOyBjcCA9IHApCisJCWZvciAocCA9IGNwOyA7ICkgeworCQkJaWYgKHAtLSA9PSB4YnVmKQorCQkJCXAgPSB4ZXA7CisJCQlpZiAocCA9PSBjcCkgeworCQkJCXhfZV9wdXRjMig3KTsKKwkJCQlyZXR1cm4gKEtTVEQpOworCQkJfQorCQkJaWYgKCh0bXBbMV0gJiYgKChwKzEpID4geGVwKSkgfHwKKwkJCSAgICAodG1wWzJdICYmICgocCsyKSA+IHhlcCkpKQorCQkJCWNvbnRpbnVlOworCQkJYiA9IHRydWU7CisJCQlpZiAoKnAgIT0gdG1wWzBdKQorCQkJCWIgPSBmYWxzZTsKKwkJCWlmIChiICYmIHRtcFsxXSAmJiBwWzFdICE9IHRtcFsxXSkKKwkJCQliID0gZmFsc2U7CisJCQlpZiAoYiAmJiB0bXBbMl0gJiYgcFsyXSAhPSB0bXBbMl0pCisJCQkJYiA9IGZhbHNlOworCQkJaWYgKGIpCisJCQkJYnJlYWs7CisJCX0KKwl4X2dvdG8oY3ApOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbmV3bGluZShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfZV9wdXRjMignXHInKTsKKwl4X2VfcHV0YzIoJ1xuJyk7CisJeF9mbHVzaCgpOworCSp4ZXArKyA9ICdcbic7CisJcmV0dXJuIChLRU9MKTsKK30KKworc3RhdGljIGludAoreF9lbmRfb2ZfdGV4dChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfem90YzIoZWRjaGFycy5lb2YpOworCXhfcHV0YygnXHInKTsKKwl4X3B1dGMoJ1xuJyk7CisJeF9mbHVzaCgpOworCXJldHVybiAoS0VPTCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfYmVnX2hpc3QoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2xvYWRfaGlzdChoaXN0b3J5KTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2VuZF9oaXN0KGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9sb2FkX2hpc3QoaGlzdHB0cik7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9wcmV2X2NvbShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfbG9hZF9oaXN0KHhfaGlzdHAgLSB4X2FyZyk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9uZXh0X2NvbShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfbG9hZF9oaXN0KHhfaGlzdHAgKyB4X2FyZyk7CisJcmV0dXJuIChLU1REKTsKK30KKworLyogR290byBhIHBhcnRpY3VsYXIgaGlzdG9yeSBudW1iZXIgb2J0YWluZWQgZnJvbSBhcmd1bWVudC4KKyAqIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuIGhpc3RvcnkgMSBpcyBwcm9iYWJseSBub3Qgd2hhdCB5b3UKKyAqIHdhbnQgc28gd2UnbGwgc2ltcGx5IGdvIHRvIHRoZSBvbGRlc3Qgb25lLgorICovCitzdGF0aWMgaW50Cit4X2dvdG9faGlzdChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWlmICh4X2FyZ19kZWZhdWx0ZWQpCisJCXhfbG9hZF9oaXN0KGhpc3RvcnkpOworCWVsc2UKKwkJeF9sb2FkX2hpc3QoaGlzdHB0ciArIHhfYXJnIC0gc291cmNlLT5saW5lKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgdm9pZAoreF9sb2FkX2hpc3QoY2hhciAqKmhwKQoreworCWludCBvbGRzaXplOworCWNoYXIgKnNwID0gTlVMTDsKKworCWlmIChocCA9PSBoaXN0cHRyICsgMSkgeworCQlzcCA9IGhvbGRidWY7CisJCW1vZGlmaWVkID0gMDsKKwl9IGVsc2UgaWYgKGhwIDwgaGlzdG9yeSB8fCBocCA+IGhpc3RwdHIpIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm47CisJfQorCWlmIChzcCA9PSBOVUxMKQorCQlzcCA9ICpocDsKKwl4X2hpc3RwID0gaHA7CisJb2xkc2l6ZSA9IHhfc2l6ZV9zdHIoeGJ1Zik7CisJaWYgKG1vZGlmaWVkKQorCQlzdHJsY3B5KGhvbGRidWYsIHhidWYsIHNpemVvZihob2xkYnVmKSk7CisJc3RybGNweSh4YnVmLCBzcCwgeGVuZCAtIHhidWYpOworCXhicCA9IHhidWY7CisJeGVwID0geGNwID0geGJ1ZiArIHN0cmxlbih4YnVmKTsKKwl4bHBfdmFsaWQgPSBmYWxzZTsKKwlpZiAoeGVwIDw9IHhfbGFzdGNwKCkpIHsKKwkJeF9yZWRyYXcob2xkc2l6ZSk7CisJfQorCXhfZ290byh4ZXApOworCW1vZGlmaWVkID0gMDsKK30KKworc3RhdGljIGludAoreF9ubF9uZXh0X2NvbShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfbmV4dGNtZCA9IHNvdXJjZS0+bGluZSAtIChoaXN0cHRyIC0geF9oaXN0cCkgKyAxOworCXJldHVybiAoeF9uZXdsaW5lKCdcbicpKTsKK30KKworc3RhdGljIGludAoreF9lb3RfZGVsKGludCBjKQoreworCWlmICh4ZXAgPT0geGJ1ZiAmJiB4X2FyZ19kZWZhdWx0ZWQpCisJCXJldHVybiAoeF9lbmRfb2ZfdGV4dChjKSk7CisJZWxzZQorCQlyZXR1cm4gKHhfZGVsX2NoYXIoYykpOworfQorCisvKiByZXZlcnNlIGluY3JlbWVudGFsIGhpc3Rvcnkgc2VhcmNoICovCitzdGF0aWMgaW50Cit4X3NlYXJjaF9oaXN0KGludCBjKQoreworCWludCBvZmZzZXQgPSAtMTsJLyogb2Zmc2V0IG9mIG1hdGNoIGluIHhidWYsIGVsc2UgLTEgKi8KKwljaGFyIHBhdFsyNTYgKyAxXTsJLyogcGF0dGVybiBidWZmZXIgKi8KKwljaGFyICpwID0gcGF0OworCXVuc2lnbmVkIGNoYXIgZjsKKworCSpwID0gJ1wwJzsKKwl3aGlsZSAoMSkgeworCQlpZiAob2Zmc2V0IDwgMCkgeworCQkJeF9lX3B1dHMoIlxuSS1zZWFyY2g6ICIpOworCQkJeF9lX3B1dHMocGF0KTsKKwkJfQorCQl4X2ZsdXNoKCk7CisJCWlmICgoYyA9IHhfZV9nZXRjKCkpIDwgMCkKKwkJCXJldHVybiAoS1NURCk7CisJCWYgPSB4X3RhYlswXVtjXTsKKwkJaWYgKGMgPT0gQ1RSTCgnWycpKSB7CisJCQlpZiAoKGYgJiAweDdGKSA9PSBYRlVOQ19tZXRhMSkgeworCQkJCWlmICgoYyA9IHhfZV9nZXRjKCkpIDwgMCkKKwkJCQkJcmV0dXJuIChLU1REKTsKKwkJCQlmID0geF90YWJbMV1bY10gJiAweDdGOworCQkJCWlmIChmID09IFhGVU5DX21ldGExIHx8IGYgPT0gWEZVTkNfbWV0YTIpCisJCQkJCXhfbWV0YTEoQ1RSTCgnWycpKTsKKwkJCQl4X2VfdW5nZXRjKGMpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKyNpZm5kZWYgTUtTSF9TTUFMTAorCQlpZiAoZiAmIDB4ODApIHsKKwkJCWYgJj0gMHg3RjsKKwkJCWlmICgoYyA9IHhfZV9nZXRjKCkpICE9ICd+JykKKwkJCQl4X2VfdW5nZXRjKGMpOworCQl9CisjZW5kaWYKKwkJaWYgKGYgPT0gWEZVTkNfc2VhcmNoX2hpc3QpCisJCQlvZmZzZXQgPSB4X3NlYXJjaChwYXQsIDAsIG9mZnNldCk7CisJCWVsc2UgaWYgKGYgPT0gWEZVTkNfZGVsX2JhY2spIHsKKwkJCWlmIChwID09IHBhdCkgeworCQkJCW9mZnNldCA9IC0xOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHAgPiBwYXQpCisJCQkJKi0tcCA9ICdcMCc7CisJCQlpZiAocCA9PSBwYXQpCisJCQkJb2Zmc2V0ID0gLTE7CisJCQllbHNlCisJCQkJb2Zmc2V0ID0geF9zZWFyY2gocGF0LCAxLCBvZmZzZXQpOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoZiA9PSBYRlVOQ19pbnNlcnQpIHsKKwkJCS8qIGFkZCBjaGFyIHRvIHBhdHRlcm4gKi8KKwkJCS8qIG92ZXJmbG93IGNoZWNrLi4uICovCisJCQlpZiAocCA+PSAmcGF0W3NpemVvZihwYXQpIC0gMV0pIHsKKwkJCQl4X2VfcHV0YzIoNyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkqcCsrID0gYywgKnAgPSAnXDAnOworCQkJaWYgKG9mZnNldCA+PSAwKSB7CisJCQkJLyogYWxyZWFkeSBoYXZlIHBhcnRpYWwgbWF0Y2ggKi8KKwkJCQlvZmZzZXQgPSB4X21hdGNoKHhidWYsIHBhdCk7CisJCQkJaWYgKG9mZnNldCA+PSAwKSB7CisJCQkJCXhfZ290byh4YnVmICsgb2Zmc2V0ICsgKHAgLSBwYXQpIC0KKwkJCQkJICAgICgqcGF0ID09ICdeJykpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlvZmZzZXQgPSB4X3NlYXJjaChwYXQsIDAsIG9mZnNldCk7CisJCX0gZWxzZSBpZiAoZiA9PSBYRlVOQ19hYm9ydCkgeworCQkJaWYgKG9mZnNldCA+PSAwKQorCQkJCXhfbG9hZF9oaXN0KGhpc3RwdHIgKyAxKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeyAvKiBvdGhlciBjb21tYW5kICovCisJCQl4X2VfdW5nZXRjKGMpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG9mZnNldCA8IDApCisJCXhfcmVkcmF3KC0xKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCisvKiBzZWFyY2ggYmFja3dhcmQgZnJvbSBjdXJyZW50IGxpbmUgKi8KK3N0YXRpYyBpbnQKK3hfc2VhcmNoKGNoYXIgKnBhdCwgaW50IHNhbWVsaW5lLCBpbnQgb2Zmc2V0KQoreworCWNoYXIgKipocDsKKwlpbnQgaTsKKworCWZvciAoaHAgPSB4X2hpc3RwIC0gKHNhbWVsaW5lID8gMCA6IDEpOyBocCA+PSBoaXN0b3J5OyAtLWhwKSB7CisJCWkgPSB4X21hdGNoKCpocCwgcGF0KTsKKwkJaWYgKGkgPj0gMCkgeworCQkJaWYgKG9mZnNldCA8IDApCisJCQkJeF9lX3B1dGMyKCdcbicpOworCQkJeF9sb2FkX2hpc3QoaHApOworCQkJeF9nb3RvKHhidWYgKyBpICsgc3RybGVuKHBhdCkgLSAoKnBhdCA9PSAnXicpKTsKKwkJCXJldHVybiAoaSk7CisJCX0KKwl9CisJeF9lX3B1dGMyKDcpOworCXhfaGlzdHAgPSBoaXN0cHRyOworCXJldHVybiAoLTEpOworfQorCisjaWZuZGVmIE1LU0hfU01BTEwKKy8qIGFuY2hvcmVkIHNlYXJjaCB1cCBmcm9tIGN1cnJlbnQgbGluZSAqLworc3RhdGljIGludAoreF9zZWFyY2hfaGlzdF91cChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXJldHVybiAoeF9zZWFyY2hfZGlyKC0xKSk7Cit9CisKKy8qIGFuY2hvcmVkIHNlYXJjaCBkb3duIGZyb20gY3VycmVudCBsaW5lICovCitzdGF0aWMgaW50Cit4X3NlYXJjaF9oaXN0X2RuKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJcmV0dXJuICh4X3NlYXJjaF9kaXIoMSkpOworfQorCisvKiBhbmNob3JlZCBzZWFyY2ggaW4gdGhlIGluZGljYXRlZCBkaXJlY3Rpb24gKi8KK3N0YXRpYyBpbnQKK3hfc2VhcmNoX2RpcihpbnQgc2VhcmNoX2RpciAvKiBzaG91bGQndmUgYmVlbiBib29sICovKQoreworCWNoYXIgKipocCA9IHhfaGlzdHAgKyBzZWFyY2hfZGlyOworCXNpemVfdCBjdXJzID0geGNwIC0geGJ1ZjsKKworCXdoaWxlIChoaXN0cHRyID49IGhwICYmIGhwID49IGhpc3RvcnkpIHsKKwkJaWYgKHN0cm5jbXAoeGJ1ZiwgKmhwLCBjdXJzKSA9PSAwKSB7CisJCQl4X2xvYWRfaGlzdChocCk7CisJCQl4X2dvdG8oeGJ1ZiArIGN1cnMpOworCQkJYnJlYWs7CisJCX0KKwkJaHAgKz0gc2VhcmNoX2RpcjsKKwl9CisJcmV0dXJuIChLU1REKTsKK30KKyNlbmRpZgorCisvKiByZXR1cm4gcG9zaXRpb24gb2YgZmlyc3QgbWF0Y2ggb2YgcGF0dGVybiBpbiBzdHJpbmcsIGVsc2UgLTEgKi8KK3N0YXRpYyBpbnQKK3hfbWF0Y2goY2hhciAqc3RyLCBjaGFyICpwYXQpCit7CisJaWYgKCpwYXQgPT0gJ14nKSB7CisJCXJldHVybiAoKHN0cm5jbXAoc3RyLCBwYXQgKyAxLCBzdHJsZW4ocGF0ICsgMSkpID09IDApID8gMCA6IC0xKTsKKwl9IGVsc2UgeworCQljaGFyICpxID0gc3Ryc3RyKHN0ciwgcGF0KTsKKwkJcmV0dXJuICgocSA9PSBOVUxMKSA/IC0xIDogcSAtIHN0cik7CisJfQorfQorCitzdGF0aWMgaW50Cit4X2RlbF9saW5lKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJaW50IGksIGo7CisKKwkqeGVwID0gMDsKKwlpID0geGVwIC0geGJ1ZjsKKwlqID0geF9zaXplX3N0cih4YnVmKTsKKwl4Y3AgPSB4YnVmOworCXhfcHVzaChpKTsKKwl4bHAgPSB4YnAgPSB4ZXAgPSB4YnVmOworCXhscF92YWxpZCA9IHRydWU7CisJKnhjcCA9IDA7CisJeG1wID0gTlVMTDsKKwl4X3JlZHJhdyhqKTsKKwl4X21vZGlmaWVkKCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9tdl9lbmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2dvdG8oeGVwKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X212X2JlZ2luKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9nb3RvKHhidWYpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZHJhd19saW5lKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9yZWRyYXcoLTEpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZV9yZWJ1aWxkbGluZShjb25zdCBjaGFyICpjbHJzdHIpCit7CisJc2hmX3B1dHMoY2xyc3RyLCBzaGxfb3V0KTsKKwl4X2FkanVzdCgpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfY2xzKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJcmV0dXJuICh4X2VfcmVidWlsZGxpbmUoTUtTSF9DTFNfU1RSSU5HKSk7Cit9CisKKy8qIFJlZHJhdyAocGFydCBvZikgdGhlIGxpbmUuIElmIGxpbWl0IGlzIDwgMCwgdGhlIGV2ZXJ5dGhpbmcgaXMgcmVkcmF3bgorICogb24gYSBORVcgbGluZSwgb3RoZXJ3aXNlIGxpbWl0IGlzIHRoZSBzY3JlZW4gY29sdW1uIHVwIHRvIHdoaWNoIG5lZWRzCisgKiByZWRyYXdpbmcuCisgKi8KK3N0YXRpYyB2b2lkCit4X3JlZHJhdyhpbnQgbGltaXQpCit7CisJaW50IGksIGosIHhfdHJ1bmMgPSAwOworCWNoYXIgKmNwOworCisJeF9hZGpfb2sgPSAwOworCWlmIChsaW1pdCA9PSAtMSkKKwkJeF9lX3B1dGMyKCdcbicpOworCWVsc2UKKwkJeF9lX3B1dGMyKCdccicpOworCXhfZmx1c2goKTsKKwlpZiAoeGJwID09IHhidWYpIHsKKwkJeF9jb2wgPSBwcm9tcHRsZW4ocHJvbXB0KTsKKwkJaWYgKHhfY29sID49IHh4X2NvbHMpCisJCQl4X3RydW5jID0gKHhfY29sIC8geHhfY29scykgKiB4eF9jb2xzOworCQlpZiAocHJvbXB0X3JlZHJhdykKKwkJCXBwcm9tcHQocHJvbXB0LCB4X3RydW5jKTsKKwl9CisJaWYgKHhfY29sID49IHh4X2NvbHMpCisJCXhfY29sICU9IHh4X2NvbHM7CisJeF9kaXNwbGVuID0geHhfY29scyAtIDIgLSB4X2NvbDsKKwlpZiAoeF9kaXNwbGVuIDwgMSkgeworCQl4X2NvbCA9IDA7CisJCXhfZGlzcGxlbiA9IHh4X2NvbHMgLSAyOworCX0KKwl4bHBfdmFsaWQgPSBmYWxzZTsKKwl4X2xhc3RjcCgpOworCXhfem90cyh4YnApOworCWlmICh4YnAgIT0geGJ1ZiB8fCB4ZXAgPiB4bHApCisJCWxpbWl0ID0geHhfY29sczsKKwlpZiAobGltaXQgPj0gMCkgeworCQlpZiAoeGVwID4geGxwKQorCQkJaSA9IDA7CQkJLyogd2UgZmlsbCB0aGUgbGluZSAqLworCQllbHNlIHsKKwkJCWNoYXIgKmNwbCA9IHhicDsKKworCQkJaSA9IGxpbWl0OworCQkJd2hpbGUgKGNwbCA8IHhscCkKKwkJCQlpIC09IHhfc2l6ZTIoY3BsLCAmY3BsKTsKKwkJfQorCisJCWogPSAwOworCQl3aGlsZSAoKGogPCBpKSB8fCAoeF9jb2wgPCAoeHhfY29scyAtIDIpKSkgeworCQkJaWYgKCEoeF9jb2wgPCAoeHhfY29scyAtIDIpKSkKKwkJCQlicmVhazsKKwkJCXhfZV9wdXRjMignICcpOworCQkJaisrOworCQl9CisJCWkgPSAnICc7CisJCWlmICh4ZXAgPiB4bHApIHsJCS8qIG1vcmUgb2ZmIHNjcmVlbiAqLworCQkJaWYgKHhicCA+IHhidWYpCisJCQkJaSA9ICcqJzsKKwkJCWVsc2UKKwkJCQlpID0gJz4nOworCQl9IGVsc2UgaWYgKHhicCA+IHhidWYpCisJCQlpID0gJzwnOworCQl4X2VfcHV0YzIoaSk7CisJCWorKzsKKwkJd2hpbGUgKGotLSkKKwkJCXhfZV9wdXRjMignXGInKTsKKwl9CisJY3AgPSB4bHA7CisJd2hpbGUgKGNwID4geGNwKQorCQl4X2JzMygmY3ApOworCXhfYWRqX29rID0gMTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK3hfdHJhbnNwb3NlKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJdW5zaWduZWQgaW50IHRtcGEsIHRtcGI7CisKKwkvKiBXaGF0IHRyYW5zcG9zZSBpcyBtZWFudCB0byBkbyBzZWVtcyB0byBiZSB1cCBmb3IgZGViYXRlLiBUaGlzCisJICogaXMgYSBnZW5lcmFsIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnM7IHRoZSB0ZXh0IGlzIGFiY2Qgd2l0aCB0aGUKKwkgKiB1cHBlciBjYXNlIGNoYXJhY3RlciBvciB1bmRlcnNjb3JlIGluZGljYXRpbmcgdGhlIGN1cnNvciBwb3NpdGlvbjoKKwkgKglXaG8JCQlCZWZvcmUJQWZ0ZXIJQmVmb3JlCUFmdGVyCisJICoJQVQmVCBrc2ggaW4gZW1hY3MgbW9kZToJYWJDZAlhYmRDCWFiY2RfCShiZWxsKQorCSAqCUFUJlQga3NoIGluIGdtYWNzIG1vZGU6CWFiQ2QJYmFDZAlhYmNkXwlhYmRjXworCSAqCWdudSBlbWFjczoJCWFiQ2QJYWNiRAlhYmNkXwlhYmRjXworCSAqIFBka3NoIGN1cnJlbnRseSBnb2VzIHdpdGggR05VIGJlaGF2aW9yIHNpbmNlIEkgYmVsaWV2ZSB0aGlzIGlzIHRoZQorCSAqIG1vc3QgY29tbW9uIHZlcnNpb24gb2YgZW1hY3MsIHVubGVzcyBpbiBnbWFjcyBtb2RlLCBpbiB3aGljaCBjYXNlCisJICogaXQgZG9lcyB0aGUgQVQmVCBrc2ggZ21hY3MgbW9kZS4KKwkgKiBUaGlzIHNob3VsZCByZWFsbHkgYmUgYnJva2VuIHVwIGludG8gMyBmdW5jdGlvbnMgc28gdXNlcnMgY2FuIGJpbmQKKwkgKiB0byB0aGUgb25lIHRoZXkgd2FudC4KKwkgKi8KKwlpZiAoeGNwID09IHhidWYpIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0gZWxzZSBpZiAoeGNwID09IHhlcCB8fCBGbGFnKEZHTUFDUykpIHsKKwkJaWYgKHhjcCAtIHhidWYgPT0gMSkgeworCQkJeF9lX3B1dGMyKDcpOworCQkJcmV0dXJuIChLU1REKTsKKwkJfQorCQkvKiBHb3NsaW5nL1VuaXByZXNzIGVtYWNzIHN0eWxlOiBTd2FwIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUKKwkJICogY3Vyc29yLCBkbyBub3QgY2hhbmdlIGN1cnNvciBwb3NpdGlvbgorCQkgKi8KKwkJeF9iczMoJnhjcCk7CisJCWlmICh1dGZfbWJ0b3djKCZ0bXBhLCB4Y3ApID09IChzaXplX3QpLTEpIHsKKwkJCXhfZV9wdXRjMig3KTsKKwkJCXJldHVybiAoS1NURCk7CisJCX0KKwkJeF9iczMoJnhjcCk7CisJCWlmICh1dGZfbWJ0b3djKCZ0bXBiLCB4Y3ApID09IChzaXplX3QpLTEpIHsKKwkJCXhfZV9wdXRjMig3KTsKKwkJCXJldHVybiAoS1NURCk7CisJCX0KKwkJdXRmX3djdG9tYih4Y3AsIHRtcGEpOworCQl4X3pvdGMzKCZ4Y3ApOworCQl1dGZfd2N0b21iKHhjcCwgdG1wYik7CisJCXhfem90YzMoJnhjcCk7CisJfSBlbHNlIHsKKwkJLyogR05VIGVtYWNzIHN0eWxlOiBTd2FwIHRoZSBjaGFyYWN0ZXJzIGJlZm9yZSBhbmQgdW5kZXIgdGhlCisJCSAqIGN1cnNvciwgbW92ZSBjdXJzb3IgcG9zaXRpb24gYWxvbmcgb25lLgorCQkgKi8KKwkJaWYgKHV0Zl9tYnRvd2MoJnRtcGEsIHhjcCkgPT0gKHNpemVfdCktMSkgeworCQkJeF9lX3B1dGMyKDcpOworCQkJcmV0dXJuIChLU1REKTsKKwkJfQorCQl4X2JzMygmeGNwKTsKKwkJaWYgKHV0Zl9tYnRvd2MoJnRtcGIsIHhjcCkgPT0gKHNpemVfdCktMSkgeworCQkJeF9lX3B1dGMyKDcpOworCQkJcmV0dXJuIChLU1REKTsKKwkJfQorCQl1dGZfd2N0b21iKHhjcCwgdG1wYSk7CisJCXhfem90YzMoJnhjcCk7CisJCXV0Zl93Y3RvbWIoeGNwLCB0bXBiKTsKKwkJeF96b3RjMygmeGNwKTsKKwl9CisJeF9tb2RpZmllZCgpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbGl0ZXJhbChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfY3VycHJlZml4ID0gLTE7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9tZXRhMShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfY3VycHJlZml4ID0gMTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X21ldGEyKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9jdXJwcmVmaXggPSAyOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfa2lsbChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWludCBjb2wgPSB4Y3AgLSB4YnVmOworCWludCBsYXN0Y29sID0geGVwIC0geGJ1ZjsKKwlpbnQgbmRlbDsKKworCWlmICh4X2FyZ19kZWZhdWx0ZWQpCisJCXhfYXJnID0gbGFzdGNvbDsKKwllbHNlIGlmICh4X2FyZyA+IGxhc3Rjb2wpCisJCXhfYXJnID0gbGFzdGNvbDsKKwluZGVsID0geF9hcmcgLSBjb2w7CisJaWYgKG5kZWwgPCAwKSB7CisJCXhfZ290byh4YnVmICsgeF9hcmcpOworCQluZGVsID0gLW5kZWw7CisJfQorCXhfZGVsZXRlKG5kZWwsIHRydWUpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyB2b2lkCit4X3B1c2goaW50IG5jaGFycykKK3sKKwljaGFyICpjcDsKKworCXN0cm5kdXB4KGNwLCB4Y3AsIG5jaGFycywgQUVESVQpOworCWlmIChraWxsc3RhY2tba2lsbHNwXSkKKwkJYWZyZWUoa2lsbHN0YWNrW2tpbGxzcF0sIEFFRElUKTsKKwlraWxsc3RhY2tba2lsbHNwXSA9IGNwOworCWtpbGxzcCA9IChraWxsc3AgKyAxKSAlIEtJTExTSVpFOworfQorCitzdGF0aWMgaW50Cit4X3lhbmsoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlpZiAoa2lsbHNwID09IDApCisJCWtpbGx0cCA9IEtJTExTSVpFOworCWVsc2UKKwkJa2lsbHRwID0ga2lsbHNwOworCWtpbGx0cC0tOworCWlmIChraWxsc3RhY2tba2lsbHRwXSA9PSAwKSB7CisJCXhfZV9wdXRzKCJcbm5vdGhpbmcgdG8geWFuayIpOworCQl4X3JlZHJhdygtMSk7CisJCXJldHVybiAoS1NURCk7CisJfQorCXhtcCA9IHhjcDsKKwl4X2lucyhraWxsc3RhY2tba2lsbHRwXSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9tZXRhX3lhbmsoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlpbnQgbGVuOworCisJaWYgKCh4X2xhc3RfY29tbWFuZCAhPSBYRlVOQ195YW5rICYmIHhfbGFzdF9jb21tYW5kICE9IFhGVU5DX21ldGFfeWFuaykgfHwKKwkgICAga2lsbHN0YWNrW2tpbGx0cF0gPT0gMCkgeworCQlraWxsdHAgPSBraWxsc3A7CisJCXhfZV9wdXRzKCJcbnlhbmsgc29tZXRoaW5nIGZpcnN0Iik7CisJCXhfcmVkcmF3KC0xKTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJbGVuID0gc3RybGVuKGtpbGxzdGFja1traWxsdHBdKTsKKwl4X2dvdG8oeGNwIC0gbGVuKTsKKwl4X2RlbGV0ZShsZW4sIGZhbHNlKTsKKwlkbyB7CisJCWlmIChraWxsdHAgPT0gMCkKKwkJCWtpbGx0cCA9IEtJTExTSVpFIC0gMTsKKwkJZWxzZQorCQkJa2lsbHRwLS07CisJfSB3aGlsZSAoa2lsbHN0YWNrW2tpbGx0cF0gPT0gMCk7CisJeF9pbnMoa2lsbHN0YWNrW2tpbGx0cF0pOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfYWJvcnQoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwkvKiB4X3pvdGMoYyk7ICovCisJeGxwID0geGVwID0geGNwID0geGJwID0geGJ1ZjsKKwl4bHBfdmFsaWQgPSB0cnVlOworCSp4Y3AgPSAwOworCXhfbW9kaWZpZWQoKTsKKwlyZXR1cm4gKEtJTlRSKTsKK30KKworc3RhdGljIGludAoreF9lcnJvcihpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfZV9wdXRjMig3KTsKKwlyZXR1cm4gKEtTVEQpOworfQorCisjaWZuZGVmIE1LU0hfU01BTEwKKy8qIHNwZWNpYWwgVlQxMDAgc3R5bGUga2V5IHNlcXVlbmNlIGhhY2sgKi8KK3N0YXRpYyBpbnQKK3hfdnRfaGFjayhpbnQgYykKK3sKKwkvKiB3ZSBvbmx5IHN1cHBvcnQgUEYyLScxJyBmb3Igbm93ICovCisJaWYgKGMgIT0gKDIgPDwgOCB8ICcxJykpCisJCXJldHVybiAoeF9lcnJvcihjKSk7CisKKwkvKiB3aGF0J3MgdGhlIG5leHQgY2hhcmFjdGVyPyAqLworCXN3aXRjaCAoKGMgPSB4X2VfZ2V0YygpKSkgeworCWNhc2UgJ34nOgorCQl4X2FyZyA9IDE7CisJCXhfYXJnX2RlZmF1bHRlZCA9IDE7CisJCXJldHVybiAoeF9tdl9iZWdpbigwKSk7CisJY2FzZSAnOyc6CisJCS8qICJpbnRlcmVzdGluZyIgc2VxdWVuY2UgZGV0ZWN0ZWQgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byB1bndpbmRfZXJyOworCX0KKworCS8qIFhYWCB4X2VfdW5nZXRjIGlzIG9uZS1vY3RldCBvbmx5ICovCisJaWYgKChjID0geF9lX2dldGMoKSkgIT0gJzUnICYmIGMgIT0gJzMnKQorCQlnb3RvIHVud2luZF9lcnI7CisKKwkvKi0KKwkgKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHJlYWQgdGhlIGZvbGxvd2luZyBvY3RldHMgc28gZmFyOgorCSAqIC0gRVNDK1sgb3IgRVNDK08gb3IgQ3RybC1YIChQcsOmZml4IDIpCisJICogLSAxICh2dF9oYWNrKQorCSAqIC0gOworCSAqIC0gNSAoQ3RybCBrZXkgY29tYmluZXIpIG9yIDMgKEFsdCBrZXkgY29tYmluZXIpCisJICogV2UgY2FuIG5vdyBhY2NlcHQgb25lIG1vcmUgb2N0ZXQgZGVzaWduYXRpbmcgdGhlIGtleS4KKwkgKi8KKworCXN3aXRjaCAoKGMgPSB4X2VfZ2V0YygpKSkgeworCWNhc2UgJ0MnOgorCQlyZXR1cm4gKHhfbXZfZndvcmQoYykpOworCWNhc2UgJ0QnOgorCQlyZXR1cm4gKHhfbXZfYndvcmQoYykpOworCX0KKworIHVud2luZF9lcnI6CisJeF9lX3VuZ2V0YyhjKTsKKwlyZXR1cm4gKHhfZXJyb3IoYykpOworfQorI2VuZGlmCisKK3N0YXRpYyBjaGFyICoKK3hfbWFwaW4oY29uc3QgY2hhciAqY3AsIEFyZWEgKmFwKQoreworCWNoYXIgKm5ld3MsICpvcDsKKworCS8qIGZvciBjbGFuZydzIHN0YXRpYyBhbmFseXNlciwgdGhlIG5vbm51bGwgYXR0cmlidXRlIGlzbid0IGVub3VnaCAqLworCW1rc3NlcnQoY3AgIT0gTlVMTCk7CisKKwlzdHJkdXB4KG5ld3MsIGNwLCBhcCk7CisJb3AgPSBuZXdzOworCXdoaWxlICgqY3ApIHsKKwkJLyogWFhYIC0tIHNob3VsZCBoYW5kbGUgXF4gZXNjYXBlPyAqLworCQlpZiAoKmNwID09ICdeJykgeworCQkJY3ArKzsKKwkJCWlmICgqY3AgPj0gJz8nKQkvKiBpbmNsdWRlcyAnPyc7IEFTQ0lJICovCisJCQkJKm9wKysgPSBDVFJMKCpjcCk7CisJCQllbHNlIHsKKwkJCQkqb3ArKyA9ICdeJzsKKwkJCQljcC0tOworCQkJfQorCQl9IGVsc2UKKwkJCSpvcCsrID0gKmNwOworCQljcCsrOworCX0KKwkqb3AgPSAnXDAnOworCisJcmV0dXJuIChuZXdzKTsKK30KKworc3RhdGljIHZvaWQKK3hfbWFwb3V0MihpbnQgYywgY2hhciAqKmJ1ZikKK3sKKwljaGFyICpwID0gKmJ1ZjsKKworCWlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikgeworCQkqcCsrID0gJ14nOworCQkqcCsrID0gVU5DVFJMKGMpOworCX0gZWxzZQorCQkqcCsrID0gYzsKKwkqcCA9IDA7CisJKmJ1ZiA9IHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK3hfbWFwb3V0KGludCBjKQoreworCXN0YXRpYyBjaGFyIGJ1Zls4XTsKKwljaGFyICpicCA9IGJ1ZjsKKworCXhfbWFwb3V0MihjLCAmYnApOworCXJldHVybiAoYnVmKTsKK30KKworc3RhdGljIHZvaWQKK3hfcHJpbnQoaW50IHByZWZpeCwgaW50IGtleSkKK3sKKwlpbnQgZiA9IHhfdGFiW3ByZWZpeF1ba2V5XTsKKworCWlmIChwcmVmaXgpCisJCS8qIHByZWZpeCA9PSAxIHx8IHByZWZpeCA9PSAyICovCisJCXNoZl9wdXRzKHhfbWFwb3V0KHByZWZpeCA9PSAxID8KKwkJICAgIENUUkwoJ1snKSA6IENUUkwoJ1gnKSksIHNobF9zdGRvdXQpOworI2lmZGVmIE1LU0hfU01BTEwKKwlzaHByaW50ZigiJXMgPSAiLCB4X21hcG91dChrZXkpKTsKKyNlbHNlCisJc2hwcmludGYoIiVzJXMgPSAiLCB4X21hcG91dChrZXkpLCAoZiAmIDB4ODApID8gIn4iIDogIiIpOworCWlmIChYRlVOQ19WQUxVRShmKSAhPSBYRlVOQ19pbnNfc3RyaW5nKQorI2VuZGlmCisJCXNocHJpbnRmKCIlc1xuIiwgeF9mdGFiW1hGVU5DX1ZBTFVFKGYpXS54Zl9uYW1lKTsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCWVsc2UKKwkJc2hwcmludGYoIiclcydcbiIsIHhfYXRhYltwcmVmaXhdW2tleV0pOworI2VuZGlmCit9CisKK2ludAoreF9iaW5kKGNvbnN0IGNoYXIgKmExLCBjb25zdCBjaGFyICphMiwKKyNpZm5kZWYgTUtTSF9TTUFMTAorICAgIGJvb2wgbWFjcm8sCQkJLyogYmluZCAtbSAqLworI2VuZGlmCisgICAgYm9vbCBsaXN0KQkJCS8qIGJpbmQgLWwgKi8KK3sKKwl1bnNpZ25lZCBjaGFyIGY7CisJaW50IHByZWZpeCwga2V5OworCWNoYXIgKm0xLCAqbTI7CisjaWZuZGVmIE1LU0hfU01BTEwKKwljaGFyICpzcCA9IE5VTEw7CisJYm9vbCBoYXN0aWxkZTsKKyNlbmRpZgorCisJaWYgKHhfdGFiID09IE5VTEwpIHsKKwkJYmlfZXJyb3JmKCJjYW5ub3QgYmluZCwgbm90IGEgdHR5Iik7CisJCXJldHVybiAoMSk7CisJfQorCS8qIExpc3QgZnVuY3Rpb24gbmFtZXMgKi8KKwlpZiAobGlzdCkgeworCQlmb3IgKGYgPSAwOyBmIDwgTkVMRU0oeF9mdGFiKTsgZisrKQorCQkJaWYgKHhfZnRhYltmXS54Zl9uYW1lICYmCisJCQkgICAgISh4X2Z0YWJbZl0ueGZfZmxhZ3MgJiBYRl9OT0JJTkQpKQorCQkJCXNocHJpbnRmKCIlc1xuIiwgeF9mdGFiW2ZdLnhmX25hbWUpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoYTEgPT0gTlVMTCkgeworCQlmb3IgKHByZWZpeCA9IDA7IHByZWZpeCA8IFhfTlRBQlM7IHByZWZpeCsrKQorCQkJZm9yIChrZXkgPSAwOyBrZXkgPCBYX1RBQlNaOyBrZXkrKykgeworCQkJCWYgPSBYRlVOQ19WQUxVRSh4X3RhYltwcmVmaXhdW2tleV0pOworCQkJCWlmIChmID09IFhGVU5DX2luc2VydCB8fCBmID09IFhGVU5DX2Vycm9yCisjaWZuZGVmIE1LU0hfU01BTEwKKwkJCQkgICAgfHwgKG1hY3JvICYmIGYgIT0gWEZVTkNfaW5zX3N0cmluZykKKyNlbmRpZgorCQkJCSAgICApCisJCQkJCWNvbnRpbnVlOworCQkJCXhfcHJpbnQocHJlZml4LCBrZXkpOworCQkJfQorCQlyZXR1cm4gKDApOworCX0KKwltMiA9IG0xID0geF9tYXBpbihhMSwgQVRFTVApOworCXByZWZpeCA9IDA7CisJZm9yICg7OyBtMSsrKSB7CisJCWtleSA9ICh1bnNpZ25lZCBjaGFyKSptMTsKKwkJZiA9IFhGVU5DX1ZBTFVFKHhfdGFiW3ByZWZpeF1ba2V5XSk7CisJCWlmIChmID09IFhGVU5DX21ldGExKQorCQkJcHJlZml4ID0gMTsKKwkJZWxzZSBpZiAoZiA9PSBYRlVOQ19tZXRhMikKKwkJCXByZWZpeCA9IDI7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlpZiAoKisrbTEKKyNpZm5kZWYgTUtTSF9TTUFMTAorCSAgICAmJiAoKCptMSAhPSAnficpIHx8ICoobTEgKyAxKSkKKyNlbmRpZgorCSAgICApIHsKKwkJY2hhciBtc2dbMjU2XSA9ICJrZXkgc2VxdWVuY2UgJyI7CisJCWNvbnN0IGNoYXIgKmMgPSBhMTsKKwkJbTEgPSBtc2cgKyBzdHJsZW4obXNnKTsKKwkJd2hpbGUgKCpjICYmIG0xIDwgKG1zZyArIHNpemVvZihtc2cpIC0gMykpCisJCQl4X21hcG91dDIoKmMrKywgJm0xKTsKKwkJYmlfZXJyb3JmKCIlcycgdG9vIGxvbmciLCBtc2cpOworCQlyZXR1cm4gKDEpOworCX0KKyNpZm5kZWYgTUtTSF9TTUFMTAorCWhhc3RpbGRlID0gKm0xOworI2VuZGlmCisJYWZyZWUobTIsIEFURU1QKTsKKworCWlmIChhMiA9PSBOVUxMKSB7CisJCXhfcHJpbnQocHJlZml4LCBrZXkpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoKmEyID09IDApIHsKKwkJZiA9IFhGVU5DX2luc2VydDsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCX0gZWxzZSBpZiAobWFjcm8pIHsKKwkJZiA9IFhGVU5DX2luc19zdHJpbmc7CisJCXNwID0geF9tYXBpbihhMiwgQUVESVQpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJZm9yIChmID0gMDsgZiA8IE5FTEVNKHhfZnRhYik7IGYrKykKKwkJCWlmICh4X2Z0YWJbZl0ueGZfbmFtZSAmJgorCQkJICAgIHN0cmNtcCh4X2Z0YWJbZl0ueGZfbmFtZSwgYTIpID09IDApCisJCQkJYnJlYWs7CisJCWlmIChmID09IE5FTEVNKHhfZnRhYikgfHwgeF9mdGFiW2ZdLnhmX2ZsYWdzICYgWEZfTk9CSU5EKSB7CisJCQliaV9lcnJvcmYoIiVzOiBubyBzdWNoIGZ1bmN0aW9uIiwgYTIpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0KKworI2lmbmRlZiBNS1NIX1NNQUxMCisJaWYgKFhGVU5DX1ZBTFVFKHhfdGFiW3ByZWZpeF1ba2V5XSkgPT0gWEZVTkNfaW5zX3N0cmluZyAmJgorCSAgICB4X2F0YWJbcHJlZml4XVtrZXldKQorCQlhZnJlZSh4X2F0YWJbcHJlZml4XVtrZXldLCBBRURJVCk7CisjZW5kaWYKKwl4X3RhYltwcmVmaXhdW2tleV0gPSBmCisjaWZuZGVmIE1LU0hfU01BTEwKKwkgICAgfCAoaGFzdGlsZGUgPyAweDgwIDogMCkKKyNlbmRpZgorCSAgICA7CisjaWZuZGVmIE1LU0hfU01BTEwKKwl4X2F0YWJbcHJlZml4XVtrZXldID0gc3A7CisjZW5kaWYKKworCS8qIFRyYWNrIHdoYXQgdGhlIHVzZXIgaGFzIGJvdW5kIHNvIHhfbW9kZSh0cnVlKSB3b24ndCB0b2FzdCB0aGluZ3MgKi8KKwlpZiAoZiA9PSBYRlVOQ19pbnNlcnQpCisJCXhfYm91bmRbKHByZWZpeCAqIFhfVEFCU1ogKyBrZXkpIC8gOF0gJj0KKwkJICAgIH4oMSA8PCAoKHByZWZpeCAqIFhfVEFCU1ogKyBrZXkpICUgOCkpOworCWVsc2UKKwkJeF9ib3VuZFsocHJlZml4ICogWF9UQUJTWiArIGtleSkgLyA4XSB8PQorCQkgICAgKDEgPDwgKChwcmVmaXggKiBYX1RBQlNaICsga2V5KSAlIDgpKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCit4X2luaXRfZW1hY3Modm9pZCkKK3sKKwlpbnQgaSwgajsKKworCWFpbml0KEFFRElUKTsKKwl4X25leHRjbWQgPSAtMTsKKworCXhfdGFiID0gYWxsb2MoWF9OVEFCUyAqIHNpemVvZigqeF90YWIpLCBBRURJVCk7CisJZm9yIChqID0gMDsgaiA8IFhfVEFCU1o7IGorKykKKwkJeF90YWJbMF1bal0gPSBYRlVOQ19pbnNlcnQ7CisJZm9yIChpID0gMTsgaSA8IFhfTlRBQlM7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IFhfVEFCU1o7IGorKykKKwkJCXhfdGFiW2ldW2pdID0gWEZVTkNfZXJyb3I7CisJZm9yIChpID0gMDsgaSA8IChpbnQpTkVMRU0oeF9kZWZiaW5kaW5ncyk7IGkrKykKKwkJeF90YWJbeF9kZWZiaW5kaW5nc1tpXS54ZGJfdGFiXVt4X2RlZmJpbmRpbmdzW2ldLnhkYl9jaGFyXQorCQkgICAgPSB4X2RlZmJpbmRpbmdzW2ldLnhkYl9mdW5jOworCisjaWZuZGVmIE1LU0hfU01BTEwKKwl4X2F0YWIgPSBhbGxvYyhYX05UQUJTICogc2l6ZW9mKCp4X2F0YWIpLCBBRURJVCk7CisJZm9yIChpID0gMTsgaSA8IFhfTlRBQlM7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IFhfVEFCU1o7IGorKykKKwkJCXhfYXRhYltpXVtqXSA9IE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2JpbmRfaWZfbm90X2JvdW5kKGludCBwLCBpbnQgaywgaW50IGZ1bmMpCit7CisJLyogSGFzIHVzZXIgYWxyZWFkeSBib3VuZCB0aGlzIGtleT8gSWYgc28sIGRvbid0IG92ZXJyaWRlIGl0ICovCisJaWYgKHhfYm91bmRbKChwKSAqIFhfVEFCU1ogKyAoaykpIC8gOF0gJgorCSAgICAoMSA8PCAoKChwKSAqIFhfVEFCU1ogKyAoaykpICUgOCkpKQorCQlyZXR1cm47CisKKwl4X3RhYltwXVtrXSA9IGZ1bmM7Cit9CisKK3N0YXRpYyBpbnQKK3hfc2V0X21hcmsoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4bXAgPSB4Y3A7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9raWxsX3JlZ2lvbihpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWludCByc2l6ZTsKKwljaGFyICp4cjsKKworCWlmICh4bXAgPT0gTlVMTCkgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfQorCWlmICh4bXAgPiB4Y3ApIHsKKwkJcnNpemUgPSB4bXAgLSB4Y3A7CisJCXhyID0geGNwOworCX0gZWxzZSB7CisJCXJzaXplID0geGNwIC0geG1wOworCQl4ciA9IHhtcDsKKwl9CisJeF9nb3RvKHhyKTsKKwl4X2RlbGV0ZShyc2l6ZSwgdHJ1ZSk7CisJeG1wID0geHI7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF94Y2hnX3BvaW50X21hcmsoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwljaGFyICp0bXA7CisKKwlpZiAoeG1wID09IE5VTEwpIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwl0bXAgPSB4bXA7CisJeG1wID0geGNwOworCXhfZ290byh0bXApOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbm9vcChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXJldHVybiAoS1NURCk7Cit9CisKKy8qCisgKglGaWxlL2NvbW1hbmQgbmFtZSBjb21wbGV0aW9uIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbnQKK3hfY29tcF9jb21tKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJZG9fY29tcGxldGUoWENGX0NPTU1BTkQsIENUX0NPTVBMRVRFKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2xpc3RfY29tbShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWRvX2NvbXBsZXRlKFhDRl9DT01NQU5ELCBDVF9MSVNUKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2NvbXBsZXRlKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJZG9fY29tcGxldGUoWENGX0NPTU1BTkRfRklMRSwgQ1RfQ09NUExFVEUpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZW51bWVyYXRlKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJZG9fY29tcGxldGUoWENGX0NPTU1BTkRfRklMRSwgQ1RfTElTVCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9jb21wX2ZpbGUoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlkb19jb21wbGV0ZShYQ0ZfRklMRSwgQ1RfQ09NUExFVEUpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbGlzdF9maWxlKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJZG9fY29tcGxldGUoWENGX0ZJTEUsIENUX0xJU1QpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfY29tcF9saXN0KGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJZG9fY29tcGxldGUoWENGX0NPTU1BTkRfRklMRSwgQ1RfQ09NUExJU1QpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZXhwYW5kKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJY2hhciAqKndvcmRzOworCWludCBzdGFydCwgZW5kLCBud29yZHMsIGk7CisJYm9vbCBpc19jb21tYW5kOworCisJbndvcmRzID0geF9jZl9nbG9iKFhDRl9GSUxFLCB4YnVmLCB4ZXAgLSB4YnVmLCB4Y3AgLSB4YnVmLAorCSAgICAmc3RhcnQsICZlbmQsICZ3b3JkcywgJmlzX2NvbW1hbmQpOworCisJaWYgKG53b3JkcyA9PSAwKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJeF9nb3RvKHhidWYgKyBzdGFydCk7CisJeF9kZWxldGUoZW5kIC0gc3RhcnQsIGZhbHNlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOykgeworCQlpZiAoeF9lc2NhcGUod29yZHNbaV0sIHN0cmxlbih3b3Jkc1tpXSksIHhfZG9faW5zKSA8IDAgfHwKKwkJICAgICgrK2kgPCBud29yZHMgJiYgeF9pbnMoIiAiKSA8IDApKSB7CisJCQl4X2VfcHV0YzIoNyk7CisJCQlyZXR1cm4gKEtTVEQpOworCQl9CisJfQorCXhfYWRqdXN0KCk7CisKKwlyZXR1cm4gKEtTVEQpOworfQorCisvKiB0eXBlID09IDAgZm9yIGxpc3QsIDEgZm9yIGNvbXBsZXRlIGFuZCAyIGZvciBjb21wbGV0ZS1saXN0ICovCitzdGF0aWMgdm9pZAorZG9fY29tcGxldGUoaW50IGZsYWdzLAkvKiBYQ0Zfe0NPTU1BTkQsRklMRSxDT01NQU5EX0ZJTEV9ICovCisgICAgQ29tcF90eXBlIHR5cGUpCit7CisJY2hhciAqKndvcmRzOworCWludCBzdGFydCwgZW5kLCBubGVuLCBvbGVuLCBud29yZHM7CisJYm9vbCBpc19jb21tYW5kLCBjb21wbGV0ZWQgPSBmYWxzZTsKKworCW53b3JkcyA9IHhfY2ZfZ2xvYihmbGFncywgeGJ1ZiwgeGVwIC0geGJ1ZiwgeGNwIC0geGJ1ZiwKKwkgICAgJnN0YXJ0LCAmZW5kLCAmd29yZHMsICZpc19jb21tYW5kKTsKKwkvKiBubyBtYXRjaCAqLworCWlmIChud29yZHMgPT0gMCkgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybjsKKwl9CisJaWYgKHR5cGUgPT0gQ1RfTElTVCkgeworCQl4X3ByaW50X2V4cGFuc2lvbnMobndvcmRzLCB3b3JkcywgaXNfY29tbWFuZCk7CisJCXhfcmVkcmF3KDApOworCQl4X2ZyZWVfd29yZHMobndvcmRzLCB3b3Jkcyk7CisJCXJldHVybjsKKwl9CisJb2xlbiA9IGVuZCAtIHN0YXJ0OworCW5sZW4gPSB4X2xvbmdlc3RfcHJlZml4KG53b3Jkcywgd29yZHMpOworCS8qIGNvbXBsZXRlICovCisJaWYgKG53b3JkcyA9PSAxIHx8IG5sZW4gPiBvbGVuKSB7CisJCXhfZ290byh4YnVmICsgc3RhcnQpOworCQl4X2RlbGV0ZShvbGVuLCBmYWxzZSk7CisJCXhfZXNjYXBlKHdvcmRzWzBdLCBubGVuLCB4X2RvX2lucyk7CisJCXhfYWRqdXN0KCk7CisJCWNvbXBsZXRlZCA9IHRydWU7CisJfQorCS8qIGFkZCBzcGFjZSBpZiBzaW5nbGUgbm9uLWRpciBtYXRjaCAqLworCWlmIChud29yZHMgPT0gMSAmJiB3b3Jkc1swXVtubGVuIC0gMV0gIT0gJy8nKSB7CisJCXhfaW5zKCIgIik7CisJCWNvbXBsZXRlZCA9IHRydWU7CisJfQorCWlmICh0eXBlID09IENUX0NPTVBMSVNUICYmICFjb21wbGV0ZWQpIHsKKwkJeF9wcmludF9leHBhbnNpb25zKG53b3Jkcywgd29yZHMsIGlzX2NvbW1hbmQpOworCQljb21wbGV0ZWQgPSB0cnVlOworCX0KKwlpZiAoY29tcGxldGVkKQorCQl4X3JlZHJhdygwKTsKKworCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKK30KKworLyogTkFNRToKKyAqCXhfYWRqdXN0IC0gcmVkcmF3IHRoZSBsaW5lIGFkanVzdGluZyBzdGFydGluZyBwb2ludCBldGMuCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIGhhdmUgZXhjZWVkZWQgdGhlIGJvdW5kcworICoJb2YgdGhlIGVkaXQgd2luZG93LiBJdCBpbmNyZW1lbnRzIHhfYWRqX2RvbmUgc28gdGhhdAorICoJZnVuY3Rpb25zIGxpa2UgeF9pbnMgYW5kIHhfZGVsZXRlIGtub3cgdGhhdCB3ZSBoYXZlIGJlZW4KKyAqCWNhbGxlZCBhbmQgY2FuIHNraXAgdGhlIHhfYnMoKSBzdHVmZiB3aGljaCBoYXMgYWxyZWFkeQorICoJYmVlbiBkb25lIGJ5IHhfcmVkcmF3LgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqCU5vbmUKKyAqLworc3RhdGljIHZvaWQKK3hfYWRqdXN0KHZvaWQpCit7CisJeF9hZGpfZG9uZSsrOwkJCS8qIGZsYWcgdGhlIGZhY3QgdGhhdCB3ZSB3ZXJlIGNhbGxlZC4gKi8KKwkvKgorCSAqIHdlIGhhZCBhIHByb2JsZW0gaWYgdGhlIHByb21wdCBsZW5ndGggPiB4eF9jb2xzIC8gMgorCSAqLworCWlmICgoeGJwID0geGNwIC0gKHhfZGlzcGxlbiAvIDIpKSA8IHhidWYpCisJCXhicCA9IHhidWY7CisJaWYgKFVURk1PREUpCisJCXdoaWxlICgoeGJwID4geGJ1ZikgJiYgKCgqeGJwICYgMHhDMCkgPT0gMHg4MCkpCisJCQktLXhicDsKKwl4bHBfdmFsaWQgPSBmYWxzZTsKKwl4X3JlZHJhdyh4eF9jb2xzKTsKKwl4X2ZsdXNoKCk7Cit9CisKK3N0YXRpYyB2b2lkCit4X2VfdW5nZXRjKGludCBjKQoreworCXVuZ2V0X2NoYXIgPSBjIDwgMCA/IC0xIDogKGMgJiAyNTUpOworfQorCitzdGF0aWMgaW50Cit4X2VfZ2V0Yyh2b2lkKQoreworCWludCBjOworCisJaWYgKHVuZ2V0X2NoYXIgPj0gMCkgeworCQljID0gdW5nZXRfY2hhcjsKKwkJdW5nZXRfY2hhciA9IC0xOworCQlyZXR1cm4gKGMpOworCX0KKworI2lmbmRlZiBNS1NIX1NNQUxMCisJaWYgKG1hY3JvcHRyKSB7CisJCWlmICgoYyA9ICh1bnNpZ25lZCBjaGFyKSptYWNyb3B0cisrKSkKKwkJCXJldHVybiAoYyk7CisJCW1hY3JvcHRyID0gTlVMTDsKKwl9CisjZW5kaWYKKworCXJldHVybiAoeF9nZXRjKCkpOworfQorCitzdGF0aWMgdm9pZAoreF9lX3B1dGMyKGludCBjKQoreworCWludCB3aWR0aCA9IDE7CisKKwlpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKKwkJeF9jb2wgPSAwOworCWlmICh4X2NvbCA8IHh4X2NvbHMpIHsKKwkJaWYgKFVURk1PREUgJiYgKGMgPiAweDdGKSkgeworCQkJY2hhciB1dGZfdG1wWzNdOworCQkJc2l6ZV90IHg7CisKKwkJCWlmIChjIDwgMHhBMCkKKwkJCQljID0gMHhGRkZEOworCQkJeCA9IHV0Zl93Y3RvbWIodXRmX3RtcCwgYyk7CisJCQl4X3B1dGModXRmX3RtcFswXSk7CisJCQlpZiAoeCA+IDEpCisJCQkJeF9wdXRjKHV0Zl90bXBbMV0pOworCQkJaWYgKHggPiAyKQorCQkJCXhfcHV0Yyh1dGZfdG1wWzJdKTsKKwkJCXdpZHRoID0gdXRmX3djd2lkdGgoYyk7CisJCX0gZWxzZQorCQkJeF9wdXRjKGMpOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSA3OgorCQkJYnJlYWs7CisJCWNhc2UgJ1xyJzoKKwkJY2FzZSAnXG4nOgorCQkJYnJlYWs7CisJCWNhc2UgJ1xiJzoKKwkJCXhfY29sLS07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXhfY29sICs9IHdpZHRoOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHhfYWRqX29rICYmICh4X2NvbCA8IDAgfHwgeF9jb2wgPj0gKHh4X2NvbHMgLSAyKSkpCisJCXhfYWRqdXN0KCk7Cit9CisKK3N0YXRpYyB2b2lkCit4X2VfcHV0YzMoY29uc3QgY2hhciAqKmNwKQoreworCWludCB3aWR0aCA9IDEsIGMgPSAqKihjb25zdCB1bnNpZ25lZCBjaGFyICoqKWNwOworCisJaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCisJCXhfY29sID0gMDsKKwlpZiAoeF9jb2wgPCB4eF9jb2xzKSB7CisJCWlmIChVVEZNT0RFICYmIChjID4gMHg3RikpIHsKKwkJCWNoYXIgKmNwMjsKKworCQkJd2lkdGggPSB1dGZfd2lkdGhhZGooKmNwLCAoY29uc3QgY2hhciAqKikmY3AyKTsKKwkJCXdoaWxlICgqY3AgPCBjcDIpCisJCQkJeF9wdXRjZigqKCpjcCkrKyk7CisJCX0gZWxzZSB7CisJCQkoKmNwKSsrOworCQkJeF9wdXRjKGMpOworCQl9CisJCXN3aXRjaCAoYykgeworCQljYXNlIDc6CisJCQlicmVhazsKKwkJY2FzZSAnXHInOgorCQljYXNlICdcbic6CisJCQlicmVhazsKKwkJY2FzZSAnXGInOgorCQkJeF9jb2wtLTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeF9jb2wgKz0gd2lkdGg7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoeF9hZGpfb2sgJiYgKHhfY29sIDwgMCB8fCB4X2NvbCA+PSAoeHhfY29scyAtIDIpKSkKKwkJeF9hZGp1c3QoKTsKK30KKworc3RhdGljIHZvaWQKK3hfZV9wdXRzKGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGFkaiA9IHhfYWRqX2RvbmU7CisKKwl3aGlsZSAoKnMgJiYgYWRqID09IHhfYWRqX2RvbmUpCisJCXhfZV9wdXRjMygmcyk7Cit9CisKKy8qIE5BTUU6CisgKgl4X3NldF9hcmcgLSBzZXQgYW4gYXJnIHZhbHVlIGZvciBuZXh0IGZ1bmN0aW9uCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIGlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIE0tWzAtOV0uCisgKgorICogUkVUVVJOIFZBTFVFOgorICoJS1NURAorICovCitzdGF0aWMgaW50Cit4X3NldF9hcmcoaW50IGMpCit7CisJaW50IG4gPSAwLCBmaXJzdCA9IDE7CisKKwljICY9IDI1NTsJLyogc3RyaXAgY29tbWFuZCBwcmVmaXggKi8KKwlmb3IgKDsgYyA+PSAwICYmIGtzaF9pc2RpZ2l0KGMpOyBjID0geF9lX2dldGMoKSwgZmlyc3QgPSAwKQorCQluID0gbiAqIDEwICsgKGMgLSAnMCcpOworCWlmIChjIDwgMCB8fCBmaXJzdCkgeworCQl4X2VfcHV0YzIoNyk7CisJCXhfYXJnID0gMTsKKwkJeF9hcmdfZGVmYXVsdGVkID0gMTsKKwl9IGVsc2UgeworCQl4X2VfdW5nZXRjKGMpOworCQl4X2FyZyA9IG47CisJCXhfYXJnX2RlZmF1bHRlZCA9IDA7CisJfQorCXJldHVybiAoS1NURCk7Cit9CisKKy8qIENvbW1lbnQgb3IgdW5jb21tZW50IHRoZSBjdXJyZW50IGxpbmUuICovCitzdGF0aWMgaW50Cit4X2NvbW1lbnQoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlpbnQgb2xkc2l6ZSA9IHhfc2l6ZV9zdHIoeGJ1Zik7CisJaW50IGxlbiA9IHhlcCAtIHhidWY7CisJaW50IHJldCA9IHhfZG9fY29tbWVudCh4YnVmLCB4ZW5kIC0geGJ1ZiwgJmxlbik7CisKKwlpZiAocmV0IDwgMCkKKwkJeF9lX3B1dGMyKDcpOworCWVsc2UgeworCQl4X21vZGlmaWVkKCk7CisJCXhlcCA9IHhidWYgKyBsZW47CisJCSp4ZXAgPSAnXDAnOworCQl4Y3AgPSB4YnAgPSB4YnVmOworCQl4X3JlZHJhdyhvbGRzaXplKTsKKwkJaWYgKHJldCA+IDApCisJCQlyZXR1cm4gKHhfbmV3bGluZSgnXG4nKSk7CisJfQorCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfdmVyc2lvbihpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWNoYXIgKm9feGJ1ZiA9IHhidWYsICpvX3hlbmQgPSB4ZW5kOworCWNoYXIgKm9feGJwID0geGJwLCAqb194ZXAgPSB4ZXAsICpvX3hjcCA9IHhjcDsKKwlpbnQgdmxlbiwgbGltID0geF9sYXN0Y3AoKSAtIHhicDsKKwljaGFyICp2OworCisJc3RyZHVweCh2LCBLU0hfVkVSU0lPTiwgQVRFTVApOworCisJeGJ1ZiA9IHhicCA9IHhjcCA9IHY7CisJeGVuZCA9IHhlcCA9IHYgKyAodmxlbiA9IHN0cmxlbih2KSk7CisJeF9yZWRyYXcobGltKTsKKwl4X2ZsdXNoKCk7CisKKwljID0geF9lX2dldGMoKTsKKwl4YnVmID0gb194YnVmOworCXhlbmQgPSBvX3hlbmQ7CisJeGJwID0gb194YnA7CisJeGVwID0gb194ZXA7CisJeGNwID0gb194Y3A7CisJeF9yZWRyYXcodmxlbik7CisKKwlpZiAoYyA8IDApCisJCXJldHVybiAoS1NURCk7CisJLyogVGhpcyBpcyB3aGF0IEFUJlQga3NoIHNlZW1zIHRvIGRvLi4uIFZlcnkgYml6YXJyZSAqLworCWlmIChjICE9ICcgJykKKwkJeF9lX3VuZ2V0YyhjKTsKKworCWFmcmVlKHYsIEFURU1QKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCisjaWZuZGVmIE1LU0hfU01BTEwKK3N0YXRpYyBpbnQKK3hfZWRpdF9saW5lKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJaWYgKHhfYXJnX2RlZmF1bHRlZCkgeworCQlpZiAoeGVwID09IHhidWYpIHsKKwkJCXhfZV9wdXRjMig3KTsKKwkJCXJldHVybiAoS1NURCk7CisJCX0KKwkJaWYgKG1vZGlmaWVkKSB7CisJCQkqeGVwID0gJ1wwJzsKKwkJCWhpc3RzYXZlKCZzb3VyY2UtPmxpbmUsIHhidWYsIHRydWUsIHRydWUpOworCQkJeF9hcmcgPSAwOworCQl9IGVsc2UKKwkJCXhfYXJnID0gc291cmNlLT5saW5lIC0gKGhpc3RwdHIgLSB4X2hpc3RwKTsKKwl9CisJaWYgKHhfYXJnKQorCQlzaGZfc25wcmludGYoeGJ1ZiwgeGVuZCAtIHhidWYsICIlcyAlZCIsCisJCSAgICAiZmMgLWUgJHtWSVNVQUw6LSR7RURJVE9SOi12aX19IC0tIiwgeF9hcmcpOworCWVsc2UKKwkJc3RybGNweSh4YnVmLCAiZmMgLWUgJHtWSVNVQUw6LSR7RURJVE9SOi12aX19IC0tIiwgeGVuZCAtIHhidWYpOworCXhlcCA9IHhidWYgKyBzdHJsZW4oeGJ1Zik7CisJcmV0dXJuICh4X25ld2xpbmUoJ1xuJykpOworfQorI2VuZGlmCisKKy8qIE5BTUU6CisgKgl4X3ByZXZfaGlzdHdvcmQgLSByZWNvdmVyIHdvcmQgZnJvbSBwcmV2IGNvbW1hbmQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgZnVuY3Rpb24gcmVjb3ZlcnMgdGhlIGxhc3Qgd29yZCBmcm9tIHRoZSBwcmV2aW91cworICoJY29tbWFuZCBhbmQgaW5zZXJ0cyBpdCBpbnRvIHRoZSBjdXJyZW50IGVkaXQgbGluZS4gSWYgYQorICoJbnVtZXJpYyBhcmcgaXMgc3VwcGxpZWQgdGhlbiB0aGUgbid0aCB3b3JkIGZyb20gdGhlCisgKglzdGFydCBvZiB0aGUgcHJldmlvdXMgY29tbWFuZCBpcyB1c2VkLgorICoJQXMgYSBzaWRlIGVmZmVjdCwgdHJhc2hlcyB0aGUgbWFyayBpbiBvcmRlciB0byBhY2hpZXZlCisgKgliZWluZyBjYWxsZWQgaW4gYSByZXBlYXRhYmxlIGZhc2hpb24uCisgKgorICoJQm91bmQgdG8gTS0uCisgKgorICogUkVUVVJOIFZBTFVFOgorICoJS1NURAorICovCitzdGF0aWMgaW50Cit4X3ByZXZfaGlzdHdvcmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwljaGFyICpyY3AsICpjcDsKKwljaGFyICoqeGhwOworCWludCBtOworCisJaWYgKHhtcCAmJiBtb2RpZmllZCA+IDEpCisJCXhfa2lsbF9yZWdpb24oMCk7CisJbSA9IG1vZGlmaWVkID8gbW9kaWZpZWQgOiAxOworCXhocCA9IGhpc3RwdHIgLSAobSAtIDEpOworCWlmICgoeGhwIDwgaGlzdG9yeSkgfHwgIShjcCA9ICp4aHApKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJeF9tb2RpZmllZCgpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwl4X3NldF9tYXJrKDApOworCWlmICh4X2FyZ19kZWZhdWx0ZWQpIHsKKwkJcmNwID0gJmNwW3N0cmxlbihjcCkgLSAxXTsKKwkJLyoKKwkJICogaWdub3JlIHdoaXRlLXNwYWNlIGFmdGVyIHRoZSBsYXN0IHdvcmQKKwkJICovCisJCXdoaWxlIChyY3AgPiBjcCAmJiBpc19jZnMoKnJjcCkpCisJCQlyY3AtLTsKKwkJd2hpbGUgKHJjcCA+IGNwICYmICFpc19jZnMoKnJjcCkpCisJCQlyY3AtLTsKKwkJaWYgKGlzX2NmcygqcmNwKSkKKwkJCXJjcCsrOworCQl4X2lucyhyY3ApOworCX0gZWxzZSB7CisJCWNoYXIgY2g7CisKKwkJcmNwID0gY3A7CisJCS8qCisJCSAqIGlnbm9yZSB3aGl0ZS1zcGFjZSBhdCBzdGFydCBvZiBsaW5lCisJCSAqLworCQl3aGlsZSAoKnJjcCAmJiBpc19jZnMoKnJjcCkpCisJCQlyY3ArKzsKKwkJd2hpbGUgKHhfYXJnLS0gPiAxKSB7CisJCQl3aGlsZSAoKnJjcCAmJiAhaXNfY2ZzKCpyY3ApKQorCQkJCXJjcCsrOworCQkJd2hpbGUgKCpyY3AgJiYgaXNfY2ZzKCpyY3ApKQorCQkJCXJjcCsrOworCQl9CisJCWNwID0gcmNwOworCQl3aGlsZSAoKnJjcCAmJiAhaXNfY2ZzKCpyY3ApKQorCQkJcmNwKys7CisJCWNoID0gKnJjcDsKKwkJKnJjcCA9ICdcMCc7CisJCXhfaW5zKGNwKTsKKwkJKnJjcCA9IGNoOworCX0KKwltb2RpZmllZCA9IG0gKyAxOworCXJldHVybiAoS1NURCk7Cit9CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorLyogVXBwZXJjYXNlIE4oMSkgd29yZHMgKi8KK3N0YXRpYyBpbnQKK3hfZm9sZF91cHBlcihpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXJldHVybiAoeF9mb2xkX2Nhc2UoJ1UnKSk7Cit9CisKKy8qIExvd2VyY2FzZSBOKDEpIHdvcmRzICovCitzdGF0aWMgaW50Cit4X2ZvbGRfbG93ZXIoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlyZXR1cm4gKHhfZm9sZF9jYXNlKCdMJykpOworfQorCisvKiBMb3dlcmNhc2UgTigxKSB3b3JkcyAqLworc3RhdGljIGludAoreF9mb2xkX2NhcGl0YWxpc2UoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlyZXR1cm4gKHhfZm9sZF9jYXNlKCdDJykpOworfQorCisvKiBOQU1FOgorICoJeF9mb2xkX2Nhc2UgLSBjb252ZXJ0IHdvcmQgdG8gVVBQRVIvbG93ZXIvQ2FwaXRhbCBjYXNlCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW1wbGVtZW50IE0tVSxNLXUsTS1MLE0tbCxNLUMgYW5kIE0tYworICoJdG8gVVBQRVIgY2FzZSwgbG93ZXIgY2FzZSBvciBDYXBpdGFsaXNlIHdvcmRzLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqCU5vbmUKKyAqLworc3RhdGljIGludAoreF9mb2xkX2Nhc2UoaW50IGMpCit7CisJY2hhciAqY3AgPSB4Y3A7CisKKwlpZiAoY3AgPT0geGVwKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJd2hpbGUgKHhfYXJnLS0pIHsKKwkJLyoKKwkJICogZmlyc3Qgc2tpcCBvdmVyIGFueSB3aGl0ZS1zcGFjZQorCQkgKi8KKwkJd2hpbGUgKGNwICE9IHhlcCAmJiBpc19tZnMoKmNwKSkKKwkJCWNwKys7CisJCS8qCisJCSAqIGRvIHRoZSBmaXJzdCBjaGFyIG9uIGl0cyBvd24gc2luY2UgaXQgbWF5IGJlCisJCSAqIGEgZGlmZmVyZW50IGFjdGlvbiB0aGFuIGZvciB0aGUgcmVzdC4KKwkJICovCisJCWlmIChjcCAhPSB4ZXApIHsKKwkJCWlmIChjID09ICdMJykJCS8qIGxvd2VyY2FzZSAqLworCQkJCSpjcCA9IGtzaF90b2xvd2VyKCpjcCk7CisJCQllbHNlCQkJLyogdXBwZXJjYXNlLCBjYXBpdGFsaXNlICovCisJCQkJKmNwID0ga3NoX3RvdXBwZXIoKmNwKTsKKwkJCWNwKys7CisJCX0KKwkJLyoKKwkJICogbm93IGZvciB0aGUgcmVzdCBvZiB0aGUgd29yZAorCQkgKi8KKwkJd2hpbGUgKGNwICE9IHhlcCAmJiAhaXNfbWZzKCpjcCkpIHsKKwkJCWlmIChjID09ICdVJykJCS8qIHVwcGVyY2FzZSAqLworCQkJCSpjcCA9IGtzaF90b3VwcGVyKCpjcCk7CisJCQllbHNlCQkJLyogbG93ZXJjYXNlLCBjYXBpdGFsaXNlICovCisJCQkJKmNwID0ga3NoX3RvbG93ZXIoKmNwKTsKKwkJCWNwKys7CisJCX0KKwl9CisJeF9nb3RvKGNwKTsKKwl4X21vZGlmaWVkKCk7CisJcmV0dXJuIChLU1REKTsKK30KKyNlbmRpZgorCisvKiBOQU1FOgorICoJeF9sYXN0Y3AgLSBsYXN0IHZpc2libGUgY2hhcgorICoKKyAqIFNZTk9QU0lTOgorICoJeF9sYXN0Y3AoKQorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGF0IGNoYXIgaW4gdGhlCisgKgllZGl0IGJ1ZmZlciB0aGF0IHdpbGwgYmUgdGhlIGxhc3QgZGlzcGxheWVkIG9uIHRoZQorICoJc2NyZWVuLiBUaGUgc2VxdWVuY2U6CisgKgorICoJY3AgPSB4X2xhc3RjcCgpOworICoJd2hpbGUgKGNwID4geGNwKQorICoJCXhfYnMzKCZjcCk7CisgKgorICoJV2lsbCBwb3NpdGlvbiB0aGUgY3Vyc29yIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqCWNwIG9yIE5VTEwKKyAqLworc3RhdGljIGNoYXIgKgoreF9sYXN0Y3Aodm9pZCkKK3sKKwlpZiAoIXhscF92YWxpZCkgeworCQlpbnQgaSA9IDAsIGo7CisJCWNoYXIgKnhscDI7CisKKwkJeGxwID0geGJwOworCQl3aGlsZSAoeGxwIDwgeGVwKSB7CisJCQlqID0geF9zaXplMih4bHAsICZ4bHAyKTsKKwkJCWlmICgoaSArIGopID4geF9kaXNwbGVuKQorCQkJCWJyZWFrOworCQkJaSArPSBqOworCQkJeGxwID0geGxwMjsKKwkJfQorCX0KKwl4bHBfdmFsaWQgPSB0cnVlOworCXJldHVybiAoeGxwKTsKK30KKworc3RhdGljIGJvb2wKK3hfbW9kZShib29sIG9ub2ZmKQoreworCXN0YXRpYyBib29sIHhfY3VyX21vZGU7CisJYm9vbCBwcmV2OworCisJaWYgKHhfY3VyX21vZGUgPT0gb25vZmYpCisJCXJldHVybiAoeF9jdXJfbW9kZSk7CisJcHJldiA9IHhfY3VyX21vZGU7CisJeF9jdXJfbW9kZSA9IG9ub2ZmOworCisJaWYgKG9ub2ZmKSB7CisJCXN0cnVjdCB0ZXJtaW9zIGNiOworCisJCWNiID0gdHR5X3N0YXRlOworCisJCWVkY2hhcnMuZXJhc2UgPSBjYi5jX2NjW1ZFUkFTRV07CisJCWVkY2hhcnMua2lsbCA9IGNiLmNfY2NbVktJTExdOworCQllZGNoYXJzLmludHIgPSBjYi5jX2NjW1ZJTlRSXTsKKwkJZWRjaGFycy5xdWl0ID0gY2IuY19jY1tWUVVJVF07CisJCWVkY2hhcnMuZW9mID0gY2IuY19jY1tWRU9GXTsKKyNpZmRlZiBWV0VSQVNFCisJCWVkY2hhcnMud2VyYXNlID0gY2IuY19jY1tWV0VSQVNFXTsKKyNlbmRpZgorCQljYi5jX2lmbGFnICY9IH4oSU5MQ1IgfCBJQ1JOTCk7CisJCWNiLmNfbGZsYWcgJj0gfihJU0lHIHwgSUNBTk9OIHwgRUNITyk7CisjaWYgZGVmaW5lZChWTE5FWFQpICYmIGRlZmluZWQoX1BPU0lYX1ZESVNBQkxFKQorCQkvKiBvc2YvMSBwcm9jZXNzZXMgbG5leHQgd2hlbiB+aWNhbm9uICovCisJCWNiLmNfY2NbVkxORVhUXSA9IF9QT1NJWF9WRElTQUJMRTsKKyNlbmRpZgorCQkvKiBzdW5vcyA0LjEueCAmIG9zZi8xIHByb2Nlc3NlcyBkaXNjYXJkKGZsdXNoKSB3aGVuIH5pY2Fub24gKi8KKyNpZiBkZWZpbmVkKFZESVNDQVJEKSAmJiBkZWZpbmVkKF9QT1NJWF9WRElTQUJMRSkKKwkJY2IuY19jY1tWRElTQ0FSRF0gPSBfUE9TSVhfVkRJU0FCTEU7CisjZW5kaWYKKwkJY2IuY19jY1tWVElNRV0gPSAwOworCQljYi5jX2NjW1ZNSU5dID0gMTsKKworCQl0Y3NldGF0dHIodHR5X2ZkLCBUQ1NBRFJBSU4sICZjYik7CisKKyNpZmRlZiBfUE9TSVhfVkRJU0FCTEUKKwkJLyogQ29udmVydCB1bnNldCB2YWx1ZXMgdG8gaW50ZXJuYWwgJ3Vuc2V0JyB2YWx1ZSAqLworCQlpZiAoZWRjaGFycy5lcmFzZSA9PSBfUE9TSVhfVkRJU0FCTEUpCisJCQllZGNoYXJzLmVyYXNlID0gLTE7CisJCWlmIChlZGNoYXJzLmtpbGwgPT0gX1BPU0lYX1ZESVNBQkxFKQorCQkJZWRjaGFycy5raWxsID0gLTE7CisJCWlmIChlZGNoYXJzLmludHIgPT0gX1BPU0lYX1ZESVNBQkxFKQorCQkJZWRjaGFycy5pbnRyID0gLTE7CisJCWlmIChlZGNoYXJzLnF1aXQgPT0gX1BPU0lYX1ZESVNBQkxFKQorCQkJZWRjaGFycy5xdWl0ID0gLTE7CisJCWlmIChlZGNoYXJzLmVvZiA9PSBfUE9TSVhfVkRJU0FCTEUpCisJCQllZGNoYXJzLmVvZiA9IC0xOworCQlpZiAoZWRjaGFycy53ZXJhc2UgPT0gX1BPU0lYX1ZESVNBQkxFKQorCQkJZWRjaGFycy53ZXJhc2UgPSAtMTsKKyNlbmRpZgorCisJCWlmIChlZGNoYXJzLmVyYXNlID49IDApIHsKKwkJCWJpbmRfaWZfbm90X2JvdW5kKDAsIGVkY2hhcnMuZXJhc2UsIFhGVU5DX2RlbF9iYWNrKTsKKwkJCWJpbmRfaWZfbm90X2JvdW5kKDEsIGVkY2hhcnMuZXJhc2UsIFhGVU5DX2RlbF9id29yZCk7CisJCX0KKwkJaWYgKGVkY2hhcnMua2lsbCA+PSAwKQorCQkJYmluZF9pZl9ub3RfYm91bmQoMCwgZWRjaGFycy5raWxsLCBYRlVOQ19kZWxfbGluZSk7CisJCWlmIChlZGNoYXJzLndlcmFzZSA+PSAwKQorCQkJYmluZF9pZl9ub3RfYm91bmQoMCwgZWRjaGFycy53ZXJhc2UsIFhGVU5DX2RlbF9id29yZCk7CisJCWlmIChlZGNoYXJzLmludHIgPj0gMCkKKwkJCWJpbmRfaWZfbm90X2JvdW5kKDAsIGVkY2hhcnMuaW50ciwgWEZVTkNfYWJvcnQpOworCQlpZiAoZWRjaGFycy5xdWl0ID49IDApCisJCQliaW5kX2lmX25vdF9ib3VuZCgwLCBlZGNoYXJzLnF1aXQsIFhGVU5DX25vb3ApOworCX0gZWxzZQorCQl0Y3NldGF0dHIodHR5X2ZkLCBUQ1NBRFJBSU4sICZ0dHlfc3RhdGUpOworCisJcmV0dXJuIChwcmV2KTsKK30KKworI2lmICFNS1NIX1NfTk9WSQorLyogKysrIHZpIGVkaXRpbmcgbW9kZSArKysgKi8KKworI2RlZmluZSBDdHJsKGMpCQkoYyYweDFmKQorCitzdHJ1Y3QgZWRzdGF0ZSB7CisJY2hhciAqY2J1ZjsKKwlpbnQgd2lubGVmdDsKKwlpbnQgY2J1ZnNpemU7CisJaW50IGxpbmVsZW47CisJaW50IGN1cnNvcjsKK307CisKK3N0YXRpYyBpbnQgdmlfaG9vayhpbnQpOworc3RhdGljIGludCBuZXh0c3RhdGUoaW50KTsKK3N0YXRpYyBpbnQgdmlfaW5zZXJ0KGludCk7CitzdGF0aWMgaW50IHZpX2NtZChpbnQsIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IGRvbW92ZShpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgcmVkb19pbnNlcnQoaW50KTsKK3N0YXRpYyB2b2lkIHlhbmtfcmFuZ2UoaW50LCBpbnQpOworc3RhdGljIGludCBicmFja3R5cGUoaW50KTsKK3N0YXRpYyB2b2lkIHNhdmVfY2J1Zih2b2lkKTsKK3N0YXRpYyB2b2lkIHJlc3RvcmVfY2J1Zih2b2lkKTsKK3N0YXRpYyBpbnQgcHV0YnVmKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOworc3RhdGljIHZvaWQgZGVsX3JhbmdlKGludCwgaW50KTsKK3N0YXRpYyBpbnQgZmluZGNoKGludCwgaW50LCBpbnQsIGludCk7CitzdGF0aWMgaW50IGZvcnd3b3JkKGludCk7CitzdGF0aWMgaW50IGJhY2t3b3JkKGludCk7CitzdGF0aWMgaW50IGVuZHdvcmQoaW50KTsKK3N0YXRpYyBpbnQgRm9yd3dvcmQoaW50KTsKK3N0YXRpYyBpbnQgQmFja3dvcmQoaW50KTsKK3N0YXRpYyBpbnQgRW5kd29yZChpbnQpOworc3RhdGljIGludCBncmFiaGlzdChpbnQsIGludCk7CitzdGF0aWMgaW50IGdyYWJzZWFyY2goaW50LCBpbnQsIGludCwgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHJlZHJhd19saW5lKGludCk7CitzdGF0aWMgdm9pZCByZWZyZXNoKGludCk7CitzdGF0aWMgaW50IG91dG9md2luKHZvaWQpOworc3RhdGljIHZvaWQgcmV3aW5kb3codm9pZCk7CitzdGF0aWMgaW50IG5ld2NvbChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBkaXNwbGF5KGNoYXIgKiwgY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgZWRfbW92X29wdChpbnQsIGNoYXIgKik7CitzdGF0aWMgaW50IGV4cGFuZF93b3JkKGludCk7CitzdGF0aWMgaW50IGNvbXBsZXRlX3dvcmQoaW50LCBpbnQpOworc3RhdGljIGludCBwcmludF9leHBhbnNpb25zKHN0cnVjdCBlZHN0YXRlICosIGludCk7CisjZGVmaW5lIGNoYXJfbGVuKGMpCSgoYykgPCAnICcgfHwgKGMpID09IDB4N0YgPyAyIDogMSkKK3N0YXRpYyB2b2lkIHhfdmlfem90YyhpbnQpOworc3RhdGljIHZvaWQgdmlfZXJyb3Iodm9pZCk7CitzdGF0aWMgdm9pZCB2aV9tYWNyb19yZXNldCh2b2lkKTsKK3N0YXRpYyBpbnQgeF92aV9wdXRidWYoY29uc3QgY2hhciAqLCBzaXplX3QpOworCisjZGVmaW5lIENfCTB4MQkJLyogYSB2YWxpZCBjb21tYW5kIHRoYXQgaXNuJ3QgYSBNXywgRV8sIFVfICovCisjZGVmaW5lIE1fCTB4MgkJLyogbW92ZW1lbnQgY29tbWFuZCAoaCwgbCwgZXRjLikgKi8KKyNkZWZpbmUgRV8JMHg0CQkvKiBleHRlbmRlZCBjb21tYW5kIChjLCBkLCB5KSAqLworI2RlZmluZSBYXwkweDgJCS8qIGxvbmcgY29tbWFuZCAoQCwgZiwgRiwgdCwgVCwgZXRjLikgKi8KKyNkZWZpbmUgVV8JMHgxMAkJLyogYW4gVU4tdW5kb2FibGUgY29tbWFuZCAodGhhdCBpc24ndCBhIE1fKSAqLworI2RlZmluZSBCXwkweDIwCQkvKiBiYWQgY29tbWFuZCAoXkApICovCisjZGVmaW5lIFpfCTB4NDAJCS8qIHJlcGVhdCBjb3VudCBkZWZhdWx0cyB0byAwIChub3QgMSkgKi8KKyNkZWZpbmUgU18JMHg4MAkJLyogc2VhcmNoICgvLCA/KSAqLworCisjZGVmaW5lIGlzX2JhZChjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJkJfKQorI2RlZmluZSBpc19jbWQoYykJKGNsYXNzaWZ5WyhjKSYweDdmXSYoTV98RV98Q198VV8pKQorI2RlZmluZSBpc19tb3ZlKGMpCShjbGFzc2lmeVsoYykmMHg3Zl0mTV8pCisjZGVmaW5lIGlzX2V4dGVuZChjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJkVfKQorI2RlZmluZSBpc19sb25nKGMpCShjbGFzc2lmeVsoYykmMHg3Zl0mWF8pCisjZGVmaW5lIGlzX3VuZG9hYmxlKGMpCSghKGNsYXNzaWZ5WyhjKSYweDdmXSZVXykpCisjZGVmaW5lIGlzX3NyY2goYykJKGNsYXNzaWZ5WyhjKSYweDdmXSZTXykKKyNkZWZpbmUgaXNfemVyb2NvdW50KGMpCShjbGFzc2lmeVsoYykmMHg3Zl0mWl8pCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNsYXNzaWZ5WzEyOF0gPSB7CisvKgkgMAkxCTIJMwk0CTUJNgk3CSovCisvKiAwCV5ACV5BCV5CCV5DCV5ECV5FCV5GCV5HCSovCisJQl8sCTAsCTAsCTAsCTAsCUNffFVfLAlDX3xaXywJMCwKKy8qIDEJXkgJXkkJXkoJXksJXkwJXk0JXk4JXk8JKi8KKwlNXywJQ198Wl8sCTAsCTAsCUNffFVfLAkwLAlDXywJMCwKKy8qIDIJXlAJXlEJXlIJXlMJXlQJXlUJXlYJXlcJKi8KKwlDXywJMCwJQ198VV8sCTAsCTAsCTAsCUNfLAkwLAorLyogMwleWAleWQleWgleWwleXAleXQleXgleXwkqLworCUNfLAkwLAkwLAlDX3xaXywJMCwJMCwJMCwJMCwKKy8qIDQJPHNwYWNlPgkhCSIJIwkkCSUJJgknCSovCisJTV8sCTAsCTAsCUNfLAlNXywJTV8sCTAsCTAsCisvKiA1CSgJKQkqCSsJLAktCS4JLwkqLworCTAsCTAsCUNfLAlDXywJTV8sCUNfLAkwLAlDX3xTXywKKy8qIDYJMAkxCTIJMwk0CTUJNgk3CSovCisJTV8sCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisvKiA3CTgJOQk6CTsJPAk9CT4JPwkqLworCTAsCTAsCTAsCU1fLAkwLAlDXywJMCwJQ198U18sCisvKiA4CUAJQQlCCUMJRAlFCUYJRwkqLworCUNffFhfLAlDXywJTV8sCUNfLAlDXywJTV8sCU1ffFhfLAlDX3xVX3xaXywKKy8qIDkJSAlJCUoJSwlMCU0JTglPCSovCisJMCwJQ18sCTAsCTAsCTAsCTAsCUNffFVfLAkwLAorLyogQQlQCVEJUglTCVQJVQlWCVcJKi8KKwlDXywJMCwJQ18sCUNfLAlNX3xYXywJQ18sCTAsCU1fLAorLyogQglYCVkJWglbCVwJXQleCV8JKi8KKwlDXywJQ198VV8sCTAsCTAsCUNffFpfLAkwLAlNXywJQ198Wl8sCisvKiBDCWAJYQliCWMJZAllCWYJZwkqLworCTAsCUNfLAlNXywJRV8sCUVfLAlNXywJTV98WF8sCUNffFpfLAorLyogRAloCWkJaglrCWwJbQluCW8JKi8KKwlNXywJQ18sCUNffFVfLAlDX3xVXywJTV8sCTAsCUNffFVfLAkwLAorLyogRQlwCXEJcglzCXQJdQl2CXcJKi8KKwlDXywJMCwJWF8sCUNfLAlNX3xYXywJQ198VV8sCUNffFVffFpfLCBNXywKKy8qIEYJeAl5CXoJewl8CX0JfglePwkqLworCUNfLAlFX3xVXywJMCwJMCwJTV98Wl8sCTAsCUNfLAkwCit9OworCisjZGVmaW5lIE1BWFZJQ01ECTMKKyNkZWZpbmUgU1JDSExFTgkJNDAKKworI2RlZmluZSBJTlNFUlQJCTEKKyNkZWZpbmUgUkVQTEFDRQkJMgorCisjZGVmaW5lIFZOT1JNQUwJCTAJCS8qIGNvbW1hbmQsIGluc2VydCBvciByZXBsYWNlIG1vZGUgKi8KKyNkZWZpbmUgVkFSRzEJCTEJCS8qIGRpZ2l0IHByZWZpeCAoZmlyc3QsIGVnLCA1bCkgKi8KKyNkZWZpbmUgVkVYVENNRAkJMgkJLyogY21kICsgbW92ZW1lbnQgKGVnLCBjbCkgKi8KKyNkZWZpbmUgVkFSRzIJCTMJCS8qIGRpZ2l0IHByZWZpeCAoc2Vjb25kLCBlZywgMmMzbCkgKi8KKyNkZWZpbmUgVlhDSAkJNAkJLyogZiwgRiwgdCwgVCwgQCAqLworI2RlZmluZSBWRkFJTAkJNQkJLyogYmFkIGNvbW1hbmQgKi8KKyNkZWZpbmUgVkNNRAkJNgkJLyogc2luZ2xlIGNoYXIgY29tbWFuZCAoZWcsIFgpICovCisjZGVmaW5lIFZSRURPCQk3CQkvKiAuICovCisjZGVmaW5lIFZMSVQJCTgJCS8qIF5WICovCisjZGVmaW5lIFZTRUFSQ0gJCTkJCS8qIC8sID8gKi8KKyNkZWZpbmUgVlZFUlNJT04JMTAJCS8qIDxFU0M+IF5WICovCisKK3N0YXRpYyBjaGFyCQl1bmRvY2J1ZltMSU5FXTsKKworc3RhdGljIHN0cnVjdCBlZHN0YXRlCSpzYXZlX2Vkc3RhdGUoc3RydWN0IGVkc3RhdGUgKm9sZCk7CitzdGF0aWMgdm9pZAkJcmVzdG9yZV9lZHN0YXRlKHN0cnVjdCBlZHN0YXRlICpvbGQsIHN0cnVjdCBlZHN0YXRlICpuZXdzKTsKK3N0YXRpYyB2b2lkCQlmcmVlX2Vkc3RhdGUoc3RydWN0IGVkc3RhdGUgKm9sZCk7CisKK3N0YXRpYyBzdHJ1Y3QgZWRzdGF0ZQllYnVmOworc3RhdGljIHN0cnVjdCBlZHN0YXRlCXVuZG9idWYgPSB7IHVuZG9jYnVmLCAwLCBMSU5FLCAwLCAwIH07CisKK3N0YXRpYyBzdHJ1Y3QgZWRzdGF0ZQkqZXM7CQkJLyogY3VycmVudCBlZGl0b3Igc3RhdGUgKi8KK3N0YXRpYyBzdHJ1Y3QgZWRzdGF0ZQkqdW5kbzsKKworc3RhdGljIGNoYXIgaWJ1ZltMSU5FXTsJCQkvKiBpbnB1dCBidWZmZXIgKi8KK3N0YXRpYyBpbnQgZmlyc3RfaW5zZXJ0OwkJLyogc2V0IHdoZW4gc3RhcnRpbmcgaW4gaW5zZXJ0IG1vZGUgKi8KK3N0YXRpYyBpbnQgc2F2ZWRfaW5zbGVuOwkJLyogc2F2ZWQgaW5zbGVuIGZvciBmaXJzdCBpbnNlcnQgKi8KK3N0YXRpYyBpbnQgaW5zbGVuOwkJCS8qIGxlbmd0aCBvZiBpbnB1dCBidWZmZXIgKi8KK3N0YXRpYyBpbnQgc3JjaGxlbjsJCQkvKiBsZW5ndGggb2YgY3VycmVudCBzZWFyY2ggcGF0dGVybiAqLworc3RhdGljIGNoYXIgeWJ1ZltMSU5FXTsJCQkvKiB5YW5rIGJ1ZmZlciAqLworc3RhdGljIGludCB5YW5rbGVuOwkJCS8qIGxlbmd0aCBvZiB5YW5rIGJ1ZmZlciAqLworc3RhdGljIGludCBmc2F2ZWNtZCA9ICcgJzsJCS8qIGxhc3QgZmluZCBjb21tYW5kICovCitzdGF0aWMgaW50IGZzYXZlY2g7CQkJLyogY2hhcmFjdGVyIHRvIGZpbmQgKi8KK3N0YXRpYyBjaGFyIGxhc3RjbWRbTUFYVklDTURdOwkJLyogbGFzdCBub24tbW92ZSBjb21tYW5kICovCitzdGF0aWMgaW50IGxhc3RhYzsJCQkvKiBhcmdjbnQgZm9yIGxhc3RjbWQgKi8KK3N0YXRpYyBpbnQgbGFzdHNlYXJjaCA9ICcgJzsJCS8qIGxhc3Qgc2VhcmNoIGNvbW1hbmQgKi8KK3N0YXRpYyBjaGFyIHNyY2hwYXRbU1JDSExFTl07CQkvKiBsYXN0IHNlYXJjaCBwYXR0ZXJuICovCitzdGF0aWMgaW50IGluc2VydDsJCQkvKiBub24temVybyBpbiBpbnNlcnQgbW9kZSAqLworc3RhdGljIGludCBobnVtOwkJCS8qIHBvc2l0aW9uIGluIGhpc3RvcnkgKi8KK3N0YXRpYyBpbnQgb2hudW07CQkJLyogaGlzdG9yeSBsaW5lIGNvcGllZCAoYWZ0ZXIgbW9kKSAqLworc3RhdGljIGludCBobGFzdDsJCQkvKiAxIHBhc3QgbGFzdCBwb3NpdGlvbiBpbiBoaXN0b3J5ICovCitzdGF0aWMgaW50IHN0YXRlOworCisvKiBJbmZvcm1hdGlvbiBmb3Iga2VlcGluZyB0cmFjayBvZiBtYWNyb3MgdGhhdCBhcmUgYmVpbmcgZXhwYW5kZWQuCisgKiBUaGUgZm9ybWF0IG9mIGJ1ZiBpcyB0aGUgYWxpYXMgY29udGVudHMgZm9sbG93ZWQgYnkgYSBOVUwgYnl0ZSBmb2xsb3dlZAorICogYnkgdGhlIG5hbWUgKGxldHRlcikgb2YgdGhlIGFsaWFzLiBUaGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgbWFya2VkIGJ5CisgKiBhIGRvdWJsZSBOVUwuIFRoZSBuYW1lIG9mIHRoZSBhbGlhcyBpcyBzdG9yZWQgc28gcmVjdXJzaXZlIG1hY3JvcyBjYW4KKyAqIGJlIGRldGVjdGVkLgorICovCitzdHJ1Y3QgbWFjcm9fc3RhdGUgeworCXVuc2lnbmVkIGNoYXIgKnA7CS8qIGN1cnJlbnQgcG9zaXRpb24gaW4gYnVmICovCisJdW5zaWduZWQgY2hhciAqYnVmOwkvKiBwb2ludGVyIHRvIG1hY3JvKHMpIGJlaW5nIGV4cGFuZGVkICovCisJaW50IGxlbjsJCS8qIGhvdyBtdWNoIGRhdGEgaW4gYnVmZmVyICovCit9Oworc3RhdGljIHN0cnVjdCBtYWNyb19zdGF0ZSBtYWNybzsKKworZW51bSBleHBhbmRfbW9kZSB7CisJTk9ORSwgRVhQQU5ELCBDT01QTEVURSwgUFJJTlQKK307CitzdGF0aWMgZW51bSBleHBhbmRfbW9kZSBleHBhbmRlZCA9IE5PTkU7CS8qIGxhc3QgaW5wdXQgd2FzIGV4cGFuZGVkICovCisKK3N0YXRpYyBpbnQKK3hfdmkoY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWludCBjOworCisJc3RhdGUgPSBWTk9STUFMOworCW9obnVtID0gaG51bSA9IGhsYXN0ID0gaGlzdG51bSgtMSkgKyAxOworCWluc2VydCA9IElOU0VSVDsKKwlzYXZlZF9pbnNsZW4gPSBpbnNsZW47CisJZmlyc3RfaW5zZXJ0ID0gMTsKKwlpbnNsZW4gPSAwOworCXZpX21hY3JvX3Jlc2V0KCk7CisKKwllcyA9ICZlYnVmOworCWVzLT5jYnVmID0gYnVmOworCXVuZG8gPSAmdW5kb2J1ZjsKKwl1bmRvLT5jYnVmc2l6ZSA9IGVzLT5jYnVmc2l6ZSA9IGxlbiA+IExJTkUgPyBMSU5FIDogbGVuOworCisJZXMtPmxpbmVsZW4gPSB1bmRvLT5saW5lbGVuID0gMDsKKwllcy0+Y3Vyc29yID0gdW5kby0+Y3Vyc29yID0gMDsKKwllcy0+d2lubGVmdCA9IHVuZG8tPndpbmxlZnQgPSAwOworCisJY3VyX2NvbCA9IHByb21wdGxlbihwcm9tcHQpOworCXByb21wdF90cnVuYyA9IChjdXJfY29sIC8geF9jb2xzKSAqIHhfY29sczsKKwljdXJfY29sIC09IHByb21wdF90cnVuYzsKKworCXBwcm9tcHQocHJvbXB0LCAwKTsKKwlpZiAoY3VyX2NvbCA+IHhfY29scyAtIDMgLSBNSU5fRURJVF9TUEFDRSkgeworCQlwcm9tcHRfcmVkcmF3ID0gY3VyX2NvbCA9IDA7CisJCXhfcHV0YygnXG4nKTsKKwl9IGVsc2UKKwkJcHJvbXB0X3JlZHJhdyA9IDE7CisJcHdpZHRoID0gY3VyX2NvbDsKKworCWlmICghd2J1Zl9sZW4gfHwgd2J1Zl9sZW4gIT0geF9jb2xzIC0gMykgeworCQl3YnVmX2xlbiA9IHhfY29scyAtIDM7CisJCXdidWZbMF0gPSBhcmVzaXplKHdidWZbMF0sIHdidWZfbGVuLCBBUEVSTSk7CisJCXdidWZbMV0gPSBhcmVzaXplKHdidWZbMV0sIHdidWZfbGVuLCBBUEVSTSk7CisJfQorCSh2b2lkKW1lbXNldCh3YnVmWzBdLCAnICcsIHdidWZfbGVuKTsKKwkodm9pZCltZW1zZXQod2J1ZlsxXSwgJyAnLCB3YnVmX2xlbik7CisJd2lud2lkdGggPSB4X2NvbHMgLSBwd2lkdGggLSAzOworCXdpbiA9IDA7CisJbW9yZWMgPSAnICc7CisJbGFzdHJlZiA9IDE7CisJaG9sZGxlbiA9IDA7CisKKwllZGl0bW9kZSA9IDI7CisJeF9mbHVzaCgpOworCXdoaWxlICgxKSB7CisJCWlmIChtYWNyby5wKSB7CisJCQljID0gKm1hY3JvLnArKzsKKwkJCS8qIGVuZCBvZiBjdXJyZW50IG1hY3JvPyAqLworCQkJaWYgKCFjKSB7CisJCQkJLyogbW9yZSBtYWNyb3MgbGVmdCB0byBmaW5pc2g/ICovCisJCQkJaWYgKCptYWNyby5wKyspCisJCQkJCWNvbnRpbnVlOworCQkJCS8qIG11c3QgYmUgdGhlIGVuZCBvZiBhbGwgdGhlIG1hY3JvcyAqLworCQkJCXZpX21hY3JvX3Jlc2V0KCk7CisJCQkJYyA9IHhfZ2V0YygpOworCQkJfQorCQl9IGVsc2UKKwkJCWMgPSB4X2dldGMoKTsKKworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCQlpZiAoc3RhdGUgIT0gVkxJVCkgeworCQkJaWYgKGMgPT0gZWRjaGFycy5pbnRyIHx8IGMgPT0gZWRjaGFycy5xdWl0KSB7CisJCQkJLyogcHJldGVuZCB3ZSBnb3QgYW4gaW50ZXJydXB0ICovCisJCQkJeF92aV96b3RjKGMpOworCQkJCXhfZmx1c2goKTsKKwkJCQl0cmFwc2lnKGMgPT0gZWRjaGFycy5pbnRyID8gU0lHSU5UIDogU0lHUVVJVCk7CisJCQkJeF9tb2RlKGZhbHNlKTsKKwkJCQl1bndpbmQoTFNIRUxMKTsKKwkJCX0gZWxzZSBpZiAoYyA9PSBlZGNoYXJzLmVvZiAmJiBzdGF0ZSAhPSBWVkVSU0lPTikgeworCQkJCWlmIChlcy0+bGluZWxlbiA9PSAwKSB7CisJCQkJCXhfdmlfem90YyhlZGNoYXJzLmVvZik7CisJCQkJCWMgPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmICh2aV9ob29rKGMpKQorCQkJYnJlYWs7CisJCXhfZmx1c2goKTsKKwl9CisKKwl4X3B1dGMoJ1xyJyk7CisJeF9wdXRjKCdcbicpOworCXhfZmx1c2goKTsKKworCWlmIChjID09IC0xIHx8IChzc2l6ZV90KWxlbiA8PSBlcy0+bGluZWxlbikKKwkJcmV0dXJuICgtMSk7CisKKwlpZiAoZXMtPmNidWYgIT0gYnVmKQorCQltZW1tb3ZlKGJ1ZiwgZXMtPmNidWYsIGVzLT5saW5lbGVuKTsKKworCWJ1Zltlcy0+bGluZWxlbisrXSA9ICdcbic7CisKKwlyZXR1cm4gKGVzLT5saW5lbGVuKTsKK30KKworc3RhdGljIGludAordmlfaG9vayhpbnQgY2gpCit7CisJc3RhdGljIGNoYXIgY3VyY21kW01BWFZJQ01EXSwgbG9jcGF0W1NSQ0hMRU5dOworCXN0YXRpYyBpbnQgY21kbGVuLCBhcmdjMSwgYXJnYzI7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisKKwljYXNlIFZOT1JNQUw6CisJCWlmIChpbnNlcnQgIT0gMCkgeworCQkJaWYgKGNoID09IEN0cmwoJ3YnKSkgeworCQkJCXN0YXRlID0gVkxJVDsKKwkJCQljaCA9ICdeJzsKKwkJCX0KKwkJCXN3aXRjaCAodmlfaW5zZXJ0KGNoKSkgeworCQkJY2FzZSAtMToKKwkJCQl2aV9lcnJvcigpOworCQkJCXN0YXRlID0gVk5PUk1BTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCQlpZiAoc3RhdGUgPT0gVkxJVCkgeworCQkJCQllcy0+Y3Vyc29yLS07CisJCQkJCXJlZnJlc2goMCk7CisJCQkJfSBlbHNlCisJCQkJCXJlZnJlc2goaW5zZXJ0ICE9IDApOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXJldHVybiAoMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKQorCQkJCXJldHVybiAoMSk7CisJCQljbWRsZW4gPSAwOworCQkJYXJnYzEgPSAwOworCQkJaWYgKGNoID49ICcxJyAmJiBjaCA8PSAnOScpIHsKKwkJCQlhcmdjMSA9IGNoIC0gJzAnOworCQkJCXN0YXRlID0gVkFSRzE7CisJCQl9IGVsc2UgeworCQkJCWN1cmNtZFtjbWRsZW4rK10gPSBjaDsKKwkJCQlzdGF0ZSA9IG5leHRzdGF0ZShjaCk7CisJCQkJaWYgKHN0YXRlID09IFZTRUFSQ0gpIHsKKwkJCQkJc2F2ZV9jYnVmKCk7CisJCQkJCWVzLT5jdXJzb3IgPSAwOworCQkJCQllcy0+bGluZWxlbiA9IDA7CisJCQkJCWlmIChjaCA9PSAnLycpIHsKKwkJCQkJCWlmIChwdXRidWYoIi8iLCAxLCAwKSAhPSAwKQorCQkJCQkJCXJldHVybiAoLTEpOworCQkJCQl9IGVsc2UgaWYgKHB1dGJ1ZigiPyIsIDEsIDApICE9IDApCisJCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQkJcmVmcmVzaCgwKTsKKwkJCQl9CisJCQkJaWYgKHN0YXRlID09IFZWRVJTSU9OKSB7CisJCQkJCXNhdmVfY2J1ZigpOworCQkJCQllcy0+Y3Vyc29yID0gMDsKKwkJCQkJZXMtPmxpbmVsZW4gPSAwOworCQkJCQlwdXRidWYoS1NIX1ZFUlNJT04sCisJCQkJCSAgICBzdHJsZW4oS1NIX1ZFUlNJT04pLCAwKTsKKwkJCQkJcmVmcmVzaCgwKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFZMSVQ6CisJCWlmIChpc19iYWQoY2gpKSB7CisJCQlkZWxfcmFuZ2UoZXMtPmN1cnNvciwgZXMtPmN1cnNvciArIDEpOworCQkJdmlfZXJyb3IoKTsKKwkJfSBlbHNlCisJCQllcy0+Y2J1Zltlcy0+Y3Vyc29yKytdID0gY2g7CisJCXJlZnJlc2goMSk7CisJCXN0YXRlID0gVk5PUk1BTDsKKwkJYnJlYWs7CisKKwljYXNlIFZWRVJTSU9OOgorCQlyZXN0b3JlX2NidWYoKTsKKwkJc3RhdGUgPSBWTk9STUFMOworCQlyZWZyZXNoKDApOworCQlicmVhazsKKworCWNhc2UgVkFSRzE6CisJCWlmIChrc2hfaXNkaWdpdChjaCkpCisJCQlhcmdjMSA9IGFyZ2MxICogMTAgKyBjaCAtICcwJzsKKwkJZWxzZSB7CisJCQljdXJjbWRbY21kbGVuKytdID0gY2g7CisJCQlzdGF0ZSA9IG5leHRzdGF0ZShjaCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFZFWFRDTUQ6CisJCWFyZ2MyID0gMDsKKwkJaWYgKGNoID49ICcxJyAmJiBjaCA8PSAnOScpIHsKKwkJCWFyZ2MyID0gY2ggLSAnMCc7CisJCQlzdGF0ZSA9IFZBUkcyOworCQkJcmV0dXJuICgwKTsKKwkJfSBlbHNlIHsKKwkJCWN1cmNtZFtjbWRsZW4rK10gPSBjaDsKKwkJCWlmIChjaCA9PSBjdXJjbWRbMF0pCisJCQkJc3RhdGUgPSBWQ01EOworCQkJZWxzZSBpZiAoaXNfbW92ZShjaCkpCisJCQkJc3RhdGUgPSBuZXh0c3RhdGUoY2gpOworCQkJZWxzZQorCQkJCXN0YXRlID0gVkZBSUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFZBUkcyOgorCQlpZiAoa3NoX2lzZGlnaXQoY2gpKQorCQkJYXJnYzIgPSBhcmdjMiAqIDEwICsgY2ggLSAnMCc7CisJCWVsc2UgeworCQkJaWYgKGFyZ2MxID09IDApCisJCQkJYXJnYzEgPSBhcmdjMjsKKwkJCWVsc2UKKwkJCQlhcmdjMSAqPSBhcmdjMjsKKwkJCWN1cmNtZFtjbWRsZW4rK10gPSBjaDsKKwkJCWlmIChjaCA9PSBjdXJjbWRbMF0pCisJCQkJc3RhdGUgPSBWQ01EOworCQkJZWxzZSBpZiAoaXNfbW92ZShjaCkpCisJCQkJc3RhdGUgPSBuZXh0c3RhdGUoY2gpOworCQkJZWxzZQorCQkJCXN0YXRlID0gVkZBSUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFZYQ0g6CisJCWlmIChjaCA9PSBDdHJsKCdbJykpCisJCQlzdGF0ZSA9IFZOT1JNQUw7CisJCWVsc2UgeworCQkJY3VyY21kW2NtZGxlbisrXSA9IGNoOworCQkJc3RhdGUgPSBWQ01EOworCQl9CisJCWJyZWFrOworCisJY2FzZSBWU0VBUkNIOgorCQlpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nIC8qfHwgY2ggPT0gQ3RybCgnWycpKi8gKSB7CisJCQlyZXN0b3JlX2NidWYoKTsKKwkJCS8qIFJlcGVhdCBsYXN0IHNlYXJjaD8gKi8KKwkJCWlmIChzcmNobGVuID09IDApIHsKKwkJCQlpZiAoIXNyY2hwYXRbMF0pIHsKKwkJCQkJdmlfZXJyb3IoKTsKKwkJCQkJc3RhdGUgPSBWTk9STUFMOworCQkJCQlyZWZyZXNoKDApOworCQkJCQlyZXR1cm4gKDApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbG9jcGF0W3NyY2hsZW5dID0gJ1wwJzsKKwkJCQltZW1jcHkoc3JjaHBhdCwgbG9jcGF0LCBzcmNobGVuICsgMSk7CisJCQl9CisJCQlzdGF0ZSA9IFZDTUQ7CisJCX0gZWxzZSBpZiAoY2ggPT0gZWRjaGFycy5lcmFzZSB8fCBjaCA9PSBDdHJsKCdoJykpIHsKKwkJCWlmIChzcmNobGVuICE9IDApIHsKKwkJCQlzcmNobGVuLS07CisJCQkJZXMtPmxpbmVsZW4gLT0gY2hhcl9sZW4oKHVuc2lnbmVkIGNoYXIpbG9jcGF0W3NyY2hsZW5dKTsKKwkJCQllcy0+Y3Vyc29yID0gZXMtPmxpbmVsZW47CisJCQkJcmVmcmVzaCgwKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJcmVzdG9yZV9jYnVmKCk7CisJCQlzdGF0ZSA9IFZOT1JNQUw7CisJCQlyZWZyZXNoKDApOworCQl9IGVsc2UgaWYgKGNoID09IGVkY2hhcnMua2lsbCkgeworCQkJc3JjaGxlbiA9IDA7CisJCQllcy0+bGluZWxlbiA9IDE7CisJCQllcy0+Y3Vyc29yID0gMTsKKwkJCXJlZnJlc2goMCk7CisJCQlyZXR1cm4gKDApOworCQl9IGVsc2UgaWYgKGNoID09IGVkY2hhcnMud2VyYXNlKSB7CisJCQlpbnQgaSwgbiA9IHNyY2hsZW47CisJCQlzdHJ1Y3QgZWRzdGF0ZSBuZXdfZXMsICpzYXZlX2VzOworCisJCQluZXdfZXMuY3Vyc29yID0gbjsKKwkJCW5ld19lcy5jYnVmID0gbG9jcGF0OworCisJCQlzYXZlX2VzID0gZXM7CisJCQllcyA9ICZuZXdfZXM7CisJCQluID0gYmFja3dvcmQoMSk7CisJCQllcyA9IHNhdmVfZXM7CisKKwkJCWZvciAoaSA9IHNyY2hsZW47IC0taSA+PSBuOyApCisJCQkJZXMtPmxpbmVsZW4gLT0gY2hhcl9sZW4oKHVuc2lnbmVkIGNoYXIpbG9jcGF0W2ldKTsKKwkJCXNyY2hsZW4gPSBuOworCQkJZXMtPmN1cnNvciA9IGVzLT5saW5lbGVuOworCQkJcmVmcmVzaCgwKTsKKwkJCXJldHVybiAoMCk7CisJCX0gZWxzZSB7CisJCQlpZiAoc3JjaGxlbiA9PSBTUkNITEVOIC0gMSkKKwkJCQl2aV9lcnJvcigpOworCQkJZWxzZSB7CisJCQkJbG9jcGF0W3NyY2hsZW4rK10gPSBjaDsKKwkJCQlpZiAoY2ggPCAnICcgfHwgY2ggPT0gMHg3ZikgeworCQkJCQlpZiAoZXMtPmxpbmVsZW4gKyAyID4gZXMtPmNidWZzaXplKQorCQkJCQkJdmlfZXJyb3IoKTsKKwkJCQkJZXMtPmNidWZbZXMtPmxpbmVsZW4rK10gPSAnXic7CisJCQkJCWVzLT5jYnVmW2VzLT5saW5lbGVuKytdID0gY2ggXiAnQCc7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGVzLT5saW5lbGVuID49IGVzLT5jYnVmc2l6ZSkKKwkJCQkJCXZpX2Vycm9yKCk7CisJCQkJCWVzLT5jYnVmW2VzLT5saW5lbGVuKytdID0gY2g7CisJCQkJfQorCQkJCWVzLT5jdXJzb3IgPSBlcy0+bGluZWxlbjsKKwkJCQlyZWZyZXNoKDApOworCQkJfQorCQkJcmV0dXJuICgwKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBWQ01EOgorCQlzdGF0ZSA9IFZOT1JNQUw7CisJCXN3aXRjaCAodmlfY21kKGFyZ2MxLCBjdXJjbWQpKSB7CisJCWNhc2UgLTE6CisJCQl2aV9lcnJvcigpOworCQkJcmVmcmVzaCgwKTsKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQlpZiAoaW5zZXJ0ICE9IDApCisJCQkJaW5zbGVuID0gMDsKKwkJCXJlZnJlc2goaW5zZXJ0ICE9IDApOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXJlZnJlc2goMCk7CisJCQlyZXR1cm4gKDEpOworCQljYXNlIDI6CisJCQkvKiBiYWNrIGZyb20gYSAndicgY29tbWFuZCAtIGRvbid0IHJlZHJhdyB0aGUgc2NyZWVuICovCisJCQlyZXR1cm4gKDEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBWUkVETzoKKwkJc3RhdGUgPSBWTk9STUFMOworCQlpZiAoYXJnYzEgIT0gMCkKKwkJCWxhc3RhYyA9IGFyZ2MxOworCQlzd2l0Y2ggKHZpX2NtZChsYXN0YWMsIGxhc3RjbWQpKSB7CisJCWNhc2UgLTE6CisJCQl2aV9lcnJvcigpOworCQkJcmVmcmVzaCgwKTsKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQlpZiAoaW5zZXJ0ICE9IDApIHsKKwkJCQlpZiAobGFzdGNtZFswXSA9PSAncycgfHwgbGFzdGNtZFswXSA9PSAnYycgfHwKKwkJCQkgICAgbGFzdGNtZFswXSA9PSAnQycpIHsKKwkJCQkJaWYgKHJlZG9faW5zZXJ0KDEpICE9IDApCisJCQkJCQl2aV9lcnJvcigpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChyZWRvX2luc2VydChsYXN0YWMpICE9IDApCisJCQkJCQl2aV9lcnJvcigpOworCQkJCX0KKwkJCX0KKwkJCXJlZnJlc2goMCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcmVmcmVzaCgwKTsKKwkJCXJldHVybiAoMSk7CisJCWNhc2UgMjoKKwkJCS8qIGJhY2sgZnJvbSBhICd2JyBjb21tYW5kIC0gY2FuJ3QgaGFwcGVuICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVkZBSUw6CisJCXN0YXRlID0gVk5PUk1BTDsKKwkJdmlfZXJyb3IoKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK25leHRzdGF0ZShpbnQgY2gpCit7CisJaWYgKGlzX2V4dGVuZChjaCkpCisJCXJldHVybiAoVkVYVENNRCk7CisJZWxzZSBpZiAoaXNfc3JjaChjaCkpCisJCXJldHVybiAoVlNFQVJDSCk7CisJZWxzZSBpZiAoaXNfbG9uZyhjaCkpCisJCXJldHVybiAoVlhDSCk7CisJZWxzZSBpZiAoY2ggPT0gJy4nKQorCQlyZXR1cm4gKFZSRURPKTsKKwllbHNlIGlmIChjaCA9PSBDdHJsKCd2JykpCisJCXJldHVybiAoVlZFUlNJT04pOworCWVsc2UgaWYgKGlzX2NtZChjaCkpCisJCXJldHVybiAoVkNNRCk7CisJZWxzZQorCQlyZXR1cm4gKFZGQUlMKTsKK30KKworc3RhdGljIGludAordmlfaW5zZXJ0KGludCBjaCkKK3sKKwlpbnQgdGN1cnNvcjsKKworCWlmIChjaCA9PSBlZGNoYXJzLmVyYXNlIHx8IGNoID09IEN0cmwoJ2gnKSkgeworCQlpZiAoaW5zZXJ0ID09IFJFUExBQ0UpIHsKKwkJCWlmIChlcy0+Y3Vyc29yID09IHVuZG8tPmN1cnNvcikgeworCQkJCXZpX2Vycm9yKCk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWlmIChpbnNsZW4gPiAwKQorCQkJCWluc2xlbi0tOworCQkJZXMtPmN1cnNvci0tOworCQkJaWYgKGVzLT5jdXJzb3IgPj0gdW5kby0+bGluZWxlbikKKwkJCQllcy0+bGluZWxlbi0tOworCQkJZWxzZQorCQkJCWVzLT5jYnVmW2VzLT5jdXJzb3JdID0gdW5kby0+Y2J1Zltlcy0+Y3Vyc29yXTsKKwkJfSBlbHNlIHsKKwkJCWlmIChlcy0+Y3Vyc29yID09IDApCisJCQkJcmV0dXJuICgwKTsKKwkJCWlmIChpbnNsZW4gPiAwKQorCQkJCWluc2xlbi0tOworCQkJZXMtPmN1cnNvci0tOworCQkJZXMtPmxpbmVsZW4tLTsKKwkJCW1lbW1vdmUoJmVzLT5jYnVmW2VzLT5jdXJzb3JdLCAmZXMtPmNidWZbZXMtPmN1cnNvciArIDFdLAorCQkJICAgIGVzLT5saW5lbGVuIC0gZXMtPmN1cnNvciArIDEpOworCQl9CisJCWV4cGFuZGVkID0gTk9ORTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKGNoID09IGVkY2hhcnMua2lsbCkgeworCQlpZiAoZXMtPmN1cnNvciAhPSAwKSB7CisJCQlpbnNsZW4gPSAwOworCQkJbWVtbW92ZShlcy0+Y2J1ZiwgJmVzLT5jYnVmW2VzLT5jdXJzb3JdLAorCQkJICAgIGVzLT5saW5lbGVuIC0gZXMtPmN1cnNvcik7CisJCQllcy0+bGluZWxlbiAtPSBlcy0+Y3Vyc29yOworCQkJZXMtPmN1cnNvciA9IDA7CisJCX0KKwkJZXhwYW5kZWQgPSBOT05FOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoY2ggPT0gZWRjaGFycy53ZXJhc2UpIHsKKwkJaWYgKGVzLT5jdXJzb3IgIT0gMCkgeworCQkJdGN1cnNvciA9IGJhY2t3b3JkKDEpOworCQkJbWVtbW92ZSgmZXMtPmNidWZbdGN1cnNvcl0sICZlcy0+Y2J1Zltlcy0+Y3Vyc29yXSwKKwkJCSAgICBlcy0+bGluZWxlbiAtIGVzLT5jdXJzb3IpOworCQkJZXMtPmxpbmVsZW4gLT0gZXMtPmN1cnNvciAtIHRjdXJzb3I7CisJCQlpZiAoaW5zbGVuIDwgZXMtPmN1cnNvciAtIHRjdXJzb3IpCisJCQkJaW5zbGVuID0gMDsKKwkJCWVsc2UKKwkJCQlpbnNsZW4gLT0gZXMtPmN1cnNvciAtIHRjdXJzb3I7CisJCQllcy0+Y3Vyc29yID0gdGN1cnNvcjsKKwkJfQorCQlleHBhbmRlZCA9IE5PTkU7CisJCXJldHVybiAoMCk7CisJfQorCS8qIElmIGFueSBjaGFycyBhcmUgZW50ZXJlZCBiZWZvcmUgZXNjYXBlLCB0cmFzaCB0aGUgc2F2ZWQgaW5zZXJ0CisJICogYnVmZmVyIChpZiB1c2VyIGluc2VydHMgJiBkZWxldGVzIGNoYXIsIGlidWYgZ2V0cyB0cmFzaGVkIGFuZAorCSAqIHdlIGRvbid0IHdhbnQgdG8gdXNlIGl0KQorCSAqLworCWlmIChmaXJzdF9pbnNlcnQgJiYgY2ggIT0gQ3RybCgnWycpKQorCQlzYXZlZF9pbnNsZW4gPSAwOworCXN3aXRjaCAoY2gpIHsKKwljYXNlICdcMCc6CisJCXJldHVybiAoLTEpOworCisJY2FzZSAnXHInOgorCWNhc2UgJ1xuJzoKKwkJcmV0dXJuICgxKTsKKworCWNhc2UgQ3RybCgnWycpOgorCQlleHBhbmRlZCA9IE5PTkU7CisJCWlmIChmaXJzdF9pbnNlcnQpIHsKKwkJCWZpcnN0X2luc2VydCA9IDA7CisJCQlpZiAoaW5zbGVuID09IDApIHsKKwkJCQlpbnNsZW4gPSBzYXZlZF9pbnNsZW47CisJCQkJcmV0dXJuIChyZWRvX2luc2VydCgwKSk7CisJCQl9CisJCQlsYXN0Y21kWzBdID0gJ2EnOworCQkJbGFzdGFjID0gMTsKKwkJfQorCQlpZiAobGFzdGNtZFswXSA9PSAncycgfHwgbGFzdGNtZFswXSA9PSAnYycgfHwKKwkJICAgIGxhc3RjbWRbMF0gPT0gJ0MnKQorCQkJcmV0dXJuIChyZWRvX2luc2VydCgwKSk7CisJCWVsc2UKKwkJCXJldHVybiAocmVkb19pbnNlcnQobGFzdGFjIC0gMSkpOworCisJLyogeyBCZWdpbiBub25zdGFuZGFyZCB2aSBjb21tYW5kcyAqLworCWNhc2UgQ3RybCgneCcpOgorCQlleHBhbmRfd29yZCgwKTsKKwkJYnJlYWs7CisKKwljYXNlIEN0cmwoJ2YnKToKKwkJY29tcGxldGVfd29yZCgwLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIEN0cmwoJ2UnKToKKwkJcHJpbnRfZXhwYW5zaW9ucyhlcywgMCk7CisJCWJyZWFrOworCisJY2FzZSBDdHJsKCdpJyk6CisJCWlmIChGbGFnKEZWSVRBQkNPTVBMRVRFKSkgeworCQkJY29tcGxldGVfd29yZCgwLCAwKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEZBTExUSFJPVUdIICovCisJLyogRW5kIG5vbnN0YW5kYXJkIHZpIGNvbW1hbmRzIH0gKi8KKworCWRlZmF1bHQ6CisJCWlmIChlcy0+bGluZWxlbiA+PSBlcy0+Y2J1ZnNpemUgLSAxKQorCQkJcmV0dXJuICgtMSk7CisJCWlidWZbaW5zbGVuKytdID0gY2g7CisJCWlmIChpbnNlcnQgPT0gSU5TRVJUKSB7CisJCQltZW1tb3ZlKCZlcy0+Y2J1Zltlcy0+Y3Vyc29yICsgMV0sICZlcy0+Y2J1Zltlcy0+Y3Vyc29yXSwKKwkJCSAgICBlcy0+bGluZWxlbiAtIGVzLT5jdXJzb3IpOworCQkJZXMtPmxpbmVsZW4rKzsKKwkJfQorCQllcy0+Y2J1Zltlcy0+Y3Vyc29yKytdID0gY2g7CisJCWlmIChpbnNlcnQgPT0gUkVQTEFDRSAmJiBlcy0+Y3Vyc29yID4gZXMtPmxpbmVsZW4pCisJCQllcy0+bGluZWxlbisrOworCQlleHBhbmRlZCA9IE5PTkU7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3ZpX2NtZChpbnQgYXJnY250LCBjb25zdCBjaGFyICpjbWQpCit7CisJaW50IG5jdXJzb3I7CisJaW50IGN1ciwgYzEsIGMyLCBjMyA9IDA7CisJaW50IGFueTsKKwlzdHJ1Y3QgZWRzdGF0ZSAqdDsKKworCWlmIChhcmdjbnQgPT0gMCAmJiAhaXNfemVyb2NvdW50KCpjbWQpKQorCQlhcmdjbnQgPSAxOworCisJaWYgKGlzX21vdmUoKmNtZCkpIHsKKwkJaWYgKChjdXIgPSBkb21vdmUoYXJnY250LCBjbWQsIDApKSA+PSAwKSB7CisJCQlpZiAoY3VyID09IGVzLT5saW5lbGVuICYmIGN1ciAhPSAwKQorCQkJCWN1ci0tOworCQkJZXMtPmN1cnNvciA9IGN1cjsKKwkJfSBlbHNlCisJCQlyZXR1cm4gKC0xKTsKKwl9IGVsc2UgeworCQkvKiBEb24ndCBzYXZlIHN0YXRlIGluIG1pZGRsZSBvZiBtYWNyby4uICovCisJCWlmIChpc191bmRvYWJsZSgqY21kKSAmJiAhbWFjcm8ucCkgeworCQkJdW5kby0+d2lubGVmdCA9IGVzLT53aW5sZWZ0OworCQkJbWVtbW92ZSh1bmRvLT5jYnVmLCBlcy0+Y2J1ZiwgZXMtPmxpbmVsZW4pOworCQkJdW5kby0+bGluZWxlbiA9IGVzLT5saW5lbGVuOworCQkJdW5kby0+Y3Vyc29yID0gZXMtPmN1cnNvcjsKKwkJCWxhc3RhYyA9IGFyZ2NudDsKKwkJCW1lbW1vdmUobGFzdGNtZCwgY21kLCBNQVhWSUNNRCk7CisJCX0KKwkJc3dpdGNoICgqY21kKSB7CisKKwkJY2FzZSBDdHJsKCdsJyk6CisJCWNhc2UgQ3RybCgncicpOgorCQkJcmVkcmF3X2xpbmUoMSk7CisJCQlicmVhazsKKworCQljYXNlICdAJzoKKwkJCXsKKwkJCQlzdGF0aWMgY2hhciBhbGlhc1tdID0gIl9cMCI7CisJCQkJc3RydWN0IHRibCAqYXA7CisJCQkJaW50IG9sZW4sIG5sZW47CisJCQkJY2hhciAqcCwgKm5idWY7CisKKwkJCQkvKiBsb29rdXAgbGV0dGVyIGluIGFsaWFzIGxpc3QuLi4gKi8KKwkJCQlhbGlhc1sxXSA9IGNtZFsxXTsKKwkJCQlhcCA9IGt0c2VhcmNoKCZhbGlhc2VzLCBhbGlhcywgaGFzaChhbGlhcykpOworCQkJCWlmICghY21kWzFdIHx8ICFhcCB8fCAhKGFwLT5mbGFnICYgSVNTRVQpKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQkvKiBjaGVjayBpZiB0aGlzIGlzIGEgcmVjdXJzaXZlIGNhbGwuLi4gKi8KKwkJCQlpZiAoKHAgPSAoY2hhciAqKW1hY3JvLnApKQorCQkJCQl3aGlsZSAoKHAgPSBzdHJudWwocCkpICYmIHBbMV0pCisJCQkJCQlpZiAoKisrcCA9PSBjbWRbMV0pCisJCQkJCQkJcmV0dXJuICgtMSk7CisJCQkJLyogaW5zZXJ0IGFsaWFzIGludG8gbWFjcm8gYnVmZmVyICovCisJCQkJbmxlbiA9IHN0cmxlbihhcC0+dmFsLnMpICsgMTsKKwkJCQlvbGVuID0gIW1hY3JvLnAgPyAyIDoKKwkJCQkgICAgbWFjcm8ubGVuIC0gKG1hY3JvLnAgLSBtYWNyby5idWYpOworCQkJCW5idWYgPSBhbGxvYyhubGVuICsgMSArIG9sZW4sIEFQRVJNKTsKKwkJCQltZW1jcHkobmJ1ZiwgYXAtPnZhbC5zLCBubGVuKTsKKwkJCQluYnVmW25sZW4rK10gPSBjbWRbMV07CisJCQkJaWYgKG1hY3JvLnApIHsKKwkJCQkJbWVtY3B5KG5idWYgKyBubGVuLCBtYWNyby5wLCBvbGVuKTsKKwkJCQkJYWZyZWUobWFjcm8uYnVmLCBBUEVSTSk7CisJCQkJCW5sZW4gKz0gb2xlbjsKKwkJCQl9IGVsc2UgeworCQkJCQluYnVmW25sZW4rK10gPSAnXDAnOworCQkJCQluYnVmW25sZW4rK10gPSAnXDAnOworCQkJCX0KKwkJCQltYWNyby5wID0gbWFjcm8uYnVmID0gKHVuc2lnbmVkIGNoYXIgKiluYnVmOworCQkJCW1hY3JvLmxlbiA9IG5sZW47CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdhJzoKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWlmIChlcy0+bGluZWxlbiAhPSAwKQorCQkJCWVzLT5jdXJzb3IrKzsKKwkJCWluc2VydCA9IElOU0VSVDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0EnOgorCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJZGVsX3JhbmdlKDAsIDApOworCQkJZXMtPmN1cnNvciA9IGVzLT5saW5lbGVuOworCQkJaW5zZXJ0ID0gSU5TRVJUOworCQkJYnJlYWs7CisKKwkJY2FzZSAnUyc6CisJCQllcy0+Y3Vyc29yID0gZG9tb3ZlKDEsICJeIiwgMSk7CisJCQlkZWxfcmFuZ2UoZXMtPmN1cnNvciwgZXMtPmxpbmVsZW4pOworCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJaW5zZXJ0ID0gSU5TRVJUOworCQkJYnJlYWs7CisKKwkJY2FzZSAnWSc6CisJCQljbWQgPSAieSQiOworCQkJLyogYWhoaGhoaC4uLiAqLworCQljYXNlICdjJzoKKwkJY2FzZSAnZCc6CisJCWNhc2UgJ3knOgorCQkJaWYgKCpjbWQgPT0gY21kWzFdKSB7CisJCQkJYzEgPSAqY21kID09ICdjJyA/IGRvbW92ZSgxLCAiXiIsIDEpIDogMDsKKwkJCQljMiA9IGVzLT5saW5lbGVuOworCQkJfSBlbHNlIGlmICghaXNfbW92ZShjbWRbMV0pKQorCQkJCXJldHVybiAoLTEpOworCQkJZWxzZSB7CisJCQkJaWYgKChuY3Vyc29yID0gZG9tb3ZlKGFyZ2NudCwgJmNtZFsxXSwgMSkpIDwgMCkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJaWYgKCpjbWQgPT0gJ2MnICYmCisJCQkJICAgIChjbWRbMV0gPT0gJ3cnIHx8IGNtZFsxXSA9PSAnVycpICYmCisJCQkJICAgICFrc2hfaXNzcGFjZShlcy0+Y2J1Zltlcy0+Y3Vyc29yXSkpIHsKKwkJCQkJZG8geworCQkJCQkJLS1uY3Vyc29yOworCQkJCQl9IHdoaWxlIChrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpOworCQkJCQluY3Vyc29yKys7CisJCQkJfQorCQkJCWlmIChuY3Vyc29yID4gZXMtPmN1cnNvcikgeworCQkJCQljMSA9IGVzLT5jdXJzb3I7CisJCQkJCWMyID0gbmN1cnNvcjsKKwkJCQl9IGVsc2UgeworCQkJCQljMSA9IG5jdXJzb3I7CisJCQkJCWMyID0gZXMtPmN1cnNvcjsKKwkJCQkJaWYgKGNtZFsxXSA9PSAnJScpCisJCQkJCQljMisrOworCQkJCX0KKwkJCX0KKwkJCWlmICgqY21kICE9ICdjJyAmJiBjMSAhPSBjMikKKwkJCQl5YW5rX3JhbmdlKGMxLCBjMik7CisJCQlpZiAoKmNtZCAhPSAneScpIHsKKwkJCQlkZWxfcmFuZ2UoYzEsIGMyKTsKKwkJCQllcy0+Y3Vyc29yID0gYzE7CisJCQl9CisJCQlpZiAoKmNtZCA9PSAnYycpIHsKKwkJCQltb2RpZmllZCA9IDE7CisJCQkJaG51bSA9IGhsYXN0OworCQkJCWluc2VydCA9IElOU0VSVDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ3AnOgorCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJaWYgKGVzLT5saW5lbGVuICE9IDApCisJCQkJZXMtPmN1cnNvcisrOworCQkJd2hpbGUgKHB1dGJ1Zih5YnVmLCB5YW5rbGVuLCAwKSA9PSAwICYmIC0tYXJnY250ID4gMCkKKwkJCQk7CisJCQlpZiAoZXMtPmN1cnNvciAhPSAwKQorCQkJCWVzLT5jdXJzb3ItLTsKKwkJCWlmIChhcmdjbnQgIT0gMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1AnOgorCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJYW55ID0gMDsKKwkJCXdoaWxlIChwdXRidWYoeWJ1ZiwgeWFua2xlbiwgMCkgPT0gMCAmJiAtLWFyZ2NudCA+IDApCisJCQkJYW55ID0gMTsKKwkJCWlmIChhbnkgJiYgZXMtPmN1cnNvciAhPSAwKQorCQkJCWVzLT5jdXJzb3ItLTsKKwkJCWlmIChhcmdjbnQgIT0gMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0MnOgorCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5saW5lbGVuKTsKKwkJCWluc2VydCA9IElOU0VSVDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0QnOgorCQkJeWFua19yYW5nZShlcy0+Y3Vyc29yLCBlcy0+bGluZWxlbik7CisJCQlkZWxfcmFuZ2UoZXMtPmN1cnNvciwgZXMtPmxpbmVsZW4pOworCQkJaWYgKGVzLT5jdXJzb3IgIT0gMCkKKwkJCQllcy0+Y3Vyc29yLS07CisJCQlicmVhazsKKworCQljYXNlICdnJzoKKwkJCWlmICghYXJnY250KQorCQkJCWFyZ2NudCA9IGhsYXN0OworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSAnRyc6CisJCQlpZiAoIWFyZ2NudCkKKwkJCQlhcmdjbnQgPSAxOworCQkJZWxzZQorCQkJCWFyZ2NudCA9IGhsYXN0IC0gKHNvdXJjZS0+bGluZSAtIGFyZ2NudCk7CisJCQlpZiAoZ3JhYmhpc3QobW9kaWZpZWQsIGFyZ2NudCAtIDEpIDwgMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWVsc2UgeworCQkJCW1vZGlmaWVkID0gMDsKKwkJCQlobnVtID0gYXJnY250IC0gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ2knOgorCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJaW5zZXJ0ID0gSU5TRVJUOworCQkJYnJlYWs7CisKKwkJY2FzZSAnSSc6CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQllcy0+Y3Vyc29yID0gZG9tb3ZlKDEsICJeIiwgMSk7CisJCQlpbnNlcnQgPSBJTlNFUlQ7CisJCQlicmVhazsKKworCQljYXNlICdqJzoKKwkJY2FzZSAnKyc6CisJCWNhc2UgQ3RybCgnbicpOgorCQkJaWYgKGdyYWJoaXN0KG1vZGlmaWVkLCBobnVtICsgYXJnY250KSA8IDApCisJCQkJcmV0dXJuICgtMSk7CisJCQllbHNlIHsKKwkJCQltb2RpZmllZCA9IDA7CisJCQkJaG51bSArPSBhcmdjbnQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdrJzoKKwkJY2FzZSAnLSc6CisJCWNhc2UgQ3RybCgncCcpOgorCQkJaWYgKGdyYWJoaXN0KG1vZGlmaWVkLCBobnVtIC0gYXJnY250KSA8IDApCisJCQkJcmV0dXJuICgtMSk7CisJCQllbHNlIHsKKwkJCQltb2RpZmllZCA9IDA7CisJCQkJaG51bSAtPSBhcmdjbnQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdyJzoKKwkJCWlmIChlcy0+bGluZWxlbiA9PSAwKQorCQkJCXJldHVybiAoLTEpOworCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJaWYgKGNtZFsxXSA9PSAwKQorCQkJCXZpX2Vycm9yKCk7CisJCQllbHNlIHsKKwkJCQlpbnQgbjsKKworCQkJCWlmIChlcy0+Y3Vyc29yICsgYXJnY250ID4gZXMtPmxpbmVsZW4pCisJCQkJCXJldHVybiAoLTEpOworCQkJCWZvciAobiA9IDA7IG4gPCBhcmdjbnQ7ICsrbikKKwkJCQkJZXMtPmNidWZbZXMtPmN1cnNvciArIG5dID0gY21kWzFdOworCQkJCWVzLT5jdXJzb3IgKz0gbiAtIDE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdSJzoKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWluc2VydCA9IFJFUExBQ0U7CisJCQlicmVhazsKKworCQljYXNlICdzJzoKKwkJCWlmIChlcy0+bGluZWxlbiA9PSAwKQorCQkJCXJldHVybiAoLTEpOworCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJaWYgKGVzLT5jdXJzb3IgKyBhcmdjbnQgPiBlcy0+bGluZWxlbikKKwkJCQlhcmdjbnQgPSBlcy0+bGluZWxlbiAtIGVzLT5jdXJzb3I7CisJCQlkZWxfcmFuZ2UoZXMtPmN1cnNvciwgZXMtPmN1cnNvciArIGFyZ2NudCk7CisJCQlpbnNlcnQgPSBJTlNFUlQ7CisJCQlicmVhazsKKworCQljYXNlICd2JzoKKwkJCWlmICghYXJnY250KSB7CisJCQkJaWYgKGVzLT5saW5lbGVuID09IDApCisJCQkJCXJldHVybiAoLTEpOworCQkJCWlmIChtb2RpZmllZCkgeworCQkJCQllcy0+Y2J1Zltlcy0+bGluZWxlbl0gPSAnXDAnOworCQkJCQloaXN0c2F2ZSgmc291cmNlLT5saW5lLCBlcy0+Y2J1ZiwgdHJ1ZSwKKwkJCQkJICAgIHRydWUpOworCQkJCX0gZWxzZQorCQkJCQlhcmdjbnQgPSBzb3VyY2UtPmxpbmUgKyAxIC0KKwkJCQkJICAgIChobGFzdCAtIGhudW0pOworCQkJfQorCQkJaWYgKGFyZ2NudCkKKwkJCQlzaGZfc25wcmludGYoZXMtPmNidWYsIGVzLT5jYnVmc2l6ZSwgIiVzICVkIiwKKwkJCQkgICAgImZjIC1lICR7VklTVUFMOi0ke0VESVRPUjotdml9fSAtLSIsCisJCQkJICAgIGFyZ2NudCk7CisJCQllbHNlCisJCQkJc3RybGNweShlcy0+Y2J1ZiwKKwkJCQkgICAgImZjIC1lICR7VklTVUFMOi0ke0VESVRPUjotdml9fSAtLSIsCisJCQkJICAgIGVzLT5jYnVmc2l6ZSk7CisJCQllcy0+bGluZWxlbiA9IHN0cmxlbihlcy0+Y2J1Zik7CisJCQlyZXR1cm4gKDIpOworCisJCWNhc2UgJ3gnOgorCQkJaWYgKGVzLT5saW5lbGVuID09IDApCisJCQkJcmV0dXJuICgtMSk7CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQlpZiAoZXMtPmN1cnNvciArIGFyZ2NudCA+IGVzLT5saW5lbGVuKQorCQkJCWFyZ2NudCA9IGVzLT5saW5lbGVuIC0gZXMtPmN1cnNvcjsKKwkJCXlhbmtfcmFuZ2UoZXMtPmN1cnNvciwgZXMtPmN1cnNvciArIGFyZ2NudCk7CisJCQlkZWxfcmFuZ2UoZXMtPmN1cnNvciwgZXMtPmN1cnNvciArIGFyZ2NudCk7CisJCQlicmVhazsKKworCQljYXNlICdYJzoKKwkJCWlmIChlcy0+Y3Vyc29yID4gMCkgeworCQkJCW1vZGlmaWVkID0gMTsKKwkJCQlobnVtID0gaGxhc3Q7CisJCQkJaWYgKGVzLT5jdXJzb3IgPCBhcmdjbnQpCisJCQkJCWFyZ2NudCA9IGVzLT5jdXJzb3I7CisJCQkJeWFua19yYW5nZShlcy0+Y3Vyc29yIC0gYXJnY250LCBlcy0+Y3Vyc29yKTsKKwkJCQlkZWxfcmFuZ2UoZXMtPmN1cnNvciAtIGFyZ2NudCwgZXMtPmN1cnNvcik7CisJCQkJZXMtPmN1cnNvciAtPSBhcmdjbnQ7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3UnOgorCQkJdCA9IGVzOworCQkJZXMgPSB1bmRvOworCQkJdW5kbyA9IHQ7CisJCQlicmVhazsKKworCQljYXNlICdVJzoKKwkJCWlmICghbW9kaWZpZWQpCisJCQkJcmV0dXJuICgtMSk7CisJCQlpZiAoZ3JhYmhpc3QobW9kaWZpZWQsIG9obnVtKSA8IDApCisJCQkJcmV0dXJuICgtMSk7CisJCQltb2RpZmllZCA9IDA7CisJCQlobnVtID0gb2hudW07CisJCQlicmVhazsKKworCQljYXNlICc/JzoKKwkJCWlmIChobnVtID09IGhsYXN0KQorCQkJCWhudW0gPSAtMTsKKwkJCS8qIGFoaGggKi8KKwkJY2FzZSAnLyc6CisJCQljMyA9IDE7CisJCQlzcmNobGVuID0gMDsKKwkJCWxhc3RzZWFyY2ggPSAqY21kOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSAnbic6CisJCWNhc2UgJ04nOgorCQkJaWYgKGxhc3RzZWFyY2ggPT0gJyAnKQorCQkJCXJldHVybiAoLTEpOworCQkJaWYgKGxhc3RzZWFyY2ggPT0gJz8nKQorCQkJCWMxID0gMTsKKwkJCWVsc2UKKwkJCQljMSA9IDA7CisJCQlpZiAoKmNtZCA9PSAnTicpCisJCQkJYzEgPSAhYzE7CisJCQlpZiAoKGMyID0gZ3JhYnNlYXJjaChtb2RpZmllZCwgaG51bSwKKwkJCSAgICBjMSwgc3JjaHBhdCkpIDwgMCkgeworCQkJCWlmIChjMykgeworCQkJCQlyZXN0b3JlX2NidWYoKTsKKwkJCQkJcmVmcmVzaCgwKTsKKwkJCQl9CisJCQkJcmV0dXJuICgtMSk7CisJCQl9IGVsc2UgeworCQkJCW1vZGlmaWVkID0gMDsKKwkJCQlobnVtID0gYzI7CisJCQkJb2hudW0gPSBobnVtOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ18nOgorCQkJeworCQkJCWludCBpbnNwYWNlOworCQkJCWNoYXIgKnAsICpzcDsKKworCQkJCWlmIChoaXN0bnVtKC0xKSA8IDApCisJCQkJCXJldHVybiAoLTEpOworCQkJCXAgPSAqaGlzdHBvcygpOworI2RlZmluZSBpc3NwKGMpCQkoa3NoX2lzc3BhY2UoYykgfHwgKGMpID09ICdcbicpCisJCQkJaWYgKGFyZ2NudCkgeworCQkJCQl3aGlsZSAoKnAgJiYgaXNzcCgqcCkpCisJCQkJCQlwKys7CisJCQkJCXdoaWxlICgqcCAmJiAtLWFyZ2NudCkgeworCQkJCQkJd2hpbGUgKCpwICYmICFpc3NwKCpwKSkKKwkJCQkJCQlwKys7CisJCQkJCQl3aGlsZSAoKnAgJiYgaXNzcCgqcCkpCisJCQkJCQkJcCsrOworCQkJCQl9CisJCQkJCWlmICghKnApCisJCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQkJc3AgPSBwOworCQkJCX0gZWxzZSB7CisJCQkJCXNwID0gcDsKKwkJCQkJaW5zcGFjZSA9IDA7CisJCQkJCXdoaWxlICgqcCkgeworCQkJCQkJaWYgKGlzc3AoKnApKQorCQkJCQkJCWluc3BhY2UgPSAxOworCQkJCQkJZWxzZSBpZiAoaW5zcGFjZSkgeworCQkJCQkJCWluc3BhY2UgPSAwOworCQkJCQkJCXNwID0gcDsKKwkJCQkJCX0KKwkJCQkJCXArKzsKKwkJCQkJfQorCQkJCQlwID0gc3A7CisJCQkJfQorCQkJCW1vZGlmaWVkID0gMTsKKwkJCQlobnVtID0gaGxhc3Q7CisJCQkJaWYgKGVzLT5jdXJzb3IgIT0gZXMtPmxpbmVsZW4pCisJCQkJCWVzLT5jdXJzb3IrKzsKKwkJCQl3aGlsZSAoKnAgJiYgIWlzc3AoKnApKSB7CisJCQkJCWFyZ2NudCsrOworCQkJCQlwKys7CisJCQkJfQorCQkJCWlmIChwdXRidWYoIiAiLCAxLCAwKSAhPSAwKQorCQkJCQlhcmdjbnQgPSAtMTsKKwkJCQllbHNlIGlmIChwdXRidWYoc3AsIGFyZ2NudCwgMCkgIT0gMCkKKwkJCQkJYXJnY250ID0gLTE7CisJCQkJaWYgKGFyZ2NudCA8IDApIHsKKwkJCQkJaWYgKGVzLT5jdXJzb3IgIT0gMCkKKwkJCQkJCWVzLT5jdXJzb3ItLTsKKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJfQorCQkJCWluc2VydCA9IElOU0VSVDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ34nOgorCQkJeworCQkJCWNoYXIgKnA7CisJCQkJaW50IGk7CisKKwkJCQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJZm9yIChpID0gMDsgaSA8IGFyZ2NudDsgaSsrKSB7CisJCQkJCXAgPSAmZXMtPmNidWZbZXMtPmN1cnNvcl07CisJCQkJCWlmIChrc2hfaXNsb3dlcigqcCkpIHsKKwkJCQkJCW1vZGlmaWVkID0gMTsKKwkJCQkJCWhudW0gPSBobGFzdDsKKwkJCQkJCSpwID0ga3NoX3RvdXBwZXIoKnApOworCQkJCQl9IGVsc2UgaWYgKGtzaF9pc3VwcGVyKCpwKSkgeworCQkJCQkJbW9kaWZpZWQgPSAxOworCQkJCQkJaG51bSA9IGhsYXN0OworCQkJCQkJKnAgPSBrc2hfdG9sb3dlcigqcCk7CisJCQkJCX0KKwkJCQkJaWYgKGVzLT5jdXJzb3IgPCBlcy0+bGluZWxlbiAtIDEpCisJCQkJCQllcy0+Y3Vyc29yKys7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgJyMnOgorCQkJeworCQkJCWludCByZXQgPSB4X2RvX2NvbW1lbnQoZXMtPmNidWYsIGVzLT5jYnVmc2l6ZSwKKwkJCQkgICAgJmVzLT5saW5lbGVuKTsKKwkJCQlpZiAocmV0ID49IDApCisJCQkJCWVzLT5jdXJzb3IgPSAwOworCQkJCXJldHVybiAocmV0KTsKKwkJCX0KKworCQljYXNlICc9JzoJCQkvKiBBVCZUIGtzaCAqLworCQljYXNlIEN0cmwoJ2UnKToJCQkvKiBOb25zdGFuZGFyZCB2aS9rc2ggKi8KKwkJCXByaW50X2V4cGFuc2lvbnMoZXMsIDEpOworCQkJYnJlYWs7CisKKworCQljYXNlIEN0cmwoJ2knKToJCQkvKiBOb25zdGFuZGFyZCB2aS9rc2ggKi8KKwkJCWlmICghRmxhZyhGVklUQUJDT01QTEVURSkpCisJCQkJcmV0dXJuICgtMSk7CisJCQljb21wbGV0ZV93b3JkKDEsIGFyZ2NudCk7CisJCQlicmVhazsKKworCQljYXNlIEN0cmwoJ1snKToJCQkvKiBzb21lIGFubm95aW5nIEFUJlQga3NocyAqLworCQkJaWYgKCFGbGFnKEZWSUVTQ0NPTVBMRVRFKSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJY2FzZSAnXFwnOgkJCS8qIEFUJlQga3NoICovCisJCWNhc2UgQ3RybCgnZicpOgkJCS8qIE5vbnN0YW5kYXJkIHZpL2tzaCAqLworCQkJY29tcGxldGVfd29yZCgxLCBhcmdjbnQpOworCQkJYnJlYWs7CisKKworCQljYXNlICcqJzoJCQkvKiBBVCZUIGtzaCAqLworCQljYXNlIEN0cmwoJ3gnKToJCQkvKiBOb25zdGFuZGFyZCB2aS9rc2ggKi8KKwkJCWV4cGFuZF93b3JkKDEpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGluc2VydCA9PSAwICYmIGVzLT5jdXJzb3IgIT0gMCAmJiBlcy0+Y3Vyc29yID49IGVzLT5saW5lbGVuKQorCQkJZXMtPmN1cnNvci0tOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Citkb21vdmUoaW50IGFyZ2NudCwgY29uc3QgY2hhciAqY21kLCBpbnQgc3ViKQoreworCWludCBiY291bnQsIGkgPSAwLCB0OworCWludCBuY3Vyc29yID0gMDsKKworCXN3aXRjaCAoKmNtZCkgeworCWNhc2UgJ2InOgorCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yID09IDApCisJCQlyZXR1cm4gKC0xKTsKKwkJbmN1cnNvciA9IGJhY2t3b3JkKGFyZ2NudCk7CisJCWJyZWFrOworCisJY2FzZSAnQic6CisJCWlmICghc3ViICYmIGVzLT5jdXJzb3IgPT0gMCkKKwkJCXJldHVybiAoLTEpOworCQluY3Vyc29yID0gQmFja3dvcmQoYXJnY250KTsKKwkJYnJlYWs7CisKKwljYXNlICdlJzoKKwkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciArIDEgPj0gZXMtPmxpbmVsZW4pCisJCQlyZXR1cm4gKC0xKTsKKwkJbmN1cnNvciA9IGVuZHdvcmQoYXJnY250KTsKKwkJaWYgKHN1YiAmJiBuY3Vyc29yIDwgZXMtPmxpbmVsZW4pCisJCQluY3Vyc29yKys7CisJCWJyZWFrOworCisJY2FzZSAnRSc6CisJCWlmICghc3ViICYmIGVzLT5jdXJzb3IgKyAxID49IGVzLT5saW5lbGVuKQorCQkJcmV0dXJuICgtMSk7CisJCW5jdXJzb3IgPSBFbmR3b3JkKGFyZ2NudCk7CisJCWlmIChzdWIgJiYgbmN1cnNvciA8IGVzLT5saW5lbGVuKQorCQkJbmN1cnNvcisrOworCQlicmVhazsKKworCWNhc2UgJ2YnOgorCWNhc2UgJ0YnOgorCWNhc2UgJ3QnOgorCWNhc2UgJ1QnOgorCQlmc2F2ZWNtZCA9ICpjbWQ7CisJCWZzYXZlY2ggPSBjbWRbMV07CisJCS8qIGRyb3AgdGhyb3VnaCAqLworCisJY2FzZSAnLCc6CisJY2FzZSAnOyc6CisJCWlmIChmc2F2ZWNtZCA9PSAnICcpCisJCQlyZXR1cm4gKC0xKTsKKwkJaSA9IGZzYXZlY21kID09ICdmJyB8fCBmc2F2ZWNtZCA9PSAnRic7CisJCXQgPSBmc2F2ZWNtZCA+ICdhJzsKKwkJaWYgKCpjbWQgPT0gJywnKQorCQkJdCA9ICF0OworCQlpZiAoKG5jdXJzb3IgPSBmaW5kY2goZnNhdmVjaCwgYXJnY250LCB0LCBpKSkgPCAwKQorCQkJcmV0dXJuICgtMSk7CisJCWlmIChzdWIgJiYgdCkKKwkJCW5jdXJzb3IrKzsKKwkJYnJlYWs7CisKKwljYXNlICdoJzoKKwljYXNlIEN0cmwoJ2gnKToKKwkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciA9PSAwKQorCQkJcmV0dXJuICgtMSk7CisJCW5jdXJzb3IgPSBlcy0+Y3Vyc29yIC0gYXJnY250OworCQlpZiAobmN1cnNvciA8IDApCisJCQluY3Vyc29yID0gMDsKKwkJYnJlYWs7CisKKwljYXNlICcgJzoKKwljYXNlICdsJzoKKwkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciArIDEgPj0gZXMtPmxpbmVsZW4pCisJCQlyZXR1cm4gKC0xKTsKKwkJaWYgKGVzLT5saW5lbGVuICE9IDApIHsKKwkJCW5jdXJzb3IgPSBlcy0+Y3Vyc29yICsgYXJnY250OworCQkJaWYgKG5jdXJzb3IgPiBlcy0+bGluZWxlbikKKwkJCQluY3Vyc29yID0gZXMtPmxpbmVsZW47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlICd3JzoKKwkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciArIDEgPj0gZXMtPmxpbmVsZW4pCisJCQlyZXR1cm4gKC0xKTsKKwkJbmN1cnNvciA9IGZvcnd3b3JkKGFyZ2NudCk7CisJCWJyZWFrOworCisJY2FzZSAnVyc6CisJCWlmICghc3ViICYmIGVzLT5jdXJzb3IgKyAxID49IGVzLT5saW5lbGVuKQorCQkJcmV0dXJuICgtMSk7CisJCW5jdXJzb3IgPSBGb3J3d29yZChhcmdjbnQpOworCQlicmVhazsKKworCWNhc2UgJzAnOgorCQluY3Vyc29yID0gMDsKKwkJYnJlYWs7CisKKwljYXNlICdeJzoKKwkJbmN1cnNvciA9IDA7CisJCXdoaWxlIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxICYmCisJCSAgICBrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQluY3Vyc29yKys7CisJCWJyZWFrOworCisJY2FzZSAnfCc6CisJCW5jdXJzb3IgPSBhcmdjbnQ7CisJCWlmIChuY3Vyc29yID4gZXMtPmxpbmVsZW4pCisJCQluY3Vyc29yID0gZXMtPmxpbmVsZW47CisJCWlmIChuY3Vyc29yKQorCQkJbmN1cnNvci0tOworCQlicmVhazsKKworCWNhc2UgJyQnOgorCQlpZiAoZXMtPmxpbmVsZW4gIT0gMCkKKwkJCW5jdXJzb3IgPSBlcy0+bGluZWxlbjsKKwkJZWxzZQorCQkJbmN1cnNvciA9IDA7CisJCWJyZWFrOworCisJY2FzZSAnJSc6CisJCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOworCQl3aGlsZSAobmN1cnNvciA8IGVzLT5saW5lbGVuICYmCisJCSAgICAoaSA9IGJyYWNrdHlwZShlcy0+Y2J1ZltuY3Vyc29yXSkpID09IDApCisJCQluY3Vyc29yKys7CisJCWlmIChuY3Vyc29yID09IGVzLT5saW5lbGVuKQorCQkJcmV0dXJuICgtMSk7CisJCWJjb3VudCA9IDE7CisJCWRvIHsKKwkJCWlmIChpID4gMCkgeworCQkJCWlmICgrK25jdXJzb3IgPj0gZXMtPmxpbmVsZW4pCisJCQkJCXJldHVybiAoLTEpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoLS1uY3Vyc29yIDwgMCkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQl0ID0gYnJhY2t0eXBlKGVzLT5jYnVmW25jdXJzb3JdKTsKKwkJCWlmICh0ID09IGkpCisJCQkJYmNvdW50Kys7CisJCQllbHNlIGlmICh0ID09IC1pKQorCQkJCWJjb3VudC0tOworCQl9IHdoaWxlIChiY291bnQgIT0gMCk7CisJCWlmIChzdWIgJiYgaSA+IDApCisJCQluY3Vyc29yKys7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAobmN1cnNvcik7Cit9CisKK3N0YXRpYyBpbnQKK3JlZG9faW5zZXJ0KGludCBjb3VudCkKK3sKKwl3aGlsZSAoY291bnQtLSA+IDApCisJCWlmIChwdXRidWYoaWJ1ZiwgaW5zbGVuLCBpbnNlcnQgPT0gUkVQTEFDRSkgIT0gMCkKKwkJCXJldHVybiAoLTEpOworCWlmIChlcy0+Y3Vyc29yID4gMCkKKwkJZXMtPmN1cnNvci0tOworCWluc2VydCA9IDA7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3lhbmtfcmFuZ2UoaW50IGEsIGludCBiKQoreworCXlhbmtsZW4gPSBiIC0gYTsKKwlpZiAoeWFua2xlbiAhPSAwKQorCQltZW1tb3ZlKHlidWYsICZlcy0+Y2J1ZlthXSwgeWFua2xlbik7Cit9CisKK3N0YXRpYyBpbnQKK2JyYWNrdHlwZShpbnQgY2gpCit7CisJc3dpdGNoIChjaCkgeworCisJY2FzZSAnKCc6CisJCXJldHVybiAoMSk7CisKKwljYXNlICdbJzoKKwkJcmV0dXJuICgyKTsKKworCWNhc2UgJ3snOgorCQlyZXR1cm4gKDMpOworCisJY2FzZSAnKSc6CisJCXJldHVybiAoLTEpOworCisJY2FzZSAnXSc6CisJCXJldHVybiAoLTIpOworCisJY2FzZSAnfSc6CisJCXJldHVybiAoLTMpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuICgwKTsKKwl9Cit9CisKKy8qCisgKglOb24gdXNlciBpbnRlcmZhY2UgZWRpdG9yIHJvdXRpbmVzIGJlbG93IGhlcmUKKyAqLworCitzdGF0aWMgdm9pZAorc2F2ZV9jYnVmKHZvaWQpCit7CisJbWVtbW92ZShob2xkYnVmLCBlcy0+Y2J1ZiwgZXMtPmxpbmVsZW4pOworCWhvbGRsZW4gPSBlcy0+bGluZWxlbjsKKwlob2xkYnVmW2hvbGRsZW5dID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQKK3Jlc3RvcmVfY2J1Zih2b2lkKQoreworCWVzLT5jdXJzb3IgPSAwOworCWVzLT5saW5lbGVuID0gaG9sZGxlbjsKKwltZW1tb3ZlKGVzLT5jYnVmLCBob2xkYnVmLCBob2xkbGVuKTsKK30KKworLyogcmV0dXJuIGEgbmV3IGVkc3RhdGUgKi8KK3N0YXRpYyBzdHJ1Y3QgZWRzdGF0ZSAqCitzYXZlX2Vkc3RhdGUoc3RydWN0IGVkc3RhdGUgKm9sZCkKK3sKKwlzdHJ1Y3QgZWRzdGF0ZSAqbmV3czsKKworCW5ld3MgPSBhbGxvYyhzaXplb2Yoc3RydWN0IGVkc3RhdGUpLCBBUEVSTSk7CisJbmV3cy0+Y2J1ZiA9IGFsbG9jKG9sZC0+Y2J1ZnNpemUsIEFQRVJNKTsKKwltZW1jcHkobmV3cy0+Y2J1Ziwgb2xkLT5jYnVmLCBvbGQtPmxpbmVsZW4pOworCW5ld3MtPmNidWZzaXplID0gb2xkLT5jYnVmc2l6ZTsKKwluZXdzLT5saW5lbGVuID0gb2xkLT5saW5lbGVuOworCW5ld3MtPmN1cnNvciA9IG9sZC0+Y3Vyc29yOworCW5ld3MtPndpbmxlZnQgPSBvbGQtPndpbmxlZnQ7CisJcmV0dXJuIChuZXdzKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc3RvcmVfZWRzdGF0ZShzdHJ1Y3QgZWRzdGF0ZSAqbmV3cywgc3RydWN0IGVkc3RhdGUgKm9sZCkKK3sKKwltZW1jcHkobmV3cy0+Y2J1Ziwgb2xkLT5jYnVmLCBvbGQtPmxpbmVsZW4pOworCW5ld3MtPmxpbmVsZW4gPSBvbGQtPmxpbmVsZW47CisJbmV3cy0+Y3Vyc29yID0gb2xkLT5jdXJzb3I7CisJbmV3cy0+d2lubGVmdCA9IG9sZC0+d2lubGVmdDsKKwlmcmVlX2Vkc3RhdGUob2xkKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfZWRzdGF0ZShzdHJ1Y3QgZWRzdGF0ZSAqb2xkKQoreworCWFmcmVlKG9sZC0+Y2J1ZiwgQVBFUk0pOworCWFmcmVlKG9sZCwgQVBFUk0pOworfQorCisvKgorICogdGhpcyBpcyB1c2VkIGZvciBjYWxsaW5nIHhfZXNjYXBlKCkgaW4gY29tcGxldGVfd29yZCgpCisgKi8KK3N0YXRpYyBpbnQKK3hfdmlfcHV0YnVmKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIChwdXRidWYocywgbGVuLCAwKSk7Cit9CisKK3N0YXRpYyBpbnQKK3B1dGJ1Zihjb25zdCBjaGFyICpidWYsIGludCBsZW4sIGludCByZXBsKQoreworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuICgwKTsKKwlpZiAocmVwbCkgeworCQlpZiAoZXMtPmN1cnNvciArIGxlbiA+PSBlcy0+Y2J1ZnNpemUpCisJCQlyZXR1cm4gKC0xKTsKKwkJaWYgKGVzLT5jdXJzb3IgKyBsZW4gPiBlcy0+bGluZWxlbikKKwkJCWVzLT5saW5lbGVuID0gZXMtPmN1cnNvciArIGxlbjsKKwl9IGVsc2UgeworCQlpZiAoZXMtPmxpbmVsZW4gKyBsZW4gPj0gZXMtPmNidWZzaXplKQorCQkJcmV0dXJuICgtMSk7CisJCW1lbW1vdmUoJmVzLT5jYnVmW2VzLT5jdXJzb3IgKyBsZW5dLCAmZXMtPmNidWZbZXMtPmN1cnNvcl0sCisJCSAgICBlcy0+bGluZWxlbiAtIGVzLT5jdXJzb3IpOworCQllcy0+bGluZWxlbiArPSBsZW47CisJfQorCW1lbW1vdmUoJmVzLT5jYnVmW2VzLT5jdXJzb3JdLCBidWYsIGxlbik7CisJZXMtPmN1cnNvciArPSBsZW47CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK2RlbF9yYW5nZShpbnQgYSwgaW50IGIpCit7CisJaWYgKGVzLT5saW5lbGVuICE9IGIpCisJCW1lbW1vdmUoJmVzLT5jYnVmW2FdLCAmZXMtPmNidWZbYl0sIGVzLT5saW5lbGVuIC0gYik7CisJZXMtPmxpbmVsZW4gLT0gYiAtIGE7Cit9CisKK3N0YXRpYyBpbnQKK2ZpbmRjaChpbnQgY2gsIGludCBjbnQsIGludCBmb3J3LCBpbnQgaW5jbCkKK3sKKwlpbnQgbmN1cnNvcjsKKworCWlmIChlcy0+bGluZWxlbiA9PSAwKQorCQlyZXR1cm4gKC0xKTsKKwluY3Vyc29yID0gZXMtPmN1cnNvcjsKKwl3aGlsZSAoY250LS0pIHsKKwkJZG8geworCQkJaWYgKGZvcncpIHsKKwkJCQlpZiAoKytuY3Vyc29yID09IGVzLT5saW5lbGVuKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKC0tbmN1cnNvciA8IDApCisJCQkJCXJldHVybiAoLTEpOworCQkJfQorCQl9IHdoaWxlIChlcy0+Y2J1ZltuY3Vyc29yXSAhPSBjaCk7CisJfQorCWlmICghaW5jbCkgeworCQlpZiAoZm9ydykKKwkJCW5jdXJzb3ItLTsKKwkJZWxzZQorCQkJbmN1cnNvcisrOworCX0KKwlyZXR1cm4gKG5jdXJzb3IpOworfQorCitzdGF0aWMgaW50Citmb3J3d29yZChpbnQgYXJnY250KQoreworCWludCBuY3Vyc29yOworCisJbmN1cnNvciA9IGVzLT5jdXJzb3I7CisJd2hpbGUgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAmJiBhcmdjbnQtLSkgeworCQlpZiAoa3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJd2hpbGUgKGtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSAmJgorCQkJICAgIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKKwkJCQluY3Vyc29yKys7CisJCWVsc2UgaWYgKCFrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQl3aGlsZSAoIWtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSAmJgorCQkJICAgICFrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKKwkJCSAgICBuY3Vyc29yIDwgZXMtPmxpbmVsZW4pCisJCQkJbmN1cnNvcisrOworCQl3aGlsZSAoa3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pICYmCisJCSAgICBuY3Vyc29yIDwgZXMtPmxpbmVsZW4pCisJCQluY3Vyc29yKys7CisJfQorCXJldHVybiAobmN1cnNvcik7Cit9CisKK3N0YXRpYyBpbnQKK2JhY2t3b3JkKGludCBhcmdjbnQpCit7CisJaW50IG5jdXJzb3I7CisKKwluY3Vyc29yID0gZXMtPmN1cnNvcjsKKwl3aGlsZSAobmN1cnNvciA+IDAgJiYgYXJnY250LS0pIHsKKwkJd2hpbGUgKC0tbmN1cnNvciA+IDAgJiYga3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJOworCQlpZiAobmN1cnNvciA+IDApIHsKKwkJCWlmIChrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQkJd2hpbGUgKC0tbmN1cnNvciA+PSAwICYmCisJCQkJICAgIGtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCQkJOworCQkJZWxzZQorCQkJCXdoaWxlICgtLW5jdXJzb3IgPj0gMCAmJgorCQkJCSAgICAha3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pICYmCisJCQkJICAgICFrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQkJCTsKKwkJCW5jdXJzb3IrKzsKKwkJfQorCX0KKwlyZXR1cm4gKG5jdXJzb3IpOworfQorCitzdGF0aWMgaW50CitlbmR3b3JkKGludCBhcmdjbnQpCit7CisJaW50IG5jdXJzb3I7CisKKwluY3Vyc29yID0gZXMtPmN1cnNvcjsKKwl3aGlsZSAobmN1cnNvciA8IGVzLT5saW5lbGVuICYmIGFyZ2NudC0tKSB7CisJCXdoaWxlICgrK25jdXJzb3IgPCBlcy0+bGluZWxlbiAtIDEgJiYKKwkJICAgIGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCTsKKwkJaWYgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAtIDEpIHsKKwkJCWlmIChrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQkJd2hpbGUgKCsrbmN1cnNvciA8IGVzLT5saW5lbGVuICYmCisJCQkJICAgIGtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCQkJOworCQkJZWxzZQorCQkJCXdoaWxlICgrK25jdXJzb3IgPCBlcy0+bGluZWxlbiAmJgorCQkJCSAgICAha3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pICYmCisJCQkJICAgICFrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQkJCTsKKwkJCW5jdXJzb3ItLTsKKwkJfQorCX0KKwlyZXR1cm4gKG5jdXJzb3IpOworfQorCitzdGF0aWMgaW50CitGb3J3d29yZChpbnQgYXJnY250KQoreworCWludCBuY3Vyc29yOworCisJbmN1cnNvciA9IGVzLT5jdXJzb3I7CisJd2hpbGUgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAmJiBhcmdjbnQtLSkgeworCQl3aGlsZSAoIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSAmJgorCQkgICAgbmN1cnNvciA8IGVzLT5saW5lbGVuKQorCQkJbmN1cnNvcisrOworCQl3aGlsZSAoa3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pICYmCisJCSAgICBuY3Vyc29yIDwgZXMtPmxpbmVsZW4pCisJCQluY3Vyc29yKys7CisJfQorCXJldHVybiAobmN1cnNvcik7Cit9CisKK3N0YXRpYyBpbnQKK0JhY2t3b3JkKGludCBhcmdjbnQpCit7CisJaW50IG5jdXJzb3I7CisKKwluY3Vyc29yID0gZXMtPmN1cnNvcjsKKwl3aGlsZSAobmN1cnNvciA+IDAgJiYgYXJnY250LS0pIHsKKwkJd2hpbGUgKC0tbmN1cnNvciA+PSAwICYmIGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCTsKKwkJd2hpbGUgKG5jdXJzb3IgPj0gMCAmJiAha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJbmN1cnNvci0tOworCQluY3Vyc29yKys7CisJfQorCXJldHVybiAobmN1cnNvcik7Cit9CisKK3N0YXRpYyBpbnQKK0VuZHdvcmQoaW50IGFyZ2NudCkKK3sKKwlpbnQgbmN1cnNvcjsKKworCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOworCXdoaWxlIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxICYmIGFyZ2NudC0tKSB7CisJCXdoaWxlICgrK25jdXJzb3IgPCBlcy0+bGluZWxlbiAtIDEgJiYKKwkJICAgIGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCTsKKwkJaWYgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAtIDEpIHsKKwkJCXdoaWxlICgrK25jdXJzb3IgPCBlcy0+bGluZWxlbiAmJgorCQkJICAgICFrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQkJOworCQkJbmN1cnNvci0tOworCQl9CisJfQorCXJldHVybiAobmN1cnNvcik7Cit9CisKK3N0YXRpYyBpbnQKK2dyYWJoaXN0KGludCBzYXZlLCBpbnQgbikKK3sKKwljaGFyICpocHRyOworCisJaWYgKG4gPCAwIHx8IG4gPiBobGFzdCkKKwkJcmV0dXJuICgtMSk7CisJaWYgKG4gPT0gaGxhc3QpIHsKKwkJcmVzdG9yZV9jYnVmKCk7CisJCW9obnVtID0gbjsKKwkJcmV0dXJuICgwKTsKKwl9CisJKHZvaWQpaGlzdG51bShuKTsKKwlpZiAoKGhwdHIgPSAqaGlzdHBvcygpKSA9PSBOVUxMKSB7CisJCWludGVybmFsX3dhcm5pbmdmKCJncmFiaGlzdDogYmFkIGhpc3RvcnkgYXJyYXkiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWlmIChzYXZlKQorCQlzYXZlX2NidWYoKTsKKwlpZiAoKGVzLT5saW5lbGVuID0gc3RybGVuKGhwdHIpKSA+PSBlcy0+Y2J1ZnNpemUpCisJCWVzLT5saW5lbGVuID0gZXMtPmNidWZzaXplIC0gMTsKKwltZW1tb3ZlKGVzLT5jYnVmLCBocHRyLCBlcy0+bGluZWxlbik7CisJZXMtPmN1cnNvciA9IDA7CisJb2hudW0gPSBuOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dyYWJzZWFyY2goaW50IHNhdmUsIGludCBzdGFydCwgaW50IGZ3ZCwgY2hhciAqcGF0KQoreworCWNoYXIgKmhwdHI7CisJaW50IGhpc3Q7CisJaW50IGFuY2hvcmVkOworCisJaWYgKChzdGFydCA9PSAwICYmIGZ3ZCA9PSAwKSB8fCAoc3RhcnQgPj0gaGxhc3QgLSAxICYmIGZ3ZCA9PSAxKSkKKwkJcmV0dXJuICgtMSk7CisJaWYgKGZ3ZCkKKwkJc3RhcnQrKzsKKwllbHNlCisJCXN0YXJ0LS07CisJYW5jaG9yZWQgPSAqcGF0ID09ICdeJyA/ICgrK3BhdCwgMSkgOiAwOworCWlmICgoaGlzdCA9IGZpbmRoaXN0KHN0YXJ0LCBmd2QsIHBhdCwgYW5jaG9yZWQpKSA8IDApIHsKKwkJLyogaWYgKHN0YXJ0ICE9IDAgJiYgZndkICYmIG1hdGNoKGhvbGRidWYsIHBhdCkgPj0gMCkgeyAqLworCQkvKiBYWFggc2hvdWxkIHN0cmNtcCBiZSBzdHJuY21wPyAqLworCQlpZiAoc3RhcnQgIT0gMCAmJiBmd2QgJiYgc3RyY21wKGhvbGRidWYsIHBhdCkgPj0gMCkgeworCQkJcmVzdG9yZV9jYnVmKCk7CisJCQlyZXR1cm4gKDApOworCQl9IGVsc2UKKwkJCXJldHVybiAoLTEpOworCX0KKwlpZiAoc2F2ZSkKKwkJc2F2ZV9jYnVmKCk7CisJaGlzdG51bShoaXN0KTsKKwlocHRyID0gKmhpc3Rwb3MoKTsKKwlpZiAoKGVzLT5saW5lbGVuID0gc3RybGVuKGhwdHIpKSA+PSBlcy0+Y2J1ZnNpemUpCisJCWVzLT5saW5lbGVuID0gZXMtPmNidWZzaXplIC0gMTsKKwltZW1tb3ZlKGVzLT5jYnVmLCBocHRyLCBlcy0+bGluZWxlbik7CisJZXMtPmN1cnNvciA9IDA7CisJcmV0dXJuIChoaXN0KTsKK30KKworc3RhdGljIHZvaWQKK3JlZHJhd19saW5lKGludCBuZXdsKQoreworCSh2b2lkKW1lbXNldCh3YnVmW3dpbl0sICcgJywgd2J1Zl9sZW4pOworCWlmIChuZXdsKSB7CisJCXhfcHV0YygnXHInKTsKKwkJeF9wdXRjKCdcbicpOworCX0KKwlpZiAocHJvbXB0X3JlZHJhdykKKwkJcHByb21wdChwcm9tcHQsIHByb21wdF90cnVuYyk7CisJY3VyX2NvbCA9IHB3aWR0aDsKKwltb3JlYyA9ICcgJzsKK30KKworc3RhdGljIHZvaWQKK3JlZnJlc2goaW50IGxlZnRzaWRlKQoreworCWlmIChsZWZ0c2lkZSA8IDApCisJCWxlZnRzaWRlID0gbGFzdHJlZjsKKwllbHNlCisJCWxhc3RyZWYgPSBsZWZ0c2lkZTsKKwlpZiAob3V0b2Z3aW4oKSkKKwkJcmV3aW5kb3coKTsKKwlkaXNwbGF5KHdidWZbMSAtIHdpbl0sIHdidWZbd2luXSwgbGVmdHNpZGUpOworCXdpbiA9IDEgLSB3aW47Cit9CisKK3N0YXRpYyBpbnQKK291dG9md2luKHZvaWQpCit7CisJaW50IGN1ciwgY29sOworCisJaWYgKGVzLT5jdXJzb3IgPCBlcy0+d2lubGVmdCkKKwkJcmV0dXJuICgxKTsKKwljb2wgPSAwOworCWN1ciA9IGVzLT53aW5sZWZ0OworCXdoaWxlIChjdXIgPCBlcy0+Y3Vyc29yKQorCQljb2wgPSBuZXdjb2woKHVuc2lnbmVkIGNoYXIpZXMtPmNidWZbY3VyKytdLCBjb2wpOworCWlmIChjb2wgPj0gd2lud2lkdGgpCisJCXJldHVybiAoMSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3Jld2luZG93KHZvaWQpCit7CisJaW50IHRjdXIsIHRjb2w7CisJaW50IGhvbGRjdXIxLCBob2xkY29sMTsKKwlpbnQgaG9sZGN1cjIsIGhvbGRjb2wyOworCisJaG9sZGN1cjEgPSBob2xkY3VyMiA9IHRjdXIgPSAwOworCWhvbGRjb2wxID0gaG9sZGNvbDIgPSB0Y29sID0gMDsKKwl3aGlsZSAodGN1ciA8IGVzLT5jdXJzb3IpIHsKKwkJaWYgKHRjb2wgLSBob2xkY29sMiA+IHdpbndpZHRoIC8gMikgeworCQkJaG9sZGN1cjEgPSBob2xkY3VyMjsKKwkJCWhvbGRjb2wxID0gaG9sZGNvbDI7CisJCQlob2xkY3VyMiA9IHRjdXI7CisJCQlob2xkY29sMiA9IHRjb2w7CisJCX0KKwkJdGNvbCA9IG5ld2NvbCgodW5zaWduZWQgY2hhcillcy0+Y2J1Zlt0Y3VyKytdLCB0Y29sKTsKKwl9CisJd2hpbGUgKHRjb2wgLSBob2xkY29sMSA+IHdpbndpZHRoIC8gMikKKwkJaG9sZGNvbDEgPSBuZXdjb2woKHVuc2lnbmVkIGNoYXIpZXMtPmNidWZbaG9sZGN1cjErK10sCisJCSAgICBob2xkY29sMSk7CisJZXMtPndpbmxlZnQgPSBob2xkY3VyMTsKK30KKworc3RhdGljIGludAorbmV3Y29sKGludCBjaCwgaW50IGNvbCkKK3sKKwlpZiAoY2ggPT0gJ1x0JykKKwkJcmV0dXJuICgoY29sIHwgNykgKyAxKTsKKwlyZXR1cm4gKGNvbCArIGNoYXJfbGVuKGNoKSk7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5KGNoYXIgKndiMSwgY2hhciAqd2IyLCBpbnQgbGVmdHNpZGUpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwljaGFyICp0d2IxLCAqdHdiMiwgbWM7CisJaW50IGN1ciwgY29sLCBjbnQ7CisJaW50IG5jb2wgPSAwOworCWludCBtb3JlcmlnaHQ7CisKKwljb2wgPSAwOworCWN1ciA9IGVzLT53aW5sZWZ0OworCW1vcmVyaWdodCA9IDA7CisJdHdiMSA9IHdiMTsKKwl3aGlsZSAoY29sIDwgd2lud2lkdGggJiYgY3VyIDwgZXMtPmxpbmVsZW4pIHsKKwkJaWYgKGN1ciA9PSBlcy0+Y3Vyc29yICYmIGxlZnRzaWRlKQorCQkJbmNvbCA9IGNvbCArIHB3aWR0aDsKKwkJaWYgKChjaCA9IGVzLT5jYnVmW2N1cl0pID09ICdcdCcpCisJCQlkbyB7CisJCQkJKnR3YjErKyA9ICcgJzsKKwkJCX0gd2hpbGUgKCsrY29sIDwgd2lud2lkdGggJiYgKGNvbCAmIDcpICE9IDApOworCQllbHNlIGlmIChjb2wgPCB3aW53aWR0aCkgeworCQkJaWYgKGNoIDwgJyAnIHx8IGNoID09IDB4N2YpIHsKKwkJCQkqdHdiMSsrID0gJ14nOworCQkJCWlmICgrK2NvbCA8IHdpbndpZHRoKSB7CisJCQkJCSp0d2IxKysgPSBjaCBeICdAJzsKKwkJCQkJY29sKys7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkqdHdiMSsrID0gY2g7CisJCQkJY29sKys7CisJCQl9CisJCX0KKwkJaWYgKGN1ciA9PSBlcy0+Y3Vyc29yICYmICFsZWZ0c2lkZSkKKwkJCW5jb2wgPSBjb2wgKyBwd2lkdGggLSAxOworCQljdXIrKzsKKwl9CisJaWYgKGN1ciA9PSBlcy0+Y3Vyc29yKQorCQluY29sID0gY29sICsgcHdpZHRoOworCWlmIChjb2wgPCB3aW53aWR0aCkgeworCQl3aGlsZSAoY29sIDwgd2lud2lkdGgpIHsKKwkJCSp0d2IxKysgPSAnICc7CisJCQljb2wrKzsKKwkJfQorCX0gZWxzZQorCQltb3JlcmlnaHQrKzsKKwkqdHdiMSA9ICcgJzsKKworCWNvbCA9IHB3aWR0aDsKKwljbnQgPSB3aW53aWR0aDsKKwl0d2IxID0gd2IxOworCXR3YjIgPSB3YjI7CisJd2hpbGUgKGNudC0tKSB7CisJCWlmICgqdHdiMSAhPSAqdHdiMikgeworCQkJaWYgKGN1cl9jb2wgIT0gY29sKQorCQkJCWVkX21vdl9vcHQoY29sLCB3YjEpOworCQkJeF9wdXRjKCp0d2IxKTsKKwkJCWN1cl9jb2wrKzsKKwkJfQorCQl0d2IxKys7CisJCXR3YjIrKzsKKwkJY29sKys7CisJfQorCWlmIChlcy0+d2lubGVmdCA+IDAgJiYgbW9yZXJpZ2h0KQorCQkvKiBQT1NJWCBzYXlzIHRvIHVzZSAqIGZvciB0aGlzIGJ1dCB0aGF0IGlzIGEgZ2xvYmJpbmcKKwkJICogY2hhcmFjdGVyIGFuZCBtYXkgY29uZnVzZSBwZW9wbGU7ICsgaXMgbW9yZSBpbm5vY3VvdXMKKwkJICovCisJCW1jID0gJysnOworCWVsc2UgaWYgKGVzLT53aW5sZWZ0ID4gMCkKKwkJbWMgPSAnPCc7CisJZWxzZSBpZiAobW9yZXJpZ2h0KQorCQltYyA9ICc+JzsKKwllbHNlCisJCW1jID0gJyAnOworCWlmIChtYyAhPSBtb3JlYykgeworCQllZF9tb3Zfb3B0KHB3aWR0aCArIHdpbndpZHRoICsgMSwgd2IxKTsKKwkJeF9wdXRjKG1jKTsKKwkJY3VyX2NvbCsrOworCQltb3JlYyA9IG1jOworCX0KKwlpZiAoY3VyX2NvbCAhPSBuY29sKQorCQllZF9tb3Zfb3B0KG5jb2wsIHdiMSk7Cit9CisKK3N0YXRpYyB2b2lkCitlZF9tb3Zfb3B0KGludCBjb2wsIGNoYXIgKndiKQoreworCWlmIChjb2wgPCBjdXJfY29sKSB7CisJCWlmIChjb2wgKyAxIDwgY3VyX2NvbCAtIGNvbCkgeworCQkJeF9wdXRjKCdccicpOworCQkJaWYgKHByb21wdF9yZWRyYXcpCisJCQkJcHByb21wdChwcm9tcHQsIHByb21wdF90cnVuYyk7CisJCQljdXJfY29sID0gcHdpZHRoOworCQkJd2hpbGUgKGN1cl9jb2wrKyA8IGNvbCkKKwkJCQl4X3B1dGNmKCp3YisrKTsKKwkJfSBlbHNlIHsKKwkJCXdoaWxlIChjdXJfY29sLS0gPiBjb2wpCisJCQkJeF9wdXRjKCdcYicpOworCQl9CisJfSBlbHNlIHsKKwkJd2IgPSAmd2JbY3VyX2NvbCAtIHB3aWR0aF07CisJCXdoaWxlIChjdXJfY29sKysgPCBjb2wpCisJCQl4X3B1dGNmKCp3YisrKTsKKwl9CisJY3VyX2NvbCA9IGNvbDsKK30KKworCisvKiByZXBsYWNlIHdvcmQgd2l0aCBhbGwgZXhwYW5zaW9ucyAoaWUsIGV4cGFuZCB3b3JkKikgKi8KK3N0YXRpYyBpbnQKK2V4cGFuZF93b3JkKGludCBjbWQpCit7CisJc3RhdGljIHN0cnVjdCBlZHN0YXRlICpidWY7CisJaW50IHJ2YWwgPSAwOworCWludCBud29yZHM7CisJaW50IHN0YXJ0LCBlbmQ7CisJY2hhciAqKndvcmRzOworCWludCBpOworCisJLyogVW5kbyBwcmV2aW91cyBleHBhbnNpb24gKi8KKwlpZiAoY21kID09IDAgJiYgZXhwYW5kZWQgPT0gRVhQQU5EICYmIGJ1ZikgeworCQlyZXN0b3JlX2Vkc3RhdGUoZXMsIGJ1Zik7CisJCWJ1ZiA9IDA7CisJCWV4cGFuZGVkID0gTk9ORTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKGJ1ZikgeworCQlmcmVlX2Vkc3RhdGUoYnVmKTsKKwkJYnVmID0gMDsKKwl9CisKKwlud29yZHMgPSB4X2NmX2dsb2IoWENGX0NPTU1BTkRfRklMRXxYQ0ZfRlVMTFBBVEgsCisJICAgIGVzLT5jYnVmLCBlcy0+bGluZWxlbiwgZXMtPmN1cnNvciwKKwkgICAgJnN0YXJ0LCAmZW5kLCAmd29yZHMsIE5VTEwpOworCWlmIChud29yZHMgPT0gMCkgeworCQl2aV9lcnJvcigpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlidWYgPSBzYXZlX2Vkc3RhdGUoZXMpOworCWV4cGFuZGVkID0gRVhQQU5EOworCWRlbF9yYW5nZShzdGFydCwgZW5kKTsKKwllcy0+Y3Vyc29yID0gc3RhcnQ7CisJZm9yIChpID0gMDsgaSA8IG53b3JkczsgKSB7CisJCWlmICh4X2VzY2FwZSh3b3Jkc1tpXSwgc3RybGVuKHdvcmRzW2ldKSwgeF92aV9wdXRidWYpICE9IDApIHsKKwkJCXJ2YWwgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmICgrK2kgPCBud29yZHMgJiYgcHV0YnVmKCIgIiwgMSwgMCkgIT0gMCkgeworCQkJcnZhbCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisJaSA9IGJ1Zi0+Y3Vyc29yIC0gZW5kOworCWlmIChydmFsID09IDAgJiYgaSA+IDApCisJCWVzLT5jdXJzb3IgKz0gaTsKKwltb2RpZmllZCA9IDE7CisJaG51bSA9IGhsYXN0OworCWluc2VydCA9IElOU0VSVDsKKwlsYXN0YWMgPSAwOworCXJlZnJlc2goMCk7CisJcmV0dXJuIChydmFsKTsKK30KKworc3RhdGljIGludAorY29tcGxldGVfd29yZChpbnQgY21kLCBpbnQgY291bnQpCit7CisJc3RhdGljIHN0cnVjdCBlZHN0YXRlICpidWY7CisJaW50IHJ2YWwsIG53b3Jkcywgc3RhcnQsIGVuZCwgbWF0Y2hfbGVuOworCWNoYXIgKip3b3JkczsKKwljaGFyICptYXRjaDsKKwlib29sIGlzX2NvbW1hbmQsIGlzX3VuaXF1ZTsKKworCS8qIFVuZG8gcHJldmlvdXMgY29tcGxldGlvbiAqLworCWlmIChjbWQgPT0gMCAmJiBleHBhbmRlZCA9PSBDT01QTEVURSAmJiBidWYpIHsKKwkJcHJpbnRfZXhwYW5zaW9ucyhidWYsIDApOworCQlleHBhbmRlZCA9IFBSSU5UOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoY21kID09IDAgJiYgZXhwYW5kZWQgPT0gUFJJTlQgJiYgYnVmKSB7CisJCXJlc3RvcmVfZWRzdGF0ZShlcywgYnVmKTsKKwkJYnVmID0gMDsKKwkJZXhwYW5kZWQgPSBOT05FOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoYnVmKSB7CisJCWZyZWVfZWRzdGF0ZShidWYpOworCQlidWYgPSAwOworCX0KKworCS8qIFhDRl9GVUxMUEFUSCBmb3IgY291bnQgJ2NhdXNlIHRoZSBtZW51IHByaW50ZWQgYnkgcHJpbnRfZXhwYW5zaW9ucygpCisJICogd2FzIGRvbmUgdGhpcyB3YXkuCisJICovCisJbndvcmRzID0geF9jZl9nbG9iKFhDRl9DT01NQU5EX0ZJTEUgfCAoY291bnQgPyBYQ0ZfRlVMTFBBVEggOiAwKSwKKwkgICAgZXMtPmNidWYsIGVzLT5saW5lbGVuLCBlcy0+Y3Vyc29yLAorCSAgICAmc3RhcnQsICZlbmQsICZ3b3JkcywgJmlzX2NvbW1hbmQpOworCWlmIChud29yZHMgPT0gMCkgeworCQl2aV9lcnJvcigpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYgKGNvdW50KSB7CisJCWludCBpOworCisJCWNvdW50LS07CisJCWlmIChjb3VudCA+PSBud29yZHMpIHsKKwkJCXZpX2Vycm9yKCk7CisJCQl4X3ByaW50X2V4cGFuc2lvbnMobndvcmRzLCB3b3JkcywgaXNfY29tbWFuZCk7CisJCQl4X2ZyZWVfd29yZHMobndvcmRzLCB3b3Jkcyk7CisJCQlyZWRyYXdfbGluZSgwKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCS8qCisJCSAqIEV4cGFuZCB0aGUgY291bnQndGggd29yZCB0byBpdHMgYmFzZW5hbWUKKwkJICovCisJCWlmIChpc19jb21tYW5kKSB7CisJCQltYXRjaCA9IHdvcmRzW2NvdW50XSArCisJCQkgICAgeF9iYXNlbmFtZSh3b3Jkc1tjb3VudF0sIE5VTEwpOworCQkJLyogSWYgbW9yZSB0aGFuIG9uZSBwb3NzaWJsZSBtYXRjaCwgdXNlIGZ1bGwgcGF0aCAqLworCQkJZm9yIChpID0gMDsgaSA8IG53b3JkczsgaSsrKQorCQkJCWlmIChpICE9IGNvdW50ICYmCisJCQkJICAgIHN0cmNtcCh3b3Jkc1tpXSArIHhfYmFzZW5hbWUod29yZHNbaV0sCisJCQkJICAgIE5VTEwpLCBtYXRjaCkgPT0gMCkgeworCQkJCQltYXRjaCA9IHdvcmRzW2NvdW50XTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQl9IGVsc2UKKwkJCW1hdGNoID0gd29yZHNbY291bnRdOworCQltYXRjaF9sZW4gPSBzdHJsZW4obWF0Y2gpOworCQlpc191bmlxdWUgPSB0cnVlOworCQkvKiBleHBhbmRlZCA9IFBSSU5UOwluZXh0IGNhbGwgdW5kbyAqLworCX0gZWxzZSB7CisJCW1hdGNoID0gd29yZHNbMF07CisJCW1hdGNoX2xlbiA9IHhfbG9uZ2VzdF9wcmVmaXgobndvcmRzLCB3b3Jkcyk7CisJCWV4cGFuZGVkID0gQ09NUExFVEU7CS8qIG5leHQgY2FsbCB3aWxsIGxpc3QgY29tcGxldGlvbnMgKi8KKwkJaXNfdW5pcXVlID0gbndvcmRzID09IDE7CisJfQorCisJYnVmID0gc2F2ZV9lZHN0YXRlKGVzKTsKKwlkZWxfcmFuZ2Uoc3RhcnQsIGVuZCk7CisJZXMtPmN1cnNvciA9IHN0YXJ0OworCisJLyogZXNjYXBlIGFsbCBzaGVsbC1zZW5zaXRpdmUgY2hhcmFjdGVycyBhbmQgcHV0IHRoZSByZXN1bHQgaW50bworCSAqIGNvbW1hbmQgYnVmZmVyICovCisJcnZhbCA9IHhfZXNjYXBlKG1hdGNoLCBtYXRjaF9sZW4sIHhfdmlfcHV0YnVmKTsKKworCWlmIChydmFsID09IDAgJiYgaXNfdW5pcXVlKSB7CisJCS8qIElmIGV4YWN0IG1hdGNoLCBkb24ndCB1bmRvLiBBbGxvd3MgZGlyZWN0b3J5IGNvbXBsZXRpb25zCisJCSAqIHRvIGJlIHVzZWQgKGllLCBjb21wbGV0ZSB0aGUgbmV4dCBwb3J0aW9uIG9mIHRoZSBwYXRoKS4KKwkJICovCisJCWV4cGFuZGVkID0gTk9ORTsKKworCQkvKiBJZiBub3QgYSBkaXJlY3RvcnksIGFkZCBhIHNwYWNlIHRvIHRoZSBlbmQuLi4gKi8KKwkJaWYgKG1hdGNoX2xlbiA+IDAgJiYgbWF0Y2hbbWF0Y2hfbGVuIC0gMV0gIT0gJy8nKQorCQkJcnZhbCA9IHB1dGJ1ZigiICIsIDEsIDApOworCX0KKwl4X2ZyZWVfd29yZHMobndvcmRzLCB3b3Jkcyk7CisKKwltb2RpZmllZCA9IDE7CisJaG51bSA9IGhsYXN0OworCWluc2VydCA9IElOU0VSVDsKKwlsYXN0YWMgPSAwOwkgLyogcHJldmVudCB0aGlzIGZyb20gYmVpbmcgcmVkb25lLi4uICovCisJcmVmcmVzaCgwKTsKKworCXJldHVybiAocnZhbCk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X2V4cGFuc2lvbnMoc3RydWN0IGVkc3RhdGUgKmVzdCwgaW50IGNtZCBNS1NIX0FfVU5VU0VEKQoreworCWludCBzdGFydCwgZW5kLCBud29yZHM7CisJY2hhciAqKndvcmRzOworCWJvb2wgaXNfY29tbWFuZDsKKworCW53b3JkcyA9IHhfY2ZfZ2xvYihYQ0ZfQ09NTUFORF9GSUxFIHwgWENGX0ZVTExQQVRILAorCSAgICBlc3QtPmNidWYsIGVzdC0+bGluZWxlbiwgZXN0LT5jdXJzb3IsCisJICAgICZzdGFydCwgJmVuZCwgJndvcmRzLCAmaXNfY29tbWFuZCk7CisJaWYgKG53b3JkcyA9PSAwKSB7CisJCXZpX2Vycm9yKCk7CisJCXJldHVybiAoLTEpOworCX0KKwl4X3ByaW50X2V4cGFuc2lvbnMobndvcmRzLCB3b3JkcywgaXNfY29tbWFuZCk7CisJeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOworCXJlZHJhd19saW5lKDApOworCXJldHVybiAoMCk7Cit9CisKKy8qIFNpbWlsYXIgdG8geF96b3RjKGVtYWNzLmMpLCBidXQgbm8gdGFiIHdlaXJkbmVzcyAqLworc3RhdGljIHZvaWQKK3hfdmlfem90YyhpbnQgYykKK3sKKwlpZiAoYyA8ICcgJyB8fCBjID09IDB4N2YpIHsKKwkJeF9wdXRjKCdeJyk7CisJCWMgXj0gJ0AnOworCX0KKwl4X3B1dGMoYyk7Cit9CisKK3N0YXRpYyB2b2lkCit2aV9lcnJvcih2b2lkKQoreworCS8qIEJlZW0gb3V0IG9mIGFueSBtYWNyb3MgYXMgc29vbiBhcyBhbiBlcnJvciBvY2N1cnMgKi8KKwl2aV9tYWNyb19yZXNldCgpOworCXhfcHV0Yyg3KTsKKwl4X2ZsdXNoKCk7Cit9CisKK3N0YXRpYyB2b2lkCit2aV9tYWNyb19yZXNldCh2b2lkKQoreworCWlmIChtYWNyby5wKSB7CisJCWFmcmVlKG1hY3JvLmJ1ZiwgQVBFUk0pOworCQltZW1zZXQoKGNoYXIgKikmbWFjcm8sIDAsIHNpemVvZihtYWNybykpOworCX0KK30KKyNlbmRpZiAvKiAhTUtTSF9TX05PVkkgKi8KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2VtYWNzZm4uaCBiL21rc2gvc3JjL2VtYWNzZm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzMzMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvZW1hY3Nmbi5oCkBAIC0wLDAgKzEsODkgQEAKKyNpZiBkZWZpbmVkKEVNQUNTRk5fREVGTlMpCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9lbWFjc2ZuLmgsdiAxLjUgMjAxMC8wNy8xNyAyMjowOTozMyB0ZyBFeHAgJCIpOworI2RlZmluZSBGTihjbmFtZSxzbmFtZSxmbGFncykJc3RhdGljIGludCB4XyMjY25hbWUoaW50KTsKKyNlbGlmIGRlZmluZWQoRU1BQ1NGTl9FTlVNUykKKyNkZWZpbmUgRk4oY25hbWUsc25hbWUsZmxhZ3MpCVhGVU5DXyMjY25hbWUsCisjZGVmaW5lIEYwKGNuYW1lLHNuYW1lLGZsYWdzKQlYRlVOQ18jI2NuYW1lID0gMCwKKyNlbGlmIGRlZmluZWQoRU1BQ1NGTl9JVEVNUykKKyNkZWZpbmUgRk4oY25hbWUsc25hbWUsZmxhZ3MpCXsgeF8jI2NuYW1lLCBzbmFtZSwgZmxhZ3MgfSwKKyNlbmRpZgorCisjaWZuZGVmIEYwCisjZGVmaW5lIEYwIEZOCisjZW5kaWYKKworRjAoYWJvcnQsICJhYm9ydCIsIDApCitGTihiZWdfaGlzdCwgImJlZ2lubmluZy1vZi1oaXN0b3J5IiwgMCkKK0ZOKGNscywgImNsZWFyLXNjcmVlbiIsIDApCitGTihjb21tZW50LCAiY29tbWVudCIsIDApCitGTihjb21wX2NvbW0sICJjb21wbGV0ZS1jb21tYW5kIiwgMCkKK0ZOKGNvbXBfZmlsZSwgImNvbXBsZXRlLWZpbGUiLCAwKQorRk4oY29tcF9saXN0LCAiY29tcGxldGUtbGlzdCIsIDApCitGTihjb21wbGV0ZSwgImNvbXBsZXRlIiwgMCkKK0ZOKGRlbF9iYWNrLCAiZGVsZXRlLWNoYXItYmFja3dhcmQiLCBYRl9BUkcpCitGTihkZWxfYndvcmQsICJkZWxldGUtd29yZC1iYWNrd2FyZCIsIFhGX0FSRykKK0ZOKGRlbF9jaGFyLCAiZGVsZXRlLWNoYXItZm9yd2FyZCIsIFhGX0FSRykKK0ZOKGRlbF9md29yZCwgImRlbGV0ZS13b3JkLWZvcndhcmQiLCBYRl9BUkcpCitGTihkZWxfbGluZSwgImtpbGwtbGluZSIsIDApCitGTihkcmF3X2xpbmUsICJyZWRyYXciLCAwKQorI2lmbmRlZiBNS1NIX1NNQUxMCitGTihlZGl0X2xpbmUsICJlZGl0LWxpbmUiLCBYRl9BUkcpCisjZW5kaWYKK0ZOKGVuZF9oaXN0LCAiZW5kLW9mLWhpc3RvcnkiLCAwKQorRk4oZW5kX29mX3RleHQsICJlb3QiLCAwKQorRk4oZW51bWVyYXRlLCAibGlzdCIsIDApCitGTihlb3RfZGVsLCAiZW90LW9yLWRlbGV0ZSIsIFhGX0FSRykKK0ZOKGVycm9yLCAiZXJyb3IiLCAwKQorRk4oZXhwYW5kLCAiZXhwYW5kLWZpbGUiLCAwKQorI2lmbmRlZiBNS1NIX1NNQUxMCitGTihmb2xkX2NhcGl0YWxpc2UsICJjYXBpdGFsaXplLXdvcmQiLCBYRl9BUkcpCitGTihmb2xkX2xvd2VyLCAiZG93bmNhc2Utd29yZCIsIFhGX0FSRykKK0ZOKGZvbGRfdXBwZXIsICJ1cGNhc2Utd29yZCIsIFhGX0FSRykKKyNlbmRpZgorRk4oZ290b19oaXN0LCAiZ290by1oaXN0b3J5IiwgWEZfQVJHKQorI2lmbmRlZiBNS1NIX1NNQUxMCitGTihpbnNfc3RyaW5nLCAibWFjcm8tc3RyaW5nIiwgWEZfTk9CSU5EKQorI2VuZGlmCitGTihpbnNlcnQsICJhdXRvLWluc2VydCIsIFhGX0FSRykKK0ZOKGtpbGwsICJraWxsLXRvLWVvbCIsIFhGX0FSRykKK0ZOKGtpbGxfcmVnaW9uLCAia2lsbC1yZWdpb24iLCAwKQorRk4obGlzdF9jb21tLCAibGlzdC1jb21tYW5kIiwgMCkKK0ZOKGxpc3RfZmlsZSwgImxpc3QtZmlsZSIsIDApCitGTihsaXRlcmFsLCAicXVvdGUiLCAwKQorRk4obWV0YTEsICJwcmVmaXgtMSIsIFhGX1BSRUZJWCkKK0ZOKG1ldGEyLCAicHJlZml4LTIiLCBYRl9QUkVGSVgpCitGTihtZXRhX3lhbmssICJ5YW5rLXBvcCIsIDApCitGTihtdl9iYWNrLCAiYmFja3dhcmQtY2hhciIsIFhGX0FSRykKK0ZOKG12X2JlZ2luLCAiYmVnaW5uaW5nLW9mLWxpbmUiLCAwKQorRk4obXZfYndvcmQsICJiYWNrd2FyZC13b3JkIiwgWEZfQVJHKQorRk4obXZfZW5kLCAiZW5kLW9mLWxpbmUiLCAwKQorRk4obXZfZm9ydywgImZvcndhcmQtY2hhciIsIFhGX0FSRykKK0ZOKG12X2Z3b3JkLCAiZm9yd2FyZC13b3JkIiwgWEZfQVJHKQorRk4obmV3bGluZSwgIm5ld2xpbmUiLCAwKQorRk4obmV4dF9jb20sICJkb3duLWhpc3RvcnkiLCBYRl9BUkcpCitGTihubF9uZXh0X2NvbSwgIm5ld2xpbmUtYW5kLW5leHQiLCAwKQorRk4obm9vcCwgIm5vLW9wIiwgMCkKK0ZOKHByZXZfY29tLCAidXAtaGlzdG9yeSIsIFhGX0FSRykKK0ZOKHByZXZfaGlzdHdvcmQsICJwcmV2LWhpc3Qtd29yZCIsIFhGX0FSRykKK0ZOKHNlYXJjaF9jaGFyX2JhY2ssICJzZWFyY2gtY2hhcmFjdGVyLWJhY2t3YXJkIiwgWEZfQVJHKQorRk4oc2VhcmNoX2NoYXJfZm9ydywgInNlYXJjaC1jaGFyYWN0ZXItZm9yd2FyZCIsIFhGX0FSRykKK0ZOKHNlYXJjaF9oaXN0LCAic2VhcmNoLWhpc3RvcnkiLCAwKQorI2lmbmRlZiBNS1NIX1NNQUxMCitGTihzZWFyY2hfaGlzdF9kbiwgInNlYXJjaC1oaXN0b3J5LWRvd24iLCAwKQorRk4oc2VhcmNoX2hpc3RfdXAsICJzZWFyY2gtaGlzdG9yeS11cCIsIDApCisjZW5kaWYKK0ZOKHNldF9hcmcsICJzZXQtYXJnIiwgWEZfTk9CSU5EKQorRk4oc2V0X21hcmssICJzZXQtbWFyay1jb21tYW5kIiwgMCkKK0ZOKHRyYW5zcG9zZSwgInRyYW5zcG9zZS1jaGFycyIsIDApCitGTih2ZXJzaW9uLCAidmVyc2lvbiIsIDApCisjaWZuZGVmIE1LU0hfU01BTEwKK0ZOKHZ0X2hhY2ssICJ2dDEwMC1oYWNrIiwgWEZfQVJHKQorI2VuZGlmCitGTih4Y2hnX3BvaW50X21hcmssICJleGNoYW5nZS1wb2ludC1hbmQtbWFyayIsIDApCitGTih5YW5rLCAieWFuayIsIDApCisKKyN1bmRlZiBGTgorI3VuZGVmIEYwCisjdW5kZWYgRU1BQ1NGTl9ERUZOUworI3VuZGVmIEVNQUNTRk5fRU5VTVMKKyN1bmRlZiBFTUFDU0ZOX0lURU1TCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9ldmFsLmMgYi9ta3NoL3NyYy9ldmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyZTM0NgotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2V2YWwuYwpAQCAtMCwwICsxLDE1ODAgQEAKKy8qCSRPcGVuQlNEOiBldmFsLmMsdiAxLjM1IDIwMTAvMDMvMjQgMDg6Mjc6MjYgZmdzY2ggRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9ldmFsLmMsdiAxLjkwIDIwMTAvMDcvMTcgMjI6MDk6MzMgdGcgRXhwICQiKTsKKworLyoKKyAqIHN0cmluZyBleHBhbnNpb24KKyAqCisgKiBmaXJzdCBwYXNzOiBxdW90aW5nLCBJRlMgc2VwYXJhdGlvbiwgfiwgJHt9LCAkKCkgYW5kICQoKCkpIHN1YnN0aXR1dGlvbi4KKyAqIHNlY29uZCBwYXNzOiBhbHRlcm5hdGlvbiAoeyx9KSwgZmlsZW5hbWUgZXhwYW5zaW9uICgqP1tdKS4KKyAqLworCisvKiBleHBhbnNpb24gZ2VuZXJhdG9yIHN0YXRlICovCit0eXBlZGVmIHN0cnVjdCBFeHBhbmQgeworCS8qIGludCB0eXBlOyAqLwkJCS8qIHNlZSBleHBhbmQoKSAqLworCWNvbnN0IGNoYXIgKnN0cjsJCS8qIHN0cmluZyAqLworCXVuaW9uIHsKKwkJY29uc3QgY2hhciAqKnN0cnY7CS8qIHN0cmluZ1tdICovCisJCXN0cnVjdCBzaGYgKnNoZjsJLyogZmlsZSAqLworCX0gdTsJCQkJLyogc291cmNlICovCisJc3RydWN0IHRibCAqdmFyOwkJLyogdmFyaWFibGUgaW4gJHt2YXIuLn0gKi8KKwlzaG9ydCBzcGxpdDsJCQkvKiBzcGxpdCAiJEAiIC8gY2FsbCB3YWl0bGFzdCAkKCkgKi8KK30gRXhwYW5kOworCisjZGVmaW5lCVhCQVNFCQkwCS8qIHNjYW5uaW5nIG9yaWdpbmFsICovCisjZGVmaW5lCVhTVUIJCTEJLyogZXhwYW5kaW5nICR7fSBzdHJpbmcgKi8KKyNkZWZpbmUJWEFSR1NFUAkJMgkvKiBpZnMwIGJldHdlZW4gIiQqIiAqLworI2RlZmluZQlYQVJHCQkzCS8qIGV4cGFuZGluZyAkKiwgJEAgKi8KKyNkZWZpbmUJWENPTQkJNAkvKiBleHBhbmRpbmcgJCgpICovCisjZGVmaW5lIFhOVUxMU1VCCTUJLyogIiRAIiB3aGVuICQjIGlzIDAgKGRvbid0IGdlbmVyYXRlIHdvcmQpICovCisjZGVmaW5lIFhTVUJNSUQJCTYJLyogbWlkZGxlIG9mIGV4cGFuZGluZyAke30gKi8KKworLyogU3RhdGVzIHVzZWQgZm9yIGZpZWxkIHNwbGl0dGluZyAqLworI2RlZmluZSBJRlNfV09SRAkwCS8qIHdvcmQgaGFzIGNoYXJzIChvciBxdW90ZXMpICovCisjZGVmaW5lIElGU19XUwkJMQkvKiBoYXZlIHNlZW4gSUZTIHdoaXRlLXNwYWNlICovCisjZGVmaW5lIElGU19OV1MJCTIJLyogaGF2ZSBzZWVuIElGUyBub24td2hpdGUtc3BhY2UgKi8KKworc3RhdGljIGludCB2YXJzdWIoRXhwYW5kICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKiwgaW50ICopOworc3RhdGljIGludCBjb21zdWIoRXhwYW5kICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgY2hhciAqdHJpbXN1YihjaGFyICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGdsb2IoY2hhciAqLCBYUHRyViAqLCBpbnQpOworc3RhdGljIHZvaWQgZ2xvYml0KFhTdHJpbmcgKiwgY2hhciAqKiwgY2hhciAqLCBYUHRyViAqLCBpbnQpOworc3RhdGljIGNvbnN0IGNoYXIgKm1heWJlX2V4cGFuZF90aWxkZShjb25zdCBjaGFyICosIFhTdHJpbmcgKiwgY2hhciAqKiwgaW50KTsKK3N0YXRpYyBjaGFyICp0aWxkZShjaGFyICopOworI2lmbmRlZiBNS1NIX05PUFdOQU0KK3N0YXRpYyBjaGFyICpob21lZGlyKGNoYXIgKik7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGFsdF9leHBhbmQoWFB0clYgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBzaXplX3QgdXRmbGVuKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgdm9pZCB1dGZpbmNwdHIoY29uc3QgY2hhciAqLCBta3NoX2FyaV90ICopOworCisvKiBVVEZNT0RFIGZ1bmN0aW9ucyAqLworc3RhdGljIHNpemVfdAordXRmbGVuKGNvbnN0IGNoYXIgKnMpCit7CisJc2l6ZV90IG47CisKKwlpZiAoVVRGTU9ERSkgeworCQluID0gMDsKKwkJd2hpbGUgKCpzKSB7CisJCQlzICs9IHV0Zl9wdHJhZGoocyk7CisJCQkrK247CisJCX0KKwl9IGVsc2UKKwkJbiA9IHN0cmxlbihzKTsKKwlyZXR1cm4gKG4pOworfQorCitzdGF0aWMgdm9pZAordXRmaW5jcHRyKGNvbnN0IGNoYXIgKnMsIG1rc2hfYXJpX3QgKmxwKQoreworCWNvbnN0IGNoYXIgKmNwID0gczsKKworCXdoaWxlICgoKmxwKS0tKQorCQljcCArPSB1dGZfcHRyYWRqKGNwKTsKKwkqbHAgPSBjcCAtIHM7Cit9CisKKy8qIGNvbXBpbGUgYW5kIGV4cGFuZCB3b3JkICovCitjaGFyICoKK3N1YnN0aXR1dGUoY29uc3QgY2hhciAqY3AsIGludCBmKQoreworCXN0cnVjdCBzb3VyY2UgKnMsICpzb2xkOworCisJc29sZCA9IHNvdXJjZTsKKwlzID0gcHVzaHMoU1dTVFIsIEFURU1QKTsKKwlzLT5zdGFydCA9IHMtPnN0ciA9IGNwOworCXNvdXJjZSA9IHM7CisJaWYgKHl5bGV4KE9ORVdPUkQpICE9IExXT1JEKQorCQlpbnRlcm5hbF9lcnJvcmYoInN1YnN0aXR1dGUiKTsKKwlzb3VyY2UgPSBzb2xkOworCWFmcmVlKHMsIEFURU1QKTsKKwlyZXR1cm4gKGV2YWxzdHIoeXlsdmFsLmNwLCBmKSk7Cit9CisKKy8qCisgKiBleHBhbmQgYXJnLWxpc3QKKyAqLworY2hhciAqKgorZXZhbChjb25zdCBjaGFyICoqYXAsIGludCBmKQoreworCVhQdHJWIHc7CisKKwlpZiAoKmFwID09IE5VTEwpIHsKKwkJdW5pb24gbWtzaF9jY3BoYWNrIHZhcDsKKworCQl2YXAucm8gPSBhcDsKKwkJcmV0dXJuICh2YXAucncpOworCX0KKwlYUGluaXQodywgMzIpOworCVhQcHV0KHcsIE5VTEwpOwkJLyogc3BhY2UgZm9yIHNoZWxsIG5hbWUgKi8KKwl3aGlsZSAoKmFwICE9IE5VTEwpCisJCWV4cGFuZCgqYXArKywgJncsIGYpOworCVhQcHV0KHcsIE5VTEwpOworCXJldHVybiAoKGNoYXIgKiopWFBjbG9zZSh3KSArIDEpOworfQorCisvKgorICogZXhwYW5kIHN0cmluZworICovCitjaGFyICoKK2V2YWxzdHIoY29uc3QgY2hhciAqY3AsIGludCBmKQoreworCVhQdHJWIHc7CisJY2hhciAqZHAgPSBudWxsOworCisJWFBpbml0KHcsIDEpOworCWV4cGFuZChjcCwgJncsIGYpOworCWlmIChYUHNpemUodykpCisJCWRwID0gKlhQcHRydih3KTsKKwlYUGZyZWUodyk7CisJcmV0dXJuIChkcCk7Cit9CisKKy8qCisgKiBleHBhbmQgc3RyaW5nIC0gcmV0dXJuIG9ubHkgb25lIGNvbXBvbmVudAorICogdXNlZCBmcm9tIGlvc2V0dXAgdG8gZXhwYW5kIHJlZGlyZWN0aW9uIGZpbGVzCisgKi8KK2NoYXIgKgorZXZhbG9uZXN0cihjb25zdCBjaGFyICpjcCwgaW50IGYpCit7CisJWFB0clYgdzsKKwljaGFyICpydjsKKworCVhQaW5pdCh3LCAxKTsKKwlleHBhbmQoY3AsICZ3LCBmKTsKKwlzd2l0Y2ggKFhQc2l6ZSh3KSkgeworCWNhc2UgMDoKKwkJcnYgPSBudWxsOworCQlicmVhazsKKwljYXNlIDE6CisJCXJ2ID0gKGNoYXIgKikgKlhQcHRydih3KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcnYgPSBldmFsc3RyKGNwLCBmJn5ET0dMT0IpOworCQlicmVhazsKKwl9CisJWFBmcmVlKHcpOworCXJldHVybiAocnYpOworfQorCisvKiBmb3IgbmVzdGVkIHN1YnN0aXR1dGlvbjogJHt2YXI6PSR2YXIyfSAqLwordHlwZWRlZiBzdHJ1Y3QgU3ViVHlwZSB7CisJc3RydWN0IHRibCAqdmFyOwkvKiB2YXJpYWJsZSBmb3IgJHt2YXIuLn0gKi8KKwlzdHJ1Y3QgU3ViVHlwZSAqcHJldjsJLyogb2xkIHR5cGUgKi8KKwlzdHJ1Y3QgU3ViVHlwZSAqbmV4dDsJLyogcG9wZWQgdHlwZSAodG8gYXZvaWQgcmUtYWxsb2NhdGluZykgKi8KKwlzaG9ydAlzdHlwZTsJCS8qIFs9Ky0/JSNdIGFjdGlvbiBhZnRlciBleHBhbmRlZCB3b3JkICovCisJc2hvcnQJYmFzZTsJCS8qIGJlZ2luIHBvc2l0aW9uIG9mIGV4cGFuZGVkIHdvcmQgKi8KKwlzaG9ydAlmOwkJLyogc2F2ZWQgdmFsdWUgb2YgZiAoRE9QQVQsIGV0YykgKi8KKwl1aW50OF90CXF1b3RlcDsJCS8qIHNhdmVkIHZhbHVlIG9mIHF1b3RlIChmb3IgJHsuLlslI10uLn0pICovCisJdWludDhfdAlxdW90ZXc7CQkvKiBzYXZlZCB2YWx1ZSBvZiBxdW90ZSAoZm9yICR7Li5bKy09XS4ufSkgKi8KK30gU3ViVHlwZTsKKwordm9pZAorZXhwYW5kKGNvbnN0IGNoYXIgKmNwLAkvKiBpbnB1dCB3b3JkICovCisgICAgWFB0clYgKndwLAkJLyogb3V0cHV0IHdvcmRzICovCisgICAgaW50IGYpCQkvKiBETyogZmxhZ3MgKi8KK3sKKwlpbnQgYyA9IDA7CisJaW50IHR5cGU7CQkvKiBleHBhbnNpb24gdHlwZSAqLworCWludCBxdW90ZSA9IDA7CQkvKiBxdW90ZWQgKi8KKwlYU3RyaW5nIGRzOwkJLyogZGVzdGluYXRpb24gc3RyaW5nICovCisJY2hhciAqZHA7CQkvKiBkZXN0aW5hdGlvbiAqLworCWNvbnN0IGNoYXIgKnNwOwkJLyogc291cmNlICovCisJaW50IGZkbywgd29yZDsJCS8qIHNlY29uZCBwYXNzIGZsYWdzOyBoYXZlIHdvcmQgKi8KKwlpbnQgZG9ibGFuazsJCS8qIGZpZWxkIHNwbGl0dGluZyBvZiBwYXJhbWV0ZXIvY29tbWFuZCBzdWJzdCAqLworCUV4cGFuZCB4ID0gewkJLyogZXhwYW5zaW9uIHZhcmlhYmxlcyAqLworCQlOVUxMLCB7IE5VTEwgfSwgTlVMTCwgMAorCX07CisJU3ViVHlwZSBzdF9oZWFkLCAqc3Q7CisJaW50IG5ld2xpbmVzID0gMDsgLyogRm9yIHRyYWlsaW5nIG5ld2xpbmVzIGluIENPTVNVQiAqLworCWludCBzYXdfZXEsIHRpbGRlX29rOworCWludCBtYWtlX21hZ2ljOworCXNpemVfdCBsZW47CisKKwlpZiAoY3AgPT0gTlVMTCkKKwkJaW50ZXJuYWxfZXJyb3JmKCJleHBhbmQoTlVMTCkiKTsKKwkvKiBmb3IgYWxpYXMsIHJlYWRvbmx5LCBzZXQsIHR5cGVzZXQgY29tbWFuZHMgKi8KKwlpZiAoKGYgJiBET1ZBQ0hFQ0spICYmIGlzX3dkdmFyYXNzaWduKGNwKSkgeworCQlmICY9IH4oRE9WQUNIRUNLfERPQkxBTkt8RE9HTE9CfERPVElMREUpOworCQlmIHw9IERPQVNOVElMREU7CisJfQorCWlmIChGbGFnKEZOT0dMT0IpKQorCQlmICY9IH5ET0dMT0I7CisJaWYgKEZsYWcoRk1BUktESVJTKSkKKwkJZiB8PSBET01BUktESVJTOworCWlmIChGbGFnKEZCUkFDRUVYUEFORCkgJiYgKGYgJiBET0dMT0IpKQorCQlmIHw9IERPQlJBQ0VfOworCisJWGluaXQoZHMsIGRwLCAxMjgsIEFURU1QKTsJLyogaW5pdCBkZXN0LiBzdHJpbmcgKi8KKwl0eXBlID0gWEJBU0U7CisJc3AgPSBjcDsKKwlmZG8gPSAwOworCXNhd19lcSA9IDA7CisJdGlsZGVfb2sgPSAoZiAmIChET1RJTERFfERPQVNOVElMREUpKSA/IDEgOiAwOyAvKiBtdXN0IGJlIDEvMCAqLworCWRvYmxhbmsgPSAwOworCW1ha2VfbWFnaWMgPSAwOworCXdvcmQgPSAoZiZET0JMQU5LKSA/IElGU19XUyA6IElGU19XT1JEOworCS8qIGNsYW5nIGRvZXNuJ3Qga25vdyBPU1VCU1QgY29tZXMgYmVmb3JlIENTVUJTVCAqLworCW1lbXNldCgmc3RfaGVhZCwgMCwgc2l6ZW9mKHN0X2hlYWQpKTsKKwlzdCA9ICZzdF9oZWFkOworCisJd2hpbGUgKDEpIHsKKwkJWGNoZWNrKGRzLCBkcCk7CisKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgWEJBU0U6CS8qIG9yaWdpbmFsIHByZWZpeGVkIHN0cmluZyAqLworCQkJYyA9ICpzcCsrOworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlIEVPUzoKKwkJCQljID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0hBUjoKKwkJCQljID0gKnNwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIFFDSEFSOgorCQkJCXF1b3RlIHw9IDI7IC8qIHRlbXBvcmFyeSBxdW90ZSAqLworCQkJCWMgPSAqc3ArKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgT1FVT1RFOgorCQkJCXdvcmQgPSBJRlNfV09SRDsKKwkJCQl0aWxkZV9vayA9IDA7CisJCQkJcXVvdGUgPSAxOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSBDUVVPVEU6CisJCQkJcXVvdGUgPSBzdC0+cXVvdGV3OworCQkJCWNvbnRpbnVlOworCQkJY2FzZSBDT01TVUI6CisJCQkJdGlsZGVfb2sgPSAwOworCQkJCWlmIChmICYgRE9OVFJVTkNPTU1BTkQpIHsKKwkJCQkJd29yZCA9IElGU19XT1JEOworCQkJCQkqZHArKyA9ICckJzsgKmRwKysgPSAnKCc7CisJCQkJCXdoaWxlICgqc3AgIT0gJ1wwJykgeworCQkJCQkJWGNoZWNrKGRzLCBkcCk7CisJCQkJCQkqZHArKyA9ICpzcCsrOworCQkJCQl9CisJCQkJCSpkcCsrID0gJyknOworCQkJCX0gZWxzZSB7CisJCQkJCXR5cGUgPSBjb21zdWIoJngsIHNwKTsKKwkJCQkJaWYgKHR5cGUgPT0gWENPTSAmJiAoZiZET0JMQU5LKSkKKwkJCQkJCWRvYmxhbmsrKzsKKwkJCQkJc3AgPSBzdHJudWwoc3ApICsgMTsKKwkJCQkJbmV3bGluZXMgPSAwOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCWNhc2UgRVhQUlNVQjoKKwkJCQl3b3JkID0gSUZTX1dPUkQ7CisJCQkJdGlsZGVfb2sgPSAwOworCQkJCWlmIChmICYgRE9OVFJVTkNPTU1BTkQpIHsKKwkJCQkJKmRwKysgPSAnJCc7ICpkcCsrID0gJygnOyAqZHArKyA9ICcoJzsKKwkJCQkJd2hpbGUgKCpzcCAhPSAnXDAnKSB7CisJCQkJCQlYY2hlY2soZHMsIGRwKTsKKwkJCQkJCSpkcCsrID0gKnNwKys7CisJCQkJCX0KKwkJCQkJKmRwKysgPSAnKSc7ICpkcCsrID0gJyknOworCQkJCX0gZWxzZSB7CisJCQkJCXN0cnVjdCB0YmwgdjsKKwkJCQkJY2hhciAqcDsKKworCQkJCQl2LmZsYWcgPSBERUZJTkVEfElTU0VUfElOVEVHRVI7CisJCQkJCXYudHlwZSA9IDEwOyAvKiBub3QgZGVmYXVsdCAqLworCQkJCQl2Lm5hbWVbMF0gPSAnXDAnOworCQkJCQl2X2V2YWx1YXRlKCZ2LCBzdWJzdGl0dXRlKHNwLCAwKSwKKwkJCQkJICAgIEtTSF9VTldJTkRfRVJST1IsIHRydWUpOworCQkJCQlzcCA9IHN0cm51bChzcCkgKyAxOworCQkJCQlmb3IgKHAgPSBzdHJfdmFsKCZ2KTsgKnA7ICkgeworCQkJCQkJWGNoZWNrKGRzLCBkcCk7CisJCQkJCQkqZHArKyA9ICpwKys7CisJCQkJCX0KKwkJCQl9CisJCQkJY29udGludWU7CisJCQljYXNlIE9TVUJTVDogewkvKiAke3sjfXZhcns6fVs9Ky0/IyVdd29yZH0gKi8KKwkJCS8qIGZvcm1hdCBpczoKKwkJCSAqCU9TVUJTVCBbe3hdIHBsYWluLXZhcmlhYmxlLXBhcnQgXDAKKwkJCSAqCSAgICBjb21waWxlZC13b3JkLXBhcnQgQ1NVQlNUIFt9eF0KKwkJCSAqIFRoaXMgaXMgd2hlcmUgYWxsIHN5bnRheCBjaGVja2luZyBnZXRzIGRvbmUuLi4KKwkJCSAqLworCQkJCWNvbnN0IGNoYXIgKnZhcm5hbWUgPSArK3NwOyAvKiBza2lwIHRoZSB7IG9yIHggKH0pICovCisJCQkJaW50IHN0eXBlOworCQkJCWludCBzbGVuID0gMDsKKworCQkJCXNwID0gY3N0cmNocihzcCwgJ1wwJykgKyAxOyAvKiBza2lwIHZhcmlhYmxlICovCisJCQkJdHlwZSA9IHZhcnN1YigmeCwgdmFybmFtZSwgc3AsICZzdHlwZSwgJnNsZW4pOworCQkJCWlmICh0eXBlIDwgMCkgeworCQkJCQljaGFyICpiZWcsICplbmQsICpzdHI7CisKKyB1bndpbmRfc3Vic3RzeW46CisJCQkJCXNwID0gdmFybmFtZSAtIDI7IC8qIHJlc3RvcmUgc3AgKi8KKwkJCQkJZW5kID0gKGJlZyA9IHdkY29weShzcCwgQVRFTVApKSArCisJCQkJCSAgICAod2RzY2FuKHNwLCBDU1VCU1QpIC0gc3ApOworCQkJCQkvKiAoeykgdGhlIH0gb3IgeCBpcyBhbHJlYWR5IHNraXBwZWQgKi8KKwkJCQkJaWYgKGVuZCA8IHdkc2NhbihiZWcsIEVPUykpCisJCQkJCQkqZW5kID0gRU9TOworCQkJCQlzdHIgPSBzbnB0cmVlZihOVUxMLCA2NCwgIiVTIiwgYmVnKTsKKwkJCQkJYWZyZWUoYmVnLCBBVEVNUCk7CisJCQkJCWVycm9yZigiJXM6IGJhZCBzdWJzdGl0dXRpb24iLCBzdHIpOworCQkJCX0KKwkJCQlpZiAoZiAmIERPQkxBTkspCisJCQkJCWRvYmxhbmsrKzsKKwkJCQl0aWxkZV9vayA9IDA7CisJCQkJaWYgKHR5cGUgPT0gWEJBU0UpIHsJLyogZXhwYW5kPyAqLworCQkJCQlpZiAoIXN0LT5uZXh0KSB7CisJCQkJCQlTdWJUeXBlICpuZXdzdDsKKworCQkJCQkJbmV3c3QgPSBhbGxvYyhzaXplb2YoU3ViVHlwZSksIEFURU1QKTsKKwkJCQkJCW5ld3N0LT5uZXh0ID0gTlVMTDsKKwkJCQkJCW5ld3N0LT5wcmV2ID0gc3Q7CisJCQkJCQlzdC0+bmV4dCA9IG5ld3N0OworCQkJCQl9CisJCQkJCXN0ID0gc3QtPm5leHQ7CisJCQkJCXN0LT5zdHlwZSA9IHN0eXBlOworCQkJCQlzdC0+YmFzZSA9IFhzYXZlcG9zKGRzLCBkcCk7CisJCQkJCXN0LT5mID0gZjsKKwkJCQkJc3QtPnZhciA9IHgudmFyOworCQkJCQlzdC0+cXVvdGV3ID0gc3QtPnF1b3RlcCA9IHF1b3RlOworCQkJCQkvKiBza2lwIHF1YWxpZmllcihzKSAqLworCQkJCQlpZiAoc3R5cGUpCisJCQkJCQlzcCArPSBzbGVuOworCQkJCQlzd2l0Y2ggKHN0eXBlICYgMHg3ZikgeworCQkJCQljYXNlICcwJzogeworCQkJCQkJY2hhciAqYmVnLCAqbWlkLCAqZW5kLCAqc3RnOworCQkJCQkJbWtzaF9hcmlfdCBmcm9tID0gMCwgbnVtID0gLTEsIGZsZW4sIGZpbmMgPSAwOworCisJCQkJCQliZWcgPSB3ZGNvcHkoc3AsIEFURU1QKTsKKwkJCQkJCW1pZCA9IGJlZyArICh3ZHNjYW4oc3AsIEFERUxJTSkgLSBzcCk7CisJCQkJCQlzdGcgPSBiZWcgKyAod2RzY2FuKHNwLCBDU1VCU1QpIC0gc3ApOworCQkJCQkJaWYgKG1pZCA+PSBzdGcpCisJCQkJCQkJZ290byB1bndpbmRfc3Vic3RzeW47CisJCQkJCQltaWRbLTJdID0gRU9TOworCQkJCQkJaWYgKG1pZFstMV0gPT0gLyp7Ki8nfScpIHsKKwkJCQkJCQlzcCArPSBtaWQgLSBiZWcgLSAxOworCQkJCQkJCWVuZCA9IE5VTEw7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWVuZCA9IG1pZCArCisJCQkJCQkJICAgICh3ZHNjYW4obWlkLCBBREVMSU0pIC0gbWlkKTsKKwkJCQkJCQlpZiAoZW5kID49IHN0ZykKKwkJCQkJCQkJZ290byB1bndpbmRfc3Vic3RzeW47CisJCQkJCQkJZW5kWy0yXSA9IEVPUzsKKwkJCQkJCQlzcCArPSBlbmQgLSBiZWcgLSAxOworCQkJCQkJfQorCQkJCQkJZXZhbHVhdGUoc3Vic3RpdHV0ZShzdGcgPSB3ZHN0cmlwKGJlZywgZmFsc2UsIGZhbHNlKSwgMCksCisJCQkJCQkgICAgJmZyb20sIEtTSF9VTldJTkRfRVJST1IsIHRydWUpOworCQkJCQkJYWZyZWUoc3RnLCBBVEVNUCk7CisJCQkJCQlpZiAoZW5kKSB7CisJCQkJCQkJZXZhbHVhdGUoc3Vic3RpdHV0ZShzdGcgPSB3ZHN0cmlwKG1pZCwgZmFsc2UsIGZhbHNlKSwgMCksCisJCQkJCQkJICAgICZudW0sIEtTSF9VTldJTkRfRVJST1IsIHRydWUpOworCQkJCQkJCWFmcmVlKHN0ZywgQVRFTVApOworCQkJCQkJfQorCQkJCQkJYWZyZWUoYmVnLCBBVEVNUCk7CisJCQkJCQliZWcgPSBzdHJfdmFsKHN0LT52YXIpOworCQkJCQkJZmxlbiA9IHV0ZmxlbihiZWcpOworCQkJCQkJaWYgKGZyb20gPCAwKSB7CisJCQkJCQkJaWYgKC1mcm9tIDwgZmxlbikKKwkJCQkJCQkJZmluYyA9IGZsZW4gKyBmcm9tOworCQkJCQkJfSBlbHNlCisJCQkJCQkJZmluYyA9IGZyb20gPCBmbGVuID8gZnJvbSA6IGZsZW47CisJCQkJCQlpZiAoVVRGTU9ERSkKKwkJCQkJCQl1dGZpbmNwdHIoYmVnLCAmZmluYyk7CisJCQkJCQliZWcgKz0gZmluYzsKKwkJCQkJCWZsZW4gPSB1dGZsZW4oYmVnKTsKKwkJCQkJCWlmIChudW0gPCAwIHx8IG51bSA+IGZsZW4pCisJCQkJCQkJbnVtID0gZmxlbjsKKwkJCQkJCWlmIChVVEZNT0RFKQorCQkJCQkJCXV0ZmluY3B0cihiZWcsICZudW0pOworCQkJCQkJc3RybmR1cHgoeC5zdHIsIGJlZywgbnVtLCBBVEVNUCk7CisJCQkJCQlnb3RvIGRvX0NTVUJTVDsKKwkJCQkJfQorCQkJCQljYXNlICcvJzogeworCQkJCQkJY2hhciAqcywgKnAsICpkLCAqc2JlZywgKmVuZDsKKwkJCQkJCWNoYXIgKnBhdCwgKnJyZXA7CisJCQkJCQljaGFyICp0cGF0MCwgKnRwYXQxLCAqdHBhdDI7CisKKwkJCQkJCXMgPSB3ZGNvcHkoc3AsIEFURU1QKTsKKwkJCQkJCXAgPSBzICsgKHdkc2NhbihzcCwgQURFTElNKSAtIHNwKTsKKwkJCQkJCWQgPSBzICsgKHdkc2NhbihzcCwgQ1NVQlNUKSAtIHNwKTsKKwkJCQkJCWlmIChwID49IGQpCisJCQkJCQkJZ290byB1bndpbmRfc3Vic3RzeW47CisJCQkJCQlwWy0yXSA9IEVPUzsKKwkJCQkJCWlmIChwWy0xXSA9PSAvKnsqLyd9JykKKwkJCQkJCQlkID0gTlVMTDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlkWy0yXSA9IEVPUzsKKwkJCQkJCXNwICs9IChkID8gZCA6IHApIC0gcyAtIDE7CisJCQkJCQl0cGF0MCA9IHdkc3RyaXAocywgdHJ1ZSwgdHJ1ZSk7CisJCQkJCQlwYXQgPSBzdWJzdGl0dXRlKHRwYXQwLCAwKTsKKwkJCQkJCWlmIChkKSB7CisJCQkJCQkJZCA9IHdkc3RyaXAocCwgdHJ1ZSwgZmFsc2UpOworCQkJCQkJCXJyZXAgPSBzdWJzdGl0dXRlKGQsIDApOworCQkJCQkJCWFmcmVlKGQsIEFURU1QKTsKKwkJCQkJCX0gZWxzZQorCQkJCQkJCXJyZXAgPSBudWxsOworCQkJCQkJYWZyZWUocywgQVRFTVApOworCQkJCQkJcyA9IGQgPSBwYXQ7CisJCQkJCQl3aGlsZSAoKnMpCisJCQkJCQkJaWYgKCpzICE9ICdcXCcgfHwKKwkJCQkJCQkgICAgc1sxXSA9PSAnJScgfHwKKwkJCQkJCQkgICAgc1sxXSA9PSAnIycgfHwKKwkJCQkJCQkgICAgc1sxXSA9PSAnXDAnIHx8CisJCQkJLyogWFhYIHJlYWxseT8gKi8JICAgIHNbMV0gPT0gJ1xcJyB8fAorCQkJCQkJCSAgICBzWzFdID09ICcvJykKKwkJCQkJCQkJKmQrKyA9ICpzKys7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlzKys7CisJCQkJCQkqZCA9ICdcMCc7CisJCQkJCQlhZnJlZSh0cGF0MCwgQVRFTVApOworCisJCQkJCQkvKiByZWplY3QgZW1wdHkgcGF0dGVybiAqLworCQkJCQkJaWYgKCEqcGF0IHx8IGdtYXRjaHgoIiIsIHBhdCwgZmFsc2UpKQorCQkJCQkJCWdvdG8gbm9fcmVwbDsKKworCQkJCQkJLyogcHJlcGFyZSBzdHJpbmcgb24gd2hpY2ggdG8gd29yayAqLworCQkJCQkJc3RyZHVweChzLCBzdHJfdmFsKHN0LT52YXIpLCBBVEVNUCk7CisJCQkJCQlzYmVnID0gczsKKworCQkJCQkJLyogZmlyc3Qgc2VlIGlmIHdlIGhhdmUgYW55IG1hdGNoIGF0IGFsbCAqLworCQkJCQkJdHBhdDAgPSBwYXQ7CisJCQkJCQlpZiAoKnBhdCA9PSAnIycpIHsKKwkJCQkJCQkvKiBhbmNob3IgYXQgdGhlIGJlZ2lubmluZyAqLworCQkJCQkJCXRwYXQxID0gc2hmX3NtcHJpbnRmKCIlcyVjKiIsICsrdHBhdDAsIE1BR0lDKTsKKwkJCQkJCQl0cGF0MiA9IHRwYXQxOworCQkJCQkJfSBlbHNlIGlmICgqcGF0ID09ICclJykgeworCQkJCQkJCS8qIGFuY2hvciBhdCB0aGUgZW5kICovCisJCQkJCQkJdHBhdDEgPSBzaGZfc21wcmludGYoIiVjKiVzIiwgTUFHSUMsICsrdHBhdDApOworCQkJCQkJCXRwYXQyID0gdHBhdDA7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8qIGZsb2F0ICovCisJCQkJCQkJdHBhdDEgPSBzaGZfc21wcmludGYoIiVjKiVzJWMqIiwgTUFHSUMsIHBhdCwgTUFHSUMpOworCQkJCQkJCXRwYXQyID0gdHBhdDEgKyAyOworCQkJCQkJfQorIGFnYWluX3JlcGw6CisJCQkJCQkvKiB0aGlzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkgaWYgZ21hdGNoeCB3b3VsZCByZXR1cm4KKwkJCQkJCSAqIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcyBvZiBhIG1hdGNoIGZvdW5kLCBsaWtlIHJlKgorCQkJCQkJICovCisJCQkJCQlpZiAoIWdtYXRjaHgoc2JlZywgdHBhdDEsIGZhbHNlKSkKKwkJCQkJCQlnb3RvIGVuZF9yZXBsOworCQkJCQkJZW5kID0gc3RybnVsKHMpOworCQkJCQkJLyogbm93IGFuY2hvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYXRjaCAqLworCQkJCQkJaWYgKCpwYXQgIT0gJyMnKQorCQkJCQkJCXdoaWxlIChzYmVnIDw9IGVuZCkgeworCQkJCQkJCQlpZiAoZ21hdGNoeChzYmVnLCB0cGF0MiwgZmFsc2UpKQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCXNiZWcrKzsKKwkJCQkJCQl9CisJCQkJCQkvKiBub3cgYW5jaG9yIHRoZSBlbmQgb2YgdGhlIG1hdGNoICovCisJCQkJCQlwID0gZW5kOworCQkJCQkJaWYgKCpwYXQgIT0gJyUnKQorCQkJCQkJCXdoaWxlIChwID49IHNiZWcpIHsKKwkJCQkJCQkJYm9vbCBnb3RtYXRjaDsKKworCQkJCQkJCQljID0gKnA7ICpwID0gJ1wwJzsKKwkJCQkJCQkJZ290bWF0Y2ggPSBnbWF0Y2h4KHNiZWcsIHRwYXQwLCBmYWxzZSk7CisJCQkJCQkJCSpwID0gYzsKKwkJCQkJCQkJaWYgKGdvdG1hdGNoKQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCXAtLTsKKwkJCQkJCQl9CisJCQkJCQlzdHJuZHVweChlbmQsIHMsIHNiZWcgLSBzLCBBVEVNUCk7CisJCQkJCQlkID0gc2hmX3NtcHJpbnRmKCIlcyVzJXMiLCBlbmQsIHJyZXAsIHApOworCQkJCQkJYWZyZWUoZW5kLCBBVEVNUCk7CisJCQkJCQlzYmVnID0gZCArIChzYmVnIC0gcykgKyBzdHJsZW4ocnJlcCk7CisJCQkJCQlhZnJlZShzLCBBVEVNUCk7CisJCQkJCQlzID0gZDsKKwkJCQkJCWlmIChzdHlwZSAmIDB4ODApCisJCQkJCQkJZ290byBhZ2Fpbl9yZXBsOworIGVuZF9yZXBsOgorCQkJCQkJYWZyZWUodHBhdDEsIEFURU1QKTsKKwkJCQkJCXguc3RyID0gczsKKyBub19yZXBsOgorCQkJCQkJYWZyZWUocGF0LCBBVEVNUCk7CisJCQkJCQlpZiAocnJlcCAhPSBudWxsKQorCQkJCQkJCWFmcmVlKHJyZXAsIEFURU1QKTsKKwkJCQkJCWdvdG8gZG9fQ1NVQlNUOworCQkJCQl9CisJCQkJCWNhc2UgJyMnOgorCQkJCQljYXNlICclJzoKKwkJCQkJCS8qICEgRE9CTEFOSyxET0JSQUNFXyxET1RJTERFICovCisJCQkJCQlmID0gRE9QQVQgfCAoZiZET05UUlVOQ09NTUFORCkgfAorCQkJCQkJICAgIERPVEVNUF87CisJCQkJCQlzdC0+cXVvdGV3ID0gcXVvdGUgPSAwOworCQkJCQkJLyogUHJlcGVuZCBvcGVuIHBhdHRlcm4gKHNvIHwKKwkJCQkJCSAqIGluIGEgdHJpbSB3aWxsIHdvcmsgYXMKKwkJCQkJCSAqIGV4cGVjdGVkKQorCQkJCQkJICovCisJCQkJCQkqZHArKyA9IE1BR0lDOworCQkJCQkJKmRwKysgPSAoY2hhcikoJ0AnIHwgMHg4MCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnPSc6CisJCQkJCQkvKiBFbmFibGluZyB0aWxkZSBleHBhbnNpb24KKwkJCQkJCSAqIGFmdGVyIDpzIGhlcmUgaXMKKwkJCQkJCSAqIG5vbi1zdGFuZGFyZCBrc2gsIGJ1dCBpcworCQkJCQkJICogY29uc2lzdGVudCB3aXRoIHJ1bGVzIGZvcgorCQkJCQkJICogb3RoZXIgYXNzaWdubWVudHMuIE5vdAorCQkJCQkJICogc3VyZSB3aGF0IFBPU0lYIHRoaW5rcyBvZgorCQkJCQkJICogdGhpcy4KKwkJCQkJCSAqIE5vdCBkb2luZyB0aWxkZSBleHBhbnNpb24KKwkJCQkJCSAqIGZvciBpbnRlZ2VyIHZhcmlhYmxlcyBpcyBhCisJCQkJCQkgKiBub24tUE9TSVggdGhpbmcgLSBtYWtlcworCQkJCQkJICogc2Vuc2UgdGhvdWdoLCBzaW5jZSB+IGlzCisJCQkJCQkgKiBhIGFyaXRobWV0aWMgb3BlcmF0b3IuCisJCQkJCQkgKi8KKwkJCQkJCWlmICghKHgudmFyLT5mbGFnICYgSU5URUdFUikpCisJCQkJCQkJZiB8PSBET0FTTlRJTERFfERPVElMREU7CisJCQkJCQlmIHw9IERPVEVNUF87CisJCQkJCQkvKiBUaGVzZSB3aWxsIGJlIGRvbmUgYWZ0ZXIgdGhlCisJCQkJCQkgKiB2YWx1ZSBoYXMgYmVlbiBhc3NpZ25lZC4KKwkJCQkJCSAqLworCQkJCQkJZiAmPSB+KERPQkxBTkt8RE9HTE9CfERPQlJBQ0VfKTsKKwkJCQkJCXRpbGRlX29rID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICc/JzoKKwkJCQkJCWYgJj0gfkRPQkxBTks7CisJCQkJCQlmIHw9IERPVEVNUF87CisJCQkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJCQlkZWZhdWx0OgorCQkJCQkJLyogRW5hYmxlIHRpbGRlIGV4cGFuc2lvbiAqLworCQkJCQkJdGlsZGVfb2sgPSAxOworCQkJCQkJZiB8PSBET1RJTERFOworCQkJCQl9CisJCQkJfSBlbHNlCisJCQkJCS8qIHNraXAgd29yZCAqLworCQkJCQlzcCArPSB3ZHNjYW4oc3AsIENTVUJTVCkgLSBzcDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNhc2UgQ1NVQlNUOiAvKiBvbmx5IGdldCBoZXJlIGlmIGV4cGFuZGluZyB3b3JkICovCisgZG9fQ1NVQlNUOgorCQkJCXNwKys7IC8qICh7KSBza2lwIHRoZSB9IG9yIHggKi8KKwkJCQl0aWxkZV9vayA9IDA7CS8qIGluIGNhc2Ugb2YgJHt1bnNldDotfSAqLworCQkJCSpkcCA9ICdcMCc7CisJCQkJcXVvdGUgPSBzdC0+cXVvdGVwOworCQkJCWYgPSBzdC0+ZjsKKwkJCQlpZiAoZiZET0JMQU5LKQorCQkJCQlkb2JsYW5rLS07CisJCQkJc3dpdGNoIChzdC0+c3R5cGUmMHg3ZikgeworCQkJCWNhc2UgJyMnOgorCQkJCWNhc2UgJyUnOgorCQkJCQkvKiBBcHBlbmQgZW5kLXBhdHRlcm4gKi8KKwkJCQkJKmRwKysgPSBNQUdJQzsgKmRwKysgPSAnKSc7ICpkcCA9ICdcMCc7CisJCQkJCWRwID0gWHJlc3Rwb3MoZHMsIGRwLCBzdC0+YmFzZSk7CisJCQkJCS8qIE11c3QgdXNlIHN0LT52YXIgc2luY2UgY2FsbGluZworCQkJCQkgKiBnbG9iYWwgd291bGQgYnJlYWsgdGhpbmdzCisJCQkJCSAqIGxpa2UgeFtpKz0xXS4KKwkJCQkJICovCisJCQkJCXguc3RyID0gdHJpbXN1YihzdHJfdmFsKHN0LT52YXIpLAorCQkJCQkJZHAsIHN0LT5zdHlwZSk7CisJCQkJCWlmICh4LnN0clswXSAhPSAnXDAnIHx8IHN0LT5xdW90ZXApCisJCQkJCQl0eXBlID0gWFNVQjsKKwkJCQkJZWxzZQorCQkJCQkJdHlwZSA9IFhOVUxMU1VCOworCQkJCQlpZiAoZiZET0JMQU5LKQorCQkJCQkJZG9ibGFuaysrOworCQkJCQlzdCA9IHN0LT5wcmV2OworCQkJCQljb250aW51ZTsKKwkJCQljYXNlICc9JzoKKwkJCQkJLyogUmVzdG9yZSBvdXIgcG9zaXRpb24gYW5kIHN1YnN0aXR1dGUKKwkJCQkJICogdGhlIHZhbHVlIG9mIHN0LT52YXIgKG1heSBub3QgYmUKKwkJCQkJICogdGhlIGFzc2lnbmVkIHZhbHVlIGluIHRoZSBwcmVzZW5jZQorCQkJCQkgKiBvZiBpbnRlZ2VyL3JpZ2h0LWFkai9ldGMgYXR0cmlidXRlcykuCisJCQkJCSAqLworCQkJCQlkcCA9IFhyZXN0cG9zKGRzLCBkcCwgc3QtPmJhc2UpOworCQkJCQkvKiBNdXN0IHVzZSBzdC0+dmFyIHNpbmNlIGNhbGxpbmcKKwkJCQkJICogZ2xvYmFsIHdvdWxkIGNhdXNlIHdpdGggdGhpbmdzCisJCQkJCSAqIGxpa2UgeFtpKz0xXSB0byBiZSBldmFsdWF0ZWQgdHdpY2UuCisJCQkJCSAqLworCQkJCQkvKiBOb3RlOiBub3QgZXhwb3J0ZWQgYnkgRkVYUE9SVAorCQkJCQkgKiBpbiBBVCZUIGtzaC4KKwkJCQkJICovCisJCQkJCS8qIFhYWCBQT1NJWCBzYXlzIHJlYWRvbmx5IGlzIG9ubHkKKwkJCQkJICogZmF0YWwgZm9yIHNwZWNpYWwgYnVpbHRpbnMgKHNldHN0cgorCQkJCQkgKiBkb2VzIHJlYWRvbmx5IGNoZWNrKS4KKwkJCQkJICovCisJCQkJCWxlbiA9IHN0cmxlbihkcCkgKyAxOworCQkJCQlzZXRzdHIoc3QtPnZhciwKKwkJCQkJICAgIGRlYnVuayhhbGxvYyhsZW4sIEFURU1QKSwKKwkJCQkJICAgIGRwLCBsZW4pLCBLU0hfVU5XSU5EX0VSUk9SKTsKKwkJCQkJeC5zdHIgPSBzdHJfdmFsKHN0LT52YXIpOworCQkJCQl0eXBlID0gWFNVQjsKKwkJCQkJaWYgKGYmRE9CTEFOSykKKwkJCQkJCWRvYmxhbmsrKzsKKwkJCQkJc3QgPSBzdC0+cHJldjsKKwkJCQkJY29udGludWU7CisJCQkJY2FzZSAnPyc6IHsKKwkJCQkJY2hhciAqcyA9IFhyZXN0cG9zKGRzLCBkcCwgc3QtPmJhc2UpOworCisJCQkJCWVycm9yZigiJXM6ICVzIiwgc3QtPnZhci0+bmFtZSwKKwkJCQkJICAgIGRwID09IHMgPworCQkJCQkgICAgInBhcmFtZXRlciBudWxsIG9yIG5vdCBzZXQiIDoKKwkJCQkJICAgIChkZWJ1bmsocywgcywgc3RybGVuKHMpICsgMSksIHMpKTsKKwkJCQl9CisJCQkJY2FzZSAnMCc6CisJCQkJY2FzZSAnLyc6CisJCQkJCWRwID0gWHJlc3Rwb3MoZHMsIGRwLCBzdC0+YmFzZSk7CisJCQkJCXR5cGUgPSBYU1VCOworCQkJCQlpZiAoZiZET0JMQU5LKQorCQkJCQkJZG9ibGFuaysrOworCQkJCQlzdCA9IHN0LT5wcmV2OworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJc3QgPSBzdC0+cHJldjsKKwkJCQl0eXBlID0gWEJBU0U7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgT1BBVDogLyogb3BlbiBwYXR0ZXJuOiAqKGZvb3xiYXIpICovCisJCQkJLyogTmV4dCBjaGFyIGlzIHRoZSB0eXBlIG9mIHBhdHRlcm4gKi8KKwkJCQltYWtlX21hZ2ljID0gMTsKKwkJCQljID0gKnNwKysgKyAweDgwOworCQkJCWJyZWFrOworCisJCQljYXNlIFNQQVQ6IC8qIHBhdHRlcm4gc2VwYXJhdG9yICh8KSAqLworCQkJCW1ha2VfbWFnaWMgPSAxOworCQkJCWMgPSAnfCc7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ1BBVDogLyogY2xvc2UgcGF0dGVybiAqLworCQkJCW1ha2VfbWFnaWMgPSAxOworCQkJCWMgPSAvKigqLyAnKSc7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFhOVUxMU1VCOgorCQkJLyogU3BlY2lhbCBjYXNlIGZvciAiJEAiIChhbmQgIiR7Zm9vW0BdfSIpIC0gbm8KKwkJCSAqIHdvcmQgaXMgZ2VuZXJhdGVkIGlmICQjIGlzIDAgKHVubGVzcyB0aGVyZSBpcworCQkJICogb3RoZXIgc3R1ZmYgaW5zaWRlIHRoZSBxdW90ZXMpLgorCQkJICovCisJCQl0eXBlID0gWEJBU0U7CisJCQlpZiAoZiZET0JMQU5LKSB7CisJCQkJZG9ibGFuay0tOworCQkJCS8qIG5vdCByZWFsbHkgY29ycmVjdDogeD07ICIkeCRAIiBzaG91bGQKKwkJCQkgKiBnZW5lcmF0ZSBhIG51bGwgYXJndW1lbnQgYW5kCisJCQkJICogc2V0IEE7ICIke0A6K30iIHNob3VsZG4ndC4KKwkJCQkgKi8KKwkJCQlpZiAoZHAgPT0gWHN0cmluZyhkcywgZHApKQorCQkJCQl3b3JkID0gSUZTX1dTOworCQkJfQorCQkJY29udGludWU7CisKKwkJY2FzZSBYU1VCOgorCQljYXNlIFhTVUJNSUQ6CisJCQlpZiAoKGMgPSAqeC5zdHIrKykgPT0gMCkgeworCQkJCXR5cGUgPSBYQkFTRTsKKwkJCQlpZiAoZiZET0JMQU5LKQorCQkJCQlkb2JsYW5rLS07CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFhBUkdTRVA6CisJCQl0eXBlID0gWEFSRzsKKwkJCXF1b3RlID0gMTsKKwkJY2FzZSBYQVJHOgorCQkJaWYgKChjID0gKnguc3RyKyspID09ICdcMCcpIHsKKwkJCQkvKiBmb3JjZSBudWxsIHdvcmRzIHRvIGJlIGNyZWF0ZWQgc28KKwkJCQkgKiBzZXQgLS0gJycgMiAnJzsgZm9vICIkQCIgd2lsbCBkbworCQkJCSAqIHRoZSByaWdodCB0aGluZworCQkJCSAqLworCQkJCWlmIChxdW90ZSAmJiB4LnNwbGl0KQorCQkJCQl3b3JkID0gSUZTX1dPUkQ7CisJCQkJaWYgKCh4LnN0ciA9ICp4LnUuc3RydisrKSA9PSBOVUxMKSB7CisJCQkJCXR5cGUgPSBYQkFTRTsKKwkJCQkJaWYgKGYmRE9CTEFOSykKKwkJCQkJCWRvYmxhbmstLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWMgPSBpZnMwOworCQkJCWlmIChjID09IDApIHsKKwkJCQkJaWYgKHF1b3RlICYmICF4LnNwbGl0KQorCQkJCQkJY29udGludWU7CisJCQkJCWMgPSAnICc7CisJCQkJfQorCQkJCWlmIChxdW90ZSAmJiB4LnNwbGl0KSB7CisJCQkJCS8qIHRlcm1pbmF0ZSB3b3JkIGZvciAiJEAiICovCisJCQkJCXR5cGUgPSBYQVJHU0VQOworCQkJCQlxdW90ZSA9IDA7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBYQ09NOgorCQkJaWYgKG5ld2xpbmVzKSB7CQkvKiBTcGl0IG91dCBzYXZlZCBOTHMgKi8KKwkJCQljID0gJ1xuJzsKKwkJCQktLW5ld2xpbmVzOworCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAoKGMgPSBzaGZfZ2V0Yyh4LnUuc2hmKSkgPT0gMCB8fCBjID09ICdcbicpCisJCQkJCWlmIChjID09ICdcbicpCisJCQkJCQkvKiBTYXZlIG5ld2xpbmVzICovCisJCQkJCQluZXdsaW5lcysrOworCQkJCWlmIChuZXdsaW5lcyAmJiBjICE9IEVPRikgeworCQkJCQlzaGZfdW5nZXRjKGMsIHgudS5zaGYpOworCQkJCQljID0gJ1xuJzsKKwkJCQkJLS1uZXdsaW5lczsKKwkJCQl9CisJCQl9CisJCQlpZiAoYyA9PSBFT0YpIHsKKwkJCQluZXdsaW5lcyA9IDA7CisJCQkJc2hmX2Nsb3NlKHgudS5zaGYpOworCQkJCWlmICh4LnNwbGl0KQorCQkJCQlzdWJzdF9leHN0YXQgPSB3YWl0bGFzdCgpOworCQkJCXR5cGUgPSBYQkFTRTsKKwkJCQlpZiAoZiZET0JMQU5LKQorCQkJCQlkb2JsYW5rLS07CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIGNoZWNrIGZvciBlbmQgb2Ygd29yZCBvciBJRlMgc2VwYXJhdGlvbiAqLworCQlpZiAoYyA9PSAwIHx8ICghcXVvdGUgJiYgKGYgJiBET0JMQU5LKSAmJiBkb2JsYW5rICYmCisJCSAgICAhbWFrZV9tYWdpYyAmJiBjdHlwZShjLCBDX0lGUykpKSB7CisJCQkvKiBIb3cgd29yZHMgYXJlIGJyb2tlbiB1cDoKKwkJCSAqCQkJfAl2YWx1ZSBvZiBjCisJCQkgKgl3b3JkCQl8CXdzCW53cwkwCisJCQkgKgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJICoJSUZTX1dPUkQJCXcvV1MJdy9OV1MJdworCQkJICoJSUZTX1dTCQkJLS9XUwl3L05XUwktCisJCQkgKglJRlNfTldTCQkJLS9OV1MJdy9OV1MJdworCQkJICogKHcgbWVhbnMgZ2VuZXJhdGUgYSB3b3JkKQorCQkJICogTm90ZSB0aGF0IElGU19OV1MvMCBnZW5lcmF0ZXMgYSB3b3JkIChBVCZUIGtzaAorCQkJICogZG9lc24ndCBkbyB0aGlzLCBidXQgUE9TSVggZG9lcykuCisJCQkgKi8KKwkJCWlmICh3b3JkID09IElGU19XT1JEIHx8CisJCQkgICAgKCFjdHlwZShjLCBDX0lGU1dTKSAmJiBjICYmIHdvcmQgPT0gSUZTX05XUykpIHsKKwkJCQljaGFyICpwOworCisJCQkJKmRwKysgPSAnXDAnOworCQkJCXAgPSBYY2xvc2UoZHMsIGRwKTsKKwkJCQlpZiAoZmRvICYgRE9CUkFDRV8pCisJCQkJCS8qIGFsc28gZG9lcyBnbG9iYmluZyAqLworCQkJCQlhbHRfZXhwYW5kKHdwLCBwLCBwLAorCQkJCQkgICAgcCArIFhsZW5ndGgoZHMsIChkcCAtIDEpKSwKKwkJCQkJICAgIGZkbyB8IChmICYgRE9NQVJLRElSUykpOworCQkJCWVsc2UgaWYgKGZkbyAmIERPR0xPQikKKwkJCQkJZ2xvYihwLCB3cCwgZiAmIERPTUFSS0RJUlMpOworCQkJCWVsc2UgaWYgKChmICYgRE9QQVQpIHx8ICEoZmRvICYgRE9NQUdJQ18pKQorCQkJCQlYUHB1dCgqd3AsIHApOworCQkJCWVsc2UKKwkJCQkJWFBwdXQoKndwLCBkZWJ1bmsocCwgcCwgc3RybGVuKHApICsgMSkpOworCQkJCWZkbyA9IDA7CisJCQkJc2F3X2VxID0gMDsKKwkJCQl0aWxkZV9vayA9IChmICYgKERPVElMREV8RE9BU05USUxERSkpID8gMSA6IDA7CisJCQkJaWYgKGMgIT0gMCkKKwkJCQkJWGluaXQoZHMsIGRwLCAxMjgsIEFURU1QKTsKKwkJCX0KKwkJCWlmIChjID09IDApCisJCQkJcmV0dXJuOworCQkJaWYgKHdvcmQgIT0gSUZTX05XUykKKwkJCQl3b3JkID0gY3R5cGUoYywgQ19JRlNXUykgPyBJRlNfV1MgOiBJRlNfTldTOworCQl9IGVsc2UgeworCQkJaWYgKHR5cGUgPT0gWFNVQikgeworCQkJCWlmICh3b3JkID09IElGU19OV1MgJiYKKwkJCQkgICAgWGxlbmd0aChkcywgZHApID09IDApIHsKKwkJCQkJY2hhciAqcDsKKworCQkJCQkqKHAgPSBhbGxvYygxLCBBVEVNUCkpID0gJ1wwJzsKKwkJCQkJWFBwdXQoKndwLCBwKTsKKwkJCQl9CisJCQkJdHlwZSA9IFhTVUJNSUQ7CisJCQl9CisKKwkJCS8qIGFnZSB0aWxkZV9vayBpbmZvIC0gfiBjb2RlIHRlc3RzIHNlY29uZCBiaXQgKi8KKwkJCXRpbGRlX29rIDw8PSAxOworCQkJLyogbWFyayBhbnkgc3BlY2lhbCBzZWNvbmQgcGFzcyBjaGFycyAqLworCQkJaWYgKCFxdW90ZSkKKwkJCQlzd2l0Y2ggKGMpIHsKKwkJCQljYXNlICdbJzoKKwkJCQljYXNlIE5PVDoKKwkJCQljYXNlICctJzoKKwkJCQljYXNlICddJzoKKwkJCQkJLyogRm9yIGNoYXJhY3RlciBjbGFzc2VzIC0gZG9lc24ndCBodXJ0CisJCQkJCSAqIHRvIGhhdmUgbWFnaWMgISwtLF1zIG91dHNpZGUgb2YKKwkJCQkJICogWy4uLl0gZXhwcmVzc2lvbnMuCisJCQkJCSAqLworCQkJCQlpZiAoZiAmIChET1BBVCB8IERPR0xPQikpIHsKKwkJCQkJCWZkbyB8PSBET01BR0lDXzsKKwkJCQkJCWlmIChjID09ICdbJykKKwkJCQkJCQlmZG8gfD0gZiAmIERPR0xPQjsKKwkJCQkJCSpkcCsrID0gTUFHSUM7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnKic6CisJCQkJY2FzZSAnPyc6CisJCQkJCWlmIChmICYgKERPUEFUIHwgRE9HTE9CKSkgeworCQkJCQkJZmRvIHw9IERPTUFHSUNfIHwgKGYgJiBET0dMT0IpOworCQkJCQkJKmRwKysgPSBNQUdJQzsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIE9CUkFDRToKKwkJCQljYXNlICcsJzoKKwkJCQljYXNlIENCUkFDRToKKwkJCQkJaWYgKChmICYgRE9CUkFDRV8pICYmIChjID09IE9CUkFDRSB8fAorCQkJCQkgICAgKGZkbyAmIERPQlJBQ0VfKSkpIHsKKwkJCQkJCWZkbyB8PSBET0JSQUNFX3xET01BR0lDXzsKKwkJCQkJCSpkcCsrID0gTUFHSUM7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnPSc6CisJCQkJCS8qIE5vdGUgZmlyc3QgdW5xdW90ZWQgPSBmb3IgfiAqLworCQkJCQlpZiAoIShmICYgRE9URU1QXykgJiYgIXNhd19lcSAmJgorCQkJCQkgICAgKEZsYWcoRkJSQUNFRVhQQU5EKSB8fAorCQkJCQkgICAgKGYgJiBET0FTTlRJTERFKSkpIHsKKwkJCQkJCXNhd19lcSA9IDE7CisJCQkJCQl0aWxkZV9vayA9IDE7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnOic6IC8qIDogKi8KKwkJCQkJLyogTm90ZSB1bnF1b3RlZCA6IGZvciB+ICovCisJCQkJCWlmICghKGYgJiBET1RFTVBfKSAmJiAoZiAmIERPQVNOVElMREUpKQorCQkJCQkJdGlsZGVfb2sgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICd+JzoKKwkJCQkJLyogdGlsZGVfb2sgaXMgcmVzZXQgd2hlbmV2ZXIKKwkJCQkJICogYW55IG9mICcgIiAkKCAkKCggJHsgfSBhcmUgc2Vlbi4KKwkJCQkJICogTm90ZSB0aGF0IHRpbGRlX29rIG11c3QgYmUgcHJlc2VydmVkCisJCQkJCSAqIHRocm91Z2ggdGhlIHNlcXVlbmNlICR7QT1hPX1+CisJCQkJCSAqLworCQkJCQlpZiAodHlwZSA9PSBYQkFTRSAmJgorCQkJCQkgICAgKGYgJiAoRE9USUxERXxET0FTTlRJTERFKSkgJiYKKwkJCQkJICAgICh0aWxkZV9vayAmIDIpKSB7CisJCQkJCQljb25zdCBjaGFyICpwOworCQkJCQkJY2hhciAqZHBfeDsKKworCQkJCQkJZHBfeCA9IGRwOworCQkJCQkJcCA9IG1heWJlX2V4cGFuZF90aWxkZShzcCwKKwkJCQkJCSAgICAmZHMsICZkcF94LAorCQkJCQkJICAgIGYgJiBET0FTTlRJTERFKTsKKwkJCQkJCWlmIChwKSB7CisJCQkJCQkJaWYgKGRwICE9IGRwX3gpCisJCQkJCQkJCXdvcmQgPSBJRlNfV09SRDsKKwkJCQkJCQlkcCA9IGRwX3g7CisJCQkJCQkJc3AgPSBwOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWVsc2UKKwkJCQlxdW90ZSAmPSB+MjsgLyogdW5kbyB0ZW1wb3JhcnkgKi8KKworCQkJaWYgKG1ha2VfbWFnaWMpIHsKKwkJCQltYWtlX21hZ2ljID0gMDsKKwkJCQlmZG8gfD0gRE9NQUdJQ18gfCAoZiAmIERPR0xPQik7CisJCQkJKmRwKysgPSBNQUdJQzsKKwkJCX0gZWxzZSBpZiAoSVNNQUdJQyhjKSkgeworCQkJCWZkbyB8PSBET01BR0lDXzsKKwkJCQkqZHArKyA9IE1BR0lDOworCQkJfQorCQkJKmRwKysgPSBjOyAvKiBzYXZlIG91dHB1dCBjaGFyICovCisJCQl3b3JkID0gSUZTX1dPUkQ7CisJCX0KKwl9Cit9CisKKy8qCisgKiBQcmVwYXJlIHRvIGdlbmVyYXRlIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgJHt9IHN1YnN0aXR1dGlvbi4KKyAqLworc3RhdGljIGludAordmFyc3ViKEV4cGFuZCAqeHAsIGNvbnN0IGNoYXIgKnNwLCBjb25zdCBjaGFyICp3b3JkLAorICAgIGludCAqc3R5cGVwLAkvKiBiZWNvbWVzIHF1YWxpZmllciB0eXBlICovCisgICAgaW50ICpzbGVucCkJCS8qICIgIiBsZW4gKD0sIDo9LCBldGMuKSB2YWxpZCBpZmYgKnN0eXBlcCAhPSAwICovCit7CisJaW50IGM7CisJaW50IHN0YXRlOwkvKiBuZXh0IHN0YXRlOiBYQkFTRSwgWEFSRywgWFNVQiwgWE5VTExTVUIgKi8KKwlpbnQgc3R5cGU7CS8qIHN1YnN0aXR1dGlvbiB0eXBlICovCisJaW50IHNsZW47CisJY29uc3QgY2hhciAqcDsKKwlzdHJ1Y3QgdGJsICp2cDsKKwlib29sIHplcm9fb2sgPSBmYWxzZTsKKworCWlmICgoc3R5cGUgPSBzcFswXSkgPT0gJ1wwJykJLyogQmFkIHZhcmlhYmxlIG5hbWUgKi8KKwkJcmV0dXJuICgtMSk7CisKKwl4cC0+dmFyID0gTlVMTDsKKworCS8qLQorCSAqICR7I3Zhcn0sIHN0cmluZyBsZW5ndGggKC1VOiBjaGFyYWN0ZXJzLCArVTogb2N0ZXRzKSBvciBhcnJheSBzaXplCisJICogJHsldmFyfSwgc3RyaW5nIHdpZHRoICgtVTogc2NyZWVuIGNvbHVtbnMsICtVOiBvY3RldHMpCisJICovCisJYyA9IHNwWzFdOworCWlmIChzdHlwZSA9PSAnJScgJiYgYyA9PSAnXDAnKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAoKHN0eXBlID09ICcjJyB8fCBzdHlwZSA9PSAnJScpICYmIGMgIT0gJ1wwJykgeworCQkvKiBDYW4ndCBoYXZlIGFueSBtb2RpZmllcnMgZm9yICR7Iy4uLn0gb3IgJHslLi4ufSAqLworCQlpZiAoKndvcmQgIT0gQ1NVQlNUKQorCQkJcmV0dXJuICgtMSk7CisJCXNwKys7CisJCS8qIENoZWNrIGZvciBzaXplIG9mIGFycmF5ICovCisJCWlmICgocCA9IGNzdHJjaHIoc3AsICdbJykpICYmIChwWzFdID09ICcqJyB8fCBwWzFdID09ICdAJykgJiYKKwkJICAgIHBbMl0gPT0gJ10nKSB7CisJCQlpbnQgbiA9IDA7CisKKwkJCWlmIChzdHlwZSAhPSAnIycpCisJCQkJcmV0dXJuICgtMSk7CisJCQl2cCA9IGdsb2JhbChhcnJheW5hbWUoc3ApKTsKKwkJCWlmICh2cC0+ZmxhZyAmIChJU1NFVHxBUlJBWSkpCisJCQkJemVyb19vayA9IHRydWU7CisJCQlmb3IgKDsgdnA7IHZwID0gdnAtPnUuYXJyYXkpCisJCQkJaWYgKHZwLT5mbGFnICYgSVNTRVQpCisJCQkJCW4rKzsKKwkJCWMgPSBuOworCQl9IGVsc2UgaWYgKGMgPT0gJyonIHx8IGMgPT0gJ0AnKSB7CisJCQlpZiAoc3R5cGUgIT0gJyMnKQorCQkJCXJldHVybiAoLTEpOworCQkJYyA9IGUtPmxvYy0+YXJnYzsKKwkJfSBlbHNlIHsKKwkJCXAgPSBzdHJfdmFsKGdsb2JhbChzcCkpOworCQkJemVyb19vayA9IHAgIT0gbnVsbDsKKwkJCWlmIChzdHlwZSA9PSAnIycpCisJCQkJYyA9IHV0ZmxlbihwKTsKKwkJCWVsc2UgeworCQkJCS8qIHBhcnRpYWwgdXRmX21ic3dpZHRoIHJlaW1wbGVtZW50YXRpb24gKi8KKwkJCQljb25zdCBjaGFyICpzID0gcDsKKwkJCQl1bnNpZ25lZCBpbnQgd2M7CisJCQkJc2l6ZV90IGxlbjsKKwkJCQlpbnQgY3c7CisKKwkJCQljID0gMDsKKwkJCQl3aGlsZSAoKnMpIHsKKwkJCQkJaWYgKCFVVEZNT0RFIHx8IChsZW4gPSB1dGZfbWJ0b3djKCZ3YywKKwkJCQkJICAgIHMpKSA9PSAoc2l6ZV90KS0xKQorCQkJCQkJLyogbm90IFVURk1PREUgb3Igbm90IFVURi04ICovCisJCQkJCQl3YyA9ICh1bnNpZ25lZCBjaGFyKSgqcysrKTsKKwkJCQkJZWxzZQorCQkJCQkJLyogVVRGTU9ERSBhbmQgVVRGLTggKi8KKwkJCQkJCXMgKz0gbGVuOworCQkJCQkvKiB3YyA9PSBjaGFyIG9yIHdjaGFyIGF0IHMrKyAqLworCQkJCQlpZiAoKGN3ID0gdXRmX3djd2lkdGgod2MpKSA9PSAtMSkgeworCQkJCQkJLyogNjQ2LCA4ODU5LTEsIDEwNjQ2IEMwL0MxICovCisJCQkJCQljID0gLTE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljICs9IGN3OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoRmxhZyhGTk9VTlNFVCkgJiYgYyA9PSAwICYmICF6ZXJvX29rKQorCQkJZXJyb3JmKCIlczogcGFyYW1ldGVyIG5vdCBzZXQiLCBzcCk7CisJCSpzdHlwZXAgPSAwOyAvKiB1bnF1YWxpZmllZCB2YXJpYWJsZS9zdHJpbmcgc3Vic3RpdHV0aW9uICovCisJCXhwLT5zdHIgPSBzaGZfc21wcmludGYoIiVkIiwgYyk7CisJCXJldHVybiAoWFNVQik7CisJfQorCisJLyogQ2hlY2sgZm9yIHF1YWxpZmllcnMgaW4gd29yZCBwYXJ0ICovCisJc3R5cGUgPSAwOworCWMgPSB3b3JkW3NsZW4gPSAwXSA9PSBDSEFSID8gd29yZFsxXSA6IDA7CisJaWYgKGMgPT0gJzonKSB7CisJCXNsZW4gKz0gMjsKKwkJc3R5cGUgPSAweDgwOworCQljID0gd29yZFtzbGVuICsgMF0gPT0gQ0hBUiA/IHdvcmRbc2xlbiArIDFdIDogMDsKKwl9CisJaWYgKCFzdHlwZSAmJiBjID09ICcvJykgeworCQlzbGVuICs9IDI7CisJCXN0eXBlID0gYzsKKwkJaWYgKHdvcmRbc2xlbl0gPT0gQURFTElNKSB7CisJCQlzbGVuICs9IDI7CisJCQlzdHlwZSB8PSAweDgwOworCQl9CisJfSBlbHNlIGlmIChzdHlwZSA9PSAweDgwICYmIChjID09ICcgJyB8fCBjID09ICcwJykpIHsKKwkJc3R5cGUgfD0gJzAnOworCX0gZWxzZSBpZiAoY3R5cGUoYywgQ19TVUJPUDEpKSB7CisJCXNsZW4gKz0gMjsKKwkJc3R5cGUgfD0gYzsKKwl9IGVsc2UgaWYgKGN0eXBlKGMsIENfU1VCT1AyKSkgeyAvKiBOb3RlOiBrc2g4OCBhbGxvd3MgOiUsIDolJSwgZXRjICovCisJCXNsZW4gKz0gMjsKKwkJc3R5cGUgPSBjOworCQlpZiAod29yZFtzbGVuICsgMF0gPT0gQ0hBUiAmJiBjID09IHdvcmRbc2xlbiArIDFdKSB7CisJCQlzdHlwZSB8PSAweDgwOworCQkJc2xlbiArPSAyOworCQl9CisJfSBlbHNlIGlmIChzdHlwZSkJLyogOiBpcyBub3Qgb2sgKi8KKwkJcmV0dXJuICgtMSk7CisJaWYgKCFzdHlwZSAmJiAqd29yZCAhPSBDU1VCU1QpCisJCXJldHVybiAoLTEpOworCSpzdHlwZXAgPSBzdHlwZTsKKwkqc2xlbnAgPSBzbGVuOworCisJYyA9IHNwWzBdOworCWlmIChjID09ICcqJyB8fCBjID09ICdAJykgeworCQlzd2l0Y2ggKHN0eXBlICYgMHg3ZikgeworCQljYXNlICc9JzoJLyogY2FuJ3QgYXNzaWduIHRvIGEgdmVjdG9yICovCisJCWNhc2UgJyUnOgkvKiBjYW4ndCB0cmltIGEgdmVjdG9yICh5ZXQpICovCisJCWNhc2UgJyMnOgorCQljYXNlICcwJzoKKwkJY2FzZSAnLyc6CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlpZiAoZS0+bG9jLT5hcmdjID09IDApIHsKKwkJCXhwLT5zdHIgPSBudWxsOworCQkJeHAtPnZhciA9IGdsb2JhbChzcCk7CisJCQlzdGF0ZSA9IGMgPT0gJ0AnID8gWE5VTExTVUIgOiBYU1VCOworCQl9IGVsc2UgeworCQkJeHAtPnUuc3RydiA9IChjb25zdCBjaGFyICoqKWUtPmxvYy0+YXJndiArIDE7CisJCQl4cC0+c3RyID0gKnhwLT51LnN0cnYrKzsKKwkJCXhwLT5zcGxpdCA9IGMgPT0gJ0AnOyAvKiAkQCAqLworCQkJc3RhdGUgPSBYQVJHOworCQl9CisJCXplcm9fb2sgPSB0cnVlOwkvKiBQT1NJWCAyMDA5PyAqLworCX0gZWxzZSB7CisJCWlmICgocCA9IGNzdHJjaHIoc3AsICdbJykpICYmIChwWzFdID09ICcqJyB8fCBwWzFdID09ICdAJykgJiYKKwkJICAgIHBbMl0gPT0gJ10nKSB7CisJCQlYUHRyViB3djsKKworCQkJc3dpdGNoIChzdHlwZSAmIDB4N2YpIHsKKwkJCWNhc2UgJz0nOgkvKiBjYW4ndCBhc3NpZ24gdG8gYSB2ZWN0b3IgKi8KKwkJCWNhc2UgJyUnOgkvKiBjYW4ndCB0cmltIGEgdmVjdG9yICh5ZXQpICovCisJCQljYXNlICcjJzoKKwkJCWNhc2UgJz8nOgorCQkJY2FzZSAnMCc6CisJCQljYXNlICcvJzoKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJCVhQaW5pdCh3diwgMzIpOworCQkJaWYgKChjID0gc3BbMF0pID09ICchJykKKwkJCQkrK3NwOworCQkJdnAgPSBnbG9iYWwoYXJyYXluYW1lKHNwKSk7CisJCQlmb3IgKDsgdnA7IHZwID0gdnAtPnUuYXJyYXkpIHsKKwkJCQlpZiAoISh2cC0+ZmxhZyZJU1NFVCkpCisJCQkJCWNvbnRpbnVlOworCQkJCVhQcHV0KHd2LCBjID09ICchJyA/IHNoZl9zbXByaW50ZigiJWx1IiwKKwkJCQkgICAgYXJyYXlpbmRleCh2cCkpIDoKKwkJCQkgICAgc3RyX3ZhbCh2cCkpOworCQkJfQorCQkJaWYgKFhQc2l6ZSh3dikgPT0gMCkgeworCQkJCXhwLT5zdHIgPSBudWxsOworCQkJCXN0YXRlID0gcFsxXSA9PSAnQCcgPyBYTlVMTFNVQiA6IFhTVUI7CisJCQkJWFBmcmVlKHd2KTsKKwkJCX0gZWxzZSB7CisJCQkJWFBwdXQod3YsIDApOworCQkJCXhwLT51LnN0cnYgPSAoY29uc3QgY2hhciAqKilYUHB0cnYod3YpOworCQkJCXhwLT5zdHIgPSAqeHAtPnUuc3RydisrOworCQkJCXhwLT5zcGxpdCA9IHBbMV0gPT0gJ0AnOyAvKiAke2Zvb1tAXX0gKi8KKwkJCQlzdGF0ZSA9IFhBUkc7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBDYW4ndCBhc3NpZ24gdGhpbmdzIGxpa2UgJCEgb3IgJDEgKi8KKwkJCWlmICgoc3R5cGUgJiAweDdmKSA9PSAnPScgJiYKKwkJCSAgICBjdHlwZSgqc3AsIENfVkFSMSB8IENfRElHSVQpKQorCQkJCXJldHVybiAoLTEpOworCQkJaWYgKCpzcCA9PSAnIScgJiYgc3BbMV0pIHsKKwkJCQkrK3NwOworCQkJCXhwLT52YXIgPSBnbG9iYWwoc3ApOworCQkJCWlmIChjc3RyY2hyKHNwLCAnWycpKSB7CisJCQkJCWlmICh4cC0+dmFyLT5mbGFnICYgSVNTRVQpCisJCQkJCQl4cC0+c3RyID0gc2hmX3NtcHJpbnRmKCIlbHUiLAorCQkJCQkJICAgIGFycmF5aW5kZXgoeHAtPnZhcikpOworCQkJCQllbHNlCisJCQkJCQl4cC0+c3RyID0gbnVsbDsKKwkJCQl9IGVsc2UgaWYgKHhwLT52YXItPmZsYWcgJiBJU1NFVCkKKwkJCQkJeHAtPnN0ciA9IHhwLT52YXItPm5hbWU7CisJCQkJZWxzZQorCQkJCQl4cC0+c3RyID0gIjAiOwkvKiBrc2g5MyBjb21wYXQgKi8KKwkJCX0gZWxzZSB7CisJCQkJeHAtPnZhciA9IGdsb2JhbChzcCk7CisJCQkJeHAtPnN0ciA9IHN0cl92YWwoeHAtPnZhcik7CisJCQl9CisJCQlzdGF0ZSA9IFhTVUI7CisJCX0KKwl9CisKKwljID0gc3R5cGUmMHg3ZjsKKwkvKiB0ZXN0IHRoZSBjb21waWxlcidzIGNvZGUgZ2VuZXJhdG9yICovCisJaWYgKGN0eXBlKGMsIENfU1VCT1AyKSB8fCBzdHlwZSA9PSAoMHg4MCB8ICcwJykgfHwgYyA9PSAnLycgfHwKKwkgICAgKCgoc3R5cGUmMHg4MCkgPyAqeHAtPnN0cj09J1wwJyA6IHhwLT5zdHI9PW51bGwpID8gLyogdW5kZWY/ICovCisJICAgIGMgPT0gJz0nIHx8IGMgPT0gJy0nIHx8IGMgPT0gJz8nIDogYyA9PSAnKycpKQorCQlzdGF0ZSA9IFhCQVNFOwkvKiBleHBhbmQgd29yZCBpbnN0ZWFkIG9mIHZhcmlhYmxlIHZhbHVlICovCisJaWYgKEZsYWcoRk5PVU5TRVQpICYmIHhwLT5zdHIgPT0gbnVsbCAmJiAhemVyb19vayAmJgorCSAgICAoY3R5cGUoYywgQ19TVUJPUDIpIHx8IChzdGF0ZSAhPSBYQkFTRSAmJiBjICE9ICcrJykpKQorCQllcnJvcmYoIiVzOiBwYXJhbWV0ZXIgbm90IHNldCIsIHNwKTsKKwlyZXR1cm4gKHN0YXRlKTsKK30KKworLyoKKyAqIFJ1biB0aGUgY29tbWFuZCBpbiAkKC4uLikgYW5kIHJlYWQgaXRzIG91dHB1dC4KKyAqLworc3RhdGljIGludAorY29tc3ViKEV4cGFuZCAqeHAsIGNvbnN0IGNoYXIgKmNwKQoreworCVNvdXJjZSAqcywgKnNvbGQ7CisJc3RydWN0IG9wICp0OworCXN0cnVjdCBzaGYgKnNoZjsKKworCXMgPSBwdXNocyhTU1RSSU5HLCBBVEVNUCk7CisJcy0+c3RhcnQgPSBzLT5zdHIgPSBjcDsKKwlzb2xkID0gc291cmNlOworCXQgPSBjb21waWxlKHMpOworCWFmcmVlKHMsIEFURU1QKTsKKwlzb3VyY2UgPSBzb2xkOworCisJaWYgKHQgPT0gTlVMTCkKKwkJcmV0dXJuIChYQkFTRSk7CisKKwlpZiAodCAhPSBOVUxMICYmIHQtPnR5cGUgPT0gVENPTSAmJiAvKiAkKDxmaWxlKSAqLworCSAgICAqdC0+YXJncyA9PSBOVUxMICYmICp0LT52YXJzID09IE5VTEwgJiYgdC0+aW9hY3QgIT0gTlVMTCkgeworCQlzdHJ1Y3QgaW93b3JkICppbyA9ICp0LT5pb2FjdDsKKwkJY2hhciAqbmFtZTsKKworCQlpZiAoKGlvLT5mbGFnJklPVFlQRSkgIT0gSU9SRUFEKQorCQkJZXJyb3JmKCJmdW5ueSAkKCkgY29tbWFuZDogJXMiLAorCQkJICAgIHNucHRyZWVmKE5VTEwsIDMyLCAiJVIiLCBpbykpOworCQlzaGYgPSBzaGZfb3BlbihuYW1lID0gZXZhbHN0cihpby0+bmFtZSwgRE9USUxERSksIE9fUkRPTkxZLCAwLAorCQkJU0hGX01BUEhJfFNIRl9DTEVYRUMpOworCQlpZiAoc2hmID09IE5VTEwpCisJCQllcnJvcmYoIiVzOiBjYW5ub3Qgb3BlbiAkKCkgaW5wdXQiLCBuYW1lKTsKKwkJeHAtPnNwbGl0ID0gMDsJLyogbm8gd2FpdGxhc3QoKSAqLworCX0gZWxzZSB7CisJCWludCBvZmQxLCBwdlsyXTsKKwkJb3BlbnBpcGUocHYpOworCQlzaGYgPSBzaGZfZmRvcGVuKHB2WzBdLCBTSEZfUkQsIE5VTEwpOworCQlvZmQxID0gc2F2ZWZkKDEpOworCQlpZiAocHZbMV0gIT0gMSkgeworCQkJa3NoX2R1cDIocHZbMV0sIDEsIGZhbHNlKTsKKwkJCWNsb3NlKHB2WzFdKTsKKwkJfQorCQlleGVjdXRlKHQsIFhGT1JLfFhYQ09NfFhQSVBFTywgTlVMTCk7CisJCXJlc3RmZCgxLCBvZmQxKTsKKwkJc3RhcnRsYXN0KCk7CisJCXhwLT5zcGxpdCA9IDE7CS8qIHdhaXRsYXN0KCkgKi8KKwl9CisKKwl4cC0+dS5zaGYgPSBzaGY7CisJcmV0dXJuIChYQ09NKTsKK30KKworLyoKKyAqIHBlcmZvcm0gI3BhdHRlcm4gYW5kICVwYXR0ZXJuIHN1YnN0aXR1dGlvbiBpbiAke30KKyAqLworCitzdGF0aWMgY2hhciAqCit0cmltc3ViKGNoYXIgKnN0ciwgY2hhciAqcGF0LCBpbnQgaG93KQoreworCWNoYXIgKmVuZCA9IHN0cm51bChzdHIpOworCWNoYXIgKnAsIGM7CisKKwlzd2l0Y2ggKGhvdyAmIDB4RkYpIHsKKwljYXNlICcjJzoJCS8qIHNob3J0ZXN0IGF0IGJlZ2lubmluZyAqLworCQlmb3IgKHAgPSBzdHI7IHAgPD0gZW5kOyBwICs9IHV0Zl9wdHJhZGoocCkpIHsKKwkJCWMgPSAqcDsgKnAgPSAnXDAnOworCQkJaWYgKGdtYXRjaHgoc3RyLCBwYXQsIGZhbHNlKSkgeworCQkJCSpwID0gYzsKKwkJCQlyZXR1cm4gKHApOworCQkJfQorCQkJKnAgPSBjOworCQl9CisJCWJyZWFrOworCWNhc2UgJyMnfDB4ODA6CQkvKiBsb25nZXN0IG1hdGNoIGF0IGJlZ2lubmluZyAqLworCQlmb3IgKHAgPSBlbmQ7IHAgPj0gc3RyOyBwLS0pIHsKKwkJCWMgPSAqcDsgKnAgPSAnXDAnOworCQkJaWYgKGdtYXRjaHgoc3RyLCBwYXQsIGZhbHNlKSkgeworCQkJCSpwID0gYzsKKwkJCQlyZXR1cm4gKHApOworCQkJfQorCQkJKnAgPSBjOworCQl9CisJCWJyZWFrOworCWNhc2UgJyUnOgkJLyogc2hvcnRlc3QgbWF0Y2ggYXQgZW5kICovCisJCXAgPSBlbmQ7CisJCXdoaWxlIChwID49IHN0cikgeworCQkJaWYgKGdtYXRjaHgocCwgcGF0LCBmYWxzZSkpCisJCQkJZ290byB0cmltc3ViX21hdGNoOworCQkJaWYgKFVURk1PREUpIHsKKwkJCQljaGFyICpvcCA9IHA7CisJCQkJd2hpbGUgKChwLS0gPiBzdHIpICYmICgoKnAgJiAweEMwKSA9PSAweDgwKSkKKwkJCQkJOworCQkJCWlmICgocCA8IHN0cikgfHwgKHAgKyB1dGZfcHRyYWRqKHApICE9IG9wKSkKKwkJCQkJcCA9IG9wIC0gMTsKKwkJCX0gZWxzZQorCQkJCS0tcDsKKwkJfQorCQlicmVhazsKKwljYXNlICclJ3wweDgwOgkJLyogbG9uZ2VzdCBtYXRjaCBhdCBlbmQgKi8KKwkJZm9yIChwID0gc3RyOyBwIDw9IGVuZDsgcCsrKQorCQkJaWYgKGdtYXRjaHgocCwgcGF0LCBmYWxzZSkpIHsKKyB0cmltc3ViX21hdGNoOgorCQkJCXN0cm5kdXB4KGVuZCwgc3RyLCBwIC0gc3RyLCBBVEVNUCk7CisJCQkJcmV0dXJuIChlbmQpOworCQkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKHN0cik7CQkvKiBubyBtYXRjaCwgcmV0dXJuIHN0cmluZyAqLworfQorCisvKgorICogZ2xvYgorICogTmFtZSBkZXJpdmVkIGZyb20gVjYncyAvZXRjL2dsb2IsIHRoZSBwcm9ncmFtIHRoYXQgZXhwYW5kZWQgZmlsZW5hbWVzLgorICovCisKKy8qIFhYWCBjcCBub3QgY29uc3QgJ2NhdXNlIHNsYXNoZXMgYXJlIHRlbXBvcmFyaWx5IHJlcGxhY2VkIHdpdGggTlVMcy4uLiAqLworc3RhdGljIHZvaWQKK2dsb2IoY2hhciAqY3AsIFhQdHJWICp3cCwgaW50IG1hcmtkaXJzKQoreworCWludCBvbGRzaXplID0gWFBzaXplKCp3cCk7CisKKwlpZiAoZ2xvYl9zdHIoY3AsIHdwLCBtYXJrZGlycykgPT0gMCkKKwkJWFBwdXQoKndwLCBkZWJ1bmsoY3AsIGNwLCBzdHJsZW4oY3ApICsgMSkpOworCWVsc2UKKwkJcXNvcnQoWFBwdHJ2KCp3cCkgKyBvbGRzaXplLCBYUHNpemUoKndwKSAtIG9sZHNpemUsCisJCSAgICBzaXplb2Yodm9pZCAqKSwgeHN0cmNtcCk7Cit9CisKKyNkZWZpbmUgR0ZfTk9ORQkJMAorI2RlZmluZSBHRl9FWENIRUNLCUJJVCgwKQkJLyogZG8gZXhpc3RlbmNlIGNoZWNrIG9uIGZpbGUgKi8KKyNkZWZpbmUgR0ZfR0xPQkJFRAlCSVQoMSkJCS8qIHNvbWUgZ2xvYmJpbmcgaGFzIGJlZW4gZG9uZSAqLworI2RlZmluZSBHRl9NQVJLRElSCUJJVCgyKQkJLyogYWRkIHRyYWlsaW5nIC8gdG8gZGlyZWN0b3JpZXMgKi8KKworLyogQXBwbHkgZmlsZSBnbG9iYmluZyB0byBjcCBhbmQgc3RvcmUgdGhlIG1hdGNoaW5nIGZpbGVzIGluIHdwLiBSZXR1cm5zCisgKiB0aGUgbnVtYmVyIG9mIG1hdGNoZXMgZm91bmQuCisgKi8KK2ludAorZ2xvYl9zdHIoY2hhciAqY3AsIFhQdHJWICp3cCwgaW50IG1hcmtkaXJzKQoreworCWludCBvbGRzaXplID0gWFBzaXplKCp3cCk7CisJWFN0cmluZyB4czsKKwljaGFyICp4cDsKKworCVhpbml0KHhzLCB4cCwgMjU2LCBBVEVNUCk7CisJZ2xvYml0KCZ4cywgJnhwLCBjcCwgd3AsIG1hcmtkaXJzID8gR0ZfTUFSS0RJUiA6IEdGX05PTkUpOworCVhmcmVlKHhzLCB4cCk7CisKKwlyZXR1cm4gKFhQc2l6ZSgqd3ApIC0gb2xkc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnbG9iaXQoWFN0cmluZyAqeHMsCS8qIGRlc3Qgc3RyaW5nICovCisgICAgY2hhciAqKnhwcCwJCS8qIHB0ciB0byBkZXN0IGVuZCAqLworICAgIGNoYXIgKnNwLAkJLyogc291cmNlIHBhdGggKi8KKyAgICBYUHRyViAqd3AsCQkvKiBvdXRwdXQgbGlzdCAqLworICAgIGludCBjaGVjaykJCS8qIEdGXyogZmxhZ3MgKi8KK3sKKwljaGFyICpucDsJCS8qIG5leHQgc291cmNlIGNvbXBvbmVudCAqLworCWNoYXIgKnhwID0gKnhwcDsKKwljaGFyICpzZTsKKwljaGFyIG9kaXJzZXA7CisKKwkvKiBUaGlzIHRvIGFsbG93IGxvbmcgZXhwYW5zaW9ucyB0byBiZSBpbnRlcnJ1cHRlZCAqLworCWludHJjaGVjaygpOworCisJaWYgKHNwID09IE5VTEwpIHsJLyogZW5kIG9mIHNvdXJjZSBwYXRoICovCisJCS8qIFdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMgaWYgYSBwYXR0ZXJuCisJCSAqIGlzIGZvbGxvd2VkIGJ5IGEgbm9uLXBhdHRlcm4gKGVnLCBmb28qeC9iYXI7IG5vIGNoZWNrCisJCSAqIGlzIG5lZWRlZCBmb3IgZm9vKiBzaW5jZSB0aGUgbWF0Y2ggbXVzdCBleGlzdCkgb3IgaWYKKwkJICogYW55IHBhdHRlcm5zIHdlcmUgZXhwYW5kZWQgYW5kIHRoZSBtYXJrZGlycyBvcHRpb24gaXMgc2V0LgorCQkgKiBTeW1saW5rcyBtYWtlIHRoaW5ncyBhIGJpdCB0cmlja3kuLi4KKwkJICovCisJCWlmICgoY2hlY2sgJiBHRl9FWENIRUNLKSB8fAorCQkgICAgKChjaGVjayAmIEdGX01BUktESVIpICYmIChjaGVjayAmIEdGX0dMT0JCRUQpKSkgeworI2RlZmluZSBzdGF0X2NoZWNrKCkJKHN0YXRfZG9uZSA/IHN0YXRfZG9uZSA6IFwKKwkJCSAgICAoc3RhdF9kb25lID0gc3RhdChYc3RyaW5nKCp4cywgeHApLCAmc3RhdGIpIDwgMCBcCisJCQkJPyAtMSA6IDEpKQorCQkJc3RydWN0IHN0YXQgbHN0YXRiLCBzdGF0YjsKKwkJCWludCBzdGF0X2RvbmUgPSAwOwkgLyogLTE6IGZhaWxlZCwgMSBvayAqLworCisJCQlpZiAobHN0YXQoWHN0cmluZygqeHMsIHhwKSwgJmxzdGF0YikgPCAwKQorCQkJCXJldHVybjsKKwkJCS8qIHNwZWNpYWwgY2FzZSBmb3Igc3lzdGVtcyB3aGljaCBzdHJpcCB0cmFpbGluZworCQkJICogc2xhc2hlcyBmcm9tIHJlZ3VsYXIgZmlsZXMgKGVnLCAvZXRjL3Bhc3N3ZC8pLgorCQkJICogU3VuT1MgNC4xLjMgZG9lcyB0aGlzLi4uCisJCQkgKi8KKwkJCWlmICgoY2hlY2sgJiBHRl9FWENIRUNLKSAmJiB4cCA+IFhzdHJpbmcoKnhzLCB4cCkgJiYKKwkJCSAgICB4cFstMV0gPT0gJy8nICYmICFTX0lTRElSKGxzdGF0Yi5zdF9tb2RlKSAmJgorCQkJICAgICghU19JU0xOSyhsc3RhdGIuc3RfbW9kZSkgfHwKKwkJCSAgICBzdGF0X2NoZWNrKCkgPCAwIHx8ICFTX0lTRElSKHN0YXRiLnN0X21vZGUpKSkKKwkJCQlyZXR1cm47CisJCQkvKiBQb3NzaWJseSB0YWNrIG9uIGEgdHJhaWxpbmcgLyBpZiB0aGVyZSBpc24ndCBhbHJlYWR5CisJCQkgKiBvbmUgYW5kIGlmIHRoZSBmaWxlIGlzIGEgZGlyZWN0b3J5IG9yIGEgc3ltbGluayB0byBhCisJCQkgKiBkaXJlY3RvcnkKKwkJCSAqLworCQkJaWYgKCgoY2hlY2sgJiBHRl9NQVJLRElSKSAmJiAoY2hlY2sgJiBHRl9HTE9CQkVEKSkgJiYKKwkJCSAgICB4cCA+IFhzdHJpbmcoKnhzLCB4cCkgJiYgeHBbLTFdICE9ICcvJyAmJgorCQkJICAgIChTX0lTRElSKGxzdGF0Yi5zdF9tb2RlKSB8fAorCQkJICAgIChTX0lTTE5LKGxzdGF0Yi5zdF9tb2RlKSAmJiBzdGF0X2NoZWNrKCkgPiAwICYmCisJCQkgICAgU19JU0RJUihzdGF0Yi5zdF9tb2RlKSkpKSB7CisJCQkJKnhwKysgPSAnLyc7CisJCQkJKnhwID0gJ1wwJzsKKwkJCX0KKwkJfQorCQlzdHJuZHVweChucCwgWHN0cmluZygqeHMsIHhwKSwgWGxlbmd0aCgqeHMsIHhwKSwgQVRFTVApOworCQlYUHB1dCgqd3AsIG5wKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh4cCA+IFhzdHJpbmcoKnhzLCB4cCkpCisJCSp4cCsrID0gJy8nOworCXdoaWxlICgqc3AgPT0gJy8nKSB7CisJCVhjaGVjaygqeHMsIHhwKTsKKwkJKnhwKysgPSAqc3ArKzsKKwl9CisJbnAgPSBzdHJjaHIoc3AsICcvJyk7CisJaWYgKG5wICE9IE5VTEwpIHsKKwkJc2UgPSBucDsKKwkJb2RpcnNlcCA9ICpucDsJLyogZG9uJ3QgYXNzdW1lICcvJywgY2FuIGJlIG11bHRpcGxlIGtpbmRzICovCisJCSpucCsrID0gJ1wwJzsKKwl9IGVsc2UgeworCQlvZGlyc2VwID0gJ1wwJzsgLyoga2VlcCBnY2MgcXVpZXQgKi8KKwkJc2UgPSBzcCArIHN0cmxlbihzcCk7CisJfQorCisKKwkvKiBDaGVjayBpZiBzcCBuZWVkcyBnbG9iYmluZyAtIGRvbmUgdG8gYXZvaWQgcGF0dGVybiBjaGVja3MgZm9yIHN0cmluZ3MKKwkgKiBjb250YWluaW5nIE1BR0lDIGNoYXJhY3RlcnMsIG9wZW4gW3Mgd2l0aG91dCB0aGUgbWF0Y2hpbmcgY2xvc2UgXSwKKwkgKiBldGMuIChvdGhlcndpc2Ugb3BlbmRpcigpIHdpbGwgYmUgY2FsbGVkIHdoaWNoIG1heSBmYWlsIGJlY2F1c2UgdGhlCisJICogZGlyZWN0b3J5IGlzbid0IHJlYWRhYmxlIC0gaWYgbm8gZ2xvYmJpbmcgaXMgbmVlZGVkLCBvbmx5IGV4ZWN1dGUKKwkgKiBwZXJtaXNzaW9uIHNob3VsZCBiZSByZXF1aXJlZCAoYXMgcGVyIFBPU0lYKSkuCisJICovCisJaWYgKCFoYXNfZ2xvYmJpbmcoc3AsIHNlKSkgeworCQlYY2hlY2tOKCp4cywgeHAsIHNlIC0gc3AgKyAxKTsKKwkJZGVidW5rKHhwLCBzcCwgWG5sZWZ0KCp4cywgeHApKTsKKwkJeHAgKz0gc3RybGVuKHhwKTsKKwkJKnhwcCA9IHhwOworCQlnbG9iaXQoeHMsIHhwcCwgbnAsIHdwLCBjaGVjayk7CisJfSBlbHNlIHsKKwkJRElSICpkaXJwOworCQlzdHJ1Y3QgZGlyZW50ICpkOworCQljaGFyICpuYW1lOworCQlpbnQgbGVuOworCQlpbnQgcHJlZml4X2xlbjsKKworCQkvKiB4cCA9ICp4cHA7CWNvcHlfbm9uX2dsb2IoKSBtYXkgaGF2ZSByZS1hbGxvYydkIHhzICovCisJCSp4cCA9ICdcMCc7CisJCXByZWZpeF9sZW4gPSBYbGVuZ3RoKCp4cywgeHApOworCQlkaXJwID0gb3BlbmRpcihwcmVmaXhfbGVuID8gWHN0cmluZygqeHMsIHhwKSA6ICIuIik7CisJCWlmIChkaXJwID09IE5VTEwpCisJCQlnb3RvIE5vZGlyOworCQl3aGlsZSAoKGQgPSByZWFkZGlyKGRpcnApKSAhPSBOVUxMKSB7CisJCQluYW1lID0gZC0+ZF9uYW1lOworCQkJaWYgKG5hbWVbMF0gPT0gJy4nICYmCisJCQkgICAgKG5hbWVbMV0gPT0gMCB8fCAobmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAwKSkpCisJCQkJY29udGludWU7IC8qIGFsd2F5cyBpZ25vcmUgLiBhbmQgLi4gKi8KKwkJCWlmICgoKm5hbWUgPT0gJy4nICYmICpzcCAhPSAnLicpIHx8CisJCQkgICAgIWdtYXRjaHgobmFtZSwgc3AsIHRydWUpKQorCQkJCWNvbnRpbnVlOworCisJCQlsZW4gPSBzdHJsZW4oZC0+ZF9uYW1lKSArIDE7CisJCQlYY2hlY2tOKCp4cywgeHAsIGxlbik7CisJCQltZW1jcHkoeHAsIG5hbWUsIGxlbik7CisJCQkqeHBwID0geHAgKyBsZW4gLSAxOworCQkJZ2xvYml0KHhzLCB4cHAsIG5wLCB3cCwKKwkJCQkoY2hlY2sgJiBHRl9NQVJLRElSKSB8IEdGX0dMT0JCRUQKKwkJCQl8IChucCA/IEdGX0VYQ0hFQ0sgOiBHRl9OT05FKSk7CisJCQl4cCA9IFhzdHJpbmcoKnhzLCB4cCkgKyBwcmVmaXhfbGVuOworCQl9CisJCWNsb3NlZGlyKGRpcnApOworIE5vZGlyOgorCQk7CisJfQorCisJaWYgKG5wICE9IE5VTEwpCisJCSotLW5wID0gb2RpcnNlcDsKK30KKworLyogcmVtb3ZlIE1BR0lDIGZyb20gc3RyaW5nICovCitjaGFyICoKK2RlYnVuayhjaGFyICpkcCwgY29uc3QgY2hhciAqc3AsIHNpemVfdCBkbGVuKQoreworCWNoYXIgKmQ7CisJY29uc3QgY2hhciAqczsKKworCWlmICgocyA9IGNzdHJjaHIoc3AsIE1BR0lDKSkpIHsKKwkJaWYgKHMgLSBzcCA+PSAoc3NpemVfdClkbGVuKQorCQkJcmV0dXJuIChkcCk7CisJCW1lbW1vdmUoZHAsIHNwLCBzIC0gc3ApOworCQlmb3IgKGQgPSBkcCArIChzIC0gc3ApOyAqcyAmJiAoZCAtIGRwIDwgKHNzaXplX3QpZGxlbik7IHMrKykKKwkJCWlmICghSVNNQUdJQygqcykgfHwgISgqKytzICYgMHg4MCkgfHwKKwkJCSAgICAhdnN0cmNocigiKis/QCEgIiwgKnMgJiAweDdmKSkKKwkJCQkqZCsrID0gKnM7CisJCQllbHNlIHsKKwkJCQkvKiBleHRlbmRlZCBwYXR0ZXJuIG9wZXJhdG9yczogKis/QCEgKi8KKwkJCQlpZiAoKCpzICYgMHg3ZikgIT0gJyAnKQorCQkJCQkqZCsrID0gKnMgJiAweDdmOworCQkJCWlmIChkIC0gZHAgPCAoc3NpemVfdClkbGVuKQorCQkJCQkqZCsrID0gJygnOworCQkJfQorCQkqZCA9ICdcMCc7CisJfSBlbHNlIGlmIChkcCAhPSBzcCkKKwkJc3RybGNweShkcCwgc3AsIGRsZW4pOworCXJldHVybiAoZHApOworfQorCisvKiBDaGVjayBpZiBwIGlzIGFuIHVucXVvdGVkIG5hbWUsIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGEgLyBvciA6LiBJZiBzbworICogcHV0cyB0aGUgZXhwYW5kZWQgdmVyc2lvbiBpbiAqZGNwLGRwIGFuZCByZXR1cm5zIGEgcG9pbnRlciBpbiBwIGp1c3QKKyAqIHBhc3QgdGhlIG5hbWUsIG90aGVyd2lzZSByZXR1cm5zIDAuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK21heWJlX2V4cGFuZF90aWxkZShjb25zdCBjaGFyICpwLCBYU3RyaW5nICpkc3AsIGNoYXIgKipkcHAsIGludCBpc2Fzc2lnbikKK3sKKwlYU3RyaW5nIHRzOworCWNoYXIgKmRwID0gKmRwcDsKKwljaGFyICp0cDsKKwljb25zdCBjaGFyICpyOworCisJWGluaXQodHMsIHRwLCAxNiwgQVRFTVApOworCS8qIDogb25seSBmb3IgRE9BU05USUxERSBmb3JtICovCisJd2hpbGUgKHBbMF0gPT0gQ0hBUiAmJiBwWzFdICE9ICcvJyAmJiAoIWlzYXNzaWduIHx8IHBbMV0gIT0gJzonKSkKKwl7CisJCVhjaGVjayh0cywgdHApOworCQkqdHArKyA9IHBbMV07CisJCXAgKz0gMjsKKwl9CisJKnRwID0gJ1wwJzsKKwlyID0gKHBbMF0gPT0gRU9TIHx8IHBbMF0gPT0gQ0hBUiB8fCBwWzBdID09IENTVUJTVCkgPworCSAgICB0aWxkZShYc3RyaW5nKHRzLCB0cCkpIDogTlVMTDsKKwlYZnJlZSh0cywgdHApOworCWlmIChyKSB7CisJCXdoaWxlICgqcikgeworCQkJWGNoZWNrKCpkc3AsIGRwKTsKKwkJCWlmIChJU01BR0lDKCpyKSkKKwkJCQkqZHArKyA9IE1BR0lDOworCQkJKmRwKysgPSAqcisrOworCQl9CisJCSpkcHAgPSBkcDsKKwkJciA9IHA7CisJfQorCXJldHVybiAocik7Cit9CisKKy8qCisgKiB0aWxkZSBleHBhbnNpb24KKyAqCisgKiBiYXNlZCBvbiBhIHZlcnNpb24gYnkgQXJub2xkIFJvYmJpbnMKKyAqLworCitzdGF0aWMgY2hhciAqCit0aWxkZShjaGFyICpjcCkKK3sKKwljaGFyICpkcCA9IG51bGw7CisKKwlpZiAoY3BbMF0gPT0gJ1wwJykKKwkJZHAgPSBzdHJfdmFsKGdsb2JhbCgiSE9NRSIpKTsKKwllbHNlIGlmIChjcFswXSA9PSAnKycgJiYgY3BbMV0gPT0gJ1wwJykKKwkJZHAgPSBzdHJfdmFsKGdsb2JhbCgiUFdEIikpOworCWVsc2UgaWYgKGNwWzBdID09ICctJyAmJiBjcFsxXSA9PSAnXDAnKQorCQlkcCA9IHN0cl92YWwoZ2xvYmFsKCJPTERQV0QiKSk7CisjaWZuZGVmIE1LU0hfTk9QV05BTQorCWVsc2UKKwkJZHAgPSBob21lZGlyKGNwKTsKKyNlbmRpZgorCS8qIElmIEhPTUUsIFBXRCBvciBPTERQV0QgYXJlIG5vdCBzZXQsIGRvbid0IGV4cGFuZCB+ICovCisJcmV0dXJuIChkcCA9PSBudWxsID8gTlVMTCA6IGRwKTsKK30KKworI2lmbmRlZiBNS1NIX05PUFdOQU0KKy8qCisgKiBtYXAgdXNlcmlkIHRvIHVzZXIncyBob21lIGRpcmVjdG9yeS4KKyAqIG5vdGUgdGhhdCA0LjMncyBnZXRwdyBhZGRzIG1vcmUgdGhhbiA2SyB0byB0aGUgc2hlbGwsCisgKiBhbmQgdGhlIFlQIHZlcnNpb24gcHJvYmFibHkgYWRkcyBtdWNoIG1vcmUuCisgKiB3ZSBtaWdodCBjb25zaWRlciBvdXIgb3duIHZlcnNpb24gb2YgZ2V0cHduYW0oKSB0byBrZWVwIHRoZSBzaXplIGRvd24uCisgKi8KK3N0YXRpYyBjaGFyICoKK2hvbWVkaXIoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdGJsICphcDsKKworCWFwID0ga3RlbnRlcigmaG9tZWRpcnMsIG5hbWUsIGhhc2gobmFtZSkpOworCWlmICghKGFwLT5mbGFnICYgSVNTRVQpKSB7CisJCXN0cnVjdCBwYXNzd2QgKnB3OworCisJCXB3ID0gZ2V0cHduYW0obmFtZSk7CisJCWlmIChwdyA9PSBOVUxMKQorCQkJcmV0dXJuIChOVUxMKTsKKwkJc3RyZHVweChhcC0+dmFsLnMsIHB3LT5wd19kaXIsIEFQRVJNKTsKKwkJYXAtPmZsYWcgfD0gREVGSU5FRHxJU1NFVHxBTExPQzsKKwl9CisJcmV0dXJuIChhcC0+dmFsLnMpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCithbHRfZXhwYW5kKFhQdHJWICp3cCwgY2hhciAqc3RhcnQsIGNoYXIgKmV4cF9zdGFydCwgY2hhciAqZW5kLCBpbnQgZmRvKQoreworCWludCBjb3VudCA9IDA7CisJY2hhciAqYnJhY2Vfc3RhcnQsICpicmFjZV9lbmQsICpjb21tYSA9IE5VTEw7CisJY2hhciAqZmllbGRfc3RhcnQ7CisJY2hhciAqcDsKKworCS8qIHNlYXJjaCBmb3Igb3BlbiBicmFjZSAqLworCWZvciAocCA9IGV4cF9zdGFydDsgKHAgPSBzdHJjaHIocCwgTUFHSUMpKSAmJiBwWzFdICE9IE9CUkFDRTsgcCArPSAyKQorCQk7CisJYnJhY2Vfc3RhcnQgPSBwOworCisJLyogZmluZCBtYXRjaGluZyBjbG9zZSBicmFjZSwgaWYgYW55ICovCisJaWYgKHApIHsKKwkJY29tbWEgPSBOVUxMOworCQljb3VudCA9IDE7CisJCWZvciAocCArPSAyOyAqcCAmJiBjb3VudDsgcCsrKSB7CisJCQlpZiAoSVNNQUdJQygqcCkpIHsKKwkJCQlpZiAoKisrcCA9PSBPQlJBQ0UpCisJCQkJCWNvdW50Kys7CisJCQkJZWxzZSBpZiAoKnAgPT0gQ0JSQUNFKQorCQkJCQktLWNvdW50OworCQkJCWVsc2UgaWYgKCpwID09ICcsJyAmJiBjb3VudCA9PSAxKQorCQkJCQljb21tYSA9IHA7CisJCQl9CisJCX0KKwl9CisJLyogbm8gdmFsaWQgZXhwYW5zaW9ucy4uLiAqLworCWlmICghcCB8fCBjb3VudCAhPSAwKSB7CisJCS8qIE5vdGUgdGhhdCBnaXZlbiBhe3tiLGN9IHdlIGRvIG5vdCBleHBhbmQgYW55dGhpbmcgKHRoaXMgaXMKKwkJICogd2hhdCBBVCZUIGtzaCBkb2VzLiBUaGlzIG1heSBiZSBjaGFuZ2VkIHRvIGRvIHRoZSB7YixjfQorCQkgKiBleHBhbnNpb24uIH0KKwkJICovCisJCWlmIChmZG8gJiBET0dMT0IpCisJCQlnbG9iKHN0YXJ0LCB3cCwgZmRvICYgRE9NQVJLRElSUyk7CisJCWVsc2UKKwkJCVhQcHV0KCp3cCwgZGVidW5rKHN0YXJ0LCBzdGFydCwgZW5kIC0gc3RhcnQpKTsKKwkJcmV0dXJuOworCX0KKwlicmFjZV9lbmQgPSBwOworCWlmICghY29tbWEpIHsKKwkJYWx0X2V4cGFuZCh3cCwgc3RhcnQsIGJyYWNlX2VuZCwgZW5kLCBmZG8pOworCQlyZXR1cm47CisJfQorCisJLyogZXhwYW5kIGV4cHJlc3Npb24gKi8KKwlmaWVsZF9zdGFydCA9IGJyYWNlX3N0YXJ0ICsgMjsKKwljb3VudCA9IDE7CisJZm9yIChwID0gYnJhY2Vfc3RhcnQgKyAyOyBwICE9IGJyYWNlX2VuZDsgcCsrKSB7CisJCWlmIChJU01BR0lDKCpwKSkgeworCQkJaWYgKCorK3AgPT0gT0JSQUNFKQorCQkJCWNvdW50Kys7CisJCQllbHNlIGlmICgoKnAgPT0gQ0JSQUNFICYmIC0tY291bnQgPT0gMCkgfHwKKwkJCSAgICAoKnAgPT0gJywnICYmIGNvdW50ID09IDEpKSB7CisJCQkJY2hhciAqbmV3czsKKwkJCQlpbnQgbDEsIGwyLCBsMzsKKworCQkJCWwxID0gYnJhY2Vfc3RhcnQgLSBzdGFydDsKKwkJCQlsMiA9IChwIC0gMSkgLSBmaWVsZF9zdGFydDsKKwkJCQlsMyA9IGVuZCAtIGJyYWNlX2VuZDsKKwkJCQluZXdzID0gYWxsb2MobDEgKyBsMiArIGwzICsgMSwgQVRFTVApOworCQkJCW1lbWNweShuZXdzLCBzdGFydCwgbDEpOworCQkJCW1lbWNweShuZXdzICsgbDEsIGZpZWxkX3N0YXJ0LCBsMik7CisJCQkJbWVtY3B5KG5ld3MgKyBsMSArIGwyLCBicmFjZV9lbmQsIGwzKTsKKwkJCQluZXdzW2wxICsgbDIgKyBsM10gPSAnXDAnOworCQkJCWFsdF9leHBhbmQod3AsIG5ld3MsIG5ld3MgKyBsMSwKKwkJCQkgICAgbmV3cyArIGwxICsgbDIgKyBsMywgZmRvKTsKKwkJCQlmaWVsZF9zdGFydCA9IHAgKyAxOworCQkJfQorCQl9CisJfQorCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2V4ZWMuYyBiL21rc2gvc3JjL2V4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTEzMjFhCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvZXhlYy5jCkBAIC0wLDAgKzEsMTUxOCBAQAorLyoJJE9wZW5CU0Q6IGV4ZWMuYyx2IDEuNDkgMjAwOS8wMS8yOSAyMzoyNzoyNiBqYXJlZHkgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9leGVjLmMsdiAxLjc1IDIwMTAvMDcvMTcgMjI6MDk6MzQgdGcgRXhwICQiKTsKKworI2lmbmRlZiBNS1NIX0RFRkFVTFRfRVhFQ1NIRUxMCisjZGVmaW5lIE1LU0hfREVGQVVMVF9FWEVDU0hFTEwJIi9iaW4vc2giCisjZW5kaWYKKworc3RhdGljIGludCBjb21leGVjKHN0cnVjdCBvcCAqLCBzdHJ1Y3QgdGJsICp2b2xhdGlsZSwgY29uc3QgY2hhciAqKiwKKyAgICBpbnQgdm9sYXRpbGUsIHZvbGF0aWxlIGludCAqKTsKK3N0YXRpYyB2b2lkIHNjcmlwdGV4ZWMoc3RydWN0IG9wICosIGNvbnN0IGNoYXIgKiopIE1LU0hfQV9OT1JFVFVSTjsKK3N0YXRpYyBpbnQgY2FsbF9idWlsdGluKHN0cnVjdCB0YmwgKiwgY29uc3QgY2hhciAqKik7CitzdGF0aWMgaW50IGlvc2V0dXAoc3RydWN0IGlvd29yZCAqLCBzdHJ1Y3QgdGJsICopOworc3RhdGljIGludCBoZXJlaW4oY29uc3QgY2hhciAqLCBpbnQpOworc3RhdGljIGNvbnN0IGNoYXIgKmRvX3NlbGVjdGFyZ3MoY29uc3QgY2hhciAqKiwgYm9vbCk7CitzdGF0aWMgVGVzdF9vcCBkYnRlc3RlX2lzYShUZXN0X2VudiAqLCBUZXN0X21ldGEpOworc3RhdGljIGNvbnN0IGNoYXIgKmRidGVzdGVfZ2V0b3BuZChUZXN0X2VudiAqLCBUZXN0X29wLCBib29sKTsKK3N0YXRpYyB2b2lkIGRidGVzdGVfZXJyb3IoVGVzdF9lbnYgKiwgaW50LCBjb25zdCBjaGFyICopOworCisvKgorICogZXhlY3V0ZSBjb21tYW5kIHRyZWUKKyAqLworaW50CitleGVjdXRlKHN0cnVjdCBvcCAqdm9sYXRpbGUgdCwKKyAgICB2b2xhdGlsZSBpbnQgZmxhZ3MsCQkvKiBpZiBYRVhFQyBkb24ndCBmb3JrICovCisgICAgdm9sYXRpbGUgaW50ICogdm9sYXRpbGUgeGVycm9rKQoreworCWludCBpOworCXZvbGF0aWxlIGludCBydiA9IDAsIGR1bW15ID0gMDsKKwlpbnQgcHZbMl07CisJY29uc3QgY2hhciAqKiB2b2xhdGlsZSBhcDsKKwljaGFyICoqIHZvbGF0aWxlIHVwOworCWNvbnN0IGNoYXIgKnMsICpjcDsKKwlzdHJ1Y3QgaW93b3JkICoqaW93cDsKKwlzdHJ1Y3QgdGJsICp0cCA9IE5VTEw7CisKKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCisJLyogQ2FsbGVyIGRvZXNuJ3QgY2FyZSBpZiBYRVJST0sgc2hvdWxkIHByb3BhZ2F0ZS4gKi8KKwlpZiAoeGVycm9rID09IE5VTEwpCisJCXhlcnJvayA9ICZkdW1teTsKKworCWlmICgoZmxhZ3MmWEZPUkspICYmICEoZmxhZ3MmWEVYRUMpICYmIHQtPnR5cGUgIT0gVFBJUEUpCisJCS8qIHJ1biBpbiBzdWItcHJvY2VzcyAqLworCQlyZXR1cm4gKGV4Y2hpbGQodCwgZmxhZ3MgJiB+WFRJTUUsIHhlcnJvaywgLTEpKTsKKworCW5ld2VudihFX0VYRUMpOworCWlmICh0cmFwKQorCQlydW50cmFwcygwKTsKKworCWlmICh0LT50eXBlID09IFRDT00pIHsKKwkJLyogQ2xlYXIgc3Vic3RfZXhzdGF0IGJlZm9yZSBhcmd1bWVudCBleHBhbnNpb24uIFVzZWQgYnkKKwkJICogbnVsbCBjb21tYW5kcyAoc2VlIGNvbWV4ZWMoKSBhbmQgY19ldmFsKCkpIGFuZCBieSBjX3NldCgpLgorCQkgKi8KKwkJc3Vic3RfZXhzdGF0ID0gMDsKKworCQljdXJyZW50X2xpbmVubyA9IHQtPmxpbmVubzsJLyogZm9yICRMSU5FTk8gKi8KKworCQkvKiBQT1NJWCBzYXlzIGV4cGFuZCBjb21tYW5kIHdvcmRzIGZpcnN0LCB0aGVuIHJlZGlyZWN0aW9ucywKKwkJICogYW5kIGFzc2lnbm1lbnRzIGxhc3QuLgorCQkgKi8KKwkJdXAgPSBldmFsKHQtPmFyZ3MsIHQtPnUuZXZhbGZsYWdzIHwgRE9CTEFOSyB8IERPR0xPQiB8IERPVElMREUpOworCQlpZiAoZmxhZ3MgJiBYVElNRSkKKwkJCS8qIEFsbG93IG9wdGlvbiBwYXJzaW5nIChiaXphcnJlLCBidXQgUE9TSVgpICovCisJCQl0aW1leF9ob29rKHQsICZ1cCk7CisJCWFwID0gKGNvbnN0IGNoYXIgKiopdXA7CisJCWlmIChGbGFnKEZYVFJBQ0UpICYmIGFwWzBdKSB7CisJCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiJXMiLAorCQkJCXN1YnN0aXR1dGUoc3RyX3ZhbChnbG9iYWwoIlBTNCIpKSwgMCkpOworCQkJZm9yIChpID0gMDsgYXBbaV07IGkrKykKKwkJCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiJXMlYyIsIGFwW2ldLAorCQkJCSAgICBhcFtpICsgMV0gPyAnICcgOiAnXG4nKTsKKwkJCXNoZl9mbHVzaChzaGxfb3V0KTsKKwkJfQorCQlpZiAoYXBbMF0pCisJCQl0cCA9IGZpbmRjb20oYXBbMF0sIEZDX0JJfEZDX0ZVTkMpOworCX0KKwlmbGFncyAmPSB+WFRJTUU7CisKKwlpZiAodC0+aW9hY3QgIT0gTlVMTCB8fCB0LT50eXBlID09IFRQSVBFIHx8IHQtPnR5cGUgPT0gVENPUFJPQykgeworCQllLT5zYXZlZmQgPSBhbGxvYyhOVUZJTEUgKiBzaXplb2Yoc2hvcnQpLCBBVEVNUCk7CisJCS8qIGluaXRpYWxpc2UgdG8gbm90IHJlZGlyZWN0ZWQgKi8KKwkJbWVtc2V0KGUtPnNhdmVmZCwgMCwgTlVGSUxFICogc2l6ZW9mKHNob3J0KSk7CisJfQorCisJLyogZG8gcmVkaXJlY3Rpb24sIHRvIGJlIHJlc3RvcmVkIGluIHF1aXRlbnYoKSAqLworCWlmICh0LT5pb2FjdCAhPSBOVUxMKQorCQlmb3IgKGlvd3AgPSB0LT5pb2FjdDsgKmlvd3AgIT0gTlVMTDsgaW93cCsrKSB7CisJCQlpZiAoaW9zZXR1cCgqaW93cCwgdHApIDwgMCkgeworCQkJCWV4c3RhdCA9IHJ2ID0gMTsKKwkJCQkvKiBSZWRpcmVjdGlvbiBmYWlsdXJlcyBmb3Igc3BlY2lhbCBjb21tYW5kcworCQkJCSAqIGNhdXNlIChub24taW50ZXJhY3RpdmUpIHNoZWxsIHRvIGV4aXQuCisJCQkJICovCisJCQkJaWYgKHRwICYmIHRwLT50eXBlID09IENTSEVMTCAmJgorCQkJCSAgICAodHAtPmZsYWcgJiBTUEVDX0JJKSkKKwkJCQkJZXJyb3JmeigpOworCQkJCS8qIERlYWwgd2l0aCBGRVJSRVhJVCwgcXVpdGVudigpLCBldGMuICovCisJCQkJZ290byBCcmVhazsKKwkJCX0KKwkJfQorCisJc3dpdGNoICh0LT50eXBlKSB7CisJY2FzZSBUQ09NOgorCQlydiA9IGNvbWV4ZWModCwgdHAsIChjb25zdCBjaGFyICoqKWFwLCBmbGFncywgeGVycm9rKTsKKwkJYnJlYWs7CisKKwljYXNlIFRQQVJFTjoKKwkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIGZsYWdzIHwgWEZPUkssIHhlcnJvayk7CisJCWJyZWFrOworCisJY2FzZSBUUElQRToKKwkJZmxhZ3MgfD0gWEZPUks7CisJCWZsYWdzICY9IH5YRVhFQzsKKwkJZS0+c2F2ZWZkWzBdID0gc2F2ZWZkKDApOworCQllLT5zYXZlZmRbMV0gPSBzYXZlZmQoMSk7CisJCXdoaWxlICh0LT50eXBlID09IFRQSVBFKSB7CisJCQlvcGVucGlwZShwdik7CisJCQlrc2hfZHVwMihwdlsxXSwgMSwgZmFsc2UpOyAvKiBzdGRvdXQgb2YgY3VyciAqLworCQkJLyoqCisJCQkgKiBMZXQgZXhjaGlsZCgpIGNsb3NlIHB2WzBdIGluIGNoaWxkCisJCQkgKiAoaWYgdGhpcyBpc24ndCBkb25lLCBjb21tYW5kcyBsaWtlCisJCQkgKgkoOiA7IGNhdCAvZXRjL3Rlcm1jYXApIHwgc2xlZXAgMQorCQkJICogd2lsbCBoYW5nIGZvcmV2ZXIpLgorCQkJICovCisJCQlleGNoaWxkKHQtPmxlZnQsIGZsYWdzIHwgWFBJUEVPIHwgWENDTE9TRSwKKwkJCSAgICBOVUxMLCBwdlswXSk7CisJCQlrc2hfZHVwMihwdlswXSwgMCwgZmFsc2UpOyAvKiBzdGRpbiBvZiBuZXh0ICovCisJCQljbG9zZXBpcGUocHYpOworCQkJZmxhZ3MgfD0gWFBJUEVJOworCQkJdCA9IHQtPnJpZ2h0OworCQl9CisJCXJlc3RmZCgxLCBlLT5zYXZlZmRbMV0pOyAvKiBzdGRvdXQgb2YgbGFzdCAqLworCQllLT5zYXZlZmRbMV0gPSAwOyAvKiBubyBuZWVkIHRvIHJlLXJlc3RvcmUgdGhpcyAqLworCQkvKiBMZXQgZXhjaGlsZCgpIGNsb3NlIDAgaW4gcGFyZW50LCBhZnRlciBmb3JrLCBiZWZvcmUgd2FpdCAqLworCQlpID0gZXhjaGlsZCh0LCBmbGFncyB8IFhQQ0xPU0UsIHhlcnJvaywgMCk7CisJCWlmICghKGZsYWdzJlhCR05EKSAmJiAhKGZsYWdzJlhYQ09NKSkKKwkJCXJ2ID0gaTsKKwkJYnJlYWs7CisKKwljYXNlIFRMSVNUOgorCQl3aGlsZSAodC0+dHlwZSA9PSBUTElTVCkgeworCQkJZXhlY3V0ZSh0LT5sZWZ0LCBmbGFncyAmIFhFUlJPSywgTlVMTCk7CisJCQl0ID0gdC0+cmlnaHQ7CisJCX0KKwkJcnYgPSBleGVjdXRlKHQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOworCQlicmVhazsKKworCWNhc2UgVENPUFJPQzogeworCQlzaWdzZXRfdCBvbWFzazsKKworCQkvKiBCbG9jayBzaWdjaGlsZCBhcyB3ZSBhcmUgdXNpbmcgdGhpbmdzIGNoYW5nZWQgaW4gdGhlCisJCSAqIHNpZ25hbCBoYW5kbGVyCisJCSAqLworCQlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOworCQllLT50eXBlID0gRV9FUlJIOworCQlpID0gc2lnc2V0am1wKGUtPmpidWYsIDApOworCQlpZiAoaSkgeworCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCQlxdWl0ZW52KE5VTEwpOworCQkJdW53aW5kKGkpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCS8qIEFscmVhZHkgaGF2ZSBhIChsaXZlKSBjby1wcm9jZXNzPyAqLworCQlpZiAoY29wcm9jLmpvYiAmJiBjb3Byb2Mud3JpdGUgPj0gMCkKKwkJCWVycm9yZigiY29wcm9jZXNzIGFscmVhZHkgZXhpc3RzIik7CisKKwkJLyogQ2FuIHdlIHJlLXVzZSB0aGUgZXhpc3RpbmcgY28tcHJvY2VzcyBwaXBlPyAqLworCQljb3Byb2NfY2xlYW51cCh0cnVlKTsKKworCQkvKiBkbyB0aGlzIGJlZm9yZSBvcGVuaW5nIHBpcGVzLCBpbiBjYXNlIHRoZXNlIGZhaWwgKi8KKwkJZS0+c2F2ZWZkWzBdID0gc2F2ZWZkKDApOworCQllLT5zYXZlZmRbMV0gPSBzYXZlZmQoMSk7CisKKwkJb3BlbnBpcGUocHYpOworCQlpZiAocHZbMF0gIT0gMCkgeworCQkJa3NoX2R1cDIocHZbMF0sIDAsIGZhbHNlKTsKKwkJCWNsb3NlKHB2WzBdKTsKKwkJfQorCQljb3Byb2Mud3JpdGUgPSBwdlsxXTsKKwkJY29wcm9jLmpvYiA9IE5VTEw7CisKKwkJaWYgKGNvcHJvYy5yZWFkdyA+PSAwKQorCQkJa3NoX2R1cDIoY29wcm9jLnJlYWR3LCAxLCBmYWxzZSk7CisJCWVsc2UgeworCQkJb3BlbnBpcGUocHYpOworCQkJY29wcm9jLnJlYWQgPSBwdlswXTsKKwkJCWtzaF9kdXAyKHB2WzFdLCAxLCBmYWxzZSk7CisJCQljb3Byb2MucmVhZHcgPSBwdlsxXTsJIC8qIGNsb3NlZCBiZWZvcmUgZmlyc3QgcmVhZCAqLworCQkJY29wcm9jLm5qb2JzID0gMDsKKwkJCS8qIGNyZWF0ZSBuZXcgY29wcm9jZXNzIGlkICovCisJCQkrK2NvcHJvYy5pZDsKKwkJfQorCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJZS0+dHlwZSA9IEVfRVhFQzsgLyogbm8gbW9yZSBuZWVkIGZvciBlcnJvciBoYW5kbGVyICovCisKKwkJLyogZXhjaGlsZCgpIGNsb3NlcyBjb3Byb2MuKiBpbiBjaGlsZCBhZnRlciBmb3JrLAorCQkgKiB3aWxsIGFsc28gaW5jcmVtZW50IGNvcHJvYy5uam9icyB3aGVuIHRoZQorCQkgKiBqb2IgaXMgYWN0dWFsbHkgY3JlYXRlZC4KKwkJICovCisJCWZsYWdzICY9IH5YRVhFQzsKKwkJZXhjaGlsZCh0LT5sZWZ0LCBmbGFncyB8IFhCR05EIHwgWEZPUksgfCBYQ09QUk9DIHwgWENDTE9TRSwKKwkJICAgIE5VTEwsIGNvcHJvYy5yZWFkdyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgVEFTWU5DOgorCQkvKiBYWFggbm9uLW9wdGltYWwsIEkgdGhpbmsgLSAiKGZvbyAmKSIsIGZvcmtzIGZvciAoKSwKKwkJICogZm9ya3MgYWdhaW4gZm9yIGFzeW5jLi4uIHBhcmVudCBzaG91bGQgb3B0aW1pc2UKKwkJICogdGhpcyB0byAiZm9vICYiLi4uCisJCSAqLworCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgKGZsYWdzJn5YRVhFQyl8WEJHTkR8WEZPUkssIHhlcnJvayk7CisJCWJyZWFrOworCisJY2FzZSBUT1I6CisJY2FzZSBUQU5EOgorCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgWEVSUk9LLCB4ZXJyb2spOworCQlpZiAoKHJ2ID09IDApID09ICh0LT50eXBlID09IFRBTkQpKQorCQkJcnYgPSBleGVjdXRlKHQtPnJpZ2h0LCBYRVJST0ssIHhlcnJvayk7CisJCWZsYWdzIHw9IFhFUlJPSzsKKwkJaWYgKHhlcnJvaykKKwkJCSp4ZXJyb2sgPSAxOworCQlicmVhazsKKworCWNhc2UgVEJBTkc6CisJCXJ2ID0gIWV4ZWN1dGUodC0+cmlnaHQsIFhFUlJPSywgeGVycm9rKTsKKwkJZmxhZ3MgfD0gWEVSUk9LOworCQlpZiAoeGVycm9rKQorCQkJKnhlcnJvayA9IDE7CisJCWJyZWFrOworCisJY2FzZSBUREJSQUNLRVQ6IHsKKwkJVGVzdF9lbnYgdGU7CisKKwkJdGUuZmxhZ3MgPSBURUZfREJSQUNLRVQ7CisJCXRlLnBvcy53cCA9IHQtPmFyZ3M7CisJCXRlLmlzYSA9IGRidGVzdGVfaXNhOworCQl0ZS5nZXRvcG5kID0gZGJ0ZXN0ZV9nZXRvcG5kOworCQl0ZS5ldmFsID0gdGVzdF9ldmFsOworCQl0ZS5lcnJvciA9IGRidGVzdGVfZXJyb3I7CisKKwkJcnYgPSB0ZXN0X3BhcnNlKCZ0ZSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgVEZPUjoKKwljYXNlIFRTRUxFQ1Q6IHsKKwkJdm9sYXRpbGUgYm9vbCBpc19maXJzdCA9IHRydWU7CisJCWFwID0gKHQtPnZhcnMgPT0gTlVMTCkgPyBlLT5sb2MtPmFyZ3YgKyAxIDoKKwkJICAgIChjb25zdCBjaGFyICoqKWV2YWwoKGNvbnN0IGNoYXIgKiopdC0+dmFycywKKwkJICAgIERPQkxBTksgfCBET0dMT0IgfCBET1RJTERFKTsKKwkJZS0+dHlwZSA9IEVfTE9PUDsKKwkJd2hpbGUgKDEpIHsKKwkJCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7CisJCQlpZiAoIWkpCisJCQkJYnJlYWs7CisJCQlpZiAoKGUtPmZsYWdzJkVGX0JSS0NPTlRfUEFTUykgfHwKKwkJCSAgICAoaSAhPSBMQlJFQUsgJiYgaSAhPSBMQ09OVElOKSkgeworCQkJCXF1aXRlbnYoTlVMTCk7CisJCQkJdW53aW5kKGkpOworCQkJfSBlbHNlIGlmIChpID09IExCUkVBSykgeworCQkJCXJ2ID0gMDsKKwkJCQlnb3RvIEJyZWFrOworCQkJfQorCQl9CisJCXJ2ID0gMDsgLyogaW4gY2FzZSBvZiBhIGNvbnRpbnVlICovCisJCWlmICh0LT50eXBlID09IFRGT1IpIHsKKwkJCXdoaWxlICgqYXAgIT0gTlVMTCkgeworCQkJCXNldHN0cihnbG9iYWwodC0+c3RyKSwgKmFwKyssIEtTSF9VTldJTkRfRVJST1IpOworCQkJCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKKwkJCX0KKwkJfSBlbHNlIHsgLyogVFNFTEVDVCAqLworCQkJZm9yICg7OykgeworCQkJCWlmICghKGNwID0gZG9fc2VsZWN0YXJncyhhcCwgaXNfZmlyc3QpKSkgeworCQkJCQlydiA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpc19maXJzdCA9IGZhbHNlOworCQkJCXNldHN0cihnbG9iYWwodC0+c3RyKSwgY3AsIEtTSF9VTldJTkRfRVJST1IpOworCQkJCWV4ZWN1dGUodC0+bGVmdCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBUV0hJTEU6CisJY2FzZSBUVU5USUw6CisJCWUtPnR5cGUgPSBFX0xPT1A7CisJCXdoaWxlICgxKSB7CisJCQlpID0gc2lnc2V0am1wKGUtPmpidWYsIDApOworCQkJaWYgKCFpKQorCQkJCWJyZWFrOworCQkJaWYgKChlLT5mbGFncyZFRl9CUktDT05UX1BBU1MpIHx8CisJCQkgICAgKGkgIT0gTEJSRUFLICYmIGkgIT0gTENPTlRJTikpIHsKKwkJCQlxdWl0ZW52KE5VTEwpOworCQkJCXVud2luZChpKTsKKwkJCX0gZWxzZSBpZiAoaSA9PSBMQlJFQUspIHsKKwkJCQlydiA9IDA7CisJCQkJZ290byBCcmVhazsKKwkJCX0KKwkJfQorCQlydiA9IDA7IC8qIGluIGNhc2Ugb2YgYSBjb250aW51ZSAqLworCQl3aGlsZSAoKGV4ZWN1dGUodC0+bGVmdCwgWEVSUk9LLCBOVUxMKSA9PSAwKSA9PQorCQkgICAgKHQtPnR5cGUgPT0gVFdISUxFKSkKKwkJCXJ2ID0gZXhlY3V0ZSh0LT5yaWdodCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7CisJCWJyZWFrOworCisJY2FzZSBUSUY6CisJY2FzZSBURUxJRjoKKwkJaWYgKHQtPnJpZ2h0ID09IE5VTEwpCisJCQlicmVhazsJLyogc2hvdWxkIGJlIGVycm9yICovCisJCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBYRVJST0ssIE5VTEwpID09IDAgPworCQkgICAgZXhlY3V0ZSh0LT5yaWdodC0+bGVmdCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvaykgOgorCQkgICAgZXhlY3V0ZSh0LT5yaWdodC0+cmlnaHQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOworCQlicmVhazsKKworCWNhc2UgVENBU0U6CisJCWNwID0gZXZhbHN0cih0LT5zdHIsIERPVElMREUpOworCQlmb3IgKHQgPSB0LT5sZWZ0OyB0ICE9IE5VTEwgJiYgdC0+dHlwZSA9PSBUUEFUOyB0ID0gdC0+cmlnaHQpCisJCSAgICBmb3IgKGFwID0gKGNvbnN0IGNoYXIgKiopdC0+dmFyczsgKmFwOyBhcCsrKQorCQkJaWYgKChzID0gZXZhbHN0cigqYXAsIERPVElMREV8RE9QQVQpKSAmJgorCQkJICAgIGdtYXRjaHgoY3AsIHMsIGZhbHNlKSkKKwkJCQlnb3RvIEZvdW5kOworCQlicmVhazsKKyBGb3VuZDoKKwkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOworCQlicmVhazsKKworCWNhc2UgVEJSQUNFOgorCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7CisJCWJyZWFrOworCisJY2FzZSBURlVOQ1Q6CisJCXJ2ID0gZGVmaW5lKHQtPnN0ciwgdCk7CisJCWJyZWFrOworCisJY2FzZSBUVElNRToKKwkJLyogQ2xlYXIgWEVYRUMgc28gbmVzdGVkIGV4ZWN1dGUoKSBjYWxsIGRvZXNuJ3QgZXhpdAorCQkgKiAoYWxsb3dzICJscyAtbCB8IHRpbWUgZ3JlcCBmb28iKS4KKwkJICovCisJCXJ2ID0gdGltZXgodCwgZmxhZ3MgJiB+WEVYRUMsIHhlcnJvayk7CisJCWJyZWFrOworCisJY2FzZSBURVhFQzoJCS8qIGFuIGV2YWwnZCBUQ09NICovCisJCXMgPSB0LT5hcmdzWzBdOworCQl1cCA9IG1ha2VudigpOworCQlyZXN0b3Jlc2lncygpOworCQljbGVhbnVwX3Byb2NfZW52KCk7CisJCXsKKwkJCXVuaW9uIG1rc2hfY2NwaGFjayBjYXJnczsKKworCQkJY2FyZ3Mucm8gPSB0LT5hcmdzOworCQkJZXhlY3ZlKHQtPnN0ciwgY2FyZ3MucncsIHVwKTsKKwkJCXJ2ID0gZXJybm87CisJCX0KKwkJaWYgKHJ2ID09IEVOT0VYRUMpCisJCQlzY3JpcHRleGVjKHQsIChjb25zdCBjaGFyICoqKXVwKTsKKwkJZWxzZQorCQkJZXJyb3JmKCIlczogJXMiLCBzLCBzdHJlcnJvcihydikpOworCX0KKyBCcmVhazoKKwlleHN0YXQgPSBydjsKKworCXF1aXRlbnYoTlVMTCk7CQkvKiByZXN0b3JlcyBJTyAqLworCWlmICgoZmxhZ3MmWEVYRUMpKQorCQl1bndpbmQoTEVYSVQpOwkvKiBleGl0IGNoaWxkICovCisJaWYgKHJ2ICE9IDAgJiYgIShmbGFncyAmIFhFUlJPSykgJiYKKwkgICAgKHhlcnJvayA9PSBOVUxMIHx8ICEqeGVycm9rKSkgeworCQl0cmFwc2lnKFNJR0VSUl8pOworCQlpZiAoRmxhZyhGRVJSRVhJVCkpCisJCQl1bndpbmQoTEVSUk9SKTsKKwl9CisJcmV0dXJuIChydik7Cit9CisKKy8qCisgKiBleGVjdXRlIHNpbXBsZSBjb21tYW5kCisgKi8KKworc3RhdGljIGludAorY29tZXhlYyhzdHJ1Y3Qgb3AgKnQsIHN0cnVjdCB0YmwgKnZvbGF0aWxlIHRwLCBjb25zdCBjaGFyICoqYXAsCisgICAgdm9sYXRpbGUgaW50IGZsYWdzLCB2b2xhdGlsZSBpbnQgKnhlcnJvaykKK3sKKwlpbnQgaTsKKwl2b2xhdGlsZSBpbnQgcnYgPSAwOworCWNvbnN0IGNoYXIgKmNwOworCWNvbnN0IGNoYXIgKipsYXN0cDsKKwlzdGF0aWMgc3RydWN0IG9wIHRleGVjOyAvKiBNdXN0IGJlIHN0YXRpYyAoWFhYIGJ1dCB3aHk/KSAqLworCWludCB0eXBlX2ZsYWdzOworCWludCBrZWVwYXNuX29rOworCWludCBmY2ZsYWdzID0gRkNfQkl8RkNfRlVOQ3xGQ19QQVRIOworCWJvb2wgYm91cm5lX2Z1bmN0aW9uX2NhbGwgPSBmYWxzZTsKKwlzdHJ1Y3QgYmxvY2sgKmxfZXhwYW5kLCAqbF9hc3NpZ247CisKKwkvKiBzbmFnIHRoZSBsYXN0IGFyZ3VtZW50IGZvciAkXyBYWFggbm90IHRoZSBzYW1lIGFzIEFUJlQga3NoLAorCSAqIHdoaWNoIG9ubHkgc2VlbXMgdG8gc2V0ICRfIGFmdGVyIGEgbmV3bGluZSAoYnV0IG5vdCBpbgorCSAqIGZ1bmN0aW9ucy9kb3Qgc2NyaXB0cywgYnV0IGluIGludGVyYWN0aXZlIGFuZCBzY3JpcHQpIC0KKwkgKiBwZXJoYXBzIHNhdmUgbGFzdCBhcmcgaGVyZSBhbmQgc2V0IGl0IGluIHNoZWxsKCk/LgorCSAqLworCWlmIChGbGFnKEZUQUxLSU5HKSAmJiAqKGxhc3RwID0gYXApKSB7CisJCXdoaWxlICgqKytsYXN0cCkKKwkJCTsKKwkJLyogc2V0c3RyKCkgY2FuJ3QgZmFpbCBoZXJlICovCisJCXNldHN0cih0eXBlc2V0KCJfIiwgTE9DQUwsIDAsIElOVEVHRVIsIDApLCAqLS1sYXN0cCwKKwkJICAgIEtTSF9SRVRVUk5fRVJST1IpOworCX0KKworCS8qIERlYWwgd2l0aCB0aGUgc2hlbGwgYnVpbHRpbnMgYnVpbHRpbiwgZXhlYyBhbmQgY29tbWFuZCBzaW5jZQorCSAqIHRoZXkgY2FuIGJlIGZvbGxvd2VkIGJ5IG90aGVyIGNvbW1hbmRzLiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKKwkgKiB3ZSBrbm93IGlmIHdlIHNob3VsZCBjcmVhdGUgYSBsb2NhbCBibG9jayB3aGljaCBtdXN0IGJlIGRvbmUKKwkgKiBiZWZvcmUgd2UgY2FuIGRvIGEgcGF0aCBzZWFyY2ggKGluIGNhc2UgdGhlIGFzc2lnbm1lbnRzIGNoYW5nZQorCSAqIFBBVEgpLgorCSAqIE9kZCBjYXNlczoKKwkgKglGT089YmFyIGV4ZWMgPi9kZXYvbnVsbAkJRk9PIGlzIGtlcHQgYnV0IG5vdCBleHBvcnRlZAorCSAqCUZPTz1iYXIgZXhlYyBmb29iYXIJCUZPTyBpcyBleHBvcnRlZAorCSAqCUZPTz1iYXIgY29tbWFuZCBleGVjID4vZGV2L251bGwJRk9PIGlzIG5laXRoZXIga2VwdCBub3IgZXhwb3J0ZWQKKwkgKglGT089YmFyIGNvbW1hbmQJCQlGT08gaXMgbmVpdGhlciBrZXB0IG5vciBleHBvcnRlZAorCSAqCVBBVEg9Li4uIGZvb2JhcgkJCXVzZSBuZXcgUEFUSCBpbiBmb29iYXIgc2VhcmNoCisJICovCisJa2VlcGFzbl9vayA9IDE7CisJd2hpbGUgKHRwICYmIHRwLT50eXBlID09IENTSEVMTCkgeworCQlmY2ZsYWdzID0gRkNfQkl8RkNfRlVOQ3xGQ19QQVRIOy8qIHVuZG8gZWZmZWN0cyBvZiBjb21tYW5kICovCisJCWlmICh0cC0+dmFsLmYgPT0gY19idWlsdGluKSB7CisJCQlpZiAoKGNwID0gKisrYXApID09IE5VTEwpIHsKKwkJCQl0cCA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0cCA9IGZpbmRjb20oY3AsIEZDX0JJKTsKKwkJCWlmICh0cCA9PSBOVUxMKQorCQkJCWVycm9yZigiYnVpbHRpbjogJXM6IG5vdCBhIGJ1aWx0aW4iLCBjcCk7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmICh0cC0+dmFsLmYgPT0gY19leGVjKSB7CisJCQlpZiAoYXBbMV0gPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCWFwKys7CisJCQlmbGFncyB8PSBYRVhFQzsKKwkJfSBlbHNlIGlmICh0cC0+dmFsLmYgPT0gY19jb21tYW5kKSB7CisJCQlpbnQgb3B0Yywgc2F3X3AgPSAwOworCisJCQkvKiBVZ2x5IGRlYWxpbmcgd2l0aCBvcHRpb25zIGluIHR3byBwbGFjZXMgKGhlcmUgYW5kCisJCQkgKiBpbiBjX2NvbW1hbmQoKSwgYnV0IHN1Y2ggaXMgbGlmZSkKKwkJCSAqLworCQkJa3NoX2dldG9wdF9yZXNldCgmYnVpbHRpbl9vcHQsIDApOworCQkJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdChhcCwgJmJ1aWx0aW5fb3B0LCAiOnAiKSkgPT0gJ3AnKQorCQkJCXNhd19wID0gMTsKKwkJCWlmIChvcHRjICE9IEVPRikKKwkJCQlicmVhazsJLyogY29tbWFuZCAtdlYgb3Igc29tZXRoaW5nICovCisJCQkvKiBkb24ndCBsb29rIGZvciBmdW5jdGlvbnMgKi8KKwkJCWZjZmxhZ3MgPSBGQ19CSXxGQ19QQVRIOworCQkJaWYgKHNhd19wKSB7CisJCQkJaWYgKEZsYWcoRlJFU1RSSUNURUQpKSB7CisJCQkJCXdhcm5pbmdmKHRydWUsCisJCQkJCSAgICAiY29tbWFuZCAtcDogcmVzdHJpY3RlZCIpOworCQkJCQlydiA9IDE7CisJCQkJCWdvdG8gTGVhdmU7CisJCQkJfQorCQkJCWZjZmxhZ3MgfD0gRkNfREVGUEFUSDsKKwkJCX0KKwkJCWFwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKwkJCS8qIFBPU0lYIHNheXMgc3BlY2lhbCBidWlsdGlucyBsb3NlIHRoZWlyIHN0YXR1cworCQkJICogaWYgYWNjZXNzZWQgdXNpbmcgY29tbWFuZC4KKwkJCSAqLworCQkJa2VlcGFzbl9vayA9IDA7CisJCQlpZiAoIWFwWzBdKSB7CisJCQkJLyogZW5zdXJlIGNvbW1hbmQgd2l0aCBubyBhcmdzIGV4aXRzIHdpdGggMCAqLworCQkJCXN1YnN0X2V4c3RhdCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZQorCQkJYnJlYWs7CisJCXRwID0gZmluZGNvbShhcFswXSwgZmNmbGFncyAmIChGQ19CSXxGQ19GVU5DKSk7CisJfQorCWxfZXhwYW5kID0gZS0+bG9jOworCWlmIChrZWVwYXNuX29rICYmICghYXBbMF0gfHwgKHRwICYmICh0cC0+ZmxhZyAmIEtFRVBBU04pKSkpCisJCXR5cGVfZmxhZ3MgPSAwOworCWVsc2UgeworCQkvKiBjcmVhdGUgbmV3IHZhcmlhYmxlL2Z1bmN0aW9uIGJsb2NrICovCisJCW5ld2Jsb2NrKCk7CisJCS8qIGtzaCBmdW5jdGlvbnMgZG9uJ3Qga2VlcCBhc3NpZ25tZW50cywgUE9TSVggZnVuY3Rpb25zIGRvLiAqLworCQlpZiAoa2VlcGFzbl9vayAmJiB0cCAmJiB0cC0+dHlwZSA9PSBDRlVOQyAmJgorCQkgICAgISh0cC0+ZmxhZyAmIEZLU0gpKSB7CisJCQlib3VybmVfZnVuY3Rpb25fY2FsbCA9IHRydWU7CisJCQl0eXBlX2ZsYWdzID0gRVhQT1JUOworCQl9IGVsc2UKKwkJCXR5cGVfZmxhZ3MgPSBMT0NBTHxMT0NBTF9DT1BZfEVYUE9SVDsKKwl9CisJbF9hc3NpZ24gPSBlLT5sb2M7CisJaWYgKEZsYWcoRkVYUE9SVCkpCisJCXR5cGVfZmxhZ3MgfD0gRVhQT1JUOworCWZvciAoaSA9IDA7IHQtPnZhcnNbaV07IGkrKykgeworCQkvKiBkbyBOT1QgbG9va3VwIGluIHRoZSBuZXcgdmFyL2ZuIGJsb2NrIGp1c3QgY3JlYXRlZCAqLworCQllLT5sb2MgPSBsX2V4cGFuZDsKKwkJY3AgPSBldmFsc3RyKHQtPnZhcnNbaV0sIERPQVNOVElMREUpOworCQllLT5sb2MgPSBsX2Fzc2lnbjsKKwkJLyogYnV0IGFzc2lnbiBpbiB0aGVyZSBhcyB1c3VhbCAqLworCisJCWlmIChGbGFnKEZYVFJBQ0UpKSB7CisJCQlpZiAoaSA9PSAwKQorCQkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlcyIsCisJCQkJCXN1YnN0aXR1dGUoc3RyX3ZhbChnbG9iYWwoIlBTNCIpKSwgMCkpOworCQkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzJWMiLCBjcCwKKwkJCSAgICB0LT52YXJzW2kgKyAxXSA/ICcgJyA6ICdcbicpOworCQkJaWYgKCF0LT52YXJzW2kgKyAxXSkKKwkJCQlzaGZfZmx1c2goc2hsX291dCk7CisJCX0KKwkJdHlwZXNldChjcCwgdHlwZV9mbGFncywgMCwgMCwgMCk7CisJCWlmIChib3VybmVfZnVuY3Rpb25fY2FsbCAmJiAhKHR5cGVfZmxhZ3MgJiBFWFBPUlQpKQorCQkJdHlwZXNldChjcCwgTE9DQUx8TE9DQUxfQ09QWXxFWFBPUlQsIDAsIDAsIDApOworCX0KKworCWlmICgoY3AgPSAqYXApID09IE5VTEwpIHsKKwkJcnYgPSBzdWJzdF9leHN0YXQ7CisJCWdvdG8gTGVhdmU7CisJfSBlbHNlIGlmICghdHApIHsKKwkJaWYgKEZsYWcoRlJFU1RSSUNURUQpICYmIHZzdHJjaHIoY3AsICcvJykpIHsKKwkJCXdhcm5pbmdmKHRydWUsICIlczogcmVzdHJpY3RlZCIsIGNwKTsKKwkJCXJ2ID0gMTsKKwkJCWdvdG8gTGVhdmU7CisJCX0KKwkJdHAgPSBmaW5kY29tKGNwLCBmY2ZsYWdzKTsKKwl9CisKKwlzd2l0Y2ggKHRwLT50eXBlKSB7CisJY2FzZSBDU0hFTEw6CQkJLyogc2hlbGwgYnVpbHQtaW4gKi8KKwkJcnYgPSBjYWxsX2J1aWx0aW4odHAsIChjb25zdCBjaGFyICoqKWFwKTsKKwkJYnJlYWs7CisKKwljYXNlIENGVU5DOiB7CQkJLyogZnVuY3Rpb24gY2FsbCAqLworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIG9sZF94ZmxhZzsKKwkJdm9sYXRpbGUgVGZsYWcgb2xkX2ludXNlOworCQljb25zdCBjaGFyICp2b2xhdGlsZSBvbGRfa3NobmFtZTsKKworCQlpZiAoISh0cC0+ZmxhZyAmIElTU0VUKSkgeworCQkJc3RydWN0IHRibCAqZnRwOworCisJCQlpZiAoIXRwLT51LmZwYXRoKSB7CisJCQkJaWYgKHRwLT51Mi5lcnJub18pIHsKKwkJCQkJd2FybmluZ2YodHJ1ZSwKKwkJCQkJICAgICIlczogY2FuJ3QgZmluZCBmdW5jdGlvbiAiCisJCQkJCSAgICAiZGVmaW5pdGlvbiBmaWxlIC0gJXMiLAorCQkJCQkgICAgY3AsIHN0cmVycm9yKHRwLT51Mi5lcnJub18pKTsKKwkJCQkJcnYgPSAxMjY7CisJCQkJfSBlbHNlIHsKKwkJCQkJd2FybmluZ2YodHJ1ZSwKKwkJCQkJICAgICIlczogY2FuJ3QgZmluZCBmdW5jdGlvbiAiCisJCQkJCSAgICAiZGVmaW5pdGlvbiBmaWxlIiwgY3ApOworCQkJCQlydiA9IDEyNzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaW5jbHVkZSh0cC0+dS5mcGF0aCwgMCwgTlVMTCwgMCkgPCAwKSB7CisJCQkJcnYgPSBlcnJubzsKKwkJCQl3YXJuaW5nZih0cnVlLAorCQkJCSAgICAiJXM6IGNhbid0IG9wZW4gZnVuY3Rpb24gZGVmaW5pdGlvbiBmaWxlICVzIC0gJXMiLAorCQkJCSAgICBjcCwgdHAtPnUuZnBhdGgsIHN0cmVycm9yKHJ2KSk7CisJCQkJcnYgPSAxMjc7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIShmdHAgPSBmaW5kZnVuYyhjcCwgaGFzaChjcCksIGZhbHNlKSkgfHwKKwkJCSAgICAhKGZ0cC0+ZmxhZyAmIElTU0VUKSkgeworCQkJCXdhcm5pbmdmKHRydWUsCisJCQkJICAgICIlczogZnVuY3Rpb24gbm90IGRlZmluZWQgYnkgJXMiLAorCQkJCSAgICBjcCwgdHAtPnUuZnBhdGgpOworCQkJCXJ2ID0gMTI3OworCQkJCWJyZWFrOworCQkJfQorCQkJdHAgPSBmdHA7CisJCX0KKworCQkvKiBrc2ggZnVuY3Rpb25zIHNldCAkMCB0byBmdW5jdGlvbiBuYW1lLCBQT1NJWCBmdW5jdGlvbnMgbGVhdmUKKwkJICogJDAgdW5jaGFuZ2VkLgorCQkgKi8KKwkJb2xkX2tzaG5hbWUgPSBrc2huYW1lOworCQlpZiAodHAtPmZsYWcgJiBGS1NIKQorCQkJa3NobmFtZSA9IGFwWzBdOworCQllbHNlCisJCQlhcFswXSA9IGtzaG5hbWU7CisJCWUtPmxvYy0+YXJndiA9IGFwOworCQlmb3IgKGkgPSAwOyAqYXArKyAhPSBOVUxMOyBpKyspCisJCQk7CisJCWUtPmxvYy0+YXJnYyA9IGkgLSAxOworCQkvKiBrc2gtc3R5bGUgZnVuY3Rpb25zIGhhbmRsZSBnZXRvcHRzIHNhbmVseSwKKwkJICogQm91cm5lL1BPU0lYIGZ1bmN0aW9ucyBhcmUgaW5zYW5lLi4uCisJCSAqLworCQlpZiAodHAtPmZsYWcgJiBGS1NIKSB7CisJCQllLT5sb2MtPmZsYWdzIHw9IEJGX0RPR0VUT1BUUzsKKwkJCWUtPmxvYy0+Z2V0b3B0c19zdGF0ZSA9IHVzZXJfb3B0OworCQkJZ2V0b3B0c19yZXNldCgxKTsKKwkJfQorCisJCW9sZF94ZmxhZyA9IEZsYWcoRlhUUkFDRSk7CisJCUZsYWcoRlhUUkFDRSkgPSB0cC0+ZmxhZyAmIFRSQUNFID8gMSA6IDA7CisKKwkJb2xkX2ludXNlID0gdHAtPmZsYWcgJiBGSU5VU0U7CisJCXRwLT5mbGFnIHw9IEZJTlVTRTsKKworCQllLT50eXBlID0gRV9GVU5DOworCQlpID0gc2lnc2V0am1wKGUtPmpidWYsIDApOworCQlpZiAoaSA9PSAwKSB7CisJCQkvKiBzZWVtcyBvZGQgdG8gcGFzcyBYRVJST0sgaGVyZSwgYnV0IEFUJlQga3NoIGRvZXMgKi8KKwkJCWV4c3RhdCA9IGV4ZWN1dGUodHAtPnZhbC50LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKKwkJCWkgPSBMUkVUVVJOOworCQl9CisJCWtzaG5hbWUgPSBvbGRfa3NobmFtZTsKKwkJRmxhZyhGWFRSQUNFKSA9IG9sZF94ZmxhZzsKKwkJdHAtPmZsYWcgPSAodHAtPmZsYWcgJiB+RklOVVNFKSB8IG9sZF9pbnVzZTsKKwkJLyogV2VyZSB3ZSBkZWxldGVkIHdoaWxlIGV4ZWN1dGluZz8gSWYgc28sIGZyZWUgdGhlIGV4ZWN1dGlvbgorCQkgKiB0cmVlLiB0b2RvOiBVbmZvcnR1bmF0ZWx5LCB0aGUgdGFibGUgZW50cnkgaXMgbmV2ZXIgcmUtdXNlZAorCQkgKiB1bnRpbCB0aGUgbG9va3VwIHRhYmxlIGlzIGV4cGFuZGVkLgorCQkgKi8KKwkJaWYgKCh0cC0+ZmxhZyAmIChGREVMRVRFfEZJTlVTRSkpID09IEZERUxFVEUpIHsKKwkJCWlmICh0cC0+ZmxhZyAmIEFMTE9DKSB7CisJCQkJdHAtPmZsYWcgJj0gfkFMTE9DOworCQkJCXRmcmVlKHRwLT52YWwudCwgdHAtPmFyZWFwKTsKKwkJCX0KKwkJCXRwLT5mbGFnID0gMDsKKwkJfQorCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSBMUkVUVVJOOgorCQljYXNlIExFUlJPUjoKKwkJCXJ2ID0gZXhzdGF0OworCQkJYnJlYWs7CisJCWNhc2UgTElOVFI6CisJCWNhc2UgTEVYSVQ6CisJCWNhc2UgTExFQVZFOgorCQljYXNlIExTSEVMTDoKKwkJCXF1aXRlbnYoTlVMTCk7CisJCQl1bndpbmQoaSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCWRlZmF1bHQ6CisJCQlxdWl0ZW52KE5VTEwpOworCQkJaW50ZXJuYWxfZXJyb3JmKCJDRlVOQyAlZCIsIGkpOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgQ0VYRUM6CQkvKiBleGVjdXRhYmxlIGNvbW1hbmQgKi8KKwljYXNlIENUQUxJQVM6CQkvKiB0cmFja2VkIGFsaWFzICovCisJCWlmICghKHRwLT5mbGFnJklTU0VUKSkgeworCQkJLyogZXJybm9fIHdpbGwgYmUgc2V0IGlmIHRoZSBuYW1lZCBjb21tYW5kIHdhcyBmb3VuZAorCQkJICogYnV0IGNvdWxkIG5vdCBiZSBleGVjdXRlZCAocGVybWlzc2lvbnMsIG5vIGV4ZWN1dGUKKwkJCSAqIGJpdCwgZGlyZWN0b3J5LCBldGMpLiBQcmludCBvdXQgYSAoaG9wZWZ1bGx5KQorCQkJICogdXNlZnVsIGVycm9yIG1lc3NhZ2UgYW5kIHNldCB0aGUgZXhpdCBzdGF0dXMgdG8gMTI2LgorCQkJICovCisJCQlpZiAodHAtPnUyLmVycm5vXykgeworCQkJCXdhcm5pbmdmKHRydWUsICIlczogY2Fubm90IGV4ZWN1dGUgLSAlcyIsIGNwLAorCQkJCSAgICBzdHJlcnJvcih0cC0+dTIuZXJybm9fKSk7CisJCQkJcnYgPSAxMjY7CS8qIFBPU0lYICovCisJCQl9IGVsc2UgeworCQkJCXdhcm5pbmdmKHRydWUsICIlczogbm90IGZvdW5kIiwgY3ApOworCQkJCXJ2ID0gMTI3OworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKiBzZXQgJF8gdG8gcHJvZ3JhbW1lJ3MgZnVsbCBwYXRoICovCisJCS8qIHNldHN0cigpIGNhbid0IGZhaWwgaGVyZSAqLworCQlzZXRzdHIodHlwZXNldCgiXyIsIExPQ0FMfEVYUE9SVCwgMCwgSU5URUdFUiwgMCksCisJCSAgICB0cC0+dmFsLnMsIEtTSF9SRVRVUk5fRVJST1IpOworCisJCWlmIChmbGFncyZYRVhFQykgeworCQkJal9leGl0KCk7CisJCQlpZiAoIShmbGFncyZYQkdORCkKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJCQkgICAgfHwgRmxhZyhGTU9OSVRPUikKKyNlbmRpZgorCQkJICAgICkgeworCQkJCXNldGV4ZWNzaWcoJnNpZ3RyYXBzW1NJR0lOVF0sIFNTX1JFU1RPUkVfT1JJRyk7CisJCQkJc2V0ZXhlY3NpZygmc2lndHJhcHNbU0lHUVVJVF0sIFNTX1JFU1RPUkVfT1JJRyk7CisJCQl9CisJCX0KKworCQkvKiB0byBmb3JrIHdlIHNldCB1cCBhIFRFWEVDIG5vZGUgYW5kIGNhbGwgZXhlY3V0ZSAqLworCQl0ZXhlYy50eXBlID0gVEVYRUM7CisJCXRleGVjLmxlZnQgPSB0OwkvKiBmb3IgdHByaW50ICovCisJCXRleGVjLnN0ciA9IHRwLT52YWwuczsKKwkJdGV4ZWMuYXJncyA9IGFwOworCQlydiA9IGV4Y2hpbGQoJnRleGVjLCBmbGFncywgeGVycm9rLCAtMSk7CisJCWJyZWFrOworCX0KKyBMZWF2ZToKKwlpZiAoZmxhZ3MgJiBYRVhFQykgeworCQlleHN0YXQgPSBydjsKKwkJdW53aW5kKExMRUFWRSk7CisJfQorCXJldHVybiAocnYpOworfQorCitzdGF0aWMgdm9pZAorc2NyaXB0ZXhlYyhzdHJ1Y3Qgb3AgKnRwLCBjb25zdCBjaGFyICoqYXApCit7CisJY29uc3QgY2hhciAqc2g7CisjaWZuZGVmIE1LU0hfU01BTEwKKwl1bnNpZ25lZCBjaGFyICpjcDsKKwljaGFyIGJ1Zls2NF07CQkvKiA2NCA9PSBNQVhJTlRFUlAgaW4gTWlyQlNEIDxzeXMvcGFyYW0uaD4gKi8KKwlpbnQgZmQ7CisjZW5kaWYKKwl1bmlvbiBta3NoX2NjcGhhY2sgYXJncywgY2FwOworCisJc2ggPSBzdHJfdmFsKGdsb2JhbCgiRVhFQ1NIRUxMIikpOworCWlmIChzaCAmJiAqc2gpCisJCXNoID0gc2VhcmNoKHNoLCBwYXRoLCBYX09LLCBOVUxMKTsKKwlpZiAoIXNoIHx8ICEqc2gpCisJCXNoID0gTUtTSF9ERUZBVUxUX0VYRUNTSEVMTDsKKworCSp0cC0+YXJncy0tID0gdHAtPnN0cjsKKworI2lmbmRlZiBNS1NIX1NNQUxMCisJaWYgKChmZCA9IG9wZW4odHAtPnN0ciwgT19SRE9OTFkpKSA+PSAwKSB7CisJCS8qIHJlYWQgZmlyc3QgTUFYSU5URVJQIG9jdGV0cyBmcm9tIGZpbGUgKi8KKwkJaWYgKHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpIDw9IDApCisJCQkvKiByZWFkIGVycm9yIC0+IG5vIGdvb2QgKi8KKwkJCWJ1ZlswXSA9ICdcMCc7CisJCWNsb3NlKGZkKTsKKwkJLyogc2NhbiBmb3IgbmV3bGluZSAob3IgQ1IpIG9yIE5VTCBfYmVmb3JlXyBlbmQgb2YgYnVmZmVyICovCisJCWNwID0gKHVuc2lnbmVkIGNoYXIgKilidWY7CisJCXdoaWxlICgoY2hhciAqKWNwIDwgKGJ1ZiArIHNpemVvZihidWYpKSkKKwkJCWlmICgqY3AgPT0gJ1wwJyB8fCAqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJ1xyJykgeworCQkJCSpjcCA9ICdcMCc7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQkrK2NwOworCQkvKiBpZiB0aGUgc2hlYmFuZyBsaW5lIGlzIGxvbmdlciB0aGFuIE1BWElOVEVSUCwgYmFpbCBvdXQgKi8KKwkJaWYgKChjaGFyICopY3AgPj0gKGJ1ZiArIHNpemVvZihidWYpKSkKKwkJCWdvdG8gbm9zaGViYW5nOworCQkvKiBza2lwIFVURi04IEJ5dGUgT3JkZXIgTWFyaywgaWYgcHJlc2VudCAqLworCQljcCA9ICh1bnNpZ25lZCBjaGFyICopYnVmOworCQlpZiAoKGNwWzBdID09IDB4RUYpICYmIChjcFsxXSA9PSAweEJCKSAmJiAoY3BbMl0gPT0gMHhCRikpCisJCQljcCArPSAzOworCQkvKiBiYWlsIG91dCBpZiByZWFkIGVycm9yIChhYm92ZSkgb3Igbm8gc2hlYmFuZyAqLworCQlpZiAoKGNwWzBdICE9ICcjJykgfHwgKGNwWzFdICE9ICchJykpCisJCQlnb3RvIG5vc2hlYmFuZzsKKwkJY3AgKz0gMjsKKwkJLyogc2tpcCB3aGl0ZXNwYWNlIGJlZm9yZSBzaGVsbCBuYW1lICovCisJCXdoaWxlICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKQorCQkJKytjcDsKKwkJLyoganVzdCB3aGl0ZXNwYWNlIG9uIHRoZSBsaW5lPyAqLworCQlpZiAoKmNwID09ICdcMCcpCisJCQlnb3RvIG5vc2hlYmFuZzsKKwkJLyogbm8sIHdlIGFjdHVhbGx5IGZvdW5kIGFuIGludGVycHJldGVyIG5hbWUgKi8KKwkJc2ggPSAoY2hhciAqKWNwOworCQkvKiBsb29rIGZvciBlbmQgb2Ygc2hlbGwvaW50ZXJwcmV0ZXIgbmFtZSAqLworCQl3aGlsZSAoKmNwICE9ICcgJyAmJiAqY3AgIT0gJ1x0JyAmJiAqY3AgIT0gJ1wwJykKKwkJCSsrY3A7CisJCS8qIGFueSBhcmd1bWVudHM/ICovCisJCWlmICgqY3ApIHsKKwkJCSpjcCsrID0gJ1wwJzsKKwkJCS8qIHNraXAgc3BhY2VzIGJlZm9yZSBhcmd1bWVudHMgKi8KKwkJCXdoaWxlICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKQorCQkJCSsrY3A7CisJCQkvKiBwYXNzIGl0IGFsbCBpbiBPTkUgYXJndW1lbnQgKGhpc3RvcmljIHJlYXNvbnMpICovCisJCQlpZiAoKmNwKQorCQkJCSp0cC0+YXJncy0tID0gKGNoYXIgKiljcDsKKwkJfQorIG5vc2hlYmFuZzoKKwkJZmQgPSBidWZbMF0gPDwgOCB8IGJ1ZlsxXTsKKwkJaWYgKChmZCA9PSAvKiBPTUFHSUMgKi8gMDQwNykgfHwKKwkJICAgIChmZCA9PSAvKiBOTUFHSUMgKi8gMDQxMCkgfHwKKwkJICAgIChmZCA9PSAvKiBaTUFHSUMgKi8gMDQxMykgfHwKKwkJICAgIChmZCA9PSAvKiBRTUFHSUMgKi8gMDMxNCkgfHwKKwkJICAgIChmZCA9PSAvKiBFQ09GRl9JMzg2ICovIDB4NEMwMSkgfHwKKwkJICAgIChmZCA9PSAvKiBFQ09GRl9NNjhLICovIDB4MDE1MCB8fCBmZCA9PSAweDUwMDEpIHx8CisJCSAgICAoZmQgPT0gLyogRUNPRkZfU0ggKi8gICAweDA1MDAgfHwgZmQgPT0gMHgwMDA1KSB8fAorCQkgICAgKGZkID09IDB4N0Y0NSAmJiBidWZbMl0gPT0gJ0wnICYmIGJ1ZlszXSA9PSAnRicpIHx8CisJCSAgICAoZmQgPT0gLyogIk1aIiAqLyAweDRENUEpIHx8CisJCSAgICAoZmQgPT0gLyogZ3ppcCAqLyAweDFGOEIpKQorCQkJZXJyb3JmKCIlczogbm90IGV4ZWN1dGFibGU6IG1hZ2ljICUwNFgiLCB0cC0+c3RyLCBmZCk7CisJfQorI2VuZGlmCisJYXJncy5ybyA9IHRwLT5hcmdzOworCSphcmdzLnJvID0gc2g7CisKKwljYXAucm8gPSBhcDsKKwlleGVjdmUoYXJncy5yd1swXSwgYXJncy5ydywgY2FwLnJ3KTsKKworCS8qIHJlcG9ydCBib3RoIHRoZSBwcm9ncmFtbWUgdGhhdCB3YXMgcnVuIGFuZCB0aGUgYm9ndXMgaW50ZXJwcmV0ZXIgKi8KKwllcnJvcmYoIiVzOiAlczogJXMiLCB0cC0+c3RyLCBzaCwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworaW50CitzaGNvbWV4ZWMoY29uc3QgY2hhciAqKndwKQoreworCXN0cnVjdCB0YmwgKnRwOworCisJdHAgPSBrdHNlYXJjaCgmYnVpbHRpbnMsICp3cCwgaGFzaCgqd3ApKTsKKwlpZiAodHAgPT0gTlVMTCkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGNvbWV4ZWM6ICVzIiwgKndwKTsKKwlyZXR1cm4gKGNhbGxfYnVpbHRpbih0cCwgd3ApKTsKK30KKworLyoKKyAqIFNlYXJjaCBmdW5jdGlvbiB0YWJsZXMgZm9yIGEgZnVuY3Rpb24uIElmIGNyZWF0ZSBzZXQsIGEgdGFibGUgZW50cnkKKyAqIGlzIGNyZWF0ZWQgaWYgbm9uZSBpcyBmb3VuZC4KKyAqLworc3RydWN0IHRibCAqCitmaW5kZnVuYyhjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBoLCBib29sIGNyZWF0ZSkKK3sKKwlzdHJ1Y3QgYmxvY2sgKmw7CisJc3RydWN0IHRibCAqdHAgPSBOVUxMOworCisJZm9yIChsID0gZS0+bG9jOyBsOyBsID0gbC0+bmV4dCkgeworCQl0cCA9IGt0c2VhcmNoKCZsLT5mdW5zLCBuYW1lLCBoKTsKKwkJaWYgKHRwKQorCQkJYnJlYWs7CisJCWlmICghbC0+bmV4dCAmJiBjcmVhdGUpIHsKKwkJCXRwID0ga3RlbnRlcigmbC0+ZnVucywgbmFtZSwgaCk7CisJCQl0cC0+ZmxhZyA9IERFRklORUQ7CisJCQl0cC0+dHlwZSA9IENGVU5DOworCQkJdHAtPnZhbC50ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAodHApOworfQorCisvKgorICogZGVmaW5lIGZ1bmN0aW9uLiBSZXR1cm5zIDEgaWYgZnVuY3Rpb24gaXMgYmVpbmcgdW5kZWZpbmVkICh0ID09IDApIGFuZAorICogZnVuY3Rpb24gZGlkIG5vdCBleGlzdCwgcmV0dXJucyAwIG90aGVyd2lzZS4KKyAqLworaW50CitkZWZpbmUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG9wICp0KQoreworCXN0cnVjdCB0YmwgKnRwOworCWJvb2wgd2FzX3NldCA9IGZhbHNlOworCisJd2hpbGUgKDEpIHsKKwkJdHAgPSBmaW5kZnVuYyhuYW1lLCBoYXNoKG5hbWUpLCB0cnVlKTsKKworCQlpZiAodHAtPmZsYWcgJiBJU1NFVCkKKwkJCXdhc19zZXQgPSB0cnVlOworCQkvKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBleGVjdXRlZCwgd2UgemFwIHRoaXMKKwkJICogdGFibGUgZW50cnkgc28gZmluZGZ1bmMoKSB3b24ndCBzZWUgaXQKKwkJICovCisJCWlmICh0cC0+ZmxhZyAmIEZJTlVTRSkgeworCQkJdHAtPm5hbWVbMF0gPSAnXDAnOworCQkJdHAtPmZsYWcgJj0gfkRFRklORUQ7IC8qIGVuc3VyZSBpdCB3b24ndCBiZSBmb3VuZCAqLworCQkJdHAtPmZsYWcgfD0gRkRFTEVURTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisKKwlpZiAodHAtPmZsYWcgJiBBTExPQykgeworCQl0cC0+ZmxhZyAmPSB+KElTU0VUfEFMTE9DKTsKKwkJdGZyZWUodHAtPnZhbC50LCB0cC0+YXJlYXApOworCX0KKworCWlmICh0ID09IE5VTEwpIHsJCS8qIHVuZGVmaW5lICovCisJCWt0ZGVsZXRlKHRwKTsKKwkJcmV0dXJuICh3YXNfc2V0ID8gMCA6IDEpOworCX0KKworCXRwLT52YWwudCA9IHRjb3B5KHQtPmxlZnQsIHRwLT5hcmVhcCk7CisJdHAtPmZsYWcgfD0gKElTU0VUfEFMTE9DKTsKKwlpZiAodC0+dS5rc2hfZnVuYykKKwkJdHAtPmZsYWcgfD0gRktTSDsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBhZGQgYnVpbHRpbgorICovCit2b2lkCitidWlsdGluKGNvbnN0IGNoYXIgKm5hbWUsIGludCAoKmZ1bmMpIChjb25zdCBjaGFyICoqKSkKK3sKKwlzdHJ1Y3QgdGJsICp0cDsKKwlUZmxhZyBmbGFnOworCisJLyogc2VlIGlmIGFueSBmbGFncyBzaG91bGQgYmUgc2V0IGZvciB0aGlzIGJ1aWx0aW4gKi8KKwlmb3IgKGZsYWcgPSAwOyA7IG5hbWUrKykgeworCQlpZiAoKm5hbWUgPT0gJz0nKQkvKiBjb21tYW5kIGRvZXMgdmFyaWFibGUgYXNzaWdubWVudCAqLworCQkJZmxhZyB8PSBLRUVQQVNOOworCQllbHNlIGlmICgqbmFtZSA9PSAnKicpCS8qIFBPU0lYIHNwZWNpYWwgYnVpbHRpbiAqLworCQkJZmxhZyB8PSBTUEVDX0JJOworCQllbHNlIGlmICgqbmFtZSA9PSAnKycpCS8qIFBPU0lYIHJlZ3VsYXIgYnVpbHRpbiAqLworCQkJZmxhZyB8PSBSRUdfQkk7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCXRwID0ga3RlbnRlcigmYnVpbHRpbnMsIG5hbWUsIGhhc2gobmFtZSkpOworCXRwLT5mbGFnID0gREVGSU5FRCB8IGZsYWc7CisJdHAtPnR5cGUgPSBDU0hFTEw7CisJdHAtPnZhbC5mID0gZnVuYzsKK30KKworLyoKKyAqIGZpbmQgY29tbWFuZAorICogZWl0aGVyIGZ1bmN0aW9uLCBoYXNoZWQgY29tbWFuZCwgb3IgYnVpbHQtaW4gKGluIHRoYXQgb3JkZXIpCisgKi8KK3N0cnVjdCB0YmwgKgorZmluZGNvbShjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpCit7CisJc3RhdGljIHN0cnVjdCB0YmwgdGVtcDsKKwl1aW50MzJfdCBoID0gaGFzaChuYW1lKTsKKwlzdHJ1Y3QgdGJsICp0cCA9IE5VTEwsICp0Ymk7CisJdW5zaWduZWQgY2hhciBpbnNlcnQgPSBGbGFnKEZUUkFDS0FMTCk7CS8qIGluc2VydCBpZiBub3QgZm91bmQgKi8KKwljaGFyICpmcGF0aDsJCQkvKiBmb3IgZnVuY3Rpb24gYXV0b2xvYWRpbmcgKi8KKwl1bmlvbiBta3NoX2NjaGFjayBucGF0aDsKKworCWlmICh2c3RyY2hyKG5hbWUsICcvJykpIHsKKwkJaW5zZXJ0ID0gMDsKKwkJLyogcHJldmVudCBGUEFUSCBzZWFyY2ggYmVsb3cgKi8KKwkJZmxhZ3MgJj0gfkZDX0ZVTkM7CisJCWdvdG8gU2VhcmNoOworCX0KKwl0YmkgPSAoZmxhZ3MgJiBGQ19CSSkgPyBrdHNlYXJjaCgmYnVpbHRpbnMsIG5hbWUsIGgpIDogTlVMTDsKKwkvKiBQT1NJWCBzYXlzIHNwZWNpYWwgYnVpbHRpbnMgZmlyc3QsIHRoZW4gZnVuY3Rpb25zLCB0aGVuCisJICogUE9TSVggcmVndWxhciBidWlsdGlucywgdGhlbiBzZWFyY2ggcGF0aC4uLgorCSAqLworCWlmICgoZmxhZ3MgJiBGQ19TUEVDQkkpICYmIHRiaSAmJiAodGJpLT5mbGFnICYgU1BFQ19CSSkpCisJCXRwID0gdGJpOworCWlmICghdHAgJiYgKGZsYWdzICYgRkNfRlVOQykpIHsKKwkJdHAgPSBmaW5kZnVuYyhuYW1lLCBoLCBmYWxzZSk7CisJCWlmICh0cCAmJiAhKHRwLT5mbGFnICYgSVNTRVQpKSB7CisJCQlpZiAoKGZwYXRoID0gc3RyX3ZhbChnbG9iYWwoIkZQQVRIIikpKSA9PSBudWxsKSB7CisJCQkJdHAtPnUuZnBhdGggPSBOVUxMOworCQkJCXRwLT51Mi5lcnJub18gPSAwOworCQkJfSBlbHNlCisJCQkJdHAtPnUuZnBhdGggPSBzZWFyY2gobmFtZSwgZnBhdGgsIFJfT0ssCisJCQkJICAgICZ0cC0+dTIuZXJybm9fKTsKKwkJfQorCX0KKwlpZiAoIXRwICYmIChmbGFncyAmIEZDX1JFR0JJKSAmJiB0YmkgJiYgKHRiaS0+ZmxhZyAmIFJFR19CSSkpCisJCXRwID0gdGJpOworCWlmICghdHAgJiYgKGZsYWdzICYgRkNfVU5SRUdCSSkgJiYgdGJpKQorCQl0cCA9IHRiaTsKKwlpZiAoIXRwICYmIChmbGFncyAmIEZDX1BBVEgpICYmICEoZmxhZ3MgJiBGQ19ERUZQQVRIKSkgeworCQl0cCA9IGt0c2VhcmNoKCZ0YWxpYXNlcywgbmFtZSwgaCk7CisJCWlmICh0cCAmJiAodHAtPmZsYWcgJiBJU1NFVCkgJiYgYWNjZXNzKHRwLT52YWwucywgWF9PSykgIT0gMCkgeworCQkJaWYgKHRwLT5mbGFnICYgQUxMT0MpIHsKKwkJCQl0cC0+ZmxhZyAmPSB+QUxMT0M7CisJCQkJYWZyZWUodHAtPnZhbC5zLCBBUEVSTSk7CisJCQl9CisJCQl0cC0+ZmxhZyAmPSB+SVNTRVQ7CisJCX0KKwl9CisKKyBTZWFyY2g6CisJaWYgKCghdHAgfHwgKHRwLT50eXBlID09IENUQUxJQVMgJiYgISh0cC0+ZmxhZyZJU1NFVCkpKSAmJgorCSAgICAoZmxhZ3MgJiBGQ19QQVRIKSkgeworCQlpZiAoIXRwKSB7CisJCQlpZiAoaW5zZXJ0ICYmICEoZmxhZ3MgJiBGQ19ERUZQQVRIKSkgeworCQkJCXRwID0ga3RlbnRlcigmdGFsaWFzZXMsIG5hbWUsIGgpOworCQkJCXRwLT50eXBlID0gQ1RBTElBUzsKKwkJCX0gZWxzZSB7CisJCQkJdHAgPSAmdGVtcDsKKwkJCQl0cC0+dHlwZSA9IENFWEVDOworCQkJfQorCQkJdHAtPmZsYWcgPSBERUZJTkVEOwkvKiBtYWtlIH5JU1NFVCAqLworCQl9CisJCW5wYXRoLnJvID0gc2VhcmNoKG5hbWUsIGZsYWdzICYgRkNfREVGUEFUSCA/IGRlZl9wYXRoIDogcGF0aCwKKwkJICAgIFhfT0ssICZ0cC0+dTIuZXJybm9fKTsKKwkJaWYgKG5wYXRoLnJvKSB7CisJCQlzdHJkdXB4KHRwLT52YWwucywgbnBhdGgucm8sIEFQRVJNKTsKKwkJCWlmIChucGF0aC5ybyAhPSBuYW1lKQorCQkJCWFmcmVlKG5wYXRoLnJ3LCBBVEVNUCk7CisJCQl0cC0+ZmxhZyB8PSBJU1NFVHxBTExPQzsKKwkJfSBlbHNlIGlmICgoZmxhZ3MgJiBGQ19GVU5DKSAmJgorCQkgICAgKGZwYXRoID0gc3RyX3ZhbChnbG9iYWwoIkZQQVRIIikpKSAhPSBudWxsICYmCisJCSAgICAobnBhdGgucm8gPSBzZWFyY2gobmFtZSwgZnBhdGgsIFJfT0ssCisJCSAgICAmdHAtPnUyLmVycm5vXykpICE9IE5VTEwpIHsKKwkJCS8qIEFuIHVuZG9jdW1lbnRlZCBmZWF0dXJlIG9mIEFUJlQga3NoIGlzIHRoYXQgaXQKKwkJCSAqIHNlYXJjaGVzIEZQQVRIIGlmIGEgY29tbWFuZCBpcyBub3QgZm91bmQsIGV2ZW4KKwkJCSAqIGlmIHRoZSBjb21tYW5kIGhhc24ndCBiZWVuIHNldCB1cCBhcyBhbiBhdXRvbG9hZGVkCisJCQkgKiBmdW5jdGlvbiAoaWUsIG5vIHR5cGVzZXQgLXVmKS4KKwkJCSAqLworCQkJdHAgPSAmdGVtcDsKKwkJCXRwLT50eXBlID0gQ0ZVTkM7CisJCQl0cC0+ZmxhZyA9IERFRklORUQ7IC8qIG1ha2UgfklTU0VUICovCisJCQl0cC0+dS5mcGF0aCA9IG5wYXRoLnJvOworCQl9CisJfQorCXJldHVybiAodHApOworfQorCisvKgorICogZmx1c2ggZXhlY3V0YWJsZSBjb21tYW5kcyB3aXRoIHJlbGF0aXZlIHBhdGhzCisgKi8KK3ZvaWQKK2ZsdXNoY29tKGludCBhbGwpCS8qIGp1c3QgcmVsYXRpdmUgb3IgYWxsICovCit7CisJc3RydWN0IHRibCAqdHA7CisJc3RydWN0IHRzdGF0ZSB0czsKKworCWZvciAoa3R3YWxrKCZ0cywgJnRhbGlhc2VzKTsgKHRwID0ga3RuZXh0KCZ0cykpICE9IE5VTEw7ICkKKwkJaWYgKCh0cC0+ZmxhZyZJU1NFVCkgJiYgKGFsbCB8fCB0cC0+dmFsLnNbMF0gIT0gJy8nKSkgeworCQkJaWYgKHRwLT5mbGFnJkFMTE9DKSB7CisJCQkJdHAtPmZsYWcgJj0gfihBTExPQ3xJU1NFVCk7CisJCQkJYWZyZWUodHAtPnZhbC5zLCBBUEVSTSk7CisJCQl9CisJCQl0cC0+ZmxhZyAmPSB+SVNTRVQ7CisJCX0KK30KKworLyogQ2hlY2sgaWYgcGF0aCBpcyBzb21ldGhpbmcgd2Ugd2FudCB0byBmaW5kLiBSZXR1cm5zIC0xIGZvciBmYWlsdXJlLiAqLworaW50CitzZWFyY2hfYWNjZXNzKGNvbnN0IGNoYXIgKmxwYXRoLCBpbnQgbW9kZSwKKyAgICBpbnQgKmVycm5vcCkJLyogc2V0IGlmIGNhbmRpZGF0ZSBmb3VuZCwgYnV0IG5vdCBzdWl0YWJsZSAqLworeworCWludCByZXQsIGVyciA9IDA7CisJc3RydWN0IHN0YXQgc3RhdGI7CisKKwlpZiAoc3RhdChscGF0aCwgJnN0YXRiKSA8IDApCisJCXJldHVybiAoLTEpOworCXJldCA9IGFjY2VzcyhscGF0aCwgbW9kZSk7CisJaWYgKHJldCA8IDApCisJCWVyciA9IGVycm5vOyAvKiBGaWxlIGV4aXN0cywgYnV0IHdlIGNhbid0IGFjY2VzcyBpdCAqLworCWVsc2UgaWYgKG1vZGUgPT0gWF9PSyAmJiAoIVNfSVNSRUcoc3RhdGIuc3RfbW9kZSkgfHwKKwkgICAgIShzdGF0Yi5zdF9tb2RlICYgKFNfSVhVU1J8U19JWEdSUHxTX0lYT1RIKSkpKSB7CisJCS8qIFRoaXMgJ2NhdXNlIGFjY2VzcygpIHNheXMgcm9vdCBjYW4gZXhlY3V0ZSBldmVyeXRoaW5nICovCisJCXJldCA9IC0xOworCQllcnIgPSBTX0lTRElSKHN0YXRiLnN0X21vZGUpID8gRUlTRElSIDogRUFDQ0VTOworCX0KKwlpZiAoZXJyICYmIGVycm5vcCAmJiAhKmVycm5vcCkKKwkJKmVycm5vcCA9IGVycjsKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qCisgKiBzZWFyY2ggZm9yIGNvbW1hbmQgd2l0aCBQQVRICisgKi8KK2NvbnN0IGNoYXIgKgorc2VhcmNoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmxwYXRoLAorICAgIGludCBtb2RlLAkJLyogUl9PSyBvciBYX09LICovCisgICAgaW50ICplcnJub3ApCS8qIHNldCBpZiBjYW5kaWRhdGUgZm91bmQsIGJ1dCBub3Qgc3VpdGFibGUgKi8KK3sKKwljb25zdCBjaGFyICpzcCwgKnA7CisJY2hhciAqeHA7CisJWFN0cmluZyB4czsKKwlpbnQgbmFtZWxlbjsKKworCWlmIChlcnJub3ApCisJCSplcnJub3AgPSAwOworCWlmICh2c3RyY2hyKG5hbWUsICcvJykpIHsKKwkJaWYgKHNlYXJjaF9hY2Nlc3MobmFtZSwgbW9kZSwgZXJybm9wKSA9PSAwKQorCQkJcmV0dXJuIChuYW1lKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwluYW1lbGVuID0gc3RybGVuKG5hbWUpICsgMTsKKwlYaW5pdCh4cywgeHAsIDEyOCwgQVRFTVApOworCisJc3AgPSBscGF0aDsKKwl3aGlsZSAoc3AgIT0gTlVMTCkgeworCQl4cCA9IFhzdHJpbmcoeHMsIHhwKTsKKwkJaWYgKCEocCA9IGNzdHJjaHIoc3AsICc6JykpKQorCQkJcCA9IHNwICsgc3RybGVuKHNwKTsKKwkJaWYgKHAgIT0gc3ApIHsKKwkJCVhjaGVja04oeHMsIHhwLCBwIC0gc3ApOworCQkJbWVtY3B5KHhwLCBzcCwgcCAtIHNwKTsKKwkJCXhwICs9IHAgLSBzcDsKKwkJCSp4cCsrID0gJy8nOworCQl9CisJCXNwID0gcDsKKwkJWGNoZWNrTih4cywgeHAsIG5hbWVsZW4pOworCQltZW1jcHkoeHAsIG5hbWUsIG5hbWVsZW4pOworCQlpZiAoc2VhcmNoX2FjY2VzcyhYc3RyaW5nKHhzLCB4cCksIG1vZGUsIGVycm5vcCkgPT0gMCkKKwkJCXJldHVybiAoWGNsb3NlKHhzLCB4cCArIG5hbWVsZW4pKTsKKwkJaWYgKCpzcCsrID09ICdcMCcpCisJCQlzcCA9IE5VTEw7CisJfQorCVhmcmVlKHhzLCB4cCk7CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIGludAorY2FsbF9idWlsdGluKHN0cnVjdCB0YmwgKnRwLCBjb25zdCBjaGFyICoqd3ApCit7CisJaW50IHJ2OworCisJYnVpbHRpbl9hcmd2MCA9IHdwWzBdOworCWJ1aWx0aW5fZmxhZyA9IHRwLT5mbGFnOworCXNoZl9yZW9wZW4oMSwgU0hGX1dSLCBzaGxfc3Rkb3V0KTsKKwlzaGxfc3Rkb3V0X29rID0gMTsKKwlrc2hfZ2V0b3B0X3Jlc2V0KCZidWlsdGluX29wdCwgR0ZfRVJST1IpOworCXJ2ID0gKCp0cC0+dmFsLmYpKHdwKTsKKwlzaGZfZmx1c2goc2hsX3N0ZG91dCk7CisJc2hsX3N0ZG91dF9vayA9IDA7CisJYnVpbHRpbl9mbGFnID0gMDsKKwlidWlsdGluX2FyZ3YwID0gTlVMTDsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqIHNldCB1cCByZWRpcmVjdGlvbiwgc2F2aW5nIG9sZCBmZHMgaW4gZS0+c2F2ZWZkCisgKi8KK3N0YXRpYyBpbnQKK2lvc2V0dXAoc3RydWN0IGlvd29yZCAqaW9wLCBzdHJ1Y3QgdGJsICp0cCkKK3sKKwlpbnQgdSA9IC0xOworCWNoYXIgKmNwID0gaW9wLT5uYW1lOworCWludCBpb3R5cGUgPSBpb3AtPmZsYWcgJiBJT1RZUEU7CisJaW50IGRvX29wZW4gPSAxLCBkb19jbG9zZSA9IDAsIGZsYWdzID0gMDsKKwlzdHJ1Y3QgaW93b3JkIGlvdG1wOworCXN0cnVjdCBzdGF0IHN0YXRiOworCisJaWYgKGlvdHlwZSAhPSBJT0hFUkUpCisJCWNwID0gZXZhbG9uZXN0cihjcCwgRE9USUxERXwoRmxhZyhGVEFMS0lOR19JKSA/IERPR0xPQiA6IDApKTsKKworCS8qIFVzZWQgZm9yIHRyYWNpbmcgYW5kIGVycm9yIG1lc3NhZ2VzIHRvIHByaW50IGV4cGFuZGVkIGNwICovCisJaW90bXAgPSAqaW9wOworCWlvdG1wLm5hbWUgPSAoaW90eXBlID09IElPSEVSRSkgPyBOVUxMIDogY3A7CisJaW90bXAuZmxhZyB8PSBJT05BTUVYUDsKKworCWlmIChGbGFnKEZYVFJBQ0UpKQorCQlzaGVsbGYoIiVzJXNcbiIsCisJCSAgICBzdWJzdGl0dXRlKHN0cl92YWwoZ2xvYmFsKCJQUzQiKSksIDApLAorCQkgICAgc25wdHJlZWYoTlVMTCwgMzIsICIlUiIsICZpb3RtcCkpOworCisJc3dpdGNoIChpb3R5cGUpIHsKKwljYXNlIElPUkVBRDoKKwkJZmxhZ3MgPSBPX1JET05MWTsKKwkJYnJlYWs7CisKKwljYXNlIElPQ0FUOgorCQlmbGFncyA9IE9fV1JPTkxZIHwgT19BUFBFTkQgfCBPX0NSRUFUOworCQlicmVhazsKKworCWNhc2UgSU9XUklURToKKwkJZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DOworCQkvKiBUaGUgc3RhdCgpIGlzIGhlcmUgdG8gYWxsb3cgcmVkaXJlY3Rpb25zIHRvCisJCSAqIHRoaW5ncyBsaWtlIC9kZXYvbnVsbCB3aXRob3V0IGVycm9yLgorCQkgKi8KKwkJaWYgKEZsYWcoRk5PQ0xPQkJFUikgJiYgIShpb3AtPmZsYWcgJiBJT0NMT0IpICYmCisJCSAgICAoc3RhdChjcCwgJnN0YXRiKSA8IDAgfHwgU19JU1JFRyhzdGF0Yi5zdF9tb2RlKSkpCisJCQlmbGFncyB8PSBPX0VYQ0w7CisJCWJyZWFrOworCisJY2FzZSBJT1JEV1I6CisJCWZsYWdzID0gT19SRFdSIHwgT19DUkVBVDsKKwkJYnJlYWs7CisKKwljYXNlIElPSEVSRToKKwkJZG9fb3BlbiA9IDA7CisJCS8qIGhlcmVpbigpIHJldHVybnMgLTIgaWYgZXJyb3IgaGFzIGJlZW4gcHJpbnRlZCAqLworCQl1ID0gaGVyZWluKGlvcC0+aGVyZWRvYywgaW9wLT5mbGFnICYgSU9FVkFMKTsKKwkJLyogY3AgbWF5IGhhdmUgd3JvbmcgbmFtZSAqLworCQlicmVhazsKKworCWNhc2UgSU9EVVA6IHsKKwkJY29uc3QgY2hhciAqZW1zZzsKKworCQlkb19vcGVuID0gMDsKKwkJaWYgKCpjcCA9PSAnLScgJiYgIWNwWzFdKSB7CisJCQl1ID0gMTAwOTsJIC8qIHByZXZlbnQgZXJyb3IgcmV0dXJuIGJlbG93ICovCisJCQlkb19jbG9zZSA9IDE7CisJCX0gZWxzZSBpZiAoKHUgPSBjaGVja19mZChjcCwKKwkJICAgIFhfT0sgfCAoKGlvcC0+ZmxhZyAmIElPUkRVUCkgPyBSX09LIDogV19PSyksCisJCSAgICAmZW1zZykpIDwgMCkgeworCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiAlcyIsCisJCQkgICAgc25wdHJlZWYoTlVMTCwgMzIsICIlUiIsICZpb3RtcCksIGVtc2cpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJaWYgKHUgPT0gaW9wLT51bml0KQorCQkJcmV0dXJuICgwKTsJCS8qICJkdXAgZnJvbSIgPT0gImR1cCB0byIgKi8KKwkJYnJlYWs7CisJfQorCX0KKworCWlmIChkb19vcGVuKSB7CisJCWlmIChGbGFnKEZSRVNUUklDVEVEKSAmJiAoZmxhZ3MgJiBPX0NSRUFUKSkgeworCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiByZXN0cmljdGVkIiwgY3ApOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJdSA9IG9wZW4oY3AsIGZsYWdzLCAwNjY2KTsKKwl9CisJaWYgKHUgPCAwKSB7CisJCS8qIGhlcmVpbigpIG1heSBhbHJlYWR5IGhhdmUgcHJpbnRlZCBtZXNzYWdlICovCisJCWlmICh1ID09IC0xKSB7CisJCQl1ID0gZXJybm87CisJCQl3YXJuaW5nZih0cnVlLCAiY2Fubm90ICVzICVzOiAlcyIsCisJCQkgICAgaW90eXBlID09IElPRFVQID8gImR1cCIgOgorCQkJICAgIChpb3R5cGUgPT0gSU9SRUFEIHx8IGlvdHlwZSA9PSBJT0hFUkUpID8KKwkJCSAgICAib3BlbiIgOiAiY3JlYXRlIiwgY3AsIHN0cmVycm9yKHUpKTsKKwkJfQorCQlyZXR1cm4gKC0xKTsKKwl9CisJLyogRG8gbm90IHNhdmUgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiByZWRpcmVjdGVkIChpLmUuICJjYXQgPnggPnkiKS4gKi8KKwlpZiAoZS0+c2F2ZWZkW2lvcC0+dW5pdF0gPT0gMCkgeworCQkvKiBJZiB0aGVzZSBhcmUgdGhlIHNhbWUsIGl0IG1lYW5zIHVuaXQgd2FzIHByZXZpb3VzbHkgY2xvc2VkICovCisJCWlmICh1ID09IGlvcC0+dW5pdCkKKwkJCWUtPnNhdmVmZFtpb3AtPnVuaXRdID0gLTE7CisJCWVsc2UKKwkJCS8qIGNfZXhlYygpIGFzc3VtZXMgZS0+c2F2ZWZkW2ZkXSBzZXQgZm9yIGFueQorCQkJICogcmVkaXJlY3Rpb25zLiBBc2sgc2F2ZWZkKCkgbm90IHRvIGNsb3NlIGlvcC0+dW5pdDsKKwkJCSAqIHRoaXMgYWxsb3dzIGVycm9yIG1lc3NhZ2VzIHRvIGJlIHNlZW4gaWYgaW9wLT51bml0CisJCQkgKiBpcyAyOyBhbHNvIG1lYW5zIHdlIGNhbid0IGxvc2UgdGhlIGZkIChlZywgYm90aAorCQkJICogZHVwMiBiZWxvdyBhbmQgZHVwMiBpbiByZXN0ZmQoKSBmYWlsaW5nKS4KKwkJCSAqLworCQkJZS0+c2F2ZWZkW2lvcC0+dW5pdF0gPSBzYXZlZmQoaW9wLT51bml0KTsKKwl9CisKKwlpZiAoZG9fY2xvc2UpCisJCWNsb3NlKGlvcC0+dW5pdCk7CisJZWxzZSBpZiAodSAhPSBpb3AtPnVuaXQpIHsKKwkJaWYgKGtzaF9kdXAyKHUsIGlvcC0+dW5pdCwgdHJ1ZSkgPCAwKSB7CisJCQlpbnQgZXY7CisKKwkJCWV2ID0gZXJybm87CisJCQl3YXJuaW5nZih0cnVlLAorCQkJICAgICJjb3VsZCBub3QgZmluaXNoIChkdXApIHJlZGlyZWN0aW9uICVzOiAlcyIsCisJCQkgICAgc25wdHJlZWYoTlVMTCwgMzIsICIlUiIsICZpb3RtcCksCisJCQkgICAgc3RyZXJyb3IoZXYpKTsKKwkJCWlmIChpb3R5cGUgIT0gSU9EVVApCisJCQkJY2xvc2UodSk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlpZiAoaW90eXBlICE9IElPRFVQKQorCQkJY2xvc2UodSk7CisJCS8qIFRvdWNoaW5nIGFueSBjby1wcm9jZXNzIGZkIGluIGFuIGVtcHR5IGV4ZWMKKwkJICogY2F1c2VzIHRoZSBzaGVsbCB0byBjbG9zZSBpdHMgY29waWVzCisJCSAqLworCQllbHNlIGlmICh0cCAmJiB0cC0+dHlwZSA9PSBDU0hFTEwgJiYgdHAtPnZhbC5mID09IGNfZXhlYykgeworCQkJaWYgKGlvcC0+ZmxhZyAmIElPUkRVUCkJLyogcG9zc2libGUgZXhlYyA8JnAgKi8KKwkJCQljb3Byb2NfcmVhZF9jbG9zZSh1KTsKKwkJCWVsc2UJCQkvKiBwb3NzaWJsZSBleGVjID4mcCAqLworCQkJCWNvcHJvY193cml0ZV9jbG9zZSh1KTsKKwkJfQorCX0KKwlpZiAodSA9PSAyKSAvKiBDbGVhciBhbnkgd3JpdGUgZXJyb3JzICovCisJCXNoZl9yZW9wZW4oMiwgU0hGX1dSLCBzaGxfb3V0KTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogb3BlbiBoZXJlIGRvY3VtZW50IHRlbXAgZmlsZS4KKyAqIGlmIHVucXVvdGVkIGhlcmUsIGV4cGFuZCBoZXJlIHRlbXAgZmlsZSBpbnRvIHNlY29uZCB0ZW1wIGZpbGUuCisgKi8KK3N0YXRpYyBpbnQKK2hlcmVpbihjb25zdCBjaGFyICpjb250ZW50LCBpbnQgc3ViKQoreworCXZvbGF0aWxlIGludCBmZCA9IC0xOworCXN0cnVjdCBzb3VyY2UgKnMsICp2b2xhdGlsZSBvc291cmNlOworCXN0cnVjdCBzaGYgKnZvbGF0aWxlIHNoZjsKKwlzdHJ1Y3QgdGVtcCAqaDsKKwlpbnQgaTsKKworCS8qIGtzaCAtYyAnY2F0IDw8IEVPRicgY2FuIGNhdXNlIHRoaXMuLi4gKi8KKwlpZiAoY29udGVudCA9PSBOVUxMKSB7CisJCXdhcm5pbmdmKHRydWUsICJoZXJlIGRvY3VtZW50IG1pc3NpbmciKTsKKwkJcmV0dXJuICgtMik7IC8qIHNwZWNpYWwgdG8gaW9zZXR1cCgpOiBkb24ndCBwcmludCBlcnJvciAqLworCX0KKworCS8qIENyZWF0ZSB0ZW1wIGZpbGUgdG8gaG9sZCBjb250ZW50IChkb25lIGJlZm9yZSBuZXdlbnYgc28gdGVtcAorCSAqIGRvZXNuJ3QgZ2V0IHJlbW92ZWQgdG9vIHNvb24pLgorCSAqLworCWggPSBtYWtldGVtcChBVEVNUCwgVFRfSEVSRURPQ19FWFAsICZlLT50ZW1wcyk7CisJaWYgKCEoc2hmID0gaC0+c2hmKSB8fCAoZmQgPSBvcGVuKGgtPm5hbWUsIE9fUkRPTkxZLCAwKSkgPCAwKSB7CisJCWZkID0gZXJybm87CisJCXdhcm5pbmdmKHRydWUsICJjYW4ndCAlcyB0ZW1wb3JhcnkgZmlsZSAlczogJXMiLAorCQkgICAgIXNoZiA/ICJjcmVhdGUiIDogIm9wZW4iLAorCQkgICAgaC0+bmFtZSwgc3RyZXJyb3IoZmQpKTsKKwkJaWYgKHNoZikKKwkJCXNoZl9jbG9zZShzaGYpOworCQlyZXR1cm4gKC0yIC8qIHNwZWNpYWwgdG8gaW9zZXR1cCgpOiBkb24ndCBwcmludCBlcnJvciAqLyk7CisJfQorCisJb3NvdXJjZSA9IHNvdXJjZTsKKwluZXdlbnYoRV9FUlJIKTsKKwlpID0gc2lnc2V0am1wKGUtPmpidWYsIDApOworCWlmIChpKSB7CisJCXNvdXJjZSA9IG9zb3VyY2U7CisJCXF1aXRlbnYoc2hmKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gKC0yKTsgLyogc3BlY2lhbCB0byBpb3NldHVwKCk6IGRvbid0IHByaW50IGVycm9yICovCisJfQorCWlmIChzdWIpIHsKKwkJLyogRG8gc3Vic3RpdHV0aW9ucyBvbiB0aGUgY29udGVudCBvZiBoZXJlZG9jICovCisJCXMgPSBwdXNocyhTU1RSSU5HLCBBVEVNUCk7CisJCXMtPnN0YXJ0ID0gcy0+c3RyID0gY29udGVudDsKKwkJc291cmNlID0gczsKKwkJaWYgKHl5bGV4KE9ORVdPUkR8SEVSRURPQykgIT0gTFdPUkQpCisJCQlpbnRlcm5hbF9lcnJvcmYoImhlcmVpbjogeXlsZXgiKTsKKwkJc291cmNlID0gb3NvdXJjZTsKKwkJc2hmX3B1dHMoZXZhbHN0cih5eWx2YWwuY3AsIDApLCBzaGYpOworCX0gZWxzZQorCQlzaGZfcHV0cyhjb250ZW50LCBzaGYpOworCisJcXVpdGVudihOVUxMKTsKKworCWlmIChzaGZfY2xvc2Uoc2hmKSA9PSBFT0YpIHsKKwkJaSA9IGVycm5vOworCQljbG9zZShmZCk7CisJCWZkID0gZXJybm87CisJCXdhcm5pbmdmKHRydWUsICJlcnJvciB3cml0aW5nICVzOiAlcywgJXMiLCBoLT5uYW1lLAorCQkgICAgc3RyZXJyb3IoaSksIHN0cmVycm9yKGZkKSk7CisJCXJldHVybiAoLTIpOwkvKiBzcGVjaWFsIHRvIGlvc2V0dXAoKTogZG9uJ3QgcHJpbnQgZXJyb3IgKi8KKwl9CisKKwlyZXR1cm4gKGZkKTsKK30KKworLyoKKyAqCWtzaCBzcGVjaWFsIC0gdGhlIHNlbGVjdCBjb21tYW5kIHByb2Nlc3Npbmcgc2VjdGlvbgorICoJcHJpbnQgdGhlIGFyZ3MgaW4gY29sdW1uIGZvcm0gLSBhc3N1bWluZyB0aGF0IHdlIGNhbgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitkb19zZWxlY3RhcmdzKGNvbnN0IGNoYXIgKiphcCwgYm9vbCBwcmludF9tZW51KQoreworCXN0YXRpYyBjb25zdCBjaGFyICpyZWFkX2FyZ3NbXSA9IHsKKwkJInJlYWQiLCAiLXIiLCAiUkVQTFkiLCBOVUxMCisJfTsKKwljaGFyICpzOworCWludCBpLCBhcmdjdDsKKworCWZvciAoYXJnY3QgPSAwOyBhcFthcmdjdF07IGFyZ2N0KyspCisJCTsKKwl3aGlsZSAoMSkgeworCQkvKiBNZW51IGlzIHByaW50ZWQgaWYKKwkJICoJLSB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIGFyb3VuZCB0aGUgc2VsZWN0IGxvb3AKKwkJICoJLSB0aGUgdXNlciBlbnRlcnMgYSBibGFuayBsaW5lCisJCSAqCS0gdGhlIFJFUExZIHBhcmFtZXRlciBpcyBlbXB0eQorCQkgKi8KKwkJaWYgKHByaW50X21lbnUgfHwgISpzdHJfdmFsKGdsb2JhbCgiUkVQTFkiKSkpCisJCQlwcl9tZW51KGFwKTsKKwkJc2hlbGxmKCIlcyIsIHN0cl92YWwoZ2xvYmFsKCJQUzMiKSkpOworCQlpZiAoY2FsbF9idWlsdGluKGZpbmRjb20oInJlYWQiLCBGQ19CSSksIHJlYWRfYXJncykpCisJCQlyZXR1cm4gKE5VTEwpOworCQlzID0gc3RyX3ZhbChnbG9iYWwoIlJFUExZIikpOworCQlpZiAoKnMpIHsKKwkJCWdldG4ocywgJmkpOworCQkJcmV0dXJuICgoaSA+PSAxICYmIGkgPD0gYXJnY3QpID8gYXBbaSAtIDFdIDogbnVsbCk7CisJCX0KKwkJcHJpbnRfbWVudSA9IDE7CisJfQorfQorCitzdHJ1Y3Qgc2VsZWN0X21lbnVfaW5mbyB7CisJY29uc3QgY2hhciAqIGNvbnN0ICphcmdzOworCWludCBudW1fd2lkdGg7Cit9OworCitzdGF0aWMgY2hhciAqc2VsZWN0X2ZtdF9lbnRyeShjaGFyICosIGludCwgaW50LCBjb25zdCB2b2lkICopOworCisvKiBmb3JtYXQgYSBzaW5nbGUgc2VsZWN0IG1lbnUgaXRlbSAqLworc3RhdGljIGNoYXIgKgorc2VsZWN0X2ZtdF9lbnRyeShjaGFyICpidWYsIGludCBidWZsZW4sIGludCBpLCBjb25zdCB2b2lkICphcmcpCit7CisJY29uc3Qgc3RydWN0IHNlbGVjdF9tZW51X2luZm8gKnNtaSA9CisJICAgIChjb25zdCBzdHJ1Y3Qgc2VsZWN0X21lbnVfaW5mbyAqKWFyZzsKKworCXNoZl9zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiUqZCkgJXMiLAorCSAgICBzbWktPm51bV93aWR0aCwgaSArIDEsIHNtaS0+YXJnc1tpXSk7CisJcmV0dXJuIChidWYpOworfQorCisvKgorICoJcHJpbnQgYSBzZWxlY3Qgc3R5bGUgbWVudQorICovCitpbnQKK3ByX21lbnUoY29uc3QgY2hhciAqIGNvbnN0ICphcCkKK3sKKwlzdHJ1Y3Qgc2VsZWN0X21lbnVfaW5mbyBzbWk7CisJY29uc3QgY2hhciAqIGNvbnN0ICpwcDsKKwlpbnQgYWNvbHMgPSAwLCBhb2N0cyA9IDAsIGksIG47CisKKwkvKgorCSAqIHdpZHRoL2NvbHVtbiBjYWxjdWxhdGlvbnMgd2VyZSBkb25lIG9uY2UgYW5kIHNhdmVkLCBidXQgdGhpcworCSAqIG1lYW5zIHNlbGVjdCBjYW4ndCBiZSB1c2VkIHJlY3Vyc2l2ZWx5IHNvIHdlIHJlLWNhbGN1bGF0ZQorCSAqIGVhY2ggdGltZSAoY291bGQgc2F2ZSBpbiBhIHN0cnVjdHVyZSB0aGF0IGlzIHJldHVybmVkLCBidXQKKwkgKiBpdCdzIHByb2JhYmx5IG5vdCB3b3J0aCB0aGUgYm90aGVyKQorCSAqLworCisJLyoKKwkgKiBnZXQgZGltZW5zaW9ucyBvZiB0aGUgbGlzdAorCSAqLworCWZvciAobiA9IDAsIHBwID0gYXA7ICpwcDsgbisrLCBwcCsrKSB7CisJCWkgPSBzdHJsZW4oKnBwKTsKKwkJaWYgKGkgPiBhb2N0cykKKwkJCWFvY3RzID0gaTsKKwkJaSA9IHV0Zl9tYnN3aWR0aCgqcHApOworCQlpZiAoaSA+IGFjb2xzKQorCQkJYWNvbHMgPSBpOworCX0KKworCS8qCisJICogd2Ugd2lsbCBwcmludCBhbiBpbmRleCBvZiB0aGUgZm9ybSAiJWQpICIgaW4gZnJvbnQgb2YKKwkgKiBlYWNoIGVudHJ5LCBzbyBnZXQgdGhlIG1heGltdW0gd2lkdGggb2YgdGhpcworCSAqLworCWZvciAoaSA9IG4sIHNtaS5udW1fd2lkdGggPSAxOyBpID49IDEwOyBpIC89IDEwKQorCQlzbWkubnVtX3dpZHRoKys7CisKKwlzbWkuYXJncyA9IGFwOworCXByaW50X2NvbHVtbnMoc2hsX291dCwgbiwgc2VsZWN0X2ZtdF9lbnRyeSwgKHZvaWQgKikmc21pLAorCSAgICBzbWkubnVtX3dpZHRoICsgMiArIGFvY3RzLCBzbWkubnVtX3dpZHRoICsgMiArIGFjb2xzLAorCSAgICB0cnVlKTsKKworCXJldHVybiAobik7Cit9CisKKy8qIFhYWDogaG9ycmlibGUga2x1ZGdlIHRvIGZpdCB3aXRoaW4gdGhlIGZyYW1ld29yayAqLworc3RhdGljIGNoYXIgKnBsYWluX2ZtdF9lbnRyeShjaGFyICosIGludCwgaW50LCBjb25zdCB2b2lkICopOworCitzdGF0aWMgY2hhciAqCitwbGFpbl9mbXRfZW50cnkoY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgaSwgY29uc3Qgdm9pZCAqYXJnKQoreworCXNoZl9zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVzIiwgKChjb25zdCBjaGFyICogY29uc3QgKilhcmcpW2ldKTsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKK2ludAorcHJfbGlzdChjaGFyICogY29uc3QgKmFwKQoreworCWludCBhY29scyA9IDAsIGFvY3RzID0gMCwgaSwgbjsKKwljaGFyICogY29uc3QgKnBwOworCisJZm9yIChuID0gMCwgcHAgPSBhcDsgKnBwOyBuKyssIHBwKyspIHsKKwkJaSA9IHN0cmxlbigqcHApOworCQlpZiAoaSA+IGFvY3RzKQorCQkJYW9jdHMgPSBpOworCQlpID0gdXRmX21ic3dpZHRoKCpwcCk7CisJCWlmIChpID4gYWNvbHMpCisJCQlhY29scyA9IGk7CisJfQorCisJcHJpbnRfY29sdW1ucyhzaGxfb3V0LCBuLCBwbGFpbl9mbXRfZW50cnksIChjb25zdCB2b2lkICopYXAsCisJICAgIGFvY3RzLCBhY29scywgZmFsc2UpOworCisJcmV0dXJuIChuKTsKK30KKworLyoKKyAqCVtbIC4uLiBdXSBldmFsdWF0aW9uIHJvdXRpbmVzCisgKi8KKworLyoKKyAqIFRlc3QgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYSB3aGF0ZXZlci4gQWNjZXB0cyB0aGUgY3VycmVudCB0b2tlbiBpZgorICogaXQgaXMuIFJldHVybnMgMCBpZiBpdCBpcyBub3QsIG5vbi16ZXJvIGlmIGl0IGlzIChpbiB0aGUgY2FzZSBvZgorICogVE1fVU5PUCBhbmQgVE1fQklOT1AsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhIFRlc3Rfb3ApLgorICovCitzdGF0aWMgVGVzdF9vcAorZGJ0ZXN0ZV9pc2EoVGVzdF9lbnYgKnRlLCBUZXN0X21ldGEgbWV0YSkKK3sKKwlUZXN0X29wIHJldCA9IFRPX05PTk9QOworCWludCB1cXdvcmQ7CisJY29uc3QgY2hhciAqcDsKKworCWlmICghKnRlLT5wb3Mud3ApCisJCXJldHVybiAobWV0YSA9PSBUTV9FTkQgPyBUT19OT05OVUxMIDogVE9fTk9OT1ApOworCisJLyogdW5xdW90ZWQgd29yZD8gKi8KKwlmb3IgKHAgPSAqdGUtPnBvcy53cDsgKnAgPT0gQ0hBUjsgcCArPSAyKQorCQk7CisJdXF3b3JkID0gKnAgPT0gRU9TOworCisJaWYgKG1ldGEgPT0gVE1fVU5PUCB8fCBtZXRhID09IFRNX0JJTk9QKSB7CisJCWlmICh1cXdvcmQpIHsKKwkJCWNoYXIgYnVmWzhdOwkvKiBsb25nZXIgdGhhbiB0aGUgbG9uZ2VzdCBvcGVyYXRvciAqLworCQkJY2hhciAqcSA9IGJ1ZjsKKwkJCWZvciAocCA9ICp0ZS0+cG9zLndwOworCQkJICAgICpwID09IENIQVIgJiYgcSA8ICZidWZbc2l6ZW9mKGJ1ZikgLSAxXTsgcCArPSAyKQorCQkJCSpxKysgPSBwWzFdOworCQkJKnEgPSAnXDAnOworCQkJcmV0ID0gdGVzdF9pc29wKG1ldGEsIGJ1Zik7CisJCX0KKwl9IGVsc2UgaWYgKG1ldGEgPT0gVE1fRU5EKQorCQlyZXQgPSBUT19OT05PUDsKKwllbHNlCisJCXJldCA9ICh1cXdvcmQgJiYgIXN0cmNtcCgqdGUtPnBvcy53cCwKKwkJICAgIGRidGVzdF90b2tlbnNbKGludCltZXRhXSkpID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QOworCisJLyogQWNjZXB0IHRoZSB0b2tlbj8gKi8KKwlpZiAocmV0ICE9IFRPX05PTk9QKQorCQl0ZS0+cG9zLndwKys7CisKKwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RidGVzdGVfZ2V0b3BuZChUZXN0X2VudiAqdGUsIFRlc3Rfb3Agb3AsIGJvb2wgZG9fZXZhbCkKK3sKKwljb25zdCBjaGFyICpzID0gKnRlLT5wb3Mud3A7CisKKwlpZiAoIXMpCisJCXJldHVybiAoTlVMTCk7CisKKwl0ZS0+cG9zLndwKys7CisKKwlpZiAoIWRvX2V2YWwpCisJCXJldHVybiAobnVsbCk7CisKKwlpZiAob3AgPT0gVE9fU1RFUUwgfHwgb3AgPT0gVE9fU1RORVEpCisJCXMgPSBldmFsc3RyKHMsIERPVElMREUgfCBET1BBVCk7CisJZWxzZQorCQlzID0gZXZhbHN0cihzLCBET1RJTERFKTsKKworCXJldHVybiAocyk7Cit9CisKK3N0YXRpYyB2b2lkCitkYnRlc3RlX2Vycm9yKFRlc3RfZW52ICp0ZSwgaW50IG9mZnNldCwgY29uc3QgY2hhciAqbXNnKQoreworCXRlLT5mbGFncyB8PSBURUZfRVJST1I7CisJaW50ZXJuYWxfd2FybmluZ2YoImRidGVzdGVfZXJyb3I6ICVzIChvZmZzZXQgJWQpIiwgbXNnLCBvZmZzZXQpOworfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvZXhwci5jIGIvbWtzaC9zcmMvZXhwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNTcxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9leHByLmMKQEAgLTAsMCArMSw4OTUgQEAKKy8qCSRPcGVuQlNEOiBleHByLmMsdiAxLjIxIDIwMDkvMDYvMDEgMTk6MDA6NTcgZGVyYWFkdCBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2V4cHIuYyx2IDEuNDQgMjAxMC8wOC8xNCAyMTozNToxMyB0ZyBFeHAgJCIpOworCisvKiBUaGUgb3JkZXIgb2YgdGhlc2UgZW51bXMgaXMgY29uc3RyYWluZWQgYnkgdGhlIG9yZGVyIG9mIG9waW5mb1tdICovCitlbnVtIHRva2VuIHsKKwkvKiBzb21lIChsb25nKSB1bmFyeSBvcGVyYXRvcnMgKi8KKwlPX1BMVVNQTFVTID0gMCwgT19NSU5VU01JTlVTLAorCS8qIGJpbmFyeSBvcGVyYXRvcnMgKi8KKwlPX0VRLCBPX05FLAorCS8qIGFzc2lnbm1lbnRzIGFyZSBhc3N1bWVkIHRvIGJlIGluIHJhbmdlIE9fQVNOIC4uIE9fQk9SQVNOICovCisJT19BU04sIE9fVElNRVNBU04sIE9fRElWQVNOLCBPX01PREFTTiwgT19QTFVTQVNOLCBPX01JTlVTQVNOLAorCU9fTFNISUZUQVNOLCBPX1JTSElGVEFTTiwgT19CQU5EQVNOLCBPX0JYT1JBU04sIE9fQk9SQVNOLAorCU9fTFNISUZULCBPX1JTSElGVCwKKwlPX0xFLCBPX0dFLCBPX0xULCBPX0dULAorCU9fTEFORCwKKwlPX0xPUiwKKwlPX1RJTUVTLCBPX0RJViwgT19NT0QsCisJT19QTFVTLCBPX01JTlVTLAorCU9fQkFORCwKKwlPX0JYT1IsCisJT19CT1IsCisJT19URVJOLAorCU9fQ09NTUEsCisJLyogdGhpbmdzIGFmdGVyIHRoaXMgYXJlbid0IHVzZWQgYXMgYmluYXJ5IG9wZXJhdG9ycyAqLworCS8qIHVuYXJ5IHRoYXQgYXJlIG5vdCBhbHNvIGJpbmFyaWVzICovCisJT19CTk9ULCBPX0xOT1QsCisJLyogbWlzYyAqLworCU9QRU5fUEFSRU4sIENMT1NFX1BBUkVOLCBDVEVSTiwKKwkvKiB0aGluZ3MgdGhhdCBkb24ndCBhcHBlYXIgaW4gdGhlIG9waW5mb1tdIHRhYmxlICovCisJVkFSLCBMSVQsIEVORCwgQkFECit9OworI2RlZmluZSBJU19CSU5PUChvcCkgKCgoaW50KW9wKSA+PSAoaW50KU9fRVEgJiYgKChpbnQpb3ApIDw9IChpbnQpT19DT01NQSkKKyNkZWZpbmUgSVNfQVNTSUdOT1Aob3ApCSgoaW50KShvcCkgPj0gKGludClPX0FTTiAmJiAoaW50KShvcCkgPD0gKGludClPX0JPUkFTTikKKworLyogcHJlY2lzaW9uczsgdXNlZCB0byBiZSBlbnVtIHByZWMgYnV0IHdlIGRvIGFyaXRobWV0aWNzIG9uIGl0ICovCisjZGVmaW5lIFBfUFJJTUFSWQkwCS8qIFZBUiwgTElULCAoKSwgfiAhIC0gKyAqLworI2RlZmluZSBQX01VTFQJCTEJLyogKiAvICUgKi8KKyNkZWZpbmUgUF9BREQJCTIJLyogKyAtICovCisjZGVmaW5lIFBfU0hJRlQJCTMJLyogPDwgPj4gKi8KKyNkZWZpbmUgUF9SRUxBVElPTgk0CS8qIDwgPD0gPiA+PSAqLworI2RlZmluZSBQX0VRVUFMSVRZCTUJLyogPT0gIT0gKi8KKyNkZWZpbmUgUF9CQU5ECQk2CS8qICYgKi8KKyNkZWZpbmUgUF9CWE9SCQk3CS8qIF4gKi8KKyNkZWZpbmUgUF9CT1IJCTgJLyogfCAqLworI2RlZmluZSBQX0xBTkQJCTkJLyogJiYgKi8KKyNkZWZpbmUgUF9MT1IJCTEwCS8qIHx8ICovCisjZGVmaW5lIFBfVEVSTgkJMTEJLyogPzogKi8KKyNkZWZpbmUgUF9BU1NJR04JMTIJLyogPSAqPSAvPSAlPSArPSAtPSA8PD0gPj49ICY9IF49IHw9ICovCisjZGVmaW5lIFBfQ09NTUEJCTEzCS8qICwgKi8KKyNkZWZpbmUgTUFYX1BSRUMJUF9DT01NQQorCitzdHJ1Y3Qgb3BpbmZvIHsKKwljaGFyCQluYW1lWzRdOworCWludAkJbGVuOwkvKiBuYW1lIGxlbmd0aCAqLworCWludAkJcHJlYzsJLyogcHJlY2VkZW5jZTogbG93ZXIgaXMgaGlnaGVyICovCit9OworCisvKiBUb2tlbnMgaW4gdGhpcyB0YWJsZSBtdXN0IGJlIG9yZGVyZWQgc28gdGhlIGxvbmdlc3QgYXJlIGZpcnN0CisgKiAoZWcsICs9IGJlZm9yZSArKS4gSWYgeW91IGNoYW5nZSBzb21ldGhpbmcsIGNoYW5nZSB0aGUgb3JkZXIKKyAqIG9mIGVudW0gdG9rZW4gdG9vLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG9waW5mbyBvcGluZm9bXSA9IHsKKwl7ICIrKyIsCSAyLCBQX1BSSU1BUlkgfSwJLyogYmVmb3JlICsgKi8KKwl7ICItLSIsCSAyLCBQX1BSSU1BUlkgfSwJLyogYmVmb3JlIC0gKi8KKwl7ICI9PSIsCSAyLCBQX0VRVUFMSVRZIH0sCS8qIGJlZm9yZSA9ICovCisJeyAiIT0iLAkgMiwgUF9FUVVBTElUWSB9LAkvKiBiZWZvcmUgISAqLworCXsgIj0iLAkgMSwgUF9BU1NJR04gfSwJCS8qIGtlZXAgYXNzaWducyBpbiBhIGJsb2NrICovCisJeyAiKj0iLAkgMiwgUF9BU1NJR04gfSwKKwl7ICIvPSIsCSAyLCBQX0FTU0lHTiB9LAorCXsgIiU9IiwJIDIsIFBfQVNTSUdOIH0sCisJeyAiKz0iLAkgMiwgUF9BU1NJR04gfSwKKwl7ICItPSIsCSAyLCBQX0FTU0lHTiB9LAorCXsgIjw8PSIsIDMsIFBfQVNTSUdOIH0sCisJeyAiPj49IiwgMywgUF9BU1NJR04gfSwKKwl7ICImPSIsCSAyLCBQX0FTU0lHTiB9LAorCXsgIl49IiwJIDIsIFBfQVNTSUdOIH0sCisJeyAifD0iLAkgMiwgUF9BU1NJR04gfSwKKwl7ICI8PCIsCSAyLCBQX1NISUZUIH0sCisJeyAiPj4iLAkgMiwgUF9TSElGVCB9LAorCXsgIjw9IiwJIDIsIFBfUkVMQVRJT04gfSwKKwl7ICI+PSIsCSAyLCBQX1JFTEFUSU9OIH0sCisJeyAiPCIsCSAxLCBQX1JFTEFUSU9OIH0sCisJeyAiPiIsCSAxLCBQX1JFTEFUSU9OIH0sCisJeyAiJiYiLAkgMiwgUF9MQU5EIH0sCisJeyAifHwiLAkgMiwgUF9MT1IgfSwKKwl7ICIqIiwJIDEsIFBfTVVMVCB9LAorCXsgIi8iLAkgMSwgUF9NVUxUIH0sCisJeyAiJSIsCSAxLCBQX01VTFQgfSwKKwl7ICIrIiwJIDEsIFBfQUREIH0sCisJeyAiLSIsCSAxLCBQX0FERCB9LAorCXsgIiYiLAkgMSwgUF9CQU5EIH0sCisJeyAiXiIsCSAxLCBQX0JYT1IgfSwKKwl7ICJ8IiwJIDEsIFBfQk9SIH0sCisJeyAiPyIsCSAxLCBQX1RFUk4gfSwKKwl7ICIsIiwJIDEsIFBfQ09NTUEgfSwKKwl7ICJ+IiwJIDEsIFBfUFJJTUFSWSB9LAorCXsgIiEiLAkgMSwgUF9QUklNQVJZIH0sCisJeyAiKCIsCSAxLCBQX1BSSU1BUlkgfSwKKwl7ICIpIiwJIDEsIFBfUFJJTUFSWSB9LAorCXsgIjoiLAkgMSwgUF9QUklNQVJZIH0sCisJeyAiIiwJIDAsIFBfUFJJTUFSWSB9Cit9OworCit0eXBlZGVmIHN0cnVjdCBleHByX3N0YXRlIEV4cHJfc3RhdGU7CitzdHJ1Y3QgZXhwcl9zdGF0ZSB7CisJY29uc3QgY2hhciAqZXhwcmVzc2lvbjsJCS8qIGV4cHJlc3Npb24gYmVpbmcgZXZhbHVhdGVkICovCisJY29uc3QgY2hhciAqdG9rcDsJCS8qIGxleGljYWwgcG9zaXRpb24gKi8KKwlzdHJ1Y3QgdGJsICp2YWw7CQkvKiB2YWx1ZSBmcm9tIHRva2VuKCkgKi8KKwlzdHJ1Y3QgdGJsICpldmFsaW5nOwkJLyogdmFyaWFibGUgdGhhdCBpcyBiZWluZyByZWN1cnNpdmVseQorCQkJCQkgKiBleHBhbmRlZCAoRVhQUklORVZBTCBmbGFnIHNldCkgKi8KKwlpbnQgbm9hc3NpZ247CQkJLyogZG9uJ3QgZG8gYXNzaWducyAoZm9yID86LCYmLHx8KSAqLworCWVudW0gdG9rZW4gdG9rOwkJCS8qIHRva2VuIGZyb20gdG9rZW4oKSAqLworCWJvb2wgYXJpdGg7CQkJLyogZXZhbHVhdGluZyBhbiAkKCgpKSBleHByZXNzaW9uPyAqLworCWJvb2wgbmF0dXJhbDsJCQkvKiB1bnNpZ25lZCBhcml0aG1ldGljIGNhbGN1bGF0aW9uICovCit9OworCisjZGVmaW5lIGJpdnVpKHgsIG9wLCB5KQkoZXMtPm5hdHVyYWwgPwkJCVwKKwkobWtzaF9hcmlfdCkoKHgpLT52YWwudSBvcCAoeSktPnZhbC51KSA6CVwKKwkobWtzaF9hcmlfdCkoKHgpLT52YWwuaSBvcCAoeSktPnZhbC5pKQkJXAorKQorI2RlZmluZSBjaHZ1aSh4LCBvcCkJZG8gewkJCVwKKwlpZiAoZXMtPm5hdHVyYWwpCQkJXAorCQkoeCktPnZhbC51ID0gb3AgKHgpLT52YWwudTsJXAorCWVsc2UJCQkJCVwKKwkJKHgpLT52YWwuaSA9IG9wICh4KS0+dmFsLmk7CVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorI2RlZmluZSBzdHZ1aSh4LCBuKQlkbyB7CQkJXAorCWlmIChlcy0+bmF0dXJhbCkJCQlcCisJCSh4KS0+dmFsLnUgPSAobik7CQlcCisJZWxzZQkJCQkJXAorCQkoeCktPnZhbC5pID0gKG4pOwkJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisKK2VudW0gZXJyb3JfdHlwZSB7CisJRVRfVU5FWFBFQ1RFRCwgRVRfQkFETElULCBFVF9SRUNVUlNJVkUsCisJRVRfTFZBTFVFLCBFVF9SRE9OTFksIEVUX1NUUgorfTsKKworc3RhdGljIHZvaWQgZXZhbGVycihFeHByX3N0YXRlICosIGVudW0gZXJyb3JfdHlwZSwgY29uc3QgY2hhciAqKQorICAgIE1LU0hfQV9OT1JFVFVSTjsKK3N0YXRpYyBzdHJ1Y3QgdGJsICpldmFsZXhwcihFeHByX3N0YXRlICosIGludCk7CitzdGF0aWMgdm9pZCBleHBydG9rZW4oRXhwcl9zdGF0ZSAqKTsKK3N0YXRpYyBzdHJ1Y3QgdGJsICpkb19wcG1tKEV4cHJfc3RhdGUgKiwgZW51bSB0b2tlbiwgc3RydWN0IHRibCAqLCBib29sKTsKK3N0YXRpYyB2b2lkIGFzc2lnbl9jaGVjayhFeHByX3N0YXRlICosIGVudW0gdG9rZW4sIHN0cnVjdCB0YmwgKik7CitzdGF0aWMgc3RydWN0IHRibCAqdGVtcHZhcih2b2lkKTsKK3N0YXRpYyBzdHJ1Y3QgdGJsICppbnR2YXIoRXhwcl9zdGF0ZSAqLCBzdHJ1Y3QgdGJsICopOworCisvKgorICogcGFyc2UgYW5kIGV2YWx1YXRlIGV4cHJlc3Npb24KKyAqLworaW50CitldmFsdWF0ZShjb25zdCBjaGFyICpleHByLCBta3NoX2FyaV90ICpydmFsLCBpbnQgZXJyb3Jfb2ssIGJvb2wgYXJpdGgpCit7CisJc3RydWN0IHRibCB2OworCWludCByZXQ7CisKKwl2LmZsYWcgPSBERUZJTkVEfElOVEVHRVI7CisJdi50eXBlID0gMDsKKwlyZXQgPSB2X2V2YWx1YXRlKCZ2LCBleHByLCBlcnJvcl9vaywgYXJpdGgpOworCSpydmFsID0gdi52YWwuaTsKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qCisgKiBwYXJzZSBhbmQgZXZhbHVhdGUgZXhwcmVzc2lvbiwgc3RvcmluZyByZXN1bHQgaW4gdnAuCisgKi8KK2ludAordl9ldmFsdWF0ZShzdHJ1Y3QgdGJsICp2cCwgY29uc3QgY2hhciAqZXhwciwgdm9sYXRpbGUgaW50IGVycm9yX29rLAorICAgIGJvb2wgYXJpdGgpCit7CisJc3RydWN0IHRibCAqdjsKKwlFeHByX3N0YXRlIGN1cnN0YXRlOworCUV4cHJfc3RhdGUgKiBjb25zdCBlcyA9ICZjdXJzdGF0ZTsKKwlpbnQgaTsKKworCS8qIHNhdmUgc3RhdGUgdG8gYWxsb3cgcmVjdXJzaXZlIGNhbGxzICovCisJY3Vyc3RhdGUuZXhwcmVzc2lvbiA9IGN1cnN0YXRlLnRva3AgPSBleHByOworCWN1cnN0YXRlLm5vYXNzaWduID0gMDsKKwljdXJzdGF0ZS5hcml0aCA9IGFyaXRoOworCWN1cnN0YXRlLmV2YWxpbmcgPSBOVUxMOworCWN1cnN0YXRlLm5hdHVyYWwgPSBmYWxzZTsKKworCW5ld2VudihFX0VSUkgpOworCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7CisJaWYgKGkpIHsKKwkJLyogQ2xlYXIgRVhQUklORVZBTCBpbiBvZiBhbnkgdmFyaWFibGVzIHdlIHdlcmUgcGxheWluZyB3aXRoICovCisJCWlmIChjdXJzdGF0ZS5ldmFsaW5nKQorCQkJY3Vyc3RhdGUuZXZhbGluZy0+ZmxhZyAmPSB+RVhQUklORVZBTDsKKwkJcXVpdGVudihOVUxMKTsKKwkJaWYgKGkgPT0gTEFFWFBSKSB7CisJCQlpZiAoZXJyb3Jfb2sgPT0gS1NIX1JFVFVSTl9FUlJPUikKKwkJCQlyZXR1cm4gKDApOworCQkJZXJyb3JmeigpOworCQl9CisJCXVud2luZChpKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCWV4cHJ0b2tlbihlcyk7CisJaWYgKGVzLT50b2sgPT0gRU5EKSB7CisJCWVzLT50b2sgPSBMSVQ7CisJCWVzLT52YWwgPSB0ZW1wdmFyKCk7CisJfQorCXYgPSBpbnR2YXIoZXMsIGV2YWxleHByKGVzLCBNQVhfUFJFQykpOworCisJaWYgKGVzLT50b2sgIT0gRU5EKQorCQlldmFsZXJyKGVzLCBFVF9VTkVYUEVDVEVELCBOVUxMKTsKKworCWlmIChlcy0+YXJpdGggJiYgZXMtPm5hdHVyYWwpCisJCXZwLT5mbGFnIHw9IElOVF9VOworCWlmICh2cC0+ZmxhZyAmIElOVEVHRVIpCisJCXNldGludF92KHZwLCB2LCBlcy0+YXJpdGgpOworCWVsc2UKKwkJLyogY2FuIGZhaWwgaWYgcmVhZG9ubHkgKi8KKwkJc2V0c3RyKHZwLCBzdHJfdmFsKHYpLCBlcnJvcl9vayk7CisKKwlxdWl0ZW52KE5VTEwpOworCisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK2V2YWxlcnIoRXhwcl9zdGF0ZSAqZXMsIGVudW0gZXJyb3JfdHlwZSB0eXBlLCBjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciB0YnVmWzJdOworCWNvbnN0IGNoYXIgKnM7CisKKwllcy0+YXJpdGggPSBmYWxzZTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEVUX1VORVhQRUNURUQ6CisJCXN3aXRjaCAoZXMtPnRvaykgeworCQljYXNlIFZBUjoKKwkJCXMgPSBlcy0+dmFsLT5uYW1lOworCQkJYnJlYWs7CisJCWNhc2UgTElUOgorCQkJcyA9IHN0cl92YWwoZXMtPnZhbCk7CisJCQlicmVhazsKKwkJY2FzZSBFTkQ6CisJCQlzID0gImVuZCBvZiBleHByZXNzaW9uIjsKKwkJCWJyZWFrOworCQljYXNlIEJBRDoKKwkJCXRidWZbMF0gPSAqZXMtPnRva3A7CisJCQl0YnVmWzFdID0gJ1wwJzsKKwkJCXMgPSB0YnVmOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzID0gb3BpbmZvWyhpbnQpZXMtPnRva10ubmFtZTsKKwkJfQorCQl3YXJuaW5nZih0cnVlLCAiJXM6IHVuZXhwZWN0ZWQgJyVzJyIsIGVzLT5leHByZXNzaW9uLCBzKTsKKwkJYnJlYWs7CisKKwljYXNlIEVUX0JBRExJVDoKKwkJd2FybmluZ2YodHJ1ZSwgIiVzOiBiYWQgbnVtYmVyICclcyciLCBlcy0+ZXhwcmVzc2lvbiwgc3RyKTsKKwkJYnJlYWs7CisKKwljYXNlIEVUX1JFQ1VSU0lWRToKKwkJd2FybmluZ2YodHJ1ZSwgIiVzOiBleHByZXNzaW9uIHJlY3Vyc2VzIG9uIHBhcmFtZXRlciAnJXMnIiwKKwkJICAgIGVzLT5leHByZXNzaW9uLCBzdHIpOworCQlicmVhazsKKworCWNhc2UgRVRfTFZBTFVFOgorCQl3YXJuaW5nZih0cnVlLCAiJXM6ICVzIHJlcXVpcmVzIGx2YWx1ZSIsCisJCSAgICBlcy0+ZXhwcmVzc2lvbiwgc3RyKTsKKwkJYnJlYWs7CisKKwljYXNlIEVUX1JET05MWToKKwkJd2FybmluZ2YodHJ1ZSwgIiVzOiAlcyBhcHBsaWVkIHRvIHJlYWQgb25seSB2YXJpYWJsZSIsCisJCSAgICBlcy0+ZXhwcmVzc2lvbiwgc3RyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OiAvKiBrZWVwIGdjYyBoYXBweSAqLworCWNhc2UgRVRfU1RSOgorCQl3YXJuaW5nZih0cnVlLCAiJXM6ICVzIiwgZXMtPmV4cHJlc3Npb24sIHN0cik7CisJCWJyZWFrOworCX0KKwl1bndpbmQoTEFFWFBSKTsKK30KKworc3RhdGljIHN0cnVjdCB0YmwgKgorZXZhbGV4cHIoRXhwcl9zdGF0ZSAqZXMsIGludCBwcmVjKQoreworCXN0cnVjdCB0YmwgKnZsLCAqdnIgPSBOVUxMLCAqdmFzbjsKKwllbnVtIHRva2VuIG9wOworCW1rc2hfYXJpX3QgcmVzID0gMDsKKworCWlmIChwcmVjID09IFBfUFJJTUFSWSkgeworCQlvcCA9IGVzLT50b2s7CisJCWlmIChvcCA9PSBPX0JOT1QgfHwgb3AgPT0gT19MTk9UIHx8IG9wID09IE9fTUlOVVMgfHwKKwkJICAgIG9wID09IE9fUExVUykgeworCQkJZXhwcnRva2VuKGVzKTsKKwkJCXZsID0gaW50dmFyKGVzLCBldmFsZXhwcihlcywgUF9QUklNQVJZKSk7CisJCQlpZiAob3AgPT0gT19CTk9UKQorCQkJCWNodnVpKHZsLCB+KTsKKwkJCWVsc2UgaWYgKG9wID09IE9fTE5PVCkKKwkJCQljaHZ1aSh2bCwgISk7CisJCQllbHNlIGlmIChvcCA9PSBPX01JTlVTKQorCQkJCWNodnVpKHZsLCAtKTsKKwkJCS8qIG9wID09IE9fUExVUyBpcyBhIG5vLW9wICovCisJCX0gZWxzZSBpZiAob3AgPT0gT1BFTl9QQVJFTikgeworCQkJZXhwcnRva2VuKGVzKTsKKwkJCXZsID0gZXZhbGV4cHIoZXMsIE1BWF9QUkVDKTsKKwkJCWlmIChlcy0+dG9rICE9IENMT1NFX1BBUkVOKQorCQkJCWV2YWxlcnIoZXMsIEVUX1NUUiwgIm1pc3NpbmcgKSIpOworCQkJZXhwcnRva2VuKGVzKTsKKwkJfSBlbHNlIGlmIChvcCA9PSBPX1BMVVNQTFVTIHx8IG9wID09IE9fTUlOVVNNSU5VUykgeworCQkJZXhwcnRva2VuKGVzKTsKKwkJCXZsID0gZG9fcHBtbShlcywgb3AsIGVzLT52YWwsIHRydWUpOworCQkJZXhwcnRva2VuKGVzKTsKKwkJfSBlbHNlIGlmIChvcCA9PSBWQVIgfHwgb3AgPT0gTElUKSB7CisJCQl2bCA9IGVzLT52YWw7CisJCQlleHBydG9rZW4oZXMpOworCQl9IGVsc2UgeworCQkJZXZhbGVycihlcywgRVRfVU5FWFBFQ1RFRCwgTlVMTCk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJaWYgKGVzLT50b2sgPT0gT19QTFVTUExVUyB8fCBlcy0+dG9rID09IE9fTUlOVVNNSU5VUykgeworCQkJdmwgPSBkb19wcG1tKGVzLCBlcy0+dG9rLCB2bCwgZmFsc2UpOworCQkJZXhwcnRva2VuKGVzKTsKKwkJfQorCQlyZXR1cm4gKHZsKTsKKwl9CisJdmwgPSBldmFsZXhwcihlcywgcHJlYyAtIDEpOworCWZvciAob3AgPSBlcy0+dG9rOyBJU19CSU5PUChvcCkgJiYgb3BpbmZvWyhpbnQpb3BdLnByZWMgPT0gcHJlYzsKKwkgICAgb3AgPSBlcy0+dG9rKSB7CisJCWV4cHJ0b2tlbihlcyk7CisJCXZhc24gPSB2bDsKKwkJaWYgKG9wICE9IE9fQVNOKSAvKiB2bCBtYXkgbm90IGhhdmUgYSB2YWx1ZSB5ZXQgKi8KKwkJCXZsID0gaW50dmFyKGVzLCB2bCk7CisJCWlmIChJU19BU1NJR05PUChvcCkpIHsKKwkJCWFzc2lnbl9jaGVjayhlcywgb3AsIHZhc24pOworCQkJdnIgPSBpbnR2YXIoZXMsIGV2YWxleHByKGVzLCBQX0FTU0lHTikpOworCQl9IGVsc2UgaWYgKG9wICE9IE9fVEVSTiAmJiBvcCAhPSBPX0xBTkQgJiYgb3AgIT0gT19MT1IpCisJCQl2ciA9IGludHZhcihlcywgZXZhbGV4cHIoZXMsIHByZWMgLSAxKSk7CisJCWlmICgob3AgPT0gT19ESVYgfHwgb3AgPT0gT19NT0QgfHwgb3AgPT0gT19ESVZBU04gfHwKKwkJICAgIG9wID09IE9fTU9EQVNOKSAmJiB2ci0+dmFsLmkgPT0gMCkgeworCQkJaWYgKGVzLT5ub2Fzc2lnbikKKwkJCQl2ci0+dmFsLmkgPSAxOworCQkJZWxzZQorCQkJCWV2YWxlcnIoZXMsIEVUX1NUUiwgInplcm8gZGl2aXNvciIpOworCQl9CisJCXN3aXRjaCAoKGludClvcCkgeworCQljYXNlIE9fVElNRVM6CisJCWNhc2UgT19USU1FU0FTTjoKKwkJCXJlcyA9IGJpdnVpKHZsLCAqLCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX0RJVjoKKwkJY2FzZSBPX0RJVkFTTjoKKwkJCXJlcyA9IGJpdnVpKHZsLCAvLCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX01PRDoKKwkJY2FzZSBPX01PREFTTjoKKwkJCXJlcyA9IGJpdnVpKHZsLCAlLCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX1BMVVM6CisJCWNhc2UgT19QTFVTQVNOOgorCQkJcmVzID0gYml2dWkodmwsICssIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fTUlOVVM6CisJCWNhc2UgT19NSU5VU0FTTjoKKwkJCXJlcyA9IGJpdnVpKHZsLCAtLCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX0xTSElGVDoKKwkJY2FzZSBPX0xTSElGVEFTTjoKKwkJCXJlcyA9IGJpdnVpKHZsLCA8PCwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19SU0hJRlQ6CisJCWNhc2UgT19SU0hJRlRBU046CisJCQlyZXMgPSBiaXZ1aSh2bCwgPj4sIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fTFQ6CisJCQlyZXMgPSBiaXZ1aSh2bCwgPCwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19MRToKKwkJCXJlcyA9IGJpdnVpKHZsLCA8PSwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19HVDoKKwkJCXJlcyA9IGJpdnVpKHZsLCA+LCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX0dFOgorCQkJcmVzID0gYml2dWkodmwsID49LCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX0VROgorCQkJcmVzID0gYml2dWkodmwsID09LCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX05FOgorCQkJcmVzID0gYml2dWkodmwsICE9LCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX0JBTkQ6CisJCWNhc2UgT19CQU5EQVNOOgorCQkJcmVzID0gYml2dWkodmwsICYsIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fQlhPUjoKKwkJY2FzZSBPX0JYT1JBU046CisJCQlyZXMgPSBiaXZ1aSh2bCwgXiwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19CT1I6CisJCWNhc2UgT19CT1JBU046CisJCQlyZXMgPSBiaXZ1aSh2bCwgfCwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19MQU5EOgorCQkJaWYgKCF2bC0+dmFsLmkpCisJCQkJZXMtPm5vYXNzaWduKys7CisJCQl2ciA9IGludHZhcihlcywgZXZhbGV4cHIoZXMsIHByZWMgLSAxKSk7CisJCQlyZXMgPSBiaXZ1aSh2bCwgJiYsIHZyKTsKKwkJCWlmICghdmwtPnZhbC5pKQorCQkJCWVzLT5ub2Fzc2lnbi0tOworCQkJYnJlYWs7CisJCWNhc2UgT19MT1I6CisJCQlpZiAodmwtPnZhbC5pKQorCQkJCWVzLT5ub2Fzc2lnbisrOworCQkJdnIgPSBpbnR2YXIoZXMsIGV2YWxleHByKGVzLCBwcmVjIC0gMSkpOworCQkJcmVzID0gYml2dWkodmwsIHx8LCB2cik7CisJCQlpZiAodmwtPnZhbC5pKQorCQkJCWVzLT5ub2Fzc2lnbi0tOworCQkJYnJlYWs7CisJCWNhc2UgT19URVJOOgorCQkJeworCQkJCWJvb2wgZXYgPSB2bC0+dmFsLmkgIT0gMDsKKworCQkJCWlmICghZXYpCisJCQkJCWVzLT5ub2Fzc2lnbisrOworCQkJCXZsID0gZXZhbGV4cHIoZXMsIE1BWF9QUkVDKTsKKwkJCQlpZiAoIWV2KQorCQkJCQllcy0+bm9hc3NpZ24tLTsKKwkJCQlpZiAoZXMtPnRvayAhPSBDVEVSTikKKwkJCQkJZXZhbGVycihlcywgRVRfU1RSLCAibWlzc2luZyA6Iik7CisJCQkJZXhwcnRva2VuKGVzKTsKKwkJCQlpZiAoZXYpCisJCQkJCWVzLT5ub2Fzc2lnbisrOworCQkJCXZyID0gZXZhbGV4cHIoZXMsIFBfVEVSTik7CisJCQkJaWYgKGV2KQorCQkJCQllcy0+bm9hc3NpZ24tLTsKKwkJCQl2bCA9IGV2ID8gdmwgOiB2cjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9fQVNOOgorCQkJcmVzID0gdnItPnZhbC5pOworCQkJYnJlYWs7CisJCWNhc2UgT19DT01NQToKKwkJCXJlcyA9IHZyLT52YWwuaTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChJU19BU1NJR05PUChvcCkpIHsKKwkJCXN0dnVpKHZyLCByZXMpOworCQkJaWYgKCFlcy0+bm9hc3NpZ24pIHsKKwkJCQlpZiAodmFzbi0+ZmxhZyAmIElOVEVHRVIpCisJCQkJCXNldGludF92KHZhc24sIHZyLCBlcy0+YXJpdGgpOworCQkJCWVsc2UKKwkJCQkJc2V0aW50KHZhc24sIHJlcyk7CisJCQl9CisJCQl2bCA9IHZyOworCQl9IGVsc2UgaWYgKG9wICE9IE9fVEVSTikKKwkJCXN0dnVpKHZsLCByZXMpOworCX0KKwlyZXR1cm4gKHZsKTsKK30KKworc3RhdGljIHZvaWQKK2V4cHJ0b2tlbihFeHByX3N0YXRlICplcykKK3sKKwljb25zdCBjaGFyICpjcCA9IGVzLT50b2twOworCWludCBjOworCWNoYXIgKnR2YXI7CisKKwkvKiBza2lwIHdoaXRlIHNwYWNlICovCisgc2tpcF9zcGFjZXM6CisJd2hpbGUgKChjID0gKmNwKSwga3NoX2lzc3BhY2UoYykpCisJCSsrY3A7CisJaWYgKGVzLT50b2twID09IGVzLT5leHByZXNzaW9uICYmIGMgPT0gJyMnKSB7CisJCS8qIGV4cHJlc3Npb24gYmVnaW5zIHdpdGggIyAqLworCQllcy0+bmF0dXJhbCA9IHRydWU7CS8qIHN3aXRjaCB0byB1bnNpZ25lZCAqLworCQkrK2NwOworCQlnb3RvIHNraXBfc3BhY2VzOworCX0KKwllcy0+dG9rcCA9IGNwOworCisJaWYgKGMgPT0gJ1wwJykKKwkJZXMtPnRvayA9IEVORDsKKwllbHNlIGlmIChrc2hfaXNhbHBoeChjKSkgeworCQlmb3IgKDsga3NoX2lzYWxudXgoYyk7IGMgPSAqY3ApCisJCQljcCsrOworCQlpZiAoYyA9PSAnWycpIHsKKwkJCWludCBsZW47CisKKwkJCWxlbiA9IGFycmF5X3JlZl9sZW4oY3ApOworCQkJaWYgKGxlbiA9PSAwKQorCQkJCWV2YWxlcnIoZXMsIEVUX1NUUiwgIm1pc3NpbmcgXSIpOworCQkJY3AgKz0gbGVuOworCQl9IGVsc2UgaWYgKGMgPT0gJygnIC8qKSovICkgeworCQkJLyogdG9kbzogYWRkIG1hdGggZnVuY3Rpb25zIChhbGwgdGFrZSBzaW5nbGUgYXJndW1lbnQpOgorCQkJICogYWJzIGFjb3MgYXNpbiBhdGFuIGNvcyBjb3NoIGV4cCBpbnQgbG9nIHNpbiBzaW5oIHNxcnQKKwkJCSAqIHRhbiB0YW5oCisJCQkgKi8KKwkJCTsKKwkJfQorCQlpZiAoZXMtPm5vYXNzaWduKSB7CisJCQllcy0+dmFsID0gdGVtcHZhcigpOworCQkJZXMtPnZhbC0+ZmxhZyB8PSBFWFBSTFZBTFVFOworCQl9IGVsc2UgeworCQkJc3RybmR1cHgodHZhciwgZXMtPnRva3AsIGNwIC0gZXMtPnRva3AsIEFURU1QKTsKKwkJCWVzLT52YWwgPSBnbG9iYWwodHZhcik7CisJCQlhZnJlZSh0dmFyLCBBVEVNUCk7CisJCX0KKwkJZXMtPnRvayA9IFZBUjsKKwl9IGVsc2UgaWYgKGMgPT0gJzEnICYmIGNwWzFdID09ICcjJykgeworCQljcCArPSAyOworCQljcCArPSB1dGZfcHRyYWRqKGNwKTsKKwkJc3RybmR1cHgodHZhciwgZXMtPnRva3AsIGNwIC0gZXMtPnRva3AsIEFURU1QKTsKKwkJZ290byBwcm9jZXNzX3R2YXI7CisjaWZuZGVmIE1LU0hfU01BTEwKKwl9IGVsc2UgaWYgKGMgPT0gJ1wnJykgeworCQkrK2NwOworCQljcCArPSB1dGZfcHRyYWRqKGNwKTsKKwkJaWYgKCpjcCsrICE9ICdcJycpCisJCQlldmFsZXJyKGVzLCBFVF9TVFIsCisJCQkgICAgIm11bHRpLWNoYXJhY3RlciBjaGFyYWN0ZXIgY29uc3RhbnQiKTsKKwkJLyogJ3gnIC0+IDEjeCAoeCA9IG9uZSBtdWx0aWJ5dGUgY2hhcmFjdGVyKSAqLworCQljID0gY3AgLSBlcy0+dG9rcDsKKwkJdHZhciA9IGFsbG9jKGMgKyAvKiBOVUwgKi8gMSwgQVRFTVApOworCQl0dmFyWzBdID0gJzEnOworCQl0dmFyWzFdID0gJyMnOworCQltZW1jcHkodHZhciArIDIsIGVzLT50b2twICsgMSwgYyAtIDIpOworCQl0dmFyW2NdID0gJ1wwJzsKKwkJZ290byBwcm9jZXNzX3R2YXI7CisjZW5kaWYKKwl9IGVsc2UgaWYgKGtzaF9pc2RpZ2l0KGMpKSB7CisJCXdoaWxlIChjICE9ICdfJyAmJiAoa3NoX2lzYWxudXgoYykgfHwgYyA9PSAnIycpKQorCQkJYyA9ICpjcCsrOworCQlzdHJuZHVweCh0dmFyLCBlcy0+dG9rcCwgLS1jcCAtIGVzLT50b2twLCBBVEVNUCk7CisgcHJvY2Vzc190dmFyOgorCQllcy0+dmFsID0gdGVtcHZhcigpOworCQllcy0+dmFsLT5mbGFnICY9IH5JTlRFR0VSOworCQllcy0+dmFsLT50eXBlID0gMDsKKwkJZXMtPnZhbC0+dmFsLnMgPSB0dmFyOworCQlpZiAoc2V0aW50X3YoZXMtPnZhbCwgZXMtPnZhbCwgZXMtPmFyaXRoKSA9PSBOVUxMKQorCQkJZXZhbGVycihlcywgRVRfQkFETElULCB0dmFyKTsKKwkJYWZyZWUodHZhciwgQVRFTVApOworCQllcy0+dG9rID0gTElUOworCX0gZWxzZSB7CisJCWludCBpLCBuMDsKKworCQlmb3IgKGkgPSAwOyAobjAgPSBvcGluZm9baV0ubmFtZVswXSk7IGkrKykKKwkJCWlmIChjID09IG4wICYmIHN0cm5jbXAoY3AsIG9waW5mb1tpXS5uYW1lLAorCQkJICAgIChzaXplX3Qpb3BpbmZvW2ldLmxlbikgPT0gMCkgeworCQkJCWVzLT50b2sgPSAoZW51bSB0b2tlbilpOworCQkJCWNwICs9IG9waW5mb1tpXS5sZW47CisJCQkJYnJlYWs7CisJCQl9CisJCWlmICghbjApCisJCQllcy0+dG9rID0gQkFEOworCX0KKwllcy0+dG9rcCA9IGNwOworfQorCisvKiBEbyBhICsrIG9yIC0tIG9wZXJhdGlvbiAqLworc3RhdGljIHN0cnVjdCB0YmwgKgorZG9fcHBtbShFeHByX3N0YXRlICplcywgZW51bSB0b2tlbiBvcCwgc3RydWN0IHRibCAqdmFzbiwgYm9vbCBpc19wcmVmaXgpCit7CisJc3RydWN0IHRibCAqdmw7CisJbWtzaF9hcmlfdCBvdmFsOworCisJYXNzaWduX2NoZWNrKGVzLCBvcCwgdmFzbik7CisKKwl2bCA9IGludHZhcihlcywgdmFzbik7CisJb3ZhbCA9IHZsLT52YWwuaTsKKwlpZiAob3AgPT0gT19QTFVTUExVUykgeworCQlpZiAoZXMtPm5hdHVyYWwpCisJCQkrK3ZsLT52YWwudTsKKwkJZWxzZQorCQkJKyt2bC0+dmFsLmk7CisJfSBlbHNlIHsKKwkJaWYgKGVzLT5uYXR1cmFsKQorCQkJLS12bC0+dmFsLnU7CisJCWVsc2UKKwkJCS0tdmwtPnZhbC5pOworCX0KKwlpZiAodmFzbi0+ZmxhZyAmIElOVEVHRVIpCisJCXNldGludF92KHZhc24sIHZsLCBlcy0+YXJpdGgpOworCWVsc2UKKwkJc2V0aW50KHZhc24sIHZsLT52YWwuaSk7CisJaWYgKCFpc19wcmVmaXgpCQkvKiB1bmRvIHRoZSBpbmMvZGVjICovCisJCXZsLT52YWwuaSA9IG92YWw7CisKKwlyZXR1cm4gKHZsKTsKK30KKworc3RhdGljIHZvaWQKK2Fzc2lnbl9jaGVjayhFeHByX3N0YXRlICplcywgZW51bSB0b2tlbiBvcCwgc3RydWN0IHRibCAqdmFzbikKK3sKKwlpZiAoZXMtPnRvayA9PSBFTkQgfHwKKwkgICAgKHZhc24tPm5hbWVbMF0gPT0gJ1wwJyAmJiAhKHZhc24tPmZsYWcgJiBFWFBSTFZBTFVFKSkpCisJCWV2YWxlcnIoZXMsIEVUX0xWQUxVRSwgb3BpbmZvWyhpbnQpb3BdLm5hbWUpOworCWVsc2UgaWYgKHZhc24tPmZsYWcgJiBSRE9OTFkpCisJCWV2YWxlcnIoZXMsIEVUX1JET05MWSwgb3BpbmZvWyhpbnQpb3BdLm5hbWUpOworfQorCitzdGF0aWMgc3RydWN0IHRibCAqCit0ZW1wdmFyKHZvaWQpCit7CisJc3RydWN0IHRibCAqdnA7CisKKwl2cCA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgdGJsKSwgQVRFTVApOworCXZwLT5mbGFnID0gSVNTRVR8SU5URUdFUjsKKwl2cC0+dHlwZSA9IDA7CisJdnAtPmFyZWFwID0gQVRFTVA7CisJdnAtPnVhLmh2YWwgPSAwOworCXZwLT52YWwuaSA9IDA7CisJdnAtPm5hbWVbMF0gPSAnXDAnOworCXJldHVybiAodnApOworfQorCisvKiBjYXN0IChzdHJpbmcpIHZhcmlhYmxlIHRvIHRlbXBvcmFyeSBpbnRlZ2VyIHZhcmlhYmxlICovCitzdGF0aWMgc3RydWN0IHRibCAqCitpbnR2YXIoRXhwcl9zdGF0ZSAqZXMsIHN0cnVjdCB0YmwgKnZwKQoreworCXN0cnVjdCB0YmwgKnZxOworCisJLyogdHJ5IHRvIGF2b2lkIHJlcGxhY2luZyBhIHRlbXAgdmFyIHdpdGggYW5vdGhlciB0ZW1wIHZhciAqLworCWlmICh2cC0+bmFtZVswXSA9PSAnXDAnICYmCisJICAgICh2cC0+ZmxhZyAmIChJU1NFVHxJTlRFR0VSfEVYUFJMVkFMVUUpKSA9PSAoSVNTRVR8SU5URUdFUikpCisJCXJldHVybiAodnApOworCisJdnEgPSB0ZW1wdmFyKCk7CisJaWYgKHNldGludF92KHZxLCB2cCwgZXMtPmFyaXRoKSA9PSBOVUxMKSB7CisJCWlmICh2cC0+ZmxhZyAmIEVYUFJJTkVWQUwpCisJCQlldmFsZXJyKGVzLCBFVF9SRUNVUlNJVkUsIHZwLT5uYW1lKTsKKwkJZXMtPmV2YWxpbmcgPSB2cDsKKwkJdnAtPmZsYWcgfD0gRVhQUklORVZBTDsKKwkJdl9ldmFsdWF0ZSh2cSwgc3RyX3ZhbCh2cCksIEtTSF9VTldJTkRfRVJST1IsIGVzLT5hcml0aCk7CisJCXZwLT5mbGFnICY9IH5FWFBSSU5FVkFMOworCQllcy0+ZXZhbGluZyA9IE5VTEw7CisJfQorCXJldHVybiAodnEpOworfQorCisKKy8qCisgKiBVVEYtOCBzdXBwb3J0IGNvZGU6IGhpZ2gtbGV2ZWwgZnVuY3Rpb25zCisgKi8KKworaW50Cit1dGZfd2lkdGhhZGooY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICoqZHN0KQoreworCXNpemVfdCBsZW47CisJdW5zaWduZWQgaW50IHdjOworCWludCB3aWR0aDsKKworCWlmICghVVRGTU9ERSB8fCAobGVuID0gdXRmX21idG93Yygmd2MsIHNyYykpID09IChzaXplX3QpLTEgfHwKKwkgICAgd2MgPT0gMCkKKwkJbGVuID0gd2lkdGggPSAxOworCWVsc2UgaWYgKCh3aWR0aCA9IHV0Zl93Y3dpZHRoKHdjKSkgPCAwKQorCQkvKiBYWFggdXNlIDIgZm9yIHhfem90YzMgaGVyZT8gKi8KKwkJd2lkdGggPSAxOworCisJaWYgKGRzdCkKKwkJKmRzdCA9IHNyYyArIGxlbjsKKwlyZXR1cm4gKHdpZHRoKTsKK30KKworaW50Cit1dGZfbWJzd2lkdGgoY29uc3QgY2hhciAqcykKK3sKKwlzaXplX3QgbGVuOworCXVuc2lnbmVkIGludCB3YzsKKwlpbnQgd2lkdGggPSAwLCBjdzsKKworCWlmICghVVRGTU9ERSkKKwkJcmV0dXJuIChzdHJsZW4ocykpOworCisJd2hpbGUgKCpzKQorCQlpZiAoKChsZW4gPSB1dGZfbWJ0b3djKCZ3YywgcykpID09IChzaXplX3QpLTEpIHx8CisJCSAgICAoKGN3ID0gdXRmX3djd2lkdGgod2MpKSA9PSAtMSkpIHsKKwkJCXMrKzsKKwkJCXdpZHRoICs9IDE7CisJCX0gZWxzZSB7CisJCQlzICs9IGxlbjsKKwkJCXdpZHRoICs9IGN3OworCQl9CisJcmV0dXJuICh3aWR0aCk7Cit9CisKK2NvbnN0IGNoYXIgKgordXRmX3NraXBjb2xzKGNvbnN0IGNoYXIgKnAsIGludCBjb2xzKQoreworCWludCBjID0gMDsKKworCXdoaWxlIChjIDwgY29scykgeworCQlpZiAoISpwKQorCQkJcmV0dXJuIChwICsgY29scyAtIGMpOworCQljICs9IHV0Zl93aWR0aGFkaihwLCAmcCk7CisJfQorCXJldHVybiAocCk7Cit9CisKK3NpemVfdAordXRmX3B0cmFkaihjb25zdCBjaGFyICpzcmMpCit7CisJcmVnaXN0ZXIgc2l6ZV90IG47CisKKwlpZiAoIVVURk1PREUgfHwKKwkgICAgKihjb25zdCB1bnNpZ25lZCBjaGFyICopKHNyYykgPCAweEMyIHx8CisJICAgIChuID0gdXRmX21idG93YyhOVUxMLCBzcmMpKSA9PSAoc2l6ZV90KS0xKQorCQluID0gMTsKKwlyZXR1cm4gKG4pOworfQorCisvKgorICogVVRGLTggc3VwcG9ydCBjb2RlOiBsb3ctbGV2ZWwgZnVuY3Rpb25zCisgKi8KKworLyogQ0VTVS04IG11bHRpYnl0ZSBhbmQgd2lkZSBjaGFyYWN0ZXIgY29udmVyc2lvbiBjcmFmdGVkIGZvciBta3NoICovCisKK3NpemVfdAordXRmX21idG93Yyh1bnNpZ25lZCBpbnQgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXNyYzsKKwl1bnNpZ25lZCBpbnQgYywgd2M7CisKKwlpZiAoKHdjID0gKnMrKykgPCAweDgwKSB7Cisgb3V0OgorCQlpZiAoZHN0ICE9IE5VTEwpCisJCQkqZHN0ID0gd2M7CisJCXJldHVybiAod2MgPyAoKGNvbnN0IGNoYXIgKilzIC0gc3JjKSA6IDApOworCX0KKwlpZiAod2MgPCAweEMyIHx8IHdjID49IDB4RjApCisJCS8qIDwgMHhDMDogc3B1cmlvdXMgc2Vjb25kIGJ5dGUgKi8KKwkJLyogPCAweEMyOiBub24tbWluaW1hbGlzdGljIG1hcHBpbmcgZXJyb3IgaW4gMi1ieXRlIHNlcXMgKi8KKwkJLyogPiAweEVGOiBiZXlvbmQgQk1QICovCisJCWdvdG8gaWxzZXE7CisKKwlpZiAod2MgPCAweEUwKSB7CisJCXdjID0gKHdjICYgMHgxRikgPDwgNjsKKwkJaWYgKCgoYyA9ICpzKyspICYgMHhDMCkgIT0gMHg4MCkKKwkJCWdvdG8gaWxzZXE7CisJCXdjIHw9IGMgJiAweDNGOworCQlnb3RvIG91dDsKKwl9CisKKwl3YyA9ICh3YyAmIDB4MEYpIDw8IDEyOworCisJaWYgKCgoYyA9ICpzKyspICYgMHhDMCkgIT0gMHg4MCkKKwkJZ290byBpbHNlcTsKKwl3YyB8PSAoYyAmIDB4M0YpIDw8IDY7CisKKwlpZiAoKChjID0gKnMrKykgJiAweEMwKSAhPSAweDgwKQorCQlnb3RvIGlsc2VxOworCXdjIHw9IGMgJiAweDNGOworCisJLyogQ2hlY2sgZm9yIG5vbi1taW5pbWFsaXN0aWMgbWFwcGluZyBlcnJvciBpbiAzLWJ5dGUgc2VxcyAqLworCWlmICh3YyA+PSAweDA4MDAgJiYgd2MgPD0gMHhGRkZEKQorCQlnb3RvIG91dDsKKyBpbHNlcToKKwlyZXR1cm4gKChzaXplX3QpKC0xKSk7Cit9CisKK3NpemVfdAordXRmX3djdG9tYihjaGFyICpkc3QsIHVuc2lnbmVkIGludCB3YykKK3sKKwl1bnNpZ25lZCBjaGFyICpkOworCisJaWYgKHdjIDwgMHg4MCkgeworCQkqZHN0ID0gd2M7CisJCXJldHVybiAoMSk7CisJfQorCisJZCA9ICh1bnNpZ25lZCBjaGFyICopZHN0OworCWlmICh3YyA8IDB4MDgwMCkKKwkJKmQrKyA9ICh3YyA+PiA2KSB8IDB4QzA7CisJZWxzZSB7CisJCSpkKysgPSAoKHdjID0gd2MgPiAweEZGRkQgPyAweEZGRkQgOiB3YykgPj4gMTIpIHwgMHhFMDsKKwkJKmQrKyA9ICgod2MgPj4gNikgJiAweDNGKSB8IDB4ODA7CisJfQorCSpkKysgPSAod2MgJiAweDNGKSB8IDB4ODA7CisJcmV0dXJuICgoY2hhciAqKWQgLSBkc3QpOworfQorCisKKyNpZm5kZWYgTUtTSF9taXJic2Rfd2N3aWR0aAorLyogLS0tIGJlZ2luIG9mIHdjd2lkdGguYyBleGNlcnB0IC0tLSAqLworLyotCisgKiBNYXJrdXMgS3VobiAtLSAyMDA3LTA1LTI2IChVbmljb2RlIDUuMCkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisgKiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLiBUaGUgYXV0aG9yCisgKiBkaXNjbGFpbXMgYWxsIHdhcnJhbnRpZXMgd2l0aCByZWdhcmQgdG8gdGhpcyBzb2Z0d2FyZS4KKyAqLworCitfX1JDU0lEKCIkbWlyb3M6IHNyYy9saWIvbGliYy9pMThuL3djd2lkdGguYyx2IDEuOCAyMDA4LzA5LzIwIDEyOjAxOjE4IHRnIEV4cCAkIik7CisKK2ludAordXRmX3djd2lkdGgodW5zaWduZWQgaW50IGMpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjYnNldCB7CisJCXVuc2lnbmVkIHNob3J0IGZpcnN0OworCQl1bnNpZ25lZCBzaG9ydCBsYXN0OworCX0gY29tYltdID0geworCQl7IDB4MDMwMCwgMHgwMzZGIH0sIHsgMHgwNDgzLCAweDA0ODYgfSwgeyAweDA0ODgsIDB4MDQ4OSB9LAorCQl7IDB4MDU5MSwgMHgwNUJEIH0sIHsgMHgwNUJGLCAweDA1QkYgfSwgeyAweDA1QzEsIDB4MDVDMiB9LAorCQl7IDB4MDVDNCwgMHgwNUM1IH0sIHsgMHgwNUM3LCAweDA1QzcgfSwgeyAweDA2MDAsIDB4MDYwMyB9LAorCQl7IDB4MDYxMCwgMHgwNjE1IH0sIHsgMHgwNjRCLCAweDA2NUUgfSwgeyAweDA2NzAsIDB4MDY3MCB9LAorCQl7IDB4MDZENiwgMHgwNkU0IH0sIHsgMHgwNkU3LCAweDA2RTggfSwgeyAweDA2RUEsIDB4MDZFRCB9LAorCQl7IDB4MDcwRiwgMHgwNzBGIH0sIHsgMHgwNzExLCAweDA3MTEgfSwgeyAweDA3MzAsIDB4MDc0QSB9LAorCQl7IDB4MDdBNiwgMHgwN0IwIH0sIHsgMHgwN0VCLCAweDA3RjMgfSwgeyAweDA5MDEsIDB4MDkwMiB9LAorCQl7IDB4MDkzQywgMHgwOTNDIH0sIHsgMHgwOTQxLCAweDA5NDggfSwgeyAweDA5NEQsIDB4MDk0RCB9LAorCQl7IDB4MDk1MSwgMHgwOTU0IH0sIHsgMHgwOTYyLCAweDA5NjMgfSwgeyAweDA5ODEsIDB4MDk4MSB9LAorCQl7IDB4MDlCQywgMHgwOUJDIH0sIHsgMHgwOUMxLCAweDA5QzQgfSwgeyAweDA5Q0QsIDB4MDlDRCB9LAorCQl7IDB4MDlFMiwgMHgwOUUzIH0sIHsgMHgwQTAxLCAweDBBMDIgfSwgeyAweDBBM0MsIDB4MEEzQyB9LAorCQl7IDB4MEE0MSwgMHgwQTQyIH0sIHsgMHgwQTQ3LCAweDBBNDggfSwgeyAweDBBNEIsIDB4MEE0RCB9LAorCQl7IDB4MEE3MCwgMHgwQTcxIH0sIHsgMHgwQTgxLCAweDBBODIgfSwgeyAweDBBQkMsIDB4MEFCQyB9LAorCQl7IDB4MEFDMSwgMHgwQUM1IH0sIHsgMHgwQUM3LCAweDBBQzggfSwgeyAweDBBQ0QsIDB4MEFDRCB9LAorCQl7IDB4MEFFMiwgMHgwQUUzIH0sIHsgMHgwQjAxLCAweDBCMDEgfSwgeyAweDBCM0MsIDB4MEIzQyB9LAorCQl7IDB4MEIzRiwgMHgwQjNGIH0sIHsgMHgwQjQxLCAweDBCNDMgfSwgeyAweDBCNEQsIDB4MEI0RCB9LAorCQl7IDB4MEI1NiwgMHgwQjU2IH0sIHsgMHgwQjgyLCAweDBCODIgfSwgeyAweDBCQzAsIDB4MEJDMCB9LAorCQl7IDB4MEJDRCwgMHgwQkNEIH0sIHsgMHgwQzNFLCAweDBDNDAgfSwgeyAweDBDNDYsIDB4MEM0OCB9LAorCQl7IDB4MEM0QSwgMHgwQzREIH0sIHsgMHgwQzU1LCAweDBDNTYgfSwgeyAweDBDQkMsIDB4MENCQyB9LAorCQl7IDB4MENCRiwgMHgwQ0JGIH0sIHsgMHgwQ0M2LCAweDBDQzYgfSwgeyAweDBDQ0MsIDB4MENDRCB9LAorCQl7IDB4MENFMiwgMHgwQ0UzIH0sIHsgMHgwRDQxLCAweDBENDMgfSwgeyAweDBENEQsIDB4MEQ0RCB9LAorCQl7IDB4MERDQSwgMHgwRENBIH0sIHsgMHgwREQyLCAweDBERDQgfSwgeyAweDBERDYsIDB4MERENiB9LAorCQl7IDB4MEUzMSwgMHgwRTMxIH0sIHsgMHgwRTM0LCAweDBFM0EgfSwgeyAweDBFNDcsIDB4MEU0RSB9LAorCQl7IDB4MEVCMSwgMHgwRUIxIH0sIHsgMHgwRUI0LCAweDBFQjkgfSwgeyAweDBFQkIsIDB4MEVCQyB9LAorCQl7IDB4MEVDOCwgMHgwRUNEIH0sIHsgMHgwRjE4LCAweDBGMTkgfSwgeyAweDBGMzUsIDB4MEYzNSB9LAorCQl7IDB4MEYzNywgMHgwRjM3IH0sIHsgMHgwRjM5LCAweDBGMzkgfSwgeyAweDBGNzEsIDB4MEY3RSB9LAorCQl7IDB4MEY4MCwgMHgwRjg0IH0sIHsgMHgwRjg2LCAweDBGODcgfSwgeyAweDBGOTAsIDB4MEY5NyB9LAorCQl7IDB4MEY5OSwgMHgwRkJDIH0sIHsgMHgwRkM2LCAweDBGQzYgfSwgeyAweDEwMkQsIDB4MTAzMCB9LAorCQl7IDB4MTAzMiwgMHgxMDMyIH0sIHsgMHgxMDM2LCAweDEwMzcgfSwgeyAweDEwMzksIDB4MTAzOSB9LAorCQl7IDB4MTA1OCwgMHgxMDU5IH0sIHsgMHgxMTYwLCAweDExRkYgfSwgeyAweDEzNUYsIDB4MTM1RiB9LAorCQl7IDB4MTcxMiwgMHgxNzE0IH0sIHsgMHgxNzMyLCAweDE3MzQgfSwgeyAweDE3NTIsIDB4MTc1MyB9LAorCQl7IDB4MTc3MiwgMHgxNzczIH0sIHsgMHgxN0I0LCAweDE3QjUgfSwgeyAweDE3QjcsIDB4MTdCRCB9LAorCQl7IDB4MTdDNiwgMHgxN0M2IH0sIHsgMHgxN0M5LCAweDE3RDMgfSwgeyAweDE3REQsIDB4MTdERCB9LAorCQl7IDB4MTgwQiwgMHgxODBEIH0sIHsgMHgxOEE5LCAweDE4QTkgfSwgeyAweDE5MjAsIDB4MTkyMiB9LAorCQl7IDB4MTkyNywgMHgxOTI4IH0sIHsgMHgxOTMyLCAweDE5MzIgfSwgeyAweDE5MzksIDB4MTkzQiB9LAorCQl7IDB4MUExNywgMHgxQTE4IH0sIHsgMHgxQjAwLCAweDFCMDMgfSwgeyAweDFCMzQsIDB4MUIzNCB9LAorCQl7IDB4MUIzNiwgMHgxQjNBIH0sIHsgMHgxQjNDLCAweDFCM0MgfSwgeyAweDFCNDIsIDB4MUI0MiB9LAorCQl7IDB4MUI2QiwgMHgxQjczIH0sIHsgMHgxREMwLCAweDFEQ0EgfSwgeyAweDFERkUsIDB4MURGRiB9LAorCQl7IDB4MjAwQiwgMHgyMDBGIH0sIHsgMHgyMDJBLCAweDIwMkUgfSwgeyAweDIwNjAsIDB4MjA2MyB9LAorCQl7IDB4MjA2QSwgMHgyMDZGIH0sIHsgMHgyMEQwLCAweDIwRUYgfSwgeyAweDMwMkEsIDB4MzAyRiB9LAorCQl7IDB4MzA5OSwgMHgzMDlBIH0sIHsgMHhBODA2LCAweEE4MDYgfSwgeyAweEE4MEIsIDB4QTgwQiB9LAorCQl7IDB4QTgyNSwgMHhBODI2IH0sIHsgMHhGQjFFLCAweEZCMUUgfSwgeyAweEZFMDAsIDB4RkUwRiB9LAorCQl7IDB4RkUyMCwgMHhGRTIzIH0sIHsgMHhGRUZGLCAweEZFRkYgfSwgeyAweEZGRjksIDB4RkZGQiB9CisJfTsKKwlzaXplX3QgbWluID0gMCwgbWlkLCBtYXggPSBORUxFTShjb21iKSAtIDE7CisKKwkvKiB0ZXN0IGZvciA4LWJpdCBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlpZiAoYyA8IDMyIHx8IChjID49IDB4N2YgJiYgYyA8IDB4YTApKQorCQlyZXR1cm4gKGMgPyAtMSA6IDApOworCisJLyogYmluYXJ5IHNlYXJjaCBpbiB0YWJsZSBvZiBub24tc3BhY2luZyBjaGFyYWN0ZXJzICovCisJaWYgKGMgPj0gY29tYlswXS5maXJzdCAmJiBjIDw9IGNvbWJbbWF4XS5sYXN0KQorCQl3aGlsZSAobWF4ID49IG1pbikgeworCQkJbWlkID0gKG1pbiArIG1heCkgLyAyOworCQkJaWYgKGMgPiBjb21iW21pZF0ubGFzdCkKKwkJCQltaW4gPSBtaWQgKyAxOworCQkJZWxzZSBpZiAoYyA8IGNvbWJbbWlkXS5maXJzdCkKKwkJCQltYXggPSBtaWQgLSAxOworCQkJZWxzZQorCQkJCXJldHVybiAoMCk7CisJCX0KKworCS8qIGlmIHdlIGFycml2ZSBoZXJlLCBjIGlzIG5vdCBhIGNvbWJpbmluZyBvciBDMC9DMSBjb250cm9sIGNoYXIgKi8KKwlyZXR1cm4gKChjID49IDB4MTEwMCAmJiAoCisJICAgIGMgPD0gMHgxMTVmIHx8IC8qIEhhbmd1bCBKYW1vIGluaXQuIGNvbnNvbmFudHMgKi8KKwkgICAgYyA9PSAweDIzMjkgfHwgYyA9PSAweDIzMmEgfHwKKwkgICAgKGMgPj0gMHgyZTgwICYmIGMgPD0gMHhhNGNmICYmIGMgIT0gMHgzMDNmKSB8fCAvKiBDSksgLi4uIFlpICovCisJICAgIChjID49IDB4YWMwMCAmJiBjIDw9IDB4ZDdhMykgfHwgLyogSGFuZ3VsIFN5bGxhYmxlcyAqLworCSAgICAoYyA+PSAweGY5MDAgJiYgYyA8PSAweGZhZmYpIHx8IC8qIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgKi8KKwkgICAgKGMgPj0gMHhmZTEwICYmIGMgPD0gMHhmZTE5KSB8fCAvKiBWZXJ0aWNhbCBmb3JtcyAqLworCSAgICAoYyA+PSAweGZlMzAgJiYgYyA8PSAweGZlNmYpIHx8IC8qIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zICovCisJICAgIChjID49IDB4ZmYwMCAmJiBjIDw9IDB4ZmY2MCkgfHwgLyogRnVsbHdpZHRoIEZvcm1zICovCisJICAgIChjID49IDB4ZmZlMCAmJiBjIDw9IDB4ZmZlNikpKSA/IDIgOiAxKTsKK30KKy8qIC0tLSBlbmQgb2Ygd2N3aWR0aC5jIGV4Y2VycHQgLS0tICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL21rc2gvc3JjL2Z1bmNzLmMgYi9ta3NoL3NyYy9mdW5jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOWMwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9mdW5jcy5jCkBAIC0wLDAgKzEsMzQyOSBAQAorLyoJJE9wZW5CU0Q6IGNfa3NoLmMsdiAxLjMzIDIwMDkvMDIvMDcgMTQ6MDM6MjQga2lsaSBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IGNfc2guYyx2IDEuNDEgMjAxMC8wMy8yNyAwOToxMDowMSBqbWMgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBjX3Rlc3QuYyx2IDEuMTggMjAwOS8wMy8wMSAyMDoxMTowNiBvdHRvIEV4cCAkCSovCisvKgkkT3BlbkJTRDogY191bGltaXQuYyx2IDEuMTcgMjAwOC8wMy8yMSAxMjo1MToxOSBtaWxsZXJ0IEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvZnVuY3MuYyx2IDEuMTU3IDIwMTAvMDgvMjQgMTQ6NDI6MDEgdGcgRXhwICQiKTsKKworI2lmIEhBVkVfS0lMTFBHCisvKgorICogdXNlIGtpbGxwZyBpZiA8IC0xIHNpbmNlIC0xIGRvZXMgc3BlY2lhbCB0aGluZ3MKKyAqIGZvciBzb21lIG5vbi1raWxscGctZW5kb3dlZCBraWxscworICovCisjZGVmaW5lIG1rc2hfa2lsbChwLHMpCSgocCkgPCAtMSA/IGtpbGxwZygtKHApLCAocykpIDoga2lsbCgocCksIChzKSkpCisjZWxzZQorLyogY3Jvc3MgZmluZ2VycyBhbmQgaG9wZSBraWxsIGlzIGtpbGxwZy1lbmRvd2VkICovCisjZGVmaW5lIG1rc2hfa2lsbAlraWxsCisjZW5kaWYKKworLyogWFhYIGNvbmRpdGlvbnMgY29ycmVjdD8gKi8KKyNpZiAhZGVmaW5lZChSTElNX0lORklOSVRZKSAmJiAhZGVmaW5lZChNS1NIX05PX0xJTUlUUykKKyNkZWZpbmUgTUtTSF9OT19MSU1JVFMKKyNlbmRpZgorCisjaWZkZWYgTUtTSF9OT19MSU1JVFMKKyNkZWZpbmUgY191bGltaXQgY19sYWJlbAorI2VuZGlmCisKK2V4dGVybiB1aW50OF90IHNldF9yZWZmbGFnOworCisvKiBBIGxlYWRpbmcgPSBtZWFucyBhc3NpZ25tZW50cyBiZWZvcmUgY29tbWFuZCBhcmUga2VwdDsKKyAqIGEgbGVhZGluZyAqIG1lYW5zIGEgUE9TSVggc3BlY2lhbCBidWlsdGluOworICogYSBsZWFkaW5nICsgbWVhbnMgYSBQT1NJWCByZWd1bGFyIGJ1aWx0aW4KKyAqICgqIGFuZCArIHNob3VsZCBub3QgYmUgY29tYmluZWQpLgorICovCitjb25zdCBzdHJ1Y3QgYnVpbHRpbiBta3NoYnVpbHRpbnNbXSA9IHsKKwl7Iio9LiIsIGNfZG90fSwKKwl7Iio9OiIsIGNfbGFiZWx9LAorCXsiWyIsIGNfdGVzdH0sCisJeyIqPWJyZWFrIiwgY19icmtjb250fSwKKwl7Ij1idWlsdGluIiwgY19idWlsdGlufSwKKwl7Iio9Y29udGludWUiLCBjX2Jya2NvbnR9LAorCXsiKj1ldmFsIiwgY19ldmFsfSwKKwl7Iio9ZXhlYyIsIGNfZXhlY30sCisJeyIqPWV4aXQiLCBjX2V4aXRyZXR1cm59LAorCXsiK2ZhbHNlIiwgY19sYWJlbH0sCisJeyIqPXJldHVybiIsIGNfZXhpdHJldHVybn0sCisJeyIqPXNldCIsIGNfc2V0fSwKKwl7Iio9c2hpZnQiLCBjX3NoaWZ0fSwKKwl7Ij10aW1lcyIsIGNfdGltZXN9LAorCXsiKj10cmFwIiwgY190cmFwfSwKKwl7Iis9d2FpdCIsIGNfd2FpdH0sCisJeyIrcmVhZCIsIGNfcmVhZH0sCisJeyJ0ZXN0IiwgY190ZXN0fSwKKwl7Iit0cnVlIiwgY19sYWJlbH0sCisJeyJ1bGltaXQiLCBjX3VsaW1pdH0sCisJeyIrdW1hc2siLCBjX3VtYXNrfSwKKwl7Iio9dW5zZXQiLCBjX3Vuc2V0fSwKKwl7IithbGlhcyIsIGNfYWxpYXN9LAkvKiBubyA9OiBBVCZUIG1hbnVhbCB3cm9uZyAqLworCXsiK2NkIiwgY19jZH0sCisJeyJjaGRpciIsIGNfY2R9LAkvKiBkYXNoIGNvbXBhdGliaWxpdHkgaGFjayAqLworCXsiK2NvbW1hbmQiLCBjX2NvbW1hbmR9LAorCXsiZWNobyIsIGNfcHJpbnR9LAorCXsiKj1leHBvcnQiLCBjX3R5cGVzZXR9LAorCXsiK2ZjIiwgY19mY30sCisJeyIrZ2V0b3B0cyIsIGNfZ2V0b3B0c30sCisJeyIram9icyIsIGNfam9ic30sCisJeyIra2lsbCIsIGNfa2lsbH0sCisJeyJsZXQiLCBjX2xldH0sCisJeyJwcmludCIsIGNfcHJpbnR9LAorI2lmZGVmIE1LU0hfUFJJTlRGX0JVSUxUSU4KKwl7InByaW50ZiIsIGNfcHJpbnRmfSwKKyNlbmRpZgorCXsicHdkIiwgY19wd2R9LAorCXsiKj1yZWFkb25seSIsIGNfdHlwZXNldH0sCisJe1RfX3R5cGVzZXQsIGNfdHlwZXNldH0sCisJeyIrdW5hbGlhcyIsIGNfdW5hbGlhc30sCisJeyJ3aGVuY2UiLCBjX3doZW5jZX0sCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCXsiK2JnIiwgY19mZ2JnfSwKKwl7IitmZyIsIGNfZmdiZ30sCisjZW5kaWYKKwl7ImJpbmQiLCBjX2JpbmR9LAorI2lmIEhBVkVfTUtOT0QKKwl7Im1rbm9kIiwgY19ta25vZH0sCisjZW5kaWYKKwl7InJlYWxwYXRoIiwgY19yZWFscGF0aH0sCisJeyJyZW5hbWUiLCBjX3JlbmFtZX0sCisJe05VTEwsIChpbnQgKCopKGNvbnN0IGNoYXIgKiopKU5VTEx9Cit9OworCitzdHJ1Y3Qga2lsbF9pbmZvIHsKKwlpbnQgbnVtX3dpZHRoOworCWludCBuYW1lX3dpZHRoOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0X29wIHsKKwljaGFyIG9wX3RleHRbNF07CisJVGVzdF9vcCBvcF9udW07Cit9IHVfb3BzW10gPSB7CisJeyItYSIsCVRPX0ZJTEFYU1QgfSwKKwl7Ii1iIiwJVE9fRklMQkRFViB9LAorCXsiLWMiLAlUT19GSUxDREVWIH0sCisJeyItZCIsCVRPX0ZJTElEIH0sCisJeyItZSIsCVRPX0ZJTEVYU1QgfSwKKwl7Ii1mIiwJVE9fRklMUkVHIH0sCisJeyItRyIsCVRPX0ZJTEdJRCB9LAorCXsiLWciLAlUT19GSUxTRVRHIH0sCisJeyItaCIsCVRPX0ZJTFNZTSB9LAorCXsiLUgiLAlUT19GSUxDREYgfSwKKwl7Ii1rIiwJVE9fRklMU1RDSyB9LAorCXsiLUwiLAlUT19GSUxTWU0gfSwKKwl7Ii1uIiwJVE9fU1ROWkUgfSwKKwl7Ii1PIiwJVE9fRklMVUlEIH0sCisJeyItbyIsCVRPX09QVElPTiB9LAorCXsiLXAiLAlUT19GSUxGSUZPIH0sCisJeyItciIsCVRPX0ZJTFJEIH0sCisJeyItcyIsCVRPX0ZJTEdaIH0sCisJeyItUyIsCVRPX0ZJTFNPQ0sgfSwKKwl7Ii10IiwJVE9fRklMVFQgfSwKKwl7Ii11IiwJVE9fRklMU0VUVSB9LAorCXsiLXciLAlUT19GSUxXUiB9LAorCXsiLXgiLAlUT19GSUxFWCB9LAorCXsiLXoiLAlUT19TVFpFUiB9LAorCXsiIiwJVE9fTk9OT1AgfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdF9vcCBiX29wc1tdID0geworCXsiPSIsCVRPX1NURVFMIH0sCisJeyI9PSIsCVRPX1NURVFMIH0sCisJeyIhPSIsCVRPX1NUTkVRIH0sCisJeyI8IiwJVE9fU1RMVCB9LAorCXsiPiIsCVRPX1NUR1QgfSwKKwl7Ii1lcSIsCVRPX0lOVEVRIH0sCisJeyItbmUiLAlUT19JTlRORSB9LAorCXsiLWd0IiwJVE9fSU5UR1QgfSwKKwl7Ii1nZSIsCVRPX0lOVEdFIH0sCisJeyItbHQiLAlUT19JTlRMVCB9LAorCXsiLWxlIiwJVE9fSU5UTEUgfSwKKwl7Ii1lZiIsCVRPX0ZJTEVRIH0sCisJeyItbnQiLAlUT19GSUxOVCB9LAorCXsiLW90IiwJVE9fRklMT1QgfSwKKwl7IiIsCVRPX05PTk9QIH0KK307CisKK3N0YXRpYyBpbnQgdGVzdF9lYWNjZXNzKGNvbnN0IGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgdGVzdF9vZXhwcihUZXN0X2VudiAqLCBib29sKTsKK3N0YXRpYyBpbnQgdGVzdF9hZXhwcihUZXN0X2VudiAqLCBib29sKTsKK3N0YXRpYyBpbnQgdGVzdF9uZXhwcihUZXN0X2VudiAqLCBib29sKTsKK3N0YXRpYyBpbnQgdGVzdF9wcmltYXJ5KFRlc3RfZW52ICosIGJvb2wpOworc3RhdGljIFRlc3Rfb3AgcHRlc3RfaXNhKFRlc3RfZW52ICosIFRlc3RfbWV0YSk7CitzdGF0aWMgY29uc3QgY2hhciAqcHRlc3RfZ2V0b3BuZChUZXN0X2VudiAqLCBUZXN0X29wLCBib29sKTsKK3N0YXRpYyB2b2lkIHB0ZXN0X2Vycm9yKFRlc3RfZW52ICosIGludCwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyBjaGFyICpraWxsX2ZtdF9lbnRyeShjaGFyICosIGludCwgaW50LCBjb25zdCB2b2lkICopOworc3RhdGljIHZvaWQgcF90aW1lKHN0cnVjdCBzaGYgKiwgYm9vbCwgbG9uZywgaW50LCBpbnQsCisgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopCisgICAgTUtTSF9BX05PTk5VTEwoKG5vbm51bGwgKDYsIDcpKSk7CitzdGF0aWMgY2hhciAqZG9fcmVhbHBhdGgoY29uc3QgY2hhciAqKTsKKworc3RhdGljIGNoYXIgKgorZG9fcmVhbHBhdGgoY29uc3QgY2hhciAqdXBhdGgpCit7CisJY2hhciAqeHAsICppcCwgKnRwLCAqaXBhdGgsICpsZGVzdCA9IE5VTEw7CisJWFN0cmluZyB4czsKKwlwdHJkaWZmX3QgcG9zOworCXNpemVfdCBsZW47CisJaW50IHN5bWxpbmtzID0gMzI7CS8qIG1heC4gcmVjdXJzaW9uIGRlcHRoICovCisJaW50IGxsZW47CisJc3RydWN0IHN0YXQgc2I7CisjaWZkZWYgTk9fUEFUSF9NQVgKKwlzaXplX3QgbGRlc3RsZW4gPSAwOworI2RlZmluZSBwYXRobGVuIHNiLnN0X3NpemUKKyNkZWZpbmUgcGF0aGNuZCAobGRlc3RsZW4gPCAocGF0aGxlbiArIDEpKQorI2Vsc2UKKyNkZWZpbmUgcGF0aGxlbiBQQVRIX01BWAorI2RlZmluZSBwYXRoY25kICghbGRlc3QpCisjZW5kaWYKKworCWlmICh1cGF0aFswXSA9PSAnLycpIHsKKwkJLyogdXBhdGggaXMgYW4gYWJzb2x1dGUgcGF0aG5hbWUgKi8KKwkJc3RyZHVweChpcGF0aCwgdXBhdGgsIEFURU1QKTsKKwl9IGVsc2UgeworCQkvKiB1cGF0aCBpcyBhIHJlbGF0aXZlIHBhdGhuYW1lLCBwcmVwZW5kIGN3ZCAqLworCQlpZiAoKHRwID0ga3NoX2dldF93ZChOVUxMKSkgPT0gTlVMTCB8fCB0cFswXSAhPSAnLycpCisJCQlyZXR1cm4gKE5VTEwpOworCQlpcGF0aCA9IHNoZl9zbXByaW50ZigiJXMvJXMiLCB0cCwgdXBhdGgpOworCQlhZnJlZSh0cCwgQVRFTVApOworCX0KKworCVhpbml0KHhzLCB4cCwgc3RybGVuKGlwID0gaXBhdGgpICsgMSwgQVRFTVApOworCisJd2hpbGUgKCppcCkgeworCQkvKiBza2lwIHNsYXNoZXMgaW4gaW5wdXQgKi8KKwkJd2hpbGUgKCppcCA9PSAnLycpCisJCQkrK2lwOworCQlpZiAoISppcCkKKwkJCWJyZWFrOworCisJCS8qIGdldCBuZXh0IHBhdGhuYW1lIGNvbXBvbmVudCBmcm9tIGlucHV0ICovCisJCXRwID0gaXA7CisJCXdoaWxlICgqaXAgJiYgKmlwICE9ICcvJykKKwkJCSsraXA7CisJCWxlbiA9IGlwIC0gdHA7CisKKwkJLyogY2hlY2sgaW5wdXQgZm9yICIuIiBhbmQgIi4uIiAqLworCQlpZiAodHBbMF0gPT0gJy4nKSB7CisJCQlpZiAobGVuID09IDEpCisJCQkJLyoganVzdCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZSAqLworCQkJCWNvbnRpbnVlOworCQkJZWxzZSBpZiAobGVuID09IDIgJiYgdHBbMV0gPT0gJy4nKSB7CisJCQkJLyogc3RyaXAgb2ZmIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50ICovCisJCQkJd2hpbGUgKHhwID4gWHN0cmluZyh4cywgeHApKQorCQkJCQlpZiAoKi0teHAgPT0gJy8nKQorCQkJCQkJYnJlYWs7CisJCQkJLyogdGhlbiBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogc3RvcmUgb3V0cHV0IHBvc2l0aW9uIGF3YXksIHRoZW4gYXBwZW5kIHNsYXNoIHRvIG91dHB1dCAqLworCQlwb3MgPSBYc2F2ZXBvcyh4cywgeHApOworCQkvKiAxIGZvciB0aGUgJy8nIGFuZCBsZW4gKyAxIGZvciB0cCBhbmQgdGhlIE5VTCBmcm9tIGJlbG93ICovCisJCVhjaGVja04oeHMsIHhwLCAxICsgbGVuICsgMSk7CisJCVhwdXQoeHMsIHhwLCAnLycpOworCisJCS8qIGFwcGVuZCBuZXh0IHBhdGhuYW1lIGNvbXBvbmVudCB0byBvdXRwdXQgKi8KKwkJbWVtY3B5KHhwLCB0cCwgbGVuKTsKKwkJeHAgKz0gbGVuOworCQkqeHAgPSAnXDAnOworCisJCS8qIGxzdGF0IHRoZSBjdXJyZW50IG91dHB1dCwgc2VlIGlmIGl0J3MgYSBzeW1saW5rICovCisJCWlmIChsc3RhdChYc3RyaW5nKHhzLCB4cCksICZzYikpIHsKKwkJCS8qIGxzdGF0IGZhaWxlZCAqLworCQkJaWYgKGVycm5vID09IEVOT0VOVCkgeworCQkJCS8qIGJlY2F1c2UgdGhlIHBhdGhuYW1lIGRvZXMgbm90IGV4aXN0ICovCisJCQkJd2hpbGUgKCppcCA9PSAnLycpCisJCQkJCS8qIHNraXAgYW55IHRyYWlsaW5nIHNsYXNoZXMgKi8KKwkJCQkJKytpcDsKKwkJCQkvKiBubyBtb3JlIGNvbXBvbmVudHMgbGVmdD8gKi8KKwkJCQlpZiAoISppcCkKKwkJCQkJLyogd2UgY2FuIHN0aWxsIHJldHVybiBzdWNjZXNzZnVsbHkgKi8KKwkJCQkJYnJlYWs7CisJCQkJLyogbW9yZSBjb21wb25lbnRzIGxlZnQ/IGZhbGwgdGhyb3VnaCAqLworCQkJfQorCQkJLyogbm90IEVOT0VOVCBvciBub3QgYXQgdGhlIGVuZCBvZiBpcGF0aCAqLworCQkJZ290byBub3Rmb3VuZDsKKwkJfQorCisJCS8qIGNoZWNrIGlmIHdlIGVuY291bnRlcmVkIGEgc3ltbGluaz8gKi8KKwkJaWYgKFNfSVNMTksoc2Iuc3RfbW9kZSkpIHsKKwkJCS8qIHJlYWNoZWQgbWF4aW11bSByZWN1cnNpb24gZGVwdGg/ICovCisJCQlpZiAoIXN5bWxpbmtzLS0pIHsKKwkJCQkvKiB5ZXAsIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgKi8KKwkJCQllcnJubyA9IEVMT09QOworCQkJCWdvdG8gbm90Zm91bmQ7CisJCQl9CisKKwkJCS8qIGdldCBzeW1saW5rKDcpIHRhcmdldCAqLworCQkJaWYgKHBhdGhjbmQpCisJCQkJbGRlc3QgPSBhcmVzaXplKGxkZXN0LCBwYXRobGVuICsgMSwgQVRFTVApOworCQkJbGxlbiA9IHJlYWRsaW5rKFhzdHJpbmcoeHMsIHhwKSwgbGRlc3QsIHBhdGhsZW4pOworCQkJaWYgKGxsZW4gPCAwKQorCQkJCS8qIG9vcHMuLi4gKi8KKwkJCQlnb3RvIG5vdGZvdW5kOworCQkJbGRlc3RbbGxlbl0gPSAnXDAnOworCisJCQkvKgorCQkJICogcmVzdGFydCBpZiBzeW1saW5rIHRhcmdldCBpcyBhbiBhYnNvbHV0ZSBwYXRoLAorCQkJICogb3RoZXJ3aXNlIGNvbnRpbnVlIHdpdGggY3VycmVudGx5IHJlc29sdmVkIHByZWZpeAorCQkJICovCisJCQl4cCA9IChsZGVzdFswXSA9PSAnLycpID8gWHN0cmluZyh4cywgeHApIDoKKwkJCSAgICBYcmVzdHBvcyh4cywgeHAsIHBvcyk7CisJCQl0cCA9IHNoZl9zbXByaW50ZigiJXMlcyVzIiwgbGRlc3QsICppcCA/ICIvIiA6ICIiLCBpcCk7CisJCQlhZnJlZShpcGF0aCwgQVRFTVApOworCQkJaXAgPSBpcGF0aCA9IHRwOworCQl9CisJCS8qIG90aGVyd2lzZSAobm8gc3ltbGluaykgbWVyZWx5IGdvIG9uICovCisJfQorCisJLyoKKwkgKiBlaXRoZXIgZm91bmQgdGhlIHRhcmdldCBhbmQgc3VjY2Vzc2Z1bGx5IHJlc29sdmVkIGl0LAorCSAqIG9yIGZvdW5kIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGFuZCBtYXkgY3JlYXRlIGl0CisJICovCisJaWYgKFhsZW5ndGgoeHMsIHhwKSA9PSAwKQorCQkvKgorCQkgKiBpZiB0aGUgcmVzb2x2ZWQgcGF0aG5hbWUgaXMgIiIsIG1ha2UgaXQgIi8iLAorCQkgKiBvdGhlcndpc2UgZG8gbm90IGFkZCBhIHRyYWlsaW5nIHNsYXNoCisJCSAqLworCQlYcHV0KHhzLCB4cCwgJy8nKTsKKwlYcHV0KHhzLCB4cCwgJ1wwJyk7CisKKwkvKgorCSAqIGlmIHNvdXJjZSBwYXRoIGhhZCBhIHRyYWlsaW5nIHNsYXNoLCBjaGVjayBpZiB0YXJnZXQgcGF0aAorCSAqIGlzIG5vdCBhIG5vbi1kaXJlY3RvcnkgZXhpc3RpbmcgZmlsZQorCSAqLworCWlmIChpcCA+IGlwYXRoICYmIGlwWy0xXSA9PSAnLycpIHsKKwkJaWYgKHN0YXQoWHN0cmluZyh4cywgeHApLCAmc2IpKSB7CisJCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJCWdvdG8gbm90Zm91bmQ7CisJCX0gZWxzZSBpZiAoIVNfSVNESVIoc2Iuc3RfbW9kZSkpIHsKKwkJCWVycm5vID0gRU5PVERJUjsKKwkJCWdvdG8gbm90Zm91bmQ7CisJCX0KKwkJLyogdGFyZ2V0IG5vdyBlaXRoZXIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgYSBkaXJlY3RvcnkgKi8KKwl9CisKKwkvKiByZXR1cm4gdGFyZ2V0IHBhdGggKi8KKwlpZiAobGRlc3QgIT0gTlVMTCkKKwkJYWZyZWUobGRlc3QsIEFURU1QKTsKKwlhZnJlZShpcGF0aCwgQVRFTVApOworCXJldHVybiAoWGNsb3NlKHhzLCB4cCkpOworCisgbm90Zm91bmQ6CisJbGxlbiA9IGVycm5vOwkvKiBzYXZlOyBmcmVlKDMpIG1pZ2h0IHRyYXNoIGl0ICovCisJaWYgKGxkZXN0ICE9IE5VTEwpCisJCWFmcmVlKGxkZXN0LCBBVEVNUCk7CisJYWZyZWUoaXBhdGgsIEFURU1QKTsKKwlYZnJlZSh4cywgeHApOworCWVycm5vID0gbGxlbjsKKwlyZXR1cm4gKE5VTEwpOworCisjdW5kZWYgcGF0aGxlbgorI3VuZGVmIHBhdGhjbmQKK30KKworaW50CitjX2NkKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgb3B0YywgcnYsIHBoeXNfcGF0aDsKKwlib29sIHBoeXNpY2FsID0gRmxhZyhGUEhZU0lDQUwpID8gdHJ1ZSA6IGZhbHNlOworCWludCBjZG5vZGU7CQkJLyogd2FzIGEgbm9kZSBmcm9tIGNkcGF0aCBhZGRlZCBpbj8gKi8KKwlib29sIHByaW50cGF0aCA9IGZhbHNlOwkJLyogcHJpbnQgd2hlcmUgd2UgY2QnZD8gKi8KKwlzdHJ1Y3QgdGJsICpwd2RfcywgKm9sZHB3ZF9zOworCVhTdHJpbmcgeHM7CisJY2hhciAqZGlyLCAqYWxsb2NkID0gTlVMTCwgKnRyeXAsICpwd2QsICpjZHBhdGg7CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJMUCIpKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ0wnOgorCQkJcGh5c2ljYWwgPSBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCXBoeXNpY2FsID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisKKwlpZiAoRmxhZyhGUkVTVFJJQ1RFRCkpIHsKKwkJYmlfZXJyb3JmKCJyZXN0cmljdGVkIHNoZWxsIC0gY2FuJ3QgY2QiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlwd2RfcyA9IGdsb2JhbCgiUFdEIik7CisJb2xkcHdkX3MgPSBnbG9iYWwoIk9MRFBXRCIpOworCisJaWYgKCF3cFswXSkgeworCQkvKiBObyBhcmd1bWVudHMgLSBnbyBob21lICovCisJCWlmICgoZGlyID0gc3RyX3ZhbChnbG9iYWwoIkhPTUUiKSkpID09IG51bGwpIHsKKwkJCWJpX2Vycm9yZigibm8gaG9tZSBkaXJlY3RvcnkgKEhPTUUgbm90IHNldCkiKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9IGVsc2UgaWYgKCF3cFsxXSkgeworCQkvKiBPbmUgYXJndW1lbnQ6IC0gb3IgZGlyICovCisJCXN0cmR1cHgoYWxsb2NkLCB3cFswXSwgQVRFTVApOworCQlpZiAoa3NoX2lzZGFzaCgoZGlyID0gYWxsb2NkKSkpIHsKKwkJCWFmcmVlKGFsbG9jZCwgQVRFTVApOworCQkJYWxsb2NkID0gTlVMTDsKKwkJCWRpciA9IHN0cl92YWwob2xkcHdkX3MpOworCQkJaWYgKGRpciA9PSBudWxsKSB7CisJCQkJYmlfZXJyb3JmKCJubyBPTERQV0QiKTsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQkJcHJpbnRwYXRoID0gdHJ1ZTsKKwkJfQorCX0gZWxzZSBpZiAoIXdwWzJdKSB7CisJCS8qIFR3byBhcmd1bWVudHMgLSBzdWJzdGl0dXRlIGFyZzEgaW4gUFdEIGZvciBhcmcyICovCisJCWludCBpbGVuLCBvbGVuLCBubGVuLCBlbGVuOworCQljaGFyICpjcDsKKworCQlpZiAoIWN1cnJlbnRfd2RbMF0pIHsKKwkJCWJpX2Vycm9yZigiZG9uJ3Qga25vdyBjdXJyZW50IGRpcmVjdG9yeSIpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQkvKiBzdWJzdGl0dXRlIGFyZzEgZm9yIGFyZzIgaW4gY3VycmVudCBwYXRoLgorCQkgKiBpZiB0aGUgZmlyc3Qgc3Vic3RpdHV0aW9uIGZhaWxzIGJlY2F1c2UgdGhlIGNkIGZhaWxzCisJCSAqIHdlIGNvdWxkIHRyeSB0byBmaW5kIGFub3RoZXIgc3Vic3RpdHV0aW9uLiBGb3Igbm93CisJCSAqIHdlIGRvbid0CisJCSAqLworCQlpZiAoKGNwID0gc3Ryc3RyKGN1cnJlbnRfd2QsIHdwWzBdKSkgPT0gTlVMTCkgeworCQkJYmlfZXJyb3JmKCJiYWQgc3Vic3RpdHV0aW9uIik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCWlsZW4gPSBjcCAtIGN1cnJlbnRfd2Q7CisJCW9sZW4gPSBzdHJsZW4od3BbMF0pOworCQlubGVuID0gc3RybGVuKHdwWzFdKTsKKwkJZWxlbiA9IHN0cmxlbihjdXJyZW50X3dkICsgaWxlbiArIG9sZW4pICsgMTsKKwkJZGlyID0gYWxsb2NkID0gYWxsb2MoaWxlbiArIG5sZW4gKyBlbGVuLCBBVEVNUCk7CisJCW1lbWNweShkaXIsIGN1cnJlbnRfd2QsIGlsZW4pOworCQltZW1jcHkoZGlyICsgaWxlbiwgd3BbMV0sIG5sZW4pOworCQltZW1jcHkoZGlyICsgaWxlbiArIG5sZW4sIGN1cnJlbnRfd2QgKyBpbGVuICsgb2xlbiwgZWxlbik7CisJCXByaW50cGF0aCA9IHRydWU7CisJfSBlbHNlIHsKKwkJYmlfZXJyb3JmKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKyNpZmRlZiBOT19QQVRIX01BWAorCS8qIG9ubHkgYSBmaXJzdCBndWVzczsgbWFrZV9wYXRoIHdpbGwgZW5sYXJnZSB4cyBpZiBuZWNlc3NhcnkgKi8KKwlYaW5pdE4oeHMsIDEwMjQsIEFURU1QKTsKKyNlbHNlCisJWGluaXROKHhzLCBQQVRIX01BWCwgQVRFTVApOworI2VuZGlmCisKKwljZHBhdGggPSBzdHJfdmFsKGdsb2JhbCgiQ0RQQVRIIikpOworCWRvIHsKKwkJY2Rub2RlID0gbWFrZV9wYXRoKGN1cnJlbnRfd2QsIGRpciwgJmNkcGF0aCwgJnhzLCAmcGh5c19wYXRoKTsKKwkJaWYgKHBoeXNpY2FsKQorCQkJcnYgPSBjaGRpcih0cnlwID0gWHN0cmluZyh4cywgeHApICsgcGh5c19wYXRoKTsKKwkJZWxzZSB7CisJCQlzaW1wbGlmeV9wYXRoKFhzdHJpbmcoeHMsIHhwKSk7CisJCQlydiA9IGNoZGlyKHRyeXAgPSBYc3RyaW5nKHhzLCB4cCkpOworCQl9CisJfSB3aGlsZSAocnYgPCAwICYmIGNkcGF0aCAhPSBOVUxMKTsKKworCWlmIChydiA8IDApIHsKKwkJaWYgKGNkbm9kZSkKKwkJCWJpX2Vycm9yZigiJXM6IGJhZCBkaXJlY3RvcnkiLCBkaXIpOworCQllbHNlCisJCQliaV9lcnJvcmYoIiVzIC0gJXMiLCB0cnlwLCBzdHJlcnJvcihlcnJubykpOworCQlhZnJlZShhbGxvY2QsIEFURU1QKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKiBhbGxvY2QgKGFib3ZlKSA9PiBkaXIsIHdoaWNoIGlzIG5vIGxvbmdlciB1c2VkICovCisJYWZyZWUoYWxsb2NkLCBBVEVNUCk7CisJYWxsb2NkID0gTlVMTDsKKworCS8qIENsZWFyIG91dCB0cmFja2VkIGFsaWFzZXMgd2l0aCByZWxhdGl2ZSBwYXRocyAqLworCWZsdXNoY29tKDApOworCisJLyogU2V0IE9MRFBXRCAobm90ZTogdW5zZXR0aW5nIE9MRFBXRCBkb2VzIG5vdCBkaXNhYmxlIHRoaXMKKwkgKiBzZXR0aW5nIGluIEFUJlQga3NoKQorCSAqLworCWlmIChjdXJyZW50X3dkWzBdKQorCQkvKiBJZ25vcmUgZmFpbHVyZSAoaGFwcGVucyBpZiByZWFkb25seSBvciBpbnRlZ2VyKSAqLworCQlzZXRzdHIob2xkcHdkX3MsIGN1cnJlbnRfd2QsIEtTSF9SRVRVUk5fRVJST1IpOworCisJaWYgKFhzdHJpbmcoeHMsIHhwKVswXSAhPSAnLycpIHsKKwkJcHdkID0gTlVMTDsKKwl9IGVsc2UgaWYgKCFwaHlzaWNhbCB8fCAhKHB3ZCA9IGFsbG9jZCA9IGRvX3JlYWxwYXRoKFhzdHJpbmcoeHMsIHhwKSkpKQorCQlwd2QgPSBYc3RyaW5nKHhzLCB4cCk7CisKKwkvKiBTZXQgUFdEICovCisJaWYgKHB3ZCkgeworCQljaGFyICpwdG1wID0gcHdkOworCisJCXNldF9jdXJyZW50X3dkKHB0bXApOworCQkvKiBJZ25vcmUgZmFpbHVyZSAoaGFwcGVucyBpZiByZWFkb25seSBvciBpbnRlZ2VyKSAqLworCQlzZXRzdHIocHdkX3MsIHB0bXAsIEtTSF9SRVRVUk5fRVJST1IpOworCX0gZWxzZSB7CisJCXNldF9jdXJyZW50X3dkKG51bGwpOworCQlwd2QgPSBYc3RyaW5nKHhzLCB4cCk7CisJCS8qIFhYWCB1bnNldCAkUFdEPyAqLworCX0KKwlpZiAocHJpbnRwYXRoIHx8IGNkbm9kZSkKKwkJc2hwcmludGYoIiVzXG4iLCBwd2QpOworCisJYWZyZWUoYWxsb2NkLCBBVEVNUCk7CisJcmV0dXJuICgwKTsKK30KKworaW50CitjX3B3ZChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IG9wdGM7CisJYm9vbCBwaHlzaWNhbCA9IEZsYWcoRlBIWVNJQ0FMKSA/IHRydWUgOiBmYWxzZTsKKwljaGFyICpwLCAqYWxsb2NkID0gTlVMTDsKKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgIkxQIikpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnTCc6CisJCQlwaHlzaWNhbCA9IGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgJ1AnOgorCQkJcGh5c2ljYWwgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKworCWlmICh3cFswXSkgeworCQliaV9lcnJvcmYoInRvbyBtYW55IGFyZ3VtZW50cyIpOworCQlyZXR1cm4gKDEpOworCX0KKwlwID0gY3VycmVudF93ZFswXSA/IChwaHlzaWNhbCA/IGFsbG9jZCA9IGRvX3JlYWxwYXRoKGN1cnJlbnRfd2QpIDoKKwkgICAgY3VycmVudF93ZCkgOiBOVUxMOworCWlmIChwICYmIGFjY2VzcyhwLCBSX09LKSA8IDApCisJCXAgPSBOVUxMOworCWlmICghcCAmJiAhKHAgPSBhbGxvY2QgPSBrc2hfZ2V0X3dkKE5VTEwpKSkgeworCQliaV9lcnJvcmYoImNhbid0IGdldCBjdXJyZW50IGRpcmVjdG9yeSAtICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJc2hwcmludGYoIiVzXG4iLCBwKTsKKwlhZnJlZShhbGxvY2QsIEFURU1QKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc19wdHI7CitzdGF0aWMgaW50IHNfZ2V0KHZvaWQpOworc3RhdGljIHZvaWQgc19wdXQoaW50KTsKKworaW50CitjX3ByaW50KGNvbnN0IGNoYXIgKip3cCkKK3sKKyNkZWZpbmUgUE9fTkwJCUJJVCgwKQkvKiBwcmludCBuZXdsaW5lICovCisjZGVmaW5lIFBPX0VYUEFORAlCSVQoMSkJLyogZXhwYW5kIGJhY2tzbGFzaCBzZXF1ZW5jZXMgKi8KKyNkZWZpbmUgUE9fUE1JTlVTTUlOVVMJQklUKDIpCS8qIHByaW50IGEgLS0gYXJndW1lbnQgKi8KKyNkZWZpbmUgUE9fSElTVAkJQklUKDMpCS8qIHByaW50IHRvIGhpc3RvcnkgaW5zdGVhZCBvZiBzdGRvdXQgKi8KKyNkZWZpbmUgUE9fQ09QUk9DCUJJVCg0KQkvKiBwcmludGluZyB0byBjb3Byb2Nlc3M6IGJsb2NrIFNJR1BJUEUgKi8KKwlpbnQgZmQgPSAxLCBjOworCWludCBmbGFncyA9IFBPX0VYUEFORHxQT19OTDsKKwljb25zdCBjaGFyICpzLCAqZW1zZzsKKwlYU3RyaW5nIHhzOworCWNoYXIgKnhwOworCisJaWYgKHdwWzBdWzBdID09ICdlJykgeworCQkvKiBlY2hvIGJ1aWx0aW4gKi8KKwkJd3ArKzsKKwkJaWYgKEZsYWcoRlBPU0lYKSB8fCBGbGFnKEZTSCkpIHsKKwkJCS8qIERlYmlhbiBQb2xpY3kgMTAuNCBjb21wbGlhbnQgImVjaG8iIGJ1aWx0aW4gKi8KKwkJCWlmICgqd3AgJiYgIXN0cmNtcCgqd3AsICItbiIpKSB7CisJCQkJLyogd2UgcmVjb2duaXNlICItbiIgb25seSBhcyB0aGUgZmlyc3QgYXJnICovCisJCQkJZmxhZ3MgPSAwOworCQkJCXdwKys7CisJCQl9IGVsc2UKKwkJCQkvKiBvdGhlcndpc2UsIHdlIHByaW50IGV2ZXJ5dGhpbmcgYXMtaXMgKi8KKwkJCQlmbGFncyA9IFBPX05MOworCQl9IGVsc2UgeworCQkJaW50IG5mbGFncyA9IGZsYWdzOworCisJCQkvKioKKwkJCSAqIGEgY29tcHJvbWlzZSBiZXR3ZWVuIHN5c1YgYW5kIEJTRCBlY2hvIGNvbW1hbmRzOgorCQkJICogZXNjYXBlIHNlcXVlbmNlcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LCBhbmQgLW4sCisJCQkgKiAtZSBhbmQgLUUgYXJlIHJlY29nbmlzZWQgaWYgdGhleSBhcHBlYXIgaW4gYXJndS0KKwkJCSAqIG1lbnRzIHdpdGggbm8gaWxsZWdhbCBvcHRpb25zIChpZSwgZWNobyAtbnEgd2lsbAorCQkJICogcHJpbnQgLW5xKS4KKwkJCSAqIERpZmZlcmVudCBmcm9tIHN5c1YgZWNobyBzaW5jZSBvcHRpb25zIGFyZSByZWNvLQorCQkJICogZ25pc2VkLCBkaWZmZXJlbnQgZnJvbSBCU0QgZWNobyBzaW5jZSBlc2NhcGUgc2UtCisJCQkgKiBxdWVuY2VzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCisJCQkgKi8KKworCQkJd2hpbGUgKChzID0gKndwKSAmJiAqcyA9PSAnLScgJiYgc1sxXSkgeworCQkJCXdoaWxlICgqKytzKQorCQkJCQlpZiAoKnMgPT0gJ24nKQorCQkJCQkJbmZsYWdzICY9IH5QT19OTDsKKwkJCQkJZWxzZSBpZiAoKnMgPT0gJ2UnKQorCQkJCQkJbmZsYWdzIHw9IFBPX0VYUEFORDsKKwkJCQkJZWxzZSBpZiAoKnMgPT0gJ0UnKQorCQkJCQkJbmZsYWdzICY9IH5QT19FWFBBTkQ7CisJCQkJCWVsc2UKKwkJCQkJCS8qCisJCQkJCQkgKiBiYWQgb3B0aW9uOiBkb24ndCB1c2UKKwkJCQkJCSAqIG5mbGFncywgcHJpbnQgYXJndW1lbnQKKwkJCQkJCSAqLworCQkJCQkJYnJlYWs7CisKKwkJCQlpZiAoKnMpCisJCQkJCWJyZWFrOworCQkJCXdwKys7CisJCQkJZmxhZ3MgPSBuZmxhZ3M7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpbnQgb3B0YzsKKwkJY29uc3QgY2hhciAqb3B0cyA9ICJSbnByc3UsIjsKKworCQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG9wdHMpKSAhPSAtMSkKKwkJCXN3aXRjaCAob3B0YykgeworCQkJY2FzZSAnUic6IC8qIGZha2UgQlNEIGVjaG8gY29tbWFuZCAqLworCQkJCWZsYWdzIHw9IFBPX1BNSU5VU01JTlVTOworCQkJCWZsYWdzICY9IH5QT19FWFBBTkQ7CisJCQkJb3B0cyA9ICJuZSI7CisJCQkJYnJlYWs7CisJCQljYXNlICdlJzoKKwkJCQlmbGFncyB8PSBQT19FWFBBTkQ7CisJCQkJYnJlYWs7CisJCQljYXNlICduJzoKKwkJCQlmbGFncyAmPSB+UE9fTkw7CisJCQkJYnJlYWs7CisJCQljYXNlICdwJzoKKwkJCQlpZiAoKGZkID0gY29wcm9jX2dldGZkKFdfT0ssICZlbXNnKSkgPCAwKSB7CisJCQkJCWJpX2Vycm9yZigiLXA6ICVzIiwgZW1zZyk7CisJCQkJCXJldHVybiAoMSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAncic6CisJCQkJZmxhZ3MgJj0gflBPX0VYUEFORDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgorCQkJCWZsYWdzIHw9IFBPX0hJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlICd1JzoKKwkJCQlpZiAoISoocyA9IGJ1aWx0aW5fb3B0Lm9wdGFyZykpCisJCQkJCWZkID0gMDsKKwkJCQllbHNlIGlmICgoZmQgPSBjaGVja19mZChzLCBXX09LLCAmZW1zZykpIDwgMCkgeworCQkJCQliaV9lcnJvcmYoIi11OiAlczogJXMiLCBzLCBlbXNnKTsKKwkJCQkJcmV0dXJuICgxKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICc/JzoKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCisJCWlmICghKGJ1aWx0aW5fb3B0LmluZm8gJiBHSV9NSU5VU01JTlVTKSkgeworCQkJLyogdHJlYXQgYSBsb25lIC0gbGlrZSAtLSAqLworCQkJaWYgKHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0gJiYKKwkJCSAgICBrc2hfaXNkYXNoKHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0pKQorCQkJCWJ1aWx0aW5fb3B0Lm9wdGluZCsrOworCQl9IGVsc2UgaWYgKGZsYWdzICYgUE9fUE1JTlVTTUlOVVMpCisJCQlidWlsdGluX29wdC5vcHRpbmQtLTsKKwkJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCX0KKworCVhpbml0KHhzLCB4cCwgMTI4LCBBVEVNUCk7CisKKwl3aGlsZSAoKndwICE9IE5VTEwpIHsKKwkJcyA9ICp3cDsKKwkJd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykgeworCQkJWGNoZWNrKHhzLCB4cCk7CisJCQlpZiAoKGZsYWdzICYgUE9fRVhQQU5EKSAmJiBjID09ICdcXCcpIHsKKwkJCQlzX3B0ciA9IHM7CisJCQkJYyA9IHVuYmtzbChmYWxzZSwgc19nZXQsIHNfcHV0KTsKKwkJCQlzID0gc19wdHI7CisJCQkJaWYgKGMgPT0gLTEpIHsKKwkJCQkJLyogcmVqZWN0ZWQgYnkgZ2VuZXJpYyBmdW5jdGlvbiAqLworCQkJCQlzd2l0Y2ggKChjID0gKnMrKykpIHsKKwkJCQkJY2FzZSAnYyc6CisJCQkJCQlmbGFncyAmPSB+UE9fTkw7CisJCQkJCQkvKiBBVCZUIGJyYWluIGRhbWFnZSAqLworCQkJCQkJY29udGludWU7CisJCQkJCWNhc2UgJ1wwJzoKKwkJCQkJCXMtLTsKKwkJCQkJCWMgPSAnXFwnOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlYcHV0KHhzLCB4cCwgJ1xcJyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKCh1bnNpZ25lZCBpbnQpYyA+IDB4RkYpIHsKKwkJCQkJLyogZ2VuZXJpYyBmdW5jdGlvbiByZXR1cm5lZCBVbmljb2RlICovCisJCQkJCWNoYXIgdHNbNF07CisKKwkJCQkJYyA9IHV0Zl93Y3RvbWIodHMsIGMgLSAweDEwMCk7CisJCQkJCXRzW2NdID0gMDsKKwkJCQkJZm9yIChjID0gMDsgdHNbY107ICsrYykKKwkJCQkJCVhwdXQoeHMsIHhwLCB0c1tjXSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCVhwdXQoeHMsIHhwLCBjKTsKKwkJfQorCQlpZiAoKisrd3AgIT0gTlVMTCkKKwkJCVhwdXQoeHMsIHhwLCAnICcpOworCX0KKwlpZiAoZmxhZ3MgJiBQT19OTCkKKwkJWHB1dCh4cywgeHAsICdcbicpOworCisJaWYgKGZsYWdzICYgUE9fSElTVCkgeworCQlYcHV0KHhzLCB4cCwgJ1wwJyk7CisJCWhpc3RzYXZlKCZzb3VyY2UtPmxpbmUsIFhzdHJpbmcoeHMsIHhwKSwgdHJ1ZSwgZmFsc2UpOworCQlYZnJlZSh4cywgeHApOworCX0gZWxzZSB7CisJCWludCBsZW4gPSBYbGVuZ3RoKHhzLCB4cCk7CisJCWludCBvcGlwZSA9IDA7CisKKwkJLyogRW5zdXJlIHdlIGFyZW4ndCBraWxsZWQgYnkgYSBTSUdQSVBFIHdoaWxlIHdyaXRpbmcgdG8KKwkJICogYSBjb3Byb2Nlc3MuIEFUJlQga3NoIGRvZXNuJ3Qgc2VlbSB0byBkbyB0aGlzIChzZWVtcworCQkgKiB0byBqdXN0IGNoZWNrIHRoYXQgdGhlIGNvLXByb2Nlc3MgaXMgYWxpdmUgd2hpY2ggaXMKKwkJICogbm90IGVub3VnaCkuCisJCSAqLworCQlpZiAoY29wcm9jLndyaXRlID49IDAgJiYgY29wcm9jLndyaXRlID09IGZkKSB7CisJCQlmbGFncyB8PSBQT19DT1BST0M7CisJCQlvcGlwZSA9IGJsb2NrX3BpcGUoKTsKKwkJfQorCQlmb3IgKHMgPSBYc3RyaW5nKHhzLCB4cCk7IGxlbiA+IDA7ICkgeworCQkJaWYgKChjID0gd3JpdGUoZmQsIHMsIGxlbikpIDwgMCkgeworCQkJCWlmIChmbGFncyAmIFBPX0NPUFJPQykKKwkJCQkJcmVzdG9yZV9waXBlKG9waXBlKTsKKwkJCQlpZiAoZXJybm8gPT0gRUlOVFIpIHsKKwkJCQkJLyogYWxsb3cgdXNlciB0byBeQyBvdXQgKi8KKwkJCQkJaW50cmNoZWNrKCk7CisJCQkJCWlmIChmbGFncyAmIFBPX0NPUFJPQykKKwkJCQkJCW9waXBlID0gYmxvY2tfcGlwZSgpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCXMgKz0gYzsKKwkJCWxlbiAtPSBjOworCQl9CisJCWlmIChmbGFncyAmIFBPX0NPUFJPQykKKwkJCXJlc3RvcmVfcGlwZShvcGlwZSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorc19nZXQodm9pZCkKK3sKKwlyZXR1cm4gKCpzX3B0cisrKTsKK30KKworc3RhdGljIHZvaWQKK3NfcHV0KGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJLS1zX3B0cjsKK30KKworaW50CitjX3doZW5jZShjb25zdCBjaGFyICoqd3ApCit7CisJc3RydWN0IHRibCAqdHA7CisJY29uc3QgY2hhciAqaWQ7CisJYm9vbCBwZmxhZyA9IGZhbHNlLCB2ZmxhZyA9IGZhbHNlLCBWZmxhZyA9IGZhbHNlOworCWludCBydiA9IDAsIG9wdGMsIGZjZmxhZ3M7CisJYm9vbCBpYW1fd2hlbmNlID0gd3BbMF1bMF0gPT0gJ3cnOworCWNvbnN0IGNoYXIgKm9wdHMgPSBpYW1fd2hlbmNlID8gInB2IiA6ICJwdlYiOworCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBvcHRzKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdwJzoKKwkJCXBmbGFnID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCXZmbGFnID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCVZmbGFnID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisKKwlmY2ZsYWdzID0gRkNfQkkgfCBGQ19QQVRIIHwgRkNfRlVOQzsKKwlpZiAoIWlhbV93aGVuY2UpIHsKKwkJLyogTm90ZSB0aGF0IC1wIG9uIGl0cyBvd24gaXMgZGVhbCB3aXRoIGluIGNvbWV4ZWMoKSAqLworCQlpZiAocGZsYWcpCisJCQlmY2ZsYWdzIHw9IEZDX0RFRlBBVEg7CisJCS8qIENvbnZlcnQgY29tbWFuZCBvcHRpb25zIHRvIHdoZW5jZSBvcHRpb25zIC0gbm90ZSB0aGF0CisJCSAqIGNvbW1hbmQgLXBWIHVzZXMgYSBkaWZmZXJlbnQgcGF0aCBzZWFyY2ggdGhhbiB3aGVuY2UgLXYKKwkJICogb3Igd2hlbmNlIC1wdi4gVGhpcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGZlYXR1cmUuCisJCSAqLworCQl2ZmxhZyA9IFZmbGFnOworCX0KKwlpZiAocGZsYWcpCisJCWZjZmxhZ3MgJj0gfihGQ19CSSB8IEZDX0ZVTkMpOworCisJd2hpbGUgKCh2ZmxhZyB8fCBydiA9PSAwKSAmJiAoaWQgPSAqd3ArKykgIT0gTlVMTCkgeworCQl1aW50MzJfdCBoID0gMDsKKworCQl0cCA9IE5VTEw7CisJCWlmICgoaWFtX3doZW5jZSB8fCB2ZmxhZykgJiYgIXBmbGFnKQorCQkJdHAgPSBrdHNlYXJjaCgma2V5d29yZHMsIGlkLCBoID0gaGFzaChpZCkpOworCQlpZiAoIXRwICYmICFwZmxhZykgeworCQkJdHAgPSBrdHNlYXJjaCgmYWxpYXNlcywgaWQsIGggPyBoIDogaGFzaChpZCkpOworCQkJaWYgKHRwICYmICEodHAtPmZsYWcgJiBJU1NFVCkpCisJCQkJdHAgPSBOVUxMOworCQl9CisJCWlmICghdHApCisJCQl0cCA9IGZpbmRjb20oaWQsIGZjZmxhZ3MpOworCQlpZiAodmZsYWcgfHwgKHRwLT50eXBlICE9IENBTElBUyAmJiB0cC0+dHlwZSAhPSBDRVhFQyAmJgorCQkgICAgdHAtPnR5cGUgIT0gQ1RBTElBUykpCisJCQlzaGZfcHV0cyhpZCwgc2hsX3N0ZG91dCk7CisJCXN3aXRjaCAodHAtPnR5cGUpIHsKKwkJY2FzZSBDS0VZV0Q6CisJCQlpZiAodmZsYWcpCisJCQkJc2hmX3B1dHMoIiBpcyBhIHJlc2VydmVkIHdvcmQiLCBzaGxfc3Rkb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIENBTElBUzoKKwkJCWlmICh2ZmxhZykKKwkJCQlzaHByaW50ZigiIGlzIGFuICVzYWxpYXMgZm9yICIsCisJCQkJICAgICh0cC0+ZmxhZyAmIEVYUE9SVCkgPyAiZXhwb3J0ZWQgIiA6IG51bGwpOworCQkJaWYgKCFpYW1fd2hlbmNlICYmICF2ZmxhZykKKwkJCQlzaHByaW50ZigiYWxpYXMgJXM9IiwgaWQpOworCQkJcHJpbnRfdmFsdWVfcXVvdGVkKHRwLT52YWwucyk7CisJCQlicmVhazsKKwkJY2FzZSBDRlVOQzoKKwkJCWlmICh2ZmxhZykgeworCQkJCXNoZl9wdXRzKCIgaXMgYSIsIHNobF9zdGRvdXQpOworCQkJCWlmICh0cC0+ZmxhZyAmIEVYUE9SVCkKKwkJCQkJc2hmX3B1dHMoIm4gZXhwb3J0ZWQiLCBzaGxfc3Rkb3V0KTsKKwkJCQlpZiAodHAtPmZsYWcgJiBUUkFDRSkKKwkJCQkJc2hmX3B1dHMoIiB0cmFjZWQiLCBzaGxfc3Rkb3V0KTsKKwkJCQlpZiAoISh0cC0+ZmxhZyAmIElTU0VUKSkgeworCQkJCQlzaGZfcHV0cygiIHVuZGVmaW5lZCIsIHNobF9zdGRvdXQpOworCQkJCQlpZiAodHAtPnUuZnBhdGgpCisJCQkJCQlzaHByaW50ZigiIChhdXRvbG9hZCBmcm9tICVzKSIsCisJCQkJCQkgICAgdHAtPnUuZnBhdGgpOworCQkJCX0KKwkJCQlzaGZfcHV0cygiIGZ1bmN0aW9uIiwgc2hsX3N0ZG91dCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDU0hFTEw6CisJCQlpZiAodmZsYWcpCisJCQkJc2hwcmludGYoIiBpcyBhJXMgc2hlbGwgYnVpbHRpbiIsCisJCQkJICAgICh0cC0+ZmxhZyAmIFNQRUNfQkkpID8gIiBzcGVjaWFsIiA6IG51bGwpOworCQkJYnJlYWs7CisJCWNhc2UgQ1RBTElBUzoKKwkJY2FzZSBDRVhFQzoKKwkJCWlmICh0cC0+ZmxhZyAmIElTU0VUKSB7CisJCQkJaWYgKHZmbGFnKSB7CisJCQkJCXNoZl9wdXRzKCIgaXMgIiwgc2hsX3N0ZG91dCk7CisJCQkJCWlmICh0cC0+dHlwZSA9PSBDVEFMSUFTKQorCQkJCQkJc2hwcmludGYoImEgdHJhY2tlZCAlc2FsaWFzIGZvciAiLAorCQkJCQkJICAgICh0cC0+ZmxhZyAmIEVYUE9SVCkgPworCQkJCQkJICAgICJleHBvcnRlZCAiIDogbnVsbCk7CisJCQkJfQorCQkJCXNoZl9wdXRzKHRwLT52YWwucywgc2hsX3N0ZG91dCk7CisJCQl9IGVsc2UgeworCQkJCWlmICh2ZmxhZykKKwkJCQkJc2hmX3B1dHMoIiBub3QgZm91bmQiLCBzaGxfc3Rkb3V0KTsKKwkJCQlydiA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNocHJpbnRmKCIlcyBpcyAqR09LKiIsIGlkKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICh2ZmxhZyB8fCAhcnYpCisJCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKKwl9CisJcmV0dXJuIChydik7Cit9CisKKy8qIERlYWwgd2l0aCBjb21tYW5kIC12ViAtIGNvbW1hbmQgLXAgZGVhbHQgd2l0aCBpbiBjb21leGVjKCkgKi8KK2ludAorY19jb21tYW5kKGNvbnN0IGNoYXIgKip3cCkKK3sKKwkvKiBMZXQgY193aGVuY2UgZG8gdGhlIHdvcmsuIE5vdGUgdGhhdCBjX2NvbW1hbmQoKSBtdXN0IGJlCisJICogYSBkaXN0aW5jdCBmdW5jdGlvbiBmcm9tIGNfd2hlbmNlKCkgKHRlc3RlZCBpbiBjb21leGVjKCkpLgorCSAqLworCXJldHVybiAoY193aGVuY2Uod3ApKTsKK30KKworLyogdHlwZXNldCwgZXhwb3J0LCBhbmQgcmVhZG9ubHkgKi8KK2ludAorY190eXBlc2V0KGNvbnN0IGNoYXIgKip3cCkKK3sKKwlzdHJ1Y3QgYmxvY2sgKmw7CisJc3RydWN0IHRibCAqdnAsICoqcDsKKwlUZmxhZyBmc2V0ID0gMCwgZmNsciA9IDAsIGZsYWc7CisJaW50IHRoaW5nID0gMCwgZmllbGQsIGJhc2UsIG9wdGM7CisJY29uc3QgY2hhciAqb3B0czsKKwljb25zdCBjaGFyICpmaWVsZHN0ciwgKmJhc2VzdHI7CisJYm9vbCBsb2NhbHYgPSBmYWxzZSwgZnVuYyA9IGZhbHNlLCBwZmxhZyA9IGZhbHNlLCBpc3RzZXQgPSB0cnVlOworCisJc3dpdGNoICgqKndwKSB7CisJY2FzZSAnZSc6CQkvKiBleHBvcnQgKi8KKwkJZnNldCB8PSBFWFBPUlQ7CisJCWlzdHNldCA9IGZhbHNlOworCQlicmVhazsKKwljYXNlICdyJzoJCS8qIHJlYWRvbmx5ICovCisJCWZzZXQgfD0gUkRPTkxZOworCQlpc3RzZXQgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAncyc6CQkvKiBzZXQgKi8KKwkJLyogY2FsbGVkIHdpdGggJ3R5cGVzZXQgLScgKi8KKwkJYnJlYWs7CisJY2FzZSAndCc6CQkvKiB0eXBlc2V0ICovCisJCWxvY2FsdiA9IHRydWU7CisJCWJyZWFrOworCX0KKworCS8qIHNlZSBjb21tZW50IGJlbG93IHJlZ2FyZGluZyBwb3NzaWJsZSBvcGlvbnMgKi8KKwlvcHRzID0gaXN0c2V0ID8gIkwjUiNVWiNhZmkjbG5wcnR1eCIgOiAicCI7CisKKwlmaWVsZHN0ciA9IGJhc2VzdHIgPSBOVUxMOworCWJ1aWx0aW5fb3B0LmZsYWdzIHw9IEdGX1BMVVNPUFQ7CisJLyogQVQmVCBrc2ggc2VlbXMgdG8gaGF2ZSAwLTkgYXMgb3B0aW9ucyB3aGljaCBhcmUgbXVsdGlwbGllZAorCSAqIHRvIGdldCBhIG51bWJlciB0aGF0IGlzIHVzZWQgd2l0aCAtTCwgLVIsIC1aIG9yIC1pIChlZywgLTFSMgorCSAqIHNldHMgcmlnaHQganVzdGlmeSBpbiBhIGZpZWxkIG9mIDEyKS4gVGhpcyBhbGxvd3Mgb3B0aW9ucworCSAqIHRvIGJlIGdyb3VwZWQgaW4gYW4gb3JkZXIgKGVnLCAtTHUxMiksIGJ1dCBkaXNhbGxvd3MgLWk4IC1MMyBhbmQKKwkgKiBkb2VzIG5vdCBhbGxvdyB0aGUgbnVtYmVyIHRvIGJlIHNwZWNpZmllZCBhcyBhIHNlcGFyYXRlIGFyZ3VtZW50CisJICogSGVyZSwgdGhlIG51bWJlciBtdXN0IGZvbGxvdyB0aGUgUkxaaSBvcHRpb24sIGJ1dCBpcyBvcHRpb25hbAorCSAqIChzZWUgdGhlICMga2x1ZGdlIGluIGtzaF9nZXRvcHQoKSkuCisJICovCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBvcHRzKSkgIT0gLTEpIHsKKwkJZmxhZyA9IDA7CisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdMJzoKKwkJCWZsYWcgPSBMSlVTVDsKKwkJCWZpZWxkc3RyID0gYnVpbHRpbl9vcHQub3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ1InOgorCQkJZmxhZyA9IFJKVVNUOworCQkJZmllbGRzdHIgPSBidWlsdGluX29wdC5vcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnVSc6CisJCQkvKiBBVCZUIGtzaCB1c2VzIHUsIGJ1dCB0aGlzIGNvbmZsaWN0cyB3aXRoCisJCQkgKiB1cHBlci9sb3dlciBjYXNlLiBJZiB0aGlzIG9wdGlvbiBpcyBjaGFuZ2VkLAorCQkJICogbmVlZCB0byBjaGFuZ2UgdGhlIC1VIGJlbG93IGFzIHdlbGwKKwkJCSAqLworCQkJZmxhZyA9IElOVF9VOworCQkJYnJlYWs7CisJCWNhc2UgJ1onOgorCQkJZmxhZyA9IFpFUk9GSUw7CisJCQlmaWVsZHN0ciA9IGJ1aWx0aW5fb3B0Lm9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdhJzoKKwkJCS8qCisJCQkgKiB0aGlzIGlzIHN1cHBvc2VkIHRvIHNldCAoLWEpIG9yIHVuc2V0ICgrYSkgdGhlCisJCQkgKiBpbmRleGVkIGFycmF5IGF0dHJpYnV0ZTsgaXQgZG9lcyBub3RoaW5nIG9uIGFuCisJCQkgKiBleGlzdGluZyByZWd1bGFyIHN0cmluZyBvciBpbmRleGVkIGFycmF5IHRob3VnaAorCQkJICovCisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlmdW5jID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCWZsYWcgPSBJTlRFR0VSOworCQkJYmFzZXN0ciA9IGJ1aWx0aW5fb3B0Lm9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWZsYWcgPSBMQ0FTRVY7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlzZXRfcmVmZmxhZyA9IChidWlsdGluX29wdC5pbmZvICYgR0lfUExVUykgPyAyIDogMTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCS8qIGV4cG9ydCwgcmVhZG9ubHk6IFBPU0lYIC1wIGZsYWcgKi8KKwkJCS8qIHR5cGVzZXQ6IHNob3cgdmFsdWVzIGFzIHdlbGwgKi8KKwkJCXBmbGFnID0gdHJ1ZTsKKwkJCWlmIChpc3RzZXQpCisJCQkJY29udGludWU7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlmbGFnID0gUkRPTkxZOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJZmxhZyA9IFRSQUNFOworCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorCQkJZmxhZyA9IFVDQVNFVl9BTDsJLyogdXBwZXIgY2FzZSAvIGF1dG9sb2FkICovCisJCQlicmVhazsKKwkJY2FzZSAneCc6CisJCQlmbGFnID0gRVhQT1JUOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorCQlpZiAoYnVpbHRpbl9vcHQuaW5mbyAmIEdJX1BMVVMpIHsKKwkJCWZjbHIgfD0gZmxhZzsKKwkJCWZzZXQgJj0gfmZsYWc7CisJCQl0aGluZyA9ICcrJzsKKwkJfSBlbHNlIHsKKwkJCWZzZXQgfD0gZmxhZzsKKwkJCWZjbHIgJj0gfmZsYWc7CisJCQl0aGluZyA9ICctJzsKKwkJfQorCX0KKworCWZpZWxkID0gMDsKKwlpZiAoZmllbGRzdHIgJiYgIWJpX2dldG4oZmllbGRzdHIsICZmaWVsZCkpCisJCXJldHVybiAoMSk7CisJYmFzZSA9IDA7CisJaWYgKGJhc2VzdHIgJiYgIWJpX2dldG4oYmFzZXN0ciwgJmJhc2UpKQorCQlyZXR1cm4gKDEpOworCisJaWYgKCEoYnVpbHRpbl9vcHQuaW5mbyAmIEdJX01JTlVTTUlOVVMpICYmIHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0gJiYKKwkgICAgKHdwW2J1aWx0aW5fb3B0Lm9wdGluZF1bMF0gPT0gJy0nIHx8CisJICAgIHdwW2J1aWx0aW5fb3B0Lm9wdGluZF1bMF0gPT0gJysnKSAmJgorCSAgICB3cFtidWlsdGluX29wdC5vcHRpbmRdWzFdID09ICdcMCcpIHsKKwkJdGhpbmcgPSB3cFtidWlsdGluX29wdC5vcHRpbmRdWzBdOworCQlidWlsdGluX29wdC5vcHRpbmQrKzsKKwl9CisKKwlpZiAoZnVuYyAmJiAoKChmc2V0fGZjbHIpICYgfihUUkFDRXxVQ0FTRVZfQUx8RVhQT1JUKSkgfHwgc2V0X3JlZmZsYWcpKSB7CisJCWJpX2Vycm9yZigib25seSAtdCwgLXUgYW5kIC14IG9wdGlvbnMgbWF5IGJlIHVzZWQgd2l0aCAtZiIpOworCQlzZXRfcmVmZmxhZyA9IDA7CisJCXJldHVybiAoMSk7CisJfQorCWlmICh3cFtidWlsdGluX29wdC5vcHRpbmRdKSB7CisJCS8qIFRha2UgY2FyZSBvZiBleGNsdXNpb25zLgorCQkgKiBBdCB0aGlzIHBvaW50LCBmbGFncyBpbiBmc2V0IGFyZSBjbGVhcmVkIGluIGZjbHIgYW5kIHZpY2UKKwkJICogdmVyc2EuIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHByZXNlcnZlZC4KKwkJICovCisJCWlmIChmc2V0ICYgTENBU0VWKQkvKiBMQ0FTRVYgaGFzIHByaW9yaXR5IG92ZXIgVUNBU0VWX0FMICovCisJCQlmc2V0ICY9IH5VQ0FTRVZfQUw7CisJCWlmIChmc2V0ICYgTEpVU1QpCS8qIExKVVNUIGhhcyBwcmlvcml0eSBvdmVyIFJKVVNUICovCisJCQlmc2V0ICY9IH5SSlVTVDsKKwkJaWYgKChmc2V0ICYgKFpFUk9GSUx8TEpVU1QpKSA9PSBaRVJPRklMKSB7IC8qIC1aIGltcGxpZXMgLVpSICovCisJCQlmc2V0IHw9IFJKVVNUOworCQkJZmNsciAmPSB+UkpVU1Q7CisJCX0KKwkJLyogU2V0dGluZyB0aGVzZSBhdHRyaWJ1dGVzIGNsZWFycyB0aGUgb3RoZXJzLCB1bmxlc3MgdGhleQorCQkgKiBhcmUgYWxzbyBzZXQgaW4gdGhpcyBjb21tYW5kCisJCSAqLworCQlpZiAoKGZzZXQgJiAoTEpVU1QgfCBSSlVTVCB8IFpFUk9GSUwgfCBVQ0FTRVZfQUwgfCBMQ0FTRVYgfAorCQkgICAgSU5URUdFUiB8IElOVF9VIHwgSU5UX0wpKSB8fCBzZXRfcmVmZmxhZykKKwkJCWZjbHIgfD0gfmZzZXQgJiAoTEpVU1QgfCBSSlVTVCB8IFpFUk9GSUwgfCBVQ0FTRVZfQUwgfAorCQkJICAgIExDQVNFViB8IElOVEVHRVIgfCBJTlRfVSB8IElOVF9MKTsKKwl9CisKKwkvKiBzZXQgdmFyaWFibGVzIGFuZCBhdHRyaWJ1dGVzICovCisJaWYgKHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0pIHsKKwkJaW50IGksIHJ2ID0gMDsKKwkJc3RydWN0IHRibCAqZjsKKworCQlpZiAobG9jYWx2ICYmICFmdW5jKQorCQkJZnNldCB8PSBMT0NBTDsKKwkJZm9yIChpID0gYnVpbHRpbl9vcHQub3B0aW5kOyB3cFtpXTsgaSsrKSB7CisJCQlpZiAoZnVuYykgeworCQkJCWYgPSBmaW5kZnVuYyh3cFtpXSwgaGFzaCh3cFtpXSksCisJCQkJICAgIChmc2V0JlVDQVNFVl9BTCkgPyB0cnVlIDogZmFsc2UpOworCQkJCWlmICghZikgeworCQkJCQkvKiBBVCZUIGtzaCBkb2VzICsrcnY6IGJvZ3VzICovCisJCQkJCXJ2ID0gMTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChmc2V0IHwgZmNscikgeworCQkJCQlmLT5mbGFnIHw9IGZzZXQ7CisJCQkJCWYtPmZsYWcgJj0gfmZjbHI7CisJCQkJfSBlbHNlCisJCQkJCWZwdHJlZWYoc2hsX3N0ZG91dCwgMCwKKwkJCQkJICAgIGYtPmZsYWcgJiBGS1NIID8KKwkJCQkJICAgICJmdW5jdGlvbiAlcyAlVFxuIiA6CisJCQkJCSAgICAiJXMoKSAlVFxuIiwgd3BbaV0sIGYtPnZhbC50KTsKKwkJCX0gZWxzZSBpZiAoIXR5cGVzZXQod3BbaV0sIGZzZXQsIGZjbHIsIGZpZWxkLCBiYXNlKSkgeworCQkJCWJpX2Vycm9yZigiJXM6IG5vdCBpZGVudGlmaWVyIiwgd3BbaV0pOworCQkJCXNldF9yZWZmbGFnID0gMDsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQl9CisJCXNldF9yZWZmbGFnID0gMDsKKwkJcmV0dXJuIChydik7CisJfQorCisJLyogbGlzdCB2YXJpYWJsZXMgYW5kIGF0dHJpYnV0ZXMgKi8KKwlmbGFnID0gZnNldCB8IGZjbHI7IC8qIG5vIGRpZmZlcmVuY2UgYXQgdGhpcyBwb2ludC4uICovCisJaWYgKGZ1bmMpIHsKKwkJZm9yIChsID0gZS0+bG9jOyBsOyBsID0gbC0+bmV4dCkgeworCQkJZm9yIChwID0ga3Rzb3J0KCZsLT5mdW5zKTsgKHZwID0gKnArKyk7ICkgeworCQkJCWlmIChmbGFnICYmICh2cC0+ZmxhZyAmIGZsYWcpID09IDApCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICh0aGluZyA9PSAnLScpCisJCQkJCWZwdHJlZWYoc2hsX3N0ZG91dCwgMCwgdnAtPmZsYWcgJiBGS1NIID8KKwkJCQkJICAgICJmdW5jdGlvbiAlcyAlVFxuIiA6ICIlcygpICVUXG4iLAorCQkJCQkgICAgdnAtPm5hbWUsIHZwLT52YWwudCk7CisJCQkJZWxzZQorCQkJCQlzaHByaW50ZigiJXNcbiIsIHZwLT5uYW1lKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZvciAobCA9IGUtPmxvYzsgbDsgbCA9IGwtPm5leHQpIHsKKwkJCWZvciAocCA9IGt0c29ydCgmbC0+dmFycyk7ICh2cCA9ICpwKyspOyApIHsKKwkJCQlzdHJ1Y3QgdGJsICp0dnA7CisJCQkJYm9vbCBhbnlfc2V0ID0gZmFsc2U7CisJCQkJLyoKKwkJCQkgKiBTZWUgaWYgdGhlIHBhcmFtZXRlciBpcyBzZXQgKGZvciBhcnJheXMsIGlmIGFueQorCQkJCSAqIGVsZW1lbnQgaXMgc2V0KS4KKwkJCQkgKi8KKwkJCQlmb3IgKHR2cCA9IHZwOyB0dnA7IHR2cCA9IHR2cC0+dS5hcnJheSkKKwkJCQkJaWYgKHR2cC0+ZmxhZyAmIElTU0VUKSB7CisJCQkJCQlhbnlfc2V0ID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkvKgorCQkJCSAqIENoZWNrIGF0dHJpYnV0ZXMgLSBub3RlIHRoYXQgYWxsIGFycmF5IGVsZW1lbnRzCisJCQkJICogaGF2ZSAoc2hvdWxkIGhhdmU/KSB0aGUgc2FtZSBhdHRyaWJ1dGVzLCBzbyBjaGVja2luZworCQkJCSAqIHRoZSBmaXJzdCBpcyBzdWZmaWNpZW50LgorCQkJCSAqCisJCQkJICogUmVwb3J0IGFuIHVuc2V0IHBhcmFtIG9ubHkgaWYgdGhlIHVzZXIgaGFzCisJCQkJICogZXhwbGljaXRseSBnaXZlbiBpdCBzb21lIGF0dHJpYnV0ZSAobGlrZSBleHBvcnQpOworCQkJCSAqIG90aGVyd2lzZSwgYWZ0ZXIgImVjaG8gJEZPTyIsIHdlIHdvdWxkIHJlcG9ydCBGT08uLi4KKwkJCQkgKi8KKwkJCQlpZiAoIWFueV9zZXQgJiYgISh2cC0+ZmxhZyAmIFVTRVJBVFRSSUIpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoZmxhZyAmJiAodnAtPmZsYWcgJiBmbGFnKSA9PSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlmb3IgKDsgdnA7IHZwID0gdnAtPnUuYXJyYXkpIHsKKwkJCQkJLyogSWdub3JlIGFycmF5IGVsZW1lbnRzIHRoYXQgYXJlbid0CisJCQkJCSAqIHNldCB1bmxlc3MgdGhlcmUgYXJlIG5vIHNldCBlbGVtZW50cywKKwkJCQkJICogaW4gd2hpY2ggY2FzZSB0aGUgZmlyc3QgaXMgcmVwb3J0ZWQgb24gKi8KKwkJCQkJaWYgKCh2cC0+ZmxhZyZBUlJBWSkgJiYgYW55X3NldCAmJgorCQkJCQkgICAgISh2cC0+ZmxhZyAmIElTU0VUKSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQkvKiBubyBhcmd1bWVudHMgKi8KKwkJCQkJaWYgKHRoaW5nID09IDAgJiYgZmxhZyA9PSAwKSB7CisJCQkJCQkvKiBBVCZUIGtzaCBwcmludHMgdGhpbmdzCisJCQkJCQkgKiBsaWtlIGV4cG9ydCwgaW50ZWdlciwKKwkJCQkJCSAqIGxlZnRhZGosIHplcm9maWxsLCBldGMuLAorCQkJCQkJICogYnV0IFBPU0lYIHNheXMgbXVzdAorCQkJCQkJICogYmUgc3VpdGFibGUgZm9yIHJlLWVudHJ5Li4uCisJCQkJCQkgKi8KKwkJCQkJCXNoZl9wdXRzKCJ0eXBlc2V0ICIsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKCgodnAtPmZsYWcmKEFSUkFZfEFTU09DKSk9PUFTU09DKSkKKwkJCQkJCQlzaGZfcHV0cygiLW4gIiwgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAoKHZwLT5mbGFnJklOVEVHRVIpKQorCQkJCQkJCXNoZl9wdXRzKCItaSAiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICgodnAtPmZsYWcmRVhQT1JUKSkKKwkJCQkJCQlzaGZfcHV0cygiLXggIiwgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAoKHZwLT5mbGFnJlJET05MWSkpCisJCQkJCQkJc2hmX3B1dHMoIi1yICIsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKCh2cC0+ZmxhZyZUUkFDRSkpCisJCQkJCQkJc2hmX3B1dHMoIi10ICIsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKCh2cC0+ZmxhZyZMSlVTVCkpCisJCQkJCQkJc2hwcmludGYoIi1MJWQgIiwgdnAtPnUyLmZpZWxkKTsKKwkJCQkJCWlmICgodnAtPmZsYWcmUkpVU1QpKQorCQkJCQkJCXNocHJpbnRmKCItUiVkICIsIHZwLT51Mi5maWVsZCk7CisJCQkJCQlpZiAoKHZwLT5mbGFnJlpFUk9GSUwpKQorCQkJCQkJCXNoZl9wdXRzKCItWiAiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICgodnAtPmZsYWcmTENBU0VWKSkKKwkJCQkJCQlzaGZfcHV0cygiLWwgIiwgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAoKHZwLT5mbGFnJlVDQVNFVl9BTCkpCisJCQkJCQkJc2hmX3B1dHMoIi11ICIsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKCh2cC0+ZmxhZyZJTlRfVSkpCisJCQkJCQkJc2hmX3B1dHMoIi1VICIsIHNobF9zdGRvdXQpOworCQkJCQkJc2hmX3B1dHModnAtPm5hbWUsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKHBmbGFnKSB7CisJCQkJCQkJY2hhciAqcyA9IHN0cl92YWwodnApOworCisJCQkJCQkJc2hmX3B1dGMoJz0nLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCQkvKiBBVCZUIGtzaCBjYW4ndCBoYXZlCisJCQkJCQkJICoganVzdGlmaWVkIGludGVnZXJzLi4gKi8KKwkJCQkJCQlpZiAoKHZwLT5mbGFnICYKKwkJCQkJCQkgICAgKElOVEVHRVJ8TEpVU1R8UkpVU1QpKSA9PQorCQkJCQkJCSAgICBJTlRFR0VSKQorCQkJCQkJCQlzaGZfcHV0cyhzLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXByaW50X3ZhbHVlX3F1b3RlZChzKTsKKwkJCQkJCX0KKwkJCQkJCXNoZl9wdXRjKCdcbicsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKHZwLT5mbGFnICYgQVJSQVkpCisJCQkJCQkJYnJlYWs7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAocGZsYWcpCisJCQkJCQkJc2hmX3B1dHMoaXN0c2V0ID8KKwkJCQkJCQkgICAgInR5cGVzZXQgIiA6CisJCQkJCQkJICAgIChmbGFnICYgRVhQT1JUKSA/CisJCQkJCQkJICAgICJleHBvcnQgIiA6CisJCQkJCQkJICAgICJyZWFkb25seSAiLAorCQkJCQkJCSAgICBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICgodnAtPmZsYWcmQVJSQVkpICYmIGFueV9zZXQpCisJCQkJCQkJc2hwcmludGYoIiVzWyVsdV0iLAorCQkJCQkJCSAgICB2cC0+bmFtZSwKKwkJCQkJCQkgICAgYXJyYXlpbmRleCh2cCkpOworCQkJCQkJZWxzZQorCQkJCQkJCXNoZl9wdXRzKHZwLT5uYW1lLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICh0aGluZyA9PSAnLScgJiYgKHZwLT5mbGFnJklTU0VUKSkgeworCQkJCQkJCWNoYXIgKnMgPSBzdHJfdmFsKHZwKTsKKworCQkJCQkJCXNoZl9wdXRjKCc9Jywgc2hsX3N0ZG91dCk7CisJCQkJCQkJLyogQVQmVCBrc2ggY2FuJ3QgaGF2ZQorCQkJCQkJCSAqIGp1c3RpZmllZCBpbnRlZ2Vycy4uICovCisJCQkJCQkJaWYgKCh2cC0+ZmxhZyAmCisJCQkJCQkJICAgIChJTlRFR0VSfExKVVNUfFJKVVNUKSkgPT0KKwkJCQkJCQkgICAgSU5URUdFUikKKwkJCQkJCQkJc2hmX3B1dHMocywgc2hsX3N0ZG91dCk7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwcmludF92YWx1ZV9xdW90ZWQocyk7CisJCQkJCQl9CisJCQkJCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKKwkJCQkJfQorCQkJCQkvKiBPbmx5IHJlcG9ydCBmaXJzdCAnZWxlbWVudCcgb2YgYW4gYXJyYXkgd2l0aAorCQkJCQkgKiBubyBzZXQgZWxlbWVudHMuCisJCQkJCSAqLworCQkJCQlpZiAoIWFueV9zZXQpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuICgwKTsKK30KKworaW50CitjX2FsaWFzKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlzdHJ1Y3QgdGFibGUgKnQgPSAmYWxpYXNlczsKKwlpbnQgcnYgPSAwLCBwcmVmaXggPSAwOworCWJvb2wgcmZsYWcgPSBmYWxzZSwgdGZsYWcsIFVmbGFnID0gZmFsc2UsIHBmbGFnID0gZmFsc2U7CisJVGZsYWcgeGZsYWcgPSAwOworCWludCBvcHRjOworCisJYnVpbHRpbl9vcHQuZmxhZ3MgfD0gR0ZfUExVU09QVDsKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJkcHJ0VXgiKSkgIT0gLTEpIHsKKwkJcHJlZml4ID0gYnVpbHRpbl9vcHQuaW5mbyAmIEdJX1BMVVMgPyAnKycgOiAnLSc7CisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdkJzoKKyNpZmRlZiBNS1NIX05PUFdOQU0KKwkJCXQgPSBOVUxMOwkvKiBmaXggImFsaWFzIC1kdCIgKi8KKyNlbHNlCisJCQl0ID0gJmhvbWVkaXJzOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQl0ID0gJnRhbGlhc2VzOworCQkJYnJlYWs7CisJCWNhc2UgJ1UnOgorCQkJLyoKKwkJCSAqIGtsdWRnZSBmb3IgdHJhY2tlZCBhbGlhcyBpbml0aWFsaXphdGlvbgorCQkJICogKGRvbid0IGRvIGEgcGF0aCBzZWFyY2gsIGp1c3QgbWFrZSBhbiBlbnRyeSkKKwkJCSAqLworCQkJVWZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkJeGZsYWcgPSBFWFBPUlQ7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorI2lmZGVmIE1LU0hfTk9QV05BTQorCWlmICh0ID09IE5VTEwpCisJCXJldHVybiAoMCk7CisjZW5kaWYKKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisKKwlpZiAoIShidWlsdGluX29wdC5pbmZvICYgR0lfTUlOVVNNSU5VUykgJiYgKndwICYmCisJICAgICh3cFswXVswXSA9PSAnLScgfHwgd3BbMF1bMF0gPT0gJysnKSAmJiB3cFswXVsxXSA9PSAnXDAnKSB7CisJCXByZWZpeCA9IHdwWzBdWzBdOworCQl3cCsrOworCX0KKworCXRmbGFnID0gdCA9PSAmdGFsaWFzZXM7CisKKwkvKiAiaGFzaCAtciIgbWVhbnMgcmVzZXQgYWxsIHRoZSB0cmFja2VkIGFsaWFzZXMuLiAqLworCWlmIChyZmxhZykgeworCQlzdGF0aWMgY29uc3QgY2hhciAqYXJnc1tdID0geworCQkJInVuYWxpYXMiLCAiLXRhIiwgTlVMTAorCQl9OworCisJCWlmICghdGZsYWcgfHwgKndwKSB7CisJCQlzaGZfcHV0cygiYWxpYXM6IC1yIGZsYWcgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIC10IgorCQkJICAgICIgYW5kIHdpdGhvdXQgYXJndW1lbnRzXG4iLCBzaGxfc3Rkb3V0KTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJa3NoX2dldG9wdF9yZXNldCgmYnVpbHRpbl9vcHQsIEdGX0VSUk9SKTsKKwkJcmV0dXJuIChjX3VuYWxpYXMoYXJncykpOworCX0KKworCWlmICgqd3AgPT0gTlVMTCkgeworCQlzdHJ1Y3QgdGJsICphcCwgKipwOworCisJCWZvciAocCA9IGt0c29ydCh0KTsgKGFwID0gKnArKykgIT0gTlVMTDsgKQorCQkJaWYgKChhcC0+ZmxhZyAmIChJU1NFVHx4ZmxhZykpID09IChJU1NFVHx4ZmxhZykpIHsKKwkJCQlpZiAocGZsYWcpCisJCQkJCXNoZl9wdXRzKCJhbGlhcyAiLCBzaGxfc3Rkb3V0KTsKKwkJCQlzaGZfcHV0cyhhcC0+bmFtZSwgc2hsX3N0ZG91dCk7CisJCQkJaWYgKHByZWZpeCAhPSAnKycpIHsKKwkJCQkJc2hmX3B1dGMoJz0nLCBzaGxfc3Rkb3V0KTsKKwkJCQkJcHJpbnRfdmFsdWVfcXVvdGVkKGFwLT52YWwucyk7CisJCQkJfQorCQkJCXNoZl9wdXRjKCdcbicsIHNobF9zdGRvdXQpOworCQkJfQorCX0KKworCWZvciAoOyAqd3AgIT0gTlVMTDsgd3ArKykgeworCQljb25zdCBjaGFyICphbGlhcyA9ICp3cCwgKnZhbCwgKm5ld3ZhbDsKKwkJY2hhciAqeGFsaWFzID0gTlVMTDsKKwkJc3RydWN0IHRibCAqYXA7CisJCXVpbnQzMl90IGg7CisKKwkJaWYgKCh2YWwgPSBjc3RyY2hyKGFsaWFzLCAnPScpKSkgeworCQkJc3RybmR1cHgoeGFsaWFzLCBhbGlhcywgdmFsKysgLSBhbGlhcywgQVRFTVApOworCQkJYWxpYXMgPSB4YWxpYXM7CisJCX0KKwkJaCA9IGhhc2goYWxpYXMpOworCQlpZiAodmFsID09IE5VTEwgJiYgIXRmbGFnICYmICF4ZmxhZykgeworCQkJYXAgPSBrdHNlYXJjaCh0LCBhbGlhcywgaCk7CisJCQlpZiAoYXAgIT0gTlVMTCAmJiAoYXAtPmZsYWcmSVNTRVQpKSB7CisJCQkJaWYgKHBmbGFnKQorCQkJCQlzaGZfcHV0cygiYWxpYXMgIiwgc2hsX3N0ZG91dCk7CisJCQkJc2hmX3B1dHMoYXAtPm5hbWUsIHNobF9zdGRvdXQpOworCQkJCWlmIChwcmVmaXggIT0gJysnKSB7CisJCQkJCXNoZl9wdXRjKCc9Jywgc2hsX3N0ZG91dCk7CisJCQkJCXByaW50X3ZhbHVlX3F1b3RlZChhcC0+dmFsLnMpOworCQkJCX0KKwkJCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKKwkJCX0gZWxzZSB7CisJCQkJc2hwcmludGYoIiVzIGFsaWFzIG5vdCBmb3VuZFxuIiwgYWxpYXMpOworCQkJCXJ2ID0gMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWFwID0ga3RlbnRlcih0LCBhbGlhcywgaCk7CisJCWFwLT50eXBlID0gdGZsYWcgPyBDVEFMSUFTIDogQ0FMSUFTOworCQkvKiBBcmUgd2Ugc2V0dGluZyB0aGUgdmFsdWUgb3IganVzdCBzb21lIGZsYWdzPyAqLworCQlpZiAoKHZhbCAmJiAhdGZsYWcpIHx8ICghdmFsICYmIHRmbGFnICYmICFVZmxhZykpIHsKKwkJCWlmIChhcC0+ZmxhZyZBTExPQykgeworCQkJCWFwLT5mbGFnICY9IH4oQUxMT0N8SVNTRVQpOworCQkJCWFmcmVlKGFwLT52YWwucywgQVBFUk0pOworCQkJfQorCQkJLyogaWdub3JlIHZhbHVlcyBmb3IgLXQgKEFUJlQga3NoIGRvZXMgdGhpcykgKi8KKwkJCW5ld3ZhbCA9IHRmbGFnID8gc2VhcmNoKGFsaWFzLCBwYXRoLCBYX09LLCBOVUxMKSA6IHZhbDsKKwkJCWlmIChuZXd2YWwpIHsKKwkJCQlzdHJkdXB4KGFwLT52YWwucywgbmV3dmFsLCBBUEVSTSk7CisJCQkJYXAtPmZsYWcgfD0gQUxMT0N8SVNTRVQ7CisJCQl9IGVsc2UKKwkJCQlhcC0+ZmxhZyAmPSB+SVNTRVQ7CisJCX0KKwkJYXAtPmZsYWcgfD0gREVGSU5FRDsKKwkJaWYgKHByZWZpeCA9PSAnKycpCisJCQlhcC0+ZmxhZyAmPSB+eGZsYWc7CisJCWVsc2UKKwkJCWFwLT5mbGFnIHw9IHhmbGFnOworCQlhZnJlZSh4YWxpYXMsIEFURU1QKTsKKwl9CisKKwlyZXR1cm4gKHJ2KTsKK30KKworaW50CitjX3VuYWxpYXMoY29uc3QgY2hhciAqKndwKQoreworCXN0cnVjdCB0YWJsZSAqdCA9ICZhbGlhc2VzOworCXN0cnVjdCB0YmwgKmFwOworCWludCBvcHRjLCBydiA9IDA7CisJYm9vbCBhbGwgPSBmYWxzZTsKKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgImFkdCIpKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ2EnOgorCQkJYWxsID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKyNpZmRlZiBNS1NIX05PUFdOQU0KKwkJCXQgPSBOVUxMOwkvKiBmaXggInVuYWxpYXMgLWR0IiAqLworI2Vsc2UKKwkJCXQgPSAmaG9tZWRpcnM7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXQgPSAmdGFsaWFzZXM7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisjaWZkZWYgTUtTSF9OT1BXTkFNCisJaWYgKHQgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKyNlbmRpZgorCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKworCWZvciAoOyAqd3AgIT0gTlVMTDsgd3ArKykgeworCQlhcCA9IGt0c2VhcmNoKHQsICp3cCwgaGFzaCgqd3ApKTsKKwkJaWYgKGFwID09IE5VTEwpIHsKKwkJCXJ2ID0gMTsJLyogUE9TSVggKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChhcC0+ZmxhZyZBTExPQykgeworCQkJYXAtPmZsYWcgJj0gfihBTExPQ3xJU1NFVCk7CisJCQlhZnJlZShhcC0+dmFsLnMsIEFQRVJNKTsKKwkJfQorCQlhcC0+ZmxhZyAmPSB+KERFRklORUR8SVNTRVR8RVhQT1JUKTsKKwl9CisKKwlpZiAoYWxsKSB7CisJCXN0cnVjdCB0c3RhdGUgdHM7CisKKwkJZm9yIChrdHdhbGsoJnRzLCB0KTsgKGFwID0ga3RuZXh0KCZ0cykpOyApIHsKKwkJCWlmIChhcC0+ZmxhZyZBTExPQykgeworCQkJCWFwLT5mbGFnICY9IH4oQUxMT0N8SVNTRVQpOworCQkJCWFmcmVlKGFwLT52YWwucywgQVBFUk0pOworCQkJfQorCQkJYXAtPmZsYWcgJj0gfihERUZJTkVEfElTU0VUfEVYUE9SVCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKHJ2KTsKK30KKworaW50CitjX2xldChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IHJ2ID0gMTsKKwlta3NoX2FyaV90IHZhbDsKKworCWlmICh3cFsxXSA9PSBOVUxMKSAvKiBBVCZUIGtzaCBkb2VzIHRoaXMgKi8KKwkJYmlfZXJyb3JmKCJubyBhcmd1bWVudHMiKTsKKwllbHNlCisJCWZvciAod3ArKzsgKndwOyB3cCsrKQorCQkJaWYgKCFldmFsdWF0ZSgqd3AsICZ2YWwsIEtTSF9SRVRVUk5fRVJST1IsIHRydWUpKSB7CisJCQkJcnYgPSAyOwkvKiBkaXN0aW5ndWlzaCBlcnJvciBmcm9tIHplcm8gcmVzdWx0ICovCisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlydiA9IHZhbCA9PSAwOworCXJldHVybiAocnYpOworfQorCitpbnQKK2Nfam9icyhjb25zdCBjaGFyICoqd3ApCit7CisJaW50IG9wdGMsIGZsYWcgPSAwLCBuZmxhZyA9IDAsIHJ2ID0gMDsKKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgImxwbnoiKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdsJzoKKwkJCWZsYWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJZmxhZyA9IDI7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQluZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAneic6CS8qIGRlYnVnZ2luZzogcHJpbnQgem9tYmllcyAqLworCQkJbmZsYWcgPSAtMTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisJaWYgKCEqd3ApIHsKKwkJaWYgKGpfam9icyhOVUxMLCBmbGFnLCBuZmxhZykpCisJCQlydiA9IDE7CisJfSBlbHNlIHsKKwkJZm9yICg7ICp3cDsgd3ArKykKKwkJCWlmIChqX2pvYnMoKndwLCBmbGFnLCBuZmxhZykpCisJCQkJcnYgPSAxOworCX0KKwlyZXR1cm4gKHJ2KTsKK30KKworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKK2ludAorY19mZ2JnKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlib29sIGJnID0gc3RyY21wKCp3cCwgImJnIikgPT0gMDsKKwlpbnQgcnYgPSAwOworCisJaWYgKCFGbGFnKEZNT05JVE9SKSkgeworCQliaV9lcnJvcmYoImpvYiBjb250cm9sIG5vdCBlbmFibGVkIik7CisJCXJldHVybiAoMSk7CisJfQorCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKKwkJcmV0dXJuICgxKTsKKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisJaWYgKCp3cCkKKwkJZm9yICg7ICp3cDsgd3ArKykKKwkJCXJ2ID0gal9yZXN1bWUoKndwLCBiZyk7CisJZWxzZQorCQlydiA9IGpfcmVzdW1lKCIlJSIsIGJnKTsKKwlyZXR1cm4gKGJnID8gMCA6IHJ2KTsKK30KKyNlbmRpZgorCisvKiBmb3JtYXQgYSBzaW5nbGUga2lsbCBpdGVtICovCitzdGF0aWMgY2hhciAqCitraWxsX2ZtdF9lbnRyeShjaGFyICpidWYsIGludCBidWZsZW4sIGludCBpLCBjb25zdCB2b2lkICphcmcpCit7CisJY29uc3Qgc3RydWN0IGtpbGxfaW5mbyAqa2kgPSAoY29uc3Qgc3RydWN0IGtpbGxfaW5mbyAqKWFyZzsKKworCWkrKzsKKwlzaGZfc25wcmludGYoYnVmLCBidWZsZW4sICIlKmQgJSpzICVzIiwKKwkgICAga2ktPm51bV93aWR0aCwgaSwKKwkgICAga2ktPm5hbWVfd2lkdGgsIHNpZ3RyYXBzW2ldLm5hbWUsCisJICAgIHNpZ3RyYXBzW2ldLm1lc3MpOworCXJldHVybiAoYnVmKTsKK30KKworaW50CitjX2tpbGwoY29uc3QgY2hhciAqKndwKQoreworCVRyYXAgKnQgPSBOVUxMOworCWNvbnN0IGNoYXIgKnA7CisJYm9vbCBsZmxhZyA9IGZhbHNlOworCWludCBpLCBuLCBydiwgc2lnOworCisJLyogYXNzdW1lIG9sZCBzdHlsZSBvcHRpb25zIGlmIC1kaWdpdHMgb3IgLVVQUEVSQ0FTRSAqLworCWlmICgocCA9IHdwWzFdKSAmJiAqcCA9PSAnLScgJiYgKGtzaF9pc2RpZ2l0KHBbMV0pIHx8CisJICAgIGtzaF9pc3VwcGVyKHBbMV0pKSkgeworCQlpZiAoISh0ID0gZ2V0dHJhcChwICsgMSwgdHJ1ZSkpKSB7CisJCQliaV9lcnJvcmYoImJhZCBzaWduYWwgJyVzJyIsIHAgKyAxKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJaSA9ICh3cFsyXSAmJiBzdHJjbXAod3BbMl0sICItLSIpID09IDApID8gMyA6IDI7CisJfSBlbHNlIHsKKwkJaW50IG9wdGM7CisKKwkJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAibHM6IikpICE9IC0xKQorCQkJc3dpdGNoIChvcHRjKSB7CisJCQljYXNlICdsJzoKKwkJCQlsZmxhZyA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICdzJzoKKwkJCQlpZiAoISh0ID0gZ2V0dHJhcChidWlsdGluX29wdC5vcHRhcmcsIHRydWUpKSkgeworCQkJCQliaV9lcnJvcmYoImJhZCBzaWduYWwgJyVzJyIsCisJCQkJCSAgICBidWlsdGluX29wdC5vcHRhcmcpOworCQkJCQlyZXR1cm4gKDEpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJz8nOgorCQkJCXJldHVybiAoMSk7CisJCQl9CisJCWkgPSBidWlsdGluX29wdC5vcHRpbmQ7CisJfQorCWlmICgobGZsYWcgJiYgdCkgfHwgKCF3cFtpXSAmJiAhbGZsYWcpKSB7CisjaWZuZGVmIE1LU0hfU01BTEwKKwkJc2hmX3B1dHMoInVzYWdlOlx0a2lsbCBbLXMgc2lnbmFtZSB8IC1zaWdudW0gfCAtc2lnbmFtZV0iCisJCSAgICAiIHsgam9iIHwgcGlkIHwgcGdycCB9IC4uLlxuIgorCQkgICAgIlx0a2lsbCAtbCBbZXhpdF9zdGF0dXMgLi4uXVxuIiwgc2hsX291dCk7CisjZW5kaWYKKwkJYmlfZXJyb3JmeigpOworCQlyZXR1cm4gKDEpOworCX0KKworCWlmIChsZmxhZykgeworCQlpZiAod3BbaV0pIHsKKwkJCWZvciAoOyB3cFtpXTsgaSsrKSB7CisJCQkJaWYgKCFiaV9nZXRuKHdwW2ldLCAmbikpCisJCQkJCXJldHVybiAoMSk7CisJCQkJaWYgKG4gPiAxMjggJiYgbiA8IDEyOCArIE5TSUcpCisJCQkJCW4gLT0gMTI4OworCQkJCWlmIChuID4gMCAmJiBuIDwgTlNJRykKKwkJCQkJc2hwcmludGYoIiVzXG4iLCBzaWd0cmFwc1tuXS5uYW1lKTsKKwkJCQllbHNlCisJCQkJCXNocHJpbnRmKCIlZFxuIiwgbik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpbnQgdywgaiwgbWVzc19jb2xzLCBtZXNzX29jdHM7CisJCQlzdHJ1Y3Qga2lsbF9pbmZvIGtpOworCisJCQlmb3IgKGogPSBOU0lHLCBraS5udW1fd2lkdGggPSAxOyBqID49IDEwOyBqIC89IDEwKQorCQkJCWtpLm51bV93aWR0aCsrOworCQkJa2kubmFtZV93aWR0aCA9IG1lc3NfY29scyA9IG1lc3Nfb2N0cyA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgTlNJRzsgaisrKSB7CisJCQkJdyA9IHN0cmxlbihzaWd0cmFwc1tqXS5uYW1lKTsKKwkJCQlpZiAodyA+IGtpLm5hbWVfd2lkdGgpCisJCQkJCWtpLm5hbWVfd2lkdGggPSB3OworCQkJCXcgPSBzdHJsZW4oc2lndHJhcHNbal0ubWVzcyk7CisJCQkJaWYgKHcgPiBtZXNzX29jdHMpCisJCQkJCW1lc3Nfb2N0cyA9IHc7CisJCQkJdyA9IHV0Zl9tYnN3aWR0aChzaWd0cmFwc1tqXS5tZXNzKTsKKwkJCQlpZiAodyA+IG1lc3NfY29scykKKwkJCQkJbWVzc19jb2xzID0gdzsKKwkJCX0KKworCQkJcHJpbnRfY29sdW1ucyhzaGxfc3Rkb3V0LCBOU0lHIC0gMSwKKwkJCSAgICBraWxsX2ZtdF9lbnRyeSwgKHZvaWQgKikma2ksCisJCQkgICAga2kubnVtX3dpZHRoICsgMSArIGtpLm5hbWVfd2lkdGggKyAxICsgbWVzc19vY3RzLAorCQkJICAgIGtpLm51bV93aWR0aCArIDEgKyBraS5uYW1lX3dpZHRoICsgMSArIG1lc3NfY29scywKKwkJCSAgICB0cnVlKTsKKwkJfQorCQlyZXR1cm4gKDApOworCX0KKwlydiA9IDA7CisJc2lnID0gdCA/IHQtPnNpZ25hbCA6IFNJR1RFUk07CisJZm9yICg7IChwID0gd3BbaV0pOyBpKyspIHsKKwkJaWYgKCpwID09ICclJykgeworCQkJaWYgKGpfa2lsbChwLCBzaWcpKQorCQkJCXJ2ID0gMTsKKwkJfSBlbHNlIGlmICghZ2V0bihwLCAmbikpIHsKKwkJCWJpX2Vycm9yZigiJXM6IGFyZ3VtZW50cyBtdXN0IGJlIGpvYnMgb3IgcHJvY2VzcyBJRHMiLAorCQkJICAgIHApOworCQkJcnYgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKG1rc2hfa2lsbChuLCBzaWcpIDwgMCkgeworCQkJCWJpX2Vycm9yZigiJXM6ICVzIiwgcCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlydiA9IDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIChydik7Cit9CisKK3ZvaWQKK2dldG9wdHNfcmVzZXQoaW50IHZhbCkKK3sKKwlpZiAodmFsID49IDEpIHsKKwkJa3NoX2dldG9wdF9yZXNldCgmdXNlcl9vcHQsIEdGX05PTkFNRSB8IEdGX1BMVVNPUFQpOworCQl1c2VyX29wdC5vcHRpbmQgPSB1c2VyX29wdC51b3B0aW5kID0gdmFsOworCX0KK30KKworaW50CitjX2dldG9wdHMoY29uc3QgY2hhciAqKndwKQoreworCWludCBhcmdjLCBvcHRjLCBydjsKKwljb25zdCBjaGFyICpvcHRzLCAqdmFyOworCWNoYXIgYnVmWzNdOworCXN0cnVjdCB0YmwgKnZxLCAqdm9wdGFyZzsKKworCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKKwkJcmV0dXJuICgxKTsKKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisKKwlvcHRzID0gKndwKys7CisJaWYgKCFvcHRzKSB7CisJCWJpX2Vycm9yZigibWlzc2luZyBvcHRpb25zIGFyZ3VtZW50Iik7CisJCXJldHVybiAoMSk7CisJfQorCisJdmFyID0gKndwKys7CisJaWYgKCF2YXIpIHsKKwkJYmlfZXJyb3JmKCJtaXNzaW5nIG5hbWUgYXJndW1lbnQiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJaWYgKCEqdmFyIHx8ICpza2lwX3Zhcm5hbWUodmFyLCB0cnVlKSkgeworCQliaV9lcnJvcmYoIiVzOiBpcyBub3QgYW4gaWRlbnRpZmllciIsIHZhcik7CisJCXJldHVybiAoMSk7CisJfQorCisJaWYgKGUtPmxvYy0+bmV4dCA9PSBOVUxMKSB7CisJCWludGVybmFsX3dhcm5pbmdmKCJjX2dldG9wdHM6IG5vIGFyZ3YiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJLyogV2hpY2ggYXJndW1lbnRzIGFyZSB3ZSBwYXJzaW5nLi4uICovCisJaWYgKCp3cCA9PSBOVUxMKQorCQl3cCA9IGUtPmxvYy0+bmV4dC0+YXJndjsKKwllbHNlCisJCSotLXdwID0gZS0+bG9jLT5uZXh0LT5hcmd2WzBdOworCisJLyogQ2hlY2sgdGhhdCBvdXIgc2F2ZWQgc3RhdGUgd29uJ3QgY2F1c2UgYSBjb3JlIGR1bXAuLi4gKi8KKwlmb3IgKGFyZ2MgPSAwOyB3cFthcmdjXTsgYXJnYysrKQorCQk7CisJaWYgKHVzZXJfb3B0Lm9wdGluZCA+IGFyZ2MgfHwKKwkgICAgKHVzZXJfb3B0LnAgIT0gMCAmJgorCSAgICB1c2VyX29wdC5wID4gc3RybGVuKHdwW3VzZXJfb3B0Lm9wdGluZCAtIDFdKSkpIHsKKwkJYmlfZXJyb3JmKCJhcmd1bWVudHMgY2hhbmdlZCBzaW5jZSBsYXN0IGNhbGwiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwl1c2VyX29wdC5vcHRhcmcgPSBOVUxMOworCW9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmdXNlcl9vcHQsIG9wdHMpOworCisJaWYgKG9wdGMgPj0gMCAmJiBvcHRjICE9ICc/JyAmJiAodXNlcl9vcHQuaW5mbyAmIEdJX1BMVVMpKSB7CisJCWJ1ZlswXSA9ICcrJzsKKwkJYnVmWzFdID0gb3B0YzsKKwkJYnVmWzJdID0gJ1wwJzsKKwl9IGVsc2UgeworCQkvKiBQT1NJWCBzYXlzIHZhciBpcyBzZXQgdG8gPyBhdCBlbmQtb2Ytb3B0aW9ucywgQVQmVCBrc2gKKwkJICogc2V0cyBpdCB0byBudWxsIC0gd2UgZ28gd2l0aCBQT1NJWC4uLgorCQkgKi8KKwkJYnVmWzBdID0gb3B0YyA8IDAgPyAnPycgOiBvcHRjOworCQlidWZbMV0gPSAnXDAnOworCX0KKworCS8qIEFUJlQga3NoOTMgaW4gZmFjdCBkb2VzIGNoYW5nZSBPUFRJTkQgZm9yIHVua25vd24gb3B0aW9ucyB0b28gKi8KKwl1c2VyX29wdC51b3B0aW5kID0gdXNlcl9vcHQub3B0aW5kOworCisJdm9wdGFyZyA9IGdsb2JhbCgiT1BUQVJHIik7CisJdm9wdGFyZy0+ZmxhZyAmPSB+UkRPTkxZOwkvKiBBVCZUIGtzaCBjbGVhcnMgcm8gYW5kIGludCAqLworCS8qIFBhcmFub2lhOiBlbnN1cmUgbm8gYml6YXJyZSByZXN1bHRzLiAqLworCWlmICh2b3B0YXJnLT5mbGFnICYgSU5URUdFUikKKwkgICAgdHlwZXNldCgiT1BUQVJHIiwgMCwgSU5URUdFUiwgMCwgMCk7CisJaWYgKHVzZXJfb3B0Lm9wdGFyZyA9PSBOVUxMKQorCQl1bnNldCh2b3B0YXJnLCAxKTsKKwllbHNlCisJCS8qIFRoaXMgY2FuJ3QgZmFpbCAoaGF2ZSBjbGVhcmVkIHJlYWRvbmx5L2ludGVnZXIpICovCisJCXNldHN0cih2b3B0YXJnLCB1c2VyX29wdC5vcHRhcmcsIEtTSF9SRVRVUk5fRVJST1IpOworCisJcnYgPSAwOworCisJdnEgPSBnbG9iYWwodmFyKTsKKwkvKiBFcnJvciBtZXNzYWdlIGFscmVhZHkgcHJpbnRlZCAoaW50ZWdlciwgcmVhZG9ubHkpICovCisJaWYgKCFzZXRzdHIodnEsIGJ1ZiwgS1NIX1JFVFVSTl9FUlJPUikpCisJCXJ2ID0gMTsKKwlpZiAoRmxhZyhGRVhQT1JUKSkKKwkJdHlwZXNldCh2YXIsIEVYUE9SVCwgMCwgMCwgMCk7CisKKwlyZXR1cm4gKG9wdGMgPCAwID8gMSA6IHJ2KTsKK30KKworaW50CitjX2JpbmQoY29uc3QgY2hhciAqKndwKQoreworCWludCBvcHRjLCBydiA9IDA7CisjaWZuZGVmIE1LU0hfU01BTEwKKwlib29sIG1hY3JvID0gZmFsc2U7CisjZW5kaWYKKwlib29sIGxpc3QgPSBmYWxzZTsKKwljb25zdCBjaGFyICpjcDsKKwljaGFyICp1cDsKKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwKKyNpZm5kZWYgTUtTSF9TTUFMTAorCSAgICAibG0iCisjZWxzZQorCSAgICAibCIKKyNlbmRpZgorCSAgICApKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ2wnOgorCQkJbGlzdCA9IHRydWU7CisJCQlicmVhazsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQljYXNlICdtJzoKKwkJCW1hY3JvID0gdHJ1ZTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKworCWlmICgqd3AgPT0gTlVMTCkJLyogbGlzdCBhbGwgKi8KKwkJcnYgPSB4X2JpbmQoTlVMTCwgTlVMTCwKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQkgICAgZmFsc2UsCisjZW5kaWYKKwkJICAgIGxpc3QpOworCisJZm9yICg7ICp3cCAhPSBOVUxMOyB3cCsrKSB7CisJCWlmICgoY3AgPSBjc3RyY2hyKCp3cCwgJz0nKSkgPT0gTlVMTCkKKwkJCXVwID0gTlVMTDsKKwkJZWxzZSB7CisJCQlzdHJkdXB4KHVwLCAqd3AsIEFURU1QKTsKKwkJCXVwW2NwKysgLSAqd3BdID0gJ1wwJzsKKwkJfQorCQlpZiAoeF9iaW5kKHVwID8gdXAgOiAqd3AsIGNwLAorI2lmbmRlZiBNS1NIX1NNQUxMCisJCSAgICBtYWNybywKKyNlbmRpZgorCQkgICAgZmFsc2UpKQorCQkJcnYgPSAxOworCQlhZnJlZSh1cCwgQVRFTVApOworCX0KKworCXJldHVybiAocnYpOworfQorCisvKiA6LCBmYWxzZSBhbmQgdHJ1ZSAoYW5kIHVsaW1pdCBpZiBNS1NIX05PX0xJTUlUUykgKi8KK2ludAorY19sYWJlbChjb25zdCBjaGFyICoqd3ApCit7CisJcmV0dXJuICh3cFswXVswXSA9PSAnZicgPyAxIDogMCk7Cit9CisKK2ludAorY19zaGlmdChjb25zdCBjaGFyICoqd3ApCit7CisJc3RydWN0IGJsb2NrICpsID0gZS0+bG9jOworCWludCBuOworCW1rc2hfYXJpX3QgdmFsOworCWNvbnN0IGNoYXIgKmFyZzsKKworCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKKwkJcmV0dXJuICgxKTsKKwlhcmcgPSB3cFtidWlsdGluX29wdC5vcHRpbmRdOworCisJaWYgKGFyZykgeworCQlldmFsdWF0ZShhcmcsICZ2YWwsIEtTSF9VTldJTkRfRVJST1IsIGZhbHNlKTsKKwkJbiA9IHZhbDsKKwl9IGVsc2UKKwkJbiA9IDE7CisJaWYgKG4gPCAwKSB7CisJCWJpX2Vycm9yZigiJXM6IGJhZCBudW1iZXIiLCBhcmcpOworCQlyZXR1cm4gKDEpOworCX0KKwlpZiAobC0+YXJnYyA8IG4pIHsKKwkJYmlfZXJyb3JmKCJub3RoaW5nIHRvIHNoaWZ0Iik7CisJCXJldHVybiAoMSk7CisJfQorCWwtPmFyZ3Zbbl0gPSBsLT5hcmd2WzBdOworCWwtPmFyZ3YgKz0gbjsKKwlsLT5hcmdjIC09IG47CisJcmV0dXJuICgwKTsKK30KKworaW50CitjX3VtYXNrKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgaSwgb3B0YzsKKwljb25zdCBjaGFyICpjcDsKKwlib29sIHN5bWJvbGljID0gZmFsc2U7CisJbW9kZV90IG9sZF91bWFzazsKKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgIlMiKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdTJzoKKwkJCXN5bWJvbGljID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKwljcCA9IHdwW2J1aWx0aW5fb3B0Lm9wdGluZF07CisJaWYgKGNwID09IE5VTEwpIHsKKwkJb2xkX3VtYXNrID0gdW1hc2soKG1vZGVfdCkwKTsKKwkJdW1hc2sob2xkX3VtYXNrKTsKKwkJaWYgKHN5bWJvbGljKSB7CisJCQljaGFyIGJ1ZlsxOF0sICpwOworCQkJaW50IGo7CisKKwkJCW9sZF91bWFzayA9IH5vbGRfdW1hc2s7CisJCQlwID0gYnVmOworCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJCSpwKysgPSAidWdvIltpXTsKKwkJCQkqcCsrID0gJz0nOworCQkJCWZvciAoaiA9IDA7IGogPCAzOyBqKyspCisJCQkJCWlmIChvbGRfdW1hc2sgJiAoMSA8PCAoOCAtICgzKmkgKyBqKSkpKQorCQkJCQkJKnArKyA9ICJyd3giW2pdOworCQkJCSpwKysgPSAnLCc7CisJCQl9CisJCQlwWy0xXSA9ICdcMCc7CisJCQlzaHByaW50ZigiJXNcbiIsIGJ1Zik7CisJCX0gZWxzZQorCQkJc2hwcmludGYoIiUjMy4zb1xuIiwgKHVuc2lnbmVkIGludClvbGRfdW1hc2spOworCX0gZWxzZSB7CisJCW1vZGVfdCBuZXdfdW1hc2s7CisKKwkJaWYgKGtzaF9pc2RpZ2l0KCpjcCkpIHsKKwkJCWZvciAobmV3X3VtYXNrID0gMDsgKmNwID49ICcwJyAmJiAqY3AgPD0gJzcnOyBjcCsrKQorCQkJCW5ld191bWFzayA9IG5ld191bWFzayAqIDggKyAoKmNwIC0gJzAnKTsKKwkJCWlmICgqY3ApIHsKKwkJCQliaV9lcnJvcmYoImJhZCBudW1iZXIiKTsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogc3ltYm9saWMgZm9ybWF0ICovCisJCQlpbnQgcG9zaXRpb25zLCBuZXdfdmFsOworCQkJY2hhciBvcDsKKworCQkJb2xkX3VtYXNrID0gdW1hc2soKG1vZGVfdCkwKTsKKwkJCXVtYXNrKG9sZF91bWFzayk7IC8qIGluIGNhc2Ugb2YgZXJyb3IgKi8KKwkJCW9sZF91bWFzayA9IH5vbGRfdW1hc2s7CisJCQluZXdfdW1hc2sgPSBvbGRfdW1hc2s7CisJCQlwb3NpdGlvbnMgPSAwOworCQkJd2hpbGUgKCpjcCkgeworCQkJCXdoaWxlICgqY3AgJiYgdnN0cmNocigiYXVnbyIsICpjcCkpCisJCQkJCXN3aXRjaCAoKmNwKyspIHsKKwkJCQkJY2FzZSAnYSc6CisJCQkJCQlwb3NpdGlvbnMgfD0gMDExMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICd1JzoKKwkJCQkJCXBvc2l0aW9ucyB8PSAwMTAwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ2cnOgorCQkJCQkJcG9zaXRpb25zIHw9IDAwMTA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnbyc6CisJCQkJCQlwb3NpdGlvbnMgfD0gMDAwMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJaWYgKCFwb3NpdGlvbnMpCisJCQkJCXBvc2l0aW9ucyA9IDAxMTE7IC8qIGRlZmF1bHQgaXMgYSAqLworCQkJCWlmICghdnN0cmNocigiPSstIiwgb3AgPSAqY3ApKQorCQkJCQlicmVhazsKKwkJCQljcCsrOworCQkJCW5ld192YWwgPSAwOworCQkJCXdoaWxlICgqY3AgJiYgdnN0cmNocigicnd4dWdvWHMiLCAqY3ApKQorCQkJCQlzd2l0Y2ggKCpjcCsrKSB7CisJCQkJCWNhc2UgJ3InOiBuZXdfdmFsIHw9IDA0OyBicmVhazsKKwkJCQkJY2FzZSAndyc6IG5ld192YWwgfD0gMDI7IGJyZWFrOworCQkJCQljYXNlICd4JzogbmV3X3ZhbCB8PSAwMTsgYnJlYWs7CisJCQkJCWNhc2UgJ3UnOgorCQkJCQkJbmV3X3ZhbCB8PSBvbGRfdW1hc2sgPj4gNjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdnJzoKKwkJCQkJCW5ld192YWwgfD0gb2xkX3VtYXNrID4+IDM7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnbyc6CisJCQkJCQluZXdfdmFsIHw9IG9sZF91bWFzayA+PiAwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ1gnOgorCQkJCQkJaWYgKG9sZF91bWFzayAmIDAxMTEpCisJCQkJCQkJbmV3X3ZhbCB8PSAwMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdzJzoKKwkJCQkJCS8qIGlnbm9yZWQgKi8KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJbmV3X3ZhbCA9IChuZXdfdmFsICYgMDcpICogcG9zaXRpb25zOworCQkJCXN3aXRjaCAob3ApIHsKKwkJCQljYXNlICctJzoKKwkJCQkJbmV3X3VtYXNrICY9IH5uZXdfdmFsOworCQkJCQlicmVhazsKKwkJCQljYXNlICc9JzoKKwkJCQkJbmV3X3VtYXNrID0gbmV3X3ZhbCB8CisJCQkJCSAgICAobmV3X3VtYXNrICYgfihwb3NpdGlvbnMgKiAwNykpOworCQkJCQlicmVhazsKKwkJCQljYXNlICcrJzoKKwkJCQkJbmV3X3VtYXNrIHw9IG5ld192YWw7CisJCQkJfQorCQkJCWlmICgqY3AgPT0gJywnKSB7CisJCQkJCXBvc2l0aW9ucyA9IDA7CisJCQkJCWNwKys7CisJCQkJfSBlbHNlIGlmICghdnN0cmNocigiPSstIiwgKmNwKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKmNwKSB7CisJCQkJYmlfZXJyb3JmKCJiYWQgbWFzayIpOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQluZXdfdW1hc2sgPSB+bmV3X3VtYXNrOworCQl9CisJCXVtYXNrKG5ld191bWFzayk7CisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludAorY19kb3QoY29uc3QgY2hhciAqKndwKQoreworCWNvbnN0IGNoYXIgKmZpbGUsICpjcCwgKiphcmd2OworCWludCBhcmdjLCBpLCBlcnJjb2RlOworCisJaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQorCQlyZXR1cm4gKDEpOworCisJaWYgKChjcCA9IHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0pID09IE5VTEwpIHsKKwkJYmlfZXJyb3JmKCJtaXNzaW5nIGFyZ3VtZW50Iik7CisJCXJldHVybiAoMSk7CisJfQorCWlmICgoZmlsZSA9IHNlYXJjaChjcCwgcGF0aCwgUl9PSywgJmVycmNvZGUpKSA9PSBOVUxMKSB7CisJCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsCisJCSAgICBlcnJjb2RlID8gc3RyZXJyb3IoZXJyY29kZSkgOiAibm90IGZvdW5kIik7CisJCXJldHVybiAoMSk7CisJfQorCisJLyogU2V0IHBvc2l0aW9uYWwgcGFyYW1ldGVycz8gKi8KKwlpZiAod3BbYnVpbHRpbl9vcHQub3B0aW5kICsgMV0pIHsKKwkJYXJndiA9IHdwICsgYnVpbHRpbl9vcHQub3B0aW5kOworCQlhcmd2WzBdID0gZS0+bG9jLT5hcmd2WzBdOyAvKiBwcmVzZXJ2ZSAkMCAqLworCQlmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2MgKyAxXTsgYXJnYysrKQorCQkJOworCX0gZWxzZSB7CisJCWFyZ2MgPSAwOworCQlhcmd2ID0gTlVMTDsKKwl9CisJaWYgKChpID0gaW5jbHVkZShmaWxlLCBhcmdjLCBhcmd2LCAwKSkgPCAwKSB7CisJCS8qIHNob3VsZCBub3QgaGFwcGVuICovCisJCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoMSk7CisJfQorCXJldHVybiAoaSk7Cit9CisKK2ludAorY193YWl0KGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgcnYgPSAwLCBzaWc7CisKKwlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCisJCXJldHVybiAoMSk7CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCWlmICgqd3AgPT0gTlVMTCkgeworCQl3aGlsZSAod2FpdGZvcihOVUxMLCAmc2lnKSA+PSAwKQorCQkJOworCQlydiA9IHNpZzsKKwl9IGVsc2UgeworCQlmb3IgKDsgKndwOyB3cCsrKQorCQkJcnYgPSB3YWl0Zm9yKCp3cCwgJnNpZyk7CisJCWlmIChydiA8IDApCisJCQlydiA9IHNpZyA/IHNpZyA6IDEyNzsgLyogbWFnaWMgZXhpdCBjb2RlOiBiYWQgam9iLWlkICovCisJfQorCXJldHVybiAocnYpOworfQorCitpbnQKK2NfcmVhZChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IGMgPSAwLCBlY29kZSA9IDAsIGZkID0gMCwgb3B0YzsKKwlib29sIGV4cGFuZGUgPSB0cnVlLCBoaXN0b3J5ciA9IGZhbHNlLCBleHBhbmRpbmc7CisJY29uc3QgY2hhciAqY3AsICplbXNnOworCXN0cnVjdCBzaGYgKnNoZjsKKwlYU3RyaW5nIGNzLCB4cyA9IHsgTlVMTCwgTlVMTCwgMCwgTlVMTH07CisJc3RydWN0IHRibCAqdnA7CisJY2hhciAqY2NwLCAqeHAgPSBOVUxMLCAqd3BhbGxvYyA9IE5VTEw7CisJc3RhdGljIGNoYXIgUkVQTFlbXSA9ICJSRVBMWSI7CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJwcnN1LCIpKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ3AnOgorCQkJaWYgKChmZCA9IGNvcHJvY19nZXRmZChSX09LLCAmZW1zZykpIDwgMCkgeworCQkJCWJpX2Vycm9yZigiLXA6ICVzIiwgZW1zZyk7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCWV4cGFuZGUgPSBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWhpc3RvcnlyID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCWlmICghKihjcCA9IGJ1aWx0aW5fb3B0Lm9wdGFyZykpCisJCQkJZmQgPSAwOworCQkJZWxzZSBpZiAoKGZkID0gY2hlY2tfZmQoY3AsIFJfT0ssICZlbXNnKSkgPCAwKSB7CisJCQkJYmlfZXJyb3JmKCItdTogJXM6ICVzIiwgY3AsIGVtc2cpOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCisJaWYgKCp3cCA9PSBOVUxMKQorCQkqLS13cCA9IFJFUExZOworCisJLyogU2luY2Ugd2UgY2FuJ3QgbmVjZXNzYXJpbHkgc2VlayBiYWNrd2FyZHMgb24gbm9uLXJlZ3VsYXIgZmlsZXMsCisJICogZG9uJ3QgYnVmZmVyIHRoZW0gc28gd2UgY2FuJ3QgcmVhZCB0b28gbXVjaC4KKwkgKi8KKwlzaGYgPSBzaGZfcmVvcGVuKGZkLCBTSEZfUkQgfCBTSEZfSU5URVJSVVBUIHwgY2FuX3NlZWsoZmQpLCBzaGxfc3BhcmUpOworCisJaWYgKChjcCA9IGNzdHJjaHIoKndwLCAnPycpKSAhPSBOVUxMKSB7CisJCXN0cmR1cHgod3BhbGxvYywgKndwLCBBVEVNUCk7CisJCXdwYWxsb2NbY3AgLSAqd3BdID0gJ1wwJzsKKwkJKndwID0gd3BhbGxvYzsKKwkJaWYgKGlzYXR0eShmZCkpIHsKKwkJCS8qIEFUJlQga3NoIHNheXMgaXQgcHJpbnRzIHByb21wdCBvbiBmZCBpZiBpdCdzIG9wZW4KKwkJCSAqIGZvciB3cml0aW5nIGFuZCBpcyBhIHR0eSwgYnV0IGl0IGRvZXNuJ3QgZG8gaXQKKwkJCSAqIChpdCBhbHNvIGRvZXNuJ3QgY2hlY2sgdGhlIGludGVyYWN0aXZlIGZsYWcsCisJCQkgKiBhcyBpcyBpbmRpY2F0ZWQgaW4gdGhlIEtvcm5zaGVsbCBib29rKS4KKwkJCSAqLworCQkJc2hlbGxmKCIlcyIsIGNwKzEpOworCQl9CisJfQorCisJLyogSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSB0aGUgY28tcHJvY2VzcyBmb3IgdGhlIGZpcnN0IHRpbWUsCisJICogbWFrZSBzdXJlIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBwaXBlIGlzIGNsb3NlZCBmaXJzdC4gVGhpcyBhbGxvd3MKKwkgKiB0aGUgZGV0ZWN0aW9uIG9mIGVvZi4KKwkgKgorCSAqIFRoaXMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBBVCZUIGtzaC4uLiB0aGUgZmQgaXMga2VwdCBzbyBhbm90aGVyCisJICogY29wcm9jIGNhbiBiZSBzdGFydGVkIHdpdGggc2FtZSBvdXRwdXQsIGhvd2V2ZXIsIHRoaXMgbWVhbnMgZW9mCisJICogY2FuJ3QgYmUgZGV0ZWN0ZWQuLi4gVGhpcyBpcyB3aHkgaXQgaXMgY2xvc2VkIGhlcmUuCisJICogSWYgdGhpcyBjYWxsIGlzIHJlbW92ZWQsIHJlbW92ZSB0aGUgZW9mIGNoZWNrIGJlbG93LCB0b28uCisJICogY29wcm9jX3JlYWR3X2Nsb3NlKGZkKTsKKwkgKi8KKworCWlmIChoaXN0b3J5cikKKwkJWGluaXQoeHMsIHhwLCAxMjgsIEFURU1QKTsKKwlleHBhbmRpbmcgPSBmYWxzZTsKKwlYaW5pdChjcywgY2NwLCAxMjgsIEFURU1QKTsKKwlmb3IgKDsgKndwICE9IE5VTEw7IHdwKyspIHsKKwkJZm9yIChjY3AgPSBYc3RyaW5nKGNzLCBjY3ApOyA7ICkgeworCQkJaWYgKGMgPT0gJ1xuJyB8fCBjID09IEVPRikKKwkJCQlicmVhazsKKwkJCXdoaWxlICgxKSB7CisJCQkJYyA9IHNoZl9nZXRjKHNoZik7CisJCQkJaWYgKGMgPT0gJ1wwJykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGMgPT0gRU9GICYmIHNoZl9lcnJvcihzaGYpICYmCisJCQkJICAgIHNoZl9lcnJubyhzaGYpID09IEVJTlRSKSB7CisJCQkJCS8qIFdhcyB0aGUgb2ZmZW5kaW5nIHNpZ25hbCBvbmUgdGhhdAorCQkJCQkgKiB3b3VsZCBub3JtYWxseSBraWxsIGEgcHJvY2Vzcz8KKwkJCQkJICogSWYgc28sIHByZXRlbmQgdGhlIHJlYWQgd2FzIGtpbGxlZC4KKwkJCQkJICovCisJCQkJCWVjb2RlID0gZmF0YWxfdHJhcF9jaGVjaygpOworCisJCQkJCS8qIG5vbiBmYXRhbCAoZWcsIENITEQpLCBjYXJyeSBvbiAqLworCQkJCQlpZiAoIWVjb2RlKSB7CisJCQkJCQlzaGZfY2xlYXJlcnIoc2hmKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGhpc3RvcnlyKSB7CisJCQkJWGNoZWNrKHhzLCB4cCk7CisJCQkJWHB1dCh4cywgeHAsIGMpOworCQkJfQorCQkJWGNoZWNrKGNzLCBjY3ApOworCQkJaWYgKGV4cGFuZGluZykgeworCQkJCWV4cGFuZGluZyA9IGZhbHNlOworCQkJCWlmIChjID09ICdcbicpIHsKKwkJCQkJYyA9IDA7CisJCQkJCWlmIChGbGFnKEZUQUxLSU5HX0kpICYmIGlzYXR0eShmZCkpIHsKKwkJCQkJCS8qIHNldCBwcm9tcHQgaW4gY2FzZSB0aGlzIGlzCisJCQkJCQkgKiBjYWxsZWQgZnJvbSAucHJvZmlsZSBvciAkRU5WCisJCQkJCQkgKi8KKwkJCQkJCXNldF9wcm9tcHQoUFMyLCBOVUxMKTsKKwkJCQkJCXBwcm9tcHQocHJvbXB0LCAwKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoYyAhPSBFT0YpCisJCQkJCVhwdXQoY3MsIGNjcCwgYyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZXhwYW5kZSAmJiBjID09ICdcXCcpIHsKKwkJCQlleHBhbmRpbmcgPSB0cnVlOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGMgPT0gJ1xuJyB8fCBjID09IEVPRikKKwkJCQlicmVhazsKKwkJCWlmIChjdHlwZShjLCBDX0lGUykpIHsKKwkJCQlpZiAoWGxlbmd0aChjcywgY2NwKSA9PSAwICYmIGN0eXBlKGMsIENfSUZTV1MpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAod3BbMV0pCisJCQkJCWJyZWFrOworCQkJfQorCQkJWHB1dChjcywgY2NwLCBjKTsKKwkJfQorCQkvKiBzdHJpcCB0cmFpbGluZyBJRlMgd2hpdGUgc3BhY2UgZnJvbSBsYXN0IHZhcmlhYmxlICovCisJCWlmICghd3BbMV0pCisJCQl3aGlsZSAoWGxlbmd0aChjcywgY2NwKSAmJiBjdHlwZShjY3BbLTFdLCBDX0lGUykgJiYKKwkJCSAgICBjdHlwZShjY3BbLTFdLCBDX0lGU1dTKSkKKwkJCQljY3AtLTsKKwkJWHB1dChjcywgY2NwLCAnXDAnKTsKKwkJdnAgPSBnbG9iYWwoKndwKTsKKwkJLyogTXVzdCBiZSBkb25lIGJlZm9yZSBzZXR0aW5nIGV4cG9ydC4gKi8KKwkJaWYgKHZwLT5mbGFnICYgUkRPTkxZKSB7CisJCQlzaGZfZmx1c2goc2hmKTsKKwkJCWJpX2Vycm9yZigiJXMgaXMgcmVhZCBvbmx5IiwgKndwKTsKKwkJCWFmcmVlKHdwYWxsb2MsIEFURU1QKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJaWYgKEZsYWcoRkVYUE9SVCkpCisJCQl0eXBlc2V0KCp3cCwgRVhQT1JULCAwLCAwLCAwKTsKKwkJaWYgKCFzZXRzdHIodnAsIFhzdHJpbmcoY3MsIGNjcCksIEtTSF9SRVRVUk5fRVJST1IpKSB7CisJCQlzaGZfZmx1c2goc2hmKTsKKwkJCWFmcmVlKHdwYWxsb2MsIEFURU1QKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisKKwlzaGZfZmx1c2goc2hmKTsKKwlpZiAoaGlzdG9yeXIpIHsKKwkJWHB1dCh4cywgeHAsICdcMCcpOworCQloaXN0c2F2ZSgmc291cmNlLT5saW5lLCBYc3RyaW5nKHhzLCB4cCksIHRydWUsIGZhbHNlKTsKKwkJWGZyZWUoeHMsIHhwKTsKKwl9CisJLyogaWYgdGhpcyBpcyB0aGUgY28tcHJvY2VzcyBmZCwgY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvcgorCSAqIChjYW4gZ2V0IGVvZiBpZiBhbmQgb25seSBpZiBhbGwgcHJvY2Vzc2VzIGFyZSBoYXZlIGRpZWQsIGllLAorCSAqIGNvcHJvYy5uam9icyBpcyAwIGFuZCB0aGUgcGlwZSBpcyBjbG9zZWQpLgorCSAqLworCWlmIChjID09IEVPRiAmJiAhZWNvZGUpCisJCWNvcHJvY19yZWFkX2Nsb3NlKGZkKTsKKworCWFmcmVlKHdwYWxsb2MsIEFURU1QKTsKKwlyZXR1cm4gKGVjb2RlID8gZWNvZGUgOiBjID09IEVPRik7Cit9CisKK2ludAorY19ldmFsKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlzdHJ1Y3Qgc291cmNlICpzLCAqc2F2ZXMgPSBzb3VyY2U7CisJdW5zaWduZWQgY2hhciBzYXZlZjsKKwlpbnQgcnY7CisKKwlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCisJCXJldHVybiAoMSk7CisJcyA9IHB1c2hzKFNXT1JEUywgQVRFTVApOworCXMtPnUuc3RydiA9IHdwICsgYnVpbHRpbl9vcHQub3B0aW5kOworCisJLyotCisJICogVGhlIGZvbGxvd2luZyBjb2RlIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbW1hbmQgaXMKKwkgKiBlbXB0eSBkdWUgdG8gZmFpbGVkIGNvbW1hbmQgc3Vic3RpdHV0aW9uLCBmb3IgZXhhbXBsZSBieQorCSAqCWV2YWwgIiQoZmFsc2UpIgorCSAqIFRoaXMgaGFzIGhpc3RvcmljYWxseSByZXR1cm5lZCAxIGJ5IEFUJlQga3NoODguIEluIHRoaXMKKwkgKiBjYXNlLCBzaGVsbCgpIHdpbGwgbm90IHNldCBvciBjaGFuZ2UgZXhzdGF0IGJlY2F1c2UgdGhlCisJICogY29tcGlsZWQgdHJlZSBpcyBlbXB0eSwgc28gaXQgd2lsbCB1c2UgdGhlIHZhbHVlIHdlIHBhc3MKKwkgKiBmcm9tIHN1YnN0X2V4c3RhdCwgd2hpY2ggaXMgY2xlYXJlZCBpbiBleGVjdXRlKCksIHNvIGl0CisJICogc2hvdWxkIGhhdmUgYmVlbiAwIGlmIHRoZXJlIHdlcmUgbm8gc3Vic3RpdHV0aW9ucy4KKwkgKgorCSAqIFBPU0lYIGhvd2V2ZXIgc2F5cyB3ZSBkb24ndCBkbyB0aGlzLCBldmVuIHRob3VnaCBpdCBpcworCSAqIHRyYWRpdGlvbmFsbHkgZG9uZS4gQVQmVCBrc2g5MyBhZ3JlZXMgd2l0aCBQT1NJWCwgc28gd2UKKwkgKiBkby4gVGhlIGZvbGxvd2luZyBpcyBhbiBleGNlcnB0IGZyb20gU1VTdjQgWzEwMDMuMi0yMDA4XToKKwkgKgorCSAqIDIuOS4xOiBTaW1wbGUgQ29tbWFuZHMKKwkgKgkuLi4gSWYgdGhlcmUgaXMgYSBjb21tYW5kIG5hbWUsIGV4ZWN1dGlvbiBzaGFsbAorCSAqCWNvbnRpbnVlIGFzIGRlc2NyaWJlZCBpbiAyLjkuMS4xIFtDb21tYW5kIFNlYXJjaAorCSAqCWFuZCBFeGVjdXRpb25dLiBJZiB0aGVyZSBpcyBubyBjb21tYW5kIG5hbWUsIGJ1dAorCSAqCXRoZSBjb21tYW5kIGNvbnRhaW5lZCBhIGNvbW1hbmQgc3Vic3RpdHV0aW9uLCB0aGUKKwkgKgljb21tYW5kIHNoYWxsIGNvbXBsZXRlIHdpdGggdGhlIGV4aXQgc3RhdHVzIG9mIHRoZQorCSAqCWxhc3QgY29tbWFuZCBzdWJzdGl0dXRpb24gcGVyZm9ybWVkLgorCSAqIDIuOS4xLjE6IENvbW1hbmQgU2VhcmNoIGFuZCBFeGVjdXRpb24KKwkgKgkoMSkgYS4gSWYgdGhlIGNvbW1hbmQgbmFtZSBtYXRjaGVzIHRoZSBuYW1lIG9mIGEKKwkgKglzcGVjaWFsIGJ1aWx0LWluIHV0aWxpdHksIHRoYXQgc3BlY2lhbCBidWlsdC1pbgorCSAqCXV0aWxpdHkgc2hhbGwgYmUgaW52b2tlZC4KKwkgKiAyLjE0LjU6IGV2YWwKKwkgKglJZiB0aGVyZSBhcmUgbm8gYXJndW1lbnRzLCBvciBvbmx5IG51bGwgYXJndW1lbnRzLAorCSAqCWV2YWwgc2hhbGwgcmV0dXJuIGEgemVybyBleGl0IHN0YXR1czsgLi4uCisJICovCisJLyogZXhzdGF0ID0gc3Vic3RfZXhzdGF0OyAqLwkvKiBBVCZUIGtzaDg4ICovCisJZXhzdGF0ID0gMDsJCQkvKiBTVVN2NCAqLworCisJc2F2ZWYgPSBGbGFnKEZFUlJFWElUKTsKKwlGbGFnKEZFUlJFWElUKSA9IDA7CisJcnYgPSBzaGVsbChzLCBmYWxzZSk7CisJRmxhZyhGRVJSRVhJVCkgPSBzYXZlZjsKKwlzb3VyY2UgPSBzYXZlczsKKwlhZnJlZShzLCBBVEVNUCk7CisJcmV0dXJuIChydik7Cit9CisKK2ludAorY190cmFwKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICpzOworCVRyYXAgKnA7CisKKwlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCisJCXJldHVybiAoMSk7CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCisJaWYgKCp3cCA9PSBOVUxMKSB7CisJCWZvciAocCA9IHNpZ3RyYXBzLCBpID0gTlNJRysxOyAtLWkgPj0gMDsgcCsrKQorCQkJaWYgKHAtPnRyYXAgIT0gTlVMTCkgeworCQkJCXNoZl9wdXRzKCJ0cmFwIC0tICIsIHNobF9zdGRvdXQpOworCQkJCXByaW50X3ZhbHVlX3F1b3RlZChwLT50cmFwKTsKKwkJCQlzaHByaW50ZigiICVzXG4iLCBwLT5uYW1lKTsKKwkJCX0KKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKgorCSAqIFVzZSBjYXNlIHNlbnNpdGl2ZSBsb29rdXAgZm9yIGZpcnN0IGFyZyBzbyB0aGUKKwkgKiBjb21tYW5kICdleGl0JyBpc24ndCBjb25mdXNlZCB3aXRoIHRoZSBwc2V1ZG8tc2lnbmFsCisJICogJ0VYSVQnLgorCSAqLworCXMgPSAoZ2V0dHJhcCgqd3AsIGZhbHNlKSA9PSBOVUxMKSA/ICp3cCsrIDogTlVMTDsgLyogZ2V0IGNvbW1hbmQgKi8KKwlpZiAocyAhPSBOVUxMICYmIHNbMF0gPT0gJy0nICYmIHNbMV0gPT0gJ1wwJykKKwkJcyA9IE5VTEw7CisKKwkvKiBzZXQvY2xlYXIgdHJhcHMgKi8KKwl3aGlsZSAoKndwICE9IE5VTEwpIHsKKwkJcCA9IGdldHRyYXAoKndwKyssIHRydWUpOworCQlpZiAocCA9PSBOVUxMKSB7CisJCQliaV9lcnJvcmYoImJhZCBzaWduYWwgJXMiLCB3cFstMV0pOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlzZXR0cmFwKHAsIHMpOworCX0KKwlyZXR1cm4gKDApOworfQorCitpbnQKK2NfZXhpdHJldHVybihjb25zdCBjaGFyICoqd3ApCit7CisJaW50IG4sIGhvdyA9IExFWElUOworCWNvbnN0IGNoYXIgKmFyZzsKKworCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKKwkJcmV0dXJuICgxKTsKKwlhcmcgPSB3cFtidWlsdGluX29wdC5vcHRpbmRdOworCisJaWYgKGFyZykgeworCQlpZiAoIWdldG4oYXJnLCAmbikpIHsKKwkJCWV4c3RhdCA9IDE7CisJCQl3YXJuaW5nZih0cnVlLCAiJXM6IGJhZCBudW1iZXIiLCBhcmcpOworCQl9IGVsc2UKKwkJCWV4c3RhdCA9IG47CisJfQorCWlmICh3cFswXVswXSA9PSAncicpIHsgLyogcmV0dXJuICovCisJCXN0cnVjdCBlbnYgKmVwOworCisJCS8qIG5lZWQgdG8gdGVsbCBpZiB0aGlzIGlzIGV4aXQgb3IgcmV0dXJuIHNvIHRyYXAgZXhpdCB3aWxsCisJCSAqIHdvcmsgcmlnaHQgKFBPU0lYKQorCQkgKi8KKwkJZm9yIChlcCA9IGU7IGVwOyBlcCA9IGVwLT5vZW52KQorCQkJaWYgKFNUT1BfUkVUVVJOKGVwLT50eXBlKSkgeworCQkJCWhvdyA9IExSRVRVUk47CisJCQkJYnJlYWs7CisJCQl9CisJfQorCisJaWYgKGhvdyA9PSBMRVhJVCAmJiAhcmVhbGx5X2V4aXQgJiYgal9zdG9wcGVkX3J1bm5pbmcoKSkgeworCQlyZWFsbHlfZXhpdCA9IDE7CisJCWhvdyA9IExTSEVMTDsKKwl9CisKKwlxdWl0ZW52KE5VTEwpOwkvKiBnZXQgcmlkIG9mIGFueSBpL28gcmVkaXJlY3Rpb25zICovCisJdW53aW5kKGhvdyk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitpbnQKK2NfYnJrY29udChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IG4sIHF1aXQ7CisJc3RydWN0IGVudiAqZXAsICpsYXN0X2VwID0gTlVMTDsKKwljb25zdCBjaGFyICphcmc7CisKKwlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCisJCXJldHVybiAoMSk7CisJYXJnID0gd3BbYnVpbHRpbl9vcHQub3B0aW5kXTsKKworCWlmICghYXJnKQorCQluID0gMTsKKwllbHNlIGlmICghYmlfZ2V0bihhcmcsICZuKSkKKwkJcmV0dXJuICgxKTsKKwlxdWl0ID0gbjsKKwlpZiAocXVpdCA8PSAwKSB7CisJCS8qIEFUJlQga3NoIGRvZXMgdGhpcyBmb3Igbm9uLWludGVyYWN0aXZlIHNoZWxscyBvbmx5IC0gd2VpcmQgKi8KKwkJYmlfZXJyb3JmKCIlczogYmFkIHZhbHVlIiwgYXJnKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKiBTdG9wIGF0IEVfTk9ORSwgRV9QQVJTRSwgRV9GVU5DLCBvciBFX0lOQ0wgKi8KKwlmb3IgKGVwID0gZTsgZXAgJiYgIVNUT1BfQlJLQ09OVChlcC0+dHlwZSk7IGVwID0gZXAtPm9lbnYpCisJCWlmIChlcC0+dHlwZSA9PSBFX0xPT1ApIHsKKwkJCWlmICgtLXF1aXQgPT0gMCkKKwkJCQlicmVhazsKKwkJCWVwLT5mbGFncyB8PSBFRl9CUktDT05UX1BBU1M7CisJCQlsYXN0X2VwID0gZXA7CisJCX0KKworCWlmIChxdWl0KSB7CisJCS8qIEFUJlQga3NoIGRvZXNuJ3QgcHJpbnQgYSBtZXNzYWdlIC0ganVzdCBkb2VzIHdoYXQgaXQKKwkJICogY2FuLiBXZSBwcmludCBhIG1lc3NhZ2UgJ2NhdXNlIGl0IGhlbHBzIGluIGRlYnVnZ2luZworCQkgKiBzY3JpcHRzLCBidXQgZG9uJ3QgZ2VuZXJhdGUgYW4gZXJyb3IgKGllLCBrZWVwIGdvaW5nKS4KKwkJICovCisJCWlmIChuID09IHF1aXQpIHsKKwkJCXdhcm5pbmdmKHRydWUsICIlczogY2Fubm90ICVzIiwgd3BbMF0sIHdwWzBdKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJLyogUE9TSVggc2F5cyBpZiBuIGlzIHRvbyBiaWcsIHRoZSBsYXN0IGVuY2xvc2luZyBsb29wCisJCSAqIHNoYWxsIGJlIHVzZWQuIERvZXNuJ3Qgc2F5IHRvIHByaW50IGFuIGVycm9yIGJ1dCB3ZQorCQkgKiBkbyBhbnl3YXkgJ2NhdXNlIHRoZSB1c2VyIG1lc3NlZCB1cC4KKwkJICovCisJCWlmIChsYXN0X2VwKQorCQkJbGFzdF9lcC0+ZmxhZ3MgJj0gfkVGX0JSS0NPTlRfUEFTUzsKKwkJd2FybmluZ2YodHJ1ZSwgIiVzOiBjYW4gb25seSAlcyAlZCBsZXZlbChzKSIsCisJCSAgICB3cFswXSwgd3BbMF0sIG4gLSBxdWl0KTsKKwl9CisKKwl1bndpbmQoKndwWzBdID09ICdiJyA/IExCUkVBSyA6IExDT05USU4pOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworaW50CitjX3NldChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IGFyZ2k7CisJYm9vbCBzZXRhcmdzOworCXN0cnVjdCBibG9jayAqbCA9IGUtPmxvYzsKKwljb25zdCBjaGFyICoqb3dwOworCisJaWYgKHdwWzFdID09IE5VTEwpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3NbXSA9IHsgInNldCIsICItIiwgTlVMTCB9OworCQlyZXR1cm4gKGNfdHlwZXNldChhcmdzKSk7CisJfQorCisJYXJnaSA9IHBhcnNlX2FyZ3Mod3AsIE9GX1NFVCwgJnNldGFyZ3MpOworCWlmIChhcmdpIDwgMCkKKwkJcmV0dXJuICgxKTsKKwkvKiBzZXQgJCMgYW5kICQqICovCisJaWYgKHNldGFyZ3MpIHsKKwkJd3AgKz0gYXJnaSAtIDE7CisJCW93cCA9IHdwOworCQl3cFswXSA9IGwtPmFyZ3ZbMF07IC8qIHNhdmUgJDAgKi8KKwkJd2hpbGUgKCorK3dwICE9IE5VTEwpCisJCQlzdHJkdXB4KCp3cCwgKndwLCAmbC0+YXJlYSk7CisJCWwtPmFyZ2MgPSB3cCAtIG93cCAtIDE7CisJCWwtPmFyZ3YgPSBhbGxvYygobC0+YXJnYyArIDIpICogc2l6ZW9mKGNoYXIgKiksICZsLT5hcmVhKTsKKwkJZm9yICh3cCA9IGwtPmFyZ3Y7ICgqd3ArKyA9ICpvd3ArKykgIT0gTlVMTDsgKQorCQkJOworCX0KKwkvKi0KKwkgKiBQT1NJWCBzYXlzIHNldCBleGl0IHN0YXR1cyBpcyAwLCBidXQgb2xkIHNjcmlwdHMgdGhhdCB1c2UKKwkgKiBnZXRvcHQoMSkgdXNlIHRoZSBjb25zdHJ1Y3QKKwkgKglzZXQgLS0gJChnZXRvcHQgYWI6YyAiJEAiKQorCSAqIHdoaWNoIGFzc3VtZXMgdGhlIGV4aXQgdmFsdWUgc2V0IHdpbGwgYmUgdGhhdCBvZiB0aGUgJCgpCisJICogKHN1YnN0X2V4c3RhdCBpcyBjbGVhcmVkIGluIGV4ZWN1dGUoKSBzbyB0aGF0IGl0IHdpbGwgYmUgMAorCSAqIGlmIHRoZXJlIGFyZSBubyBjb21tYW5kIHN1YnN0aXR1dGlvbnMpLgorCSAqIFN3aXRjaGVkIGtzaCAoIXBvc2l4ICFzaCkgdG8gUE9TSVggaW4gbWtzaCBSMzliLgorCSAqLworCXJldHVybiAoRmxhZyhGU0gpID8gc3Vic3RfZXhzdGF0IDogMCk7Cit9CisKK2ludAorY191bnNldChjb25zdCBjaGFyICoqd3ApCit7CisJY29uc3QgY2hhciAqaWQ7CisJaW50IG9wdGM7CisJYm9vbCB1bnNldF92YXIgPSB0cnVlOworCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAiZnYiKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdmJzoKKwkJCXVuc2V0X3ZhciA9IGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdW5zZXRfdmFyID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisJZm9yICg7IChpZCA9ICp3cCkgIT0gTlVMTDsgd3ArKykKKwkJaWYgKHVuc2V0X3ZhcikgewkvKiB1bnNldCB2YXJpYWJsZSAqLworCQkJc3RydWN0IHRibCAqdnA7CisJCQljaGFyICpjcCA9IE5VTEw7CisJCQlzaXplX3QgbjsKKworCQkJbiA9IHN0cmxlbihpZCk7CisJCQlpZiAobiA+IDMgJiYgaWRbbi0zXSA9PSAnWycgJiYgaWRbbi0yXSA9PSAnKicgJiYKKwkJCSAgICBpZFtuLTFdID09ICddJykgeworCQkJCXN0cm5kdXB4KGNwLCBpZCwgbiAtIDMsIEFURU1QKTsKKwkJCQlpZCA9IGNwOworCQkJCW9wdGMgPSAzOworCQkJfSBlbHNlCisJCQkJb3B0YyA9IHZzdHJjaHIoaWQsICdbJykgPyAwIDogMTsKKworCQkJdnAgPSBnbG9iYWwoaWQpOworCQkJYWZyZWUoY3AsIEFURU1QKTsKKworCQkJaWYgKCh2cC0+ZmxhZyZSRE9OTFkpKSB7CisJCQkJYmlfZXJyb3JmKCIlcyBpcyByZWFkIG9ubHkiLCB2cC0+bmFtZSk7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCXVuc2V0KHZwLCBvcHRjKTsKKwkJfSBlbHNlCQkJLyogdW5zZXQgZnVuY3Rpb24gKi8KKwkJCWRlZmluZShpZCwgTlVMTCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3BfdGltZShzdHJ1Y3Qgc2hmICpzaGYsIGJvb2wgcG9zaXgsIGxvbmcgdHZfc2VjLCBpbnQgdHZfdXNlYywgaW50IHdpZHRoLAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqc3VmZml4KQoreworCXR2X3VzZWMgLz0gMTAwMDA7CisJaWYgKHBvc2l4KQorCQlzaGZfZnByaW50ZihzaGYsICIlcyUqbGQuJTAyZCVzIiwgcHJlZml4LCB3aWR0aCwKKwkJICAgIHR2X3NlYywgdHZfdXNlYywgc3VmZml4KTsKKwllbHNlCisJCXNoZl9mcHJpbnRmKHNoZiwgIiVzJSpsZG0lZC4lMDJkcyVzIiwgcHJlZml4LCB3aWR0aCwKKwkJICAgIHR2X3NlYyAvIDYwLCAoaW50KSh0dl9zZWMgJSA2MCksIHR2X3VzZWMsIHN1ZmZpeCk7Cit9CisKK2ludAorY190aW1lcyhjb25zdCBjaGFyICoqd3AgTUtTSF9BX1VOVVNFRCkKK3sKKwlzdHJ1Y3QgcnVzYWdlIHVzYWdlOworCisJZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmdXNhZ2UpOworCXBfdGltZShzaGxfc3Rkb3V0LCBmYWxzZSwgdXNhZ2UucnVfdXRpbWUudHZfc2VjLAorCSAgICB1c2FnZS5ydV91dGltZS50dl91c2VjLCAwLCBudWxsLCAiICIpOworCXBfdGltZShzaGxfc3Rkb3V0LCBmYWxzZSwgdXNhZ2UucnVfc3RpbWUudHZfc2VjLAorCSAgICB1c2FnZS5ydV9zdGltZS50dl91c2VjLCAwLCBudWxsLCAiXG4iKTsKKworCWdldHJ1c2FnZShSVVNBR0VfQ0hJTERSRU4sICZ1c2FnZSk7CisJcF90aW1lKHNobF9zdGRvdXQsIGZhbHNlLCB1c2FnZS5ydV91dGltZS50dl9zZWMsCisJICAgIHVzYWdlLnJ1X3V0aW1lLnR2X3VzZWMsIDAsIG51bGwsICIgIik7CisJcF90aW1lKHNobF9zdGRvdXQsIGZhbHNlLCB1c2FnZS5ydV9zdGltZS50dl9zZWMsCisJICAgIHVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMsIDAsIG51bGwsICJcbiIpOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIHRpbWUgcGlwZWxpbmUgKHJlYWxseSBhIHN0YXRlbWVudCwgbm90IGEgYnVpbHQtaW4gY29tbWFuZCkKKyAqLworaW50Cit0aW1leChzdHJ1Y3Qgb3AgKnQsIGludCBmLCB2b2xhdGlsZSBpbnQgKnhlcnJvaykKK3sKKyNkZWZpbmUgVEZfTk9BUkdTCUJJVCgwKQorI2RlZmluZSBURl9OT1JFQUwJQklUKDEpCQkvKiBkb24ndCByZXBvcnQgcmVhbCB0aW1lICovCisjZGVmaW5lIFRGX1BPU0lYCUJJVCgyKQkJLyogcmVwb3J0IGluIFBPU0lYIGZvcm1hdCAqLworCWludCBydiA9IDAsIHRmID0gMDsKKwlzdHJ1Y3QgcnVzYWdlIHJ1MCwgcnUxLCBjcnUwLCBjcnUxOworCXN0cnVjdCB0aW1ldmFsIHVzcnRpbWUsIHN5c3RpbWUsIHR2MCwgdHYxOworCisJZ2V0dGltZW9mZGF5KCZ0djAsIE5VTEwpOworCWdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1MCk7CisJZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJmNydTApOworCWlmICh0LT5sZWZ0KSB7CisJCS8qCisJCSAqIFR3byB3YXlzIG9mIGdldHRpbmcgY3B1IHVzYWdlIG9mIGEgY29tbWFuZDoganVzdCB1c2UgdDAKKwkJICogYW5kIHQxICh3aGljaCB3aWxsIGdldCBjcHUgdXNhZ2UgZnJvbSBvdGhlciBqb2JzIHRoYXQKKwkJICogZmluaXNoIHdoaWxlIHdlIGFyZSBleGVjdXRpbmcgdC0+bGVmdCksIG9yIGdldCB0aGUKKwkJICogY3B1IHVzYWdlIG9mIHQtPmxlZnQuIEFUJlQga3NoIGRvZXMgdGhlIGZvcm1lciwgd2hpbGUKKwkJICogcGRrc2ggdHJpZXMgdG8gZG8gdGhlIGxhdGVyICh0aGUgal91c3J0aW1lIGhhY2sgZG9lc24ndAorCQkgKiByZWFsbHkgd29yayBhcyBpdCBvbmx5IGNvdW50cyB0aGUgbGFzdCBqb2IpLgorCQkgKi8KKwkJdGltZXJjbGVhcigmal91c3J0aW1lKTsKKwkJdGltZXJjbGVhcigmal9zeXN0aW1lKTsKKwkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIGYgfCBYVElNRSwgeGVycm9rKTsKKwkJaWYgKHQtPmxlZnQtPnR5cGUgPT0gVENPTSkKKwkJCXRmIHw9IHQtPmxlZnQtPnN0clswXTsKKwkJZ2V0dGltZW9mZGF5KCZ0djEsIE5VTEwpOworCQlnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydTEpOworCQlnZXRydXNhZ2UoUlVTQUdFX0NISUxEUkVOLCAmY3J1MSk7CisJfSBlbHNlCisJCXRmID0gVEZfTk9BUkdTOworCisJaWYgKHRmICYgVEZfTk9BUkdTKSB7IC8qIGtzaDkzIC0gcmVwb3J0IHNoZWxsIHRpbWVzIChzaGVsbCtraWRzKSAqLworCQl0ZiB8PSBURl9OT1JFQUw7CisJCXRpbWVyYWRkKCZydTAucnVfdXRpbWUsICZjcnUwLnJ1X3V0aW1lLCAmdXNydGltZSk7CisJCXRpbWVyYWRkKCZydTAucnVfc3RpbWUsICZjcnUwLnJ1X3N0aW1lLCAmc3lzdGltZSk7CisJfSBlbHNlIHsKKwkJdGltZXJzdWIoJnJ1MS5ydV91dGltZSwgJnJ1MC5ydV91dGltZSwgJnVzcnRpbWUpOworCQl0aW1lcmFkZCgmdXNydGltZSwgJmpfdXNydGltZSwgJnVzcnRpbWUpOworCQl0aW1lcnN1YigmcnUxLnJ1X3N0aW1lLCAmcnUwLnJ1X3N0aW1lLCAmc3lzdGltZSk7CisJCXRpbWVyYWRkKCZzeXN0aW1lLCAmal9zeXN0aW1lLCAmc3lzdGltZSk7CisJfQorCisJaWYgKCEodGYgJiBURl9OT1JFQUwpKSB7CisJCXRpbWVyc3ViKCZ0djEsICZ0djAsICZ0djEpOworCQlpZiAodGYgJiBURl9QT1NJWCkKKwkJCXBfdGltZShzaGxfb3V0LCB0cnVlLCB0djEudHZfc2VjLCB0djEudHZfdXNlYywKKwkJCSAgICA1LCAicmVhbCAiLCAiXG4iKTsKKwkJZWxzZQorCQkJcF90aW1lKHNobF9vdXQsIGZhbHNlLCB0djEudHZfc2VjLCB0djEudHZfdXNlYywKKwkJCSAgICA1LCBudWxsLCAiIHJlYWwgIik7CisJfQorCWlmICh0ZiAmIFRGX1BPU0lYKQorCQlwX3RpbWUoc2hsX291dCwgdHJ1ZSwgdXNydGltZS50dl9zZWMsIHVzcnRpbWUudHZfdXNlYywKKwkJICAgIDUsICJ1c2VyICIsICJcbiIpOworCWVsc2UKKwkJcF90aW1lKHNobF9vdXQsIGZhbHNlLCB1c3J0aW1lLnR2X3NlYywgdXNydGltZS50dl91c2VjLAorCQkgICAgNSwgbnVsbCwgIiB1c2VyICIpOworCWlmICh0ZiAmIFRGX1BPU0lYKQorCQlwX3RpbWUoc2hsX291dCwgdHJ1ZSwgc3lzdGltZS50dl9zZWMsIHN5c3RpbWUudHZfdXNlYywKKwkJICAgIDUsICJzeXMgICIsICJcbiIpOworCWVsc2UKKwkJcF90aW1lKHNobF9vdXQsIGZhbHNlLCBzeXN0aW1lLnR2X3NlYywgc3lzdGltZS50dl91c2VjLAorCQkgICAgNSwgbnVsbCwgIiBzeXN0ZW1cbiIpOworCXNoZl9mbHVzaChzaGxfb3V0KTsKKworCXJldHVybiAocnYpOworfQorCit2b2lkCit0aW1leF9ob29rKHN0cnVjdCBvcCAqdCwgY2hhciAqKnZvbGF0aWxlICphcHApCit7CisJY2hhciAqKndwID0gKmFwcDsKKwlpbnQgb3B0YywgaSwgajsKKwlHZXRvcHQgb3B0OworCisJa3NoX2dldG9wdF9yZXNldCgmb3B0LCAwKTsKKwlvcHQub3B0aW5kID0gMDsJLyogc3RhcnQgYXQgdGhlIHN0YXJ0ICovCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCgoY29uc3QgY2hhciAqKil3cCwgJm9wdCwgIjpwIikpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAncCc6CisJCQl0LT5zdHJbMF0gfD0gVEZfUE9TSVg7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQllcnJvcmYoInRpbWU6IC0lcyB1bmtub3duIG9wdGlvbiIsIG9wdC5vcHRhcmcpOworCQljYXNlICc6JzoKKwkJCWVycm9yZigidGltZTogLSVzIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwKKwkJCSAgICBvcHQub3B0YXJnKTsKKwkJfQorCS8qIENvcHkgY29tbWFuZCB3b3JkcyBkb3duIG92ZXIgb3B0aW9ucy4gKi8KKwlpZiAob3B0Lm9wdGluZCAhPSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBvcHQub3B0aW5kOyBpKyspCisJCQlhZnJlZSh3cFtpXSwgQVRFTVApOworCQlmb3IgKGkgPSAwLCBqID0gb3B0Lm9wdGluZDsgKHdwW2ldID0gd3Bbal0pOyBpKyssIGorKykKKwkJCTsKKwl9CisJaWYgKCF3cFswXSkKKwkJdC0+c3RyWzBdIHw9IFRGX05PQVJHUzsKKwkqYXBwID0gd3A7Cit9CisKKy8qIGV4ZWMgd2l0aCBubyBhcmdzIC0gYXJncyBjYXNlIGlzIHRha2VuIGNhcmUgb2YgaW4gY29tZXhlYygpICovCitpbnQKK2NfZXhlYyhjb25zdCBjaGFyICoqd3AgTUtTSF9BX1VOVVNFRCkKK3sKKwlpbnQgaTsKKworCS8qIG1ha2Ugc3VyZSByZWRpcmVjdHMgc3RheSBpbiBwbGFjZSAqLworCWlmIChlLT5zYXZlZmQgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgTlVGSUxFOyBpKyspIHsKKwkJCWlmIChlLT5zYXZlZmRbaV0gPiAwKQorCQkJCWNsb3NlKGUtPnNhdmVmZFtpXSk7CisJCQkvKgorCQkJICoga2VlcCBhbGwgZmlsZSBkZXNjcmlwdG9ycyA+IDIgcHJpdmF0ZSBmb3Iga3NoLAorCQkJICogYnV0IG5vdCBmb3IgUE9TSVggb3IgbGVnYWN5L2tsdWRnZSBzaAorCQkJICovCisJCQlpZiAoIUZsYWcoRlBPU0lYKSAmJiAhRmxhZyhGU0gpICYmIGkgPiAyICYmCisJCQkgICAgZS0+c2F2ZWZkW2ldKQorCQkJCWZjbnRsKGksIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCQl9CisJCWUtPnNhdmVmZCA9IE5VTEw7CisJfQorCXJldHVybiAoMCk7Cit9CisKKyNpZiBIQVZFX01LTk9ECitpbnQKK2NfbWtub2QoY29uc3QgY2hhciAqKndwKQoreworCWludCBhcmdjLCBvcHRjLCBydiA9IDA7CisJYm9vbCBpc21rZmlmbyA9IGZhbHNlOworCWNvbnN0IGNoYXIgKiphcmd2OworCXZvaWQgKnNldCA9IE5VTEw7CisJbW9kZV90IG1vZGUgPSAwLCBvbGRtb2RlID0gMDsKKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgIm06IikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdtJzoKKwkJCXNldCA9IHNldG1vZGUoYnVpbHRpbl9vcHQub3B0YXJnKTsKKwkJCWlmIChzZXQgPT0gTlVMTCkgeworCQkJCWJpX2Vycm9yZigiaW52YWxpZCBmaWxlIG1vZGUiKTsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQkJbW9kZSA9IGdldG1vZGUoc2V0LCAobW9kZV90KShERUZGSUxFTU9ERSkpOworCQkJZnJlZShzZXQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGNfbWtub2RfdXNhZ2U7CisJCX0KKwl9CisJYXJndiA9ICZ3cFtidWlsdGluX29wdC5vcHRpbmRdOworCWlmIChhcmd2WzBdID09IE5VTEwpCisJCWdvdG8gY19ta25vZF91c2FnZTsKKwlmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdOyBhcmdjKyspCisJCTsKKwlpZiAoYXJnYyA9PSAyICYmIGFyZ3ZbMV1bMF0gPT0gJ3AnKQorCQlpc21rZmlmbyA9IHRydWU7CisJZWxzZSBpZiAoYXJnYyAhPSA0IHx8IChhcmd2WzFdWzBdICE9ICdiJyAmJiBhcmd2WzFdWzBdICE9ICdjJykpCisJCWdvdG8gY19ta25vZF91c2FnZTsKKworCWlmIChzZXQgIT0gTlVMTCkKKwkJb2xkbW9kZSA9IHVtYXNrKChtb2RlX3QpMCk7CisJZWxzZQorCQltb2RlID0gREVGRklMRU1PREU7CisKKwltb2RlIHw9IChhcmd2WzFdWzBdID09ICdiJykgPyBTX0lGQkxLIDoKKwkgICAgKGFyZ3ZbMV1bMF0gPT0gJ2MnKSA/IFNfSUZDSFIgOiAwOworCisJaWYgKCFpc21rZmlmbykgeworCQl1bnNpZ25lZCBsb25nIG1ham51bSwgbWlubnVtOworCQlkZXZfdCBkdjsKKwkJY2hhciAqYzsKKworCQltYWpudW0gPSBzdHJ0b3VsKGFyZ3ZbMl0sICZjLCAwKTsKKwkJaWYgKChjID09IGFyZ3ZbMl0pIHx8ICgqYyAhPSAnXDAnKSkgeworCQkJYmlfZXJyb3JmKCJub24tbnVtZXJpYyBkZXZpY2UgbWFqb3IgJyVzJyIsIGFyZ3ZbMl0pOworCQkJZ290byBjX21rbm9kX2VycjsKKwkJfQorCQltaW5udW0gPSBzdHJ0b3VsKGFyZ3ZbM10sICZjLCAwKTsKKwkJaWYgKChjID09IGFyZ3ZbM10pIHx8ICgqYyAhPSAnXDAnKSkgeworCQkJYmlfZXJyb3JmKCJub24tbnVtZXJpYyBkZXZpY2UgbWlub3IgJyVzJyIsIGFyZ3ZbM10pOworCQkJZ290byBjX21rbm9kX2VycjsKKwkJfQorCQlkdiA9IG1ha2VkZXYobWFqbnVtLCBtaW5udW0pOworCQlpZiAoKHVuc2lnbmVkIGxvbmcpKG1ham9yKGR2KSkgIT0gbWFqbnVtKSB7CisJCQliaV9lcnJvcmYoImRldmljZSBtYWpvciB0b28gbGFyZ2U6ICVsdSIsIG1ham51bSk7CisJCQlnb3RvIGNfbWtub2RfZXJyOworCQl9CisJCWlmICgodW5zaWduZWQgbG9uZykobWlub3IoZHYpKSAhPSBtaW5udW0pIHsKKwkJCWJpX2Vycm9yZigiZGV2aWNlIG1pbm9yIHRvbyBsYXJnZTogJWx1IiwgbWlubnVtKTsKKwkJCWdvdG8gY19ta25vZF9lcnI7CisJCX0KKwkJaWYgKG1rbm9kKGFyZ3ZbMF0sIG1vZGUsIGR2KSkKKwkJCWdvdG8gY19ta25vZF9mYWlsZWQ7CisJfSBlbHNlIGlmIChta2ZpZm8oYXJndlswXSwgbW9kZSkpIHsKKyBjX21rbm9kX2ZhaWxlZDoKKwkJYmlfZXJyb3JmKCIlczogJXMiLCAqd3AsIHN0cmVycm9yKGVycm5vKSk7CisgY19ta25vZF9lcnI6CisJCXJ2ID0gMTsKKwl9CisKKwlpZiAoc2V0KQorCQl1bWFzayhvbGRtb2RlKTsKKwlyZXR1cm4gKHJ2KTsKKyBjX21rbm9kX3VzYWdlOgorCWJpX2Vycm9yZigidXNhZ2U6IG1rbm9kIFstbSBtb2RlXSBuYW1lIGJ8YyBtYWpvciBtaW5vciIpOworCWJpX2Vycm9yZigidXNhZ2U6IG1rbm9kIFstbSBtb2RlXSBuYW1lIHAiKTsKKwlyZXR1cm4gKDEpOworfQorI2VuZGlmCisKKy8qIGR1bW15IGZ1bmN0aW9uLCBzcGVjaWFsIGNhc2UgaW4gY29tZXhlYygpICovCitpbnQKK2NfYnVpbHRpbihjb25zdCBjaGFyICoqd3AgTUtTSF9BX1VOVVNFRCkKK3sKKwlyZXR1cm4gKDApOworfQorCisvKiB0ZXN0KDEpIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBncmFtbWFyOgorCW9leHByCTo6PSBhZXhwciB8IGFleHByICItbyIgb2V4cHIgOworCWFleHByCTo6PSBuZXhwciB8IG5leHByICItYSIgYWV4cHIgOworCW5leHByCTo6PSBwcmltYXJ5IHwgIiEiIG5leHByIDsKKwlwcmltYXJ5CTo6PSB1bmFyeS1vcGVyYXRvciBvcGVyYW5kCisJCXwgb3BlcmFuZCBiaW5hcnktb3BlcmF0b3Igb3BlcmFuZAorCQl8IG9wZXJhbmQKKwkJfCAiKCIgb2V4cHIgIikiCisJCTsKKworCXVuYXJ5LW9wZXJhdG9yIDo6PSAiLWEifCItciJ8Ii13InwiLXgifCItZSJ8Ii1mInwiLWQifCItYyJ8Ii1iInwiLXAifAorCQkJICAgIi11InwiLWcifCItayJ8Ii1zInwiLXQifCIteiJ8Ii1uInwiLW8ifCItTyJ8Ii1HInwKKwkJCSAgICItTCJ8Ii1oInwiLVMifCItSCI7CisKKwliaW5hcnktb3BlcmF0b3IgOjo9ICI9InwiPT0ifCIhPSJ8Ii1lcSJ8Ii1uZSJ8Ii1nZSJ8Ii1ndCJ8Ii1sZSJ8Ii1sdCJ8CisJCQkgICAgIi1udCJ8Ii1vdCJ8Ii1lZiJ8CisJCQkgICAgIjwifCI+IgkjIHJ1bGVzIHVzZWQgZm9yIFtbIC4uIF1dIGV4cHJlc3Npb25zCisJCQkgICAgOworCW9wZXJhbmQgOjo9IDxhbnkgdGhpbmc+CisqLworCisjZGVmaW5lIFRfRVJSX0VYSVQJMgkvKiBQT1NJWCBzYXlzID4gMSBmb3IgZXJyb3JzICovCisKK2ludAorY190ZXN0KGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgYXJnYywgcmVzOworCVRlc3RfZW52IHRlOworCisJdGUuZmxhZ3MgPSAwOworCXRlLmlzYSA9IHB0ZXN0X2lzYTsKKwl0ZS5nZXRvcG5kID0gcHRlc3RfZ2V0b3BuZDsKKwl0ZS5ldmFsID0gdGVzdF9ldmFsOworCXRlLmVycm9yID0gcHRlc3RfZXJyb3I7CisKKwlmb3IgKGFyZ2MgPSAwOyB3cFthcmdjXTsgYXJnYysrKQorCQk7CisKKwlpZiAoc3RyY21wKHdwWzBdLCAiWyIpID09IDApIHsKKwkJaWYgKHN0cmNtcCh3cFstLWFyZ2NdLCAiXSIpICE9IDApIHsKKwkJCWJpX2Vycm9yZigibWlzc2luZyBdIik7CisJCQlyZXR1cm4gKFRfRVJSX0VYSVQpOworCQl9CisJfQorCisJdGUucG9zLndwID0gd3AgKyAxOworCXRlLndwX2VuZCA9IHdwICsgYXJnYzsKKworCS8qCisJICogSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2VzIGZyb20gUE9TSVguMiwgc2VjdGlvbiA0LjYyLjQuCisJICogSW1wbGVtZW50YXRpb24gb2YgYWxsIHRoZSBydWxlcyBpc24ndCBuZWNlc3Nhcnkgc2luY2UKKwkgKiBvdXIgcGFyc2VyIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGZvciB0aGUgb21pdHRlZCBzdGVwcy4KKwkgKi8KKwlpZiAoYXJnYyA8PSA1KSB7CisJCWNvbnN0IGNoYXIgKipvd3AgPSB3cDsKKwkJaW50IGludmVydCA9IDA7CisJCVRlc3Rfb3Agb3A7CisJCWNvbnN0IGNoYXIgKm9wbmQxLCAqb3BuZDI7CisKKwkJd2hpbGUgKC0tYXJnYyA+PSAwKSB7CisJCQlpZiAoKCp0ZS5pc2EpKCZ0ZSwgVE1fRU5EKSkKKwkJCQlyZXR1cm4gKCEwKTsKKwkJCWlmIChhcmdjID09IDMpIHsKKwkJCQlvcG5kMSA9ICgqdGUuZ2V0b3BuZCkoJnRlLCBUT19OT05PUCwgMSk7CisJCQkJaWYgKChvcCA9ICgqdGUuaXNhKSgmdGUsIFRNX0JJTk9QKSkpIHsKKwkJCQkJb3BuZDIgPSAoKnRlLmdldG9wbmQpKCZ0ZSwgb3AsIDEpOworCQkJCQlyZXMgPSAoKnRlLmV2YWwpKCZ0ZSwgb3AsIG9wbmQxLAorCQkJCQkgICAgb3BuZDIsIDEpOworCQkJCQlpZiAodGUuZmxhZ3MgJiBURUZfRVJST1IpCisJCQkJCQlyZXR1cm4gKFRfRVJSX0VYSVQpOworCQkJCQlpZiAoaW52ZXJ0ICYgMSkKKwkJCQkJCXJlcyA9ICFyZXM7CisJCQkJCXJldHVybiAoIXJlcyk7CisJCQkJfQorCQkJCS8qIGJhY2sgdXAgdG8gb3BuZDEgKi8KKwkJCQl0ZS5wb3Mud3AtLTsKKwkJCX0KKwkJCWlmIChhcmdjID09IDEpIHsKKwkJCQlvcG5kMSA9ICgqdGUuZ2V0b3BuZCkoJnRlLCBUT19OT05PUCwgMSk7CisJCQkJaWYgKHN0cmNtcChvcG5kMSwgIi10IikgPT0gMCkKKwkJCQkgICAgYnJlYWs7CisJCQkJcmVzID0gKCp0ZS5ldmFsKSgmdGUsIFRPX1NUTlpFLCBvcG5kMSwKKwkJCQkgICAgTlVMTCwgMSk7CisJCQkJaWYgKGludmVydCAmIDEpCisJCQkJCXJlcyA9ICFyZXM7CisJCQkJcmV0dXJuICghcmVzKTsKKwkJCX0KKwkJCWlmICgoKnRlLmlzYSkoJnRlLCBUTV9OT1QpKSB7CisJCQkJaW52ZXJ0Kys7CisJCQl9IGVsc2UKKwkJCQlicmVhazsKKwkJfQorCQl0ZS5wb3Mud3AgPSBvd3AgKyAxOworCX0KKworCXJldHVybiAodGVzdF9wYXJzZSgmdGUpKTsKK30KKworLyoKKyAqIEdlbmVyaWMgdGVzdCByb3V0aW5lcy4KKyAqLworCitUZXN0X29wCit0ZXN0X2lzb3AoVGVzdF9tZXRhIG1ldGEsIGNvbnN0IGNoYXIgKnMpCit7CisJY2hhciBzYzE7CisJY29uc3Qgc3RydWN0IHRfb3AgKnRibDsKKworCXRibCA9IG1ldGEgPT0gVE1fVU5PUCA/IHVfb3BzIDogYl9vcHM7CisJaWYgKCpzKSB7CisJCXNjMSA9IHNbMV07CisJCWZvciAoOyB0YmwtPm9wX3RleHRbMF07IHRibCsrKQorCQkJaWYgKHNjMSA9PSB0YmwtPm9wX3RleHRbMV0gJiYgIXN0cmNtcChzLCB0YmwtPm9wX3RleHQpKQorCQkJCXJldHVybiAodGJsLT5vcF9udW0pOworCX0KKwlyZXR1cm4gKFRPX05PTk9QKTsKK30KKworaW50Cit0ZXN0X2V2YWwoVGVzdF9lbnYgKnRlLCBUZXN0X29wIG9wLCBjb25zdCBjaGFyICpvcG5kMSwgY29uc3QgY2hhciAqb3BuZDIsCisgICAgYm9vbCBkb19ldmFsKQoreworCWludCBpLCBzOworCXNpemVfdCBrOworCXN0cnVjdCBzdGF0IGIxLCBiMjsKKwlta3NoX2FyaV90IHYxLCB2MjsKKworCWlmICghZG9fZXZhbCkKKwkJcmV0dXJuICgwKTsKKworCXN3aXRjaCAoKGludClvcCkgeworCS8qCisJICogVW5hcnkgT3BlcmF0b3JzCisJICovCisJY2FzZSBUT19TVE5aRTogLyogLW4gKi8KKwkJcmV0dXJuICgqb3BuZDEgIT0gJ1wwJyk7CisJY2FzZSBUT19TVFpFUjogLyogLXogKi8KKwkJcmV0dXJuICgqb3BuZDEgPT0gJ1wwJyk7CisJY2FzZSBUT19PUFRJT046IC8qIC1vICovCisJCWlmICgoaSA9ICpvcG5kMSkgPT0gJyEnIHx8IGkgPT0gJz8nKQorCQkJb3BuZDErKzsKKwkJaWYgKChrID0gb3B0aW9uKG9wbmQxKSkgPT0gKHNpemVfdCktMSkKKwkJCXJldHVybiAoMCk7CisJCXJldHVybiAoaSA9PSAnPycgPyAxIDogaSA9PSAnIScgPyAhRmxhZyhrKSA6IEZsYWcoaykpOworCWNhc2UgVE9fRklMUkQ6IC8qIC1yICovCisJCXJldHVybiAodGVzdF9lYWNjZXNzKG9wbmQxLCBSX09LKSA9PSAwKTsKKwljYXNlIFRPX0ZJTFdSOiAvKiAtdyAqLworCQlyZXR1cm4gKHRlc3RfZWFjY2VzcyhvcG5kMSwgV19PSykgPT0gMCk7CisJY2FzZSBUT19GSUxFWDogLyogLXggKi8KKwkJcmV0dXJuICh0ZXN0X2VhY2Nlc3Mob3BuZDEsIFhfT0spID09IDApOworCWNhc2UgVE9fRklMQVhTVDogLyogLWEgKi8KKwljYXNlIFRPX0ZJTEVYU1Q6IC8qIC1lICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwKTsKKwljYXNlIFRPX0ZJTFJFRzogLyogLXIgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU1JFRyhiMS5zdF9tb2RlKSk7CisJY2FzZSBUT19GSUxJRDogLyogLWQgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU0RJUihiMS5zdF9tb2RlKSk7CisJY2FzZSBUT19GSUxDREVWOiAvKiAtYyAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBTX0lTQ0hSKGIxLnN0X21vZGUpKTsKKwljYXNlIFRPX0ZJTEJERVY6IC8qIC1iICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNCTEsoYjEuc3RfbW9kZSkpOworCWNhc2UgVE9fRklMRklGTzogLyogLXAgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU0ZJRk8oYjEuc3RfbW9kZSkpOworCWNhc2UgVE9fRklMU1lNOiAvKiAtaCAtTCAqLworCQlyZXR1cm4gKGxzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU0xOSyhiMS5zdF9tb2RlKSk7CisJY2FzZSBUT19GSUxTT0NLOiAvKiAtUyAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBTX0lTU09DSyhiMS5zdF9tb2RlKSk7CisJY2FzZSBUT19GSUxDREY6LyogLUggSFAgY29udGV4dCBkZXBlbmRlbnQgZmlsZXMgKGRpcmVjdG9yaWVzKSAqLworCQlyZXR1cm4gKDApOworCWNhc2UgVE9fRklMU0VUVTogLyogLXUgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYKKwkJICAgIChiMS5zdF9tb2RlICYgU19JU1VJRCkgPT0gU19JU1VJRCk7CisJY2FzZSBUT19GSUxTRVRHOiAvKiAtZyAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJgorCQkgICAgKGIxLnN0X21vZGUgJiBTX0lTR0lEKSA9PSBTX0lTR0lEKTsKKwljYXNlIFRPX0ZJTFNUQ0s6IC8qIC1rICovCisjaWZkZWYgU19JU1ZUWAorCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJgorCQkgICAgKGIxLnN0X21vZGUgJiBTX0lTVlRYKSA9PSBTX0lTVlRYKTsKKyNlbHNlCisJCXJldHVybiAoMCk7CisjZW5kaWYKKwljYXNlIFRPX0ZJTEdaOiAvKiAtcyAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBiMS5zdF9zaXplID4gMEwpOworCWNhc2UgVE9fRklMVFQ6IC8qIC10ICovCisJCWlmIChvcG5kMSAmJiAhYmlfZ2V0bihvcG5kMSwgJmkpKSB7CisJCQl0ZS0+ZmxhZ3MgfD0gVEVGX0VSUk9SOworCQkJaSA9IDA7CisJCX0gZWxzZQorCQkJaSA9IGlzYXR0eShvcG5kMSA/IGkgOiAwKTsKKwkJcmV0dXJuIChpKTsKKwljYXNlIFRPX0ZJTFVJRDogLyogLU8gKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgYjEuc3RfdWlkID09IGtzaGV1aWQpOworCWNhc2UgVE9fRklMR0lEOiAvKiAtRyAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBiMS5zdF9naWQgPT0gZ2V0ZWdpZCgpKTsKKwkvKgorCSAqIEJpbmFyeSBPcGVyYXRvcnMKKwkgKi8KKwljYXNlIFRPX1NURVFMOiAvKiA9ICovCisJCWlmICh0ZS0+ZmxhZ3MgJiBURUZfREJSQUNLRVQpCisJCQlyZXR1cm4gKGdtYXRjaHgob3BuZDEsIG9wbmQyLCBmYWxzZSkpOworCQlyZXR1cm4gKHN0cmNtcChvcG5kMSwgb3BuZDIpID09IDApOworCWNhc2UgVE9fU1RORVE6IC8qICE9ICovCisJCWlmICh0ZS0+ZmxhZ3MgJiBURUZfREJSQUNLRVQpCisJCQlyZXR1cm4gKCFnbWF0Y2h4KG9wbmQxLCBvcG5kMiwgZmFsc2UpKTsKKwkJcmV0dXJuIChzdHJjbXAob3BuZDEsIG9wbmQyKSAhPSAwKTsKKwljYXNlIFRPX1NUTFQ6IC8qIDwgKi8KKwkJcmV0dXJuIChzdHJjbXAob3BuZDEsIG9wbmQyKSA8IDApOworCWNhc2UgVE9fU1RHVDogLyogPiAqLworCQlyZXR1cm4gKHN0cmNtcChvcG5kMSwgb3BuZDIpID4gMCk7CisJY2FzZSBUT19JTlRFUTogLyogLWVxICovCisJY2FzZSBUT19JTlRORTogLyogLW5lICovCisJY2FzZSBUT19JTlRHRTogLyogLWdlICovCisJY2FzZSBUT19JTlRHVDogLyogLWd0ICovCisJY2FzZSBUT19JTlRMRTogLyogLWxlICovCisJY2FzZSBUT19JTlRMVDogLyogLWx0ICovCisJCWlmICghZXZhbHVhdGUob3BuZDEsICZ2MSwgS1NIX1JFVFVSTl9FUlJPUiwgZmFsc2UpIHx8CisJCSAgICAhZXZhbHVhdGUob3BuZDIsICZ2MiwgS1NIX1JFVFVSTl9FUlJPUiwgZmFsc2UpKSB7CisJCQkvKiBlcnJvciBhbHJlYWR5IHByaW50ZWQuLiAqLworCQkJdGUtPmZsYWdzIHw9IFRFRl9FUlJPUjsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJc3dpdGNoICgoaW50KW9wKSB7CisJCWNhc2UgVE9fSU5URVE6CisJCQlyZXR1cm4gKHYxID09IHYyKTsKKwkJY2FzZSBUT19JTlRORToKKwkJCXJldHVybiAodjEgIT0gdjIpOworCQljYXNlIFRPX0lOVEdFOgorCQkJcmV0dXJuICh2MSA+PSB2Mik7CisJCWNhc2UgVE9fSU5UR1Q6CisJCQlyZXR1cm4gKHYxID4gdjIpOworCQljYXNlIFRPX0lOVExFOgorCQkJcmV0dXJuICh2MSA8PSB2Mik7CisJCWNhc2UgVE9fSU5UTFQ6CisJCQlyZXR1cm4gKHYxIDwgdjIpOworCQl9CisJY2FzZSBUT19GSUxOVDogLyogLW50ICovCisJCS8qIGtzaDg4L2tzaDkzIHN1Y2NlZWQgaWYgZmlsZTIgY2FuJ3QgYmUgc3RhdGVkCisJCSAqIChzdWJ0bHkgZGlmZmVyZW50IGZyb20gJ2RvZXMgbm90IGV4aXN0JykuCisJCSAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJgorCQkgICAgKCgocyA9IHN0YXQob3BuZDIsICZiMikpID09IDAgJiYKKwkJICAgIGIxLnN0X210aW1lID4gYjIuc3RfbXRpbWUpIHx8IHMgPCAwKSk7CisJY2FzZSBUT19GSUxPVDogLyogLW90ICovCisJCS8qIGtzaDg4L2tzaDkzIHN1Y2NlZWQgaWYgZmlsZTEgY2FuJ3QgYmUgc3RhdGVkCisJCSAqIChzdWJ0bHkgZGlmZmVyZW50IGZyb20gJ2RvZXMgbm90IGV4aXN0JykuCisJCSAqLworCQlyZXR1cm4gKHN0YXQob3BuZDIsICZiMikgPT0gMCAmJgorCQkgICAgKCgocyA9IHN0YXQob3BuZDEsICZiMSkpID09IDAgJiYKKwkJICAgIGIxLnN0X210aW1lIDwgYjIuc3RfbXRpbWUpIHx8IHMgPCAwKSk7CisJY2FzZSBUT19GSUxFUTogLyogLWVmICovCisJCXJldHVybiAoc3RhdCAob3BuZDEsICZiMSkgPT0gMCAmJiBzdGF0IChvcG5kMiwgJmIyKSA9PSAwICYmCisJCSAgICBiMS5zdF9kZXYgPT0gYjIuc3RfZGV2ICYmIGIxLnN0X2lubyA9PSBiMi5zdF9pbm8pOworCX0KKwkoKnRlLT5lcnJvcikodGUsIDAsICJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBvcCIpOworCXJldHVybiAoMSk7Cit9CisKKy8qIE9uIG1vc3QvYWxsIHVuaXhlbiwgYWNjZXNzKCkgc2F5cyBldmVyeXRoaW5nIGlzIGV4ZWN1dGFibGUgZm9yIHJvb3QuLi4gKi8KK3N0YXRpYyBpbnQKK3Rlc3RfZWFjY2Vzcyhjb25zdCBjaGFyICpwYXRobCwgaW50IG1vZGUpCit7CisJaW50IHJ2OworCisJaWYgKChydiA9IGFjY2VzcyhwYXRobCwgbW9kZSkpID09IDAgJiYga3NoZXVpZCA9PSAwICYmIChtb2RlICYgWF9PSykpIHsKKwkJc3RydWN0IHN0YXQgc3RhdGI7CisKKwkJaWYgKHN0YXQocGF0aGwsICZzdGF0YikgPCAwKQorCQkJcnYgPSAtMTsKKwkJZWxzZSBpZiAoU19JU0RJUihzdGF0Yi5zdF9tb2RlKSkKKwkJCXJ2ID0gMDsKKwkJZWxzZQorCQkJcnYgPSAoc3RhdGIuc3RfbW9kZSAmIChTX0lYVVNSfFNfSVhHUlB8U19JWE9USCkpID8KKwkJCSAgICAwIDogLTE7CisJfQorCXJldHVybiAocnYpOworfQorCitpbnQKK3Rlc3RfcGFyc2UoVGVzdF9lbnYgKnRlKQoreworCWludCBydjsKKworCXJ2ID0gdGVzdF9vZXhwcih0ZSwgMSk7CisKKwlpZiAoISh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpICYmICEoKnRlLT5pc2EpKHRlLCBUTV9FTkQpKQorCQkoKnRlLT5lcnJvcikodGUsIDAsICJ1bmV4cGVjdGVkIG9wZXJhdG9yL29wZXJhbmQiKTsKKworCXJldHVybiAoKHRlLT5mbGFncyAmIFRFRl9FUlJPUikgPyBUX0VSUl9FWElUIDogIXJ2KTsKK30KKworc3RhdGljIGludAordGVzdF9vZXhwcihUZXN0X2VudiAqdGUsIGJvb2wgZG9fZXZhbCkKK3sKKwlpbnQgcnY7CisKKwlpZiAoKHJ2ID0gdGVzdF9hZXhwcih0ZSwgZG9fZXZhbCkpKQorCQlkb19ldmFsID0gZmFsc2U7CisJaWYgKCEodGUtPmZsYWdzICYgVEVGX0VSUk9SKSAmJiAoKnRlLT5pc2EpKHRlLCBUTV9PUikpCisJCXJldHVybiAodGVzdF9vZXhwcih0ZSwgZG9fZXZhbCkgfHwgcnYpOworCXJldHVybiAocnYpOworfQorCitzdGF0aWMgaW50Cit0ZXN0X2FleHByKFRlc3RfZW52ICp0ZSwgYm9vbCBkb19ldmFsKQoreworCWludCBydjsKKworCWlmICghKHJ2ID0gdGVzdF9uZXhwcih0ZSwgZG9fZXZhbCkpKQorCQlkb19ldmFsID0gZmFsc2U7CisJaWYgKCEodGUtPmZsYWdzICYgVEVGX0VSUk9SKSAmJiAoKnRlLT5pc2EpKHRlLCBUTV9BTkQpKQorCQlyZXR1cm4gKHRlc3RfYWV4cHIodGUsIGRvX2V2YWwpICYmIHJ2KTsKKwlyZXR1cm4gKHJ2KTsKK30KKworc3RhdGljIGludAordGVzdF9uZXhwcihUZXN0X2VudiAqdGUsIGJvb2wgZG9fZXZhbCkKK3sKKwlpZiAoISh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpICYmICgqdGUtPmlzYSkodGUsIFRNX05PVCkpCisJCXJldHVybiAoIXRlc3RfbmV4cHIodGUsIGRvX2V2YWwpKTsKKwlyZXR1cm4gKHRlc3RfcHJpbWFyeSh0ZSwgZG9fZXZhbCkpOworfQorCitzdGF0aWMgaW50Cit0ZXN0X3ByaW1hcnkoVGVzdF9lbnYgKnRlLCBib29sIGRvX2V2YWwpCit7CisJY29uc3QgY2hhciAqb3BuZDEsICpvcG5kMjsKKwlpbnQgcnY7CisJVGVzdF9vcCBvcDsKKworCWlmICh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpCisJCXJldHVybiAoMCk7CisJaWYgKCgqdGUtPmlzYSkodGUsIFRNX09QQVJFTikpIHsKKwkJcnYgPSB0ZXN0X29leHByKHRlLCBkb19ldmFsKTsKKwkJaWYgKHRlLT5mbGFncyAmIFRFRl9FUlJPUikKKwkJCXJldHVybiAoMCk7CisJCWlmICghKCp0ZS0+aXNhKSh0ZSwgVE1fQ1BBUkVOKSkgeworCQkJKCp0ZS0+ZXJyb3IpKHRlLCAwLCAibWlzc2luZyBjbG9zaW5nIHBhcmVuIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJCXJldHVybiAocnYpOworCX0KKwkvKgorCSAqIEJpbmFyeSBzaG91bGQgaGF2ZSBwcmVjZWRlbmNlIG92ZXIgdW5hcnkgaW4gdGhpcyBjYXNlCisJICogc28gdGhhdCBzb21ldGhpbmcgbGlrZSB0ZXN0IFwoIC1mID0gLWYgXCkgaXMgYWNjZXB0ZWQKKwkgKi8KKwlpZiAoKHRlLT5mbGFncyAmIFRFRl9EQlJBQ0tFVCkgfHwgKCZ0ZS0+cG9zLndwWzFdIDwgdGUtPndwX2VuZCAmJgorCSAgICAhdGVzdF9pc29wKFRNX0JJTk9QLCB0ZS0+cG9zLndwWzFdKSkpIHsKKwkJaWYgKChvcCA9ICgqdGUtPmlzYSkodGUsIFRNX1VOT1ApKSkgeworCQkJLyogdW5hcnkgZXhwcmVzc2lvbiAqLworCQkJb3BuZDEgPSAoKnRlLT5nZXRvcG5kKSh0ZSwgb3AsIGRvX2V2YWwpOworCQkJaWYgKCFvcG5kMSkgeworCQkJCSgqdGUtPmVycm9yKSh0ZSwgLTEsICJtaXNzaW5nIGFyZ3VtZW50Iik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKworCQkJcmV0dXJuICgoKnRlLT5ldmFsKSh0ZSwgb3AsIG9wbmQxLCBOVUxMLCBkb19ldmFsKSk7CisJCX0KKwl9CisJb3BuZDEgPSAoKnRlLT5nZXRvcG5kKSh0ZSwgVE9fTk9OT1AsIGRvX2V2YWwpOworCWlmICghb3BuZDEpIHsKKwkJKCp0ZS0+ZXJyb3IpKHRlLCAwLCAiZXhwcmVzc2lvbiBleHBlY3RlZCIpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoKG9wID0gKCp0ZS0+aXNhKSh0ZSwgVE1fQklOT1ApKSkgeworCQkvKiBiaW5hcnkgZXhwcmVzc2lvbiAqLworCQlvcG5kMiA9ICgqdGUtPmdldG9wbmQpKHRlLCBvcCwgZG9fZXZhbCk7CisJCWlmICghb3BuZDIpIHsKKwkJCSgqdGUtPmVycm9yKSh0ZSwgLTEsICJtaXNzaW5nIHNlY29uZCBhcmd1bWVudCIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCXJldHVybiAoKCp0ZS0+ZXZhbCkodGUsIG9wLCBvcG5kMSwgb3BuZDIsIGRvX2V2YWwpKTsKKwl9CisJcmV0dXJuICgoKnRlLT5ldmFsKSh0ZSwgVE9fU1ROWkUsIG9wbmQxLCBOVUxMLCBkb19ldmFsKSk7Cit9CisKKy8qCisgKiBQbGFpbiB0ZXN0ICh0ZXN0IGFuZCBbIC4uIF0pIHNwZWNpZmljIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBUZXN0IGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGEgd2hhdGV2ZXIuIEFjY2VwdHMgdGhlIGN1cnJlbnQgdG9rZW4gaWYKKyAqIGl0IGlzLiBSZXR1cm5zIDAgaWYgaXQgaXMgbm90LCBub24temVybyBpZiBpdCBpcyAoaW4gdGhlIGNhc2Ugb2YKKyAqIFRNX1VOT1AgYW5kIFRNX0JJTk9QLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBUZXN0X29wKS4KKyAqLworc3RhdGljIFRlc3Rfb3AKK3B0ZXN0X2lzYShUZXN0X2VudiAqdGUsIFRlc3RfbWV0YSBtZXRhKQoreworCS8qIE9yZGVyIGltcG9ydGFudCAtIGluZGV4ZWQgYnkgVGVzdF9tZXRhIHZhbHVlcyAqLworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0b2tlbnNbXSA9IHsKKwkJIi1vIiwgIi1hIiwgIiEiLCAiKCIsICIpIgorCX07CisJVGVzdF9vcCBydjsKKworCWlmICh0ZS0+cG9zLndwID49IHRlLT53cF9lbmQpCisJCXJldHVybiAobWV0YSA9PSBUTV9FTkQgPyBUT19OT05OVUxMIDogVE9fTk9OT1ApOworCisJaWYgKG1ldGEgPT0gVE1fVU5PUCB8fCBtZXRhID09IFRNX0JJTk9QKQorCQlydiA9IHRlc3RfaXNvcChtZXRhLCAqdGUtPnBvcy53cCk7CisJZWxzZSBpZiAobWV0YSA9PSBUTV9FTkQpCisJCXJ2ID0gVE9fTk9OT1A7CisJZWxzZQorCQlydiA9ICFzdHJjbXAoKnRlLT5wb3Mud3AsIHRva2Vuc1soaW50KW1ldGFdKSA/CisJCSAgICBUT19OT05OVUxMIDogVE9fTk9OT1A7CisKKwkvKiBBY2NlcHQgdGhlIHRva2VuPyAqLworCWlmIChydiAhPSBUT19OT05PUCkKKwkJdGUtPnBvcy53cCsrOworCisJcmV0dXJuIChydik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3B0ZXN0X2dldG9wbmQoVGVzdF9lbnYgKnRlLCBUZXN0X29wIG9wLCBib29sIGRvX2V2YWwgTUtTSF9BX1VOVVNFRCkKK3sKKwlpZiAodGUtPnBvcy53cCA+PSB0ZS0+d3BfZW5kKQorCQlyZXR1cm4gKG9wID09IFRPX0ZJTFRUID8gIjEiIDogTlVMTCk7CisJcmV0dXJuICgqdGUtPnBvcy53cCsrKTsKK30KKworc3RhdGljIHZvaWQKK3B0ZXN0X2Vycm9yKFRlc3RfZW52ICp0ZSwgaW50IG9mcywgY29uc3QgY2hhciAqbXNnKQoreworCWNvbnN0IGNoYXIgKm9wOworCisJdGUtPmZsYWdzIHw9IFRFRl9FUlJPUjsKKwlpZiAoKG9wID0gdGUtPnBvcy53cCArIG9mcyA+PSB0ZS0+d3BfZW5kID8gTlVMTCA6IHRlLT5wb3Mud3Bbb2ZzXSkpCisJCWJpX2Vycm9yZigiJXM6ICVzIiwgb3AsIG1zZyk7CisJZWxzZQorCQliaV9lcnJvcmYoIiVzIiwgbXNnKTsKK30KKworI2lmbmRlZiBNS1NIX05PX0xJTUlUUworI2RlZmluZSBTT0ZUCTB4MQorI2RlZmluZSBIQVJECTB4MgorCitzdHJ1Y3QgbGltaXRzIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCByZXNvdXJjZTsJCS8qIHJlc291cmNlIHRvIGdldC9zZXQgKi8KKwlpbnQgZmFjdG9yOwkJLyogbXVsdGlwbHkgYnkgdG8gZ2V0IHJsaW1fe2N1cixtYXh9IHZhbHVlcyAqLworCWNoYXIgb3B0aW9uOworfTsKKworc3RhdGljIHZvaWQgcHJpbnRfdWxpbWl0KGNvbnN0IHN0cnVjdCBsaW1pdHMgKiwgaW50KTsKK3N0YXRpYyBpbnQgc2V0X3VsaW1pdChjb25zdCBzdHJ1Y3QgbGltaXRzICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworLyogTWFnaWMgdG8gZGl2aW5lIHRoZSAnbScgYW5kICd2JyBsaW1pdHMgKi8KKworI2lmZGVmIFJMSU1JVF9BUworI2lmICFkZWZpbmVkKFJMSU1JVF9WTUVNKSB8fCAoUkxJTUlUX1ZNRU0gPT0gUkxJTUlUX0FTKSB8fCBcCisgICAgIWRlZmluZWQoUkxJTUlUX1JTUykgfHwgKFJMSU1JVF9WTUVNID09IFJMSU1JVF9SU1MpCisjZGVmaW5lIFVMSU1JVF9WX0lTX0FTCisjZWxpZiBkZWZpbmVkKFJMSU1JVF9WTUVNKQorI2lmICFkZWZpbmVkKFJMSU1JVF9SU1MpIHx8IChSTElNSVRfUlNTID09IFJMSU1JVF9BUykKKyNkZWZpbmUgVUxJTUlUX1ZfSVNfQVMKKyNlbHNlCisjZGVmaW5lIFVMSU1JVF9WX0lTX1ZNRU0KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFJMSU1JVF9SU1MKKyNpZmRlZiBVTElNSVRfVl9JU19WTUVNCisjZGVmaW5lIFVMSU1JVF9NX0lTX1JTUworI2VsaWYgZGVmaW5lZChSTElNSVRfVk1FTSkgJiYgKFJMSU1JVF9WTUVNID09IFJMSU1JVF9SU1MpCisjZGVmaW5lIFVMSU1JVF9NX0lTX1ZNRU0KKyNlbHNlCisjZGVmaW5lIFVMSU1JVF9NX0lTX1JTUworI2VuZGlmCisjaWYgZGVmaW5lZChVTElNSVRfTV9JU19SU1MpICYmIGRlZmluZWQoUkxJTUlUX0FTKSAmJiAoUkxJTUlUX1JTUyA9PSBSTElNSVRfQVMpCisjdW5kZWYgVUxJTUlUX01fSVNfUlNTCisjZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUkxJTUlUX0FTKSAmJiAhZGVmaW5lZChVTElNSVRfTV9JU19WTUVNKSAmJiBkZWZpbmVkKFJMSU1JVF9WTUVNKQorI2RlZmluZSBVTElNSVRfVl9JU19WTUVNCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFVMSU1JVF9WX0lTX1ZNRU0pICYmIGRlZmluZWQoUkxJTUlUX1ZNRU0pICYmIFwKKyAgICAoIWRlZmluZWQoUkxJTUlUX1JTUykgfHwgKGRlZmluZWQoUkxJTUlUX0FTKSAmJiAoUkxJTUlUX1JTUyA9PSBSTElNSVRfQVMpKSkKKyNkZWZpbmUgVUxJTUlUX01fSVNfVk1FTQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVMSU1JVF9NX0lTX1ZNRU0pICYmIGRlZmluZWQoUkxJTUlUX0FTKSAmJiBcCisgICAgKFJMSU1JVF9WTUVNID09IFJMSU1JVF9BUykKKyN1bmRlZiBVTElNSVRfTV9JU19WTUVNCisjZW5kaWYKKworCitpbnQKK2NfdWxpbWl0KGNvbnN0IGNoYXIgKip3cCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGxpbWl0cyBsaW1pdHNbXSA9IHsKKwkJLyogZG8gbm90IHVzZSBvcHRpb25zIC1ILCAtUyBvciAtYSBvciBjaGFuZ2UgdGhlIG9yZGVyICovCisjaWZkZWYgUkxJTUlUX0NQVQorCQl7ICJ0aW1lKGNwdS1zZWNvbmRzKSIsIFJMSU1JVF9DUFUsIDEsICd0JyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0ZTSVpFCisJCXsgImZpbGUoYmxvY2tzKSIsIFJMSU1JVF9GU0laRSwgNTEyLCAnZicgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9DT1JFCisJCXsgImNvcmVkdW1wKGJsb2NrcykiLCBSTElNSVRfQ09SRSwgNTEyLCAnYycgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9EQVRBCisJCXsgImRhdGEoS2lCKSIsIFJMSU1JVF9EQVRBLCAxMDI0LCAnZCcgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9TVEFDSworCQl7ICJzdGFjayhLaUIpIiwgUkxJTUlUX1NUQUNLLCAxMDI0LCAncycgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9NRU1MT0NLCisJCXsgImxvY2tlZG1lbShLaUIpIiwgUkxJTUlUX01FTUxPQ0ssIDEwMjQsICdsJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05PRklMRQorCQl7ICJub2ZpbGVzKGRlc2NyaXB0b3JzKSIsIFJMSU1JVF9OT0ZJTEUsIDEsICduJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05QUk9DCisJCXsgInByb2Nlc3NlcyIsIFJMSU1JVF9OUFJPQywgMSwgJ3AnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfU1dBUAorCQl7ICJzd2FwKEtpQikiLCBSTElNSVRfU1dBUCwgMTAyNCwgJ3cnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTE9DS1MKKwkJeyAiZmxvY2tzIiwgUkxJTUlUX0xPQ0tTLCAtMSwgJ0wnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfVElNRQorCQl7ICJodW1hbnRpbWUoc2Vjb25kcykiLCBSTElNSVRfVElNRSwgMSwgJ1QnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTk9WTU9OCisJCXsgInZub2RlbW9uaXRvcnMiLCBSTElNSVRfTk9WTU9OLCAxLCAnVicgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9TSUdQRU5ESU5HCisJCXsgInNpZ3BlbmRpbmciLCBSTElNSVRfU0lHUEVORElORywgMSwgJ2knIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTVNHUVVFVUUKKwkJeyAibXNncXVldWUoYnl0ZXMpIiwgUkxJTUlUX01TR1FVRVVFLCAxLCAncScgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9BSU9fTUVNCisJCXsgIkFJT2xvY2tlZG1lbShLaUIpIiwgUkxJTUlUX0FJT19NRU0sIDEwMjQsICdNJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0FJT19PUFMKKwkJeyAiQUlPb3BlcmF0aW9ucyIsIFJMSU1JVF9BSU9fT1BTLCAxLCAnTycgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9UQ0FDSEUKKwkJeyAiY2FjaGVkdGhyZWFkcyIsIFJMSU1JVF9UQ0FDSEUsIDEsICdDJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1NCU0laRQorCQl7ICJzb2NrYnVmc2l6KEtpQikiLCBSTElNSVRfU0JTSVpFLCAxMDI0LCAnQicgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9QVEhSRUFECisJCXsgInRocmVhZHNwZXJwcm9jZXNzIiwgUkxJTUlUX1BUSFJFQUQsIDEsICdQJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05JQ0UKKwkJeyAibWF4bmljZSIsIFJMSU1JVF9OSUNFLCAxLCAnZScgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9SVFBSSU8KKwkJeyAibWF4cnRwcmlvIiwgUkxJTUlUX1JUUFJJTywgMSwgJ3InIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVMSU1JVF9NX0lTX1JTUykKKwkJeyAicmVzaWRlbnQtc2V0KEtpQikiLCBSTElNSVRfUlNTLCAxMDI0LCAnbScgfSwKKyNlbGlmIGRlZmluZWQoVUxJTUlUX01fSVNfVk1FTSkKKwkJeyAibWVtb3J5KEtpQikiLCBSTElNSVRfVk1FTSwgMTAyNCwgJ20nIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVMSU1JVF9WX0lTX1ZNRU0pCisJCXsgInZpcnR1YWwtbWVtb3J5KEtpQikiLCBSTElNSVRfVk1FTSwgMTAyNCwgJ3YnIH0sCisjZWxpZiBkZWZpbmVkKFVMSU1JVF9WX0lTX0FTKQorCQl7ICJhZGRyZXNzLXNwYWNlKEtpQikiLCBSTElNSVRfQVMsIDEwMjQsICd2JyB9LAorI2VuZGlmCisJCXsgTlVMTCwgMCwgMCwgMCB9CisJfTsKKwlzdGF0aWMgY2hhciBvcHRzWzMgKyBORUxFTShsaW1pdHMpXTsKKwlpbnQgaG93ID0gU09GVCB8IEhBUkQsIG9wdGMsIHdoYXQgPSAnZic7CisJYm9vbCBhbGwgPSBmYWxzZTsKKwljb25zdCBzdHJ1Y3QgbGltaXRzICpsOworCisJaWYgKCFvcHRzWzBdKSB7CisJCS8qIGJ1aWxkIG9wdGlvbnMgc3RyaW5nIG9uIGZpcnN0IGNhbGwgLSB5dWNrICovCisJCWNoYXIgKnAgPSBvcHRzOworCisJCSpwKysgPSAnSCc7ICpwKysgPSAnUyc7ICpwKysgPSAnYSc7CisJCWZvciAobCA9IGxpbWl0czsgbC0+bmFtZTsgbCsrKQorCQkJKnArKyA9IGwtPm9wdGlvbjsKKwkJKnAgPSAnXDAnOworCX0KKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgb3B0cykpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnSCc6CisJCQlob3cgPSBIQVJEOworCQkJYnJlYWs7CisJCWNhc2UgJ1MnOgorCQkJaG93ID0gU09GVDsKKwkJCWJyZWFrOworCQljYXNlICdhJzoKKwkJCWFsbCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQliaV9lcnJvcmYoInVzYWdlOiB1bGltaXQgWy1hY2RmSExsbW5wU3NUdHZ3XSBbdmFsdWVdIik7CisJCQlyZXR1cm4gKDEpOworCQlkZWZhdWx0OgorCQkJd2hhdCA9IG9wdGM7CisJCX0KKworCWZvciAobCA9IGxpbWl0czsgbC0+bmFtZSAmJiBsLT5vcHRpb24gIT0gd2hhdDsgbCsrKQorCQk7CisJaWYgKCFsLT5uYW1lKSB7CisJCWludGVybmFsX3dhcm5pbmdmKCJ1bGltaXQ6ICVjIiwgd2hhdCk7CisJCXJldHVybiAoMSk7CisJfQorCisJaWYgKHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0pIHsKKwkJaWYgKGFsbCB8fCB3cFtidWlsdGluX29wdC5vcHRpbmQgKyAxXSkgeworCQkJYmlfZXJyb3JmKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJcmV0dXJuIChzZXRfdWxpbWl0KGwsIHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0sIGhvdykpOworCX0KKwlpZiAoIWFsbCkKKwkJcHJpbnRfdWxpbWl0KGwsIGhvdyk7CisJZWxzZSBmb3IgKGwgPSBsaW1pdHM7IGwtPm5hbWU7IGwrKykgeworCQlzaHByaW50ZigiJS0yMHMgIiwgbC0+bmFtZSk7CisJCXByaW50X3VsaW1pdChsLCBob3cpOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitzZXRfdWxpbWl0KGNvbnN0IHN0cnVjdCBsaW1pdHMgKmwsIGNvbnN0IGNoYXIgKnYsIGludCBob3cpCit7CisJcmxpbV90IHZhbCA9IChybGltX3QpMDsKKwlzdHJ1Y3QgcmxpbWl0IGxpbWl0OworCisJaWYgKHN0cmNtcCh2LCAidW5saW1pdGVkIikgPT0gMCkKKwkJdmFsID0gKHJsaW1fdClSTElNX0lORklOSVRZOworCWVsc2UgeworCQlta3NoX2FyaV90IHJ2YWw7CisKKwkJaWYgKCFldmFsdWF0ZSh2LCAmcnZhbCwgS1NIX1JFVFVSTl9FUlJPUiwgZmFsc2UpKQorCQkJcmV0dXJuICgxKTsKKwkJLyoKKwkJICogQXZvaWQgcHJvYmxlbXMgY2F1c2VkIGJ5IHR5cG9zIHRoYXQgZXZhbHVhdGUgbWlzc2VzIGR1ZQorCQkgKiB0byBldmFsdWF0aW5nIHVuc2V0IHBhcmFtZXRlcnMgdG8gMC4uLgorCQkgKiBJZiB0aGlzIGNhdXNlcyBwcm9ibGVtcywgd2lsbCBoYXZlIHRvIGFkZCBwYXJhbWV0ZXIgdG8KKwkJICogZXZhbHVhdGUoKSB0byBjb250cm9sIGlmIHVuc2V0IHBhcmFtcyBhcmUgMCBvciBhbiBlcnJvci4KKwkJICovCisJCWlmICghcnZhbCAmJiAha3NoX2lzZGlnaXQodlswXSkpIHsKKwkJCWJpX2Vycm9yZigiaW52YWxpZCAlcyBsaW1pdDogJXMiLCBsLT5uYW1lLCB2KTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJdmFsID0gKHJsaW1fdCkoKHJsaW1fdClydmFsICogbC0+ZmFjdG9yKTsKKwl9CisKKwlpZiAoZ2V0cmxpbWl0KGwtPnJlc291cmNlLCAmbGltaXQpIDwgMCkgeworCQkvKiBzb21lIGNhbm5vdCBiZSByZWFkLCBlLmcuIExpbnV4IFJMSU1JVF9MT0NLUyAqLworCQlsaW1pdC5ybGltX2N1ciA9IFJMSU1fSU5GSU5JVFk7CisJCWxpbWl0LnJsaW1fbWF4ID0gUkxJTV9JTkZJTklUWTsKKwl9CisJaWYgKGhvdyAmIFNPRlQpCisJCWxpbWl0LnJsaW1fY3VyID0gdmFsOworCWlmIChob3cgJiBIQVJEKQorCQlsaW1pdC5ybGltX21heCA9IHZhbDsKKwlpZiAoIXNldHJsaW1pdChsLT5yZXNvdXJjZSwgJmxpbWl0KSkKKwkJcmV0dXJuICgwKTsKKwlpZiAoZXJybm8gPT0gRVBFUk0pCisJCWJpX2Vycm9yZigiJXMgZXhjZWVkcyBhbGxvd2FibGUgJXMgbGltaXQiLCB2LCBsLT5uYW1lKTsKKwllbHNlCisJCWJpX2Vycm9yZigiYmFkICVzIGxpbWl0OiAlcyIsIGwtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3VsaW1pdChjb25zdCBzdHJ1Y3QgbGltaXRzICpsLCBpbnQgaG93KQoreworCXJsaW1fdCB2YWwgPSAocmxpbV90KTA7CisJc3RydWN0IHJsaW1pdCBsaW1pdDsKKworCWlmIChnZXRybGltaXQobC0+cmVzb3VyY2UsICZsaW1pdCkpIHsKKwkJc2hmX3B1dHMoInVua25vd25cbiIsIHNobF9zdGRvdXQpOworCQlyZXR1cm47CisJfQorCWlmIChob3cgJiBTT0ZUKQorCQl2YWwgPSBsaW1pdC5ybGltX2N1cjsKKwllbHNlIGlmIChob3cgJiBIQVJEKQorCQl2YWwgPSBsaW1pdC5ybGltX21heDsKKwlpZiAodmFsID09IChybGltX3QpUkxJTV9JTkZJTklUWSkKKwkJc2hmX3B1dHMoInVubGltaXRlZFxuIiwgc2hsX3N0ZG91dCk7CisJZWxzZQorCQlzaHByaW50ZigiJWxkXG4iLCAobG9uZykodmFsIC8gbC0+ZmFjdG9yKSk7Cit9CisjZW5kaWYKKworaW50CitjX3JlbmFtZShjb25zdCBjaGFyICoqd3ApCit7CisJaW50IHJ2ID0gMTsKKworCWlmICh3cCA9PSBOVUxMCQkvKiBhcmd2ICovIHx8CisJICAgIHdwWzBdID09IE5VTEwJLyogbmFtZSBvZiBidWlsdGluICovIHx8CisJICAgIHdwWzFdID09IE5VTEwJLyogZmlyc3QgYXJndW1lbnQgKi8gfHwKKwkgICAgd3BbMl0gPT0gTlVMTAkvKiBzZWNvbmQgYXJndW1lbnQgKi8gfHwKKwkgICAgd3BbM10gIT0gTlVMTAkvKiBubyBmdXJ0aGVyIGFyZ3MgcGxlYXNlICovKQorCQliaV9lcnJvcmYoVF9zeW5lcnIpOworCWVsc2UgaWYgKChydiA9IHJlbmFtZSh3cFsxXSwgd3BbMl0pKSAhPSAwKSB7CisJCXJ2ID0gZXJybm87CisJCWJpX2Vycm9yZigiZmFpbGVkOiAlcyIsIHN0cmVycm9yKHJ2KSk7CisJfQorCisJcmV0dXJuIChydik7Cit9CisKK2ludAorY19yZWFscGF0aChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IHJ2ID0gMTsKKwljaGFyICpidWY7CisKKwlpZiAod3AgIT0gTlVMTCAmJiB3cFswXSAhPSBOVUxMICYmIHdwWzFdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcCh3cFsxXSwgIi0tIikpIHsKKwkJCWlmICh3cFsyXSA9PSBOVUxMKSB7CisJCQkJd3AgKz0gMTsKKwkJCQlydiA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAod3BbMl0gIT0gTlVMTCAmJiB3cFszXSA9PSBOVUxMKSB7CisJCQkJd3AgKz0gMjsKKwkJCQlydiA9IDA7CisJCQl9CisJCX0KKwl9CisKKwlpZiAocnYpCisJCWJpX2Vycm9yZihUX3N5bmVycik7CisJZWxzZSBpZiAoKGJ1ZiA9IGRvX3JlYWxwYXRoKCp3cCkpID09IE5VTEwpIHsKKwkJcnYgPSBlcnJubzsKKwkJYmlfZXJyb3JmKCIlczogJXMiLCAqd3AsIHN0cmVycm9yKHJ2KSk7CisJCWlmICgodW5zaWduZWQgaW50KXJ2ID4gMjU1KQorCQkJcnYgPSAyNTU7CisJfSBlbHNlIHsKKwkJc2hwcmludGYoIiVzXG4iLCBidWYpOworCQlhZnJlZShidWYsIEFURU1QKTsKKwl9CisKKwlyZXR1cm4gKHJ2KTsKK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2hpc3RyYXAuYyBiL21rc2gvc3JjL2hpc3RyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWM0YzM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvaGlzdHJhcC5jCkBAIC0wLDAgKzEsMTQ4MyBAQAorLyoJJE9wZW5CU0Q6IGhpc3RvcnkuYyx2IDEuMzkgMjAxMC8wNS8xOSAxNzozNjowOCBqYXNwZXIgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiB0cmFwLmMsdiAxLjIzIDIwMTAvMDUvMTkgMTc6MzY6MDggamFzcGVyIEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjZW5kaWYKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvaGlzdHJhcC5jLHYgMS45OCAyMDEwLzA3LzI0IDE3OjA4OjI5IHRnIEV4cCAkIik7CisKKy8qLQorICogTWlyT1M6IFRoaXMgaXMgdGhlIGRlZmF1bHQgbWFwcGluZyB0eXBlLCBhbmQgbmVlZCBub3QgYmUgc3BlY2lmaWVkLgorICogSVJJWCBkb2Vzbid0IGhhdmUgdGhpcyBjb25zdGFudC4KKyAqLworI2lmbmRlZiBNQVBfRklMRQorI2RlZmluZSBNQVBfRklMRQkwCisjZW5kaWYKKworVHJhcCBzaWd0cmFwc1tOU0lHICsgMV07CitzdGF0aWMgc3RydWN0IHNpZ2FjdGlvbiBTaWdhY3RfaWduOworCisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKK3N0YXRpYyBpbnQgaGlzdF9jb3VudF9saW5lcyh1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IGhpc3Rfc2hyaW5rKHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpoaXN0X3NraXBfYmFjayh1bnNpZ25lZCBjaGFyICosaW50ICosaW50KTsKK3N0YXRpYyB2b2lkIGhpc3Rsb2FkKFNvdXJjZSAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBoaXN0aW5zZXJ0KFNvdXJjZSAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgdm9pZCB3cml0ZWhpc3RmaWxlKGludCwgY2hhciAqKTsKK3N0YXRpYyBpbnQgc3ByaW5rbGUoaW50KTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGhpc3RfZXhlY3V0ZShjaGFyICopOworc3RhdGljIGludCBoaXN0X3JlcGxhY2UoY2hhciAqKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2wpOworc3RhdGljIGNoYXIgKipoaXN0X2dldChjb25zdCBjaGFyICosIGJvb2wsIGJvb2wpOworc3RhdGljIGNoYXIgKipoaXN0X2dldF9vbGRlc3Qodm9pZCk7CitzdGF0aWMgdm9pZCBoaXN0YmFja3VwKHZvaWQpOworCitzdGF0aWMgY2hhciAqKmN1cnJlbnQ7CQkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGhpc3RvcnlbXSAqLworc3RhdGljIGludCBoc3RhcnRlZDsJCS8qIHNldCBhZnRlciBoaXN0X2luaXQoKSBjYWxsZWQgKi8KK3N0YXRpYyBTb3VyY2UgKmhpc3Rfc291cmNlOworCisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKK3N0YXRpYyBjaGFyICpobmFtZTsJCS8qIGN1cnJlbnQgbmFtZSBvZiBoaXN0b3J5IGZpbGUgKi8KK3N0YXRpYyBpbnQgaGlzdGZkOworc3RhdGljIGludCBoc2l6ZTsKKyNlbmRpZgorCitpbnQKK2NfZmMoY29uc3QgY2hhciAqKndwKQoreworCXN0cnVjdCBzaGYgKnNoZjsKKwlzdHJ1Y3QgdGVtcCAqdGY7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICplZGl0b3IgPSBOVUxMOworCWJvb2wgZ2ZsYWcgPSBmYWxzZSwgbGZsYWcgPSBmYWxzZSwgbmZsYWcgPSBmYWxzZSwgcmZsYWcgPSBmYWxzZSwKKwkgICAgc2ZsYWcgPSBmYWxzZTsKKwlpbnQgb3B0YzsKKwljb25zdCBjaGFyICpmaXJzdCA9IE5VTEwsICpsYXN0ID0gTlVMTDsKKwljaGFyICoqaGZpcnN0LCAqKmhsYXN0LCAqKmhwOworCisJaWYgKCFGbGFnKEZUQUxLSU5HX0kpKSB7CisJCWJpX2Vycm9yZigiaGlzdG9yeSBmdW5jdGlvbnMgbm90IGF2YWlsYWJsZSIpOworCQlyZXR1cm4gKDEpOworCX0KKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwKKwkgICAgImU6Z2xucnMwLDEsMiwzLDQsNSw2LDcsOCw5LCIpKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ2UnOgorCQkJcCA9IGJ1aWx0aW5fb3B0Lm9wdGFyZzsKKwkJCWlmIChrc2hfaXNkYXNoKHApKQorCQkJCXNmbGFnID0gdHJ1ZTsKKwkJCWVsc2UgeworCQkJCXNpemVfdCBsZW4gPSBzdHJsZW4ocCk7CisJCQkJZWRpdG9yID0gYWxsb2MobGVuICsgNCwgQVRFTVApOworCQkJCW1lbWNweShlZGl0b3IsIHAsIGxlbik7CisJCQkJbWVtY3B5KGVkaXRvciArIGxlbiwgIiAkXyIsIDQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2cnOiAvKiBub24tQVQmVCBrc2ggKi8KKwkJCWdmbGFnID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWxmbGFnID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW5mbGFnID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXJmbGFnID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoJLyogUE9TSVggdmVyc2lvbiBvZiAtZSAtICovCisJCQlzZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJLyoga2x1ZGdlIGNpdHkgLSBhY2NlcHQgLW51bSBhcyAtLSAtbnVtIChraW5kIG9mKSAqLworCQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CisJCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKwkJCXAgPSBzaGZfc21wcmludGYoIi0lYyVzIiwKKwkJCQkJb3B0YywgYnVpbHRpbl9vcHQub3B0YXJnKTsKKwkJCWlmICghZmlyc3QpCisJCQkJZmlyc3QgPSBwOworCQkJZWxzZSBpZiAoIWxhc3QpCisJCQkJbGFzdCA9IHA7CisJCQllbHNlIHsKKwkJCQliaV9lcnJvcmYoInRvbyBtYW55IGFyZ3VtZW50cyIpOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCisJLyogU3Vic3RpdHV0ZSBhbmQgZXhlY3V0ZSBjb21tYW5kICovCisJaWYgKHNmbGFnKSB7CisJCWNoYXIgKnBhdCA9IE5VTEwsICpyZXAgPSBOVUxMOworCisJCWlmIChlZGl0b3IgfHwgbGZsYWcgfHwgbmZsYWcgfHwgcmZsYWcpIHsKKwkJCWJpX2Vycm9yZigiY2FuJ3QgdXNlIC1lLCAtbCwgLW4sIC1yIHdpdGggLXMgKC1lIC0pIik7CisJCQlyZXR1cm4gKDEpOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIHBhdHRlcm4gcmVwbGFjZW1lbnQgYXJndW1lbnQgKi8KKwkJaWYgKCp3cCAmJiAqKndwICYmIChwID0gY3N0cmNocigqd3AgKyAxLCAnPScpKSkgeworCQkJc3RyZHVweChwYXQsICp3cCwgQVRFTVApOworCQkJcmVwID0gcGF0ICsgKHAgLSAqd3ApOworCQkJKnJlcCsrID0gJ1wwJzsKKwkJCXdwKys7CisJCX0KKwkJLyogQ2hlY2sgZm9yIHNlYXJjaCBwcmVmaXggKi8KKwkJaWYgKCFmaXJzdCAmJiAoZmlyc3QgPSAqd3ApKQorCQkJd3ArKzsKKwkJaWYgKGxhc3QgfHwgKndwKSB7CisJCQliaV9lcnJvcmYoInRvbyBtYW55IGFyZ3VtZW50cyIpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCisJCWhwID0gZmlyc3QgPyBoaXN0X2dldChmaXJzdCwgZmFsc2UsIGZhbHNlKSA6CisJCSAgICBoaXN0X2dldF9uZXdlc3QoZmFsc2UpOworCQlpZiAoIWhwKQorCQkJcmV0dXJuICgxKTsKKwkJcmV0dXJuIChoaXN0X3JlcGxhY2UoaHAsIHBhdCwgcmVwLCBnZmxhZykpOworCX0KKworCWlmIChlZGl0b3IgJiYgKGxmbGFnIHx8IG5mbGFnKSkgeworCQliaV9lcnJvcmYoImNhbid0IHVzZSAtbCwgLW4gd2l0aCAtZSIpOworCQlyZXR1cm4gKDEpOworCX0KKworCWlmICghZmlyc3QgJiYgKGZpcnN0ID0gKndwKSkKKwkJd3ArKzsKKwlpZiAoIWxhc3QgJiYgKGxhc3QgPSAqd3ApKQorCQl3cCsrOworCWlmICgqd3ApIHsKKwkJYmlfZXJyb3JmKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJaWYgKCFmaXJzdCkgeworCQloZmlyc3QgPSBsZmxhZyA/IGhpc3RfZ2V0KCItMTYiLCB0cnVlLCB0cnVlKSA6CisJCSAgICBoaXN0X2dldF9uZXdlc3QoZmFsc2UpOworCQlpZiAoIWhmaXJzdCkKKwkJCXJldHVybiAoMSk7CisJCS8qIGNhbid0IGZhaWwgaWYgaGZpcnN0IGRpZG4ndCBmYWlsICovCisJCWhsYXN0ID0gaGlzdF9nZXRfbmV3ZXN0KGZhbHNlKTsKKwl9IGVsc2UgeworCQkvKiBQT1NJWCBzYXlzIG5vdCBhbiBlcnJvciBpZiBmaXJzdC9sYXN0IG91dCBvZiBib3VuZHMKKwkJICogd2hlbiByYW5nZSBpcyBzcGVjaWZpZWQ7IEFUJlQga3NoIGFuZCBwZGtzaCBhbGxvdyBvdXQgb2YKKwkJICogYm91bmRzIGZvciAtbCBhcyB3ZWxsLgorCQkgKi8KKwkJaGZpcnN0ID0gaGlzdF9nZXQoZmlyc3QsIChsZmxhZyB8fCBsYXN0KSA/IHRydWUgOiBmYWxzZSwgbGZsYWcpOworCQlpZiAoIWhmaXJzdCkKKwkJCXJldHVybiAoMSk7CisJCWhsYXN0ID0gbGFzdCA/IGhpc3RfZ2V0KGxhc3QsIHRydWUsIGxmbGFnKSA6CisJCSAgICAobGZsYWcgPyBoaXN0X2dldF9uZXdlc3QoZmFsc2UpIDogaGZpcnN0KTsKKwkJaWYgKCFobGFzdCkKKwkJCXJldHVybiAoMSk7CisJfQorCWlmIChoZmlyc3QgPiBobGFzdCkgeworCQljaGFyICoqdGVtcDsKKworCQl0ZW1wID0gaGZpcnN0OyBoZmlyc3QgPSBobGFzdDsgaGxhc3QgPSB0ZW1wOworCQlyZmxhZyA9ICFyZmxhZzsgLyogUE9TSVggKi8KKwl9CisKKwkvKiBMaXN0IGhpc3RvcnkgKi8KKwlpZiAobGZsYWcpIHsKKwkJY2hhciAqcywgKnQ7CisKKwkJZm9yIChocCA9IHJmbGFnID8gaGxhc3QgOiBoZmlyc3Q7CisJCSAgICBocCA+PSBoZmlyc3QgJiYgaHAgPD0gaGxhc3Q7IGhwICs9IHJmbGFnID8gLTEgOiAxKSB7CisJCQlpZiAoIW5mbGFnKQorCQkJCXNoZl9mcHJpbnRmKHNobF9zdGRvdXQsICIlZCIsCisJCQkJICAgIGhpc3Rfc291cmNlLT5saW5lIC0gKGludCkoaGlzdHB0ciAtIGhwKSk7CisJCQlzaGZfcHV0YygnXHQnLCBzaGxfc3Rkb3V0KTsKKwkJCS8qIHByaW50IG11bHRpLWxpbmUgY29tbWFuZHMgY29ycmVjdGx5ICovCisJCQlzID0gKmhwOworCQkJd2hpbGUgKCh0ID0gc3RyY2hyKHMsICdcbicpKSkgeworCQkJCSp0ID0gJ1wwJzsKKwkJCQlzaGZfZnByaW50ZihzaGxfc3Rkb3V0LCAiJXNcblx0Iiwgcyk7CisJCQkJKnQrKyA9ICdcbic7CisJCQkJcyA9IHQ7CisJCQl9CisJCQlzaGZfZnByaW50ZihzaGxfc3Rkb3V0LCAiJXNcbiIsIHMpOworCQl9CisJCXNoZl9mbHVzaChzaGxfc3Rkb3V0KTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKiBSdW4gZWRpdG9yIG9uIHNlbGVjdGVkIGxpbmVzLCB0aGVuIHJ1biByZXN1bHRpbmcgY29tbWFuZHMgKi8KKworCXRmID0gbWFrZXRlbXAoQVRFTVAsIFRUX0hJU1RfRURJVCwgJmUtPnRlbXBzKTsKKwlpZiAoIShzaGYgPSB0Zi0+c2hmKSkgeworCQliaV9lcnJvcmYoImNhbm5vdCBjcmVhdGUgdGVtcCBmaWxlICVzIC0gJXMiLAorCQkgICAgdGYtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoMSk7CisJfQorCWZvciAoaHAgPSByZmxhZyA/IGhsYXN0IDogaGZpcnN0OworCSAgICBocCA+PSBoZmlyc3QgJiYgaHAgPD0gaGxhc3Q7IGhwICs9IHJmbGFnID8gLTEgOiAxKQorCQlzaGZfZnByaW50ZihzaGYsICIlc1xuIiwgKmhwKTsKKwlpZiAoc2hmX2Nsb3NlKHNoZikgPT0gRU9GKSB7CisJCWJpX2Vycm9yZigiZXJyb3Igd3JpdGluZyB0ZW1wb3JhcnkgZmlsZSAtICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKiBJZ25vcmUgc2V0c3RyIGVycm9ycyBoZXJlIChhcmJpdHJhcnkpICovCisJc2V0c3RyKGxvY2FsKCJfIiwgZmFsc2UpLCB0Zi0+bmFtZSwgS1NIX1JFVFVSTl9FUlJPUik7CisKKwkvKiBYWFg6IHNvdXJjZSBzaG91bGQgbm90IGdldCB0cmFzaGVkIGJ5IHRoaXMuLiAqLworCXsKKwkJU291cmNlICpzb2xkID0gc291cmNlOworCQlpbnQgcmV0OworCisJCXJldCA9IGNvbW1hbmQoZWRpdG9yID8gZWRpdG9yIDogIiR7RkNFRElUOi0vYmluL2VkfSAkXyIsIDApOworCQlzb3VyY2UgPSBzb2xkOworCQlpZiAocmV0KQorCQkJcmV0dXJuIChyZXQpOworCX0KKworCXsKKwkJc3RydWN0IHN0YXQgc3RhdGI7CisJCVhTdHJpbmcgeHM7CisJCWNoYXIgKnhwOworCQlpbnQgbjsKKworCQlpZiAoIShzaGYgPSBzaGZfb3Blbih0Zi0+bmFtZSwgT19SRE9OTFksIDAsIDApKSkgeworCQkJYmlfZXJyb3JmKCJjYW5ub3Qgb3BlbiB0ZW1wIGZpbGUgJXMiLCB0Zi0+bmFtZSk7CisJCQlyZXR1cm4gKDEpOworCQl9CisKKwkJbiA9IHN0YXQodGYtPm5hbWUsICZzdGF0YikgPCAwID8gMTI4IDogc3RhdGIuc3Rfc2l6ZSArIDE7CisJCVhpbml0KHhzLCB4cCwgbiwgaGlzdF9zb3VyY2UtPmFyZWFwKTsKKwkJd2hpbGUgKChuID0gc2hmX3JlYWQoeHAsIFhubGVmdCh4cywgeHApLCBzaGYpKSA+IDApIHsKKwkJCXhwICs9IG47CisJCQlpZiAoWG5sZWZ0KHhzLCB4cCkgPD0gMCkKKwkJCQlYY2hlY2tOKHhzLCB4cCwgWGxlbmd0aCh4cywgeHApKTsKKwkJfQorCQlpZiAobiA8IDApIHsKKwkJCWJpX2Vycm9yZigiZXJyb3IgcmVhZGluZyB0ZW1wIGZpbGUgJXMgLSAlcyIsCisJCQkgICAgdGYtPm5hbWUsIHN0cmVycm9yKHNoZl9lcnJubyhzaGYpKSk7CisJCQlzaGZfY2xvc2Uoc2hmKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJc2hmX2Nsb3NlKHNoZik7CisJCSp4cCA9ICdcMCc7CisJCXN0cmlwX251bHMoWHN0cmluZyh4cywgeHApLCBYbGVuZ3RoKHhzLCB4cCkpOworCQlyZXR1cm4gKGhpc3RfZXhlY3V0ZShYc3RyaW5nKHhzLCB4cCkpKTsKKwl9Cit9CisKKy8qIFNhdmUgY21kIGluIGhpc3RvcnksIGV4ZWN1dGUgY21kIChjbWQgZ2V0cyB0cmFzaGVkKSAqLworc3RhdGljIGludAoraGlzdF9leGVjdXRlKGNoYXIgKmNtZCkKK3sKKwlTb3VyY2UgKnNvbGQ7CisJaW50IHJldDsKKwljaGFyICpwLCAqcTsKKworCWhpc3RiYWNrdXAoKTsKKworCWZvciAocCA9IGNtZDsgcDsgcCA9IHEpIHsKKwkJaWYgKChxID0gc3RyY2hyKHAsICdcbicpKSkgeworCQkJKnErKyA9ICdcMCc7IC8qIGtpbGwgdGhlIG5ld2xpbmUgKi8KKwkJCWlmICghKnEpIC8qIGlnbm9yZSB0cmFpbGluZyBuZXdsaW5lICovCisJCQkJcSA9IE5VTEw7CisJCX0KKwkJaGlzdHNhdmUoJmhpc3Rfc291cmNlLT5saW5lLCBwLCB0cnVlLCB0cnVlKTsKKworCQlzaGVsbGYoIiVzXG4iLCBwKTsgLyogUE9TSVggZG9lc24ndCBzYXkgdGhpcyBpcyBkb25lLi4uICovCisJCWlmIChxKQkJLyogcmVzdG9yZSBcbiAodHJhaWxpbmcgXG4gbm90IHJlc3RvcmVkKSAqLworCQkJcVstMV0gPSAnXG4nOworCX0KKworCS8qCisJICogQ29tbWFuZHMgYXJlIGV4ZWN1dGVkIGhlcmUgaW5zdGVhZCBvZiBwdXNoaW5nIHRoZW0gb250byB0aGUKKwkgKiBpbnB1dCAnY2F1c2UgUE9TSVggc2F5cyB0aGUgcmVkaXJlY3Rpb24gYW5kIHZhcmlhYmxlIGFzc2lnbm1lbnRzCisJICogaW4KKwkgKglYPXkgZmMgLWUgLSA0MiAyPiAvZGV2L251bGwKKwkgKiBhcmUgdG8gZWZmZWN0IHRoZSByZXBlYXRlZCBjb21tYW5kcyBlbnZpcm9ubWVudC4KKwkgKi8KKwkvKiBYWFg6IHNvdXJjZSBzaG91bGQgbm90IGdldCB0cmFzaGVkIGJ5IHRoaXMuLiAqLworCXNvbGQgPSBzb3VyY2U7CisJcmV0ID0gY29tbWFuZChjbWQsIDApOworCXNvdXJjZSA9IHNvbGQ7CisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgaW50CitoaXN0X3JlcGxhY2UoY2hhciAqKmhwLCBjb25zdCBjaGFyICpwYXQsIGNvbnN0IGNoYXIgKnJlcCwgYm9vbCBnbG9icikKK3sKKwljaGFyICpsaW5lOworCisJaWYgKCFwYXQpCisJCXN0cmR1cHgobGluZSwgKmhwLCBBVEVNUCk7CisJZWxzZSB7CisJCWNoYXIgKnMsICpzMTsKKwkJaW50IHBhdF9sZW4gPSBzdHJsZW4ocGF0KTsKKwkJaW50IHJlcF9sZW4gPSBzdHJsZW4ocmVwKTsKKwkJaW50IGxlbjsKKwkJWFN0cmluZyB4czsKKwkJY2hhciAqeHA7CisJCWJvb2wgYW55X3N1YnN0ID0gZmFsc2U7CisKKwkJWGluaXQoeHMsIHhwLCAxMjgsIEFURU1QKTsKKwkJZm9yIChzID0gKmhwOyAoczEgPSBzdHJzdHIocywgcGF0KSkgJiYgKCFhbnlfc3Vic3QgfHwgZ2xvYnIpOworCQkgICAgcyA9IHMxICsgcGF0X2xlbikgeworCQkJYW55X3N1YnN0ID0gdHJ1ZTsKKwkJCWxlbiA9IHMxIC0gczsKKwkJCVhjaGVja04oeHMsIHhwLCBsZW4gKyByZXBfbGVuKTsKKwkJCW1lbWNweSh4cCwgcywgbGVuKTsJCS8qIGZpcnN0IHBhcnQgKi8KKwkJCXhwICs9IGxlbjsKKwkJCW1lbWNweSh4cCwgcmVwLCByZXBfbGVuKTsJLyogcmVwbGFjZW1lbnQgKi8KKwkJCXhwICs9IHJlcF9sZW47CisJCX0KKwkJaWYgKCFhbnlfc3Vic3QpIHsKKwkJCWJpX2Vycm9yZigic3Vic3RpdHV0aW9uIGZhaWxlZCIpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlsZW4gPSBzdHJsZW4ocykgKyAxOworCQlYY2hlY2tOKHhzLCB4cCwgbGVuKTsKKwkJbWVtY3B5KHhwLCBzLCBsZW4pOworCQl4cCArPSBsZW47CisJCWxpbmUgPSBYY2xvc2UoeHMsIHhwKTsKKwl9CisJcmV0dXJuIChoaXN0X2V4ZWN1dGUobGluZSkpOworfQorCisvKgorICogZ2V0IHBvaW50ZXIgdG8gaGlzdG9yeSBnaXZlbiBwYXR0ZXJuCisgKiBwYXR0ZXJuIGlzIGEgbnVtYmVyIG9yIHN0cmluZworICovCitzdGF0aWMgY2hhciAqKgoraGlzdF9nZXQoY29uc3QgY2hhciAqc3RyLCBib29sIGFwcHJveCwgYm9vbCBhbGxvd19jdXIpCit7CisJY2hhciAqKmhwID0gTlVMTDsKKwlpbnQgbjsKKworCWlmIChnZXRuKHN0ciwgJm4pKSB7CisJCWhwID0gaGlzdHB0ciArIChuIDwgMCA/IG4gOiAobiAtIGhpc3Rfc291cmNlLT5saW5lKSk7CisJCWlmICgocHRyZGlmZl90KWhwIDwgKHB0cmRpZmZfdCloaXN0b3J5KSB7CisJCQlpZiAoYXBwcm94KQorCQkJCWhwID0gaGlzdF9nZXRfb2xkZXN0KCk7CisJCQllbHNlIHsKKwkJCQliaV9lcnJvcmYoIiVzOiBub3QgaW4gaGlzdG9yeSIsIHN0cik7CisJCQkJaHAgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgaWYgKChwdHJkaWZmX3QpaHAgPiAocHRyZGlmZl90KWhpc3RwdHIpIHsKKwkJCWlmIChhcHByb3gpCisJCQkJaHAgPSBoaXN0X2dldF9uZXdlc3QoYWxsb3dfY3VyKTsKKwkJCWVsc2UgeworCQkJCWJpX2Vycm9yZigiJXM6IG5vdCBpbiBoaXN0b3J5Iiwgc3RyKTsKKwkJCQlocCA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSBpZiAoIWFsbG93X2N1ciAmJiBocCA9PSBoaXN0cHRyKSB7CisJCQliaV9lcnJvcmYoIiVzOiBpbnZhbGlkIHJhbmdlIiwgc3RyKTsKKwkJCWhwID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWludCBhbmNob3JlZCA9ICpzdHIgPT0gJz8nID8gKCsrc3RyLCAwKSA6IDE7CisKKwkJLyogdGhlIC0xIGlzIHRvIGF2b2lkIHRoZSBjdXJyZW50IGZjIGNvbW1hbmQgKi8KKwkJaWYgKChuID0gZmluZGhpc3QoaGlzdHB0ciAtIGhpc3RvcnkgLSAxLCAwLCBzdHIsIGFuY2hvcmVkKSkgPCAwKQorCQkJYmlfZXJyb3JmKCIlczogbm90IGluIGhpc3RvcnkiLCBzdHIpOworCQllbHNlCisJCQlocCA9ICZoaXN0b3J5W25dOworCX0KKwlyZXR1cm4gKGhwKTsKK30KKworLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmV3ZXN0IGNvbW1hbmQgaW4gdGhlIGhpc3RvcnkgKi8KK2NoYXIgKioKK2hpc3RfZ2V0X25ld2VzdChib29sIGFsbG93X2N1cikKK3sKKwlpZiAoaGlzdHB0ciA8IGhpc3RvcnkgfHwgKCFhbGxvd19jdXIgJiYgaGlzdHB0ciA9PSBoaXN0b3J5KSkgeworCQliaV9lcnJvcmYoIm5vIGhpc3RvcnkgKHlldCkiKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJcmV0dXJuIChhbGxvd19jdXIgPyBoaXN0cHRyIDogaGlzdHB0ciAtIDEpOworfQorCisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBvbGRlc3QgY29tbWFuZCBpbiB0aGUgaGlzdG9yeSAqLworc3RhdGljIGNoYXIgKioKK2hpc3RfZ2V0X29sZGVzdCh2b2lkKQoreworCWlmIChoaXN0cHRyIDw9IGhpc3RvcnkpIHsKKwkJYmlfZXJyb3JmKCJubyBoaXN0b3J5ICh5ZXQpIik7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXJldHVybiAoaGlzdG9yeSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCYWNrIHVwIG92ZXIgbGFzdCBoaXN0c2F2ZSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitoaXN0YmFja3VwKHZvaWQpCit7CisJc3RhdGljIGludCBsYXN0X2xpbmUgPSAtMTsKKworCWlmIChoaXN0cHRyID49IGhpc3RvcnkgJiYgbGFzdF9saW5lICE9IGhpc3Rfc291cmNlLT5saW5lKSB7CisJCWhpc3Rfc291cmNlLT5saW5lLS07CisJCWFmcmVlKCpoaXN0cHRyLCBBUEVSTSk7CisJCWhpc3RwdHItLTsKKwkJbGFzdF9saW5lID0gaGlzdF9zb3VyY2UtPmxpbmU7CisJfQorfQorCisvKgorICogUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICovCitjaGFyICoqCitoaXN0cG9zKHZvaWQpCit7CisJcmV0dXJuIChjdXJyZW50KTsKK30KKworaW50CitoaXN0bnVtKGludCBuKQoreworCWludCBsYXN0ID0gaGlzdHB0ciAtIGhpc3Rvcnk7CisKKwlpZiAobiA8IDAgfHwgbiA+PSBsYXN0KSB7CisJCWN1cnJlbnQgPSBoaXN0cHRyOworCQlyZXR1cm4gKGxhc3QpOworCX0gZWxzZSB7CisJCWN1cnJlbnQgPSAmaGlzdG9yeVtuXTsKKwkJcmV0dXJuIChuKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIHdpbGwgYmVjb21lIHVubmVjZXNzYXJ5IGlmIGhpc3RfZ2V0IGlzIG1vZGlmaWVkIHRvIGFsbG93CisgKiBzZWFyY2hpbmcgZnJvbSBwb3NpdGlvbnMgb3RoZXIgdGhhbiB0aGUgZW5kLCBhbmQgaW4gZWl0aGVyCisgKiBkaXJlY3Rpb24uCisgKi8KK2ludAorZmluZGhpc3QoaW50IHN0YXJ0LCBpbnQgZndkLCBjb25zdCBjaGFyICpzdHIsIGludCBhbmNob3JlZCkKK3sKKwljaGFyCSoqaHA7CisJaW50CW1heGhpc3QgPSBoaXN0cHRyIC0gaGlzdG9yeTsKKwlpbnQJaW5jciA9IGZ3ZCA/IDEgOiAtMTsKKwlpbnQJbGVuID0gc3RybGVuKHN0cik7CisKKwlpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IG1heGhpc3QpCisJCXN0YXJ0ID0gbWF4aGlzdDsKKworCWhwID0gJmhpc3Rvcnlbc3RhcnRdOworCWZvciAoOyBocCA+PSBoaXN0b3J5ICYmIGhwIDw9IGhpc3RwdHI7IGhwICs9IGluY3IpCisJCWlmICgoYW5jaG9yZWQgJiYgc3RybmNtcCgqaHAsIHN0ciwgbGVuKSA9PSAwKSB8fAorCQkgICAgKCFhbmNob3JlZCAmJiBzdHJzdHIoKmhwLCBzdHIpKSkKKwkJCXJldHVybiAoaHAgLSBoaXN0b3J5KTsKKworCXJldHVybiAoLTEpOworfQorCitpbnQKK2ZpbmRoaXN0cmVsKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQJbWF4aGlzdCA9IGhpc3RwdHIgLSBoaXN0b3J5OworCWludAlzdGFydCA9IG1heGhpc3QgLSAxOworCWludAlyZWM7CisKKwlnZXRuKHN0ciwgJnJlYyk7CisJaWYgKHJlYyA9PSAwKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAocmVjID4gMCkgeworCQlpZiAocmVjID4gbWF4aGlzdCkKKwkJCXJldHVybiAoLTEpOworCQlyZXR1cm4gKHJlYyAtIDEpOworCX0KKwlpZiAocmVjID4gbWF4aGlzdCkKKwkJcmV0dXJuICgtMSk7CisJcmV0dXJuIChzdGFydCArIHJlYyArIDEpOworfQorCisvKgorICoJc2V0IGhpc3RvcnkKKyAqCXRoaXMgbWVhbnMgcmVhbGxvY2F0aW5nIHRoZSBkYXRhc3BhY2UKKyAqLwordm9pZAorc2V0aGlzdHNpemUoaW50IG4pCit7CisJaWYgKG4gPiAwICYmIG4gIT0gaGlzdHNpemUpIHsKKwkJaW50IGN1cnNpemUgPSBoaXN0cHRyIC0gaGlzdG9yeTsKKworCQkvKiBzYXZlIG1vc3QgcmVjZW50IGhpc3RvcnkgKi8KKwkJaWYgKG4gPCBjdXJzaXplKSB7CisJCQltZW1tb3ZlKGhpc3RvcnksIGhpc3RwdHIgLSBuLCBuICogc2l6ZW9mKGNoYXIgKikpOworCQkJY3Vyc2l6ZSA9IG47CisJCX0KKworCQloaXN0b3J5ID0gYXJlc2l6ZShoaXN0b3J5LCBuICogc2l6ZW9mKGNoYXIgKiksIEFQRVJNKTsKKworCQloaXN0c2l6ZSA9IG47CisJCWhpc3RwdHIgPSBoaXN0b3J5ICsgY3Vyc2l6ZTsKKwl9Cit9CisKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorLyoKKyAqCXNldCBoaXN0b3J5IGZpbGUKKyAqCVRoaXMgY2FuIG1lYW4gcmVsb2FkaW5nL3Jlc2V0dGluZy9zdGFydGluZyBoaXN0b3J5IGZpbGUKKyAqCW1haW50ZW5hbmNlCisgKi8KK3ZvaWQKK3NldGhpc3RmaWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJLyogaWYgbm90IHN0YXJ0ZWQgdGhlbiBub3RoaW5nIHRvIGRvICovCisJaWYgKGhzdGFydGVkID09IDApCisJCXJldHVybjsKKworCS8qIGlmIHRoZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIHdlIGhhdmUgKi8KKwlpZiAoaG5hbWUgJiYgc3RyY21wKGhuYW1lLCBuYW1lKSA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIGl0cyBhIG5ldyBuYW1lIC0gcG9zc2libHkKKwkgKi8KKwlpZiAoaGlzdGZkKSB7CisJCS8qIHllcyB0aGUgZmlsZSBpcyBvcGVuICovCisJCSh2b2lkKWNsb3NlKGhpc3RmZCk7CisJCWhpc3RmZCA9IDA7CisJCWhzaXplID0gMDsKKwkJYWZyZWUoaG5hbWUsIEFQRVJNKTsKKwkJaG5hbWUgPSBOVUxMOworCQkvKiBsZXQncyByZXNldCB0aGUgaGlzdG9yeSAqLworCQloaXN0cHRyID0gaGlzdG9yeSAtIDE7CisJCWhpc3Rfc291cmNlLT5saW5lID0gMDsKKwl9CisKKwloaXN0X2luaXQoaGlzdF9zb3VyY2UpOworfQorI2VuZGlmCisKKy8qCisgKglpbml0aWFsaXNlIHRoZSBoaXN0b3J5IHZlY3RvcgorICovCit2b2lkCitpbml0X2hpc3R2ZWModm9pZCkKK3sKKwlpZiAoaGlzdG9yeSA9PSAoY2hhciAqKilOVUxMKSB7CisJCWhpc3RzaXplID0gSElTVE9SWVNJWkU7CisJCWhpc3RvcnkgPSBhbGxvYyhoaXN0c2l6ZSAqIHNpemVvZihjaGFyICopLCBBUEVSTSk7CisJCWhpc3RwdHIgPSBoaXN0b3J5IC0gMTsKKwl9Cit9CisKKworLyoKKyAqCVJvdXRpbmVzIGFkZGVkIGJ5IFBldGVyIENvbGxpbnNvbiBCU0RJKEV1cm9wZSkvSGlsbHNpZGUgU3lzdGVtcyB0bworICoJYSkgcGVybWl0IEhJU1RTSVpFIHRvIGNvbnRyb2wgbnVtYmVyIG9mIGxpbmVzIG9mIGhpc3Rvcnkgc3RvcmVkCisgKgliKSBtYWludGFpbiBhIHBoeXNpY2FsIGhpc3RvcnkgZmlsZQorICoKKyAqCUl0IHR1cm5zIG91dCB0aGF0IHRoZXJlIGlzIGEgbG90IG9mIGdoYXN0bHkgaGFja2VyeSBoZXJlCisgKi8KKworI2lmICFkZWZpbmVkKE1LU0hfU01BTEwpICYmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCisvKiBkbyBub3Qgc2F2ZSBjb21tYW5kIGluIGhpc3RvcnkgYnV0IHBvc3NpYmx5IHN5bmMgKi8KK2Jvb2wKK2hpc3RzeW5jKHZvaWQpCit7CisJYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisKKwlpZiAoaGlzdGZkKSB7CisJCWludCBsbm8gPSBoaXN0X3NvdXJjZS0+bGluZTsKKworCQloaXN0X3NvdXJjZS0+bGluZSsrOworCQl3cml0ZWhpc3RmaWxlKDAsIE5VTEwpOworCQloaXN0X3NvdXJjZS0+bGluZS0tOworCisJCWlmIChsbm8gIT0gaGlzdF9zb3VyY2UtPmxpbmUpCisJCQljaGFuZ2VkID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gKGNoYW5nZWQpOworfQorI2VuZGlmCisKKy8qCisgKiBzYXZlIGNvbW1hbmQgaW4gaGlzdG9yeQorICovCit2b2lkCitoaXN0c2F2ZShpbnQgKmxucCwgY29uc3QgY2hhciAqY21kLCBib29sIGRvd3JpdGUgTUtTSF9BX1VOVVNFRCwgYm9vbCBpZ25vcmVkdXBzKQoreworCWNoYXIgKipocDsKKwljaGFyICpjLCAqY3A7CisKKwlzdHJkdXB4KGMsIGNtZCwgQVBFUk0pOworCWlmICgoY3AgPSBzdHJjaHIoYywgJ1xuJykpICE9IE5VTEwpCisJCSpjcCA9ICdcMCc7CisKKwlpZiAoaWdub3JlZHVwcyAmJiAhc3RyY21wKGMsICpoaXN0cHRyKQorI2lmICFkZWZpbmVkKE1LU0hfU01BTEwpICYmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCisJICAgICYmICFoaXN0c3luYygpCisjZW5kaWYKKwkgICAgKSB7CisJCWFmcmVlKGMsIEFQRVJNKTsKKwkJcmV0dXJuOworCX0KKwkrKypsbnA7CisKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorCWlmIChoaXN0ZmQgJiYgZG93cml0ZSkKKwkJd3JpdGVoaXN0ZmlsZSgqbG5wLCBjKTsKKyNlbmRpZgorCisJaHAgPSBoaXN0cHRyOworCisJaWYgKCsraHAgPj0gaGlzdG9yeSArIGhpc3RzaXplKSB7IC8qIHJlbW92ZSBvbGRlc3QgY29tbWFuZCAqLworCQlhZnJlZSgqaGlzdG9yeSwgQVBFUk0pOworCQlmb3IgKGhwID0gaGlzdG9yeTsgaHAgPCBoaXN0b3J5ICsgaGlzdHNpemUgLSAxOyBocCsrKQorCQkJaHBbMF0gPSBocFsxXTsKKwl9CisJKmhwID0gYzsKKwloaXN0cHRyID0gaHA7Cit9CisKKy8qCisgKglXcml0ZSBoaXN0b3J5IGRhdGEgdG8gYSBmaWxlIG5vbWluYXRlZCBieSBISVNURklMRQorICoJaWYgSElTVEZJTEUgaXMgdW5zZXQgdGhlbiBoaXN0b3J5IHN0aWxsIGhhcHBlbnMsIGJ1dAorICoJdGhlIGRhdGEgaXMgbm90IHdyaXR0ZW4gdG8gYSBmaWxlCisgKglBbGwgY29waWVzIG9mIGtzaCBsb29raW5nIGF0IHRoZSBmaWxlIHdpbGwgbWFpbnRhaW4gdGhlCisgKglzYW1lIGhpc3RvcnkuIFRoaXMgaXMga3NoIGJlaGF2aW91ci4KKyAqCisgKglUaGlzIHN0dWZmIHVzZXMgbW1hcCgpCisgKglpZiB5b3VyIHN5c3RlbSBhaW4ndCBnb3QgaXQgLSB0aGVuIHlvdSdsbCBoYXZlIHRvIHVuZGVmIEhJU1RPUllGSUxFCisgKi8KKworLyoKKyAqCU9wZW4gYSBoaXN0b3J5IGZpbGUKKyAqCUZvcm1hdCBpczoKKyAqCUJ5dGVzIDEsIDI6CisgKgkJSE1BR0lDIC0ganVzdCB0byBjaGVjayB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGgKKyAqCQl0aGUgY29ycmVjdCBvYmplY3QKKyAqCVRoZW4gZm9sbG93cyBhIG51bWJlciBvZiBzdG9yZWQgY29tbWFuZHMKKyAqCUVhY2ggY29tbWFuZCBpcworICoJPGNvbW1hbmQgYnl0ZT48Y29tbWFuZCBudW1iZXIoNCBieXRlcyk+PGJ5dGVzPjxudWxsPgorICovCisjZGVmaW5lIEhNQUdJQzEJCTB4YWIKKyNkZWZpbmUgSE1BR0lDMgkJMHhjZAorI2RlZmluZSBDT01NQU5ECQkweGZmCisKK3ZvaWQKK2hpc3RfaW5pdChTb3VyY2UgKnMpCit7CisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKKwl1bnNpZ25lZCBjaGFyICpiYXNlOworCWludCBsaW5lcywgZmQsIHJ2ID0gMDsKKyNlbmRpZgorCisJaWYgKEZsYWcoRlRBTEtJTkcpID09IDApCisJCXJldHVybjsKKworCWhzdGFydGVkID0gMTsKKworCWhpc3Rfc291cmNlID0gczsKKworI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCisJaWYgKChobmFtZSA9IHN0cl92YWwoZ2xvYmFsKCJISVNURklMRSIpKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCXN0cmR1cHgoaG5hbWUsIGhuYW1lLCBBUEVSTSk7CisKKyByZXRyeToKKwkvKiB3ZSBoYXZlIGEgZmlsZSBhbmQgYXJlIGludGVyYWN0aXZlICovCisJaWYgKChmZCA9IG9wZW4oaG5hbWUsIE9fUkRXUnxPX0NSRUFUfE9fQVBQRU5ELCAwNjAwKSkgPCAwKQorCQlyZXR1cm47CisKKwloaXN0ZmQgPSBzYXZlZmQoZmQpOworCWlmIChoaXN0ZmQgIT0gZmQpCisJCWNsb3NlKGZkKTsKKworCSh2b2lkKWZsb2NrKGhpc3RmZCwgTE9DS19FWCk7CisKKwloc2l6ZSA9IGxzZWVrKGhpc3RmZCwgKG9mZl90KTAsIFNFRUtfRU5EKTsKKworCWlmIChoc2l6ZSA9PSAwKSB7CisJCS8qIGFkZCBtYWdpYyAqLworCQlpZiAoc3ByaW5rbGUoaGlzdGZkKSkgeworCQkJaGlzdF9maW5pc2goKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSBpZiAoaHNpemUgPiAwKSB7CisJCS8qCisJCSAqIHdlIGhhdmUgc29tZSBkYXRhCisJCSAqLworCQliYXNlID0gKHZvaWQgKiltbWFwKE5VTEwsIGhzaXplLCBQUk9UX1JFQUQsCisJCSAgICBNQVBfRklMRSB8IE1BUF9QUklWQVRFLCBoaXN0ZmQsIChvZmZfdCkwKTsKKwkJLyoKKwkJICogY2hlY2sgb24gaXRzIHZhbGlkaXR5CisJCSAqLworCQlpZiAoYmFzZSA9PSAodW5zaWduZWQgY2hhciAqKU1BUF9GQUlMRUQgfHwKKwkJICAgICpiYXNlICE9IEhNQUdJQzEgfHwgYmFzZVsxXSAhPSBITUFHSUMyKSB7CisJCQlpZiAoYmFzZSAhPSAodW5zaWduZWQgY2hhciAqKU1BUF9GQUlMRUQpCisJCQkJbXVubWFwKChjYWRkcl90KWJhc2UsIGhzaXplKTsKKwkJCWhpc3RfZmluaXNoKCk7CisJCQlpZiAodW5saW5rKGhuYW1lKSAvKiBmYWlscyAqLykKKwkJCQlnb3RvIGhpbml0ZXJyOworCQkJZ290byByZXRyeTsKKwkJfQorCQlpZiAoaHNpemUgPiAyKSB7CisJCQlsaW5lcyA9IGhpc3RfY291bnRfbGluZXMoYmFzZSsyLCBoc2l6ZS0yKTsKKwkJCWlmIChsaW5lcyA+IGhpc3RzaXplKSB7CisJCQkJLyogd2UgbmVlZCB0byBtYWtlIHRoZSBmaWxlIHNtYWxsZXIgKi8KKwkJCQlpZiAoaGlzdF9zaHJpbmsoYmFzZSwgaHNpemUpKQorCQkJCQlydiA9IHVubGluayhobmFtZSk7CisJCQkJbXVubWFwKChjYWRkcl90KWJhc2UsIGhzaXplKTsKKwkJCQloaXN0X2ZpbmlzaCgpOworCQkJCWlmIChydikgeworIGhpbml0ZXJyOgorCQkJCQliaV9lcnJvcmYoImNhbm5vdCB1bmxpbmsgSElTVEZJTEUgJXMiCisJCQkJCSAgICAiIC0gJXMiLCBobmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJaHNpemUgPSAwOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKwkJaGlzdGxvYWQoaGlzdF9zb3VyY2UsIGJhc2UrMiwgaHNpemUtMik7CisJCW11bm1hcCgoY2FkZHJfdCliYXNlLCBoc2l6ZSk7CisJfQorCSh2b2lkKWZsb2NrKGhpc3RmZCwgTE9DS19VTik7CisJaHNpemUgPSBsc2VlayhoaXN0ZmQsIChvZmZfdCkwLCBTRUVLX0VORCk7CisjZW5kaWYKK30KKworI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCit0eXBlZGVmIGVudW0gc3RhdGUgeworCXNoZHIsCQkvKiBleHBlY3RpbmcgYSBoZWFkZXIgKi8KKwlzbGluZSwJCS8qIGxvb2tpbmcgZm9yIGEgbnVsbCBieXRlIHRvIGVuZCB0aGUgbGluZSAqLworCXNuMSwJCS8qIGJ5dGVzIDEgdG8gNCBvZiBhIGxpbmUgbm8gKi8KKwlzbjIsIHNuMywgc240Cit9IFN0YXRlOworCitzdGF0aWMgaW50CitoaXN0X2NvdW50X2xpbmVzKHVuc2lnbmVkIGNoYXIgKmJhc2UsIGludCBieXRlcykKK3sKKwlTdGF0ZSBzdGF0ZSA9IHNoZHI7CisJaW50IGxpbmVzID0gMDsKKworCXdoaWxlIChieXRlcy0tKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBzaGRyOgorCQkJaWYgKCpiYXNlID09IENPTU1BTkQpCisJCQkJc3RhdGUgPSBzbjE7CisJCQlicmVhazsKKwkJY2FzZSBzbjE6CisJCQlzdGF0ZSA9IHNuMjsgYnJlYWs7CisJCWNhc2Ugc24yOgorCQkJc3RhdGUgPSBzbjM7IGJyZWFrOworCQljYXNlIHNuMzoKKwkJCXN0YXRlID0gc240OyBicmVhazsKKwkJY2FzZSBzbjQ6CisJCQlzdGF0ZSA9IHNsaW5lOyBicmVhazsKKwkJY2FzZSBzbGluZToKKwkJCWlmICgqYmFzZSA9PSAnXDAnKSB7CisJCQkJbGluZXMrKzsKKwkJCQlzdGF0ZSA9IHNoZHI7CisJCQl9CisJCX0KKwkJYmFzZSsrOworCX0KKwlyZXR1cm4gKGxpbmVzKTsKK30KKworLyoKKyAqCVNocmluayB0aGUgaGlzdG9yeSBmaWxlIHRvIGhpc3RzaXplIGxpbmVzCisgKi8KK3N0YXRpYyBpbnQKK2hpc3Rfc2hyaW5rKHVuc2lnbmVkIGNoYXIgKm9sZGJhc2UsIGludCBvbGRieXRlcykKK3sKKwlpbnQgZmQsIHJ2ID0gMDsKKwljaGFyICpuZmlsZSA9IE5VTEw7CisJc3RydWN0CXN0YXQgc3RhdGI7CisJdW5zaWduZWQgY2hhciAqbmJhc2UgPSBvbGRiYXNlOworCWludCBuYnl0ZXMgPSBvbGRieXRlczsKKworCW5iYXNlID0gaGlzdF9za2lwX2JhY2sobmJhc2UsICZuYnl0ZXMsIGhpc3RzaXplKTsKKwlpZiAobmJhc2UgPT0gTlVMTCkKKwkJcmV0dXJuICgxKTsKKwlpZiAobmJhc2UgPT0gb2xkYmFzZSkKKwkJcmV0dXJuICgwKTsKKworCS8qCisJICoJY3JlYXRlIHRlbXAgZmlsZQorCSAqLworCW5maWxlID0gc2hmX3NtcHJpbnRmKCIlcy4lZCIsIGhuYW1lLCAoaW50KXByb2NwaWQpOworCWlmICgoZmQgPSBvcGVuKG5maWxlLCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fV1JPTkxZLCAwNjAwKSkgPCAwKQorCQlnb3RvIGVycm91dDsKKwlpZiAoZnN0YXQoaGlzdGZkLCAmc3RhdGIpID49IDAgJiYKKwkgICAgY2hvd24obmZpbGUsIHN0YXRiLnN0X3VpZCwgc3RhdGIuc3RfZ2lkKSkKKwkJZ290byBlcnJvdXQ7CisKKwlpZiAoc3ByaW5rbGUoZmQpIHx8IHdyaXRlKGZkLCBuYmFzZSwgbmJ5dGVzKSAhPSBuYnl0ZXMpCisJCWdvdG8gZXJyb3V0OworCWNsb3NlKGZkKTsKKwlmZCA9IC0xOworCisJLyoKKwkgKglyZW5hbWUKKwkgKi8KKwlpZiAocmVuYW1lKG5maWxlLCBobmFtZSkgPCAwKSB7CisgZXJyb3V0OgorCQlpZiAoZmQgPj0gMCkgeworCQkJY2xvc2UoZmQpOworCQkJaWYgKG5maWxlKQorCQkJCXVubGluayhuZmlsZSk7CisJCX0KKwkJcnYgPSAxOworCX0KKwlhZnJlZShuZmlsZSwgQVRFTVApOworCXJldHVybiAocnYpOworfQorCisvKgorICoJZmluZCBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgJ25vJyBiYWNrIGZyb20gdGhlIGVuZCBvZiB0aGUgZmlsZQorICoJcmV0dXJuIHRoZSBwb2ludGVyIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgoraGlzdF9za2lwX2JhY2sodW5zaWduZWQgY2hhciAqYmFzZSwgaW50ICpieXRlcywgaW50IG5vKQoreworCWludCBsaW5lcyA9IDA7CisJdW5zaWduZWQgY2hhciAqZXA7CisKKwlmb3IgKGVwID0gYmFzZSArICpieXRlczsgLS1lcCA+IGJhc2U7ICkgeworCQkvKgorCQkgKiB0aGlzIGRvZXNuJ3QgcmVhbGx5IHdvcms6IHRoZSA0IGJ5dGUgbGluZSBudW1iZXIgdGhhdAorCQkgKiBpcyBlbmNvZGVkIGFmdGVyIHRoZSBDT01NQU5EIGJ5dGUgY2FuIGl0c2VsZiBjb250YWluCisJCSAqIHRoZSBDT01NQU5EIGJ5dGUuLi4uCisJCSAqLworCQlmb3IgKDsgZXAgPiBiYXNlICYmICplcCAhPSBDT01NQU5EOyBlcC0tKQorCQkJOworCQlpZiAoZXAgPT0gYmFzZSkKKwkJCWJyZWFrOworCQlpZiAoKytsaW5lcyA9PSBubykgeworCQkJKmJ5dGVzID0gKmJ5dGVzIC0gKChjaGFyICopZXAgLSAoY2hhciAqKWJhc2UpOworCQkJcmV0dXJuIChlcCk7CisJCX0KKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworLyoKKyAqCWxvYWQgdGhlIGhpc3Rvcnkgc3RydWN0dXJlIGZyb20gdGhlIHN0b3JlZCBkYXRhCisgKi8KK3N0YXRpYyB2b2lkCitoaXN0bG9hZChTb3VyY2UgKnMsIHVuc2lnbmVkIGNoYXIgKmJhc2UsIGludCBieXRlcykKK3sKKwlTdGF0ZSBzdGF0ZTsKKwlpbnQgbG5vID0gMDsKKwl1bnNpZ25lZCBjaGFyICpsaW5lID0gTlVMTDsKKworCWZvciAoc3RhdGUgPSBzaGRyOyBieXRlcy0tID4gMDsgYmFzZSsrKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBzaGRyOgorCQkJaWYgKCpiYXNlID09IENPTU1BTkQpCisJCQkJc3RhdGUgPSBzbjE7CisJCQlicmVhazsKKwkJY2FzZSBzbjE6CisJCQlsbm8gPSAoKCgqYmFzZSkmMHhmZik8PDI0KTsKKwkJCXN0YXRlID0gc24yOworCQkJYnJlYWs7CisJCWNhc2Ugc24yOgorCQkJbG5vIHw9ICgoKCpiYXNlKSYweGZmKTw8MTYpOworCQkJc3RhdGUgPSBzbjM7CisJCQlicmVhazsKKwkJY2FzZSBzbjM6CisJCQlsbm8gfD0gKCgoKmJhc2UpJjB4ZmYpPDw4KTsKKwkJCXN0YXRlID0gc240OworCQkJYnJlYWs7CisJCWNhc2Ugc240OgorCQkJbG5vIHw9ICgqYmFzZSkmMHhmZjsKKwkJCWxpbmUgPSBiYXNlKzE7CisJCQlzdGF0ZSA9IHNsaW5lOworCQkJYnJlYWs7CisJCWNhc2Ugc2xpbmU6CisJCQlpZiAoKmJhc2UgPT0gJ1wwJykgeworCQkJCS8qIHdvcnJ5IGFib3V0IGxpbmUgbnVtYmVycyAqLworCQkJCWlmIChoaXN0cHRyID49IGhpc3RvcnkgJiYgbG5vLTEgIT0gcy0+bGluZSkgeworCQkJCQkvKiBhIHJlcGxhY2VtZW50ID8gKi8KKwkJCQkJaGlzdGluc2VydChzLCBsbm8sIChjaGFyICopbGluZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcy0+bGluZSA9IGxuby0tOworCQkJCQloaXN0c2F2ZSgmbG5vLCAoY2hhciAqKWxpbmUsIGZhbHNlLAorCQkJCQkgICAgZmFsc2UpOworCQkJCX0KKwkJCQlzdGF0ZSA9IHNoZHI7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKglJbnNlcnQgYSBsaW5lIGludG8gdGhlIGhpc3RvcnkgYXQgYSBzcGVjaWZpZWQgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkCitoaXN0aW5zZXJ0KFNvdXJjZSAqcywgaW50IGxubywgY29uc3QgY2hhciAqbGluZSkKK3sKKwljaGFyICoqaHA7CisKKwlpZiAobG5vID49IHMtPmxpbmUgLSAoaGlzdHB0ciAtIGhpc3RvcnkpICYmIGxubyA8PSBzLT5saW5lKSB7CisJCWhwID0gJmhpc3RwdHJbbG5vIC0gcy0+bGluZV07CisJCWlmICgqaHApCisJCQlhZnJlZSgqaHAsIEFQRVJNKTsKKwkJc3RyZHVweCgqaHAsIGxpbmUsIEFQRVJNKTsKKwl9Cit9CisKKy8qCisgKgl3cml0ZSBhIGNvbW1hbmQgdG8gdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSBmaWxlCisgKglUaGlzICpNQVkqIHNlZW0gZWFzeSBidXQgaXQncyBhbHNvIG5lY2Vzc2FyeSB0byBjaGVjaworICoJdGhhdCB0aGUgaGlzdG9yeSBmaWxlIGhhcyBub3QgY2hhbmdlZCBpbiBzaXplLgorICoJSWYgaXQgaGFzIC0gdGhlbiBzb21lIG90aGVyIHNoZWxsIGhhcyB3cml0dGVuIHRvIGl0CisgKglhbmQgd2Ugc2hvdWxkIHJlYWQgdGhvc2UgY29tbWFuZHMgdG8gdXBkYXRlIG91ciBoaXN0b3J5CisgKi8KK3N0YXRpYyB2b2lkCit3cml0ZWhpc3RmaWxlKGludCBsbm8sIGNoYXIgKmNtZCkKK3sKKwlpbnQJc2l6ZW5vdzsKKwl1bnNpZ25lZCBjaGFyCSpiYXNlOworCXVuc2lnbmVkIGNoYXIJKm5ld3M7CisJaW50CWJ5dGVzOworCXVuc2lnbmVkIGNoYXIJaGRyWzVdOworCisJKHZvaWQpZmxvY2soaGlzdGZkLCBMT0NLX0VYKTsKKwlzaXplbm93ID0gbHNlZWsoaGlzdGZkLCAob2ZmX3QpMCwgU0VFS19FTkQpOworCWlmIChzaXplbm93ICE9IGhzaXplKSB7CisJCS8qCisJCSAqCVRoaW5ncyBoYXZlIGNoYW5nZWQKKwkJICovCisJCWlmIChzaXplbm93ID4gaHNpemUpIHsKKwkJCS8qIHNvbWVvbmUgaGFzIGFkZGVkIHNvbWUgbGluZXMgKi8KKwkJCWJ5dGVzID0gc2l6ZW5vdyAtIGhzaXplOworCQkJYmFzZSA9ICh2b2lkICopbW1hcChOVUxMLCBzaXplbm93LCBQUk9UX1JFQUQsCisJCQkgICAgTUFQX0ZJTEUgfCBNQVBfUFJJVkFURSwgaGlzdGZkLCAob2ZmX3QpMCk7CisJCQlpZiAoYmFzZSA9PSAodW5zaWduZWQgY2hhciAqKU1BUF9GQUlMRUQpCisJCQkJZ290byBiYWQ7CisJCQluZXdzID0gYmFzZSArIGhzaXplOworCQkJaWYgKCpuZXdzICE9IENPTU1BTkQpIHsKKwkJCQltdW5tYXAoKGNhZGRyX3QpYmFzZSwgc2l6ZW5vdyk7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQloaXN0X3NvdXJjZS0+bGluZS0tOworCQkJaGlzdGxvYWQoaGlzdF9zb3VyY2UsIG5ld3MsIGJ5dGVzKTsKKwkJCWhpc3Rfc291cmNlLT5saW5lKys7CisJCQlsbm8gPSBoaXN0X3NvdXJjZS0+bGluZTsKKwkJCW11bm1hcCgoY2FkZHJfdCliYXNlLCBzaXplbm93KTsKKwkJCWhzaXplID0gc2l6ZW5vdzsKKwkJfSBlbHNlIHsKKwkJCS8qIGl0IGhhcyBzaHJ1bmsgKi8KKwkJCS8qIGJ1dCB0byB3aGF0PyAqLworCQkJLyogd2UnbGwgZ2l2ZSB1cCBmb3Igbm93ICovCisJCQlnb3RvIGJhZDsKKwkJfQorCX0KKwlpZiAoY21kKSB7CisJCS8qCisJCSAqCXdlIGNhbiB3cml0ZSBvdXIgYml0IG5vdworCQkgKi8KKwkJaGRyWzBdID0gQ09NTUFORDsKKwkJaGRyWzFdID0gKGxubz4+MjQpJjB4ZmY7CisJCWhkclsyXSA9IChsbm8+PjE2KSYweGZmOworCQloZHJbM10gPSAobG5vPj44KSYweGZmOworCQloZHJbNF0gPSBsbm8mMHhmZjsKKwkJYnl0ZXMgPSBzdHJsZW4oY21kKSArIDE7CisJCWlmICgod3JpdGUoaGlzdGZkLCBoZHIsIDUpICE9IDUpIHx8CisJCSAgICAod3JpdGUoaGlzdGZkLCBjbWQsIGJ5dGVzKSAhPSBieXRlcykpCisJCQlnb3RvIGJhZDsKKwkJaHNpemUgPSBsc2VlayhoaXN0ZmQsIChvZmZfdCkwLCBTRUVLX0VORCk7CisJfQorCSh2b2lkKWZsb2NrKGhpc3RmZCwgTE9DS19VTik7CisJcmV0dXJuOworIGJhZDoKKwloaXN0X2ZpbmlzaCgpOworfQorCit2b2lkCitoaXN0X2ZpbmlzaCh2b2lkKQoreworCSh2b2lkKWZsb2NrKGhpc3RmZCwgTE9DS19VTik7CisJKHZvaWQpY2xvc2UoaGlzdGZkKTsKKwloaXN0ZmQgPSAwOworfQorCisvKgorICoJYWRkIG1hZ2ljIHRvIHRoZSBoaXN0b3J5IGZpbGUKKyAqLworc3RhdGljIGludAorc3ByaW5rbGUoaW50IGZkKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1hZ1tdID0geyBITUFHSUMxLCBITUFHSUMyIH07CisKKwlyZXR1cm4gKHdyaXRlKGZkLCBtYWcsIDIpICE9IDIpOworfQorI2VuZGlmCisKKyNpZiAhSEFWRV9TWVNfU0lHTkFNRQorc3RhdGljIGNvbnN0IHN0cnVjdCBta3NoX3NpZ3BhaXIgeworCWNvbnN0IGNoYXIgKmNvbnN0IG5hbWU7CisJaW50IG5yOworfSBta3NoX3NpZ3BhaXJzW10gPSB7CisjaW5jbHVkZSAic2lnbmFtZXMuaW5jIgorCXsgTlVMTCwgMCB9Cit9OworI2VuZGlmCisKK3ZvaWQKK2luaXR0cmFwcyh2b2lkKQoreworCWludCBpOworCWNvbnN0IGNoYXIgKmNzOworCisJLyogUG9wdWxhdGUgc2lndHJhcHMgYmFzZWQgb24gc3lzX3NpZ25hbWUgYW5kIHN5c19zaWdsaXN0LiAqLworCWZvciAoaSA9IDA7IGkgPD0gTlNJRzsgaSsrKSB7CisJCXNpZ3RyYXBzW2ldLnNpZ25hbCA9IGk7CisJCWlmIChpID09IFNJR0VSUl8pIHsKKwkJCXNpZ3RyYXBzW2ldLm5hbWUgPSAiRVJSIjsKKwkJCXNpZ3RyYXBzW2ldLm1lc3MgPSAiRXJyb3IgaGFuZGxlciI7CisJCX0gZWxzZSB7CisjaWYgSEFWRV9TWVNfU0lHTkFNRQorCQkJY3MgPSBzeXNfc2lnbmFtZVtpXTsKKyNlbHNlCisJCQljb25zdCBzdHJ1Y3QgbWtzaF9zaWdwYWlyICpwYWlyID0gbWtzaF9zaWdwYWlyczsKKwkJCXdoaWxlICgocGFpci0+bnIgIT0gaSkgJiYgKHBhaXItPm5hbWUgIT0gTlVMTCkpCisJCQkJKytwYWlyOworCQkJY3MgPSBwYWlyLT5uYW1lOworI2VuZGlmCisJCQlpZiAoKGNzID09IE5VTEwpIHx8CisJCQkgICAgKGNzWzBdID09ICdcMCcpKQorCQkJCXNpZ3RyYXBzW2ldLm5hbWUgPSBzaGZfc21wcmludGYoIiVkIiwgaSk7CisJCQllbHNlIHsKKwkJCQljaGFyICpzOworCisJCQkJaWYgKCFzdHJuY2FzZWNtcChjcywgIlNJRyIsIDMpKQorCQkJCQljcyArPSAzOworCQkJCXN0cmR1cHgocywgY3MsIEFQRVJNKTsKKwkJCQlzaWd0cmFwc1tpXS5uYW1lID0gczsKKwkJCQl3aGlsZSAoKCpzID0ga3NoX3RvdXBwZXIoKnMpKSkKKwkJCQkJKytzOworCQkJfQorI2lmIEhBVkVfU1lTX1NJR0xJU1QKKwkJCXNpZ3RyYXBzW2ldLm1lc3MgPSBzeXNfc2lnbGlzdFtpXTsKKyNlbGlmIEhBVkVfU1RSU0lHTkFMCisJCQlzaWd0cmFwc1tpXS5tZXNzID0gc3Ryc2lnbmFsKGkpOworI2Vsc2UKKwkJCXNpZ3RyYXBzW2ldLm1lc3MgPSBOVUxMOworI2VuZGlmCisJCQlpZiAoKHNpZ3RyYXBzW2ldLm1lc3MgPT0gTlVMTCkgfHwKKwkJCSAgICAoc2lndHJhcHNbaV0ubWVzc1swXSA9PSAnXDAnKSkKKwkJCQlzaWd0cmFwc1tpXS5tZXNzID0gc2hmX3NtcHJpbnRmKCJTaWduYWwgJWQiLCBpKTsKKwkJfQorCX0KKwlzaWd0cmFwc1tTSUdFWElUX10ubmFtZSA9ICJFWElUIjsJLyogb3VyIG5hbWUgZm9yIHNpZ25hbCAwICovCisKKwkodm9pZClzaWdlbXB0eXNldCgmU2lnYWN0X2lnbi5zYV9tYXNrKTsKKwlTaWdhY3RfaWduLnNhX2ZsYWdzID0gMDsgLyogaW50ZXJydXB0aWJsZSAqLworCVNpZ2FjdF9pZ24uc2FfaGFuZGxlciA9IFNJR19JR047CisKKwlzaWd0cmFwc1tTSUdJTlRdLmZsYWdzIHw9IFRGX0RGTF9JTlRSIHwgVEZfVFRZX0lOVFI7CisJc2lndHJhcHNbU0lHUVVJVF0uZmxhZ3MgfD0gVEZfREZMX0lOVFIgfCBURl9UVFlfSU5UUjsKKwlzaWd0cmFwc1tTSUdURVJNXS5mbGFncyB8PSBURl9ERkxfSU5UUjsvKiBub3QgZmF0YWwgZm9yIGludGVyYWN0aXZlICovCisJc2lndHJhcHNbU0lHSFVQXS5mbGFncyB8PSBURl9GQVRBTDsKKwlzaWd0cmFwc1tTSUdDSExEXS5mbGFncyB8PSBURl9TSEVMTF9VU0VTOworCisJLyogdGhlc2UgYXJlIGFsd2F5cyBjYXVnaHQgc28gd2UgY2FuIGNsZWFuIHVwIGFueSB0ZW1wb3JhcnkgZmlsZXMuICovCisJc2V0c2lnKCZzaWd0cmFwc1tTSUdJTlRdLCB0cmFwc2lnLCBTU19SRVNUT1JFX09SSUcpOworCXNldHNpZygmc2lndHJhcHNbU0lHUVVJVF0sIHRyYXBzaWcsIFNTX1JFU1RPUkVfT1JJRyk7CisJc2V0c2lnKCZzaWd0cmFwc1tTSUdURVJNXSwgdHJhcHNpZywgU1NfUkVTVE9SRV9PUklHKTsKKwlzZXRzaWcoJnNpZ3RyYXBzW1NJR0hVUF0sIHRyYXBzaWcsIFNTX1JFU1RPUkVfT1JJRyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYXJtX2NhdGNoZXIoaW50IHNpZyk7CisKK3ZvaWQKK2FsYXJtX2luaXQodm9pZCkKK3sKKwlzaWd0cmFwc1tTSUdBTFJNXS5mbGFncyB8PSBURl9TSEVMTF9VU0VTOworCXNldHNpZygmc2lndHJhcHNbU0lHQUxSTV0sIGFsYXJtX2NhdGNoZXIsCisJCVNTX1JFU1RPUkVfT1JJR3xTU19GT1JDRXxTU19TSFRSQVApOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2FsYXJtX2NhdGNoZXIoaW50IHNpZyBNS1NIX0FfVU5VU0VEKQoreworCS8qIHRoaXMgcnVucyBpbnNpZGUgaW50ZXJydXB0IGNvbnRleHQsIHdpdGggZXJybm8gc2F2ZWQgKi8KKworCWlmIChrc2hfdG1vdXRfc3RhdGUgPT0gVE1PVVRfUkVBRElORykgeworCQlpbnQgbGVmdCA9IGFsYXJtKDApOworCisJCWlmIChsZWZ0ID09IDApIHsKKwkJCWtzaF90bW91dF9zdGF0ZSA9IFRNT1VUX0xFQVZJTkc7CisJCQlpbnRyc2lnID0gMTsKKwkJfSBlbHNlCisJCQlhbGFybShsZWZ0KTsKKwl9Cit9CisKK1RyYXAgKgorZ2V0dHJhcChjb25zdCBjaGFyICpuYW1lLCBpbnQgaWduY2FzZSkKK3sKKwlpbnQgbiA9IE5TSUcgKyAxOworCVRyYXAgKnA7CisJY29uc3QgY2hhciAqbjI7CisJaW50ICgqY21wZnVuYykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopID0gc3RyY21wOworCisJaWYgKGtzaF9pc2RpZ2l0KCpuYW1lKSkgeworCQlpZiAoZ2V0bihuYW1lLCAmbikgJiYgMCA8PSBuICYmIG4gPCBOU0lHKQorCQkJcmV0dXJuICgmc2lndHJhcHNbbl0pOworCQllbHNlCisJCQlyZXR1cm4gKE5VTEwpOworCX0KKworCW4yID0gc3RybmNhc2VjbXAobmFtZSwgIlNJRyIsIDMpID8gTlVMTCA6IG5hbWUgKyAzOworCWlmIChpZ25jYXNlKQorCQljbXBmdW5jID0gc3RyY2FzZWNtcDsKKwlmb3IgKHAgPSBzaWd0cmFwczsgLS1uID49IDA7IHArKykKKwkJaWYgKCFjbXBmdW5jKHAtPm5hbWUsIG5hbWUpIHx8IChuMiAmJiAhY21wZnVuYyhwLT5uYW1lLCBuMikpKQorCQkJcmV0dXJuIChwKTsKKwlyZXR1cm4gKE5VTEwpOworfQorCisvKgorICogdHJhcCBzaWduYWwgaGFuZGxlcgorICovCit2b2lkCit0cmFwc2lnKGludCBpKQoreworCVRyYXAgKnAgPSAmc2lndHJhcHNbaV07CisJaW50IGVycm5vXyA9IGVycm5vOworCisJdHJhcCA9IHAtPnNldCA9IDE7CisJaWYgKHAtPmZsYWdzICYgVEZfREZMX0lOVFIpCisJCWludHJzaWcgPSAxOworCWlmICgocC0+ZmxhZ3MgJiBURl9GQVRBTCkgJiYgIXAtPnRyYXApIHsKKwkJZmF0YWxfdHJhcCA9IDE7CisJCWludHJzaWcgPSAxOworCX0KKwlpZiAocC0+c2h0cmFwKQorCQkoKnAtPnNodHJhcCkoaSk7CisJZXJybm8gPSBlcnJub187Cit9CisKKy8qCisgKiBjYWxsZWQgd2hlbiB3ZSB3YW50IHRvIGFsbG93IHRoZSB1c2VyIHRvIF5DIG91dCBvZiBzb21ldGhpbmcgLSB3b24ndAorICogd29yayBpZiB1c2VyIGhhcyB0cmFwcGVkIFNJR0lOVC4KKyAqLwordm9pZAoraW50cmNoZWNrKHZvaWQpCit7CisJaWYgKGludHJzaWcpCisJCXJ1bnRyYXBzKFRGX0RGTF9JTlRSfFRGX0ZBVEFMKTsKK30KKworLyoKKyAqIGNhbGxlZCBhZnRlciBFSU5UUiB0byBjaGVjayBpZiBhIHNpZ25hbCB3aXRoIG5vcm1hbGx5IGNhdXNlcyBwcm9jZXNzCisgKiB0ZXJtaW5hdGlvbiBoYXMgYmVlbiByZWNlaXZlZC4KKyAqLworaW50CitmYXRhbF90cmFwX2NoZWNrKHZvaWQpCit7CisJaW50IGk7CisJVHJhcCAqcDsKKworCS8qIHRvZG86IHNob3VsZCBjaGVjayBpZiBzaWduYWwgaXMgZmF0YWwsIG5vdCB0aGUgVEZfREZMX0lOVFIgZmxhZyAqLworCWZvciAocCA9IHNpZ3RyYXBzLCBpID0gTlNJRysxOyAtLWkgPj0gMDsgcCsrKQorCQlpZiAocC0+c2V0ICYmIChwLT5mbGFncyAmIChURl9ERkxfSU5UUnxURl9GQVRBTCkpKQorCQkJLyogcmV0dXJuIHZhbHVlIGlzIHVzZWQgYXMgYW4gZXhpdCBjb2RlICovCisJCQlyZXR1cm4gKDEyOCArIHAtPnNpZ25hbCk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFJldHVybnMgdGhlIHNpZ25hbCBudW1iZXIgb2YgYW55IHBlbmRpbmcgdHJhcHM6IGllLCBhIHNpZ25hbCB3aGljaCBoYXMKKyAqIG9jY3VycmVkIGZvciB3aGljaCBhIHRyYXAgaGFzIGJlZW4gc2V0IG9yIGZvciB3aGljaCB0aGUgVEZfREZMX0lOVFIgZmxhZworICogaXMgc2V0LgorICovCitpbnQKK3RyYXBfcGVuZGluZyh2b2lkKQoreworCWludCBpOworCVRyYXAgKnA7CisKKwlmb3IgKHAgPSBzaWd0cmFwcywgaSA9IE5TSUcrMTsgLS1pID49IDA7IHArKykKKwkJaWYgKHAtPnNldCAmJiAoKHAtPnRyYXAgJiYgcC0+dHJhcFswXSkgfHwKKwkJICAgICgocC0+ZmxhZ3MgJiAoVEZfREZMX0lOVFJ8VEZfRkFUQUwpKSAmJiAhcC0+dHJhcCkpKQorCQkJcmV0dXJuIChwLT5zaWduYWwpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBydW4gYW55IHBlbmRpbmcgdHJhcHMuIElmIGludHIgaXMgc2V0LCBvbmx5IHJ1biB0cmFwcyB0aGF0CisgKiBjYW4gaW50ZXJydXB0IGNvbW1hbmRzLgorICovCit2b2lkCitydW50cmFwcyhpbnQgZmxhZykKK3sKKwlpbnQgaTsKKwlUcmFwICpwOworCisJaWYgKGtzaF90bW91dF9zdGF0ZSA9PSBUTU9VVF9MRUFWSU5HKSB7CisJCWtzaF90bW91dF9zdGF0ZSA9IFRNT1VUX0VYRUNVVElORzsKKwkJd2FybmluZ2YoZmFsc2UsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgaW5wdXQiKTsKKwkJdW53aW5kKExFWElUKTsKKwl9IGVsc2UKKwkJLyoKKwkJICogWFhYOiB0aGlzIG1lYW5zIHRoZSBhbGFybSB3aWxsIGhhdmUgbm8gZWZmZWN0IGlmIGEgdHJhcAorCQkgKiBpcyBjYXVnaHQgYWZ0ZXIgdGhlIGFsYXJtKCkgd2FzIHN0YXJ0ZWQuLi5ub3QgZ29vZC4KKwkJICovCisJCWtzaF90bW91dF9zdGF0ZSA9IFRNT1VUX0VYRUNVVElORzsKKwlpZiAoIWZsYWcpCisJCXRyYXAgPSAwOworCWlmIChmbGFnICYgVEZfREZMX0lOVFIpCisJCWludHJzaWcgPSAwOworCWlmIChmbGFnICYgVEZfRkFUQUwpCisJCWZhdGFsX3RyYXAgPSAwOworCWZvciAocCA9IHNpZ3RyYXBzLCBpID0gTlNJRysxOyAtLWkgPj0gMDsgcCsrKQorCQlpZiAocC0+c2V0ICYmICghZmxhZyB8fAorCQkgICAgKChwLT5mbGFncyAmIGZsYWcpICYmIHAtPnRyYXAgPT0gTlVMTCkpKQorCQkJcnVudHJhcChwKTsKK30KKwordm9pZAorcnVudHJhcChUcmFwICpwKQoreworCWludAlpID0gcC0+c2lnbmFsOworCWNoYXIJKnRyYXBzdHIgPSBwLT50cmFwOworCWludAlvZXhzdGF0OworCWludAlvbGRfY2hhbmdlZCA9IDA7CisKKwlwLT5zZXQgPSAwOworCWlmICh0cmFwc3RyID09IE5VTEwpIHsgLyogU0lHX0RGTCAqLworCQlpZiAocC0+ZmxhZ3MgJiBURl9GQVRBTCkgeworCQkJLyogZWcsIFNJR0hVUCAqLworCQkJZXhzdGF0ID0gMTI4ICsgaTsKKwkJCXVud2luZChMTEVBVkUpOworCQl9CisJCWlmIChwLT5mbGFncyAmIFRGX0RGTF9JTlRSKSB7CisJCQkvKiBlZywgU0lHSU5ULCBTSUdRVUlULCBTSUdURVJNLCBldGMuICovCisJCQlleHN0YXQgPSAxMjggKyBpOworCQkJdW53aW5kKExJTlRSKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWlmICh0cmFwc3RyWzBdID09ICdcMCcpIC8qIFNJR19JR04gKi8KKwkJcmV0dXJuOworCWlmIChpID09IFNJR0VYSVRfIHx8IGkgPT0gU0lHRVJSXykgewkvKiBhdm9pZCByZWN1cnNpb24gb24gdGhlc2UgKi8KKwkJb2xkX2NoYW5nZWQgPSBwLT5mbGFncyAmIFRGX0NIQU5HRUQ7CisJCXAtPmZsYWdzICY9IH5URl9DSEFOR0VEOworCQlwLT50cmFwID0gTlVMTDsKKwl9CisJb2V4c3RhdCA9IGV4c3RhdDsKKwkvKgorCSAqIE5vdGU6IHRyYXBzdHIgaXMgZnVsbHkgcGFyc2VkIGJlZm9yZSBhbnl0aGluZyBpcyBleGVjdXRlZCwgdGh1cworCSAqIG5vIHByb2JsZW0gd2l0aCBhZnJlZShwLT50cmFwKSBpbiBzZXR0cmFwKCkgd2hpbGUgc3RpbGwgaW4gdXNlLgorCSAqLworCWNvbW1hbmQodHJhcHN0ciwgY3VycmVudF9saW5lbm8pOworCWV4c3RhdCA9IG9leHN0YXQ7CisJaWYgKGkgPT0gU0lHRVhJVF8gfHwgaSA9PSBTSUdFUlJfKSB7CisJCWlmIChwLT5mbGFncyAmIFRGX0NIQU5HRUQpCisJCQkvKiBkb24ndCBjbGVhciBURl9DSEFOR0VEICovCisJCQlhZnJlZSh0cmFwc3RyLCBBUEVSTSk7CisJCWVsc2UKKwkJCXAtPnRyYXAgPSB0cmFwc3RyOworCQlwLT5mbGFncyB8PSBvbGRfY2hhbmdlZDsKKwl9Cit9CisKKy8qIGNsZWFyIHBlbmRpbmcgdHJhcHMgYW5kIHJlc2V0IHVzZXIncyB0cmFwIGhhbmRsZXJzOyB1c2VkIGFmdGVyIGZvcmsoMikgKi8KK3ZvaWQKK2NsZWFydHJhcHModm9pZCkKK3sKKwlpbnQgaTsKKwlUcmFwICpwOworCisJdHJhcCA9IDA7CisJaW50cnNpZyA9IDA7CisJZmF0YWxfdHJhcCA9IDA7CisJZm9yIChpID0gTlNJRysxLCBwID0gc2lndHJhcHM7IC0taSA+PSAwOyBwKyspIHsKKwkJcC0+c2V0ID0gMDsKKwkJaWYgKChwLT5mbGFncyAmIFRGX1VTRVJfU0VUKSAmJiAocC0+dHJhcCAmJiBwLT50cmFwWzBdKSkKKwkJCXNldHRyYXAocCwgTlVMTCk7CisJfQorfQorCisvKiByZXN0b3JlIHNpZ25hbHMganVzdCBiZWZvcmUgYW4gZXhlYygyKSAqLwordm9pZAorcmVzdG9yZXNpZ3Modm9pZCkKK3sKKwlpbnQgaTsKKwlUcmFwICpwOworCisJZm9yIChpID0gTlNJRysxLCBwID0gc2lndHJhcHM7IC0taSA+PSAwOyBwKyspCisJCWlmIChwLT5mbGFncyAmIChURl9FWEVDX0lHTnxURl9FWEVDX0RGTCkpCisJCQlzZXRzaWcocCwgKHAtPmZsYWdzICYgVEZfRVhFQ19JR04pID8gU0lHX0lHTiA6IFNJR19ERkwsCisJCQkgICAgU1NfUkVTVE9SRV9DVVJSfFNTX0ZPUkNFKTsKK30KKwordm9pZAorc2V0dHJhcChUcmFwICpwLCBjb25zdCBjaGFyICpzKQoreworCXNpZ190IGY7CisKKwlpZiAocC0+dHJhcCkKKwkJYWZyZWUocC0+dHJhcCwgQVBFUk0pOworCXN0cmR1cHgocC0+dHJhcCwgcywgQVBFUk0pOyAvKiBoYW5kbGVzIHMgPT0gMCAqLworCXAtPmZsYWdzIHw9IFRGX0NIQU5HRUQ7CisJZiA9ICFzID8gU0lHX0RGTCA6IHNbMF0gPyB0cmFwc2lnIDogU0lHX0lHTjsKKworCXAtPmZsYWdzIHw9IFRGX1VTRVJfU0VUOworCWlmICgocC0+ZmxhZ3MgJiAoVEZfREZMX0lOVFJ8VEZfRkFUQUwpKSAmJiBmID09IFNJR19ERkwpCisJCWYgPSB0cmFwc2lnOworCWVsc2UgaWYgKHAtPmZsYWdzICYgVEZfU0hFTExfVVNFUykgeworCQlpZiAoIShwLT5mbGFncyAmIFRGX09SSUdfSUdOKSB8fCBGbGFnKEZUQUxLSU5HKSkgeworCQkJLyogZG8gd2hhdCB1c2VyIHdhbnRzIGF0IGV4ZWMgdGltZSAqLworCQkJcC0+ZmxhZ3MgJj0gfihURl9FWEVDX0lHTnxURl9FWEVDX0RGTCk7CisJCQlpZiAoZiA9PSBTSUdfSUdOKQorCQkJCXAtPmZsYWdzIHw9IFRGX0VYRUNfSUdOOworCQkJZWxzZQorCQkJCXAtPmZsYWdzIHw9IFRGX0VYRUNfREZMOworCQl9CisKKwkJLyoKKwkJICogYXNzdW1lcyBoYW5kbGVyIGFscmVhZHkgc2V0IHRvIHdoYXQgc2hlbGwgd2FudHMgaXQKKwkJICogKG5vcm1hbGx5IHRyYXBzaWcsIGJ1dCBjb3VsZCBiZSBqX3NpZ2NobGQoKSBvciBTSUdfSUdOKQorCQkgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIHRvZG86IHNob3VsZCB3ZSBsZXQgdXNlciBrbm93IHNpZ25hbCBpcyBpZ25vcmVkPyBob3c/ICovCisJc2V0c2lnKHAsIGYsIFNTX1JFU1RPUkVfQ1VSUnxTU19VU0VSKTsKK30KKworLyoKKyAqIENhbGxlZCBieSBjX3ByaW50KCkgd2hlbiB3cml0aW5nIHRvIGEgY28tcHJvY2VzcyB0byBlbnN1cmUgU0lHUElQRSB3b24ndAorICoga2lsbCBzaGVsbCAodW5sZXNzIHVzZXIgY2F0Y2hlcyBpdCBhbmQgZXhpdHMpCisgKi8KK2ludAorYmxvY2tfcGlwZSh2b2lkKQoreworCWludCByZXN0b3JlX2RmbCA9IDA7CisJVHJhcCAqcCA9ICZzaWd0cmFwc1tTSUdQSVBFXTsKKworCWlmICghKHAtPmZsYWdzICYgKFRGX09SSUdfSUdOfFRGX09SSUdfREZMKSkpIHsKKwkJc2V0c2lnKHAsIFNJR19JR04sIFNTX1JFU1RPUkVfQ1VSUik7CisJCWlmIChwLT5mbGFncyAmIFRGX09SSUdfREZMKQorCQkJcmVzdG9yZV9kZmwgPSAxOworCX0gZWxzZSBpZiAocC0+Y3Vyc2lnID09IFNJR19ERkwpIHsKKwkJc2V0c2lnKHAsIFNJR19JR04sIFNTX1JFU1RPUkVfQ1VSUik7CisJCXJlc3RvcmVfZGZsID0gMTsgLyogcmVzdG9yZSB0byBTSUdfREZMICovCisJfQorCXJldHVybiAocmVzdG9yZV9kZmwpOworfQorCisvKiBDYWxsZWQgYnkgY19wcmludCgpIHRvIHVuZG8gd2hhdGV2ZXIgYmxvY2tfcGlwZSgpIGRpZCAqLwordm9pZAorcmVzdG9yZV9waXBlKGludCByZXN0b3JlX2RmbCkKK3sKKwlpZiAocmVzdG9yZV9kZmwpCisJCXNldHNpZygmc2lndHJhcHNbU0lHUElQRV0sIFNJR19ERkwsIFNTX1JFU1RPUkVfQ1VSUik7Cit9CisKKy8qCisgKiBTZXQgYWN0aW9uIGZvciBhIHNpZ25hbC4gQWN0aW9uIG1heSBub3QgYmUgc2V0IGlmIG9yaWdpbmFsCisgKiBhY3Rpb24gd2FzIFNJR19JR04sIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgZmxhZ3MgYW5kIEZUQUxLSU5HLgorICovCitpbnQKK3NldHNpZyhUcmFwICpwLCBzaWdfdCBmLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzaWdhY3Q7CisKKwlpZiAocC0+c2lnbmFsID09IFNJR0VYSVRfIHx8IHAtPnNpZ25hbCA9PSBTSUdFUlJfKQorCQlyZXR1cm4gKDEpOworCisJLyoKKwkgKiBGaXJzdCB0aW1lIHNldHRpbmcgdGhpcyBzaWduYWw/IElmIHNvLCBnZXQgYW5kIG5vdGUgdGhlIGN1cnJlbnQKKwkgKiBzZXR0aW5nLgorCSAqLworCWlmICghKHAtPmZsYWdzICYgKFRGX09SSUdfSUdOfFRGX09SSUdfREZMKSkpIHsKKwkJc2lnYWN0aW9uKHAtPnNpZ25hbCwgJlNpZ2FjdF9pZ24sICZzaWdhY3QpOworCQlwLT5mbGFncyB8PSBzaWdhY3Quc2FfaGFuZGxlciA9PSBTSUdfSUdOID8KKwkJICAgIFRGX09SSUdfSUdOIDogVEZfT1JJR19ERkw7CisJCXAtPmN1cnNpZyA9IFNJR19JR047CisJfQorCisJLyotCisJICogR2VuZXJhbGx5LCBhbiBpZ25vcmVkIHNpZ25hbCBzdGF5cyBpZ25vcmVkLCBleGNlcHQgaWYKKwkgKgktIHRoZSB1c2VyIG9mIGFuIGludGVyYWN0aXZlIHNoZWxsIHdhbnRzIHRvIGNoYW5nZSBpdAorCSAqCS0gdGhlIHNoZWxsIHdhbnRzIGZvciBmb3JjZSBhIGNoYW5nZQorCSAqLworCWlmICgocC0+ZmxhZ3MgJiBURl9PUklHX0lHTikgJiYgIShmbGFncyAmIFNTX0ZPUkNFKSAmJgorCSAgICAoIShmbGFncyAmIFNTX1VTRVIpIHx8ICFGbGFnKEZUQUxLSU5HKSkpCisJCXJldHVybiAoMCk7CisKKwlzZXRleGVjc2lnKHAsIGZsYWdzICYgU1NfUkVTVE9SRV9NQVNLKTsKKworCS8qCisJICogVGhpcyBpcyBoZXJlICdjYXVzZSB0aGVyZSBzaG91bGQgYmUgYSB3YXkgb2YgY2xlYXJpbmcKKwkgKiBzaHRyYXBzLCBidXQgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIGEgc2FuZSB3YXkgb2YgZG9pbmcKKwkgKiBpdC4gQXQgdGhlIG1vbWVudCwgYWxsIHVzZXJzIG9mIHNodHJhcCBhcmUgbGlmZXRpbWUKKwkgKiB1c2VycyAoU0lHQUxSTSwgU0lHQ0hMRCwgU0lHV0lOQ0gpLgorCSAqLworCWlmICghKGZsYWdzICYgU1NfVVNFUikpCisJCXAtPnNodHJhcCA9IChzaWdfdClOVUxMOworCWlmIChmbGFncyAmIFNTX1NIVFJBUCkgeworCQlwLT5zaHRyYXAgPSBmOworCQlmID0gdHJhcHNpZzsKKwl9CisKKwlpZiAocC0+Y3Vyc2lnICE9IGYpIHsKKwkJcC0+Y3Vyc2lnID0gZjsKKwkJKHZvaWQpc2lnZW1wdHlzZXQoJnNpZ2FjdC5zYV9tYXNrKTsKKwkJc2lnYWN0LnNhX2ZsYWdzID0gMCAvKiBpbnRlcnJ1cHRpYmxlICovOworCQlzaWdhY3Quc2FfaGFuZGxlciA9IGY7CisJCXNpZ2FjdGlvbihwLT5zaWduYWwsICZzaWdhY3QsIE5VTEwpOworCX0KKworCXJldHVybiAoMSk7Cit9CisKKy8qIGNvbnRyb2wgd2hhdCBzaWduYWwgaXMgc2V0IHRvIGJlZm9yZSBhbiBleGVjKCkgKi8KK3ZvaWQKK3NldGV4ZWNzaWcoVHJhcCAqcCwgaW50IHJlc3RvcmUpCit7CisJLyogWFhYIGRlYnVnZ2luZyAqLworCWlmICghKHAtPmZsYWdzICYgKFRGX09SSUdfSUdOfFRGX09SSUdfREZMKSkpCisJCWludGVybmFsX2Vycm9yZigic2V0ZXhlY3NpZzogdW5zZXQgc2lnbmFsICVkKCVzKSIsCisJCSAgICBwLT5zaWduYWwsIHAtPm5hbWUpOworCisJLyogcmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSBmb3IgZXhlYydkIGtpZHMgKi8KKwlwLT5mbGFncyAmPSB+KFRGX0VYRUNfSUdOfFRGX0VYRUNfREZMKTsKKwlzd2l0Y2ggKHJlc3RvcmUgJiBTU19SRVNUT1JFX01BU0spIHsKKwljYXNlIFNTX1JFU1RPUkVfQ1VSUjogLyogbGVhdmUgdGhpbmdzIGFzIHRoZXkgY3VycmVudGx5IGFyZSAqLworCQlicmVhazsKKwljYXNlIFNTX1JFU1RPUkVfT1JJRzoKKwkJcC0+ZmxhZ3MgfD0gcC0+ZmxhZ3MgJiBURl9PUklHX0lHTiA/IFRGX0VYRUNfSUdOIDogVEZfRVhFQ19ERkw7CisJCWJyZWFrOworCWNhc2UgU1NfUkVTVE9SRV9ERkw6CisJCXAtPmZsYWdzIHw9IFRGX0VYRUNfREZMOworCQlicmVhazsKKwljYXNlIFNTX1JFU1RPUkVfSUdOOgorCQlwLT5mbGFncyB8PSBURl9FWEVDX0lHTjsKKwkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvam9icy5jIGIvbWtzaC9zcmMvam9icy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzI2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9qb2JzLmMKQEAgLTAsMCArMSwxNjQ4IEBACisvKgkkT3BlbkJTRDogam9icy5jLHYgMS4zOCAyMDA5LzEyLzEyIDA0OjI4OjQ0IGRlcmFhZHQgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9qb2JzLmMsdiAxLjY5IDIwMTAvMDcvMDQgMTc6MzM6NTQgdGcgRXhwICQiKTsKKworI2lmIEhBVkVfS0lMTFBHCisjZGVmaW5lIG1rc2hfa2lsbHBnCQlraWxscGcKKyNlbHNlCisvKiBjcm9zcyBmaW5nZXJzIGFuZCBob3BlIGtpbGwgaXMga2lsbHBnLWVuZG93ZWQgKi8KKyNkZWZpbmUgbWtzaF9raWxscGcocCxzKQlraWxsKC0ocCksIChzKSkKKyNlbmRpZgorCisvKiBPcmRlciBpbXBvcnRhbnQhICovCisjZGVmaW5lIFBSVU5OSU5HCTAKKyNkZWZpbmUgUEVYSVRFRAkJMQorI2RlZmluZSBQU0lHTkFMTEVECTIKKyNkZWZpbmUgUFNUT1BQRUQJMworCit0eXBlZGVmIHN0cnVjdCBwcm9jCVByb2M7CitzdHJ1Y3QgcHJvYyB7CisJUHJvYyAqbmV4dDsJCS8qIG5leHQgcHJvY2VzcyBpbiBwaXBlbGluZSAoaWYgYW55KSAqLworCXBpZF90IHBpZDsJCS8qIHByb2Nlc3MgaWQgKi8KKwlpbnQgc3RhdGU7CisJaW50IHN0YXR1czsJCS8qIHdhaXQgc3RhdHVzICovCisJY2hhciBjb21tYW5kWzQ4XTsJLyogcHJvY2VzcyBjb21tYW5kIHN0cmluZyAqLworfTsKKworLyogTm90aWZ5L3ByaW50IGZsYWcgLSBqX3ByaW50KCkgYXJndW1lbnQgKi8KKyNkZWZpbmUgSlBfTk9ORQkJMAkvKiBkb24ndCBwcmludCBhbnl0aGluZyAqLworI2RlZmluZSBKUF9TSE9SVAkxCS8qIHByaW50IHNpZ25hbHMgcHJvY2Vzc2VzIHdlcmUga2lsbGVkIGJ5ICovCisjZGVmaW5lIEpQX01FRElVTQkyCS8qIHByaW50IFtqb2ItbnVtXSAtLysgY29tbWFuZCAqLworI2RlZmluZSBKUF9MT05HCQkzCS8qIHByaW50IFtqb2ItbnVtXSAtLysgcGlkIGNvbW1hbmQgKi8KKyNkZWZpbmUgSlBfUEdSUAkJNAkvKiBwcmludCBwZ3JwICovCisKKy8qIHB1dF9qb2IoKSBmbGFncyAqLworI2RlZmluZSBQSl9PTl9GUk9OVAkwCS8qIGF0IHZlcnkgZnJvbnQgKi8KKyNkZWZpbmUgUEpfUEFTVF9TVE9QUEVECTEJLyoganVzdCBwYXN0IGFueSBzdG9wcGVkIGpvYnMgKi8KKworLyogSm9iLmZsYWdzIHZhbHVlcyAqLworI2RlZmluZSBKRl9TVEFSVEVECTB4MDAxCS8qIHNldCB3aGVuIGFsbCBwcm9jZXNzZXMgaW4gam9iIGFyZSBzdGFydGVkICovCisjZGVmaW5lIEpGX1dBSVRJTkcJMHgwMDIJLyogc2V0IGlmIGpfd2FpdGooKSBpcyB3YWl0aW5nIG9uIGpvYiAqLworI2RlZmluZSBKRl9XX0FTWU5DTk9USUZZIDB4MDA0CS8qIHNldCBpZiB3YWl0aW5nIGFuZCBhc3luYyBub3RpZmljYXRpb24gb2sgKi8KKyNkZWZpbmUgSkZfWFhDT00JMHgwMDgJLyogc2V0IGZvciAkKGNvbW1hbmQpIGpvYnMgKi8KKyNkZWZpbmUgSkZfRkcJCTB4MDEwCS8qIHJ1bm5pbmcgaW4gZm9yZWdyb3VuZCAoYWxzbyBoYXMgdHR5IHBncnApICovCisjZGVmaW5lIEpGX1NBVkVEVFRZCTB4MDIwCS8qIGotPnR0eXN0YXRlIGlzIHZhbGlkICovCisjZGVmaW5lIEpGX0NIQU5HRUQJMHgwNDAJLyogcHJvY2VzcyBoYXMgY2hhbmdlZCBzdGF0ZSAqLworI2RlZmluZSBKRl9LTk9XTgkweDA4MAkvKiAkISByZWZlcmVuY2VkICovCisjZGVmaW5lIEpGX1pPTUJJRQkweDEwMAkvKiBrbm93biwgdW53YWl0ZWQgcHJvY2VzcyAqLworI2RlZmluZSBKRl9SRU1PVkUJMHgyMDAJLyogZmxhZ2dlZCBmb3IgcmVtb3ZhbCAoal9qb2JzKCkval9ub2l0eWYoKSkgKi8KKyNkZWZpbmUgSkZfVVNFVFRZTU9ERQkweDQwMAkvKiB0dHkgbW9kZSBzYXZlZCBpZiBwcm9jZXNzIGV4aXRzIG5vcm1hbGx5ICovCisjZGVmaW5lIEpGX1NBVkVEVFRZUEdSUAkweDgwMAkvKiBqLT5zYXZlZF90dHlwZ3JwIGlzIHZhbGlkICovCisKK3R5cGVkZWYgc3RydWN0IGpvYiBKb2I7CitzdHJ1Y3Qgam9iIHsKKwlKb2IgKm5leHQ7CQkvKiBuZXh0IGpvYiBpbiBsaXN0ICovCisJUHJvYyAqcHJvY19saXN0OwkvKiBwcm9jZXNzIGxpc3QgKi8KKwlQcm9jICpsYXN0X3Byb2M7CS8qIGxhc3QgcHJvY2VzcyBpbiBsaXN0ICovCisJc3RydWN0IHRpbWV2YWwgc3lzdGltZTsJLyogc3lzdGVtIHRpbWUgdXNlZCBieSBqb2IgKi8KKwlzdHJ1Y3QgdGltZXZhbCB1c3J0aW1lOwkvKiB1c2VyIHRpbWUgdXNlZCBieSBqb2IgKi8KKwlwaWRfdCBwZ3JwOwkJLyogcHJvY2VzcyBncm91cCBvZiBqb2IgKi8KKwlwaWRfdCBwcGlkOwkJLyogcGlkIG9mIHByb2Nlc3MgdGhhdCBmb3JrZWQgam9iICovCisJaW50IGpvYjsJCS8qIGpvYiBudW1iZXI6ICVuICovCisJaW50IGZsYWdzOwkJLyogc2VlIEpGXyogKi8KKwl2b2xhdGlsZSBpbnQgc3RhdGU7CS8qIGpvYiBzdGF0ZSAqLworCWludCBzdGF0dXM7CQkvKiBleGl0IHN0YXR1cyBvZiBsYXN0IHByb2Nlc3MgKi8KKwlpbnQzMl90CWFnZTsJCS8qIG51bWJlciBvZiBqb2JzIHN0YXJ0ZWQgKi8KKwlDb3Byb2NfaWQgY29wcm9jX2lkOwkvKiAwIG9yIGlkIG9mIGNvcHJvY2VzcyBvdXRwdXQgcGlwZSAqLworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwlzdHJ1Y3QgdGVybWlvcyB0dHlzdGF0ZTsvKiBzYXZlZCB0dHkgc3RhdGUgZm9yIHN0b3BwZWQgam9icyAqLworCXBpZF90IHNhdmVkX3R0eXBncnA7CS8qIHNhdmVkIHR0eSBwcm9jZXNzIGdyb3VwIGZvciBzdG9wcGVkIGpvYnMgKi8KKyNlbmRpZgorfTsKKworLyogRmxhZ3MgZm9yIGpfd2FpdGooKSAqLworI2RlZmluZSBKV19OT05FCQkweDAwCisjZGVmaW5lIEpXX0lOVEVSUlVQVAkweDAxCS8qIF5DIHdpbGwgc3RvcCB0aGUgd2FpdCAqLworI2RlZmluZSBKV19BU1lOQ05PVElGWQkweDAyCS8qIGFzeW5jaHJvbm91cyBub3RpZmljYXRpb24gZHVyaW5nIHdhaXQgb2sgKi8KKyNkZWZpbmUgSldfU1RPUFBFRFdBSVQJMHgwNAkvKiB3YWl0IGV2ZW4gaWYgam9iIHN0b3BwZWQgKi8KKworLyogRXJyb3IgY29kZXMgZm9yIGpfbG9va3VwKCkgKi8KKyNkZWZpbmUgSkxfT0sJCTAKKyNkZWZpbmUgSkxfTk9TVUNICTEJLyogbm8gc3VjaCBqb2IgKi8KKyNkZWZpbmUgSkxfQU1CSUcJMgkvKiAlZm9vIG9yICU/Zm9vIGlzIGFtYmlndW91cyAqLworI2RlZmluZSBKTF9JTlZBTElECTMJLyogbm9uLXBpZCwgbm9uLSUgam9iIGlkICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBsb29rdXBfbXNnc1tdID0geworCW51bGwsCisJIm5vIHN1Y2ggam9iIiwKKwkiYW1iaWd1b3VzIiwKKwkiYXJndW1lbnQgbXVzdCBiZSAlam9iIG9yIHByb2Nlc3MgaWQiLAorCU5VTEwKK307CisKK3N0YXRpYyBKb2IgKmpvYl9saXN0OwkJLyogam9iIGxpc3QgKi8KK3N0YXRpYyBKb2IgKmxhc3Rfam9iOworc3RhdGljIEpvYiAqYXN5bmNfam9iOworc3RhdGljIHBpZF90IGFzeW5jX3BpZDsKKworc3RhdGljIGludCBuem9tYmllOwkJLyogIyBvZiB6b21iaWVzIG93bmVkIGJ5IHRoaXMgcHJvY2VzcyAqLworc3RhdGljIGludDMyX3QgbmpvYnM7CQkvKiAjIG9mIGpvYnMgc3RhcnRlZCAqLworCisjaWZuZGVmIENISUxEX01BWAorI2RlZmluZSBDSElMRF9NQVgJMjUKKyNlbmRpZgorCisvKiBoZWxkX3NpZ2NobGQgaXMgc2V0IGlmIHNpZ2NobGQgb2NjdXJzIGJlZm9yZSBhIGpvYiBpcyBjb21wbGV0ZWx5IHN0YXJ0ZWQgKi8KK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgaGVsZF9zaWdjaGxkOworCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorc3RhdGljIHN0cnVjdCBzaGYJKnNobF9qOworc3RhdGljIGJvb2wJCXR0eXBncnBfb2s7CS8qIHNldCBpZiBjYW4gdXNlIHR0eSBwZ3JwcyAqLworc3RhdGljIHBpZF90CQlyZXN0b3JlX3R0eXBncnAgPSAtMTsKK3N0YXRpYyBpbnQgY29uc3QJdHRfc2lnc1tdID0geyBTSUdUU1RQLCBTSUdUVElOLCBTSUdUVE9VIH07CisjZW5kaWYKKworc3RhdGljIHZvaWQJCWpfc2V0X2FzeW5jKEpvYiAqKTsKK3N0YXRpYyB2b2lkCQlqX3N0YXJ0am9iKEpvYiAqKTsKK3N0YXRpYyBpbnQJCWpfd2FpdGooSm9iICosIGludCwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyB2b2lkCQlqX3NpZ2NobGQoaW50KTsKK3N0YXRpYyB2b2lkCQlqX3ByaW50KEpvYiAqLCBpbnQsIHN0cnVjdCBzaGYgKik7CitzdGF0aWMgSm9iCQkqal9sb29rdXAoY29uc3QgY2hhciAqLCBpbnQgKik7CitzdGF0aWMgSm9iCQkqbmV3X2pvYih2b2lkKTsKK3N0YXRpYyBQcm9jCQkqbmV3X3Byb2Modm9pZCk7CitzdGF0aWMgdm9pZAkJY2hlY2tfam9iKEpvYiAqKTsKK3N0YXRpYyB2b2lkCQlwdXRfam9iKEpvYiAqLCBpbnQpOworc3RhdGljIHZvaWQJCXJlbW92ZV9qb2IoSm9iICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50CQlraWxsX2pvYihKb2IgKiwgaW50KTsKKworLyogaW5pdGlhbGlzZSBqb2IgY29udHJvbCAqLwordm9pZAoral9pbml0KHZvaWQpCit7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCWJvb2wgbWZsYWdzZXQgPSBGbGFnKEZNT05JVE9SKSAhPSAxMjc7CisKKwlGbGFnKEZNT05JVE9SKSA9IDA7CisjZW5kaWYKKworCSh2b2lkKXNpZ2VtcHR5c2V0KCZzbV9kZWZhdWx0KTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNtX2RlZmF1bHQsIE5VTEwpOworCisJKHZvaWQpc2lnZW1wdHlzZXQoJnNtX3NpZ2NobGQpOworCSh2b2lkKXNpZ2FkZHNldCgmc21fc2lnY2hsZCwgU0lHQ0hMRCk7CisKKwlzZXRzaWcoJnNpZ3RyYXBzW1NJR0NITERdLCBqX3NpZ2NobGQsCisJICAgIFNTX1JFU1RPUkVfT1JJR3xTU19GT1JDRXxTU19TSFRSQVApOworCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCWlmICghbWZsYWdzZXQgJiYgRmxhZyhGVEFMS0lORykpCisJCUZsYWcoRk1PTklUT1IpID0gMTsKKworCS8qCisJICogc2hsX2ogaXMgdXNlZCB0byBkbyBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uICh1c2VkIGluCisJICogYW4gaW50ZXJydXB0IGhhbmRsZXIsIHNvIG5lZWQgYSBkaXN0aW5jdCBzaGYpCisJICovCisJc2hsX2ogPSBzaGZfZmRvcGVuKDIsIFNIRl9XUiwgTlVMTCk7CisKKwlpZiAoRmxhZyhGTU9OSVRPUikgfHwgRmxhZyhGVEFMS0lORykpIHsKKwkJaW50IGk7CisKKwkJLyoKKwkJICogdGhlIFRGX1NIRUxMX1VTRVMgdGVzdCBpcyBhIGtsdWRnZSB0aGF0IGxldHMgdXMga25vdyBpZgorCQkgKiBpZiB0aGUgc2lnbmFscyBoYXZlIGJlZW4gY2hhbmdlZCBieSB0aGUgc2hlbGwuCisJCSAqLworCQlmb3IgKGkgPSBORUxFTSh0dF9zaWdzKTsgLS1pID49IDA7ICkgeworCQkJc2lndHJhcHNbdHRfc2lnc1tpXV0uZmxhZ3MgfD0gVEZfU0hFTExfVVNFUzsKKwkJCS8qIGpfY2hhbmdlKCkgc2V0cyB0aGlzIHRvIFNTX1JFU1RPUkVfREZMIGlmIEZNT05JVE9SICovCisJCQlzZXRzaWcoJnNpZ3RyYXBzW3R0X3NpZ3NbaV1dLCBTSUdfSUdOLAorCQkJICAgIFNTX1JFU1RPUkVfSUdOfFNTX0ZPUkNFKTsKKwkJfQorCX0KKworCS8qIGpfY2hhbmdlKCkgY2FsbHMgdHR5X2luaXQoKSAqLworCWlmIChGbGFnKEZNT05JVE9SKSkKKwkJal9jaGFuZ2UoKTsKKwllbHNlCisjZW5kaWYKKwkgIGlmIChGbGFnKEZUQUxLSU5HKSkKKwkJdHR5X2luaXQodHJ1ZSwgdHJ1ZSk7Cit9CisKKy8qIGpvYiBjbGVhbnVwIGJlZm9yZSBzaGVsbCBleGl0ICovCit2b2lkCitqX2V4aXQodm9pZCkKK3sKKwkvKiBraWxsIHN0b3BwZWQsIGFuZCBwb3NzaWJseSBydW5uaW5nLCBqb2JzICovCisJSm9iCSpqOworCWludAlraWxsZWQgPSAwOworCisJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpIHsKKwkJaWYgKGotPnBwaWQgPT0gcHJvY3BpZCAmJgorCQkgICAgKGotPnN0YXRlID09IFBTVE9QUEVEIHx8CisJCSAgICAoai0+c3RhdGUgPT0gUFJVTk5JTkcgJiYKKwkJICAgICgoai0+ZmxhZ3MgJiBKRl9GRykgfHwKKwkJICAgIChGbGFnKEZMT0dJTikgJiYgIUZsYWcoRk5PSFVQKSAmJiBwcm9jcGlkID09IGtzaHBpZCkpKSkpIHsKKwkJCWtpbGxlZCA9IDE7CisJCQlpZiAoai0+cGdycCA9PSAwKQorCQkJCWtpbGxfam9iKGosIFNJR0hVUCk7CisJCQllbHNlCisJCQkJbWtzaF9raWxscGcoai0+cGdycCwgU0lHSFVQKTsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJCQlpZiAoai0+c3RhdGUgPT0gUFNUT1BQRUQpIHsKKwkJCQlpZiAoai0+cGdycCA9PSAwKQorCQkJCQlraWxsX2pvYihqLCBTSUdDT05UKTsKKwkJCQllbHNlCisJCQkJCW1rc2hfa2lsbHBnKGotPnBncnAsIFNJR0NPTlQpOworCQkJfQorI2VuZGlmCisJCX0KKwl9CisJaWYgKGtpbGxlZCkKKwkJc2xlZXAoMSk7CisJal9ub3RpZnkoKTsKKworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwlpZiAoa3NocGlkID09IHByb2NwaWQgJiYgcmVzdG9yZV90dHlwZ3JwID49IDApIHsKKwkJLyoKKwkJICogTmVlZCB0byByZXN0b3JlIHRoZSB0dHkgcGdycCB0byB3aGF0IGl0IHdhcyB3aGVuIHRoZQorCQkgKiBzaGVsbCBzdGFydGVkIHVwLCBzbyB0aGF0IHRoZSBwcm9jZXNzIHRoYXQgc3RhcnRlZCB1cworCQkgKiB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIHRoZSB0dHkgd2hlbiB3ZSBhcmUgZG9uZS4KKwkJICogQWxzbyBuZWVkIHRvIHJlc3RvcmUgb3VyIHByb2Nlc3MgZ3JvdXAgaW4gY2FzZSB3ZSBhcmUKKwkJICogYWJvdXQgdG8gZG8gYW4gZXhlYyBzbyB0aGF0IGJvdGggb3VyIHBhcmVudCBhbmQgdGhlCisJCSAqIHByb2Nlc3Mgd2UgYXJlIHRvIGJlY29tZSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIHRoZSB0dHkuCisJCSAqLworCQl0Y3NldHBncnAodHR5X2ZkLCByZXN0b3JlX3R0eXBncnApOworCQlzZXRwZ2lkKDAsIHJlc3RvcmVfdHR5cGdycCk7CisJfQorCWlmIChGbGFnKEZNT05JVE9SKSkgeworCQlGbGFnKEZNT05JVE9SKSA9IDA7CisJCWpfY2hhbmdlKCk7CisJfQorI2VuZGlmCit9CisKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisvKiB0dXJuIGpvYiBjb250cm9sIG9uIG9yIG9mZiBhY2NvcmRpbmcgdG8gRmxhZyhGTU9OSVRPUikgKi8KK3ZvaWQKK2pfY2hhbmdlKHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoRmxhZyhGTU9OSVRPUikpIHsKKwkJYm9vbCB1c2VfdHR5ID0gRmxhZyhGVEFMS0lORyk7CisKKwkJLyogRG9uJ3QgY2FsbCB0Y2dldGF0dHIoKSAndGlsIHdlIG93biB0aGUgdHR5IHByb2Nlc3MgZ3JvdXAgKi8KKwkJaWYgKHVzZV90dHkpCisJCQl0dHlfaW5pdChmYWxzZSwgdHJ1ZSk7CisKKwkJLyogbm8gY29udHJvbGxpbmcgdHR5LCBubyBTSUdUKiAqLworCQlpZiAoKHR0eXBncnBfb2sgPSB1c2VfdHR5ICYmIHR0eV9mZCA+PSAwICYmIHR0eV9kZXZ0dHkpKSB7CisJCQlzZXRzaWcoJnNpZ3RyYXBzW1NJR1RUSU5dLCBTSUdfREZMLAorCQkJICAgIFNTX1JFU1RPUkVfT1JJR3xTU19GT1JDRSk7CisJCQkvKiB3YWl0IHRvIGJlIGdpdmVuIHR0eSAoUE9TSVguMSwgQi4yLCBqb2IgY29udHJvbCkgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJcGlkX3QgdHR5cGdycDsKKworCQkJCWlmICgodHR5cGdycCA9IHRjZ2V0cGdycCh0dHlfZmQpKSA8IDApIHsKKwkJCQkJd2FybmluZ2YoZmFsc2UsCisJCQkJCSAgICAial9pbml0OiB0Y2dldHBncnAoKSBmYWlsZWQ6ICVzIiwKKwkJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXR0eXBncnBfb2sgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICh0dHlwZ3JwID09IGtzaHBncnApCisJCQkJCWJyZWFrOworCQkJCWtpbGwoMCwgU0lHVFRJTik7CisJCQl9CisJCX0KKwkJZm9yIChpID0gTkVMRU0odHRfc2lncyk7IC0taSA+PSAwOyApCisJCQlzZXRzaWcoJnNpZ3RyYXBzW3R0X3NpZ3NbaV1dLCBTSUdfSUdOLAorCQkJICAgIFNTX1JFU1RPUkVfREZMfFNTX0ZPUkNFKTsKKwkJaWYgKHR0eXBncnBfb2sgJiYga3NocGdycCAhPSBrc2hwaWQpIHsKKwkJCWlmIChzZXRwZ2lkKDAsIGtzaHBpZCkgPCAwKSB7CisJCQkJd2FybmluZ2YoZmFsc2UsCisJCQkJICAgICJqX2luaXQ6IHNldHBnaWQoKSBmYWlsZWQ6ICVzIiwKKwkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQl0dHlwZ3JwX29rID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCWlmICh0Y3NldHBncnAodHR5X2ZkLCBrc2hwaWQpIDwgMCkgeworCQkJCQl3YXJuaW5nZihmYWxzZSwKKwkJCQkJICAgICJqX2luaXQ6IHRjc2V0cGdycCgpIGZhaWxlZDogJXMiLAorCQkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJdHR5cGdycF9vayA9IGZhbHNlOworCQkJCX0gZWxzZQorCQkJCQlyZXN0b3JlX3R0eXBncnAgPSBrc2hwZ3JwOworCQkJCWtzaHBncnAgPSBrc2hwaWQ7CisJCQl9CisJCX0KKwkJaWYgKHVzZV90dHkgJiYgIXR0eXBncnBfb2spCisJCQl3YXJuaW5nZihmYWxzZSwgIndhcm5pbmc6IHdvbid0IGhhdmUgZnVsbCBqb2IgY29udHJvbCIpOworCQlpZiAodHR5X2ZkID49IDApCisJCQl0Y2dldGF0dHIodHR5X2ZkLCAmdHR5X3N0YXRlKTsKKwl9IGVsc2UgeworCQl0dHlwZ3JwX29rID0gZmFsc2U7CisJCWlmIChGbGFnKEZUQUxLSU5HKSkKKwkJCWZvciAoaSA9IE5FTEVNKHR0X3NpZ3MpOyAtLWkgPj0gMDsgKQorCQkJCXNldHNpZygmc2lndHJhcHNbdHRfc2lnc1tpXV0sIFNJR19JR04sCisJCQkJICAgIFNTX1JFU1RPUkVfSUdOfFNTX0ZPUkNFKTsKKwkJZWxzZQorCQkJZm9yIChpID0gTkVMRU0odHRfc2lncyk7IC0taSA+PSAwOyApIHsKKwkJCQlpZiAoc2lndHJhcHNbdHRfc2lnc1tpXV0uZmxhZ3MgJgorCQkJCSAgICAoVEZfT1JJR19JR04gfCBURl9PUklHX0RGTCkpCisJCQkJCXNldHNpZygmc2lndHJhcHNbdHRfc2lnc1tpXV0sCisJCQkJCSAgICAoc2lndHJhcHNbdHRfc2lnc1tpXV0uZmxhZ3MgJiBURl9PUklHX0lHTikgPworCQkJCQkgICAgU0lHX0lHTiA6IFNJR19ERkwsCisJCQkJCSAgICBTU19SRVNUT1JFX09SSUd8U1NfRk9SQ0UpOworCQkJfQorCQlpZiAoIUZsYWcoRlRBTEtJTkcpKQorCQkJdHR5X2Nsb3NlKCk7CisJfQorfQorI2VuZGlmCisKKy8qIGV4ZWN1dGUgdHJlZSBpbiBjaGlsZCBzdWJwcm9jZXNzICovCitpbnQKK2V4Y2hpbGQoc3RydWN0IG9wICp0LCBpbnQgZmxhZ3MsCisgICAgdm9sYXRpbGUgaW50ICp4ZXJyb2ssCisgICAgLyogdXNlZCBpZiBYUENMT1NFIG9yIFhDQ0xPU0UgKi8gaW50IGNsb3NlX2ZkKQoreworCXN0YXRpYyBQcm9jICpsYXN0X3Byb2M7CQkvKiBmb3IgcGlwZWxpbmVzICovCisKKwlpbnQgcnYgPSAwLCBmb3Jrc2xlZXA7CisJc2lnc2V0X3Qgb21hc2s7CisJc3RydWN0IHsKKwkJUHJvYyAqcDsKKwkJSm9iICpqOworCQlwaWRfdCBjbGRwaWQ7CisJfSBwaTsKKworCWlmIChmbGFncyAmIFhFWEVDKQorCQkvKgorCQkgKiBDbGVhciBYRk9SS3xYUENMT1NFfFhDQ0xPU0V8WENPUFJPQ3xYUElQRU98WFBJUEVJfFhYQ09NfFhCR05ECisJCSAqIChhbHNvIGRvbmUgaW4gYW5vdGhlciBleGVjdXRlKCkgYmVsb3cpCisJCSAqLworCQlyZXR1cm4gKGV4ZWN1dGUodCwgZmxhZ3MgJiAoWEVYRUMgfCBYRVJST0spLCB4ZXJyb2spKTsKKworCS8qIG5vIFNJR0NITERzIHdoaWxlIG1lc3Npbmcgd2l0aCBqb2IgYW5kIHByb2Nlc3MgbGlzdHMgKi8KKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOworCisJcGkucCA9IG5ld19wcm9jKCk7CisJcGkucC0+bmV4dCA9IE5VTEw7CisJcGkucC0+c3RhdGUgPSBQUlVOTklORzsKKwlwaS5wLT5zdGF0dXMgPSAwOworCXBpLnAtPnBpZCA9IDA7CisKKwkvKiBsaW5rIHByb2Nlc3MgaW50byBqb2JzIGxpc3QgKi8KKwlpZiAoZmxhZ3MgJiBYUElQRUkpIHsKKwkJLyogY29udGludWluZyB3aXRoIGEgcGlwZSAqLworCQlpZiAoIWxhc3Rfam9iKQorCQkJaW50ZXJuYWxfZXJyb3JmKAorCQkJICAgICJleGNoaWxkOiBYUElQRUkgYW5kIG5vIGxhc3Rfam9iIC0gcGlkICVkIiwKKwkJCSAgICAoaW50KXByb2NwaWQpOworCQlwaS5qID0gbGFzdF9qb2I7CisJCWlmIChsYXN0X3Byb2MpCisJCQlsYXN0X3Byb2MtPm5leHQgPSBwaS5wOworCQlsYXN0X3Byb2MgPSBwaS5wOworCX0gZWxzZSB7CisJCXBpLmogPSBuZXdfam9iKCk7IC8qIGZpbGxzIGluIHBpLmotPmpvYiAqLworCQkvKgorCQkgKiB3ZSBkb24ndCBjb25zaWRlciBYWENPTXMgZm9yZWdyb3VuZCBzaW5jZSB0aGV5IGRvbid0IGdldAorCQkgKiB0dHkgcHJvY2VzcyBncm91cCBhbmQgd2UgZG9uJ3Qgc2F2ZSBvciByZXN0b3JlIHR0eSBtb2Rlcy4KKwkJICovCisJCXBpLmotPmZsYWdzID0gKGZsYWdzICYgWFhDT00pID8gSkZfWFhDT00gOgorCQkgICAgKChmbGFncyAmIFhCR05EKSA/IDAgOiAoSkZfRkd8SkZfVVNFVFRZTU9ERSkpOworCQl0aW1lcmNsZWFyKCZwaS5qLT51c3J0aW1lKTsKKwkJdGltZXJjbGVhcigmcGkuai0+c3lzdGltZSk7CisJCXBpLmotPnN0YXRlID0gUFJVTk5JTkc7CisJCXBpLmotPnBncnAgPSAwOworCQlwaS5qLT5wcGlkID0gcHJvY3BpZDsKKwkJcGkuai0+YWdlID0gKytuam9iczsKKwkJcGkuai0+cHJvY19saXN0ID0gcGkucDsKKwkJcGkuai0+Y29wcm9jX2lkID0gMDsKKwkJbGFzdF9qb2IgPSBwaS5qOworCQlsYXN0X3Byb2MgPSBwaS5wOworCQlwdXRfam9iKHBpLmosIFBKX1BBU1RfU1RPUFBFRCk7CisJfQorCisJc25wdHJlZWYocGkucC0+Y29tbWFuZCwgc2l6ZW9mKHBpLnAtPmNvbW1hbmQpLCAiJVQiLCB0KTsKKworCS8qIGNyZWF0ZSBjaGlsZCBwcm9jZXNzICovCisJZm9ya3NsZWVwID0gMTsKKwl3aGlsZSAoKHBpLmNsZHBpZCA9IGZvcmsoKSkgPCAwICYmIGVycm5vID09IEVBR0FJTiAmJiBmb3Jrc2xlZXAgPCAzMikgeworCQlpZiAoaW50cnNpZykJIC8qIGFsbG93IHVzZXIgdG8gXkMgb3V0Li4uICovCisJCQlicmVhazsKKwkJc2xlZXAoZm9ya3NsZWVwKTsKKwkJZm9ya3NsZWVwIDw8PSAxOworCX0KKwlpZiAocGkuY2xkcGlkIDwgMCkgeworCQlraWxsX2pvYihwaS5qLCBTSUdLSUxMKTsKKwkJcmVtb3ZlX2pvYihwaS5qLCAiZm9yayBmYWlsZWQiKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCWVycm9yZigiY2Fubm90IGZvcmsgLSB0cnkgYWdhaW4iKTsKKwl9CisJcGkucC0+cGlkID0gcGkuY2xkcGlkID8gcGkuY2xkcGlkIDogKHByb2NwaWQgPSBnZXRwaWQoKSk7CisKKwkvKgorCSAqIGVuc3VyZSBuZXh0IGNoaWxkIGdldHMgYSAoc2xpZ2h0bHkpIGRpZmZlcmVudCAkUkFORE9NIHNlcXVlbmNlCisJICogZnJvbSBpdHMgcGFyZW50IHByb2Nlc3MgYW5kIG90aGVyIGNoaWxkIHByb2Nlc3NlcworCSAqLworCWNoYW5nZV9yYW5kb20oJnBpLCBzaXplb2YocGkpKTsKKworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkvKiBqb2IgY29udHJvbCBzZXQgdXAgKi8KKwlpZiAoRmxhZyhGTU9OSVRPUikgJiYgIShmbGFncyZYWENPTSkpIHsKKwkJaW50CWRvdHR5ID0gMDsKKwkJaWYgKHBpLmotPnBncnAgPT0gMCkgewkvKiBGaXJzdCBwcm9jZXNzICovCisJCQlwaS5qLT5wZ3JwID0gcGkucC0+cGlkOworCQkJZG90dHkgPSAxOworCQl9CisKKwkJLyogc2V0IHBncnAgaW4gYm90aCBwYXJlbnQgYW5kIGNoaWxkIHRvIGRlYWwgd2l0aCByYWNlCisJCSAqIGNvbmRpdGlvbgorCQkgKi8KKwkJc2V0cGdpZChwaS5wLT5waWQsIHBpLmotPnBncnApOworCQlpZiAodHR5cGdycF9vayAmJiBkb3R0eSAmJiAhKGZsYWdzICYgWEJHTkQpKQorCQkJdGNzZXRwZ3JwKHR0eV9mZCwgcGkuai0+cGdycCk7CisJfQorI2VuZGlmCisKKwkvKiB1c2VkIHRvIGNsb3NlIHBpcGUgaW5wdXQgZmQgKi8KKwlpZiAoY2xvc2VfZmQgPj0gMCAmJiAoKChmbGFncyAmIFhQQ0xPU0UpICYmIHBpLmNsZHBpZCkgfHwKKwkgICAgKChmbGFncyAmIFhDQ0xPU0UpICYmICFwaS5jbGRwaWQpKSkKKwkJY2xvc2UoY2xvc2VfZmQpOworCWlmICghcGkuY2xkcGlkKSB7CisJCS8qIGNoaWxkICovCisKKwkJLyogRG8gdGhpcyBiZWZvcmUgcmVzdG9yaW5nIHNpZ25hbCAqLworCQlpZiAoZmxhZ3MgJiBYQ09QUk9DKQorCQkJY29wcm9jX2NsZWFudXAoZmFsc2UpOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJY2xlYW51cF9wYXJlbnRzX2VudigpOworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkJLyogSWYgRk1PTklUT1Igb3IgRlRBTEtJTkcgaXMgc2V0LCB0aGVzZSBzaWduYWxzIGFyZSBpZ25vcmVkLAorCQkgKiBpZiBuZWl0aGVyIEZNT05JVE9SIG5vciBGVEFMS0lORyBhcmUgc2V0LCB0aGUgc2lnbmFscyBoYXZlCisJCSAqIHRoZWlyIGluaGVyaXRlZCB2YWx1ZXMuCisJCSAqLworCQlpZiAoRmxhZyhGTU9OSVRPUikgJiYgIShmbGFncyAmIFhYQ09NKSkgeworCQkJZm9yIChmb3Jrc2xlZXAgPSBORUxFTSh0dF9zaWdzKTsgLS1mb3Jrc2xlZXAgPj0gMDsgKQorCQkJCXNldHNpZygmc2lndHJhcHNbdHRfc2lnc1tmb3Jrc2xlZXBdXSwgU0lHX0RGTCwKKwkJCQkgICAgU1NfUkVTVE9SRV9ERkx8U1NfRk9SQ0UpOworCQl9CisjZW5kaWYKKyNpZiBIQVZFX05JQ0UKKwkJaWYgKEZsYWcoRkJHTklDRSkgJiYgKGZsYWdzICYgWEJHTkQpKQorCQkJKHZvaWQpbmljZSg0KTsKKyNlbmRpZgorCQlpZiAoKGZsYWdzICYgWEJHTkQpCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCQkgICAgJiYgIUZsYWcoRk1PTklUT1IpCisjZW5kaWYKKwkJICAgICkgeworCQkJc2V0c2lnKCZzaWd0cmFwc1tTSUdJTlRdLCBTSUdfSUdOLAorCQkJICAgIFNTX1JFU1RPUkVfSUdOfFNTX0ZPUkNFKTsKKwkJCXNldHNpZygmc2lndHJhcHNbU0lHUVVJVF0sIFNJR19JR04sCisJCQkgICAgU1NfUkVTVE9SRV9JR058U1NfRk9SQ0UpOworCQkJaWYgKCghKGZsYWdzICYgKFhQSVBFSSB8IFhDT1BST0MpKSkgJiYKKwkJCSAgICAoKGZvcmtzbGVlcCA9IG9wZW4oIi9kZXYvbnVsbCIsIDApKSA+IDApKSB7CisJCQkJKHZvaWQpa3NoX2R1cDIoZm9ya3NsZWVwLCAwLCB0cnVlKTsKKwkJCQljbG9zZShmb3Jrc2xlZXApOworCQkJfQorCQl9CisJCXJlbW92ZV9qb2IocGkuaiwgImNoaWxkIik7CS8qIGluIGNhc2Ugb2YgJChqb2JzKSBjb21tYW5kICovCisJCW56b21iaWUgPSAwOworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkJdHR5cGdycF9vayA9IGZhbHNlOworCQlGbGFnKEZNT05JVE9SKSA9IDA7CisjZW5kaWYKKwkJRmxhZyhGVEFMS0lORykgPSAwOworCQl0dHlfY2xvc2UoKTsKKwkJY2xlYXJ0cmFwcygpOworCQkvKiBubyByZXR1cm4gKi8KKwkJZXhlY3V0ZSh0LCAoZmxhZ3MgJiBYRVJST0spIHwgWEVYRUMsIE5VTEwpOworI2lmbmRlZiBNS1NIX1NNQUxMCisJCWlmICh0LT50eXBlID09IFRQSVBFKQorCQkJdW53aW5kKExMRUFWRSk7CisJCWludGVybmFsX3dhcm5pbmdmKCJleGNoaWxkOiBleGVjdXRlKCkgcmV0dXJuZWQiKTsKKwkJZnB0cmVlZihzaGxfb3V0LCAyLCAiZXhjaGlsZDogdHJpZWQgdG8gZXhlY3V0ZSB7XG4lVFxufVxuIiwgdCk7CisJCXNoZl9mbHVzaChzaGxfb3V0KTsKKyNlbmRpZgorCQl1bndpbmQoTExFQVZFKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCS8qIHNoZWxsIChwYXJlbnQpIHN0dWZmICovCisJaWYgKCEoZmxhZ3MgJiBYUElQRU8pKSB7CS8qIGxhc3QgcHJvY2VzcyBpbiBhIGpvYiAqLworCQlqX3N0YXJ0am9iKHBpLmopOworCQlpZiAoZmxhZ3MgJiBYQ09QUk9DKSB7CisJCQlwaS5qLT5jb3Byb2NfaWQgPSBjb3Byb2MuaWQ7CisJCQkvKiBuIGpvYnMgdXNpbmcgY28tcHJvY2VzcyBvdXRwdXQgKi8KKwkJCWNvcHJvYy5uam9icysrOworCQkJLyogaiB1c2luZyBjby1wcm9jZXNzIGlucHV0ICovCisJCQljb3Byb2Muam9iID0gKHZvaWQgKilwaS5qOworCQl9CisJCWlmIChmbGFncyAmIFhCR05EKSB7CisJCQlqX3NldF9hc3luYyhwaS5qKTsKKwkJCWlmIChGbGFnKEZUQUxLSU5HKSkgeworCQkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICJbJWRdIiwgcGkuai0+am9iKTsKKwkJCQlmb3IgKHBpLnAgPSBwaS5qLT5wcm9jX2xpc3Q7IHBpLnA7CisJCQkJICAgIHBpLnAgPSBwaS5wLT5uZXh0KQorCQkJCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiICVkIiwKKwkJCQkJICAgIChpbnQpcGkucC0+cGlkKTsKKwkJCQlzaGZfcHV0Y2hhcignXG4nLCBzaGxfb3V0KTsKKwkJCQlzaGZfZmx1c2goc2hsX291dCk7CisJCQl9CisJCX0gZWxzZQorCQkJcnYgPSBqX3dhaXRqKHBpLmosIEpXX05PTkUsICJqdzpsYXN0IHByb2MiKTsKKwl9CisKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKworCXJldHVybiAocnYpOworfQorCisvKiBzdGFydCB0aGUgbGFzdCBqb2I6IG9ubHkgdXNlZCBmb3IgJChjb21tYW5kKSBqb2JzICovCit2b2lkCitzdGFydGxhc3Qodm9pZCkKK3sKKwlzaWdzZXRfdCBvbWFzazsKKworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7CisKKwlpZiAobGFzdF9qb2IpIHsgLyogbm8gbmVlZCB0byByZXBvcnQgZXJyb3IgLSB3YWl0bGFzdCgpIHdpbGwgZG8gaXQgKi8KKwkJLyogZW5zdXJlIGl0IGlzbid0IHJlbW92ZWQgYnkgY2hlY2tfam9iKCkgKi8KKwkJbGFzdF9qb2ItPmZsYWdzIHw9IEpGX1dBSVRJTkc7CisJCWpfc3RhcnRqb2IobGFzdF9qb2IpOworCX0KKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKK30KKworLyogd2FpdCBmb3IgbGFzdCBqb2I6IG9ubHkgdXNlZCBmb3IgJChjb21tYW5kKSBqb2JzICovCitpbnQKK3dhaXRsYXN0KHZvaWQpCit7CisJaW50CXJ2OworCUpvYgkqajsKKwlzaWdzZXRfdCBvbWFzazsKKworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7CisKKwlqID0gbGFzdF9qb2I7CisJaWYgKCFqIHx8ICEoai0+ZmxhZ3MgJiBKRl9TVEFSVEVEKSkgeworCQlpZiAoIWopCisJCQl3YXJuaW5nZih0cnVlLCAid2FpdGxhc3Q6IG5vIGxhc3Qgam9iIik7CisJCWVsc2UKKwkJCWludGVybmFsX3dhcm5pbmdmKCJ3YWl0bGFzdDogbm90IHN0YXJ0ZWQiKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCXJldHVybiAoMTI1KTsgLyogbm90IHNvIGFyYml0cmFyeSwgbm9uLXplcm8gdmFsdWUgKi8KKwl9CisKKwlydiA9IGpfd2FpdGooaiwgSldfTk9ORSwgImp3OndhaXRsYXN0Iik7CisKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKworCXJldHVybiAocnYpOworfQorCisvKiB3YWl0IGZvciBjaGlsZCwgaW50ZXJydXB0YWJsZS4gKi8KK2ludAord2FpdGZvcihjb25zdCBjaGFyICpjcCwgaW50ICpzaWdwKQoreworCWludAlydjsKKwlKb2IJKmo7CisJaW50CWVjb2RlOworCWludAlmbGFncyA9IEpXX0lOVEVSUlVQVHxKV19BU1lOQ05PVElGWTsKKwlzaWdzZXRfdCBvbWFzazsKKworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7CisKKwkqc2lncCA9IDA7CisKKwlpZiAoY3AgPT0gTlVMTCkgeworCQkvKgorCQkgKiB3YWl0IGZvciBhbiB1bnNwZWNpZmllZCBqb2IgLSBhbHdheXMgcmV0dXJucyAwLCBzbworCQkgKiBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGV4aXRlZC9zaWduYWxlZCBqb2JzCisJCSAqLworCQlmb3IgKGogPSBqb2JfbGlzdDsgajsgaiA9IGotPm5leHQpCisJCQkvKiBBVCZUIGtzaCB3aWxsIHdhaXQgZm9yIHN0b3BwZWQgam9icyAtIHdlIGRvbid0ICovCisJCQlpZiAoai0+cHBpZCA9PSBwcm9jcGlkICYmIGotPnN0YXRlID09IFBSVU5OSU5HKQorCQkJCWJyZWFrOworCQlpZiAoIWopIHsKKwkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9IGVsc2UgaWYgKChqID0gal9sb29rdXAoY3AsICZlY29kZSkpKSB7CisJCS8qIGRvbid0IHJlcG9ydCBub3JtYWwgam9iIGNvbXBsZXRpb24gKi8KKwkJZmxhZ3MgJj0gfkpXX0FTWU5DTk9USUZZOworCQlpZiAoai0+cHBpZCAhPSBwcm9jcGlkKSB7CisJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfSBlbHNlIHsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCWlmIChlY29kZSAhPSBKTF9OT1NVQ0gpCisJCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBsb29rdXBfbXNnc1tlY29kZV0pOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKiBBVCZUIGtzaCB3aWxsIHdhaXQgZm9yIHN0b3BwZWQgam9icyAtIHdlIGRvbid0ICovCisJcnYgPSBqX3dhaXRqKGosIGZsYWdzLCAianc6d2FpdGZvciIpOworCisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisKKwlpZiAocnYgPCAwKSAvKiB3ZSB3ZXJlIGludGVycnVwdGVkICovCisJCSpzaWdwID0gMTI4ICsgLXJ2OworCisJcmV0dXJuIChydik7Cit9CisKKy8qIGtpbGwgKGJ1aWx0LWluKSBhIGpvYiAqLworaW50CitqX2tpbGwoY29uc3QgY2hhciAqY3AsIGludCBzaWcpCit7CisJSm9iCSpqOworCWludAlydiA9IDA7CisJaW50CWVjb2RlOworCXNpZ3NldF90IG9tYXNrOworCisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKKworCWlmICgoaiA9IGpfbG9va3VwKGNwLCAmZWNvZGUpKSA9PSBOVUxMKSB7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBsb29rdXBfbXNnc1tlY29kZV0pOworCQlyZXR1cm4gKDEpOworCX0KKworCWlmIChqLT5wZ3JwID09IDApIHsJLyogc3RhcnRlZCB3aGVuICFGbGFnKEZNT05JVE9SKSAqLworCQlpZiAoa2lsbF9qb2Ioaiwgc2lnKSA8IDApIHsKKwkJCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIHN0cmVycm9yKGVycm5vKSk7CisJCQlydiA9IDE7CisJCX0KKwl9IGVsc2UgeworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkJaWYgKGotPnN0YXRlID09IFBTVE9QUEVEICYmIChzaWcgPT0gU0lHVEVSTSB8fCBzaWcgPT0gU0lHSFVQKSkKKwkJCW1rc2hfa2lsbHBnKGotPnBncnAsIFNJR0NPTlQpOworI2VuZGlmCisJCWlmIChta3NoX2tpbGxwZyhqLT5wZ3JwLCBzaWcpIDwgMCkgeworCQkJYmlfZXJyb3JmKCIlczogJXMiLCBjcCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJ2ID0gMTsKKwkJfQorCX0KKworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCisJcmV0dXJuIChydik7Cit9CisKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisvKiBmZyBhbmQgYmcgYnVpbHQtaW5zOiBjYWxsZWQgb25seSBpZiBGbGFnKEZNT05JVE9SKSBzZXQgKi8KK2ludAoral9yZXN1bWUoY29uc3QgY2hhciAqY3AsIGludCBiZykKK3sKKwlKb2IJKmo7CisJUHJvYwkqcDsKKwlpbnQJZWNvZGU7CisJaW50CXJ1bm5pbmc7CisJaW50CXJ2ID0gMDsKKwlzaWdzZXRfdCBvbWFzazsKKworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7CisKKwlpZiAoKGogPSBqX2xvb2t1cChjcCwgJmVjb2RlKSkgPT0gTlVMTCkgeworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJYmlfZXJyb3JmKCIlczogJXMiLCBjcCwgbG9va3VwX21zZ3NbZWNvZGVdKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlpZiAoai0+cGdycCA9PSAwKSB7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQliaV9lcnJvcmYoImpvYiBub3Qgam9iLWNvbnRyb2xsZWQiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlpZiAoYmcpCisJCXNocHJpbnRmKCJbJWRdICIsIGotPmpvYik7CisKKwlydW5uaW5nID0gMDsKKwlmb3IgKHAgPSBqLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPnN0YXRlID09IFBTVE9QUEVEKSB7CisJCQlwLT5zdGF0ZSA9IFBSVU5OSU5HOworCQkJcC0+c3RhdHVzID0gMDsKKwkJCXJ1bm5pbmcgPSAxOworCQl9CisJCXNoZl9wdXRzKHAtPmNvbW1hbmQsIHNobF9zdGRvdXQpOworCQlpZiAocC0+bmV4dCkKKwkJCXNoZl9wdXRzKCJ8ICIsIHNobF9zdGRvdXQpOworCX0KKwlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKKwlzaGZfZmx1c2goc2hsX3N0ZG91dCk7CisJaWYgKHJ1bm5pbmcpCisJCWotPnN0YXRlID0gUFJVTk5JTkc7CisKKwlwdXRfam9iKGosIFBKX1BBU1RfU1RPUFBFRCk7CisJaWYgKGJnKQorCQlqX3NldF9hc3luYyhqKTsKKwllbHNlIHsKKwkJLyogYXR0YWNoIHR0eSB0byBqb2IgKi8KKwkJaWYgKGotPnN0YXRlID09IFBSVU5OSU5HKSB7CisJCQlpZiAodHR5cGdycF9vayAmJiAoai0+ZmxhZ3MgJiBKRl9TQVZFRFRUWSkpCisJCQkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmai0+dHR5c3RhdGUpOworCQkJLyogU2VlIGNvbW1lbnQgaW4gal93YWl0aiByZWdhcmRpbmcgc2F2ZWRfdHR5cGdycC4gKi8KKwkJCWlmICh0dHlwZ3JwX29rICYmCisJCQkgICAgdGNzZXRwZ3JwKHR0eV9mZCwgKGotPmZsYWdzICYgSkZfU0FWRURUVFlQR1JQKSA/CisJCQkgICAgai0+c2F2ZWRfdHR5cGdycCA6IGotPnBncnApIDwgMCkgeworCQkJCXJ2ID0gZXJybm87CisJCQkJaWYgKGotPmZsYWdzICYgSkZfU0FWRURUVFkpCisJCQkJCXRjc2V0YXR0cih0dHlfZmQsIFRDU0FEUkFJTiwgJnR0eV9zdGF0ZSk7CisJCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywKKwkJCQkgICAgTlVMTCk7CisJCQkJYmlfZXJyb3JmKCIxc3QgdGNzZXRwZ3JwKCVkLCAlZCkgZmFpbGVkOiAlcyIsCisJCQkJICAgIHR0eV9mZCwKKwkJCQkgICAgKGludCkoKGotPmZsYWdzICYgSkZfU0FWRURUVFlQR1JQKSA/CisJCQkJICAgIGotPnNhdmVkX3R0eXBncnAgOiBqLT5wZ3JwKSwKKwkJCQkgICAgc3RyZXJyb3IocnYpKTsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQl9CisJCWotPmZsYWdzIHw9IEpGX0ZHOworCQlqLT5mbGFncyAmPSB+SkZfS05PV047CisJCWlmIChqID09IGFzeW5jX2pvYikKKwkJCWFzeW5jX2pvYiA9IE5VTEw7CisJfQorCisJaWYgKGotPnN0YXRlID09IFBSVU5OSU5HICYmIG1rc2hfa2lsbHBnKGotPnBncnAsIFNJR0NPTlQpIDwgMCkgeworCQlpbnQgZXJyID0gZXJybm87CisKKwkJaWYgKCFiZykgeworCQkJai0+ZmxhZ3MgJj0gfkpGX0ZHOworCQkJaWYgKHR0eXBncnBfb2sgJiYgKGotPmZsYWdzICYgSkZfU0FWRURUVFkpKQorCQkJCXRjc2V0YXR0cih0dHlfZmQsIFRDU0FEUkFJTiwgJnR0eV9zdGF0ZSk7CisJCQlpZiAodHR5cGdycF9vayAmJiB0Y3NldHBncnAodHR5X2ZkLCBrc2hwZ3JwKSA8IDApCisJCQkJd2FybmluZ2YodHJ1ZSwKKwkJCQkgICAgImZnOiAybmQgdGNzZXRwZ3JwKCVkLCAlbGQpIGZhaWxlZDogJXMiLAorCQkJCSAgICB0dHlfZmQsIChsb25nKWtzaHBncnAsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCWJpX2Vycm9yZigiY2Fubm90IGNvbnRpbnVlIGpvYiAlczogJXMiLAorCQkgICAgY3AsIHN0cmVycm9yKGVycikpOworCQlyZXR1cm4gKDEpOworCX0KKwlpZiAoIWJnKSB7CisJCWlmICh0dHlwZ3JwX29rKSB7CisJCQlqLT5mbGFncyAmPSB+KEpGX1NBVkVEVFRZIHwgSkZfU0FWRURUVFlQR1JQKTsKKwkJfQorCQlydiA9IGpfd2FpdGooaiwgSldfTk9ORSwgImp3OnJlc3VtZSIpOworCX0KKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwlyZXR1cm4gKHJ2KTsKK30KKyNlbmRpZgorCisvKiBhcmUgdGhlcmUgYW55IHJ1bm5pbmcgb3Igc3RvcHBlZCBqb2JzID8gKi8KK2ludAoral9zdG9wcGVkX3J1bm5pbmcodm9pZCkKK3sKKwlKb2IJKmo7CisJaW50CXdoaWNoID0gMDsKKworCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KSB7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCQlpZiAoai0+cHBpZCA9PSBwcm9jcGlkICYmIGotPnN0YXRlID09IFBTVE9QUEVEKQorCQkJd2hpY2ggfD0gMTsKKyNlbmRpZgorCQlpZiAoRmxhZyhGTE9HSU4pICYmICFGbGFnKEZOT0hVUCkgJiYgcHJvY3BpZCA9PSBrc2hwaWQgJiYKKwkJICAgIGotPnBwaWQgPT0gcHJvY3BpZCAmJiBqLT5zdGF0ZSA9PSBQUlVOTklORykKKwkJCXdoaWNoIHw9IDI7CisJfQorCWlmICh3aGljaCkgeworCQlzaGVsbGYoIllvdSBoYXZlICVzJXMlcyBqb2JzXG4iLAorCQkgICAgd2hpY2ggJiAxID8gInN0b3BwZWQiIDogIiIsCisJCSAgICB3aGljaCA9PSAzID8gIiBhbmQgIiA6ICIiLAorCQkgICAgd2hpY2ggJiAyID8gInJ1bm5pbmciIDogIiIpOworCQlyZXR1cm4gKDEpOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK2ludAoral9uam9icyh2b2lkKQoreworCUpvYiAqajsKKwlpbnQgbmogPSAwOworCXNpZ3NldF90IG9tYXNrOworCisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKKwlmb3IgKGogPSBqb2JfbGlzdDsgajsgaiA9IGotPm5leHQpCisJCW5qKys7CisKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwlyZXR1cm4gKG5qKTsKK30KKworCisvKiBsaXN0IGpvYnMgZm9yIGpvYnMgYnVpbHQtaW4gKi8KK2ludAoral9qb2JzKGNvbnN0IGNoYXIgKmNwLCBpbnQgc2xwLAorICAgIGludCBuZmxhZykJCS8qIDA6IHNob3J0LCAxOiBsb25nLCAyOiBwZ3JwICovCit7CisJSm9iCSpqLCAqdG1wOworCWludAlob3c7CisJaW50CXpmbGFnID0gMDsKKwlzaWdzZXRfdCBvbWFzazsKKworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7CisKKwlpZiAobmZsYWcgPCAwKSB7IC8qIGtsdWRnZTogcHJpbnQgem9tYmllcyAqLworCQluZmxhZyA9IDA7CisJCXpmbGFnID0gMTsKKwl9CisJaWYgKGNwKSB7CisJCWludAllY29kZTsKKworCQlpZiAoKGogPSBqX2xvb2t1cChjcCwgJmVjb2RlKSkgPT0gTlVMTCkgeworCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBsb29rdXBfbXNnc1tlY29kZV0pOworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0gZWxzZQorCQlqID0gam9iX2xpc3Q7CisJaG93ID0gc2xwID09IDAgPyBKUF9NRURJVU0gOiAoc2xwID09IDEgPyBKUF9MT05HIDogSlBfUEdSUCk7CisJZm9yICg7IGo7IGogPSBqLT5uZXh0KSB7CisJCWlmICgoIShqLT5mbGFncyAmIEpGX1pPTUJJRSkgfHwgemZsYWcpICYmCisJCSAgICAoIW5mbGFnIHx8IChqLT5mbGFncyAmIEpGX0NIQU5HRUQpKSkgeworCQkJal9wcmludChqLCBob3csIHNobF9zdGRvdXQpOworCQkJaWYgKGotPnN0YXRlID09IFBFWElURUQgfHwgai0+c3RhdGUgPT0gUFNJR05BTExFRCkKKwkJCQlqLT5mbGFncyB8PSBKRl9SRU1PVkU7CisJCX0KKwkJaWYgKGNwKQorCQkJYnJlYWs7CisJfQorCS8qIFJlbW92ZSBqb2JzIGFmdGVyIHByaW50aW5nIHNvIHRoZXJlIHdvbid0IGJlIG11bHRpcGxlICsgb3IgLSBqb2JzICovCisJZm9yIChqID0gam9iX2xpc3Q7IGo7IGogPSB0bXApIHsKKwkJdG1wID0gai0+bmV4dDsKKwkJaWYgKGotPmZsYWdzICYgSkZfUkVNT1ZFKQorCQkJcmVtb3ZlX2pvYihqLCAiam9icyIpOworCX0KKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwlyZXR1cm4gKDApOworfQorCisvKiBsaXN0IGpvYnMgZm9yIHRvcC1sZXZlbCBub3RpZmljYXRpb24gKi8KK3ZvaWQKK2pfbm90aWZ5KHZvaWQpCit7CisJSm9iCSpqLCAqdG1wOworCXNpZ3NldF90IG9tYXNrOworCisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKKwlmb3IgKGogPSBqb2JfbGlzdDsgajsgaiA9IGotPm5leHQpIHsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJCWlmIChGbGFnKEZNT05JVE9SKSAmJiAoai0+ZmxhZ3MgJiBKRl9DSEFOR0VEKSkKKwkJCWpfcHJpbnQoaiwgSlBfTUVESVVNLCBzaGxfb3V0KTsKKyNlbmRpZgorCQkvKiBSZW1vdmUgam9iIGFmdGVyIGRvaW5nIHJlcG9ydHMgc28gdGhlcmUgYXJlbid0CisJCSAqIG11bHRpcGxlICsvLSBqb2JzLgorCQkgKi8KKwkJaWYgKGotPnN0YXRlID09IFBFWElURUQgfHwgai0+c3RhdGUgPT0gUFNJR05BTExFRCkKKwkJCWotPmZsYWdzIHw9IEpGX1JFTU9WRTsKKwl9CisJZm9yIChqID0gam9iX2xpc3Q7IGo7IGogPSB0bXApIHsKKwkJdG1wID0gai0+bmV4dDsKKwkJaWYgKGotPmZsYWdzICYgSkZfUkVNT1ZFKQorCQkJcmVtb3ZlX2pvYihqLCAibm90aWZ5Iik7CisJfQorCXNoZl9mbHVzaChzaGxfb3V0KTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKK30KKworLyogUmV0dXJuIHBpZCBvZiBsYXN0IHByb2Nlc3MgaW4gbGFzdCBhc3luY2hyb25vdXMgam9iICovCitwaWRfdAoral9hc3luYyh2b2lkKQoreworCXNpZ3NldF90IG9tYXNrOworCisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKKworCWlmIChhc3luY19qb2IpCisJCWFzeW5jX2pvYi0+ZmxhZ3MgfD0gSkZfS05PV047CisKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKworCXJldHVybiAoYXN5bmNfcGlkKTsKK30KKworLyoKKyAqIE1ha2UgaiB0aGUgbGFzdCBhc3luYyBwcm9jZXNzCisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkCitqX3NldF9hc3luYyhKb2IgKmopCit7CisJSm9iCSpqbCwgKm9sZGVzdDsKKworCWlmIChhc3luY19qb2IgJiYgKGFzeW5jX2pvYi0+ZmxhZ3MgJiAoSkZfS05PV058SkZfWk9NQklFKSkgPT0gSkZfWk9NQklFKQorCQlyZW1vdmVfam9iKGFzeW5jX2pvYiwgImFzeW5jIik7CisJaWYgKCEoai0+ZmxhZ3MgJiBKRl9TVEFSVEVEKSkgeworCQlpbnRlcm5hbF93YXJuaW5nZigial9hc3luYzogam9iIG5vdCBzdGFydGVkIik7CisJCXJldHVybjsKKwl9CisJYXN5bmNfam9iID0gajsKKwlhc3luY19waWQgPSBqLT5sYXN0X3Byb2MtPnBpZDsKKwl3aGlsZSAobnpvbWJpZSA+IENISUxEX01BWCkgeworCQlvbGRlc3QgPSBOVUxMOworCQlmb3IgKGpsID0gam9iX2xpc3Q7IGpsOyBqbCA9IGpsLT5uZXh0KQorCQkJaWYgKGpsICE9IGFzeW5jX2pvYiAmJiAoamwtPmZsYWdzICYgSkZfWk9NQklFKSAmJgorCQkJICAgICghb2xkZXN0IHx8IGpsLT5hZ2UgPCBvbGRlc3QtPmFnZSkpCisJCQkJb2xkZXN0ID0gamw7CisJCWlmICghb2xkZXN0KSB7CisJCQkvKiBYWFggZGVidWdnaW5nICovCisJCQlpZiAoIShhc3luY19qb2ItPmZsYWdzICYgSkZfWk9NQklFKSB8fCBuem9tYmllICE9IDEpIHsKKwkJCQlpbnRlcm5hbF93YXJuaW5nZigial9hc3luYzogYmFkIG56b21iaWUgKCVkKSIsCisJCQkJICAgIG56b21iaWUpOworCQkJCW56b21iaWUgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJcmVtb3ZlX2pvYihvbGRlc3QsICJ6b21iaWUiKTsKKwl9Cit9CisKKy8qCisgKiBTdGFydCBhIGpvYjogc2V0IFNUQVJURUQsIGNoZWNrIGZvciBoZWxkIHNpZ25hbHMgYW5kIHNldCBqLT5sYXN0X3Byb2MKKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQKK2pfc3RhcnRqb2IoSm9iICpqKQoreworCVByb2MJKnA7CisKKwlqLT5mbGFncyB8PSBKRl9TVEFSVEVEOworCWZvciAocCA9IGotPnByb2NfbGlzdDsgcC0+bmV4dDsgcCA9IHAtPm5leHQpCisJCTsKKwlqLT5sYXN0X3Byb2MgPSBwOworCisJaWYgKGhlbGRfc2lnY2hsZCkgeworCQloZWxkX3NpZ2NobGQgPSAwOworCQkvKiBEb24ndCBjYWxsIGpfc2lnY2hsZCgpIGFzIGl0IG1heSByZW1vdmUgam9iLi4uICovCisJCWtpbGwocHJvY3BpZCwgU0lHQ0hMRCk7CisJfQorfQorCisvKgorICogd2FpdCBmb3Igam9iIHRvIGNvbXBsZXRlIG9yIGNoYW5nZSBzdGF0ZQorICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCitzdGF0aWMgaW50CitqX3dhaXRqKEpvYiAqaiwKKyAgICBpbnQgZmxhZ3MsCQkJLyogc2VlIEpXXyogKi8KKyAgICBjb25zdCBjaGFyICp3aGVyZSkKK3sKKwlpbnQJcnY7CisKKwkvKgorCSAqIE5vIGF1dG8tbm90aWZ5IG9uIHRoZSBqb2Igd2UgYXJlIHdhaXRpbmcgb24uCisJICovCisJai0+ZmxhZ3MgfD0gSkZfV0FJVElORzsKKwlpZiAoZmxhZ3MgJiBKV19BU1lOQ05PVElGWSkKKwkJai0+ZmxhZ3MgfD0gSkZfV19BU1lOQ05PVElGWTsKKworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwlpZiAoIUZsYWcoRk1PTklUT1IpKQorI2VuZGlmCisJCWZsYWdzIHw9IEpXX1NUT1BQRURXQUlUOworCisJd2hpbGUgKGotPnN0YXRlID09IFBSVU5OSU5HIHx8CisJICAgICgoZmxhZ3MgJiBKV19TVE9QUEVEV0FJVCkgJiYgai0+c3RhdGUgPT0gUFNUT1BQRUQpKSB7CisJCXNpZ3N1c3BlbmQoJnNtX2RlZmF1bHQpOworCQlpZiAoZmF0YWxfdHJhcCkgeworCQkJaW50IG9sZGYgPSBqLT5mbGFncyAmIChKRl9XQUlUSU5HfEpGX1dfQVNZTkNOT1RJRlkpOworCQkJai0+ZmxhZ3MgJj0gfihKRl9XQUlUSU5HfEpGX1dfQVNZTkNOT1RJRlkpOworCQkJcnVudHJhcHMoVEZfRkFUQUwpOworCQkJai0+ZmxhZ3MgfD0gb2xkZjsgLyogbm90IHJlYWNoZWQuLi4gKi8KKwkJfQorCQlpZiAoKGZsYWdzICYgSldfSU5URVJSVVBUKSAmJiAocnYgPSB0cmFwX3BlbmRpbmcoKSkpIHsKKwkJCWotPmZsYWdzICY9IH4oSkZfV0FJVElOR3xKRl9XX0FTWU5DTk9USUZZKTsKKwkJCXJldHVybiAoLXJ2KTsKKwkJfQorCX0KKwlqLT5mbGFncyAmPSB+KEpGX1dBSVRJTkd8SkZfV19BU1lOQ05PVElGWSk7CisKKwlpZiAoai0+ZmxhZ3MgJiBKRl9GRykgeworCQlqLT5mbGFncyAmPSB+SkZfRkc7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCQlpZiAoRmxhZyhGTU9OSVRPUikgJiYgdHR5cGdycF9vayAmJiBqLT5wZ3JwKSB7CisJCQkvKgorCQkJICogU2F2ZSB0aGUgdHR5J3MgY3VycmVudCBwZ3JwIHNvIGl0IGNhbiBiZSByZXN0b3JlZAorCQkJICogd2hlbiB0aGUgam9iIGlzIGZvcmVncm91bmRlZC4gVGhpcyBpcyB0bworCQkJICogZGVhbCB3aXRoIHRoaW5ncyBsaWtlIHRoZSBHTlUgc3Ugd2hpY2ggZG9lcworCQkJICogYSBmb3JrL2V4ZWMgaW5zdGVhZCBvZiBhbiBleGVjICh0aGUgZm9yayBtZWFucworCQkJICogdGhlIGV4ZWNlZCBzaGVsbCBnZXRzIGEgZGlmZmVyZW50IHBpZCBmcm9tIGl0cworCQkJICogcGdycCwgc28gbmF0dXJhbGx5IGl0IHNldHMgaXRzIHBncnAgYW5kIGdldHMgaG9zZWQKKwkJCSAqIHdoZW4gaXQgZ2V0cyBmb3JlZ3JvdW5kZWQgYnkgdGhlIHBhcmVudCBzaGVsbCB3aGljaAorCQkJICogaGFzIHJlc3RvcmVkIHRoZSB0dHkncyBwZ3JwIHRvIHRoYXQgb2YgdGhlIHN1CisJCQkgKiBwcm9jZXNzKS4KKwkJCSAqLworCQkJaWYgKGotPnN0YXRlID09IFBTVE9QUEVEICYmCisJCQkgICAgKGotPnNhdmVkX3R0eXBncnAgPSB0Y2dldHBncnAodHR5X2ZkKSkgPj0gMCkKKwkJCQlqLT5mbGFncyB8PSBKRl9TQVZFRFRUWVBHUlA7CisJCQlpZiAodGNzZXRwZ3JwKHR0eV9mZCwga3NocGdycCkgPCAwKQorCQkJCXdhcm5pbmdmKHRydWUsCisJCQkJICAgICJqX3dhaXRqOiB0Y3NldHBncnAoJWQsICVsZCkgZmFpbGVkOiAlcyIsCisJCQkJICAgIHR0eV9mZCwgKGxvbmcpa3NocGdycCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWlmIChqLT5zdGF0ZSA9PSBQU1RPUFBFRCkgeworCQkJCWotPmZsYWdzIHw9IEpGX1NBVkVEVFRZOworCQkJCXRjZ2V0YXR0cih0dHlfZmQsICZqLT50dHlzdGF0ZSk7CisJCQl9CisJCX0KKyNlbmRpZgorCQlpZiAodHR5X2ZkID49IDApIHsKKwkJCS8qCisJCQkgKiBPbmx5IHJlc3RvcmUgdHR5IHNldHRpbmdzIGlmIGpvYiB3YXMgb3JpZ2luYWxseQorCQkJICogc3RhcnRlZCBpbiB0aGUgZm9yZWdyb3VuZC4gUHJvYmxlbXMgY2FuIGJlCisJCQkgKiBjYXVzZWQgYnkgdGhpbmdzIGxpa2UgJ21vcmUgZm9vYmFyICYnIHdoaWNoIHdpbGwKKwkJCSAqIHR5cGljYWxseSBnZXQgYW5kIHNhdmUgdGhlIHNoZWxsJ3MgdmkvZW1hY3MgdHR5CisJCQkgKiBzZXR0aW5ncyBiZWZvcmUgc2V0dGluZyB1cCB0aGUgdHR5IGZvciBpdHNlbGY7CisJCQkgKiB3aGVuIG1vcmUgZXhpdHMsIGl0IHJlc3RvcmVzIHRoZSAnb3JpZ2luYWwnCisJCQkgKiBzZXR0aW5ncywgYW5kIHRoaW5ncyBnbyBkb3duIGhpbGwgZnJvbSB0aGVyZS4uLgorCQkJICovCisJCQlpZiAoai0+c3RhdGUgPT0gUEVYSVRFRCAmJiBqLT5zdGF0dXMgPT0gMCAmJgorCQkJICAgIChqLT5mbGFncyAmIEpGX1VTRVRUWU1PREUpKSB7CisJCQkJdGNnZXRhdHRyKHR0eV9mZCwgJnR0eV9zdGF0ZSk7CisJCQl9IGVsc2UgeworCQkJCXRjc2V0YXR0cih0dHlfZmQsIFRDU0FEUkFJTiwgJnR0eV9zdGF0ZSk7CisJCQkJLyotCisJCQkJICogRG9uJ3QgdXNlIHR0eSBtb2RlIGlmIGpvYiBpcyBzdG9wcGVkIGFuZAorCQkJCSAqIGxhdGVyIHJlc3RhcnRlZCBhbmQgZXhpdHMuIENvbnNpZGVyCisJCQkJICogdGhlIHNlcXVlbmNlOgorCQkJCSAqCXZpIGZvbyAoc3RvcHBlZCkKKwkJCQkgKgkuLi4KKwkJCQkgKglzdHR5IHNvbWV0aGluZworCQkJCSAqCS4uLgorCQkJCSAqCWZnICh2aTsgWlopCisJCQkJICogbW9kZSBzaG91bGQgYmUgdGhhdCBvZiB0aGUgc3R0eSwgbm90IHdoYXQKKwkJCQkgKiB3YXMgYmVmb3JlIHRoZSB2aSBzdGFydGVkLgorCQkJCSAqLworCQkJCWlmIChqLT5zdGF0ZSA9PSBQU1RPUFBFRCkKKwkJCQkJai0+ZmxhZ3MgJj0gfkpGX1VTRVRUWU1PREU7CisJCQl9CisJCX0KKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJCS8qCisJCSAqIElmIGl0IGxvb2tzIGxpa2UgdXNlciBoaXQgXkMgdG8ga2lsbCBhIGpvYiwgcHJldGVuZCB3ZSBnb3QKKwkJICogb25lIHRvbyB0byBicmVhayBvdXQgb2YgZm9yIGxvb3BzLCBldGMuIChBVCZUIGtzaCBkb2VzIHRoaXMKKwkJICogZXZlbiB3aGVuIG5vdCBtb25pdG9yaW5nLCBidXQgdGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2luY2UKKwkJICogYSB0dHkgZ2VuZXJhdGVkIF5DIGdvZXMgdG8gdGhlIHdob2xlIHByb2Nlc3MgZ3JvdXApCisJCSAqLworCQl7CisJCQlpbnQgc3RhdHVzOworCisJCQlzdGF0dXMgPSBqLT5sYXN0X3Byb2MtPnN0YXR1czsKKwkJCWlmIChGbGFnKEZNT05JVE9SKSAmJiBqLT5zdGF0ZSA9PSBQU0lHTkFMTEVEICYmCisJCQkgICAgV0lGU0lHTkFMRUQoc3RhdHVzKSAmJgorCQkJICAgIChzaWd0cmFwc1tXVEVSTVNJRyhzdGF0dXMpXS5mbGFncyAmIFRGX1RUWV9JTlRSKSkKKwkJCQl0cmFwc2lnKFdURVJNU0lHKHN0YXR1cykpOworCQl9CisjZW5kaWYKKwl9CisKKwlqX3VzcnRpbWUgPSBqLT51c3J0aW1lOworCWpfc3lzdGltZSA9IGotPnN5c3RpbWU7CisJcnYgPSBqLT5zdGF0dXM7CisKKwlpZiAoIShmbGFncyAmIEpXX0FTWU5DTk9USUZZKQorI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkgICAgJiYgKCFGbGFnKEZNT05JVE9SKSB8fCBqLT5zdGF0ZSAhPSBQU1RPUFBFRCkKKyNlbmRpZgorCSAgICApIHsKKwkJal9wcmludChqLCBKUF9TSE9SVCwgc2hsX291dCk7CisJCXNoZl9mbHVzaChzaGxfb3V0KTsKKwl9CisJaWYgKGotPnN0YXRlICE9IFBTVE9QUEVECisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCSAgICAmJiAoIUZsYWcoRk1PTklUT1IpIHx8ICEoZmxhZ3MgJiBKV19BU1lOQ05PVElGWSkpCisjZW5kaWYKKwkgICAgKQorCQlyZW1vdmVfam9iKGosIHdoZXJlKTsKKworCXJldHVybiAocnYpOworfQorCisvKgorICogU0lHQ0hMRCBoYW5kbGVyIHRvIHJlYXAgY2hpbGRyZW4gYW5kIHVwZGF0ZSBqb2Igc3RhdGVzCisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAoral9zaWdjaGxkKGludCBzaWcgTUtTSF9BX1VOVVNFRCkKK3sKKwkvKiB0aGlzIHJ1bnMgaW5zaWRlIGludGVycnVwdCBjb250ZXh0LCB3aXRoIGVycm5vIHNhdmVkICovCisKKwlKb2IgKmo7CisJUHJvYyAqcCA9IE5VTEw7CisJcGlkX3QgcGlkOworCWludCBzdGF0dXM7CisJc3RydWN0IHJ1c2FnZSBydTAsIHJ1MTsKKworCS8qCisJICogRG9uJ3Qgd2FpdCBmb3IgYW55IHByb2Nlc3NlcyBpZiBhIGpvYiBpcyBwYXJ0aWFsbHkgc3RhcnRlZC4KKwkgKiBUaGlzIGlzIHNvIHdlIGRvbid0IGRvIGF3YXkgd2l0aCB0aGUgcHJvY2VzcyBncm91cCBsZWFkZXIKKwkgKiBiZWZvcmUgYWxsIHRoZSBwcm9jZXNzZXMgaW4gYSBwaXBlIGxpbmUgYXJlIHN0YXJ0ZWQgKHNvIHRoZQorCSAqIHNldHBnaWQoKSB3b24ndCBmYWlsKQorCSAqLworCWZvciAoaiA9IGpvYl9saXN0OyBqOyBqID0gai0+bmV4dCkKKwkJaWYgKGotPnBwaWQgPT0gcHJvY3BpZCAmJiAhKGotPmZsYWdzICYgSkZfU1RBUlRFRCkpIHsKKwkJCWhlbGRfc2lnY2hsZCA9IDE7CisJCQlyZXR1cm47CisJCX0KKworCWdldHJ1c2FnZShSVVNBR0VfQ0hJTERSRU4sICZydTApOworCWRvIHsKKwkJcGlkID0gd2FpdHBpZCgtMSwgJnN0YXR1cywgKFdOT0hBTkd8V1VOVFJBQ0VEKSk7CisKKwkJLyoKKwkJICogcmV0dXJuIGlmIHRoaXMgd291bGQgYmxvY2sgKDApIG9yIG5vIGNoaWxkcmVuCisJCSAqIG9yIGludGVycnVwdGVkICgtMSkKKwkJICovCisJCWlmIChwaWQgPD0gMCkKKwkJCXJldHVybjsKKworCQlnZXRydXNhZ2UoUlVTQUdFX0NISUxEUkVOLCAmcnUxKTsKKworCQkvKiBmaW5kIGpvYiBhbmQgcHJvY2VzcyBzdHJ1Y3R1cmVzIGZvciB0aGlzIHBpZCAqLworCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkKKwkJCWZvciAocCA9IGotPnByb2NfbGlzdDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKwkJCQlpZiAocC0+cGlkID09IHBpZCkKKwkJCQkJZ290byBmb3VuZDsKKyBmb3VuZDoKKwkJaWYgKGogPT0gTlVMTCkgeworCQkJLyogQ2FuIG9jY3VyIGlmIHByb2Nlc3MgaGFzIGtpZHMsIHRoZW4gZXhlY3Mgc2hlbGwKKwkJCXdhcm5pbmdmKHRydWUsICJiYWQgcHJvY2VzcyB3YWl0ZWQgZm9yIChwaWQgPSAlZCkiLAorCQkJCXBpZCk7CisJCQkgKi8KKwkJCXJ1MCA9IHJ1MTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdGltZXJhZGQoJmotPnVzcnRpbWUsICZydTEucnVfdXRpbWUsICZqLT51c3J0aW1lKTsKKwkJdGltZXJzdWIoJmotPnVzcnRpbWUsICZydTAucnVfdXRpbWUsICZqLT51c3J0aW1lKTsKKwkJdGltZXJhZGQoJmotPnN5c3RpbWUsICZydTEucnVfc3RpbWUsICZqLT5zeXN0aW1lKTsKKwkJdGltZXJzdWIoJmotPnN5c3RpbWUsICZydTAucnVfc3RpbWUsICZqLT5zeXN0aW1lKTsKKwkJcnUwID0gcnUxOworCQlwLT5zdGF0dXMgPSBzdGF0dXM7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCQlpZiAoV0lGU1RPUFBFRChzdGF0dXMpKQorCQkJcC0+c3RhdGUgPSBQU1RPUFBFRDsKKwkJZWxzZQorI2VuZGlmCisJCSAgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQlwLT5zdGF0ZSA9IFBTSUdOQUxMRUQ7CisJCWVsc2UKKwkJCXAtPnN0YXRlID0gUEVYSVRFRDsKKworCQljaGVja19qb2Ioaik7CS8qIGNoZWNrIHRvIHNlZSBpZiBlbnRpcmUgam9iIGlzIGRvbmUgKi8KKwl9IHdoaWxlICgxKTsKK30KKworLyoKKyAqIENhbGxlZCBvbmx5IHdoZW4gYSBwcm9jZXNzIGluIGogaGFzIGV4aXRlZC9zdG9wcGVkIChpZSwgY2FsbGVkIG9ubHkKKyAqIGZyb20gal9zaWdjaGxkKCkpLiBJZiBubyBwcm9jZXNzZXMgYXJlIHJ1bm5pbmcsIHRoZSBqb2Igc3RhdHVzCisgKiBhbmQgc3RhdGUgYXJlIHVwZGF0ZWQsIGFzeW5jaHJvbm91cyBqb2Igbm90aWZpY2F0aW9uIGlzIGRvbmUgYW5kLAorICogaWYgdW5uZWVkZWQsIHRoZSBqb2IgaXMgcmVtb3ZlZC4KKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX2pvYihKb2IgKmopCit7CisJaW50CWpzdGF0ZTsKKwlQcm9jCSpwOworCisJLyogWFhYIGRlYnVnZ2luZyAobmFzdHkgLSBpbnRlcnJ1cHQgcm91dGluZSB1c2luZyBzaGxfb3V0KSAqLworCWlmICghKGotPmZsYWdzICYgSkZfU1RBUlRFRCkpIHsKKwkJaW50ZXJuYWxfd2FybmluZ2YoImNoZWNrX2pvYjogam9iIHN0YXJ0ZWQgKGZsYWdzIDB4JXgpIiwKKwkJICAgIGotPmZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWpzdGF0ZSA9IFBSVU5OSU5HOworCWZvciAocD1qLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPnN0YXRlID09IFBSVU5OSU5HKQorCQkJcmV0dXJuOwkvKiBzb21lIHByb2Nlc3NlcyBzdGlsbCBydW5uaW5nICovCisJCWlmIChwLT5zdGF0ZSA+IGpzdGF0ZSkKKwkJCWpzdGF0ZSA9IHAtPnN0YXRlOworCX0KKwlqLT5zdGF0ZSA9IGpzdGF0ZTsKKworCXN3aXRjaCAoai0+bGFzdF9wcm9jLT5zdGF0ZSkgeworCWNhc2UgUEVYSVRFRDoKKwkJai0+c3RhdHVzID0gV0VYSVRTVEFUVVMoai0+bGFzdF9wcm9jLT5zdGF0dXMpOworCQlicmVhazsKKwljYXNlIFBTSUdOQUxMRUQ6CisJCWotPnN0YXR1cyA9IDEyOCArIFdURVJNU0lHKGotPmxhc3RfcHJvYy0+c3RhdHVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJai0+c3RhdHVzID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBOb3RlIHdoZW4gY28tcHJvY2VzcyBkaWVzOiBjYW4ndCBiZSBkb25lIGluIGpfd2FpdCgpIG5vcgorCSAqIHJlbW92ZV9qb2IoKSBzaW5jZSBuZWl0aGVyIG1heSBiZSBjYWxsZWQgZm9yIG5vbi1pbnRlcmFjdGl2ZQorCSAqIHNoZWxscy4KKwkgKi8KKwlpZiAoai0+c3RhdGUgPT0gUEVYSVRFRCB8fCBqLT5zdGF0ZSA9PSBQU0lHTkFMTEVEKSB7CisJCS8qCisJCSAqIE5vIG5lZWQgdG8ga2VlcCBjby1wcm9jZXNzIGlucHV0IGFueSBtb3JlCisJCSAqIChhdCBsZWFzdCwgdGhpcyBpcyB3aGF0IGtzaDkzZCB0aGlua3MpCisJCSAqLworCQlpZiAoY29wcm9jLmpvYiA9PSBqKSB7CisJCQljb3Byb2Muam9iID0gTlVMTDsKKwkJCS8qCisJCQkgKiBYWFggd291bGQgYmUgbmljZSB0byBnZXQgdGhlIGNsb3NlcyBvdXQgb2YgaGVyZQorCQkJICogc28gdGhleSBhcmVuJ3QgZG9uZSBpbiB0aGUgc2lnbmFsIGhhbmRsZXIuCisJCQkgKiBXb3VsZCBtZWFuIGEgY2hlY2sgaW4gY29wcm9jX2dldGZkKCkgdG8KKwkJCSAqIGRvICJpZiBqb2IgPT0gMCAmJiB3cml0ZSA+PSAwLCBjbG9zZSB3cml0ZSIuCisJCQkgKi8KKwkJCWNvcHJvY193cml0ZV9jbG9zZShjb3Byb2Mud3JpdGUpOworCQl9CisJCS8qIERvIHdlIG5lZWQgdG8ga2VlcCB0aGUgb3V0cHV0PyAqLworCQlpZiAoai0+Y29wcm9jX2lkICYmIGotPmNvcHJvY19pZCA9PSBjb3Byb2MuaWQgJiYKKwkJICAgIC0tY29wcm9jLm5qb2JzID09IDApCisJCQljb3Byb2NfcmVhZHdfY2xvc2UoY29wcm9jLnJlYWQpOworCX0KKworCWotPmZsYWdzIHw9IEpGX0NIQU5HRUQ7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCWlmIChGbGFnKEZNT05JVE9SKSAmJiAhKGotPmZsYWdzICYgSkZfWFhDT00pKSB7CisJCS8qCisJCSAqIE9ubHkgcHV0IHN0b3BwZWQgam9icyBhdCB0aGUgZnJvbnQgdG8gYXZvaWQgY29uZnVzaW5nCisJCSAqIHRoZSB1c2VyIChkb24ndCB3YW50IGZpbmlzaGVkIGpvYnMgZWZmZWN0aW5nICUrIG9yICUtKQorCQkgKi8KKwkJaWYgKGotPnN0YXRlID09IFBTVE9QUEVEKQorCQkJcHV0X2pvYihqLCBQSl9PTl9GUk9OVCk7CisJCWlmIChGbGFnKEZOT1RJRlkpICYmCisJCSAgICAoai0+ZmxhZ3MgJiAoSkZfV0FJVElOR3xKRl9XX0FTWU5DTk9USUZZKSkgIT0gSkZfV0FJVElORykgeworCQkJLyogTG9vayBmb3IgdGhlIHJlYWwgZmlsZSBkZXNjcmlwdG9yIDIgKi8KKwkJCXsKKwkJCQlzdHJ1Y3QgZW52ICplcDsKKwkJCQlpbnQgZmQgPSAyOworCisJCQkJZm9yIChlcCA9IGU7IGVwOyBlcCA9IGVwLT5vZW52KQorCQkJCQlpZiAoZXAtPnNhdmVmZCAmJiBlcC0+c2F2ZWZkWzJdKQorCQkJCQkJZmQgPSBlcC0+c2F2ZWZkWzJdOworCQkJCXNoZl9yZW9wZW4oZmQsIFNIRl9XUiwgc2hsX2opOworCQkJfQorCQkJLyoKKwkJCSAqIENhbid0IGNhbGwgal9ub3RpZnkoKSBhcyBpdCByZW1vdmVzIGpvYnMuIFRoZSBqb2IKKwkJCSAqIG11c3Qgc3RheSBpbiB0aGUgam9iIGxpc3QgYXMgal93YWl0aigpIG1heSBiZQorCQkJICogcnVubmluZyB3aXRoIHRoaXMgam9iLgorCQkJICovCisJCQlqX3ByaW50KGosIEpQX01FRElVTSwgc2hsX2opOworCQkJc2hmX2ZsdXNoKHNobF9qKTsKKwkJCWlmICghKGotPmZsYWdzICYgSkZfV0FJVElORykgJiYgai0+c3RhdGUgIT0gUFNUT1BQRUQpCisJCQkJcmVtb3ZlX2pvYihqLCAibm90aWZ5Iik7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCSAgICAhRmxhZyhGTU9OSVRPUikgJiYKKyNlbmRpZgorCSAgICAhKGotPmZsYWdzICYgKEpGX1dBSVRJTkd8SkZfRkcpKSAmJgorCSAgICBqLT5zdGF0ZSAhPSBQU1RPUFBFRCkgeworCQlpZiAoaiA9PSBhc3luY19qb2IgfHwgKGotPmZsYWdzICYgSkZfS05PV04pKSB7CisJCQlqLT5mbGFncyB8PSBKRl9aT01CSUU7CisJCQlqLT5qb2IgPSAtMTsKKwkJCW56b21iaWUrKzsKKwkJfSBlbHNlCisJCQlyZW1vdmVfam9iKGosICJjaGVja2pvYiIpOworCX0KK30KKworLyoKKyAqIFByaW50IGpvYiBzdGF0dXMgaW4gZWl0aGVyIHNob3J0LCBtZWRpdW0gb3IgbG9uZyBmb3JtYXQuCisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkCitqX3ByaW50KEpvYiAqaiwgaW50IGhvdywgc3RydWN0IHNoZiAqc2hmKQoreworCVByb2MJKnA7CisJaW50CXN0YXRlOworCWludAlzdGF0dXM7CisJaW50CWNvcmVkdW1wZWQ7CisJY2hhcglqb2JjaGFyID0gJyAnOworCWNoYXIJYnVmWzY0XTsKKwljb25zdCBjaGFyICpmaWxsZXI7CisJaW50CW91dHB1dCA9IDA7CisKKwlpZiAoaG93ID09IEpQX1BHUlApIHsKKwkJLyoKKwkJICogUE9TSVggZG9lc24ndCBzYXkgd2hhdCB0byBkbyBpdCB0aGVyZSBpcyBubyBwcm9jZXNzCisJCSAqIGdyb3VwIGxlYWRlciAoaWUsICFGTU9OSVRPUikuIFdlIGFyYml0cmFyaWx5IHJldHVybgorCQkgKiBsYXN0IHBpZCAod2hpY2ggaXMgd2hhdCAkISByZXR1cm5zKS4KKwkJICovCisJCXNoZl9mcHJpbnRmKHNoZiwgIiVkXG4iLCAoaW50KShqLT5wZ3JwID8gai0+cGdycCA6CisJCSAgICAoai0+bGFzdF9wcm9jID8gai0+bGFzdF9wcm9jLT5waWQgOiAwKSkpOworCQlyZXR1cm47CisJfQorCWotPmZsYWdzICY9IH5KRl9DSEFOR0VEOworCWZpbGxlciA9IGotPmpvYiA+IDEwID8gIlxuICAgICAgICIgOiAiXG4gICAgICAiOworCWlmIChqID09IGpvYl9saXN0KQorCQlqb2JjaGFyID0gJysnOworCWVsc2UgaWYgKGogPT0gam9iX2xpc3QtPm5leHQpCisJCWpvYmNoYXIgPSAnLSc7CisKKwlmb3IgKHAgPSBqLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDspIHsKKwkJY29yZWR1bXBlZCA9IDA7CisJCXN3aXRjaCAocC0+c3RhdGUpIHsKKwkJY2FzZSBQUlVOTklORzoKKwkJCW1lbWNweShidWYsICJSdW5uaW5nIiwgOCk7CisJCQlicmVhazsKKwkJY2FzZSBQU1RPUFBFRDoKKwkJCXN0cmxjcHkoYnVmLCBzaWd0cmFwc1tXU1RPUFNJRyhwLT5zdGF0dXMpXS5tZXNzLAorCQkJICAgIHNpemVvZihidWYpKTsKKwkJCWJyZWFrOworCQljYXNlIFBFWElURUQ6CisJCQlpZiAoaG93ID09IEpQX1NIT1JUKQorCQkJCWJ1ZlswXSA9ICdcMCc7CisJCQllbHNlIGlmIChXRVhJVFNUQVRVUyhwLT5zdGF0dXMpID09IDApCisJCQkJbWVtY3B5KGJ1ZiwgIkRvbmUiLCA1KTsKKwkJCWVsc2UKKwkJCQlzaGZfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkRvbmUgKCVkKSIsCisJCQkJICAgIFdFWElUU1RBVFVTKHAtPnN0YXR1cykpOworCQkJYnJlYWs7CisJCWNhc2UgUFNJR05BTExFRDoKKyNpZmRlZiBXQ09SRURVTVAKKwkJCWlmIChXQ09SRURVTVAocC0+c3RhdHVzKSkKKwkJCQljb3JlZHVtcGVkID0gMTsKKyNlbmRpZgorCQkJLyoKKwkJCSAqIGtsdWRnZSBmb3Igbm90IHJlcG9ydGluZyAnbm9ybWFsIHRlcm1pbmF0aW9uCisJCQkgKiBzaWduYWxzJyAoaS5lLiBTSUdJTlQsIFNJR1BJUEUpCisJCQkgKi8KKwkJCWlmIChob3cgPT0gSlBfU0hPUlQgJiYgIWNvcmVkdW1wZWQgJiYKKwkJCSAgICAoV1RFUk1TSUcocC0+c3RhdHVzKSA9PSBTSUdJTlQgfHwKKwkJCSAgICBXVEVSTVNJRyhwLT5zdGF0dXMpID09IFNJR1BJUEUpKSB7CisJCQkJYnVmWzBdID0gJ1wwJzsKKwkJCX0gZWxzZQorCQkJCXN0cmxjcHkoYnVmLCBzaWd0cmFwc1tXVEVSTVNJRyhwLT5zdGF0dXMpXS5tZXNzLAorCQkJCSAgICBzaXplb2YoYnVmKSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChob3cgIT0gSlBfU0hPUlQpIHsKKwkJCWlmIChwID09IGotPnByb2NfbGlzdCkKKwkJCQlzaGZfZnByaW50ZihzaGYsICJbJWRdICVjICIsIGotPmpvYiwgam9iY2hhcik7CisJCQllbHNlCisJCQkJc2hmX2ZwcmludGYoc2hmLCAiJXMiLCBmaWxsZXIpOworCQl9CisKKwkJaWYgKGhvdyA9PSBKUF9MT05HKQorCQkJc2hmX2ZwcmludGYoc2hmLCAiJTVkICIsIChpbnQpcC0+cGlkKTsKKworCQlpZiAoaG93ID09IEpQX1NIT1JUKSB7CisJCQlpZiAoYnVmWzBdKSB7CisJCQkJb3V0cHV0ID0gMTsKKwkJCQlzaGZfZnByaW50ZihzaGYsICIlcyVzICIsCisJCQkJICAgIGJ1ZiwgY29yZWR1bXBlZCA/ICIgKGNvcmUgZHVtcGVkKSIgOiBudWxsKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW91dHB1dCA9IDE7CisJCQlzaGZfZnByaW50ZihzaGYsICIlLTIwcyAlcyVzJXMiLCBidWYsIHAtPmNvbW1hbmQsCisJCQkgICAgcC0+bmV4dCA/ICJ8IiA6IG51bGwsCisJCQkgICAgY29yZWR1bXBlZCA/ICIgKGNvcmUgZHVtcGVkKSIgOiBudWxsKTsKKwkJfQorCisJCXN0YXRlID0gcC0+c3RhdGU7CisJCXN0YXR1cyA9IHAtPnN0YXR1czsKKwkJcCA9IHAtPm5leHQ7CisJCXdoaWxlIChwICYmIHAtPnN0YXRlID09IHN0YXRlICYmIHAtPnN0YXR1cyA9PSBzdGF0dXMpIHsKKwkJCWlmIChob3cgPT0gSlBfTE9ORykKKwkJCQlzaGZfZnByaW50ZihzaGYsICIlcyU1ZCAlLTIwcyAlcyVzIiwgZmlsbGVyLAorCQkJCSAgICAoaW50KXAtPnBpZCwgIiAiLCBwLT5jb21tYW5kLAorCQkJCSAgICBwLT5uZXh0ID8gInwiIDogbnVsbCk7CisJCQllbHNlIGlmIChob3cgPT0gSlBfTUVESVVNKQorCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiAlcyVzIiwgcC0+Y29tbWFuZCwKKwkJCQkgICAgcC0+bmV4dCA/ICJ8IiA6IG51bGwpOworCQkJcCA9IHAtPm5leHQ7CisJCX0KKwl9CisJaWYgKG91dHB1dCkKKwkJc2hmX3B1dGMoJ1xuJywgc2hmKTsKK30KKworLyoKKyAqIENvbnZlcnQgJSBzZXF1ZW5jZSB0byBqb2IKKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworc3RhdGljIEpvYiAqCitqX2xvb2t1cChjb25zdCBjaGFyICpjcCwgaW50ICplY29kZXApCit7CisJSm9iCQkqaiwgKmxhc3RfbWF0Y2g7CisJUHJvYwkJKnA7CisJaW50CQlsZW4sIGpvYiA9IDA7CisKKwlpZiAoa3NoX2lzZGlnaXQoKmNwKSkgeworCQlnZXRuKGNwLCAmam9iKTsKKwkJLyogTG9vayBmb3IgbGFzdF9wcm9jLT5waWQgKHdoYXQgJCEgcmV0dXJucykgZmlyc3QuLi4gKi8KKwkJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCisJCQlpZiAoai0+bGFzdF9wcm9jICYmIGotPmxhc3RfcHJvYy0+cGlkID09IGpvYikKKwkJCQlyZXR1cm4gKGopOworCQkvKgorCQkgKiAuLi50aGVuIGxvb2sgZm9yIHByb2Nlc3MgZ3JvdXAgKHRoaXMgaXMgbm9uLVBPU0lYLAorCQkgKiBidXQgc2hvdWxkIG5vdCBicmVhayBhbnl0aGluZworCQkgKi8KKwkJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCisJCQlpZiAoai0+cGdycCAmJiBqLT5wZ3JwID09IGpvYikKKwkJCQlyZXR1cm4gKGopOworCQlpZiAoZWNvZGVwKQorCQkJKmVjb2RlcCA9IEpMX05PU1VDSDsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJaWYgKCpjcCAhPSAnJScpIHsKKwkJaWYgKGVjb2RlcCkKKwkJCSplY29kZXAgPSBKTF9JTlZBTElEOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlzd2l0Y2ggKCorK2NwKSB7CisJY2FzZSAnXDAnOiAvKiBub24tc3RhbmRhcmQgKi8KKwljYXNlICcrJzoKKwljYXNlICclJzoKKwkJaWYgKGpvYl9saXN0ICE9IE5VTEwpCisJCQlyZXR1cm4gKGpvYl9saXN0KTsKKwkJYnJlYWs7CisKKwljYXNlICctJzoKKwkJaWYgKGpvYl9saXN0ICE9IE5VTEwgJiYgam9iX2xpc3QtPm5leHQpCisJCQlyZXR1cm4gKGpvYl9saXN0LT5uZXh0KTsKKwkJYnJlYWs7CisKKwljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CisJY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorCQlnZXRuKGNwLCAmam9iKTsKKwkJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCisJCQlpZiAoai0+am9iID09IGpvYikKKwkJCQlyZXR1cm4gKGopOworCQlicmVhazsKKworCWNhc2UgJz8nOgkJLyogJT9zdHJpbmcgKi8KKwkJbGFzdF9tYXRjaCA9IE5VTEw7CisJCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KQorCQkJZm9yIChwID0gai0+cHJvY19saXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorCQkJCWlmIChzdHJzdHIocC0+Y29tbWFuZCwgY3ArMSkgIT0gTlVMTCkgeworCQkJCQlpZiAobGFzdF9tYXRjaCkgeworCQkJCQkJaWYgKGVjb2RlcCkKKwkJCQkJCQkqZWNvZGVwID0gSkxfQU1CSUc7CisJCQkJCQlyZXR1cm4gKE5VTEwpOworCQkJCQl9CisJCQkJCWxhc3RfbWF0Y2ggPSBqOworCQkJCX0KKwkJaWYgKGxhc3RfbWF0Y2gpCisJCQlyZXR1cm4gKGxhc3RfbWF0Y2gpOworCQlicmVhazsKKworCWRlZmF1bHQ6CQkvKiAlc3RyaW5nICovCisJCWxlbiA9IHN0cmxlbihjcCk7CisJCWxhc3RfbWF0Y2ggPSBOVUxMOworCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkKKwkJCWlmIChzdHJuY21wKGNwLCBqLT5wcm9jX2xpc3QtPmNvbW1hbmQsIGxlbikgPT0gMCkgeworCQkJCWlmIChsYXN0X21hdGNoKSB7CisJCQkJCWlmIChlY29kZXApCisJCQkJCQkqZWNvZGVwID0gSkxfQU1CSUc7CisJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJfQorCQkJCWxhc3RfbWF0Y2ggPSBqOworCQkJfQorCQlpZiAobGFzdF9tYXRjaCkKKwkJCXJldHVybiAobGFzdF9tYXRjaCk7CisJCWJyZWFrOworCX0KKwlpZiAoZWNvZGVwKQorCQkqZWNvZGVwID0gSkxfTk9TVUNIOworCXJldHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyBKb2IJKmZyZWVfam9iczsKK3N0YXRpYyBQcm9jCSpmcmVlX3Byb2NzOworCisvKgorICogYWxsb2NhdGUgYSBuZXcgam9iIGFuZCBmaWxsIGluIHRoZSBqb2IgbnVtYmVyLgorICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCitzdGF0aWMgSm9iICoKK25ld19qb2Iodm9pZCkKK3sKKwlpbnQJaTsKKwlKb2IJKm5ld2osICpqOworCisJaWYgKGZyZWVfam9icyAhPSBOVUxMKSB7CisJCW5ld2ogPSBmcmVlX2pvYnM7CisJCWZyZWVfam9icyA9IGZyZWVfam9icy0+bmV4dDsKKwl9IGVsc2UKKwkJbmV3aiA9IGFsbG9jKHNpemVvZihKb2IpLCBBUEVSTSk7CisKKwkvKiBicnV0ZSBmb3JjZSBtZXRob2QgKi8KKwlmb3IgKGkgPSAxOyA7IGkrKykgeworCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAmJiBqLT5qb2IgIT0gaTsgaiA9IGotPm5leHQpCisJCQk7CisJCWlmIChqID09IE5VTEwpCisJCQlicmVhazsKKwl9CisJbmV3ai0+am9iID0gaTsKKworCXJldHVybiAobmV3aik7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBuZXcgcHJvY2VzcyBzdHJ1Y3QKKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworc3RhdGljIFByb2MgKgorbmV3X3Byb2Modm9pZCkKK3sKKwlQcm9jCSpwOworCisJaWYgKGZyZWVfcHJvY3MgIT0gTlVMTCkgeworCQlwID0gZnJlZV9wcm9jczsKKwkJZnJlZV9wcm9jcyA9IGZyZWVfcHJvY3MtPm5leHQ7CisJfSBlbHNlCisJCXAgPSBhbGxvYyhzaXplb2YoUHJvYyksIEFQRVJNKTsKKworCXJldHVybiAocCk7Cit9CisKKy8qCisgKiBUYWtlIGpvYiBvdXQgb2Ygam9iX2xpc3QgYW5kIHB1dCBvbGQgc3RydWN0dXJlcyBpbnRvIGZyZWUgbGlzdC4KKyAqIEtlZXBzIG56b21iaWVzLCBsYXN0X2pvYiBhbmQgYXN5bmNfam9iIHVwIHRvIGRhdGUuCisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkCityZW1vdmVfam9iKEpvYiAqaiwgY29uc3QgY2hhciAqd2hlcmUpCit7CisJUHJvYwkqcCwgKnRtcDsKKwlKb2IJKipwcmV2LCAqY3VycjsKKworCXByZXYgPSAmam9iX2xpc3Q7CisJY3VyciA9ICpwcmV2OworCWZvciAoOyBjdXJyICE9IE5VTEwgJiYgY3VyciAhPSBqOyBwcmV2ID0gJmN1cnItPm5leHQsIGN1cnIgPSAqcHJldikKKwkJOworCWlmIChjdXJyICE9IGopIHsKKwkJaW50ZXJuYWxfd2FybmluZ2YoInJlbW92ZV9qb2I6IGpvYiBub3QgZm91bmQgKCVzKSIsIHdoZXJlKTsKKwkJcmV0dXJuOworCX0KKwkqcHJldiA9IGN1cnItPm5leHQ7CisKKwkvKiBmcmVlIHVwIHByb2Mgc3RydWN0dXJlcyAqLworCWZvciAocCA9IGotPnByb2NfbGlzdDsgcCAhPSBOVUxMOyApIHsKKwkJdG1wID0gcDsKKwkJcCA9IHAtPm5leHQ7CisJCXRtcC0+bmV4dCA9IGZyZWVfcHJvY3M7CisJCWZyZWVfcHJvY3MgPSB0bXA7CisJfQorCisJaWYgKChqLT5mbGFncyAmIEpGX1pPTUJJRSkgJiYgai0+cHBpZCA9PSBwcm9jcGlkKQorCQktLW56b21iaWU7CisJai0+bmV4dCA9IGZyZWVfam9iczsKKwlmcmVlX2pvYnMgPSBqOworCisJaWYgKGogPT0gbGFzdF9qb2IpCisJCWxhc3Rfam9iID0gTlVMTDsKKwlpZiAoaiA9PSBhc3luY19qb2IpCisJCWFzeW5jX2pvYiA9IE5VTEw7Cit9CisKKy8qCisgKiBwdXQgaiBpbiBhIHBhcnRpY3VsYXIgbG9jYXRpb24gKHRha2luZyBpdCBvdXQgam9iX2xpc3QgaWYgaXQgaXMgdGhlcmUKKyAqIGFscmVhZHkpCisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwdXRfam9iKEpvYiAqaiwgaW50IHdoZXJlKQoreworCUpvYgkqKnByZXYsICpjdXJyOworCisJLyogUmVtb3ZlIGpvYiBmcm9tIGxpc3QgKGlmIHRoZXJlKSAqLworCXByZXYgPSAmam9iX2xpc3Q7CisJY3VyciA9IGpvYl9saXN0OworCWZvciAoOyBjdXJyICYmIGN1cnIgIT0gajsgcHJldiA9ICZjdXJyLT5uZXh0LCBjdXJyID0gKnByZXYpCisJCTsKKwlpZiAoY3VyciA9PSBqKQorCQkqcHJldiA9IGN1cnItPm5leHQ7CisKKwlzd2l0Y2ggKHdoZXJlKSB7CisJY2FzZSBQSl9PTl9GUk9OVDoKKwkJai0+bmV4dCA9IGpvYl9saXN0OworCQlqb2JfbGlzdCA9IGo7CisJCWJyZWFrOworCisJY2FzZSBQSl9QQVNUX1NUT1BQRUQ6CisJCXByZXYgPSAmam9iX2xpc3Q7CisJCWN1cnIgPSBqb2JfbGlzdDsKKwkJZm9yICg7IGN1cnIgJiYgY3Vyci0+c3RhdGUgPT0gUFNUT1BQRUQ7IHByZXYgPSAmY3Vyci0+bmV4dCwKKwkJICAgIGN1cnIgPSAqcHJldikKKwkJCTsKKwkJai0+bmV4dCA9IGN1cnI7CisJCSpwcmV2ID0gajsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogbnVrZSBhIGpvYiAoY2FsbGVkIHdoZW4gdW5hYmxlIHRvIHN0YXJ0IGZ1bGwgam9iKS4KKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworc3RhdGljIGludAora2lsbF9qb2IoSm9iICpqLCBpbnQgc2lnKQoreworCVByb2MJKnA7CisJaW50CXJ2YWwgPSAwOworCisJZm9yIChwID0gai0+cHJvY19saXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorCQlpZiAocC0+cGlkICE9IDApCisJCQlpZiAoa2lsbChwLT5waWQsIHNpZykgPCAwKQorCQkJCXJ2YWwgPSAtMTsKKwlyZXR1cm4gKHJ2YWwpOworfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvbGFsbG9jLmMgYi9ta3NoL3NyYy9sYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTYyN2QxCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvbGFsbG9jLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qLQorICogQ29weXJpZ2h0IMKpIDIwMDkKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW7igJAKKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQg4oCcQVMgSVPigJ0gYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbuKAmXMgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2xhbGxvYy5jLHYgMS4xMSAyMDA5LzA4LzA4IDEzOjA4OjUxIHRnIEV4cCAkIik7CisKKy8qIGJ1aWxkIHdpdGggQ1BQRkxBR1MrPSAtRFVTRV9SRUFMTE9DX01BTExPQz0wIG9uIGFuY2llbnQgc3lzdGVtcyAqLworI2lmIGRlZmluZWQoVVNFX1JFQUxMT0NfTUFMTE9DKSAmJiAoVVNFX1JFQUxMT0NfTUFMTE9DID09IDApCisjZGVmaW5lIHJlbWFsbG9jKHAsbikJKChwKSA9PSBOVUxMID8gbWFsbG9jKG4pIDogcmVhbGxvYygocCksIChuKSkpCisjZWxzZQorI2RlZmluZSByZW1hbGxvYyhwLG4pCXJlYWxsb2MoKHApLCAobikpCisjZW5kaWYKKworI2RlZmluZSBBTExPQ19JU1VOQUxJR05FRChwKSAoKChwdHJkaWZmX3QpKHApKSAlIEFMTE9DX1NJWkUpCisKK3N0YXRpYyBBTExPQ19JVEVNICpmaW5kcHRyKEFMTE9DX0lURU0gKiosIGNoYXIgKiwgQXJlYSAqKTsKKwordm9pZAorYWluaXQoQXJlYSAqYXApCit7CisJLyogYXJlYSBwb2ludGVyIGlzIGFuIEFMTE9DX0lURU0sIGp1c3QgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KKwlhcC0+bmV4dCA9IE5VTEw7Cit9CisKK3N0YXRpYyBBTExPQ19JVEVNICoKK2ZpbmRwdHIoQUxMT0NfSVRFTSAqKmxwcCwgY2hhciAqcHRyLCBBcmVhICphcCkKK3sKKwl2b2lkICpscDsKKworI2lmbmRlZiBNS1NIX1NNQUxMCisJaWYgKEFMTE9DX0lTVU5BTElHTkVEKHB0cikpCisJCWdvdG8gZmFpbDsKKyNlbmRpZgorCS8qIGdldCBhZGRyZXNzIG9mIEFMTE9DX0lURU0gZnJvbSB1c2VyIGl0ZW0gKi8KKwkvKgorCSAqIG5vdGU6IHRoZSBhbGlnbm1lbnQgb2YgInB0ciIgdG8gQUxMT0NfU0laRSBpcyBjaGVja2VkCisJICogYWJvdmU7IHRoZSAidm9pZCAqIiBnZXRzIHVzIHJpZCBvZiBhIGdjYyAyLjk1IHdhcm5pbmcKKwkgKi8KKwkqbHBwID0gKGxwID0gcHRyIC0gQUxMT0NfU0laRSk7CisJLyogc2VhcmNoIGZvciBhbGxvY2F0aW9uIGl0ZW0gaW4gZ3JvdXAgbGlzdCAqLworCXdoaWxlIChhcC0+bmV4dCAhPSBscCkKKwkJaWYgKChhcCA9IGFwLT5uZXh0KSA9PSBOVUxMKSB7CisjaWZuZGVmIE1LU0hfU01BTEwKKyBmYWlsOgorI2VuZGlmCisJCQlpbnRlcm5hbF9lcnJvcmYoInJvZ3VlIHBvaW50ZXIgJXAiLCBwdHIpOworCQl9CisJcmV0dXJuIChhcCk7Cit9CisKK3ZvaWQgKgorYXJlc2l6ZSh2b2lkICpwdHIsIHNpemVfdCBudW1iLCBBcmVhICphcCkKK3sKKwlBTExPQ19JVEVNICpscCA9IE5VTEw7CisKKwkvKiByZXNpemluZyAodHJ1ZSkgb3IgbmV3bHkgYWxsb2NhdGluZz8gKi8KKwlpZiAocHRyICE9IE5VTEwpIHsKKwkJQUxMT0NfSVRFTSAqcHA7CisKKwkJcHAgPSBmaW5kcHRyKCZscCwgcHRyLCBhcCk7CisJCXBwLT5uZXh0ID0gbHAtPm5leHQ7CisJfQorCisJaWYgKChudW1iID49IFNJWkVfTUFYIC0gQUxMT0NfU0laRSkgfHwKKwkgICAgKGxwID0gcmVtYWxsb2MobHAsIG51bWIgKyBBTExPQ19TSVpFKSkgPT0gTlVMTAorI2lmbmRlZiBNS1NIX1NNQUxMCisJICAgIHx8IEFMTE9DX0lTVU5BTElHTkVEKGxwKQorI2VuZGlmCisJICAgICkKKwkJaW50ZXJuYWxfZXJyb3JmKCJjYW5ub3QgYWxsb2NhdGUgJWx1IGRhdGEgYnl0ZXMiLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpbnVtYik7CisJLyogdGhpcyBvbmx5IHdvcmtzIGJlY2F1c2UgQXJlYSBpcyBhbiBBTExPQ19JVEVNICovCisJbHAtPm5leHQgPSBhcC0+bmV4dDsKKwlhcC0+bmV4dCA9IGxwOworCS8qIHJldHVybiB1c2VyIGl0ZW0gYWRkcmVzcyAqLworCXJldHVybiAoKGNoYXIgKilscCArIEFMTE9DX1NJWkUpOworfQorCit2b2lkCithZnJlZSh2b2lkICpwdHIsIEFyZWEgKmFwKQoreworCWlmIChwdHIgIT0gTlVMTCkgeworCQlBTExPQ19JVEVNICpscCwgKnBwOworCisJCXBwID0gZmluZHB0cigmbHAsIHB0ciwgYXApOworCQkvKiB1bmhvb2sgKi8KKwkJcHAtPm5leHQgPSBscC0+bmV4dDsKKwkJLyogbm93IGZyZWUgQUxMT0NfSVRFTSAqLworCQlmcmVlKGxwKTsKKwl9Cit9CisKK3ZvaWQKK2FmcmVlYWxsKEFyZWEgKmFwKQoreworCUFMTE9DX0lURU0gKmxwOworCisJLyogdHJhdmVyc2UgZ3JvdXAgKGxpbmtlZCBsaXN0KSAqLworCXdoaWxlICgobHAgPSBhcC0+bmV4dCkgIT0gTlVMTCkgeworCQkvKiBtYWtlIG5leHQgQUxMT0NfSVRFTSBoZWFkIG9mIGxpc3QgKi8KKwkJYXAtPm5leHQgPSBscC0+bmV4dDsKKwkJLyogZnJlZSBvbGQgaGVhZCAqLworCQlmcmVlKGxwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9sZXguYyBiL21rc2gvc3JjL2xleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjE5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9sZXguYwpAQCAtMCwwICsxLDE3ODIgQEAKKy8qCSRPcGVuQlNEOiBsZXguYyx2IDEuNDQgMjAwOC8wNy8wMyAxNzo1MjowOCBvdHRvIEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvbGV4LmMsdiAxLjExOCAyMDEwLzA3LzI1IDExOjM1OjQxIHRnIEV4cCAkIik7CisKKy8qCisgKiBzdGF0ZXMgd2hpbGUgbGV4aW5nIHdvcmQKKyAqLworI2RlZmluZSBTQkFTRQkJMAkvKiBvdXRzaWRlIGFueSBsZXhpY2FsIGNvbnN0cnVjdHMgKi8KKyNkZWZpbmUgU1dPUkQJCTEJLyogaW1wbGljaXQgcXVvdGluZyBmb3Igc3Vic3RpdHV0ZSgpICovCisjZGVmaW5lIFNMRVRQQVJFTgkyCS8qIGluc2lkZSAoKCApKSwgaW1wbGljaXQgcXVvdGluZyAqLworI2RlZmluZSBTU1FVT1RFCQkzCS8qIGluc2lkZSAnJyAqLworI2RlZmluZSBTRFFVT1RFCQk0CS8qIGluc2lkZSAiIiAqLworI2RlZmluZSBTRVFVT1RFCQk1CS8qIGluc2lkZSAkJycgKi8KKyNkZWZpbmUgU0JSQUNFCQk2CS8qIGluc2lkZSAke30gKi8KKyNkZWZpbmUgU1FCUkFDRQkJNwkvKiBpbnNpZGUgIiR7fSIgKi8KKyNkZWZpbmUgU0NTUEFSRU4JOAkvKiBpbnNpZGUgJCgpICovCisjZGVmaW5lIFNCUVVPVEUJCTkJLyogaW5zaWRlIGBgICovCisjZGVmaW5lIFNBU1BBUkVOCTEwCS8qIGluc2lkZSAkKCggKSkgKi8KKyNkZWZpbmUgU0hFUkVERUxJTQkxMQkvKiBwYXJzaW5nIDw8LDw8LSBkZWxpbWl0ZXIgKi8KKyNkZWZpbmUgU0hFUkVEUVVPVEUJMTIJLyogcGFyc2luZyAiIGluIDw8LDw8LSBkZWxpbWl0ZXIgKi8KKyNkZWZpbmUgU1BBVFRFUk4JMTMJLyogcGFyc2luZyAqKC4uLnwuLi4pIHBhdHRlcm4gKCorP0AhKSAqLworI2RlZmluZSBTVEJSQUNFCQkxNAkvKiBwYXJzaW5nICR7Li4uWyMlXS4uLn0gKi8KKyNkZWZpbmUgU0xFVEFSUkFZCTE1CS8qIGluc2lkZSA9KCApLCBqdXN0IGNvcHkgKi8KKyNkZWZpbmUgU0FERUxJTQkJMTYJLyogbGlrZSBTQkFTRSwgbG9va2luZyBmb3IgZGVsaW1pdGVyICovCisjZGVmaW5lIFNIRVJFU1RSSU5HCTE3CS8qIHBhcnNpbmcgPDw8IHN0cmluZyAqLworCisvKiBTdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGV4aW5nIHN0YXRlIGFuZCB0aGUgdmFyaW91cyBwaWVjZXMgb2YgaW5mbworICogbmVlZGVkIGZvciBlYWNoIHBhcnRpY3VsYXIgc3RhdGUuICovCit0eXBlZGVmIHN0cnVjdCBsZXhfc3RhdGUgTGV4X3N0YXRlOworc3RydWN0IGxleF9zdGF0ZSB7CisJaW50IGxzX3N0YXRlOworCXVuaW9uIHsKKwkJLyogJCguLi4pICovCisJCXN0cnVjdCBzY3NwYXJlbl9pbmZvIHsKKwkJCWludCBucGFyZW47CS8qIGNvdW50IG9wZW4gcGFyZW50aGVzaXMgKi8KKwkJCWludCBjc3N0YXRlOwkvKiBYWFggcmVtb3ZlICovCisjZGVmaW5lIGxzX3Njc3BhcmVuIGxzX2luZm8udV9zY3NwYXJlbgorCQl9IHVfc2NzcGFyZW47CisKKwkJLyogJCgoLi4uKSkgKi8KKwkJc3RydWN0IHNhc3BhcmVuX2luZm8geworCQkJaW50IG5wYXJlbjsJLyogY291bnQgb3BlbiBwYXJlbnRoZXNpcyAqLworCQkJaW50IHN0YXJ0OwkvKiBtYXJrcyBzdGFydCBvZiAkKCggaW4gb3V0cHV0IHN0ciAqLworI2RlZmluZSBsc19zYXNwYXJlbiBsc19pbmZvLnVfc2FzcGFyZW4KKwkJfSB1X3Nhc3BhcmVuOworCisJCS8qICgoLi4uKSkgKi8KKwkJc3RydWN0IHNsZXRwYXJlbl9pbmZvIHsKKwkJCWludCBucGFyZW47CS8qIGNvdW50IG9wZW4gcGFyZW50aGVzaXMgKi8KKyNkZWZpbmUgbHNfc2xldHBhcmVuIGxzX2luZm8udV9zbGV0cGFyZW4KKwkJfSB1X3NsZXRwYXJlbjsKKworCQkvKiBgLi4uYCAqLworCQlzdHJ1Y3Qgc2JxdW90ZV9pbmZvIHsKKwkJCWludCBpbmRxdW90ZXM7CS8qIHRydWUgaWYgaW4gZG91YmxlIHF1b3RlczogImAuLi5gIiAqLworI2RlZmluZSBsc19zYnF1b3RlIGxzX2luZm8udV9zYnF1b3RlCisJCX0gdV9zYnF1b3RlOworCisjaWZuZGVmIE1LU0hfU01BTEwKKwkJLyogPSguLi4pICovCisJCXN0cnVjdCBzbGV0YXJyYXlfaW5mbyB7CisJCQlpbnQgbnBhcmVuOwkvKiBjb3VudCBvcGVuIHBhcmVudGhlc2VzICovCisjZGVmaW5lIGxzX3NsZXRhcnJheSBsc19pbmZvLnVfc2xldGFycmF5CisJCX0gdV9zbGV0YXJyYXk7CisjZW5kaWYKKworCQkvKiBBREVMSU0gKi8KKwkJc3RydWN0IHNhZGVsaW1faW5mbyB7CisJCQl1bnNpZ25lZCBjaGFyIG5wYXJlbjsJLyogY291bnQgb3BlbiBwYXJlbnRoZXNlcyAqLworI2RlZmluZSBTQURFTElNX0JBU0gJMAorI2RlZmluZSBTQURFTElNX01BS0UJMQorCQkJdW5zaWduZWQgY2hhciBzdHlsZTsKKwkJCXVuc2lnbmVkIGNoYXIgZGVsaW1pdGVyOworCQkJdW5zaWduZWQgY2hhciBudW07CisJCQl1bnNpZ25lZCBjaGFyIGZsYWdzOwkvKiBvZnMuIGludG8gc2FkZWxpbV9mbGFnc1tdICovCisjZGVmaW5lIGxzX3NhZGVsaW0gbHNfaW5mby51X3NhZGVsaW0KKwkJfSB1X3NhZGVsaW07CisKKwkJLyogJCcuLi4nICovCisJCXN0cnVjdCBzZXF1b3RlX2luZm8geworCQkJYm9vbCBnb3RfTlVMOwkvKiBpZ25vcmUgcmVzdCBvZiBzdHJpbmcgKi8KKyNkZWZpbmUgbHNfc2VxdW90ZSBsc19pbmZvLnVfc2VxdW90ZQorCQl9IHVfc2VxdW90ZTsKKworCQlMZXhfc3RhdGUgKmJhc2U7CS8qIHVzZWQgdG8gcG9pbnQgdG8gbmV4dCBzdGF0ZSBibG9jayAqLworCX0gbHNfaW5mbzsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlMZXhfc3RhdGUgKmJhc2U7CisJTGV4X3N0YXRlICplbmQ7Cit9IFN0YXRlX2luZm87CisKK3N0YXRpYyB2b2lkIHJlYWRoZXJlKHN0cnVjdCBpb3dvcmQgKik7CitzdGF0aWMgaW50IGdldHNjX18odm9pZCk7CitzdGF0aWMgdm9pZCBnZXRzY19saW5lKFNvdXJjZSAqKTsKK3N0YXRpYyBpbnQgZ2V0c2NfYm4odm9pZCk7CitzdGF0aWMgaW50IHNfZ2V0KHZvaWQpOworc3RhdGljIHZvaWQgc19wdXQoaW50KTsKK3N0YXRpYyBjaGFyICpnZXRfYnJhY2VfdmFyKFhTdHJpbmcgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgYXJyYXlzdWIoY2hhciAqKik7CitzdGF0aWMgY29uc3QgY2hhciAqdW5nZXRzYyhpbnQpOworc3RhdGljIHZvaWQgZ2V0aGVyZShib29sKTsKK3N0YXRpYyBMZXhfc3RhdGUgKnB1c2hfc3RhdGVfKFN0YXRlX2luZm8gKiwgTGV4X3N0YXRlICopOworc3RhdGljIExleF9zdGF0ZSAqcG9wX3N0YXRlXyhTdGF0ZV9pbmZvICosIExleF9zdGF0ZSAqKTsKKworc3RhdGljIGludCBkb3Bwcm9tcHQoY29uc3QgY2hhciAqLCBpbnQsIGJvb2wpOworCitzdGF0aWMgaW50IGJhY2tzbGFzaF9za2lwOworc3RhdGljIGludCBpZ25vcmVfYmFja3NsYXNoX25ld2xpbmU7CisKKy8qIG9wdGltaXNlZCBnZXRzY19ibigpICovCisjZGVmaW5lIF9nZXRzYygpCSgqc291cmNlLT5zdHIgIT0gJ1wwJyAmJiAqc291cmNlLT5zdHIgIT0gJ1xcJyBcCisJCQkgJiYgIWJhY2tzbGFzaF9za2lwICYmICEoc291cmNlLT5mbGFncyAmIFNGX0ZJUlNUKSBcCisJCQkgPyAqc291cmNlLT5zdHIrKyA6IGdldHNjX2JuKCkpCisvKiBvcHRpbWlzZWQgZ2V0c2NfXygpICovCisjZGVmaW5lCV9nZXRzY18oKQkoKCpzb3VyY2UtPnN0ciAhPSAnXDAnKSAmJiAhKHNvdXJjZS0+ZmxhZ3MgJiBTRl9GSVJTVCkgXAorCQkJID8gKnNvdXJjZS0+c3RyKysgOiBnZXRzY19fKCkpCisKKyNpZmRlZiBNS1NIX1NNQUxMCitzdGF0aWMgaW50IGdldHNjKHZvaWQpOworc3RhdGljIGludCBnZXRzY18odm9pZCk7CisKK3N0YXRpYyBpbnQKK2dldHNjKHZvaWQpCit7CisJcmV0dXJuIChfZ2V0c2MoKSk7Cit9CisKK3N0YXRpYyBpbnQKK2dldHNjXyh2b2lkKQoreworCXJldHVybiAoX2dldHNjXygpKTsKK30KKyNlbHNlCisvKiAhTUtTSF9TTUFMTDogdXNlIHRoZW0gaW5saW5lICovCisjZGVmaW5lIGdldHNjKCkJCV9nZXRzYygpCisjZGVmaW5lIGdldHNjXygpCV9nZXRzY18oKQorI2VuZGlmCisKKyNkZWZpbmUgU1RBVEVfQlNJWkUJMzIKKworI2RlZmluZSBQVVNIX1NUQVRFKHMpCWRvIHsJCQkJCVwKKwlpZiAoKytzdGF0ZXAgPT0gc3RhdGVfaW5mby5lbmQpCQkJCVwKKwkJc3RhdGVwID0gcHVzaF9zdGF0ZV8oJnN0YXRlX2luZm8sIHN0YXRlcCk7CVwKKwlzdGF0ZSA9IHN0YXRlcC0+bHNfc3RhdGUgPSAocyk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUE9QX1NUQVRFKCkJZG8gewkJCQkJXAorCWlmICgtLXN0YXRlcCA9PSBzdGF0ZV9pbmZvLmJhc2UpCQkJXAorCQlzdGF0ZXAgPSBwb3Bfc3RhdGVfKCZzdGF0ZV9pbmZvLCBzdGF0ZXApOwlcCisJc3RhdGUgPSBzdGF0ZXAtPmxzX3N0YXRlOwkJCQlcCit9IHdoaWxlICgwKQorCisvKioKKyAqIExleGljYWwgYW5hbHlzZXIKKyAqCisgKiB0b2tlbnMgYXJlIG5vdCByZWd1bGFyIGV4cHJlc3Npb25zLCB0aGV5IGFyZSBMTCgxKS4KKyAqIGZvciBleGFtcGxlLCAiJHt2YXI6LSR7UFdEfX0iLCBhbmQgIiQoc2l6ZSAkKHdoZW5jZSBrc2gpKSIuCisgKiBoZW5jZSB0aGUgc3RhdGUgc3RhY2suCisgKi8KKworaW50Cit5eWxleChpbnQgY2YpCit7CisJTGV4X3N0YXRlIHN0YXRlc1tTVEFURV9CU0laRV0sICpzdGF0ZXAsICpzMiwgKmJhc2U7CisJU3RhdGVfaW5mbyBzdGF0ZV9pbmZvOworCWludCBjLCBjMiwgc3RhdGU7CisJWFN0cmluZyB3czsJCS8qIGV4cGFuZGFibGUgb3V0cHV0IHdvcmQgKi8KKwljaGFyICp3cDsJCS8qIG91dHB1dCB3b3JkIHBvaW50ZXIgKi8KKwljaGFyICpzcCwgKmRwOworCisgQWdhaW46CisJc3RhdGVzWzBdLmxzX3N0YXRlID0gLTE7CisJc3RhdGVzWzBdLmxzX2luZm8uYmFzZSA9IE5VTEw7CisJc3RhdGVwID0gJnN0YXRlc1sxXTsKKwlzdGF0ZV9pbmZvLmJhc2UgPSBzdGF0ZXM7CisJc3RhdGVfaW5mby5lbmQgPSAmc3RhdGVfaW5mby5iYXNlW1NUQVRFX0JTSVpFXTsKKworCVhpbml0KHdzLCB3cCwgNjQsIEFURU1QKTsKKworCWJhY2tzbGFzaF9za2lwID0gMDsKKwlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUgPSAwOworCisJaWYgKGNmJk9ORVdPUkQpCisJCXN0YXRlID0gU1dPUkQ7CisJZWxzZSBpZiAoY2YmTEVURVhQUikgeworCQkvKiBlbmNsb3NlIGFyZ3VtZW50cyBpbiAoZG91YmxlKSBxdW90ZXMgKi8KKwkJKndwKysgPSBPUVVPVEU7CisJCXN0YXRlID0gU0xFVFBBUkVOOworCQlzdGF0ZXAtPmxzX3NsZXRwYXJlbi5ucGFyZW4gPSAwOworI2lmbmRlZiBNS1NIX1NNQUxMCisJfSBlbHNlIGlmIChjZiZMRVRBUlJBWSkgeworCQlzdGF0ZSA9IFNMRVRBUlJBWTsKKwkJc3RhdGVwLT5sc19zbGV0YXJyYXkubnBhcmVuID0gMDsKKyNlbmRpZgorCX0gZWxzZSB7CQkvKiBub3JtYWwgbGV4aW5nICovCisJCXN0YXRlID0gKGNmICYgSEVSRURFTElNKSA/IFNIRVJFREVMSU0gOiBTQkFTRTsKKwkJd2hpbGUgKChjID0gZ2V0c2MoKSkgPT0gJyAnIHx8IGMgPT0gJ1x0JykKKwkJCTsKKwkJaWYgKGMgPT0gJyMnKSB7CisJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKKwkJCXdoaWxlICgoYyA9IGdldHNjKCkpICE9ICdcMCcgJiYgYyAhPSAnXG4nKQorCQkJCTsKKwkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZS0tOworCQl9CisJCXVuZ2V0c2MoYyk7CisJfQorCWlmIChzb3VyY2UtPmZsYWdzICYgU0ZfQUxJQVMpIHsJLyogdHJhaWxpbmcgJyAnIGluIGFsaWFzIGRlZmluaXRpb24gKi8KKwkJc291cmNlLT5mbGFncyAmPSB+U0ZfQUxJQVM7CisJCWNmIHw9IEFMSUFTOworCX0KKworCS8qIEluaXRpYWwgc3RhdGU6IG9uZSBvZiBTQkFTRSBTSEVSRURFTElNIFNXT1JEIFNBU1BBUkVOICovCisJc3RhdGVwLT5sc19zdGF0ZSA9IHN0YXRlOworCisJLyogY2hlY2sgZm9yIGhlcmUgc3RyaW5nICovCisJaWYgKHN0YXRlID09IFNIRVJFREVMSU0pIHsKKwkJYyA9IGdldHNjKCk7CisJCWlmIChjID09ICc8JykgeworCQkJc3RhdGUgPSBTSEVSRVNUUklORzsKKwkJCXdoaWxlICgoYyA9IGdldHNjKCkpID09ICcgJyB8fCBjID09ICdcdCcpCisJCQkJOworCQkJdW5nZXRzYyhjKTsKKwkJCWMgPSAnPCc7CisJCQlnb3RvIGFjY2VwdF9ub253b3JkOworCQl9CisJCXVuZ2V0c2MoYyk7CisJfQorCisJLyogY29sbGVjdCBub24tc3BlY2lhbCBvciBxdW90ZWQgY2hhcmFjdGVycyB0byBmb3JtIHdvcmQgKi8KKwl3aGlsZSAoISgoYyA9IGdldHNjKCkpID09IDAgfHwKKwkgICAgKChzdGF0ZSA9PSBTQkFTRSB8fCBzdGF0ZSA9PSBTSEVSRURFTElNIHx8IHN0YXRlID09IFNIRVJFU1RSSU5HKSAmJgorCSAgICBjdHlwZShjLCBDX0xFWDEpKSkpIHsKKyBhY2NlcHRfbm9ud29yZDoKKwkJWGNoZWNrKHdzLCB3cCk7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBTQURFTElNOgorCQkJaWYgKGMgPT0gJygnKQorCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5ucGFyZW4rKzsKKwkJCWVsc2UgaWYgKGMgPT0gJyknKQorCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5ucGFyZW4tLTsKKwkJCWVsc2UgaWYgKHN0YXRlcC0+bHNfc2FkZWxpbS5ucGFyZW4gPT0gMCAmJgorCQkJICAgIChjID09IC8qeyovICd9JyB8fCBjID09IHN0YXRlcC0+bHNfc2FkZWxpbS5kZWxpbWl0ZXIpKSB7CisJCQkJKndwKysgPSBBREVMSU07CisJCQkJKndwKysgPSBjOworCQkJCWlmIChjID09IC8qeyovICd9JyB8fCAtLXN0YXRlcC0+bHNfc2FkZWxpbS5udW0gPT0gMCkKKwkJCQkJUE9QX1NUQVRFKCk7CisJCQkJaWYgKGMgPT0gLyp7Ki8gJ30nKQorCQkJCQlQT1BfU1RBVEUoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgU0JBU0U6CisJCQlpZiAoYyA9PSAnWycgJiYgKGNmICYgKFZBUkFTTnxBUlJBWVZBUikpKSB7CisJCQkJKndwID0gRU9TOwkvKiB0ZW1wb3JhcnkgKi8KKwkJCQlpZiAoaXNfd2R2YXJuYW1lKFhzdHJpbmcod3MsIHdwKSwgZmFsc2UpKSB7CisJCQkJCWNoYXIgKnAsICp0bXA7CisKKwkJCQkJaWYgKGFycmF5c3ViKCZ0bXApKSB7CisJCQkJCQkqd3ArKyA9IENIQVI7CisJCQkJCQkqd3ArKyA9IGM7CisJCQkJCQlmb3IgKHAgPSB0bXA7ICpwOyApIHsKKwkJCQkJCQlYY2hlY2sod3MsIHdwKTsKKwkJCQkJCQkqd3ArKyA9IENIQVI7CisJCQkJCQkJKndwKysgPSAqcCsrOworCQkJCQkJfQorCQkJCQkJYWZyZWUodG1wLCBBVEVNUCk7CisJCQkJCQlicmVhazsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVNvdXJjZSAqczsKKworCQkJCQkJcyA9IHB1c2hzKFNSRVJFQUQsCisJCQkJCQkgICAgc291cmNlLT5hcmVhcCk7CisJCQkJCQlzLT5zdGFydCA9IHMtPnN0ciA9CisJCQkJCQkgICAgcy0+dS5mcmVlbWUgPSB0bXA7CisJCQkJCQlzLT5uZXh0ID0gc291cmNlOworCQkJCQkJc291cmNlID0gczsKKwkJCQkJfQorCQkJCX0KKwkJCQkqd3ArKyA9IENIQVI7CisJCQkJKndwKysgPSBjOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogRkFMTFRIUk9VR0ggKi8KKyBTYmFzZTE6CQkvKiBpbmNsdWRlcyAqKC4uLnwuLi4pIHBhdHRlcm4gKCorP0AhKSAqLworCQkJaWYgKGMgPT0gJyonIHx8IGMgPT0gJ0AnIHx8IGMgPT0gJysnIHx8IGMgPT0gJz8nIHx8CisJCQkgICAgYyA9PSAnIScpIHsKKwkJCQljMiA9IGdldHNjKCk7CisJCQkJaWYgKGMyID09ICcoJyAvKikqLyApIHsKKwkJCQkJKndwKysgPSBPUEFUOworCQkJCQkqd3ArKyA9IGM7CisJCQkJCVBVU0hfU1RBVEUoU1BBVFRFUk4pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJdW5nZXRzYyhjMik7CisJCQl9CisJCQkvKiBGQUxMVEhST1VHSCAqLworIFNiYXNlMjoJCS8qIGRvZXNuJ3QgaW5jbHVkZSAqKC4uLnwuLi4pIHBhdHRlcm4gKCorP0AhKSAqLworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICdcXCc6CisgZ2V0c2NfcWNoYXI6CisJCQkJaWYgKChjID0gZ2V0c2MoKSkpIHsKKwkJCQkJLyogdHJhaWxpbmcgXCBpcyBsb3N0ICovCisJCQkJCSp3cCsrID0gUUNIQVI7CisJCQkJCSp3cCsrID0gYzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdcJyc6Cisgb3Blbl9zc3F1b3RlOgorCQkJCSp3cCsrID0gT1FVT1RFOworCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSsrOworCQkJCVBVU0hfU1RBVEUoU1NRVU9URSk7CisJCQkJYnJlYWs7CisJCQljYXNlICciJzoKKyBvcGVuX3NkcXVvdGU6CisJCQkJKndwKysgPSBPUVVPVEU7CisJCQkJUFVTSF9TVEFURShTRFFVT1RFKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBTdWJzdDsKKwkJCX0KKwkJCWJyZWFrOworCisgU3Vic3Q6CisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJ1xcJzoKKwkJCQljID0gZ2V0c2MoKTsKKwkJCQlzd2l0Y2ggKGMpIHsKKwkJCQljYXNlICciJzoKKwkJCQkJaWYgKChjZiAmIEhFUkVET0MpKQorCQkJCQkJZ290byBoZXJlZG9jcXVvdGU7CisJCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQkJY2FzZSAnXFwnOgorCQkJCWNhc2UgJyQnOiBjYXNlICdgJzoKKyBzdG9yZV9xY2hhcjoKKwkJCQkJKndwKysgPSBRQ0hBUjsKKwkJCQkJKndwKysgPSBjOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorIGhlcmVkb2NxdW90ZToKKwkJCQkJWGNoZWNrKHdzLCB3cCk7CisJCQkJCWlmIChjKSB7CisJCQkJCQkvKiB0cmFpbGluZyBcIGlzIGxvc3QgKi8KKwkJCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkJCSp3cCsrID0gJ1xcJzsKKwkJCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkJCSp3cCsrID0gYzsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICckJzoKKyBzdWJzdF9kb2xsYXI6CisJCQkJYyA9IGdldHNjKCk7CisJCQkJaWYgKGMgPT0gJygnKSAvKikqLyB7CisJCQkJCWMgPSBnZXRzYygpOworCQkJCQlpZiAoYyA9PSAnKCcpIC8qKSovIHsKKwkJCQkJCVBVU0hfU1RBVEUoU0FTUEFSRU4pOworCQkJCQkJc3RhdGVwLT5sc19zYXNwYXJlbi5ucGFyZW4gPSAyOworCQkJCQkJc3RhdGVwLT5sc19zYXNwYXJlbi5zdGFydCA9CisJCQkJCQkgICAgWHNhdmVwb3Mod3MsIHdwKTsKKwkJCQkJCSp3cCsrID0gRVhQUlNVQjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXVuZ2V0c2MoYyk7CisJCQkJCQlQVVNIX1NUQVRFKFNDU1BBUkVOKTsKKwkJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4ubnBhcmVuID0gMTsKKwkJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDA7CisJCQkJCQkqd3ArKyA9IENPTVNVQjsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoYyA9PSAneycpIC8qfSovIHsKKwkJCQkJKndwKysgPSBPU1VCU1Q7CisJCQkJCSp3cCsrID0gJ3snOyAvKn0qLworCQkJCQl3cCA9IGdldF9icmFjZV92YXIoJndzLCB3cCk7CisJCQkJCWMgPSBnZXRzYygpOworCQkJCQkvKiBhbGxvdyA6IyBhbmQgOiUgKGtzaDg4IGNvbXBhdCkgKi8KKwkJCQkJaWYgKGMgPT0gJzonKSB7CisJCQkJCQkqd3ArKyA9IENIQVI7CisJCQkJCQkqd3ArKyA9IGM7CisJCQkJCQljID0gZ2V0c2MoKTsKKwkJCQkJCWlmIChjID09ICc6JykgeworCQkJCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkJCQkqd3ArKyA9ICcwJzsKKwkJCQkJCQkqd3ArKyA9IEFERUxJTTsKKwkJCQkJCQkqd3ArKyA9ICc6JzsKKwkJCQkJCQlQVVNIX1NUQVRFKFNCUkFDRSk7CisJCQkJCQkJUFVTSF9TVEFURShTQURFTElNKTsKKwkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0uc3R5bGUgPSBTQURFTElNX0JBU0g7CisJCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLmRlbGltaXRlciA9ICc6JzsKKwkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnVtID0gMTsKKwkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnBhcmVuID0gMDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0gZWxzZSBpZiAoa3NoX2lzZGlnaXQoYykgfHwKKwkJCQkJCSAgICBjID09ICcoJy8qKSovIHx8IGMgPT0gJyAnIHx8CisJCQkJCQkgICAgYyA9PSAnJCcgLyogWFhYIHdoYXQgZWxzZT8gKi8pIHsKKwkJCQkJCQkvKiBzdWJzdHJpbmcgc3Vic3QuICovCisJCQkJCQkJaWYgKGMgIT0gJyAnKSB7CisJCQkJCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkJCQkJKndwKysgPSAnICc7CisJCQkJCQkJfQorCQkJCQkJCXVuZ2V0c2MoYyk7CisJCQkJCQkJUFVTSF9TVEFURShTQlJBQ0UpOworCQkJCQkJCVBVU0hfU1RBVEUoU0FERUxJTSk7CisJCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLnN0eWxlID0gU0FERUxJTV9CQVNIOworCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5kZWxpbWl0ZXIgPSAnOic7CisJCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLm51bSA9IDI7CisJCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLm5wYXJlbiA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoYyA9PSAnLycpIHsKKwkJCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkJCSp3cCsrID0gYzsKKwkJCQkJCWlmICgoYyA9IGdldHNjKCkpID09ICcvJykgeworCQkJCQkJCSp3cCsrID0gQURFTElNOworCQkJCQkJCSp3cCsrID0gYzsKKwkJCQkJCX0gZWxzZQorCQkJCQkJCXVuZ2V0c2MoYyk7CisJCQkJCQlQVVNIX1NUQVRFKFNCUkFDRSk7CisJCQkJCQlQVVNIX1NUQVRFKFNBREVMSU0pOworCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLnN0eWxlID0gU0FERUxJTV9CQVNIOworCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLmRlbGltaXRlciA9ICcvJzsKKwkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5udW0gPSAxOworCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLm5wYXJlbiA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvKiBJZiB0aGlzIGlzIGEgdHJpbSBvcGVyYXRpb24sCisJCQkJCSAqIHRyZWF0ICgsfCwpIHNwZWNpYWxseSBpbiBTVEJSQUNFLgorCQkJCQkgKi8KKwkJCQkJaWYgKGN0eXBlKGMsIENfU1VCT1AyKSkgeworCQkJCQkJdW5nZXRzYyhjKTsKKwkJCQkJCVBVU0hfU1RBVEUoU1RCUkFDRSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl1bmdldHNjKGMpOworCQkJCQkJaWYgKHN0YXRlID09IFNEUVVPVEUpCisJCQkJCQkJUFVTSF9TVEFURShTUUJSQUNFKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlQVVNIX1NUQVRFKFNCUkFDRSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGtzaF9pc2FscGh4KGMpKSB7CisJCQkJCSp3cCsrID0gT1NVQlNUOworCQkJCQkqd3ArKyA9ICdYJzsKKwkJCQkJZG8geworCQkJCQkJWGNoZWNrKHdzLCB3cCk7CisJCQkJCQkqd3ArKyA9IGM7CisJCQkJCQljID0gZ2V0c2MoKTsKKwkJCQkJfSB3aGlsZSAoa3NoX2lzYWxudXgoYykpOworCQkJCQkqd3ArKyA9ICdcMCc7CisJCQkJCSp3cCsrID0gQ1NVQlNUOworCQkJCQkqd3ArKyA9ICdYJzsKKwkJCQkJdW5nZXRzYyhjKTsKKwkJCQl9IGVsc2UgaWYgKGN0eXBlKGMsIENfVkFSMSB8IENfRElHSVQpKSB7CisJCQkJCVhjaGVjayh3cywgd3ApOworCQkJCQkqd3ArKyA9IE9TVUJTVDsKKwkJCQkJKndwKysgPSAnWCc7CisJCQkJCSp3cCsrID0gYzsKKwkJCQkJKndwKysgPSAnXDAnOworCQkJCQkqd3ArKyA9IENTVUJTVDsKKwkJCQkJKndwKysgPSAnWCc7CisJCQkJfSBlbHNlIGlmIChjID09ICdcJycgJiYgKHN0YXRlID09IFNCQVNFKSkgeworCQkJCQkvKiBYWFggd2hpY2ggb3RoZXIgc3RhdGVzIGFyZSB2YWxpZD8gKi8KKwkJCQkJKndwKysgPSBPUVVPVEU7CisJCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSsrOworCQkJCQlQVVNIX1NUQVRFKFNFUVVPVEUpOworCQkJCQlzdGF0ZXAtPmxzX3NlcXVvdGUuZ290X05VTCA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQkqd3ArKyA9IENIQVI7CisJCQkJCSp3cCsrID0gJyQnOworCQkJCQl1bmdldHNjKGMpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ2AnOgorIHN1YnN0X2dyYXZpczoKKwkJCQlQVVNIX1NUQVRFKFNCUVVPVEUpOworCQkJCSp3cCsrID0gQ09NU1VCOworCQkJCS8qIE5lZWQgdG8ga25vdyBpZiB3ZSBhcmUgaW5zaWRlIGRvdWJsZSBxdW90ZXMKKwkJCQkgKiBzaW5jZSBzaC9BVCZULWtzaCB0cmFuc2xhdGUgdGhlIFwiIHRvICIgaW4KKwkJCQkgKiAiYC4uLlwiLi4uYCIuCisJCQkJICogVGhpcyBpcyBub3QgZG9uZSBpbiBQT1NJWCBtb2RlIChzZWN0aW9uCisJCQkJICogMy4yLjMsIERvdWJsZSBRdW90ZXM6ICJUaGUgYmFja3F1b3RlIHNoYWxsCisJCQkJICogcmV0YWluIGl0cyBzcGVjaWFsIG1lYW5pbmcgaW50cm9kdWNpbmcgdGhlCisJCQkJICogb3RoZXIgZm9ybSBvZiBjb21tYW5kIHN1YnN0aXR1dGlvbiAoc2VlCisJCQkJICogMy42LjMpLiBUaGUgcG9ydGlvbiBvZiB0aGUgcXVvdGVkIHN0cmluZworCQkJCSAqIGZyb20gdGhlIGluaXRpYWwgYmFja3F1b3RlIGFuZCB0aGUKKwkJCQkgKiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBuZXh0IGJhY2txdW90ZSB0aGF0CisJCQkJICogaXMgbm90IHByZWNlZGVkIGJ5IGEgYmFja3NsYXNoIChoYXZpbmcKKwkJCQkgKiBlc2NhcGUgY2hhcmFjdGVycyByZW1vdmVkKSBkZWZpbmVzIHRoYXQKKwkJCQkgKiBjb21tYW5kIHdob3NlIG91dHB1dCByZXBsYWNlcyBgLi4uYCB3aGVuCisJCQkJICogdGhlIHdvcmQgaXMgZXhwYW5kZWQuIgorCQkJCSAqIFNlY3Rpb24gMy42LjMsIENvbW1hbmQgU3Vic3RpdHV0aW9uOgorCQkJCSAqICJXaXRoaW4gdGhlIGJhY2txdW90ZWQgc3R5bGUgb2YgY29tbWFuZAorCQkJCSAqIHN1YnN0aXR1dGlvbiwgYmFja3NsYXNoIHNoYWxsIHJldGFpbiBpdHMKKwkJCQkgKiBsaXRlcmFsIG1lYW5pbmcsIGV4Y2VwdCB3aGVuIGZvbGxvd2VkIGJ5CisJCQkJICogJCBgIFwuIikuCisJCQkJICovCisJCQkJc3RhdGVwLT5sc19zYnF1b3RlLmluZHF1b3RlcyA9IDA7CisJCQkJczIgPSBzdGF0ZXA7CisJCQkJYmFzZSA9IHN0YXRlX2luZm8uYmFzZTsKKwkJCQl3aGlsZSAoMSkgeworCQkJCQlmb3IgKDsgczIgIT0gYmFzZTsgczItLSkgeworCQkJCQkJaWYgKHMyLT5sc19zdGF0ZSA9PSBTRFFVT1RFKSB7CisJCQkJCQkJc3RhdGVwLT5sc19zYnF1b3RlLmluZHF1b3RlcyA9IDE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKHMyICE9IGJhc2UpCisJCQkJCQlicmVhazsKKwkJCQkJaWYgKCEoczIgPSBzMi0+bHNfaW5mby5iYXNlKSkKKwkJCQkJCWJyZWFrOworCQkJCQliYXNlID0gczItLSAtIFNUQVRFX0JTSVpFOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUUNIQVI6CisJCQkJaWYgKGNmICYgTFFDSEFSKSB7CisJCQkJCSp3cCsrID0gUUNIQVI7CisJCQkJCSp3cCsrID0gZ2V0c2MoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQlkZWZhdWx0OgorIHN0b3JlX2NoYXI6CisJCQkJKndwKysgPSBDSEFSOworCQkJCSp3cCsrID0gYzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0VRVU9URToKKwkJCWlmIChjID09ICdcJycpIHsKKwkJCQlQT1BfU1RBVEUoKTsKKwkJCQkqd3ArKyA9IENRVU9URTsKKwkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUtLTsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnXFwnKSB7CisJCQkJaWYgKChjMiA9IHVuYmtzbCh0cnVlLCBzX2dldCwgc19wdXQpKSA9PSAtMSkKKwkJCQkJYzIgPSBzX2dldCgpOworCQkJCWlmIChjMiA9PSAwKQorCQkJCQlzdGF0ZXAtPmxzX3NlcXVvdGUuZ290X05VTCA9IHRydWU7CisJCQkJaWYgKCFzdGF0ZXAtPmxzX3NlcXVvdGUuZ290X05VTCkgeworCQkJCQljaGFyIHRzWzRdOworCisJCQkJCWlmICgodW5zaWduZWQgaW50KWMyIDwgMHgxMDApIHsKKwkJCQkJCSp3cCsrID0gUUNIQVI7CisJCQkJCQkqd3ArKyA9IGMyOworCQkJCQl9IGVsc2UgeworCQkJCQkJYyA9IHV0Zl93Y3RvbWIodHMsIGMyIC0gMHgxMDApOworCQkJCQkJdHNbY10gPSAwOworCQkJCQkJZm9yIChjID0gMDsgdHNbY107ICsrYykgeworCQkJCQkJCSp3cCsrID0gUUNIQVI7CisJCQkJCQkJKndwKysgPSB0c1tjXTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoIXN0YXRlcC0+bHNfc2VxdW90ZS5nb3RfTlVMKSB7CisJCQkJKndwKysgPSBRQ0hBUjsKKwkJCQkqd3ArKyA9IGM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNTUVVPVEU6CisJCQlpZiAoYyA9PSAnXCcnKSB7CisJCQkJUE9QX1NUQVRFKCk7CisJCQkJKndwKysgPSBDUVVPVEU7CisJCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lLS07CisJCQl9IGVsc2UgeworCQkJCSp3cCsrID0gUUNIQVI7CisJCQkJKndwKysgPSBjOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTRFFVT1RFOgorCQkJaWYgKGMgPT0gJyInKSB7CisJCQkJUE9QX1NUQVRFKCk7CisJCQkJKndwKysgPSBDUVVPVEU7CisJCQl9IGVsc2UKKwkJCQlnb3RvIFN1YnN0OworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1NQQVJFTjoJLyogJCggLi4uICkgKi8KKwkJCS8qIHRvZG86IGRlYWwgd2l0aCAkKC4uLikgcXVvdGluZyBwcm9wZXJseQorCQkJICoga2x1ZGdlIHRvIHBhcnRseSBmYWtlIHF1b3RpbmcgaW5zaWRlICQoLi4uKTogZG9lc24ndAorCQkJICogcmVhbGx5IHdvcmsgYmVjYXVzZSBuZXN0ZWQgJCguLi4pIG9yICR7Li4ufSBpbnNpZGUKKwkJCSAqIGRvdWJsZSBxdW90ZXMgYXJlbid0IGRlYWx0IHdpdGguCisJCQkgKi8KKwkJCXN3aXRjaCAoc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlKSB7CisJCQljYXNlIDA6CS8qIG5vcm1hbCAqLworCQkJCXN3aXRjaCAoYykgeworCQkJCWNhc2UgJygnOgorCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLm5wYXJlbisrOworCQkJCQlicmVhazsKKwkJCQljYXNlICcpJzoKKwkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5ucGFyZW4tLTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXFwnOgorCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICciJzoKKwkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXCcnOgorCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSA0OworCQkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIDE6CS8qIGJhY2tzbGFzaCBpbiBub3JtYWwgbW9kZSAqLworCQkJY2FzZSAzOgkvKiBiYWNrc2xhc2ggaW4gZG91YmxlIHF1b3RlcyAqLworCQkJCS0tc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6CS8qIGRvdWJsZSBxdW90ZXMgKi8KKwkJCQlpZiAoYyA9PSAnIicpCisJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDA7CisJCQkJZWxzZSBpZiAoYyA9PSAnXFwnKQorCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSAzOworCQkJCWJyZWFrOworCisJCQljYXNlIDQ6CS8qIHNpbmdsZSBxdW90ZXMgKi8KKwkJCQlpZiAoYyA9PSAnXCcnKSB7CisJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDA7CisJCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZS0tOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdGF0ZXAtPmxzX3Njc3BhcmVuLm5wYXJlbiA9PSAwKSB7CisJCQkJUE9QX1NUQVRFKCk7CisJCQkJKndwKysgPSAwOwkvKiBlbmQgb2YgQ09NU1VCICovCisJCQl9IGVsc2UKKwkJCQkqd3ArKyA9IGM7CisJCQlicmVhazsKKworCQljYXNlIFNBU1BBUkVOOgkvKiAkKCggLi4uICkpICovCisJCQkvKiBYWFggc2hvdWxkIG5lc3QgdXNpbmcgZXhpc3Rpbmcgc3RhdGUgbWFjaGluZQorCQkJICogKGVtYmVkICIuLi4iLCAkKC4uLiksIGV0Yy4pICovCisJCQlpZiAoYyA9PSAnKCcpCisJCQkJc3RhdGVwLT5sc19zYXNwYXJlbi5ucGFyZW4rKzsKKwkJCWVsc2UgaWYgKGMgPT0gJyknKSB7CisJCQkJc3RhdGVwLT5sc19zYXNwYXJlbi5ucGFyZW4tLTsKKwkJCQlpZiAoc3RhdGVwLT5sc19zYXNwYXJlbi5ucGFyZW4gPT0gMSkgeworCQkJCQkvKigqLworCQkJCQlpZiAoKGMyID0gZ2V0c2MoKSkgPT0gJyknKSB7CisJCQkJCQlQT1BfU1RBVEUoKTsKKwkJCQkJCS8qIGVuZCBvZiBFWFBSU1VCICovCisJCQkJCQkqd3ArKyA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNoYXIgKnM7CisKKwkJCQkJCXVuZ2V0c2MoYzIpOworCQkJCQkJLyogbWlzbWF0Y2hlZCBwYXJlbnRoZXNpcyAtCisJCQkJCQkgKiBhc3N1bWUgd2Ugd2VyZSByZWFsbHkKKwkJCQkJCSAqIHBhcnNpbmcgYSAkKC4uLikgZXhwcmVzc2lvbgorCQkJCQkJICovCisJCQkJCQlzID0gWHJlc3Rwb3Mod3MsIHdwLAorCQkJCQkJICAgIHN0YXRlcC0+bHNfc2FzcGFyZW4uc3RhcnQpOworCQkJCQkJbWVtbW92ZShzICsgMSwgcywgd3AgLSBzKTsKKwkJCQkJCSpzKysgPSBDT01TVUI7CisJCQkJCQkqcyA9ICcoJzsgLyopKi8KKwkJCQkJCXdwKys7CisJCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLm5wYXJlbiA9IDE7CisJCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSAwOworCQkJCQkJc3RhdGUgPSBzdGF0ZXAtPmxzX3N0YXRlID0KKwkJCQkJCSAgICBTQ1NQQVJFTjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCSp3cCsrID0gYzsKKwkJCWJyZWFrOworCisJCWNhc2UgU1FCUkFDRToKKwkJCWlmIChjID09ICdcXCcpIHsKKwkJCQkvKgorCQkJCSAqIHBlcmZvcm0gUE9TSVggInF1b3RlIHJlbW92YWwiIGlmIHRoZSBiYWNrLQorCQkJCSAqIHNsYXNoIGlzICJzcGVjaWFsIiwgaS5lLiBzYW1lIGNhc2VzIGFzIHRoZQorCQkJCSAqIHtjYXNlICdcXCc6fSBpbiBTdWJzdDogcGx1cyBjbG9zaW5nIGJyYWNlOworCQkJCSAqIGluIG1rc2ggY29kZSAicXVvdGUgcmVtb3ZhbCIgb24gJ1xjJyBtZWFucworCQkJCSAqIHdyaXRlIFFDSEFSK2MsIG90aGVyd2lzZSBDSEFSK1wrQ0hBUitjIGFyZQorCQkJCSAqIGVtaXR0ZWQgKGluIGhlcmVkb2NxdW90ZTopCisJCQkJICovCisJCQkJaWYgKChjID0gZ2V0c2MoKSkgPT0gJyInIHx8IGMgPT0gJ1xcJyB8fAorCQkJCSAgICBjID09ICckJyB8fCBjID09ICdgJyB8fCBjID09IC8qeyovJ30nKQorCQkJCQlnb3RvIHN0b3JlX3FjaGFyOworCQkJCWdvdG8gaGVyZWRvY3F1b3RlOworCQkJfQorCQkJZ290byBjb21tb25fU1FCUkFDRTsKKworCQljYXNlIFNCUkFDRToKKwkJCWlmIChjID09ICdcJycpCisJCQkJZ290byBvcGVuX3NzcXVvdGU7CisJCQllbHNlIGlmIChjID09ICdcXCcpCisJCQkJZ290byBnZXRzY19xY2hhcjsKKyBjb21tb25fU1FCUkFDRToKKwkJCWlmIChjID09ICciJykKKwkJCQlnb3RvIG9wZW5fc2RxdW90ZTsKKwkJCWVsc2UgaWYgKGMgPT0gJyQnKQorCQkJCWdvdG8gc3Vic3RfZG9sbGFyOworCQkJZWxzZSBpZiAoYyA9PSAnYCcpCisJCQkJZ290byBzdWJzdF9ncmF2aXM7CisJCQllbHNlIGlmIChjICE9IC8qeyovICd9JykKKwkJCQlnb3RvIHN0b3JlX2NoYXI7CisJCQlQT1BfU1RBVEUoKTsKKwkJCSp3cCsrID0gQ1NVQlNUOworCQkJKndwKysgPSAvKnsqLyAnfSc7CisJCQlicmVhazsKKworCQljYXNlIFNUQlJBQ0U6CisJCQkvKiBTYW1lIGFzIFNCQVNFLCBleGNlcHQgKCx8LCkgdHJlYXRlZCBzcGVjaWFsbHkgKi8KKwkJCWlmIChjID09IC8qeyovICd9JykgeworCQkJCVBPUF9TVEFURSgpOworCQkJCSp3cCsrID0gQ1NVQlNUOworCQkJCSp3cCsrID0gLyp7Ki8gJ30nOworCQkJfSBlbHNlIGlmIChjID09ICd8JykgeworCQkJCSp3cCsrID0gU1BBVDsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnKCcpIHsKKwkJCQkqd3ArKyA9IE9QQVQ7CisJCQkJKndwKysgPSAnICc7CS8qIHNpbWlsZSBmb3IgQCAqLworCQkJCVBVU0hfU1RBVEUoU1BBVFRFUk4pOworCQkJfSBlbHNlCisJCQkJZ290byBTYmFzZTE7CisJCQlicmVhazsKKworCQljYXNlIFNCUVVPVEU6CisJCQlpZiAoYyA9PSAnYCcpIHsKKwkJCQkqd3ArKyA9IDA7CisJCQkJUE9QX1NUQVRFKCk7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ1xcJykgeworCQkJCXN3aXRjaCAoYyA9IGdldHNjKCkpIHsKKwkJCQljYXNlICdcXCc6CisJCQkJY2FzZSAnJCc6IGNhc2UgJ2AnOgorCQkJCQkqd3ArKyA9IGM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJyInOgorCQkJCQlpZiAoc3RhdGVwLT5sc19zYnF1b3RlLmluZHF1b3RlcykgeworCQkJCQkJKndwKysgPSBjOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCQlkZWZhdWx0OgorCQkJCQlpZiAoYykgeworCQkJCQkJLyogdHJhaWxpbmcgXCBpcyBsb3N0ICovCisJCQkJCQkqd3ArKyA9ICdcXCc7CisJCQkJCQkqd3ArKyA9IGM7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJKndwKysgPSBjOworCQkJYnJlYWs7CisKKwkJY2FzZSBTV09SRDoJLyogT05FV09SRCAqLworCQkJZ290byBTdWJzdDsKKworCQljYXNlIFNMRVRQQVJFTjoJLyogTEVURVhQUjogKCggLi4uICkpICovCisJCQkvKigqLworCQkJaWYgKGMgPT0gJyknKSB7CisJCQkJaWYgKHN0YXRlcC0+bHNfc2xldHBhcmVuLm5wYXJlbiA+IDApCisJCQkJCS0tc3RhdGVwLT5sc19zbGV0cGFyZW4ubnBhcmVuOworCQkJCWVsc2UgaWYgKChjMiA9IGdldHNjKCkpID09IC8qKCovICcpJykgeworCQkJCQljID0gMDsKKwkJCQkJKndwKysgPSBDUVVPVEU7CisJCQkJCWdvdG8gRG9uZTsKKwkJCQl9IGVsc2UgeworCQkJCQlTb3VyY2UgKnM7CisKKwkJCQkJdW5nZXRzYyhjMik7CisJCQkJCS8qIG1pc21hdGNoZWQgcGFyZW50aGVzaXMgLQorCQkJCQkgKiBhc3N1bWUgd2Ugd2VyZSByZWFsbHkKKwkJCQkJICogcGFyc2luZyBhICQoLi4uKSBleHByZXNzaW9uCisJCQkJCSAqLworCQkJCQkqd3AgPSBFT1M7CisJCQkJCXNwID0gWHN0cmluZyh3cywgd3ApOworCQkJCQlkcCA9IHdkc3RyaXAoc3AsIHRydWUsIGZhbHNlKTsKKwkJCQkJcyA9IHB1c2hzKFNSRVJFQUQsIHNvdXJjZS0+YXJlYXApOworCQkJCQlzLT5zdGFydCA9IHMtPnN0ciA9IHMtPnUuZnJlZW1lID0gZHA7CisJCQkJCXMtPm5leHQgPSBzb3VyY2U7CisJCQkJCXNvdXJjZSA9IHM7CisJCQkJCXJldHVybiAoJygnLyopKi8pOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoYyA9PSAnKCcpCisJCQkJLyogcGFyZW50aGVzaXMgaW5zaWRlIHF1b3RlcyBhbmQgYmFja3NsYXNoZXMKKwkJCQkgKiBhcmUgbG9zdCwgYnV0IEFUJlQga3NoIGRvZXNuJ3QgY291bnQgdGhlbQorCQkJCSAqIGVpdGhlcgorCQkJCSAqLworCQkJCSsrc3RhdGVwLT5sc19zbGV0cGFyZW4ubnBhcmVuOworCQkJZ290byBTYmFzZTI7CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQljYXNlIFNMRVRBUlJBWToJLyogTEVUQVJSQVk6ID0oIC4uLiApICovCisJCQlpZiAoYyA9PSAnKCcvKikqLykKKwkJCQkrK3N0YXRlcC0+bHNfc2xldGFycmF5Lm5wYXJlbjsKKwkJCWVsc2UgaWYgKGMgPT0gLyooKi8nKScpCisJCQkJaWYgKHN0YXRlcC0+bHNfc2xldGFycmF5Lm5wYXJlbi0tID09IDApIHsKKwkJCQkJYyA9IDA7CisJCQkJCWdvdG8gRG9uZTsKKwkJCQl9CisJCQkqd3ArKyA9IENIQVI7CisJCQkqd3ArKyA9IGM7CisJCQlicmVhazsKKyNlbmRpZgorCisJCWNhc2UgU0hFUkVTVFJJTkc6CS8qIDw8PCBkZWxpbWl0ZXIgKi8KKwkJCWlmIChjID09ICdcXCcpIHsKKwkJCQljID0gZ2V0c2MoKTsKKwkJCQlpZiAoYykgeworCQkJCQkvKiB0cmFpbGluZyBcIGlzIGxvc3QgKi8KKwkJCQkJKndwKysgPSBRQ0hBUjsKKwkJCQkJKndwKysgPSBjOworCQkJCX0KKwkJCQkvKiBpbnZva2UgcXVvdGluZyBtb2RlICovCisJCQkJWHN0cmluZyh3cywgd3ApWzBdID0gUUNIQVI7CisJCQl9IGVsc2UgaWYgKGMgPT0gJyQnKSB7CisJCQkJaWYgKChjMiA9IGdldHNjKCkpID09ICdcJycpIHsKKwkJCQkJUFVTSF9TVEFURShTRVFVT1RFKTsKKwkJCQkJc3RhdGVwLT5sc19zZXF1b3RlLmdvdF9OVUwgPSBmYWxzZTsKKwkJCQkJZ290byBzaGVyZXN0cmluZ19xdW90ZWQ7CisJCQkJfQorCQkJCXVuZ2V0c2MoYzIpOworCQkJCWdvdG8gc2hlcmVzdHJpbmdfcmVndWxhcjsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnXCcnKSB7CisJCQkJUFVTSF9TVEFURShTU1FVT1RFKTsKKyBzaGVyZXN0cmluZ19xdW90ZWQ6CisJCQkJKndwKysgPSBPUVVPVEU7CisJCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7CisJCQkJLyogaW52b2tlIHF1b3RpbmcgbW9kZSAqLworCQkJCVhzdHJpbmcod3MsIHdwKVswXSA9IFFDSEFSOworCQkJfSBlbHNlIGlmIChjID09ICciJykgeworCQkJCXN0YXRlID0gc3RhdGVwLT5sc19zdGF0ZSA9IFNIRVJFRFFVT1RFOworCQkJCSp3cCsrID0gT1FVT1RFOworCQkJCS8qIGp1c3QgZG9uJ3QgSUZTIHNwbGl0OyBubyBxdW90aW5nIG1vZGUgKi8KKwkJCX0gZWxzZSB7Cisgc2hlcmVzdHJpbmdfcmVndWxhcjoKKwkJCQkqd3ArKyA9IENIQVI7CisJCQkJKndwKysgPSBjOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTSEVSRURFTElNOgkvKiA8PCw8PC0gZGVsaW1pdGVyICovCisJCQkvKiBYWFggY2h1Y2sgdGhpcyBzdGF0ZSAoYW5kIHRoZSBuZXh0KSAtIHVzZQorCQkJICogdGhlIGV4aXN0aW5nIHN0YXRlcyAoJCBhbmQgXGAuLi5gIHNob3VsZCBiZQorCQkJICogc3RyaXBwZWQgb2YgdGhlaXIgc3BlY2lhbG5lc3MgYWZ0ZXIgdGhlCisJCQkgKiBmYWN0KS4KKwkJCSAqLworCQkJLyogaGVyZSBkZWxpbWl0ZXJzIG5lZWQgYSBzcGVjaWFsIGNhc2Ugc2luY2UKKwkJCSAqICQgYW5kIGAuLi5gIGFyZSBub3QgdG8gYmUgdHJlYXRlZCBzcGVjaWFsbHkKKwkJCSAqLworCQkJaWYgKGMgPT0gJ1xcJykgeworCQkJCWMgPSBnZXRzYygpOworCQkJCWlmIChjKSB7CisJCQkJCS8qIHRyYWlsaW5nIFwgaXMgbG9zdCAqLworCQkJCQkqd3ArKyA9IFFDSEFSOworCQkJCQkqd3ArKyA9IGM7CisJCQkJfQorCQkJfSBlbHNlIGlmIChjID09ICckJykgeworCQkJCWlmICgoYzIgPSBnZXRzYygpKSA9PSAnXCcnKSB7CisJCQkJCVBVU0hfU1RBVEUoU0VRVU9URSk7CisJCQkJCXN0YXRlcC0+bHNfc2VxdW90ZS5nb3RfTlVMID0gZmFsc2U7CisJCQkJCWdvdG8gc2hlcmVkZWxpbV9xdW90ZWQ7CisJCQkJfQorCQkJCXVuZ2V0c2MoYzIpOworCQkJCWdvdG8gc2hlcmVkZWxpbV9yZWd1bGFyOworCQkJfSBlbHNlIGlmIChjID09ICdcJycpIHsKKwkJCQlQVVNIX1NUQVRFKFNTUVVPVEUpOworIHNoZXJlZGVsaW1fcXVvdGVkOgorCQkJCSp3cCsrID0gT1FVT1RFOworCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSsrOworCQkJfSBlbHNlIGlmIChjID09ICciJykgeworCQkJCXN0YXRlID0gc3RhdGVwLT5sc19zdGF0ZSA9IFNIRVJFRFFVT1RFOworCQkJCSp3cCsrID0gT1FVT1RFOworCQkJfSBlbHNlIHsKKyBzaGVyZWRlbGltX3JlZ3VsYXI6CisJCQkJKndwKysgPSBDSEFSOworCQkJCSp3cCsrID0gYzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0hFUkVEUVVPVEU6CS8qICIgaW4gPDwsPDwtIGRlbGltaXRlciAqLworCQkJaWYgKGMgPT0gJyInKSB7CisJCQkJKndwKysgPSBDUVVPVEU7CisJCQkJc3RhdGUgPSBzdGF0ZXAtPmxzX3N0YXRlID0KKwkJCQkgICAgLyogZHBbMV0gPT0gJzwnIG1lYW5zIGhlcmUgc3RyaW5nICovCisJCQkJICAgIFhzdHJpbmcod3MsIHdwKVsxXSA9PSAnPCcgPworCQkJCSAgICBTSEVSRVNUUklORyA6IFNIRVJFREVMSU07CisJCQl9IGVsc2UgeworCQkJCWlmIChjID09ICdcXCcpIHsKKwkJCQkJc3dpdGNoIChjID0gZ2V0c2MoKSkgeworCQkJCQljYXNlICdcXCc6IGNhc2UgJyInOgorCQkJCQljYXNlICckJzogY2FzZSAnYCc6CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWlmIChjKSB7CisJCQkJCQkJLyogdHJhaWxpbmcgXCBsb3N0ICovCisJCQkJCQkJKndwKysgPSBDSEFSOworCQkJCQkJCSp3cCsrID0gJ1xcJzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkqd3ArKyA9IGM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNQQVRURVJOOgkvKiBpbiAqKC4uLnwuLi4pIHBhdHRlcm4gKCorP0AhKSAqLworCQkJaWYgKCAvKigqLyBjID09ICcpJykgeworCQkJCSp3cCsrID0gQ1BBVDsKKwkJCQlQT1BfU1RBVEUoKTsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnfCcpIHsKKwkJCQkqd3ArKyA9IFNQQVQ7CisJCQl9IGVsc2UgaWYgKGMgPT0gJygnKSB7CisJCQkJKndwKysgPSBPUEFUOworCQkJCSp3cCsrID0gJyAnOwkvKiBzaW1pbGUgZm9yIEAgKi8KKwkJCQlQVVNIX1NUQVRFKFNQQVRURVJOKTsKKwkJCX0gZWxzZQorCQkJCWdvdG8gU2Jhc2UxOworCQkJYnJlYWs7CisJCX0KKwl9CisgRG9uZToKKwlYY2hlY2sod3MsIHdwKTsKKwlpZiAoc3RhdGVwICE9ICZzdGF0ZXNbMV0pCisJCS8qIFhYWCBmaWd1cmUgb3V0IHdoYXQgaXMgbWlzc2luZyAqLworCQl5eWVycm9yKCJubyBjbG9zaW5nIHF1b3RlXG4iKTsKKworI2lmbmRlZiBNS1NIX1NNQUxMCisJaWYgKHN0YXRlID09IFNMRVRBUlJBWSAmJiBzdGF0ZXAtPmxzX3NsZXRhcnJheS5ucGFyZW4gIT0gLTEpCisJCXl5ZXJyb3IoIiVzOiAnKScgbWlzc2luZ1xuIiwgVF9zeW5lcnIpOworI2VuZGlmCisKKwkvKiBUaGlzIGRvbmUgdG8gYXZvaWQgdGVzdHMgZm9yIFNIRVJFREVMSU0gd2hlcmV2ZXIgU0JBU0UgdGVzdGVkICovCisJaWYgKHN0YXRlID09IFNIRVJFREVMSU0gfHwgc3RhdGUgPT0gU0hFUkVTVFJJTkcpCisJCXN0YXRlID0gU0JBU0U7CisKKwlkcCA9IFhzdHJpbmcod3MsIHdwKTsKKwlpZiAoKGMgPT0gJzwnIHx8IGMgPT0gJz4nIHx8IGMgPT0gJyYnKSAmJiBzdGF0ZSA9PSBTQkFTRSkgeworCQlzdHJ1Y3QgaW93b3JkICppb3AgPSBhbGxvYyhzaXplb2Yoc3RydWN0IGlvd29yZCksIEFURU1QKTsKKworCQlpZiAoWGxlbmd0aCh3cywgd3ApID09IDApCisJCQlpb3AtPnVuaXQgPSBjID09ICc8JyA/IDAgOiAxOworCQllbHNlIGZvciAoaW9wLT51bml0ID0gMCwgYzIgPSAwOyBjMiA8IFhsZW5ndGgod3MsIHdwKTsgYzIgKz0gMikgeworCQkJaWYgKGRwW2MyXSAhPSBDSEFSKQorCQkJCWdvdG8gbm9faW9wOworCQkJaWYgKCFrc2hfaXNkaWdpdChkcFtjMiArIDFdKSkKKwkJCQlnb3RvIG5vX2lvcDsKKwkJCWlvcC0+dW5pdCA9IChpb3AtPnVuaXQgKiAxMCkgKyBkcFtjMiArIDFdIC0gJzAnOworCQl9CisKKwkJaWYgKGlvcC0+dW5pdCA+PSBGREJBU0UpCisJCQlnb3RvIG5vX2lvcDsKKworCQlpZiAoYyA9PSAnJicpIHsKKwkJCWlmICgoYzIgPSBnZXRzYygpKSAhPSAnPicpIHsKKwkJCQl1bmdldHNjKGMyKTsKKwkJCQlnb3RvIG5vX2lvcDsKKwkJCX0KKwkJCWMgPSBjMjsKKwkJCWlvcC0+ZmxhZyA9IElPQkFTSDsKKwkJfSBlbHNlCisJCQlpb3AtPmZsYWcgPSAwOworCisJCWMyID0gZ2V0c2MoKTsKKwkJLyogPDwsID4+LCA8PiBhcmUgb2ssID48IGlzIG5vdCAqLworCQlpZiAoYyA9PSBjMiB8fCAoYyA9PSAnPCcgJiYgYzIgPT0gJz4nKSkgeworCQkJaW9wLT5mbGFnIHw9IGMgPT0gYzIgPworCQkJICAgIChjID09ICc+JyA/IElPQ0FUIDogSU9IRVJFKSA6IElPUkRXUjsKKwkJCWlmIChpb3AtPmZsYWcgPT0gSU9IRVJFKSB7CisJCQkJaWYgKChjMiA9IGdldHNjKCkpID09ICctJykKKwkJCQkJaW9wLT5mbGFnIHw9IElPU0tJUDsKKwkJCQllbHNlCisJCQkJCXVuZ2V0c2MoYzIpOworCQkJfQorCQl9IGVsc2UgaWYgKGMyID09ICcmJykKKwkJCWlvcC0+ZmxhZyB8PSBJT0RVUCB8IChjID09ICc8JyA/IElPUkRVUCA6IDApOworCQllbHNlIHsKKwkJCWlvcC0+ZmxhZyB8PSBjID09ICc+JyA/IElPV1JJVEUgOiBJT1JFQUQ7CisJCQlpZiAoYyA9PSAnPicgJiYgYzIgPT0gJ3wnKQorCQkJCWlvcC0+ZmxhZyB8PSBJT0NMT0I7CisJCQllbHNlCisJCQkJdW5nZXRzYyhjMik7CisJCX0KKworCQlpb3AtPm5hbWUgPSBOVUxMOworCQlpb3AtPmRlbGltID0gTlVMTDsKKwkJaW9wLT5oZXJlZG9jID0gTlVMTDsKKwkJWGZyZWUod3MsIHdwKTsJLyogZnJlZSB3b3JkICovCisJCXl5bHZhbC5pb3AgPSBpb3A7CisJCXJldHVybiAoUkVESVIpOworIG5vX2lvcDoKKwkJOworCX0KKworCWlmICh3cCA9PSBkcCAmJiBzdGF0ZSA9PSBTQkFTRSkgeworCQlYZnJlZSh3cywgd3ApOwkvKiBmcmVlIHdvcmQgKi8KKwkJLyogbm8gd29yZCwgcHJvY2VzcyBMRVgxIGNoYXJhY3RlciAqLworCQlpZiAoKGMgPT0gJ3wnKSB8fCAoYyA9PSAnJicpIHx8IChjID09ICc7JykgfHwgKGMgPT0gJygnLyopKi8pKSB7CisJCQlpZiAoKGMyID0gZ2V0c2MoKSkgPT0gYykKKwkJCQljID0gKGMgPT0gJzsnKSA/IEJSRUFLIDoKKwkJCQkgICAgKGMgPT0gJ3wnKSA/IExPR09SIDoKKwkJCQkgICAgKGMgPT0gJyYnKSA/IExPR0FORCA6CisJCQkJICAgIC8qIGMgPT0gJygnICkgKi8gTURQQVJFTjsKKwkJCWVsc2UgaWYgKGMgPT0gJ3wnICYmIGMyID09ICcmJykKKwkJCQljID0gQ09QUk9DOworCQkJZWxzZQorCQkJCXVuZ2V0c2MoYzIpOworCQl9IGVsc2UgaWYgKGMgPT0gJ1xuJykgeworCQkJZ2V0aGVyZShmYWxzZSk7CisJCQlpZiAoY2YgJiBDT05USU4pCisJCQkJZ290byBBZ2FpbjsKKwkJfSBlbHNlIGlmIChjID09ICdcMCcpCisJCQkvKiBuZWVkIGhlcmUgc3RyaW5ncyBhdCBFT0YgKi8KKwkJCWdldGhlcmUodHJ1ZSk7CisJCXJldHVybiAoYyk7CisJfQorCisJKndwKysgPSBFT1M7CQkvKiB0ZXJtaW5hdGUgd29yZCAqLworCXl5bHZhbC5jcCA9IFhjbG9zZSh3cywgd3ApOworCWlmIChzdGF0ZSA9PSBTV09SRCB8fCBzdGF0ZSA9PSBTTEVUUEFSRU4KKwkgICAgLyogWFhYIE9ORVdPUkQ/ICovCisjaWZuZGVmIE1LU0hfU01BTEwKKwkgICAgfHwgc3RhdGUgPT0gU0xFVEFSUkFZCisjZW5kaWYKKwkgICAgKQorCQlyZXR1cm4gKExXT1JEKTsKKworCS8qIHVuZ2V0IHRlcm1pbmF0b3IgKi8KKwl1bmdldHNjKGMpOworCisJLyoKKwkgKiBub3RlOiB0aGUgYWxpYXMtdnMtZnVuY3Rpb24gY29kZSBiZWxvdyBkZXBlbmRzIG9uIHNldmVyYWwKKwkgKiBpbnRlcm5hOiBzdGFydGluZyBmcm9tIGhlcmUsIHNvdXJjZS0+c3RyIGlzIG5vdCBtb2RpZmllZDsKKwkgKiB0aGUgd2F5IGdldHNjKCkgYW5kIHVuZ2V0c2MoKSBvcGVyYXRlOyBldGMuCisJICovCisKKwkvKiBjb3B5IHdvcmQgdG8gdW5wcmVmaXhlZCBzdHJpbmcgaWRlbnQgKi8KKwlzcCA9IHl5bHZhbC5jcDsKKwlkcCA9IGlkZW50OworCWlmICgoY2YgJiBIRVJFREVMSU0pICYmIChzcFsxXSA9PSAnPCcpKQorCQl3aGlsZSAoZHAgPCBpZGVudCtJREVOVCkgeworCQkJaWYgKChjID0gKnNwKyspID09IENIQVIpCisJCQkJKmRwKysgPSAqc3ArKzsKKwkJCWVsc2UgaWYgKChjICE9IE9RVU9URSkgJiYgKGMgIT0gQ1FVT1RFKSkKKwkJCQlicmVhazsKKwkJfQorCWVsc2UKKwkJd2hpbGUgKGRwIDwgaWRlbnQrSURFTlQgJiYgKGMgPSAqc3ArKykgPT0gQ0hBUikKKwkJCSpkcCsrID0gKnNwKys7CisJLyogTWFrZSBzdXJlIHRoZSBpZGVudCBhcnJheSBzdGF5cyAnXDAnIHBhZGRlZCAqLworCW1lbXNldChkcCwgMCwgKGlkZW50K0lERU5UKSAtIGRwICsgMSk7CisJaWYgKGMgIT0gRU9TKQorCQkqaWRlbnQgPSAnXDAnOwkvKiB3b3JkIGlzIG5vdCB1bnF1b3RlZCAqLworCisJaWYgKCppZGVudCAhPSAnXDAnICYmIChjZiYoS0VZV09SRHxBTElBUykpKSB7CisJCXN0cnVjdCB0YmwgKnA7CisJCXVpbnQzMl90IGggPSBoYXNoKGlkZW50KTsKKworCQkvKiB7ICovCisJCWlmICgoY2YgJiBLRVlXT1JEKSAmJiAocCA9IGt0c2VhcmNoKCZrZXl3b3JkcywgaWRlbnQsIGgpKSAmJgorCQkgICAgKCEoY2YgJiBFU0FDT05MWSkgfHwgcC0+dmFsLmkgPT0gRVNBQyB8fCBwLT52YWwuaSA9PSAnfScpKSB7CisJCQlhZnJlZSh5eWx2YWwuY3AsIEFURU1QKTsKKwkJCXJldHVybiAocC0+dmFsLmkpOworCQl9CisJCWlmICgoY2YgJiBBTElBUykgJiYgKHAgPSBrdHNlYXJjaCgmYWxpYXNlcywgaWRlbnQsIGgpKSAmJgorCQkgICAgKHAtPmZsYWcgJiBJU1NFVCkpIHsKKwkJCS8qCisJCQkgKiB0aGlzIHN0aWxsIHBvaW50cyB0byB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgdGhlCisJCQkgKiB1bmdldHNjJ2QgdGVybWluYXRvciBmcm9tIGFib3ZlCisJCQkgKi8KKwkJCWNvbnN0IGNoYXIgKmNwID0gc291cmNlLT5zdHI7CisKKwkJCS8qIHByZWZlciBQT1NJWCBidXQgbm90IEtvcm4gZnVuY3Rpb25zIG92ZXIgYWxpYXNlcyAqLworCQkJd2hpbGUgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpCisJCQkJLyoKKwkJCQkgKiB0aGlzIGlzIGxpa2UgZ2V0c2MoKSB3aXRob3V0IHNraXBwaW5nCisJCQkJICogb3ZlciBTb3VyY2UgYm91bmRhcmllcyAoaW5jbHVkaW5nIG5vdAorCQkJCSAqIHBhcnNpbmcgdW5nZXRzYydkIGNoYXJhY3RlcnMgdGhhdCBnb3QKKwkJCQkgKiBwdXNoZWQgaW50byBhbiBTUkVSRUFEKSB3aGljaCBpcyB3aGF0CisJCQkJICogd2Ugd2FudCBoZXJlIGFueXdheTogZmluZCBvdXQgd2hldGhlcgorCQkJCSAqIHRoZSBhbGlhcyBuYW1lIGlzIGZvbGxvd2VkIGJ5IGEgUE9TSVgKKwkJCQkgKiBmdW5jdGlvbiBkZWZpbml0aW9uIChvbmx5IHRoZSBvcGVuaW5nCisJCQkJICogcGFyZW50aGVzaXMgaXMgY2hlY2tlZCB0aG91Z2gpCisJCQkJICovCisJCQkJKytjcDsKKwkJCS8qIHByZWZlciBmdW5jdGlvbnMgb3ZlciBhbGlhc2VzICovCisJCQlpZiAoKmNwID09ICcoJyAvKikqLykKKwkJCQkvKgorCQkJCSAqIGRlbGV0ZSBhbGlhcyB1cG9uIGVuY291bnRlcmluZyBmdW5jdGlvbgorCQkJCSAqIGRlZmluaXRpb24KKwkJCQkgKi8KKwkJCQlrdGRlbGV0ZShwKTsKKwkJCWVsc2UgeworCQkJCVNvdXJjZSAqcyA9IHNvdXJjZTsKKworCQkJCXdoaWxlIChzICYmIChzLT5mbGFncyAmIFNGX0hBU0FMSUFTKSkKKwkJCQkJaWYgKHMtPnUudGJscCA9PSBwKQorCQkJCQkJcmV0dXJuIChMV09SRCk7CisJCQkJCWVsc2UKKwkJCQkJCXMgPSBzLT5uZXh0OworCQkJCS8qIHB1c2ggYWxpYXMgZXhwYW5zaW9uICovCisJCQkJcyA9IHB1c2hzKFNBTElBUywgc291cmNlLT5hcmVhcCk7CisJCQkJcy0+c3RhcnQgPSBzLT5zdHIgPSBwLT52YWwuczsKKwkJCQlzLT51LnRibHAgPSBwOworCQkJCXMtPmZsYWdzIHw9IFNGX0hBU0FMSUFTOworCQkJCXMtPm5leHQgPSBzb3VyY2U7CisJCQkJaWYgKHNvdXJjZS0+dHlwZSA9PSBTRU9GKSB7CisJCQkJCS8qIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGF0IEVPUyAqLworCQkJCQlzb3VyY2UtPnUudGJscCA9IHA7CisJCQkJCXNvdXJjZS0+ZmxhZ3MgfD0gU0ZfSEFTQUxJQVM7CisJCQkJfQorCQkJCXNvdXJjZSA9IHM7CisJCQkJYWZyZWUoeXlsdmFsLmNwLCBBVEVNUCk7CisJCQkJZ290byBBZ2FpbjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAoTFdPUkQpOworfQorCitzdGF0aWMgdm9pZAorZ2V0aGVyZShib29sIGlzZW9mKQoreworCXN0cnVjdCBpb3dvcmQgKipwOworCisJZm9yIChwID0gaGVyZXM7IHAgPCBoZXJlcDsgcCsrKQorCQlpZiAoaXNlb2YgJiYgKCpwKS0+ZGVsaW1bMV0gIT0gJzwnKQorCQkJLyogb25seSBoZXJlIHN0cmluZ3MgYXQgRU9GICovCisJCQlyZXR1cm47CisJCWVsc2UKKwkJCXJlYWRoZXJlKCpwKTsKKwloZXJlcCA9IGhlcmVzOworfQorCisvKgorICogcmVhZCAiPDx3b3JkIiB0ZXh0IGludG8gdGVtcCBmaWxlCisgKi8KKworc3RhdGljIHZvaWQKK3JlYWRoZXJlKHN0cnVjdCBpb3dvcmQgKmlvcCkKK3sKKwlpbnQgYzsKKwljaGFyICp2b2xhdGlsZSBlb2Y7CisJY2hhciAqZW9mcDsKKwlpbnQgc2tpcHRhYnM7CisJWFN0cmluZyB4czsKKwljaGFyICp4cDsKKwlpbnQgeHBvczsKKworCWlmIChpb3AtPmRlbGltWzFdID09ICc8JykgeworCQkvKiBwcm9jZXNzIHRoZSBoZXJlIHN0cmluZyAqLworCQl4cCA9IGlvcC0+aGVyZWRvYyA9IGV2YWxzdHIoaW9wLT5kZWxpbSwgRE9CTEFOSyk7CisJCWMgPSBzdHJsZW4oeHApIC0gMTsKKwkJbWVtbW92ZSh4cCwgeHAgKyAxLCBjKTsKKwkJeHBbY10gPSAnXG4nOworCQlyZXR1cm47CisJfQorCisJZW9mID0gZXZhbHN0cihpb3AtPmRlbGltLCAwKTsKKworCWlmICghKGlvcC0+ZmxhZyAmIElPRVZBTCkpCisJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSsrOworCisJWGluaXQoeHMsIHhwLCAyNTYsIEFURU1QKTsKKworCWZvciAoOzspIHsKKwkJZW9mcCA9IGVvZjsKKwkJc2tpcHRhYnMgPSBpb3AtPmZsYWcgJiBJT1NLSVA7CisJCXhwb3MgPSBYc2F2ZXBvcyh4cywgeHApOworCQl3aGlsZSAoKGMgPSBnZXRzYygpKSAhPSAwKSB7CisJCQlpZiAoc2tpcHRhYnMpIHsKKwkJCQlpZiAoYyA9PSAnXHQnKQorCQkJCQljb250aW51ZTsKKwkJCQlza2lwdGFicyA9IDA7CisJCQl9CisJCQlpZiAoYyAhPSAqZW9mcCkKKwkJCQlicmVhazsKKwkJCVhjaGVjayh4cywgeHApOworCQkJWHB1dCh4cywgeHAsIGMpOworCQkJZW9mcCsrOworCQl9CisJCS8qIEFsbG93IEVPRiBoZXJlIHNvIGNvbW1hbmRzIHdpdGggb3V0IHRyYWlsaW5nIG5ld2xpbmVzCisJCSAqIHdpbGwgd29yayAoZWcsIGtzaCAtYyAnLi4uJywgJCguLi4pLCBldGMpLgorCQkgKi8KKwkJaWYgKCplb2ZwID09ICdcMCcgJiYgKGMgPT0gMCB8fCBjID09ICdcbicpKSB7CisJCQl4cCA9IFhyZXN0cG9zKHhzLCB4cCwgeHBvcyk7CisJCQlicmVhazsKKwkJfQorCQl1bmdldHNjKGMpOworCQl3aGlsZSAoKGMgPSBnZXRzYygpKSAhPSAnXG4nKSB7CisJCQlpZiAoYyA9PSAwKQorCQkJCXl5ZXJyb3IoImhlcmUgZG9jdW1lbnQgJyVzJyB1bmNsb3NlZFxuIiwgZW9mKTsKKwkJCVhjaGVjayh4cywgeHApOworCQkJWHB1dCh4cywgeHAsIGMpOworCQl9CisJCVhjaGVjayh4cywgeHApOworCQlYcHV0KHhzLCB4cCwgYyk7CisJfQorCVhwdXQoeHMsIHhwLCAnXDAnKTsKKwlpb3AtPmhlcmVkb2MgPSBYY2xvc2UoeHMsIHhwKTsKKworCWlmICghKGlvcC0+ZmxhZyAmIElPRVZBTCkpCisJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZS0tOworfQorCit2b2lkCit5eWVycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwkvKiBwb3AgYWxpYXNlcyBhbmQgcmUtcmVhZHMgKi8KKwl3aGlsZSAoc291cmNlLT50eXBlID09IFNBTElBUyB8fCBzb3VyY2UtPnR5cGUgPT0gU1JFUkVBRCkKKwkJc291cmNlID0gc291cmNlLT5uZXh0OworCXNvdXJjZS0+c3RyID0gbnVsbDsJLyogemFwIHBlbmRpbmcgaW5wdXQgKi8KKworCWVycm9yX3ByZWZpeCh0cnVlKTsKKwl2YV9zdGFydCh2YSwgZm10KTsKKwlzaGZfdmZwcmludGYoc2hsX291dCwgZm10LCB2YSk7CisJdmFfZW5kKHZhKTsKKwllcnJvcmZ6KCk7Cit9CisKKy8qCisgKiBpbnB1dCBmb3IgeXlsZXggd2l0aCBhbGlhcyBleHBhbnNpb24KKyAqLworCitTb3VyY2UgKgorcHVzaHMoaW50IHR5cGUsIEFyZWEgKmFyZWFwKQoreworCVNvdXJjZSAqczsKKworCXMgPSBhbGxvYyhzaXplb2YoU291cmNlKSwgYXJlYXApOworCW1lbXNldChzLCAwLCBzaXplb2YoU291cmNlKSk7CisJcy0+dHlwZSA9IHR5cGU7CisJcy0+c3RyID0gbnVsbDsKKwlzLT5hcmVhcCA9IGFyZWFwOworCWlmICh0eXBlID09IFNGSUxFIHx8IHR5cGUgPT0gU1NURElOKQorCQlYaW5pdE4ocy0+eHMsIDI1Niwgcy0+YXJlYXApOworCXJldHVybiAocyk7Cit9CisKK3N0YXRpYyBpbnQKK2dldHNjX18odm9pZCkKK3sKKwlTb3VyY2UgKnMgPSBzb3VyY2U7CisJaW50IGM7CisKKyBnZXRzY19hZ2FpbjoKKwl3aGlsZSAoKGMgPSAqcy0+c3RyKyspID09IDApIHsKKwkJcy0+c3RyID0gTlVMTDsJCS8qIHJldHVybiAwIGZvciBFT0YgYnkgZGVmYXVsdCAqLworCQlzd2l0Y2ggKHMtPnR5cGUpIHsKKwkJY2FzZSBTRU9GOgorCQkJcy0+c3RyID0gbnVsbDsKKwkJCXJldHVybiAoMCk7CisKKwkJY2FzZSBTU1RESU46CisJCWNhc2UgU0ZJTEU6CisJCQlnZXRzY19saW5lKHMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTV1NUUjoKKwkJCWJyZWFrOworCisJCWNhc2UgU1NUUklORzoKKwkJCWJyZWFrOworCisJCWNhc2UgU1dPUkRTOgorCQkJcy0+c3RhcnQgPSBzLT5zdHIgPSAqcy0+dS5zdHJ2Kys7CisJCQlzLT50eXBlID0gU1dPUkRTRVA7CisJCQlicmVhazsKKworCQljYXNlIFNXT1JEU0VQOgorCQkJaWYgKCpzLT51LnN0cnYgPT0gTlVMTCkgeworCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gIlxuIjsKKwkJCQlzLT50eXBlID0gU0VPRjsKKwkJCX0gZWxzZSB7CisJCQkJcy0+c3RhcnQgPSBzLT5zdHIgPSAiICI7CisJCQkJcy0+dHlwZSA9IFNXT1JEUzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0FMSUFTOgorCQkJaWYgKHMtPmZsYWdzICYgU0ZfQUxJQVNFTkQpIHsKKwkJCQkvKiBwYXNzIG9uIGFuIHVudXNlZCBTRl9BTElBUyBmbGFnICovCisJCQkJc291cmNlID0gcy0+bmV4dDsKKwkJCQlzb3VyY2UtPmZsYWdzIHw9IHMtPmZsYWdzICYgU0ZfQUxJQVM7CisJCQkJcyA9IHNvdXJjZTsKKwkJCX0gZWxzZSBpZiAoKnMtPnUudGJscC0+dmFsLnMgJiYKKwkJCSAgICAoYyA9IHN0cm51bChzLT51LnRibHAtPnZhbC5zKVstMV0sIGtzaF9pc3NwYWNlKGMpKSkgeworCQkJCXNvdXJjZSA9IHMgPSBzLT5uZXh0OwkvKiBwb3Agc291cmNlIHN0YWNrICovCisJCQkJLyogTm90ZSB0aGF0IHRoaXMgYWxpYXMgZW5kZWQgd2l0aCBhIHNwYWNlLAorCQkJCSAqIGVuYWJsaW5nIGFsaWFzIGV4cGFuc2lvbiBvbiB0aGUgZm9sbG93aW5nCisJCQkJICogd29yZC4KKwkJCQkgKi8KKwkJCQlzLT5mbGFncyB8PSBTRl9BTElBUzsKKwkJCX0gZWxzZSB7CisJCQkJLyogQXQgdGhpcyBwb2ludCwgd2UgbmVlZCB0byBrZWVwIHRoZSBjdXJyZW50CisJCQkJICogYWxpYXMgaW4gdGhlIHNvdXJjZSBsaXN0IHNvIHJlY3Vyc2l2ZQorCQkJCSAqIGFsaWFzZXMgY2FuIGJlIGRldGVjdGVkIGFuZCB3ZSBhbHNvIG5lZWQKKwkJCQkgKiB0byByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyLiBEbyB0aGlzCisJCQkJICogYnkgdGVtcG9yYXJpbHkgcG9wcGluZyB0aGUgYWxpYXMgdG8gZ2V0CisJCQkJICogdGhlIG5leHQgY2hhcmFjdGVyIGFuZCB0aGVuIHB1dCBpdCBiYWNrCisJCQkJICogaW4gdGhlIHNvdXJjZSBsaXN0IHdpdGggdGhlIFNGX0FMSUFTRU5ECisJCQkJICogZmxhZyBzZXQuCisJCQkJICovCisJCQkJc291cmNlID0gcy0+bmV4dDsJLyogcG9wIHNvdXJjZSBzdGFjayAqLworCQkJCXNvdXJjZS0+ZmxhZ3MgfD0gcy0+ZmxhZ3MgJiBTRl9BTElBUzsKKwkJCQljID0gZ2V0c2NfXygpOworCQkJCWlmIChjKSB7CisJCQkJCXMtPmZsYWdzIHw9IFNGX0FMSUFTRU5EOworCQkJCQlzLT51Z2J1ZlswXSA9IGM7IHMtPnVnYnVmWzFdID0gJ1wwJzsKKwkJCQkJcy0+c3RhcnQgPSBzLT5zdHIgPSBzLT51Z2J1ZjsKKwkJCQkJcy0+bmV4dCA9IHNvdXJjZTsKKwkJCQkJc291cmNlID0gczsKKwkJCQl9IGVsc2UgeworCQkJCQlzID0gc291cmNlOworCQkJCQkvKiBhdm9pZCByZWFkaW5nIGVvZiB0d2ljZSAqLworCQkJCQlzLT5zdHIgPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKworCQljYXNlIFNSRVJFQUQ6CisJCQlpZiAocy0+c3RhcnQgIT0gcy0+dWdidWYpCS8qIHl1Y2sgKi8KKwkJCQlhZnJlZShzLT51LmZyZWVtZSwgQVRFTVApOworCQkJc291cmNlID0gcyA9IHMtPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocy0+c3RyID09IE5VTEwpIHsKKwkJCXMtPnR5cGUgPSBTRU9GOworCQkJcy0+c3RhcnQgPSBzLT5zdHIgPSBudWxsOworCQkJcmV0dXJuICgnXDAnKTsKKwkJfQorCQlpZiAocy0+ZmxhZ3MgJiBTRl9FQ0hPKSB7CisJCQlzaGZfcHV0cyhzLT5zdHIsIHNobF9vdXQpOworCQkJc2hmX2ZsdXNoKHNobF9vdXQpOworCQl9CisJfQorCS8qIGNoZWNrIGZvciBVVEYtOCBieXRlIG9yZGVyIG1hcmsgKi8KKwlpZiAocy0+ZmxhZ3MgJiBTRl9GSVJTVCkgeworCQlzLT5mbGFncyAmPSB+U0ZfRklSU1Q7CisJCWlmICgoKHVuc2lnbmVkIGNoYXIpYyA9PSAweEVGKSAmJgorCQkgICAgKCgoY29uc3QgdW5zaWduZWQgY2hhciAqKShzLT5zdHIpKVswXSA9PSAweEJCKSAmJgorCQkgICAgKCgoY29uc3QgdW5zaWduZWQgY2hhciAqKShzLT5zdHIpKVsxXSA9PSAweEJGKSkgeworCQkJcy0+c3RyICs9IDI7CisJCQlVVEZNT0RFID0gMTsKKwkJCWdvdG8gZ2V0c2NfYWdhaW47CisJCX0KKwl9CisJcmV0dXJuIChjKTsKK30KKworc3RhdGljIHZvaWQKK2dldHNjX2xpbmUoU291cmNlICpzKQoreworCWNoYXIgKnhwID0gWHN0cmluZyhzLT54cywgeHApLCAqY3A7CisJYm9vbCBpbnRlcmFjdGl2ZSA9IEZsYWcoRlRBTEtJTkcpICYmIHMtPnR5cGUgPT0gU1NURElOOworCWludCBoYXZlX3R0eSA9IGludGVyYWN0aXZlICYmIChzLT5mbGFncyAmIFNGX1RUWSk7CisKKwkvKiBEb25lIGhlcmUgdG8gZW5zdXJlIG5vdGhpbmcgb2RkIGhhcHBlbnMgd2hlbiBhIHRpbWVvdXQgb2NjdXJzICovCisJWGNoZWNrTihzLT54cywgeHAsIExJTkUpOworCSp4cCA9ICdcMCc7CisJcy0+c3RhcnQgPSBzLT5zdHIgPSB4cDsKKworCWlmIChoYXZlX3R0eSAmJiBrc2hfdG1vdXQpIHsKKwkJa3NoX3Rtb3V0X3N0YXRlID0gVE1PVVRfUkVBRElORzsKKwkJYWxhcm0oa3NoX3Rtb3V0KTsKKwl9CisJaWYgKGludGVyYWN0aXZlKQorCQljaGFuZ2Vfd2luc3ooKTsKKwlpZiAoaGF2ZV90dHkgJiYgKAorI2lmICFNS1NIX1NfTk9WSQorCSAgICBGbGFnKEZWSSkgfHwKKyNlbmRpZgorCSAgICBGbGFnKEZFTUFDUykgfHwgRmxhZyhGR01BQ1MpKSkgeworCQlpbnQgbnJlYWQ7CisKKwkJbnJlYWQgPSB4X3JlYWQoeHAsIExJTkUpOworCQlpZiAobnJlYWQgPCAwKQkvKiByZWFkIGVycm9yICovCisJCQlucmVhZCA9IDA7CisJCXhwW25yZWFkXSA9ICdcMCc7CisJCXhwICs9IG5yZWFkOworCX0gZWxzZSB7CisJCWlmIChpbnRlcmFjdGl2ZSkKKwkJCXBwcm9tcHQocHJvbXB0LCAwKTsKKwkJZWxzZQorCQkJcy0+bGluZSsrOworCisJCXdoaWxlICgxKSB7CisJCQljaGFyICpwID0gc2hmX2dldHNlKHhwLCBYbmxlZnQocy0+eHMsIHhwKSwgcy0+dS5zaGYpOworCisJCQlpZiAoIXAgJiYgc2hmX2Vycm9yKHMtPnUuc2hmKSAmJgorCQkJICAgIHNoZl9lcnJubyhzLT51LnNoZikgPT0gRUlOVFIpIHsKKwkJCQlzaGZfY2xlYXJlcnIocy0+dS5zaGYpOworCQkJCWlmICh0cmFwKQorCQkJCQlydW50cmFwcygwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcCB8fCAoeHAgPSBwLCB4cFstMV0gPT0gJ1xuJykpCisJCQkJYnJlYWs7CisJCQkvKiBkb3VibGUgYnVmZmVyIHNpemUgKi8KKwkJCXhwKys7CS8qIG1vdmUgcGFzdCBOVUwgc28gZG91Ymxpbmcgd29ya3MuLi4gKi8KKwkJCVhjaGVja04ocy0+eHMsIHhwLCBYbGVuZ3RoKHMtPnhzLCB4cCkpOworCQkJeHAtLTsJLyogLi4uYW5kIG1vdmUgYmFjayBhZ2FpbiAqLworCQl9CisJCS8qIGZsdXNoIGFueSB1bndhbnRlZCBpbnB1dCBzbyBvdGhlciBwcm9ncmFtcy9idWlsdGlucworCQkgKiBjYW4gcmVhZCBpdC4gTm90IHZlcnkgb3B0aW1hbCwgYnV0IGxlc3MgZXJyb3IgcHJvbmUKKwkJICogdGhhbiBmbHVzaGluZyBlbHNlIHdoZXJlLCBkZWFsaW5nIHdpdGggcmVkaXJlY3Rpb25zLAorCQkgKiBldGMuCisJCSAqIHRvZG86IHJlZHVjZSBzaXplIG9mIHNoZiBidWZmZXIgKH4xMjg/KSBpZiBTU1RESU4KKwkJICovCisJCWlmIChzLT50eXBlID09IFNTVERJTikKKwkJCXNoZl9mbHVzaChzLT51LnNoZik7CisJfQorCS8qIFhYWDogdGVtcG9yYXJ5IGtsdWRnZSB0byByZXN0b3JlIHNvdXJjZSBhZnRlciBhCisJICogdHJhcCBtYXkgaGF2ZSBiZWVuIGV4ZWN1dGVkLgorCSAqLworCXNvdXJjZSA9IHM7CisJaWYgKGhhdmVfdHR5ICYmIGtzaF90bW91dCkgeworCQlrc2hfdG1vdXRfc3RhdGUgPSBUTU9VVF9FWEVDVVRJTkc7CisJCWFsYXJtKDApOworCX0KKwljcCA9IFhzdHJpbmcocy0+eHMsIHhwKTsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCWlmIChpbnRlcmFjdGl2ZSAmJiAqY3AgPT0gJyEnICYmIGN1cl9wcm9tcHQgPT0gUFMxKSB7CisJCWludCBsaW5lbGVuOworCisJCWxpbmVsZW4gPSBYbGVuZ3RoKHMtPnhzLCB4cCk7CisJCVhjaGVja04ocy0+eHMsIHhwLCBmY19lX24gKyAvKiBOVUwgKi8gMSk7CisJCS8qIHJlbG9hZCBhZnRlciBwb3RlbnRpYWwgcmVhbGxvYyAqLworCQljcCA9IFhzdHJpbmcocy0+eHMsIHhwKTsKKwkJLyogY2hhbmdlIGluaXRpYWwgJyEnIGludG8gc3BhY2UgKi8KKwkJKmNwID0gJyAnOworCQkvKiBOVUwgdGVybWluYXRlIHRoZSBjdXJyZW50IHN0cmluZyAqLworCQkqeHAgPSAnXDAnOworCQkvKiBtb3ZlIHRoZSBhY3R1YWwgc3RyaW5nIGZvcndhcmQgKi8KKwkJbWVtbW92ZShjcCArIGZjX2VfbiwgY3AsIGxpbmVsZW4gKyAvKiBOVUwgKi8gMSk7CisJCXhwICs9IGZjX2VfbjsKKwkJLyogcHJlcGVuZCBpdCB3aXRoICJmYyAtZSAtIiAqLworCQltZW1jcHkoY3AsIGZjX2VfLCBmY19lX24pOworCX0KKyNlbmRpZgorCXMtPnN0YXJ0ID0gcy0+c3RyID0gY3A7CisJc3RyaXBfbnVscyhYc3RyaW5nKHMtPnhzLCB4cCksIFhsZW5ndGgocy0+eHMsIHhwKSk7CisJLyogTm90ZTogaWYgaW5wdXQgaXMgYWxsIG51bGxzLCB0aGlzIGlzIG5vdCBlb2YgKi8KKwlpZiAoWGxlbmd0aChzLT54cywgeHApID09IDApIHsKKwkJLyogRU9GICovCisJCWlmIChzLT50eXBlID09IFNGSUxFKQorCQkJc2hmX2ZkY2xvc2Uocy0+dS5zaGYpOworCQlzLT5zdHIgPSBOVUxMOworCX0gZWxzZSBpZiAoaW50ZXJhY3RpdmUgJiYgKnMtPnN0ciAmJgorCSAgICAoY3VyX3Byb21wdCAhPSBQUzEgfHwgIWN0eXBlKCpzLT5zdHIsIENfSUZTIHwgQ19JRlNXUykpKSB7CisJCWhpc3RzYXZlKCZzLT5saW5lLCBzLT5zdHIsIHRydWUsIHRydWUpOworI2lmICFkZWZpbmVkKE1LU0hfU01BTEwpICYmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCisJfSBlbHNlIGlmIChpbnRlcmFjdGl2ZSAmJiBjdXJfcHJvbXB0ID09IFBTMSkgeworCQljcCA9IFhzdHJpbmcocy0+eHMsIHhwKTsKKwkJd2hpbGUgKCpjcCAmJiBjdHlwZSgqY3AsIENfSUZTV1MpKQorCQkJKytjcDsKKwkJaWYgKCEqY3ApCisJCQloaXN0c3luYygpOworI2VuZGlmCisJfQorCWlmIChpbnRlcmFjdGl2ZSkKKwkJc2V0X3Byb21wdChQUzIsIE5VTEwpOworfQorCit2b2lkCitzZXRfcHJvbXB0KGludCB0bywgU291cmNlICpzKQoreworCWN1cl9wcm9tcHQgPSB0bzsKKworCXN3aXRjaCAodG8pIHsKKwljYXNlIFBTMToJLyogY29tbWFuZCAqLworCQkvKiBTdWJzdGl0dXRlICEgYW5kICEhIGhlcmUsIGJlZm9yZSBzdWJzdGl0dXRpb25zIGFyZSBkb25lCisJCSAqIHNvICEgaW4gZXhwYW5kZWQgdmFyaWFibGVzIGFyZSBub3QgZXhwYW5kZWQuCisJCSAqIE5PVEU6IHRoaXMgaXMgbm90IHdoYXQgQVQmVCBrc2ggZG9lcyAoaXQgZG9lcyBpdCBhZnRlcgorCQkgKiBzdWJzdGl0dXRpb25zLCBQT1NJWCBkb2Vzbid0IHNheSB3aGljaCBpcyB0byBiZSBkb25lLgorCQkgKi8KKwkJeworCQkJc3RydWN0IHNoZiAqc2hmOworCQkJY2hhciAqIHZvbGF0aWxlIHBzMTsKKwkJCUFyZWEgKnNhdmVkX2F0ZW1wOworCisJCQlwczEgPSBzdHJfdmFsKGdsb2JhbCgiUFMxIikpOworCQkJc2hmID0gc2hmX3NvcGVuKE5VTEwsIHN0cmxlbihwczEpICogMiwKKwkJCSAgICBTSEZfV1IgfCBTSEZfRFlOQU1JQywgTlVMTCk7CisJCQl3aGlsZSAoKnBzMSkKKwkJCQlpZiAoKnBzMSAhPSAnIScgfHwgKisrcHMxID09ICchJykKKwkJCQkJc2hmX3B1dGNoYXIoKnBzMSsrLCBzaGYpOworCQkJCWVsc2UKKwkJCQkJc2hmX2ZwcmludGYoc2hmLCAiJWQiLAorCQkJCQkJcyA/IHMtPmxpbmUgKyAxIDogMCk7CisJCQlwczEgPSBzaGZfc2Nsb3NlKHNoZik7CisJCQlzYXZlZF9hdGVtcCA9IEFURU1QOworCQkJbmV3ZW52KEVfRVJSSCk7CisJCQlpZiAoc2lnc2V0am1wKGUtPmpidWYsIDApKSB7CisJCQkJcHJvbXB0ID0gc2FmZV9wcm9tcHQ7CisJCQkJLyogRG9uJ3QgcHJpbnQgYW4gZXJyb3IgLSBhc3N1bWUgaXQgaGFzIGFscmVhZHkKKwkJCQkgKiBiZWVuIHByaW50ZWQuIFJlYXNvbiBpcyB3ZSBtYXkgaGF2ZSBmb3JrZWQKKwkJCQkgKiB0byBydW4gYSBjb21tYW5kIGFuZCB0aGUgY2hpbGQgbWF5IGJlCisJCQkJICogdW53aW5kaW5nIGl0cyBzdGFjayB0aHJvdWdoIHRoaXMgY29kZSBhcyBpdAorCQkJCSAqIGV4aXRzLgorCQkJCSAqLworCQkJfSBlbHNlIHsKKwkJCQljaGFyICpjcCA9IHN1YnN0aXR1dGUocHMxLCAwKTsKKwkJCQlzdHJkdXB4KHByb21wdCwgY3AsIHNhdmVkX2F0ZW1wKTsKKwkJCX0KKwkJCXF1aXRlbnYoTlVMTCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQUzI6CS8qIGNvbW1hbmQgY29udGludWF0aW9uICovCisJCXByb21wdCA9IHN0cl92YWwoZ2xvYmFsKCJQUzIiKSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludAorZG9wcHJvbXB0KGNvbnN0IGNoYXIgKmNwLCBpbnQgbnRydW5jYXRlLCBib29sIGRvcHJpbnQpCit7CisJaW50IGNvbHVtbnMgPSAwLCBsaW5lcyA9IDAsIGluZGVsaW1pdCA9IDA7CisJY2hhciBkZWxpbWl0ZXIgPSAwOworCisJLyogVW5kb2N1bWVudGVkIEFUJlQga3NoIGZlYXR1cmU6CisJICogSWYgdGhlIHNlY29uZCBjaGFyIGluIHRoZSBwcm9tcHQgc3RyaW5nIGlzIFxyIHRoZW4gdGhlIGZpcnN0IGNoYXIKKwkgKiBpcyB0YWtlbiB0byBiZSBhIG5vbi1wcmludGluZyBkZWxpbWl0ZXIgYW5kIGFueSBjaGFycyBiZXR3ZWVuIHR3bworCSAqIGluc3RhbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGFyZSBub3QgY29uc2lkZXJlZCB0byBiZSBwYXJ0IG9mIHRoZQorCSAqIHByb21wdCBsZW5ndGgKKwkgKi8KKwlpZiAoKmNwICYmIGNwWzFdID09ICdccicpIHsKKwkJZGVsaW1pdGVyID0gKmNwOworCQljcCArPSAyOworCX0KKwlmb3IgKDsgKmNwOyBjcCsrKSB7CisJCWlmIChpbmRlbGltaXQgJiYgKmNwICE9IGRlbGltaXRlcikKKwkJCTsKKwkJZWxzZSBpZiAoKmNwID09ICdcbicgfHwgKmNwID09ICdccicpIHsKKwkJCWxpbmVzICs9IGNvbHVtbnMgLyB4X2NvbHMgKyAoKCpjcCA9PSAnXG4nKSA/IDEgOiAwKTsKKwkJCWNvbHVtbnMgPSAwOworCQl9IGVsc2UgaWYgKCpjcCA9PSAnXHQnKSB7CisJCQljb2x1bW5zID0gKGNvbHVtbnMgfCA3KSArIDE7CisJCX0gZWxzZSBpZiAoKmNwID09ICdcYicpIHsKKwkJCWlmIChjb2x1bW5zID4gMCkKKwkJCQljb2x1bW5zLS07CisJCX0gZWxzZSBpZiAoKmNwID09IGRlbGltaXRlcikKKwkJCWluZGVsaW1pdCA9ICFpbmRlbGltaXQ7CisJCWVsc2UgaWYgKFVURk1PREUgJiYgKCh1bnNpZ25lZCBjaGFyKSpjcCA+IDB4N0YpKSB7CisJCQljb25zdCBjaGFyICpjcDI7CisJCQljb2x1bW5zICs9IHV0Zl93aWR0aGFkaihjcCwgJmNwMik7CisJCQlpZiAoZG9wcmludCAmJiAoaW5kZWxpbWl0IHx8CisJCQkgICAgKG50cnVuY2F0ZSA8ICh4X2NvbHMgKiBsaW5lcyArIGNvbHVtbnMpKSkpCisJCQkJc2hmX3dyaXRlKGNwLCBjcDIgLSBjcCwgc2hsX291dCk7CisJCQljcCA9IGNwMiAtIC8qIGxvb3AgaW5jcmVtZW50ICovIDE7CisJCQljb250aW51ZTsKKwkJfSBlbHNlCisJCQljb2x1bW5zKys7CisJCWlmIChkb3ByaW50ICYmICgqY3AgIT0gZGVsaW1pdGVyKSAmJgorCQkgICAgKGluZGVsaW1pdCB8fCAobnRydW5jYXRlIDwgKHhfY29scyAqIGxpbmVzICsgY29sdW1ucykpKSkKKwkJCXNoZl9wdXRjKCpjcCwgc2hsX291dCk7CisJfQorCWlmIChkb3ByaW50KQorCQlzaGZfZmx1c2goc2hsX291dCk7CisJcmV0dXJuICh4X2NvbHMgKiBsaW5lcyArIGNvbHVtbnMpOworfQorCisKK3ZvaWQKK3Bwcm9tcHQoY29uc3QgY2hhciAqY3AsIGludCBudHJ1bmNhdGUpCit7CisJZG9wcHJvbXB0KGNwLCBudHJ1bmNhdGUsIHRydWUpOworfQorCitpbnQKK3Byb21wdGxlbihjb25zdCBjaGFyICpjcCkKK3sKKwlyZXR1cm4gKGRvcHByb21wdChjcCwgMCwgZmFsc2UpKTsKK30KKworLyogUmVhZCB0aGUgdmFyaWFibGUgcGFydCBvZiBhICR7Li4ufSBleHByZXNzaW9uIChpZSwgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcKKyAqIHRoZSA6Wy0rPz0jJV0gb3IgY2xvc2UtYnJhY2UuCisgKi8KK3N0YXRpYyBjaGFyICoKK2dldF9icmFjZV92YXIoWFN0cmluZyAqd3NwLCBjaGFyICp3cCkKK3sKKwllbnVtIHBhcnNlX3N0YXRlIHsKKwkJUFNfSU5JVElBTCwgUFNfU0FXX0hBU0gsIFBTX0lERU5ULAorCQlQU19OVU1CRVIsIFBTX1ZBUjEKKwl9IHN0YXRlOworCWNoYXIgYzsKKworCXN0YXRlID0gUFNfSU5JVElBTDsKKwl3aGlsZSAoMSkgeworCQljID0gZ2V0c2MoKTsKKwkJLyogU3RhdGUgbWFjaGluZSB0byBmaWd1cmUgb3V0IHdoZXJlIHRoZSB2YXJpYWJsZSBwYXJ0IGVuZHMuICovCisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBQU19JTklUSUFMOgorCQkJaWYgKGMgPT0gJyMnIHx8IGMgPT0gJyEnIHx8IGMgPT0gJyUnKSB7CisJCQkJc3RhdGUgPSBQU19TQVdfSEFTSDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgUFNfU0FXX0hBU0g6CisJCQlpZiAoa3NoX2lzYWxwaHgoYykpCisJCQkJc3RhdGUgPSBQU19JREVOVDsKKwkJCWVsc2UgaWYgKGtzaF9pc2RpZ2l0KGMpKQorCQkJCXN0YXRlID0gUFNfTlVNQkVSOworCQkJZWxzZSBpZiAoY3R5cGUoYywgQ19WQVIxKSkKKwkJCQlzdGF0ZSA9IFBTX1ZBUjE7CisJCQllbHNlCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJY2FzZSBQU19JREVOVDoKKwkJCWlmICgha3NoX2lzYWxudXgoYykpIHsKKwkJCQlpZiAoYyA9PSAnWycpIHsKKwkJCQkJY2hhciAqdG1wLCAqcDsKKworCQkJCQlpZiAoIWFycmF5c3ViKCZ0bXApKQorCQkJCQkJeXllcnJvcigibWlzc2luZyBdXG4iKTsKKwkJCQkJKndwKysgPSBjOworCQkJCQlmb3IgKHAgPSB0bXA7ICpwOyApIHsKKwkJCQkJCVhjaGVjaygqd3NwLCB3cCk7CisJCQkJCQkqd3ArKyA9ICpwKys7CisJCQkJCX0KKwkJCQkJYWZyZWUodG1wLCBBVEVNUCk7CisJCQkJCWMgPSBnZXRzYygpOwkvKiB0aGUgXSAqLworCQkJCX0KKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBTX05VTUJFUjoKKwkJCWlmICgha3NoX2lzZGlnaXQoYykpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJY2FzZSBQU19WQVIxOgorCQkJZ290byBvdXQ7CisJCX0KKwkJWGNoZWNrKCp3c3AsIHdwKTsKKwkJKndwKysgPSBjOworCX0KKyBvdXQ6CisJKndwKysgPSAnXDAnOwkvKiBlbmQgb2YgdmFyaWFibGUgcGFydCAqLworCXVuZ2V0c2MoYyk7CisJcmV0dXJuICh3cCk7Cit9CisKKy8qCisgKiBTYXZlIGFuIGFycmF5IHN1YnNjcmlwdCAtIHJldHVybnMgdHJ1ZSBpZiBtYXRjaGluZyBicmFja2V0IGZvdW5kLCBmYWxzZQorICogaWYgZW9mIG9yIG5ld2xpbmUgd2FzIGZvdW5kLgorICogKFJldHVybmVkIHN0cmluZyBkb3VibGUgbnVsbCB0ZXJtaW5hdGVkKQorICovCitzdGF0aWMgaW50CithcnJheXN1YihjaGFyICoqc3RycCkKK3sKKwlYU3RyaW5nIHdzOworCWNoYXIJKndwOworCWNoYXIJYzsKKwlpbnQJZGVwdGggPSAxOwkvKiB3ZSBhcmUganVzdCBwYXN0IHRoZSBpbml0aWFsIFsgKi8KKworCVhpbml0KHdzLCB3cCwgMzIsIEFURU1QKTsKKworCWRvIHsKKwkJYyA9IGdldHNjKCk7CisJCVhjaGVjayh3cywgd3ApOworCQkqd3ArKyA9IGM7CisJCWlmIChjID09ICdbJykKKwkJCWRlcHRoKys7CisJCWVsc2UgaWYgKGMgPT0gJ10nKQorCQkJZGVwdGgtLTsKKwl9IHdoaWxlIChkZXB0aCA+IDAgJiYgYyAmJiBjICE9ICdcbicpOworCisJKndwKysgPSAnXDAnOworCSpzdHJwID0gWGNsb3NlKHdzLCB3cCk7CisKKwlyZXR1cm4gKGRlcHRoID09IDAgPyAxIDogMCk7Cit9CisKKy8qIFVuZ2V0IGEgY2hhcjogaGFuZGxlcyBjYXNlIHdoZW4gd2UgYXJlIGFscmVhZHkgYXQgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK3VuZ2V0c2MoaW50IGMpCit7CisJaWYgKGJhY2tzbGFzaF9za2lwKQorCQliYWNrc2xhc2hfc2tpcC0tOworCS8qIERvbid0IHVuZ2V0IGVvZi4uLiAqLworCWlmIChzb3VyY2UtPnN0ciA9PSBudWxsICYmIGMgPT0gJ1wwJykKKwkJcmV0dXJuIChzb3VyY2UtPnN0cik7CisJaWYgKHNvdXJjZS0+c3RyID4gc291cmNlLT5zdGFydCkKKwkJc291cmNlLT5zdHItLTsKKwllbHNlIHsKKwkJU291cmNlICpzOworCisJCXMgPSBwdXNocyhTUkVSRUFELCBzb3VyY2UtPmFyZWFwKTsKKwkJcy0+dWdidWZbMF0gPSBjOyBzLT51Z2J1ZlsxXSA9ICdcMCc7CisJCXMtPnN0YXJ0ID0gcy0+c3RyID0gcy0+dWdidWY7CisJCXMtPm5leHQgPSBzb3VyY2U7CisJCXNvdXJjZSA9IHM7CisJfQorCXJldHVybiAoc291cmNlLT5zdHIpOworfQorCisKKy8qIENhbGxlZCB0byBnZXQgYSBjaGFyIHRoYXQgaXNuJ3QgYSBcbmV3bGluZSBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBpbnQKK2dldHNjX2JuKHZvaWQpCit7CisJaW50IGMsIGMyOworCisJaWYgKGlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSkKKwkJcmV0dXJuIChnZXRzY18oKSk7CisKKwlpZiAoYmFja3NsYXNoX3NraXAgPT0gMSkgeworCQliYWNrc2xhc2hfc2tpcCA9IDI7CisJCXJldHVybiAoZ2V0c2NfKCkpOworCX0KKworCWJhY2tzbGFzaF9za2lwID0gMDsKKworCXdoaWxlICgxKSB7CisJCWMgPSBnZXRzY18oKTsKKwkJaWYgKGMgPT0gJ1xcJykgeworCQkJaWYgKChjMiA9IGdldHNjXygpKSA9PSAnXG4nKQorCQkJCS8qIGlnbm9yZSB0aGUgXG5ld2xpbmU7IGdldCB0aGUgbmV4dCBjaGFyLi4uICovCisJCQkJY29udGludWU7CisJCQl1bmdldHNjKGMyKTsKKwkJCWJhY2tzbGFzaF9za2lwID0gMTsKKwkJfQorCQlyZXR1cm4gKGMpOworCX0KK30KKworc3RhdGljIExleF9zdGF0ZSAqCitwdXNoX3N0YXRlXyhTdGF0ZV9pbmZvICpzaSwgTGV4X3N0YXRlICpvbGRfZW5kKQoreworCUxleF9zdGF0ZSAqbmV3cyA9IGFsbG9jKFNUQVRFX0JTSVpFICogc2l6ZW9mKExleF9zdGF0ZSksIEFURU1QKTsKKworCW5ld3NbMF0ubHNfaW5mby5iYXNlID0gb2xkX2VuZDsKKwlzaS0+YmFzZSA9ICZuZXdzWzBdOworCXNpLT5lbmQgPSAmbmV3c1tTVEFURV9CU0laRV07CisJcmV0dXJuICgmbmV3c1sxXSk7Cit9CisKK3N0YXRpYyBMZXhfc3RhdGUgKgorcG9wX3N0YXRlXyhTdGF0ZV9pbmZvICpzaSwgTGV4X3N0YXRlICpvbGRfZW5kKQoreworCUxleF9zdGF0ZSAqb2xkX2Jhc2UgPSBzaS0+YmFzZTsKKworCXNpLT5iYXNlID0gb2xkX2VuZC0+bHNfaW5mby5iYXNlIC0gU1RBVEVfQlNJWkU7CisJc2ktPmVuZCA9IG9sZF9lbmQtPmxzX2luZm8uYmFzZTsKKworCWFmcmVlKG9sZF9iYXNlLCBBVEVNUCk7CisKKwlyZXR1cm4gKHNpLT5iYXNlICsgU1RBVEVfQlNJWkUgLSAxKTsKK30KKworc3RhdGljIGludAorc19nZXQodm9pZCkKK3sKKwlyZXR1cm4gKGdldHNjKCkpOworfQorCitzdGF0aWMgdm9pZAorc19wdXQoaW50IGMpCit7CisJdW5nZXRzYyhjKTsKK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL21haW4uYyBiL21rc2gvc3JjL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzdkNGExCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvbWFpbi5jCkBAIC0wLDAgKzEsMTQ4MCBAQAorLyoJJE9wZW5CU0Q6IG1haW4uYyx2IDEuNDYgMjAxMC8wNS8xOSAxNzozNjowOCBqYXNwZXIgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiB0dHkuYyx2IDEuOSAyMDA2LzAzLzE0IDIyOjA4OjAxIGRlcmFhZHQgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBpby5jLHYgMS4yMiAyMDA2LzAzLzE3IDE2OjMwOjEzIG1pbGxlcnQgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiB0YWJsZS5jLHYgMS4xMyAyMDA5LzAxLzE3IDIyOjA2OjQ0IG1pbGxlcnQgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNkZWZpbmUJRVhURVJOCisjaW5jbHVkZSAic2guaCIKKworI2lmIEhBVkVfTEFOR0lORk9fQ09ERVNFVAorI2luY2x1ZGUgPGxhbmdpbmZvLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NFVExPQ0FMRV9DVFlQRQorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL21haW4uYyx2IDEuMTY3IDIwMTAvMDcvMDQgMTc6NDU6MTUgdGcgRXhwICQiKTsKKworZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworCisjaWYgIUhBVkVfU0VUUkVTVUdJRAorZXh0ZXJuIHVpZF90IGtzaHVpZDsKK2V4dGVybiBnaWRfdCBrc2hnaWQsIGtzaGVnaWQ7CisjZW5kaWYKKworI2lmbmRlZiBNS1NIUkNfUEFUSAorI2RlZmluZSBNS1NIUkNfUEFUSAkifi8ubWtzaHJjIgorI2VuZGlmCisKKyNpZm5kZWYgTUtTSF9ERUZBVUxUX1RNUERJUgorI2RlZmluZSBNS1NIX0RFRkFVTFRfVE1QRElSCSIvdG1wIgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJlY2xhaW0odm9pZCk7CitzdGF0aWMgdm9pZCByZW1vdmVfdGVtcHMoc3RydWN0IHRlbXAgKik7Cit2b2lkIGNodnRfcmVpbml0KHZvaWQpOworU291cmNlICpta3NoX2luaXQoaW50LCBjb25zdCBjaGFyICpbXSk7CisjaWZkZWYgU0lHV0lOQ0gKK3N0YXRpYyB2b2lkIHhfc2lnd2luY2goaW50KTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBpbml0aWZzW10gPSAiSUZTPSBcdFxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgaW5pdHN1YnNbXSA9CisgICAgIiR7UFMyPT4gfSAke1BTMz0jPyB9ICR7UFM0PSsgfSAke1NFQ09ORFM9MH0gJHtUTU9VVD0wfSI7CisKK3N0YXRpYyBjb25zdCBjaGFyICppbml0Y29tc1tdID0geworCVRfdHlwZXNldCwgIi1yIiwgaW5pdHZzbiwgTlVMTCwKKwlUX3R5cGVzZXQsICIteCIsICJIT01FIiwgIlBBVEgiLCAiUkFORE9NIiwgIlNIRUxMIiwgTlVMTCwKKwlUX3R5cGVzZXQsICItaTEwIiwgIkNPTFVNTlMiLCAiTElORVMiLCAiT1BUSU5EIiwgIlBHUlAiLCAiUFBJRCIsCisJICAgICJSQU5ET00iLCAiU0VDT05EUyIsICJUTU9VVCIsICJVU0VSX0lEIiwgTlVMTCwKKwkiYWxpYXMiLAorCSJpbnRlZ2VyPXR5cGVzZXQgLWkiLAorCVRfbG9jYWxfdHlwZXNldCwKKwkiaGFzaD1hbGlhcyAtdCIsCS8qIG5vdCAiYWxpYXMgLXQgLS0iOiBoYXNoIC1yIG5lZWRzIHRvIHdvcmsgKi8KKwkidHlwZT13aGVuY2UgLXYiLAorI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkic3RvcD1raWxsIC1TVE9QIiwKKwkic3VzcGVuZD1raWxsIC1TVE9QICQkIiwKKyNlbmRpZgorCSJhdXRvbG9hZD10eXBlc2V0IC1mdSIsCisJImZ1bmN0aW9ucz10eXBlc2V0IC1mIiwKKwkiaGlzdG9yeT1mYyAtbCIsCisJIm5hbWVyZWY9dHlwZXNldCAtbiIsCisJIm5vaHVwPW5vaHVwICIsCisJcl9mY19lXywKKwkic291cmNlPVBBVEg9JFBBVEg6LiBjb21tYW5kIC4iLAorCSJsb2dpbj1leGVjIGxvZ2luIiwKKwlOVUxMLAorCSAvKiB0aGlzIGlzIHdoYXQgQVQmVCBrc2ggc2VlbXMgdG8gdHJhY2ssIHdpdGggdGhlIGFkZGl0aW9uIG9mIGVtYWNzICovCisJImFsaWFzIiwgIi10VSIsCisJImNhdCIsICJjYyIsICJjaG1vZCIsICJjcCIsICJkYXRlIiwgImVkIiwgImVtYWNzIiwgImdyZXAiLCAibHMiLAorCSJtYWtlIiwgIm12IiwgInByIiwgInJtIiwgInNlZCIsICJzaCIsICJ2aSIsICJ3aG8iLCBOVUxMLAorCU5VTEwKK307CisKK3N0YXRpYyBpbnQgaW5pdGlvX2RvbmU7CisKK3N0cnVjdCBlbnYgKmUgPSAma3Noc3RhdGVfdi5lbnZfOworCit2b2lkCitjaHZ0X3JlaW5pdCh2b2lkKQoreworCWtzaHBpZCA9IHByb2NwaWQgPSBnZXRwaWQoKTsKKwlrc2hldWlkID0gZ2V0ZXVpZCgpOworCWtzaHBncnAgPSBnZXRwZ3JwKCk7CisJa3NocHBpZCA9IGdldHBwaWQoKTsKK30KKworU291cmNlICoKK21rc2hfaW5pdChpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQoreworCWludCBhcmdpLCBpOworCVNvdXJjZSAqczsKKwlzdHJ1Y3QgYmxvY2sgKmw7CisJdW5zaWduZWQgY2hhciByZXN0cmljdGVkLCBlcnJleGl0LCB1dGZfZmxhZzsKKwljb25zdCBjaGFyICoqd3A7CisJc3RydWN0IHRibCAqdnA7CisJc3RydWN0IHN0YXQgc19zdGRpbjsKKyNpZiAhZGVmaW5lZChfUEFUSF9ERUZQQVRIKSAmJiBkZWZpbmVkKF9DU19QQVRIKQorCXNpemVfdCBrOworCWNoYXIgKmNwOworI2VuZGlmCisKKwkvKiBkbyB0aGluZ3MgbGlrZSBnZXRwZ3JwKCkgZXQgYWwuICovCisJY2h2dF9yZWluaXQoKTsKKworCS8qIG1ha2Ugc3VyZSBhcmd2W10gaXMgc2FuZSAqLworCWlmICghKmFyZ3YpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVtcHR5X2FyZ3ZbXSA9IHsKKwkJCSJta3NoIiwgTlVMTAorCQl9OworCisJCWFyZ3YgPSBlbXB0eV9hcmd2OworCQlhcmdjID0gMTsKKwl9CisJa3NobmFtZSA9ICphcmd2OworCisJYWluaXQoJmFwZXJtKTsJCS8qIGluaXRpYWxpc2UgcGVybWFuZW50IEFyZWEgKi8KKworCS8qIHNldCB1cCBiYXNlIGVudmlyb25tZW50ICovCisJa3Noc3RhdGVfdi5lbnZfLnR5cGUgPSBFX05PTkU7CisJYWluaXQoJmtzaHN0YXRlX3YuZW52Xy5hcmVhKTsKKwluZXdibG9jaygpOwkJLyogc2V0IHVwIGdsb2JhbCBsLT52YXJzIGFuZCBsLT5mdW5zICovCisKKwkvKiBEbyB0aGlzIGZpcnN0IHNvIG91dHB1dCByb3V0aW5lcyAoZWcsIGVycm9yZiwgc2hlbGxmKSBjYW4gd29yayAqLworCWluaXRpbygpOworCisJYXJnaSA9IHBhcnNlX2FyZ3MoYXJndiwgT0ZfRklSU1RUSU1FLCBOVUxMKTsKKwlpZiAoYXJnaSA8IDApCisJCXJldHVybiAoTlVMTCk7CisKKwlpbml0dmFyKCk7CisKKwlpbml0Y3R5cGVzKCk7CisKKwlpbml0dHJhcHMoKTsKKworCWNvcHJvY19pbml0KCk7CisKKwkvKiBzZXQgdXAgdmFyaWFibGUgYW5kIGNvbW1hbmQgZGljdGlvbmFyaWVzICovCisJa3Rpbml0KCZ0YWxpYXNlcywgQVBFUk0sIDApOworCWt0aW5pdCgmYWxpYXNlcywgQVBFUk0sIDApOworI2lmbmRlZiBNS1NIX05PUFdOQU0KKwlrdGluaXQoJmhvbWVkaXJzLCBBUEVSTSwgMCk7CisjZW5kaWYKKworCS8qIGRlZmluZSBzaGVsbCBrZXl3b3JkcyAqLworCWluaXRrZXl3b3JkcygpOworCisJLyogZGVmaW5lIGJ1aWx0LWluIGNvbW1hbmRzICovCisJa3Rpbml0KCZidWlsdGlucywgQVBFUk0sCisJICAgIC8qIG11c3QgYmUgODAlIG9mIDJebiAoY3VycmVudGx5IDQ0IGJ1aWx0aW5zKSAqLyA2NCk7CisJZm9yIChpID0gMDsgbWtzaGJ1aWx0aW5zW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQlidWlsdGluKG1rc2hidWlsdGluc1tpXS5uYW1lLCBta3NoYnVpbHRpbnNbaV0uZnVuYyk7CisKKwlpbml0X2hpc3R2ZWMoKTsKKworI2lmZGVmIF9QQVRIX0RFRlBBVEgKKwlkZWZfcGF0aCA9IF9QQVRIX0RFRlBBVEg7CisjZWxzZQorI2lmZGVmIF9DU19QQVRICisJaWYgKChrID0gY29uZnN0cihfQ1NfUEFUSCwgTlVMTCwgMCkpICE9IChzaXplX3QpLTEgJiYgayA+IDAgJiYKKwkgICAgY29uZnN0cihfQ1NfUEFUSCwgY3AgPSBhbGxvYyhrICsgMSwgQVBFUk0pLCBrICsgMSkgPT0gayArIDEpCisJCWRlZl9wYXRoID0gY3A7CisJZWxzZQorI2VuZGlmCisJCS8qCisJCSAqIHRoaXMgaXMgdW5pZm9ybSBhY3Jvc3MgYWxsIE9TZXMgdW5sZXNzIGl0CisJCSAqIGJyZWFrcyBzb21ld2hlcmU7IGRvbid0IHRyeSB0byBvcHRpbWlzZSwKKwkJICogZS5nLiBhZGQgc3R1ZmYgZm9yIEludGVyaXggb3IgcmVtb3ZlIC91c3IKKwkJICogZm9yIEhVUkQsIGJlY2F1c2UgZS5nLiBEZWJpYW4gR05VL0hVUkQgaXMKKwkJICogImtlZXBpbmcgYSByZWd1bGFyIC91c3IiOyB0aGlzIGlzIHN1cHBvc2VkCisJCSAqIHRvIGJlIGEgc2FuZSAnYmFzaWMnIGRlZmF1bHQgUEFUSAorCQkgKi8KKwkJZGVmX3BhdGggPSAiL2JpbjovdXNyL2Jpbjovc2JpbjovdXNyL3NiaW4iOworI2VuZGlmCisKKwkvKiBTZXQgUEFUSCB0byBkZWZfcGF0aCAod2lsbCBzZXQgdGhlIHBhdGggZ2xvYmFsIHZhcmlhYmxlKS4KKwkgKiAoaW1wb3J0IG9mIGVudmlyb25tZW50IGJlbG93IHdpbGwgcHJvYmFibHkgY2hhbmdlIHRoaXMgc2V0dGluZykuCisJICovCisJdnAgPSBnbG9iYWwoIlBBVEgiKTsKKwkvKiBzZXRzdHIgY2FuJ3QgZmFpbCBoZXJlICovCisJc2V0c3RyKHZwLCBkZWZfcGF0aCwgS1NIX1JFVFVSTl9FUlJPUik7CisKKwkvKiBUdXJuIG9uIG5vaHVwIGJ5IGRlZmF1bHQgZm9yIG5vdyAtIHdpbGwgY2hhbmdlIHRvIG9mZgorCSAqIGJ5IGRlZmF1bHQgb25jZSBwZW9wbGUgYXJlIGF3YXJlIG9mIGl0cyBleGlzdGVuY2UKKwkgKiAoQVQmVCBrc2ggZG9lcyBub3QgaGF2ZSBhIG5vaHVwIG9wdGlvbiAtIGl0IGFsd2F5cyBzZW5kcworCSAqIHRoZSBodXApLgorCSAqLworCUZsYWcoRk5PSFVQKSA9IDE7CisKKwkvKiBUdXJuIG9uIGJyYWNlIGV4cGFuc2lvbiBieSBkZWZhdWx0LiBBVCZUIGtzaHMgdGhhdCBoYXZlCisJICogYWx0ZXJuYXRpb24gYWx3YXlzIGhhdmUgaXQgb24uCisJICovCisJRmxhZyhGQlJBQ0VFWFBBTkQpID0gMTsKKworCS8qIFNldCBlZGl0IG1vZGUgdG8gZW1hY3MgYnkgZGVmYXVsdCwgbWF5IGJlIG92ZXJyaWRkZW4KKwkgKiBieSB0aGUgZW52aXJvbm1lbnQgb3IgdGhlIHVzZXIuIEFsc28sIHdlIHdhbnQgdGFiIGNvbXBsZXRpb24KKwkgKiBvbiBpbiB2aSBieSBkZWZhdWx0LiAqLworCWNoYW5nZV9mbGFnKEZFTUFDUywgT0ZfU1BFQ0lBTCwgMSk7CisjaWYgIU1LU0hfU19OT1ZJCisJRmxhZyhGVklUQUJDT01QTEVURSkgPSAxOworI2VuZGlmCisKKyNpZmRlZiBNS1NIX0JJTlNIUkVEVUNFRAorCS8qIHNldCBGU0ggaWYgd2UncmUgY2FsbGVkIGFzIC1zaCBvciAvYmluL3NoIG9yIHNvICovCisJeworCQljb25zdCBjaGFyICpjYzsKKworCQljYyA9IGtzaG5hbWU7CisJCWkgPSAwOyBhcmdpID0gMDsKKwkJd2hpbGUgKGNjW2ldICE9ICdcMCcpCisJCQkvKiB0aGUgZm9sbG93aW5nIGxpbmUgbWF0Y2hlcyAnLScgYW5kICcvJyA7LSkgKi8KKwkJCWlmICgoY2NbaSsrXSB8IDIpID09ICcvJykKKwkJCQlhcmdpID0gaTsKKwkJaWYgKCgoY2NbYXJnaV0gfCAweDIwKSA9PSAncycpICYmICgoY2NbYXJnaSArIDFdIHwgMHgyMCkgPT0gJ2gnKSkKKwkJCWNoYW5nZV9mbGFnKEZTSCwgT0ZfRklSU1RUSU1FLCAxKTsKKwl9CisjZW5kaWYKKworCS8qIGltcG9ydCBlbnZpcm9ubWVudCAqLworCWlmIChlbnZpcm9uICE9IE5VTEwpCisJCWZvciAod3AgPSAoY29uc3QgY2hhciAqKillbnZpcm9uOyAqd3AgIT0gTlVMTDsgd3ArKykKKwkJCXR5cGVzZXQoKndwLCBJTVBPUlQgfCBFWFBPUlQsIDAsIDAsIDApOworCisJdHlwZXNldChpbml0aWZzLCAwLCAwLCAwLCAwKTsJLyogZm9yIHNlY3VyaXR5ICovCisKKwkvKiBhc3NpZ24gZGVmYXVsdCBzaGVsbCB2YXJpYWJsZSB2YWx1ZXMgKi8KKwlzdWJzdGl0dXRlKGluaXRzdWJzLCAwKTsKKworCS8qIEZpZ3VyZSBvdXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgYW5kIHNldCAkUFdEICovCisJeworCQlzdHJ1Y3Qgc3RhdCBzX3B3ZCwgc19kb3Q7CisJCXN0cnVjdCB0YmwgKnB3ZF92ID0gZ2xvYmFsKCJQV0QiKTsKKwkJY2hhciAqcHdkID0gc3RyX3ZhbChwd2Rfdik7CisJCWNoYXIgKnB3ZHggPSBwd2Q7CisKKwkJLyogVHJ5IHRvIHVzZSBleGlzdGluZyAkUFdEIGlmIGl0IGlzIHZhbGlkICovCisJCWlmIChwd2RbMF0gIT0gJy8nIHx8CisJCSAgICBzdGF0KHB3ZCwgJnNfcHdkKSA8IDAgfHwgc3RhdCgiLiIsICZzX2RvdCkgPCAwIHx8CisJCSAgICBzX3B3ZC5zdF9kZXYgIT0gc19kb3Quc3RfZGV2IHx8CisJCSAgICBzX3B3ZC5zdF9pbm8gIT0gc19kb3Quc3RfaW5vKQorCQkJcHdkeCA9IE5VTEw7CisJCXNldF9jdXJyZW50X3dkKHB3ZHgpOworCQlpZiAoY3VycmVudF93ZFswXSkKKwkJCXNpbXBsaWZ5X3BhdGgoY3VycmVudF93ZCk7CisJCS8qIE9ubHkgc2V0IHB3ZCBpZiB3ZSBrbm93IHdoZXJlIHdlIGFyZSBvciBpZiBpdCBoYWQgYQorCQkgKiBib2d1cyB2YWx1ZQorCQkgKi8KKwkJaWYgKGN1cnJlbnRfd2RbMF0gfHwgcHdkICE9IG51bGwpCisJCQkvKiBzZXRzdHIgY2FuJ3QgZmFpbCBoZXJlICovCisJCQlzZXRzdHIocHdkX3YsIGN1cnJlbnRfd2QsIEtTSF9SRVRVUk5fRVJST1IpOworCX0KKworCWZvciAod3AgPSBpbml0Y29tczsgKndwICE9IE5VTEw7IHdwKyspIHsKKwkJc2hjb21leGVjKHdwKTsKKwkJd2hpbGUgKCp3cCAhPSBOVUxMKQorCQkJd3ArKzsKKwl9CisJc2V0aW50KGdsb2JhbCgiQ09MVU1OUyIpLCAwKTsKKwlzZXRpbnQoZ2xvYmFsKCJMSU5FUyIpLCAwKTsKKwlzZXRpbnQoZ2xvYmFsKCJPUFRJTkQiKSwgMSk7CisKKwlzYWZlX3Byb21wdCA9IGtzaGV1aWQgPyAiJCAiIDogIiMgIjsKKwl2cCA9IGdsb2JhbCgiUFMxIik7CisJLyogU2V0IFBTMSBpZiB1bnNldCBvciB3ZSBhcmUgcm9vdCBhbmQgcHJvbXB0IGRvZXNuJ3QgY29udGFpbiBhICMgKi8KKwlpZiAoISh2cC0+ZmxhZyAmIElTU0VUKSB8fAorCSAgICAoIWtzaGV1aWQgJiYgIXN0cmNocihzdHJfdmFsKHZwKSwgJyMnKSkpCisJCS8qIHNldHN0ciBjYW4ndCBmYWlsIGhlcmUgKi8KKwkJc2V0c3RyKHZwLCBzYWZlX3Byb21wdCwgS1NIX1JFVFVSTl9FUlJPUik7CisJc2V0aW50KCh2cCA9IGdsb2JhbCgiUEdSUCIpKSwgKG1rc2hfdWFyaV90KWtzaHBncnApOworCXZwLT5mbGFnIHw9IElOVF9VOworCXNldGludCgodnAgPSBnbG9iYWwoIlBQSUQiKSksIChta3NoX3VhcmlfdClrc2hwcGlkKTsKKwl2cC0+ZmxhZyB8PSBJTlRfVTsKKwlzZXRpbnQoKHZwID0gZ2xvYmFsKCJSQU5ET00iKSksIChta3NoX3VhcmlfdClldmlsaGFzaChrc2huYW1lKSk7CisJdnAtPmZsYWcgfD0gSU5UX1U7CisJc2V0aW50KCh2cCA9IGdsb2JhbCgiVVNFUl9JRCIpKSwgKG1rc2hfdWFyaV90KWtzaGV1aWQpOworCXZwLT5mbGFnIHw9IElOVF9VOworCisJLyogU2V0IHRoaXMgYmVmb3JlIHBhcnNpbmcgYXJndW1lbnRzICovCisjaWYgSEFWRV9TRVRSRVNVR0lECisJRmxhZyhGUFJJVklMRUdFRCkgPSBnZXR1aWQoKSAhPSBrc2hldWlkIHx8IGdldGdpZCgpICE9IGdldGVnaWQoKTsKKyNlbHNlCisJRmxhZyhGUFJJVklMRUdFRCkgPSAoa3NodWlkID0gZ2V0dWlkKCkpICE9IGtzaGV1aWQgfHwKKwkgICAgKGtzaGdpZCA9IGdldGdpZCgpKSAhPSAoa3NoZWdpZCA9IGdldGVnaWQoKSk7CisjZW5kaWYKKworCS8qIHRoaXMgdG8gbm90ZSBpZiBtb25pdG9yIGlzIHNldCBvbiBjb21tYW5kIGxpbmUgKHNlZSBiZWxvdykgKi8KKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJRmxhZyhGTU9OSVRPUikgPSAxMjc7CisjZW5kaWYKKwkvKiB0aGlzIHRvIG5vdGUgaWYgdXRmLTggbW9kZSBpcyBzZXQgb24gY29tbWFuZCBsaW5lIChzZWUgYmVsb3cpICovCisJVVRGTU9ERSA9IDI7CisKKwlhcmdpID0gcGFyc2VfYXJncyhhcmd2LCBPRl9DTURMSU5FLCBOVUxMKTsKKwlpZiAoYXJnaSA8IDApCisJCXJldHVybiAoTlVMTCk7CisKKwkvKiBwcm9jZXNzIHRoaXMgbGF0ZXIgb25seSwgZGVmYXVsdCB0byBvZmYgKGh5c3RlcmljYWwgcmFpc2lucykgKi8KKwl1dGZfZmxhZyA9IFVURk1PREU7CisJVVRGTU9ERSA9IDA7CisKKwlpZiAoRmxhZyhGQ09NTUFORCkpIHsKKwkJcyA9IHB1c2hzKFNTVFJJTkcsIEFURU1QKTsKKwkJaWYgKCEocy0+c3RhcnQgPSBzLT5zdHIgPSBhcmd2W2FyZ2krK10pKQorCQkJZXJyb3JmKCItYyByZXF1aXJlcyBhbiBhcmd1bWVudCIpOworI2lmZGVmIE1LU0hfTUlETklHSFRCU0QwMUFTSF9DT01QQVQKKwkJLyogY29tcGF0aWJpbGl0eSB0byBNaWRuaWdodEJTRCAwLjEgL2Jpbi9zaCAoa2x1ZGdlKSAqLworCQlpZiAoRmxhZyhGU0gpICYmIGFyZ3ZbYXJnaV0gJiYgIXN0cmNtcChhcmd2W2FyZ2ldLCAiLS0iKSkKKwkJCSsrYXJnaTsKKyNlbmRpZgorCQlpZiAoYXJndlthcmdpXSkKKwkJCWtzaG5hbWUgPSBhcmd2W2FyZ2krK107CisJfSBlbHNlIGlmIChhcmdpIDwgYXJnYyAmJiAhRmxhZyhGU1RESU4pKSB7CisJCXMgPSBwdXNocyhTRklMRSwgQVRFTVApOworCQlzLT5maWxlID0gYXJndlthcmdpKytdOworCQlzLT51LnNoZiA9IHNoZl9vcGVuKHMtPmZpbGUsIE9fUkRPTkxZLCAwLAorCQkgICAgU0hGX01BUEhJIHwgU0hGX0NMRVhFQyk7CisJCWlmIChzLT51LnNoZiA9PSBOVUxMKSB7CisJCQlzaGxfc3Rkb3V0X29rID0gMDsKKwkJCXdhcm5pbmdmKHRydWUsICIlczogJXMiLCBzLT5maWxlLCBzdHJlcnJvcihlcnJubykpOworCQkJLyogbWFuZGF0ZWQgYnkgU1VTdjQgKi8KKwkJCWV4c3RhdCA9IDEyNzsKKwkJCXVud2luZChMRVJST1IpOworCQl9CisJCWtzaG5hbWUgPSBzLT5maWxlOworCX0gZWxzZSB7CisJCUZsYWcoRlNURElOKSA9IDE7CisJCXMgPSBwdXNocyhTU1RESU4sIEFURU1QKTsKKwkJcy0+ZmlsZSA9ICI8c3RkaW4+IjsKKwkJcy0+dS5zaGYgPSBzaGZfZmRvcGVuKDAsIFNIRl9SRCB8IGNhbl9zZWVrKDApLAorCQkgICAgTlVMTCk7CisJCWlmIChpc2F0dHkoMCkgJiYgaXNhdHR5KDIpKSB7CisJCQlGbGFnKEZUQUxLSU5HKSA9IEZsYWcoRlRBTEtJTkdfSSkgPSAxOworCQkJLyogVGhlIGZvbGxvd2luZyBvbmx5IGlmIGlzYXR0eSgwKSAqLworCQkJcy0+ZmxhZ3MgfD0gU0ZfVFRZOworCQkJcy0+dS5zaGYtPmZsYWdzIHw9IFNIRl9JTlRFUlJVUFQ7CisJCQlzLT5maWxlID0gTlVMTDsKKwkJfQorCX0KKworCS8qIHRoaXMgYml6YXJyZW5lc3MgaXMgbWFuZGF0ZWQgYnkgUE9TSVggKi8KKwlpZiAoZnN0YXQoMCwgJnNfc3RkaW4pID49IDAgJiYgU19JU0NIUihzX3N0ZGluLnN0X21vZGUpICYmCisJICAgIEZsYWcoRlRBTEtJTkcpKQorCQlyZXNldF9ub25ibG9jaygwKTsKKworCS8qIGluaXRpYWxpc2Ugam9iIGNvbnRyb2wgKi8KKwlqX2luaXQoKTsKKwkvKiBzZXQ6IDAvMTsgdW5zZXQ6IDItPjAgKi8KKwlVVEZNT0RFID0gdXRmX2ZsYWcgJiAxOworCS8qIERvIHRoaXMgYWZ0ZXIgal9pbml0KCksIGFzIHR0eV9mZCBpcyBub3QgaW5pdGlhbGlzZWQgdW50aWwgdGhlbiAqLworCWlmIChGbGFnKEZUQUxLSU5HKSkgeworCQlpZiAodXRmX2ZsYWcgPT0gMikgeworI2lmbmRlZiBNS1NIX0FTU1VNRV9VVEY4CisjZGVmaW5lIGlzdWMoeCkJKCgoeCkgIT0gTlVMTCkgJiYgXAorCQkgICAgKHN0cmlzdHIoKHgpLCAiVVRGLTgiKSB8fCBzdHJpc3RyKCh4KSwgInV0ZjgiKSkpCisJCS8qIENoZWNrIGlmIHdlJ3JlIGluIGEgVVRGLTggbG9jYWxlICovCisJCQljb25zdCBjaGFyICpjY3A7CisKKyNpZiBIQVZFX1NFVExPQ0FMRV9DVFlQRQorCQkJY2NwID0gc2V0bG9jYWxlKExDX0NUWVBFLCAiIik7CisjaWYgSEFWRV9MQU5HSU5GT19DT0RFU0VUCisJCQlpZiAoIWlzdWMoY2NwKSkKKwkJCQljY3AgPSBubF9sYW5naW5mbyhDT0RFU0VUKTsKKyNlbmRpZgorI2Vsc2UKKwkJCS8qIHRoZXNlIHdlcmUgaW1wb3J0ZWQgZnJvbSBlbnZpcm9uIGVhcmxpZXIgKi8KKwkJCWNjcCA9IHN0cl92YWwoZ2xvYmFsKCJMQ19BTEwiKSk7CisJCQlpZiAoY2NwID09IG51bGwpCisJCQkJY2NwID0gc3RyX3ZhbChnbG9iYWwoIkxDX0NUWVBFIikpOworCQkJaWYgKGNjcCA9PSBudWxsKQorCQkJCWNjcCA9IHN0cl92YWwoZ2xvYmFsKCJMQU5HIikpOworI2VuZGlmCisJCQlVVEZNT0RFID0gaXN1YyhjY3ApOworI3VuZGVmIGlzdWMKKyNlbGlmIE1LU0hfQVNTVU1FX1VURjgKKwkJCVVURk1PREUgPSAxOworI2Vsc2UKKwkJCVVURk1PREUgPSAwOworI2VuZGlmCisJCX0KKwkJeF9pbml0KCk7CisJfQorCisjaWZkZWYgU0lHV0lOQ0gKKwlzaWd0cmFwc1tTSUdXSU5DSF0uZmxhZ3MgfD0gVEZfU0hFTExfVVNFUzsKKwlzZXRzaWcoJnNpZ3RyYXBzW1NJR1dJTkNIXSwgeF9zaWd3aW5jaCwKKwkgICAgU1NfUkVTVE9SRV9PUklHfFNTX0ZPUkNFfFNTX1NIVFJBUCk7CisjZW5kaWYKKworCWwgPSBlLT5sb2M7CisJbC0+YXJndiA9ICZhcmd2W2FyZ2kgLSAxXTsKKwlsLT5hcmdjID0gYXJnYyAtIGFyZ2k7CisJbC0+YXJndlswXSA9IGtzaG5hbWU7CisJZ2V0b3B0c19yZXNldCgxKTsKKworCS8qIERpc2FibGUgZHVyaW5nIC5wcm9maWxlL0VOViByZWFkaW5nICovCisJcmVzdHJpY3RlZCA9IEZsYWcoRlJFU1RSSUNURUQpOworCUZsYWcoRlJFU1RSSUNURUQpID0gMDsKKwllcnJleGl0ID0gRmxhZyhGRVJSRVhJVCk7CisJRmxhZyhGRVJSRVhJVCkgPSAwOworCisJLyogRG8gdGhpcyBiZWZvcmUgcHJvZmlsZS8kRU5WIHNvIHRoYXQgaWYgaXQgY2F1c2VzIHByb2JsZW1zIGluIHRoZW0sCisJICogdXNlciB3aWxsIGtub3cgd2h5IHRoaW5ncyBicm9rZS4KKwkgKi8KKwlpZiAoIWN1cnJlbnRfd2RbMF0gJiYgRmxhZyhGVEFMS0lORykpCisJCXdhcm5pbmdmKGZhbHNlLCAiQ2Fubm90IGRldGVybWluZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7CisKKwlpZiAoRmxhZyhGTE9HSU4pKSB7CisJCWluY2x1ZGUoS1NIX1NZU1RFTV9QUk9GSUxFLCAwLCBOVUxMLCAxKTsKKwkJaWYgKCFGbGFnKEZQUklWSUxFR0VEKSkKKwkJCWluY2x1ZGUoc3Vic3RpdHV0ZSgiJEhPTUUvLnByb2ZpbGUiLCAwKSwgMCwKKwkJCSAgICBOVUxMLCAxKTsKKwl9CisJaWYgKEZsYWcoRlBSSVZJTEVHRUQpKQorCQlpbmNsdWRlKCIvZXRjL3N1aWRfcHJvZmlsZSIsIDAsIE5VTEwsIDEpOworCWVsc2UgaWYgKEZsYWcoRlRBTEtJTkcpKSB7CisJCWNoYXIgKmVudl9maWxlOworCisJCS8qIGluY2x1ZGUgJEVOViAqLworCQllbnZfZmlsZSA9IHN1YnN0aXR1dGUoc3Vic3RpdHV0ZSgiJHtFTlY6LSIgTUtTSFJDX1BBVEggIn0iLCAwKSwKKwkJICAgIERPVElMREUpOworCQlpZiAoKmVudl9maWxlICE9ICdcMCcpCisJCQlpbmNsdWRlKGVudl9maWxlLCAwLCBOVUxMLCAxKTsKKwl9CisKKwlpZiAocmVzdHJpY3RlZCkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqcmVzdHJfY29tW10gPSB7CisJCQlUX3R5cGVzZXQsICItciIsICJQQVRIIiwKKwkJCSJFTlYiLCAiU0hFTEwiLAorCQkJTlVMTAorCQl9OworCQlzaGNvbWV4ZWMocmVzdHJfY29tKTsKKwkJLyogQWZ0ZXIgdHlwZXNldCBjb21tYW5kLi4uICovCisJCUZsYWcoRlJFU1RSSUNURUQpID0gMTsKKwl9CisJRmxhZyhGRVJSRVhJVCkgPSBlcnJleGl0OworCisJaWYgKEZsYWcoRlRBTEtJTkcpKSB7CisJCWhpc3RfaW5pdChzKTsKKwkJYWxhcm1faW5pdCgpOworCX0gZWxzZQorCQlGbGFnKEZUUkFDS0FMTCkgPSAxOwkvKiBzZXQgYWZ0ZXIgRU5WICovCisKKwlyZXR1cm4gKHMpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKK3sKKwlTb3VyY2UgKnM7CisKKwlrc2hzdGF0ZV92LmxjZ19zdGF0ZV8gPSA1MzgxOworCisJaWYgKChzID0gbWtzaF9pbml0KGFyZ2MsIGFyZ3YpKSkgeworCQkvKiBwdXQgbW9yZSBlbnRyb3B5IGludG8gdGhlIExDRyAqLworCQljaGFuZ2VfcmFuZG9tKHMsIHNpemVvZigqcykpOworCQkvKiBkb2VzbuKAmXQgcmV0dXJuICovCisJCXNoZWxsKHMsIHRydWUpOworCX0KKwlyZXR1cm4gKDEpOworfQorCitpbnQKK2luY2x1ZGUoY29uc3QgY2hhciAqbmFtZSwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgaW50cl9vaykKK3sKKwlTb3VyY2UgKnZvbGF0aWxlIHMgPSBOVUxMOworCXN0cnVjdCBzaGYgKnNoZjsKKwljb25zdCBjaGFyICoqdm9sYXRpbGUgb2xkX2FyZ3Y7CisJdm9sYXRpbGUgaW50IG9sZF9hcmdjOworCWludCBpOworCisJc2hmID0gc2hmX29wZW4obmFtZSwgT19SRE9OTFksIDAsIFNIRl9NQVBISSB8IFNIRl9DTEVYRUMpOworCWlmIChzaGYgPT0gTlVMTCkKKwkJcmV0dXJuICgtMSk7CisKKwlpZiAoYXJndikgeworCQlvbGRfYXJndiA9IGUtPmxvYy0+YXJndjsKKwkJb2xkX2FyZ2MgPSBlLT5sb2MtPmFyZ2M7CisJfSBlbHNlIHsKKwkJb2xkX2FyZ3YgPSBOVUxMOworCQlvbGRfYXJnYyA9IDA7CisJfQorCW5ld2VudihFX0lOQ0wpOworCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7CisJaWYgKGkpIHsKKwkJcXVpdGVudihzID8gcy0+dS5zaGYgOiBOVUxMKTsKKwkJaWYgKG9sZF9hcmd2KSB7CisJCQllLT5sb2MtPmFyZ3YgPSBvbGRfYXJndjsKKwkJCWUtPmxvYy0+YXJnYyA9IG9sZF9hcmdjOworCQl9CisJCXN3aXRjaCAoaSkgeworCQljYXNlIExSRVRVUk46CisJCWNhc2UgTEVSUk9SOgorCQkJcmV0dXJuIChleHN0YXQgJiAweGZmKTsgLyogc2VlIGJlbG93ICovCisJCWNhc2UgTElOVFI6CisJCQkvKiBpbnRyX29rIGlzIHNldCBpZiB3ZSBhcmUgaW5jbHVkaW5nIC5wcm9maWxlIG9yICRFTlYuCisJCQkgKiBJZiB1c2VyIF5DcyBvdXQsIHdlIGRvbid0IHdhbnQgdG8ga2lsbCB0aGUgc2hlbGwuLi4KKwkJCSAqLworCQkJaWYgKGludHJfb2sgJiYgKGV4c3RhdCAtIDEyOCkgIT0gU0lHVEVSTSkKKwkJCQlyZXR1cm4gKDEpOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBMRVhJVDoKKwkJY2FzZSBMTEVBVkU6CisJCWNhc2UgTFNIRUxMOgorCQkJdW53aW5kKGkpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQlkZWZhdWx0OgorCQkJaW50ZXJuYWxfZXJyb3JmKCJpbmNsdWRlOiAlZCIsIGkpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJfQorCWlmIChhcmd2KSB7CisJCWUtPmxvYy0+YXJndiA9IGFyZ3Y7CisJCWUtPmxvYy0+YXJnYyA9IGFyZ2M7CisJfQorCXMgPSBwdXNocyhTRklMRSwgQVRFTVApOworCXMtPnUuc2hmID0gc2hmOworCXN0cmR1cHgocy0+ZmlsZSwgbmFtZSwgQVRFTVApOworCWkgPSBzaGVsbChzLCBmYWxzZSk7CisJcXVpdGVudihzLT51LnNoZik7CisJaWYgKG9sZF9hcmd2KSB7CisJCWUtPmxvYy0+YXJndiA9IG9sZF9hcmd2OworCQllLT5sb2MtPmFyZ2MgPSBvbGRfYXJnYzsKKwl9CisJcmV0dXJuIChpICYgMHhmZik7CS8qICYgMHhmZiB0byBlbnN1cmUgdmFsdWUgbm90IC0xICovCit9CisKKy8qIHNwYXduIGEgY29tbWFuZCBpbnRvIGEgc2hlbGwgb3B0aW9uYWxseSBrZWVwaW5nIHRyYWNrIG9mIHRoZSBsaW5lIG51bWJlciAqLworaW50Citjb21tYW5kKGNvbnN0IGNoYXIgKmNvbW0sIGludCBsaW5lKQoreworCVNvdXJjZSAqczsKKworCXMgPSBwdXNocyhTU1RSSU5HLCBBVEVNUCk7CisJcy0+c3RhcnQgPSBzLT5zdHIgPSBjb21tOworCXMtPmxpbmUgPSBsaW5lOworCXJldHVybiAoc2hlbGwocywgZmFsc2UpKTsKK30KKworLyoKKyAqIHJ1biB0aGUgY29tbWFuZHMgZnJvbSB0aGUgaW5wdXQgc291cmNlLCByZXR1cm5pbmcgc3RhdHVzLgorICovCitpbnQKK3NoZWxsKFNvdXJjZSAqIHZvbGF0aWxlIHMsIHZvbGF0aWxlIGludCB0b3BsZXZlbCkKK3sKKwlzdHJ1Y3Qgb3AgKnQ7CisJdm9sYXRpbGUgaW50IHdhc3R0eSA9IHMtPmZsYWdzICYgU0ZfVFRZOworCXZvbGF0aWxlIGludCBhdHRlbXB0cyA9IDEzOworCXZvbGF0aWxlIGludCBpbnRlcmFjdGl2ZSA9IEZsYWcoRlRBTEtJTkcpICYmIHRvcGxldmVsOworCVNvdXJjZSAqdm9sYXRpbGUgb2xkX3NvdXJjZSA9IHNvdXJjZTsKKwlpbnQgaTsKKworCXMtPmZsYWdzIHw9IFNGX0ZJUlNUOwkvKiBlbmFibGUgVVRGLTggQk9NIGNoZWNrICovCisKKwluZXdlbnYoRV9QQVJTRSk7CisJaWYgKGludGVyYWN0aXZlKQorCQlyZWFsbHlfZXhpdCA9IDA7CisJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKKwlpZiAoaSkgeworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSBMSU5UUjogLyogd2UgZ2V0IGhlcmUgaWYgU0lHSU5UIG5vdCBjYXVnaHQgb3IgaWdub3JlZCAqLworCQljYXNlIExFUlJPUjoKKwkJY2FzZSBMU0hFTEw6CisJCQlpZiAoaW50ZXJhY3RpdmUpIHsKKwkJCQlpZiAoaSA9PSBMSU5UUikKKwkJCQkJc2hlbGxmKCJcbiIpOworCQkJCS8qIFJlc2V0IGFueSBlb2YgdGhhdCB3YXMgcmVhZCBhcyBwYXJ0IG9mIGEKKwkJCQkgKiBtdWx0aWxpbmUgY29tbWFuZC4KKwkJCQkgKi8KKwkJCQlpZiAoRmxhZyhGSUdOT1JFRU9GKSAmJiBzLT50eXBlID09IFNFT0YgJiYKKwkJCQkgICAgd2FzdHR5KQorCQkJCQlzLT50eXBlID0gU1NURElOOworCQkJCS8qIFVzZWQgYnkgZXhpdCBjb21tYW5kIHRvIGdldCBiYWNrIHRvCisJCQkJICogdG9wIGxldmVsIHNoZWxsLiBLaW5kIG9mIHN0cmFuZ2Ugc2luY2UKKwkJCQkgKiBpbnRlcmFjdGl2ZSBpcyBzZXQgaWYgd2UgYXJlIHJlYWRpbmcgZnJvbQorCQkJCSAqIGEgdHR5LCBidXQgdG8gaGF2ZSBzdG9wcGVkIGpvYnMsIG9uZSBvbmx5CisJCQkJICogbmVlZHMgRk1PTklUT1Igc2V0IChub3QgRlRBTEtJTkcvU0ZfVFRZKS4uLgorCQkJCSAqLworCQkJCS8qIHRvc3MgYW55IGlucHV0IHdlIGhhdmUgc28gZmFyICovCisJCQkJcy0+c3RhcnQgPSBzLT5zdHIgPSBudWxsOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBMRVhJVDoKKwkJY2FzZSBMTEVBVkU6CisJCWNhc2UgTFJFVFVSTjoKKwkJCXNvdXJjZSA9IG9sZF9zb3VyY2U7CisJCQlxdWl0ZW52KE5VTEwpOworCQkJdW53aW5kKGkpOwkvKiBrZWVwIG9uIGdvaW5nICovCisJCQkvKiBOT1RSRUFDSEVEICovCisJCWRlZmF1bHQ6CisJCQlzb3VyY2UgPSBvbGRfc291cmNlOworCQkJcXVpdGVudihOVUxMKTsKKwkJCWludGVybmFsX2Vycm9yZigic2hlbGw6ICVkIiwgaSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9CisJd2hpbGUgKDEpIHsKKwkJaWYgKHRyYXApCisJCQlydW50cmFwcygwKTsKKworCQlpZiAocy0+bmV4dCA9PSBOVUxMKSB7CisJCQlpZiAoRmxhZyhGVkVSQk9TRSkpCisJCQkJcy0+ZmxhZ3MgfD0gU0ZfRUNITzsKKwkJCWVsc2UKKwkJCQlzLT5mbGFncyAmPSB+U0ZfRUNITzsKKwkJfQorCQlpZiAoaW50ZXJhY3RpdmUpIHsKKwkJCWpfbm90aWZ5KCk7CisJCQlzZXRfcHJvbXB0KFBTMSwgcyk7CisJCX0KKwkJdCA9IGNvbXBpbGUocyk7CisJCWlmICh0ICE9IE5VTEwgJiYgdC0+dHlwZSA9PSBURU9GKSB7CisJCQlpZiAod2FzdHR5ICYmIEZsYWcoRklHTk9SRUVPRikgJiYgLS1hdHRlbXB0cyA+IDApIHsKKwkJCQlzaGVsbGYoIlVzZSAnZXhpdCcgdG8gbGVhdmUga3NoXG4iKTsKKwkJCQlzLT50eXBlID0gU1NURElOOworCQkJfSBlbHNlIGlmICh3YXN0dHkgJiYgIXJlYWxseV9leGl0ICYmCisJCQkgICAgal9zdG9wcGVkX3J1bm5pbmcoKSkgeworCQkJCXJlYWxseV9leGl0ID0gMTsKKwkJCQlzLT50eXBlID0gU1NURElOOworCQkJfSBlbHNlIHsKKwkJCQkvKiB0aGlzIGZvciBQT1NJWCB3aGljaCBzYXlzIEVYSVQgdHJhcHMKKwkJCQkgKiBzaGFsbCBiZSB0YWtlbiBpbiB0aGUgZW52aXJvbm1lbnQKKwkJCQkgKiBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBjb21tYW5kCisJCQkJICogZXhlY3V0ZWQuCisJCQkJICovCisJCQkJaWYgKHRvcGxldmVsKQorCQkJCQl1bndpbmQoTEVYSVQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICh0ICYmICghRmxhZyhGTk9FWEVDKSB8fCAocy0+ZmxhZ3MgJiBTRl9UVFkpKSkKKwkJCWV4c3RhdCA9IGV4ZWN1dGUodCwgMCwgTlVMTCk7CisKKwkJaWYgKHQgIT0gTlVMTCAmJiB0LT50eXBlICE9IFRFT0YgJiYgaW50ZXJhY3RpdmUgJiYgcmVhbGx5X2V4aXQpCisJCQlyZWFsbHlfZXhpdCA9IDA7CisKKwkJcmVjbGFpbSgpOworCX0KKwlxdWl0ZW52KE5VTEwpOworCXNvdXJjZSA9IG9sZF9zb3VyY2U7CisJcmV0dXJuIChleHN0YXQpOworfQorCisvKiByZXR1cm4gdG8gY2xvc2VzdCBlcnJvciBoYW5kbGVyIG9yIHNoZWxsKCksIGV4aXQgaWYgbm9uZSBmb3VuZCAqLwordm9pZAordW53aW5kKGludCBpKQoreworCS8qIG9yZGVyaW5nIGZvciBFWElUIHZzIEVSUiBpcyBhIGJpdCBvZGQgKHRoaXMgaXMgd2hhdCBBVCZUIGtzaCBkb2VzKSAqLworCWlmIChpID09IExFWElUIHx8IChGbGFnKEZFUlJFWElUKSAmJiAoaSA9PSBMRVJST1IgfHwgaSA9PSBMSU5UUikgJiYKKwkgICAgc2lndHJhcHNbU0lHRVhJVF9dLnRyYXApKSB7CisJCXJ1bnRyYXAoJnNpZ3RyYXBzW1NJR0VYSVRfXSk7CisJCWkgPSBMTEVBVkU7CisJfSBlbHNlIGlmIChGbGFnKEZFUlJFWElUKSAmJiAoaSA9PSBMRVJST1IgfHwgaSA9PSBMSU5UUikpIHsKKwkJcnVudHJhcCgmc2lndHJhcHNbU0lHRVJSX10pOworCQlpID0gTExFQVZFOworCX0KKwl3aGlsZSAoMSkgeworCQlzd2l0Y2ggKGUtPnR5cGUpIHsKKwkJY2FzZSBFX1BBUlNFOgorCQljYXNlIEVfRlVOQzoKKwkJY2FzZSBFX0lOQ0w6CisJCWNhc2UgRV9MT09QOgorCQljYXNlIEVfRVJSSDoKKwkJCXNpZ2xvbmdqbXAoZS0+amJ1ZiwgaSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCWNhc2UgRV9OT05FOgorCQkJaWYgKGkgPT0gTElOVFIpCisJCQkJZS0+ZmxhZ3MgfD0gRUZfRkFLRV9TSUdESUU7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQlkZWZhdWx0OgorCQkJcXVpdGVudihOVUxMKTsKKwkJfQorCX0KK30KKwordm9pZAorbmV3ZW52KGludCB0eXBlKQoreworCXN0cnVjdCBlbnYgKmVwOworCWNoYXIgKmNwOworCisJLyoKKwkgKiBzdHJ1Y3QgZW52IGluY2x1ZGVzIEFMTE9DX0lURU0gZm9yIGFsaWdubWVudCBjb25zdHJhaW50cworCSAqIHNvIGZpcnN0IGdldCB0aGUgYWN0dWFsbHkgdXNlZCBtZW1vcnksIHRoZW4gYXNzaWduIGl0CisJICovCisJY3AgPSBhbGxvYyhzaXplb2Yoc3RydWN0IGVudikgLSBBTExPQ19TSVpFLCBBVEVNUCk7CisJZXAgPSAodm9pZCAqKShjcCAtIEFMTE9DX1NJWkUpOwkvKiB1bmRvIHdoYXQgYWxsb2MoKSBkaWQgKi8KKwkvKiBpbml0aWFsaXNlIHB1YmxpYyBtZW1iZXJzIG9mIHN0cnVjdCBlbnYgKG5vdCB0aGUgQUxMT0NfSVRFTSkgKi8KKwlhaW5pdCgmZXAtPmFyZWEpOworCWVwLT5vZW52ID0gZTsKKwllcC0+bG9jID0gZS0+bG9jOworCWVwLT5zYXZlZmQgPSBOVUxMOworCWVwLT50ZW1wcyA9IE5VTEw7CisJZXAtPnR5cGUgPSB0eXBlOworCWVwLT5mbGFncyA9IDA7CisJLyoganVtcCBidWZmZXIgaXMgaW52YWxpZCBiZWNhdXNlIGZsYWdzID09IDAgKi8KKwllID0gZXA7Cit9CisKK3ZvaWQKK3F1aXRlbnYoc3RydWN0IHNoZiAqc2hmKQoreworCXN0cnVjdCBlbnYgKmVwID0gZTsKKwljaGFyICpjcDsKKwlpbnQgZmQ7CisKKwlpZiAoZXAtPm9lbnYgJiYgZXAtPm9lbnYtPmxvYyAhPSBlcC0+bG9jKQorCQlwb3BibG9jaygpOworCWlmIChlcC0+c2F2ZWZkICE9IE5VTEwpIHsKKwkJZm9yIChmZCA9IDA7IGZkIDwgTlVGSUxFOyBmZCsrKQorCQkJLyogaWYgZXAtPnNhdmVmZFtmZF0gPCAwLCBtZWFucyBmZCB3YXMgY2xvc2VkICovCisJCQlpZiAoZXAtPnNhdmVmZFtmZF0pCisJCQkJcmVzdGZkKGZkLCBlcC0+c2F2ZWZkW2ZkXSk7CisJCWlmIChlcC0+c2F2ZWZkWzJdKQkvKiBDbGVhciBhbnkgd3JpdGUgZXJyb3JzICovCisJCQlzaGZfcmVvcGVuKDIsIFNIRl9XUiwgc2hsX291dCk7CisJfQorCS8qIEJvdHRvbSBvZiB0aGUgc3RhY2suCisJICogRWl0aGVyIG1haW4gc2hlbGwgaXMgZXhpdGluZyBvciBjbGVhbnVwX3BhcmVudHNfZW52KCkgd2FzIGNhbGxlZC4KKwkgKi8KKwlpZiAoZXAtPm9lbnYgPT0gTlVMTCkgeworCQlpZiAoZXAtPnR5cGUgPT0gRV9OT05FKSB7CS8qIE1haW4gc2hlbGwgZXhpdGluZz8gKi8KKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorCQkJaWYgKEZsYWcoRlRBTEtJTkcpKQorCQkJCWhpc3RfZmluaXNoKCk7CisjZW5kaWYKKwkJCWpfZXhpdCgpOworCQkJaWYgKGVwLT5mbGFncyAmIEVGX0ZBS0VfU0lHRElFKSB7CisJCQkJaW50IHNpZyA9IGV4c3RhdCAtIDEyODsKKworCQkJCS8qIGhhbSB1cCBvdXIgZGVhdGggYSBiaXQgKEFUJlQga3NoCisJCQkJICogb25seSBzZWVtcyB0byBkbyB0aGlzIGZvciBTSUdURVJNKQorCQkJCSAqIERvbid0IGRvIGl0IGZvciBTSUdRVUlULCBzaW5jZSB3ZSdkCisJCQkJICogZHVtcCBhIGNvcmUuLgorCQkJCSAqLworCQkJCWlmICgoc2lnID09IFNJR0lOVCB8fCBzaWcgPT0gU0lHVEVSTSkgJiYKKwkJCQkgICAgKGtzaHBncnAgPT0ga3NocGlkKSkgeworCQkJCQlzZXRzaWcoJnNpZ3RyYXBzW3NpZ10sIFNJR19ERkwsCisJCQkJCSAgICBTU19SRVNUT1JFX0NVUlIgfCBTU19GT1JDRSk7CisJCQkJCWtpbGwoMCwgc2lnKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHNoZikKKwkJCXNoZl9jbG9zZShzaGYpOworCQlyZWNsYWltKCk7CisJCWV4aXQoZXhzdGF0KTsKKwl9CisJaWYgKHNoZikKKwkJc2hmX2Nsb3NlKHNoZik7CisJcmVjbGFpbSgpOworCisJZSA9IGUtPm9lbnY7CisKKwkvKiBmcmVlIHRoZSBzdHJ1Y3QgZW52IC0gdHJpY2t5IGR1ZSB0byB0aGUgQUxMT0NfSVRFTSBpbnNpZGUgKi8KKwljcCA9ICh2b2lkICopZXA7CisJYWZyZWUoY3AgKyBBTExPQ19TSVpFLCBBVEVNUCk7Cit9CisKKy8qIENhbGxlZCBhZnRlciBhIGZvcmsgdG8gY2xlYW51cCBzdHVmZiBsZWZ0IG92ZXIgZnJvbSBwYXJlbnRzIGVudmlyb25tZW50ICovCit2b2lkCitjbGVhbnVwX3BhcmVudHNfZW52KHZvaWQpCit7CisJc3RydWN0IGVudiAqZXA7CisJaW50IGZkOworCisJbWtzc2VydChlICE9IE5VTEwpOworCisJLyoKKwkgKiBEb24ndCBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMgLSBwYXJlbnQgd2lsbCBwcm9iYWJseSBuZWVkIHRoZW0uCisJICogQWxzbywgY2FuJ3QgZWFzaWx5IHJlY2xhaW0gbWVtb3J5IHNpbmNlIHZhcmlhYmxlcywgZXRjLiBjb3VsZCBiZQorCSAqIGFueXdoZXJlLgorCSAqLworCisJLyogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgaGlkaW5nIGluIHNhdmVmZCAqLworCWZvciAoZXAgPSBlOyBlcDsgZXAgPSBlcC0+b2VudikgeworCQlpZiAoZXAtPnNhdmVmZCkgeworCQkJZm9yIChmZCA9IDA7IGZkIDwgTlVGSUxFOyBmZCsrKQorCQkJCWlmIChlcC0+c2F2ZWZkW2ZkXSA+IDApCisJCQkJCWNsb3NlKGVwLT5zYXZlZmRbZmRdKTsKKwkJCWFmcmVlKGVwLT5zYXZlZmQsICZlcC0+YXJlYSk7CisJCQllcC0+c2F2ZWZkID0gTlVMTDsKKwkJfQorCX0KKwllLT5vZW52ID0gTlVMTDsKK30KKworLyogQ2FsbGVkIGp1c3QgYmVmb3JlIGFuIGV4ZWN2ZSBjbGVhbnVwIHN0dWZmIHRlbXBvcmFyeSBmaWxlcyAqLwordm9pZAorY2xlYW51cF9wcm9jX2Vudih2b2lkKQoreworCXN0cnVjdCBlbnYgKmVwOworCisJZm9yIChlcCA9IGU7IGVwOyBlcCA9IGVwLT5vZW52KQorCQlyZW1vdmVfdGVtcHMoZXAtPnRlbXBzKTsKK30KKworLyogcmVtb3ZlIHRlbXAgZmlsZXMgYW5kIGZyZWUgQVRFTVAgQXJlYSAqLworc3RhdGljIHZvaWQKK3JlY2xhaW0odm9pZCkKK3sKKwlyZW1vdmVfdGVtcHMoZS0+dGVtcHMpOworCWUtPnRlbXBzID0gTlVMTDsKKwlhZnJlZWFsbCgmZS0+YXJlYSk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfdGVtcHMoc3RydWN0IHRlbXAgKnRwKQoreworCWZvciAoOyB0cCAhPSBOVUxMOyB0cCA9IHRwLT5uZXh0KQorCQlpZiAodHAtPnBpZCA9PSBwcm9jcGlkKQorCQkJdW5saW5rKHRwLT5uYW1lKTsKK30KKworLyogSW5pdGlhbGlzZSB0dHlfZmQuIFVzZWQgZm9yIHNhdmluZy9yZXNldGluZyB0dHkgbW9kZXMgdXBvbgorICogZm9yZWdyb3VuZCBqb2IgY29tcGxldGlvbiBhbmQgZm9yIHNldHRpbmcgdXAgdHR5IHByb2Nlc3MgZ3JvdXAuCisgKi8KK3ZvaWQKK3R0eV9pbml0KGJvb2wgaW5pdF90dHlzdGF0ZSwgYm9vbCBuZWVkX3R0eSkKK3sKKwlib29sIGRvX2Nsb3NlID0gdHJ1ZTsKKwlpbnQgdGZkOworCisJaWYgKHR0eV9mZCA+PSAwKSB7CisJCWNsb3NlKHR0eV9mZCk7CisJCXR0eV9mZCA9IC0xOworCX0KKwl0dHlfZGV2dHR5ID0gMTsKKworI2lmZGVmIF9VV0lOCisJLyogWFhYIGltYWtlIHN0eWxlICovCisJaWYgKGlzYXR0eSgzKSkKKwkJdGZkID0gMzsKKwllbHNlCisjZW5kaWYKKwlpZiAoKHRmZCA9IG9wZW4oIi9kZXYvdHR5IiwgT19SRFdSLCAwKSkgPCAwKSB7CisJCXR0eV9kZXZ0dHkgPSAwOworCQlpZiAobmVlZF90dHkpCisJCQl3YXJuaW5nZihmYWxzZSwKKwkJCSAgICAiTm8gY29udHJvbGxpbmcgdHR5IChvcGVuIC9kZXYvdHR5OiAlcykiLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJfQorCWlmICh0ZmQgPCAwKSB7CisJCWRvX2Nsb3NlID0gZmFsc2U7CisJCWlmIChpc2F0dHkoMCkpCisJCQl0ZmQgPSAwOworCQllbHNlIGlmIChpc2F0dHkoMikpCisJCQl0ZmQgPSAyOworCQllbHNlIHsKKwkJCWlmIChuZWVkX3R0eSkKKwkJCQl3YXJuaW5nZihmYWxzZSwKKwkJCQkgICAgIkNhbid0IGZpbmQgdHR5IGZpbGUgZGVzY3JpcHRvciIpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmICgodHR5X2ZkID0gZmNudGwodGZkLCBGX0RVUEZELCBGREJBU0UpKSA8IDApIHsKKwkJaWYgKG5lZWRfdHR5KQorCQkJd2FybmluZ2YoZmFsc2UsICJqX3R0eWluaXQ6IGR1cCBvZiB0dHkgZmQgZmFpbGVkOiAlcyIsCisJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwl9IGVsc2UgaWYgKGZjbnRsKHR0eV9mZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQykgPCAwKSB7CisJCWlmIChuZWVkX3R0eSkKKwkJCXdhcm5pbmdmKGZhbHNlLAorCQkJICAgICJqX3R0eWluaXQ6IGNhbid0IHNldCBjbG9zZS1vbi1leGVjIGZsYWc6ICVzIiwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQljbG9zZSh0dHlfZmQpOworCQl0dHlfZmQgPSAtMTsKKwl9IGVsc2UgaWYgKGluaXRfdHR5c3RhdGUpCisJCXRjZ2V0YXR0cih0dHlfZmQsICZ0dHlfc3RhdGUpOworCWlmIChkb19jbG9zZSkKKwkJY2xvc2UodGZkKTsKK30KKwordm9pZAordHR5X2Nsb3NlKHZvaWQpCit7CisJaWYgKHR0eV9mZCA+PSAwKSB7CisJCWNsb3NlKHR0eV9mZCk7CisJCXR0eV9mZCA9IC0xOworCX0KK30KKworLyogQSBzaGVsbCBlcnJvciBvY2N1cnJlZCAoZWcsIHN5bnRheCBlcnJvciwgZXRjLikgKi8KK3ZvaWQKK2Vycm9yZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJc2hsX3N0ZG91dF9vayA9IDA7CS8qIGRlYnVnZ2luZzogbm90ZSB0aGF0IHN0ZG91dCBub3QgdmFsaWQgKi8KKwlleHN0YXQgPSAxOworCWlmICgqZm10ICE9IDEpIHsKKwkJZXJyb3JfcHJlZml4KHRydWUpOworCQl2YV9zdGFydCh2YSwgZm10KTsKKwkJc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgdmEpOworCQl2YV9lbmQodmEpOworCQlzaGZfcHV0Y2hhcignXG4nLCBzaGxfb3V0KTsKKwl9CisJc2hmX2ZsdXNoKHNobF9vdXQpOworCXVud2luZChMRVJST1IpOworfQorCisvKiBsaWtlIGVycm9yZigpLCBidXQgbm8gdW53aW5kIGlzIGRvbmUgKi8KK3ZvaWQKK3dhcm5pbmdmKGJvb2wgZmlsZWxpbmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwllcnJvcl9wcmVmaXgoZmlsZWxpbmUpOworCXZhX3N0YXJ0KHZhLCBmbXQpOworCXNoZl92ZnByaW50ZihzaGxfb3V0LCBmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworCXNoZl9wdXRjaGFyKCdcbicsIHNobF9vdXQpOworCXNoZl9mbHVzaChzaGxfb3V0KTsKK30KKworLyogVXNlZCBieSBidWlsdC1pbiB1dGlsaXRpZXMgdG8gcHJlZml4IHNoZWxsIGFuZCB1dGlsaXR5IG5hbWUgdG8gbWVzc2FnZQorICogKGFsc28gdW53aW5kcyBlbnZpcm9ubWVudHMgZm9yIHNwZWNpYWwgYnVpbHRpbnMpLgorICovCit2b2lkCitiaV9lcnJvcmYoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCXNobF9zdGRvdXRfb2sgPSAwOwkvKiBkZWJ1Z2dpbmc6IG5vdGUgdGhhdCBzdGRvdXQgbm90IHZhbGlkICovCisJZXhzdGF0ID0gMTsKKwlpZiAoKmZtdCAhPSAxKSB7CisJCWVycm9yX3ByZWZpeCh0cnVlKTsKKwkJLyogbm90IHNldCB3aGVuIG1haW4oKSBjYWxscyBwYXJzZV9hcmdzKCkgKi8KKwkJaWYgKGJ1aWx0aW5fYXJndjApCisJCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiJXM6ICIsIGJ1aWx0aW5fYXJndjApOworCQl2YV9zdGFydCh2YSwgZm10KTsKKwkJc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgdmEpOworCQl2YV9lbmQodmEpOworCQlzaGZfcHV0Y2hhcignXG4nLCBzaGxfb3V0KTsKKwl9CisJc2hmX2ZsdXNoKHNobF9vdXQpOworCS8qIFBPU0lYIHNwZWNpYWwgYnVpbHRpbnMgYW5kIGtzaCBzcGVjaWFsIGJ1aWx0aW5zIGNhdXNlCisJICogbm9uLWludGVyYWN0aXZlIHNoZWxscyB0byBleGl0LgorCSAqIFhYWCBvZGQgdXNlIG9mIEtFRVBBU047IGFsc28gbWF5IG5vdCB3YW50IExFUlJPUiBoZXJlCisJICovCisJaWYgKGJ1aWx0aW5fZmxhZyAmIFNQRUNfQkkpIHsKKwkJYnVpbHRpbl9hcmd2MCA9IE5VTEw7CisJCXVud2luZChMRVJST1IpOworCX0KK30KKworLyogQ2FsbGVkIHdoZW4gc29tZXRoaW5nIHRoYXQgc2hvdWxkbid0IGhhcHBlbiBkb2VzICovCit2b2lkCitpbnRlcm5hbF92ZXJyb3JmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKwlzaGZfZnByaW50ZihzaGxfb3V0LCAiaW50ZXJuYWwgZXJyb3I6ICIpOworCXNoZl92ZnByaW50ZihzaGxfb3V0LCBmbXQsIGFwKTsKKwlzaGZfcHV0Y2hhcignXG4nLCBzaGxfb3V0KTsKKwlzaGZfZmx1c2goc2hsX291dCk7Cit9CisKK3ZvaWQKK2ludGVybmFsX2Vycm9yZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJdmFfc3RhcnQodmEsIGZtdCk7CisJaW50ZXJuYWxfdmVycm9yZihmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworCXVud2luZChMRVJST1IpOworfQorCit2b2lkCitpbnRlcm5hbF93YXJuaW5nZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJdmFfc3RhcnQodmEsIGZtdCk7CisJaW50ZXJuYWxfdmVycm9yZihmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworfQorCisvKiB1c2VkIGJ5IGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbnMgdG8gcHJpbnQgImtzaDogLmtzaHJjWzI1XTogIiAqLwordm9pZAorZXJyb3JfcHJlZml4KGJvb2wgZmlsZWxpbmUpCit7CisJLyogQXZvaWQgZm9vOiBmb29bMl06IC4uLiAqLworCWlmICghZmlsZWxpbmUgfHwgIXNvdXJjZSB8fCAhc291cmNlLT5maWxlIHx8CisJICAgIHN0cmNtcChzb3VyY2UtPmZpbGUsIGtzaG5hbWUpICE9IDApCisJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlczogIiwga3NobmFtZSArICgqa3NobmFtZSA9PSAnLScpKTsKKwlpZiAoZmlsZWxpbmUgJiYgc291cmNlICYmIHNvdXJjZS0+ZmlsZSAhPSBOVUxMKSB7CisJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlc1slZF06ICIsIHNvdXJjZS0+ZmlsZSwKKwkJICAgIHNvdXJjZS0+ZXJybGluZSA+IDAgPyBzb3VyY2UtPmVycmxpbmUgOiBzb3VyY2UtPmxpbmUpOworCQlzb3VyY2UtPmVycmxpbmUgPSAwOworCX0KK30KKworLyogcHJpbnRmIHRvIHNobF9vdXQgKHN0ZGVycikgd2l0aCBmbHVzaCAqLwordm9pZAorc2hlbGxmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwlpZiAoIWluaXRpb19kb25lKSAvKiBzaGxfb3V0IG1heSBub3QgYmUgc2V0IHVwIHlldC4uLiAqLworCQlyZXR1cm47CisJdmFfc3RhcnQodmEsIGZtdCk7CisJc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7CisJc2hmX2ZsdXNoKHNobF9vdXQpOworfQorCisvKiBwcmludGYgdG8gc2hsX3N0ZG91dCAoc3Rkb3V0KSAqLwordm9pZAorc2hwcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCWlmICghc2hsX3N0ZG91dF9vaykKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGxfc3Rkb3V0IG5vdCB2YWxpZCIpOworCXZhX3N0YXJ0KHZhLCBmbXQpOworCXNoZl92ZnByaW50ZihzaGxfc3Rkb3V0LCBmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworfQorCisvKiB0ZXN0IGlmIHdlIGNhbiBzZWVrIGJhY2t3YXJkcyBmZCAocmV0dXJucyAwIG9yIFNIRl9VTkJVRikgKi8KK2ludAorY2FuX3NlZWsoaW50IGZkKQoreworCXN0cnVjdCBzdGF0IHN0YXRiOworCisJcmV0dXJuIChmc3RhdChmZCwgJnN0YXRiKSA9PSAwICYmICFTX0lTUkVHKHN0YXRiLnN0X21vZGUpID8KKwkgICAgU0hGX1VOQlVGIDogMCk7Cit9CisKK3N0cnVjdCBzaGYgc2hmX2lvYlszXTsKKwordm9pZAoraW5pdGlvKHZvaWQpCit7CisJc2hmX2Zkb3BlbigxLCBTSEZfV1IsIHNobF9zdGRvdXQpOwkvKiBmb3JjZSBidWZmZXIgYWxsb2NhdGlvbiAqLworCXNoZl9mZG9wZW4oMiwgU0hGX1dSLCBzaGxfb3V0KTsKKwlzaGZfZmRvcGVuKDIsIFNIRl9XUiwgc2hsX3NwYXJlKTsJLyogZm9yY2UgYnVmZmVyIGFsbG9jYXRpb24gKi8KKwlpbml0aW9fZG9uZSA9IDE7Cit9CisKKy8qIEEgZHVwMigpIHdpdGggZXJyb3IgY2hlY2tpbmcgKi8KK2ludAora3NoX2R1cDIoaW50IG9mZCwgaW50IG5mZCwgYm9vbCBlcnJvaykKK3sKKwlpbnQgcnY7CisKKwlpZiAoKChydiA9IGR1cDIob2ZkLCBuZmQpKSA8IDApICYmICFlcnJvayAmJiAoZXJybm8gIT0gRUJBREYpKQorCQllcnJvcmYoInRvbyBtYW55IGZpbGVzIG9wZW4gaW4gc2hlbGwiKTsKKworI2lmZGVmIF9fdWx0cml4CisJLyogWFhYIGltYWtlIHN0eWxlICovCisJaWYgKHJ2ID49IDApCisJCWZjbnRsKG5mZCwgRl9TRVRGRCwgMCk7CisjZW5kaWYKKworCXJldHVybiAocnYpOworfQorCisvKgorICogbW92ZSBmZCBmcm9tIHVzZXIgc3BhY2UgKDA8PWZkPDEwKSB0byBzaGVsbCBzcGFjZSAoZmQ+PTEwKSwKKyAqIHNldCBjbG9zZS1vbi1leGVjIGZsYWcuCisgKi8KK3Nob3J0CitzYXZlZmQoaW50IGZkKQoreworCWludCBuZmQgPSBmZDsKKworCWlmIChmZCA8IEZEQkFTRSAmJiAobmZkID0gZmNudGwoZmQsIEZfRFVQRkQsIEZEQkFTRSkpIDwgMCAmJgorCSAgICBlcnJubyA9PSBFQkFERikKKwkJcmV0dXJuICgtMSk7CisJaWYgKG5mZCA8IDAgfHwgbmZkID4gU0hSVF9NQVgpCisJCWVycm9yZigidG9vIG1hbnkgZmlsZXMgb3BlbiBpbiBzaGVsbCIpOworCWZjbnRsKG5mZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisJcmV0dXJuICgoc2hvcnQpbmZkKTsKK30KKwordm9pZAorcmVzdGZkKGludCBmZCwgaW50IG9mZCkKK3sKKwlpZiAoZmQgPT0gMikKKwkJc2hmX2ZsdXNoKCZzaGZfaW9iW2ZkXSk7CisJaWYgKG9mZCA8IDApCQkvKiBvcmlnaW5hbCBmZCBjbG9zZWQgKi8KKwkJY2xvc2UoZmQpOworCWVsc2UgaWYgKGZkICE9IG9mZCkgeworCQlrc2hfZHVwMihvZmQsIGZkLCB0cnVlKTsgLyogWFhYOiB3aGF0IHRvIGRvIGlmIHRoaXMgZmFpbHM/ICovCisJCWNsb3NlKG9mZCk7CisJfQorfQorCit2b2lkCitvcGVucGlwZShpbnQgKnB2KQoreworCWludCBscHZbMl07CisKKwlpZiAocGlwZShscHYpIDwgMCkKKwkJZXJyb3JmKCJjYW4ndCBjcmVhdGUgcGlwZSAtIHRyeSBhZ2FpbiIpOworCXB2WzBdID0gc2F2ZWZkKGxwdlswXSk7CisJaWYgKHB2WzBdICE9IGxwdlswXSkKKwkJY2xvc2UobHB2WzBdKTsKKwlwdlsxXSA9IHNhdmVmZChscHZbMV0pOworCWlmIChwdlsxXSAhPSBscHZbMV0pCisJCWNsb3NlKGxwdlsxXSk7Cit9CisKK3ZvaWQKK2Nsb3NlcGlwZShpbnQgKnB2KQoreworCWNsb3NlKHB2WzBdKTsKKwljbG9zZShwdlsxXSk7Cit9CisKKy8qIENhbGxlZCBieSBpb3NldHVwKCkgKGRlYWxzIHdpdGggMj4mNCwgZXRjLiksIGNfcmVhZCwgY19wcmludCB0byB0dXJuCisgKiBhIHN0cmluZyAodGhlIFggaW4gMj4mWCwgcmVhZCAtdVgsIHByaW50IC11WCkgaW50byBhIGZpbGUgZGVzY3JpcHRvci4KKyAqLworaW50CitjaGVja19mZChjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSwgY29uc3QgY2hhciAqKmVtc2dwKQoreworCWludCBmZCwgZmw7CisKKwlpZiAobmFtZVswXSA9PSAncCcgJiYgIW5hbWVbMV0pCisJCXJldHVybiAoY29wcm9jX2dldGZkKG1vZGUsIGVtc2dwKSk7CisJZm9yIChmZCA9IDA7IGtzaF9pc2RpZ2l0KCpuYW1lKTsgKytuYW1lKQorCQlmZCA9IChmZCAqIDEwKSArICpuYW1lIC0gJzAnOworCWlmICgqbmFtZSB8fCBmZCA+PSBGREJBU0UpIHsKKwkJaWYgKGVtc2dwKQorCQkJKmVtc2dwID0gImlsbGVnYWwgZmlsZSBkZXNjcmlwdG9yIG5hbWUiOworCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYgKChmbCA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKSkgPCAwKSB7CisJCWlmIChlbXNncCkKKwkJCSplbXNncCA9ICJiYWQgZmlsZSBkZXNjcmlwdG9yIjsKKwkJcmV0dXJuICgtMSk7CisJfQorCWZsICY9IE9fQUNDTU9ERTsKKwkvKiBYX09LIGlzIGEga2x1ZGdlIHRvIGRpc2FibGUgdGhpcyBjaGVjayBmb3IgZHVwcyAoeDwmMSk6CisJICogaGlzdG9yaWNhbCBzaGVsbHMgbmV2ZXIgZGlkIHRoaXMgY2hlY2sgKFhYWCBkb24ndCBrbm93IHdoYXQKKwkgKiBQT1NJWCBoYXMgdG8gc2F5KS4KKwkgKi8KKwlpZiAoIShtb2RlICYgWF9PSykgJiYgZmwgIT0gT19SRFdSICYmICgKKwkgICAgKChtb2RlICYgUl9PSykgJiYgZmwgIT0gT19SRE9OTFkpIHx8CisJICAgICgobW9kZSAmIFdfT0spICYmIGZsICE9IE9fV1JPTkxZKSkpIHsKKwkJaWYgKGVtc2dwKQorCQkJKmVtc2dwID0gKGZsID09IE9fV1JPTkxZKSA/CisJCQkgICAgImZkIG5vdCBvcGVuIGZvciByZWFkaW5nIiA6CisJCQkgICAgImZkIG5vdCBvcGVuIGZvciB3cml0aW5nIjsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAoZmQpOworfQorCisvKiBDYWxsZWQgb25jZSBmcm9tIG1haW4gKi8KK3ZvaWQKK2NvcHJvY19pbml0KHZvaWQpCit7CisJY29wcm9jLnJlYWQgPSBjb3Byb2MucmVhZHcgPSBjb3Byb2Mud3JpdGUgPSAtMTsKKwljb3Byb2MubmpvYnMgPSAwOworCWNvcHJvYy5pZCA9IDA7Cit9CisKKy8qIENhbGxlZCBieSBjX3JlYWQoKSB3aGVuIGVvZiBpcyByZWFkIC0gY2xvc2UgZmQgaWYgaXQgaXMgdGhlIGNvLXByb2Nlc3MgZmQgKi8KK3ZvaWQKK2NvcHJvY19yZWFkX2Nsb3NlKGludCBmZCkKK3sKKwlpZiAoY29wcm9jLnJlYWQgPj0gMCAmJiBmZCA9PSBjb3Byb2MucmVhZCkgeworCQljb3Byb2NfcmVhZHdfY2xvc2UoZmQpOworCQljbG9zZShjb3Byb2MucmVhZCk7CisJCWNvcHJvYy5yZWFkID0gLTE7CisJfQorfQorCisvKiBDYWxsZWQgYnkgY19yZWFkKCkgYW5kIGJ5IGlvc2V0dXAoKSB0byBjbG9zZSB0aGUgb3RoZXIgc2lkZSBvZiB0aGUKKyAqIHJlYWQgcGlwZSwgc28gcmVhZHMgd2lsbCBhY3R1YWxseSB0ZXJtaW5hdGUuCisgKi8KK3ZvaWQKK2NvcHJvY19yZWFkd19jbG9zZShpbnQgZmQpCit7CisJaWYgKGNvcHJvYy5yZWFkdyA+PSAwICYmIGNvcHJvYy5yZWFkID49IDAgJiYgZmQgPT0gY29wcm9jLnJlYWQpIHsKKwkJY2xvc2UoY29wcm9jLnJlYWR3KTsKKwkJY29wcm9jLnJlYWR3ID0gLTE7CisJfQorfQorCisvKiBDYWxsZWQgYnkgY19wcmludCB3aGVuIGEgd3JpdGUgdG8gYSBmZCBmYWlscyB3aXRoIEVQSVBFIGFuZCBieSBpb3NldHVwCisgKiB3aGVuIGNvLXByb2Nlc3MgaW5wdXQgaXMgZHVwJ2QKKyAqLwordm9pZAorY29wcm9jX3dyaXRlX2Nsb3NlKGludCBmZCkKK3sKKwlpZiAoY29wcm9jLndyaXRlID49IDAgJiYgZmQgPT0gY29wcm9jLndyaXRlKSB7CisJCWNsb3NlKGNvcHJvYy53cml0ZSk7CisJCWNvcHJvYy53cml0ZSA9IC0xOworCX0KK30KKworLyogQ2FsbGVkIHRvIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YvdmFsdWUgb2YgdGhlIGNvLXByb2Nlc3MgZmlsZSBkZXNjcmlwdG9yLgorICogKFVzZWQgYnkgY2hlY2tfZmQoKSBhbmQgYnkgY19yZWFkL2NfcHJpbnQgdG8gZGVhbCB3aXRoIC1wIG9wdGlvbikuCisgKi8KK2ludAorY29wcm9jX2dldGZkKGludCBtb2RlLCBjb25zdCBjaGFyICoqZW1zZ3ApCit7CisJaW50IGZkID0gKG1vZGUgJiBSX09LKSA/IGNvcHJvYy5yZWFkIDogY29wcm9jLndyaXRlOworCisJaWYgKGZkID49IDApCisJCXJldHVybiAoZmQpOworCWlmIChlbXNncCkKKwkJKmVtc2dwID0gIm5vIGNvcHJvY2VzcyI7CisJcmV0dXJuICgtMSk7Cit9CisKKy8qIGNhbGxlZCB0byBjbG9zZSBmaWxlIGRlc2NyaXB0b3JzIHJlbGF0ZWQgdG8gdGhlIGNvcHJvY2VzcyAoaWYgYW55KQorICogU2hvdWxkIGJlIGNhbGxlZCB3aXRoIFNJR0NITEQgYmxvY2tlZC4KKyAqLwordm9pZAorY29wcm9jX2NsZWFudXAoaW50IHJldXNlKQoreworCS8qIFRoaXMgdG8gYWxsb3cgY28tcHJvY2Vzc2VzIHRvIHNoYXJlIG91dHB1dCBwaXBlICovCisJaWYgKCFyZXVzZSB8fCBjb3Byb2MucmVhZHcgPCAwIHx8IGNvcHJvYy5yZWFkIDwgMCkgeworCQlpZiAoY29wcm9jLnJlYWQgPj0gMCkgeworCQkJY2xvc2UoY29wcm9jLnJlYWQpOworCQkJY29wcm9jLnJlYWQgPSAtMTsKKwkJfQorCQlpZiAoY29wcm9jLnJlYWR3ID49IDApIHsKKwkJCWNsb3NlKGNvcHJvYy5yZWFkdyk7CisJCQljb3Byb2MucmVhZHcgPSAtMTsKKwkJfQorCX0KKwlpZiAoY29wcm9jLndyaXRlID49IDApIHsKKwkJY2xvc2UoY29wcm9jLndyaXRlKTsKKwkJY29wcm9jLndyaXRlID0gLTE7CisJfQorfQorCitzdHJ1Y3QgdGVtcCAqCittYWtldGVtcChBcmVhICphcCwgVGVtcF90eXBlIHR5cGUsIHN0cnVjdCB0ZW1wICoqdGxpc3QpCit7CisJc3RydWN0IHRlbXAgKnRwOworCWludCBsZW47CisJaW50IGZkOworCWNoYXIgKnBhdGhuYW1lOworCWNvbnN0IGNoYXIgKmRpcjsKKworCWRpciA9IHRtcGRpciA/IHRtcGRpciA6IE1LU0hfREVGQVVMVF9UTVBESVI7CisjaWYgSEFWRV9NS1NURU1QCisJbGVuID0gc3RybGVuKGRpcikgKyA2ICsgMTAgKyAxOworI2Vsc2UKKwlwYXRobmFtZSA9IHRlbXBuYW0oZGlyLCAibWtzaC4iKTsKKwlsZW4gPSAoKHBhdGhuYW1lID09IE5VTEwpID8gMCA6IHN0cmxlbihwYXRobmFtZSkpICsgMTsKKyNlbmRpZgorCXRwID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZW1wKSArIGxlbiwgYXApOworCXRwLT5uYW1lID0gKGNoYXIgKikmdHBbMV07CisjaWYgIUhBVkVfTUtTVEVNUAorCWlmIChwYXRobmFtZSA9PSBOVUxMKQorCQl0cC0+bmFtZVswXSA9ICdcMCc7CisJZWxzZSB7CisJCW1lbWNweSh0cC0+bmFtZSwgcGF0aG5hbWUsIGxlbik7CisJCWZyZWUocGF0aG5hbWUpOworCX0KKyNlbmRpZgorCXBhdGhuYW1lID0gdHAtPm5hbWU7CisJdHAtPnNoZiA9IE5VTEw7CisJdHAtPnR5cGUgPSB0eXBlOworI2lmIEhBVkVfTUtTVEVNUAorCXNoZl9zbnByaW50ZihwYXRobmFtZSwgbGVuLCAiJXMvbWtzaC5YWFhYWFhYWFhYIiwgZGlyKTsKKwlpZiAoKGZkID0gbWtzdGVtcChwYXRobmFtZSkpID49IDApCisjZWxzZQorCWlmICh0cC0+bmFtZVswXSAmJiAoZmQgPSBvcGVuKHRwLT5uYW1lLCBPX0NSRUFUIHwgT19SRFdSLCAwNjAwKSkgPj0gMCkKKyNlbmRpZgorCQl0cC0+c2hmID0gc2hmX2Zkb3BlbihmZCwgU0hGX1dSLCBOVUxMKTsKKwl0cC0+cGlkID0gcHJvY3BpZDsKKworCXRwLT5uZXh0ID0gKnRsaXN0OworCSp0bGlzdCA9IHRwOworCXJldHVybiAodHApOworfQorCisvKgorICogV2UgdXNlIGEgc2ltaWxhciBjb2xsaXNpb24gcmVzb2x1dGlvbiBhbGdvcml0aG0gYXMgUHl0aG9uIDIuNS40CisgKiBidXQgd2l0aCBhIHNsaWdodGx5IHR3ZWFrZWQgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBmcm9tIHNjcmF0Y2guCisgKi8KKworI2RlZmluZQlJTklUX1RCTFMJOAkvKiBpbml0aWFsIHRhYmxlIHNpemUgKHBvd2VyIG9mIDIpICovCisjZGVmaW5lIFBFUlRVUkJfU0hJRlQJNQkvKiBzZWUgUHl0aG9uIDIuNS40IE9iamVjdHMvZGljdG9iamVjdC5jICovCisKK3N0YXRpYyB2b2lkIHRleHBhbmQoc3RydWN0IHRhYmxlICosIHNpemVfdCk7CitzdGF0aWMgaW50IHRuYW1lY21wKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdGJsICprdHNjYW4oc3RydWN0IHRhYmxlICosIGNvbnN0IGNoYXIgKiwgdWludDMyX3QsCisgICAgc3RydWN0IHRibCAqKiopOworCitzdGF0aWMgdm9pZAordGV4cGFuZChzdHJ1Y3QgdGFibGUgKnRwLCBzaXplX3QgbnNpemUpCit7CisJc2l6ZV90IGksIGosIG9zaXplID0gdHAtPnNpemUsIHBlcnR1cmI7CisJc3RydWN0IHRibCAqdGJscCwgKipwcDsKKwlzdHJ1Y3QgdGJsICoqbnRibHAsICoqb3RibHAgPSB0cC0+dGJsczsKKworCW50YmxwID0gYWxsb2MobnNpemUgKiBzaXplb2Yoc3RydWN0IHRibCAqKSwgdHAtPmFyZWFwKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnNpemU7IGkrKykKKwkJbnRibHBbaV0gPSBOVUxMOworCXRwLT5zaXplID0gbnNpemU7CisJdHAtPm5mcmVlID0gKG5zaXplICogNCkgLyA1OwkvKiB0YWJsZSBjYW4gZ2V0IDgwJSBmdWxsICovCisJdHAtPnRibHMgPSBudGJscDsKKwlpZiAob3RibHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCW5zaXplLS07CQkJLyogZnJvbSBoZXJlIG9uIG5zaXplIDo9IG1hc2sgKi8KKwlmb3IgKGkgPSAwOyBpIDwgb3NpemU7IGkrKykKKwkJaWYgKCh0YmxwID0gb3RibHBbaV0pICE9IE5VTEwpIHsKKwkJCWlmICgodGJscC0+ZmxhZyAmIERFRklORUQpKSB7CisJCQkJLyogc2VhcmNoIGZvciBmcmVlIGhhc2ggdGFibGUgc2xvdCAqLworCQkJCWogPSAocGVydHVyYiA9IHRibHAtPnVhLmh2YWwpICYgbnNpemU7CisJCQkJZ290byBmaW5kX2ZpcnN0X2VtcHR5X3Nsb3Q7CisgZmluZF9uZXh0X2VtcHR5X3Nsb3Q6CisJCQkJaiA9IChqIDw8IDIpICsgaiArIHBlcnR1cmIgKyAxOworCQkJCXBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQ7CisgZmluZF9maXJzdF9lbXB0eV9zbG90OgorCQkJCXBwID0gJm50YmxwW2ogJiBuc2l6ZV07CisJCQkJaWYgKCpwcCAhPSBOVUxMKQorCQkJCQlnb3RvIGZpbmRfbmV4dF9lbXB0eV9zbG90OworCQkJCS8qIGZvdW5kIGFuIGVtcHR5IGhhc2ggdGFibGUgc2xvdCAqLworCQkJCSpwcCA9IHRibHA7CisJCQkJdHAtPm5mcmVlLS07CisJCQl9IGVsc2UgaWYgKCEodGJscC0+ZmxhZyAmIEZJTlVTRSkpIHsKKwkJCQlhZnJlZSh0YmxwLCB0cC0+YXJlYXApOworCQkJfQorCQl9CisJYWZyZWUob3RibHAsIHRwLT5hcmVhcCk7Cit9CisKK3ZvaWQKK2t0aW5pdChzdHJ1Y3QgdGFibGUgKnRwLCBBcmVhICphcCwgc2l6ZV90IHRzaXplKQoreworCXRwLT5hcmVhcCA9IGFwOworCXRwLT50YmxzID0gTlVMTDsKKwl0cC0+c2l6ZSA9IHRwLT5uZnJlZSA9IDA7CisJaWYgKHRzaXplKQorCQl0ZXhwYW5kKHRwLCB0c2l6ZSk7Cit9CisKKy8qIHRhYmxlLCBuYW1lIChrZXkpIHRvIHNlYXJjaCBmb3IsIGhhc2gobmFtZSksIHJ2IHBvaW50ZXIgdG8gdGJsIHB0ciAqLworc3RhdGljIHN0cnVjdCB0YmwgKgora3RzY2FuKHN0cnVjdCB0YWJsZSAqdHAsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGgsIHN0cnVjdCB0YmwgKioqcHBwKQoreworCXNpemVfdCBqLCBwZXJ0dXJiLCBtYXNrOworCXN0cnVjdCB0YmwgKipwcCwgKnA7CisKKwltYXNrID0gdHAtPnNpemUgLSAxOworCS8qIHNlYXJjaCBmb3IgaGFzaCB0YWJsZSBzbG90IG1hdGNoaW5nIG5hbWUgKi8KKwlqID0gKHBlcnR1cmIgPSBoKSAmIG1hc2s7CisJZ290byBmaW5kX2ZpcnN0X3Nsb3Q7CisgZmluZF9uZXh0X3Nsb3Q6CisJaiA9IChqIDw8IDIpICsgaiArIHBlcnR1cmIgKyAxOworCXBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQ7CisgZmluZF9maXJzdF9zbG90OgorCXBwID0gJnRwLT50YmxzW2ogJiBtYXNrXTsKKwlpZiAoKHAgPSAqcHApICE9IE5VTEwgJiYgKHAtPnVhLmh2YWwgIT0gaCB8fCAhKHAtPmZsYWcgJiBERUZJTkVEKSB8fAorCSAgICBzdHJjbXAocC0+bmFtZSwgbmFtZSkpKQorCQlnb3RvIGZpbmRfbmV4dF9zbG90OworCS8qIHAgPT0gTlVMTCBpZiBub3QgZm91bmQsIGNvcnJlY3QgZm91bmQgZW50cnkgb3RoZXJ3aXNlICovCisJaWYgKHBwcCkKKwkJKnBwcCA9IHBwOworCXJldHVybiAocCk7Cit9CisKKy8qIHRhYmxlLCBuYW1lIChrZXkpIHRvIHNlYXJjaCBmb3IsIGhhc2gobikgKi8KK3N0cnVjdCB0YmwgKgora3RzZWFyY2goc3RydWN0IHRhYmxlICp0cCwgY29uc3QgY2hhciAqbiwgdWludDMyX3QgaCkKK3sKKwlyZXR1cm4gKHRwLT5zaXplID8ga3RzY2FuKHRwLCBuLCBoLCBOVUxMKSA6IE5VTEwpOworfQorCisvKiB0YWJsZSwgbmFtZSAoa2V5KSB0byBlbnRlciwgaGFzaChuKSAqLworc3RydWN0IHRibCAqCitrdGVudGVyKHN0cnVjdCB0YWJsZSAqdHAsIGNvbnN0IGNoYXIgKm4sIHVpbnQzMl90IGgpCit7CisJc3RydWN0IHRibCAqKnBwLCAqcDsKKwlpbnQgbGVuOworCisJaWYgKHRwLT5zaXplID09IDApCisJCXRleHBhbmQodHAsIElOSVRfVEJMUyk7CisgU2VhcmNoOgorCWlmICgocCA9IGt0c2Nhbih0cCwgbiwgaCwgJnBwKSkpCisJCXJldHVybiAocCk7CisKKwlpZiAodHAtPm5mcmVlIDw9IDApIHsKKwkJLyogdG9vIGZ1bGwgKi8KKwkJdGV4cGFuZCh0cCwgMiAqIHRwLT5zaXplKTsKKwkJZ290byBTZWFyY2g7CisJfQorCisJLyogY3JlYXRlIG5ldyB0YmwgZW50cnkgKi8KKwlsZW4gPSBzdHJsZW4obikgKyAxOworCXAgPSBhbGxvYyhvZmZzZXRvZihzdHJ1Y3QgdGJsLCBuYW1lWzBdKSArIGxlbiwgdHAtPmFyZWFwKTsKKwlwLT5mbGFnID0gMDsKKwlwLT50eXBlID0gMDsKKwlwLT5hcmVhcCA9IHRwLT5hcmVhcDsKKwlwLT51YS5odmFsID0gaDsKKwlwLT51Mi5maWVsZCA9IDA7CisJcC0+dS5hcnJheSA9IE5VTEw7CisJbWVtY3B5KHAtPm5hbWUsIG4sIGxlbik7CisKKwkvKiBlbnRlciBpbiB0cC0+dGJscyAqLworCXRwLT5uZnJlZS0tOworCSpwcCA9IHA7CisJcmV0dXJuIChwKTsKK30KKwordm9pZAora3R3YWxrKHN0cnVjdCB0c3RhdGUgKnRzLCBzdHJ1Y3QgdGFibGUgKnRwKQoreworCXRzLT5sZWZ0ID0gdHAtPnNpemU7CisJdHMtPm5leHQgPSB0cC0+dGJsczsKK30KKworc3RydWN0IHRibCAqCitrdG5leHQoc3RydWN0IHRzdGF0ZSAqdHMpCit7CisJd2hpbGUgKC0tdHMtPmxlZnQgPj0gMCkgeworCQlzdHJ1Y3QgdGJsICpwID0gKnRzLT5uZXh0Kys7CisJCWlmIChwICE9IE5VTEwgJiYgKHAtPmZsYWcgJiBERUZJTkVEKSkKKwkJCXJldHVybiAocCk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQKK3RuYW1lY21wKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwljb25zdCBzdHJ1Y3QgdGJsICphID0gKigoY29uc3Qgc3RydWN0IHRibCAqIGNvbnN0ICopcDEpOworCWNvbnN0IHN0cnVjdCB0YmwgKmIgPSAqKChjb25zdCBzdHJ1Y3QgdGJsICogY29uc3QgKilwMik7CisKKwlyZXR1cm4gKHN0cmNtcChhLT5uYW1lLCBiLT5uYW1lKSk7Cit9CisKK3N0cnVjdCB0YmwgKioKK2t0c29ydChzdHJ1Y3QgdGFibGUgKnRwKQoreworCXNpemVfdCBpOworCXN0cnVjdCB0YmwgKipwLCAqKnNwLCAqKmRwOworCisJcCA9IGFsbG9jKCh0cC0+c2l6ZSArIDEpICogc2l6ZW9mKHN0cnVjdCB0YmwgKiksIEFURU1QKTsKKwlzcCA9IHRwLT50YmxzOwkJLyogc291cmNlICovCisJZHAgPSBwOwkJCS8qIGRlc3QgKi8KKwlpID0gKHNpemVfdCl0cC0+c2l6ZTsKKwl3aGlsZSAoaS0tKQorCQlpZiAoKCpkcCA9ICpzcCsrKSAhPSBOVUxMICYmICgoKCpkcCktPmZsYWcgJiBERUZJTkVEKSB8fAorCQkgICAgKCgqZHApLT5mbGFnICYgQVJSQVkpKSkKKwkJCWRwKys7CisJcXNvcnQocCwgKGkgPSBkcCAtIHApLCBzaXplb2Yodm9pZCAqKSwgdG5hbWVjbXApOworCXBbaV0gPSBOVUxMOworCXJldHVybiAocCk7Cit9CisKKyNpZmRlZiBTSUdXSU5DSAorc3RhdGljIHZvaWQKK3hfc2lnd2luY2goaW50IHNpZyBNS1NIX0FfVU5VU0VEKQoreworCS8qIHRoaXMgcnVucyBpbnNpZGUgaW50ZXJydXB0IGNvbnRleHQsIHdpdGggZXJybm8gc2F2ZWQgKi8KKworCWdvdF93aW5jaCA9IDE7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21rc2gvc3JjL21pc2MuYyBiL21rc2gvc3JjL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWE0ZGUxCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvbWlzYy5jCkBAIC0wLDAgKzEsMTU3OSBAQAorLyoJJE9wZW5CU0Q6IG1pc2MuYyx2IDEuMzcgMjAwOS8wNC8xOSAyMDozNDowNSBzdGhlbiBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IHBhdGguYyx2IDEuMTIgMjAwNS8wMy8zMCAxNzoxNjozNyBkZXJhYWR0IEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKyNpZiAhSEFWRV9HRVRSVVNBR0UKKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNlbmRpZgorI2lmIEhBVkVfR1JQX0gKKyNpbmNsdWRlIDxncnAuaD4KKyNlbmRpZgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9taXNjLmMsdiAxLjE0MSAyMDEwLzA3LzE3IDIyOjA5OjM2IHRnIEV4cCAkIik7CisKK3Vuc2lnbmVkIGNoYXIgY2h0eXBlc1tVQ0hBUl9NQVggKyAxXTsJLyogdHlwZSBiaXRzIGZvciB1bnNpZ25lZCBjaGFyICovCisKKyNpZiAhSEFWRV9TRVRSRVNVR0lECit1aWRfdCBrc2h1aWQ7CitnaWRfdCBrc2hnaWQsIGtzaGVnaWQ7CisjZW5kaWYKKworc3RhdGljIGludCBkb19nbWF0Y2goY29uc3QgdW5zaWduZWQgY2hhciAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICopOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNjbGFzcyhjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7CisjaWZkZWYgVElPQ1NDVFRZCitzdGF0aWMgdm9pZCBjaHZ0KGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworLyoKKyAqIEZhc3QgY2hhcmFjdGVyIGNsYXNzZXMKKyAqLwordm9pZAorc2V0Y3R5cGVzKGNvbnN0IGNoYXIgKnMsIGludCB0KQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKHQgJiBDX0lGUykgeworCQlmb3IgKGkgPSAwOyBpIDwgVUNIQVJfTUFYICsgMTsgaSsrKQorCQkJY2h0eXBlc1tpXSAmPSB+Q19JRlM7CisJCWNodHlwZXNbMF0gfD0gQ19JRlM7IC8qIGluY2x1ZGUgXDAgaW4gQ19JRlMgKi8KKwl9CisJd2hpbGUgKCpzICE9IDApCisJCWNodHlwZXNbKHVuc2lnbmVkIGNoYXIpKnMrK10gfD0gdDsKK30KKwordm9pZAoraW5pdGN0eXBlcyh2b2lkKQoreworCWludCBjOworCisJZm9yIChjID0gJ2EnOyBjIDw9ICd6JzsgYysrKQorCQljaHR5cGVzW2NdIHw9IENfQUxQSEE7CisJZm9yIChjID0gJ0EnOyBjIDw9ICdaJzsgYysrKQorCQljaHR5cGVzW2NdIHw9IENfQUxQSEE7CisJY2h0eXBlc1snXyddIHw9IENfQUxQSEE7CisJc2V0Y3R5cGVzKCIwMTIzNDU2Nzg5IiwgQ19ESUdJVCk7CisJc2V0Y3R5cGVzKCIgXHRcbnwmOzw+KCkiLCBDX0xFWDEpOyAvKiBcMCBhZGRlZCBhdXRvbWF0aWNhbGx5ICovCisJc2V0Y3R5cGVzKCIqQCMhJC0/IiwgQ19WQVIxKTsKKwlzZXRjdHlwZXMoIiBcdFxuIiwgQ19JRlNXUyk7CisJc2V0Y3R5cGVzKCI9LSs/IiwgQ19TVUJPUDEpOworCXNldGN0eXBlcygiXHRcbiBcIiMkJicoKSo7PD0+P1tcXF1gfCIsIENfUVVPVEUpOworfQorCisvKiBjYWxsZWQgZnJvbSBYY2hlY2tOKCkgdG8gZ3JvdyBidWZmZXIgKi8KK2NoYXIgKgorWGNoZWNrX2dyb3dfKFhTdHJpbmcgKnhzcCwgY29uc3QgY2hhciAqeHAsIHVuc2lnbmVkIGludCBtb3JlKQoreworCWNvbnN0IGNoYXIgKm9sZF9iZWcgPSB4c3AtPmJlZzsKKworCXhzcC0+bGVuICs9IG1vcmUgPiB4c3AtPmxlbiA/IG1vcmUgOiB4c3AtPmxlbjsKKwl4c3AtPmJlZyA9IGFyZXNpemUoeHNwLT5iZWcsIHhzcC0+bGVuICsgOCwgeHNwLT5hcmVhcCk7CisJeHNwLT5lbmQgPSB4c3AtPmJlZyArIHhzcC0+bGVuOworCXJldHVybiAoeHNwLT5iZWcgKyAoeHAgLSBvbGRfYmVnKSk7Cit9CisKKyNkZWZpbmUgU0hGTEFHU19ERUZOUworI2luY2x1ZGUgInNoX2ZsYWdzLmgiCisKK2NvbnN0IHN0cnVjdCBzaG9wdGlvbiBvcHRpb25zW10gPSB7CisjZGVmaW5lIFNIRkxBR1NfSVRFTVMKKyNpbmNsdWRlICJzaF9mbGFncy5oIgorfTsKKworLyoKKyAqIHRyYW5zbGF0ZSAtbyBvcHRpb24gaW50byBGKiBjb25zdGFudCAoYWxzbyB1c2VkIGZvciB0ZXN0IC1vIG9wdGlvbikKKyAqLworc2l6ZV90CitvcHRpb24oY29uc3QgY2hhciAqbikKK3sKKwlzaXplX3QgaTsKKworCWlmICgoblswXSA9PSAnLScgfHwgblswXSA9PSAnKycpICYmIG5bMV0gJiYgIW5bMl0pIHsKKwkJZm9yIChpID0gMDsgaSA8IE5FTEVNKG9wdGlvbnMpOyBpKyspCisJCQlpZiAob3B0aW9uc1tpXS5jID09IG5bMV0pCisJCQkJcmV0dXJuIChpKTsKKwl9IGVsc2UgZm9yIChpID0gMDsgaSA8IE5FTEVNKG9wdGlvbnMpOyBpKyspCisJCWlmIChvcHRpb25zW2ldLm5hbWUgJiYgc3RyY21wKG9wdGlvbnNbaV0ubmFtZSwgbikgPT0gMCkKKwkJCXJldHVybiAoaSk7CisKKwlyZXR1cm4gKChzaXplX3QpLTEpOworfQorCitzdHJ1Y3Qgb3B0aW9uc19pbmZvIHsKKwlpbnQgb3B0X3dpZHRoOworCWludCBvcHRzW05FTEVNKG9wdGlvbnMpXTsKK307CisKK3N0YXRpYyBjaGFyICpvcHRpb25zX2ZtdF9lbnRyeShjaGFyICosIGludCwgaW50LCBjb25zdCB2b2lkICopOworc3RhdGljIHZvaWQgcHJpbnRvcHRpb25zKGJvb2wpOworCisvKiBmb3JtYXQgYSBzaW5nbGUgc2VsZWN0IG1lbnUgaXRlbSAqLworc3RhdGljIGNoYXIgKgorb3B0aW9uc19mbXRfZW50cnkoY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgaSwgY29uc3Qgdm9pZCAqYXJnKQoreworCWNvbnN0IHN0cnVjdCBvcHRpb25zX2luZm8gKm9pID0gKGNvbnN0IHN0cnVjdCBvcHRpb25zX2luZm8gKilhcmc7CisKKwlzaGZfc25wcmludGYoYnVmLCBidWZsZW4sICIlLSpzICVzIiwKKwkgICAgb2ktPm9wdF93aWR0aCwgb3B0aW9uc1tvaS0+b3B0c1tpXV0ubmFtZSwKKwkgICAgRmxhZyhvaS0+b3B0c1tpXSkgPyAib24iIDogIm9mZiIpOworCXJldHVybiAoYnVmKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50b3B0aW9ucyhib29sIHZlcmJvc2UpCit7CisJaW50IGkgPSAwOworCisJaWYgKHZlcmJvc2UpIHsKKwkJaW50IG4gPSAwLCBsZW4sIG9jdHMgPSAwOworCQlzdHJ1Y3Qgb3B0aW9uc19pbmZvIG9pOworCisJCS8qIHZlcmJvc2UgdmVyc2lvbiAqLworCQlzaGZfcHV0cygiQ3VycmVudCBvcHRpb24gc2V0dGluZ3NcbiIsIHNobF9zdGRvdXQpOworCisJCW9pLm9wdF93aWR0aCA9IDA7CisJCXdoaWxlIChpIDwgKGludClORUxFTShvcHRpb25zKSkgeworCQkJaWYgKG9wdGlvbnNbaV0ubmFtZSkgeworCQkJCW9pLm9wdHNbbisrXSA9IGk7CisJCQkJbGVuID0gc3RybGVuKG9wdGlvbnNbaV0ubmFtZSk7CisJCQkJaWYgKGxlbiA+IG9jdHMpCisJCQkJCW9jdHMgPSBsZW47CisJCQkJbGVuID0gdXRmX21ic3dpZHRoKG9wdGlvbnNbaV0ubmFtZSk7CisJCQkJaWYgKGxlbiA+IG9pLm9wdF93aWR0aCkKKwkJCQkJb2kub3B0X3dpZHRoID0gbGVuOworCQkJfQorCQkJKytpOworCQl9CisJCXByaW50X2NvbHVtbnMoc2hsX3N0ZG91dCwgbiwgb3B0aW9uc19mbXRfZW50cnksICZvaSwKKwkJICAgIG9jdHMgKyA0LCBvaS5vcHRfd2lkdGggKyA0LCB0cnVlKTsKKwl9IGVsc2UgeworCQkvKiBzaG9ydCB2ZXJzaW9uIMOhIGxhIEFUJlQga3NoOTMgKi8KKwkJc2hmX3B1dHMoInNldCIsIHNobF9zdGRvdXQpOworCQl3aGlsZSAoaSA8IChpbnQpTkVMRU0ob3B0aW9ucykpIHsKKwkJCWlmIChGbGFnKGkpICYmIG9wdGlvbnNbaV0ubmFtZSkKKwkJCQlzaHByaW50ZigiIC1vICVzIiwgb3B0aW9uc1tpXS5uYW1lKTsKKwkJCSsraTsKKwkJfQorCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKKwl9Cit9CisKK2NoYXIgKgorZ2V0b3B0aW9ucyh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWNoYXIgbVsoaW50KSBGTkZMQUdTICsgMV07CisJY2hhciAqY3AgPSBtOworCisJZm9yIChpID0gMDsgaSA8IE5FTEVNKG9wdGlvbnMpOyBpKyspCisJCWlmIChvcHRpb25zW2ldLmMgJiYgRmxhZyhpKSkKKwkJCSpjcCsrID0gb3B0aW9uc1tpXS5jOworCXN0cm5kdXB4KGNwLCBtLCBjcCAtIG0sIEFURU1QKTsKKwlyZXR1cm4gKGNwKTsKK30KKworLyogY2hhbmdlIGEgRmxhZygqKSB2YWx1ZTsgdGFrZXMgY2FyZSBvZiBzcGVjaWFsIGFjdGlvbnMgKi8KK3ZvaWQKK2NoYW5nZV9mbGFnKGVudW0gc2hfZmxhZyBmLCBpbnQgd2hhdCwgdW5zaWduZWQgaW50IG5ld3ZhbCkKK3sKKwl1bnNpZ25lZCBjaGFyIG9sZHZhbDsKKworCW9sZHZhbCA9IEZsYWcoZik7CisJRmxhZyhmKSA9IG5ld3ZhbCA/IDEgOiAwOwkvKiBuZWVkZWQgZm9yIHRyaXN0YXRlcyAqLworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwlpZiAoZiA9PSBGTU9OSVRPUikgeworCQlpZiAod2hhdCAhPSBPRl9DTURMSU5FICYmIG5ld3ZhbCAhPSBvbGR2YWwpCisJCQlqX2NoYW5nZSgpOworCX0gZWxzZQorI2VuZGlmCisJICBpZiAoKAorI2lmICFNS1NIX1NfTk9WSQorCSAgICBmID09IEZWSSB8fAorI2VuZGlmCisJICAgIGYgPT0gRkVNQUNTIHx8IGYgPT0gRkdNQUNTKSAmJiBuZXd2YWwpIHsKKyNpZiAhTUtTSF9TX05PVkkKKwkJRmxhZyhGVkkpID0KKyNlbmRpZgorCQkgICAgRmxhZyhGRU1BQ1MpID0gRmxhZyhGR01BQ1MpID0gMDsKKwkJRmxhZyhmKSA9ICh1bnNpZ25lZCBjaGFyKW5ld3ZhbDsKKwl9IGVsc2UgaWYgKGYgPT0gRlBSSVZJTEVHRUQgJiYgb2xkdmFsICYmICFuZXd2YWwpIHsKKwkJLyogVHVybmluZyBvZmYgLXA/ICovCisjaWYgSEFWRV9TRVRSRVNVR0lECisJCWdpZF90IGtzaGVnaWQgPSBnZXRnaWQoKTsKKworCQlzZXRyZXNnaWQoa3NoZWdpZCwga3NoZWdpZCwga3NoZWdpZCk7CisjaWYgSEFWRV9TRVRHUk9VUFMKKwkJc2V0Z3JvdXBzKDEsICZrc2hlZ2lkKTsKKyNlbmRpZgorCQlzZXRyZXN1aWQoa3NoZXVpZCwga3NoZXVpZCwga3NoZXVpZCk7CisjZWxzZQorCQlzZXRldWlkKGtzaGV1aWQgPSBrc2h1aWQgPSBnZXR1aWQoKSk7CisJCXNldHVpZChrc2hldWlkKTsKKwkJc2V0ZWdpZChrc2hlZ2lkID0ga3NoZ2lkID0gZ2V0Z2lkKCkpOworCQlzZXRnaWQoa3NoZWdpZCk7CisjZW5kaWYKKwl9IGVsc2UgaWYgKChmID09IEZQT1NJWCB8fCBmID09IEZTSCkgJiYgbmV3dmFsKSB7CisJCUZsYWcoRlBPU0lYKSA9IEZsYWcoRlNIKSA9IEZsYWcoRkJSQUNFRVhQQU5EKSA9IDA7CisJCUZsYWcoZikgPSAodW5zaWduZWQgY2hhciluZXd2YWw7CisJfQorCS8qIENoYW5naW5nIGludGVyYWN0aXZlIGZsYWc/ICovCisJaWYgKGYgPT0gRlRBTEtJTkcpIHsKKwkJaWYgKCh3aGF0ID09IE9GX0NNRExJTkUgfHwgd2hhdCA9PSBPRl9TRVQpICYmIHByb2NwaWQgPT0ga3NocGlkKQorCQkJRmxhZyhGVEFMS0lOR19JKSA9ICh1bnNpZ25lZCBjaGFyKW5ld3ZhbDsKKwl9Cit9CisKKy8qIFBhcnNlIGNvbW1hbmQgbGluZSAmIHNldCBjb21tYW5kIGFyZ3VtZW50cy4gUmV0dXJucyB0aGUgaW5kZXggb2YKKyAqIG5vbi1vcHRpb24gYXJndW1lbnRzLCAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAqLworaW50CitwYXJzZV9hcmdzKGNvbnN0IGNoYXIgKiphcmd2LAorICAgIGludCB3aGF0LAkJCS8qIE9GX0NNRExJTkUgb3IgT0ZfU0VUICovCisgICAgYm9vbCAqc2V0YXJnc3ApCit7CisJc3RhdGljIGNoYXIgY21kX29wdHNbTkVMRU0ob3B0aW9ucykgKyA1XTsgLyogbzpUOlwwICovCisJc3RhdGljIGNoYXIgc2V0X29wdHNbTkVMRU0ob3B0aW9ucykgKyA2XTsgLyogQTpvO3NcMCAqLworCWNoYXIgc2V0LCAqb3B0czsKKwljb25zdCBjaGFyICphcnJheSA9IE5VTEw7CisJR2V0b3B0IGdvOworCXNpemVfdCBpOworCWludCBvcHRjLCBzb3J0YXJncyA9IDAsIGFycmF5c2V0ID0gMDsKKworCS8qIEZpcnN0IGNhbGw/IEJ1aWxkIG9wdGlvbiBzdHJpbmdzLi4uICovCisJaWYgKGNtZF9vcHRzWzBdID09ICdcMCcpIHsKKwkJY2hhciAqcCA9IGNtZF9vcHRzLCAqcSA9IHNldF9vcHRzOworCisJCS8qIHNlZSBjbWRfb3B0c1tdIGRlY2xhcmF0aW9uICovCisJCSpwKysgPSAnbyc7CisJCSpwKysgPSAnOic7CisjaWYgIWRlZmluZWQoTUtTSF9TTUFMTCkgfHwgZGVmaW5lZChUSU9DU0NUVFkpCisJCSpwKysgPSAnVCc7CisJCSpwKysgPSAnOic7CisjZW5kaWYKKwkJLyogc2VlIHNldF9vcHRzW10gZGVjbGFyYXRpb24gKi8KKwkJKnErKyA9ICdBJzsKKwkJKnErKyA9ICc6JzsKKwkJKnErKyA9ICdvJzsKKwkJKnErKyA9ICc7JzsKKwkJKnErKyA9ICdzJzsKKworCQlmb3IgKGkgPSAwOyBpIDwgTkVMRU0ob3B0aW9ucyk7IGkrKykgeworCQkJaWYgKG9wdGlvbnNbaV0uYykgeworCQkJCWlmIChvcHRpb25zW2ldLmZsYWdzICYgT0ZfQ01ETElORSkKKwkJCQkJKnArKyA9IG9wdGlvbnNbaV0uYzsKKwkJCQlpZiAob3B0aW9uc1tpXS5mbGFncyAmIE9GX1NFVCkKKwkJCQkJKnErKyA9IG9wdGlvbnNbaV0uYzsKKwkJCX0KKwkJfQorCQkqcCA9ICdcMCc7CisJCSpxID0gJ1wwJzsKKwl9CisKKwlpZiAod2hhdCA9PSBPRl9DTURMSU5FKSB7CisJCWNvbnN0IGNoYXIgKnAgPSBhcmd2WzBdLCAqcTsKKwkJLyogU2V0IEZMT0dJTiBiZWZvcmUgcGFyc2luZyBvcHRpb25zIHNvIHVzZXIgY2FuIGNsZWFyCisJCSAqIGZsYWcgdXNpbmcgK2wuCisJCSAqLworCQlpZiAoKnAgIT0gJy0nKQorCQkJZm9yIChxID0gcDsgKnE7ICkKKwkJCQlpZiAoKnErKyA9PSAnLycpCisJCQkJCXAgPSBxOworCQlGbGFnKEZMT0dJTikgPSAoKnAgPT0gJy0nKTsKKwkJb3B0cyA9IGNtZF9vcHRzOworCX0gZWxzZSBpZiAod2hhdCA9PSBPRl9GSVJTVFRJTUUpIHsKKwkJb3B0cyA9IGNtZF9vcHRzOworCX0gZWxzZQorCQlvcHRzID0gc2V0X29wdHM7CisJa3NoX2dldG9wdF9yZXNldCgmZ28sIEdGX0VSUk9SfEdGX1BMVVNPUFQpOworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQoYXJndiwgJmdvLCBvcHRzKSkgIT0gLTEpIHsKKwkJc2V0ID0gKGdvLmluZm8gJiBHSV9QTFVTKSA/IDAgOiAxOworCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnQSc6CisJCQlpZiAod2hhdCA9PSBPRl9GSVJTVFRJTUUpCisJCQkJYnJlYWs7CisJCQlhcnJheXNldCA9IHNldCA/IDEgOiAtMTsKKwkJCWFycmF5ID0gZ28ub3B0YXJnOworCQkJYnJlYWs7CisKKwkJY2FzZSAnbyc6CisJCQlpZiAod2hhdCA9PSBPRl9GSVJTVFRJTUUpCisJCQkJYnJlYWs7CisJCQlpZiAoZ28ub3B0YXJnID09IE5VTEwpIHsKKwkJCQkvKiBsb25lIC1vOiBwcmludCBvcHRpb25zCisJCQkJICoKKwkJCQkgKiBOb3RlIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSwgLW8gcmVxdWlyZXMKKwkJCQkgKiBhbiBvcHRpb24gKGllLCBjYW4ndCBnZXQgaGVyZSBpZiB3aGF0IGlzCisJCQkJICogT0ZfQ01ETElORSkuCisJCQkJICovCisJCQkJcHJpbnRvcHRpb25zKHNldCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpID0gb3B0aW9uKGdvLm9wdGFyZyk7CisJCQlpZiAoKGVudW0gc2hfZmxhZylpID09IEZBUkM0UkFORE9NKSB7CisJCQkJd2FybmluZ2YodHJ1ZSwgIkRvIG5vdCB1c2Ugc2V0IMKxbyBhcmM0cmFuZG9tLCIKKwkJCQkgICAgIiBpdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgdmVyc2lvbiIKKwkJCQkgICAgIiBvZiBta3NoISIpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiAoKGkgIT0gKHNpemVfdCktMSkgJiYgc2V0ID09IEZsYWcoaSkpCisJCQkJLyogRG9uJ3QgY2hlY2sgdGhlIGNvbnRleHQgaWYgdGhlIGZsYWcKKwkJCQkgKiBpc24ndCBjaGFuZ2luZyAtIG1ha2VzICJzZXQgLW8gaW50ZXJhY3RpdmUiCisJCQkJICogd29yayBpZiB5b3UncmUgYWxyZWFkeSBpbnRlcmFjdGl2ZS4gTmVlZGVkCisJCQkJICogaWYgdGhlIG91dHB1dCBvZiAic2V0ICtvIiBpcyB0byBiZSB1c2VkLgorCQkJCSAqLworCQkJCTsKKwkJCWVsc2UgaWYgKChpICE9IChzaXplX3QpLTEpICYmIChvcHRpb25zW2ldLmZsYWdzICYgd2hhdCkpCisJCQkJY2hhbmdlX2ZsYWcoKGVudW0gc2hfZmxhZylpLCB3aGF0LCBzZXQpOworCQkJZWxzZSB7CisJCQkJYmlfZXJyb3JmKCIlczogYmFkIG9wdGlvbiIsIGdvLm9wdGFyZyk7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQlicmVhazsKKworI2lmICFkZWZpbmVkKE1LU0hfU01BTEwpIHx8IGRlZmluZWQoVElPQ1NDVFRZKQorCQljYXNlICdUJzoKKwkJCWlmICh3aGF0ICE9IE9GX0ZJUlNUVElNRSkKKwkJCQlicmVhazsKKyNpZm5kZWYgVElPQ1NDVFRZCisJCQllcnJvcmYoIm5vIFRJT0NTQ1RUWSBpb2N0bCIpOworI2Vsc2UKKwkJCWNoYW5nZV9mbGFnKEZUQUxLSU5HLCBPRl9DTURMSU5FLCAxKTsKKwkJCWNodnQoZ28ub3B0YXJnKTsKKwkJCWJyZWFrOworI2VuZGlmCisjZW5kaWYKKworCQljYXNlICc/JzoKKwkJCXJldHVybiAoLTEpOworCisJCWRlZmF1bHQ6CisJCQlpZiAod2hhdCA9PSBPRl9GSVJTVFRJTUUpCisJCQkJYnJlYWs7CisJCQkvKiAtczogc29ydCBwb3NpdGlvbmFsIHBhcmFtcyAoQVQmVCBrc2ggc3R1cGlkaXR5KSAqLworCQkJaWYgKHdoYXQgPT0gT0ZfU0VUICYmIG9wdGMgPT0gJ3MnKSB7CisJCQkJc29ydGFyZ3MgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJZm9yIChpID0gMDsgaSA8IE5FTEVNKG9wdGlvbnMpOyBpKyspCisJCQkJaWYgKG9wdGMgPT0gb3B0aW9uc1tpXS5jICYmCisJCQkJICAgICh3aGF0ICYgb3B0aW9uc1tpXS5mbGFncykpIHsKKwkJCQkJY2hhbmdlX2ZsYWcoKGVudW0gc2hfZmxhZylpLCB3aGF0LCBzZXQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQlpZiAoaSA9PSBORUxFTShvcHRpb25zKSkKKwkJCQlpbnRlcm5hbF9lcnJvcmYoInBhcnNlX2FyZ3M6ICclYyciLCBvcHRjKTsKKwkJfQorCX0KKwlpZiAoIShnby5pbmZvICYgR0lfTUlOVVNNSU5VUykgJiYgYXJndltnby5vcHRpbmRdICYmCisJICAgIChhcmd2W2dvLm9wdGluZF1bMF0gPT0gJy0nIHx8IGFyZ3ZbZ28ub3B0aW5kXVswXSA9PSAnKycpICYmCisJICAgIGFyZ3ZbZ28ub3B0aW5kXVsxXSA9PSAnXDAnKSB7CisJCS8qIGxvbmUgLSBjbGVhcnMgLXYgYW5kIC14IGZsYWdzICovCisJCWlmIChhcmd2W2dvLm9wdGluZF1bMF0gPT0gJy0nKQorCQkJRmxhZyhGVkVSQk9TRSkgPSBGbGFnKEZYVFJBQ0UpID0gMDsKKwkJLyogc2V0IHNraXBzIGxvbmUgLSBvciArIG9wdGlvbiAqLworCQlnby5vcHRpbmQrKzsKKwl9CisJaWYgKHNldGFyZ3NwKQorCQkvKiAtLSBtZWFucyBzZXQgJCMvJCogZXZlbiBpZiB0aGVyZSBhcmUgbm8gYXJndW1lbnRzICovCisJCSpzZXRhcmdzcCA9ICFhcnJheXNldCAmJiAoKGdvLmluZm8gJiBHSV9NSU5VU01JTlVTKSB8fAorCQkgICAgYXJndltnby5vcHRpbmRdKTsKKworCWlmIChhcnJheXNldCAmJiAoISphcnJheSB8fCAqc2tpcF92YXJuYW1lKGFycmF5LCBmYWxzZSkpKSB7CisJCWJpX2Vycm9yZigiJXM6IGlzIG5vdCBhbiBpZGVudGlmaWVyIiwgYXJyYXkpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYgKHNvcnRhcmdzKSB7CisJCWZvciAoaSA9IGdvLm9wdGluZDsgYXJndltpXTsgaSsrKQorCQkJOworCQlxc29ydCgmYXJndltnby5vcHRpbmRdLCBpIC0gZ28ub3B0aW5kLCBzaXplb2Yodm9pZCAqKSwKKwkJICAgIHhzdHJjbXApOworCX0KKwlpZiAoYXJyYXlzZXQpCisJCWdvLm9wdGluZCArPSBzZXRfYXJyYXkoYXJyYXksIGFycmF5c2V0ID4gMCA/IHRydWUgOiBmYWxzZSwKKwkJICAgIGFyZ3YgKyBnby5vcHRpbmQpOworCisJcmV0dXJuIChnby5vcHRpbmQpOworfQorCisvKiBwYXJzZSBhIGRlY2ltYWwgbnVtYmVyOiByZXR1cm5zIDAgaWYgc3RyaW5nIGlzbid0IGEgbnVtYmVyLCAxIG90aGVyd2lzZSAqLworaW50CitnZXRuKGNvbnN0IGNoYXIgKnMsIGludCAqYWkpCit7CisJaW50IGksIGMsIHJ2ID0gMDsKKwlib29sIG5lZyA9IGZhbHNlOworCisJZG8geworCQljID0gKnMrKzsKKwl9IHdoaWxlIChrc2hfaXNzcGFjZShjKSk7CisJaWYgKGMgPT0gJy0nKSB7CisJCW5lZyA9IHRydWU7CisJCWMgPSAqcysrOworCX0gZWxzZSBpZiAoYyA9PSAnKycpCisJCWMgPSAqcysrOworCSphaSA9IGkgPSAwOworCWRvIHsKKwkJaWYgKCFrc2hfaXNkaWdpdChjKSkKKwkJCWdvdG8gZ2V0bl9vdXQ7CisJCWkgKj0gMTA7CisJCWlmIChpIDwgKmFpKQorCQkJLyogb3ZlcmZsb3cgKi8KKwkJCWdvdG8gZ2V0bl9vdXQ7CisJCWkgKz0gYyAtICcwJzsKKwkJKmFpID0gaTsKKwl9IHdoaWxlICgoYyA9ICpzKyspKTsKKwlydiA9IDE7CisKKyBnZXRuX291dDoKKwlpZiAobmVnKQorCQkqYWkgPSAtKmFpOworCXJldHVybiAocnYpOworfQorCisvKiBnZXRuKCkgdGhhdCBwcmludHMgZXJyb3IgKi8KK2ludAorYmlfZ2V0bihjb25zdCBjaGFyICphcywgaW50ICphaSkKK3sKKwlpbnQgcnY7CisKKwlpZiAoIShydiA9IGdldG4oYXMsIGFpKSkpCisJCWJpX2Vycm9yZigiJXM6IGJhZCBudW1iZXIiLCBhcyk7CisJcmV0dXJuIChydik7Cit9CisKKy8qIC0tLS0tLS0tIGdtYXRjaC5jIC0tLS0tLS0tICovCisKKy8qCisgKiBpbnQgZ21hdGNoKHN0cmluZywgcGF0dGVybikKKyAqIGNoYXIgKnN0cmluZywgKnBhdHRlcm47CisgKgorICogTWF0Y2ggYSBwYXR0ZXJuIGFzIGluIHNoKDEpLgorICogcGF0dGVybiBjaGFyYWN0ZXIgYXJlIHByZWZpeGVkIHdpdGggTUFHSUMgYnkgZXhwYW5kLgorICovCisKK2ludAorZ21hdGNoeChjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpwLCBib29sIGlzZmlsZSkKK3sKKwljb25zdCBjaGFyICpzZSwgKnBlOworCisJaWYgKHMgPT0gTlVMTCB8fCBwID09IE5VTEwpCisJCXJldHVybiAoMCk7CisKKwlzZSA9IHMgKyBzdHJsZW4ocyk7CisJcGUgPSBwICsgc3RybGVuKHApOworCS8qIGlzZmlsZSBpcyBmYWxzZSBpZmYgbm8gc3ludGF4IGNoZWNrIGhhcyBiZWVuIGRvbmUgb24KKwkgKiB0aGUgcGF0dGVybi4gSWYgY2hlY2sgZmFpbHMsIGp1c3QgdG8gYSBzdHJjbXAoKS4KKwkgKi8KKwlpZiAoIWlzZmlsZSAmJiAhaGFzX2dsb2JiaW5nKHAsIHBlKSkgeworCQlzaXplX3QgbGVuID0gcGUgLSBwICsgMTsKKwkJY2hhciB0YnVmWzY0XTsKKwkJY2hhciAqdCA9IGxlbiA8PSBzaXplb2YodGJ1ZikgPyB0YnVmIDogYWxsb2MobGVuLCBBVEVNUCk7CisJCWRlYnVuayh0LCBwLCBsZW4pOworCQlyZXR1cm4gKCFzdHJjbXAodCwgcykpOworCX0KKwlyZXR1cm4gKGRvX2dtYXRjaCgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBzLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBzZSwKKwkgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcGUpKTsKK30KKworLyogUmV0dXJucyBpZiBwIGlzIGEgc3ludGFjdGljbHkgY29ycmVjdCBnbG9iYmluZyBwYXR0ZXJuLCBmYWxzZQorICogaWYgaXQgY29udGFpbnMgbm8gcGF0dGVybiBjaGFyYWN0ZXJzIG9yIGlmIHRoZXJlIGlzIGEgc3ludGF4IGVycm9yLgorICogU3ludGF4IGVycm9ycyBhcmU6CisgKgktIFsgd2l0aCBubyBjbG9zaW5nIF0KKyAqCS0gaW1iYWxhbmNlZCAkKC4uLikgZXhwcmVzc2lvbgorICoJLSBbLi4uXSBhbmQgKiguLi4pIG5vdCBuZXN0ZWQgKGVnLCBbYSQoYnxdYyksICooYVtifGNdZCkpCisgKi8KKy8qWFhYCistIGlmIG5vIG1hZ2ljLAorCWlmIGRlc3QgZ2l2ZW4sIGNvcHkgdG8gZHN0CisJcmV0dXJuID8KKy0gaWYgbWFnaWMgJiYgKG5vIGdsb2JiaW5nIHx8IHN5bnRheCBlcnJvcikKKwlkZWJ1bmsgdG8gZHN0CisJcmV0dXJuID8KKy0gcmV0dXJuID8KKyovCitpbnQKK2hhc19nbG9iYmluZyhjb25zdCBjaGFyICp4cCwgY29uc3QgY2hhciAqeHBlKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSB4cDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwZSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHhwZTsKKwlpbnQgYzsKKwlpbnQgbmVzdCA9IDAsIGJuZXN0ID0gMDsKKwlpbnQgc2F3X2dsb2IgPSAwOworCWludCBpbl9icmFja2V0ID0gMDsgLyogaW5zaWRlIFsuLi5dICovCisKKwlmb3IgKDsgcCA8IHBlOyBwKyspIHsKKwkJaWYgKCFJU01BR0lDKCpwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGMgPSAqKytwKSA9PSAnKicgfHwgYyA9PSAnPycpCisJCQlzYXdfZ2xvYiA9IDE7CisJCWVsc2UgaWYgKGMgPT0gJ1snKSB7CisJCQlpZiAoIWluX2JyYWNrZXQpIHsKKwkJCQlzYXdfZ2xvYiA9IDE7CisJCQkJaW5fYnJhY2tldCA9IDE7CisJCQkJaWYgKElTTUFHSUMocFsxXSkgJiYgcFsyXSA9PSBOT1QpCisJCQkJCXAgKz0gMjsKKwkJCQlpZiAoSVNNQUdJQyhwWzFdKSAmJiBwWzJdID09ICddJykKKwkJCQkJcCArPSAyOworCQkJfQorCQkJLyogWFhYIERvIHdlIG5lZWQgdG8gY2hlY2sgcmFuZ2VzIGhlcmU/IFBPU0lYIFEgKi8KKwkJfSBlbHNlIGlmIChjID09ICddJykgeworCQkJaWYgKGluX2JyYWNrZXQpIHsKKwkJCQlpZiAoYm5lc3QpCQkvKiBbYSooYl0pICovCisJCQkJCXJldHVybiAoMCk7CisJCQkJaW5fYnJhY2tldCA9IDA7CisJCQl9CisJCX0gZWxzZSBpZiAoKGMgJiAweDgwKSAmJiB2c3RyY2hyKCIqKz9AISAiLCBjICYgMHg3ZikpIHsKKwkJCXNhd19nbG9iID0gMTsKKwkJCWlmIChpbl9icmFja2V0KQorCQkJCWJuZXN0Kys7CisJCQllbHNlCisJCQkJbmVzdCsrOworCQl9IGVsc2UgaWYgKGMgPT0gJ3wnKSB7CisJCQlpZiAoaW5fYnJhY2tldCAmJiAhYm5lc3QpCS8qICooYVtmb298YmFyXSkgKi8KKwkJCQlyZXR1cm4gKDApOworCQl9IGVsc2UgaWYgKGMgPT0gLyooKi8gJyknKSB7CisJCQlpZiAoaW5fYnJhY2tldCkgeworCQkJCWlmICghYm5lc3QtLSkJCS8qICooYVtiKWNdICovCisJCQkJCXJldHVybiAoMCk7CisJCQl9IGVsc2UgaWYgKG5lc3QpCisJCQkJbmVzdC0tOworCQl9CisJCS8qCisJCSAqIGVsc2UgbXVzdCBiZSBhIE1BR0lDLU1BR0lDLCBvciBNQUdJQy0hLAorCQkgKiBNQUdJQy0tLCBNQUdJQy1dLCBNQUdJQy17LCBNQUdJQy0sIE1BR0lDLX0KKwkJICovCisJfQorCXJldHVybiAoc2F3X2dsb2IgJiYgIWluX2JyYWNrZXQgJiYgIW5lc3QpOworfQorCisvKiBGdW5jdGlvbiBtdXN0IHJldHVybiBlaXRoZXIgMCBvciAxIChhc3N1bWVkIGJ5IGNvZGUgZm9yIDB4ODB8JyEnKSAqLworc3RhdGljIGludAorZG9fZ21hdGNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlKQoreworCWludCBzYywgcGM7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHJlc3QsICpwc3ViLCAqcG5leHQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc3Jlc3Q7CisKKwlpZiAocyA9PSBOVUxMIHx8IHAgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwl3aGlsZSAocCA8IHBlKSB7CisJCXBjID0gKnArKzsKKwkJc2MgPSBzIDwgc2UgPyAqcyA6ICdcMCc7CisJCXMrKzsKKwkJaWYgKCFJU01BR0lDKHBjKSkgeworCQkJaWYgKHNjICE9IHBjKQorCQkJCXJldHVybiAoMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlzd2l0Y2ggKCpwKyspIHsKKwkJY2FzZSAnWyc6CisJCQlpZiAoc2MgPT0gMCB8fCAocCA9IGNjbGFzcyhwLCBzYykpID09IE5VTEwpCisJCQkJcmV0dXJuICgwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJz8nOgorCQkJaWYgKHNjID09IDApCisJCQkJcmV0dXJuICgwKTsKKwkJCWlmIChVVEZNT0RFKSB7CisJCQkJLS1zOworCQkJCXMgKz0gdXRmX3B0cmFkaigoY29uc3Qgdm9pZCAqKXMpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnKic6CisJCQlpZiAocCA9PSBwZSkKKwkJCQlyZXR1cm4gKDEpOworCQkJcy0tOworCQkJZG8geworCQkJCWlmIChkb19nbWF0Y2gocywgc2UsIHAsIHBlKSkKKwkJCQkJcmV0dXJuICgxKTsKKwkJCX0gd2hpbGUgKHMrKyA8IHNlKTsKKwkJCXJldHVybiAoMCk7CisKKwkJLyoqCisJCSAqIFsqKz9AIV0ocGF0dGVybnxwYXR0ZXJufC4uKQorCQkgKiBUaGlzIGlzIGFsc28gbmVlZGVkIGZvciAkey4uJS4ufSwgZXRjLgorCQkgKi8KKwkJY2FzZSAweDgwfCcrJzogLyogbWF0Y2hlcyBvbmUgb3IgbW9yZSB0aW1lcyAqLworCQljYXNlIDB4ODB8JyonOiAvKiBtYXRjaGVzIHplcm8gb3IgbW9yZSB0aW1lcyAqLworCQkJaWYgKCEocHJlc3QgPSBwYXRfc2NhbihwLCBwZSwgMCkpKQorCQkJCXJldHVybiAoMCk7CisJCQlzLS07CisJCQkvKiB0YWtlIGNhcmUgb2YgemVybyBtYXRjaGVzICovCisJCQlpZiAocFstMV0gPT0gKDB4ODAgfCAnKicpICYmCisJCQkgICAgZG9fZ21hdGNoKHMsIHNlLCBwcmVzdCwgcGUpKQorCQkJCXJldHVybiAoMSk7CisJCQlmb3IgKHBzdWIgPSBwOyA7IHBzdWIgPSBwbmV4dCkgeworCQkJCXBuZXh0ID0gcGF0X3NjYW4ocHN1YiwgcGUsIDEpOworCQkJCWZvciAoc3Jlc3QgPSBzOyBzcmVzdCA8PSBzZTsgc3Jlc3QrKykgeworCQkJCQlpZiAoZG9fZ21hdGNoKHMsIHNyZXN0LCBwc3ViLCBwbmV4dCAtIDIpICYmCisJCQkJCSAgICAoZG9fZ21hdGNoKHNyZXN0LCBzZSwgcHJlc3QsIHBlKSB8fAorCQkJCQkgICAgKHMgIT0gc3Jlc3QgJiYgZG9fZ21hdGNoKHNyZXN0LAorCQkJCQkgICAgc2UsIHAgLSAyLCBwZSkpKSkKKwkJCQkJCXJldHVybiAoMSk7CisJCQkJfQorCQkJCWlmIChwbmV4dCA9PSBwcmVzdCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlyZXR1cm4gKDApOworCisJCWNhc2UgMHg4MHwnPyc6IC8qIG1hdGNoZXMgemVybyBvciBvbmNlICovCisJCWNhc2UgMHg4MHwnQCc6IC8qIG1hdGNoZXMgb25lIG9mIHRoZSBwYXR0ZXJucyAqLworCQljYXNlIDB4ODB8JyAnOiAvKiBzaW1pbGUgZm9yIEAgKi8KKwkJCWlmICghKHByZXN0ID0gcGF0X3NjYW4ocCwgcGUsIDApKSkKKwkJCQlyZXR1cm4gKDApOworCQkJcy0tOworCQkJLyogVGFrZSBjYXJlIG9mIHplcm8gbWF0Y2hlcyAqLworCQkJaWYgKHBbLTFdID09ICgweDgwIHwgJz8nKSAmJgorCQkJICAgIGRvX2dtYXRjaChzLCBzZSwgcHJlc3QsIHBlKSkKKwkJCQlyZXR1cm4gKDEpOworCQkJZm9yIChwc3ViID0gcDsgOyBwc3ViID0gcG5leHQpIHsKKwkJCQlwbmV4dCA9IHBhdF9zY2FuKHBzdWIsIHBlLCAxKTsKKwkJCQlzcmVzdCA9IHByZXN0ID09IHBlID8gc2UgOiBzOworCQkJCWZvciAoOyBzcmVzdCA8PSBzZTsgc3Jlc3QrKykgeworCQkJCQlpZiAoZG9fZ21hdGNoKHMsIHNyZXN0LCBwc3ViLCBwbmV4dCAtIDIpICYmCisJCQkJCSAgICBkb19nbWF0Y2goc3Jlc3QsIHNlLCBwcmVzdCwgcGUpKQorCQkJCQkJcmV0dXJuICgxKTsKKwkJCQl9CisJCQkJaWYgKHBuZXh0ID09IHByZXN0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisKKwkJY2FzZSAweDgwfCchJzogLyogbWF0Y2hlcyBub25lIG9mIHRoZSBwYXR0ZXJucyAqLworCQkJaWYgKCEocHJlc3QgPSBwYXRfc2NhbihwLCBwZSwgMCkpKQorCQkJCXJldHVybiAoMCk7CisJCQlzLS07CisJCQlmb3IgKHNyZXN0ID0gczsgc3Jlc3QgPD0gc2U7IHNyZXN0KyspIHsKKwkJCQlpbnQgbWF0Y2hlZCA9IDA7CisKKwkJCQlmb3IgKHBzdWIgPSBwOyA7IHBzdWIgPSBwbmV4dCkgeworCQkJCQlwbmV4dCA9IHBhdF9zY2FuKHBzdWIsIHBlLCAxKTsKKwkJCQkJaWYgKGRvX2dtYXRjaChzLCBzcmVzdCwgcHN1YiwKKwkJCQkJICAgIHBuZXh0IC0gMikpIHsKKwkJCQkJCW1hdGNoZWQgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKHBuZXh0ID09IHByZXN0KQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICghbWF0Y2hlZCAmJgorCQkJCSAgICBkb19nbWF0Y2goc3Jlc3QsIHNlLCBwcmVzdCwgcGUpKQorCQkJCQlyZXR1cm4gKDEpOworCQkJfQorCQkJcmV0dXJuICgwKTsKKworCQlkZWZhdWx0OgorCQkJaWYgKHNjICE9IHBbLTFdKQorCQkJCXJldHVybiAoMCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKHMgPT0gc2UpOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqCitjY2xhc3MoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgaW50IHN1YikKK3sKKwlpbnQgYywgZCwgbm90cCwgZm91bmQgPSAwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm9yaWdfcCA9IHA7CisKKwlpZiAoKG5vdHAgPSAoSVNNQUdJQygqcCkgJiYgKisrcCA9PSBOT1QpKSkKKwkJcCsrOworCWRvIHsKKwkJYyA9ICpwKys7CisJCWlmIChJU01BR0lDKGMpKSB7CisJCQljID0gKnArKzsKKwkJCWlmICgoYyAmIDB4ODApICYmICFJU01BR0lDKGMpKSB7CisJCQkJYyAmPSAweDdmOy8qIGV4dGVuZGVkIHBhdHRlcm4gbWF0Y2hpbmc6ICorP0AhICovCisJCQkJLyogWFhYIHRoZSAoIGNoYXIgaXNuJ3QgaGFuZGxlZCBhcyBwYXJ0IG9mIFtdICovCisJCQkJaWYgKGMgPT0gJyAnKSAvKiBzaW1pbGUgZm9yIEA6IHBsYWluICguLikgKi8KKwkJCQkJYyA9ICcoJyAvKikqLzsKKwkJCX0KKwkJfQorCQlpZiAoYyA9PSAnXDAnKQorCQkJLyogTm8gY2xvc2luZyBdIC0gYWN0IGFzIGlmIHRoZSBvcGVuaW5nIFsgd2FzIHF1b3RlZCAqLworCQkJcmV0dXJuIChzdWIgPT0gJ1snID8gb3JpZ19wIDogTlVMTCk7CisJCWlmIChJU01BR0lDKHBbMF0pICYmIHBbMV0gPT0gJy0nICYmCisJCSAgICAoIUlTTUFHSUMocFsyXSkgfHwgcFszXSAhPSAnXScpKSB7CisJCQlwICs9IDI7IC8qIE1BR0lDLSAqLworCQkJZCA9ICpwKys7CisJCQlpZiAoSVNNQUdJQyhkKSkgeworCQkJCWQgPSAqcCsrOworCQkJCWlmICgoZCAmIDB4ODApICYmICFJU01BR0lDKGQpKQorCQkJCQlkICY9IDB4N2Y7CisJCQl9CisJCQkvKiBQT1NJWCBzYXlzIHRoaXMgaXMgYW4gaW52YWxpZCBleHByZXNzaW9uICovCisJCQlpZiAoYyA+IGQpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJfSBlbHNlCisJCQlkID0gYzsKKwkJaWYgKGMgPT0gc3ViIHx8IChjIDw9IHN1YiAmJiBzdWIgPD0gZCkpCisJCQlmb3VuZCA9IDE7CisJfSB3aGlsZSAoIShJU01BR0lDKHBbMF0pICYmIHBbMV0gPT0gJ10nKSk7CisKKwlyZXR1cm4gKChmb3VuZCAhPSBub3RwKSA/IHArMiA6IE5VTEwpOworfQorCisvKiBMb29rIGZvciBuZXh0ICkgb3IgfCAoaWYgbWF0Y2hfc2VwKSBpbiAqKGZvb3xiYXIpIHBhdHRlcm4gKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgKgorcGF0X3NjYW4oY29uc3QgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcGUsIGludCBtYXRjaF9zZXApCit7CisJaW50IG5lc3QgPSAwOworCisJZm9yICg7IHAgPCBwZTsgcCsrKSB7CisJCWlmICghSVNNQUdJQygqcCkpCisJCQljb250aW51ZTsKKwkJaWYgKCgqKytwID09IC8qKCovICcpJyAmJiBuZXN0LS0gPT0gMCkgfHwKKwkJICAgICgqcCA9PSAnfCcgJiYgbWF0Y2hfc2VwICYmIG5lc3QgPT0gMCkpCisJCQlyZXR1cm4gKHAgKyAxKTsKKwkJaWYgKCgqcCAmIDB4ODApICYmIHZzdHJjaHIoIiorP0AhICIsICpwICYgMHg3ZikpCisJCQluZXN0Kys7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK2ludAoreHN0cmNtcChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisJcmV0dXJuIChzdHJjbXAoKihjb25zdCBjaGFyICogY29uc3QgKilwMSwgKihjb25zdCBjaGFyICogY29uc3QgKilwMikpOworfQorCisvKiBJbml0aWFsaXNlIGEgR2V0b3B0IHN0cnVjdHVyZSAqLwordm9pZAora3NoX2dldG9wdF9yZXNldChHZXRvcHQgKmdvLCBpbnQgZmxhZ3MpCit7CisJZ28tPm9wdGluZCA9IDE7CisJZ28tPm9wdGFyZyA9IE5VTEw7CisJZ28tPnAgPSAwOworCWdvLT5mbGFncyA9IGZsYWdzOworCWdvLT5pbmZvID0gMDsKKwlnby0+YnVmWzFdID0gJ1wwJzsKK30KKworCisvKiBnZXRvcHQoKSB1c2VkIGZvciBzaGVsbCBidWlsdC1pbiBjb21tYW5kcywgdGhlIGdldG9wdHMgY29tbWFuZCwgYW5kCisgKiBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAqIEEgbGVhZGluZyAnOicgaW4gb3B0aW9ucyBtZWFucyBkb24ndCBwcmludCBlcnJvcnMsIGluc3RlYWQgcmV0dXJuICc/JworICogb3IgJzonIGFuZCBzZXQgZ28tPm9wdGFyZyB0byB0aGUgb2ZmZW5kaW5nIG9wdGlvbiBjaGFyYWN0ZXIuCisgKiBJZiBHRl9FUlJPUiBpcyBzZXQgKGFuZCBvcHRpb24gZG9lc24ndCBzdGFydCB3aXRoIDopLCBlcnJvcnMgcmVzdWx0IGluCisgKiBhIGNhbGwgdG8gYmlfZXJyb3JmKCkuCisgKgorICogTm9uLXN0YW5kYXJkIGZlYXR1cmVzOgorICoJLSAnOycgaXMgbGlrZSAnOicgaW4gb3B0aW9ucywgZXhjZXB0IHRoZSBhcmd1bWVudCBpcyBvcHRpb25hbAorICoJICAoaWYgaXQgaXNuJ3QgcHJlc2VudCwgb3B0YXJnIGlzIHNldCB0byAwKS4KKyAqCSAgVXNlZCBmb3IgJ3NldCAtbycuCisgKgktICcsJyBpcyBsaWtlICc6JyBpbiBvcHRpb25zLCBleGNlcHQgdGhlIGFyZ3VtZW50IGFsd2F5cyBpbW1lZGlhdGVseQorICoJICBmb2xsb3dzIHRoZSBvcHRpb24gY2hhcmFjdGVyIChvcHRhcmcgaXMgc2V0IHRvIHRoZSBudWxsIHN0cmluZyBpZgorICoJICB0aGUgb3B0aW9uIGlzIG1pc3NpbmcpLgorICoJICBVc2VkIGZvciAncmVhZCAtdTInLCAncHJpbnQgLXUyJyBhbmQgZmMgLTQwLgorICoJLSAnIycgaXMgbGlrZSAnOicgaW4gb3B0aW9ucywgZXhwZWN0IHRoYXQgdGhlIGFyZ3VtZW50IGlzIG9wdGlvbmFsCisgKgkgIGFuZCBtdXN0IHN0YXJ0IHdpdGggYSBkaWdpdC4gSWYgdGhlIGFyZ3VtZW50IGRvZXNuJ3Qgc3RhcnQgd2l0aCBhCisgKgkgIGRpZ2l0LCBpdCBpcyBhc3N1bWVkIHRvIGJlIG1pc3NpbmcgYW5kIG5vcm1hbCBvcHRpb24gcHJvY2Vzc2luZworICoJICBjb250aW51ZXMgKG9wdGFyZyBpcyBzZXQgdG8gMCBpZiB0aGUgb3B0aW9uIGlzIG1pc3NpbmcpLgorICoJICBVc2VkIGZvciAndHlwZXNldCAtTFo0Jy4KKyAqCS0gYWNjZXB0cyArYyBhcyB3ZWxsIGFzIC1jIElGIHRoZSBHRl9QTFVTT1BUIGZsYWcgaXMgcHJlc2VudC4gSWYgYW4KKyAqCSAgb3B0aW9uIHN0YXJ0aW5nIHdpdGggKyBpcyBhY2NlcHRlZCwgdGhlIEdJX1BMVVMgZmxhZyB3aWxsIGJlIHNldAorICoJICBpbiBnby0+aW5mby4KKyAqLworaW50Citrc2hfZ2V0b3B0KGNvbnN0IGNoYXIgKiphcmd2LCBHZXRvcHQgKmdvLCBjb25zdCBjaGFyICpvcHRpb25zcCkKK3sKKwljaGFyIGM7CisJY29uc3QgY2hhciAqbzsKKworCWlmIChnby0+cCA9PSAwIHx8IChjID0gYXJndltnby0+b3B0aW5kIC0gMV1bZ28tPnBdKSA9PSAnXDAnKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbZ28tPm9wdGluZF0sIGZsYWcgPSBhcmcgPyAqYXJnIDogJ1wwJzsKKworCQlnby0+cCA9IDE7CisJCWlmIChmbGFnID09ICctJyAmJiBhcmdbMV0gPT0gJy0nICYmIGFyZ1syXSA9PSAnXDAnKSB7CisJCQlnby0+b3B0aW5kKys7CisJCQlnby0+cCA9IDA7CisJCQlnby0+aW5mbyB8PSBHSV9NSU5VU01JTlVTOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJaWYgKGFyZyA9PSBOVUxMIHx8CisJCSAgICAoKGZsYWcgIT0gJy0nICkgJiYgLyogbmVpdGhlciBhIC0gbm9yIGEgKyAoaWYgKyBhbGxvd2VkKSAqLworCQkgICAgKCEoZ28tPmZsYWdzICYgR0ZfUExVU09QVCkgfHwgZmxhZyAhPSAnKycpKSB8fAorCQkgICAgKGMgPSBhcmdbMV0pID09ICdcMCcpIHsKKwkJCWdvLT5wID0gMDsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCWdvLT5vcHRpbmQrKzsKKwkJZ28tPmluZm8gJj0gfihHSV9NSU5VU3xHSV9QTFVTKTsKKwkJZ28tPmluZm8gfD0gZmxhZyA9PSAnLScgPyBHSV9NSU5VUyA6IEdJX1BMVVM7CisJfQorCWdvLT5wKys7CisJaWYgKGMgPT0gJz8nIHx8IGMgPT0gJzonIHx8IGMgPT0gJzsnIHx8IGMgPT0gJywnIHx8IGMgPT0gJyMnIHx8CisJICAgICEobyA9IGNzdHJjaHIob3B0aW9uc3AsIGMpKSkgeworCQlpZiAob3B0aW9uc3BbMF0gPT0gJzonKSB7CisJCQlnby0+YnVmWzBdID0gYzsKKwkJCWdvLT5vcHRhcmcgPSBnby0+YnVmOworCQl9IGVsc2UgeworCQkJd2FybmluZ2YodHJ1ZSwgIiVzJXMtJWM6IHVua25vd24gb3B0aW9uIiwKKwkJCSAgICAoZ28tPmZsYWdzICYgR0ZfTk9OQU1FKSA/ICIiIDogYXJndlswXSwKKwkJCSAgICAoZ28tPmZsYWdzICYgR0ZfTk9OQU1FKSA/ICIiIDogIjogIiwgYyk7CisJCQlpZiAoZ28tPmZsYWdzICYgR0ZfRVJST1IpCisJCQkJYmlfZXJyb3JmeigpOworCQl9CisJCXJldHVybiAoJz8nKTsKKwl9CisJLyogOiBtZWFucyBhcmd1bWVudCBtdXN0IGJlIHByZXNlbnQsIG1heSBiZSBwYXJ0IG9mIG9wdGlvbiBhcmd1bWVudAorCSAqICAgb3IgdGhlIG5leHQgYXJndW1lbnQKKwkgKiA7IHNhbWUgYXMgOiBidXQgYXJndW1lbnQgbWF5IGJlIG1pc3NpbmcKKwkgKiAsIG1lYW5zIGFyZ3VtZW50IGlzIHBhcnQgb2Ygb3B0aW9uIGFyZ3VtZW50LCBhbmQgbWF5IGJlIG51bGwuCisJICovCisJaWYgKCorK28gPT0gJzonIHx8ICpvID09ICc7JykgeworCQlpZiAoYXJndltnby0+b3B0aW5kIC0gMV1bZ28tPnBdKQorCQkJZ28tPm9wdGFyZyA9IGFyZ3ZbZ28tPm9wdGluZCAtIDFdICsgZ28tPnA7CisJCWVsc2UgaWYgKGFyZ3ZbZ28tPm9wdGluZF0pCisJCQlnby0+b3B0YXJnID0gYXJndltnby0+b3B0aW5kKytdOworCQllbHNlIGlmICgqbyA9PSAnOycpCisJCQlnby0+b3B0YXJnID0gTlVMTDsKKwkJZWxzZSB7CisJCQlpZiAob3B0aW9uc3BbMF0gPT0gJzonKSB7CisJCQkJZ28tPmJ1ZlswXSA9IGM7CisJCQkJZ28tPm9wdGFyZyA9IGdvLT5idWY7CisJCQkJcmV0dXJuICgnOicpOworCQkJfQorCQkJd2FybmluZ2YodHJ1ZSwgIiVzJXMtJyVjJyByZXF1aXJlcyBhcmd1bWVudCIsCisJCQkgICAgKGdvLT5mbGFncyAmIEdGX05PTkFNRSkgPyAiIiA6IGFyZ3ZbMF0sCisJCQkgICAgKGdvLT5mbGFncyAmIEdGX05PTkFNRSkgPyAiIiA6ICI6ICIsIGMpOworCQkJaWYgKGdvLT5mbGFncyAmIEdGX0VSUk9SKQorCQkJCWJpX2Vycm9yZnooKTsKKwkJCXJldHVybiAoJz8nKTsKKwkJfQorCQlnby0+cCA9IDA7CisJfSBlbHNlIGlmICgqbyA9PSAnLCcpIHsKKwkJLyogYXJndW1lbnQgaXMgYXR0YWNoZWQgdG8gb3B0aW9uIGNoYXJhY3RlciwgZXZlbiBpZiBudWxsICovCisJCWdvLT5vcHRhcmcgPSBhcmd2W2dvLT5vcHRpbmQgLSAxXSArIGdvLT5wOworCQlnby0+cCA9IDA7CisJfSBlbHNlIGlmICgqbyA9PSAnIycpIHsKKwkJLyogYXJndW1lbnQgaXMgb3B0aW9uYWwgYW5kIG1heSBiZSBhdHRhY2hlZCBvciB1bmF0dGFjaGVkCisJCSAqIGJ1dCBtdXN0IHN0YXJ0IHdpdGggYSBkaWdpdC4gb3B0YXJnIGlzIHNldCB0byAwIGlmIHRoZQorCQkgKiBhcmd1bWVudCBpcyBtaXNzaW5nLgorCQkgKi8KKwkJaWYgKGFyZ3ZbZ28tPm9wdGluZCAtIDFdW2dvLT5wXSkgeworCQkJaWYgKGtzaF9pc2RpZ2l0KGFyZ3ZbZ28tPm9wdGluZCAtIDFdW2dvLT5wXSkpIHsKKwkJCQlnby0+b3B0YXJnID0gYXJndltnby0+b3B0aW5kIC0gMV0gKyBnby0+cDsKKwkJCQlnby0+cCA9IDA7CisJCQl9IGVsc2UKKwkJCQlnby0+b3B0YXJnID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWlmIChhcmd2W2dvLT5vcHRpbmRdICYmIGtzaF9pc2RpZ2l0KGFyZ3ZbZ28tPm9wdGluZF1bMF0pKSB7CisJCQkJZ28tPm9wdGFyZyA9IGFyZ3ZbZ28tPm9wdGluZCsrXTsKKwkJCQlnby0+cCA9IDA7CisJCQl9IGVsc2UKKwkJCQlnby0+b3B0YXJnID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gKGMpOworfQorCisvKiBwcmludCB2YXJpYWJsZS9hbGlhcyB2YWx1ZSB1c2luZyBuZWNlc3NhcnkgcXVvdGVzCisgKiAoUE9TSVggc2F5cyB0aGV5IHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgcmUtZW50cnkuLi4pCisgKiBObyB0cmFpbGluZyBuZXdsaW5lIGlzIHByaW50ZWQuCisgKi8KK3ZvaWQKK3ByaW50X3ZhbHVlX3F1b3RlZChjb25zdCBjaGFyICpzKQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IGlucXVvdGUgPSAwOworCisJLyogVGVzdCBpZiBhbnkgcXVvdGVzIGFyZSBuZWVkZWQgKi8KKwlmb3IgKHAgPSBzOyAqcDsgcCsrKQorCQlpZiAoY3R5cGUoKnAsIENfUVVPVEUpKQorCQkJYnJlYWs7CisJaWYgKCEqcCkgeworCQlzaGZfcHV0cyhzLCBzaGxfc3Rkb3V0KTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKHAgPSBzOyAqcDsgcCsrKSB7CisJCWlmICgqcCA9PSAnXCcnKSB7CisJCQlpZiAoaW5xdW90ZSkKKwkJCQlzaGZfcHV0YygnXCcnLCBzaGxfc3Rkb3V0KTsKKwkJCXNoZl9wdXRjKCdcXCcsIHNobF9zdGRvdXQpOworCQkJaW5xdW90ZSA9IDA7CisJCX0gZWxzZSBpZiAoIWlucXVvdGUpIHsKKwkJCXNoZl9wdXRjKCdcJycsIHNobF9zdGRvdXQpOworCQkJaW5xdW90ZSA9IDE7CisJCX0KKwkJc2hmX3B1dGMoKnAsIHNobF9zdGRvdXQpOworCX0KKwlpZiAoaW5xdW90ZSkKKwkJc2hmX3B1dGMoJ1wnJywgc2hsX3N0ZG91dCk7Cit9CisKKy8qCisgKiBQcmludCB0aGluZ3MgaW4gY29sdW1ucyBhbmQgcm93cyAtIGZ1bmMoKSBpcyBjYWxsZWQgdG8gZm9ybWF0CisgKiB0aGUgaS10aCBlbGVtZW50CisgKi8KK3ZvaWQKK3ByaW50X2NvbHVtbnMoc3RydWN0IHNoZiAqc2hmLCBpbnQgbiwKKyAgICBjaGFyICooKmZ1bmMpKGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKiksCisgICAgY29uc3Qgdm9pZCAqYXJnLCBpbnQgbWF4X29jdCwgaW50IG1heF9jb2wsIGJvb2wgcHJlZmNvbCkKK3sKKwlpbnQgaSwgciwgYywgcm93cywgY29scywgbnNwYWNlOworCWNoYXIgKnN0cjsKKworCWlmIChuIDw9IDApIHsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQlpbnRlcm5hbF93YXJuaW5nZigicHJpbnRfY29sdW1ucyBjYWxsZWQgd2l0aCBuPSVkIDw9IDAiLCBuKTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisJKyttYXhfb2N0OworCXN0ciA9IGFsbG9jKG1heF9vY3QsIEFURU1QKTsKKworCS8qIGVuc3VyZSB4X2NvbHMgaXMgdmFsaWQgZmlyc3QgKi8KKwlpZiAoeF9jb2xzIDwgTUlOX0NPTFMpCisJCWNoYW5nZV93aW5zeigpOworCisJLyoKKwkgKiBXZSB1c2UgKG1heF9jb2wgKyAxKSB0byBjb25zaWRlciB0aGUgc3BhY2Ugc2VwYXJhdG9yLgorCSAqIE5vdGUgdGhhdCBubyBzcGFjZSBpcyBwcmludGVkIGFmdGVyIHRoZSBsYXN0IGNvbHVtbgorCSAqIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGVybWluYWxzIHRoYXQgaGF2ZSBhdXRvLXdyYXAuCisJICovCisJY29scyA9IHhfY29scyAvIChtYXhfY29sICsgMSk7CisKKwkvKiBpZiB3ZSBjYW4gb25seSBwcmludCBvbmUgY29sdW1uIGFueXdheSwgc2tpcCB0aGUgZ29vICovCisJaWYgKGNvbHMgPCAyKSB7CisJCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpCisJCQlzaGZfZnByaW50ZihzaGYsICIlcyBcbiIsCisJCQkgICAgKCpmdW5jKShzdHIsIG1heF9vY3QsIGksIGFyZykpOworCQlnb3RvIG91dDsKKwl9CisKKwlyb3dzID0gKG4gKyBjb2xzIC0gMSkgLyBjb2xzOworCWlmIChwcmVmY29sICYmIGNvbHMgPiByb3dzKSB7CisJCWkgPSByb3dzOworCQlyb3dzID0gY29scyA+IG4gPyBuIDogY29sczsKKwkJY29scyA9IGk7CisJfQorCisJbWF4X2NvbCA9IC1tYXhfY29sOworCW5zcGFjZSA9ICh4X2NvbHMgKyBtYXhfY29sICogY29scykgLyBjb2xzOworCWlmIChuc3BhY2UgPD0gMCkKKwkJbnNwYWNlID0gMTsKKwlmb3IgKHIgPSAwOyByIDwgcm93czsgcisrKSB7CisJCWZvciAoYyA9IDA7IGMgPCBjb2xzOyBjKyspIHsKKwkJCWkgPSBjICogcm93cyArIHI7CisJCQlpZiAoaSA8IG4pIHsKKwkJCQlzaGZfZnByaW50ZihzaGYsICIlKnMiLCBtYXhfY29sLAorCQkJCSAgICAoKmZ1bmMpKHN0ciwgbWF4X29jdCwgaSwgYXJnKSk7CisJCQkJaWYgKGMgKyAxIDwgY29scykKKwkJCQkJc2hmX2ZwcmludGYoc2hmLCAiJSpzIiwgbnNwYWNlLCBudWxsKTsKKwkJCX0KKwkJfQorCQlzaGZfcHV0Y2hhcignXG4nLCBzaGYpOworCX0KKyBvdXQ6CisJYWZyZWUoc3RyLCBBVEVNUCk7Cit9CisKKy8qIFN0cmlwIGFueSBudWwgYnl0ZXMgZnJvbSBidWYgLSByZXR1cm5zIG5ldyBsZW5ndGggKG5ieXRlcyAtICMgb2YgbnVscykgKi8KK3ZvaWQKK3N0cmlwX251bHMoY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQoreworCWNoYXIgKmRzdDsKKworCS8qIG5ieXRlcyBjaGVjayBiZWNhdXNlIHNvbWUgc3lzdGVtcyAob2xkZXIgRnJlZUJTRHMpIGhhdmUgYSBidWdneQorCSAqIG1lbWNocigpCisJICovCisJaWYgKG5ieXRlcyAmJiAoZHN0ID0gbWVtY2hyKGJ1ZiwgJ1wwJywgbmJ5dGVzKSkpIHsKKwkJY2hhciAqZW5kID0gYnVmICsgbmJ5dGVzOworCQljaGFyICpwLCAqcTsKKworCQlmb3IgKHAgPSBkc3Q7IHAgPCBlbmQ7IHAgPSBxKSB7CisJCQkvKiBza2lwIGEgYmxvY2sgb2YgbnVsbHMgKi8KKwkJCXdoaWxlICgrK3AgPCBlbmQgJiYgKnAgPT0gJ1wwJykKKwkJCQk7CisJCQkvKiBmaW5kIGVuZCBvZiBub24tbnVsbCBibG9jayAqLworCQkJaWYgKCEocSA9IG1lbWNocihwLCAnXDAnLCBlbmQgLSBwKSkpCisJCQkJcSA9IGVuZDsKKwkJCW1lbW1vdmUoZHN0LCBwLCBxIC0gcCk7CisJCQlkc3QgKz0gcSAtIHA7CisJCX0KKwkJKmRzdCA9ICdcMCc7CisJfQorfQorCisvKiBMaWtlIHJlYWQoMiksIGJ1dCBpZiByZWFkIGZhaWxzIGR1ZSB0byBub24tYmxvY2tpbmcgZmxhZywgcmVzZXRzIGZsYWcKKyAqIGFuZCByZXN0YXJ0cyByZWFkLgorICovCitpbnQKK2Jsb2NraW5nX3JlYWQoaW50IGZkLCBjaGFyICpidWYsIGludCBuYnl0ZXMpCit7CisJaW50IHJldDsKKwlpbnQgdHJpZWRfcmVzZXQgPSAwOworCisJd2hpbGUgKChyZXQgPSByZWFkKGZkLCBidWYsIG5ieXRlcykpIDwgMCkgeworCQlpZiAoIXRyaWVkX3Jlc2V0ICYmIGVycm5vID09IEVBR0FJTikgeworCQkJaWYgKHJlc2V0X25vbmJsb2NrKGZkKSA+IDApIHsKKwkJCQl0cmllZF9yZXNldCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQllcnJubyA9IEVBR0FJTjsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIChyZXQpOworfQorCisvKiBSZXNldCB0aGUgbm9uLWJsb2NraW5nIGZsYWcgb24gdGhlIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBSZXR1cm5zIC0xIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgMCBpZiBub24tYmxvY2tpbmcgd2Fzbid0IHNldCwKKyAqIDEgaWYgaXQgd2FzLgorICovCitpbnQKK3Jlc2V0X25vbmJsb2NrKGludCBmZCkKK3sKKwlpbnQgZmxhZ3M7CisKKwlpZiAoKGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwsIDApKSA8IDApCisJCXJldHVybiAoLTEpOworCWlmICghKGZsYWdzICYgT19OT05CTE9DSykpCisJCXJldHVybiAoMCk7CisJZmxhZ3MgJj0gfk9fTk9OQkxPQ0s7CisJaWYgKGZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncykgPCAwKQorCQlyZXR1cm4gKC0xKTsKKwlyZXR1cm4gKDEpOworfQorCisKKy8qIExpa2UgZ2V0Y3dkKCksIGV4Y2VwdCBic2l6ZSBpcyBpZ25vcmVkIGlmIGJ1ZiBpcyAwIChQQVRIX01BWCBpcyB1c2VkKSAqLworY2hhciAqCitrc2hfZ2V0X3dkKHNpemVfdCAqZGxlbikKK3sKKwljaGFyICpyZXQsICpiOworCXNpemVfdCBsZW4gPSAxOworCisjaWZkZWYgTk9fUEFUSF9NQVgKKwlpZiAoKGIgPSBnZXRfY3VycmVudF9kaXJfbmFtZSgpKSkgeworCQlsZW4gPSBzdHJsZW4oYikgKyAxOworCQlzdHJuZHVweChyZXQsIGIsIGxlbiAtIDEsIEFURU1QKTsKKwkJZnJlZShiKTsKKwl9IGVsc2UKKwkJcmV0ID0gTlVMTDsKKyNlbHNlCisJaWYgKChyZXQgPSBnZXRjd2QoKGIgPSBhbGxvYyhQQVRIX01BWCArIDEsIEFURU1QKSksIFBBVEhfTUFYKSkpCisJCXJldCA9IGFyZXNpemUoYiwgbGVuID0gKHN0cmxlbihiKSArIDEpLCBBVEVNUCk7CisJZWxzZQorCQlhZnJlZShiLCBBVEVNUCk7CisjZW5kaWYKKworCWlmIChkbGVuKQorCQkqZGxlbiA9IGxlbjsKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qCisgKglNYWtlcyBhIGZpbGVuYW1lIGludG8gcmVzdWx0IHVzaW5nIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtLgorICoJLSBtYWtlIHJlc3VsdCBOVUxMCisgKgktIGlmIGZpbGUgc3RhcnRzIHdpdGggJy8nLCBhcHBlbmQgZmlsZSB0byByZXN1bHQgJiBzZXQgY2RwYXRocCB0byBOVUxMCisgKgktIGlmIGZpbGUgc3RhcnRzIHdpdGggLi8gb3IgLi4vIGFwcGVuZCBjd2QgYW5kIGZpbGUgdG8gcmVzdWx0CisgKgkgIGFuZCBzZXQgY2RwYXRocCB0byBOVUxMCisgKgktIGlmIHRoZSBmaXJzdCBlbGVtZW50IG9mIGNkcGF0aHAgZG9lc250IHN0YXJ0IHdpdGggYSAnLycgeHggb3IgJy4nIHh4CisgKgkgIHRoZW4gY3dkIGlzIGFwcGVuZGVkIHRvIHJlc3VsdC4KKyAqCS0gdGhlIGZpcnN0IGVsZW1lbnQgb2YgY2RwYXRocCBpcyBhcHBlbmRlZCB0byByZXN1bHQKKyAqCS0gZmlsZSBpcyBhcHBlbmRlZCB0byByZXN1bHQKKyAqCS0gY2RwYXRocCBpcyBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGVsZW1lbnQgaW4gY2RwYXRocCAob3IgTlVMTAorICoJICBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cy4KKyAqCVRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgYSBub24tbnVsbCBlbGVtZW50IGZyb20gY2RwYXRocAorICoJd2FzIGFwcGVuZGVkIHRvIHJlc3VsdC4KKyAqLworaW50CittYWtlX3BhdGgoY29uc3QgY2hhciAqY3dkLCBjb25zdCBjaGFyICpmaWxlLAorICAgIGNoYXIgKipjZHBhdGhwLAkJLyogJiBvZiA6IHNlcGFyYXRlZCBsaXN0ICovCisgICAgWFN0cmluZyAqeHNwLAorICAgIGludCAqcGh5c19wYXRocCkKK3sKKwlpbnQgcnZhbCA9IDA7CisJYm9vbCB1c2VfY2RwYXRoID0gdHJ1ZTsKKwljaGFyICpwbGlzdDsKKwlpbnQgbGVuLCBwbGVuID0gMDsKKwljaGFyICp4cCA9IFhzdHJpbmcoKnhzcCwgeHApOworCisJaWYgKCFmaWxlKQorCQlmaWxlID0gbnVsbDsKKworCWlmIChmaWxlWzBdID09ICcvJykgeworCQkqcGh5c19wYXRocCA9IDA7CisJCXVzZV9jZHBhdGggPSBmYWxzZTsKKwl9IGVsc2UgeworCQlpZiAoZmlsZVswXSA9PSAnLicpIHsKKwkJCWNoYXIgYyA9IGZpbGVbMV07CisKKwkJCWlmIChjID09ICcuJykKKwkJCQljID0gZmlsZVsyXTsKKwkJCWlmIChjID09ICcvJyB8fCBjID09ICdcMCcpCisJCQkJdXNlX2NkcGF0aCA9IGZhbHNlOworCQl9CisKKwkJcGxpc3QgPSAqY2RwYXRocDsKKwkJaWYgKCFwbGlzdCkKKwkJCXVzZV9jZHBhdGggPSBmYWxzZTsKKwkJZWxzZSBpZiAodXNlX2NkcGF0aCkgeworCQkJY2hhciAqcGVuZDsKKworCQkJZm9yIChwZW5kID0gcGxpc3Q7ICpwZW5kICYmICpwZW5kICE9ICc6JzsgcGVuZCsrKQorCQkJCTsKKwkJCXBsZW4gPSBwZW5kIC0gcGxpc3Q7CisJCQkqY2RwYXRocCA9ICpwZW5kID8gcGVuZCArIDEgOiBOVUxMOworCQl9CisKKwkJaWYgKCghdXNlX2NkcGF0aCB8fCAhcGxlbiB8fCBwbGlzdFswXSAhPSAnLycpICYmCisJCSAgICAoY3dkICYmICpjd2QpKSB7CisJCQlsZW4gPSBzdHJsZW4oY3dkKTsKKwkJCVhjaGVja04oKnhzcCwgeHAsIGxlbik7CisJCQltZW1jcHkoeHAsIGN3ZCwgbGVuKTsKKwkJCXhwICs9IGxlbjsKKwkJCWlmIChjd2RbbGVuIC0gMV0gIT0gJy8nKQorCQkJCVhwdXQoKnhzcCwgeHAsICcvJyk7CisJCX0KKwkJKnBoeXNfcGF0aHAgPSBYbGVuZ3RoKCp4c3AsIHhwKTsKKwkJaWYgKHVzZV9jZHBhdGggJiYgcGxlbikgeworCQkJWGNoZWNrTigqeHNwLCB4cCwgcGxlbik7CisJCQltZW1jcHkoeHAsIHBsaXN0LCBwbGVuKTsKKwkJCXhwICs9IHBsZW47CisJCQlpZiAocGxpc3RbcGxlbiAtIDFdICE9ICcvJykKKwkJCQlYcHV0KCp4c3AsIHhwLCAnLycpOworCQkJcnZhbCA9IDE7CisJCX0KKwl9CisKKwlsZW4gPSBzdHJsZW4oZmlsZSkgKyAxOworCVhjaGVja04oKnhzcCwgeHAsIGxlbik7CisJbWVtY3B5KHhwLCBmaWxlLCBsZW4pOworCisJaWYgKCF1c2VfY2RwYXRoKQorCQkqY2RwYXRocCA9IE5VTEw7CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKgorICogU2ltcGxpZnkgcGF0aG5hbWVzIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iIGVudHJpZXMuCisgKiBpZSwgc2ltcGxpZnlfcGF0aCgiL2EvYi9jLy4vLi4vZC8uLiIpIHJldHVybnMgIi9hL2IiCisgKi8KK3ZvaWQKK3NpbXBsaWZ5X3BhdGgoY2hhciAqcGF0aGwpCit7CisJY2hhciAqY3VyLCAqdDsKKwlib29sIGlzcm9vdGVkOworCWNoYXIgKnZlcnlfc3RhcnQgPSBwYXRobCwgKnN0YXJ0OworCisJaWYgKCEqcGF0aGwpCisJCXJldHVybjsKKworCWlmICgoaXNyb290ZWQgPSBwYXRobFswXSA9PSAnLycpKQorCQl2ZXJ5X3N0YXJ0Kys7CisKKwkvKiBCZWZvcmUJCQlBZnRlcgorCSAqIC9mb28vCQkJL2ZvbworCSAqIC9mb28vLi4vLi4vYmFyCQkvYmFyCisJICogL2Zvby8uL2JsYWgvLi4JCS9mb28KKwkgKiAuCQkJCS4KKwkgKiAuLgkJCQkuLgorCSAqIC4vZm9vCQkJZm9vCisJICogZm9vLy4uLy4uLy4uL2JhcgkJLi4vLi4vYmFyCisJICovCisKKwlmb3IgKGN1ciA9IHQgPSBzdGFydCA9IHZlcnlfc3RhcnQ7IDsgKSB7CisJCS8qIHRyZWF0IG11bHRpcGxlICcvJ3MgYXMgb25lICcvJyAqLworCQl3aGlsZSAoKnQgPT0gJy8nKQorCQkJdCsrOworCisJCWlmICgqdCA9PSAnXDAnKSB7CisJCQlpZiAoY3VyID09IHBhdGhsKQorCQkJCS8qIGNvbnZlcnQgZW1wdHkgcGF0aCB0byBkb3QgKi8KKwkJCQkqY3VyKysgPSAnLic7CisJCQkqY3VyID0gJ1wwJzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRbMF0gPT0gJy4nKSB7CisJCQlpZiAoIXRbMV0gfHwgdFsxXSA9PSAnLycpIHsKKwkJCQl0ICs9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKHRbMV0gPT0gJy4nICYmICghdFsyXSB8fCB0WzJdID09ICcvJykpIHsKKwkJCQlpZiAoIWlzcm9vdGVkICYmIGN1ciA9PSBzdGFydCkgeworCQkJCQlpZiAoY3VyICE9IHZlcnlfc3RhcnQpCisJCQkJCQkqY3VyKysgPSAnLyc7CisJCQkJCSpjdXIrKyA9ICcuJzsKKwkJCQkJKmN1cisrID0gJy4nOworCQkJCQlzdGFydCA9IGN1cjsKKwkJCQl9IGVsc2UgaWYgKGN1ciAhPSBzdGFydCkKKwkJCQkJd2hpbGUgKC0tY3VyID4gc3RhcnQgJiYgKmN1ciAhPSAnLycpCisJCQkJCQk7CisJCQkJdCArPSAyOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKGN1ciAhPSB2ZXJ5X3N0YXJ0KQorCQkJKmN1cisrID0gJy8nOworCisJCS8qIGZpbmQvY29weSBuZXh0IGNvbXBvbmVudCBvZiBwYXRobmFtZSAqLworCQl3aGlsZSAoKnQgJiYgKnQgIT0gJy8nKQorCQkJKmN1cisrID0gKnQrKzsKKwl9Cit9CisKKwordm9pZAorc2V0X2N1cnJlbnRfd2QoY2hhciAqcGF0aGwpCit7CisJc2l6ZV90IGxlbiA9IDE7CisJY2hhciAqcCA9IHBhdGhsOworCisJaWYgKHAgPT0gTlVMTCkgeworCQlpZiAoKHAgPSBrc2hfZ2V0X3dkKCZsZW4pKSA9PSBOVUxMKQorCQkJcCA9IG51bGw7CisJfSBlbHNlCisJCWxlbiA9IHN0cmxlbihwKSArIDE7CisKKwlpZiAobGVuID4gY3VycmVudF93ZF9zaXplKSB7CisJCWFmcmVlKGN1cnJlbnRfd2QsIEFQRVJNKTsKKwkJY3VycmVudF93ZCA9IGFsbG9jKGN1cnJlbnRfd2Rfc2l6ZSA9IGxlbiwgQVBFUk0pOworCX0KKwltZW1jcHkoY3VycmVudF93ZCwgcCwgbGVuKTsKKwlpZiAocCAhPSBwYXRobCAmJiBwICE9IG51bGwpCisJCWFmcmVlKHAsIEFURU1QKTsKK30KKworI2lmZGVmIFRJT0NTQ1RUWQorZXh0ZXJuIHZvaWQgY2h2dF9yZWluaXQodm9pZCk7CisKK3N0YXRpYyB2b2lkCitjaHZ0KGNvbnN0IGNoYXIgKmZuKQoreworCWNoYXIgZHZbMjBdOworCXN0cnVjdCBzdGF0IHNiOworCWludCBmZDsKKworCS8qIGZvciBlbnRyb3B5ICovCisJa3Noc3RhdGVfZi5oID0gZXZpbGhhc2goZm4pOworCisJaWYgKCpmbiA9PSAnLScpIHsKKwkJbWVtY3B5KGR2LCAiLS9kZXYvbnVsbCIsIHNpemVvZigiLS9kZXYvbnVsbCIpKTsKKwkJZm4gPSBkdiArIDE7CisJfSBlbHNlIHsKKwkJaWYgKHN0YXQoZm4sICZzYikpIHsKKwkJCW1lbWNweShkdiwgIi9kZXYvdHR5QyIsIDkpOworCQkJc3RybGNweShkdiArIDksIGZuLCBzaXplb2YoZHYpIC0gOSk7CisJCQlpZiAoc3RhdChkdiwgJnNiKSkgeworCQkJCXN0cmxjcHkoZHYgKyA4LCBmbiwgc2l6ZW9mKGR2KSAtIDgpOworCQkJCWlmIChzdGF0KGR2LCAmc2IpKQorCQkJCQllcnJvcmYoImNodnQ6IGNhbid0IGZpbmQgdHR5ICVzIiwgZm4pOworCQkJfQorCQkJZm4gPSBkdjsKKwkJfQorCQlpZiAoIShzYi5zdF9tb2RlICYgU19JRkNIUikpCisJCQllcnJvcmYoImNodnQ6IG5vdCBhIGNoYXIgZGV2aWNlOiAlcyIsIGZuKTsKKwkJaWYgKChzYi5zdF91aWQgIT0gMCkgJiYgY2hvd24oZm4sIDAsIDApKQorCQkJd2FybmluZ2YoZmFsc2UsICJjaHZ0OiBjYW5ub3QgY2hvd24gcm9vdCAlcyIsIGZuKTsKKwkJaWYgKCgoc2Iuc3RfbW9kZSAmIDA3Nzc3KSAhPSAwNjAwKSAmJiBjaG1vZChmbiwgKG1vZGVfdCkwNjAwKSkKKwkJCXdhcm5pbmdmKGZhbHNlLCAiY2h2dDogY2Fubm90IGNobW9kIDA2MDAgJXMiLCBmbik7CisjaWYgSEFWRV9SRVZPS0UKKwkJaWYgKHJldm9rZShmbikpCisjZW5kaWYKKwkJCXdhcm5pbmdmKGZhbHNlLCAiY2h2dDogY2Fubm90IHJldm9rZSAlcywgbmV3IHNoZWxsIGlzIgorCQkJICAgICIgcG90ZW50aWFsbHkgaW5zZWN1cmUiLCBmbik7CisJfQorCWlmICgoZmQgPSBvcGVuKGZuLCBPX1JEV1IpKSA9PSAtMSkgeworCQlzbGVlcCgxKTsKKwkJaWYgKChmZCA9IG9wZW4oZm4sIE9fUkRXUikpID09IC0xKQorCQkJZXJyb3JmKCJjaHZ0OiBjYW5ub3Qgb3BlbiAlcyIsIGZuKTsKKwl9CisJc3dpdGNoIChmb3JrKCkpIHsKKwljYXNlIC0xOgorCQllcnJvcmYoImNodnQ6ICVzIGZhaWxlZCIsICJmb3JrIik7CisJY2FzZSAwOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlleGl0KDApOworCX0KKwlpZiAoc2V0c2lkKCkgPT0gLTEpCisJCWVycm9yZigiY2h2dDogJXMgZmFpbGVkIiwgInNldHNpZCIpOworCWlmIChmbiAhPSBkdiArIDEpIHsKKwkJaWYgKGlvY3RsKGZkLCBUSU9DU0NUVFksIE5VTEwpID09IC0xKQorCQkJZXJyb3JmKCJjaHZ0OiAlcyBmYWlsZWQiLCAiVElPQ1NDVFRZIik7CisJCWlmICh0Y2ZsdXNoKGZkLCBUQ0lPRkxVU0gpKQorCQkJZXJyb3JmKCJjaHZ0OiAlcyBmYWlsZWQiLCAiVENJT0ZMVVNIIik7CisJfQorCWtzaF9kdXAyKGZkLCAwLCBmYWxzZSk7CisJa3NoX2R1cDIoZmQsIDEsIGZhbHNlKTsKKwlrc2hfZHVwMihmZCwgMiwgZmFsc2UpOworCWlmIChmZCA+IDIpCisJCWNsb3NlKGZkKTsKKwljaHZ0X3JlaW5pdCgpOworfQorI2VuZGlmCisKKyNpZmRlZiBERUJVRworY2hhciBsb25nc2l6ZXNfYXJlX29rYXlbc2l6ZW9mKGxvbmcpID09IHNpemVvZih1bnNpZ25lZCBsb25nKSA/IDEgOiAtMV07CitjaGFyIGFyaXNpemVfaXNfb2theVtzaXplb2YobWtzaF9hcmlfdCkgPT0gNCA/IDEgOiAtMV07CitjaGFyIHVhcmlzaXplX2lzX29rYXlbc2l6ZW9mKG1rc2hfdWFyaV90KSA9PSA0ID8gMSA6IC0xXTsKKworY2hhciAqCitzdHJjaHIoY2hhciAqcCwgaW50IGNoKQoreworCWZvciAoOzsgKytwKSB7CisJCWlmICgqcCA9PSBjaCkKKwkJCXJldHVybiAocCk7CisJCWlmICghKnApCisJCQlyZXR1cm4gKE5VTEwpOworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CisKK2NoYXIgKgorc3Ryc3RyKGNoYXIgKmIsIGNvbnN0IGNoYXIgKmwpCit7CisJY2hhciBmaXJzdCwgYzsKKwlzaXplX3QgbjsKKworCWlmICgoZmlyc3QgPSAqbCsrKSA9PSAnXDAnKQorCQlyZXR1cm4gKGIpOworCW4gPSBzdHJsZW4obCk7Cisgc3Ryc3RyX2xvb2s6CisJd2hpbGUgKChjID0gKmIrKykgIT0gZmlyc3QpCisJCWlmIChjID09ICdcMCcpCisJCQlyZXR1cm4gKE5VTEwpOworCWlmIChzdHJuY21wKGIsIGwsIG4pKQorCQlnb3RvIHN0cnN0cl9sb29rOworCXJldHVybiAoYiAtIDEpOworfQorI2VuZGlmCisKKyNpZm5kZWYgTUtTSF9BU1NVTUVfVVRGOAorI2lmICFIQVZFX1NUUkNBU0VTVFIKK2NvbnN0IGNoYXIgKgorc3RyaXN0cihjb25zdCBjaGFyICpiLCBjb25zdCBjaGFyICpsKQoreworCWNoYXIgZmlyc3QsIGM7CisJc2l6ZV90IG47CisKKwlpZiAoKGZpcnN0ID0gKmwrKyksICgoZmlyc3QgPSBrc2hfdG9sb3dlcihmaXJzdCkpID09ICdcMCcpKQorCQlyZXR1cm4gKGIpOworCW4gPSBzdHJsZW4obCk7Cisgc3RyaXN0cl9sb29rOgorCXdoaWxlICgoYyA9ICpiKyspLCAoKGMgPSBrc2hfdG9sb3dlcihjKSkgIT0gZmlyc3QpKQorCQlpZiAoYyA9PSAnXDAnKQorCQkJcmV0dXJuIChOVUxMKTsKKwlpZiAoc3RybmNhc2VjbXAoYiwgbCwgbikpCisJCWdvdG8gc3RyaXN0cl9sb29rOworCXJldHVybiAoYiAtIDEpOworfQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIE1LU0hfU01BTEwKK2NoYXIgKgorc3RybmR1cF8oY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbGVuLCBBcmVhICphcCkKK3sKKwljaGFyICpkc3QgPSBOVUxMOworCisJaWYgKHNyYyAhPSBOVUxMKSB7CisJCWRzdCA9IGFsbG9jKGxlbiArIDEsIGFwKTsKKwkJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOworCQlkc3RbbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiAoZHN0KTsKK30KKworY2hhciAqCitzdHJkdXBfKGNvbnN0IGNoYXIgKnNyYywgQXJlYSAqYXApCit7CisJcmV0dXJuIChzcmMgPT0gTlVMTCA/IE5VTEwgOiBzdHJuZHVwXyhzcmMsIHN0cmxlbihzcmMpLCBhcCkpOworfQorI2VuZGlmCisKKyNpZiAhSEFWRV9HRVRSVVNBR0UKKyNkZWZpbmUgSU5WVENLKHIsdCkJZG8gewkJCQkJCVwKKwlyLnR2X3VzZWMgPSAoKHQpICUgKDEwMDAwMDAgLyBDTEtfVENLKSkgKiAoMTAwMDAwMCAvIENMS19UQ0spOwlcCisJci50dl9zZWMgPSAodCkgLyBDTEtfVENLOwkJCQkJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisKK2ludAorZ2V0cnVzYWdlKGludCB3aGF0LCBzdHJ1Y3QgcnVzYWdlICpydSkKK3sKKwlzdHJ1Y3QgdG1zIHRtczsKKwljbG9ja190IHUsIHM7CisKKwlpZiAoLyogcnUgPT0gTlVMTCB8fCAqLyB0aW1lcygmdG1zKSA9PSAoY2xvY2tfdCktMSkKKwkJcmV0dXJuICgtMSk7CisKKwlzd2l0Y2ggKHdoYXQpIHsKKwljYXNlIFJVU0FHRV9TRUxGOgorCQl1ID0gdG1zLnRtc191dGltZTsKKwkJcyA9IHRtcy50bXNfc3RpbWU7CisJCWJyZWFrOworCWNhc2UgUlVTQUdFX0NISUxEUkVOOgorCQl1ID0gdG1zLnRtc19jdXRpbWU7CisJCXMgPSB0bXMudG1zX2NzdGltZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAoLTEpOworCX0KKwlJTlZUQ0socnUtPnJ1X3V0aW1lLCB1KTsKKwlJTlZUQ0socnUtPnJ1X3N0aW1lLCBzKTsKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCisKKy8qCisgKiBwcm9jZXNzIHRoZSBzdHJpbmcgYXZhaWxhYmxlIHZpYSBmZyAoZ2V0IGEgY2hhcikKKyAqIGFuZCBmcCAocHV0IGJhY2sgYSBjaGFyKSBmb3IgYmFja3NsYXNoIGVzY2FwZXMsCisgKiBhc3N1bWluZyB0aGUgZmlyc3QgY2FsbCB0byAqZmcgZ2V0cyB0aGUgY2hhciBkaS0KKyAqIHJlY3RseSBhZnRlciB0aGUgYmFja3NsYXNoOyByZXR1cm4gdGhlIGNoYXJhY3RlcgorICogKDAuLjB4RkYpLCBVbmljb2RlICh3YyArIDB4MTAwKSwgb3IgLTEgaWYgbm8ga25vd24KKyAqIGVzY2FwZSBzZXF1ZW5jZSB3YXMgZm91bmQKKyAqLworaW50Cit1bmJrc2woYm9vbCBjc3R5bGUsIGludCAoKmZnKSh2b2lkKSwgdm9pZCAoKmZwKShpbnQpKQoreworCWludCB3YywgaSwgYywgZmM7CisKKwlmYyA9ICgqZmcpKCk7CisJc3dpdGNoIChmYykgeworCWNhc2UgJ2EnOgorCQkvKgorCQkgKiBhY2NvcmRpbmcgdG8gdGhlIGNvbW1lbnRzIGluIHBka3NoLCBcMDA3IHNlZW1zCisJCSAqIHRvIGJlIG1vcmUgcG9ydGFibGUgdGhhbiBcYSAoZHVlIHRvIEhQLVVYIGNjLAorCQkgKiBVbHRyaXggY2MsIG9sZCBwY2MsIGV0Yy4pIHNvIHdlIGF2b2lkIHRoZSBlc2NhcGUKKwkJICogc2VxdWVuY2UgYWx0b2dldGhlciBpbiBta3NoIGFuZCBhc3N1bWUgQVNDSUkKKwkJICovCisJCXdjID0gNzsKKwkJYnJlYWs7CisJY2FzZSAnYic6CisJCXdjID0gJ1xiJzsKKwkJYnJlYWs7CisJY2FzZSAnYyc6CisJCWlmICghY3N0eWxlKQorCQkJZ290byB1bmtub3duX2VzY2FwZTsKKwkJYyA9ICgqZmcpKCk7CisJCXdjID0gQ1RSTChjKTsKKwkJYnJlYWs7CisJY2FzZSAnRSc6CisJY2FzZSAnZSc6CisJCXdjID0gMDMzOworCQlicmVhazsKKwljYXNlICdmJzoKKwkJd2MgPSAnXGYnOworCQlicmVhazsKKwljYXNlICduJzoKKwkJd2MgPSAnXG4nOworCQlicmVhazsKKwljYXNlICdyJzoKKwkJd2MgPSAnXHInOworCQlicmVhazsKKwljYXNlICd0JzoKKwkJd2MgPSAnXHQnOworCQlicmVhazsKKwljYXNlICd2JzoKKwkJLyogYXNzdW1lIEFTQ0lJIGhlcmUgYXMgd2VsbCAqLworCQl3YyA9IDExOworCQlicmVhazsKKwljYXNlICcxJzoKKwljYXNlICcyJzoKKwljYXNlICczJzoKKwljYXNlICc0JzoKKwljYXNlICc1JzoKKwljYXNlICc2JzoKKwljYXNlICc3JzoKKwkJaWYgKCFjc3R5bGUpCisJCQlnb3RvIHVua25vd25fZXNjYXBlOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgJzAnOgorCQlpZiAoY3N0eWxlKQorCQkJKCpmcCkoZmMpOworCQkvKgorCQkgKiBsb29rIGZvciBhbiBvY3RhbCBudW1iZXIgd2l0aCB1cCB0byB0aHJlZQorCQkgKiBkaWdpdHMsIG5vdCBjb3VudGluZyB0aGUgbGVhZGluZyB6ZXJvOworCQkgKiBjb252ZXJ0IGl0IHRvIGEgcmF3IG9jdGV0CisJCSAqLworCQl3YyA9IDA7CisJCWkgPSAzOworCQl3aGlsZSAoaS0tKQorCQkJaWYgKChjID0gKCpmZykoKSkgPj0gJzAnICYmIGMgPD0gJzcnKQorCQkJCXdjID0gKHdjIDw8IDMpICsgKGMgLSAnMCcpOworCQkJZWxzZSB7CisJCQkJKCpmcCkoYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCWJyZWFrOworCWNhc2UgJ1UnOgorCQlpID0gODsKKwkJaWYgKDApCisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAndSc6CisJCWkgPSA0OworCQlpZiAoMCkKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlICd4JzoKKwkJaSA9IGNzdHlsZSA/IC0xIDogMjsKKwkJLyoKKwkJICogeDoJbG9vayBmb3IgYSBoZXhhZGVjaW1hbCBudW1iZXIgd2l0aCB1cCB0bworCQkgKgl0d28gKEMgc3R5bGU6IGFyYml0cmFyeSkgZGlnaXRzOyBjb252ZXJ0CisJCSAqCXRvIHJhdyBvY3RldCAoQyBzdHlsZTogVW5pY29kZSBpZiA+MHhGRikKKwkJICogdS9VOglsb29rIGZvciBhIGhleGFkZWNpbWFsIG51bWJlciB3aXRoIHVwIHRvCisJCSAqCWZvdXIgKFU6IGVpZ2h0KSBkaWdpdHM7IGNvbnZlcnQgdG8gVW5pY29kZQorCQkgKi8KKwkJd2MgPSAwOworCQl3aGlsZSAoaS0tKSB7CisJCQl3YyA8PD0gNDsKKwkJCWlmICgoYyA9ICgqZmcpKCkpID49ICcwJyAmJiBjIDw9ICc5JykKKwkJCQl3YyArPSBjIC0gJzAnOworCQkJZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisJCQkJd2MgKz0gYyAtICdBJyArIDEwOworCQkJZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCQkJd2MgKz0gYyAtICdhJyArIDEwOworCQkJZWxzZSB7CisJCQkJd2MgPj49IDQ7CisJCQkJKCpmcCkoYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKChjc3R5bGUgJiYgd2MgPiAweEZGKSB8fCBmYyAhPSAneCcpCisJCQkvKiBVbmljb2RlIG1hcmtlciAqLworCQkJd2MgKz0gMHgxMDA7CisJCWJyZWFrOworCWNhc2UgJ1wnJzoKKwkJaWYgKCFjc3R5bGUpCisJCQlnb3RvIHVua25vd25fZXNjYXBlOworCQl3YyA9ICdcJyc7CisJCWJyZWFrOworCWNhc2UgJ1xcJzoKKwkJd2MgPSAnXFwnOworCQlicmVhazsKKwlkZWZhdWx0OgorIHVua25vd25fZXNjYXBlOgorCQkoKmZwKShmYyk7CisJCXJldHVybiAoLTEpOworCX0KKworCXJldHVybiAod2MpOworfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvc2guaCBiL21rc2gvc3JjL3NoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1ODhjOQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL3NoLmgKQEAgLTAsMCArMSwxNzUyIEBACisvKgkkT3BlbkJTRDogc2guaCx2IDEuMzAgMjAxMC8wMS8wNCAxODowNzoxMSBkZXJhYWR0IEV4cCAkCSovCisvKgkkT3BlbkJTRDogc2hmLmgsdiAxLjYgMjAwNS8xMi8xMSAxODo1Mzo1MSBkZXJhYWR0IEV4cCAkCSovCisvKgkkT3BlbkJTRDogdGFibGUuaCx2IDEuNyAyMDA1LzEyLzExIDIwOjMxOjIxIG90dG8gRXhwICQJKi8KKy8qCSRPcGVuQlNEOiB0cmVlLmgsdiAxLjEwIDIwMDUvMDMvMjggMjE6Mjg6MjIgZGVyYWFkdCBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IGV4cGFuZC5oLHYgMS42IDIwMDUvMDMvMzAgMTc6MTY6MzcgZGVyYWFkdCBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IGxleC5oLHYgMS4xMSAyMDA2LzA1LzI5IDE4OjIyOjI0IG90dG8gRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBwcm90by5oLHYgMS4zMyAyMDEwLzA1LzE5IDE3OjM2OjA4IGphc3BlciBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IGNfdGVzdC5oLHYgMS40IDIwMDQvMTIvMjAgMTE6MzQ6MjYgb3R0byBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IHR0eS5oLHYgMS41IDIwMDQvMTIvMjAgMTE6MzQ6MjYgb3R0byBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2lmZGVmIF9fZGlldGxpYmNfXworLyogWFhYIGltYWtlIHN0eWxlICovCisjZGVmaW5lIF9CU0RfU09VUkNFCS8qIGxpdmUsIEJTRCwgbGl2ZSEgKi8KKyNlbmRpZgorCisjaWYgSEFWRV9TWVNfUEFSQU1fSAorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpZiBIQVZFX1NZU19TWVNNQUNST1NfSAorI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX01LREVWX0gKKyNpbmNsdWRlIDxzeXMvbWtkZXYuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX01NQU5fSAorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2lmIEhBVkVfTElCR0VOX0gKKyNpbmNsdWRlIDxsaWJnZW4uaD4KKyNlbmRpZgorI2lmIEhBVkVfTElCVVRJTF9ICisjaW5jbHVkZSA8bGlidXRpbC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWYgSEFWRV9QQVRIU19ICisjaW5jbHVkZSA8cGF0aHMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmIEhBVkVfU1REQk9PTF9ICisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9VTElNSVRfSAorI2luY2x1ZGUgPHVsaW1pdC5oPgorI2VuZGlmCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWYgSEFWRV9WQUxVRVNfSAorI2luY2x1ZGUgPHZhbHVlcy5oPgorI2VuZGlmCisKKyN1bmRlZiBfX2F0dHJpYnV0ZV9fCisjaWYgSEFWRV9BVFRSSUJVVEVfQk9VTkRFRAorI2RlZmluZSBNS1NIX0FfQk9VTkRFRCh4LHkseikJX19hdHRyaWJ1dGVfXygoYm91bmRlZCAoeCwgeSwgeikpKQorI2Vsc2UKKyNkZWZpbmUgTUtTSF9BX0JPVU5ERUQoeCx5LHopCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorI2lmIEhBVkVfQVRUUklCVVRFX0ZPUk1BVAorI2RlZmluZSBNS1NIX0FfRk9STUFUKHgseSx6KQlfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHgsIHksIHopKSkKKyNlbHNlCisjZGVmaW5lIE1LU0hfQV9GT1JNQVQoeCx5LHopCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorI2lmIEhBVkVfQVRUUklCVVRFX05PTk5VTEwKKyNkZWZpbmUgTUtTSF9BX05PTk5VTEwoYSkJX19hdHRyaWJ1dGVfXyhhKQorI2Vsc2UKKyNkZWZpbmUgTUtTSF9BX05PTk5VTEwoYSkJLyogbm90aGluZyAqLworI2VuZGlmCisjaWYgSEFWRV9BVFRSSUJVVEVfTk9SRVRVUk4KKyNkZWZpbmUgTUtTSF9BX05PUkVUVVJOCQlfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisjZWxzZQorI2RlZmluZSBNS1NIX0FfTk9SRVRVUk4JCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorI2lmIEhBVkVfQVRUUklCVVRFX1VOVVNFRAorI2RlZmluZSBNS1NIX0FfVU5VU0VECQlfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UKKyNkZWZpbmUgTUtTSF9BX1VOVVNFRAkJLyogbm90aGluZyAqLworI2VuZGlmCisjaWYgSEFWRV9BVFRSSUJVVEVfVVNFRAorI2RlZmluZSBNS1NIX0FfVVNFRAkJX19hdHRyaWJ1dGVfXygodXNlZCkpCisjZWxzZQorI2RlZmluZSBNS1NIX0FfVVNFRAkJLyogbm90aGluZyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1pckJTRCkgJiYgKE1pckJTRCA+PSAweDA5QTEpICYmIFwKKyAgICBkZWZpbmVkKF9fRUxGX18pICYmIGRlZmluZWQoX19HTlVDX18pICYmIFwKKyAgICAhZGVmaW5lZChfX2xsdm1fXykgJiYgIWRlZmluZWQoX19OV0NDX18pCisvKgorICogV2UgZ290IHVzYWJsZSBfX0lEU1RSSU5HIF9fQ09QWVJJR0hUIF9fUkNTSUQgX19TQ0NTSUQgbWFjcm9zCisgKiB3aGljaCB3b3JrIGZvciBhbGwgY2FzZXM7IG5vIG5lZWQgdG8gcmVkZWZpbmUgdGhlbSB1c2luZyB0aGUKKyAqICJwb3J0YWJsZSIgbWFjcm9zIGZyb20gYmVsb3cgd2hlbiB3ZSBtaWdodCBoYXZlIHRoZSAiYmV0dGVyIgorICogZ2NjK0VMRiBzcGVjaWZpYyBtYWNyb3Mgb3Igb3RoZXIgc3lzdGVtIGRlcGVuZGVudCBvbmVzLgorICovCisjZWxzZQorI3VuZGVmIF9fSURTVFJJTkcKKyN1bmRlZiBfX0lEU1RSSU5HX0NPTkNBVAorI3VuZGVmIF9fSURTVFJJTkdfRVhQQU5ECisjdW5kZWYgX19DT1BZUklHSFQKKyN1bmRlZiBfX1JDU0lECisjdW5kZWYgX19TQ0NTSUQKKyNkZWZpbmUgX19JRFNUUklOR19DT05DQVQobCxwKQkJX19MSU5URURfXyAjIyBsICMjIF8gIyMgcAorI2RlZmluZSBfX0lEU1RSSU5HX0VYUEFORChsLHApCQlfX0lEU1RSSU5HX0NPTkNBVChsLHApCisjZGVmaW5lIF9fSURTVFJJTkcocHJlZml4LCBzdHJpbmcpCQkJCVwKKwlzdGF0aWMgY29uc3QgY2hhciBfX0lEU1RSSU5HX0VYUEFORChfX0xJTkVfXyxwcmVmaXgpIFtdCVwKKwkgICAgTUtTSF9BX1VTRUQgPSAiQCgiIiMpIiAjcHJlZml4ICI6ICIgc3RyaW5nCisjZGVmaW5lIF9fQ09QWVJJR0hUKHgpCQlfX0lEU1RSSU5HKGNvcHlyaWdodCx4KQorI2RlZmluZSBfX1JDU0lEKHgpCQlfX0lEU1RSSU5HKHJjc2lkLHgpCisjZGVmaW5lIF9fU0NDU0lEKHgpCQlfX0lEU1RSSU5HKHNjY3NpZCx4KQorI2VuZGlmCisKKyNpZmRlZiBFWFRFUk4KK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL3NoLmgsdiAxLjQwNSAyMDEwLzA4LzI0IDE1OjE5OjU0IHRnIEV4cCAkIik7CisjZW5kaWYKKyNkZWZpbmUgTUtTSF9WRVJTSU9OICJSMzkgMjAxMC8wOC8yNCIKKworI2lmbmRlZiBNS1NIX0lOQ0xVREVTX09OTFkKKworLyogZXh0cmEgdHlwZXMgKi8KKworI2lmICFIQVZFX0dFVFJVU0FHRQorI3VuZGVmIHJ1c2FnZQorI3VuZGVmIFJVU0FHRV9TRUxGCisjdW5kZWYgUlVTQUdFX0NISUxEUkVOCisjZGVmaW5lIHJ1c2FnZSBta3NoX3J1c2FnZQorI2RlZmluZSBSVVNBR0VfU0VMRgkwCisjZGVmaW5lIFJVU0FHRV9DSElMRFJFTgktMQorCitzdHJ1Y3QgcnVzYWdlIHsKKwlzdHJ1Y3QgdGltZXZhbCBydV91dGltZTsKKwlzdHJ1Y3QgdGltZXZhbCBydV9zdGltZTsKK307CisjZW5kaWYKKworI2lmICFIQVZFX1JMSU1fVAordHlwZWRlZiBsb25nIHJsaW1fdDsKKyNlbmRpZgorCisjaWYgIUhBVkVfU0lHX1QKKyN1bmRlZiBzaWdfdAordHlwZWRlZiB2b2lkICgqc2lnX3QpKGludCk7CisjZW5kaWYKKworI2lmICFIQVZFX1NUREJPT0xfSAorLyoga2x1ZGdlLCBidXQgZW5vdWdoIGZvciBta3NoICovCit0eXBlZGVmIGludCBib29sOworI2RlZmluZSBmYWxzZSAwCisjZGVmaW5lIHRydWUgMQorI2VuZGlmCisKKyNpZiAhSEFWRV9DQU5fSU5UVFlQRVMKKyNpZiAhSEFWRV9DQU5fVUNCSU5UUwordHlwZWRlZiBzaWduZWQgaW50IGludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKKyNlbHNlCit0eXBlZGVmIHVfaW50MzJfdCB1aW50MzJfdDsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhSEFWRV9DQU5fSU5UOFRZUEUKKyNpZiAhSEFWRV9DQU5fVUNCSU5UOAordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4X3Q7CisjZWxzZQordHlwZWRlZiB1X2ludDhfdCB1aW50OF90OworI2VuZGlmCisjZW5kaWYKKworLyogZXh0cmEgbWFjcm9zICovCisKKyNpZm5kZWYgdGltZXJjbGVhcgorI2RlZmluZSB0aW1lcmNsZWFyKHR2cCkJCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJKHR2cCktPnR2X3NlYyA9ICh0dnApLT50dl91c2VjID0gMDsJCQlcCisJfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisjZW5kaWYKKyNpZm5kZWYgdGltZXJhZGQKKyNkZWZpbmUgdGltZXJhZGQodHZwLCB1dnAsIHZ2cCkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQkodnZwKS0+dHZfc2VjID0gKHR2cCktPnR2X3NlYyArICh1dnApLT50dl9zZWM7CQlcCisJCSh2dnApLT50dl91c2VjID0gKHR2cCktPnR2X3VzZWMgKyAodXZwKS0+dHZfdXNlYzsJXAorCQlpZiAoKHZ2cCktPnR2X3VzZWMgPj0gMTAwMDAwMCkgewkJCVwKKwkJCSh2dnApLT50dl9zZWMrKzsJCQkJXAorCQkJKHZ2cCktPnR2X3VzZWMgLT0gMTAwMDAwMDsJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorI2VuZGlmCisjaWZuZGVmIHRpbWVyc3ViCisjZGVmaW5lIHRpbWVyc3ViKHR2cCwgdXZwLCB2dnApCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJKHZ2cCktPnR2X3NlYyA9ICh0dnApLT50dl9zZWMgLSAodXZwKS0+dHZfc2VjOwkJXAorCQkodnZwKS0+dHZfdXNlYyA9ICh0dnApLT50dl91c2VjIC0gKHV2cCktPnR2X3VzZWM7CVwKKwkJaWYgKCh2dnApLT50dl91c2VjIDwgMCkgewkJCQlcCisJCQkodnZwKS0+dHZfc2VjLS07CQkJCVwKKwkJCSh2dnApLT50dl91c2VjICs9IDEwMDAwMDA7CQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKyNlbmRpZgorCisjZGVmaW5lIGtzaF9pc2RpZ2l0KGMpCSgoKGMpID49ICcwJykgJiYgKChjKSA8PSAnOScpKQorI2RlZmluZSBrc2hfaXNsb3dlcihjKQkoKChjKSA+PSAnYScpICYmICgoYykgPD0gJ3onKSkKKyNkZWZpbmUga3NoX2lzdXBwZXIoYykJKCgoYykgPj0gJ0EnKSAmJiAoKGMpIDw9ICdaJykpCisjZGVmaW5lIGtzaF90b2xvd2VyKGMpCSgoKGMpID49ICdBJykgJiYgKChjKSA8PSAnWicpID8gKGMpIC0gJ0EnICsgJ2EnIDogKGMpKQorI2RlZmluZSBrc2hfdG91cHBlcihjKQkoKChjKSA+PSAnYScpICYmICgoYykgPD0gJ3onKSA/IChjKSAtICdhJyArICdBJyA6IChjKSkKKyNkZWZpbmUga3NoX2lzZGFzaChzKQkoKChzKSAhPSBOVUxMKSAmJiAoKHMpWzBdID09ICctJykgJiYgKChzKVsxXSA9PSAnXDAnKSkKKyNkZWZpbmUga3NoX2lzc3BhY2UoYykJKCgoKGMpID49IDB4MDkpICYmICgoYykgPD0gMHgwRCkpIHx8ICgoYykgPT0gMHgyMCkpCisKKyNpZmRlZiBOT19QQVRIX01BWAorI3VuZGVmIFBBVEhfTUFYCisjZWxzZQorI2lmbmRlZiBQQVRIX01BWAorI2RlZmluZSBQQVRIX01BWAkxMDI0CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBTSVpFX01BWAorI2lmZGVmIFNJWkVfVF9NQVgKKyNkZWZpbmUgU0laRV9NQVgJU0laRV9UX01BWAorI2Vsc2UKKyNkZWZpbmUgU0laRV9NQVgJKChzaXplX3QpLTEpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBTX0lTTE5LCisjZGVmaW5lIFNfSVNMTksobSkJKChtICYgMDE3MDAwMCkgPT0gMDEyMDAwMCkKKyNlbmRpZgorI2lmbmRlZiBTX0lTU09DSworI2RlZmluZSBTX0lTU09DSyhtKQkoKG0gJiAwMTcwMDAwKSA9PSAwMTQwMDAwKQorI2VuZGlmCisjaWZuZGVmIERFRkZJTEVNT0RFCisjZGVmaW5lIERFRkZJTEVNT0RFCShTX0lSVVNSfFNfSVdVU1J8U19JUkdSUHxTX0lXR1JQfFNfSVJPVEh8U19JV09USCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTUFQX0ZBSUxFRCkKKy8qIFhYWCBpbWFrZSBzdHlsZSAqLworIyAgaWYgZGVmaW5lZChfX2xpbnV4KQorI2RlZmluZSBNQVBfRkFJTEVECSgodm9pZCAqKS0xKQorIyAgZWxpZiBkZWZpbmVkKF9fYnNkaV9fKSB8fCBkZWZpbmVkKF9fb3NmX18pIHx8IGRlZmluZWQoX191bHRyaXgpCisjZGVmaW5lIE1BUF9GQUlMRUQJKChjYWRkcl90KS0xKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE5TSUcKKyNpZiBkZWZpbmVkKF9OU0lHKQorI2RlZmluZSBOU0lHCQlfTlNJRworI2VsaWYgZGVmaW5lZChTSUdNQVgpCisjZGVmaW5lIE5TSUcJCShTSUdNQVgrMSkKKyNlbmRpZgorI2VuZGlmCisKKyN1bmRlZiBCQUQJCS8qIEFJWCBkZWZpbmVzIHRoYXQgc29tZXdoZXJlICovCisKKy8qIE9TLWRlcGVuZGVudCBhZGRpdGlvbnMgKGZ1bmN0aW9ucywgdmFyaWFibGVzLCBieSBPUykgKi8KKworI2lmICFIQVZFX0ZMT0NLX0RFQ0wKK2V4dGVybiBpbnQgZmxvY2soaW50LCBpbnQpOworI2VuZGlmCisKKyNpZiAhSEFWRV9HRVRSVVNBR0UKK2V4dGVybiBpbnQgZ2V0cnVzYWdlKGludCwgc3RydWN0IHJ1c2FnZSAqKTsKKyNlbmRpZgorCisjaWYgIUhBVkVfUkVWT0tFX0RFQ0wKK2V4dGVybiBpbnQgcmV2b2tlKGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworI2lmICFIQVZFX1NFVE1PREUKK21vZGVfdCBnZXRtb2RlKGNvbnN0IHZvaWQgKiwgbW9kZV90KTsKK3ZvaWQgKnNldG1vZGUoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjaWZkZWYgX191bHRyaXgKKy8qIFhYWCBpbWFrZSBzdHlsZSAqLworaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworI2VuZGlmCisKKyNpZiAhSEFWRV9TVFJDQVNFU1RSCitjb25zdCBjaGFyICpzdHJpc3RyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjaWYgIUhBVkVfU1RSTENQWQorc2l6ZV90IHN0cmxjcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CisjZW5kaWYKKworI2lmICFIQVZFX1NZU19TSUdMSVNUX0RFQ0wKK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBzeXNfc2lnbGlzdFtdOworI2VuZGlmCisKKyNpZmRlZiBfX0lOVEVSSVgKKy8qIFhYWCBpbWFrZSBzdHlsZSAqLworI2RlZmluZSBtYWtlZGV2IG1rZGV2CitleHRlcm4gaW50IF9fY2RlY2wgc2V0ZXVpZCh1aWRfdCk7CitleHRlcm4gaW50IF9fY2RlY2wgc2V0ZWdpZChnaWRfdCk7CisjZW5kaWYKKworLyogcmVtb3ZlIHJlZHVuZGFuY2VzICovCisKKyNpZiBkZWZpbmVkKE1pckJTRCkgJiYgKE1pckJTRCA+PSAweDA4QTgpCisjZGVmaW5lIE1LU0hfbWlyYnNkX3djd2lkdGgKKyNkZWZpbmUgdXRmX3djd2lkdGgoaSkgd2N3aWR0aCgoX19XQ0hBUl9UWVBFX18paSkKK2V4dGVybiBpbnQgd2N3aWR0aChfX1dDSEFSX1RZUEVfXyk7CisjZW5kaWYKKworCisvKiBzb21lIHVzZWZ1bCAjZGVmaW5lcyAqLworI2lmZGVmIEVYVEVSTgorIyBkZWZpbmUgSV9fKGkpID0gaQorI2Vsc2UKKyMgZGVmaW5lIElfXyhpKQorIyBkZWZpbmUgRVhURVJOIGV4dGVybgorIyBkZWZpbmUgRVhURVJOX0RFRklORUQKKyNlbmRpZgorCisjZGVmaW5lIE5FTEVNKGEpCShzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKyNkZWZpbmUgQklUKGkpCQkoMSA8PCAoaSkpCS8qIGRlZmluZSBiaXQgaW4gZmxhZyAqLworCisvKiBUYWJsZSBmbGFnIHR5cGUgLSBuZWVkcyA+IDE2IGFuZCA8IDMyIGJpdHMgKi8KK3R5cGVkZWYgaW50MzJfdCBUZmxhZzsKKworLyogYXJpdGhtZXRpY3MgdHlwZXMgKi8KK3R5cGVkZWYgaW50MzJfdCBta3NoX2FyaV90OwordHlwZWRlZiB1aW50MzJfdCBta3NoX3VhcmlfdDsKKworLyogdGhlc2Ugc2hhbGwgYmUgc21hbGxlciB0aGFuIDEwMCAqLworI2lmZGVmIE1LU0hfQ09OU0VSVkFUSVZFX0ZEUworI2RlZmluZSBOVUZJTEUJCTMyCS8qIE51bWJlciBvZiB1c2VyLWFjY2Vzc2libGUgZmlsZXMgKi8KKyNkZWZpbmUgRkRCQVNFCQkxMAkvKiBGaXJzdCBmaWxlIHVzYWJsZSBieSBTaGVsbCAqLworI2Vsc2UKKyNkZWZpbmUgTlVGSUxFCQk1NgkvKiBOdW1iZXIgb2YgdXNlci1hY2Nlc3NpYmxlIGZpbGVzICovCisjZGVmaW5lIEZEQkFTRQkJMjQJLyogRmlyc3QgZmlsZSB1c2FibGUgYnkgU2hlbGwgKi8KKyNlbmRpZgorCisvKiBNYWtlIE1BR0lDIGEgY2hhciB0aGF0IG1pZ2h0IGJlIHByaW50ZWQgdG8gbWFrZSBidWdzIG1vcmUgb2J2aW91cywgYnV0CisgKiBub3QgYSBjaGFyIHRoYXQgaXMgdXNlZCBvZnRlbi4gQWxzbywgY2FuJ3QgdXNlIHRoZSBoaWdoIGJpdCBhcyBpdCBjYXVzZXMKKyAqIHBvcnRhYmlsaXR5IHByb2JsZW1zIChjYWxsaW5nIHN0cmNocih4LCAweDgwfCd4JykgaXMgZXJyb3IgcHJvbmUpLgorICovCisjZGVmaW5lIE1BR0lDCQkoNykJLyogcHJlZml4IGZvciAqP1sheyx9IGR1cmluZyBleHBhbmQgKi8KKyNkZWZpbmUgSVNNQUdJQyhjKQkoKHVuc2lnbmVkIGNoYXIpKGMpID09IE1BR0lDKQorI2RlZmluZSBOT1QJCSchJwkvKiBtaWdodCB1c2UgXiAoaWUsIFshLi4uXSB2cyBbXi4uXSkgKi8KKworI2RlZmluZSBMSU5FCQk0MDk2CS8qIGlucHV0IGxpbmUgc2l6ZSAqLworCitFWFRFUk4gY29uc3QgY2hhciAqc2FmZV9wcm9tcHQ7IC8qIHNhZmUgcHJvbXB0IGlmIFBTMSBzdWJzdGl0dXRpb24gZmFpbHMgKi8KK0VYVEVSTiBjb25zdCBjaGFyIGluaXR2c25bXSBJX18oIktTSF9WRVJTSU9OPUAoIylNSVJCU0QgS1NIICIgTUtTSF9WRVJTSU9OKTsKKyNkZWZpbmUgS1NIX1ZFUlNJT04JKGluaXR2c24gKyAvKiAiS1NIX1ZFUlNJT049QCgjKSIgKi8gMTYpCisKK0VYVEVSTiBjb25zdCBjaGFyIGRpZ2l0c191Y1tdIElfXygiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIik7CitFWFRFUk4gY29uc3QgY2hhciBkaWdpdHNfbGNbXSBJX18oIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpOworCisvKgorICogRXZpbCBoYWNrIGZvciBjb25zdCBjb3JyZWN0bmVzcyBkdWUgdG8gQVBJIGJyb2tlbm5lc3MKKyAqLwordW5pb24gbWtzaF9jY2hhY2sgeworCWNoYXIgKnJ3OworCWNvbnN0IGNoYXIgKnJvOworfTsKK3VuaW9uIG1rc2hfY2NwaGFjayB7CisJY2hhciAqKnJ3OworCWNvbnN0IGNoYXIgKipybzsKK307CisKKy8qIGZvciBjb25zdCBkZWJ1Z2dpbmcgKi8KKyNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0lDQykgJiYgXAorICAgICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmICFkZWZpbmVkKF9fU1VOUFJPX0MpCitjaGFyICp1Y3N0cmNocihjaGFyICosIGludCk7CitjaGFyICp1Y3N0cnN0cihjaGFyICosIGNvbnN0IGNoYXIgKik7CisjdW5kZWYgc3RyY2hyCisjZGVmaW5lIHN0cmNociB1Y3N0cmNocgorI2RlZmluZSBzdHJzdHIgdWNzdHJzdHIKKyNkZWZpbmUgY3N0cmNocihzLGMpICh7CQkJXAorCXVuaW9uIG1rc2hfY2NoYWNrIGluLCBvdXQ7CVwKKwkJCQkJXAorCWluLnJvID0gKHMpOwkJCVwKKwlvdXQucncgPSB1Y3N0cmNocihpbi5ydywgKGMpKTsJXAorCShvdXQucm8pOwkJCVwKK30pCisjZGVmaW5lIGNzdHJzdHIoYixsKSAoewkJCVwKKwl1bmlvbiBta3NoX2NjaGFjayBpbiwgb3V0OwlcCisJCQkJCVwKKwlpbi5ybyA9IChiKTsJCQlcCisJb3V0LnJ3ID0gdWNzdHJzdHIoaW4ucncsIChsKSk7CVwKKwkob3V0LnJvKTsJCQlcCit9KQorI2RlZmluZSB2c3RyY2hyKHMsYykJKGNzdHJjaHIoKHMpLCAoYykpICE9IE5VTEwpCisjZGVmaW5lIHZzdHJzdHIoYixsKQkoY3N0cnN0cigoYiksIChsKSkgIT0gTlVMTCkKKyNkZWZpbmUgbWtzc2VydChlKQkoKGUpID8gKHZvaWQpMCA6IGV4aXQoMjU1KSkKKyNlbHNlIC8qICFERUJVRywgIWdjYyAqLworI2RlZmluZSBjc3RyY2hyKHMsYykJKChjb25zdCBjaGFyICopc3RyY2hyKChzKSwgKGMpKSkKKyNkZWZpbmUgY3N0cnN0cihzLGMpCSgoY29uc3QgY2hhciAqKXN0cnN0cigocyksIChjKSkpCisjZGVmaW5lIHZzdHJjaHIocyxjKQkoc3RyY2hyKChzKSwgKGMpKSAhPSBOVUxMKQorI2RlZmluZSB2c3Ryc3RyKGIsbCkJKHN0cnN0cigoYiksIChsKSkgIT0gTlVMTCkKKyNkZWZpbmUgbWtzc2VydChlKQkoKHZvaWQpMCkKKyNlbmRpZgorCisvKiB1c2UgdGhpcyBpcHYgc3RyY2hyKHMsIDApIGJ1dCBubyBzaWRlIGVmZmVjdHMgaW4gcyEgKi8KKyNkZWZpbmUgc3RybnVsKHMpCSgocykgKyBzdHJsZW4ocykpCisKKyNkZWZpbmUgdXRmX3B0cmFkangoc3JjLCBkc3QpIGRvIHsJCQkJCVwKKwkoZHN0KSA9IChzcmMpICsgdXRmX3B0cmFkaihzcmMpOwkJCQlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKworI2lmZGVmIE1LU0hfU01BTEwKKyNkZWZpbmUgc3RyZHVweChkLCBzLCBhcCkgZG8geyBcCisJKGQpID0gc3RyZHVwXygocyksIChhcCkpOyBcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKyNkZWZpbmUgc3RybmR1cHgoZCwgcywgbiwgYXApIGRvIHsgXAorCShkKSA9IHN0cm5kdXBfKChzKSwgKG4pLCAoYXApKTsgXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisjZWxzZQorLyogYmUgY2FyZWZ1bCB0byBldmFsdWF0ZSBhcmd1bWVudHMgb25seSBvbmNlISAqLworI2RlZmluZSBzdHJkdXB4KGQsIHMsIGFwKSBkbyB7CQkJCQkJXAorCWNvbnN0IGNoYXIgKnN0cmR1cF9zcmMgPSAocyk7CQkJCQlcCisJY2hhciAqc3RyZHVwX2RzdCA9IE5VTEw7CQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKHN0cmR1cF9zcmMgIT0gTlVMTCkgewkJCQkJXAorCQlzaXplX3Qgc3RyZHVwX2xlbiA9IHN0cmxlbihzdHJkdXBfc3JjKSArIDE7CQlcCisJCXN0cmR1cF9kc3QgPSBhbGxvYyhzdHJkdXBfbGVuLCAoYXApKTsJCQlcCisJCW1lbWNweShzdHJkdXBfZHN0LCBzdHJkdXBfc3JjLCBzdHJkdXBfbGVuKTsJCVwKKwl9CQkJCQkJCQlcCisJKGQpID0gc3RyZHVwX2RzdDsJCQkJCQlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKyNkZWZpbmUgc3RybmR1cHgoZCwgcywgbiwgYXApIGRvIHsJCQkJCVwKKwljb25zdCBjaGFyICpzdHJkdXBfc3JjID0gKHMpOwkJCQkJXAorCWNoYXIgKnN0cmR1cF9kc3QgPSBOVUxMOwkJCQkJXAorCQkJCQkJCQkJXAorCWlmIChzdHJkdXBfc3JjICE9IE5VTEwpIHsJCQkJCVwKKwkJc2l6ZV90IHN0cm5kdXBfbGVuID0gKG4pOwkJCQlcCisJCXN0cmR1cF9kc3QgPSBhbGxvYyhzdHJuZHVwX2xlbiArIDEsIChhcCkpOwkJXAorCQltZW1jcHkoc3RyZHVwX2RzdCwgc3RyZHVwX3NyYywgc3RybmR1cF9sZW4pOwkJXAorCQlzdHJkdXBfZHN0W3N0cm5kdXBfbGVuXSA9ICdcMCc7CQkJCVwKKwl9CQkJCQkJCQlcCisJKGQpID0gc3RyZHVwX2RzdDsJCQkJCQlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKyNlbmRpZgorCisjaWYgSEFWRV9TVFJDQVNFU1RSCisjZGVmaW5lIHN0cmlzdHIoYixsKQkoKGNvbnN0IGNoYXIgKilzdHJjYXNlc3RyKChiKSwgKGwpKSkKKyNlbmRpZgorCisjaWZkZWYgTUtTSF9TTUFMTAorI2lmbmRlZiBNS1NIX0NPTlNFUlZBVElWRV9GRFMKKyNkZWZpbmUgTUtTSF9DT05TRVJWQVRJVkVfRkRTCS8qIGRlZmluZWQgKi8KKyNlbmRpZgorI2lmbmRlZiBNS1NIX05PUFdOQU0KKyNkZWZpbmUgTUtTSF9OT1BXTkFNCQkvKiBkZWZpbmVkICovCisjZW5kaWYKKyNpZm5kZWYgTUtTSF9TX05PVkkKKyNkZWZpbmUgTUtTSF9TX05PVkkJCTEKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgTUtTSF9TX05PVkkKKyNkZWZpbmUgTUtTSF9TX05PVkkJCTAKKyNlbmRpZgorCisvKgorICogc2ltcGxlIGdyb3VwaW5nIGFsbG9jYXRvcgorICovCisKKy8qIDEuIGludGVybmFsIHN0cnVjdHVyZSAqLworc3RydWN0IGxhbGxvYyB7CisJc3RydWN0IGxhbGxvYyAqbmV4dDsKK307CisKKy8qIDIuIHNpemVzICovCisjZGVmaW5lIEFMTE9DX0lURU0Jc3RydWN0IGxhbGxvYworI2RlZmluZSBBTExPQ19TSVpFCShzaXplb2YoQUxMT0NfSVRFTSkpCisKKy8qIDMuIGdyb3VwIHN0cnVjdHVyZSAob25seSB0aGUgc2FtZSBmb3IgbGFsbG9jLmMpICovCit0eXBlZGVmIHN0cnVjdCBsYWxsb2MgQXJlYTsKKworCitFWFRFUk4gQXJlYSBhcGVybTsJCS8qIHBlcm1hbmVudCBvYmplY3Qgc3BhY2UgKi8KKyNkZWZpbmUgQVBFUk0JJmFwZXJtCisjZGVmaW5lIEFURU1QCSZlLT5hcmVhCisKKy8qCisgKiBmbGFncyAodGhlIG9yZGVyIG9mIHRoZXNlIGVudW1zIE1VU1QgbWF0Y2ggdGhlIG9yZGVyIGluIG1pc2MuYyhvcHRpb25zW10pKQorICovCitlbnVtIHNoX2ZsYWcgeworI2RlZmluZSBTSEZMQUdTX0VOVU1TCisjaW5jbHVkZSAic2hfZmxhZ3MuaCIKKwlGTkZMQUdTCQkvKiAocGxhY2UgaG9sZGVyOiBob3cgbWFueSBmbGFncyBhcmUgdGhlcmUpICovCit9OworCisjZGVmaW5lIEZsYWcoZikJKGtzaHN0YXRlX3Yuc2hlbGxfZmxhZ3NfWyhpbnQpKGYpXSkKKyNkZWZpbmUgVVRGTU9ERQlGbGFnKEZVTklDT0RFKQorCisvKgorICogcGFyc2luZyAmIGV4ZWN1dGlvbiBlbnZpcm9ubWVudAorICovCitleHRlcm4gc3RydWN0IGVudiB7CisJQUxMT0NfSVRFTSBfX2FsbG9jX2k7CS8qIGludGVybmFsLCBkbyBub3QgdG91Y2ggKi8KKwlBcmVhIGFyZWE7CQkvKiB0ZW1wb3JhcnkgYWxsb2NhdGlvbiBhcmVhICovCisJc3RydWN0IGVudiAqb2VudjsJLyogbGluayB0byBwcmV2aW91cyBlbnZpcm9ubWVudCAqLworCXN0cnVjdCBibG9jayAqbG9jOwkvKiBsb2NhbCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyAqLworCXNob3J0ICpzYXZlZmQ7CQkvKiBvcmlnaW5hbCByZWRpcmVjdGVkIGZkcyAqLworCXN0cnVjdCB0ZW1wICp0ZW1wczsJLyogdGVtcCBmaWxlcyAqLworCXNpZ2ptcF9idWYgamJ1ZjsJLyogbG9uZyBqdW1wIGJhY2sgdG8gZW52IGNyZWF0b3IgKi8KKwlzaG9ydCB0eXBlOwkJLyogZW52aXJvbm1lbnQgdHlwZSAtIHNlZSBiZWxvdyAqLworCXNob3J0IGZsYWdzOwkJLyogRUZfKiAqLworfSAqZTsKKworLyogc3RydWN0IGVudi50eXBlIHZhbHVlcyAqLworI2RlZmluZSBFX05PTkUJMAkvKiBkdW1teSBlbnZpcm9ubWVudCAqLworI2RlZmluZSBFX1BBUlNFCTEJLyogcGFyc2luZyBjb21tYW5kICMgKi8KKyNkZWZpbmUgRV9GVU5DCTIJLyogZXhlY3V0aW5nIGZ1bmN0aW9uICMgKi8KKyNkZWZpbmUgRV9JTkNMCTMJLyogaW5jbHVkaW5nIGEgZmlsZSB2aWEgLiAjICovCisjZGVmaW5lIEVfRVhFQwk0CS8qIGV4ZWN1dGluZyBjb21tYW5kIHRyZWUgKi8KKyNkZWZpbmUgRV9MT09QCTUJLyogZXhlY3V0aW5nIGZvci93aGlsZSAjICovCisjZGVmaW5lIEVfRVJSSAk2CS8qIGdlbmVyYWwgZXJyb3IgaGFuZGxlciAjICovCisvKiAjIGluZGljYXRlcyBlbnYgaGFzIHZhbGlkIGpidWYgKHNlZSB1bndpbmQoKSkgKi8KKworLyogc3RydWN0IGVudi5mbGFnIHZhbHVlcyAqLworI2RlZmluZSBFRl9GVU5DX1BBUlNFCUJJVCgwKQkvKiBmdW5jdGlvbiBiZWluZyBwYXJzZWQgKi8KKyNkZWZpbmUgRUZfQlJLQ09OVF9QQVNTCUJJVCgxKQkvKiBzZXQgaWYgRV9MT09QIG11c3QgcGFzcyBicmVhay9jb250aW51ZSBvbiAqLworI2RlZmluZSBFRl9GQUtFX1NJR0RJRQlCSVQoMikJLyogaGFjayB0byBnZXQgaW5mbyBmcm9tIHVud2luZCB0byBxdWl0ZW52ICovCisKKy8qIERvIGJyZWFrcy9jb250aW51ZXMgc3RvcCBhdCBlbnYgdHlwZSBlPyAqLworI2RlZmluZSBTVE9QX0JSS0NPTlQodCkJKCh0KSA9PSBFX05PTkUgfHwgKHQpID09IEVfUEFSU0UgXAorCQkJIHx8ICh0KSA9PSBFX0ZVTkMgfHwgKHQpID09IEVfSU5DTCkKKy8qIERvIHJldHVybnMgc3RvcCBhdCBlbnYgdHlwZSBlPyAqLworI2RlZmluZSBTVE9QX1JFVFVSTih0KQkoKHQpID09IEVfRlVOQyB8fCAodCkgPT0gRV9JTkNMKQorCisvKiB2YWx1ZXMgZm9yIHNpZ2xvbmdqbXAoZS0+amJ1ZiwgMCkgKi8KKyNkZWZpbmUgTFJFVFVSTgkxCS8qIHJldHVybiBzdGF0ZW1lbnQgKi8KKyNkZWZpbmUgTEVYSVQJMgkvKiBleGl0IHN0YXRlbWVudCAqLworI2RlZmluZSBMRVJST1IJMwkvKiBlcnJvcmYoKSBjYWxsZWQgKi8KKyNkZWZpbmUgTExFQVZFCTQJLyogdW50cmFwcGFibGUgZXhpdC9lcnJvciAqLworI2RlZmluZSBMSU5UUgk1CS8qIF5DIG5vdGljZWQgKi8KKyNkZWZpbmUgTEJSRUFLCTYJLyogYnJlYWsgc3RhdGVtZW50ICovCisjZGVmaW5lIExDT05USU4JNwkvKiBjb250aW51ZSBzdGF0ZW1lbnQgKi8KKyNkZWZpbmUgTFNIRUxMCTgJLyogcmV0dXJuIHRvIGludGVyYWN0aXZlIHNoZWxsKCkgKi8KKyNkZWZpbmUgTEFFWFBSCTkJLyogZXJyb3IgaW4gYXJpdGhtZXRpYyBleHByZXNzaW9uICovCisKKy8qCisgKiBzb21lIGtpbmQgb2YgZ2xvYmFsIHNoZWxsIHN0YXRlLCBmb3IgY2hhbmdlX3JhbmRvbSgpIG1vc3RseQorICovCisKK0VYVEVSTiBzdHJ1Y3QgbWtzaF9rc2hzdGF0ZV92IHsKKwkvKiBmb3IgY2hhbmdlX3JhbmRvbSAqLworCXN0cnVjdCB0aW1ldmFsIGNyX3R2OwkvKiB0aW1lc3RhbXAgKi8KKwljb25zdCB2b2lkICpjcl9kcDsJLyogYXJndW1lbnQgYWRkcmVzcyAqLworCXNpemVfdCBjcl9kc3o7CQkvKiBhcmd1bWVudCBsZW5ndGggKi8KKwl1aW50MzJfdCBsY2dfc3RhdGVfOwkvKiBwcmV2aW91cyBMQ0cgc3RhdGUgKi8KKwkvKiBnbG9iYWwgc3RhdGUgKi8KKwlwaWRfdCBwcm9jcGlkXzsJCS8qIFBJRCBvZiBleGVjdXRpbmcgcHJvY2VzcyAqLworCWludCBleHN0YXRfOwkJLyogZXhpdCBzdGF0dXMgKi8KKwlpbnQgc3Vic3RfZXhzdGF0XzsJLyogZXhpdCBzdGF0dXMgb2YgbGFzdCAkKC4uKS9gLi5gICovCisJc3RydWN0IGVudiBlbnZfOwkvKiB0b3AtbGV2ZWwgcGFyc2luZyAmIGV4ZWN1dGlvbiBlbnYuICovCisJdWludDhfdCBzaGVsbF9mbGFnc19bRk5GTEFHU107Cit9IGtzaHN0YXRlX3Y7CitFWFRFUk4gc3RydWN0IG1rc2hfa3Noc3RhdGVfZiB7CisJY29uc3QgY2hhciAqa3NobmFtZV87CS8qICQwICovCisJcGlkX3Qga3NocGlkXzsJCS8qICQkLCBzaGVsbCBQSUQgKi8KKwlwaWRfdCBrc2hwZ3JwXzsJCS8qIHByb2Nlc3MgZ3JvdXAgb2Ygc2hlbGwgKi8KKwl1aWRfdCBrc2hldWlkXzsJCS8qIGVmZmVjdGl2ZSBVSUQgb2Ygc2hlbGwgKi8KKwlwaWRfdCBrc2hwcGlkXzsJCS8qIFBJRCBvZiBwYXJlbnQgb2Ygc2hlbGwgKi8KKwl1aW50MzJfdCBoOwkJLyogc29tZSBraW5kIG9mIGhhc2ggKi8KK30ga3Noc3RhdGVfZjsKKyNkZWZpbmUga3NobmFtZQkJa3Noc3RhdGVfZi5rc2huYW1lXworI2RlZmluZSBrc2hwaWQJCWtzaHN0YXRlX2Yua3NocGlkXworI2RlZmluZSBwcm9jcGlkCQlrc2hzdGF0ZV92LnByb2NwaWRfCisjZGVmaW5lIGtzaHBncnAJCWtzaHN0YXRlX2Yua3NocGdycF8KKyNkZWZpbmUga3NoZXVpZAkJa3Noc3RhdGVfZi5rc2hldWlkXworI2RlZmluZSBrc2hwcGlkCQlrc2hzdGF0ZV9mLmtzaHBwaWRfCisjZGVmaW5lIGV4c3RhdAkJa3Noc3RhdGVfdi5leHN0YXRfCisjZGVmaW5lIHN1YnN0X2V4c3RhdAlrc2hzdGF0ZV92LnN1YnN0X2V4c3RhdF8KKworLyogZXZpbCBoYWNrOiByZXR1cm4gaGFzaChrc2hzdGF0ZV9mIGNvbmNhdCAoa3Noc3RhdGVfZicuaDo9aGFzaChhcmcpKSkgKi8KK3VpbnQzMl90IGV2aWxoYXNoKGNvbnN0IGNoYXIgKik7CisKKworLyogb3B0aW9uIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgT0ZfQ01ETElORQkweDAxCS8qIGNvbW1hbmQgbGluZSAqLworI2RlZmluZSBPRl9TRVQJCTB4MDIJLyogc2V0IGJ1aWx0aW4gKi8KKyNkZWZpbmUgT0ZfU1BFQ0lBTAkweDA0CS8qIGEgc3BlY2lhbCB2YXJpYWJsZSBjaGFuZ2luZyAqLworI2RlZmluZSBPRl9JTlRFUk5BTAkweDA4CS8qIHNldCBpbnRlcm5hbGx5IGJ5IHNoZWxsICovCisjZGVmaW5lIE9GX0ZJUlNUVElNRQkweDEwCS8qIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCBvbmNlICovCisjZGVmaW5lIE9GX0FOWQkJKE9GX0NNRExJTkUgfCBPRl9TRVQgfCBPRl9TUEVDSUFMIHwgT0ZfSU5URVJOQUwpCisKK3N0cnVjdCBzaG9wdGlvbiB7CisJY29uc3QgY2hhciAqbmFtZTsJLyogbG9uZyBuYW1lIG9mIG9wdGlvbiAqLworCWNoYXIgYzsJCQkvKiBjaGFyYWN0ZXIgZmxhZyAoaWYgYW55KSAqLworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CS8qIE9GXyogKi8KK307CitleHRlcm4gY29uc3Qgc3RydWN0IHNob3B0aW9uIG9wdGlvbnNbXTsKKworLyogbnVsbCB2YWx1ZSBmb3IgdmFyaWFibGU7IGNvbXBhcmlzaW9uIHBvaW50ZXIgZm9yIHVuc2V0ICovCitFWFRFUk4gY2hhciBudWxsW10gSV9fKCIiKTsKKy8qIGhlbHBlcnMgZm9yIHN0cmluZyBwb29saW5nICovCisjZGVmaW5lIFRfc3luZXJyICJzeW50YXggZXJyb3IiCitFWFRFUk4gY29uc3QgY2hhciByX2ZjX2VfW10gSV9fKCJyPWZjIC1lIC0iKTsKKyNkZWZpbmUgZmNfZV8JCShyX2ZjX2VfICsgMikJCS8qICJmYyAtZSAtIiAqLworI2RlZmluZSBmY19lX24JCTcJCQkvKiBzdHJsZW4oZmNfZV8pICovCitFWFRFUk4gY29uc3QgY2hhciBUX2xvY2FsX3R5cGVzZXRbXSBJX18oImxvY2FsPXR5cGVzZXQiKTsKKyNkZWZpbmUgVF9fdHlwZXNldAkoVF9sb2NhbF90eXBlc2V0ICsgNSkJLyogIj10eXBlc2V0IiAqLworI2RlZmluZSBUX3R5cGVzZXQJKFRfbG9jYWxfdHlwZXNldCArIDYpCS8qICJ0eXBlc2V0IiAqLworCitlbnVtIHRlbXBfdHlwZSB7CisJVFRfSEVSRURPQ19FWFAsCS8qIGV4cGFuZGVkIGhlcmVkb2MgKi8KKwlUVF9ISVNUX0VESVQJLyogdGVtcCBmaWxlIHVzZWQgZm9yIGhpc3RvcnkgZWRpdGluZyAoZmMgLWUpICovCit9OwordHlwZWRlZiBlbnVtIHRlbXBfdHlwZSBUZW1wX3R5cGU7CisvKiB0ZW1wL2hlcmVkb2MgZmlsZXMuIFRoZSBmaWxlIGlzIHJlbW92ZWQgd2hlbiB0aGUgc3RydWN0IGlzIGZyZWVkLiAqLworc3RydWN0IHRlbXAgeworCXN0cnVjdCB0ZW1wICpuZXh0OworCXN0cnVjdCBzaGYgKnNoZjsKKwljaGFyICpuYW1lOworCWludCBwaWQ7CS8qIHBpZCBvZiBwcm9jZXNzIHBhcnNlZCBoZXJlLWRvYyAqLworCVRlbXBfdHlwZSB0eXBlOworfTsKKworLyoKKyAqIHN0ZGlvIGFuZCBvdXIgSU8gcm91dGluZXMKKyAqLworCisjZGVmaW5lIHNobF9zcGFyZQkoJnNoZl9pb2JbMF0pCS8qIGZvciBjX3JlYWQoKS9jX3ByaW50KCkgKi8KKyNkZWZpbmUgc2hsX3N0ZG91dAkoJnNoZl9pb2JbMV0pCisjZGVmaW5lIHNobF9vdXQJCSgmc2hmX2lvYlsyXSkKK0VYVEVSTiBpbnQgc2hsX3N0ZG91dF9vazsKKworLyoKKyAqIHRyYXAgaGFuZGxlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgdHJhcCB7CisJY29uc3QgY2hhciAqbmFtZTsJLyogc2hvcnQgbmFtZSAqLworCWNvbnN0IGNoYXIgKm1lc3M7CS8qIGRlc2NyaXB0aXZlIG5hbWUgKi8KKwljaGFyICp0cmFwOwkJLyogdHJhcCBjb21tYW5kICovCisJc2lnX3QgY3Vyc2lnOwkJLyogY3VycmVudCBoYW5kbGVyICh2YWxpZCBpZiBURl9PUklHXyogc2V0KSAqLworCXNpZ190IHNodHJhcDsJCS8qIHNoZWxsIHNpZ25hbCBoYW5kbGVyICovCisJaW50IHNpZ25hbDsJCS8qIHNpZ25hbCBudW1iZXIgKi8KKwlpbnQgZmxhZ3M7CQkvKiBURl8qICovCisJdm9sYXRpbGUgc2lnX2F0b21pY190IHNldDsgLyogdHJhcCBwZW5kaW5nICovCit9IFRyYXA7CisKKy8qIHZhbHVlcyBmb3IgVHJhcC5mbGFncyAqLworI2RlZmluZSBURl9TSEVMTF9VU0VTCUJJVCgwKQkvKiBzaGVsbCB1c2VzIHNpZ25hbCwgdXNlciBjYW4ndCBjaGFuZ2UgKi8KKyNkZWZpbmUgVEZfVVNFUl9TRVQJQklUKDEpCS8qIHVzZXIgaGFzICh0cmllZCB0bykgc2V0IHRyYXAgKi8KKyNkZWZpbmUgVEZfT1JJR19JR04JQklUKDIpCS8qIG9yaWdpbmFsIGFjdGlvbiB3YXMgU0lHX0lHTiAqLworI2RlZmluZSBURl9PUklHX0RGTAlCSVQoMykJLyogb3JpZ2luYWwgYWN0aW9uIHdhcyBTSUdfREZMICovCisjZGVmaW5lIFRGX0VYRUNfSUdOCUJJVCg0KQkvKiByZXN0b3JlIFNJR19JR04ganVzdCBiZWZvcmUgZXhlYyAqLworI2RlZmluZSBURl9FWEVDX0RGTAlCSVQoNSkJLyogcmVzdG9yZSBTSUdfREZMIGp1c3QgYmVmb3JlIGV4ZWMgKi8KKyNkZWZpbmUgVEZfREZMX0lOVFIJQklUKDYpCS8qIHdoZW4gcmVjZWl2ZWQsIGRlZmF1bHQgYWN0aW9uIGlzIExJTlRSICovCisjZGVmaW5lIFRGX1RUWV9JTlRSCUJJVCg3KQkvKiB0dHkgZ2VuZXJhdGVkIHNpZ25hbCAoc2VlIGpfd2FpdGopICovCisjZGVmaW5lIFRGX0NIQU5HRUQJQklUKDgpCS8qIHVzZWQgYnkgcnVudHJhcCgpIHRvIGRldGVjdCB0cmFwIGNoYW5nZXMgKi8KKyNkZWZpbmUgVEZfRkFUQUwJQklUKDkpCS8qIGNhdXNlcyB0ZXJtaW5hdGlvbiBpZiBub3QgdHJhcHBlZCAqLworCisvKiB2YWx1ZXMgZm9yIHNldHNpZygpL3NldGV4ZWNzaWcoKSBmbGFncyBhcmd1bWVudCAqLworI2RlZmluZSBTU19SRVNUT1JFX01BU0sJMHgzCS8qIGhvdyB0byByZXN0b3JlIGEgc2lnbmFsIGJlZm9yZSBhbiBleGVjKCkgKi8KKyNkZWZpbmUgU1NfUkVTVE9SRV9DVVJSCTAJLyogbGVhdmUgY3VycmVudCBoYW5kbGVyIGluIHBsYWNlICovCisjZGVmaW5lIFNTX1JFU1RPUkVfT1JJRwkxCS8qIHJlc3RvcmUgb3JpZ2luYWwgaGFuZGxlciAqLworI2RlZmluZSBTU19SRVNUT1JFX0RGTAkyCS8qIHJlc3RvcmUgdG8gU0lHX0RGTCAqLworI2RlZmluZSBTU19SRVNUT1JFX0lHTgkzCS8qIHJlc3RvcmUgdG8gU0lHX0lHTiAqLworI2RlZmluZSBTU19GT1JDRQlCSVQoMykJLyogc2V0IHNpZ25hbCBldmVuIGlmIG9yaWdpbmFsIHNpZ25hbCBpZ25vcmVkICovCisjZGVmaW5lIFNTX1VTRVIJCUJJVCg0KQkvKiB1c2VyIGlzIGRvaW5nIHRoZSBzZXQgKGllLCB0cmFwIGNvbW1hbmQpICovCisjZGVmaW5lIFNTX1NIVFJBUAlCSVQoNSkJLyogdHJhcCBmb3IgaW50ZXJuYWwgdXNlIChBTFJNLCBDSExELCBXSU5DSCkgKi8KKworI2RlZmluZSBTSUdFWElUXwkwCS8qIGZvciB0cmFwIEVYSVQgKi8KKyNkZWZpbmUgU0lHRVJSXwkJTlNJRwkvKiBmb3IgdHJhcCBFUlIgKi8KKworRVhURVJOIHZvbGF0aWxlIHNpZ19hdG9taWNfdCB0cmFwOwkvKiB0cmFwcyBwZW5kaW5nPyAqLworRVhURVJOIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBpbnRyc2lnOwkvKiBwZW5kaW5nIHRyYXAgaW50ZXJydXB0cyBjb21tYW5kICovCitFWFRFUk4gdm9sYXRpbGUgc2lnX2F0b21pY190IGZhdGFsX3RyYXA7LyogcmVjZWl2ZWQgYSBmYXRhbCBzaWduYWwgKi8KK2V4dGVybglUcmFwCXNpZ3RyYXBzW05TSUcrMV07CisKKy8qIGdvdF93aW5jaCA9IDEgd2hlbiB3ZSBuZWVkIHRvIHJlLWFkanVzdCB0aGUgd2luZG93IHNpemUgKi8KKyNpZmRlZiBTSUdXSU5DSAorRVhURVJOIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBnb3Rfd2luY2ggSV9fKDEpOworI2Vsc2UKKyNkZWZpbmUgZ290X3dpbmNoCXRydWUKKyNlbmRpZgorCisvKgorICogVE1PVVQgc3VwcG9ydAorICovCisvKiB2YWx1ZXMgZm9yIGtzaF90bW91dF9zdGF0ZSAqLworZW51bSB0bW91dF9lbnVtIHsKKwlUTU9VVF9FWEVDVVRJTkcgPSAwLAkvKiBleGVjdXRpbmcgY29tbWFuZHMgKi8KKwlUTU9VVF9SRUFESU5HLAkJLyogd2FpdGluZyBmb3IgaW5wdXQgKi8KKwlUTU9VVF9MRUFWSU5HCQkvKiBoYXZlIHRpbWVkIG91dCAqLworfTsKK0VYVEVSTiB1bnNpZ25lZCBpbnQga3NoX3Rtb3V0OworRVhURVJOIGVudW0gdG1vdXRfZW51bSBrc2hfdG1vdXRfc3RhdGUgSV9fKFRNT1VUX0VYRUNVVElORyk7CisKKy8qIEZvciAiWW91IGhhdmUgc3RvcHBlZCBqb2JzIiBtZXNzYWdlICovCitFWFRFUk4gaW50IHJlYWxseV9leGl0OworCisvKgorICogZmFzdCBjaGFyYWN0ZXIgY2xhc3NlcworICovCisjZGVmaW5lIENfQUxQSEEJIEJJVCgwKQkJLyogYS16X0EtWiAqLworI2RlZmluZSBDX0RJR0lUCSBCSVQoMSkJCS8qIDAtOSAqLworI2RlZmluZSBDX0xFWDEJIEJJVCgyKQkJLyogXHQgXG5cMHwmOzw+KCkgKi8KKyNkZWZpbmUgQ19WQVIxCSBCSVQoMykJCS8qICpAIyEkLT8gKi8KKyNkZWZpbmUgQ19JRlNXUwkgQklUKDQpCQkvKiBcdCBcbiAoSUZTIHdoaXRlIHNwYWNlKSAqLworI2RlZmluZSBDX1NVQk9QMSBCSVQoNSkJCS8qICI9LSs/IiAqLworI2RlZmluZSBDX1FVT1RFCSBCSVQoNikJCS8qIFx0XG4gIiMkJicoKSo7PD0+P1tcXWB8IChuZWVkaW5nIHF1b3RpbmcpICovCisjZGVmaW5lIENfSUZTCSBCSVQoNykJCS8qICRJRlMgKi8KKyNkZWZpbmUgQ19TVUJPUDIgQklUKDgpCQkvKiAiIyUiIChtYWdpYywgc2VlIGJlbG93KSAqLworCitleHRlcm4gdW5zaWduZWQgY2hhciBjaHR5cGVzW107CisKKyNkZWZpbmUgY3R5cGUoYywgdCkJISEoICgodCkgPT0gQ19TVUJPUDIpID8JCQkJXAorCQkJICAgICgoKGMpID09ICcjJyB8fCAoYykgPT0gJyUnKSA/IDEgOiAwKSA6CVwKKwkJCSAgICAoY2h0eXBlc1sodW5zaWduZWQgY2hhcikoYyldJih0KSkgKQorI2RlZmluZSBrc2hfaXNhbHBoeChjKQljdHlwZSgoYyksIENfQUxQSEEpCisjZGVmaW5lIGtzaF9pc2FsbnV4KGMpCWN0eXBlKChjKSwgQ19BTFBIQSB8IENfRElHSVQpCisKK0VYVEVSTiBpbnQgaWZzMCBJX18oJyAnKTsJLyogZm9yICIkKiIgKi8KKworLyogQXJndW1lbnQgcGFyc2luZyBmb3IgYnVpbHQtaW4gY29tbWFuZHMgYW5kIGdldG9wdHMgY29tbWFuZCAqLworCisvKiBWYWx1ZXMgZm9yIEdldG9wdC5mbGFncyAqLworI2RlZmluZSBHRl9FUlJPUglCSVQoMCkJLyogY2FsbCBlcnJvcmYoKSBpZiB0aGVyZSBpcyBhbiBlcnJvciAqLworI2RlZmluZSBHRl9QTFVTT1BUCUJJVCgxKQkvKiBhbGxvdyArYyBhcyBhbiBvcHRpb24gKi8KKyNkZWZpbmUgR0ZfTk9OQU1FCUJJVCgyKQkvKiBkb24ndCBwcmludCBhcmd2WzBdIGluIGVycm9ycyAqLworCisvKiBWYWx1ZXMgZm9yIEdldG9wdC5pbmZvICovCisjZGVmaW5lIEdJX01JTlVTCUJJVCgwKQkvKiBhbiBvcHRpb24gc3RhcnRlZCB3aXRoIC0uLi4gKi8KKyNkZWZpbmUgR0lfUExVUwkJQklUKDEpCS8qIGFuIG9wdGlvbiBzdGFydGVkIHdpdGggKy4uLiAqLworI2RlZmluZSBHSV9NSU5VU01JTlVTCUJJVCgyKQkvKiBhcmd1bWVudHMgd2VyZSBlbmRlZCB3aXRoIC0tICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwljb25zdCBjaGFyCSpvcHRhcmc7CisJaW50CQlvcHRpbmQ7CisJaW50CQl1b3B0aW5kOy8qIHdoYXQgdXNlciBzZWVzIGluICRPUFRJTkQgKi8KKwlpbnQJCWZsYWdzOwkvKiBzZWUgR0ZfKiAqLworCWludAkJaW5mbzsJLyogc2VlIEdJXyogKi8KKwl1bnNpZ25lZCBpbnQJcDsJLyogMCBvciBpbmRleCBpbnRvIGFyZ3Zbb3B0aW5kIC0gMV0gKi8KKwljaGFyCQlidWZbMl07CS8qIGZvciBiYWQgb3B0aW9uIE9QVEFSRyB2YWx1ZSAqLworfSBHZXRvcHQ7CisKK0VYVEVSTiBHZXRvcHQgYnVpbHRpbl9vcHQ7CS8qIGZvciBzaGVsbCBidWlsdGluIGNvbW1hbmRzICovCitFWFRFUk4gR2V0b3B0IHVzZXJfb3B0OwkJLyogcGFyc2luZyBzdGF0ZSBmb3IgZ2V0b3B0cyBidWlsdGluIGNvbW1hbmQgKi8KKworLyogVGhpcyBmb3IgY28tcHJvY2Vzc2VzICovCisKK3R5cGVkZWYgaW50MzJfdCBDb3Byb2NfaWQ7IC8qIHNvbWV0aGluZyB0aGF0IHdvbid0IChyZWFsaXN0aWNseSkgd3JhcCAqLworc3RydWN0IGNvcHJvYyB7CisJdm9pZCAqam9iOwkvKiAwIG9yIGpvYiBvZiBjby1wcm9jZXNzIHVzaW5nIGlucHV0IHBpcGUgKi8KKwlpbnQgcmVhZDsJLyogcGlwZSBmcm9tIGNvLXByb2Nlc3MncyBzdGRvdXQgKi8KKwlpbnQgcmVhZHc7CS8qIG90aGVyIHNpZGUgb2YgcmVhZCAoc2F2ZWQgdGVtcG9yYXJpbHkpICovCisJaW50IHdyaXRlOwkvKiBwaXBlIHRvIGNvLXByb2Nlc3MncyBzdGRpbiAqLworCWludCBuam9iczsJLyogbnVtYmVyIG9mIGxpdmUgam9icyB1c2luZyBvdXRwdXQgcGlwZSAqLworCUNvcHJvY19pZCBpZDsJLyogaWQgb2YgY3VycmVudCBvdXRwdXQgcGlwZSAqLworfTsKK0VYVEVSTiBzdHJ1Y3QgY29wcm9jIGNvcHJvYzsKKworLyogVXNlZCBpbiBqb2JzLmMgYW5kIGJ5IGNvcHJvY2VzcyBzdHVmZiBpbiBleGVjLmMgKi8KK0VYVEVSTiBzaWdzZXRfdAkJc21fZGVmYXVsdCwgc21fc2lnY2hsZDsKKworLyogbmFtZSBvZiBjYWxsZWQgYnVpbHRpbiBmdW5jdGlvbiAodXNlZCBieSBlcnJvciBmdW5jdGlvbnMpICovCitFWFRFUk4gY29uc3QgY2hhciAqYnVpbHRpbl9hcmd2MDsKK0VYVEVSTiBUZmxhZyBidWlsdGluX2ZsYWc7CS8qIGZsYWdzIG9mIGNhbGxlZCBidWlsdGluIChTUEVDX0JJLCBldGMuKSAqLworCisvKiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgc2l6ZSBvZiBtZW1vcnkgYWxsb2NhdGVkIGZvciBzYW1lICovCitFWFRFUk4gY2hhcgkqY3VycmVudF93ZDsKK0VYVEVSTiBzaXplX3QJY3VycmVudF93ZF9zaXplOworCisvKiBNaW5pbXVtIHJlcXVpcmVkIHNwYWNlIHRvIHdvcmsgd2l0aCBvbiBhIGxpbmUgLSBpZiB0aGUgcHJvbXB0IGxlYXZlcyBsZXNzCisgKiBzcGFjZSB0aGFuIHRoaXMgb24gYSBsaW5lLCB0aGUgcHJvbXB0IGlzIHRydW5jYXRlZC4KKyAqLworI2RlZmluZSBNSU5fRURJVF9TUEFDRQk3CisvKiBNaW5pbXVtIGFsbG93ZWQgdmFsdWUgZm9yIHhfY29sczogMiBmb3IgcHJvbXB0LCAzIGZvciAiIDwgIiBhdCBlbmQgb2YgbGluZQorICovCisjZGVmaW5lIE1JTl9DT0xTCSgyICsgTUlOX0VESVRfU1BBQ0UgKyAzKQorI2RlZmluZSBNSU5fTElOUwkzCitFWFRFUk4gbWtzaF9hcmlfdCB4X2NvbHMgSV9fKDgwKTsJLyogdHR5IGNvbHVtbnMgKi8KK0VYVEVSTiBta3NoX2FyaV90IHhfbGlucyBJX18oLTEpOwkvKiB0dHkgbGluZXMgKi8KKworLyogVGhlc2UgdG8gYXZvaWQgYnJhY2tldCBtYXRjaGluZyBwcm9ibGVtcyAqLworI2RlZmluZSBPUEFSRU4JJygnCisjZGVmaW5lIENQQVJFTgknKScKKyNkZWZpbmUgT0JSQUNLCSdbJworI2RlZmluZSBDQlJBQ0sJJ10nCisjZGVmaW5lIE9CUkFDRQkneycKKyNkZWZpbmUgQ0JSQUNFCSd9JworCisvKiBEZXRlcm1pbmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeXN0ZW0gKGNvbW1vbikgcHJvZmlsZSAqLworI2RlZmluZSBLU0hfU1lTVEVNX1BST0ZJTEUgIi9ldGMvcHJvZmlsZSIKKworLyogVXNlZCBieSB2X2V2YWx1YXRlKCkgYW5kIHNldHN0cigpIHRvIGNvbnRyb2wgYWN0aW9uIHdoZW4gZXJyb3Igb2NjdXJzICovCisjZGVmaW5lIEtTSF9VTldJTkRfRVJST1IJMAkvKiB1bndpbmQgdGhlIHN0YWNrIChsb25nam1wKSAqLworI2RlZmluZSBLU0hfUkVUVVJOX0VSUk9SCTEJLyogcmV0dXJuIDEvMCBmb3Igc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBTaGVsbCBmaWxlIEkvTyByb3V0aW5lcworICovCisKKyNkZWZpbmUgU0hGX0JTSVpFCTUxMgorCisjZGVmaW5lIHNoZl9maWxlbm8oc2hmKQkoKHNoZiktPmZkKQorI2RlZmluZSBzaGZfc2V0ZmlsZW5vKHNoZixuZmQpCSgoc2hmKS0+ZmQgPSAobmZkKSkKKyNpZmRlZiBNS1NIX1NNQUxMCitpbnQgc2hmX2dldGMoc3RydWN0IHNoZiAqKTsKK2ludCBzaGZfcHV0YyhpbnQsIHN0cnVjdCBzaGYgKik7CisjZWxzZQorI2RlZmluZSBzaGZfZ2V0YyhzaGYpCQkoKHNoZiktPnJubGVmdCA+IDAgPyBcCisJCQkJICAgIChzaGYpLT5ybmxlZnQtLSwgKihzaGYpLT5ycCsrIDogXAorCQkJCSAgICBzaGZfZ2V0Y2hhcihzaGYpKQorI2RlZmluZSBzaGZfcHV0YyhjLCBzaGYpCSgoc2hmKS0+d25sZWZ0ID09IDAgPyBcCisJCQkJICAgIHNoZl9wdXRjaGFyKChjKSwgKHNoZikpIDogXAorCQkJCSAgICAoKHNoZiktPndubGVmdC0tLCAqKHNoZiktPndwKysgPSAoYykpKQorI2VuZGlmCisjZGVmaW5lIHNoZl9lb2Yoc2hmKQkJKChzaGYpLT5mbGFncyAmIFNIRl9FT0YpCisjZGVmaW5lIHNoZl9lcnJvcihzaGYpCQkoKHNoZiktPmZsYWdzICYgU0hGX0VSUk9SKQorI2RlZmluZSBzaGZfZXJybm8oc2hmKQkJKChzaGYpLT5lcnJub18pCisjZGVmaW5lIHNoZl9jbGVhcmVycihzaGYpCSgoc2hmKS0+ZmxhZ3MgJj0gfihTSEZfRU9GIHwgU0hGX0VSUk9SKSkKKworLyogRmxhZ3MgcGFzc2VkIHRvIHNoZl8qb3BlbigpICovCisjZGVmaW5lIFNIRl9SRAkJMHgwMDAxCisjZGVmaW5lIFNIRl9XUgkJMHgwMDAyCisjZGVmaW5lIFNIRl9SRFdSCShTSEZfUkR8U0hGX1dSKQorI2RlZmluZSBTSEZfQUNDTU9ERQkweDAwMDMJCS8qIG1hc2sgKi8KKyNkZWZpbmUgU0hGX0dFVEZMCTB4MDAwNAkJLyogdXNlIGZjbnRsKCkgdG8gZmlndXJlIFJEL1dSIGZsYWdzICovCisjZGVmaW5lIFNIRl9VTkJVRgkweDAwMDgJCS8qIHVuYnVmZmVyZWQgSS9PICovCisjZGVmaW5lIFNIRl9DTEVYRUMJMHgwMDEwCQkvKiBzZXQgY2xvc2Ugb24gZXhlYyBmbGFnICovCisjZGVmaW5lIFNIRl9NQVBISQkweDAwMjAJCS8qIG1ha2UgZmQgPiBGREJBU0UgKGFuZCBjbG9zZSBvcmlnKQorCQkJCQkgKiAoc2hmX29wZW4oKSBvbmx5KSAqLworI2RlZmluZSBTSEZfRFlOQU1JQwkweDAwNDAJCS8qIHN0cmluZzogaW5jcmVhc2UgYnVmZmVyIGFzIG5lZWRlZCAqLworI2RlZmluZSBTSEZfSU5URVJSVVBUCTB4MDA4MAkJLyogRUlOVFIgaW4gcmVhZC93cml0ZSBjYXVzZXMgZXJyb3IgKi8KKy8qIEZsYWdzIHVzZWQgaW50ZXJuYWxseSAqLworI2RlZmluZSBTSEZfU1RSSU5HCTB4MDEwMAkJLyogYSBzdHJpbmcsIG5vdCBhIGZpbGUgKi8KKyNkZWZpbmUgU0hGX0FMTE9DUwkweDAyMDAJCS8qIHNoZiBhbmQgc2hmLT5idWYgd2VyZSBhbGxvYygpZWQgKi8KKyNkZWZpbmUgU0hGX0FMTE9DQgkweDA0MDAJCS8qIHNoZi0+YnVmIHdhcyBhbGxvYygpZWQgKi8KKyNkZWZpbmUgU0hGX0VSUk9SCTB4MDgwMAkJLyogcmVhZCgpL3dyaXRlKCkgZXJyb3IgKi8KKyNkZWZpbmUgU0hGX0VPRgkJMHgxMDAwCQkvKiByZWFkIGVvZiAoc3RpY2t5KSAqLworI2RlZmluZSBTSEZfUkVBRElORwkweDIwMDAJCS8qIGN1cnJlbnRseSByZWFkaW5nOiBybmxlZnQscnAgdmFsaWQgKi8KKyNkZWZpbmUgU0hGX1dSSVRJTkcJMHg0MDAwCQkvKiBjdXJyZW50bHkgd3JpdGluZzogd25sZWZ0LHdwIHZhbGlkICovCisKKworc3RydWN0IHNoZiB7CisJQXJlYSAqYXJlYXA7CQkvKiBhcmVhIHNoZi9idWYgd2VyZSBhbGxvY2F0ZWQgaW4gKi8KKwl1bnNpZ25lZCBjaGFyICpycDsJLyogcmVhZDogY3VycmVudCBwb3NpdGlvbiBpbiBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICp3cDsJLyogd3JpdGU6IGN1cnJlbnQgcG9zaXRpb24gaW4gYnVmZmVyICovCisJdW5zaWduZWQgY2hhciAqYnVmOwkvKiBidWZmZXIgKi8KKwlpbnQgZmxhZ3M7CQkvKiBzZWUgU0hGXyogKi8KKwlpbnQgcmJzaXplOwkJLyogc2l6ZSBvZiBidWZmZXIgKDEgaWYgU0hGX1VOQlVGKSAqLworCWludCBybmxlZnQ7CQkvKiByZWFkOiBob3cgbXVjaCBkYXRhIGxlZnQgaW4gYnVmZmVyICovCisJaW50IHdic2l6ZTsJCS8qIHNpemUgb2YgYnVmZmVyICgwIGlmIFNIRl9VTkJVRikgKi8KKwlpbnQgd25sZWZ0OwkJLyogd3JpdGU6IGhvdyBtdWNoIHNwYWNlIGxlZnQgaW4gYnVmZmVyICovCisJaW50IGZkOwkJCS8qIGZpbGUgZGVzY3JpcHRvciAqLworCWludCBlcnJub187CQkvKiBzYXZlZCB2YWx1ZSBvZiBlcnJubyBhZnRlciBlcnJvciAqLworCWludCBic2l6ZTsJCS8qIGFjdHVhbCBzaXplIG9mIGJ1ZiAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBzaGYgc2hmX2lvYltdOworCitzdHJ1Y3QgdGFibGUgeworCUFyZWEgKmFyZWFwOwkJLyogYXJlYSB0byBhbGxvY2F0ZSBlbnRyaWVzICovCisJc3RydWN0IHRibCAqKnRibHM7CS8qIGhhc2hlZCB0YWJsZSBpdGVtcyAqLworCXNob3J0IHNpemUsIG5mcmVlOwkvKiBoYXNoIHNpemUgKGFsd2F5cyAyXl5uKSwgZnJlZSBlbnRyaWVzICovCit9OworCitzdHJ1Y3QgdGJsIHsJCQkvKiB0YWJsZSBpdGVtICovCisJQXJlYSAqYXJlYXA7CQkvKiBhcmVhIHRvIGFsbG9jYXRlIGZyb20gKi8KKwl1bmlvbiB7CisJCWNoYXIgKnM7CQkvKiBzdHJpbmcgKi8KKwkJbWtzaF9hcmlfdCBpOwkJLyogaW50ZWdlciAqLworCQlta3NoX3VhcmlfdCB1OwkJLyogdW5zaWduZWQgaW50ZWdlciAqLworCQlpbnQgKCpmKShjb25zdCBjaGFyICoqKTsvKiBpbnQgZnVuY3Rpb24gKi8KKwkJc3RydWN0IG9wICp0OwkJLyogImZ1bmN0aW9uIiB0cmVlICovCisJfSB2YWw7CQkJLyogdmFsdWUgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB0YmwgKmFycmF5OwkvKiBhcnJheSB2YWx1ZXMgKi8KKwkJY29uc3QgY2hhciAqZnBhdGg7CS8qIHRlbXBvcmFyeSBwYXRoIHRvIHVuZGVmIGZ1bmN0aW9uICovCisJfSB1OworCXVuaW9uIHsKKwkJaW50IGZpZWxkOwkvKiBmaWVsZCB3aXRoIGZvciAtTC8tUi8tWiAqLworCQlpbnQgZXJybm9fOwkvKiBDRVhFQy9DVEFMSUFTICovCisJfSB1MjsKKwlpbnQgdHlwZTsJCS8qIGNvbW1hbmQgdHlwZSAoc2VlIGJlbG93KSwgYmFzZSAoaWYgSU5URUdFUiksCisJCQkJICogb3Igb2Zmc2V0IGZyb20gdmFsLnMgb2YgdmFsdWUgKGlmIEVYUE9SVCkgKi8KKwlUZmxhZyBmbGFnOwkJLyogZmxhZ3MgKi8KKwl1bmlvbiB7CisJCXVpbnQzMl90IGh2YWw7CQkvKiBoYXNoKG5hbWUpICovCisJCXVpbnQzMl90IGluZGV4OwkJLyogaW5kZXggZm9yIGFuIGFycmF5ICovCisJfSB1YTsKKwljaGFyIG5hbWVbNF07CQkvKiBuYW1lIC0tIHZhcmlhYmxlIGxlbmd0aCAqLworfTsKKworLyogY29tbW9uIGZsYWcgYml0cyAqLworI2RlZmluZSBBTExPQwkJQklUKDApCS8qIHZhbC5zIGhhcyBiZWVuIGFsbG9jYXRlZCAqLworI2RlZmluZSBERUZJTkVECQlCSVQoMSkJLyogaXMgZGVmaW5lZCBpbiBibG9jayAqLworI2RlZmluZSBJU1NFVAkJQklUKDIpCS8qIGhhcyB2YWx1ZSwgdnAtPnZhbC5bc2ldICovCisjZGVmaW5lIEVYUE9SVAkJQklUKDMpCS8qIGV4cG9ydGVkIHZhcmlhYmxlL2Z1bmN0aW9uICovCisjZGVmaW5lIFRSQUNFCQlCSVQoNCkJLyogdmFyOiB1c2VyIGZsYWdnZWQsIGZ1bmM6IGV4ZWN1dGlvbiB0cmFjaW5nICovCisvKiAoc3RhcnQgbm9uLWNvbW1vbiBmbGFncyBhdCA4KSAqLworLyogZmxhZyBiaXRzIHVzZWQgZm9yIHZhcmlhYmxlcyAqLworI2RlZmluZSBTUEVDSUFMCQlCSVQoOCkJLyogUEFUSCwgSUZTLCBTRUNPTkRTLCBldGMgKi8KKyNkZWZpbmUgSU5URUdFUgkJQklUKDkpCS8qIHZhbC5pIGNvbnRhaW5zIGludGVnZXIgdmFsdWUgKi8KKyNkZWZpbmUgUkRPTkxZCQlCSVQoMTApCS8qIHJlYWQtb25seSB2YXJpYWJsZSAqLworI2RlZmluZSBMT0NBTAkJQklUKDExKQkvKiBmb3IgbG9jYWwgdHlwZXNldCgpICovCisjZGVmaW5lIEFSUkFZCQlCSVQoMTMpCS8qIGFycmF5ICovCisjZGVmaW5lIExKVVNUCQlCSVQoMTQpCS8qIGxlZnQganVzdGlmeSAqLworI2RlZmluZSBSSlVTVAkJQklUKDE1KQkvKiByaWdodCBqdXN0aWZ5ICovCisjZGVmaW5lIFpFUk9GSUwJCUJJVCgxNikJLyogMCBmaWxsZWQgaWYgUkpVU1RJRlksIHN0cmlwIDBzIGlmIExKVVNUSUZZICovCisjZGVmaW5lIExDQVNFVgkJQklUKDE3KQkvKiBjb252ZXJ0IHRvIGxvd2VyIGNhc2UgKi8KKyNkZWZpbmUgVUNBU0VWX0FMCUJJVCgxOCkgLyogY29udmVydCB0byB1cHBlciBjYXNlIC8gYXV0b2xvYWQgZnVuY3Rpb24gKi8KKyNkZWZpbmUgSU5UX1UJCUJJVCgxOSkJLyogdW5zaWduZWQgaW50ZWdlciAqLworI2RlZmluZSBJTlRfTAkJQklUKDIwKQkvKiBsb25nIGludGVnZXIgKG5vLW9wKSAqLworI2RlZmluZSBJTVBPUlQJCUJJVCgyMSkJLyogZmxhZyB0byB0eXBlc2V0KCk6IG5vIGFycmF5cywgbXVzdCBoYXZlID0gKi8KKyNkZWZpbmUgTE9DQUxfQ09QWQlCSVQoMjIpCS8qIHdpdGggTE9DQUwgLSBjb3B5IGF0dHJzIGZyb20gZXhpc3RpbmcgdmFyICovCisjZGVmaW5lIEVYUFJJTkVWQUwJQklUKDIzKQkvKiBjb250ZW50cyBjdXJyZW50bHkgYmVpbmcgZXZhbHVhdGVkICovCisjZGVmaW5lIEVYUFJMVkFMVUUJQklUKDI0KQkvKiB1c2VhYmxlIGFzIGx2YWx1ZSAodGVtcCBmbGFnKSAqLworI2RlZmluZSBBSU5ERVgJCUJJVCgyNSkgLyogYXJyYXkgaW5kZXggPjAgPSB1YS5pbmRleCBmaWxsZWQgaW4gKi8KKyNkZWZpbmUgQVNTT0MJCUJJVCgyNikgLyogQVJSQVkgPyBhc3NvY2lhdGl2ZSA6IHJlZmVyZW5jZSAqLworLyogZmxhZyBiaXRzIHVzZWQgZm9yIHRhbGlhc2VzL2J1aWx0aW5zL2FsaWFzZXMva2V5d29yZHMvZnVuY3Rpb25zICovCisjZGVmaW5lIEtFRVBBU04JCUJJVCg4KQkvKiBrZWVwIGNvbW1hbmQgYXNzaWdubWVudHMgKGVnLCB2YXI9eCBjbWQpICovCisjZGVmaW5lIEZJTlVTRQkJQklUKDkpCS8qIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkICovCisjZGVmaW5lIEZERUxFVEUJCUJJVCgxMCkJLyogZnVuY3Rpb24gZGVsZXRlZCB3aGlsZSBpdCB3YXMgZXhlY3V0aW5nICovCisjZGVmaW5lIEZLU0gJCUJJVCgxMSkJLyogZnVuY3Rpb24gZGVmaW5lZCB3aXRoIGZ1bmN0aW9uIHggKHZzIHgoKSkgKi8KKyNkZWZpbmUgU1BFQ19CSQkJQklUKDEyKQkvKiBhIFBPU0lYIHNwZWNpYWwgYnVpbHRpbiAqLworI2RlZmluZSBSRUdfQkkJCUJJVCgxMykJLyogYSBQT1NJWCByZWd1bGFyIGJ1aWx0aW4gKi8KKy8qIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgc2V0IGJ5IHRoZSB1c2VyICh1c2VkIHRvIGRlY2lkZSBpZiBhbiB1bnNldCBwYXJhbQorICogc2hvdWxkIGJlIHJlcG90ZWQgYnkgc2V0L3R5cGVzZXQpLiBEb2VzIG5vdCBpbmNsdWRlIEFSUkFZIG9yIExPQ0FMLgorICovCisjZGVmaW5lIFVTRVJBVFRSSUIJKEVYUE9SVHxJTlRFR0VSfFJET05MWXxMSlVTVHxSSlVTVHxaRVJPRklMfFwKKwkJCSAgICBMQ0FTRVZ8VUNBU0VWX0FMfElOVF9VfElOVF9MKQorCisjZGVmaW5lIGFycmF5aW5kZXgodnApCSgodW5zaWduZWQgbG9uZykoKHZwKS0+ZmxhZyAmIEFJTkRFWCA/IFwKKwkJCSAgICAodnApLT51YS5pbmRleCA6IDApKQorCisvKiBjb21tYW5kIHR5cGVzICovCisjZGVmaW5lIENOT05FCQkwCS8qIHVuZGVmaW5lZCAqLworI2RlZmluZSBDU0hFTEwJCTEJLyogYnVpbHQtaW4gKi8KKyNkZWZpbmUgQ0ZVTkMJCTIJLyogZnVuY3Rpb24gKi8KKyNkZWZpbmUgQ0VYRUMJCTQJLyogZXhlY3V0YWJsZSBjb21tYW5kICovCisjZGVmaW5lIENBTElBUwkJNQkvKiBhbGlhcyAqLworI2RlZmluZSBDS0VZV0QJCTYJLyoga2V5d29yZCAqLworI2RlZmluZSBDVEFMSUFTCQk3CS8qIHRyYWNrZWQgYWxpYXMgKi8KKworLyogRmxhZ3MgZm9yIGZpbmRjb20oKS9jb21leGVjKCkgKi8KKyNkZWZpbmUgRkNfU1BFQ0JJCUJJVCgwKQkvKiBzcGVjaWFsIGJ1aWx0aW4gKi8KKyNkZWZpbmUgRkNfRlVOQwkJQklUKDEpCS8qIGZ1bmN0aW9uIGJ1aWx0aW4gKi8KKyNkZWZpbmUgRkNfUkVHQkkJQklUKDIpCS8qIHJlZ3VsYXIgYnVpbHRpbiAqLworI2RlZmluZSBGQ19VTlJFR0JJCUJJVCgzKQkvKiB1bi1yZWd1bGFyIGJ1aWx0aW4gKCFzcGVjaWFsLCFyZWd1bGFyKSAqLworI2RlZmluZSBGQ19CSQkJKEZDX1NQRUNCSXxGQ19SRUdCSXxGQ19VTlJFR0JJKQorI2RlZmluZSBGQ19QQVRICQlCSVQoNCkJLyogZG8gcGF0aCBzZWFyY2ggKi8KKyNkZWZpbmUgRkNfREVGUEFUSAlCSVQoNSkJLyogdXNlIGRlZmF1bHQgcGF0aCBpbiBwYXRoIHNlYXJjaCAqLworCisKKyNkZWZpbmUgQUZfQVJHVl9BTExPQwkweDEJLyogYXJndltdIGFycmF5IGFsbG9jYXRlZCAqLworI2RlZmluZSBBRl9BUkdTX0FMTE9DRUQJMHgyCS8qIGFyZ3VtZW50IHN0cmluZ3MgYWxsb2NhdGVkICovCisjZGVmaW5lIEFJX0FSR1YoYSwgaSkJKChpKSA9PSAwID8gKGEpLmFyZ3ZbMF0gOiAoYSkuYXJndlsoaSkgLSAoYSkuc2tpcF0pCisjZGVmaW5lIEFJX0FSR0MoYSkJKChhKS5hcmdjXyAtIChhKS5za2lwKQorCisvKiBBcmd1bWVudCBpbmZvLiBVc2VkIGZvciAkIywgJCogZm9yIHNoZWxsLCBmdW5jdGlvbnMsIGluY2x1ZGVzLCBldGMuICovCitzdHJ1Y3QgYXJnX2luZm8geworCWNvbnN0IGNoYXIgKiphcmd2OworCWludCBmbGFnczsJLyogQUZfKiAqLworCWludCBhcmdjXzsKKwlpbnQgc2tpcDsJLyogZmlyc3QgYXJnIGlzIGFyZ3ZbMF0sIHNlY29uZCBpcyBhcmd2WzEgKyBza2lwXSAqLworfTsKKworLyoKKyAqIGFjdGl2YXRpb24gcmVjb3JkIGZvciBmdW5jdGlvbiBibG9ja3MKKyAqLworc3RydWN0IGJsb2NrIHsKKwlBcmVhIGFyZWE7CQkvKiBhcmVhIHRvIGFsbG9jYXRlIHRoaW5ncyAqLworCWNvbnN0IGNoYXIgKiphcmd2OworCWNoYXIgKmVycm9yOwkJLyogZXJyb3IgaGFuZGxlciAqLworCWNoYXIgKmV4aXQ7CQkvKiBleGl0IGhhbmRsZXIgKi8KKwlzdHJ1Y3QgYmxvY2sgKm5leHQ7CS8qIGVuY2xvc2luZyBibG9jayAqLworCXN0cnVjdCB0YWJsZSB2YXJzOwkvKiBsb2NhbCB2YXJpYWJsZXMgKi8KKwlzdHJ1Y3QgdGFibGUgZnVuczsJLyogbG9jYWwgZnVuY3Rpb25zICovCisJR2V0b3B0IGdldG9wdHNfc3RhdGU7CisJaW50IGFyZ2M7CisJaW50IGZsYWdzOwkJLyogc2VlIEJGXyogKi8KK307CisKKy8qIFZhbHVlcyBmb3Igc3RydWN0IGJsb2NrLmZsYWdzICovCisjZGVmaW5lIEJGX0RPR0VUT1BUUwlCSVQoMCkJLyogc2F2ZS9yZXN0b3JlIGdldG9wdHMgc3RhdGUgKi8KKworLyoKKyAqIFVzZWQgYnkga3R3YWxrKCkgYW5kIGt0bmV4dCgpIHJvdXRpbmVzLgorICovCitzdHJ1Y3QgdHN0YXRlIHsKKwlzdHJ1Y3QgdGJsICoqbmV4dDsKKwlzc2l6ZV90IGxlZnQ7Cit9OworCitFWFRFUk4gc3RydWN0IHRhYmxlIHRhbGlhc2VzOwkvKiB0cmFja2VkIGFsaWFzZXMgKi8KK0VYVEVSTiBzdHJ1Y3QgdGFibGUgYnVpbHRpbnM7CS8qIGJ1aWx0LWluIGNvbW1hbmRzICovCitFWFRFUk4gc3RydWN0IHRhYmxlIGFsaWFzZXM7CS8qIGFsaWFzZXMgKi8KK0VYVEVSTiBzdHJ1Y3QgdGFibGUga2V5d29yZHM7CS8qIGtleXdvcmRzICovCisjaWZuZGVmIE1LU0hfTk9QV05BTQorRVhURVJOIHN0cnVjdCB0YWJsZSBob21lZGlyczsJLyogaG9tZWRpcigpIGNhY2hlICovCisjZW5kaWYKKworc3RydWN0IGJ1aWx0aW4geworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqZnVuYykoY29uc3QgY2hhciAqKik7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IGJ1aWx0aW4gbWtzaGJ1aWx0aW5zW107CisKKy8qIHZhbHVlcyBmb3Igc2V0X3Byb21wdCgpICovCisjZGVmaW5lIFBTMQkwCS8qIGNvbW1hbmQgKi8KKyNkZWZpbmUgUFMyCTEJLyogY29tbWFuZCBjb250aW51YXRpb24gKi8KKworRVhURVJOIGNoYXIgKnBhdGg7CQkvKiBjb3B5IG9mIGVpdGhlciBQQVRIIG9yIGRlZl9wYXRoICovCitFWFRFUk4gY29uc3QgY2hhciAqZGVmX3BhdGg7CS8qIHBhdGggdG8gdXNlIGlmIFBBVEggbm90IHNldCAqLworRVhURVJOIGNoYXIgKnRtcGRpcjsJCS8qIFRNUERJUiB2YWx1ZSAqLworRVhURVJOIGNvbnN0IGNoYXIgKnByb21wdDsKK0VYVEVSTiBpbnQgY3VyX3Byb21wdDsJCS8qIFBTMSBvciBQUzIgKi8KK0VYVEVSTiBpbnQgY3VycmVudF9saW5lbm87CS8qIExJTkVOTyB2YWx1ZSAqLworCisjZGVmaW5lIE5PQkxPQ0sJKChzdHJ1Y3Qgb3AgKilOVUxMKQorI2RlZmluZSBOT1dPUkQJKChjaGFyICopTlVMTCkKKyNkZWZpbmUgTk9XT1JEUwkoKGNoYXIgKiopTlVMTCkKKworLyoKKyAqIERlc2NyaXB0aW9uIG9mIGEgY29tbWFuZCBvciBhbiBvcGVyYXRpb24gb24gY29tbWFuZHMuCisgKi8KK3N0cnVjdCBvcCB7CisJY29uc3QgY2hhciAqKmFyZ3M7CQkvKiBhcmd1bWVudHMgdG8gYSBjb21tYW5kICovCisJY2hhciAqKnZhcnM7CQkJLyogdmFyaWFibGUgYXNzaWdubWVudHMgKi8KKwlzdHJ1Y3QgaW93b3JkICoqaW9hY3Q7CQkvKiBJTyBhY3Rpb25zIChlZywgPCA+ID4+KSAqLworCXN0cnVjdCBvcCAqbGVmdCwgKnJpZ2h0OwkvKiBkZXNjZW5kZW50cyAqLworCWNoYXIgKnN0cjsJCQkvKiB3b3JkIGZvciBjYXNlOyBpZGVudGlmaWVyIGZvciBmb3IsCisJCQkJCSAqIHNlbGVjdCwgYW5kIGZ1bmN0aW9uczsKKwkJCQkJICogcGF0aCB0byBleGVjdXRlIGZvciBURVhFQzsKKwkJCQkJICogdGltZSBob29rIGZvciBUQ09NLgorCQkJCQkgKi8KKwlpbnQgbGluZW5vOwkJCS8qIFRDT00vVEZVTkM6IExJTkVOTyBmb3IgdGhpcyAqLworCXNob3J0IHR5cGU7CQkJLyogb3BlcmF0aW9uIHR5cGUsIHNlZSBiZWxvdyAqLworCXVuaW9uIHsgLyogV0FSTklORzogbmV3dHAoKSwgdGNvcHkoKSB1c2UgZXZhbGZsYWdzID0gMCB0byBjbGVhciB1bmlvbiAqLworCQlzaG9ydCBldmFsZmxhZ3M7CS8qIFRDT006IGFyZyBleHBhbnNpb24gZXZhbCgpIGZsYWdzICovCisJCXNob3J0IGtzaF9mdW5jOwkJLyogVEZVTkM6IGZ1bmN0aW9uIHggKHZzIHgoKSkgKi8KKwl9IHU7Cit9OworCisvKiBUcmVlLnR5cGUgdmFsdWVzICovCisjZGVmaW5lIFRFT0YJCTAKKyNkZWZpbmUgVENPTQkJMQkvKiBjb21tYW5kICovCisjZGVmaW5lIFRQQVJFTgkJMgkvKiAoYy1saXN0KSAqLworI2RlZmluZSBUUElQRQkJMwkvKiBhIHwgYiAqLworI2RlZmluZSBUTElTVAkJNAkvKiBhIDsgYiAqLworI2RlZmluZSBUT1IJCTUJLyogfHwgKi8KKyNkZWZpbmUgVEFORAkJNgkvKiAmJiAqLworI2RlZmluZSBUQkFORwkJNwkvKiAhICovCisjZGVmaW5lIFREQlJBQ0tFVAk4CS8qIFtbIC4uIF1dICovCisjZGVmaW5lIFRGT1IJCTkKKyNkZWZpbmUgVFNFTEVDVAkJMTAKKyNkZWZpbmUgVENBU0UJCTExCisjZGVmaW5lIFRJRgkJMTIKKyNkZWZpbmUgVFdISUxFCQkxMworI2RlZmluZSBUVU5USUwJCTE0CisjZGVmaW5lIFRFTElGCQkxNQorI2RlZmluZSBUUEFUCQkxNgkvKiBwYXR0ZXJuIGluIGNhc2UgKi8KKyNkZWZpbmUgVEJSQUNFCQkxNwkvKiB7Yy1saXN0fSAqLworI2RlZmluZSBUQVNZTkMJCTE4CS8qIGMgJiAqLworI2RlZmluZSBURlVOQ1QJCTE5CS8qIGZ1bmN0aW9uIG5hbWUgeyBjb21tYW5kOyB9ICovCisjZGVmaW5lIFRUSU1FCQkyMAkvKiB0aW1lIHBpcGVsaW5lICovCisjZGVmaW5lIFRFWEVDCQkyMQkvKiBmb3JrL2V4ZWMgZXZhbCdkIFRDT00gKi8KKyNkZWZpbmUgVENPUFJPQwkJMjIJLyogY29wcm9jZXNzIHwmICovCisKKy8qCisgKiBwcmVmaXggY29kZXMgZm9yIHdvcmRzIGluIGNvbW1hbmQgdHJlZQorICovCisjZGVmaW5lIEVPUwkwCS8qIGVuZCBvZiBzdHJpbmcgKi8KKyNkZWZpbmUgQ0hBUgkxCS8qIHVucXVvdGVkIGNoYXJhY3RlciAqLworI2RlZmluZSBRQ0hBUgkyCS8qIHF1b3RlZCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgQ09NU1VCCTMJLyogJCgpIHN1YnN0aXR1dGlvbiAoMCB0ZXJtaW5hdGVkKSAqLworI2RlZmluZSBFWFBSU1VCCTQJLyogJCgoKSkgc3Vic3RpdHV0aW9uICgwIHRlcm1pbmF0ZWQpICovCisjZGVmaW5lIE9RVU9URQk1CS8qIG9wZW5pbmcgIiBvciAnICovCisjZGVmaW5lIENRVU9URQk2CS8qIGNsb3NpbmcgIiBvciAnICovCisjZGVmaW5lIE9TVUJTVAk3CS8qIG9wZW5pbmcgJHsgc3Vic3QgKGZvbGxvd2VkIGJ5IHsgb3IgWCkgKi8KKyNkZWZpbmUgQ1NVQlNUCTgJLyogY2xvc2luZyB9IG9mIGFib3ZlIChmb2xsb3dlZCBieSB9IG9yIFgpICovCisjZGVmaW5lIE9QQVQJOQkvKiBvcGVuIHBhdHRlcm46ICooLCBAKCwgZXRjLiAqLworI2RlZmluZSBTUEFUCTEwCS8qIHNlcGFyYXRlIHBhdHRlcm46IHwgKi8KKyNkZWZpbmUgQ1BBVAkxMQkvKiBjbG9zZSBwYXR0ZXJuOiApICovCisjZGVmaW5lIEFERUxJTQkxMgkvKiBhcmJpdHJhcnkgZGVsaW1pdGVyOiAke2ZvbzoyOjN9ICR7Zm9vL2Jhci9iYXp9ICovCisKKy8qCisgKiBJTyByZWRpcmVjdGlvbgorICovCitzdHJ1Y3QgaW93b3JkIHsKKwlpbnQJdW5pdDsJLyogdW5pdCBhZmZlY3RlZCAqLworCWludAlmbGFnOwkvKiBhY3Rpb24gKGJlbG93KSAqLworCWNoYXIJKm5hbWU7CS8qIGZpbGUgbmFtZSAodW51c2VkIGlmIGhlcmVkb2MpICovCisJY2hhcgkqZGVsaW07CS8qIGRlbGltaXRlciBmb3IgPDwsPDwtICovCisJY2hhcgkqaGVyZWRvYzsvKiBjb250ZW50IG9mIGhlcmVkb2MgKi8KK307CisKKy8qIGlvd29yZC5mbGFnIC0gdHlwZSBvZiByZWRpcmVjdGlvbiAqLworI2RlZmluZSBJT1RZUEUJMHhGCS8qIHR5cGU6IGJpdHMgMDozICovCisjZGVmaW5lIElPUkVBRAkweDEJLyogPCAqLworI2RlZmluZSBJT1dSSVRFCTB4MgkvKiA+ICovCisjZGVmaW5lIElPUkRXUgkweDMJLyogPD46IHRvZG8gKi8KKyNkZWZpbmUgSU9IRVJFCTB4NAkvKiA8PCAoaGVyZSBmaWxlKSAqLworI2RlZmluZSBJT0NBVAkweDUJLyogPj4gKi8KKyNkZWZpbmUgSU9EVVAJMHg2CS8qIDwmLz4mICovCisjZGVmaW5lIElPRVZBTAlCSVQoNCkJLyogZXhwYW5kIGluIDw8ICovCisjZGVmaW5lIElPU0tJUAlCSVQoNSkJLyogPDwtLCBza2lwIF5cdCogKi8KKyNkZWZpbmUgSU9DTE9CCUJJVCg2KQkvKiA+fCwgb3ZlcnJpZGUgLW8gbm9jbG9iYmVyICovCisjZGVmaW5lIElPUkRVUAlCSVQoNykJLyogeDwmeSAoYXMgb3Bwb3NlZCB0byB4PiZ5KSAqLworI2RlZmluZSBJT05BTUVYUCBCSVQoOCkJLyogbmFtZSBoYXMgYmVlbiBleHBhbmRlZCAqLworI2RlZmluZSBJT0JBU0gJQklUKDkpCS8qICY+IGV0Yy4gKi8KKworLyogZXhlY3V0ZS9leGNoaWxkIGZsYWdzICovCisjZGVmaW5lIFhFWEVDCUJJVCgwKQkJLyogZXhlY3V0ZSB3aXRob3V0IGZvcmtpbmcgKi8KKyNkZWZpbmUgWEZPUksJQklUKDEpCQkvKiBmb3JrIGJlZm9yZSBleGVjdXRpbmcgKi8KKyNkZWZpbmUgWEJHTkQJQklUKDIpCQkvKiBjb21tYW5kICYgKi8KKyNkZWZpbmUgWFBJUEVJCUJJVCgzKQkJLyogaW5wdXQgaXMgcGlwZSAqLworI2RlZmluZSBYUElQRU8JQklUKDQpCQkvKiBvdXRwdXQgaXMgcGlwZSAqLworI2RlZmluZSBYUElQRQkoWFBJUEVJfFhQSVBFTykJLyogbWVtYmVyIG9mIHBpcGUgKi8KKyNkZWZpbmUgWFhDT00JQklUKDUpCQkvKiBgLi4uYCBjb21tYW5kICovCisjZGVmaW5lIFhQQ0xPU0UJQklUKDYpCQkvKiBleGNoaWxkOiBjbG9zZSBjbG9zZV9mZCBpbiBwYXJlbnQgKi8KKyNkZWZpbmUgWENDTE9TRQlCSVQoNykJCS8qIGV4Y2hpbGQ6IGNsb3NlIGNsb3NlX2ZkIGluIGNoaWxkICovCisjZGVmaW5lIFhFUlJPSwlCSVQoOCkJCS8qIG5vbi16ZXJvIGV4aXQgb2sgKGZvciBzZXQgLWUpICovCisjZGVmaW5lIFhDT1BST0MgQklUKDkpCQkvKiBzdGFydGluZyBhIGNvLXByb2Nlc3MgKi8KKyNkZWZpbmUgWFRJTUUJQklUKDEwKQkJLyogdGltaW5nIFRDT00gY29tbWFuZCAqLworCisvKgorICogZmxhZ3MgdG8gY29udHJvbCBleHBhbnNpb24gb2Ygd29yZHMgKGFzc3VtZWQgYnkgdC0+ZXZhbGZsYWdzIHRvIGZpdAorICogaW4gYSBzaG9ydCkKKyAqLworI2RlZmluZSBET0JMQU5LCUJJVCgwKQkJLyogcGVyZm9ybSBibGFuayBpbnRlcnByZXRhdGlvbiAqLworI2RlZmluZSBET0dMT0IJQklUKDEpCQkvKiBleHBhbmQgWz8qICovCisjZGVmaW5lIERPUEFUCUJJVCgyKQkJLyogcXVvdGUgKj9bICovCisjZGVmaW5lIERPVElMREUJQklUKDMpCQkvKiBub3JtYWwgfiBleHBhbnNpb24gKGZpcnN0IGNoYXIpICovCisjZGVmaW5lIERPTlRSVU5DT01NQU5EIEJJVCg0KQkvKiBkbyBub3QgcnVuICQoY29tbWFuZCkgdGhpbmdzICovCisjZGVmaW5lIERPQVNOVElMREUgQklUKDUpCS8qIGFzc2lnbm1lbnQgfiBleHBhbnNpb24gKGFmdGVyID0sIDopICovCisjZGVmaW5lIERPQlJBQ0VfIEJJVCg2KQkJLyogdXNlZCBieSBleHBhbmQoKTogZG8gYnJhY2UgZXhwYW5zaW9uICovCisjZGVmaW5lIERPTUFHSUNfIEJJVCg3KQkJLyogdXNlZCBieSBleHBhbmQoKTogc3RyaW5nIGNvbnRhaW5zIE1BR0lDICovCisjZGVmaW5lIERPVEVNUF8JQklUKDgpCQkvKiBkaXR0byA6IGluIHdvcmQgcGFydCBvZiAkey4uWyUjPT9dLi59ICovCisjZGVmaW5lIERPVkFDSEVDSyBCSVQoOSkJLyogdmFyIGFzc2lnbiBjaGVjayAoZm9yIHR5cGVzZXQsIHNldCwgZXRjKSAqLworI2RlZmluZSBET01BUktESVJTIEJJVCgxMCkJLyogZm9yY2UgbWFya2RpcnMgYmVoYXZpb3VyICovCisKKy8qCisgKiBUaGUgYXJndW1lbnRzIG9mIFtbIC4uIF1dIGV4cHJlc3Npb25zIGFyZSBrZXB0IGluIHQtPmFyZ3NbXSBhbmQgZmxhZ3MKKyAqIGluZGljYXRpbmcgaG93IHRoZSBhcmd1bWVudHMgaGF2ZSBiZWVuIG11bmdlZCBhcmUga2VwdCBpbiB0LT52YXJzW10uCisgKiBUaGUgY29udGVudHMgb2YgdC0+dmFyc1tdIGFyZSBzdHVmZmVkIHN0cmluZ3MgKHNvIHRoZXkgY2FuIGJlIHRyZWF0ZWQKKyAqIGxpa2UgYWxsIG90aGVyIHQtPnZhcnNbXSkgaW4gd2hpY2ggdGhlIHNlY29uZCBjaGFyYWN0ZXIgaXMgdGhlIG9uZSB0aGF0CisgKiBpcyBleGFtaW5lZC4gVGhlIERCXyogZGVmaW5lcyBhcmUgdGhlIHZhbHVlcyBmb3IgdGhlc2Ugc2Vjb25kIGNoYXJhY3RlcnMuCisgKi8KKyNkZWZpbmUgREJfTk9STQkxCS8qIG5vcm1hbCBhcmd1bWVudCAqLworI2RlZmluZSBEQl9PUgkyCS8qIHx8IC0+IC1vIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgREJfQU5ECTMJLyogJiYgLT4gLWEgY29udmVyc2lvbiAqLworI2RlZmluZSBEQl9CRQk0CS8qIGFuIGluc2VydGVkIC1CRSAqLworI2RlZmluZSBEQl9QQVQJNQkvKiBhIHBhdHRlcm4gYXJndW1lbnQgKi8KKworI2RlZmluZSBYX0VYVFJBCTgJLyogdGhpcyBtYW55IGV4dHJhIGJ5dGVzIGluIFggc3RyaW5nICovCisKK3R5cGVkZWYgc3RydWN0IFhTdHJpbmcgeworCWNoYXIgKmVuZCwgKmJlZzsJLyogZW5kLCBiZWdpbiBvZiBzdHJpbmcgKi8KKwlzaXplX3QgbGVuOwkJLyogbGVuZ3RoICovCisJQXJlYSAqYXJlYXA7CQkvKiBhcmVhIHRvIGFsbG9jYXRlL2ZyZWUgZnJvbSAqLworfSBYU3RyaW5nOworCit0eXBlZGVmIGNoYXIgKlhTdHJpbmdQOworCisvKiBpbml0aWFsaXNlIGV4cGFuZGFibGUgc3RyaW5nICovCisjZGVmaW5lIFhpbml0Tih4cywgbGVuZ3RoLCBhcmVhKSBkbyB7CQkJCVwKKwkoeHMpLmxlbiA9IChsZW5ndGgpOwkJCQkJXAorCSh4cykuYXJlYXAgPSAoYXJlYSk7CQkJCQlcCisJKHhzKS5iZWcgPSBhbGxvYygoeHMpLmxlbiArIFhfRVhUUkEsICh4cykuYXJlYXApOwlcCisJKHhzKS5lbmQgPSAoeHMpLmJlZyArICh4cykubGVuOwkJCQlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKyNkZWZpbmUgWGluaXQoeHMsIHhwLCBsZW5ndGgsIGFyZWEpIGRvIHsJCQlcCisJWGluaXROKCh4cyksIChsZW5ndGgpLCAoYXJlYSkpOwkJCQlcCisJKHhwKSA9ICh4cykuYmVnOwkJCQkJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisKKy8qIHN0dWZmIGNoYXIgaW50byBzdHJpbmcgKi8KKyNkZWZpbmUgWHB1dCh4cywgeHAsIGMpCSgqeHArKyA9IChjKSkKKworLyogY2hlY2sgaWYgdGhlcmUgYXJlIGF0IGxlYXN0IG4gYnl0ZXMgbGVmdCAqLworI2RlZmluZSBYY2hlY2tOKHhzLCB4cCwgbikgZG8gewkJCQkJXAorCWludCBtb3JlID0gKCh4cCkgKyAobikpIC0gKHhzKS5lbmQ7CQkJXAorCWlmIChtb3JlID4gMCkJCQkJCQlcCisJCSh4cCkgPSBYY2hlY2tfZ3Jvd18oJih4cyksICh4cCksIG1vcmUpOwkJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisKKy8qIGNoZWNrIGZvciBvdmVyZmxvdywgZXhwYW5kIHN0cmluZyAqLworI2RlZmluZSBYY2hlY2soeHMsIHhwKQlYY2hlY2tOKCh4cyksICh4cCksIDEpCisKKy8qIGZyZWUgc3RyaW5nICovCisjZGVmaW5lIFhmcmVlKHhzLCB4cCkJYWZyZWUoKHhzKS5iZWcsICh4cykuYXJlYXApCisKKy8qIGNsb3NlLCByZXR1cm4gc3RyaW5nICovCisjZGVmaW5lIFhjbG9zZSh4cywgeHApCWFyZXNpemUoKHhzKS5iZWcsICh4cCkgLSAoeHMpLmJlZywgKHhzKS5hcmVhcCkKKworLyogYmVnaW4gb2Ygc3RyaW5nICovCisjZGVmaW5lIFhzdHJpbmcoeHMsIHhwKQkoKHhzKS5iZWcpCisKKyNkZWZpbmUgWG5sZWZ0KHhzLCB4cCkJKCh4cykuZW5kIC0gKHhwKSkJLyogbWF5IGJlIGxlc3MgdGhhbiAwICovCisjZGVmaW5lIFhsZW5ndGgoeHMsIHhwKQkoKHhwKSAtICh4cykuYmVnKQorI2RlZmluZSBYc2l6ZSh4cywgeHApCSgoeHMpLmVuZCAtICh4cykuYmVnKQorI2RlZmluZSBYc2F2ZXBvcyh4cywgeHApCSgoeHApIC0gKHhzKS5iZWcpCisjZGVmaW5lIFhyZXN0cG9zKHhzLCB4cCwgbikJKCh4cykuYmVnICsgKG4pKQorCitjaGFyICpYY2hlY2tfZ3Jvd18oWFN0cmluZyAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCk7CisKKy8qCisgKiBleHBhbmRhYmxlIHZlY3RvciBvZiBnZW5lcmljIHBvaW50ZXJzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgWFB0clYgeworCXZvaWQgKipjdXI7CQkvKiBuZXh0IGF2YWlsIHBvaW50ZXIgKi8KKwl2b2lkICoqYmVnLCAqKmVuZDsJLyogYmVnaW4sIGVuZCBvZiB2ZWN0b3IgKi8KK30gWFB0clY7CisKKyNkZWZpbmUgWFBpbml0KHgsIG4pIGRvIHsJCQkJCVwKKwl2b2lkICoqdnBfXzsJCQkJCQlcCisJdnBfXyA9IGFsbG9jKChuKSAqIHNpemVvZih2b2lkICopLCBBVEVNUCk7CQlcCisJKHgpLmN1ciA9ICh4KS5iZWcgPSB2cF9fOwkJCQlcCisJKHgpLmVuZCA9IHZwX18gKyAobik7CQkJCQlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKworI2RlZmluZSBYUHB1dCh4LCBwKSBkbyB7CQkJCQlcCisJaWYgKCh4KS5jdXIgPj0gKHgpLmVuZCkgewkJCQlcCisJCXNpemVfdCBuID0gWFBzaXplKHgpOwkJCQlcCisJCSh4KS5iZWcgPSBhcmVzaXplKCh4KS5iZWcsCQkJXAorCQkgICAgbiAqIDIgKiBzaXplb2Yodm9pZCAqKSwgQVRFTVApOwkJXAorCQkoeCkuY3VyID0gKHgpLmJlZyArIG47CQkJCVwKKwkJKHgpLmVuZCA9ICh4KS5jdXIgKyBuOwkJCQlcCisJfQkJCQkJCQlcCisJKih4KS5jdXIrKyA9IChwKTsJCQkJCVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorCisjZGVmaW5lIFhQcHRydih4KQkoKHgpLmJlZykKKyNkZWZpbmUgWFBzaXplKHgpCSgoeCkuY3VyIC0gKHgpLmJlZykKKyNkZWZpbmUgWFBjbG9zZSh4KQlhcmVzaXplKCh4KS5iZWcsIFhQc2l6ZSh4KSAqIHNpemVvZih2b2lkICopLCBBVEVNUCkKKyNkZWZpbmUgWFBmcmVlKHgpCWFmcmVlKCh4KS5iZWcsIEFURU1QKQorCisjZGVmaW5lIElERU5UCTY0CisKK3R5cGVkZWYgc3RydWN0IHNvdXJjZSBTb3VyY2U7CitzdHJ1Y3Qgc291cmNlIHsKKwljb25zdCBjaGFyICpzdHI7CS8qIGlucHV0IHBvaW50ZXIgKi8KKwljb25zdCBjaGFyICpzdGFydDsJLyogc3RhcnQgb2YgY3VycmVudCBidWZmZXIgKi8KKwl1bmlvbiB7CisJCWNvbnN0IGNoYXIgKipzdHJ2OwkvKiBzdHJpbmcgW10gKi8KKwkJc3RydWN0IHNoZiAqc2hmOwkvKiBzaGVsbCBmaWxlICovCisJCXN0cnVjdCB0YmwgKnRibHA7CS8qIGFsaWFzIChTRl9IQVNBTElBUykgKi8KKwkJY2hhciAqZnJlZW1lOwkJLyogYWxzbyBmb3IgU1JFUkVBRCAqLworCX0gdTsKKwljb25zdCBjaGFyICpmaWxlOwkvKiBpbnB1dCBmaWxlIG5hbWUgKi8KKwlpbnQJdHlwZTsJCS8qIGlucHV0IHR5cGUgKi8KKwlpbnQJbGluZTsJCS8qIGxpbmUgbnVtYmVyICovCisJaW50CWVycmxpbmU7CS8qIGxpbmUgdGhlIGVycm9yIG9jY3VycmVkIG9uICgwIGlmIG5vdCBzZXQpICovCisJaW50CWZsYWdzOwkJLyogU0ZfKiAqLworCUFyZWEJKmFyZWFwOworCVNvdXJjZSAqbmV4dDsJCS8qIHN0YWNrZWQgc291cmNlICovCisJWFN0cmluZwl4czsJCS8qIGlucHV0IGJ1ZmZlciAqLworCWNoYXIJdWdidWZbMl07CS8qIGJ1ZmZlciBmb3IgdW5nZXRzYygpIChTUkVSRUFEKSBhbmQKKwkJCQkgKiBhbGlhcyAoU0FMSUFTKSAqLworfTsKKworLyogU291cmNlLnR5cGUgdmFsdWVzICovCisjZGVmaW5lIFNFT0YJCTAJLyogaW5wdXQgRU9GICovCisjZGVmaW5lIFNGSUxFCQkxCS8qIGZpbGUgaW5wdXQgKi8KKyNkZWZpbmUgU1NURElOCQkyCS8qIHJlYWQgc3RkaW4gKi8KKyNkZWZpbmUgU1NUUklORwkJMwkvKiBzdHJpbmcgKi8KKyNkZWZpbmUgU1dTVFIJCTQJLyogc3RyaW5nIHdpdGhvdXQgXG4gKi8KKyNkZWZpbmUgU1dPUkRTCQk1CS8qIHN0cmluZ1tdICovCisjZGVmaW5lIFNXT1JEU0VQCTYJLyogc3RyaW5nW10gc2VwYXJhdG9yICovCisjZGVmaW5lIFNBTElBUwkJNwkvKiBhbGlhcyBleHBhbnNpb24gKi8KKyNkZWZpbmUgU1JFUkVBRAkJOAkvKiByZWFkIGFoZWFkIHRvIGJlIHJlLXNjYW5uZWQgKi8KKworLyogU291cmNlLmZsYWdzIHZhbHVlcyAqLworI2RlZmluZSBTRl9FQ0hPCQlCSVQoMCkJLyogZWNobyBpbnB1dCB0byBzaGxvdXQgKi8KKyNkZWZpbmUgU0ZfQUxJQVMJQklUKDEpCS8qIGZha2luZyBzcGFjZSBhdCBlbmQgb2YgYWxpYXMgKi8KKyNkZWZpbmUgU0ZfQUxJQVNFTkQJQklUKDIpCS8qIGZha2luZyBzcGFjZSBhdCBlbmQgb2YgYWxpYXMgKi8KKyNkZWZpbmUgU0ZfVFRZCQlCSVQoMykJLyogdHlwZSA9PSBTU1RESU4gJiBpdCBpcyBhIHR0eSAqLworI2RlZmluZSBTRl9GSVJTVAlCSVQoNCkJLyogaW5pdGlhbCBzdGF0ZSAodG8gaWdub3JlIFVURi04IEJPTSkgKi8KKyNkZWZpbmUgU0ZfSEFTQUxJQVMJQklUKDUpCS8qIHUudGJscCB2YWxpZCAoU0FMSUFTLCBTRU9GKSAqLworCit0eXBlZGVmIHVuaW9uIHsKKwlpbnQgaTsKKwljaGFyICpjcDsKKwljaGFyICoqd3A7CisJc3RydWN0IG9wICpvOworCXN0cnVjdCBpb3dvcmQgKmlvcDsKK30gWVlTVFlQRTsKKworLyogSWYgc29tZXRoaW5nIGlzIGFkZGVkIGhlcmUsIGFkZCBpdCB0byB0b2tlbnRhYltdIGluIHN5bi5jIGFzIHdlbGwgKi8KKyNkZWZpbmUgTFdPUkQJCTI1NgorI2RlZmluZSBMT0dBTkQJCTI1NwkvKiAmJiAqLworI2RlZmluZSBMT0dPUgkJMjU4CS8qIHx8ICovCisjZGVmaW5lIEJSRUFLCQkyNTkJLyogOzsgKi8KKyNkZWZpbmUgSUYJCTI2MAorI2RlZmluZSBUSEVOCQkyNjEKKyNkZWZpbmUgRUxTRQkJMjYyCisjZGVmaW5lIEVMSUYJCTI2MworI2RlZmluZSBGSQkJMjY0CisjZGVmaW5lIENBU0UJCTI2NQorI2RlZmluZSBFU0FDCQkyNjYKKyNkZWZpbmUgRk9SCQkyNjcKKyNkZWZpbmUgU0VMRUNUCQkyNjgKKyNkZWZpbmUgV0hJTEUJCTI2OQorI2RlZmluZSBVTlRJTAkJMjcwCisjZGVmaW5lIERPCQkyNzEKKyNkZWZpbmUgRE9ORQkJMjcyCisjZGVmaW5lIElOCQkyNzMKKyNkZWZpbmUgRlVOQ1RJT04JMjc0CisjZGVmaW5lIFRJTUUJCTI3NQorI2RlZmluZSBSRURJUgkJMjc2CisjZGVmaW5lIE1EUEFSRU4JCTI3NwkvKiAoKCApKSAqLworI2RlZmluZSBCQU5HCQkyNzgJLyogISAqLworI2RlZmluZSBEQlJBQ0tFVAkyNzkJLyogW1sgLi4gXV0gKi8KKyNkZWZpbmUgQ09QUk9DCQkyODAJLyogfCYgKi8KKyNkZWZpbmUgWVlFUlJDT0RFCTMwMAorCisvKiBmbGFncyB0byB5eWxleCAqLworI2RlZmluZSBDT05USU4JCUJJVCgwKQkvKiBza2lwIG5ldyBsaW5lcyB0byBjb21wbGV0ZSBjb21tYW5kICovCisjZGVmaW5lIE9ORVdPUkQJCUJJVCgxKQkvKiBzaW5nbGUgd29yZCBmb3Igc3Vic3RpdHV0ZSgpICovCisjZGVmaW5lIEFMSUFTCQlCSVQoMikJLyogcmVjb2duaXNlIGFsaWFzICovCisjZGVmaW5lIEtFWVdPUkQJCUJJVCgzKQkvKiByZWNvZ25pc2Uga2V5d29yZHMgKi8KKyNkZWZpbmUgTEVURVhQUgkJQklUKDQpCS8qIGdldCBleHByZXNzaW9uIGluc2lkZSAoKCApKSAqLworI2RlZmluZSBWQVJBU04JCUJJVCg1KQkvKiBjaGVjayBmb3IgdmFyPXdvcmQgKi8KKyNkZWZpbmUgQVJSQVlWQVIJQklUKDYpCS8qIHBhcnNlIHhbMSAmIDJdIGFzIG9uZSB3b3JkICovCisjZGVmaW5lIEVTQUNPTkxZCUJJVCg3KQkvKiBvbmx5IGFjY2VwdCBlc2FjIGtleXdvcmQgKi8KKyNkZWZpbmUgQ01EV09SRAkJQklUKDgpCS8qIHBhcnNpbmcgc2ltcGxlIGNvbW1hbmQgKGFsaWFzIHJlbGF0ZWQpICovCisjZGVmaW5lIEhFUkVERUxJTQlCSVQoOSkJLyogcGFyc2luZyA8PCw8PC0gZGVsaW1pdGVyICovCisjZGVmaW5lIExRQ0hBUgkJQklUKDEwKQkvKiBzb3VyY2Ugc3RyaW5nIGNvbnRhaW5zIFFDSEFSICovCisjZGVmaW5lIEhFUkVET0MJCUJJVCgxMSkJLyogcGFyc2luZyBhIGhlcmUgZG9jdW1lbnQgKi8KKyNkZWZpbmUgTEVUQVJSQVkJQklUKDEyKQkvKiBjb3B5IGV4cHJlc3Npb24gaW5zaWRlID0oICkgKi8KKworI2RlZmluZSBIRVJFUwkxMAkJLyogbWF4IDw8IGluIGxpbmUgKi8KKworI3VuZGVmIENUUkwKKyNkZWZpbmUJQ1RSTCh4KQkJKCh4KSA9PSAnPycgPyAweDdGIDogKHgpICYgMHgxRikJLyogQVNDSUkgKi8KKyNkZWZpbmUJVU5DVFJMKHgpCSgoeCkgXiAweDQwKQkJCQkvKiBBU0NJSSAqLworCitFWFRFUk4gU291cmNlICpzb3VyY2U7CQkvKiB5eXBhcnNlL3l5bGV4IHNvdXJjZSAqLworRVhURVJOIFlZU1RZUEUJeXlsdmFsOwkJLyogcmVzdWx0IGZyb20geXlsZXggKi8KK0VYVEVSTiBzdHJ1Y3QgaW93b3JkICpoZXJlcyBbSEVSRVNdLCAqKmhlcmVwOworRVhURVJOIGNoYXIJaWRlbnQgW0lERU5UKzFdOworCisjZGVmaW5lIEhJU1RPUllTSVpFCTUwMAkvKiBzaXplIG9mIHNhdmVkIGhpc3RvcnkgKi8KKworRVhURVJOIGNoYXIgKipoaXN0b3J5OwkvKiBzYXZlZCBjb21tYW5kcyAqLworRVhURVJOIGNoYXIgKipoaXN0cHRyOwkvKiBsYXN0IGhpc3RvcnkgaXRlbSAqLworRVhURVJOIGludCBoaXN0c2l6ZTsJLyogaGlzdG9yeSBzaXplICovCisKKy8qIHVzZXIgYW5kIHN5c3RlbSB0aW1lIG9mIGxhc3Qgal93YWl0amVkIGpvYiAqLworRVhURVJOIHN0cnVjdCB0aW1ldmFsIGpfdXNydGltZSwgal9zeXN0aW1lOworCisvKiBsYWxsb2MuYyAqLwordm9pZCBhaW5pdChBcmVhICopOwordm9pZCBhZnJlZWFsbChBcmVhICopOworLyogdGhlc2UgY2Fubm90IGZhaWwgYW5kIGNhbiB0YWtlIE5VTEwgKG5vdCBmb3IgYXApICovCisjZGVmaW5lIGFsbG9jKG4sIGFwKQlhcmVzaXplKE5VTEwsIChuKSwgKGFwKSkKK3ZvaWQgKmFyZXNpemUodm9pZCAqLCBzaXplX3QsIEFyZWEgKik7Cit2b2lkIGFmcmVlKHZvaWQgKiwgQXJlYSAqKTsJLyogY2FuIHRha2UgTlVMTCAqLworLyogZWRpdC5jICovCisjaWZuZGVmIE1LU0hfU01BTEwKK2ludCB4X2JpbmQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2wsIGJvb2wpOworI2Vsc2UKK2ludCB4X2JpbmQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2wpOworI2VuZGlmCit2b2lkIHhfaW5pdCh2b2lkKTsKK2ludCB4X3JlYWQoY2hhciAqLCBzaXplX3QpOworLyogZXZhbC5jICovCitjaGFyICpzdWJzdGl0dXRlKGNvbnN0IGNoYXIgKiwgaW50KTsKK2NoYXIgKipldmFsKGNvbnN0IGNoYXIgKiosIGludCk7CitjaGFyICpldmFsc3RyKGNvbnN0IGNoYXIgKmNwLCBpbnQpOworY2hhciAqZXZhbG9uZXN0cihjb25zdCBjaGFyICpjcCwgaW50KTsKK2NoYXIgKmRlYnVuayhjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK3ZvaWQgZXhwYW5kKGNvbnN0IGNoYXIgKiwgWFB0clYgKiwgaW50KTsKK2ludCBnbG9iX3N0cihjaGFyICosIFhQdHJWICosIGludCk7CisvKiBleGVjLmMgKi8KK2ludCBleGVjdXRlKHN0cnVjdCBvcCAqIHZvbGF0aWxlLCB2b2xhdGlsZSBpbnQsIHZvbGF0aWxlIGludCAqIHZvbGF0aWxlKTsKK2ludCBzaGNvbWV4ZWMoY29uc3QgY2hhciAqKik7CitzdHJ1Y3QgdGJsICpmaW5kZnVuYyhjb25zdCBjaGFyICosIHVpbnQzMl90LCBib29sKTsKK2ludCBkZWZpbmUoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgb3AgKik7Cit2b2lkIGJ1aWx0aW4oY29uc3QgY2hhciAqLCBpbnQgKCopKGNvbnN0IGNoYXIgKiopKTsKK3N0cnVjdCB0YmwgKmZpbmRjb20oY29uc3QgY2hhciAqLCBpbnQpOwordm9pZCBmbHVzaGNvbShpbnQpOworY29uc3QgY2hhciAqc2VhcmNoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCAqKTsKK2ludCBzZWFyY2hfYWNjZXNzKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQgKik7CitpbnQgcHJfbWVudShjb25zdCBjaGFyICogY29uc3QgKik7CitpbnQgcHJfbGlzdChjaGFyICogY29uc3QgKik7CisvKiBleHByLmMgKi8KK2ludCBldmFsdWF0ZShjb25zdCBjaGFyICosIG1rc2hfYXJpX3QgKiwgaW50LCBib29sKTsKK2ludCB2X2V2YWx1YXRlKHN0cnVjdCB0YmwgKiwgY29uc3QgY2hhciAqLCB2b2xhdGlsZSBpbnQsIGJvb2wpOworLyogVVRGLTggc3R1ZmYgKi8KK3NpemVfdCB1dGZfbWJ0b3djKHVuc2lnbmVkIGludCAqLCBjb25zdCBjaGFyICopOworc2l6ZV90IHV0Zl93Y3RvbWIoY2hhciAqLCB1bnNpZ25lZCBpbnQpOworaW50IHV0Zl93aWR0aGFkaihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiopOworaW50IHV0Zl9tYnN3aWR0aChjb25zdCBjaGFyICopOworY29uc3QgY2hhciAqdXRmX3NraXBjb2xzKGNvbnN0IGNoYXIgKiwgaW50KTsKK3NpemVfdCB1dGZfcHRyYWRqKGNvbnN0IGNoYXIgKik7CisjaWZuZGVmIE1LU0hfbWlyYnNkX3djd2lkdGgKK2ludCB1dGZfd2N3aWR0aCh1bnNpZ25lZCBpbnQpOworI2VuZGlmCisvKiBmdW5jcy5jICovCitpbnQgY19oYXNoKGNvbnN0IGNoYXIgKiopOworaW50IGNfY2QoY29uc3QgY2hhciAqKik7CitpbnQgY19wd2QoY29uc3QgY2hhciAqKik7CitpbnQgY19wcmludChjb25zdCBjaGFyICoqKTsKKyNpZmRlZiBNS1NIX1BSSU5URl9CVUlMVElOCitpbnQgY19wcmludGYoY29uc3QgY2hhciAqKik7CisjZW5kaWYKK2ludCBjX3doZW5jZShjb25zdCBjaGFyICoqKTsKK2ludCBjX2NvbW1hbmQoY29uc3QgY2hhciAqKik7CitpbnQgY190eXBlc2V0KGNvbnN0IGNoYXIgKiopOworaW50IGNfYWxpYXMoY29uc3QgY2hhciAqKik7CitpbnQgY191bmFsaWFzKGNvbnN0IGNoYXIgKiopOworaW50IGNfbGV0KGNvbnN0IGNoYXIgKiopOworaW50IGNfam9icyhjb25zdCBjaGFyICoqKTsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECitpbnQgY19mZ2JnKGNvbnN0IGNoYXIgKiopOworI2VuZGlmCitpbnQgY19raWxsKGNvbnN0IGNoYXIgKiopOwordm9pZCBnZXRvcHRzX3Jlc2V0KGludCk7CitpbnQgY19nZXRvcHRzKGNvbnN0IGNoYXIgKiopOworaW50IGNfYmluZChjb25zdCBjaGFyICoqKTsKK2ludCBjX2xhYmVsKGNvbnN0IGNoYXIgKiopOworaW50IGNfc2hpZnQoY29uc3QgY2hhciAqKik7CitpbnQgY191bWFzayhjb25zdCBjaGFyICoqKTsKK2ludCBjX2RvdChjb25zdCBjaGFyICoqKTsKK2ludCBjX3dhaXQoY29uc3QgY2hhciAqKik7CitpbnQgY19yZWFkKGNvbnN0IGNoYXIgKiopOworaW50IGNfZXZhbChjb25zdCBjaGFyICoqKTsKK2ludCBjX3RyYXAoY29uc3QgY2hhciAqKik7CitpbnQgY19icmtjb250KGNvbnN0IGNoYXIgKiopOworaW50IGNfZXhpdHJldHVybihjb25zdCBjaGFyICoqKTsKK2ludCBjX3NldChjb25zdCBjaGFyICoqKTsKK2ludCBjX3Vuc2V0KGNvbnN0IGNoYXIgKiopOworaW50IGNfdWxpbWl0KGNvbnN0IGNoYXIgKiopOworaW50IGNfdGltZXMoY29uc3QgY2hhciAqKik7CitpbnQgdGltZXgoc3RydWN0IG9wICosIGludCwgdm9sYXRpbGUgaW50ICopOwordm9pZCB0aW1leF9ob29rKHN0cnVjdCBvcCAqLCBjaGFyICoqIHZvbGF0aWxlICopOworaW50IGNfZXhlYyhjb25zdCBjaGFyICoqKTsKK2ludCBjX2J1aWx0aW4oY29uc3QgY2hhciAqKik7CitpbnQgY190ZXN0KGNvbnN0IGNoYXIgKiopOworI2lmIEhBVkVfTUtOT0QKK2ludCBjX21rbm9kKGNvbnN0IGNoYXIgKiopOworI2VuZGlmCitpbnQgY19yZWFscGF0aChjb25zdCBjaGFyICoqKTsKK2ludCBjX3JlbmFtZShjb25zdCBjaGFyICoqKTsKKy8qIGhpc3RyYXAuYyAqLwordm9pZCBpbml0X2hpc3R2ZWModm9pZCk7Cit2b2lkIGhpc3RfaW5pdChTb3VyY2UgKik7CisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKK3ZvaWQgaGlzdF9maW5pc2godm9pZCk7CisjZW5kaWYKK3ZvaWQgaGlzdHNhdmUoaW50ICosIGNvbnN0IGNoYXIgKiwgYm9vbCwgYm9vbCk7CisjaWYgIWRlZmluZWQoTUtTSF9TTUFMTCkgJiYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKK2Jvb2wgaGlzdHN5bmModm9pZCk7CisjZW5kaWYKK2ludCBjX2ZjKGNvbnN0IGNoYXIgKiopOwordm9pZCBzZXRoaXN0c2l6ZShpbnQpOworI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCit2b2lkIHNldGhpc3RmaWxlKGNvbnN0IGNoYXIgKik7CisjZW5kaWYKK2NoYXIgKipoaXN0cG9zKHZvaWQpOworaW50IGhpc3RudW0oaW50KTsKK2ludCBmaW5kaGlzdChpbnQsIGludCwgY29uc3QgY2hhciAqLCBpbnQpOworaW50IGZpbmRoaXN0cmVsKGNvbnN0IGNoYXIgKik7CitjaGFyICoqaGlzdF9nZXRfbmV3ZXN0KGJvb2wpOwordm9pZCBpbml0dHJhcHModm9pZCk7Cit2b2lkIGFsYXJtX2luaXQodm9pZCk7CitUcmFwICpnZXR0cmFwKGNvbnN0IGNoYXIgKiwgaW50KTsKK3ZvaWQgdHJhcHNpZyhpbnQpOwordm9pZCBpbnRyY2hlY2sodm9pZCk7CitpbnQgZmF0YWxfdHJhcF9jaGVjayh2b2lkKTsKK2ludCB0cmFwX3BlbmRpbmcodm9pZCk7Cit2b2lkIHJ1bnRyYXBzKGludCBpbnRyKTsKK3ZvaWQgcnVudHJhcChUcmFwICopOwordm9pZCBjbGVhcnRyYXBzKHZvaWQpOwordm9pZCByZXN0b3Jlc2lncyh2b2lkKTsKK3ZvaWQgc2V0dHJhcChUcmFwICosIGNvbnN0IGNoYXIgKik7CitpbnQgYmxvY2tfcGlwZSh2b2lkKTsKK3ZvaWQgcmVzdG9yZV9waXBlKGludCk7CitpbnQgc2V0c2lnKFRyYXAgKiwgc2lnX3QsIGludCk7Cit2b2lkIHNldGV4ZWNzaWcoVHJhcCAqLCBpbnQpOworLyogam9icy5jICovCit2b2lkIGpfaW5pdCh2b2lkKTsKK3ZvaWQgal9leGl0KHZvaWQpOworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKK3ZvaWQgal9jaGFuZ2Uodm9pZCk7CisjZW5kaWYKK2ludCBleGNoaWxkKHN0cnVjdCBvcCAqLCBpbnQsIHZvbGF0aWxlIGludCAqLCBpbnQpOwordm9pZCBzdGFydGxhc3Qodm9pZCk7CitpbnQgd2FpdGxhc3Qodm9pZCk7CitpbnQgd2FpdGZvcihjb25zdCBjaGFyICosIGludCAqKTsKK2ludCBqX2tpbGwoY29uc3QgY2hhciAqLCBpbnQpOworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKK2ludCBqX3Jlc3VtZShjb25zdCBjaGFyICosIGludCk7CisjZW5kaWYKK2ludCBqX2pvYnMoY29uc3QgY2hhciAqLCBpbnQsIGludCk7CitpbnQgal9uam9icyh2b2lkKTsKK3ZvaWQgal9ub3RpZnkodm9pZCk7CitwaWRfdCBqX2FzeW5jKHZvaWQpOworaW50IGpfc3RvcHBlZF9ydW5uaW5nKHZvaWQpOworLyogbGV4LmMgKi8KK2ludCB5eWxleChpbnQpOwordm9pZCB5eWVycm9yKGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIE1LU0hfQV9OT1JFVFVSTgorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKK1NvdXJjZSAqcHVzaHMoaW50LCBBcmVhICopOwordm9pZCBzZXRfcHJvbXB0KGludCwgU291cmNlICopOwordm9pZCBwcHJvbXB0KGNvbnN0IGNoYXIgKiwgaW50KTsKK2ludCBwcm9tcHRsZW4oY29uc3QgY2hhciAqKTsKKy8qIG1haW4uYyAqLworaW50IGluY2x1ZGUoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiosIGludCk7CitpbnQgY29tbWFuZChjb25zdCBjaGFyICosIGludCk7CitpbnQgc2hlbGwoU291cmNlICp2b2xhdGlsZSwgaW50IHZvbGF0aWxlKTsKK3ZvaWQgdW53aW5kKGludCkgTUtTSF9BX05PUkVUVVJOOwordm9pZCBuZXdlbnYoaW50KTsKK3ZvaWQgcXVpdGVudihzdHJ1Y3Qgc2hmICopOwordm9pZCBjbGVhbnVwX3BhcmVudHNfZW52KHZvaWQpOwordm9pZCBjbGVhbnVwX3Byb2NfZW52KHZvaWQpOwordm9pZCBlcnJvcmYoY29uc3QgY2hhciAqLCAuLi4pCisgICAgTUtTSF9BX05PUkVUVVJOCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOwordm9pZCB3YXJuaW5nZihib29sLCBjb25zdCBjaGFyICosIC4uLikKKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMiwgMyk7Cit2b2lkIGJpX2Vycm9yZihjb25zdCBjaGFyICosIC4uLikKKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7CisjZGVmaW5lIGVycm9yZnooKQllcnJvcmYoIlwxIikKKyNkZWZpbmUgYmlfZXJyb3JmeigpCWJpX2Vycm9yZigiXDEiKQordm9pZCBpbnRlcm5hbF92ZXJyb3JmKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkKKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMCk7Cit2b2lkIGludGVybmFsX2Vycm9yZihjb25zdCBjaGFyICosIC4uLikKKyAgICBNS1NIX0FfTk9SRVRVUk4KKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7Cit2b2lkIGludGVybmFsX3dhcm5pbmdmKGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKK3ZvaWQgZXJyb3JfcHJlZml4KGJvb2wpOwordm9pZCBzaGVsbGYoY29uc3QgY2hhciAqLCAuLi4pCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOwordm9pZCBzaHByaW50Zihjb25zdCBjaGFyICosIC4uLikKKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7CitpbnQgY2FuX3NlZWsoaW50KTsKK3ZvaWQgaW5pdGlvKHZvaWQpOworaW50IGtzaF9kdXAyKGludCwgaW50LCBib29sKTsKK3Nob3J0IHNhdmVmZChpbnQpOwordm9pZCByZXN0ZmQoaW50LCBpbnQpOwordm9pZCBvcGVucGlwZShpbnQgKik7Cit2b2lkIGNsb3NlcGlwZShpbnQgKik7CitpbnQgY2hlY2tfZmQoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiopOwordm9pZCBjb3Byb2NfaW5pdCh2b2lkKTsKK3ZvaWQgY29wcm9jX3JlYWRfY2xvc2UoaW50KTsKK3ZvaWQgY29wcm9jX3JlYWR3X2Nsb3NlKGludCk7Cit2b2lkIGNvcHJvY193cml0ZV9jbG9zZShpbnQpOworaW50IGNvcHJvY19nZXRmZChpbnQsIGNvbnN0IGNoYXIgKiopOwordm9pZCBjb3Byb2NfY2xlYW51cChpbnQpOworc3RydWN0IHRlbXAgKm1ha2V0ZW1wKEFyZWEgKiwgVGVtcF90eXBlLCBzdHJ1Y3QgdGVtcCAqKik7CisjZGVmaW5lIGhhc2gocykgb2FhdGhhc2hfZnVsbCgoY29uc3QgdWludDhfdCAqKShzKSkKK3VpbnQzMl90IG9hYXRoYXNoX2Z1bGwocmVnaXN0ZXIgY29uc3QgdWludDhfdCAqKTsKK3VpbnQzMl90IGhhc2htZW0oY29uc3Qgdm9pZCAqLCBzaXplX3QpOwordm9pZCBrdGluaXQoc3RydWN0IHRhYmxlICosIEFyZWEgKiwgc2l6ZV90KTsKK3N0cnVjdCB0YmwgKmt0c2VhcmNoKHN0cnVjdCB0YWJsZSAqLCBjb25zdCBjaGFyICosIHVpbnQzMl90KTsKK3N0cnVjdCB0YmwgKmt0ZW50ZXIoc3RydWN0IHRhYmxlICosIGNvbnN0IGNoYXIgKiwgdWludDMyX3QpOworI2RlZmluZSBrdGRlbGV0ZShwKQlkbyB7IHAtPmZsYWcgPSAwOyB9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKK3ZvaWQga3R3YWxrKHN0cnVjdCB0c3RhdGUgKiwgc3RydWN0IHRhYmxlICopOworc3RydWN0IHRibCAqa3RuZXh0KHN0cnVjdCB0c3RhdGUgKik7CitzdHJ1Y3QgdGJsICoqa3Rzb3J0KHN0cnVjdCB0YWJsZSAqKTsKKy8qIG1pc2MuYyAqLwordm9pZCBzZXRjdHlwZXMoY29uc3QgY2hhciAqLCBpbnQpOwordm9pZCBpbml0Y3R5cGVzKHZvaWQpOworc2l6ZV90IG9wdGlvbihjb25zdCBjaGFyICopOworY2hhciAqZ2V0b3B0aW9ucyh2b2lkKTsKK3ZvaWQgY2hhbmdlX2ZsYWcoZW51bSBzaF9mbGFnLCBpbnQsIHVuc2lnbmVkIGludCk7CitpbnQgcGFyc2VfYXJncyhjb25zdCBjaGFyICoqLCBpbnQsIGJvb2wgKik7CitpbnQgZ2V0bihjb25zdCBjaGFyICosIGludCAqKTsKK2ludCBiaV9nZXRuKGNvbnN0IGNoYXIgKiwgaW50ICopOworaW50IGdtYXRjaHgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2wpOworaW50IGhhc19nbG9iYmluZyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Citjb25zdCB1bnNpZ25lZCBjaGFyICpwYXRfc2Nhbihjb25zdCB1bnNpZ25lZCBjaGFyICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK2ludCB4c3RyY21wKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKK3ZvaWQga3NoX2dldG9wdF9yZXNldChHZXRvcHQgKiwgaW50KTsKK2ludCBrc2hfZ2V0b3B0KGNvbnN0IGNoYXIgKiosIEdldG9wdCAqLCBjb25zdCBjaGFyICopOwordm9pZCBwcmludF92YWx1ZV9xdW90ZWQoY29uc3QgY2hhciAqKTsKK3ZvaWQgcHJpbnRfY29sdW1ucyhzdHJ1Y3Qgc2hmICosIGludCwKKyAgICBjaGFyICooKikoY2hhciAqLCBpbnQsIGludCwgY29uc3Qgdm9pZCAqKSwKKyAgICBjb25zdCB2b2lkICosIGludCwgaW50LCBib29sKTsKK3ZvaWQgc3RyaXBfbnVscyhjaGFyICosIGludCk7CitpbnQgYmxvY2tpbmdfcmVhZChpbnQsIGNoYXIgKiwgaW50KQorICAgIE1LU0hfQV9CT1VOREVEKGJ1ZmZlciwgMiwgMyk7CitpbnQgcmVzZXRfbm9uYmxvY2soaW50KTsKK2NoYXIgKmtzaF9nZXRfd2Qoc2l6ZV90ICopOworaW50IG1ha2VfcGF0aChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgWFN0cmluZyAqLCBpbnQgKik7Cit2b2lkIHNpbXBsaWZ5X3BhdGgoY2hhciAqKTsKK3ZvaWQgc2V0X2N1cnJlbnRfd2QoY2hhciAqKTsKKyNpZmRlZiBNS1NIX1NNQUxMCitjaGFyICpzdHJkdXBfKGNvbnN0IGNoYXIgKiwgQXJlYSAqKTsKK2NoYXIgKnN0cm5kdXBfKGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBBcmVhICopOworI2VuZGlmCitpbnQgdW5ia3NsKGJvb2wsIGludCAoKikodm9pZCksIHZvaWQgKCopKGludCkpOworLyogc2hmLmMgKi8KK3N0cnVjdCBzaGYgKnNoZl9vcGVuKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCk7CitzdHJ1Y3Qgc2hmICpzaGZfZmRvcGVuKGludCwgaW50LCBzdHJ1Y3Qgc2hmICopOworc3RydWN0IHNoZiAqc2hmX3Jlb3BlbihpbnQsIGludCwgc3RydWN0IHNoZiAqKTsKK3N0cnVjdCBzaGYgKnNoZl9zb3BlbihjaGFyICosIGludCwgaW50LCBzdHJ1Y3Qgc2hmICopOworaW50IHNoZl9jbG9zZShzdHJ1Y3Qgc2hmICopOworaW50IHNoZl9mZGNsb3NlKHN0cnVjdCBzaGYgKik7CitjaGFyICpzaGZfc2Nsb3NlKHN0cnVjdCBzaGYgKik7CitpbnQgc2hmX2ZsdXNoKHN0cnVjdCBzaGYgKik7CitpbnQgc2hmX3JlYWQoY2hhciAqLCBpbnQsIHN0cnVjdCBzaGYgKik7CitjaGFyICpzaGZfZ2V0c2UoY2hhciAqLCBpbnQsIHN0cnVjdCBzaGYgKik7CitpbnQgc2hmX2dldGNoYXIoc3RydWN0IHNoZiAqcyk7CitpbnQgc2hmX3VuZ2V0YyhpbnQsIHN0cnVjdCBzaGYgKik7CitpbnQgc2hmX3B1dGNoYXIoaW50LCBzdHJ1Y3Qgc2hmICopOworaW50IHNoZl9wdXRzKGNvbnN0IGNoYXIgKiwgc3RydWN0IHNoZiAqKTsKK2ludCBzaGZfd3JpdGUoY29uc3QgY2hhciAqLCBpbnQsIHN0cnVjdCBzaGYgKik7CitpbnQgc2hmX2ZwcmludGYoc3RydWN0IHNoZiAqLCBjb25zdCBjaGFyICosIC4uLikKKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMiwgMyk7CitpbnQgc2hmX3NucHJpbnRmKGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIC4uLikKKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMywgNCkKKyAgICBNS1NIX0FfQk9VTkRFRChzdHJpbmcsIDEsIDIpOworY2hhciAqc2hmX3NtcHJpbnRmKGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKK2ludCBzaGZfdmZwcmludGYoc3RydWN0IHNoZiAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDIsIDApOworLyogc3luLmMgKi8KK3ZvaWQgaW5pdGtleXdvcmRzKHZvaWQpOworc3RydWN0IG9wICpjb21waWxlKFNvdXJjZSAqKTsKKy8qIHRyZWUuYyAqLworaW50IGZwdHJlZWYoc3RydWN0IHNoZiAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2NoYXIgKnNucHRyZWVmKGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIC4uLik7CitzdHJ1Y3Qgb3AgKnRjb3B5KHN0cnVjdCBvcCAqLCBBcmVhICopOworY2hhciAqd2Rjb3B5KGNvbnN0IGNoYXIgKiwgQXJlYSAqKTsKK2NvbnN0IGNoYXIgKndkc2Nhbihjb25zdCBjaGFyICosIGludCk7CitjaGFyICp3ZHN0cmlwKGNvbnN0IGNoYXIgKiwgYm9vbCwgYm9vbCk7Cit2b2lkIHRmcmVlKHN0cnVjdCBvcCAqLCBBcmVhICopOworLyogdmFyLmMgKi8KK3ZvaWQgbmV3YmxvY2sodm9pZCk7Cit2b2lkIHBvcGJsb2NrKHZvaWQpOwordm9pZCBpbml0dmFyKHZvaWQpOworc3RydWN0IHRibCAqZ2xvYmFsKGNvbnN0IGNoYXIgKik7CitzdHJ1Y3QgdGJsICpsb2NhbChjb25zdCBjaGFyICosIGJvb2wpOworY2hhciAqc3RyX3ZhbChzdHJ1Y3QgdGJsICopOworaW50IHNldHN0cihzdHJ1Y3QgdGJsICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK3N0cnVjdCB0YmwgKnNldGludF92KHN0cnVjdCB0YmwgKiwgc3RydWN0IHRibCAqLCBib29sKTsKK3ZvaWQgc2V0aW50KHN0cnVjdCB0YmwgKiwgbWtzaF9hcmlfdCk7CitzdHJ1Y3QgdGJsICp0eXBlc2V0KGNvbnN0IGNoYXIgKiwgVGZsYWcsIFRmbGFnLCBpbnQsIGludCkKKyAgICBNS1NIX0FfTk9OTlVMTCgobm9ubnVsbCAoMSkpKTsKK3ZvaWQgdW5zZXQoc3RydWN0IHRibCAqLCBpbnQpOworY29uc3QgY2hhciAqc2tpcF92YXJuYW1lKGNvbnN0IGNoYXIgKiwgaW50KTsKK2NvbnN0IGNoYXIgKnNraXBfd2R2YXJuYW1lKGNvbnN0IGNoYXIgKiwgaW50KTsKK2ludCBpc193ZHZhcm5hbWUoY29uc3QgY2hhciAqLCBpbnQpOworaW50IGlzX3dkdmFyYXNzaWduKGNvbnN0IGNoYXIgKik7CitjaGFyICoqbWFrZW52KHZvaWQpOwordm9pZCBjaGFuZ2VfcmFuZG9tKGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3ZvaWQgY2hhbmdlX3dpbnN6KHZvaWQpOworaW50IGFycmF5X3JlZl9sZW4oY29uc3QgY2hhciAqKTsKK2NoYXIgKmFycmF5bmFtZShjb25zdCBjaGFyICopOworbWtzaF91YXJpX3Qgc2V0X2FycmF5KGNvbnN0IGNoYXIgKiwgYm9vbCwgY29uc3QgY2hhciAqKik7CisKK2VudW0gVGVzdF9vcCB7CisJVE9fTk9OT1AgPSAwLAkvKiBub24tb3BlcmF0b3IgKi8KKwkvKiB1bmFyeSBvcGVyYXRvcnMgKi8KKwlUT19TVE5aRSwgVE9fU1RaRVIsIFRPX09QVElPTiwKKwlUT19GSUxBWFNULAorCVRPX0ZJTEVYU1QsCisJVE9fRklMUkVHLCBUT19GSUxCREVWLCBUT19GSUxDREVWLCBUT19GSUxTWU0sIFRPX0ZJTEZJRk8sIFRPX0ZJTFNPQ0ssCisJVE9fRklMQ0RGLCBUT19GSUxJRCwgVE9fRklMR0lELCBUT19GSUxTRVRHLCBUT19GSUxTVENLLCBUT19GSUxVSUQsCisJVE9fRklMUkQsIFRPX0ZJTEdaLCBUT19GSUxUVCwgVE9fRklMU0VUVSwgVE9fRklMV1IsIFRPX0ZJTEVYLAorCS8qIGJpbmFyeSBvcGVyYXRvcnMgKi8KKwlUT19TVEVRTCwgVE9fU1RORVEsIFRPX1NUTFQsIFRPX1NUR1QsIFRPX0lOVEVRLCBUT19JTlRORSwgVE9fSU5UR1QsCisJVE9fSU5UR0UsIFRPX0lOVExULCBUT19JTlRMRSwgVE9fRklMRVEsIFRPX0ZJTE5ULCBUT19GSUxPVCwKKwkvKiBub3QgYW4gb3BlcmF0b3IgKi8KKwlUT19OT05OVUxMCS8qICFUT19OT05PUCAqLworfTsKK3R5cGVkZWYgZW51bSBUZXN0X29wIFRlc3Rfb3A7CisKKy8qIFVzZWQgYnkgVGVzdF9lbnYuaXNhKCkgKG9yZGVyIGltcG9ydGFudCAtIHVzZWQgdG8gaW5kZXggKl90b2tlbnNbXSBhcnJheXMpICovCitlbnVtIFRlc3RfbWV0YSB7CisJVE1fT1IsCQkvKiAtbyBvciB8fCAqLworCVRNX0FORCwJCS8qIC1hIG9yICYmICovCisJVE1fTk9ULAkJLyogISAqLworCVRNX09QQVJFTiwJLyogKCAqLworCVRNX0NQQVJFTiwJLyogKSAqLworCVRNX1VOT1AsCS8qIHVuYXJ5IG9wZXJhdG9yICovCisJVE1fQklOT1AsCS8qIGJpbmFyeSBvcGVyYXRvciAqLworCVRNX0VORAkJLyogZW5kIG9mIGlucHV0ICovCit9OwordHlwZWRlZiBlbnVtIFRlc3RfbWV0YSBUZXN0X21ldGE7CisKKyNkZWZpbmUgVEVGX0VSUk9SCUJJVCgwKQkJLyogc2V0IGlmIHdlJ3ZlIGhpdCBhbiBlcnJvciAqLworI2RlZmluZSBURUZfREJSQUNLRVQJQklUKDEpCQkvKiBzZXQgaWYgW1sgLi4gXV0gdGVzdCAqLworCit0eXBlZGVmIHN0cnVjdCB0ZXN0X2VudiB7CisJdW5pb24geworCQljb25zdCBjaGFyICoqd3A7LyogdXNlZCBieSBwdGVzdF8qICovCisJCVhQdHJWICphdjsJLyogdXNlZCBieSBkYnRlc3RwXyogKi8KKwl9IHBvczsKKwljb25zdCBjaGFyICoqd3BfZW5kOwkvKiB1c2VkIGJ5IHB0ZXN0XyogKi8KKwlUZXN0X29wICgqaXNhKShzdHJ1Y3QgdGVzdF9lbnYgKiwgVGVzdF9tZXRhKTsKKwljb25zdCBjaGFyICooKmdldG9wbmQpIChzdHJ1Y3QgdGVzdF9lbnYgKiwgVGVzdF9vcCwgYm9vbCk7CisJaW50ICgqZXZhbCkoc3RydWN0IHRlc3RfZW52ICosIFRlc3Rfb3AsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sKTsKKwl2b2lkICgqZXJyb3IpKHN0cnVjdCB0ZXN0X2VudiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CisJaW50IGZsYWdzOwkJLyogVEVGXyogKi8KK30gVGVzdF9lbnY7CisKK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBkYnRlc3RfdG9rZW5zW107CisKK1Rlc3Rfb3AJdGVzdF9pc29wKFRlc3RfbWV0YSwgY29uc3QgY2hhciAqKTsKK2ludCB0ZXN0X2V2YWwoVGVzdF9lbnYgKiwgVGVzdF9vcCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2wpOworaW50IHRlc3RfcGFyc2UoVGVzdF9lbnYgKik7CisKK0VYVEVSTiBpbnQgdHR5X2ZkIElfXygtMSk7CS8qIGR1cCdkIHR0eSBmaWxlIGRlc2NyaXB0b3IgKi8KK0VYVEVSTiBpbnQgdHR5X2RldnR0eTsJCS8qIHRydWUgaWYgdHR5X2ZkIGlzIGZyb20gL2Rldi90dHkgKi8KK0VYVEVSTiBzdHJ1Y3QgdGVybWlvcyB0dHlfc3RhdGU7CS8qIHNhdmVkIHR0eSBzdGF0ZSAqLworCitleHRlcm4gdm9pZCB0dHlfaW5pdChib29sLCBib29sKTsKK2V4dGVybiB2b2lkIHR0eV9jbG9zZSh2b2lkKTsKKworLyogYmUgc3VyZSBub3QgdG8gaW50ZXJmZXJlIHdpdGggYW55b25lIGVsc2UncyBpZGVhIGFib3V0IEVYVEVSTiAqLworI2lmZGVmIEVYVEVSTl9ERUZJTkVECisjIHVuZGVmIEVYVEVSTl9ERUZJTkVECisjIHVuZGVmIEVYVEVSTgorI2VuZGlmCisjdW5kZWYgSV9fCisKKyNlbmRpZiAvKiAhTUtTSF9JTkNMVURFU19PTkxZICovCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9zaF9mbGFncy5oIGIvbWtzaC9zcmMvc2hfZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTU0ODFlCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvc2hfZmxhZ3MuaApAQCAtMCwwICsxLDE0NSBAQAorI2lmIGRlZmluZWQoU0hGTEFHU19ERUZOUykKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL3NoX2ZsYWdzLmgsdiAxLjcgMjAxMC8wNy8xMyAxMzowNzo1OCB0ZyBFeHAgJCIpOworI2RlZmluZSBGTihzbmFtZSxjbmFtZSxvY2hhcixmbGFncykJLyogbm90aGluZyAqLworI2VsaWYgZGVmaW5lZChTSEZMQUdTX0VOVU1TKQorI2RlZmluZSBGTihzbmFtZSxjbmFtZSxvY2hhcixmbGFncykJY25hbWUsCisjZGVmaW5lIEYwKHNuYW1lLGNuYW1lLG9jaGFyLGZsYWdzKQljbmFtZSA9IDAsCisjZWxpZiBkZWZpbmVkKFNIRkxBR1NfSVRFTVMpCisjZGVmaW5lIEZOKHNuYW1lLGNuYW1lLG9jaGFyLGZsYWdzKQl7IHNuYW1lLCBvY2hhciwgZmxhZ3MgfSwKKyNlbmRpZgorCisjaWZuZGVmIEYwCisjZGVmaW5lIEYwIEZOCisjZW5kaWYKKworLyoKKyAqIHNwZWNpYWwgY2FzZXMgKHNlZSBwYXJzZV9hcmdzKCkpOiAtQSwgLW8sIC1zCisgKgorICogb3B0aW9ucyBhcmUgc29ydGVkIGJ5IHRoZWlyIGxvbmduYW1lcworICovCisKKy8qIC1hCWFsbCBuZXcgcGFyYW1ldGVycyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBleHBvcnQgYXR0cmlidXRlICovCitGMCgiYWxsZXhwb3J0IiwgRkVYUE9SVCwgJ2EnLCBPRl9BTlkpCisKKy8qIC4vLgliYWNrd2FyZHMgY29tcGF0OiBkdW1teSwgZW1pdHMgYSB3YXJuaW5nICovCitGTigiYXJjNHJhbmRvbSIsIEZBUkM0UkFORE9NLCAwLCBPRl9BTlkpCisKKyNpZiBIQVZFX05JQ0UKKy8qIC4vLgliZ25pY2UgKi8KK0ZOKCJiZ25pY2UiLCBGQkdOSUNFLCAwLCBPRl9BTlkpCisjZW5kaWYKKworLyogLi8uCWVuYWJsZSB7fSBnbG9iYmluZyAobm9uLXN0YW5kYXJkKSAqLworRk4oImJyYWNlZXhwYW5kIiwgRkJSQUNFRVhQQU5ELCAwLCBPRl9BTlkpCisKKy8qIC4vLglFbWFjcyBjb21tYW5kIGxpbmUgZWRpdGluZyBtb2RlICovCitGTigiZW1hY3MiLCBGRU1BQ1MsIDAsIE9GX0FOWSkKKworLyogLWUJcXVpdCBvbiBlcnJvciAqLworRk4oImVycmV4aXQiLCBGRVJSRVhJVCwgJ2UnLCBPRl9BTlkpCisKKy8qIC4vLglFbWFjcyBjb21tYW5kIGxpbmUgZWRpdGluZyBtb2RlLCBnbWFjcyB2YXJpYW50ICovCitGTigiZ21hY3MiLCBGR01BQ1MsIDAsIE9GX0FOWSkKKworLyogLi8uCXJlYWRpbmcgRU9GIGRvZXMgbm90IGV4aXQgKi8KK0ZOKCJpZ25vcmVlb2YiLCBGSUdOT1JFRU9GLCAwLCBPRl9BTlkpCisKKy8qIC1pCWludGVyYWN0aXZlIHNoZWxsICovCitGTigiaW50ZXJhY3RpdmUiLCBGVEFMS0lORywgJ2knLCBPRl9DTURMSU5FKQorCisvKiAtawluYW1lPXZhbHVlIGFyZSByZWNvZ25pc2VkIGFueXdoZXJlICovCitGTigia2V5d29yZCIsIEZLRVlXT1JELCAnaycsIE9GX0FOWSkKKworLyogLWwJbG9naW4gc2hlbGwgKi8KK0ZOKCJsb2dpbiIsIEZMT0dJTiwgJ2wnLCBPRl9DTURMSU5FKQorCisvKiAtWAltYXJrIGRpcnMgd2l0aCAvIGluIGZpbGUgbmFtZSBjb21wbGV0aW9uICovCitGTigibWFya2RpcnMiLCBGTUFSS0RJUlMsICdYJywgT0ZfQU5ZKQorCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorLyogLW0Jam9iIGNvbnRyb2wgbW9uaXRvcmluZyAqLworRk4oIm1vbml0b3IiLCBGTU9OSVRPUiwgJ20nLCBPRl9BTlkpCisjZW5kaWYKKworLyogLUMJZG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzICovCitGTigibm9jbG9iYmVyIiwgRk5PQ0xPQkJFUiwgJ0MnLCBPRl9BTlkpCisKKy8qIC1uCWRvbid0IGV4ZWN1dGUgYW55IGNvbW1hbmRzICovCitGTigibm9leGVjIiwgRk5PRVhFQywgJ24nLCBPRl9BTlkpCisKKy8qIC1mCWRvbid0IGRvIGZpbGUgZ2xvYmJpbmcgKi8KK0ZOKCJub2dsb2IiLCBGTk9HTE9CLCAnZicsIE9GX0FOWSkKKworLyogLi8uCWRvbid0IGtpbGwgcnVubmluZyBqb2JzIHdoZW4gbG9naW4gc2hlbGwgZXhpdHMgKi8KK0ZOKCJub2h1cCIsIEZOT0hVUCwgMCwgT0ZfQU5ZKQorCisvKiAuLy4JZG9uJ3Qgc2F2ZSBmdW5jdGlvbnMgaW4gaGlzdG9yeSAobm8gZWZmZWN0KSAqLworRk4oIm5vbG9nIiwgRk5PTE9HLCAwLCBPRl9BTlkpCisKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisvKiAtYglhc3luY2hyb25vdXMgam9iIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uICovCitGTigibm90aWZ5IiwgRk5PVElGWSwgJ2InLCBPRl9BTlkpCisjZW5kaWYKKworLyogLXUJdXNpbmcgYW4gdW5zZXQgdmFyaWFibGUgaXMgYW4gZXJyb3IgKi8KK0ZOKCJub3Vuc2V0IiwgRk5PVU5TRVQsICd1JywgT0ZfQU5ZKQorCisvKiAuLy4JZG9uJ3QgZG8gbG9naWNhbCBjZHMvcHdkcyAobm9uLXN0YW5kYXJkKSAqLworRk4oInBoeXNpY2FsIiwgRlBIWVNJQ0FMLCAwLCBPRl9BTlkpCisKKy8qIC4vLglwZGtzaCBjb21wYXQ6IHNvbWV3aGF0IG1vcmUgUE9TSVhpc2ggbW9kZSAobm9uLXN0YW5kYXJkKSAqLworRk4oInBvc2l4IiwgRlBPU0lYLCAwLCBPRl9BTlkpCisKKy8qIC1wCXVzZSBzdWlkX3Byb2ZpbGU7IHByaXZpbGVnZWQgc2hlbGwgKi8KK0ZOKCJwcml2aWxlZ2VkIiwgRlBSSVZJTEVHRUQsICdwJywgT0ZfQU5ZKQorCisvKiAtcglyZXN0cmljdGVkIHNoZWxsICovCitGTigicmVzdHJpY3RlZCIsIEZSRVNUUklDVEVELCAncicsIE9GX0NNRExJTkUpCisKKy8qIC4vLglwZGtzaCBjb21wYXQ6IGNhbGxlZCBhcyBzaCBub3QgbWtzaDsga2x1ZGdlIG1vZGUgKG5vbi1zdGFuZGFyZCkgKi8KK0ZOKCJzaCIsIEZTSCwgMCwgT0ZfQU5ZKQorCisvKiAtcwkoaW52b2NhdGlvbikgcGFyc2Ugc3RkaW4gKHBzZXVkbyBub24tc3RhbmRhcmQpICovCitGTigic3RkaW4iLCBGU1RESU4sICdzJywgT0ZfQ01ETElORSkKKworLyogLWgJY3JlYXRlIHRyYWNrZWQgYWxpYXNlcyBmb3IgYWxsIGNvbW1hbmRzICovCitGTigidHJhY2thbGwiLCBGVFJBQ0tBTEwsICdoJywgT0ZfQU5ZKQorCisvKiAtVQllbmFibGUgVVRGLTggcHJvY2Vzc2luZyAobm9uLXN0YW5kYXJkKSAqLworRk4oInV0ZjgtbW9kZSIsIEZVTklDT0RFLCAnVScsIE9GX0FOWSkKKworLyogLXYJZWNobyBpbnB1dCAqLworRk4oInZlcmJvc2UiLCBGVkVSQk9TRSwgJ3YnLCBPRl9BTlkpCisKKyNpZiAhTUtTSF9TX05PVkkKKy8qIC4vLglWaSBjb21tYW5kIGxpbmUgZWRpdGluZyBtb2RlICovCitGTigidmkiLCBGVkksIDAsIE9GX0FOWSkKKworLyogLi8uCWVuYWJsZSBFU0MgYXMgZmlsZSBuYW1lIGNvbXBsZXRpb24gY2hhcmFjdGVyIChub24tc3RhbmRhcmQpICovCitGTigidmktZXNjY29tcGxldGUiLCBGVklFU0NDT01QTEVURSwgMCwgT0ZfQU5ZKQorCisvKiAuLy4JZW5hYmxlIFRhYiBhcyBmaWxlIG5hbWUgY29tcGxldGlvbiBjaGFyYWN0ZXIgKG5vbi1zdGFuZGFyZCkgKi8KK0ZOKCJ2aS10YWJjb21wbGV0ZSIsIEZWSVRBQkNPTVBMRVRFLCAwLCBPRl9BTlkpCisKKy8qIC4vLglhbHdheXMgcmVhZCBpbiByYXcgbW9kZSAobm8gZWZmZWN0KSAqLworRk4oInZpcmF3IiwgRlZJUkFXLCAwLCBPRl9BTlkpCisjZW5kaWYKKworLyogLXgJZXhlY3V0aW9uIHRyYWNlIChkaXNwbGF5IGNvbW1hbmRzIGFzIHRoZXkgYXJlIHJ1bikgKi8KK0ZOKCJ4dHJhY2UiLCBGWFRSQUNFLCAneCcsIE9GX0FOWSkKKworLyogLWMJKGludm9jYXRpb24pIGV4ZWN1dGUgc3BlY2lmaWVkIGNvbW1hbmQgKi8KK0ZOKE5VTEwsIEZDT01NQU5ELCAnYycsIE9GX0NNRExJTkUpCisKKy8qCisgKiBhbm9ueW1vdXMgZmxhZ3M6IHVzZWQgaW50ZXJuYWxseSBieSBzaGVsbCBvbmx5IChub3QgdmlzaWJsZSB0byB1c2VyKQorICovCisKKy8qIC4vLgkoaW50ZXJuYWwpIGluaXRpYWwgc2hlbGwgd2FzIGludGVyYWN0aXZlICovCitGTihOVUxMLCBGVEFMS0lOR19JLCAwLCBPRl9JTlRFUk5BTCkKKworI3VuZGVmIEZOCisjdW5kZWYgRjAKKyN1bmRlZiBTSEZMQUdTX0RFRk5TCisjdW5kZWYgU0hGTEFHU19FTlVNUworI3VuZGVmIFNIRkxBR1NfSVRFTVMKZGlmZiAtLWdpdCBhL21rc2gvc3JjL3NoZi5jIGIvbWtzaC9zcmMvc2hmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2Mjc1MgotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL3NoZi5jCkBAIC0wLDAgKzEsMTA0MiBAQAorLyoJJE9wZW5CU0Q6IHNoZi5jLHYgMS4xNSAyMDA2LzA0LzAyIDAwOjQ4OjMzIGRlcmFhZHQgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9zaGYuYyx2IDEuMzYgMjAxMC8wNy8xOSAyMjo0MTowNCB0ZyBFeHAgJCIpOworCisvKiBmbGFncyB0byBzaGZfZW1wdHlidWYoKSAqLworI2RlZmluZSBFQl9SRUFEU1cJMHgwMQkvKiBhYm91dCB0byBzd2l0Y2ggdG8gcmVhZGluZyAqLworI2RlZmluZSBFQl9HUk9XCQkweDAyCS8qIGdyb3cgYnVmZmVyIGlmIG5lY2Vzc2FyeSAoU1RSSU5HK0RZTkFNSUMpICovCisKKy8qCisgKiBSZXBsYWNlbWVudCBzdGRpbyByb3V0aW5lcy4gU3RkaW8gaXMgdG9vIGZsYWtleSBvbiB0b28gbWFueSBtYWNoaW5lcworICogdG8gYmUgdXNlZnVsIHdoZW4geW91IGhhdmUgbXVsdGlwbGUgcHJvY2Vzc2VzIHVzaW5nIHRoZSBzYW1lIHVuZGVybHlpbmcKKyAqIGZpbGUgZGVzY3JpcHRvcnMuCisgKi8KKworc3RhdGljIGludCBzaGZfZmlsbGJ1ZihzdHJ1Y3Qgc2hmICopOworc3RhdGljIGludCBzaGZfZW1wdHlidWYoc3RydWN0IHNoZiAqLCBpbnQpOworCisvKiBPcGVuIGEgZmlsZS4gRmlyc3QgdGhyZWUgYXJncyBhcmUgZm9yIG9wZW4oKSwgbGFzdCBhcmcgaXMgZmxhZ3MgZm9yCisgKiB0aGlzIHBhY2thZ2UuIFJldHVybnMgTlVMTCBpZiBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQsIG9yIGlmIGEgZHVwCisgKiBmYWlscy4KKyAqLworc3RydWN0IHNoZiAqCitzaGZfb3Blbihjb25zdCBjaGFyICpuYW1lLCBpbnQgb2ZsYWdzLCBpbnQgbW9kZSwgaW50IHNmbGFncykKK3sKKwlzdHJ1Y3Qgc2hmICpzaGY7CisJaW50IGJzaXplID0gc2ZsYWdzICYgU0hGX1VOQlVGID8gKHNmbGFncyAmIFNIRl9SRCA/IDEgOiAwKSA6IFNIRl9CU0laRTsKKwlpbnQgZmQ7CisKKwkvKiBEb25lIGJlZm9yZSBvcGVuIHNvIGlmIGFsbG9jYSBmYWlscywgZmQgd29uJ3QgYmUgbG9zdC4gKi8KKwlzaGYgPSBhbGxvYyhzaXplb2Yoc3RydWN0IHNoZikgKyBic2l6ZSwgQVRFTVApOworCXNoZi0+YXJlYXAgPSBBVEVNUDsKKwlzaGYtPmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopJnNoZlsxXTsKKwlzaGYtPmJzaXplID0gYnNpemU7CisJc2hmLT5mbGFncyA9IFNIRl9BTExPQ1M7CisJLyogUmVzdCBmaWxsZWQgaW4gYnkgcmVvcGVuLiAqLworCisJZmQgPSBvcGVuKG5hbWUsIG9mbGFncywgbW9kZSk7CisJaWYgKGZkIDwgMCkgeworCQlhZnJlZShzaGYsIHNoZi0+YXJlYXApOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlpZiAoKHNmbGFncyAmIFNIRl9NQVBISSkgJiYgZmQgPCBGREJBU0UpIHsKKwkJaW50IG5mZDsKKworCQluZmQgPSBmY250bChmZCwgRl9EVVBGRCwgRkRCQVNFKTsKKwkJY2xvc2UoZmQpOworCQlpZiAobmZkIDwgMCkgeworCQkJYWZyZWUoc2hmLCBzaGYtPmFyZWFwKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJZmQgPSBuZmQ7CisJfQorCXNmbGFncyAmPSB+U0hGX0FDQ01PREU7CisJc2ZsYWdzIHw9IChvZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZID8gU0hGX1JEIDoKKwkgICAgKChvZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZID8gU0hGX1dSIDogU0hGX1JEV1IpOworCisJcmV0dXJuIChzaGZfcmVvcGVuKGZkLCBzZmxhZ3MsIHNoZikpOworfQorCisvKiBTZXQgdXAgdGhlIHNoZiBzdHJ1Y3R1cmUgZm9yIGEgZmlsZSBkZXNjcmlwdG9yLiBEb2Vzbid0IGZhaWwuICovCitzdHJ1Y3Qgc2hmICoKK3NoZl9mZG9wZW4oaW50IGZkLCBpbnQgc2ZsYWdzLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaW50IGJzaXplID0gc2ZsYWdzICYgU0hGX1VOQlVGID8gKHNmbGFncyAmIFNIRl9SRCA/IDEgOiAwKSA6IFNIRl9CU0laRTsKKworCS8qIHVzZSBmY250bCgpIHRvIGZpZ3VyZSBvdXQgY29ycmVjdCByZWFkL3dyaXRlIGZsYWdzICovCisJaWYgKHNmbGFncyAmIFNIRl9HRVRGTCkgeworCQlpbnQgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7CisKKwkJaWYgKGZsYWdzIDwgMCkKKwkJCS8qIHdpbGwgZ2V0IGFuIGVycm9yIG9uIGZpcnN0IHJlYWQvd3JpdGUgKi8KKwkJCXNmbGFncyB8PSBTSEZfUkRXUjsKKwkJZWxzZSB7CisJCQlzd2l0Y2ggKGZsYWdzICYgT19BQ0NNT0RFKSB7CisJCQljYXNlIE9fUkRPTkxZOgorCQkJCXNmbGFncyB8PSBTSEZfUkQ7CisJCQkJYnJlYWs7CisJCQljYXNlIE9fV1JPTkxZOgorCQkJCXNmbGFncyB8PSBTSEZfV1I7CisJCQkJYnJlYWs7CisJCQljYXNlIE9fUkRXUjoKKwkJCQlzZmxhZ3MgfD0gU0hGX1JEV1I7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIShzZmxhZ3MgJiAoU0hGX1JEIHwgU0hGX1dSKSkpCisJCWludGVybmFsX2Vycm9yZigic2hmX2Zkb3BlbjogbWlzc2luZyByZWFkL3dyaXRlIik7CisKKwlpZiAoc2hmKSB7CisJCWlmIChic2l6ZSkgeworCQkJc2hmLT5idWYgPSBhbGxvYyhic2l6ZSwgQVRFTVApOworCQkJc2ZsYWdzIHw9IFNIRl9BTExPQ0I7CisJCX0gZWxzZQorCQkJc2hmLT5idWYgPSBOVUxMOworCX0gZWxzZSB7CisJCXNoZiA9IGFsbG9jKHNpemVvZihzdHJ1Y3Qgc2hmKSArIGJzaXplLCBBVEVNUCk7CisJCXNoZi0+YnVmID0gKHVuc2lnbmVkIGNoYXIgKikmc2hmWzFdOworCQlzZmxhZ3MgfD0gU0hGX0FMTE9DUzsKKwl9CisJc2hmLT5hcmVhcCA9IEFURU1QOworCXNoZi0+ZmQgPSBmZDsKKwlzaGYtPnJwID0gc2hmLT53cCA9IHNoZi0+YnVmOworCXNoZi0+cm5sZWZ0ID0gMDsKKwlzaGYtPnJic2l6ZSA9IGJzaXplOworCXNoZi0+d25sZWZ0ID0gMDsgLyogZm9yY2UgY2FsbCB0byBzaGZfZW1wdHlidWYoKSAqLworCXNoZi0+d2JzaXplID0gc2ZsYWdzICYgU0hGX1VOQlVGID8gMCA6IGJzaXplOworCXNoZi0+ZmxhZ3MgPSBzZmxhZ3M7CisJc2hmLT5lcnJub18gPSAwOworCXNoZi0+YnNpemUgPSBic2l6ZTsKKwlpZiAoc2ZsYWdzICYgU0hGX0NMRVhFQykKKwkJZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCXJldHVybiAoc2hmKTsKK30KKworLyogU2V0IHVwIGFuIGV4aXN0aW5nIHNoZiAoYW5kIGJ1ZmZlcikgdG8gdXNlIHRoZSBnaXZlbiBmZCAqLworc3RydWN0IHNoZiAqCitzaGZfcmVvcGVuKGludCBmZCwgaW50IHNmbGFncywgc3RydWN0IHNoZiAqc2hmKQoreworCWludCBic2l6ZSA9IHNmbGFncyAmIFNIRl9VTkJVRiA/IChzZmxhZ3MgJiBTSEZfUkQgPyAxIDogMCkgOiBTSEZfQlNJWkU7CisKKwkvKiB1c2UgZmNudGwoKSB0byBmaWd1cmUgb3V0IGNvcnJlY3QgcmVhZC93cml0ZSBmbGFncyAqLworCWlmIChzZmxhZ3MgJiBTSEZfR0VURkwpIHsKKwkJaW50IGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwsIDApOworCisJCWlmIChmbGFncyA8IDApCisJCQkvKiB3aWxsIGdldCBhbiBlcnJvciBvbiBmaXJzdCByZWFkL3dyaXRlICovCisJCQlzZmxhZ3MgfD0gU0hGX1JEV1I7CisJCWVsc2UgeworCQkJc3dpdGNoIChmbGFncyAmIE9fQUNDTU9ERSkgeworCQkJY2FzZSBPX1JET05MWToKKwkJCQlzZmxhZ3MgfD0gU0hGX1JEOworCQkJCWJyZWFrOworCQkJY2FzZSBPX1dST05MWToKKwkJCQlzZmxhZ3MgfD0gU0hGX1dSOworCQkJCWJyZWFrOworCQkJY2FzZSBPX1JEV1I6CisJCQkJc2ZsYWdzIHw9IFNIRl9SRFdSOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKCEoc2ZsYWdzICYgKFNIRl9SRCB8IFNIRl9XUikpKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9yZW9wZW46IG1pc3NpbmcgcmVhZC93cml0ZSIpOworCWlmICghc2hmIHx8ICFzaGYtPmJ1ZiB8fCBzaGYtPmJzaXplIDwgYnNpemUpCisJCWludGVybmFsX2Vycm9yZigic2hmX3Jlb3BlbjogYmFkIHNoZi9idWYvYnNpemUiKTsKKworCS8qIGFzc3VtZXMgc2hmLT5idWYgYW5kIHNoZi0+YnNpemUgYWxyZWFkeSBzZXQgdXAgKi8KKwlzaGYtPmZkID0gZmQ7CisJc2hmLT5ycCA9IHNoZi0+d3AgPSBzaGYtPmJ1ZjsKKwlzaGYtPnJubGVmdCA9IDA7CisJc2hmLT5yYnNpemUgPSBic2l6ZTsKKwlzaGYtPndubGVmdCA9IDA7IC8qIGZvcmNlIGNhbGwgdG8gc2hmX2VtcHR5YnVmKCkgKi8KKwlzaGYtPndic2l6ZSA9IHNmbGFncyAmIFNIRl9VTkJVRiA/IDAgOiBic2l6ZTsKKwlzaGYtPmZsYWdzID0gKHNoZi0+ZmxhZ3MgJiAoU0hGX0FMTE9DUyB8IFNIRl9BTExPQ0IpKSB8IHNmbGFnczsKKwlzaGYtPmVycm5vXyA9IDA7CisJaWYgKHNmbGFncyAmIFNIRl9DTEVYRUMpCisJCWZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKwlyZXR1cm4gKHNoZik7Cit9CisKKy8qIE9wZW4gYSBzdHJpbmcgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gSWYgcmVhZGluZywgYnNpemUgaXMgdGhlIG51bWJlcgorICogb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZC4gSWYgd3JpdGluZywgYnNpemUgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCisgKiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuLiBJZiBzaGYgaXMgbm90IG51bGwsIGl0IGlzIGZpbGxlZCBpbiBhbmQKKyAqIHJldHVybmVkLCBpZiBpdCBpcyBudWxsLCBzaGYgaXMgYWxsb2NhdGVkLiBJZiB3cml0aW5nIGFuZCBidWYgaXMgbnVsbAorICogYW5kIFNIRl9EWU5BTUlDIGlzIHNldCwgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgKGlmIGJzaXplID4gMCwgaXQgaXMKKyAqIHVzZWQgZm9yIHRoZSBpbml0aWFsIHNpemUpLiBEb2Vzbid0IGZhaWwuCisgKiBXaGVuIHdyaXRpbmcsIGEgYnl0ZSBpcyByZXNlcnZlZCBmb3IgYSB0cmFpbGluZyBudWxsIC0gc2VlIHNoZl9zY2xvc2UoKS4KKyAqLworc3RydWN0IHNoZiAqCitzaGZfc29wZW4oY2hhciAqYnVmLCBpbnQgYnNpemUsIGludCBzZmxhZ3MsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwkvKiBjYW4ndCBoYXZlIGEgcmVhZCt3cml0ZSBzdHJpbmcgKi8KKwlpZiAoISghKHNmbGFncyAmIFNIRl9SRCkgXiAhKHNmbGFncyAmIFNIRl9XUikpKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9zb3BlbjogZmxhZ3MgMHgleCIsIHNmbGFncyk7CisKKwlpZiAoIXNoZikgeworCQlzaGYgPSBhbGxvYyhzaXplb2Yoc3RydWN0IHNoZiksIEFURU1QKTsKKwkJc2ZsYWdzIHw9IFNIRl9BTExPQ1M7CisJfQorCXNoZi0+YXJlYXAgPSBBVEVNUDsKKwlpZiAoIWJ1ZiAmJiAoc2ZsYWdzICYgU0hGX1dSKSAmJiAoc2ZsYWdzICYgU0hGX0RZTkFNSUMpKSB7CisJCWlmIChic2l6ZSA8PSAwKQorCQkJYnNpemUgPSA2NDsKKwkJc2ZsYWdzIHw9IFNIRl9BTExPQ0I7CisJCWJ1ZiA9IGFsbG9jKGJzaXplLCBzaGYtPmFyZWFwKTsKKwl9CisJc2hmLT5mZCA9IC0xOworCXNoZi0+YnVmID0gc2hmLT5ycCA9IHNoZi0+d3AgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKKwlzaGYtPnJubGVmdCA9IGJzaXplOworCXNoZi0+cmJzaXplID0gYnNpemU7CisJc2hmLT53bmxlZnQgPSBic2l6ZSAtIDE7CS8qIHNwYWNlIGZvciBhICdcMCcgKi8KKwlzaGYtPndic2l6ZSA9IGJzaXplOworCXNoZi0+ZmxhZ3MgPSBzZmxhZ3MgfCBTSEZfU1RSSU5HOworCXNoZi0+ZXJybm9fID0gMDsKKwlzaGYtPmJzaXplID0gYnNpemU7CisKKwlyZXR1cm4gKHNoZik7Cit9CisKKy8qIEZsdXNoIGFuZCBjbG9zZSBmaWxlIGRlc2NyaXB0b3IsIGZyZWUgdGhlIHNoZiBzdHJ1Y3R1cmUgKi8KK2ludAorc2hmX2Nsb3NlKHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzaGYtPmZkID49IDApIHsKKwkJcmV0ID0gc2hmX2ZsdXNoKHNoZik7CisJCWlmIChjbG9zZShzaGYtPmZkKSA8IDApCisJCQlyZXQgPSBFT0Y7CisJfQorCWlmIChzaGYtPmZsYWdzICYgU0hGX0FMTE9DUykKKwkJYWZyZWUoc2hmLCBzaGYtPmFyZWFwKTsKKwllbHNlIGlmIChzaGYtPmZsYWdzICYgU0hGX0FMTE9DQikKKwkJYWZyZWUoc2hmLT5idWYsIHNoZi0+YXJlYXApOworCisJcmV0dXJuIChyZXQpOworfQorCisvKiBGbHVzaCBhbmQgY2xvc2UgZmlsZSBkZXNjcmlwdG9yLCBkb24ndCBmcmVlIGZpbGUgc3RydWN0dXJlICovCitpbnQKK3NoZl9mZGNsb3NlKHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzaGYtPmZkID49IDApIHsKKwkJcmV0ID0gc2hmX2ZsdXNoKHNoZik7CisJCWlmIChjbG9zZShzaGYtPmZkKSA8IDApCisJCQlyZXQgPSBFT0Y7CisJCXNoZi0+cm5sZWZ0ID0gMDsKKwkJc2hmLT5ycCA9IHNoZi0+YnVmOworCQlzaGYtPndubGVmdCA9IDA7CisJCXNoZi0+ZmQgPSAtMTsKKwl9CisKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qIENsb3NlIGEgc3RyaW5nIC0gaWYgaXQgd2FzIG9wZW5lZCBmb3Igd3JpdGluZywgaXQgaXMgbnVsbCB0ZXJtaW5hdGVkOworICogcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBhbmQgZnJlZXMgc2hmIGlmIGl0IHdhcyBhbGxvY2F0ZWQKKyAqIChkb2VzIG5vdCBmcmVlIHN0cmluZyBpZiBpdCB3YXMgYWxsb2NhdGVkKS4KKyAqLworY2hhciAqCitzaGZfc2Nsb3NlKHN0cnVjdCBzaGYgKnNoZikKK3sKKwl1bnNpZ25lZCBjaGFyICpzID0gc2hmLT5idWY7CisKKwkvKiBudWxsIHRlcm1pbmF0ZSAqLworCWlmIChzaGYtPmZsYWdzICYgU0hGX1dSKSB7CisJCXNoZi0+d25sZWZ0Kys7CisJCXNoZl9wdXRjKCdcMCcsIHNoZik7CisJfQorCWlmIChzaGYtPmZsYWdzICYgU0hGX0FMTE9DUykKKwkJYWZyZWUoc2hmLCBzaGYtPmFyZWFwKTsKKwlyZXR1cm4gKChjaGFyICopcyk7Cit9CisKKy8qIFVuLXJlYWQgd2hhdCBoYXMgYmVlbiByZWFkIGJ1dCBub3QgZXhhbWluZWQsIG9yIHdyaXRlIHdoYXQgaGFzIGJlZW4KKyAqIGJ1ZmZlcmVkLiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIEVPRiBmb3IgKHdyaXRlKSBlcnJvci4KKyAqLworaW50CitzaGZfZmx1c2goc3RydWN0IHNoZiAqc2hmKQoreworCWlmIChzaGYtPmZsYWdzICYgU0hGX1NUUklORykKKwkJcmV0dXJuICgoc2hmLT5mbGFncyAmIFNIRl9XUikgPyBFT0YgOiAwKTsKKworCWlmIChzaGYtPmZkIDwgMCkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfZmx1c2g6IG5vIGZkIik7CisKKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9FUlJPUikgeworCQllcnJubyA9IHNoZi0+ZXJybm9fOworCQlyZXR1cm4gKEVPRik7CisJfQorCisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfUkVBRElORykgeworCQlzaGYtPmZsYWdzICY9IH4oU0hGX0VPRiB8IFNIRl9SRUFESU5HKTsKKwkJaWYgKHNoZi0+cm5sZWZ0ID4gMCkgeworCQkJbHNlZWsoc2hmLT5mZCwgKG9mZl90KS1zaGYtPnJubGVmdCwgU0VFS19DVVIpOworCQkJc2hmLT5ybmxlZnQgPSAwOworCQkJc2hmLT5ycCA9IHNoZi0+YnVmOworCQl9CisJCXJldHVybiAoMCk7CisJfSBlbHNlIGlmIChzaGYtPmZsYWdzICYgU0hGX1dSSVRJTkcpCisJCXJldHVybiAoc2hmX2VtcHR5YnVmKHNoZiwgMCkpOworCisJcmV0dXJuICgwKTsKK30KKworLyogV3JpdGUgb3V0IGFueSBidWZmZXJlZCBkYXRhLiBJZiBjdXJyZW50bHkgcmVhZGluZywgZmx1c2hlcyB0aGUgcmVhZAorICogYnVmZmVyLiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIEVPRiBmb3IgKHdyaXRlKSBlcnJvci4KKyAqLworc3RhdGljIGludAorc2hmX2VtcHR5YnVmKHN0cnVjdCBzaGYgKnNoZiwgaW50IGZsYWdzKQoreworCWludCByZXQgPSAwOworCisJaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpICYmIHNoZi0+ZmQgPCAwKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9lbXB0eWJ1Zjogbm8gZmQiKTsKKworCWlmIChzaGYtPmZsYWdzICYgU0hGX0VSUk9SKSB7CisJCWVycm5vID0gc2hmLT5lcnJub187CisJCXJldHVybiAoRU9GKTsKKwl9CisKKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9SRUFESU5HKSB7CisJCWlmIChmbGFncyAmIEVCX1JFQURTVykgLyogZG9lc24ndCBoYXBwZW4gKi8KKwkJCXJldHVybiAoMCk7CisJCXJldCA9IHNoZl9mbHVzaChzaGYpOworCQlzaGYtPmZsYWdzICY9IH5TSEZfUkVBRElORzsKKwl9CisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKSB7CisJCXVuc2lnbmVkIGNoYXIgKm5idWY7CisKKwkJLyogTm90ZSB0aGF0IHdlIGFzc3VtZSBTSEZfQUxMT0NTIGlzIG5vdCBzZXQgaWYgU0hGX0FMTE9DQgorCQkgKiBpcyBzZXQuLi4gKGNoYW5naW5nIHRoZSBzaGYgcG9pbnRlciBjb3VsZCBjYXVzZSBwcm9ibGVtcykKKwkJICovCisJCWlmICghKGZsYWdzICYgRUJfR1JPVykgfHwgIShzaGYtPmZsYWdzICYgU0hGX0RZTkFNSUMpIHx8CisJCSAgICAhKHNoZi0+ZmxhZ3MgJiBTSEZfQUxMT0NCKSkKKwkJCXJldHVybiAoRU9GKTsKKwkJLyogYWxsb2NhdGUgbW9yZSBzcGFjZSBmb3IgYnVmZmVyICovCisJCW5idWYgPSBhcmVzaXplKHNoZi0+YnVmLCAyICogc2hmLT53YnNpemUsIHNoZi0+YXJlYXApOworCQlzaGYtPnJwID0gbmJ1ZiArIChzaGYtPnJwIC0gc2hmLT5idWYpOworCQlzaGYtPndwID0gbmJ1ZiArIChzaGYtPndwIC0gc2hmLT5idWYpOworCQlzaGYtPnJic2l6ZSArPSBzaGYtPndic2l6ZTsKKwkJc2hmLT53bmxlZnQgKz0gc2hmLT53YnNpemU7CisJCXNoZi0+d2JzaXplICo9IDI7CisJCXNoZi0+YnVmID0gbmJ1ZjsKKwl9IGVsc2UgeworCQlpZiAoc2hmLT5mbGFncyAmIFNIRl9XUklUSU5HKSB7CisJCQlpbnQgbnRvd3JpdGUgPSBzaGYtPndwIC0gc2hmLT5idWY7CisJCQl1bnNpZ25lZCBjaGFyICpidWYgPSBzaGYtPmJ1ZjsKKwkJCWludCBuOworCisJCQl3aGlsZSAobnRvd3JpdGUgPiAwKSB7CisJCQkJbiA9IHdyaXRlKHNoZi0+ZmQsIGJ1ZiwgbnRvd3JpdGUpOworCQkJCWlmIChuIDwgMCkgeworCQkJCQlpZiAoZXJybm8gPT0gRUlOVFIgJiYKKwkJCQkJICAgICEoc2hmLT5mbGFncyAmIFNIRl9JTlRFUlJVUFQpKQorCQkJCQkJY29udGludWU7CisJCQkJCXNoZi0+ZmxhZ3MgfD0gU0hGX0VSUk9SOworCQkJCQlzaGYtPmVycm5vXyA9IGVycm5vOworCQkJCQlzaGYtPndubGVmdCA9IDA7CisJCQkJCWlmIChidWYgIT0gc2hmLT5idWYpIHsKKwkJCQkJCS8qIGFsbG93IGEgc2Vjb25kIGZsdXNoCisJCQkJCQkgKiB0byB3b3JrICovCisJCQkJCQltZW1tb3ZlKHNoZi0+YnVmLCBidWYsCisJCQkJCQkgICAgbnRvd3JpdGUpOworCQkJCQkJc2hmLT53cCA9IHNoZi0+YnVmICsgbnRvd3JpdGU7CisJCQkJCX0KKwkJCQkJcmV0dXJuIChFT0YpOworCQkJCX0KKwkJCQlidWYgKz0gbjsKKwkJCQludG93cml0ZSAtPSBuOworCQkJfQorCQkJaWYgKGZsYWdzICYgRUJfUkVBRFNXKSB7CisJCQkJc2hmLT53cCA9IHNoZi0+YnVmOworCQkJCXNoZi0+d25sZWZ0ID0gMDsKKwkJCQlzaGYtPmZsYWdzICY9IH5TSEZfV1JJVElORzsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQl9CisJCXNoZi0+d3AgPSBzaGYtPmJ1ZjsKKwkJc2hmLT53bmxlZnQgPSBzaGYtPndic2l6ZTsKKwl9CisJc2hmLT5mbGFncyB8PSBTSEZfV1JJVElORzsKKworCXJldHVybiAocmV0KTsKK30KKworLyogRmlsbCB1cCBhIHJlYWQgYnVmZmVyLiBSZXR1cm5zIEVPRiBmb3IgYSByZWFkIGVycm9yLCAwIG90aGVyd2lzZS4gKi8KK3N0YXRpYyBpbnQKK3NoZl9maWxsYnVmKHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpCisJCXJldHVybiAoMCk7CisKKwlpZiAoc2hmLT5mZCA8IDApCisJCWludGVybmFsX2Vycm9yZigic2hmX2ZpbGxidWY6IG5vIGZkIik7CisKKwlpZiAoc2hmLT5mbGFncyAmIChTSEZfRU9GIHwgU0hGX0VSUk9SKSkgeworCQlpZiAoc2hmLT5mbGFncyAmIFNIRl9FUlJPUikKKwkJCWVycm5vID0gc2hmLT5lcnJub187CisJCXJldHVybiAoRU9GKTsKKwl9CisKKwlpZiAoKHNoZi0+ZmxhZ3MgJiBTSEZfV1JJVElORykgJiYgc2hmX2VtcHR5YnVmKHNoZiwgRUJfUkVBRFNXKSA9PSBFT0YpCisJCXJldHVybiAoRU9GKTsKKworCXNoZi0+ZmxhZ3MgfD0gU0hGX1JFQURJTkc7CisKKwlzaGYtPnJwID0gc2hmLT5idWY7CisJd2hpbGUgKDEpIHsKKwkJc2hmLT5ybmxlZnQgPSBibG9ja2luZ19yZWFkKHNoZi0+ZmQsIChjaGFyICopIHNoZi0+YnVmLAorCQkgICAgc2hmLT5yYnNpemUpOworCQlpZiAoc2hmLT5ybmxlZnQgPCAwICYmIGVycm5vID09IEVJTlRSICYmCisJCSAgICAhKHNoZi0+ZmxhZ3MgJiBTSEZfSU5URVJSVVBUKSkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKKwl9CisJaWYgKHNoZi0+cm5sZWZ0IDw9IDApIHsKKwkJaWYgKHNoZi0+cm5sZWZ0IDwgMCkgeworCQkJc2hmLT5mbGFncyB8PSBTSEZfRVJST1I7CisJCQlzaGYtPmVycm5vXyA9IGVycm5vOworCQkJc2hmLT5ybmxlZnQgPSAwOworCQkJc2hmLT5ycCA9IHNoZi0+YnVmOworCQkJcmV0dXJuIChFT0YpOworCQl9CisJCXNoZi0+ZmxhZ3MgfD0gU0hGX0VPRjsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyogUmVhZCBhIGJ1ZmZlciBmcm9tIHNoZi4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byBidWYsCisgKiBpZiBubyBieXRlcyB3ZXJlIHJlYWQsIHJldHVybnMgMCBpZiBlbmQgb2YgZmlsZSB3YXMgc2VlbiwgRU9GIGlmCisgKiBhIHJlYWQgZXJyb3Igb2NjdXJyZWQuCisgKi8KK2ludAorc2hmX3JlYWQoY2hhciAqYnVmLCBpbnQgYnNpemUsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpbnQgb3JpZ19ic2l6ZSA9IGJzaXplOworCWludCBuY29weTsKKworCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfUkQpKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9yZWFkOiBmbGFncyAleCIsIHNoZi0+ZmxhZ3MpOworCisJaWYgKGJzaXplIDw9IDApCisJCWludGVybmFsX2Vycm9yZigic2hmX3JlYWQ6IGJzaXplICVkIiwgYnNpemUpOworCisJd2hpbGUgKGJzaXplID4gMCkgeworCQlpZiAoc2hmLT5ybmxlZnQgPT0gMCAmJgorCQkgICAgKHNoZl9maWxsYnVmKHNoZikgPT0gRU9GIHx8IHNoZi0+cm5sZWZ0ID09IDApKQorCQkJYnJlYWs7CisJCW5jb3B5ID0gc2hmLT5ybmxlZnQ7CisJCWlmIChuY29weSA+IGJzaXplKQorCQkJbmNvcHkgPSBic2l6ZTsKKwkJbWVtY3B5KGJ1Ziwgc2hmLT5ycCwgbmNvcHkpOworCQlidWYgKz0gbmNvcHk7CisJCWJzaXplIC09IG5jb3B5OworCQlzaGYtPnJwICs9IG5jb3B5OworCQlzaGYtPnJubGVmdCAtPSBuY29weTsKKwl9CisJLyogTm90ZTogZnJlYWQoM1MpIHJldHVybnMgMCBmb3IgZXJyb3JzIC0gdGhpcyBkb2Vzbid0ICovCisJcmV0dXJuIChvcmlnX2JzaXplID09IGJzaXplID8gKHNoZl9lcnJvcihzaGYpID8gRU9GIDogMCkgOgorCSAgICBvcmlnX2JzaXplIC0gYnNpemUpOworfQorCisvKiBSZWFkIHVwIHRvIGEgbmV3bGluZSBvciBFT0YuIFRoZSBuZXdsaW5lIGlzIHB1dCBpbiBidWY7IGJ1ZiBpcyBhbHdheXMKKyAqIG51bGwgdGVybWluYXRlZC4gUmV0dXJucyBOVUxMIG9uIHJlYWQgZXJyb3Igb3IgaWYgbm90aGluZyB3YXMgcmVhZCBiZWZvcmUKKyAqIGVuZCBvZiBmaWxlLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbnVsbCBieXRlIGluIGJ1ZiBvdGhlcndpc2UuCisgKi8KK2NoYXIgKgorc2hmX2dldHNlKGNoYXIgKmJ1ZiwgaW50IGJzaXplLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJdW5zaWduZWQgY2hhciAqZW5kOworCWludCBuY29weTsKKwljaGFyICpvcmlnX2J1ZiA9IGJ1ZjsKKworCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfUkQpKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9nZXRzZTogZmxhZ3MgJXgiLCBzaGYtPmZsYWdzKTsKKworCWlmIChic2l6ZSA8PSAwKQorCQlyZXR1cm4gKE5VTEwpOworCisJLS1ic2l6ZTsJLyogc2F2ZSByb29tIGZvciBudWxsICovCisJZG8geworCQlpZiAoc2hmLT5ybmxlZnQgPT0gMCkgeworCQkJaWYgKHNoZl9maWxsYnVmKHNoZikgPT0gRU9GKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlpZiAoc2hmLT5ybmxlZnQgPT0gMCkgeworCQkJCSpidWYgPSAnXDAnOworCQkJCXJldHVybiAoYnVmID09IG9yaWdfYnVmID8gTlVMTCA6IGJ1Zik7CisJCQl9CisJCX0KKwkJZW5kID0gKHVuc2lnbmVkIGNoYXIgKiltZW1jaHIoKGNoYXIgKikgc2hmLT5ycCwgJ1xuJywKKwkJICAgIHNoZi0+cm5sZWZ0KTsKKwkJbmNvcHkgPSBlbmQgPyBlbmQgLSBzaGYtPnJwICsgMSA6IHNoZi0+cm5sZWZ0OworCQlpZiAobmNvcHkgPiBic2l6ZSkKKwkJCW5jb3B5ID0gYnNpemU7CisJCW1lbWNweShidWYsIChjaGFyICopIHNoZi0+cnAsIG5jb3B5KTsKKwkJc2hmLT5ycCArPSBuY29weTsKKwkJc2hmLT5ybmxlZnQgLT0gbmNvcHk7CisJCWJ1ZiArPSBuY29weTsKKwkJYnNpemUgLT0gbmNvcHk7CisJfSB3aGlsZSAoIWVuZCAmJiBic2l6ZSk7CisJKmJ1ZiA9ICdcMCc7CisJcmV0dXJuIChidWYpOworfQorCisvKiBSZXR1cm5zIHRoZSBjaGFyIHJlYWQuIFJldHVybnMgRU9GIGZvciBlcnJvciBhbmQgZW5kIG9mIGZpbGUuICovCitpbnQKK3NoZl9nZXRjaGFyKHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpZiAoIShzaGYtPmZsYWdzICYgU0hGX1JEKSkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfZ2V0Y2hhcjogZmxhZ3MgJXgiLCBzaGYtPmZsYWdzKTsKKworCWlmIChzaGYtPnJubGVmdCA9PSAwICYmIChzaGZfZmlsbGJ1ZihzaGYpID09IEVPRiB8fCBzaGYtPnJubGVmdCA9PSAwKSkKKwkJcmV0dXJuIChFT0YpOworCS0tc2hmLT5ybmxlZnQ7CisJcmV0dXJuICgqc2hmLT5ycCsrKTsKK30KKworLyogUHV0IGEgY2hhcmFjdGVyIGJhY2sgaW4gdGhlIGlucHV0IHN0cmVhbS4gUmV0dXJucyB0aGUgY2hhcmFjdGVyIGlmCisgKiBzdWNjZXNzZnVsLCBFT0YgaWYgdGhlcmUgaXMgbm8gcm9vbS4KKyAqLworaW50CitzaGZfdW5nZXRjKGludCBjLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9SRCkpCisJCWludGVybmFsX2Vycm9yZigic2hmX3VuZ2V0YzogZmxhZ3MgJXgiLCBzaGYtPmZsYWdzKTsKKworCWlmICgoc2hmLT5mbGFncyAmIFNIRl9FUlJPUikgfHwgYyA9PSBFT0YgfHwKKwkgICAgKHNoZi0+cnAgPT0gc2hmLT5idWYgJiYgc2hmLT5ybmxlZnQpKQorCQlyZXR1cm4gKEVPRik7CisKKwlpZiAoKHNoZi0+ZmxhZ3MgJiBTSEZfV1JJVElORykgJiYgc2hmX2VtcHR5YnVmKHNoZiwgRUJfUkVBRFNXKSA9PSBFT0YpCisJCXJldHVybiAoRU9GKTsKKworCWlmIChzaGYtPnJwID09IHNoZi0+YnVmKQorCQlzaGYtPnJwID0gc2hmLT5idWYgKyBzaGYtPnJic2l6ZTsKKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpIHsKKwkJLyogQ2FuIHVuZ2V0IHdoYXQgd2FzIHJlYWQsIGJ1dCBub3Qgc29tZXRoaW5nIGRpZmZlcmVudCAtIHdlCisJCSAqIGRvbid0IHdhbnQgdG8gbW9kaWZ5IGEgc3RyaW5nLgorCQkgKi8KKwkJaWYgKHNoZi0+cnBbLTFdICE9IGMpCisJCQlyZXR1cm4gKEVPRik7CisJCXNoZi0+ZmxhZ3MgJj0gflNIRl9FT0Y7CisJCXNoZi0+cnAtLTsKKwkJc2hmLT5ybmxlZnQrKzsKKwkJcmV0dXJuIChjKTsKKwl9CisJc2hmLT5mbGFncyAmPSB+U0hGX0VPRjsKKwkqLS0oc2hmLT5ycCkgPSBjOworCXNoZi0+cm5sZWZ0Kys7CisJcmV0dXJuIChjKTsKK30KKworLyogV3JpdGUgYSBjaGFyYWN0ZXIuIFJldHVybnMgdGhlIGNoYXJhY3RlciBpZiBzdWNjZXNzZnVsLCBFT0YgaWYKKyAqIHRoZSBjaGFyIGNvdWxkIG5vdCBiZSB3cml0dGVuLgorICovCitpbnQKK3NoZl9wdXRjaGFyKGludCBjLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9XUikpCisJCWludGVybmFsX2Vycm9yZigic2hmX3B1dGNoYXI6IGZsYWdzICV4Iiwgc2hmLT5mbGFncyk7CisKKwlpZiAoYyA9PSBFT0YpCisJCXJldHVybiAoRU9GKTsKKworCWlmIChzaGYtPmZsYWdzICYgU0hGX1VOQlVGKSB7CisJCXVuc2lnbmVkIGNoYXIgY2MgPSAodW5zaWduZWQgY2hhciljOworCQlpbnQgbjsKKworCQlpZiAoc2hmLT5mZCA8IDApCisJCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9wdXRjaGFyOiBubyBmZCIpOworCQlpZiAoc2hmLT5mbGFncyAmIFNIRl9FUlJPUikgeworCQkJZXJybm8gPSBzaGYtPmVycm5vXzsKKwkJCXJldHVybiAoRU9GKTsKKwkJfQorCQl3aGlsZSAoKG4gPSB3cml0ZShzaGYtPmZkLCAmY2MsIDEpKSAhPSAxKQorCQkJaWYgKG4gPCAwKSB7CisJCQkJaWYgKGVycm5vID09IEVJTlRSICYmCisJCQkJICAgICEoc2hmLT5mbGFncyAmIFNIRl9JTlRFUlJVUFQpKQorCQkJCQljb250aW51ZTsKKwkJCQlzaGYtPmZsYWdzIHw9IFNIRl9FUlJPUjsKKwkJCQlzaGYtPmVycm5vXyA9IGVycm5vOworCQkJCXJldHVybiAoRU9GKTsKKwkJCX0KKwl9IGVsc2UgeworCQkvKiBGbHVzaCBkZWFscyB3aXRoIHN0cmluZ3MgYW5kIHN0aWNreSBlcnJvcnMgKi8KKwkJaWYgKHNoZi0+d25sZWZ0ID09IDAgJiYgc2hmX2VtcHR5YnVmKHNoZiwgRUJfR1JPVykgPT0gRU9GKQorCQkJcmV0dXJuIChFT0YpOworCQlzaGYtPndubGVmdC0tOworCQkqc2hmLT53cCsrID0gYzsKKwl9CisKKwlyZXR1cm4gKGMpOworfQorCisvKiBXcml0ZSBhIHN0cmluZy4gUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaWYgc3VjY2Vzc2Z1bCwgRU9GIGlmCisgKiB0aGUgc3RyaW5nIGNvdWxkIG5vdCBiZSB3cml0dGVuLgorICovCitpbnQKK3NoZl9wdXRzKGNvbnN0IGNoYXIgKnMsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpZiAoIXMpCisJCXJldHVybiAoRU9GKTsKKworCXJldHVybiAoc2hmX3dyaXRlKHMsIHN0cmxlbihzKSwgc2hmKSk7Cit9CisKKy8qIFdyaXRlIGEgYnVmZmVyLiBSZXR1cm5zIG5ieXRlcyBpZiBzdWNjZXNzZnVsLCBFT0YgaWYgdGhlcmUgaXMgYW4gZXJyb3IuICovCitpbnQKK3NoZl93cml0ZShjb25zdCBjaGFyICpidWYsIGludCBuYnl0ZXMsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpbnQgbiwgbmNvcHksIG9yaWdfbmJ5dGVzID0gbmJ5dGVzOworCisJaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9XUikpCisJCWludGVybmFsX2Vycm9yZigic2hmX3dyaXRlOiBmbGFncyAleCIsIHNoZi0+ZmxhZ3MpOworCisJaWYgKG5ieXRlcyA8IDApCisJCWludGVybmFsX2Vycm9yZigic2hmX3dyaXRlOiBuYnl0ZXMgJWQiLCBuYnl0ZXMpOworCisJLyogRG9uJ3QgYnVmZmVyIGlmIGJ1ZmZlciBpcyBlbXB0eSBhbmQgd2UncmUgd3JpdHRpbmcgYSBsYXJnZSBhbW91bnQuICovCisJaWYgKChuY29weSA9IHNoZi0+d25sZWZ0KSAmJgorCSAgICAoc2hmLT53cCAhPSBzaGYtPmJ1ZiB8fCBuYnl0ZXMgPCBzaGYtPndubGVmdCkpIHsKKwkJaWYgKG5jb3B5ID4gbmJ5dGVzKQorCQkJbmNvcHkgPSBuYnl0ZXM7CisJCW1lbWNweShzaGYtPndwLCBidWYsIG5jb3B5KTsKKwkJbmJ5dGVzIC09IG5jb3B5OworCQlidWYgKz0gbmNvcHk7CisJCXNoZi0+d3AgKz0gbmNvcHk7CisJCXNoZi0+d25sZWZ0IC09IG5jb3B5OworCX0KKwlpZiAobmJ5dGVzID4gMCkgeworCQlpZiAoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpIHsKKwkJCS8qIHJlc2l6ZSBidWZmZXIgdW50aWwgdGhlcmUncyBlbm91Z2ggc3BhY2UgbGVmdCAqLworCQkJd2hpbGUgKG5ieXRlcyA+IHNoZi0+d25sZWZ0KQorCQkJCWlmIChzaGZfZW1wdHlidWYoc2hmLCBFQl9HUk9XKSA9PSBFT0YpCisJCQkJCXJldHVybiAoRU9GKTsKKwkJCS8qIHRoZW4gd3JpdGUgZXZlcnl0aGluZyBpbnRvIHRoZSBidWZmZXIgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIGZsdXNoIGRlYWxzIHdpdGggc3RpY2t5IGVycm9ycyAqLworCQkJaWYgKHNoZl9lbXB0eWJ1ZihzaGYsIEVCX0dST1cpID09IEVPRikKKwkJCQlyZXR1cm4gKEVPRik7CisJCQkvKiB3cml0ZSBjaHVua3MgbGFyZ2VyIHRoYW4gd2luZG93IHNpemUgZGlyZWN0bHkgKi8KKwkJCWlmIChuYnl0ZXMgPiBzaGYtPndic2l6ZSkgeworCQkJCW5jb3B5ID0gbmJ5dGVzOworCQkJCWlmIChzaGYtPndic2l6ZSkKKwkJCQkJbmNvcHkgLT0gbmJ5dGVzICUgc2hmLT53YnNpemU7CisJCQkJbmJ5dGVzIC09IG5jb3B5OworCQkJCXdoaWxlIChuY29weSA+IDApIHsKKwkJCQkJbiA9IHdyaXRlKHNoZi0+ZmQsIGJ1ZiwgbmNvcHkpOworCQkJCQlpZiAobiA8IDApIHsKKwkJCQkJCWlmIChlcnJubyA9PSBFSU5UUiAmJgorCQkJCQkJICAgICEoc2hmLT5mbGFncyAmIFNIRl9JTlRFUlJVUFQpKQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJc2hmLT5mbGFncyB8PSBTSEZfRVJST1I7CisJCQkJCQlzaGYtPmVycm5vXyA9IGVycm5vOworCQkJCQkJc2hmLT53bmxlZnQgPSAwOworCQkJCQkJLyoKKwkJCQkJCSAqIE5vdGU6IGZ3cml0ZSgzKSByZXR1cm5zIDAKKwkJCQkJCSAqIGZvciBlcnJvcnMgLSB0aGlzIGRvZXNuJ3QKKwkJCQkJCSAqLworCQkJCQkJcmV0dXJuIChFT0YpOworCQkJCQl9CisJCQkJCWJ1ZiArPSBuOworCQkJCQluY29weSAtPSBuOworCQkJCX0KKwkJCX0KKwkJCS8qIC4uLiBhbmQgYnVmZmVyIHRoZSByZXN0ICovCisJCX0KKwkJaWYgKG5ieXRlcyA+IDApIHsKKwkJCS8qIHdyaXRlIHJlbWFpbmluZyBieXRlcyB0byBidWZmZXIgKi8KKwkJCW1lbWNweShzaGYtPndwLCBidWYsIG5ieXRlcyk7CisJCQlzaGYtPndwICs9IG5ieXRlczsKKwkJCXNoZi0+d25sZWZ0IC09IG5ieXRlczsKKwkJfQorCX0KKworCXJldHVybiAob3JpZ19uYnl0ZXMpOworfQorCitpbnQKK3NoZl9mcHJpbnRmKHN0cnVjdCBzaGYgKnNoZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBuOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwluID0gc2hmX3ZmcHJpbnRmKHNoZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm4gKG4pOworfQorCitpbnQKK3NoZl9zbnByaW50ZihjaGFyICpidWYsIGludCBic2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJc3RydWN0IHNoZiBzaGY7CisJdmFfbGlzdCBhcmdzOworCWludCBuOworCisJaWYgKCFidWYgfHwgYnNpemUgPD0gMCkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfc25wcmludGY6IGJ1ZiAlcCwgYnNpemUgJWQiLCBidWYsIGJzaXplKTsKKworCXNoZl9zb3BlbihidWYsIGJzaXplLCBTSEZfV1IsICZzaGYpOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbiA9IHNoZl92ZnByaW50Zigmc2hmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlzaGZfc2Nsb3NlKCZzaGYpOyAvKiBudWxsIHRlcm1pbmF0ZXMgKi8KKwlyZXR1cm4gKG4pOworfQorCitjaGFyICoKK3NoZl9zbXByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlzdHJ1Y3Qgc2hmIHNoZjsKKwl2YV9saXN0IGFyZ3M7CisKKwlzaGZfc29wZW4oTlVMTCwgMCwgU0hGX1dSfFNIRl9EWU5BTUlDLCAmc2hmKTsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXNoZl92ZnByaW50Zigmc2hmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlyZXR1cm4gKHNoZl9zY2xvc2UoJnNoZikpOyAvKiBudWxsIHRlcm1pbmF0ZXMgKi8KK30KKworI3VuZGVmIEZQCQkJLyogaWYgeW91IHdhbnQgZmxvYXRpbmcgcG9pbnQgc3R1ZmYgKi8KKworI2lmbmRlZiBETUFYRVhQCisjIGRlZmluZSBETUFYRVhQCTEyOAkvKiBzaG91bGQgYmUgYmlnIGVub3VnaCAqLworI2VuZGlmCisKKyNkZWZpbmUgQlVGX1NJWkUJMTI4CisvKiBtdXN0IGJlID4gTUFYKERNQVhFWFAsIGxvZzEwKHBvdygyLCBEU0lHTklGKSkpICsgY2VpbChsb2cxMChETUFYRVhQKSkgKyA4CisgKiAoSSB0aGluayk7IHNpbmNlIGl0J3MgaGFyZCB0byBleHByZXNzIGFzIGEgY29uc3RhbnQsIGp1c3QgdXNlIGEgbGFyZ2UgYnVmZmVyCisgKi8KKyNkZWZpbmUgRlBCVUZfU0laRQkoRE1BWEVYUCsxNikKKworI2RlZmluZQlGTF9IQVNICQkweDAwMQkvKiAnIycgc2VlbiAqLworI2RlZmluZSBGTF9QTFVTCQkweDAwMgkvKiAnKycgc2VlbiAqLworI2RlZmluZSBGTF9SSUdIVAkweDAwNAkvKiAnLScgc2VlbiAqLworI2RlZmluZSBGTF9CTEFOSwkweDAwOAkvKiAnICcgc2VlbiAqLworI2RlZmluZSBGTF9TSE9SVAkweDAxMAkvKiAnaCcgc2VlbiAqLworI2RlZmluZSBGTF9MT05HCQkweDAyMAkvKiAnbCcgc2VlbiAqLworI2RlZmluZSBGTF9aRVJPCQkweDA0MAkvKiAnMCcgc2VlbiAqLworI2RlZmluZSBGTF9ET1QJCTB4MDgwCS8qICcuJyBzZWVuICovCisjZGVmaW5lIEZMX1VQUEVSCTB4MTAwCS8qIGZvcm1hdCBjaGFyYWN0ZXIgd2FzIHVwcGVyY2FzZSAqLworI2RlZmluZSBGTF9OVU1CRVIJMHgyMDAJLyogYSBudW1iZXIgd2FzIGZvcm1hdGVkICVbZG91eGVmZ10gKi8KKworCitpbnQKK3NoZl92ZnByaW50ZihzdHJ1Y3Qgc2hmICpzaGYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQoreworCWNvbnN0IGNoYXIgKnM7CisJY2hhciBjLCAqY3A7CisJaW50IHRtcCA9IDAsIGZpZWxkLCBwcmVjaXNpb24sIGxlbiwgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBsbnVtOworCS8qICUjbyBwcm9kdWNlcyB0aGUgbG9uZ2VzdCBvdXRwdXQgKi8KKwljaGFyIG51bWJ1ZlsoOCAqIHNpemVvZihsb25nKSArIDIpIC8gMyArIDFdOworCS8qIHRoaXMgc3R1ZmYgZm9yIGRlYWxpbmcgd2l0aCB0aGUgYnVmZmVyICovCisJaW50IG53cml0dGVuID0gMDsKKworCWlmICghZm10KQorCQlyZXR1cm4gKDApOworCisJd2hpbGUgKChjID0gKmZtdCsrKSkgeworCQlpZiAoYyAhPSAnJScpIHsKKwkJCXNoZl9wdXRjKGMsIHNoZik7CisJCQlud3JpdHRlbisrOworCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogVGhpcyB3aWxsIGFjY2VwdCBmbGFncy9maWVsZHMgaW4gYW55IG9yZGVyIC0gbm90CisJCSAqIGp1c3QgdGhlIG9yZGVyIHNwZWNpZmllZCBpbiBwcmludGYoMyksIGJ1dCB0aGlzIGlzCisJCSAqIHRoZSB3YXkgX2RvcHJudCgpIHNlZW1zIHRvIHdvcmsgKG9uIGJzZCBhbmQgc3lzVikuCisJCSAqIFRoZSBvbmx5IHJlc3RyaWN0aW9uIGlzIHRoYXQgdGhlIGZvcm1hdCBjaGFyYWN0ZXIgbXVzdAorCQkgKiBjb21lIGxhc3QgOi0pLgorCQkgKi8KKwkJZmxhZ3MgPSBmaWVsZCA9IHByZWNpc2lvbiA9IDA7CisJCWZvciAoIDsgKGMgPSAqZm10KyspIDsgKSB7CisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJyMnOgorCQkJCWZsYWdzIHw9IEZMX0hBU0g7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJysnOgorCQkJCWZsYWdzIHw9IEZMX1BMVVM7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJy0nOgorCQkJCWZsYWdzIHw9IEZMX1JJR0hUOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlICcgJzoKKwkJCQlmbGFncyB8PSBGTF9CTEFOSzsKKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnMCc6CisJCQkJaWYgKCEoZmxhZ3MgJiBGTF9ET1QpKQorCQkJCQlmbGFncyB8PSBGTF9aRVJPOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlICcuJzoKKwkJCQlmbGFncyB8PSBGTF9ET1Q7CisJCQkJcHJlY2lzaW9uID0gMDsKKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnKic6CisJCQkJdG1wID0gdmFfYXJnKGFyZ3MsIGludCk7CisJCQkJaWYgKGZsYWdzICYgRkxfRE9UKQorCQkJCQlwcmVjaXNpb24gPSB0bXA7CisJCQkJZWxzZSBpZiAoKGZpZWxkID0gdG1wKSA8IDApIHsKKwkJCQkJZmllbGQgPSAtZmllbGQ7CisJCQkJCWZsYWdzIHw9IEZMX1JJR0hUOworCQkJCX0KKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnbCc6CisJCQkJZmxhZ3MgfD0gRkxfTE9ORzsKKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnaCc6CisJCQkJZmxhZ3MgfD0gRkxfU0hPUlQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoa3NoX2lzZGlnaXQoYykpIHsKKwkJCQl0bXAgPSBjIC0gJzAnOworCQkJCXdoaWxlIChjID0gKmZtdCsrLCBrc2hfaXNkaWdpdChjKSkKKwkJCQkJdG1wID0gdG1wICogMTAgKyBjIC0gJzAnOworCQkJCS0tZm10OworCQkJCWlmICh0bXAgPCAwKQkJLyogb3ZlcmZsb3c/ICovCisJCQkJCXRtcCA9IDA7CisJCQkJaWYgKGZsYWdzICYgRkxfRE9UKQorCQkJCQlwcmVjaXNpb24gPSB0bXA7CisJCQkJZWxzZQorCQkJCQlmaWVsZCA9IHRtcDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHByZWNpc2lvbiA8IDApCisJCQlwcmVjaXNpb24gPSAwOworCisJCWlmICghYykJCS8qIG5hc3R5IGZvcm1hdCAqLworCQkJYnJlYWs7CisKKwkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisJCQlmbGFncyB8PSBGTF9VUFBFUjsKKwkJCWMgPSBrc2hfdG9sb3dlcihjKTsKKwkJfQorCisJCXN3aXRjaCAoYykgeworCQljYXNlICdwJzogLyogcG9pbnRlciAqLworCQkJZmxhZ3MgJj0gfihGTF9MT05HIHwgRkxfU0hPUlQpOworCQkJZmxhZ3MgfD0gKHNpemVvZihjaGFyICopID4gc2l6ZW9mKGludCkpID8KKwkJCSAgICAvKiBob3BlIGl0IGZpdHMuLiAqLyBGTF9MT05HIDogMDsKKwkJCS8qIGFhYWhoaC4uLiAqLworCQljYXNlICdkJzoKKwkJY2FzZSAnaSc6CisJCWNhc2UgJ28nOgorCQljYXNlICd1JzoKKwkJY2FzZSAneCc6CisJCQlmbGFncyB8PSBGTF9OVU1CRVI7CisJCQljcCA9IG51bWJ1ZiArIHNpemVvZihudW1idWYpOworCQkJLyotCisJCQkgKiBYWFggYW55IGJldHRlciB3YXkgdG8gZG8gdGhpcz8KKwkJCSAqIFhYWCBob3BlZnVsbHkgdGhlIGNvbXBpbGVyIG9wdGltaXNlcyB0aGlzIG91dAorCQkJICoKKwkJCSAqIEZvciBzaG9ydHMsIHdlIHdhbnQgc2lnbiBleHRlbmQgZm9yICVkIGJ1dCBub3QKKwkJCSAqIGZvciAlW294dV0gLSBvbiAxNiBiaXQgbWFjaGluZXMgaXQgZG9lc24ndCBtYXR0ZXIuCisJCQkgKiBBc3N1bWVzIEMgY29tcGlsZXIgaGFzIGNvbnZlcnRlZCBzaG9ydHMgdG8gaW50cworCQkJICogYmVmb3JlIHB1c2hpbmcgdGhlbS4gWFhYIG9wdGltaXNlIHRoaXMgLXRnCisJCQkgKi8KKwkJCWlmIChmbGFncyAmIEZMX0xPTkcpCisJCQkJbG51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKKwkJCWVsc2UgaWYgKChzaXplb2YoaW50KSA8IHNpemVvZihsb25nKSkgJiYgKGMgPT0gJ2QnKSkKKwkJCQlsbnVtID0gKGxvbmcpdmFfYXJnKGFyZ3MsIGludCk7CisJCQllbHNlCisJCQkJbG51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQpOworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICdkJzoKKwkJCWNhc2UgJ2knOgorCQkJCWlmICgwID4gKGxvbmcpbG51bSkgeworCQkJCQlsbnVtID0gLShsb25nKWxudW07CisJCQkJCXRtcCA9IDE7CisJCQkJfSBlbHNlCisJCQkJCXRtcCA9IDA7CisJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCWNhc2UgJ3UnOgorCQkJCWRvIHsKKwkJCQkJKi0tY3AgPSBsbnVtICUgMTAgKyAnMCc7CisJCQkJCWxudW0gLz0gMTA7CisJCQkJfSB3aGlsZSAobG51bSk7CisKKwkJCQlpZiAoYyAhPSAndScpIHsKKwkJCQkJaWYgKHRtcCkKKwkJCQkJCSotLWNwID0gJy0nOworCQkJCQllbHNlIGlmIChmbGFncyAmIEZMX1BMVVMpCisJCQkJCQkqLS1jcCA9ICcrJzsKKwkJCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTF9CTEFOSykKKwkJCQkJCSotLWNwID0gJyAnOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSAnbyc6CisJCQkJZG8geworCQkJCQkqLS1jcCA9IChsbnVtICYgMHg3KSArICcwJzsKKwkJCQkJbG51bSA+Pj0gMzsKKwkJCQl9IHdoaWxlIChsbnVtKTsKKworCQkJCWlmICgoZmxhZ3MgJiBGTF9IQVNIKSAmJiAqY3AgIT0gJzAnKQorCQkJCQkqLS1jcCA9ICcwJzsKKwkJCQlicmVhazsKKworCQkJY2FzZSAncCc6CisJCQljYXNlICd4JzogeworCQkJCWNvbnN0IGNoYXIgKmRpZ2l0cyA9IChmbGFncyAmIEZMX1VQUEVSKSA/CisJCQkJICAgIGRpZ2l0c191YyA6IGRpZ2l0c19sYzsKKwkJCQlkbyB7CisJCQkJCSotLWNwID0gZGlnaXRzW2xudW0gJiAweGZdOworCQkJCQlsbnVtID4+PSA0OworCQkJCX0gd2hpbGUgKGxudW0pOworCisJCQkJaWYgKGZsYWdzICYgRkxfSEFTSCkgeworCQkJCQkqLS1jcCA9IChmbGFncyAmIEZMX1VQUEVSKSA/ICdYJyA6ICd4JzsKKwkJCQkJKi0tY3AgPSAnMCc7CisJCQkJfQorCQkJfQorCQkJfQorCQkJbGVuID0gbnVtYnVmICsgc2l6ZW9mKG51bWJ1ZikgLSAocyA9IGNwKTsKKwkJCWlmIChmbGFncyAmIEZMX0RPVCkgeworCQkJCWlmIChwcmVjaXNpb24gPiBsZW4pIHsKKwkJCQkJZmllbGQgPSBwcmVjaXNpb247CisJCQkJCWZsYWdzIHw9IEZMX1pFUk87CisJCQkJfSBlbHNlCisJCQkJCXByZWNpc2lvbiA9IGxlbjsgLyogbm8gbG9zcyAqLworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAncyc6CisJCQlpZiAoIShzID0gdmFfYXJnKGFyZ3MsIGNvbnN0IGNoYXIgKikpKQorCQkJCXMgPSAiKG51bGwpIjsKKwkJCWxlbiA9IHV0Zl9tYnN3aWR0aChzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2MnOgorCQkJZmxhZ3MgJj0gfkZMX0RPVDsKKwkJCW51bWJ1ZlswXSA9IChjaGFyKSh2YV9hcmcoYXJncywgaW50KSk7CisJCQlzID0gbnVtYnVmOworCQkJbGVuID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgJyUnOgorCQlkZWZhdWx0OgorCQkJbnVtYnVmWzBdID0gYzsKKwkJCXMgPSBudW1idWY7CisJCQlsZW4gPSAxOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBBdCB0aGlzIHBvaW50IHMgc2hvdWxkIHBvaW50IHRvIGEgc3RyaW5nIHRoYXQgaXMgdG8gYmUKKwkJICogZm9ybWF0dGVkLCBhbmQgbGVuIHNob3VsZCBiZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCisJCSAqLworCQlpZiAoIShmbGFncyAmIEZMX0RPVCkgfHwgbGVuIDwgcHJlY2lzaW9uKQorCQkJcHJlY2lzaW9uID0gbGVuOworCQlpZiAoZmllbGQgPiBwcmVjaXNpb24pIHsKKwkJCWZpZWxkIC09IHByZWNpc2lvbjsKKwkJCWlmICghKGZsYWdzICYgRkxfUklHSFQpKSB7CisJCQkJZmllbGQgPSAtZmllbGQ7CisJCQkJLyogc2tpcCBwYXN0IHNpZ24gb3IgMHggd2hlbiBwYWRkaW5nIHdpdGggMCAqLworCQkJCWlmICgoZmxhZ3MgJiBGTF9aRVJPKSAmJiAoZmxhZ3MgJiBGTF9OVU1CRVIpKSB7CisJCQkJCWlmICgqcyA9PSAnKycgfHwgKnMgPT0gJy0nIHx8CisJCQkJCSAgICAqcyA9PSAnICcpIHsKKwkJCQkJCXNoZl9wdXRjKCpzLCBzaGYpOworCQkJCQkJcysrOworCQkJCQkJcHJlY2lzaW9uLS07CisJCQkJCQlud3JpdHRlbisrOworCQkJCQl9IGVsc2UgaWYgKCpzID09ICcwJykgeworCQkJCQkJc2hmX3B1dGMoKnMsIHNoZik7CisJCQkJCQlzKys7CisJCQkJCQlud3JpdHRlbisrOworCQkJCQkJaWYgKC0tcHJlY2lzaW9uID4gMCAmJgorCQkJCQkJICAgICgqcyB8IDB4MjApID09ICd4JykgeworCQkJCQkJCXNoZl9wdXRjKCpzLCBzaGYpOworCQkJCQkJCXMrKzsKKwkJCQkJCQlwcmVjaXNpb24tLTsKKwkJCQkJCQlud3JpdHRlbisrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWMgPSAnMCc7CisJCQkJfSBlbHNlCisJCQkJCWMgPSBmbGFncyAmIEZMX1pFUk8gPyAnMCcgOiAnICc7CisJCQkJaWYgKGZpZWxkIDwgMCkgeworCQkJCQlud3JpdHRlbiArPSAtZmllbGQ7CisJCQkJCWZvciAoIDsgZmllbGQgPCAwIDsgZmllbGQrKykKKwkJCQkJCXNoZl9wdXRjKGMsIHNoZik7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJYyA9ICcgJzsKKwkJfSBlbHNlCisJCQlmaWVsZCA9IDA7CisKKwkJaWYgKHByZWNpc2lvbiA+IDApIHsKKwkJCWNvbnN0IGNoYXIgKnE7CisKKwkJCW53cml0dGVuICs9IHByZWNpc2lvbjsKKwkJCXEgPSB1dGZfc2tpcGNvbHMocywgcHJlY2lzaW9uKTsKKwkJCWRvIHsKKwkJCQlzaGZfcHV0Yygqcywgc2hmKTsKKwkJCX0gd2hpbGUgKCsrcyA8IHEpOworCQl9CisJCWlmIChmaWVsZCA+IDApIHsKKwkJCW53cml0dGVuICs9IGZpZWxkOworCQkJZm9yICggOyBmaWVsZCA+IDAgOyAtLWZpZWxkKQorCQkJCXNoZl9wdXRjKGMsIHNoZik7CisJCX0KKwl9CisKKwlyZXR1cm4gKHNoZl9lcnJvcihzaGYpID8gRU9GIDogbndyaXR0ZW4pOworfQorCisjaWZkZWYgTUtTSF9TTUFMTAoraW50CitzaGZfZ2V0YyhzdHJ1Y3Qgc2hmICpzaGYpCit7CisJcmV0dXJuICgoc2hmKS0+cm5sZWZ0ID4gMCA/IChzaGYpLT5ybmxlZnQtLSwgKihzaGYpLT5ycCsrIDoKKwkgICAgc2hmX2dldGNoYXIoc2hmKSk7Cit9CisKK2ludAorc2hmX3B1dGMoaW50IGMsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwlyZXR1cm4gKChzaGYpLT53bmxlZnQgPT0gMCA/IHNoZl9wdXRjaGFyKChjKSwgKHNoZikpIDoKKwkgICAgKChzaGYpLT53bmxlZnQtLSwgKihzaGYpLT53cCsrID0gKGMpKSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21rc2gvc3JjL3N5bi5jIGIvbWtzaC9zcmMvc3luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiMjg2NwotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL3N5bi5jCkBAIC0wLDAgKzEsMTAwNCBAQAorLyoJJE9wZW5CU0Q6IHN5bi5jLHYgMS4yOCAyMDA4LzA3LzIzIDE2OjM0OjM4IGphcmVkeSBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL3N5bi5jLHYgMS40OSAyMDEwLzA3LzE3IDIyOjA5OjM5IHRnIEV4cCAkIik7CisKK3N0cnVjdCBuZXN0aW5nX3N0YXRlIHsKKwlpbnQgc3RhcnRfdG9rZW47CS8qIHRva2VuIHRoYW4gYmVnYW4gbmVzdGluZyAoZWcsIEZPUikgKi8KKwlpbnQgc3RhcnRfbGluZTsJCS8qIGxpbmUgbmVzdGluZyBiZWdhbiBvbiAqLworfTsKKworc3RhdGljIHZvaWQgeXlwYXJzZSh2b2lkKTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKnBpcGVsaW5lKGludCk7CitzdGF0aWMgc3RydWN0IG9wICphbmRvcih2b2lkKTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKmNfbGlzdChpbnQpOworc3RhdGljIHN0cnVjdCBpb3dvcmQgKnN5bmlvKGludCk7CitzdGF0aWMgc3RydWN0IG9wICpuZXN0ZWQoaW50LCBpbnQsIGludCk7CitzdGF0aWMgc3RydWN0IG9wICpnZXRfY29tbWFuZChpbnQpOworc3RhdGljIHN0cnVjdCBvcCAqZG9ncm91cCh2b2lkKTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKnRoZW5wYXJ0KHZvaWQpOworc3RhdGljIHN0cnVjdCBvcCAqZWxzZXBhcnQodm9pZCk7CitzdGF0aWMgc3RydWN0IG9wICpjYXNlbGlzdCh2b2lkKTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKmNhc2VwYXJ0KGludCk7CitzdGF0aWMgc3RydWN0IG9wICpmdW5jdGlvbl9ib2R5KGNoYXIgKiwgYm9vbCk7CitzdGF0aWMgY2hhciAqKndvcmRsaXN0KHZvaWQpOworc3RhdGljIHN0cnVjdCBvcCAqYmxvY2soaW50LCBzdHJ1Y3Qgb3AgKiwgc3RydWN0IG9wICosIGNoYXIgKiopOworc3RhdGljIHN0cnVjdCBvcCAqbmV3dHAoaW50KTsKK3N0YXRpYyB2b2lkIHN5bnRheGVycihjb25zdCBjaGFyICopIE1LU0hfQV9OT1JFVFVSTjsKK3N0YXRpYyB2b2lkIG5lc3RpbmdfcHVzaChzdHJ1Y3QgbmVzdGluZ19zdGF0ZSAqLCBpbnQpOworc3RhdGljIHZvaWQgbmVzdGluZ19wb3Aoc3RydWN0IG5lc3Rpbmdfc3RhdGUgKik7CitzdGF0aWMgaW50IGFzc2lnbl9jb21tYW5kKGNoYXIgKik7CitzdGF0aWMgaW50IGluYWxpYXMoc3RydWN0IHNvdXJjZSAqKTsKK3N0YXRpYyBUZXN0X29wIGRidGVzdHBfaXNhKFRlc3RfZW52ICosIFRlc3RfbWV0YSk7CitzdGF0aWMgY29uc3QgY2hhciAqZGJ0ZXN0cF9nZXRvcG5kKFRlc3RfZW52ICosIFRlc3Rfb3AsIGJvb2wpOworc3RhdGljIGludCBkYnRlc3RwX2V2YWwoVGVzdF9lbnYgKiwgVGVzdF9vcCwgY29uc3QgY2hhciAqLAorICAgIGNvbnN0IGNoYXIgKiwgYm9vbCk7CitzdGF0aWMgdm9pZCBkYnRlc3RwX2Vycm9yKFRlc3RfZW52ICosIGludCwgY29uc3QgY2hhciAqKSBNS1NIX0FfTk9SRVRVUk47CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKm91dHRyZWU7CQkvKiB5eXBhcnNlIG91dHB1dCAqLworc3RhdGljIHN0cnVjdCBuZXN0aW5nX3N0YXRlIG5lc3Rpbmc7CS8qIFxuIGNoYW5nZWQgdG8gOyAqLworCitzdGF0aWMgaW50IHJlamVjdDsJCS8qIHRva2VuKGNmKSBnZXRzIHN5bWJvbCBhZ2FpbiAqLworc3RhdGljIGludCBzeW1ib2w7CQkvKiB5eWxleCB2YWx1ZSAqLworCisjZGVmaW5lIFJFSkVDVAkJKHJlamVjdCA9IDEpCisjZGVmaW5lIEFDQ0VQVAkJKHJlamVjdCA9IDApCisjZGVmaW5lIHRva2VuKGNmKQkoKHJlamVjdCkgPyAoQUNDRVBULCBzeW1ib2wpIDogKHN5bWJvbCA9IHl5bGV4KGNmKSkpCisjZGVmaW5lIHRwZWVrKGNmKQkoKHJlamVjdCkgPyAoc3ltYm9sKSA6IChSRUpFQ1QsIHN5bWJvbCA9IHl5bGV4KGNmKSkpCisjZGVmaW5lIG11c3RoYXZlKGMsY2YpCWRvIHsgaWYgKHRva2VuKGNmKSAhPSAoYykpIHN5bnRheGVycihOVUxMKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQKK3l5cGFyc2Uodm9pZCkKK3sKKwlpbnQgYzsKKworCUFDQ0VQVDsKKworCW91dHRyZWUgPSBjX2xpc3Qoc291cmNlLT50eXBlID09IFNTVFJJTkcpOworCWMgPSB0cGVlaygwKTsKKwlpZiAoYyA9PSAwICYmICFvdXR0cmVlKQorCQlvdXR0cmVlID0gbmV3dHAoVEVPRik7CisJZWxzZSBpZiAoYyAhPSAnXG4nICYmIGMgIT0gMCkKKwkJc3ludGF4ZXJyKE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK3BpcGVsaW5lKGludCBjZikKK3sKKwlzdHJ1Y3Qgb3AgKnQsICpwLCAqdGwgPSBOVUxMOworCisJdCA9IGdldF9jb21tYW5kKGNmKTsKKwlpZiAodCAhPSBOVUxMKSB7CisJCXdoaWxlICh0b2tlbigwKSA9PSAnfCcpIHsKKwkJCWlmICgocCA9IGdldF9jb21tYW5kKENPTlRJTikpID09IE5VTEwpCisJCQkJc3ludGF4ZXJyKE5VTEwpOworCQkJaWYgKHRsID09IE5VTEwpCisJCQkJdCA9IHRsID0gYmxvY2soVFBJUEUsIHQsIHAsIE5PV09SRFMpOworCQkJZWxzZQorCQkJCXRsID0gdGwtPnJpZ2h0ID0gYmxvY2soVFBJUEUsIHRsLT5yaWdodCwgcCwgTk9XT1JEUyk7CisJCX0KKwkJUkVKRUNUOworCX0KKwlyZXR1cm4gKHQpOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK2FuZG9yKHZvaWQpCit7CisJc3RydWN0IG9wICp0LCAqcDsKKwlpbnQgYzsKKworCXQgPSBwaXBlbGluZSgwKTsKKwlpZiAodCAhPSBOVUxMKSB7CisJCXdoaWxlICgoYyA9IHRva2VuKDApKSA9PSBMT0dBTkQgfHwgYyA9PSBMT0dPUikgeworCQkJaWYgKChwID0gcGlwZWxpbmUoQ09OVElOKSkgPT0gTlVMTCkKKwkJCQlzeW50YXhlcnIoTlVMTCk7CisJCQl0ID0gYmxvY2soYyA9PSBMT0dBTkQ/IFRBTkQ6IFRPUiwgdCwgcCwgTk9XT1JEUyk7CisJCX0KKwkJUkVKRUNUOworCX0KKwlyZXR1cm4gKHQpOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK2NfbGlzdChpbnQgbXVsdGkpCit7CisJc3RydWN0IG9wICp0ID0gTlVMTCwgKnAsICp0bCA9IE5VTEw7CisJaW50IGMsIGhhdmVfc2VwOworCisJd2hpbGUgKDEpIHsKKwkJcCA9IGFuZG9yKCk7CisJCS8qIFRva2VuIGhhcyBhbHdheXMgYmVlbiByZWFkL3JlamVjdGVkIGF0IHRoaXMgcG9pbnQsIHNvCisJCSAqIHdlIGRvbid0IHdvcnJ5IGFib3V0IHdoYXQgZmxhZ3MgdG8gcGFzcyB0b2tlbigpCisJCSAqLworCQljID0gdG9rZW4oMCk7CisJCWhhdmVfc2VwID0gMTsKKwkJaWYgKGMgPT0gJ1xuJyAmJiAobXVsdGkgfHwgaW5hbGlhcyhzb3VyY2UpKSkgeworCQkJaWYgKCFwKSAvKiBpZ25vcmUgYmxhbmsgbGluZXMgKi8KKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmICghcCkKKwkJCWJyZWFrOworCQllbHNlIGlmIChjID09ICcmJyB8fCBjID09IENPUFJPQykKKwkJCXAgPSBibG9jayhjID09ICcmJyA/IFRBU1lOQyA6IFRDT1BST0MsCisJCQkgICAgcCwgTk9CTE9DSywgTk9XT1JEUyk7CisJCWVsc2UgaWYgKGMgIT0gJzsnKQorCQkJaGF2ZV9zZXAgPSAwOworCQlpZiAoIXQpCisJCQl0ID0gcDsKKwkJZWxzZSBpZiAoIXRsKQorCQkJdCA9IHRsID0gYmxvY2soVExJU1QsIHQsIHAsIE5PV09SRFMpOworCQllbHNlCisJCQl0bCA9IHRsLT5yaWdodCA9IGJsb2NrKFRMSVNULCB0bC0+cmlnaHQsIHAsIE5PV09SRFMpOworCQlpZiAoIWhhdmVfc2VwKQorCQkJYnJlYWs7CisJfQorCVJFSkVDVDsKKwlyZXR1cm4gKHQpOworfQorCitzdGF0aWMgc3RydWN0IGlvd29yZCAqCitzeW5pbyhpbnQgY2YpCit7CisJc3RydWN0IGlvd29yZCAqaW9wOworCXN0YXRpYyBzdHJ1Y3QgaW93b3JkICpuZXh0aW9wID0gTlVMTDsKKwlib29sIGlzaGVyZTsKKworCWlmIChuZXh0aW9wICE9IE5VTEwpIHsKKwkJaW9wID0gbmV4dGlvcDsKKwkJbmV4dGlvcCA9IE5VTEw7CisJCXJldHVybiAoaW9wKTsKKwl9CisKKwlpZiAodHBlZWsoY2YpICE9IFJFRElSKQorCQlyZXR1cm4gKE5VTEwpOworCUFDQ0VQVDsKKwlpb3AgPSB5eWx2YWwuaW9wOworCWlzaGVyZSA9IChpb3AtPmZsYWcmSU9UWVBFKSA9PSBJT0hFUkU7CisJbXVzdGhhdmUoTFdPUkQsIGlzaGVyZSA/IEhFUkVERUxJTSA6IDApOworCWlmIChpc2hlcmUpIHsKKwkJaW9wLT5kZWxpbSA9IHl5bHZhbC5jcDsKKwkJaWYgKCppZGVudCAhPSAwKSAvKiB1bnF1b3RlZCAqLworCQkJaW9wLT5mbGFnIHw9IElPRVZBTDsKKwkJaWYgKGhlcmVwID4gJmhlcmVzW0hFUkVTIC0gMV0pCisJCQl5eWVycm9yKCJ0b28gbWFueSA8PHNcbiIpOworCQkqaGVyZXArKyA9IGlvcDsKKwl9IGVsc2UKKwkJaW9wLT5uYW1lID0geXlsdmFsLmNwOworCisJaWYgKGlvcC0+ZmxhZyAmIElPQkFTSCkgeworCQljaGFyICpjcDsKKworCQluZXh0aW9wID0gYWxsb2Moc2l6ZW9mKCppb3ApLCBBVEVNUCk7CisJCW5leHRpb3AtPm5hbWUgPSBjcCA9IGFsbG9jKDUsIEFURU1QKTsKKworCQlpZiAoaW9wLT51bml0ID4gOSkgeworCQkJKmNwKysgPSBDSEFSOworCQkJKmNwKysgPSAnMCcgKyAoaW9wLT51bml0IC8gMTApOworCQl9CisJCSpjcCsrID0gQ0hBUjsKKwkJKmNwKysgPSAnMCcgKyAoaW9wLT51bml0ICUgMTApOworCQkqY3AgPSBFT1M7CisKKwkJaW9wLT5mbGFnICY9IH5JT0JBU0g7CisJCW5leHRpb3AtPnVuaXQgPSAyOworCQluZXh0aW9wLT5mbGFnID0gSU9EVVA7CisJCW5leHRpb3AtPmRlbGltID0gTlVMTDsKKwkJbmV4dGlvcC0+aGVyZWRvYyA9IE5VTEw7CisJfQorCXJldHVybiAoaW9wKTsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCituZXN0ZWQoaW50IHR5cGUsIGludCBzbWFyaywgaW50IGVtYXJrKQoreworCXN0cnVjdCBvcCAqdDsKKwlzdHJ1Y3QgbmVzdGluZ19zdGF0ZSBvbGRfbmVzdGluZzsKKworCW5lc3RpbmdfcHVzaCgmb2xkX25lc3RpbmcsIHNtYXJrKTsKKwl0ID0gY19saXN0KHRydWUpOworCW11c3RoYXZlKGVtYXJrLCBLRVlXT1JEfEFMSUFTKTsKKwluZXN0aW5nX3BvcCgmb2xkX25lc3RpbmcpOworCXJldHVybiAoYmxvY2sodHlwZSwgdCwgTk9CTE9DSywgTk9XT1JEUykpOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK2dldF9jb21tYW5kKGludCBjZikKK3sKKwlzdHJ1Y3Qgb3AgKnQ7CisJaW50IGMsIGlvcG4gPSAwLCBzeW5pb2NmOworCXN0cnVjdCBpb3dvcmQgKmlvcCwgKippb3BzOworCVhQdHJWIGFyZ3MsIHZhcnM7CisJc3RydWN0IG5lc3Rpbmdfc3RhdGUgb2xkX25lc3Rpbmc7CisKKwlpb3BzID0gYWxsb2MoKE5VRklMRSArIDEpICogc2l6ZW9mKHN0cnVjdCBpb3dvcmQgKiksIEFURU1QKTsKKwlYUGluaXQoYXJncywgMTYpOworCVhQaW5pdCh2YXJzLCAxNik7CisKKwlzeW5pb2NmID0gS0VZV09SRHxBTElBUzsKKwlzd2l0Y2ggKGMgPSB0b2tlbihjZnxLRVlXT1JEfEFMSUFTfFZBUkFTTikpIHsKKwlkZWZhdWx0OgorCQlSRUpFQ1Q7CisJCWFmcmVlKGlvcHMsIEFURU1QKTsKKwkJWFBmcmVlKGFyZ3MpOworCQlYUGZyZWUodmFycyk7CisJCXJldHVybiAoTlVMTCk7IC8qIGVtcHR5IGxpbmUgKi8KKworCWNhc2UgTFdPUkQ6CisJY2FzZSBSRURJUjoKKwkJUkVKRUNUOworCQlzeW5pb2NmICY9IH4oS0VZV09SRHxBTElBUyk7CisJCXQgPSBuZXd0cChUQ09NKTsKKwkJdC0+bGluZW5vID0gc291cmNlLT5saW5lOworCQl3aGlsZSAoMSkgeworCQkJY2YgPSAodC0+dS5ldmFsZmxhZ3MgPyBBUlJBWVZBUiA6IDApIHwKKwkJCSAgICAoWFBzaXplKGFyZ3MpID09IDAgPyBBTElBU3xWQVJBU04gOiBDTURXT1JEKTsKKwkJCXN3aXRjaCAodHBlZWsoY2YpKSB7CisJCQljYXNlIFJFRElSOgorCQkJCXdoaWxlICgoaW9wID0gc3luaW8oY2YpKSAhPSBOVUxMKSB7CisJCQkJCWlmIChpb3BuID49IE5VRklMRSkKKwkJCQkJCXl5ZXJyb3IoInRvbyBtYW55IHJlZGlyZWN0aW9uc1xuIik7CisJCQkJCWlvcHNbaW9wbisrXSA9IGlvcDsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgTFdPUkQ6CisJCQkJQUNDRVBUOworCQkJCS8qIHRoZSBpb3BuID09IDAgYW5kIFhQc2l6ZSh2YXJzKSA9PSAwIGFyZQorCQkJCSAqIGR1YmlvdXMgYnV0IEFUJlQga3NoIGFjdHMgdGhpcyB3YXkKKwkJCQkgKi8KKwkJCQlpZiAoaW9wbiA9PSAwICYmIFhQc2l6ZSh2YXJzKSA9PSAwICYmCisJCQkJICAgIFhQc2l6ZShhcmdzKSA9PSAwICYmCisJCQkJICAgIGFzc2lnbl9jb21tYW5kKGlkZW50KSkKKwkJCQkJdC0+dS5ldmFsZmxhZ3MgPSBET1ZBQ0hFQ0s7CisJCQkJaWYgKChYUHNpemUoYXJncykgPT0gMCB8fCBGbGFnKEZLRVlXT1JEKSkgJiYKKwkJCQkgICAgaXNfd2R2YXJhc3NpZ24oeXlsdmFsLmNwKSkKKwkJCQkJWFBwdXQodmFycywgeXlsdmFsLmNwKTsKKwkJCQllbHNlCisJCQkJCVhQcHV0KGFyZ3MsIHl5bHZhbC5jcCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJygnOgorCQkJCS8qIENoZWNrIGZvciAiPiBmb28gKGVjaG8gaGkpIiB3aGljaCBBVCZUIGtzaAorCQkJCSAqIGFsbG93cyAobm90IFBPU0lYLCBidXQgbm90IGRpc2FsbG93ZWQpCisJCQkJICovCisJCQkJYWZyZWUodCwgQVRFTVApOworCQkJCWlmIChYUHNpemUoYXJncykgPT0gMCAmJiBYUHNpemUodmFycykgPT0gMCkgeworCQkJCQlBQ0NFUFQ7CisJCQkJCWdvdG8gU3Vic2hlbGw7CisJCQkJfQorI2lmbmRlZiBNS1NIX1NNQUxMCisJCQkJaWYgKChYUHNpemUoYXJncykgPT0gMCB8fCBGbGFnKEZLRVlXT1JEKSkgJiYKKwkJCQkgICAgWFBzaXplKHZhcnMpID09IDEgJiYgaXNfd2R2YXJhc3NpZ24oeXlsdmFsLmNwKSkKKwkJCQkJZ290byBpc193ZGFycmFzc2lnbjsKKyNlbmRpZgorCQkJCS8qIE11c3QgYmUgYSBmdW5jdGlvbiAqLworCQkJCWlmIChpb3BuICE9IDAgfHwgWFBzaXplKGFyZ3MpICE9IDEgfHwKKwkJCQkgICAgWFBzaXplKHZhcnMpICE9IDApCisJCQkJCXN5bnRheGVycihOVUxMKTsKKwkJCQlBQ0NFUFQ7CisJCQkJLyooKi8KKwkJCQltdXN0aGF2ZSgnKScsIDApOworCQkJCXQgPSBmdW5jdGlvbl9ib2R5KFhQcHRydihhcmdzKVswXSwgZmFsc2UpOworCQkJCWdvdG8gTGVhdmU7CisjaWZuZGVmIE1LU0hfU01BTEwKKyBpc193ZGFycmFzc2lnbjoKKwkJCXsKKwkJCQlzdGF0aWMgY29uc3QgY2hhciBzZXRfY21kMFtdID0geworCQkJCQlDSEFSLCAnZScsIENIQVIsICd2JywKKwkJCQkJQ0hBUiwgJ2EnLCBDSEFSLCAnbCcsIEVPUworCQkJCX07CisJCQkJc3RhdGljIGNvbnN0IGNoYXIgc2V0X2NtZDFbXSA9IHsKKwkJCQkJQ0hBUiwgJ3MnLCBDSEFSLCAnZScsCisJCQkJCUNIQVIsICd0JywgQ0hBUiwgJyAnLAorCQkJCQlDSEFSLCAnLScsIENIQVIsICdBJywgRU9TCisJCQkJfTsKKwkJCQlzdGF0aWMgY29uc3QgY2hhciBzZXRfY21kMltdID0geworCQkJCQlDSEFSLCAnLScsIENIQVIsICctJywgRU9TCisJCQkJfTsKKwkJCQljaGFyICp0Y3A7CisJCQkJWFBmcmVlKHZhcnMpOworCQkJCVhQaW5pdCh2YXJzLCAxNik7CisJCQkJLyoKKwkJCQkgKiB3ZSBrbm93IChvciByYXRoZXIgaG9wZSkgdGhhdCB5eWx2YWwuY3AKKwkJCQkgKiBjb250YWlucyBhIHN0cmluZyAidmFybmFtZT0iCisJCQkJICovCisJCQkJdGNwID0gd2Rjb3B5KHl5bHZhbC5jcCwgQVRFTVApOworCQkJCXRjcFt3ZHNjYW4odGNwLCBFT1MpIC0gdGNwIC0gM10gPSBFT1M7CisJCQkJLyogbm93IG1ha2UgYW4gYXJyYXkgYXNzaWdubWVudCBjb21tYW5kICovCisJCQkJdCA9IG5ld3RwKFRDT00pOworCQkJCXQtPmxpbmVubyA9IHNvdXJjZS0+bGluZTsKKwkJCQlBQ0NFUFQ7CisJCQkJWFBwdXQoYXJncywgd2Rjb3B5KHNldF9jbWQwLCBBVEVNUCkpOworCQkJCVhQcHV0KGFyZ3MsIHdkY29weShzZXRfY21kMSwgQVRFTVApKTsKKwkJCQlYUHB1dChhcmdzLCB0Y3ApOworCQkJCVhQcHV0KGFyZ3MsIHdkY29weShzZXRfY21kMiwgQVRFTVApKTsKKwkJCQltdXN0aGF2ZShMV09SRCxMRVRBUlJBWSk7CisJCQkJWFBwdXQoYXJncywgeXlsdmFsLmNwKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCisJCQlkZWZhdWx0OgorCQkJCWdvdG8gTGVhdmU7CisJCQl9CisJCX0KKyBMZWF2ZToKKwkJYnJlYWs7CisKKwljYXNlICcoJzoKKyBTdWJzaGVsbDoKKwkJdCA9IG5lc3RlZChUUEFSRU4sICcoJywgJyknKTsKKwkJYnJlYWs7CisKKwljYXNlICd7JzogLyp9Ki8KKwkJdCA9IG5lc3RlZChUQlJBQ0UsICd7JywgJ30nKTsKKwkJYnJlYWs7CisKKwljYXNlIE1EUEFSRU46IHsKKwkJaW50IGxubzsKKwkJc3RhdGljIGNvbnN0IGNoYXIgbGV0X2NtZFtdID0geworCQkJQ0hBUiwgJ2wnLCBDSEFSLCAnZScsCisJCQlDSEFSLCAndCcsIEVPUworCQl9OworCisJCS8qIExlYXZlIEtFWVdPUkQgaW4gc3luaW9jZiAoYWxsb3cgaWYgKCggMSApKSB0aGVuIC4uLikgKi8KKwkJbG5vID0gc291cmNlLT5saW5lOworCQlBQ0NFUFQ7CisJCXN3aXRjaCAodG9rZW4oTEVURVhQUikpIHsKKwkJY2FzZSBMV09SRDoKKwkJCWJyZWFrOworCQljYXNlICcoJzoJLyogKSAqLworCQkJZ290byBTdWJzaGVsbDsKKwkJZGVmYXVsdDoKKwkJCXN5bnRheGVycihOVUxMKTsKKwkJfQorCQl0ID0gbmV3dHAoVENPTSk7CisJCXQtPmxpbmVubyA9IGxubzsKKwkJWFBwdXQoYXJncywgd2Rjb3B5KGxldF9jbWQsIEFURU1QKSk7CisJCVhQcHV0KGFyZ3MsIHl5bHZhbC5jcCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgREJSQUNLRVQ6IC8qIFtbIC4uIF1dICovCisJCS8qIExlYXZlIEtFWVdPUkQgaW4gc3luaW9jZiAoYWxsb3cgaWYgW1sgLW4gMSBdXSB0aGVuIC4uLikgKi8KKwkJdCA9IG5ld3RwKFREQlJBQ0tFVCk7CisJCUFDQ0VQVDsKKwkJeworCQkJVGVzdF9lbnYgdGU7CisKKwkJCXRlLmZsYWdzID0gVEVGX0RCUkFDS0VUOworCQkJdGUucG9zLmF2ID0gJmFyZ3M7CisJCQl0ZS5pc2EgPSBkYnRlc3RwX2lzYTsKKwkJCXRlLmdldG9wbmQgPSBkYnRlc3RwX2dldG9wbmQ7CisJCQl0ZS5ldmFsID0gZGJ0ZXN0cF9ldmFsOworCQkJdGUuZXJyb3IgPSBkYnRlc3RwX2Vycm9yOworCisJCQl0ZXN0X3BhcnNlKCZ0ZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEZPUjoKKwljYXNlIFNFTEVDVDoKKwkJdCA9IG5ld3RwKChjID09IEZPUikgPyBURk9SIDogVFNFTEVDVCk7CisJCW11c3RoYXZlKExXT1JELCBBUlJBWVZBUik7CisJCWlmICghaXNfd2R2YXJuYW1lKHl5bHZhbC5jcCwgdHJ1ZSkpCisJCQl5eWVycm9yKCIlczogYmFkIGlkZW50aWZpZXJcbiIsCisJCQkgICAgYyA9PSBGT1IgPyAiZm9yIiA6ICJzZWxlY3QiKTsKKwkJc3RyZHVweCh0LT5zdHIsIGlkZW50LCBBVEVNUCk7CisJCW5lc3RpbmdfcHVzaCgmb2xkX25lc3RpbmcsIGMpOworCQl0LT52YXJzID0gd29yZGxpc3QoKTsKKwkJdC0+bGVmdCA9IGRvZ3JvdXAoKTsKKwkJbmVzdGluZ19wb3AoJm9sZF9uZXN0aW5nKTsKKwkJYnJlYWs7CisKKwljYXNlIFdISUxFOgorCWNhc2UgVU5USUw6CisJCW5lc3RpbmdfcHVzaCgmb2xkX25lc3RpbmcsIGMpOworCQl0ID0gbmV3dHAoKGMgPT0gV0hJTEUpID8gVFdISUxFIDogVFVOVElMKTsKKwkJdC0+bGVmdCA9IGNfbGlzdCh0cnVlKTsKKwkJdC0+cmlnaHQgPSBkb2dyb3VwKCk7CisJCW5lc3RpbmdfcG9wKCZvbGRfbmVzdGluZyk7CisJCWJyZWFrOworCisJY2FzZSBDQVNFOgorCQl0ID0gbmV3dHAoVENBU0UpOworCQltdXN0aGF2ZShMV09SRCwgMCk7CisJCXQtPnN0ciA9IHl5bHZhbC5jcDsKKwkJbmVzdGluZ19wdXNoKCZvbGRfbmVzdGluZywgYyk7CisJCXQtPmxlZnQgPSBjYXNlbGlzdCgpOworCQluZXN0aW5nX3BvcCgmb2xkX25lc3RpbmcpOworCQlicmVhazsKKworCWNhc2UgSUY6CisJCW5lc3RpbmdfcHVzaCgmb2xkX25lc3RpbmcsIGMpOworCQl0ID0gbmV3dHAoVElGKTsKKwkJdC0+bGVmdCA9IGNfbGlzdCh0cnVlKTsKKwkJdC0+cmlnaHQgPSB0aGVucGFydCgpOworCQltdXN0aGF2ZShGSSwgS0VZV09SRHxBTElBUyk7CisJCW5lc3RpbmdfcG9wKCZvbGRfbmVzdGluZyk7CisJCWJyZWFrOworCisJY2FzZSBCQU5HOgorCQlzeW5pb2NmICY9IH4oS0VZV09SRHxBTElBUyk7CisJCXQgPSBwaXBlbGluZSgwKTsKKwkJaWYgKHQgPT0gTlVMTCkKKwkJCXN5bnRheGVycihOVUxMKTsKKwkJdCA9IGJsb2NrKFRCQU5HLCBOT0JMT0NLLCB0LCBOT1dPUkRTKTsKKwkJYnJlYWs7CisKKwljYXNlIFRJTUU6CisJCXN5bmlvY2YgJj0gfihLRVlXT1JEfEFMSUFTKTsKKwkJdCA9IHBpcGVsaW5lKDApOworCQlpZiAodCkgeworCQkJdC0+c3RyID0gYWxsb2MoMiwgQVRFTVApOworCQkJdC0+c3RyWzBdID0gJ1wwJzsJLyogVEZfKiBmbGFncyAqLworCQkJdC0+c3RyWzFdID0gJ1wwJzsKKwkJfQorCQl0ID0gYmxvY2soVFRJTUUsIHQsIE5PQkxPQ0ssIE5PV09SRFMpOworCQlicmVhazsKKworCWNhc2UgRlVOQ1RJT046CisJCW11c3RoYXZlKExXT1JELCAwKTsKKwkJdCA9IGZ1bmN0aW9uX2JvZHkoeXlsdmFsLmNwLCB0cnVlKTsKKwkJYnJlYWs7CisJfQorCisJd2hpbGUgKChpb3AgPSBzeW5pbyhzeW5pb2NmKSkgIT0gTlVMTCkgeworCQlpZiAoaW9wbiA+PSBOVUZJTEUpCisJCQl5eWVycm9yKCJ0b28gbWFueSByZWRpcmVjdGlvbnNcbiIpOworCQlpb3BzW2lvcG4rK10gPSBpb3A7CisJfQorCisJaWYgKGlvcG4gPT0gMCkgeworCQlhZnJlZShpb3BzLCBBVEVNUCk7CisJCXQtPmlvYWN0ID0gTlVMTDsKKwl9IGVsc2UgeworCQlpb3BzW2lvcG4rK10gPSBOVUxMOworCQlpb3BzID0gYXJlc2l6ZShpb3BzLCBpb3BuICogc2l6ZW9mKHN0cnVjdCBpb3dvcmQgKiksIEFURU1QKTsKKwkJdC0+aW9hY3QgPSBpb3BzOworCX0KKworCWlmICh0LT50eXBlID09IFRDT00gfHwgdC0+dHlwZSA9PSBUREJSQUNLRVQpIHsKKwkJWFBwdXQoYXJncywgTlVMTCk7CisJCXQtPmFyZ3MgPSAoY29uc3QgY2hhciAqKilYUGNsb3NlKGFyZ3MpOworCQlYUHB1dCh2YXJzLCBOVUxMKTsKKwkJdC0+dmFycyA9IChjaGFyICoqKSBYUGNsb3NlKHZhcnMpOworCX0gZWxzZSB7CisJCVhQZnJlZShhcmdzKTsKKwkJWFBmcmVlKHZhcnMpOworCX0KKworCXJldHVybiAodCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorZG9ncm91cCh2b2lkKQoreworCWludCBjOworCXN0cnVjdCBvcCAqbGlzdDsKKworCWMgPSB0b2tlbihDT05USU58S0VZV09SRHxBTElBUyk7CisJLyogQSB7Li4ufSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGRvLi4uZG9uZSBmb3IgZm9yL3NlbGVjdCBsb29wcworCSAqIGJ1dCBub3QgZm9yIHdoaWxlL3VudGlsIGxvb3BzIC0gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpZiBpdAorCSAqIGlzIGEgd2hpbGUgbG9vcCBiZWNhdXNlIGl0IHdvdWxkIGhhdmUgYmVlbiBwYXJzZWQgYXMgcGFydCBvZgorCSAqIHRoZSBjb25kaXRpb25hbCBjb21tYW5kIGxpc3QuLi4KKwkgKi8KKwlpZiAoYyA9PSBETykKKwkJYyA9IERPTkU7CisJZWxzZSBpZiAoYyA9PSAneycpCisJCWMgPSAnfSc7CisJZWxzZQorCQlzeW50YXhlcnIoTlVMTCk7CisJbGlzdCA9IGNfbGlzdCh0cnVlKTsKKwltdXN0aGF2ZShjLCBLRVlXT1JEfEFMSUFTKTsKKwlyZXR1cm4gKGxpc3QpOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK3RoZW5wYXJ0KHZvaWQpCit7CisJc3RydWN0IG9wICp0OworCisJbXVzdGhhdmUoVEhFTiwgS0VZV09SRHxBTElBUyk7CisJdCA9IG5ld3RwKDApOworCXQtPmxlZnQgPSBjX2xpc3QodHJ1ZSk7CisJaWYgKHQtPmxlZnQgPT0gTlVMTCkKKwkJc3ludGF4ZXJyKE5VTEwpOworCXQtPnJpZ2h0ID0gZWxzZXBhcnQoKTsKKwlyZXR1cm4gKHQpOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK2Vsc2VwYXJ0KHZvaWQpCit7CisJc3RydWN0IG9wICp0OworCisJc3dpdGNoICh0b2tlbihLRVlXT1JEfEFMSUFTfFZBUkFTTikpIHsKKwljYXNlIEVMU0U6CisJCWlmICgodCA9IGNfbGlzdCh0cnVlKSkgPT0gTlVMTCkKKwkJCXN5bnRheGVycihOVUxMKTsKKwkJcmV0dXJuICh0KTsKKworCWNhc2UgRUxJRjoKKwkJdCA9IG5ld3RwKFRFTElGKTsKKwkJdC0+bGVmdCA9IGNfbGlzdCh0cnVlKTsKKwkJdC0+cmlnaHQgPSB0aGVucGFydCgpOworCQlyZXR1cm4gKHQpOworCisJZGVmYXVsdDoKKwkJUkVKRUNUOworCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK2Nhc2VsaXN0KHZvaWQpCit7CisJc3RydWN0IG9wICp0LCAqdGw7CisJaW50IGM7CisKKwljID0gdG9rZW4oQ09OVElOfEtFWVdPUkR8QUxJQVMpOworCS8qIEEgey4uLn0gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBpbi4uLmVzYWMgZm9yIGNhc2Ugc3RhdGVtZW50cyAqLworCWlmIChjID09IElOKQorCQljID0gRVNBQzsKKwllbHNlIGlmIChjID09ICd7JykKKwkJYyA9ICd9JzsKKwllbHNlCisJCXN5bnRheGVycihOVUxMKTsKKwl0ID0gdGwgPSBOVUxMOworCXdoaWxlICgodHBlZWsoQ09OVElOfEtFWVdPUkR8RVNBQ09OTFkpKSAhPSBjKSB7IC8qIG5vIEFMSUFTIGhlcmUgKi8KKwkJc3RydWN0IG9wICp0YyA9IGNhc2VwYXJ0KGMpOworCQlpZiAodGwgPT0gTlVMTCkKKwkJCXQgPSB0bCA9IHRjLCB0bC0+cmlnaHQgPSBOVUxMOworCQllbHNlCisJCQl0bC0+cmlnaHQgPSB0YywgdGwgPSB0YzsKKwl9CisJbXVzdGhhdmUoYywgS0VZV09SRHxBTElBUyk7CisJcmV0dXJuICh0KTsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCitjYXNlcGFydChpbnQgZW5kdG9rKQoreworCXN0cnVjdCBvcCAqdDsKKwlYUHRyViBwdG5zOworCisJWFBpbml0KHB0bnMsIDE2KTsKKwl0ID0gbmV3dHAoVFBBVCk7CisJLyogbm8gQUxJQVMgaGVyZSAqLworCWlmICh0b2tlbihDT05USU4gfCBLRVlXT1JEKSAhPSAnKCcpCisJCVJFSkVDVDsKKwlkbyB7CisJCW11c3RoYXZlKExXT1JELCAwKTsKKwkJWFBwdXQocHRucywgeXlsdmFsLmNwKTsKKwl9IHdoaWxlICh0b2tlbigwKSA9PSAnfCcpOworCVJFSkVDVDsKKwlYUHB1dChwdG5zLCBOVUxMKTsKKwl0LT52YXJzID0gKGNoYXIgKiopIFhQY2xvc2UocHRucyk7CisJbXVzdGhhdmUoJyknLCAwKTsKKworCXQtPmxlZnQgPSBjX2xpc3QodHJ1ZSk7CisJLyogTm90ZTogUE9TSVggcmVxdWlyZXMgdGhlIDs7ICovCisJaWYgKCh0cGVlayhDT05USU58S0VZV09SRHxBTElBUykpICE9IGVuZHRvaykKKwkJbXVzdGhhdmUoQlJFQUssIENPTlRJTnxLRVlXT1JEfEFMSUFTKTsKKwlyZXR1cm4gKHQpOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK2Z1bmN0aW9uX2JvZHkoY2hhciAqbmFtZSwKKyAgICBib29sIGtzaF9mdW5jKQkJLyogZnVuY3Rpb24gZm9vIHsgLi4uIH0gdnMgZm9vKCkgeyAuLiB9ICovCit7CisJY2hhciAqc25hbWUsICpwOworCXN0cnVjdCBvcCAqdDsKKwlib29sIG9sZF9mdW5jX3BhcnNlOworCisJc25hbWUgPSB3ZHN0cmlwKG5hbWUsIGZhbHNlLCBmYWxzZSk7CisJLyogQ2hlY2sgZm9yIHZhbGlkIGNoYXJhY3RlcnMgaW4gbmFtZS4gUE9TSVggYW5kIEFUJlQga3NoOTMgc2F5IG9ubHkKKwkgKiBhbGxvdyBbYS16QS1aXzAtOV0gYnV0IHRoaXMgYWxsb3dzIG1vcmUgYXMgb2xkIHBka3NocyBoYXZlCisJICogYWxsb3dlZCBtb3JlICh0aGUgZm9sbG93aW5nIHdlcmUgbmV2ZXIgYWxsb3dlZDoKKwkgKglOVUwgVEFCIE5MIFNQICIgJCAmICcgKCApIDsgPCA9ID4gXCBgIHwKKwkgKiBDX1FVT1RFIGNvdmVycyBhbGwgYnV0IGFkZHMgIyAqID8gWyBdCisJICovCisJZm9yIChwID0gc25hbWU7ICpwOyBwKyspCisJCWlmIChjdHlwZSgqcCwgQ19RVU9URSkpCisJCQl5eWVycm9yKCIlczogaW52YWxpZCBmdW5jdGlvbiBuYW1lXG4iLCBzbmFtZSk7CisKKwkvKiBOb3RlIHRoYXQgUE9TSVggYWxsb3dzIG9ubHkgY29tcG91bmQgc3RhdGVtZW50cyBhZnRlciBmb28oKSwgc2ggYW5kCisJICogQVQmVCBrc2ggYWxsb3cgYW55IGNvbW1hbmQsIGdvIHdpdGggdGhlIGxhdGVyIHNpbmNlIGl0IHNob3VsZG4ndAorCSAqIGJyZWFrIGFueXRoaW5nLiBIb3dldmVyLCBmb3IgZnVuY3Rpb24gZm9vLCBBVCZUIGtzaCBvbmx5IGFjY2VwdHMKKwkgKiBhbiBvcGVuLWJyYWNlLgorCSAqLworCWlmIChrc2hfZnVuYykgeworCQlpZiAodHBlZWsoQ09OVElOfEtFWVdPUkR8QUxJQVMpID09ICcoJyAvKiApICovKSB7CisJCQlzdHJ1Y3QgdGJsICp0cDsKKworCQkJLyogZnVuY3Rpb24gZm9vICgpIHsgKi8KKwkJCUFDQ0VQVDsKKwkJCW11c3RoYXZlKCcpJywgMCk7CisJCQkvKiBkZWdyYWRlIHRvIFBPU0lYIGZ1bmN0aW9uICovCisJCQlrc2hfZnVuYyA9IGZhbHNlOworCQkJaWYgKCh0cCA9IGt0c2VhcmNoKCZhbGlhc2VzLCBzbmFtZSwgaGFzaChzbmFtZSkpKSkKKwkJCQlrdGRlbGV0ZSh0cCk7CisJCX0KKwkJbXVzdGhhdmUoJ3snLCBDT05USU58S0VZV09SRHxBTElBUyk7IC8qIH0gKi8KKwkJUkVKRUNUOworCX0KKworCXQgPSBuZXd0cChURlVOQ1QpOworCXQtPnN0ciA9IHNuYW1lOworCXQtPnUua3NoX2Z1bmMgPSBrc2hfZnVuYzsKKwl0LT5saW5lbm8gPSBzb3VyY2UtPmxpbmU7CisKKwlvbGRfZnVuY19wYXJzZSA9IGUtPmZsYWdzICYgRUZfRlVOQ19QQVJTRTsKKwllLT5mbGFncyB8PSBFRl9GVU5DX1BBUlNFOworCWlmICgodC0+bGVmdCA9IGdldF9jb21tYW5kKENPTlRJTikpID09IE5VTEwpIHsKKwkJY2hhciAqdHY7CisJCS8qCisJCSAqIFByb2JhYmx5IHNvbWV0aGluZyBsaWtlIGZvbygpIGZvbGxvd2VkIGJ5IGVvZiBvciA7LgorCQkgKiBUaGlzIGlzIGFjY2VwdGVkIGJ5IHNoIGFuZCBrc2g4OC4KKwkJICogVG8gbWFrZSAidHlwZXNldCAtZiBmb28iIHdvcmsgcmVsaWFibHkgKHNvIGl0cyBvdXRwdXQgY2FuCisJCSAqIGJlIHVzZWQgYXMgaW5wdXQpLCB3ZSBwcmV0ZW5kIHRoZXJlIGlzIGEgY29sb24gaGVyZS4KKwkJICovCisJCXQtPmxlZnQgPSBuZXd0cChUQ09NKTsKKwkJdC0+bGVmdC0+YXJncyA9IGFsbG9jKDIgKiBzaXplb2YoY2hhciAqKSwgQVRFTVApOworCQl0LT5sZWZ0LT5hcmdzWzBdID0gdHYgPSBhbGxvYygzLCBBVEVNUCk7CisJCXR2WzBdID0gQ0hBUjsKKwkJdHZbMV0gPSAnOic7CisJCXR2WzJdID0gRU9TOworCQl0LT5sZWZ0LT5hcmdzWzFdID0gTlVMTDsKKwkJdC0+bGVmdC0+dmFycyA9IGFsbG9jKHNpemVvZihjaGFyICopLCBBVEVNUCk7CisJCXQtPmxlZnQtPnZhcnNbMF0gPSBOVUxMOworCQl0LT5sZWZ0LT5saW5lbm8gPSAxOworCX0KKwlpZiAoIW9sZF9mdW5jX3BhcnNlKQorCQllLT5mbGFncyAmPSB+RUZfRlVOQ19QQVJTRTsKKworCXJldHVybiAodCk7Cit9CisKK3N0YXRpYyBjaGFyICoqCit3b3JkbGlzdCh2b2lkKQoreworCWludCBjOworCVhQdHJWIGFyZ3M7CisKKwlYUGluaXQoYXJncywgMTYpOworCS8qIFBPU0lYIGRvZXMgbm90IGRvIGFsaWFzIGV4cGFuc2lvbiBoZXJlLi4uICovCisJaWYgKChjID0gdG9rZW4oQ09OVElOfEtFWVdPUkR8QUxJQVMpKSAhPSBJTikgeworCQlpZiAoYyAhPSAnOycpIC8qIG5vbi1QT1NJWCwgYnV0IEFUJlQga3NoIGFjY2VwdHMgYSA7IGhlcmUgKi8KKwkJCVJFSkVDVDsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJd2hpbGUgKChjID0gdG9rZW4oMCkpID09IExXT1JEKQorCQlYUHB1dChhcmdzLCB5eWx2YWwuY3ApOworCWlmIChjICE9ICdcbicgJiYgYyAhPSAnOycpCisJCXN5bnRheGVycihOVUxMKTsKKwlpZiAoWFBzaXplKGFyZ3MpID09IDApIHsKKwkJWFBmcmVlKGFyZ3MpOworCQlyZXR1cm4gKE5VTEwpOworCX0gZWxzZSB7CisJCVhQcHV0KGFyZ3MsIE5VTEwpOworCQlyZXR1cm4gKChjaGFyICoqKVhQY2xvc2UoYXJncykpOworCX0KK30KKworLyoKKyAqIHN1cHBvcnRpbmcgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHN0cnVjdCBvcCAqCitibG9jayhpbnQgdHlwZSwgc3RydWN0IG9wICp0MSwgc3RydWN0IG9wICp0MiwgY2hhciAqKndwKQoreworCXN0cnVjdCBvcCAqdDsKKworCXQgPSBuZXd0cCh0eXBlKTsKKwl0LT5sZWZ0ID0gdDE7CisJdC0+cmlnaHQgPSB0MjsKKwl0LT52YXJzID0gd3A7CisJcmV0dXJuICh0KTsKK30KKworY29uc3Qgc3RydWN0IHRva2VuaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzaG9ydCB2YWw7CisJc2hvcnQgcmVzZXJ2ZWQ7Cit9IHRva2VudGFiW10gPSB7CisJLyogUmVzZXJ2ZWQgd29yZHMgKi8KKwl7ICJpZiIsCQlJRiwJdHJ1ZSB9LAorCXsgInRoZW4iLAlUSEVOLAl0cnVlIH0sCisJeyAiZWxzZSIsCUVMU0UsCXRydWUgfSwKKwl7ICJlbGlmIiwJRUxJRiwJdHJ1ZSB9LAorCXsgImZpIiwJCUZJLAl0cnVlIH0sCisJeyAiY2FzZSIsCUNBU0UsCXRydWUgfSwKKwl7ICJlc2FjIiwJRVNBQywJdHJ1ZSB9LAorCXsgImZvciIsCUZPUiwJdHJ1ZSB9LAorCXsgInNlbGVjdCIsCVNFTEVDVCwJdHJ1ZSB9LAorCXsgIndoaWxlIiwJV0hJTEUsCXRydWUgfSwKKwl7ICJ1bnRpbCIsCVVOVElMLAl0cnVlIH0sCisJeyAiZG8iLAkJRE8sCXRydWUgfSwKKwl7ICJkb25lIiwJRE9ORSwJdHJ1ZSB9LAorCXsgImluIiwJCUlOLAl0cnVlIH0sCisJeyAiZnVuY3Rpb24iLAlGVU5DVElPTiwgdHJ1ZSB9LAorCXsgInRpbWUiLAlUSU1FLAl0cnVlIH0sCisJeyAieyIsCQkneycsCXRydWUgfSwKKwl7ICJ9IiwJCSd9JywJdHJ1ZSB9LAorCXsgIiEiLAkJQkFORywJdHJ1ZSB9LAorCXsgIltbIiwJCURCUkFDS0VULCB0cnVlIH0sCisJLyogTGV4aWNhbCB0b2tlbnMgKDBbRU9GXSwgTFdPUkQgYW5kIFJFRElSIGhhbmRsZWQgc3BlY2lhbGx5KSAqLworCXsgIiYmIiwJCUxPR0FORCwJZmFsc2UgfSwKKwl7ICJ8fCIsCQlMT0dPUiwJZmFsc2UgfSwKKwl7ICI7OyIsCQlCUkVBSywJZmFsc2UgfSwKKwl7ICIoKCIsCQlNRFBBUkVOLCBmYWxzZSB9LAorCXsgInwmIiwJCUNPUFJPQywJZmFsc2UgfSwKKwkvKiBhbmQgc29tZSBzcGVjaWFsIGNhc2VzLi4uICovCisJeyAibmV3bGluZSIsCSdcbicsCWZhbHNlIH0sCisJeyBOVUxMLAkJMCwJZmFsc2UgfQorfTsKKwordm9pZAoraW5pdGtleXdvcmRzKHZvaWQpCit7CisJc3RydWN0IHRva2VuaW5mbyBjb25zdCAqdHQ7CisJc3RydWN0IHRibCAqcDsKKworCWt0aW5pdCgma2V5d29yZHMsIEFQRVJNLAorCSAgICAvKiBtdXN0IGJlIDgwJSBvZiAyXm4gKGN1cnJlbnRseSAyMCBrZXl3b3JkcykgKi8gMzIpOworCWZvciAodHQgPSB0b2tlbnRhYjsgdHQtPm5hbWU7IHR0KyspIHsKKwkJaWYgKHR0LT5yZXNlcnZlZCkgeworCQkJcCA9IGt0ZW50ZXIoJmtleXdvcmRzLCB0dC0+bmFtZSwgaGFzaCh0dC0+bmFtZSkpOworCQkJcC0+ZmxhZyB8PSBERUZJTkVEfElTU0VUOworCQkJcC0+dHlwZSA9IENLRVlXRDsKKwkJCXAtPnZhbC5pID0gdHQtPnZhbDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3N5bnRheGVycihjb25zdCBjaGFyICp3aGF0KQoreworCWNoYXIgcmVkaXJbNl07CS8qIDI8PC0gaXMgdGhlIGxvbmdlc3QgcmVkaXJlY3Rpb24sIEkgdGhpbmsgKi8KKwljb25zdCBjaGFyICpzOworCXN0cnVjdCB0b2tlbmluZm8gY29uc3QgKnR0OworCWludCBjOworCisJaWYgKCF3aGF0KQorCQl3aGF0ID0gInVuZXhwZWN0ZWQiOworCVJFSkVDVDsKKwljID0gdG9rZW4oMCk7CisgQWdhaW46CisJc3dpdGNoIChjKSB7CisJY2FzZSAwOgorCQlpZiAobmVzdGluZy5zdGFydF90b2tlbikgeworCQkJYyA9IG5lc3Rpbmcuc3RhcnRfdG9rZW47CisJCQlzb3VyY2UtPmVycmxpbmUgPSBuZXN0aW5nLnN0YXJ0X2xpbmU7CisJCQl3aGF0ID0gInVubWF0Y2hlZCI7CisJCQlnb3RvIEFnYWluOworCQl9CisJCS8qIGRvbid0IHF1b3RlIHRoZSBFT0YgKi8KKwkJeXllcnJvcigiJXM6IHVuZXhwZWN0ZWQgRU9GXG4iLCBUX3N5bmVycik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWNhc2UgTFdPUkQ6CisJCXMgPSBzbnB0cmVlZihOVUxMLCAzMiwgIiVTIiwgeXlsdmFsLmNwKTsKKwkJYnJlYWs7CisKKwljYXNlIFJFRElSOgorCQlzID0gc25wdHJlZWYocmVkaXIsIHNpemVvZihyZWRpciksICIlUiIsIHl5bHZhbC5pb3ApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWZvciAodHQgPSB0b2tlbnRhYjsgdHQtPm5hbWU7IHR0KyspCisJCQlpZiAodHQtPnZhbCA9PSBjKQorCQkJICAgIGJyZWFrOworCQlpZiAodHQtPm5hbWUpCisJCQlzID0gdHQtPm5hbWU7CisJCWVsc2UgeworCQkJaWYgKGMgPiAwICYmIGMgPCAyNTYpIHsKKwkJCQlyZWRpclswXSA9IGM7CisJCQkJcmVkaXJbMV0gPSAnXDAnOworCQkJfSBlbHNlCisJCQkJc2hmX3NucHJpbnRmKHJlZGlyLCBzaXplb2YocmVkaXIpLAorCQkJCQkiPyVkIiwgYyk7CisJCQlzID0gcmVkaXI7CisJCX0KKwl9CisJeXllcnJvcigiJXM6ICclcycgJXNcbiIsIFRfc3luZXJyLCBzLCB3aGF0KTsKK30KKworc3RhdGljIHZvaWQKK25lc3RpbmdfcHVzaChzdHJ1Y3QgbmVzdGluZ19zdGF0ZSAqc2F2ZSwgaW50IHRvaykKK3sKKwkqc2F2ZSA9IG5lc3Rpbmc7CisJbmVzdGluZy5zdGFydF90b2tlbiA9IHRvazsKKwluZXN0aW5nLnN0YXJ0X2xpbmUgPSBzb3VyY2UtPmxpbmU7Cit9CisKK3N0YXRpYyB2b2lkCituZXN0aW5nX3BvcChzdHJ1Y3QgbmVzdGluZ19zdGF0ZSAqc2F2ZWQpCit7CisJbmVzdGluZyA9ICpzYXZlZDsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCituZXd0cChpbnQgdHlwZSkKK3sKKwlzdHJ1Y3Qgb3AgKnQ7CisKKwl0ID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcCksIEFURU1QKTsKKwl0LT50eXBlID0gdHlwZTsKKwl0LT51LmV2YWxmbGFncyA9IDA7CisJdC0+YXJncyA9IE5VTEw7CisJdC0+dmFycyA9IE5VTEw7CisJdC0+aW9hY3QgPSBOVUxMOworCXQtPmxlZnQgPSB0LT5yaWdodCA9IE5VTEw7CisJdC0+c3RyID0gTlVMTDsKKwlyZXR1cm4gKHQpOworfQorCitzdHJ1Y3Qgb3AgKgorY29tcGlsZShTb3VyY2UgKnMpCit7CisJbmVzdGluZy5zdGFydF90b2tlbiA9IDA7CisJbmVzdGluZy5zdGFydF9saW5lID0gMDsKKwloZXJlcCA9IGhlcmVzOworCXNvdXJjZSA9IHM7CisJeXlwYXJzZSgpOworCXJldHVybiAob3V0dHJlZSk7Cit9CisKKy8qIFRoaXMga2x1ZGdlIGV4aXN0cyB0byB0YWtlIGNhcmUgb2Ygc2gvQVQmVCBrc2ggb2RkaXR5IGluIHdoaWNoCisgKiB0aGUgYXJndW1lbnRzIG9mIGFsaWFzL2V4cG9ydC9yZWFkb25seS90eXBlc2V0IGhhdmUgbm8gZmllbGQKKyAqIHNwbGl0dGluZywgZmlsZSBnbG9iYmluZywgb3IgKG5vcm1hbCkgdGlsZGUgZXhwYW5zaW9uIGRvbmUuCisgKiBBVCZUIGtzaCBzZWVtcyB0byBkbyBzb21ldGhpbmcgc2ltaWxhciB0byB0aGlzIHNpbmNlCisgKgkkIHRvdWNoIGE9YTsgdHlwZXNldCBhPVthYl07IGVjaG8gIiRhIgorICoJYT1bYWJdCisgKgkkIHg9dHlwZXNldDsgJHggYT1bYWJdOyBlY2hvICIkYSIKKyAqCWE9YQorICoJJAorICovCitzdGF0aWMgaW50Cithc3NpZ25fY29tbWFuZChjaGFyICpzKQoreworCWlmICghKnMpCisJCXJldHVybiAoMCk7CisJcmV0dXJuICgoc3RyY21wKHMsICJhbGlhcyIpID09IDApIHx8CisJICAgIChzdHJjbXAocywgImV4cG9ydCIpID09IDApIHx8CisJICAgIChzdHJjbXAocywgInJlYWRvbmx5IikgPT0gMCkgfHwKKwkgICAgKHN0cmNtcChzLCBUX3R5cGVzZXQpID09IDApKTsKK30KKworLyogQ2hlY2sgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgcmVhZGluZyBhbiBhbGlhcyAqLworc3RhdGljIGludAoraW5hbGlhcyhzdHJ1Y3Qgc291cmNlICpzKQoreworCWZvciAoOyBzICYmIHMtPnR5cGUgPT0gU0FMSUFTOyBzID0gcy0+bmV4dCkKKwkJaWYgKCEocy0+ZmxhZ3MgJiBTRl9BTElBU0VORCkpCisJCQlyZXR1cm4gKDEpOworCXJldHVybiAoMCk7Cit9CisKKworLyogT3JkZXIgaW1wb3J0YW50IC0gaW5kZXhlZCBieSBUZXN0X21ldGEgdmFsdWVzCisgKiBOb3RlIHRoYXQgfHwsICYmLCAoIGFuZCApIGNhbid0IGFwcGVhciBpbiBhcyB1bnF1b3RlZCBzdHJpbmdzCisgKiBpbiBub3JtYWwgc2hlbGwgaW5wdXQsIHNvIHRoZXNlIGNhbiBiZSBpbnRlcnByZXRlZCB1bmFtYmlndW91c2x5CisgKiBpbiB0aGUgZXZhbHVhdGlvbiBwYXNzLgorICovCitzdGF0aWMgY29uc3QgY2hhciBkYnRlc3Rfb3JbXSA9IHsgQ0hBUiwgJ3wnLCBDSEFSLCAnfCcsIEVPUyB9Oworc3RhdGljIGNvbnN0IGNoYXIgZGJ0ZXN0X2FuZFtdID0geyBDSEFSLCAnJicsIENIQVIsICcmJywgRU9TIH07CitzdGF0aWMgY29uc3QgY2hhciBkYnRlc3Rfbm90W10gPSB7IENIQVIsICchJywgRU9TIH07CitzdGF0aWMgY29uc3QgY2hhciBkYnRlc3Rfb3BhcmVuW10gPSB7IENIQVIsICcoJywgRU9TIH07CitzdGF0aWMgY29uc3QgY2hhciBkYnRlc3RfY3BhcmVuW10gPSB7IENIQVIsICcpJywgRU9TIH07Citjb25zdCBjaGFyICpjb25zdCBkYnRlc3RfdG9rZW5zW10gPSB7CisJZGJ0ZXN0X29yLCBkYnRlc3RfYW5kLCBkYnRlc3Rfbm90LAorCWRidGVzdF9vcGFyZW4sIGRidGVzdF9jcGFyZW4KK307Citjb25zdCBjaGFyIGRiX2Nsb3NlW10gPSB7IENIQVIsICddJywgQ0hBUiwgJ10nLCBFT1MgfTsKK2NvbnN0IGNoYXIgZGJfbHRoYW5bXSA9IHsgQ0hBUiwgJzwnLCBFT1MgfTsKK2NvbnN0IGNoYXIgZGJfZ3RoYW5bXSA9IHsgQ0hBUiwgJz4nLCBFT1MgfTsKKworLyoKKyAqIFRlc3QgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYSB3aGF0ZXZlci4gQWNjZXB0cyB0aGUgY3VycmVudCB0b2tlbiBpZgorICogaXQgaXMuIFJldHVybnMgMCBpZiBpdCBpcyBub3QsIG5vbi16ZXJvIGlmIGl0IGlzIChpbiB0aGUgY2FzZSBvZgorICogVE1fVU5PUCBhbmQgVE1fQklOT1AsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhIFRlc3Rfb3ApLgorICovCitzdGF0aWMgVGVzdF9vcAorZGJ0ZXN0cF9pc2EoVGVzdF9lbnYgKnRlLCBUZXN0X21ldGEgbWV0YSkKK3sKKwlpbnQgYyA9IHRwZWVrKEFSUkFZVkFSIHwgKG1ldGEgPT0gVE1fQklOT1AgPyAwIDogQ09OVElOKSk7CisJaW50IHVxd29yZDsKKwljaGFyICpzYXZlID0gTlVMTDsKKwlUZXN0X29wIHJldCA9IFRPX05PTk9QOworCisJLyogdW5xdW90ZWQgd29yZD8gKi8KKwl1cXdvcmQgPSBjID09IExXT1JEICYmICppZGVudDsKKworCWlmIChtZXRhID09IFRNX09SKQorCQlyZXQgPSBjID09IExPR09SID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QOworCWVsc2UgaWYgKG1ldGEgPT0gVE1fQU5EKQorCQlyZXQgPSBjID09IExPR0FORCA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKKwllbHNlIGlmIChtZXRhID09IFRNX05PVCkKKwkJcmV0ID0gKHVxd29yZCAmJiAhc3RyY21wKHl5bHZhbC5jcCwKKwkJICAgIGRidGVzdF90b2tlbnNbKGludClUTV9OT1RdKSkgPyBUT19OT05OVUxMIDogVE9fTk9OT1A7CisJZWxzZSBpZiAobWV0YSA9PSBUTV9PUEFSRU4pCisJCXJldCA9IGMgPT0gJygnIC8qKSovID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QOworCWVsc2UgaWYgKG1ldGEgPT0gVE1fQ1BBUkVOKQorCQlyZXQgPSBjID09IC8qKCovICcpJyA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKKwllbHNlIGlmIChtZXRhID09IFRNX1VOT1AgfHwgbWV0YSA9PSBUTV9CSU5PUCkgeworCQlpZiAobWV0YSA9PSBUTV9CSU5PUCAmJiBjID09IFJFRElSICYmCisJCSAgICAoeXlsdmFsLmlvcC0+ZmxhZyA9PSBJT1JFQUQgfHwgeXlsdmFsLmlvcC0+ZmxhZyA9PSBJT1dSSVRFKSkgeworCQkJcmV0ID0gVE9fTk9OTlVMTDsKKwkJCXNhdmUgPSB3ZGNvcHkoeXlsdmFsLmlvcC0+ZmxhZyA9PSBJT1JFQUQgPworCQkJICAgIGRiX2x0aGFuIDogZGJfZ3RoYW4sIEFURU1QKTsKKwkJfSBlbHNlIGlmICh1cXdvcmQgJiYgKHJldCA9IHRlc3RfaXNvcChtZXRhLCBpZGVudCkpKQorCQkJc2F2ZSA9IHl5bHZhbC5jcDsKKwl9IGVsc2UgLyogbWV0YSA9PSBUTV9FTkQgKi8KKwkJcmV0ID0gKHVxd29yZCAmJiAhc3RyY21wKHl5bHZhbC5jcCwKKwkJICAgIGRiX2Nsb3NlKSkgPyBUT19OT05OVUxMIDogVE9fTk9OT1A7CisJaWYgKHJldCAhPSBUT19OT05PUCkgeworCQlBQ0NFUFQ7CisJCWlmIChtZXRhIDwgTkVMRU0oZGJ0ZXN0X3Rva2VucykpCisJCQlzYXZlID0gd2Rjb3B5KGRidGVzdF90b2tlbnNbKGludCltZXRhXSwgQVRFTVApOworCQlpZiAoc2F2ZSkKKwkJCVhQcHV0KCp0ZS0+cG9zLmF2LCBzYXZlKTsKKwl9CisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitkYnRlc3RwX2dldG9wbmQoVGVzdF9lbnYgKnRlLCBUZXN0X29wIG9wIE1LU0hfQV9VTlVTRUQsCisgICAgYm9vbCBkb19ldmFsIE1LU0hfQV9VTlVTRUQpCit7CisJaW50IGMgPSB0cGVlayhBUlJBWVZBUik7CisKKwlpZiAoYyAhPSBMV09SRCkKKwkJcmV0dXJuIChOVUxMKTsKKworCUFDQ0VQVDsKKwlYUHB1dCgqdGUtPnBvcy5hdiwgeXlsdmFsLmNwKTsKKworCXJldHVybiAobnVsbCk7Cit9CisKK3N0YXRpYyBpbnQKK2RidGVzdHBfZXZhbChUZXN0X2VudiAqdGUgTUtTSF9BX1VOVVNFRCwgVGVzdF9vcCBvcCBNS1NIX0FfVU5VU0VELAorICAgIGNvbnN0IGNoYXIgKm9wbmQxIE1LU0hfQV9VTlVTRUQsIGNvbnN0IGNoYXIgKm9wbmQyIE1LU0hfQV9VTlVTRUQsCisgICAgYm9vbCBkb19ldmFsIE1LU0hfQV9VTlVTRUQpCit7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK2RidGVzdHBfZXJyb3IoVGVzdF9lbnYgKnRlLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICptc2cpCit7CisJdGUtPmZsYWdzIHw9IFRFRl9FUlJPUjsKKworCWlmIChvZmZzZXQgPCAwKSB7CisJCVJFSkVDVDsKKwkJLyogS2x1ZGd5IHRvIHNheSB0aGUgbGVhc3QuLi4gKi8KKwkJc3ltYm9sID0gTFdPUkQ7CisJCXl5bHZhbC5jcCA9ICooWFBwdHJ2KCp0ZS0+cG9zLmF2KSArIFhQc2l6ZSgqdGUtPnBvcy5hdikgKworCQkgICAgb2Zmc2V0KTsKKwl9CisJc3ludGF4ZXJyKG1zZyk7Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy90cmVlLmMgYi9ta3NoL3NyYy90cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4NjFkYgotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL3RyZWUuYwpAQCAtMCwwICsxLDcxNiBAQAorLyoJJE9wZW5CU0Q6IHRyZWUuYyx2IDEuMTkgMjAwOC8wOC8xMSAyMTo1MDozNSBqYXJlZHkgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC90cmVlLmMsdiAxLjMwIDIwMTAvMDIvMjUgMjA6MTg6MTkgdGcgRXhwICQiKTsKKworI2RlZmluZSBJTkRFTlQJNAorCisjZGVmaW5lIHRwdXRjKGMsIHNoZikgc2hmX3B1dGNoYXIoYywgc2hmKTsKK3N0YXRpYyB2b2lkIHB0cmVlKHN0cnVjdCBvcCAqLCBpbnQsIHN0cnVjdCBzaGYgKik7CitzdGF0aWMgdm9pZCBwaW9hY3Qoc3RydWN0IHNoZiAqLCBpbnQsIHN0cnVjdCBpb3dvcmQgKik7CitzdGF0aWMgdm9pZCB0cHV0QyhpbnQsIHN0cnVjdCBzaGYgKik7CitzdGF0aWMgdm9pZCB0cHV0UyhjaGFyICosIHN0cnVjdCBzaGYgKik7CitzdGF0aWMgdm9pZCB2ZnB0cmVlZihzdHJ1Y3Qgc2hmICosIGludCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK3N0YXRpYyBzdHJ1Y3QgaW93b3JkICoqaW9jb3B5KHN0cnVjdCBpb3dvcmQgKiosIEFyZWEgKik7CitzdGF0aWMgdm9pZCBpb2ZyZWUoc3RydWN0IGlvd29yZCAqKiwgQXJlYSAqKTsKKworLyoKKyAqIHByaW50IGEgY29tbWFuZCB0cmVlCisgKi8KK3N0YXRpYyB2b2lkCitwdHJlZShzdHJ1Y3Qgb3AgKnQsIGludCBpbmRlbnQsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwljb25zdCBjaGFyICoqdzsKKwlzdHJ1Y3QgaW93b3JkICoqaW9hY3Q7CisJc3RydWN0IG9wICp0MTsKKworIENoYWluOgorCWlmICh0ID09IE5VTEwpCisJCXJldHVybjsKKwlzd2l0Y2ggKHQtPnR5cGUpIHsKKwljYXNlIFRDT006CisJCWlmICh0LT52YXJzKQorCQkJZm9yICh3ID0gKGNvbnN0IGNoYXIgKiopdC0+dmFyczsgKncgIT0gTlVMTDsgKQorCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlUyAiLCAqdysrKTsKKwkJZWxzZQorCQkJc2hmX3B1dHMoIiNuby12YXJzIyAiLCBzaGYpOworCQlpZiAodC0+YXJncykKKwkJCWZvciAodyA9IHQtPmFyZ3M7ICp3ICE9IE5VTEw7ICkKKwkJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVMgIiwgKncrKyk7CisJCWVsc2UKKwkJCXNoZl9wdXRzKCIjbm8tYXJncyMgIiwgc2hmKTsKKwkJYnJlYWs7CisJY2FzZSBURVhFQzoKKwkJdCA9IHQtPmxlZnQ7CisJCWdvdG8gQ2hhaW47CisJY2FzZSBUUEFSRU46CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyAyLCAiKCAlVCkgIiwgdC0+bGVmdCk7CisJCWJyZWFrOworCWNhc2UgVFBJUEU6CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlVHwgIiwgdC0+bGVmdCk7CisJCXQgPSB0LT5yaWdodDsKKwkJZ290byBDaGFpbjsKKwljYXNlIFRMSVNUOgorCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVQlOyIsIHQtPmxlZnQpOworCQl0ID0gdC0+cmlnaHQ7CisJCWdvdG8gQ2hhaW47CisJY2FzZSBUT1I6CisJY2FzZSBUQU5EOgorCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVQlcyAlVCIsCisJCSAgICB0LT5sZWZ0LCAodC0+dHlwZT09VE9SKSA/ICJ8fCIgOiAiJiYiLCB0LT5yaWdodCk7CisJCWJyZWFrOworCWNhc2UgVEJBTkc6CisJCXNoZl9wdXRzKCIhICIsIHNoZik7CisJCXQgPSB0LT5yaWdodDsKKwkJZ290byBDaGFpbjsKKwljYXNlIFREQlJBQ0tFVDogeworCQlpbnQgaTsKKworCQlzaGZfcHV0cygiW1siLCBzaGYpOworCQlmb3IgKGkgPSAwOyB0LT5hcmdzW2ldOyBpKyspCisJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiICVTIiwgdC0+YXJnc1tpXSk7CisJCXNoZl9wdXRzKCIgXV0gIiwgc2hmKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVFNFTEVDVDoKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgInNlbGVjdCAlcyAiLCB0LT5zdHIpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgVEZPUjoKKwkJaWYgKHQtPnR5cGUgPT0gVEZPUikKKwkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICJmb3IgJXMgIiwgdC0+c3RyKTsKKwkJaWYgKHQtPnZhcnMgIT0gTlVMTCkgeworCQkJc2hmX3B1dHMoImluICIsIHNoZik7CisJCQlmb3IgKHcgPSAoY29uc3QgY2hhciAqKil0LT52YXJzOyAqdzsgKQorCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlUyAiLCAqdysrKTsKKwkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlOyIpOworCQl9CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyBJTkRFTlQsICJkbyVOJVQiLCB0LT5sZWZ0KTsKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7ZG9uZSAiKTsKKwkJYnJlYWs7CisJY2FzZSBUQ0FTRToKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgImNhc2UgJVMgaW4iLCB0LT5zdHIpOworCQlmb3IgKHQxID0gdC0+bGVmdDsgdDEgIT0gTlVMTDsgdDEgPSB0MS0+cmlnaHQpIHsKKwkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlTigiKTsKKwkJCWZvciAodyA9IChjb25zdCBjaGFyICoqKXQxLT52YXJzOyAqdyAhPSBOVUxMOyB3KyspCisJCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVTJWMiLCAqdywKKwkJCQkgICAgKHdbMV0gIT0gTlVMTCkgPyAnfCcgOiAnKScpOworCQkJZnB0cmVlZihzaGYsIGluZGVudCArIElOREVOVCwgIiU7JVQlTjs7IiwgdDEtPmxlZnQpOworCQl9CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlTmVzYWMgIik7CisJCWJyZWFrOworCWNhc2UgVElGOgorCWNhc2UgVEVMSUY6CisJCS8qIDMgPT0gc3RybGVuKCJpZiAiKSAqLworCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgMywgImlmICVUIiwgdC0+bGVmdCk7CisJCWZvciAoOzspIHsKKwkJCXQgPSB0LT5yaWdodDsKKwkJCWlmICh0LT5sZWZ0ICE9IE5VTEwpIHsKKwkJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTsiKTsKKwkJCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgSU5ERU5ULCAidGhlbiVOJVQiLAorCQkJCSAgICB0LT5sZWZ0KTsKKwkJCX0KKwkJCWlmICh0LT5yaWdodCA9PSBOVUxMIHx8IHQtPnJpZ2h0LT50eXBlICE9IFRFTElGKQorCQkJCWJyZWFrOworCQkJdCA9IHQtPnJpZ2h0OworCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7Iik7CisJCQkvKiA1ID09IHN0cmxlbigiZWxpZiAiKSAqLworCQkJZnB0cmVlZihzaGYsIGluZGVudCArIDUsICJlbGlmICVUIiwgdC0+bGVmdCk7CisJCX0KKwkJaWYgKHQtPnJpZ2h0ICE9IE5VTEwpIHsKKwkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlOyIpOworCQkJZnB0cmVlZihzaGYsIGluZGVudCArIElOREVOVCwgImVsc2UlOyVUIiwgdC0+cmlnaHQpOworCQl9CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlO2ZpICIpOworCQlicmVhazsKKwljYXNlIFRXSElMRToKKwljYXNlIFRVTlRJTDoKKwkJLyogNiA9PSBzdHJsZW4oIndoaWxlIi8idW50aWwiKSAqLworCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgNiwgIiVzICVUIiwKKwkJICAgICh0LT50eXBlPT1UV0hJTEUpID8gIndoaWxlIiA6ICJ1bnRpbCIsCisJCSAgICB0LT5sZWZ0KTsKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7ZG8iKTsKKwkJZnB0cmVlZihzaGYsIGluZGVudCArIElOREVOVCwgIiU7JVQiLCB0LT5yaWdodCk7CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlO2RvbmUgIik7CisJCWJyZWFrOworCWNhc2UgVEJSQUNFOgorCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgSU5ERU5ULCAieyU7JVQiLCB0LT5sZWZ0KTsKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7fSAiKTsKKwkJYnJlYWs7CisJY2FzZSBUQ09QUk9DOgorCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVR8JiAiLCB0LT5sZWZ0KTsKKwkJYnJlYWs7CisJY2FzZSBUQVNZTkM6CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlVCYgIiwgdC0+bGVmdCk7CisJCWJyZWFrOworCWNhc2UgVEZVTkNUOgorCQlmcHRyZWVmKHNoZiwgaW5kZW50LAorCQkgICAgdC0+dS5rc2hfZnVuYyA/ICJmdW5jdGlvbiAlcyAlVCIgOiAiJXMoKSAlVCIsCisJCSAgICB0LT5zdHIsIHQtPmxlZnQpOworCQlicmVhazsKKwljYXNlIFRUSU1FOgorCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAidGltZSAlVCIsIHQtPmxlZnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzaGZfcHV0cygiPGJvdGNoPiIsIHNoZik7CisJCWJyZWFrOworCX0KKwlpZiAoKGlvYWN0ID0gdC0+aW9hY3QpICE9IE5VTEwpIHsKKwkJaW50CW5lZWRfbmwgPSAwOworCisJCXdoaWxlICgqaW9hY3QgIT0gTlVMTCkKKwkJCXBpb2FjdChzaGYsIGluZGVudCwgKmlvYWN0KyspOworCQkvKiBQcmludCBoZXJlIGRvY3VtZW50cyBhZnRlciBldmVyeXRoaW5nIGVsc2UuLi4gKi8KKwkJZm9yIChpb2FjdCA9IHQtPmlvYWN0OyAqaW9hY3QgIT0gTlVMTDsgKSB7CisJCQlzdHJ1Y3QgaW93b3JkICppb3AgPSAqaW9hY3QrKzsKKworCQkJLyogaGVyZWRvYyBpcyAwIHdoZW4gdHJhY2luZyAoc2V0IC14KSAqLworCQkJaWYgKChpb3AtPmZsYWcgJiBJT1RZUEUpID09IElPSEVSRSAmJiBpb3AtPmhlcmVkb2MgJiYKKwkJCSAgICAvKiBpb3AtPmRlbGltWzFdID09ICc8JyBtZWFucyBoZXJlIHN0cmluZyAqLworCQkJICAgICghaW9wLT5kZWxpbSB8fCBpb3AtPmRlbGltWzFdICE9ICc8JykpIHsKKwkJCQl0cHV0YygnXG4nLCBzaGYpOworCQkJCXNoZl9wdXRzKGlvcC0+aGVyZWRvYywgc2hmKTsKKwkJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJXMiLAorCQkJCSAgICBldmFsc3RyKGlvcC0+ZGVsaW0sIDApKTsKKwkJCQluZWVkX25sID0gMTsKKwkJCX0KKwkJfQorCQkvKiBMYXN0IGRlbGltaXRlciBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSAodGhpcyBvZnRlbgorCQkgKiBsZWFkcyB0byBhbiBleHRyYSBibGFuayBsaW5lLCBidXQgaXRzIG5vdCB3b3J0aCB3b3JyeWluZworCQkgKiBhYm91dCkKKwkJICovCisJCWlmIChuZWVkX25sKQorCQkJdHB1dGMoJ1xuJywgc2hmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwaW9hY3Qoc3RydWN0IHNoZiAqc2hmLCBpbnQgaW5kZW50LCBzdHJ1Y3QgaW93b3JkICppb3ApCit7CisJaW50IGZsYWcgPSBpb3AtPmZsYWc7CisJaW50IHR5cGUgPSBmbGFnICYgSU9UWVBFOworCWludCBleHBlY3RlZDsKKworCWV4cGVjdGVkID0gKHR5cGUgPT0gSU9SRUFEIHx8IHR5cGUgPT0gSU9SRFdSIHx8IHR5cGUgPT0gSU9IRVJFKSA/IDAgOgorCSAgICAodHlwZSA9PSBJT0NBVCB8fCB0eXBlID09IElPV1JJVEUpID8gMSA6CisJICAgICh0eXBlID09IElPRFVQICYmIChpb3AtPnVuaXQgPT0gIShmbGFnICYgSU9SRFVQKSkpID8gaW9wLT51bml0IDoKKwkgICAgaW9wLT51bml0ICsgMTsKKwlpZiAoaW9wLT51bml0ICE9IGV4cGVjdGVkKQorCQlzaGZfZnByaW50ZihzaGYsICIlZCIsIGlvcC0+dW5pdCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElPUkVBRDoKKwkJc2hmX3B1dHMoIjwgIiwgc2hmKTsKKwkJYnJlYWs7CisJY2FzZSBJT0hFUkU6CisJCXNoZl9wdXRzKGZsYWcgJiBJT1NLSVAgPyAiPDwtIiA6ICI8PCIsIHNoZik7CisJCWJyZWFrOworCWNhc2UgSU9DQVQ6CisJCXNoZl9wdXRzKCI+PiAiLCBzaGYpOworCQlicmVhazsKKwljYXNlIElPV1JJVEU6CisJCXNoZl9wdXRzKGZsYWcgJiBJT0NMT0IgPyAiPnwgIiA6ICI+ICIsIHNoZik7CisJCWJyZWFrOworCWNhc2UgSU9SRFdSOgorCQlzaGZfcHV0cygiPD4gIiwgc2hmKTsKKwkJYnJlYWs7CisJY2FzZSBJT0RVUDoKKwkJc2hmX3B1dHMoZmxhZyAmIElPUkRVUCA/ICI8JiIgOiAiPiYiLCBzaGYpOworCQlicmVhazsKKwl9CisJLyogbmFtZS9kZWxpbSBhcmUgMCB3aGVuIHByaW50aW5nIHN5bnRheCBlcnJvcnMgKi8KKwlpZiAodHlwZSA9PSBJT0hFUkUpIHsKKwkJaWYgKGlvcC0+ZGVsaW0pCisJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJXMlUyAiLAorCQkJICAgIC8qIGhlcmUgc3RyaW5nICovIGlvcC0+ZGVsaW1bMV0gPT0gJzwnID8gIiIgOiAiICIsCisJCQkgICAgaW9wLT5kZWxpbSk7CisJCWVsc2UKKwkJCXRwdXRjKCcgJywgc2hmKTsKKwl9IGVsc2UgaWYgKGlvcC0+bmFtZSkKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgKGlvcC0+ZmxhZyAmIElPTkFNRVhQKSA/ICIlcyAiIDogIiVTICIsCisJCSAgICBpb3AtPm5hbWUpOworfQorCisKKy8qCisgKiB2YXJpYW50cyBvZiBmcHV0YywgZnB1dHMgZm9yIHB0cmVlZiBhbmQgc25wdHJlZWYKKyAqLworc3RhdGljIHZvaWQKK3RwdXRDKGludCBjLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaWYgKChjJjB4NjApID09IDApIHsJCS8qIEMwfEMxICovCisJCXRwdXRjKChjJjB4ODApID8gJyQnIDogJ14nLCBzaGYpOworCQl0cHV0YygoKGMmMHg3Ril8MHg0MCksIHNoZik7CisJfSBlbHNlIGlmICgoYyYweDdGKSA9PSAweDdGKSB7CS8qIERFTCAqLworCQl0cHV0YygoYyYweDgwKSA/ICckJyA6ICdeJywgc2hmKTsKKwkJdHB1dGMoJz8nLCBzaGYpOworCX0gZWxzZQorCQl0cHV0YyhjLCBzaGYpOworfQorCitzdGF0aWMgdm9pZAordHB1dFMoY2hhciAqd3AsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpbnQgYywgcXVvdGVsZXZlbCA9IDA7CisKKwkvKiBwcm9ibGVtczoKKwkgKglgLi4uYCAtPiAkKC4uLikKKwkgKgknZm9vJyAtPiAiZm9vIgorCSAqIGNvdWxkIGNoYW5nZSBlbmNvZGluZyB0bzoKKwkgKglPUVVPVEUgWyInXSAuLi4gQ1FVT1RFIFsiJ10KKwkgKglDT01TVUIgWyhgXSAuLi5cMAkoaGFuZGxlICQgYCBcIGFuZCBtYXliZSAiIGluIGAuLi5gIGNhc2UpCisJICovCisJd2hpbGUgKDEpCisJCXN3aXRjaCAoKndwKyspIHsKKwkJY2FzZSBFT1M6CisJCQlyZXR1cm47CisJCWNhc2UgQURFTElNOgorCQljYXNlIENIQVI6CisJCQl0cHV0Qygqd3ArKywgc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIFFDSEFSOgorCQkJYyA9ICp3cCsrOworCQkJaWYgKCFxdW90ZWxldmVsIHx8IChjID09ICciJyB8fCBjID09ICdgJyB8fCBjID09ICckJykpCisJCQkJdHB1dGMoJ1xcJywgc2hmKTsKKwkJCXRwdXRDKGMsIHNoZik7CisJCQlicmVhazsKKwkJY2FzZSBDT01TVUI6CisJCQlzaGZfcHV0cygiJCgiLCBzaGYpOworCQkJd2hpbGUgKCp3cCAhPSAwKQorCQkJCXRwdXRDKCp3cCsrLCBzaGYpOworCQkJdHB1dGMoJyknLCBzaGYpOworCQkJd3ArKzsKKwkJCWJyZWFrOworCQljYXNlIEVYUFJTVUI6CisJCQlzaGZfcHV0cygiJCgoIiwgc2hmKTsKKwkJCXdoaWxlICgqd3AgIT0gMCkKKwkJCQl0cHV0Qygqd3ArKywgc2hmKTsKKwkJCXNoZl9wdXRzKCIpKSIsIHNoZik7CisJCQl3cCsrOworCQkJYnJlYWs7CisJCWNhc2UgT1FVT1RFOgorCQkJcXVvdGVsZXZlbCsrOworCQkJdHB1dGMoJyInLCBzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgQ1FVT1RFOgorCQkJaWYgKHF1b3RlbGV2ZWwpCisJCQkJcXVvdGVsZXZlbC0tOworCQkJdHB1dGMoJyInLCBzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgT1NVQlNUOgorCQkJdHB1dGMoJyQnLCBzaGYpOworCQkJaWYgKCp3cCsrID09ICd7JykKKwkJCQl0cHV0YygneycsIHNoZik7CisJCQl3aGlsZSAoKGMgPSAqd3ArKykgIT0gMCkKKwkJCQl0cHV0QyhjLCBzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgQ1NVQlNUOgorCQkJaWYgKCp3cCsrID09ICd9JykKKwkJCQl0cHV0YygnfScsIHNoZik7CisJCQlicmVhazsKKwkJY2FzZSBPUEFUOgorCQkJdHB1dGMoKndwKyssIHNoZik7CisJCQl0cHV0YygnKCcsIHNoZik7CisJCQlicmVhazsKKwkJY2FzZSBTUEFUOgorCQkJdHB1dGMoJ3wnLCBzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgQ1BBVDoKKwkJCXRwdXRjKCcpJywgc2hmKTsKKwkJCWJyZWFrOworCQl9Cit9CisKKy8qCisgKiB0aGlzIGlzIHRoZSBfb25seV8gd2F5IHRvIHJlbGlhYmx5IGhhbmRsZQorICogdmFyaWFibGUgYXJncyB3aXRoIGFuIEFOU0kgY29tcGlsZXIKKyAqLworLyogVkFSQVJHUyAqLworaW50CitmcHRyZWVmKHN0cnVjdCBzaGYgKnNoZiwgaW50IGluZGVudCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCXZhX3N0YXJ0KHZhLCBmbXQpOworCisJdmZwdHJlZWYoc2hmLCBpbmRlbnQsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7CisJcmV0dXJuICgwKTsKK30KKworLyogVkFSQVJHUyAqLworY2hhciAqCitzbnB0cmVlZihjaGFyICpzLCBpbnQgbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKwlzdHJ1Y3Qgc2hmIHNoZjsKKworCXNoZl9zb3BlbihzLCBuLCBTSEZfV1IgfCAocyA/IDAgOiBTSEZfRFlOQU1JQyksICZzaGYpOworCisJdmFfc3RhcnQodmEsIGZtdCk7CisJdmZwdHJlZWYoJnNoZiwgMCwgZm10LCB2YSk7CisJdmFfZW5kKHZhKTsKKworCXJldHVybiAoc2hmX3NjbG9zZSgmc2hmKSk7IC8qIG51bGwgdGVybWluYXRlcyAqLworfQorCitzdGF0aWMgdm9pZAordmZwdHJlZWYoc3RydWN0IHNoZiAqc2hmLCBpbnQgaW5kZW50LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmEpCit7CisJaW50IGM7CisKKwl3aGlsZSAoKGMgPSAqZm10KyspKSB7CisJCWlmIChjID09ICclJykgeworCQkJc3dpdGNoICgoYyA9ICpmbXQrKykpIHsKKwkJCWNhc2UgJ2MnOgorCQkJCXRwdXRjKHZhX2FyZyh2YSwgaW50KSwgc2hmKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgorCQkJCXNoZl9wdXRzKHZhX2FyZyh2YSwgY2hhciAqKSwgc2hmKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1MnOgkvKiB3b3JkICovCisJCQkJdHB1dFModmFfYXJnKHZhLCBjaGFyICopLCBzaGYpOworCQkJCWJyZWFrOworCQkJY2FzZSAnZCc6CS8qIGRlY2ltYWwgKi8KKwkJCQlzaGZfZnByaW50ZihzaGYsICIlZCIsIHZhX2FyZyh2YSwgaW50KSk7CisJCQkJYnJlYWs7CisJCQljYXNlICd1JzoJLyogZGVjaW1hbCAqLworCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiV1IiwgdmFfYXJnKHZhLCB1bnNpZ25lZCBpbnQpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1QnOgkvKiBmb3JtYXQgdHJlZSAqLworCQkJCXB0cmVlKHZhX2FyZyh2YSwgc3RydWN0IG9wICopLCBpbmRlbnQsIHNoZik7CisJCQkJYnJlYWs7CisJCQljYXNlICc7JzoJLyogbmV3bGluZSBvciA7ICovCisJCQljYXNlICdOJzoJLyogbmV3bGluZSBvciBzcGFjZSAqLworCQkJCWlmIChzaGYtPmZsYWdzICYgU0hGX1NUUklORykgeworCQkJCQlpZiAoYyA9PSAnOycpCisJCQkJCQl0cHV0YygnOycsIHNoZik7CisJCQkJCXRwdXRjKCcgJywgc2hmKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgaTsKKworCQkJCQl0cHV0YygnXG4nLCBzaGYpOworCQkJCQlmb3IgKGkgPSBpbmRlbnQ7IGkgPj0gODsgaSAtPSA4KQorCQkJCQkJdHB1dGMoJ1x0Jywgc2hmKTsKKwkJCQkJZm9yICg7IGkgPiAwOyAtLWkpCisJCQkJCQl0cHV0YygnICcsIHNoZik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnUic6CisJCQkJcGlvYWN0KHNoZiwgaW5kZW50LCB2YV9hcmcodmEsIHN0cnVjdCBpb3dvcmQgKikpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0cHV0YyhjLCBzaGYpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKwkJCXRwdXRjKGMsIHNoZik7CisJfQorfQorCisvKgorICogY29weSB0cmVlIChmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbikKKyAqLworc3RydWN0IG9wICoKK3Rjb3B5KHN0cnVjdCBvcCAqdCwgQXJlYSAqYXApCit7CisJc3RydWN0IG9wICpyOworCWNvbnN0IGNoYXIgKip0dzsKKwljaGFyICoqcnc7CisKKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJciA9IGFsbG9jKHNpemVvZihzdHJ1Y3Qgb3ApLCBhcCk7CisKKwlyLT50eXBlID0gdC0+dHlwZTsKKwlyLT51LmV2YWxmbGFncyA9IHQtPnUuZXZhbGZsYWdzOworCisJaWYgKHQtPnR5cGUgPT0gVENBU0UpCisJCXItPnN0ciA9IHdkY29weSh0LT5zdHIsIGFwKTsKKwllbHNlCisJCXN0cmR1cHgoci0+c3RyLCB0LT5zdHIsIGFwKTsKKworCWlmICh0LT52YXJzID09IE5VTEwpCisJCXItPnZhcnMgPSBOVUxMOworCWVsc2UgeworCQlmb3IgKHR3ID0gKGNvbnN0IGNoYXIgKiopdC0+dmFyczsgKnR3KysgIT0gTlVMTDsgKQorCQkJOworCQlydyA9IHItPnZhcnMgPSBhbGxvYygodHcgLSAoY29uc3QgY2hhciAqKil0LT52YXJzICsgMSkgKgorCQkgICAgc2l6ZW9mKCp0dyksIGFwKTsKKwkJZm9yICh0dyA9IChjb25zdCBjaGFyICoqKXQtPnZhcnM7ICp0dyAhPSBOVUxMOyApCisJCQkqcncrKyA9IHdkY29weSgqdHcrKywgYXApOworCQkqcncgPSBOVUxMOworCX0KKworCWlmICh0LT5hcmdzID09IE5VTEwpCisJCXItPmFyZ3MgPSBOVUxMOworCWVsc2UgeworCQlmb3IgKHR3ID0gdC0+YXJnczsgKnR3KysgIT0gTlVMTDsgKQorCQkJOworCQlyLT5hcmdzID0gKGNvbnN0IGNoYXIgKiopKHJ3ID0gYWxsb2MoKHR3IC0gdC0+YXJncyArIDEpICoKKwkJICAgIHNpemVvZigqdHcpLCBhcCkpOworCQlmb3IgKHR3ID0gdC0+YXJnczsgKnR3ICE9IE5VTEw7ICkKKwkJCSpydysrID0gd2Rjb3B5KCp0dysrLCBhcCk7CisJCSpydyA9IE5VTEw7CisJfQorCisJci0+aW9hY3QgPSAodC0+aW9hY3QgPT0gTlVMTCkgPyBOVUxMIDogaW9jb3B5KHQtPmlvYWN0LCBhcCk7CisKKwlyLT5sZWZ0ID0gdGNvcHkodC0+bGVmdCwgYXApOworCXItPnJpZ2h0ID0gdGNvcHkodC0+cmlnaHQsIGFwKTsKKwlyLT5saW5lbm8gPSB0LT5saW5lbm87CisKKwlyZXR1cm4gKHIpOworfQorCitjaGFyICoKK3dkY29weShjb25zdCBjaGFyICp3cCwgQXJlYSAqYXApCit7CisJc2l6ZV90IGxlbiA9IHdkc2Nhbih3cCwgRU9TKSAtIHdwOworCXJldHVybiAobWVtY3B5KGFsbG9jKGxlbiwgYXApLCB3cCwgbGVuKSk7Cit9CisKKy8qIHJldHVybiB0aGUgcG9zaXRpb24gb2YgcHJlZml4IGMgaW4gd3AgcGx1cyAxICovCitjb25zdCBjaGFyICoKK3dkc2Nhbihjb25zdCBjaGFyICp3cCwgaW50IGMpCit7CisJaW50IG5lc3QgPSAwOworCisJd2hpbGUgKDEpCisJCXN3aXRjaCAoKndwKyspIHsKKwkJY2FzZSBFT1M6CisJCQlyZXR1cm4gKHdwKTsKKwkJY2FzZSBBREVMSU06CisJCQlpZiAoYyA9PSBBREVMSU0pCisJCQkJcmV0dXJuICh3cCArIDEpOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBDSEFSOgorCQljYXNlIFFDSEFSOgorCQkJd3ArKzsKKwkJCWJyZWFrOworCQljYXNlIENPTVNVQjoKKwkJY2FzZSBFWFBSU1VCOgorCQkJd2hpbGUgKCp3cCsrICE9IDApCisJCQkJOworCQkJYnJlYWs7CisJCWNhc2UgT1FVT1RFOgorCQljYXNlIENRVU9URToKKwkJCWJyZWFrOworCQljYXNlIE9TVUJTVDoKKwkJCW5lc3QrKzsKKwkJCXdoaWxlICgqd3ArKyAhPSAnXDAnKQorCQkJCTsKKwkJCWJyZWFrOworCQljYXNlIENTVUJTVDoKKwkJCXdwKys7CisJCQlpZiAoYyA9PSBDU1VCU1QgJiYgbmVzdCA9PSAwKQorCQkJCXJldHVybiAod3ApOworCQkJbmVzdC0tOworCQkJYnJlYWs7CisJCWNhc2UgT1BBVDoKKwkJCW5lc3QrKzsKKwkJCXdwKys7CisJCQlicmVhazsKKwkJY2FzZSBTUEFUOgorCQljYXNlIENQQVQ6CisJCQlpZiAoYyA9PSB3cFstMV0gJiYgbmVzdCA9PSAwKQorCQkJCXJldHVybiAod3ApOworCQkJaWYgKHdwWy0xXSA9PSBDUEFUKQorCQkJCW5lc3QtLTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaW50ZXJuYWxfd2FybmluZ2YoCisJCQkgICAgIndkc2NhbjogdW5rbm93biBjaGFyIDB4JXggKGNhcnJ5aW5nIG9uKSIsCisJCQkgICAgd3BbLTFdKTsKKwkJfQorfQorCisvKiByZXR1cm4gYSBjb3B5IG9mIHdwIHdpdGhvdXQgYW55IG9mIHRoZSBtYXJrIHVwIGNoYXJhY3RlcnMgYW5kCisgKiB3aXRoIHF1b3RlIGNoYXJhY3RlcnMgKCIgJyBcKSBzdHJpcHBlZC4KKyAqIChzdHJpbmcgaXMgYWxsb2NhdGVkIGZyb20gQVRFTVApCisgKi8KK2NoYXIgKgord2RzdHJpcChjb25zdCBjaGFyICp3cCwgYm9vbCBrZWVwcSwgYm9vbCBtYWtlX21hZ2ljKQoreworCXN0cnVjdCBzaGYgc2hmOworCWludCBjOworCisJc2hmX3NvcGVuKE5VTEwsIDMyLCBTSEZfV1IgfCBTSEZfRFlOQU1JQywgJnNoZik7CisKKwkvKiBwcm9ibGVtczoKKwkgKglgLi4uYCAtPiAkKC4uLikKKwkgKgl4JHtmb286LSJoaSJ9IC0+IHgke2ZvbzotaGl9CisJICoJeCR7Zm9vOi0naGknfSAtPiB4JHtmb286LWhpfSB1bmxlc3Mga2VlcHEKKwkgKi8KKwl3aGlsZSAoMSkKKwkJc3dpdGNoICgqd3ArKykgeworCQljYXNlIEVPUzoKKwkJCXJldHVybiAoc2hmX3NjbG9zZSgmc2hmKSk7IC8qIG51bGwgdGVybWluYXRlcyAqLworCQljYXNlIEFERUxJTToKKwkJY2FzZSBDSEFSOgorCQkJYyA9ICp3cCsrOworCQkJaWYgKG1ha2VfbWFnaWMgJiYgKElTTUFHSUMoYykgfHwgYyA9PSAnWycgfHwgYyA9PSBOT1QgfHwKKwkJCSAgICBjID09ICctJyB8fCBjID09ICddJyB8fCBjID09ICcqJyB8fCBjID09ICc/JykpCisJCQkJc2hmX3B1dGNoYXIoTUFHSUMsICZzaGYpOworCQkJc2hmX3B1dGNoYXIoYywgJnNoZik7CisJCQlicmVhazsKKwkJY2FzZSBRQ0hBUjoKKwkJCWMgPSAqd3ArKzsKKwkJCWlmIChrZWVwcSAmJiAoYyA9PSAnIicgfHwgYyA9PSAnYCcgfHwgYyA9PSAnJCcgfHwgYyA9PSAnXFwnKSkKKwkJCQlzaGZfcHV0Y2hhcignXFwnLCAmc2hmKTsKKwkJCXNoZl9wdXRjaGFyKGMsICZzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NU1VCOgorCQkJc2hmX3B1dHMoIiQoIiwgJnNoZik7CisJCQl3aGlsZSAoKndwICE9IDApCisJCQkJc2hmX3B1dGNoYXIoKndwKyssICZzaGYpOworCQkJc2hmX3B1dGNoYXIoJyknLCAmc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIEVYUFJTVUI6CisJCQlzaGZfcHV0cygiJCgoIiwgJnNoZik7CisJCQl3aGlsZSAoKndwICE9IDApCisJCQkJc2hmX3B1dGNoYXIoKndwKyssICZzaGYpOworCQkJc2hmX3B1dHMoIikpIiwgJnNoZik7CisJCQlicmVhazsKKwkJY2FzZSBPUVVPVEU6CisJCQlicmVhazsKKwkJY2FzZSBDUVVPVEU6CisJCQlicmVhazsKKwkJY2FzZSBPU1VCU1Q6CisJCQlzaGZfcHV0Y2hhcignJCcsICZzaGYpOworCQkJaWYgKCp3cCsrID09ICd7JykKKwkJCSAgICBzaGZfcHV0Y2hhcigneycsICZzaGYpOworCQkJd2hpbGUgKChjID0gKndwKyspICE9IDApCisJCQkJc2hmX3B1dGNoYXIoYywgJnNoZik7CisJCQlicmVhazsKKwkJY2FzZSBDU1VCU1Q6CisJCQlpZiAoKndwKysgPT0gJ30nKQorCQkJCXNoZl9wdXRjaGFyKCd9JywgJnNoZik7CisJCQlicmVhazsKKwkJY2FzZSBPUEFUOgorCQkJaWYgKG1ha2VfbWFnaWMpIHsKKwkJCQlzaGZfcHV0Y2hhcihNQUdJQywgJnNoZik7CisJCQkJc2hmX3B1dGNoYXIoKndwKysgfCAweDgwLCAmc2hmKTsKKwkJCX0gZWxzZSB7CisJCQkJc2hmX3B1dGNoYXIoKndwKyssICZzaGYpOworCQkJCXNoZl9wdXRjaGFyKCcoJywgJnNoZik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTUEFUOgorCQkJaWYgKG1ha2VfbWFnaWMpCisJCQkJc2hmX3B1dGNoYXIoTUFHSUMsICZzaGYpOworCQkJc2hmX3B1dGNoYXIoJ3wnLCAmc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIENQQVQ6CisJCQlpZiAobWFrZV9tYWdpYykKKwkJCQlzaGZfcHV0Y2hhcihNQUdJQywgJnNoZik7CisJCQlzaGZfcHV0Y2hhcignKScsICZzaGYpOworCQkJYnJlYWs7CisJCX0KK30KKworc3RhdGljIHN0cnVjdCBpb3dvcmQgKioKK2lvY29weShzdHJ1Y3QgaW93b3JkICoqaW93LCBBcmVhICphcCkKK3sKKwlzdHJ1Y3QgaW93b3JkICoqaW9yOworCWludCBpOworCisJZm9yIChpb3IgPSBpb3c7ICppb3IrKyAhPSBOVUxMOyApCisJCTsKKwlpb3IgPSBhbGxvYygoaW9yIC0gaW93ICsgMSkgKiBzaXplb2Yoc3RydWN0IGlvd29yZCAqKSwgYXApOworCisJZm9yIChpID0gMDsgaW93W2ldICE9IE5VTEw7IGkrKykgeworCQlzdHJ1Y3QgaW93b3JkICpwLCAqcTsKKworCQlwID0gaW93W2ldOworCQlxID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb3dvcmQpLCBhcCk7CisJCWlvcltpXSA9IHE7CisJCSpxID0gKnA7CisJCWlmIChwLT5uYW1lICE9IE5VTEwpCisJCQlxLT5uYW1lID0gd2Rjb3B5KHAtPm5hbWUsIGFwKTsKKwkJaWYgKHAtPmRlbGltICE9IE5VTEwpCisJCQlxLT5kZWxpbSA9IHdkY29weShwLT5kZWxpbSwgYXApOworCQlpZiAocC0+aGVyZWRvYyAhPSBOVUxMKQorCQkJc3RyZHVweChxLT5oZXJlZG9jLCBwLT5oZXJlZG9jLCBhcCk7CisJfQorCWlvcltpXSA9IE5VTEw7CisKKwlyZXR1cm4gKGlvcik7Cit9CisKKy8qCisgKiBmcmVlIHRyZWUgKGZvciBmdW5jdGlvbiBkZWZpbml0aW9uKQorICovCit2b2lkCit0ZnJlZShzdHJ1Y3Qgb3AgKnQsIEFyZWEgKmFwKQoreworCWNoYXIgKip3OworCisJaWYgKHQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHQtPnN0ciAhPSBOVUxMKQorCQlhZnJlZSh0LT5zdHIsIGFwKTsKKworCWlmICh0LT52YXJzICE9IE5VTEwpIHsKKwkJZm9yICh3ID0gdC0+dmFyczsgKncgIT0gTlVMTDsgdysrKQorCQkJYWZyZWUoKncsIGFwKTsKKwkJYWZyZWUodC0+dmFycywgYXApOworCX0KKworCWlmICh0LT5hcmdzICE9IE5VTEwpIHsKKwkJdW5pb24gbWtzaF9jY3BoYWNrIGN3OworCQkvKiBYWFggd2UgYXNzdW1lIHRoZSBjYWxsZXIgaXMgcmlnaHQgKi8KKwkJY3cucm8gPSB0LT5hcmdzOworCQlmb3IgKHcgPSBjdy5ydzsgKncgIT0gTlVMTDsgdysrKQorCQkJYWZyZWUoKncsIGFwKTsKKwkJYWZyZWUodC0+YXJncywgYXApOworCX0KKworCWlmICh0LT5pb2FjdCAhPSBOVUxMKQorCQlpb2ZyZWUodC0+aW9hY3QsIGFwKTsKKworCXRmcmVlKHQtPmxlZnQsIGFwKTsKKwl0ZnJlZSh0LT5yaWdodCwgYXApOworCisJYWZyZWUodCwgYXApOworfQorCitzdGF0aWMgdm9pZAoraW9mcmVlKHN0cnVjdCBpb3dvcmQgKippb3csIEFyZWEgKmFwKQoreworCXN0cnVjdCBpb3dvcmQgKippb3A7CisJc3RydWN0IGlvd29yZCAqcDsKKworCWZvciAoaW9wID0gaW93OyAocCA9ICppb3ArKykgIT0gTlVMTDsgKSB7CisJCWlmIChwLT5uYW1lICE9IE5VTEwpCisJCQlhZnJlZShwLT5uYW1lLCBhcCk7CisJCWlmIChwLT5kZWxpbSAhPSBOVUxMKQorCQkJYWZyZWUocC0+ZGVsaW0sIGFwKTsKKwkJaWYgKHAtPmhlcmVkb2MgIT0gTlVMTCkKKwkJCWFmcmVlKHAtPmhlcmVkb2MsIGFwKTsKKwkJYWZyZWUocCwgYXApOworCX0KKwlhZnJlZShpb3csIGFwKTsKK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL3Zhci5jIGIvbWtzaC9zcmMvdmFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5NzI5ZQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL3Zhci5jCkBAIC0wLDAgKzEsMTQ5MCBAQAorLyoJJE9wZW5CU0Q6IHZhci5jLHYgMS4zNCAyMDA3LzEwLzE1IDAyOjE2OjM1IGRlcmFhZHQgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCisjaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjZW5kaWYKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvdmFyLmMsdiAxLjExMCAyMDEwLzA3LzI1IDExOjM1OjQzIHRnIEV4cCAkIik7CisKKy8qCisgKiBWYXJpYWJsZXMKKyAqCisgKiBXQVJOSU5HOiB1bnJlYWRhYmxlIGNvZGUsIG5lZWRzIGEgcmV3cml0ZQorICoKKyAqIGlmIChmbGFnJklOVEVHRVIpLCB2YWwuaSBjb250YWlucyBpbnRlZ2VyIHZhbHVlLCBhbmQgdHlwZSBjb250YWlucyBiYXNlLgorICogb3RoZXJ3aXNlLCAodmFsLnMgKyB0eXBlKSBjb250YWlucyBzdHJpbmcgdmFsdWUuCisgKiBpZiAoZmxhZyZFWFBPUlQpLCB2YWwucyBjb250YWlucyAibmFtZT12YWx1ZSIgZm9yIEUtWiBleHBvcnRpbmcuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGJsIHZ0ZW1wOworc3RhdGljIHN0cnVjdCB0YWJsZSBzcGVjaWFsczsKK3N0YXRpYyBjaGFyICpmb3JtYXRzdHIoc3RydWN0IHRibCAqLCBjb25zdCBjaGFyICopOworc3RhdGljIHZvaWQgZXhwb3J0cHJlcChzdHJ1Y3QgdGJsICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IHNwZWNpYWwoY29uc3QgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHVuc3BlY2lhbChjb25zdCBjaGFyICopOworc3RhdGljIHZvaWQgZ2V0c3BlYyhzdHJ1Y3QgdGJsICopOworc3RhdGljIHZvaWQgc2V0c3BlYyhzdHJ1Y3QgdGJsICopOworc3RhdGljIHZvaWQgdW5zZXRzcGVjKHN0cnVjdCB0YmwgKik7CitzdGF0aWMgaW50IGdldGludChzdHJ1Y3QgdGJsICosIG1rc2hfYXJpX3QgKiwgYm9vbCk7CitzdGF0aWMgbWtzaF9hcmlfdCBpbnR2YWwoc3RydWN0IHRibCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdGJsICphcnJheXNlYXJjaChzdHJ1Y3QgdGJsICosIHVpbnQzMl90KTsKK3N0YXRpYyBjb25zdCBjaGFyICphcnJheV9pbmRleF9jYWxjKGNvbnN0IGNoYXIgKiwgYm9vbCAqLCB1aW50MzJfdCAqKTsKK3N0YXRpYyB1aW50MzJfdCBvYWF0aGFzaF91cGRhdGUocmVnaXN0ZXIgdWludDMyX3QsIHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QgKiwKKyAgICByZWdpc3RlciBzaXplX3QpOworc3RhdGljIHVpbnQzMl90IG9hYXRoYXNoX2ZpbmFsaXNlKHJlZ2lzdGVyIHVpbnQzMl90KTsKKwordWludDhfdCBzZXRfcmVmZmxhZyA9IDA7CisKKy8qCisgKiBjcmVhdGUgYSBuZXcgYmxvY2sgZm9yIGZ1bmN0aW9uIGNhbGxzIGFuZCBzaW1wbGUgY29tbWFuZHMKKyAqIGFzc3VtZSBjYWxsZXIgaGFzIGFsbG9jYXRlZCBhbmQgc2V0IHVwIGUtPmxvYworICovCit2b2lkCituZXdibG9jayh2b2lkKQoreworCXN0cnVjdCBibG9jayAqbDsKKwlzdGF0aWMgY29uc3QgY2hhciAqZW1wdHlbXSA9IHsgbnVsbCB9OworCisJbCA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2spLCBBVEVNUCk7CisJbC0+ZmxhZ3MgPSAwOworCWFpbml0KCZsLT5hcmVhKTsgLyogdG9kbzogY291bGQgdXNlIGUtPmFyZWEgKGwtPmFyZWEgPT4gbC0+YXJlYXApICovCisJaWYgKCFlLT5sb2MpIHsKKwkJbC0+YXJnYyA9IDA7CisJCWwtPmFyZ3YgPSBlbXB0eTsKKwl9IGVsc2UgeworCQlsLT5hcmdjID0gZS0+bG9jLT5hcmdjOworCQlsLT5hcmd2ID0gZS0+bG9jLT5hcmd2OworCX0KKwlsLT5leGl0ID0gbC0+ZXJyb3IgPSBOVUxMOworCWt0aW5pdCgmbC0+dmFycywgJmwtPmFyZWEsIDApOworCWt0aW5pdCgmbC0+ZnVucywgJmwtPmFyZWEsIDApOworCWwtPm5leHQgPSBlLT5sb2M7CisJZS0+bG9jID0gbDsKK30KKworLyoKKyAqIHBvcCBhIGJsb2NrIGhhbmRsaW5nIHNwZWNpYWwgdmFyaWFibGVzCisgKi8KK3ZvaWQKK3BvcGJsb2NrKHZvaWQpCit7CisJc3RydWN0IGJsb2NrICpsID0gZS0+bG9jOworCXN0cnVjdCB0YmwgKnZwLCAqKnZwcCA9IGwtPnZhcnMudGJscywgKnZxOworCWludCBpOworCisJZS0+bG9jID0gbC0+bmV4dDsJLyogcG9wIGJsb2NrICovCisJZm9yIChpID0gbC0+dmFycy5zaXplOyAtLWkgPj0gMDsgKQorCQlpZiAoKHZwID0gKnZwcCsrKSAhPSBOVUxMICYmICh2cC0+ZmxhZyZTUEVDSUFMKSkgeworCQkJaWYgKCh2cSA9IGdsb2JhbCh2cC0+bmFtZSkpLT5mbGFnICYgSVNTRVQpCisJCQkJc2V0c3BlYyh2cSk7CisJCQllbHNlCisJCQkJdW5zZXRzcGVjKHZxKTsKKwkJfQorCWlmIChsLT5mbGFncyAmIEJGX0RPR0VUT1BUUykKKwkJdXNlcl9vcHQgPSBsLT5nZXRvcHRzX3N0YXRlOworCWFmcmVlYWxsKCZsLT5hcmVhKTsKKwlhZnJlZShsLCBBVEVNUCk7Cit9CisKKy8qIGNhbGxlZCBieSBtYWluKCkgdG8gaW5pdGlhbGlzZSB2YXJpYWJsZSBkYXRhIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgVkFSU1BFQ19ERUZOUworI2luY2x1ZGUgInZhcl9zcGVjLmgiCisKK2VudW0gdmFyX3NwZWNzIHsKKyNkZWZpbmUgVkFSU1BFQ19FTlVNUworI2luY2x1ZGUgInZhcl9zcGVjLmgiCisJVl9NQVgKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW5pdHZhcl9uYW1lc1tdID0geworI2RlZmluZSBWQVJTUEVDX0lURU1TCisjaW5jbHVkZSAidmFyX3NwZWMuaCIKK307CisKK3ZvaWQKK2luaXR2YXIodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IHRibCAqdHA7CisKKwlrdGluaXQoJnNwZWNpYWxzLCBBUEVSTSwKKwkgICAgLyogbXVzdCBiZSA4MCUgb2YgMl5uIChjdXJyZW50bHkgMTIgc3BlY2lhbHMpICovIDE2KTsKKwl3aGlsZSAoaSA8IFZfTUFYIC0gMSkgeworCQl0cCA9IGt0ZW50ZXIoJnNwZWNpYWxzLCBpbml0dmFyX25hbWVzW2ldLAorCQkgICAgaGFzaChpbml0dmFyX25hbWVzW2ldKSk7CisJCXRwLT5mbGFnID0gREVGSU5FRHxJU1NFVDsKKwkJdHAtPnR5cGUgPSArK2k7CisJfQorfQorCisvKiBVc2VkIHRvIGNhbGN1bGF0ZSBhbiBhcnJheSBpbmRleCBmb3IgZ2xvYmFsKCkvbG9jYWwoKS4gU2V0cyAqYXJyYXlwIHRvCisgKiB0cnVlIGlmIHRoaXMgaXMgYW4gYXJyYXksIHNldHMgKnZhbHAgdG8gdGhlIGFycmF5IGluZGV4LCByZXR1cm5zCisgKiB0aGUgYmFzZW5hbWUgb2YgdGhlIGFycmF5LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCithcnJheV9pbmRleF9jYWxjKGNvbnN0IGNoYXIgKm4sIGJvb2wgKmFycmF5cCwgdWludDMyX3QgKnZhbHApCit7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgbGVuOworCWNoYXIgKmFwID0gTlVMTDsKKworCSphcnJheXAgPSBmYWxzZTsKKyByZWRvX2Zyb21fcmVmOgorCXAgPSBza2lwX3Zhcm5hbWUobiwgZmFsc2UpOworCWlmICghc2V0X3JlZmZsYWcgJiYgKHAgIT0gbikgJiYga3NoX2lzYWxwaHgoblswXSkpIHsKKwkJc3RydWN0IGJsb2NrICpsID0gZS0+bG9jOworCQlzdHJ1Y3QgdGJsICp2cDsKKwkJY2hhciAqdm47CisJCXVpbnQzMl90IGg7CisKKwkJc3RybmR1cHgodm4sIG4sIHAgLSBuLCBBVEVNUCk7CisJCWggPSBoYXNoKHZuKTsKKwkJLyogY2hlY2sgaWYgdGhpcyBpcyBhIHJlZmVyZW5jZSAqLworCQlkbyB7CisJCQl2cCA9IGt0c2VhcmNoKCZsLT52YXJzLCB2biwgaCk7CisJCX0gd2hpbGUgKCF2cCAmJiAobCA9IGwtPm5leHQpKTsKKwkJYWZyZWUodm4sIEFURU1QKTsKKwkJaWYgKHZwICYmICh2cC0+ZmxhZyAmIChERUZJTkVEfEFTU09DfEFSUkFZKSkgPT0KKwkJICAgIChERUZJTkVEfEFTU09DKSkgeworCQkJY2hhciAqY3A7CisKKwkJCS8qIGdvdGNoYSEgKi8KKwkJCWNwID0gc2hmX3NtcHJpbnRmKCIlcyVzIiwgc3RyX3ZhbCh2cCksIHApOworCQkJYWZyZWUoYXAsIEFURU1QKTsKKwkJCW4gPSBhcCA9IGNwOworCQkJZ290byByZWRvX2Zyb21fcmVmOworCQl9CisJfQorCisJaWYgKHAgIT0gbiAmJiAqcCA9PSAnWycgJiYgKGxlbiA9IGFycmF5X3JlZl9sZW4ocCkpKSB7CisJCWNoYXIgKnN1YiwgKnRtcDsKKwkJbWtzaF9hcmlfdCBydmFsOworCisJCS8qIENhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgdGhlIHN1YnNjcmlwdCAqLworCQkqYXJyYXlwID0gdHJ1ZTsKKwkJc3RybmR1cHgodG1wLCBwICsgMSwgbGVuIC0gMiwgQVRFTVApOworCQlzdWIgPSBzdWJzdGl0dXRlKHRtcCwgMCk7CisJCWFmcmVlKHRtcCwgQVRFTVApOworCQlzdHJuZHVweChuLCBuLCBwIC0gbiwgQVRFTVApOworCQlldmFsdWF0ZShzdWIsICZydmFsLCBLU0hfVU5XSU5EX0VSUk9SLCB0cnVlKTsKKwkJKnZhbHAgPSAodWludDMyX3QpcnZhbDsKKwkJYWZyZWUoc3ViLCBBVEVNUCk7CisJfQorCXJldHVybiAobik7Cit9CisKKy8qCisgKiBTZWFyY2ggZm9yIHZhcmlhYmxlLCBpZiBub3QgZm91bmQgY3JlYXRlIGdsb2JhbGx5LgorICovCitzdHJ1Y3QgdGJsICoKK2dsb2JhbChjb25zdCBjaGFyICpuKQoreworCXN0cnVjdCBibG9jayAqbCA9IGUtPmxvYzsKKwlzdHJ1Y3QgdGJsICp2cDsKKwlpbnQgYzsKKwlib29sIGFycmF5OworCXVpbnQzMl90IGgsIHZhbDsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGFycmF5ICovCisJbiA9IGFycmF5X2luZGV4X2NhbGMobiwgJmFycmF5LCAmdmFsKTsKKwloID0gaGFzaChuKTsKKwljID0gblswXTsKKwlpZiAoIWtzaF9pc2FscGh4KGMpKSB7CisJCWlmIChhcnJheSkKKwkJCWVycm9yZigiYmFkIHN1YnN0aXR1dGlvbiIpOworCQl2cCA9ICZ2dGVtcDsKKwkJdnAtPmZsYWcgPSBERUZJTkVEOworCQl2cC0+dHlwZSA9IDA7CisJCXZwLT5hcmVhcCA9IEFURU1QOworCQkqdnAtPm5hbWUgPSBjOworCQlpZiAoa3NoX2lzZGlnaXQoYykpIHsKKwkJCWZvciAoYyA9IDA7IGtzaF9pc2RpZ2l0KCpuKTsgbisrKQorCQkJCWMgPSBjKjEwICsgKm4tJzAnOworCQkJaWYgKGMgPD0gbC0+YXJnYykKKwkJCQkvKiBzZXRzdHIgY2FuJ3QgZmFpbCBoZXJlICovCisJCQkJc2V0c3RyKHZwLCBsLT5hcmd2W2NdLCBLU0hfUkVUVVJOX0VSUk9SKTsKKwkJCXZwLT5mbGFnIHw9IFJET05MWTsKKwkJCXJldHVybiAodnApOworCQl9CisJCXZwLT5mbGFnIHw9IFJET05MWTsKKwkJaWYgKG5bMV0gIT0gJ1wwJykKKwkJCXJldHVybiAodnApOworCQl2cC0+ZmxhZyB8PSBJU1NFVHxJTlRFR0VSOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnJCc6CisJCQl2cC0+dmFsLmkgPSBrc2hwaWQ7CisJCQlicmVhazsKKwkJY2FzZSAnISc6CisJCQkvKiBJZiBubyBqb2IsIGV4cGFuZCB0byBub3RoaW5nICovCisJCQlpZiAoKHZwLT52YWwuaSA9IGpfYXN5bmMoKSkgPT0gMCkKKwkJCQl2cC0+ZmxhZyAmPSB+KElTU0VUfElOVEVHRVIpOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJdnAtPnZhbC5pID0gZXhzdGF0OworCQkJYnJlYWs7CisJCWNhc2UgJyMnOgorCQkJdnAtPnZhbC5pID0gbC0+YXJnYzsKKwkJCWJyZWFrOworCQljYXNlICctJzoKKwkJCXZwLT5mbGFnICY9IH5JTlRFR0VSOworCQkJdnAtPnZhbC5zID0gZ2V0b3B0aW9ucygpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2cC0+ZmxhZyAmPSB+KElTU0VUfElOVEVHRVIpOworCQl9CisJCXJldHVybiAodnApOworCX0KKwlmb3IgKGwgPSBlLT5sb2M7IDsgbCA9IGwtPm5leHQpIHsKKwkJdnAgPSBrdHNlYXJjaCgmbC0+dmFycywgbiwgaCk7CisJCWlmICh2cCAhPSBOVUxMKSB7CisJCQlpZiAoYXJyYXkpCisJCQkJcmV0dXJuIChhcnJheXNlYXJjaCh2cCwgdmFsKSk7CisJCQllbHNlCisJCQkJcmV0dXJuICh2cCk7CisJCX0KKwkJaWYgKGwtPm5leHQgPT0gTlVMTCkKKwkJCWJyZWFrOworCX0KKwl2cCA9IGt0ZW50ZXIoJmwtPnZhcnMsIG4sIGgpOworCWlmIChhcnJheSkKKwkJdnAgPSBhcnJheXNlYXJjaCh2cCwgdmFsKTsKKwl2cC0+ZmxhZyB8PSBERUZJTkVEOworCWlmIChzcGVjaWFsKG4pKQorCQl2cC0+ZmxhZyB8PSBTUEVDSUFMOworCXJldHVybiAodnApOworfQorCisvKgorICogU2VhcmNoIGZvciBsb2NhbCB2YXJpYWJsZSwgaWYgbm90IGZvdW5kIGNyZWF0ZSBsb2NhbGx5LgorICovCitzdHJ1Y3QgdGJsICoKK2xvY2FsKGNvbnN0IGNoYXIgKm4sIGJvb2wgY29weSkKK3sKKwlzdHJ1Y3QgYmxvY2sgKmwgPSBlLT5sb2M7CisJc3RydWN0IHRibCAqdnA7CisJYm9vbCBhcnJheTsKKwl1aW50MzJfdCBoLCB2YWw7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhbiBhcnJheSAqLworCW4gPSBhcnJheV9pbmRleF9jYWxjKG4sICZhcnJheSwgJnZhbCk7CisJaCA9IGhhc2gobik7CisJaWYgKCFrc2hfaXNhbHBoeCgqbikpIHsKKwkJdnAgPSAmdnRlbXA7CisJCXZwLT5mbGFnID0gREVGSU5FRHxSRE9OTFk7CisJCXZwLT50eXBlID0gMDsKKwkJdnAtPmFyZWFwID0gQVRFTVA7CisJCXJldHVybiAodnApOworCX0KKwl2cCA9IGt0ZW50ZXIoJmwtPnZhcnMsIG4sIGgpOworCWlmIChjb3B5ICYmICEodnAtPmZsYWcgJiBERUZJTkVEKSkgeworCQlzdHJ1Y3QgYmxvY2sgKmxsID0gbDsKKwkJc3RydWN0IHRibCAqdnEgPSBOVUxMOworCisJCXdoaWxlICgobGwgPSBsbC0+bmV4dCkgJiYgISh2cSA9IGt0c2VhcmNoKCZsbC0+dmFycywgbiwgaCkpKQorCQkJOworCQlpZiAodnEpIHsKKwkJCXZwLT5mbGFnIHw9IHZxLT5mbGFnICYKKwkJCSAgICAoRVhQT1JUIHwgSU5URUdFUiB8IFJET05MWSB8IExKVVNUIHwgUkpVU1QgfAorCQkJICAgIFpFUk9GSUwgfCBMQ0FTRVYgfCBVQ0FTRVZfQUwgfCBJTlRfVSB8IElOVF9MKTsKKwkJCWlmICh2cS0+ZmxhZyAmIElOVEVHRVIpCisJCQkJdnAtPnR5cGUgPSB2cS0+dHlwZTsKKwkJCXZwLT51Mi5maWVsZCA9IHZxLT51Mi5maWVsZDsKKwkJfQorCX0KKwlpZiAoYXJyYXkpCisJCXZwID0gYXJyYXlzZWFyY2godnAsIHZhbCk7CisJdnAtPmZsYWcgfD0gREVGSU5FRDsKKwlpZiAoc3BlY2lhbChuKSkKKwkJdnAtPmZsYWcgfD0gU1BFQ0lBTDsKKwlyZXR1cm4gKHZwKTsKK30KKworLyogZ2V0IHZhcmlhYmxlIHN0cmluZyB2YWx1ZSAqLworY2hhciAqCitzdHJfdmFsKHN0cnVjdCB0YmwgKnZwKQoreworCWNoYXIgKnM7CisKKwlpZiAoKHZwLT5mbGFnJlNQRUNJQUwpKQorCQlnZXRzcGVjKHZwKTsKKwlpZiAoISh2cC0+ZmxhZyZJU1NFVCkpCisJCXMgPSBudWxsOwkJLyogc3BlY2lhbCB0byBkb2xsYXIoKSAqLworCWVsc2UgaWYgKCEodnAtPmZsYWcmSU5URUdFUikpCS8qIHN0cmluZyBzb3VyY2UgKi8KKwkJcyA9IHZwLT52YWwucyArIHZwLT50eXBlOworCWVsc2UgewkJCQkvKiBpbnRlZ2VyIHNvdXJjZSAqLworCQkvKiB3b3JzdCBjYXNlIG51bWJlciBsZW5ndGggaXMgd2hlbiBiYXNlPTIgKi8KKwkJLyogMSAobWludXMpICsgMiAoYmFzZSwgdXAgdG8gMzYpICsgMSAoJyMnKSArIG51bWJlciBvZiBiaXRzCisJCSAqIGluIHRoZSBta3NoX3VhcmlfdCArIDEgKE5VTCkgKi8KKwkJY2hhciBzdHJidWZbMSArIDIgKyAxICsgOCAqIHNpemVvZihta3NoX3VhcmlfdCkgKyAxXTsKKwkJY29uc3QgY2hhciAqZGlnaXRzID0gKHZwLT5mbGFnICYgVUNBU0VWX0FMKSA/CisJCSAgICBkaWdpdHNfdWMgOiBkaWdpdHNfbGM7CisJCW1rc2hfdWFyaV90IG47CisJCWludCBiYXNlOworCisJCXMgPSBzdHJidWYgKyBzaXplb2Yoc3RyYnVmKTsKKwkJaWYgKHZwLT5mbGFnICYgSU5UX1UpCisJCQluID0gdnAtPnZhbC51OworCQllbHNlCisJCQluID0gKHZwLT52YWwuaSA8IDApID8gLXZwLT52YWwuaSA6IHZwLT52YWwuaTsKKwkJYmFzZSA9ICh2cC0+dHlwZSA9PSAwKSA/IDEwIDogdnAtPnR5cGU7CisKKwkJaWYgKGJhc2UgPT0gMSkgeworCQkJc2l6ZV90IHN6ID0gMTsKKworCQkJKihzID0gc3RyYnVmKSA9ICcxJzsKKwkJCXNbMV0gPSAnIyc7CisJCQlpZiAoIVVURk1PREUgfHwgKChuICYgMHhGRjgwKSA9PSAweEVGODApKQorCQkJCS8qIE9QVFUtMTYgLT4gcmF3IG9jdGV0ICovCisJCQkJc1syXSA9IG4gJiAweEZGOworCQkJZWxzZQorCQkJCXN6ID0gdXRmX3djdG9tYihzICsgMiwgbik7CisJCQlzWzIgKyBzel0gPSAnXDAnOworCQl9IGVsc2UgeworCQkJKi0tcyA9ICdcMCc7CisJCQlkbyB7CisJCQkJKi0tcyA9IGRpZ2l0c1tuICUgYmFzZV07CisJCQkJbiAvPSBiYXNlOworCQkJfSB3aGlsZSAobiAhPSAwKTsKKwkJCWlmIChiYXNlICE9IDEwKSB7CisJCQkJKi0tcyA9ICcjJzsKKwkJCQkqLS1zID0gZGlnaXRzW2Jhc2UgJSAxMF07CisJCQkJaWYgKGJhc2UgPj0gMTApCisJCQkJCSotLXMgPSBkaWdpdHNbYmFzZSAvIDEwXTsKKwkJCX0KKwkJCWlmICghKHZwLT5mbGFnICYgSU5UX1UpICYmIHZwLT52YWwuaSA8IDApCisJCQkJKi0tcyA9ICctJzsKKwkJfQorCQlpZiAodnAtPmZsYWcgJiAoUkpVU1R8TEpVU1QpKSAvKiBjYXNlIGFscmVhZHkgZGVhbHQgd2l0aCAqLworCQkJcyA9IGZvcm1hdHN0cih2cCwgcyk7CisJCWVsc2UKKwkJCXN0cmR1cHgocywgcywgQVRFTVApOworCX0KKwlyZXR1cm4gKHMpOworfQorCisvKiBnZXQgdmFyaWFibGUgaW50ZWdlciB2YWx1ZSwgd2l0aCBlcnJvciBjaGVja2luZyAqLworc3RhdGljIG1rc2hfYXJpX3QKK2ludHZhbChzdHJ1Y3QgdGJsICp2cCkKK3sKKwlta3NoX2FyaV90IG51bTsKKwlpbnQgYmFzZTsKKworCWJhc2UgPSBnZXRpbnQodnAsICZudW0sIGZhbHNlKTsKKwlpZiAoYmFzZSA9PSAtMSkKKwkJLyogWFhYIGNoZWNrIGNhbGxzIC0gaXMgZXJyb3IgaGVyZSBvayBieSBQT1NJWD8gKi8KKwkJZXJyb3JmKCIlczogYmFkIG51bWJlciIsIHN0cl92YWwodnApKTsKKwlyZXR1cm4gKG51bSk7Cit9CisKKy8qIHNldCB2YXJpYWJsZSB0byBzdHJpbmcgdmFsdWUgKi8KK2ludAorc2V0c3RyKHN0cnVjdCB0YmwgKnZxLCBjb25zdCBjaGFyICpzLCBpbnQgZXJyb3Jfb2spCit7CisJY2hhciAqc2FsbG9jID0gTlVMTDsKKwlpbnQgbm9fcm9fY2hlY2sgPSBlcnJvcl9vayAmIDB4NDsKKworCWVycm9yX29rICY9IH4weDQ7CisJaWYgKCh2cS0+ZmxhZyAmIFJET05MWSkgJiYgIW5vX3JvX2NoZWNrKSB7CisJCXdhcm5pbmdmKHRydWUsICIlczogaXMgcmVhZCBvbmx5IiwgdnEtPm5hbWUpOworCQlpZiAoIWVycm9yX29rKQorCQkJZXJyb3JmeigpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoISh2cS0+ZmxhZyZJTlRFR0VSKSkgeyAvKiBzdHJpbmcgZGVzdCAqLworCQlpZiAoKHZxLT5mbGFnJkFMTE9DKSkgeworCQkJLyogZGVidWdnaW5nICovCisJCQlpZiAocyA+PSB2cS0+dmFsLnMgJiYKKwkJCSAgICBzIDw9IHZxLT52YWwucyArIHN0cmxlbih2cS0+dmFsLnMpKQorCQkJCWludGVybmFsX2Vycm9yZigKKwkJCQkgICAgInNldHN0cjogJXM9JXM6IGFzc2lnbmluZyB0byBzZWxmIiwKKwkJCQkgICAgdnEtPm5hbWUsIHMpOworCQkJYWZyZWUodnEtPnZhbC5zLCB2cS0+YXJlYXApOworCQl9CisJCXZxLT5mbGFnICY9IH4oSVNTRVR8QUxMT0MpOworCQl2cS0+dHlwZSA9IDA7CisJCWlmIChzICYmICh2cS0+ZmxhZyAmIChVQ0FTRVZfQUx8TENBU0VWfExKVVNUfFJKVVNUKSkpCisJCQlzID0gc2FsbG9jID0gZm9ybWF0c3RyKHZxLCBzKTsKKwkJaWYgKCh2cS0+ZmxhZyZFWFBPUlQpKQorCQkJZXhwb3J0cHJlcCh2cSwgcyk7CisJCWVsc2UgeworCQkJc3RyZHVweCh2cS0+dmFsLnMsIHMsIHZxLT5hcmVhcCk7CisJCQl2cS0+ZmxhZyB8PSBBTExPQzsKKwkJfQorCX0gZWxzZSB7CQkvKiBpbnRlZ2VyIGRlc3QgKi8KKwkJaWYgKCF2X2V2YWx1YXRlKHZxLCBzLCBlcnJvcl9vaywgdHJ1ZSkpCisJCQlyZXR1cm4gKDApOworCX0KKwl2cS0+ZmxhZyB8PSBJU1NFVDsKKwlpZiAoKHZxLT5mbGFnJlNQRUNJQUwpKQorCQlzZXRzcGVjKHZxKTsKKwlhZnJlZShzYWxsb2MsIEFURU1QKTsKKwlyZXR1cm4gKDEpOworfQorCisvKiBzZXQgdmFyaWFibGUgdG8gaW50ZWdlciAqLwordm9pZAorc2V0aW50KHN0cnVjdCB0YmwgKnZxLCBta3NoX2FyaV90IG4pCit7CisJaWYgKCEodnEtPmZsYWcmSU5URUdFUikpIHsKKwkJc3RydWN0IHRibCAqdnAgPSAmdnRlbXA7CisJCXZwLT5mbGFnID0gKElTU0VUfElOVEVHRVIpOworCQl2cC0+dHlwZSA9IDA7CisJCXZwLT5hcmVhcCA9IEFURU1QOworCQl2cC0+dmFsLmkgPSBuOworCQkvKiBzZXRzdHIgY2FuJ3QgZmFpbCBoZXJlICovCisJCXNldHN0cih2cSwgc3RyX3ZhbCh2cCksIEtTSF9SRVRVUk5fRVJST1IpOworCX0gZWxzZQorCQl2cS0+dmFsLmkgPSBuOworCXZxLT5mbGFnIHw9IElTU0VUOworCWlmICgodnEtPmZsYWcmU1BFQ0lBTCkpCisJCXNldHNwZWModnEpOworfQorCitzdGF0aWMgaW50CitnZXRpbnQoc3RydWN0IHRibCAqdnAsIG1rc2hfYXJpX3QgKm51bXAsIGJvb2wgYXJpdGgpCit7CisJY2hhciAqczsKKwlpbnQgYywgYmFzZSwgbmVnOworCWJvb2wgaGF2ZV9iYXNlID0gZmFsc2U7CisJbWtzaF9hcmlfdCBudW07CisKKwlpZiAodnAtPmZsYWcmU1BFQ0lBTCkKKwkJZ2V0c3BlYyh2cCk7CisJLyogWFhYIGlzIGl0IHBvc3NpYmxlIGZvciBJU1NFVCB0byBiZSBzZXQgYW5kIHZhbC5zIHRvIGJlIDA/ICovCisJaWYgKCEodnAtPmZsYWcmSVNTRVQpIHx8ICghKHZwLT5mbGFnJklOVEVHRVIpICYmIHZwLT52YWwucyA9PSBOVUxMKSkKKwkJcmV0dXJuICgtMSk7CisJaWYgKHZwLT5mbGFnJklOVEVHRVIpIHsKKwkJKm51bXAgPSB2cC0+dmFsLmk7CisJCXJldHVybiAodnAtPnR5cGUpOworCX0KKwlzID0gdnAtPnZhbC5zICsgdnAtPnR5cGU7CisJaWYgKHMgPT0gTlVMTCkJLyogcmVkdW5kYW50IGdpdmVuIGluaXRpYWwgdGVzdCAqLworCQlzID0gbnVsbDsKKwliYXNlID0gMTA7CisJbnVtID0gMDsKKwluZWcgPSAwOworCWlmIChhcml0aCAmJiAqcyA9PSAnMCcgJiYgKihzKzEpKSB7CisJCXMrKzsKKwkJaWYgKCpzID09ICd4JyB8fCAqcyA9PSAnWCcpIHsKKwkJCXMrKzsKKwkJCWJhc2UgPSAxNjsKKwkJfSBlbHNlIGlmICh2cC0+ZmxhZyAmIFpFUk9GSUwpIHsKKwkJCXdoaWxlICgqcyA9PSAnMCcpCisJCQkJcysrOworCQl9IGVsc2UKKwkJCWJhc2UgPSA4OworCQloYXZlX2Jhc2UgPSB0cnVlOworCX0KKwlmb3IgKGMgPSAqcysrOyBjIDsgYyA9ICpzKyspIHsKKwkJaWYgKGMgPT0gJy0nKSB7CisJCQluZWcrKzsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGMgPT0gJyMnKSB7CisJCQliYXNlID0gKGludCludW07CisJCQlpZiAoaGF2ZV9iYXNlIHx8IGJhc2UgPCAxIHx8IGJhc2UgPiAzNikKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWlmIChiYXNlID09IDEpIHsKKwkJCQl1bnNpZ25lZCBpbnQgd2M7CisKKwkJCQlpZiAoIVVURk1PREUpCisJCQkJCXdjID0gKih1bnNpZ25lZCBjaGFyICopczsKKwkJCQllbHNlIGlmICh1dGZfbWJ0b3djKCZ3YywgcykgPT0gKHNpemVfdCktMSkKKwkJCQkJLyogT1BUVS04IC0+IE9QVFUtMTYgKi8KKwkJCQkJLyoKKwkJCQkJICogKHdpdGggYSB0d2lzdDogMSNcdUVGODAgY29udmVydHMKKwkJCQkJICogdGhlIHNhbWUgYXMgMSNceDgwIGRvZXMsIHRodXMgaXMKKwkJCQkJICogbm90IHJvdW5kLXRyaXBwaW5nIGNvcnJlY3RseSBYWFgpCisJCQkJCSAqLworCQkJCQl3YyA9IDB4RUYwMCArICoodW5zaWduZWQgY2hhciAqKXM7CisJCQkJKm51bXAgPSAobWtzaF9hcmlfdCl3YzsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQkJbnVtID0gMDsKKwkJCWhhdmVfYmFzZSA9IHRydWU7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChrc2hfaXNkaWdpdChjKSkKKwkJCWMgLT0gJzAnOworCQllbHNlIGlmIChrc2hfaXNsb3dlcihjKSkKKwkJCWMgLT0gJ2EnIC0gMTA7CisJCWVsc2UgaWYgKGtzaF9pc3VwcGVyKGMpKQorCQkJYyAtPSAnQScgLSAxMDsKKwkJZWxzZQorCQkJcmV0dXJuICgtMSk7CisJCWlmIChjIDwgMCB8fCBjID49IGJhc2UpCisJCQlyZXR1cm4gKC0xKTsKKwkJbnVtID0gbnVtICogYmFzZSArIGM7CisJfQorCWlmIChuZWcpCisJCW51bSA9IC1udW07CisJKm51bXAgPSBudW07CisJcmV0dXJuIChiYXNlKTsKK30KKworLyogY29udmVydCB2YXJpYWJsZSB2cSB0byBpbnRlZ2VyIHZhcmlhYmxlLCBzZXR0aW5nIGl0cyB2YWx1ZSBmcm9tIHZwCisgKiAodnEgYW5kIHZwIG1heSBiZSB0aGUgc2FtZSkKKyAqLworc3RydWN0IHRibCAqCitzZXRpbnRfdihzdHJ1Y3QgdGJsICp2cSwgc3RydWN0IHRibCAqdnAsIGJvb2wgYXJpdGgpCit7CisJaW50IGJhc2U7CisJbWtzaF9hcmlfdCBudW07CisKKwlpZiAoKGJhc2UgPSBnZXRpbnQodnAsICZudW0sIGFyaXRoKSkgPT0gLTEpCisJCXJldHVybiAoTlVMTCk7CisJaWYgKCEodnEtPmZsYWcgJiBJTlRFR0VSKSAmJiAodnEtPmZsYWcgJiBBTExPQykpIHsKKwkJdnEtPmZsYWcgJj0gfkFMTE9DOworCQlhZnJlZSh2cS0+dmFsLnMsIHZxLT5hcmVhcCk7CisJfQorCXZxLT52YWwuaSA9IG51bTsKKwlpZiAodnEtPnR5cGUgPT0gMCkgLyogZGVmYXVsdCBiYXNlICovCisJCXZxLT50eXBlID0gYmFzZTsKKwl2cS0+ZmxhZyB8PSBJU1NFVHxJTlRFR0VSOworCWlmICh2cS0+ZmxhZyZTUEVDSUFMKQorCQlzZXRzcGVjKHZxKTsKKwlyZXR1cm4gKHZxKTsKK30KKworc3RhdGljIGNoYXIgKgorZm9ybWF0c3RyKHN0cnVjdCB0YmwgKnZwLCBjb25zdCBjaGFyICpzKQoreworCWludCBvbGVuLCBubGVuOworCWNoYXIgKnAsICpxOworCXNpemVfdCBwc2l6OworCisJb2xlbiA9IHV0Zl9tYnN3aWR0aChzKTsKKworCWlmICh2cC0+ZmxhZyAmIChSSlVTVHxMSlVTVCkpIHsKKwkJaWYgKCF2cC0+dTIuZmllbGQpCS8qIGRlZmF1bHQgZmllbGQgd2lkdGggKi8KKwkJCXZwLT51Mi5maWVsZCA9IG9sZW47CisJCW5sZW4gPSB2cC0+dTIuZmllbGQ7CisJfSBlbHNlCisJCW5sZW4gPSBvbGVuOworCisJcCA9IGFsbG9jKChwc2l6ID0gbmxlbiAqIC8qIE1CX0xFTl9NQVggKi8gMyArIDEpLCBBVEVNUCk7CisJaWYgKHZwLT5mbGFnICYgKFJKVVNUfExKVVNUKSkgeworCQlpbnQgc2xlbiA9IG9sZW4sIGkgPSAwOworCisJCWlmICh2cC0+ZmxhZyAmIFJKVVNUKSB7CisJCQljb25zdCBjaGFyICpxcSA9IHM7CisJCQlpbnQgbiA9IDA7CisKKwkJCXdoaWxlIChpIDwgc2xlbikKKwkJCQlpICs9IHV0Zl93aWR0aGFkaihxcSwgJnFxKTsKKwkJCS8qIHN0cmlwIHRyYWlsaW5nIHNwYWNlcyAoQVQmVCB1c2VzIHFxWy0xXSA9PSAnICcpICovCisJCQl3aGlsZSAocXEgPiBzICYmIGtzaF9pc3NwYWNlKHFxWy0xXSkpIHsKKwkJCQktLXFxOworCQkJCS0tc2xlbjsKKwkJCX0KKwkJCWlmICh2cC0+ZmxhZyAmIFpFUk9GSUwgJiYgdnAtPmZsYWcgJiBJTlRFR0VSKSB7CisJCQkJaWYgKHNbMV0gPT0gJyMnKQorCQkJCQluID0gMjsKKwkJCQllbHNlIGlmIChzWzJdID09ICcjJykKKwkJCQkJbiA9IDM7CisJCQkJaWYgKHZwLT51Mi5maWVsZCA8PSBuKQorCQkJCQluID0gMDsKKwkJCX0KKwkJCWlmIChuKSB7CisJCQkJbWVtY3B5KHAsIHMsIG4pOworCQkJCXMgKz0gbjsKKwkJCX0KKwkJCXdoaWxlIChzbGVuID4gdnAtPnUyLmZpZWxkKQorCQkJCXNsZW4gLT0gdXRmX3dpZHRoYWRqKHMsICZzKTsKKwkJCWlmICh2cC0+dTIuZmllbGQgLSBzbGVuKQorCQkJCW1lbXNldChwICsgbiwgKHZwLT5mbGFnICYgWkVST0ZJTCkgPyAnMCcgOiAnICcsCisJCQkJICAgIHZwLT51Mi5maWVsZCAtIHNsZW4pOworCQkJc2xlbiAtPSBuOworCQkJc2hmX3NucHJpbnRmKHAgKyB2cC0+dTIuZmllbGQgLSBzbGVuLAorCQkJICAgIHBzaXogLSAodnAtPnUyLmZpZWxkIC0gc2xlbiksCisJCQkgICAgIiUuKnMiLCBzbGVuLCBzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHN0cmlwIGxlYWRpbmcgc3BhY2VzL3plcm9zICovCisJCQl3aGlsZSAoa3NoX2lzc3BhY2UoKnMpKQorCQkJCXMrKzsKKwkJCWlmICh2cC0+ZmxhZyAmIFpFUk9GSUwpCisJCQkJd2hpbGUgKCpzID09ICcwJykKKwkJCQkJcysrOworCQkJc2hmX3NucHJpbnRmKHAsIG5sZW4gKyAxLCAiJS0qLipzIiwKKwkJCQl2cC0+dTIuZmllbGQsIHZwLT51Mi5maWVsZCwgcyk7CisJCX0KKwl9IGVsc2UKKwkJbWVtY3B5KHAsIHMsIHN0cmxlbihzKSArIDEpOworCisJaWYgKHZwLT5mbGFnICYgVUNBU0VWX0FMKSB7CisJCWZvciAocSA9IHA7ICpxOyBxKyspCisJCQkqcSA9IGtzaF90b3VwcGVyKCpxKTsKKwl9IGVsc2UgaWYgKHZwLT5mbGFnICYgTENBU0VWKSB7CisJCWZvciAocSA9IHA7ICpxOyBxKyspCisJCQkqcSA9IGtzaF90b2xvd2VyKCpxKTsKKwl9CisKKwlyZXR1cm4gKHApOworfQorCisvKgorICogbWFrZSB2cC0+dmFsLnMgYmUgIm5hbWU9dmFsdWUiIGZvciBxdWljayBleHBvcnRpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitleHBvcnRwcmVwKHN0cnVjdCB0YmwgKnZwLCBjb25zdCBjaGFyICp2YWwpCit7CisJY2hhciAqeHA7CisJY2hhciAqb3AgPSAodnAtPmZsYWcmQUxMT0MpID8gdnAtPnZhbC5zIDogTlVMTDsKKwlpbnQgbmFtZWxlbiA9IHN0cmxlbih2cC0+bmFtZSk7CisJaW50IHZhbGxlbiA9IHN0cmxlbih2YWwpICsgMTsKKworCXZwLT5mbGFnIHw9IEFMTE9DOworCXhwID0gYWxsb2MobmFtZWxlbiArIDEgKyB2YWxsZW4sIHZwLT5hcmVhcCk7CisJbWVtY3B5KHZwLT52YWwucyA9IHhwLCB2cC0+bmFtZSwgbmFtZWxlbik7CisJeHAgKz0gbmFtZWxlbjsKKwkqeHArKyA9ICc9JzsKKwl2cC0+dHlwZSA9IHhwIC0gdnAtPnZhbC5zOyAvKiBvZmZzZXQgdG8gdmFsdWUgKi8KKwltZW1jcHkoeHAsIHZhbCwgdmFsbGVuKTsKKwlpZiAob3AgIT0gTlVMTCkKKwkJYWZyZWUob3AsIHZwLT5hcmVhcCk7Cit9CisKKy8qCisgKiBsb29rdXAgdmFyaWFibGUgKGFjY29yZGluZyB0byAoc2V0JkxPQ0FMKSksCisgKiBzZXQgaXRzIGF0dHJpYnV0ZXMgKElOVEVHRVIsIFJET05MWSwgRVhQT1JULCBUUkFDRSwgTEpVU1QsIFJKVVNULCBaRVJPRklMLAorICogTENBU0VWLCBVQ0FTRVZfQUwpLCBhbmQgb3B0aW9uYWxseSBzZXQgaXRzIHZhbHVlIGlmIGFuIGFzc2lnbm1lbnQuCisgKi8KK3N0cnVjdCB0YmwgKgordHlwZXNldChjb25zdCBjaGFyICp2YXIsIFRmbGFnIHNldCwgVGZsYWcgY2xyLCBpbnQgZmllbGQsIGludCBiYXNlKQoreworCXN0cnVjdCB0YmwgKnZwOworCXN0cnVjdCB0YmwgKnZwYmFzZSwgKnQ7CisJY2hhciAqdHZhcjsKKwljb25zdCBjaGFyICp2YWw7CisJaW50IGxlbjsKKworCS8qIGNoZWNrIGZvciB2YWxpZCB2YXJpYWJsZSBuYW1lLCBzZWFyY2ggZm9yIHZhbHVlICovCisJdmFsID0gc2tpcF92YXJuYW1lKHZhciwgZmFsc2UpOworCWlmICh2YWwgPT0gdmFyKQorCQlyZXR1cm4gKE5VTEwpOworCW1rc3NlcnQodmFyICE9IE5VTEwpOworCW1rc3NlcnQoKnZhciAhPSAwKTsKKwlpZiAoKnZhbCA9PSAnWycpIHsKKwkJaWYgKHNldF9yZWZmbGFnKQorCQkJZXJyb3JmKCIlczogcmVmZXJlbmNlIHZhcmlhYmxlIGNhbm5vdCBiZSBhbiBhcnJheSIsCisJCQkgICAgdmFyKTsKKwkJbGVuID0gYXJyYXlfcmVmX2xlbih2YWwpOworCQlpZiAobGVuID09IDApCisJCQlyZXR1cm4gKE5VTEwpOworCQkvKiBJTVBPUlQgaXMgb25seSB1c2VkIHdoZW4gdGhlIHNoZWxsIHN0YXJ0cyB1cCBhbmQgaXMKKwkJICogc2V0dGluZyB1cCBpdHMgZW52aXJvbm1lbnQuIEFsbG93IG9ubHkgc2ltcGxlIGFycmF5CisJCSAqIHJlZmVyZW5jZXMgYXQgdGhpcyB0aW1lIHNpbmNlIHBhcmFtZXRlci9jb21tYW5kIHN1YnN0aXR1dGlvbgorCQkgKiBpcyBwcmVmb3JtZWQgb24gdGhlIFtleHByZXNzaW9uXSB3aGljaCB3b3VsZCBiZSBhIG1ham9yCisJCSAqIHNlY3VyaXR5IGhvbGUuCisJCSAqLworCQlpZiAoc2V0ICYgSU1QT1JUKSB7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDE7IGkgPCBsZW4gLSAxOyBpKyspCisJCQkJaWYgKCFrc2hfaXNkaWdpdCh2YWxbaV0pKQorCQkJCQlyZXR1cm4gKE5VTEwpOworCQl9CisJCXZhbCArPSBsZW47CisJfQorCWlmICgqdmFsID09ICc9JykKKwkJc3RybmR1cHgodHZhciwgdmFyLCB2YWwrKyAtIHZhciwgQVRFTVApOworCWVsc2UgeworCQkvKiBJbXBvcnRpbmcgZnJvbSBvcmlnaW5hbCBlbnZpcm9ubWVudDogbXVzdCBoYXZlIGFuID0gKi8KKwkJaWYgKHNldCAmIElNUE9SVCkKKwkJCXJldHVybiAoTlVMTCk7CisJCXN0cmR1cHgodHZhciwgdmFyLCBBVEVNUCk7CisJCXZhbCA9IE5VTEw7CisJCS8qIGhhbmRsZSBmb29bKl0g4oeSIGZvbyAod2hvbGUgYXJyYXkpIG1hcHBpbmcgZm9yIFIzOWIgKi8KKwkJbGVuID0gc3RybGVuKHR2YXIpOworCQlpZiAobGVuID4gMyAmJiB0dmFyW2xlbi0zXSA9PSAnWycgJiYgdHZhcltsZW4tMl0gPT0gJyonICYmCisJCSAgICB0dmFyW2xlbi0xXSA9PSAnXScpCisJCQl0dmFyW2xlbi0zXSA9ICdcMCc7CisJfQorCisJLyogUHJldmVudCB0eXBlc2V0IGZyb20gY3JlYXRpbmcgYSBsb2NhbCBQQVRIL0VOVi9TSEVMTCAqLworCWlmIChGbGFnKEZSRVNUUklDVEVEKSAmJiAoc3RyY21wKHR2YXIsICJQQVRIIikgPT0gMCB8fAorCSAgICBzdHJjbXAodHZhciwgIkVOViIpID09IDAgfHwgc3RyY21wKHR2YXIsICJTSEVMTCIpID09IDApKQorCQllcnJvcmYoIiVzOiByZXN0cmljdGVkIiwgdHZhcik7CisKKwl2cCA9IChzZXQmTE9DQUwpID8gbG9jYWwodHZhciwgKHNldCAmIExPQ0FMX0NPUFkpID8gdHJ1ZSA6IGZhbHNlKSA6CisJICAgIGdsb2JhbCh0dmFyKTsKKwlpZiAoc2V0X3JlZmZsYWcgPT0gMiAmJiAodnAtPmZsYWcgJiAoQVJSQVl8QVNTT0MpKSA9PSBBU1NPQykKKwkJdnAtPmZsYWcgJj0gfkFTU09DOworCWVsc2UgaWYgKHNldF9yZWZmbGFnID09IDEpIHsKKwkJaWYgKHZwLT5mbGFnICYgQVJSQVkpIHsKKwkJCXN0cnVjdCB0YmwgKmEsICp0bXA7CisKKwkJCS8qIEZyZWUgdXAgZW50aXJlIGFycmF5ICovCisJCQlmb3IgKGEgPSB2cC0+dS5hcnJheTsgYTsgKSB7CisJCQkJdG1wID0gYTsKKwkJCQlhID0gYS0+dS5hcnJheTsKKwkJCQlpZiAodG1wLT5mbGFnICYgQUxMT0MpCisJCQkJCWFmcmVlKHRtcC0+dmFsLnMsIHRtcC0+YXJlYXApOworCQkJCWFmcmVlKHRtcCwgdG1wLT5hcmVhcCk7CisJCQl9CisJCQl2cC0+dS5hcnJheSA9IE5VTEw7CisJCQl2cC0+ZmxhZyAmPSB+QVJSQVk7CisJCX0KKwkJdnAtPmZsYWcgfD0gQVNTT0M7CisJfQorCisJc2V0ICY9IH4oTE9DQUx8TE9DQUxfQ09QWSk7CisKKwl2cGJhc2UgPSAodnAtPmZsYWcgJiBBUlJBWSkgPyBnbG9iYWwoYXJyYXluYW1lKHZhcikpIDogdnA7CisKKwkvKiBvbmx5IGFsbG93IGV4cG9ydCBmbGFnIHRvIGJlIHNldC4gQVQmVCBrc2ggYWxsb3dzIGFueSBhdHRyaWJ1dGUgdG8KKwkgKiBiZSBjaGFuZ2VkIHdoaWNoIG1lYW5zIGl0IGNhbiBiZSB0cnVuY2F0ZWQgb3IgbW9kaWZpZWQgKC1MLy1SLy1aLy1pKQorCSAqLworCWlmICgodnBiYXNlLT5mbGFnJlJET05MWSkgJiYKKwkgICAgKHZhbCB8fCBjbHIgfHwgKHNldCAmIH5FWFBPUlQpKSkKKwkJLyogWFhYIGNoZWNrIGNhbGxzIC0gaXMgZXJyb3IgaGVyZSBvayBieSBQT1NJWD8gKi8KKwkJZXJyb3JmKCIlczogaXMgcmVhZCBvbmx5IiwgdHZhcik7CisJYWZyZWUodHZhciwgQVRFTVApOworCisJLyogbW9zdCBjYWxscyBhcmUgd2l0aCBzZXQvY2xyID09IDAgKi8KKwlpZiAoc2V0IHwgY2xyKSB7CisJCWJvb2wgb2sgPSB0cnVlOworCisJCS8qIFhYWCBpZiB4WzBdIGlzbid0IHNldCwgdGhlcmUgd2lsbCBiZSBwcm9ibGVtczogbmVlZCB0byBoYXZlCisJCSAqIG9uZSBjb3B5IG9mIGF0dHJpYnV0ZXMgZm9yIGFycmF5cy4uLgorCQkgKi8KKwkJZm9yICh0ID0gdnBiYXNlOyB0OyB0ID0gdC0+dS5hcnJheSkgeworCQkJYm9vbCBmYWtlX2Fzc2lnbjsKKwkJCWNoYXIgKnMgPSBOVUxMOworCQkJY2hhciAqZnJlZV9tZSA9IE5VTEw7CisKKwkJCWZha2VfYXNzaWduID0gKHQtPmZsYWcgJiBJU1NFVCkgJiYgKCF2YWwgfHwgdCAhPSB2cCkgJiYKKwkJCSAgICAoKHNldCAmIChVQ0FTRVZfQUx8TENBU0VWfExKVVNUfFJKVVNUfFpFUk9GSUwpKSB8fAorCQkJICAgICgodC0+ZmxhZyAmIElOVEVHRVIpICYmIChjbHIgJiBJTlRFR0VSKSkgfHwKKwkJCSAgICAoISh0LT5mbGFnICYgSU5URUdFUikgJiYgKHNldCAmIElOVEVHRVIpKSk7CisJCQlpZiAoZmFrZV9hc3NpZ24pIHsKKwkJCQlpZiAodC0+ZmxhZyAmIElOVEVHRVIpIHsKKwkJCQkJcyA9IHN0cl92YWwodCk7CisJCQkJCWZyZWVfbWUgPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCXMgPSB0LT52YWwucyArIHQtPnR5cGU7CisJCQkJCWZyZWVfbWUgPSAodC0+ZmxhZyAmIEFMTE9DKSA/IHQtPnZhbC5zIDoKKwkJCQkJICAgIE5VTEw7CisJCQkJfQorCQkJCXQtPmZsYWcgJj0gfkFMTE9DOworCQkJfQorCQkJaWYgKCEodC0+ZmxhZyAmIElOVEVHRVIpICYmIChzZXQgJiBJTlRFR0VSKSkgeworCQkJCXQtPnR5cGUgPSAwOworCQkJCXQtPmZsYWcgJj0gfkFMTE9DOworCQkJfQorCQkJdC0+ZmxhZyA9ICh0LT5mbGFnIHwgc2V0KSAmIH5jbHI7CisJCQkvKiBEb24ndCBjaGFuZ2UgYmFzZSBpZiBhc3NpZ25tZW50IGlzIHRvIGJlIGRvbmUsCisJCQkgKiBpbiBjYXNlIGFzc2lnbm1lbnQgZmFpbHMuCisJCQkgKi8KKwkJCWlmICgoc2V0ICYgSU5URUdFUikgJiYgYmFzZSA+IDAgJiYgKCF2YWwgfHwgdCAhPSB2cCkpCisJCQkJdC0+dHlwZSA9IGJhc2U7CisJCQlpZiAoc2V0ICYgKExKVVNUfFJKVVNUfFpFUk9GSUwpKQorCQkJCXQtPnUyLmZpZWxkID0gZmllbGQ7CisJCQlpZiAoZmFrZV9hc3NpZ24pIHsKKwkJCQlpZiAoIXNldHN0cih0LCBzLCBLU0hfUkVUVVJOX0VSUk9SKSkgeworCQkJCQkvKiBTb21ld2hhdCBhcmJpdHJhcnkgYWN0aW9uIGhlcmU6CisJCQkJCSAqIHphcCBjb250ZW50cyBvZiB2YXJpYWJsZSwgYnV0IGtlZXAKKwkJCQkJICogdGhlIGZsYWcgc2V0dGluZ3MuCisJCQkJCSAqLworCQkJCQlvayA9IGZhbHNlOworCQkJCQlpZiAodC0+ZmxhZyAmIElOVEVHRVIpCisJCQkJCQl0LT5mbGFnICY9IH5JU1NFVDsKKwkJCQkJZWxzZSB7CisJCQkJCQlpZiAodC0+ZmxhZyAmIEFMTE9DKQorCQkJCQkJCWFmcmVlKHQtPnZhbC5zLCB0LT5hcmVhcCk7CisJCQkJCQl0LT5mbGFnICY9IH4oSVNTRVR8QUxMT0MpOworCQkJCQkJdC0+dHlwZSA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGZyZWVfbWUpCisJCQkJCWFmcmVlKGZyZWVfbWUsIHQtPmFyZWFwKTsKKwkJCX0KKwkJfQorCQlpZiAoIW9rKQorCQkJZXJyb3JmeigpOworCX0KKworCWlmICh2YWwgIT0gTlVMTCkgeworCQlpZiAodnAtPmZsYWcmSU5URUdFUikgeworCQkJLyogZG8gbm90IHplcm8gYmFzZSBiZWZvcmUgYXNzaWdubWVudCAqLworCQkJc2V0c3RyKHZwLCB2YWwsIEtTSF9VTldJTkRfRVJST1IgfCAweDQpOworCQkJLyogRG9uZSBhZnRlciBhc3NpZ25tZW50IHRvIG92ZXJyaWRlIGRlZmF1bHQgKi8KKwkJCWlmIChiYXNlID4gMCkKKwkJCQl2cC0+dHlwZSA9IGJhc2U7CisJCX0gZWxzZQorCQkJLyogc2V0c3RyIGNhbid0IGZhaWwgKHJlYWRvbmx5IGNoZWNrIGFscmVhZHkgZG9uZSkgKi8KKwkJCXNldHN0cih2cCwgdmFsLCBLU0hfUkVUVVJOX0VSUk9SIHwgMHg0KTsKKwl9CisKKwkvKiBvbmx5IHhbMF0gaXMgZXZlciBleHBvcnRlZCwgc28gdXNlIHZwYmFzZSAqLworCWlmICgodnBiYXNlLT5mbGFnJkVYUE9SVCkgJiYgISh2cGJhc2UtPmZsYWcmSU5URUdFUikgJiYKKwkgICAgdnBiYXNlLT50eXBlID09IDApCisJCWV4cG9ydHByZXAodnBiYXNlLCAodnBiYXNlLT5mbGFnJklTU0VUKSA/IHZwYmFzZS0+dmFsLnMgOiBudWxsKTsKKworCXJldHVybiAodnApOworfQorCisvKioKKyAqIFVuc2V0IGEgdmFyaWFibGUuIFRoZSBmbGFncyBjYW4gYmU6CisgKiB8MQk9IHRlYXIgZG93biBlbnRpcmUgYXJyYXkKKyAqIHwyCT0ga2VlcCBhdHRyaWJ1dGVzLCBvbmx5IHVuc2V0IGNvbnRlbnQKKyAqLwordm9pZAordW5zZXQoc3RydWN0IHRibCAqdnAsIGludCBmbGFncykKK3sKKwlpZiAodnAtPmZsYWcgJiBBTExPQykKKwkJYWZyZWUodnAtPnZhbC5zLCB2cC0+YXJlYXApOworCWlmICgodnAtPmZsYWcgJiBBUlJBWSkgJiYgKGZsYWdzICYgMSkpIHsKKwkJc3RydWN0IHRibCAqYSwgKnRtcDsKKworCQkvKiBGcmVlIHVwIGVudGlyZSBhcnJheSAqLworCQlmb3IgKGEgPSB2cC0+dS5hcnJheTsgYTsgKSB7CisJCQl0bXAgPSBhOworCQkJYSA9IGEtPnUuYXJyYXk7CisJCQlpZiAodG1wLT5mbGFnICYgQUxMT0MpCisJCQkJYWZyZWUodG1wLT52YWwucywgdG1wLT5hcmVhcCk7CisJCQlhZnJlZSh0bXAsIHRtcC0+YXJlYXApOworCQl9CisJCXZwLT51LmFycmF5ID0gTlVMTDsKKwl9CisJaWYgKGZsYWdzICYgMikgeworCQl2cC0+ZmxhZyAmPSB+KEFMTE9DfElTU0VUKTsKKwkJcmV0dXJuOworCX0KKwkvKiBJZiBmb29bMF0gaXMgYmVpbmcgdW5zZXQsIHRoZSByZW1haW5kZXIgb2YgdGhlIGFycmF5IGlzIGtlcHQuLi4gKi8KKwl2cC0+ZmxhZyAmPSBTUEVDSUFMIHwgKChmbGFncyAmIDEpID8gMCA6IEFSUkFZfERFRklORUQpOworCWlmICh2cC0+ZmxhZyAmIFNQRUNJQUwpCisJCXVuc2V0c3BlYyh2cCk7CS8qIHJlc3BvbnNpYmxlIGZvciAndW5zcGVjaWFsJ2luZyB2YXIgKi8KK30KKworLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhciBwYXN0IGEgbGVnYWwgdmFyaWFibGUgbmFtZSAocmV0dXJucyB0aGUKKyAqIGFyZ3VtZW50IGlmIHRoZXJlIGlzIG5vIGxlZ2FsIG5hbWUsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB0ZXJtaW5hdGluZworICogTlVMIGlmIHdob2xlIHN0cmluZyBpcyBsZWdhbCkuCisgKi8KK2NvbnN0IGNoYXIgKgorc2tpcF92YXJuYW1lKGNvbnN0IGNoYXIgKnMsIGludCBhb2spCit7CisJaW50IGFsZW47CisKKwlpZiAocyAmJiBrc2hfaXNhbHBoeCgqcykpIHsKKwkJd2hpbGUgKCorK3MgJiYga3NoX2lzYWxudXgoKnMpKQorCQkJOworCQlpZiAoYW9rICYmICpzID09ICdbJyAmJiAoYWxlbiA9IGFycmF5X3JlZl9sZW4ocykpKQorCQkJcyArPSBhbGVuOworCX0KKwlyZXR1cm4gKHMpOworfQorCisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcGFzdCBhbnkgbGVnYWwgdmFyaWFibGUgbmFtZSAqLworY29uc3QgY2hhciAqCitza2lwX3dkdmFybmFtZShjb25zdCBjaGFyICpzLAorICAgIGludCBhb2spCQkJCS8qIHNraXAgYXJyYXkgZGUtcmVmZXJlbmNlPyAqLworeworCWlmIChzWzBdID09IENIQVIgJiYga3NoX2lzYWxwaHgoc1sxXSkpIHsKKwkJZG8geworCQkJcyArPSAyOworCQl9IHdoaWxlIChzWzBdID09IENIQVIgJiYga3NoX2lzYWxudXgoc1sxXSkpOworCQlpZiAoYW9rICYmIHNbMF0gPT0gQ0hBUiAmJiBzWzFdID09ICdbJykgeworCQkJLyogc2tpcCBwb3NzaWJsZSBhcnJheSBkZS1yZWZlcmVuY2UgKi8KKwkJCWNvbnN0IGNoYXIgKnAgPSBzOworCQkJY2hhciBjOworCQkJaW50IGRlcHRoID0gMDsKKworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAocFswXSAhPSBDSEFSKQorCQkJCQlicmVhazsKKwkJCQljID0gcFsxXTsKKwkJCQlwICs9IDI7CisJCQkJaWYgKGMgPT0gJ1snKQorCQkJCQlkZXB0aCsrOworCQkJCWVsc2UgaWYgKGMgPT0gJ10nICYmIC0tZGVwdGggPT0gMCkgeworCQkJCQlzID0gcDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiAocyk7Cit9CisKKy8qIENoZWNrIGlmIGNvZGVkIHN0cmluZyBzIGlzIGEgdmFyaWFibGUgbmFtZSAqLworaW50Citpc193ZHZhcm5hbWUoY29uc3QgY2hhciAqcywgaW50IGFvaykKK3sKKwljb25zdCBjaGFyICpwID0gc2tpcF93ZHZhcm5hbWUocywgYW9rKTsKKworCXJldHVybiAocCAhPSBzICYmIHBbMF0gPT0gRU9TKTsKK30KKworLyogQ2hlY2sgaWYgY29kZWQgc3RyaW5nIHMgaXMgYSB2YXJpYWJsZSBhc3NpZ25tZW50ICovCitpbnQKK2lzX3dkdmFyYXNzaWduKGNvbnN0IGNoYXIgKnMpCit7CisJY29uc3QgY2hhciAqcCA9IHNraXBfd2R2YXJuYW1lKHMsIHRydWUpOworCisJcmV0dXJuIChwICE9IHMgJiYgcFswXSA9PSBDSEFSICYmIHBbMV0gPT0gJz0nKTsKK30KKworLyoKKyAqIE1ha2UgdGhlIGV4cG9ydGVkIGVudmlyb25tZW50IGZyb20gdGhlIGV4cG9ydGVkIG5hbWVzIGluIHRoZSBkaWN0aW9uYXJ5LgorICovCitjaGFyICoqCittYWtlbnYodm9pZCkKK3sKKwlzdHJ1Y3QgYmxvY2sgKmw7CisJWFB0clYgZGVudjsKKwlzdHJ1Y3QgdGJsICp2cCwgKip2cHA7CisJaW50IGk7CisKKwlYUGluaXQoZGVudiwgNjQpOworCWZvciAobCA9IGUtPmxvYzsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKwkJZm9yICh2cHAgPSBsLT52YXJzLnRibHMsIGkgPSBsLT52YXJzLnNpemU7IC0taSA+PSAwOyApCisJCQlpZiAoKHZwID0gKnZwcCsrKSAhPSBOVUxMICYmCisJCQkgICAgKHZwLT5mbGFnJihJU1NFVHxFWFBPUlQpKSA9PSAoSVNTRVR8RVhQT1JUKSkgeworCQkJCXN0cnVjdCBibG9jayAqbDI7CisJCQkJc3RydWN0IHRibCAqdnAyOworCQkJCXVpbnQzMl90IGggPSBoYXNoKHZwLT5uYW1lKTsKKworCQkJCS8qIHVuZXhwb3J0IGFueSByZWRlZmluZWQgaW5zdGFuY2VzICovCisJCQkJZm9yIChsMiA9IGwtPm5leHQ7IGwyICE9IE5VTEw7IGwyID0gbDItPm5leHQpIHsKKwkJCQkJdnAyID0ga3RzZWFyY2goJmwyLT52YXJzLCB2cC0+bmFtZSwgaCk7CisJCQkJCWlmICh2cDIgIT0gTlVMTCkKKwkJCQkJCXZwMi0+ZmxhZyAmPSB+RVhQT1JUOworCQkJCX0KKwkJCQlpZiAoKHZwLT5mbGFnJklOVEVHRVIpKSB7CisJCQkJCS8qIGludGVnZXIgdG8gc3RyaW5nICovCisJCQkJCWNoYXIgKnZhbDsKKwkJCQkJdmFsID0gc3RyX3ZhbCh2cCk7CisJCQkJCXZwLT5mbGFnICY9IH4oSU5URUdFUnxSRE9OTFl8U1BFQ0lBTCk7CisJCQkJCS8qIHNldHN0ciBjYW4ndCBmYWlsIGhlcmUgKi8KKwkJCQkJc2V0c3RyKHZwLCB2YWwsIEtTSF9SRVRVUk5fRVJST1IpOworCQkJCX0KKwkJCQlYUHB1dChkZW52LCB2cC0+dmFsLnMpOworCQkJfQorCVhQcHV0KGRlbnYsIE5VTEwpOworCXJldHVybiAoKGNoYXIgKiopWFBjbG9zZShkZW52KSk7Cit9CisKKy8qIEJvYiBKZW5raW5zJyBvbmUtYXQtYS10aW1lIGhhc2ggKi8KK3N0YXRpYyB1aW50MzJfdAorb2FhdGhhc2hfdXBkYXRlKHJlZ2lzdGVyIHVpbnQzMl90IGgsIHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QgKmNwLAorICAgIHJlZ2lzdGVyIHNpemVfdCBuKQoreworCXdoaWxlIChuLS0pIHsKKwkJaCArPSAqY3ArKzsKKwkJaCArPSBoIDw8IDEwOworCQloIF49IGggPj4gNjsKKwl9CisKKwlyZXR1cm4gKGgpOworfQorCitzdGF0aWMgdWludDMyX3QKK29hYXRoYXNoX2ZpbmFsaXNlKHJlZ2lzdGVyIHVpbnQzMl90IGgpCit7CisJaCArPSBoIDw8IDM7CisJaCBePSBoID4+IDExOworCWggKz0gaCA8PCAxNTsKKworCXJldHVybiAoaCk7Cit9CisKK3VpbnQzMl90CitvYWF0aGFzaF9mdWxsKHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QgKmJwKQoreworCXJlZ2lzdGVyIHVpbnQzMl90IGggPSAwOworCXJlZ2lzdGVyIHVpbnQ4X3QgYzsKKworCXdoaWxlICgoYyA9ICpicCsrKSkgeworCQloICs9IGM7CisJCWggKz0gaCA8PCAxMDsKKwkJaCBePSBoID4+IDY7CisJfQorCisJcmV0dXJuIChvYWF0aGFzaF9maW5hbGlzZShoKSk7Cit9CisKK3ZvaWQKK2NoYW5nZV9yYW5kb20oY29uc3Qgdm9pZCAqdnAsIHNpemVfdCBuKQoreworCXJlZ2lzdGVyIHVpbnQzMl90IGggPSAweDEwMDsKKyNpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorCWludCBtaWJbMl07CisJdWludDhfdCBrWzNdOworCXNpemVfdCBrbGVuOworI2VuZGlmCisKKwlrc2hzdGF0ZV92LmNyX2RwID0gdnA7CisJa3Noc3RhdGVfdi5jcl9kc3ogPSBuOworCWdldHRpbWVvZmRheSgma3Noc3RhdGVfdi5jcl90diwgTlVMTCk7CisJaCA9IG9hYXRoYXNoX3VwZGF0ZShvYWF0aGFzaF91cGRhdGUoaCwgKHZvaWQgKikma3Noc3RhdGVfdiwKKwkgICAgc2l6ZW9mKGtzaHN0YXRlX3YpKSwgdnAsIG4pOworCWtzaHN0YXRlX3YubGNnX3N0YXRlXyA9IG9hYXRoYXNoX2ZpbmFsaXNlKGgpOworCisjaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKwkvKiBPcGVuQlNELCBNaXJCU0Q6IHByb3BlciBrZXJuZWwgZW50cm9weSBjb21lcyBhdCB6ZXJvIGNvc3QgKi8KKworCW1pYlswXSA9IENUTF9LRVJOOworCW1pYlsxXSA9IEtFUk5fQVJORDsKKwlrbGVuID0gc2l6ZW9mKGspOworCXN5c2N0bChtaWIsIDIsIGssICZrbGVuLCAma3Noc3RhdGVfdi5sY2dfc3RhdGVfLAorCSAgICBzaXplb2Yoa3Noc3RhdGVfdi5sY2dfc3RhdGVfKSk7CisJLyogd2UgaWdub3JlIGZhaWx1cmVzIGFuZCB0YWtlIGluIGsgYW55d2F5ICovCisJaCA9IG9hYXRoYXNoX3VwZGF0ZShoLCBrLCBzaXplb2YoaykpOworCWtzaHN0YXRlX3YubGNnX3N0YXRlXyA9IG9hYXRoYXNoX2ZpbmFsaXNlKGgpOworI2VsaWYgZGVmaW5lZChNS1NIX0E0UEIpCisJLyogZm9yY2VkIGJ5IHRoZSB1c2VyIHRvIHVzZSBhcmM0cmFuZG9tX3B1c2hiKDMpIOKAoiBDeWd3aW4/ICovCisJeworCQl1aW50MzJfdCBwcnY7CisKKwkJcHJ2ID0gYXJjNHJhbmRvbV9wdXNoYigma3Noc3RhdGVfdi5sY2dfc3RhdGVfLAorCQkgICAgc2l6ZW9mKGtzaHN0YXRlX3YubGNnX3N0YXRlXykpOworCQloID0gb2FhdGhhc2hfdXBkYXRlKGgsICZwcnYsIHNpemVvZihwcnYpKTsKKwl9CisJa3Noc3RhdGVfdi5sY2dfc3RhdGVfID0gb2FhdGhhc2hfZmluYWxpc2UoaCk7CisjZW5kaWYKK30KKworLyoKKyAqIGhhbmRsZSBzcGVjaWFsIHZhcmlhYmxlcyB3aXRoIHNpZGUgZWZmZWN0cyAtIFBBVEgsIFNFQ09ORFMuCisgKi8KKworLyogVGVzdCBpZiBuYW1lIGlzIGEgc3BlY2lhbCBwYXJhbWV0ZXIgKi8KK3N0YXRpYyBpbnQKK3NwZWNpYWwoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdGJsICp0cDsKKworCXRwID0ga3RzZWFyY2goJnNwZWNpYWxzLCBuYW1lLCBoYXNoKG5hbWUpKTsKKwlyZXR1cm4gKHRwICYmICh0cC0+ZmxhZyAmIElTU0VUKSA/IHRwLT50eXBlIDogVl9OT05FKTsKK30KKworLyogTWFrZSBhIHZhcmlhYmxlIG5vbi1zcGVjaWFsICovCitzdGF0aWMgdm9pZAordW5zcGVjaWFsKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHRibCAqdHA7CisKKwl0cCA9IGt0c2VhcmNoKCZzcGVjaWFscywgbmFtZSwgaGFzaChuYW1lKSk7CisJaWYgKHRwKQorCQlrdGRlbGV0ZSh0cCk7Cit9CisKK3N0YXRpYyB0aW1lX3Qgc2Vjb25kczsJCS8qIHRpbWUgU0VDT05EUyBsYXN0IHNldCAqLworc3RhdGljIGludCB1c2VyX2xpbmVubzsJCS8qIHdoYXQgdXNlciBzZXQgJExJTkVOTyB0byAqLworCitzdGF0aWMgdm9pZAorZ2V0c3BlYyhzdHJ1Y3QgdGJsICp2cCkKK3sKKwlyZWdpc3RlciBta3NoX2FyaV90IGk7CisJaW50IHN0OworCisJc3dpdGNoICgoc3QgPSBzcGVjaWFsKHZwLT5uYW1lKSkpIHsKKwljYXNlIFZfU0VDT05EUzoKKwkJLyoKKwkJICogT24gc3RhcnQgdXAgdGhlIHZhbHVlIG9mIFNFQ09ORFMgaXMgdXNlZCBiZWZvcmUKKwkJICogaXQgaGFzIGJlZW4gc2V0IC0gZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBjYXNlCisJCSAqIChzZWUgaW5pdGNvbXNbXSBpbiBtYWluLmMpLgorCQkgKi8KKwkJaWYgKHZwLT5mbGFnICYgSVNTRVQpIHsKKwkJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwkJCWkgPSB0di50dl9zZWMgLSBzZWNvbmRzOworCQl9IGVsc2UKKwkJCXJldHVybjsKKwkJYnJlYWs7CisJY2FzZSBWX1JBTkRPTToKKwkJLyoKKwkJICogdGhpcyBpcyB0aGUgc2FtZSBMaW5lYXIgQ29uZ3J1ZW50aWFsIFBSTkcgYXMgQm9ybGFuZAorCQkgKiBDL0MrKyBhbGxlZ2VkbHkgdXNlcyBpbiBpdHMgYnVpbHQtaW4gcmFuZCgpIGZ1bmN0aW9uCisJCSAqLworCQlpID0gKChrc2hzdGF0ZV92LmxjZ19zdGF0ZV8gPQorCQkgICAgMjI2OTU0NzcgKiBrc2hzdGF0ZV92LmxjZ19zdGF0ZV8gKyAxKSA+PiAxNikgJiAweDdGRkY7CisJCWJyZWFrOworCWNhc2UgVl9ISVNUU0laRToKKwkJaSA9IGhpc3RzaXplOworCQlicmVhazsKKwljYXNlIFZfT1BUSU5EOgorCQlpID0gdXNlcl9vcHQudW9wdGluZDsKKwkJYnJlYWs7CisJY2FzZSBWX0xJTkVOTzoKKwkJaSA9IGN1cnJlbnRfbGluZW5vICsgdXNlcl9saW5lbm87CisJCWJyZWFrOworCWNhc2UgVl9DT0xVTU5TOgorCWNhc2UgVl9MSU5FUzoKKwkJLyoKKwkJICogRG8gTk9UIGV4cG9ydCBDT0xVTU5TL0xJTkVTLiBNYW55IGFwcGxpY2F0aW9ucworCQkgKiBjaGVjayBDT0xVTU5TL0xJTkVTIGJlZm9yZSBjaGVja2luZyB3cy53c19jb2wvcm93LAorCQkgKiBzbyBpZiB0aGUgYXBwIGlzIHN0YXJ0ZWQgd2l0aCBDL0wgaW4gdGhlIGVudmlyb24KKwkJICogYW5kIHRoZSB3aW5kb3cgaXMgdGhlbiByZXNpemVkLCB0aGUgYXBwIHdvbid0CisJCSAqIHNlZSB0aGUgY2hhbmdlIGNhdXNlIHRoZSBlbnZpcm9uIGRvZXNuJ3QgY2hhbmdlLgorCQkgKi8KKwkJY2hhbmdlX3dpbnN6KCk7CisJCWkgPSBzdCA9PSBWX0NPTFVNTlMgPyB4X2NvbHMgOiB4X2xpbnM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGRvIG5vdGhpbmcsIGRvIG5vdCB0b3VjaCB2cCBhdCBhbGwgKi8KKwkJcmV0dXJuOworCX0KKwl2cC0+ZmxhZyAmPSB+U1BFQ0lBTDsKKwlzZXRpbnQodnAsIGkpOworCXZwLT5mbGFnIHw9IFNQRUNJQUw7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRzcGVjKHN0cnVjdCB0YmwgKnZwKQoreworCW1rc2hfYXJpX3QgaTsKKwljaGFyICpzOworCWludCBzdDsKKworCXN3aXRjaCAoKHN0ID0gc3BlY2lhbCh2cC0+bmFtZSkpKSB7CisJY2FzZSBWX1BBVEg6CisJCWlmIChwYXRoKQorCQkJYWZyZWUocGF0aCwgQVBFUk0pOworCQlzID0gc3RyX3ZhbCh2cCk7CisJCXN0cmR1cHgocGF0aCwgcywgQVBFUk0pOworCQlmbHVzaGNvbSgxKTsJLyogY2xlYXIgdHJhY2tlZCBhbGlhc2VzICovCisJCXJldHVybjsKKwljYXNlIFZfSUZTOgorCQlzZXRjdHlwZXMocyA9IHN0cl92YWwodnApLCBDX0lGUyk7CisJCWlmczAgPSAqczsKKwkJcmV0dXJuOworCWNhc2UgVl9UTVBESVI6CisJCWlmICh0bXBkaXIpIHsKKwkJCWFmcmVlKHRtcGRpciwgQVBFUk0pOworCQkJdG1wZGlyID0gTlVMTDsKKwkJfQorCQkvKiBVc2UgdG1wZGlyIGlmZiBpdCBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBpcyB3cml0YWJsZSBhbmQKKwkJICogc2VhcmNoYWJsZSBhbmQgaXMgYSBkaXJlY3RvcnkuLi4KKwkJICovCisJCXsKKwkJCXN0cnVjdCBzdGF0IHN0YXRiOworCisJCQlzID0gc3RyX3ZhbCh2cCk7CisJCQlpZiAoc1swXSA9PSAnLycgJiYgYWNjZXNzKHMsIFdfT0t8WF9PSykgPT0gMCAmJgorCQkJICAgIHN0YXQocywgJnN0YXRiKSA9PSAwICYmIFNfSVNESVIoc3RhdGIuc3RfbW9kZSkpCisJCQkJc3RyZHVweCh0bXBkaXIsIHMsIEFQRVJNKTsKKwkJfQorCQlicmVhazsKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorCWNhc2UgVl9ISVNURklMRToKKwkJc2V0aGlzdGZpbGUoc3RyX3ZhbCh2cCkpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgVl9UTU9VVDoKKwkJLyogQVQmVCBrc2ggc2VlbXMgdG8gZG8gdGhpcyAob25seSBsaXN0ZW4gaWYgaW50ZWdlcikgKi8KKwkJaWYgKHZwLT5mbGFnICYgSU5URUdFUikKKwkJCWtzaF90bW91dCA9IHZwLT52YWwuaSA+PSAwID8gdnAtPnZhbC5pIDogMDsKKwkJYnJlYWs7CisKKwkvKiBjb21tb24gc3ViLWNhc2VzICovCisJY2FzZSBWX09QVElORDoKKwljYXNlIFZfSElTVFNJWkU6CisJY2FzZSBWX0NPTFVNTlM6CisJY2FzZSBWX0xJTkVTOgorCWNhc2UgVl9SQU5ET006CisJY2FzZSBWX1NFQ09ORFM6CisJY2FzZSBWX0xJTkVOTzoKKwkJdnAtPmZsYWcgJj0gflNQRUNJQUw7CisJCWkgPSBpbnR2YWwodnApOworCQl2cC0+ZmxhZyB8PSBTUEVDSUFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBkbyBub3RoaW5nLCBkbyBub3QgdG91Y2ggdnAgYXQgYWxsICovCisJCXJldHVybjsKKwl9CisKKwkvKiBwcm9jZXNzIHRoZSBzaW5ndWxhciBwYXJ0cyBvZiB0aGUgY29tbW9uIGNhc2VzICovCisKKwlzd2l0Y2ggKHN0KSB7CisJY2FzZSBWX09QVElORDoKKwkJZ2V0b3B0c19yZXNldCgoaW50KWkpOworCQlicmVhazsKKwljYXNlIFZfSElTVFNJWkU6CisJCXNldGhpc3RzaXplKChpbnQpaSk7CisJCWJyZWFrOworCWNhc2UgVl9DT0xVTU5TOgorCQlpZiAoaSA+PSBNSU5fQ09MUykKKwkJCXhfY29scyA9IGk7CisJCWJyZWFrOworCWNhc2UgVl9MSU5FUzoKKwkJaWYgKGkgPj0gTUlOX0xJTlMpCisJCQl4X2xpbnMgPSBpOworCQlicmVhazsKKwljYXNlIFZfUkFORE9NOgorCQkvKgorCQkgKiBta3NoIFIzOWQrIG5vIGxvbmdlciBoYXMgdGhlIHRyYWRpdGlvbmFsIHJlcGVhdGFiaWxpdHkKKwkJICogb2YgJFJBTkRPTSBzZXF1ZW5jZXMsIGJ1dCBhbHdheXMgcmV0YWlucyBzdGF0ZQorCQkgKi8KKwkJY2hhbmdlX3JhbmRvbSgmaSwgc2l6ZW9mKGkpKTsKKwkJYnJlYWs7CisJY2FzZSBWX1NFQ09ORFM6CisJCXsKKwkJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwkJCXNlY29uZHMgPSB0di50dl9zZWMgLSBpOworCQl9CisJCWJyZWFrOworCWNhc2UgVl9MSU5FTk86CisJCS8qIFRoZSAtMSBpcyBiZWNhdXNlIGxpbmUgbnVtYmVyaW5nIHN0YXJ0cyBhdCAxLiAqLworCQl1c2VyX2xpbmVubyA9ICh1bnNpZ25lZCBpbnQpaSAtIGN1cnJlbnRfbGluZW5vIC0gMTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAordW5zZXRzcGVjKHN0cnVjdCB0YmwgKnZwKQoreworCXN3aXRjaCAoc3BlY2lhbCh2cC0+bmFtZSkpIHsKKwljYXNlIFZfUEFUSDoKKwkJaWYgKHBhdGgpCisJCQlhZnJlZShwYXRoLCBBUEVSTSk7CisJCXN0cmR1cHgocGF0aCwgZGVmX3BhdGgsIEFQRVJNKTsKKwkJZmx1c2hjb20oMSk7CS8qIGNsZWFyIHRyYWNrZWQgYWxpYXNlcyAqLworCQlicmVhazsKKwljYXNlIFZfSUZTOgorCQlzZXRjdHlwZXMoIiBcdFxuIiwgQ19JRlMpOworCQlpZnMwID0gJyAnOworCQlicmVhazsKKwljYXNlIFZfVE1QRElSOgorCQkvKiBzaG91bGQgbm90IGJlY29tZSB1bnNwZWNpYWwgKi8KKwkJaWYgKHRtcGRpcikgeworCQkJYWZyZWUodG1wZGlyLCBBUEVSTSk7CisJCQl0bXBkaXIgPSBOVUxMOworCQl9CisJCWJyZWFrOworCWNhc2UgVl9MSU5FTk86CisJY2FzZSBWX1JBTkRPTToKKwljYXNlIFZfU0VDT05EUzoKKwljYXNlIFZfVE1PVVQ6CQkvKiBBVCZUIGtzaCBsZWF2ZXMgcHJldmlvdXMgdmFsdWUgaW4gcGxhY2UgKi8KKwkJdW5zcGVjaWFsKHZwLT5uYW1lKTsKKwkJYnJlYWs7CisKKwkvKgorCSAqIEFUJlQga3NoIG1hbiBwYWdlIHNheXMgT1BUSU5ELCBPUFRBUkcgYW5kIF8gbG9zZSBzcGVjaWFsCisJICogbWVhbmluZywgYnV0IE9QVEFSRyBkb2VzIG5vdCAoc3RpbGwgc2V0IGJ5IGdldG9wdHMpIGFuZCBfIGlzCisJICogYWxzbyBzdGlsbCBzZXQgaW4gdmFyaW91cyBwbGFjZXMuIERvbid0IGtub3cgd2hhdCBBVCZUIGRvZXMKKwkgKiBmb3IgSElTVFNJWkUsIEhJU1RGSUxFLiBVbnNldHRpbmcgdGhlc2UgaW4gQVQmVCBrc2ggZG9lcyBub3QKKwkgKiBsb29zZSB0aGUgJ3NwZWNpYWxuZXNzJzogSUZTLCBDT0xVTU5TLCBQQVRILCBUTVBESVIKKwkgKi8KKwl9Cit9CisKKy8qCisgKiBTZWFyY2ggZm9yIChhbmQgcG9zc2libHkgY3JlYXRlKSBhIHRhYmxlIGVudHJ5IHN0YXJ0aW5nIHdpdGgKKyAqIHZwLCBpbmRleGVkIGJ5IHZhbC4KKyAqLworc3RhdGljIHN0cnVjdCB0YmwgKgorYXJyYXlzZWFyY2goc3RydWN0IHRibCAqdnAsIHVpbnQzMl90IHZhbCkKK3sKKwlzdHJ1Y3QgdGJsICpwcmV2LCAqY3VyciwgKm5ld3M7CisJc2l6ZV90IGxlbjsKKworCXZwLT5mbGFnID0gKHZwLT5mbGFnIHwgKEFSUkFZfERFRklORUQpKSAmIH5BU1NPQzsKKwkvKiBUaGUgdGFibGUgZW50cnkgaXMgYWx3YXlzIFswXSAqLworCWlmICh2YWwgPT0gMCkKKwkJcmV0dXJuICh2cCk7CisJcHJldiA9IHZwOworCWN1cnIgPSB2cC0+dS5hcnJheTsKKwl3aGlsZSAoY3VyciAmJiBjdXJyLT51YS5pbmRleCA8IHZhbCkgeworCQlwcmV2ID0gY3VycjsKKwkJY3VyciA9IGN1cnItPnUuYXJyYXk7CisJfQorCWlmIChjdXJyICYmIGN1cnItPnVhLmluZGV4ID09IHZhbCkgeworCQlpZiAoY3Vyci0+ZmxhZyZJU1NFVCkKKwkJCXJldHVybiAoY3Vycik7CisJCW5ld3MgPSBjdXJyOworCX0gZWxzZQorCQluZXdzID0gTlVMTDsKKwlsZW4gPSBzdHJsZW4odnAtPm5hbWUpICsgMTsKKwlpZiAoIW5ld3MpIHsKKwkJbmV3cyA9IGFsbG9jKG9mZnNldG9mKHN0cnVjdCB0YmwsIG5hbWVbMF0pICsgbGVuLCB2cC0+YXJlYXApOworCQltZW1jcHkobmV3cy0+bmFtZSwgdnAtPm5hbWUsIGxlbik7CisJfQorCW5ld3MtPmZsYWcgPSAodnAtPmZsYWcgJiB+KEFMTE9DfERFRklORUR8SVNTRVR8U1BFQ0lBTCkpIHwgQUlOREVYOworCW5ld3MtPnR5cGUgPSB2cC0+dHlwZTsKKwluZXdzLT5hcmVhcCA9IHZwLT5hcmVhcDsKKwluZXdzLT51Mi5maWVsZCA9IHZwLT51Mi5maWVsZDsKKwluZXdzLT51YS5pbmRleCA9IHZhbDsKKworCWlmIChjdXJyICE9IG5ld3MpIHsJCS8qIG5vdCByZXVzaW5nIG9sZCBhcnJheSBlbnRyeSAqLworCQlwcmV2LT51LmFycmF5ID0gbmV3czsKKwkJbmV3cy0+dS5hcnJheSA9IGN1cnI7CisJfQorCXJldHVybiAobmV3cyk7Cit9CisKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIGFuIGFycmF5IHJlZmVyZW5jZSAoZWcsIFsxKzJdKSAtIGNwIGlzIGFzc3VtZWQKKyAqIHRvIHBvaW50IHRvIHRoZSBvcGVuIGJyYWNrZXQuIFJldHVybnMgMCBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBjbG9zaW5nCisgKiBicmFja2V0LgorICovCitpbnQKK2FycmF5X3JlZl9sZW4oY29uc3QgY2hhciAqY3ApCit7CisJY29uc3QgY2hhciAqcyA9IGNwOworCWludCBjOworCWludCBkZXB0aCA9IDA7CisKKwl3aGlsZSAoKGMgPSAqcysrKSAmJiAoYyAhPSAnXScgfHwgLS1kZXB0aCkpCisJCWlmIChjID09ICdbJykKKwkJCWRlcHRoKys7CisJaWYgKCFjKQorCQlyZXR1cm4gKDApOworCXJldHVybiAocyAtIGNwKTsKK30KKworLyoKKyAqIE1ha2UgYSBjb3B5IG9mIHRoZSBiYXNlIG9mIGFuIGFycmF5IG5hbWUKKyAqLworY2hhciAqCithcnJheW5hbWUoY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqcnY7CisKKwlpZiAoKHAgPSBjc3RyY2hyKHN0ciwgJ1snKSkgPT0gMCkKKwkJLyogU2hvdWxkbid0IGhhcHBlbiwgYnV0IHdoeSB3b3JyeT8gKi8KKwkJc3RyZHVweChydiwgc3RyLCBBVEVNUCk7CisJZWxzZQorCQlzdHJuZHVweChydiwgc3RyLCBwIC0gc3RyLCBBVEVNUCk7CisKKwlyZXR1cm4gKHJ2KTsKK30KKworLyogc2V0IChvciBvdmVyd3JpdGUsIGlmIHJlc2V0KSB0aGUgYXJyYXkgdmFyaWFibGUgdmFyIHRvIHRoZSB2YWx1ZXMgaW4gdmFscyAqLworbWtzaF91YXJpX3QKK3NldF9hcnJheShjb25zdCBjaGFyICp2YXIsIGJvb2wgcmVzZXQsIGNvbnN0IGNoYXIgKip2YWxzKQoreworCXN0cnVjdCB0YmwgKnZwLCAqdnE7CisJbWtzaF91YXJpX3QgaTsKKwljb25zdCBjaGFyICpjY3A7CisjaWZuZGVmIE1LU0hfU01BTEwKKwljaGFyICpjcDsKKwlta3NoX3VhcmlfdCBqOworI2VuZGlmCisKKwkvKiB0byBnZXQgbG9jYWwgYXJyYXksIHVzZSAidHlwZXNldCBmb287IHNldCAtQSBmb28iICovCisJdnAgPSBnbG9iYWwodmFyKTsKKworCS8qIE5vdGU6IEFUJlQga3NoIGFsbG93cyBzZXQgLUEgYnV0IG5vdCBzZXQgK0Egb2YgYSByZWFkLW9ubHkgdmFyICovCisJaWYgKCh2cC0+ZmxhZyZSRE9OTFkpKQorCQllcnJvcmYoIiVzOiBpcyByZWFkIG9ubHkiLCB2YXIpOworCS8qIFRoaXMgY29kZSBpcyBxdWl0ZSBub24tb3B0aW1hbCAqLworCWlmIChyZXNldCkKKwkJLyogdHJhc2ggZXhpc3RpbmcgdmFsdWVzIGFuZCBhdHRyaWJ1dGVzICovCisJCXVuc2V0KHZwLCAxKTsKKwkvKiB0b2RvOiB3b3VsZCBiZSBuaWNlIGZvciBhc3NpZ25tZW50IHRvIGNvbXBsZXRlbHkgc3VjY2VlZCBvcgorCSAqIGNvbXBsZXRlbHkgZmFpbC4gT25seSByZWFsbHkgZWZmZWN0cyBpbnRlZ2VyIGFycmF5czoKKwkgKiBldmFsdWF0aW9uIG9mIHNvbWUgb2YgdmFsc1tdIG1heSBmYWlsLi4uCisJICovCisJaSA9IDA7CisjaWZuZGVmIE1LU0hfU01BTEwKKwlqID0gMDsKKyNlbHNlCisjZGVmaW5lIGogaQorI2VuZGlmCisJd2hpbGUgKChjY3AgPSB2YWxzW2ldKSkgeworI2lmbmRlZiBNS1NIX1NNQUxMCisJCWlmICgqY2NwID09ICdbJykgeworCQkJaW50IGxldmVsID0gMDsKKworCQkJd2hpbGUgKCpjY3ApIHsKKwkJCQlpZiAoKmNjcCA9PSAnXScgJiYgLS1sZXZlbCA9PSAwKQorCQkJCQlicmVhazsKKwkJCQlpZiAoKmNjcCA9PSAnWycpCisJCQkJCSsrbGV2ZWw7CisJCQkJKytjY3A7CisJCQl9CisJCQlpZiAoKmNjcCA9PSAnXScgJiYgbGV2ZWwgPT0gMCAmJiBjY3BbMV0gPT0gJz0nKSB7CisJCQkJc3RybmR1cHgoY3AsIHZhbHNbaV0gKyAxLCBjY3AgLSAodmFsc1tpXSArIDEpLAorCQkJCSAgICBBVEVNUCk7CisJCQkJZXZhbHVhdGUoc3Vic3RpdHV0ZShjcCwgMCksIChta3NoX2FyaV90ICopJmosCisJCQkJICAgIEtTSF9VTldJTkRfRVJST1IsIHRydWUpOworCQkJCWFmcmVlKGNwLCBBVEVNUCk7CisJCQkJY2NwICs9IDI7CisJCQl9IGVsc2UKKwkJCQljY3AgPSB2YWxzW2ldOworCQl9CisjZW5kaWYKKworCQl2cSA9IGFycmF5c2VhcmNoKHZwLCBqKTsKKwkJLyogd291bGQgYmUgbmljZSB0byBkZWFsIHdpdGggZXJyb3JzIGhlcmUuLi4gKHNlZSBhYm92ZSkgKi8KKwkJc2V0c3RyKHZxLCBjY3AsIEtTSF9SRVRVUk5fRVJST1IpOworCQlpKys7CisjaWZuZGVmIE1LU0hfU01BTEwKKwkJaisrOworI2VuZGlmCisJfQorCisJcmV0dXJuIChpKTsKK30KKwordm9pZAorY2hhbmdlX3dpbnN6KHZvaWQpCit7CisJaWYgKHhfbGlucyA8IDApIHsKKwkJLyogZmlyc3QgdGltZSBpbml0aWFsaXNhdGlvbiAqLworI2lmZGVmIFRJT0NHV0lOU1oKKwkJaWYgKHR0eV9mZCA8IDApCisJCQkvKiBub24tRlRBTEtJTkcsIHRyeSB0byBnZXQgYW4gZmQgYW55d2F5ICovCisJCQl0dHlfaW5pdChmYWxzZSwgZmFsc2UpOworI2VuZGlmCisJCXhfY29scyA9IC0xOworCX0KKworI2lmZGVmIFRJT0NHV0lOU1oKKwkvKiBjaGVjayBpZiB3aW5kb3cgc2l6ZSBoYXMgY2hhbmdlZCAqLworCWlmICh0dHlfZmQgPj0gMCkgeworCQlzdHJ1Y3Qgd2luc2l6ZSB3czsKKworCQlpZiAoaW9jdGwodHR5X2ZkLCBUSU9DR1dJTlNaLCAmd3MpID49IDApIHsKKwkJCWlmICh3cy53c19jb2wpCisJCQkJeF9jb2xzID0gd3Mud3NfY29sOworCQkJaWYgKHdzLndzX3JvdykKKwkJCQl4X2xpbnMgPSB3cy53c19yb3c7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIGJvdW5kcyBjaGVjayBmb3Igc2FuZSB2YWx1ZXMsIHVzZSBkZWZhdWx0cyBvdGhlcndpc2UgKi8KKwlpZiAoeF9jb2xzIDwgTUlOX0NPTFMpCisJCXhfY29scyA9IDgwOworCWlmICh4X2xpbnMgPCBNSU5fTElOUykKKwkJeF9saW5zID0gMjQ7CisKKyNpZmRlZiBTSUdXSU5DSAorCWdvdF93aW5jaCA9IDA7CisjZW5kaWYKK30KKwordWludDMyX3QKK2V2aWxoYXNoKGNvbnN0IGNoYXIgKnMpCit7CisJcmVnaXN0ZXIgdWludDMyX3QgaCA9IDB4MTAwOworCisJaCA9IG9hYXRoYXNoX3VwZGF0ZShoLCAodm9pZCAqKSZrc2hzdGF0ZV9mLCBzaXplb2Yoa3Noc3RhdGVfZikpOworCWtzaHN0YXRlX2YuaCA9IG9hYXRoYXNoX2Z1bGwoKGNvbnN0IHVpbnQ4X3QgKilzKTsKKwlyZXR1cm4gKG9hYXRoYXNoX2ZpbmFsaXNlKG9hYXRoYXNoX3VwZGF0ZShoLAorCSAgICAodm9pZCAqKSZrc2hzdGF0ZV9mLmgsIHNpemVvZihrc2hzdGF0ZV9mLmgpKSkpOworfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvdmFyX3NwZWMuaCBiL21rc2gvc3JjL3Zhcl9zcGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzNWNjOQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL3Zhcl9zcGVjLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmIGRlZmluZWQoVkFSU1BFQ19ERUZOUykKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL3Zhcl9zcGVjLmgsdiAxLjEgMjAwOS8wOS8yNiAwMzo0MDowMyB0ZyBFeHAgJCIpOworI2RlZmluZSBGTihuYW1lKQkJCS8qIG5vdGhpbmcgKi8KKyNlbGlmIGRlZmluZWQoVkFSU1BFQ19FTlVNUykKKyNkZWZpbmUgRk4obmFtZSkJCQlWXyMjbmFtZSwKKyNkZWZpbmUgRjAobmFtZSkJCQlWXyMjbmFtZSA9IDAsCisjZWxpZiBkZWZpbmVkKFZBUlNQRUNfSVRFTVMpCisjZGVmaW5lIEYwKG5hbWUpCQkJLyogbm90aGluZyAqLworI2RlZmluZSBGTihuYW1lKQkJCSNuYW1lLAorI2VuZGlmCisKKyNpZm5kZWYgRjAKKyNkZWZpbmUgRjAgRk4KKyNlbmRpZgorCisvKiAwIGlzIGFsd2F5cyBWX05PTkUgKi8KK0YwKE5PTkUpCisKKy8qIDEgYW5kIHVwIGFyZSBzcGVjaWFsIHZhcmlhYmxlcyAqLworRk4oQ09MVU1OUykKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorRk4oSElTVEZJTEUpCisjZW5kaWYKK0ZOKEhJU1RTSVpFKQorRk4oSUZTKQorRk4oTElORU5PKQorRk4oTElORVMpCitGTihPUFRJTkQpCitGTihQQVRIKQorRk4oUkFORE9NKQorRk4oU0VDT05EUykKK0ZOKFRNT1VUKQorRk4oVE1QRElSKQorCisjdW5kZWYgRk4KKyN1bmRlZiBGMAorI3VuZGVmIFZBUlNQRUNfREVGTlMKKyN1bmRlZiBWQVJTUEVDX0VOVU1TCisjdW5kZWYgVkFSU1BFQ19JVEVNUwpkaWZmIC0tZ2l0IGEvbmV0Y2ZnL25ldGNmZy5jIGIvbmV0Y2ZnL25ldGNmZy5jCmluZGV4IGZjOWNmNDguLjljZDg4M2EgMTAwNjQ0Ci0tLSBhL25ldGNmZy9uZXRjZmcuYworKysgYi9uZXRjZmcvbmV0Y2ZnLmMKQEAgLTE5LDE3ICsxOSwxMyBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorCisjaW5jbHVkZSA8bmV0dXRpbHMvaWZjLmg+CisjaW5jbHVkZSA8bmV0dXRpbHMvZGhjcC5oPgogCiBzdGF0aWMgaW50IHZlcmJvc2UgPSAwOwogCi1pbnQgaWZjX2luaXQoKTsKLXZvaWQgaWZjX2Nsb3NlKCk7Ci1pbnQgaWZjX3VwKGNoYXIgKmluYW1lKTsKLWludCBpZmNfZG93bihjaGFyICppbmFtZSk7Ci1pbnQgaWZjX3JlbW92ZV9ob3N0X3JvdXRlcyhjaGFyICppbmFtZSk7Ci1pbnQgaWZjX3JlbW92ZV9kZWZhdWx0X3JvdXRlKGNoYXIgKmluYW1lKTsKLWludCBpZmNfZ2V0X2luZm8oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgKmFkZHIsIHVuc2lnbmVkICptYXNrLCB1bnNpZ25lZCAqZmxhZ3MpOwotaW50IGRvX2RoY3AoY2hhciAqaW5hbWUpOwogCiB2b2lkIGRpZShjb25zdCBjaGFyICpyZWFzb24pCiB7CkBAIC0zNywxNiArMzMsMTIgQEAKICAgICBleGl0KDEpOwogfQogCi1jb25zdCBjaGFyICppcGFkZHIodW5zaWduZWQgYWRkcikKK2NvbnN0IGNoYXIgKmlwYWRkcihpbl9hZGRyX3QgYWRkcikKIHsKLSAgICBzdGF0aWMgY2hhciBidWZbMzJdOwotICAgIAotICAgIHNwcmludGYoYnVmLCIlZC4lZC4lZC4lZCIsIAotICAgICAgICAgICAgYWRkciAmIDI1NSwKLSAgICAgICAgICAgICgoYWRkciA+PiA4KSAmIDI1NSksCi0gICAgICAgICAgICAoKGFkZHIgPj4gMTYpICYgMjU1KSwgCi0gICAgICAgICAgICAoYWRkciA+PiAyNCkpOwotICAgIHJldHVybiBidWY7CisgICAgc3RydWN0IGluX2FkZHIgaW5fYWRkcjsKKworICAgIGluX2FkZHIuc19hZGRyID0gYWRkcjsKKyAgICByZXR1cm4gaW5ldF9udG9hKGluX2FkZHIpOwogfQogCiB2b2lkIHVzYWdlKHZvaWQpCkBAIC04Niw2ICs3OCwxNSBAQAogICAgIHJldHVybiAwOwogfQogCitpbnQgc2V0X2h3YWRkcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphc2MpIHsKKyAgICBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkciA9IGV0aGVyX2F0b24oYXNjKTsKKyAgICBpZiAoIWFkZHIpIHsKKyAgICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gcGFyc2UgJyVzJ1xuIiwgYXNjKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaWZjX3NldF9od2FkZHIobmFtZSwgYWRkci0+ZXRoZXJfYWRkcl9vY3RldCk7Cit9CisKIHN0cnVjdCAKIHsKICAgICBjb25zdCBjaGFyICpuYW1lOwpAQCAtOTcsNiArOTgsNyBAQAogICAgIHsgImRvd24iLCAgIDEsIGlmY19kb3duIH0sCiAgICAgeyAiZmxob3N0cyIsICAxLCBpZmNfcmVtb3ZlX2hvc3Rfcm91dGVzIH0sCiAgICAgeyAiZGVsZGVmYXVsdCIsIDEsIGlmY19yZW1vdmVfZGVmYXVsdF9yb3V0ZSB9LAorICAgIHsgImh3YWRkciIsIDIsIHNldF9od2FkZHIgfSwKICAgICB7IDAsIDAsIDAgfSwKIH07CiAKZGlmZiAtLWdpdCBhL25leHVzL0RoY3BDbGllbnQuY3BwIGIvbmV4dXMvRGhjcENsaWVudC5jcHAKaW5kZXggYTU2NTRkMi4uNzEzMDU5ZCAxMDA2NDQKLS0tIGEvbmV4dXMvRGhjcENsaWVudC5jcHAKKysrIGIvbmV4dXMvRGhjcENsaWVudC5jcHAKQEAgLTI3LDM1ICsyNywxNSBAQAogCiAjaW5jbHVkZSA8c3lzdXRpbHMvU2VydmljZU1hbmFnZXIuaD4KIAorI2luY2x1ZGUgPG5ldHV0aWxzL2lmYy5oPgorI2luY2x1ZGUgPG5ldHV0aWxzL2RoY3AuaD4KKwogI2luY2x1ZGUgIkRoY3BDbGllbnQuaCIKICNpbmNsdWRlICJEaGNwU3RhdGUuaCIKICNpbmNsdWRlICJEaGNwTGlzdGVuZXIuaCIKICNpbmNsdWRlICJJRGhjcEV2ZW50SGFuZGxlcnMuaCIKICNpbmNsdWRlICJDb250cm9sbGVyLmgiCiAKLWV4dGVybiAiQyIgewotaW50IGlmY19kaXNhYmxlKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgaWZjX2FkZF9ob3N0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSwgdWludDMyX3QgYWRkcik7Ci1pbnQgaWZjX3JlbW92ZV9ob3N0X3JvdXRlcyhjb25zdCBjaGFyICppZm5hbWUpOwotaW50IGlmY19zZXRfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUsIHVpbnQzMl90IGdhdGV3YXkpOwotaW50IGlmY19nZXRfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUpOwotaW50IGlmY19yZW1vdmVfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUpOwotaW50IGlmY19yZXNldF9jb25uZWN0aW9ucyhjb25zdCBjaGFyICppZm5hbWUpOwotaW50IGlmY19jb25maWd1cmUoY29uc3QgY2hhciAqaWZuYW1lLCBpbl9hZGRyX3QgaXBhZGRyLCBpbl9hZGRyX3QgbmV0bWFzaywgaW5fYWRkcl90IGdhdGV3YXksIGluX2FkZHJfdCBkbnMxLCBpbl9hZGRyX3QgZG5zMik7Ci0KLWludCBkaGNwX2RvX3JlcXVlc3QoY29uc3QgY2hhciAqaWZuYW1lLAotICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmlwYWRkciwKLSAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpnYXRld2F5LAotICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKm1hc2ssCi0gICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZG5zMSwKLSAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpkbnMyLAotICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICpsZWFzZSk7Ci1pbnQgZGhjcF9zdG9wKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgZGhjcF9yZWxlYXNlX2xlYXNlKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1jaGFyICpkaGNwX2dldF9lcnJtc2coKTsKLX0KLQogRGhjcENsaWVudDo6RGhjcENsaWVudChJRGhjcEV2ZW50SGFuZGxlcnMgKmhhbmRsZXJzKSA6CiAgICAgICAgICAgICBtU3RhdGUoRGhjcFN0YXRlOjpJTklUKSwgbUhhbmRsZXJzKGhhbmRsZXJzKSB7CiAgICAgbVNlcnZpY2VNYW5hZ2VyID0gbmV3IFNlcnZpY2VNYW5hZ2VyKCk7CmRpZmYgLS1naXQgYS9wYXRjaC50eHQgYi9wYXRjaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4OTY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhdGNoLnR4dApAQCAtMCwwICsxLDE2IEBACitkaWZmIC0tZ2l0IGEvaW5pdC91dGlsLmMgYi9pbml0L3V0aWwuYworaW5kZXggNGQ5OGNjMi4uMDY2NzU5MyAxMDA3NTUKKy0tLSBhL2luaXQvdXRpbC5jCisrKysgYi9pbml0L3V0aWwuYworQEAgLTY1Nyw4ICs2NTcsOSBAQCBzdGF0aWMgdm9pZCBnZXRfaGFyZHdhcmVfbmFtZSh2b2lkKQorICAgICAgICAgaWYgKHgpIHsKKyAgICAgICAgICAgICB4ICs9IDI7CisgICAgICAgICAgICAgbiA9IDA7CistICAgICAgICAgICAgd2hpbGUgKCp4ICYmICFpc3NwYWNlKCp4KSkgeworLSAgICAgICAgICAgICAgICBoYXJkd2FyZVtuKytdID0gdG9sb3dlcigqeCk7CisrICAgICAgICAgICAgd2hpbGUgKCp4ICYmICp4ICE9ICdcbicpIHsKKysgICAgICAgICAgICAgICAgaWYgKCFpc3NwYWNlKCp4KSkKKysgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlW24rK10gPSB0b2xvd2VyKCp4KTsKKyAgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgICAgICBpZiAobiA9PSAzMSkgYnJlYWs7CisgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcm9vdGRpci9BbmRyb2lkLm1rIGIvcm9vdGRpci9BbmRyb2lkLm1rCmluZGV4IDMyOWJlN2YuLjM4MGJiNjAgMTAwNjQ0Ci0tLSBhL3Jvb3RkaXIvQW5kcm9pZC5taworKysgYi9yb290ZGlyL0FuZHJvaWQubWsKQEAgLTcsNyArNyw3IEBACiAJZXRjL2RidXMuY29uZiBcCiAJZXRjL2hvc3RzCiAKLWlmZXEgKCQoVEFSR0VUX1BST0RVQ1QpLGdlbmVyaWMpCitpZmVxICgkKFRBUkdFVF9QUk9EVUNUKSxmdWxsKQogY29weV9mcm9tICs9IGV0Yy92b2xkLmZzdGFiCiBlbmRpZgogCmRpZmYgLS1naXQgYS9yb290ZGlyL2V0Yy9pbml0LmdvbGRmaXNoLnNoIGIvcm9vdGRpci9ldGMvaW5pdC5nb2xkZmlzaC5zaAppbmRleCA1ZmYwYTNhLi5jZmEyYzgyIDEwMDc1NQotLS0gYS9yb290ZGlyL2V0Yy9pbml0LmdvbGRmaXNoLnNoCisrKyBiL3Jvb3RkaXIvZXRjL2luaXQuZ29sZGZpc2guc2gKQEAgLTQ1LDMgKzQ1LDEzIEBACiAjIHRoaXMgbGluZSBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZyB1c2VmdWwuIGhvd2V2ZXIgd2l0aG91dCBpdCB0aGUKICMgcHJldmlvdXMgc2V0cHJvcCBkb2Vzbid0IHNlZW0gdG8gYXBwbHkgZm9yIHNvbWUgcmVhbGx5IG9kZCByZWFzb24KIHNldHByb3Agcm8ucWVtdS5pbml0LmNvbXBsZXRlZCAxCisKKyMgc2V0IHVwIHRoZSBzZWNvbmQgaW50ZXJmYWNlIChmb3IgaW50ZXItZW11bGF0b3IgY29ubmVjdGlvbnMpCisjIGlmIHJlcXVpcmVkCitteV9pcD1gZ2V0cHJvcCBuZXQuc2hhcmVkX25ldF9pcGAKK2Nhc2UgIiRteV9pcCIgaW4KKyAgICAiIikKKyAgICA7OworICAgICopIGlmY29uZmlnIGV0aDEgIiRteV9pcCIgbmV0bWFzayAyNTUuMjU1LjI1NS4wIHVwCisgICAgOzsKK2VzYWMKZGlmZiAtLWdpdCBhL3NoL0FuZHJvaWQubWsgYi9zaC9BbmRyb2lkLm1rCmluZGV4IGI1ZTVjMzguLmRjZDEzZDggMTAwNjQ0Ci0tLSBhL3NoL0FuZHJvaWQubWsKKysrIGIvc2gvQW5kcm9pZC5tawpAQCAtMjksNyArMjksOCBAQAogCWJsdGluL2VjaG8uYyBcCiAJaW5pdC5jCiAKLUxPQ0FMX01PRFVMRTo9IHNoCitMT0NBTF9NT0RVTEU6PSBhc2gKK0xPQ0FMX01PRFVMRV9UQUdTOj0gc2hlbGxfYXNoCiAKIExPQ0FMX0NGTEFHUyArPSAtRFNIRUxMIC1EV0lUSF9MSU5FTk9JU0UKIApAQCAtNTEsMyArNTIsMTkgQEAKIAlzaCAuL21raW5pdC5zaCAkKFBSSVZBVEVfU1JDX0ZJTEVTKSAKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKworIyBjcmVhdGUgL3N5c3RlbS9iaW4vc2ggc3ltbGluayB0byAkKFRBUkdFVF9TSEVMTCkKKyMgbm90IHRoZSBvcHRpbWFsIHBsYWNlIGZvciB0aGlzLCBidXQgYSBmaXR0aW5nIG9uZQorCitPVVRTWVNURU1CSU5TSCA6PSAkKFRBUkdFVF9PVVQpL2Jpbi9zaAorTE9DQUxfTU9EVUxFIDo9IHN5c3RlbWJpbnNoCiskKE9VVFNZU1RFTUJJTlNIKTogfCAkKFRBUkdFVF9TSEVMTCkKKyQoT1VUU1lTVEVNQklOU0gpOiBMT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCiskKE9VVFNZU1RFTUJJTlNIKToKKwlAZWNobyAiU3ltbGluazogJEAgLT4gJChUQVJHRVRfU0hFTEwpIgorCUBybSAtcmYgJEAKKwkkKGhpZGUpIGxuIC1zZiAkKFRBUkdFVF9TSEVMTCkgJEAKKworQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChPVVRTWVNURU1CSU5TSCkKK0FMTF9NT0RVTEVTLiQoTE9DQUxfTU9EVUxFKS5JTlNUQUxMRUQgKz0gJChPVVRTWVNURU1CSU5TSCkKZGlmZiAtLWdpdCBhL3Rvb2xib3gvQW5kcm9pZC5tayBiL3Rvb2xib3gvQW5kcm9pZC5tawppbmRleCA1ODhkYWMwLi5lZjM5ODBhIDEwMDY0NAotLS0gYS90b29sYm94L0FuZHJvaWQubWsKKysrIGIvdG9vbGJveC9BbmRyb2lkLm1rCkBAIC00MSw3ICs0MSw3IEBACiAJcHJpbnRlbnYgXAogCXNtZCBcCiAJY2htb2QgXAotICAgIGNob3duIFwKKwljaG93biBcCiAJbmV3ZnNfbXNkb3MgXAogCW5ldHN0YXQgXAogCWlvY3RsIFwKZGlmZiAtLWdpdCBhL3Rvb2xib3gvY2htb2QuYyBiL3Rvb2xib3gvY2htb2QuYwppbmRleCAzMWE1M2JmLi4yYTUyNGU5IDEwMDY0NAotLS0gYS90b29sYm94L2NobW9kLmMKKysrIGIvdG9vbGJveC9jaG1vZC5jCkBAIC00LDE3ICs0LDc0IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvbGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KIAordm9pZCByZWN1cnNlX2NobW9kKGNoYXIqIHBhdGgsIGludCBtb2RlKQoreworICAgIHN0cnVjdCBkaXJlbnQgKmRwOworICAgIERJUiAqZGlyID0gb3BlbmRpcihwYXRoKTsKKyAgICBpZiAoZGlyID09IE5VTEwpIHsKKyAgICAgICAgLy8gbm90IGEgZGlyZWN0b3J5LCBjYXJyeSBvbgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNoYXIgKnN1YnBhdGggPSBtYWxsb2Moc2l6ZW9mKGNoYXIpKlBBVEhfTUFYKTsKKyAgICBpbnQgcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKworICAgIHdoaWxlICgoZHAgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmNtcChkcC0+ZF9uYW1lLCAiLiIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcChkcC0+ZF9uYW1lLCAiLi4iKSA9PSAwKSBjb250aW51ZTsKKworICAgICAgICBpZiAoc3RybGVuKGRwLT5kX25hbWUpICsgcGF0aGxlbiArIDIvKk5VTCBhbmQgc2xhc2gqLyA+IFBBVEhfTUFYKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcGF0aCBzcGVjaWZpZWQ6IHRvbyBsb25nXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBzdHJjcHkoc3VicGF0aCwgcGF0aCk7CisgICAgICAgIHN0cmNhdChzdWJwYXRoLCAiLyIpOworICAgICAgICBzdHJjYXQoc3VicGF0aCwgZHAtPmRfbmFtZSk7CisKKyAgICAgICAgaWYgKGNobW9kKHN1YnBhdGgsIG1vZGUpIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY2htb2QgJXM6ICVzXG4iLCBzdWJwYXRoLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlY3Vyc2VfY2htb2Qoc3VicGF0aCwgbW9kZSk7CisgICAgfQorICAgIGZyZWUoc3VicGF0aCk7CisgICAgY2xvc2VkaXIoZGlyKTsKK30KKworc3RhdGljIGludCB1c2FnZSgpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogY2htb2QgW09QVElPTl0gPE1PREU+IDxGSUxFPlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgIC1SLCAtLXJlY3Vyc2l2ZSAgICAgICAgIGNoYW5nZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgcmVjdXJzaXZlbHlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAtLWhlbHAgICAgICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdFxuIik7CisKKyAgICByZXR1cm4gMTA7Cit9CisKIGludCBjaG1vZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKICAgICBpbnQgaTsKIAotICAgIGlmIChhcmdjIDwgMykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBjaG1vZCA8TU9ERT4gPEZJTEU+XG4iKTsKLSAgICAgICAgcmV0dXJuIDEwOworICAgIGlmIChhcmdjIDwgMyB8fCBzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHVzYWdlKCk7CisgICAgfQorCisgICAgaW50IHJlY3Vyc2l2ZSA9IChzdHJjbXAoYXJndlsxXSwgIi1SIikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGFyZ3ZbMV0sICItLXJlY3Vyc2l2ZSIpID09IDApID8gMSA6IDA7CisKKyAgICBpZiAocmVjdXJzaXZlICYmIGFyZ2MgPCA0KSB7CisgICAgICAgIHJldHVybiB1c2FnZSgpOworICAgIH0KKworICAgIGlmIChyZWN1cnNpdmUpIHsKKyAgICAgICAgYXJnYy0tOworICAgICAgICBhcmd2Kys7CiAgICAgfQogCiAgICAgaW50IG1vZGUgPSAwOwpAQCAtMjksMTEgKzg2LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgcysrOwogICAgIH0KKwogICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgaWYgKGNobW9kKGFyZ3ZbaV0sIG1vZGUpIDwgMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY2htb2QgJXM6ICVzXG4iLCBhcmd2W2ldLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgcmV0dXJuIDEwOwogICAgICAgICB9CisgICAgICAgIGlmIChyZWN1cnNpdmUpIHsKKyAgICAgICAgICAgIHJlY3Vyc2VfY2htb2QoYXJndltpXSwgbW9kZSk7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90b29sYm94L2luc21vZC5jIGIvdG9vbGJveC9pbnNtb2QuYwppbmRleCA0NGI5ODQ3Li43NTZhNjRiIDEwMDY0NAotLS0gYS90b29sYm94L2luc21vZC5jCisrKyBiL3Rvb2xib3gvaW5zbW9kLmMKQEAgLTc3LDcgKzc3LDYgQEAKIAkJCW1lbWNweShwdHIsIGFyZ3ZbaV0sIGxlbik7CiAJCQlwdHIgKz0gbGVuOwogCQkJKnB0cisrID0gJyAnOwotCQkJKnB0cisrID0gJ1wwJzsKIAkJfQogCQkqKHB0ciAtIDEpID0gJ1wwJzsKIAl9CmRpZmYgLS1naXQgYS90b29sYm94L2xzLmMgYi90b29sYm94L2xzLmMKaW5kZXggODc5OTUxNC4uOTYyYmY0NyAxMDA2NDQKLS0tIGEvdG9vbGJveC9scy5jCisrKyBiL3Rvb2xib3gvbHMuYwpAQCAtMTMsNiArMTMsMTMwIEBACiAjaW5jbHVkZSA8Z3JwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworLy8gZHluYW1pYyBhcnJheXMKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgY291bnQ7CisgICAgaW50IGNhcGFjaXR5OworICAgIHZvaWQqKiBpdGVtczsKK30gZHluYXJyYXlfdDsKKworI2RlZmluZSBEWU5BUlJBWV9JTklUSUFMSVpFUiAgeyAwLCAwLCBOVUxMIH0KKworc3RhdGljIHZvaWQgZHluYXJyYXlfaW5pdCggZHluYXJyYXlfdCAqYSApCit7CisgICAgYS0+Y291bnQgPSBhLT5jYXBhY2l0eSA9IDA7CisgICAgYS0+aXRlbXMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBkeW5hcnJheV9yZXNlcnZlX21vcmUoIGR5bmFycmF5X3QgKmEsIGludCBjb3VudCApCit7CisgICAgaW50IG9sZF9jYXAgPSBhLT5jYXBhY2l0eTsKKyAgICBpbnQgbmV3X2NhcCA9IG9sZF9jYXA7CisgICAgY29uc3QgaW50IG1heF9jYXAgPSBJTlRfTUFYL3NpemVvZih2b2lkKik7CisgICAgdm9pZCoqIG5ld19pdGVtczsKKyAgICBpbnQgbmV3X2NvdW50ID0gYS0+Y291bnQgKyBjb3VudDsKKworICAgIGlmIChjb3VudCA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoY291bnQgPiBtYXhfY2FwIC0gYS0+Y291bnQpCisgICAgICAgIGFib3J0KCk7CisKKyAgICBuZXdfY291bnQgPSBhLT5jb3VudCArIGNvdW50OworCisgICAgd2hpbGUgKG5ld19jYXAgPCBuZXdfY291bnQpIHsKKyAgICAgICAgb2xkX2NhcCA9IG5ld19jYXA7CisgICAgICAgIG5ld19jYXAgKz0gKG5ld19jYXAgPj4gMikgKyA0OworICAgICAgICBpZiAobmV3X2NhcCA8IG9sZF9jYXAgfHwgbmV3X2NhcCA+IG1heF9jYXApIHsKKyAgICAgICAgICAgIG5ld19jYXAgPSBtYXhfY2FwOworICAgICAgICB9CisgICAgfQorICAgIG5ld19pdGVtcyA9IHJlYWxsb2MoYS0+aXRlbXMsIG5ld19jYXAqc2l6ZW9mKHZvaWQqKSk7CisgICAgaWYgKG5ld19pdGVtcyA9PSBOVUxMKQorICAgICAgICBhYm9ydCgpOworCisgICAgYS0+aXRlbXMgPSBuZXdfaXRlbXM7CisgICAgYS0+Y2FwYWNpdHkgPSBuZXdfY2FwOworfQorCitzdGF0aWMgdm9pZCBkeW5hcnJheV9hcHBlbmQoIGR5bmFycmF5X3QgKmEsIHZvaWQqIGl0ZW0gKQoreworICAgIGlmIChhLT5jb3VudCA+PSBhLT5jYXBhY2l0eSkKKyAgICAgICAgZHluYXJyYXlfcmVzZXJ2ZV9tb3JlKGEsIDEpOworCisgICAgYS0+aXRlbXNbYS0+Y291bnQrK10gPSBpdGVtOworfQorCitzdGF0aWMgdm9pZCBkeW5hcnJheV9kb25lKCBkeW5hcnJheV90ICphICkKK3sKKyAgICBmcmVlKGEtPml0ZW1zKTsKKyAgICBhLT5pdGVtcyA9IE5VTEw7CisgICAgYS0+Y291bnQgPSBhLT5jYXBhY2l0eSA9IDA7Cit9CisKKyNkZWZpbmUgRFlOQVJSQVlfRk9SRUFDSF9UWVBFKF9hcnJheSxfaXRlbV90eXBlLF9pdGVtLF9zdG1udCkgXAorICAgIGRvIHsgXAorICAgICAgICBpbnQgX25uXyMjX19MSU5FX18gPSAwOyBcCisgICAgICAgIGZvciAoO19ubl8jI19fTElORV9fIDwgKF9hcnJheSktPmNvdW50OyArKyBfbm5fIyNfX0xJTkVfXykgeyBcCisgICAgICAgICAgICBfaXRlbV90eXBlIF9pdGVtID0gKF9pdGVtX3R5cGUpKF9hcnJheSktPml0ZW1zW19ubl8jI19fTElORV9fXTsgXAorICAgICAgICAgICAgX3N0bW50OyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRFlOQVJSQVlfRk9SRUFDSChfYXJyYXksX2l0ZW0sX3N0bW50KSBcCisgICAgRFlOQVJSQVlfRk9SRUFDSF9UWVBFKF9hcnJheSx2b2lkICosX2l0ZW0sX3N0bW50KQorCisvLyBzdHJpbmcgYXJyYXlzCisKK3R5cGVkZWYgZHluYXJyYXlfdCAgc3RybGlzdF90OworCisjZGVmaW5lICBTVFJMSVNUX0lOSVRJQUxJWkVSICBEWU5BUlJBWV9JTklUSUFMSVpFUgorCisjZGVmaW5lICBTVFJMSVNUX0ZPUkVBQ0goX2xpc3QsX3N0cmluZyxfc3RtbnQpIFwKKyAgICBEWU5BUlJBWV9GT1JFQUNIX1RZUEUoX2xpc3QsY2hhciAqLF9zdHJpbmcsX3N0bW50KQorCitzdGF0aWMgdm9pZCBzdHJsaXN0X2luaXQoIHN0cmxpc3RfdCAqbGlzdCApCit7CisgICAgZHluYXJyYXlfaW5pdChsaXN0KTsKK30KKworc3RhdGljIHZvaWQgc3RybGlzdF9hcHBlbmRfYiggc3RybGlzdF90ICpsaXN0LCBjb25zdCB2b2lkKiBzdHIsIHNpemVfdCAgc2xlbiApCit7CisgICAgY2hhciAqY29weSA9IG1hbGxvYyhzbGVuKzEpOworICAgIG1lbWNweShjb3B5LCBzdHIsIHNsZW4pOworICAgIGNvcHlbc2xlbl0gPSAnXDAnOworICAgIGR5bmFycmF5X2FwcGVuZChsaXN0LCBjb3B5KTsKK30KKworc3RhdGljIHZvaWQgc3RybGlzdF9hcHBlbmRfZHVwKCBzdHJsaXN0X3QgKmxpc3QsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBzdHJsaXN0X2FwcGVuZF9iKGxpc3QsIHN0ciwgc3RybGVuKHN0cikpOworfQorCitzdGF0aWMgdm9pZCBzdHJsaXN0X2RvbmUoIHN0cmxpc3RfdCAqbGlzdCApCit7CisgICAgU1RSTElTVF9GT1JFQUNIKGxpc3QsIHN0cmluZywgZnJlZShzdHJpbmcpKTsKKyAgICBkeW5hcnJheV9kb25lKGxpc3QpOworfQorCitzdGF0aWMgaW50IHN0cmxpc3RfY29tcGFyZV9zdHJpbmdzKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIpCit7CisgICAgY29uc3QgY2hhciAqc2EgPSAqKGNvbnN0IGNoYXIgKiopYTsKKyAgICBjb25zdCBjaGFyICpzYiA9ICooY29uc3QgY2hhciAqKiliOworICAgIHJldHVybiBzdHJjbXAoc2EsIHNiKTsKK30KKworc3RhdGljIHZvaWQgc3RybGlzdF9zb3J0KCBzdHJsaXN0X3QgKmxpc3QgKQoreworICAgIGlmIChsaXN0LT5jb3VudCA+IDApIHsKKyAgICAgICAgcXNvcnQobGlzdC0+aXRlbXMsIAorICAgICAgICAgICAgICAoc2l6ZV90KWxpc3QtPmNvdW50LAorICAgICAgICAgICAgICBzaXplb2Yodm9pZCopLAorICAgICAgICAgICAgICBzdHJsaXN0X2NvbXBhcmVfc3RyaW5ncyk7CisgICAgfQorfQogCiAvLyBiaXRzIGZvciBmbGFncyBhcmd1bWVudAogI2RlZmluZSBMSVNUX0xPTkcgICAgICAgICAgICgxIDw8IDApCkBAIC0yMzMsNyArMzU3LDggQEAKICAgICBjaGFyIHRtcFs0MDk2XTsKICAgICBESVIgKmQ7CiAgICAgc3RydWN0IGRpcmVudCAqZGU7Ci0KKyAgICBzdHJsaXN0X3QgIGZpbGVzID0gU1RSTElTVF9JTklUSUFMSVpFUjsKKyAgICAKICAgICBkID0gb3BlbmRpcihuYW1lKTsKICAgICBpZihkID09IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcGVuZGlyIGZhaWxlZCwgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CkBAIC0yNDgsMTAgKzM3MywxNiBAQAogICAgICAgICBpZiAoIXN0cmNtcChkZS0+ZF9uYW1lLCAiLiIpIHx8ICFzdHJjbXAoZGUtPmRfbmFtZSwgIi4uIikpIGNvbnRpbnVlOwogICAgICAgICBpZihkZS0+ZF9uYW1lWzBdID09ICcuJyAmJiAoZmxhZ3MgJiBMSVNUX0FMTCkgPT0gMCkgY29udGludWU7CiAKLSAgICAgICAgbGlzdGZpbGUobmFtZSwgZGUtPmRfbmFtZSwgZmxhZ3MpOworICAgICAgICBzdHJsaXN0X2FwcGVuZF9kdXAoJmZpbGVzLCBkZS0+ZF9uYW1lKTsKICAgICB9CiAKKyAgICBzdHJsaXN0X3NvcnQoJmZpbGVzKTsKKyAgICBTVFJMSVNUX0ZPUkVBQ0goJmZpbGVzLCBmaWxlbmFtZSwgbGlzdGZpbGUobmFtZSwgZmlsZW5hbWUsIGZsYWdzKSk7CisgICAgc3RybGlzdF9kb25lKCZmaWxlcyk7CisKICAgICBpZiAoZmxhZ3MgJiBMSVNUX1JFQ1VSU0lWRSkgeworICAgICAgICBzdHJsaXN0X3Qgc3ViZGlycyA9IFNUUkxJU1RfSU5JVElBTElaRVI7CisKICAgICAgICAgcmV3aW5kZGlyKGQpOwogCiAgICAgICAgIHdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSAhPSAwKSB7CkBAIC0yODQsMTAgKzQxNSwxNSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoU19JU0RJUihzLnN0X21vZGUpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcbiVzOlxuIiwgdG1wKTsKLSAgICAgICAgICAgICAgICBsaXN0ZGlyKHRtcCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIHN0cmxpc3RfYXBwZW5kX2R1cCgmc3ViZGlycywgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBzdHJsaXN0X3NvcnQoJnN1YmRpcnMpOworICAgICAgICBTVFJMSVNUX0ZPUkVBQ0goJnN1YmRpcnMsIHBhdGgsIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4lczpcbiIsIHBhdGgpOworICAgICAgICAgICAgbGlzdGRpcihwYXRoLCBmbGFncyk7CisgICAgICAgIH0pOworICAgICAgICBzdHJsaXN0X2RvbmUoJnN1YmRpcnMpOwogICAgIH0KIAogICAgIGNsb3NlZGlyKGQpOwpAQCAtMzMxLDI3ICs0NjcsNDAgQEAKICAgICBpZihhcmdjID4gMSkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgaW50IGVyciA9IDA7CisgICAgICAgIHN0cmxpc3RfdCAgZmlsZXMgPSBTVFJMSVNUX0lOSVRJQUxJWkVSOwogCiAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICItbCIpKSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gTElTVF9MT05HOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItcyIpKSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gTElTVF9TSVpFOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItYSIpKSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gTElTVF9BTEw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1SIikpIHsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBMSVNUX1JFQ1VSU0lWRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWQiKSkgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IExJU1RfRElSRUNUT1JJRVM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxpc3RlZCsrOwotICAgICAgICAgICAgICAgIGlmKGxpc3RwYXRoKGFyZ3ZbaV0sIGZsYWdzKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgIGlmIChhcmd2W2ldWzBdID09ICctJykgeworICAgICAgICAgICAgICAgIC8qIGFuIG9wdGlvbiA/ICovCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXSsxOworICAgICAgICAgICAgICAgIHdoaWxlIChhcmdbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhcmdbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6IGZsYWdzIHw9IExJU1RfTE9ORzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOiBmbGFncyB8PSBMSVNUX1NJWkU7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdSJzogZmxhZ3MgfD0gTElTVF9SRUNVUlNJVkU7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzogZmxhZ3MgfD0gTElTVF9ESVJFQ1RPUklFUzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2EnOiBmbGFncyB8PSBMSVNUX0FMTDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBVbmtub3duIG9wdGlvbiAnLSVjJy4gQWJvcnRpbmcuXG4iLCAibHMiLCBhcmdbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhcmcrKzsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG5vdCBhbiBvcHRpb24gPyAqLworICAgICAgICAgICAgICAgIHN0cmxpc3RfYXBwZW5kX2R1cCgmZmlsZXMsIGFyZ3ZbaV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGxpc3RlZCAgPiAwKSByZXR1cm4gZXJyOworICAgICAgICBpZiAoZmlsZXMuY291bnQgPiAwKSB7CisgICAgICAgICAgICBTVFJMSVNUX0ZPUkVBQ0goJmZpbGVzLCBwYXRoLCB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RwYXRoKHBhdGgsIGZsYWdzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHN0cmxpc3RfZG9uZSgmZmlsZXMpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICAvLyBsaXN0IHdvcmtpbmcgZGlyZWN0b3J5IGlmIG5vIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHdlcmUgc3BlY2lmaWVkICAgIApkaWZmIC0tZ2l0IGEvdG9vbGJveC9ta2Rpci5jIGIvdG9vbGJveC9ta2Rpci5jCmluZGV4IDEyMWFkYWIuLjY1Njk3MGEgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvbWtkaXIuYworKysgYi90b29sYm94L21rZGlyLmMKQEAgLTIsMTAgKzIsMTQgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9saW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgogCiBzdGF0aWMgaW50IHVzYWdlKCkKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwibWtkaXIgPHRhcmdldD5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCJta2RpciBbT1BUSU9OXSA8dGFyZ2V0PlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAtLWhlbHAgICAgICAgICAgIGRpc3BsYXkgdXNhZ2UgYW5kIGV4aXRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLXAsIC0tcGFyZW50cyAgICBjcmVhdGUgcGFyZW50IGRpcmVjdG9yaWVzIGFzIG5lZWRlZFxuIik7CiAgICAgcmV0dXJuIC0xOwogfQogCkBAIC0xMywxNSArMTcsNjAgQEAKIHsKICAgICBpbnQgc3ltYm9saWMgPSAwOwogICAgIGludCByZXQ7Ci0gICAgaWYoYXJnYyA8IDIpIHJldHVybiB1c2FnZSgpOworICAgIGlmKGFyZ2MgPCAyIHx8IHN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikgPT0gMCkgeworICAgICAgICByZXR1cm4gdXNhZ2UoKTsKKyAgICB9CisKKyAgICBpbnQgcmVjdXJzaXZlID0gKHN0cmNtcChhcmd2WzFdLCAiLXAiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoYXJndlsxXSwgIi0tcGFyZW50cyIpID09IDApID8gMSA6IDA7CisKKyAgICBpZihyZWN1cnNpdmUgJiYgYXJnYyA8IDMpIHsKKyAgICAgICAgLy8gLXAgc3BlY2lmaWVkIHdpdGhvdXQgYSBwYXRoCisgICAgICAgIHJldHVybiB1c2FnZSgpOworICAgIH0KKworICAgIGlmKHJlY3Vyc2l2ZSkgeworICAgICAgICBhcmdjLS07CisgICAgICAgIGFyZ3YrKzsKKyAgICB9CisKKyAgICBjaGFyIGN1cnJwYXRoW1BBVEhfTUFYXSwgKnBhdGhwaWVjZTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKIAogICAgIHdoaWxlKGFyZ2MgPiAxKSB7CiAgICAgICAgIGFyZ2MtLTsKICAgICAgICAgYXJndisrOwotICAgICAgICByZXQgPSBta2Rpcihhcmd2WzBdLCAwNzc3KTsKLSAgICAgICAgaWYocmV0IDwgMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJta2RpciBmYWlsZWQgZm9yICVzLCAlc1xuIiwgYXJndlswXSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmKHJlY3Vyc2l2ZSkgeworICAgICAgICAgICAgLy8gcmVzZXQgcGF0aAorICAgICAgICAgICAgc3RyY3B5KGN1cnJwYXRoLCAiIik7CisgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHBpZWNlcyBvZiB0aGUgcGF0aCBhbG9uZyB0aGUgd2F5CisgICAgICAgICAgICBwYXRocGllY2UgPSBzdHJ0b2soYXJndlswXSwgIi8iKTsKKyAgICAgICAgICAgIGlmKGFyZ3ZbMF1bMF0gPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgLy8gcHJlcGVuZCAvIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgIHN0cmNhdChjdXJycGF0aCwgIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlKHBhdGhwaWVjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYoc3RybGVuKGN1cnJwYXRoKSArIHN0cmxlbihwYXRocGllY2UpICsgMi8qTlVMIGFuZCBzbGFzaCovID4gUEFUSF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHBhdGggc3BlY2lmaWVkOiB0b28gbG9uZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJjYXQoY3VycnBhdGgsIHBhdGhwaWVjZSk7CisgICAgICAgICAgICAgICAgc3RyY2F0KGN1cnJwYXRoLCAiLyIpOworICAgICAgICAgICAgICAgIGlmKHN0YXQoY3VycnBhdGgsICZzdCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBta2RpcihjdXJycGF0aCwgMDc3Nyk7CisgICAgICAgICAgICAgICAgICAgIGlmKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWtkaXIgZmFpbGVkIGZvciAlcywgJXNcbiIsIGN1cnJwYXRoLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRocGllY2UgPSBzdHJ0b2soTlVMTCwgIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IG1rZGlyKGFyZ3ZbMF0sIDA3NzcpOworICAgICAgICAgICAgaWYocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWtkaXIgZmFpbGVkIGZvciAlcywgJXNcbiIsIGFyZ3ZbMF0sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICAKZGlmZiAtLWdpdCBhL3Rvb2xib3gvcm91dGUuYyBiL3Rvb2xib3gvcm91dGUuYwppbmRleCAxMDdlNDhhLi4zZTEwMDE0IDEwMDY0NAotLS0gYS90b29sYm94L3JvdXRlLmMKKysrIGIvdG9vbGJveC9yb3V0ZS5jCkBAIC04MCwxNCArODAsMjQgQEAKIAogICAgICAgICAvKiByb3V0ZSBhZGQgLW5ldCAxOTIuMTY4LjEuMiBuZXRtYXNrIDI1NS4yNTUuMjU1LjAgZ3cgMTkyLjE2OC4xLjEgKi8KICAgICAgICAgaWYgKGFyZ2MgPiA3ICYmICFzdHJjbXAoYXJndlsyXSwgIi1uZXQiKSAmJgotICAgICAgICAgICAgIXN0cmNtcChhcmd2WzRdLCAibmV0bWFzayIpICYmICFzdHJjbXAoYXJndls2XSwgImd3IikpIHsKLSAgICAgICAgICAgIHJ0LnJ0X2ZsYWdzID0gUlRGX1VQIHwgUlRGX0dBVEVXQVk7Ci0gICAgICAgICAgICBpZiAoc2V0X2FkZHJlc3MoYXJndlszXSwgJnJ0LnJ0X2RzdCkgJiYKLSAgICAgICAgICAgICAgICBzZXRfYWRkcmVzcyhhcmd2WzVdLCAmcnQucnRfZ2VubWFzaykgJiYKLSAgICAgICAgICAgICAgICBzZXRfYWRkcmVzcyhhcmd2WzddLCAmcnQucnRfZ2F0ZXdheSkpIHsKLSAgICAgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICAgICAgIXN0cmNtcChhcmd2WzRdLCAibmV0bWFzayIpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChhcmd2WzZdLCAiZ3ciKSkgeworICAgICAgICAgICAgICAgIHJ0LnJ0X2ZsYWdzID0gUlRGX1VQIHwgUlRGX0dBVEVXQVk7CisgICAgICAgICAgICAgICAgaWYgKHNldF9hZGRyZXNzKGFyZ3ZbM10sICZydC5ydF9kc3QpICYmCisgICAgICAgICAgICAgICAgICAgIHNldF9hZGRyZXNzKGFyZ3ZbNV0sICZydC5ydF9nZW5tYXNrKSAmJgorICAgICAgICAgICAgICAgICAgICBzZXRfYWRkcmVzcyhhcmd2WzddLCAmcnQucnRfZ2F0ZXdheSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIGFwcGx5OworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbNl0sICJkZXYiKSkgeworICAgICAgICAgICAgICAgIHJ0LnJ0X2ZsYWdzID0gUlRGX1VQOworICAgICAgICAgICAgICAgIHJ0LnJ0X2RldiA9IGFyZ3ZbN107CisgICAgICAgICAgICAgICAgaWYgKHNldF9hZGRyZXNzKGFyZ3ZbM10sICZydC5ydF9kc3QpICYmCisgICAgICAgICAgICAgICAgICAgIHNldF9hZGRyZXNzKGFyZ3ZbNV0sICZydC5ydF9nZW5tYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gYXBwbHk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBnb3RvIGFwcGx5OwogICAgICAgICB9CiAgICAgfQogCg==