Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRnVuY3Rpb24uY2MKLy8KLy8gQ29weXJpZ2h0IDIwMDEtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LTIwMTAsIDIwMTMgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAwNiBKZWZmIE11aXplbGFhciA8amVmZkBpbmZpZGlnbS5uZXQ+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBDaHJpc3RpYW4gRmV1ZXJz5G5nZXIgPGNmZXVlcnNhZW5nZXJAZ29vZ2xlbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMSBBbmRyZWEgQ2FuY2lhbmkgPHJhbm1hNDJAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhvbWFzIEZyZWl0YWcgPFRob21hcy5GcmVpdGFnQGFsZmEuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAxMiBBZGFtIFJlaWNob2xkIDxhZGFtcmVpY2hvbGRAbXlvcGVyYS5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMyBGYWJpbyBEJ1Vyc28gPGZhYmlvZHVyc29AaG90bWFpbC5pdD4KLy8KLy8gVG8gc2VlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgcGxlYXNlIHNlZSB0aGUgQ2hhbmdlbG9nIGZpbGUgdGhhdAovLyBjYW1lIHdpdGggeW91ciB0YXJiYWxsIG9yIHR5cGUgbWFrZSBDaGFuZ2VMb2cgaWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGdpdAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2lmZGVmIFVTRV9HQ0NfUFJBR01BUwojcHJhZ21hIGltcGxlbWVudGF0aW9uCiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSAiZ29vL2dtZW0uaCIKI2luY2x1ZGUgImdvby9nc3RydG9kLmgiCiNpbmNsdWRlICJPYmplY3QuaCIKI2luY2x1ZGUgIkRpY3QuaCIKI2luY2x1ZGUgIlN0cmVhbS5oIgojaW5jbHVkZSAiRXJyb3IuaCIKI2luY2x1ZGUgIkZ1bmN0aW9uLmgiCgojaWZuZGVmIE1fUEkKI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKI2VuZGlmCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRnVuY3Rpb246OkZ1bmN0aW9uKCkgewp9CgpGdW5jdGlvbjo6fkZ1bmN0aW9uKCkgewp9CgpGdW5jdGlvbiAqRnVuY3Rpb246OnBhcnNlKE9iamVjdCAqZnVuY09iaikgewogIHN0ZDo6c2V0PGludD4gdXNlZFBhcmVudHM7CiAgcmV0dXJuIHBhcnNlKGZ1bmNPYmosICZ1c2VkUGFyZW50cyk7Cn0KCkZ1bmN0aW9uICpGdW5jdGlvbjo6cGFyc2UoT2JqZWN0ICpmdW5jT2JqLCBzdGQ6OnNldDxpbnQ+ICp1c2VkUGFyZW50cykgewogIEZ1bmN0aW9uICpmdW5jOwogIERpY3QgKmRpY3Q7CiAgaW50IGZ1bmNUeXBlOwogIE9iamVjdCBvYmoxOwoKICBpZiAoZnVuY09iai0+aXNTdHJlYW0oKSkgewogICAgZGljdCA9IGZ1bmNPYmotPnN0cmVhbUdldERpY3QoKTsKICB9IGVsc2UgaWYgKGZ1bmNPYmotPmlzRGljdCgpKSB7CiAgICBkaWN0ID0gZnVuY09iai0+Z2V0RGljdCgpOwogIH0gZWxzZSBpZiAoZnVuY09iai0+aXNOYW1lKCJJZGVudGl0eSIpKSB7CiAgICByZXR1cm4gbmV3IElkZW50aXR5RnVuY3Rpb24oKTsKICB9IGVsc2UgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRXhwZWN0ZWQgZnVuY3Rpb24gZGljdGlvbmFyeSBvciBzdHJlYW0iKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgaWYgKCFkaWN0LT5sb29rdXAoIkZ1bmN0aW9uVHlwZSIsICZvYmoxKS0+aXNJbnQoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gdHlwZSBpcyBtaXNzaW5nIG9yIHdyb25nIHR5cGUiKTsKICAgIG9iajEuZnJlZSgpOwogICAgcmV0dXJuIE5VTEw7CiAgfQogIGZ1bmNUeXBlID0gb2JqMS5nZXRJbnQoKTsKICBvYmoxLmZyZWUoKTsKCiAgaWYgKGZ1bmNUeXBlID09IDApIHsKICAgIGZ1bmMgPSBuZXcgU2FtcGxlZEZ1bmN0aW9uKGZ1bmNPYmosIGRpY3QpOwogIH0gZWxzZSBpZiAoZnVuY1R5cGUgPT0gMikgewogICAgZnVuYyA9IG5ldyBFeHBvbmVudGlhbEZ1bmN0aW9uKGZ1bmNPYmosIGRpY3QpOwogIH0gZWxzZSBpZiAoZnVuY1R5cGUgPT0gMykgewogICAgZnVuYyA9IG5ldyBTdGl0Y2hpbmdGdW5jdGlvbihmdW5jT2JqLCBkaWN0LCB1c2VkUGFyZW50cyk7CiAgfSBlbHNlIGlmIChmdW5jVHlwZSA9PSA0KSB7CiAgICBmdW5jID0gbmV3IFBvc3RTY3JpcHRGdW5jdGlvbihmdW5jT2JqLCBkaWN0KTsKICB9IGVsc2UgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVW5pbXBsZW1lbnRlZCBmdW5jdGlvbiB0eXBlICh7MDpkfSkiLCBmdW5jVHlwZSk7CiAgICByZXR1cm4gTlVMTDsKICB9CiAgaWYgKCFmdW5jLT5pc09rKCkpIHsKICAgIGRlbGV0ZSBmdW5jOwogICAgcmV0dXJuIE5VTEw7CiAgfQoKICByZXR1cm4gZnVuYzsKfQoKRnVuY3Rpb246OkZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpmdW5jKSB7CiAgICBtID0gZnVuYy0+bTsKICAgIG4gPSBmdW5jLT5uOwoKICAgIG1lbWNweShkb21haW4sIGZ1bmMtPmRvbWFpbiwgZnVuY01heElucHV0cyAqIDIgKiBzaXplb2YoZG91YmxlKSk7CiAgICBtZW1jcHkocmFuZ2UsIGZ1bmMtPnJhbmdlLCBmdW5jTWF4T3V0cHV0cyAqIDIgKiBzaXplb2YoZG91YmxlKSk7CgogICAgaGFzUmFuZ2UgPSBmdW5jLT5oYXNSYW5nZTsKfQoKR0Jvb2wgRnVuY3Rpb246OmluaXQoRGljdCAqZGljdCkgewogIE9iamVjdCBvYmoxLCBvYmoyOwogIGludCBpOwoKICAvLy0tLS0tIERvbWFpbgogIGlmICghZGljdC0+bG9va3VwKCJEb21haW4iLCAmb2JqMSktPmlzQXJyYXkoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaXMgbWlzc2luZyBkb21haW4iKTsKICAgIGdvdG8gZXJyMjsKICB9CiAgbSA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKSAvIDI7CiAgaWYgKG0gPiBmdW5jTWF4SW5wdXRzKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gezA6ZH0gaW5wdXRzIGFyZSB1bnN1cHBvcnRlZCIsCgkgIGZ1bmNNYXhJbnB1dHMpOwogICAgZ290byBlcnIyOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBvYmoxLmFycmF5R2V0KDIqaSwgJm9iajIpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkb21haW4gYXJyYXkiKTsKICAgICAgZ290byBlcnIxOwogICAgfQogICAgZG9tYWluW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgIG9iajIuZnJlZSgpOwogICAgb2JqMS5hcnJheUdldCgyKmkrMSwgJm9iajIpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkb21haW4gYXJyYXkiKTsKICAgICAgZ290byBlcnIxOwogICAgfQogICAgZG9tYWluW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgIG9iajIuZnJlZSgpOwogIH0KICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBSYW5nZQogIGhhc1JhbmdlID0gZ0ZhbHNlOwogIG4gPSAwOwogIGlmIChkaWN0LT5sb29rdXAoIlJhbmdlIiwgJm9iajEpLT5pc0FycmF5KCkpIHsKICAgIGhhc1JhbmdlID0gZ1RydWU7CiAgICBuID0gb2JqMS5hcnJheUdldExlbmd0aCgpIC8gMjsKICAgIGlmIChuID4gZnVuY01heE91dHB1dHMpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuIHswOmR9IG91dHB1dHMgYXJlIHVuc3VwcG9ydGVkIiwKCSAgICBmdW5jTWF4T3V0cHV0cyk7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb2JqMS5hcnJheUdldCgyKmksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gcmFuZ2UgYXJyYXkiKTsKCWdvdG8gZXJyMTsKICAgICAgfQogICAgICByYW5nZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgICBvYmoxLmFycmF5R2V0KDIqaSsxLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIHJhbmdlIGFycmF5Iik7Cglnb3RvIGVycjE7CiAgICAgIH0KICAgICAgcmFuZ2VbaV1bMV0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgIH0KICB9CiAgb2JqMS5mcmVlKCk7CgogIHJldHVybiBnVHJ1ZTsKCiBlcnIxOgogIG9iajIuZnJlZSgpOwogZXJyMjoKICBvYmoxLmZyZWUoKTsKICByZXR1cm4gZ0ZhbHNlOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBJZGVudGl0eUZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJZGVudGl0eUZ1bmN0aW9uOjpJZGVudGl0eUZ1bmN0aW9uKCkgewogIGludCBpOwoKICAvLyBmaWxsIHRoZXNlIGluIHdpdGggYXJiaXRyYXJ5IHZhbHVlcyBqdXN0IGluIGNhc2UgdGhleSBnZXQgdXNlZAogIC8vIHNvbWV3aGVyZQogIG0gPSBmdW5jTWF4SW5wdXRzOwogIG4gPSBmdW5jTWF4T3V0cHV0czsKICBmb3IgKGkgPSAwOyBpIDwgZnVuY01heElucHV0czsgKytpKSB7CiAgICBkb21haW5baV1bMF0gPSAwOwogICAgZG9tYWluW2ldWzFdID0gMTsKICB9CiAgaGFzUmFuZ2UgPSBnRmFsc2U7Cn0KCklkZW50aXR5RnVuY3Rpb246On5JZGVudGl0eUZ1bmN0aW9uKCkgewp9Cgp2b2lkIElkZW50aXR5RnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIGludCBpOwoKICBmb3IgKGkgPSAwOyBpIDwgZnVuY01heE91dHB1dHM7ICsraSkgewogICAgb3V0W2ldID0gaW5baV07CiAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTYW1wbGVkRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClNhbXBsZWRGdW5jdGlvbjo6U2FtcGxlZEZ1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCkgewogIFN0cmVhbSAqc3RyOwogIGludCBzYW1wbGVCaXRzOwogIGRvdWJsZSBzYW1wbGVNdWw7CiAgT2JqZWN0IG9iajEsIG9iajI7CiAgR3VpbnQgYnVmLCBiaXRNYXNrOwogIGludCBiaXRzOwogIEd1aW50IHM7CiAgZG91YmxlIGluW2Z1bmNNYXhJbnB1dHNdOwogIGludCBpLCBqLCB0LCBiaXQsIGlkeDsKCiAgaWR4T2Zmc2V0ID0gTlVMTDsKICBzYW1wbGVzID0gTlVMTDsKICBzQnVmID0gTlVMTDsKICBvayA9IGdGYWxzZTsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmICghaGFzUmFuZ2UpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgMCBmdW5jdGlvbiBpcyBtaXNzaW5nIHJhbmdlIik7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmIChtID4gc2FtcGxlZEZ1bmNNYXhJbnB1dHMpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlNhbXBsZWQgZnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuIHswOmR9IGlucHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICBzYW1wbGVkRnVuY01heElucHV0cyk7CiAgICBnb3RvIGVycjE7CiAgfQoKICAvLy0tLS0tIGJ1ZmZlcgogIHNCdWYgPSAoZG91YmxlICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoZG91YmxlKSk7CgogIC8vLS0tLS0gZ2V0IHRoZSBzdHJlYW0KICBpZiAoIWZ1bmNPYmotPmlzU3RyZWFtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgMCBmdW5jdGlvbiBpc24ndCBhIHN0cmVhbSIpOwogICAgZ290byBlcnIxOwogIH0KICBzdHIgPSBmdW5jT2JqLT5nZXRTdHJlYW0oKTsKCiAgLy8tLS0tLSBTaXplCiAgaWYgKCFkaWN0LT5sb29rdXAoIlNpemUiLCAmb2JqMSktPmlzQXJyYXkoKSB8fAogICAgICBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBzaXplIGFycmF5Iik7CiAgICBnb3RvIGVycjI7CiAgfQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIG9iajEuYXJyYXlHZXQoaSwgJm9iajIpOwogICAgaWYgKCFvYmoyLmlzSW50KCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBzaXplIGFycmF5Iik7CiAgICAgIGdvdG8gZXJyMzsKICAgIH0KICAgIHNhbXBsZVNpemVbaV0gPSBvYmoyLmdldEludCgpOwogICAgaWYgKHNhbXBsZVNpemVbaV0gPD0gMCkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIG5vbi1wb3NpdGl2ZSB2YWx1ZSBpbiBmdW5jdGlvbiBzaXplIGFycmF5Iik7CiAgICAgIGdvdG8gZXJyMzsKICAgIH0KICAgIG9iajIuZnJlZSgpOwogIH0KICBvYmoxLmZyZWUoKTsKICBpZHhPZmZzZXQgPSAoaW50ICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoaW50KSk7CiAgZm9yIChpID0gMDsgaSA8ICgxPDxtKTsgKytpKSB7CiAgICBpZHggPSAwOwogICAgZm9yIChqID0gbSAtIDEsIHQgPSBpOyBqID49IDE7IC0taiwgdCA8PD0gMSkgewogICAgICBpZiAoc2FtcGxlU2l6ZVtqXSA9PSAxKSB7CgliaXQgPSAwOwogICAgICB9IGVsc2UgewoJYml0ID0gKHQgPj4gKG0gLSAxKSkgJiAxOwogICAgICB9CiAgICAgIGlkeCA9IChpZHggKyBiaXQpICogc2FtcGxlU2l6ZVtqLTFdOwogICAgfQogICAgaWYgKHNhbXBsZVNpemVbMF0gPT0gMSkgewogICAgICBiaXQgPSAwOwogICAgfSBlbHNlIHsKICAgICAgYml0ID0gKHQgPj4gKG0gLSAxKSkgJiAxOwogICAgfQogICAgaWR4T2Zmc2V0W2ldID0gKGlkeCArIGJpdCkgKiBuOwogIH0KCiAgLy8tLS0tLSBCaXRzUGVyU2FtcGxlCiAgaWYgKCFkaWN0LT5sb29rdXAoIkJpdHNQZXJTYW1wbGUiLCAmb2JqMSktPmlzSW50KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgQml0c1BlclNhbXBsZSIpOwogICAgZ290byBlcnIyOwogIH0KICBzYW1wbGVCaXRzID0gb2JqMS5nZXRJbnQoKTsKICBzYW1wbGVNdWwgPSAxLjAgLyAocG93KDIuMCwgKGRvdWJsZSlzYW1wbGVCaXRzKSAtIDEpOwogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIEVuY29kZQogIGlmIChkaWN0LT5sb29rdXAoIkVuY29kZSIsICZvYmoxKS0+aXNBcnJheSgpICYmCiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm0pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgb2JqMS5hcnJheUdldCgyKmksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZW5jb2RlIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgZW5jb2RlW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICAgIG9iajEuYXJyYXlHZXQoMippKzEsICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZW5jb2RlIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgZW5jb2RlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgZW5jb2RlW2ldWzBdID0gMDsKICAgICAgZW5jb2RlW2ldWzFdID0gc2FtcGxlU2l6ZVtpXSAtIDE7CiAgICB9CiAgfQogIG9iajEuZnJlZSgpOwogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGlucHV0TXVsW2ldID0gKGVuY29kZVtpXVsxXSAtIGVuY29kZVtpXVswXSkgLwogICAgICAgICAgICAgICAgICAoZG9tYWluW2ldWzFdIC0gZG9tYWluW2ldWzBdKTsKICB9CgogIC8vLS0tLS0gRGVjb2RlCiAgaWYgKGRpY3QtPmxvb2t1cCgiRGVjb2RlIiwgJm9iajEpLT5pc0FycmF5KCkgJiYKICAgICAgb2JqMS5hcnJheUdldExlbmd0aCgpID09IDIqbikgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvYmoxLmFycmF5R2V0KDIqaSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkZWNvZGUgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBkZWNvZGVbaV1bMF0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgICAgb2JqMS5hcnJheUdldCgyKmkrMSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkZWNvZGUgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBkZWNvZGVbaV1bMV0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBkZWNvZGVbaV1bMF0gPSByYW5nZVtpXVswXTsKICAgICAgZGVjb2RlW2ldWzFdID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIHNhbXBsZXMKICBuU2FtcGxlcyA9IG47CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkKICAgIG5TYW1wbGVzICo9IHNhbXBsZVNpemVbaV07CiAgc2FtcGxlcyA9IChkb3VibGUgKilnbWFsbG9jbihuU2FtcGxlcywgc2l6ZW9mKGRvdWJsZSkpOwogIGJ1ZiA9IDA7CiAgYml0cyA9IDA7CiAgYml0TWFzayA9ICgxIDw8IHNhbXBsZUJpdHMpIC0gMTsKICBzdHItPnJlc2V0KCk7CiAgZm9yIChpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgIGlmIChzYW1wbGVCaXRzID09IDgpIHsKICAgICAgcyA9IHN0ci0+Z2V0Q2hhcigpOwogICAgfSBlbHNlIGlmIChzYW1wbGVCaXRzID09IDE2KSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICB9IGVsc2UgaWYgKHNhbXBsZUJpdHMgPT0gMzIpIHsKICAgICAgcyA9IHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKGJpdHMgPCBzYW1wbGVCaXRzKSB7CglidWYgPSAoYnVmIDw8IDgpIHwgKHN0ci0+Z2V0Q2hhcigpICYgMHhmZik7CgliaXRzICs9IDg7CiAgICAgIH0KICAgICAgcyA9IChidWYgPj4gKGJpdHMgLSBzYW1wbGVCaXRzKSkgJiBiaXRNYXNrOwogICAgICBiaXRzIC09IHNhbXBsZUJpdHM7CiAgICB9CiAgICBzYW1wbGVzW2ldID0gKGRvdWJsZSlzICogc2FtcGxlTXVsOwogIH0KICBzdHItPmNsb3NlKCk7CgogIC8vIHNldCB1cCB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpbltpXSA9IGRvbWFpbltpXVswXTsKICAgIGNhY2hlSW5baV0gPSBpbltpXSAtIDE7CiAgfQogIHRyYW5zZm9ybShpbiwgY2FjaGVPdXQpOwoKICBvayA9IGdUcnVlOwogIHJldHVybjsKCiBlcnIzOgogIG9iajIuZnJlZSgpOwogZXJyMjoKICBvYmoxLmZyZWUoKTsKIGVycjE6CiAgcmV0dXJuOwp9CgpTYW1wbGVkRnVuY3Rpb246On5TYW1wbGVkRnVuY3Rpb24oKSB7CiAgaWYgKGlkeE9mZnNldCkgewogICAgZ2ZyZWUoaWR4T2Zmc2V0KTsKICB9CiAgaWYgKHNhbXBsZXMpIHsKICAgIGdmcmVlKHNhbXBsZXMpOwogIH0KICBpZiAoc0J1ZikgewogICAgZ2ZyZWUoc0J1Zik7CiAgfQp9CgpTYW1wbGVkRnVuY3Rpb246OlNhbXBsZWRGdW5jdGlvbihjb25zdCBTYW1wbGVkRnVuY3Rpb24gKmZ1bmMpIDogRnVuY3Rpb24oZnVuYykgewogIG1lbWNweShzYW1wbGVTaXplLCBmdW5jLT5zYW1wbGVTaXplLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGludCkpOwoKICBtZW1jcHkoZW5jb2RlLCBmdW5jLT5lbmNvZGUsIGZ1bmNNYXhJbnB1dHMgKiAyICogc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShkZWNvZGUsIGZ1bmMtPmRlY29kZSwgZnVuY01heE91dHB1dHMgKiAyICogc2l6ZW9mKGRvdWJsZSkpOwoKICBtZW1jcHkoaW5wdXRNdWwsIGZ1bmMtPmlucHV0TXVsLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBuU2FtcGxlcyA9IGZ1bmMtPm5TYW1wbGVzOwoKICBpZHhPZmZzZXQgPSAoaW50ICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoaW50KSk7CiAgbWVtY3B5KGlkeE9mZnNldCwgZnVuYy0+aWR4T2Zmc2V0LCAoMSA8PCBtKSAqIChpbnQpc2l6ZW9mKGludCkpOwoKICBzYW1wbGVzID0gKGRvdWJsZSAqKWdtYWxsb2NuKG5TYW1wbGVzLCBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KHNhbXBsZXMsIGZ1bmMtPnNhbXBsZXMsIG5TYW1wbGVzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBzQnVmID0gKGRvdWJsZSAqKWdtYWxsb2NuKDEgPDwgbSwgc2l6ZW9mKGRvdWJsZSkpOwoKICBtZW1jcHkoY2FjaGVJbiwgZnVuYy0+Y2FjaGVJbiwgZnVuY01heElucHV0cyAqIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoY2FjaGVPdXQsIGZ1bmMtPmNhY2hlT3V0LCBmdW5jTWF4T3V0cHV0cyAqIHNpemVvZihkb3VibGUpKTsKCiAgb2sgPSBmdW5jLT5vazsKfQoKdm9pZCBTYW1wbGVkRnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIGRvdWJsZSB4OwogIGludCBlW2Z1bmNNYXhJbnB1dHNdOwogIGRvdWJsZSBlZnJhYzBbZnVuY01heElucHV0c107CiAgZG91YmxlIGVmcmFjMVtmdW5jTWF4SW5wdXRzXTsKICBpbnQgaSwgaiwgaywgaWR4MCwgdDsKCiAgLy8gY2hlY2sgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaWYgKGluW2ldICE9IGNhY2hlSW5baV0pIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChpID09IG0pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb3V0W2ldID0gY2FjaGVPdXRbaV07CiAgICB9CiAgICByZXR1cm47CiAgfQoKICAvLyBtYXAgaW5wdXQgdmFsdWVzIGludG8gc2FtcGxlIGFycmF5CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgeCA9IChpbltpXSAtIGRvbWFpbltpXVswXSkgKiBpbnB1dE11bFtpXSArIGVuY29kZVtpXVswXTsKICAgIGlmICh4IDwgMCB8fCB4ICE9IHgpIHsgIC8vIHghPXggaXMgYSBtb3JlIHBvcnRhYmxlIHZlcnNpb24gb2YgaXNuYW4oeCkKICAgICAgeCA9IDA7CiAgICB9IGVsc2UgaWYgKHggPiBzYW1wbGVTaXplW2ldIC0gMSkgewogICAgICB4ID0gc2FtcGxlU2l6ZVtpXSAtIDE7CiAgICB9CiAgICBlW2ldID0gKGludCl4OwogICAgaWYgKGVbaV0gPT0gc2FtcGxlU2l6ZVtpXSAtIDEgJiYgc2FtcGxlU2l6ZVtpXSA+IDEpIHsKICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGluW2ldID0gZG9tYWluW2ldWzFdCiAgICAgIGVbaV0gPSBzYW1wbGVTaXplW2ldIC0gMjsKICAgIH0KICAgIGVmcmFjMVtpXSA9IHggLSBlW2ldOwogICAgZWZyYWMwW2ldID0gMSAtIGVmcmFjMVtpXTsKICB9CgogIC8vIGNvbXB1dGUgaW5kZXggZm9yIHRoZSBmaXJzdCBzYW1wbGUgdG8gYmUgdXNlZAogIGlkeDAgPSAwOwogIGZvciAoayA9IG0gLSAxOyBrID49IDE7IC0taykgewogICAgaWR4MCA9IChpZHgwICsgZVtrXSkgKiBzYW1wbGVTaXplW2stMV07CiAgfQogIGlkeDAgPSAoaWR4MCArIGVbMF0pICogbjsKCiAgLy8gZm9yIGVhY2ggb3V0cHV0LCBkbyBtLWxpbmVhciBpbnRlcnBvbGF0aW9uCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoKICAgIC8vIHB1bGwgMl5tIHZhbHVlcyBvdXQgb2YgdGhlIHNhbXBsZSBhcnJheQogICAgZm9yIChqID0gMDsgaiA8ICgxPDxtKTsgKytqKSB7CiAgICAgIGludCBpZHggPSBpZHgwICsgaWR4T2Zmc2V0W2pdICsgaTsKICAgICAgaWYgKGxpa2VseShpZHggPj0gMCAmJiBpZHggPCBuU2FtcGxlcykpIHsKICAgICAgICBzQnVmW2pdID0gc2FtcGxlc1tpZHhdOwogICAgICB9IGVsc2UgewogICAgICAgIHNCdWZbal0gPSAwOyAvLyBUT0RPIEludmVzdGlnYXRlIGlmIHRoaXMgaXMgd2hhdCBBZG9iZSBkb2VzCiAgICAgIH0KICAgIH0KCiAgICAvLyBkbyBtIHNldHMgb2YgaW50ZXJwb2xhdGlvbnMKICAgIGZvciAoaiA9IDAsIHQgPSAoMTw8bSk7IGogPCBtOyArK2osIHQgPj49IDEpIHsKICAgICAgZm9yIChrID0gMDsgayA8IHQ7IGsgKz0gMikgewoJc0J1ZltrID4+IDFdID0gZWZyYWMwW2pdICogc0J1ZltrXSArIGVmcmFjMVtqXSAqIHNCdWZbaysxXTsKICAgICAgfQogICAgfQoKICAgIC8vIG1hcCBvdXRwdXQgdmFsdWUgdG8gcmFuZ2UKICAgIG91dFtpXSA9IHNCdWZbMF0gKiAoZGVjb2RlW2ldWzFdIC0gZGVjb2RlW2ldWzBdKSArIGRlY29kZVtpXVswXTsKICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVswXTsKICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQoKICAvLyBzYXZlIGN1cnJlbnQgcmVzdWx0IGluIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGNhY2hlSW5baV0gPSBpbltpXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgY2FjaGVPdXRbaV0gPSBvdXRbaV07CiAgfQp9CgpHQm9vbCBTYW1wbGVkRnVuY3Rpb246Omhhc0RpZmZlcmVudFJlc3VsdFNldChGdW5jdGlvbiAqZnVuYykgewogIGlmIChmdW5jLT5nZXRUeXBlKCkgPT0gMCkgewogICAgU2FtcGxlZEZ1bmN0aW9uICpjb21wVG8gPSAoU2FtcGxlZEZ1bmN0aW9uICopIGZ1bmM7CiAgICBpZiAoY29tcFRvLT5nZXRTYW1wbGVOdW1iZXIoKSAhPSBuU2FtcGxlcykKICAgICAgcmV0dXJuIGdUcnVlOwogICAgZG91YmxlICpjb21wU2FtcGxlcyA9IGNvbXBUby0+Z2V0U2FtcGxlcygpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7CiAgICAgIGlmIChzYW1wbGVzW2ldICE9IGNvbXBTYW1wbGVzW2ldKQogICAgICAgIHJldHVybiBnVHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIGdGYWxzZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRXhwb25lbnRpYWxGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6RXhwb25lbnRpYWxGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QpIHsKICBPYmplY3Qgb2JqMSwgb2JqMjsKICBpbnQgaTsKCiAgb2sgPSBnRmFsc2U7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgZ290byBlcnIxOwogIH0KICBpZiAobSAhPSAxKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJFeHBvbmVudGlhbCBmdW5jdGlvbiB3aXRoIG1vcmUgdGhhbiBvbmUgaW5wdXQiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gQzAKICBpZiAoZGljdC0+bG9va3VwKCJDMCIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBpZiAoaGFzUmFuZ2UgJiYgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IG4pIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMCBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgbiA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKTsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb2JqMS5hcnJheUdldChpLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIEMwIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgYzBbaV0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGhhc1JhbmdlICYmIG4gIT0gMSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBuID0gMTsKICAgIGMwWzBdID0gMDsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gQzEKICBpZiAoZGljdC0+bG9va3VwKCJDMSIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBpZiAob2JqMS5hcnJheUdldExlbmd0aCgpICE9IG4pIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMSBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvYmoxLmFycmF5R2V0KGksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gQzEgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBjMVtpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBpZiAobiAhPSAxKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uJ3MgQzEgYXJyYXkgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGMxWzBdID0gMTsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gTiAoZXhwb25lbnQpCiAgaWYgKCFkaWN0LT5sb29rdXAoIk4iLCAmb2JqMSktPmlzTnVtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgTiIpOwogICAgZ290byBlcnIyOwogIH0KICBlID0gb2JqMS5nZXROdW0oKTsKICBvYmoxLmZyZWUoKTsKCiAgaXNMaW5lYXIgPSBmYWJzKGUtMS4pIDwgMWUtMTA7CiAgb2sgPSBnVHJ1ZTsKICByZXR1cm47CgogZXJyMzoKICBvYmoyLmZyZWUoKTsKIGVycjI6CiAgb2JqMS5mcmVlKCk7CiBlcnIxOgogIHJldHVybjsKfQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6fkV4cG9uZW50aWFsRnVuY3Rpb24oKSB7Cn0KCkV4cG9uZW50aWFsRnVuY3Rpb246OkV4cG9uZW50aWFsRnVuY3Rpb24oY29uc3QgRXhwb25lbnRpYWxGdW5jdGlvbiAqZnVuYykgOiBGdW5jdGlvbihmdW5jKSB7CiAgbWVtY3B5KGMwLCBmdW5jLT5jMCwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGMxLCBmdW5jLT5jMSwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CgogIGUgPSBmdW5jLT5lOwogIGlzTGluZWFyID0gZnVuYy0+aXNMaW5lYXI7CiAgb2sgPSBmdW5jLT5vazsKfQoKdm9pZCBFeHBvbmVudGlhbEZ1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBkb3VibGUgeDsKICBpbnQgaTsKCiAgaWYgKGluWzBdIDwgZG9tYWluWzBdWzBdKSB7CiAgICB4ID0gZG9tYWluWzBdWzBdOwogIH0gZWxzZSBpZiAoaW5bMF0gPiBkb21haW5bMF1bMV0pIHsKICAgIHggPSBkb21haW5bMF1bMV07CiAgfSBlbHNlIHsKICAgIHggPSBpblswXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgb3V0W2ldID0gYzBbaV0gKyAoaXNMaW5lYXIgPyB4IDogcG93KHgsIGUpKSAqIChjMVtpXSAtIGMwW2ldKTsKICAgIGlmIChoYXNSYW5nZSkgewogICAgICBpZiAob3V0W2ldIDwgcmFuZ2VbaV1bMF0pIHsKCW91dFtpXSA9IHJhbmdlW2ldWzBdOwogICAgICB9IGVsc2UgaWYgKG91dFtpXSA+IHJhbmdlW2ldWzFdKSB7CglvdXRbaV0gPSByYW5nZVtpXVsxXTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm47Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFN0aXRjaGluZ0Z1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTdGl0Y2hpbmdGdW5jdGlvbjo6U3RpdGNoaW5nRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0LCBzdGQ6OnNldDxpbnQ+ICp1c2VkUGFyZW50cykgewogIE9iamVjdCBvYmoxLCBvYmoyOwogIGludCBpOwoKICBvayA9IGdGYWxzZTsKICBmdW5jcyA9IE5VTEw7CiAgYm91bmRzID0gTlVMTDsKICBlbmNvZGUgPSBOVUxMOwogIHNjYWxlID0gTlVMTDsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmIChtICE9IDEpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0aXRjaGluZyBmdW5jdGlvbiB3aXRoIG1vcmUgdGhhbiBvbmUgaW5wdXQiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gRnVuY3Rpb25zCiAgaWYgKCFkaWN0LT5sb29rdXAoIkZ1bmN0aW9ucyIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJNaXNzaW5nICdGdW5jdGlvbnMnIGVudHJ5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgZ290byBlcnIxOwogIH0KICBrID0gb2JqMS5hcnJheUdldExlbmd0aCgpOwogIGZ1bmNzID0gKEZ1bmN0aW9uICoqKWdtYWxsb2NuKGssIHNpemVvZihGdW5jdGlvbiAqKSk7CiAgYm91bmRzID0gKGRvdWJsZSAqKWdtYWxsb2NuKGsgKyAxLCBzaXplb2YoZG91YmxlKSk7CiAgZW5jb2RlID0gKGRvdWJsZSAqKWdtYWxsb2NuKDIgKiBrLCBzaXplb2YoZG91YmxlKSk7CiAgc2NhbGUgPSAoZG91YmxlICopZ21hbGxvY24oaywgc2l6ZW9mKGRvdWJsZSkpOwogIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIGZ1bmNzW2ldID0gTlVMTDsKICB9CiAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgc3RkOjpzZXQ8aW50PiB1c2VkUGFyZW50c0F1eCA9ICp1c2VkUGFyZW50czsKICAgIG9iajEuYXJyYXlHZXRORihpLCAmb2JqMik7CiAgICBpZiAob2JqMi5pc1JlZigpKSB7CiAgICAgIGNvbnN0IFJlZiByZWYgPSBvYmoyLmdldFJlZigpOwogICAgICBpZiAodXNlZFBhcmVudHNBdXguZmluZChyZWYubnVtKSA9PSB1c2VkUGFyZW50c0F1eC5lbmQoKSkgewogICAgICAgIHVzZWRQYXJlbnRzQXV4Lmluc2VydChyZWYubnVtKTsKICAgICAgICBvYmoyLmZyZWUoKTsKICAgICAgICBvYmoxLmFycmF5R2V0KGksICZvYmoyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnb3RvIGVycjI7CiAgICAgIH0KICAgIH0KICAgIGlmICghKGZ1bmNzW2ldID0gRnVuY3Rpb246OnBhcnNlKCZvYmoyLCAmdXNlZFBhcmVudHNBdXgpKSkgewogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBpZiAoZnVuY3NbaV0tPmdldElucHV0U2l6ZSgpICE9IDEgfHwKCShpID4gMCAmJiBmdW5jc1tpXS0+Z2V0T3V0cHV0U2l6ZSgpICE9IGZ1bmNzWzBdLT5nZXRPdXRwdXRTaXplKCkpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCSAgICAiSW5jb21wYXRpYmxlIHN1YmZ1bmN0aW9ucyBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgb2JqMi5mcmVlKCk7CiAgfQogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIEJvdW5kcwogIGlmICghZGljdC0+bG9va3VwKCJCb3VuZHMiLCAmb2JqMSktPmlzQXJyYXkoKSB8fAogICAgICBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gayAtIDEpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIk1pc3Npbmcgb3IgaW52YWxpZCAnQm91bmRzJyBlbnRyeSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgIGdvdG8gZXJyMTsKICB9CiAgYm91bmRzWzBdID0gZG9tYWluWzBdWzBdOwogIGZvciAoaSA9IDE7IGkgPCBrOyArK2kpIHsKICAgIGlmICghb2JqMS5hcnJheUdldChpIC0gMSwgJm9iajIpLT5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkludmFsaWQgdHlwZSBpbiAnQm91bmRzJyBhcnJheSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgYm91bmRzW2ldID0gb2JqMi5nZXROdW0oKTsKICAgIG9iajIuZnJlZSgpOwogIH0KICBib3VuZHNba10gPSBkb21haW5bMF1bMV07CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gRW5jb2RlCiAgaWYgKCFkaWN0LT5sb29rdXAoIkVuY29kZSIsICZvYmoxKS0+aXNBcnJheSgpIHx8CiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSAyICogaykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiTWlzc2luZyBvciBpbnZhbGlkICdFbmNvZGUnIGVudHJ5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgZ290byBlcnIxOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgMiAqIGs7ICsraSkgewogICAgaWYgKCFvYmoxLmFycmF5R2V0KGksICZvYmoyKS0+aXNOdW0oKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbnZhbGlkIHR5cGUgaW4gJ0VuY29kZScgYXJyYXkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGVuY29kZVtpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICBvYmoyLmZyZWUoKTsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gcHJlLWNvbXB1dGUgdGhlIHNjYWxlIGZhY3RvcnMKICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBpZiAoYm91bmRzW2ldID09IGJvdW5kc1tpKzFdKSB7CiAgICAgIC8vIGF2b2lkIGEgZGl2aWRlLWJ5LXplcm8gLS0gaW4gdGhpcyBzaXR1YXRpb24sIGZ1bmN0aW9uIGkgd2lsbAogICAgICAvLyBuZXZlciBiZSB1c2VkIGFueXdheQogICAgICBzY2FsZVtpXSA9IDA7CiAgICB9IGVsc2UgewogICAgICBzY2FsZVtpXSA9IChlbmNvZGVbMippKzFdIC0gZW5jb2RlWzIqaV0pIC8gKGJvdW5kc1tpKzFdIC0gYm91bmRzW2ldKTsKICAgIH0KICB9CgogIG4gPSBmdW5jc1swXS0+Z2V0T3V0cHV0U2l6ZSgpOwogIG9rID0gZ1RydWU7CiAgcmV0dXJuOwoKIGVycjI6CiAgb2JqMi5mcmVlKCk7CiBlcnIxOgogIG9iajEuZnJlZSgpOwp9CgpTdGl0Y2hpbmdGdW5jdGlvbjo6U3RpdGNoaW5nRnVuY3Rpb24oY29uc3QgU3RpdGNoaW5nRnVuY3Rpb24gKmZ1bmMpIDogRnVuY3Rpb24oZnVuYykgewogIGsgPSBmdW5jLT5rOwoKICBmdW5jcyA9IChGdW5jdGlvbiAqKilnbWFsbG9jbihrLCBzaXplb2YoRnVuY3Rpb24gKikpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBmdW5jc1tpXSA9IGZ1bmMtPmZ1bmNzW2ldLT5jb3B5KCk7CiAgfQoKICBib3VuZHMgPSAoZG91YmxlICopZ21hbGxvY24oayArIDEsIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoYm91bmRzLCBmdW5jLT5ib3VuZHMsIChrICsgMSkgKiBzaXplb2YoZG91YmxlKSk7CgogIGVuY29kZSA9IChkb3VibGUgKilnbWFsbG9jbigyICogaywgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShlbmNvZGUsIGZ1bmMtPmVuY29kZSwgMiAqIGsgKiBzaXplb2YoZG91YmxlKSk7CgogIHNjYWxlID0gKGRvdWJsZSAqKWdtYWxsb2NuKGssIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoc2NhbGUsIGZ1bmMtPnNjYWxlLCBrICogc2l6ZW9mKGRvdWJsZSkpOwoKICBvayA9IGZ1bmMtPm9rOwp9CgpTdGl0Y2hpbmdGdW5jdGlvbjo6flN0aXRjaGluZ0Z1bmN0aW9uKCkgewogIGludCBpOwoKICBpZiAoZnVuY3MpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgICAgaWYgKGZ1bmNzW2ldKSB7CglkZWxldGUgZnVuY3NbaV07CiAgICAgIH0KICAgIH0KICB9CiAgZ2ZyZWUoZnVuY3MpOwogIGdmcmVlKGJvdW5kcyk7CiAgZ2ZyZWUoZW5jb2RlKTsKICBnZnJlZShzY2FsZSk7Cn0KCnZvaWQgU3RpdGNoaW5nRnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIGRvdWJsZSB4OwogIGludCBpOwoKICBpZiAoaW5bMF0gPCBkb21haW5bMF1bMF0pIHsKICAgIHggPSBkb21haW5bMF1bMF07CiAgfSBlbHNlIGlmIChpblswXSA+IGRvbWFpblswXVsxXSkgewogICAgeCA9IGRvbWFpblswXVsxXTsKICB9IGVsc2UgewogICAgeCA9IGluWzBdOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgayAtIDE7ICsraSkgewogICAgaWYgKHggPCBib3VuZHNbaSsxXSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgeCA9IGVuY29kZVsyKmldICsgKHggLSBib3VuZHNbaV0pICogc2NhbGVbaV07CiAgZnVuY3NbaV0tPnRyYW5zZm9ybSgmeCwgb3V0KTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUG9zdFNjcmlwdEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplbnVtIFBTT3AgewogIHBzT3BBYnMsCiAgcHNPcEFkZCwKICBwc09wQW5kLAogIHBzT3BBdGFuLAogIHBzT3BCaXRzaGlmdCwKICBwc09wQ2VpbGluZywKICBwc09wQ29weSwKICBwc09wQ29zLAogIHBzT3BDdmksCiAgcHNPcEN2ciwKICBwc09wRGl2LAogIHBzT3BEdXAsCiAgcHNPcEVxLAogIHBzT3BFeGNoLAogIHBzT3BFeHAsCiAgcHNPcEZhbHNlLAogIHBzT3BGbG9vciwKICBwc09wR2UsCiAgcHNPcEd0LAogIHBzT3BJZGl2LAogIHBzT3BJbmRleCwKICBwc09wTGUsCiAgcHNPcExuLAogIHBzT3BMb2csCiAgcHNPcEx0LAogIHBzT3BNb2QsCiAgcHNPcE11bCwKICBwc09wTmUsCiAgcHNPcE5lZywKICBwc09wTm90LAogIHBzT3BPciwKICBwc09wUG9wLAogIHBzT3BSb2xsLAogIHBzT3BSb3VuZCwKICBwc09wU2luLAogIHBzT3BTcXJ0LAogIHBzT3BTdWIsCiAgcHNPcFRydWUsCiAgcHNPcFRydW5jYXRlLAogIHBzT3BYb3IsCiAgcHNPcElmLAogIHBzT3BJZmVsc2UsCiAgcHNPcFJldHVybgp9OwoKLy8gTm90ZTogJ2lmJyBhbmQgJ2lmZWxzZScgYXJlIHBhcnNlZCBzZXBhcmF0ZWx5LgovLyBUaGUgcmVzdCBhcmUgbGlzdGVkIGhlcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgovLyBUaGUgaW5kZXggaW4gdGhpcyB0YWJsZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBlbnRyeSBpbiBQU09wLgpzdGF0aWMgY29uc3QgY2hhciAqcHNPcE5hbWVzW10gPSB7CiAgImFicyIsCiAgImFkZCIsCiAgImFuZCIsCiAgImF0YW4iLAogICJiaXRzaGlmdCIsCiAgImNlaWxpbmciLAogICJjb3B5IiwKICAiY29zIiwKICAiY3ZpIiwKICAiY3ZyIiwKICAiZGl2IiwKICAiZHVwIiwKICAiZXEiLAogICJleGNoIiwKICAiZXhwIiwKICAiZmFsc2UiLAogICJmbG9vciIsCiAgImdlIiwKICAiZ3QiLAogICJpZGl2IiwKICAiaW5kZXgiLAogICJsZSIsCiAgImxuIiwKICAibG9nIiwKICAibHQiLAogICJtb2QiLAogICJtdWwiLAogICJuZSIsCiAgIm5lZyIsCiAgIm5vdCIsCiAgIm9yIiwKICAicG9wIiwKICAicm9sbCIsCiAgInJvdW5kIiwKICAic2luIiwKICAic3FydCIsCiAgInN1YiIsCiAgInRydWUiLAogICJ0cnVuY2F0ZSIsCiAgInhvciIKfTsKCiNkZWZpbmUgblBTT3BzIChzaXplb2YocHNPcE5hbWVzKSAvIHNpemVvZihjaGFyICopKQoKZW51bSBQU09iamVjdFR5cGUgewogIHBzQm9vbCwKICBwc0ludCwKICBwc1JlYWwsCiAgcHNPcGVyYXRvciwKICBwc0Jsb2NrCn07CgovLyBJbiB0aGUgY29kZSBhcnJheSwgJ2lmJy8naWZlbHNlJyBvcGVyYXRvcnMgdGFrZSB1cCB0aHJlZSBzbG90cwovLyBwbHVzIHNwYWNlIGZvciB0aGUgY29kZSBpbiB0aGUgc3ViY2xhdXNlKHMpLgovLwovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wSWYgLyBwc09wSWZlbHNlIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgcHNCbG9jazogcHRyPTxBPiAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IHBzQmxvY2s6IHB0cj08Qj4gICAgICAgICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBpZiBjbGF1c2UgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgcHNPcGVyYXRvcjogcHNPcFJldHVybiAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgIDxBPiB8IGVsc2UgY2xhdXNlICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wUmV0dXJuICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgPEI+IHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vCi8vIEZvciAnaWYnLCBwb2ludGVyIDxBPiBpcyBwcmVzZW50IGluIHRoZSBjb2RlIHN0cmVhbSBidXQgdW51c2VkLgoKc3RydWN0IFBTT2JqZWN0IHsKICBQU09iamVjdFR5cGUgdHlwZTsKICB1bmlvbiB7CiAgICBHQm9vbCBib29sbjsJCS8vIGJvb2xlYW4gKHN0YWNrIG9ubHkpCiAgICBpbnQgaW50ZzsJCQkvLyBpbnRlZ2VyIChzdGFjayBhbmQgY29kZSkKICAgIGRvdWJsZSByZWFsOwkJLy8gcmVhbCAoc3RhY2sgYW5kIGNvZGUpCiAgICBQU09wIG9wOwkJCS8vIG9wZXJhdG9yIChjb2RlIG9ubHkpCiAgICBpbnQgYmxrOwkJCS8vIGlmL2lmZWxzZSBibG9jayBwb2ludGVyIChjb2RlIG9ubHkpCiAgfTsKfTsKCiNkZWZpbmUgcHNTdGFja1NpemUgMTAwCgpjbGFzcyBQU1N0YWNrIHsKcHVibGljOgoKICBQU1N0YWNrKCkge3NwID0gcHNTdGFja1NpemU7IH0KICB2b2lkIGNsZWFyKCkgeyBzcCA9IHBzU3RhY2tTaXplOyB9CiAgdm9pZCBwdXNoQm9vbChHQm9vbCBib29sbikKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc0Jvb2w7CiAgICAgIHN0YWNrW3NwXS5ib29sbiA9IGJvb2xuOwogICAgfQogIH0KICB2b2lkIHB1c2hJbnQoaW50IGludGcpCiAgewogICAgaWYgKGNoZWNrT3ZlcmZsb3coKSkgewogICAgICBzdGFja1stLXNwXS50eXBlID0gcHNJbnQ7CiAgICAgIHN0YWNrW3NwXS5pbnRnID0gaW50ZzsKICAgIH0KICB9CiAgdm9pZCBwdXNoUmVhbChkb3VibGUgcmVhbCkKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc1JlYWw7CiAgICAgIHN0YWNrW3NwXS5yZWFsID0gcmVhbDsKICAgIH0KICB9CiAgR0Jvb2wgcG9wQm9vbCgpCiAgewogICAgaWYgKGNoZWNrVW5kZXJmbG93KCkgJiYgY2hlY2tUeXBlKHBzQm9vbCwgcHNCb29sKSkgewogICAgICByZXR1cm4gc3RhY2tbc3ArK10uYm9vbG47CiAgICB9CiAgICByZXR1cm4gZ0ZhbHNlOwogIH0KICBpbnQgcG9wSW50KCkKICB7CiAgICBpZiAoY2hlY2tVbmRlcmZsb3coKSAmJiBjaGVja1R5cGUocHNJbnQsIHBzSW50KSkgewogICAgICByZXR1cm4gc3RhY2tbc3ArK10uaW50ZzsKICAgIH0KICAgIHJldHVybiAwOwogIH0KICBkb3VibGUgcG9wTnVtKCkKICB7CiAgICBkb3VibGUgcmV0OwoKICAgIGlmIChjaGVja1VuZGVyZmxvdygpICYmIGNoZWNrVHlwZShwc0ludCwgcHNSZWFsKSkgewogICAgICByZXQgPSAoc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQpID8gKGRvdWJsZSlzdGFja1tzcF0uaW50ZyA6IHN0YWNrW3NwXS5yZWFsOwogICAgICArK3NwOwogICAgICByZXR1cm4gcmV0OwogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIEdCb29sIGVtcHR5KCkgeyByZXR1cm4gc3AgPT0gcHNTdGFja1NpemU7IH0KICBHQm9vbCB0b3BJc0ludCgpIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgJiYgc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQ7IH0KICBHQm9vbCB0b3BUd29BcmVJbnRzKCkKICAgIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgLSAxICYmCgkgICAgIHN0YWNrW3NwXS50eXBlID09IHBzSW50ICYmCiAgICAgICAgICAgICBzdGFja1tzcCsxXS50eXBlID09IHBzSW50OyB9CiAgR0Jvb2wgdG9wSXNSZWFsKCkgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAmJiBzdGFja1tzcF0udHlwZSA9PSBwc1JlYWw7IH0KICBHQm9vbCB0b3BUd29BcmVOdW1zKCkKICAgIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgLSAxICYmCgkgICAgIChzdGFja1tzcF0udHlwZSA9PSBwc0ludCB8fCBzdGFja1tzcF0udHlwZSA9PSBwc1JlYWwpICYmCgkgICAgIChzdGFja1tzcCsxXS50eXBlID09IHBzSW50IHx8IHN0YWNrW3NwKzFdLnR5cGUgPT0gcHNSZWFsKTsgfQogIHZvaWQgY29weShpbnQgbik7CiAgdm9pZCByb2xsKGludCBuLCBpbnQgaik7CiAgdm9pZCBpbmRleChpbnQgaSkKICB7CiAgICBpZiAoIWNoZWNrT3ZlcmZsb3coKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICAtLXNwOwogICAgaWYgKHNwICsgaSArIDEgPj0gcHNTdGFja1NpemUpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3RhY2tbc3BdID0gc3RhY2tbc3AgKyAxICsgaV07CiAgfQogIHZvaWQgcG9wKCkKICB7CiAgICBpZiAoIWNoZWNrVW5kZXJmbG93KCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgKytzcDsKICB9Cgpwcml2YXRlOgoKICBHQm9vbCBjaGVja092ZXJmbG93KGludCBuID0gMSkKICB7CiAgICBpZiAoc3AgLSBuIDwgMCkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayBvdmVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybiBnRmFsc2U7CiAgICB9CiAgICByZXR1cm4gZ1RydWU7CiAgfQogIEdCb29sIGNoZWNrVW5kZXJmbG93KCkKICB7CiAgICBpZiAoc3AgPT0gcHNTdGFja1NpemUpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIHJldHVybiBnVHJ1ZTsKICB9CiAgR0Jvb2wgY2hlY2tUeXBlKFBTT2JqZWN0VHlwZSB0MSwgUFNPYmplY3RUeXBlIHQyKQogIHsKICAgIGlmIChzdGFja1tzcF0udHlwZSAhPSB0MSAmJiBzdGFja1tzcF0udHlwZSAhPSB0MikgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIG1pc21hdGNoIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIHJldHVybiBnVHJ1ZTsKICB9CiAgUFNPYmplY3Qgc3RhY2tbcHNTdGFja1NpemVdOwogIGludCBzcDsKfTsKCgp2b2lkIFBTU3RhY2s6OmNvcHkoaW50IG4pIHsKICBpbnQgaTsKCiAgaWYgKHNwICsgbiA+IHBzU3RhY2tTaXplKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayB1bmRlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgcmV0dXJuOwogIH0KICBpZiAodW5saWtlbHkoc3AgLSBuID4gcHNTdGFja1NpemUpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayB1bmRlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgcmV0dXJuOwogIH0KICBpZiAoIWNoZWNrT3ZlcmZsb3cobikpIHsKICAgIHJldHVybjsKICB9CiAgZm9yIChpID0gc3AgKyBuIC0gMTsgaSA+PSBzcDsgLS1pKSB7CiAgICBzdGFja1tpIC0gbl0gPSBzdGFja1tpXTsKICB9CiAgc3AgLT0gbjsKfQoKdm9pZCBQU1N0YWNrOjpyb2xsKGludCBuLCBpbnQgaikgewogIFBTT2JqZWN0IG9iajsKICBpbnQgaSwgazsKCiAgaWYgKHVubGlrZWx5KG4gPT0gMCkpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKGogPj0gMCkgewogICAgaiAlPSBuOwogIH0gZWxzZSB7CiAgICBqID0gLWogJSBuOwogICAgaWYgKGogIT0gMCkgewogICAgICBqID0gbiAtIGo7CiAgICB9CiAgfQogIGlmIChuIDw9IDAgfHwgaiA9PSAwIHx8IG4gPiBwc1N0YWNrU2l6ZSB8fCBzcCArIG4gPiBwc1N0YWNrU2l6ZSkgewogICAgcmV0dXJuOwogIH0KICBpZiAoaiA8PSBuIC8gMikgewogICAgZm9yIChpID0gMDsgaSA8IGo7ICsraSkgewogICAgICBvYmogPSBzdGFja1tzcF07CiAgICAgIGZvciAoayA9IHNwOyBrIDwgc3AgKyBuIC0gMTsgKytrKSB7CiAgICAgICAgc3RhY2tba10gPSBzdGFja1trKzFdOwogICAgICB9CiAgICAgIHN0YWNrW3NwICsgbiAtIDFdID0gb2JqOwogICAgfQogIH0gZWxzZSB7CiAgICBqID0gbiAtIGo7CiAgICBmb3IgKGkgPSAwOyBpIDwgajsgKytpKSB7CiAgICAgIG9iaiA9IHN0YWNrW3NwICsgbiAtIDFdOwogICAgICBmb3IgKGsgPSBzcCArIG4gLSAxOyBrID4gc3A7IC0taykgewogICAgICAgIHN0YWNrW2tdID0gc3RhY2tbay0xXTsKICAgICAgfQogICAgICBzdGFja1tzcF0gPSBvYmo7CiAgICB9CiAgfQp9CgpQb3N0U2NyaXB0RnVuY3Rpb246OlBvc3RTY3JpcHRGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QpIHsKICBTdHJlYW0gKnN0cjsKICBpbnQgY29kZVB0cjsKICBHb29TdHJpbmcgKnRvazsKICBkb3VibGUgaW5bZnVuY01heElucHV0c107CiAgaW50IGk7CgogIGNvZGUgPSBOVUxMOwogIGNvZGVTdHJpbmcgPSBOVUxMOwogIGNvZGVTaXplID0gMDsKICBvayA9IGdGYWxzZTsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmICghaGFzUmFuZ2UpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgNCBmdW5jdGlvbiBpcyBtaXNzaW5nIHJhbmdlIik7CiAgICBnb3RvIGVycjE7CiAgfQoKICAvLy0tLS0tIGdldCB0aGUgc3RyZWFtCiAgaWYgKCFmdW5jT2JqLT5pc1N0cmVhbSgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIDQgZnVuY3Rpb24gaXNuJ3QgYSBzdHJlYW0iKTsKICAgIGdvdG8gZXJyMTsKICB9CiAgc3RyID0gZnVuY09iai0+Z2V0U3RyZWFtKCk7CgogIC8vLS0tLS0gcGFyc2UgdGhlIGZ1bmN0aW9uCiAgY29kZVN0cmluZyA9IG5ldyBHb29TdHJpbmcoKTsKICBzdHItPnJlc2V0KCk7CiAgaWYgKCEodG9rID0gZ2V0VG9rZW4oc3RyKSkgfHwgdG9rLT5jbXAoInsiKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRXhwZWN0ZWQgJ3t7JyBhdCBzdGFydCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICBpZiAodG9rKSB7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICB9CiAgICBnb3RvIGVycjE7CiAgfQogIGRlbGV0ZSB0b2s7CiAgY29kZVB0ciA9IDA7CiAgaWYgKCFwYXJzZUNvZGUoc3RyLCAmY29kZVB0cikpIHsKICAgIGdvdG8gZXJyMjsKICB9CiAgc3RyLT5jbG9zZSgpOwoKICAvLy0tLS0tIHNldCB1cCB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpbltpXSA9IGRvbWFpbltpXVswXTsKICAgIGNhY2hlSW5baV0gPSBpbltpXSAtIDE7CiAgfQogIHRyYW5zZm9ybShpbiwgY2FjaGVPdXQpOwoKICBvayA9IGdUcnVlOwogIAogZXJyMjoKICBzdHItPmNsb3NlKCk7CiBlcnIxOgogIHJldHVybjsKfQoKUG9zdFNjcmlwdEZ1bmN0aW9uOjpQb3N0U2NyaXB0RnVuY3Rpb24oY29uc3QgUG9zdFNjcmlwdEZ1bmN0aW9uICpmdW5jKSA6IEZ1bmN0aW9uKGZ1bmMpIHsKICBjb2RlU2l6ZSA9IGZ1bmMtPmNvZGVTaXplOwoKICBjb2RlID0gKFBTT2JqZWN0ICopZ21hbGxvY24oY29kZVNpemUsIHNpemVvZihQU09iamVjdCkpOwogIG1lbWNweShjb2RlLCBmdW5jLT5jb2RlLCBjb2RlU2l6ZSAqIHNpemVvZihQU09iamVjdCkpOwoKICBjb2RlU3RyaW5nID0gZnVuYy0+Y29kZVN0cmluZy0+Y29weSgpOwoKICBtZW1jcHkoY2FjaGVJbiwgZnVuYy0+Y2FjaGVJbiwgZnVuY01heElucHV0cyAqIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoY2FjaGVPdXQsIGZ1bmMtPmNhY2hlT3V0LCBmdW5jTWF4T3V0cHV0cyAqIHNpemVvZihkb3VibGUpKTsKCiAgb2sgPSBmdW5jLT5vazsKfQoKUG9zdFNjcmlwdEZ1bmN0aW9uOjp+UG9zdFNjcmlwdEZ1bmN0aW9uKCkgewogIGdmcmVlKGNvZGUpOwogIGRlbGV0ZSBjb2RlU3RyaW5nOwp9Cgp2b2lkIFBvc3RTY3JpcHRGdW5jdGlvbjo6dHJhbnNmb3JtKGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSB7CiAgUFNTdGFjayBzdGFjazsKICBpbnQgaTsKCiAgLy8gY2hlY2sgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaWYgKGluW2ldICE9IGNhY2hlSW5baV0pIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChpID09IG0pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb3V0W2ldID0gY2FjaGVPdXRbaV07CiAgICB9CiAgICByZXR1cm47CiAgfQoKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAvL34gbWF5IG5lZWQgdG8gY2hlY2sgZm9yIGludGVnZXJzIGhlcmUKICAgIHN0YWNrLnB1c2hSZWFsKGluW2ldKTsKICB9CiAgZXhlYygmc3RhY2ssIDApOwogIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkgewogICAgb3V0W2ldID0gc3RhY2sucG9wTnVtKCk7CiAgICBpZiAob3V0W2ldIDwgcmFuZ2VbaV1bMF0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMF07CiAgICB9IGVsc2UgaWYgKG91dFtpXSA+IHJhbmdlW2ldWzFdKSB7CiAgICAgIG91dFtpXSA9IHJhbmdlW2ldWzFdOwogICAgfQogIH0KICBzdGFjay5jbGVhcigpOwoKICAvLyBpZiAoIXN0YWNrLT5lbXB0eSgpKSB7CiAgLy8gICBlcnJvcihlcnJTeW50YXhXYXJuaW5nLCAtMSwKICAvLyAgICAgICAgICJFeHRyYSB2YWx1ZXMgb24gc3RhY2sgYXQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAvLyB9CgogIC8vIHNhdmUgY3VycmVudCByZXN1bHQgaW4gdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgY2FjaGVJbltpXSA9IGluW2ldOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICBjYWNoZU91dFtpXSA9IG91dFtpXTsKICB9Cn0KCkdCb29sIFBvc3RTY3JpcHRGdW5jdGlvbjo6cGFyc2VDb2RlKFN0cmVhbSAqc3RyLCBpbnQgKmNvZGVQdHIpIHsKICBHb29TdHJpbmcgKnRvazsKICBjaGFyICpwOwogIEdCb29sIGlzUmVhbDsKICBpbnQgb3BQdHIsIGVsc2VQdHI7CiAgaW50IGEsIGIsIG1pZCwgY21wOwoKICB3aGlsZSAoMSkgewogICAgaWYgKCEodG9rID0gZ2V0VG9rZW4oc3RyKSkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVW5leHBlY3RlZCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiBzdHJlYW0iKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIHAgPSB0b2stPmdldENTdHJpbmcoKTsKICAgIGlmIChpc2RpZ2l0KCpwKSB8fCAqcCA9PSAnLicgfHwgKnAgPT0gJy0nKSB7CiAgICAgIGlzUmVhbCA9IGdGYWxzZTsKICAgICAgZm9yICg7ICpwOyArK3ApIHsKCWlmICgqcCA9PSAnLicpIHsKCSAgaXNSZWFsID0gZ1RydWU7CgkgIGJyZWFrOwoJfQogICAgICB9CiAgICAgIHJlc2l6ZUNvZGUoKmNvZGVQdHIpOwogICAgICBpZiAoaXNSZWFsKSB7Cgljb2RlWypjb2RlUHRyXS50eXBlID0gcHNSZWFsOwogICAgICAgICAgY29kZVsqY29kZVB0cl0ucmVhbCA9IGdhdG9mKHRvay0+Z2V0Q1N0cmluZygpKTsKICAgICAgfSBlbHNlIHsKCWNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc0ludDsKCWNvZGVbKmNvZGVQdHJdLmludGcgPSBhdG9pKHRvay0+Z2V0Q1N0cmluZygpKTsKICAgICAgfQogICAgICArKypjb2RlUHRyOwogICAgICBkZWxldGUgdG9rOwogICAgfSBlbHNlIGlmICghdG9rLT5jbXAoInsiKSkgewogICAgICBkZWxldGUgdG9rOwogICAgICBvcFB0ciA9ICpjb2RlUHRyOwogICAgICAqY29kZVB0ciArPSAzOwogICAgICByZXNpemVDb2RlKG9wUHRyICsgMik7CiAgICAgIGlmICghcGFyc2VDb2RlKHN0ciwgY29kZVB0cikpIHsKCXJldHVybiBnRmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCEodG9rID0gZ2V0VG9rZW4oc3RyKSkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuZXhwZWN0ZWQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24gc3RyZWFtIik7CglyZXR1cm4gZ0ZhbHNlOwogICAgICB9CiAgICAgIGlmICghdG9rLT5jbXAoInsiKSkgewoJZWxzZVB0ciA9ICpjb2RlUHRyOwoJaWYgKCFwYXJzZUNvZGUoc3RyLCBjb2RlUHRyKSkgewoJICByZXR1cm4gZ0ZhbHNlOwoJfQoJZGVsZXRlIHRvazsKCWlmICghKHRvayA9IGdldFRva2VuKHN0cikpKSB7CgkgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuZXhwZWN0ZWQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24gc3RyZWFtIik7CgkgIHJldHVybiBnRmFsc2U7Cgl9CiAgICAgIH0gZWxzZSB7CgllbHNlUHRyID0gLTE7CiAgICAgIH0KICAgICAgaWYgKCF0b2stPmNtcCgiaWYiKSkgewoJaWYgKGVsc2VQdHIgPj0gMCkgewoJICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkJIkdvdCAnaWYnIG9wZXJhdG9yIHdpdGggdHdvIGJsb2NrcyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CgkgIHJldHVybiBnRmFsc2U7Cgl9Cgljb2RlW29wUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKCWNvZGVbb3BQdHJdLm9wID0gcHNPcElmOwoJY29kZVtvcFB0cisyXS50eXBlID0gcHNCbG9jazsKCWNvZGVbb3BQdHIrMl0uYmxrID0gKmNvZGVQdHI7CiAgICAgIH0gZWxzZSBpZiAoIXRvay0+Y21wKCJpZmVsc2UiKSkgewoJaWYgKGVsc2VQdHIgPCAwKSB7CgkgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCQkiR290ICdpZmVsc2UnIG9wZXJhdG9yIHdpdGggb25lIGJsb2NrIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKCSAgcmV0dXJuIGdGYWxzZTsKCX0KCWNvZGVbb3BQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwoJY29kZVtvcFB0cl0ub3AgPSBwc09wSWZlbHNlOwoJY29kZVtvcFB0cisxXS50eXBlID0gcHNCbG9jazsKCWNvZGVbb3BQdHIrMV0uYmxrID0gZWxzZVB0cjsKCWNvZGVbb3BQdHIrMl0udHlwZSA9IHBzQmxvY2s7Cgljb2RlW29wUHRyKzJdLmJsayA9ICpjb2RlUHRyOwogICAgICB9IGVsc2UgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJICAgICAgIkV4cGVjdGVkIGlmL2lmZWxzZSBvcGVyYXRvciBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CglkZWxldGUgdG9rOwoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICBkZWxldGUgdG9rOwogICAgfSBlbHNlIGlmICghdG9rLT5jbXAoIn0iKSkgewogICAgICBkZWxldGUgdG9rOwogICAgICByZXNpemVDb2RlKCpjb2RlUHRyKTsKICAgICAgY29kZVsqY29kZVB0cl0udHlwZSA9IHBzT3BlcmF0b3I7CiAgICAgIGNvZGVbKmNvZGVQdHJdLm9wID0gcHNPcFJldHVybjsKICAgICAgKysqY29kZVB0cjsKICAgICAgYnJlYWs7CiAgICB9IGVsc2UgewogICAgICBhID0gLTE7CiAgICAgIGIgPSBuUFNPcHM7CiAgICAgIGNtcCA9IDA7IC8vIG1ha2UgZ2NjIGhhcHB5CiAgICAgIC8vIGludmFyaWFudDogcHNPcE5hbWVzW2FdIDwgdG9rIDwgcHNPcE5hbWVzW2JdCiAgICAgIHdoaWxlIChiIC0gYSA+IDEpIHsKCW1pZCA9IChhICsgYikgLyAyOwoJY21wID0gdG9rLT5jbXAocHNPcE5hbWVzW21pZF0pOwoJaWYgKGNtcCA+IDApIHsKCSAgYSA9IG1pZDsKCX0gZWxzZSBpZiAoY21wIDwgMCkgewoJICBiID0gbWlkOwoJfSBlbHNlIHsKCSAgYSA9IGIgPSBtaWQ7Cgl9CiAgICAgIH0KICAgICAgaWYgKGNtcCAhPSAwKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkgICAgICAiVW5rbm93biBvcGVyYXRvciAnezA6dH0nIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iLAoJICAgICAgdG9rKTsKCWRlbGV0ZSB0b2s7CglyZXR1cm4gZ0ZhbHNlOwogICAgICB9CiAgICAgIGRlbGV0ZSB0b2s7CiAgICAgIHJlc2l6ZUNvZGUoKmNvZGVQdHIpOwogICAgICBjb2RlWypjb2RlUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKICAgICAgY29kZVsqY29kZVB0cl0ub3AgPSAoUFNPcClhOwogICAgICArKypjb2RlUHRyOwogICAgfQogIH0KICByZXR1cm4gZ1RydWU7Cn0KCkdvb1N0cmluZyAqUG9zdFNjcmlwdEZ1bmN0aW9uOjpnZXRUb2tlbihTdHJlYW0gKnN0cikgewogIEdvb1N0cmluZyAqczsKICBpbnQgYzsKICBHQm9vbCBjb21tZW50OwoKICBzID0gbmV3IEdvb1N0cmluZygpOwogIGNvbW1lbnQgPSBnRmFsc2U7CiAgd2hpbGUgKDEpIHsKICAgIGlmICgoYyA9IHN0ci0+Z2V0Q2hhcigpKSA9PSBFT0YpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjb2RlU3RyaW5nLT5hcHBlbmQoYyk7CiAgICBpZiAoY29tbWVudCkgewogICAgICBpZiAoYyA9PSAnXHgwYScgfHwgYyA9PSAnXHgwZCcpIHsKCWNvbW1lbnQgPSBnRmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYyA9PSAnJScpIHsKICAgICAgY29tbWVudCA9IGdUcnVlOwogICAgfSBlbHNlIGlmICghaXNzcGFjZShjKSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGMgPT0gJ3snIHx8IGMgPT0gJ30nKSB7CiAgICBzLT5hcHBlbmQoKGNoYXIpYyk7CiAgfSBlbHNlIGlmIChpc2RpZ2l0KGMpIHx8IGMgPT0gJy4nIHx8IGMgPT0gJy0nKSB7CiAgICB3aGlsZSAoMSkgewogICAgICBzLT5hcHBlbmQoKGNoYXIpYyk7CiAgICAgIGMgPSBzdHItPmxvb2tDaGFyKCk7CiAgICAgIGlmIChjID09IEVPRiB8fCAhKGlzZGlnaXQoYykgfHwgYyA9PSAnLicgfHwgYyA9PSAnLScpKSB7CglicmVhazsKICAgICAgfQogICAgICBzdHItPmdldENoYXIoKTsKICAgICAgY29kZVN0cmluZy0+YXBwZW5kKGMpOwogICAgfQogIH0gZWxzZSB7CiAgICB3aGlsZSAoMSkgewogICAgICBzLT5hcHBlbmQoKGNoYXIpYyk7CiAgICAgIGMgPSBzdHItPmxvb2tDaGFyKCk7CiAgICAgIGlmIChjID09IEVPRiB8fCAhaXNhbG51bShjKSkgewoJYnJlYWs7CiAgICAgIH0KICAgICAgc3RyLT5nZXRDaGFyKCk7CiAgICAgIGNvZGVTdHJpbmctPmFwcGVuZChjKTsKICAgIH0KICB9CiAgcmV0dXJuIHM7Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjpyZXNpemVDb2RlKGludCBuZXdTaXplKSB7CiAgaWYgKG5ld1NpemUgPj0gY29kZVNpemUpIHsKICAgIGNvZGVTaXplICs9IDY0OwogICAgY29kZSA9IChQU09iamVjdCAqKWdyZWFsbG9jbihjb2RlLCBjb2RlU2l6ZSwgc2l6ZW9mKFBTT2JqZWN0KSk7CiAgfQp9Cgp2b2lkIFBvc3RTY3JpcHRGdW5jdGlvbjo6ZXhlYyhQU1N0YWNrICpzdGFjaywgaW50IGNvZGVQdHIpIHsKICBpbnQgaTEsIGkyOwogIGRvdWJsZSByMSwgcjIsIHJlc3VsdDsKICBHQm9vbCBiMSwgYjI7CgogIHdoaWxlICgxKSB7CiAgICBzd2l0Y2ggKGNvZGVbY29kZVB0cl0udHlwZSkgewogICAgY2FzZSBwc0ludDoKICAgICAgc3RhY2stPnB1c2hJbnQoY29kZVtjb2RlUHRyKytdLmludGcpOwogICAgICBicmVhazsKICAgIGNhc2UgcHNSZWFsOgogICAgICBzdGFjay0+cHVzaFJlYWwoY29kZVtjb2RlUHRyKytdLnJlYWwpOwogICAgICBicmVhazsKICAgIGNhc2UgcHNPcGVyYXRvcjoKICAgICAgc3dpdGNoIChjb2RlW2NvZGVQdHIrK10ub3ApIHsKICAgICAgY2FzZSBwc09wQWJzOgoJaWYgKHN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoSW50KGFicyhzdGFjay0+cG9wSW50KCkpKTsKCX0gZWxzZSB7CgkgIHN0YWNrLT5wdXNoUmVhbChmYWJzKHN0YWNrLT5wb3BOdW0oKSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEFkZDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgKyBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbChyMSArIHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BBbmQ6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxICYgaTIpOwoJfSBlbHNlIHsKCSAgYjIgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBiMSA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChiMSAmJiBiMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQXRhbjoKCXIyID0gc3RhY2stPnBvcE51bSgpOwoJcjEgPSBzdGFjay0+cG9wTnVtKCk7CglyZXN1bHQgPSBhdGFuMihyMSwgcjIpICogMTgwLjAgLyBNX1BJOwoJaWYgKHJlc3VsdCA8IDApIHJlc3VsdCArPSAzNjAuMDsKCXN0YWNrLT5wdXNoUmVhbChyZXN1bHQpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEJpdHNoaWZ0OgoJaTIgPSBzdGFjay0+cG9wSW50KCk7CglpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCWlmIChpMiA+IDApIHsKCSAgc3RhY2stPnB1c2hJbnQoaTEgPDwgaTIpOwoJfSBlbHNlIGlmIChpMiA8IDApIHsKCSAgc3RhY2stPnB1c2hJbnQoKGludCkoKEd1aW50KWkxID4+IC1pMikpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hJbnQoaTEpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcENlaWxpbmc6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoUmVhbChjZWlsKHN0YWNrLT5wb3BOdW0oKSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcENvcHk6CglzdGFjay0+Y29weShzdGFjay0+cG9wSW50KCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcENvczoKCXN0YWNrLT5wdXNoUmVhbChjb3Moc3RhY2stPnBvcE51bSgpICogTV9QSSAvIDE4MC4wKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wQ3ZpOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaEludCgoaW50KXN0YWNrLT5wb3BOdW0oKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQ3ZyOgoJaWYgKCFzdGFjay0+dG9wSXNSZWFsKCkpIHsKCSAgc3RhY2stPnB1c2hSZWFsKHN0YWNrLT5wb3BOdW0oKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wRGl2OgoJcjIgPSBzdGFjay0+cG9wTnVtKCk7CglyMSA9IHN0YWNrLT5wb3BOdW0oKTsKCXN0YWNrLT5wdXNoUmVhbChyMSAvIHIyKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BEdXA6CglzdGFjay0+Y29weSgxKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BFcToKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxID09IGkyKTsKCX0gZWxzZSBpZiAoc3RhY2stPnRvcFR3b0FyZU51bXMoKSkgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA9PSByMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxID09IGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BFeGNoOgoJc3RhY2stPnJvbGwoMiwgMSk7CglicmVhazsKICAgICAgY2FzZSBwc09wRXhwOgoJcjIgPSBzdGFjay0+cG9wTnVtKCk7CglyMSA9IHN0YWNrLT5wb3BOdW0oKTsKCXN0YWNrLT5wdXNoUmVhbChwb3cocjEsIHIyKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wRmFsc2U6CglzdGFjay0+cHVzaEJvb2woZ0ZhbHNlKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BGbG9vcjoKCWlmICghc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hSZWFsKGZsb29yKHN0YWNrLT5wb3BOdW0oKSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEdlOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPj0gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPj0gcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEd0OgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPiBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA+IHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BJZGl2OgoJaTIgPSBzdGFjay0+cG9wSW50KCk7CglpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCXN0YWNrLT5wdXNoSW50KGkxIC8gaTIpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEluZGV4OgoJc3RhY2stPmluZGV4KHN0YWNrLT5wb3BJbnQoKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wTGU6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA8PSBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA8PSByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTG46CglzdGFjay0+cHVzaFJlYWwobG9nKHN0YWNrLT5wb3BOdW0oKSkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcExvZzoKCXN0YWNrLT5wdXNoUmVhbChsb2cxMChzdGFjay0+cG9wTnVtKCkpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BMdDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxIDwgaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPCByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTW9kOgoJaTIgPSBzdGFjay0+cG9wSW50KCk7CglpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCXN0YWNrLT5wdXNoSW50KGkxICUgaTIpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE11bDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgLy9+IHNob3VsZCBjaGVjayBmb3Igb3V0LW9mLXJhbmdlLCBhbmQgcHVzaCBhIHJlYWwgaW5zdGVhZAoJICBzdGFjay0+cHVzaEludChpMSAqIGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKHIxICogcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE5lOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgIT0gaTIpOwoJfSBlbHNlIGlmIChzdGFjay0+dG9wVHdvQXJlTnVtcygpKSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxICE9IHIyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgIT0gYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE5lZzoKCWlmIChzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaEludCgtc3RhY2stPnBvcEludCgpKTsKCX0gZWxzZSB7CgkgIHN0YWNrLT5wdXNoUmVhbCgtc3RhY2stPnBvcE51bSgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BOb3Q6CglpZiAoc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQofnN0YWNrLT5wb3BJbnQoKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaEJvb2woIXN0YWNrLT5wb3BCb29sKCkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE9yOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSB8IGkyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgfHwgYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFBvcDoKCXN0YWNrLT5wb3AoKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BSb2xsOgoJaTIgPSBzdGFjay0+cG9wSW50KCk7CglpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCXN0YWNrLT5yb2xsKGkxLCBpMik7CglicmVhazsKICAgICAgY2FzZSBwc09wUm91bmQ6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwoKHIxID49IDApID8gZmxvb3IocjEgKyAwLjUpIDogY2VpbChyMSAtIDAuNSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFNpbjoKCXN0YWNrLT5wdXNoUmVhbChzaW4oc3RhY2stPnBvcE51bSgpICogTV9QSSAvIDE4MC4wKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wU3FydDoKCXN0YWNrLT5wdXNoUmVhbChzcXJ0KHN0YWNrLT5wb3BOdW0oKSkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFN1YjoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgLSBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbChyMSAtIHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BUcnVlOgoJc3RhY2stPnB1c2hCb29sKGdUcnVlKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BUcnVuY2F0ZToKCWlmICghc3RhY2stPnRvcElzSW50KCkpIHsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbCgocjEgPj0gMCkgPyBmbG9vcihyMSkgOiBjZWlsKHIxKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wWG9yOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSBeIGkyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgXiBiMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wSWY6CgliMSA9IHN0YWNrLT5wb3BCb29sKCk7CglpZiAoYjEpIHsKCSAgZXhlYyhzdGFjaywgY29kZVB0ciArIDIpOwoJfQoJY29kZVB0ciA9IGNvZGVbY29kZVB0ciArIDFdLmJsazsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BJZmVsc2U6CgliMSA9IHN0YWNrLT5wb3BCb29sKCk7CglpZiAoYjEpIHsKCSAgZXhlYyhzdGFjaywgY29kZVB0ciArIDIpOwoJfSBlbHNlIHsKCSAgZXhlYyhzdGFjaywgY29kZVtjb2RlUHRyXS5ibGspOwoJfQoJY29kZVB0ciA9IGNvZGVbY29kZVB0ciArIDFdLmJsazsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BSZXR1cm46CglyZXR1cm47CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbnRlcm5hbDogYmFkIG9iamVjdCBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIGNvZGUiKTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQp9Cg==