Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBmaXBNdWx0aVBhZ2UgY2xhc3MgaW1wbGVtZW50YXRpb24KLy8KLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQovLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgIkZyZWVJbWFnZVBsdXMuaCIKCmZpcE11bHRpUGFnZTo6ZmlwTXVsdGlQYWdlKEJPT0wga2VlcF9jYWNoZV9pbl9tZW1vcnkpIDogX21wYWdlKE5VTEwpLCBfYk1lbW9yeUNhY2hlKGtlZXBfY2FjaGVfaW5fbWVtb3J5KSB7Cn0KCmZpcE11bHRpUGFnZTo6fmZpcE11bHRpUGFnZSgpIHsKCWlmKF9tcGFnZSkgewoJCS8vIGNsb3NlIHRoZSBzdHJlYW0KCQljbG9zZSgwKTsKCX0KfQoKQk9PTCBmaXBNdWx0aVBhZ2U6OmlzVmFsaWQoKSBjb25zdCB7CglyZXR1cm4gKE5VTEwgIT0gX21wYWdlKSA/IFRSVUUgOiBGQUxTRTsKfQoKQk9PTCBmaXBNdWx0aVBhZ2U6Om9wZW4oY29uc3QgY2hhciogbHBzelBhdGhOYW1lLCBCT09MIGNyZWF0ZV9uZXcsIEJPT0wgcmVhZF9vbmx5LCBpbnQgZmxhZ3MpIHsKCS8vIHRyeSB0byBndWVzcyB0aGUgZmlsZSBmb3JtYXQgZnJvbSB0aGUgZmlsZW5hbWUKCUZSRUVfSU1BR0VfRk9STUFUIGZpZiA9IEZyZWVJbWFnZV9HZXRGSUZGcm9tRmlsZW5hbWUobHBzelBhdGhOYW1lKTsKCgkvLyBvcGVuIHRoZSBzdHJlYW0KCV9tcGFnZSA9IEZyZWVJbWFnZV9PcGVuTXVsdGlCaXRtYXAoZmlmLCBscHN6UGF0aE5hbWUsIGNyZWF0ZV9uZXcsIHJlYWRfb25seSwgX2JNZW1vcnlDYWNoZSwgZmxhZ3MpOwoKCXJldHVybiAoTlVMTCAhPSBfbXBhZ2UgKSA/IFRSVUUgOiBGQUxTRTsKfQoKQk9PTCBmaXBNdWx0aVBhZ2U6Om9wZW4oZmlwTWVtb3J5SU8mIG1lbUlPLCBpbnQgZmxhZ3MpIHsKCS8vIHRyeSB0byBndWVzcyB0aGUgZmlsZSBmb3JtYXQgZnJvbSB0aGUgbWVtb3J5IGhhbmRsZQoJRlJFRV9JTUFHRV9GT1JNQVQgZmlmID0gbWVtSU8uZ2V0RmlsZVR5cGUoKTsKCgkvLyBvcGVuIHRoZSBzdHJlYW0KCV9tcGFnZSA9IG1lbUlPLmxvYWRNdWx0aVBhZ2UoZmlmLCBmbGFncyk7CgoJcmV0dXJuIChOVUxMICE9IF9tcGFnZSApID8gVFJVRSA6IEZBTFNFOwp9CgpCT09MIGZpcE11bHRpUGFnZTo6b3BlbihGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncykgewoJLy8gdHJ5IHRvIGd1ZXNzIHRoZSBmaWxlIGZvcm1hdCBmcm9tIHRoZSBoYW5kbGUKCUZSRUVfSU1BR0VfRk9STUFUIGZpZiA9IEZyZWVJbWFnZV9HZXRGaWxlVHlwZUZyb21IYW5kbGUoaW8sIGhhbmRsZSwgMCk7CgoJLy8gb3BlbiB0aGUgc3RyZWFtCglfbXBhZ2UgPSBGcmVlSW1hZ2VfT3Blbk11bHRpQml0bWFwRnJvbUhhbmRsZShmaWYsIGlvLCBoYW5kbGUsIGZsYWdzKTsKCglyZXR1cm4gKE5VTEwgIT0gX21wYWdlICkgPyBUUlVFIDogRkFMU0U7Cn0KCkJPT0wgZmlwTXVsdGlQYWdlOjpjbG9zZShpbnQgZmxhZ3MpIHsKCUJPT0wgYlN1Y2Nlc3MgPSBGQUxTRTsKCWlmKF9tcGFnZSkgewoJCS8vIGNsb3NlIHRoZSBzdHJlYW0KCQliU3VjY2VzcyA9IEZyZWVJbWFnZV9DbG9zZU11bHRpQml0bWFwKF9tcGFnZSwgZmxhZ3MpOwoJCV9tcGFnZSA9IE5VTEw7Cgl9CgoJcmV0dXJuIGJTdWNjZXNzOwp9CgpCT09MIGZpcE11bHRpUGFnZTo6c2F2ZVRvSGFuZGxlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgZmxhZ3MpIGNvbnN0IHsKCUJPT0wgYlN1Y2Nlc3MgPSBGQUxTRTsKCWlmKF9tcGFnZSkgewoJCWJTdWNjZXNzID0gRnJlZUltYWdlX1NhdmVNdWx0aUJpdG1hcFRvSGFuZGxlKGZpZiwgX21wYWdlLCBpbywgaGFuZGxlLCBmbGFncyk7Cgl9CgoJcmV0dXJuIGJTdWNjZXNzOwp9CgpCT09MIGZpcE11bHRpUGFnZTo6c2F2ZVRvTWVtb3J5KEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgZmlwTWVtb3J5SU8mIG1lbUlPLCBpbnQgZmxhZ3MpIGNvbnN0IHsKCUJPT0wgYlN1Y2Nlc3MgPSBGQUxTRTsKCWlmKF9tcGFnZSkgewoJCWJTdWNjZXNzID0gbWVtSU8uc2F2ZU11bHRpUGFnZShmaWYsIF9tcGFnZSwgZmxhZ3MpOwoJfQoKCXJldHVybiBiU3VjY2VzczsKfQoKaW50IGZpcE11bHRpUGFnZTo6Z2V0UGFnZUNvdW50KCkgY29uc3QgewoJcmV0dXJuIF9tcGFnZSA/IEZyZWVJbWFnZV9HZXRQYWdlQ291bnQoX21wYWdlKSA6IDA7Cn0KCnZvaWQgZmlwTXVsdGlQYWdlOjphcHBlbmRQYWdlKGZpcEltYWdlJiBpbWFnZSkgewoJaWYoX21wYWdlKSB7CgkJRnJlZUltYWdlX0FwcGVuZFBhZ2UoX21wYWdlLCBpbWFnZSk7Cgl9Cn0KCnZvaWQgZmlwTXVsdGlQYWdlOjppbnNlcnRQYWdlKGludCBwYWdlLCBmaXBJbWFnZSYgaW1hZ2UpIHsKCWlmKF9tcGFnZSkgewoJCUZyZWVJbWFnZV9JbnNlcnRQYWdlKF9tcGFnZSwgcGFnZSwgaW1hZ2UpOwoJfQp9Cgp2b2lkIGZpcE11bHRpUGFnZTo6ZGVsZXRlUGFnZShpbnQgcGFnZSkgewoJaWYoX21wYWdlKSB7CgkJRnJlZUltYWdlX0RlbGV0ZVBhZ2UoX21wYWdlLCBwYWdlKTsKCX0KfQoKQk9PTCBmaXBNdWx0aVBhZ2U6Om1vdmVQYWdlKGludCB0YXJnZXQsIGludCBzb3VyY2UpIHsKCXJldHVybiBfbXBhZ2UgPyBGcmVlSW1hZ2VfTW92ZVBhZ2UoX21wYWdlLCB0YXJnZXQsIHNvdXJjZSkgOiBGQUxTRTsKfQoKRklCSVRNQVAqIGZpcE11bHRpUGFnZTo6bG9ja1BhZ2UoaW50IHBhZ2UpIHsKCXJldHVybiBfbXBhZ2UgPyBGcmVlSW1hZ2VfTG9ja1BhZ2UoX21wYWdlLCBwYWdlKSA6IE5VTEw7Cn0KCnZvaWQgZmlwTXVsdGlQYWdlOjp1bmxvY2tQYWdlKGZpcEltYWdlJiBpbWFnZSwgQk9PTCBjaGFuZ2VkKSB7CglpZihfbXBhZ2UpIHsKCQlGcmVlSW1hZ2VfVW5sb2NrUGFnZShfbXBhZ2UsIGltYWdlLCBjaGFuZ2VkKTsKCQkvLyBjbGVhciB0aGUgaW1hZ2Ugc28gdGhhdCBpdCBiZWNvbWVzIGludmFsaWQuCgkJLy8gdGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG9mIHRoZSBmcmllbmQgZGVjbGFyYXRpb24KCQlpbWFnZS5fZGliID0gTlVMTDsKCQlpbWFnZS5fYkhhc0NoYW5nZWQgPSBGQUxTRTsKCX0KfQoKQk9PTCBmaXBNdWx0aVBhZ2U6OmdldExvY2tlZFBhZ2VOdW1iZXJzKGludCAqcGFnZXMsIGludCAqY291bnQpIGNvbnN0IHsKCXJldHVybiBfbXBhZ2UgPyBGcmVlSW1hZ2VfR2V0TG9ja2VkUGFnZU51bWJlcnMoX21wYWdlLCBwYWdlcywgY291bnQpIDogRkFMU0U7Cn0KCg==