ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJ0aW55YWxzYS9hbHNhdGVzdC5jIGIvYXAvbGliL2xpYnRpbnlhbHNhL2Fsc2F0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5OWZmZgotLS0gL2Rldi9udWxsCisrKyBiL2FwL2xpYi9saWJ0aW55YWxzYS9hbHNhdGVzdC5jCkBAIC0wLDAgKzEsNzY0IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKy8vI2luY2x1ZGUgPHN0ZGxpYi5oPgorLy8jaW5jbHVkZSAicHRocmVhZC5oIgorLy8jaW5jbHVkZSAiYWxzYXRlc3QuaCIKKy8vI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHRpbnlhbHNhL2Fzb3VuZGxpYi5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNkZWZpbmUgSURfUklGRiAweDQ2NDY0OTUyCisjZGVmaW5lIElEX1dBVkUgMHg0NTU2NDE1NworI2RlZmluZSBJRF9GTVQgIDB4MjA3NDZkNjYKKyNkZWZpbmUgSURfREFUQSAweDYxNzQ2MTY0CisKKyNkZWZpbmUgRk9STUFUX1BDTSAxCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZiAoYSkgLyBzaXplb2YgKChhKVswXSkpCisKKworc3RydWN0IHJpZmZfd2F2ZV9oZWFkZXIgeworICAgIHVpbnQzMl90IHJpZmZfaWQ7CisgICAgdWludDMyX3QgcmlmZl9zejsKKyAgICB1aW50MzJfdCB3YXZlX2lkOworfTsKKworc3RydWN0IGNodW5rX2hlYWRlciB7CisgICAgdWludDMyX3QgaWQ7CisgICAgdWludDMyX3Qgc3o7Cit9OworCitzdHJ1Y3QgY2h1bmtfZm10IHsKKyAgICB1aW50MTZfdCBhdWRpb19mb3JtYXQ7CisgICAgdWludDE2X3QgbnVtX2NoYW5uZWxzOworICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlOworICAgIHVpbnQzMl90IGJ5dGVfcmF0ZTsKKyAgICB1aW50MTZfdCBibG9ja19hbGlnbjsKKyAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGU7Cit9Oworc3RydWN0IHdhdl9oZWFkZXIgeworICAgIHVpbnQzMl90IHJpZmZfaWQ7CisgICAgdWludDMyX3QgcmlmZl9zejsKKyAgICB1aW50MzJfdCByaWZmX2ZtdDsKKyAgICB1aW50MzJfdCBmbXRfaWQ7CisgICAgdWludDMyX3QgZm10X3N6OworICAgIHVpbnQxNl90IGF1ZGlvX2Zvcm1hdDsKKyAgICB1aW50MTZfdCBudW1fY2hhbm5lbHM7CisgICAgdWludDMyX3Qgc2FtcGxlX3JhdGU7CisgICAgdWludDMyX3QgYnl0ZV9yYXRlOworICAgIHVpbnQxNl90IGJsb2NrX2FsaWduOworICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZTsKKyAgICB1aW50MzJfdCBkYXRhX2lkOworICAgIHVpbnQzMl90IGRhdGFfc3o7Cit9OworCitlbnVtIHRfb3V0cHV0X3BhdGh7CisJVF9PVVRQVVRfUkVDRUlWRVIsCisJVF9PVVRQVVRfU1BFQUtFUiwKKwlUX09VVFBVVF9IRUFEU0VULAorfTsKKworZW51bSB0X2lucHV0X3BhdGh7CisJVF9JTlBVVF9NSUNMUCwKKwlUX0lOUFVUX01JQ1JQLAorfTsKKworZW51bSB0X291dHB1dF92b2x7CisJVF9PVVRQVVRfVk9MX01JTlVTXzYzXzVEQiA9IDAsCisJVF9PVVRQVVRfVk9MX01JTlVTXzYzREIgPSAxLAorCVRfT1VUUFVUX1ZPTF9NSU5VU182REIgPSAxMTUsCisJVF9PVVRQVVRfVk9MX01JTlVTXzNEQiA9IDEyMSwKKwlUX09VVFBVVF9WT0xfTUlOVVNfMkRCID0gMTIzLAorCVRfT1VUUFVUX1ZPTF9NSU5VU18xREIgPSAxMjUsCisJVF9PVVRQVVRfVk9MXzBEQiA9IDEyNywKKwlUX09VVFBVVF9WT0xfMURCID0gMTI5LAorCVRfT1VUUFVUX1ZPTF8yREIgPSAxMzEsCisJVF9PVVRQVVRfVk9MXzNEQiA9IDEzMywKKwlUX09VVFBVVF9WT0xfNkRCID0gMTM5LAorCVRfT1VUUFVUX1ZPTF85REIgPSAxNDUsCisJVF9PVVRQVVRfVk9MXzEyREIgPSAxNTEsCisJVF9PVVRQVVRfVk9MXzI0REIgPSAxNzUsCit9OworCitlbnVtIHRfaW5wdXRfdm9seworCVRfSU5QVVRfVk9MX01JTlVTXzEyREIgPSAwLAorCVRfSU5QVVRfVk9MX01JTlVTXzNEQiA9IDE4LAorCVRfSU5QVVRfVk9MX01JTlVTXzJEQiA9IDIwLAorCVRfSU5QVVRfVk9MX01JTlVTXzFEQiA9IDIyLAorCVRfSU5QVVRfVk9MXzBEQiA9IDI0LAorCVRfSU5QVVRfVk9MXzFEQiA9IDI2LAorCVRfSU5QVVRfVk9MXzJEQiA9IDI4LAorCVRfSU5QVVRfVk9MXzNEQiA9IDMwLAorCVRfSU5QVVRfVk9MXzIwREIgPSA2NCwKK307CisKK3N0cnVjdCBhdWRpb19wYXJhX2NvbmYgeworICAgIGNvbnN0IGNoYXIgKmNvbnRyb2w7CisgICAgY2hhciAqdmFsdWVzWzJdOworfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19wYXJhX2NvbmYgIGNvbW1vbl9vdXRfcGFyYV9hdWRpb1tdID0geyAgLy+21NOmuau5srK/t9YKKwl7IlNwZWFrZXIgQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIseyIxMjcifX0sCisJeyJTcGVha2VyIERyaXZlciBQbGF5YmFjayBTd2l0Y2giLHsiMSJ9fSwKKwl7IkRBQyBMZWZ0IElucHV0Iix7Ik1vbm8ifX0sCisJeyJEQUMgUmlnaHQgSW5wdXQiLHsiTW9ubyJ9fSwKKwl7Ik91dHB1dCBSaWdodCBGcm9tIFJpZ2h0IERBQyIseyIxIn19LAorCXsiT3V0cHV0IExlZnQgRnJvbSBMZWZ0IERBQyIseyIxIn19LAorCXsiSFAgQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIseyIxMjciLCIxMjcifX0sCisJeyJIUCBEcml2ZXIgUGxheWJhY2sgU3dpdGNoIix7IjEiLCIxIn19LCAgLy83ZEIJCisKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fcGFyYV9jb25mICBjb21tb25faW5fcGFyYV9hdWRpb1tdID0geyAgLy+21NOmuau5srK/t9YKKwl7Ik1pYyBQR0EgQ2FwdHVyZSBWb2x1bWUiLHsiNDAifX0sCisJeyJBREMgQ2FwdHVyZSBTd2l0Y2giLHsiMSJ9fSwKKwl7IkFEQyBGaW5lIENhcHR1cmUgVm9sdW1lIix7IjAifX0sCisJCit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX3BhcmFfY29uZiAgaHBfb3V0cGF0aF9wYXJhX2F1ZGlvW10gPSB7ICAvL7bU06bT2khwyuSz9s2otcAKKwl7IlNwZWFrZXIgU3dpdGNoIix7IjAifX0sCQorCXsiSFAgTGVmdCBTd2l0Y2giLHsiMSJ9fSwKKwl7IkhQIFJpZ2h0IFN3aXRjaCIseyIxIn19LAkKKwl7IkhQIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLHsiMCIsIjAifX0sCit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX3BhcmFfY29uZiAgc3BrX291dHBhdGhfcGFyYV9hdWRpb1tdID0geyAvL7bU06bT2lNwa8rks/bNqLXACQorCXsiU3BlYWtlciBTd2l0Y2giLHsiMSJ9fSwJCisJeyJTcGVha2VyIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLHsiMiJ9fSwgLy8xOGRCCisJeyJIUCBMZWZ0IFN3aXRjaCIseyIwIn19LAorCXsiSFAgUmlnaHQgU3dpdGNoIix7IjAifX0sCQorfTsKKworc3RhdGljICBzdHJ1Y3QgIGF1ZGlvX3BhcmFfY29uZiAgbWljMWxwX21jMWxtX2lucGF0aF9wYXJhX2F1ZGlvW10gPSB7IC8vttTTptPaTWljMWxwX01pYzFsbcrkyOvNqLXACisJeyJNSUMxTE0gUC1UZXJtaW5hbCIseyJPZmYifX0sCisJeyJNSUMxUlAgUC1UZXJtaW5hbCIseyJPZmYifX0sCisJeyJNSUMxTFAgUC1UZXJtaW5hbCIseyJGRlIgMTAgT2htIn19LAorCXsiTUlDMUxNIE0tVGVybWluYWwiLHsiRkZSIDEwIE9obSJ9fSwKKwkKK307CisKK3N0YXRpYyAgc3RydWN0ICBhdWRpb19wYXJhX2NvbmYgIG1pYzFycF9pbnBhdGhfcGFyYV9hdWRpb1tdID0gey8vttTTptPaTWljMXJwyuTI682otcAKKwl7Ik1JQzFMTSBQLVRlcm1pbmFsIix7Ik9mZiJ9fSwKKwl7Ik1JQzFSUCBQLVRlcm1pbmFsIix7IkZGUiAxMCBPaG0ifX0sCisJeyJNSUMxTFAgUC1UZXJtaW5hbCIseyJPZmYifX0sCisJeyJNSUMxTE0gTS1UZXJtaW5hbCIseyJPZmYifX0sCit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX3BhcmFfY29uZiAgaGFuZHNldF9pbm91dHBhdGhfcGFyYV92b2ljZVtdID0geyAgLy+21NOm09pIcMrks/bNqLXATWljMWxwX01pYzFsbcrkyOvNqLXACisJeyJTcGVha2VyIFN3aXRjaCIseyIwIn19LAkKKwl7IkRBQyBQbGF5YmFjayBWb2x1bWUiLHsiMTI5IiwiMTI5In19LCAgCQorCXsiSFAgTGVmdCBTd2l0Y2giLHsiMSJ9fSwKKwl7IkhQIFJpZ2h0IFN3aXRjaCIseyIxIn19LAkKKwl7IkhQIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLHsiNyIsIjcifX0sCisJeyJNSUMxTE0gUC1UZXJtaW5hbCIseyJPZmYifX0sCisJeyJNSUMxUlAgUC1UZXJtaW5hbCIseyJPZmYifX0sCisJeyJNSUMxTFAgUC1UZXJtaW5hbCIseyJGRlIgMTAgT2htIn19LAorCXsiTUlDMUxNIE0tVGVybWluYWwiLHsiRkZSIDEwIE9obSJ9fSwJCisJeyJBREMgQ2FwdHVyZSBWb2x1bWUiLHsiMjQifX0sCisJeyJ2b2ljZSBwcm9jZXNzaW5nIHBhdGggc2VsZWN0Iix7ImhhbmRzZXQifX0sCisKK307CitzdGF0aWMgc3RydWN0IGF1ZGlvX3BhcmFfY29uZiAgaGVhZHNldF9pbm91dHBhdGhfcGFyYV92b2ljZVtdID0geyAgLy+21NOm09pIcMrks/bNqLXAIE1pYzFycMrkyOvNqLXACisJeyJTcGVha2VyIFN3aXRjaCIseyIwIn19LAkKKwl7IkRBQyBQbGF5YmFjayBWb2x1bWUgIix7IjEyOSIsIjEyOSJ9fSwJCisJeyJIUCBMZWZ0IFN3aXRjaCIseyIxIn19LAorCXsiSFAgUmlnaHQgU3dpdGNoIix7IjEifX0sCQorCXsiSFAgRHJpdmVyIFBsYXliYWNrIFN3aXRjaCIseyI3IiwiNyJ9fSwgIC8vN2RCCQorCXsiTUlDMUxNIFAtVGVybWluYWwiLHsiT2ZmIn19LAorCXsiTUlDMVJQIFAtVGVybWluYWwiLHsiRkZSIDEwIE9obSJ9fSwKKwl7Ik1JQzFMUCBQLVRlcm1pbmFsIix7Ik9mZiJ9fSwKKwl7Ik1JQzFMTSBNLVRlcm1pbmFsIix7Ik9mZiJ9fSwJCisJeyJBREMgQ2FwdHVyZSBWb2x1bWUiLHsiMjQifX0sCisJeyJ2b2ljZSBwcm9jZXNzaW5nIHNlbGVjdCIseyJoZWFkc2V0In19LAorfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19wYXJhX2NvbmYgIHNwa19pbm91dHBhdGhfcGFyYV92b2ljZVtdID0geyAvL7bU06bT2lNwa8rks/bNqLXATWljMWxwX01pYzFsbcrkyOvNqLXACisJCisJeyJEQUMgUGxheWJhY2sgVm9sdW1lIix7IjEyNCIsIjEyNCJ9fSwgIC8vLTEuNWRCCQorCXsiU3BlYWtlciBTd2l0Y2giLHsiMSJ9fSwJCisJeyJTcGVha2VyIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLHsiMiJ9fSwgLy8xOGRCCisJeyJIUCBMZWZ0IFN3aXRjaCIseyIwIn19LAorCXsiSFAgUmlnaHQgU3dpdGNoIix7IjAifX0sCQorCXsiTUlDMUxNIFAtVGVybWluYWwiLHsiT2ZmIn19LAorCXsiTUlDMVJQIFAtVGVybWluYWwiLHsiT2ZmIn19LAorCXsiTUlDMUxQIFAtVGVybWluYWwiLHsiRkZSIDEwIE9obSJ9fSwKKwl7Ik1JQzFMTSBNLVRlcm1pbmFsIix7IkZGUiAxMCBPaG0ifX0sCQorCXsiQURDIENhcHR1cmUgVm9sdW1lIix7IjI0In19LAorCXsidm9pY2UgcHJvY2Vzc2luZyBwYXRoIHNlbGVjdCIseyJzcGVhayJ9fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fcGFyYV9jb25mIG91dHB1dF9kYWNfdm9sID0gCXsiREFDIFBsYXliYWNrIFZvbHVtZSIseyIyNCJ9fTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19wYXJhX2NvbmYgaW5wdXRfYWRjX3ZvbCA9IHsiQURDIENhcHR1cmUgVm9sdW1lIix7IjEyOSIsIjEyOSJ9fTsKKworc3RhdGljIGludCBzaWdfY2xvc2UgPSAxOworCitzdGF0aWMgaW50IHNfb3V0cGF0aCA9IFRfT1VUUFVUX1NQRUFLRVI7CitzdGF0aWMgaW50IHNfaW5wYXRoID0gVF9JTlBVVF9NSUNMUDsKK3N0YXRpYyBpbnQgc19pbnZvbCA9IFRfSU5QVVRfVk9MXzBEQjsKK3N0YXRpYyBpbnQgc19vdXR2b2wgPSBUX09VVFBVVF9WT0xfMERCOworCit2b2lkIHN0cmVhbV9jbG9zZShpbnQgc2lnKQoreworICAgIC8qIGFsbG93IHRoZSBzdHJlYW0gdG8gYmUgY2xvc2VkIGdyYWNlZnVsbHkgKi8KKyAgICBzaWduYWwoc2lnLCBTSUdfSUdOKTsKKyAgICBzaWdfY2xvc2UgPSAwOworfQorCitzdGF0aWMgdm9pZCB0aW55bWl4X3NldF92YWx1ZV90ZXN0KHN0cnVjdCBtaXhlciAqbWl4ZXIsIGNvbnN0IGNoYXIgKmNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdmFsdWVzKQoreworICAgIHN0cnVjdCBtaXhlcl9jdGwgKmN0bDsKKyAgICBlbnVtIG1peGVyX2N0bF90eXBlIHR5cGU7CisgICAgdW5zaWduZWQgaW50IG51bV9jdGxfdmFsdWVzOworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgaWYgKGlzZGlnaXQoY29udHJvbFswXSkpCisgICAgICAgIGN0bCA9IG1peGVyX2dldF9jdGwobWl4ZXIsIGF0b2koY29udHJvbCkpOworICAgIGVsc2UKKyAgICAgICAgY3RsID0gbWl4ZXJfZ2V0X2N0bF9ieV9uYW1lKG1peGVyLCBjb250cm9sKTsKKworICAgIGlmICghY3RsKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBtaXhlciBjb250cm9sXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGUgPSBtaXhlcl9jdGxfZ2V0X3R5cGUoY3RsKTsKKyAgICBudW1fY3RsX3ZhbHVlcyA9IG1peGVyX2N0bF9nZXRfbnVtX3ZhbHVlcyhjdGwpOworCisgICAgaWYgKGlzZGlnaXQodmFsdWVzWzBdWzBdKSkgeyAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY3RsX3ZhbHVlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1peGVyX2N0bF9zZXRfdmFsdWUoY3RsLCBpLCBhdG9pKHZhbHVlc1tpXSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGludmFsaWQgdmFsdWUgZm9yIGluZGV4ICVkXG4iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gTUlYRVJfQ1RMX1RZUEVfRU5VTSkgeworICAgICAgICAgICAgLyppZiAobnVtX3ZhbHVlcyAhPSAxKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFbmNsb3NlIHN0cmluZ3MgaW4gcXVvdGVzIGFuZCB0cnkgYWdhaW5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0qLworICAgICAgICAgICAgaWYgKG1peGVyX2N0bF9zZXRfZW51bV9ieV9zdHJpbmcoY3RsLCB2YWx1ZXNbMF0pKQorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGludmFsaWQgZW51bSB2YWx1ZVxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBvbmx5IGVudW0gdHlwZXMgY2FuIGJlIHNldCB3aXRoIHN0cmluZ3NcbiIpOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgbWl4X3NldF9vdXRwdXRwYXRoKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCBwYXRoKQoreworCWludCBpOworCWZvcihpID0gMDtpPEFSUkFZX1NJWkUoY29tbW9uX291dF9wYXJhX2F1ZGlvKTtpKyspCisJeworIAkgIAl0aW55bWl4X3NldF92YWx1ZV90ZXN0KG1peGVyLGNvbW1vbl9vdXRfcGFyYV9hdWRpb1tpXS5jb250cm9sLGNvbW1vbl9vdXRfcGFyYV9hdWRpb1tpXS52YWx1ZXMpOworCX0KKwlzd2l0Y2gocGF0aCkKKwl7CisJY2FzZSBUX09VVFBVVF9SRUNFSVZFUjoKKwkJZm9yKGkgPSAwO2k8QVJSQVlfU0laRShocF9vdXRwYXRoX3BhcmFfYXVkaW8pO2krKykKKwkJeworCSAJICAJdGlueW1peF9zZXRfdmFsdWVfdGVzdChtaXhlcixocF9vdXRwYXRoX3BhcmFfYXVkaW9baV0uY29udHJvbCxocF9vdXRwYXRoX3BhcmFfYXVkaW9baV0udmFsdWVzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFRfT1VUUFVUX1NQRUFLRVI6CisJCWZvcihpID0gMDtpPEFSUkFZX1NJWkUoc3BrX291dHBhdGhfcGFyYV9hdWRpbyk7aSsrKQorCQl7CisJIAkgIAl0aW55bWl4X3NldF92YWx1ZV90ZXN0KG1peGVyLHNwa19vdXRwYXRoX3BhcmFfYXVkaW9baV0uY29udHJvbCxzcGtfb3V0cGF0aF9wYXJhX2F1ZGlvW2ldLnZhbHVlcyk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtaXhfc2V0X2lucHV0cGF0aChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgcGF0aCkKK3sKKwlpbnQgaTsKKwlmb3IoaSA9IDA7aTxBUlJBWV9TSVpFKGNvbW1vbl9pbl9wYXJhX2F1ZGlvKTtpKyspCisJeworIAkgIAl0aW55bWl4X3NldF92YWx1ZV90ZXN0KG1peGVyLGNvbW1vbl9pbl9wYXJhX2F1ZGlvW2ldLmNvbnRyb2wsY29tbW9uX2luX3BhcmFfYXVkaW9baV0udmFsdWVzKTsKKwl9CisJc3dpdGNoKHBhdGgpCisJeworCWNhc2UgVF9JTlBVVF9NSUNMUDoKKwkJZm9yKGkgPSAwO2k8QVJSQVlfU0laRShtaWMxbHBfbWMxbG1faW5wYXRoX3BhcmFfYXVkaW8pO2krKykKKwkJeworCQkJdGlueW1peF9zZXRfdmFsdWVfdGVzdChtaXhlcixtaWMxbHBfbWMxbG1faW5wYXRoX3BhcmFfYXVkaW9baV0uY29udHJvbCxtaWMxbHBfbWMxbG1faW5wYXRoX3BhcmFfYXVkaW9baV0udmFsdWVzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFRfSU5QVVRfTUlDUlA6CisJCWZvcihpID0gMDtpPEFSUkFZX1NJWkUobWljMXJwX2lucGF0aF9wYXJhX2F1ZGlvKTtpKyspCisJCXsKKwkJCXRpbnltaXhfc2V0X3ZhbHVlX3Rlc3QobWl4ZXIsbWljMXJwX2lucGF0aF9wYXJhX2F1ZGlvW2ldLmNvbnRyb2wsbWljMXJwX2lucGF0aF9wYXJhX2F1ZGlvW2ldLnZhbHVlcyk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtaXhfc2V0X2lucHV0dm9sKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCB2b2x1bWUpCit7CisJCisgICAgc3RydWN0IG1peGVyX2N0bCAqY3RsID0gaW5wdXRfYWRjX3ZvbC5jb250cm9sOworICAgIGVudW0gbWl4ZXJfY3RsX3R5cGUgdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgbnVtX2N0bF92YWx1ZXM7CisgICAgdW5zaWduZWQgaW50IGk7CisJCisgICAgY3RsID0gbWl4ZXJfZ2V0X2N0bF9ieV9uYW1lKG1peGVyLCBjdGwpOworICAgIGlmICghY3RsKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBtaXhlciBjb250cm9sXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwkKKy8vCWludCB2YWx1ZSA9IGF0b2koaW5wdXRfYWRjX3ZvbC52YWx1ZXNbMF0pOworLy8JbWl4ZXJfY3RsX3NldF92YWx1ZShjdGwsIDAsIHZhbHVlKTsKKwltaXhlcl9jdGxfc2V0X3ZhbHVlKGN0bCwgMCwgdm9sdW1lKTsKKwkKKwlyZXR1cm4gMDsKK30KKworaW50IG1peF9zZXRfb3V0cHV0dm9sKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCB2b2x1bWUpCit7CisgICAgc3RydWN0IG1peGVyX2N0bCAqY3RsID0gb3V0cHV0X2RhY192b2wuY29udHJvbDsKKyAgICBlbnVtIG1peGVyX2N0bF90eXBlIHR5cGU7CisgICAgdW5zaWduZWQgaW50IGk7CisJCisgICAgY3RsID0gbWl4ZXJfZ2V0X2N0bF9ieV9uYW1lKG1peGVyLCBjdGwpOworICAgIGlmICghY3RsKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBtaXhlciBjb250cm9sXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwkKKwltaXhlcl9jdGxfc2V0X3ZhbHVlKGN0bCwgMCwgdm9sdW1lKTsKKwltaXhlcl9jdGxfc2V0X3ZhbHVlKGN0bCwgMSwgdm9sdW1lKTsKKy8vCWludCB2YWx1ZSA9IGF0b2kob3V0cHV0X2RhY192b2wudmFsdWVzWzBdKTsKKy8vCW1peGVyX2N0bF9zZXRfdmFsdWUoY3RsLCAwLCB2YWx1ZSk7CisvLwl2YWx1ZSA9IGF0b2kob3V0cHV0X2RhY192b2wudmFsdWVzWzFdKTsKKy8vCW1peGVyX2N0bF9zZXRfdmFsdWUoY3RsLCAxLCB2YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1peF9zZXRfb3V0cHV0X211dGUoc3RydWN0IG1peGVyICptaXhlciwgYm9vbCBlbmFibGUpCit7CisgICBzdHJ1Y3QgbWl4ZXJfY3RsICpjdGwgPSAiREFDIE11dGUiOworICAgIGVudW0gbWl4ZXJfY3RsX3R5cGUgdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKwlwcmludGYoIm1peF9zZXRfb3V0cHV0X211dGUgJWRcbiIsZW5hYmxlKTsKKworICAgIGN0bCA9IG1peGVyX2dldF9jdGxfYnlfbmFtZShtaXhlciwgY3RsKTsKKyAgICBpZiAoIWN0bCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgbWl4ZXIgY29udHJvbFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisJbWl4ZXJfY3RsX3NldF92YWx1ZShjdGwsIDAsIGVuYWJsZSk7CisJbWl4ZXJfY3RsX3NldF92YWx1ZShjdGwsIDEsIGVuYWJsZSk7Cit9CisKK2ludCBtaXhfc2V0X2lucHV0X211dGUoc3RydWN0IG1peGVyICptaXhlciwgYm9vbCBlbmFibGUpCit7CisgICBzdHJ1Y3QgbWl4ZXJfY3RsICpjdGwgPSAiQURDIENhcHR1cmUgU3dpdGNoIjsKKyAgICBlbnVtIG1peGVyX2N0bF90eXBlIHR5cGU7CisgICAgdW5zaWduZWQgaW50IGk7CisJCisgICAgY3RsID0gbWl4ZXJfZ2V0X2N0bF9ieV9uYW1lKG1peGVyLCBjdGwpOworICAgIGlmICghY3RsKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBtaXhlciBjb250cm9sXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwkKKwltaXhlcl9jdGxfc2V0X3ZhbHVlKGN0bCwgMCwgIWVuYWJsZSk7Cit9CisKK2ludCBjaGVja19wYXJhbShzdHJ1Y3QgcGNtX3BhcmFtcyAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgcGFyYW0sIHVuc2lnbmVkIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW1fbmFtZSwgY2hhciAqcGFyYW1fdW5pdCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbWluOworICAgIHVuc2lnbmVkIGludCBtYXg7CisgICAgaW50IGlzX3dpdGhpbl9ib3VuZHMgPSAxOworCisgICAgbWluID0gcGNtX3BhcmFtc19nZXRfbWluKHBhcmFtcywgcGFyYW0pOworICAgIGlmICh2YWx1ZSA8IG1pbikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGlzICV1JXMsIGRldmljZSBvbmx5IHN1cHBvcnRzID49ICV1JXNcbiIsIHBhcmFtX25hbWUsIHZhbHVlLAorICAgICAgICAgICAgICAgIHBhcmFtX3VuaXQsIG1pbiwgcGFyYW1fdW5pdCk7CisgICAgICAgIGlzX3dpdGhpbl9ib3VuZHMgPSAwOworICAgIH0KKworICAgIG1heCA9IHBjbV9wYXJhbXNfZ2V0X21heChwYXJhbXMsIHBhcmFtKTsKKyAgICBpZiAodmFsdWUgPiBtYXgpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBpcyAldSVzLCBkZXZpY2Ugb25seSBzdXBwb3J0cyA8PSAldSVzXG4iLCBwYXJhbV9uYW1lLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICBwYXJhbV91bml0LCBtYXgsIHBhcmFtX3VuaXQpOworICAgICAgICBpc193aXRoaW5fYm91bmRzID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gaXNfd2l0aGluX2JvdW5kczsKK30KKworaW50IHNhbXBsZV9pc19wbGF5YWJsZSh1bnNpZ25lZCBpbnQgY2FyZCwgdW5zaWduZWQgaW50IGRldmljZSwgdW5zaWduZWQgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBiaXRzLCB1bnNpZ25lZCBpbnQgcGVyaW9kX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGVyaW9kX2NvdW50KQoreworICAgIHN0cnVjdCBwY21fcGFyYW1zICpwYXJhbXM7CisgICAgaW50IGNhbl9wbGF5OworCisgICAgcGFyYW1zID0gcGNtX3BhcmFtc19nZXQoY2FyZCwgZGV2aWNlLCBQQ01fT1VUKTsKKyAgICBpZiAocGFyYW1zID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiBQQ00gZGV2aWNlICV1LlxuIiwgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY2FuX3BsYXkgPSBjaGVja19wYXJhbShwYXJhbXMsIFBDTV9QQVJBTV9SQVRFLCByYXRlLCAiU2FtcGxlIHJhdGUiLCAiSHoiKTsKKyAgICBjYW5fcGxheSAmPSBjaGVja19wYXJhbShwYXJhbXMsIFBDTV9QQVJBTV9DSEFOTkVMUywgY2hhbm5lbHMsICJTYW1wbGUiLCAiIGNoYW5uZWxzIik7CisgICAgY2FuX3BsYXkgJj0gY2hlY2tfcGFyYW0ocGFyYW1zLCBQQ01fUEFSQU1fU0FNUExFX0JJVFMsIGJpdHMsICJCaXRyYXRlIiwgIiBiaXRzIik7CisgICAgY2FuX3BsYXkgJj0gY2hlY2tfcGFyYW0ocGFyYW1zLCBQQ01fUEFSQU1fUEVSSU9EX1NJWkUsIHBlcmlvZF9zaXplLCAiUGVyaW9kIHNpemUiLCAiSHoiKTsKKyAgICBjYW5fcGxheSAmPSBjaGVja19wYXJhbShwYXJhbXMsIFBDTV9QQVJBTV9QRVJJT0RTLCBwZXJpb2RfY291bnQsICJQZXJpb2QgY291bnQiLCAiSHoiKTsKKworICAgIHBjbV9wYXJhbXNfZnJlZShwYXJhbXMpOworCisgICAgcmV0dXJuIGNhbl9wbGF5OworfQorCit2b2lkIHBsYXlfc2FtcGxlKEZJTEUgKmZpbGUsIHVuc2lnbmVkIGludCBjYXJkLCB1bnNpZ25lZCBpbnQgZGV2aWNlLCB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByYXRlLCB1bnNpZ25lZCBpbnQgYml0cywgdW5zaWduZWQgaW50IHBlcmlvZF9zaXplLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGVyaW9kX2NvdW50KQoreworICAgIHN0cnVjdCBwY21fY29uZmlnIGNvbmZpZzsKKyAgICBzdHJ1Y3QgcGNtICpwY207CisgICAgY2hhciAqYnVmZmVyOworICAgIGludCBzaXplOworICAgIGludCBudW1fcmVhZDsKKworICAgIG1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7CisgICAgY29uZmlnLmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgY29uZmlnLnJhdGUgPSByYXRlOworICAgIGNvbmZpZy5wZXJpb2Rfc2l6ZSA9IHBlcmlvZF9zaXplOworICAgIGNvbmZpZy5wZXJpb2RfY291bnQgPSBwZXJpb2RfY291bnQ7CisgICAgaWYgKGJpdHMgPT0gMzIpCisgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBQQ01fRk9STUFUX1MzMl9MRTsKKyAgICBlbHNlIGlmIChiaXRzID09IDE2KQorICAgICAgICBjb25maWcuZm9ybWF0ID0gUENNX0ZPUk1BVF9TMTZfTEU7CisgICAgY29uZmlnLnN0YXJ0X3RocmVzaG9sZCA9IDA7CisgICAgY29uZmlnLnN0b3BfdGhyZXNob2xkID0gMDsKKyAgICBjb25maWcuc2lsZW5jZV90aHJlc2hvbGQgPSAwOworCisgICAgaWYgKCFzYW1wbGVfaXNfcGxheWFibGUoY2FyZCwgZGV2aWNlLCBjaGFubmVscywgcmF0ZSwgYml0cywgcGVyaW9kX3NpemUsIHBlcmlvZF9jb3VudCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBjbSA9IHBjbV9vcGVuKGNhcmQsIGRldmljZSwgUENNX09VVCwgJmNvbmZpZyk7CisgICAgaWYgKCFwY20gfHwgIXBjbV9pc19yZWFkeShwY20pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gUENNIGRldmljZSAldSAoJXMpXG4iLAorICAgICAgICAgICAgICAgIGRldmljZSwgcGNtX2dldF9lcnJvcihwY20pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemUgPSBwY21fZnJhbWVzX3RvX2J5dGVzKHBjbSwgcGNtX2dldF9idWZmZXJfc2l6ZShwY20pKTsKKyAgICBidWZmZXIgPSBtYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXNcbiIsIHNpemUpOworICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgICAgIHBjbV9jbG9zZShwY20pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJpbnRmKCJQbGF5aW5nIHNhbXBsZTogJXUgY2gsICV1IGh6LCAldSBiaXRcbiIsIGNoYW5uZWxzLCByYXRlLCBiaXRzKTsKKworICAgIC8qIGNhdGNoIGN0cmwtYyB0byBzaHV0ZG93biBjbGVhbmx5ICovCisgICAgc2lnbmFsKFNJR0lOVCwgc3RyZWFtX2Nsb3NlKTsKKworICAgIGRvIHsKKyAgICAgICAgbnVtX3JlYWQgPSBmcmVhZChidWZmZXIsIDEsIHNpemUsIGZpbGUpOworICAgICAgICBpZiAobnVtX3JlYWQgPiAwKSB7CisgICAgICAgICAgICBpZiAocGNtX3dyaXRlKHBjbSwgYnVmZmVyLCBudW1fcmVhZCkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHBsYXlpbmcgc2FtcGxlXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHNpZ19jbG9zZSAmJiBudW1fcmVhZCA+IDApOworCisgICAgZnJlZShidWZmZXIpOworICAgIHBjbV9jbG9zZShwY20pOworfQorCit1bnNpZ25lZCBpbnQgY2FwdHVyZV9zYW1wbGUoRklMRSAqZmlsZSwgdW5zaWduZWQgaW50IGNhcmQsIHVuc2lnbmVkIGludCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzLCB1bnNpZ25lZCBpbnQgcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHBjbV9mb3JtYXQgZm9ybWF0LCB1bnNpZ25lZCBpbnQgcGVyaW9kX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBlcmlvZF9jb3VudCkKK3sKKyAgICBzdHJ1Y3QgcGNtX2NvbmZpZyBjb25maWc7CisgICAgc3RydWN0IHBjbSAqcGNtOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZCA9IDA7CisKKyAgICBtZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOworICAgIGNvbmZpZy5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIGNvbmZpZy5yYXRlID0gcmF0ZTsKKyAgICBjb25maWcucGVyaW9kX3NpemUgPSBwZXJpb2Rfc2l6ZTsKKyAgICBjb25maWcucGVyaW9kX2NvdW50ID0gcGVyaW9kX2NvdW50OworICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgY29uZmlnLnN0YXJ0X3RocmVzaG9sZCA9IDA7CisgICAgY29uZmlnLnN0b3BfdGhyZXNob2xkID0gMDsKKyAgICBjb25maWcuc2lsZW5jZV90aHJlc2hvbGQgPSAwOworCisgICAgcGNtID0gcGNtX29wZW4oY2FyZCwgZGV2aWNlLCBQQ01fSU4sICZjb25maWcpOworICAgIGlmICghcGNtIHx8ICFwY21faXNfcmVhZHkocGNtKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIFBDTSBkZXZpY2UgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICBwY21fZ2V0X2Vycm9yKHBjbSkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzaXplID0gcGNtX2ZyYW1lc190b19ieXRlcyhwY20sIHBjbV9nZXRfYnVmZmVyX3NpemUocGNtKSk7CisgICAgYnVmZmVyID0gbWFsbG9jKHNpemUpOworICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzXG4iLCBzaXplKTsKKyAgICAgICAgZnJlZShidWZmZXIpOworICAgICAgICBwY21fY2xvc2UocGNtKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJpbnRmKCJDYXB0dXJpbmcgc2FtcGxlOiAldSBjaCwgJXUgaHosICV1IGJpdFxuIiwgY2hhbm5lbHMsIHJhdGUsCisgICAgICAgICAgIHBjbV9mb3JtYXRfdG9fYml0cyhmb3JtYXQpKTsKKworICAgIHdoaWxlIChzaWdfY2xvc2UgJiYgIXBjbV9yZWFkKHBjbSwgYnVmZmVyLCBzaXplKSkgeworICAgICAgICBpZiAoZndyaXRlKGJ1ZmZlciwgMSwgc2l6ZSwgZmlsZSkgIT0gc2l6ZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGNhcHR1cmluZyBzYW1wbGVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXNfcmVhZCArPSBzaXplOworCQlpZiAoYnl0ZXNfcmVhZD49MzAwMDAwKQorCQkJYnJlYWs7CisgICAgfQorCisgICAgZnJlZShidWZmZXIpOworICAgIHBjbV9jbG9zZShwY20pOworICAgIHJldHVybiBwY21fYnl0ZXNfdG9fZnJhbWVzKHBjbSwgYnl0ZXNfcmVhZCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBGSUxFICpmaWxlOworICAgIHN0cnVjdCB3YXZfaGVhZGVyIGhlYWRlcjsKKyAgICB1bnNpZ25lZCBpbnQgY2FyZCA9IDA7CisgICAgdW5zaWduZWQgaW50IGRldmljZSA9IDA7CisgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzID0gMjsKKyAgICB1bnNpZ25lZCBpbnQgcmF0ZSA9IDQ0MTAwOworICAgIHVuc2lnbmVkIGludCBiaXRzID0gMTY7CisgICAgdW5zaWduZWQgaW50IGZyYW1lczsKKyAgICB1bnNpZ25lZCBpbnQgcGVyaW9kX3NpemUgPSAxMDI0OworICAgIHVuc2lnbmVkIGludCBwZXJpb2RfY291bnQgPSA0OworCWVudW0gcGNtX2Zvcm1hdCBmb3JtYXQ7CisKKyAgICBzdHJ1Y3QgcmlmZl93YXZlX2hlYWRlciByaWZmX3dhdmVfaGVhZGVyOworICAgIHN0cnVjdCBjaHVua19oZWFkZXIgY2h1bmtfaGVhZGVyOworICAgIHN0cnVjdCBjaHVua19mbXQgY2h1bmtfZm10OworICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGludCBtb3JlX2NodW5rcyA9IDE7CisgICAgc3RydWN0IG1peGVyICptaXhlcjsKKworCisgICAgaWYgKGFyZ2MgPCAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGNhcCBmaWxlLndhdiBbLUQgY2FyZF0gWy1kIGRldmljZV0gWy1jIGNoYW5uZWxzXSAiCisgICAgICAgICAgICAgICAgIlstciByYXRlXSBbLWIgYml0c10gWy1wIHBlcmlvZF9zaXplXSBbLW4gbl9wZXJpb2RzXVxuIiwgYXJndlswXSk7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIHBsYXkgZmlsZS53YXYgWy1EIGNhcmRdIFstZCBkZXZpY2VdIFstcCBwZXJpb2Rfc2l6ZV0iCisgICAgICAgICAgICAgICAgIiBbLW4gbl9wZXJpb2RzXSBcbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKwlpZiAoc3RyY21wKGFyZ3ZbMV0sICJwbGF5IikgPT0gMCkgeworCQltaXhlciA9IG1peGVyX29wZW4oY2FyZCk7CisgICAgCWlmICghbWl4ZXIpIHsKKyAgICAgICAJCSBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBvcGVuIG1peGVyXG4iKTsKKyAgICAgICAJCSByZXR1cm4gLTE7CisgICAJCX0KKwkJbWl4X3NldF9vdXRwdXRwYXRoKG1peGVyLCBUX09VVFBVVF9TUEVBS0VSKTsgCisJCW1peF9zZXRfb3V0cHV0dm9sKG1peGVyLCBUX09VVFBVVF9WT0xfMERCKTsKKwkvLwltaXhfc2V0X291dHB1dF9tdXRlKG1peGVyLGZhbHNlKTsKKwkJbWl4ZXJfY2xvc2UobWl4ZXIpOworCisJCWZpbGVuYW1lID0gYXJndlsyXTsKKwkgICAgZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKKwkgICAgaWYgKCFmaWxlKSB7CisJICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIGZpbGUgJyVzJ1xuIiwgZmlsZW5hbWUpOworCSAgICAgICAgcmV0dXJuIDE7CisJICAgIH0KKworCSAgICBmcmVhZCgmcmlmZl93YXZlX2hlYWRlciwgc2l6ZW9mKHJpZmZfd2F2ZV9oZWFkZXIpLCAxLCBmaWxlKTsKKwkgICAgaWYgKChyaWZmX3dhdmVfaGVhZGVyLnJpZmZfaWQgIT0gSURfUklGRikgfHwKKwkgICAgICAgIChyaWZmX3dhdmVfaGVhZGVyLndhdmVfaWQgIT0gSURfV0FWRSkpIHsKKwkgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6ICclcycgaXMgbm90IGEgcmlmZi93YXZlIGZpbGVcbiIsIGZpbGVuYW1lKTsKKwkgICAgICAgIGZjbG9zZShmaWxlKTsKKwkgICAgICAgIHJldHVybiAxOworCSAgICB9CisKKwkgICAgZG8geworCSAgICAgICAgZnJlYWQoJmNodW5rX2hlYWRlciwgc2l6ZW9mKGNodW5rX2hlYWRlciksIDEsIGZpbGUpOworCisJICAgICAgICBzd2l0Y2ggKGNodW5rX2hlYWRlci5pZCkgeworCSAgICAgICAgY2FzZSBJRF9GTVQ6CisJICAgICAgICAgICAgZnJlYWQoJmNodW5rX2ZtdCwgc2l6ZW9mKGNodW5rX2ZtdCksIDEsIGZpbGUpOworCSAgICAgICAgICAgIC8qIElmIHRoZSBmb3JtYXQgaGVhZGVyIGlzIGxhcmdlciwgc2tpcCB0aGUgcmVzdCAqLworCSAgICAgICAgICAgIGlmIChjaHVua19oZWFkZXIuc3ogPiBzaXplb2YoY2h1bmtfZm10KSkKKwkgICAgICAgICAgICAgICAgZnNlZWsoZmlsZSwgY2h1bmtfaGVhZGVyLnN6IC0gc2l6ZW9mKGNodW5rX2ZtdCksIFNFRUtfQ1VSKTsKKwkgICAgICAgICAgICBicmVhazsKKwkgICAgICAgIGNhc2UgSURfREFUQToKKwkgICAgICAgICAgICAvKiBTdG9wIGxvb2tpbmcgZm9yIGNodW5rcyAqLworCSAgICAgICAgICAgIG1vcmVfY2h1bmtzID0gMDsKKwkgICAgICAgICAgICBicmVhazsKKwkgICAgICAgIGRlZmF1bHQ6CisJICAgICAgICAgICAgLyogVW5rbm93biBjaHVuaywgc2tpcCBieXRlcyAqLworCSAgICAgICAgICAgIGZzZWVrKGZpbGUsIGNodW5rX2hlYWRlci5zeiwgU0VFS19DVVIpOworCSAgICAgICAgfQorCSAgICB9IHdoaWxlIChtb3JlX2NodW5rcyk7CisKKwkgICAgLyogcGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAqLworCSAgICBhcmd2ICs9IDM7CisJICAgIHdoaWxlICgqYXJndikgeworCSAgICAgICAgaWYgKHN0cmNtcCgqYXJndiwgIi1kIikgPT0gMCkgeworCSAgICAgICAgICAgIGFyZ3YrKzsKKwkgICAgICAgICAgICBpZiAoKmFyZ3YpCisJICAgICAgICAgICAgICAgIGRldmljZSA9IGF0b2koKmFyZ3YpOworCSAgICAgICAgfQorCSAgICAgICAgaWYgKHN0cmNtcCgqYXJndiwgIi1wIikgPT0gMCkgeworCSAgICAgICAgICAgIGFyZ3YrKzsKKwkgICAgICAgICAgICBpZiAoKmFyZ3YpCisJICAgICAgICAgICAgICAgIHBlcmlvZF9zaXplID0gYXRvaSgqYXJndik7CisJICAgICAgICB9CisJICAgICAgICBpZiAoc3RyY21wKCphcmd2LCAiLW4iKSA9PSAwKSB7CisJICAgICAgICAgICAgYXJndisrOworCSAgICAgICAgICAgIGlmICgqYXJndikKKwkgICAgICAgICAgICAgICAgcGVyaW9kX2NvdW50ID0gYXRvaSgqYXJndik7CisJICAgICAgICB9CisJICAgICAgICBpZiAoc3RyY21wKCphcmd2LCAiLUQiKSA9PSAwKSB7CisJICAgICAgICAgICAgYXJndisrOworCSAgICAgICAgICAgIGlmICgqYXJndikKKwkgICAgICAgICAgICAgICAgY2FyZCA9IGF0b2koKmFyZ3YpOworCSAgICAgICAgfQorCSAgICAgICAgaWYgKCphcmd2KQorCSAgICAgICAgICAgIGFyZ3YrKzsKKwkgICAgfQorCisgICAgCXBsYXlfc2FtcGxlKGZpbGUsIGNhcmQsIGRldmljZSwgY2h1bmtfZm10Lm51bV9jaGFubmVscywgY2h1bmtfZm10LnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgIGNodW5rX2ZtdC5iaXRzX3Blcl9zYW1wbGUsIHBlcmlvZF9zaXplLCBwZXJpb2RfY291bnQpOworCisJICAgIGZjbG9zZShmaWxlKTsKKworCX1lbHNlIGlmKHN0cmNtcChhcmd2WzFdLCAiY2FwIikgPT0gMCkgeworCQltaXhlciA9IG1peGVyX29wZW4oY2FyZCk7CisgICAgCWlmICghbWl4ZXIpIHsKKyAgICAgICAJCSBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBvcGVuIG1peGVyXG4iKTsKKyAgICAgICAJCSByZXR1cm4gLTE7CisgICAJCX0KKwkJbWl4X3NldF9pbnB1dHBhdGgobWl4ZXIsIFRfSU5QVVRfTUlDTFApOworCQltaXhfc2V0X2lucHV0dm9sKG1peGVyLCBUX0lOUFVUX1ZPTF8wREIpOworCQltaXhlcl9jbG9zZShtaXhlcik7CisKKwkJZmlsZSA9IGZvcGVuKGFyZ3ZbMl0sICJ3YiIpOworCSAgICBpZiAoIWZpbGUpIHsKKwkgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGNyZWF0ZSBmaWxlICclcydcbiIsIGFyZ3ZbMV0pOworCSAgICAgICAgcmV0dXJuIDE7CisJICAgIH0KKworCSAgICAvKiBwYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCisJICAgIGFyZ3YgKz0gMzsKKwkgICAgd2hpbGUgKCphcmd2KSB7CisJICAgICAgICBpZiAoc3RyY21wKCphcmd2LCAiLWQiKSA9PSAwKSB7CisJICAgICAgICAgICAgYXJndisrOworCSAgICAgICAgICAgIGlmICgqYXJndikKKwkgICAgICAgICAgICAgICAgZGV2aWNlID0gYXRvaSgqYXJndik7CisJICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1jIikgPT0gMCkgeworCSAgICAgICAgICAgIGFyZ3YrKzsKKwkgICAgICAgICAgICBpZiAoKmFyZ3YpCisJICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gYXRvaSgqYXJndik7CisJICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1yIikgPT0gMCkgeworCSAgICAgICAgICAgIGFyZ3YrKzsKKwkgICAgICAgICAgICBpZiAoKmFyZ3YpCisJICAgICAgICAgICAgICAgIHJhdGUgPSBhdG9pKCphcmd2KTsKKwkgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWIiKSA9PSAwKSB7CisJICAgICAgICAgICAgYXJndisrOworCSAgICAgICAgICAgIGlmICgqYXJndikKKwkgICAgICAgICAgICAgICAgYml0cyA9IGF0b2koKmFyZ3YpOworCSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItRCIpID09IDApIHsKKwkgICAgICAgICAgICBhcmd2Kys7CisJICAgICAgICAgICAgaWYgKCphcmd2KQorCSAgICAgICAgICAgICAgICBjYXJkID0gYXRvaSgqYXJndik7CisJICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1wIikgPT0gMCkgeworCSAgICAgICAgICAgIGFyZ3YrKzsKKwkgICAgICAgICAgICBpZiAoKmFyZ3YpCisJICAgICAgICAgICAgICAgIHBlcmlvZF9zaXplID0gYXRvaSgqYXJndik7CisJICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1uIikgPT0gMCkgeworCSAgICAgICAgICAgIGFyZ3YrKzsKKwkgICAgICAgICAgICBpZiAoKmFyZ3YpCisJICAgICAgICAgICAgICAgIHBlcmlvZF9jb3VudCA9IGF0b2koKmFyZ3YpOworCSAgICAgICAgfQorCSAgICAgICAgaWYgKCphcmd2KQorCSAgICAgICAgICAgIGFyZ3YrKzsKKwkgICAgfQorCisJICAgIGhlYWRlci5yaWZmX2lkID0gSURfUklGRjsKKwkgICAgaGVhZGVyLnJpZmZfc3ogPSAwOworCSAgICBoZWFkZXIucmlmZl9mbXQgPSBJRF9XQVZFOworCSAgICBoZWFkZXIuZm10X2lkID0gSURfRk1UOworCSAgICBoZWFkZXIuZm10X3N6ID0gMTY7CisJICAgIGhlYWRlci5hdWRpb19mb3JtYXQgPSBGT1JNQVRfUENNOworCSAgICBoZWFkZXIubnVtX2NoYW5uZWxzID0gY2hhbm5lbHM7CisJICAgIGhlYWRlci5zYW1wbGVfcmF0ZSA9IHJhdGU7CisKKwkgICAgc3dpdGNoIChiaXRzKSB7CisJICAgIGNhc2UgMzI6CisJICAgICAgICBmb3JtYXQgPSBQQ01fRk9STUFUX1MzMl9MRTsKKwkgICAgICAgIGJyZWFrOworCSAgICBjYXNlIDI0OgorCSAgICAgICAgZm9ybWF0ID0gUENNX0ZPUk1BVF9TMjRfTEU7CisJICAgICAgICBicmVhazsKKwkgICAgY2FzZSAxNjoKKwkgICAgICAgIGZvcm1hdCA9IFBDTV9GT1JNQVRfUzE2X0xFOworCSAgICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkIGJpdHMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGJpdHMpOworCSAgICAgICAgcmV0dXJuIDE7CisJICAgIH0KKworCSAgICBoZWFkZXIuYml0c19wZXJfc2FtcGxlID0gcGNtX2Zvcm1hdF90b19iaXRzKGZvcm1hdCk7CisJICAgIGhlYWRlci5ieXRlX3JhdGUgPSAoaGVhZGVyLmJpdHNfcGVyX3NhbXBsZSAvIDgpICogY2hhbm5lbHMgKiByYXRlOworCSAgICBoZWFkZXIuYmxvY2tfYWxpZ24gPSBjaGFubmVscyAqIChoZWFkZXIuYml0c19wZXJfc2FtcGxlIC8gOCk7CisJICAgIGhlYWRlci5kYXRhX2lkID0gSURfREFUQTsKKworCSAgICAvKiBsZWF2ZSBlbm91Z2ggcm9vbSBmb3IgaGVhZGVyICovCisJICAgIGZzZWVrKGZpbGUsIHNpemVvZihzdHJ1Y3Qgd2F2X2hlYWRlciksIFNFRUtfU0VUKTsKKworCSAgICAvKiBpbnN0YWxsIHNpZ25hbCBoYW5kbGVyIGFuZCBiZWdpbiBjYXB0dXJpbmcgKi8KKwkgICAgc2lnbmFsKFNJR0lOVCwgc3RyZWFtX2Nsb3NlKTsKKwkgICAgZnJhbWVzID0gY2FwdHVyZV9zYW1wbGUoZmlsZSwgY2FyZCwgZGV2aWNlLCBoZWFkZXIubnVtX2NoYW5uZWxzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIuc2FtcGxlX3JhdGUsIGZvcm1hdCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kX3NpemUsIHBlcmlvZF9jb3VudCk7CisJICAgIHByaW50ZigiQ2FwdHVyZWQgJWQgZnJhbWVzXG4iLCBmcmFtZXMpOworCisJICAgIC8qIHdyaXRlIGhlYWRlciBub3cgYWxsIGluZm9ybWF0aW9uIGlzIGtub3duICovCisJICAgIGhlYWRlci5kYXRhX3N6ID0gZnJhbWVzICogaGVhZGVyLmJsb2NrX2FsaWduOworCSAgICBoZWFkZXIucmlmZl9zeiA9IGhlYWRlci5kYXRhX3N6ICsgc2l6ZW9mKGhlYWRlcikgLSA4OworCSAgICBmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7CisJICAgIGZ3cml0ZSgmaGVhZGVyLCBzaXplb2Yoc3RydWN0IHdhdl9oZWFkZXIpLCAxLCBmaWxlKTsKKworCSAgICBmY2xvc2UoZmlsZSk7CisJfQorCisgICByZXR1cm4gMDsKK30K