Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBmaXBNZW1vcnlJTyBjbGFzcyBpbXBsZW1lbnRhdGlvbgovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKLy8KLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKLy8KLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCi8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCi8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQovLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAovLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCi8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCi8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgovLyBUSElTIERJU0NMQUlNRVIuCi8vCi8vIFVzZSBhdCB5b3VyIG93biByaXNrIQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5jbHVkZSAiRnJlZUltYWdlUGx1cy5oIgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCmZpcE1lbW9yeUlPOjpmaXBNZW1vcnlJTyhCWVRFICpkYXRhLCBEV09SRCBzaXplX2luX2J5dGVzKSB7CglfaG1lbSA9IEZyZWVJbWFnZV9PcGVuTWVtb3J5KGRhdGEsIHNpemVfaW5fYnl0ZXMpOwp9CgpmaXBNZW1vcnlJTzo6fmZpcE1lbW9yeUlPKCkgeyAKCWlmKF9obWVtICE9IE5VTEwpIHsKCQlGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoX2htZW0pOwoJfQp9Cgp2b2lkIGZpcE1lbW9yeUlPOjpjbG9zZSgpIHsgCglpZihfaG1lbSAhPSBOVUxMKSB7CgkJRnJlZUltYWdlX0Nsb3NlTWVtb3J5KF9obWVtKTsKCQlfaG1lbSA9IE5VTEw7Cgl9Cn0KCkJPT0wgZmlwTWVtb3J5SU86OmlzVmFsaWQoKSBjb25zdCB7CglyZXR1cm4gKF9obWVtICE9IE5VTEwpOwp9CgpGUkVFX0lNQUdFX0ZPUk1BVCBmaXBNZW1vcnlJTzo6Z2V0RmlsZVR5cGUoKSBjb25zdCB7CglpZihfaG1lbSAhPSBOVUxMKSB7CgkJcmV0dXJuIEZyZWVJbWFnZV9HZXRGaWxlVHlwZUZyb21NZW1vcnkoX2htZW0sIDApOwoJfQoKCXJldHVybiBGSUZfVU5LTk9XTjsKfQoKRklCSVRNQVAqIGZpcE1lbW9yeUlPOjpsb2FkKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgaW50IGZsYWdzKSBjb25zdCB7CglyZXR1cm4gRnJlZUltYWdlX0xvYWRGcm9tTWVtb3J5KGZpZiwgX2htZW0sIGZsYWdzKTsKfQoKRklNVUxUSUJJVE1BUCogZmlwTWVtb3J5SU86OmxvYWRNdWx0aVBhZ2UoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBpbnQgZmxhZ3MpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfTG9hZE11bHRpQml0bWFwRnJvbU1lbW9yeShmaWYsIF9obWVtLCBmbGFncyk7Cn0KCkJPT0wgZmlwTWVtb3J5SU86OnNhdmUoRlJFRV9JTUFHRV9GT1JNQVQgZmlmLCBGSUJJVE1BUCAqZGliLCBpbnQgZmxhZ3MpIHsKCXJldHVybiBGcmVlSW1hZ2VfU2F2ZVRvTWVtb3J5KGZpZiwgZGliLCBfaG1lbSwgZmxhZ3MpOwp9CgpCT09MIGZpcE1lbW9yeUlPOjpzYXZlTXVsdGlQYWdlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRklNVUxUSUJJVE1BUCAqYml0bWFwLCBpbnQgZmxhZ3MpIHsKCXJldHVybiBGcmVlSW1hZ2VfU2F2ZU11bHRpQml0bWFwVG9NZW1vcnkoZmlmLCBiaXRtYXAsIF9obWVtLCBmbGFncyk7Cn0KCnVuc2lnbmVkIGZpcE1lbW9yeUlPOjpyZWFkKHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgY291bnQpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfUmVhZE1lbW9yeShidWZmZXIsIHNpemUsIGNvdW50LCBfaG1lbSk7Cn0KCnVuc2lnbmVkIGZpcE1lbW9yeUlPOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGNvdW50KSB7CglyZXR1cm4gRnJlZUltYWdlX1dyaXRlTWVtb3J5KGJ1ZmZlciwgc2l6ZSwgY291bnQsIF9obWVtKTsKfQoKbG9uZyBmaXBNZW1vcnlJTzo6dGVsbCgpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfVGVsbE1lbW9yeShfaG1lbSk7Cn0KCkJPT0wgZmlwTWVtb3J5SU86OnNlZWsobG9uZyBvZmZzZXQsIGludCBvcmlnaW4pIHsKCXJldHVybiBGcmVlSW1hZ2VfU2Vla01lbW9yeShfaG1lbSwgb2Zmc2V0LCBvcmlnaW4pOwp9CgpCT09MIGZpcE1lbW9yeUlPOjphY3F1aXJlKEJZVEUgKipkYXRhLCBEV09SRCAqc2l6ZV9pbl9ieXRlcykgewoJcmV0dXJuIEZyZWVJbWFnZV9BY3F1aXJlTWVtb3J5KF9obWVtLCBkYXRhLCBzaXplX2luX2J5dGVzKTsKfQoKCg==