LyoKICogQ29weXJpZ2h0IDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICiNkZWZpbmUgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICgovKiBNQVkgTk9UIENPTlRBSU4gWDExIG9yIERHQSBzcGVjaWZpYyBpbmNsdWRlcy9kZWZpbmVzL3N0cnVjdHMhICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid3R5cGVzLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkZHJhd2kuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkY29taW1wbC5oIgoKI2luY2x1ZGUgIndpbmUvd2luZWQzZF9pbnRlcmZhY2UuaCIKI2luY2x1ZGUgIndpbmUvbGlzdC5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElQYXJlbnQgLSBhIGhlbHBlciBpbnRlcmZhY2UKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpERUZJTkVfR1VJRChJSURfSVBhcmVudCwgMHhjMjBlNGM4OCwgMHg3NGU3LCAweDQ5NDAsIDB4YmEsIDB4OWYsIDB4MmUsIDB4MzIsIDB4M2YsIDB4OWQsIDB4YzksIDB4ODEpOwp0eXBlZGVmIHN0cnVjdCBJUGFyZW50ICpMUFBBUkVOVCwgKlBQQVJFTlQ7CgojZGVmaW5lIElOVEVSRkFDRSBJUGFyZW50CkRFQ0xBUkVfSU5URVJGQUNFXyhJUGFyZW50LElVbmtub3duKQp7CiAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwogICAgU1RETUVUSE9EXyhIUkVTVUxULFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iamVjdCkgUFVSRTsKICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOwogICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOwp9OwojdW5kZWYgSU5URVJGQUNFCgojaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkKLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KI2RlZmluZSBJUGFyZW50X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpCiNkZWZpbmUgSVBhcmVudF9BZGRSZWYocCkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkFkZFJlZihwKQojZGVmaW5lIElQYXJlbnRfUmVsZWFzZShwKSAgICAgICAgICAgIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApCiNlbmRpZgoKCi8qIFR5cGRlZiB0aGUgaW50ZXJmYWNlcyAqLwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICBJRGlyZWN0RHJhd0ltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwgICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZUltcGwgICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzRERldmljZUltcGwgICAgICAgIElEaXJlY3QzRERldmljZUltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzRExpZ2h0SW1wbCAgICAgICAgIElEaXJlY3QzRExpZ2h0SW1wbDsKdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVmlld3BvcnRJbXBsICAgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RNYXRlcmlhbEltcGwgICAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGw7CnR5cGVkZWYgc3RydWN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsOwp0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsOwp0eXBlZGVmIHN0cnVjdCBJUGFyZW50SW1wbCAgICAgICAgICAgICAgICBJUGFyZW50SW1wbDsKCi8qIENhbGxiYWNrcyBmb3IgaW1wbGljaXQgb2JqZWN0IGRlc3RydWN0aW9uICovCmV4dGVybiBVTE9ORyBXSU5BUEkgRDNEN0NCX0Rlc3Ryb3lTd2FwQ2hhaW4oSVdpbmVEM0RTd2FwQ2hhaW4gKnBTd2FwQ2hhaW4pOwoKZXh0ZXJuIFVMT05HIFdJTkFQSSBEM0Q3Q0JfRGVzdHJveURlcHRoU3RlbmNpbFN1cmZhY2UoSVdpbmVEM0RTdXJmYWNlICpwU3VyZmFjZSk7CgovKiBHbG9iYWwgY3JpdGljYWwgc2VjdGlvbiAqLwpleHRlcm4gQ1JJVElDQUxfU0VDVElPTiBkZHJhd19jczsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhdyBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgRnZmVG9EZWNsCnsKICAgIERXT1JEIGZ2ZjsKICAgIElXaW5lRDNEVmVydGV4RGVjbGFyYXRpb24gKmRlY2w7Cn07CgpzdHJ1Y3QgSURpcmVjdERyYXdJbXBsCnsKICAgIC8qIElVbmtub3duIGZpZWxkcyAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXc3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3NCk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhdzMpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXcyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRDcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEMyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0QyKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRCk7CgogICAgLyogU2VlIGNvbW1lbnQgaW4gSURpcmVjdERyYXc6OkFkZFJlZiAqLwogICAgTE9ORyAgICAgICAgICAgICAgICAgICAgcmVmNywgcmVmNCwgcmVmMiwgcmVmMywgcmVmMSwgbnVtSWZhY2VzOwoKICAgIC8qIFdpbmVEM0QgbGlua2FnZSAqLwogICAgSVdpbmVEM0QgICAgICAgICAgICAgICAgKndpbmVEM0Q7CiAgICBJV2luZUQzRERldmljZSAgICAgICAgICAqd2luZUQzRERldmljZTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpEZXB0aFN0ZW5jaWxCdWZmZXI7CiAgICBCT09MICAgICAgICAgICAgICAgICAgICBkM2RfaW5pdGlhbGl6ZWQ7CgogICAgLyogTWlzYyBkZHJhdyBmaWVsZHMgKi8KICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHRvdGFsX3ZpZG1lbTsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGN1cl9zY2FubGluZTsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGZha2VfdmJsYW5rOwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQ7CgogICAgLyogRGlyZWN0RHJhdyB0aGluZ3MsIHdoaWNoIGFyZSBub3QgaGFuZGxlZCBieSBXaW5lRDNEICovCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZV9sZXZlbDsKCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodDsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgIG9yaWdfYnBwOwoKICAgIEREQ0FQUyAgICAgICAgICAgICAgICAgIGNhcHM7CgogICAgLyogRDNEIHRoaW5ncyAqLwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKmQzZF90YXJnZXQ7CiAgICBIV05EICAgICAgICAgICAgICAgICAgICBkM2Rfd2luZG93OwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAgICAgKmQzZGRldmljZTsKICAgIGludCAgICAgICAgICAgICAgICAgICAgIGQzZHZlcnNpb247CgogICAgLyogVmFyaW91cyBIV05EcyAqLwogICAgSFdORCAgICAgICAgICAgICAgICAgICAgZm9jdXN3aW5kb3c7CiAgICBIV05EICAgICAgICAgICAgICAgICAgICBkZXZpY2V3aW5kb3c7CgogICAgLyogVGhlIHN1cmZhY2UgdHlwZSB0byByZXF1ZXN0ICovCiAgICBXSU5FRDNEU1VSRlRZUEUgICAgICAgICBJbXBsVHlwZTsKCgogICAgLyogT3VyIHByaXZhdGUgd2luZG93IGNsYXNzICovCiAgICBjaGFyIGNsYXNzbmFtZVszMl07CiAgICBXTkRDTEFTU0Egd25kX2NsYXNzOwoKICAgIC8qIEhlbHBlcnMgZm9yIHN1cmZhY2UgY3JlYXRpb24gKi8KICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnRleF9yb290OwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgZGVwdGhzdGVuY2lsOwoKICAgIC8qIEZvciB0aGUgZGxsIHVubG9hZCBjbGVhbnVwIGNvZGUgKi8KICAgIHN0cnVjdCBsaXN0IGRkcmF3X2xpc3RfZW50cnk7CiAgICAvKiBUaGUgc3VyZmFjZSBsaXN0IC0gY2FuJ3QgcmVsYXkgdGhpcyB0byBXaW5lRDNECiAgICAgKiBiZWNhdXNlIG9mIElQYXJlbnQKICAgICAqLwogICAgc3RydWN0IGxpc3Qgc3VyZmFjZV9saXN0OwogICAgTE9ORyBzdXJmYWNlczsKCiAgICAvKiBGVkYgbWFuYWdlbWVudCAqLwogICAgc3RydWN0IEZ2ZlRvRGVjbCAgICAgICAqZGVjbHM7CiAgICBVSU5UICAgICAgICAgICAgICAgICAgICBudW1Db252ZXJ0ZWREZWNscywgZGVjbEFycmF5U2l6ZTsKfTsKCi8qIERlY2xhcmUgdGhlIFZUYWJsZXMuIFRoZXkgY2FuIGJlIGZvdW5kIGRkcmF3LmMgKi8KY29uc3QgSURpcmVjdERyYXc3VnRibCBJRGlyZWN0RHJhdzdfVnRibDsKY29uc3QgSURpcmVjdERyYXc0VnRibCBJRGlyZWN0RHJhdzRfVnRibDsKY29uc3QgSURpcmVjdERyYXczVnRibCBJRGlyZWN0RHJhdzNfVnRibDsKY29uc3QgSURpcmVjdERyYXcyVnRibCBJRGlyZWN0RHJhdzJfVnRibDsKY29uc3QgSURpcmVjdERyYXdWdGJsICBJRGlyZWN0RHJhdzFfVnRibDsKCi8qIEhlbHBlciBzdHJ1Y3R1cmVzICovCnR5cGVkZWYgc3RydWN0IEVudW1EaXNwbGF5TW9kZXNDQlMKewogICAgdm9pZCAqY29udGV4dDsKICAgIExQRERFTlVNTU9ERVNDQUxMQkFDSzIgY2FsbGJhY2s7Cn0gRW51bURpc3BsYXlNb2Rlc0NCUzsKCnR5cGVkZWYgc3RydWN0IEVudW1TdXJmYWNlc0NCUwp7CiAgICB2b2lkICpjb250ZXh0OwogICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYWxsYmFjazsKICAgIExQRERTVVJGQUNFREVTQzIgcEREU0Q7CiAgICBEV09SRCBGbGFnczsKfSBFbnVtU3VyZmFjZXNDQlM7CgovKiBVdGlsaXR5IGZ1bmN0aW9ucyAqLwp2b2lkCkREUkFXX0NvbnZlcnRfRERTQ0FQU18xX1RvXzIoY29uc3QgRERTQ0FQUyogcEluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU0NBUFMyKiBwT3V0KTsKdm9pZApERFJBV19Db252ZXJ0X0REREVWSUNFSURFTlRJRklFUl8yX1RvXzEoY29uc3QgRERERVZJQ0VJREVOVElGSUVSMiogcEluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERERVZJQ0VJREVOVElGSUVSKiBwT3V0KTsKdm9pZApJRGlyZWN0RHJhd0ltcGxfRGVzdHJveShJRGlyZWN0RHJhd0ltcGwgKlRoaXMpOwoKSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdJbXBsX1JlY3JlYXRlU3VyZmFjZXNDYWxsYmFjayhJRGlyZWN0RHJhd1N1cmZhY2U3ICpzdXJmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU1VSRkFDRURFU0MyICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpOwpJV2luZUQzRFZlcnRleERlY2xhcmF0aW9uICoKSURpcmVjdERyYXdJbXBsX0ZpbmREZWNsKElEaXJlY3REcmF3SW1wbCAqVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZ2Zik7CgovKiBUaGUgZGVmYXVsdCBzdXJmYWNlIHR5cGUgKi8KZXh0ZXJuIFdJTkVEM0RTVVJGVFlQRSBEZWZhdWx0U3VyZmFjZVR5cGU7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdTdXJmYWNlIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlSW1wbAp7CiAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3U3VyZmFjZTcpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXdTdXJmYWNlMyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd0dhbW1hQ29udHJvbCk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RUZXh0dXJlMik7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RUZXh0dXJlKTsKCiAgICBMT05HICAgICAgICAgICAgICAgICAgICAgcmVmOwogICAgSVVua25vd24gICAgICAgICAgICAgICAgKmlmYWNlVG9SZWxlYXNlOwoKICAgIGludCAgICAgICAgICAgICAgICAgICAgIHZlcnNpb247CgogICAgLyogQ29ubmVjdGlvbnMgdG8gb3RoZXIgT2JqZWN0cyAqLwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgKmRkcmF3OwogICAgSVdpbmVEM0RTdXJmYWNlICAgICAgICAgKldpbmVEM0RTdXJmYWNlOwogICAgSVdpbmVEM0RCYXNlVGV4dHVyZSAgICAgKndpbmVEM0RUZXh0dXJlOwoKICAgIC8qIFRoaXMgaW1wbGVtZW50YXRpb24gaGFuZGxlcyBhdHRhY2hpbmcgc3VyZmFjZXMgdG8gb3RoZXIgc3VyZmFjZXMgKi8KICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpuZXh0X2F0dGFjaGVkOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKmZpcnN0X2F0dGFjaGVkOwoKICAgIC8qIENvbXBsZXggc3VyZmFjZXMgYXJlIG9yZ2FuaXplZCBpbiBhIHRyZWUsIGFsdGhvdWdoIHRoZSB0cmVlIGlzIGRlZ2VuZXJhdGVkIHRvIGEgbGlzdCBpbiBtb3N0IGNhc2VzLgogICAgICogSW4gbWlwbWFwIGFuZCBwcmltYXJ5IHN1cmZhY2VzIGVhY2ggbGV2ZWwgaGFzIG9ubHkgb25lIGF0dGFjaG1lbnQsIHdoaWNoIGlzIHRoZSBuZXh0IHN1cmZhY2UgbGV2ZWwuCiAgICAgKiBPbmx5IHRoZSBjdWJlIHRleHR1cmUgcm9vdCBoYXMgNiBzdXJmYWNlcyBhdHRhY2hlZCwgd2hpY2ggdGhlbiBoYXZlIGEgbm9ybWFsIG1pcG1hcCBjaGFpbiBhdHRhY2hlZAogICAgICogdG8gdGhlbS4gU28gaGFyZGNvZGUgdGhlIGFycmF5IHRvIDYsIGEgZHluYW1pYyBhcnJheSBvciBhIGxpc3Qgd291bGQgYmUgYW4gb3ZlcmtpbGwuCiAgICAgKi8KI2RlZmluZSBNQVhfQ09NUExFWF9BVFRBQ0hFRCA2CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqY29tcGxleF9hcnJheVtNQVhfQ09NUExFWF9BVFRBQ0hFRF07CiAgICAvKiBZb3UgY2FuJ3QgdHJhdmVyc2UgdGhlIHRyZWUgdXB3YXJkcy4gT25seSBhIGZsYWcgZm9yIFN1cmZhY2U6OlJlbGVhc2UgYmVjYXVzZSBpdHMgbmVlZGVkIHRoZXJlLAogICAgICogYnV0IG5vIHBvaW50ZXIgdG8gcHJldmVudCB0ZW1wdGF0aW9ucyB0byB0cmF2ZXJzZSBpdCBpbiB0aGUgd3JvbmcgZGlyZWN0aW9uLgogICAgICovCiAgICBCT09MICAgICAgICAgICAgICAgICAgICBpc19jb21wbGV4X3Jvb3Q7CgogICAgLyogU3VyZmFjZSBkZXNjcmlwdGlvbiwgZm9yIEdldEF0dGFjaGVkU3VyZmFjZSAqLwogICAgRERTVVJGQUNFREVTQzIgICAgICAgICAgc3VyZmFjZV9kZXNjOwoKICAgIC8qIE1pc2MgdGhpbmdzICovCiAgICBEV09SRCAgICAgICAgICAgICAgICAgICB1bmlxdWVuZXNzX3ZhbHVlOwogICAgVUlOVCAgICAgICAgICAgICAgICAgICAgbWlwbWFwX2xldmVsOwogICAgV0lORUQzRFNVUkZUWVBFICAgICAgICAgSW1wbFR5cGU7CgogICAgLyogRm9yIEQzRERldmljZSBjcmVhdGlvbiAqLwogICAgQk9PTCAgICAgICAgICAgICAgICAgICAgaXNSZW5kZXJUYXJnZXQ7CgogICAgLyogQ2xpcHBlciBvYmplY3RzICovCiAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICAqY2xpcHBlcjsKCiAgICAvKiBGb3IgdGhlIGRkcmF3IHN1cmZhY2UgbGlzdCAqLwogICAgc3RydWN0IGxpc3QgICAgICAgICAgICAgc3VyZmFjZV9saXN0X2VudHJ5OwoKICAgIERXT1JEICAgICAgICAgICAgICAgICAgIEhhbmRsZTsKfTsKCi8qIFZUYWJsZSBkZWNsYXJhdGlvbi4gSXQncyBsb2NhdGVkIGluIHN1cmZhY2UuYyAvIHN1cmZhY2VfdGh1bmtzLmMgKi8KY29uc3QgSURpcmVjdERyYXdTdXJmYWNlN1Z0YmwgSURpcmVjdERyYXdTdXJmYWNlN19WdGJsOwpjb25zdCBJRGlyZWN0RHJhd1N1cmZhY2UzVnRibCBJRGlyZWN0RHJhd1N1cmZhY2UzX1Z0Ymw7CmNvbnN0IElEaXJlY3REcmF3R2FtbWFDb250cm9sVnRibCBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9WdGJsOwpjb25zdCBJRGlyZWN0M0RUZXh0dXJlMlZ0YmwgSURpcmVjdDNEVGV4dHVyZTJfVnRibDsKY29uc3QgSURpcmVjdDNEVGV4dHVyZVZ0YmwgSURpcmVjdDNEVGV4dHVyZTFfVnRibDsKCkhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZUltcGxfQWRkQXR0YWNoZWRTdXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMsIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlN1cmYpOwoKLyogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsIGZvciBhIGdpdmVuIHN1cmZhY2UgKi8KI2RlZmluZSBQRkdFVF9CUFAocGYpIChwZi5kd0ZsYWdzJkREUEZfUEFMRVRURUlOREVYRUQ4PzE6KChwZi5kd1JHQkJpdENvdW50KzcpLzgpKQojZGVmaW5lIEdFVF9CUFAoZGVzYykgUEZHRVRfQlBQKGRlc2MuZGRwZlBpeGVsRm9ybWF0KQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElQYXJlbnQgSW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSVBhcmVudEltcGwKewogICAgLyogSVVua25vd24gZmllbGRzICovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJUGFyZW50KTsKICAgIExPTkcgICAgICAgICAgICAgICAgICAgIHJlZjsKCiAgICAvKiBJUGFyZW50SW1wbCBmaWVsZHMgKi8KICAgIElVbmtub3duICAgICAgKmNoaWxkOwoKfTsKCmNvbnN0IElQYXJlbnRWdGJsIElQYXJlbnRfVnRibDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0REZXZpY2UgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIGVudW0KewogICAgRERyYXdIYW5kbGVfVW5rbm93biAgICAgICA9IDAsCiAgICBERHJhd0hhbmRsZV9UZXh0dXJlICAgICAgID0gMSwKICAgIEREcmF3SGFuZGxlX01hdGVyaWFsICAgICAgPSAyLAogICAgRERyYXdIYW5kbGVfTWF0cml4ICAgICAgICA9IDMsCiAgICBERHJhd0hhbmRsZV9TdGF0ZUJsb2NrICAgID0gNAp9IEREcmF3SGFuZGxlVHlwZXM7CgpzdHJ1Y3QgSGFuZGxlRW50cnkKewogICAgdm9pZCAgICAqcHRyOwogICAgRERyYXdIYW5kbGVUeXBlcyAgICAgIHR5cGU7Cn07CgpzdHJ1Y3QgSURpcmVjdDNERGV2aWNlSW1wbAp7CiAgICAvKiBJVW5rbm93biAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlNyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0REZXZpY2UzKTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRERldmljZTIpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlKTsKICAgIExPTkcgICAgICAgICAgICAgICAgICAgIHJlZjsKCiAgICAvKiBPdGhlciBvYmplY3QgY29ubmVjdGlvbnMgKi8KICAgIElXaW5lRDNERGV2aWNlICAgICAgICAgICp3aW5lRDNERGV2aWNlOwogICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgKmRkcmF3OwogICAgSVdpbmVEM0RJbmRleEJ1ZmZlciAgICAgKmluZGV4YnVmZmVyOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKnRhcmdldDsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIE9mZlNjcmVlblRhcmdldDsKCiAgICAvKiBWaWV3cG9ydCBtYW5hZ2VtZW50ICovCiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKnZpZXdwb3J0X2xpc3Q7CiAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKmN1cnJlbnRfdmlld3BvcnQ7CiAgICBEM0RWSUVXUE9SVDcgYWN0aXZlX3ZpZXdwb3J0OwoKICAgIC8qIExpZ2h0IHN0YXRlICovCiAgICBEV09SRCBtYXRlcmlhbDsKCiAgICAvKiBSZW5kZXJpbmcgZnVuY3Rpb25zIHRvIHdyYXAgRDNEKDEtMykgdG8gRDNENyAqLwogICAgRDNEUFJJTUlUSVZFVFlQRSBwcmltaXRpdmVfdHlwZTsKICAgIERXT1JEIHZlcnRleF90eXBlOwogICAgRFdPUkQgcmVuZGVyX2ZsYWdzOwogICAgRFdPUkQgbmJfdmVydGljZXM7CiAgICBMUEJZVEUgdmVydGV4X2J1ZmZlcjsKICAgIERXT1JEIHZlcnRleF9zaXplOwogICAgRFdPUkQgYnVmZmVyX3NpemU7CgogICAgLyogSGFuZGxlIG1hbmFnZW1lbnQgKi8KICAgIHN0cnVjdCBIYW5kbGVFbnRyeSAgICAgICpIYW5kbGVzOwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgIG51bUhhbmRsZXM7CiAgICBEM0RNQVRSSVhIQU5ETEUgICAgICAgICAgd29ybGQsIHByb2osIHZpZXc7Cn07CgovKiBWdGFibGVzIGluIHZhcmlvdXMgdmVyc2lvbnMgKi8KY29uc3QgSURpcmVjdDNERGV2aWNlN1Z0YmwgSURpcmVjdDNERGV2aWNlN19WdGJsOwpjb25zdCBJRGlyZWN0M0REZXZpY2UzVnRibCBJRGlyZWN0M0REZXZpY2UzX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRERldmljZTJWdGJsIElEaXJlY3QzRERldmljZTJfVnRibDsKY29uc3QgSURpcmVjdDNERGV2aWNlVnRibCAgSURpcmVjdDNERGV2aWNlMV9WdGJsOwoKLyogVGhlIElJRCAqLwpjb25zdCBHVUlEIElJRF9EM0RERVZJQ0VfV2luZUQzRDsKCi8qIEhlbHBlciBmdW5jdGlvbnMgKi8KSFJFU1VMVCBJRGlyZWN0M0RJbXBsX0dldENhcHMoSVdpbmVEM0QgKldpbmVEM0QsIEQzRERFVklDRURFU0MgKkRlc2MxMjMsIEQzRERFVklDRURFU0M3ICpEZXNjNyk7CkRXT1JEIElEaXJlY3QzRERldmljZUltcGxfQ3JlYXRlSGFuZGxlKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMpOwpXSU5FRDNEWkJVRkZFUlRZUEUgSURpcmVjdDNERGV2aWNlSW1wbF9VcGRhdGVEZXB0aFN0ZW5jaWwoSURpcmVjdDNERGV2aWNlSW1wbCAqVGhpcyk7CgovKiBTdHJ1Y3R1cmVzICovCnN0cnVjdCBFbnVtVGV4dHVyZUZvcm1hdHNDQlMKewogICAgTFBEM0RFTlVNVEVYVFVSRUZPUk1BVFNDQUxMQkFDSyBjYnYyOwogICAgTFBEM0RFTlVNUElYRUxGT1JNQVRTQ0FMTEJBQ0sgY2J2NzsKICAgIHZvaWQgKkNvbnRleHQ7Cn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIE5vIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZSBhcyB0aGlzIGlzIG9ubHkgYW5vdGhlciBpbnRlcmZhY2UgdG8gRGlyZWN0RHJhdyAqLwoKLyogdGhlIFZ0YWJsZXMgKi8KY29uc3QgSURpcmVjdDNEVnRibCAgSURpcmVjdDNEMV9WdGJsOwpjb25zdCBJRGlyZWN0M0QyVnRibCBJRGlyZWN0M0QyX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRDNWdGJsIElEaXJlY3QzRDNfVnRibDsKY29uc3QgSURpcmVjdDNEN1Z0YmwgSURpcmVjdDNEN19WdGJsOwoKLyogU3RydWN0dXJlIGZvciBFbnVtWkJ1ZmZlckZvcm1hdHMgKi8Kc3RydWN0IEVudW1aQnVmZmVyRm9ybWF0c0RhdGEKewogICAgTFBEM0RFTlVNUElYRUxGT1JNQVRTQ0FMTEJBQ0sgQ2FsbGJhY2s7CiAgICB2b2lkICpDb250ZXh0Owp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3Q2xpcHBlciBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdERyYXdDbGlwcGVySW1wbAp7CiAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3Q2xpcHBlcik7CiAgICBMT05HIHJlZjsKCiAgICBJV2luZUQzRENsaXBwZXIgICAgICAgICAgICp3aW5lRDNEQ2xpcHBlcjsKICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICAgKmRkcmF3X293bmVyOwp9OwoKY29uc3QgSURpcmVjdERyYXdDbGlwcGVyVnRibCBJRGlyZWN0RHJhd0NsaXBwZXJfVnRibDsKCnR5cGVkZWYgSVdpbmVEM0RDbGlwcGVyKiAoV0lOQVBJICpmbldpbmVEaXJlY3QzRENyZWF0ZUNsaXBwZXIpKElVbmtub3duICopOwpmbldpbmVEaXJlY3QzRENyZWF0ZUNsaXBwZXIgcFdpbmVEaXJlY3QzRENyZWF0ZUNsaXBwZXI7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdQYWxldHRlIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsCnsKICAgIC8qIElVbmtub3duIGZpZWxkcyAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXdQYWxldHRlKTsKICAgIExPTkcgcmVmOwoKICAgIC8qIFdpbmVEM0QgdXBsaW5rICovCiAgICBJV2luZUQzRFBhbGV0dGUgICAgICAgICAgICp3aW5lRDNEUGFsZXR0ZTsKCiAgICAvKiBJRGlyZWN0RHJhd1BhbGV0dGUgZmllbGRzICovCiAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICpkZHJhd19vd25lcjsKICAgIElVbmtub3duICAgICAgICAgICAgICAgICAgKmlmYWNlVG9SZWxlYXNlOwp9Owpjb25zdCBJRGlyZWN0RHJhd1BhbGV0dGVWdGJsIElEaXJlY3REcmF3UGFsZXR0ZV9WdGJsOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEaXJlY3REcmF3IENsYXNzRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiAtIGluY29tcGxldGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgSUNPTV9WRklFTERfTVVMVEkoSUNsYXNzRmFjdG9yeSk7CgogICAgTE9ORyByZWY7CiAgICBIUkVTVUxUICgqcGZuQ3JlYXRlSW5zdGFuY2UpKElVbmtub3duICpwVW5rT3V0ZXIsIFJFRklJRCBpaWQsIExQVk9JRCAqcHBPYmopOwp9IElDbGFzc0ZhY3RvcnlJbXBsOwoKLyogSGVscGVyIHN0cnVjdHVyZXMgKi8Kc3RydWN0IG9iamVjdF9jcmVhdGlvbl9pbmZvCnsKICAgIGNvbnN0IENMU0lEICpjbHNpZDsKICAgIEhSRVNVTFQgKCpwZm5DcmVhdGVJbnN0YW5jZSkoSVVua25vd24gKnBVbmtPdXRlciwgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipwcE9iaik7Cn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRExpZ2h0IGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZSAtIFdyYXBzIHRvIEQzRDcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IElEaXJlY3QzRExpZ2h0SW1wbAp7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RMaWdodCk7CiAgICBMT05HIHJlZjsKCiAgICAvKiBJRGlyZWN0M0RMaWdodCBmaWVsZHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICAgKmRkcmF3OwoKICAgIC8qIElmIHRoaXMgbGlnaHQgaXMgYWN0aXZlIGZvciBvbmUgdmlld3BvcnQsIHB1dCB0aGUgdmlld3BvcnQgaGVyZSAqLwogICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICAgICAqYWN0aXZlX3ZpZXdwb3J0OwoKICAgIEQzRExJR0hUMiBsaWdodDsKICAgIEQzRExJR0hUNyBsaWdodDc7CgogICAgRFdPUkQgZHdMaWdodEluZGV4OwoKICAgIC8qIENoYWluZWQgbGlzdCB1c2VkIGZvciBhZGRpbmcgLyByZW1vdmluZyBmcm9tIHZpZXdwb3J0cyAqLwogICAgSURpcmVjdDNETGlnaHRJbXBsICAgICAgICAqbmV4dDsKCiAgICAvKiBBY3RpdmF0aW9uIGZ1bmN0aW9uICovCiAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICgqYWN0aXZhdGUpKElEaXJlY3QzRExpZ2h0SW1wbCopOwogICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKmRlc2FjdGl2YXRlKShJRGlyZWN0M0RMaWdodEltcGwqKTsKICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKCp1cGRhdGUpKElEaXJlY3QzRExpZ2h0SW1wbCopOwp9OwoKLyogVnRhYmxlICovCmNvbnN0IElEaXJlY3QzRExpZ2h0VnRibCBJRGlyZWN0M0RMaWdodF9WdGJsOwoKLyogSGVscGVyIGZ1bmN0aW9ucyAqLwp2b2lkIGxpZ2h0X3VwZGF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpOwp2b2lkIGxpZ2h0X2FjdGl2YXRlKElEaXJlY3QzRExpZ2h0SW1wbCogVGhpcyk7CnZvaWQgbGlnaHRfZGVzYWN0aXZhdGUoSURpcmVjdDNETGlnaHRJbXBsKiBUaGlzKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlIC0gV3JhcHMgdG8gRDNENwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdDNETWF0ZXJpYWxJbXBsCnsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRE1hdGVyaWFsMyk7CiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RNYXRlcmlhbDIpOwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNETWF0ZXJpYWwpOwogICAgTE9ORyAgcmVmOwoKICAgIC8qIElEaXJlY3QzRE1hdGVyaWFsMiBmaWVsZHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICAgICAgICpkZHJhdzsKICAgIElEaXJlY3QzRERldmljZUltcGwgICAgICAgICAgICphY3RpdmVfZGV2aWNlOwoKICAgIEQzRE1BVEVSSUFMIG1hdDsKICAgIERXT1JEIEhhbmRsZTsKCiAgICB2b2lkICgqYWN0aXZhdGUpKElEaXJlY3QzRE1hdGVyaWFsSW1wbCogdGhpcyk7Cn07CgovKiBWVGFibGVzIGluIHZhcmlvdXMgdmVyc2lvbnMgKi8KY29uc3QgSURpcmVjdDNETWF0ZXJpYWxWdGJsIElEaXJlY3QzRE1hdGVyaWFsX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRE1hdGVyaWFsMlZ0YmwgSURpcmVjdDNETWF0ZXJpYWwyX1Z0Ymw7CmNvbnN0IElEaXJlY3QzRE1hdGVyaWFsM1Z0YmwgSURpcmVjdDNETWF0ZXJpYWwzX1Z0Ymw7CgovKiBIZWxwZXIgZnVuY3Rpb25zICovCnZvaWQgbWF0ZXJpYWxfYWN0aXZhdGUoSURpcmVjdDNETWF0ZXJpYWxJbXBsKiBUaGlzKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RWaWV3cG9ydCAtIFdyYXBzIHRvIEQzRDcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgSURpcmVjdDNEVmlld3BvcnRJbXBsCnsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFZpZXdwb3J0Myk7CiAgICBMT05HIHJlZjsKCiAgICAvKiBJRGlyZWN0M0RWaWV3cG9ydCBmaWVsZHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICAgKmRkcmF3OwoKICAgIC8qIElmIHRoaXMgdmlld3BvcnQgaXMgYWN0aXZlIGZvciBvbmUgZGV2aWNlLCBwdXQgdGhlIGRldmljZSBoZXJlICovCiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICAgICAgICphY3RpdmVfZGV2aWNlOwoKICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgbnVtX2xpZ2h0czsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgbWFwX2xpZ2h0czsKCiAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIHVzZV92cDI7CgogICAgdW5pb24KICAgIHsKICAgICAgICBEM0RWSUVXUE9SVCB2cDE7CiAgICAgICAgRDNEVklFV1BPUlQyIHZwMjsKICAgIH0gdmlld3BvcnRzOwoKICAgIC8qIEFjdGl2YXRpb24gZnVuY3Rpb24gKi8KICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKCphY3RpdmF0ZSkoSURpcmVjdDNEVmlld3BvcnRJbXBsKik7CgogICAgLyogRmllbGQgdXNlZCB0byBjaGFpbiB2aWV3cG9ydHMgdG9nZXRoZXIgKi8KICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAgICAgKm5leHQ7CgogICAgLyogTGlnaHRzIGxpc3QgKi8KICAgIElEaXJlY3QzRExpZ2h0SW1wbCAgICAgICAgKmxpZ2h0czsKCiAgICAvKiBCYWNrZ3JvdW5kIG1hdGVyaWFsICovCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGwgICAgICpiYWNrZ3JvdW5kOwp9OwoKLyogVnRhYmxlICovCmNvbnN0IElEaXJlY3QzRFZpZXdwb3J0M1Z0YmwgSURpcmVjdDNEVmlld3BvcnQzX1Z0Ymw7CgovKiBIZWxwZXIgZnVuY3Rpb25zICovCnZvaWQgdmlld3BvcnRfYWN0aXZhdGUoSURpcmVjdDNEVmlld3BvcnRJbXBsKiBUaGlzKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIC0gV3JhcHMgdG8gRDNENwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbAp7CiAgICAvKiBJVW5rbm93biAqLwogICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcik7CiAgICBMT05HICAgICAgICAgICAgICAgICByZWY7CgogICAgLyogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciBmaWVsZHMgKi8KICAgIElEaXJlY3REcmF3SW1wbCAgICAgICpkZHJhdzsKICAgIElEaXJlY3QzRERldmljZUltcGwgICpkM2RkZXY7CgogICAgRDNERVhFQ1VURUJVRkZFUkRFU0MgZGVzYzsKICAgIEQzREVYRUNVVEVEQVRBICAgICAgIGRhdGE7CgogICAgLyogVGhpcyBidWZmZXIgd2lsbCBzdG9yZSB0aGUgdHJhbnNmb3JtZWQgdmVydGljZXMgKi8KICAgIHZvaWQgICAgICAgICAgICAgICAgICp2ZXJ0ZXhfZGF0YTsKICAgIFdPUkQgICAgICAgICAgICAgICAgICppbmRpY2VzOwogICAgaW50ICAgICAgICAgICAgICAgICAgbmJfaW5kaWNlczsKCiAgICAvKiBUaGlzIGZsYWdzIGlzIHNldCB0byBUUlVFIGlmIHdlIGFsbG9jYXRlZCBvdXJzZWx2ZXMgdGhlCiAgICAgKiBkYXRhIGJ1ZmZlcgogICAgICovCiAgICBCT09MICAgICAgICAgICAgICAgICBuZWVkX2ZyZWU7Cn07CgovKiBUaGUgVlRhYmxlICovCmNvbnN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJWdGJsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJfVnRibDsKCi8qIFRoZSBleGVjdXRlIGZ1bmN0aW9uICovCnZvaWQKSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfRXhlY3V0ZShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCAqVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpWaWV3cG9ydEltcGwpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsCnsKICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCiAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KTsKICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFZlcnRleEJ1ZmZlcik7CiAgICBMT05HICAgICAgICAgICAgICAgICByZWY7CgogICAgLyoqKiBXaW5lRDNEIGFuZCBkZHJhdyBsaW5rcyAqKiovCiAgICBJV2luZUQzRFZlcnRleEJ1ZmZlciAqd2luZUQzRFZlcnRleEJ1ZmZlcjsKICAgIElXaW5lRDNEVmVydGV4RGVjbGFyYXRpb24gKndpbmVEM0RWZXJ0ZXhEZWNsYXJhdGlvbjsKICAgIElEaXJlY3REcmF3SW1wbCAqZGRyYXc7CgogICAgLyoqKiBTdG9yYWdlIGZvciBEM0Q3IHNwZWNpZmljIHRoaW5ncyAqKiovCiAgICBEV09SRCAgICAgICAgICAgICAgICBDYXBzOwp9OwoKLyogVGhlIFZ0YWJsZXMgKi8KY29uc3QgSURpcmVjdDNEVmVydGV4QnVmZmVyN1Z0YmwgSURpcmVjdDNEVmVydGV4QnVmZmVyN19WdGJsOwpjb25zdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJWdGJsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjFfVnRibDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBIZWxwZXIgZnVuY3Rpb25zIGZyb20gdXRpbHMuYwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIEdFVF9URVhDT1VOVF9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUpIFwKICAgICgoKGQzZHZ0VmVydGV4VHlwZSkgJiBEM0RGVkZfVEVYQ09VTlRfTUFTSykgPj4gRDNERlZGX1RFWENPVU5UX1NISUZUKQoKI2RlZmluZSBHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUsIHRleF9udW0pIFwKICAgICgoKCgoZDNkdnRWZXJ0ZXhUeXBlKSA+PiAoMTYgKyAoMiAqICh0ZXhfbnVtKSkpKSArIDEpICYgMHgwMykgKyAxKQoKdm9pZCBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERChERFBJWEVMRk9STUFUICpERFBpeGVsRm9ybWF0LCBXSU5FRDNERk9STUFUIFdpbmVEM0RGb3JtYXQpOwpXSU5FRDNERk9STUFUIFBpeGVsRm9ybWF0X0REMldpbmVEM0QoY29uc3QgRERQSVhFTEZPUk1BVCAqRERQaXhlbEZvcm1hdCk7CnZvaWQgRERSQVdfZHVtcF9zdXJmYWNlX2Rlc2MoY29uc3QgRERTVVJGQUNFREVTQzIgKmxwZGRzZCk7CnZvaWQgRERSQVdfZHVtcF9waXhlbGZvcm1hdChjb25zdCBERFBJWEVMRk9STUFUICpQaXhlbEZvcm1hdCk7CnZvaWQgZHVtcF9EM0RNQVRSSVgoY29uc3QgRDNETUFUUklYICptYXQpOwp2b2lkIEREUkFXX2R1bXBfRERDQVBTKGNvbnN0IEREQ0FQUyAqbHBjYXBzKTsKRFdPUkQgZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKERXT1JEIGQzZHZ0VmVydGV4VHlwZSk7CnZvaWQgRERSQVdfZHVtcF9ERFNDQVBTMihjb25zdCBERFNDQVBTMiAqaW4pOwp2b2lkIEREUkFXX2R1bXBfY29vcGVyYXRpdmVsZXZlbChEV09SRCBjb29wbGV2ZWwpOwoKLyogVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGhlcmUgYXMgbG9uZyB0aGUgcHJvY2Vzc3ZlcnRpY2VzIGZ1bmN0aW9uYWxpdHkgb2YKICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciBpc24ndCBpbiBXaW5lRDNEICovCnZvaWQgbXVsdGlwbHlfbWF0cml4KExQRDNETUFUUklYIGRlc3QsIGNvbnN0IEQzRE1BVFJJWCAqc3JjMSwgY29uc3QgRDNETUFUUklYICpzcmMyKTsKCi8qIFVzZWQgZm9yIGdlbmVyaWMgZHVtcGluZyAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCB2YWw7CiAgICBjb25zdCBjaGFyKiBuYW1lOwp9IGZsYWdfaW5mbzsKCiNkZWZpbmUgRkUoeCkgeyB4LCAjeCB9Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCB2YWw7CiAgICBjb25zdCBjaGFyKiBuYW1lOwogICAgdm9pZCAoKmZ1bmMpKGNvbnN0IHZvaWQgKik7CiAgICBwdHJkaWZmX3Qgb2Zmc2V0Owp9IG1lbWJlcl9pbmZvOwoKLyogU3RydWN0dXJlIGNvcHkgKi8KI2RlZmluZSBNRSh4LGYsZSkgeyB4LCAjeCwgKHZvaWQgKCopKGNvbnN0IHZvaWQgKikpKGYpLCBvZmZzZXRvZihTVFJVQ1QsIGUpIH0KCiNkZWZpbmUgRERfU1RSVUNUX0NPUFlfQllTSVpFKHRvLGZyb20pICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIERXT1JEIF9fc2l6ZSA9ICh0byktPmR3U2l6ZTsgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBEV09SRCBfX2NvcHlzaXplID0gX19zaXplOyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgRFdPUkQgX19yZXNldHNpemUgPSBfX3NpemU7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGFzc2VydCh0byAhPSBmcm9tKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAoX19yZXNldHNpemUgPiBzaXplb2YoKnRvKSkgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIF9fcmVzZXRzaXplID0gc2l6ZW9mKCp0byk7ICAgICAgICAgIFwKICAgICAgICAgICAgICAgIG1lbXNldCh0bywwLF9fcmVzZXRzaXplKTsgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAoKGZyb20pLT5kd1NpemUgPCBfX3NpemUpICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIF9fY29weXNpemUgPSAoZnJvbSktPmR3U2l6ZTsgICAgICAgIFwKICAgICAgICAgICAgICAgIG1lbWNweSh0byxmcm9tLF9fY29weXNpemUpOyAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAodG8pLT5kd1NpemUgPSBfX3NpemU7LypyZXN0b3JlIHNpemUqLyAgXAogICAgICAgIH0gd2hpbGUgKDApCgoKI2VuZGlmCgpIUkVTVUxUIGhyX2RkcmF3X2Zyb21fd2luZWQzZChIUkVTVUxUIGhyKTsK