LyogQm9vc3QgaW50ZXJ2YWwvcm91bmRpbmcuaHBwIHRlbXBsYXRlIGltcGxlbWVudGF0aW9uIGZpbGUKICoKICogQ29weXJpZ2h0IDIwMDItMjAwMyBIZXJ26SBCcvZubmltYW5uLCBHdWlsbGF1bWUgTWVscXVpb25kLCBTeWx2YWluIFBpb24KICoKICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgogKiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvcgogKiBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKICovCgojaWZuZGVmIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfUk9VTkRJTkdfSFBQCiNkZWZpbmUgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ST1VORElOR19IUFAKCm5hbWVzcGFjZSBib29zdCB7Cm5hbWVzcGFjZSBudW1lcmljIHsKbmFtZXNwYWNlIGludGVydmFsX2xpYiB7CgovKgogKiBEZWZhdWx0IHJvdW5kaW5nX2NvbnRyb2wgY2xhc3MgKGRvZXMgbm90aGluZykKICovCgp0ZW1wbGF0ZTxjbGFzcyBUPgpzdHJ1Y3Qgcm91bmRpbmdfY29udHJvbAp7CiAgdHlwZWRlZiBpbnQgcm91bmRpbmdfbW9kZTsKICBzdGF0aWMgdm9pZCBnZXRfcm91bmRpbmdfbW9kZShyb3VuZGluZ19tb2RlJikge30KICBzdGF0aWMgdm9pZCBzZXRfcm91bmRpbmdfbW9kZShyb3VuZGluZ19tb2RlKSAge30KICBzdGF0aWMgdm9pZCB1cHdhcmQoKSAgICAge30KICBzdGF0aWMgdm9pZCBkb3dud2FyZCgpICAge30KICBzdGF0aWMgdm9pZCB0b19uZWFyZXN0KCkge30KICBzdGF0aWMgY29uc3QgVCYgdG9faW50KGNvbnN0IFQmIHgpICAgICAgICAgeyByZXR1cm4geDsgfQogIHN0YXRpYyBjb25zdCBUJiBmb3JjZV9yb3VuZGluZyhjb25zdCBUJiB4KSB7IHJldHVybiB4OyB9Cn07CgovKgogKiBBIGZldyByb3VuZGluZyBjb250cm9sIGNsYXNzZXMgKGV4YWN0L3N0ZC9vcHA6IHNlZSBkb2N1bWVudGF0aW9uKQogKiAgIHJvdW5kZWRfYXJpdGhfKiBjb250cm9sIHRoZSByb3VuZGluZyBvZiB0aGUgYXJpdGhtZXRpYyBvcGVyYXRvcnMKICogICByb3VuZGVkX3RyYW5zY18qIGNvbnRyb2wgdGhlIHJvdW5kaW5nIG9mIHRoZSB0cmFuc2NlbmRlbnRhbCBmdW5jdGlvbnMKICovCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBSb3VuZGluZyA9IHJvdW5kaW5nX2NvbnRyb2w8VD4gPgpzdHJ1Y3Qgcm91bmRlZF9hcml0aF9leGFjdDsKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFJvdW5kaW5nID0gcm91bmRpbmdfY29udHJvbDxUPiA+CnN0cnVjdCByb3VuZGVkX2FyaXRoX3N0ZDsKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFJvdW5kaW5nID0gcm91bmRpbmdfY29udHJvbDxUPiA+CnN0cnVjdCByb3VuZGVkX2FyaXRoX29wcDsKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFJvdW5kaW5nPgpzdHJ1Y3Qgcm91bmRlZF90cmFuc2NfZHVtbXk7Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBSb3VuZGluZyA9IHJvdW5kZWRfYXJpdGhfZXhhY3Q8VD4gPiAKc3RydWN0IHJvdW5kZWRfdHJhbnNjX2V4YWN0OwoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUm91bmRpbmcgPSByb3VuZGVkX2FyaXRoX3N0ZDxUPiA+IApzdHJ1Y3Qgcm91bmRlZF90cmFuc2Nfc3RkOwoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUm91bmRpbmcgPSByb3VuZGVkX2FyaXRoX29wcDxUPiA+IApzdHJ1Y3Qgcm91bmRlZF90cmFuc2Nfb3BwOwoKLyoKICogU3RhdGUtc2F2aW5nIGNsYXNzZXM6IGFsbG93IHRvIHNldCBhbmQgcmVzZXQgcm91bmRpbmcgY29udHJvbAogKi8KCm5hbWVzcGFjZSBkZXRhaWwgewoKdGVtcGxhdGU8Y2xhc3MgUm91bmRpbmc+CnN0cnVjdCBzYXZlX3N0YXRlX3VucHJvdGVjdGVkOiBSb3VuZGluZwp7CiAgdHlwZWRlZiBzYXZlX3N0YXRlX3VucHJvdGVjdGVkPFJvdW5kaW5nPiB1bnByb3RlY3RlZF9yb3VuZGluZzsKfTsKCn0gLy8gbmFtZXNwYWNlIGRldGFpbAoKdGVtcGxhdGU8Y2xhc3MgUm91bmRpbmc+CnN0cnVjdCBzYXZlX3N0YXRlOiBSb3VuZGluZwp7CiAgdHlwZW5hbWUgUm91bmRpbmc6OnJvdW5kaW5nX21vZGUgbW9kZTsKICBzYXZlX3N0YXRlKCkgewogICAgdGhpcy0+Z2V0X3JvdW5kaW5nX21vZGUobW9kZSk7CiAgICB0aGlzLT5pbml0KCk7CiAgfQogIH5zYXZlX3N0YXRlKCkgeyB0aGlzLT5zZXRfcm91bmRpbmdfbW9kZShtb2RlKTsgfQogIHR5cGVkZWYgZGV0YWlsOjpzYXZlX3N0YXRlX3VucHJvdGVjdGVkPFJvdW5kaW5nPiB1bnByb3RlY3RlZF9yb3VuZGluZzsKfTsKICAKdGVtcGxhdGU8Y2xhc3MgUm91bmRpbmc+CnN0cnVjdCBzYXZlX3N0YXRlX25vdGhpbmc6IFJvdW5kaW5nCnsKICB0eXBlZGVmIHNhdmVfc3RhdGVfbm90aGluZzxSb3VuZGluZz4gdW5wcm90ZWN0ZWRfcm91bmRpbmc7Cn07CiAgCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCByb3VuZGVkX21hdGg6IHNhdmVfc3RhdGVfbm90aGluZzxyb3VuZGVkX2FyaXRoX2V4YWN0PFQ+ID4Ke307Cgp9IC8vIG5hbWVzcGFjZSBpbnRlcnZhbF9saWIKfSAvLyBuYW1lc3BhY2UgbnVtZXJpYwp9IC8vIG5hbWVzcGFjZSBib29zdAoKI2VuZGlmIC8vIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfUk9VTkRJTkdfSFBQCg==