LyogcHdnZW4uYyAtIEEgcGFzc3dvcmQgZ2VuZXJhdG9yLgogKgogKiBDb3B5cmlnaHQgMjAyMCBNb3JpdHogUvZocmljaCA8bW9yaXR6QGlsZGVmb25zLmRlPgoKVVNFX1BXR0VOKE5FV1RPWShwd2dlbiwgIj4ycihyZW1vdmUpOmMoY2FwaXRhbGl6ZSluKG51bWVyYWxzKXkoc3ltYm9scylzKHNlY3VyZSlCKGFtYmlndW91cyloKGhlbHApQzF2QShuby1jYXBpdGFsaXplKTAobm8tbnVtZXJhbHMpWy1jQV1bLW4wXVstQzFdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQoKY29uZmlnIFBXR0VOCiAgYm9vbCAicHdnZW4iCiAgZGVmYXVsdCB5CiAgaGVscAogICAgdXNhZ2U6IHB3Z2VuIFstY0FuMHlyc0JoQzF2XSBbTEVOR1RIXSBbQ09VTlRdCgogICAgR2VuZXJhdGUgaHVtYW4tcmVhZGFibGUgcmFuZG9tIHBhc3N3b3Jkcy4gV2hlbiBvdXRwdXQgaXMgdG8gdHR5IHByb2R1Y2VzCiAgICBhIHNjcmVlbmZ1bGwgdG8gZGVmZWF0IHNob3VsZGVyIHN1cmZpbmcgKHBpY2sgb25lIGFuZCBjbGVhciB0aGUgc2NyZWVuKS4KCiAgICAtYyAgLS1jYXBpdGFsaXplICAgICAgICAgICAgICAgICAgUGVybWl0IGNhcGl0YWwgbGV0dGVycy4KICAgIC1BICAtLW5vLWNhcGl0YWxpemUgICAgICAgICAgICAgICBEb24ndCBpbmNsdWRlIGNhcGl0YWwgbGV0dGVycy4KICAgIC1uICAtLW51bWVyYWxzICAgICAgICAgICAgICAgICAgICBQZXJtaXQgbnVtYmVycy4KICAgIC0wICAtLW5vLW51bWVyYWxzICAgICAgICAgICAgICAgICBEb24ndCBpbmNsdWRlIG51bWJlcnMuCiAgICAteSAgLS1zeW1ib2xzICAgICAgICAgICAgICAgICAgICAgUGVybWl0IHNwZWNpYWwgY2hhcmFjdGVycyAoJCMlLi4uKS4KICAgIC1yIDxjaGFycz4gIC0tcmVtb3ZlPTxjaGFycz4gICAgICBEb24ndCBpbmNsdWRlIHRoZSBnaXZlbiBjaGFyYWN0ZXJzLgogICAgLXMgIC0tc2VjdXJlICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIG1vcmUgcmFuZG9tIHBhc3N3b3Jkcy4KICAgIC1CICAtLWFtYmlndW91cyAgICAgICAgICAgICAgICAgICBBdm9pZCBhbWJpZ3VvdXMgY2hhcmFjdGVycyAoZS5nLiAwLCBPKS4KICAgIC1oICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgbWVzc2FnZS4KICAgIC1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGUgb3V0cHV0IGluIGNvbHVtbnMuCiAgICAtMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQgdGhlIG91dHB1dCBvbmUgbGluZSBlYWNoLgogICAgLXYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGluY2x1ZGUgdm93ZWxzLgoqLwoKI2RlZmluZSBGT1JfcHdnZW4KI2luY2x1ZGUgInRveXMuaCIKCkdMT0JBTFMoCiAgY2hhciAqcjsKKQoKdm9pZCBwd2dlbl9tYWluKHZvaWQpCnsKICBpbnQgbGVuZ3RoID0gOCwgY291bnQsIGlpLCBqaiwgYywgcmFuZCA9IDAsIHggPSAwOwogIHVuc2lnbmVkIHh4ID0gODAsIHl5ID0gMjQ7CiAgY2hhciByYW5kYnVmWzE2XTsKCiAgaWYgKGlzYXR0eSgxKSkgdGVybWluYWxfc2l6ZSgmeHgsICZ5eSk7CiAgZWxzZSB0b3lzLm9wdGZsYWdzIHw9IEZMQUdfMTsKCiAgaWYgKHRveXMub3B0YyAmJiAobGVuZ3RoID0gYXRvbHgoKnRveXMub3B0YXJncykpPnNpemVvZih0b3lidWYpKQogICAgZXJyb3JfZXhpdCgiYmFkIGxlbmd0aCIpOwogIGlmICh0b3lzLm9wdGM+MSkgY291bnQgPSBhdG9seCh0b3lzLm9wdGFyZ3NbMV0pOwogIGVsc2UgY291bnQgPSBGTEFHKDEpID8gMSA6ICh4eC8obGVuZ3RoKzEpKSooeXktMSk7CgogIGZvciAoamogPSAwOyBqajxjb3VudDsgamorKykgewogICAgZm9yIChpaSA9IDA7IGlpPGxlbmd0aDspIHsKICAgICAgLy8gRG9uJ3QgZmV0Y2ggbW9yZSByYW5kb20gdGhhbiBuZWNlc3NhcnksIGdpdmUgZWFjaCBieXRlIDIgdHJpZXMgdG8gZml0CiAgICAgIGlmICghcmFuZCkgeGdldHJhbmRvbShyYW5kYnVmLCByYW5kID0gc2l6ZW9mKHJhbmRidWYpLCAwKTsKICAgICAgYyA9IDMzK3JhbmRidWZbLS1yYW5kXSU5MzsgLy8gcmVtYWluZGVyIDY5IG1ha2VzID4xMDIgbGVzcyBsaWtlbHkKICAgICAgaWYgKEZMQUcocykpIHJhbmRidWZbcmFuZF0gPSAwOwoKICAgICAgaWYgKGM+PSdBJyAmJiBjPD0nWicpIHsKICAgICAgICBpZiAoRkxBRyhBKSkgY29udGludWU7CiAgICAgICAgLy8gdGFrZSBvdXQgaGFsZiB0aGUgY2FwaXRhbCBsZXR0ZXJzIHRvIGJlIG1vcmUgaHVtYW4gcmVhZGFibGUKICAgICAgICBlbHNlIGMgfD0gKDB4ODAmcmFuZGJ1ZltyYW5kXSk+PjI7CiAgICAgIH0KICAgICAgaWYgKEZMQUcoMCkgJiYgYz49JzAnICYmIGM8PSc5JykgY29udGludWU7CiAgICAgIGlmIChGTEFHKEIpICYmIHN0cmNocigiME8xbEknYC4sIiwgYykpIGNvbnRpbnVlOwogICAgICBpZiAoRkxBRyh2KSAmJiBzdHJjaHIoImFlaW91IiwgdG9sb3dlcihjKSkpIGNvbnRpbnVlOwogICAgICBpZiAoIUZMQUcoeSkgfHwgKDB4ODAmcmFuZGJ1ZltyYW5kXSkpCiAgICAgICAgaWYgKGM8JzAnIHx8IChjPic5JyAmJiBjPCdBJykgfHwgKGM+J1onICYmIGM8J2EnKSB8fCBjPid6JykgY29udGludWU7CiAgICAgIGlmIChUVC5yICYmIHN0cmNocihUVC5yLCBjKSkgY29udGludWU7CgogICAgICB0b3lidWZbaWkrK10gPSBjOwogICAgfQogICAgaWYgKEZMQUcoMSkgfHwgKHggKz0gbGVuZ3RoKzEpK2xlbmd0aD49eHgpIHggPSAwOwogICAgeHByaW50ZigiJS4qcyVjIiwgbGVuZ3RoLCB0b3lidWYsIHggPyAnICcgOiAnXG4nKTsKICB9CiAgaWYgKHgpIHhwdXRjKCdcbicpOwp9Cg==