I2luY2x1ZGUgIm1sdGFsbi5oIgojaW5jbHVkZSAiZHAuaCIKCiNkZWZpbmUgTUFDSElHQUkgMAojZGVmaW5lIE9VVEdBUDBUUlkgMQojZGVmaW5lIERFQlVHIDAKI2RlZmluZSBYWFhYWFhYICAgIDAKI2RlZmluZSBVU0VfUEVOQUxUWV9FWCAgMAojZGVmaW5lIEZBU1RNQVRDSENBTEMgMQoKCnN0YXRpYyBpbnQgaW1wYWxsb2NsZW4gPSAwOwpzdGF0aWMgZmxvYXQgKippbXBtdHggPSBOVUxMOwpmbG9hdCBwYXJ0X2ltcF9tYXRjaF9vdXRfc2NRKCBpbnQgaTEsIGludCBqMSApCnsKLy8JZnByaW50Ziggc3RkZXJyLCAiaW1wYWxsb2NsZW4gPSAlZFxuIiwgaW1wYWxsb2NsZW4gKTsKLy8JZnByaW50Ziggc3RkZXJyLCAiaTEsajE9JWQsJWQgLT4gaW1wbXR4PSVmXG4iLCBpMSwgajEsIGltcG10eFtpMV1bajFdICk7CglyZXR1cm4oIGltcG10eFtpMV1bajFdICk7CiNpZiAwCglpZiggaTEgPT0gbDEgfHwgajEgPT0gbDIgKSByZXR1cm4oIDAuMCApOwoJcmV0dXJuKCBpbXBtdHhbaTErc3RhcnQxXVtqMStzdGFydDJdICk7CiNlbmRpZgp9CnN0YXRpYyB2b2lkIHBhcnRfaW1wX21hdGNoX291dF92ZWFkX2dhcG1hcFEoIGZsb2F0ICppbXAsIGludCBpMSwgaW50IGxndGgyLCBpbnQgc3RhcnQyLCBpbnQgKmdhcG1hcDIgKQp7CiNpZiBGQVNUTUFDSENBTEMKCWZsb2F0ICpwdCA9IGltcDsKCWludCAqZ2FwbWFwcHQgPSBnYXBtYXAyOwoJd2hpbGUoIGxndGgyLS0gKQoJCSpwdCsrICs9IGltcG10eFtpMV1bc3RhcnQyKypnYXBtYXBwdCsrXTsKI2Vsc2UKCWludCBqOwoJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgl7CgkJaW1wW2pdICs9IGltcG10eFtpMV1bc3RhcnQyK2dhcG1hcDJbal1dOwoJfQojZW5kaWYKfQoKc3RhdGljIHZvaWQgcGFydF9pbXBfbWF0Y2hfb3V0X3ZlYWRfdGF0ZV9nYXBtYXBRKCBmbG9hdCAqaW1wLCBpbnQgajEsIGludCBsZ3RoMSwgaW50IHN0YXJ0MSwgaW50ICpnYXBtYXAxICkKewojaWYgRkFTVE1BQ0hDQUxDCglmbG9hdCAqcHQgPSBpbXA7CglpbnQgKmdhcG1hcHB0ID0gZ2FwbWFwMTsKCXdoaWxlKCBsZ3RoMS0tICkKCQkqcHQrKyA9IGltcG10eFtzdGFydDErKmdhcG1hcHB0KytdW2oxXTsKI2Vsc2UKCWludCBpOwoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgl7CgkJaW1wW2ldICs9IGltcG10eFtzdGFydDErZ2FwbWFwMVtpXV1bajFdOwoJfQojZW5kaWYKfQoKdm9pZCBwYXJ0X2ltcF9tYXRjaF9pbml0X3N0cmljdFEoIGZsb2F0ICppbXAsIGludCBjbHVzMSwgaW50IGNsdXMyLCBpbnQgbGd0aDEsIGludCBsZ3RoMiwgY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCBkb3VibGUgKmVmZjEsIGRvdWJsZSAqZWZmMiwgTG9jYWxIb20gKioqbG9jYWxob20sIGludCBmb3JzY29yZSApCnsKCWludCBpLCBqLCBrMSwgazIsIHRtcGludCwgc3RhcnQxLCBzdGFydDIsIGVuZDEsIGVuZDI7Cglkb3VibGUgZWZmaWosIGVmZmlqeDsgCgljaGFyICpwdCwgKnB0MSwgKnB0MjsKCUxvY2FsSG9tICp0bXBwdHI7CgoJaWYoIGltcGFsbG9jbGVuIDw9IGxndGgxICsgMiB8fCBpbXBhbGxvY2xlbiA8PSBsZ3RoMiArIDIgKQoJewoJCWlmKCBpbXBtdHggKSBGcmVlRmxvYXRNdHgoIGltcG10eCApOwoJCWltcGFsbG9jbGVuID0gTUFYKCBsZ3RoMSwgbGd0aDIgKSArIDI7CgkJaW1wbXR4ID0gQWxsb2NhdGVGbG9hdE10eCggaW1wYWxsb2NsZW4rMTAwLCBpbXBhbGxvY2xlbisxMDAgKTsKCX0KCgojaWYgMAoJZnByaW50Ziggc3RkZXJyLCAiZWZmMSBpbiBfaW5pdF9zdHJpY3QgPSBcbiIgKTsKCWZvciggaT0wOyBpPGNsdXMxOyBpKysgKQoJCWZwcmludGYoIHN0ZGVyciwgImVmZjFbXSA9ICVmXG4iLCBlZmYxW2ldICk7Cglmb3IoIGk9MDsgaTxjbHVzMjsgaSsrICkKCQlmcHJpbnRmKCBzdGRlcnIsICJlZmYyW10gPSAlZlxuIiwgZWZmMltpXSApOwojZW5kaWYKCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJaW1wbXR4W2ldW2pdID0gMC4wOwoJZWZmaWp4ID0gMS4wICogZmFzdGF0aHJlc2hvbGQ7Cglmb3IoIGk9MDsgaTxjbHVzMTsgaSsrICkKCXsKCQlmb3IoIGo9MDsgajxjbHVzMjsgaisrICkKCQl7CgkJCWVmZmlqID0gZWZmMVtpXSAqIGVmZjJbal0gKiBlZmZpang7CgkJCXRtcHB0ciA9IGxvY2FsaG9tW2ldW2pdOwoJCQl3aGlsZSggdG1wcHRyICkKCQkJewovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJzdGFydDEgPSAlZFxuIiwgdG1wcHRyLT5zdGFydDEgKTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiZW5kMSAgID0gJWRcbiIsIHRtcHB0ci0+ZW5kMSAgICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImkgPSAlZCwgc2VxMSA9IFxuJXNcbiIsIGksIHNlcTFbaV0gKTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiaiA9ICVkLCBzZXEyID0gXG4lc1xuIiwgaiwgc2VxMltqXSApOwoJCQkJcHQgPSBzZXExW2ldOwoJCQkJdG1waW50ID0gLTE7CgkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJewoJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+c3RhcnQxICkgYnJlYWs7CgkJCQl9CgkJCQlzdGFydDEgPSAoaW50KSggcHQgLSBzZXExW2ldICkgLSAxOwoJCgkJCQlpZiggdG1wcHRyLT5zdGFydDEgPT0gdG1wcHRyLT5lbmQxICkgZW5kMSA9IHN0YXJ0MTsKCQkJCWVsc2UKCQkJCXsKI2lmIE1BQ0hJR0FJCgkJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCQl7CgkJCQkJCWlmKCB0bXBpbnQgPT0gdG1wcHRyLT5lbmQxICkgYnJlYWs7CgkJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQl9CgkJCQkJZW5kMSA9IChpbnQpKCBwdCAtIHNlcTFbaV0gKSAtIDE7CiNlbHNlCgkJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCQl7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAidG1waW50ID0gJWQsIGVuZDEgPSAlZCBwb3MgPSAlZFxuIiwgdG1waW50LCB0bXBwdHItPmVuZDEsIHB0LXNlcTFbaV0gKTsKCQkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+ZW5kMSApIGJyZWFrOwoJCQkJCX0KCQkJCQllbmQxID0gKGludCkoIHB0IC0gc2VxMVtpXSApIC0gMTsKI2VuZGlmCgkJCQl9CgkKCQkJCXB0ID0gc2VxMltqXTsKCQkJCXRtcGludCA9IC0xOwoJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCXsKCQkJCQlpZiggKnB0KysgIT0gJy0nICkgdG1waW50Kys7CgkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPnN0YXJ0MiApIGJyZWFrOwoJCQkJfQoJCQkJc3RhcnQyID0gKGludCkoIHB0IC0gc2VxMltqXSApIC0gMTsKCQkJCWlmKCB0bXBwdHItPnN0YXJ0MiA9PSB0bXBwdHItPmVuZDIgKSBlbmQyID0gc3RhcnQyOwoJCQkJZWxzZQoJCQkJewojaWYgTUFDSElHQUkKCQkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJCXsKCQkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPmVuZDIgKSBicmVhazsKCQkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCX0KCQkJCQllbmQyID0gKGludCkoIHB0IC0gc2VxMltqXSApIC0gMTsKI2Vsc2UKCQkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJCXsKCQkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+ZW5kMiApIGJyZWFrOwoJCQkJCX0KCQkJCQllbmQyID0gKGludCkoIHB0IC0gc2VxMltqXSApIC0gMTsKI2VuZGlmCgkJCQl9Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0YXJ0MSA9ICVkICglYyksIGVuZDEgPSAlZCAoJWMpLCBzdGFydDIgPSAlZCAoJWMpLCBlbmQyID0gJWQgKCVjKVxuIiwgc3RhcnQxLCBzZXExW2ldW3N0YXJ0MV0sIGVuZDEsIHNlcTFbaV1bZW5kMV0sIHN0YXJ0Miwgc2VxMltqXVtzdGFydDJdLCBlbmQyLCBzZXEyW2pdW2VuZDJdICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0ZXAgMFxuIiApOwoJCQkJaWYoIGVuZDEgLSBzdGFydDEgIT0gZW5kMiAtIHN0YXJ0MiApCgkJCQl7Ci8vCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJDSFVVSSEhLCBzdGFydDEgPSAlZCwgZW5kMSA9ICVkLCBzdGFydDIgPSAlZCwgZW5kMiA9ICVkXG4iLCBzdGFydDEsIGVuZDEsIHN0YXJ0MiwgZW5kMiApOwoJCQkJfQoKCQkJCWsxID0gc3RhcnQxOyBrMiA9IHN0YXJ0MjsKCQkJCXB0MSA9IHNlcTFbaV0gKyBrMTsKCQkJCXB0MiA9IHNlcTJbal0gKyBrMjsKCQkJCXdoaWxlKCAqcHQxICYmICpwdDIgKQoJCQkJewoJCQkJCWlmKCAqcHQxICE9ICctJyAmJiAqcHQyICE9ICctJyApCgkJCQkJewovLyC9xaTfpPLG873FpMukq6SxpMqkpKTopKaky8PtsNWkt6TGsryktaSkoaMKLy8JCQkJCQlpbXBtdHhbazFdW2syXSArPSB0bXBwdHItPndpbXBvcnRhbmNlICogZmFzdGF0aHJlc2hvbGQ7Ci8vCQkJCQkJaW1wbXR4W2sxXVtrMl0gKz0gdG1wcHRyLT5pbXBvcnRhbmNlICogZWZmaWo7CgkJCQkJCWltcG10eFtrMV1bazJdICs9IHRtcHB0ci0+ZmltcG9ydGFuY2UgKiBlZmZpajsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJrMT0lZCwgazI9JWQsIGltcGFsbG9jbGVuPSVkXG4iLCBrMSwgazIsIGltcGFsbG9jbGVuICk7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAibWFyaywgJWQgKCVjKSAtICVkICglYykgXG4iLCBrMSwgKnB0MSwgazIsICpwdDIgKTsKCQkJCQkJazErKzsgazIrKzsKCQkJCQkJcHQxKys7IHB0MisrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxICE9ICctJyAmJiAqcHQyID09ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsyKys7IHB0MisrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxID09ICctJyAmJiAqcHQyICE9ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsxKys7IHB0MSsrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxID09ICctJyAmJiAqcHQyID09ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsxKys7IHB0MSsrOwoJCQkJCQlrMisrOyBwdDIrKzsKCQkJCQl9CgkJCQkJaWYoIGsxID4gZW5kMSB8fCBrMiA+IGVuZDIgKSBicmVhazsKCQkJCX0KCQkJCXRtcHB0ciA9IHRtcHB0ci0+bmV4dDsKCQkJfQoJCX0KCX0KI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgImltcG10eCA9IFxuIiApOwoJZm9yKCBrMj0wOyBrMjxsZ3RoMjsgazIrKyApCgkJZnByaW50Ziggc3RkZXJyLCAiJTYuM2YgIiwgKGRvdWJsZSlrMiApOwoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Cglmb3IoIGsxPTA7IGsxPGxndGgxOyBrMSsrICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICIlZCIsIGsxICk7CgkJZm9yKCBrMj0wOyBrMjxsZ3RoMjsgazIrKyApCgkJCWZwcmludGYoIHN0ZGVyciwgIiUyLjFmICIsIGltcG10eFtrMV1bazJdICk7CgkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Cgl9CglleGl0KCAxICk7CiNlbmRpZgp9CgoKdm9pZCBwYXJ0X2ltcF9ybmFRKCBpbnQgbnNlcTEsIGludCBuc2VxMiwgY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCBkb3VibGUgKmVmZjEsIGRvdWJsZSAqZWZmMiwgUk5BcGFpciAqKipncm91cHJuYTEsIFJOQXBhaXIgKioqZ3JvdXBybmEyLCBpbnQgKmdhcG1hcDEsIGludCAqZ2FwbWFwMiwgUk5BcGFpciAqYWRkaXRpb25hbHBhaXIgKQp7Cglmb2xkcm5hKCBuc2VxMSwgbnNlcTIsIHNlcTEsIHNlcTIsIGVmZjEsIGVmZjIsIGdyb3Vwcm5hMSwgZ3JvdXBybmEyLCBpbXBtdHgsIGdhcG1hcDEsIGdhcG1hcDIsIGFkZGl0aW9uYWxwYWlyICk7Cn0KCgp2b2lkIHBhcnRfaW1wX21hdGNoX2luaXRRKCBmbG9hdCAqaW1wLCBpbnQgY2x1czEsIGludCBjbHVzMiwgaW50IGxndGgxLCBpbnQgbGd0aDIsIGNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgZG91YmxlICplZmYxLCBkb3VibGUgKmVmZjIsIExvY2FsSG9tICoqKmxvY2FsaG9tICkKewoJaW50IGRpZiwgaSwgaiwgazEsIGsyLCB0bXBpbnQsIHN0YXJ0MSwgc3RhcnQyLCBlbmQxLCBlbmQyOwoJc3RhdGljIGludCBpbXBhbGxvY2xlbiA9IDA7CgljaGFyICpwdDsKCXN0YXRpYyBjaGFyICpub2NvdW50MSA9IE5VTEw7CglzdGF0aWMgY2hhciAqbm9jb3VudDIgPSBOVUxMOwoKCWlmKCBpbXBhbGxvY2xlbiA8IGxndGgxIHx8IGltcGFsbG9jbGVuIDwgbGd0aDIgKQoJewoJCWlmKCBpbXBtdHggKSBGcmVlRmxvYXRNdHgoIGltcG10eCApOwoJCWlmKCBub2NvdW50MSApIGZyZWUoIG5vY291bnQxICk7CgkJaWYoIG5vY291bnQyICkgZnJlZSggbm9jb3VudDIgKTsKCQlpbXBhbGxvY2xlbiA9IE1BWCggbGd0aDEsIGxndGgyICkgKyAyOwoJCWltcG10eCA9IEFsbG9jYXRlRmxvYXRNdHgoIGltcGFsbG9jbGVuLCBpbXBhbGxvY2xlbiApOwoJCW5vY291bnQxID0gQWxsb2NhdGVDaGFyVmVjKCBpbXBhbGxvY2xlbiApOwoJCW5vY291bnQyID0gQWxsb2NhdGVDaGFyVmVjKCBpbXBhbGxvY2xlbiApOwoJCWltcGFsbG9jbGVuIC09IDI7Cgl9CgoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgl7CgkJZm9yKCBqPTA7IGo8Y2x1czE7IGorKyApCgkJCWlmKCBzZXExW2pdW2ldID09ICctJyApIGJyZWFrOwoJCWlmKCBqICE9IGNsdXMxICkgbm9jb3VudDFbaV0gPSAxOyAKCQllbHNlCQkJIG5vY291bnQxW2ldID0gMDsKCX0KCWZvciggaT0wOyBpPGxndGgyOyBpKysgKQoJewoJCWZvciggaj0wOyBqPGNsdXMyOyBqKysgKQoJCQlpZiggc2VxMltqXVtpXSA9PSAnLScgKSBicmVhazsKCQlpZiggaiAhPSBjbHVzMiApIG5vY291bnQyW2ldID0gMTsKCQllbHNlCQkJIG5vY291bnQyW2ldID0gMDsKCX0KCiNpZiAwCmZwcmludGYoIHN0ZGVyciwgIm5vY291bnQyID1cbiIgKTsKZm9yKCBpID0gMDsgaTxpbXBhbGxvY2xlbjsgaSsrICkKewoJZnByaW50Ziggc3RkZXJyLCAibm9jb3VudDJbJWRdID0gJWQgKCVjKVxuIiwgaSwgbm9jb3VudDJbaV0sIHNlcTJbMF1baV0gKTsKfQojZW5kaWYKCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJaW1wbXR4W2ldW2pdID0gMC4wOwoJZm9yKCBpPTA7IGk8Y2x1czE7IGkrKyApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiaSA9ICVkLCBzZXExID0gJXNcbiIsIGksIHNlcTFbaV0gKTsKCQlmb3IoIGo9MDsgajxjbHVzMjsgaisrICkKCQl7CgkJCWZwcmludGYoIHN0ZGVyciwgInN0YXJ0MSA9ICVkXG4iLCBsb2NhbGhvbVtpXVtqXS0+c3RhcnQxICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImVuZDEgICA9ICVkXG4iLCBsb2NhbGhvbVtpXVtqXS0+ZW5kMSAgICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImogPSAlZCwgc2VxMiA9ICVzXG4iLCBqLCBzZXEyW2pdICk7CgkJCXB0ID0gc2VxMVtpXTsKCQkJdG1waW50ID0gLTE7CgkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCXsKCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCWlmKCB0bXBpbnQgPT0gbG9jYWxob21baV1bal0tPnN0YXJ0MSApIGJyZWFrOwoJCQl9CgkJCXN0YXJ0MSA9IHB0IC0gc2VxMVtpXSAtIDE7CgoJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInRtcGludCA9ICVkLCBlbmQxID0gJWQgcG9zID0gJWRcbiIsIHRtcGludCwgbG9jYWxob21baV1bal0uZW5kMSwgcHQtc2VxMVtpXSApOwoJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJaWYoIHRtcGludCA9PSBsb2NhbGhvbVtpXVtqXS0+ZW5kMSApIGJyZWFrOwoJCQl9CgkJCWVuZDEgPSBwdCAtIHNlcTFbaV0gLSAxOwoKCQkJcHQgPSBzZXEyW2pdOwoJCQl0bXBpbnQgPSAtMTsKCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJewoJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJaWYoIHRtcGludCA9PSBsb2NhbGhvbVtpXVtqXS0+c3RhcnQyICkgYnJlYWs7CgkJCX0KCQkJc3RhcnQyID0gcHQgLSBzZXEyW2pdIC0gMTsKCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJewoJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJaWYoIHRtcGludCA9PSBsb2NhbGhvbVtpXVtqXS0+ZW5kMiApIGJyZWFrOwoJCQl9CgkJCWVuZDIgPSBwdCAtIHNlcTJbal0gLSAxOwovLwkJCWZwcmludGYoIHN0ZGVyciwgInN0YXJ0MSA9ICVkLCBlbmQxID0gJWQsIHN0YXJ0MiA9ICVkLCBlbmQyID0gJWRcbiIsIHN0YXJ0MSwgZW5kMSwgc3RhcnQyLCBlbmQyICk7CgkJCWsxID0gc3RhcnQxOwoJCQlrMiA9IHN0YXJ0MjsKCQkJZnByaW50Ziggc3RkZXJyLCAic3RlcCAwXG4iICk7CgkJCXdoaWxlKCBrMSA8PSBlbmQxICYmIGsyIDw9IGVuZDIgKQoJCQl7CiNpZiAwCgkJCQlpZiggIW5vY291bnQxW2sxXSAmJiAhbm9jb3VudDJbazJdICkKCQkJCQlpbXBtdHhbazFdW2syXSArPSBsb2NhbGhvbVtpXVtqXS53aW1wb3J0YW5jZSAqIGVmZjFbaV0gKiBlZmYyW2pdOwoJCQkJazErKzsgazIrKzsKI2Vsc2UKCQkJCWlmKCAhbm9jb3VudDFbazFdICYmICFub2NvdW50MltrMl0gKQoJCQkJCWltcG10eFtrMV1bazJdICs9IGxvY2FsaG9tW2ldW2pdLT53aW1wb3J0YW5jZSAqIGVmZjFbaV0gKiBlZmYyW2pdOwoJCQkJazErKzsgazIrKzsKI2VuZGlmCgkJCX0KCgkJCWRpZiA9ICggZW5kMSAtIHN0YXJ0MSApIC0gKCBlbmQyIC0gc3RhcnQyICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImRpZiA9ICVkXG4iLCBkaWYgKTsKCQkJaWYoIGRpZiA+IDAgKQoJCQl7CgkJCQlkbwoJCQkJewoJCQkJCWZwcmludGYoIHN0ZGVyciwgImRpZiA9ICVkXG4iLCBkaWYgKTsKCQkJCQlrMSA9IHN0YXJ0MTsKCQkJCQlrMiA9IHN0YXJ0MiAtIGRpZjsKCQkJCQl3aGlsZSggazEgPD0gZW5kMSAmJiBrMiA8PSBlbmQyICkKCQkJCQl7CgkJCQkJCWlmKCAwIDw9IGsyICYmIHN0YXJ0MiA8PSBrMiAmJiAhbm9jb3VudDFbazFdICYmICFub2NvdW50MltrMl0gKQoJCQkJCQkJaW1wbXR4W2sxXVtrMl0gPSBsb2NhbGhvbVtpXVtqXS0+d2ltcG9ydGFuY2UgKiBlZmYxW2ldICogZWZmMltqXTsKCQkJCQkJazErKzsgazIrKzsKCQkJCQl9CgkJCQl9CgkJCQl3aGlsZSggZGlmLS0gKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRvCgkJCQl7CgkJCQkJazEgPSBzdGFydDEgKyBkaWY7CgkJCQkJazIgPSBzdGFydDI7CgkJCQkJd2hpbGUoIGsxIDw9IGVuZDEgKQoJCQkJCXsKCQkJCQkJaWYoIGsxID49IDAgJiYgazEgPj0gc3RhcnQxICYmICFub2NvdW50MVtrMV0gJiYgIW5vY291bnQyW2syXSApCgkJCQkJCQlpbXBtdHhbazFdW2syXSA9IGxvY2FsaG9tW2ldW2pdLT53aW1wb3J0YW5jZSAqIGVmZjFbaV0gKiBlZmYyW2pdOwoJCQkJCQlrMSsrOyBrMisrOwoJCQkJCX0KCQkJCX0KCQkJCXdoaWxlKCBkaWYrKyApOwoJCQl9CgkJfQoJfQojaWYgMAoJZnByaW50Ziggc3RkZXJyLCAiaW1wbXR4ID0gXG4iICk7Cglmb3IoIGsyPTA7IGsyPGxndGgyOyBrMisrICkKCQlmcHJpbnRmKCBzdGRlcnIsICIlNi4zZiAiLCAoZG91YmxlKWsyICk7CglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZvciggazE9MDsgazE8bGd0aDE7IGsxKysgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIiVkIiwgazEgKTsKCQlmb3IoIGsyPTA7IGsyPGxndGgyOyBrMisrICkKCQkJZnByaW50Ziggc3RkZXJyLCAiJTYuM2YgIiwgaW1wbXR4W2sxXVtrMl0gKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCX0KCWV4aXQoIDEgKTsKI2VuZGlmCn0KCnN0YXRpYyB2b2lkIG1hdGNoX2NhbGMoIGZsb2F0ICptYXRjaCwgZmxvYXQgKipjcG14MSwgZmxvYXQgKipjcG14MiwgaW50IGkxLCBpbnQgbGd0aDIsIGZsb2F0ICoqZmxvYXR3b3JrLCBpbnQgKippbnR3b3JrLCBpbnQgaW5pdGlhbGl6ZSApCnsKI2lmIEZBU1RNQVRDSENBTEMKCWludCBqLCBsOwoJZmxvYXQgc2NhcnJbMjZdOwoJZmxvYXQgKipjcG14cGQgPSBmbG9hdHdvcms7CglpbnQgKipjcG14cGRuID0gaW50d29yazsKCWZsb2F0ICptYXRjaHB0LCAqY3BteHBkcHQsICoqY3BteHBkcHRwdDsKCWludCAqY3BteHBkbnB0LCAqKmNwbXhwZG5wdHB0OwoJaWYoIGluaXRpYWxpemUgKQoJewoJCWludCBjb3VudCA9IDA7CgkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJewoJCQljb3VudCA9IDA7CgkJCWZvciggbD0wOyBsPDI2OyBsKysgKQoJCQl7CgkJCQlpZiggY3BteDJbbF1bal0gKQoJCQkJewoJCQkJCWNwbXhwZFtqXVtjb3VudF0gPSBjcG14MltsXVtqXTsKCQkJCQljcG14cGRuW2pdW2NvdW50XSA9IGw7CgkJCQkJY291bnQrKzsKCQkJCX0KCQkJfQoJCQljcG14cGRuW2pdW2NvdW50XSA9IC0xOwoJCX0KCX0KCgl7CgkJZm9yKCBsPTA7IGw8MjY7IGwrKyApCgkJewoJCQlzY2FycltsXSA9IDAuMDsKCQkJZm9yKCBqPTA7IGo8MjY7IGorKyApCi8vCQkJCXNjYXJyW2xdICs9IG5fZGlzW2pdW2xdICogY3BteDFbal1baTFdOwoJCQkJc2NhcnJbbF0gKz0gbl9kaXNfY29uc3dlaWdodF9tdWx0aVtqXVtsXSAqIGNwbXgxW2pdW2kxXTsKCQl9CgkJbWF0Y2hwdCA9IG1hdGNoOwoJCWNwbXhwZG5wdHB0ID0gY3BteHBkbjsKCQljcG14cGRwdHB0ID0gY3BteHBkOwoJCXdoaWxlKCBsZ3RoMi0tICkKCQl7CgkJCSptYXRjaHB0ID0gMC4wOwoJCQljcG14cGRucHQgPSAqY3BteHBkbnB0cHQrKzsKCQkJY3BteHBkcHQgPSAqY3BteHBkcHRwdCsrOwoJCQl3aGlsZSggKmNwbXhwZG5wdD4tMSApCgkJCQkqbWF0Y2hwdCArPSBzY2FyclsqY3BteHBkbnB0KytdICogKmNwbXhwZHB0Kys7CgkJCW1hdGNocHQrKzsKCQl9IAoJfQojZWxzZQoJaW50IGosIGssIGw7CglmbG9hdCBzY2FyclsyNl07CglmbG9hdCAqKmNwbXhwZCA9IGZsb2F0d29yazsKCWludCAqKmNwbXhwZG4gPSBpbnR3b3JrOwoJLy8gc2ltcGxlCglpZiggaW5pdGlhbGl6ZSApCgl7CgkJaW50IGNvdW50ID0gMDsKCQlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQl7CgkJCWNvdW50ID0gMDsKCQkJZm9yKCBsPTA7IGw8MjY7IGwrKyApCgkJCXsKCQkJCWlmKCBjcG14MltsXVtqXSApCgkJCQl7CgkJCQkJY3BteHBkW2NvdW50XVtqXSA9IGNwbXgyW2xdW2pdOwoJCQkJCWNwbXhwZG5bY291bnRdW2pdID0gbDsKCQkJCQljb3VudCsrOwoJCQkJfQoJCQl9CgkJCWNwbXhwZG5bY291bnRdW2pdID0gLTE7CgkJfQoJfQoJZm9yKCBsPTA7IGw8MjY7IGwrKyApCgl7CgkJc2NhcnJbbF0gPSAwLjA7CgkJZm9yKCBrPTA7IGs8MjY7IGsrKyApCi8vCQkJc2NhcnJbbF0gKz0gbl9kaXNba11bbF0gKiBjcG14MVtrXVtpMV07CgkJCXNjYXJyW2xdICs9IG5fZGlzX2NvbnN3ZWlnaHRfbXVsdGlba11bbF0gKiBjcG14MVtrXVtpMV07Cgl9Cglmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCXsKCQltYXRjaFtqXSA9IDAuMDsKCQlmb3IoIGs9MDsgY3BteHBkbltrXVtqXT4tMTsgaysrICkKCQkJbWF0Y2hbal0gKz0gc2NhcnJbY3BteHBkbltrXVtqXV0gKiBjcG14cGRba11bal07Cgl9IAojZW5kaWYKfQoKc3RhdGljIHZvaWQgQXRyYWNraW5nX2xvY2FsaG9tKCBmbG9hdCAqaW1wd21wdCwgZmxvYXQgKmxhc3Rob3Jpem9udGFsdywgZmxvYXQgKmxhc3R2ZXJ0aWNhbHcsIAoJCQkJCQljaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgKippanAsIGludCBpY3ljLCBpbnQgamN5YywKCQkJCQkJaW50IHN0YXJ0MSwgaW50IGVuZDEsIGludCBzdGFydDIsIGludCBlbmQyLAoJCQkJCQlpbnQgKmdhcG1hcDEsIGludCAqZ2FwbWFwMiApCnsKCWludCBpLCBqLCBsLCBpaW4sIGppbiwgaWZpLCBqZmksIGxndGgxLCBsZ3RoMiwgazsKCWNoYXIgZ2FwW10gPSAiLSI7CglmbG9hdCB3bTsKCWxndGgxID0gc3RybGVuKCBzZXExWzBdICk7CglsZ3RoMiA9IHN0cmxlbiggc2VxMlswXSApOwoKI2lmIDAKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJsYXN0dmVydGljYWx3WyVkXSA9ICVmXG4iLCBpLCBsYXN0dmVydGljYWx3W2ldICk7Cgl9CiNlbmRpZgogCglpZiggb3V0Z2FwID09IDEgKQoJCTsKCWVsc2UKCXsKCQl3bSA9IGxhc3R2ZXJ0aWNhbHdbMF07CgkJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgkJewoJCQlpZiggbGFzdHZlcnRpY2Fsd1tpXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdHZlcnRpY2Fsd1tpXTsKCQkJCWlpbiA9IGk7IGppbiA9IGxndGgyLTE7CgkJCQlpanBbbGd0aDFdW2xndGgyXSA9ICsoIGxndGgxIC0gaSApOwoJCQl9CgkJfQoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJaWYoIGxhc3Rob3Jpem9udGFsd1tqXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdGhvcml6b250YWx3W2pdOwoJCQkJaWluID0gbGd0aDEtMTsgamluID0gajsKCQkJCWlqcFtsZ3RoMV1bbGd0aDJdID0gLSggbGd0aDIgLSBqICk7CgkJCX0KCQl9Cgl9CgogICAgZm9yKCBpPTA7IGk8bGd0aDErMTsgaSsrICkgCiAgICB7CiAgICAgICAgaWpwW2ldWzBdID0gaSArIDE7CiAgICB9CiAgICBmb3IoIGo9MDsgajxsZ3RoMisxOyBqKysgKSAKICAgIHsKICAgICAgICBpanBbMF1bal0gPSAtKCBqICsgMSApOwogICAgfQoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgl7CgkJbXNlcTFbaV0gKz0gbGd0aDErbGd0aDI7CgkJKm1zZXExW2ldID0gMDsKCX0KCWZvciggaj0wOyBqPGpjeWM7IGorKyApCgl7CgkJbXNlcTJbal0gKz0gbGd0aDErbGd0aDI7CgkJKm1zZXEyW2pdID0gMDsKCX0KCWlpbiA9IGxndGgxOyBqaW4gPSBsZ3RoMjsKCSppbXB3bXB0ID0gMC4wOwoJZm9yKCBrPTA7IGs8PWxndGgxK2xndGgyOyBrKysgKSAKCXsKCQlpZiggaWpwW2lpbl1bamluXSA8IDAgKSAKCQl7CgkJCWlmaSA9IGlpbi0xOyBqZmkgPSBqaW4raWpwW2lpbl1bamluXTsKCQl9CgkJZWxzZSBpZiggaWpwW2lpbl1bamluXSA+IDAgKQoJCXsKCQkJaWZpID0gaWluLWlqcFtpaW5dW2ppbl07IGpmaSA9IGppbi0xOwoJCX0KCQllbHNlCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluLTE7CgkJfQoJCWwgPSBpaW4gLSBpZmk7CgkJd2hpbGUoIC0tbCApIAoJCXsKCQkJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkKCQkJCSotLW1zZXExW2ldID0gc2VxMVtpXVtpZmkrbF07CgkJCWZvciggaj0wOyBqPGpjeWM7IGorKyApIAoJCQkJKi0tbXNlcTJbal0gPSAqZ2FwOwoJCQlrKys7CgkJfQoJCWw9IGppbiAtIGpmaTsKCQl3aGlsZSggLS1sICkKCQl7CgkJCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJCQkJKi0tbXNlcTFbaV0gPSAqZ2FwOwoJCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKSAKCQkJCSotLW1zZXEyW2pdID0gc2VxMltqXVtqZmkrbF07CgkJCWsrKzsKCQl9CgkJaWYoIGlpbiAhPSBsZ3RoMSAmJiBqaW4gIT0gbGd0aDIgKSAvLyA/PwoJCXsKCQkJKmltcHdtcHQgKz0gcGFydF9pbXBfbWF0Y2hfb3V0X3NjUSggZ2FwbWFwMVtpaW5dK3N0YXJ0MSwgZ2FwbWFwMltqaW5dK3N0YXJ0MiApOwovLwkJCWZwcmludGYoIHN0ZGVyciwgImltcHdtID0gJWYgKGlpbj0lZCwgamluPSVkKSBzZXExPSVjLCBzZXEyPSVjXG4iLCAqaW1wd21wdCwgaWluLCBqaW4sIHNlcTFbMF1baWluXSwgc2VxMlswXVtqaW5dICk7CgkJfQoJCWlmKCBpaW4gPD0gMCB8fCBqaW4gPD0gMCApIGJyZWFrOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJCQkqLS1tc2VxMVtpXSA9IHNlcTFbaV1baWZpXTsKCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKSAKCQkJKi0tbXNlcTJbal0gPSBzZXEyW2pdW2pmaV07CgkJaysrOwoJCWlpbiA9IGlmaTsgamluID0gamZpOwoJfQp9CnN0YXRpYyBmbG9hdCBBdHJhY2tpbmcoIGZsb2F0ICpsYXN0aG9yaXpvbnRhbHcsIGZsb2F0ICpsYXN0dmVydGljYWx3LCAKCQkJCQkJY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCAKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKm1zZXExLCBjaGFyICoqbXNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKmNwbXgxLCBmbG9hdCAqKmNwbXgyLCAKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICoqaWpwLCBpbnQgaWN5YywgaW50IGpjeWMgKQp7CglpbnQgaSwgaiwgbCwgaWluLCBqaW4sIGlmaSwgamZpLCBsZ3RoMSwgbGd0aDIsIGssIGxhc3RrOwoJY2hhciBnYXBbXSA9ICItIjsKCWZsb2F0IHdtID0gMC4wOwoJbGd0aDEgPSBzdHJsZW4oIHNlcTFbMF0gKTsKCWxndGgyID0gc3RybGVuKCBzZXEyWzBdICk7CgojaWYgMAoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCWZwcmludGYoIHN0ZGVyciwgImxhc3R2ZXJ0aWNhbHdbJWRdID0gJWZcbiIsIGksIGxhc3R2ZXJ0aWNhbHdbaV0gKTsKCX0KI2VuZGlmCiAKCWlmKCBvdXRnYXAgPT0gMSApCgkJOwoJZWxzZQoJewoJCXdtID0gbGFzdHZlcnRpY2Fsd1swXTsKCQlmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKCQl7CgkJCWlmKCBsYXN0dmVydGljYWx3W2ldID49IHdtICkKCQkJewoJCQkJd20gPSBsYXN0dmVydGljYWx3W2ldOwoJCQkJaWluID0gaTsgamluID0gbGd0aDItMTsKCQkJCWlqcFtsZ3RoMV1bbGd0aDJdID0gKyggbGd0aDEgLSBpICk7CgkJCX0KCQl9CgkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJewoJCQlpZiggbGFzdGhvcml6b250YWx3W2pdID49IHdtICkKCQkJewoJCQkJd20gPSBsYXN0aG9yaXpvbnRhbHdbal07CgkJCQlpaW4gPSBsZ3RoMS0xOyBqaW4gPSBqOwoJCQkJaWpwW2xndGgxXVtsZ3RoMl0gPSAtKCBsZ3RoMiAtIGogKTsKCQkJfQoJCX0KCX0KCiAgICBmb3IoIGk9MDsgaTxsZ3RoMSsxOyBpKysgKSAKICAgIHsKICAgICAgICBpanBbaV1bMF0gPSBpICsgMTsKICAgIH0KICAgIGZvciggaj0wOyBqPGxndGgyKzE7IGorKyApIAogICAgewogICAgICAgIGlqcFswXVtqXSA9IC0oIGogKyAxICk7CiAgICB9CgoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkKCXsKCQltc2VxMVtpXSArPSBsZ3RoMStsZ3RoMjsKCQkqbXNlcTFbaV0gPSAwOwoJfQoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkKCXsKCQltc2VxMltqXSArPSBsZ3RoMStsZ3RoMjsKCQkqbXNlcTJbal0gPSAwOwoJfQoJaWluID0gbGd0aDE7IGppbiA9IGxndGgyOwoJbGFzdGsgPSBsZ3RoMStsZ3RoMjsKCWZvciggaz0wOyBrPD1sYXN0azsgaysrICkgCgl7CgkJaWYoIGlqcFtpaW5dW2ppbl0gPCAwICkgCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluK2lqcFtpaW5dW2ppbl07CgkJfQoJCWVsc2UgaWYoIGlqcFtpaW5dW2ppbl0gPiAwICkKCQl7CgkJCWlmaSA9IGlpbi1panBbaWluXVtqaW5dOyBqZmkgPSBqaW4tMTsKCQl9CgkJZWxzZQoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbi0xOwoJCX0KCQlsID0gaWluIC0gaWZpOwoJCXdoaWxlKCAtLWwgKSAKCQl7CgkJCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgkJCQkqLS1tc2VxMVtpXSA9IHNlcTFbaV1baWZpK2xdOwoJCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKSAKCQkJCSotLW1zZXEyW2pdID0gKmdhcDsKCQkJaysrOwoJCX0KCQlsPSBqaW4gLSBqZmk7CgkJd2hpbGUoIC0tbCApCgkJewoJCQlmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSAKCQkJCSotLW1zZXExW2ldID0gKmdhcDsKCQkJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgCgkJCQkqLS1tc2VxMltqXSA9IHNlcTJbal1bamZpK2xdOwoJCQlrKys7CgkJfQoJCWlmKCBpaW4gPD0gMCB8fCBqaW4gPD0gMCApIGJyZWFrOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJCQkqLS1tc2VxMVtpXSA9IHNlcTFbaV1baWZpXTsKCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKSAKCQkJKi0tbXNlcTJbal0gPSBzZXEyW2pdW2pmaV07CgkJaysrOwoJCWlpbiA9IGlmaTsgamluID0gamZpOwoJfQoJcmV0dXJuKCAwLjAgKTsKfQoKZmxvYXQgcGFydFFfX2FsaWduKCBjaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIGRvdWJsZSAqZWZmMSwgZG91YmxlICplZmYyLCBpbnQgaWN5YywgaW50IGpjeWMsIGludCBhbGxvY2xlbiwgTG9jYWxIb20gKioqbG9jYWxob20sIGZsb2F0ICppbXBtYXRjaCwgaW50IHN0YXJ0MSwgaW50IGVuZDEsIGludCBzdGFydDIsIGludCBlbmQyLCBpbnQgKmdhcG1hcDEsIGludCAqZ2FwbWFwMiwgY2hhciAqc2dhcDEsIGNoYXIgKnNnYXAyLCBjaGFyICplZ2FwMSwgY2hhciAqZWdhcDIgKQovKiBzY29yZSBubyBrZWlzYW4gbm8gc2FpIG1vdG9rYXJhYXJ1IGdhcCBubyBhdHVrYWkgbmkgbW9uZGFpIGdhIGFydSAqLwp7Ci8vCWludCBrOwoJcmVnaXN0ZXIgaW50IGksIGo7CglpbnQgbGFzdGksIGxhc3RqOyAvKiBvdXRnYXAgPT0gMCAtPiBsZ3RoMSwgb3V0Z2FwID09IDEgLT4gbGd0aDErMSAqLwoJaW50IGxndGgxLCBsZ3RoMjsKCWludCByZXN1bHRsZW47CglmbG9hdCB3bSA9IDAuMDsgICAvKiBpbnQgPz8/Pz8/ICovCglmbG9hdCBnOwoJZmxvYXQgKmN1cnJlbnR3LCAqcHJldmlvdXN3OwojaWYgMQoJZmxvYXQgKnd0bXA7CglpbnQgKmlqcHB0OwoJZmxvYXQgKm1qcHQsICpwcmVwdCwgKmN1cnB0OwoJaW50ICptcGpwdDsKI2VuZGlmCglzdGF0aWMgZmxvYXQgbWksICptOwoJc3RhdGljIGludCAqKmlqcDsKCXN0YXRpYyBpbnQgbXBpLCAqbXA7CglzdGF0aWMgZmxvYXQgKncxLCAqdzI7CglzdGF0aWMgZmxvYXQgKm1hdGNoOwoJc3RhdGljIGZsb2F0ICppbml0dmVydGljYWx3OyAgICAvKiBrdWZ1dSBzdXJlYmEgaXJhbmFpICovCglzdGF0aWMgZmxvYXQgKmxhc3R2ZXJ0aWNhbHc7ICAgIC8qIGt1ZnV1IHN1cmViYSBpcmFuYWkgKi8KCXN0YXRpYyBjaGFyICoqbXNlcTE7CglzdGF0aWMgY2hhciAqKm1zZXEyOwoJc3RhdGljIGNoYXIgKiptc2VxOwoJc3RhdGljIGZsb2F0ICpkaWdmMTsgCglzdGF0aWMgZmxvYXQgKmRpZ2YyOyAKCXN0YXRpYyBmbG9hdCAqZGlhZjE7IAoJc3RhdGljIGZsb2F0ICpkaWFmMjsgCglzdGF0aWMgZmxvYXQgKmdhcHoxOyAKCXN0YXRpYyBmbG9hdCAqZ2FwejI7IAoJc3RhdGljIGZsb2F0ICpnYXBmMTsgCglzdGF0aWMgZmxvYXQgKmdhcGYyOyAKCXN0YXRpYyBmbG9hdCAqb2djcDFnOwoJc3RhdGljIGZsb2F0ICpvZ2NwMmc7CglzdGF0aWMgZmxvYXQgKmZnY3AxZzsKCXN0YXRpYyBmbG9hdCAqZmdjcDJnOwoJc3RhdGljIGZsb2F0ICpvZ19oX2RnX24xX3A7CglzdGF0aWMgZmxvYXQgKm9nX2hfZGdfbjJfcDsKCXN0YXRpYyBmbG9hdCAqZmdfaF9kZ19uMV9wOwoJc3RhdGljIGZsb2F0ICpmZ19oX2RnX24yX3A7CglzdGF0aWMgZmxvYXQgKm9nX3RfZmdfaF9kZ19uMV9wOwoJc3RhdGljIGZsb2F0ICpvZ190X2ZnX2hfZGdfbjJfcDsKCXN0YXRpYyBmbG9hdCAqZmdfdF9vZ19oX2RnX24xX3A7CglzdGF0aWMgZmxvYXQgKmZnX3Rfb2dfaF9kZ19uMl9wOwoJc3RhdGljIGZsb2F0ICpnYXB6X24xOwoJc3RhdGljIGZsb2F0ICpnYXB6X24yOwoJc3RhdGljIGZsb2F0ICoqY3BteDE7CglzdGF0aWMgZmxvYXQgKipjcG14MjsKCXN0YXRpYyBpbnQgKippbnR3b3JrOwoJc3RhdGljIGZsb2F0ICoqZmxvYXR3b3JrOwoJc3RhdGljIGludCBvcmxndGgxID0gMCwgb3JsZ3RoMiA9IDA7CglmbG9hdCBmcGVuYWx0eSA9IChmbG9hdClwZW5hbHR5OwojaWYgVVNFX1BFTkFMVFlfRVgKCWZsb2F0IGZwZW5hbHR5X2V4ID0gKGZsb2F0KXBlbmFsdHlfZXg7CiNlbmRpZgoJZmxvYXQgdG1wcGVuYWw7CglmbG9hdCAqZmdfdF9vZ19oX2RnX24yX3BfcHQ7CglmbG9hdCAqb2dfdF9mZ19oX2RnX24yX3BfcHQ7CglmbG9hdCAqb2dfaF9kZ19uMl9wX3B0OwoJZmxvYXQgKmZnX2hfZGdfbjJfcF9wdDsKCWZsb2F0ICpnYXB6X24yX3B0MDsKCWZsb2F0ICpnYXB6X24yX3B0MTsKCWZsb2F0ICpmZ2NwMnB0OwoJZmxvYXQgKm9nY3AycHQ7CglmbG9hdCBmZ190X29nX2hfZGdfbjFfcF92YTsKCWZsb2F0IG9nX3RfZmdfaF9kZ19uMV9wX3ZhOwoJZmxvYXQgb2dfaF9kZ19uMV9wX3ZhOwoJZmxvYXQgZmdfaF9kZ19uMV9wX3ZhOwoJZmxvYXQgZ2Fwel9uMV92YTA7CglmbG9hdCBnYXB6X24xX3ZhMTsKCWZsb2F0IGZnY3AxdmE7CglmbG9hdCBvZ2NwMXZhOwoKCgojaWYgMAoJZnByaW50Ziggc3RkZXJyLCAiZWZmIGluIFNBKysrYWxpZ25cbiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIGZwcmludGYoIHN0ZGVyciwgImVmZjFbJWRdID0gJWZcbiIsIGksIGVmZjFbaV0gKTsKI2VuZGlmCglpZiggb3JsZ3RoMSA9PSAwICkKCXsKCQltc2VxMSA9IEFsbG9jYXRlQ2hhck10eCggbmpvYiwgMCApOwoJCW1zZXEyID0gQWxsb2NhdGVDaGFyTXR4KCBuam9iLCAwICk7Cgl9CgoKCWxndGgxID0gc3RybGVuKCBzZXExWzBdICk7CglsZ3RoMiA9IHN0cmxlbiggc2VxMlswXSApOwoKCWlmKCBsZ3RoMSA+IG9ybGd0aDEgfHwgbGd0aDIgPiBvcmxndGgyICkKCXsKCQlpbnQgbGwxLCBsbDI7CgoJCWlmKCBvcmxndGgxID4gMCAmJiBvcmxndGgyID4gMCApCgkJewoJCQlGcmVlRmxvYXRWZWMoIHcxICk7CgkJCUZyZWVGbG9hdFZlYyggdzIgKTsKCQkJRnJlZUZsb2F0VmVjKCBtYXRjaCApOwoJCQlGcmVlRmxvYXRWZWMoIGluaXR2ZXJ0aWNhbHcgKTsKCQkJRnJlZUZsb2F0VmVjKCBsYXN0dmVydGljYWx3ICk7CgoJCQlGcmVlRmxvYXRWZWMoIG0gKTsKCQkJRnJlZUludFZlYyggbXAgKTsKCgkJCUZyZWVDaGFyTXR4KCBtc2VxICk7CgoJCQlGcmVlRmxvYXRWZWMoIGRpZ2YxICk7CgkJCUZyZWVGbG9hdFZlYyggZGlnZjIgKTsKCQkJRnJlZUZsb2F0VmVjKCBkaWFmMSApOwoJCQlGcmVlRmxvYXRWZWMoIGRpYWYyICk7CgkJCUZyZWVGbG9hdFZlYyggZ2FwejEgKTsKCQkJRnJlZUZsb2F0VmVjKCBnYXB6MiApOwoJCQlGcmVlRmxvYXRWZWMoIGdhcGYxICk7CgkJCUZyZWVGbG9hdFZlYyggZ2FwZjIgKTsKCQkJRnJlZUZsb2F0VmVjKCBvZ2NwMWcgKTsKCQkJRnJlZUZsb2F0VmVjKCBvZ2NwMmcgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ2NwMWcgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ2NwMmcgKTsKCQkJRnJlZUZsb2F0VmVjKCBvZ19oX2RnX24xX3AgKTsKCQkJRnJlZUZsb2F0VmVjKCBvZ19oX2RnX24yX3AgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ19oX2RnX24xX3AgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ19oX2RnX24yX3AgKTsKCQkJRnJlZUZsb2F0VmVjKCBvZ190X2ZnX2hfZGdfbjFfcCApOwoJCQlGcmVlRmxvYXRWZWMoIG9nX3RfZmdfaF9kZ19uMl9wICk7CgkJCUZyZWVGbG9hdFZlYyggZmdfdF9vZ19oX2RnX24xX3AgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ190X29nX2hfZGdfbjJfcCApOwoJCQlGcmVlRmxvYXRWZWMoIGdhcHpfbjEgKTsKCQkJRnJlZUZsb2F0VmVjKCBnYXB6X24yICk7CgoJCQlGcmVlRmxvYXRNdHgoIGNwbXgxICk7CgkJCUZyZWVGbG9hdE10eCggY3BteDIgKTsKCgkJCUZyZWVGbG9hdE10eCggZmxvYXR3b3JrICk7CgkJCUZyZWVJbnRNdHgoIGludHdvcmsgKTsKCQl9CgoJCWxsMSA9IE1BWCggKGludCkoMS4zKmxndGgxKSwgb3JsZ3RoMSApICsgMTAwOwoJCWxsMiA9IE1BWCggKGludCkoMS4zKmxndGgyKSwgb3JsZ3RoMiApICsgMTAwOwoKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAiXG50cnlpbmcgdG8gYWxsb2NhdGUgKCVkKyVkKXhuIG1hdHJpY2VzIC4uLiAiLCBsbDEsIGxsMiApOwojZW5kaWYKCgkJdzEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCXcyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQltYXRjaCA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgoJCWluaXR2ZXJ0aWNhbHcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWxhc3R2ZXJ0aWNhbHcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoKCQltID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQltcCA9IEFsbG9jYXRlSW50VmVjKCBsbDIrMiApOwoKCQltc2VxID0gQWxsb2NhdGVDaGFyTXR4KCBuam9iLCBsbDErbGwyICk7CgoJCWRpZ2YxID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlkaWdmMiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJZGlhZjEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWRpYWYyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlnYXB6MSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZ2FwejIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCWdhcGYxID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlnYXBmMiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJb2djcDFnID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlvZ2NwMmcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCWZnY3AxZyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZmdjcDJnID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlvZ19oX2RnX24xX3AgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDEgKyAyICk7CgkJb2dfaF9kZ19uMl9wID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyICsgMiApOwoJCWZnX2hfZGdfbjFfcCA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSArIDIgKTsKCQlmZ19oX2RnX24yX3AgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIgKyAyICk7CgkJb2dfdF9mZ19oX2RnX24xX3AgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDEgKyAyICk7CgkJb2dfdF9mZ19oX2RnX24yX3AgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIgKyAyICk7CgkJZmdfdF9vZ19oX2RnX24xX3AgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDEgKyAyICk7CgkJZmdfdF9vZ19oX2RnX24yX3AgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIgKyAyICk7CgkJZ2Fwel9uMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZ2Fwel9uMiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgoJCWNwbXgxID0gQWxsb2NhdGVGbG9hdE10eCggMjYsIGxsMSsyICk7CgkJY3BteDIgPSBBbGxvY2F0ZUZsb2F0TXR4KCAyNiwgbGwyKzIgKTsKCiNpZiBGQVNUTUFUQ0hDQUxDCgkJZmxvYXR3b3JrID0gQWxsb2NhdGVGbG9hdE10eCggTUFYKCBsbDEsIGxsMiApKzIsIDI2ICk7IAoJCWludHdvcmsgPSBBbGxvY2F0ZUludE10eCggTUFYKCBsbDEsIGxsMiApKzIsIDI2ICk7IAojZWxzZQoJCWZsb2F0d29yayA9IEFsbG9jYXRlRmxvYXRNdHgoIDI2LCBNQVgoIGxsMSwgbGwyICkrMiApOyAKCQlpbnR3b3JrID0gQWxsb2NhdGVJbnRNdHgoIDI2LCBNQVgoIGxsMSwgbGwyICkrMiApOyAKI2VuZGlmCgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJzdWNjZWVkZWRcbiIgKTsKI2VuZGlmCgoJCW9ybGd0aDEgPSBsbDEgLSAxMDA7CgkJb3JsZ3RoMiA9IGxsMiAtIDEwMDsKCX0KCgoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgbXNlcTFbaV0gPSBtc2VxW2ldOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgbXNlcTJbal0gPSBtc2VxW2ljeWMral07CgoKCWlmKCBvcmxndGgxID4gY29tbW9uQWxsb2MxIHx8IG9ybGd0aDIgPiBjb21tb25BbGxvYzIgKQoJewoJCWludCBsbDEsIGxsMjsKCgkJaWYoIGNvbW1vbkFsbG9jMSAmJiBjb21tb25BbGxvYzIgKQoJCXsKCQkJRnJlZUludE10eCggY29tbW9uSVAgKTsKCQl9CgoJCWxsMSA9IE1BWCggb3JsZ3RoMSwgY29tbW9uQWxsb2MxICk7CgkJbGwyID0gTUFYKCBvcmxndGgyLCBjb21tb25BbGxvYzIgKTsKCiNpZiBERUJVRwoJCWZwcmludGYoIHN0ZGVyciwgIlxuXG50cnlpbmcgdG8gYWxsb2NhdGUgJWR4JWQgbWF0cmljZXMgLi4uICIsIGxsMSsxLCBsbDIrMSApOwojZW5kaWYKCgkJY29tbW9uSVAgPSBBbGxvY2F0ZUludE10eCggbGwxKzEwLCBsbDIrMTAgKTsKCiNpZiBERUJVRwoJCWZwcmludGYoIHN0ZGVyciwgInN1Y2NlZWRlZFxuXG4iICk7CiNlbmRpZgoKCQljb21tb25BbGxvYzEgPSBsbDE7CgkJY29tbW9uQWxsb2MyID0gbGwyOwoJfQoJaWpwID0gY29tbW9uSVA7CgoJY3BteF9jYWxjX25ldyggc2VxMSwgY3BteDEsIGVmZjEsIGxndGgxLCBpY3ljICk7CgljcG14X2NhbGNfbmV3KCBzZXEyLCBjcG14MiwgZWZmMiwgbGd0aDIsIGpjeWMgKTsKCglpZiggc2dhcDEgKQoJewoJCW5ld19PcGVuaW5nR2FwQ291bnRfenVyZSggb2djcDFnLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSwgc2dhcDEsIGVnYXAxICk7CgkJbmV3X09wZW5pbmdHYXBDb3VudF96dXJlKCBvZ2NwMmcsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMiwgZWdhcDIgKTsKCQluZXdfRmluYWxHYXBDb3VudF96dXJlKCBmZ2NwMWcsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxLCBzZ2FwMSwgZWdhcDEgKTsKCQluZXdfRmluYWxHYXBDb3VudF96dXJlKCBmZ2NwMmcsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMiwgZWdhcDIgKTsKCQlnZXRkaWdhcGZyZXFfcGFydCggZGlnZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxLCBzZ2FwMSwgZWdhcDEgKTsKCQlnZXRkaWdhcGZyZXFfcGFydCggZGlnZjIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMiwgZWdhcDIgKTsKCQlnZXRkaWFtaW5vZnJlcV9wYXJ0KCBkaWFmMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIHNnYXAxLCBlZ2FwMSApOwoJCWdldGRpYW1pbm9mcmVxX3BhcnQoIGRpYWYyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgc2dhcDIsIGVnYXAyICk7CgkJZ2V0Z2FwZnJlcSggZ2FwZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJZ2V0Z2FwZnJlcSggZ2FwZjIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJZ2V0Z2FwZnJlcV96dXJlX3BhcnQoIGdhcHoxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSwgc2dhcDEgKTsKCQlnZXRnYXBmcmVxX3p1cmVfcGFydCggZ2FwejIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMSApOwoJfQoJZWxzZQoJewoJCXN0X09wZW5pbmdHYXBDb3VudCggb2djcDFnLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCXN0X09wZW5pbmdHYXBDb3VudCggb2djcDJnLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJCXN0X0ZpbmFsR2FwQ291bnRfenVyZSggZmdjcDFnLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCXN0X0ZpbmFsR2FwQ291bnRfenVyZSggZmdjcDJnLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJCWdldGRpZ2FwZnJlcV9zdCggZGlnZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJZ2V0ZGlnYXBmcmVxX3N0KCBkaWdmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlnZXRkaWFtaW5vZnJlcV94KCBkaWFmMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlnZXRkaWFtaW5vZnJlcV94KCBkaWFmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlnZXRnYXBmcmVxKCBnYXBmMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlnZXRnYXBmcmVxKCBnYXBmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlnZXRnYXBmcmVxX3p1cmUoIGdhcHoxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCWdldGdhcGZyZXFfenVyZSggZ2FwejIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7Cgl9CgojaWYgMQoJbGFzdGogPSBsZ3RoMisyOwoJZm9yKCBpPTA7IGk8bGFzdGo7IGkrKyApCgl7CgkJb2dfaF9kZ19uMl9wW2ldID0gKCAxLjAtb2djcDJnW2ldLWRpZ2YyW2ldICkgKiBmcGVuYWx0eSAqIDAuNTsKCQlmZ19oX2RnX24yX3BbaV0gPSAoIDEuMC1mZ2NwMmdbaV0tZGlnZjJbaV0gKSAqIGZwZW5hbHR5ICogMC41OwoJCW9nX3RfZmdfaF9kZ19uMl9wW2ldID0gKDEuMC1vZ2NwMmdbaV0rZmdjcDJnW2ldLWRpZ2YyW2ldKSAqIDAuNSAqIGZwZW5hbHR5OwoJCWZnX3Rfb2dfaF9kZ19uMl9wW2ldID0gKDEuMC1mZ2NwMmdbaV0rb2djcDJnW2ldLWRpZ2YyW2ldKSAqIDAuNSAqIGZwZW5hbHR5OwoJCWdhcHpfbjJbaV0gPSAoMS4wLWdhcHoyW2ldKTsKCX0KCWxhc3RqID0gbGd0aDErMjsKCWZvciggaT0wOyBpPGxhc3RqOyBpKysgKQoJewoJCW9nX2hfZGdfbjFfcFtpXSA9ICggMS4wLW9nY3AxZ1tpXS1kaWdmMVtpXSApICogZnBlbmFsdHkgKiAwLjU7CgkJZmdfaF9kZ19uMV9wW2ldID0gKCAxLjAtZmdjcDFnW2ldLWRpZ2YxW2ldICkgKiBmcGVuYWx0eSAqIDAuNTsKCQlvZ190X2ZnX2hfZGdfbjFfcFtpXSA9ICgxLjAtb2djcDFnW2ldK2ZnY3AxZ1tpXS1kaWdmMVtpXSkgKiAwLjUgKiBmcGVuYWx0eTsKCQlmZ190X29nX2hfZGdfbjFfcFtpXSA9ICgxLjAtZmdjcDFnW2ldK29nY3AxZ1tpXS1kaWdmMVtpXSkgKiAwLjUgKiBmcGVuYWx0eTsKCQlnYXB6X24xW2ldID0gKDEuMC1nYXB6MVtpXSk7Cgl9CiNlbmRpZgoKCWN1cnJlbnR3ID0gdzE7CglwcmV2aW91c3cgPSB3MjsKCgoJbWF0Y2hfY2FsYyggaW5pdHZlcnRpY2FsdywgY3BteDIsIGNwbXgxLCAwLCBsZ3RoMSwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CglpZiggbG9jYWxob20gKQoJCXBhcnRfaW1wX21hdGNoX291dF92ZWFkX3RhdGVfZ2FwbWFwUSggaW5pdHZlcnRpY2FsdywgZ2FwbWFwMlswXStzdGFydDIsIGxndGgxLCBzdGFydDEsIGdhcG1hcDEgKTsKCgoJbWF0Y2hfY2FsYyggY3VycmVudHcsIGNwbXgxLCBjcG14MiwgMCwgbGd0aDIsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoJaWYoIGxvY2FsaG9tICkKCQlwYXJ0X2ltcF9tYXRjaF9vdXRfdmVhZF9nYXBtYXBRKCBjdXJyZW50dywgZ2FwbWFwMVswXStzdGFydDEsIGxndGgyLCBzdGFydDIsIGdhcG1hcDIgKTsKI2lmIDAgLy8gLT4gdGJmYXN0LmMKCWlmKCBsb2NhbGhvbSApCgkJaW1wX21hdGNoX2NhbGMoIGN1cnJlbnR3LCBpY3ljLCBqY3ljLCBsZ3RoMSwgbGd0aDIsIHNlcTEsIHNlcTIsIGVmZjEsIGVmZjIsIGxvY2FsaG9tLCAxLCAwICk7CgojZW5kaWYKCglpZiggb3V0Z2FwID09IDEgKQoJewoJCWcgPSAwLjA7CgoJCWcgKz0gb2djcDFnWzBdICogb2dfaF9kZ19uMl9wWzBdOwoKCQlnICs9IG9nY3AyZ1swXSAqIG9nX2hfZGdfbjFfcFswXTsKCgkJZyArPSBmZ2NwMWdbMF0gKiBmZ19oX2RnX24yX3BbMF07CgoJCWcgKz0gZmdjcDJnWzBdICogZmdfaF9kZ19uMV9wWzBdOwoKCQlpbml0dmVydGljYWx3WzBdICs9IGc7CgkJY3VycmVudHdbMF0gKz0gZzsKCgkJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCQl7CgkJCXRtcHBlbmFsID0gZ2Fwel9uMlswXSpvZ190X2ZnX2hfZGdfbjFfcFswXTsKCQkJaW5pdHZlcnRpY2Fsd1tpXSArPSB0bXBwZW5hbDsKCgkJCXRtcHBlbmFsID0gZ2Fwel9uMlsxXSpmZ190X29nX2hfZGdfbjFfcFtpXTsKCQkJaW5pdHZlcnRpY2Fsd1tpXSArPSB0bXBwZW5hbDsKCgkJfQoJCWZvciggaj0xOyBqPGxndGgyKzE7IGorKyApCgkJewoJCQl0bXBwZW5hbCA9IGdhcHpfbjFbMF0qb2dfdF9mZ19oX2RnX24yX3BbMF07CgkJCWN1cnJlbnR3W2pdICs9IHRtcHBlbmFsOwoKCQkJdG1wcGVuYWwgPSBnYXB6X24xWzFdKmZnX3Rfb2dfaF9kZ19uMl9wW2pdOwoJCQljdXJyZW50d1tqXSArPSB0bXBwZW5hbDsKCQl9Cgl9CiNpZiBPVVRHQVAwVFJZCgllbHNlCgl7CgkJZm9yKCBqPTE7IGo8bGd0aDIrMTsgaisrICkKCQkJCWN1cnJlbnR3W2pdIC09IG9mZnNldCAqIGogLyAyLjA7CgkJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCQkJaW5pdHZlcnRpY2Fsd1tpXSAtPSBvZmZzZXQgKiBpIC8gMi4wOwoJfQojZW5kaWYKCgltWzBdID0gMC4wOyAvLyBpcmFuYWkKCWZvciggaj0xOyBqPGxndGgyKzE7ICsraiApIAoJewoJCW1wW2pdID0gMDsKCQltW2pdID0gY3VycmVudHdbai0xXSArIDEwMDAwICogZnBlbmFsdHk7IC8vaWlub2thPwoJfQoJaWYoIGxndGgyID09IDAgKQoJCWxhc3R2ZXJ0aWNhbHdbMF0gPSAwLjA7IC8vIEZhbGlnbiBrYXJhIHlvYmFyZXRhdG9raSBrb3VuYXJ1a2Fub3VzZWkgYXJpCgllbHNlCgkJbGFzdHZlcnRpY2Fsd1swXSA9IGN1cnJlbnR3W2xndGgyLTFdOwoKCWlmKCBvdXRnYXAgKSBsYXN0aSA9IGxndGgxKzE7IGVsc2UgbGFzdGkgPSBsZ3RoMTsKCWxhc3RqID0gbGd0aDIrMTsKCiNpZiBYWFhYWFhYCmZwcmludGYoIHN0ZGVyciwgImN1cnJlbnR3ID0gXG4iICk7CmZvciggaT0wOyBpPGxndGgxKzE7IGkrKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIiU1LjJmICIsIGN1cnJlbnR3W2ldICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImluaXR2ZXJ0aWNhbHcgPSBcbiIgKTsKZm9yKCBpPTA7IGk8bGd0aDIrMTsgaSsrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgaW5pdHZlcnRpY2Fsd1tpXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJmY2dwXG4iICk7CmZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCWZwcmludGYoIHN0ZGVyciwgImZnY3AxWyVkXT0lZlxuIiwgaSwgb2djcDFbaV0gKTsKZm9yKCBpPTA7IGk8bGd0aDI7IGkrKyApIAoJZnByaW50Ziggc3RkZXJyLCAiZmdjcDJbJWRdPSVmXG4iLCBpLCBvZ2NwMltpXSApOwojZW5kaWYKCglmb3IoIGk9MTsgaTxsYXN0aTsgaSsrICkKCXsKCQl3dG1wID0gcHJldmlvdXN3OyAKCQlwcmV2aW91c3cgPSBjdXJyZW50dzsKCQljdXJyZW50dyA9IHd0bXA7CgoJCXByZXZpb3Vzd1swXSA9IGluaXR2ZXJ0aWNhbHdbaS0xXTsKCgkJbWF0Y2hfY2FsYyggY3VycmVudHcsIGNwbXgxLCBjcG14MiwgaSwgbGd0aDIsIGZsb2F0d29yaywgaW50d29yaywgMCApOwojaWYgWFhYWFhYWApmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKZnByaW50Ziggc3RkZXJyLCAiaT0lZFxuIiwgaSApOwpmcHJpbnRmKCBzdGRlcnIsICJjdXJyZW50dyA9IFxuIiApOwpmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgY3VycmVudHdbal0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgkJaWYoIGxvY2FsaG9tICkKCQl7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiQ2FsbGluZyBpbXBfbWF0Y2hfY2FsYyAobykgbGd0aCA9ICVkLCBpID0gJWRcbiIsIGxndGgxLCBpICk7Ci8vCQkJaW1wX21hdGNoX291dF92ZWFkKCBjdXJyZW50dywgaSwgbGd0aDIgKTsKCQkJcGFydF9pbXBfbWF0Y2hfb3V0X3ZlYWRfZ2FwbWFwUSggY3VycmVudHcsIGdhcG1hcDFbaV0rc3RhcnQxLCBsZ3RoMiwgc3RhcnQyLCBnYXBtYXAyICk7CgkJfQojaWYgWFhYWFhYWApmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKZnByaW50Ziggc3RkZXJyLCAiaT0lZFxuIiwgaSApOwpmcHJpbnRmKCBzdGRlcnIsICJjdXJyZW50dyA9IFxuIiApOwpmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgY3VycmVudHdbal0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgkJY3VycmVudHdbMF0gPSBpbml0dmVydGljYWx3W2ldOwoKCQltcGkgPSAwOwoJCW1pID0gcHJldmlvdXN3WzBdICsgMTAwMDAgKiBmcGVuYWx0eTsKCgkJaWpwcHQgPSBpanBbaV0gKyAxOwoJCW1qcHQgPSBtICsgMTsKCQlwcmVwdCA9IHByZXZpb3VzdzsKCQljdXJwdCA9IGN1cnJlbnR3ICsgMTsKCQltcGpwdCA9IG1wICsgMTsKCQlmZ190X29nX2hfZGdfbjJfcF9wdCA9IGZnX3Rfb2dfaF9kZ19uMl9wICsgMTsKCQlvZ190X2ZnX2hfZGdfbjJfcF9wdCA9IG9nX3RfZmdfaF9kZ19uMl9wICsgMTsKCQlvZ19oX2RnX24yX3BfcHQgPSBvZ19oX2RnX24yX3AgKyAxOwoJCWZnX2hfZGdfbjJfcF9wdCA9IGZnX2hfZGdfbjJfcCArIDE7CgkJZ2Fwel9uMl9wdDAgPSBnYXB6X24yICsgMTsKCQlnYXB6X24yX3B0MSA9IGdhcHpfbjIgKyAyOwoJCWZnY3AycHQgPSBmZ2NwMmcgKyAxOwoJCW9nY3AycHQgPSBvZ2NwMmcgKyAxOwoKCQlmZ190X29nX2hfZGdfbjFfcF92YSA9IGZnX3Rfb2dfaF9kZ19uMV9wW2ldOwoJCW9nX3RfZmdfaF9kZ19uMV9wX3ZhID0gb2dfdF9mZ19oX2RnX24xX3BbaV07CgkJb2dfaF9kZ19uMV9wX3ZhID0gb2dfaF9kZ19uMV9wW2ldOwoJCWZnX2hfZGdfbjFfcF92YSA9IGZnX2hfZGdfbjFfcFtpXTsKCQlnYXB6X24xX3ZhMCA9IGdhcHpfbjFbaV07CgkJZ2Fwel9uMV92YTEgPSBnYXB6X24xW2krMV07CgkJZmdjcDF2YSA9IGZnY3AxZ1tpXTsKCQlvZ2NwMXZhID0gb2djcDFnW2ldOwoKCQlmb3IoIGo9MTsgajxsYXN0ajsgaisrICkKCQl7CgkJCXdtID0gKnByZXB0OwoKCQkJZyA9IG9nY3AxdmEgKiAqb2dfaF9kZ19uMl9wX3B0OwoJCQl3bSArPSBnOwoKCQkJZyA9ICpvZ2NwMnB0ICogb2dfaF9kZ19uMV9wX3ZhOwoJCQl3bSArPSBnOwoKCQkJZyA9IGZnY3AxdmEgKiAqZmdfaF9kZ19uMl9wX3B0OwoJCQl3bSArPSBnOwoKCQkJZyA9ICpmZ2NwMnB0ICogZmdfaF9kZ19uMV9wX3ZhOwoJCQl3bSArPSBnOwoKCQkJKmlqcHB0ID0gMDsKCgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZi0+Iiwgd20gKTsKI2VuZGlmCgkJCXRtcHBlbmFsID0gZ2Fwel9uMV92YTEgKiAqZmdfdF9vZ19oX2RnX24yX3BfcHQ7CiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmPyIsIGcgKTsKI2VuZGlmCgkJCWlmKCAoZz1taSt0bXBwZW5hbCkgPiB3bSApCgkJCXsKCQkJCXdtID0gZzsKCQkJCSppanBwdCA9IC0oIGogLSBtcGkgKTsKCQkJfQoKCQkJdG1wcGVuYWwgPSBnYXB6X24xX3ZhMCAqICpvZ190X2ZnX2hfZGdfbjJfcF9wdDsKCQkJaWYoIChnPSpwcmVwdCt0bXBwZW5hbCkgPj0gbWkgKQoJCQl7CgkJCQltaSA9IGc7CgkJCQltcGkgPSBqLTE7CgkJCX0KI2lmIFVTRV9QRU5BTFRZX0VYCgkJCW1pICs9IGZwZW5hbHR5X2V4OwojZW5kaWYKCgkJCXRtcHBlbmFsID0gKmdhcHpfbjJfcHQxICogZmdfdF9vZ19oX2RnX24xX3BfdmE7CiNpZiAwIAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZj8iLCBnICk7CiNlbmRpZgoJCQlpZiggKGc9Km1qcHQrdG1wcGVuYWwpID4gd20gKQoJCQl7CgkJCQl3bSA9IGc7CgkJCQkqaWpwcHQgPSArKCBpIC0gKm1wanB0ICk7CgkJCX0KCgkJCXRtcHBlbmFsID0gKmdhcHpfbjJfcHQwICogb2dfdF9mZ19oX2RnX24xX3BfdmE7CgkJCWlmKCAoZz0qcHJlcHQrdG1wcGVuYWwpID49ICptanB0ICkKCQkJewoJCQkJKm1qcHQgPSBnOwoJCQkJKm1wanB0ID0gaS0xOwoJCQl9CiNpZiBVU0VfUEVOQUxUWV9FWAoJCQltW2pdICs9IGZwZW5hbHR5X2V4OwojZW5kaWYKCiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmICIsIHdtICk7CiNlbmRpZgoJCQkqY3VycHQrKyArPSB3bTsKCQkJaWpwcHQrKzsKCQkJbWpwdCsrOwoJCQlwcmVwdCsrOwoJCQltcGpwdCsrOwoJCQlmZ190X29nX2hfZGdfbjJfcF9wdCsrOwoJCQlvZ190X2ZnX2hfZGdfbjJfcF9wdCsrOwoJCQlvZ19oX2RnX24yX3BfcHQrKzsKCQkJZmdfaF9kZ19uMl9wX3B0Kys7CgkJCWdhcHpfbjJfcHQwKys7CgkJCWdhcHpfbjJfcHQxKys7CgkJCWZnY3AycHQrKzsKCQkJb2djcDJwdCsrOwoJCX0KCQlsYXN0dmVydGljYWx3W2ldID0gY3VycmVudHdbbGd0aDItMV07Cgl9CgojaWYgT1VUR0FQMFRSWQoJaWYoICFvdXRnYXAgKQoJewoJCWZvciggaj0xOyBqPGxndGgyKzE7IGorKyApCgkJCWN1cnJlbnR3W2pdIC09IG9mZnNldCAqICggbGd0aDIgLSBqICkgLyAyLjA7CgkJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCQkJbGFzdHZlcnRpY2Fsd1tpXSAtPSBvZmZzZXQgKiAoIGxndGgxIC0gaSAgLyAyLjApOwoJfQojZW5kaWYKCQkKCS8qCglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIGZwcmludGYoIHN0ZGVyciwiJXNcbiIsIHNlcTFbaV0gKTsKCWZwcmludGYoIHN0ZGVyciwgIiMjIyMjXG4iICk7Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKSBmcHJpbnRmKCBzdGRlcnIsIiVzXG4iLCBzZXEyW2pdICk7CglmcHJpbnRmKCBzdGRlcnIsICI9PT09PiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIHN0cmNweSggbXNlcTFbaV0sIHNlcTFbaV0gKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIHN0cmNweSggbXNlcTJbal0sIHNlcTJbal0gKTsKCSovCglpZiggbG9jYWxob20gKQoJewoJCUF0cmFja2luZ19sb2NhbGhvbSggaW1wbWF0Y2gsIGN1cnJlbnR3LCBsYXN0dmVydGljYWx3LCBzZXExLCBzZXEyLCBtc2VxMSwgbXNlcTIsIGNwbXgxLCBjcG14MiwgaWpwLCBpY3ljLCBqY3ljLCBzdGFydDEsIGVuZDEsIHN0YXJ0MiwgZW5kMiwgZ2FwbWFwMSwgZ2FwbWFwMiApOwoJfQoJZWxzZQoJCUF0cmFja2luZyggY3VycmVudHcsIGxhc3R2ZXJ0aWNhbHcsIHNlcTEsIHNlcTIsIG1zZXExLCBtc2VxMiwgY3BteDEsIGNwbXgyLCBpanAsIGljeWMsIGpjeWMgKTsKCi8vCWZwcmludGYoIHN0ZGVyciwgIiMjIyBpbXBtYXRjaCA9ICVmXG4iLCAqaW1wbWF0Y2ggKTsKCglyZXN1bHRsZW4gPSBzdHJsZW4oIG1zZXExWzBdICk7CglpZiggYWxsb2NsZW4gPCByZXN1bHRsZW4gfHwgcmVzdWx0bGVuID4gTiApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiYWxsb2NsZW49JWQsIHJlc3VsdGxlbj0lZCwgTj0lZFxuIiwgYWxsb2NsZW4sIHJlc3VsdGxlbiwgTiApOwoJCUVycm9yRXhpdCggIkxFTkdUSCBPVkVSIVxuIiApOwoJfQoKCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBzdHJjcHkoIHNlcTFbaV0sIG1zZXExW2ldICk7Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKSBzdHJjcHkoIHNlcTJbal0sIG1zZXEyW2pdICk7CgkvKgoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Cglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsICIlc1xuIiwgbXNlcTFbaV0gKTsKCWZwcmludGYoIHN0ZGVyciwgIiMjIyMjXG4iICk7Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKSBmcHJpbnRmKCBzdGRlcnIsICIlc1xuIiwgbXNlcTJbal0gKTsKCSovCgovLwlmcHJpbnRmKCBzdGRlcnIsICJ3bSA9ICVmXG4iLCB3bSApOwoKCglyZXR1cm4oIHdtICk7Cn0KCg==