ZGlmZiAtLWdpdCBhL3NyYy9seW5xL2xpYi9saWJseW5xLXdpZmk2L2luY2x1ZGUvbGlid2lmaTYuaCBiL3NyYy9seW5xL2xpYi9saWJseW5xLXdpZmk2L2luY2x1ZGUvbGlid2lmaTYuaAppbmRleCAzNGE2ZWM4Li44Y2FmMDAzIDEwMDc1NQotLS0gYS9zcmMvbHlucS9saWIvbGlibHlucS13aWZpNi9pbmNsdWRlL2xpYndpZmk2LmgKKysrIGIvc3JjL2x5bnEvbGliL2xpYmx5bnEtd2lmaTYvaW5jbHVkZS9saWJ3aWZpNi5oCkBAIC0xNzMsNiArMTczLDggQEAKIC8vc3RhcnQgc2NhbiBhdmFpbGJhbGUgYXAgYWN0aXZlCiBpbnQgbHlucV93aWZpX3N0YV9zdGFydF9zY2FuKGx5bnFfd2lmaV9pbmRleF9lIGlkeCk7CiAKKy8vYWRkIGZvciBTVEEgYXV0byBjb25uZWN0CitpbnQgbHlucV93aWZpX3N0YV9zdG9wX25ldChseW5xX3dpZmlfaW5kZXhfZSBpZHgsaW50IG5ldHdvcmtpZCk7CiAvKgogICogZXZlbnQgdXNhZ2U6CiAgKiBmaXJzdCBkZWNsYXJlIGEgZnVuY2lvbiBsaWtlIEFQX0NBTExCQUNLX0ZVTkNfUFRSIHRvIHJlY3YgbWVzc2dlIGZyb20gd2lmaSBsaWIKQEAgLTIwNyw2ICsyMDksOSBAQAogdHlwZWRlZiB2b2lkKCpTVEFfQ0FMTEJBQ0tfRlVOQ19QVFIpKHZvaWQgKnByaXYsIGx5bnFfd2lmaV9zdGFfc3RhdHVzX3Mgc3RhdHVzLCBlcnJvcl9udW1iZXJfcyBudW1iZXIpOwogaW50IGx5bnFfcmVnX3N0YV9ldmVudF9jYWxsYmFjayh2b2lkICogcHJpdiwgU1RBX0NBTExCQUNLX0ZVTkNfUFRSIGNiKTsKIGludCBseW5xX3VucmVnX3N0YV9ldmVudF9jYWxsYmFjayh2b2lkICogcHJpdik7Cit0eXBlZGVmIHZvaWQoKlNUQV9BVVRPX0NBTExCQUNLX0ZVTkNfUFRSKSh2b2lkICpwcml2LCBseW5xX3dpZmlfc3RhX3N0YXR1c19zIHN0YXR1cywgZXJyb3JfbnVtYmVyX3MgbnVtYmVyLGludCBuZXR3b3JraWQpOworaW50IGx5bnFfcmVnX3N0YV9hdXRvX2V2ZW50X2NhbGxiYWNrKHZvaWQgKiBwcml2LCBTVEFfQVVUT19DQUxMQkFDS19GVU5DX1BUUiBjYik7CitpbnQgbHlucV91bnJlZ19zdGFfYXV0b19ldmVudF9jYWxsYmFjayh2b2lkICogcHJpdik7CiAKIC8vZ2V0IGN1cnJlbnQgYXAgc3RhdHVzCiBpbnQgbHlucV9nZXRfYXBfc3RhdHVzKGx5bnFfd2lmaV9pbmRleF9lIGlkeCwgbHlucV93aWZpX2FwX3J1bl9zdGF0dXNfcyAqIGFwX3N0YXR1cyk7CmRpZmYgLS1naXQgYS9zcmMvbHlucS9saWIvbGlibHlucS13aWZpNi9saWJ3aWZpNi5jIGIvc3JjL2x5bnEvbGliL2xpYmx5bnEtd2lmaTYvbGlid2lmaTYuYwppbmRleCBiOTY1OGI5Li4xNTBmZmRkIDEwMDc1NQotLS0gYS9zcmMvbHlucS9saWIvbGlibHlucS13aWZpNi9saWJ3aWZpNi5jCisrKyBiL3NyYy9seW5xL2xpYi9saWJseW5xLXdpZmk2L2xpYndpZmk2LmMKQEAgLTUxLDEwICs1MSwxNiBAQAogdm9sYXRpbGUgaW50IGdfc3RhX3NjYW5fZmluaXNoX2ZsYWcgPSAxOwogdm9sYXRpbGUgaW50IGdfc3RhX3dhdGNoZXJfc3RhcnRlZF9mbGFnID0gMDsKIAorcHRocmVhZF90IGdfc3RhX2F1dG9fd2F0Y2hlcl9waWQgPSAwOwordm9sYXRpbGUgaW50IGdfc3RhX2F1dG9fd2F0Y2hlcl9zdG9wX2ZsYWcgPSAwOwordm9sYXRpbGUgaW50IGdfc3RhX2F1dG9fc2Nhbl9maW5pc2hfZmxhZyA9IDE7Cit2b2xhdGlsZSBpbnQgZ19zdGFfYXV0b193YXRjaGVyX3N0YXJ0ZWRfZmxhZyA9IDA7CiB2b2lkICogZ19hcF9jYWxsYmFja19wcml2ID0gTlVMTDsKIEFQX0NBTExCQUNLX0ZVTkNfUFRSIGdfYXBfY2FsbGJhY2tfZnVuYyA9IE5VTEw7CiB2b2lkICogZ19zdGFfY2FsbGJhY2tfcHJpdiA9IE5VTEw7CiBTVEFfQ0FMTEJBQ0tfRlVOQ19QVFIgZ19zdGFfY2FsbGJhY2tfZnVuYyA9IE5VTEw7Cit2b2lkICogZ19zdGFfYXV0b19jYWxsYmFja19wcml2ID0gTlVMTDsKK1NUQV9BVVRPX0NBTExCQUNLX0ZVTkNfUFRSIGdfc3RhX2F1dG9fY2FsbGJhY2tfZnVuYyA9IE5VTEw7CiAKIC8vY29uc3QgY2hhciAqIENUUkxfUEFUSD0iL3Zhci9ydW4vd3BhX3N1cHBsaWNhbnQiOwogY29uc3QgY2hhciAqIENUUkxfUEFUSFsyXSA9IHsiL3Zhci9ydW4vd3BhX3N1cHBsaWNhbnQvd2xhbjAiLCAiL3Zhci9ydW4vd3BhX3N1cHBsaWNhbnQvYXAwIn07CkBAIC04OSw2ICs5NSw4IEBACiBzdGF0aWMgcHRocmVhZF9tdXRleF90IHNfY2hlY2tfd3BhX2N0cmxfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBzX3N0YV9jYWxsYmFja19tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiBzdGF0aWMgcHRocmVhZF9tdXRleF90IHNfYXBfY2FsbGJhY2tfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworLy8gYWRkIGZvciBhdXRvIGNvbm5lY3QKK3N0YXRpYyBwdGhyZWFkX211dGV4X3Qgc19zdGFfYXV0b19jYWxsYmFja19tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiAKIHN0YXRpYyBzdHJ1Y3QgbG9jYWxfd3BhX2N0cmwgKiBnX2x5bnFfd3BhX2N0cmxbMl0gPSB7MH07CiAKQEAgLTYzMiw2ICs2NDAsMTQyIEBACiAKIH0KIAordm9pZCBnZXRfc3RhdGVfZXJyb3JfbmV0d29ya2lkKGNvbnN0IGNoYXIqIG1vZGlmeSwgbHlucV93aWZpX3N0YV9zdGF0dXNfcyogc3RhdGUsIGVycm9yX251bWJlcl9zKiBlcnJvcixpbnQgKm5ldHdvcmtpZCkKK3sKKyAgICBjaGFyICpwUmVhc29uOworICAgIGNoYXIgKndwYW5ldGlkOworICAgIGNoYXIgZGVzdGlkWzNdOworICAgICplcnJvciA9IExZTlFfV0FJVF9DT05ORUNUX0FDVElWRTsKKyAgICAqbmV0d29ya2lkID0gLTE7CisgICAgaWYgKHN0cnN0cihtb2RpZnksICJDVFJMLUVWRU5ULVNDQU4tUkVTVUxUUyIpICE9IE5VTEwpCisgICAgeworICAgICAgICAqc3RhdGUgPSBMWU5RX1dJRklfU1RBX1NUQVRVU19TQ0FOX1JFU1VMVDsKKyAgICAgICAgUkxPR0QoIkNUUkwtRVZFTlQtU0NBTi1SRVNVTFRTIHN0YXRlOiVkLGVycm9yOiVkLCxuZXR3b3JraWQ6JWRcbiIsKnN0YXRlLCplcnJvciwqbmV0d29ya2lkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc3Ryc3RyKG1vZGlmeSwgIkNUUkwtRVZFTlQtQ09OTkVDVEVEIikgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFJMT0dEKCJbeGlvbmddOndwYW5ldGlkID0gc3Ryc3RybW9kaWZ5O1xuIik7CisgICAgICAgIHdwYW5ldGlkID0gc3Ryc3RyKG1vZGlmeSwiaWQ9Iik7CisgICAgICAgIGlmICggd3BhbmV0aWQgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdwYW5ldGlkICs9c3RybGVuKCJpZD0iKTsKKyAgICAgICAgICAgIFJMT0dEKCJbeGlvbmddOm1lbWNweShkZXN0aWQsd3BhbmV0aWQsMFxuIik7CisgICAgICAgICAgICBpZiAobWVtY3B5KGRlc3RpZCx3cGFuZXRpZCwyKSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBSTE9HRCgiW3hpb25nXTptZW1jcHkoZGVzdGlkLHdwYW5ldGlkLDFcbiIpOworICAgICAgICAgICAgICAgICpuZXR3b3JraWQgPSBhdG9pKGRlc3RpZCk7CisgICAgICAgICAgICAgICAgUkxPR0QoImdldCBuZXR3b3JraWQgaXMgJWRcbiIsKm5ldHdvcmtpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgUkxPR0QoIlt4aW9uZ106bWVtY3B5KGRlc3RpZCx3cGFuZXRpZCwyXG4iKTsKKyAgICAgICAgfQorICAgICAgICAqc3RhdGUgPSBMWU5RX1dJRklfU1RBX1NUQVRVU19DT05ORUNUOworICAgICAgICBSTE9HRCgiQ1RSTC1FVkVOVC1DT05ORUNURUQgc3RhdGU6JWQsZXJyb3I6JWQsbmV0d29ya2lkOiVkXG4iLCpzdGF0ZSwqZXJyb3IsKm5ldHdvcmtpZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHN0cnN0cihtb2RpZnksICJDVFJMLUVWRU5ULVNTSUQtVEVNUC1ESVNBQkxFRCIpICE9IE5VTEwpCisgICAgeworICAgICAgICB3cGFuZXRpZCA9IHN0cnN0cihtb2RpZnksImlkPSIpOworICAgICAgICBpZiAoIHdwYW5ldGlkICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICB3cGFuZXRpZCArPXN0cmxlbigiaWQ9Iik7CisgICAgICAgICAgICBpZiAobWVtY3B5KGRlc3RpZCx3cGFuZXRpZCwyKSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpuZXR3b3JraWQgPSBhdG9pKGRlc3RpZCk7CisgICAgICAgICAgICAgICAgUkxPR0QoImdldCBuZXR3b3JraWQgaXMgJWRcbiIsKm5ldHdvcmtpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcFJlYXNvbiA9IHN0cnN0cihtb2RpZnksICJyZWFzb249Iik7CisgICAgICAgIGlmIChwUmVhc29uICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBSZWFzb24gKz0gc3RybGVuKCJyZWFzb249Iik7CisgICAgICAgICAgICBpZiAobWVtY21wKHBSZWFzb24sICJDT05OX0ZBSUxFRCIsIDExKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICplcnJvciA9IExZTlFfVElNRV9PVVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtZW1jbXAocFJlYXNvbiwgIldST05HX0tFWSIsIDkpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmVycm9yID0gTFlOUV9QU1dfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICplcnJvciA9IExZTlFfVU5TUEVDSUZJRURfUkVBU09OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnN0YXRlID0gTFlOUV9XSUZJX1NUQV9TVEFUVVNfQ09OTkVDVF9GQUlMOworICAgICAgICAgICAgUkxPR0QoIkNUUkwtRVZFTlQtU1NJRC1URU1QLURJU0FCTEVEIHN0YXRlOiVkLGVycm9yOiVkLG5ldHdvcmtpZDolZFxuIiwqc3RhdGUsKmVycm9yLCpuZXR3b3JraWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmVycm9yID0gTFlOUV9VTlNQRUNJRklFRF9SRUFTT047CisgICAgICAgICAgICAqc3RhdGUgPSBMWU5RX1dJRklfU1RBX1NUQVRVU19DT05ORUNUX0ZBSUw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0cnN0cihtb2RpZnksICJDVFJMLUVWRU5ULUFTU09DLVJFSkVDVCIpICE9IE5VTEwpCisgICAgeworICAgICAgICB3cGFuZXRpZCA9IHN0cnN0cihtb2RpZnksImlkPSIpOworICAgICAgICBpZiAoIHdwYW5ldGlkICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICB3cGFuZXRpZCArPXN0cmxlbigiaWQ9Iik7CisgICAgICAgICAgICBpZiAobWVtY3B5KGRlc3RpZCx3cGFuZXRpZCwyKSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpuZXR3b3JraWQgPSBhdG9pKGRlc3RpZCk7CisgICAgICAgICAgICAgICAgUkxPR0QoImdldCBuZXR3b3JraWQgaXMgJWRcbiIsKm5ldHdvcmtpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUkxPR0QoIkZJTkQgQ1RSTCBFVkVOVCA6IENUUkwtRVZFTlQtQVNTT0MtUkVKRUNUXG4iKTsKKyAgICAgICAgcFJlYXNvbiA9IHN0cnN0cihtb2RpZnksICJzdGF0dXNfY29kZT0iKTsKKyAgICAgICAgaWYgKHBSZWFzb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcFJlYXNvbiArPSBzdHJsZW4oInN0YXR1c19jb2RlPSIpOworICAgICAgICAgICAgaWYgKG1lbWNtcChwUmVhc29uLCAiMTciLCAyKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICplcnJvciA9IExZTlFfQVBfVU5BQkxFX0hBTkRMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1lbWNtcChwUmVhc29uLCAiMSIsMSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqZXJyb3IgPSBMWU5RX1VOU1BFQ0lGSUVEX1JFQVNPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqZXJyb3IgPSBMWU5RX1VOU1BFQ0lGSUVEX1JFQVNPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAqc3RhdGUgPSBMWU5RX1dJRklfU1RBX1NUQVRVU19ESVNDT05ORUNUOworICAgICAgICAgICAgIFJMT0dEKCJDVFJMLUVWRU5ULUFTU09DLVJFSkVDVCBCVVQgTk9UIFNUQVRVU19DT0RFIE5PVCAxIG9yIDE3IHN0YXRlOiVkLGVycm9yOiVkLG5ldHdvcmtpZDolZFxuIiwqc3RhdGUsKmVycm9yLCpuZXR3b3JraWQpOworICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFJMT0dEKCJGSU5EIENUUkwgRVZFTlQgOiBDVFJMLUVWRU5ULUFTU09DLVJFSkVDVCBCVVQgTk9UIEZPVU5EIFNUQVRVU19DT0RFXG4iKTsKKyAgICAgICAgICAgICplcnJvciA9IExZTlFfVU5TUEVDSUZJRURfUkVBU09OOworICAgICAgICAgICAgKnN0YXRlID0gTFlOUV9XSUZJX1NUQV9TVEFUVVNfRElTQ09OTkVDVDsKKyAgICAgICAgICAgIFJMT0dEKCJDVFJMLUVWRU5ULUFTU09DLVJFSkVDVCBzdGF0ZTolZCxlcnJvcjolZKOsbmV0d29ya2lkOiVkXG4iLCpzdGF0ZSwqZXJyb3IsKm5ldHdvcmtpZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0cnN0cihtb2RpZnksICJDVFJMLUVWRU5ULVNBRS1VTktOT1dOLVBBU1NXT1JELUlERU5USUZJRVIiKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgUkxPR0QoIkZJTkQgQ1RSTCBFVkVOVCA6IENUUkwtRVZFTlQtU0FFLVVOS05PV04tUEFTU1dPUkQtSURFTlRJRklFUlxuIik7CisgICAgICAgICplcnJvciA9IExZTlFfQVVUSEVOVElDQVRJT05fTk9fTE9OR0VSX1ZBTElEOworICAgICAgICAqc3RhdGUgPSBMWU5RX1dJRklfU1RBX1NUQVRVU19ESVNDT05ORUNUOworICAgICAgICBSTE9HRCgiQ1RSTC1FVkVOVC1TQUUtVU5LTk9XTi1QQVNTV09SRC1JREVOVElGSUVSIHN0YXRlOiVkLGVycm9yOiVkLG5ldHdvcmtpZDolZFxuIiwqc3RhdGUsKmVycm9yLCpuZXR3b3JraWQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzdHJzdHIobW9kaWZ5LCAiQ1RSTC1FVkVOVC1ESVNDT05ORUNURUQiKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgUkxPR0QoIkZJTkQgQ1RSTCBFVkVOVCA6IENUUkwtRVZFTlQtRElTQ09OTkVDVEVEXG4iKTsKKyAgICAgICAgKmVycm9yID0gTFlOUV9XQUlUX0NPTk5FQ1RfQUNUSVZFOworICAgICAgICAqc3RhdGUgPSBMWU5RX1dJRklfU1RBX1NUQVRVU19ESVNDT05ORUNUOworICAgICAgICBSTE9HRCgiQ1RSTC1FVkVOVC1ESVNDT05ORUNURUQgc3RhdGU6JWQsZXJyb3I6JWQsbmV0d29ya2lkOiVkXG4iLCpzdGF0ZSwqZXJyb3IsKm5ldHdvcmtpZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUkxPR0QoIkVWRU5UIDogJXNcbiIsIG1vZGlmeSk7CisgICAgKmVycm9yID0gTFlOUV9VTlNQRUNJRklFRF9SRUFTT047CisgICAgKnN0YXRlID0gTFlOUV9XSUZJX1NUQVRVU19FR05PUkU7CisgICAgUkxPR0QoIkxBU1QgOiBTVEEgc3RhdGU6JWQsZXJyb3I6JWQsbmV0d29yazolZFxuIiwqc3RhdGUsKmVycm9yLCpuZXR3b3JraWQpOworICAgIHJldHVybjsKK30KIHN0YXRpYyB2b2lkIG5vdGlmeV9jb25uZWN0X3N0YXR1cyhseW5xX3dpZmlfc3RhX3N0YXR1c19zIHN0YXRlLCBlcnJvcl9udW1iZXJfcyBlcnJvcikKIHsKICAgICBwdGhyZWFkX211dGV4X2xvY2soJnNfc3RhX2NhbGxiYWNrX211dGV4KTsKQEAgLTY0Myw2ICs3ODcsMTcgQEAKICAgICB9CiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNfc3RhX2NhbGxiYWNrX211dGV4KTsKIH0KK3N0YXRpYyB2b2lkIG5vdGlmeV9hdXRvX2Nvbm5lY3Rfc3RhdHVzKGx5bnFfd2lmaV9zdGFfc3RhdHVzX3Mgc3RhdGUsIGVycm9yX251bWJlcl9zIGVycm9yLGludCBuZXR3b3JraWQpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzX3N0YV9jYWxsYmFja19tdXRleCk7CisgICAgaWYgKGdfc3RhX2NhbGxiYWNrX2Z1bmMgIT0gTlVMTCAmJiBzdGF0ZSAhPSBMWU5RX1dJRklfU1RBVFVTX0VHTk9SRSkKKyAgICB7CisgICAgICAgIFJMT0dEKCJTVEFXYXRjaGVyVGhyZWFkUHJvYyBjYWxsYmFjayBiZWdpbiAtLS0tLS0+ICVkICVkICVkXG4iLCBzdGF0ZSwgZXJyb3IsbmV0d29ya2lkKTsKKyAgICAgICAgZ19zdGFfYXV0b19jYWxsYmFja19mdW5jKGdfc3RhX2F1dG9fY2FsbGJhY2tfcHJpdiwgc3RhdGUsIGVycm9yLG5ldHdvcmtpZCk7CisgICAgICAgIFJMT0dEKCJTVEFBdXRvV2F0Y2hlclRocmVhZFByb2MgY2FsbGJhY2sgZW5kIC0tLS0tLT4gJWQgJWQgJWRcbiIsIHN0YXRlLCBlcnJvcixuZXR3b3JraWQpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc19zdGFfY2FsbGJhY2tfbXV0ZXgpOworfQogCiBzdGF0aWMgdm9pZCBTVEFXYXRjaGVyVGhyZWFkUHJvYygpIHsKICAgICBzaXplX3QgbGVuID0gTUFYX1JFVDsKQEAgLTcwNSw2ICs4NjAsNjIgQEAKICAgICAgICAgd3BhX2N0cmxfY2xvc2UobHlucV93cGFfY3RybCk7CiAgICAgfQogfQorc3RhdGljIHZvaWQgU1RBQXV0b1dhdGNoZXJUaHJlYWRQcm9jKCkgeworICAgIHNpemVfdCBsZW4gPSBNQVhfUkVUOworICAgIGNoYXIgbXNnX25vdGlmeVtNQVhfUkVUXTsKKyAgICBlcnJvcl9udW1iZXJfcyBlcnJvcjsKKyAgICBseW5xX3dpZmlfc3RhX3N0YXR1c19zIHN0YXRlLCBsYXN0X3N0YXRlID0gLTE7CisgICAgaW50IGlkbGVfY291bnQgPSAwOworICAgIGludCBuZXR3b3JraWQ7CisgICAgc3RydWN0IHdwYV9jdHJsICpseW5xX3dwYV9jdHJsID0gTlVMTDsKKyAgICBnX3N0YV9hdXRvX3dhdGNoZXJfc3RvcF9mbGFnID0gMDsKKyAgICBSTE9HRCgiU1RBQXV0b1dhdGNoZXJUaHJlYWRQcm9jIHRocmVhZCBzdGFydGVkIC0tLS0tLSIpOworICAgIHdoaWxlIChnX3N0YV9hdXRvX3dhdGNoZXJfc3RvcF9mbGFnID09IDApCisgICAgeworICAgICAgICBpZiAoY2hlY2tfcGVuZGluZ19tc2coJmx5bnFfd3BhX2N0cmwsIENUUkxfU1RBLCAmaWRsZV9jb3VudCwgJmdfc3RhX2F1dG9fd2F0Y2hlcl9zdGFydGVkX2ZsYWcpICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1lbXNldChtc2dfbm90aWZ5LCAwLCBNQVhfUkVUKTsKKyAgICAgICAgbGVuID0gTUFYX1JFVDsKKyAgICAgICAgaWYgKCF3cGFfY3RybF9yZWN2KGx5bnFfd3BhX2N0cmwsIG1zZ19ub3RpZnksICZsZW4pKQorICAgICAgICB7CisgICAgICAgICAgICBtc2dfbm90aWZ5W2xlbisxXSA9ICdcMCc7CisgICAgICAgICAgICBSTE9HRCgiU1RBQXV0b1dhdGNoZXJUaHJlYWRQcm9jIHN0YSAtLS0tLS0+ICVzXG4iLCBtc2dfbm90aWZ5KTsKKyAgICAgICAgICAgIGlmIChzdHJzdHIobXNnX25vdGlmeSwgc3RhdGVfc2Nhbl9yZXN1bHQpICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ19zdGFfYXV0b19zY2FuX2ZpbmlzaF9mbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnX3N0YV9hdXRvX2NhbGxiYWNrX2Z1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldF9zdGF0ZV9lcnJvcl9uZXR3b3JraWQobXNnX25vdGlmeSwmc3RhdGUsJmVycm9yLCZuZXR3b3JraWQpOyAvLyBhZGQgbmV0IHN0YXRlIGVycm9yIG5ldHdvcmsgZnVuY3Rpb24KKyAgICAgICAgICAgIG5vdGlmeV9hdXRvX2Nvbm5lY3Rfc3RhdHVzKHN0YXRlLCBlcnJvcixuZXR3b3JraWQpOworICAgICAgICAgICAgaWYgKHN0YXRlICE9IExZTlFfV0lGSV9TVEFfU1RBVFVTX1NDQU5fUkVTVUxUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlubmVyX2NoZWNrX2Nvbm5lY3RfZXJyb3IobXNnX25vdGlmeSwgc3RhdGUsIGVycm9yKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdF9zdGF0ZSAhPSBzdGF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBMWU5RX1dJRklfU1RBX1NUQVRVU19DT05ORUNUKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fY2FsbF92KCIlcyAlcyIsIHN0YV9zdGF0dXNfY2hhbmdlX3NjcmlwdCwgImNvbm5lY3QiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSBMWU5RX1dJRklfU1RBX1NUQVRVU19ESVNDT05ORUNUKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fY2FsbF92KCIlcyAlcyIsIHN0YV9zdGF0dXNfY2hhbmdlX3NjcmlwdCwgImRpc2Nvbm5lY3QiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0X3N0YXRlID0gc3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGx5bnFfd3BhX2N0cmwgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdwYV9jdHJsX2RldGFjaChseW5xX3dwYV9jdHJsKTsKKyAgICAgICAgd3BhX2N0cmxfY2xvc2UobHlucV93cGFfY3RybCk7CisgICAgfQorfQogCiAvLyB0aGlzIHRocmVhZCB3aWxsIG5vdCBleGl0IHdoZW4gbHlucV93aWZpX2Rpc2FibGUgY2FsbGVkLHRvIGF2b2lkIGRlYWQgbG9jayx0YWtlIGNhcmUKIHN0YXRpYyB2b2lkIEdsb2JhbFdhdGNoZXJUaHJlYWRQcm9jKCkKQEAgLTg3NCwxNiArMTA4NSwyMCBAQAogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc19jaGVja193cGFfY3RybF9tdXRleCk7CiAgICAgZ19hcF93YXRjaGVyX3N0b3BfZmxhZyA9IDE7CiAgICAgZ19zdGFfd2F0Y2hlcl9zdG9wX2ZsYWcgPSAxOworICAgIGdfc3RhX2F1dG9fd2F0Y2hlcl9zdG9wX2ZsYWcgPSAxOwogICAgIGlmIChnX2FwX3dhdGNoZXJfcGlkICE9IDApCiAgICAgICAgIHB0aHJlYWRfam9pbihnX2FwX3dhdGNoZXJfcGlkLCBOVUxMKTsKICAgICBpZiAoZ19zdGFfd2F0Y2hlcl9waWQgIT0gMCkKICAgICAgICAgcHRocmVhZF9qb2luKGdfc3RhX3dhdGNoZXJfcGlkLCBOVUxMKTsKKyAgICBpZiAoZ19zdGFfYXV0b193YXRjaGVyX3BpZCAhPSAwKQorICAgICAgICBwdGhyZWFkX2pvaW4oZ19zdGFfYXV0b193YXRjaGVyX3BpZCwgTlVMTCk7CiAgICAgaWYgKGdfbHlucV93cGFfY3RybFswXSAhPSBOVUxMKQogICAgICAgICB3cGFfY3RybF9jbG9zZShnX2x5bnFfd3BhX2N0cmxbMF0pOwogICAgIGlmIChnX2x5bnFfd3BhX2N0cmxbMV0gIT0gTlVMTCkKICAgICAgICAgd3BhX2N0cmxfY2xvc2UoZ19seW5xX3dwYV9jdHJsWzFdKTsKICAgICBnX2FwX3dhdGNoZXJfcGlkID0gMDsKICAgICBnX3N0YV93YXRjaGVyX3BpZCA9IDA7CisgICAgZ19zdGFfYXV0b193YXRjaGVyX3BpZCA9IDA7CiAgICAgZ19seW5xX3dwYV9jdHJsWzBdID0gTlVMTDsKICAgICBnX2x5bnFfd3BhX2N0cmxbMV0gPSBOVUxMOwogICAgIHN5c3RlbSgic3lzdGVtY3RsIHN0b3Agd2c4NzBfZHJ2X2luc21vZC5zZXJ2aWNlIik7CkBAIC0zMDM2LDYgKzMyNTEsMTYgQEAKICAgICByZXR1cm4gMDsKIC8vICAgIHJldHVybiBzeXN0ZW0oImNvbm5tYW5jdGwgZGlzYWJsZSB3aWZpIik7CiB9CitpbnQgbHlucV93aWZpX3N0YV9zdG9wX25ldChseW5xX3dpZmlfaW5kZXhfZSBpZHgsaW50IG5ldHdvcmtpZCkKK3sKKyAgICBjaGFyIExZTlFfRElTQUJMRV9DTURbMTI4XT17MH07CisgICAgQ0hFQ0tfSURYKGlkeCwgQ1RSTF9TVEEpOworICAgIENIRUNLX1dQQV9DVFJMKENUUkxfU1RBKTsKKyAgICBzcHJpbnRmKExZTlFfRElTQUJMRV9DTUQsIkRJU0FCTEVfTkVUV09SSyAlZCIsbmV0d29ya2lkKTsKKyAgICBSTE9HRCgiTFlOUV9ESVNBQkxFX0NNRCBpczolZFxuIixMWU5RX0RJU0FCTEVfQ01EKTsKKyAgICBET19PS19GQUlMX1JFUVVFU1QoTFlOUV9ESVNBQkxFX0NNRCk7CisgICAgcmV0dXJuIDA7Cit9CiAKIC8vc3RhdGljIGludCBpbm5lcl9nZXRfc3RhX2luZm8obHlucV93aWZpX2luZGV4X2UgaWR4LCBjb25zdCBjaGFyICogYnNzaWQsIGRldmljZV9pbmZvX3MgKmRldikgewogLy8gICAgaW50IGksIGNvdW50OwpAQCAtMzQyMyw2ICszNjQ4LDQ4IEBACiAgICAgcmV0dXJuIC0xOwogfQogCitpbnQgbHlucV9yZWdfc3RhX2F1dG9fZXZlbnRfY2FsbGJhY2sodm9pZCAqIHByaXYsIFNUQV9BVVRPX0NBTExCQUNLX0ZVTkNfUFRSIGNiKXsKKyAgICBpZiAoY2IgPT0gTlVMTCkgCisgICAgeworICAgICAgICBSTE9HRSgibHlucV9yZWdfc3RhX2F1dG9fZXZlbnRfY2FsbGJhY2sgcHRyIGlzIE5VTEwscGxlc2UgY2hlY2shXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnNfc3RhX2F1dG9fY2FsbGJhY2tfbXV0ZXgpOworICAgIGdfc3RhX2F1dG9fY2FsbGJhY2tfcHJpdiA9IHByaXY7CisgICAgZ19zdGFfYXV0b19jYWxsYmFja19mdW5jID0gY2I7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNfc3RhX2F1dG9fY2FsbGJhY2tfbXV0ZXgpOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc19jaGVja193cGFfY3RybF9tdXRleCk7CisgICAgaWYgKGdfc3RhX2F1dG9fd2F0Y2hlcl9waWQgPT0gMCApIHsKKyAgICAgICAgaWYocHRocmVhZF9jcmVhdGUoJmdfc3RhX2F1dG9fd2F0Y2hlcl9waWQsTlVMTCxTVEFBdXRvV2F0Y2hlclRocmVhZFByb2MsTlVMTCkgPCAwKSAgLy9jcmVhdGUgU1RBQXV0b1dhdGNoZXJUaHJlYWRQcm9jCisgICAgICAgIHsKKyAgICAgICAgICAgIGdfc3RhX2F1dG9fd2F0Y2hlcl9waWQgPSAwOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNfY2hlY2tfd3BhX2N0cmxfbXV0ZXgpOworICAgICAgICAgICAgUkxPR0UoIlt3aWZpIGVycm9yXWNyZWF0IFNUQVdhdGNoZXJUaHJlYWRQcm9jIGZhaWwiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc19jaGVja193cGFfY3RybF9tdXRleCk7CisgICAgUkxPR0QoImNyZWF0IFNUQVdhdGNoZXJUaGVyYWRQcm9jIHN1c2NjcyIpOworICAgIHJldHVybiAwOworfQoraW50IGx5bnFfdW5yZWdfc3RhX2F1dG9fZXZlbnRfY2FsbGJhY2sodm9pZCAqIHByaXYpIHsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnNfc3RhX2F1dG9fY2FsbGJhY2tfbXV0ZXgpOworICAgIGlmIChnX3N0YV9hdXRvX2NhbGxiYWNrX3ByaXYgPT0gcHJpdikKKyAgICB7ICAKKyAgICAgICAgZ19zdGFfYXV0b193YXRjaGVyX3N0b3BfZmxhZyA9IDE7CisgICAgICAgIGlmIChnX3N0YV9hdXRvX3dhdGNoZXJfcGlkICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0aHJlYWRfam9pbihnX3N0YV9hdXRvX3dhdGNoZXJfcGlkLCBOVUxMKTsKKyAgICAgICAgfQorICAgIGdfc3RhX2F1dG9fd2F0Y2hlcl9waWQgPSAwOworICAgICAgICBnX3N0YV9hdXRvX2NhbGxiYWNrX2Z1bmMgPSBOVUxMOworICAgICAgICBnX3N0YV9hdXRvX2NhbGxiYWNrX3ByaXYgPSBOVUxMOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc19zdGFfYXV0b19jYWxsYmFja19tdXRleCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc19zdGFfYXV0b19jYWxsYmFja19tdXRleCk7CisgICAgcmV0dXJuIC0xOworfQogaW50IGx5bnFfZ2V0X2FwX3N0YXR1cyhseW5xX3dpZmlfaW5kZXhfZSBpZHgsIGx5bnFfd2lmaV9hcF9ydW5fc3RhdHVzX3MgKiBhcF9zdGF0dXMpCiB7CiAgICAgY2hhciBzdGF0ZVtNQVhfQ01EXTsK