LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgogKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQogKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKICogY29waWVzLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCiAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpZiAhZGVmaW5lZCggX19XTEFOX1FDVF9QQUxfTVNHX0ggKQojZGVmaW5lIF9fV0xBTl9RQ1RfUEFMX01TR19ICgovKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgCiAgXGZpbGUgIHdsYW5fcWN0X3BhbF9tc2cuaAogIAogIFxicmllZiBkZWZpbmUgZ2VuZXJhbCBtZXNzYWdlIEFQSXMgUEFMIGV4cG9ydHMgdG8gc3VwcG9ydCBsZWdhY3kgVU1BQy4gCiAgIHdwdCA9IChXbGFuIFBhbCBUeXBlKSB3cGFsID0gKFdsYW4gUEFMKQogICAgICAgICAgICAgICAKICAgRGVmaW5pdGlvbnMgZm9yIHBsYXRmb3JtIGRlcGVuZGVudC4gT25seSB3b3JrIHdpdGggbGVnYWN5IFVNQUMuCiAgCiAgIENvcHlyaWdodCAyMDEwIChjKSBRdWFsY29tbSwgSW5jb3Jwb3JhdGVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgCiAgIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCiAgCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfdHlwZS5oIgojaW5jbHVkZSAid2xhbl9xY3RfcGFsX3N0YXR1cy5oIgoKdHlwZWRlZiBzdHJ1Y3Qgc3dwdF9tc2cgd3B0X21zZzsKCnR5cGVkZWYgdm9pZCAoKndwYWxfbXNnX2NhbGxiYWNrKSh3cHRfbXNnICpwTXNnKTsKCnN0cnVjdCBzd3B0X21zZwp7CiAgIHdwdF91aW50MTYgdHlwZTsKICAgd3B0X3VpbnQxNiByZXNlcnZlZDsKICAgdm9pZCAqcHRyOwogICB3cHRfdWludDMyIHZhbDsKICAgd3BhbF9tc2dfY2FsbGJhY2sgY2FsbGJhY2s7CiAgIHZvaWQgKnBDb250ZXh0Owp9OyAKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICB3cGFsUG9zdEN0cmxNc2cgliBQb3N0IGEgbWVzc2FnZSB0byBjb250cm9sIGNvbnRleHQgc28gaXQgY2FuIAogICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBwcm9jZXNzZWQgaW4gdGhhdCBjb250ZXh0LgogICBQYXJhbTogCiAgICAgIHBQYWxDb250ZXh0IJYgQSBQQUwgY29udGV4dAogICAgICBwTXNnIJYgYSBwb2ludGVyIHRvIGNhbGxlZCBhbGxvY2F0ZWQgb2JqZWN0OyBDYWxsZXIgcmV0YWluIHRoZSBvd25lcnNoaXAgCiAgICAgICAgICAgICBhZnRlciB0aGlzIEFQSSByZXR1cm5zLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxQb3N0Q3RybE1zZyh2b2lkICpwUGFsQ29udGV4dCwgd3B0X21zZyAqcE1zZyk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgd3BhbFBvc3RUeE1zZyCWIFBvc3QgYSBtZXNzYWdlIHRvIFRYIGNvbnRleHQgc28gaXQgY2FuIGJlIHByb2Nlc3NlZCBpbiB0aGF0IGNvbnRleHQuCiAgIFBhcmFtOiAKICAgICAgcFBhbENvbnRleHQgliBBIFBBTCBjb250ZXh0CiAgICAgIHBNc2cgliBhIHBvaW50ZXIgdG8gY2FsbGVkIGFsbG9jYXRlZCBvYmplY3Q7IENhbGxlciByZXRhaW4gdGhlIG93bmVyc2hpcCAKICAgICAgICAgICAgIGFmdGVyIHRoaXMgQVBJIHJldHVybnMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbFBvc3RUeE1zZyh2b2lkICpwUGFsQ29udGV4dCwgd3B0X21zZyAqcE1zZyk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICB3cGFsUG9zdFJ4TXNnIJYgUG9zdCBhIG1lc3NhZ2UgdG8gUlggY29udGV4dCBzbyBpdCBjYW4gYmUgcHJvY2Vzc2VkIGluIHRoYXQgY29udGV4dC4KICAgUGFyYW06IAogICAgICBwUGFsQ29udGV4dCCWIEEgUEFMIGNvbnRleHQKICAgICAgcE1zZyCWIGEgcG9pbnRlciB0byBjYWxsZWQgYWxsb2NhdGVkIG9iamVjdDsgQ2FsbGVyIHJldGFpbiB0aGUgb3duZXJzaGlwIAogICAgICAgICAgICAgYWZ0ZXIgdGhpcyBBUEkgcmV0dXJucy4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsUG9zdFJ4TXNnKHZvaWQgKnBQYWxDb250ZXh0LCB3cHRfbXNnICpwTXNnKTsKCgoKI2VuZGlmIC8vIF9fV0xBTl9RQ1RfUEFMX0FQSV9ICg==