Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgX19fXyAgICAgICAgICAgICAgICAgICAgICAgIF8gICAgICBfCi8vICAgICAvIF9fX3xfX19fIF8gICBfIF9fX18gICBfX19ffCB8X18gIHwgfAovLyAgICB8IHwgICAvIF9fX3wgfCB8IHwgIF8gIFwvIF9fX3wgIF8gIFx8IHwKLy8gICAgfCB8X19ffCB8ICB8IHxffCB8IHwgfCB8IHxfX198IHwgfCB8fF98Ci8vICAgICBcX19fX3xffCAgXF9fX19ffF98IHxffFxfX19ffF98IHxffChfKSBNZWRpYSBiZW5jaG1hcmtzCi8vICAgICAgICAgICAgICAgICAKLy8JIKkgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24sIGxpY2Vuc2VkIHVuZGVyIEFwYWNoZSAyLjAgCi8vCi8vICBmaWxlIDogQm9keVBvc2UuY3BwCi8vICBhdXRob3IgOiBKZWFuLVl2ZXMgQm91Z3VldCAtIGplYW4teXZlcy5ib3VndWV0QGludGVsLmNvbQovLwkJCSBTY290dCBFdHRpbmdlciAtIHNjb3R0Lm0uZXR0aW5nZXJAaW50ZWwuY29tCi8vICBkZXNjcmlwdGlvbiA6IEJvZHkgcG9zZSBkZXNjcmlwdGlvbi4KLy8gIG1vZGlmaWVkIDogCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZiBkZWZpbmVkKEhBVkVfQ09ORklHX0gpCiMgaW5jbHVkZSAiY29uZmlnLmgiCiNlbmRpZgoKI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgIkJvZHlQb3NlLmgiCiNpbmNsdWRlIDx2ZWN0b3I+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy9zZXQgYWxsIHBvc2UgdmFsdWVzCnZvaWQgQm9keVBvc2U6OlNldChmbG9hdCAqYW5nbGVfdmFsdWVzLGludCBuKQp7CW1BbmdsZXMucmVzaXplKG4pOwoJZm9yKGludCBpPTA7aTxuO2krKykKCQltQW5nbGVzW2ldID0gYW5nbGVfdmFsdWVzW2ldOwp9CgovLyByZXR1cm5zIHRydWUgaWYgYWxsIGJvZHkgcG9zZSBhbmdsZXMgYXJlIGJldHdlZW4gbWluIGFuZCBtYXggdmFsdWVzCmJvb2wgQm9keVBvc2U6OlZhbGlkKFBvc2VQYXJhbXMgJnBhcmFtcykKewoJcmV0dXJuIHRydWU7CS8vZGlzYWJsZWQgLSBjYW4gYmUgZW5hYmxlZCBpZiB2YWxpZCBwb3NlIGV4dGVudCBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50CgoJaWYgKChtQW5nbGVzWzBdPCBwYXJhbXMuUG9zZU1pbigwKSl8fChtQW5nbGVzWzBdPiBwYXJhbXMuUG9zZU1heCgwKSkpCgkJcmV0dXJuIGZhbHNlOwoJaWYgKChtQW5nbGVzWzFdPCBwYXJhbXMuUG9zZU1pbigxKSl8fChtQW5nbGVzWzFdPiBwYXJhbXMuUG9zZU1heCgxKSkpCgkJcmV0dXJuIGZhbHNlOwoJZm9yKGludCBpPTU7aTwoaW50KSBtQW5nbGVzLnNpemUoKTtpKyspCgkJaWYgKChtQW5nbGVzW2ldPCBwYXJhbXMuUG9zZU1pbihpKSl8fChtQW5nbGVzW2ldPiBwYXJhbXMuUG9zZU1heChpKSkpCgkJCXJldHVybiBmYWxzZTsKCglyZXR1cm4gdHJ1ZTsKfQoKLy9sb2FkIHBvc2UgZnJvbSBmaWxlCmJvb2wgQm9keVBvc2U6OkluaXRpYWxpemUoc3RyaW5nIGZuYW1lKQp7CgltQW5nbGVzLnJlc2l6ZShOX0FOR0xFUyk7CglpZnN0cmVhbSBmKGZuYW1lLmNfc3RyKCkpOwoJaWYoIWYuaXNfb3BlbigpKQoJewljb3V0IDw8ICJVbmFibGUgdG8gb3BlbiBJbml0aWFsIFBvc2UgZmlsZSA6ICIgPDwgZm5hbWUgPDwgZW5kbDsKCQlyZXR1cm4gZmFsc2U7Cgl9Cglmb3IoaW50IGk9MDsgaTxOX0FOR0xFUzsgaSsrKQoJCWYgPj4gbUFuZ2xlc1tpXTsKCXJldHVybiB0cnVlOwp9CgovL2xvYWQgcG9zZSBwYXJhbWV0ZXJzIGZyb20gZmlsZQpib29sIFBvc2VQYXJhbXM6OkluaXRpYWxpemUoc3RyaW5nIGZuYW1lKQp7CglzdGRBbmdsZS5yZXNpemUoTl9BTkdMRVMpOwoJbWluQW5nbGVzLnJlc2l6ZShOX0FOR0xFUyk7CgltYXhBbmdsZXMucmVzaXplKE5fQU5HTEVTKTsKCglpZnN0cmVhbSBmKGZuYW1lLmNfc3RyKCkpOwoJaWYoIWYuaXNfb3BlbigpKQoJewljb3V0IDw8ICJVbmFibGUgdG8gb3BlbiBQb3NlIFBhcmFtZXRlciBmaWxlIDogIiA8PCBmbmFtZSA8PCBlbmRsOwoJCXJldHVybiBmYWxzZTsKCX0KCWZvcihpbnQgaT0wOyBpPE5fQU5HTEVTOyBpKyspCgkJZiA+PiBzdGRBbmdsZVtpXTsKCWZvcihpbnQgaT0wOyBpPE5fQU5HTEVTOyBpKyspCgkJZiA+PiBtaW5BbmdsZXNbaV07Cglmb3IoaW50IGk9MDsgaTxOX0FOR0xFUzsgaSsrKQoJCWYgPj4gbWF4QW5nbGVzW2ldOwoJcmV0dXJuIHRydWU7Cn0K