Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBmaXBNZXRhZGF0YUZpbmQgY2xhc3MgaW1wbGVtZW50YXRpb24KLy8KLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQovLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgIkZyZWVJbWFnZVBsdXMuaCIKCkJPT0wgZmlwTWV0YWRhdGFGaW5kOjppc1ZhbGlkKCkgY29uc3QgewoJcmV0dXJuIChfbWRoYW5kbGUgIT0gTlVMTCkgPyBUUlVFIDogRkFMU0U7Cn0KCmZpcE1ldGFkYXRhRmluZDo6ZmlwTWV0YWRhdGFGaW5kKCkgOiBfbWRoYW5kbGUoTlVMTCkgewp9CgpmaXBNZXRhZGF0YUZpbmQ6On5maXBNZXRhZGF0YUZpbmQoKSB7CglGcmVlSW1hZ2VfRmluZENsb3NlTWV0YWRhdGEoX21kaGFuZGxlKTsKfQoKQk9PTCBmaXBNZXRhZGF0YUZpbmQ6OmZpbmRGaXJzdE1ldGFkYXRhKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgZmlwSW1hZ2UmIGltYWdlLCBmaXBUYWcmIHRhZykgewoJRklUQUcgKmZpcnN0VGFnID0gTlVMTDsKCWlmKF9tZGhhbmRsZSkgRnJlZUltYWdlX0ZpbmRDbG9zZU1ldGFkYXRhKF9tZGhhbmRsZSk7CglfbWRoYW5kbGUgPSBGcmVlSW1hZ2VfRmluZEZpcnN0TWV0YWRhdGEobW9kZWwsIGltYWdlLCAmZmlyc3RUYWcpOwoJaWYoX21kaGFuZGxlKSB7CgkJdGFnID0gRnJlZUltYWdlX0Nsb25lVGFnKGZpcnN0VGFnKTsKCQlyZXR1cm4gVFJVRTsKCX0KCXJldHVybiBGQUxTRTsKfSAKCkJPT0wgZmlwTWV0YWRhdGFGaW5kOjpmaW5kTmV4dE1ldGFkYXRhKGZpcFRhZyYgdGFnKSB7CglGSVRBRyAqbmV4dFRhZyA9IE5VTEw7CglpZiggRnJlZUltYWdlX0ZpbmROZXh0TWV0YWRhdGEoX21kaGFuZGxlLCAmbmV4dFRhZykgKSB7CgkJdGFnID0gRnJlZUltYWdlX0Nsb25lVGFnKG5leHRUYWcpOwoJCXJldHVybiBUUlVFOwoJfQoJcmV0dXJuIEZBTFNFOwp9Cgo=