LyoKCUwyQ1IgZnVuY3Rpb25zCglDb3B5cmlnaHQgqSAxOTk3LTE5OTggYnkgUG93ZXJMb2dpeCBSICYgRCwgSW5jLgoKCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoqLwovKgoJVGh1ciwgRGVjLiAxMiwgMTk5OC4KCS0gRmlyc3QgcHVibGljIHJlbGVhc2UsIGNvbnRyaWJ1dGVkIGJ5IFBvd2VyTG9naXguCgkqKioqKioqKioqKgoJU2F0LCBBdWcuIDcsIDE5OTkuCgktIFRlcnJ5OiBNYWRlIHN1cmUgY29kZSBkaXNhYmxlZCBpbnRlcnJ1cHRzIGJlZm9yZSBydW5uaW5nLiAoUHJldmlvdXNseQoJCQlpdCB3YXMgYXNzdW1lZCBpbnRlcnJ1cHRzIHdlcmUgYWxyZWFkeSBkaXNhYmxlZCkuCgktIFRlcnJ5OiBVcGRhdGVkIGZvciB0ZW50YXRpdmUgRzQgc3VwcG9ydC4gIDRNQiBvZiBtZW1vcnkgaXMgbm93IGZsdXNoZWQKCQkJaW5zdGVhZCBvZiAyTUIuICAoUHJvYi4gb25seSAzIGlzIG5lY2Vzc2FyeSkuCgktIFRlcnJ5OiBVcGRhdGVkIGZvciB3b3JrYXJvdW5kIHRvIEhJRDBbRFBNXSBwcm9jZXNzb3IgYnVnCgkJCWR1cmluZyBnbG9iYWwgaW52YWxpZGF0ZXMuCgkqKioqKioqKioqKgoJVGh1LCBKdWx5IDEzLCAyMDAwLgoJLSBUZXJyeTogQWRkZWQgaXN5bmMgdG8gY29ycmVjdCBmb3IgYW4gZXJyYXRhLgoKCTIyIEF1Z3VzdCAyMDAxLgoJLSBEYW5NOiBGaW5hbGx5IGFkZGVkIHRoZSA3NDUwIHBhdGNoIEkndmUgaGFkIGZvciB0aGUgcGFzdAoJCXNldmVyYWwgbW9udGhzLiAgVGhlIEwyQ1IgaXMgc2ltaWxhciwgYnV0IEknbSBnb2luZwoJCXRvIGFzc3VtZSB0aGUgdXNlciBvZiB0aGlzIGZ1bmN0aW9ucyBrbm93cyB3aGF0IHRoZXkKCQlhcmUgZG9pbmcuCgoJQXV0aG9yOglUZXJyeSBHcmVlbmlhdXMgKHRncmVlQHBoeXMudWFsYmVydGEuY2EpCglQbGVhc2UgZS1tYWlsIHVwZGF0ZXMgdG8gdGhpcyBmaWxlIHRvIG1lLCB0aGFua3MhCiovCiNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiNpbmNsdWRlIDxhc20vY2FjaGUuaD4KI2luY2x1ZGUgPGFzbS9wYWdlLmg+CgovKiBVc2FnZToKCglXaGVuIHNldHRpbmcgdGhlIEwyQ1IgcmVnaXN0ZXIsIHlvdSBtdXN0IGRvIGEgZmV3IHNwZWNpYWwKCXRoaW5ncy4gIElmIHlvdSBhcmUgZW5hYmxpbmcgdGhlIGNhY2hlLCB5b3UgbXVzdCBwZXJmb3JtIGEKCWdsb2JhbCBpbnZhbGlkYXRlLiAgSWYgeW91IGFyZSBkaXNhYmxpbmcgdGhlIGNhY2hlLCB5b3UgbXVzdAoJZmx1c2ggdGhlIGNhY2hlIGNvbnRlbnRzIGZpcnN0LiAgVGhpcyByb3V0aW5lIHRha2VzIGNhcmUgb2YKCWRvaW5nIHRoZXNlIHRoaW5ncy4gIFdoZW4gZmlyc3QgZW5hYmxpbmcgdGhlIGNhY2hlLCBtYWtlIHN1cmUKCXlvdSBwYXNzIGluIHRoZSBMMkNSIHlvdSB3YW50LCBhcyB3ZWxsIGFzIHBhc3NpbmcgaW4gdGhlCglnbG9iYWwgaW52YWxpZGF0ZSBiaXQgc2V0LiAgQSBnbG9iYWwgaW52YWxpZGF0ZSB3aWxsIG9ubHkgYmUKCXBlcmZvcm1lZCBpZiB0aGUgTDJJIGJpdCBpcyBzZXQgaW4gYXBwbHlUaGlzLiAgV2hlbiBlbmFibGluZwoJdGhlIGNhY2hlLCB5b3Ugc2hvdWxkIGFsc28gc2V0IHRoZSBMMkUgYml0IGluIGFwcGx5VGhpcy4gIElmCgl5b3Ugd2FudCB0byBtb2RpZnkgdGhlIEwyQ1IgY29udGVudHMgYWZ0ZXIgdGhlIGNhY2hlIGhhcyBiZWVuCgllbmFibGVkLCB0aGUgcmVjb21tZW5kZWQgcHJvY2VkdXJlIGlzIHRvIGZpcnN0IGNhbGwKCV9fc2V0TDJDUigwKSB0byBkaXNhYmxlIHRoZSBjYWNoZSBhbmQgdGhlbiBjYWxsIGl0IGFnYWluIHdpdGgKCXRoZSBuZXcgdmFsdWVzIGZvciBMMkNSLiAgRXhhbXBsZXM6CgoJX3NldEwyQ1IoMCkJCS0gZGlzYWJsZXMgdGhlIGNhY2hlCglfc2V0TDJDUigweEIzQTA0MDAwKQktIGVuYWJsZXMgbXkgRzMgdXBncmFkZSBjYXJkOgoJCQkJLSBMMkUgc2V0IHRvIHR1cm4gb24gdGhlIGNhY2hlCgkJCQktIEwyU0laIHNldCB0byAxTUIKCQkJCS0gTDJDTEsgc2V0IHRvIDE6MQoJCQkJLSBMMlJBTSBzZXQgdG8gcGlwZWxpbmVkIHN5bmNocm9ub3VzIGxhdGUtd3JpdGUKCQkJCS0gTDJJIHNldCB0byBwZXJmb3JtIGEgZ2xvYmFsIGludmFsaWRhdGlvbgoJCQkJLSBMMk9IIHNldCB0byAwLjUgblMKCQkJCS0gTDJERiBzZXQgYmVjYXVzZSB0aGlzIHVwZ3JhZGUgY2FyZAoJCQkJICByZXF1aXJlcyBpdAoKCUEgc2ltaWxhciBjYWxsIHNob3VsZCB3b3JrIGZvciB5b3VyIGNhcmQuICBZb3UgbmVlZCB0byBrbm93Cgl0aGUgY29ycmVjdCBzZXR0aW5nIGZvciB5b3VyIGNhcmQgYW5kIHRoZW4gcGxhY2UgdGhlbSBpbiB0aGUKCWZpZWxkcyBJIGhhdmUgb3V0bGluZWQgYWJvdmUuICBPdGhlciBmaWVsZHMgc3VwcG9ydCBvcHRpb25hbAoJZmVhdHVyZXMsIHN1Y2ggYXMgTDJETyB3aGljaCBjYWNoZXMgb25seSBkYXRhLCBvciBMMlRTIHdoaWNoCgljYXVzZXMgY2FjaGUgcHVzaGVzIGZyb20gdGhlIEwxIGNhY2hlIHRvIGdvIHRvIHRoZSBMMiBjYWNoZQoJaW5zdGVhZCBvZiB0byBtYWluIG1lbW9yeS4KCklNUE9SVEFOVDoKCVN0YXJ0aW5nIHdpdGggdGhlIDc0NTAsIHRoZSBiaXRzIGluIHRoaXMgcmVnaXN0ZXIgaGF2ZSBtb3ZlZAoJb3IgYmVoYXZlIGRpZmZlcmVudGx5LiAgVGhlIEVuYWJsZSwgUGFyaXR5IEVuYWJsZSwgU2l6ZSwKCWFuZCBMMiBJbnZhbGlkYXRlIGFyZSB0aGUgb25seSBiaXRzIHRoYXQgaGF2ZSBub3QgbW92ZWQuCglUaGUgc2l6ZSBpcyByZWFkLW9ubHkgZm9yIHRoZXNlIHByb2Nlc3NvcnMgd2l0aCBpbnRlcm5hbCBMMgoJY2FjaGUsIGFuZCB0aGUgaW52YWxpZGF0ZSBpcyBhIGNvbnRyb2wgYXMgd2VsbCBhcyBzdGF0dXMuCgkJLS0gRGFuCgoqLwovKgogKiBTdW1tYXJ5OiB0aGlzIHByb2NlZHVyZSBpZ25vcmVzIHRoZSBMMkkgYml0IGluIHRoZSB2YWx1ZSBwYXNzZWQgaW4sCiAqIGZsdXNoZXMgdGhlIGNhY2hlIGlmIGl0IHdhcyBhbHJlYWR5IGVuYWJsZWQsIGFsd2F5cyBpbnZhbGlkYXRlcyB0aGUKICogY2FjaGUsIHRoZW4gZW5hYmxlcyB0aGUgY2FjaGUgaWYgdGhlIEwyRSBiaXQgaXMgc2V0IGluIHRoZSB2YWx1ZQogKiBwYXNzZWQgaW4uCiAqICAgLS0gcGF1bHVzLgogKi8KX0dMT0JBTChfc2V0X0wyQ1IpCgkvKiBNYWtlIHN1cmUgdGhpcyBpcyBhIDc1MCBvciA3NDAwIGNoaXAgKi8KQkVHSU5fRlRSX1NFQ1RJT04KCWxpCXIzLC0xCglibHIKRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfTDJDUikKCgltZmxyCXI5CgoJLyogU3RvcCBEU1Qgc3RyZWFtcyAqLwpCRUdJTl9GVFJfU0VDVElPTgoJRFNTQUxMCglzeW5jCkVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FMVElWRUMpCgoJLyogVHVybiBvZmYgaW50ZXJydXB0cyBhbmQgZGF0YSByZWxvY2F0aW9uLiAqLwoJbWZtc3IJcjcJCS8qIFNhdmUgTVNSIGluIHI3ICovCglybHdpbm0JcjQscjcsMCwxNywxNQoJcmx3aW5tCXI0LHI0LDAsMjgsMjYJLyogVHVybiBvZmYgRFIgYml0ICovCglzeW5jCgltdG1zcglyNAoJaXN5bmMKCgkvKiBCZWZvcmUgd2UgcGVyZm9ybSB0aGUgZ2xvYmFsIGludmFsaWRhdGlvbiwgd2UgbXVzdCBkaXNhYmxlIGR5bmFtaWMKCSAqIHBvd2VyIG1hbmFnZW1lbnQgdmlhIEhJRDBbRFBNXSB0byB3b3JrIGFyb3VuZCBhIHByb2Nlc3NvciBidWcgd2hlcmUKCSAqIERQTSBjYW4gcG9zc2libHkgaW50ZXJmZXJlIHdpdGggdGhlIHN0YXRlIG1hY2hpbmUgaW4gdGhlIHByb2Nlc3NvcgoJICogdGhhdCBpbnZhbGlkYXRlcyB0aGUgTDIgY2FjaGUgdGFncy4KCSAqLwoJbWZzcHIJcjgsU1BSTl9ISUQwCQkvKiBTYXZlIEhJRDAgaW4gcjggKi8KCXJsd2lubQlyNCxyOCwwLDEyLDEwCQkvKiBUdXJuIG9mZiBISUQwW0RQTV0gKi8KCXN5bmMKCW10c3ByCVNQUk5fSElEMCxyNAkJLyogRGlzYWJsZSBEUE0gKi8KCXN5bmMKCgkvKiBHZXQgdGhlIGN1cnJlbnQgZW5hYmxlIGJpdCBvZiB0aGUgTDJDUiBpbnRvIHI0ICovCgltZnNwcglyNCxTUFJOX0wyQ1IKCgkvKiBUd2VhayBzb21lIGJpdHMgKi8KCXJsd2lubQlyNSxyMywwLDAsMAkJLyogcjUgY29udGFpbnMgdGhlIG5ldyBlbmFibGUgYml0ICovCglybHdpbm0JcjMscjMsMCwxMSw5CQkvKiBUdXJuIG9mZiB0aGUgaW52YWxpZGF0ZSBiaXQgKi8KCXJsd2lubQlyMyxyMywwLDEsMzEJCS8qIFR1cm4gb2ZmIHRoZSBlbmFibGUgYml0ICovCgoJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZmx1c2ggKi8KCXJsd2lubS4JcjQscjQsMCwwLDAKCWJlcQkyZgoKCS8qIEZsdXNoIHRoZSBjYWNoZS4gRmlyc3QsIHJlYWQgdGhlIGZpcnN0IDRNQiBvZiBtZW1vcnkgKHBoeXNpY2FsKSB0bwoJICogcHV0IG5ldyBkYXRhIGluIHRoZSBjYWNoZS4gIChBY3R1YWxseSB3ZSBvbmx5IG5lZWQKCSAqIHRoZSBzaXplIG9mIHRoZSBMMiBjYWNoZSBwbHVzIHRoZSBzaXplIG9mIHRoZSBMMSBjYWNoZSwgYnV0IDRNQiB3aWxsCgkgKiBjb3ZlciBldmVyeXRoaW5nIGp1c3QgdG8gYmUgc2FmZSkuCgkgKi8KCgkgLyoqKiogTWlnaHQgYmUgYSBnb29kIGlkZWEgdG8gc2V0IEwyRE8gaGVyZSAtIHRvIHByZXZlbnQgaW5zdHJ1Y3Rpb25zCgkgICAgICAgZnJvbSBnZXR0aW5nIGludG8gdGhlIGNhY2hlLiAgQnV0IHNpbmNlIHdlIGludmFsaWRhdGUKCSAgICAgICB0aGUgbmV4dCB0aW1lIHdlIGVuYWJsZSB0aGUgY2FjaGUgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyLgoJICAgICAgIERvbid0IGRvIHRoaXMgdW5sZXNzIHlvdSBhY2NvbW9kYXRlIGFsbCBwcm9jZXNzb3IgdmFyaWF0aW9ucy4KCSAgICAgICBUaGUgYml0IG1vdmVkIG9uIHRoZSA3NDUwLi4uLi4KCSAgKioqKi8KCkJFR0lOX0ZUUl9TRUNUSU9OCgkvKiBEaXNhYmxlIEwyIHByZWZldGNoIG9uIHNvbWUgNzQ1eCBhbmQgdHJ5IHRvIGVuc3VyZQoJICogTDIgcHJlZmV0Y2ggZW5naW5lcyBhcmUgaWRsZS4gQXMgZXhwbGFpbmVkIGJ5IGVycmF0YQoJICogdGV4dCwgd2UgY2FuJ3QgYmUgc3VyZSB0aGV5IGFyZSwgd2UganVzdCBob3BlIHZlcnkgaGFyZAoJICogdGhhdCB3ZWxsIGJlIGVub3VnaCAoc2ljICEpLiBBdCBsZWFzdCBJIG5vdGljZWQgQXBwbGUKCSAqIGRvZXNuJ3QgZXZlbiBib3RoZXIgZG9pbmcgdGhlIGRjYmYncyBoZXJlLi4uCgkgKi8KCW1mc3ByCXI0LFNQUk5fTVNTQ1IwCglybHdpbm0JcjQscjQsMCwwLDI5CglzeW5jCgltdHNwcglTUFJOX01TU0NSMCxyNAoJc3luYwoJaXN5bmMKCWxpcwlyNCxLRVJORUxCQVNFQGgKCWRjYmYJMCxyNAoJZGNiZgkwLHI0CglkY2JmCTAscjQKCWRjYmYJMCxyNApFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9TUEVDNzQ1MCkKCgkvKiBUT0RPOiB1c2UgSFcgZmx1c2ggYXNzaXN0IHdoZW4gYXZhaWxhYmxlICovCgoJbGlzCXI0LDB4MDAwMgoJbXRjdHIJcjQKCWxpCXI0LDAKMToKCWx3engJcjAscjAscjQKCWFkZGkJcjQscjQsMzIJCS8qIEdvIHRvIHN0YXJ0IG9mIG5leHQgY2FjaGUgbGluZSAqLwoJYmRuegkxYgoJaXN5bmMKCgkvKiBOb3csIGZsdXNoIHRoZSBmaXJzdCA0TUIgb2YgbWVtb3J5ICovCglsaXMJcjQsMHgwMDAyCgltdGN0cglyNAoJbGkJcjQsMAoJc3luYwoxOgoJZGNiZgkwLHI0CglhZGRpCXI0LHI0LDMyCQkvKiBHbyB0byBzdGFydCBvZiBuZXh0IGNhY2hlIGxpbmUgKi8KCWJkbnoJMWIKCjI6CgkvKiBTZXQgdXAgdGhlIEwyQ1IgY29uZmlndXJhdGlvbiBiaXRzIChhbmQgc3dpdGNoIEwyIG9mZikgKi8KCS8qIENQVSBlcnJhdGE6IE1ha2Ugc3VyZSB0aGUgbXRzcHIgYmVsb3cgaXMgYWxyZWFkeSBpbiB0aGUKCSAqIEwxIGljYWNoZQoJICovCgliCTIwZgoJLmJhbGlnbglMMV9DQUNIRV9CWVRFUwoyMjoKCXN5bmMKCW10c3ByCVNQUk5fTDJDUixyMwoJc3luYwoJYgkyM2YKMjA6CgliCTIxZgoyMToJc3luYwoJaXN5bmMKCWIJMjJiCgoyMzoKCS8qIFBlcmZvcm0gYSBnbG9iYWwgaW52YWxpZGF0aW9uICovCglvcmlzCXIzLHIzLDB4MDAyMAoJc3luYwoJbXRzcHIJU1BSTl9MMkNSLHIzCglzeW5jCglpc3luYwkJCQkvKiBGb3IgZXJyYXRhICovCgpCRUdJTl9GVFJfU0VDVElPTgoJLyogT24gdGhlIDc0NTAsIHdlIHdhaXQgZm9yIHRoZSBMMkkgYml0IHRvIGNsZWFyLi4uLi4uCgkqLwoxMDoJbWZzcHIJcjMsU1BSTl9MMkNSCglhbmRpcy4JcjQscjMsMHgwMDIwCglibmUJMTBiCgliCTExZgpFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9TUEVDNzQ1MCkKCgkvKiBXYWl0IGZvciB0aGUgaW52YWxpZGF0aW9uIHRvIGNvbXBsZXRlICovCjM6CW1mc3ByCXIzLFNQUk5fTDJDUgoJcmx3aW5tLglyNCxyMywwLDMxLDMxCglibmUJM2IKCjExOglybHdpbm0JcjMscjMsMCwxMSw5CQkvKiBUdXJuIG9mZiB0aGUgTDJJIGJpdCAqLwoJc3luYwoJbXRzcHIJU1BSTl9MMkNSLHIzCglzeW5jCgoJLyogU2VlIGlmIHdlIG5lZWQgdG8gZW5hYmxlIHRoZSBjYWNoZSAqLwoJY21wbHdpCXI1LDAKCWJlcQk0ZgoKCS8qIEVuYWJsZSB0aGUgY2FjaGUgKi8KCW9yaXMJcjMscjMsMHg4MDAwCgltdHNwcglTUFJOX0wyQ1IscjMKCXN5bmMKCQoJLyogRW5hYmxlIEwyIEhXIHByZWZldGNoIG9uIDc0NHgvNzQ1eCAqLwpCRUdJTl9GVFJfU0VDVElPTgoJbWZzcHIJcjMsU1BSTl9NU1NDUjAKCW9yaQlyMyxyMywzCglzeW5jCgltdHNwcglTUFJOX01TU0NSMCxyMwoJc3luYwoJaXN5bmMKRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfU1BFQzc0NTApCjQ6CgoJLyogUmVzdG9yZSBISUQwW0RQTV0gdG8gd2hhdGV2ZXIgaXQgd2FzIGJlZm9yZSAqLwoJc3luYwoJbXRzcHIJMTAwOCxyOAoJc3luYwoKCS8qIFJlc3RvcmUgTVNSIChyZXN0b3JlcyBFRSBhbmQgRFIgYml0cyB0byBvcmlnaW5hbCBzdGF0ZSkgKi8KCVNZTkMKCW10bXNyCXI3Cglpc3luYwoKCW10bHIJcjkKCWJscgoKX0dMT0JBTChfZ2V0X0wyQ1IpCgkvKiBSZXR1cm4gdGhlIEwyQ1IgY29udGVudHMgKi8KCWxpCXIzLDAKQkVHSU5fRlRSX1NFQ1RJT04KCW1mc3ByCXIzLFNQUk5fTDJDUgpFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9MMkNSKQoJYmxyCgoKLyoKICogSGVyZSBpcyBhIHNpbWlsYXIgcm91dGluZSBmb3IgZGVhbGluZyB3aXRoIHRoZSBMMyBjYWNoZQogKiBvbiB0aGUgNzQ1eCBmYW1pbHkgb2YgY2hpcHMKICovCgpfR0xPQkFMKF9zZXRfTDNDUikKCS8qIE1ha2Ugc3VyZSB0aGlzIGlzIGEgNzQ1eCBjaGlwICovCkJFR0lOX0ZUUl9TRUNUSU9OCglsaQlyMywtMQoJYmxyCkVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX0wzQ1IpCgoJLyogVHVybiBvZmYgaW50ZXJydXB0cyBhbmQgZGF0YSByZWxvY2F0aW9uLiAqLwoJbWZtc3IJcjcJCS8qIFNhdmUgTVNSIGluIHI3ICovCglybHdpbm0JcjQscjcsMCwxNywxNQoJcmx3aW5tCXI0LHI0LDAsMjgsMjYJLyogVHVybiBvZmYgRFIgYml0ICovCglzeW5jCgltdG1zcglyNAoJaXN5bmMKCgkvKiBTdG9wIERTVCBzdHJlYW1zICovCglEU1NBTEwKCXN5bmMKCgkvKiBHZXQgdGhlIGN1cnJlbnQgZW5hYmxlIGJpdCBvZiB0aGUgTDNDUiBpbnRvIHI0ICovCgltZnNwcglyNCxTUFJOX0wzQ1IKCgkvKiBUd2VhayBzb21lIGJpdHMgKi8KCXJsd2lubQlyNSxyMywwLDAsMAkJLyogcjUgY29udGFpbnMgdGhlIG5ldyBlbmFibGUgYml0ICovCglybHdpbm0JcjMscjMsMCwyMiwyMAkJLyogVHVybiBvZmYgdGhlIGludmFsaWRhdGUgYml0ICovCglybHdpbm0JcjMscjMsMCwyLDMxCQkvKiBUdXJuIG9mZiB0aGUgZW5hYmxlICYgUEUgYml0cyAqLwoJcmx3aW5tCXIzLHIzLDAsNSwzCQkvKiBUdXJuIG9mZiB0aGUgY2xrZW4gYml0ICovCgkvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBmbHVzaCAqLwoJcmx3aW5tLglyNCxyNCwwLDAsMAoJYmVxCTJmCgoJLyogRmx1c2ggdGhlIGNhY2hlLgoJICovCgoJLyogVE9ETzogdXNlIEhXIGZsdXNoIGFzc2lzdCAqLwoKCWxpcwlyNCwweDAwMDgKCW10Y3RyCXI0CglsaQlyNCwwCjE6Cglsd3p4CXIwLHIwLHI0CglkY2JmCTAscjQKCWFkZGkJcjQscjQsMzIJCS8qIEdvIHRvIHN0YXJ0IG9mIG5leHQgY2FjaGUgbGluZSAqLwoJYmRuegkxYgoKMjoKCS8qIFNldCB1cCB0aGUgTDNDUiBjb25maWd1cmF0aW9uIGJpdHMgKGFuZCBzd2l0Y2ggTDMgb2ZmKSAqLwoJc3luYwoJbXRzcHIJU1BSTl9MM0NSLHIzCglzeW5jCgoJb3JpcwlyMyxyMyxMM0NSX0wzUkVTQGgJCS8qIFNldCByZXNlcnZlZCBiaXQgNSAqLwoJbXRzcHIJU1BSTl9MM0NSLHIzCglzeW5jCglvcmlzCXIzLHIzLEwzQ1JfTDNDTEtFTkBoCQkvKiBTZXQgY2xrZW4gKi8KCW10c3ByCVNQUk5fTDNDUixyMwoJc3luYwoKCS8qIFdhaXQgZm9yIHN0YWJpbGl6ZSAqLwoJbGkJcjAsMjU2CgltdGN0cglyMAoxOgliZG56CTFiCgoJLyogUGVyZm9ybSBhIGdsb2JhbCBpbnZhbGlkYXRpb24gKi8KCW9yaQlyMyxyMywweDA0MDAKCXN5bmMKCW10c3ByCVNQUk5fTDNDUixyMwoJc3luYwoJaXN5bmMKCgkvKiBXZSB3YWl0IGZvciB0aGUgTDNJIGJpdCB0byBjbGVhci4uLi4uLiAqLwoxMDoJbWZzcHIJcjMsU1BSTl9MM0NSCglhbmRpLglyNCxyMywweDA0MDAKCWJuZQkxMGIKCgkvKiBDbGVhciBDTEtFTiAqLwoJcmx3aW5tCXIzLHIzLDAsNSwzCQkvKiBUdXJuIG9mZiB0aGUgY2xrZW4gYml0ICovCgltdHNwcglTUFJOX0wzQ1IscjMKCXN5bmMKCgkvKiBXYWl0IGZvciBzdGFiaWxpemUgKi8KCWxpCXIwLDI1NgoJbXRjdHIJcjAKMToJYmRuegkxYgoKCS8qIFNlZSBpZiB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgY2FjaGUgKi8KCWNtcGx3aQlyNSwwCgliZXEJNGYKCgkvKiBFbmFibGUgdGhlIGNhY2hlICovCglvcmlzCXIzLHIzLChMM0NSX0wzRSB8IEwzQ1JfTDNDTEtFTilAaAoJbXRzcHIJU1BSTl9MM0NSLHIzCglzeW5jCgoJLyogV2FpdCBmb3Igc3RhYmlsaXplICovCglsaQlyMCwyNTYKCW10Y3RyCXIwCjE6CWJkbnoJMWIKCgkvKiBSZXN0b3JlIE1TUiAocmVzdG9yZXMgRUUgYW5kIERSIGJpdHMgdG8gb3JpZ2luYWwgc3RhdGUpICovCjQ6CVNZTkMKCW10bXNyCXI3Cglpc3luYwoJYmxyCgpfR0xPQkFMKF9nZXRfTDNDUikKCS8qIFJldHVybiB0aGUgTDNDUiBjb250ZW50cyAqLwoJbGkJcjMsMApCRUdJTl9GVFJfU0VDVElPTgoJbWZzcHIJcjMsU1BSTl9MM0NSCkVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0wzQ1IpCglibHIKCi8qIC0tLSBFbmQgb2YgUG93ZXJMb2dpeCBjb2RlIC0tLQogKi8KCgovKiBmbHVzaF9kaXNhYmxlX0wxKCkJLSBGbHVzaCBhbmQgZGlzYWJsZSBMMSBjYWNoZQogKgogKiBjbG9iYmVycyByMCwgcjMsIGN0ciwgY3IwCiAqIE11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgTU1VIGVuYWJsZWQuCiAqLwpfR0xPQkFMKF9fZmx1c2hfZGlzYWJsZV9MMSkKCS8qIFN0b3AgcGVuZGluZyBhbGl0dmVjIHN0cmVhbXMgYW5kIG1lbW9yeSBhY2Nlc3NlcyAqLwpCRUdJTl9GVFJfU0VDVElPTgoJRFNTQUxMCkVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FMVElWRUMpCiAJc3luYwoKCS8qIExvYWQgY291bnRlciB0byAweDQwMDAgY2FjaGUgbGluZXMgKDUxMmspIGFuZAoJICogbG9hZCBjYWNoZSB3aXRoIGRhdGFzCgkgKi8KCWxpCXIzLDB4NDAwMAkvKiA1MTJrQiAvIDMyQiAqLwoJbXRjdHIJcjMKCWxpcwlyMyxLRVJORUxCQVNFQGgKMToKCWx3eglyMCwwKHIzKQoJYWRkaQlyMyxyMywweDAwMjAJLyogR28gdG8gc3RhcnQgb2YgbmV4dCBjYWNoZSBsaW5lICovCgliZG56CTFiCglpc3luYwoJc3luYwoKCS8qIE5vdyBmbHVzaCB0aG9zZSBjYWNoZSBsaW5lcyAqLwoJbGkJcjMsMHg0MDAwCS8qIDUxMmtCIC8gMzJCICovCgltdGN0cglyMwoJbGlzCXIzLEtFUk5FTEJBU0VAaAoxOgoJZGNiZgkwLHIzCglhZGRpCXIzLHIzLDB4MDAyMAkvKiBHbyB0byBzdGFydCBvZiBuZXh0IGNhY2hlIGxpbmUgKi8KCWJkbnoJMWIKCXN5bmMKCgkvKiBXZSBjYW4gbm93IGRpc2FibGUgdGhlIEwxIGNhY2hlIChISUQwOkRDRSwgSElEMDpJQ0UpICovCgltZnNwcglyMyxTUFJOX0hJRDAKCXJsd2lubQlyMyxyMywwLDE4LDE1CgltdHNwcglTUFJOX0hJRDAscjMKCXN5bmMKCWlzeW5jCiAJYmxyCgovKiBpbnZhbF9lbmFibGVfTDEJLSBJbnZhbGlkYXRlIGFuZCBlbmFibGUgTDEgY2FjaGUKICoKICogQXNzdW1lcyBMMSBpcyBhbHJlYWR5IGRpc2FibGVkIGFuZCBNU1I6RUUgaXMgb2ZmCiAqCiAqIGNsb2JiZXJzIHIzCiAqLwpfR0xPQkFMKF9faW52YWxfZW5hYmxlX0wxKQoJLyogRW5hYmxlIGFuZCB0aGVuIEZsYXNoIGludmFsIHRoZSBpbnN0cnVjdGlvbiAmIGRhdGEgY2FjaGUgKi8KCW1mc3ByCXIzLFNQUk5fSElEMAoJb3JpCXIzLHIzLCBISUQwX0lDRXxISUQwX0lDRkl8SElEMF9EQ0V8SElEMF9EQ0kKCXN5bmMKCWlzeW5jCgltdHNwcglTUFJOX0hJRDAscjMKCXhvcmkJcjMscjMsIEhJRDBfSUNGSXxISUQwX0RDSQoJbXRzcHIJU1BSTl9ISUQwLHIzCglzeW5jCgogCWJscgoKCg==