Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBIZWxwZXIgY2xhc3MgZm9yIHJhdGlvbmFsIG51bWJlcnMKLy8KLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQovLyAtIEhlcnbpIERyb2xvbiA8ZHJvbG9uQGluZm9uaWUuZnI+Ci8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2lmbmRlZiBGSVJBVElPTkFMX0gKI2RlZmluZSBGSVJBVElPTkFMX0gKCi8qKgpIZWxwZXIgY2xhc3MgdG8gZGVhbCB3aXRoIHJhdGlvbmFsIG51bWJlcnMuIApOQjogTE9ORyBkYXRhIHR5cGUgaXMgYXNzdW1lZCB0byBiZSBhIHNpZ25lZCAzMi1iaXQgbnVtYmVyLiAKKi8KY2xhc3MgRklSYXRpb25hbCB7CnByaXZhdGU6CgkvLy8gbnVtZXJhdG9yCglMT05HIF9udW1lcmF0b3I7CgkvLy8gZGVub21pbmF0b3IKCUxPTkcgX2Rlbm9taW5hdG9yOwoKcHVibGljOgoJLy8vIERlZmF1bHQgY29uc3RydWN0b3IKCUZJUmF0aW9uYWwoKTsKCgkvLy8gQ29uc3RydWN0b3Igd2l0aCBsb25ncwoJRklSYXRpb25hbChMT05HIG4sIExPTkcgZCA9IDEpOwoKCS8vLyBDb25zdHJ1Y3RvciB3aXRoIEZJVEFHCglGSVJhdGlvbmFsKGNvbnN0IEZJVEFHICp0YWcpOwoKCS8vLyBDb25zdHJ1Y3RvciB3aXRoIGEgZmxvYXQKCUZJUmF0aW9uYWwoZmxvYXQgdmFsdWUpOwoKCS8vLyBDb3B5IGNvbnN0cnVjdG9yCglGSVJhdGlvbmFsIChjb25zdCBGSVJhdGlvbmFsJiByKTsKCgkvLy8gRGVzdHJ1Y3RvcgoJfkZJUmF0aW9uYWwoKTsKCgkvLy8gQXNzaWduZW1lbnQgb3BlcmF0b3IKCUZJUmF0aW9uYWwmIG9wZXJhdG9yPShGSVJhdGlvbmFsJiByKTsKCgkvLy8gR2V0IHRoZSBudW1lcmF0b3IKCUxPTkcgZ2V0TnVtZXJhdG9yKCk7CgoJLy8vIEdldCB0aGUgZGVub21pbmF0b3IKCUxPTkcgZ2V0RGVub21pbmF0b3IoKTsKCgkvLy8gQ29udmVydHMgcmF0aW9uYWwgdmFsdWUgYnkgdHJ1bmNhdGluZyB0b3dhcmRzIHplcm8KCUxPTkcgdHJ1bmNhdGUoKSB7CgkJLy8gUmV0dXJuIHRydW5jYXRlZCByYXRpb25hbAoJCXJldHVybiBfZGVub21pbmF0b3IgPyAoTE9ORykgKF9udW1lcmF0b3IgLyBfZGVub21pbmF0b3IpIDogMDsKCX0KCgkvKipAbmFtZSBJbXBsaWNpdCBjb252ZXJzaW9ucyAqLwoJLy9AewkKCXNob3J0IHNob3J0VmFsdWUoKSB7CgkJcmV0dXJuIChzaG9ydCl0cnVuY2F0ZSgpOwoJfQoJaW50IGludFZhbHVlKCkgewoJCXJldHVybiAoaW50KXRydW5jYXRlKCk7Cgl9CglMT05HIGxvbmdWYWx1ZSgpIHsKCQlyZXR1cm4gKExPTkcpdHJ1bmNhdGUoKTsKCX0KCWZsb2F0IGZsb2F0VmFsdWUoKSB7CgkJcmV0dXJuIF9kZW5vbWluYXRvciA/ICgoZmxvYXQpX251bWVyYXRvcikvKChmbG9hdClfZGVub21pbmF0b3IpIDogMDsKCX0KCWRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKCQlyZXR1cm4gX2Rlbm9taW5hdG9yID8gKChkb3VibGUpX251bWVyYXRvcikvKChkb3VibGUpX2Rlbm9taW5hdG9yKSA6IDA7Cgl9CgkvL0B9CgoJLy8vIENoZWNrcyBpZiB0aGlzIHJhdGlvbmFsIG51bWJlciBpcyBhbiBpbnRlZ2VyLCBlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUKCUJPT0wgaXNJbnRlZ2VyKCk7CgoJLy8vIENvbnZlcnQgYXMgIm51bWVyYXRvci9kZW5vbWluYXRvciIKCXN0ZDo6c3RyaW5nIHRvU3RyaW5nKCk7Cgpwcml2YXRlOgoJLy8vIEluaXRpYWxpemUgYW5kIG5vcm1hbGl6ZSBhIHJhdGlvbmFsIG51bWJlcgoJdm9pZCBpbml0aWFsaXplKExPTkcgbiwgTE9ORyBkKTsKCgkvLy8gQ2FsY3VsYXRlIEdDRAoJTE9ORyBnY2QoTE9ORyBhLCBMT05HIGIpOwoJCgkvLy8gTm9ybWFsaXplIG51bWVyYXRvciAvIGRlbm9taW5hdG9yIAoJdm9pZCBub3JtYWxpemUoKTsKCn07CgojZW5kaWYgLy8gRklSQVRJT05BTF9ICgo=