LyogQm9vc3QgaW50ZXJ2YWwvaW50ZXJ2YWwuaHBwIGhlYWRlciBmaWxlCiAqCiAqIENvcHlyaWdodCAyMDAyLTIwMDMgSGVydukgQnL2bm5pbWFubiwgR3VpbGxhdW1lIE1lbHF1aW9uZCwgU3lsdmFpbiBQaW9uCiAqCiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKICogY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCiAqLwoKI2lmbmRlZiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0lOVEVSVkFMX0hQUAojZGVmaW5lIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfSU5URVJWQUxfSFBQCgojaW5jbHVkZSA8c3RkZXhjZXB0PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9pbnRlcnZhbC9kZXRhaWwvaW50ZXJ2YWxfcHJvdG90eXBlLmhwcD4KCm5hbWVzcGFjZSBib29zdCB7Cm5hbWVzcGFjZSBudW1lcmljIHsKCm5hbWVzcGFjZSBpbnRlcnZhbF9saWIgewogICAgCmNsYXNzIGNvbXBhcmlzb25fZXJyb3IKICA6IHB1YmxpYyBzdGQ6OnJ1bnRpbWVfZXJyb3IgCnsKcHVibGljOgogIGNvbXBhcmlzb25fZXJyb3IoKQogICAgOiBzdGQ6OnJ1bnRpbWVfZXJyb3IoImJvb3N0OjppbnRlcnZhbDogdW5jZXJ0YWluIGNvbXBhcmlzb24iKQogIHsgfQp9OwoKfSAvLyBuYW1lc3BhY2UgaW50ZXJ2YWxfbGliCgovKgogKiBpbnRlcnZhbCBjbGFzcwogKi8KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPgpjbGFzcyBpbnRlcnZhbAp7CnByaXZhdGU6CiAgc3RydWN0IGludGVydmFsX2hvbGRlcjsKICBzdHJ1Y3QgbnVtYmVyX2hvbGRlcjsKcHVibGljOgogIHR5cGVkZWYgVCBiYXNlX3R5cGU7CiAgdHlwZWRlZiBQb2xpY2llcyB0cmFpdHNfdHlwZTsKCiAgVCBjb25zdCAmbG93ZXIoKSBjb25zdDsKICBUIGNvbnN0ICZ1cHBlcigpIGNvbnN0OwoKICBpbnRlcnZhbCgpOwogIGludGVydmFsKFQgY29uc3QgJnYpOwogIHRlbXBsYXRlPGNsYXNzIFQxPiBpbnRlcnZhbChUMSBjb25zdCAmdik7CiAgaW50ZXJ2YWwoVCBjb25zdCAmbCwgVCBjb25zdCAmdSk7CiAgdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPiBpbnRlcnZhbChUMSBjb25zdCAmbCwgVDIgY29uc3QgJnUpOwogIGludGVydmFsKGludGVydmFsPFQsIFBvbGljaWVzPiBjb25zdCAmcik7CiAgdGVtcGxhdGU8Y2xhc3MgUG9saWNpZXMxPiBpbnRlcnZhbChpbnRlcnZhbDxULCBQb2xpY2llczE+IGNvbnN0ICZyKTsKICB0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgUG9saWNpZXMxPiBpbnRlcnZhbChpbnRlcnZhbDxUMSwgUG9saWNpZXMxPiBjb25zdCAmcik7CgogIGludGVydmFsICZvcGVyYXRvcj0oVCBjb25zdCAmdik7CiAgdGVtcGxhdGU8Y2xhc3MgVDE+IGludGVydmFsICZvcGVyYXRvcj0oVDEgY29uc3QgJnYpOwogIGludGVydmFsICZvcGVyYXRvcj0oaW50ZXJ2YWw8VCwgUG9saWNpZXM+IGNvbnN0ICZyKTsKICB0ZW1wbGF0ZTxjbGFzcyBQb2xpY2llczE+IGludGVydmFsICZvcGVyYXRvcj0oaW50ZXJ2YWw8VCwgUG9saWNpZXMxPiBjb25zdCAmcik7CiAgdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFBvbGljaWVzMT4gaW50ZXJ2YWwgJm9wZXJhdG9yPShpbnRlcnZhbDxUMSwgUG9saWNpZXMxPiBjb25zdCAmcik7CiAKICB2b2lkIGFzc2lnbihjb25zdCBUJiBsLCBjb25zdCBUJiB1KTsKCiAgc3RhdGljIGludGVydmFsIGVtcHR5KCk7CiAgc3RhdGljIGludGVydmFsIHdob2xlKCk7CiAgc3RhdGljIGludGVydmFsIGh1bGwoY29uc3QgVCYgeCwgY29uc3QgVCYgeSk7CgogIGludGVydmFsJiBvcGVyYXRvcis9IChjb25zdCBUJiByKTsKICBpbnRlcnZhbCYgb3BlcmF0b3IrPSAoY29uc3QgaW50ZXJ2YWwmIHIpOwogIGludGVydmFsJiBvcGVyYXRvci09IChjb25zdCBUJiByKTsKICBpbnRlcnZhbCYgb3BlcmF0b3ItPSAoY29uc3QgaW50ZXJ2YWwmIHIpOwogIGludGVydmFsJiBvcGVyYXRvcio9IChjb25zdCBUJiByKTsKICBpbnRlcnZhbCYgb3BlcmF0b3IqPSAoY29uc3QgaW50ZXJ2YWwmIHIpOwogIGludGVydmFsJiBvcGVyYXRvci89IChjb25zdCBUJiByKTsKICBpbnRlcnZhbCYgb3BlcmF0b3IvPSAoY29uc3QgaW50ZXJ2YWwmIHIpOwoKICBib29sIG9wZXJhdG9yPCAoY29uc3QgaW50ZXJ2YWxfaG9sZGVyJiByKSBjb25zdDsKICBib29sIG9wZXJhdG9yPiAoY29uc3QgaW50ZXJ2YWxfaG9sZGVyJiByKSBjb25zdDsKICBib29sIG9wZXJhdG9yPD0gKGNvbnN0IGludGVydmFsX2hvbGRlciYgcikgY29uc3Q7CiAgYm9vbCBvcGVyYXRvcj49IChjb25zdCBpbnRlcnZhbF9ob2xkZXImIHIpIGNvbnN0OwogIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgaW50ZXJ2YWxfaG9sZGVyJiByKSBjb25zdDsKICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IGludGVydmFsX2hvbGRlciYgcikgY29uc3Q7CgogIGJvb2wgb3BlcmF0b3I8IChjb25zdCBudW1iZXJfaG9sZGVyJiByKSBjb25zdDsKICBib29sIG9wZXJhdG9yPiAoY29uc3QgbnVtYmVyX2hvbGRlciYgcikgY29uc3Q7CiAgYm9vbCBvcGVyYXRvcjw9IChjb25zdCBudW1iZXJfaG9sZGVyJiByKSBjb25zdDsKICBib29sIG9wZXJhdG9yPj0gKGNvbnN0IG51bWJlcl9ob2xkZXImIHIpIGNvbnN0OwogIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgbnVtYmVyX2hvbGRlciYgcikgY29uc3Q7CiAgYm9vbCBvcGVyYXRvciE9IChjb25zdCBudW1iZXJfaG9sZGVyJiByKSBjb25zdDsKCiAgLy8gdGhlIGZvbGxvd2luZyBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHksIGl0IGlzIG5vdCBhIHB1Ymxpc2hlZCBpbnRlcmZhY2UKICAvLyBuZXZlcnRoZWxlc3MsIGl0J3MgcHVibGljIGJlY2F1c2UgZnJpZW5kcyBkb24ndCBhbHdheXMgd29yayBjb3JyZWN0bHkuCiAgaW50ZXJ2YWwoY29uc3QgVCYgbCwgY29uc3QgVCYgdSwgYm9vbCk6IGxvdyhsKSwgdXAodSkge30KICB2b2lkIHNldF9lbXB0eSgpOwogIHZvaWQgc2V0X3dob2xlKCk7CiAgdm9pZCBzZXQoY29uc3QgVCYgbCwgY29uc3QgVCYgdSk7Cgpwcml2YXRlOgogIHN0cnVjdCBpbnRlcnZhbF9ob2xkZXIgewogICAgdGVtcGxhdGU8Y2xhc3MgUG9saWNpZXMyPgogICAgaW50ZXJ2YWxfaG9sZGVyKGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzMj4mIHIpCiAgICAgIDogbG93KHIubG93ZXIoKSksIHVwKHIudXBwZXIoKSkKICAgIHsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBQb2xpY2llczI6OmNoZWNraW5nIGNoZWNraW5nMjsKICAgICAgaWYgKGNoZWNraW5nMjo6aXNfZW1wdHkobG93LCB1cCkpCiAgICAgICAgdGhyb3cgaW50ZXJ2YWxfbGliOjpjb21wYXJpc29uX2Vycm9yKCk7CiAgICB9CgogICAgY29uc3QgVCYgbG93OwogICAgY29uc3QgVCYgdXA7CiAgfTsKCiAgc3RydWN0IG51bWJlcl9ob2xkZXIgewogICAgbnVtYmVyX2hvbGRlcihjb25zdCBUJiByKSA6IHZhbChyKQogICAgewogICAgICB0eXBlZGVmIHR5cGVuYW1lIFBvbGljaWVzOjpjaGVja2luZyBjaGVja2luZzsKICAgICAgaWYgKGNoZWNraW5nOjppc19uYW4ocikpCiAgICAgICAgdGhyb3cgaW50ZXJ2YWxfbGliOjpjb21wYXJpc29uX2Vycm9yKCk7CiAgICB9CiAgICAKICAgIGNvbnN0IFQmIHZhbDsKICB9OwoKICB0eXBlZGVmIHR5cGVuYW1lIFBvbGljaWVzOjpjaGVja2luZyBjaGVja2luZzsKICB0eXBlZGVmIHR5cGVuYW1lIFBvbGljaWVzOjpyb3VuZGluZyByb3VuZGluZzsKCiAgVCBsb3c7CiAgVCB1cDsKfTsKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKaW50ZXJ2YWw8VCwgUG9saWNpZXM+OjppbnRlcnZhbCgpOgogIGxvdyhzdGF0aWNfY2FzdDxUPigwKSksIHVwKHN0YXRpY19jYXN0PFQ+KDApKQp7fQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQppbnRlcnZhbDxULCBQb2xpY2llcz46OmludGVydmFsKFQgY29uc3QgJnYpOiBsb3codiksIHVwKHYpCnsKICBpZiAoY2hlY2tpbmc6OmlzX25hbih2KSkgc2V0X2VtcHR5KCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiB0ZW1wbGF0ZTxjbGFzcyBUMT4gaW5saW5lCmludGVydmFsPFQsIFBvbGljaWVzPjo6aW50ZXJ2YWwoVDEgY29uc3QgJnYpCnsKICBpZiAoY2hlY2tpbmc6OmlzX25hbih2KSkgc2V0X2VtcHR5KCk7CiAgZWxzZSB7CiAgICByb3VuZGluZyBybmQ7CiAgICBsb3cgPSBybmQuY29udl9kb3duKHYpOwogICAgdXAgID0gcm5kLmNvbnZfdXAgICh2KTsKICB9Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiB0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+IGlubGluZQppbnRlcnZhbDxULCBQb2xpY2llcz46OmludGVydmFsKFQxIGNvbnN0ICZsLCBUMiBjb25zdCAmdSkKewogIGlmIChjaGVja2luZzo6aXNfbmFuKGwpIHx8IGNoZWNraW5nOjppc19uYW4odSkgfHwgIShsIDw9IHUpKSBzZXRfZW1wdHkoKTsKICBlbHNlIHsKICAgIHJvdW5kaW5nIHJuZDsKICAgIGxvdyA9IHJuZC5jb252X2Rvd24obCk7CiAgICB1cCAgPSBybmQuY29udl91cCAgKHUpOwogIH0KfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQppbnRlcnZhbDxULCBQb2xpY2llcz46OmludGVydmFsKFQgY29uc3QgJmwsIFQgY29uc3QgJnUpOiBsb3cobCksIHVwKHUpCnsKICBpZiAoY2hlY2tpbmc6OmlzX25hbihsKSB8fCBjaGVja2luZzo6aXNfbmFuKHUpIHx8ICEobCA8PSB1KSkKICAgIHNldF9lbXB0eSgpOwp9CgoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQppbnRlcnZhbDxULCBQb2xpY2llcz46OmludGVydmFsKGludGVydmFsPFQsIFBvbGljaWVzPiBjb25zdCAmcik6IGxvdyhyLmxvd2VyKCkpLCB1cChyLnVwcGVyKCkpCnt9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gdGVtcGxhdGU8Y2xhc3MgUG9saWNpZXMxPiBpbmxpbmUKaW50ZXJ2YWw8VCwgUG9saWNpZXM+OjppbnRlcnZhbChpbnRlcnZhbDxULCBQb2xpY2llczE+IGNvbnN0ICZyKTogbG93KHIubG93ZXIoKSksIHVwKHIudXBwZXIoKSkKewogIHR5cGVkZWYgdHlwZW5hbWUgUG9saWNpZXMxOjpjaGVja2luZyBjaGVja2luZzE7CiAgaWYgKGNoZWNraW5nMTo6aXNfZW1wdHkoci5sb3dlcigpLCByLnVwcGVyKCkpKSBzZXRfZW1wdHkoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IHRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBQb2xpY2llczE+IGlubGluZQppbnRlcnZhbDxULCBQb2xpY2llcz46OmludGVydmFsKGludGVydmFsPFQxLCBQb2xpY2llczE+IGNvbnN0ICZyKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBQb2xpY2llczE6OmNoZWNraW5nIGNoZWNraW5nMTsKICBpZiAoY2hlY2tpbmcxOjppc19lbXB0eShyLmxvd2VyKCksIHIudXBwZXIoKSkpIHNldF9lbXB0eSgpOwogIGVsc2UgewogICAgcm91bmRpbmcgcm5kOwogICAgbG93ID0gcm5kLmNvbnZfZG93bihyLmxvd2VyKCkpOwogICAgdXAgID0gcm5kLmNvbnZfdXAgIChyLnVwcGVyKCkpOwogIH0KfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQppbnRlcnZhbDxULCBQb2xpY2llcz4gJmludGVydmFsPFQsIFBvbGljaWVzPjo6b3BlcmF0b3I9KFQgY29uc3QgJnYpCnsKICBpZiAoY2hlY2tpbmc6OmlzX25hbih2KSkgc2V0X2VtcHR5KCk7CiAgZWxzZSBsb3cgPSB1cCA9IHY7CiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gdGVtcGxhdGU8Y2xhc3MgVDE+IGlubGluZQppbnRlcnZhbDxULCBQb2xpY2llcz4gJmludGVydmFsPFQsIFBvbGljaWVzPjo6b3BlcmF0b3I9KFQxIGNvbnN0ICZ2KQp7CiAgaWYgKGNoZWNraW5nOjppc19uYW4odikpIHNldF9lbXB0eSgpOwogIGVsc2UgewogICAgcm91bmRpbmcgcm5kOwogICAgbG93ID0gcm5kLmNvbnZfZG93bih2KTsKICAgIHVwICA9IHJuZC5jb252X3VwICAodik7CiAgfQogIHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQppbnRlcnZhbDxULCBQb2xpY2llcz4gJmludGVydmFsPFQsIFBvbGljaWVzPjo6b3BlcmF0b3I9KGludGVydmFsPFQsIFBvbGljaWVzPiBjb25zdCAmcikKewogIGxvdyA9IHIubG93ZXIoKTsKICB1cCAgPSByLnVwcGVyKCk7CiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gdGVtcGxhdGU8Y2xhc3MgUG9saWNpZXMxPiBpbmxpbmUKaW50ZXJ2YWw8VCwgUG9saWNpZXM+ICZpbnRlcnZhbDxULCBQb2xpY2llcz46Om9wZXJhdG9yPShpbnRlcnZhbDxULCBQb2xpY2llczE+IGNvbnN0ICZyKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBQb2xpY2llczE6OmNoZWNraW5nIGNoZWNraW5nMTsKICBpZiAoY2hlY2tpbmcxOjppc19lbXB0eShyLmxvd2VyKCksIHIudXBwZXIoKSkpIHNldF9lbXB0eSgpOwogIGVsc2UgewogICAgbG93ID0gci5sb3dlcigpOwogICAgdXAgID0gci51cHBlcigpOwogIH0KICByZXR1cm4gKnRoaXM7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiB0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgUG9saWNpZXMxPiBpbmxpbmUKaW50ZXJ2YWw8VCwgUG9saWNpZXM+ICZpbnRlcnZhbDxULCBQb2xpY2llcz46Om9wZXJhdG9yPShpbnRlcnZhbDxUMSwgUG9saWNpZXMxPiBjb25zdCAmcikKewogIHR5cGVkZWYgdHlwZW5hbWUgUG9saWNpZXMxOjpjaGVja2luZyBjaGVja2luZzE7CiAgaWYgKGNoZWNraW5nMTo6aXNfZW1wdHkoci5sb3dlcigpLCByLnVwcGVyKCkpKSBzZXRfZW1wdHkoKTsKICBlbHNlIHsKICAgIHJvdW5kaW5nIHJuZDsKICAgIGxvdyA9IHJuZC5jb252X2Rvd24oci5sb3dlcigpKTsKICAgIHVwICA9IHJuZC5jb252X3VwICAoci51cHBlcigpKTsKICB9CiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCnZvaWQgaW50ZXJ2YWw8VCwgUG9saWNpZXM+Ojphc3NpZ24oY29uc3QgVCYgbCwgY29uc3QgVCYgdSkKewogIGlmIChjaGVja2luZzo6aXNfbmFuKGwpIHx8IGNoZWNraW5nOjppc19uYW4odSkgfHwgIShsIDw9IHUpKQogICAgc2V0X2VtcHR5KCk7CiAgZWxzZSBzZXQobCwgdSk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKdm9pZCBpbnRlcnZhbDxULCBQb2xpY2llcz46OnNldChjb25zdCBUJiBsLCBjb25zdCBUJiB1KQp7CiAgbG93ID0gbDsKICB1cCAgPSB1Owp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCnZvaWQgaW50ZXJ2YWw8VCwgUG9saWNpZXM+OjpzZXRfZW1wdHkoKQp7CiAgbG93ID0gY2hlY2tpbmc6OmVtcHR5X2xvd2VyKCk7CiAgdXAgID0gY2hlY2tpbmc6OmVtcHR5X3VwcGVyKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKdm9pZCBpbnRlcnZhbDxULCBQb2xpY2llcz46OnNldF93aG9sZSgpCnsKICBsb3cgPSBjaGVja2luZzo6bmVnX2luZigpOwogIHVwICA9IGNoZWNraW5nOjpwb3NfaW5mKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKaW50ZXJ2YWw8VCwgUG9saWNpZXM+IGludGVydmFsPFQsIFBvbGljaWVzPjo6aHVsbChjb25zdCBUJiB4LCBjb25zdCBUJiB5KQp7CiAgYm9vbCBiYWRfeCA9IGNoZWNraW5nOjppc19uYW4oeCk7CiAgYm9vbCBiYWRfeSA9IGNoZWNraW5nOjppc19uYW4oeSk7CiAgaWYgKGJhZF94KQogICAgaWYgKGJhZF95KSByZXR1cm4gaW50ZXJ2YWw6OmVtcHR5KCk7CiAgICBlbHNlICAgICAgIHJldHVybiBpbnRlcnZhbCh5LCB5LCB0cnVlKTsKICBlbHNlCiAgICBpZiAoYmFkX3kpIHJldHVybiBpbnRlcnZhbCh4LCB4LCB0cnVlKTsKICBpZiAoeCA8PSB5KSByZXR1cm4gaW50ZXJ2YWwoeCwgeSwgdHJ1ZSk7CiAgZWxzZSAgICAgICAgcmV0dXJuIGludGVydmFsKHksIHgsIHRydWUpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmludGVydmFsPFQsIFBvbGljaWVzPiBpbnRlcnZhbDxULCBQb2xpY2llcz46OmVtcHR5KCkKewogIHJldHVybiBpbnRlcnZhbDxULCBQb2xpY2llcz4oY2hlY2tpbmc6OmVtcHR5X2xvd2VyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2luZzo6ZW1wdHlfdXBwZXIoKSwgdHJ1ZSk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKaW50ZXJ2YWw8VCwgUG9saWNpZXM+IGludGVydmFsPFQsIFBvbGljaWVzPjo6d2hvbGUoKQp7CiAgcmV0dXJuIGludGVydmFsPFQsIFBvbGljaWVzPihjaGVja2luZzo6bmVnX2luZigpLCBjaGVja2luZzo6cG9zX2luZigpLCB0cnVlKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpjb25zdCBUJiBpbnRlcnZhbDxULCBQb2xpY2llcz46Omxvd2VyKCkgY29uc3QKewogIHJldHVybiBsb3c7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKY29uc3QgVCYgaW50ZXJ2YWw8VCwgUG9saWNpZXM+Ojp1cHBlcigpIGNvbnN0CnsKICByZXR1cm4gdXA7Cn0KCi8qCiAqIGludGVydmFsL2ludGVydmFsIGNvbXBhcmlzb25zCiAqLwoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIGludGVydmFsPFQsIFBvbGljaWVzPjo6b3BlcmF0b3I8IChjb25zdCBpbnRlcnZhbF9ob2xkZXImIHIpIGNvbnN0CnsKICBpZiAoIWNoZWNraW5nOjppc19lbXB0eShsb3csIHVwKSkgewogICAgaWYgKHVwIDwgci5sb3cpIHJldHVybiB0cnVlOwogICAgZWxzZSBpZiAobG93ID49IHIudXApIHJldHVybiBmYWxzZTsKICB9CiAgdGhyb3cgaW50ZXJ2YWxfbGliOjpjb21wYXJpc29uX2Vycm9yKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBpbnRlcnZhbDxULCBQb2xpY2llcz46Om9wZXJhdG9yPiAoY29uc3QgaW50ZXJ2YWxfaG9sZGVyJiByKSBjb25zdAp7CiAgaWYgKCFjaGVja2luZzo6aXNfZW1wdHkobG93LCB1cCkpIHsKICAgIGlmIChsb3cgPiByLnVwKSByZXR1cm4gdHJ1ZTsKICAgIGVsc2UgaWYgKHVwIDw9IHIubG93KSByZXR1cm4gZmFsc2U7CiAgfQogIHRocm93IGludGVydmFsX2xpYjo6Y29tcGFyaXNvbl9lcnJvcigpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgaW50ZXJ2YWw8VCwgUG9saWNpZXM+OjpvcGVyYXRvcjw9IChjb25zdCBpbnRlcnZhbF9ob2xkZXImIHIpIGNvbnN0CnsKICBpZiAoIWNoZWNraW5nOjppc19lbXB0eShsb3csIHVwKSkgewogICAgaWYgKHVwIDw9IHIubG93KSByZXR1cm4gdHJ1ZTsKICAgIGVsc2UgaWYgKGxvdyA+IHIudXApIHJldHVybiBmYWxzZTsKICB9CiAgdGhyb3cgaW50ZXJ2YWxfbGliOjpjb21wYXJpc29uX2Vycm9yKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBpbnRlcnZhbDxULCBQb2xpY2llcz46Om9wZXJhdG9yPj0gKGNvbnN0IGludGVydmFsX2hvbGRlciYgcikgY29uc3QKewogIGlmICghY2hlY2tpbmc6OmlzX2VtcHR5KGxvdywgdXApKSB7CiAgICBpZiAobG93ID49IHIudXApIHJldHVybiB0cnVlOwogICAgZWxzZSBpZiAodXAgPCByLmxvdykgcmV0dXJuIGZhbHNlOwogIH0KICB0aHJvdyBpbnRlcnZhbF9saWI6OmNvbXBhcmlzb25fZXJyb3IoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIGludGVydmFsPFQsIFBvbGljaWVzPjo6b3BlcmF0b3I9PSAoY29uc3QgaW50ZXJ2YWxfaG9sZGVyJiByKSBjb25zdAp7CiAgaWYgKCFjaGVja2luZzo6aXNfZW1wdHkobG93LCB1cCkpIHsKICAgIGlmICh1cCA9PSByLmxvdyAmJiBsb3cgPT0gci51cCkgcmV0dXJuIHRydWU7CiAgICBlbHNlIGlmICh1cCA8IHIubG93IHx8IGxvdyA+IHIudXApIHJldHVybiBmYWxzZTsKICB9CiAgdGhyb3cgaW50ZXJ2YWxfbGliOjpjb21wYXJpc29uX2Vycm9yKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBpbnRlcnZhbDxULCBQb2xpY2llcz46Om9wZXJhdG9yIT0gKGNvbnN0IGludGVydmFsX2hvbGRlciYgcikgY29uc3QKewogIGlmICghY2hlY2tpbmc6OmlzX2VtcHR5KGxvdywgdXApKSB7CiAgICBpZiAodXAgPCByLmxvdyB8fCBsb3cgPiByLnVwKSByZXR1cm4gdHJ1ZTsKICAgIGVsc2UgaWYgKHVwID09IHIubG93ICYmIGxvdyA9PSByLnVwKSByZXR1cm4gZmFsc2U7CiAgfQogIHRocm93IGludGVydmFsX2xpYjo6Y29tcGFyaXNvbl9lcnJvcigpOwp9CgovKgogKiBpbnRlcnZhbC9udW1iZXIgY29tcGFyaXNvbnMKICovCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgaW50ZXJ2YWw8VCwgUG9saWNpZXM+OjpvcGVyYXRvcjwgKGNvbnN0IG51bWJlcl9ob2xkZXImIHIpIGNvbnN0CnsKICBpZiAoIWNoZWNraW5nOjppc19lbXB0eShsb3csIHVwKSkgewogICAgaWYgKHVwIDwgci52YWwpIHJldHVybiB0cnVlOwogICAgZWxzZSBpZiAobG93ID49IHIudmFsKSByZXR1cm4gZmFsc2U7CiAgfQogIHRocm93IGludGVydmFsX2xpYjo6Y29tcGFyaXNvbl9lcnJvcigpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgaW50ZXJ2YWw8VCwgUG9saWNpZXM+OjpvcGVyYXRvcj4gKGNvbnN0IG51bWJlcl9ob2xkZXImIHIpIGNvbnN0CnsKICBpZiAoIWNoZWNraW5nOjppc19lbXB0eShsb3csIHVwKSkgewogICAgaWYgKGxvdyA+IHIudmFsKSByZXR1cm4gdHJ1ZTsKICAgIGVsc2UgaWYgKHVwIDw9IHIudmFsKSByZXR1cm4gZmFsc2U7CiAgfQogIHRocm93IGludGVydmFsX2xpYjo6Y29tcGFyaXNvbl9lcnJvcigpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgaW50ZXJ2YWw8VCwgUG9saWNpZXM+OjpvcGVyYXRvcjw9IChjb25zdCBudW1iZXJfaG9sZGVyJiByKSBjb25zdAp7CiAgaWYgKCFjaGVja2luZzo6aXNfZW1wdHkobG93LCB1cCkpIHsKICAgIGlmICh1cCA8PSByLnZhbCkgcmV0dXJuIHRydWU7CiAgICBlbHNlIGlmIChsb3cgPiByLnZhbCkgcmV0dXJuIGZhbHNlOwogIH0KICB0aHJvdyBpbnRlcnZhbF9saWI6OmNvbXBhcmlzb25fZXJyb3IoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQpib29sIGludGVydmFsPFQsIFBvbGljaWVzPjo6b3BlcmF0b3I+PSAoY29uc3QgbnVtYmVyX2hvbGRlciYgcikgY29uc3QKewogIGlmICghY2hlY2tpbmc6OmlzX2VtcHR5KGxvdywgdXApKSB7CiAgICBpZiAobG93ID49IHIudmFsKSByZXR1cm4gdHJ1ZTsKICAgIGVsc2UgaWYgKHVwIDwgci52YWwpIHJldHVybiBmYWxzZTsKICB9CiAgdGhyb3cgaW50ZXJ2YWxfbGliOjpjb21wYXJpc29uX2Vycm9yKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUKYm9vbCBpbnRlcnZhbDxULCBQb2xpY2llcz46Om9wZXJhdG9yPT0gKGNvbnN0IG51bWJlcl9ob2xkZXImIHIpIGNvbnN0CnsKICBpZiAoIWNoZWNraW5nOjppc19lbXB0eShsb3csIHVwKSkgewogICAgaWYgKHVwID09IHIudmFsICYmIGxvdyA9PSByLnZhbCkgcmV0dXJuIHRydWU7CiAgICBlbHNlIGlmICh1cCA8IHIudmFsIHx8IGxvdyA+IHIudmFsKSByZXR1cm4gZmFsc2U7CiAgfQogIHRocm93IGludGVydmFsX2xpYjo6Y29tcGFyaXNvbl9lcnJvcigpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lCmJvb2wgaW50ZXJ2YWw8VCwgUG9saWNpZXM+OjpvcGVyYXRvciE9IChjb25zdCBudW1iZXJfaG9sZGVyJiByKSBjb25zdAp7CiAgaWYgKCFjaGVja2luZzo6aXNfZW1wdHkobG93LCB1cCkpIHsKICAgIGlmICh1cCA8IHIudmFsIHx8IGxvdyA+IHIudmFsKSByZXR1cm4gdHJ1ZTsKICAgIGVsc2UgaWYgKHVwID09IHIudmFsICYmIGxvdyA9PSByLnZhbCkgcmV0dXJuIGZhbHNlOwogIH0KICB0aHJvdyBpbnRlcnZhbF9saWI6OmNvbXBhcmlzb25fZXJyb3IoKTsKfQoKfSAvLyBuYW1lc3BhY2UgbnVtZXJpYwp9IC8vIG5hbWVzcGFjZSBib29zdAoKI2VuZGlmIC8vIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfSU5URVJWQUxfSFBQCg==