I2luY2x1ZGUgIm1sdGFsbi5oIgojaW5jbHVkZSAiZHAuaCIKCiNkZWZpbmUgTUFDSElHQUkgMAojZGVmaW5lIE9VVEdBUDBUUlkgMQojZGVmaW5lIERFQlVHIDAKI2RlZmluZSBYWFhYWFhYICAgIDAKI2RlZmluZSBVU0VfUEVOQUxUWV9FWCAgMAojZGVmaW5lIEZBU1RNQVRDSENBTEMgMQoKc3RhdGljIGZsb2F0ICoqaW1wbXR4ID0gTlVMTDsKCiNpZiAwIC8vIGJ5IEQuTWF0aG9nCnN0YXRpYyBmbG9hdCBjb3VudG5vY291bnR4eCggR2FwcGF0ICpwYXQxLCBmbG9hdCBkaWFmMSwgR2FwcGF0ICpwYXQyLCBpbnQgb2Zmc2V0MSwgaW50IG9mZnNldDIgKQp7Ci8vCXJldHVybiggMC4wICk7CglmbG9hdCBnY2xvc2U7CglmbG9hdCBnbWF0Y2g7CglHYXBwYXQgKnBhdDFiayA9IHBhdDE7CglHYXBwYXQgKnBhdDJiayA9IHBhdDI7CgoJZ21hdGNoID0gMC4wOwoJZm9yKCBwYXQyPXBhdDJiaysxOyBwYXQyLT5sZW4gIT0gMDsgcGF0MisrICkgLy8gZXhjbC4gbGVuPTAKCXsKCQlpZiggcGF0Mi0+bGVuICsgb2Zmc2V0MiA9PSBvZmZzZXQxICkKCQl7CgkJCWdtYXRjaCA9IGRpYWYxICogcGF0Mi0+ZnJlcTsKCQl9Cgl9Cglmb3IoIHBhdDE9cGF0MWJrKzE7IHBhdDEtPmxlbiAhPSAwOyBwYXQxKysgKSAvLyBleGNsLiBsZW49MAoJewoJCWZvciggcGF0Mj1wYXQyYmsrMTsgcGF0Mi0+bGVuICE9IDA7IHBhdDIrKyApIC8vIGV4Y2wuIGxlbj0wCgkJewoJCQlpZiggcGF0MS0+bGVuICsgb2Zmc2V0MSA9PSBwYXQyLT5sZW4gKyBvZmZzZXQyICkKCQkJewoJCQkJZ21hdGNoICs9IHBhdDEtPmZyZXEgKiBwYXQyLT5mcmVxOwovLwkJCQlpZiggciApIGZwcmludGYoIHN0ZGVyciwgIm1hdGNoMSEhLCBsZW49JWQsIGdtYXRjaD0lZiAqICVmXG4iLCBwYXQyLT5sZW4sIHBhdDEtPmZyZXEsIHBhdDItPmZyZXEgKTsKCQkJfQoJCX0KCX0KCXJldHVybiggZ21hdGNoICk7Cn0KI2VuZGlmCgpzdGF0aWMgZmxvYXQgY291bnRub2NvdW50bWF0Y2h4KCBHYXBwYXQgKnBhdDEsIEdhcHBhdCAqcGF0MiwgaW50IG9mZnNldDEsIGludCBvZmZzZXQyLCBpbnQgciApCnsKCUdhcHBhdCAqcGF0MWJrID0gcGF0MTsKCUdhcHBhdCAqcGF0MmJrID0gcGF0MjsKCWZsb2F0IHZhbCA9IDAuMDsKCS8vIHBhdDFbXVswXSBoYSB0b3RhbCBnYXAuCglmb3IoIHBhdDE9cGF0MWJrKzE7IHBhdDEtPmxlbiAhPSAwOyBwYXQxKysgKQoJewoJCWZvciggcGF0Mj1wYXQyYmsrMTsgcGF0Mi0+bGVuICE9IDA7IHBhdDIrKyApCgkJewoJCQlpZiggcGF0MS0+bGVuICsgb2Zmc2V0MSA9PSBwYXQyLT5sZW4gKyBvZmZzZXQyICkKCQkJewoJCQkJdmFsICs9IHBhdDEtPmZyZXEgKiBwYXQyLT5mcmVxOwoJCQkJaWYoIHIgKSBmcHJpbnRmKCBzdGRlcnIsICJ5ICVkLSVkLCBsZW49JWQsJWQsIHZhbCA9ICVmXG4iLCAoaW50KShwYXQxLXBhdDFiayksIChpbnQpKHBhdDItcGF0MmJrKSwgcGF0MS0+bGVuLCBwYXQyLT5sZW4sIHZhbCApOyAvLyAwNzA0MDUKLy8JCQkJaWYoIHIgKSBmcHJpbnRmKCBzdGRlcnIsICJ5ICVkLSVkLCBsZW49JWQsJWQsIHZhbCA9ICVmXG4iLCBwYXQxLXBhdDFiaywgcGF0Mi1wYXQyYmssIHBhdDEtPmxlbiwgcGF0Mi0+bGVuLCB2YWwgKTsKCQkJfQoJCX0gCgl9CglpZiggciApIGZwcmludGYoIHN0ZGVyciwgIm5vY291bnRtYXRjaD0lZlxuIiwgdmFsICk7CglyZXR1cm4oIHZhbCApOwp9CgojaWYgMCAvLyBieSBELk1hdGhvZwpzdGF0aWMgZmxvYXQgY291bnRub2NvdW50bWF0Y2goIEdhcHBhdCAqcGF0MSwgR2FwcGF0ICpwYXQyLCBpbnQgciApCnsKLy8JcmV0dXJuKCAwLjAgKTsKCUdhcHBhdCAqcGF0MWJrID0gcGF0MTsKCUdhcHBhdCAqcGF0MmJrID0gcGF0MjsKCWZsb2F0IHZhbCA9IDAuMDsKCS8vIHBhdDFbXVswXSBoYSB0b3RhbCBnYXAuCglmb3IoIHBhdDE9cGF0MWJrKzE7IHBhdDEtPmxlbiAhPSAwOyBwYXQxKysgKQoJewovLwkJaWYoIHIgKSBmcHJpbnRmKCBzdGRlcnIsICJiICVkLSVkLCBsZW49JWQsJWRcbiIsIHBhdDEtcGF0MWJrLCBwYXQyLXBhdDJiaywgcGF0MS0+bGVuLCBwYXQyLT5sZW4gKTsKCQlmb3IoIHBhdDI9cGF0MmJrKzE7IHBhdDItPmxlbiAhPSAwOyBwYXQyKysgKQoJCXsKCQkJaWYoIHBhdDEtPmxlbiA9PSBwYXQyLT5sZW4gKQoJCQl7Ci8vCQkJCWlmKCByICkgZnByaW50Ziggc3RkZXJyLCAiIHglZC0lZCwgbGVuPSVkLCVkXG4iLCBwYXQxLXBhdDFiaywgcGF0Mi1wYXQyYmssIHBhdDEtPmxlbiwgcGF0Mi0+bGVuICk7CgkJCQl2YWwgKz0gcGF0MS0+ZnJlcSAqIHBhdDItPmZyZXE7Ci8vCQkJCWlmKCByICkgZnByaW50Ziggc3RkZXJyLCAieSAlZC0lZCwgdmFsID0gJWZcbiIsIHBhdDEtcGF0MWJrLCBwYXQyLXBhdDJiayx2YWwgKTsKLy8JCQkJaWYoIHIgKSBmcHJpbnRmKCBzdGRlcnIsICJ6IHRzdWdpLCAlZC0lZCwgbGVuPSVkLCVkXG4iLCBwYXQxLXBhdDFiaysxLCBwYXQyLXBhdDJiaysxLCAocGF0MSsxKS0+bGVuLCAocGF0MisxKS0+bGVuICk7CgkJCX0KLy8JCQlpZiggciApIGZwcmludGYoIHN0ZGVyciwgImEgJWQtJWQsIGxlbj0lZCwlZFxuIiwgcGF0MS1wYXQxYmssIHBhdDItcGF0MmJrLCBwYXQxLT5sZW4sIHBhdDItPmxlbiApOwoJCX0gCgl9Ci8vCWZwcmludGYoIHN0ZGVyciwgIm5vY291bnRtYXRjaD0lZlxuIiwgdmFsICk7CglyZXR1cm4oIHZhbCApOwp9CiNlbmRpZgoKc3RhdGljIGZsb2F0IGNvdW50bm9jb3VudHgoIEdhcHBhdCAqcGF0MSwgZmxvYXQgZGlhZjEsIEdhcHBhdCAqcGF0MiwgaW50IG9mZnNldDEsIGludCByICkKewovLwlyZXR1cm4oIDAuMCApOwoJZmxvYXQgZ21hdGNoOwoJR2FwcGF0ICpwYXQxYmsgPSBwYXQxOwoJR2FwcGF0ICpwYXQyYmsgPSBwYXQyOwoKCWdtYXRjaCA9IDAuMDsKCWZvciggcGF0Mj1wYXQyYmsrMTsgcGF0Mi0+bGVuICE9IDA7IHBhdDIrKyApIC8vIGV4Y2wuIGxlbj0wCgl7CgkJaWYoIHBhdDItPmxlbiA9PSBvZmZzZXQxICkKCQl7CgkJCWdtYXRjaCA9IGRpYWYxICogcGF0Mi0+ZnJlcTsKLy8JCQlpZiggciApIGZwcmludGYoIHN0ZGVyciwgIm1hdGNoMCEhLCBsZW49JWQsIGdtYXRjaD0lZiAqICVmXG4iLCBwYXQyLT5sZW4sIGRpYWYxLCBwYXQyLT5mcmVxICk7CgkJfQoJfQoJZm9yKCBwYXQxPXBhdDFiaysxOyBwYXQxLT5sZW4gIT0gMDsgcGF0MSsrICkgLy8gZXhjbC4gbGVuPTAKCXsKCQlmb3IoIHBhdDI9cGF0MmJrKzE7IHBhdDItPmxlbiAhPSAwOyBwYXQyKysgKSAvLyBleGNsLiBsZW49MAoJCXsKCQkJaWYoIHBhdDEtPmxlbiArIG9mZnNldDEgPT0gcGF0Mi0+bGVuICkKCQkJewoJCQkJZ21hdGNoICs9IHBhdDEtPmZyZXEgKiBwYXQyLT5mcmVxOwovLwkJCQlpZiggciApIGZwcmludGYoIHN0ZGVyciwgIm1hdGNoMSEhLCBsZW49JWQsIGdtYXRjaD0lZiAqICVmXG4iLCBwYXQyLT5sZW4sIHBhdDEtPmZyZXEsIHBhdDItPmZyZXEgKTsKCQkJfQoJCX0KCX0KCXJldHVybiggZ21hdGNoICk7Cn0KCiNpZiAwIC8vIGJ5IEQuTWF0aG9nCnN0YXRpYyBmbG9hdCBjb3VudG5vY291bnQoIEdhcHBhdCAqcGF0MSwgR2FwcGF0ICpwYXQyLCBpbnQgb2Zmc2V0MSwgaW50IG9mZnNldDIgKSAvL29zb2kKewovLwlyZXR1cm4oIDAuMCApOwoJR2FwcGF0ICpwYXQxYmsgPSBwYXQxOwoJR2FwcGF0ICpwYXQyYmsgPSBwYXQyOwoJZmxvYXQgdmFsID0gMC4wOwoJLy8gcGF0MVtdWzBdIGhhIHRvdGFsIGdhcC4KCWZvciggcGF0MT1wYXQxYmsrMTsgcGF0MS0+bGVuICE9IC0xOyBwYXQxKysgKQoJewoJCWZvciggcGF0Mj1wYXQyYmsrMTsgcGF0Mi0+bGVuICE9IC0xOyBwYXQyKysgKQoJCXsKCQkJaWYoIHBhdDEtPmxlbitvZmZzZXQxID09IHBhdDItPmxlbitvZmZzZXQyICkKCQkJewoJCQkJdmFsICs9IHBhdDEtPmZyZXEgKiBwYXQyLT5mcmVxOwoJCQl9CgkJfSAKCX0KLy8JZnByaW50Ziggc3RkZXJyLCAibm9jb3VudD0lZlxuIiwgdmFsICk7CglyZXR1cm4oIHZhbCApOwp9CiNlbmRpZgoKCgojaWYgMSAvLyB0ZGl0ZXJhdGlvbiAKZmxvYXQgaW1wX21hdGNoX291dF9zY0goIGludCBpMSwgaW50IGoxICkKewovLwlmcHJpbnRmKCBzdGRlcnIsICJpbXArbWF0Y2ggPSAlZlxuIiwgaW1wbXR4W2kxXVtqMV0gKiBmYXN0YXRocmVzaG9sZCApOwovLwlmcHJpbnRmKCBzdGRlcnIsICJ2YWwgPSAlZlxuIiwgaW1wbXR4W2kxXVtqMV0gKTsKCXJldHVybiggaW1wbXR4W2kxXVtqMV0gKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGltcF9tYXRjaF9vdXRfdmVhZEgoIGZsb2F0ICppbXAsIGludCBpMSwgaW50IGxndGgyICkKewojaWYgRkFTVE1BVENIQ0FMQyAKCWZsb2F0ICpwdCA9IGltcG10eFtpMV07Cgl3aGlsZSggbGd0aDItLSApCgkJKmltcCsrICs9ICpwdCsrOwojZWxzZQoJaW50IGo7CglmbG9hdCAqcHQgPSBpbXBtdHhbaTFdOwoJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJKmltcCsrICs9IHB0W2pdOwojZW5kaWYKfQpzdGF0aWMgdm9pZCBpbXBfbWF0Y2hfb3V0X3ZlYWRfdGF0ZUgoIGZsb2F0ICppbXAsIGludCBqMSwgaW50IGxndGgxICkKewoJaW50IGk7Cglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKCQkqaW1wKysgKz0gaW1wbXR4W2ldW2oxXTsKfQoKI2lmIDEgLy8gdGJmYXN0LmMga2FyYSB5b2JhcmVydS4Kdm9pZCBpbXBfbWF0Y2hfaW5pdF9zdHJpY3RIKCBmbG9hdCAqaW1wLCBpbnQgY2x1czEsIGludCBjbHVzMiwgaW50IGxndGgxLCBpbnQgbGd0aDIsIGNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgZG91YmxlICplZmYxLCBkb3VibGUgKmVmZjIsIExvY2FsSG9tICoqKmxvY2FsaG9tLCBpbnQgZm9yc2NvcmUgKQp7CglpbnQgaSwgaiwgazEsIGsyLCB0bXBpbnQsIHN0YXJ0MSwgc3RhcnQyLCBlbmQxLCBlbmQyOwoJc3RhdGljIGludCBpbXBhbGxvY2xlbiA9IDA7CglmbG9hdCBlZmZpajsKCWRvdWJsZSBlZmZpang7CgljaGFyICpwdCwgKnB0MSwgKnB0MjsKCXN0YXRpYyBjaGFyICpub2NvdW50MSA9IE5VTEw7CglzdGF0aWMgY2hhciAqbm9jb3VudDIgPSBOVUxMOwoJTG9jYWxIb20gKnRtcHB0cjsKCglpZiggaW1wYWxsb2NsZW4gPCBsZ3RoMSArIDIgfHwgaW1wYWxsb2NsZW4gPCBsZ3RoMiArIDIgKQoJewoJCWlmKCBpbXBtdHggKSBGcmVlRmxvYXRNdHgoIGltcG10eCApOwoJCWlmKCBub2NvdW50MSApIGZyZWUoIG5vY291bnQxICk7CgkJaWYoIG5vY291bnQyICkgZnJlZSggbm9jb3VudDIgKTsKCQlpbXBhbGxvY2xlbiA9IE1BWCggbGd0aDEsIGxndGgyICkgKyAyOwoJCWltcG10eCA9IEFsbG9jYXRlRmxvYXRNdHgoIGltcGFsbG9jbGVuLCBpbXBhbGxvY2xlbiApOwoJCW5vY291bnQxID0gQWxsb2NhdGVDaGFyVmVjKCBpbXBhbGxvY2xlbiApOwoJCW5vY291bnQyID0gQWxsb2NhdGVDaGFyVmVjKCBpbXBhbGxvY2xlbiApOwoJfQoKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJewoJCWZvciggaj0wOyBqPGNsdXMxOyBqKysgKQoJCQlpZiggc2VxMVtqXVtpXSA9PSAnLScgKSBicmVhazsKCQlpZiggaiAhPSBjbHVzMSApIG5vY291bnQxW2ldID0gMTsgCgkJZWxzZQkJCSBub2NvdW50MVtpXSA9IDA7Cgl9Cglmb3IoIGk9MDsgaTxsZ3RoMjsgaSsrICkKCXsKCQlmb3IoIGo9MDsgajxjbHVzMjsgaisrICkKCQkJaWYoIHNlcTJbal1baV0gPT0gJy0nICkgYnJlYWs7CgkJaWYoIGogIT0gY2x1czIgKSBub2NvdW50MltpXSA9IDE7CgkJZWxzZQkJCSBub2NvdW50MltpXSA9IDA7Cgl9CgojaWYgMApmcHJpbnRmKCBzdGRlcnIsICJub2NvdW50MiA9XG4iICk7CmZvciggaSA9IDA7IGk8aW1wYWxsb2NsZW47IGkrKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIm5vY291bnQyWyVkXSA9ICVkICglYylcbiIsIGksIG5vY291bnQyW2ldLCBzZXEyWzBdW2ldICk7Cn0KI2VuZGlmCgoKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICJlZmYxIGluIF9pbml0X3N0cmljdCA9IFxuIiApOwoJZm9yKCBpPTA7IGk8Y2x1czE7IGkrKyApCgkJZnByaW50Ziggc3RkZXJyLCAiZWZmMVtdID0gJWZcbiIsIGVmZjFbaV0gKTsKCWZvciggaT0wOyBpPGNsdXMyOyBpKysgKQoJCWZwcmludGYoIHN0ZGVyciwgImVmZjJbXSA9ICVmXG4iLCBlZmYyW2ldICk7CiNlbmRpZgoKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSBmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQlpbXBtdHhbaV1bal0gPSAwLjA7CgllZmZpanggPSAgZmFzdGF0aHJlc2hvbGQ7Cglmb3IoIGk9MDsgaTxjbHVzMTsgaSsrICkKCXsKCQlmb3IoIGo9MDsgajxjbHVzMjsgaisrICkKCQl7CgkJCWVmZmlqID0gKGZsb2F0KSggZWZmMVtpXSAqIGVmZjJbal0gKiBlZmZpanggKTsKCQkJdG1wcHRyID0gbG9jYWxob21baV1bal07CgkJCXdoaWxlKCB0bXBwdHIgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0YXJ0MSA9ICVkXG4iLCB0bXBwdHItPnN0YXJ0MSApOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJlbmQxICAgPSAlZFxuIiwgdG1wcHRyLT5lbmQxICAgKTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiaSA9ICVkLCBzZXExID0gXG4lc1xuIiwgaSwgc2VxMVtpXSApOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJqID0gJWQsIHNlcTIgPSBcbiVzXG4iLCBqLCBzZXEyW2pdICk7CgkJCQlwdCA9IHNlcTFbaV07CgkJCQl0bXBpbnQgPSAtMTsKCQkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCQl7CgkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCWlmKCB0bXBpbnQgPT0gdG1wcHRyLT5zdGFydDEgKSBicmVhazsKCQkJCX0KCQkJCXN0YXJ0MSA9IHB0IC0gc2VxMVtpXSAtIDE7CgkKCQkJCWlmKCB0bXBwdHItPnN0YXJ0MSA9PSB0bXBwdHItPmVuZDEgKSBlbmQxID0gc3RhcnQxOwoJCQkJZWxzZQoJCQkJewojaWYgTUFDSElHQUkKCQkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJCXsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJ0bXBpbnQgPSAlZCwgZW5kMSA9ICVkIHBvcyA9ICVkXG4iLCB0bXBpbnQsIHRtcHB0ci0+ZW5kMSwgcHQtc2VxMVtpXSApOwoJCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+ZW5kMSApIGJyZWFrOwoJCQkJCQlpZiggKnB0KysgIT0gJy0nICkgdG1waW50Kys7CgkJCQkJfQoJCQkJCWVuZDEgPSBwdCAtIHNlcTFbaV0gLSAwOwojZWxzZQoJCQkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInRtcGludCA9ICVkLCBlbmQxID0gJWQgcG9zID0gJWRcbiIsIHRtcGludCwgdG1wcHRyLT5lbmQxLCBwdC1zZXExW2ldICk7CgkJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPmVuZDEgKSBicmVhazsKCQkJCQl9CgkJCQkJZW5kMSA9IHB0IC0gc2VxMVtpXSAtIDE7CiNlbmRpZgoJCQkJfQoJCgkJCQlwdCA9IHNlcTJbal07CgkJCQl0bXBpbnQgPSAtMTsKCQkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCQl7CgkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCWlmKCB0bXBpbnQgPT0gdG1wcHRyLT5zdGFydDIgKSBicmVhazsKCQkJCX0KCQkJCXN0YXJ0MiA9IHB0IC0gc2VxMltqXSAtIDE7CgkJCQlpZiggdG1wcHRyLT5zdGFydDIgPT0gdG1wcHRyLT5lbmQyICkgZW5kMiA9IHN0YXJ0MjsKCQkJCWVsc2UKCQkJCXsKI2lmIE1BQ0hJR0FJCgkJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCQl7CgkJCQkJCWlmKCB0bXBpbnQgPT0gdG1wcHRyLT5lbmQyICkgYnJlYWs7CgkJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQl9CgkJCQkJZW5kMiA9IHB0IC0gc2VxMltqXSAtIDA7CiNlbHNlCgkJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCQl7CgkJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPmVuZDIgKSBicmVhazsKCQkJCQl9CgkJCQkJZW5kMiA9IHB0IC0gc2VxMltqXSAtIDE7CiNlbmRpZgoJCQkJfQovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJzdGFydDEgPSAlZCAoJWMpLCBlbmQxID0gJWQgKCVjKSwgc3RhcnQyID0gJWQgKCVjKSwgZW5kMiA9ICVkICglYylcbiIsIHN0YXJ0MSwgc2VxMVtpXVtzdGFydDFdLCBlbmQxLCBzZXExW2ldW2VuZDFdLCBzdGFydDIsIHNlcTJbal1bc3RhcnQyXSwgZW5kMiwgc2VxMltqXVtlbmQyXSApOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJzdGVwIDBcbiIgKTsKCQkJCWlmKCBlbmQxIC0gc3RhcnQxICE9IGVuZDIgLSBzdGFydDIgKQoJCQkJewovLwkJCQkJZnByaW50Ziggc3RkZXJyLCAiQ0hVVUkhISwgc3RhcnQxID0gJWQsIGVuZDEgPSAlZCwgc3RhcnQyID0gJWQsIGVuZDIgPSAlZFxuIiwgc3RhcnQxLCBlbmQxLCBzdGFydDIsIGVuZDIgKTsKCQkJCX0KCiNpZiAxCgkJCQlrMSA9IHN0YXJ0MTsgazIgPSBzdGFydDI7CgkJCQlwdDEgPSBzZXExW2ldICsgazE7CgkJCQlwdDIgPSBzZXEyW2pdICsgazI7CgkJCQl3aGlsZSggKnB0MSAmJiAqcHQyICkKCQkJCXsKCQkJCQlpZiggKnB0MSAhPSAnLScgJiYgKnB0MiAhPSAnLScgKQoJCQkJCXsKLy8gvcWk36TyxvO9xaTLpKuksaTKpKSk6KSmpMvD7bDVpLekxrK8pLWkpKGjCi8vCQkJCQkJaW1wbXR4W2sxXVtrMl0gKz0gdG1wcHRyLT53aW1wb3J0YW5jZSAqIGZhc3RhdGhyZXNob2xkOwovLwkJCQkJCWltcG10eFtrMV1bazJdICs9IHRtcHB0ci0+aW1wb3J0YW5jZSAqIGVmZmlqOwoJCQkJCQlpbXBtdHhbazFdW2syXSArPSB0bXBwdHItPmZpbXBvcnRhbmNlICogZWZmaWo7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAiIyMjIyBpbXBtdHhbazFdW2syXSA9ICVmLCB0bXBwdHItPmZpbXBvcnRhbmNlPSVmLCBlZmZpaj0lZlxuIiwgaW1wbXR4W2sxXVtrMl0sIHRtcHB0ci0+ZmltcG9ydGFuY2UsIGVmZmlqICk7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAibWFyaywgJWQgKCVjKSAtICVkICglYykgXG4iLCBrMSwgKnB0MSwgazIsICpwdDIgKTsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICIlZCAoJWMpIC0gJWQgKCVjKSAgLSAlZlxuIiwgazEsICpwdDEsIGsyLCAqcHQyLCB0bXBwdHItPmZpbXBvcnRhbmNlICogZWZmaWogKTsKCQkJCQkJazErKzsgazIrKzsKCQkJCQkJcHQxKys7IHB0MisrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxICE9ICctJyAmJiAqcHQyID09ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsyKys7IHB0MisrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxID09ICctJyAmJiAqcHQyICE9ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsxKys7IHB0MSsrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxID09ICctJyAmJiAqcHQyID09ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsxKys7IHB0MSsrOwoJCQkJCQlrMisrOyBwdDIrKzsKCQkJCQl9CgkJCQkJaWYoIGsxID4gZW5kMSB8fCBrMiA+IGVuZDIgKSBicmVhazsKCQkJCX0KI2Vsc2UKCQkJCXdoaWxlKCBrMSA8PSBlbmQxICYmIGsyIDw9IGVuZDIgKQoJCQkJewoJCQkJCWZwcmludGYoIHN0ZGVyciwgImsxLGsyPSVkLCVkIC0gIiwgazEsIGsyICk7CgkJCQkJaWYoICFub2NvdW50MVtrMV0gJiYgIW5vY291bnQyW2syXSApCgkJCQkJewoJCQkJCQlpbXBtdHhbazFdW2syXSArPSB0bXBwdHItPndpbXBvcnRhbmNlICogZWZmMVtpXSAqIGVmZjJbal0gICogZmFzdGF0aHJlc2hvbGQ7CgkJCQkJCWZwcmludGYoIHN0ZGVyciwgIm1hcmtlZFxuIiApOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJCWZwcmludGYoIHN0ZGVyciwgIm5vIGNvdW50XG4iICk7CgkJCQkJazErKzsgazIrKzsKCQkJCX0KI2VuZGlmCgkJCQl0bXBwdHIgPSB0bXBwdHItPm5leHQ7CgkJCX0KCQl9Cgl9CiNpZiAwCglpZiggY2x1czEgPT0gMSAmJiBjbHVzMiA9PSA2ICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJzZXExWzBdID0gICVzXG4iLCBzZXExWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAic2VxMlswXSA9ICAlc1xuIiwgc2VxMlswXSApOwoJCWZwcmludGYoIHN0ZGVyciwgImltcG10eCA9IFxuIiApOwoJCWZvciggazI9MDsgazI8bGd0aDI7IGsyKysgKQoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNi4zZiAiLCAoZG91YmxlKWsyICk7CgkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CgkJZm9yKCBrMT0wOyBrMTxsZ3RoMTsgazErKyApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICIlZCAiLCBrMSApOwoJCQlmb3IoIGsyPTA7IGsyPDM7IGsyKysgKQoJCQkJZnByaW50Ziggc3RkZXJyLCAiJTIuMWYgIiwgaW1wbXR4W2sxXVtrMl0gKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CgkJfQoJCWV4aXQoIDEgKTsKCX0KI2VuZGlmCn0KI2VuZGlmCgoKc3RhdGljIHZvaWQgbWF0Y2hfY2FsYyggZmxvYXQgKm1hdGNoLCBmbG9hdCAqKmNwbXgxLCBmbG9hdCAqKmNwbXgyLCBpbnQgaTEsIGludCBsZ3RoMiwgZmxvYXQgKipmbG9hdHdvcmssIGludCAqKmludHdvcmssIGludCBpbml0aWFsaXplICkKewojaWYgRkFTVE1BVENIQ0FMQwoJaW50IGosIGw7CglmbG9hdCBzY2FyclsyNl07CglmbG9hdCAqKmNwbXhwZCA9IGZsb2F0d29yazsKCWludCAqKmNwbXhwZG4gPSBpbnR3b3JrOwoJZmxvYXQgKm1hdGNocHQsICpjcG14cGRwdCwgKipjcG14cGRwdHB0OwoJaW50ICpjcG14cGRucHQsICoqY3BteHBkbnB0cHQ7CglpZiggaW5pdGlhbGl6ZSApCgl7CgkJaW50IGNvdW50ID0gMDsKCQlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQl7CgkJCWNvdW50ID0gMDsKCQkJZm9yKCBsPTA7IGw8MjY7IGwrKyApCgkJCXsKCQkJCWlmKCBjcG14MltsXVtqXSApCgkJCQl7CgkJCQkJY3BteHBkW2pdW2NvdW50XSA9IGNwbXgyW2xdW2pdOwoJCQkJCWNwbXhwZG5bal1bY291bnRdID0gbDsKCQkJCQljb3VudCsrOwoJCQkJfQoJCQl9CgkJCWNwbXhwZG5bal1bY291bnRdID0gLTE7CgkJfQoJfQoKCXsKCQlmb3IoIGw9MDsgbDwyNjsgbCsrICkKCQl7CgkJCXNjYXJyW2xdID0gMC4wOwoJCQlmb3IoIGo9MDsgajwyNjsgaisrICkKCQkJCXNjYXJyW2xdICs9IG5fZGlzW2pdW2xdICogY3BteDFbal1baTFdOwoJCX0KCQltYXRjaHB0ID0gbWF0Y2g7CgkJY3BteHBkbnB0cHQgPSBjcG14cGRuOwoJCWNwbXhwZHB0cHQgPSBjcG14cGQ7CgkJd2hpbGUoIGxndGgyLS0gKQoJCXsKCQkJKm1hdGNocHQgPSAwLjA7CgkJCWNwbXhwZG5wdCA9ICpjcG14cGRucHRwdCsrOwoJCQljcG14cGRwdCA9ICpjcG14cGRwdHB0Kys7CgkJCXdoaWxlKCAqY3BteHBkbnB0Pi0xICkKCQkJCSptYXRjaHB0ICs9IHNjYXJyWypjcG14cGRucHQrK10gKiAqY3BteHBkcHQrKzsKCQkJbWF0Y2hwdCsrOwoJCX0gCgl9CiNlbHNlCglpbnQgaiwgaywgbDsKCWZsb2F0IHNjYXJyWzI2XTsKCWZsb2F0ICoqY3BteHBkID0gZmxvYXR3b3JrOwoJaW50ICoqY3BteHBkbiA9IGludHdvcms7Ci8vIHNpbXBsZQoJaWYoIGluaXRpYWxpemUgKQoJewoJCWludCBjb3VudCA9IDA7CgkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJewoJCQljb3VudCA9IDA7CgkJCWZvciggbD0wOyBsPDI2OyBsKysgKQoJCQl7CgkJCQlpZiggY3BteDJbbF1bal0gKQoJCQkJewoJCQkJCWNwbXhwZFtjb3VudF1bal0gPSBjcG14MltsXVtqXTsKCQkJCQljcG14cGRuW2NvdW50XVtqXSA9IGw7CgkJCQkJY291bnQrKzsKCQkJCX0KCQkJfQoJCQljcG14cGRuW2NvdW50XVtqXSA9IC0xOwoJCX0KCX0KCWZvciggbD0wOyBsPDI2OyBsKysgKQoJewoJCXNjYXJyW2xdID0gMC4wOwoJCWZvciggaz0wOyBrPDI2OyBrKysgKQoJCQlzY2FycltsXSArPSBuX2Rpc1trXVtsXSAqIGNwbXgxW2tdW2kxXTsKCX0KCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCW1hdGNoW2pdID0gMC4wOwoJCWZvciggaz0wOyBjcG14cGRuW2tdW2pdPi0xOyBrKysgKQoJCQltYXRjaFtqXSArPSBzY2FycltjcG14cGRuW2tdW2pdXSAqIGNwbXhwZFtrXVtqXTsKCX0gCiNlbmRpZgp9CgpzdGF0aWMgdm9pZCBBdHJhY2tpbmdfbG9jYWxob20oIGZsb2F0ICppbXB3bXB0LCBmbG9hdCAqbGFzdGhvcml6b250YWx3LCBmbG9hdCAqbGFzdHZlcnRpY2FsdywgCgkJCQkJCWNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiptc2VxMSwgY2hhciAqKm1zZXEyLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKipjcG14MSwgZmxvYXQgKipjcG14MiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAqKmlqcCwgaW50IGljeWMsIGludCBqY3ljICkKewoJaW50IGksIGosIGwsIGlpbiwgamluLCBpZmksIGpmaSwgbGd0aDEsIGxndGgyLCBrOwoJZmxvYXQgd207CgljaGFyICpnYXB0YWJsZTEsICpndDFiazsKCWNoYXIgKmdhcHRhYmxlMiwgKmd0MmJrOwoJbGd0aDEgPSBzdHJsZW4oIHNlcTFbMF0gKTsKCWxndGgyID0gc3RybGVuKCBzZXEyWzBdICk7CglndDFiayA9IEFsbG9jYXRlQ2hhclZlYyggbGd0aDErbGd0aDIrMSApOwoJZ3QyYmsgPSBBbGxvY2F0ZUNoYXJWZWMoIGxndGgxK2xndGgyKzEgKTsKCiNpZiAwCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgCgl7CgkJZnByaW50Ziggc3RkZXJyLCAibGFzdHZlcnRpY2Fsd1slZF0gPSAlZlxuIiwgaSwgbGFzdHZlcnRpY2Fsd1tpXSApOwoJfQojZW5kaWYKIAoJaWYoIG91dGdhcCA9PSAxICkKCQk7CgllbHNlCgl7CgkJd20gPSBsYXN0dmVydGljYWx3WzBdOwoJCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJCXsKCQkJaWYoIGxhc3R2ZXJ0aWNhbHdbaV0gPj0gd20gKQoJCQl7CgkJCQl3bSA9IGxhc3R2ZXJ0aWNhbHdbaV07CgkJCQlpaW4gPSBpOyBqaW4gPSBsZ3RoMi0xOwoJCQkJaWpwW2xndGgxXVtsZ3RoMl0gPSArKCBsZ3RoMSAtIGkgKTsKCQkJfQoJCX0KCQlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQl7CgkJCWlmKCBsYXN0aG9yaXpvbnRhbHdbal0gPj0gd20gKQoJCQl7CgkJCQl3bSA9IGxhc3Rob3Jpem9udGFsd1tqXTsKCQkJCWlpbiA9IGxndGgxLTE7IGppbiA9IGo7CgkJCQlpanBbbGd0aDFdW2xndGgyXSA9IC0oIGxndGgyIC0gaiApOwoJCQl9CgkJfQoJfQoKICAgIGZvciggaT0wOyBpPGxndGgxKzE7IGkrKyApIAogICAgewogICAgICAgIGlqcFtpXVswXSA9IGkgKyAxOwogICAgfQogICAgZm9yKCBqPTA7IGo8bGd0aDIrMTsgaisrICkgCiAgICB7CiAgICAgICAgaWpwWzBdW2pdID0gLSggaiArIDEgKTsKICAgIH0KCglnYXB0YWJsZTEgPSBndDFiayArIGxndGgxK2xndGgyOwoJKmdhcHRhYmxlMSA9IDA7CglnYXB0YWJsZTIgPSBndDJiayArIGxndGgxK2xndGgyOwoJKmdhcHRhYmxlMiA9IDA7CgoJaWluID0gbGd0aDE7IGppbiA9IGxndGgyOwoJKmltcHdtcHQgPSAwLjA7Cglmb3IoIGs9MDsgazw9bGd0aDErbGd0aDI7IGsrKyApIAoJewoJCWlmKCBpanBbaWluXVtqaW5dIDwgMCApIAoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbitpanBbaWluXVtqaW5dOwoJCX0KCQllbHNlIGlmKCBpanBbaWluXVtqaW5dID4gMCApCgkJewoJCQlpZmkgPSBpaW4taWpwW2lpbl1bamluXTsgamZpID0gamluLTE7CgkJfQoJCWVsc2UKCQl7CgkJCWlmaSA9IGlpbi0xOyBqZmkgPSBqaW4tMTsKCQl9CgkJbCA9IGlpbiAtIGlmaTsKCQl3aGlsZSggLS1sICkgCgkJewoJCQkqLS1nYXB0YWJsZTEgPSAnbyc7CgkJCSotLWdhcHRhYmxlMiA9ICctJzsKCQkJaysrOwoJCX0KCQlsPSBqaW4gLSBqZmk7CgkJd2hpbGUoIC0tbCApCgkJewoJCQkqLS1nYXB0YWJsZTEgPSAnLSc7CgkJCSotLWdhcHRhYmxlMiA9ICdvJzsKCQkJaysrOwoJCX0KCQlpZiggaWluID09IGxndGgxIHx8IGppbiA9PSBsZ3RoMiApCgkJCTsKCQllbHNlCgkJewoJCQkqaW1wd21wdCArPSBpbXBfbWF0Y2hfb3V0X3NjSCggaWluLCBqaW4gKTsKCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJpbXB3bSA9ICVmIChpaW49JWQsIGppbj0lZCkgc2VxMT0lYywgc2VxMj0lY1xuIiwgKmltcHdtcHQsIGlpbiwgamluLCBzZXExWzBdW2lpbl0sIHNlcTJbMF1bamluXSApOwoJCX0KCQlpZiggaWluIDw9IDAgfHwgamluIDw9IDAgKSBicmVhazsKCQkqLS1nYXB0YWJsZTEgPSAnbyc7CgkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCWsrKzsKCQlpaW4gPSBpZmk7IGppbiA9IGpmaTsKCX0KCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBnYXBpcmVydSggbXNlcTFbaV0sIHNlcTFbaV0sIGdhcHRhYmxlMSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgZ2FwaXJlcnUoIG1zZXEyW2pdLCBzZXEyW2pdLCBnYXB0YWJsZTIgKTsKCglmcmVlKCBndDFiayApOwoJZnJlZSggZ3QyYmsgKTsKfQoKc3RhdGljIGZsb2F0IEF0cmFja2luZyggZmxvYXQgKmxhc3Rob3Jpem9udGFsdywgZmxvYXQgKmxhc3R2ZXJ0aWNhbHcsIAoJCQkJCQljaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgKippanAsIGludCBpY3ljLCBpbnQgamN5YyApCnsKCWludCBpLCBqLCBsLCBpaW4sIGppbiwgaWZpLCBqZmksIGxndGgxLCBsZ3RoMiwgazsKCWZsb2F0IHdtOwoJY2hhciAqZ2FwdGFibGUxLCAqZ3QxYms7CgljaGFyICpnYXB0YWJsZTIsICpndDJiazsKCWxndGgxID0gc3RybGVuKCBzZXExWzBdICk7CglsZ3RoMiA9IHN0cmxlbiggc2VxMlswXSApOwoKCWd0MWJrID0gQWxsb2NhdGVDaGFyVmVjKCBsZ3RoMStsZ3RoMisxICk7CglndDJiayA9IEFsbG9jYXRlQ2hhclZlYyggbGd0aDErbGd0aDIrMSApOwoKI2lmIDAKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJsYXN0dmVydGljYWx3WyVkXSA9ICVmXG4iLCBpLCBsYXN0dmVydGljYWx3W2ldICk7Cgl9CiNlbmRpZgogCglpZiggb3V0Z2FwID09IDEgKQoJCTsKCWVsc2UKCXsKCQl3bSA9IGxhc3R2ZXJ0aWNhbHdbMF07CgkJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgkJewoJCQlpZiggbGFzdHZlcnRpY2Fsd1tpXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdHZlcnRpY2Fsd1tpXTsKCQkJCWlpbiA9IGk7IGppbiA9IGxndGgyLTE7CgkJCQlpanBbbGd0aDFdW2xndGgyXSA9ICsoIGxndGgxIC0gaSApOwoJCQl9CgkJfQoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJaWYoIGxhc3Rob3Jpem9udGFsd1tqXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdGhvcml6b250YWx3W2pdOwoJCQkJaWluID0gbGd0aDEtMTsgamluID0gajsKCQkJCWlqcFtsZ3RoMV1bbGd0aDJdID0gLSggbGd0aDIgLSBqICk7CgkJCX0KCQl9Cgl9CgogICAgZm9yKCBpPTA7IGk8bGd0aDErMTsgaSsrICkgCiAgICB7CiAgICAgICAgaWpwW2ldWzBdID0gaSArIDE7CiAgICB9CiAgICBmb3IoIGo9MDsgajxsZ3RoMisxOyBqKysgKSAKICAgIHsKICAgICAgICBpanBbMF1bal0gPSAtKCBqICsgMSApOwogICAgfQoKCWdhcHRhYmxlMSA9IGd0MWJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUxID0gMDsKCWdhcHRhYmxlMiA9IGd0MmJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUyID0gMDsKCglpaW4gPSBsZ3RoMTsgamluID0gbGd0aDI7Cglmb3IoIGs9MDsgazw9bGd0aDErbGd0aDI7IGsrKyApIAoJewoJCWlmKCBpanBbaWluXVtqaW5dIDwgMCApIAoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbitpanBbaWluXVtqaW5dOwoJCX0KCQllbHNlIGlmKCBpanBbaWluXVtqaW5dID4gMCApCgkJewoJCQlpZmkgPSBpaW4taWpwW2lpbl1bamluXTsgamZpID0gamluLTE7CgkJfQoJCWVsc2UKCQl7CgkJCWlmaSA9IGlpbi0xOyBqZmkgPSBqaW4tMTsKCQl9CgkJbCA9IGlpbiAtIGlmaTsKCQl3aGlsZSggLS1sICkgCgkJewoJCQkqLS1nYXB0YWJsZTEgPSAnbyc7CgkJCSotLWdhcHRhYmxlMiA9ICctJzsKCQkJaysrOwoJCX0KCQlsPSBqaW4gLSBqZmk7CgkJd2hpbGUoIC0tbCApCgkJewoJCQkqLS1nYXB0YWJsZTEgPSAnLSc7CgkJCSotLWdhcHRhYmxlMiA9ICdvJzsKCQkJaysrOwoJCX0KCQlpZiggaWluIDw9IDAgfHwgamluIDw9IDAgKSBicmVhazsKCQkqLS1nYXB0YWJsZTEgPSAnbyc7CgkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCWsrKzsKCQlpaW4gPSBpZmk7IGppbiA9IGpmaTsKCX0KCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBnYXBpcmVydSggbXNlcTFbaV0sIHNlcTFbaV0sIGdhcHRhYmxlMSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgZ2FwaXJlcnUoIG1zZXEyW2pdLCBzZXEyW2pdLCBnYXB0YWJsZTIgKTsKCglmcmVlKCBndDFiayApOwoJZnJlZSggZ3QyYmsgKTsKCglyZXR1cm4oIDAuMCApOwp9CgpmbG9hdCBIX19hbGlnbiggY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCBkb3VibGUgKmVmZjEsIGRvdWJsZSAqZWZmMiwgaW50IGljeWMsIGludCBqY3ljLCBpbnQgYWxsb2NsZW4sIExvY2FsSG9tICoqKmxvY2FsaG9tLCBmbG9hdCAqaW1wbWF0Y2gsIGNoYXIgKnNnYXAxLCBjaGFyICpzZ2FwMiwgY2hhciAqZWdhcDEsIGNoYXIgKmVnYXAyICkKLyogc2NvcmUgbm8ga2Vpc2FuIG5vIHNhaSBtb3Rva2FyYWFydSBnYXAgbm8gYXR1a2FpIG5pIG1vbmRhaSBnYSBhcnUgKi8KewovLwlpbnQgazsKCXJlZ2lzdGVyIGludCBpLCBqOwoJaW50IGxhc3RpLCBsYXN0ajsgICAgICAvKiBvdXRnYXAgPT0gMCAtPiBsZ3RoMSwgb3V0Z2FwID09IDEgLT4gbGd0aDErMSAqLwoJaW50IGxndGgxLCBsZ3RoMjsKCWludCByZXN1bHRsZW47CglmbG9hdCB3bSA9IDAuMDsgICAvKiBpbnQgPz8/Pz8/ICovCglmbG9hdCBnOwoJZmxvYXQgKmN1cnJlbnR3LCAqcHJldmlvdXN3OwovLwlmbG9hdCBmcGVuYWx0eSA9IChmbG9hdClwZW5hbHR5OwojaWYgVVNFX1BFTkFMVFlfRVgKCWZsb2F0IGZwZW5hbHR5X2V4ID0gKGZsb2F0KXBlbmFsdHlfZXg7CiNlbmRpZgojaWYgMQoJZmxvYXQgKnd0bXA7CglpbnQgKmlqcHB0OwoJZmxvYXQgKm1qcHQsICpwcmVwdCwgKmN1cnB0OwoJaW50ICptcGpwdDsKI2VuZGlmCglzdGF0aWMgZmxvYXQgbWksICptOwoJc3RhdGljIGludCAqKmlqcDsKCXN0YXRpYyBpbnQgbXBpLCAqbXA7CglzdGF0aWMgZmxvYXQgKncxLCAqdzI7CglzdGF0aWMgZmxvYXQgKm1hdGNoOwoJc3RhdGljIGZsb2F0ICppbml0dmVydGljYWx3OyAgICAvKiBrdWZ1dSBzdXJlYmEgaXJhbmFpICovCglzdGF0aWMgZmxvYXQgKmxhc3R2ZXJ0aWNhbHc7ICAgIC8qIGt1ZnV1IHN1cmViYSBpcmFuYWkgKi8KCXN0YXRpYyBjaGFyICoqbXNlcTE7CglzdGF0aWMgY2hhciAqKm1zZXEyOwoJc3RhdGljIGNoYXIgKiptc2VxOwoJc3RhdGljIEdhcHBhdCAqKmdhcHBhdDE7CglzdGF0aWMgR2FwcGF0ICoqZ2FwcGF0MjsKCXN0YXRpYyBmbG9hdCAqZGlnZjE7CglzdGF0aWMgZmxvYXQgKmRpZ2YyOwoJc3RhdGljIGZsb2F0ICpkaWFmMTsKCXN0YXRpYyBmbG9hdCAqZGlhZjI7CglzdGF0aWMgZmxvYXQgKmdhcHoxOwoJc3RhdGljIGZsb2F0ICpnYXB6MjsKCXN0YXRpYyBmbG9hdCAqZ2FwZjE7CglzdGF0aWMgZmxvYXQgKmdhcGYyOwoJc3RhdGljIGZsb2F0ICpvZ2NwMWc7CglzdGF0aWMgZmxvYXQgKm9nY3AyZzsKCXN0YXRpYyBmbG9hdCAqZmdjcDFnOwoJc3RhdGljIGZsb2F0ICpmZ2NwMmc7CglzdGF0aWMgZmxvYXQgKm9nY3AxOwoJc3RhdGljIGZsb2F0ICpvZ2NwMjsKCXN0YXRpYyBmbG9hdCAqZmdjcDE7CglzdGF0aWMgZmxvYXQgKmZnY3AyOwoJc3RhdGljIGZsb2F0ICoqY3BteDE7CglzdGF0aWMgZmxvYXQgKipjcG14MjsKCXN0YXRpYyBpbnQgKippbnR3b3JrOwoJc3RhdGljIGZsb2F0ICoqZmxvYXR3b3JrOwoJc3RhdGljIGludCBvcmxndGgxID0gMCwgb3JsZ3RoMiA9IDA7CglmbG9hdCBmcGVuYWx0eSA9IChmbG9hdClwZW5hbHR5OwoJZmxvYXQgdG1wcGVuYWw7CglmbG9hdCBjdW1wZW5hbDsKCWZsb2F0ICpmZ2NwMnB0OwoJZmxvYXQgKm9nY3AycHQ7CglmbG9hdCBmZ2NwMXZhOwoJZmxvYXQgb2djcDF2YTsKCWludCBtYWVnYXA7CgoKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICIjIyMjICBlZmYgaW4gU0ErKythbGlnblxuIiApOwoJZnByaW50Ziggc3RkZXJyLCAiIyMjIyAgc2VxMVswXSA9ICVzXG4iLCBzZXExWzBdICk7CglmcHJpbnRmKCBzdGRlcnIsICIjIyMjICBzdHJsZW4oIHNlcTFbMF0gKSA9ICVkXG4iLCBzdHJsZW4oIHNlcTFbMF0gKSApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZnByaW50Ziggc3RkZXJyLCAiZWZmMVslZF0gPSAlZlxuIiwgaSwgZWZmMVtpXSApOwojZW5kaWYKCWlmKCBvcmxndGgxID09IDAgKQoJewoJCW1zZXExID0gQWxsb2NhdGVDaGFyTXR4KCBuam9iLCAwICk7CgkJbXNlcTIgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIDAgKTsKCX0KCgoJbGd0aDEgPSBzdHJsZW4oIHNlcTFbMF0gKTsKCWxndGgyID0gc3RybGVuKCBzZXEyWzBdICk7CiNpZiAwCglpZiggbGd0aDEgPT0gMCB8fCBsZ3RoMiA9PSAwICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJXQVJOSU5HIChBYWxpZ25tbSk6IGxndGgxPSVkLCBsZ3RoMj0lZFxuIiwgbGd0aDEsIGxndGgyICk7Cgl9CiNlbmRpZgoKCWlmKCBsZ3RoMSA+IG9ybGd0aDEgfHwgbGd0aDIgPiBvcmxndGgyICkKCXsKCQlpbnQgbGwxLCBsbDI7CgoJCWlmKCBvcmxndGgxID4gMCAmJiBvcmxndGgyID4gMCApCgkJewoJCQlGcmVlRmxvYXRWZWMoIHcxICk7CgkJCUZyZWVGbG9hdFZlYyggdzIgKTsKCQkJRnJlZUZsb2F0VmVjKCBtYXRjaCApOwoJCQlGcmVlRmxvYXRWZWMoIGluaXR2ZXJ0aWNhbHcgKTsKCQkJRnJlZUZsb2F0VmVjKCBsYXN0dmVydGljYWx3ICk7CgoJCQlGcmVlRmxvYXRWZWMoIG0gKTsKCQkJRnJlZUludFZlYyggbXAgKTsKCgkJCUZyZWVDaGFyTXR4KCBtc2VxICk7CgoJCQlmcmVlKCBnYXBwYXQxICk7CgkJCWZyZWUoIGdhcHBhdDIgKTsKCQkJRnJlZUZsb2F0VmVjKCBkaWdmMSApOwoJCQlGcmVlRmxvYXRWZWMoIGRpZ2YyICk7CgkJCUZyZWVGbG9hdFZlYyggZGlhZjEgKTsKCQkJRnJlZUZsb2F0VmVjKCBkaWFmMiApOwoJCQlGcmVlRmxvYXRWZWMoIGdhcHoxICk7CgkJCUZyZWVGbG9hdFZlYyggZ2FwejIgKTsKCQkJRnJlZUZsb2F0VmVjKCBnYXBmMSApOwoJCQlGcmVlRmxvYXRWZWMoIGdhcGYyICk7CgkJCUZyZWVGbG9hdFZlYyggb2djcDEgKTsKCQkJRnJlZUZsb2F0VmVjKCBvZ2NwMiApOwoJCQlGcmVlRmxvYXRWZWMoIGZnY3AxICk7CgkJCUZyZWVGbG9hdFZlYyggZmdjcDIgKTsKCQkJRnJlZUZsb2F0VmVjKCBvZ2NwMWcgKTsKCQkJRnJlZUZsb2F0VmVjKCBvZ2NwMmcgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ2NwMWcgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ2NwMmcgKTsKCgoJCQlGcmVlRmxvYXRNdHgoIGNwbXgxICk7CgkJCUZyZWVGbG9hdE10eCggY3BteDIgKTsKCgkJCUZyZWVGbG9hdE10eCggZmxvYXR3b3JrICk7CgkJCUZyZWVJbnRNdHgoIGludHdvcmsgKTsKCQl9CgoJCWxsMSA9IE1BWCggKGludCkoMS4zKmxndGgxKSwgb3JsZ3RoMSApICsgMTAwOwoJCWxsMiA9IE1BWCggKGludCkoMS4zKmxndGgyKSwgb3JsZ3RoMiApICsgMTAwOwoKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAiXG50cnlpbmcgdG8gYWxsb2NhdGUgKCVkKyVkKXhuIG1hdHJpY2VzIC4uLiAiLCBsbDEsIGxsMiApOwojZW5kaWYKCgkJdzEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCXcyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQltYXRjaCA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgoJCWluaXR2ZXJ0aWNhbHcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWxhc3R2ZXJ0aWNhbHcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoKCQltID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQltcCA9IEFsbG9jYXRlSW50VmVjKCBsbDIrMiApOwoKCQltc2VxID0gQWxsb2NhdGVDaGFyTXR4KCBuam9iLCBsbDErbGwyICk7CgoJCWRpZ2YxID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlkaWdmMiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJZGlhZjEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWRpYWYyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlnYXBwYXQxID0gKEdhcHBhdCAqKiljYWxsb2MoIGxsMSsyLCBzaXplb2YoIEdhcHBhdCAqICkgKTsKCQlnYXBwYXQyID0gKEdhcHBhdCAqKiljYWxsb2MoIGxsMisyLCBzaXplb2YoIEdhcHBhdCAqICkgKTsKCQlnYXB6MSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZ2FwejIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCWdhcGYxID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlnYXBmMiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJb2djcDEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCW9nY3AyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlmZ2NwMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZmdjcDIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW9nY3AxZyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJb2djcDJnID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlmZ2NwMWcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWZnY3AyZyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgoJCWNwbXgxID0gQWxsb2NhdGVGbG9hdE10eCggMjYsIGxsMSsyICk7CgkJY3BteDIgPSBBbGxvY2F0ZUZsb2F0TXR4KCAyNiwgbGwyKzIgKTsKCiNpZiBGQVNUTUFUQ0hDQUxDCgkJZmxvYXR3b3JrID0gQWxsb2NhdGVGbG9hdE10eCggTUFYKCBsbDEsIGxsMiApKzIsIDI2ICk7IAoJCWludHdvcmsgPSBBbGxvY2F0ZUludE10eCggTUFYKCBsbDEsIGxsMiApKzIsIDI3ICk7IAojZWxzZQoJCWZsb2F0d29yayA9IEFsbG9jYXRlRmxvYXRNdHgoIDI2LCBNQVgoIGxsMSwgbGwyICkrMiApOyAKCQlpbnR3b3JrID0gQWxsb2NhdGVJbnRNdHgoIDI2LCBNQVgoIGxsMSwgbGwyICkrMiApOyAKI2VuZGlmCgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJzdWNjZWVkZWRcbiIgKTsKI2VuZGlmCgoJCW9ybGd0aDEgPSBsbDEgLSAxMDA7CgkJb3JsZ3RoMiA9IGxsMiAtIDEwMDsKCX0KCgoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkKCXsKCQltc2VxMVtpXSA9IG1zZXFbaV07CgkJc2VxMVtpXVtsZ3RoMV0gPSAwOwoJfQoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkKCXsKCQltc2VxMltqXSA9IG1zZXFbaWN5YytqXTsKCQlzZXEyW2pdW2xndGgyXSA9IDA7Cgl9CgoKCWlmKCBvcmxndGgxID4gY29tbW9uQWxsb2MxIHx8IG9ybGd0aDIgPiBjb21tb25BbGxvYzIgKQoJewoJCWludCBsbDEsIGxsMjsKCgkJaWYoIGNvbW1vbkFsbG9jMSAmJiBjb21tb25BbGxvYzIgKQoJCXsKCQkJRnJlZUludE10eCggY29tbW9uSVAgKTsKCQl9CgoJCWxsMSA9IE1BWCggb3JsZ3RoMSwgY29tbW9uQWxsb2MxICk7CgkJbGwyID0gTUFYKCBvcmxndGgyLCBjb21tb25BbGxvYzIgKTsKCiNpZiBERUJVRwoJCWZwcmludGYoIHN0ZGVyciwgIlxuXG50cnlpbmcgdG8gYWxsb2NhdGUgJWR4JWQgbWF0cmljZXMgLi4uICIsIGxsMSsxLCBsbDIrMSApOwojZW5kaWYKCgkJY29tbW9uSVAgPSBBbGxvY2F0ZUludE10eCggbGwxKzEwLCBsbDIrMTAgKTsKCiNpZiBERUJVRwoJCWZwcmludGYoIHN0ZGVyciwgInN1Y2NlZWRlZFxuXG4iICk7CiNlbmRpZgoKCQljb21tb25BbGxvYzEgPSBsbDE7CgkJY29tbW9uQWxsb2MyID0gbGwyOwoJfQoJaWpwID0gY29tbW9uSVA7CgojaWYgMAoJewoJCWZsb2F0IHQgPSAwLjA7CgkJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkKCQkJdCArPSBlZmYxW2ldOwoJZnByaW50Ziggc3RkZXJyLCAiIyMgdG90YWxlZmYgPSAlZlxuIiwgdCApOwoJfQojZW5kaWYKCgljcG14X2NhbGNfbmV3KCBzZXExLCBjcG14MSwgZWZmMSwgbGd0aDEsIGljeWMgKTsKCWNwbXhfY2FsY19uZXcoIHNlcTIsIGNwbXgyLCBlZmYyLCBsZ3RoMiwgamN5YyApOwoKCWlmKCBzZ2FwMSApCgl7CgkJbmV3X09wZW5pbmdHYXBDb3VudF96dXJlKCBvZ2NwMWcsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxLCBzZ2FwMSwgZWdhcDEgKTsKCQluZXdfT3BlbmluZ0dhcENvdW50X3p1cmUoIG9nY3AyZywgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIsIHNnYXAyLCBlZ2FwMSApOwoJCW5ld19GaW5hbEdhcENvdW50X3p1cmUoIGZnY3AxZywgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIHNnYXAxLCBlZ2FwMSApOwoJCW5ld19GaW5hbEdhcENvdW50X3p1cmUoIGZnY3AyZywgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIsIHNnYXAxLCBlZ2FwMiApOwoJCWdldGRpZ2FwZnJlcV9wYXJ0KCBkaWdmMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIHNnYXAxLCBlZ2FwMSApOyAvLyBzZ2FwMSBoYSBpcmFuYWkgPwoJCWdldGRpZ2FwZnJlcV9wYXJ0KCBkaWdmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIsIHNnYXAyLCBlZ2FwMiApOyAvLyBzZ2FwMSBoYSBpcmFuYWkgPwoJCWdldGRpYW1pbm9mcmVxX3BhcnQoIGRpYWYxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSwgc2dhcDEsIGVnYXAxICk7IC8vIHNnYXAxIGhhIGlyYW5haSA/CgkJZ2V0ZGlhbWlub2ZyZXFfcGFydCggZGlhZjIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMSwgZWdhcDIgKTsgLy8gc2dhcDEgaGEgaXJhbmFpID8KCQlnZXRnYXBmcmVxKCBnYXBmMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsgLy8gYXRvZGUKCQlnZXRnYXBmcmVxKCBnYXBmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsgLy8gYXRvZGUKCQlnZXRnYXBmcmVxX3p1cmUoIGdhcHoxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOyAvLyBhdG9kZQoJCWdldGdhcGZyZXFfenVyZSggZ2FwejIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7IC8vIGF0b2RlCgl9CgllbHNlCgl7CgkJc3RfT3BlbmluZ0dhcENvdW50KCBvZ2NwMWcsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJc3RfT3BlbmluZ0dhcENvdW50KCBvZ2NwMmcsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJc3RfRmluYWxHYXBDb3VudF96dXJlKCBmZ2NwMWcsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJc3RfRmluYWxHYXBDb3VudF96dXJlKCBmZ2NwMmcsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJc3RfZ2V0R2FwUGF0dGVybiggZ2FwcGF0MSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlzdF9nZXRHYXBQYXR0ZXJuKCBnYXBwYXQyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJCWdldGRpZ2FwZnJlcV9zdCggZGlnZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJZ2V0ZGlnYXBmcmVxX3N0KCBkaWdmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlnZXRkaWFtaW5vZnJlcV94KCBkaWFmMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlnZXRkaWFtaW5vZnJlcV94KCBkaWFmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlnZXRnYXBmcmVxKCBnYXBmMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlnZXRnYXBmcmVxKCBnYXBmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlnZXRnYXBmcmVxX3p1cmUoIGdhcHoxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCWdldGdhcGZyZXFfenVyZSggZ2FwejIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7Cgl9CgojaWYgMAoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJCWZwcmludGYoIHN0ZGVyciwgIm9nY3AxWyVkXT0lZlxuIiwgaSwgb2djcDFbaV0gKTsKI2VuZGlmCgoJY3VycmVudHcgPSB3MTsKCXByZXZpb3VzdyA9IHcyOwoKCW1hdGNoX2NhbGMoIGluaXR2ZXJ0aWNhbHcsIGNwbXgyLCBjcG14MSwgMCwgbGd0aDEsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoJaWYoIGxvY2FsaG9tICkKCQlpbXBfbWF0Y2hfb3V0X3ZlYWRfdGF0ZUgoIGluaXR2ZXJ0aWNhbHcsIDAsIGxndGgxICk7IC8vIDA2MDMwNgoKCW1hdGNoX2NhbGMoIGN1cnJlbnR3LCBjcG14MSwgY3BteDIsIDAsIGxndGgyLCBmbG9hdHdvcmssIGludHdvcmssIDEgKTsKCWlmKCBsb2NhbGhvbSApCgkJaW1wX21hdGNoX291dF92ZWFkSCggY3VycmVudHcsIDAsIGxndGgyICk7IC8vIDA2MDMwNgoKCiNpZiAwIC8vIC0+IHRiZmFzdC5jCglpZiggbG9jYWxob20gKQoJCWltcF9tYXRjaF9jYWxjKCBjdXJyZW50dywgaWN5YywgamN5YywgbGd0aDEsIGxndGgyLCBzZXExLCBzZXEyLCBlZmYxLCBlZmYyLCBsb2NhbGhvbSwgMSwgMCApOwoKI2VuZGlmCgoJaWYoIG91dGdhcCA9PSAxICkKCXsKLy8JCWlmKCBnICkgZnByaW50Ziggc3RkZXJyLCAiaW5pdC1tYXRjaCBwZW5hbDE9JWYsICVjLSVjXG4iLCBnLCBzZXExWzBdWzBdLCBzZXEyWzBdWzBdICk7Ci8vCQlpbml0dmVydGljYWx3WzBdICs9IGc7Ci8vCQljdXJyZW50d1swXSArPSBnOwoKLy8JCWlmKCBnICkgZnByaW50Ziggc3RkZXJyLCAiaW5pdC1tYXRjaCBwZW5hbDI9JWYsICVjLSVjXG4iLCBnLCBzZXExWzBdWzBdLCBzZXEyWzBdWzBdICk7Ci8vCQlpbml0dmVydGljYWx3WzBdICs9IGc7Ci8vCQljdXJyZW50d1swXSArPSBnOwoKCQlmb3IoIGk9MTsgaTxsZ3RoMSsxOyBpKysgKQoJCXsKLy8JCQlpbml0dmVydGljYWx3W2ldICs9ICggb2djcDFbMF0gKyBmZ2NwMVtpLTFdICkgOwoKCQkJdG1wcGVuYWwgPSAwLjA7Ci8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwZjJbai0xXSkqKDEuMC1vZ2NwMWdbaV0rZmdjcDFnW2ldKSArIGdhcGYyW2otMV0qKDEuMC1kaWdmMVtpXS1kaWFmMVtpXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbMF0pKigxLjAtb2djcDFnWzBdKzAuMCkgKyBnYXB6MlswXSooMS4wLWRpZ2YxWzBdIC0gZGlhZjFbMF0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJCXRtcHBlbmFsID0gKCAoMS4wLTAuMCkqKDEuMC1vZ2NwMWdbMF0rMC4wKSArIDAuMCooMS4wLTAuMC0wLjApICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJCXRtcHBlbmFsID0gMC41ICogZnBlbmFsdHk7Ci8vCQkJdG1wcGVuYWwgLT0gKCAoMS4wLTAuMCkgKiAoMS4wLWRpYWYxWzBdKSArIDAuMCApICogMC41ICogZnBlbmFsdHk7IC8vIDAuCi8vCQkJdG1wcGVuYWwgLT0gKCAoMS4wLWdhcGYyW2otMV0pICogb2djcDFnW2ldICsgZ2FwZjJbai0xXSApICogMC41ICogZnBlbmFsdHk7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiMCwwPC0lZCwlZCwgdG1wcGVuYWwgMSA9ICVmXG4iLCBpLCAwLCB0bXBwZW5hbCApOwoJCQlpbml0dmVydGljYWx3W2ldICs9IHRtcHBlbmFsOwoKCQkJdG1wcGVuYWwgPSBkaWFmMVtpXSAqICggMS4wIC0gZ2FwZjJbMF0gKSAqIGZwZW5hbHR5OwoJCQlpZiggZ2FwcGF0MVtpXVswXS5mcmVxICkKCQkJewoJCQkJdG1wcGVuYWwgKz0gKCBnYXBwYXQxW2ldWzBdLmZyZXEgKSAqICggMS4wIC0gZ2FwZjJbMF0gKSAqIGZwZW5hbHR5OwoJCQkJdG1wcGVuYWwgLT0gKCBjb3VudG5vY291bnR4KCBnYXBwYXQyWzBdLCBkaWFmMlswXSwgZ2FwcGF0MVtpXSwgaSwgMSApICkgKiBmcGVuYWx0eTsKCQkJfQovLwkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcGYyW2pdKSooMS4wLWZnY3AxZ1tpXStvZ2NwMWdbaV0pICsgZ2FwZjJbal0qKDEuMC1kaWdmMVtpXS1kaWFmMVtpXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbMV0pKigxLjAtZmdjcDFnW2ldK29nY3AxZ1tpXSkgKyBnYXB6MlsxXSooMS4wLWRpZ2YxW2ldLWRpYWYxW2ldKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXBmMlswXSkqKDEuMC1mZ2NwMWdbaV0rb2djcDFnW2ldKSArIGdhcGYyWzBdKigxLjAtZGlnZjFbaV0tZGlhZjFbaV0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJCXRtcHBlbmFsID0gMC41ICogZnBlbmFsdHk7Ci8vCQkJdG1wcGVuYWwgLT0gKCAoMS4wLWdhcGYyWzBdKSAqICgxLjAtZGlhZjFbaV0pICsgZ2FwZjJbMF0gKSAqIDAuNSAqIGZwZW5hbHR5OwovLwkJCXRtcHBlbmFsIC09ICggKDEuMC1nYXBmMltqXSkgKiBmZ2NwMWdbaV0gKyBnYXBmMltqXSApICogMC41ICogZnBlbmFsdHk7CgkJCWluaXR2ZXJ0aWNhbHdbaV0gKz0gdG1wcGVuYWw7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiMCwwPC0lZCwlZCwgdG1wcGVuYWwgMiA9ICVmLCBjdW1wZW5hbD0lZiwgZmdjcDFnW2ldPSVmLCBvZ2NwMWdbaV09JWZcbiIsIGksIDAsIHRtcHBlbmFsLCBjdW1wZW5hbCwgZmdjcDFnW2ldLCBvZ2NwMWdbaV0gKTsKCgkJfQoJCWN1bXBlbmFsID0gMC4wOwoJCWZvciggaj0xOyBqPGxndGgyKzE7IGorKyApCgkJewovLwkJCWN1cnJlbnR3W2pdICs9ICggb2djcDJbMF0gKyBmZ2NwMltqLTFdICkgOwoKCQkJdG1wcGVuYWwgPSAwLjA7Ci8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwZjFbaS0xXSkqKDEuMC1vZ2NwMmdbal0rZmdjcDJnW2pdKSArIGdhcGYxW2ktMV0qKDEuMC1kaWdmMltqXS1kaWFmMltqXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejFbMF0pKigxLjAtb2djcDJnWzBdKzAuMCkgKyBnYXB6MVswXSooMS4wLWRpZ2YyW2pdLWRpYWYyW2pdKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC0wLjApKigxLjAtb2djcDJnWzBdKzAuMCkgKyAwLjAqKDEuMC0wLjAtMC4wKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9IDAuNSAqIGZwZW5hbHR5OwovLwkJCXRtcHBlbmFsIC09ICggKDEuMC0wLjApICogKDEuMC1kaWFmMlswXSkgKyAwLjAgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyAwLgovLwkJCXRtcHBlbmFsIC09ICggKDEuMC1nYXBmMVswXSkgKiBmZ2NwMmdbal0gKyBnYXBmMVswXSApICogMC41ICogZnBlbmFsdHk7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiMCwwPC0lZCwlZCwgdG1wcGVuYWwgMyA9ICVmXG4iLCAwLCBqLCB0bXBwZW5hbCApOwoJCQljdXJyZW50d1tqXSArPSB0bXBwZW5hbDsKCgkJCXRtcHBlbmFsID0gZGlhZjJbal0gKiAoIDEuMCAtIGdhcGYxWzBdICkgKiBmcGVuYWx0eTsKCQkJaWYoIGdhcHBhdDJbal1bMF0uZnJlcSApCgkJCXsKCQkJCXRtcHBlbmFsICs9ICggZ2FwcGF0MltqXVswXS5mcmVxICkgKiAoIDEuMCAtIGdhcGYxWzBdICkgKiBmcGVuYWx0eTsKCQkJCXRtcHBlbmFsIC09ICggY291bnRub2NvdW50eCggZ2FwcGF0MVswXSwgZGlhZjFbMF0sIGdhcHBhdDJbal0sIGosIDEgKSApICogZnBlbmFsdHk7CgkJCX0KLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXBmMVtpXSkqKDEuMC1mZ2NwMmdbal0rb2djcDJnW2pdKSArIGdhcGYxW2ldKigxLjAtZGlnZjJbal0tZGlhZjJbal0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcHoxWzFdKSooMS4wLWZnY3AyZ1tqXStvZ2NwMmdbal0pICsgZ2FwejFbMV0qKDEuMC1kaWdmMltqXS1kaWFmMltqXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwZjFbMF0pKigxLjAtZmdjcDJnW2pdK29nY3AyZ1tqXSkgKyBnYXBmMVswXSooMS4wLWRpZ2YyW2pdLWRpYWYyW2pdKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9IDAuNSAqIGZwZW5hbHR5OwovLwkJCXRtcHBlbmFsIC09ICggKDEuMC1nYXBmMVswXSkgKiAoMS4wLWRpYWYyW2pdKSArIGdhcGYxWzBdICkgKiAwLjUgKiBmcGVuYWx0eTsKLy8JCQl0bXBwZW5hbCAtPSAoICgxLjAtZ2FwZjFbMF0pICogb2djcDJnW2pdICsgZ2FwZjFbaS0xXSApICogMC41ICogZnBlbmFsdHk7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiMCwwPC0lZCwlZCwgdG1wcGVuYWwgNCA9ICVmXG4iLCAwLCBqLCB0bXBwZW5hbCApOwoJCQljdXJyZW50d1tqXSArPSB0bXBwZW5hbDsKCQl9Cgl9CiNpZiBPVVRHQVAwVFJZCgllbHNlCgl7CgkJZm9yKCBqPTE7IGo8bGd0aDIrMTsgaisrICkKCQkJY3VycmVudHdbal0gLT0gb2Zmc2V0ICogaiAvIDIuMDsKCQlmb3IoIGk9MTsgaTxsZ3RoMSsxOyBpKysgKQoJCQlpbml0dmVydGljYWx3W2ldIC09IG9mZnNldCAqIGkgLyAyLjA7Cgl9CiNlbmRpZgoKCW1bMF0gPSAwLjA7IC8vIGlyYW5haQoJZm9yKCBqPTE7IGo8bGd0aDIrMTsgKytqICkgCgl7Ci8vCQltW2pdID0gY3VycmVudHdbai0xXSArIG9nY3AxWzFdOyAKCQltcFtqXSA9IDA7CgoJCXRtcHBlbmFsID0gMC4wOwovLwkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbal0pKigxLjAtb2djcDFnWzFdK2ZnY3AxZ1sxXSkgKyBnYXB6MltqXSooMS4wLWRpZ2YxWzFdLWRpYWYxWzFdKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCXRtcHBlbmFsID0gKCAoMS4wLWdhcGYyW2otMV0pKigxLjAtb2djcDFnWzFdK2ZnY3AxZ1sxXSkgKyBnYXBmMltqLTFdKigxLjAtZGlnZjFbMV0tZGlhZjFbMV0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwZjJbai0xXSkqKDEuMC1vZ2NwMWdbaV0rZmdjcDFnW2ldKSArIGdhcGYyW2otMV0qKDEuMC1kaWdmMVtpXS1kaWFmMVtpXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQl0bXBwZW5hbCA9IDAuNSAqIGZwZW5hbHR5OwovLwkJdG1wcGVuYWwgLT0gKCAoMS4wLTAuMCkgKiAoMS4wLTAuMCkgKyAwLjAgKSAqIDAuNSAqIGZwZW5hbHR5OwovLwkJdG1wcGVuYWwgLT0gKCAoMS4wLWdhcGYyWy0xXSkgKiAoMS4wLWRpYWYxWzBdKSArIGdhcGYyWy0xXSApICogMC41ICogZnBlbmFsdHk7Ci8vCQlpZiggdG1wcGVuYWwgKSBmcHJpbnRmKCBzdGRlcnIsICIlYz0lYywgZW5kIGogdG1wcGVuYWw9JWZcbiIsIHNlcTFbMF1bMF0sIHNlcTJbMF1bai0xXSwgdG1wcGVuYWwgKTsKCQltW2pdID0gY3VycmVudHdbai0xXSArIHRtcHBlbmFsICsgZnBlbmFsdHkgKiAxMDAwMDsgIAovLwkJbVtqXSA9IGN1cnJlbnR3W2otMV0gKyBvZ2NwMVsxXTsgCgl9CglpZiggbGd0aDIgPT0gMCApCgkJbGFzdHZlcnRpY2Fsd1swXSA9IDAuMDsgLy8gRmFsaWduIGthcmEgeW9iYXJldGF0b2tpIGtvdW5hcnVrYW5vdXNlaSBhcmkKCWVsc2UKCQlsYXN0dmVydGljYWx3WzBdID0gY3VycmVudHdbbGd0aDItMV07CgoJaWYoIG91dGdhcCApIGxhc3RpID0gbGd0aDErMTsgZWxzZSBsYXN0aSA9IGxndGgxOwoKI2lmIFhYWFhYWFgKZnByaW50Ziggc3RkZXJyLCAiY3VycmVudHcgPSBcbiIgKTsKZm9yKCBpPTA7IGk8bGd0aDErMTsgaSsrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgY3VycmVudHdbaV0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKZnByaW50Ziggc3RkZXJyLCAiaW5pdHZlcnRpY2FsdyA9IFxuIiApOwpmb3IoIGk9MDsgaTxsZ3RoMisxOyBpKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICIlNS4yZiAiLCBpbml0dmVydGljYWx3W2ldICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImZjZ3BcbiIgKTsKZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJZnByaW50Ziggc3RkZXJyLCAiZmdjcDFbJWRdPSVmXG4iLCBpLCBvZ2NwMVtpXSApOwpmb3IoIGk9MDsgaTxsZ3RoMjsgaSsrICkgCglmcHJpbnRmKCBzdGRlcnIsICJmZ2NwMlslZF09JWZcbiIsIGksIG9nY3AyW2ldICk7CiNlbmRpZgoKCWZvciggaT0xOyBpPGxhc3RpOyBpKysgKQoJewoJCXd0bXAgPSBwcmV2aW91c3c7IAoJCXByZXZpb3VzdyA9IGN1cnJlbnR3OwoJCWN1cnJlbnR3ID0gd3RtcDsKCgkJcHJldmlvdXN3WzBdID0gaW5pdHZlcnRpY2Fsd1tpLTFdOwoKCQltYXRjaF9jYWxjKCBjdXJyZW50dywgY3BteDEsIGNwbXgyLCBpLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAwICk7CiNpZiBYWFhYWFhYCmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJpPSVkXG4iLCBpICk7CmZwcmludGYoIHN0ZGVyciwgImN1cnJlbnR3ID0gXG4iICk7CmZvciggaj0wOyBqPGxndGgyOyBqKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICIlNS4yZiAiLCBjdXJyZW50d1tqXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwojZW5kaWYKCQlpZiggbG9jYWxob20gKQoJCXsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJDYWxsaW5nIGltcF9tYXRjaF9jYWxjIChvKSBsZ3RoID0gJWQsIGkgPSAlZFxuIiwgbGd0aDEsIGkgKTsKI2lmICAwCgkJCWltcF9tYXRjaF9vdXRfdmVhZEgoIGN1cnJlbnR3LCBpLCBsZ3RoMiApOwojZWxzZQoJCQlpbXBfbWF0Y2hfb3V0X3ZlYWRIKCBjdXJyZW50dywgaSwgbGd0aDIgKTsKI2VuZGlmCgkJfQojaWYgWFhYWFhYWApmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKZnByaW50Ziggc3RkZXJyLCAiaT0lZFxuIiwgaSApOwpmcHJpbnRmKCBzdGRlcnIsICJjdXJyZW50dyA9IFxuIiApOwpmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgY3VycmVudHdbal0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgkJY3VycmVudHdbMF0gPSBpbml0dmVydGljYWx3W2ldOwoKCi8vCQltaSA9IHByZXZpb3Vzd1swXSArIG9nY3AyWzFdOyAgLy8gbWFjaGlnYWkKCQl0bXBwZW5hbCA9IDAuMDsKLy8JCXRtcHBlbmFsID0gKCAoMS4wLWdhcHoxW2ldKSooMS4wLW9nY3AyZ1sxXStmZ2NwMmdbMV0pICsgZ2FwejFbaV0qKDEuMC1kaWdmMlsxXS1kaWFmMlsxXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQl0bXBwZW5hbCA9ICggKDEuMC1nYXBmMVtpLTFdKSooMS4wLW9nY3AyZ1sxXStmZ2NwMmdbMV0pICsgZ2FwZjFbaS0xXSooMS4wLWRpZ2YyWzFdLWRpYWYyWzFdKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCWZwcmludGYoIHN0ZGVyciwgIiVjPSVjLCBlbmQgaSB0bXBwZW5hbD0lZiwgb2djcDJnWzFdPSVmXG4iLCBzZXExWzBdW2ktMV0sIHNlcTJbMF1bMF0sIHRtcHBlbmFsLCBvZ2NwMmdbMV0gKTsKLy8JCW1pID0gcHJldmlvdXN3WzBdICsgdG1wcGVuYWw7CgkJbWkgPSBwcmV2aW91c3dbMF0gKyB0bXBwZW5hbCArIGZwZW5hbHR5ICogMTAwMDA7CgoJCW1waSA9IDA7CgkJaWpwcHQgPSBpanBbaV0gKyAxOwoJCW1qcHQgPSBtICsgMTsKCQlwcmVwdCA9IHByZXZpb3VzdzsKCQljdXJwdCA9IGN1cnJlbnR3ICsgMTsKCQltcGpwdCA9IG1wICsgMTsKCQlmZ2NwMnB0ID0gZmdjcDI7CgkJb2djcDJwdCA9IG9nY3AyICsgMTsKCQlmZ2NwMXZhID0gZmdjcDFbaS0xXTsKCQlvZ2NwMXZhID0gb2djcDFbaV07CgkJbGFzdGogPSBsZ3RoMisxOwoJCWZvciggaj0xOyBqPGxhc3RqOyBqKysgKQoJCXsKCQkJd20gPSAqcHJlcHQ7CgoJCQlpZiggZ2FwcGF0MltqXVswXS5mcmVxICkKCQkJewoJCQkJZyA9IGRpYWYxW2ldICogZ2FwcGF0MltqXVswXS5mcmVxICogZnBlbmFsdHk7Ci8vCQkJCWlmKCBzZXExWzBdW2ldID09ICdEJyAmJiBzZXEyWzBdW2pdID09ICdEJyApCi8vCQkJCWlmKCBnICkgZnByaW50Ziggc3RkZXJyLCAibWF0Y2ggcGVuYWwxPSVmLCAlYy0lY1xuIiwgZy9mcGVuYWx0eSwgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoJCQkJd20gKz0gZzsKCQkJfQoKCQkJaWYoIGdhcHBhdDFbaV1bMF0uZnJlcSApCgkJCXsKCQkJCWcgPSBkaWFmMltqXSAqIGdhcHBhdDFbaV1bMF0uZnJlcSAqIGZwZW5hbHR5OwovLwkJCQlpZiggc2VxMVswXVtpXSA9PSAnRCcgJiYgc2VxMlswXVtqXSA9PSAnRCcgKQovLwkJCQlpZiggZyApIGZwcmludGYoIHN0ZGVyciwgIm1hdGNoIHBlbmFsMj0lZiwgJWMtJWNcbiIsIGcvZnBlbmFsdHksIHNlcTFbMF1baV0sIHNlcTJbMF1bal0gKTsKCQkJCXdtICs9IGc7CgkJCX0KCQkJewoJCQkJZyA9ICggKGdhcHBhdDFbaV1bMF0uZnJlcSkgKiAoZ2FwcGF0MltqXVswXS5mcmVxKSApICogZnBlbmFsdHk7Ci8vCQkJCWlmKCBzZXExWzBdW2ldID09ICdEJyAmJiBzZXEyWzBdW2pdID09ICdEJyApCi8vCQkJCWlmKCBnICkgZnByaW50Ziggc3RkZXJyLCAibWF0Y2ggcGVuYWwzPSVmLCAlYy0lY1xuIiwgZy9mcGVuYWx0eSwgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoJCQkJd20gKz0gZzsKCQkJfQoJCQlpZiggMCApCgkJCXsKCQkJCW1hZWdhcCA9IGlqcFtpLTFdW2otMV07Ci8vCQkJCWlmKCBzZXExWzBdW2ldID09ICdZJyAmJiBzZXEyWzBdW2pdID09ICdZJyApCi8vCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJpLGo9JWQsJWQsIG1hZWdhcD0lZFxuIiwgaSwgaiwgbWFlZ2FwICk7CgkJCQltYWVnYXAgPSAwOwoKCQkJCWlmKCBtYWVnYXAgPT0gMCApCgkJCQl7CgkJCQkgCWcgPSAoIGNvdW50bm9jb3VudG1hdGNoeCggZ2FwcGF0MVtpXSwgZ2FwcGF0MltqXSwgMCwgMCwgMCApICkgKiBmcGVuYWx0eTsKLy8JCQkJCWlmKCBzZXExWzBdW2ldID09ICdEJyAmJiBzZXEyWzBdW2pdID09ICdEJyApCi8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAia2Fud2EwICVjLSVjLCBpLGo9JWQsJWQsIGcvZnBlbmFsdHk9JWYsIG5vY291bnQ9JWZcbiIsIHNlcTFbMF1baV0sIHNlcTJbMF1bal0sIGksIGosIGcvZnBlbmFsdHksIGNvdW50bm9jb3VudG1hdGNoeCggZ2FwcGF0MVtpXSwgZ2FwcGF0MltqXSwgMCwgLW1hZWdhcCwgMSApICk7CgkJCQl9CiNpZiAwIC8vIGF0dGEgaG91Z2EgeW9pIGhhenUKCQkJCWVsc2UgaWYoIG1hZWdhcCA8IDAgKSAvLyBpIGp1bXAKCQkJCXsKCQkJCSAJZyA9ICggY291bnRub2NvdW50bWF0Y2h4KCBnYXBwYXQxW2ldLCBnYXBwYXQyW2pdLCAwLCAtbWFlZ2FwLCAwICkgKSAqIGZwZW5hbHR5OwoJCQkJCWlmKCBzZXExWzBdW2ldID09ICdZJyAmJiBzZXEyWzBdW2pdID09ICdZJyApCgkJCQkJewoJCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJpLWp1bXBlZCwgb2Zmc2V0MT0lZFxuIiwgbWFlZ2FwICk7CgkJCQkJCWZwcmludGYoIHN0ZGVyciwgImthbndhMSAlYy0lYywgaSxqPSVkLCVkLCBnL2ZwZW5hbHR5PSVmLCBub2NvdW50PSVmLCBub2NvdW50PSVmXG4iLCBzZXExWzBdW2ldLCBzZXEyWzBdW2pdLCBpLCBqLCBnL2ZwZW5hbHR5LCBjb3VudG5vY291bnRtYXRjaHgoIGdhcHBhdDFbaV0sIGdhcHBhdDJbal0sIDAsIC1tYWVnYXAsIDAgKSApOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UgICAgICAgICAgICAgICAgICAvLyBqIGp1bXAKCQkJCXsKCQkJCSAJZyA9ICggY291bnRub2NvdW50bWF0Y2h4KCBnYXBwYXQxW2ldLCBnYXBwYXQyW2pdLCBtYWVnYXAsIDAsIDAgKSApICogZnBlbmFsdHk7CgkJCQkJaWYoIHNlcTFbMF1baV0gPT0gJ1knICYmIHNlcTJbMF1bal0gPT0gJ1knICkKCQkJCQl7CgkJCQkJCWZwcmludGYoIHN0ZGVyciwgImotanVtcGVkLCBvZmZzZXQxPSVkXG4iLCBtYWVnYXAgKTsKCQkJCQkJZnByaW50Ziggc3RkZXJyLCAia2Fud2EyLCAlYy0lYywgaSxqPSVkLCVkLCBnL2ZwZW5hbHR5PSVmLCBub2NvdW50PSVmXG4iLCBzZXExWzBdW2ldLCBzZXEyWzBdW2pdLCBpLCBqLCBnL2ZwZW5hbHR5LCBjb3VudG5vY291bnRtYXRjaHgoIGdhcHBhdDFbaV0sIGdhcHBhdDJbal0sIDAsIC1tYWVnYXAsIDEgKSApOwoJCQkJCX0KCQkJCX0KI2VuZGlmCgkJCQl3bSAtPSBnOwoJCQl9CgoJCQkqaWpwcHQgPSAwOwoKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGYtPiIsIHdtICk7CiNlbmRpZgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZj8iLCBnICk7CiNlbmRpZgovLwkJCXRtcHBlbmFsID0gZnBlbmFsdHk7CgkJCXRtcHBlbmFsID0gZGlhZjJbal0gKiAoIDEuMCAtIGdhcGYxW2ldICkgKiBmcGVuYWx0eTsKCQkJaWYoIGdhcHBhdDJbal1bMF0uZnJlcSApCgkJCXsKCQkJCXRtcHBlbmFsICs9ICggZ2FwcGF0MltqXVswXS5mcmVxICkgKiAoIDEuMCAtIGdhcGYxW2ldICkgKiBmcGVuYWx0eTsKLy8JCQkJdG1wcGVuYWwgLT0gKCBjb3VudG5vY291bnR4KCBnYXBwYXQxW2ldLCBkaWFmMVtpXSwgZ2FwcGF0MltqXSwgai1tcGktMSwgMCApICkgKiBmcGVuYWx0eTsKCQkJCW1hZWdhcCA9IGlqcFtpLTFdW21waV07CgkJCQltYWVnYXAgPSAwOwoJCQkJaWYoIG1hZWdhcCA9PSAwICkKCQkJCXsKCQkJCQl0bXBwZW5hbCAtPSAoIGNvdW50bm9jb3VudHgoIGdhcHBhdDFbaV0sIGRpYWYxW2ldLCBnYXBwYXQyW2pdLCBqLW1waS0xLCAwICkgKSAqIGZwZW5hbHR5OwoJCQkJfQojaWYgMCAvLyBhdHRhaG91Z2EgeW9pIGhhenUKCQkJCWVsc2UgaWYoIG1hZWdhcCA8IDAgKSAvLyBpIGp1bXAKCQkJCXsKCQkJCQltYWVnYXAgPSAtbWFlZ2FwOwoJCQkJCXRtcHBlbmFsIC09ICggY291bnRub2NvdW50eHgoIGdhcHBhdDFbaV0sIGRpYWYxW2ldLCBnYXBwYXQyW2pdLCBqLW1waS0xK21hZWdhcCwgMCApICkgKiBmcGVuYWx0eTsKCQkJCX0KCQkJCWVsc2UgICAgICAgICAgICAgICAgICAvLyBqIGp1bXAKCQkJCXsKCQkJCQl0bXBwZW5hbCAtPSAoIGNvdW50bm9jb3VudHh4KCBnYXBwYXQxW2ldLCBkaWFmMVtpXSwgZ2FwcGF0MltqXSwgai1tcGktMSwgbWFlZ2FwICkgKSAqIGZwZW5hbHR5OwoJCQkJfQojZW5kaWYKCQkJfQoJCQlpZiggKGc9bWkrdG1wcGVuYWwpID4gd20gKQoJCQl7Ci8vCQkJCWlmKCBzZXExWzBdW2ldID09ICdBJyAmJiBzZXEyWzBdW2pdID09ICdBJyApIGZwcmludGYoIHN0ZGVyciwgImp1bXAgaSBzdGFydD0lZiAoaSxqPSVkLCVkLCAqaWpwcHQ9JWQsIGRpZ2YyW2pdPSVmLCBkaWFmMltqXT0lZiksICVjLSVjXG4iLCBnLW1pLCBpLCBqLCAtKGotbXBpKSwgZGlnZjJbal0sIGRpYWYyW2pdLCBzZXExWzBdW2ldLCBzZXEyWzBdW2pdICk7CgkJCQl3bSA9IGc7CgkJCQkqaWpwcHQgPSAtKCBqIC0gbXBpICk7CgkJCX0KCQkJaWYoIChnPSpwcmVwdCkgPj0gbWkgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXAgaSBlbmQ9JWYsICVjLSVjXG4iLCBnLSpwcmVwdCwgc2VxMVswXVtpLTFdLCBzZXEyWzBdW2otMV0gKTsKCQkJCW1pID0gZzsKCQkJCW1waSA9IGotMTsKCQkJfQoJCQllbHNlIGlmKCBqICE9IDEgKQoJCQl7Ci8vCQkJCW1pICs9ICggb2djcDJnW2otMF0gKyBmZ2NwMmdbal0gKSAqIGZwZW5hbHR5ICogMC41OwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICIlYyVjLyVjJWMgZXhwLCBvZz0lZixmZz0lZlxuIiwgJz0nLCAnPScsIHNlcTJbMF1bai0xXSwgc2VxMlswXVtqXSwgb2djcDJnW2otMF0gKiBmcGVuYWx0eSowLjUsIGZnY3AyZ1tqXSAqIGZwZW5hbHR5KjAuNSApOwoJCQl9CiNpZiBVU0VfUEVOQUxUWV9FWAoJCQkJbWkgKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKI2lmIDAgCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmPyIsIGcgKTsKI2VuZGlmCgovLwkJCXRtcHBlbmFsID0gZnBlbmFsdHk7CgkJCXRtcHBlbmFsID0gZGlhZjFbaV0gKiAoIDEuMCAtIGdhcGYyW2pdICkgKiBmcGVuYWx0eTsKCQkJaWYoIGdhcHBhdDFbaV1bMF0uZnJlcSApCgkJCXsKCQkJCXRtcHBlbmFsICs9ICggZ2FwcGF0MVtpXVswXS5mcmVxICkgKiAoIDEuMCAtIGdhcGYyW2pdICkgKiBmcGVuYWx0eTsKLy8JCQkJdG1wcGVuYWwgLT0gKCBjb3VudG5vY291bnR4KCBnYXBwYXQyW2pdLCBkaWFmMltqXSwgZ2FwcGF0MVtpXSwgaS0qbXBqcHQtMSwgMSApICkgKiBmcGVuYWx0eTsKCQkJCW1hZWdhcCA9IGlqcFsqbXBqcHRdW2otMV07CgkJCQlpZiggbWFlZ2FwID09IDAgKQoJCQkJewoJCQkJCXRtcHBlbmFsIC09ICggY291bnRub2NvdW50eCggZ2FwcGF0MltqXSwgZGlhZjJbal0sIGdhcHBhdDFbaV0sIGktKm1wanB0LTEsIDEgKSApICogZnBlbmFsdHk7CgkJCQl9CiNpZiAwIC8vIGF0dGFob3VnYSB5b2kgaGF6dQoJCQkJZWxzZSBpZiggbWFlZ2FwID4gMCApIC8vIGoganVtcAoJCQkJewoJCQkJCXRtcHBlbmFsIC09ICggY291bnRub2NvdW50eHgoIGdhcHBhdDJbal0sIGRpYWYyW2pdLCBnYXBwYXQxW2ldLCBpLSptcGpwdC0xK21hZWdhcCwgMCApICkgKiBmcGVuYWx0eTsKCQkJCX0KCQkJCWVsc2UgICAgICAgICAgICAgICAgICAvLyBpIGp1bXAKCQkJCXsKCQkJCQltYWVnYXAgPSAtbWFlZ2FwOwoJCQkJCXRtcHBlbmFsIC09ICggY291bnRub2NvdW50eHgoIGdhcHBhdDJbal0sIGRpYWYyW2pdLCBnYXBwYXQxW2ldLCBpLSptcGpwdC0xLCBtYWVnYXAgKSApICogZnBlbmFsdHk7CgkJCQl9CiNlbmRpZgoJCQl9CgkJCWlmKCAoZz0qbWpwdCt0bXBwZW5hbCkgPiB3bSApCgkJCXsKLy8JCQkJaWYoIHNlcTFbMF1baV0gPT0gJ1MnICYmIHNlcTJbMF1bal0gPT0gJ1MnICkgZnByaW50Ziggc3RkZXJyLCAianVtcCBqIHN0YXJ0IGF0ICVkLCAlZCwgZz0lZiwgJWMtJWNcbiIsIGksIGosIGctKm1qcHQsIHNlcTFbMF1baV0sIHNlcTJbMF1bal0gKTsKCQkJCXdtID0gZzsKCQkJCSppanBwdCA9ICsoIGkgLSAqbXBqcHQgKTsKCQkJfQoJCQlpZiggKGc9KnByZXB0KSA+PSAqbWpwdCApCgkJCXsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAianVtcCBqIGVuZD0lZiwgJWMtJWNcbiIsIGctKnByZXB0LCBzZXExWzBdW2ktMV0sIHNlcTJbMF1bai0xXSApOwoJCQkJKm1qcHQgPSBnOwoJCQkJKm1wanB0ID0gaS0xOwoJCQl9CgkJCWVsc2UgaWYoIGkgIT0gMSApCgkJCXsKLy8JCQkJbVtqXSArPSAoIG9nY3AxZ1tpLTBdICsgZmdjcDFnW2ldICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiJWMlYy8lYyVjIGV4cCwgb2c9JWYsZmc9JWZcbiIsIHNlcTFbMF1baS0xXSwgc2VxMVswXVtpXSwgJz0nLCAnPScsIG9nY3AxZ1tpLTBdICogZnBlbmFsdHkqMC41LCBmZ2NwMWdbaV0gKiBmcGVuYWx0eSowLjUgKTsKCQkJfQojaWYgVVNFX1BFTkFMVFlfRVgKCQkJbVtqXSArPSBmcGVuYWx0eV9leDsKI2VuZGlmCgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZiAiLCB3bSApOwojZW5kaWYKCQkJKmN1cnB0KysgKz0gd207CgkJCWlqcHB0Kys7CgkJCW1qcHQrKzsKCQkJcHJlcHQrKzsKCQkJbXBqcHQrKzsKCQkJZmdjcDJwdCsrOwoJCQlvZ2NwMnB0Kys7CgkJfQoJCWxhc3R2ZXJ0aWNhbHdbaV0gPSBjdXJyZW50d1tsZ3RoMi0xXTsKCX0KCi8vCWZwcmludGYoIHN0ZGVyciwgIndtID0gJWZcbiIsIHdtICk7CgojaWYgT1VUR0FQMFRSWQoJaWYoICFvdXRnYXAgKQoJewoJCWZvciggaj0xOyBqPGxndGgyKzE7IGorKyApCgkJCWN1cnJlbnR3W2pdIC09IG9mZnNldCAqICggbGd0aDIgLSBqICkgLyAyLjA7CgkJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCQkJbGFzdHZlcnRpY2Fsd1tpXSAtPSBvZmZzZXQgKiAoIGxndGgxIC0gaSAgLyAyLjApOwoJfQojZW5kaWYKCQkKCS8qCglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIGZwcmludGYoIHN0ZGVyciwiJXNcbiIsIHNlcTFbaV0gKTsKCWZwcmludGYoIHN0ZGVyciwgIiMjIyMjXG4iICk7Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKSBmcHJpbnRmKCBzdGRlcnIsIiVzXG4iLCBzZXEyW2pdICk7CglmcHJpbnRmKCBzdGRlcnIsICI9PT09PiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIHN0cmNweSggbXNlcTFbaV0sIHNlcTFbaV0gKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIHN0cmNweSggbXNlcTJbal0sIHNlcTJbal0gKTsKCSovCglpZiggbG9jYWxob20gKQoJewoJCUF0cmFja2luZ19sb2NhbGhvbSggaW1wbWF0Y2gsIGN1cnJlbnR3LCBsYXN0dmVydGljYWx3LCBzZXExLCBzZXEyLCBtc2VxMSwgbXNlcTIsIGNwbXgxLCBjcG14MiwgaWpwLCBpY3ljLCBqY3ljICk7Cgl9CgllbHNlCgkJQXRyYWNraW5nKCBjdXJyZW50dywgbGFzdHZlcnRpY2Fsdywgc2VxMSwgc2VxMiwgbXNlcTEsIG1zZXEyLCBjcG14MSwgY3BteDIsIGlqcCwgaWN5YywgamN5YyApOwoKLy8JZnByaW50Ziggc3RkZXJyLCAiIyMjIGltcG1hdGNoID0gJWZcbiIsICppbXBtYXRjaCApOwoKCXJlc3VsdGxlbiA9IHN0cmxlbiggbXNlcTFbMF0gKTsKCWlmKCBhbGxvY2xlbiA8IHJlc3VsdGxlbiB8fCByZXN1bHRsZW4gPiBOICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJhbGxvY2xlbj0lZCwgcmVzdWx0bGVuPSVkLCBOPSVkXG4iLCBhbGxvY2xlbiwgcmVzdWx0bGVuLCBOICk7CgkJRXJyb3JFeGl0KCAiTEVOR1RIIE9WRVIhXG4iICk7Cgl9CgoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIHN0cmNweSggc2VxMVtpXSwgbXNlcTFbaV0gKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIHN0cmNweSggc2VxMltqXSwgbXNlcTJbal0gKTsKCS8qCglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtc2VxMVtpXSApOwoJZnByaW50Ziggc3RkZXJyLCAiIyMjIyNcbiIgKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtc2VxMltqXSApOwoJKi8KCglmcHJpbnRmKCBzdGRlcnIsICJ3bSA9ICVmXG4iLCB3bSApOwoKCWZvciggaT0wOyBpPGxndGgxKzE7IGkrKyApIAoJewoJCWZyZWUoIGdhcHBhdDFbaV0gKTsKCQlnYXBwYXQxW2ldID0gTlVMTDsKCX0KCWZvciggaT0wOyBpPGxndGgyKzE7IGkrKyApIAoJewoJCWZyZWUoIGdhcHBhdDJbaV0gKTsKCQlnYXBwYXQyW2ldID0gTlVMTDsKCX0KCglyZXR1cm4oIHdtICk7Cn0KCg==