LyoKICogRnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgVFNDMjAwMCBjb250cm9sbGVyIG9uIFRSQUIgYm9hcmQgKHVzZWQgZm9yIHNjYW5uaW5nCiAqIHRoZXJtbyBzZW5zb3JzKQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWFydGluIEtyYXVzZSwgVFEtU3lzdGVtcyBHbWJILCBtYXJ0aW4ua3JhdXNlQHRxcy5kZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDIgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgV29sZmdhbmcgRGVuaywgd2RAZGVueC5kZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPHMzYzI0MDAuaD4KI2luY2x1ZGUgPGRpdjY0Lmg+CiNpbmNsdWRlICJ0c2MyMDAwLmgiCgojaW5jbHVkZSAiUHQxMDAwX3RlbXBfZGF0YS5oIgoKLyogaGVscGVyIGZ1bmN0aW9uICovCiNkZWZpbmUgYWJzKHZhbHVlKSAoKCh2YWx1ZSkgPCAwKSA/ICgodmFsdWUpKi0xKSA6ICh2YWx1ZSkpCgovKgogKiBNYXhpbWFsIGFsbG93ZWQgZGV2aWF0aW9uIGJldHdlZW4gdHdvIGltbWVkaWF0ZSBtZWFzc3VybWVudHMgb2YgYW4gYW5hbG9nCiAqIHRoZXJtbyBjaGFubmVsLiAxIERJR0lUID0gMC4wMjc2ILBDLiBUaGlzIGlzIHVzZWQgdG8gZmlsdGVyIHNwb3JhZGljCiAqICJqdW1wcyIgaW4gbWVhc3VybWVudC4KICovCiNkZWZpbmUgTUFYX0RFVklBVElPTgkxOAkvKiB1bml0OiBESUdJVHMgb2YgYWRjOyAxOCBESUdJVCA9IDAuNSCwQyAqLwoKdm9pZCBzcGlfaW5pdCh2b2lkKQp7CglTM0MyNFgwX0dQSU8gKiBjb25zdCBncGlvID0gUzNDMjRYMF9HZXRCYXNlX0dQSU8oKTsKCVMzQzI0WDBfU1BJICogY29uc3Qgc3BpID0gUzNDMjRYMF9HZXRCYXNlX1NQSSgpOwoJaW50IGk7CgoJLyogQ29uZmlndXJlIEkvTyBwb3J0cy4gKi8KCWdwaW8tPlBEQ09OID0gKGdwaW8tPlBEQ09OICYgMHhGM0ZGRkYpIHwgMHgwNDAwMDA7CglncGlvLT5QR0NPTiA9IChncGlvLT5QR0NPTiAmIDB4MEYzRkZGKSB8IDB4MDA4MDAwOwoJZ3Bpby0+UEdDT04gPSAoZ3Bpby0+UEdDT04gJiAweDBDRkZGRikgfCAweDAyMDAwMDsKCWdwaW8tPlBHQ09OID0gKGdwaW8tPlBHQ09OICYgMHgwM0ZGRkYpIHwgMHgwODAwMDA7CgoJQ0xSX0NTX1RPVUNIKCk7CgoJc3BpLT5jaFswXS5TUFBSRSA9IDB4MUY7IC8qIEJhdWQtcmF0ZSBjYS4gNTE0a0h6ICovCglzcGktPmNoWzBdLlNQUElOID0gMHgwMTsgLyogU1BJLU1PU0kgaG9sZHMgTGV2ZWwgYWZ0ZXIgbGFzdCBiaXQgKi8KCXNwaS0+Y2hbMF0uU1BDT04gPSAweDFBOyAvKiBQb2xsaW5nLCBQcmVzY2FsZXIsIE1hc3RlciwgQ1BPTD0wLAoJCQkJICAgIENQSEE9MSAqLwoKCS8qIER1bW15IGJ5dGUgZW5zdXJlcyBjbG9jayB0byBiZSBsb3cuICovCglmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewoJCXNwaS0+Y2hbMF0uU1BUREFUID0gMHhGRjsKCX0KCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKfQoKCnZvaWQgc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSh2b2lkKQp7CglTM0MyNFgwX1NQSSAqIGNvbnN0IHNwaSA9IFMzQzI0WDBfR2V0QmFzZV9TUEkoKTsKCgl3aGlsZSAoIShzcGktPmNoWzBdLlNQU1RBICYgMHgwMSkpOyAvKiB3YWl0IHVudGlsIHRyYW5zZmVyIGlzIGRvbmUgKi8KfQoKCnZvaWQgdHNjMjAwMF93cml0ZSh1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIHNob3J0IGRhdGEpCnsKCVMzQzI0WDBfU1BJICogY29uc3Qgc3BpID0gUzNDMjRYMF9HZXRCYXNlX1NQSSgpOwoJdW5zaWduZWQgaW50IGNvbW1hbmQ7CgoJU0VUX0NTX1RPVUNIKCk7Cgljb21tYW5kID0gcmVnOwoJc3BpLT5jaFswXS5TUFREQVQgPSAoY29tbWFuZCAmIDB4RkYwMCkgPj4gODsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCXNwaS0+Y2hbMF0uU1BUREFUID0gKGNvbW1hbmQgJiAweDAwRkYpOwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoJc3BpLT5jaFswXS5TUFREQVQgPSAoZGF0YSAmIDB4RkYwMCkgPj4gODsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCXNwaS0+Y2hbMF0uU1BUREFUID0gKGRhdGEgJiAweDAwRkYpOwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoKCUNMUl9DU19UT1VDSCgpOwp9CgoKdW5zaWduZWQgc2hvcnQgdHNjMjAwMF9yZWFkICh1bnNpZ25lZCBzaG9ydCByZWcpCnsKCXVuc2lnbmVkIHNob3J0IGNvbW1hbmQsIGRhdGE7CglTM0MyNFgwX1NQSSAqIGNvbnN0IHNwaSA9IFMzQzI0WDBfR2V0QmFzZV9TUEkoKTsKCglTRVRfQ1NfVE9VQ0goKTsKCWNvbW1hbmQgPSAweDgwMDAgfCByZWc7CgoJc3BpLT5jaFswXS5TUFREQVQgPSAoY29tbWFuZCAmIDB4RkYwMCkgPj4gODsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCXNwaS0+Y2hbMF0uU1BUREFUID0gKGNvbW1hbmQgJiAweDAwRkYpOwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoKCXNwaS0+Y2hbMF0uU1BUREFUID0gMHhGRjsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCWRhdGEgPSBzcGktPmNoWzBdLlNQUkRBVDsKCXNwaS0+Y2hbMF0uU1BUREFUID0gMHhGRjsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCglDTFJfQ1NfVE9VQ0goKTsKCXJldHVybiAoc3BpLT5jaFswXS5TUFJEQVQgJiAweDBGRikgfCAoZGF0YSA8PCA4KTsKfQoKCnZvaWQgdHNjMjAwMF9zZXRfbXV4ICh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJUzNDMjRYMF9HUElPICogY29uc3QgZ3BpbyA9IFMzQzI0WDBfR2V0QmFzZV9HUElPKCk7CgoJQ0xSX01VWDFfRU5BQkxFOyBDTFJfTVVYMl9FTkFCTEU7CglDTFJfTVVYM19FTkFCTEU7IENMUl9NVVg0X0VOQUJMRTsKCXN3aXRjaCAoY2hhbm5lbCkgewoJY2FzZSAwOgoJCUNMUl9NVVgwOyBDTFJfTVVYMTsKCQlTRVRfTVVYMV9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDE6CgkJU0VUX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVgxX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMjoKCQlDTFJfTVVYMDsgU0VUX01VWDE7CgkJU0VUX01VWDFfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAzOgoJCVNFVF9NVVgwOyBTRVRfTVVYMTsKCQlTRVRfTVVYMV9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDQ6CgkJQ0xSX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVgyX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgNToKCQlTRVRfTVVYMDsgQ0xSX01VWDE7CgkJU0VUX01VWDJfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSA2OgoJCUNMUl9NVVgwOyBTRVRfTVVYMTsKCQlTRVRfTVVYMl9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDc6CgkJU0VUX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVgyX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgODoKCQlDTFJfTVVYMDsgQ0xSX01VWDE7CgkJU0VUX01VWDNfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSA5OgoJCVNFVF9NVVgwOyBDTFJfTVVYMTsKCQlTRVRfTVVYM19FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDEwOgoJCUNMUl9NVVgwOyBTRVRfTVVYMTsKCQlTRVRfTVVYM19FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDExOgoJCVNFVF9NVVgwOyBTRVRfTVVYMTsKCQlTRVRfTVVYM19FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDEyOgoJCUNMUl9NVVgwOyBDTFJfTVVYMTsKCQlTRVRfTVVYNF9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDEzOgoJCVNFVF9NVVgwOyBDTFJfTVVYMTsKCQlTRVRfTVVYNF9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDE0OgoJCUNMUl9NVVgwOyBTRVRfTVVYMTsKCQlTRVRfTVVYNF9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDE1OgoJCVNFVF9NVVgwOyBTRVRfTVVYMTsKCQlTRVRfTVVYNF9FTkFCTEU7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUNMUl9NVVgwOyBDTFJfTVVYMTsKCX0KfQoKCnZvaWQgdHNjMjAwMF9zZXRfcmFuZ2UgKHVuc2lnbmVkIGludCByYW5nZSkKewoJUzNDMjRYMF9HUElPICogY29uc3QgZ3BpbyA9IFMzQzI0WDBfR2V0QmFzZV9HUElPKCk7CgoJc3dpdGNoIChyYW5nZSkgewoJY2FzZSAxOgoJCUNMUl9TRUxfVEVNUF9WXzA7IFNFVF9TRUxfVEVNUF9WXzE7CgkJQ0xSX1NFTF9URU1QX1ZfMjsgQ0xSX1NFTF9URU1QX1ZfMzsKCQlicmVhazsKCWNhc2UgMjoKCQlDTFJfU0VMX1RFTVBfVl8wOyBDTFJfU0VMX1RFTVBfVl8xOwoJCUNMUl9TRUxfVEVNUF9WXzI7IFNFVF9TRUxfVEVNUF9WXzM7CgkJYnJlYWs7CgljYXNlIDM6CgkJU0VUX1NFTF9URU1QX1ZfMDsgQ0xSX1NFTF9URU1QX1ZfMTsKCQlTRVRfU0VMX1RFTVBfVl8yOyBDTFJfU0VMX1RFTVBfVl8zOwoJCWJyZWFrOwoJfQp9CgoKdTE2IHRzYzIwMDBfcmVhZF9jaGFubmVsICh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdTE2IHJlczsKCgl0c2MyMDAwX3NldF9tdXgoY2hhbm5lbCk7Cgl1ZGVsYXkoMjAgKiBUU0MyMDAwX0RFTEFZX0JBU0UpOwoKCXRzYzIwMDBfd3JpdGUoVFNDMjAwMF9SRUdfQURDLCAweDIwMzYpOwoJYWRjX3dhaXRfY29udmVyc2lvbl9kb25lICgpOwoJcmVzID0gdHNjMjAwMF9yZWFkKFRTQzIwMDBfUkVHX0FVWDEpOwoJcmV0dXJuIHJlczsKfQoKCnMzMiB0c2MyMDAwX2NvbnRhY3RfdGVtcCAodm9pZCkKewoJbG9uZyBhZGNfcHQxMDAwLCBvZmZzZXQ7Cglsb25nIHVfcHQxMDAwOwoJbG9uZyBjb250YWN0X3RlbXA7Cglsb25nIHRlbXAxLCB0ZW1wMjsKCgl0c2MyMDAwX3JlZ19pbml0ICgpOwoJdHNjMjAwMF9zZXRfcmFuZ2UgKDMpOwoKCS8qCgkgKiBCZWNhdXNlIG9mIHNwb3JhZGljICJqdW1wcyIgaW4gdGhlIG1lYXN1cmVkIGFkYyB2YWx1ZXMgZXZlcnkKCSAqIGNoYW5uZWwgaXMgcmVhZCB0d28gdGltZXMuIElmIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZQoJICogYmV0d2VlbiB0aGUgdHdvIG1lYXN1cmVtZW50cywgdGhlbiBwcmludCBhbiBlcnJvciBhbmQgZG8gYSB0aGlyZAoJICogbWVhc3VyZW1lbnQsIGJlY2F1c2UgaXQgaXMgdmVyeSB1bmxpa2VseSB0aGF0IGEgc3VjY2Vzc2l2ZSB0aGlyZAoJICogbWVhc3VyZW1lbnQgZ29lcyBhbHNvIHdyb25nLgoJICovCgl0ZW1wMSA9IHRzYzIwMDBfcmVhZF9jaGFubmVsICgxNCk7Cgl0ZW1wMiA9IHRzYzIwMDBfcmVhZF9jaGFubmVsICgxNCk7CglpZiAoYWJzKHRlbXAyIC0gdGVtcDEpIDwgTUFYX0RFVklBVElPTikKCQlhZGNfcHQxMDAwID0gdGVtcDI7CgllbHNlIHsKCQlwcmludGYgKCIlczogcmVhZCBhZGMgdmFsdWUgKGNoYW5uZWwgMTQpIGV4Y2VlZGVkIG1heCBhbGxvd2VkICIKCQkJImRldmlhdGlvbjogJWQgKiAwLjAyNzYgsENcbiIsCgkJCV9fRlVOQ1RJT05fXywgTUFYX0RFVklBVElPTik7CgkJcHJpbnRmICgiYWRjIHZhbHVlIDE6ICVsZCBESUdJVHNcbmFkYyB2YWx1ZSAyOiAlbGQgRElHSVRzXG4iLAoJCQl0ZW1wMSwgdGVtcDIpOwoJCWFkY19wdDEwMDAgPSB0c2MyMDAwX3JlYWRfY2hhbm5lbCAoMTQpOwoJCXByaW50ZiAoInVzZSAodGhpcmQgcmVhZCkgYWRjIHZhbHVlOiBhZGNfcHQxMDAwID0gIgoJCQkiJWxkIERJR0lUc1xuIiwJYWRjX3B0MTAwMCk7Cgl9CglkZWJ1ZyAoInJlYWQgY2hhbm5lbCAxNCAocHQxMDAwIGFkYyB2YWx1ZSk6ICVsZFxuIiwgYWRjX3B0MTAwMCk7CgoJdGVtcDEgPSB0c2MyMDAwX3JlYWRfY2hhbm5lbCAoMTUpOwoJdGVtcDIgPSB0c2MyMDAwX3JlYWRfY2hhbm5lbCAoMTUpOwoJaWYgKGFicyh0ZW1wMiAtIHRlbXAxKSA8IE1BWF9ERVZJQVRJT04pCgkJb2Zmc2V0ID0gdGVtcDI7CgllbHNlIHsKCQlwcmludGYgKCIlczogcmVhZCBhZGMgdmFsdWUgKGNoYW5uZWwgMTUpIGV4Y2VlZGVkIG1heCBhbGxvd2VkICIKCQkJImRldmlhdGlvbjogJWQgKiAwLjAyNzYgsENcbiIsCgkJCV9fRlVOQ1RJT05fXywgTUFYX0RFVklBVElPTik7CgkJcHJpbnRmICgiYWRjIHZhbHVlIDE6ICVsZCBESUdJVHNcbmFkYyB2YWx1ZSAyOiAlbGQgRElHSVRzXG4iLAoJCQl0ZW1wMSwgdGVtcDIpOwoJCW9mZnNldCA9IHRzYzIwMDBfcmVhZF9jaGFubmVsICgxNSk7CgkJcHJpbnRmICgidXNlICh0aGlyZCByZWFkKSBhZGMgdmFsdWU6IG9mZnNldCA9ICVsZCBESUdJVHNcbiIsCgkJCW9mZnNldCk7Cgl9CglkZWJ1ZyAoInJlYWQgY2hhbm5lbCAxNSAob2Zmc2V0KTogJWxkXG4iLCBvZmZzZXQpOwoKCS8qCgkgKiBGb3JtdWxhIGZvciBjYWxjdWxhdGluZyB2b2x0YWdlIGRyb3Agb24gUFQxMDAwIHJlc2lzdG9yOiB1X3B0MTAwMCA9CgkgKiB4X3JhbmdlMyAqIChhZGNfcmF3IC0gb2Zmc2V0KSAvIDEwLiBGb3JtdWxhIHRvIGNhbGN1bGF0ZSB4X3JhbmdlMzoKCSAqIHhfcmFuZ2UzID0gKDI1MDAgKiAoMTAwMDAwMCArIGVycl92cmVmICsgZXJyX2FtcDMpKSAvICg0MDk1KjYpLiBUaGUKCSAqIGVycm9yIGNvcnJlY3Rpb24gVmFsdWVzIGVycl92cmVmIGFuZCBlcnJfYW1wMyBhcmUgYXNzdW1lZCBhcyAwIGluCgkgKiB1LWJvb3QsIGJlY2F1c2UgdGhpcyBjb3VsZCBjYXVzZSBvbmx5IGEgdmVyeSBzbWFsbCBlcnJvciAoPCAxJSkuCgkgKi8KCXVfcHQxMDAwID0gKDEwMTc1MCAqIChhZGNfcHQxMDAwIC0gb2Zmc2V0KSkgLyAxMDsKCWRlYnVnICgidV9wdDEwMDA6ICVsZFxuIiwgdV9wdDEwMDApOwoKCWlmICh0c2MyMDAwX2ludGVycG9sYXRlKHVfcHQxMDAwLCBQdDEwMDBfdGVtcF90YWJsZSwKCQkJCSZjb250YWN0X3RlbXApID09IC0xKSB7CgkJcHJpbnRmICgiJXM6IGVycm9yIGludGVycG9sYXRpbmcgUFQxMDAwIHZsYXVlXG4iLAoJCQkgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gKC0xMDAwKTsKCX0KCWRlYnVnICgiY29udGFjdF90ZW1wOiAlbGRcbiIsIGNvbnRhY3RfdGVtcCk7CgoJcmV0dXJuIGNvbnRhY3RfdGVtcDsKfQoKCnZvaWQgdHNjMjAwMF9yZWdfaW5pdCAodm9pZCkKewoJUzNDMjRYMF9HUElPICogY29uc3QgZ3BpbyA9IFMzQzI0WDBfR2V0QmFzZV9HUElPKCk7CgoJdHNjMjAwMF93cml0ZShUU0MyMDAwX1JFR19BREMsIDB4MjAzNik7Cgl0c2MyMDAwX3dyaXRlKFRTQzIwMDBfUkVHX1JFRiwgMHgwMDExKTsKCXRzYzIwMDBfd3JpdGUoVFNDMjAwMF9SRUdfREFDQ1RMLCAweDAwMDApOwoKCUNPTl9NVVgwOwoJQ09OX01VWDE7CgoJQ09OX01VWDFfRU5BQkxFOwoJQ09OX01VWDJfRU5BQkxFOwoJQ09OX01VWDNfRU5BQkxFOwoJQ09OX01VWDRfRU5BQkxFOwoKCUNPTl9TRUxfVEVNUF9WXzA7CglDT05fU0VMX1RFTVBfVl8xOwoJQ09OX1NFTF9URU1QX1ZfMjsKCUNPTl9TRUxfVEVNUF9WXzM7CgoJdHNjMjAwMF9zZXRfbXV4KDApOwoJdHNjMjAwMF9zZXRfcmFuZ2UoMCk7Cn0KCgppbnQgdHNjMjAwMF9pbnRlcnBvbGF0ZShsb25nIHZhbHVlLCBsb25nIGRhdGFbXVsyXSwgbG9uZyAqcmVzdWx0KQp7CglpbnQgaTsKCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CgoJLyogdGhlIGRhdGEgaXMgc29ydGVkIGFuZCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1cHBlcgoJICogbGltaXQgc28gd2UgY2FuIGVhc2lseSBjaGVjayBmb3Igb3V0LW9mLWJhbmQgdmFsdWVzCgkgKi8KCWlmIChkYXRhWzBdWzBdIDwgdmFsdWUgfHwgZGF0YVsxXVswXSA+IHZhbHVlKQoJCXJldHVybiAtMTsKCglpID0gMTsKCXdoaWxlIChkYXRhW2ldWzBdIDwgdmFsdWUpCgkJaSsrOwoKCS8qIFRvIHByZXZlbnQgb3ZlcmZsb3cgd2UgaGF2ZSB0byBzdG9yZSB0aGUgaW50ZXJtZWRpYXRlCgkgICByZXN1bHQgaW4gJ2xvbmcgbG9uZycuCgkqLwoKCXZhbCA9ICgodW5zaWduZWQgbG9uZyBsb25nKShkYXRhW2ldWzFdIC0gZGF0YVtpLTFdWzFdKQoJCSAgICogKHVuc2lnbmVkIGxvbmcgbG9uZykodmFsdWUgLSBkYXRhW2ktMV1bMF0pKTsKCWRvX2Rpdih2YWwsIChkYXRhW2ldWzBdIC0gZGF0YVtpLTFdWzBdKSk7CgkqcmVzdWx0ID0gZGF0YVtpLTFdWzFdICsgdmFsOwoKCXJldHVybiAwOwp9CgoKdm9pZCBhZGNfd2FpdF9jb252ZXJzaW9uX2RvbmUodm9pZCkKewoJd2hpbGUgKCEodHNjMjAwMF9yZWFkKFRTQzIwMDBfUkVHX0FEQykgJiAoMSA8PCAxNCkpKTsKfQo=