LyoKICogQ29weXJpZ2h0IDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICiNkZWZpbmUgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICgovKiBNQVkgTk9UIENPTlRBSU4gWDExIG9yIERHQSBzcGVjaWZpYyBpbmNsdWRlcy9kZWZpbmVzL3N0cnVjdHMhICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid3R5cGVzLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkZHJhd2kuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkY29taW1wbC5oIgoKI2luY2x1ZGUgIndpbmUvd2luZWQzZF9pbnRlcmZhY2UuaCIKI2luY2x1ZGUgIndpbmUvbGlzdC5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElQYXJlbnQgLSBhIGhlbHBlciBpbnRlcmZhY2UKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpERUZJTkVfR1VJRChJSURfSVBhcmVudCwgMHhjMjBlNGM4OCwgMHg3NGU3LCAweDQ5NDAsIDB4YmEsIDB4OWYsIDB4MmUsIDB4MzIsIDB4M2YsIDB4OWQsIDB4YzksIDB4ODEpOwp0eXBlZGVmIHN0cnVjdCBJUGFyZW50ICpMUFBBUkVOVCwgKlBQQVJFTlQ7CgojZGVmaW5lIElOVEVSRkFDRSBJUGFyZW50CkRFQ0xBUkVfSU5URVJGQUNFXyhJUGFyZW50LElVbmtub3duKQp7CiAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwogICAgU1RETUVUSE9EXyhIUkVTVUxULFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iamVjdCkgUFVSRTsKICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOwogICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOwp9OwojdW5kZWYgSU5URVJGQUNFCgojaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkKLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KI2RlZmluZSBJUGFyZW50X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpCiNkZWZpbmUgSVBhcmVudF9BZGRSZWYocCkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkFkZFJlZihwKQojZGVmaW5lIElQYXJlbnRfUmVsZWFzZShwKSAgICAgICAgICAgIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApCiNlbmRpZgoKCi8qIFR5cGRlZiB0aGUgaW50ZXJmYWNlcyAqLwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICBJRGlyZWN0RHJhd0ltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwgICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZUltcGwgICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzRERldmljZUltcGwgICAgICAgIElEaXJlY3QzRERldmljZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzRExpZ2h0SW1wbCAgICAgICAgIElEaXJlY3QzRExpZ2h0SW1wbDsKdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVmlld3BvcnRJbXBsICAgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RNYXRlcmlhbEltcGwgICAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsOwp0eXBlZGVmIHN0cnVjdCBJUGFyZW50SW1wbCAgICAgICAgICAgICAgICBJUGFyZW50SW1wbDsKCi8qIENhbGxiYWNrcyBmb3IgaW1wbGljaXQgb2JqZWN0IGRlc3RydWN0aW9uICovCmV4dGVybiBVTE9ORyBXSU5BUEkgRDNEN0NCX0Rlc3Ryb3lTd2FwQ2hhaW4oSVdpbmVEM0RTd2FwQ2hhaW4gKnBTd2FwQ2hhaW4pOwoKZXh0ZXJuIFVMT05HIFdJTkFQSSBEM0Q3Q0JfRGVzdHJveURlcHRoU3RlbmNpbFN1cmZhY2UoSVdpbmVEM0RTdXJmYWNlICpwU3VyZmFjZSk7CgovKiBHbG9iYWwgY3JpdGljYWwgc2VjdGlvbiAqLwpleHRlcm4gQ1JJVElDQUxfU0VDVElPTiBkZHJhd19jczsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhdyBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgRnZmVG9EZWNsCnsKICAgIERXT1JEIGZ2ZjsKICAgIElXaW5lRDNEVmVydGV4RGVjbGFyYXRpb24gKmRlY2w7Cn07CgpzdHJ1Y3QgSURpcmVjdERyYXdJbXBsCnsKICAgIC8qIElVbmtub3duIGZpZWxkcyAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXc3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3NCk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhdzMpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXcyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRDcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEMyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0QyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRCk7CgogICAgLyogU2VlIGNvbW1lbnQgaW4gSURpcmVjdERyYXc6OkFkZFJlZiAqLwogICAgTE9ORyAgICAgICAgICAgICAgICAgICAgcmVmNywgcmVmNCwgcmVmMiwgcmVmMywgcmVmMSwgbnVtSWZhY2VzOwoKICAgIC8qIFdpbmVEM0QgbGlua2FnZSAqLwogICAgSVdpbmVEM0QgICAgICAgICAgICAgICAgKndpbmVEM0Q7CiAgICBJV2luZUQzRERldmljZSAgICAgICAgICAqd2luZUQzRERldmljZTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpEZXB0aFN0ZW5jaWxCdWZmZXI7CiAgICBCT09MICAgICAgICAgICAgICAgICAgICBkM2RfaW5pdGlhbGl6ZWQ7CgogICAgLyogTWlzYyBkZHJhdyBmaWVsZHMgKi8KICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHRvdGFsX3ZpZG1lbTsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGN1cl9zY2FubGluZTsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGZha2VfdmJsYW5rOwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQ7CgogICAgLyogRGlyZWN0RHJhdyB0aGluZ3MsIHdoaWNoIGFyZSBub3QgaGFuZGxlZCBieSBXaW5lRDNEICovCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZV9sZXZlbDsKCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodDsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgIG9yaWdfYnBwOwoKICAgIEREQ0FQUyAgICAgICAgICAgICAgICAgIGNhcHM7CgogICAgLyogRDNEIHRoaW5ncyAqLwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKmQzZF90YXJnZXQ7CiAgICBIV05EICAgICAgICAgICAgICAgICAgICBkM2Rfd2luZG93OwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAgICAgKmQzZGRldmljZTsKICAgIGludCAgICAgICAgICAgICAgICAgICAgIGQzZHZlcnNpb247CgogICAgLyogVmFyaW91cyBIV05EcyAqLwogICAgSFdORCAgICAgICAgICAgICAgICAgICAgZm9jdXN3aW5kb3c7CiAgICBIV05EICAgICAgICAgICAgICAgICAgICBkZXZpY2V3aW5kb3c7CgogICAgLyogVGhlIHN1cmZhY2UgdHlwZSB0byByZXF1ZXN0ICovCiAgICBXSU5FRDNEU1VSRlRZUEUgICAgICAgICBJbXBsVHlwZTsKCgogICAgLyogT3VyIHByaXZhdGUgd2luZG93IGNsYXNzICovCiAgICBjaGFyIGNsYXNzbmFtZVszMl07CiAgICBXTkRDTEFTU0Egd25kX2NsYXNzOwoKICAgIC8qIEhlbHBlcnMgZm9yIHN1cmZhY2UgY3JlYXRpb24gKi8KICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnRleF9yb290OwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgZGVwdGhzdGVuY2lsOwoKICAgIC8qIEZvciB0aGUgZGxsIHVubG9hZCBjbGVhbnVwIGNvZGUgKi8KICAgIHN0cnVjdCBsaXN0IGRkcmF3X2xpc3RfZW50cnk7CiAgICAvKiBUaGUgc3VyZmFjZSBsaXN0IC0gY2FuJ3QgcmVsYXkgdGhpcyB0byBXaW5lRDNECiAgICAgKiBiZWNhdXNlIG9mIElQYXJlbnQKICAgICAqLwogICAgc3RydWN0IGxpc3Qgc3VyZmFjZV9saXN0OwogICAgTE9ORyBzdXJmYWNlczsKCiAgICAvKiBGVkYgbWFuYWdlbWVudCAqLwogICAgc3RydWN0IEZ2ZlRvRGVjbCAgICAgICAqZGVjbHM7CiAgICBVSU5UICAgICAgICAgICAgICAgICAgICBudW1Db252ZXJ0ZWREZWNscywgZGVjbEFycmF5U2l6ZTsKfTsKCi8qIERlY2xhcmUgdGhlIFZUYWJsZXMuIFRoZXkgY2FuIGJlIGZvdW5kIGRkcmF3LmMgKi8KY29uc3QgSURpcmVjdERyYXc3VnRibCBJRGlyZWN0RHJhdzdfVnRibDsKY29uc3QgSURpcmVjdERyYXc0VnRibCBJRGlyZWN0RHJhdzRfVnRibDsKY29uc3QgSURpcmVjdERyYXczVnRibCBJRGlyZWN0RHJhdzNfVnRibDsKY29uc3QgSURpcmVjdERyYXcyVnRibCBJRGlyZWN0RHJhdzJfVnRibDsKY29uc3QgSURpcmVjdERyYXdWdGJsICBJRGlyZWN0RHJhdzFfVnRibDsKCi8qIEhlbHBlciBzdHJ1Y3R1cmVzICovCnR5cGVkZWYgc3RydWN0IEVudW1EaXNwbGF5TW9kZXNDQlMKewogICAgdm9pZCAqY29udGV4dDsKICAgIExQRERFTlVNTU9ERVNDQUxMQkFDSzIgY2FsbGJhY2s7Cn0gRW51bURpc3BsYXlNb2Rlc0NCUzsKCnR5cGVkZWYgc3RydWN0IEVudW1TdXJmYWNlc0NCUwp7CiAgICB2b2lkICpjb250ZXh0OwogICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYWxsYmFjazsKICAgIExQRERTVVJGQUNFREVTQzIgcEREU0Q7CiAgICBEV09SRCBGbGFnczsKfSBFbnVtU3VyZmFjZXNDQlM7CgovKiBVdGlsaXR5IGZ1bmN0aW9ucyAqLwp2b2lkCkREUkFXX0NvbnZlcnRfRERTQ0FQU18xX1RvXzIoY29uc3QgRERTQ0FQUyogcEluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU0NBUFMyKiBwT3V0KTsKdm9pZApERFJBV19Db252ZXJ0X0REREVWSUNFSURFTlRJRklFUl8yX1RvXzEoY29uc3QgRERERVZJQ0VJREVOVElGSUVSMiogcEluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERERVZJQ0VJREVOVElGSUVSKiBwT3V0KTsKdm9pZApJRGlyZWN0RHJhd0ltcGxfRGVzdHJveShJRGlyZWN0RHJhd0ltcGwgKlRoaXMpOwoKSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdJbXBsX1JlY3JlYXRlU3VyZmFjZXNDYWxsYmFjayhJRGlyZWN0RHJhd1N1cmZhY2U3ICpzdXJmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU1VSRkFDRURFU0MyICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpOwpJV2luZUQzRFZlcnRleERlY2xhcmF0aW9uICoKSURpcmVjdERyYXdJbXBsX0ZpbmREZWNsKElEaXJlY3REcmF3SW1wbCAqVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZ2Zik7CgovKiBUaGUgZGVmYXVsdCBzdXJmYWNlIHR5cGUgKi8KZXh0ZXJuIFdJTkVEM0RTVVJGVFlQRSBEZWZhdWx0U3VyZmFjZVR5cGU7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlSW1wbAp7CiAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3U3VyZmFjZTcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXdTdXJmYWNlMyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd0dhbW1hQ29udHJvbCk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RUZXh0dXJlMik7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RUZXh0dXJlKTsKCiAgICBMT05HICAgICAgICAgICAgICAgICAgICAgcmVmOwogICAgSVVua25vd24gICAgICAgICAgICAgICAgKmlmYWNlVG9SZWxlYXNlOwoKICAgIGludCAgICAgICAgICAgICAgICAgICAgIHZlcnNpb247CgogICAgLyogQ29ubmVjdGlvbnMgdG8gb3RoZXIgT2JqZWN0cyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgKmRkcmF3OwogICAgSVdpbmVEM0RTdXJmYWNlICAgICAgICAgKldpbmVEM0RTdXJmYWNlOwogICAgSVdpbmVEM0RCYXNlVGV4dHVyZSAgICAgKndpbmVEM0RUZXh0dXJlOwoKICAgIC8qIFRoaXMgaW1wbGVtZW50YXRpb24gaGFuZGxlcyBhdHRhY2hpbmcgc3VyZmFjZXMgdG8gb3RoZXIgc3VyZmFjZXMgKi8KICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpuZXh0X2F0dGFjaGVkOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKmZpcnN0X2F0dGFjaGVkOwoKICAgIC8qIENvbXBsZXggc3VyZmFjZXMgYXJlIG9yZ2FuaXplZCBpbiBhIHRyZWUsIGFsdGhvdWdoIHRoZSB0cmVlIGlzIGRlZ2VuZXJhdGVkIHRvIGEgbGlzdCBpbiBtb3N0IGNhc2VzLgogICAgICogSW4gbWlwbWFwIGFuZCBwcmltYXJ5IHN1cmZhY2VzIGVhY2ggbGV2ZWwgaGFzIG9ubHkgb25lIGF0dGFjaG1lbnQsIHdoaWNoIGlzIHRoZSBuZXh0IHN1cmZhY2UgbGV2ZWwuCiAgICAgKiBPbmx5IHRoZSBjdWJlIHRleHR1cmUgcm9vdCBoYXMgNiBzdXJmYWNlcyBhdHRhY2hlZCwgd2hpY2ggdGhlbiBoYXZlIGEgbm9ybWFsIG1pcG1hcCBjaGFpbiBhdHRhY2hlZAogICAgICogdG8gdGhlbS4gU28gaGFyZGNvZGUgdGhlIGFycmF5IHRvIDYsIGEgZHluYW1pYyBhcnJheSBvciBhIGxpc3Qgd291bGQgYmUgYW4gb3ZlcmtpbGwuCiAgICAgKi8KI2RlZmluZSBNQVhfQ09NUExFWF9BVFRBQ0hFRCA2CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqY29tcGxleF9hcnJheVtNQVhfQ09NUExFWF9BVFRBQ0hFRF07CiAgICAvKiBZb3UgY2FuJ3QgdHJhdmVyc2UgdGhlIHRyZWUgdXB3YXJkcy4gT25seSBhIGZsYWcgZm9yIFN1cmZhY2U6OlJlbGVhc2UgYmVjYXVzZSBpdHMgbmVlZGVkIHRoZXJlLAogICAgICogYnV0IG5vIHBvaW50ZXIgdG8gcHJldmVudCB0ZW1wdGF0aW9ucyB0byB0cmF2ZXJzZSBpdCBpbiB0aGUgd3JvbmcgZGlyZWN0aW9uLgogICAgICovCiAgICBCT09MICAgICAgICAgICAgICAgICAgICBpc19jb21wbGV4X3Jvb3Q7CgogICAgLyogU3VyZmFjZSBkZXNjcmlwdGlvbiwgZm9yIEdldEF0dGFjaGVkU3VyZmFjZSAqLwogICAgRERTVVJGQUNFREVTQzIgICAgICAgICAgc3VyZmFjZV9kZXNjOwoKICAgIC8qIE1pc2MgdGhpbmdzICovCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICB1bmlxdWVuZXNzX3ZhbHVlOwogICAgVUlOVCAgICAgICAgICAgICAgICAgICAgbWlwbWFwX2xldmVsOwogICAgV0lORUQzRFNVUkZUWVBFICAgICAgICAgSW1wbFR5cGU7CgogICAgLyogRm9yIEQzRERldmljZSBjcmVhdGlvbiAqLwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgaXNSZW5kZXJUYXJnZXQ7CgogICAgLyogQ2xpcHBlciBvYmplY3RzICovCiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICAqY2xpcHBlcjsKCiAgICAvKiBGb3IgdGhlIGRkcmF3IHN1cmZhY2UgbGlzdCAqLwogICAgc3RydWN0IGxpc3QgICAgICAgICAgICAgc3VyZmFjZV9saXN0X2VudHJ5OwoKICAgIERXT1JEICAgICAgICAgICAgICAgICAgIEhhbmRsZTsKfTsKCi8qIFZUYWJsZSBkZWNsYXJhdGlvbi4gSXQncyBsb2NhdGVkIGluIHN1cmZhY2UuYyAvIHN1cmZhY2VfdGh1bmtzLmMgKi8KY29uc3QgSURpcmVjdERyYXdTdXJmYWNlN1Z0YmwgSURpcmVjdERyYXdTdXJmYWNlN19WdGJsOwpjb25zdCBJRGlyZWN0RHJhd1N1cmZhY2UzVnRibCBJRGlyZWN0RHJhd1N1cmZhY2UzX1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3R2FtbWFDb250cm9sVnRibCBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9WdGJsOwpjb25zdCBJRGlyZWN0M0RUZXh0dXJlMlZ0YmwgSURpcmVjdDNEVGV4dHVyZTJfVnRibDsKY29uc3QgSURpcmVjdDNEVGV4dHVyZVZ0YmwgSURpcmVjdDNEVGV4dHVyZTFfVnRibDsKCkhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZUltcGxfQWRkQXR0YWNoZWRTdXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMsIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlN1cmYpOwp2b2lkIElEaXJlY3REcmF3U3VyZmFjZUltcGxfRGVzdHJveShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzKTsKCi8qIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbCBmb3IgYSBnaXZlbiBzdXJmYWNlICovCiNkZWZpbmUgUEZHRVRfQlBQKHBmKSAocGYuZHdGbGFncyZERFBGX1BBTEVUVEVJTkRFWEVEOD8xOigocGYuZHdSR0JCaXRDb3VudCs3KS84KSkKI2RlZmluZSBHRVRfQlBQKGRlc2MpIFBGR0VUX0JQUChkZXNjLmRkcGZQaXhlbEZvcm1hdCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJUGFyZW50IEltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElQYXJlbnRJbXBsCnsKICAgIC8qIElVbmtub3duIGZpZWxkcyAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSVBhcmVudCk7CiAgICBMT05HICAgICAgICAgICAgICAgICAgICByZWY7CgogICAgLyogSVBhcmVudEltcGwgZmllbGRzICovCiAgICBJVW5rbm93biAgICAgICpjaGlsZDsKCn07Cgpjb25zdCBJUGFyZW50VnRibCBJUGFyZW50X1Z0Ymw7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERGV2aWNlIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBlbnVtCnsKICAgIEREcmF3SGFuZGxlX1Vua25vd24gICAgICAgPSAwLAogICAgRERyYXdIYW5kbGVfVGV4dHVyZSAgICAgICA9IDEsCiAgICBERHJhd0hhbmRsZV9NYXRlcmlhbCAgICAgID0gMiwKICAgIEREcmF3SGFuZGxlX01hdHJpeCAgICAgICAgPSAzLAogICAgRERyYXdIYW5kbGVfU3RhdGVCbG9jayAgICA9IDQKfSBERHJhd0hhbmRsZVR5cGVzOwoKc3RydWN0IEhhbmRsZUVudHJ5CnsKICAgIHZvaWQgICAgKnB0cjsKICAgIEREcmF3SGFuZGxlVHlwZXMgICAgICB0eXBlOwp9OwoKc3RydWN0IElEaXJlY3QzRERldmljZUltcGwKewogICAgLyogSVVua25vd24gKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRERldmljZTcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlMyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0REZXZpY2UyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRERldmljZSk7CiAgICBMT05HICAgICAgICAgICAgICAgICAgICByZWY7CgogICAgLyogT3RoZXIgb2JqZWN0IGNvbm5lY3Rpb25zICovCiAgICBJV2luZUQzRERldmljZSAgICAgICAgICAqd2luZUQzRERldmljZTsKICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICpkZHJhdzsKICAgIElXaW5lRDNESW5kZXhCdWZmZXIgICAgICppbmRleGJ1ZmZlcjsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICp0YXJnZXQ7CiAgICBCT09MICAgICAgICAgICAgICAgICAgICBPZmZTY3JlZW5UYXJnZXQ7CgogICAgLyogVmlld3BvcnQgbWFuYWdlbWVudCAqLwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICp2aWV3cG9ydF9saXN0OwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpjdXJyZW50X3ZpZXdwb3J0OwogICAgRDNEVklFV1BPUlQ3IGFjdGl2ZV92aWV3cG9ydDsKCiAgICAvKiBMaWdodCBzdGF0ZSAqLwogICAgRFdPUkQgbWF0ZXJpYWw7CgogICAgLyogUmVuZGVyaW5nIGZ1bmN0aW9ucyB0byB3cmFwIEQzRCgxLTMpIHRvIEQzRDcgKi8KICAgIEQzRFBSSU1JVElWRVRZUEUgcHJpbWl0aXZlX3R5cGU7CiAgICBEV09SRCB2ZXJ0ZXhfdHlwZTsKICAgIERXT1JEIHJlbmRlcl9mbGFnczsKICAgIERXT1JEIG5iX3ZlcnRpY2VzOwogICAgTFBCWVRFIHZlcnRleF9idWZmZXI7CiAgICBEV09SRCB2ZXJ0ZXhfc2l6ZTsKICAgIERXT1JEIGJ1ZmZlcl9zaXplOwoKICAgIC8qIEhhbmRsZSBtYW5hZ2VtZW50ICovCiAgICBzdHJ1Y3QgSGFuZGxlRW50cnkgICAgICAqSGFuZGxlczsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgICBudW1IYW5kbGVzOwogICAgRDNETUFUUklYSEFORExFICAgICAgICAgIHdvcmxkLCBwcm9qLCB2aWV3Owp9OwoKLyogVnRhYmxlcyBpbiB2YXJpb3VzIHZlcnNpb25zICovCmNvbnN0IElEaXJlY3QzRERldmljZTdWdGJsIElEaXJlY3QzRERldmljZTdfVnRibDsKY29uc3QgSURpcmVjdDNERGV2aWNlM1Z0YmwgSURpcmVjdDNERGV2aWNlM19WdGJsOwpjb25zdCBJRGlyZWN0M0REZXZpY2UyVnRibCBJRGlyZWN0M0REZXZpY2UyX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRERldmljZVZ0YmwgIElEaXJlY3QzRERldmljZTFfVnRibDsKCi8qIFRoZSBJSUQgKi8KY29uc3QgR1VJRCBJSURfRDNEREVWSUNFX1dpbmVEM0Q7CgovKiBIZWxwZXIgZnVuY3Rpb25zICovCkhSRVNVTFQgSURpcmVjdDNESW1wbF9HZXRDYXBzKElXaW5lRDNEICpXaW5lRDNELCBEM0RERVZJQ0VERVNDICpEZXNjMTIzLCBEM0RERVZJQ0VERVNDNyAqRGVzYzcpOwpEV09SRCBJRGlyZWN0M0REZXZpY2VJbXBsX0NyZWF0ZUhhbmRsZShJRGlyZWN0M0REZXZpY2VJbXBsICpUaGlzKTsKV0lORUQzRFpCVUZGRVJUWVBFIElEaXJlY3QzRERldmljZUltcGxfVXBkYXRlRGVwdGhTdGVuY2lsKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMpOwoKLyogU3RydWN0dXJlcyAqLwpzdHJ1Y3QgRW51bVRleHR1cmVGb3JtYXRzQ0JTCnsKICAgIExQRDNERU5VTVRFWFRVUkVGT1JNQVRTQ0FMTEJBQ0sgY2J2MjsKICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIGNidjc7CiAgICB2b2lkICpDb250ZXh0Owp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBObyBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUgYXMgdGhpcyBpcyBvbmx5IGFub3RoZXIgaW50ZXJmYWNlIHRvIERpcmVjdERyYXcgKi8KCi8qIHRoZSBWdGFibGVzICovCmNvbnN0IElEaXJlY3QzRFZ0YmwgIElEaXJlY3QzRDFfVnRibDsKY29uc3QgSURpcmVjdDNEMlZ0YmwgSURpcmVjdDNEMl9WdGJsOwpjb25zdCBJRGlyZWN0M0QzVnRibCBJRGlyZWN0M0QzX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRDdWdGJsIElEaXJlY3QzRDdfVnRibDsKCi8qIFN0cnVjdHVyZSBmb3IgRW51bVpCdWZmZXJGb3JtYXRzICovCnN0cnVjdCBFbnVtWkJ1ZmZlckZvcm1hdHNEYXRhCnsKICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIENhbGxiYWNrOwogICAgdm9pZCAqQ29udGV4dDsKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd0NsaXBwZXIgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd0NsaXBwZXIpOwogICAgTE9ORyByZWY7CgogICAgSVdpbmVEM0RDbGlwcGVyICAgICAgICAgICAqd2luZUQzRENsaXBwZXI7CiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICpkZHJhd19vd25lcjsKfTsKCmNvbnN0IElEaXJlY3REcmF3Q2xpcHBlclZ0YmwgSURpcmVjdERyYXdDbGlwcGVyX1Z0Ymw7Cgp0eXBlZGVmIElXaW5lRDNEQ2xpcHBlciogKFdJTkFQSSAqZm5XaW5lRGlyZWN0M0RDcmVhdGVDbGlwcGVyKShJVW5rbm93biAqKTsKZm5XaW5lRGlyZWN0M0RDcmVhdGVDbGlwcGVyIHBXaW5lRGlyZWN0M0RDcmVhdGVDbGlwcGVyOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3UGFsZXR0ZSBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdERyYXdQYWxldHRlSW1wbAp7CiAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3UGFsZXR0ZSk7CiAgICBMT05HIHJlZjsKCiAgICAvKiBXaW5lRDNEIHVwbGluayAqLwogICAgSVdpbmVEM0RQYWxldHRlICAgICAgICAgICAqd2luZUQzRFBhbGV0dGU7CgogICAgLyogSURpcmVjdERyYXdQYWxldHRlIGZpZWxkcyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgICAqZGRyYXdfb3duZXI7CiAgICBJVW5rbm93biAgICAgICAgICAgICAgICAgICppZmFjZVRvUmVsZWFzZTsKfTsKY29uc3QgSURpcmVjdERyYXdQYWxldHRlVnRibCBJRGlyZWN0RHJhd1BhbGV0dGVfVnRibDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGlyZWN0RHJhdyBDbGFzc0ZhY3RvcnkgaW1wbGVtZW50YXRpb24gLSBpbmNvbXBsZXRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgc3RydWN0CnsKICAgIElDT01fVkZJRUxEX01VTFRJKElDbGFzc0ZhY3RvcnkpOwoKICAgIExPTkcgcmVmOwogICAgSFJFU1VMVCAoKnBmbkNyZWF0ZUluc3RhbmNlKShJVW5rbm93biAqcFVua091dGVyLCBSRUZJSUQgaWlkLCBMUFZPSUQgKnBwT2JqKTsKfSBJQ2xhc3NGYWN0b3J5SW1wbDsKCi8qIEhlbHBlciBzdHJ1Y3R1cmVzICovCnN0cnVjdCBvYmplY3RfY3JlYXRpb25faW5mbwp7CiAgICBjb25zdCBDTFNJRCAqY2xzaWQ7CiAgICBIUkVTVUxUICgqcGZuQ3JlYXRlSW5zdGFuY2UpKElVbmtub3duICpwVW5rT3V0ZXIsIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqcHBPYmopOwp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RMaWdodCBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUgLSBXcmFwcyB0byBEM0Q3CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0M0RMaWdodEltcGwKewogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNETGlnaHQpOwogICAgTE9ORyByZWY7CgogICAgLyogSURpcmVjdDNETGlnaHQgZmllbGRzICovCiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICpkZHJhdzsKCiAgICAvKiBJZiB0aGlzIGxpZ2h0IGlzIGFjdGl2ZSBmb3Igb25lIHZpZXdwb3J0LCBwdXQgdGhlIHZpZXdwb3J0IGhlcmUgKi8KICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAgICAgKmFjdGl2ZV92aWV3cG9ydDsKCiAgICBEM0RMSUdIVDIgbGlnaHQ7CiAgICBEM0RMSUdIVDcgbGlnaHQ3OwoKICAgIERXT1JEIGR3TGlnaHRJbmRleDsKCiAgICAvKiBDaGFpbmVkIGxpc3QgdXNlZCBmb3IgYWRkaW5nIC8gcmVtb3ZpbmcgZnJvbSB2aWV3cG9ydHMgKi8KICAgIElEaXJlY3QzRExpZ2h0SW1wbCAgICAgICAgKm5leHQ7CgogICAgLyogQWN0aXZhdGlvbiBmdW5jdGlvbiAqLwogICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKmFjdGl2YXRlKShJRGlyZWN0M0RMaWdodEltcGwqKTsKICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKCpkZXNhY3RpdmF0ZSkoSURpcmVjdDNETGlnaHRJbXBsKik7CiAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICgqdXBkYXRlKShJRGlyZWN0M0RMaWdodEltcGwqKTsKfTsKCi8qIFZ0YWJsZSAqLwpjb25zdCBJRGlyZWN0M0RMaWdodFZ0YmwgSURpcmVjdDNETGlnaHRfVnRibDsKCi8qIEhlbHBlciBmdW5jdGlvbnMgKi8Kdm9pZCBsaWdodF91cGRhdGUoSURpcmVjdDNETGlnaHRJbXBsKiBUaGlzKTsKdm9pZCBsaWdodF9hY3RpdmF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpOwp2b2lkIGxpZ2h0X2Rlc2FjdGl2YXRlKElEaXJlY3QzRExpZ2h0SW1wbCogVGhpcyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRE1hdGVyaWFsIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZSAtIFdyYXBzIHRvIEQzRDcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3QzRE1hdGVyaWFsSW1wbAp7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RNYXRlcmlhbDMpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNETWF0ZXJpYWwyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRE1hdGVyaWFsKTsKICAgIExPTkcgIHJlZjsKCiAgICAvKiBJRGlyZWN0M0RNYXRlcmlhbDIgZmllbGRzICovCiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICAgICAqZGRyYXc7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICAgICAgICAgICAqYWN0aXZlX2RldmljZTsKCiAgICBEM0RNQVRFUklBTCBtYXQ7CiAgICBEV09SRCBIYW5kbGU7CgogICAgdm9pZCAoKmFjdGl2YXRlKShJRGlyZWN0M0RNYXRlcmlhbEltcGwqIHRoaXMpOwp9OwoKLyogVlRhYmxlcyBpbiB2YXJpb3VzIHZlcnNpb25zICovCmNvbnN0IElEaXJlY3QzRE1hdGVyaWFsVnRibCBJRGlyZWN0M0RNYXRlcmlhbF9WdGJsOwpjb25zdCBJRGlyZWN0M0RNYXRlcmlhbDJWdGJsIElEaXJlY3QzRE1hdGVyaWFsMl9WdGJsOwpjb25zdCBJRGlyZWN0M0RNYXRlcmlhbDNWdGJsIElEaXJlY3QzRE1hdGVyaWFsM19WdGJsOwoKLyogSGVscGVyIGZ1bmN0aW9ucyAqLwp2b2lkIG1hdGVyaWFsX2FjdGl2YXRlKElEaXJlY3QzRE1hdGVyaWFsSW1wbCogVGhpcyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVmlld3BvcnQgLSBXcmFwcyB0byBEM0Q3CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3QzRFZpZXdwb3J0SW1wbAp7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RWaWV3cG9ydDMpOwogICAgTE9ORyByZWY7CgogICAgLyogSURpcmVjdDNEVmlld3BvcnQgZmllbGRzICovCiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICpkZHJhdzsKCiAgICAvKiBJZiB0aGlzIHZpZXdwb3J0IGlzIGFjdGl2ZSBmb3Igb25lIGRldmljZSwgcHV0IHRoZSBkZXZpY2UgaGVyZSAqLwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAgICAgICAqYWN0aXZlX2RldmljZTsKCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgIG51bV9saWdodHM7CiAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgIG1hcF9saWdodHM7CgogICAgaW50ICAgICAgICAgICAgICAgICAgICAgICB1c2VfdnAyOwoKICAgIHVuaW9uCiAgICB7CiAgICAgICAgRDNEVklFV1BPUlQgdnAxOwogICAgICAgIEQzRFZJRVdQT1JUMiB2cDI7CiAgICB9IHZpZXdwb3J0czsKCiAgICAvKiBBY3RpdmF0aW9uIGZ1bmN0aW9uICovCiAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICgqYWN0aXZhdGUpKElEaXJlY3QzRFZpZXdwb3J0SW1wbCopOwoKICAgIC8qIEZpZWxkIHVzZWQgdG8gY2hhaW4gdmlld3BvcnRzIHRvZ2V0aGVyICovCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgICAgICpuZXh0OwoKICAgIC8qIExpZ2h0cyBsaXN0ICovCiAgICBJRGlyZWN0M0RMaWdodEltcGwgICAgICAgICpsaWdodHM7CgogICAgLyogQmFja2dyb3VuZCBtYXRlcmlhbCAqLwogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsICAgICAqYmFja2dyb3VuZDsKfTsKCi8qIFZ0YWJsZSAqLwpjb25zdCBJRGlyZWN0M0RWaWV3cG9ydDNWdGJsIElEaXJlY3QzRFZpZXdwb3J0M19WdGJsOwoKLyogSGVscGVyIGZ1bmN0aW9ucyAqLwp2b2lkIHZpZXdwb3J0X2FjdGl2YXRlKElEaXJlY3QzRFZpZXdwb3J0SW1wbCogVGhpcyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAtIFdyYXBzIHRvIEQzRDcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwKewogICAgLyogSVVua25vd24gKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIpOwogICAgTE9ORyAgICAgICAgICAgICAgICAgcmVmOwoKICAgIC8qIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgZmllbGRzICovCiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAqZGRyYXc7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICAqZDNkZGV2OwoKICAgIEQzREVYRUNVVEVCVUZGRVJERVNDIGRlc2M7CiAgICBEM0RFWEVDVVRFREFUQSAgICAgICBkYXRhOwoKICAgIC8qIFRoaXMgYnVmZmVyIHdpbGwgc3RvcmUgdGhlIHRyYW5zZm9ybWVkIHZlcnRpY2VzICovCiAgICB2b2lkICAgICAgICAgICAgICAgICAqdmVydGV4X2RhdGE7CiAgICBXT1JEICAgICAgICAgICAgICAgICAqaW5kaWNlczsKICAgIGludCAgICAgICAgICAgICAgICAgIG5iX2luZGljZXM7CgogICAgLyogVGhpcyBmbGFncyBpcyBzZXQgdG8gVFJVRSBpZiB3ZSBhbGxvY2F0ZWQgb3Vyc2VsdmVzIHRoZQogICAgICogZGF0YSBidWZmZXIKICAgICAqLwogICAgQk9PTCAgICAgICAgICAgICAgICAgbmVlZF9mcmVlOwp9OwoKLyogVGhlIFZUYWJsZSAqLwpjb25zdCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyVnRibCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyX1Z0Ymw7CgovKiBUaGUgZXhlY3V0ZSBmdW5jdGlvbiAqLwp2b2lkCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0V4ZWN1dGUoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlSW1wbCAqRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqVmlld3BvcnRJbXBsKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbAp7CiAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVmVydGV4QnVmZmVyNyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIpOwogICAgTE9ORyAgICAgICAgICAgICAgICAgcmVmOwoKICAgIC8qKiogV2luZUQzRCBhbmQgZGRyYXcgbGlua3MgKioqLwogICAgSVdpbmVEM0RWZXJ0ZXhCdWZmZXIgKndpbmVEM0RWZXJ0ZXhCdWZmZXI7CiAgICBJV2luZUQzRFZlcnRleERlY2xhcmF0aW9uICp3aW5lRDNEVmVydGV4RGVjbGFyYXRpb247CiAgICBJRGlyZWN0RHJhd0ltcGwgKmRkcmF3OwoKICAgIC8qKiogU3RvcmFnZSBmb3IgRDNENyBzcGVjaWZpYyB0aGluZ3MgKioqLwogICAgRFdPUkQgICAgICAgICAgICAgICAgQ2FwczsKfTsKCi8qIFRoZSBWdGFibGVzICovCmNvbnN0IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdWdGJsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfVnRibDsKY29uc3QgSURpcmVjdDNEVmVydGV4QnVmZmVyVnRibCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIxX1Z0Ymw7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSGVscGVyIGZ1bmN0aW9ucyBmcm9tIHV0aWxzLmMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2RlZmluZSBHRVRfVEVYQ09VTlRfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlKSBcCiAgICAoKChkM2R2dFZlcnRleFR5cGUpICYgRDNERlZGX1RFWENPVU5UX01BU0spID4+IEQzREZWRl9URVhDT1VOVF9TSElGVCkKCiNkZWZpbmUgR0VUX1RFWENPT1JEX1NJWkVfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlLCB0ZXhfbnVtKSBcCiAgICAoKCgoKGQzZHZ0VmVydGV4VHlwZSkgPj4gKDE2ICsgKDIgKiAodGV4X251bSkpKSkgKyAxKSAmIDB4MDMpICsgMSkKCnZvaWQgUGl4ZWxGb3JtYXRfV2luZUQzRHRvREQoRERQSVhFTEZPUk1BVCAqRERQaXhlbEZvcm1hdCwgV0lORUQzREZPUk1BVCBXaW5lRDNERm9ybWF0KTsKV0lORUQzREZPUk1BVCBQaXhlbEZvcm1hdF9ERDJXaW5lRDNEKGNvbnN0IEREUElYRUxGT1JNQVQgKkREUGl4ZWxGb3JtYXQpOwp2b2lkIEREUkFXX2R1bXBfc3VyZmFjZV9kZXNjKGNvbnN0IEREU1VSRkFDRURFU0MyICpscGRkc2QpOwp2b2lkIEREUkFXX2R1bXBfcGl4ZWxmb3JtYXQoY29uc3QgRERQSVhFTEZPUk1BVCAqUGl4ZWxGb3JtYXQpOwp2b2lkIGR1bXBfRDNETUFUUklYKGNvbnN0IEQzRE1BVFJJWCAqbWF0KTsKdm9pZCBERFJBV19kdW1wX0REQ0FQUyhjb25zdCBERENBUFMgKmxwY2Fwcyk7CkRXT1JEIGdldF9mbGV4aWJsZV92ZXJ0ZXhfc2l6ZShEV09SRCBkM2R2dFZlcnRleFR5cGUpOwp2b2lkIEREUkFXX2R1bXBfRERTQ0FQUzIoY29uc3QgRERTQ0FQUzIgKmluKTsKdm9pZCBERFJBV19kdW1wX2Nvb3BlcmF0aXZlbGV2ZWwoRFdPUkQgY29vcGxldmVsKTsKCi8qIFRoaXMgb25seSBuZWVkcyB0byBiZSBoZXJlIGFzIGxvbmcgdGhlIHByb2Nlc3N2ZXJ0aWNlcyBmdW5jdGlvbmFsaXR5IG9mCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgaXNuJ3QgaW4gV2luZUQzRCAqLwp2b2lkIG11bHRpcGx5X21hdHJpeChMUEQzRE1BVFJJWCBkZXN0LCBjb25zdCBEM0RNQVRSSVggKnNyYzEsIGNvbnN0IEQzRE1BVFJJWCAqc3JjMik7CgovKiBVc2VkIGZvciBnZW5lcmljIGR1bXBpbmcgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgRFdPUkQgdmFsOwogICAgY29uc3QgY2hhciogbmFtZTsKfSBmbGFnX2luZm87CgojZGVmaW5lIEZFKHgpIHsgeCwgI3ggfQoKdHlwZWRlZiBzdHJ1Y3QKewogICAgRFdPUkQgdmFsOwogICAgY29uc3QgY2hhciogbmFtZTsKICAgIHZvaWQgKCpmdW5jKShjb25zdCB2b2lkICopOwogICAgcHRyZGlmZl90IG9mZnNldDsKfSBtZW1iZXJfaW5mbzsKCi8qIFN0cnVjdHVyZSBjb3B5ICovCiNkZWZpbmUgTUUoeCxmLGUpIHsgeCwgI3gsICh2b2lkICgqKShjb25zdCB2b2lkICopKShmKSwgb2Zmc2V0b2YoU1RSVUNULCBlKSB9CgojZGVmaW5lIEREX1NUUlVDVF9DT1BZX0JZU0laRSh0byxmcm9tKSAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBEV09SRCBfX3NpemUgPSAodG8pLT5kd1NpemU7ICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgRFdPUkQgX19jb3B5c2l6ZSA9IF9fc2l6ZTsgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIERXT1JEIF9fcmVzZXRzaXplID0gX19zaXplOyAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBhc3NlcnQodG8gIT0gZnJvbSk7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKF9fcmVzZXRzaXplID4gc2l6ZW9mKCp0bykpICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBfX3Jlc2V0c2l6ZSA9IHNpemVvZigqdG8pOyAgICAgICAgICBcCiAgICAgICAgICAgICAgICBtZW1zZXQodG8sMCxfX3Jlc2V0c2l6ZSk7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKChmcm9tKS0+ZHdTaXplIDwgX19zaXplKSAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBfX2NvcHlzaXplID0gKGZyb20pLT5kd1NpemU7ICAgICAgICBcCiAgICAgICAgICAgICAgICBtZW1jcHkodG8sZnJvbSxfX2NvcHlzaXplKTsgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgKHRvKS0+ZHdTaXplID0gX19zaXplOy8qcmVzdG9yZSBzaXplKi8gIFwKICAgICAgICB9IHdoaWxlICgwKQoKCiNlbmRpZgoKSFJFU1VMVCBocl9kZHJhd19mcm9tX3dpbmVkM2QoSFJFU1VMVCBocik7Cg==