LyoKICogQ29weXJpZ2h0IDIwMDIgTWljaGFlbCBH/G5uZXdpZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaWZuZGVmIF9fQVZJRklMRV9QUklWQVRFX0gKI2RlZmluZSBfX0FWSUZJTEVfUFJJVkFURV9ICgojaWZuZGVmIE1BWF9BVklTVFJFQU1TCiNkZWZpbmUgTUFYX0FWSVNUUkVBTVMgOAojZW5kaWYKCiNpZm5kZWYgRElCV0lEVEhCWVRFUwojZGVmaW5lIFdJRFRIQllURVMoaSkgICAgICgoKGkrMzEpJih+MzEpKS84KQojZGVmaW5lIERJQldJRFRIQllURVMoYmkpIFdJRFRIQllURVMoKGJpKS5iaVdpZHRoICogKGJpKS5iaUJpdENvdW50KQojZW5kaWYKCiNpZm5kZWYgRElCUFRSCiNkZWZpbmUgRElCUFRSKGxwKSAgICAgICgoTFBCWVRFKShscCkgKyAobHApLT5iaVNpemUgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAobHApLT5iaUNsclVzZWQgKiBzaXplb2YoUkdCUVVBRCkpCiNlbmRpZgoKI2RlZmluZSBJRERfU0FWRU9QVElPTlMgICAgICAweDAxMDAKI2RlZmluZSBJRENfSU5URVJMRUFWRSAgICAgICAweDAxMTAKI2RlZmluZSBJRENfSU5URVJMRUFWRUVWRVJZICAweDAxMTEKI2RlZmluZSBJRENfU1RSRUFNICAgICAgICAgICAweDAxMTIKI2RlZmluZSBJRENfT1BUSU9OUyAgICAgICAgICAweDAxMTMKI2RlZmluZSBJRENfRk9STUFUVEVYVCAgICAgICAweDAxMTQKCiNkZWZpbmUgSURTX1dBVkVTVFJFQU1GT1JNQVQgMHgwMTAwCiNkZWZpbmUgSURTX1dBVkVGSUxFVFlQRSAgICAgMHgwMTAxCiNkZWZpbmUgSURTX0FMTE1VTFRJTUVESUEgICAgMHgwMTg0CiNkZWZpbmUgSURTX0FMTEZJTEVTICAgICAgICAgMHgwMTg1CiNkZWZpbmUgSURTX1ZJREVPICAgICAgICAgICAgMHgwMTg5CiNkZWZpbmUgSURTX0FVRElPICAgICAgICAgICAgMHgwMTkwCiNkZWZpbmUgSURTX0FWSVNUUkVBTUZPUk1BVCAgMHgwMTkxCiNkZWZpbmUgSURTX0FWSUZJTEVUWVBFICAgICAgMHgwMTkyCiNkZWZpbmUgSURTX1VOQ09NUFJFU1NFRCAgICAgMHgwMTkzCgpERUZJTkVfQVZJR1VJRChDTFNJRF9JQ01TdHJlYW0sIDB4MDAwMjAwMDEsIDAsIDApOwpERUZJTkVfQVZJR1VJRChDTFNJRF9XQVZGaWxlLCAgIDB4MDAwMjAwMDMsIDAsIDApOwpERUZJTkVfQVZJR1VJRChDTFNJRF9BQ01TdHJlYW0sIDB4MDAwMjAwMEYsIDAsIDApOwpERUZJTkVfQVZJR1VJRChJSURfSUVkaXRTdHJlYW1JbnRlcm5hbCwgMHgwMDAyMDAwQSwwLDApOwoKZXh0ZXJuIEhNT0RVTEUgQVZJRklMRV9oTW9kdWxlOwoKZXh0ZXJuIEhSRVNVTFQgQVZJRklMRV9DcmVhdGVBVklGaWxlKFJFRklJRCByaWlkLCBMUFZPSUQgKnBwb2JqKTsKZXh0ZXJuIEhSRVNVTFQgQVZJRklMRV9DcmVhdGVXQVZGaWxlKFJFRklJRCByaWlkLCBMUFZPSUQgKnBwb2JqKTsKZXh0ZXJuIEhSRVNVTFQgQVZJRklMRV9DcmVhdGVBQ01TdHJlYW0oUkVGSUlEIHJpaWQsIExQVk9JRCAqcHBvYmopOwpleHRlcm4gSFJFU1VMVCBBVklGSUxFX0NyZWF0ZUlDTVN0cmVhbShSRUZJSUQgcmlpZCwgTFBWT0lEICpwcG9iaik7CmV4dGVybiBQQVZJRURJVFNUUkVBTSBBVklGSUxFX0NyZWF0ZUVkaXRTdHJlYW0oUEFWSVNUUkVBTSBwc3RyZWFtKTsKZXh0ZXJuIFBHRVRGUkFNRSBBVklGSUxFX0NyZWF0ZUdldEZyYW1lKFBBVklTVFJFQU0gcHN0cmVhbSk7CmV4dGVybiBQQVZJRklMRSAgQVZJRklMRV9DcmVhdGVBVklUZW1wRmlsZShpbnQgblN0cmVhbXMsIGNvbnN0IFBBVklTVFJFQU0gKnBwU3RyZWFtcyk7CgpleHRlcm4gTFBDV1NUUiAgQVZJRklMRV9CYXNlbmFtZVcoTFBDV1NUUiBzekZpbGVOYW1lKTsKCiNlbmRpZgo=