LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiCw5sioy/nT0CAoQykyMDE2LCDW0NDLzajRtrnJt93T0M/euavLvqGjCiogCiogzsS8/sP7s8Y6ICAgICB1c2JfZGV2LmMKKiDOxLz+serKtjogICAgIHVzYl9kZXYuYwoqIMTayN3VqtKqOiAgICAgdXNiyeixuLfDzsq5pL7fCiogCiog0N64xMjVxtogICAgICAgILDmsb66xSAgICAgINDeuMSx6rzHICAgICAgICDQ3rjEyMsgICAgICAgICAg0N64xMTayN0KKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKiAyMDE2LzMvMTAgICAgICBWMS4wICAgICAgICBDcmVhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgILS0vagKKiAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIM23zsS8/iAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlPHN0ZGxpYi5oPgojaW5jbHVkZTxzdGRpby5oPgojaW5jbHVkZTxzdHJpbmcuaD4KI2luY2x1ZGU8c3lzL3R5cGVzLmg+CiNpbmNsdWRlPHN5cy9zdGF0Lmg+CiNpbmNsdWRlPGZjbnRsLmg+CiNpbmNsdWRlPGVycm5vLmg+CiNpbmNsdWRlPGdldG9wdC5oPgojaW5jbHVkZTxzdGRhcmcuaD4KI2luY2x1ZGU8dGVybWlvcy5oPgojaW5jbHVkZTxzdGRkZWYuaD4KI2luY2x1ZGU8ZGlyZW50Lmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILrqtqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgVVNCX0RJUl9GSUxFX05BTUVfU0laRSAxMDI0CiNkZWZpbmUgVVNCX0RJUl9CQVNFICIvc3lzL2J1cy91c2IvZGV2aWNlcyIKI2RlZmluZSBVU0JfUElEIDB4MDE5NwojZGVmaW5lIFNVQ0NFU1MgMAojZGVmaW5lIEZBSUwgICAgLTEKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs6PBv7ao0uUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmNoYXIgc3lzX2ZpbGVuYW1lW1VTQl9ESVJfRklMRV9OQU1FX1NJWkVdID0gezB9OwppbnQgZ191c2JfZGV2ID0gLTE7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDK/b7dwODQzbao0uUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguq/K/cn5w/cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIL7Wsr++ssysseTBv7ao0uUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMirvtax5MG/tqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICC+1rK/uq/K/cq1z9YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgZGV2X2dldF91c2JzeXNfdmFsKGNvbnN0IGNoYXIgKnN5c19maWxlbmFtZSwgaW50IGJhc2UpCnsKCWNoYXIgYnVmZls2NF0gPSB7MH07CglpbnQgcmV0X3ZhbCA9IC0xOwoJaW50IGZkID0gLTE7CgoJZmQgPSBvcGVuKHN5c19maWxlbmFtZSwgT19SRE9OTFkpOwoJaWYgKGZkIDwgMCkgewoJCXByaW50ZigiZmFpbGVkIHRvIG9wZW4gdXNic3lzLCBlcnJvciBpcyAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKCQlyZXR1cm4gRkFJTDsKCX0KCglpZiAocmVhZChmZCwgYnVmZiwgc2l6ZW9mKGJ1ZmYpKSA8PSAwKSB7CgkJcHJpbnRmKCJbJXNdIHJlYWQ6JXMgZmFpbGVkXG4iLCBfX2Z1bmNfXywgc3lzX2ZpbGVuYW1lKTsKCX0KCWVsc2UgewoJCXJldF92YWwgPSBzdHJ0b3VsKGJ1ZmYsIE5VTEwsIGJhc2UpOwoJfQoJY2xvc2UoZmQpOwoKCXJldHVybiByZXRfdmFsOwp9CgppbnQgZGV2X3N0clN0YXJ0c1dpdGgoY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqc3JjKQp7CglpbnQgcmV0ID0gLTE7CgoJZm9yICggOyAqbGluZSAhPSAnXDAnICYmICpzcmMgIT0gJ1wwJzsgbGluZSsrLCBzcmMrKykgewoJCWlmICgqbGluZSAhPSAqc3JjKSB7CgkJCXJldHVybiBGQUlMOwoJCX0KCX0KCXJldCA9IGF0b2kobGluZSk7CglyZXR1cm4gcmV0Owp9CgppbnQgZGV2X2dldF90dHlwb3J0X2J5X3N5c3BhdGgoY2hhciAqc3lzcGF0aCkKewoJRElSICp1c2JkaXIgPSBOVUxMOwoJc3RydWN0IGRpcmVudCAqZGVudCA9IE5VTEw7CglpbnQgdXNiX3BvcnQgPSAtMTsKCgl1c2JkaXIgPSBvcGVuZGlyKHN5c3BhdGgpOwoJaWYgKHVzYmRpciA9PSBOVUxMKSB7CgkJcHJpbnRmKCIlczogb3BlbiBbJXNdIGJ1c2RpciBmYWlsZWRcbiIsIF9fZnVuY19fLCBzeXNwYXRoKTsKCQlyZXR1cm4gLTE7Cgl9CgoJd2hpbGUgKChkZW50ID0gcmVhZGRpcih1c2JkaXIpKSAhPSBOVUxMKQoJewoJCXVzYl9wb3J0ID0gZGV2X3N0clN0YXJ0c1dpdGgoZGVudC0+ZF9uYW1lLCAidHR5VVNCIik7CgkJaWYgKCB1c2JfcG9ydCA+PSAwKSB7CgkJCWNsb3NlZGlyKHVzYmRpcik7CgkJCXVzYmRpciA9IE5VTEw7CgkJCXJldHVybiB1c2JfcG9ydDsKCQl9Cgl9CgoJaWYgKHVzYmRpcikgewoJCWNsb3NlZGlyKHVzYmRpcik7CgkJdXNiZGlyID0gTlVMTDsKCX0KCXJldHVybiBGQUlMOwp9CgppbnQgZGV2X2dldF9kZXZpY2Uodm9pZCkKewoJRElSICp1c2JkaXIgPSBOVUxMOwoJc3RydWN0IGRpcmVudCAqZGVudCA9IE5VTEw7CglpbnQgaWRQcm9kdWN0ID0gMDsKCWludCBiQ29uZmlndXJhdGlvblZhbHVlID0gMDsKCWludCBudW0gPSAwOwoJdXNiZGlyID0gb3BlbmRpcihVU0JfRElSX0JBU0UpOwoJaWYgKHVzYmRpciA9PSBOVUxMKQoJCXJldHVybiBGQUlMOwoKCXdoaWxlICgoZGVudCA9IHJlYWRkaXIodXNiZGlyKSkgIT0gTlVMTCl7CgkJaWYgKHN0cmNtcChkZW50LT5kX25hbWUsICIuIikgPT0gMCB8fCBzdHJjbXAoZGVudC0+ZF9uYW1lLCAiLi4iKSA9PSAwKSB7CgkJCWNvbnRpbnVlOwoJCX0KCgkJc25wcmludGYoc3lzX2ZpbGVuYW1lLCBzaXplb2Yoc3lzX2ZpbGVuYW1lKSwgIiVzLyVzL2lkUHJvZHVjdCIsIFVTQl9ESVJfQkFTRSwgZGVudC0+ZF9uYW1lKTsKCQlpZiAoKGlkUHJvZHVjdCA9IGRldl9nZXRfdXNic3lzX3ZhbChzeXNfZmlsZW5hbWUsIDE2KSkgPD0gMCkgewoJCQljb250aW51ZTsKCQl9CgoJCXNucHJpbnRmKHN5c19maWxlbmFtZSwgc2l6ZW9mKHN5c19maWxlbmFtZSksICIlcy8lcy9iQ29uZmlndXJhdGlvblZhbHVlIiwgVVNCX0RJUl9CQVNFLCBkZW50LT5kX25hbWUpOwoJCWlmICgoYkNvbmZpZ3VyYXRpb25WYWx1ZSA9IGRldl9nZXRfdXNic3lzX3ZhbChzeXNfZmlsZW5hbWUsIDEwKSkgPD0gMCkgewoJCQljb250aW51ZTsKCQl9CgoJCWlmIChpZFByb2R1Y3QgPT0gVVNCX1BJRCl7CgkJCXNucHJpbnRmKHN5c19maWxlbmFtZSwgc2l6ZW9mKHN5c19maWxlbmFtZSksICIlcy8lcy8lczolZC4lZCIsIFVTQl9ESVJfQkFTRSwgZGVudC0+ZF9uYW1lLCBkZW50LT5kX25hbWUsIGJDb25maWd1cmF0aW9uVmFsdWUsIDApOwoJCQlnX3VzYl9kZXYgPSBkZXZfZ2V0X3R0eXBvcnRfYnlfc3lzcGF0aChzeXNfZmlsZW5hbWUpOwoJCQljbG9zZWRpcih1c2JkaXIpOwoJCQl1c2JkaXIgPSBOVUxMOwoJCQlyZXR1cm4gU1VDQ0VTUzsKCQl9Cgl9CglpZiAodXNiZGlyKSB7CgkJY2xvc2VkaXIodXNiZGlyKTsKCQl1c2JkaXIgPSBOVUxMOwoJfQoJcmV0dXJuIEZBSUw7Cn0KCg==