Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRnVuY3Rpb24uY2MKLy8KLy8gQ29weXJpZ2h0IDIwMDEtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LTIwMTAsIDIwMTMtMjAxNSwgMjAxNy0yMDE5IEFsYmVydCBBc3RhbHMgQ2lkIDxhYWNpZEBrZGUub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMDYgSmVmZiBNdWl6ZWxhYXIgPGplZmZAaW5maWRpZ20ubmV0PgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTEgQW5kcmVhIENhbmNpYW5pIDxyYW5tYTQyQGdtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgQWRhbSBSZWljaG9sZCA8YWRhbXJlaWNob2xkQG15b3BlcmEuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTMgRmFiaW8gRCdVcnNvIDxmYWJpb2R1cnNvQGhvdG1haWwuaXQ+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlIDxjb25maWcuaD4KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgImdvby9nbWVtLmgiCiNpbmNsdWRlICJnb28vZ3N0cnRvZC5oIgojaW5jbHVkZSAiT2JqZWN0LmgiCiNpbmNsdWRlICJEaWN0LmgiCiNpbmNsdWRlICJTdHJlYW0uaCIKI2luY2x1ZGUgIkVycm9yLmgiCiNpbmNsdWRlICJGdW5jdGlvbi5oIgoKI2lmbmRlZiBNX1BJCiNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CiNlbmRpZgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZ1bmN0aW9uOjpGdW5jdGlvbigpIDogZG9tYWlue30gewp9CgpGdW5jdGlvbjo6fkZ1bmN0aW9uKCkgewp9CgpGdW5jdGlvbiAqRnVuY3Rpb246OnBhcnNlKE9iamVjdCAqZnVuY09iaikgewogIHN0ZDo6c2V0PGludD4gdXNlZFBhcmVudHM7CiAgcmV0dXJuIHBhcnNlKGZ1bmNPYmosICZ1c2VkUGFyZW50cyk7Cn0KCkZ1bmN0aW9uICpGdW5jdGlvbjo6cGFyc2UoT2JqZWN0ICpmdW5jT2JqLCBzdGQ6OnNldDxpbnQ+ICp1c2VkUGFyZW50cykgewogIEZ1bmN0aW9uICpmdW5jOwogIERpY3QgKmRpY3Q7CiAgaW50IGZ1bmNUeXBlOwoKICBpZiAoZnVuY09iai0+aXNTdHJlYW0oKSkgewogICAgZGljdCA9IGZ1bmNPYmotPnN0cmVhbUdldERpY3QoKTsKICB9IGVsc2UgaWYgKGZ1bmNPYmotPmlzRGljdCgpKSB7CiAgICBkaWN0ID0gZnVuY09iai0+Z2V0RGljdCgpOwogIH0gZWxzZSBpZiAoZnVuY09iai0+aXNOYW1lKCJJZGVudGl0eSIpKSB7CiAgICByZXR1cm4gbmV3IElkZW50aXR5RnVuY3Rpb24oKTsKICB9IGVsc2UgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRXhwZWN0ZWQgZnVuY3Rpb24gZGljdGlvbmFyeSBvciBzdHJlYW0iKTsKICAgIHJldHVybiBudWxscHRyOwogIH0KCiAgT2JqZWN0IG9iajEgPSBkaWN0LT5sb29rdXAoIkZ1bmN0aW9uVHlwZSIpOwogIGlmICghb2JqMS5pc0ludCgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiB0eXBlIGlzIG1pc3Npbmcgb3Igd3JvbmcgdHlwZSIpOwogICAgcmV0dXJuIG51bGxwdHI7CiAgfQogIGZ1bmNUeXBlID0gb2JqMS5nZXRJbnQoKTsKCiAgaWYgKGZ1bmNUeXBlID09IDApIHsKICAgIGZ1bmMgPSBuZXcgU2FtcGxlZEZ1bmN0aW9uKGZ1bmNPYmosIGRpY3QpOwogIH0gZWxzZSBpZiAoZnVuY1R5cGUgPT0gMikgewogICAgZnVuYyA9IG5ldyBFeHBvbmVudGlhbEZ1bmN0aW9uKGZ1bmNPYmosIGRpY3QpOwogIH0gZWxzZSBpZiAoZnVuY1R5cGUgPT0gMykgewogICAgZnVuYyA9IG5ldyBTdGl0Y2hpbmdGdW5jdGlvbihmdW5jT2JqLCBkaWN0LCB1c2VkUGFyZW50cyk7CiAgfSBlbHNlIGlmIChmdW5jVHlwZSA9PSA0KSB7CiAgICBmdW5jID0gbmV3IFBvc3RTY3JpcHRGdW5jdGlvbihmdW5jT2JqLCBkaWN0KTsKICB9IGVsc2UgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVW5pbXBsZW1lbnRlZCBmdW5jdGlvbiB0eXBlICh7MDpkfSkiLCBmdW5jVHlwZSk7CiAgICByZXR1cm4gbnVsbHB0cjsKICB9CiAgaWYgKCFmdW5jLT5pc09rKCkpIHsKICAgIGRlbGV0ZSBmdW5jOwogICAgcmV0dXJuIG51bGxwdHI7CiAgfQoKICByZXR1cm4gZnVuYzsKfQoKRnVuY3Rpb246OkZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpmdW5jKSB7CiAgICBtID0gZnVuYy0+bTsKICAgIG4gPSBmdW5jLT5uOwoKICAgIG1lbWNweShkb21haW4sIGZ1bmMtPmRvbWFpbiwgZnVuY01heElucHV0cyAqIDIgKiBzaXplb2YoZG91YmxlKSk7CiAgICBtZW1jcHkocmFuZ2UsIGZ1bmMtPnJhbmdlLCBmdW5jTWF4T3V0cHV0cyAqIDIgKiBzaXplb2YoZG91YmxlKSk7CgogICAgaGFzUmFuZ2UgPSBmdW5jLT5oYXNSYW5nZTsKfQoKYm9vbCBGdW5jdGlvbjo6aW5pdChEaWN0ICpkaWN0KSB7CiAgT2JqZWN0IG9iajE7CiAgaW50IGk7CgogIC8vLS0tLS0gRG9tYWluCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRG9tYWluIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaXMgbWlzc2luZyBkb21haW4iKTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgbSA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKSAvIDI7CiAgaWYgKG0gPiBmdW5jTWF4SW5wdXRzKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gezA6ZH0gaW5wdXRzIGFyZSB1bnN1cHBvcnRlZCIsCgkgIGZ1bmNNYXhJbnB1dHMpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBPYmplY3Qgb2JqMiA9IG9iajEuYXJyYXlHZXQoMippKTsKICAgIGlmICghb2JqMi5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZG9tYWluIGFycmF5Iik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGRvbWFpbltpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICBvYmoyID0gb2JqMS5hcnJheUdldCgyKmkrMSk7CiAgICBpZiAoIW9iajIuaXNOdW0oKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRvbWFpbiBhcnJheSIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBkb21haW5baV1bMV0gPSBvYmoyLmdldE51bSgpOwogIH0KCiAgLy8tLS0tLSBSYW5nZQogIGhhc1JhbmdlID0gZmFsc2U7CiAgbiA9IDA7CiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiUmFuZ2UiKTsKICBpZiAob2JqMS5pc0FycmF5KCkpIHsKICAgIGhhc1JhbmdlID0gdHJ1ZTsKICAgIG4gPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgLyAyOwogICAgaWYgKG4gPiBmdW5jTWF4T3V0cHV0cykgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gezA6ZH0gb3V0cHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICAgIGZ1bmNNYXhPdXRwdXRzKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBPYmplY3Qgb2JqMiA9IG9iajEuYXJyYXlHZXQoMippKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gcmFuZ2UgYXJyYXkiKTsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByYW5nZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSsxKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gcmFuZ2UgYXJyYXkiKTsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByYW5nZVtpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICB9CiAgfQoKICByZXR1cm4gdHJ1ZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSWRlbnRpdHlGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSWRlbnRpdHlGdW5jdGlvbjo6SWRlbnRpdHlGdW5jdGlvbigpIHsKICBpbnQgaTsKCiAgLy8gZmlsbCB0aGVzZSBpbiB3aXRoIGFyYml0cmFyeSB2YWx1ZXMganVzdCBpbiBjYXNlIHRoZXkgZ2V0IHVzZWQKICAvLyBzb21ld2hlcmUKICBtID0gZnVuY01heElucHV0czsKICBuID0gZnVuY01heE91dHB1dHM7CiAgZm9yIChpID0gMDsgaSA8IGZ1bmNNYXhJbnB1dHM7ICsraSkgewogICAgZG9tYWluW2ldWzBdID0gMDsKICAgIGRvbWFpbltpXVsxXSA9IDE7CiAgfQogIGhhc1JhbmdlID0gZmFsc2U7Cn0KCklkZW50aXR5RnVuY3Rpb246On5JZGVudGl0eUZ1bmN0aW9uKCkgewp9Cgp2b2lkIElkZW50aXR5RnVuY3Rpb246OnRyYW5zZm9ybShjb25zdCBkb3VibGUgKmluLCBkb3VibGUgKm91dCkgY29uc3QgewogIGludCBpOwoKICBmb3IgKGkgPSAwOyBpIDwgZnVuY01heE91dHB1dHM7ICsraSkgewogICAgb3V0W2ldID0gaW5baV07CiAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTYW1wbGVkRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClNhbXBsZWRGdW5jdGlvbjo6U2FtcGxlZEZ1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCkgewogIFN0cmVhbSAqc3RyOwogIGludCBzYW1wbGVCaXRzOwogIGRvdWJsZSBzYW1wbGVNdWw7CiAgT2JqZWN0IG9iajE7CiAgdW5zaWduZWQgaW50IGJ1ZiwgYml0TWFzazsKICBpbnQgYml0czsKICB1bnNpZ25lZCBpbnQgczsKICBkb3VibGUgaW5bZnVuY01heElucHV0c107CiAgaW50IGksIGosIHQsIGJpdCwgaWR4OwoKICBpZHhPZmZzZXQgPSBudWxscHRyOwogIHNhbXBsZXMgPSBudWxscHRyOwogIHNCdWYgPSBudWxscHRyOwogIG9rID0gZmFsc2U7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgcmV0dXJuOwogIH0KICBpZiAoIWhhc1JhbmdlKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIDAgZnVuY3Rpb24gaXMgbWlzc2luZyByYW5nZSIpOwogICAgcmV0dXJuOwogIH0KICBpZiAobSA+IHNhbXBsZWRGdW5jTWF4SW5wdXRzKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTYW1wbGVkIGZ1bmN0aW9ucyB3aXRoIG1vcmUgdGhhbiB7MDpkfSBpbnB1dHMgYXJlIHVuc3VwcG9ydGVkIiwKCSAgc2FtcGxlZEZ1bmNNYXhJbnB1dHMpOwogICAgcmV0dXJuOwogIH0KCiAgLy8tLS0tLSBidWZmZXIKICBzQnVmID0gKGRvdWJsZSAqKWdtYWxsb2NuKDEgPDwgbSwgc2l6ZW9mKGRvdWJsZSkpOwoKICAvLy0tLS0tIGdldCB0aGUgc3RyZWFtCiAgaWYgKCFmdW5jT2JqLT5pc1N0cmVhbSgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIDAgZnVuY3Rpb24gaXNuJ3QgYSBzdHJlYW0iKTsKICAgIHJldHVybjsKICB9CiAgc3RyID0gZnVuY09iai0+Z2V0U3RyZWFtKCk7CgogIC8vLS0tLS0gU2l6ZQogIG9iajEgPSBkaWN0LT5sb29rdXAoIlNpemUiKTsKICBpZiAoIW9iajEuaXNBcnJheSgpIHx8IG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSBtKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiBoYXMgbWlzc2luZyBvciBpbnZhbGlkIHNpemUgYXJyYXkiKTsKICAgIHJldHVybjsKICB9CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KGkpOwogICAgaWYgKCFvYmoyLmlzSW50KCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBzaXplIGFycmF5Iik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHNhbXBsZVNpemVbaV0gPSBvYmoyLmdldEludCgpOwogICAgaWYgKHNhbXBsZVNpemVbaV0gPD0gMCkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIG5vbi1wb3NpdGl2ZSB2YWx1ZSBpbiBmdW5jdGlvbiBzaXplIGFycmF5Iik7CiAgICAgIHJldHVybjsKICAgIH0KICB9CiAgaWR4T2Zmc2V0ID0gKGludCAqKWdtYWxsb2NuKDEgPDwgbSwgc2l6ZW9mKGludCkpOwogIGZvciAoaSA9IDA7IGkgPCAoMTw8bSk7ICsraSkgewogICAgaWR4ID0gMDsKICAgIGZvciAoaiA9IG0gLSAxLCB0ID0gaTsgaiA+PSAxOyAtLWosIHQgPDw9IDEpIHsKICAgICAgaWYgKHNhbXBsZVNpemVbal0gPT0gMSkgewoJYml0ID0gMDsKICAgICAgfSBlbHNlIHsKCWJpdCA9ICh0ID4+IChtIC0gMSkpICYgMTsKICAgICAgfQogICAgICBpZHggPSAoaWR4ICsgYml0KSAqIHNhbXBsZVNpemVbai0xXTsKICAgIH0KICAgIGlmIChtID4gMCAmJiBzYW1wbGVTaXplWzBdID09IDEpIHsKICAgICAgYml0ID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGJpdCA9ICh0ID4+IChtIC0gMSkpICYgMTsKICAgIH0KICAgIGlkeE9mZnNldFtpXSA9IChpZHggKyBiaXQpICogbjsKICB9CgogIC8vLS0tLS0gQml0c1BlclNhbXBsZQogIG9iajEgPSBkaWN0LT5sb29rdXAoIkJpdHNQZXJTYW1wbGUiKTsKICBpZiAoIW9iajEuaXNJbnQoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBCaXRzUGVyU2FtcGxlIik7CiAgICByZXR1cm47CiAgfQogIHNhbXBsZUJpdHMgPSBvYmoxLmdldEludCgpOwogIGlmICh1bmxpa2VseShzYW1wbGVCaXRzIDwgMSB8fCBzYW1wbGVCaXRzID4gMzIpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiBpbnZhbGlkIEJpdHNQZXJTYW1wbGUiKTsKICAgIHJldHVybjsKICB9CiAgc2FtcGxlTXVsID0gMS4wIC8gKHBvdygyLjAsIChkb3VibGUpc2FtcGxlQml0cykgLSAxKTsKCiAgLy8tLS0tLSBFbmNvZGUKICBvYmoxID0gZGljdC0+bG9va3VwKCJFbmNvZGUiKTsKICBpZiAob2JqMS5pc0FycmF5KCkgJiYgb2JqMS5hcnJheUdldExlbmd0aCgpID09IDIqbSkgewogICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgICBPYmplY3Qgb2JqMiA9IG9iajEuYXJyYXlHZXQoMippKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZW5jb2RlIGFycmF5Iik7CglyZXR1cm47CiAgICAgIH0KICAgICAgZW5jb2RlW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMiA9IG9iajEuYXJyYXlHZXQoMippKzEpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBlbmNvZGUgYXJyYXkiKTsKCXJldHVybjsKICAgICAgfQogICAgICBlbmNvZGVbaV1bMV0gPSBvYmoyLmdldE51bSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgIGVuY29kZVtpXVswXSA9IDA7CiAgICAgIGVuY29kZVtpXVsxXSA9IHNhbXBsZVNpemVbaV0gLSAxOwogICAgfQogIH0KICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpZiAodW5saWtlbHkoKGRvbWFpbltpXVsxXSAtIGRvbWFpbltpXVswXSkgPT0gMCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkb21haW4gYXJyYXkiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaW5wdXRNdWxbaV0gPSAoZW5jb2RlW2ldWzFdIC0gZW5jb2RlW2ldWzBdKSAvCiAgICAgICAgICAgICAgICAgIChkb21haW5baV1bMV0gLSBkb21haW5baV1bMF0pOwogIH0KCiAgLy8tLS0tLSBEZWNvZGUKICBvYmoxID0gZGljdC0+bG9va3VwKCJEZWNvZGUiKTsKICBpZiAob2JqMS5pc0FycmF5KCkgJiYKICAgICAgb2JqMS5hcnJheUdldExlbmd0aCgpID09IDIqbikgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBPYmplY3Qgb2JqMiA9IG9iajEuYXJyYXlHZXQoMippKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZGVjb2RlIGFycmF5Iik7CglyZXR1cm47CiAgICAgIH0KICAgICAgZGVjb2RlW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMiA9IG9iajEuYXJyYXlHZXQoMippKzEpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkZWNvZGUgYXJyYXkiKTsKCXJldHVybjsKICAgICAgfQogICAgICBkZWNvZGVbaV1bMV0gPSBvYmoyLmdldE51bSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGRlY29kZVtpXVswXSA9IHJhbmdlW2ldWzBdOwogICAgICBkZWNvZGVbaV1bMV0gPSByYW5nZVtpXVsxXTsKICAgIH0KICB9CgogIC8vLS0tLS0gc2FtcGxlcwogIG5TYW1wbGVzID0gbjsKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKQogICAgblNhbXBsZXMgKj0gc2FtcGxlU2l6ZVtpXTsKICBzYW1wbGVzID0gKGRvdWJsZSAqKWdtYWxsb2NuX2NoZWNrb3ZlcmZsb3coblNhbXBsZXMsIHNpemVvZihkb3VibGUpKTsKICBpZiAoIXNhbXBsZXMpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBpbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzIik7CiAgICByZXR1cm47CiAgfQogIGJ1ZiA9IDA7CiAgYml0cyA9IDA7CiAgYml0TWFzayA9ICgxIDw8IHNhbXBsZUJpdHMpIC0gMTsKICBzdHItPnJlc2V0KCk7CiAgZm9yIChpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgIGlmIChzYW1wbGVCaXRzID09IDgpIHsKICAgICAgcyA9IHN0ci0+Z2V0Q2hhcigpOwogICAgfSBlbHNlIGlmIChzYW1wbGVCaXRzID09IDE2KSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICB9IGVsc2UgaWYgKHNhbXBsZUJpdHMgPT0gMzIpIHsKICAgICAgcyA9IHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKGJpdHMgPCBzYW1wbGVCaXRzKSB7CglidWYgPSAoYnVmIDw8IDgpIHwgKHN0ci0+Z2V0Q2hhcigpICYgMHhmZik7CgliaXRzICs9IDg7CiAgICAgIH0KICAgICAgcyA9IChidWYgPj4gKGJpdHMgLSBzYW1wbGVCaXRzKSkgJiBiaXRNYXNrOwogICAgICBiaXRzIC09IHNhbXBsZUJpdHM7CiAgICB9CiAgICBzYW1wbGVzW2ldID0gKGRvdWJsZSlzICogc2FtcGxlTXVsOwogIH0KICBzdHItPmNsb3NlKCk7CgogIC8vIHNldCB1cCB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpbltpXSA9IGRvbWFpbltpXVswXTsKICAgIGNhY2hlSW5baV0gPSBpbltpXSAtIDE7CiAgfQogIHRyYW5zZm9ybShpbiwgY2FjaGVPdXQpOwoKICBvayA9IHRydWU7Cn0KClNhbXBsZWRGdW5jdGlvbjo6flNhbXBsZWRGdW5jdGlvbigpIHsKICBpZiAoaWR4T2Zmc2V0KSB7CiAgICBnZnJlZShpZHhPZmZzZXQpOwogIH0KICBpZiAoc2FtcGxlcykgewogICAgZ2ZyZWUoc2FtcGxlcyk7CiAgfQogIGlmIChzQnVmKSB7CiAgICBnZnJlZShzQnVmKTsKICB9Cn0KClNhbXBsZWRGdW5jdGlvbjo6U2FtcGxlZEZ1bmN0aW9uKGNvbnN0IFNhbXBsZWRGdW5jdGlvbiAqZnVuYykgOiBGdW5jdGlvbihmdW5jKSB7CiAgbWVtY3B5KHNhbXBsZVNpemUsIGZ1bmMtPnNhbXBsZVNpemUsIGZ1bmNNYXhJbnB1dHMgKiBzaXplb2YoaW50KSk7CgogIG1lbWNweShlbmNvZGUsIGZ1bmMtPmVuY29kZSwgZnVuY01heElucHV0cyAqIDIgKiBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGRlY29kZSwgZnVuYy0+ZGVjb2RlLCBmdW5jTWF4T3V0cHV0cyAqIDIgKiBzaXplb2YoZG91YmxlKSk7CgogIG1lbWNweShpbnB1dE11bCwgZnVuYy0+aW5wdXRNdWwsIGZ1bmNNYXhJbnB1dHMgKiBzaXplb2YoZG91YmxlKSk7CgogIG5TYW1wbGVzID0gZnVuYy0+blNhbXBsZXM7CgogIGlkeE9mZnNldCA9IChpbnQgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihpbnQpKTsKICBtZW1jcHkoaWR4T2Zmc2V0LCBmdW5jLT5pZHhPZmZzZXQsICgxIDw8IG0pICogKGludClzaXplb2YoaW50KSk7CgogIHNhbXBsZXMgPSAoZG91YmxlICopZ21hbGxvY24oblNhbXBsZXMsIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoc2FtcGxlcywgZnVuYy0+c2FtcGxlcywgblNhbXBsZXMgKiBzaXplb2YoZG91YmxlKSk7CgogIHNCdWYgPSAoZG91YmxlICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoZG91YmxlKSk7CgogIG1lbWNweShjYWNoZUluLCBmdW5jLT5jYWNoZUluLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShjYWNoZU91dCwgZnVuYy0+Y2FjaGVPdXQsIGZ1bmNNYXhPdXRwdXRzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBvayA9IGZ1bmMtPm9rOwp9Cgp2b2lkIFNhbXBsZWRGdW5jdGlvbjo6dHJhbnNmb3JtKGNvbnN0IGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSBjb25zdCB7CiAgZG91YmxlIHg7CiAgaW50IGVbZnVuY01heElucHV0c107CiAgZG91YmxlIGVmcmFjMFtmdW5jTWF4SW5wdXRzXTsKICBkb3VibGUgZWZyYWMxW2Z1bmNNYXhJbnB1dHNdOwoKICAvLyBjaGVjayB0aGUgY2FjaGUKICBib29sIGluQ2FjaGUgPSB0cnVlOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpZiAoaW5baV0gIT0gY2FjaGVJbltpXSkgewogICAgICBpbkNhY2hlID0gZmFsc2U7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoaW5DYWNoZSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb3V0W2ldID0gY2FjaGVPdXRbaV07CiAgICB9CiAgICByZXR1cm47CiAgfQoKICAvLyBtYXAgaW5wdXQgdmFsdWVzIGludG8gc2FtcGxlIGFycmF5CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIHggPSAoaW5baV0gLSBkb21haW5baV1bMF0pICogaW5wdXRNdWxbaV0gKyBlbmNvZGVbaV1bMF07CiAgICBpZiAoeCA8IDAgfHwgeCAhPSB4KSB7ICAvLyB4IT14IGlzIGEgbW9yZSBwb3J0YWJsZSB2ZXJzaW9uIG9mIGlzbmFuKHgpCiAgICAgIHggPSAwOwogICAgfSBlbHNlIGlmICh4ID4gc2FtcGxlU2l6ZVtpXSAtIDEpIHsKICAgICAgeCA9IHNhbXBsZVNpemVbaV0gLSAxOwogICAgfQogICAgZVtpXSA9IChpbnQpeDsKICAgIGlmIChlW2ldID09IHNhbXBsZVNpemVbaV0gLSAxICYmIHNhbXBsZVNpemVbaV0gPiAxKSB7CiAgICAgIC8vIHRoaXMgaGFwcGVucyBpZiBpbltpXSA9IGRvbWFpbltpXVsxXQogICAgICBlW2ldID0gc2FtcGxlU2l6ZVtpXSAtIDI7CiAgICB9CiAgICBlZnJhYzFbaV0gPSB4IC0gZVtpXTsKICAgIGVmcmFjMFtpXSA9IDEgLSBlZnJhYzFbaV07CiAgfQoKICAvLyBjb21wdXRlIGluZGV4IGZvciB0aGUgZmlyc3Qgc2FtcGxlIHRvIGJlIHVzZWQKICBpbnQgaWR4MCA9IDA7CiAgZm9yIChpbnQgayA9IG0gLSAxOyBrID49IDE7IC0taykgewogICAgaWR4MCA9IChpZHgwICsgZVtrXSkgKiBzYW1wbGVTaXplW2stMV07CiAgfQogIGlkeDAgPSAoaWR4MCArIGVbMF0pICogbjsKCiAgLy8gZm9yIGVhY2ggb3V0cHV0LCBkbyBtLWxpbmVhciBpbnRlcnBvbGF0aW9uCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKCiAgICAvLyBwdWxsIDJebSB2YWx1ZXMgb3V0IG9mIHRoZSBzYW1wbGUgYXJyYXkKICAgIGZvciAoaW50IGogPSAwOyBqIDwgKDE8PG0pOyArK2opIHsKICAgICAgaW50IGlkeCA9IGlkeDAgKyBpZHhPZmZzZXRbal0gKyBpOwogICAgICBpZiAobGlrZWx5KGlkeCA+PSAwICYmIGlkeCA8IG5TYW1wbGVzKSkgewogICAgICAgIHNCdWZbal0gPSBzYW1wbGVzW2lkeF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc0J1ZltqXSA9IDA7IC8vIFRPRE8gSW52ZXN0aWdhdGUgaWYgdGhpcyBpcyB3aGF0IEFkb2JlIGRvZXMKICAgICAgfQogICAgfQoKICAgIC8vIGRvIG0gc2V0cyBvZiBpbnRlcnBvbGF0aW9ucwogICAgZm9yIChpbnQgaiA9IDAsIHQgPSAoMTw8bSk7IGogPCBtOyArK2osIHQgPj49IDEpIHsKICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB0OyBrICs9IDIpIHsKCXNCdWZbayA+PiAxXSA9IGVmcmFjMFtqXSAqIHNCdWZba10gKyBlZnJhYzFbal0gKiBzQnVmW2srMV07CiAgICAgIH0KICAgIH0KCiAgICAvLyBtYXAgb3V0cHV0IHZhbHVlIHRvIHJhbmdlCiAgICBvdXRbaV0gPSBzQnVmWzBdICogKGRlY29kZVtpXVsxXSAtIGRlY29kZVtpXVswXSkgKyBkZWNvZGVbaV1bMF07CiAgICBpZiAob3V0W2ldIDwgcmFuZ2VbaV1bMF0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMF07CiAgICB9IGVsc2UgaWYgKG91dFtpXSA+IHJhbmdlW2ldWzFdKSB7CiAgICAgIG91dFtpXSA9IHJhbmdlW2ldWzFdOwogICAgfQogIH0KCiAgLy8gc2F2ZSBjdXJyZW50IHJlc3VsdCBpbiB0aGUgY2FjaGUKICBmb3IgKGludCBpID0gMDsgaSA8IG07ICsraSkgewogICAgY2FjaGVJbltpXSA9IGluW2ldOwogIH0KICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgY2FjaGVPdXRbaV0gPSBvdXRbaV07CiAgfQp9Cgpib29sIFNhbXBsZWRGdW5jdGlvbjo6aGFzRGlmZmVyZW50UmVzdWx0U2V0KGNvbnN0IEZ1bmN0aW9uICpmdW5jKSBjb25zdCB7CiAgaWYgKGZ1bmMtPmdldFR5cGUoKSA9PSAwKSB7CiAgICBTYW1wbGVkRnVuY3Rpb24gKmNvbXBUbyA9IChTYW1wbGVkRnVuY3Rpb24gKikgZnVuYzsKICAgIGlmIChjb21wVG8tPmdldFNhbXBsZU51bWJlcigpICE9IG5TYW1wbGVzKQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNvbnN0IGRvdWJsZSAqY29tcFNhbXBsZXMgPSBjb21wVG8tPmdldFNhbXBsZXMoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblNhbXBsZXM7IGkrKykgewogICAgICBpZiAoc2FtcGxlc1tpXSAhPSBjb21wU2FtcGxlc1tpXSkKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBFeHBvbmVudGlhbEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpFeHBvbmVudGlhbEZ1bmN0aW9uOjpFeHBvbmVudGlhbEZ1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCkgewogIE9iamVjdCBvYmoxOwoKICBvayA9IGZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKG0gIT0gMSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRXhwb25lbnRpYWwgZnVuY3Rpb24gd2l0aCBtb3JlIHRoYW4gb25lIGlucHV0Iik7CiAgICByZXR1cm47CiAgfQoKICAvLy0tLS0tIEMwCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiQzAiKTsKICBpZiAob2JqMS5pc0FycmF5KCkpIHsKICAgIGlmIChoYXNSYW5nZSAmJiBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbikgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBuID0gb2JqMS5hcnJheUdldExlbmd0aCgpOwogICAgaWYgKHVubGlrZWx5KG4gPiBmdW5jTWF4T3V0cHV0cykpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMCBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgbiA9IGZ1bmNNYXhPdXRwdXRzOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KGkpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBDMCBhcnJheSIpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGMwW2ldID0gb2JqMi5nZXROdW0oKTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGhhc1JhbmdlICYmIG4gIT0gMSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBuID0gMTsKICAgIGMwWzBdID0gMDsKICB9CgogIC8vLS0tLS0gQzEKICBvYmoxID0gZGljdC0+bG9va3VwKCJDMSIpOwogIGlmIChvYmoxLmlzQXJyYXkoKSkgewogICAgaWYgKG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSBuKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uJ3MgQzEgYXJyYXkgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldChpKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gQzEgYXJyYXkiKTsKCXJldHVybjsKICAgICAgfQogICAgICBjMVtpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChuICE9IDEpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMSBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYzFbMF0gPSAxOwogIH0KCiAgLy8tLS0tLSBOIChleHBvbmVudCkKICBvYmoxID0gZGljdC0+bG9va3VwKCJOIik7CiAgaWYgKCFvYmoxLmlzTnVtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgTiIpOwogICAgcmV0dXJuOwogIH0KICBlID0gb2JqMS5nZXROdW0oKTsKCiAgaXNMaW5lYXIgPSBmYWJzKGUtMS4pIDwgMWUtMTA7CiAgb2sgPSB0cnVlOwp9CgpFeHBvbmVudGlhbEZ1bmN0aW9uOjp+RXhwb25lbnRpYWxGdW5jdGlvbigpIHsKfQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6RXhwb25lbnRpYWxGdW5jdGlvbihjb25zdCBFeHBvbmVudGlhbEZ1bmN0aW9uICpmdW5jKSA6IEZ1bmN0aW9uKGZ1bmMpIHsKICBtZW1jcHkoYzAsIGZ1bmMtPmMwLCBmdW5jTWF4T3V0cHV0cyAqIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoYzEsIGZ1bmMtPmMxLCBmdW5jTWF4T3V0cHV0cyAqIHNpemVvZihkb3VibGUpKTsKCiAgZSA9IGZ1bmMtPmU7CiAgaXNMaW5lYXIgPSBmdW5jLT5pc0xpbmVhcjsKICBvayA9IGZ1bmMtPm9rOwp9Cgp2b2lkIEV4cG9uZW50aWFsRnVuY3Rpb246OnRyYW5zZm9ybShjb25zdCBkb3VibGUgKmluLCBkb3VibGUgKm91dCkgY29uc3QgewogIGRvdWJsZSB4OwogIGludCBpOwoKICBpZiAoaW5bMF0gPCBkb21haW5bMF1bMF0pIHsKICAgIHggPSBkb21haW5bMF1bMF07CiAgfSBlbHNlIGlmIChpblswXSA+IGRvbWFpblswXVsxXSkgewogICAgeCA9IGRvbWFpblswXVsxXTsKICB9IGVsc2UgewogICAgeCA9IGluWzBdOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICBvdXRbaV0gPSBjMFtpXSArIChpc0xpbmVhciA/IHggOiBwb3coeCwgZSkpICogKGMxW2ldIC0gYzBbaV0pOwogICAgaWYgKGhhc1JhbmdlKSB7CiAgICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewoJb3V0W2ldID0gcmFuZ2VbaV1bMF07CiAgICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKCW91dFtpXSA9IHJhbmdlW2ldWzFdOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybjsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3RpdGNoaW5nRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClN0aXRjaGluZ0Z1bmN0aW9uOjpTdGl0Y2hpbmdGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QsIHN0ZDo6c2V0PGludD4gKnVzZWRQYXJlbnRzKSB7CiAgT2JqZWN0IG9iajE7CiAgaW50IGk7CgogIG9rID0gZmFsc2U7CiAgZnVuY3MgPSBudWxscHRyOwogIGJvdW5kcyA9IG51bGxwdHI7CiAgZW5jb2RlID0gbnVsbHB0cjsKICBzY2FsZSA9IG51bGxwdHI7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgcmV0dXJuOwogIH0KICBpZiAobSAhPSAxKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGl0Y2hpbmcgZnVuY3Rpb24gd2l0aCBtb3JlIHRoYW4gb25lIGlucHV0Iik7CiAgICByZXR1cm47CiAgfQoKICAvLy0tLS0tIEZ1bmN0aW9ucwogIG9iajEgPSBkaWN0LT5sb29rdXAoIkZ1bmN0aW9ucyIpOwogIGlmICghb2JqMS5pc0FycmF5KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIk1pc3NpbmcgJ0Z1bmN0aW9ucycgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICByZXR1cm47CiAgfQogIGsgPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCk7CiAgZnVuY3MgPSAoRnVuY3Rpb24gKiopZ21hbGxvY24oaywgc2l6ZW9mKEZ1bmN0aW9uICopKTsKICBib3VuZHMgPSAoZG91YmxlICopZ21hbGxvY24oayArIDEsIHNpemVvZihkb3VibGUpKTsKICBlbmNvZGUgPSAoZG91YmxlICopZ21hbGxvY24oMiAqIGssIHNpemVvZihkb3VibGUpKTsKICBzY2FsZSA9IChkb3VibGUgKilnbWFsbG9jbihrLCBzaXplb2YoZG91YmxlKSk7CiAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgZnVuY3NbaV0gPSBudWxscHRyOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBzdGQ6OnNldDxpbnQ+IHVzZWRQYXJlbnRzQXV4ID0gKnVzZWRQYXJlbnRzOwogICAgUmVmIHJlZjsKICAgIE9iamVjdCBvYmoyID0gb2JqMS5nZXRBcnJheSgpLT5nZXQoaSwgJnJlZik7CiAgICBpZiAocmVmICE9IFJlZjo6SU5WQUxJRCgpKSB7CiAgICAgIGlmICh1c2VkUGFyZW50c0F1eC5maW5kKHJlZi5udW0pID09IHVzZWRQYXJlbnRzQXV4LmVuZCgpKSB7CiAgICAgICAgdXNlZFBhcmVudHNBdXguaW5zZXJ0KHJlZi5udW0pOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgaWYgKCEoZnVuY3NbaV0gPSBGdW5jdGlvbjo6cGFyc2UoJm9iajIsICZ1c2VkUGFyZW50c0F1eCkpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChmdW5jc1tpXS0+Z2V0SW5wdXRTaXplKCkgIT0gMSB8fAoJKGkgPiAwICYmIGZ1bmNzW2ldLT5nZXRPdXRwdXRTaXplKCkgIT0gZnVuY3NbMF0tPmdldE91dHB1dFNpemUoKSkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJICAgICJJbmNvbXBhdGlibGUgc3ViZnVuY3Rpb25zIGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgfQoKICAvLy0tLS0tIEJvdW5kcwogIG9iajEgPSBkaWN0LT5sb29rdXAoIkJvdW5kcyIpOwogIGlmICghb2JqMS5pc0FycmF5KCkgfHwgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IGsgLSAxKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJNaXNzaW5nIG9yIGludmFsaWQgJ0JvdW5kcycgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICByZXR1cm47CiAgfQogIGJvdW5kc1swXSA9IGRvbWFpblswXVswXTsKICBmb3IgKGkgPSAxOyBpIDwgazsgKytpKSB7CiAgICBPYmplY3Qgb2JqMiA9IG9iajEuYXJyYXlHZXQoaSAtIDEpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSW52YWxpZCB0eXBlIGluICdCb3VuZHMnIGFycmF5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBib3VuZHNbaV0gPSBvYmoyLmdldE51bSgpOwogIH0KICBib3VuZHNba10gPSBkb21haW5bMF1bMV07CgogIC8vLS0tLS0gRW5jb2RlCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRW5jb2RlIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSB8fCBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gMiAqIGspIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIk1pc3Npbmcgb3IgaW52YWxpZCAnRW5jb2RlJyBlbnRyeSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgZm9yIChpID0gMDsgaSA8IDIgKiBrOyArK2kpIHsKICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldChpKTsKICAgIGlmICghb2JqMi5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkludmFsaWQgdHlwZSBpbiAnRW5jb2RlJyBhcnJheSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZW5jb2RlW2ldID0gb2JqMi5nZXROdW0oKTsKICB9CgogIC8vLS0tLS0gcHJlLWNvbXB1dGUgdGhlIHNjYWxlIGZhY3RvcnMKICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBpZiAoYm91bmRzW2ldID09IGJvdW5kc1tpKzFdKSB7CiAgICAgIC8vIGF2b2lkIGEgZGl2aWRlLWJ5LXplcm8gLS0gaW4gdGhpcyBzaXR1YXRpb24sIGZ1bmN0aW9uIGkgd2lsbAogICAgICAvLyBuZXZlciBiZSB1c2VkIGFueXdheQogICAgICBzY2FsZVtpXSA9IDA7CiAgICB9IGVsc2UgewogICAgICBzY2FsZVtpXSA9IChlbmNvZGVbMippKzFdIC0gZW5jb2RlWzIqaV0pIC8gKGJvdW5kc1tpKzFdIC0gYm91bmRzW2ldKTsKICAgIH0KICB9CgogIG4gPSBmdW5jc1swXS0+Z2V0T3V0cHV0U2l6ZSgpOwogIG9rID0gdHJ1ZTsKICByZXR1cm47Cn0KClN0aXRjaGluZ0Z1bmN0aW9uOjpTdGl0Y2hpbmdGdW5jdGlvbihjb25zdCBTdGl0Y2hpbmdGdW5jdGlvbiAqZnVuYykgOiBGdW5jdGlvbihmdW5jKSB7CiAgayA9IGZ1bmMtPms7CgogIGZ1bmNzID0gKEZ1bmN0aW9uICoqKWdtYWxsb2NuKGssIHNpemVvZihGdW5jdGlvbiAqKSk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIGZ1bmNzW2ldID0gZnVuYy0+ZnVuY3NbaV0tPmNvcHkoKTsKICB9CgogIGJvdW5kcyA9IChkb3VibGUgKilnbWFsbG9jbihrICsgMSwgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShib3VuZHMsIGZ1bmMtPmJvdW5kcywgKGsgKyAxKSAqIHNpemVvZihkb3VibGUpKTsKCiAgZW5jb2RlID0gKGRvdWJsZSAqKWdtYWxsb2NuKDIgKiBrLCBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGVuY29kZSwgZnVuYy0+ZW5jb2RlLCAyICogayAqIHNpemVvZihkb3VibGUpKTsKCiAgc2NhbGUgPSAoZG91YmxlICopZ21hbGxvY24oaywgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShzY2FsZSwgZnVuYy0+c2NhbGUsIGsgKiBzaXplb2YoZG91YmxlKSk7CgogIG9rID0gZnVuYy0+b2s7Cn0KClN0aXRjaGluZ0Z1bmN0aW9uOjp+U3RpdGNoaW5nRnVuY3Rpb24oKSB7CiAgaW50IGk7CgogIGlmIChmdW5jcykgewogICAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgICBpZiAoZnVuY3NbaV0pIHsKCWRlbGV0ZSBmdW5jc1tpXTsKICAgICAgfQogICAgfQogIH0KICBnZnJlZShmdW5jcyk7CiAgZ2ZyZWUoYm91bmRzKTsKICBnZnJlZShlbmNvZGUpOwogIGdmcmVlKHNjYWxlKTsKfQoKdm9pZCBTdGl0Y2hpbmdGdW5jdGlvbjo6dHJhbnNmb3JtKGNvbnN0IGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSBjb25zdCB7CiAgZG91YmxlIHg7CiAgaW50IGk7CgogIGlmIChpblswXSA8IGRvbWFpblswXVswXSkgewogICAgeCA9IGRvbWFpblswXVswXTsKICB9IGVsc2UgaWYgKGluWzBdID4gZG9tYWluWzBdWzFdKSB7CiAgICB4ID0gZG9tYWluWzBdWzFdOwogIH0gZWxzZSB7CiAgICB4ID0gaW5bMF07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBrIC0gMTsgKytpKSB7CiAgICBpZiAoeCA8IGJvdW5kc1tpKzFdKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICB4ID0gZW5jb2RlWzIqaV0gKyAoeCAtIGJvdW5kc1tpXSkgKiBzY2FsZVtpXTsKICBmdW5jc1tpXS0+dHJhbnNmb3JtKCZ4LCBvdXQpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQb3N0U2NyaXB0RnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmVudW0gUFNPcCB7CiAgcHNPcEFicywKICBwc09wQWRkLAogIHBzT3BBbmQsCiAgcHNPcEF0YW4sCiAgcHNPcEJpdHNoaWZ0LAogIHBzT3BDZWlsaW5nLAogIHBzT3BDb3B5LAogIHBzT3BDb3MsCiAgcHNPcEN2aSwKICBwc09wQ3ZyLAogIHBzT3BEaXYsCiAgcHNPcER1cCwKICBwc09wRXEsCiAgcHNPcEV4Y2gsCiAgcHNPcEV4cCwKICBwc09wRmFsc2UsCiAgcHNPcEZsb29yLAogIHBzT3BHZSwKICBwc09wR3QsCiAgcHNPcElkaXYsCiAgcHNPcEluZGV4LAogIHBzT3BMZSwKICBwc09wTG4sCiAgcHNPcExvZywKICBwc09wTHQsCiAgcHNPcE1vZCwKICBwc09wTXVsLAogIHBzT3BOZSwKICBwc09wTmVnLAogIHBzT3BOb3QsCiAgcHNPcE9yLAogIHBzT3BQb3AsCiAgcHNPcFJvbGwsCiAgcHNPcFJvdW5kLAogIHBzT3BTaW4sCiAgcHNPcFNxcnQsCiAgcHNPcFN1YiwKICBwc09wVHJ1ZSwKICBwc09wVHJ1bmNhdGUsCiAgcHNPcFhvciwKICBwc09wSWYsCiAgcHNPcElmZWxzZSwKICBwc09wUmV0dXJuCn07CgovLyBOb3RlOiAnaWYnIGFuZCAnaWZlbHNlJyBhcmUgcGFyc2VkIHNlcGFyYXRlbHkuCi8vIFRoZSByZXN0IGFyZSBsaXN0ZWQgaGVyZSBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi8vIFRoZSBpbmRleCBpbiB0aGlzIHRhYmxlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGVudHJ5IGluIFBTT3AuCnN0YXRpYyBjb25zdCBjaGFyICpwc09wTmFtZXNbXSA9IHsKICAiYWJzIiwKICAiYWRkIiwKICAiYW5kIiwKICAiYXRhbiIsCiAgImJpdHNoaWZ0IiwKICAiY2VpbGluZyIsCiAgImNvcHkiLAogICJjb3MiLAogICJjdmkiLAogICJjdnIiLAogICJkaXYiLAogICJkdXAiLAogICJlcSIsCiAgImV4Y2giLAogICJleHAiLAogICJmYWxzZSIsCiAgImZsb29yIiwKICAiZ2UiLAogICJndCIsCiAgImlkaXYiLAogICJpbmRleCIsCiAgImxlIiwKICAibG4iLAogICJsb2ciLAogICJsdCIsCiAgIm1vZCIsCiAgIm11bCIsCiAgIm5lIiwKICAibmVnIiwKICAibm90IiwKICAib3IiLAogICJwb3AiLAogICJyb2xsIiwKICAicm91bmQiLAogICJzaW4iLAogICJzcXJ0IiwKICAic3ViIiwKICAidHJ1ZSIsCiAgInRydW5jYXRlIiwKICAieG9yIgp9OwoKI2RlZmluZSBuUFNPcHMgKHNpemVvZihwc09wTmFtZXMpIC8gc2l6ZW9mKGNoYXIgKikpCgplbnVtIFBTT2JqZWN0VHlwZSB7CiAgcHNCb29sLAogIHBzSW50LAogIHBzUmVhbCwKICBwc09wZXJhdG9yLAogIHBzQmxvY2sKfTsKCi8vIEluIHRoZSBjb2RlIGFycmF5LCAnaWYnLydpZmVsc2UnIG9wZXJhdG9ycyB0YWtlIHVwIHRocmVlIHNsb3RzCi8vIHBsdXMgc3BhY2UgZm9yIHRoZSBjb2RlIGluIHRoZSBzdWJjbGF1c2UocykuCi8vCi8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IHBzT3BlcmF0b3I6IHBzT3BJZiAvIHBzT3BJZmVsc2UgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBwc0Jsb2NrOiBwdHI9PEE+ICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgcHNCbG9jazogcHRyPTxCPiAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IGlmIGNsYXVzZSAgICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wUmV0dXJuICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgPEE+IHwgZWxzZSBjbGF1c2UgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IHBzT3BlcmF0b3I6IHBzT3BSZXR1cm4gICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICA8Qj4gfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8KLy8gRm9yICdpZicsIHBvaW50ZXIgPEE+IGlzIHByZXNlbnQgaW4gdGhlIGNvZGUgc3RyZWFtIGJ1dCB1bnVzZWQuCgpzdHJ1Y3QgUFNPYmplY3QgewogIFBTT2JqZWN0VHlwZSB0eXBlOwogIHVuaW9uIHsKICAgIGJvb2wgYm9vbG47CQkvLyBib29sZWFuIChzdGFjayBvbmx5KQogICAgaW50IGludGc7CQkJLy8gaW50ZWdlciAoc3RhY2sgYW5kIGNvZGUpCiAgICBkb3VibGUgcmVhbDsJCS8vIHJlYWwgKHN0YWNrIGFuZCBjb2RlKQogICAgUFNPcCBvcDsJCQkvLyBvcGVyYXRvciAoY29kZSBvbmx5KQogICAgaW50IGJsazsJCQkvLyBpZi9pZmVsc2UgYmxvY2sgcG9pbnRlciAoY29kZSBvbmx5KQogIH07Cn07CgojZGVmaW5lIHBzU3RhY2tTaXplIDEwMAoKY2xhc3MgUFNTdGFjayB7CnB1YmxpYzoKCiAgUFNTdGFjaygpIHtzcCA9IHBzU3RhY2tTaXplOyB9CiAgdm9pZCBjbGVhcigpIHsgc3AgPSBwc1N0YWNrU2l6ZTsgfQogIHZvaWQgcHVzaEJvb2woYm9vbCBib29sbikKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc0Jvb2w7CiAgICAgIHN0YWNrW3NwXS5ib29sbiA9IGJvb2xuOwogICAgfQogIH0KICB2b2lkIHB1c2hJbnQoaW50IGludGcpCiAgewogICAgaWYgKGNoZWNrT3ZlcmZsb3coKSkgewogICAgICBzdGFja1stLXNwXS50eXBlID0gcHNJbnQ7CiAgICAgIHN0YWNrW3NwXS5pbnRnID0gaW50ZzsKICAgIH0KICB9CiAgdm9pZCBwdXNoUmVhbChkb3VibGUgcmVhbCkKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc1JlYWw7CiAgICAgIHN0YWNrW3NwXS5yZWFsID0gcmVhbDsKICAgIH0KICB9CiAgYm9vbCBwb3BCb29sKCkKICB7CiAgICBpZiAoY2hlY2tVbmRlcmZsb3coKSAmJiBjaGVja1R5cGUocHNCb29sLCBwc0Jvb2wpKSB7CiAgICAgIHJldHVybiBzdGFja1tzcCsrXS5ib29sbjsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgaW50IHBvcEludCgpCiAgewogICAgaWYgKGNoZWNrVW5kZXJmbG93KCkgJiYgY2hlY2tUeXBlKHBzSW50LCBwc0ludCkpIHsKICAgICAgcmV0dXJuIHN0YWNrW3NwKytdLmludGc7CiAgICB9CiAgICByZXR1cm4gMDsKICB9CiAgZG91YmxlIHBvcE51bSgpCiAgewogICAgZG91YmxlIHJldDsKCiAgICBpZiAoY2hlY2tVbmRlcmZsb3coKSAmJiBjaGVja1R5cGUocHNJbnQsIHBzUmVhbCkpIHsKICAgICAgcmV0ID0gKHN0YWNrW3NwXS50eXBlID09IHBzSW50KSA/IChkb3VibGUpc3RhY2tbc3BdLmludGcgOiBzdGFja1tzcF0ucmVhbDsKICAgICAgKytzcDsKICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIHJldHVybiAwOwogIH0KICBib29sIGVtcHR5KCkgeyByZXR1cm4gc3AgPT0gcHNTdGFja1NpemU7IH0KICBib29sIHRvcElzSW50KCkgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAmJiBzdGFja1tzcF0udHlwZSA9PSBwc0ludDsgfQogIGJvb2wgdG9wVHdvQXJlSW50cygpCiAgICB7IHJldHVybiBzcCA8IHBzU3RhY2tTaXplIC0gMSAmJgoJICAgICBzdGFja1tzcF0udHlwZSA9PSBwc0ludCAmJgogICAgICAgICAgICAgc3RhY2tbc3ArMV0udHlwZSA9PSBwc0ludDsgfQogIGJvb2wgdG9wSXNSZWFsKCkgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAmJiBzdGFja1tzcF0udHlwZSA9PSBwc1JlYWw7IH0KICBib29sIHRvcFR3b0FyZU51bXMoKQogICAgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAtIDEgJiYKCSAgICAgKHN0YWNrW3NwXS50eXBlID09IHBzSW50IHx8IHN0YWNrW3NwXS50eXBlID09IHBzUmVhbCkgJiYKCSAgICAgKHN0YWNrW3NwKzFdLnR5cGUgPT0gcHNJbnQgfHwgc3RhY2tbc3ArMV0udHlwZSA9PSBwc1JlYWwpOyB9CiAgdm9pZCBjb3B5KGludCBuKTsKICB2b2lkIHJvbGwoaW50IG4sIGludCBqKTsKICB2b2lkIGluZGV4KGludCBpKQogIHsKICAgIGlmICghY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC0tc3A7CiAgICBpZiAodW5saWtlbHkoc3AgKyBpICsgMSA+PSBwc1N0YWNrU2l6ZSkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHVubGlrZWx5KHNwICsgaSArIDEgPCAwKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayBvdmVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN0YWNrW3NwXSA9IHN0YWNrW3NwICsgMSArIGldOwogIH0KICB2b2lkIHBvcCgpCiAgewogICAgaWYgKCFjaGVja1VuZGVyZmxvdygpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgICsrc3A7CiAgfQoKcHJpdmF0ZToKCiAgYm9vbCBjaGVja092ZXJmbG93KGludCBuID0gMSkKICB7CiAgICBpZiAoc3AgLSBuIDwgMCkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayBvdmVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBib29sIGNoZWNrVW5kZXJmbG93KCkKICB7CiAgICBpZiAoc3AgPT0gcHNTdGFja1NpemUpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGJvb2wgY2hlY2tUeXBlKFBTT2JqZWN0VHlwZSB0MSwgUFNPYmplY3RUeXBlIHQyKQogIHsKICAgIGlmIChzdGFja1tzcF0udHlwZSAhPSB0MSAmJiBzdGFja1tzcF0udHlwZSAhPSB0MikgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIG1pc21hdGNoIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIFBTT2JqZWN0IHN0YWNrW3BzU3RhY2tTaXplXTsKICBpbnQgc3A7Cn07CgoKdm9pZCBQU1N0YWNrOjpjb3B5KGludCBuKSB7CiAgaW50IGk7CgogIGlmIChzcCArIG4gPiBwc1N0YWNrU2l6ZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgaWYgKHVubGlrZWx5KHNwIC0gbiA+IHBzU3RhY2tTaXplKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgdW5kZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgaWYgKCFjaGVja092ZXJmbG93KG4pKSB7CiAgICByZXR1cm47CiAgfQogIGZvciAoaSA9IHNwICsgbiAtIDE7IGkgPj0gc3A7IC0taSkgewogICAgc3RhY2tbaSAtIG5dID0gc3RhY2tbaV07CiAgfQogIHNwIC09IG47Cn0KCnZvaWQgUFNTdGFjazo6cm9sbChpbnQgbiwgaW50IGopIHsKICBQU09iamVjdCBvYmo7CiAgaW50IGksIGs7CgogIGlmICh1bmxpa2VseShuID09IDApKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChqID49IDApIHsKICAgIGogJT0gbjsKICB9IGVsc2UgewogICAgaiA9IC1qICUgbjsKICAgIGlmIChqICE9IDApIHsKICAgICAgaiA9IG4gLSBqOwogICAgfQogIH0KICBpZiAobiA8PSAwIHx8IGogPT0gMCB8fCBuID4gcHNTdGFja1NpemUgfHwgc3AgKyBuID4gcHNTdGFja1NpemUpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKGogPD0gbiAvIDIpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBqOyArK2kpIHsKICAgICAgb2JqID0gc3RhY2tbc3BdOwogICAgICBmb3IgKGsgPSBzcDsgayA8IHNwICsgbiAtIDE7ICsraykgewogICAgICAgIHN0YWNrW2tdID0gc3RhY2tbaysxXTsKICAgICAgfQogICAgICBzdGFja1tzcCArIG4gLSAxXSA9IG9iajsKICAgIH0KICB9IGVsc2UgewogICAgaiA9IG4gLSBqOwogICAgZm9yIChpID0gMDsgaSA8IGo7ICsraSkgewogICAgICBvYmogPSBzdGFja1tzcCArIG4gLSAxXTsKICAgICAgZm9yIChrID0gc3AgKyBuIC0gMTsgayA+IHNwOyAtLWspIHsKICAgICAgICBzdGFja1trXSA9IHN0YWNrW2stMV07CiAgICAgIH0KICAgICAgc3RhY2tbc3BdID0gb2JqOwogICAgfQogIH0KfQoKUG9zdFNjcmlwdEZ1bmN0aW9uOjpQb3N0U2NyaXB0RnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0KSB7CiAgU3RyZWFtICpzdHI7CiAgaW50IGNvZGVQdHI7CiAgR29vU3RyaW5nICp0b2s7CiAgZG91YmxlIGluW2Z1bmNNYXhJbnB1dHNdOwogIGludCBpOwoKICBjb2RlID0gbnVsbHB0cjsKICBjb2RlU3RyaW5nID0gbnVsbHB0cjsKICBjb2RlU2l6ZSA9IDA7CiAgb2sgPSBmYWxzZTsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmICghaGFzUmFuZ2UpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgNCBmdW5jdGlvbiBpcyBtaXNzaW5nIHJhbmdlIik7CiAgICBnb3RvIGVycjE7CiAgfQoKICAvLy0tLS0tIGdldCB0aGUgc3RyZWFtCiAgaWYgKCFmdW5jT2JqLT5pc1N0cmVhbSgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIDQgZnVuY3Rpb24gaXNuJ3QgYSBzdHJlYW0iKTsKICAgIGdvdG8gZXJyMTsKICB9CiAgc3RyID0gZnVuY09iai0+Z2V0U3RyZWFtKCk7CgogIC8vLS0tLS0gcGFyc2UgdGhlIGZ1bmN0aW9uCiAgY29kZVN0cmluZyA9IG5ldyBHb29TdHJpbmcoKTsKICBzdHItPnJlc2V0KCk7CiAgaWYgKCEodG9rID0gZ2V0VG9rZW4oc3RyKSkgfHwgdG9rLT5jbXAoInsiKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRXhwZWN0ZWQgJ3t7JyBhdCBzdGFydCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICBpZiAodG9rKSB7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICB9CiAgICBnb3RvIGVycjE7CiAgfQogIGRlbGV0ZSB0b2s7CiAgY29kZVB0ciA9IDA7CiAgaWYgKCFwYXJzZUNvZGUoc3RyLCAmY29kZVB0cikpIHsKICAgIGdvdG8gZXJyMjsKICB9CiAgc3RyLT5jbG9zZSgpOwoKICAvLy0tLS0tIHNldCB1cCB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpbltpXSA9IGRvbWFpbltpXVswXTsKICAgIGNhY2hlSW5baV0gPSBpbltpXSAtIDE7CiAgfQogIHRyYW5zZm9ybShpbiwgY2FjaGVPdXQpOwoKICBvayA9IHRydWU7CiAgCiBlcnIyOgogIHN0ci0+Y2xvc2UoKTsKIGVycjE6CiAgcmV0dXJuOwp9CgpQb3N0U2NyaXB0RnVuY3Rpb246OlBvc3RTY3JpcHRGdW5jdGlvbihjb25zdCBQb3N0U2NyaXB0RnVuY3Rpb24gKmZ1bmMpIDogRnVuY3Rpb24oZnVuYykgewogIGNvZGVTaXplID0gZnVuYy0+Y29kZVNpemU7CgogIGNvZGUgPSAoUFNPYmplY3QgKilnbWFsbG9jbihjb2RlU2l6ZSwgc2l6ZW9mKFBTT2JqZWN0KSk7CiAgbWVtY3B5KGNvZGUsIGZ1bmMtPmNvZGUsIGNvZGVTaXplICogc2l6ZW9mKFBTT2JqZWN0KSk7CgogIGNvZGVTdHJpbmcgPSBmdW5jLT5jb2RlU3RyaW5nLT5jb3B5KCk7CgogIG1lbWNweShjYWNoZUluLCBmdW5jLT5jYWNoZUluLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShjYWNoZU91dCwgZnVuYy0+Y2FjaGVPdXQsIGZ1bmNNYXhPdXRwdXRzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBvayA9IGZ1bmMtPm9rOwp9CgpQb3N0U2NyaXB0RnVuY3Rpb246On5Qb3N0U2NyaXB0RnVuY3Rpb24oKSB7CiAgZ2ZyZWUoY29kZSk7CiAgZGVsZXRlIGNvZGVTdHJpbmc7Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjp0cmFuc2Zvcm0oY29uc3QgZG91YmxlICppbiwgZG91YmxlICpvdXQpIGNvbnN0IHsKICBQU1N0YWNrIHN0YWNrOwogIGludCBpOwoKICAvLyBjaGVjayB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpZiAoaW5baV0gIT0gY2FjaGVJbltpXSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGkgPT0gbSkgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvdXRbaV0gPSBjYWNoZU91dFtpXTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIC8vfiBtYXkgbmVlZCB0byBjaGVjayBmb3IgaW50ZWdlcnMgaGVyZQogICAgc3RhY2sucHVzaFJlYWwoaW5baV0pOwogIH0KICBleGVjKCZzdGFjaywgMCk7CiAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICBvdXRbaV0gPSBzdGFjay5wb3BOdW0oKTsKICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVswXTsKICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQogIHN0YWNrLmNsZWFyKCk7CgogIC8vIGlmICghc3RhY2stPmVtcHR5KCkpIHsKICAvLyAgIGVycm9yKGVyclN5bnRheFdhcm5pbmcsIC0xLAogIC8vICAgICAgICAgIkV4dHJhIHZhbHVlcyBvbiBzdGFjayBhdCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogIC8vIH0KCiAgLy8gc2F2ZSBjdXJyZW50IHJlc3VsdCBpbiB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBjYWNoZUluW2ldID0gaW5baV07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIGNhY2hlT3V0W2ldID0gb3V0W2ldOwogIH0KfQoKYm9vbCBQb3N0U2NyaXB0RnVuY3Rpb246OnBhcnNlQ29kZShTdHJlYW0gKnN0ciwgaW50ICpjb2RlUHRyKSB7CiAgR29vU3RyaW5nICp0b2s7CiAgYm9vbCBpc1JlYWw7CiAgaW50IG9wUHRyLCBlbHNlUHRyOwogIGludCBhLCBiLCBtaWQsIGNtcDsKCiAgd2hpbGUgKDEpIHsKICAgIGlmICghKHRvayA9IGdldFRva2VuKHN0cikpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuZXhwZWN0ZWQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24gc3RyZWFtIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IGNoYXIgKnAgPSB0b2stPmNfc3RyKCk7CiAgICBpZiAoaXNkaWdpdCgqcCkgfHwgKnAgPT0gJy4nIHx8ICpwID09ICctJykgewogICAgICBpc1JlYWwgPSBmYWxzZTsKICAgICAgZm9yICg7ICpwOyArK3ApIHsKCWlmICgqcCA9PSAnLicpIHsKCSAgaXNSZWFsID0gdHJ1ZTsKCSAgYnJlYWs7Cgl9CiAgICAgIH0KICAgICAgcmVzaXplQ29kZSgqY29kZVB0cik7CiAgICAgIGlmIChpc1JlYWwpIHsKCWNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc1JlYWw7CiAgICAgICAgICBjb2RlWypjb2RlUHRyXS5yZWFsID0gZ2F0b2YodG9rLT5jX3N0cigpKTsKICAgICAgfSBlbHNlIHsKCWNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc0ludDsKCWNvZGVbKmNvZGVQdHJdLmludGcgPSBhdG9pKHRvay0+Y19zdHIoKSk7CiAgICAgIH0KICAgICAgKysqY29kZVB0cjsKICAgICAgZGVsZXRlIHRvazsKICAgIH0gZWxzZSBpZiAoIXRvay0+Y21wKCJ7IikpIHsKICAgICAgZGVsZXRlIHRvazsKICAgICAgb3BQdHIgPSAqY29kZVB0cjsKICAgICAgKmNvZGVQdHIgKz0gMzsKICAgICAgcmVzaXplQ29kZShvcFB0ciArIDIpOwogICAgICBpZiAoIXBhcnNlQ29kZShzdHIsIGNvZGVQdHIpKSB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCEodG9rID0gZ2V0VG9rZW4oc3RyKSkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuZXhwZWN0ZWQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24gc3RyZWFtIik7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCF0b2stPmNtcCgieyIpKSB7CgllbHNlUHRyID0gKmNvZGVQdHI7CglpZiAoIXBhcnNlQ29kZShzdHIsIGNvZGVQdHIpKSB7CgkgIGRlbGV0ZSB0b2s7CgkgIHJldHVybiBmYWxzZTsKCX0KCWRlbGV0ZSB0b2s7CglpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSkgewoJICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJVbmV4cGVjdGVkIGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0cmVhbSIpOwoJICByZXR1cm4gZmFsc2U7Cgl9CiAgICAgIH0gZWxzZSB7CgllbHNlUHRyID0gLTE7CiAgICAgIH0KICAgICAgaWYgKCF0b2stPmNtcCgiaWYiKSkgewoJaWYgKGVsc2VQdHIgPj0gMCkgewoJICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkJIkdvdCAnaWYnIG9wZXJhdG9yIHdpdGggdHdvIGJsb2NrcyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CgkgIHJldHVybiBmYWxzZTsKCX0KCWNvZGVbb3BQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwoJY29kZVtvcFB0cl0ub3AgPSBwc09wSWY7Cgljb2RlW29wUHRyKzJdLnR5cGUgPSBwc0Jsb2NrOwoJY29kZVtvcFB0cisyXS5ibGsgPSAqY29kZVB0cjsKICAgICAgfSBlbHNlIGlmICghdG9rLT5jbXAoImlmZWxzZSIpKSB7CglpZiAoZWxzZVB0ciA8IDApIHsKCSAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJCSJHb3QgJ2lmZWxzZScgb3BlcmF0b3Igd2l0aCBvbmUgYmxvY2sgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwoJICByZXR1cm4gZmFsc2U7Cgl9Cgljb2RlW29wUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKCWNvZGVbb3BQdHJdLm9wID0gcHNPcElmZWxzZTsKCWNvZGVbb3BQdHIrMV0udHlwZSA9IHBzQmxvY2s7Cgljb2RlW29wUHRyKzFdLmJsayA9IGVsc2VQdHI7Cgljb2RlW29wUHRyKzJdLnR5cGUgPSBwc0Jsb2NrOwoJY29kZVtvcFB0cisyXS5ibGsgPSAqY29kZVB0cjsKICAgICAgfSBlbHNlIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCSAgICAgICJFeHBlY3RlZCBpZi9pZmVsc2Ugb3BlcmF0b3IgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwoJZGVsZXRlIHRvazsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBkZWxldGUgdG9rOwogICAgfSBlbHNlIGlmICghdG9rLT5jbXAoIn0iKSkgewogICAgICBkZWxldGUgdG9rOwogICAgICByZXNpemVDb2RlKCpjb2RlUHRyKTsKICAgICAgY29kZVsqY29kZVB0cl0udHlwZSA9IHBzT3BlcmF0b3I7CiAgICAgIGNvZGVbKmNvZGVQdHJdLm9wID0gcHNPcFJldHVybjsKICAgICAgKysqY29kZVB0cjsKICAgICAgYnJlYWs7CiAgICB9IGVsc2UgewogICAgICBhID0gLTE7CiAgICAgIGIgPSBuUFNPcHM7CiAgICAgIGNtcCA9IDA7IC8vIG1ha2UgZ2NjIGhhcHB5CiAgICAgIC8vIGludmFyaWFudDogcHNPcE5hbWVzW2FdIDwgdG9rIDwgcHNPcE5hbWVzW2JdCiAgICAgIHdoaWxlIChiIC0gYSA+IDEpIHsKCW1pZCA9IChhICsgYikgLyAyOwoJY21wID0gdG9rLT5jbXAocHNPcE5hbWVzW21pZF0pOwoJaWYgKGNtcCA+IDApIHsKCSAgYSA9IG1pZDsKCX0gZWxzZSBpZiAoY21wIDwgMCkgewoJICBiID0gbWlkOwoJfSBlbHNlIHsKCSAgYSA9IGIgPSBtaWQ7Cgl9CiAgICAgIH0KICAgICAgaWYgKGNtcCAhPSAwKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkgICAgICAiVW5rbm93biBvcGVyYXRvciAnezA6dH0nIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iLAoJICAgICAgdG9rKTsKCWRlbGV0ZSB0b2s7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZGVsZXRlIHRvazsKICAgICAgcmVzaXplQ29kZSgqY29kZVB0cik7CiAgICAgIGNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwogICAgICBjb2RlWypjb2RlUHRyXS5vcCA9IChQU09wKWE7CiAgICAgICsrKmNvZGVQdHI7CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CgpHb29TdHJpbmcgKlBvc3RTY3JpcHRGdW5jdGlvbjo6Z2V0VG9rZW4oU3RyZWFtICpzdHIpIHsKICBHb29TdHJpbmcgKnM7CiAgaW50IGM7CiAgYm9vbCBjb21tZW50OwoKICBzID0gbmV3IEdvb1N0cmluZygpOwogIGNvbW1lbnQgPSBmYWxzZTsKICB3aGlsZSAoMSkgewogICAgaWYgKChjID0gc3RyLT5nZXRDaGFyKCkpID09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGNvZGVTdHJpbmctPmFwcGVuZChjKTsKICAgIGlmIChjb21tZW50KSB7CiAgICAgIGlmIChjID09ICdceDBhJyB8fCBjID09ICdceDBkJykgewoJY29tbWVudCA9IGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGMgPT0gJyUnKSB7CiAgICAgIGNvbW1lbnQgPSB0cnVlOwogICAgfSBlbHNlIGlmICghaXNzcGFjZShjKSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGMgPT0gJ3snIHx8IGMgPT0gJ30nKSB7CiAgICBzLT5hcHBlbmQoKGNoYXIpYyk7CiAgfSBlbHNlIGlmIChpc2RpZ2l0KGMpIHx8IGMgPT0gJy4nIHx8IGMgPT0gJy0nKSB7CiAgICB3aGlsZSAoMSkgewogICAgICBzLT5hcHBlbmQoKGNoYXIpYyk7CiAgICAgIGMgPSBzdHItPmxvb2tDaGFyKCk7CiAgICAgIGlmIChjID09IEVPRiB8fCAhKGlzZGlnaXQoYykgfHwgYyA9PSAnLicgfHwgYyA9PSAnLScpKSB7CglicmVhazsKICAgICAgfQogICAgICBzdHItPmdldENoYXIoKTsKICAgICAgY29kZVN0cmluZy0+YXBwZW5kKGMpOwogICAgfQogIH0gZWxzZSB7CiAgICB3aGlsZSAoMSkgewogICAgICBzLT5hcHBlbmQoKGNoYXIpYyk7CiAgICAgIGMgPSBzdHItPmxvb2tDaGFyKCk7CiAgICAgIGlmIChjID09IEVPRiB8fCAhaXNhbG51bShjKSkgewoJYnJlYWs7CiAgICAgIH0KICAgICAgc3RyLT5nZXRDaGFyKCk7CiAgICAgIGNvZGVTdHJpbmctPmFwcGVuZChjKTsKICAgIH0KICB9CiAgcmV0dXJuIHM7Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjpyZXNpemVDb2RlKGludCBuZXdTaXplKSB7CiAgaWYgKG5ld1NpemUgPj0gY29kZVNpemUpIHsKICAgIGNvZGVTaXplICs9IDY0OwogICAgY29kZSA9IChQU09iamVjdCAqKWdyZWFsbG9jbihjb2RlLCBjb2RlU2l6ZSwgc2l6ZW9mKFBTT2JqZWN0KSk7CiAgfQp9Cgp2b2lkIFBvc3RTY3JpcHRGdW5jdGlvbjo6ZXhlYyhQU1N0YWNrICpzdGFjaywgaW50IGNvZGVQdHIpIGNvbnN0IHsKICBpbnQgaTEsIGkyOwogIGRvdWJsZSByMSwgcjIsIHJlc3VsdDsKICBib29sIGIxLCBiMjsKCiAgd2hpbGUgKDEpIHsKICAgIHN3aXRjaCAoY29kZVtjb2RlUHRyXS50eXBlKSB7CiAgICBjYXNlIHBzSW50OgogICAgICBzdGFjay0+cHVzaEludChjb2RlW2NvZGVQdHIrK10uaW50Zyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBwc1JlYWw6CiAgICAgIHN0YWNrLT5wdXNoUmVhbChjb2RlW2NvZGVQdHIrK10ucmVhbCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBwc09wZXJhdG9yOgogICAgICBzd2l0Y2ggKGNvZGVbY29kZVB0cisrXS5vcCkgewogICAgICBjYXNlIHBzT3BBYnM6CglpZiAoc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQoYWJzKHN0YWNrLT5wb3BJbnQoKSkpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hSZWFsKGZhYnMoc3RhY2stPnBvcE51bSgpKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQWRkOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSArIGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKHIxICsgcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEFuZDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgJiBpMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxICYmIGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BBdGFuOgoJcjIgPSBzdGFjay0+cG9wTnVtKCk7CglyMSA9IHN0YWNrLT5wb3BOdW0oKTsKCXJlc3VsdCA9IGF0YW4yKHIxLCByMikgKiAxODAuMCAvIE1fUEk7CglpZiAocmVzdWx0IDwgMCkgcmVzdWx0ICs9IDM2MC4wOwoJc3RhY2stPnB1c2hSZWFsKHJlc3VsdCk7CglicmVhazsKICAgICAgY2FzZSBwc09wQml0c2hpZnQ6CglpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCWkxID0gc3RhY2stPnBvcEludCgpOwoJaWYgKGkyID4gMCkgewoJICBzdGFjay0+cHVzaEludChpMSA8PCBpMik7Cgl9IGVsc2UgaWYgKGkyIDwgMCkgewoJICBzdGFjay0+cHVzaEludCgoaW50KSgodW5zaWduZWQgaW50KWkxID4+IC1pMikpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hJbnQoaTEpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcENlaWxpbmc6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoUmVhbChjZWlsKHN0YWNrLT5wb3BOdW0oKSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcENvcHk6CglzdGFjay0+Y29weShzdGFjay0+cG9wSW50KCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcENvczoKCXN0YWNrLT5wdXNoUmVhbChjb3Moc3RhY2stPnBvcE51bSgpICogTV9QSSAvIDE4MC4wKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wQ3ZpOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaEludCgoaW50KXN0YWNrLT5wb3BOdW0oKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQ3ZyOgoJaWYgKCFzdGFjay0+dG9wSXNSZWFsKCkpIHsKCSAgc3RhY2stPnB1c2hSZWFsKHN0YWNrLT5wb3BOdW0oKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wRGl2OgoJcjIgPSBzdGFjay0+cG9wTnVtKCk7CglyMSA9IHN0YWNrLT5wb3BOdW0oKTsKCXN0YWNrLT5wdXNoUmVhbChyMSAvIHIyKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BEdXA6CglzdGFjay0+Y29weSgxKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BFcToKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxID09IGkyKTsKCX0gZWxzZSBpZiAoc3RhY2stPnRvcFR3b0FyZU51bXMoKSkgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA9PSByMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxID09IGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BFeGNoOgoJc3RhY2stPnJvbGwoMiwgMSk7CglicmVhazsKICAgICAgY2FzZSBwc09wRXhwOgoJcjIgPSBzdGFjay0+cG9wTnVtKCk7CglyMSA9IHN0YWNrLT5wb3BOdW0oKTsKCXN0YWNrLT5wdXNoUmVhbChwb3cocjEsIHIyKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wRmFsc2U6CglzdGFjay0+cHVzaEJvb2woZmFsc2UpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEZsb29yOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaFJlYWwoZmxvb3Ioc3RhY2stPnBvcE51bSgpKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wR2U6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA+PSBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA+PSByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wR3Q6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA+IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxID4gcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcElkaXY6CglpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCWkxID0gc3RhY2stPnBvcEludCgpOwoJaWYgKGxpa2VseShpMiAhPSAwKSkgewoJICBzdGFjay0+cHVzaEludChpMSAvIGkyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BJbmRleDoKCXN0YWNrLT5pbmRleChzdGFjay0+cG9wSW50KCkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcExlOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPD0gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPD0gcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcExuOgoJc3RhY2stPnB1c2hSZWFsKGxvZyhzdGFjay0+cG9wTnVtKCkpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BMb2c6CglzdGFjay0+cHVzaFJlYWwobG9nMTAoc3RhY2stPnBvcE51bSgpKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wTHQ6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA8IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxIDwgcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE1vZDoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglpZiAobGlrZWx5KGkyICE9IDApKSB7CgkgIHN0YWNrLT5wdXNoSW50KGkxICUgaTIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE11bDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgLy9+IHNob3VsZCBjaGVjayBmb3Igb3V0LW9mLXJhbmdlLCBhbmQgcHVzaCBhIHJlYWwgaW5zdGVhZAoJICBzdGFjay0+cHVzaEludChpMSAqIGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKHIxICogcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE5lOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgIT0gaTIpOwoJfSBlbHNlIGlmIChzdGFjay0+dG9wVHdvQXJlTnVtcygpKSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxICE9IHIyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgIT0gYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE5lZzoKCWlmIChzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaEludCgtc3RhY2stPnBvcEludCgpKTsKCX0gZWxzZSB7CgkgIHN0YWNrLT5wdXNoUmVhbCgtc3RhY2stPnBvcE51bSgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BOb3Q6CglpZiAoc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQofnN0YWNrLT5wb3BJbnQoKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaEJvb2woIXN0YWNrLT5wb3BCb29sKCkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE9yOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSB8IGkyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgfHwgYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFBvcDoKCXN0YWNrLT5wb3AoKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BSb2xsOgoJaTIgPSBzdGFjay0+cG9wSW50KCk7CglpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCXN0YWNrLT5yb2xsKGkxLCBpMik7CglicmVhazsKICAgICAgY2FzZSBwc09wUm91bmQ6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwoKHIxID49IDApID8gZmxvb3IocjEgKyAwLjUpIDogY2VpbChyMSAtIDAuNSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFNpbjoKCXN0YWNrLT5wdXNoUmVhbChzaW4oc3RhY2stPnBvcE51bSgpICogTV9QSSAvIDE4MC4wKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wU3FydDoKCXN0YWNrLT5wdXNoUmVhbChzcXJ0KHN0YWNrLT5wb3BOdW0oKSkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFN1YjoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgLSBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbChyMSAtIHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BUcnVlOgoJc3RhY2stPnB1c2hCb29sKHRydWUpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFRydW5jYXRlOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKChyMSA+PSAwKSA/IGZsb29yKHIxKSA6IGNlaWwocjEpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BYb3I6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxIF4gaTIpOwoJfSBlbHNlIHsKCSAgYjIgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBiMSA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChiMSBeIGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BJZjoKCWIxID0gc3RhY2stPnBvcEJvb2woKTsKCWlmIChiMSkgewoJICBleGVjKHN0YWNrLCBjb2RlUHRyICsgMik7Cgl9Cgljb2RlUHRyID0gY29kZVtjb2RlUHRyICsgMV0uYmxrOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcElmZWxzZToKCWIxID0gc3RhY2stPnBvcEJvb2woKTsKCWlmIChiMSkgewoJICBleGVjKHN0YWNrLCBjb2RlUHRyICsgMik7Cgl9IGVsc2UgewoJICBleGVjKHN0YWNrLCBjb2RlW2NvZGVQdHJdLmJsayk7Cgl9Cgljb2RlUHRyID0gY29kZVtjb2RlUHRyICsgMV0uYmxrOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFJldHVybjoKCXJldHVybjsKICAgICAgfQogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkludGVybmFsOiBiYWQgb2JqZWN0IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24gY29kZSIpOwogICAgICBicmVhazsKICAgIH0KICB9Cn0K