LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vDQovL7LOvPsgTFBBvdO/2s7EtbVWMC4xIFNHUC4yMiwgt7W72EFQRFUNCi8vICAgDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCiNpbmNsdWRlIDxjdHlwZS5oPg0KI2luY2x1ZGUgPHN5cy90aW1lLmg+DQojaW5jbHVkZSA8dGltZS5oPg0KI2luY2x1ZGUgPHRlcm1pb3MuaD4NCg0KI2luY2x1ZGUgImxwYV9pbm5lci5oIg0KDQojZGVmaW5lIExQQV9UUklHR0VSX0RBVEFfTEVOIDUxMg0KI2RlZmluZSBUUklHR0VSX0hUVFBfUkVRX0xFTiA1MTINCiNkZWZpbmUgVFJJR0dFUl9IVFRQX1JFU1BfTEVOIDUxMg0KDQojZGVmaW5lIEhBU0hfU0laRSAxNg0KI2RlZmluZSBIQVNIX0hFWF9TSVpFIDMzDQoNCiNkZWZpbmUgTUFYX1RJTUVfTEVOIDI0DQoNCiNkZWZpbmUgTUFYX0FQUElEX0xFTiA2NQ0KI2RlZmluZSBNQVhfVVJMX0xFTiAxMjkNCg0KaW50IGdfY2hhbl9pZCA9IDA7IC8vbG9naWNhbCBjaGFubmVsDQpzdGF0aWMgaW50IGdfb3Blbl9jaGFubmVsX2ZsYWcgPSAwOw0KDQpleHRlcm4gY2hhciBjdXJlbnRfaWNjaWRbSUNDSURfTEVOKzFdOw0KDQovL3VzZSBudg0KLy8jZGVmaW5lIEFQUElEICJPOFhUY1ZrWjhMNFJEdjFWIg0KLy8jZGVmaW5lIEFQUFNFQ1JFVCAiV05iSFFsUlY5SktlcXBWV1N1clFXWkxYd0RzNVQ5RGwiDQovLyNkZWZpbmUgVFJJR0dFUl9QT1JUIDYxNjIyDQovLyNkZWZpbmUgVFJJR0dFUl9IT1NUICJzZXJ2aWNlcGxhdGZvcm10LmVzaW0uY2hpbmF1bmljb20uY24iDQovLyNkZWZpbmUgVFJJR0dFUl9FVkVOVF9VUkwgIi9lc2ltX3VuaV9wbHVzX3NlcnZlci9hcGkvZXZlbnQiDQovLyNkZWZpbmUgVFJJR0dFUl9VUERBVEFfVVJMICIvZXNpbV91bmlfcGx1c19zZXJ2ZXIvYXBpL3VwZGF0YSINCg0KDQovL7Slt6K3/s7xxvdodHRwx+vH8w0Kc3RhdGljIGNoYXIgdHJpZ2dlcl9odHRwc19yZXFbXSA9DQogICAgIlBPU1QgJXMgSFRUUC8xLjFcclxuIg0KICAgICJIb3N0OiAlc1xyXG4iDQogICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxyXG4iDQogICAgIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG4iDQogICAgIkFjY2VwdDogKi8qXHJcbiINCiAgICAiXHJcbiVzXHJcbiI7DQoNCnN0YXRpYyBjaGFyIHRyaWdnZXJfaHR0cHNfZXZlbnRbXSA9DQoieyINCgkiXCJIRUFEXCI6IHsiDQoJCSJcIkFQUElEXCI6IFwiJXNcIiwiDQoJCSJcIlRJTUVcIjogXCIlc1wiLCINCgkJIlwiVFJBTlNJRFwiOiBcIiVzXCIsIg0KCQkiXCJUT0tFTlwiOiBcIiVzXCIiDQoJIn0sIg0KCSJcIkJPRFlcIjogeyINCgkJIlwiRUlEXCI6IFwiJXNcIiwiDQoJCSJcIklNRUlcIjogXCIlc1wiIg0KCSJ9Ig0KIn0iOw0KDQpzdGF0aWMgY2hhciB0cmlnZ2VyX2h0dHBzX3VwZGF0YVtdID0NCiJ7Ig0KCSJcIkhFQURcIjogeyINCgkJIlwiQVBQSURcIjogXCIlc1wiLCINCgkJIlwiVElNRVwiOiBcIiVzXCIsIg0KCQkiXCJUUkFOU0lEXCI6IFwiJXNcIiwiDQoJCSJcIlRPS0VOXCI6IFwiJXNcIiINCgkifSwiDQoJIlwiQk9EWVwiOiB7Ig0KCQkiXCJFSURcIjogXCIlc1wiLCINCgkJIlwiSU1FSVwiOiBcIiVzXCIsIg0KCQkiXCJFWEVDX1JFU1VMVFwiOiAlZCwiDQoJCSJcIkVYRUNfUkVBU09OXCI6IFwiJXNcIiwiDQoJCSJcIkRBVEFfSU5GT1wiOiBbJXNdIg0KCSJ9Ig0KIn0iOw0KDQoNCmNoYXIgZ19pbWVpW01BWF9JTUVJX0xFTl0gPSB7MH07DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovLw0KLy9pbWVpDQovLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyBpbnQgbHBhX2dldF9pbWVpKGNoYXIgKmltZWksIGludCBzaXplKQ0Kew0KCWludCByZXQgPSAtMTsNCgljaGFyIHRfaW1laVtNQVhfSU1FSV9MRU5dID0gezB9Ow0KCXZvaWQgKnAyW10gPSB7dF9pbWVpfTsNCg0KCWNmZ19nZXRfaXRlbSAoImltZWkiLCBpbWVpLCBzaXplKTsNCglpZiAoc3RybGVuKGltZWkpIDwgMTUpIHsNCgkJcmV0ID0gZ2V0X21vZGVtX2luZm8oIkFUK0NHU05cclxuIiwgIiVzIiwgcDIpOw0KCQlpZihyZXQgPT0gMCkgew0KCQkJc25wcmludGYoaW1laSwgc2l6ZSwgIiVzIiwgdF9pbWVpKTsNCgkJfQ0KCQlyZXR1cm4gcmV0Ow0KCX0NCg0KCXJldHVybiAwOw0KfQ0KDQpzdGF0aWMgaW50IGxwYV9nZXRfaWNjaWQoY2hhciAqaWNjaWQsIGludCBzaXplKQ0Kew0KCWludCByZXQgPSAtMTsNCgljaGFyIHRfaWNjaWRbSUNDSURfTEVOKzFdID0gezB9Ow0KCXZvaWQgKnAyW10gPSB7dF9pY2NpZH07DQoNCg0KCXJldCA9IGdldF9tb2RlbV9pbmZvKCJBVCtaSUNDSUQ/XHJcbiIsICIlcyIsIHAyKTsNCglpZihyZXQgPT0gMCkgew0KCQlzbnByaW50ZihpY2NpZCwgc2l6ZSwgIiVzIiwgdF9pY2NpZCk7DQoJfQ0KCXJldHVybiByZXQ7DQoNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vDQovL3RpbWUNCi8vDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIGludCBscGFfZ2V0X3RpbWUoY2hhciAqdGltZSwgaW50IHNpemUpDQp7DQoJc3RydWN0IHRtIHB0bSA9IHswfTsJDQoJc3RydWN0IHRpbWV2YWwgbm93X3RpbWUgPSB7MH07DQoJDQoJZ2V0dGltZW9mZGF5KCZub3dfdGltZSwgTlVMTCk7DQoJbG9jYWx0aW1lX3IoJm5vd190aW1lLnR2X3NlYywgJnB0bSk7DQoNCglzbnByaW50Zih0aW1lLCBzaXplLCAiJWQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkICUwM2QiLCANCgkJcHRtLnRtX3llYXIgKyAxOTAwLCBwdG0udG1fbW9uICsgMSwgcHRtLnRtX21kYXksIHB0bS50bV9ob3VyLCBwdG0udG1fbWluLCBwdG0udG1fc2VjLCBub3dfdGltZS50dl91c2VjLzEwMDApOw0KCQ0KCS8vcHJpbnRmKCJscGFfZ2V0X3RpbWU6ICVzXG4iLCB0aW1lKTsNCglyZXR1cm4gMDsNCn0NCg0Kc3RhdGljIGludCBscGFfZ2V0X3RyYW5zaWQoY2hhciAqdHJhbnNpZCwgaW50IHNpemUsIGNoYXIgKmltZWkpDQp7DQoJc3RydWN0IHRtIHB0bSA9IHswfTsJDQoJc3RydWN0IHRpbWV2YWwgbm93X3RpbWUgPSB7MH07DQoJDQoJZ2V0dGltZW9mZGF5KCZub3dfdGltZSwgTlVMTCk7DQoJbG9jYWx0aW1lX3IoJm5vd190aW1lLnR2X3NlYywgJnB0bSk7DQoNCglzbnByaW50Zih0cmFuc2lkLCBzaXplLCAiJXMlMDRkJTAyZCUwMmQlMDJkJTAyZCUwMmQlMDNkIiwgDQoJCWltZWksIHB0bS50bV95ZWFyICsgMTkwMCwgcHRtLnRtX21vbiArIDEsIHB0bS50bV9tZGF5LCBwdG0udG1faG91ciwgcHRtLnRtX21pbiwgcHRtLnRtX3NlYywgbm93X3RpbWUudHZfdXNlYy8xMDAwKTsNCgkNCgkvL3ByaW50ZigibHBhX2dldF90cmFuc2lkOiAlc1xuIiwgdHJhbnNpZCk7DQoJcmV0dXJuIDA7DQp9DQoNCi8vMCBmYWlsIDEgc3VjYw0Kc3RhdGljIGludCBscGFfZ2V0X2V4ZXJlcyhjaGFyICpleGVfcmVhc29uLCBpbnQgbGVuKQ0KewkNCgljZmdfZ2V0X2l0ZW0oImxwYV9sYXN0X3JlcyIsIGV4ZV9yZWFzb24sIGxlbik7DQoJaWYgKDAgPT0gc3RyY21wKGV4ZV9yZWFzb24sInN1Y2Nlc3MiKSkNCgkJcmV0dXJuIDE7DQoNCglyZXR1cm4gMDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vDQovLw0KLy8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgY2hhciAqbHBhX2dldF90cmlnZ2VyX2RhdGEodm9pZCkNCnsNCglpbnQgcmV0ID0gLTE7DQoJLy9jaGFyIGltZWlbTUFYX0lNRUlfTEVOXSA9IHswfTsNCgljaGFyIHRpbWVbTUFYX1RJTUVfTEVOXSA9IHswfTsNCgljaGFyIHRyYW5zaWRbTUFYX1RSQU5TSURfTEVOXSA9IHswfTsNCgljaGFyICplaWQgPSBOVUxMOw0KCWxwYV9NRDVfQ1RYIG1kNWN0eCA9IHswfTsNCgl1bnNpZ25lZCBjaGFyIGhhc2hbSEFTSF9TSVpFXSA9IHswfTsNCgljaGFyIHRva2VuW0hBU0hfSEVYX1NJWkVdID0gezB9Ow0KCWNoYXIgKmpzX2RhdGEgPSBOVUxMOw0KCWNoYXIgYXBwaWRbTUFYX0FQUElEX0xFTl0gPSB7MH07DQoJY2hhciBhcHBzZWNyZXRbTUFYX0FQUElEX0xFTl0gPSB7MH07DQoNCgljZmdfZ2V0X2l0ZW0oImxwYV9hcHBpZCIsIGFwcGlkLCBzaXplb2YoYXBwaWQpKTsNCgljZmdfZ2V0X2l0ZW0oImxwYV9hcHBzZWNyZXQiLCBhcHBzZWNyZXQsIHNpemVvZihhcHBzZWNyZXQpKTsNCg0KCWxwYV9nZXRfdGltZSh0aW1lLCBzaXplb2YodGltZSkpOw0KCWxwYV9nZXRfdHJhbnNpZCh0cmFuc2lkLCBzaXplb2YodHJhbnNpZCksIGdfaW1laSk7DQoNCglscGFfTUQ1X0luaXQoJm1kNWN0eCk7DQoJbHBhX01ENV9VcGRhdGUoJm1kNWN0eCwgYXBwaWQsIHN0cmxlbihhcHBpZCkpOwkNCglscGFfTUQ1X1VwZGF0ZSgmbWQ1Y3R4LCB0cmFuc2lkLCBzdHJsZW4odHJhbnNpZCkpOw0KCWxwYV9NRDVfVXBkYXRlKCZtZDVjdHgsIHRpbWUsIHN0cmxlbih0aW1lKSk7DQoJbHBhX01ENV9VcGRhdGUoJm1kNWN0eCwgYXBwc2VjcmV0LCBzdHJsZW4oYXBwc2VjcmV0KSk7DQoJbHBhX01ENV9GaW5hbChoYXNoLCAmbWQ1Y3R4KTsNCgkvL3Rva2VuIGxvd2VyIGNhc2UNCglieXRlczJzdHJpbmdfbG93ZXIoaGFzaCwgdG9rZW4sIHNpemVvZihoYXNoKSk7DQoNCgllaWQgPSBHZXRFSUQoKTsNCglpZiAoZWlkID09IE5VTEwpIHsNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KCWpzX2RhdGEgPSBtYWxsb2MoTFBBX1RSSUdHRVJfREFUQV9MRU4pOw0KCWlmIChqc19kYXRhICE9IE5VTEwpIHsNCgkJbWVtc2V0KGpzX2RhdGEsIDAsIExQQV9UUklHR0VSX0RBVEFfTEVOKTsNCgkJc25wcmludGYoanNfZGF0YSwgTFBBX1RSSUdHRVJfREFUQV9MRU4sIHRyaWdnZXJfaHR0cHNfZXZlbnQsIA0KCQkJYXBwaWQsIHRpbWUsIHRyYW5zaWQsIHRva2VuLCBlaWQsIGdfaW1laSk7DQoJCS8vcHJpbnRmKCJ0cmlnZ2VyIGpzb246LSVzLVxuIiwganNfZGF0YSk7DQoJfQ0KDQoJZnJlZShlaWQpOw0KCXJldHVybiBqc19kYXRhOw0KfQ0KDQpzdGF0aWMgY2hhciAqbHBhX2dldF91cGRhdGFfZGF0YSh2b2lkKQ0Kew0KCWludCByZXQgPSAtMTsNCgkvL2NoYXIgaW1laVtNQVhfSU1FSV9MRU5dID0gezB9Ow0KCWNoYXIgdGltZVtNQVhfVElNRV9MRU5dID0gezB9Ow0KCWNoYXIgdHJhbnNpZFtNQVhfVFJBTlNJRF9MRU5dID0gezB9Ow0KCWNoYXIgKmVpZCA9IE5VTEw7DQoJbHBhX01ENV9DVFggbWQ1Y3R4ID0gezB9Ow0KCXVuc2lnbmVkIGNoYXIgaGFzaFtIQVNIX1NJWkVdID0gezB9Ow0KCWNoYXIgdG9rZW5bSEFTSF9IRVhfU0laRV0gPSB7MH07DQoJY2hhciAqanNfZGF0YSA9IE5VTEw7DQoJY2hhciBleGVfcmVhc29uWzIwMF0gPSB7MH07DQoJaW50IGV4ZV9yZXMgPSAwOw0KCWNoYXIgKnByb19saXN0ID0gTlVMTDsNCgljaGFyIGFwcGlkW01BWF9BUFBJRF9MRU5dID0gezB9Ow0KCWNoYXIgYXBwc2VjcmV0W01BWF9BUFBJRF9MRU5dID0gezB9Ow0KCQ0KCWNmZ19nZXRfaXRlbSgibHBhX2FwcGlkIiwgYXBwaWQsIHNpemVvZihhcHBpZCkpOw0KCWNmZ19nZXRfaXRlbSgibHBhX2FwcHNlY3JldCIsIGFwcHNlY3JldCwgc2l6ZW9mKGFwcHNlY3JldCkpOw0KDQoJbHBhX2dldF90aW1lKHRpbWUsIHNpemVvZih0aW1lKSk7DQoJbHBhX2dldF90cmFuc2lkKHRyYW5zaWQsIHNpemVvZih0cmFuc2lkKSwgZ19pbWVpKTsNCg0KCWxwYV9NRDVfSW5pdCgmbWQ1Y3R4KTsNCglscGFfTUQ1X1VwZGF0ZSgmbWQ1Y3R4LCBhcHBpZCwgc3RybGVuKGFwcGlkKSk7CQ0KCWxwYV9NRDVfVXBkYXRlKCZtZDVjdHgsIHRyYW5zaWQsIHN0cmxlbih0cmFuc2lkKSk7DQoJbHBhX01ENV9VcGRhdGUoJm1kNWN0eCwgdGltZSwgc3RybGVuKHRpbWUpKTsNCglscGFfTUQ1X1VwZGF0ZSgmbWQ1Y3R4LCBhcHBzZWNyZXQsIHN0cmxlbihhcHBzZWNyZXQpKTsNCglscGFfTUQ1X0ZpbmFsKGhhc2gsICZtZDVjdHgpOw0KCS8vdG9rZW4gbG93ZXIgY2FzZQ0KCWJ5dGVzMnN0cmluZ19sb3dlcihoYXNoLCB0b2tlbiwgc2l6ZW9mKGhhc2gpKTsNCg0KCWVpZCA9IEdldEVJRCgpOw0KCWlmIChlaWQgPT0gTlVMTCkgew0KCQlyZXR1cm4gTlVMTDsNCgl9DQoJDQoJZXhlX3JlcyA9IGxwYV9nZXRfZXhlcmVzKGV4ZV9yZWFzb24sIHNpemVvZihleGVfcmVhc29uKSk7DQoJDQoJZ2V0UHJvZmlsZUxpc3QoJnByb19saXN0KTsNCg0KCWpzX2RhdGEgPSBtYWxsb2MoTFBBX1RSSUdHRVJfREFUQV9MRU4pOw0KCWlmIChqc19kYXRhICE9IE5VTEwpIHsNCgkJbWVtc2V0KGpzX2RhdGEsIDAsIExQQV9UUklHR0VSX0RBVEFfTEVOKTsNCgkJaWYgKHByb19saXN0ICE9IE5VTEwpIHsNCgkJCXNucHJpbnRmKGpzX2RhdGEsIExQQV9UUklHR0VSX0RBVEFfTEVOLCB0cmlnZ2VyX2h0dHBzX3VwZGF0YSwgDQoJCQkJYXBwaWQsIHRpbWUsIHRyYW5zaWQsIHRva2VuLCBlaWQsIGdfaW1laSwgZXhlX3JlcywgZXhlX3JlYXNvbiwgcHJvX2xpc3QpOw0KCQl9DQoJCWVsc2UgIHsNCgkJCXNucHJpbnRmKGpzX2RhdGEsIExQQV9UUklHR0VSX0RBVEFfTEVOLCB0cmlnZ2VyX2h0dHBzX3VwZGF0YSwgDQoJCQkJYXBwaWQsIHRpbWUsIHRyYW5zaWQsIHRva2VuLCBlaWQsIGdfaW1laSwgZXhlX3JlcywgZXhlX3JlYXNvbiwgIiIpOw0KCQl9DQoJCS8vcHJpbnRmKCJ0cmlnZ2VyIGpzb246LSVzLVxuIiwganNfZGF0YSk7DQoJfQ0KDQoJaWYgKHByb19saXN0ICE9IE5VTEwpDQoJCWZyZWUocHJvX2xpc3QpOw0KCWZyZWUoZWlkKTsNCglyZXR1cm4ganNfZGF0YTsNCn0NCg0Kc3RhdGljIGludCBscGFfZ2V0X3Byb2ZpbGVfc3RhdGUoY2hhciAqaWNjaWQpDQp7DQogICAgY2hhciAqYXBkdSA9IE5VTEw7DQoJY2hhciAqc3RhdGUgPSBOVUxMOw0KCWludCBzdGF0dXMgPSAwOw0KCQ0KCWFwZHUgPSBHZXRQcm9maWxlc0luZm8oaWNjaWQpOw0KCWlmIChhcGR1ID09IE5VTEwpDQoJCXJldHVybiAtMTsNCg0KCQ0KCXN0YXRlID0gbHBhX3RhZ19hcGR1X2Zyb21fYXRyZXNwKGFwZHUsIDB4OUY3MCk7DQoJaWYgKHN0YXRlID09IE5VTEwpIHsNCgkJZnJlZShhcGR1KTsNCgkJcmV0dXJuIC0xOw0KCX0NCgllcnJubyA9IDA7DQoJc3RhdHVzID0gc3RydG9sKHN0YXRlLCBOVUxMLCAxNik7DQoJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBFUlJOTy5OT1RfQ0hFQ0tFRA0KCXsNCgkJcHJpbnRmKCJzdHJ0b2wgZXJybm8gJWQ6ICVzXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCgl9DQoJZnJlZShzdGF0ZSk7DQoJZnJlZShhcGR1KTsNCglyZXR1cm4gc3RhdHVzOw0KfQ0KDQovL7Wxx7BpY2NpZMrHt/HOqryku+7XtMystcRwcm9maWxlDQpzdGF0aWMgaW50IGxwYV9nZXRfY3VyX2ljY2lkX3N0YXRlKHZvaWQpDQp7DQoJY2hhciBjdXJfaWNjaWRbSUNDSURfTEVOKzFdID0gezB9Ow0KCQ0KCWxwYV9nZXRfaWNjaWQoY3VyX2ljY2lkLCBzaXplb2YoY3VyX2ljY2lkKSk7DQoJbHBhX3RyYW5zX2ljY2lkKGN1cl9pY2NpZCwgc3RybGVuKGN1cl9pY2NpZCkpOw0KCWlmIChzdHJsZW4oY3VyX2ljY2lkKSA9PSBJQ0NJRF9MRU4pIHsNCgkJcmV0dXJuIGxwYV9nZXRfcHJvZmlsZV9zdGF0ZShjdXJfaWNjaWQpOw0KCX0NCg0KCXJldHVybiAtMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vDQovLw0KLy8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgY2hhciAqbHBhX3BhcnNlX3RyaWdnZXJfcmVzcChjaGFyICpzcmNTdHIsIGludCAqbmV4dF9zdGVwKQ0Kew0KCWNKU09OICpyb290ID0gTlVMTDsNCgljSlNPTiAqb2JqZWN0ID0gTlVMTDsNCgljSlNPTiAqb2JqZWN0MiA9IE5VTEw7DQoJY0pTT04gKmFycmF5ID0gTlVMTDsNCgljaGFyICphY2NvZGVfYXBkdSA9IE5VTEw7DQoNCglyb290ID0gY0pTT05fUGFyc2Uoc3JjU3RyKTsNCglpZiAocm9vdCA9PSBOVUxMKSB7DQoJCXByaW50Zigicm9vdCA9PSBOVUxMXG4iKTsNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KDQoJb2JqZWN0ID0gY0pTT05fR2V0T2JqZWN0SXRlbShyb290LCAiQk9EWSIpOw0KCWlmIChvYmplY3QgPT0gTlVMTCkgew0KCQlwcmludGYoIkJPRFkgbm90IGZpbmRcbiIpOw0KCQljSlNPTl9EZWxldGUocm9vdCk7DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KCW9iamVjdDIgPSBjSlNPTl9HZXRPYmplY3RJdGVtKG9iamVjdCwgIk5FWFRfU1RFUCIpOw0KCWlmIChvYmplY3QyID09IE5VTEwpIHsNCgkJcHJpbnRmKCJORVhUX1NURVAgbm90IGZpbmRcbiIpOw0KCQljSlNPTl9EZWxldGUocm9vdCk7DQoJCXJldHVybiBOVUxMOw0KCX0NCglwcmludGYoIk5FWFRfU1RFUDolZFxuIiwgb2JqZWN0Mi0+dmFsdWVpbnQpOw0KCSpuZXh0X3N0ZXAgPSBvYmplY3QyLT52YWx1ZWludDsNCglpZiAob2JqZWN0Mi0+dmFsdWVpbnQgPT0gMiB8fCBvYmplY3QyLT52YWx1ZWludCA9PSAzDQoJCXx8IG9iamVjdDItPnZhbHVlaW50ID09IDQpIHsNCgkJb2JqZWN0MiA9IGNKU09OX0dldE9iamVjdEl0ZW0ob2JqZWN0LCAiSUNDSUQiKTsNCgkJaWYgKG9iamVjdDIgPT0gTlVMTCkgew0KCQkJcHJpbnRmKCJJQ0NJRCBub3QgZmluZFxuIik7DQoJCQljSlNPTl9EZWxldGUocm9vdCk7DQoJCQlyZXR1cm4gTlVMTDsNCgkJfQ0KCQlwcmludGYoIklDQ0lEOiVzXG4iLCBvYmplY3QyLT52YWx1ZXN0cmluZyk7DQoNCgkJYWNjb2RlX2FwZHUgPSBtYWxsb2MoQVBEVV9SRVNQX0xFTik7DQoJCWlmIChhY2NvZGVfYXBkdSAhPSBOVUxMKSB7DQoJCQltZW1zZXQoYWNjb2RlX2FwZHUsIDAsIEFQRFVfUkVTUF9MRU4pOw0KCQkJc3RybmNweShhY2NvZGVfYXBkdSwgb2JqZWN0Mi0+dmFsdWVzdHJpbmcsIEFQRFVfUkVTUF9MRU4tMSk7DQoJCQlscGFfdHJhbnNfaWNjaWQoYWNjb2RlX2FwZHUsIHN0cmxlbihhY2NvZGVfYXBkdSkpOw0KCQkJcHJpbnRmKCJJQ0NJRC1UcmFuczotJXMtXG4iLCBhY2NvZGVfYXBkdSk7DQoJCX0JDQoJfQ0KCWVsc2UgaWYgKG9iamVjdDItPnZhbHVlaW50ID09IDEpIHsNCgkJb2JqZWN0MiA9IGNKU09OX0dldE9iamVjdEl0ZW0ob2JqZWN0LCAiQ09NTUFORCIpOw0KCQlpZiAob2JqZWN0MiA9PSBOVUxMKSB7DQoJCQlwcmludGYoIkNPTU1BTkQgbm90IGZpbmRcbiIpOw0KCQkJY0pTT05fRGVsZXRlKHJvb3QpOw0KCQkJcmV0dXJuIE5VTEw7DQoJCX0NCgkJYXJyYXkgPSBjSlNPTl9HZXRBcnJheUl0ZW0ob2JqZWN0MiwgMCk7DQoJCWlmIChhcnJheSA9PSBOVUxMKSB7DQoJCQlwcmludGYoIkNPTU1BTkQgbm8gaXRlbVxuIik7DQoJCQljSlNPTl9EZWxldGUocm9vdCk7DQoJCQlyZXR1cm4gTlVMTDsNCgkJfQ0KCQlwcmludGYoIkNPTU1BTkQ6JXNcbiIsIGFycmF5LT52YWx1ZXN0cmluZyk7DQoNCgkJYWNjb2RlX2FwZHUgPSBtYWxsb2MoQVBEVV9SRVNQX0xFTik7DQoJCWlmIChhY2NvZGVfYXBkdSAhPSBOVUxMKSB7DQoJCQltZW1zZXQoYWNjb2RlX2FwZHUsIDAsIEFQRFVfUkVTUF9MRU4pOw0KCQkJc3RybmNweShhY2NvZGVfYXBkdSwgYXJyYXktPnZhbHVlc3RyaW5nLCBBUERVX1JFU1BfTEVOLTEpOw0KCQkJcHJpbnRmKCJhY2NvZGUgb3IgYXBkdTotJXMtXG4iLCBhY2NvZGVfYXBkdSk7DQoJCX0NCgl9DQoJY0pTT05fRGVsZXRlKHJvb3QpOw0KCXJldHVybiBhY2NvZGVfYXBkdTsNCn0NCg0Kc3RhdGljIGNoYXIgKmxwYV9wYXJzZV91cGRhdGFfcmVzcChjaGFyICpzcmNTdHIpDQp7DQoJY0pTT04gKnJvb3QgPSBOVUxMOw0KCWNKU09OICpvYmplY3QgPSBOVUxMOw0KCWNKU09OICpvYmplY3QyID0gTlVMTDsNCgljSlNPTiAqYXJyYXkgPSBOVUxMOw0KCWNoYXIgKmNvZGUgPSBOVUxMOw0KDQoJcm9vdCA9IGNKU09OX1BhcnNlKHNyY1N0cik7DQoJaWYgKHJvb3QgPT0gTlVMTCkgew0KCQlwcmludGYoInJvb3QgPT0gTlVMTFxuIik7DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KCW9iamVjdCA9IGNKU09OX0dldE9iamVjdEl0ZW0ocm9vdCwgIkhFQUQiKTsNCglpZiAob2JqZWN0ID09IE5VTEwpIHsNCgkJcHJpbnRmKCJIRUFEIG5vdCBmaW5kXG4iKTsNCgkJY0pTT05fRGVsZXRlKHJvb3QpOw0KCQlyZXR1cm4gTlVMTDsNCgl9DQoNCglvYmplY3QyID0gY0pTT05fR2V0T2JqZWN0SXRlbShvYmplY3QsICJDT0RFIik7DQoJaWYgKG9iamVjdDIgPT0gTlVMTCkgew0KCQlwcmludGYoIkNPREUgbm90IGZpbmRcbiIpOw0KCQljSlNPTl9EZWxldGUocm9vdCk7DQoJCXJldHVybiBOVUxMOw0KCX0NCglwcmludGYoIkNPREU6JXNcbiIsIG9iamVjdDItPnZhbHVlc3RyaW5nKTsNCgkNCgljb2RlID0gbWFsbG9jKEFQRFVfUkVTUF9MRU4pOw0KCWlmIChjb2RlICE9IE5VTEwpIHsNCgkJbWVtc2V0KGNvZGUsIDAsIEFQRFVfUkVTUF9MRU4pOw0KCQlzdHJuY3B5KGNvZGUsIG9iamVjdDItPnZhbHVlc3RyaW5nLCBBUERVX1JFU1BfTEVOLTEpOw0KCX0NCgljSlNPTl9EZWxldGUocm9vdCk7DQoJcmV0dXJuIGNvZGU7DQp9DQoNCnN0YXRpYyB2b2lkIGxwYV9vcGVuX2NmdW4odm9pZCkNCnsNCglpbnQgY2Z1bl9zdGF0ID0gLTE7DQoJdm9pZCAqcDJbXSA9IHsmY2Z1bl9zdGF0fTsNCgkNCglnZXRfbW9kZW1faW5mbygiQVQrQ0ZVTj9cclxuIiwgIiVkIiwgcDIpOw0KCWlmIChjZnVuX3N0YXQgIT0gMSkgew0KCQlnZXRfbW9kZW1faW5mbygiQVQrQ0ZVTj0wXHJcbiIsIE5VTEwsIE5VTEwpOw0KCQlnZXRfbW9kZW1faW5mbygiQVQrQ0ZVTj0xXHJcbiIsIE5VTEwsIE5VTEwpOw0KCQlscGFfY2xvc2VfbG9naWNhbF9jaGFubmVsKDApOw0KCX0NCn0NCg0KLy93aWZpyrG3wNa5y9HN+LXEc2ltv6iy2df3tPK2z2VzaW231rbO0LS/qA0Kc3RhdGljIHZvaWQgbHBhX2Nsb3NlX2NmdW4odm9pZCkNCnsNCgljaGFyIHBzX3dhblsyMF0gPSB7MH07DQoJY2hhciBkZWZfd2FuWzIwXSA9IHswfTsNCglpbnQgY2Z1bl9zdGF0ID0gLTE7DQoJdm9pZCAqcDJbXSA9IHsmY2Z1bl9zdGF0fTsNCg0KCWNmZ19nZXRfaXRlbSgicHN3YW4iLCBwc193YW4sIHNpemVvZihwc193YW4pKTsNCgljZmdfZ2V0X2l0ZW0oImRlZmF1bHRfd2FuX25hbWUiLCBkZWZfd2FuLCBzaXplb2YoZGVmX3dhbikpOw0KCWlmIChzdHJuY21wKGRlZl93YW4sIHBzX3dhbiwgc3RybGVuKHBzX3dhbikpICE9IDApIHsNCgkJZ2V0X21vZGVtX2luZm8oIkFUK0NGVU4/XHJcbiIsICIlZCIsIHAyKTsNCgkJaWYgKGNmdW5fc3RhdCA9PSAxKSB7DQoJCQlnZXRfbW9kZW1faW5mbygiQVQrQ0ZVTj00XHJcbiIsIE5VTEwsIE5VTEwpOw0KCQl9DQoJfQ0KfQ0KDQpzdGF0aWMgaW50IGxwYV9leGVfdXBkYXRhKHZvaWQpDQp7DQoJaW50IGNvZGUgPSAtMTsNCglpbnQgaSA9IDA7DQoJY2hhciB1cGRhdGFfcmV0cnlbNl0gPSB7MH07DQoJaW50IGNvdW50ID0gMDsNCi8vZHRlc3QNCiNpZiAxDQoJY2ZnX2dldF9pdGVtKCJscGFfdXBkYXRhX3JldHJ5IiwgdXBkYXRhX3JldHJ5LCBzaXplb2YodXBkYXRhX3JldHJ5KSk7DQoJY291bnQgPSBhdG9pKHVwZGF0YV9yZXRyeSk7DQoJaWYgKGNvdW50IDw9IDAgfHwgY291bnQgPiAxMCkgeyAvL2t3IDMNCgkJY291bnQgPSAxOw0KCX0NCgkNCglpZiAoMCA9PSBscGFfY2hlY2tfc3RhdHVzKDYwKSkgew0KCQlwcmludGYoImxwYV9leGVfdXBkYXRhIG5vdCByZWFkeVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCglmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KCQljb2RlID0gbHBhX3RyaWdnZXJfdXBkYXRhKCk7DQoJCWlmIChjb2RlID09IDAgfHwgaSA9PSBjb3VudC0xKQ0KCQkJYnJlYWs7DQoJCS8vcmV0cnkNCgkJc2xlZXAoMzApOw0KCX0NCgkNCglpZiAoY29kZSAhPSAwKSB7DQoJCXByaW50ZigibHBhX2V4ZV91cGRhdGEgdXBkYXRhIGZhaWxcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KI2VuZGlmCQkJCQkJCQkJCQkNCglyZXR1cm4gMDsNCn0NCi8vY2hlY2sgc2ltICYmIG5ldCAmJiBzbnRwIHJlYWR5DQppbnQgbHBhX2NoZWNrX3N0YXR1cyhpbnQgcmV0cnkpDQp7DQoJaW50IGkgPSAwOw0KCWludCByZXMgPSAtMTsNCg0KCS8vK1pQQklDDQoJZm9yKGkgPSAwOyBpIDwgcmV0cnk7IGkrKykgewkNCgkJY2hhciBzbnRwX3Jlc1syMF0gPSB7MH07DQoJCWNmZ19nZXRfaXRlbSgienBiaWNfcGIiLCBzbnRwX3Jlcywgc2l6ZW9mKHNudHBfcmVzKSk7DQoJCWlmIChzdHJjbXAoc250cF9yZXMsICJyZWFkeSIpID09IDApIHsNCgkJCXJlcyA9IDE7DQoJCQlicmVhazsNCgkJfQ0KCQlwcmludGYoImxwYSB6cGJpY19wYjogJXNcbiIsIHNudHBfcmVzKTsNCgkJc2xlZXAoNik7DQoJfQ0KCWlmIChyZXMgIT0gMSkgew0KCQlwcmludGYoImxwYSBzaW0gbm90IHJlYWR5XG4iKTsNCgkJcmV0dXJuIDA7DQoJfQ0KDQoJLy9uZXQNCglyZXMgPSAtMTsNCglmb3IoaSA9IDA7IGkgPCByZXRyeTsgaSsrKSB7DQoJCXJlcyA9IGRlZmF1bHRfcm91dGVfY2hlY2soKTsNCgkJaWYgKHJlcyA9PSAxKQ0KCQkJYnJlYWs7DQoJCXByaW50ZigibHBhIGRlZmF1bHRfcm91dGVfY2hlY2s6ICVkXG4iLCByZXMpOw0KCQlzbGVlcCg2KTsNCgl9DQoJaWYgKHJlcyAhPSAxKSB7DQoJCXByaW50ZigibHBhIGNoZWNrIG5ldCB0aW1lb3V0XG4iKTsNCgkJcmV0dXJuIDA7DQoJfQ0KDQoJLy9zbnRwLCBubyArem1taQ0KCXJlcyA9IC0xOw0KCWZvcihpID0gMDsgaSA8IHJldHJ5OyBpKyspIHsJDQoJCWNoYXIgc250cF9yZXNbMjBdID0gezB9Ow0KCQljZmdfZ2V0X2l0ZW0oInNudHBfcHJvY2Vzc19yZXN1bHQiLCBzbnRwX3Jlcywgc2l6ZW9mKHNudHBfcmVzKSk7DQoJCWlmIChzdHJjbXAoc250cF9yZXMsICJzdWNjZXNzIikgPT0gMCkgew0KCQkJcmVzID0gMTsNCgkJCWJyZWFrOw0KCQl9DQoJCXByaW50ZigibHBhIHNudHBfcHJvY2Vzc19yZXN1bHQ6ICVzXG4iLCBzbnRwX3Jlcyk7DQoJCXNsZWVwKDYpOw0KCX0NCglpZiAocmVzICE9IDEpIHsNCgkJcHJpbnRmKCJscGEgY2hlY2sgc250cCB0aW1lb3V0XG4iKTsNCgkJcmV0dXJuIDA7DQoJfQ0KDQoJLy9vcGVuIGNoYW5uZWwNCglyZXMgPSAtMTsNCglmb3IoaSA9IDA7IGkgPCA0OyBpKyspIHsJDQoJCXJlcyA9IGxwYV9vcGVuX2xvZ2ljYWxfY2hhbm5lbCgpOw0KCQlpZiAocmVzID09IDApDQoJCQlicmVhazsNCgkJcHJpbnRmKCJscGEgbHBhX29wZW5fbG9naWNhbF9jaGFubmVsOiAlZFxuIiwgcmVzKTsNCgkJc2xlZXAoMik7DQoJfQ0KCWlmIChyZXMgIT0gMCkgew0KCQlwcmludGYoImxwYSBvcGVuIGNoYW5uZWwgZmFpbFxuIik7DQoJCXJldHVybiAwOw0KCX0NCg0KCS8vLy9zZWxlY3QgYXBwIGlkDQoJcmVzID0gLTE7DQoJZm9yKGkgPSAwOyBpIDwgNDsgaSsrKSB7CQ0KCQlyZXMgPSBscGFfc2VsZWN0X2FpZCgpOw0KCQlpZiAocmVzID09IDApDQoJCQlicmVhazsNCgkJcHJpbnRmKCJscGEgbHBhX3NlbGVjdF9haWQ6ICVkXG4iLCByZXMpOw0KCQlzbGVlcCgyKTsNCgl9DQoJaWYgKHJlcyAhPSAwKSB7DQoJCXByaW50ZigibHBhIHNlbGVjdCBmYWlsXG4iKTsNCgkJcmV0dXJuIDA7DQoJfQ0KCXJldHVybiAxOw0KfQ0KDQovL7Lp0a/Su9Cpucy2qLLOyv0NCmludCBscGFfaW5pdCh2b2lkKQ0Kew0KCS8venBiaWMgJiYgc250cCAmJiBuZXQgb2ssIGlmIHVzZSB3bGFuIGNsb3NlIG1vZGVtLCBvcGVuIGNoYW5uZWwgc2VsZWN0IGlzZHINCglpZiAoMCA9PSBscGFfY2hlY2tfc3RhdHVzKDYwKSkgew0KCQlwcmludGYoImxwYSBub3QgcmVhZHlcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJaWYoMCAhPSBscGFfZ2V0X2ltZWkoZ19pbWVpLCBzaXplb2YoZ19pbWVpKSkpIHsNCgkJcHJpbnRmKCJscGEgbm8gaW1laVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCglyZXR1cm4gMDsNCn0NCmludCBscGFfdW5pbml0KHZvaWQpDQp7DQoJbHBhX2Nsb3NlX2xvZ2ljYWxfY2hhbm5lbCgxKTsNCg0KCXJldHVybiAwOw0KfQ0KDQpzdGF0aWMgY2hhciAqbHBhX3RpZ2dlcl9zZXNzaW9uKGNoYXIgKnBhdGgsIGNoYXIgKnJlcV9kYXRhKQ0Kew0KCWludCByZXQgPSAtMTsNCglpbnQgY29udF9sZW4gPSAwOw0KCWh0dHBzX2NvbnRleHRfdCBodHRwc19jdCA9IHswfTsNCgljaGFyIHRyaWdnZXJfcG9ydFs2XSA9IHswfTsNCgljaGFyIHRyaWdnZXJfaG9zdFtNQVhfVVJMX0xFTl0gPSB7MH07DQoJY2hhciAqaHR0cHNfcmVxID0gTlVMTDsNCgljaGFyICpodHRwc19yZXNwID0gTlVMTDsNCglpbnQgaHR0cHNfcmVxX2xlbiA9IDA7DQoJLy9rdyAzDQoJLy9pZiAoaHR0cHNfcmVxX2xlbiA+IFRSSUdfSFRUUF9NQVhfTEVOKQ0KCS8vCXJldHVybiBOVUxMOw0KCQ0KCWNmZ19nZXRfaXRlbSgibHBhX3RyaWdnZXJfcG9ydCIsIHRyaWdnZXJfcG9ydCwgc2l6ZW9mKHRyaWdnZXJfcG9ydCkpOw0KCWNmZ19nZXRfaXRlbSgibHBhX3RyaWdnZXJfaG9zdCIsIHRyaWdnZXJfaG9zdCwgc2l6ZW9mKHRyaWdnZXJfaG9zdCkpOw0KDQoJU1NMX2xpYnJhcnlfaW5pdCgpOw0KCWh0dHBzX2N0LnBvcnQgPSBhdG9pKHRyaWdnZXJfcG9ydCk7DQoJaHR0cHNfY3QuaG9zdCA9IHRyaWdnZXJfaG9zdDsNCglodHRwc19jdC5wYXRoID0gcGF0aDsNCglyZXQgPSBodHRwc19pbml0KCZodHRwc19jdCk7DQoJaWYgKHJldCAhPSAwKSB7DQoJCXByaW50ZigiW3RyaWdnZXJdIGh0dHBzX2luaXQgZmFpbFxuIik7DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KCWh0dHBzX3JlcV9sZW4gPSBzdHJsZW4odHJpZ2dlcl9odHRwc19yZXEpK3N0cmxlbihodHRwc19jdC5wYXRoKStzdHJsZW4oaHR0cHNfY3QuaG9zdCkrc3RybGVuKHJlcV9kYXRhKSszMjsNCglodHRwc19yZXEgPSBtYWxsb2MoaHR0cHNfcmVxX2xlbik7DQoJaWYgKGh0dHBzX3JlcSA9PSBOVUxMKSB7DQoJCWh0dHBzX3VuaW5pdCgmaHR0cHNfY3QpOw0KCQlyZXR1cm4gTlVMTDsNCgl9DQoJbWVtc2V0KGh0dHBzX3JlcSwgMCwgaHR0cHNfcmVxX2xlbik7DQoJcmV0ID0gc25wcmludGYoaHR0cHNfcmVxLCBodHRwc19yZXFfbGVuLCB0cmlnZ2VyX2h0dHBzX3JlcSwNCgkJaHR0cHNfY3QucGF0aCwgaHR0cHNfY3QuaG9zdCwgc3RybGVuKHJlcV9kYXRhKSwgcmVxX2RhdGEpOw0KCQ0KCXByaW50ZigiW3RyaWdnZXJdIHJlcXVlc3QjIyVzIyNcbiIsIGh0dHBzX3JlcSk7DQoJcmV0ID0gaHR0cHNfd3JpdGUoJmh0dHBzX2N0LCBodHRwc19yZXEsIHJldCk7DQoJcHJpbnRmKCJbdHJpZ2dlcl0gaHR0cHNfd3JpdGUgcmV0ID0gJWQuXG4iLCByZXQpOw0KDQoJcmV0ID0gaHR0cHNfZ2V0X3N0YXR1c19jb2RlKCZodHRwc19jdCwgJmNvbnRfbGVuKTsNCglwcmludGYoIlt0cmlnZ2VyXSBodHRwc19yZWN2IGNvZGUgPSAlZC5cbiIsIHJldCk7DQoJaWYocmV0ID09IDIwMCAmJiAoY29udF9sZW4gPiAwICYmIGNvbnRfbGVuIDwgVFJJR19IVFRQX01BWF9MRU4pKQ0KCXsNCgkJaHR0cHNfcmVzcCA9IG1hbGxvYyhjb250X2xlbiArIDEpOw0KCQlpZiAoaHR0cHNfcmVzcCA9PSBOVUxMKSB7DQoJCQlodHRwc191bmluaXQoJmh0dHBzX2N0KTsNCgkJCWZyZWUoaHR0cHNfcmVxKTsNCgkJCXByaW50ZigiW3RyaWdnZXJdIGh0dHBzX3Jlc3BfY29udCBOVUxMLlxuIik7DQoJCQlyZXR1cm4gTlVMTDsNCgkJfQ0KDQoJCW1lbXNldChodHRwc19yZXNwLCAwLCBjb250X2xlbiArIDEpOw0KCQlyZXQgPSBodHRwc19yZWFkX2NvbnRlbnQoJmh0dHBzX2N0LCBodHRwc19yZXNwLCBjb250X2xlbik7DQoJCWlmKGNvbnRfbGVuID09IHJldCkNCgkJew0KCQkJaHR0cHNfcmVzcFtyZXRdID0gJ1wwJzsJLy/X1rf7tK694cr4serKtg0KCQkJcHJpbnRmKCJbdHJpZ2dlcl0gaHR0cHNfd3JpdGUgaHR0cHNfcmVzcF9jb250ZW50ID0gXG4gJXMuXG4iLCBodHRwc19yZXNwKTsNCgkJfQ0KCX0NCgkNCglodHRwc191bmluaXQoJmh0dHBzX2N0KTsNCglmcmVlKGh0dHBzX3JlcSk7DQoJcmV0dXJuIGh0dHBzX3Jlc3A7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovLw0KLy+007Slt6K3/s7xxvey6dGv1rjB7g0KLy8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpjaGFyICpscGFfdHJpZ2dlcl9ldmVudChpbnQgKm5leHRfc3RlcCkNCnsNCgljaGFyICp0cmlnZ2VyX2RhdGEgPSBOVUxMOw0KCWNoYXIgKmh0dHBzX3Jlc3BfY29udCA9IE5VTEw7DQoJY2hhciAqY29tbWFuZCA9IE5VTEw7DQoJY2hhciB0cmlnZ2VyX2V2ZW50W01BWF9VUkxfTEVOXSA9IHswfTsNCg0KCXRyaWdnZXJfZGF0YSA9IGxwYV9nZXRfdHJpZ2dlcl9kYXRhKCk7DQoJaWYgKHRyaWdnZXJfZGF0YSA9PSBOVUxMKSB7DQoJCXByaW50ZigiW3RyaWdnZXJdIHJlcXVlc3QgZGF0YSBOVUxMLlxuIik7DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KCWNmZ19nZXRfaXRlbSgibHBhX3RyaWdnZXJfZXZlbnRfdXJsIiwgdHJpZ2dlcl9ldmVudCwgc2l6ZW9mKHRyaWdnZXJfZXZlbnQpKTsNCglodHRwc19yZXNwX2NvbnQgPSBscGFfdGlnZ2VyX3Nlc3Npb24odHJpZ2dlcl9ldmVudCwgdHJpZ2dlcl9kYXRhKTsNCglpZiAoaHR0cHNfcmVzcF9jb250ICE9IE5VTEwpIHsNCgkJY29tbWFuZCA9IGxwYV9wYXJzZV90cmlnZ2VyX3Jlc3AoaHR0cHNfcmVzcF9jb250LCBuZXh0X3N0ZXApOw0KCQlmcmVlKGh0dHBzX3Jlc3BfY29udCk7DQoJfQ0KCQ0KCWZyZWUodHJpZ2dlcl9kYXRhKTsNCglyZXR1cm4gY29tbWFuZDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vDQovL8/ytKW3orf+zvHG98nPsajK/b7dDQovLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmludCBscGFfdHJpZ2dlcl91cGRhdGEodm9pZCkNCnsNCgljaGFyICp0cmlnZ2VyX2RhdGEgPSBOVUxMOw0KCWNoYXIgKmh0dHBzX3Jlc3BfY29udCA9IE5VTEw7DQoJY2hhciAqY29kZSA9IE5VTEw7DQoJaW50IHJlc19jb2RlID0gLTE7DQoJY2hhciB0cmlnZ2VyX3VwZGF0YVtNQVhfVVJMX0xFTl0gPSB7MH07DQoNCgl0cmlnZ2VyX2RhdGEgPSBscGFfZ2V0X3VwZGF0YV9kYXRhKCk7DQoJaWYgKHRyaWdnZXJfZGF0YSA9PSBOVUxMKSB7DQoJCXByaW50ZigiW3RyaWdnZXJdIHJlcXVlc3QgZGF0YSBOVUxMLlxuIik7DQoJCXJldHVybiBOVUxMOw0KCX0NCgkNCgljZmdfZ2V0X2l0ZW0oImxwYV90cmlnZ2VyX3VwZGF0YV91cmwiLCB0cmlnZ2VyX3VwZGF0YSwgc2l6ZW9mKHRyaWdnZXJfdXBkYXRhKSk7DQoJaHR0cHNfcmVzcF9jb250ID0gbHBhX3RpZ2dlcl9zZXNzaW9uKHRyaWdnZXJfdXBkYXRhLCB0cmlnZ2VyX2RhdGEpOw0KCWlmIChodHRwc19yZXNwX2NvbnQgIT0gTlVMTCkgew0KCQljb2RlID0gbHBhX3BhcnNlX3VwZGF0YV9yZXNwKGh0dHBzX3Jlc3BfY29udCk7DQoJCWlmIChjb2RlICE9IE5VTEwpIHsNCgkJCWVycm5vID0gMDsNCgkJCXJlc19jb2RlID0gc3RydG9sKGNvZGUsIE5VTEwsIDEwKTsNCgkJCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQNCgkJCXsNCgkJCQlwcmludGYoInN0cnRvbCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KCQkJfQ0KCQkJZnJlZShjb2RlKTsNCgkJfQ0KCQlmcmVlKGh0dHBzX3Jlc3BfY29udCk7DQoJfQ0KCQ0KCWZyZWUodHJpZ2dlcl9kYXRhKTsNCglyZXR1cm4gcmVzX2NvZGU7DQp9DQoNCi8vtfS157XIs6G+sKOsyOe05tTaaWNjaWS8pLvusqLJz7Goo6yyu7Tm1NrWsb3T199ldmVudKOs1tjQwrSlt6LPwtTYtciy2df3DQppbnQgbHBhX2V4Y2VwdGlvbl9wcm9jZXNzKHZvaWQpDQp7DQoJY2hhciBoYXNfaWNjaWRbSUNDSURfTEVOKzFdID0gezB9Ow0KCWludCBzdGF0dXMgPSAwOw0KCWludCByZXMgPSAwOw0KCQ0KCWNmZ19nZXRfaXRlbSgibHBhX2JwcF9pY2NpZCIsIGhhc19pY2NpZCwgc2l6ZW9mKGhhc19pY2NpZCkpOw0KCWlmIChzdHJsZW4oaGFzX2ljY2lkKSA9PSBJQ0NJRF9MRU4pIHsNCgkJc3RhdHVzID0gbHBhX2dldF9wcm9maWxlX3N0YXRlKGhhc19pY2NpZCk7DQoJCWlmIChzdGF0dXMgPT0gMSB8fCBzdGF0dXMgPT0gMCkgew0KCQkJcmVzID0gbHBhX2VuYWJsZV9wcm9maWxlKGhhc19pY2NpZCk7DQoJCQlpZiAocmVzID09IDApIHsNCgkJCQljZmdfc2V0KCJscGFfYnBwX2ljY2lkIiwgIiIpOw0KCQkJCWNmZ19zYXZlKCk7DQoJCQkJcmV0dXJuIDA7DQoJCQl9DQoJCQlyZXR1cm4gLTE7DQoJCX0NCgl9DQoNCglyZXR1cm4gMDsNCn0NCg0KaW50IGxwYV9kb3dubG9hZF9wcm9maWxlKGNoYXIgKmFjdGl2ZWNvZGUsIGNoYXIgKmNvbmZpcm1jb2RlKQ0Kew0KCWludCByZXMgPSAtMTsNCg0KCWxwYV9jbG9zZV9jZnVuKCk7DQoNCgltZW1zZXQoY3VyZW50X2ljY2lkLCAwLCBzaXplb2YoY3VyZW50X2ljY2lkKSk7DQoJcmVzID0gZG93bmxvYWRQcm9maWxlQnlBYyhhY3RpdmVjb2RlLCBjb25maXJtY29kZSk7DQoNCgkvL7K7udyzybmm0+u38aOstrzSqsnPsagNCglyZXMgPSBscGFfZW5hYmxlX3Byb2ZpbGUoY3VyZW50X2ljY2lkKTsNCglpZiAocmVzID09IDApIHsNCgkJY2ZnX3NldCgibHBhX2JwcF9pY2NpZCIsICIiKTsNCgkJY2ZnX3NhdmUoKTsNCgl9DQoNCglscGFfb3Blbl9jZnVuKCk7DQoJDQoJcmV0dXJuIHJlczsNCn0NCg0KaW50IGxwYV9lbmFibGVfcHJvZmlsZShjaGFyICppY2NpZCkNCnsNCglpbnQgcmVzID0gMDsNCglpbnQgY29kZSA9IDA7DQoJDQoJcmVzID0gZW5hYmxlUHJvZmlsZShpY2NpZCk7DQoJaWYgKHJlcyA9PSAwKSB7DQoJCWNmZ19zZXQoInpwYmljX3BiIiwgIiIpOy8vd2FpdCBzaW0gcmVhZHkNCgkJY2ZnX3NldCgibHBhX2xhc3RfcmVzIiwgInN1Y2Nlc3MiKTsNCgkJbHBhX2Nsb3NlX2xvZ2ljYWxfY2hhbm5lbCgwKTsNCgkJc2xlZXAoMik7DQoJfQ0KCWVsc2UgaWYgKHJlcyA9PSAyKSB7DQoJCWNmZ19zZXQoImxwYV9sYXN0X3JlcyIsICJzdWNjZXNzIik7DQoJfQ0KCWVsc2Ugew0KCQljZmdfc2V0KCJscGFfbGFzdF9yZXMiLCAiZmFpbCIpOw0KCX0NCg0KCWNvZGUgPSBscGFfZXhlX3VwZGF0YSgpOw0KIAlpZiAoY29kZSAhPSAwKSB7DQoJCXByaW50ZigibHBhX2VuYWJsZV9wcm9maWxlIHVwZGF0YSBmYWlsXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCiAJcmV0dXJuIDA7DQp9DQoNCmludCBscGFfZGlzYWJsZV9wcm9maWxlKGNoYXIgKmljY2lkKQ0Kew0KCWludCByZXMgPSAwOw0KCWludCBjb2RlID0gMDsNCgkNCglyZXMgPSBkaXNhYmxlUHJvZmlsZShpY2NpZCk7DQoJaWYgKHJlcyA9PSAwKSB7DQoJCWNmZ19zZXQoInpwYmljX3BiIiwgIiIpOy8vd2FpdCBzaW0gcmVhZHkNCgkJY2ZnX3NldCgibHBhX2xhc3RfcmVzIiwgInN1Y2Nlc3MiKTsNCgkJbHBhX2Nsb3NlX2xvZ2ljYWxfY2hhbm5lbCgwKTsNCgkJc2xlZXAoMik7DQoJfQ0KCWVsc2UgaWYgKHJlcyA9PSAyKSB7DQoJCWNmZ19zZXQoImxwYV9sYXN0X3JlcyIsICJzdWNjZXNzIik7DQoJfQ0KCWVsc2Ugew0KCQljZmdfc2V0KCJscGFfbGFzdF9yZXMiLCAiZmFpbCIpOw0KCX0NCgkNCgljb2RlID0gbHBhX2V4ZV91cGRhdGEoKTsNCiAJaWYgKGNvZGUgIT0gMCkgew0KCQlwcmludGYoImxwYV9kaXNhYmxlX3Byb2ZpbGUgdXBkYXRhIGZhaWxcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KIAlyZXR1cm4gMDsNCn0NCg0KaW50IGxwYV9kZWxldGVfcHJvZmlsZShjaGFyICppY2NpZCkNCnsNCglpbnQgcmVzID0gMDsNCglpbnQgY29kZSA9IDA7DQoJDQoJcmVzID0gZGVsZXRlUHJvZmlsZShpY2NpZCk7DQoJaWYgKHJlcyA9PSAwKSB7DQoJCWNmZ19zZXQoImxwYV9sYXN0X3JlcyIsICJzdWNjZXNzIik7DQoJCXNsZWVwKDIpOw0KCX0NCgllbHNlIGlmIChyZXMgPT0gMSkgew0KCQljZmdfc2V0KCJscGFfbGFzdF9yZXMiLCAic3VjY2VzcyIpOw0KCX0NCgllbHNlIHsNCgkJY2ZnX3NldCgibHBhX2xhc3RfcmVzIiwgImZhaWwiKTsNCgl9DQoJDQoJY29kZSA9IGxwYV9leGVfdXBkYXRhKCk7DQogCWlmIChjb2RlICE9IDApIHsNCgkJcHJpbnRmKCJscGFfZGlzYWJsZV9wcm9maWxlIHVwZGF0YSBmYWlsXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCiAJcmV0dXJuIDA7DQp9DQoNCmludCBscGFfbWVtb3J5X3Jlc2V0KHZvaWQpDQp7DQoJaW50IHJlcyA9IDA7DQoJaW50IHN0YXRlID0gMDsNCglpbnQgY29kZSA9IDA7DQoNCglzdGF0ZSA9IGxwYV9nZXRfY3VyX2ljY2lkX3N0YXRlKCk7DQoJcmVzID0gbWVtb3J5UmVzZXQoKTsNCglpZiAocmVzID09IDApIHsNCgkJaWYoc3RhdGUgPT0gMSkgew0KCQkJY2ZnX3NldCgienBiaWNfcGIiLCAiIik7Ly93YWl0IHNpbSByZWFkeQ0KCQkJbHBhX2Nsb3NlX2xvZ2ljYWxfY2hhbm5lbCgwKTsNCgkJCXByaW50ZigibHBhIHpwYmljX3BiIHJlc2V0XG4iKTsNCgkJfQ0KCQljZmdfc2V0KCJscGFfbGFzdF9yZXMiLCAic3VjY2VzcyIpOw0KCQlzbGVlcCgyKTsvL3dhaXQgc2ltIHJlYWR5DQoJfQ0KCWVsc2UgaWYgKHJlcyA9PSAxKSB7DQoJCWNmZ19zZXQoImxwYV9sYXN0X3JlcyIsICJzdWNjZXNzIik7DQoJfQ0KCWVsc2Ugew0KCQljZmdfc2V0KCJscGFfbGFzdF9yZXMiLCAiZmFpbCIpOw0KCX0NCgkNCgljb2RlID0gbHBhX2V4ZV91cGRhdGEoKTsNCiAJaWYgKGNvZGUgIT0gMCkgew0KCQlwcmludGYoImxwYV9kaXNhYmxlX3Byb2ZpbGUgdXBkYXRhIGZhaWxcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KIAlyZXR1cm4gMDsNCn0NCg0KaW50IGxwYV9vcGVuX2xvZ2ljYWxfY2hhbm5lbCh2b2lkKQ0Kew0KICAgIGNoYXIgKmFwZHUgPSBOVUxMOw0KCWludCBjaGFuID0gMDsNCglpZiAoZ19vcGVuX2NoYW5uZWxfZmxhZyA9PSAwKSB7DQoJCWFwZHUgPSBPcGVuTG9naWNhbENoYW5uZWwoKTsNCgkJaWYgKGFwZHUgPT0gTlVMTCkNCgkJCXJldHVybiAtMTsNCgkJZXJybm8gPSAwOw0KCQljaGFuID0gc3RydG9sKGFwZHUsIE5VTEwsIDE2KTsNCgkJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBFUlJOTy5OT1RfQ0hFQ0tFRA0KCQl7DQoJCQlwcmludGYoInN0cnRvbCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KCQl9DQoJCWZyZWUoYXBkdSk7DQoJCWlmIChjaGFuIDwgMCB8fCBjaGFuID4gMykNCgkJCXJldHVybiAtMTsNCgkJZ19vcGVuX2NoYW5uZWxfZmxhZyA9IDE7DQoJCWdfY2hhbl9pZCA9IGNoYW47DQoJfSANCglyZXR1cm4gMDsNCn0NCi8vZmxhZyA9IDAsIHdoZW4gcmVmcmVzaCBub3QgbmVlZCBjbG9zZQ0KaW50IGxwYV9jbG9zZV9sb2dpY2FsX2NoYW5uZWwoaW50IGZsYWcpDQp7DQogICAgY2hhciAqYXBkdSA9IE5VTEw7DQoJaW50IHJlcyA9IDA7DQoJaWYgKGZsYWcgPT0gMSAmJiBnX29wZW5fY2hhbm5lbF9mbGFnID09IDEpIHsNCgkJcmVzID0gQ2xvc2VMb2dpY2FsQ2hhbm5lbChnX2NoYW5faWQpOw0KCQlwcmludGYoImxwYV9jbG9zZV9sb2dpY2FsX2NoYW5uZWw6JWQsIHJlczolZFxuIiwgZ19jaGFuX2lkLCByZXMpOw0KCX0NCglnX2NoYW5faWQgPSAwOw0KCWdfb3Blbl9jaGFubmVsX2ZsYWcgPSAwOw0KCQ0KCXJldHVybiByZXM7DQp9DQoNCg==