LyogZ3Byc19ybGNtYWMuY3BwCiAqCiAqIENvcHlyaWdodCAoQykgMjAxMiBJdmFuIEtseXVjaG5pa292CiAqIENvcHlyaWdodCAoQykgMjAxMiBBbmRyZWFzIEV2ZXJzYmVyZyA8am9sbHlAZXZlcnNiZXJnLmV1PgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KICovCiAKI2luY2x1ZGUgPGdwcnNfYnNzZ3BfcGN1Lmg+CiNpbmNsdWRlIDxwY3VfbDFfaWYuaD4KI2luY2x1ZGUgPGdwcnNfcmxjbWFjLmg+CiNpbmNsdWRlIDxnc21MMXByaW0uaD4KCkxMSVNUX0hFQUQoZ3Byc19ybGNtYWNfdGJmcyk7CnZvaWQgKnJsY21hY190YWxsX2N0eDsKCi8qIEZJWE1FOiBzcHJlYWQgcmVzc291cmNlcyBvbiBtdWx0aXBsZSBUUlggKi8KaW50IHRmaV9hbGxvYyh1aW50OF90ICpfdHJ4LCB1aW50OF90ICpfdHMpCnsKCXN0cnVjdCBncHJzX3JsY21hY19idHMgKmJ0cyA9IGdwcnNfcmxjbWFjX2J0czsKCXN0cnVjdCBncHJzX3JsY21hY19wZGNoICpwZGNoOwoJdWludDhfdCB0cngsIHRzLCB0Zmk7CgoJZm9yICh0cnggPSAwOyB0cnggPCA4OyB0cngrKykgewoJCWZvciAodHMgPSAwOyB0cyA8IDg7IHRzKyspIHsKCQkJcGRjaCA9ICZidHMtPnRyeFt0cnhdLnBkY2hbdHNdOwoJCQlpZiAoIXBkY2gtPmVuYWJsZSkKCQkJCWNvbnRpbnVlOwoJCQlicmVhazsKCQl9CgkJaWYgKHRzIDwgOCkKCQkJYnJlYWs7Cgl9CglpZiAodHJ4ID09IDgpIHsKCQlMT0dQKERSTENNQUMsIExPR0xfTk9USUNFLCAiTm8gUERDSCBhdmFpbGFibGUuXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgoJTE9HUChEUkxDTUFDLCBMT0dMX0RFQlVHLCAiU2VhcmNoaW5nIGZvciBmaXJzdCB1bmFsbG9jYXRlZCBURkk6ICIKCQkiVFJYPSVkIFRTPSVkXG4iLCB0cngsIHRzKTsKCWZvciAodGZpID0gMDsgdGZpIDwgMzI7IHRmaSsrKSB7CgkJaWYgKCFwZGNoLT50YmZbdGZpXSkKCQkJYnJlYWs7Cgl9CgkKCWlmICh0ZmkgPCAzMikgewoJCUxPR1AoRFJMQ01BQywgTE9HTF9ERUJVRywgIiBGb3VuZCBURkk9JWQuXG4iLCB0ZmkpOwoJCSpfdHJ4ID0gdHJ4OwoJCSpfdHMgPSB0czsKCQlyZXR1cm4gdGZpOwoJfQoJTE9HUChEUkxDTUFDLCBMT0dMX05PVElDRSwgIk5vIFRGSSBhdmFpbGFibGUuXG4iKTsKCglyZXR1cm4gLTE7Cn0KCmludCBmaW5kX2ZyZWVfdXNmKHVpbnQ4X3QgdHJ4LCB1aW50OF90IHRzKQp7CglzdHJ1Y3QgZ3Byc19ybGNtYWNfYnRzICpidHMgPSBncHJzX3JsY21hY19idHM7CglzdHJ1Y3QgZ3Byc19ybGNtYWNfcGRjaCAqcGRjaDsKCXN0cnVjdCBncHJzX3JsY21hY190YmYgKnRiZjsKCXVpbnQ4X3QgdXNmX21hcCA9IDA7Cgl1aW50OF90IHRmaSwgdXNmOwoKCWlmICh0cnggPj0gOCB8fCB0cyA+PSA4KQoJCXJldHVybiAtRUlOVkFMOwoJcGRjaCA9ICZidHMtPnRyeFt0cnhdLnBkY2hbdHNdOwoKCS8qIG1ha2UgbWFwIG9mIHVzZWQgVVNGICovCglmb3IgKHRmaSA9IDA7IHRmaSA8IDMyOyB0ZmkrKykgewoJCXRiZiA9IHBkY2gtPnRiZlt0ZmldOwoJCWlmICghdGJmKQoJCQljb250aW51ZTsKCQlpZiAodGJmLT5kaXJlY3Rpb24gIT0gR1BSU19STENNQUNfVUxfVEJGKQoJCQljb250aW51ZTsKCQl1c2ZfbWFwIHw9ICgxIDw8IHRiZi0+ZGlyLnVsLnVzZik7Cgl9CgoJLyogbG9vayBmb3IgVVNGLCBkb24ndCB1c2UgVVNGPTcgKi8KCWZvciAodXNmID0gMDsgdXNmIDwgNzsgdXNmKyspIHsKCQlpZiAoISh1c2ZfbWFwICYgKDEgPDwgdXNmKSkpIHsKCQkJTE9HUChEUkxDTUFDLCBMT0dMX0RFQlVHLCAiIEZvdW5kIFVTRj0lZC5cbiIsIHVzZik7CgkJCXJldHVybiB1c2Y7CgkJfQoJfQoJTE9HUChEUkxDTUFDLCBMT0dMX05PVElDRSwgIk5vIFVTRiBhdmFpbGFibGUuXG4iKTsKCglyZXR1cm4gLTE7Cn0KCi8qIGxvb2t1cCBUQkYgRW50aXR5IChieSBURkkpICovCiN3YXJuaW5nIEZJWE1FOiB1c2UgcGRjaCBpbnN0YW5jZSBieSB0cnggYW5kIHRzLCBiZWNhdXNlIHRmaSBpcyBsb2NhbApzdHJ1Y3QgZ3Byc19ybGNtYWNfdGJmICp0YmZfYnlfdGZpKHVpbnQ4X3QgdGZpLCBpbnQgZGlyZWN0aW9uKQp7CglzdHJ1Y3QgZ3Byc19ybGNtYWNfdGJmICp0YmY7CgoJbGxpc3RfZm9yX2VhY2hfZW50cnkodGJmLCAmZ3Byc19ybGNtYWNfdGJmcywgbGlzdCkgewoJCWlmICh0YmYtPnN0YXRlICE9IEdQUlNfUkxDTUFDX1JFTEVBU0lORwoJCSAmJiB0YmYtPnRmaSA9PSB0ZmkKCQkgJiYgdGJmLT5kaXJlY3Rpb24gPT0gZGlyZWN0aW9uKQoJCQlyZXR1cm4gdGJmOwoJfQoJcmV0dXJuIE5VTEw7Cn0KCi8qIHNlYXJjaCBmb3IgYWN0aXZlIGRvd25saW5rIG9yIHVwbGluayB0YmYgKi8Kc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmX2J5X3RsbGkodWludDMyX3QgdGxsaSwgaW50IGRpcmVjdGlvbikKewoJc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmOwoJbGxpc3RfZm9yX2VhY2hfZW50cnkodGJmLCAmZ3Byc19ybGNtYWNfdGJmcywgbGlzdCkgewoJCWlmICh0YmYtPnN0YXRlICE9IEdQUlNfUkxDTUFDX1JFTEVBU0lORwoJCSAmJiB0YmYtPnRsbGkgPT0gdGxsaQoJCSAmJiB0YmYtPmRpcmVjdGlvbiA9PSBkaXJlY3Rpb24pCgkJCXJldHVybiB0YmY7Cgl9CglyZXR1cm4gTlVMTDsKfQoKI3dhcm5pbmcgRklYTUU6IHVzZSBwZGNoIGluc3RhbmNlIGJ5IHRyeCBhbmQgdHMsIGJlY2F1c2UgcG9sbGluZyBpcyBsb2NhbApzdHJ1Y3QgZ3Byc19ybGNtYWNfdGJmICp0YmZfYnlfcG9sbF9mbih1aW50MzJfdCBmbikKewoJc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmOwoJbGxpc3RfZm9yX2VhY2hfZW50cnkodGJmLCAmZ3Byc19ybGNtYWNfdGJmcywgbGlzdCkgewoJCWlmICh0YmYtPnN0YXRlICE9IEdQUlNfUkxDTUFDX1JFTEVBU0lORwoJCSAmJiB0YmYtPnBvbGxfc3RhdGUgPT0gR1BSU19STENNQUNfUE9MTF9TQ0hFRAoJCSAmJiB0YmYtPnBvbGxfZm4gPT0gZm4pCgkJCXJldHVybiB0YmY7Cgl9CglyZXR1cm4gTlVMTDsKfQoKc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmX2FsbG9jKHVpbnQ4X3QgdGZpLCB1aW50OF90IHRyeCwgdWludDhfdCB0cykKewoJc3RydWN0IGdwcnNfcmxjbWFjX2J0cyAqYnRzID0gZ3Byc19ybGNtYWNfYnRzOwoJc3RydWN0IGdwcnNfcmxjbWFjX3BkY2ggKnBkY2g7CglzdHJ1Y3QgZ3Byc19ybGNtYWNfdGJmICp0YmY7CgoJTE9HUChEUkxDTUFDLCBMT0dMX0lORk8sICIqKioqKioqKioqIFRCRiBzdGFydHMgaGVyZSAqKioqKioqKioqXG4iKTsKCUxPR1AoRFJMQ01BQywgTE9HTF9JTkZPLCAiQWxsb2NhdGluZyBUQkYgd2l0aCBURkk9JWQuXG4iLCB0ZmkpOwoKCWlmICh0cnggPj0gOCB8fCB0cyA+PSA4IHx8IHRmaSA+PSAzMikKCQlyZXR1cm4gTlVMTDsKCXBkY2ggPSAmYnRzLT50cnhbdHJ4XS5wZGNoW3RzXTsKCgl0YmYgPSB0YWxsb2NfemVybyhybGNtYWNfdGFsbF9jdHgsIHN0cnVjdCBncHJzX3JsY21hY190YmYpOwoJaWYgKCF0YmYpCgkJcmV0dXJuIE5VTEw7CgoJdGJmLT50ZmkgPSB0Zmk7Cgl0YmYtPnRyeCA9IHRyeDsKCXRiZi0+dHMgPSB0czsKCXRiZi0+YXJmY24gPSBidHMtPnRyeFt0cnhdLmFyZmNuOwoJdGJmLT50c2MgPSBidHMtPnRyeFt0cnhdLnBkY2hbdHNdLnRzYzsKCXRiZi0+cGRjaCA9IHBkY2g7Cgl0YmYtPndzID0gNjQ7Cgl0YmYtPnNucyA9IDEyODsKCUlOSVRfTExJU1RfSEVBRCgmdGJmLT5sbGNfcXVldWUpOwoJbGxpc3RfYWRkKCZ0YmYtPmxpc3QsICZncHJzX3JsY21hY190YmZzKTsKCXBkY2gtPnRiZlt0ZmldID0gdGJmOwoKCXJldHVybiB0YmY7Cn0KCnZvaWQgdGJmX2ZyZWUoc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmKQp7CglzdHJ1Y3QgZ3Byc19ybGNtYWNfYnRzICpidHMgPSBncHJzX3JsY21hY19idHM7CglzdHJ1Y3QgZ3Byc19ybGNtYWNfcGRjaCAqcGRjaDsKCXN0cnVjdCBtc2diICptc2c7CgoJTE9HUChEUkxDTUFDLCBMT0dMX0lORk8sICJGcmVlIFRCRj0lZCB3aXRoIFRMTEk9MHglMDh4LlxuIiwgdGJmLT50ZmksCgkJdGJmLT50bGxpKTsKCXRiZl90aW1lcl9zdG9wKHRiZik7Cgl3aGlsZSAoKG1zZyA9IG1zZ2JfZGVxdWV1ZSgmdGJmLT5sbGNfcXVldWUpKSkKCQltc2diX2ZyZWUobXNnKTsKCXBkY2ggPSAmYnRzLT50cnhbdGJmLT50cnhdLnBkY2hbdGJmLT50c107CglwZGNoLT50YmZbdGJmLT50ZmldID0gTlVMTDsKCWxsaXN0X2RlbCgmdGJmLT5saXN0KTsKCUxPR1AoRFJMQ01BQywgTE9HTF9JTkZPLCAiKioqKioqKioqKiBUQkYgZW5kcyBoZXJlICoqKioqKioqKipcbiIpOwoJdGFsbG9jX2ZyZWUodGJmKTsKfQoKY29uc3QgY2hhciAqdGJmX3N0YXRlX25hbWVbXSA9IHsKCSJOVUxMIiwKCSJBU1NJR04iLAoJIkZMT1ciLAoJIkZJTklTSEVEIiwKCSJXQUlUIFJFTEVBU0UiLAoJIlJFTEVBU0lORyIsCn07Cgp2b2lkIHRiZl9uZXdfc3RhdGUoc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmLAoJZW51bSBncHJzX3JsY21hY190YmZfc3RhdGUgc3RhdGUpCnsKCUxPR1AoRFJMQ01BQywgTE9HTF9JTkZPLCAiVEJGPSVkIGNoYW5nZXMgc3RhdGUgZnJvbSAlcyB0byAlc1xuIiwKCQl0YmYtPnRmaSwgdGJmX3N0YXRlX25hbWVbdGJmLT5zdGF0ZV0sIHRiZl9zdGF0ZV9uYW1lW3N0YXRlXSk7Cgl0YmYtPnN0YXRlID0gc3RhdGU7Cn0KCnZvaWQgdGJmX3RpbWVyX3N0YXJ0KHN0cnVjdCBncHJzX3JsY21hY190YmYgKnRiZiwgdW5zaWduZWQgaW50IFQsCgkJCXVuc2lnbmVkIGludCBzZWNvbmRzLCB1bnNpZ25lZCBpbnQgbWljcm9zZWNvbmRzKQp7CglpZiAoIW9zbW9fdGltZXJfcGVuZGluZygmdGJmLT50aW1lcikpCgkJTE9HUChEUkxDTUFDLCBMT0dMX0RFQlVHLCAiU3RhcnRpbmcgVEJGPSVkIHRpbWVyICV1LlxuIiwKCQkJdGJmLT50ZmksIFQpOwoJZWxzZQoJCUxPR1AoRFJMQ01BQywgTE9HTF9ERUJVRywgIlJlc3RhcnRpbmcgVEJGPSVkIHRpbWVyICV1IHdoaWxlICIKCQkJIm9sZCB0aW1lciAldSBwZW5kaW5nIFxuIiwgdGJmLT50ZmksIFQsIHRiZi0+VCk7CgoJdGJmLT5UID0gVDsKCXRiZi0+bnVtX1RfZXhwID0gMDsKCgkvKiBUdW5uaW5nIHRpbWVycyBjYW4gYmUgc2FmZWx5IHJlLXNjaGVkdWxlZC4gKi8KCXRiZi0+dGltZXIuZGF0YSA9IHRiZjsKCXRiZi0+dGltZXIuY2IgPSAmdGJmX3RpbWVyX2NiOwoKCW9zbW9fdGltZXJfc2NoZWR1bGUoJnRiZi0+dGltZXIsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcyk7Cn0KCnZvaWQgdGJmX3RpbWVyX3N0b3Aoc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmKQp7CglpZiAob3Ntb190aW1lcl9wZW5kaW5nKCZ0YmYtPnRpbWVyKSkgewoJCUxPR1AoRFJMQ01BQywgTE9HTF9ERUJVRywgIlN0b3BwaW5nIFRCRj0lZCB0aW1lciAldS5cbiIsCgkJCXRiZi0+dGZpLCB0YmYtPlQpOwoJCW9zbW9fdGltZXJfZGVsKCZ0YmYtPnRpbWVyKTsKCX0KfQoKI2lmIDAKc3RhdGljIHZvaWQgdGJmX2dzbV90aW1lcl9jYih2b2lkICpfdGJmKQp7CglzdHJ1Y3QgZ3Byc19ybGNtYWNfdGJmICp0YmYgPSAoc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqKV90YmY7CgoJdGJmLT5udW1fZlRfZXhwKys7CgoJc3dpdGNoICh0YmYtPmZUKSB7CgljYXNlIDA6CmhpZXIgYWxsZXMg/GJlcmRlbmtlbgoJCS8vIFRoaXMgaXMgdGltZXIgZm9yIGRlbGF5IFJMQy9NQUMgZGF0YSBzZW5kaW5nIGFmdGVyIERvd25saW5rIEltbWVkaWF0ZSBBc3NpZ25tZW50IG9uIENDQ0guCgkJZ3Byc19ybGNtYWNfc2VnbWVudF9sbGNfcGR1KHRiZik7CgkJTE9HUChEUkxDTUFDLCBMT0dMX05PVElDRSwgIlRCRjogW0RPV05MSU5LXSBFTkQgVEZJOiAldSBUTExJOiAweCUwOHggXG4iLCB0YmYtPnRmaSwgdGJmLT50bGxpKTsKCQl0YmZfZnJlZSh0YmYpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlMT0dQKERSTENNQUMsIExPR0xfTk9USUNFLCAiVGltZXIgZXhwaXJlZCBpbiB1bmtub3duIG1vZGU6ICV1IFxuIiwgdGJmLT5mVCk7Cgl9Cn0KCnN0YXRpYyB2b2lkIHRiZl9nc21fdGltZXJfc3RhcnQoc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmLCB1bnNpZ25lZCBpbnQgZlQsCgkJCQlpbnQgZnJhbWVzKQp7CglpZiAob3Ntb19nc21fdGltZXJfcGVuZGluZygmdGJmLT5nc21fdGltZXIpKQoJCUxPR1AoRFJMQ01BQywgTE9HTF9OT1RJQ0UsICJTdGFydGluZyBUQkYgdGltZXIgJXUgd2hpbGUgb2xkIHRpbWVyICV1IHBlbmRpbmcgXG4iLCBmVCwgdGJmLT5mVCk7Cgl0YmYtPmZUID0gZlQ7Cgl0YmYtPm51bV9mVF9leHAgPSAwOwoKCS8qIEZJWE1FOiB3ZSBzaG91bGQgZG8gdGhpcyBvbmx5IG9uY2UgPyAqLwoJdGJmLT5nc21fdGltZXIuZGF0YSA9IHRiZjsKCXRiZi0+Z3NtX3RpbWVyLmNiID0gJnRiZl9nc21fdGltZXJfY2I7CgoJb3Ntb19nc21fdGltZXJfc2NoZWR1bGUoJnRiZi0+Z3NtX3RpbWVyLCBmcmFtZXMpOwp9CgplaW5lIHN0b3AtZnVua3Rpb24sIGF1Y2ggaW0gdGJmX2ZyZWUgYXVmcnVmZW4KCiNlbmRpZgoKI2lmIDAKdm9pZCBncHJzX3JsY21hY19lbnF1ZXVlX2Jsb2NrKGJpdHZlYyAqYmxvY2ssIGludCBsZW4pCnsKCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKGxlbiwgInJsY21hY19kbCIpOwoJYml0dmVjX3BhY2soYmxvY2ssIG1zZ2JfcHV0KG1zZywgbGVuKSk7Cgltc2diX2VucXVldWUoJmJsb2NrX3F1ZXVlLCBtc2cpOwp9CiNlbmRpZgoKLyogcmVjZWl2ZWQgUkxDL01BQyBibG9jayBmcm9tIEwxICovCmludCBncHJzX3JsY21hY19yY3ZfYmxvY2sodWludDhfdCAqZGF0YSwgdWludDhfdCBsZW4sIHVpbnQzMl90IGZuKQp7Cgl1bnNpZ25lZCBwYXlsb2FkID0gZGF0YVswXSA+PiA2OwoJYml0dmVjICpibG9jazsKCWludCByYyA9IDA7CgoJc3dpdGNoIChwYXlsb2FkKSB7CgljYXNlIEdQUlNfUkxDTUFDX0RBVEFfQkxPQ0s6CgkJcmMgPSBncHJzX3JsY21hY19yY3ZfZGF0YV9ibG9ja19hY2tub3dsZWRnZWQoZGF0YSwgbGVuKTsKCQlicmVhazsKCWNhc2UgR1BSU19STENNQUNfQ09OVFJPTF9CTE9DSzoKCQlibG9jayA9IGJpdHZlY19hbGxvYyhsZW4pOwoJCWlmICghYmxvY2spCgkJCXJldHVybiAtRU5PTUVNOwoJCWJpdHZlY191bnBhY2soYmxvY2ssIGRhdGEpOwoJCXJjID0gZ3Byc19ybGNtYWNfcmN2X2NvbnRyb2xfYmxvY2soYmxvY2ssIGZuKTsKCQliaXR2ZWNfZnJlZShibG9jayk7CgkJYnJlYWs7CgljYXNlIEdQUlNfUkxDTUFDX0NPTlRST0xfQkxPQ0tfT1BUOgoJCUxPR1AoRFJMQ01BQywgTE9HTF9OT1RJQ0UsICJHUFJTX1JMQ01BQ19DT05UUk9MX0JMT0NLX09QVCBibG9jayBwYXlsb2FkIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCWRlZmF1bHQ6CgkJTE9HUChEUkxDTUFDLCBMT0dMX05PVElDRSwgIlVua25vd24gUkxDTUFDIGJsb2NrIHBheWxvYWQuXG4iKTsKCQlyYyA9IC1FSU5WQUw7Cgl9CgoJcmV0dXJuIHJjOwp9CgovLyBHU00gMDQuMDggOS4xLjE4IEltbWVkaWF0ZSBhc3NpZ25tZW50CmludCB3cml0ZV9pbW1lZGlhdGVfYXNzaWdubWVudChiaXR2ZWMgKiBkZXN0LCB1aW50OF90IGRvd25saW5rLCB1aW50OF90IHJhLAoJdWludDMyX3QgZm4sIHVpbnQ4X3QgdGEsIHVpbnQxNl90IGFyZmNuLCB1aW50OF90IHRzLCB1aW50OF90IHRzYywKCXVpbnQ4X3QgdGZpLCB1aW50OF90IHVzZiwgdWludDMyX3QgdGxsaSwKCXVpbnQ4X3QgcG9sbGluZywgdWludDMyX3QgcG9sbF9mbikKewoJdW5zaWduZWQgd3AgPSAwOwoKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsNCk7ICAvLyBTa2lwIEluZGljYXRvcgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4Niw0KTsgIC8vIFByb3RvY29sIERpc2NyaW1pbmF0b3IKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDNGLDgpOyAvLyBJbW1lZGlhdGUgQXNzaWdubWVudCBNZXNzYWdlIFR5cGUKCgkvLyAxMC41LjIuMjViIERlZGljYXRlZCBtb2RlIG9yIFRCRgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgICAgICAvLyBzcGFyZQoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgICAgICAvLyBUTUEgOiBUd28tbWVzc2FnZSBhc3NpZ25tZW50OiBObyBtZWFuaW5nCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsZG93bmxpbmssMSk7IC8vIERvd25saW5rIDogRG93bmxpbmsgYXNzaWdubWVudCB0byBtb2JpbGUgaW4gcGFja2V0IGlkbGUgbW9kZQoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgICAgICAvLyBUL0QgOiBUQkYgb3IgZGVkaWNhdGVkIG1vZGU6IHRoaXMgbWVzc2FnZSBhc3NpZ25zIGEgVGVtcG9yYXJ5IEJsb2NrIEZsb3cgKFRCRikuCgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCw0KTsgLy8gUGFnZSBNb2RlCgoJLy8gR1NNIDA0LjA4IDEwLjUuMi4yNWEgUGFja2V0IENoYW5uZWwgRGVzY3JpcHRpb24KCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDEsNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoYW5uZWwgdHlwZQoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHRzLDMpOyAgICAgLy8gVE4KCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCx0c2MsMyk7ICAgIC8vIFRTQwoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLWhvcHBpbmcgUkYgY2hhbm5lbCBjb25maWd1cmFpb24KCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCxhcmZjbiwxMCk7IC8vIEFSRkNOCgoJLy8xMC41LjIuMzAgUmVxdWVzdCBSZWZlcmVuY2UKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCxyYSw4KTsgICAgICAgICAgICAgICAgICAgIC8vIFJBCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsKGZuIC8gKDI2ICogNTEpKSAlIDMyLDUpOyAvLyBUMScKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCxmbiAlIDUxLDYpOyAgICAgICAgICAgICAgIC8vIFQzCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsZm4gJSAyNiw1KTsgICAgICAgICAgICAgICAvLyBUMgoKCS8vIDEwLjUuMi40MCBUaW1pbmcgQWR2YW5jZQoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwyKTsgLy8gc3BhcmUKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCx0YSw2KTsgIC8vIFRpbWluZyBBZHZhbmNlIHZhbHVlCgoJLy8gTm8gbW9iaWxlIGFsbG9jYXRpb24gaW4gbm9uLWhvcHBpbmcgc3lzdGVtcy4KCS8vIEEgemVyby1sZW5ndGggTFYuICBKdXN0IHdyaXRlIEw9MC4KCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwwLDgpOwoKCWlmIChkb3dubGluaykKCXsKCQkvLyBHU00gMDQuMDggMTAuNS4yLjE2IElBIFJlc3QgT2N0ZXRzCgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLCAzLCAyKTsgICAvLyAiSEgiCgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLCAxLCAyKTsgICAvLyAiMDEiIFBhY2tldCBEb3dubGluayBBc3NpZ25tZW50CgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHRsbGksMzIpOyAvLyBUTExJCgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgICAvLyBzd2l0Y2ggVEZJICAgOiBvbgoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCx0ZmksNSk7ICAgLy8gVEZJCgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgICAvLyBSTEMgYWNrbm93bGVkZ2VkIG1vZGUKCQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOyAgIC8vIEFMUEhBID0gbm90IHByZXNlbnQKCQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDUpOyAgIC8vIEdBTU1BIHBvd2VyIGNvbnRyb2wgcGFyYW1ldGVyCgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHBvbGxpbmcsMSk7ICAgLy8gUG9sbGluZyBCaXQKCQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsIXBvbGxpbmcsMSk7ICAgLy8gVEFfVkFMSUQgPz8/CgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgICAvLyBzd2l0Y2ggVElNSU5HX0FEVkFOQ0VfSU5ERVggPSBvbgoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsNCk7ICAgLy8gVElNSU5HX0FEVkFOQ0VfSU5ERVgKCQlpZiAocG9sbGluZykgewoJCQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgxLDEpOyAgIC8vIFRCRiBTdGFydGluZyBUSU1FIHByZXNlbnQKCQkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLChwb2xsX2ZuIC8gKDI2ICogNTEpKSAlIDMyLDUpOyAvLyBUMScKCQkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHBvbGxfZm4gJSA1MSw2KTsgICAgICAgICAgICAgICAvLyBUMwoJCQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AscG9sbF9mbiAlIDI2LDUpOyAgICAgICAgICAgICAgIC8vIFQyCgkJfSBlbHNlIHsKCQkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgICAvLyBUQkYgU3RhcnRpbmcgVElNRSBwcmVzZW50CgkJfQoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7ICAgLy8gUDAgbm90IHByZXNlbnQKLy8JCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDEsMSk7ICAgLy8gUDAgbm90IHByZXNlbnQKLy8JCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweGIsNCk7Cgl9CgllbHNlCgl7CgkJc3RydWN0IGdwcnNfcmxjbWFjX2J0cyAqYnRzID0gZ3Byc19ybGNtYWNfYnRzOwoJCS8vIEdNUyAwNC4wOCAxMC41LjIuMzdiIDEwLjUuMi4xNgoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwgMywgMik7ICAgIC8vICJISCIKCQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsIDAsIDIpOyAgICAvLyAiMCIgUGFja2V0IFVwbGluayBBc3NpZ25tZW50CgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLCAxLCAxKTsgICAgLy8gQmxvY2sgQWxsb2NhdGlvbiA6IE5vdCBTaW5nbGUgQmxvY2sgQWxsb2NhdGlvbgoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwgdGZpLCA1KTsgIC8vIFRGSV9BU1NJR05NRU5UIFRlbXBvcmFyeSBGbG93IElkZW50aXR5CgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLCAwLCAxKTsgICAgLy8gUE9MTElORwoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwgMCwgMSk7ICAgIC8vIEFMTE9DQVRJT05fVFlQRTogZHluYW1pYwoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwgdXNmLCAzKTsgICAgLy8gVVNGCgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLCAwLCAxKTsgICAgLy8gVVNGX0dSQU5VTEFSSVRZCgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLCAwICwgMSk7ICAgLy8gIjAiIHBvd2VyIGNvbnRyb2w6IE5vdCBQcmVzZW50CgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLCBidHMtPmluaXRpYWxfY3MtMSwgMik7ICAgIC8vIENIQU5ORUxfQ09ESU5HX0NPTU1BTkQgCgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLCAxLCAxKTsgICAgLy8gVExMSV9CTE9DS19DSEFOTkVMX0NPRElORwoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwgMSAsIDEpOyAgIC8vICIxIiBBbHBoYSA6IFByZXNlbnQKCQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsIDAsIDQpOyAgICAvLyBBbHBoYQoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwgMCwgNSk7ICAgIC8vIEdhbW1hCgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLCAwLCAxKTsgICAgLy8gVElNSU5HX0FEVkFOQ0VfSU5ERVhfRkxBRwoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwgMCwgMSk7ICAgIC8vIFRCRl9TVEFSVElOR19USU1FX0ZMQUcKCX0KCglpZiAod3AlOCkKCQlyZXR1cm4gd3AvOCsxOwoJZWxzZQoJCXJldHVybiB3cC84Owp9CgovKiBnZW5lcmF0ZSB1cGxpbmsgYXNzaWdubWVudCAqLwp2b2lkIHdyaXRlX3BhY2tldF91cGxpbmtfYXNzaWdubWVudChiaXR2ZWMgKiBkZXN0LCB1aW50OF90IG9sZF90ZmksCgl1aW50OF90IG9sZF9kb3dubGluaywgdWludDMyX3QgdGxsaSwgdWludDhfdCB1c2VfdGxsaSwgdWludDhfdCBuZXdfdGZpLAoJdWludDhfdCB1c2YsIHVpbnQxNl90IGFyZmNuLCB1aW50OF90IHRuLCB1aW50OF90IHRhLCB1aW50OF90IHRzYywKCXVpbnQ4X3QgcG9sbCkKewoJLy8gVE9ETyBXZSBzaG91bGQgdXNlIG91ciBpbXBsZW1lbnRhdGlvbiBvZiBlbmNvZGUgUkxDL01BQyBDb250cm9sIG1lc3NhZ2VzLgoJc3RydWN0IGdwcnNfcmxjbWFjX2J0cyAqYnRzID0gZ3Byc19ybGNtYWNfYnRzOwoJdW5zaWduZWQgd3AgPSAwOwoJaW50IGk7CgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwyKTsgIC8vIFBheWxvYWQgVHlwZQoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwyKTsgIC8vIFVwbGluayBibG9jayB3aXRoIFRETUEgZnJhbWVudW1iZXIgKE4rMTMpCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AscG9sbCwxKTsgIC8vIFN1cHBsL1BvbGxpbmcgQml0CgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDMpOyAgLy8gVXBsaW5rIHN0YXRlIGZsYWcKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweGEsNik7ICAvLyBNRVNTQUdFIFRZUEUKCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDIpOyAgLy8gUGFnZSBNb2RlCgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgLy8gc3dpdGNoIFBFUlNJU1RfTEVWRUw6IG9mZgoJaWYgKHVzZV90bGxpKSB7CgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MiwyKTsgLy8gc3dpdGNoIFRMTEkgICA6IG9uCgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHRsbGksMzIpOyAvLyBUTExJCgl9IGVsc2UgewoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7IC8vIHN3aXRjaCBURkkgOiBvbgoJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCxvbGRfZG93bmxpbmssMSk7IC8vIDA9VVBMSU5LIFRGSSwgMT1ETCBURkkKCQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3Asb2xkX3RmaSw1KTsgLy8gVEZJCgl9CgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgLy8gTWVzc2FnZSBlc2NhcGUKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwgYnRzLT5pbml0aWFsX2NzLTEsIDIpOyAvLyBDSEFOTkVMX0NPRElOR19DT01NQU5EIAoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgLy8gVExMSV9CTE9DS19DSEFOTkVMX0NPRElORyAKCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgxLDEpOyAvLyBzd2l0Y2ggVElNSU5HX0FEVkFOQ0VfVkFMVUUgPSBvbgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHRhLDYpOyAvLyBUSU1JTkdfQURWQU5DRV9WQUxVRQoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgLy8gc3dpdGNoIFRJTUlOR19BRFZBTkNFX0lOREVYID0gb2ZmCgojaWYgMQoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgLy8gRnJlcXVlbmN5IFBhcmFtZXRlcnMgaW5mb3JtYXRpb24gZWxlbWVudHMgPSBwcmVzZW50CgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsdHNjLDMpOyAvLyBUcmFpbmluZyBTZXF1ZW5jZSBDb2RlIChUU0MpCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDIpOyAvLyBBUkZDTiA9IHByZXNlbnQKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCxhcmZjbiwxMCk7IC8vIEFSRkNOCiNlbHNlCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOyAvLyBGcmVxdWVuY3kgUGFyYW1ldGVycyA9IG9mZgojZW5kaWYKCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgxLDIpOyAvLyBEeW5hbWljIEFsbG9jYXRpb24KCQoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgLy8gRXh0ZW5kZWQgRHluYW1pYyBBbGxvY2F0aW9uID0gb2ZmCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOyAvLyBQMCA9IG9mZgoJCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOyAvLyBVU0ZfR1JBTlVMQVJJVFkKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDEsMSk7IC8vIHN3aXRjaCBURkkgICA6IG9uCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsbmV3X3RmaSw1KTsvLyBURkkKCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOyAvLwoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgLy8gVEJGIFN0YXJ0aW5nIFRpbWUgPSBvZmYKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7IC8vIFRpbWVzbG90IEFsbG9jYXRpb24KCQoJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewoJCWlmICh0biA9PSBpKSB7CgkJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDEsMSk7IC8vIFVTRl9UTihpKTogb24KCQkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHVzZiwzKTsgLy8gVVNGX1ROKGkpCgkJfSBlbHNlCgkJCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7IC8vIFVTRl9UTihpKTogb2ZmCgl9Ci8vCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7IC8vIE1lYXN1cmVtZW50IE1hcHBpbmcgc3RydWN0IG5vdCBwcmVzZW50Cn0KCi8qIGdlbmVyYXRlIGRvd25saW5rIGFzc2lnbm1lbnQgKi8Kdm9pZCB3cml0ZV9wYWNrZXRfZG93bmxpbmtfYXNzaWdubWVudChiaXR2ZWMgKiBkZXN0LCB1aW50OF90IG9sZF90ZmksCgl1aW50OF90IG9sZF9kb3dubGluaywgdWludDhfdCBuZXdfdGZpLCB1aW50MTZfdCBhcmZjbiwKCXVpbnQ4X3QgdG4sIHVpbnQ4X3QgdGEsIHVpbnQ4X3QgdHNjLCB1aW50OF90IHBvbGwpCnsKCS8vIFRPRE8gV2Ugc2hvdWxkIHVzZSBvdXIgaW1wbGVtZW50YXRpb24gb2YgZW5jb2RlIFJMQy9NQUMgQ29udHJvbCBtZXNzYWdlcy4KCXVuc2lnbmVkIHdwID0gMDsKCWludCBpOwoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwyKTsgIC8vIFBheWxvYWQgVHlwZQoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwyKTsgIC8vIFVwbGluayBibG9jayB3aXRoIFRETUEgZnJhbWVudW1iZXIgKEZOKzEzKQoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHBvbGwsMSk7ICAvLyBTdXBwbC9Qb2xsaW5nIEJpdAoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwzKTsgIC8vIFVwbGluayBzdGF0ZSBmbGFnCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgyLDYpOyAgLy8gTUVTU0FHRSBUWVBFCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDIpOyAgLy8gUGFnZSBNb2RlCgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgLy8gc3dpdGNoIFBFUlNJU1RfTEVWRUw6IG9mZgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgLy8gc3dpdGNoIFRGSSA6IG9uCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3Asb2xkX2Rvd25saW5rLDEpOyAvLyAwPVVQTElOSyBURkksIDE9REwgVEZJCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3Asb2xkX3RmaSw1KTsgLy8gVEZJCgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgLy8gTWVzc2FnZSBlc2NhcGUKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMik7IC8vIE1lZGl1bSBBY2Nlc3MgTWV0aG9kOiBEeW5hbWljIEFsbG9jYXRpb24KCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7IC8vIFJMQyBhY2tub3dsZWRnZWQgbW9kZQoKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCxvbGRfZG93bmxpbmssMSk7IC8vIHRoZSBuZXR3b3JrIGVzdGFibGlzaGVzIG5vIG5ldyBkb3dubGluayBUQkYgZm9yIHRoZSBtb2JpbGUgc3RhdGlvbgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4ODAgPj4gdG4sOCk7IC8vIHRpbWVzbG90KHMpCgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgLy8gc3dpdGNoIFRJTUlOR19BRFZBTkNFX1ZBTFVFID0gb24KCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCx0YSw2KTsgLy8gVElNSU5HX0FEVkFOQ0VfVkFMVUUKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7IC8vIHN3aXRjaCBUSU1JTkdfQURWQU5DRV9JTkRFWCA9IG9mZgoKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7IC8vIHN3aXRjaCBQT1dFUiBDT05UUk9MID0gb2ZmCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgxLDEpOyAvLyBGcmVxdWVuY3kgUGFyYW1ldGVycyBpbmZvcm1hdGlvbiBlbGVtZW50cyA9IHByZXNlbnQKCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsdHNjLDMpOyAvLyBUcmFpbmluZyBTZXF1ZW5jZSBDb2RlIChUU0MpID0gMgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwyKTsgLy8gQVJGQ04gPSBwcmVzZW50CgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsYXJmY24sMTApOyAvLyBBUkZDTgoKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDEsMSk7IC8vIHN3aXRjaCBURkkgICA6IG9uCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsbmV3X3RmaSw1KTsvLyBURkkKCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgxLDEpOyAvLyBQb3dlciBDb250cm9sIFBhcmFtZXRlcnMgSUUgPSBwcmVzZW50CgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDQpOyAvLyBBTFBIQSBwb3dlciBjb250cm9sIHBhcmFtZXRlcgoJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKCQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsKHRuID09IGkpLDEpOyAvLyBzd2l0Y2ggR0FNTUFfVE5baV0gPSBvbiBvciBvZmYKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsNSk7IC8vIEdBTU1BX1ROW3RuXQoKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7IC8vIFRCRiBTdGFydGluZyBUSU1FIElFIG5vdCBwcmVzZW50CgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOyAvLyBNZWFzdXJlbWVudCBNYXBwaW5nIHN0cnVjdCBub3QgcHJlc2VudAoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsKfQoKLyogZ2VuZXJhdGUgdXBsaW5rIGFjayAqLwp2b2lkIHdyaXRlX3BhY2tldF91cGxpbmtfYWNrKGJpdHZlYyAqIGRlc3QsIHN0cnVjdCBncHJzX3JsY21hY190YmYgKnRiZiwKCXVpbnQ4X3QgZmluYWwpCnsKCWNoYXIgc2hvd192X25bNjVdOwoKCS8vIFRPRE8gV2Ugc2hvdWxkIHVzZSBvdXIgaW1wbGVtZW50YXRpb24gb2YgZW5jb2RlIFJMQy9NQUMgQ29udHJvbCBtZXNzYWdlcy4KCXVuc2lnbmVkIHdwID0gMDsKCXVpbnQxNl90IGksIGJibjsKCXVpbnQxNl90IG1vZF9zbnNfaGFsZiA9ICh0YmYtPnNucyA+PiAxKSAtIDE7CgljaGFyIGJpdDsKCglMT0dQKERSTENNQUNVTCwgTE9HTF9ERUJVRywgIlNlbmRpbmcgQWNrL05hY2sgZm9yIFRCRj0lZCAiCgkJIihmaW5hbD0lZClcbiIsIHRiZi0+dGZpLCBmaW5hbCk7CgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwyKTsgIC8vIHBheWxvYWQKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMik7ICAvLyBVcGxpbmsgYmxvY2sgd2l0aCBURE1BIGZyYW1lbnVtYmVyIChOKzEzKQoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLGZpbmFsLDEpOyAgLy8gU3VwcGwvUG9sbGluZyBCaXQKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMyk7ICAvLyBVcGxpbmsgc3RhdGUgZmxhZwoJCgkvL2JpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7ICAvLyBSZWR1Y2VkIGJsb2NrIHNlcXVlbmNlIG51bWJlcgoJLy9iaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsQlNOKzYsNSk7ICAvLyBSYWRpbyB0cmFuc2FjdGlvbiBpZGVudGlmaWVyCgkvL2JpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDEsMSk7ICAvLyBGaW5hbCBzZWdtZW50CgkvL2JpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDEsMSk7ICAvLyBBZGRyZXNzIGNvbnRyb2wKCgkvL2JpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMik7ICAvLyBQb3dlciByZWR1Y3Rpb246IDAKCS8vYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLFRGSSw1KTsgIC8vIFRlbXBvcmFyeSBmbG93IGlkZW50aWZpZXIKCS8vYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgIC8vIERpcmVjdGlvbgoKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDA5LDYpOyAvLyBNRVNTQUdFIFRZUEUKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMik7ICAvLyBQYWdlIE1vZGUKCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDIpOwoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHRiZi0+dGZpLDUpOyAvLyBVcGxpbmsgVEZJCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOwoJCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDIpOyAgLy8gQ1MxCgliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsZmluYWwsMSk7ICAvLyBGSU5BTF9BQ0tfSU5ESUNBVElPTgoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHRiZi0+ZGlyLnVsLnZfciw3KTsgLy8gU1RBUlRJTkdfU0VRVUVOQ0VfTlVNQkVSCgkvLyBSRUNFSVZFX0JMT0NLX0JJVE1BUAoJZm9yIChpID0gMCwgYmJuID0gKHRiZi0+ZGlyLnVsLnZfciAtIDY0KSAmIG1vZF9zbnNfaGFsZjsgaSA8IDY0OwoJICAgICBpKyssIGJibiA9IChiYm4gKyAxKSAmIG1vZF9zbnNfaGFsZikgewoJICAgICAJYml0ID0gdGJmLT5kaXIudWwudl9uW2Jibl07CgkJaWYgKGJpdCA9PSAwKQoJCQliaXQgPSAnICc7CgkJc2hvd192X25baV0gPSBiaXQ7CgkJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLChiaXQgPT0gJ1InKSwxKTsKCX0KCXNob3dfdl9uWzY0XSA9ICdcMCc7CglMT0dQKERSTENNQUNVTCwgTE9HTF9ERUJVRywgIi0gVihOKTogXCIlc1wiIFI9UmVjZWl2ZWQgIgoJCSJOPU5vdC1SZWNlaXZlZFxuIiwgc2hvd192X24pOwoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgIC8vIENPTlRFTlRJT05fUkVTT0xVVElPTl9UTExJID0gcHJlc2VudAoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHRiZi0+dGxsaSw4KjQpOwoJYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MDAsNCk7IC8vc3BhcmUKCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDUsNCk7IC8vMDEwMQp9CgovKiBTZW5kIFVwbGluayB1bml0LWRhdGEgdG8gU0dTTi4gKi8Kdm9pZCBncHJzX3JsY21hY190eF91bF91ZChncHJzX3JsY21hY190YmYgKnRiZikKewoJY29uc3QgdWludDhfdCBxb3NfcHJvZmlsZSA9IFFPU19QUk9GSUxFOwoJc3RydWN0IG1zZ2IgKmxsY19wZHU7Cgl1bnNpZ25lZCBtc2dfbGVuID0gTlNfSERSX0xFTiArIEJTU0dQX0hEUl9MRU4gKyB0YmYtPmxsY19pbmRleDsKCglMT0dQKERCU1NHUCwgTE9HTF9OT1RJQ0UsICJUWDogW1BDVSAtPiBTR1NOIF0gVEZJOiAldSBUTExJOiAweCUwOHggRGF0YUxlbjogJXVcbiIsIHRiZi0+dGZpLCB0YmYtPnRsbGksIHRiZi0+bGxjX2luZGV4KTsKCS8vTE9HUChEQlNTR1AsIExPR0xfTk9USUNFLCAiIERhdGEgPSAiKTsKCS8vZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRiZi0+bGxjX2luZGV4OyBpKyspCgkvLwlMT0dQQyhEQlNTR1AsIExPR0xfTk9USUNFLCAiJTAyeCAiLCB0YmYtPmxsY19mcmFtZVtpXSk7CgkKCWJjdHgtPmNlbGxfaWQgPSBDRUxMX0lEOwoJYmN0eC0+bnNlaSA9IE5TRUk7CgliY3R4LT5yYV9pZC5tbmMgPSBNTkM7CgliY3R4LT5yYV9pZC5tY2MgPSBNQ0M7CgliY3R4LT5yYV9pZC5sYWMgPSBQQ1VfTEFDOwoJYmN0eC0+cmFfaWQucmFjID0gUENVX1JBQzsKCWJjdHgtPmJ2Y2kgPSBCVkNJOwoKCWxsY19wZHUgPSBtc2diX2FsbG9jX2hlYWRyb29tKG1zZ19sZW4sIG1zZ19sZW4sImxsY19wZHUiKTsKCW1zZ2JfdHZsdl9wdXNoKGxsY19wZHUsIEJTU0dQX0lFX0xMQ19QRFUsIHNpemVvZih1aW50OF90KSp0YmYtPmxsY19pbmRleCwgdGJmLT5sbGNfZnJhbWUpOwoJYnNzZ3BfdHhfdWxfdWQoYmN0eCwgdGJmLT50bGxpLCAmcW9zX3Byb2ZpbGUsIGxsY19wZHUpOwp9Cgo=