PD9waHAKY2xhc3MgQmFzaWNVc2VyIHsKCXByb3RlY3RlZCAkdXNlciA9IE5VTEw7CglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHVzZXJuYW1lKSB7CgkJaWYoZmlsZV9leGlzdHMoJ3VzZXIvJy5zdHJ0b2xvd2VyKCR1c2VybmFtZSkuJy54bWwnKSkgewoJCQkkdGhpcy0+dXNlciA9IHNpbXBsZXhtbF9sb2FkX2ZpbGUoJ3VzZXIvJy5zdHJ0b2xvd2VyKCR1c2VybmFtZSkuJy54bWwnKTsKCQl9CgkJZWxzZSAkdGhpcy0+dXNlciA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygnPD94bWwgdmVyc2lvbj0iMS4wIj8+PHVzZXI+PHVzZXJuYW1lPjwvdXNlcm5hbWU+PC91c2VyPicpOwoJfQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoJHVzZXJuYW1lKSB7CgkJJHVzZXIgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJzw/eG1sIHZlcnNpb249IjEuMCI/Pjx1c2VyPjx1c2VybmFtZT4nLiR1c2VybmFtZS4nPC91c2VybmFtZT48L3VzZXI+Jyk7CgkJZmlsZV9wdXRfY29udGVudHMoJ3VzZXIvJy5zdHJ0b2xvd2VyKCR1c2VyLT51c2VybmFtZSkuJy54bWwnLCAkdXNlci0+YXNYTUwoKSk7CgkJcmV0dXJuIG5ldyBVc2VyKCR1c2VybmFtZSk7Cgl9CglwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpIHsKCQlyZXR1cm4gKHN0cmluZykgJHRoaXMtPnVzZXItPnVzZXJuYW1lOwoJfQoJcHVibGljIGZ1bmN0aW9uIF9fZ2V0KCRkYXRhKSB7CgkJaWYoIWlzc2V0KCR0aGlzLT51c2VyLT4kZGF0YSkpIHJldHVybiBOVUxMOwoJCXJldHVybiAkdGhpcy0+dXNlci0+JGRhdGE7Cgl9CglwdWJsaWMgZnVuY3Rpb24gX19zZXQoJGRhdGEsICR2YWx1ZSkgewoJCSR0aGlzLT51c2VyLT4kZGF0YSA9ICR2YWx1ZTsKCX0KCXB1YmxpYyBmdW5jdGlvbiBzYXZlKCkgewoJCWZpbGVfcHV0X2NvbnRlbnRzKCd1c2VyLycuc3RydG9sb3dlcigkdGhpcy0+dXNlci0+dXNlcm5hbWUpLicueG1sJywgJHRoaXMtPnVzZXItPmFzWE1MKCkpOwoJfQp9Cj8+ PD9waHAKY2xhc3MgQmFzaWNTZXNzaW9uIHsKCXB1YmxpYyAkdXNlcm9iaiA9ICdCYXNpY1VzZXInOwoJcHVibGljICRzZXNzaW9uID0gTlVMTDsKCS8vIDUgbWludXRlIHRpbWVvdXQKCWNvbnN0IFNFU1NJT05fVElNRU9VVCA9IDMwMDsKCXByaXZhdGUgJGF1dG9zYXZlID0gdHJ1ZTsKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc2Vzc2lvbmlkLCAkYXV0b3NhdmUgPSB0cnVlKSB7CgkKCQkkdGhpcy0+dHJ1bmNhdGVTZXNzaW9ucygpOwoJCSR0aGlzLT5hdXRvc2F2ZSA9ICRhdXRvc2F2ZTsKCQlpZihmaWxlX2V4aXN0cygnc2Vzc2lvbi8nLnN0cnRvbG93ZXIoJHNlc3Npb25pZCkuJy54bWwnKSkgewoJCQkkdGhpcy0+c2Vzc2lvbiA9IHNpbXBsZXhtbF9sb2FkX2ZpbGUoJ3Nlc3Npb24vJy5zdHJ0b2xvd2VyKCRzZXNzaW9uaWQpLicueG1sJyk7CgkJCXJlcXVpcmVfb25jZSgkdGhpcy0+dXNlcm9iai4nLmNsYXNzLnBocCcpOwoJCQkkdXNlcm9iaiA9ICR0aGlzLT51c2Vyb2JqOwoJCQkkdGhpcy0+dXNlciA9IG5ldyAkdXNlcm9iaigkdGhpcy0+c2Vzc2lvbi0+dXNlcm5hbWUpOwoJCX0KCQllbHNlIHsKCQkJJHNlc3Npb25JRCA9IHVuaXFpZCgnc2Vzc2lvbl8nKTsKCQkJJHRoaXMtPnNlc3Npb24gPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJzw/eG1sIHZlcnNpb249IjEuMCI/PjxzZXNzaW9uPjx1c2VybmFtZT48L3VzZXJuYW1lPjxzZXNzaW9uaWQ+Jy4kc2Vzc2lvbklELic8L3Nlc3Npb25pZD48L3Nlc3Npb24+Jyk7CgkJfQoJfQoJcHVibGljIGZ1bmN0aW9uIGtpbGwoKSB7CgkJdW5saW5rKCdzZXNzaW9uLycuc3RydG9sb3dlcigkdGhpcy0+c2Vzc2lvbi0+c2Vzc2lvbmlkKS4nLnhtbCcpOwoJfQoJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKSB7CgkJaWYoJHRoaXMtPmF1dG9zYXZlKSB7CgkJCSR0aGlzLT5zYXZlKCk7CgkJCSR0aGlzLT51c2VyLT5zYXZlKCk7CgkJfQoJfQoJcHVibGljIGZ1bmN0aW9uIHRydW5jYXRlU2Vzc2lvbnMoKSB7CgkJaWYgKCRoYW5kbGUgPSBvcGVuZGlyKCdzZXNzaW9uJykpIHsKCQkJd2hpbGUgKGZhbHNlICE9PSAoJGZpbGUgPSByZWFkZGlyKCRoYW5kbGUpKSkgewoJCQkJaWYoZmlsZWF0aW1lKCRmaWxlKSArIHNlbGY6OlNFU1NJT05fVElNRU9VVCA8IHRpbWUoKSkgdW5saW5rKCRmaWxlKTsKCQkJfQoJCQljbG9zZWRpcigkaGFuZGxlKTsKCQl9Cgl9CglwdWJsaWMgZnVuY3Rpb24gX19nZXQoJGRhdGEpIHsKCQlpZigkdGhpcy0+dXNlci0+JGRhdGEgIT09IE5VTEwpIHJldHVybiAkdGhpcy0+dXNlci0+JGRhdGE7CgkJaWYoIWlzc2V0KCR0aGlzLT5zZXNzaW9uLT4kZGF0YSkpIHJldHVybiBOVUxMOwoJCXJldHVybiAkdGhpcy0+c2Vzc2lvbi0+JGRhdGE7Cgl9CglwdWJsaWMgZnVuY3Rpb24gY2hhbmdlVXNlcigkdXNlcikgewoJCSR0aGlzLT5zZXNzaW9uLT51c2VybmFtZSA9ICR1c2VyOwoJCSR0aGlzLT51c2VyID0gbmV3IFVzZXIoJHVzZXIpOwoJfQoJcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKSB7CgkJcmV0dXJuIChzdHJpbmcpICR0aGlzLT5zZXNzaW9uLT5zZXNzaW9uaWQ7Cgl9CglwdWJsaWMgZnVuY3Rpb24gc2F2ZSgpIHsKCQlpZihmaWxlX2V4aXN0cygnc2Vzc2lvbi8nLnN0cnRvbG93ZXIoJHRoaXMtPnNlc3Npb24tPnNlc3Npb25pZCkuJy54bWwnKSkgZmlsZV9wdXRfY29udGVudHMoJ3Nlc3Npb24vJy5zdHJ0b2xvd2VyKCR0aGlzLT5zZXNzaW9uLT5zZXNzaW9uaWQpLicueG1sJywgJHRoaXMtPnNlc3Npb24tPmFzWE1MKCkpOwoJfQp9Cj8+