LyoKICogQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgRnJhbudvaXMgR291Z2V0CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlIDxycGMuaD4KI2luY2x1ZGUgPHJwY25kci5oPgoKI2lmbmRlZiBfT0JKQkFTRV9IXwojZGVmaW5lIF9PQkpCQVNFX0hfCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTWFjcm9zIHRvIGRlZmluZSBhIENPTSBpbnRlcmZhY2UKICovCi8qCiAqIFRoZSBnb2FsIG9mIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGRlZmluaXRpb25zIGlzIHRvIHByb3ZpZGUgYSB3YXkgdG8gdXNlIHRoZSBzYW1lCiAqIGhlYWRlciBmaWxlIGRlZmluaXRpb25zIHRvIHByb3ZpZGUgYm90aCBhIEMgaW50ZXJmYWNlIGFuZCBhIEMrKyBvYmplY3Qgb3JpZW50ZWQKICogaW50ZXJmYWNlIHRvIENPTSBpbnRlcmZhY2VzLiBUaGUgdHlwZSBvZiBpbnRlcmZhY2UgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseQogKiBkZXBlbmRpbmcgb24gdGhlIGxhbmd1YWdlIGJ1dCBpdCBpcyBhbHdheXMgcG9zc2libGUgdG8gZ2V0IHRoZSBDIGludGVyZmFjZSBpbiBDKysKICogYnkgZGVmaW5pbmcgQ0lOVEVSRkFDRS4KICoKICogSXQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9uczoKICogIC0gYWxsIENPTSBpbnRlcmZhY2VzIGRlcml2ZSBmcm9tIElVbmtub3duLCB0aGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLgogKiAgLSB0aGUgaGVhZGVyIGZpbGUgb25seSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UsIHRoZSBhY3R1YWwgZmllbGRzIGFyZSBkZWZpbmVkCiAqICAgIHNlcGFyYXRlbHkgaW4gdGhlIEMgZmlsZSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZS4KICoKICogVGhlIG5hdHVyYWwgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtIHdvdWxkIGJlIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYSBDKysgY2xhc3MgYW5kCiAqIHZpcnR1YWwgbWV0aG9kcyBpbiBDKysgYW5kIGEgc3RydWN0dXJlIHdpdGggYSB0YWJsZSBvZiBwb2ludGVyIHRvIGZ1bmN0aW9ucyBpbiBDLgogKiBVbmZvcnR1bmF0ZWx5IHRoZSBsYXlvdXQgb2YgdGhlIHZpcnR1YWwgdGFibGUgaXMgY29tcGlsZXIgc3BlY2lmaWMsIHRoZSBsYXlvdXQgb2YKICogZysrIHZpcnR1YWwgdGFibGVzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGF0IG9mIGFuIGVnY3MgdmlydHVhbCB0YWJsZSB3aGljaCBpcyBub3QgdGhlCiAqIHNhbWUgYXMgdGhhdCBnZW5lcmF0ZWQgYnkgVmlzdWFsIEMrLiBUaGVyZSBhcmUgd29ya2Fyb3VuZHMgdG8gbWFrZSB0aGUgdmlydHVhbCB0YWJsZXMKICogY29tcGF0aWJsZSB2aWEgcGFkZGluZyBidXQgdW5mb3J0dW5hdGVseSB0aGUgb25lIHdoaWNoIGlzIGltcG9zZWQgdG8gdGhlIFdJTkUgZW11bGF0b3IKICogYnkgdGhlIFdpbmRvd3MgYmluYXJpZXMsIGkuZS4gdGhlIFZpc3VhbCBDKysgb25lLCBpcyB0aGUgbW9zdCBjb21wYWN0IG9mIGFsbC4KICoKICogU28gdGhlIHNvbHV0aW9uIEkgZmluYWxseSBhZG9wdGVkIGRvZXMgbm90IHVzZSB2aXJ0dWFsIHRhYmxlcy4gSW5zdGVhZCBJIHVzZSBpbmxpbmUKICogbm9uIHZpcnR1YWwgbWV0aG9kcyB0aGF0IGRlcmVmZXJlbmNlIHRoZSBtZXRob2QgcG9pbnRlciB0aGVtc2VsdmVzIGFuZCBwZXJmb3JtIHRoZSBjYWxsLgogKgogKiBMZXQncyB0YWtlIERpcmVjdDNEIGFzIGFuIGV4YW1wbGU6CiAqCiAqICAgICNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRAogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9NRVRIT0RTIFwKICogICAgICAgIElVbmtub3duX01FVEhPRFMgXAogKiAgICAgICAgU1RETUVUSE9EKEluaXRpYWxpemUpKFRISVNfIFJFRklJRCkgUFVSRTsgXAogKiAgICAgICAgU1RETUVUSE9EKEVudW1EZXZpY2VzKShUSElTXyBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0ssIExQVk9JRCkgUFVSRTsgXAogKiAgICAgICAgU1RETUVUSE9EKENyZWF0ZUxpZ2h0KShUSElTXyBMUERJUkVDVDNETElHSFQqLCBJVW5rbm93biopIFBVUkU7IFwKICogICAgICAgIFNURE1FVEhPRChDcmVhdGVNYXRlcmlhbCkoVEhJU18gTFBESVJFQ1QzRE1BVEVSSUFMKiwgSVVua25vd24qKSBQVVJFOyBcCiAqICAgICAgICBTVERNRVRIT0QoQ3JlYXRlVmlld3BvcnQpKFRISVNfIExQRElSRUNUM0RWSUVXUE9SVCosIElVbmtub3duKikgUFVSRTsgXAogKiAgICAgICAgU1RETUVUSE9EKEZpbmREZXZpY2UpKFRISVNfIExQRDNERklORERFVklDRVNFQVJDSCwgTFBEM0RGSU5EREVWSUNFUkVTVUxUKSBQVVJFOwogKiAgICBERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNELElVbmtub3duKSB7IElEaXJlY3QzRF9NRVRIT0RTIH07CiAqICAgICN1bmRlZiBJTlRFUkZBQ0UKICoKICogICAgI2lmZGVmIENPQkpNQUNST1MKICogICAgLy8gKioqIElVbmtub3duIG1ldGhvZHMgKioqIC8vCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0FkZFJlZihwKSAgICAgICAgICAgICAocCktPmxwVnRibC0+QWRkUmVmKHApCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX1JlbGVhc2UocCkgICAgICAgICAgICAocCktPmxwVnRibC0+UmVsZWFzZShwKQogKiAgICAvLyAqKiogSURpcmVjdDNEIG1ldGhvZHMgKioqIC8vCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0luaXRpYWxpemUocCxhKSAgICAgICAocCktPmxwVnRibC0+SW5pdGlhbGl6ZShwLGEpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0VudW1EZXZpY2VzKHAsYSxiKSAgICAocCktPmxwVnRibC0+RW51bURldmljZShwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlTGlnaHQocCxhLGIpICAgIChwKS0+bHBWdGJsLT5DcmVhdGVMaWdodChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlTWF0ZXJpYWwocCxhLGIpIChwKS0+bHBWdGJsLT5DcmVhdGVNYXRlcmlhbChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlVmlld3BvcnQocCxhLGIpIChwKS0+bHBWdGJsLT5DcmVhdGVWaWV3cG9ydChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfRmluZERldmljZShwLGEsYikgICAgIChwKS0+bHBWdGJsLT5GaW5kRGV2aWNlKHAsYSxiKQogKiAgICAjZW5kaWYKICoKICogQ29tbWVudHM6CiAqICAtIFRoZSBJTlRFUkZBQ0UgbWFjcm8gaXMgdXNlZCBpbiB0aGUgU1RETUVUSE9EIG1hY3JvcyB0byBkZWZpbmUgdGhlIHR5cGUgb2YgdGhlICd0aGlzJwogKiAgICBwb2ludGVyLiBEZWZpbmluZyB0aGlzIG1hY3JvIGhlcmUgc2F2ZXMgdXMgdGhlIHRyb3VibGUgb2YgaGF2aW5nIHRvIHJlcGVhdCB0aGUgaW50ZXJmYWNlCiAqICAgIG5hbWUgZXZlcnl3aGVyZS4gTm90ZSBob3dldmVyIHRoYXQgYmVjYXVzZSBvZiB0aGUgd2F5IG1hY3JvcyB3b3JrLCBhIG1hY3JvIGxpa2UgU1RETUVUSE9ECiAqICAgIGNhbm5vdCB1c2UgJ0lOVEVSRkFDRSMjX1ZUQUJMRScgYmVjYXVzZSB0aGlzIHdvdWxkIGdpdmUgJ0lOVEVSRkFDRV9WVEFCTEUnIGFuZCBub3QKICogICAgJ0lEaXJlY3QzRF9WVEFCTEUnLgogKiAgLSBJQ09NX01FVEhPRFMgZGVmaW5lcyB0aGUgbGlzdCBvZiBtZXRob2RzIHRoYXQgYXJlIGluaGVyaXRhYmxlIGZyb20gdGhpcyBpbnRlcmZhY2UuIEl0IG11c3QKICogICAgYmUgd3JpdHRlbiBtYW51YWxseSAocmF0aGVyIHRoYW4gdXNpbmcgYSBtYWNybyB0byBnZW5lcmF0ZSB0aGUgZXF1aXZhbGVudCBjb2RlKSB0byBhdm9pZAogKiAgICBtYWNybyByZWN1cnNpb24gKHdoaWNoIGNvbXBpbGVycyBkb24ndCBsaWtlKS4gSXQgbXVzdCBzdGFydCB3aXRoIHRoZSBNRVRIT0RTIGRlZmluaXRpb24KICogICAgb2YgdGhlIHBhcmVudCBpbnRlcmZhY2Ugc28gdGhhdCBtZXRob2QgaW5oZXJpdGFuY2Ugd29ya3MgcHJvcGVybHkuCiAqICAtIFRoZSBERUNMQVJFX0lOVEVSRkFDRSBmaW5hbGx5IGRlY2xhcmVzIGFsbCB0aGUgc3RydWN0dXJlcyBuZWNlc3NhcnkgZm9yIHRoZSBpbnRlcmZhY2UuIFdlIGhhdmUKICogICAgdG8gZXhwbGljaXRseSB1c2UgdGhlIGludGVyZmFjZSBuYW1lIGZvciBtYWNybyBleHBhbnNpb24gcmVhc29ucyBhZ2Fpbi4KICogIC0gVGhlICd1bmRlZiBJTlRFUkZBQ0UnIGlzIGhlcmUgdG8gcmVtaW5kIHlvdSB0aGF0IHVzaW5nIElOVEVSRkFDRSBpbiB0aGUgZm9sbG93aW5nIG1hY3JvcwogKiAgICB3aWxsIG5vdCB3b3JrLgogKiAgLSBGaW5hbGx5IHRoZSBzZXQgb2YgJ0lEaXJlY3QzRF9YeHgnIG1hY3JvcyBpcyBhIHN0YW5kYXJkIHNldCBvZiBtYWNyb3MgZGVmaW5lZCB0byBlYXNlIGFjY2VzcwogKiAgICB0byB0aGUgaW50ZXJmYWNlIG1ldGhvZHMgaW4gQy4gVW5mb3J0dW5hdGVseSBJIGRvbid0IHNlZSBhbnkgd2F5IHRvIGF2b2lkIGhhdmluZyB0byBkdXBsaWNhdGUKICogICAgdGhlIGluaGVyaXRlZCBtZXRob2QgZGVmaW5pdGlvbnMgdGhlcmUuIFRoaXMgdGltZSBJIGNvdWxkIGhhdmUgdXNlZCBhIHRyaWNrIHRvIHVzZSBvbmx5IG9uZQogKiAgICBtYWNybyB3aGF0ZXZlciB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYnV0IEkgcHJlZmVyZWQgdG8gaGF2ZSBpdCB3b3JrIHRoZSBzYW1lIHdheSBhcyBhYm92ZS4KICogIC0gWW91IHByb2JhYmx5IGhhdmUgbm90aWNlZCB0aGF0IHdlIGRvbid0IGRlZmluZSB0aGUgZmllbGRzIHdlIG5lZWQgdG8gYWN0dWFsbHkgaW1wbGVtZW50IHRoaXMKICogICAgaW50ZXJmYWNlOiByZWZlcmVuY2UgY291bnQsIHBvaW50ZXIgdG8gb3RoZXIgcmVzb3VyY2VzIGFuZCBtaXNjZWxsYW5lb3VzIGZpZWxkcy4gVGhhdCdzCiAqICAgIGJlY2F1c2UgdGhlc2UgaW50ZXJmYWNlcyBhcmUganVzdCB0aGF0OiBpbnRlcmZhY2VzLiBUaGV5IG1heSBiZSBpbXBsZW1lbnRlZCBtb3JlIHRoYW4gb25jZSwgaW4KICogICAgZGlmZmVyZW50IGNvbnRleHRzIGFuZCBzb21ldGltZXMgbm90IGV2ZW4gaW4gV2luZS4gVGh1cyBpdCB3b3VsZCBub3QgbWFrZSBzZW5zZSB0byBpbXBvc2UKICogICAgdGhhdCB0aGUgaW50ZXJmYWNlIGNvbnRhaW5zIHNvbWUgc3BlY2lmaWMgZmllbGRzLgogKgogKgogKiBJbiBDIHRoaXMgZ2l2ZXM6CiAqICAgIHR5cGVkZWYgc3RydWN0IElEaXJlY3QzRFZ0YmwgSURpcmVjdDNEVnRibDsKICogICAgc3RydWN0IElEaXJlY3QzRCB7CiAqICAgICAgICBJRGlyZWN0M0RWdGJsKiBscFZ0Ymw7CiAqICAgIH07CiAqICAgIHN0cnVjdCBJRGlyZWN0M0RWdGJsIHsKICogICAgICAgIEhSRVNVTFQgKCpRdWVyeUludGVyZmFjZSkoSURpcmVjdDNEKiBtZSwgUkVGSUlEIHJpaWQsIExQVk9JRCogcHB2T2JqKTsKICogICAgICAgIFVMT05HICgqUXVlcnlJbnRlcmZhY2UpKElEaXJlY3QzRCogbWUpOwogKiAgICAgICAgVUxPTkcgKCpRdWVyeUludGVyZmFjZSkoSURpcmVjdDNEKiBtZSk7CiAqICAgICAgICBIUkVTVUxUICgqSW5pdGlhbGl6ZSkoSURpcmVjdDNEKiBtZSwgUkVGSUlEIGEpOwogKiAgICAgICAgSFJFU1VMVCAoKkVudW1EZXZpY2VzKShJRGlyZWN0M0QqIG1lLCBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0sgYSwgTFBWT0lEIGIpOwogKiAgICAgICAgSFJFU1VMVCAoKkNyZWF0ZUxpZ2h0KShJRGlyZWN0M0QqIG1lLCBMUERJUkVDVDNETElHSFQqIGEsIElVbmtub3duKiBiKTsKICogICAgICAgIEhSRVNVTFQgKCpDcmVhdGVNYXRlcmlhbCkoSURpcmVjdDNEKiBtZSwgTFBESVJFQ1QzRE1BVEVSSUFMKiBhLCBJVW5rbm93biogYik7CiAqICAgICAgICBIUkVTVUxUICgqQ3JlYXRlVmlld3BvcnQpKElEaXJlY3QzRCogbWUsIExQRElSRUNUM0RWSUVXUE9SVCogYSwgSVVua25vd24qIGIpOwogKiAgICAgICAgSFJFU1VMVCAoKkZpbmREZXZpY2UpKElEaXJlY3QzRCogbWUsIExQRDNERklORERFVklDRVNFQVJDSCBhLCBMUEQzREZJTkRERVZJQ0VSRVNVTFQgYik7CiAqICAgIH07CiAqCiAqICAgICNpZmRlZiBDT0JKTUFDUk9TCiAqICAgIC8vICoqKiBJVW5rbm93biBtZXRob2RzICoqKiAvLwogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9BZGRSZWYocCkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkFkZFJlZihwKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9SZWxlYXNlKHApICAgICAgICAgICAgKHApLT5scFZ0YmwtPlJlbGVhc2UocCkKICogICAgLy8gKioqIElEaXJlY3QzRCBtZXRob2RzICoqKiAvLwogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9Jbml0aWFsaXplKHAsYSkgICAgICAgKHApLT5scFZ0YmwtPkluaXRpYWxpemUocCxhKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9FbnVtRGV2aWNlcyhwLGEsYikgICAgKHApLT5scFZ0YmwtPkVudW1EZXZpY2UocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZUxpZ2h0KHAsYSxiKSAgICAocCktPmxwVnRibC0+Q3JlYXRlTGlnaHQocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZU1hdGVyaWFsKHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlTWF0ZXJpYWwocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZVZpZXdwb3J0KHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlVmlld3BvcnQocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0ZpbmREZXZpY2UocCxhLGIpICAgICAocCktPmxwVnRibC0+RmluZERldmljZShwLGEsYikKICogICAgI2VuZGlmCiAqCiAqIENvbW1lbnRzOgogKiAgLSBJRGlyZWN0M0Qgb25seSBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIElEaXJlY3QzRCB2aXJ0dWFsL2p1bXAgdGFibGUuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcKICogICAgdGhlIHVzZXIgbmVlZHMgdG8ga25vdyB0byB1c2UgdGhlIGludGVyZmFjZS4gT2YgY291cnNlIHRoZSBzdHJ1Y3R1cmUgd2Ugd2lsbCBkZWZpbmUgdG8KICogICAgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHdpbGwgaGF2ZSBtb3JlIGZpZWxkcyBidXQgdGhlIGZpcnN0IG9uZSB3aWxsIG1hdGNoIHRoaXMgcG9pbnRlci4KICogIC0gVGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IERFQ0xBUkVfSU5URVJGQUNFIGRlZmluZXMgYm90aCB0aGUgc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgaW50ZXJmYWNlIGFuZAogKiAgICB0aGUgc3RydWN0dXJlIGZvciB0aGUganVtcCB0YWJsZS4gREVDTEFSRV9JTlRFUkZBQ0UgdXNlcyB0aGUgcGFyZW50J3MgWHh4X01FVEhPRFMgbWFjcm8gdG8KICogICAgYXV0b21hdGljYWxseSByZXBlYXQgdGhlIHByb3RvdHlwZXMgb2YgYWxsIHRoZSBpbmhlcml0ZWQgbWV0aG9kcyBhbmQgdGhlbiB1c2VzIElEaXJlY3QzRF9NRVRIT0RTCiAqICAgIHRvIGRlZmluZSB0aGUgSURpcmVjdDNEIG1ldGhvZHMuCiAqICAtIEVhY2ggbWV0aG9kIGlzIGRlY2xhcmVkIGFzIGEgcG9pbnRlciB0byBmdW5jdGlvbiBmaWVsZCBpbiB0aGUganVtcCB0YWJsZS4gVGhlIGltcGxlbWVudGF0aW9uCiAqICAgIHdpbGwgZmlsbCB0aGlzIGp1bXAgdGFibGUgd2l0aCBhcHByb3ByaWF0ZSB2YWx1ZXMsIHByb2JhYmx5IHVzaW5nIGEgc3RhdGljIHZhcmlhYmxlLCBhbmQKICogICAgaW5pdGlhbGl6ZSB0aGUgbHBWdGJsIGZpZWxkIHRvIHBvaW50IHRvIHRoaXMgdmFyaWFibGUuCiAqICAtIFRoZSBJRGlyZWN0M0RfWHh4IG1hY3JvcyB0aGVuIGp1c3QgZGVyZWZlbmNlIHRoZSBscFZ0YmwgcG9pbnRlciBhbmQgdXNlIHRoZSBmdW5jdGlvbiBwb2ludGVyCiAqICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hY3JvIG5hbWUuIFRoaXMgZW11bGF0ZXMgdGhlIGJlaGF2aW9yIG9mIGEgdmlydHVhbCB0YWJsZSBhbmQgc2hvdWxkIGJlCiAqICAgIGp1c3QgYXMgZmFzdC4KICogIC0gVGhpcyBDIGNvZGUgc2hvdWxkIGJlIHF1aXRlIGNvbXBhdGlibGUgd2l0aCB0aGUgV2luZG93cyBoZWFkZXJzIGJvdGggZm9yIGNvZGUgdGhhdCB1c2VzIENPTQogKiAgICBpbnRlcmZhY2VzIGFuZCBmb3IgY29kZSBpbXBsZW1lbnRpbmcgYSBDT00gaW50ZXJmYWNlLgogKgogKgogKiBBbmQgaW4gQysrICh3aXRoIGdjYydzIGcrKyk6CiAqCiAqICAgIHR5cGVkZWYgc3RydWN0IElEaXJlY3QzRDogcHVibGljIElVbmtub3duIHsKICogICAgICAgIHZpcnR1YWwgSFJFU1VMVCBJbml0aWFsaXplKFJFRklJRCBhKSA9IDA7CiAqICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgRW51bURldmljZXMoTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLIGEsIExQVk9JRCBiKSA9IDA7CiAqICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgQ3JlYXRlTGlnaHQoTFBESVJFQ1QzRExJR0hUKiBhLCBJVW5rbm93biogYikgPSAwOwogKiAgICAgICAgdmlydHVhbCBIUkVTVUxUIENyZWF0ZU1hdGVyaWFsKExQRElSRUNUM0RNQVRFUklBTCogYSwgSVVua25vd24qIGIpID0gMDsKICogICAgICAgIHZpcnR1YWwgSFJFU1VMVCBDcmVhdGVWaWV3cG9ydChMUERJUkVDVDNEVklFV1BPUlQqIGEsIElVbmtub3duKiBiKSA9IDA7CiAqICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgRmluZERldmljZShMUEQzREZJTkRERVZJQ0VTRUFSQ0ggYSwgTFBEM0RGSU5EREVWSUNFUkVTVUxUIGIpID0gMDsKICogICAgfTsKICoKICogQ29tbWVudHM6CiAqICAtIE9mIGNvdXJzZSBpbiBDKysgd2UgdXNlIGluaGVyaXRhbmNlIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBkdXBsaWNhdGUgdGhlIG1ldGhvZCBkZWZpbml0aW9ucy4KICogIC0gRmluYWxseSB0aGVyZSBpcyBubyBJRGlyZWN0M0RfWHh4IG1hY3JvLiBUaGVzZSBhcmUgbm90IG5lZWRlZCBpbiBDKysgdW5sZXNzIHRoZSBDSU5URVJGQUNFCiAqICAgIG1hY3JvIGlzIGRlZmluZWQgaW4gd2hpY2ggY2FzZSB3ZSB3b3VsZCBub3QgYmUgaGVyZS4KICoKICoKICogSW1wbGVtZW50aW5nIGEgQ09NIGludGVyZmFjZS4KICoKICogVGhpcyBjb250aW51ZXMgdGhlIGFib3ZlIGV4YW1wbGUuIFRoaXMgZXhhbXBsZSBhc3N1bWVzIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGluIEMuCiAqCiAqICAgIHR5cGVkZWYgc3RydWN0IElEaXJlY3QzREltcGwgewogKiAgICAgICAgdm9pZCogbHBWdGJsOwogKiAgICAgICAgLy8gLi4uCiAqCiAqICAgIH0gSURpcmVjdDNESW1wbDsKICoKICogICAgc3RhdGljIElEaXJlY3QzRFZ0YmwgZDNkdnQ7CiAqCiAqICAgIC8vIGltcGxlbWVudCB0aGUgSURpcmVjdDNEIG1ldGhvZHMgaGVyZQogKgogKiAgICBpbnQgSURpcmVjdDNEX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRCogbWUpCiAqICAgIHsKICogICAgICAgIElEaXJlY3QzREltcGwgKlRoaXMgPSAoSURpcmVjdDNESW1wbCAqKW1lOwogKiAgICAgICAgLy8gLi4uCiAqICAgIH0KICoKICogICAgLy8gLi4uCiAqCiAqICAgIHN0YXRpYyBJRGlyZWN0M0RWdGJsIGQzZHZ0ID0gewogKiAgICAgICAgSURpcmVjdDNEX1F1ZXJ5SW50ZXJmYWNlLAogKiAgICAgICAgSURpcmVjdDNEX0FkZCwKICogICAgICAgIElEaXJlY3QzRF9BZGQyLAogKiAgICAgICAgSURpcmVjdDNEX0luaXRpYWxpemUsCiAqICAgICAgICBJRGlyZWN0M0RfU2V0V2lkdGgKICogICAgfTsKICoKICogQ29tbWVudHM6CiAqICAtIFdlIGZpcnN0IGRlZmluZSB3aGF0IHRoZSBpbnRlcmZhY2UgcmVhbGx5IGNvbnRhaW5zLiBUaGlzIGlzIHRoZSBJRGlyZWN0M0RJbXBsIHN0cnVjdHVyZS4gVGhlCiAqICAgIGZpcnN0IGZpZWxkIG11c3Qgb2YgY291cnNlIGJlIHRoZSB2aXJ0dWFsIHRhYmxlIHBvaW50ZXIuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBmcmVlLgogKiAgLSBUaGVuIHdlIHByZWRlY2xhcmUgb3VyIHN0YXRpYyB2aXJ0dWFsIHRhYmxlIHZhcmlhYmxlLCB3ZSB3aWxsIG5lZWQgaXRzIGFkZHJlc3MgaW4gc29tZQogKiAgICBtZXRob2RzIHRvIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgdGFibGUgcG9pbnRlciBvZiB0aGUgcmV0dXJuZWQgaW50ZXJmYWNlIG9iamVjdHMuCiAqICAtIFRoZW4gd2UgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgbWV0aG9kcy4gVG8gbWF0Y2ggd2hhdCBoYXMgYmVlbiBkZWNsYXJlZCBpbiB0aGUgaGVhZGVyIGZpbGUKICogICAgdGhleSBtdXN0IHRha2UgYSBwb2ludGVyIHRvIGEgSURpcmVjdDNEIHN0cnVjdHVyZSBhbmQgd2UgbXVzdCBjYXN0IGl0IHRvIGFuIElEaXJlY3QzREltcGwgc28KICogICAgdGhhdCB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgZmllbGRzLgogKiAgLSBGaW5hbGx5IHdlIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgdGFibGUuCiAqLwoKI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKENJTlRFUkZBQ0UpCgovKiBDKysgaW50ZXJmYWNlICovCgojZGVmaW5lIFNURE1FVEhPRChtZXRob2QpICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkgIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmluZSBTVERNRVRIT0RWKG1ldGhvZCkgICAgICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRFZDQUxMVFlQRSBtZXRob2QKI2RlZmluZSBTVERNRVRIT0RWXyh0eXBlLG1ldGhvZCkgdmlydHVhbCB0eXBlIFNURE1FVEhPRFZDQUxMVFlQRSBtZXRob2QKCiNkZWZpbmUgUFVSRSAgID0gMAojZGVmaW5lIFRISVNfCiNkZWZpbmUgVEhJUyAgIHZvaWQKCiNkZWZpbmUgaW50ZXJmYWNlIHN0cnVjdAojZGVmaW5lIERFQ0xBUkVfSU5URVJGQUNFKGlmYWNlKSAgICAgICAgaW50ZXJmYWNlIGlmYWNlCiNkZWZpbmUgREVDTEFSRV9JTlRFUkZBQ0VfKGlmYWNlLGliYXNlKSBpbnRlcmZhY2UgaWZhY2UgOiBwdWJsaWMgaWJhc2UKCiNkZWZpbmUgQkVHSU5fSU5URVJGQUNFCiNkZWZpbmUgRU5EX0lOVEVSRkFDRQoKI2Vsc2UgIC8qIF9fY3BsdXNwbHVzICYmICFDSU5URVJGQUNFICovCgovKiBDIGludGVyZmFjZSAqLwoKI2RlZmluZSBDT0JKTUFDUk9TCgojZGVmaW5lIFNURE1FVEhPRChtZXRob2QpICAgICAgICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqbWV0aG9kKQojZGVmaW5lIFNURE1FVEhPRF8odHlwZSxtZXRob2QpICB0eXBlIChTVERNRVRIT0RDQUxMVFlQRSAqbWV0aG9kKQojZGVmaW5lIFNURE1FVEhPRFYobWV0aG9kKSAgICAgICBIUkVTVUxUIChTVERNRVRIT0RWQ0FMTFRZUEUgKm1ldGhvZCkKI2RlZmluZSBTVERNRVRIT0RWXyh0eXBlLG1ldGhvZCkgdHlwZSAoU1RETUVUSE9EVkNBTExUWVBFICptZXRob2QpCgojZGVmaW5lIFBVUkUKI2RlZmluZSBUSElTXyBJTlRFUkZBQ0UgKlRoaXMsCiNkZWZpbmUgVEhJUyAgSU5URVJGQUNFICpUaGlzCgojZGVmaW5lIGludGVyZmFjZSBzdHJ1Y3QKCiNpZmRlZiBDT05TVF9WVEFCTEUKI3VuZGVmIENPTlNUX1ZUQkwKI2RlZmluZSBDT05TVF9WVEJMIGNvbnN0CiNkZWZpbmUgREVDTEFSRV9JTlRFUkZBQ0UoaWZhY2UpIFwKICAgICAgICAgLyp0eXBlZGVmKi8gaW50ZXJmYWNlIGlmYWNlIHsgY29uc3Qgc3RydWN0IGlmYWNlIyNWdGJsICpscFZ0Ymw7IH0gLyppZmFjZSovOyBcCiAgICAgICAgIHR5cGVkZWYgY29uc3Qgc3RydWN0IGlmYWNlIyNWdGJsIGlmYWNlIyNWdGJsOyBcCiAgICAgICAgIGNvbnN0IHN0cnVjdCBpZmFjZSMjVnRibAojZWxzZQojdW5kZWYgQ09OU1RfVlRCTAojZGVmaW5lIENPTlNUX1ZUQkwKI2RlZmluZSBERUNMQVJFX0lOVEVSRkFDRShpZmFjZSkgXAogICAgICAgICAvKnR5cGVkZWYqLyBpbnRlcmZhY2UgaWZhY2UgeyBzdHJ1Y3QgaWZhY2UjI1Z0YmwgKmxwVnRibDsgfSAvKmlmYWNlKi87IFwKICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgaWZhY2UjI1Z0YmwgaWZhY2UjI1Z0Ymw7IFwKICAgICAgICAgc3RydWN0IGlmYWNlIyNWdGJsCiNlbmRpZgojZGVmaW5lIERFQ0xBUkVfSU5URVJGQUNFXyhpZmFjZSxpYmFzZSkgREVDTEFSRV9JTlRFUkZBQ0UoaWZhY2UpCgojZGVmaW5lIEJFR0lOX0lOVEVSRkFDRQojZGVmaW5lIEVORF9JTlRFUkZBQ0UKCiNlbmRpZiAgLyogX19jcGx1c3BsdXMgJiYgIUNJTlRFUkZBQ0UgKi8KCiNpbmNsdWRlIDxvYmppZGwuaD4KCiNpZm5kZWYgUkNfSU5WT0tFRAovKiBGb3IgY29tcGF0aWJpbGl0eSBvbmx5LCBhdCBsZWFzdCBmb3Igbm93ICovCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCgojaWZuZGVmIElOSVRHVUlECiNpbmNsdWRlIDxjZ3VpZC5oPgojZW5kaWYKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmCgojaWZuZGVmIE5PTkFNRUxFU1NTVFJVQ1QKI2RlZmluZSBMSVNldDMyKGxpLCB2KSAgICgobGkpLkhpZ2hQYXJ0ID0gKHYpIDwgMCA/IC0xIDogMCwgKGxpKS5Mb3dQYXJ0ID0gKHYpKQojZGVmaW5lIFVMSVNldDMyKGxpLCB2KSAgKChsaSkuSGlnaFBhcnQgPSAwLCAobGkpLkxvd1BhcnQgPSAodikpCiNlbHNlCiNkZWZpbmUgTElTZXQzMihsaSwgdikgICAoKGxpKS51LkhpZ2hQYXJ0ID0gKHYpIDwgMCA/IC0xIDogMCwgKGxpKS51Lkxvd1BhcnQgPSAodikpCiNkZWZpbmUgVUxJU2V0MzIobGksIHYpICAoKGxpKS51LkhpZ2hQYXJ0ID0gMCwgKGxpKS51Lkxvd1BhcnQgPSAodikpCiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVN0YW5kYXJkIEFQSQogKi8KRFdPUkQgV0lOQVBJIENvQnVpbGRWZXJzaW9uKHZvaWQpOwoKdHlwZWRlZiBlbnVtIHRhZ0NPSU5JVAp7CiAgICBDT0lOSVRfQVBBUlRNRU5UVEhSRUFERUQgID0gMHgyLCAvKiBBcGFydG1lbnQgbW9kZWwgKi8KICAgIENPSU5JVF9NVUxUSVRIUkVBREVEICAgICAgPSAweDAsIC8qIE9MRSBjYWxscyBvYmplY3RzIG9uIGFueSB0aHJlYWQgKi8KICAgIENPSU5JVF9ESVNBQkxFX09MRTFEREUgICAgPSAweDQsIC8qIERvbid0IHVzZSBEREUgZm9yIE9sZTEgc3VwcG9ydCAqLwogICAgQ09JTklUX1NQRUVEX09WRVJfTUVNT1JZICA9IDB4OCAgLyogVHJhZGUgbWVtb3J5IGZvciBzcGVlZCAqLwp9IENPSU5JVDsKCkhSRVNVTFQgV0lOQVBJIENvSW5pdGlhbGl6ZShMUFZPSUQgbHBSZXNlcnZlZCk7CkhSRVNVTFQgV0lOQVBJIENvSW5pdGlhbGl6ZUV4KExQVk9JRCBscFJlc2VydmVkLCBEV09SRCBkd0NvSW5pdCk7CnZvaWQgV0lOQVBJIENvVW5pbml0aWFsaXplKHZvaWQpOwpEV09SRCBXSU5BUEkgQ29HZXRDdXJyZW50UHJvY2Vzcyh2b2lkKTsKCkhJTlNUQU5DRSBXSU5BUEkgQ29Mb2FkTGlicmFyeShMUE9MRVNUUiBscHN6TGliTmFtZSwgQk9PTCBiQXV0b0ZyZWUpOwp2b2lkIFdJTkFQSSBDb0ZyZWVBbGxMaWJyYXJpZXModm9pZCk7CnZvaWQgV0lOQVBJIENvRnJlZUxpYnJhcnkoSElOU1RBTkNFIGhMaWJyYXJ5KTsKdm9pZCBXSU5BUEkgQ29GcmVlVW51c2VkTGlicmFyaWVzKHZvaWQpOwoKSFJFU1VMVCBXSU5BUEkgQ29DcmVhdGVJbnN0YW5jZShSRUZDTFNJRCByY2xzaWQsIExQVU5LTk9XTiBwVW5rT3V0ZXIsIERXT1JEIGR3Q2xzQ29udGV4dCwgUkVGSUlEIGlpZCwgTFBWT0lEICpwcHYpOwpIUkVTVUxUIFdJTkFQSSBDb0NyZWF0ZUluc3RhbmNlRXgoUkVGQ0xTSUQgICAgICByY2xzaWQsCgkJCQkgIExQVU5LTk9XTiAgICAgcFVua091dGVyLAoJCQkJICBEV09SRCAgICAgICAgIGR3Q2xzQ29udGV4dCwKCQkJCSAgQ09TRVJWRVJJTkZPKiBwU2VydmVySW5mbywKCQkJCSAgVUxPTkcgICAgICAgICBjbXEsCgkJCQkgIE1VTFRJX1FJKiAgICAgcFJlc3VsdHMpOwoKSFJFU1VMVCBXSU5BUEkgQ29HZXRJbnN0YW5jZUZyb21GaWxlKENPU0VSVkVSSU5GTyogcFNlcnZlckluZm8sIENMU0lEKiBwQ2xzaWQsIElVbmtub3duKiBwdW5rT3V0ZXIsIERXT1JEIGR3Q2xzQ3R4LCBEV09SRCBncmZNb2RlLCBPTEVDSEFSKiBwd3N6TmFtZSwgRFdPUkQgZHdDb3VudCwgTVVMVElfUUkqIHBSZXN1bHRzKTsKSFJFU1VMVCBXSU5BUEkgQ29HZXRJbnN0YW5jZUZyb21JU3RvcmFnZShDT1NFUlZFUklORk8qIHBTZXJ2ZXJJbmZvLCBDTFNJRCogcENsc2lkLCBJVW5rbm93biogcHVua091dGVyLCBEV09SRCBkd0Nsc0N0eCwgSVN0b3JhZ2UqIHBzdGcsIERXT1JEIGR3Q291bnQsIE1VTFRJX1FJKiBwUmVzdWx0cyk7CgpIUkVTVUxUIFdJTkFQSSBDb0dldE1hbGxvYyhEV09SRCBkd01lbUNvbnRleHQsIExQTUFMTE9DKiBscE1hbGxvYyk7CkxQVk9JRCBXSU5BUEkgQ29UYXNrTWVtQWxsb2MoVUxPTkcgc2l6ZSk7CnZvaWQgV0lOQVBJIENvVGFza01lbUZyZWUoTFBWT0lEIHB0cik7CkxQVk9JRCBXSU5BUEkgQ29UYXNrTWVtUmVhbGxvYyhMUFZPSUQgcHRyLCBVTE9ORyBzaXplKTsKCkhSRVNVTFQgV0lOQVBJIENvUmVnaXN0ZXJNYWxsb2NTcHkoTFBNQUxMT0NTUFkgcE1hbGxvY1NweSk7CkhSRVNVTFQgV0lOQVBJIENvUmV2b2tlTWFsbG9jU3B5KHZvaWQpOwoKLyogY2xhc3MgcmVnaXN0cmF0aW9uIGZsYWdzOyBwYXNzZWQgdG8gQ29SZWdpc3RlckNsYXNzT2JqZWN0ICovCnR5cGVkZWYgZW51bSB0YWdSRUdDTFMKewogICAgUkVHQ0xTX1NJTkdMRVVTRSA9IDAsCiAgICBSRUdDTFNfTVVMVElQTEVVU0UgPSAxLAogICAgUkVHQ0xTX01VTFRJX1NFUEFSQVRFID0gMiwKICAgIFJFR0NMU19TVVNQRU5ERUQgPSA0Cn0gUkVHQ0xTOwoKSFJFU1VMVCBXSU5BUEkgQ29HZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsIERXT1JEIGR3Q2xzQ29udGV4dCwgQ09TRVJWRVJJTkZPICpwU2VydmVySW5mbywgUkVGSUlEIGlpZCwgTFBWT0lEICpwcHYpOwpIUkVTVUxUIFdJTkFQSSBDb1JlZ2lzdGVyQ2xhc3NPYmplY3QoUkVGQ0xTSUQgcmNsc2lkLExQVU5LTk9XTiBwVW5rLERXT1JEIGR3Q2xzQ29udGV4dCxEV09SRCBmbGFncyxMUERXT1JEIGxwZHdSZWdpc3Rlcik7CkhSRVNVTFQgV0lOQVBJIENvUmV2b2tlQ2xhc3NPYmplY3QoRFdPUkQgZHdSZWdpc3Rlcik7CkhSRVNVTFQgV0lOQVBJIENvR2V0UFNDbHNpZChSRUZJSUQgcmlpZCxDTFNJRCAqcGNsc2lkKTsKSFJFU1VMVCBXSU5BUEkgQ29SZWdpc3RlclBTQ2xzaWQoUkVGSUlEIHJpaWQsIFJFRkNMU0lEIHJjbHNpZCk7CkhSRVNVTFQgV0lOQVBJIENvU3VzcGVuZENsYXNzT2JqZWN0cyh2b2lkKTsKSFJFU1VMVCBXSU5BUEkgQ29SZXN1bWVDbGFzc09iamVjdHModm9pZCk7ClVMT05HIFdJTkFQSSBDb0FkZFJlZlNlcnZlclByb2Nlc3Modm9pZCk7CkhSRVNVTFQgV0lOQVBJIENvUmVsZWFzZVNlcnZlclByb2Nlc3Modm9pZCk7CgovKiBtYXJzaGFsbGluZyAqLwpIUkVTVUxUIFdJTkFQSSBDb0NyZWF0ZUZyZWVUaHJlYWRlZE1hcnNoYWxlcihMUFVOS05PV04gcHVua091dGVyLCBMUFVOS05PV04qIHBwdW5rTWFyc2hhbCk7CkhSRVNVTFQgV0lOQVBJIENvR2V0SW50ZXJmYWNlQW5kUmVsZWFzZVN0cmVhbShMUFNUUkVBTSBwU3RtLCBSRUZJSUQgaWlkLCBMUFZPSUQqIHBwdik7CkhSRVNVTFQgV0lOQVBJIENvR2V0TWFyc2hhbFNpemVNYXgoVUxPTkcqIHB1bFNpemUsIFJFRklJRCByaWlkLCBMUFVOS05PV04gcFVuaywgRFdPUkQgZHdEZXN0Q29udGV4dCwgTFBWT0lEIHB2RGVzdENvbnRleHQsIERXT1JEIG1zaGxmbGFncyk7CkhSRVNVTFQgV0lOQVBJIENvR2V0U3RhbmRhcmRNYXJzaGFsKFJFRklJRCByaWlkLCBMUFVOS05PV04gcFVuaywgRFdPUkQgZHdEZXN0Q29udGV4dCwgTFBWT0lEIHB2RGVzdENvbnRleHQsIERXT1JEIG1zaGxmbGFncywgTFBNQVJTSEFMKiBwcE1hcnNoYWwpOwpIUkVTVUxUIFdJTkFQSSBDb01hcnNoYWxIcmVzdWx0KExQU1RSRUFNIHBzdG0sIEhSRVNVTFQgaHJlc3VsdCk7CkhSRVNVTFQgV0lOQVBJIENvTWFyc2hhbEludGVyZmFjZShMUFNUUkVBTSBwU3RtLCBSRUZJSUQgcmlpZCwgTFBVTktOT1dOIHBVbmssIERXT1JEIGR3RGVzdENvbnRleHQsIExQVk9JRCBwdkRlc3RDb250ZXh0LCBEV09SRCBtc2hsZmxhZ3MpOwpIUkVTVUxUIFdJTkFQSSBDb01hcnNoYWxJbnRlclRocmVhZEludGVyZmFjZUluU3RyZWFtKFJFRklJRCByaWlkLCBMUFVOS05PV04gcFVuaywgTFBTVFJFQU0qIHBwU3RtKTsKSFJFU1VMVCBXSU5BUEkgQ29SZWxlYXNlTWFyc2hhbERhdGEoTFBTVFJFQU0gcFN0bSk7CkhSRVNVTFQgV0lOQVBJIENvRGlzY29ubmVjdE9iamVjdChMUFVOS05PV04gbHBVbmssIERXT1JEIHJlc2VydmVkKTsKSFJFU1VMVCBXSU5BUEkgQ29Vbm1hcnNoYWxIcmVzdWx0KExQU1RSRUFNIHBzdG0sIEhSRVNVTFQqIHBocmVzdWx0KTsKSFJFU1VMVCBXSU5BUEkgQ29Vbm1hcnNoYWxJbnRlcmZhY2UoTFBTVFJFQU0gcFN0bSwgUkVGSUlEIHJpaWQsIExQVk9JRCogcHB2KTsKSFJFU1VMVCBXSU5BUEkgQ29Mb2NrT2JqZWN0RXh0ZXJuYWwoTFBVTktOT1dOIHBVbmssIEJPT0wgZkxvY2ssIEJPT0wgZkxhc3RVbmxvY2tSZWxlYXNlcyk7CkJPT0wgV0lOQVBJIENvSXNIYW5kbGVyQ29ubmVjdGVkKExQVU5LTk9XTiBwVW5rKTsKCi8qIHNlY3VyaXR5ICovCkhSRVNVTFQgV0lOQVBJIENvSW5pdGlhbGl6ZVNlY3VyaXR5KFBTRUNVUklUWV9ERVNDUklQVE9SIHBTZWNEZXNjLCBMT05HIGNBdXRoU3ZjLCBTT0xFX0FVVEhFTlRJQ0FUSU9OX1NFUlZJQ0UqIGFzQXV0aFN2Yywgdm9pZCogcFJlc2VydmVkMSwgRFdPUkQgZHdBdXRobkxldmVsLCBEV09SRCBkd0ltcExldmVsLCB2b2lkKiBwUmVzZXJ2ZWQyLCBEV09SRCBkd0NhcGFiaWxpdGllcywgdm9pZCogcFJlc2VydmVkMyk7CkhSRVNVTFQgV0lOQVBJIENvR2V0Q2FsbENvbnRleHQoUkVGSUlEIHJpaWQsIHZvaWQqKiBwcEludGVyZmFjZSk7CkhSRVNVTFQgV0lOQVBJIENvUXVlcnlBdXRoZW50aWNhdGlvblNlcnZpY2VzKERXT1JEKiBwY0F1dGhTdmMsIFNPTEVfQVVUSEVOVElDQVRJT05fU0VSVklDRSoqIGFzQXV0aFN2Yyk7CgpIUkVTVUxUIFdJTkFQSSBDb1F1ZXJ5UHJveHlCbGFua2V0KElVbmtub3duKiBwUHJveHksIERXT1JEKiBwd0F1dGhuU3ZjLCBEV09SRCogcEF1dGh6U3ZjLCBPTEVDSEFSKiogcFNlcnZlclByaW5jTmFtZSwgRFdPUkQqIHBBdXRobkxldmVsLCBEV09SRCogcEltcExldmVsLCBSUENfQVVUSF9JREVOVElUWV9IQU5ETEUqIHBBdXRoSW5mbywgRFdPUkQqIHBDYXBhYmlsaXRlcyk7CkhSRVNVTFQgV0lOQVBJIENvU2V0UHJveHlCbGFua2V0KElVbmtub3duKiBwUHJveHksIERXT1JEIGR3QXV0aG5TdmMsIERXT1JEIGR3QXV0aHpTdmMsIE9MRUNIQVIqIHBTZXJ2ZXJQcmluY05hbWUsIERXT1JEIGR3QXV0aG5MZXZlbCwgRFdPUkQgZHdJbXBMZXZlbCwgUlBDX0FVVEhfSURFTlRJVFlfSEFORExFIHBBdXRoSW5mbywgRFdPUkQgZHdDYXBhYmlsaXRpZXMpOwpIUkVTVUxUIFdJTkFQSSBDb0NvcHlQcm94eShJVW5rbm93biogcFByb3h5LCBJVW5rbm93bioqIHBwQ29weSk7CgpIUkVTVUxUIFdJTkFQSSBDb0ltcGVyc29uYXRlQ2xpZW50KHZvaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1F1ZXJ5Q2xpZW50QmxhbmtldChEV09SRCogcEF1dGhuU3ZjLCBEV09SRCogcEF1dGh6U3ZjLCBPTEVDSEFSKiogcFNlcnZlclByaW5jTmFtZSwgRFdPUkQqIHBBdXRobkxldmVsLCBEV09SRCogcEltcExldmVsLCBSUENfQVVUSFpfSEFORExFKiBwUHJpdnMsIERXT1JEKiBwQ2FwYWJpbGl0aWVzKTsKSFJFU1VMVCBXSU5BUEkgQ29SZXZlcnRUb1NlbGYodm9pZCk7CgovKiBtaXNjICovCkhSRVNVTFQgV0lOQVBJIENvR2V0VHJlYXRBc0NsYXNzKFJFRkNMU0lEIGNsc2lkT2xkLCBMUENMU0lEIHBDbHNpZE5ldyk7CkhSRVNVTFQgV0lOQVBJIENvVHJlYXRBc0NsYXNzKFJFRkNMU0lEIGNsc2lkT2xkLCBSRUZDTFNJRCBjbHNpZE5ldyk7CgpIUkVTVUxUIFdJTkFQSSBDb0NyZWF0ZUd1aWQoR1VJRCogcGd1aWQpOwpCT09MIFdJTkFQSSBDb0lzT2xlMUNsYXNzKFJFRkNMU0lEIHJjbHNpZCk7CgpCT09MIFdJTkFQSSBDb0Rvc0RhdGVUaW1lVG9GaWxlVGltZShXT1JEIG5Eb3NEYXRlLCBXT1JEIG5Eb3NUaW1lLCBGSUxFVElNRSogbHBGaWxlVGltZSk7CkJPT0wgV0lOQVBJIENvRmlsZVRpbWVUb0Rvc0RhdGVUaW1lKEZJTEVUSU1FKiBscEZpbGVUaW1lLCBXT1JEKiBscERvc0RhdGUsIFdPUkQqIGxwRG9zVGltZSk7CkhSRVNVTFQgV0lOQVBJIENvRmlsZVRpbWVOb3coRklMRVRJTUUqIGxwRmlsZVRpbWUpOwpIUkVTVUxUIFdJTkFQSSBDb1JlZ2lzdGVyTWVzc2FnZUZpbHRlcihMUE1FU1NBR0VGSUxURVIgbHBNZXNzYWdlRmlsdGVyLExQTUVTU0FHRUZJTFRFUiAqbHBscE1lc3NhZ2VGaWx0ZXIpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdVSUQgQVBJCiAqLwpIUkVTVUxUIFdJTkFQSSBTdHJpbmdGcm9tQ0xTSUQoUkVGQ0xTSUQgaWQsIExQT0xFU1RSKik7CkhSRVNVTFQgV0lOQVBJIENMU0lERnJvbVN0cmluZyhMUE9MRVNUUiwgQ0xTSUQgKik7CkhSRVNVTFQgV0lOQVBJIENMU0lERnJvbVByb2dJRChMUENPTEVTVFIgcHJvZ2lkLCBMUENMU0lEIHJpaWQpOwpIUkVTVUxUIFdJTkFQSSBQcm9nSURGcm9tQ0xTSUQoUkVGQ0xTSUQgY2xzaWQsIExQT0xFU1RSICpscGxwc3pQcm9nSUQpOwoKSU5UIFdJTkFQSSBTdHJpbmdGcm9tR1VJRDIoUkVGR1VJRCBpZCwgTFBPTEVTVFIgc3RyLCBJTlQgY21heCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ09NIFNlcnZlciBkbGwgLSBleHBvcnRzCiAqLwpIUkVTVUxUIFdJTkFQSSBEbGxHZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHYpOwpIUkVTVUxUIFdJTkFQSSBEbGxDYW5VbmxvYWROb3codm9pZCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRGF0YSBPYmplY3QKICovCkhSRVNVTFQgV0lOQVBJIENyZWF0ZURhdGFBZHZpc2VIb2xkZXIoTFBEQVRBQURWSVNFSE9MREVSKiBwcERBSG9sZGVyKTsKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlRGF0YUNhY2hlKExQVU5LTk9XTiBwVW5rT3V0ZXIsIFJFRkNMU0lEIHJjbHNpZCwgUkVGSUlEIGlpZCwgTFBWT0lEKiBwcHYpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCU1vbmlrZXIgQVBJCiAqLwpIUkVTVUxUIFdJTkFQSSBHZXRDbGFzc0ZpbGUoTFBDT0xFU1RSIGZpbGVQYXRoTmFtZSxDTFNJRCAqcGNsc2lkKTsKCkhSRVNVTFQgV0lOQVBJIENyZWF0ZUJpbmRDdHgoRFdPUkQgcmVzZXJ2ZWQsIExQQkMqIHBwYmMpOwoKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlRmlsZU1vbmlrZXIoTFBDT0xFU1RSIGxwc3pQYXRoTmFtZSwgTFBNT05JS0VSKiBwcG1rKTsKCkhSRVNVTFQgV0lOQVBJIENyZWF0ZUl0ZW1Nb25pa2VyKExQQ09MRVNUUiBscHN6RGVsaW0sIExQQ09MRVNUUiAgbHBzekl0ZW0sIExQTU9OSUtFUiogcHBtayk7CgpIUkVTVUxUIFdJTkFQSSBDcmVhdGVBbnRpTW9uaWtlcihMUE1PTklLRVIgKiBwcG1rKTsKCkhSRVNVTFQgV0lOQVBJIENyZWF0ZUdlbmVyaWNDb21wb3NpdGUoTFBNT05JS0VSIHBta0ZpcnN0LCBMUE1PTklLRVIgcG1rUmVzdCwgTFBNT05JS0VSKiBwcG1rQ29tcG9zaXRlKTsKCkhSRVNVTFQgV0lOQVBJIEJpbmRNb25pa2VyKExQTU9OSUtFUiBwbWssIERXT1JEIGdyZk9wdCwgUkVGSUlEIGlpZFJlc3VsdCwgTFBWT0lEKiBwcHZSZXN1bHQpOwoKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlQ2xhc3NNb25pa2VyKFJFRkNMU0lEIHJjbHNpZCwgTFBNT05JS0VSKiBwcG1rKTsKCkhSRVNVTFQgV0lOQVBJIENyZWF0ZVBvaW50ZXJNb25pa2VyKExQVU5LTk9XTiBwdW5rLCBMUE1PTklLRVIqIHBwbWspOwoKSFJFU1VMVCBXSU5BUEkgTW9uaWtlckNvbW1vblByZWZpeFdpdGgoSU1vbmlrZXIqIHBta1RoaXMsSU1vbmlrZXIqIHBta090aGVyLElNb25pa2VyKiogcHBta0NvbW1vbik7CgpIUkVTVUxUIFdJTkFQSSBHZXRSdW5uaW5nT2JqZWN0VGFibGUoRFdPUkQgcmVzZXJ2ZWQsIExQUlVOTklOR09CSkVDVFRBQkxFICpwcHJvdCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU3RvcmFnZSBBUEkKICovCiNkZWZpbmUgU1RHTV9ESVJFQ1QJCTB4MDAwMDAwMDAKI2RlZmluZSBTVEdNX1RSQU5TQUNURUQJCTB4MDAwMTAwMDAKI2RlZmluZSBTVEdNX1NJTVBMRQkJMHgwODAwMDAwMAojZGVmaW5lIFNUR01fUkVBRAkJMHgwMDAwMDAwMAojZGVmaW5lIFNUR01fV1JJVEUJCTB4MDAwMDAwMDEKI2RlZmluZSBTVEdNX1JFQURXUklURQkJMHgwMDAwMDAwMgojZGVmaW5lIFNUR01fU0hBUkVfREVOWV9OT05FCTB4MDAwMDAwNDAKI2RlZmluZSBTVEdNX1NIQVJFX0RFTllfUkVBRAkweDAwMDAwMDMwCiNkZWZpbmUgU1RHTV9TSEFSRV9ERU5ZX1dSSVRFCTB4MDAwMDAwMjAKI2RlZmluZSBTVEdNX1NIQVJFX0VYQ0xVU0lWRQkweDAwMDAwMDEwCiNkZWZpbmUgU1RHTV9QUklPUklUWQkJMHgwMDA0MDAwMAojZGVmaW5lIFNUR01fREVMRVRFT05SRUxFQVNFCTB4MDQwMDAwMDAKI2RlZmluZSBTVEdNX0NSRUFURQkJMHgwMDAwMTAwMAojZGVmaW5lIFNUR01fQ09OVkVSVAkJMHgwMDAyMDAwMAojZGVmaW5lIFNUR01fRkFJTElGVEhFUkUJMHgwMDAwMDAwMAojZGVmaW5lIFNUR01fTk9TQ1JBVENICQkweDAwMTAwMDAwCiNkZWZpbmUgU1RHTV9OT1NOQVBTSE9UCQkweDAwMjAwMDAwCgp0eXBlZGVmIHN0cnVjdCB0YWdTVEdPUFRJT05TCnsKICAgIFVTSE9SVCB1c1ZlcnNpb247CiAgICBVU0hPUlQgcmVzZXJ2ZWQ7CiAgICBVTE9ORyB1bFNlY3RvclNpemU7CiAgICBjb25zdCBXQ0hBUiogcHdjc1RlbXBsYXRlRmlsZTsKfSBTVEdPUFRJT05TOwoKSFJFU1VMVCBXSU5BUEkgU3RnQ3JlYXRlRG9jZmlsZShMUENPTEVTVFIgcHdjc05hbWUsRFdPUkQgZ3JmTW9kZSxEV09SRCByZXNlcnZlZCxJU3RvcmFnZSAqKnBwc3RnT3Blbik7CkhSRVNVTFQgV0lOQVBJIFN0Z0NyZWF0ZVN0b3JhZ2VFeChjb25zdCBXQ0hBUiosRFdPUkQsRFdPUkQsRFdPUkQsU1RHT1BUSU9OUyosdm9pZCosUkVGSUlELHZvaWQqKik7CkhSRVNVTFQgV0lOQVBJIFN0Z0lzU3RvcmFnZUZpbGUoTFBDT0xFU1RSIGZuKTsKSFJFU1VMVCBXSU5BUEkgU3RnSXNTdG9yYWdlSUxvY2tCeXRlcyhJTG9ja0J5dGVzICpwbGtieXQpOwpIUkVTVUxUIFdJTkFQSSBTdGdPcGVuU3RvcmFnZShjb25zdCBPTEVDSEFSKiBwd2NzTmFtZSxJU3RvcmFnZSogcHN0Z1ByaW9yaXR5LERXT1JEIGdyZk1vZGUsU05CIHNuYkV4Y2x1ZGUsRFdPUkQgcmVzZXJ2ZWQsSVN0b3JhZ2UqKnBwc3RnT3Blbik7CgpIUkVTVUxUIFdJTkFQSSBXcml0ZUNsYXNzU3RnKElTdG9yYWdlKiBwU3RnLCBSRUZDTFNJRCByY2xzaWQpOwpIUkVTVUxUIFdJTkFQSSBSZWFkQ2xhc3NTdGcoSVN0b3JhZ2UgKnBzdGcsQ0xTSUQgKnBjbHNpZCk7CgpIUkVTVUxUIFdJTkFQSSBTdGdDcmVhdGVEb2NmaWxlT25JTG9ja0J5dGVzKElMb2NrQnl0ZXMgKnBsa2J5dCxEV09SRCBncmZNb2RlLCBEV09SRCByZXNlcnZlZCwgSVN0b3JhZ2UqKiBwcHN0Z09wZW4pOwpIUkVTVUxUIFdJTkFQSSBTdGdPcGVuU3RvcmFnZU9uSUxvY2tCeXRlcyhJTG9ja0J5dGVzICpwbGtieXQsIElTdG9yYWdlICpwc3RnUHJpb3JpdHksIERXT1JEIGdyZk1vZGUsIFNOQiBzbmJFeGNsdWRlLCBEV09SRCByZXNlcnZlZCwgSVN0b3JhZ2UgKipwcHN0Z09wZW4pOwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgovKiBGSVhNRTogI2luY2x1ZGUgPHVybG1vbi5oPiAqLwojaW5jbHVkZSA8cHJvcGlkbC5oPgoKI2lmbmRlZiBfX1dJTkVTUkNfXwoKI2RlZmluZSBGQVJTVFJVQ1QKI2RlZmluZSBIVUdFUAoKI2RlZmluZSBXSU5PTEVBUEkgICAgICAgIFNUREFQSQojZGVmaW5lIFdJTk9MRUFQSV8odHlwZSkgU1REQVBJXyh0eXBlKQoKI2VuZGlmIC8qIF9fV0lORVNSQ19fICovCgojZW5kaWYgLyogX09CSkJBU0VfSF8gKi8K