Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDUgTWFyY28gUGVzZW50aSBHcml0dGkgPG1wZ0ByZWRoYXQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTEgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEyIFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZuZGVmIFNQTEFTSF9ICiNkZWZpbmUgU1BMQVNIX0gKCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbnRlcmZhY2UKI2VuZGlmCgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlICJTcGxhc2hUeXBlcy5oIgojaW5jbHVkZSAiU3BsYXNoQ2xpcC5oIgojaW5jbHVkZSAiU3BsYXNoUGF0dGVybi5oIgoKY2xhc3MgU3BsYXNoQml0bWFwOwpzdHJ1Y3QgU3BsYXNoR2x5cGhCaXRtYXA7CmNsYXNzIFNwbGFzaFN0YXRlOwpjbGFzcyBTcGxhc2hTY3JlZW47CmNsYXNzIFNwbGFzaFBhdGg7CmNsYXNzIFNwbGFzaFhQYXRoOwpjbGFzcyBTcGxhc2hGb250OwpzdHJ1Y3QgU3BsYXNoUGlwZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBSZXRyaWV2ZXMgdGhlIG5leHQgbGluZSBvZiBwaXhlbHMgaW4gYW4gaW1hZ2UgbWFzay4gIE5vcm1hbGx5LAovLyBmaWxscyBpbiAqPGxpbmU+IGFuZCByZXR1cm5zIHRydWUuICBJZiB0aGUgaW1hZ2Ugc3RyZWFtIGlzCi8vIGV4aGF1c3RlZCwgcmV0dXJucyBmYWxzZS4KdHlwZWRlZiBHQm9vbCAoKlNwbGFzaEltYWdlTWFza1NvdXJjZSkodm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgcGl4ZWwpOwoKLy8gUmV0cmlldmVzIHRoZSBuZXh0IGxpbmUgb2YgcGl4ZWxzIGluIGFuIGltYWdlLiAgTm9ybWFsbHksIGZpbGxzIGluCi8vICo8bGluZT4gYW5kIHJldHVybnMgdHJ1ZS4gIElmIHRoZSBpbWFnZSBzdHJlYW0gaXMgZXhoYXVzdGVkLAovLyByZXR1cm5zIGZhbHNlLgp0eXBlZGVmIEdCb29sICgqU3BsYXNoSW1hZ2VTb3VyY2UpKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGNvbG9yTGluZSwKCQkJCSAgIEd1Y2hhciAqYWxwaGFMaW5lKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplbnVtIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgewojaWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFJHQiwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kUkdCLAojaWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRSR0IKI2lmIFNQTEFTSF9DTVlLCiAgLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmREZXZpY2VOCiNlbmRpZgp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBTcGxhc2ggewpwdWJsaWM6CgogIC8vIENyZWF0ZSBhIG5ldyByYXN0ZXJpemVyIG9iamVjdC4KICBTcGxhc2goU3BsYXNoQml0bWFwICpiaXRtYXBBLCBHQm9vbCB2ZWN0b3JBbnRpYWxpYXNBLAoJIFNwbGFzaFNjcmVlblBhcmFtcyAqc2NyZWVuUGFyYW1zID0gTlVMTCk7CiAgU3BsYXNoKFNwbGFzaEJpdG1hcCAqYml0bWFwQSwgR0Jvb2wgdmVjdG9yQW50aWFsaWFzQSwKCSBTcGxhc2hTY3JlZW4gKnNjcmVlbkEpOwoKICB+U3BsYXNoKCk7CgogIC8vLS0tLS0gc3RhdGUgcmVhZAoKICBTcGxhc2hDb29yZCAqZ2V0TWF0cml4KCk7CiAgU3BsYXNoUGF0dGVybiAqZ2V0U3Ryb2tlUGF0dGVybigpOwogIFNwbGFzaFBhdHRlcm4gKmdldEZpbGxQYXR0ZXJuKCk7CiAgU3BsYXNoU2NyZWVuICpnZXRTY3JlZW4oKTsKICBTcGxhc2hCbGVuZEZ1bmMgZ2V0QmxlbmRGdW5jKCk7CiAgU3BsYXNoQ29vcmQgZ2V0U3Ryb2tlQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRGaWxsQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRMaW5lV2lkdGgoKTsKICBpbnQgZ2V0TGluZUNhcCgpOwogIGludCBnZXRMaW5lSm9pbigpOwogIFNwbGFzaENvb3JkIGdldE1pdGVyTGltaXQoKTsKICBTcGxhc2hDb29yZCBnZXRGbGF0bmVzcygpOwogIFNwbGFzaENvb3JkICpnZXRMaW5lRGFzaCgpOwogIGludCBnZXRMaW5lRGFzaExlbmd0aCgpOwogIFNwbGFzaENvb3JkIGdldExpbmVEYXNoUGhhc2UoKTsKICBHQm9vbCBnZXRTdHJva2VBZGp1c3QoKTsKICBTcGxhc2hDbGlwICpnZXRDbGlwKCk7CiAgU3BsYXNoQml0bWFwICpnZXRTb2Z0TWFzaygpOwogIEdCb29sIGdldEluTm9uSXNvbGF0ZWRHcm91cCgpOwoKICAvLy0tLS0tIHN0YXRlIHdyaXRlCgogIHZvaWQgc2V0TWF0cml4KFNwbGFzaENvb3JkICptYXRyaXgpOwogIHZvaWQgc2V0U3Ryb2tlUGF0dGVybihTcGxhc2hQYXR0ZXJuICpzdHJva2VDb2xvcik7CiAgdm9pZCBzZXRGaWxsUGF0dGVybihTcGxhc2hQYXR0ZXJuICpmaWxsQ29sb3IpOwogIHZvaWQgc2V0U2NyZWVuKFNwbGFzaFNjcmVlbiAqc2NyZWVuKTsKICB2b2lkIHNldEJsZW5kRnVuYyhTcGxhc2hCbGVuZEZ1bmMgZnVuYyk7CiAgdm9pZCBzZXRTdHJva2VBbHBoYShTcGxhc2hDb29yZCBhbHBoYSk7CiAgdm9pZCBzZXRGaWxsQWxwaGEoU3BsYXNoQ29vcmQgYWxwaGEpOwogIHZvaWQgc2V0RmlsbE92ZXJwcmludChHQm9vbCBmb3ApOwogIHZvaWQgc2V0U3Ryb2tlT3ZlcnByaW50KEdCb29sIHNvcCk7CiAgdm9pZCBzZXRPdmVycHJpbnRNb2RlKGludCBvcG0pOwogIHZvaWQgc2V0TGluZVdpZHRoKFNwbGFzaENvb3JkIGxpbmVXaWR0aCk7CiAgdm9pZCBzZXRMaW5lQ2FwKGludCBsaW5lQ2FwKTsKICB2b2lkIHNldExpbmVKb2luKGludCBsaW5lSm9pbik7CiAgdm9pZCBzZXRNaXRlckxpbWl0KFNwbGFzaENvb3JkIG1pdGVyTGltaXQpOwogIHZvaWQgc2V0RmxhdG5lc3MoU3BsYXNoQ29vcmQgZmxhdG5lc3MpOwogIC8vIHRoZSA8bGluZURhc2g+IGFycmF5IHdpbGwgYmUgY29waWVkCiAgdm9pZCBzZXRMaW5lRGFzaChTcGxhc2hDb29yZCAqbGluZURhc2gsIGludCBsaW5lRGFzaExlbmd0aCwKCQkgICBTcGxhc2hDb29yZCBsaW5lRGFzaFBoYXNlKTsKICB2b2lkIHNldFN0cm9rZUFkanVzdChHQm9vbCBzdHJva2VBZGp1c3QpOwogIC8vIE5COiB1c2VzIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgogIHZvaWQgY2xpcFJlc2V0VG9SZWN0KFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkgICAgICAgU3BsYXNoQ29vcmQgeDEsIFNwbGFzaENvb3JkIHkxKTsKICAvLyBOQjogdXNlcyB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KICBTcGxhc2hFcnJvciBjbGlwVG9SZWN0KFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkJIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSk7CiAgLy8gTkI6IHVzZXMgdW50cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KICBTcGxhc2hFcnJvciBjbGlwVG9QYXRoKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGVvKTsKICB2b2lkIHNldFNvZnRNYXNrKFNwbGFzaEJpdG1hcCAqc29mdE1hc2spOwogIHZvaWQgc2V0SW5Ob25Jc29sYXRlZEdyb3VwKFNwbGFzaEJpdG1hcCAqYWxwaGEwQml0bWFwQSwKCQkJICAgICBpbnQgYWxwaGEwWEEsIGludCBhbHBoYTBZQSk7CiAgdm9pZCBzZXRUcmFuc2ZlcihHdWNoYXIgKnJlZCwgR3VjaGFyICpncmVlbiwgR3VjaGFyICpibHVlLCBHdWNoYXIgKmdyYXkpOwogIHZvaWQgc2V0T3ZlcnByaW50TWFzayhHdWludCBvdmVycHJpbnRNYXNrLCBHQm9vbCBhZGRpdGl2ZSk7CgogIC8vLS0tLS0gc3RhdGUgc2F2ZS9yZXN0b3JlCgogIHZvaWQgc2F2ZVN0YXRlKCk7CiAgU3BsYXNoRXJyb3IgcmVzdG9yZVN0YXRlKCk7CgogIC8vLS0tLS0gZHJhd2luZyBvcGVyYXRpb25zCgogIC8vIEZpbGwgdGhlIGJpdG1hcCB3aXRoIDxjb2xvcj4uICBUaGlzIGlzIG5vdCBzdWJqZWN0IHRvIGNsaXBwaW5nLgogIHZvaWQgY2xlYXIoU3BsYXNoQ29sb3JQdHIgY29sb3IsIEd1Y2hhciBhbHBoYSA9IDB4MDApOwoKICAvLyBTdHJva2UgYSBwYXRoIHVzaW5nIHRoZSBjdXJyZW50IHN0cm9rZSBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIHN0cm9rZShTcGxhc2hQYXRoICpwYXRoKTsKCiAgLy8gRmlsbCBhIHBhdGggdXNpbmcgdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIGZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pOwoKICAvLyBGaWxsIGEgcGF0aCwgWE9SaW5nIHdpdGggdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIHhvckZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pOwoKICAvLyBEcmF3IGEgY2hhcmFjdGVyLCB1c2luZyB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uCiAgU3BsYXNoRXJyb3IgZmlsbENoYXIoU3BsYXNoQ29vcmQgeCwgU3BsYXNoQ29vcmQgeSwgaW50IGMsIFNwbGFzaEZvbnQgKmZvbnQpOwoKICAvLyBEcmF3IGEgZ2x5cGgsIHVzaW5nIHRoZSBjdXJyZW50IGZpbGwgcGF0dGVybi4gIFRoaXMgZnVuY3Rpb24gZG9lcwogIC8vIG5vdCBmcmVlIGFueSBkYXRhLCBpLmUuLCBpdCBpZ25vcmVzIGdseXBoLT5mcmVlRGF0YS4KICB2b2lkIGZpbGxHbHlwaChTcGxhc2hDb29yZCB4LCBTcGxhc2hDb29yZCB5LAoJCQlTcGxhc2hHbHlwaEJpdG1hcCAqZ2x5cGgpOwoKICAvLyBEcmF3cyBhbiBpbWFnZSBtYXNrIHVzaW5nIHRoZSBmaWxsIGNvbG9yLiAgVGhpcyB3aWxsIHJlYWQgPGg+CiAgLy8gbGluZXMgb2YgPHc+IHBpeGVscyBmcm9tIDxzcmM+LCBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGluZS4gICIxIgogIC8vIHBpeGVscyB3aWxsIGJlIGRyYXduIHdpdGggdGhlIGN1cnJlbnQgZmlsbCBjb2xvcjsgIjAiIHBpeGVscyBhcmUKICAvLyB0cmFuc3BhcmVudC4gIFRoZSBtYXRyaXg6CiAgLy8gICAgWyBtYXRbMF0gbWF0WzFdIDAgXQogIC8vICAgIFsgbWF0WzJdIG1hdFszXSAwIF0KICAvLyAgICBbIG1hdFs0XSBtYXRbNV0gMSBdCiAgLy8gbWFwcyBhIHVuaXQgc3F1YXJlIHRvIHRoZSBkZXNpcmVkIGRlc3RpbmF0aW9uIGZvciB0aGUgaW1hZ2UsIGluCiAgLy8gUG9zdFNjcmlwdCBzdHlsZToKICAvLyAgICBbeCcgeScgMV0gPSBbeCB5IDFdICogbWF0CiAgLy8gTm90ZSB0aGF0IHRoZSBTcGxhc2ggeSBheGlzIHBvaW50cyBkb3dud2FyZCwgYW5kIHRoZSBpbWFnZSBzb3VyY2UKICAvLyBpcyBhc3N1bWVkIHRvIHByb2R1Y2UgcGl4ZWxzIGluIHJhc3RlciBvcmRlciwgc3RhcnRpbmcgZnJvbSB0aGUKICAvLyB0b3AgbGluZS4KICBTcGxhc2hFcnJvciBmaWxsSW1hZ2VNYXNrKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgICBpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQsCgkJCSAgICBHQm9vbCBnbHlwaE1vZGUpOwoKICAvLyBEcmF3IGFuIGltYWdlLiAgVGhpcyB3aWxsIHJlYWQgPGg+IGxpbmVzIG9mIDx3PiBwaXhlbHMgZnJvbQogIC8vIDxzcmM+LCBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGluZS4gIFRoZXNlIHBpeGVscyBhcmUgYXNzdW1lZCB0bwogIC8vIGJlIGluIHRoZSBzb3VyY2UgbW9kZSwgPHNyY01vZGU+LiAgSWYgPHNyY0FscGhhPiBpcyB0cnVlLCB0aGUKICAvLyBhbHBoYSB2YWx1ZXMgcmV0dXJuZWQgYnkgPHNyYz4gYXJlIHVzZWQ7IG90aGVyd2lzZSB0aGV5IGFyZQogIC8vIGlnbm9yZWQuICBUaGUgZm9sbG93aW5nIGNvbWJpbmF0aW9ucyBvZiBzb3VyY2UgYW5kIHRhcmdldCBtb2RlcwogIC8vIGFyZSBzdXBwb3J0ZWQ6CiAgLy8gICAgc291cmNlICAgICAgIHRhcmdldAogIC8vICAgIC0tLS0tLSAgICAgICAtLS0tLS0KICAvLyAgICBNb25vMSAgICAgICAgTW9ubzEKICAvLyAgICBNb25vOCAgICAgICAgTW9ubzEgICAtLSB3aXRoIGRpdGhlcmluZwogIC8vICAgIE1vbm84ICAgICAgICBNb25vOAogIC8vICAgIFJHQjggICAgICAgICBSR0I4CiAgLy8gICAgQkdSOCAgICAgICAgIEJHUjgKICAvLyAgICBDTVlLOCAgICAgICAgQ01ZSzgKICAvLyBUaGUgbWF0cml4IGJlaGF2ZXMgYXMgZm9yIGZpbGxJbWFnZU1hc2suCiAgU3BsYXNoRXJyb3IgZHJhd0ltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIEdCb29sIHNyY0FscGhhLAoJCQlpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQsIEdCb29sIGludGVycG9sYXRlLAoJCQlHQm9vbCB0aWxpbmdQYXR0ZXJuID0gZ0ZhbHNlKTsKCiAgLy8gQ29tcG9zaXRlIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGlzIFNwbGFzaAogIC8vIG9iamVjdC4KICBTcGxhc2hFcnJvciBjb21wb3NpdGUoU3BsYXNoQml0bWFwICpzcmMsIGludCB4U3JjLCBpbnQgeVNyYywKCQkJaW50IHhEZXN0LCBpbnQgeURlc3QsIGludCB3LCBpbnQgaCwKCQkJR0Jvb2wgbm9DbGlwLCBHQm9vbCBub25Jc29sYXRlZCwKCQkJR0Jvb2wga25vY2tvdXQgPSBnRmFsc2UsIFNwbGFzaENvb3JkIGtub2Nrb3V0T3BhY2l0eSA9IDEuMCk7CgogIC8vIENvbXBvc2l0ZSB0aGlzIFNwbGFzaCBvYmplY3Qgb250byBhIGJhY2tncm91bmQgY29sb3IuICBUaGUKICAvLyBiYWNrZ3JvdW5kIGFscGhhIGlzIGFzc3VtZWQgdG8gYmUgMS4KICB2b2lkIGNvbXBvc2l0ZUJhY2tncm91bmQoU3BsYXNoQ29sb3JQdHIgY29sb3IpOwoKICAvLyBDb3B5IGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGUgYml0bWFwIGJlbG9uZ2luZyB0bwogIC8vIHRoaXMgU3BsYXNoIG9iamVjdC4gIFRoZSBkZXN0aW5hdGlvbiBhbHBoYSB2YWx1ZXMgYXJlIGFsbCBzZXQgdG8KICAvLyB6ZXJvLgogIFNwbGFzaEVycm9yIGJsaXRUcmFuc3BhcmVudChTcGxhc2hCaXRtYXAgKnNyYywgaW50IHhTcmMsIGludCB5U3JjLAoJCQkgICAgICBpbnQgeERlc3QsIGludCB5RGVzdCwgaW50IHcsIGludCBoKTsKCiAgLy8tLS0tLSBtaXNjCgogIC8vIENvbnN0cnVjdCBhIHBhdGggZm9yIGEgc3Ryb2tlLCBnaXZlbiB0aGUgcGF0aCB0byBiZSBzdHJva2VkIGFuZAogIC8vIHRoZSBsaW5lIHdpZHRoIDx3Pi4gIEFsbCBvdGhlciBzdHJva2UgcGFyYW1ldGVycyBhcmUgdGFrZW4gZnJvbQogIC8vIHRoZSBjdXJyZW50IHN0YXRlLiAgSWYgPGZsYXR0ZW4+IGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gd2lsbAogIC8vIGZpcnN0IGZsYXR0ZW4gdGhlIHBhdGggYW5kIGhhbmRsZSB0aGUgbGluZWRhc2guCiAgU3BsYXNoUGF0aCAqbWFrZVN0cm9rZVBhdGgoU3BsYXNoUGF0aCAqcGF0aCwgU3BsYXNoQ29vcmQgdywKCQkJICAgICBHQm9vbCBmbGF0dGVuID0gZ1RydWUpOwoKICAvLyBSZXR1cm4gdGhlIGFzc29jaWF0ZWQgYml0bWFwLgogIFNwbGFzaEJpdG1hcCAqZ2V0Qml0bWFwKCkgeyByZXR1cm4gYml0bWFwOyB9CgogIC8vIFNldCB0aGUgbWluaW11bSBsaW5lIHdpZHRoLgogIHZvaWQgc2V0TWluTGluZVdpZHRoKFNwbGFzaENvb3JkIHcpIHsgbWluTGluZVdpZHRoID0gdzsgfQoKICAvLyBHZXQgYSBib3VuZGluZyBib3ggd2hpY2ggaW5jbHVkZXMgYWxsIG1vZGlmaWNhdGlvbnMgc2luY2UgdGhlCiAgLy8gbGFzdCBjYWxsIHRvIGNsZWFyTW9kUmVnaW9uLgogIHZvaWQgZ2V0TW9kUmVnaW9uKGludCAqeE1pbiwgaW50ICp5TWluLCBpbnQgKnhNYXgsIGludCAqeU1heCkKICAgIHsgKnhNaW4gPSBtb2RYTWluOyAqeU1pbiA9IG1vZFlNaW47ICp4TWF4ID0gbW9kWE1heDsgKnlNYXggPSBtb2RZTWF4OyB9CgogIC8vIENsZWFyIHRoZSBtb2RpZmllZCByZWdpb24gYm91bmRpbmcgYm94LgogIHZvaWQgY2xlYXJNb2RSZWdpb24oKTsKCiAgLy8gR2V0IGNsaXBwaW5nIHN0YXR1cyBmb3IgdGhlIGxhc3QgZHJhd2luZyBvcGVyYXRpb24gc3ViamVjdCB0bwogIC8vIGNsaXBwaW5nLgogIFNwbGFzaENsaXBSZXN1bHQgZ2V0Q2xpcFJlcygpIHsgcmV0dXJuIG9wQ2xpcFJlczsgfQoKICAvLyBUb2dnbGUgZGVidWcgbW9kZSBvbiBvciBvZmYuCiAgdm9pZCBzZXREZWJ1Z01vZGUoR0Jvb2wgZGVidWdNb2RlQSkgeyBkZWJ1Z01vZGUgPSBkZWJ1Z01vZGVBOyB9CgojaWYgMSAvL350bXA6IHR1cm4gb2ZmIGFudGktYWxpYXNpbmcgdGVtcG9yYXJpbHkKICB2b2lkIHNldEluU2hhZGluZyhHQm9vbCBzaCkgeyBpblNoYWRpbmcgPSBzaDsgfQogIEdCb29sIGdldFZlY3RvckFudGlhbGlhcygpIHsgcmV0dXJuIHZlY3RvckFudGlhbGlhczsgfQogIHZvaWQgc2V0VmVjdG9yQW50aWFsaWFzKEdCb29sIHZhYSkgeyB2ZWN0b3JBbnRpYWxpYXMgPSB2YWE7IH0KI2VuZGlmCgogIC8vIERvIHNoYWRlZCBmaWxscyB3aXRoIGR5bmFtaWMgcGF0dGVybnMKICBTcGxhc2hFcnJvciBzaGFkZWRGaWxsKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGhhc0JCb3gsCiAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuKTsKICAvLyBEcmF3IGEgZ291cmF1ZCB0cmlhbmdsZSBzaGFkaW5nLgogIEdCb29sIGdvdXJhdWRUcmlhbmdsZVNoYWRlZEZpbGwoU3BsYXNoR291cmF1ZENvbG9yICpzaGFkaW5nKTsKCnByaXZhdGU6CgogIHZvaWQgcGlwZUluaXQoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5LAoJCVNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sIFNwbGFzaENvbG9yUHRyIGNTcmMsCgkJR3VjaGFyIGFJbnB1dCwgR0Jvb2wgdXNlc1NoYXBlLAoJCUdCb29sIG5vbklzb2xhdGVkR3JvdXAsCgkJR0Jvb2wga25vY2tvdXQgPSBnRmFsc2UsIEd1Y2hhciBrbm9ja291dE9wYWNpdHkgPSAyNTUpOwogIHZvaWQgcGlwZVJ1bihTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVNb25vMShTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVNb25vOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVSR0I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZVhCR1I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZUJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNpZiBTUExBU0hfQ01ZSwogIHZvaWQgcGlwZVJ1blNpbXBsZUNNWUs4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZURldmljZU44KFNwbGFzaFBpcGUgKnBpcGUpOwojZW5kaWYKICB2b2lkIHBpcGVSdW5BQU1vbm8xKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBTW9ubzgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFSR0I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBWEJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFCR1I4KFNwbGFzaFBpcGUgKnBpcGUpOwojaWYgU1BMQVNIX0NNWUsKICB2b2lkIHBpcGVSdW5BQUNNWUs4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBRGV2aWNlTjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNlbmRpZgogIHZvaWQgcGlwZVNldFhZKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSk7CiAgdm9pZCBwaXBlSW5jWChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIGRyYXdQaXhlbChTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHksIEdCb29sIG5vQ2xpcCk7CiAgdm9pZCBkcmF3QUFQaXhlbEluaXQoKTsKICB2b2lkIGRyYXdBQVBpeGVsKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSk7CiAgdm9pZCBkcmF3U3BhbihTcGxhc2hQaXBlICpwaXBlLCBpbnQgeDAsIGludCB4MSwgaW50IHksIEdCb29sIG5vQ2xpcCk7CiAgdm9pZCBkcmF3QUFMaW5lKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4MCwgaW50IHgxLCBpbnQgeSk7CiAgdm9pZCB0cmFuc2Zvcm0oU3BsYXNoQ29vcmQgKm1hdHJpeCwgU3BsYXNoQ29vcmQgeGksIFNwbGFzaENvb3JkIHlpLAoJCSBTcGxhc2hDb29yZCAqeG8sIFNwbGFzaENvb3JkICp5byk7CiAgdm9pZCB1cGRhdGVNb2RYKGludCB4KTsKICB2b2lkIHVwZGF0ZU1vZFkoaW50IHkpOwogIHZvaWQgc3Ryb2tlTmFycm93KFNwbGFzaFBhdGggKnBhdGgpOwogIHZvaWQgc3Ryb2tlV2lkZShTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCB3KTsKICBTcGxhc2hQYXRoICpmbGF0dGVuUGF0aChTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCAqbWF0cml4LAoJCQkgIFNwbGFzaENvb3JkIGZsYXRuZXNzKTsKICB2b2lkIGZsYXR0ZW5DdXJ2ZShTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJICAgIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSwKCQkgICAgU3BsYXNoQ29vcmQgeDIsIFNwbGFzaENvb3JkIHkyLAoJCSAgICBTcGxhc2hDb29yZCB4MywgU3BsYXNoQ29vcmQgeTMsCgkJICAgIFNwbGFzaENvb3JkICptYXRyaXgsIFNwbGFzaENvb3JkIGZsYXRuZXNzMiwKCQkgICAgU3BsYXNoUGF0aCAqZlBhdGgpOwogIFNwbGFzaFBhdGggKm1ha2VEYXNoZWRQYXRoKFNwbGFzaFBhdGggKnhQYXRoKTsKICBTcGxhc2hFcnJvciBmaWxsV2l0aFBhdHRlcm4oU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8sCgkJCSAgICAgIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sIFNwbGFzaENvb3JkIGFscGhhKTsKICBHQm9vbCBwYXRoQWxsT3V0c2lkZShTcGxhc2hQYXRoICpwYXRoKTsKICB2b2lkIGZpbGxHbHlwaDIoaW50IHgwLCBpbnQgeTAsIFNwbGFzaEdseXBoQml0bWFwICpnbHlwaCwgR0Jvb2wgbm9jbGlwKTsKICB2b2lkIGFyYml0cmFyeVRyYW5zZm9ybU1hc2soU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJICAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCQkgICAgICBTcGxhc2hDb29yZCAqbWF0LCBHQm9vbCBnbHlwaE1vZGUpOwogIFNwbGFzaEJpdG1hcCAqc2NhbGVNYXNrKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCQkgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCk7CiAgdm9pZCBzY2FsZU1hc2tZZFhkKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVNYXNrWWRYdShTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlTWFza1l1WGQoU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZU1hc2tZdVh1KFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgYmxpdE1hc2soU3BsYXNoQml0bWFwICpzcmMsIGludCB4RGVzdCwgaW50IHlEZXN0LAoJCVNwbGFzaENsaXBSZXN1bHQgY2xpcFJlcyk7CiAgU3BsYXNoRXJyb3IgYXJiaXRyYXJ5VHJhbnNmb3JtSW1hZ2UoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJCSAgICAgICBHQm9vbCBzcmNBbHBoYSwKCQkJICAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwbGFzaENvb3JkICptYXQsIEdCb29sIGludGVycG9sYXRlLCBHQm9vbCB0aWxpbmdQYXR0ZXJuID0gZ0ZhbHNlKTsKICBTcGxhc2hCaXRtYXAgKnNjYWxlSW1hZ2UoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkJICAgR0Jvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkJICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LCBHQm9vbCBpbnRlcnBvbGF0ZSk7CiAgdm9pZCBzY2FsZUltYWdlWWRYZChTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgR0Jvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlSW1hZ2VZZFh1KFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkgICAgICBHQm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVJbWFnZVl1WGQoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIEdCb29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZUltYWdlWXVYdShTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgR0Jvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlSW1hZ2VZdVh1QmlsaW5lYXIoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIEdCb29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCB2ZXJ0RmxpcEltYWdlKFNwbGFzaEJpdG1hcCAqaW1nLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCgkJICAgICBpbnQgbkNvbXBzKTsKICB2b2lkIGJsaXRJbWFnZShTcGxhc2hCaXRtYXAgKnNyYywgR0Jvb2wgc3JjQWxwaGEsIGludCB4RGVzdCwgaW50IHlEZXN0LAoJCSBTcGxhc2hDbGlwUmVzdWx0IGNsaXBSZXMpOwogIHZvaWQgYmxpdEltYWdlQ2xpcHBlZChTcGxhc2hCaXRtYXAgKnNyYywgR0Jvb2wgc3JjQWxwaGEsCgkJCWludCB4U3JjLCBpbnQgeVNyYywgaW50IHhEZXN0LCBpbnQgeURlc3QsCgkJCWludCB3LCBpbnQgaCk7CiAgdm9pZCBkdW1wUGF0aChTcGxhc2hQYXRoICpwYXRoKTsKICB2b2lkIGR1bXBYUGF0aChTcGxhc2hYUGF0aCAqcGF0aCk7CgogIHN0YXRpYyBTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIHBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFtdOwogIHN0YXRpYyBTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIHBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZFtdOwogIHN0YXRpYyBTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIHBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRbXTsKICBzdGF0aWMgaW50IHBpcGVOb25Jc29Hcm91cENvcnJlY3Rpb25bXTsKCiAgU3BsYXNoQml0bWFwICpiaXRtYXA7CiAgU3BsYXNoU3RhdGUgKnN0YXRlOwogIFNwbGFzaEJpdG1hcCAqYWFCdWY7CiAgaW50IGFhQnVmWTsKICBTcGxhc2hCaXRtYXAgKmFscGhhMEJpdG1hcDsJLy8gZm9yIG5vbi1pc29sYXRlZCBncm91cHMsIHRoaXMgaXMgdGhlCgkJCQkvLyAgIGJpdG1hcCBjb250YWluaW5nIHRoZSBhbHBoYTAgdmFsdWVzCiAgaW50IGFscGhhMFgsIGFscGhhMFk7CQkvLyBvZmZzZXQgd2l0aGluIGFscGhhMEJpdG1hcAogIFNwbGFzaENvb3JkIGFhR2FtbWFbc3BsYXNoQUFTaXplICogc3BsYXNoQUFTaXplICsgMV07CiAgU3BsYXNoQ29vcmQgbWluTGluZVdpZHRoOwogIGludCBtb2RYTWluLCBtb2RZTWluLCBtb2RYTWF4LCBtb2RZTWF4OwogIFNwbGFzaENsaXBSZXN1bHQgb3BDbGlwUmVzOwogIEdCb29sIHZlY3RvckFudGlhbGlhczsKICBHQm9vbCBpblNoYWRpbmc7CiAgR0Jvb2wgZGVidWdNb2RlOwp9OwoKI2VuZGlmCg==