Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8JICAgIEMgSW1wbGVtZW50YXRpb24gb2YgV3UncyBDb2xvciBRdWFudGl6ZXIgKHYuIDIpCi8vCSAgICAoc2VlIEdyYXBoaWNzIEdlbXMgdm9sLiBJSSwgcHAuIDEyNi0xMzMpCi8vCi8vIEF1dGhvcjoJWGlhb2xpbiBXdQovLyBEZXB0LiBvZiBDb21wdXRlciBTY2llbmNlCi8vIFVuaXYuIG9mIFdlc3Rlcm4gT250YXJpbwovLyBMb25kb24sIE9udGFyaW8gTjZBIDVCNwovLyB3dUBjc2QudXdvLmNhCi8vIAovLyBBbGdvcml0aG06IEdyZWVkeSBvcnRob2dvbmFsIGJpcGFydGl0aW9uIG9mIFJHQiBzcGFjZSBmb3IgdmFyaWFuY2UKLy8gCSAgIG1pbmltaXphdGlvbiBhaWRlZCBieSBpbmNsdXNpb24tZXhjbHVzaW9uIHRyaWNrcy4KLy8gCSAgIEZvciBzcGVlZCBubyBuZWFyZXN0IG5laWdoYm9yIHNlYXJjaCBpcyBkb25lLiBTbGlnaHRseQovLyAJICAgYmV0dGVyIHBlcmZvcm1hbmNlIGNhbiBiZSBleHBlY3RlZCBieSBtb3JlIHNvcGhpc3RpY2F0ZWQKLy8gCSAgIGJ1dCBtb3JlIGV4cGVuc2l2ZSB2ZXJzaW9ucy4KLy8gCi8vIFRoZSBhdXRob3IgdGhhbmtzIFRvbSBMYW5lIGF0IFRvbV9MYW5lQEcuR1AuQ1MuQ01VLkVEVSBmb3IgbXVjaCBvZgovLyBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gYW5kIGEgY3VyZSB0byBhIHByZXZpb3VzIGJ1Zy4KLy8gCi8vIEZyZWUgdG8gZGlzdHJpYnV0ZSwgY29tbWVudHMgYW5kIHN1Z2dlc3Rpb25zIGFyZSBhcHByZWNpYXRlZC4KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIEhpc3RvcnkKLy8gLS0tLS0tLQovLyBKdWx5IDIwMDA6ICBDKysgSW1wbGVtZW50YXRpb24gb2YgV3UncyBDb2xvciBRdWFudGl6ZXIKLy8gICAgICAgICAgICAgYW5kIGFkYXB0YXRpb24gZm9yIHRoZSBGcmVlSW1hZ2UgMiBMaWJyYXJ5Ci8vICAgICAgICAgICAgIEF1dGhvcjogSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKLy8gTWFyY2ggMjAwNDogQWRhcHRhdGlvbiBmb3IgdGhlIEZyZWVJbWFnZSAzIGxpYnJhcnkgKHBvcnQgdG8gYmlnIGVuZGlhbiBwcm9jZXNzb3JzKQovLyAgICAgICAgICAgICBBdXRob3I6IEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgojaW5jbHVkZSAiUXVhbnRpemVycy5oIgojaW5jbHVkZSAiRnJlZUltYWdlLmgiCiNpbmNsdWRlICJVdGlsaXRpZXMuaCIKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLyBTaXplIG9mIGEgM0QgYXJyYXkgOiAzMyB4IDMzIHggMzMKI2RlZmluZSBTSVpFXzNECTM1OTM3CgovLyAzRCBhcnJheSBpbmRleGF0aW9uCiNkZWZpbmUgSU5ERVgociwgZywgYikJKChyIDw8IDEwKSArIChyIDw8IDYpICsgciArIChnIDw8IDUpICsgZyArIGIpCgojZGVmaW5lIE1BWENPTE9SCTI1NgoKLy8gQ29uc3RydWN0b3IgLyBEZXN0cnVjdG9yCgpXdVF1YW50aXplcjo6V3VRdWFudGl6ZXIoRklCSVRNQVAgKmRpYikgewoJd2lkdGggPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKCWhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKCXBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CgltX2RpYiA9IGRpYjsKCglnbTIgPSBOVUxMOwoJd3QgPSBtciA9IG1nID0gbWIgPSBOVUxMOwoJUWFkZCA9IE5VTEw7CgoJLy8gQWxsb2NhdGUgM0QgYXJyYXlzCglnbTIgPSAoZmxvYXQqKW1hbGxvYyhTSVpFXzNEICogc2l6ZW9mKGZsb2F0KSk7Cgl3dCA9IChMT05HKiltYWxsb2MoU0laRV8zRCAqIHNpemVvZihMT05HKSk7CgltciA9IChMT05HKiltYWxsb2MoU0laRV8zRCAqIHNpemVvZihMT05HKSk7CgltZyA9IChMT05HKiltYWxsb2MoU0laRV8zRCAqIHNpemVvZihMT05HKSk7CgltYiA9IChMT05HKiltYWxsb2MoU0laRV8zRCAqIHNpemVvZihMT05HKSk7CgoJLy8gQWxsb2NhdGUgUWFkZAoJUWFkZCA9IChXT1JEICopbWFsbG9jKHNpemVvZihXT1JEKSAqIHdpZHRoICogaGVpZ2h0KTsKCglpZighZ20yIHx8ICF3dCB8fCAhbXIgfHwgIW1nIHx8ICFtYiB8fCAhUWFkZCkgewoJCWlmKGdtMikJZnJlZShnbTIpOwoJCWlmKHd0KQlmcmVlKHd0KTsKCQlpZihtcikJZnJlZShtcik7CgkJaWYobWcpCWZyZWUobWcpOwoJCWlmKG1iKQlmcmVlKG1iKTsKCQlpZihRYWRkKSAgZnJlZShRYWRkKTsKCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOwoJfQoJbWVtc2V0KGdtMiwgMCwgU0laRV8zRCAqIHNpemVvZihmbG9hdCkpOwoJbWVtc2V0KHd0LCAwLCBTSVpFXzNEICogc2l6ZW9mKExPTkcpKTsKCW1lbXNldChtciwgMCwgU0laRV8zRCAqIHNpemVvZihMT05HKSk7CgltZW1zZXQobWcsIDAsIFNJWkVfM0QgKiBzaXplb2YoTE9ORykpOwoJbWVtc2V0KG1iLCAwLCBTSVpFXzNEICogc2l6ZW9mKExPTkcpKTsKCW1lbXNldChRYWRkLCAwLCBzaXplb2YoV09SRCkgKiB3aWR0aCAqIGhlaWdodCk7Cn0KCld1UXVhbnRpemVyOjp+V3VRdWFudGl6ZXIoKSB7CglpZihnbTIpCWZyZWUoZ20yKTsKCWlmKHd0KQlmcmVlKHd0KTsKCWlmKG1yKQlmcmVlKG1yKTsKCWlmKG1nKQlmcmVlKG1nKTsKCWlmKG1iKQlmcmVlKG1iKTsKCWlmKFFhZGQpICBmcmVlKFFhZGQpOwp9CgoKLy8gSGlzdG9ncmFtIGlzIGluIGVsZW1lbnRzIDEuLkhJU1RTSVpFIGFsb25nIGVhY2ggYXhpcywKLy8gZWxlbWVudCAwIGlzIGZvciBiYXNlIG9yIG1hcmdpbmFsIHZhbHVlCi8vIE5COiB0aGVzZSBtdXN0IHN0YXJ0IG91dCAwIQoKLy8gQnVpbGQgMy1EIGNvbG9yIGhpc3RvZ3JhbSBvZiBjb3VudHMsIHIvZy9iLCBjXjIKdm9pZCAKV3VRdWFudGl6ZXI6Okhpc3QzRChMT05HICp2d3QsIExPTkcgKnZtciwgTE9ORyAqdm1nLCBMT05HICp2bWIsIGZsb2F0ICptMiwgaW50IFJlc2VydmVTaXplLCBSR0JRVUFEICpSZXNlcnZlUGFsZXR0ZSkgewoJaW50IGluZCA9IDA7CglpbnQgaW5yLCBpbmcsIGluYiwgdGFibGVbMjU2XTsKCWludCBpOwoJdW5zaWduZWQgeSwgeDsKCglmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKCQl0YWJsZVtpXSA9IGkgKiBpOwoKCWlmIChGcmVlSW1hZ2VfR2V0QlBQKG1fZGliKSA9PSAyNCkgewoJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkJCUJZVEUgKmJpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobV9kaWIsIHkpOwoKCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykJewoJCQkJaW5yID0gKGJpdHNbRklfUkdCQV9SRURdID4+IDMpICsgMTsKCQkJCWluZyA9IChiaXRzW0ZJX1JHQkFfR1JFRU5dID4+IDMpICsgMTsKCQkJCWluYiA9IChiaXRzW0ZJX1JHQkFfQkxVRV0gPj4gMykgKyAxOwoJCQkJaW5kID0gSU5ERVgoaW5yLCBpbmcsIGluYik7CgkJCQlRYWRkW3kqd2lkdGggKyB4XSA9IChXT1JEKWluZDsKCQkJCS8vIFtpbnJdW2luZ11baW5iXQoJCQkJdnd0W2luZF0rKzsKCQkJCXZtcltpbmRdICs9IGJpdHNbRklfUkdCQV9SRURdOwoJCQkJdm1nW2luZF0gKz0gYml0c1tGSV9SR0JBX0dSRUVOXTsKCQkJCXZtYltpbmRdICs9IGJpdHNbRklfUkdCQV9CTFVFXTsKCQkJCW0yW2luZF0gKz0gKGZsb2F0KSh0YWJsZVtiaXRzW0ZJX1JHQkFfUkVEXV0gKyB0YWJsZVtiaXRzW0ZJX1JHQkFfR1JFRU5dXSArIHRhYmxlW2JpdHNbRklfUkdCQV9CTFVFXV0pOwoJCQkJYml0cyArPSAzOwoJCQl9CgkJfQoJfSBlbHNlIHsKCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQlCWVRFICpiaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKG1fZGliLCB5KTsKCgkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspCXsKCQkJCWluciA9IChiaXRzW0ZJX1JHQkFfUkVEXSA+PiAzKSArIDE7CgkJCQlpbmcgPSAoYml0c1tGSV9SR0JBX0dSRUVOXSA+PiAzKSArIDE7CgkJCQlpbmIgPSAoYml0c1tGSV9SR0JBX0JMVUVdID4+IDMpICsgMTsKCQkJCWluZCA9IElOREVYKGluciwgaW5nLCBpbmIpOwoJCQkJUWFkZFt5KndpZHRoICsgeF0gPSAoV09SRClpbmQ7CgkJCQkvLyBbaW5yXVtpbmddW2luYl0KCQkJCXZ3dFtpbmRdKys7CgkJCQl2bXJbaW5kXSArPSBiaXRzW0ZJX1JHQkFfUkVEXTsKCQkJCXZtZ1tpbmRdICs9IGJpdHNbRklfUkdCQV9HUkVFTl07CgkJCQl2bWJbaW5kXSArPSBiaXRzW0ZJX1JHQkFfQkxVRV07CgkJCQltMltpbmRdICs9IChmbG9hdCkodGFibGVbYml0c1tGSV9SR0JBX1JFRF1dICsgdGFibGVbYml0c1tGSV9SR0JBX0dSRUVOXV0gKyB0YWJsZVtiaXRzW0ZJX1JHQkFfQkxVRV1dKTsKCQkJCWJpdHMgKz0gNDsKCQkJfQoJCX0KCX0KCglpZiggUmVzZXJ2ZVNpemUgPiAwICkgewoJCWludCBtYXggPSAwOwoJCWZvcihpID0gMDsgaSA8IFNJWkVfM0Q7IGkrKykgewoJCQlpZiggdnd0W2ldID4gbWF4ICkgbWF4ID0gdnd0W2ldOwoJCX0KCQltYXgrKzsKCQlmb3IoaSA9IDA7IGkgPCBSZXNlcnZlU2l6ZTsgaSsrKSB7CgkJCWluciA9IChSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JSZWQgPj4gMykgKyAxOwoJCQlpbmcgPSAoUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiR3JlZW4gPj4gMykgKyAxOwoJCQlpbmIgPSAoUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiQmx1ZSA+PiAzKSArIDE7CgkJCWluZCA9IElOREVYKGluciwgaW5nLCBpbmIpOwoJCQl3dFtpbmRdID0gbWF4OwoJCQltcltpbmRdID0gbWF4ICogUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiUmVkOwoJCQltZ1tpbmRdID0gbWF4ICogUmVzZXJ2ZVBhbGV0dGVbaV0ucmdiR3JlZW47CgkJCW1iW2luZF0gPSBtYXggKiBSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JCbHVlOwoJCQlnbTJbaW5kXSA9IChmbG9hdCltYXggKiAoZmxvYXQpKHRhYmxlW1Jlc2VydmVQYWxldHRlW2ldLnJnYlJlZF0gKyB0YWJsZVtSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JHcmVlbl0gKyB0YWJsZVtSZXNlcnZlUGFsZXR0ZVtpXS5yZ2JCbHVlXSk7CgkJfQoJfQp9CgoKLy8gQXQgY29uY2x1c2lvbiBvZiB0aGUgaGlzdG9ncmFtIHN0ZXAsIHdlIGNhbiBpbnRlcnByZXQKLy8gd3Rbcl1bZ11bYl0gPSBzdW0gb3ZlciB2b3hlbCBvZiBQKGMpCi8vIG1yW3JdW2ddW2JdID0gc3VtIG92ZXIgdm94ZWwgb2YgcipQKGMpICAsICBzaW1pbGFybHkgZm9yIG1nLCBtYgovLyBtMltyXVtnXVtiXSA9IHN1bSBvdmVyIHZveGVsIG9mIGNeMipQKGMpCi8vIEFjdHVhbGx5IGVhY2ggb2YgdGhlc2Ugc2hvdWxkIGJlIGRpdmlkZWQgYnkgJ0ltYWdlU2l6ZScgdG8gZ2l2ZSB0aGUgdXN1YWwKLy8gaW50ZXJwcmV0YXRpb24gb2YgUCgpIGFzIHJhbmdpbmcgZnJvbSAwIHRvIDEsIGJ1dCB3ZSBuZWVkbid0IGRvIHRoYXQgaGVyZS4KCgovLyBXZSBub3cgY29udmVydCBoaXN0b2dyYW0gaW50byBtb21lbnRzIHNvIHRoYXQgd2UgY2FuIHJhcGlkbHkgY2FsY3VsYXRlCi8vIHRoZSBzdW1zIG9mIHRoZSBhYm92ZSBxdWFudGl0aWVzIG92ZXIgYW55IGRlc2lyZWQgYm94LgoKLy8gQ29tcHV0ZSBjdW11bGF0aXZlIG1vbWVudHMKdm9pZCAKV3VRdWFudGl6ZXI6Ok0zRChMT05HICp2d3QsIExPTkcgKnZtciwgTE9ORyAqdm1nLCBMT05HICp2bWIsIGZsb2F0ICptMikgewoJdW5zaWduZWQgaW5kMSwgaW5kMjsKCUJZVEUgaSwgciwgZywgYjsKCUxPTkcgbGluZSwgbGluZV9yLCBsaW5lX2csIGxpbmVfYjsKCUxPTkcgYXJlYVszM10sIGFyZWFfclszM10sIGFyZWFfZ1szM10sIGFyZWFfYlszM107CglmbG9hdCBsaW5lMiwgYXJlYTJbMzNdOwoKICAgIGZvcihyID0gMTsgciA8PSAzMjsgcisrKSB7CgkJZm9yKGkgPSAwOyBpIDw9IDMyOyBpKyspIHsKCQkJYXJlYTJbaV0gPSAwOwoJCQlhcmVhW2ldID0gYXJlYV9yW2ldID0gYXJlYV9nW2ldID0gYXJlYV9iW2ldID0gMDsKCQl9CgkJZm9yKGcgPSAxOyBnIDw9IDMyOyBnKyspIHsKCQkJbGluZTIgPSAwOwoJCQlsaW5lID0gbGluZV9yID0gbGluZV9nID0gbGluZV9iID0gMDsKCQkJZm9yKGIgPSAxOyBiIDw9IDMyOyBiKyspIHsJCQkgCgkJCQlpbmQxID0gSU5ERVgociwgZywgYik7IC8vIFtyXVtnXVtiXQoJCQkJbGluZSArPSB2d3RbaW5kMV07CgkJCQlsaW5lX3IgKz0gdm1yW2luZDFdOyAKCQkJCWxpbmVfZyArPSB2bWdbaW5kMV07IAoJCQkJbGluZV9iICs9IHZtYltpbmQxXTsKCQkJCWxpbmUyICs9IG0yW2luZDFdOwoJCQkJYXJlYVtiXSArPSBsaW5lOwoJCQkJYXJlYV9yW2JdICs9IGxpbmVfcjsKCQkJCWFyZWFfZ1tiXSArPSBsaW5lX2c7CgkJCQlhcmVhX2JbYl0gKz0gbGluZV9iOwoJCQkJYXJlYTJbYl0gKz0gbGluZTI7CgkJCQlpbmQyID0gaW5kMSAtIDEwODk7IC8vIFtyLTFdW2ddW2JdCgkJCQl2d3RbaW5kMV0gPSB2d3RbaW5kMl0gKyBhcmVhW2JdOwoJCQkJdm1yW2luZDFdID0gdm1yW2luZDJdICsgYXJlYV9yW2JdOwoJCQkJdm1nW2luZDFdID0gdm1nW2luZDJdICsgYXJlYV9nW2JdOwoJCQkJdm1iW2luZDFdID0gdm1iW2luZDJdICsgYXJlYV9iW2JdOwoJCQkJbTJbaW5kMV0gPSBtMltpbmQyXSArIGFyZWEyW2JdOwoJCQl9CgkJfQoJfQp9CgovLyBDb21wdXRlIHN1bSBvdmVyIGEgYm94IG9mIGFueSBnaXZlbiBzdGF0aXN0aWMKTE9ORyAKV3VRdWFudGl6ZXI6OlZvbCggQm94ICpjdWJlLCBMT05HICptbXQgKSB7CiAgICByZXR1cm4oIG1tdFtJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzEsIGN1YmUtPmIxKV0gCgkJICAtIG1tdFtJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzEsIGN1YmUtPmIwKV0KCQkgIC0gbW10W0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMCwgY3ViZS0+YjEpXQoJCSAgKyBtbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcwLCBjdWJlLT5iMCldCgkJICAtIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzEsIGN1YmUtPmIxKV0KCQkgICsgbW10W0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMSwgY3ViZS0+YjApXQoJCSAgKyBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBjdWJlLT5iMSldCgkJICAtIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzAsIGN1YmUtPmIwKV0gKTsKfQoKLy8gVGhlIG5leHQgdHdvIHJvdXRpbmVzIGFsbG93IGEgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgY2FsY3VsYXRpb24KLy8gb2YgVm9sKCkgZm9yIGEgcHJvcG9zZWQgc3ViYm94IG9mIGEgZ2l2ZW4gYm94LiAgVGhlIHN1bSBvZiBUb3AoKQovLyBhbmQgQm90dG9tKCkgaXMgdGhlIFZvbCgpIG9mIGEgc3ViYm94IHNwbGl0IGluIHRoZSBnaXZlbiBkaXJlY3Rpb24KLy8gYW5kIHdpdGggdGhlIHNwZWNpZmllZCBuZXcgdXBwZXIgYm91bmQuCgoKLy8gQ29tcHV0ZSBwYXJ0IG9mIFZvbChjdWJlLCBtbXQpIHRoYXQgZG9lc24ndCBkZXBlbmQgb24gcjEsIGcxLCBvciBiMQovLyAoZGVwZW5kaW5nIG9uIGRpcikKCkxPTkcgCld1UXVhbnRpemVyOjpCb3R0b20oQm94ICpjdWJlLCBCWVRFIGRpciwgTE9ORyAqbW10KSB7CiAgICBzd2l0Y2goZGlyKQoJewoJCWNhc2UgRklfUkdCQV9SRUQ6CgkJCXJldHVybiggLSBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcxLCBjdWJlLT5iMSldCgkJCQkgICAgKyBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcxLCBjdWJlLT5iMCldCgkJCQkJKyBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBjdWJlLT5iMSldCgkJCQkJLSBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBjdWJlLT5iMCldICk7CgkJCWJyZWFrOwoJCWNhc2UgRklfUkdCQV9HUkVFTjoKCQkJcmV0dXJuKCAtIG1tdFtJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzAsIGN1YmUtPmIxKV0KCQkJCSAgICArIG1tdFtJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzAsIGN1YmUtPmIwKV0KCQkJCQkrIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzAsIGN1YmUtPmIxKV0KCQkJCQktIG1tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzAsIGN1YmUtPmIwKV0gKTsKCQkJYnJlYWs7CgkJY2FzZSBGSV9SR0JBX0JMVUU6CgkJCXJldHVybiggLSBtbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcxLCBjdWJlLT5iMCldCgkJCQkgICAgKyBtbXRbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcwLCBjdWJlLT5iMCldCgkJCQkJKyBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcxLCBjdWJlLT5iMCldCgkJCQkJLSBtbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBjdWJlLT5iMCldICk7CgkJCWJyZWFrOwoJfQoKCXJldHVybiAwOwp9CgoKLy8gQ29tcHV0ZSByZW1haW5kZXIgb2YgVm9sKGN1YmUsIG1tdCksIHN1YnN0aXR1dGluZyBwb3MgZm9yCi8vIHIxLCBnMSwgb3IgYjEgKGRlcGVuZGluZyBvbiBkaXIpCgpMT05HIApXdVF1YW50aXplcjo6VG9wKEJveCAqY3ViZSwgQllURSBkaXIsIGludCBwb3MsIExPTkcgKm1tdCkgewogICAgc3dpdGNoKGRpcikKCXsKCQljYXNlIEZJX1JHQkFfUkVEOgoJCQlyZXR1cm4oIG1tdFtJTkRFWChwb3MsIGN1YmUtPmcxLCBjdWJlLT5iMSldIAoJCQkJICAgLW1tdFtJTkRFWChwb3MsIGN1YmUtPmcxLCBjdWJlLT5iMCldCgkJCQkgICAtbW10W0lOREVYKHBvcywgY3ViZS0+ZzAsIGN1YmUtPmIxKV0KCQkJCSAgICttbXRbSU5ERVgocG9zLCBjdWJlLT5nMCwgY3ViZS0+YjApXSApOwoJCQlicmVhazsKCQljYXNlIEZJX1JHQkFfR1JFRU46CgkJCXJldHVybiggbW10W0lOREVYKGN1YmUtPnIxLCBwb3MsIGN1YmUtPmIxKV0gCgkJCQkgICAtbW10W0lOREVYKGN1YmUtPnIxLCBwb3MsIGN1YmUtPmIwKV0KCQkJCSAgIC1tbXRbSU5ERVgoY3ViZS0+cjAsIHBvcywgY3ViZS0+YjEpXQoJCQkJICAgK21tdFtJTkRFWChjdWJlLT5yMCwgcG9zLCBjdWJlLT5iMCldICk7CgkJCWJyZWFrOwoJCWNhc2UgRklfUkdCQV9CTFVFOgoJCQlyZXR1cm4oIG1tdFtJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzEsIHBvcyldCgkJCQkgICAtbW10W0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMCwgcG9zKV0KCQkJCSAgIC1tbXRbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcxLCBwb3MpXQoJCQkJICAgK21tdFtJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzAsIHBvcyldICk7CgkJCWJyZWFrOwoJfQoKCXJldHVybiAwOwp9CgovLyBDb21wdXRlIHRoZSB3ZWlnaHRlZCB2YXJpYW5jZSBvZiBhIGJveCAKLy8gTkI6IGFzIHdpdGggdGhlIHJhdyBzdGF0aXN0aWNzLCB0aGlzIGlzIHJlYWxseSB0aGUgdmFyaWFuY2UgKiBJbWFnZVNpemUgCgpmbG9hdApXdVF1YW50aXplcjo6VmFyKEJveCAqY3ViZSkgewogICAgZmxvYXQgZHIgPSAoZmxvYXQpIFZvbChjdWJlLCBtcik7IAogICAgZmxvYXQgZGcgPSAoZmxvYXQpIFZvbChjdWJlLCBtZyk7IAogICAgZmxvYXQgZGIgPSAoZmxvYXQpIFZvbChjdWJlLCBtYik7CiAgICBmbG9hdCB4eCA9ICBnbTJbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcxLCBjdWJlLT5iMSldIAoJCQktZ20yW0lOREVYKGN1YmUtPnIxLCBjdWJlLT5nMSwgY3ViZS0+YjApXQoJCQkgLWdtMltJTkRFWChjdWJlLT5yMSwgY3ViZS0+ZzAsIGN1YmUtPmIxKV0KCQkJICtnbTJbSU5ERVgoY3ViZS0+cjEsIGN1YmUtPmcwLCBjdWJlLT5iMCldCgkJCSAtZ20yW0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMSwgY3ViZS0+YjEpXQoJCQkgK2dtMltJTkRFWChjdWJlLT5yMCwgY3ViZS0+ZzEsIGN1YmUtPmIwKV0KCQkJICtnbTJbSU5ERVgoY3ViZS0+cjAsIGN1YmUtPmcwLCBjdWJlLT5iMSldCgkJCSAtZ20yW0lOREVYKGN1YmUtPnIwLCBjdWJlLT5nMCwgY3ViZS0+YjApXTsKCiAgICByZXR1cm4gKHh4IC0gKGRyKmRyK2RnKmRnK2RiKmRiKS8oZmxvYXQpVm9sKGN1YmUsd3QpKTsgICAgCn0KCi8vIFdlIHdhbnQgdG8gbWluaW1pemUgdGhlIHN1bSBvZiB0aGUgdmFyaWFuY2VzIG9mIHR3byBzdWJib3hlcy4KLy8gVGhlIHN1bShjXjIpIHRlcm1zIGNhbiBiZSBpZ25vcmVkIHNpbmNlIHRoZWlyIHN1bSBvdmVyIGJvdGggc3ViYm94ZXMKLy8gaXMgdGhlIHNhbWUgKHRoZSBzdW0gZm9yIHRoZSB3aG9sZSBib3gpIG5vIG1hdHRlciB3aGVyZSB3ZSBzcGxpdC4KLy8gVGhlIHJlbWFpbmluZyB0ZXJtcyBoYXZlIGEgbWludXMgc2lnbiBpbiB0aGUgdmFyaWFuY2UgZm9ybXVsYSwKLy8gc28gd2UgZHJvcCB0aGUgbWludXMgc2lnbiBhbmQgTUFYSU1JWkUgdGhlIHN1bSBvZiB0aGUgdHdvIHRlcm1zLgoKZmxvYXQKV3VRdWFudGl6ZXI6Ok1heGltaXplKEJveCAqY3ViZSwgQllURSBkaXIsIGludCBmaXJzdCwgaW50IGxhc3QgLCBpbnQgKmN1dCwgTE9ORyB3aG9sZV9yLCBMT05HIHdob2xlX2csIExPTkcgd2hvbGVfYiwgTE9ORyB3aG9sZV93KSB7CglMT05HIGhhbGZfciwgaGFsZl9nLCBoYWxmX2IsIGhhbGZfdzsKCWludCBpOwoJZmxvYXQgdGVtcDsKCiAgICBMT05HIGJhc2VfciA9IEJvdHRvbShjdWJlLCBkaXIsIG1yKTsKICAgIExPTkcgYmFzZV9nID0gQm90dG9tKGN1YmUsIGRpciwgbWcpOwogICAgTE9ORyBiYXNlX2IgPSBCb3R0b20oY3ViZSwgZGlyLCBtYik7CiAgICBMT05HIGJhc2VfdyA9IEJvdHRvbShjdWJlLCBkaXIsIHd0KTsKCiAgICBmbG9hdCBtYXggPSAwLjA7CgogICAgKmN1dCA9IC0xOwoKICAgIGZvciAoaSA9IGZpcnN0OyBpIDwgbGFzdDsgaSsrKSB7CgkJaGFsZl9yID0gYmFzZV9yICsgVG9wKGN1YmUsIGRpciwgaSwgbXIpOwoJCWhhbGZfZyA9IGJhc2VfZyArIFRvcChjdWJlLCBkaXIsIGksIG1nKTsKCQloYWxmX2IgPSBiYXNlX2IgKyBUb3AoY3ViZSwgZGlyLCBpLCBtYik7CgkJaGFsZl93ID0gYmFzZV93ICsgVG9wKGN1YmUsIGRpciwgaSwgd3QpOwoKICAgICAgICAvLyBub3cgaGFsZl94IGlzIHN1bSBvdmVyIGxvd2VyIGhhbGYgb2YgYm94LCBpZiBzcGxpdCBhdCBpCgoJCWlmIChoYWxmX3cgPT0gMCkgewkJLy8gc3ViYm94IGNvdWxkIGJlIGVtcHR5IG9mIHBpeGVscyEKCQkJY29udGludWU7CQkJLy8gbmV2ZXIgc3BsaXQgaW50byBhbiBlbXB0eSBib3gKCQl9IGVsc2UgewoJCQl0ZW1wID0gKChmbG9hdCloYWxmX3IqaGFsZl9yICsgKGZsb2F0KWhhbGZfZypoYWxmX2cgKyAoZmxvYXQpaGFsZl9iKmhhbGZfYikvaGFsZl93OwoJCX0KCgkJaGFsZl9yID0gd2hvbGVfciAtIGhhbGZfcjsKCQloYWxmX2cgPSB3aG9sZV9nIC0gaGFsZl9nOwoJCWhhbGZfYiA9IHdob2xlX2IgLSBoYWxmX2I7CgkJaGFsZl93ID0gd2hvbGVfdyAtIGhhbGZfdzsKCiAgICAgICAgaWYgKGhhbGZfdyA9PSAwKSB7CQkvLyBzdWJib3ggY291bGQgYmUgZW1wdHkgb2YgcGl4ZWxzIQoJCQljb250aW51ZTsJCQkvLyBuZXZlciBzcGxpdCBpbnRvIGFuIGVtcHR5IGJveAoJCX0gZWxzZSB7CgkJCXRlbXAgKz0gKChmbG9hdCloYWxmX3IqaGFsZl9yICsgKGZsb2F0KWhhbGZfZypoYWxmX2cgKyAoZmxvYXQpaGFsZl9iKmhhbGZfYikvaGFsZl93OwoJCX0KCiAgICAJaWYgKHRlbXAgPiBtYXgpIHsKCQkJbWF4PXRlbXA7CgkJCSpjdXQ9aTsKCQl9CiAgICB9CgogICAgcmV0dXJuIG1heDsKfQoKYm9vbApXdVF1YW50aXplcjo6Q3V0KEJveCAqc2V0MSwgQm94ICpzZXQyKSB7CglCWVRFIGRpcjsKCWludCBjdXRyLCBjdXRnLCBjdXRiOwoKICAgIExPTkcgd2hvbGVfciA9IFZvbChzZXQxLCBtcik7CiAgICBMT05HIHdob2xlX2cgPSBWb2woc2V0MSwgbWcpOwogICAgTE9ORyB3aG9sZV9iID0gVm9sKHNldDEsIG1iKTsKICAgIExPTkcgd2hvbGVfdyA9IFZvbChzZXQxLCB3dCk7CgogICAgZmxvYXQgbWF4ciA9IE1heGltaXplKHNldDEsIEZJX1JHQkFfUkVELCBzZXQxLT5yMCsxLCBzZXQxLT5yMSwgJmN1dHIsIHdob2xlX3IsIHdob2xlX2csIHdob2xlX2IsIHdob2xlX3cpOyAgICAKCWZsb2F0IG1heGcgPSBNYXhpbWl6ZShzZXQxLCBGSV9SR0JBX0dSRUVOLCBzZXQxLT5nMCsxLCBzZXQxLT5nMSwgJmN1dGcsIHdob2xlX3IsIHdob2xlX2csIHdob2xlX2IsIHdob2xlX3cpOyAgICAKCWZsb2F0IG1heGIgPSBNYXhpbWl6ZShzZXQxLCBGSV9SR0JBX0JMVUUsIHNldDEtPmIwKzEsIHNldDEtPmIxLCAmY3V0Yiwgd2hvbGVfciwgd2hvbGVfZywgd2hvbGVfYiwgd2hvbGVfdyk7CgogICAgaWYgKChtYXhyID49IG1heGcpICYmIChtYXhyID49IG1heGIpKSB7CgkJZGlyID0gRklfUkdCQV9SRUQ7CgoJCWlmIChjdXRyIDwgMCkgewoJCQlyZXR1cm4gZmFsc2U7IC8vIGNhbid0IHNwbGl0IHRoZSBib3gKCQl9CiAgICB9IGVsc2UgaWYgKChtYXhnID49IG1heHIpICYmIChtYXhnPj1tYXhiKSkgewoJCWRpciA9IEZJX1JHQkFfR1JFRU47Cgl9IGVsc2UgewoJCWRpciA9IEZJX1JHQkFfQkxVRTsKCX0KCglzZXQyLT5yMSA9IHNldDEtPnIxOwogICAgc2V0Mi0+ZzEgPSBzZXQxLT5nMTsKICAgIHNldDItPmIxID0gc2V0MS0+YjE7CgogICAgc3dpdGNoIChkaXIpIHsKCQljYXNlIEZJX1JHQkFfUkVEOgoJCQlzZXQyLT5yMCA9IHNldDEtPnIxID0gY3V0cjsKCQkJc2V0Mi0+ZzAgPSBzZXQxLT5nMDsKCQkJc2V0Mi0+YjAgPSBzZXQxLT5iMDsKCQkJYnJlYWs7CgoJCWNhc2UgRklfUkdCQV9HUkVFTjoKCQkJc2V0Mi0+ZzAgPSBzZXQxLT5nMSA9IGN1dGc7CgkJCXNldDItPnIwID0gc2V0MS0+cjA7CgkJCXNldDItPmIwID0gc2V0MS0+YjA7CgkJCWJyZWFrOwoKCQljYXNlIEZJX1JHQkFfQkxVRToKCQkJc2V0Mi0+YjAgPSBzZXQxLT5iMSA9IGN1dGI7CgkJCXNldDItPnIwID0gc2V0MS0+cjA7CgkJCXNldDItPmcwID0gc2V0MS0+ZzA7CgkJCWJyZWFrOwogICAgfQoKICAgIHNldDEtPnZvbCA9IChzZXQxLT5yMS1zZXQxLT5yMCkqKHNldDEtPmcxLXNldDEtPmcwKSooc2V0MS0+YjEtc2V0MS0+YjApOwogICAgc2V0Mi0+dm9sID0gKHNldDItPnIxLXNldDItPnIwKSooc2V0Mi0+ZzEtc2V0Mi0+ZzApKihzZXQyLT5iMS1zZXQyLT5iMCk7CgogICAgcmV0dXJuIHRydWU7Cn0KCgp2b2lkCld1UXVhbnRpemVyOjpNYXJrKEJveCAqY3ViZSwgaW50IGxhYmVsLCBCWVRFICp0YWcpIHsKICAgIGZvciAoaW50IHIgPSBjdWJlLT5yMCArIDE7IHIgPD0gY3ViZS0+cjE7IHIrKykgewoJCWZvciAoaW50IGcgPSBjdWJlLT5nMCArIDE7IGcgPD0gY3ViZS0+ZzE7IGcrKykgewoJCQlmb3IgKGludCBiID0gY3ViZS0+YjAgKyAxOyBiIDw9IGN1YmUtPmIxOyBiKyspIHsKCQkJCXRhZ1tJTkRFWChyLCBnLCBiKV0gPSAoQllURSlsYWJlbDsKCQkJfQoJCX0KCX0KfQoKLy8gV3UgUXVhbnRpemF0aW9uIGFsZ29yaXRobQpGSUJJVE1BUCAqCld1UXVhbnRpemVyOjpRdWFudGl6ZShpbnQgUGFsZXR0ZVNpemUsIGludCBSZXNlcnZlU2l6ZSwgUkdCUVVBRCAqUmVzZXJ2ZVBhbGV0dGUpIHsKCUJZVEUgKnRhZyA9IE5VTEw7CgoJdHJ5IHsKCQlCb3gJY3ViZVtNQVhDT0xPUl07CgkJaW50CW5leHQ7CgkJTE9ORyBpLCB3ZWlnaHQ7CgkJaW50IGs7CgkJZmxvYXQgdnZbTUFYQ09MT1JdLCB0ZW1wOwoJCQoJCS8vIENvbXB1dGUgM0QgaGlzdG9ncmFtCgoJCUhpc3QzRCh3dCwgbXIsIG1nLCBtYiwgZ20yLCBSZXNlcnZlU2l6ZSwgUmVzZXJ2ZVBhbGV0dGUpOwoKCQkvLyBDb21wdXRlIG1vbWVudHMKCgkJTTNEKHd0LCBtciwgbWcsIG1iLCBnbTIpOwoKCQljdWJlWzBdLnIwID0gY3ViZVswXS5nMCA9IGN1YmVbMF0uYjAgPSAwOwoJCWN1YmVbMF0ucjEgPSBjdWJlWzBdLmcxID0gY3ViZVswXS5iMSA9IDMyOwoJCW5leHQgPSAwOwoKCQlmb3IgKGkgPSAxOyBpIDwgUGFsZXR0ZVNpemU7IGkrKykgewoJCQlpZihDdXQoJmN1YmVbbmV4dF0sICZjdWJlW2ldKSkgewoJCQkJLy8gdm9sdW1lIHRlc3QgZW5zdXJlcyB3ZSB3b24ndCB0cnkgdG8gY3V0IG9uZS1jZWxsIGJveAoJCQkJdnZbbmV4dF0gPSAoY3ViZVtuZXh0XS52b2wgPiAxKSA/IFZhcigmY3ViZVtuZXh0XSkgOiAwOwoJCQkJdnZbaV0gPSAoY3ViZVtpXS52b2wgPiAxKSA/IFZhcigmY3ViZVtpXSkgOiAwOwoJCQl9IGVsc2UgewoJCQkJICB2dltuZXh0XSA9IDAuMDsgICAvLyBkb24ndCB0cnkgdG8gc3BsaXQgdGhpcyBib3ggYWdhaW4KCQkJCSAgaS0tOyAgICAgICAgICAgICAgLy8gZGlkbid0IGNyZWF0ZSBib3ggaQoJCQl9CgoJCQluZXh0ID0gMDsgdGVtcCA9IHZ2WzBdOwoKCQkJZm9yIChrID0gMTsgayA8PSBpOyBrKyspIHsKCQkJCWlmICh2dltrXSA+IHRlbXApIHsKCQkJCQl0ZW1wID0gdnZba107IG5leHQgPSBrOwoJCQkJfQoJCQl9CgoJCQlpZiAodGVtcCA8PSAwLjApIHsKCQkJCSAgUGFsZXR0ZVNpemUgPSBpICsgMTsKCgkJCQkgIC8vIEVycm9yOiAiT25seSBnb3QgJ1BhbGV0dGVTaXplJyBib3hlcyIKCgkJCQkgIGJyZWFrOwoJCQl9CgkJfQoKCQkvLyBQYXJ0aXRpb24gZG9uZQoKCQkvLyB0aGUgc3BhY2UgZm9yIGFycmF5IGdtMiBjYW4gYmUgZnJlZWQgbm93CgoJCWZyZWUoZ20yKTsKCgkJZ20yID0gTlVMTDsKCgkJLy8gQWxsb2NhdGUgYSBuZXcgZGliCgoJCUZJQklUTUFQICpuZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDgpOwoKCQlpZiAobmV3X2RpYiA9PSBOVUxMKSB7CgkJCXRocm93IEZJX01TR19FUlJPUl9NRU1PUlk7CgkJfQoKCQkvLyBjcmVhdGUgYW4gb3B0aW1pemVkIHBhbGV0dGUKCgkJUkdCUVVBRCAqbmV3X3BhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKG5ld19kaWIpOwoKCQl0YWcgPSAoQllURSopIG1hbGxvYyhTSVpFXzNEICogc2l6ZW9mKEJZVEUpKTsKCQlpZiAodGFnID09IE5VTEwpIHsKCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKCQl9CgkJbWVtc2V0KHRhZywgMCwgU0laRV8zRCAqIHNpemVvZihCWVRFKSk7CgoJCWZvciAoayA9IDA7IGsgPCBQYWxldHRlU2l6ZSA7IGsrKykgewoJCQlNYXJrKCZjdWJlW2tdLCBrLCB0YWcpOwoJCQl3ZWlnaHQgPSBWb2woJmN1YmVba10sIHd0KTsKCgkJCWlmICh3ZWlnaHQpIHsKCQkJCW5ld19wYWxba10ucmdiUmVkCT0gKEJZVEUpKCgoZmxvYXQpVm9sKCZjdWJlW2tdLCBtcikgLyAoZmxvYXQpd2VpZ2h0KSArIDAuNWYpOwoJCQkJbmV3X3BhbFtrXS5yZ2JHcmVlbiA9IChCWVRFKSgoKGZsb2F0KVZvbCgmY3ViZVtrXSwgbWcpIC8gKGZsb2F0KXdlaWdodCkgKyAwLjVmKTsKCQkJCW5ld19wYWxba10ucmdiQmx1ZQk9IChCWVRFKSgoKGZsb2F0KVZvbCgmY3ViZVtrXSwgbWIpIC8gKGZsb2F0KXdlaWdodCkgKyAwLjVmKTsKCQkJfSBlbHNlIHsKCQkJCS8vIEVycm9yOiBib2d1cyBib3ggJ2snCgoJCQkJbmV3X3BhbFtrXS5yZ2JSZWQgPSBuZXdfcGFsW2tdLnJnYkdyZWVuID0gbmV3X3BhbFtrXS5yZ2JCbHVlID0gMDsJCQoJCQl9CgkJfQoKCQlpbnQgbnBpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKG5ld19kaWIpOwoKCQlmb3IgKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKCQkJQllURSAqbmV3X2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhuZXdfZGliKSArICh5ICogbnBpdGNoKTsKCgkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCQluZXdfYml0c1t4XSA9IHRhZ1tRYWRkW3kqd2lkdGggKyB4XV07CgkJCX0KCQl9CgoJCS8vIG91dHB1dCAnbmV3X3BhbCcgYXMgY29sb3IgbG9vay11cCB0YWJsZSBjb250ZW50cywKCQkvLyAnbmV3X2JpdHMnIGFzIHRoZSBxdWFudGl6ZWQgaW1hZ2UgKGFycmF5IG9mIHRhYmxlIGFkZHJlc3NlcykuCgoJCWZyZWUodGFnKTsKCgkJcmV0dXJuIChGSUJJVE1BUCopIG5ld19kaWI7Cgl9IGNhdGNoKC4uLikgewoJCWZyZWUodGFnKTsKCX0KCglyZXR1cm4gTlVMTDsKfQo=