LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gQEBAIFNUQVJUIENPUFlSSUdIVCBAQEAKLy8KLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQovLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQovLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQovLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwovLyB1bmRlciB0aGUgTGljZW5zZS4KLy8KLy8gQEBAIEVORCBDT1BZUklHSFQgQEBACioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiAtKi1DKystKi0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEZpbGU6ICAgICAgICAgRXhFeGVVdGlsRXhwbGFpbi5jcHAKICogRGVzY3JpcHRpb246ICAKICogICAgICAgICAgICAgICAKICogICAgICAgICAgICAgICAKICogTGFuZ3VhZ2U6ICAgICBDKysKICoKICoKICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKI2luY2x1ZGUgIkNvbUNleHRkZWNzLmgiCiNpbmNsdWRlICAiY2xpX3N0ZGguaCIKI2luY2x1ZGUgICJleF9zdGRoLmgiCiNpbmNsdWRlICAic3FsX2lkLmgiCiNpbmNsdWRlICAiZXhfdHJhbnNhY3Rpb24uaCIKI2luY2x1ZGUgICJDb21UZGIuaCIKI2luY2x1ZGUgICJleF90Y2IuaCIKI2luY2x1ZGUgICJDb21TcWxJZC5oIgoKI2luY2x1ZGUgICJFeEV4ZVV0aWwuaCIKI2luY2x1ZGUgICJleF9leGVfc3RtdF9nbG9iYWxzLmgiCiNpbmNsdWRlICAiZXhwX2V4cHIuaCIKI2luY2x1ZGUgICJleHBfY2xhdXNlX2Rlcml2ZWQuaCIKI2luY2x1ZGUgICJDb21SdFV0aWxzLmgiCiNpbmNsdWRlICAiRXhTdGF0cy5oIgoKI2luY2x1ZGUgIlNxbFBhcnNlckdsb2JhbHNFbnVtLmgiCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGU6Ci8vCi8vIGNsYXNzIEV4RXhlVXRpbERpc3BsYXlFeHBsYWluCi8vIGNsYXNzIEV4RXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleAovLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpleF90Y2IgKiBFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblRkYjo6YnVpbGQoZXhfZ2xvYmFscyAqIGdsb2IpCnsKICBFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblRjYiAqIGV4ZV91dGlsX3RjYjsKCiAgZXhlX3V0aWxfdGNiID0gbmV3KGdsb2ItPmdldFNwYWNlKCkpIEV4RXhlVXRpbERpc3BsYXlFeHBsYWluVGNiKCp0aGlzLCBnbG9iKTsKCiAgZXhlX3V0aWxfdGNiLT5yZWdpc3RlclN1YnRhc2tzKCk7CgogIHJldHVybiAoZXhlX3V0aWxfdGNiKTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBDb25zdHJ1Y3RvciBmb3IgY2xhc3MgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5UY2IKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkV4RXhlVXRpbERpc3BsYXlFeHBsYWluVGNiOjpFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblRjYigKICAgICBjb25zdCBDb21UZGJFeGVVdGlsRGlzcGxheUV4cGxhaW4gJiBleGVfdXRpbF90ZGIsCiAgICAgZXhfZ2xvYmFscyAqIGdsb2IpCiAgICAgOiBFeEV4ZVV0aWxUY2IoIGV4ZV91dGlsX3RkYiwgTlVMTCwgZ2xvYiksCiAgICAgIG1vZHVsZV8oTlVMTCksCiAgICAgICBzdG10XyhOVUxMKSwKICAgICAgIHNxbF9zcmNfKE5VTEwpLAogICAgICAgaW5wdXRfZGVzY18oTlVMTCksCiAgICAgICBvdXRwdXRfZGVzY18oTlVMTCksCiAgICAgICBvdXRwdXRCdWZfKE5VTEwpLAogICAgICAgZXhwbGFpblF1ZXJ5XyhOVUxMKSwKICAgICAgIGNudExpbmVzXygwKSwKICAgICAgIG5leHRMaW5lXygwKSwKICAgICAgIGhlYWRlcl8oMCksCiAgICAgICBsYXN0RnJhZ18oMCkKewogIC8vIEFsbG9jYXRlIHRoZSBwcml2YXRlIHN0YXRlIGluIGVhY2ggZW50cnkgb2YgdGhlIGRvd24gcXVldWUKICBxcGFyZW50Xy5kb3duLT5hbGxvY2F0ZVBzdGF0ZSh0aGlzKTsKCiAgTUxJTkUgPSBleGVfdXRpbF90ZGIuY29sRGVzY1NpemVfIC8gNTAgKyAxNDsKICBNTEVOID0gZXhlX3V0aWxfdGRiLm91dHB1dFJvd1NpemVfOwogIE1XSURFID0gTUxFTiAtIDE7CgogIGxpbmVzXyA9IG5ldyhnZXRNeUhlYXAoKSkgY2hhcipbTUxJTkVdOwogIGZvciAoTG5nMzIgaSA9IDA7IGkgPCBNTElORTsgaSsrKQogICAgewogICAgICBsaW5lc19baV0gPSBuZXcoZ2V0TXlIZWFwKCkpIGNoYXJbTUxFTl07CiAgICB9CiAgb3B0Rk91dHB1dCA9IG5ldyhnZXRNeUhlYXAoKSkgY2hhcltNTEVOXTsKfQoKRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5UY2I6On5FeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblRjYigpCnsKICBpZiAobGluZXNfKQogICAgewogICAgICBmb3IgKExuZzMyIGkgPSAwOyBpIDwgTUxJTkU7IGkrKykKCXsKCSAgTkFERUxFVEVCQVNJQyhsaW5lc19baV0sIGdldE15SGVhcCgpKTsKCX0KCiAgICAgIE5BREVMRVRFQkFTSUMobGluZXNfLCBnZXRNeUhlYXAoKSk7CiAgICB9CgogIGlmIChvcHRGT3V0cHV0KQogICAgTkFERUxFVEVCQVNJQyhvcHRGT3V0cHV0LCBnZXRNeUhlYXAoKSk7CiAgaWYgKGV4cGxhaW5RdWVyeV8pCiAgICB7CiAgICAgIE5BREVMRVRFQkFTSUMoZXhwbGFpblF1ZXJ5XywgZ2V0TXlIZWFwKCkpOwogICAgICBleHBsYWluUXVlcnlfID0gTlVMTDsKICAgIH0KfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFJlZGVmaW5lIHZpcnR1YWwgbWV0aG9kIGFsbG9jYXRlUHN0YXRlcywgdG8gYmUgdXNlZCBieSBkeW5hbWljIHF1ZXVlCi8vIHJlc2l6aW5nLCBhcyB3ZWxsIGFzIHRoZSBpbml0aWFsIHF1ZXVlIGNvbnN0cnVjdGlvbi4KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmV4X3RjYl9wcml2YXRlX3N0YXRlICogRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5UY2I6OmFsbG9jYXRlUHN0YXRlcygKICAgICBMbmczMiAmbnVtRWxlbXMsICAgICAgLy8gaW5vdXQsIGRlc2lyZWQvYWN0dWFsIGVsZW1lbnRzCiAgICAgTG5nMzIgJnBzdGF0ZUxlbmd0aCkgIC8vIG91dCwgbGVuZ3RoIG9mIG9uZSBlbGVtZW50CnsKICBQc3RhdGVBbGxvY2F0b3I8RXhFeGVVdGlsRGlzcGxheUV4cGxhaW5Qcml2YXRlU3RhdGU+IHBhOwoKICByZXR1cm4gcGEuYWxsb2NhdGVQc3RhdGVzKHRoaXMsIG51bUVsZW1zLCBwc3RhdGVMZW5ndGgpOwp9CgpzdGF0aWMgY29uc3QgUXVlcnlTdHJpbmcgZGlzcGxheUV4cGxhaW5RdWVyeVtdID0KewogIHsiIHNlbGVjdCB0cmFuc2xhdGUoY2FzZSB3aGVuIG1vZHVsZV9uYW1lIGlzIG51bGwgdGhlbiBjYXN0KF91Y3MyJz8nIGFzIGNoYXIoNjApIGNoYXJhY3RlciBzZXQgdWNzMiBub3QgbnVsbCkgIn0sCiAgeyIgZWxzZSBjYXN0KG1vZHVsZV9uYW1lIGFzIGNoYXIoNjApIGNoYXJhY3RlciBzZXQgdWNzMiBub3QgbnVsbCkgZW5kIHx8IF91Y3MyJyAgJyB8fCAifSwKICB7IiBjYXN0KHN0YXRlbWVudF9uYW1lIGFzIGNoYXIoNjApIGNoYXJhY3RlciBzZXQgdWNzMiBub3QgbnVsbCkgfHwgX3VjczInICAnIHx8ICJ9LAogIHsiIGNhc3QocGxhbl9pZCBhcyBjaGFyKDIwKSBjaGFyYWN0ZXIgc2V0IHVjczIgKSB8fCBfdWNzMicgICcgfHwgIn0sCiAgeyIgY2FzZSB3aGVuIHNlcV9udW0gaXMgTlVMTCB0aGVuIGNhc3QoX3VjczInPycgYXMgY2hhcigxMSkgY2hhcmFjdGVyIHNldCB1Y3MyKSAifSwKICB7IiBlbHNlIGNhc3Qoc2VxX251bSBhcyBjaGFyKDExKSBjaGFyYWN0ZXIgc2V0IHVjczIgbm90IG51bGwpIGVuZCB8fCBfdWNzMicgICcgfHwgIn0sCiAgeyIgY2FzdChvcGVyYXRvciBhcyBjaGFyKDMwKSBjaGFyYWN0ZXIgc2V0IHVjczIgbm90IG51bGwpIHx8IF91Y3MyJyAgJyB8fCAifSwKICB7IiBjYXNlIHdoZW4gbGVmdF9jaGlsZF9zZXFfbnVtIGlzIE5VTEwgdGhlbiBjYXN0KF91Y3MyJz8nIGFzIGNoYXIoMTgpIGNoYXJhY3RlciBzZXQgdWNzMiBub3QgbnVsbCkgIn0sCiAgeyIgZWxzZSBjYXN0KGxlZnRfY2hpbGRfc2VxX251bSBhcyBjaGFyKDE4KSBjaGFyYWN0ZXIgc2V0IHVjczIgbm90IG51bGwpIGVuZCB8fCBfdWNzMicgICcgfHwgIn0sCiAgeyIgY2FzZSB3aGVuIHJpZ2h0X2NoaWxkX3NlcV9udW0gaXMgTlVMTCB0aGVuIGNhc3QoX3VjczInPycgYXMgY2hhcigxOSkgY2hhcmFjdGVyIHNldCB1Y3MyIG5vdCBudWxsKSAifSwKICB7IiBlbHNlIGNhc3QocmlnaHRfY2hpbGRfc2VxX251bSBhcyBjaGFyKDE5KSBjaGFyYWN0ZXIgc2V0IHVjczIgbm90IG51bGwpIGVuZCB8fCBfdWNzMicgICcgfHwgIn0sCiAgeyIgdHJhbnNsYXRlKHRuYW1lIHVzaW5nIHV0Zjh0b3VjczIpIHx8IF91Y3MyJyAgJyB8fCAifSwKICB7IiBjYXN0KGNhcmRpbmFsaXR5IGFzIGNoYXIoMTUpIGNoYXJhY3RlciBzZXQgdWNzMiBub3QgbnVsbCkgfHwgX3VjczInICAnIHx8ICJ9LAogIHsiIGNhc3Qob3BlcmF0b3JfY29zdCBhcyBjaGFyKDE1KSBjaGFyYWN0ZXIgc2V0IHVjczIgbm90IG51bGwgKSB8fCBfdWNzMicgICcgfHwgIn0sCiAgeyIgdHJhbnNsYXRlKGNhc3QodG90YWxfY29zdCBhcyBjaGFyKDE1KSkgdXNpbmcgaXNvODg1OTF0b3VjczIpIHx8IF91Y3MyJyAgJyB8fCAifSwKICB7IiB0cmFuc2xhdGUoY2FzdChkZXRhaWxfY29zdCBhcyBjaGFyKDIwMCkgbm90IG51bGwpIHVzaW5nIGlzbzg4NTkxdG91Y3MyKSB8fCBfdWNzMicgICcgfHwgIn0sCiAgeyIgdHJhbnNsYXRlKGRlc2NyaXB0aW9uIHVzaW5nIHV0Zjh0b3VjczIpIHVzaW5nIHVjczJ0b3V0ZjgpICJ9LAogIHsiIGZyb20gdGFibGUoZXhwbGFpbiglcywgJXMpKTsifQp9OwoKc3RhdGljIGNvbnN0IFF1ZXJ5U3RyaW5nIGRpc3BsYXlFeHBsYWluT3B0aW9uRVF1ZXJ5W10gPQp7Cgl7IiBzZWxlY3QgKiBmcm9tIHRhYmxlKGV4cGxhaW4oJXMsICVzKSkgIn0sCgl7IiBvcmRlciBieSBTRVFfTlVNIGRlc2NlbmRpbmcgIn0sCgl7IiA7ICJ9Cn07CgpzaG9ydCBwcm9jZXNzRXhwbGFpblJvd3NXcmFwcGVyKEV4RXhlVXRpbERpc3BsYXlFeHBsYWluVGNiICogaSkKewogIHJldHVybiBpLT5wcm9jZXNzRXhwbGFpblJvd3MoKTsKfQoKc2hvcnQgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5UY2I6OnByb2Nlc3NFeHBsYWluUm93cygpCnsKICByZXR1cm4gMDsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIHdvcmsoKSBmb3IgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5UY2IKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCnNob3J0IEV4RXhlVXRpbERpc3BsYXlFeHBsYWluVGNiOjp3b3JrKCkKewogIExuZzMyIHJldGNvZGU7CgogIC8vIGlmIG5vIHBhcmVudCByZXF1ZXN0LCByZXR1cm4KICBpZiAocXBhcmVudF8uZG93bi0+aXNFbXB0eSgpKQogICAgcmV0dXJuIFdPUktfT0s7CgogIC8vIGlmIG5vIHJvb20gaW4gdXAgcXVldWUsIHdvbid0IGJlIGFibGUgdG8gcmV0dXJuIGRhdGEvc3RhdHVzLgogIC8vIENvbWUgYmFjayBsYXRlci4KICBpZiAocXBhcmVudF8udXAtPmlzRnVsbCgpKQogICAgcmV0dXJuIFdPUktfT0s7CgogIGV4X3F1ZXVlX2VudHJ5ICogcGVudHJ5X2Rvd24gPSBxcGFyZW50Xy5kb3duLT5nZXRIZWFkRW50cnkoKTsKICBFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblByaXZhdGVTdGF0ZSAmIHBzdGF0ZSA9CiAgICAqKChFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblByaXZhdGVTdGF0ZSopIHBlbnRyeV9kb3duLT5wc3RhdGUpOwoKICAvLyBHZXQgdGhlIGdsb2JhbHMgc3R1Y3R1cmUgb2YgdGhlIG1hc3RlciBleGVjdXRvci4KICBFeEV4ZVN0bXRHbG9iYWxzICpleGVHbG9iID0gZ2V0R2xvYmFscygpLT5jYXN0VG9FeEV4ZVN0bXRHbG9iYWxzKCk7CiAgRXhNYXN0ZXJTdG10R2xvYmFscyAqbWFzdGVyR2xvYiA9IGV4ZUdsb2ItPmNhc3RUb0V4TWFzdGVyU3RtdEdsb2JhbHMoKTsKCiAgd2hpbGUgKDEpIC8vIGV4aXQgdmlhIHJldHVybgogICAgewogICAgICBzd2l0Y2ggKHBzdGF0ZS5zdGVwXykKCXsKCWNhc2UgRU1QVFlfOgoJICB7CgkgICAgaWYgKGV4ZVV0aWxUZGIoKS5nZXRTdG10TmFtZSgpKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBzdGF0ZS5zdGVwXyA9IFNFVFVQX0VYUExBSU5fOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHBzdGF0ZS5zdGVwXyA9IFBSRVBBUkVfOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgICAKICAgICAgICBjYXNlIFBSRVBBUkVfOgoJICB7CgkgICAgLy8gaWYgZ2VuZXJhdGVfZXhwbGFpbiBpcyB0byBPRkYsIGlzc3VlIENRRCB0byB0dXJuIGl0IG9uLgoJICAgIC8vIGZpcnN0LCBob2xkIHRoZSBjdXJyZW50IGRlZmF1bHQgdmFsdWUgZm9yIGdlbmVyYXRlX2V4cGxhaW4uCgkgICAgaWYgKGhvbGRBbmRTZXRDUUQoImdlbmVyYXRlX2V4cGxhaW4iLCAiT04iKSA8IDApCgkgICAgICB7CgkJcHN0YXRlLnN0ZXBfID0gSEFORExFX0VSUk9SXzsKCQlicmVhazsKCSAgICAgIH0KCgkgICAgLy8gdGVsbCBteGNtcCB0aGF0IHRoaXMgcHJlcGFyZSBpcyBmb3IgZXhwbGFpbi4KCSAgICByZXRjb2RlID0gCgkgICAgICBjbGlJbnRlcmZhY2UoKS0+CgkgICAgICBleGVjdXRlSW1tZWRpYXRlKCJjb250cm9sIHNlc3Npb24gJ0VYUExBSU4nICdPTic7Iik7CgkgICAgaWYgKHJldGNvZGUgPCAwKQoJICAgICAgewogICAgICAgICAgICAgICAgY2xpSW50ZXJmYWNlKCktPmFsbG9jQW5kUmV0cmlldmVTUUxEaWFnbm9zdGljcyhkaWFnc0FyZWFfKTsKCQlwc3RhdGUuc3RlcF8gPSBIQU5ETEVfRVJST1JfOwoJCWJyZWFrOwoJICAgICAgfQoJICAgIAoJICAgIGNsaUludGVyZmFjZSgpLT5jbGVhckdsb2JhbERpYWdzKCk7CgkgICAgcmV0Y29kZSA9IAoJICAgICAgY2xpSW50ZXJmYWNlKCktPmFsbG9jU3R1ZmYobW9kdWxlXywgc3RtdF8sIHNxbF9zcmNfLCAKCQkJCQkgaW5wdXRfZGVzY18sIG91dHB1dF9kZXNjXywKCQkJCQkgIl9fRVhQTF9TVE1UX05BTUVfXyIpOwoJICAgIGlmIChyZXRjb2RlIDwgMCkKCSAgICAgIHsKICAgICAgICAgICAgICAgIGNsaUludGVyZmFjZSgpLT5hbGxvY0FuZFJldHJpZXZlU1FMRGlhZ25vc3RpY3MoZGlhZ3NBcmVhXyk7CgkJcHN0YXRlLnN0ZXBfID0gSEFORExFX0VSUk9SXzsKCQlicmVhazsKCSAgICAgIH0KCSAgIAoJICAgIGNoYXIgKiBzdG10U3RyID0gZXhlVXRpbFRkYigpLmdldFF1ZXJ5KCk7CgkgICAgcmV0Y29kZSA9IGNsaUludGVyZmFjZSgpLT5wcmVwYXJlKHN0bXRTdHIsIAoJCQkJCSAgICAgIG1vZHVsZV8sCgkJCQkJICAgICAgc3RtdF8sIHNxbF9zcmNfLAoJCQkJCSAgICAgIGlucHV0X2Rlc2NfLCBvdXRwdXRfZGVzY18sCgkJCQkJICAgICAgTlVMTCAvKiBvdXRwdXRCdWYgKi8sCgkJCQkJICAgICAgTlVMTCAvKiBvdXRwdXRWYXJQdHJMaXN0ICovLAoJCQkJCSAgICAgIE5VTEwgLyogaW5wdXRCdWYgKi8sCgkJCQkJICAgICAgTlVMTCAvKiBpbnB1dFZhclB0ckxpc3QgKi8sCgkJCQkJICAgICAgTlVMTCAvKiB1bmlxdWVTdG10SWQgKi8sCgkJCQkJICAgICAgTlVMTCAvKiB1bmlxdWVTdG10SWRMZW4gKi8sCgkJCQkJICAgICAgTlVMTCAvKiBxdWVyeV9jb3N0X2luZm8gKi8sIAoJCQkJCSAgICAgIE5VTEwgLyogY29tcF9zdGF0c19pbmZvICovLAoJCQkJCSAgICAgIEZBTFNFIC8qIG1vbml0b3JUaGlzICovLAoJCQkJCSAgICAgIFRSVUUgLyogZG9Ob3RDYWNoZVBsYW4gKi8pOwoJICAgIAoJICAgIGlmIChyZXRjb2RlIDwgMCkKCSAgICAgIHsKICAgICAgICAgICAgICAgIGNsaUludGVyZmFjZSgpLT5hbGxvY0FuZFJldHJpZXZlU1FMRGlhZ25vc3RpY3MoZGlhZ3NBcmVhXyk7CgkJcHN0YXRlLnN0ZXBfID0gSEFORExFX0VSUk9SXzsKCQlicmVhazsKCSAgICAgIH0KCgkgICAgcHN0YXRlLnN0ZXBfID0gU0VUVVBfRVhQTEFJTl87CgkgIH0KCWJyZWFrOwoKCWNhc2UgU0VUVVBfRVhQTEFJTl86CgkgIHsKCSAgICAvLyBzZXQgc3FscGFyc2VyZmxhZ3MgdG8gZGlzYWJsZSBzdGF0cyBmb3IgZXhwbGFpbiBxdWVyeQoJICAgIC8vIERJU0FCTEVfUlVOVElNRV9TVEFUUyAweDgwMDAwCgkgICAgbWFzdGVyR2xvYi0+Z2V0U3RhdGVtZW50KCktPmdldENvbnRleHQoKS0+c2V0U3FsUGFyc2VyRmxhZ3MoRElTQUJMRV9SVU5USU1FX1NUQVRTKTsKCSAgICAKCSAgICAvKnNldCB0aGUgZmxhZyBoZXJlLCB1c2UgaXQgbGF0ZXIqLwoJICAgIGlmIChleGVVdGlsVGRiKCkuaXNPcHRpb25GKCkgPiAwKQoJICAgICAgb3B0RmxhZ18gPSBGXzsKCSAgICBlbHNlIGlmIChleGVVdGlsVGRiKCkuaXNPcHRpb25FKCkgPiAwKQoJICAgICAgb3B0RmxhZ18gPSBFXzsKCSAgICBlbHNlIGlmIChleGVVdGlsVGRiKCkuaXNPcHRpb25NKCkgPiAwKQoJICAgICAgb3B0RmxhZ18gPSBNXzsKCSAgICBlbHNlCgkgICAgICBvcHRGbGFnXyA9IE5fOwoJICAgIAoJICAgIEludDMyIGV4cGxhaW5fcXJ5X2FycmF5X3NpemUgPSAwOwoJICAgIGNvbnN0IFF1ZXJ5U3RyaW5nICogZXhwbGFpblF1ZXJ5ID0gTlVMTDsKCSAgICAKCSAgICBpZiAob3B0RmxhZ18gPT0gTV8pCgkgICAgICB7CgkJZXhwbGFpbl9xcnlfYXJyYXlfc2l6ZSA9IHNpemVvZihkaXNwbGF5RXhwbGFpblF1ZXJ5KSAKCQkgIC8gc2l6ZW9mKFF1ZXJ5U3RyaW5nKTsKCQkKCQlleHBsYWluUXVlcnkgPSBkaXNwbGF5RXhwbGFpblF1ZXJ5OwoJICAgICAgfQoJICAgIGVsc2UgLy9zYW1lIHF1ZXJ5IHVzZWQgZm9yIGJvdGggRV8gYW5kIE5fIGFuZCBGXwoJICAgICAgewoJCWV4cGxhaW5fcXJ5X2FycmF5X3NpemUgPSBzaXplb2YoZGlzcGxheUV4cGxhaW5PcHRpb25FUXVlcnkpIAoJCSAgLyBzaXplb2YoUXVlcnlTdHJpbmcpOwoJCQoJCWV4cGxhaW5RdWVyeSA9IGRpc3BsYXlFeHBsYWluT3B0aW9uRVF1ZXJ5OwoJICAgICAgfQoJICAgIAoJICAgIGNoYXIgKiBnbHVlZFF1ZXJ5OwoJICAgIExuZzMyIGdsdWVkUXVlcnlTaXplOwoJICAgIGdsdWVRdWVyeUZyYWdtZW50cyhleHBsYWluX3FyeV9hcnJheV9zaXplLCBleHBsYWluUXVlcnksCgkJCSAgICAgICBnbHVlZFF1ZXJ5LCBnbHVlZFF1ZXJ5U2l6ZSk7CgkgICAgCgkgICAgY2hhciBleHBsQXJnMVsyMDBdOwoJICAgIGNoYXIgZXhwbEFyZzJbMjAwXTsKCSAgICBpZiAgKGV4ZVV0aWxUZGIoKS5nZXRNb2R1bGVOYW1lKCkpCgkgICAgICB7CgkJc3RyY3B5KGV4cGxBcmcxLCAiX2lzbzg4NTkxJyIpOwoJCXN0cmNhdChleHBsQXJnMSwgZXhlVXRpbFRkYigpLmdldE1vZHVsZU5hbWUoKSk7CgkJc3RyY2F0KGV4cGxBcmcxLCAiJyIpOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0cmNweShleHBsQXJnMSwgIk5VTEwiKTsKCSAgICAKCSAgICBzdHJjcHkoZXhwbEFyZzIsICJfaXNvODg1OTEnIik7CiAgICAgICAgICAgIGlmIChleGVVdGlsVGRiKCkuZ2V0U3RtdE5hbWUoKSkKCSAgICAgIHN0cmNhdChleHBsQXJnMiwgZXhlVXRpbFRkYigpLmdldFN0bXROYW1lKCkpOwogICAgICAgICAgICBlbHNlCgkgICAgICBzdHJjYXQoZXhwbEFyZzIsICJfX0VYUExfU1RNVF9OQU1FX18iKTsKCSAgICBzdHJjYXQoZXhwbEFyZzIsICInIik7CgkgICAgCgkgICAgaWYgKGV4cGxhaW5RdWVyeV8pCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gbmVlZCB0byBjbGVhbnVwIGZyb20gcHJldmlvdXMgZXhlY3V0aW9uCiAgICAgICAgICAgICAgICBOQURFTEVURUJBU0lDKGV4cGxhaW5RdWVyeV8sIGdldE15SGVhcCgpKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBleHBsYWluUXVlcnlfID0gbmV3IChnZXRNeUhlYXAoKSkKCSAgICAgIGNoYXJbZ2x1ZWRRdWVyeVNpemUgKyBzdHJsZW4oZXhwbEFyZzEpICsKCQkgIHN0cmxlbihleHBsQXJnMikgKyAxMF07CgkgICAgCgkgICAgCgkgICAgc3RyX3NwcmludGYoZXhwbGFpblF1ZXJ5XywgZ2x1ZWRRdWVyeSwgZXhwbEFyZzEsIGV4cGxBcmcyKTsKCiAgICAgICAgICAgIE5BREVMRVRFQkFTSUMoZ2x1ZWRRdWVyeSwgZ2V0TXlIZWFwKCkpOwoJICAgIAoJICAgIHBzdGF0ZS5zdGVwXyA9IEZFVENIX1BST0xPR1VFXzsKCSAgfQoJYnJlYWs7CgkKCWNhc2UgRkVUQ0hfUFJPTE9HVUVfOgoJICB7CgkgICAgcmV0Y29kZSA9IGNsaUludGVyZmFjZSgpLT5mZXRjaFJvd3NQcm9sb2d1ZShleHBsYWluUXVlcnlfKTsKCSAgICBpZiAocmV0Y29kZSA8IDApCgkgICAgICB7CiAgICAgICAgICAgICAgICBjbGlJbnRlcmZhY2UoKS0+YWxsb2NBbmRSZXRyaWV2ZVNRTERpYWdub3N0aWNzKGRpYWdzQXJlYV8pOwoJCXBzdGF0ZS5zdGVwXyA9IEhBTkRMRV9FUlJPUl87CgkJYnJlYWs7CgkgICAgICB9CgoJICAgIHBzdGF0ZS5zdGVwXyA9IEZFVENIX0ZJUlNUX0VYUExBSU5fUk9XXzsKCSAgICAKCSAgfQoJYnJlYWs7CgoJY2FzZSBGRVRDSF9GSVJTVF9FWFBMQUlOX1JPV186CgkgIHsKCSAgICBpZiAob3B0RmxhZ18gPT0gRV8gfHwgb3B0RmxhZ18gPT0gTl8pCgkgICAgICB7CgkJLy9mb3Igb3B0aW9ucyBFIG9yIE4gZG8gbm90aGluZyBzaW5jZSBub3QgcGxhbm5pbmcgdG8gb3V0cHV0IGFueXRoaW5nIHlldAoJCS8vdGhlIG91dHB1dCB3aWxsIGhhcHBlbiBpbiBEb0hlYWRlciwgRG9PcGVyYXRvciwgRG9TZXBhcmF0b3IKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJLy8gbWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byBtb3ZlIGhlYWRlcgoJCWlmICgocXBhcmVudF8udXAtPmdldFNpemUoKSAtIHFwYXJlbnRfLnVwLT5nZXRMZW5ndGgoKSkgPCA1KQoJCSAgcmV0dXJuIFdPUktfT0s7CS8vY29tZSBiYWNrIGxhdGVyCgkgICAgICB9CgkgICAgCgkgICAgcmV0Y29kZSA9IGNsaUludGVyZmFjZSgpLT5mZXRjaCgpOwoJICAgIGlmIChyZXRjb2RlIDwgMCkKCSAgICAgIHsKICAgICAgICAgICAgICAgIGNsaUludGVyZmFjZSgpLT5hbGxvY0FuZFJldHJpZXZlU1FMRGlhZ25vc3RpY3MoZGlhZ3NBcmVhXyk7CgkJcHN0YXRlLnN0ZXBfID0gSEFORExFX0VSUk9SXzsKCQlicmVhazsKCSAgICAgIH0KCSAgICAKCSAgICBpZiAocmV0Y29kZSA9PSAxMDApCgkgICAgICB7CgkJLy8gbm8gcm93cyBmb3VuZC4KCQkvLyBFaXRoZXIgbm8gZXhwbGFpbiBpbmZvcm1hdGlvbiB3YXMgYXZhaWxhYmxlIG9yIHN0YXRlbWVudAoJCS8vIHdhcyBub3QgZm91bmQuCgkJRXhSYWlzZVNxbEVycm9yKGdldE15SGVhcCgpLCAmZGlhZ3NBcmVhXywKCQkJCSgoKGV4ZVV0aWxUZGIoKS5nZXRNb2R1bGVOYW1lKCkpIHx8CgkJCQkgIChleGVVdGlsVGRiKCkuZ2V0U3RtdE5hbWUoKSkpID8KCQkJCSAoRXhlRXJyb3JDb2RlKUNMSV9TVE1UX05PVF9FWElTVFMgOgoJCQkJIChFeGVFcnJvckNvZGUpRVhFX05PX0VYUExBSU5fSU5GTykpOwoJCQkJCgkJcHN0YXRlLnN0ZXBfID0gSEFORExFX0VSUk9SXzsKCQlicmVhazsKCSAgICAgIH0KCSAgICAKCSAgICAvL3RoZSBmZXRjaCB3YXMgc3VjY2Vzc2Z1bAoJICAgIAoJICAgIHN3aXRjaChvcHRGbGFnXykKCSAgICAgIHsKCSAgICAgIGNhc2UgRV86CgkgICAgICBjYXNlIE5fOgoJCXsKCQkgIC8qZm9yIG9wdGlvbnMgRSBvciBOIGRvIG5vdGhpbmcsIGhlYWRlciBnZXRzIG91dHB1dCBpbiBEb1NlcGFyYXRvcigpKi8KCQkgIHBzdGF0ZS5zdGVwXyA9IEdFVF9DT0xVTU5TXzsKCQl9CgkgICAgICBicmVhazsKCSAgICAgIAoJICAgICAgY2FzZSBGXzoKCQl7CgkJICBtb3ZlUm93VG9VcFF1ZXVlKCIgIik7CgkJICBtb3ZlUm93VG9VcFF1ZXVlKCJMQyAgIFJDICAgT1AgICBPUEVSQVRPUiAgICAgICAgICAgICAgT1BUICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICBDQVJEICAgIik7CgkJICBtb3ZlUm93VG9VcFF1ZXVlKCItLS0tIC0tLS0gLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0iKTsKCQkgIAoJCSAgbW92ZVJvd1RvVXBRdWV1ZSgiICIpOwoJCSAgcHN0YXRlLnN0ZXBfID0gR0VUX0NPTFVNTlNfOwoJCX0KCSAgICAgIGJyZWFrOwoJICAgICAgCgkgICAgICBjYXNlIE1fOgoJCXsKCQkgIG1vdmVSb3dUb1VwUXVldWUoIiAiKTsKCQkgIG1vdmVSb3dUb1VwUXVldWUoIk1PRFVMRV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVEVNRU5UX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEFOX0lEICAgICAgICAgICAgICAgU0VRX05VTSAgICAgIE9QRVJBVE9SICAgICAgICAgICAgICAgICAgICAgICAgTEVGVF9DSElMRF9TRVFfTlVNICBSSUdIVF9DSElMRF9TRVFfTlVNICBUTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBUkRJTkFMSVRZICAgICAgT1BFUkFUT1JfQ09TVCAgICBUT1RBTF9DT1NUICAgICAgIERFVEFJTF9DT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDUklQVElPTiIpOwoJCSAgbW92ZVJvd1RvVXBRdWV1ZSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKCQkgIG1vdmVSb3dUb1VwUXVldWUoIiAiKTsKCQkgIHBzdGF0ZS5zdGVwXyA9IFJFVFVSTl9FWFBMQUlOX1JPV187CgkJfQoJICAgICAgYnJlYWs7CgkgICAgICAKCSAgICAgIH0KCSAgfQoJYnJlYWs7CgkKCWNhc2UgRkVUQ0hfRVhQTEFJTl9ST1dfOgoJICB7CgkgICAgcmV0Y29kZSA9IGNsaUludGVyZmFjZSgpLT5mZXRjaCgpOwoJICAgIGlmIChyZXRjb2RlIDwgMCkKCSAgICAgIHsKICAgICAgICAgICAgICAgIGNsaUludGVyZmFjZSgpLT5hbGxvY0FuZFJldHJpZXZlU1FMRGlhZ25vc3RpY3MoZGlhZ3NBcmVhXyk7CgkJcHN0YXRlLnN0ZXBfID0gSEFORExFX0VSUk9SXzsKCQlicmVhazsKCSAgICAgIH0KCSAgICAKCSAgICBpZiAocmV0Y29kZSA9PSAxMDApIC8vbm8gbW9yZSBkYXRhCgkgICAgICBwc3RhdGUuc3RlcF8gPSBGRVRDSF9FUElMT0dVRV87CgkgICAgZWxzZSBpZiAob3B0RmxhZ18gPT0gRV8gfHwgb3B0RmxhZ18gPT0gTl8gfHwgb3B0RmxhZ18gPT0gRl8pCgkgICAgICBwc3RhdGUuc3RlcF8gPSBHRVRfQ09MVU1OU187CgkgICAgZWxzZQoJICAgICAgcHN0YXRlLnN0ZXBfID0gUkVUVVJOX0VYUExBSU5fUk9XXzsKCSAgfQoJYnJlYWs7CgkKCWNhc2UgR0VUX0NPTFVNTlNfOgoJICB7CgkgICAgc2hvcnQgcmMgPSBHZXRDb2x1bW5zKCk7CgkgICAgaWYgKHJjICE9IDApCS8vbWVhbnMgd2UgZ290IGFuIEVYRV9FWFBMQUlOX0JBRF9EQVRBCgkgICAgICAvL29yIGFuIGVycm9yIGZyb20gZ2V0UHRyQW5kTGVuKCkKCSAgICAgIHsKCQlFeFJhaXNlU3FsRXJyb3IoZ2V0TXlIZWFwKCksICZkaWFnc0FyZWFfLAoJCQkJKCgoZXhlVXRpbFRkYigpLmdldE1vZHVsZU5hbWUoKSkgfHwKCQkJCSAgKGV4ZVV0aWxUZGIoKS5nZXRTdG10TmFtZSgpKSkgPwoJCQkJIChFeGVFcnJvckNvZGUpQ0xJX1NUTVRfTk9UX0VYSVNUUyA6CgkJCQkgKEV4ZUVycm9yQ29kZSlFWEVfTk9fRVhQTEFJTl9JTkZPKSk7CgkJcHN0YXRlLnN0ZXBfID0gSEFORExFX0VSUk9SXzsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJaWYgKG9wdEZsYWdfID09IEZfKQoJCSAgcHN0YXRlLnN0ZXBfID0gUkVUVVJOX0VYUExBSU5fUk9XXzsKCQllbHNlCgkJICB7CQkKCQkgICAgaWYgKGhlYWRlcl8gPT0gMSkgLy8gZ290IHNldCB0byAxIGluc2lkZSBHZXRDb2x1bW5zIGlmIGN1cnJlbnQgbm9kZSBpcyBST09UCgkJICAgICAgcHN0YXRlLnN0ZXBfID0gRE9fSEVBREVSXzsKCQkgICAgZWxzZQoJCSAgICAgIHBzdGF0ZS5zdGVwXyA9IERPX09QRVJBVE9SXzsKCQkgIH0KCSAgICAgIH0KCSAgfQoJYnJlYWs7CgoJY2FzZSBET19IRUFERVJfOgoJICB7CgkgICAgLy9vbmUgYmxhbmsgbGluZSBiZWZvcmUgdGhlIHN1bW1hcnkKCSAgICBGb3JtYXRMaW5lKE5VTEwsIE5VTEwsIDAsIDApOwoJICAgIAoJICAgIERvU2VwYXJhdG9yKCk7CgkgICAgRG9IZWFkZXIoKTsKCSAgICAKCSAgICBwc3RhdGUuc3RlcF8gPSBSRVRVUk5fRk1UX1JPV1NfOwoJICB9CglicmVhazsKCQoJY2FzZSBET19PUEVSQVRPUl86CgkgIHsKCSAgICBEb1NlcGFyYXRvcigpOwoJICAgIERvT3BlcmF0b3IoKTsKCSAgICBoZWFkZXJfID0gMDsJCS8vcmVzZXQgb25jZSByb290IG9wZXJhdG9yIGRvbmUKCSAgICAKCSAgICBwc3RhdGUuc3RlcF8gPSBSRVRVUk5fRk1UX1JPV1NfOwoJICB9CglicmVhazsKCQoJY2FzZSBSRVRVUk5fRk1UX1JPV1NfOgoJICB7CgkgICAgc2hvcnQgcmMgPSBPdXRwdXRMaW5lcygpOwoJICAgIAoJICAgIGlmIChyYyAhPSAwKQkJLy9yYyBpcyB0aGUgc2FtZSBhcyB3b3VsZCBiZSBnb3R0ZW4gZnJvbSBhIGNhbGwgdG8gbW92ZVJvd1RvVXBRdWV1ZQoJICAgICAgcmV0dXJuIHJjOwkJLy9uZXh0IHN0YXRlIGlzIHVuY2hhbmdlZCwgd2UgbmVlZCB0byBjb21lIGJhY2sgaGVyZQoJICAgIAoJICAgIGlmIChoZWFkZXJfID09IDEpCS8vaWYgY3VycmVudCBub2RlIGlzIHJvb3QsIGp1c3QgZmluaXNoZWQgaGVhZGVyCgkgICAgICBwc3RhdGUuc3RlcF8gPSBET19PUEVSQVRPUl87CgkgICAgZWxzZQoJICAgICAgcHN0YXRlLnN0ZXBfID0gRkVUQ0hfRVhQTEFJTl9ST1dfOwoJICB9CglicmVhazsKCQoJY2FzZSBSRVRVUk5fRVhQTEFJTl9ST1dfOgoJICB7CgkgICAgY2hhciAqIHB0cjsKCSAgICBMbmczMiAgIGxlbjsKCSAgICBzaG9ydCByYzsKCSAgICAKCSAgICBpZiAob3B0RmxhZ18gPT0gRl8pCgkgICAgewoJCUZvcm1hdEZvckYoKTsKCQlyZXRjb2RlID0gbW92ZVJvd1RvVXBRdWV1ZSgmb3B0Rk91dHB1dFswXSwgLTEsICZyYyk7CgkgICAgfQoJICAgIGVsc2UgLy9tdXN0IGJlIE1fCgkgICAgewoJCWNsaUludGVyZmFjZSgpLT5nZXRQdHJBbmRMZW4oMSwgcHRyLCBsZW4pOwoJCXJldGNvZGUgPSBtb3ZlUm93VG9VcFF1ZXVlKHB0ciwgbGVuLCAmcmMpOwoJICAgIH0KCSAgICBpZiAocmV0Y29kZSkKCQlyZXR1cm4gcmM7CgkgICAgCgkgICAgcHN0YXRlLnN0ZXBfID0gRkVUQ0hfRVhQTEFJTl9ST1dfOwoJICB9CglicmVhazsKCQoJY2FzZSBIQU5ETEVfRVJST1JfOgoJICB7CgkgICAgcHN0YXRlLnN0ZXBfID0gRkVUQ0hfRVBJTE9HVUVfQU5EX1JFVFVSTl9FUlJPUl87CgkgIH0KCWJyZWFrOwoJCgljYXNlIEZFVENIX0VQSUxPR1VFXzoKCWNhc2UgRkVUQ0hfRVBJTE9HVUVfQU5EX1JFVFVSTl9FUlJPUl86CgkgIHsKCSAgICByZXRjb2RlID0gY2xpSW50ZXJmYWNlKCktPmZldGNoUm93c0VwaWxvZ3VlKGV4cGxhaW5RdWVyeV8pOwoJICAgIGlmIChyZXRjb2RlIDwgMCkKCSAgICAgIHsKICAgICAgICAgICAgICAgIGNsaUludGVyZmFjZSgpLT5hbGxvY0FuZFJldHJpZXZlU1FMRGlhZ25vc3RpY3MoZGlhZ3NBcmVhXyk7CgkgICAgICB9CgkgICAgCgkgICAgcmV0Y29kZSA9IAoJICAgICAgY2xpSW50ZXJmYWNlKCktPmRlYWxsb2NTdHVmZihtb2R1bGVfLCBzdG10Xywgc3FsX3NyY18sIAoJCQkJCSAgIGlucHV0X2Rlc2NfLCBvdXRwdXRfZGVzY18pOwoJICAgIGlmIChyZXRjb2RlIDwgMCkKCSAgICAgIHsKICAgICAgICAgICAgICAgIGNsaUludGVyZmFjZSgpLT5hbGxvY0FuZFJldHJpZXZlU1FMRGlhZ25vc3RpY3MoZGlhZ3NBcmVhXyk7CgkgICAgICB9CgoJICAgIGlmIChleGVVdGlsVGRiKCkuZ2V0U3RtdE5hbWUoKSA9PSBOVUxMKQoJICAgICAgewoJCWlmIChyZXN0b3JlQ1FEKCJnZW5lcmF0ZV9leHBsYWluIikgPCAwKQoJCSAgewoJCSAgICBwc3RhdGUuc3RlcF8gPSBET05FXzsKCQkgICAgYnJlYWs7CgkJICB9CgkgICAgICB9CgoJICAgIC8vIHJlc2V0IENPTlRST0wgU0VTU0lPTgoJICAgIHJldGNvZGUgPSAKCSAgICAgIGNsaUludGVyZmFjZSgpLT4KCSAgICAgIGV4ZWN1dGVJbW1lZGlhdGUoImNvbnRyb2wgc2Vzc2lvbiByZXNldCAnRVhQTEFJTic7Iik7CgkgICAgaWYgKHJldGNvZGUgPCAwKQoJICAgICAgewogICAgICAgICAgICAgICAgY2xpSW50ZXJmYWNlKCktPmFsbG9jQW5kUmV0cmlldmVTUUxEaWFnbm9zdGljcyhkaWFnc0FyZWFfKTsKCSAgICAgIH0KCSAgICAKCSAgICBpZiAocHN0YXRlLnN0ZXBfID09IEZFVENIX0VQSUxPR1VFX0FORF9SRVRVUk5fRVJST1JfKQoJICAgICAgcHN0YXRlLnN0ZXBfID0gUkVUVVJOX0VSUk9SXzsKCSAgICBlbHNlCgkgICAgICBwc3RhdGUuc3RlcF8gPSBET05FXzsKCSAgfQoJYnJlYWs7CgoJY2FzZSBSRVRVUk5fRVJST1JfOgoJICB7CgkgICAgcmV0Y29kZSA9IGhhbmRsZUVycm9yKCk7CgkgICAgaWYgKHJldGNvZGUgPT0gMSkKCSAgICAgIHJldHVybiBXT1JLX09LOwoJICAgIAoJICAgIHBzdGF0ZS5zdGVwXyA9IERPTkVfOwoJICB9CglicmVhazsKCgljYXNlIERPTkVfOgoJICB7CgkgICAgcmV0Y29kZSA9IGhhbmRsZURvbmUoKTsKCSAgICBpZiAocmV0Y29kZSA9PSAxKQoJICAgICAgcmV0dXJuIFdPUktfT0s7CgoJICAgIHBzdGF0ZS5tYXRjaGVzXyA9IDA7CgkgICAgcHN0YXRlLnN0ZXBfID0gRU1QVFlfOwoKICAgICAgICAgICAgLy8gcmVzZXQgc3FscGFyc2VyZmxhZ3MgdGhhdCBkaXNhYmxlZCBzdGF0cyBmb3IgRXhwbGFpbiBxdWVyeQogICAgICAgICAgICAvLyBESVNBQkxFX1JVTlRJTUVfU1RBVFMgPSAweDgwMDAwCiAgICAgICAgICAgIG1hc3Rlckdsb2ItPmdldFN0YXRlbWVudCgpLT5nZXRDb250ZXh0KCktPnJlc2V0U3FsUGFyc2VyRmxhZ3MoRElTQUJMRV9SVU5USU1FX1NUQVRTKTsKCgkgICAgLy9yZXNldCB2YXJpYWJsZXMgdXNlZCBmb3Igb3B0aW9ucyBFXyBhbmQgTl8KCSAgICBjbnRMaW5lc18gPSAwOwoJICAgIG5leHRMaW5lXyA9IDA7CgkgICAgaGVhZGVyXyA9IDA7CgkgICAgbGFzdEZyYWdfID0gMDsKCSAgICAKCSAgICByZXR1cm4gV09SS19PSzsKCSAgfQoJYnJlYWs7CgoJfQogICAgfQoKfQoKCi8vZ2l2ZW4gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLCB0cnVuY2F0ZXMgd2hpdGVzcGFjZSBmcm9tIHRoZQovL2VuZCBhbmQgbW92ZXMgdGhlIHN0cmluZyB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIKdm9pZCBFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblRjYjo6dHJ1bmNhdGVfd2hpdGVzcGFjZShjaGFyICogc3RyKSBjb25zdAp7CiAgSW50MzIgdG90YWwgPSBzdHJfbGVuKHN0cik7CiAgY2hhciAqIGVuZCA9IHN0ciArIHRvdGFsOwogIC0tZW5kOwogIHdoaWxlICh0b3RhbCA+IDAgJiYgKmVuZCA9PSAnICcpICAvL2RvIG5vdCBnbyBwYXN0IHRoZSBiZWdpbm5pbmcKICAgIHsKICAgICAgLS1lbmQ7CiAgICAgIC0tdG90YWw7CiAgICB9CiAgKytlbmQ7CiAgKmVuZCA9ICdcMCc7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGdW5jdGlvbiBOYW1lOiBHZXRDb2x1bW5zCgpBcmd1bWVudCBMaXN0OiBOb25lCgpSZXR1cm4gU3RhdHVzOiAKICAgIGxvbmcgPSAwIG9uIHN1Y2Nlc3MsIGVsc2UgYSByZXR1cm4gY29kZSB0byB1c2UgaW4gZXJyb3IgcmV0dXJuIHRvIGNhbGxlcgogICAgICAgICA9IEVYRV9FWFBMQUlOX0JBRF9EQVRBIHJldHVybmVkIG1lYW5zIHRoYXQgYSBudW1lcmljIGZpZWxkIHdhcyBOVUxMCiAgICAgICAgICAgICAgb3IgdHJ1bmNhdGVkIHdoZW4gZXhwZWN0ZWQgdG8gYmUgdmFsaWQKICAgICAgICAgPSBhbnl0aGluZyBlbHNlLCBlcnJvciBjb2RlIGZyb20gZ2V0UHRyQW5kTGVuLCBwYXNzIHVwIGFuZCBzZXQgc3RhdGUKICAgICAgICAgICAgICB0byBIQU5ETEVfRVJST1JfCgpDbGFzcyBEYXRhIEFjY2Vzc2VkOiAob3B0aW9uYWwgc2VjdGlvbiwgb21pdCBpZiBub3QgbmVlZGVkKQogICAgMTMgImxvY2FsIGNvbHVtbiBkYXRhIiB2YXJpYWJsZXMgZmlsbGVkIHdpdGggY29udGVudHMgb2YgdGhpcyByb3cKCkRlc2NyaXB0aW9uOgpUaGlzIGZ1bmN0aW9uIHdpbGwgZmlyc3QgZ2V0IHRoZSBvcGVyYXRvciAoY29sdW1uIDUpIGFuZCBjaGVjayBpdCBmb3IgInJvb3QiLgpJZiByb290LCBpdCB3aWxsIG1ha2UgMTIgbW9yZSBjYWxscyB0byBnZXRQdHJBbmRMZW4oKSB0byBnZXQgZWFjaCBvZiB0aGUgb3RoZXIKY29sdW1ucyByZXR1cm5lZCBpbiB0aGUgY3VycmVudCByb3cgb2YgZXhwbGFpbiBpbmZvcm1hdGlvbi4gIE90aGVyd2lzZSBpdCBkb2VzCm9ubHkgOSBtb3JlIGNhbGxzIGFzIHRoZSBvdGhlciAzIGFyZSBub3QgbmVlZGVkIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHJvb3Qgbm9kZS4KSXQgd2lsbCBzdG9yZSB0aGVzZSBmaWVsZHMgaW4gcHJpdmF0ZSB2YXJpYWJsZXMsIGNoZWNraW5nIGxlbmdodHMgYXMgaXQgZG9lcy4KCkl0IHdpbGwgdXNlIHRoZSBpbmRpY2F0b3IgZmxhZyByZXR1cm5lZCB0byBwdXQgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIGVtcHR5CmZpZWxkcyBhbmQgY2hlY2sgZm9yIGVycm9ycy4gIE5vdGUgdGhhdCBOVUxMIG9yIHRydW5jYXRlZCBjYW4gYmUgaW5kaWNhdGVkIGluCnNvbWUgY2FzZXMgd2l0aG91dCBjYXVzaW5nIGFuIGVycm9yIHJldHVybi4gIFRoZSBpZGVhIGlzIHRvIG5vdCBmYWlsIHRoZSBkaXNwbGF5CmR1ZSB0byBvbmUgYmFkIHBhcmFtZXRlciwgaWYgd2UgY2FuIGhhbmRsZSBpdCBzb21lIG90aGVyIHdheS4gIEV4YW1wbGVzOiB3aGVuIHdlCmdldCBhIHRydW5jYXRpb24gb2YgYSBzdHJpbmcsIHdlIG91dHB1dCAiKGRhdGEgbG9zcyBpbmRpY2F0ZWQpIiBhbmQgY29udGludWU7CmFsc28sIGZvciBzb21lIGNvbHVtbnMsIE5VTEwgaXMgdmFsaWQgYW5kIGRvZXMgbm90IGluZGljYXRlIGFuIGVycm9yLiAgSG93ZXZlciwKaW4gY2FzZSB3ZSBoYXZlIGEgTlVMTCB3aGVyZSB3ZSBleHBlY3RlZCBhIG51bWVyaWMgdmFsdWUsIG9yIGlmIHdlIHRydW5jYXRlIGEKbnVtYmVyLCB3ZSByZXR1cm4gRVhFX0VYUExBSU5fQkFEX0RBVEEgYmFjayB0byBjYWxsZXIgYXMgd2UgY2FuknQgaGFuZGxlIHRoaXMKZWFzaWx5LCBzbyB3ZSBwYXNzIHRoZSBmYWlsIGJhY2sgd2hpY2ggd2lsbCBhYm9ydCB0aGUgZGlzcGxheS4KKioqKiovCnNob3J0IEV4RXhlVXRpbERpc3BsYXlFeHBsYWluVGNiOjpHZXRDb2x1bW5zKCkKewogICAgTG5nMzIgICBsZW47CiAgICBMbmczMiAgIHJjOwogICAgc2hvcnQgKmluZDsKICAgIGNoYXIgICpwdHI7CiAgICBMbmczMiAgIG9wRG9uZSA9IDA7ICAgICAgICAgIC8vID0xIGFmdGVyIGRvaW5nIG9wZXJhdG9yLCB1c2VkIHRvIHJlb3JkZXIKCiAgICBmb3IgKEludDMyIGkgPSA1OyBpIDwgMTQ7ICsraSkgLy8gc3RhcnQgd2l0aCBvcGVyYXRvciB0byBjaGVjayBmb3Igcm9vdAogICAgewogICAgICAgIGlmIChvcERvbmUgJiYgKGkgPT0gNSkpIC8vIGlmIDUgYWxyZWFkeSBkb25lCiAgICAgICAgewogICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgIC8vIGRvbid0IGRvIGl0IGFnYWluCiAgICAgICAgfQogICAgICAgIHJjID0gY2xpSW50ZXJmYWNlKCktPmdldFB0ckFuZExlbihpLCBwdHIsIGxlbiwgJmluZCk7CiAgICAgICAgaWYgKHJjICE9IDApCiAgICAgICAgICAgIHJldHVybiAoc2hvcnQpcmM7CS8vbm90IHN1cmUgd2hhdCBlcnJvciBpcywgdGhlIHJjIHdpbGwgaW5kaWNhdGUgdGhlIGVycm9yCiAgICAgICAgaWYgKCppbmQgPiAwKSB7ICAgICAgICAgLy8gaWYgZGF0YSB0cnVuY2F0aW9uLCBzZXQgZm9yIGFsbAogICAgICAgICAgcHRyID0gKGNoYXIgKikgIihkYXRhIGxvc3MgaW5kaWNhdGVkKSI7CiAgICAgICAgICAgIGxlbiA9IDIxOwogICAgICAgIH0KICAgICAgICBzd2l0Y2goaSkKICAgICAgICB7CiAgICAgICAgY2FzZSAxOiAvL21vZHVsZSBuYW1lCiAgICAgICAgICAgIGlmICgoKmluZCkgPCAwKSAgICAgLy8gaWYgTlVMTCByZXR1cm5lZAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdHJfY3B5X2MobW9kdWxlTmFtZV8sICJEWU5BTUlDQUxMWSBDT01QSUxFRCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgLy8gaW5kaWNhdG9yIGlzIHplcm8sIG5vcm1hbCBkYXRhCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChsZW4gPiBNTkFNRSkgeyBsZW4gPSBNTkFNRTsgfSAvLyB3YXRjaCBmb3IganVuawogICAgICAgICAgICAgICAgc3RyX25jcHkobW9kdWxlTmFtZV8sIHB0ciwgbGVuKTsKICAgICAgICAgICAgICAgIG1vZHVsZU5hbWVfW2xlbl0gPSAnXDAnOwogICAgICAgICAgICAgICAgdHJ1bmNhdGVfd2hpdGVzcGFjZShtb2R1bGVOYW1lXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOiAvL3N0YXRlbWVudCBuYW1lCiAgICAgICAgICAgIGlmICgoKmluZCkgPCAwKSAgICAgLy8gaWYgTlVMTCByZXR1cm5lZAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdHJfY3B5X2Moc3RhdGVtZW50TmFtZV8sICJOT1QgTkFNRUQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8vIGluZGljYXRvciBpcyB6ZXJvLCBub3JtYWwgZGF0YQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobGVuID4gTU5BTUUpIHsgbGVuID0gTU5BTUU7IH0gLy8gd2F0Y2ggZm9yIGp1bmsKICAgICAgICAgICAgICAgIHN0cl9uY3B5KHN0YXRlbWVudE5hbWVfLCBwdHIsIGxlbik7CiAgICAgICAgICAgICAgICBzdGF0ZW1lbnROYW1lX1tsZW5dID0gJ1wwJzsKICAgICAgICAgICAgICAgIHRydW5jYXRlX3doaXRlc3BhY2Uoc3RhdGVtZW50TmFtZV8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzogLy9wbGFuIGlkCiAgICAgICAgICAgIGlmICgoKmluZCkgIT0gMCkgICAgLy9OVUxMIG9yIHRydW5jYXRpb24gaW5kaWNhdGVkLCBtZWFucyBiYWQgZGF0YQogICAgICAgICAgICAgICAgcmV0dXJuIEVYRV9FWFBMQUlOX0JBRF9EQVRBOwogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8vIGluZGljYXRvciBpcyB6ZXJvLCBub3JtYWwgZGF0YQogICAgICAgICAgICAgICAgcGxhbklkXyA9ICooKEludDY0KilwdHIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6IC8vc2VxdWVuY2UgbnVtYmVyCiAgICAgICAgICAgIGlmICgoKmluZCkgIT0gMCkgICAgLy9OVUxMIG9yIHRydW5jYXRpb24gaW5kaWNhdGVkLCBtZWFucyBiYWQgZGF0YQogICAgICAgICAgICAgICAgcmV0dXJuIEVYRV9FWFBMQUlOX0JBRF9EQVRBOwogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8vIGluZGljYXRvciBpcyB6ZXJvLCBub3JtYWwgZGF0YQogICAgICAgICAgICAgICAgc2VxTnVtXz0gKigoTG5nMzIqKXB0cik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNTogLy9vcGVyYXRvciBuYW1lIGlzIHByb2Nlc3NlZCBmaXJzdCwgdGhlbiByZXN0YXJ0IGF0IDEgb3IgNAogICAgICAgICAgICBvcERvbmUgPSAxOyAgICAgICAgIC8vIHNraXAgbmV4dCBwYXNzIGhlcmUKICAgICAgICAgICAgaWYgKCgqaW5kKSA8IDApICAgICAvLyBpZiBOVUxMIHJldHVybmVkCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0cl9jcHlfYyhvcGVyTmFtZV8sICIobm90IGZvdW5kKSIpOyAvLyByZXNvbHZlIGVycm9yIGdyYWNlZnVsbHkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8vIGluZGljYXRvciBpcyB6ZXJvLCBub3JtYWwgZGF0YQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobGVuID4gTU9QRVIpIHsgbGVuID0gTU9QRVI7IH0gLy8gd2F0Y2ggZm9yIGp1bmsKICAgICAgICAgICAgICAgIHN0cl9uY3B5KG9wZXJOYW1lXywgcHRyLCBsZW4pOwogICAgICAgICAgICAgICAgb3Blck5hbWVfW2xlbl0gPSAnXDAnOwogICAgICAgICAgICAgICAgdHJ1bmNhdGVfd2hpdGVzcGFjZShvcGVyTmFtZV8pOwogICAgICAgICAgICAgICAgaWYgKHN0cl9jbXBfYyhvcGVyTmFtZV8sICJST09UIikgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBoZWFkZXJfID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0RnJhZ18gPSAwOwogICAgICAgICAgICAgICAgICAgIGkgPSAwOyAgICAgICAgICAvLyBkbyBhbGwgMTMgZmllbGRzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaSA9IDM7ICAgICAgICAgIC8vIGRvIG9ubHkgMSBmaWVsZHMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDY6IC8vbGVmdCBjaGlsZAogICAgICAgICAgICBpZiAoKCppbmQpIDwgMCkgICAgIC8vIGlmIE5VTEwgcmV0dXJuZWQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGVmdENoaWxkXyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoKCppbmQpID4gMCkgICAgLyp2YWx1ZSB3YXMgdHJ1bmNhdGVkKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEVYRV9FWFBMQUlOX0JBRF9EQVRBOy8vZXhwZWN0ZWQgYSBOVUxMIG9yIGEgdmFsaWQgdmFsdWUKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8vIGluZGljYXRvciBpcyB6ZXJvLCBub3JtYWwgZGF0YQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsZWZ0Q2hpbGRfID0gKigoTG5nMzIqKXB0cik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3OiAvL3JpZ2h0IGNoaWxkCiAgICAgICAgICAgIGlmICgoKmluZCkgPCAwKSAgICAgLy8gaWYgTlVMTCByZXR1cm5lZAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByaWdodENoaWxkXyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoKCppbmQpID4gMCkgICAgLyp2YWx1ZSB3YXMgdHJ1bmNhdGVkKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEVYRV9FWFBMQUlOX0JBRF9EQVRBOy8vZXhwZWN0ZWQgYSBOVUxMIG9yIGEgdmFsaWQgdmFsdWUKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8vIGluZGljYXRvciBpcyB6ZXJvLCBub3JtYWwgZGF0YQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByaWdodENoaWxkXyA9ICooKExuZzMyKilwdHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgODogLy90YWJsZSBuYW1lCiAgICAgICAgICAgIGlmICgoKmluZCkgPCAwKSAgICAgLy8gaWYgTlVMTCByZXR1cm5lZAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAqdE5hbWVfID0gJ1wwJzsgLy90aGlzIG9wZXIgaGFzIG5vIHRhYmxlIG5hbWUsIHRoaXMgaXMgdmFsaWQKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8vIGluZGljYXRvciBpcyB6ZXJvLCBub3JtYWwgZGF0YQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobGVuID4gTU5BTUUpIHsgbGVuID0gTU5BTUU7IH0gLy8gd2F0Y2ggZm9yIGp1bmsKICAgICAgICAgICAgICAgIHN0cl9uY3B5KHROYW1lXywgcHRyLCBsZW4pOwogICAgICAgICAgICAgICAgdE5hbWVfW2xlbl0gPSAnXDAnOwogICAgICAgICAgICAgICAgdHJ1bmNhdGVfd2hpdGVzcGFjZSh0TmFtZV8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgOTogLy9jYXJkaW5hbGl0eQogICAgICAgICAgICBpZiAoKCppbmQpICE9IDApICAgIC8vTlVMTCBvciB0cnVuY2F0aW9uIGluZGljYXRlZCwgbWVhbnMgYmFkIGRhdGEKICAgICAgICAgICAgICAgIHJldHVybiBFWEVfRVhQTEFJTl9CQURfREFUQTsKICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAvLyBpbmRpY2F0b3IgaXMgemVybywgbm9ybWFsIGRhdGEKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChleGVVdGlsVGRiKCkuaXNPcHRpb25DKCkpCiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eV8gPSAxMDA7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgY2FyZGluYWxpdHlfICA9ICooKGZsb2F0KilwdHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTA6IC8vb3BlcmF0b3IgY29zdAogICAgICAgICAgICBpZiAoKCppbmQpICE9IDApICAgIC8vTlVMTCBvciB0cnVuY2F0aW9uIGluZGljYXRlZCwgbWVhbnMgYmFkIGRhdGEKICAgICAgICAgICAgICAgIHJldHVybiBFWEVfRVhQTEFJTl9CQURfREFUQTsKICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAvLyBpbmRpY2F0b3IgaXMgemVybywgbm9ybWFsIGRhdGEKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3BlcmF0b3JDb3N0XyA9ICooKGZsb2F0KilwdHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTE6IC8vdG90YWwgY29zdAogICAgICAgICAgICBpZiAoKCppbmQpICE9IDApICAgIC8vTlVMTCBvciB0cnVuY2F0aW9uIGluZGljYXRlZCwgbWVhbnMgYmFkIGRhdGEKICAgICAgICAgICAgICAgIHJldHVybiBFWEVfRVhQTEFJTl9CQURfREFUQTsKICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAvLyBpbmRpY2F0b3IgaXMgemVybywgbm9ybWFsIGRhdGEKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG90YWxDb3N0XyA9ICooKGZsb2F0KilwdHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTI6IC8vZGV0YWlsIGNvc3QKICAgICAgICAgICAgaWYgKCgqaW5kKSA8IDApICAgICAvLyBpZiBOVUxMIHJldHVybmVkCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0cl9jcHlfYyhkZXRhaWxDb3N0XywgIihub3QgZm91bmQpIik7Ly8gcmVzb2x2ZSB0aGlzIGVycm9yIGdyYWNlZnVsbHkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8vIGluZGljYXRvciBpcyB6ZXJvLCBub3JtYWwgZGF0YQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobGVuID4gTUNPU1QpIHsgbGVuID0gTUNPU1Q7IH0gLy8gd2F0Y2ggZm9yIGp1bmsKICAgICAgICAgICAgICAgIHN0cl9uY3B5KGRldGFpbENvc3RfLCBwdHIsIGxlbik7CiAgICAgICAgICAgICAgICBkZXRhaWxDb3N0X1tsZW5dID0gJ1wwJzsKICAgICAgICAgICAgICAgIHRydW5jYXRlX3doaXRlc3BhY2UoZGV0YWlsQ29zdF8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTM6IC8vZGVzY3JpcHRpb24KICAgICAgICAgICAgaWYgKCgqaW5kKSA8IDApICAgICAvLyBpZiBOVUxMIHJldHVybmVkCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0cl9jcHlfYyhkZXNjcmlwdGlvbl8sICIobm90IGZvdW5kKSIpOy8vcmVzb2x2ZSB0aGlzIGVycm9yIGdyYWNlZnVsbHkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8vIGluZGljYXRvciBpcyB6ZXJvLCBub3JtYWwgZGF0YQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobGVuID4gTURFU0MpIHsgbGVuID0gTURFU0M7IH0gLy8gd2F0Y2ggZm9yIGp1bmsKICAgICAgICAgICAgICAgIHN0cl9uY3B5KGRlc2NyaXB0aW9uXywgcHRyLCBsZW4pOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb25fW2xlbl0gPSAnXDAnOwogICAgICAgICAgICAgICAgdHJ1bmNhdGVfd2hpdGVzcGFjZShkZXNjcmlwdGlvbl8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gLy8gZW5kIHN3aXRjaAogICAgfSAvLyBlbmQgZm9yCiAgICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9uIE5hbWU6IEZvcm1hdEZvckYKICAKICBBcmd1bWVudCBMaXN0OiBOb25lCiAgCiAgUmV0dXJuIFN0YXR1czogTm9uZSAodm9pZCkKICAKICBDbGFzcyBEYXRhIEFjY2Vzc2VkOgogIDEzICJsb2NhbCBjb2x1bW4gZGF0YSIgdmFyaWFibGVzIHdpdGggY29udGVudHMgb2YgdGhpcyByb3cgKHJlYWQgb25seSkKICBjaGFyICBvcHRGT3V0cHV0W01MRU5dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdyaXRlIG9ubHkpCiAgCiAgRGVzY3JpcHRpb246CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEV4RXhlVXRpbERpc3BsYXlFeHBsYWluVGNiOjpGb3JtYXRGb3JGKCkKewogIGNoYXIgKiBjdXJyZW50ID0gJm9wdEZPdXRwdXRbMF07CiAgCiAgaWYgKGxlZnRDaGlsZF8gPT0gMCkKICAgIHN0cl9jcHkoY3VycmVudCwgIi4gICAiLCA0KTsKICBlbHNlIGlmIChsZWZ0Q2hpbGRfID4gOTk5OSkJLy8gd2UgaGFkIGFuIG92ZXJmbG93CiAgICBzdHJfY3B5KGN1cnJlbnQsICIqKioqIiwgNCk7CiAgZWxzZQogICAgc3RyX3NwcmludGYoY3VycmVudCwgIiVkICAgICIsIGxlZnRDaGlsZF8pOwogIGN1cnJlbnQgKz0gNDsKCiAgc3RyX2NweShjdXJyZW50LCAiICIsIDEpOy8vc3BhY2UgYmV0d2VlbiBjb2x1bW5zCiAgY3VycmVudCArPSAxOwoKICBpZiAocmlnaHRDaGlsZF8gPT0gMCkKICAgIHN0cl9jcHkoY3VycmVudCwgIi4gICAiLCA0KTsKICBlbHNlIGlmIChyaWdodENoaWxkXyA+IDk5OTkpCS8vIHdlIGhhZCBhbiBvdmVyZmxvdwogICAgc3RyX2NweShjdXJyZW50LCAiKioqKiIsIDQpOwogIGVsc2UKICAgIHN0cl9zcHJpbnRmKGN1cnJlbnQsICIlZCAgICAiLCByaWdodENoaWxkXyk7CiAgY3VycmVudCArPSA0OwoKICBzdHJfY3B5KGN1cnJlbnQsICIgIiwgMSk7Ly9zcGFjZSBiZXR3ZWVuIGNvbHVtbnMKICBjdXJyZW50ICs9IDE7CgogIGlmIChzZXFOdW1fID09IDApCiAgICBzdHJfY3B5KGN1cnJlbnQsICIuICAgIiwgNCk7CiAgZWxzZSBpZiAoc2VxTnVtXyA+IDk5OTkpCS8vIHdlIGhhZCBhbiBvdmVyZmxvdwogICAgc3RyX2NweShjdXJyZW50LCAiKioqKiIsIDQpOwogIGVsc2UKICAgIHN0cl9zcHJpbnRmKGN1cnJlbnQsICIlZCAgICAiLCBzZXFOdW1fKTsKICBjdXJyZW50ICs9IDQ7CiAgICAgIAogIHN0cl9jcHkoY3VycmVudCwgIiAiLCAxKTsvL3NwYWNlIGJldHdlZW4gY29sdW1ucwogIGN1cnJlbnQgKz0gMTsKCiAgLy9hcHBlbmQgdGhlIG9wZXJhdG9yIG5hbWUsIGZpcnN0IDIwIGNoYXJzIG9ubHkKICBib29sIHBhZF93aXRoX2JsYW5rcyA9IGZhbHNlOwogIGZvciAoSW50MzIgaSA9IDA7IGkgPCAyMDsgKytpKQogIHsKICAgIGlmIChvcGVyTmFtZV9baV0gPT0gJ1wwJykKICAgICAgcGFkX3dpdGhfYmxhbmtzID0gdHJ1ZTsKICAgIAogICAgaWYgKHBhZF93aXRoX2JsYW5rcykKICAgICAgKmN1cnJlbnQrKyA9ICcgJzsKICAgIGVsc2UKICAgICAgKmN1cnJlbnQrKyA9IFRPTE9XRVIob3Blck5hbWVfW2ldKTsKICB9CiAgCiAgc3RyX2NweShjdXJyZW50LCAiICAiLCAyKTsvL3NwYWNlIGJldHdlZW4gY29sdW1ucwogIGN1cnJlbnQgKz0gMjsKICAKICAvL2FkZCBpbmZvcm1hdGlvbiB0byB0aGUgb3B0aW1pemF0aW9ucyBjb2x1bW4KICBJbnQzMiByZW1haW5pbmdfd2lkdGggPSA4OwogIGlmIChzdHJfc3RyKGRlc2NyaXB0aW9uXywgIm9sdF9vcHRfbGVhbjogdXNlZCIpICE9IDApCiAgICB7CiAgICAgIHN0cl9jcHkoY3VycmVudCwgIm9sICIsIDMpOwogICAgICBjdXJyZW50ICs9IDM7CiAgICAgIHJlbWFpbmluZ193aWR0aCAtPTM7CiAgICB9CiAgZWxzZSBpZiAoc3RyX3N0cihkZXNjcmlwdGlvbl8sICJvbHRfb3B0aW1pemF0aW9uOiB1c2VkIikgIT0gMCkKICAgIHsKICAgICAgc3RyX2NweShjdXJyZW50LCAibyAiLCAyKTsKICAgICAgY3VycmVudCArPSAyOwogICAgICByZW1haW5pbmdfd2lkdGggLT0yOwogICAgfQogIGlmIChzdHJfc3RyKGRlc2NyaXB0aW9uXywgImZhc3Rfc2NhbjogdXNlZCIpICE9IDApCiAgICB7CiAgICAgIHN0cl9jcHkoY3VycmVudCwgImZzICIsIDMpOwogICAgICBjdXJyZW50ICs9IDM7CiAgICAgIHJlbWFpbmluZ193aWR0aCAtPTM7CiAgICB9CiAgaWYgKHN0cl9zdHIoZGVzY3JpcHRpb25fLCAiZmFzdF9yZXBseWRhdGFfbW92ZTogdXNlZCIpICE9IDApCiAgICB7CiAgICAgIHN0cl9jcHkoY3VycmVudCwgImZyICIsIDMpOwogICAgICBjdXJyZW50ICs9IDM7CiAgICAgIHJlbWFpbmluZ193aWR0aCAtPTM7CiAgICB9CiAgaWYgKHN0cl9zdHIoZGVzY3JpcHRpb25fLCAibXZfcmV3cml0ZTogdXNlZCIpICE9IDApCiAgICB7CiAgICAgIHN0cl9jcHkoY3VycmVudCwgIncgIiwgMik7CiAgICAgIGN1cnJlbnQgKz0gMjsKICAgICAgcmVtYWluaW5nX3dpZHRoIC09MjsKICAgIH0KICBpZiAoc3RyX3N0cihkZXNjcmlwdGlvbl8sICJqb2luX21ldGhvZDogdW5pcXVlLWhhc2giKSAhPSAwKQogICAgewogICAgICBzdHJfY3B5KGN1cnJlbnQsICJ1ICIsIDIpOwogICAgICBjdXJyZW50ICs9IDI7CiAgICAgIHJlbWFpbmluZ193aWR0aCAtPTI7CiAgICB9CiAgaWYgKHN0cl9zdHIoZGVzY3JpcHRpb25fLCAic2VhbW9uc3Rlcl9leGNoYW5nZTogeWVzIikgIT0gMCkKICAgIHsKICAgICAgc3RyX2NweShjdXJyZW50LCAic20iLCAyKTsKICAgICAgY3VycmVudCArPSAyOwogICAgICByZW1haW5pbmdfd2lkdGggLT0gMjsKICAgIH0KCiAgaWYgKHN0cl9jbXBfYyhvcGVyTmFtZV8sICJUUkFGT0RJT05fSU5TRVJUIikgPT0gMCB8fCAKICAgICAgc3RyX2NtcF9jKG9wZXJOYW1lXywgIlRSQUZPRElPTl9VUFNFUlQiKSA9PSAwIHx8IAogICAgICBzdHJfY21wX2Mob3Blck5hbWVfLCAiVFJBRk9ESU9OX1ZTQkJfVVBTRVJUIikgPT0gMCB8fCAKICAgICAgc3RyX2NtcF9jKG9wZXJOYW1lXywgIlRSQUZPRElPTl9MT0FEIikgPT0gMCB8fCAKICAgICAgc3RyX2NtcF9jKG9wZXJOYW1lXywgIlRSQUZPRElPTl9ERUxFVEUiKSA9PSAwIHx8CiAgICAgIHN0cl9jbXBfYyhvcGVyTmFtZV8sICJUUkFGT0RJT05fVVBEQVRFIikgPT0gMCkKICAgIHsKICAgICAgaWYgKChzdHJfc3RyKGRlc2NyaXB0aW9uXywgInJlZ2lvbl90cmFuc2FjdGlvbjogZW5hYmxlZCIpICE9IDApIHx8CiAgICAgICAgICAoc3RyX3N0cihkZXNjcmlwdGlvbl8sICJoYmFzZV90cmFuc2FjdGlvbjogdXNlZCIpICE9IDApKQogICAgICAgIHsKICAgICAgICAgIGlmIChzdHJfc3RyKGRlc2NyaXB0aW9uXywgInJlZ2lvbl90cmFuc2FjdGlvbjogZW5hYmxlZCIpICE9IDApCiAgICAgICAgICAgIHN0cl9jcHkoY3VycmVudCwgInIiLCAxKTsKICAgICAgICAgIGVsc2UgaWYgKHN0cl9zdHIoZGVzY3JpcHRpb25fLCAiaGJhc2VfdHJhbnNhY3Rpb246IHVzZWQiKSAhPSAwKQogICAgICAgICAgICBzdHJfY3B5KGN1cnJlbnQsICJoIiwgMSk7CiAgICAgICAgICArK2N1cnJlbnQ7CiAgICAgICAgICAtLXJlbWFpbmluZ193aWR0aDsKICAgICAgICB9CiAgICB9IC8vIGluc2VydCwgdXBzZXJ0LCBkZWxldGUKCiAgLy9ub3cgYWRqdXN0IHRoZSBwb2ludGVyIHNvIHRoYXQgdGhlIHdpZHRoIGlzIG5vdCBleGNlZWRlZAogIGlmIChyZW1haW5pbmdfd2lkdGggPD0gMCkKICAgIGN1cnJlbnQgKz0gcmVtYWluaW5nX3dpZHRoOwogIGVsc2UKICAgIGZvciAoOyByZW1haW5pbmdfd2lkdGggPiAwOyAtLXJlbWFpbmluZ193aWR0aCkKICAgICAgKmN1cnJlbnQrKyA9ICcgJzsKICAKICBzdHJfY3B5KGN1cnJlbnQsICIgICIsIDIpOy8vc3BhY2UgYmV0d2VlbiBjb2x1bW5zCiAgY3VycmVudCArPSAyOwogIAogIC8vYWRkIGluZm9ybWF0aW9uIHRvIHRoZSBkZXNjcmlwdGlvbiBjb2x1bW4KICByZW1haW5pbmdfd2lkdGggPSAyMDsgLy9yZXNldCBmb3IgdGhpcyBjb2x1bW4KICBpZiAoc3RyX2NtcF9jKG9wZXJOYW1lXywgIlJPT1QiKSA9PSAwKQogICAgewogICAgICBpZiAoc3RyX3N0cihkZXNjcmlwdGlvbl8sICJ1cGRfYWN0aW9uX29uX2Vycm9yOiByZXR1cm4iKSAhPSAwKQoJc3RyX2NweShjdXJyZW50LCAiciIsIDEpOwogICAgICBlbHNlIGlmIChzdHJfc3RyKGRlc2NyaXB0aW9uXywgInVwZF9hY3Rpb25fb25fZXJyb3I6IHhuX3JvbGxiYWNrIikgIT0gMCkKCXN0cl9jcHkoY3VycmVudCwgIngiLCAxKTsKICAgICAgZWxzZSBpZiAoc3RyX3N0cihkZXNjcmlwdGlvbl8sICJ1cGRfYWN0aW9uX29uX2Vycm9yOiBwYXJ0aWFsX3VwZCIpICE9IDApCglzdHJfY3B5KGN1cnJlbnQsICJwIiwgMSk7CiAgICAgIGVsc2UgaWYgKHN0cl9zdHIoZGVzY3JpcHRpb25fLCAidXBkX2FjdGlvbl9vbl9lcnJvcjogc2F2ZXBvaW50IikgIT0gMCkKCXN0cl9jcHkoY3VycmVudCwgInMiLCAxKTsKICAgICAgZWxzZQoJc3RyX2NweShjdXJyZW50LCAiICIsIDEpOwogICAgICArK2N1cnJlbnQ7CiAgICAgIC0tcmVtYWluaW5nX3dpZHRoOwoKICAgICAgaWYgKHN0cl9zdHIoZGVzY3JpcHRpb25fLCAiZHAyX3huczogZW5hYmxlZCIpICE9IDApCiAgICAgIHsKCXN0cl9jcHkoY3VycmVudCwgImQiLCAxKTsKCSsrY3VycmVudDsKCS0tcmVtYWluaW5nX3dpZHRoOwogICAgICB9CiAgICB9CiAgZWxzZSBpZiAoc3RyX2NtcF9jKG9wZXJOYW1lXywgIklOREVYX1NDQU4iKSA9PSAwIHx8IHN0cl9jbXBfYyhvcGVyTmFtZV8sICJJTkRFWF9TQ0FOX1VOSVFVRSIpID09IDAgfHwgc3RyX2NtcF9jKG9wZXJOYW1lXywgIlRSQUZPRElPTl9JTkRFWF9TQ0FOIikgPT0gMCkKICAgIHsKICAgICAgY2hhciogaW5kZXhfbG9jID0gc3RyX3N0cihkZXNjcmlwdGlvbl8sICJpbmRleCIpOwogICAgICBjaGFyKiBpbmRleF9sb2NfZW5kID0gc3RyX3N0cihpbmRleF9sb2MsIigiKTsKCiAgICAgIGlmIChpbmRleF9sb2MgIT0gMCkKCXsKCSAgY2hhciAqIGluZGV4X25hbWUgPSBzdHJfc3RyKGluZGV4X2xvYywgIi4iKTsKCSAgaWYgKChpbmRleF9uYW1lICE9IDApICYmIChpbmRleF9uYW1lIDwgaW5kZXhfbG9jX2VuZCkgKSAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIC4gaW4gdGhlIGluZGV4IG5hbWUgb3Igbm90CgkgICAgewoJICAgICAgaW5kZXhfbmFtZSArPSAxOy8vcmVtb3ZlIHRoZSBjYXRhbG9nCgkgICAgICBpbmRleF9uYW1lID0gc3RyX3N0cihpbmRleF9uYW1lLCAiLiIpOwoJICAgICAgaWYgKGluZGV4X25hbWUgIT0gMCkKCQlpbmRleF9uYW1lICs9IDE7Ly9yZW1vdmUgdGhlIHNjaGVtYQoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIC8vaWYgdGhlIGNhdGFsb2cuc2NoZW1hLiB3YXMgYWxyZWFkeSBvdXQsIHNlYXJjaCBmb3IgYSBibGFuawoJICAgICAgaW5kZXhfbmFtZSA9IHN0cl9zdHIoaW5kZXhfbG9jLCAiICIpOwoJICAgICAgaWYgKGluZGV4X25hbWUgIT0gMCkKCQkrK2luZGV4X25hbWU7CgkgICAgfQoJICAvL2F0IHRoaXMgcG9pbnQgc2hvdWxkIGVpdGhlciBiZSBwb2ludGluZyB0byB0aGUgaW5kZXggbmFtZSAobm90IGNhdC5zY2gpCgkgIC8vIG9yIHplcm8gaWYgZmVsbCB0aHJvdWdoIGVsc2UgYW5kIHNlYXJjaCBmYWlsZWQKCSAgaWYgKGluZGV4X25hbWUgPT0gMCkKCSAgICB7CgkgICAgICAvL2Vycm9yCgkgICAgICBzdHJfY3B5KGN1cnJlbnQsICIqKioiLCAzKTsKCSAgICAgIGN1cnJlbnQgKz0gMzsKCSAgICAgIHJlbWFpbmluZ193aWR0aCAtPSAzOwoJICAgIH0KCSAgZWxzZQoJICAgIHdoaWxlICgoKCppbmRleF9uYW1lKSAhPSAnKCcpICYmIChyZW1haW5pbmdfd2lkdGggPjEpKSAvLyBlbnN1cmUgdGhhdCB0aGUgaW5kZXggbmFtZSBmaXRzIHdpdGhpbiB0aGUgMjAgYnl0ZXMgYWxsb2NhdGVkIGZvciB0aGlzIGRlc2NyaXB0aW9uIGNvbHVtbgoJICAgICAgewoJCSpjdXJyZW50ID0gKmluZGV4X25hbWU7CgkJKytjdXJyZW50OwoJCSsraW5kZXhfbmFtZTsKCQktLXJlbWFpbmluZ193aWR0aDsKCSAgICAgIH0KCX0KICAgICAgZWxzZQoJewoJICAvL2Vycm9yLCB3ZSBzaG91bGQgbmV2ZXIgZmFpbCB0byBmaW5kIGluZGV4X3NjYW4KCSAgc3RyX2NweShjdXJyZW50LCAiKioqIiwgMyk7CgkgIGN1cnJlbnQgKz0gMzsKCSAgcmVtYWluaW5nX3dpZHRoIC09IDM7Cgl9CiAgICAgIAogICAgICBpZiAoc3RyX3N0cihkZXNjcmlwdGlvbl8sICJtZGFtOiIpICE9IDApCgl7CiAgICAgICAgICBpZiAocmVtYWluaW5nX3dpZHRoIDw9IDQpCgkgICAgewoJICAgICAgLy8gd2UgaGF2ZSB0byBmaXQgdGhpcyBpbiBpbiB0aGUgbGFzdCA0IGJ5dGVzIChldmVuIGlmIGl0CgkgICAgICAvLyBtZWFucyBvdmVyd3JpdGluZyBwYXJ0IG9mIHRoZSBpbmRleCBuYW1lKQoJICAgICAgLy8gd2UgaGF2ZSAxIGJ5dGUgcmVzZXJ2ZWQgZm9yIGF0bGVhc3QgYSAiICIgLiBTbyB3ZSBuZWVkIAoJICAgICAgLy8gMyBtb3JlIGJ5dGVzIGZvciB0aGlzIGluZm8uIAoJICAgICBzdHJfY3B5KGN1cnJlbnQrcmVtYWluaW5nX3dpZHRoLTMsICIgKG0pIiwgNCk7IAogICAgICAgICAgICAgcmVtYWluaW5nX3dpZHRoID0gMDsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBzdHJfY3B5KGN1cnJlbnQsICIgKG0pIiwgNCk7CgkgICAgICBjdXJyZW50ICs9IDQ7CgkgICAgICByZW1haW5pbmdfd2lkdGggLT0gNDsKCSAgICB9Cgl9CiAgICAgIGVsc2UKCXsKCSAgc3RyX2NweShjdXJyZW50LCAiICIsIDEpOwoJICArK2N1cnJlbnQ7CgkgIC0tcmVtYWluaW5nX3dpZHRoOwoJfQogICAgfQogIGVsc2UgaWYgKHN0cl9jbXBfYyhvcGVyTmFtZV8sICJTUExJVF9UT1AiKSA9PSAwKQogICAgewogICAgICAvL2luc2VydCBudW1iZXIgb2YgcGFyZW50IHByb2Nlc3NlcwogICAgICBjaGFyICogcGFyX3Byb2MgPSBzdHJfc3RyKGRlc2NyaXB0aW9uXywgInBhcmVudF9wcm9jZXNzZXMiKTsKICAgICAgaWYgKHBhcl9wcm9jID09IDApCgl7ICAvL2Vycm9yCgkgICpjdXJyZW50KysgPSAnKic7CgkgIC0tcmVtYWluaW5nX3dpZHRoOwoJfQogICAgICBlbHNlIGlmIChleGVVdGlsVGRiKCkuaXNPcHRpb25DKCkpCgl7CgkgICpjdXJyZW50KysgPSAnIyc7CgkgIC0tcmVtYWluaW5nX3dpZHRoOwoJfQogICAgICBlbHNlCgl7CgkgIHBhcl9wcm9jID0gc3RyX3N0cihwYXJfcHJvYywgIiAiKTsKCSAgaWYgKHBhcl9wcm9jICE9IDApIC8vdGhlcmUgc2hvdWxkIGJlIGEgc3BhY2UKCSAgICB7CgkgICAgICArK3Bhcl9wcm9jOyAKCSAgICAgIHdoaWxlICgoKnBhcl9wcm9jKSAhPSAnICcpCgkJewoJCSAgKmN1cnJlbnQrKyA9ICpwYXJfcHJvYysrOwoJCSAgLS1yZW1haW5pbmdfd2lkdGg7CgkJfQoJICAgIH0KCSAgZWxzZXsKCSAgICAvL2Vycm9yCgkgICAgKmN1cnJlbnQrKyA9ICcqJzsKCSAgICAtLXJlbWFpbmluZ193aWR0aDsKCSAgfQoJfQogICAgICAvL2luc2VydCBwYXJlbnQgcGFydGl0aW9uaW5nIGZ1bmN0aW9uCiAgICAgIGNoYXIgKiBwYXJfZnVuYyA9IHN0cl9zdHIoZGVzY3JpcHRpb25fLCAicGFyZW50X3BhcnRpdGlvbmluZ19mdW5jdGlvbiIpOwogICAgICBjaGFyICogY2hpbGRfZnVuYyA9IHN0cl9zdHIoZGVzY3JpcHRpb25fLCAiY2hpbGRfcGFydGl0aW9uaW5nX2Z1bmN0aW9uIik7CiAgICAgIAogICAgICBpZiAocGFyX2Z1bmMgIT0gMCAmJiBjaGlsZF9mdW5jICE9IDApCS8vYm90aCBzaG91bGQgYmUgcHJlc2VudCBmb3IgdGhpcyBvcGVyYXRvciB0eXBlCgl7CgkgIHBhcl9mdW5jID0gc3RyX3N0cihwYXJfZnVuYywgIiAiKTsKCSAgaWYgKHBhcl9mdW5jICE9IDApCgkgICAgewoJICAgICAgKytwYXJfZnVuYzsKCSAgICAgIGNoYXIqIHJlcCA9IHN0cl9zdHIocGFyX2Z1bmMsICJyZXBsaWNhdGUgbm8gYnJvYWRjYXN0Iik7CgkgICAgICBpZiAocmVwICE9IDAgJiYgcmVwIDwgY2hpbGRfZnVuYykKCQl7CgkJICBzdHJfY3B5KGN1cnJlbnQsICIocmVwLW4pIiwgNyk7CgkJICBjdXJyZW50ICs9NzsKCQkgIHJlbWFpbmluZ193aWR0aCAtPSA3OwoJCX0KCSAgICAgIGVsc2V7CgkJcmVwID0gc3RyX3N0cihwYXJfZnVuYywgImJyb2FkY2FzdCIpOwoJCWlmIChyZXAgIT0gMCAmJiByZXAgPCBjaGlsZF9mdW5jICYmIHN0cl9zdHIocGFyX2Z1bmMsICJicm9hZGNhc3Qgc2tld2VkIikgPT0gMCkKCQkgIHsKCQkgICAgc3RyX2NweShjdXJyZW50LCAiKHJlcC1iKSIsIDcpOwoJCSAgICBjdXJyZW50ICs9IDc7CgkJICAgIHJlbWFpbmluZ193aWR0aCAtPSA3OwoJCSAgfQoJCWVsc2V7CgkJICByZXAgPSBzdHJfc3RyKHBhcl9mdW5jLCAiaGFzaDEtdWQiKTsKCQkgIGlmKHJlcCAhPSAwICYmIHJlcCA8IGNoaWxkX2Z1bmMpCgkJICAgIHsKCQkgICAgICBzdHJfY3B5KGN1cnJlbnQsICIoaDEtdWQpIiwgNyk7CgkJICAgICAgY3VycmVudCArPSA3OwoJCSAgICAgIHJlbWFpbmluZ193aWR0aCAtPSA3OwoJCSAgICB9CgkJICBlbHNlewoJCSAgICByZXAgPSBzdHJfc3RyKHBhcl9mdW5jLCAiaGFzaDEtYnIiKTsKCQkgICAgaWYgKHJlcCAhPSAwICYmIHJlcCA8IGNoaWxkX2Z1bmMpCgkJICAgICAgewoJCQlzdHJfY3B5KGN1cnJlbnQsICIoaDEtYnIpIiwgNyk7CgkJCWN1cnJlbnQgKz0gNzsKCQkJcmVtYWluaW5nX3dpZHRoIC09IDc7CgkJICAgICAgfQoJCSAgICBlbHNlewoJCSAgICAgIHJlcCA9IHN0cl9zdHIocGFyX2Z1bmMsICJoYXNoMi11ZCIpOwoJCSAgICAgIGlmIChyZXAgIT0gMCAmJiByZXAgPCBjaGlsZF9mdW5jKQoJCQl7CgkJCSAgc3RyX2NweShjdXJyZW50LCAiKGgyLXVkKSIsIDcpOwoJCQkgIGN1cnJlbnQgKz0gNzsKCQkJICByZW1haW5pbmdfd2lkdGggLT0gNzsKCQkJfQoJCSAgICAgIGVsc2V7CgkJCXJlcCA9IHN0cl9zdHIocGFyX2Z1bmMsICJoYXNoMi1iciIpOwoJCQlpZiAocmVwICE9IDAgJiYgcmVwIDwgY2hpbGRfZnVuYykKCQkJICB7CgkJCSAgICBzdHJfY3B5KGN1cnJlbnQsICIoaDItYnIpIiwgNyk7CgkJCSAgICBjdXJyZW50ICs9IDc7CgkJCSAgICByZW1haW5pbmdfd2lkdGggLT03OwoJCQkgIH0KCQkJZWxzZXsKCQkJICByZXAgPSBzdHJfc3RyKHBhcl9mdW5jLCAiaGFzaC11ZCIpOwoJCQkgIGlmIChyZXAgIT0gMCAmJiByZXAgPCBjaGlsZF9mdW5jKQoJCQkgICAgewoJCQkgICAgICBzdHJfY3B5KGN1cnJlbnQsICIoaDAtdWQpIiwgNyk7CgkJCSAgICAgIGN1cnJlbnQgKz0gNzsKCQkJICAgICAgcmVtYWluaW5nX3dpZHRoIC09IDc7CgkJCSAgICB9CgkJCSAgZWxzZXsKCQkJICAgIHJlcCA9IHN0cl9zdHIocGFyX2Z1bmMsICJoYXNoLWJyIik7CgkJCSAgICBpZiAocmVwICE9IDAgJiYgcmVwIDwgY2hpbGRfZnVuYykKCQkJICAgICAgewoJCQkJc3RyX2NweShjdXJyZW50LCAiKGgwLWJyKSIsIDcpOwoJCQkJY3VycmVudCArPSA3OwoJCQkJcmVtYWluaW5nX3dpZHRoIC09IDc7CgkJCSAgICAgIH0KCQkJICAgIGVsc2V7CgkJCSAgICAgIHJlcCA9IHN0cl9zdHIocGFyX2Z1bmMsICJleGFjdGx5Iik7CgkJCSAgICAgIGlmIChyZXAgIT0gMCAmJiByZXAgPCBjaGlsZF9mdW5jKQoJCQkJewoJCQkJICAvL2RvIG5vdGhpbmcsIGV4YWN0bHkgb25lIHBhcnRpdGlvbmluZyBmdW5jdGlvbgoJCQkJfQoJCQkgICAgICBlbHNlewoJCQkJLy9zZWFyY2ggZm9yIHRoZSBuYW1lIG9mIHRoZSBwYXJ0aXRpb25pbmcgZnVuY3Rpb24KCQkJCS8qCgkJCQkgIHRoZSBsYXlvdXQgaXMgdGhlIGZvbGxvd2luZzoKCQkJCSAgcGFyZW50X3BhcnRpdGlvbmluZ19mdW5jdGlvbjogZ3JvdXBlZCB4IHRvIHksIDxvcHRpb25hbD4gUEFQQSB3aXRoIHogUEEocyksIDxvcHRpb25hbD4gIm91ciBwYXJ0aXRpb25pbmdmdW5jdGlvbiIKCQkJCSAgKi8KCQkJCWNoYXIgKiBjb21tYSA9IHN0cl9zdHIocGFyX2Z1bmMsICIsIik7CgkJCQlpZiAoY29tbWEgPT0gMCB8fCBjb21tYSA+IGNoaWxkX2Z1bmMpCgkJCQkgIHsKCQkJCSAgICAvL25vIGNvbW1hcyBwcmVzZW50LCB3ZSBmb3VuZCBpdCwgZG8gbm90aGluZwoJCQkJICB9CgkJCQllbHNley8vZm91bmQgb25lIGNvbW1hLCBza2lwIGN1cnJlbnQsIHNlYXJjaCBmb3IgbmV4dAoJCQkJICAKCQkJCSAgY2hhciAqIGNvbW1hMiA9IHN0cl9zdHIoY29tbWEgKyAxLCAiLCIpOwoJCQkJICBpZiAoY29tbWEyICE9IDAgJiYgY29tbWEyIDwgY2hpbGRfZnVuYykKCQkJCSAgICB7CgkJCQkgICAgICBwYXJfZnVuYyA9IGNvbW1hMiArIDI7IC8vc2tpcCAiLCAiCgkJCQkgICAgfQoJCQkJICBlbHNlLy9laXRoZXIgbm90IGZvdW5kIG9yIGZvdW5kIGluIGNoaWxkCgkJCQkgICAgewoJCQkJICAgICAgcGFyX2Z1bmMgPSBjb21tYSArIDI7IC8vc2tpcCAiLCAiCgkJCQkgICAgfQoJCQkJfQoJCQkJLy9ieSBub3cgdGhlIHBhcl9mdW5jIGhhcyBiZWVuIHJlYWRqdXN0ZWQsIHByb2NlZWQgdG8gZXh0cmFjdAoJCQkJKmN1cnJlbnQrKyA9ICcoJzsKCQkJCS0tcmVtYWluaW5nX3dpZHRoOwoJCQkJZm9yIChJbnQzMiBpID0gMDsgaSA8IDU7ICsrIGkpCgkJCQkgIHsKCQkJCSAgICAqY3VycmVudCsrID0gKnBhcl9mdW5jKys7CgkJCQkgICAgLS1yZW1haW5pbmdfd2lkdGg7CgkJCQkgIH0KCQkJCSpjdXJyZW50KysgPSAnKSc7CgkJCQktLXJlbWFpbmluZ193aWR0aDsKCQkJICAgICAgfS8vZXhhY3RseSBvbmUKCQkJICAgIH0vL2hhc2gtYnIKCQkJICB9Ly9oYXNoLXVkCgkJCX0vL2hhc2gyLWJyCgkJICAgICAgfS8vaGFzaDItdWQKCQkgICAgfS8vaGFzaDEtYnIKCQkgIH0vL2hhc2gxLXVkCgkJfS8vcmVwLWIKCSAgICAgIH0vL3JlcC1uCgkgICAgfS8vZW5kIG9mIHBhcl9mdW5jICE9IDAgYWZ0ZXIgc2VhcmNoaW5nIGZvciBhIHNwYWNlCgkgIGVsc2UKCSAgICB7CgkgICAgICAvL2hhbmRsZSBpbmNvcnJlY3QgcHJvdmlkZWQgZm9ybWF0IG9ubHkgZm9yIHBhcmVudAoJICAgICAgc3RyX2NweShjdXJyZW50LCAiKCoqKikiLCA1KTsKCSAgICAgIGN1cnJlbnQgKz0gNTsKCSAgICAgIHJlbWFpbmluZ193aWR0aCAtPSA1OwoJICAgIH0JICAgIAoJfQogICAgICBlbHNlIC8vZXJyb3IsIGJvdGggcGFyZW50IGFuZCBjaGlsZCBwYXJ0aXRpb25pbmcgZnVuY3Rpb25zIHNob3VsZCBiZSBwcmVzZW50Cgl7CgkgIC8vaGFuZGxlIGluY29ycmVjdCBwcm92aWRlZCBmb3JtYXQgb25seSBmb3IgcGFyZW50CgkgIHN0cl9jcHkoY3VycmVudCwgIigqKiopIiwgNSk7CgkgIGN1cnJlbnQgKz0gNTsKCSAgcmVtYWluaW5nX3dpZHRoIC09IDU7Cgl9CiAgICAgICpjdXJyZW50KysgPSAnOic7CiAgICAgIC0tcmVtYWluaW5nX3dpZHRoOwogICAgICAKICAgICAgLy9pbnNlcnQgbnVtYmVyIG9mIGNoaWxkIHByb2Nlc3NlcwogICAgICBjaGFyICogY2hpbGRfcHJvYyA9IHN0cl9zdHIoZGVzY3JpcHRpb25fLCAiY2hpbGRfcHJvY2Vzc2VzIik7CiAgICAgIGlmIChjaGlsZF9wcm9jID09IDApCgl7Ly9lcnJvcgoJICAqY3VycmVudCsrID0gJyonOwoJICAtLXJlbWFpbmluZ193aWR0aDsKCX0KICAgICAgZWxzZSBpZiAoZXhlVXRpbFRkYigpLmlzT3B0aW9uQygpKQoJewoJICAqY3VycmVudCsrID0gJyMnOwoJICAtLXJlbWFpbmluZ193aWR0aDsKCX0KICAgICAgZWxzZXsKCWNoaWxkX3Byb2MgPSBzdHJfc3RyKGNoaWxkX3Byb2MsICIgIik7CglpZiAoY2hpbGRfcHJvYyAhPSAwKQoJICB7CgkgICAgKytjaGlsZF9wcm9jOyAKCSAgICB3aGlsZSAoKCpjaGlsZF9wcm9jKSAhPSAnICcpCgkgICAgICB7CgkJKmN1cnJlbnQrKyA9ICpjaGlsZF9wcm9jKys7CgkJLS1yZW1haW5pbmdfd2lkdGg7CgkgICAgICB9CgkgIH0KCWVsc2V7CgkgIC8vZXJyb3IKCSAgKmN1cnJlbnQrKyA9ICcqJzsKCSAgLS1yZW1haW5pbmdfd2lkdGg7Cgl9CiAgICAgIH0KICAgICAgCiAgICAgIC8vaW5zZXJ0IGNoaWxkIHBhcnRpdGlvbmluZyBmdW5jdGlvbiwgc2VhcmNoZWQgZm9yIGl0IGFib3ZlICh3aXRoIHBhcmVudCkKICAgICAgaWYgKGNoaWxkX2Z1bmMgIT0gMCkKCXsKCSAgY2hpbGRfZnVuYyA9IHN0cl9zdHIoY2hpbGRfZnVuYywgIiAiKTsKCSAgaWYgKGNoaWxkX2Z1bmMgIT0gMCkKCSAgICB7CgkgICAgICArK2NoaWxkX2Z1bmM7CgkgICAgICBjaGFyKiByZXAgPSBzdHJfc3RyKGNoaWxkX2Z1bmMsICJyZXBsaWNhdGUgbm8gYnJvYWRjYXN0Iik7CgkgICAgICBpZiAocmVwICE9IDApCgkJewoJCSAgc3RyX2NweShjdXJyZW50LCAiKHJlcC1uKSIsIDcpOwoJCSAgY3VycmVudCArPTc7CgkJICByZW1haW5pbmdfd2lkdGggLT0gNzsKCQl9CgkgICAgICBlbHNlewoJCXJlcCA9IHN0cl9zdHIoY2hpbGRfZnVuYywgImJyb2FkY2FzdCIpOwoJCWlmIChyZXAgIT0gMCAmJiBzdHJfc3RyKGNoaWxkX2Z1bmMsICJicm9hZGNhc3Qgc2tld2VkIikgPT0gMCkKCQkgIHsKCQkgICAgc3RyX2NweShjdXJyZW50LCAiKHJlcC1iKSIsIDcpOwoJCSAgICBjdXJyZW50ICs9IDc7CgkJICAgIHJlbWFpbmluZ193aWR0aCAtPSA3OwoJCSAgfQoJCWVsc2V7CgkJICByZXAgPSBzdHJfc3RyKGNoaWxkX2Z1bmMsICJoYXNoMS11ZCIpOwoJCSAgaWYocmVwICE9IDApCgkJICAgIHsKCQkgICAgICBzdHJfY3B5KGN1cnJlbnQsICIoaDEtdWQpIiwgNyk7CgkJICAgICAgY3VycmVudCArPSA3OwoJCSAgICAgIHJlbWFpbmluZ193aWR0aCAtPSA3OwoJCSAgICB9CgkJICBlbHNlewoJCSAgICByZXAgPSBzdHJfc3RyKGNoaWxkX2Z1bmMsICJoYXNoMS1iciIpOwoJCSAgICBpZiAocmVwICE9IDApCgkJICAgICAgewoJCQlzdHJfY3B5KGN1cnJlbnQsICIoaDEtYnIpIiwgNyk7CgkJCWN1cnJlbnQgKz0gNzsKCQkJcmVtYWluaW5nX3dpZHRoIC09IDc7CgkJICAgICAgfQoJCSAgICBlbHNlewoJCSAgICAgIHJlcCA9IHN0cl9zdHIoY2hpbGRfZnVuYywgImhhc2gyLXVkIik7CgkJICAgICAgaWYgKHJlcCAhPSAwKQoJCQl7CgkJCSAgc3RyX2NweShjdXJyZW50LCAiKGgyLXVkKSIsIDcpOwoJCQkgIGN1cnJlbnQgKz0gNzsKCQkJICByZW1haW5pbmdfd2lkdGggLT0gNzsKCQkJfQoJCSAgICAgIGVsc2V7CgkJCXJlcCA9IHN0cl9zdHIoY2hpbGRfZnVuYywgImhhc2gyLWJyIik7CgkJCWlmIChyZXAgIT0gMCkKCQkJICB7CgkJCSAgICBzdHJfY3B5KGN1cnJlbnQsICIoaDItYnIpIiwgNyk7CgkJCSAgICBjdXJyZW50ICs9IDc7CgkJCSAgICByZW1haW5pbmdfd2lkdGggLT03OwoJCQkgIH0KCQkJZWxzZXsKCQkJICByZXAgPSBzdHJfc3RyKGNoaWxkX2Z1bmMsICJoYXNoLXVkIik7CgkJCSAgaWYgKHJlcCAhPSAwKQoJCQkgICAgewoJCQkgICAgICBzdHJfY3B5KGN1cnJlbnQsICIoaDAtdWQpIiwgNyk7CgkJCSAgICAgIGN1cnJlbnQgKz0gNzsKCQkJICAgICAgcmVtYWluaW5nX3dpZHRoIC09IDc7CgkJCSAgICB9CgkJCSAgZWxzZXsKCQkJICAgIHJlcCA9IHN0cl9zdHIoY2hpbGRfZnVuYywgImhhc2gtYnIiKTsKCQkJICAgIGlmIChyZXAgIT0gMCkKCQkJICAgICAgewoJCQkJc3RyX2NweShjdXJyZW50LCAiKGgwLWJyKSIsIDcpOwoJCQkJY3VycmVudCArPSA3OwoJCQkJcmVtYWluaW5nX3dpZHRoIC09IDc7CgkJCSAgICAgIH0KCQkJICAgIGVsc2V7CgkJCSAgICAgIHJlcCA9IHN0cl9zdHIoY2hpbGRfZnVuYywgImV4YWN0bHkiKTsKCQkJICAgICAgaWYgKHJlcCAhPSAwKQoJCQkJewoJCQkJICAvL2RvIG5vdGhpbmcsIGV4YWN0bHkgb25lIHBhcnRpdGlvbmluZyBmdW5jdGlvbgoJCQkJfQoJCQkgICAgICBlbHNlewoJCQkJKmN1cnJlbnQrKyA9ICcoJzsKCQkJCS0tcmVtYWluaW5nX3dpZHRoOwoJCQkJZm9yIChJbnQzMiBpID0gMDsgaSA8IDU7ICsrIGkpCgkJCQkgIHsKCQkJCSAgICAqY3VycmVudCsrID0gKmNoaWxkX2Z1bmMrKzsKCQkJCSAgICAtLXJlbWFpbmluZ193aWR0aDsKCQkJCSAgfQoJCQkJKmN1cnJlbnQrKyA9ICcpJzsKCQkJCS0tcmVtYWluaW5nX3dpZHRoOwoJCQkgICAgICB9CgkJCSAgICB9Ly9oYXNoLWJyCgkJCSAgfS8vaGFzaC11ZAoJCQl9Ly9oYXNoMi1icgoJCSAgICAgIH0vL2hhc2gyLXVkCgkJICAgIH0vL2hhc2gxLWJyCgkJICB9Ly9oYXNoMS11ZAoJCX0vL3JlcC1iCgkgICAgICB9Ly9yZXAtbgoJICAgIH0KCSAgZWxzZXsvL25vIHNwYWNlIGZvdW5kIHdoZXJlIHRoZXJlIHNob3VsZCBiZSBvbmUKCSAgICBzdHJfY3B5KGN1cnJlbnQsICIoKioqKSIsIDUpOwoJICAgIGN1cnJlbnQgKz0gNTsKCSAgICByZW1haW5pbmdfd2lkdGggLT0gNTsKCSAgfQoJfQogICAgICBlbHNleyAvL2Vycm9yLCBjaGlsZCBwYXJ0aXRpb25pbmcgZnVuY3Rpb25zIHNob3VsZCBiZSBwcmVzZW50CglzdHJfY3B5KGN1cnJlbnQsICIoKioqKSIsIDUpOwoJY3VycmVudCArPSA1OwoJcmVtYWluaW5nX3dpZHRoIC09IDU7CiAgICAgIH0KICAgICAgY2hhciAqIG1lcmdlZF9vcmRlciA9IHN0cl9zdHIoZGVzY3JpcHRpb25fLCAibWVyZ2VkX29yZGVyIik7CiAgICAgIGlmIChtZXJnZWRfb3JkZXIgIT0gMCkgewogICAgICAgIHN0cl9jcHkoY3VycmVudCwgIiAobSkiLCA0KTsKCWN1cnJlbnQgKz0gNDsKCXJlbWFpbmluZ193aWR0aCAtPSA0OwogICAgICB9CiAgICAgICpjdXJyZW50KysgPSAnICc7CiAgICAgIC0tcmVtYWluaW5nX3dpZHRoOwogICAgfQogIGVsc2UgaWYgKHN0cl9jbXBfYyhvcGVyTmFtZV8sICJFU1BfRVhDSEFOR0UiKSA9PSAwICkKICAgIHsKICAgICAgY2hhciAqIHBhcl9wcm9jID0gc3RyX3N0cihkZXNjcmlwdGlvbl8sICJwYXJlbnRfcHJvY2Vzc2VzIik7CiAgICAgIGlmIChwYXJfcHJvYyA9PSAwKQoJeyAgIC8vZXJyb3IsIHRoZXJlIHNob3VsZCBiZSBhIHRva2VuIHByZXNlbnQKCSAgKmN1cnJlbnQrKyA9ICcqJzsKCSAgLS1yZW1haW5pbmdfd2lkdGg7Cgl9CiAgICAgIGVsc2UgaWYgKGV4ZVV0aWxUZGIoKS5pc09wdGlvbkMoKSkKCXsKCSAgKmN1cnJlbnQrKyA9ICcjJzsKCSAgLS1yZW1haW5pbmdfd2lkdGg7Cgl9CiAgICAgIGVsc2V7CglwYXJfcHJvYyA9IHN0cl9zdHIocGFyX3Byb2MsICIgIik7CglpZiAocGFyX3Byb2MgIT0gMCkKCSAgewoJICAgICsrcGFyX3Byb2M7IAoJICAgIHdoaWxlICgoKnBhcl9wcm9jKSAhPSAnICcpCgkgICAgICB7CgkJKmN1cnJlbnQrKyA9ICpwYXJfcHJvYysrOwoJCS0tcmVtYWluaW5nX3dpZHRoOwoJICAgICAgfQoJICB9CgllbHNlewoJICAvL2Vycm9yLCB0aGVyZSBzaG91bGQgYmUgYSBzcGFjZQoJICAqY3VycmVudCsrID0gJyonOwoJICAtLXJlbWFpbmluZ193aWR0aDsKCX0KICAgICAgfQogICAgICBjaGFyICogcGFyX2Z1bmMgPSBzdHJfc3RyKGRlc2NyaXB0aW9uXywgInBhcmVudF9wYXJ0aXRpb25pbmdfZnVuY3Rpb24iKTsKICAgICAgY2hhciAqIGNoaWxkX2Z1bmMgPSBzdHJfc3RyKGRlc2NyaXB0aW9uXywgImNoaWxkX3BhcnRpdGlvbmluZ19mdW5jdGlvbiIpOwogICAgICBpZiAocGFyX2Z1bmMgIT0gMCkKCXsKCSAgY2hhciogcmVwID0gc3RyX3N0cihwYXJfZnVuYywgInJlcGxpY2F0ZSBubyBicm9hZGNhc3QiKTsKCSAgaWYgKHJlcCAhPSAwICYmKGNoaWxkX2Z1bmM9PTAgfHwgcmVwIDwgY2hpbGRfZnVuYykpCgkgICAgewoJICAgICAgc3RyX2NweShjdXJyZW50LCAiKHJlcC1uKSIsIDcpOwoJICAgICAgY3VycmVudCArPTc7CgkgICAgICByZW1haW5pbmdfd2lkdGggLT0gNzsKCSAgICB9CgkgIGVsc2V7CgkgICAgcmVwID0gc3RyX3N0cihwYXJfZnVuYywgImJyb2FkY2FzdCIpOwoJICAgIGlmIChyZXAgIT0gMCAmJiAoY2hpbGRfZnVuYz09MCB8fCByZXAgPCBjaGlsZF9mdW5jKSAmJiBzdHJfc3RyKHBhcl9mdW5jLCAiYnJvYWRjYXN0IHNrZXdlZCIpID09IDApCgkgICAgICB7CgkJc3RyX2NweShjdXJyZW50LCAiKHJlcC1iKSIsIDcpOwoJCWN1cnJlbnQgKz0gNzsKCQlyZW1haW5pbmdfd2lkdGggLT0gNzsKCSAgICAgIH0KCSAgICBlbHNlewoJICAgICAgcmVwID0gc3RyX3N0cihwYXJfZnVuYywgImhhc2gxLXVkIik7CgkgICAgICBpZihyZXAgIT0gMCAmJihjaGlsZF9mdW5jPT0wIHx8IHJlcCA8IGNoaWxkX2Z1bmMpKQoJCXsKCQkgIHN0cl9jcHkoY3VycmVudCwgIihoMS11ZCkiLCA3KTsKCQkgIGN1cnJlbnQgKz0gNzsKCQkgIHJlbWFpbmluZ193aWR0aCAtPSA3OwoJCX0KCSAgICAgIGVsc2V7CgkJcmVwID0gc3RyX3N0cihwYXJfZnVuYywgImhhc2gxLWJyIik7CgkJaWYgKHJlcCAhPSAwICYmKGNoaWxkX2Z1bmM9PTAgfHwgcmVwIDwgY2hpbGRfZnVuYykpCgkJICB7CgkJICAgIHN0cl9jcHkoY3VycmVudCwgIihoMS1icikiLCA3KTsKCQkgICAgY3VycmVudCArPSA3OwoJCSAgICByZW1haW5pbmdfd2lkdGggLT0gNzsKCQkgIH0KCQllbHNlewoJCSAgcmVwID0gc3RyX3N0cihwYXJfZnVuYywgImhhc2gyLXVkIik7CgkJICBpZiAocmVwICE9IDAgJiYoY2hpbGRfZnVuYz09MCB8fCByZXAgPCBjaGlsZF9mdW5jKSkKCQkgICAgewoJCSAgICAgIHN0cl9jcHkoY3VycmVudCwgIihoMi11ZCkiLCA3KTsKCQkgICAgICBjdXJyZW50ICs9IDc7CgkJICAgICAgcmVtYWluaW5nX3dpZHRoIC09IDc7CgkJICAgIH0KCQkgIGVsc2V7CgkJICAgIHJlcCA9IHN0cl9zdHIocGFyX2Z1bmMsICJoYXNoMi1iciIpOwoJCSAgICBpZiAocmVwICE9IDAgJiYoY2hpbGRfZnVuYz09MCB8fCByZXAgPCBjaGlsZF9mdW5jKSkKCQkgICAgICB7CgkJCXN0cl9jcHkoY3VycmVudCwgIihoMi1icikiLCA3KTsKCQkJY3VycmVudCArPSA3OwoJCQlyZW1haW5pbmdfd2lkdGggLT03OwoJCSAgICAgIH0KCQkgICAgZWxzZXsKCQkgICAgICByZXAgPSBzdHJfc3RyKHBhcl9mdW5jLCAiaGFzaC11ZCIpOwoJCSAgICAgIGlmIChyZXAgIT0gMCAmJihjaGlsZF9mdW5jPT0wIHx8IHJlcCA8IGNoaWxkX2Z1bmMpKQoJCQl7CgkJCSAgc3RyX2NweShjdXJyZW50LCAiKGgwLXVkKSIsIDcpOwoJCQkgIGN1cnJlbnQgKz0gNzsKCQkJICByZW1haW5pbmdfd2lkdGggLT0gNzsKCQkJfQoJCSAgICAgIGVsc2V7CgkJCXJlcCA9IHN0cl9zdHIocGFyX2Z1bmMsICJoYXNoLWJyIik7CgkJCWlmIChyZXAgIT0gMCAmJihjaGlsZF9mdW5jPT0wIHx8IHJlcCA8IGNoaWxkX2Z1bmMpKQoJCQkgIHsKCQkJICAgIHN0cl9jcHkoY3VycmVudCwgIihoMC1icikiLCA3KTsKCQkJICAgIGN1cnJlbnQgKz0gNzsKCQkJICAgIHJlbWFpbmluZ193aWR0aCAtPSA3OwoJCQkgIH0KCQkJZWxzZXsKCQkJICBwYXJfZnVuYyA9IHN0cl9zdHIocGFyX2Z1bmMsICIgIik7CgkJCSAgaWYgKHBhcl9mdW5jICE9IDApCgkJCSAgICB7CgkJCSAgICAgICsrcGFyX2Z1bmM7CgkJCSAgICAgICpjdXJyZW50KysgPSAnKCc7CgkJCSAgICAgIC0tcmVtYWluaW5nX3dpZHRoOwoJCQkgICAgICBmb3IgKEludDMyIGkgPSAwOyBpIDwgNTsgKysgaSkKCQkJCXsKCQkJCSAgKmN1cnJlbnQrKyA9ICpwYXJfZnVuYysrOwoJCQkJICAtLXJlbWFpbmluZ193aWR0aDsKCQkJCX0KCQkJICAgICAgLy90cmltIHdoaXRlc3BhY2UgZnJvbSB0aGUgZW5kCgkJCSAgICAgIHdoaWxlICgqKGN1cnJlbnQtMSkgPT0gJyAnKQoJCQkJewoJCQkJICAtLWN1cnJlbnQ7CgkJCQkgICsrcmVtYWluaW5nX3dpZHRoOwoJCQkJfQoJCQkgICAgICAqY3VycmVudCsrID0gJyknOwoJCQkgICAgICAtLXJlbWFpbmluZ193aWR0aDsKCQkJICAgIH0KCQkJICBlbHNlCgkJCSAgICB7CS8vbm8gc3BhY2UgZm91bmQgd2hlcmUgdGhlcmUgc2hvdWxkIGJlIG9uZQoJCQkgICAgICBzdHJfY3B5KGN1cnJlbnQsICIoKioqKSIsIDUpOwoJCQkgICAgICBjdXJyZW50ICs9IDU7CgkJCSAgICAgIHJlbWFpbmluZ193aWR0aCAtPSA1OwoJCQkgICAgfQoJCQl9Ly9oYXNoLWJyCgkJICAgICAgfS8vaGFzaC11ZAoJCSAgICB9Ly9oYXNoMi1icgoJCSAgfS8vaGFzaDItdWQKCQl9Ly9oYXNoMS1icgoJICAgICAgfS8vaGFzaDEtdWQKCSAgICB9Ly9yZXAtYgoJICB9Ly9yZXAtbgoJfS8vaGVyZSBpdCBpcyBub3QgYW4gZXJyb3Igbm90IHRvIGhhdmUgcGFyZW50IHBhcnRpdGlvbmluZyBmdW5jdGlvbgogICAgICAqY3VycmVudCsrID0gJzonOwogICAgICAtLXJlbWFpbmluZ193aWR0aDsKICAgICAgY2hhciAqIGNoaWxkX3Byb2MgPSBzdHJfc3RyKGRlc2NyaXB0aW9uXywgImNoaWxkX3Byb2Nlc3NlcyIpOwogICAgICBpZiAoY2hpbGRfcHJvYyA9PSAwKQoJeyAgIC8vZXJyb3IsIHRoZXJlIHNob3VsZCBiZSBhIHRva2VuIHByZXNlbnQKCSAgKmN1cnJlbnQrKyA9ICcqJzsKCSAgLS1yZW1haW5pbmdfd2lkdGg7Cgl9CiAgICAgIGVsc2UgaWYgKGV4ZVV0aWxUZGIoKS5pc09wdGlvbkMoKSkKCXsKCSAgKmN1cnJlbnQrKyA9ICcjJzsKCSAgLS1yZW1haW5pbmdfd2lkdGg7Cgl9CiAgICAgIGVsc2V7CgljaGlsZF9wcm9jID0gc3RyX3N0cihjaGlsZF9wcm9jLCAiICIpOwoJaWYgKGNoaWxkX3Byb2MgIT0gMCkKCSAgewoJICAgICsrY2hpbGRfcHJvYzsgCgkgICAgd2hpbGUgKCgqY2hpbGRfcHJvYykgIT0gJyAnKQoJICAgICAgewoJCSpjdXJyZW50KysgPSAqY2hpbGRfcHJvYysrOwoJCS0tcmVtYWluaW5nX3dpZHRoOwoJICAgICAgfQoJICB9CgllbHNlewoJICAvL2Vycm9yLCB0aGVyZSBzaG91bGQgYmUgYSBzcGFjZQoJICAqY3VycmVudCsrID0gJyonOwoJICAtLXJlbWFpbmluZ193aWR0aDsKCX0KICAgICAgfQogICAgICAvLy9ub3cgdGFrZSBjYXJlIG9mIGNoaWxkIHBhcnRpdGlvbmluZyBmdW5jdGlvbiBpZiBwcmVzZW50CiAgICAgIGlmIChjaGlsZF9mdW5jICE9IDApCgl7CgkgIGNoYXIqIHJlcCA9IHN0cl9zdHIoY2hpbGRfZnVuYywgInJlcGxpY2F0ZSBubyBicm9hZGNhc3QiKTsKCSAgaWYgKHJlcCAhPSAwKQoJICAgIHsKCSAgICAgIHN0cl9jcHkoY3VycmVudCwgIihyZXAtbikiLCA3KTsKCSAgICAgIGN1cnJlbnQgKz03OwoJICAgICAgcmVtYWluaW5nX3dpZHRoIC09IDc7CgkgICAgfQoJICBlbHNlewoJICAgIHJlcCA9IHN0cl9zdHIoY2hpbGRfZnVuYywgImJyb2FkY2FzdCIpOwoJICAgIGlmIChyZXAgIT0gMCAmJiBzdHJfc3RyKGNoaWxkX2Z1bmMsICJicm9hZGNhc3Qgc2tld2VkIikgPT0gMCkKCSAgICAgIHsKCQlzdHJfY3B5KGN1cnJlbnQsICIocmVwLWIpIiwgNyk7CgkJY3VycmVudCArPSA3OwoJCXJlbWFpbmluZ193aWR0aCAtPSA3OwoJICAgICAgfQoJICAgIGVsc2V7CgkgICAgICByZXAgPSBzdHJfc3RyKGNoaWxkX2Z1bmMsICJoYXNoMS11ZCIpOwoJICAgICAgaWYocmVwICE9IDApCgkJewoJCSAgc3RyX2NweShjdXJyZW50LCAiKGgxLXVkKSIsIDcpOwoJICAgIGN1cnJlbnQgKz0gNzsKCSAgICByZW1haW5pbmdfd2lkdGggLT0gNzsKCQl9CgkgICAgICBlbHNlewoJCXJlcCA9IHN0cl9zdHIoY2hpbGRfZnVuYywgImhhc2gxLWJyIik7CgkJaWYgKHJlcCAhPSAwKQoJCSAgewoJCSAgICBzdHJfY3B5KGN1cnJlbnQsICIoaDEtYnIpIiwgNyk7CgkJICAgIGN1cnJlbnQgKz0gNzsKCQkgICAgcmVtYWluaW5nX3dpZHRoIC09IDc7CgkJICB9CgkJZWxzZXsKCQkgIHJlcCA9IHN0cl9zdHIoY2hpbGRfZnVuYywgImhhc2gyLXVkIik7CgkJICBpZiAocmVwICE9IDApCgkJICAgIHsKCQkgICAgICBzdHJfY3B5KGN1cnJlbnQsICIoaDItdWQpIiwgNyk7CgkJICAgICAgY3VycmVudCArPSA3OwoJCSAgICAgIHJlbWFpbmluZ193aWR0aCAtPSA3OwoJCSAgICB9CgkJICBlbHNlewoJCSAgICByZXAgPSBzdHJfc3RyKGNoaWxkX2Z1bmMsICJoYXNoMi1iciIpOwoJCSAgICBpZiAocmVwICE9IDApCgkJICAgICAgewoJCQlzdHJfY3B5KGN1cnJlbnQsICIoaDItYnIpIiwgNyk7CgkJCWN1cnJlbnQgKz0gNzsKCQkJcmVtYWluaW5nX3dpZHRoIC09NzsKCQkgICAgICB9CgkJICAgIGVsc2V7CgkJICAgICAgcmVwID0gc3RyX3N0cihjaGlsZF9mdW5jLCAiaGFzaC11ZCIpOwoJCSAgICAgIGlmIChyZXAgIT0gMCkKCQkJewoJCQkgIHN0cl9jcHkoY3VycmVudCwgIihoMC11ZCkiLCA3KTsKCQkJICBjdXJyZW50ICs9IDc7CgkJCSAgcmVtYWluaW5nX3dpZHRoIC09IDc7CgkJCX0KCQkgICAgICBlbHNlewoJCQlyZXAgPSBzdHJfc3RyKGNoaWxkX2Z1bmMsICJoYXNoLWJyIik7CgkJCWlmIChyZXAgIT0gMCkKCQkJICB7CgkJCSAgICBzdHJfY3B5KGN1cnJlbnQsICIoaDAtYnIpIiwgNyk7CgkJCSAgICBjdXJyZW50ICs9IDc7CgkJCSAgICByZW1haW5pbmdfd2lkdGggLT0gNzsKCQkJICB9CgkJCWVsc2V7CgkJCSAgY2hpbGRfZnVuYyA9IHN0cl9zdHIoY2hpbGRfZnVuYywgIiAiKTsKCQkJICBpZiAoY2hpbGRfZnVuYyAhPSAwKQoJCQkgICAgewoJCQkgICAgICArK2NoaWxkX2Z1bmM7CgkJCSAgICAgICpjdXJyZW50KysgPSAnKCc7CgkJCSAgICAgIC0tcmVtYWluaW5nX3dpZHRoOwoJCQkgICAgICBmb3IgKEludDMyIGkgPSAwOyBpIDwgNTsgKysgaSkKCQkJCXsKCQkJCSAgKmN1cnJlbnQrKyA9ICpjaGlsZF9mdW5jKys7CgkJCQkgIC0tcmVtYWluaW5nX3dpZHRoOwoJCQkJfQoJCQkgICAgICAvL3RyaW0gd2hpdGVzcGFjZSBmcm9tIHRoZSBlbmQKCQkJICAgICAgd2hpbGUgKCooY3VycmVudC0xKSA9PSAnICcpCgkJCQl7CgkJCQkgIC0tY3VycmVudDsKCQkJCSAgKytyZW1haW5pbmdfd2lkdGg7CgkJCQl9CgkJCSAgICAgICpjdXJyZW50KysgPSAnKSc7CgkJCSAgICAgIC0tcmVtYWluaW5nX3dpZHRoOwoJCQkgICAgfQoJCQkgIGVsc2UKCQkJICAgIHsJLy9ubyBzcGFjZSBmb3VuZCB3aGVyZSB0aGVyZSBzaG91bGQgYmUgb25lCgkJCSAgICAgIHN0cl9jcHkoY3VycmVudCwgIigqKiopIiwgNSk7CgkJCSAgICAgIGN1cnJlbnQgKz0gNTsKCQkJICAgICAgcmVtYWluaW5nX3dpZHRoIC09IDU7CgkJCSAgICB9CgkJCX0vL2hhc2gtYnIKCQkgICAgICB9Ly9oYXNoLXVkCgkJICAgIH0vL2hhc2gyLWJyCgkJICB9Ly9oYXNoMi11ZAoJCX0vL2hhc2gxLWJyCgkgICAgICB9Ly9oYXNoMS11ZAoJICAgIH0vL3JlcC1iCgkgIH0vL3JlcC1uCgl9Ly9oZXJlIGl0IGlzIG5vdCBhbiBlcnJvciBub3QgdG8gaGF2ZSBhIGNoaWxkIHBhcnRpdGlvbmluZyBmdW5jdGlvbgoKICAgICAgY2hhciAqIG1lcmdlZF9vcmRlciA9IHN0cl9zdHIoZGVzY3JpcHRpb25fLCAibWVyZ2VkX29yZGVyIik7CiAgICAgIGlmIChtZXJnZWRfb3JkZXIgIT0gMCkgewogICAgICAgIHN0cl9jcHkoY3VycmVudCwgIiAobSkiLCA0KTsKCWN1cnJlbnQgKz0gNDsKCXJlbWFpbmluZ193aWR0aCAtPSA0OwogICAgICB9CiAgICAgICpjdXJyZW50KysgPSAnICc7CiAgICAgIC0tcmVtYWluaW5nX3dpZHRoOwogICAgfQogIGVsc2UvL2Fub3RoZXIga2luZCBvZiBvcGVyYXRvcgogICAgewogICAgICBjaGFyICogdG5hbWVfbG9jID0gc3RyX3N0cih0TmFtZV8sICIuIik7CiAgICAgIGlmICh0bmFtZV9sb2MgIT0gMCkKCXsKCSAgKyt0bmFtZV9sb2M7Ly9yZW1vdmUgdGhlIGNhdGFsb2cKCSAgdG5hbWVfbG9jID0gc3RyX3N0cih0bmFtZV9sb2MsICIuIik7CgkgIGlmICh0bmFtZV9sb2MgIT0gMCkKCSAgICArK3RuYW1lX2xvYzsvL3JlbW92ZSB0aGUgc2NoZW1hCgl9CiAgICAgIGVsc2UKCXRuYW1lX2xvYyA9IHROYW1lXzsKCiAgICAgIC8vIElmIHRoZSBjYXRhbG9nIGFuZCBzY2hlbWEgY29tYmluZWQgbmFtZSBsZW5ndGhzCiAgICAgIC8vIHdlcmUgZ3JlYXRlciB0aGFuIE1OQU1FLCB0aGVuIE5VTEwgaXMgcmV0dXJuZWQKICAgICAgLy8gZnJvbSBzdHJfc3RyLiAgT25seSBzZXQgdGhlIHRhYmxlIG5hbWUgaWYgYSAKICAgICAgLy8gdmFsaWQgYWRkcmVzcyBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIGFkZCBhCiAgICAgIC8vIHRhYmxlIG5hbWUgb2YgIioqKiIKICAgICAgICAKICAgICAgaWYgKHRuYW1lX2xvYyA9PSBOVUxMKQogICAgICAgIHsKICAgICAgICAgIHN0cl9jcHkoY3VycmVudCwgIioqKiIsIDMpOwoJICBjdXJyZW50ICs9IDM7CiAgICAgICAgICByZW1haW5pbmdfd2lkdGggLT0gMzsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICB3aGlsZSAodG5hbWVfbG9jICE9IE5VTEwgJiYgKCp0bmFtZV9sb2MpICE9ICdcMCcpCgkgICAgewoJICAgICAgVUludDMyIFVDUzR2YWx1ZTsKCSAgICAgIEludDMyIGZpcnN0Q2hhckxlbiA9IExvY2FsZUNoYXJUb1VDUzQodG5hbWVfbG9jLCA4LCAmVUNTNHZhbHVlLCBjbnZfVVRGOCk7CgkgICAgICBpZiAoIGZpcnN0Q2hhckxlbiA8PSByZW1haW5pbmdfd2lkdGggKSAvLyBDb3B5IGluIG9ubHkgKndob2xlKiBjaGFyYWN0ZXJzIQoJICAgICAgewoJICAgICAgICAgZm9yICggSW50MzIgaWkgPSAwOyBpaSA8IGZpcnN0Q2hhckxlbjsgaWkrKyApCgkgICAgICAgICB7CgkgICAgICAgICAgICAqY3VycmVudCsrID0gKnRuYW1lX2xvYysrOwoJICAgICAgICAgICAgLS1yZW1haW5pbmdfd2lkdGg7CgkgICAgICAgICB9CgkgICAgICB9CgkgICAgICBlbHNlIGJyZWFrOwoJICAgIH0KCX0KICAgICAgLy90cmltIHdoaXRlc3BhY2UgZnJvbSB0aGUgZW5kCiAgICAgIHdoaWxlICgqKGN1cnJlbnQtMSkgPT0gJyAnKQoJewoJICAtLWN1cnJlbnQ7CgkgICsrcmVtYWluaW5nX3dpZHRoOwoJfQogICAgICAvL3RyaW0gY2xvc2UgcGFyZW4gZnJvbSB0aGUgZW5kCiAgICAgIHdoaWxlICgqKGN1cnJlbnQtMSkgPT0gJyknKQoJewoJICAtLWN1cnJlbnQ7CgkgICsrcmVtYWluaW5nX3dpZHRoOwoJfQogICAgICAKICAgICAgaWYgKHN0cl9zdHIoZGVzY3JpcHRpb25fLCAibWRhbToiKSAhPSAwKQoJewoJICBzdHJfY3B5KGN1cnJlbnQsICIgKG0pIiwgNCk7CgkgIGN1cnJlbnQgKz0gNDsKCSAgcmVtYWluaW5nX3dpZHRoIC09IDQ7Cgl9CiAgICAgIGVsc2UKCXsKCSAgc3RyX2NweShjdXJyZW50LCAiICIsIDEpOwoJICArK2N1cnJlbnQ7CgkgIC0tcmVtYWluaW5nX3dpZHRoOwoJfQogICAgfQogIC8vbm93IGFkanVzdCB0aGUgcG9pbnRlciBzbyB0aGF0IHRoZSB3aWR0aCBpcyBub3QgZXhjZWVkZWQKICBpZiAocmVtYWluaW5nX3dpZHRoIDw9IDApCiAgICBjdXJyZW50ICs9IHJlbWFpbmluZ193aWR0aDsKICBlbHNlCiAgICBmb3IgKDsgcmVtYWluaW5nX3dpZHRoID4gMDsgLS1yZW1haW5pbmdfd2lkdGgpCiAgICAgICpjdXJyZW50KysgPSAnICc7CiAgCiAgc3RyX2NweShjdXJyZW50LCAiICAiLCAyKTsvL3NwYWNlIGJldHdlZW4gY29sdW1ucwogIGN1cnJlbnQgKz0gMjsKICAKICAvL3BsYWNlIHRoZSBjYXJkaW5hbGl0eSAKICBmbG9hdCBhYnN2YWwgPSBjYXJkaW5hbGl0eV87ICAgIC8vIGFic29sdXRlIHZhbHVlIG9mIGlucHV0CiAgTG5nMzIgdmFsSW50ID0gMDsgICAgICAgICAgICAvLyBpbnRlZ2VyIHBhcnQgb2YgZmxvYXQgdmFsdWUKICBMbmczMiB2YWxEZWMgPSAwOyAgICAgICAgICAgIC8vIGRlY2ltYWwgcGFydCBvZiBmbG9hdCB2YWx1ZQogIExuZzMyIHZhbEV4cCA9IDA7ICAgICAgICAgICAgLy8gZXhwb250aWFsIHBhcnQgb2YgZmxvYXQgdmFsdWUKICBmbG9hdCBuYnJEZWMgPSAxMDAuMEY7ICAgICAgLy8gMiBkZWNpbWFsIGRpZ2l0cwogIC8vZmxvYXQgdmFsUm5kICA9IDAuMDA1RjsgICAgIC8vIHZhbHVlIHRvIGFkZCBmb3Igcm91bmRpbmcgaWYgd2UgZGlkIGl0CiAgLy93ZSBkbyBubyByb3VuZGluZyBzaW5jZSB0aGlzIGlzIHRoZSB3YXkgdGhpbmdzIHdlcmUgZG9uZSBpbiBvbGRlciBvcHRpb25zICdmJwogIAogIGJvb2wgcHNpZ24gPSB0cnVlOwkJLy9hc3N1bWUgYWJzb2x1dGUgdmFsdWUgaXMgPj0gMQogIAogIGlmIChhYnN2YWwgIT0gMCkKICAgIHsKICAgICAgaWYgKGFic3ZhbCA8PSAxICkKCXsKCSAgd2hpbGUgKGFic3ZhbCA8IDEpCgkgICAgewoJICAgICAgdmFsRXhwLS07CgkgICAgICBhYnN2YWwgKj0gMTA7CgkgICAgICBwc2lnbiA9IGZhbHNlOwoJICAgIH0KCX0KICAgICAgZWxzZQoJewoJICB3aGlsZSAoYWJzdmFsID49IDEwKSAKCSAgICB7ICAgICAgICAgICAgICAgICAgLy8gZmlndXJlIG91dCB0aGUgZXhwb25lbnQgdmFsdWUKCSAgICAgIHZhbEV4cCsrOwoJICAgICAgYWJzdmFsIC89IDEwOwoJICAgIH0KCX0KICAgIH0KCiAgLy9hYnN2YWwgKz0gdmFsUm5kOyAvL3RoZXJlIHNoYWxsIGJlIG5vIHJvdW5kaW5nIHlldAogIHZhbEludCA9IChMbmczMilhYnN2YWw7ICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBpbnRlZ2VyIHBhcnQKICBhYnN2YWwgLT0gdmFsSW50OwogIHZhbERlYyA9IChMbmczMikoYWJzdmFsKm5ickRlYyk7ICAgICAgICAgLy8gZ2V0IHRoZSBkZWNpbWFsIHBhcnQgYXMgbG9uZwogIAogIGlmIChwc2lnbikKICAgIHN0cl9zcHJpbnRmIChjdXJyZW50LCAiJWQuJTAyZEUrJTAzZCIsIHZhbEludCwgdmFsRGVjLCB2YWxFeHApOwogIGVsc2UKICAgIHN0cl9zcHJpbnRmIChjdXJyZW50LCAiJWQuJTAyZEUlMDRkIiwgdmFsSW50LCB2YWxEZWMsIHZhbEV4cCk7CiAgCiAgb3B0Rk91dHB1dFtNTEVOLTJdID0gJ1wwJzsgICAKICAvLyAgb3B0Rk91dHB1dFs3OF0gPSAnXDAnOyAgIAp9ICAgCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGdW5jdGlvbiBOYW1lOiBEb0hlYWRlcgoKQXJndW1lbnQgTGlzdDogTm9uZQoKUmV0dXJuIFN0YXR1czogTm9uZSAodm9pZCkKCkNsYXNzIERhdGEgQWNjZXNzZWQ6CiAgICAxMyAibG9jYWwgY29sdW1uIGRhdGEiIHZhcmlhYmxlcyB3aXRoIGNvbnRlbnRzIG9mIHRoaXMgcm93IChyZWFkIG9ubHkpCiAgICBsaW5lc19bIF0gWyBdICAgICAgIGVtcHR5IG9uIGlucHV0LCBmaWxsZWQgd2l0aCBsaW5lcyB0byBvdXRwdXQKICAgIGNudExpbmVzXyAgICAgICAgICAgdGVsbHMgaG93IG1hbnkgbGluZXMgYXJlIGluIExpbmVzIGFycmF5CgpEZXNjcmlwdGlvbjoKVGhpcyBmdW5jdGlvbiB3aWxsIGZvcm1hdCB0aGUgbGluZXMgbmVlZGVkIGZvciB0aGUgaGVhZGVyIG9mIHRoZSBwbGFuLiAgVGhlc2UKbGluZXMgd2lsbCBjb21lIGZyb20gZGF0YSBpbiB0aGUgZmlyc3QgKHJvb3QpIHJvdyBvZiB0aGUgZXhwbGFpbiBwbGFuIHdoaWNoIGlzCm5vdyBpbiBwcml2YXRlIHZhcmlhYmxlcyBvZiB0aGlzIG9iamVjdC4gIFRoZSByb3dzIG9mIHRoZSBoZWFkZXIgYXJlIHRob3NlIHdoaWNoCmFyZSBkdXBsaWNhdGVkIGluIGFsbCBvdGhlciByb3dzIHBsdXMgYSBjb3VwbGUgb2Ygb3RoZXIgcmVhbGx5IGltcG9ydGFudCBvbmVzLgpUaGUgU1FMIHN0YXRlbWVudCB0aGF0IGdlbmVyYXRlZCB0aGUgcGxhbiB3aWxsIGJlIHNob3duIGhlcmUgYXMgd2VsbCBhcyB0aGUgc2hhcGUKc3RhdGVtZW50IGlmIHVzZWQuICBUaGUgU1FMIGFuZCB0aGUgc2hhcGUgaW5mb3JtYXRpb24gY29tZXMgZnJvbSB0aGUgZGVzY3JpcHRpb24KY29sdW1uIGFuZCB3aWxsIGJlIGxvZ2ljYWxseSBjb25zdW1lZCBoZXJlIChub3QgZGlzcGxheWVkIGFnYWluKS4gIEl0IHdpbGwgdXNlCnRoZSBHZXRGaWVsZCBmdW5jdGlvbiB0byBmaW5kIHRoZXNlIGRlc2lyZWQgdG9rZW5zIGluIHRoZSBkZXNjcmlwdGlvbiBmaWVsZCBhbmQKdXNlIHNpemUgdG8gdGVtcG9yYXJpbHkgbnVsbCB0ZXJtaW5hdGUgdGhlbS4gIEl0IGhhcyBNTElORSAoY3VycmVudGx5IDc0KSBsaW5lcwphdmFpbGFibGUgdG8gc3RvcmluZyB0aGVzZSBmb3JtYXR0ZWQgbGluZXMuICAuICBJdCBzaG91bGQgY2hlY2sgZm9yIHRoZSBsaW5lCk1MSU5FICsxIG91dHB1dCBhbmQgdGhlbiBzdG9wLiAgVGhlIGV4dHJhIG91dHB1dCBsaW5lIHdpbGwgY2F1c2UgdGhlIG91dHB1dCB0bwpjb250YWluIGEgZGF0YSB0cnVuY2F0aW9uIG1lc3NhZ2UuICBJZiBvdXRwdXR0aW5nIG1vcmUgdGhhbiBNTElORSsxIGxpbmVzIGlzCmF0dGVtcHRlZCB0aGUgYWRkaXRpb25hbCBsaW5lcyBhcmUganVzdCBkcm9wcGVkLgoKSW4gUjIgaXQgd2lsbCBhbHNvIGRpc3BsYXkgYW55IG5vbi1kZWZhdWx0ZWQgQ1FEcyBoZXJlIGlmIHRoZXkgZ2V0IGludG8gdGhlIHJvb3QKbm9kZS4KKioqKiovCnZvaWQgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5UY2I6OkRvSGVhZGVyKCkKewogIExuZzMyIGZ1bGxTaXplID0gMDsKICBMbmczMiBpbnRTaXplID0gMDsKICBMbmczMiB2YWxTaXplID0gKExuZzMyKXN0cmxlbihtb2R1bGVOYW1lXyk7CiAgY2hhciBvdXRTdHJbTVVTRVJTUF07CiAgY2hhciogc3RtdDsKICAKICBGb3JtYXRMb25nTGluZSgiTU9EVUxFX05BTUUiLCBtb2R1bGVOYW1lXywgMTEsIHZhbFNpemUpOwogIAogIC8vIGNoYW5nZSBzdGF0ZW1lbnQgbmFtZSBpZiBzdGlsbCBkZWZhdWx0CiAgaWYgKHN0cl9jbXBfYygiX19FWFBMX1NUTVRfTkFNRV9fIiwgc3RhdGVtZW50TmFtZV8pID09IDApCiAgICBzdHJfY3B5X2Moc3RhdGVtZW50TmFtZV8sICJOT1QgTkFNRUQiKTsKICB2YWxTaXplID0gKExuZzMyKXN0cmxlbihzdGF0ZW1lbnROYW1lXyk7CiAgRm9ybWF0TG9uZ0xpbmUoIlNUQVRFTUVOVF9OQU1FIiwgc3RhdGVtZW50TmFtZV8sIDE0LCB2YWxTaXplKTsKICAKICAvL2NvbnZlcnQgdGhlIEludDY0IHRvIHN0cmluZwogIHN0cl9zcHJpbnRmKG91dFN0ciwgIiVsZCIsIHBsYW5JZF8pOwogIEZvcm1hdExpbmUoIlBMQU5fSUQiLCBvdXRTdHIsIDcsIChMbmczMilzdHJfbGVuKG91dFN0cikpOwogIAogIC8vIHJld29yayBjYXJkaW5hbGl0eSBhcyByb3dzIG91dC4gIEFzc3VtZSBwcm9iZSBjb3VudCBpcyBhbHdheXMgMQogIC8vIG9uIHRoZSByb290IG5vZGUsIHNvIHVzZSBST1dTX09VVCB0b2tlbiBhbHdheXMKICBGb3JtYXRGbG9hdCAob3V0U3RyLCBpbnRTaXplLCB2YWxTaXplLCBjYXJkaW5hbGl0eV8sCgkgICAgICAgKG9wdEZsYWdfID09IE5fKSwgKG9wdEZsYWdfID09IEVfKSk7CiAgRm9ybWF0TGluZSgiUk9XU19PVVQiLCBvdXRTdHIsIDgsIHZhbFNpemUsIDAsIGludFNpemUpOwogIAogIC8vIHJld29yayB0b3RhbENvc3QgYXMgZXN0aW1hdGVkIHRvdGFsIGNvc3QKICBGb3JtYXRGbG9hdCAob3V0U3RyLCBpbnRTaXplLCB2YWxTaXplLCB0b3RhbENvc3RfLAoJICAgICAgIChvcHRGbGFnXyA9PSBOXyksIChvcHRGbGFnXyA9PSBFXykpOwogIEZvcm1hdExpbmUoIkVTVF9UT1RBTF9DT1NUIiwgb3V0U3RyLCAxNCwgdmFsU2l6ZSwgMCwgaW50U2l6ZSk7CiAgCiAgLy8gZG8gdGhlIHN0YXRlbWVudCBiZWluZyBkaXNwbGF5ZWQgYXMgYSBwbGFuCiAgaWYgKEdldEZpZWxkKGRlc2NyaXB0aW9uXywgInN0YXRlbWVudDogIiwgc3RtdCwgdmFsU2l6ZSkgIT0gMCkKICAgIEZvcm1hdExpbmUoIlNUQVRFTUVOVCIsICIobm90IGZvdW5kKSIsIDksIDExKTsgLy9lcnJvcjogc3RhdGVtZW50IHNob3VsZCBleGl0cwogIGVsc2UKICAgIEZvcm1hdFNRTCgiU1RBVEVNRU5UIiwgc3RtdCwgOSwgdmFsU2l6ZSk7CiAgCiAgLy8gd2F0Y2ggZm9yIGEgY29udHJvbCBxdWVyeSBzaGFwZSBpbiBlZmZlY3QKICBpZiAoR2V0RmllbGQoZGVzY3JpcHRpb25fLCAibXVzdF9tYXRjaDogIiwgc3RtdCwgdmFsU2l6ZSkgPT0gMCkKICAgIEZvcm1hdExvbmdMaW5lKCJNVVNUX01BVENIIiwgc3RtdCwgMTAsIHZhbFNpemUpOwogIAogIC8vdHdvIGJsYW5rIGxpbmVzIGFmdGVyIHRoZSBoZWFkZXIKICBGb3JtYXRMaW5lKE5VTEwsIE5VTEwsIDAsIDApOwogIEZvcm1hdExpbmUoTlVMTCwgTlVMTCwgMCwgMCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGdW5jdGlvbiBOYW1lOiBEb09wZXJhdG9yCgpBcmd1bWVudCBMaXN0OiBOb25lCgpSZXR1cm4gU3RhdHVzOiBOb25lICh2b2lkKQoKQ2xhc3MgRGF0YSBBY2Nlc3NlZDoKICAgIDEzICJsb2NhbCBjb2x1bW4gZGF0YSIgdmFyaWFibGVzIHdpdGggY29udGVudHMgb2YgdGhpcyByb3cgKG1heSBiZSBjaGFuZ2VkKQogICAgbGluZXNfWyBdIFsgXSAgICAgICBlbXB0eSBvbiBpbnB1dCwgZmlsbGVkIHdpdGggbGluZXMgdG8gb3V0cHV0CiAgICBjbnRMaW5lc18gICAgICAgICAgIHRlbGxzIGhvdyBtYW55IGxpbmVzIGFyZSBpbiBMaW5lcyBhcnJheQoKRGVzY3JpcHRpb246ClRoaXMgZnVuY3Rpb24gd2lsbCBmb3JtYXQgYWxsIHVzZWZ1bCBkYXRhIGZyb20gdGhlIDEzIGNvbHVtbnMuICBUaGlzIGNvZGUgd2lsbApza2lwIGVtcHR5IGNvbHVtbnMgYW5kIG1vc3QgZW1wdHkgdmFsdWVzLiAgSXQgd2lsbCBza2lwIHNvbWUgZGF0YSB3aGVuIG9wdEZsYWdfCmlzIE5fLCBkZXRhaWxlZCBjb3N0cyBmb3IgZXhhbXBsZS4gIEl0IHdpbGwgb3V0cHV0IG9uZSBrZXl3b3JkIGFuZCB2YWx1ZSBwZXIgbGluZS4KSWYgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpcyBvdmVyIDUwIGNoYXJhY3RlcnMgaXQgd2lsbCBjYWxsIEZvcm1hdExvbmdMaW5lLApvdGhlcndpc2UgRm9ybWF0TGluZSBpcyBjYWxsZWQuICBTb21lIGtleXdvcmRzIHdpbGwgYmUgbWFwcGVkIHRvIG5ldyBuYW1lcy4KSXQgaGFzIE1MSU5FIChjdXJyZW50bHkgNzQpIGxpbmVzIGF2YWlsYWJsZSBmb3Igc3RvcmluZyB0aGVzZSBmb3JtYXR0ZWQgbGluZXMuCkl0IHdpbGwgY2hlY2sgZm9yIHRoZSBsaW5lIE1MSU5FICsxIG91dHB1dCBhbmQgdGhlbiBzdG9wLiAgVGhlIGV4dHJhIG91dHB1dCBsaW5lCndpbGwgY2F1c2UgdGhlIG91dHB1dCB0byBjb250YWluIGEgZGF0YSB0cnVuY2F0aW9uIG1lc3NhZ2UuICBJZiBvdXRwdXR0aW5nIG1vcmUKdGhhbiBNTElORSsxIGxpbmVzIGlzIGF0dGVtcHRlZCB0aGUgYWRkaXRpb25hbCBsaW5lcyBhcmUganVzdCBkcm9wcGVkLgoKVGhpcyBmdW5jdGlvbiBtaWdodCBoYXZlIHRvIG1vZGlmeSBzb21lIG90aGVyIGRhdGEgaW4gdGhlIGRlc2NyaXB0aW9uIGZpZWxkIHdoZW4KT3B0RmxhZ18gaXMgTl8sIGJ1dCBub3QgaW4gUjEuCioqKioqLwp2b2lkIEV4RXhlVXRpbERpc3BsYXlFeHBsYWluVGNiOjpEb09wZXJhdG9yKCkKewogIExuZzMyIGludFNpemUgPSAwOwogIExuZzMyIHZhbFNpemUgPSAwOwogIGNoYXIgb3V0U3RyW01VU0VSU1BdOwogIGNoYXIqIGtleXB0cjsKICBjaGFyKiBmaWVsZHB0cjsKICBMbmczMiBrZXlTaXplOwogIExuZzMyIGZ1bGxTaXplOwogIExuZzMyIGRvbmU7ICAgICAgICAgICAgICAgICAgICAgIC8vID0xIHdoZW4gbm8gZGF0YSBsZWZ0IHRvIHBhcnNlCiAgTG5nMzIgZmlyc3RBdHRyID0gMTsgICAgICAgICAgICAgLy8gPTEgZm9yIHN0YXJ0IG9mIGRlc2NyaXB0aW9uXwogIExuZzMyIGRpc3BBdHRyOyAgICAgICAgICAgICAgICAgIC8vID0xIGRpc3BsYXkgc3RyaW5nIGF0dHJpYnV0ZQogIExuZzMyIHJlcUluID0gMTsgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgcHJvYmUgdmFsdWUKICBMbmczMiBpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdmFyaWFibGUKICBMbmczMiBlcnJvclNlZW4gPSAwOyAgICAgICAgICAgICAvLyBubyBlcnJvcnMgaW4gZGV0YWlsZWQgY29zdCB5ZXQKICAvLyB0aGUgZm9sbG93aW5nIDQgYXJyYXlzIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UgcGVyIG9iamVjdAogIGNvbnN0IGNoYXIgKnRva0V4cFtdID0gICAgICAgICAgIC8vIGV4cGVjdGVkIGRldGFpbGVkIGNvc3QgdG9rZW5zCiAgewogICAgIkNQVV9USU1FIiwKICAgICJJT19USU1FIiwKICAgICJNU0dfVElNRSIsCiAgICAiSURMRV9USU1FIgogIH07CiAgY29uc3QgY2hhciAqdG9rUmVwW10gPSAgICAgICAgICAgLy8gcmVwbGFjZW1lbnQgZGV0YWlsZWQgY29zdCB0b2tlbnMKICB7CiAgICAiY3B1X2Nvc3QiLAogICAgImlvX2Nvc3QiLAogICAgIm1zZ19jb3N0IiwKICAgICJpZGxlX2Nvc3QiCiAgfTsKICBMbmczMiB0b2tSZXBTeltdID0geyA4LDcsOCw5IH07ICAvLyByZXBsYWNlbWVudCBkZXRhaWxlZCBjb3N0IHRva2VucyBzaXplcwogIAogIC8vIHB1dCB1cCB0byA0IGZpZWxkcyBvbiB0aGUgZmlyc3QgbGluZQogIEZvcm1hdEZpcnN0TGluZSgpOwogIAogIHZhbFNpemUgPSAoTG5nMzIpc3RyX2xlbih0TmFtZV8pOwogIGlmICh2YWxTaXplICE9IDApCQkJLy8gaWYgdGFibGUgbmFtZSBub3QgbnVsbCwgZGlzcGxheSBpdAogICAgRm9ybWF0TG9uZ0xpbmUoIlRBQkxFX05BTUUiLCB0TmFtZV8sIDEwLCB2YWxTaXplKTsKICAKICAvLyByZXdvcmsgcHJvYmVzIGFzIHJlcXVlc3RzIGluCiAgaWYgKEdldEZpZWxkKGRldGFpbENvc3RfLCAiUFJPQkVTOiAiLCBmaWVsZHB0ciwgZnVsbFNpemUpID09IDApCiAgICB7CiAgICAgIGNoYXIgKnRtcEVuZCA9IGZpZWxkcHRyK2Z1bGxTaXplOyAgIC8vIG5vdGUgZW5kIG9mIHZhbHVlCiAgICAgIGNoYXIgdG1wID0gKih0bXBFbmQpOyAgICAgICAgICAgICAgIC8vIHNhdmUgY2hhciBhdCBjdXQKICAgICAgKih0bXBFbmQpID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgLy8gY3V0IHRvIG1ha2Ugc3RyaW5nCiAgICAgIEZvcm1hdE51bWJlcihvdXRTdHIsIGludFNpemUsIHZhbFNpemUsIGZpZWxkcHRyKTsKICAgICAgRm9ybWF0TGluZSgiUkVRVUVTVFNfSU4iLCBvdXRTdHIsIDExLCB2YWxTaXplLCAwLCBpbnRTaXplKTsKICAgICAgKih0bXBFbmQpID0gdG1wOyAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBjdXQKICAgICAgLy8gaWYgcHJvYmUgaXMgbm90IDEgKHR3byBkaWdpdHMgb3IgZmlyc3Qgbm90IDEpIHNheSAyCiAgICAgIGlmICgodmFsU2l6ZSA+IDEpIHx8ICgqb3V0U3RyICE9ICcxJykpIHsgcmVxSW4gPSAyO30KICAgIH0KICBlbHNlICAgIC8vZXJyb3I6IHByb2JlcyBzaG91bGQgYmUgbG9jYXRhYmxlIGluIGRldGFpbENvc3RfLCBidXQgaWYgbm90CiAgICBGb3JtYXRMaW5lKCJSRVFVRVNUU19JTiIsICIobm90IGZvdW5kKSIsIDExLCAxMSwgMCk7CiAgCiAgLy8gcmV3b3JrIGNhcmRpbmFsaXR5IGFzIHJvd3Mgb3V0CiAgRm9ybWF0RmxvYXQgKG91dFN0ciwgaW50U2l6ZSwgdmFsU2l6ZSwgY2FyZGluYWxpdHlfLAoJICAgICAgIChvcHRGbGFnXyA9PSBOXyksIChvcHRGbGFnXyA9PSBFXykpOwogIGlmIChyZXFJbiA9PSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBudW1iZXIgb2YgcHJvYmVzIGlzIDEKICAgIEZvcm1hdExpbmUoIlJPV1NfT1VUIiwgb3V0U3RyLCA4LCB2YWxTaXplLCAwLCBpbnRTaXplKTsKICBlbHNlCiAgICBGb3JtYXRMaW5lKCJST1dTL1JFUVVFU1QiLCBvdXRTdHIsIDEyLCB2YWxTaXplLCAwLCBpbnRTaXplKTsKICAKICAvLyByZXdvcmsgb3BlcmF0b3JDb3N0IGFzIGVzdGltYXRlZCBvcGVyYXRvciBjb3N0CiAgRm9ybWF0RmxvYXQgKChjaGFyICopb3V0U3RyLCBpbnRTaXplLCB2YWxTaXplLCBvcGVyYXRvckNvc3RfLAoJICAgICAgIChvcHRGbGFnXyA9PSBOXyksIChvcHRGbGFnXyA9PSBFXykpOwogIEZvcm1hdExpbmUoIkVTVF9PUEVSX0NPU1QiLCBvdXRTdHIsIDEzLCB2YWxTaXplLCAwLCBpbnRTaXplKTsKICAKICAvLyByZXdvcmsgdG90YWxDb3N0IGFzIGVzdGltYXRlZCB0b3RhbCBjb3N0CiAgRm9ybWF0RmxvYXQgKChjaGFyICopb3V0U3RyLCBpbnRTaXplLCB2YWxTaXplLCB0b3RhbENvc3RfLAoJICAgICAgIChvcHRGbGFnXyA9PSBOXyksIChvcHRGbGFnXyA9PSBFXykpOwogIEZvcm1hdExpbmUoIkVTVF9UT1RBTF9DT1NUIiwgb3V0U3RyLCAxNCwgdmFsU2l6ZSwgMCwgaW50U2l6ZSk7CiAgCiAgLy8gd29yayB0aHJvdWdoIHRoZSA0IHJlbWFpbmluZyBmaWVsZHMgaW4gZGV0YWlsZWQgY29zdC4gIEFzc3VtZSB0aGV5CiAgLy8gYXJlIGluIGNvcnJlY3Qgb3JkZXIsIGJ1dCBoYW5kbGUgb3RoZXIgY2FzZXMgZ3JhY2VmdWxseSB0b28KICBpZiAob3B0RmxhZ18gPT0gRV8pCQkvL29ubHkgcHJpbnQgdG90YWwgY29zdCBkZXRhaWxzIGZvciBleHBlcnQgdXNlcnMKICAgIHsKICAgICAgcGFyc2VQdHJfID0gZGV0YWlsQ29zdF87Ly8gdGVsbCBQYXJzZUZpZWxkIHdoZXJlIHRvIHdvcmsKICAgICAgZG9uZSA9IDA7ICAgICAgICAgICAgICAgLy8gZm9yZ2V0IGxhc3QgdmFsdWUKICAgICAgaSA9IDA7ICAgICAgICAgICAgICAgICAgLy8gbG9vcCBjb3VudGVyCiAgICAgIHdoaWxlICghIGRvbmUpICAgICAgICAgIC8vIHdhdGNoIGZvciBsZXNzIHRoYW4gNCBmaWVsZHMKICAgICAgICB7CgkgIGlmIChQYXJzZUZpZWxkKGtleXB0ciwgZmllbGRwdHIsIGtleVNpemUsIGZ1bGxTaXplLCBkb25lKSkgLy8gaWYgZmFpbAogICAgICAgICAgICB7CgkgICAgICAvLyByZXBvcnQgdGhlIHByb2JsZW0gZGVwZW5kaW5nIG9uIGhvdyBtYW55IHdlIGZvdW5kCgkgICAgICBpZiAoaSA9PSAwKQogICAgICAgICAgICAgICAgewoJCSAgRm9ybWF0TGluZSgiKG5vbmUpIiwgTlVMTCwgNiwgMCwgMik7CgkJICBpID0gNDsgICAgICAvLyBza2lwIHRoZSBtaXNzaW5nIGZpZWxkcyBtc2cKICAgICAgICAgICAgICAgIH0KCSAgICAgIGVsc2UgeyBGb3JtYXRMaW5lKCIoaW52YWxpZCBkYXRhKSIsIE5VTEwsIDE0LCAwLCAyKTt9CgkgICAgICBicmVhazsgICAgICAgICAgLy8gZ2l2ZSB1cCBwcm9jZXNzaW5nIGRldGFpbGVkIGNvc3QgZmllbGQKICAgICAgICAgICAgfQoJICBGb3JtYXROdW1iZXIob3V0U3RyLCBpbnRTaXplLCB2YWxTaXplLCBmaWVsZHB0cik7CgkgIGlmICggaSA8IDQgJiYgc3RyX2NtcF9jKGtleXB0cix0b2tFeHBbaV0pID09IDApIC8vIGlmIHRoaXMgaXMgdGhlIGV4cGVjdGVkIHRva2VuCiAgICAgICAgICAgIHsKCSAgICAgIEZvcm1hdExpbmUodG9rUmVwW2ldLCBvdXRTdHIsIHRva1JlcFN6W2ldLCB2YWxTaXplLCAyLCBpbnRTaXplKTsKICAgICAgICAgICAgfQoJICBlbHNlICAgICAgICAgICAgICAgIC8vIGp1c3QgZGlzcGxheSB3aGF0IHdlIGdvdAogICAgICAgICAgICB7CgkgICAgICBGb3JtYXRMaW5lKGtleXB0ciwgb3V0U3RyLCBrZXlTaXplLCB2YWxTaXplLCAyLCBpbnRTaXplKTsKCSAgICAgIGVycm9yU2VlbisrOyAgICAvLyBub3RlIHdlIHNhdyB1bmV4cGVjdGVkIHRva2VucwogICAgICAgICAgICB9CgkgIGkrKzsgICAgICAgICAgICAgICAgLy8gZG8gbmV4dCBvbmUKCSAgaWYgKChpID4gMykgJiYgKCEgZXJyb3JTZWVuKSkvLyBpZiBhbGwgNCBub3JtYWwgYW5kIGRvbmUganVzdCBzdG9wCiAgICAgICAgICAgIHsKCSAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgkgIC8vIGVsc2UgY29udGludWUgdW50aWwgZG9uZSBmbGFnIHN0b3BzIGl0CiAgICAgICAgfQogICAgICBpZiAoaSA8IDQpIHsgRm9ybWF0TGluZSgiKG1pc3NpbmcgZmllbGRzKSIsIE5VTEwsIDE2LCAwLCAyKTsgfQogICAgfQogIAogIC8vIHdvcmsgdGhyb3VnaCB0aGUgZGVzY3JpcHRpb24gZmllbGQKICBGb3JtYXRMaW5lKCJERVNDUklQVElPTiIsIE5VTEwsIDExLCAwKTsKICBwYXJzZVB0cl8gPSBkZXNjcmlwdGlvbl87ICAgLy8gdGVsbCBQYXJzZUZpZWxkIHdoZXJlIHRvIHdvcmsKICBkb25lID0gMDsgICAgICAgICAgICAgICAgICAgLy8gZm9yZ2V0IGxhc3QgdmFsdWUKICB3aGlsZSAoISBkb25lKSAgICAgICAgICAgICAgLy8gd2hpbGUgdGhlcmUncyBtb3JlIHRvIHBhcnNlCiAgICB7CiAgICAgIGlmIChQYXJzZUZpZWxkKGtleXB0ciwgZmllbGRwdHIsIGtleVNpemUsIGZ1bGxTaXplLCBkb25lKSAhPSAwKQogICAgICAgIHsKCSAgLy9jYW4gaGF2ZSBhIGNhc2Ugb2YgZW1wdHkgZGVzY3JpcHRpb25fIHNvIGNoZWNrIGZvciB0aGF0CgkgIGlmIChmaXJzdEF0dHIpCgkgICAgRm9ybWF0TGluZSgiKG5vbmUpIiwgTlVMTCwgNiwgMCwgMik7CgkgIGVsc2UKCSAgICBGb3JtYXRMaW5lKCIoaW52YWxpZCBkYXRhKSIsIE5VTEwsIDE0LCAwLCAyKTsKCSAgYnJlYWs7CiAgICAgICAgfQogICAgICAvLyBub3cgaGF2ZSBhbiBhdHRyaWJ1dGUgdG8gZGlzcGxheQogICAgICBkaXNwQXR0ciA9IDE7ICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBhIHN0cmluZyB0byBkaXNwbGF5CiAgICAgIGlmIChJc051bWJlckZtdChmaWVsZHB0cikgPT0gMSkgLy9pZiB0aGlzIGlzIGEgbnVtYmVyCiAgICAgICAgewoJICBGb3JtYXROdW1iZXIoKGNoYXIqKW91dFN0ciwgaW50U2l6ZSwgdmFsU2l6ZSwgZmllbGRwdHIpOwoJICBGb3JtYXRMaW5lKGtleXB0ciwgb3V0U3RyLCBrZXlTaXplLCB2YWxTaXplLCAyLCBpbnRTaXplKTsKCSAgZGlzcEF0dHIgPSAwOyAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgaXMgZG9uZQogICAgICAgIH0KICAgICAgZWxzZSBpZiAoaGVhZGVyXykgLy90aGlzIGlzIGEgc3RyaW5nLCB3YXRjaCBzcGVjaWFsIG9uIHJvb3Qgbm9kZQoJaWYgKHN0cl9jbXBfYyhrZXlwdHIsICJzdGF0ZW1lbnQiKSA9PSAwKQoJICBkaXNwQXR0ciA9IDA7ICAgICAgICAgICAvLyBza2lwIGRpc3BsYXksIGl0IGlzIGluIGhlYWRlcgoJZWxzZSBpZiAoc3RyX2NtcF9jKGtleXB0ciwgIm11c3RfbWF0Y2giKSA9PSAwKQoJICBkaXNwQXR0ciA9IDA7ICAgICAgICAgICAvLyBza2lwIGRpc3BsYXksIGl0IGlzIGluIGhlYWRlcgogICAgICBpZiAoZGlzcEF0dHIpICAgICAgICAgICAgICAgICAgIC8vIGlmIG5lZWRlZCwgZm9ybWF0IGFuZCBzdG9yZSBpbiBsaW5lc18gYXJyYXkKCWlmIChmdWxsU2l6ZSA+IChNV0lERSAtIENPTDIpKSAvLyBpZiBsb25nZXIgdGhhbiBvbmUgbGluZQoJICBGb3JtYXRMb25nTGluZShrZXlwdHIsIGZpZWxkcHRyLCBrZXlTaXplLCBmdWxsU2l6ZSwgMik7IC8vIG11bHRpLWxpbmUKCWVsc2UKCSAgRm9ybWF0TGluZShrZXlwdHIsIGZpZWxkcHRyLCBrZXlTaXplLCBmdWxsU2l6ZSwgMik7Ly8gb25lIGxpbmUKICAgICAgZmlyc3RBdHRyID0gMDsgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBhdHRyaWJ1dGUgZG9uZQogICAgfSAgLy8gZW5kIHdoaWxlIGZvciBkZXNjcmlwdGlvbiBmaWVscwogIAogIGlmIChzZXFOdW1fICE9IDEpICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBsYXN0IG5vZGUKICAgIHsKICAgICAgLy90d28gYmxhbmsgbGluZXMgYWZ0ZXIgZWFjaCBvcGVyYXRvcgogICAgICBGb3JtYXRMaW5lKE5VTEwsIE5VTEwsIDAsIDApOwogICAgICBGb3JtYXRMaW5lKE5VTEwsIE5VTEwsIDAsIDApOwogICAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRnVuY3Rpb24gTmFtZTogT3V0cHV0TGluZXMKCkFyZ3VtZW50IExpc3Q6IE5vbmUKClJldHVybiBTdGF0dXM6CiAgICBsb25nID0gMCBvbiBzdWNjZXNzLCBlbHNlIGEgcmV0dXJuIGNvZGUgdG8gdXNlIGluIGVycm9yIHJldHVybiB0byBjYWxsZXIKCkNsYXNzIERhdGEgQWNjZXNzZWQ6CiAgICBsaW5lc19bIF0gWyBdICAgICAgIGVtcHR5IG9uIGlucHV0LCBmaWxsZWQgd2l0aCBsaW5lcyB0byBvdXRwdXQKICAgIGNudExpbmVzXyAgICAgICAgICAgdGVsbHMgaG93IG1hbnkgbGluZXMgYXJlIGluIExpbmVzIGFycmF5CiAgICBuZXh0TGluZV8gICAgICAgICAgIGNvbnRhaW5zIGluZGV4IG9mIG5leHQgZW50cnkgaW4gTGluZXMgYXJyYXkKCkRlc2NyaXB0aW9uOgpUaGlzIGZ1bmN0aW9uIHdpbGwgbW92ZSBsaW5lcyBmcm9tIHRoZSBsaW5lc18gYXJyYXkgdG8gdGhlIHVwLXF1ZXVlIHVzaW5nCm1vdmVSb3dUb1VwUXVldWUoKS4gIEl0IHdpbGwgZmlyc3QgdmVyaWZ5IHRoYXQgdGhlIHVwLXF1ZXVlIGNhbiBhY2NlcHQgYSBsaW5lLgpBZnRlciBtb3ZpbmcgYSBsaW5lIGl0IHdpbGwgYWRqdXN0IHRoZSBnbG9iYWxzIHRoYXQgZGVmaW5lIHdoZXJlIHdlIGFyZSBpbiB0aGUKb3V0cHV0IG9mIHRoZSBsaW5lc18gYXJyYXkuICBJZiBpdCBpcyB0b2xkIHRoZSB1cC1xdWV1ZSBpcyBmdWxsIGl0IG1heSBqdXN0CnJldHVybiBXT1JLX09LIGZvciBhbGwgc3RhdGUgdmFyaWFibGVzIGFyZSBzZXQgdG8gYWxsb3cgaXQgdG8gcmVzdW1lIHdoZW4KY2FsbGVkIGJhY2suICAgSXQga25vd3MgaXQgaXMgZG9uZSB3aGVuIGNudExpbmVzXyA8IG5leHRMaW5lXy4gIEFmdGVyIG1vdmluZwphbGwgbGluZXMgaW4gdGhlIGxpbmVzXyBhcnJheSwgaXQgd2lsbCByZXNldCBhcnJheSBwb2ludGVycy4KKioqKiovCnNob3J0IEV4RXhlVXRpbERpc3BsYXlFeHBsYWluVGNiOjpPdXRwdXRMaW5lcygpCnsKICBzaG9ydCByZXRjb2RlOwogIHNob3J0IHJjOwogIHdoaWxlIChuZXh0TGluZV8gPCBjbnRMaW5lc18pCiAgICB7CiAgICAgIHJldGNvZGUgPSBtb3ZlUm93VG9VcFF1ZXVlKGxpbmVzX1tuZXh0TGluZV9dLCAtMSwgJnJjKTsgLy9uZWVkIHRvIGdpdmUgaXQgcmMsIG90aGVyd2lzZSB3aWxsIGFsd2F5cyByZXR1cm4gMAogICAgICAKICAgICAgaWYgKHJldGNvZGUgPT0gMCkKCSsrbmV4dExpbmVfOwogICAgICBlbHNlIAoJcmV0dXJuIHJjOwogICAgfQogIC8vZW1wdHlpbmcgdGhlIGFycmF5CiAgY250TGluZXNfID0gMDsKICBuZXh0TGluZV8gPSAwOwogIHJldHVybiAwOyAvL3NpbmNlIHJjIGNhbm5vdCBiZSBwb3NpdGl2ZSwgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZWlyIHJldHVybnMgYW5kIGxvY2FsIHJldHVybnMKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkZ1bmN0aW9uIE5hbWU6IEZvcm1hdExpbmUKCkFyZ3VtZW50IExpc3Q6CiAgICBjaGFyICprZXlbaW5dICAgICAgICAgICBwdHIgdG8gc3RhcnQgb2Yga2V5IHdvcmQgc3RyaW5nCiAgICBjaGFyICp2YWxbaW5dICAgICAgICAgICBwdHIgdG8gc3RhcnQgb2YgdmFsdWUgc3RyaW5nCiAgICBsb25nICBrZXlTaXplW2luXSAgICAgICBjb3VudCBvZiBjaGFyYWN0ZXJzIGluIGtleSB3b3JkIHN0cmluZywgMCBpcyBvawogICAgbG9uZyAgdmFsU2l6ZVtpbl0gICAgICAgY291bnQgb2YgY2hhcmFjdGVycyBpbiB2YWx1ZSBzdHJpbmcsIDAgaXMgb2sKICAgIGxvbmcgIGluZGVudFtpbl0gICAgICAgIGNvdW50IG9mIGJsYW5rIGNoYXJhY3RlcnMgYXQgc3RhcnQgb2YgbGluZSwgZGVmYXVsdCAwCiAgICBsb25nICBkZWNMb2NbaW5dICAgICAgICBjb3VudCBvZiBjaGFyIGJlZm9yZSBkZWNpbWFsIHBvaW50LCAwIGlmIG5vdCBmbG9hdCwgZGVmYXVsdCAwCgpSZXR1cm4gU3RhdHVzOiBOb25lCgpDbGFzcyBEYXRhIEFjY2Vzc2VkOgogICAgbGluZXNfW291dF0gICAgICAgICAgICAgbmV3IHByaW50IGxpbmUgc2V0CiAgICBjbnRMaW5lc19baW4vb3V0XSAgICAgICBjb3VudCBvZiBsaW5lcyBpbiBsaW5lc18gYXQgc3RhcnQKCkRlc2NyaXB0aW9uOgpUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgaW5wdXQga2V5d29yZCBhbmQgdmFsdWUgc3RyaW5nIGFuZCBmb3JtYXQgdGhlbQppbnRvIGEgc2luZ2xlIDc5IGNoYXJhY3RlciBsaW5lIGluIHRoZSBsaW5lc18gYXJyYXkuICBJdCBleHBlY3RzIHRoZSBpbnB1dAp2YWx1ZSB0byBmaXQgYnV0IHdpbGwgdHJ1bmNhdGUgYXMgbmVlZGVkLiAgSXQgd2lsbCBmb2xsb3cgYWxsIHRoZSBmb3JtYXR0aW5nCnJ1bGVzIGRlZmluZWQgaW4gdGhlIEVTLiAgVGhlIG1vc3QgaW1wb3J0YW50IGlzIHRoYXQgdGhlIHN0cmluZyB2YWx1ZXMgc3RhcnQKaW4gY29sIDI4LCBDT0wyIGlzIHRoZSBlbnVtLiAgRmxvYXQgdmFsdWVzIHdpbGwgaGF2ZSB0aGUgZGVjaW1hbCBpbiBjb2wgMjkKYW5kIHdpbGwgc3RhcnQgYXMgZmFyIGxlZnQgb2YgdGhhdCBhcyBjb2wgMjUsIGN1dHRpbmcga2V5d29yZHMgdG8gMjMgY2hhcgp3aGVuIG5lZWRlZC4gIERvdHMgd2lsbCByZXBsYWNlIHNwYWNlcyBiZXR3ZWVuIGtleSBhbmQgdmFsdWUgaWYgdGhlcmUgaXMgYQpuZWVkIG9mIGF0IGxlYXN0IDMgd2l0aCBhIGJsYW5rIG9uIGVpdGhlciBzaWRlLgoKVGhpcyByb3V0aW5lIGV4cGVjdHMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIHRvIGJlIHByZXNlbnQgKDIgb3IgNCkuClRoZSBjb21wbGV4IHBhcnQgaXMgdGhlIGFsaWdubWVudCBvZiB0aGUgbnVtYmVycy4gIFRoZSBsaW5lIGNvdW50IHdpbGwgYmUKYWRqdXN0ZWQgdG8gc2hvdyBhbm90aGVyIGxpbmUgaW4gbGluZXNfLiAgVGhlIG91dHB1dCBsaW5lcyB3aWxsIGxvb2sgbGlrZSB0aGlzOgogICAgVEFCTEVfTkFNRSAuLi4uLi4uLi4uLi4uLi4gU0FNUy5PUkRFUlMuT1JERVJTCiAgICBSRVFVRVNUU19JTiAuLi4uLi4uLi4uLi4uLiAxCiAgICBST1dTX09VVCAuLi4uLi4uLi4uLi4uLi4gMjM2CiAgICBUT1RBTF9DT1NUIC4uLi4uLi4uLi4uLi4uLiAwLjA3MzEKICAgIFRPVEFMX0NPU1RfREVUQUlMUwogICAgICBDUFVfVElNRSAuLi4uLi4uLi4uLi4uLi4gMC4wMDA0CiAgICBERVNDUklQVElPTgogICAgICBzY2FuX3R5cGUgLi4uLi4uLi4uLi4uLi4gZnVsbCBzY2FuIG9mIHRhYmxlIE9SREVSUyBidXQgdGhpcyBsaW5lIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlZCB0byBzaG93IHRoZSAyIGNoYXIgaW5kZW50CgpUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIHN1cHBvcnQgYWxsIG5lZWRzIGV4Y2VwdCB0aGUgZmlyc3QgbGluZSBhbmQKdGhlIG5vZGUgc2VwYXJhdG9yLiAgSWYga2V5U2l6ZSBpcyAwIG9ubHkgdGhlIHZhbCBwb2ludCB3aWxsIGJlIHVzZWQgYW5kCm5vIGRvdHMgd2lsbCBiZSBpbnNlcnRlZC4gIElmIHZhbFNpemUgaXMgMCBvbmx5IHRoZSBrZXkgd2lsbCBiZSBpbnNlcnRlZAphbmQgbm8gZG90cy4gIFNvIGJvdGggdGhlIGZvbGQgbGluZSByb3V0aW5lcyBjYW4gdXNlIHRoaXMgdG8gaW5zZXJ0IGRhdGEuCklmIGJvdGgga2V5U2l6ZSBhbmQgdmFsU2l6ZSBhcmUgMCBpdCBvdXRwdXRzIGEgbGluZSB3aXRoIG9uZSBibGFuayBvbiBpdC4KClRoaXMgcm91dGluZSB3aWxsIGNoZWNrIGZvciBhbiBlbXB0eSBsaW5lIGluIHRoZSBsaW5lc18gYXJyYXkgYW5kIGRvCm5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gc3BhY2UuICBJdCB3aWxsIHNldCBhICJkYXRhIGxvc3MiIG1lc3NhZ2UgaW4gdGhlCmxhc3QgbGluZSBpZiBhbm90aGVyIGxpbmUgaXMgYXR0ZW1wdGVkLgoqKioqKi8KCnR5cGVkZWYgc3RydWN0IHsKICBjb25zdCBjaGFyICoga2V5OwogIGNvbnN0IGNoYXIgKiB2YWx1ZTsKfSBGaWx0ZXJLZXlWYWx1ZVN0cnVjdDsKY29uc3QgRmlsdGVyS2V5VmFsdWVTdHJ1Y3QgZmlsdGVyS2V5VmFsdWVbXSA9CiAgewogICAgeyJNT0RVTEVfTkFNRSIsICIjIyMifSwKICAgIHsicGxhbl92ZXJzaW9uIiwgIiMjIyJ9LAogICAgeyJzdGF0ZW1lbnRfaW5kZXgiLCAiIyMjIn0sCiAgICB7IlBMQU5fSUQiLCAiIyMjIn0sCiAgICB7IlJPV1NfT1VUIiwgIiMjIyJ9LAogICAgeyJFU1RfT1BFUl9DT1NUIiwgIiMjIyJ9LAogICAgeyJFU1RfVE9UQUxfQ09TVCIsICIjIyMifSwKICAgIHsiUkVRVUVTVFNfSU4iLCAiIyMjIn0sCiAgICB7IlJPV1MvUkVRVUVTVCIsICIjIyMifSwKICAgIHsiT1BFUkFUT1JfQ09TVCIsICIjIyMifSwKICAgIHsiUk9MTFVQX0NPU1QiLCAiIyMjIn0sCiAgICB7InhuX2F1dG9hYm9ydF9pbnRlcnZhbCIsICIjIyMifSwKICAgIHsibWF4X2NhcmRfZXN0IiwgIiMjIyJ9LAogICAgeyJtYXhfbWF4X2NhcmRpbmFsaXR5IiwgIiMjIyJ9LAogICAgeyJ0b3RhbF9vdmVyZmxvd19zaXplIiwgIiMjIyJ9LAogICAgeyJlc3RfbWVtb3J5X3Blcl9ub2RlIiwgIiMjIyJ9LAogICAgeyJlc3RfbWVtb3J5X3Blcl9jcHUiLCAiIyMjIn0sCiAgICB7ImVzdF9tZW1vcnlfcGVyX2luc3RhbmNlIiwgIiMjIyJ9LAogICAgeyJidWZmZXJfc2l6ZSIsICIjIyMifSwKICAgIHsibWVtb3J5X3F1b3RhIiwgIiMjIyJ9LAogICAgeyJtZW1vcnlfcXVvdGFfcGVyX2VzcCIsICIjIyMifSwKICAgIHsibWVtb3J5X3F1b3RhX3Blcl9pbnN0YW5jZSIsICIjIyMifSwKICAgIHsibWVtb3J5X2xpbWl0X3Blcl9jcHUiLCAiIyMjIn0sCiAgICB7ImNhY2hlX3NpemUiLCAiIyMjIn0sCiAgICB7InByb2JlcyIsICIjIyMifSwKICAgIHsic3VjY2Vzc2Z1bF9wcm9iZXMiLCAiIyMjIn0sCiAgICB7InVuaXF1ZV9wcm9iZXMiLCAiIyMjIn0sCiAgICB7ImR1cGxpY2F0ZWRfc3VjY19wcm9iZXMiLCAiIyMjIn0sCiAgICB7InJvd3NfYWNjZXNzZWQiLCAiIyMjIn0sCiAgICB7ImFmZmluaXR5X3ZhbHVlIiwgIiMjIyJ9LAogICAgeyJwYXJlbnRfcHJvY2Vzc2VzIiwgIiMjIyJ9LAogICAgeyJjaGlsZF9wcm9jZXNzZXMiLCAiIyMjIn0sCiAgICB7Im51bV9jYWNoZV9lbnRyaWVzIiwgIiMjIyJ9LAogICAgeyJudW1faW5uZXJfdHVwbGVzIiwgIiMjIyJ9LAogICAgeyJPYmplY3RVSURzIiwgIiMjIyJ9LAogICAgCiAgfTsKCk5BQm9vbGVhbiBFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblRjYjo6ZmlsdGVyS2V5KAogICAgIGNvbnN0IGNoYXIgKmtleSwgTG5nMzIga2V5U2l6ZSwgY2hhciAqIHZhbHVlLCBjaGFyICogcmV0VmFsLAogICAgIExuZzMyICZkZWNMb2MpCnsKICBpZiAoKCEga2V5KSB8fCAoa2V5U2l6ZSA9PSAwKSkKICAgIHJldHVybiBGQUxTRTsKCiAgSW50MzIgbWF4U2l6ZSA9IHNpemVvZihmaWx0ZXJLZXlWYWx1ZSkgLyBzaXplb2YoRmlsdGVyS2V5VmFsdWVTdHJ1Y3QpOwogIAogIGZvciAoSW50MzIgaSA9IDA7IGkgPCBtYXhTaXplOyBpKyspCiAgICB7CiAgICAgIGlmIChzdHJjbXAoa2V5LCBmaWx0ZXJLZXlWYWx1ZVtpXS5rZXkpID09IDApCiAgICAgICAgewogICAgICAgICAgc3RyY3B5KHJldFZhbCwgZmlsdGVyS2V5VmFsdWVbaV0udmFsdWUpOwogICAgICAgICAgZGVjTG9jID0gc3RybGVuKGZpbHRlcktleVZhbHVlW2ldLnZhbHVlKTsKICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgIH0KICAgIH0KCiAgLy8gZmlsdGVyIG91dCBrZXkgb2YgcGF0dGVybjogZXNwX05fbm9kZV9tYXAKICBpZiAoKHN0cm5jbXAoa2V5LCAiZXNwXyIsIDQpID09IDApICYmCiAgICAgIChzdHJzdHIoa2V5LCAiX25vZGVfbWFwIikpKQogICAgewogICAgICBzdHJjcHkocmV0VmFsLCAiIyMjIik7CiAgICAgIGRlY0xvYyA9IDM7CiAgICAgIHJldHVybiBUUlVFOwogICAgfQogIGVsc2UgaWYgKChzdHJjbXAoa2V5LCAiY2hpbGRfcGFydGl0aW9uaW5nX2Z1bmN0aW9uIikgPT0gMCkgfHwKICAgICAgICAgICAoc3RyY21wKGtleSwgInBhcmVudF9wYXJ0aXRpb25pbmdfZnVuY3Rpb24iKSA9PSAwKSkKICAgIHsKICAgICAgLy8gdmFsdWUgZm9yIHBhcmVudCBmdW5jIGhhcyB0aGUgZm9ybSBzaW1pbGFyIHRvOiBicm9hZGNhc3QgTiB0aW1lcy4uLgogICAgICAvLyB2YWx1ZSBmb3IgY2hpbGQgZnVuYyBoYXMgZm9ybSBzaW1pbGFyIHRvOiBoYXNoMiBwYXJ0aXRpb25lZCBOIHdheXMuLi4KICAgICAgLy8gUmVwbGFjZSBudW1iZXJzIGluICd2YWx1ZScgd2l0aCAnIycKICAgICAgSW50MzIgaSA9IDA7CgogICAgICAvLyBpZiBjaGlsZCBwYXJ0aXRpb25pbmcgc3RhcnRzIHdpdGggaGFzaDEgb3IgaGFzaDIsIHNraXAgdGhhdCB0b2tlbi4KICAgICAgLy8gV2UgZG9udCB3YW50IHRoZSBudW1iZXJzIGluICdoYXNoMScvJ2hhc2gyJyB0byBiZSByZXBsYWNlZC4KICAgICAgaWYgKChzdHJjbXAoa2V5LCAiY2hpbGRfcGFydGl0aW9uaW5nX2Z1bmN0aW9uIikgPT0gMCkgJiYKICAgICAgICAgIChzdHJuY21wKHZhbHVlLCAiaGFzaDEiLCA1KSA9PSAwKSB8fAogICAgICAgICAgKHN0cm5jbXAodmFsdWUsICJoYXNoMiIsIDUpID09IDApKQogICAgICAgIHsKICAgICAgICAgIG1lbWNweShyZXRWYWwsIHZhbHVlLCA1KTsKICAgICAgICAgIGkgKz0gNTsKICAgICAgICB9CgogICAgICB3aGlsZSAoaSA8IHN0cmxlbih2YWx1ZSkpCiAgICAgICAgewogICAgICAgICAgaWYgKCh2YWx1ZVtpXSA+PSAnMCcpICYmICh2YWx1ZVtpXSA8PSAnOScpKQogICAgICAgICAgICByZXRWYWxbaV0gPSAnIyc7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldFZhbFtpXSA9IHZhbHVlW2ldOwogICAgICAgICAgaSsrOwogICAgICAgIH0KCiAgICAgIHJldFZhbFtpXSA9IDA7CiAgICAgIHJldHVybiBUUlVFOwogICAgfQoKICByZXR1cm4gRkFMU0U7Cn0KCnZvaWQgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5UY2I6OkZvcm1hdExpbmUoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICppbnZhbCwgTG5nMzIga2V5U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMbmczMiB2YWxTaXplLCBMbmczMiBpbmRlbnQsIExuZzMyIGRlY0xvYykKewogICAgY2hhciAqbGluZTsgICAgICAgICAgICAgICAgIC8vIHB0ciB0byBsaW5lIHRvIGluc2VydAogICAgY2hhciAqdGVtcDsgICAgICAgICAgICAgICAgIC8vIHdvcmtpbmcgcHRyCiAgICBMbmczMiAgY250OyAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHNwYWNlIGF2YWlsYWJsZQogICAgTG5nMzIgIGRhc2hlczsgICAgICAgICAgICAgICAvLyBjb3VudCBvZiBkb3RzIHRvIHNldAogICAgTG5nMzIgIGtleWN1dDsgICAgICAgICAgICAgICAvLyBzaXplIG9mIGtleXdvcmQgY29sIHBlcm1pdHRlZCAoY3V0IGlmIG5vdCB6ZXJvKQogICAgTG5nMzIgIGZpZWxkMTsgICAgICAgICAgICAgICAvLyBzcGFjZSBmb3IgY29sIDEsIGtleXdvcmQKICAgIAogICAgY2hhciB2YWxCdWZbMTAwMF07CiAgICBjaGFyICogdmFsID0gKGNoYXIqKWludmFsOwogICAgLy8gU2VlIGlmIHdlIGNhbiBkbyBhbnl0aGluZwogICAgaWYgKGNudExpbmVzXyA+PSBNTElORSkgeyAgICAgICAgICAgICAgICAgICAvLyBpZiBvdXRwdXQgaXMgZnVsbAogICAgICBjbnQgPSAoTG5nMzIpc3RyX2xlbihsaW5lc19bY250TGluZXNfLTFdKTsvLyBzaXplIGxpbmUKICAgICAgaWYgKGNudCA+IDYwICkge2NudCA9IDYwOyB9ICAgICAgICAgICAgIC8vIGRlY2lkZSB0byBjb25jYXQgb3IgY3V0CiAgICAgIHN0cl9jcHlfYygobGluZXNfW2NudExpbmVzXy0xXSkrY250LCAiKioqTElORVMgRFJPUFBFRCoqKiIpOwogICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBhbGwgd29yawogICAgfQogICAgbGluZSA9IGxpbmVzX1tjbnRMaW5lc19dOyAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB0byBlbXB0eSBsaW5lLCBkb24ndCBjaGFuZ2UKICAgIHRlbXAgPSBsaW5lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHdvcmtpbmcgcG9pbnRlcgoKICAgIGlmIChleGVVdGlsVGRiKCkuaXNPcHRpb25DKCkgJiYga2V5KQogICAgICB7CiAgICAgICAgaWYgKGZpbHRlcktleShrZXksIGtleVNpemUsIHZhbCwgdmFsQnVmLCBkZWNMb2MpKQogICAgICAgICAgewogICAgICAgICAgICB2YWwgPSB2YWxCdWY7CiAgICAgICAgICAgIHZhbFNpemUgPSBzdHJsZW4odmFsKTsKCiAgICAgICAgICAgIGlmIChleGVVdGlsVGRiKCkuaXNPcHRpb25QKCkpCiAgICAgICAgICAgICAgcmV0dXJuOyAvLyBwcnVuZQogICAgICAgICAgfQogICAgICB9CgogICAgLy8gRG8gdGhlIGluZGVudCBpZiBuZWVkZWQKICAgIGlmIChpbmRlbnQgPiAwKSB7CiAgICAgIGNudCA9IGluZGVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBjaGFuZ2UgaW5wdXQKICAgICAgd2hpbGUgKGNudC0tKSB7KnRlbXArKyA9ICcgJzsgfSAgICAgICAgIC8vIGFkZCBibGFua3MKICAgIH0KICAgIAogICAgLy8gRG8gdGhlIGtleXdvcmQKICAgIGlmICh2YWxTaXplID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gdmFsdWUsIGl0IGlzIGVhc3kKICAgICAgaWYgKGtleVNpemUgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGtleSBlbXB0eSB0b28KCSp0ZW1wKysgPSAnICc7ICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIG9uZSBzcGFjZQoJKnRlbXAgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkgbGluZSBvbmx5CiAgICAgIH0KICAgICAgZWxzZSB7CglzdHJfY3B5X2ModGVtcCwga2V5KTsgICAgICAgICAgICAgICAvLyB0YWtlIHRoZSB3aG9sZSB0aGluZyBob3BlIGl0IGlzIDwgNzkKICAgICAgfQogICAgICBjbnRMaW5lc18rKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVtcCBlbXB0eSBsaW5lIGNvdW50ZXIKICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBhcmUgZG9uZQogICAgfQogICAgZWxzZSBpZiAoa2V5U2l6ZSAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAvLyBpZiBrZXl3b3JkIG5lZWRlZAogICAgICAvLyBEbyBhbGwgdGhlIGtleXdvcmQgc2l6ZSBjYWxjdWxhdGlvbnMsIENPTDIgaXMgc3RhcnQgZm9yIHZhbHVlIGZpZWxkIHVzdWFsbHkKICAgICAgZmllbGQxID0gQ09MMiAtIDEgLSBpbmRlbnQgLSAyOyAgICAgICAgIC8vIHNwYWNlIGZvciBrZXl3b3JkIGFmdGVyIGFsbCBlbHNlCiAgICAgIC8vIHRvdGFsIGNvbCAxIC0gaW5kZW50IC0gMiBibGFua3MKICAgICAgaWYgKGRlY0xvYyA+PSAxKSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG51bWJlciBuZWVkcyB0byBiZSBzaGlmdGVkCglkZWNMb2MtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudCBkaWdpdHMgbGVmdCBvZiAyOAogICAgICB9CiAgICAgIGZpZWxkMSAtPSBkZWNMb2M7ICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaG93IG11Y2ggc3BhY2Ugd2UgaGF2ZSBmb3Iga2V5CiAgICAgIGtleWN1dCA9IGtleVNpemU7ICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgaXQgd2lsbCBmaXQKICAgICAgaWYgKGtleVNpemUgPiBmaWVsZDEpIHsgICAgICAgICAgICAgICAgIC8vIGlmIG5vIGZpdAoJaWYgKGtleVNpemUgPj0gMTYpIHsgICAgICAgICAgICAgICAgLy8gaWYga2V5IHJlYWxseSBsb25nIGN1dCBpdCwgZWxzZSBkb24ndAoJICBpZiAoZmllbGQxIDwgMTYpIHsgICAgICAgICAgICAgIC8vIG1pbiBrZXkgaXMgMTYKCSAgICBrZXljdXQgPSAxNjsgICAgICAgICAgICAgICAgLy8gc2V0IG1pbiBrZXkKCSAgfQoJICBlbHNlIHsKCSAgICBrZXljdXQgPSBmaWVsZDE7ICAgICAgICAgICAgLy8gY3V0IGxlc3MgdGhhbiBtaW4sIGFzIG5lZWRlZAoJICB9Cgl9CiAgICAgIH0KICAgICAgZGFzaGVzID0gZmllbGQxIC0ga2V5Y3V0OyAgICAgICAgICAgICAgIC8vIHNlZSBob3cgbXVjaCBmaWxsZXIgbmVlZGVkCiAgICAgIC8vIE9LIG5vdyBrZXljdXQgaXMgc2l6ZSBvZiBrZXl3b3JkIHRvIHVzZSwgdGhlbiBkYXNoZXMsIHRoZW4gdmFsdWUgc3RyaW5nCiAgICAgIAogICAgICAvLyBEbyB0aGUga2V5d29yZCBpZiBuZWVkZWQsIHVzZSBrZXljdXQgdG8gZGV0ZXJtaW5lIHNpemUKICAgICAgc3RyX25jcHkodGVtcCwga2V5LCAyOCk7ICAgICAgICAgICAgICAgIC8vIHRha2UgYSBmZXcgZXh0cmEgY2hhciBzb21ldGltZXMKICAgICAgdGVtcCArPSBrZXljdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRvIHBsYWNlIGZvciBkYXNoZXMKICAgICAgKnRlbXArKyA9ICcgJzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1dCBvbmUgc3BhY2UgYWx3YXlzCiAgICAgIGlmIChkYXNoZXMgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzb21lIGZpbGxlciBuZWVkZWQKCWlmIChkYXNoZXMgPCAzKSB7ICAgICAvLyBza2lwIGRhc2hlcyBpZiBub25lIG9yIHRvbyBmZXcKCSAgd2hpbGUgKGRhc2hlcy0tKSB7KnRlbXArKyA9ICcgJzsgfSAgLy8gdXNlIHNwYWNlIGZpbGxlcgoJfQoJZWxzZSB7CgkgIHdoaWxlIChkYXNoZXMtLSkgeyp0ZW1wKysgPSAnLic7IH0gIC8vIHVzZSBkb3QgZmlsbGVyCgl9CiAgICAgIH0KICAgICAgKnRlbXArKyA9ICcgJzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1dCBvbmUgc3BhY2UgYWx3YXlzCiAgICB9CiAgICAKICAgIC8vIERvIHRoZSB2YWx1ZQogICAgY250ID0gKE1MRU4tMSkgLSAoTG5nMzIpKHRlbXAgLSBsaW5lKTsgICAgICAgICAgICAgLy8gc2VlIHdoYXQgd2UgaGF2ZSBsZWZ0CiAgICAvLyAgICBjbnQgPSA3OSAtIChMbmczMikodGVtcCAtIGxpbmUpOyAgICAgICAgICAgICAvLyBzZWUgd2hhdCB3ZSBoYXZlIGxlZnQKICAgIGlmICh2YWxTaXplID4gY250KSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaW5wdXQgdG9vIGxhcmdlCiAgICAgIHN0cl9uY3B5KHRlbXAsIHZhbCwgY250KTsgICAgICAgICAgICAgICAvLyBkbyBpdCB0aGUgaGFyZCB3YXkKICAgICAgSW50MzIgaW5kZXhPZkxhc3RCeXRlT2ZVdGY4Q2hhciA9IEluZGV4T2ZMYXN0Qnl0ZU9mVVRGOENoYXJBdE9yQmVmb3JlUG9zKChjb25zdCB1bnNpZ25lZCBjaGFyKilsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1MRU4tMikgLypzdHJMZW4qLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNTEVOLTMpIC8qYnl0ZVBvcyovKTsKICAgICAgaWYgKGluZGV4T2ZMYXN0Qnl0ZU9mVXRmOENoYXIgPCAwIHx8IGluZGV4T2ZMYXN0Qnl0ZU9mVXRmOENoYXIgPj0gNzcpCiAgICAgIHsKICAgICAgICAqKGxpbmUrKE1MRU4tMikpID0gJyonOyAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBpdCB3YXMgY3V0CiAgICAgICAgKihsaW5lKyhNTEVOLTEpKSA9ICdcMCc7CgkvLyAgICAgICAgKihsaW5lKzc4KSA9ICcqJzsgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgaXQgd2FzIGN1dAogICAgICAgIC8vKihsaW5lKzc5KSA9ICdcMCc7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgKihsaW5lK2luZGV4T2ZMYXN0Qnl0ZU9mVXRmOENoYXIrMSkgPSAnKic7IC8vIHNob3cgaXQgd2FzIGN1dAogICAgICAgICoobGluZStpbmRleE9mTGFzdEJ5dGVPZlV0ZjhDaGFyKzIpID0gJ1wwJzsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIHN0cl9jcHlfYyh0ZW1wLCB2YWwpOyAgICAgICAgICAgICAgICAgICAvLyBkbyBpdCB0aGUgZWFzeSB3YXkKICAgIH0KICAgIAogICAgLy8gQ2xlYW4gdXAgYW5kIGV4aXQKICAgIGNudExpbmVzXysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVtcCBlbXB0eSBsaW5lIGNvdW50ZXIKICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIG5vdGhpbmcKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkZ1bmN0aW9uIE5hbWU6IEZvcm1hdExvbmdMaW5lCgpBcmd1bWVudCBMaXN0OgogICAgY2hhciAqa2V5W2luXSAgICAgICAgICAgcHRyIHRvIHN0YXJ0IG9mIGtleSB3b3JkIHN0cmluZwogICAgY2hhciAqdmFsW2luXSAgICAgICAgICAgcHRyIHRvIHN0YXJ0IG9mIHZhbHVlIHN0cmluZywgbXVzdCBub3QgYmUgYSBjb25zdGFudAogICAgbG9uZyAga2V5U2l6ZVtpbl0gICAgICAgY291bnQgb2YgY2hhcmFjdGVycyBpbiBrZXkgd29yZCBzdHJpbmcsIDAgb2sgYnV0ID8KICAgIGxvbmcgIHZhbFNpemVbaW5dICAgICAgIGNoYXIgdG8gdXNlIGZyb20gdmFsdWUgc3RyaW5nLCA8IG1heCBvaywgMCBub3Qgb2sKICAgIGxvbmcgIGluZGVudFtpbl0gICAgICAgIGNvdW50IG9mIGJsYW5rIGNoYXJhY3RlcnMgYXQgc3RhcnQgb2YgbGluZSwgZGVmYXVsdCAwCgpSZXR1cm4gU3RhdHVzOiBOb25lCgpDbGFzcyBEYXRhIEFjY2Vzc2VkOgogICAgbGluZXNfW291dF0gICAgICAgICAgICAgbmV3IHByaW50IGxpbmUgc2V0CiAgICBjbnRMaW5lc19baW4vb3V0XSAgICAgICBjb3VudCBvZiBsaW5lcyBpbiBsaW5lc18gYXQgc3RhcnQKCkRlc2NyaXB0aW9uOgpUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgaW5wdXQga2V5d29yZCBhbmQgdmFsdWUgc3RyaW5nIGFuZCBmb3JtYXQgaXQKaW50byBvbmUgb3IgbW9yZSA3OSBjaGFyYWN0ZXIgbGluZXMgaW4gdGhlIGxpbmVzXyBhcnJheS4gIEl0IGV4cGVjdHMgdGhlCmlucHV0IGtleSBwYXJhbWV0ZXIgdG8gYmUgbnVsbC10ZXJtaW5hdGVkLCBidXQgdmFsIGRvZXMgbm90IG5lZWQgdG8gYmUuCgpJdCBleHBlY3RzIHRoZSBpbnB1dCB2YWwgc3RyaW5nIG5vdCB0byBmaXQgb24gb25lIGxpbmUsIGJ1dCBpdCB3aWxsIGJlIE9LCmlmIGl0IGRvZXMuICBJdCB3aWxsIGZvbGxvdyBhbGwgdGhlIGZvcm1hdHRpbmcgcnVsZXMgZGVmaW5lZCBpbiB0aGUgRVMuCkl0IHdpbGwgY3V0IHRoZSB2YWx1ZSBpbnRvIGEgc2VyaWVzIG9mIHBpZWNlcywgdGhlIGZpcnN0IHdpbGwgYmUgNzktQ09MMgooNTEgY2hhcmFjdGVycykgYW5kIGFsbCB0aGUgcmVzdCB3aWxsIGJlIDc5LUNPTDItMiAoNDkpLiBUaGUgc2Vjb25kCmFuZCBsYXRlciBsaW5lcyBhbHdheXMgc3RhcnQgaW4gY29sIENPTDIrMiAoMzApIHdpdGggaW5kZW50PUNPTDIrMSwgbm8KbWF0dGVyIHdoYXQgdGhlIGluaXRpYWwgaW5kZW50IHdhcy4gVGhlIGxpbmUgY291bnQgd2lsbCBiZSBhZGp1c3RlZCB0bwpzaG93IGFsbCB0aGUgbGluZXMgYWRkZWQgdG8gbGluZXNfLiAgVGhlIG91dHB1dCBsaW5lcyB3aWxsIGxvb2sgbGlrZSB0aGlzOgogIERFU0NSSVBUSU9OCiAgICBzY2FuX3R5cGUgLi4uLi4uLi4uLi4uLi4gZnVsbCBzY2FuIG9mIHRhYmxlIE9SREVSUyBidXQgdGhpcyBsaW5lIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZWQgdG8gc2hvdyB0aGUgMiBjaGFyIGluZGVudAoKVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBtb2RpZnkgdGhlIHZhbHVlIHN0cmluZyBwZXJtYW5lbnRseS4gIEluIHRoZQpmb2xsb3dpbmcgZGlzY3Vzc2lvbiA0OSBtZWFucyA3OS1DT0wyLTIgb3IgdGhhdCArMiBmb3IgZmlyc3QgbGluZS4gIEl0IHdpbGwKYmFja3NjYW4gMjggY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IGNoYXJhY3RlciBwb3NzaWJsZSBpbiB0aGlzIHZhbHVlCmZpZWxkICg0OSBjaGFyIHVzdWFsbHkpIGZvciBhIGNvbW1hLCByZW1lbWJlcmluZyB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBzZWVuLgpJZiBpdCBmaW5kcyBhIGNvbW1hIGl0IHdpbGwgYnJlYWsgKGluc2VydCBhIG51bGwgY2hhcmFjdGVyKSB0aGUgbGluZSB0aGVyZSwKaWYgbm90IGl0IHdpbGwgYnJlYWsgaXQgYXQgdGhlIGZpcnN0IHdoaXRlc3BhY2UgaWYgZm91bmQuICBJbiB3b3JzdCBjYXNlCml0IHdpbGwganVzdCBjdXQgdGhlIGxpbmUgYXQgNDkgY2hhcmFjdGVycy4gIEl0IHdpbGwgdXNlIEZvcm1hdExpbmUgdG8Kc3RvcmUgdGhlIGxpbmUgaW4gdGhlIGxpbmVzXyBhcnJheS4gIFRoZW4gaXQgd2lsbCByZXN0b3JlIHRoZSBjdXQgY2hhcmFjdGVyLApza2lwIHdoaXRlc3BhY2UgYW5kIGJlZ2luIHRoZSBzY2FuIGFnYWluIHVudGlsIHRoZSBudWxsIGNoYXJhY3RlciBpcyBzZWVuLgpPZiBjb3Vyc2UgaXQgd2lsbCBkZWNyZW1lbnQgdGhlIHZhbFNpemUgZm9yIGRhdGEgYW5kIHdoaXRlc3BhY2UgcHJvY2Vzc2VkCmFuZCBzdG9wIHdoZW4gdGhlIGxhc3QgcGllY2UgZml0cyBpbiA0OSBjaGFyYWN0ZXJzLgoKVGhpcyByb3V0aW5lIHdpbGwgcmVseSBvbiBGb3JtYXRMaW5lIHRvIGZsYWcgZGF0YSBsb3NzLgoKVGhlIGlucHV0IHZhbHVlIHN0cmluZyBtdXN0IG5vdCBiZSBpbiBhIGNvbnN0YW50IGJlY2F1c2UgdGhpcyByb3V0aW5lIGN1dHMKaXQgYXMgbmVlZGVkIChhbmQgcmVzdG9yZXMgdGhlIGN1dCBhZnRlcikuICBTbyB2YWwgPSAidGhpcyBpcyBhIHRlc3QiIGRvZXMKbm90IHdvcmsuCioqKioqLwp2b2lkIEV4RXhlVXRpbERpc3BsYXlFeHBsYWluVGNiOjpGb3JtYXRMb25nTGluZShjb25zdCBjaGFyICprZXksIGNoYXIgKnZhbCwgTG5nMzIga2V5U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG5nMzIgdmFsU2l6ZSwgTG5nMzIgaW5kZW50KQp7CiAgICBjaGFyICppbnB0ciA9IHZhbDsgICAgICAgICAgLy8gY3VycmVudCBwdHIgdG8gdmFsdWUgc3RyaW5nIHJlbWFpbmluZwogICAgTG5nMzIgIGxvY1NpemUgPSB2YWxTaXplOyAgICAvLyBzaXplIG9mIHZhbHVlIHN0cmluZyByZW1haW5pbmcKICAgIGNoYXIgKnRtcDsgICAgICAgICAgICAgICAgICAvLyB3b3JraW5nIHB0cgogICAgTG5nMzIgIGNudDsgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBzcGFjZSBhdmFpbGFibGUgZm9yIHRoaXMgcGFzcwogICAgTG5nMzIgIHNjYW5jbnQ7ICAgICAgICAgICAgICAvLyBjb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2tzY2FubmVkCiAgICBMbmczMiAgY3V0U2l6ZTsgICAgICAgICAgICAgIC8vIHNpemUgb2Ygc3RyaW5nIGFmdGVyIGN1dAogICAgY2hhciAgYzsgICAgICAgICAgICAgICAgICAgIC8vIHRlbXAgZm9yIGN1dCBjaGFyYWN0ZXIKICAgIExuZzMyICBzcDsgICAgICAgICAgICAgICAgICAgLy8gc3BhY2Ugbm90IGZvdW5kIG9uIHRoaXMgcGFzcyBpZiAwCiAgICBMbmczMiAgY29tbWE7ICAgICAgICAgICAgICAgIC8vIGNvbW1hIG5vdCBmb3VuZCBvbiB0aGlzIHBhc3MgaWYgMAogICAgTG5nMzIgIGZpcnN0ID0gMTsgICAgICAgICAgICAvLyBmaXJzdCBsaW5lIG9mIGZvbGQgYmVpbmcgZG9uZSBpZiAxCiAgICAKICAgIAogICAgLy8gU2V0IHRoZSBsaW1pdCBmb3IgdGhlIHZhbHVlIHN0cmluZyBmb3IgbGluZSAxCiAgICBpZiAoaW5kZW50IDwgQ09MMikgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGtleXdvcmQgYWxzbwogICAgICBjbnQgPSBNTEVOIC0gQ09MMjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBDT0wyIGlzIHN0YXJ0LCBzbyB1c2UgODAKICAgICAgLy8gICAgICBjbnQgPSA4MCAtIENPTDI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ09MMiBpcyBzdGFydCwgc28gdXNlIDgwCiAgICB9CiAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBvbmx5IGEgdmFsdWUKICAgICAgY250ID0gKE1MRU4tMSkgLSBpbmRlbnQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGVudCBpcyBjaGFyIGNudCBzbyB1c2UgNzkKICAgICAgLy8gICAgICBjbnQgPSA3OSAtIGluZGVudDsgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZW50IGlzIGNoYXIgY250IHNvIHVzZSA3OQogICAgfQogICAgCiAgICAvLyBsb29wIHVudGlsIG5vIG1vcmUgZGF0YSwgcmV0dXJuIHRvIGNhbGxlciBmcm9tIGluc2lkZSBsb29wCiAgICB3aGlsZSAoMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AgdW50aWwgaXQgZml0cyBvbiBvbmUgbGluZQogICAgICAvLyBTZWUgaWYgd2UgY2FuIGRvIGFueXRoaW5nCiAgICAgIGlmIChjbnRMaW5lc18gPT0gTUxJTkUpIHsgICAgICAgICAgICAgICAvLyBpZiBvdXRwdXQgaXMgZnVsbCBhbHJlYWR5CglGb3JtYXRMaW5lKGtleSwgaW5wdHIsIGtleVNpemUsIGxvY1NpemUsIGluZGVudCk7IC8vZm9yY2UgdGhlICJmdWxsIiBtZXNzYWdlCglyZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHJlbWFpbmluZyB3b3JrCiAgICAgIH0KICAgICAgLy8gV2UgY2FuIGRvIGFub3RoZXIgbGluZSBhdCBsZWFzdAogICAgICBzcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5pdCBmb3IgYW5vdGhlciBwYXNzCiAgICAgIGNvbW1hID0gMTsKICAgICAgc2NhbmNudCA9IDA7CiAgICAgIGlmIChsb2NTaXplIDw9IGNudCkgeyAgICAgICAgICAgICAgICAgICAvLyBpZiBhbGwgZml0cyBvbiB0aGlzIGxpbmUKCXRtcCA9IGlucHRyICsgbG9jU2l6ZTsgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBudWxsLCBidXQgaWYgbm90CgljID0gKnRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXQgaGVyZSwgaW4gY2FzZSBpbnB1dCBsYXJnZXIKCSp0bXAgPSAnXDAnOwoJRm9ybWF0TGluZShrZXksIGlucHRyLCBrZXlTaXplLCBsb2NTaXplLCBpbmRlbnQpOyAvL2RvIGl0CgkqdG1wID0gYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGN1dCBjaGFyCglyZXR1cm47CiAgICAgIH0KICAgICAgdG1wID0gaW5wdHIgKyBjbnQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGxhc3QgY3V0IGNoYXIgcG9zc2libGUKICAgICAgaWYgKCp0bXAgPT0gJywnKSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHRoaXMgaXMgYSBjb21tYSBjYW4gbm90IHRha2UgaXQKCXRtcC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZ2ljIHdpbGwgY3V0IGJleW9uZCBjb21tYSwgdG9vIGxvbmcKICAgICAgfQogICAgICB3aGlsZSAoKGMgPSAqdG1wLS0pICE9ICcsJykgeyAgICAgICAgICAgLy8gYmFja3NjYW4gaW5wdXQgd2F0Y2hpbmcgZm9yIHN0dWZmCglpZiAoc2NhbmNudCsrID49IDI4KSB7ICAgICAgICAgICAgICAvLyBpZiB0aW1lIHRvIHF1aXQKCSAgY29tbWEgPSAwOwoJICBicmVhazsKCX0KCWlmICgoYyA9PSAnICcpICYgKCEgc3ApKSB7ICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHNwYWNlCgkgIHNwID0gc2NhbmNudDsgICAgICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhpcyBwb3NpdGlvbiwgbmV2ZXIgMAoJfQogICAgICB9CiAgICAgIC8vIG5vdyBzZWUgd2hhdCB3ZSBoYXZlIGZvdW5kIHRvIHdvcmsgd2l0aCBhbmQgZGVmaW5lIGN1dCBpbiB0bXAKICAgICAgaWYgKGNvbW1hKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGZvdW5kIGEgY29tbWEKCXRtcCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgYmV5b25kIGl0CiAgICAgIH0KICAgICAgZWxzZSBpZiAoc3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgdXNlIGZpcnN0IHNwYWNlCgl0bXAgPSBpbnB0ciArIGNudCAtIHNwICsgMTsgICAgICAgICAvLyBmaW5kIHNwIGNoYXIKICAgICAgfQogICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBqdXN0IGN1dCBhdCBlbmQKCUludDMyIGxlbkluQnl0ZXMgPSBjbnQ7CglJbnQzMiBpbmRleE9mTGFzdEJ5dGVPZlV0ZjhDaGFyID0KCSAgSW5kZXhPZkxhc3RCeXRlT2ZVVEY4Q2hhckF0T3JCZWZvcmVQb3MgKCAoY29uc3QgdW5zaWduZWQgY2hhciAqKWlucHRyIC8vIHV0ZjhTdHIKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoY29uc3QgSW50MzIpIGxlbkluQnl0ZXMgICAgIC8vIHV0ZjhTdHJMZW5JbkJ5dGVzCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKGNvbnN0IEludDMyKSAobGVuSW5CeXRlcy0xKSAvLyBieXRlUG9zCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CglpZiAoaW5kZXhPZkxhc3RCeXRlT2ZVdGY4Q2hhciA+PSAwKQoJICBsZW5JbkJ5dGVzID0gaW5kZXhPZkxhc3RCeXRlT2ZVdGY4Q2hhciArIDE7Cgl0bXAgPSBpbnB0ciArIGxlbkluQnl0ZXM7CiAgICAgIH0KICAgICAgYyA9ICp0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1dCBoZXJlIGJleW9uZCBnb29kCiAgICAgICp0bXAgPSAnXDAnOwogICAgICBjdXRTaXplID0gKExuZzMyKSh0bXAgLSBpbnB0cik7CiAgICAgIEZvcm1hdExpbmUoa2V5LCBpbnB0ciwga2V5U2l6ZSwgY3V0U2l6ZSwgaW5kZW50KTsgLy9kbyBpdCBmaW5hbGx5CiAgICAgICp0bXAgPSBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGN1dCBjaGFyCiAgICAgIHdoaWxlICgqdG1wKysgPT0gJyAnKSB7Y3V0U2l6ZSsrOyB9ICAgICAvLyBkcm9wIGxlYWRpbmcgc3BhY2VzCiAgICAgIHRtcC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIGZpcnN0IG5vbi1zcGFjZQogICAgICBsb2NTaXplIC09IGN1dFNpemU7ICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHJlbWFpbmluZyBzaXplCiAgICAgIGlucHRyID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgcmVtYWluaW5nIHN0cmluZwogICAgICBpZiAoZmlyc3QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZmlyc3QgbGluZQoJY250IC09IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgMiBzbWFsbGVyIG9uIHNlY29uZCBsaW5lCglrZXlTaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXkgbm8gbW9yZSBrZXksIG15IGNvcHkKCWluZGVudCA9IChNTEVOLTEpIC0gY250OyAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgaW5kZW50LCBteSBjb3B5CgkvLwlpbmRlbnQgPSA3OSAtIGNudDsgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGluZGVudCwgbXkgY29weQoJZmlyc3QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpcyBub3QgZmlyc3QKICAgICAgfQogICAgfSAvLyBlbmQgd2hpbGUgZm9yZXZlcgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRnVuY3Rpb24gTmFtZTogRm9ybWF0U1FMCgpBcmd1bWVudCBMaXN0OgogICAgY2hhciAqa2V5W2luXSAgICAgICAgICAgcHRyIHRvIHN0YXJ0IG9mIGtleSB3b3JkIHN0cmluZwogICAgY2hhciAqdmFsW2luL291dF0gICAgICAgcHRyIHRvIHN0YXJ0IG9mIHZhbHVlIHN0cmluZywgaXQgd2lsbCBiZSBtb2RpZmllZAogICAgbG9uZyAga2V5U2l6ZVtpbl0gICAgICAgY291bnQgb2YgY2hhcmFjdGVycyBpbiBrZXkgd29yZCBzdHJpbmcsIDAgb2sgYnV0ID8KICAgIGxvbmcgIHZhbFNpemVbaW5dICAgICAgIGNoYXIgdG8gdXNlIGZyb20gdmFsdWUgc3RyaW5nLCA8IG1heCBvaywgMCBub3Qgb2sKICAgIGxvbmcgIGluZGVudFtpbl0gICAgICAgIGNvdW50IG9mIGJsYW5rIGNoYXJhY3RlcnMgYXQgc3RhcnQgb2YgbGluZSwgZGVmYXVsdCAwCgpSZXR1cm4gU3RhdHVzOiBOb25lCgpDbGFzcyBEYXRhIEFjY2Vzc2VkOgogICAgbGluZXNfW291dF0gICAgICAgICAgICAgbmV3IHByaW50IGxpbmUgc2V0CiAgICBjbnRMaW5lc19baW4vb3V0XSAgICAgICBjb3VudCBvZiBsaW5lcyBpbiBsaW5lc18gYXQgc3RhcnQKCkRlc2NyaXB0aW9uOgpUaGlzIGZ1bmN0aW9uIHdpbGwgZm9sZCBhbiBTUUwgc3RhdGVtZW50IGF0IGxvZ2ljYWwgdG9rZW5zIHdoZW4gcG9zc2libGUuClRoaXMgaXMgbm90IHRvIGJlIGEgcGFyc2VyLiAgSWYgdGhlIHN0YXRlbWVudCBleGNlZWRzIHJlYXNvbmFibGUgY29tcGxleGl0eQpsaW1pdHMgaXQgd2lsbCBiZSBmb2xkZWQgdXNpbmcgdGhlIGJhc2ljIEZvcm1hdExvbmdMaW5lIGZ1bmN0aW9uLiAgVGhlIGlucHV0CnZhbCB3aWxsIGJlIG51bGwtdGVybWluYXRlZCBhdCB2YWxTaXplIGF0IHN0YXJ0IG9mIHByb2Nlc3NpbmcgYW5kIHJlc3RvcmVkCmF0IHRoZSBzaW5nbGUgZXhpdC4gIElmIGl0IGlzIGFscmVhZHkgbnVsbCB0ZXJtaW5hdGVkIHRoYXQgaXMgT0suICBUaGUga2V5CnN0cmluZyBzaG91bGQgYmUgbnVsbC10ZXJtaW5hdGVkIGFscmVhZHkuCgpUaGUgYWxnb3JpdGhtIHdpbGwgZmlyc3QgZGVjaWRlIGlmIHRoZSBzdGF0ZW1lbnQgc3RhcnRzIHdpdGggInNlbGVjdCIsCiJpbnNlcnQgaW50byIsICJ1cGRhdGUiLCAiZGVsZXRlIGZyb20iIGluIGVpdGhlciB1cHBlciBjYXNlIG9yIGxvd2VyIGNhc2UuCklmIGl0IGdldHMgbm8gbWF0Y2hlcyBpdCBkb2VzIHRoZSBkZWZhdWx0IGZvbGRpbmcuICBJdCB0aGVuIG1ha2VzIHRoZQphc3N1bXB0aW9uIHRoYXQgdGhlIHVzZXIgaGFzIGJlZW4gY29uc2lzdGVudCBpbiB1c2Ugb2YgY2FzZSBzbyB0aGVyZSBpcwpubyBuZWVkIHRvIGNvbnZlcnQgY2FzZS4gIElmIG5vdCwgeW91IGZpbmQgbm8gc3Vic2VxdWVudCB0b2tlbnMgYW5kIGdldCB0aGUKZGVmYXVsdCBmb2xkaW5nLgoKT25jZSBpdCBmaW5kcyBhIGNvbW1hbmQgdHlwZSBpdCBsb29rcyBmb3IgdGhlIGxlZ2FsIGtleXdvcmRzIGZvciB0aGF0IGNvbW1hbmQKaW4gb3JkZXIuICBJdCBhbHNvIHdhdGNoZXMgZm9yIG9wZW4gcGFyZW50aGVzaXMgdG8gc2tpcCBzdWJxdWVyeXMgb3Igd2F0Y2ggZm9yCmRhdGEgaW4gdGhlIGluc2VydCBjb21tYW5kLiAgSXQgd2lsbCBmb2xkIGJlZm9yZSB0aGUgbmV4dCBsb2dpY2FsIG9wZXJhdG9yCmFuZCBjYWxsIHRoZSBGb3JtYXRMb25nTGluZSB0byBkbyB0aGUgbGFzdCBzZWN0aW9uLCBubyBtYXR0ZXIgaG93IGxvbmcgaXQgaXMuCkl0IHRyaWVzIHRvIGRvIGEgcmVhc29uYWJsZSBmb3JtYXR0aW5nIGZvciBpbnNlcnQgZGF0YS4gIEl0IHRyaWVzIHRvIGdldCB0aHJvdWdoCm5lc3RlZCBwYXJlbnRoZXNpcywgYnV0IGdpdmVzIGRlZmF1bHQgZm9sZGluZyBvbiB0aGUgdGhpcmQgbmVzdGluZyBsZXZlbC4KVGhlIG5lc3Rpbmcgc2hvd24gYmVsb3cgc2hvdWxkIGJlIHByb2Nlc3NlZCBhcyBzaG93bi4KClRoZSBkZXNpcmVkIG91dHB1dCBpczoKICAgICAgICAgICAgU0VMRUNUIGN1c3RfbmFtZSwgY3VzdF9jb250YWN0LCBjdXN0X2FkZHJlc3MsIGN1c3RfY2l0eSwKICAgICAgICAgICAgICBjdXN0X3N0YXRlCiAgICAgICAgICAgIEZST00gQ3VzdG9tZXJzCiAgICAgICAgICAgIFdIRVJFIGN1c3RfaWQgSU4gKFNFTEVDVCBjdXN0X2lkIEZST00gT3JkZXJzIFdIRVJFIG9yZGVyX251bQogICAgICAgICAgICAgIElOIChTRUxFQ1Qgb3JkZXJfbnVtIEZST00gT3JkZXJJdGVtcyBXSEVSRSBwcm9kX2lkID0KICAgICAgICAgICAgICAnUkdBTjAxJykpIEFORCBjdXN0X3N0YXRlID0gJ0NBJwogICAgICAgICAgICBPUkRFUiBCWSBjdXN0X2NvbnRhY3Q7CmFuZDoKICAgICAgICAgICAgaW5zZXJ0IGludG8gQ3VzdG9tZXJzKGN1c3RfaWQsIGN1c3RfbmFtZSwgY3VzdF9hZGRyZXNzLAogICAgICAgICAgICAgIGN1c3RfY2l0eSwgY3VzdF9zdGF0ZSwgY3VzdF96aXAsIGN1c3RfY291bnRyeSkKICAgICAgICAgICAgdmFsdWVzCiAgICAgICAgICAgICAgKCcxMDAwMDAwMDA2JywgJ1RveSBMYW5kJywgJzEyMyBBbnkgU3RyZWV0JywgJ05ldwogICAgICAgICAgICAgICAgWW9yaycsICdOWScsICcxMTExMScsICdVU0EnKSwKICAgICAgICAgICAgICAoJzEwMDAwMDAwMDcnLCAnVG95IFRvd24gZm9yIFRvdHMnLCAnMjczNjQgV2VzdCBIYXBweSBMYW5lJywKICAgICAgICAgICAgICAgICdDaGljYWdvJywgJ0lMJywgJzM3MzYzJywgJ1VTQScpOwoKVGhlcmUgYXJlIGEgbG90IG9mIHBvc3NpYmxlIGlucHV0cyB3aGVuIHlvdSBjb25zaWRlciBlbWJlZGRlZCBjb21tYW5kcyBhbmQgcGFyZW5zCmluIHRoZSAiQU5EIiBhbmQgIk9SIiBjbGF1c2VzLiAgU28gaWYgd2UgY2Fubm90IGZpZ3VyZSBvdXQgd2hhdCB0byBkbywgd2Ugd2lsbApqdXN0IHVzZSB0aGUgYmFzaWMgZm9sZGluZyBwcm92aWRlZCBieSBGb3JtYXRMb25nTGluZSgpLgoKQmVjYXVzZSBvZiB0aGUgbGluZSBjdXR0aW5nLCBvbmx5IG9uZSByZXR1cm4gaXMgcGVybWl0dGVkIGluIHRoaXMgcm91dGluZS4gIFRoZQp3aGl0ZSBzcGFjZSBjb21wcmVzc2lvbiBtYXkgcGFkIHRoZSBlbmQgd2l0aCBibGFua3MgYW5kIGNoYW5nZSB0aGUgbGFzdCBjaGFyLgoqKioqKi8Kdm9pZCBFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblRjYjo6Rm9ybWF0U1FMKGNvbnN0IGNoYXIgKmtleSwgY2hhciAqdmFsLCBMbmczMiBrZXlTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMbmczMiB2YWxTaXplLCBMbmczMiBpbmRlbnQpCnsKICAgIC8vIEluaXRpYWxpemUgd29ya2luZyBjb25zdGFudHMgb25jZSBvbmx5LCBvcmRlciBpbXBvcnRhbnQgZm9yIERNTHdvcmQgdXNlCiAgICBjaGFyIERNTFVzZWxbOF1bMTJdID0geyJTRUxFQ1QiLCAiRlJPTSIsICJXSEVSRSIsICJVTklPTiIsCiAgICAgICAgIkdST1VQIEJZIiwgIkhBVklORyIsICJPUkRFUiBCWSIsICJGT1IifTsKICAgIGNoYXIgRE1MTHNlbFs4XVsxMl0gPSB7InNlbGVjdCIsICJmcm9tIiwgIndoZXJlIiwgInVuaW9uIiwKICAgICAgICAiZ3JvdXAgYnkiLCAiaGF2aW5nIiwgIm9yZGVyIGJ5IiwgImZvciJ9OwogICAgY2hhciBETUxVaW5zWzZdWzEyXSA9IHsiSU5TRVJUIElOVE8iLCAiVkFMVUVTIiwgIlNFTEVDVCIsICJGUk9NIiwKICAgICAgICAiV0hFUkUiLCAiRk9SIn07CiAgICBjaGFyIERNTExpbnNbNl1bMTJdID0geyJpbnNlcnQgaW50byIsICJ2YWx1ZXMiLCAic2VsZWN0IiwgImZyb20iLAogICAgICAgICJ3aGVyZSIsICJmb3IifTsKICAgIGNoYXIgRE1MVXVwZFs0XVsxMl0gPSB7IlVQREFURSIsICJTRVQiLCAiV0hFUkUiLCAiRk9SIn07CiAgICBjaGFyIERNTEx1cGRbNF1bMTJdID0geyJ1cGRhdGUiLCAic2V0IiwgIndoZXJlIiwgImZvciJ9OwogICAgY2hhciBETUxVZGVsWzNdWzEyXSA9IHsiREVMRVRFIEZST00iLCAiV0hFUkUiLCAiRk9SIn07CiAgICBjaGFyIERNTExkZWxbM11bMTJdID0geyJkZWxldGUgZnJvbSIsICJ3aGVyZSIsICJmb3IifTsKICAgIExuZzMyIERNTHdvcmRbOF0gPSB7OCwgOCwgNiwgNiwgNCwgNCwgMywgM307IC8vIGVudHJpZXMvYXJyYXkKCiAgICAvLyBUaGUgd29ya2luZyB2YXJpYWJsZXMgY2FuIGdvIG9uIHRoZSBzdGFjawogICAgY2hhciAqaW5wdHIgPSB2YWw7ICAgICAgICAgIC8vIGN1cnJlbnQgcHRyIHRvIHZhbHVlIHN0cmluZyByZW1haW5pbmcKICAgIExuZzMyICBsb2NTaXplID0gdmFsU2l6ZTsgICAgLy8gc2l6ZSBvZiB2YWx1ZSBzdHJpbmcgcmVtYWluaW5nCiAgICBjaGFyICp0aGVfZW5kID0gdmFsK3ZhbFNpemU7Ly8gcG9pbnRlciB0byByZWFsIGVuZCBvZiBzdHJpbmcgKyAxCiAgICBjaGFyIGxhc3RfY2hhciA9ICp0aGVfZW5kOyAgLy8gbGFzdCBjaGFyIGluIHN0cmluZyArIDEsIHVzdWFsbHkgYSBibGFuawogICAgTG5nMzIgIGNudDsgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBzcGFjZSBhdmFpbGFibGUgZm9yIHRoaXMgcGFzcwogICAgY2hhciAqRE1McHRyID0gTlVMTDsgICAgICAgICAvLyBETUwgYXJyYXkgdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21tYW5kCiAgICBMbmczMiBETUx0eXBlID0gMDsgICAgICAgICAgIC8vIERNTCBhcnJheSwgMCA9IERNTFVzZWwsIDEgPSBETUxMc2VsLCBldGMuIG9yZGVyIGFib3ZlCiAgICBMbmczMiBETUxwb3MgPSAwOyAgICAgICAgICAgIC8vIERNTCBlbnRyeSBiZWluZyB0ZXN0ZWQKICAgIExuZzMyIERNTGVjbnQ7ICAgICAgICAgICAgICAgLy8gRW50cnkgY291bnQgaW4gY2hvc2VuIERNTCBhcnJheQogICAgTG5nMzIgcGFyZW5bMl07ICAgICAgICAgICAgICAvLyBuZXh0IHBhcmVucyBmb3VuZCwgc3RhcnQvZW5kIHBvc2l0aW9uCiAgICBMbmczMiB0b2tzaXplOyAgICAgICAgICAgICAgIC8vIHNpemUgb2YgbmV4dCB0b2tlbiBpbiB0aGUgYXJyYXkKICAgIExuZzMyIGN1dDsgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gb2YgY3V0IChyZWxhdGl2ZSB0byBpbnB0cikKICAgIExuZzMyIHBhclVzZWQgPSAwOyAgICAgICAgICAgLy8gZmxhZyBzYXlpbmcgd2Ugc2tpcHBlZCBvdmVyIHBhcmVucyBub3cKICAgIExuZzMyIHZhbFNlZW4gPSAwOyAgICAgICAgICAgLy8gZmxhZywgPTEgaW5zZXJ0IGJlaW5nIHByb2Nlc3NlZCwgPTIgdmFsdWVzIG5vdwogICAgTG5nMzIgZ29vZDsgICAgICAgICAgICAgICAgICAvLyBlbmQgcGFyZW4gZm9yIGxhc3QgZ29vZCBkYXRhIGxvb2tlZCBhdAogICAgTG5nMzIgZ29vZDI7ICAgICAgICAgICAgICAgICAvLyBlbmQgcGFyZW4gZm9yIGxhc3QgY3V0IGxvb2tlZCBhdAogICAgY2hhciAqbG9jaW5wdHI7ICAgICAgICAgICAgIC8vIHRlbXAgaW4gcHRyIGZvciB1c2UgaW4gc3Vic3RyaW5ncwogICAgY2hhciAqdG4gPSBOVUxMOyAgICAgICAgICAgIC8vIHdvcmtpbmcgcHRyLCB0ZW1wIG5leHQgZm9yIGNvbXByZXNzaW9uCiAgICBMbmczMiBtb3ZpbmcgPSAwOyAgICAgICAgICAgIC8vID0xIGNvbXByZXNzaW9uIGhhcyBiZWd1bgogICAgTG5nMzIgY250X2JsYW5rOyAgICAgICAgICAgICAvLyBjb3VudCBvZiBzcGFjZSBjaGFyYWN0ZXJzIHNlZW4gdG9nZXRoZXIKICAgIExuZzMyIHF1b3RpbmcgPSAwOyAgICAgICAgICAgLy8gPTEgd2UgYXJlIGluIGEgcXVvdGVkIHN0cmluZywgbm8gY29tcHJlc3Npb24KICAgIGNoYXIgKnRtcDsgICAgICAgICAgICAgICAgICAvLyB3b3JraW5nIHB0ciAocHRyIHRvIGN1dCBzcG90KQogICAgY2hhciAgYzsgICAgICAgICAgICAgICAgICAgIC8vIHRlbXAgZm9yIGN1dCBjaGFyYWN0ZXIKICAgIGNoYXIgIGQgPSAwOyAgICAgICAgICAgICAgICAvLyB0ZW1wIGZvciBxdW90ZSBjaGFyCgogICAgLy8gU2V0IHRoZSBsaW1pdHMgZm9yIHRoZSB2YWx1ZSBzdHJpbmcsIGFzc3VtZSBpbmRlbnQgbm90IGxhcmdlciB0aGFuIENPTDIKICAgIGNudCA9IE1MRU4gLSBDT0wyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxjIHRoZSB2YWx1ZSBzcGFjZSBmb3IgbGluZSAxCiAgICAvLyAgICBjbnQgPSA4MCAtIENPTDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGMgdGhlIHZhbHVlIHNwYWNlIGZvciBsaW5lIDEKICAgICp0aGVfZW5kID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBjdXQgYXQgRE9ORSAob25seSBleGl0KQoKICAgIC8vIElmIHJlYWxseSBzaG9ydCBkbyBub3RoaW5nCiAgICBpZiAodmFsU2l6ZSA8PSBjbnQpIHsgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGZpdHMgb24gb25lIGxpbmUKICAgICAgZ290byBET05FOwogICAgfQogICAgCiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggb2YgdGhlIDggRE1MIGNvbW1hbmRzIHdlIGhhdmUKICAgIHdoaWxlIChETUx0eXBlIDwgOCkgeyAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCB0aHJvdWdoIGFsbCA4IGFycmF5cwogICAgICBzd2l0Y2ggKERNTHR5cGUpIHsgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGEgbmV3IGFycmF5CiAgICAgIGNhc2UgMDoge0RNTHB0ciA9IERNTFVzZWxbMF07IGJyZWFrOyB9CiAgICAgIGNhc2UgMToge0RNTHB0ciA9IERNTExzZWxbMF07IGJyZWFrOyB9CiAgICAgIGNhc2UgMjoge0RNTHB0ciA9IERNTFVpbnNbMF07IGJyZWFrOyB9CiAgICAgIGNhc2UgMzoge0RNTHB0ciA9IERNTExpbnNbMF07IGJyZWFrOyB9CiAgICAgIGNhc2UgNDoge0RNTHB0ciA9IERNTFV1cGRbMF07IGJyZWFrOyB9CiAgICAgIGNhc2UgNToge0RNTHB0ciA9IERNTEx1cGRbMF07IGJyZWFrOyB9CiAgICAgIGNhc2UgNjoge0RNTHB0ciA9IERNTFVkZWxbMF07IGJyZWFrOyB9CiAgICAgIGNhc2UgNzoge0RNTHB0ciA9IERNTExkZWxbMF07IGJyZWFrOyB9CiAgICAgIH0KICAgICAgdG9rc2l6ZSA9IChMbmczMilzdHJfbGVuKERNTHB0cik7CiAgICAgIGlmIChzdHJfbmNtcChETUxwdHIsIGlucHRyLCB0b2tzaXplKSA9PSAwKSB7Ly8gaWYgdGhpcyBpcyBpdAoJYnJlYWs7CiAgICAgIH0KICAgICAgRE1MdHlwZSsrOwogICAgfQogICAgaWYgKERNTHR5cGUgPT0gOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB1bmtub3duLCBkbyBiYXNpYyBmb3JtYXQKICAgICAgZ290byBET05FOwogICAgfQogICAgaWYgKChETUx0eXBlID09IDIpIHx8IChETUx0eXBlID09IDMpKSB7ICAgICAvLyBpZiBkb2luZyBhbiBpbnNlcnQKICAgICAgdmFsU2VlbiA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNheSB3YXRjaCBmb3IgInZhbHVlIiBjbGF1c2UKICAgIH0KICAgIERNTGVjbnQgPSBETUx3b3JkW0RNTHR5cGVdOyAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSB0b2tlbiBjb3VudAogICAgCiAgICAvLyBjb21wcmVzcyB3aGl0ZXNwYWNlCiAgICB0bXAgPSBpbnB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNoYXIgbmV2ZXIgYmxhbmsKICAgIGNudF9ibGFuayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gd2hpdGVzcGFjZSB5ZXQKICAgIHdoaWxlIChjID0gKnRtcCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUgbm90IGVuZAogICAgICBpZiAoYyA9PSAnXHQnKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFiCgljID0gJyAnOwoJKih0bXAtMSkgPSBjOyAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgYSBibGFuawogICAgICB9CiAgICAgIGlmICghIHF1b3RpbmcpIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3QgaW5zaWRlIGEgcXVvdGUKCWlmIChjID09ICcgJykgeyAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHNwYWNlLCBsb29rIGNsb3NlcgoJICBjbnRfYmxhbmsrKzsgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50IHRoaXMgb25lCgl9IGVsc2UgewoJICBjbnRfYmxhbmsgPSAwOyAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGNvdW50Cgl9CglpZiAoKGMgPT0gJ1wnJykgfHwgKGMgPT0gJyInKSkgeyAgICAvLyBpZiBzdGFydGluZyBhIHF1b3RlCgkgIHF1b3RpbmcgPSAxOyAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0CgkgIGQgPSBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhlIHR5cGUKCX0KCWlmIChjbnRfYmxhbmsgPiAxKSB7ICAgICAgICAgICAgICAgIC8vIGlmIGNvbXByZXNzaW9uIG5lZWRlZAoJICBpZiAoISBtb3ZpbmcpIHsgICAgICAgICAgICAgICAgIC8vIGlmIGNvbXByZXNzaW9uIG5vdCBzdGFydGVkCgkgICAgbW92aW5nID0gMTsgICAgICAgICAgICAgICAgIC8vIG5vdGUgaXQgbXVzdCBzdGFydAoJICAgIHRuID0gdG1wLTE7ICAgICAgICAgICAgICAgICAvLyBub3RlIHdoZXJlIG5leHQgbm9uIGJsYW5rIGdvZXMKCSAgfQoJICBsb2NTaXplLS07ICAgICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdCBzdHJpbmcgbGVuZ3RoCgkgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBkcm9wIHRoaXMgZXh0cmEgc3BhY2UKCX0KICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhdGNoIGZvciBlbmQgb2YgcXVvdGUKCWlmIChjID09IGQpIHtxdW90aW5nID0gMDsgfSAgICAgICAgIC8vIHNheSBvdXRzaWRlIHF1b3RlIG5vdwogICAgICB9CiAgICAgIGlmIChtb3ZpbmcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBjb21wcmVzc2lvbiBzdGFydGVkCgkqdG4rKyA9IGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRoaXMgY2hhcgogICAgICB9CiAgICB9CiAgICB0bXAtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gbnVsbAogICAgaWYgKG1vdmluZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjb21wcmVzc2VkCiAgICAgICp0bXAgPSBsYXN0X2NoYXI7ICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGN1dAogICAgICB0aGVfZW5kID0gdG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBuZXcgZW5kCiAgICAgIGxhc3RfY2hhciA9ICcgJzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBzcGFjZSBoZXJlIGV2ZW50dWFsbHkKICAgICAgd2hpbGUgKHRuICE9IHRtcCkgeyp0bisrID0gJyAnOyB9ICAgICAgIC8vIHBhZCB3aXRoIHNwYWNlCiAgICAgICp0aGVfZW5kID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXQgYWdhaW4KICAgIH0KICAgIAogICAgLy8gU2NhbiBmb3IgZmlyc3Qgc2V0IG9mIHBhcmVucywgc2V0IGRhdGEgaW4gcGFyZW5bXQogICAgaWYgKEZpbmRQYXJlbnMoaW5wdHIsIHBhcmVuKSkgeyAgICAgICAgICAgICAvLyBpZiBmaW5kIGVycm9yIChubyBwYXJlbnMgaXMgbm90IGVycm9yKQogICAgICBnb3RvIERPTkU7CiAgICB9CiAgICAKICAgIC8vIGxvb3AgdW50aWwgbm8gbW9yZSBkYXRhLCByZXR1cm4gdG8gY2FsbGVyIGZyb20gaW5zaWRlIGxvb3AKICAgIHdoaWxlICgxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCB1bnRpbCBpdCBmaXRzIG9uIG9uZSBsaW5lCiAgICAgIC8vIFNlZSBpZiB3ZSBjYW4gZG8gYW55dGhpbmcKICAgICAgaWYgKGNudExpbmVzXyA9PSBNTElORSkgeyAgICAgICAgICAgICAgIC8vIGlmIG91dHB1dCBpcyBmdWxsIGFscmVhZHkKCWdvdG8gRE9ORTsKICAgICAgfQogICAgICAKICAgICAgLy8gSWYgdmFsdWUgY2xhdXNlIG9mIGluc2VydCBkbyBmaXJzdCBsaW5lIHNwZWNpYWwKICAgICAgaWYgKHZhbFNlZW4gPT0gMikgeyAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHRoZSBmaXJzdCBsaW5lIHdpdGhvdXQgZGF0YQoJY3V0ID0gMDsKCXRtcCA9IGlucHRyOwoJd2hpbGUgKCp0bXArKyAhPSAnKCcpICB7Y3V0Kys7IH0gICAgLy8gc2NhbiBmb3Igc3RhcnQgb2YgZGF0YQoJdG1wLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gZmlyc3Qgb3BlbgoJLy8gbm93IHRtcCBhbmQgY3V0IGFyZSBzZXQgdG8gZm9sZAoJYyA9ICp0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3V0IGhlcmUKCSp0bXAgPSAnXDAnOwoJRm9ybWF0TG9uZ0xpbmUoa2V5LCBpbnB0ciwga2V5U2l6ZSwgY3V0LCBpbmRlbnQpOyAvL2RvIGl0CgkqdG1wID0gYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGN1dCBjaGFyCgkKCS8vIFNldCBjb3VudGVycyBmb3IgbmV4dCBsb29wCglpbnB0ciA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGRhdGEgZG9uZQoJbG9jU2l6ZSAtPSBjdXQ7ICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHJlbWFpbmRlciBzaXplCglpbmRlbnQgPSBDT0wyICsgMTsgICAgICAgICAgICAgICAgICAvLyBpbmRlbnQgcmVzdCBhIGxpdHRsZQoJY250ID0gKE1MRU4tMikgLSBDT0wyIC0gMjsgICAgICAgICAgICAgICAgLy8gbGVzcyBkYXRhIG5vdyAoZXh0cmEgMiBmb3IgLCBhdCBlbmQpCgkvLwljbnQgPSA3OCAtIENPTDIgLSAyOyAgICAgICAgICAgICAgICAvLyBsZXNzIGRhdGEgbm93IChleHRyYSAyIGZvciAsIGF0IGVuZCkKICAgICAgfQogICAgICBnb29kMiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBnb29kIHBsYWNlIHNlZW4gdG8gY3V0CiAgICAgIC8vIElmIHZhbHVlIGNsYXVzZSBvZiBpbnNlcnQgZG8gZGF0YSBsaW5lcyBzcGVjaWFsLCByZXR1cm4gZnJvbSB3aGlsZQogICAgICB3aGlsZSAodmFsU2VlbiA9PSAyKSB7ICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgYXJlIG9uIGEgdmFsdWVzIHN0cmluZwoJaWYgKGxvY1NpemUgPD0gY250KSB7ICAgICAgICAgICAgICAgLy8gaWYgc3BhY2UgZm9yIHRoZSByZXN0CgkgIGdvdG8gRE9ORTsKCX0KCWxvY2lucHRyID0gaW5wdHI7ICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgaW5wdHIgdW5jaGFuZ2VkIGZvciBhd2hpbGUKCWdvb2QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgZm91bmQgeWV0Cgl3aGlsZSAoMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZSBtb3JlIGZpbmQgbWF4IGxpbmUKCSAgLy8gU2NhbiBmb3IgbmV4dCBjbG9zZSBwYXJlbnMKCSAgd2hpbGUgKGMgPSAqbG9jaW5wdHIrKykgeyAgICAgICAvLyB3aGlsZSBlbmQgbm90IHNlZW4KCSAgICBpZiAoYyA9PSAnKScpIHsgICAgICAgICAgICAgLy8gaWYgY2xvc2UgcGFyZW4KCSAgICAgIGdvb2QgPSAoTG5nMzIpKGxvY2lucHRyIC0gaW5wdHIpOy8vIG5vdGUgcG9zc2libGUgY3V0CgkgICAgICBsb2NpbnB0ci0tOyAgICAgICAgICAgICAvLyBiYWNrIHVwIGluIGNhc2Ugb2YgZW5kCgkgICAgICBicmVhazsKCSAgICB9CgkgIH0KCSAgLy8gc2NhbiBmb3IgbmV4dCBkYXRhIGl0ZW0gc3RhcnQncyBvcGVuIHBhcmVuLCBvciBlbmRpbmcgc2VtaQoJICB3aGlsZSAoYyA9ICpsb2NpbnB0cisrKSB7ICAgICAgIC8vIHdoaWxlIGVuZCBub3Qgc2VlbgoJICAgIGlmIChjID09ICcoJykgeyAgICAgICAgICAgICAvLyBpZiBuZXh0IG9wZW4gcGFyZW4gc2VlbgoJICAgICAgbG9jaW5wdHItLTsgICAgICAgICAgICAgLy8gcG9pbnQgdG8gb3BlbgoJICAgICAgYnJlYWs7CgkgICAgfQoJICAgIGVsc2UgaWYgKGMgPT0gJzsnKSB7ICAgICAgICAvLyBpZiBlbmQgc2VlbiBhbmQgbm8gbmV4dAoJICAgICAgbG9jaW5wdHItLTsgICAgICAgICAgICAgLy8gcG9pbnQgdG8gc2VtaWNvbG9uCgkgICAgICBicmVhazsKCSAgICB9CgkgIH0KCSAgaWYgKGMgPT0gJ1wwJykgeyAgICAgICAgICAgICAgICAvLyBpZiBub3QgZm91bmQsIHN5bnRheCBpc3N1ZQoJICAgIGdvdG8gRE9ORTsKCSAgfQoJICAvLyBub3cgd2UgaGF2ZSBhIGNsb3NlIGFuZCBuZXh0IG9wZW4gZm91bmQsIGRlY2lkZSB3aGF0IHRvIGRvCgkgIGlmIChnb29kIDw9IChjbnQgLSAyKSkgeyAgICAgICAgLy8gaWYgaXQgZml0cyBvbiBsaW5lCgkgICAgZ29vZDIgPSBnb29kOyAgICAgICAgICAgICAgIC8vIHJlbWVtYmVyIGl0IGFuZCB0cnkgZm9yIG1vcmUKCSAgICBnb29kID0gMDsgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQKCSAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgLy8gc2NhbiBhZ2FpbgoJICB9CgkgIGVsc2UgaWYgKCEgZ29vZDIpIHsgICAgICAgICAgICAgLy8gaWYgZmlyc3QgaXMgdG9vIGxvbmcgZm9yIGxpbmUKCSAgICBpZiAoYyA9PSAnOycpIHsgICAgICAgICAgICAgLy8gaWYgaXQgaXMgYWxzbyB0aGUgbGFzdAoJICAgICAgZ290byBET05FOyAgICAgICAgICAgICAgLy8ganVzdCBmaW5pc2ggdXAKCSAgICB9CgkgICAgdG1wID0gbG9jaW5wdHI7ICAgICAgICAgICAgIC8vIHBvaW50IHRvIG5leHQgb3BlbgoJICAgIGN1dCA9IChMbmczMikodG1wIC0gaW5wdHIpOwoJICB9CgkgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGVyZSBpcyBhbm90aGVyIGFuZCB3aGVyZSB0byBjdXQKCSAgICBjdXQgPSBnb29kMjsKCSAgICB0bXAgKz0gY3V0OyAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gbGFzdCBnb29kIGNsb3NlCgkgICAgd2hpbGUgKCp0bXArKyAhPSAnKCcpIHtjdXQrKzsgfSAvLyBmaW5kIG5leHQgb3BlbgoJICAgIHRtcC0tOyAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHVwIG9uZQoJICB9CgkgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjaWRlZCB3aGVyZSB0byBjdXQgbm93Cgl9CgkvLyBub3cgdG1wIGFuZCBjdXQgYXJlIHNldCB0byBmb2xkCgljID0gKnRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXQgaGVyZQoJKnRtcCA9ICdcMCc7CglGb3JtYXRMb25nTGluZShrZXksIGlucHRyLCBrZXlTaXplLCBjdXQsIGluZGVudCk7IC8vZG8gaXQKCSp0bXAgPSBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgY3V0IGNoYXIKCQoJLy8gU2V0IGNvdW50ZXJzIGZvciBuZXh0IGxvb3AKCWlucHRyID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgZGF0YSBkb25lCglsb2NTaXplIC09IGN1dDsgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgcmVtYWluZGVyIHNpemUKCWdvb2QyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG92ZXIKICAgICAgfSAvLyBlbmQgd2hpbGUgZm9yIGluc2VydCBkYXRhIHByb2Nlc3NpbmcsIG5ldmVyIGZhbGwgdGhyb3VnaCB3aGlsZQogICAgICAKICAgICAgLy8gbW92ZSB0byBuZXh0IHRva2VuIGluIGxpc3QKICAgICAgRE1McG9zKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgdG8gbmV4dCB0b2tlbiBudW1iZXIKICAgICAgaWYgKERNTHBvcyA+PSBETUxlY250KSB7ICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1vcmUgdG8gbG9vayBmb3IKCWdvdG8gRE9ORTsKICAgICAgfQogICAgICBETUxwdHIgKz0gMTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0byBuZXh0IGV4cGVjdGVkIHRva2VuCiAgICAgIGxvY2lucHRyID0gaW5wdHI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGlucHRyIHVuY2hhbmdlZCBmb3IgYXdoaWxlCiAgICAgIC8vIHNjYW4gZm9yd2FyZCBsb29raW5nIGZvciB0aGlzIGtleXdvcmQgaW4gaW5wdXQKICAgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heCAyIHRyaWVzIHdoZW4gc3Vic3RyaW5ncwoJdG1wID0gc3RyX3N0cihsb2NpbnB0ciwgRE1McHRyKTsgICAgLy8gc2VlIGlmIHRoaXMgaXMgcHJlc2VudAoJaWYgKHRtcCA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kCgkgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IGFub3RoZXIKCX0KCWN1dCA9IChMbmczMikodG1wIC0gaW5wdHIpOyAgICAgICAgICAvLyBzZWUgaG93IG1hbnkgY2hhciB3ZSBoYXZlIHRoaXMgdGltZQoJCgkvLyBGb3VuZCBidXQgbWFrZSBzdXJlIG5vdCBpbiBwYXJlbnMKCWlmIChwYXJlblswXSA+IDAgKSB7ICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgcGFyZW4gc29tZXdoZXJlCgkgIGlmIChwYXJlblswXSA8IGN1dCkgeyAgICAgICAgICAgLy8gaWYgc3Vic3RyaW5nIHNvbWV3aGVyZSBpbnNpZGUgdGhpcwoJICAgIGlmIChwYXJlblsxXSA8IGN1dCkgeyAgICAgICAvLyBpZiBzdWJzdHJpbmcgY2xvc2VkIGluc2lkZQoJICAgICAgcGFyVXNlZCA9IDE7ICAgICAgICAgICAgLy8gbm90ZSB3ZSBjb25zdW1lZCB0aGUgcGFyZW50aGVzaXMKCSAgICB9CgkgICAgZWxzZSB7CgkgICAgICBsb2NpbnB0ciArPSBwYXJlblsxXTsgICAvLyB0YWtlIGFsbCBvZiBzdWJxdWVyeSBvciB3aGF0ZXZlcgoJICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgLy8gdHJ5IGFnYWluIG9uIHRoaXMgb25lCgkgICAgfQoJICB9Cgl9CglicmVhazsKICAgICAgfSAvLyBlbmQgc3Vic3RyaW5nIHByb2Nlc3NpbmcKICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHJlYWxseSBub3QgZm91bmQKCWNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSBhbm90aGVyCiAgICAgIH0KICAgICAgCiAgICAgIC8vIE5vdyB3ZSBoYXZlIGEgbG9naWNhbCBlbGVtZW50IGlkZW50aWZpZWQsIG91dHB1dCBpdAogICAgICB0bXAgPSBpbnB0ciArIGN1dDsgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gY3V0IGNoYXIsIGJ1dCBpZiBub3QKICAgICAgYyA9ICp0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1dCBoZXJlCiAgICAgICp0bXAgPSAnXDAnOwogICAgICBGb3JtYXRMb25nTGluZShrZXksIGlucHRyLCBrZXlTaXplLCBjdXQsIGluZGVudCk7IC8vZG8gaXQKICAgICAgKnRtcCA9IGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgY3V0IGNoYXIKICAgICAgCiAgICAgIC8vIFNldCBjb3VudGVycyBmb3IgbmV4dCBsb29wCiAgICAgIGlucHRyID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGRhdGEgZG9uZQogICAgICBsb2NTaXplIC09IGN1dDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHJlbWFpbmRlciBzaXplCiAgICAgIGlmIChrZXlTaXplICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmaXJzdCBsaW5lIGRvbmUsIHNldCBmb3IgcmVzdAoJa2V5U2l6ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F5IG5vIG1vcmUga2V5LCBteSBjb3B5CglpbmRlbnQgPSBDT0wyIC0gMTsgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBpbnRvIGNvbHVtbiAyLCBteSBjb3B5CiAgICAgIH0KICAgICAgaWYgKHBhcmVuWzBdID4gMCApIHsgICAgICAgICAgICAgICAgICAgIC8vIGlmIGEgcGFyZW4KCWlmIChwYXJVc2VkKSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNvbnN1bWVkIHRoZW0gdGhpcyB0aW1lCgkgIC8vIFNjYW4gZm9yIG5leHQgc2V0IG9mIHBhcmVucywgc2V0IGRhdGEgaW4gcGFyZW5bXQoJICBpZiAoRmluZFBhcmVucyhpbnB0ciwgcGFyZW4pKSB7IC8vIGlmIGZpbmQgZXJyb3IKCSAgICBnb3RvIERPTkU7CgkgIH0KCX0KCWVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgcmVkdWNlIGxvY2F0aW9uCgkgIHBhcmVuWzBdIC09IGN1dDsKCSAgcGFyZW5bMV0gLT0gY3V0OwoJfQogICAgICB9CiAgICAgIGlmICh2YWxTZWVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkb2luZyBpbnNlcnQKCWlmIChETUxwb3MgPT0gMSkgeyAgICAgICAgICAgICAgICAgIC8vIGlmIGRvaW5nIHZhbHVlcyBvZiBpbnNlcnQKCSAgdmFsU2VlbiA9IDI7ICAgICAgICAgICAgICAgICAgICAvLyBub3RlIHRoaXMgZm9yIG5leHQgcGFzcwoJfQogICAgICB9CiAgICAgIAogICAgfSAvLyBlbmQgd2hpbGUgZm9yZXZlcgogICAgCiAgICAvLyBEbyBsYXN0IGxpbmUgYW5kIHJldHVybgpET05FOgogICAgRm9ybWF0TG9uZ0xpbmUoa2V5LCBpbnB0ciwga2V5U2l6ZSwgbG9jU2l6ZSwgaW5kZW50KTsKICAgICp0aGVfZW5kID0gbGFzdF9jaGFyOyAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBjdXQgd2l0aCBvcmlnaW5hbCBjaGFyCiAgICByZXR1cm47Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGdW5jdGlvbiBOYW1lOiBGaW5kUGFyZW5zCgpBcmd1bWVudCBMaXN0OgogICAgY2hhciAqaW5TdHJbaW5dICAgICAgICAgcHRyIHRvIHN0YXJ0IG9mIHN0cmluZyB0byBzY2FuCiAgICBsb25nIHBhcls0XVtvdXRdICAgICAgICByZWYgdG8gYXJyYXkgdG8gc3RvcmUgdXAgdG8gdHdvLCBwb3Mgb3BlbiwgY2xvc2UKClJldHVybiBTdGF0dXM6IAogICAgbG9uZyAgICAgICAgICAgICAgICAgICAgPSAwLCBzdWNjZXNzLCA9IC0xLCBzb21ldGhpbmcgd3JvbmcKCkRlc2NyaXB0aW9uOgpUaGlzIGZ1bmN0aW9uIHdpbGwgc2NhbiB0aGUgaW5wdXQgc3RyaW5nIGZvciB0aGUgbmV4dCBzZXQgb2YgcGFyZW50aGVzaXMuCkl0IHdpbGwgYWNjZXB0IGF0IG1vc3QgMiBsZXZlbHMgb2YgbmVzdGluZyAoLTEgd2hlbiAzcmQgc2VlbikgYW5kIHJldHVybgp0aGVpciBjaGFyIHBvc2l0aW9ucyBmcm9tIGluU3RyLiAgSXQgd2lsbCByZXR1cm4gLTEgaWYgbm8gbWF0Y2ggZm91bmQuCioqKioqLwpMbmczMiBFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblRjYjo6RmluZFBhcmVucyhjaGFyICppblN0ciwgTG5nMzIgcGFyW10pIGNvbnN0CnsKICBjaGFyICp0bXAxID0gaW5TdHI7ICAgICAgICAgLy8gd29ya2luZyBwdHIKICBMbmczMiBwYXIyZHAgPSAwOyAgICAgICAgICAgIC8vIG5lc3RpbmcgZm91bmQgaWYgbm90IDAKICBMbmczMiBjbnQgPSAwOyAgICAgICAgICAgICAgIC8vIGNoYXIgY291bnRlcgogIGNoYXIgYzsKICAKICAvLyBCZWdpbiBmaXJzdCBzY2FuIGZvciBvcGVuIHBhcmVuCiAgcGFyWzBdID0gcGFyWzFdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBhbGwKICB3aGlsZSAoYyA9ICp0bXAxKyspIHsgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYW4gdG8gZW5kIG9mIHN0cmluZwogICAgaWYgKGMgPT0gJygnKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gb3BlbiBwYXJlbgogICAgICBwYXJbMF0gPSBjbnQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlIGl0cyBwb3NpdGlvbgogICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc3RvcCBzY2FuCiAgICB9CiAgICBjbnQrKzsKICB9CiAgaWYgKHBhclswXSA9PSAwKSB7cmV0dXJuICgwKTsgfSAgICAgICAgICAgICAvLyBpZiBub25lLCBzdWNjZXNzCiAgY250Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0bXAxIGlzIG9uIG5leHQKICAKICAvLyBTZWNvbmQgc2NhbiBpcyBmb3IgY2xvc2Ugd2l0aG91dCBhbm90aGVyIG9wZW4KICB3aGlsZSAoYyA9ICp0bXAxKyspIHsgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYW4gdG8gZW5kIG9mIHN0cmluZwogICAgaWYgKGMgPT0gJyknKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBjbG9zZSBwYXJlbgogICAgICBpZiAocGFyMmRwID09IDApIHsgICAgICAgICAgICAgICAgICAvLyBpZiBubyBvdGhlciBvcGVuCglwYXJbMV0gPSBjbnQ7ICAgICAgICAgICAgICAgICAgIC8vIG5vdGUgaXRzIHBvc2l0aW9uCglicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdG9wIHNjYW4KICAgICAgfQogICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjbG9zZWQgZW1iZWRkZWQgb3BlbgoJcGFyMmRwID0gMDsgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBjYXJlIGFib3V0IG90aGVyIG9wZW4gbm93CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGMgPT0gJygnKSB7ICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFub3RoZXIgb3BlbiBwYXJlbgogICAgICBpZiAocGFyMmRwICE9IDApIHtyZXR1cm4gKC0xKTsgfSAgICAvLyBpZiB0aGlyZCBlbWJlZGRlZCwgZ2l2ZSB1cAogICAgICBwYXIyZHAgPSBjbnQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlIGl0cyBwb3NpdGlvbgogICAgfQogICAgY250Kys7CiAgfQogIGlmIChwYXJbMV0gPT0gMCkge3JldHVybiAoLTEpOyB9ICAgICAgICAgICAgLy8gaWYgbm8gY2xvc2UsIHN5bnRheCBlcnJybwogIHJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHN1Y2Nlc3MKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkZ1bmN0aW9uIE5hbWU6IEZvcm1hdEZpcnN0TGluZQoKQXJndW1lbnQgTGlzdDogTm9uZQoKUmV0dXJuIFN0YXR1czogTm9uZQoKQ2xhc3MgRGF0YSBBY2Nlc3NlZDoKICAgIG9wZXJOYW1lX1tpbl0gICAgICAgICAgIHRleHQgbmFtZSBvZiB0aGlzIG5vZGUgb2YgdGhlIHBsYW4KICAgIHNlcU51bV9baW5dICAgICAgICAgICAgIGxvbmcgbnVtYmVyIG9mIHRoaXMgbm9kZQogICAgbGVmdENoaWxkX1tpbl0gICAgICAgICAgbG9uZyBudW1iZXIgb2YgdGhpcyBub2RlJ3MgbGVmdCBjaGlsZAogICAgcmlnaHRDaGlsZF9baW5dICAgICAgICAgbG9uZyBudW1iZXIgb2YgdGhpcyBub2RlJ3MgcmlnaHQgY2hpbGQKICAgIGxpbmVzX1tvdXRdICAgICAgICAgICAgIG5ldyBwcmludCBsaW5lIHNldAogICAgY250TGluZXNfW2luL291dF0gICAgICAgY291bnQgb2YgbGluZXMgaW4gbGluZXNfIGF0IHN0YXJ0CgpEZXNjcmlwdGlvbjoKVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgdGhlIHNwZWNpZmllZCBwcml2YXRlIHZhcmlhYmxlcyBhbmQgZm9ybWF0IHRoZW0KaW50byBhIHNpbmdsZSA3OSBjaGFyYWN0ZXIgbGluZSBpbiB0aGUgbGluZXNfIGFycmF5LiAgSXQgZXhwZWN0cyB0aGUgaW5wdXQKdmFsdWVzIHRvIGZpdC4gIFRoZSBsaW5lIGNvdW50IHdpbGwgYmUgYWRqdXN0ZWQgdG8gc2hvdyBhbm90aGVyIGxpbmUgaW4KbGluZXNfLiAgVGhlIG91dHB1dCBsaW5lIHdpbGwgbG9vayBsaWtlIHRoaXM6ClJPT1QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIFNFUV9OTyA3ICAgIENISUxEUkVOIDYsIDE4ClJPT1QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIFNFUV9OTyA3ICAgIE9OTFkgQ0hJTEQgNgpGSUxFX1NDQU4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICBTRVFfTk8gNyAgICBOTyBDSElMRFJFTgoKVGhlIGZvcm1hdHRpbmcgcnVsZXMgYXJlIHNpbXBsZS4gIFRoZSA9IGZpbmlzaCBpbiBjb2wgNDMsIDQ0LTQ1IGFyZSBibGFuaywKYW5kIHRoZSBTRVEgdG9rZW4gc3RhcnRzIGluIGNvbCA0NiBhbmQgdGhlIHdvcmQgQ0hJTERSRU4gaW4gY29sIDYyLiAgQSByaWdodApjaGlsZCBudW1iZXIgb2YgMCBjYXVzZXMgdGhlIE9OTFkgQ0hJTEQgZm9ybWF0LCBhbmQgcmlnaHQgYW5kIGxlZnQgb2YgMApjYXVzZSB0aGUgTk8gQ0hJTERSRU4gZm9ybWF0LgoKVGhpcyByb3V0aW5lIHdpbGwgY2hlY2sgZm9yIGFuIGVtcHR5IGxpbmUgaW4gdGhlIGxpbmVzXyBhcnJheSBhbmQgZG8gbm90aGluZwppZiB0aGVyZSBpcyBubyBzcGFjZS4gIFRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4KKioqKiovCnZvaWQgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5UY2I6OkZvcm1hdEZpcnN0TGluZSh2b2lkKQp7CiAgY2hhciAqbGluZTsgICAgICAgICAgICAgICAgIC8vIHB0ciB0byBsaW5lIHRvIGluc2VydAogIExuZzMyICBjbnQ7ICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBuYW1lIHNpemUKICBMbmczMiAgZGFzaGVzOyAgICAgICAgICAgICAgIC8vIGNvdW50IG9mIGVxdWFscyB0byBzZXQKICAKICAKICAvLyBTZWUgaWYgd2UgY2FuIGRvIGFueXRoaW5nLCB3ZSByZXF1aXJlIHR3byBsaW5lcyBsZWZ0CiAgaWYgKGNudExpbmVzXyA+PSBNTElORS0xKSB7ICAgICAgICAgICAgICAgICAvLyBpZiBvdXRwdXQgaXMgYWxtb3N0IGZ1bGwKICAgIEZvcm1hdExpbmUoTlVMTCxOVUxMLDAsMCk7ICAgICAgICAgICAgICAvLyBmb3JjZSBhIGJsYW5rIGxpbmUgb3IgdGhlICJmdWxsIiBtc2cKICAgIEZvcm1hdExpbmUoTlVMTCxOVUxMLDAsMCk7ICAgICAgICAgICAgICAvLyBmb3JjZSB0aGUgImZ1bGwiIG1lc3NhZ2UKICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGFsbCB3b3JrCiAgfQogIGxpbmUgPSBsaW5lc19bY250TGluZXNfXTsgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gZW1wdHkgbGluZQogIAogIC8vIEZvcm1hdCB0aGUgZmlyc3QgdHdvIGZpZWxkcyBvZiB0aGUgbGluZQogIGNudCA9IChMbmczMilzdHJfbGVuKG9wZXJOYW1lXyk7ICAgICAgICAgICAgIC8vIHNlZSB3aGF0IHdlIGdvdCwgbWF4IGlzIE1PUEVSPTMwCiAgc3RyX2NweV9jKGxpbmUsIG9wZXJOYW1lXyk7ICAgICAgICAgICAgICAgICAvLyBzdGFydCB0aGUgbGluZSB3aXRoIG9wZXJhdG9yIG5hbWUKICBsaW5lICs9IGNudDsKICAqbGluZSsrID0gJyAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBzcGFjZQogIGRhc2hlcyA9IDQzIC0xIC0gY250OyAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGhvdyBtdWNoIGZpbGxlcgogIHdoaWxlIChkYXNoZXMtLSkgeypsaW5lKysgPSAnPSc7IH0gICAgICAgICAgLy8gYWRkIGVxdWFscwogIHN0cl9zcHJpbnRmIChsaW5lLCAiICBTRVFfTk8gJWQgICAgICAgICAgICAiLCBzZXFOdW1fKTsgLy8gYWRkIHNlcXVlbmNlIG5icgogIGxpbmUgKz0gMTg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gbmV4dCBhcmVhCiAgCiAgLy8gVGhpcyBhbGdvcml0aG0gYXNzdW1lcyB3ZSBoYXZlIGF0IGxlYXN0IHR3byBsaW5lcyBpbiB0aGUgbGluZXNfCiAgLy8gYXJyYXkgdG8gYWxsb3cgb3ZlcmZsb3cuICBTaG91bGQgYWx3YXlzIGJlLCBidXQgd2FzIGNoZWNrZWQgZWFybGllcgogIGlmIChyaWdodENoaWxkXyA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcmlnaHQgZG9lcyBub3QgZXhpc3QKICAgIGlmIChsZWZ0Q2hpbGRfICE9IDApIHsgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBleGl0cwogICAgICBzdHJfc3ByaW50ZiAobGluZSwgIk9OTFkgQ0hJTEQgJWQiLCBsZWZ0Q2hpbGRfKTsKICAgIH0KICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWl0aGVyIGV4aXN0CiAgICAgIHN0cl9zcHJpbnRmIChsaW5lLCAiTk8gQ0hJTERSRU4iKTsKICAgIH0KICB9CiAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHR3byBub2RlIGZvcm1hdCBuZWVkZWQKICAgIHN0cl9zcHJpbnRmIChsaW5lLCAiQ0hJTERSRU4gJWQsICVkIiwgbGVmdENoaWxkXywgcmlnaHRDaGlsZF8pOwogIH0KICAvLyB2ZXJpZnkgbnVtYmVycyB3ZXJlIG5vdCB0b28gbG9uZwogIGNudCA9IE1XSURFIC0gNjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG1heCBzaXplIGluIGNoYXIgCiAgaWYgKChMbmczMilzdHJfbGVuKGxpbmUpID4gY250KSB7ICAgICAgICAgICAgLy8gaWYgaXQgZXhjZWVkIDc5IGNoYXIKICAgIGxpbmUgKz0gY250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB0byBsYXN0IGNoYXIKICAgICpsaW5lLS0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBjdXQKICAgICpsaW5lID0gJyonOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IGN1dAogIH0KICAKICAvLyBDbGVhbiB1cCBhbmQgZXhpdAogIGNudExpbmVzXysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVtcCBlbXB0eSBsaW5lIGNvdW50ZXIKICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBub3RoaW5nCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGdW5jdGlvbiBOYW1lOiBEb1NlcGFyYXRvcgoKQXJndW1lbnQgTGlzdDogTm9uZQoKUmV0dXJuIFN0YXR1czogTm9uZQoKQ2xhc3MgRGF0YSBBY2Nlc3NlZDoKICAgIGhlYWRlcl9baW5dICAgICAgICAgICAgIHNldCBpZiBkb2luZyBoZWFkZXIgb3Igcm9vdCBub2RlCiAgICBsYXN0RnJhZ19baW4vb3V0XSAgICAgICBwcmV2aW91cyBmcmFnbWVudCBudW1iZXIKICAgIGxhc3RPcF9baW4vb3V0XSAgICAgICAgIHByZXZpb3VzIG9wZXJhdG9yIG5hbWUKICAgIG9wZXJOYW1lX1tpbl0gICAgICAgICAgIHRleHQgbmFtZSBvZiB0aGlzIG5vZGUgb2YgdGhlIHBsYW4KICAgIGRlc2NyaXB0aW9uX1tpbl0gICAgICAgIGRhdGEgZm9yIG5vZGUsIGNvbnRhaW5zIGZyYWcgbnVtYmVyCiAgICBsaW5lc19bb3V0XSAgICAgICAgICAgICBuZXcgcHJpbnQgbGluZSBzZXQKICAgIGNudExpbmVzX1tpbi9vdXRdICAgICAgIGNvdW50IG9mIGxpbmVzIGluIGxpbmVzXyBhdCBzdGFydAoKRGVzY3JpcHRpb246ClRoaXMgZnVuY3Rpb24gd2lsbCBvdXRwdXQgdHdvIHBsYW4gc2VwYXJhdG9ycyBmb3IgdGhlIGZpcnN0IG5vZGUgb2YgYSBwbGFuLgpUaGUgZmlyc3Qgd2lsbCBiZSBmb3IgdGhlIGhlYWRlciwgdGhlIHNlY29uZCBmb3IgdGhlIHJvb3Qgbm9kZS4gIFRoZXkgYXJlCmNvbnRyb2xsZWQgYnkgdGhlIHNldHRpbmdzIG9mICJoZWFkZXJfIiBhbmQgImxhc3RGcmFnXyIuICBXaGVuIGhlYWRlcl8gaXMgMSBhbmQKbGFzdEZyYWdfIGlzIG5vdCAtMSBpdCBkb2VzIHRoZSBzdGFydC1vZi1wbGFuIHNlcGFyYXRvciBhbmQgc2V0cyBsYXN0RnJhZ18gdG8gLTEuCldoZW4gaGVhZGVyXyBpcyAxIGFuZCBsYXN0RnJhZ18gaXMgLTEgaXQgZG9lcyB0aGUgc3RhcnQtb2Ytbm9kZXMgc2VwYXJhdG9yIGFuZCAgCnNldHMgdGhlIGxhc3RGcmFnXyB0byAwLiBGb3IgUjEgdGhpcyBpcyBhbGwgdGhlIHNlcGFyYXRvcnMgaXQgc3VwcG9ydHMuICBXaGVuIGEKc3BlYXJhdG9yIGlzIHNldCBpdCBvdXRwdXRzIGEgbGluZSBvZiBkYXNoZXMgZW5kaW5nIHdpdGggdGhlIHNwYXJhdG9yIG5hbWUuCgpJbiBSMiB0aGlzIHdpbGwgYmVoYXZlIGFzIGFib3ZlIHdoZW4gaGVhZGVyXyBpcyAxLCBidXQgaW4gYWxsIG90aGVyIGNhc2VzIGl0CndpbGwgZmluZCB0aGUgZnJhZ21lbnQgbnVtYmVyIGluIHRoZSBkZXNjcmlwdGlvbiBjb2x1bW4gYW5kIGFuZCBvdXRwdXQgYSBwcm9jZXNzCnNlcGFyYXRvciBpZiB0aGUgY3VycmVudCBmcmFnbWVudCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgb25lIGN1cnJlbnRseSBpbgpsYXN0RnJhZ18gKGFuZCBzZXQgaXQgdG8gdGhlIGN1cnJlbnQgdmFsdWUpLiAgV2hlbiB0aGUgY3VycmVudCBmcmFnbWVudCBhbmQKbGFzdEZyYWdfIGFyZSB0aGUgc2FtZSBpdCB3aWxsIGRvIG5vdGhpbmcuICBJdCB3aWxsIGFsd2F5cyByZWNvcmQgY3VycmVudApvcGVyYXRvciBuYW1lIHRvIGhlbHAgd2l0aCBkZWNpc2lvbnMgb24gbmV4dCBjYWxsLgoKVGhpcyByb3V0aW5lIHdpbGwgY2hlY2sgZm9yIGFuIGVtcHR5IGxpbmUgaW4gdGhlIGxpbmVzXyBhcnJheSBhbmQgZG8gbm90aGluZwppZiB0aGVyZSBpcyBubyBzcGFjZS4KKioqKiovCnZvaWQgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5UY2I6OkRvU2VwYXJhdG9yKHZvaWQpCnsKICBjaGFyICpsaW5lOyAgICAgICAgICAgICAgICAgLy8gcHRyIHRvIGxpbmUgdG8gaW5zZXJ0CiAgY29uc3QgY2hhciAqcHJvY19uYW1lOyAgICAgIC8vIHB0ciB0byBwcm9jZXNzIG5hbWUgc3RyaW5nLCAiIj1ub25lCiAgTG5nMzIgIGNudDsgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIG5hbWUgc2l6ZQogIExuZzMyICBkYXNoZXM7ICAgICAgICAgICAgICAgLy8gY291bnQgb2YgZGFzaGVzIHRvIHNldAogIAogIC8vIFNlZSBpZiB3ZSBjYW4gZG8gYW55dGhpbmcKICBpZiAoY250TGluZXNfID49IE1MSU5FKSB7ICAgICAgICAgICAgICAgICAgIC8vIGlmIG91dHB1dCBpcyBmdWxsCiAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBhbGwgd29yawogIH0KICBsaW5lID0gbGluZXNfW2NudExpbmVzX107ICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGVtcHR5IGxpbmUKICBwcm9jX25hbWUgPSAiIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBuYW1lIHRvIG5vbmUKICAKICAvLyBDaGVjayBmb3Igc3RhcnQgb2YgYSBuZXcgcGxhbgogIGlmIChoZWFkZXJfKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3RhcnQgb2YgYSBwbGFuCiAgICBpZiAobGFzdEZyYWdfID09IC0xKSB7ICAgICAgICAgICAgICAgICAgLy8gaWYgc3RhcnQgb2Ygcm9vdCBub2RlCiAgICAgIC8vcHJvY19uYW1lID0gIiBNQVNURVIgUFJPQ0VTUyI7ICAgICAgICAgIC8vIG5hbWUgdGhpcyBwcm9jZXNzCiAgICAgIHByb2NfbmFtZSA9ICIgTk9ERSBMSVNUSU5HIjsgICAgICAgIC8vIG5hbWUgdGhpcyBwcm9jZXNzCiAgICAgIGxhc3RGcmFnXyA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCByZWFsIGZyYWcgbmJyCiAgICB9CiAgICBlbHNlIHsKICAgICAgcHJvY19uYW1lID0gIiBQTEFOIFNVTU1BUlkiOyAgICAgICAgLy8gbmFtZSB0aGlzIGFzIGhlYWRlcgogICAgICBsYXN0RnJhZ18gPSAtMTsgICAgICAgICAgICAgICAgICAgICAvLyBzYXkgaGVhZGVyIGRvbmUKICAgIH0KICB9CiAgCiAgLy8gZmluZCBjdXJyZW50IGZyYWcgbnVtYmVyIGFuZCBjb21wYXJlIHRvIGxhc3QKICAvLyB0aGlzIGNvZGUgd2lsbCBiZSB3cml0dGVuIG9uY2Ugd2UgaGF2ZSBmcmFnIGluIHRoZSBkZXNjcmlwdGlvbiBvciBkZWNpZGUgd2Ugd29uJ3QuCiAgLyoKICAgIGlmIChzdHJjbXAobGFzdE9wXywgIlBBUlRJVElPTl9BQ0NFU1MiKSA9PSAwKSB7IC8vIGlmIHN1cmUgdG8gYmUgREFNCiAgICBwcm9jX25hbWUgPSAiIERJU0sgQUNDRVNTIjsKICAgIH0KICAgICovCiAgLy8gT3V0cHV0IGxpbmUgbm93IGlmIG5lZWRlZAogIGNudCA9IChMbmczMilzdHJfbGVuKHByb2NfbmFtZSk7ICAgICAgICAgICAgIC8vIGdldCBzaXplCiAgaWYgKGNudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzb21ldGhpbmcgdG8gb3V0cHV0CiAgICBkYXNoZXMgPSBNV0lERSAtIGNudDsgICAgICAgICAgICAgICAgICAgLy8gc2VlIGhvdyBtYW55IGRhc2hlcyBuZWVkZWQKICAgIHdoaWxlIChkYXNoZXMtLSkgeypsaW5lKysgPSAnLSc7IH0gICAgICAvLyBzZXQgZGFzaGVzCiAgICBzdHJfY3B5X2MobGluZSwgcHJvY19uYW1lKTsgICAgICAgICAgICAgLy8gc2V0IG5hbWUKICAgIGNudExpbmVzXysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidW1wIGVtcHR5IGxpbmUgY291bnRlcgogIH0KICAKICAvLyBDbGVhbiB1cCBhbmQgZXhpdAogIC8vICAgIHN0cl9jcHlfYyhsYXN0T3BfLCBvcGVyTmFtZV8pOyAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhpcyBvcGVyCiAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gbm90aGluZwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRnVuY3Rpb24gTmFtZTogUGFyc2VGaWVsZAoKQXJndW1lbnQgTGlzdDoKICAgIGNoYXIqICZrZXlwdHJbb3V0XSAgICAgIHJlZmVyZW5jZSB0byBwdHIgdG8ga2V5IHdvcmQsIGNvbG9uIHJlbW92ZWQKICAgIGNoYXIqICZmaWVsZHB0cltvdXRdICAgIHJlZmVyZW5jZSB0byBwdHIgdG8gdmFsdWUgc3RyaW5nCiAgICBsb25nICAma2V5U2l6ZVtvdXRdICAgICBjb3VudCBvZiBjaGFyYWN0ZXJzIGluIGtleSBzdHJpbmcKICAgIGxvbmcgICZmdWxsU2l6ZVtvdXRdICAgIGNvdW50IG9mIGNoYXJhY3RlcnMgaW4gdmFsdWUgc3RyaW5nCiAgICBsb25nICAmZG9uZVtvdXRdICAgICAgICAxPWVuZCBvZiBzdHJpbmcgc2VlbiwgMD1ub3Qgc2VlbgoKUmV0dXJuIFN0YXR1czogCiAgICBsb25nICAgICAgICAgICAgICAgICAgICA9IDAgb24gc3VjY2VzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMSBubyBrZXl3b3JkIGZvdW5kIHRoYXQgZW5kcyBpbiAiOiAiCgpDbGFzcyBEYXRhIEFjY2Vzc2VkOgogICAgcGFyc2VQdHJfW2luL291dF0gICAgICAgcG9pbnRzIHRvIHN0cmluZyBiZWluZyBwcm9jZXNzZWQKCkRlc2NyaXB0aW9uOgpUaGlzIGZ1bmN0aW9uIHdpbGwgc3RhcnQgZnJvbSB0aGUgY2hhcmFjdGVyIHBvaW50ZWQgdG8gYnkgcGFyc2VQdHJfIGFuZCBzY2FuCnVudGlsIGl0IGhhcyBmb3VuZCB0aGUga2V5d29yZCBhbmQgdmFsdWUgcGFpci4gIEl0IHdpbGwgY3V0IGVhY2ggYnkgZHJvcHBpbmcKYSBudWxsIGNoYXJhY3RlciBpbnRvIHRoZSBzdHJpbmcgYW5kIHJlbWVtYmVyIHRoZSBzdGFydCBvZiBlYWNoIHRvIHJldHVybi4KSXQgd2lsbCBmbGFnIHRoZSBsYXN0IHZhbHVlIGluIHRoZSBpbnB1dCAoZW5kIG9mIHN0cmluZyBzZWVuLCBldmVuIGlmIHRoZXJlIGlzCmJsYW5rIHBhZGRpbmcgYWZ0ZXIgdmFsdWUgZW5kcykuCgpJZiBpdCBmYWlscyBpbiBhbnkgd2F5IGl0IHdpbGwgcmV0dXJuIGEgLTEgYW5kIGxlYXZlIHRoZSBwb2ludGVyIHNldCB0byB3aGVyZSBpdCBiZWdhbgp0aGUgZmllbGQgc2NhbiB0aGF0IGZhaWxlZC4gIEluIHRoaXMgY2FzZSB0aGVyZSBjb3VsZCBiZSBhIHZhbHVlIHBvaW50ZXIgcmV0dXJuZWQKb3Igbm90LCBidXQgb25seSB0aGUgZG9uZSBwYXJhbWF0ZXIgY2FuIGJlIHVzZWQuICBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzCml0IGNvdWxkIGZhaWwsIGJ1dCB0aGV5IHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgaW5wdXQgZGF0YSBpcyBjb3JydXB0ZWQuCioqKioqLwpMbmczMiBFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblRjYjo6UGFyc2VGaWVsZCAoY2hhciAqJmtleXB0ciwgY2hhciAqJmZpZWxkcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMbmczMiAma2V5U2l6ZSwgTG5nMzIgJmZ1bGxTaXplLCBMbmczMiAmZG9uZSkKewogIC8vIEluaXRpYWxpemUgd29ya2luZyB2YXJpYWJsZXMKICBjaGFyICp3cmtwdHI7ICAgICAgICAgICAgICAgLy8gd29ya2luZyBwdHIKICAKICAvLyBJc29sYXRlIHRoZSBrZXl3b3JkCiAga2V5cHRyID0gcGFyc2VQdHJfOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1lbWJlciBzdGFydCBvZiBrZXl3b3JkCiAgd3JrcHRyID0gc3RyX3N0cihrZXlwdHIsICI6ICIpOyAgICAgICAgICAgICAvLyBmaW5kIGVuZCBvZiBrZXkKICBpZiAod3JrcHRyID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZAogICAgZnVsbFNpemUgPSAwOwogICAgZG9uZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNheSBubyBtb3JlCiAgICByZXR1cm4gKC0xKTsKICB9CiAgKndya3B0ciA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXQgb2ZmIGNvbG9uCiAga2V5U2l6ZSA9IChMbmczMikod3JrcHRyIC0ga2V5cHRyKTsgICAgICAgICAgLy8gZ2V0IHNpemUKICB3cmtwdHIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgdG8gYmxhbmsKICB3aGlsZSAoKCp3cmtwdHIpID09ICcgJykge3dya3B0cisrOyB9ICAgICAgIC8vIHNjYW4gdGhyb3VnaCBibGFua3MKICAKICAvLyBpc29sYXRlIHRoZSB2YWx1ZQogIGZpZWxkcHRyID0gd3JrcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSB2YWx1ZSBmb3Iga2V5d29yZAogIHdya3B0ciA9IHN0cl9zdHIoZmllbGRwdHIsICI6ICIpOyAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiBmaW5kIG5leHQga2V5d29yZAogIGlmICh3cmtwdHIgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBtdXN0IGJlIGxhc3QgaW4gc3RyaW5nCiAgICBmdWxsU2l6ZSA9IChMbmczMilzdHJfbGVuKGZpZWxkcHRyKTsgICAgIC8vIGp1c3QgdXNlIGFsbCBvZiBpdAogICAgd3JrcHRyID0gZmllbGRwdHIgKyBmdWxsU2l6ZSAtIDE7ICAgICAgIC8vIGxvY2F0ZXMgbGFzdCBjaGFyCiAgICB3aGlsZSAoKih3cmtwdHItLSkgPT0gJyAnKSB7ICAgICAgICAgICAgLy8gYmFja3NjYW4gb3ZlciBibGFua3MKICAgICAgZnVsbFNpemUtLTsKICAgIH0KICAgIHdya3B0ciArPSAyOwogICAgKih3cmtwdHIpID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1dCBoZXJlCiAgICBwYXJzZVB0cl8gPSB3cmtwdHI7ICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZ29vZCByZWFzb24gZm9yIGRvaW5nIHRoaXMKICAgIGRvbmUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXkgbm8gbW9yZQogIH0KICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFub3RoZXIKICAgIC8vIFNjYW4gYmFjayB0byBlbmQgb2YgdmFsdWUgKGZpcnN0IG5vbi1ibGFuayBhZnRlciBhIGJsYW5rKQogICAgd2hpbGUgKCgqd3JrcHRyKSAhPSAnICcpIHt3cmtwdHItLTt9ICAgIC8vIGJhY2sgdXAgdG8gYmxhbmsKICAgIHBhcnNlUHRyXyA9IHdya3B0ciArIDE7ICAgICAgICAgICAgICAgICAvLyByZW1lbWJlciBzdGFydCBvZiBuZXh0IGtleXdvcmQKICAgIHdoaWxlICgoKndya3B0cikgPT0gJyAnKSB7d3JrcHRyLS07fSAgICAvLyBiYWNrIG92ZXIgYmxhbmtzCiAgICB3cmtwdHIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gd2hlcmUgbnVsbCBzaG91bGQgYmUKICAgICood3JrcHRyKSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXQgaGVyZQogICAgZG9uZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNheSBtb3JlIHRvIGNvbWUKICB9CiAgaWYgKGZpZWxkcHRyID49IHBhcnNlUHRyXykgICAgICAgLy9hbiBlcnJvbmVvdXMgb3ZlcmZsb3cgaW50byB0aGUgbmV4dCBrZXl3b3JkCiAgICBmaWVsZHB0ciA9IHdya3B0cjsgICAgICAgICAgICAvL2R1ZSB0byBubyB2YWx1ZSwgZW1wdHkgc3RyaW5nIHZhbHVlLCBvciBlcnJvcgoKCiAgZnVsbFNpemUgPSAoTG5nMzIpKHdya3B0ciAtIGZpZWxkcHRyKTsgICAgICAgLy8gZ2V0IGxlbmd0aCBvZiB2YWx1ZSBzdHJpbmcKICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBzdWNjZXNzCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGdW5jdGlvbiBOYW1lOiBJc051bWJlckZtdAoKQXJndW1lbnQgTGlzdDoKICAgIGNoYXIgKmZpZWxkcHRyW2luXSAgICAgIHB0ciB0byB2YWx1ZSBzdHJpbmcgdG8gdGVzdAoKUmV0dXJuIFN0YXR1czogCiAgICBsb25nICAgICAgICAgICAgICAgICAgICAwPWNoYXJfc3RyLCAxPW51bV9zdHIKCkRlc2NyaXB0aW9uOgpUaGlzIGZ1bmN0aW9uIHdpbGwgZGV0ZXJtaW5lIGlmIHRoaXMgdmFsdWUgc3RyaW5nIG5lZWRzIGZ1cnRoZXIgcHJvY2Vzc2luZwpieSB0aGUgRm9ybWF0TnVtYmVyIHJvdXRpbmUgdG8gcmVmb3JtYXQgaXQgYW5kIGNvdW50IGRpZ2l0cyBiZWZvcmUgdGhlCmRlY2ltYWwgcG9pbnQuICBTaW5nbGUgZGlnaXQgYXJlIG5vdCBmbGFnZ2VkIG51bWVyaWMgYXMgbm8gc3BlY2lhbCBzdXBwb3J0CmlzIG5lZWRlZC4gIFdoZW4gaWRlbnRpZmllZCBhcyBudW1lcmljIHRoZXkgbXVzdCBiZSBjb3BpZWQgdG8gYSB0ZW1wIGJ1ZmZlcgpiZWNhdWVzIEZvcm1hdE51bWJlciBtaWdodCBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nLiAgSWYgdGhlIHZhbHVlCmlzIGtub3duIHRvIGJlIG51bWVyaWMgYnkgb3RoZXIgaW5mbyBkb24ndCBib3RoZXIgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgoKVGhlIGFsZ29yaXRobSBpcyBzZXQgdG8gZmFpbCBmYXN0IGlmIEZvcm1hdE51bWJlciBpcyBub3QgbmVlZGVkLiAgVGhlIGJhc2ljCmFwcHJvYWNoIGlzIHRvIGZhaWwgaWYgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGNvdWxkIG5vdCBiZSBpbiBhIG51bWJlci4gIElmCml0IGlzIG5vdCBhIG51bWJlciBpdCBtdXN0IHdhdGNoIGZvciArLCAtLCBFLCBhbmQgZG90LiAgU29tZSBmdXJ0aGVyCnZhbGlkYXRpb24gaXMgcHJvdmlkZWQgZm9yIHRoZXNlIGNhc2VzLCBhbmQgd2VpcmQgY29tYmluYXRpb25zIGFyZSBmbGFnZ2VkCmFzIHN0cmluZ3MuICBUaGlzIGlzIGhhcmQgYXMgdGhlIGNoYXJhY3RlcnMgYXJlIG5vdCBwcm9jZXNzZWQgaW4gYSBmdWxsCnN0YXRlIG1hY2hpbmUuCioqKioqLwpMbmczMiBFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblRjYjo6SXNOdW1iZXJGbXQoY2hhciAqZmllbGRwdHIpIGNvbnN0CnsKICBjaGFyICp3cmtwdHIgPSBmaWVsZHB0cjsgICAgLy8gd29ya2luZyBwdHIKICBjaGFyIGM7ICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcCBmb3IgY3VycmVudCBjaGFyCiAgTG5nMzIgbl9jbnQgPSAwOyAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgZGlnaXRzIHNlZW4KICBMbmczMiBkX2NudCA9IDE7ICAgICAgICAgICAgIC8vIE51bWJlciBvZiAnLicgcGVybWl0dGVkIGluIHN0cmluZwogIExuZzMyIGVfY250ID0gMTsgICAgICAgICAgICAgLy8gTnVtYmVyIG9mICdFJyBwZXJtaXR0ZWQgaW4gc3RyaW5nCiAgCiAgLy8gU2NhbiBmb3Igc2ltcGxlIG51bWVyaWMgb2YgdHlwZSAyMiwgMjIuMjIsIC0zLjBFLTAwMywgaWdub3JlIHNpbmdsZSBkaWdpdHMKICBpZiAoKih3cmtwdHIrMSkgPT0gJ1wwJykge3JldHVybigwKTsgfSAgICAgIC8vIG5vIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIG9uZSBkaWdpdAogIHdoaWxlIChjID0gKndya3B0cisrKSB7ICAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUgbm90IGVuZCBvZiBzdHJpbmcKICAgIGlmICgoYyA+ICc5JykgfHwgKGMgPCAnMCcpKSB7ICAgICAgICAgICAvLyBpZiBub3QgbnVtZXJpYwogICAgICBpZiAoKGMgPT0gJysnKSB8fCAoYyA9PSAnLScpKSB7ICAgICAvLyBpZiBhIHNpZ24KCWlmICgoKndya3B0ciA8PSAnOScpICYmICgqd3JrcHRyID49ICcwJykpIHsvLyBpZiBmb2xsb3dlZCBieSBudW1iZXIKCSAgaWYgKChuX2NudCA9PSAwKSB8fCAoKih3cmtwdHItMikgPT0gJ0UnKSkgey8vIGlmIHBvc2l0aW9uIE9LCgkgICAgY29udGludWU7CgkgIH0KCX0KICAgICAgfQogICAgICBlbHNlIGlmICgoYyA9PSAnLicpICYmIGRfY250LS0pIHsgICAvLyBpZiBmaXJzdCBkZWNtYWwgcG9pbnQKCWlmICgobl9jbnQgPiAwKSAmJiAoZV9jbnQgPT0gMSkpIHsgLy8gYW5kIG5vdCBzdGFydCBidXQgYmVmb3JlIEUKCSAgaWYgKCp3cmtwdHIgPT0gJ1wwJykgeyBjb250aW51ZTsgfSAvLyBpZiBub3RoaW5nIGZvbGxvd3MKCSAgaWYgKCgqd3JrcHRyIDw9ICc5JykgJiYgKCp3cmtwdHIgPj0gJzAnKSkgey8vIGlmIGZvbGxvd2VkIGJ5IG51bWJlcgoJICAgIGNvbnRpbnVlOwoJICB9Cgl9CiAgICAgIH0KICAgICAgZWxzZSBpZiAoKGMgPT0gJ0UnKSAmJiBlX2NudC0tKSB7ICAgLy8gaWYgZmlyc3QgRQoJaWYgKChuX2NudCA+IDApICYmICgqd3JrcHRyICE9ICdcMCcpKSB7IC8vIGFuZCBub3Qgc3RhcnQgb3IgZW5kIG9mIHN0cmluZwoJICBjb250aW51ZTsKCX0KICAgICAgfQogICAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBiZSBhIG51bWJlcgogICAgfQogICAgZWxzZSB7CiAgICAgIG5fY250Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50IGFzIGRpZ2l0CiAgICB9CiAgfQogIC8vIE9LIHRoaXMgY291bGQgYmUgYSBudW1iZXIKICBpZiAoKG5fY250ID4gMSkgJiYgKG5fY250IDwgMTIpKSB7ICAgICAgICAgIC8vIGlmIGEgZmV3IGRpZ2l0cywgc2luZ2xlIGRpZyBpZ25vcmVkCiAgICByZXR1cm4gKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F5IGl0IGlzIGEgbnVtYmVyCiAgfQogIHJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9vIGxvbmcgdG8gYmUgYSByZWFsIG51bWJlcgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRnVuY3Rpb24gTmFtZTogR2V0RmllbGQKCkFyZ3VtZW50IExpc3Q6CiAgICBjaGFyICpjb2xbaW5dICAgICAgICAgICBwdHIgdG8gc3RhcnQgb2YgY29sIGRhdGEgdG8gc2NhbiwgbmV2ZXIgY2hhbmdlZAogICAgY2hhciAqa2V5W2luXSAgICAgICAgICAgcHRyIHRvIGtleSB3b3JkIGRlc2lyZWQsIGVuZCB3aXRoIGNvbG9uIGFuZCBzcGFjZQogICAgY2hhciomZmllbGRwdHJbb3V0XSAgICAgcmVmZXJlbmNlIHRvIHB0ciB0byB2YWx1ZSBzdHJpbmcgaWYgZm91bmQKICAgIGxvbmcgJmZ1bGxTaXplW291dF0gICAgIGNvdW50IG9mIGNoYXJhY3RlcnMgaW4gdmFsdWUgc3RyaW5nIGZvdW5kLCBlbHNlIDAKClJldHVybiBTdGF0dXM6IAogICAgbG9uZyAgICAgICAgICAgICAgICAgICAgPSAwIG9uIHN1Y2Nlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSBpZiBub3QgZm91bmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTEgaWYgaW5wdXQga2V5IGRvZXMgbm90IGVuZCBpbiAiOiAiCgpEZXNjcmlwdGlvbjoKVGhpcyBmdW5jdGlvbiB3aWxsIHNjYW4gdGhlIHN1cHBsaWVkIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBrZXl3b3JkIGFuZCBpZiBmb3VuZApyZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSB2YWx1ZSBhbmQgaXRzIHNpemUgYW5kIHR5cGUuICBUaGUgcmVzdWx0aW5nCnN0cmluZyB3aWxsIE5PVCBiZSBudWxsIHRlcm1pbmF0ZWQgdW5sZXNzIHRoZSB2YWx1ZSBpcyB0aGUgbGFzdCBpbiB0aGUgaW5wdXQgc3RyaW5nLgpJdCB3aWxsIGNvdW50IGNoYXJhY3RlcnMgaW4gdGhlIHZhbHVlIGFzIGl0IGdvZXMuICBJZiB0aGUga2V5IHZhbHVlIGlzIG5vdCBmb3VuZCBpdAp3aWxsIHJldHVybiBhIDEsIHdoaWNoIGlzIG5vdCBjb25zaWRlcmVkIGFuIGVycm9yLgoKSWYgaXQgZmFpbHMgaW4gYW55IHdheSBpdCB3aWxsIHJldHVybiBhIC0xIGFuZCBsZWF2ZSB0aGUgcG9pbnRlciBzZXQgdG8gd2hlcmUgaXQgYmVnYW4KdGhlIGZpZWxkIHNjYW4gdGhhdCBmYWlsZWQuICBJbiB0aGlzIGNhc2UgdGhlcmUgY291bGQgYmUgYSB2YWx1ZSBwb2ludGVyIHJldHVybmVkCm9yIG5vdCwgYnV0IG5vbmUgb2YgdGhlIHJldHVybiBwYXJhbWV0ZXJzIHNob3VsZCBiZSB1c2VkLiAgVGhlcmUgYXJlIHNldmVyYWwgd2F5cwppdCBjb3VsZCBmYWlsLCBidXQgdGhleSBzaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgdGhlIGlucHV0IGRhdGEgaXMgY29ycnVwdGVkLgoqKioqKi8KTG5nMzIgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5UY2I6OkdldEZpZWxkIChjaGFyICpjb2wsIGNvbnN0IGNoYXIgKmtleSwgY2hhciAqJmZpZWxkcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG5nMzIgJmZ1bGxTaXplKSBjb25zdAp7CiAgLy8gSW5pdGlhbGl6ZSB3b3JraW5nIHZhcmlhYmxlcwogIGNoYXIgKmtleXB0cjsgICAgICAgICAgICAgICAvLyBrZXl3b3JkIHN0YXJ0CiAgY2hhciAqd3JrcHRyOyAgICAgICAgICAgICAgIC8vIHdvcmtpbmcgcHRyCiAgCiAgLy8gVmVyaWZ5IGtleXdvcmQgaXMgYXMgZXhwZWN0ZWQsIHRoaXMgdGVzdCBjb3VsZCBiZSByZW1vdmVkIGV2ZW50dWFsbHkKICBrZXlwdHIgPSBzdHJfc3RyKGtleSwgIjogIik7CiAgaWYgKGtleXB0ciA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3QgZm91bmQKICAgIGZ1bGxTaXplID0gMDsKICAgIHJldHVybiAoLTEpOwogIH0KICAKICAvLyBTY2FuIGZvciB0aGUga2V5d29yZCwgc2hvdWxkIGVuZCB3aXRoICI6ICIsIG9yIHJlcG9ydCBwcm9ibGVtCiAga2V5cHRyID0gc3RyX3N0cihjb2wsIGtleSk7CiAgaWYgKGtleXB0ciA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3QgZm91bmQKICAgIGZ1bGxTaXplID0gMDsKICAgIHJldHVybiAoMSk7CiAgfQogIC8vIFNraXAgb3ZlciBrZXl3b3JkIGFuZCBmaW5kIHN0YXJ0IG9mIHZhbHVlCiAgd3JrcHRyID0gc3RyX3N0cihrZXlwdHIsICI6ICIpICsgMTsgICAgICAgICAvLyBnZXQgZW5kIG9mIGtleXdvcmQKICB3aGlsZSAoKCp3cmtwdHIpID09ICcgJykge3dya3B0cisrOyB9ICAgICAgIC8vIHNjYW4gdGhyb3VnaCBibGFua3MKICAKICAvLyBpc29sYXRlIHRoZSB2YWx1ZQogIGZpZWxkcHRyID0gd3JrcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSB2YWx1ZSBmb3Iga2V5d29yZAogIHdya3B0ciA9IHN0cl9zdHIoZmllbGRwdHIsICI6ICIpOyAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiBmaW5kIG5leHQga2V5d29yZAogIGlmICh3cmtwdHIgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBtdXN0IGJlIGxhc3QgaW4gc3RyaW5nCiAgICBmdWxsU2l6ZSA9IChMbmczMilzdHJfbGVuKGZpZWxkcHRyKTsgICAgIC8vIGp1c3QgdXNlIGFsbCBvZiBpdAogICAgd3JrcHRyID0gZmllbGRwdHIgKyBmdWxsU2l6ZSAtIDE7ICAgICAgIC8vIGxvY2F0ZXMgbGFzdCBjaGFyCiAgICB3aGlsZSAoKih3cmtwdHItLSkgPT0gJyAnKSB7ICAgICAgICAgICAgLy8gYmFja3NjYW4gb3ZlciBibGFua3MKICAgICAgZnVsbFNpemUtLTsKICAgIH0KICAgIHdya3B0ciArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB0byB3aGVyZSB3ZSBzaG91bGQgY3V0CiAgfQogIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW5vdGhlcgogICAgLy8gU2NhbiBiYWNrIHRvIGVuZCBvZiB2YWx1ZSAoZmlyc3Qgbm9uLWJsYW5rIGFmdGVyIGEgYmxhbmspCiAgICB3aGlsZSAoKCp3cmtwdHIpICE9ICcgJykge3dya3B0ci0tO30gICAgLy8gYmFjayB1cCB0byBibGFuawogICAgd2hpbGUgKCgqd3JrcHRyKSA9PSAnICcpIHt3cmtwdHItLTt9ICAgIC8vIGJhY2sgb3ZlciBibGFua3MKICAgIHdya3B0cisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB0byB3aGVyZSBudWxsIHNob3VsZCBiZQogIH0KICBmdWxsU2l6ZSA9IChMbmczMikod3JrcHRyIC0gZmllbGRwdHIpOyAgICAgICAvLyBnZXQgbGVuZ3RoIG9mIHZhbHVlIHN0cmluZwogIHJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHN1Y2Nlc3MKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkZ1bmN0aW9uIE5hbWU6IEZvcm1hdE51bWJlcgoKQXJndW1lbnQgTGlzdDoKICAgIGNoYXIgKm91dFN0cltvdXRdICAgICAgIHN0b3JhZ2UgZm9yIG91dHB1dCwgbXVzdCBiZSBzcGFjZSBmb3IgTVVTRVJTUCBjaGFyCiAgICBsb25nICZpbnRTaXplW291dF0gICAgICByZWZlcmVuY2UgdG8gaW50IHBhcnQgb2Ygb3V0cHV0LCAwPUV4cG9uZW50aWFsIGZtdAogICAgbG9uZyAmZnVsbFNpemVbb3V0XSAgICAgcmVmIHRvIHNpemUgb2Ygd2hvbGUgbnVtYmVyIGZpZWxkCiAgICBjaGFyICpzdHJWYWxbaW5dICAgICAgICBudW1iZXIgaW4gcmF3IEFTQ0lJIGZvcm1hdCB0byBiZSBmb3JtYXR0ZWQKClJldHVybiBTdGF0dXM6IE5vbmUKCkNsYXNzIERhdGEgQWNjZXNzZWQ6CiAgICBvcHRGbGFnXyAgICAgICAgICAgICAgICA9IEVfLCA0IGRlY2ltYWwgZGlnaXRzIGRlc2lyZWQsIGVsc2UgMgoKRGVzY3JpcHRpb246ClRoaXMgZnVuY3Rpb24gd2lsbCBkZXRlcm1pbmUgd2hpY2ggaW5wdXQgZm9ybWF0IGlzIHByZXNlbnQsIDM1LCAzNS4wMDAsIDM1Ljg4OSwKMy41MDAwRSswMDEsIG9yIDMuNTg4OUUrMDAxIGJ5IHNjYW5uaW5nIGZvciB0aGUgZG90IGFuZCB0aGUgRS4gIElmIGl0IGlzIGFscmVhZHkKaW4gZmxvYXRpbmcgcG9pbnQgaXQgd2lsbCBqdXN0IGN1dCB0aGUgZGVjaW1hbCBkaWdpdHMgdG8gMiBvciA0IHBsYWNlcyAod2l0aApyb3VuZGluZykgZGVwZW5kaW5nIG9uIG9wdEZsYWdfIChvciBub25lIGlmIC4wMDAwKS4gIElmIGl0IGlzIGludGVnZXIgaXQgd2lsbCBkbwpub3RoaW5nIGJ1dCBjb3VudCBkaWdpdHMgYW5kIHNldCBpbnRTaXplID0gZnVsbFNpemUuICBPdXRwdXQgd2lsbCBiZSBpbiB0aGUgZm9ybWF0CmdpdmVuIGJ5IEZvcm1hdEZsb2F0LiAgTmVnYXRpdmUgbnVtYmVycyB3b3JrLCBidXQgYXJlIG5vdCBleHBlY3RlZC4KCklmIGl0IGlzIGluIGV4cG9uZW50aWFsIGZvcm1hdCBpdCB3aWxsIGxvb2sgYXQgdGhlIGV4cG9uZW50IGFuZCBkZWNpZGUgaWYgaXQgc2hvdWxkCmJlIGNoYW5nZWQgb3Igbm90LiAgSXQgd2lsbCB3YWxrIHRoZSBzdHJpbmcgbG9va2luZyBmb3IgdGhlIGRlY2ltYWwgcG9pbnQgYW5kIHRoZQpmdWxsIHNpemUuICBJbiBhZGRpdGlvbiB0byBjdXR0aW5nIGF0IDIgb3IgNCBkaWdpdHMgIGl0IHdpbGwgcm91bmQKYXQgdGhlIGN1dC4gIFRoZSBjb2RlIHdpbGwganVzdCBtb3ZlIHRoZSBkZWNpbWFsIHBvaW50IGFzIGluZGljYXRlZCBieSB0aGUgZXhwb25lbnQuCgpUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYXJlZnVsIHRvIHVzZSBvbmx5IHN0cmluZyBmdW5jdGlvbnMgdGhhdCBleGlzdCBpbiB0aGUgZXhlY3V0b3IuCioqKioqLwp2b2lkIEV4RXhlVXRpbERpc3BsYXlFeHBsYWluVGNiOjpGb3JtYXROdW1iZXIgKGNoYXIgKm91dFN0ciwgTG5nMzIgJmludFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMbmczMiAmZnVsbFNpemUsIGNoYXIgKnN0clZhbCljb25zdAp7CiAgY2hhciBjOyAgICAgICAgICAgICAgICAgICAgIC8vIHRlbXAKICBMbmczMiBjbnQgPSAwOyAgICAgICAgICAgICAgIC8vIGNvdW50IG9mIGNoYXJhY3RlcnMgaW4gaW5wdXQKICBMbmczMiBuZWcgPSAwOyAgICAgICAgICAgICAgIC8vIGlucHV0IGlzIG5lZ2F0aXZlIGlmIDEKICBMbmczMiBjbnR6ZXJvOyAgICAgICAgICAgICAgIC8vIGNvdW50IG9mIHRyYWlsaW5nIHplcm9zCiAgTG5nMzIgbWF4SW50RGlnOyAgICAgICAgICAgICAvLyBtYXggaW50IGRpZ2l0cyB3ZSBjYW4gYWRkIGNvbW1hcyBpbnRvCiAgTG5nMzIgZGVjU2l6ZTsgICAgICAgICAgICAgICAvLyBmaW5hbCBkb3QgYW5kIGRpZ2l0IHNpemUgd2hlbiBhIGZsb2F0CiAgTG5nMzIgbWF4U2l6ZTsgICAgICAgICAgICAgICAvLyBwbGFjZSB0byBjdXQgbG9uZyBmbG9hdHMKICBMbmczMiBpbnRleHA7ICAgICAgICAgICAgICAgIC8vIGV4cG9uZW50IHN0cmluZyBjb252ZXJ0ZWQgdG8gaW50CiAgTG5nMzIgZXhwZGlnID0gMDsgICAgICAgICAgICAvLyBsb2Mgb2YgRSBpZiBmb3VuZAogIExuZzMyIGRvdGRpZyA9IDA7ICAgICAgICAgICAgLy8gbG9jIG9mIGRlY2ltYWwgcG9pbnQgaWYgZm91bmQKICBjaGFyICpwdHJpbjEgPSBzdHJWYWw7ICAgICAgLy8gaW5wdXQgcG9pbnRlciwgY2hnIG9ubHkgaWYgbmVnCiAgY2hhciAqcHRyb3V0ID0gb3V0U3RyOyAgICAgIC8vIG91dHB1dCBwb2ludGVyLCBjaGcgb25seSBpZiBuZWcKICBjaGFyICpwdHJ3cmsgPSBzdHJWYWw7ICAgICAgLy8gd29ya2luZyB2YXJpYWJsZXMKICBjaGFyICp0bXBQdHI7ICAgICAgICAgICAgICAgLy8gd29ya2luZyB2YXJpYWJsZQogIExuZzMyIG5lZ0ZsZyA9IDA7ICAgICAgICAgICAgLy8gZXhwb25lbnQgaXMgbm90IG5lZ2F0aXZlCiAgCiAgCiAgLy9TY2FuIHRoZSBpbnB1dCBmb3IgZGVjaW1hbCBwb2ludCBhbmQgRSBhbmQgdG90YWwgbGVuZ3RoLgogIGlmICgqcHRyaW4xID09ICctJykgeyAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaW5wdXQgbmVnYXRpdmUKICAgICpwdHJvdXQrKyA9ICpwdHJpbjErKzsgICAgICAgICAgICAgICAgICAvLyBtb3ZlIC0gdG8gb3V0cHV0IGFuZCBmb3JnZXQKICAgIHB0cndyayA9IHB0cmluMTsKICAgIG5lZyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1lbWJlciBuZWdhdGl2ZSB1c2VkIDEgb3V0cHV0IGRpZ2l0CiAgfQogIC8vIGlnbm9yZSBuZWcgbnVtYmVycyBmcm9tIG5vdyB1bnRpbCBmaW5hbCBleGl0CiAgd2hpbGUgKChjID0gKnB0cndyaysrKSAhPSAnXDAnKSB7ICAgICAgICAgICAvLyBzY2FuIGlucHV0IHdhdGNoaW5nIGZvciBlbmQKICAgIGNudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudCB0aGlzIGNoYXIKICAgIHN3aXRjaCAoYykgewogICAgY2FzZSAnZSc6ICAqKHB0cndyay0xKSA9ICdFJzsgICAgICAgLy8gdXBjYXNlIGl0IGFuZCBubyBicmVhawogICAgY2FzZSAnRSc6ICBleHBkaWcgPSBjbnQ7IGJyZWFrOwogICAgY2FzZSAnLic6ICBkb3RkaWcgPSBjbnQ7IGJyZWFrOwogICAgZGVmYXVsdDogICBicmVhazsKICAgIH0KICB9CiAgLy8gZGVhbCB3aXRoIGEgaW5wdXQgc2l6ZSBwcm9ibGVtIHJpZ2h0IG5vdwogIGlmIChjbnQgPiBNVVNFUlNQLTEtbmVnKSB7ICAgICAgICAgICAgICAgICAgLy8gdHJvdWJsZSBpbiBhIGZldyByYXJlIGNhc2VzCiAgICBjbnQgPSBNVVNFUlNQLTEtbmVnOyAgICAgICAgICAgICAgICAgICAgLy8gY3V0IGF0IHJlcXVpcmVkIG91dHB1dCBsaW1pdAogICAgc3RyX25jcHkocHRyb3V0LCBwdHJpbjEsIGNudCk7ICAgICAgICAgIC8vIG1vdmUgcGFydCB3ZSBjYW4KICAgICoocHRyb3V0K2NudCkgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAvLyBjdXQgaXQKICAgICoocHRyb3V0K2NudC0xKSA9ICcqJzsgICAgICAgICAgICAgICAgICAvLyBzaG93IHdlIGN1dCBpdAogICAgaW50U2l6ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNheSBqdXN0IGEgc3RyaW5nCiAgICBmdWxsU2l6ZSA9IE1VU0VSU1AtMTsKICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JnZXQgcHJvY2Vzc2luZyB0aGlzIG9uZQogIH0KICAKICAvLyBQcm9jZXNzIGlucHV0IHRoYXQgaXMgcHVyZSBpbnRlZ2VyIChjb21tb24pCiAgaWYgKCghIGRvdGRpZykgJiYgKCEgZXhwZGlnKSkgeyAgICAgICAgICAgICAvLyBpZiBwbGFpbiBpbnRlZ2VyLCBsaWtlIDM1CiAgICBzdHJfY3B5X2MocHRyb3V0LCBwdHJpbjEpOyAgICAgICAgICAgICAgLy8gbW92ZSB3aG9sZSBzdHJpbmcKICAgIGludFNpemUgPSBjbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgc2l6ZSBvZiBpbnQKICAgIG1heEludERpZyA9IE1VU0VSU1AgLSAoaW50U2l6ZS0xKS8zIC0gbmVnOyAvLyBjYWxjIG1heCBpbnQgZGlnaXRzIHdlIGNhbiBleHBhbmQKICAgIGlmICgoaW50U2l6ZSA+IDMpICYmIChpbnRTaXplIDwgbWF4SW50RGlnKSkgey8vIGlmIGNvbW1hcyBuZWVkZWQgYW5kIHRoZXJlIGlzIHNwYWNlCiAgICAgIEFkZENvbW1hcyAocHRyb3V0LCBpbnRTaXplKTsgICAgICAgIC8vIGFkZCBjb21tYXMsIGFkanVzdCBjb3VudAogICAgfQogICAgZ290byBET05FOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgZmluaXNoZWQKICB9CiAgCiAgICAvLyBQcm9jZXNzIGlucHV0IHRoYXQgaXMgaW4gZXhwb250aWFsIGZvcm1hdAogICAgLy8gQ29udmVydCBleHAgdG8gcmVhbCBpZiBpbiBsZWdhbCByYW5nZSwgZWxzZSBqdXN0IHJldHVybiB0aGUgaW5wdXQgb3IgbGltaXQgdmFsdWVzLgogIGlmIChleHBkaWcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCBleHAgdG8gZmxvYXQgZm9ybWF0CiAgICAvLyBubyBzc2NhbmYgYXZhaWxhYmxlIGluIGV4ZWN1dG9yLCBzbyBjb252ZXJ0IGFzY2lpIGV4cCB0byBhIGxvbmcgaW5saW5lCiAgICBpbnRleHAgPSAwOwogICAgdG1wUHRyID0gcHRyaW4xK2V4cGRpZzsgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGZpcnN0IGNoYXIgb2YgZXhwCiAgICBpZiAoKnRtcFB0ciA9PSAnLScpIHsgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgbmVnYXRpdmUKICAgICAgbmVnRmxnID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhhdAogICAgICB0bXBQdHIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIG9uCiAgICB9CiAgICBlbHNlIGlmICgqdG1wUHRyID09ICcrJykge3RtcFB0cisrOyB9ICAgLy8gaWYgcGx1cywgbW92ZSBvbgogICAgd2hpbGUgKCp0bXBQdHIgIT0gJ1wwJykgeyAgICAgICAgICAgICAgIC8vIHdoaWxlIHNvbWV0aGluZywgY29udmVydCBpdAogICAgICBpbnRleHAgPSBpbnRleHAqMTAgKyAqdG1wUHRyKysgLSAnMCc7IC8vIGFzc3VtZSAwIHRvIDkgY2hhcgogICAgfQogICAgaWYgKG5lZ0ZsZykge2ludGV4cCA9IC1pbnRleHA7IH0gICAgICAgIC8vIGlmIG5lZ2F0aXZlIGZsaXAgaXQKICAgIC8vIGRlY2lkZSBpZiBpdCBpcyB0b28gbGFyZ2Ugb3Igc21hbGwgZm9yIGZsb2F0CiAgICBpZiAoaW50ZXhwID4gOSkgeyAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdG9vIGxhcmdlIGdpdmUgdXAKICAgICAgc3RyX2NweV9jKHB0cm91dCwgcHRyaW4xKTsgICAgICAgICAgLy8ganVzdCBtb3ZlIGl0IGFsbAogICAgICBpbnRTaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXkgZXhwIHN0aWxsCiAgICAgIGZ1bGxTaXplID0gY250ICsgbmVnOyAgICAgICAgICAgICAgIC8vIHdhdGNoIGZvciBuZWcKICAgICAgcmV0dXJuOwogICAgfQogICAgZWxzZSBpZiAoKG9wdEZsYWdfID09IE5fKSAmJiAoaW50ZXhwIDwgLTIpKSB7Ly8gaWYgdG9vIHNtYWxsIGZvciBub3JtYWwgbW9kZQogICAgICBzdHJfY3B5X2MocHRyb3V0LCAiMC4wMSIpOyAgICAgICAgICAvLyBzZXQgbWluCiAgICAgIGludFNpemUgPSAxICsgbmVnOyAgICAgICAgICAgICAgICAgIC8vIHdhdGNoIGZvciBuZWcKICAgICAgZnVsbFNpemUgPSA0ICsgbmVnOwogICAgICByZXR1cm47CiAgICB9CiAgICBlbHNlIGlmICgob3B0RmxhZ18gPT0gRV8pICYmIChpbnRleHAgPCAtNCkpIHsvLyBpZiB0b28gc21hbGwgZm9yIGV4cGVydCBtb2RlCiAgICAgIHN0cl9jcHlfYyhwdHJvdXQsICIwLjAwMDEiKTsgICAgICAgIC8vIHNldCBtaW4KICAgICAgaW50U2l6ZSA9IDEgKyBuZWc7ICAgICAgICAgICAgICAgICAgLy8gd2F0Y2ggZm9yIG5lZwogICAgICBmdWxsU2l6ZSA9IDYgKyBuZWc7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFdlIHdpbGwgY29udmVydCBleHAgaW5wdXQgbGlrZSAzLjU4ODkwM0UrMDAzIHRvIGZsb2F0IGhlcmUuCiAgICAvLyBSZXN1bHQgbXVzdCBjb250YWluIGEgZGVjaW1hbCBwb2ludCBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgogICAgLy8gSnVzdCBtb3ZlIHRoZSBkZWNpbWFsIHBvaW50IGFyb3VuZCB1c2luZyBpbnRleHAgdG8gdGVsbCB3aGVyZS4KICAgIC8vIFdlIGNhbm5vdCB1c2Ugc3NjYW5mIGFuZCBzdHJfc3ByaW50ZiB3aGljaCBjYW4ndCB0YWtlICIlLjRmIiB5ZXQuCiAgICAvLwogICAgLy8gZmlyc3QgY2FsYyB0aGUgbG9jYXRpb25zIG9mIHN0dWZmIGRlZmluaW5nIHRoZSBvdXRwdXQKICAgIExuZzMyIGJlZ3plcm8gPSAwOwogICAgTG5nMzIgZGVjbG9jID0gMTsKICAgIExuZzMyIGRpZ21vdmUgPSBleHBkaWcgLSAxOyAgICAgICAgICAgICAgLy8gZGlnaXRzIHdlIGhhdmUgdG8gbW92ZQogICAgTG5nMzIgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWdpdHMgbW92ZWQKICAgIExuZzMyIGRlY2RpZyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjaW1hbCBkaWdpdHMgbWF4IGZvciBub3JtYWwgbW9kZQogICAgaWYgKG9wdEZsYWdfID09IEVfKSB7ICAgICAgICAgICAgICAgICAgIC8vIGlmIDQgZGVjaW1hbHMgbmVlZGVkCiAgICAgIGRlY2RpZyA9IDQ7CiAgICB9CiAgICBpZiAoaW50ZXhwID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgPiAxMCAoZXhwID4gMCkKICAgICAgZGVjbG9jICs9IGludGV4cDsKICAgIH0KICAgIGVsc2UgaWYgKGludGV4cCA8IDApIHsgICAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSA8IDEgKGV4cCA8IDApCiAgICAgIGJlZ3plcm8gPSAtaW50ZXhwOyAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyAxIHplcm8KICAgIH0KICAgIC8vIG5vdyBtb3ZlIGRpZ2l0cyBhcyBjb3VudGVycyBpbmRpY2F0ZQogICAgdG1wUHRyID0gcHRyaW4xOwogICAgcHRyd3JrID0gcHRyb3V0OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGZpcnN0IGNoYXIgZm9yIG91dHB1dAogICAgd2hpbGUgKGJlZ3plcm8pIHsgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIGxlYWRpbmcgemVyb3MgaWYgbmVlZGVkCiAgICAgIGlmIChpID09IGRlY2xvYykgeyAgICAgICAgICAgICAgICAgIC8vIGlmIG5lZWQgZGVjaW1hbCBoZXJlIGRvIGl0CglpbnRTaXplID0gaTsgICAgICAgICAgICAgICAgICAgIC8vIHJlbWVtYmVyIGludGVnZXIgc2l6ZQoJKnB0cndyaysrID0gJy4nOwoJaSsrOwoJY29udGludWU7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoaSA+IGRlY2xvYykgewoJZGVjZGlnLS07CiAgICAgIH0KICAgICAgaSsrOwogICAgICAqcHRyd3JrKysgPSAnMCc7CiAgICAgIGJlZ3plcm8tLTsKICAgIH0KICAgIHdoaWxlICgoYyA9ICp0bXBQdHIrKykgIT0gJ0UnKSB7ICAgICAgICAvLyBkbyBkaWdpdHMKICAgICAgaWYgKGMgPT0gJy4nKSB7Y29udGludWU7IH0gICAgICAgICAgLy8ganVzdCBza2lwIHRoZSBvbGQgZGVjaW1hbAogICAgICBpZiAoaSA9PSBkZWNsb2MpIHsgICAgICAgICAgICAgICAgICAvLyBpZiBuZWVkIGRlY2ltYWwgaGVyZSBkbyBpdAoJaW50U2l6ZSA9IGk7ICAgICAgICAgICAgICAgICAgICAvLyByZW1lbWJlciBpbnRlZ2VyIHNpemUKCSpwdHJ3cmsrKyA9ICcuJzsKCWkrKzsKCWRlY2RpZy0tOyAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBhbHNvIGRyb3AgYSBkaWdpdAogICAgICB9CiAgICAgIGVsc2UgaWYgKGkgPiBkZWNsb2MpIHsKCWlmIChkZWNkaWcgPT0gMCkgeyAgICAgICAgICAgICAgLy8gaWYgbm8gbW9yZSBuZWVkZWQKCSAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBpcyBjb21wbGV0ZQoJfQoJZWxzZSBpZiAoZGVjZGlnID09IDEpIHsgICAgICAgICAvLyBuZWVkIHRvIHJvdW5kIHRoaXMgb25lCgkgIGlmICgoYyAhPSAnOScpICYmICgqdG1wUHRyICE9ICdFJykpIHsvLyBpZiByb3VuZGluZyBwb3NzaWJsZQoJICAgIGlmICgqdG1wUHRyID09ICcuJykgeyAgIC8vIGlmIG5leHQgaXMgZG90CgkgICAgICBpZiAoKih0bXBQdHIrMSkgIT0gJ0UnKSB7CgkJaWYgKCoodG1wUHRyKzEpID4gJzQnKSB7YysrOyB9IC8vIHJvdW5kIHVwIHRoaXMgZGlnaXQKCSAgICAgIH0KCSAgICB9CgkgICAgZWxzZSBpZiAoKnRtcFB0ciA+ICc0Jykge2MrKzsgfSAvLyByb3VuZCB1cCB0aGlzIGRpZ2l0CgkgIH0KCX0KCWRlY2RpZy0tOwogICAgICB9CiAgICAgICpwdHJ3cmsrKyA9IGM7CiAgICAgIGkrKzsKICAgIH0KICAgIHdoaWxlIChpIDw9IGRlY2xvYykgeyAgICAgICAgICAgICAgICAgICAvLyBpZiBub3QgdG8gZGVjaW1hbCB5ZXQKICAgICAgaWYgKGkgPT0gZGVjbG9jKSB7ICAgICAgICAgICAgICAgICAgLy8gaWYgbmVlZCBkZWNpbWFsIGhlcmUgZG8gaXQKCWludFNpemUgPSBpOyAgICAgICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgaW50ZWdlciBzaXplCgkqcHRyd3JrKysgPSAnLic7CgkqcHRyd3JrKysgPSAnMCc7CglpICs9IDI7CiAgICAgIH0KICAgICAgZWxzZSB7CgkqcHRyd3JrKysgPSAnMCc7CglpKys7CiAgICAgIH0KICAgIH0KICAgIGZ1bGxTaXplID0gaTsKICAgICpwdHJ3cmsgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hdGUgdGhlIG91dHB1dAogIH0KICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgbW92ZSBmbG9hdCB0byBvdXRwdXQKICAgIHN0cl9jcHlfYyhwdHJvdXQsIHB0cmluMSk7ICAgICAgICAgICAgICAvLyBtb3ZlIHdob2xlIHN0cmluZyB1c3VhbGx5CiAgICBmdWxsU2l6ZSA9IGNudDsKICAgIGludFNpemUgPSBkb3RkaWcgLSAxOwogIH0KICAKICAvLyBGaW5hbGx5IHByb2Nlc3MgaW5wdXQgb3IgZGF0YSB0aGF0IGlzIGluIGZsb2F0aW5nIGZvcm1hdC4gIEl0IG11c3QgaGF2ZSBhCiAgLy8gZGVjaW1hbCBwb2ludCB0byBiZSBoZXJlLiAgQ2xlYW4gb2ZmIHRyYWlsaW5nIHplcm9zLCBsaWtlIDM1LjAwMCBvciAzNS42MDAKICBwdHJ3cmsgPSBwdHJvdXQrZnVsbFNpemUtMTsgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGxhc3QgY2hhciBmb3IgYmFja3NjYW4KICBjbnR6ZXJvID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgY291bnQKICAgIHdoaWxlICgqcHRyd3JrLS0gPT0gJzAnKSB7Y250emVybysrOyB9ICAgICAgLy8gc2VlIGhvdyBtYW55IHRyYWlsaW5nIHplcm9zCiAgICBwdHJ3cmsrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgYXQgbm9uLXplcm8gY2hhcgogICAgaWYgKCpwdHJ3cmsgPT0gJy4nKSB7ICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkb3QsIHRoaXMgaXMgYW4gaW50ZWdlcgogICAgICAqcHRyd3JrID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3V0IG51bWJlciBoZXJlCiAgICAgIGZ1bGxTaXplID0gaW50U2l6ZTsKICAgICAgZGVjU2l6ZSA9IDAgKyBuZWc7ICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGRlY2ltYWwgZGlnaXRzCiAgICB9CiAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWxseSBhIGZsb2F0LCBpZiBuZWVkZWQgInJvdW5kIgogICAgICAvLyBmaXJzdCBkcm9wIHRyYWlsaW5nIHplcm9zIGFmdGVyIHRoZSBkZWNpbWFsCiAgICAgIHB0cndyaysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHJpZ2h0IHRvIHRoZSB6ZXJvCiAgICAgIGlmIChjbnR6ZXJvKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzb21ldGhpbmcgdG8gZHJvcAoJKnB0cndyayA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCB0aGVtCglmdWxsU2l6ZSAtPSBjbnR6ZXJvOyAgICAgICAgICAgICAgICAvLyBzZXQgbmV3IHNpemUKICAgICAgfQogICAgICBpZiAob3B0RmxhZ18gPT0gRV8pIHsgICAgICAgICAgICAgICAgICAgLy8gaWYgNCBkZWNpbWFscyBuZWVkZWQKCW1heFNpemUgPSA1OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGRlY2ltYWwgdG9vCiAgICAgIH0KICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgbm9ybWFsIG1vZGUgYW5kIDIKCW1heFNpemUgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGRlY2ltYWwgdG9vCiAgICAgIH0KICAgICAgZGVjU2l6ZSA9IG1heFNpemUgKyBuZWc7ICAgICAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoaXMgZm9yIGZpbmFsIHNpemUgY2FsYwogICAgICBtYXhTaXplICs9IGludFNpemU7ICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRlc2lyZWQgc2l6ZQogICAgICBpZiAoZnVsbFNpemUgPiBtYXhTaXplKSB7ICAgICAgICAgICAgICAgLy8gaWYgd2Ugc3RpbGwgbmVlZCB0byBjdXQgbW9yZQoJcHRyd3JrID0gcHRyb3V0K21heFNpemU7ICAgICAgICAgICAgLy8gcG9pbnQgdG8gY3V0IGNoYXJhY3RlcgoJYyA9ICpwdHJ3cms7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JhYiBpdAoJKnB0cndyay0tID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgLy8gY3V0IGFuZCBtb3ZlIGJhY2sgZm9yIHJvdW5kaW5nCglmdWxsU2l6ZSA9IG1heFNpemU7CgkvLyB0aGlzIHJvdW5kaW5nIGFsZ29yaXRobSBpcyBjcnVkZSwgYnV0IHRoZSBkYXRhIGlzIHRvbywgc28gaXQgaXMgZ29vZCBlbm91Z2gKCWlmICgoYyA+ICc0JykgJiYgKCpwdHJ3cmsgIT0gJzknKSkgey8vIGFsbG93IG9ubHkgb25lIGRpZ2l0IHJvdW5kaW5nCgkgICpwdHJ3cmsgPSAoKnB0cndyaykgKyAxOyAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0Cgl9CgkvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYWxsIHplcm9zIGFnYWluLCBlZyBpdCB3YXMgbm90IDIuMDAwMDA2CglwdHJ3cmsgPSBwdHJvdXQrZnVsbFNpemUtMTsgICAgICAgICAvLyBwb2ludCB0byBsYXN0IGNoYXIgZm9yIGJhY2tzY2FuCgljbnR6ZXJvID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGNvdW50Cgl3aGlsZSAoKnB0cndyay0tID09ICcwJykge2NudHplcm8rKzsgfSAvLyBzZWUgaG93IG1hbnkgdHJhaWxpbmcgemVyb3MKCXB0cndyaysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgYXQgbm9uLXplcm8gY2hhcgoJaWYgKCpwdHJ3cmsgPT0gJy4nKSB7ICAgICAgICAgICAgICAgLy8gaWYgZG90LCB0aGlzIGlzIGFuIGludGVnZXIgYWdhaW4KCSAgKihwdHJ3cmsrY250emVybykgPSAnMSc7ICAgICAgICAvLyBzaG93IHRoZXJlIHdhcyBzb21ldGhpbmcKCX0KICAgICAgfQogICAgfQogICAgCiAgICAvLyBhZGQgY29tbWFzIHRvIGEgZmxvYXQKICAgIG1heEludERpZyA9IE1VU0VSU1AgLSAoaW50U2l6ZS0xKS8zIC0gZGVjU2l6ZTsgLy8gY2FsYyBtYXggaW50IGRpZ2l0cyB3ZSBjYW4gZXhwYW5kCiAgICBpZiAoKGludFNpemUgPiAzKSAmJiAoaW50U2l6ZSA8IG1heEludERpZykpIHsvLyBpZiB3ZSBuZWVkIGNvbW1hcyBhbmQgdGhlcmUgaXMgc3BhY2UKICAgICAgQWRkQ29tbWFzIChwdHJvdXQsIGludFNpemUpOwogICAgfQogICAgCiAgICAvLyBmaW5pc2ggdXAgYW5kIGV4aXQKRE9ORToKICAgIGludFNpemUgKz0gbmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc2lkZXIgbWludXMgbm93CiAgICBmdWxsU2l6ZSA9IChMbmczMilzdHJfbGVuKG91dFN0cik7CiAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBub3RoaW5nCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGdW5jdGlvbiBOYW1lOiBGb3JtYXRGbG9hdAoKQXJndW1lbnQgTGlzdDoKICAgIGNoYXIgKm91dFN0cltvdXRdICAgICAgIHN0b3JhZ2UgZm9yIG91dHB1dCwgbXVzdCBiZSBzcGFjZSBmb3IgMjAgY2hhcgogICAgbG9uZyAmaW50U2l6ZVtvdXRdICAgICAgcmVmZXJlbmNlIHRvIGludCBwYXJ0IG9mIG91dHB1dCwgMD1FeHBvbmVudGlhbCBmbXQKICAgIGxvbmcgJmZ1bGxTaXplW291dF0gICAgIHJlZiB0byBzaXplIG9mIHdob2xlIG51bWJlciBmaWVsZAogICAgZmxvYXQgIGZsb2F0VmFsW2luXSAgICAgbnVtYmVyIHRvIGJlIGZvcm1hdHRlZAoKUmV0dXJuIFN0YXR1czogTm9uZQoKQ2xhc3MgRGF0YSBBY2Nlc3NlZDoKICAgIG9wdEZsYWdfICAgICAgICAgICAgICAgID0gRV8sIDQgZGVjaW1hbCBkaWdpdHMgZGVzaXJlZCwgZWxzZSAyCgpEZXNjcmlwdGlvbjoKVGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgdGhlIGlucHV0IGZsb2F0ICg0IGJ5dGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyKSB0byBhbgpBU0NJSSBzdHJpbmcgaW4gdGhlIHVzZXKScyBvdXRwdXQgYnVmZmVyLiAgSXQgd2lsbCB3YWxrIHRoZSBzdHJpbmcgbG9va2luZyBmb3IKdGhlIGRlY2ltYWwgcG9pbnQgYW5kIHRoZSBmdWxsIHNpemUuICBOdW1iZXJzID49IDIuMEUrOSBhcmUgcHV0IGluIGV4cG9uZW50Cm5vdGF0aW9uIGFuZCBpbnRTaXplIGlzIDAuICBOdW1iZXJzIDwgMC4wMDAxIGFyZSBkaXNwbGF5ZWQgYXMgMC4wMDAxIGFsd2F5cwoob3IgaWYgPCAwLjAxIGFzIDAuMDEgd2hlbiBvcHRGbGFnXyA9PSBOXykuICBaZXJvIGlzIG91dHB1dCBhcyAwIChub3QgMC4wKSwgCndpdGggaW50U2l6ZT0wLiBPdGhlciBudW1iZXJzIGFyZSBkaXNwbGF5ZWQgYXMgZmxvYXRzIHdpdGggMiBvciA0IGRpZ2l0cyBvZgphY2N1cmFjeSBkZXBlbmRpbmcgb24gb3B0RmxhZ18uICBUcmFpbGluZyB6ZXJvcyBhcmUgcmVtb3ZlZCBhZnRlciB0aGUgZGVjaW1hbApwb2ludC4gIE5lZ2F0aXZlIG51bWJlcnMgd29yaywgYnV0IGFyZSBub3QgZXhwZWN0ZWQuCgpUaGlzIHJvdXRpbmUgbXVzdCBhdm9pZCBmb3JtYXRzICVFIGFuZCAlLjRmIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBleGVjdXRvci4KVGhlIGZvcm1hdCAlMDRkIHRlbGxzIGl0IHRvIHplcm8gcGFkIHdpdGggZXhhY3RseSA0IGRpZ2l0cy4KKioqKiovCnZvaWQgRXhFeGVVdGlsVGNiOjpGb3JtYXRGbG9hdCAoY2hhciAqb3V0U3RyLCBMbmczMiAmaW50U2l6ZSwKCQkJIExuZzMyICZmdWxsU2l6ZSwgZG91YmxlIGZsb2F0VmFsLAoJCQkJTkFCb29sZWFuIG5vcm1hbE1vZGUsIE5BQm9vbGVhbiBleHBlcnRNb2RlKSBjb25zdAp7CiAgTG5nMzIgbmVnID0gMDsgICAgICAgICAgICAgICAvLyBpbnB1dCBpcyBuZWdhdGl2ZSBpZiAxCiAgZG91YmxlIGFic3ZhbCA9IGZsb2F0VmFsOyAgICAvLyBhYnNvbHV0ZSB2YWx1ZSBvZiBpbnB1dAogIExuZzMyIGNudHplcm87ICAgICAgICAgICAgICAgLy8gY291bnQgb2YgdHJhaWxpbmcgemVyb3MKICBjaGFyICpwdHI7ICAgICAgICAgICAgICAgICAgLy8gd29ya2luZyB2YXJpYWJsZSBmb3IgbmVnIHVzZQogIExuZzMyIHZhbEludCA9IDA7ICAgICAgICAgICAgLy8gaW50ZWdlciBwYXJ0IG9mIGZsb2F0IHZhbHVlCiAgTG5nMzIgdmFsRGVjID0gMDsgICAgICAgICAgICAvLyBkZWNpbWFsIHBhcnQgb2YgZmxvYXQgdmFsdWUKICBMbmczMiB2YWxFeHAgPSAwOyAgICAgICAgICAgIC8vIGV4cG9udGlhbCBwYXJ0IG9mIGZsb2F0IHZhbHVlCiAgZmxvYXQgbmJyRGVjOyAgICAgICAgICAgICAgIC8vIDEwKihudW1iZXJfb2ZfZGVjaW1hbF9kaWdpdHMpCiAgZmxvYXQgdmFsUm5kOyAgICAgICAgICAgICAgIC8vIHZhbHVlIHRvIGFkZCBmb3Igcm91bmRpbmcKICBjb25zdCBjaGFyICpmbXRQdHI7ICAgICAgICAgLy8gcG9pbnRzIHRvIGNvcnJlY3QgZm9ybWF0IHN0cmluZwogIAogIC8vIGhhbmRsZSBzb21lIHNwZWNpYWwgY2FzZXMKICBwdHIgPSBvdXRTdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIG91dHB1dCBhcmVhCiAgaW50U2l6ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgYmFzZSB2YWx1ZQogIGlmIChmbG9hdFZhbCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbmVnYXRpdmUKICAgIGFic3ZhbCA9IC1mbG9hdFZhbDsgICAgICAgICAgICAgICAgICAgICAvLyBmbGlwIGl0IGZvciBwcm9jZXNzaW5nCiAgICBuZWcgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhpcwogICAgKnB0cisrID0gJy0nOwogICAgaW50U2l6ZSsrOwogIH0KICBlbHNlIGlmIChmbG9hdFZhbCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgIC8vIGlmIHJlYWwgemVybwogICAgc3RyX2NweV9jKHB0ciwgIjAiKTsgICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgZGVjaW1hbAogICAgZnVsbFNpemUgPSAxOwogICAgcmV0dXJuOwogIH0KICAvLyBzZWUgaWYgdGhpcyBpcyB0b28gbGFyZ2UgZm9yIGRlY2ltYWwgZm9ybWF0LCAxLDk5OSw5OTksOTk5IGlzIE9LCiAgaWYgKGFic3ZhbCA+PSAyLjBFOUYpIHsgICAgICAgICAgICAgICAgICAgICAvLyBpZiBleHBvbmVudGlhbCBub3RhdGlvbiByZXF1aXJlZAogICAgd2hpbGUgKGFic3ZhbCA+PSAxMCkgeyAgICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgdGhlIGV4cG9uZW50IHZhbHVlCiAgICAgIHZhbEV4cCsrOwogICAgICBhYnN2YWwgLz0gMTA7CiAgICB9CiAgICBuYnJEZWMgPSAxMDAwMDAwLjBGOyAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSA2IGRpZ2l0cwogICAgdmFsUm5kID0gMC4wMDAwMDA1RjsKICAgIGFic3ZhbCArPSB2YWxSbmQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCByb3VuZCB1cCBpZiBuZWVkZWQKICAgIHZhbEludCA9IChMbmczMilhYnN2YWw7ICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBpbnRlZ2VyIHBhcnQKICAgIGFic3ZhbCAtPSB2YWxJbnQ7CiAgICB2YWxEZWMgPSAoTG5nMzIpKGFic3ZhbCpuYnJEZWMpOyAgICAgICAgIC8vIGdldCB0aGUgZGVjaW1hbCBwYXJ0IGFzIGxvbmcKICAgIHN0cl9zcHJpbnRmIChwdHIsICIlZC4lMDZkRSslMDNkIiwgdmFsSW50LCB2YWxEZWMsIHZhbEV4cCk7CiAgICBpbnRTaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UsIGV2ZW4gaWYgbmVnCiAgICBnb3RvIERPTkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGZ1bGxTaXplIGFuZCByZXR1cm4KICB9CgogIC8vIGlmIHRvbyBzbWFsbCwgdXNlIGJvdHRvbSB2YWx1ZQogIGlmICgoYWJzdmFsIDwgMS4wRS0yKSAmJiAobm9ybWFsTW9kZSkpIHsvLyBpZiB0b28gc21hbGwgZm9yIG5vcm1hbCBtb2RlCiAgICBzdHJfY3B5X2MocHRyLCAiMC4wMSIpOwogICAgaW50U2l6ZSsrOwogICAgZ290byBET05FOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBmdWxsU2l6ZSBhbmQgcmV0dXJuCiAgfQogIGlmICgoYWJzdmFsIDwgMS4wRS00KSAmJiAoZXhwZXJ0TW9kZSkpIHsvLyBpZiB0b28gc21hbGwgZm9yIGV4cGVydCBtb2RlCiAgICBzdHJfY3B5X2MocHRyLCAiMC4wMDAxIik7CiAgICBpbnRTaXplKys7CiAgICBnb3RvIERPTkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGZ1bGxTaXplIGFuZCByZXR1cm4KICB9CiAgLy8gbm93IGl0IG11c3QgYmUgYSB2YWxpZCBkZWNpbWFsIG51bWJlcgogIGlmIChleHBlcnRNb2RlKSB7ICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiA0IGRlY2ltYWxzIG5lZWRlZAogICAgbmJyRGVjID0gMTAwMDAuMEY7ICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgNCBkaWdpdHMKICAgIHZhbFJuZCA9IDAuMDAwMDVGOwogICAgZm10UHRyID0gIiVkLiUwNGQiOyAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgNCBkZWNpbWFsIGRpZ2l0cywgemVybyBwYWRkZWQKICAgIGNudHplcm8gPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgY291bnQgb2YgZGlnaXRzCiAgfQogIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBub3JtYWwgbW9kZSBhbmQgMgogICAgbmJyRGVjID0gMTAwLjBGOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgMiBkaWdpdHMKICAgIHZhbFJuZCA9IDAuMDA1RjsKICAgIGZtdFB0ciA9ICIlZC4lMDJkIjsgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IDIgZGVjaW1hbCBkaWdpdHMsIHplcm8gcGFkZGVkCiAgICBjbnR6ZXJvID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGNvdW50IG9mIGRpZ2l0cwogIH0KICBhYnN2YWwgKz0gdmFsUm5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHJvdW5kIHVwIGlmIG5lZWRlZAogIHZhbEludCA9IChMbmczMilhYnN2YWw7ICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgaW50ZWdlciBwYXJ0CiAgYWJzdmFsIC09IHZhbEludDsKICB2YWxEZWMgPSAoTG5nMzIpKGFic3ZhbCpuYnJEZWMpOyAgICAgICAgICAgICAvLyBnZXQgdGhlIGRlY2ltYWwgcGFydCBhcyBsb25nCiAgc3RyX3NwcmludGYgKHB0ciwgZm10UHRyLCB2YWxJbnQsIHZhbERlYyk7CiAgLy8gZ290IHRoZSBudW1iZXIgbm93LCBzZWUgd2hhdCBzaXplIHRoZSBwYXJ0cyBhcmUKICB3aGlsZSAoKnB0cisrICE9ICcuJykge2ludFNpemUrKzsgfSAgICAgICAgIC8vIHNlZSBob3cgbG9uZy5pbnQgcGFydCBpcyAoYWx3YXlzIGEgZG90KQogIAogIC8vIGNsZWFuIG9mZiB0cmFpbGluZyB6ZXJvcywgbGlrZSAzNS4wMDAwIG9yIDM1LjYwCiAgcHRyICs9IGNudHplcm8tMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB0byBsYXN0IGNoYXIgZm9yIGJhY2tzY2FuCiAgY250emVybyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGNvdW50IGZvciByZWFsCiAgd2hpbGUgKCpwdHItLSA9PSAnMCcpIHtjbnR6ZXJvKys7IH0gICAgICAgICAvLyBzZWUgaG93IG1hbnkgdHJhaWxpbmcgemVyb3MKICBwdHIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgYXQgbm9uLXplcm8gY2hhcgogIGlmIChjbnR6ZXJvKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc29tZXRoaW5nIHRvIGRyb3AKICAgIGlmICgqcHRyID09ICcuJykgeyAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkb3QsIHRoaXMgaXMgYW4gaW50ZWdlcgogICAgICAqcHRyID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXQgbnVtYmVyIGhlcmUKICAgIH0KICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHJlbW92ZSB0cmFpbGluZyB6ZXJvcwogICAgICBwdHIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHJpZ2h0IHRvIHRoZSB6ZXJvCiAgICAgICpwdHIgPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgdGhlbQogICAgfQogIH0KICAKICAvLyBhZGQgY29tbWFzIGlmIG5lZWRlZAogIGlmICgoaW50U2l6ZSA+IDMpICYmIChpbnRTaXplIDwgMTYpKSB7ICAgICAgLy8gaWYgd2UgbmVlZCBjb21tYXMgYW5kIHRoZXJlIGlzIHNwYWNlCiAgICBpZiAobmVnKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbWludXMgaW4gZnJvbnQKICAgICAgaW50U2l6ZS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bnQgb25seSBkaWdpdHMKICAgICAgQWRkQ29tbWFzKG91dFN0cisxLCBpbnRTaXplKTsKICAgICAgaW50U2l6ZSsrOwogICAgfQogICAgZWxzZSB7CiAgICAgIEFkZENvbW1hcyhvdXRTdHIsIGludFNpemUpOwogICAgfQogIH0KICAKICAvLyBGaW5pc2ggdXAgYW5kIGV4aXQKRE9ORToKICBmdWxsU2l6ZSA9IChMbmczMilzdHJfbGVuKG91dFN0cik7CiAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gbm90aGluZwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRnVuY3Rpb24gTmFtZTogQWRkQ29tbWFzCgpBcmd1bWVudCBMaXN0OgogICAgY2hhciAqb3V0U3RyW2luL291dF0gICAgbnVtYmVyIHN0cmluZyB0byBiZSBtb2RpZmllZCwgbGVmdCBqdXN0aWZpZWQKICAgIGxvbmcgJmludFNpemVbaW4vb3V0XSAgIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBpbiB0aGUgbnVtYmVyIGlucHV0LCBzaXplIG91dAoKUmV0dXJuIFN0YXR1czogTm9uZQoKRGVzY3JpcHRpb246ClRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSBpbnB1dCBBU0NJSSBudW1iZXIgc3RyaW5nIGFuZCBhZGQgY29tbWFzIGV2ZXJ5IDMgZGlnaXRzLgpJdCBleHBlY3RzIHRoZSBjaGFyYWN0ZXIgYXJyYXkgaW5wdXQgdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGFkZGl0aW9uYWwKY2hhcmFjdGVycy4gIEl0IHdpbGwgaW5jcmVtZW50IHRoZSBjb3VudCBvZiBjaGFyYWN0ZXJzIGluIHRoZSBpbnRlZ2VyIHBhcnQgb2YgdGhlCmlucHV0IG51bWJlci4gIEl0IHVzZXMgb25seSB0aGUgaW5wdXQgY291bnQgb2YgaW50ZWdlciBkaWdpdHMgYW5kIHZhbGlkYXRlcyBub3RoaW5nLgpJdCBwcm9jZXNzZXMgdGhlIGRpZ2l0cyBmcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHN0b3BzIGFmdGVyIGRvaW5nIHRoZSBsYXN0IDMgaW50ZWdlcgpkaWdpdHMgd2l0aG91dCBsb29raW5nIGF0IHRoZSByZXN0IG9mIHRoZSBkaWdpdHMuICBTbyBpdCBkb2VzIG5vdCBjYXJlIGFib3V0IGFueQpmcmFjdGlvbmFsIHBhcnQgKGV4Y2VwdCB0aGF0IGl0IGlzIG51bGwgdGVybWluYXRlZCkuICBFeGFtcGxlIGlucHV0IGlzIDEyMzQ1NjcuODkKYW5kIG91dHB1dCB3aWxsIGJlIDEsMjM0LDU2Ny44OS4gIFRoaXMgcm91dGluZSB3aWxsIG5vdCB3b3JrIHByb3Blcmx5IG9uIG5lZ2F0aXZlCm51bWJlcnMsIHNvIGRvbid0IGNhbGwgaXQuCioqKioqLwp2b2lkIEV4RXhlVXRpbFRjYjo6QWRkQ29tbWFzIChjaGFyICpvdXRTdHIsIExuZzMyICZpbnRTaXplKWNvbnN0CnsKICAgIEludDMyIGxvYzsgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIHBvc2l0aW9uIHRvIGN1dCBiZWZvcmUsIDAgYmFzZQogICAgSW50MzIgaXRlcjsgICAgICAgICAgICAgICAvLyBpdGVyYXRpb25zIG5lZWRlZAogICAgY2hhciB0ZW1wWzQwXTsgICAgICAgICAgLy8gc2F2ZSBjdXQgZGF0YSBoZXJlCgogICAgLy8gQmVnaW4gcHJvY2Vzc2luZwogICAgaWYgKGludFNpemUgPD0gMykge3JldHVybjt9ICAgICAgICAgICAgICAgICAvLyBpZiBkaWdpdCBjb3VudCBpcyAzIG9yIGxlc3MsIGp1c3QgcmV0dXJuCgogICAgLy8gZmlndXJlIG91dCBob3cgbWFueSBpdGVyYXRpb25zIGFyZSBuZWVkZWQKICAgIGxvYyA9IGludFNpemUgJSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9kdWxvIDMgdG8gc2VlIGFib3V0IGxlYWRpbmcgZGlnaXRzCiAgICBpdGVyID0gaW50U2l6ZS8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJvdW5kaW5nCiAgICBpZiAobG9jID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGV4YWN0IG11bHRpcGxlIG9mIDMKICAgICAgICBsb2MgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgaXMgbm90IDAKICAgICAgICBpdGVyLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lIGxlc3MgdG8gZG8KICAgIH0KCiAgICAvLyBwdXQgb25lIGNvbW1hIGluIG9uIGVhY2ggbG9vcAogICAgd2hpbGUgKGl0ZXItLSA+IDApIHsKICAgICAgICBzdHJfY3B5X2ModGVtcCwgb3V0U3RyK2xvYyk7ICAgICAgICAgICAgLy8gc2F2ZSB0YWlsIG9mIHN0cmluZwogICAgICAgICoob3V0U3RyK2xvYykgPSAnLCc7ICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgdGhlIGNvbW1hCiAgICAgICAgbG9jKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1bXAgd29ya2luZyBjb3VudAogICAgICAgIGludFNpemUrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgcmVhbCBpbnRlZ2VyIHNpemUKICAgICAgICBzdHJfY3B5X2Mob3V0U3RyK2xvYywgdGVtcCk7ICAgICAgICAgICAgLy8gYnJpbmcgcmVzdCBiYWNrCiAgICAgICAgbG9jICs9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIG5leHQgY3V0CiAgICB9CgogICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gbm90aGluZwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBDb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBmb3IgRXhlVXRpbF9wcml2YXRlX3N0YXRlCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkV4RXhlVXRpbERpc3BsYXlFeHBsYWluUHJpdmF0ZVN0YXRlOjpFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblByaXZhdGVTdGF0ZSgpCnsKICBzdGVwXyA9IEV4RXhlVXRpbERpc3BsYXlFeHBsYWluVGNiOjpFTVBUWV87CiAgbWF0Y2hlc18gPSAwOwp9CgpFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblByaXZhdGVTdGF0ZTo6fkV4RXhlVXRpbERpc3BsYXlFeHBsYWluUHJpdmF0ZVN0YXRlKCkKewp9OwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpleF90Y2IgKiBFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpbkNvbXBsZXhUZGI6OmJ1aWxkKGV4X2dsb2JhbHMgKiBnbG9iKQp7CiAgRXhFeGVVdGlsVGNiICogZXhlX3V0aWxfdGNiOwoKICBpZiAoaXNTaG93ZGRsKCkpCiAgICBleGVfdXRpbF90Y2IgPSBuZXcoZ2xvYi0+Z2V0U3BhY2UoKSkgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5TaG93ZGRsVGNiKCp0aGlzLCBnbG9iKTsKICBlbHNlCiAgICBleGVfdXRpbF90Y2IgPSBuZXcoZ2xvYi0+Z2V0U3BhY2UoKSkgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5Db21wbGV4VGNiKCp0aGlzLCBnbG9iKTsKCiAgZXhlX3V0aWxfdGNiLT5yZWdpc3RlclN1YnRhc2tzKCk7CgogIHJldHVybiAoZXhlX3V0aWxfdGNiKTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBDb25zdHJ1Y3RvciBmb3IgY2xhc3MgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5UY2IKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkV4RXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleFRjYjo6RXhFeGVVdGlsRGlzcGxheUV4cGxhaW5Db21wbGV4VGNiKAogICAgIGNvbnN0IENvbVRkYkV4ZVV0aWxEaXNwbGF5RXhwbGFpbkNvbXBsZXggJiBleGVfdXRpbF90ZGIsCiAgICAgZXhfZ2xvYmFscyAqIGdsb2IpCiAgICAgOiBFeEV4ZVV0aWxUY2IoIGV4ZV91dGlsX3RkYiwgTlVMTCwgZ2xvYiksCiAgICAgICBzdGVwXyhFTVBUWV8pCnsKICAvLyBBbGxvY2F0ZSB0aGUgcHJpdmF0ZSBzdGF0ZSBpbiBlYWNoIGVudHJ5IG9mIHRoZSBkb3duIHF1ZXVlCiAgcXBhcmVudF8uZG93bi0+YWxsb2NhdGVQc3RhdGUodGhpcyk7Cn0KCkV4RXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleFRjYjo6fkV4RXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleFRjYigpCnsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFJlZGVmaW5lIHZpcnR1YWwgbWV0aG9kIGFsbG9jYXRlUHN0YXRlcywgdG8gYmUgdXNlZCBieSBkeW5hbWljIHF1ZXVlCi8vIHJlc2l6aW5nLCBhcyB3ZWxsIGFzIHRoZSBpbml0aWFsIHF1ZXVlIGNvbnN0cnVjdGlvbi4KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmV4X3RjYl9wcml2YXRlX3N0YXRlICogRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5Db21wbGV4VGNiOjphbGxvY2F0ZVBzdGF0ZXMoCiAgICAgTG5nMzIgJm51bUVsZW1zLCAgICAgIC8vIGlub3V0LCBkZXNpcmVkL2FjdHVhbCBlbGVtZW50cwogICAgIExuZzMyICZwc3RhdGVMZW5ndGgpICAvLyBvdXQsIGxlbmd0aCBvZiBvbmUgZWxlbWVudAp7CiAgUHN0YXRlQWxsb2NhdG9yPEV4RXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleFByaXZhdGVTdGF0ZT4gcGE7CgogIHJldHVybiBwYS5hbGxvY2F0ZVBzdGF0ZXModGhpcywgbnVtRWxlbXMsIHBzdGF0ZUxlbmd0aCk7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyB3b3JrKCkgZm9yIEV4RXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleFRjYgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8Kc2hvcnQgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5Db21wbGV4VGNiOjp3b3JrKCkKewogIExuZzMyIGNsaVJDOwogIHNob3J0IHJjOwoKICAvLyBpZiBubyBwYXJlbnQgcmVxdWVzdCwgcmV0dXJuCiAgaWYgKHFwYXJlbnRfLmRvd24tPmlzRW1wdHkoKSkKICAgIHJldHVybiBXT1JLX09LOwoKICAvLyBpZiBubyByb29tIGluIHVwIHF1ZXVlLCB3b24ndCBiZSBhYmxlIHRvIHJldHVybiBkYXRhL3N0YXR1cy4KICAvLyBDb21lIGJhY2sgbGF0ZXIuCiAgaWYgKHFwYXJlbnRfLnVwLT5pc0Z1bGwoKSkKICAgIHJldHVybiBXT1JLX09LOwoKICBleF9xdWV1ZV9lbnRyeSAqIHBlbnRyeV9kb3duID0gcXBhcmVudF8uZG93bi0+Z2V0SGVhZEVudHJ5KCk7CiAgRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5Db21wbGV4UHJpdmF0ZVN0YXRlICYgcHN0YXRlID0KICAgICooKEV4RXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleFByaXZhdGVTdGF0ZSopIHBlbnRyeV9kb3duLT5wc3RhdGUpOwoKICAvLyBHZXQgdGhlIGdsb2JhbHMgc3R1Y3R1cmUgb2YgdGhlIG1hc3RlciBleGVjdXRvci4KICBFeEV4ZVN0bXRHbG9iYWxzICpleGVHbG9iID0gZ2V0R2xvYmFscygpLT5jYXN0VG9FeEV4ZVN0bXRHbG9iYWxzKCk7CiAgRXhNYXN0ZXJTdG10R2xvYmFscyAqbWFzdGVyR2xvYiA9IGV4ZUdsb2ItPmNhc3RUb0V4TWFzdGVyU3RtdEdsb2JhbHMoKTsKCiAgd2hpbGUgKDEpIC8vIGV4aXQgdmlhIHJldHVybgogICAgewogICAgICBzd2l0Y2ggKHN0ZXBfKQoJewoJY2FzZSBFTVBUWV86CgkgIHsKCSAgICBzdGVwXyA9IElOX01FTU9SWV9DUkVBVEVfOwoJICB9CglicmVhazsKCgljYXNlIElOX01FTU9SWV9DUkVBVEVfOgoJICB7CgkgICAgLy8gaXNzdWUgdGhlIGNyZWF0ZSB0YWJsZS9pbmRleCBjb21tYW5kIAoJICAgIG1hc3Rlckdsb2ItPmdldFN0YXRlbWVudCgpLT5nZXRDb250ZXh0KCktPgoJICAgICAgc2V0U3FsUGFyc2VyRmxhZ3MoMHgyMDAwMCk7IC8vIElOVEVSTkFMX1FVRVJZX0ZST00gRVhFVVRJTAoJICAgIGNsaVJDID0gY2xpSW50ZXJmYWNlKCktPmV4ZWN1dGVJbW1lZGlhdGUoZXhlVXRpbFRkYigpLnFyeTFfKTsKCSAgICBtYXN0ZXJHbG9iLT5nZXRTdGF0ZW1lbnQoKS0+Z2V0Q29udGV4dCgpLT4KCSAgICAgIHJlc2V0U3FsUGFyc2VyRmxhZ3MoMHgyMDAwMCk7IC8vIElOVEVSTkFMX1FVRVJZX0ZST00gRVhFVVRJTAoJICAgIGlmIChjbGlSQyA8IDApCgkgICAgICB7CgkJLy8gdGFibGUgY291bGQgbm90IGJlIGNyZWF0ZWQuCgkJLy8gSWYgdGhpcyBpcyBhbiBlcnJvciByZWxhdGVkIHRvIGluTWVtb3J5IGNyZWF0aW9uLAoJCS8vIGlnbm9yZSBpdCBhbmQgY29udGludWUgd2l0aCBleHBsYWluLgoJCS8vIEV4cGxhaW4gd2lsbCByZXR1cm4gJ2luZm8gbm90IGF2YWlsYWJsZScgaW4gaXRzCgkJLy8gZGVzY3JpcHRpb24gZmllbGQuCgkJLy8gQWxsIG90aGVyIGVycm9ycyBhcmUgcmVwb3J0ZWQuCiAgICAgICAgICAgICAgICBjbGlJbnRlcmZhY2UoKS0+YWxsb2NBbmRSZXRyaWV2ZVNRTERpYWdub3N0aWNzKGRpYWdzQXJlYV8pOwoJCWlmIChleGVVdGlsVGRiKCkubG9hZElmRXhpc3RzKCkgJiYKCQkgICAgIGdldERpYWdzQXJlYSgpLT5jb250YWlucygtMTA1NSkpCgkJICB7CgkJICAgIFNRTF9FWEVDX0NsZWFyRGlhZ25vc3RpY3MoTlVMTCk7CgkJICB9CgkJZWxzZQoJCSAgewoKCQkgICAgLy8gUmV0dXJuIGVycm9yLgoJCSAgICAvLyBEbyBub3QgZG8gJ0RST1BfQU5EX0VSUk9SJyBhcyB3ZSBkb24ndCB3YW50IHRvIGRyb3AKCQkgICAgLy8gYW4gZXhpc3RpbmcgdGFibGUuCgkJICAgIEV4UmFpc2VTcWxFcnJvcihnZXRIZWFwKCksICZkaWFnc0FyZWFfLAoJCQkJICAgIEVYRV9OT19FWFBMQUlOX0lORk8sIE5VTEwpOwoKCQkgICAgc3RlcF8gPSBFUlJPUl87CgkJICAgIGJyZWFrOwoJCSAgfQoJICAgICAgfQoKCSAgICAvLyBleHBsYWluIHRoZSBjcmVhdGUKCSAgICBzdGVwXyA9IEVYUExBSU5fQ1JFQVRFXzsKCSAgfQoJYnJlYWs7CgoJY2FzZSBFWFBMQUlOX0NSRUFURV86CgkgIHsKCSAgICBjbGlSQyA9IGV4ZWN1dGVRdWVyeShOVUxMLCBOVUxMLCAKCQkJCSBleGVVdGlsVGRiKCkucXJ5Ml8sCgkJCQkgRkFMU0UsIEZBTFNFLAoJCQkJIHJjLAoJCQkJIE5VTEwsIE5VTEwsIEZBTFNFKTsKCgkgICAgaWYgKGNsaVJDIDwgMCkKCSAgICAgIHsKCQlzdGVwXyA9IERST1BfQU5EX0VSUk9SXzsKCQlicmVhazsKCSAgICAgIH0KCSAgICAKCSAgICBpZiAoY2xpUkMgPT0gMSkKCSAgICAgIHJldHVybiByYzsKCgkgICAgaWYgKGV4ZVV0aWxUZGIoKS5leHBsYWluVHlwZV8gPT0gCgkJQ29tVGRiRXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleDo6Q1JFQVRFX1RBQkxFX0FTKQoJICAgICAgewoJCS8vIGV4cGxhaW4gaW5zZXJ0Li4uc2VsZWN0IGZvciBDVEFTCgoJCWlmIChleGVVdGlsVGRiKCkucXJ5NF8pIAoJCSAgewoJCSAgICAvLyBzaWRldHJlZSBpbnNlcnQuIE1ha2UgdGhlIHRhYmxlIHVuYXVkaXRlZC4KCQkgICAgc3RlcF8gPSBBTFRFUl9UT19OT0FVRElUXzsKCQkgIH0KCQllbHNlCgkJICB7CgkJICAgIHN0ZXBfID0gRVhQTEFJTl9JTlNFUlRfU0VMRUNUXzsKCQkgIH0KCQlicmVhazsKCSAgICAgIH0KCgkgICAgc3RlcF8gPSBEUk9QX0FORF9ET05FXzsKCSAgfQoJYnJlYWs7CgkgIAoJY2FzZSBBTFRFUl9UT19OT0FVRElUXzoKCSAgewoJICAgIGNsaVJDID0gY2hhbmdlQXVkaXRBdHRyaWJ1dGUoZXhlVXRpbFRkYigpLmdldE9iamVjdE5hbWUoKSwKCQkJCQkgRkFMU0UsIGV4ZVV0aWxUZGIoKS5pc1ZvbGF0aWxlKCkpOwoJICAgIGlmIChjbGlSQyA8IDApCgkgICAgICB7CiAgICAgICAgICAgICAgICBjbGlJbnRlcmZhY2UoKS0+YWxsb2NBbmRSZXRyaWV2ZVNRTERpYWdub3N0aWNzKGRpYWdzQXJlYV8pOwoJCXN0ZXBfID0gRFJPUF9BTkRfRVJST1JfOwoJCWJyZWFrOwoJICAgICAgfQoKCSAgICBzdGVwXyA9IEVYUExBSU5fSU5TRVJUX1NFTEVDVF87CgkgIH0KCWJyZWFrOwoKCWNhc2UgRVhQTEFJTl9JTlNFUlRfU0VMRUNUXzoKCSAgewoJICAgIC8vIHFyeTRfIGlzIHNpZGV0cmVlIGluc2VydCwgcXJ5M18gaXMgdnNiYiBpbnNlcnQuCgkgICAgY2xpUkMgPSBleGVjdXRlUXVlcnkoTlVMTCwgTlVMTCwgCgkJCQkgKGV4ZVV0aWxUZGIoKS5xcnk0XyA/IGV4ZVV0aWxUZGIoKS5xcnk0XwoJCQkJICA6IGV4ZVV0aWxUZGIoKS5xcnkzXyksCgkJCQkgRkFMU0UsIEZBTFNFLAoJCQkJIHJjLAoJCQkJIE5VTEwsIE5VTEwsIEZBTFNFKTsKCSAgICBpZiAoY2xpUkMgPCAwKQoJICAgICAgewoJCXN0ZXBfID0gRFJPUF9BTkRfRVJST1JfOwoJCWJyZWFrOwoJICAgICAgfQoJICAgIAoJICAgIGlmIChjbGlSQyA9PSAxKQoJICAgICAgcmV0dXJuIHJjOwoKCSAgICBzdGVwXyA9IERST1BfQU5EX0RPTkVfOwoJICB9CglicmVhazsKCgljYXNlIERST1BfQU5EX0RPTkVfOgoJY2FzZSBEUk9QX0FORF9FUlJPUl86CgkgIHsKCSAgICBjaGFyICogZHRRdWVyeSA9IAoJICAgICAgbmV3KGdldE15SGVhcCgpKSBjaGFyW3N0cmxlbigiRFJPUCBUQUJMRSA7ICIpICsgCgkJCQkgICBzdHJsZW4oZXhlVXRpbFRkYigpLmdldE9iamVjdE5hbWUoKSkgKwoJCQkJICAgMTAwXTsKCSAgICBpZiAoZXhlVXRpbFRkYigpLmV4cGxhaW5UeXBlXyA9PSAKCQlDb21UZGJFeGVVdGlsRGlzcGxheUV4cGxhaW5Db21wbGV4OjpDUkVBVEVfSU5ERVhfKQoJICAgICAgc3RyY3B5KGR0UXVlcnksICJEUk9QIElOREVYICIpOwoJICAgIGVsc2UgaWYgKGV4ZVV0aWxUZGIoKS5leHBsYWluVHlwZV8gPT0gCgkJQ29tVGRiRXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleDo6Q1JFQVRFX01WXykKCSAgICAgIHN0cmNweShkdFF1ZXJ5LCAiRFJPUCBNViAiKTsKCSAgICBlbHNlCgkgICAgICBzdHJjcHkoZHRRdWVyeSwgIkRST1AgVEFCTEUgIik7CgkgICAgc3RyY2F0KGR0UXVlcnksIGV4ZVV0aWxUZGIoKS5nZXRPYmplY3ROYW1lKCkpOwoJICAgIGNsaVJDID0gY2xpSW50ZXJmYWNlKCktPmV4ZWN1dGVJbW1lZGlhdGUoZHRRdWVyeSk7CgkgICAgaWYgKGNsaVJDIDwgMCkKCSAgICAgIHsKCQkvLyBpZ25vcmUgZXJyb3JzLgoJCVNRTF9FWEVDX0NsZWFyRGlhZ25vc3RpY3MoTlVMTCk7CgkgICAgICB9CgkgICAgCgkgICAgLy8gRGVsZXRlIG5ldydkIGNoYXJhY3RlcnMKCSAgICBOQURFTEVURUJBU0lDKGR0UXVlcnksIGdldEhlYXAoKSk7CgoJICAgIGlmIChzdGVwXyA9PSBEUk9QX0FORF9FUlJPUl8pCgkgICAgICBzdGVwXyA9IEVSUk9SXzsKCSAgICBlbHNlCgkgICAgICBzdGVwXyA9IERPTkVfOwoJICB9CglicmVhazsKCQoJY2FzZSBFUlJPUl86CgkgIHsKCSAgICBpZiAocXBhcmVudF8udXAtPmlzRnVsbCgpKQoJICAgICAgcmV0dXJuIFdPUktfT0s7CgoJICAgIC8vIFJldHVybiBFT0YuCgkgICAgZXhfcXVldWVfZW50cnkgKiB1cF9lbnRyeSA9IHFwYXJlbnRfLnVwLT5nZXRUYWlsRW50cnkoKTsKCSAgICAKCSAgICB1cF9lbnRyeS0+dXBTdGF0ZS5wYXJlbnRJbmRleCA9IAoJICAgICAgcGVudHJ5X2Rvd24tPmRvd25TdGF0ZS5wYXJlbnRJbmRleDsKCSAgICAKCSAgICB1cF9lbnRyeS0+dXBTdGF0ZS5zZXRNYXRjaE5vKDApOwoJICAgIHVwX2VudHJ5LT51cFN0YXRlLnN0YXR1cyA9IGV4X3F1ZXVlOjpRX1NRTEVSUk9SOwoKCSAgICBDb21EaWFnc0FyZWEgKmRpYWdzQXJlYSA9IHVwX2VudHJ5LT5nZXREaWFnc0FyZWEoKTsKCSAgICAKCSAgICBpZiAoZGlhZ3NBcmVhID09IE5VTEwpCgkgICAgICBkaWFnc0FyZWEgPSAKCQlDb21EaWFnc0FyZWE6OmFsbG9jYXRlKHRoaXMtPmdldEdsb2JhbHMoKS0+Z2V0RGVmYXVsdEhlYXAoKSk7CgkgICAgCgkgICAgaWYgKGdldERpYWdzQXJlYSgpKQoJICAgICAgZGlhZ3NBcmVhLT5tZXJnZUFmdGVyKCpnZXREaWFnc0FyZWEoKSk7CgkgICAgCgkgICAgdXBfZW50cnktPnNldERpYWdzQXJlYSAoZGlhZ3NBcmVhKTsKCSAgICAKCSAgICAvLyBpbnNlcnQgaW50byBwYXJlbnQKCSAgICBxcGFyZW50Xy51cC0+aW5zZXJ0KCk7CgkgICAgCgkgICAgcHN0YXRlLm1hdGNoZXNfID0gMDsKCgkgICAgc3RlcF8gPSBET05FXzsKCSAgfQoJYnJlYWs7CgoJY2FzZSBET05FXzoKCSAgewoJICAgIGlmIChxcGFyZW50Xy51cC0+aXNGdWxsKCkpCgkgICAgICByZXR1cm4gV09SS19PSzsKCgkgICAgLy8gUmV0dXJuIEVPRi4KCSAgICBleF9xdWV1ZV9lbnRyeSAqIHVwX2VudHJ5ID0gcXBhcmVudF8udXAtPmdldFRhaWxFbnRyeSgpOwoJICAgIAoJICAgIHVwX2VudHJ5LT51cFN0YXRlLnBhcmVudEluZGV4ID0gCgkgICAgICBwZW50cnlfZG93bi0+ZG93blN0YXRlLnBhcmVudEluZGV4OwoJICAgIAoJICAgIHVwX2VudHJ5LT51cFN0YXRlLnNldE1hdGNoTm8oMCk7CgkgICAgdXBfZW50cnktPnVwU3RhdGUuc3RhdHVzID0gZXhfcXVldWU6OlFfTk9fREFUQTsKCSAgICAKCSAgICAvLyBpbnNlcnQgaW50byBwYXJlbnQKCSAgICBxcGFyZW50Xy51cC0+aW5zZXJ0KCk7CgkgICAgCgkgICAgcHN0YXRlLm1hdGNoZXNfID0gMDsKCSAgICBzdGVwXyA9IEVNUFRZXzsKCSAgICBxcGFyZW50Xy5kb3duLT5yZW1vdmVIZWFkKCk7CgoJICAgIHJldHVybiBXT1JLX09LOwoJICB9CglicmVhazsKCQoJfQogICAgfQoKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gQ29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgZm9yIEV4ZVV0aWxfcHJpdmF0ZV9zdGF0ZQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpbkNvbXBsZXhQcml2YXRlU3RhdGU6OkV4RXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleFByaXZhdGVTdGF0ZSgpCnsKICBtYXRjaGVzXyA9IDA7Cn0KCkV4RXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleFByaXZhdGVTdGF0ZTo6fkV4RXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleFByaXZhdGVTdGF0ZSgpCnsKfTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gQ29uc3RydWN0b3IgZm9yIGNsYXNzIEV4RXhlVXRpbERpc3BsYXlFeHBsYWluU2hvd2RkbFRjYgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5TaG93ZGRsVGNiOjpFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblNob3dkZGxUY2IoCiAgICAgY29uc3QgQ29tVGRiRXhlVXRpbERpc3BsYXlFeHBsYWluQ29tcGxleCAmIGV4ZV91dGlsX3RkYiwKICAgICBleF9nbG9iYWxzICogZ2xvYikKICAgICA6IEV4RXhlVXRpbFRjYiggZXhlX3V0aWxfdGRiLCBOVUxMLCBnbG9iKSwKICAgICAgIHN0ZXBfKEVNUFRZXyksIG5ld1FyeV8oTlVMTCkKewogIC8vIEFsbG9jYXRlIHRoZSBwcml2YXRlIHN0YXRlIGluIGVhY2ggZW50cnkgb2YgdGhlIGRvd24gcXVldWUKICBxcGFyZW50Xy5kb3duLT5hbGxvY2F0ZVBzdGF0ZSh0aGlzKTsKfQoKRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5TaG93ZGRsVGNiOjp+RXhFeGVVdGlsRGlzcGxheUV4cGxhaW5TaG93ZGRsVGNiKCkKewogIGlmIChuZXdRcnlfKQogICAgTkFERUxFVEVCQVNJQyhuZXdRcnlfLCBnZXRNeUhlYXAoKSk7CiAgbmV3UXJ5XyA9IE5VTEw7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBSZWRlZmluZSB2aXJ0dWFsIG1ldGhvZCBhbGxvY2F0ZVBzdGF0ZXMsIHRvIGJlIHVzZWQgYnkgZHluYW1pYyBxdWV1ZQovLyByZXNpemluZywgYXMgd2VsbCBhcyB0aGUgaW5pdGlhbCBxdWV1ZSBjb25zdHJ1Y3Rpb24uCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpleF90Y2JfcHJpdmF0ZV9zdGF0ZSAqIEV4RXhlVXRpbERpc3BsYXlFeHBsYWluU2hvd2RkbFRjYjo6YWxsb2NhdGVQc3RhdGVzKAogICAgIExuZzMyICZudW1FbGVtcywgICAgICAvLyBpbm91dCwgZGVzaXJlZC9hY3R1YWwgZWxlbWVudHMKICAgICBMbmczMiAmcHN0YXRlTGVuZ3RoKSAgLy8gb3V0LCBsZW5ndGggb2Ygb25lIGVsZW1lbnQKewogIFBzdGF0ZUFsbG9jYXRvcjxFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblNob3dkZGxQcml2YXRlU3RhdGU+IHBhOwoKICByZXR1cm4gcGEuYWxsb2NhdGVQc3RhdGVzKHRoaXMsIG51bUVsZW1zLCBwc3RhdGVMZW5ndGgpOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gd29yaygpIGZvciBFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblNob3dkZGxUY2IKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCnNob3J0IEV4RXhlVXRpbERpc3BsYXlFeHBsYWluU2hvd2RkbFRjYjo6d29yaygpCnsKICBMbmczMiBjbGlSQzsKICBzaG9ydCByYzsKCiAgLy8gaWYgbm8gcGFyZW50IHJlcXVlc3QsIHJldHVybgogIGlmIChxcGFyZW50Xy5kb3duLT5pc0VtcHR5KCkpCiAgICByZXR1cm4gV09SS19PSzsKCiAgLy8gaWYgbm8gcm9vbSBpbiB1cCBxdWV1ZSwgd29uJ3QgYmUgYWJsZSB0byByZXR1cm4gZGF0YS9zdGF0dXMuCiAgLy8gQ29tZSBiYWNrIGxhdGVyLgogIGlmIChxcGFyZW50Xy51cC0+aXNGdWxsKCkpCiAgICByZXR1cm4gV09SS19PSzsKCiAgZXhfcXVldWVfZW50cnkgKiBwZW50cnlfZG93biA9IHFwYXJlbnRfLmRvd24tPmdldEhlYWRFbnRyeSgpOwogIEV4RXhlVXRpbERpc3BsYXlFeHBsYWluU2hvd2RkbFByaXZhdGVTdGF0ZSAmIHBzdGF0ZSA9CiAgICAqKChFeEV4ZVV0aWxEaXNwbGF5RXhwbGFpblNob3dkZGxQcml2YXRlU3RhdGUqKSBwZW50cnlfZG93bi0+cHN0YXRlKTsKCiAgLy8gR2V0IHRoZSBnbG9iYWxzIHN0dWN0dXJlIG9mIHRoZSBtYXN0ZXIgZXhlY3V0b3IuCiAgRXhFeGVTdG10R2xvYmFscyAqZXhlR2xvYiA9IGdldEdsb2JhbHMoKS0+Y2FzdFRvRXhFeGVTdG10R2xvYmFscygpOwogIEV4TWFzdGVyU3RtdEdsb2JhbHMgKm1hc3Rlckdsb2IgPSBleGVHbG9iLT5jYXN0VG9FeE1hc3RlclN0bXRHbG9iYWxzKCk7CgogIHdoaWxlICgxKSAvLyBleGl0IHZpYSByZXR1cm4KICAgIHsKICAgICAgc3dpdGNoIChzdGVwXykKCXsKCWNhc2UgRU1QVFlfOgoJICB7CgkgICAgc3RlcF8gPSBHRVRfTEFCRUxfU1RBVFNfOwoJICB9CglicmVhazsKCgljYXNlIEdFVF9MQUJFTF9TVEFUU186CgkgIHsKCSAgICBjaGFyIGNvdW50QnVmWzIwXTsKCgkgICAgaWYgKGV4ZVV0aWxUZGIoKS5ub0xhYmVsU3RhdHMoKSkKCSAgICAgIHsKCQlzdHJjcHkoY291bnRCdWYsICIwIik7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgewoJCWNsaVJDID0gCgkJICBjbGlJbnRlcmZhY2UoKS0+CgkJICBleGVjdXRlSW1tZWRpYXRlKCJjb250cm9sIHNlc3Npb24gJ0VYUExBSU4nICdPTic7Iik7CgoJCWlmIChjbGlSQyA8IDApCgkJICB7CiAgICAgICAgICAgICAgICAgICAgY2xpSW50ZXJmYWNlKCktPmFsbG9jQW5kUmV0cmlldmVTUUxEaWFnbm9zdGljcyhkaWFnc0FyZWFfKTsKCQkgICAgc3RlcF8gPSBFUlJPUl87CgkJICAgIGJyZWFrOwoJCSAgfQoKCSBMbmczMiBsZW4gPSAwOwoJCWNsaVJDID0gY2xpSW50ZXJmYWNlKCktPmV4ZWN1dGVJbW1lZGlhdGUoZXhlVXRpbFRkYigpLnFyeTNfLAoJCQkJCQkJIGNvdW50QnVmLAoJCQkJCQkJICZsZW4sIFRSVUUpOwoKCQkvLyByZXNldCBDT05UUk9MIFNFU1NJT04KCQljbGlJbnRlcmZhY2UoKS0+CgkJICBleGVjdXRlSW1tZWRpYXRlKCJjb250cm9sIHNlc3Npb24gcmVzZXQgJ0VYUExBSU4nOyIpOwoKCQlpZiAoY2xpUkMgPCAwKQoJCSAgewogICAgICAgICAgICAgICAgICAgIGNsaUludGVyZmFjZSgpLT5hbGxvY0FuZFJldHJpZXZlU1FMRGlhZ25vc3RpY3MoZGlhZ3NBcmVhXyk7CgkJICAgIHN0ZXBfID0gRVJST1JfOwoJCSAgICBicmVhazsKCQkgIH0KCQljb3VudEJ1ZltsZW5dID0gMDsKCSAgICAgIH0KCgkgICAgbmV3UXJ5XyA9IG5ldyhnZXRNeUhlYXAoKSkgCgkgICAgICBjaGFyW3N0cmxlbihleGVVdGlsVGRiKCkucXJ5Ml8pICsgMTAwXTsKCSAgICBzdHJfc3ByaW50ZihuZXdRcnlfLCBleGVVdGlsVGRiKCkucXJ5Ml8sIGNvdW50QnVmKTsKCgkgICAgc3RlcF8gPSBFWFBMQUlOX0NSRUFURV87CgkgIH0KCWJyZWFrOwoKCWNhc2UgRVhQTEFJTl9DUkVBVEVfOgoJICB7CgkgICAgY2xpUkMgPSBleGVjdXRlUXVlcnkoTlVMTCwgTlVMTCwgCgkJCQkgbmV3UXJ5XywgLy9leGVVdGlsVGRiKCkucXJ5Ml8sCgkJCQkgRkFMU0UsIEZBTFNFLAoJCQkJIHJjLAoJCQkJIE5VTEwsIE5VTEwsIEZBTFNFKTsKCgkgICAgaWYgKGNsaVJDIDwgMCkKCSAgICAgIHsKICAgICAgICAgICAgICAgIGNsaUludGVyZmFjZSgpLT5hbGxvY0FuZFJldHJpZXZlU1FMRGlhZ25vc3RpY3MoZGlhZ3NBcmVhXyk7CgkJc3RlcF8gPSBFUlJPUl87CgkJYnJlYWs7CgkgICAgICB9CgkgICAgCgkgICAgaWYgKGNsaVJDID09IDEpCgkgICAgICByZXR1cm4gcmM7CgoJICAgIHN0ZXBfID0gRE9ORV87CgkgIH0KCWJyZWFrOwoJCgljYXNlIEVSUk9SXzoKCSAgewoJICAgIGlmIChxcGFyZW50Xy51cC0+aXNGdWxsKCkpCgkgICAgICByZXR1cm4gV09SS19PSzsKCgkgICAgLy8gUmV0dXJuIEVPRi4KCSAgICBleF9xdWV1ZV9lbnRyeSAqIHVwX2VudHJ5ID0gcXBhcmVudF8udXAtPmdldFRhaWxFbnRyeSgpOwoJICAgIAoJICAgIHVwX2VudHJ5LT51cFN0YXRlLnBhcmVudEluZGV4ID0gCgkgICAgICBwZW50cnlfZG93bi0+ZG93blN0YXRlLnBhcmVudEluZGV4OwoJICAgIAoJICAgIHVwX2VudHJ5LT51cFN0YXRlLnNldE1hdGNoTm8oMCk7CgkgICAgdXBfZW50cnktPnVwU3RhdGUuc3RhdHVzID0gZXhfcXVldWU6OlFfU1FMRVJST1I7CgoJICAgIENvbURpYWdzQXJlYSAqZGlhZ3NBcmVhID0gdXBfZW50cnktPmdldERpYWdzQXJlYSgpOwoJICAgIAoJICAgIGlmIChkaWFnc0FyZWEgPT0gTlVMTCkKCSAgICAgIGRpYWdzQXJlYSA9IAoJCUNvbURpYWdzQXJlYTo6YWxsb2NhdGUodGhpcy0+Z2V0R2xvYmFscygpLT5nZXREZWZhdWx0SGVhcCgpKTsKCSAgICAKCSAgICBpZiAoZ2V0RGlhZ3NBcmVhKCkpCgkgICAgICBkaWFnc0FyZWEtPm1lcmdlQWZ0ZXIoKmdldERpYWdzQXJlYSgpKTsKCSAgICAKCSAgICB1cF9lbnRyeS0+c2V0RGlhZ3NBcmVhIChkaWFnc0FyZWEpOwoJICAgIAoJICAgIC8vIGluc2VydCBpbnRvIHBhcmVudAoJICAgIHFwYXJlbnRfLnVwLT5pbnNlcnQoKTsKCSAgICAKCSAgICBwc3RhdGUubWF0Y2hlc18gPSAwOwoKCSAgICBzdGVwXyA9IERPTkVfOwoJICB9CglicmVhazsKCgljYXNlIERPTkVfOgoJICB7CgkgICAgaWYgKHFwYXJlbnRfLnVwLT5pc0Z1bGwoKSkKCSAgICAgIHJldHVybiBXT1JLX09LOwoKCSAgICAvLyBSZXR1cm4gRU9GLgoJICAgIGV4X3F1ZXVlX2VudHJ5ICogdXBfZW50cnkgPSBxcGFyZW50Xy51cC0+Z2V0VGFpbEVudHJ5KCk7CgkgICAgCgkgICAgdXBfZW50cnktPnVwU3RhdGUucGFyZW50SW5kZXggPSAKCSAgICAgIHBlbnRyeV9kb3duLT5kb3duU3RhdGUucGFyZW50SW5kZXg7CgkgICAgCgkgICAgdXBfZW50cnktPnVwU3RhdGUuc2V0TWF0Y2hObygwKTsKCSAgICB1cF9lbnRyeS0+dXBTdGF0ZS5zdGF0dXMgPSBleF9xdWV1ZTo6UV9OT19EQVRBOwoJICAgIAoJICAgIC8vIGluc2VydCBpbnRvIHBhcmVudAoJICAgIHFwYXJlbnRfLnVwLT5pbnNlcnQoKTsKCSAgICAKCSAgICBwc3RhdGUubWF0Y2hlc18gPSAwOwoJICAgIHN0ZXBfID0gRU1QVFlfOwoJICAgIHFwYXJlbnRfLmRvd24tPnJlbW92ZUhlYWQoKTsKCgkgICAgcmV0dXJuIFdPUktfT0s7CgkgIH0KCWJyZWFrOwoJCgl9CiAgICB9Cgp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBDb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBmb3IgRXhlVXRpbF9wcml2YXRlX3N0YXRlCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkV4RXhlVXRpbERpc3BsYXlFeHBsYWluU2hvd2RkbFByaXZhdGVTdGF0ZTo6RXhFeGVVdGlsRGlzcGxheUV4cGxhaW5TaG93ZGRsUHJpdmF0ZVN0YXRlKCkKewogIG1hdGNoZXNfID0gMDsKfQoKRXhFeGVVdGlsRGlzcGxheUV4cGxhaW5TaG93ZGRsUHJpdmF0ZVN0YXRlOjp+RXhFeGVVdGlsRGlzcGxheUV4cGxhaW5TaG93ZGRsUHJpdmF0ZVN0YXRlKCkKewp9Owo=