Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoQml0bWFwLmNjCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA5LCAyMDEwLCAyMDEyIEFsYmVydCBBc3RhbHMgQ2lkIDxhYWNpZEBrZGUub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcgSWxtYXJpIEhlaWtraW5lbiA8aWxtYXJpLmhlaWtraW5lbkBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAwOSBTaGVuIExpYW5nIDxzaGVuemh1eGlAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDkgU3RlZmFuIFRob21hcyA8dGhvbWFzQGVsb2FkMjQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgSGFycnkgUm9iZXJ0cyA8aGFycnkucm9iZXJ0c0BtaWRuaWdodC1sYWJzLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIFdpbGxpYW0gQmFkZXIgPHdpbGxpYW1iYWRlckBob3RtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgQW50aG9ueSBXZXNsZXkgPGF3ZXNsZXlAc21hcnRuZXR3b3Jrcy5jb20uYXU+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlIDxjb25maWcuaD4KCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbXBsZW1lbnRhdGlvbgojZW5kaWYKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSAiZ29vL2dtZW0uaCIKI2luY2x1ZGUgIlNwbGFzaEVycm9yQ29kZXMuaCIKI2luY2x1ZGUgIlNwbGFzaEJpdG1hcC5oIgojaW5jbHVkZSAicG9wcGxlci9FcnJvci5oIgojaW5jbHVkZSAiZ29vL0pwZWdXcml0ZXIuaCIKI2luY2x1ZGUgImdvby9QTkdXcml0ZXIuaCIKI2luY2x1ZGUgImdvby9UaWZmV3JpdGVyLmgiCiNpbmNsdWRlICJnb28vSW1nV3JpdGVyLmgiCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTcGxhc2hCaXRtYXAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClNwbGFzaEJpdG1hcDo6U3BsYXNoQml0bWFwKGludCB3aWR0aEEsIGludCBoZWlnaHRBLCBpbnQgcm93UGFkQSwKCQkJICAgU3BsYXNoQ29sb3JNb2RlIG1vZGVBLCBHQm9vbCBhbHBoYUEsCgkJCSAgIEdCb29sIHRvcERvd24pIHsKICB3aWR0aCA9IHdpZHRoQTsKICBoZWlnaHQgPSBoZWlnaHRBOwogIG1vZGUgPSBtb2RlQTsKICByb3dQYWQgPSByb3dQYWRBOwogIHN3aXRjaCAobW9kZSkgewogIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgaWYgKHdpZHRoID4gMCkgewogICAgICByb3dTaXplID0gKHdpZHRoICsgNykgPj4gMzsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgaWYgKHdpZHRoID4gMCkgewogICAgICByb3dTaXplID0gd2lkdGg7CiAgICB9IGVsc2UgewogICAgICByb3dTaXplID0gLTE7CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBpZiAod2lkdGggPiAwICYmIHdpZHRoIDw9IElOVF9NQVggLyAzKSB7CiAgICAgIHJvd1NpemUgPSB3aWR0aCAqIDM7CiAgICB9IGVsc2UgewogICAgICByb3dTaXplID0gLTE7CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPD0gSU5UX01BWCAvIDQpIHsKICAgICAgcm93U2l6ZSA9IHdpZHRoICogNDsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPD0gSU5UX01BWCAvIDQpIHsKICAgICAgcm93U2l6ZSA9IHdpZHRoICogNDsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwojZW5kaWYKICB9CiAgaWYgKHJvd1NpemUgPiAwKSB7CiAgICByb3dTaXplICs9IHJvd1BhZCAtIDE7CiAgICByb3dTaXplIC09IHJvd1NpemUgJSByb3dQYWQ7CiAgfQogIGRhdGEgPSAoU3BsYXNoQ29sb3JQdHIpZ21hbGxvY25fY2hlY2tvdmVyZmxvdyhyb3dTaXplLCBoZWlnaHQpOwogIGlmIChkYXRhICE9IE5VTEwpIHsKICAgIGlmICghdG9wRG93bikgewogICAgICBkYXRhICs9IChoZWlnaHQgLSAxKSAqIHJvd1NpemU7CiAgICAgIHJvd1NpemUgPSAtcm93U2l6ZTsKICAgIH0KICAgIGlmIChhbHBoYUEpIHsKICAgICAgYWxwaGEgPSAoR3VjaGFyICopZ21hbGxvY24od2lkdGgsIGhlaWdodCk7CiAgICB9IGVsc2UgewogICAgICBhbHBoYSA9IE5VTEw7CiAgICB9CiAgfSBlbHNlIHsKICAgIGFscGhhID0gTlVMTDsKICB9Cn0KClNwbGFzaEJpdG1hcCAqU3BsYXNoQml0bWFwOjpjb3B5KFNwbGFzaEJpdG1hcCAqc3JjKSB7CiAgU3BsYXNoQml0bWFwICpyZXN1bHQgPSBuZXcgU3BsYXNoQml0bWFwKHNyYy0+Z2V0V2lkdGgoKSwgc3JjLT5nZXRIZWlnaHQoKSwgc3JjLT5nZXRSb3dQYWQoKSwgCiAgICAgICAgc3JjLT5nZXRNb2RlKCksIHNyYy0+Z2V0QWxwaGFQdHIoKSAhPSBOVUxMLCBzcmMtPmdldFJvd1NpemUoKSA+PSAwKTsKICBHdWNoYXIgKmRhdGFTb3VyY2UgPSBzcmMtPmdldERhdGFQdHIoKTsKICBHdWNoYXIgKmRhdGFEZXN0ID0gcmVzdWx0LT5nZXREYXRhUHRyKCk7CiAgaW50IGFtb3VudCA9IHNyYy0+Z2V0Um93U2l6ZSgpOwogIGlmIChhbW91bnQgPCAwKSB7CiAgICBkYXRhU291cmNlID0gZGF0YVNvdXJjZSArIChzcmMtPmdldEhlaWdodCgpIC0gMSkgKiBhbW91bnQ7CiAgICBkYXRhRGVzdCA9IGRhdGFEZXN0ICsgKHNyYy0+Z2V0SGVpZ2h0KCkgLSAxKSAqIGFtb3VudDsKICAgIGFtb3VudCAqPSAtc3JjLT5nZXRIZWlnaHQoKTsKICB9IGVsc2UgewogICAgYW1vdW50ICo9IHNyYy0+Z2V0SGVpZ2h0KCk7CiAgfQogIG1lbWNweShkYXRhRGVzdCwgZGF0YVNvdXJjZSwgYW1vdW50KTsKICBpZiAoc3JjLT5nZXRBbHBoYVB0cigpICE9IE5VTEwpIHsKICAgIG1lbWNweShyZXN1bHQtPmdldEFscGhhUHRyKCksIHNyYy0+Z2V0QWxwaGFQdHIoKSwgc3JjLT5nZXRXaWR0aCgpICogc3JjLT5nZXRIZWlnaHQoKSk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KClNwbGFzaEJpdG1hcDo6flNwbGFzaEJpdG1hcCgpIHsKICBpZiAoZGF0YSkgewogICAgaWYgKHJvd1NpemUgPCAwKSB7CiAgICAgIGdmcmVlKGRhdGEgKyAoaGVpZ2h0IC0gMSkgKiByb3dTaXplKTsKICAgIH0gZWxzZSB7CiAgICAgIGdmcmVlKGRhdGEpOwogICAgfQogIH0KICBnZnJlZShhbHBoYSk7Cn0KCgpTcGxhc2hFcnJvciBTcGxhc2hCaXRtYXA6OndyaXRlUE5NRmlsZShjaGFyICpmaWxlTmFtZSkgewogIEZJTEUgKmY7CiAgU3BsYXNoRXJyb3IgZTsKCiAgaWYgKCEoZiA9IGZvcGVuKGZpbGVOYW1lLCAid2IiKSkpIHsKICAgIHJldHVybiBzcGxhc2hFcnJPcGVuRmlsZTsKICB9CgogIGUgPSB0aGlzLT53cml0ZVBOTUZpbGUoZik7CiAgCiAgZmNsb3NlKGYpOwogIHJldHVybiBlOwp9CgoKU3BsYXNoRXJyb3IgU3BsYXNoQml0bWFwOjp3cml0ZVBOTUZpbGUoRklMRSAqZikgewogIFNwbGFzaENvbG9yUHRyIHJvdywgcDsKICBpbnQgeCwgeTsKCiAgc3dpdGNoIChtb2RlKSB7CgogIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgZnByaW50ZihmLCAiUDRcbiVkICVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsKICAgIHJvdyA9IGRhdGE7CiAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgcCA9IHJvdzsKICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDgpIHsKCWZwdXRjKCpwIF4gMHhmZiwgZik7CgkrK3A7CiAgICAgIH0KICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBmcHJpbnRmKGYsICJQNVxuJWQgJWRcbjI1NVxuIiwgd2lkdGgsIGhlaWdodCk7CiAgICByb3cgPSBkYXRhOwogICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgIGZ3cml0ZShyb3csIDEsIHdpZHRoLCBmKTsKICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgIGZwcmludGYoZiwgIlA2XG4lZCAlZFxuMjU1XG4iLCB3aWR0aCwgaGVpZ2h0KTsKICAgIHJvdyA9IGRhdGE7CiAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgZndyaXRlKHJvdywgMSwgMyAqIHdpZHRoLCBmKTsKICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBzcGxhc2hNb2RlWEJHUjg6CiAgICBmcHJpbnRmKGYsICJQNlxuJWQgJWRcbjI1NVxuIiwgd2lkdGgsIGhlaWdodCk7CiAgICByb3cgPSBkYXRhOwogICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgIHAgPSByb3c7CiAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CglmcHV0YyhzcGxhc2hCR1I4UihwKSwgZik7CglmcHV0YyhzcGxhc2hCR1I4RyhwKSwgZik7CglmcHV0YyhzcGxhc2hCR1I4QihwKSwgZik7CglwICs9IDQ7CiAgICAgIH0KICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCgogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBmcHJpbnRmKGYsICJQNlxuJWQgJWRcbjI1NVxuIiwgd2lkdGgsIGhlaWdodCk7CiAgICByb3cgPSBkYXRhOwogICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgIHAgPSByb3c7CiAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CglmcHV0YyhzcGxhc2hCR1I4UihwKSwgZik7CglmcHV0YyhzcGxhc2hCR1I4RyhwKSwgZik7CglmcHV0YyhzcGxhc2hCR1I4QihwKSwgZik7CglwICs9IDM7CiAgICAgIH0KICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCiNpZiBTUExBU0hfQ01ZSwogIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgLy8gUE5NIGRvZXNuJ3Qgc3VwcG9ydCBDTVlLCiAgICBlcnJvcihlcnJJbnRlcm5hbCwgLTEsICJ1bnN1cHBvcnRlZCBTcGxhc2hCaXRtYXAgbW9kZSIpOwogICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICBicmVhazsKI2VuZGlmCiAgfQogIHJldHVybiBzcGxhc2hPazsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoQml0bWFwOjp3cml0ZUFscGhhUEdNRmlsZShjaGFyICpmaWxlTmFtZSkgewogIEZJTEUgKmY7CgogIGlmICghYWxwaGEpIHsKICAgIHJldHVybiBzcGxhc2hFcnJNb2RlTWlzbWF0Y2g7CiAgfQogIGlmICghKGYgPSBmb3BlbihmaWxlTmFtZSwgIndiIikpKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyT3BlbkZpbGU7CiAgfQogIGZwcmludGYoZiwgIlA1XG4lZCAlZFxuMjU1XG4iLCB3aWR0aCwgaGVpZ2h0KTsKICBmd3JpdGUoYWxwaGEsIDEsIHdpZHRoICogaGVpZ2h0LCBmKTsKICBmY2xvc2UoZik7CiAgcmV0dXJuIHNwbGFzaE9rOwp9Cgp2b2lkIFNwbGFzaEJpdG1hcDo6Z2V0UGl4ZWwoaW50IHgsIGludCB5LCBTcGxhc2hDb2xvclB0ciBwaXhlbCkgewogIFNwbGFzaENvbG9yUHRyIHA7CgogIGlmICh5IDwgMCB8fCB5ID49IGhlaWdodCB8fCB4IDwgMCB8fCB4ID49IHdpZHRoKSB7CiAgICByZXR1cm47CiAgfQogIHN3aXRjaCAobW9kZSkgewogIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgcCA9ICZkYXRhW3kgKiByb3dTaXplICsgKHggPj4gMyldOwogICAgcGl4ZWxbMF0gPSAocFswXSAmICgweDgwID4+ICh4ICYgNykpKSA/IDB4ZmYgOiAweDAwOwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyB4XTsKICAgIHBpeGVsWzBdID0gcFswXTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyAzICogeF07CiAgICBwaXhlbFswXSA9IHBbMF07CiAgICBwaXhlbFsxXSA9IHBbMV07CiAgICBwaXhlbFsyXSA9IHBbMl07CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIDQgKiB4XTsKICAgIHBpeGVsWzBdID0gcFsyXTsKICAgIHBpeGVsWzFdID0gcFsxXTsKICAgIHBpeGVsWzJdID0gcFswXTsKICAgIHBpeGVsWzNdID0gcFszXTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyAzICogeF07CiAgICBwaXhlbFswXSA9IHBbMl07CiAgICBwaXhlbFsxXSA9IHBbMV07CiAgICBwaXhlbFsyXSA9IHBbMF07CiAgICBicmVhazsKI2lmIFNQTEFTSF9DTVlLCiAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyA0ICogeF07CiAgICBwaXhlbFswXSA9IHBbMF07CiAgICBwaXhlbFsxXSA9IHBbMV07CiAgICBwaXhlbFsyXSA9IHBbMl07CiAgICBwaXhlbFszXSA9IHBbM107CiAgICBicmVhazsKI2VuZGlmCiAgfQp9CgpHdWNoYXIgU3BsYXNoQml0bWFwOjpnZXRBbHBoYShpbnQgeCwgaW50IHkpIHsKICByZXR1cm4gYWxwaGFbeSAqIHdpZHRoICsgeF07Cn0KClNwbGFzaENvbG9yUHRyIFNwbGFzaEJpdG1hcDo6dGFrZURhdGEoKSB7CiAgU3BsYXNoQ29sb3JQdHIgZGF0YTI7CgogIGRhdGEyID0gZGF0YTsKICBkYXRhID0gTlVMTDsKICByZXR1cm4gZGF0YTI7Cn0KClNwbGFzaEVycm9yIFNwbGFzaEJpdG1hcDo6d3JpdGVJbWdGaWxlKFNwbGFzaEltYWdlRmlsZUZvcm1hdCBmb3JtYXQsIGNoYXIgKmZpbGVOYW1lLCBpbnQgaERQSSwgaW50IHZEUEksIGNvbnN0IGNoYXIgKmNvbXByZXNzaW9uU3RyaW5nKSB7CiAgRklMRSAqZjsKICBTcGxhc2hFcnJvciBlOwoKICBpZiAoIShmID0gZm9wZW4oZmlsZU5hbWUsICJ3YiIpKSkgewogICAgcmV0dXJuIHNwbGFzaEVyck9wZW5GaWxlOwogIH0KCiAgZSA9IHdyaXRlSW1nRmlsZShmb3JtYXQsIGYsIGhEUEksIHZEUEksIGNvbXByZXNzaW9uU3RyaW5nKTsKICAKICBmY2xvc2UoZik7CiAgcmV0dXJuIGU7Cn0KClNwbGFzaEVycm9yIFNwbGFzaEJpdG1hcDo6d3JpdGVJbWdGaWxlKFNwbGFzaEltYWdlRmlsZUZvcm1hdCBmb3JtYXQsIEZJTEUgKmYsIGludCBoRFBJLCBpbnQgdkRQSSwgY29uc3QgY2hhciAqY29tcHJlc3Npb25TdHJpbmcpIHsKICBJbWdXcml0ZXIgKndyaXRlcjsKCVNwbGFzaEVycm9yIGU7CiAgCiAgc3dpdGNoIChmb3JtYXQpIHsKICAgICNpZmRlZiBFTkFCTEVfTElCUE5HCiAgICBjYXNlIHNwbGFzaEZvcm1hdFBuZzoKCSAgd3JpdGVyID0gbmV3IFBOR1dyaXRlcigpOwogICAgICBicmVhazsKICAgICNlbmRpZgoKICAgICNpZmRlZiBFTkFCTEVfTElCSlBFRwogICAgI2lmZGVmIFNQTEFTSF9DTVlLCiAgICBjYXNlIHNwbGFzaEZvcm1hdEpwZWdDTVlLOgogICAgICB3cml0ZXIgPSBuZXcgSnBlZ1dyaXRlcihKQ1NfQ01ZSyk7CiAgICAgIGJyZWFrOwogICAgI2VuZGlmCiAgICBjYXNlIHNwbGFzaEZvcm1hdEpwZWc6CiAgICAgIHdyaXRlciA9IG5ldyBKcGVnV3JpdGVyKCk7CiAgICAgIGJyZWFrOwogICAgI2VuZGlmCgkKICAgICNpZmRlZiBFTkFCTEVfTElCVElGRgogICAgY2FzZSBzcGxhc2hGb3JtYXRUaWZmOgogICAgICB3cml0ZXIgPSBuZXcgVGlmZldyaXRlcigpOwogICAgICBpZiAod3JpdGVyKSB7CiAgICAgICAgKChUaWZmV3JpdGVyICopd3JpdGVyKS0+c2V0Q29tcHJlc3Npb25TdHJpbmcoY29tcHJlc3Npb25TdHJpbmcpOwogICAgICAgICgoVGlmZldyaXRlciAqKXdyaXRlciktPnNldFNwbGFzaE1vZGUobW9kZSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICAjZW5kaWYKCiAgICBkZWZhdWx0OgogICAgICAvLyBOb3QgdGhlIGdyZWF0ZXN0IGVycm9yIG1lc3NhZ2UsIGJ1dCB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uIHNob3VsZAogICAgICAvLyBoYXZlIGFscmVhZHkgY2hlY2tlZCB3aGV0aGVyIHRoZWlyIGRlc2lyZWQgZm9ybWF0IGlzIGNvbXBpbGVkIGluLgogICAgICBlcnJvcihlcnJJbnRlcm5hbCwgLTEsICJTdXBwb3J0IGZvciB0aGlzIGltYWdlIHR5cGUgbm90IGNvbXBpbGVkIGluIik7CiAgICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogIH0KCgllID0gd3JpdGVJbWdGaWxlKHdyaXRlciwgZiwgaERQSSwgdkRQSSk7CglkZWxldGUgd3JpdGVyOwoJcmV0dXJuIGU7Cn0KCiNpbmNsdWRlICJwb3BwbGVyL0dmeFN0YXRlX2hlbHBlcnMuaCIKCnZvaWQgU3BsYXNoQml0bWFwOjpnZXRSR0JMaW5lKGludCB5bCwgU3BsYXNoQ29sb3JQdHIgbGluZSkgewogIFNwbGFzaENvbG9yIGNvbDsKICBkb3VibGUgYywgbSwgeSwgaywgYzEsIG0xLCB5MSwgazEsIHIsIGcsIGI7CgogIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgZ2V0UGl4ZWwoeCwgeWwsIGNvbCk7CiAgICBjID0gYnl0ZVRvRGJsKGNvbFswXSk7CiAgICBtID0gYnl0ZVRvRGJsKGNvbFsxXSk7CiAgICB5ID0gYnl0ZVRvRGJsKGNvbFsyXSk7CiAgICBrID0gYnl0ZVRvRGJsKGNvbFszXSk7CiAgICBjMSA9IDEgLSBjOwogICAgbTEgPSAxIC0gbTsKICAgIHkxID0gMSAtIHk7CiAgICBrMSA9IDEgLSBrOwogICAgY215a1RvUkdCTWF0cml4TXVsdGlwbGljYXRpb24oYywgbSwgeSwgaywgYzEsIG0xLCB5MSwgazEsIHIsIGcsIGIpOwogICAgKmxpbmUrKyA9IGRibFRvQnl0ZShjbGlwMDEocikpOwogICAgKmxpbmUrKyA9IGRibFRvQnl0ZShjbGlwMDEoZykpOwogICAgKmxpbmUrKyA9IGRibFRvQnl0ZShjbGlwMDEoYikpOwogIH0KfQoKU3BsYXNoRXJyb3IgU3BsYXNoQml0bWFwOjp3cml0ZUltZ0ZpbGUoSW1nV3JpdGVyICp3cml0ZXIsIEZJTEUgKmYsIGludCBoRFBJLCBpbnQgdkRQSSkgewogIGlmIChtb2RlICE9IHNwbGFzaE1vZGVSR0I4ICYmIG1vZGUgIT0gc3BsYXNoTW9kZU1vbm84ICYmIG1vZGUgIT0gc3BsYXNoTW9kZU1vbm8xICYmIG1vZGUgIT0gc3BsYXNoTW9kZVhCR1I4CiNpZiBTUExBU0hfQ01ZSwogICAgICAmJiBtb2RlICE9IHNwbGFzaE1vZGVDTVlLOAojZW5kaWYKICAgICApIHsKICAgIGVycm9yKGVyckludGVybmFsLCAtMSwgInVuc3VwcG9ydGVkIFNwbGFzaEJpdG1hcCBtb2RlIik7CiAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICB9CgogIGlmICghd3JpdGVyLT5pbml0KGYsIHdpZHRoLCBoZWlnaHQsIGhEUEksIHZEUEkpKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICB9CgogIHN3aXRjaCAobW9kZSkgewojaWYgU1BMQVNIX0NNWUsKICAgIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgICBpZiAod3JpdGVyLT5zdXBwb3J0Q01ZSygpKSB7CiAgICAgICAgU3BsYXNoQ29sb3JQdHIgcm93OwogICAgICAgIHVuc2lnbmVkIGNoYXIgKipyb3dfcG9pbnRlcnMgPSBuZXcgdW5zaWduZWQgY2hhcipbaGVpZ2h0XTsKICAgICAgICByb3cgPSBkYXRhOwoKICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgICAgICByb3dfcG9pbnRlcnNbeV0gPSByb3c7CiAgICAgICAgICByb3cgKz0gcm93U2l6ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCF3cml0ZXItPndyaXRlUG9pbnRlcnMocm93X3BvaW50ZXJzLCBoZWlnaHQpKSB7CiAgICAgICAgICBkZWxldGVbXSByb3dfcG9pbnRlcnM7CiAgICAgICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICAgICAgICB9CiAgICAgICAgZGVsZXRlW10gcm93X3BvaW50ZXJzOwogICAgICB9IGVsc2UgewogICAgICAgIHVuc2lnbmVkIGNoYXIgKnJvdyA9IG5ldyB1bnNpZ25lZCBjaGFyWzMgKiB3aWR0aF07CiAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgICAgICAgZ2V0UkdCTGluZSh5LCByb3cpOwogICAgICAgICAgaWYgKCF3cml0ZXItPndyaXRlUm93KCZyb3cpKSB7CiAgICAgICAgICAgIGRlbGV0ZVtdIHJvdzsKICAgICAgICAgICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRlbGV0ZVtdIHJvdzsKICAgICAgfQogICAgYnJlYWs7CiNlbmRpZgogICAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgIHsKICAgICAgU3BsYXNoQ29sb3JQdHIgcm93OwogICAgICB1bnNpZ25lZCBjaGFyICoqcm93X3BvaW50ZXJzID0gbmV3IHVuc2lnbmVkIGNoYXIqW2hlaWdodF07CiAgICAgIHJvdyA9IGRhdGE7CgogICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgICAgcm93X3BvaW50ZXJzW3ldID0gcm93OwogICAgICAgIHJvdyArPSByb3dTaXplOwogICAgICB9CiAgICAgIGlmICghd3JpdGVyLT53cml0ZVBvaW50ZXJzKHJvd19wb2ludGVycywgaGVpZ2h0KSkgewogICAgICAgIGRlbGV0ZVtdIHJvd19wb2ludGVyczsKICAgICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICAgICAgfQogICAgICBkZWxldGVbXSByb3dfcG9pbnRlcnM7CiAgICB9CiAgICBicmVhazsKICAgIAogICAgY2FzZSBzcGxhc2hNb2RlWEJHUjg6CiAgICB7CiAgICAgIHVuc2lnbmVkIGNoYXIgKnJvdyA9IG5ldyB1bnNpZ25lZCBjaGFyWzMgKiB3aWR0aF07CiAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICAvLyBDb252ZXJ0IGludG8gYSBQTkcgcm93CiAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICByb3dbMyp4XSA9IGRhdGFbeSAqIHJvd1NpemUgKyB4ICogNCArIDJdOwogICAgICAgICAgcm93WzMqeCsxXSA9IGRhdGFbeSAqIHJvd1NpemUgKyB4ICogNCArIDFdOwogICAgICAgICAgcm93WzMqeCsyXSA9IGRhdGFbeSAqIHJvd1NpemUgKyB4ICogNF07CiAgICAgICAgfQoKICAgICAgICBpZiAoIXdyaXRlci0+d3JpdGVSb3coJnJvdykpIHsKICAgICAgICAgIGRlbGV0ZVtdIHJvdzsKICAgICAgICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogICAgICAgIH0KICAgICAgfQogICAgICBkZWxldGVbXSByb3c7CiAgICB9CiAgICBicmVhazsKICAgIAogICAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICB7CiAgICAgIHVuc2lnbmVkIGNoYXIgKnJvdyA9IG5ldyB1bnNpZ25lZCBjaGFyWzMgKiB3aWR0aF07CiAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICAvLyBDb252ZXJ0IGludG8gYSBQTkcgcm93CiAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICByb3dbMyp4XSA9IGRhdGFbeSAqIHJvd1NpemUgKyB4XTsKICAgICAgICAgIHJvd1szKngrMV0gPSBkYXRhW3kgKiByb3dTaXplICsgeF07CiAgICAgICAgICByb3dbMyp4KzJdID0gZGF0YVt5ICogcm93U2l6ZSArIHhdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF3cml0ZXItPndyaXRlUm93KCZyb3cpKSB7CiAgICAgICAgICBkZWxldGVbXSByb3c7CiAgICAgICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICAgICAgICB9CiAgICAgIH0KICAgICAgZGVsZXRlW10gcm93OwogICAgfQogICAgYnJlYWs7CiAgICAKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgewogICAgICB1bnNpZ25lZCBjaGFyICpyb3cgPSBuZXcgdW5zaWduZWQgY2hhclszICogd2lkdGhdOwogICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICAgICAgLy8gQ29udmVydCBpbnRvIGEgUE5HIHJvdwogICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICAgICAgZ2V0UGl4ZWwoeCwgeSwgJnJvd1szKnhdKTsKICAgICAgICAgIHJvd1szKngrMV0gPSByb3dbMyp4XTsKICAgICAgICAgIHJvd1szKngrMl0gPSByb3dbMyp4XTsKICAgICAgICB9CgogICAgICAgIGlmICghd3JpdGVyLT53cml0ZVJvdygmcm93KSkgewogICAgICAgICAgZGVsZXRlW10gcm93OwogICAgICAgICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICAgICAgfQogICAgICB9CiAgICAgIGRlbGV0ZVtdIHJvdzsKICAgIH0KICAgIGJyZWFrOwogICAgCiAgICBkZWZhdWx0OgogICAgLy8gY2FuJ3QgaGFwcGVuCiAgICBicmVhazsKICB9CiAgCiAgaWYgKCF3cml0ZXItPmNsb3NlKCkpIHsKICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogIH0KCiAgcmV0dXJuIHNwbGFzaE9rOwp9Cg==