LyoKCUwyQ1IgZnVuY3Rpb25zCglDb3B5cmlnaHQgqSAxOTk3LTE5OTggYnkgUG93ZXJMb2dpeCBSICYgRCwgSW5jLgoKCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoqLwovKgoJVGh1ciwgRGVjLiAxMiwgMTk5OC4KCS0gRmlyc3QgcHVibGljIHJlbGVhc2UsIGNvbnRyaWJ1dGVkIGJ5IFBvd2VyTG9naXguCgkqKioqKioqKioqKgoJU2F0LCBBdWcuIDcsIDE5OTkuCgktIFRlcnJ5OiBNYWRlIHN1cmUgY29kZSBkaXNhYmxlZCBpbnRlcnJ1cHRzIGJlZm9yZSBydW5uaW5nLiAoUHJldmlvdXNseQoJCQlpdCB3YXMgYXNzdW1lZCBpbnRlcnJ1cHRzIHdlcmUgYWxyZWFkeSBkaXNhYmxlZCkuCgktIFRlcnJ5OiBVcGRhdGVkIGZvciB0ZW50YXRpdmUgRzQgc3VwcG9ydC4gIDRNQiBvZiBtZW1vcnkgaXMgbm93IGZsdXNoZWQKCQkJaW5zdGVhZCBvZiAyTUIuICAoUHJvYi4gb25seSAzIGlzIG5lY2Vzc2FyeSkuCgktIFRlcnJ5OiBVcGRhdGVkIGZvciB3b3JrYXJvdW5kIHRvIEhJRDBbRFBNXSBwcm9jZXNzb3IgYnVnCgkJCWR1cmluZyBnbG9iYWwgaW52YWxpZGF0ZXMuCgkqKioqKioqKioqKgoJVGh1LCBKdWx5IDEzLCAyMDAwLgoJLSBUZXJyeTogQWRkZWQgaXN5bmMgdG8gY29ycmVjdCBmb3IgYW4gZXJyYXRhLgoKCTIyIEF1Z3VzdCAyMDAxLgoJLSBEYW5NOiBGaW5hbGx5IGFkZGVkIHRoZSA3NDUwIHBhdGNoIEkndmUgaGFkIGZvciB0aGUgcGFzdAoJCXNldmVyYWwgbW9udGhzLiAgVGhlIEwyQ1IgaXMgc2ltaWxhciwgYnV0IEknbSBnb2luZwoJCXRvIGFzc3VtZSB0aGUgdXNlciBvZiB0aGlzIGZ1bmN0aW9ucyBrbm93cyB3aGF0IHRoZXkKCQlhcmUgZG9pbmcuCgoJQXV0aG9yOglUZXJyeSBHcmVlbmlhdXMgKHRncmVlQHBoeXMudWFsYmVydGEuY2EpCglQbGVhc2UgZS1tYWlsIHVwZGF0ZXMgdG8gdGhpcyBmaWxlIHRvIG1lLCB0aGFua3MhCiovCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgojaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgojaW5jbHVkZSA8YXNtL3BhZ2UuaD4KCi8qIFVzYWdlOgoKCVdoZW4gc2V0dGluZyB0aGUgTDJDUiByZWdpc3RlciwgeW91IG11c3QgZG8gYSBmZXcgc3BlY2lhbAoJdGhpbmdzLiAgSWYgeW91IGFyZSBlbmFibGluZyB0aGUgY2FjaGUsIHlvdSBtdXN0IHBlcmZvcm0gYQoJZ2xvYmFsIGludmFsaWRhdGUuICBJZiB5b3UgYXJlIGRpc2FibGluZyB0aGUgY2FjaGUsIHlvdSBtdXN0CglmbHVzaCB0aGUgY2FjaGUgY29udGVudHMgZmlyc3QuICBUaGlzIHJvdXRpbmUgdGFrZXMgY2FyZSBvZgoJZG9pbmcgdGhlc2UgdGhpbmdzLiAgV2hlbiBmaXJzdCBlbmFibGluZyB0aGUgY2FjaGUsIG1ha2Ugc3VyZQoJeW91IHBhc3MgaW4gdGhlIEwyQ1IgeW91IHdhbnQsIGFzIHdlbGwgYXMgcGFzc2luZyBpbiB0aGUKCWdsb2JhbCBpbnZhbGlkYXRlIGJpdCBzZXQuICBBIGdsb2JhbCBpbnZhbGlkYXRlIHdpbGwgb25seSBiZQoJcGVyZm9ybWVkIGlmIHRoZSBMMkkgYml0IGlzIHNldCBpbiBhcHBseVRoaXMuICBXaGVuIGVuYWJsaW5nCgl0aGUgY2FjaGUsIHlvdSBzaG91bGQgYWxzbyBzZXQgdGhlIEwyRSBiaXQgaW4gYXBwbHlUaGlzLiAgSWYKCXlvdSB3YW50IHRvIG1vZGlmeSB0aGUgTDJDUiBjb250ZW50cyBhZnRlciB0aGUgY2FjaGUgaGFzIGJlZW4KCWVuYWJsZWQsIHRoZSByZWNvbW1lbmRlZCBwcm9jZWR1cmUgaXMgdG8gZmlyc3QgY2FsbAoJX19zZXRMMkNSKDApIHRvIGRpc2FibGUgdGhlIGNhY2hlIGFuZCB0aGVuIGNhbGwgaXQgYWdhaW4gd2l0aAoJdGhlIG5ldyB2YWx1ZXMgZm9yIEwyQ1IuICBFeGFtcGxlczoKCglfc2V0TDJDUigwKQkJLSBkaXNhYmxlcyB0aGUgY2FjaGUKCV9zZXRMMkNSKDB4QjNBMDQwMDApCS0gZW5hYmxlcyBteSBHMyB1cGdyYWRlIGNhcmQ6CgkJCQktIEwyRSBzZXQgdG8gdHVybiBvbiB0aGUgY2FjaGUKCQkJCS0gTDJTSVogc2V0IHRvIDFNQgoJCQkJLSBMMkNMSyBzZXQgdG8gMToxCgkJCQktIEwyUkFNIHNldCB0byBwaXBlbGluZWQgc3luY2hyb25vdXMgbGF0ZS13cml0ZQoJCQkJLSBMMkkgc2V0IHRvIHBlcmZvcm0gYSBnbG9iYWwgaW52YWxpZGF0aW9uCgkJCQktIEwyT0ggc2V0IHRvIDAuNSBuUwoJCQkJLSBMMkRGIHNldCBiZWNhdXNlIHRoaXMgdXBncmFkZSBjYXJkCgkJCQkgIHJlcXVpcmVzIGl0CgoJQSBzaW1pbGFyIGNhbGwgc2hvdWxkIHdvcmsgZm9yIHlvdXIgY2FyZC4gIFlvdSBuZWVkIHRvIGtub3cKCXRoZSBjb3JyZWN0IHNldHRpbmcgZm9yIHlvdXIgY2FyZCBhbmQgdGhlbiBwbGFjZSB0aGVtIGluIHRoZQoJZmllbGRzIEkgaGF2ZSBvdXRsaW5lZCBhYm92ZS4gIE90aGVyIGZpZWxkcyBzdXBwb3J0IG9wdGlvbmFsCglmZWF0dXJlcywgc3VjaCBhcyBMMkRPIHdoaWNoIGNhY2hlcyBvbmx5IGRhdGEsIG9yIEwyVFMgd2hpY2gKCWNhdXNlcyBjYWNoZSBwdXNoZXMgZnJvbSB0aGUgTDEgY2FjaGUgdG8gZ28gdG8gdGhlIEwyIGNhY2hlCglpbnN0ZWFkIG9mIHRvIG1haW4gbWVtb3J5LgoKSU1QT1JUQU5UOgoJU3RhcnRpbmcgd2l0aCB0aGUgNzQ1MCwgdGhlIGJpdHMgaW4gdGhpcyByZWdpc3RlciBoYXZlIG1vdmVkCglvciBiZWhhdmUgZGlmZmVyZW50bHkuICBUaGUgRW5hYmxlLCBQYXJpdHkgRW5hYmxlLCBTaXplLAoJYW5kIEwyIEludmFsaWRhdGUgYXJlIHRoZSBvbmx5IGJpdHMgdGhhdCBoYXZlIG5vdCBtb3ZlZC4KCVRoZSBzaXplIGlzIHJlYWQtb25seSBmb3IgdGhlc2UgcHJvY2Vzc29ycyB3aXRoIGludGVybmFsIEwyCgljYWNoZSwgYW5kIHRoZSBpbnZhbGlkYXRlIGlzIGEgY29udHJvbCBhcyB3ZWxsIGFzIHN0YXR1cy4KCQktLSBEYW4KCiovCi8qCiAqIFN1bW1hcnk6IHRoaXMgcHJvY2VkdXJlIGlnbm9yZXMgdGhlIEwySSBiaXQgaW4gdGhlIHZhbHVlIHBhc3NlZCBpbiwKICogZmx1c2hlcyB0aGUgY2FjaGUgaWYgaXQgd2FzIGFscmVhZHkgZW5hYmxlZCwgYWx3YXlzIGludmFsaWRhdGVzIHRoZQogKiBjYWNoZSwgdGhlbiBlbmFibGVzIHRoZSBjYWNoZSBpZiB0aGUgTDJFIGJpdCBpcyBzZXQgaW4gdGhlIHZhbHVlCiAqIHBhc3NlZCBpbi4KICogICAtLSBwYXVsdXMuCiAqLwpfR0xPQkFMKF9zZXRfTDJDUikKCS8qIE1ha2Ugc3VyZSB0aGlzIGlzIGEgNzUwIG9yIDc0MDAgY2hpcCAqLwpCRUdJTl9GVFJfU0VDVElPTgoJbGkJcjMsLTEKCWJscgpFTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9MMkNSKQoKCW1mbHIJcjkKCgkvKiBTdG9wIERTVCBzdHJlYW1zICovCkJFR0lOX0ZUUl9TRUNUSU9OCglEU1NBTEwKCXN5bmMKRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQUxUSVZFQykKCgkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzIGFuZCBkYXRhIHJlbG9jYXRpb24uICovCgltZm1zcglyNwkJLyogU2F2ZSBNU1IgaW4gcjcgKi8KCXJsd2lubQlyNCxyNywwLDE3LDE1CglybHdpbm0JcjQscjQsMCwyOCwyNgkvKiBUdXJuIG9mZiBEUiBiaXQgKi8KCXN5bmMKCW10bXNyCXI0Cglpc3luYwoKCS8qIEJlZm9yZSB3ZSBwZXJmb3JtIHRoZSBnbG9iYWwgaW52YWxpZGF0aW9uLCB3ZSBtdXN0IGRpc2FibGUgZHluYW1pYwoJICogcG93ZXIgbWFuYWdlbWVudCB2aWEgSElEMFtEUE1dIHRvIHdvcmsgYXJvdW5kIGEgcHJvY2Vzc29yIGJ1ZyB3aGVyZQoJICogRFBNIGNhbiBwb3NzaWJseSBpbnRlcmZlcmUgd2l0aCB0aGUgc3RhdGUgbWFjaGluZSBpbiB0aGUgcHJvY2Vzc29yCgkgKiB0aGF0IGludmFsaWRhdGVzIHRoZSBMMiBjYWNoZSB0YWdzLgoJICovCgltZnNwcglyOCxTUFJOX0hJRDAJCS8qIFNhdmUgSElEMCBpbiByOCAqLwoJcmx3aW5tCXI0LHI4LDAsMTIsMTAJCS8qIFR1cm4gb2ZmIEhJRDBbRFBNXSAqLwoJc3luYwoJbXRzcHIJU1BSTl9ISUQwLHI0CQkvKiBEaXNhYmxlIERQTSAqLwoJc3luYwoKCS8qIEdldCB0aGUgY3VycmVudCBlbmFibGUgYml0IG9mIHRoZSBMMkNSIGludG8gcjQgKi8KCW1mc3ByCXI0LFNQUk5fTDJDUgoKCS8qIFR3ZWFrIHNvbWUgYml0cyAqLwoJcmx3aW5tCXI1LHIzLDAsMCwwCQkvKiByNSBjb250YWlucyB0aGUgbmV3IGVuYWJsZSBiaXQgKi8KCXJsd2lubQlyMyxyMywwLDExLDkJCS8qIFR1cm4gb2ZmIHRoZSBpbnZhbGlkYXRlIGJpdCAqLwoJcmx3aW5tCXIzLHIzLDAsMSwzMQkJLyogVHVybiBvZmYgdGhlIGVuYWJsZSBiaXQgKi8KCgkvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBmbHVzaCAqLwoJcmx3aW5tLglyNCxyNCwwLDAsMAoJYmVxCTJmCgoJLyogRmx1c2ggdGhlIGNhY2hlLiBGaXJzdCwgcmVhZCB0aGUgZmlyc3QgNE1CIG9mIG1lbW9yeSAocGh5c2ljYWwpIHRvCgkgKiBwdXQgbmV3IGRhdGEgaW4gdGhlIGNhY2hlLiAgKEFjdHVhbGx5IHdlIG9ubHkgbmVlZAoJICogdGhlIHNpemUgb2YgdGhlIEwyIGNhY2hlIHBsdXMgdGhlIHNpemUgb2YgdGhlIEwxIGNhY2hlLCBidXQgNE1CIHdpbGwKCSAqIGNvdmVyIGV2ZXJ5dGhpbmcganVzdCB0byBiZSBzYWZlKS4KCSAqLwoKCSAvKioqKiBNaWdodCBiZSBhIGdvb2QgaWRlYSB0byBzZXQgTDJETyBoZXJlIC0gdG8gcHJldmVudCBpbnN0cnVjdGlvbnMKCSAgICAgICBmcm9tIGdldHRpbmcgaW50byB0aGUgY2FjaGUuICBCdXQgc2luY2Ugd2UgaW52YWxpZGF0ZQoJICAgICAgIHRoZSBuZXh0IHRpbWUgd2UgZW5hYmxlIHRoZSBjYWNoZSBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIuCgkgICAgICAgRG9uJ3QgZG8gdGhpcyB1bmxlc3MgeW91IGFjY29tb2RhdGUgYWxsIHByb2Nlc3NvciB2YXJpYXRpb25zLgoJICAgICAgIFRoZSBiaXQgbW92ZWQgb24gdGhlIDc0NTAuLi4uLgoJICAqKioqLwoKQkVHSU5fRlRSX1NFQ1RJT04KCS8qIERpc2FibGUgTDIgcHJlZmV0Y2ggb24gc29tZSA3NDV4IGFuZCB0cnkgdG8gZW5zdXJlCgkgKiBMMiBwcmVmZXRjaCBlbmdpbmVzIGFyZSBpZGxlLiBBcyBleHBsYWluZWQgYnkgZXJyYXRhCgkgKiB0ZXh0LCB3ZSBjYW4ndCBiZSBzdXJlIHRoZXkgYXJlLCB3ZSBqdXN0IGhvcGUgdmVyeSBoYXJkCgkgKiB0aGF0IHdlbGwgYmUgZW5vdWdoIChzaWMgISkuIEF0IGxlYXN0IEkgbm90aWNlZCBBcHBsZQoJICogZG9lc24ndCBldmVuIGJvdGhlciBkb2luZyB0aGUgZGNiZidzIGhlcmUuLi4KCSAqLwoJbWZzcHIJcjQsU1BSTl9NU1NDUjAKCXJsd2lubQlyNCxyNCwwLDAsMjkKCXN5bmMKCW10c3ByCVNQUk5fTVNTQ1IwLHI0CglzeW5jCglpc3luYwoJbGlzCXI0LEtFUk5FTEJBU0VAaAoJZGNiZgkwLHI0CglkY2JmCTAscjQKCWRjYmYJMCxyNAoJZGNiZgkwLHI0CkVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1NQRUM3NDUwKQoKCS8qIFRPRE86IHVzZSBIVyBmbHVzaCBhc3Npc3Qgd2hlbiBhdmFpbGFibGUgKi8KCglsaXMJcjQsMHgwMDAyCgltdGN0cglyNAoJbGkJcjQsMAoxOgoJbHd6eAlyMCxyMCxyNAoJYWRkaQlyNCxyNCwzMgkJLyogR28gdG8gc3RhcnQgb2YgbmV4dCBjYWNoZSBsaW5lICovCgliZG56CTFiCglpc3luYwoKCS8qIE5vdywgZmx1c2ggdGhlIGZpcnN0IDRNQiBvZiBtZW1vcnkgKi8KCWxpcwlyNCwweDAwMDIKCW10Y3RyCXI0CglsaQlyNCwwCglzeW5jCjE6CglkY2JmCTAscjQKCWFkZGkJcjQscjQsMzIJCS8qIEdvIHRvIHN0YXJ0IG9mIG5leHQgY2FjaGUgbGluZSAqLwoJYmRuegkxYgoKMjoKCS8qIFNldCB1cCB0aGUgTDJDUiBjb25maWd1cmF0aW9uIGJpdHMgKGFuZCBzd2l0Y2ggTDIgb2ZmKSAqLwoJLyogQ1BVIGVycmF0YTogTWFrZSBzdXJlIHRoZSBtdHNwciBiZWxvdyBpcyBhbHJlYWR5IGluIHRoZQoJICogTDEgaWNhY2hlCgkgKi8KCWIJMjBmCgkuYmFsaWduCUwxX0NBQ0hFX0JZVEVTCjIyOgoJc3luYwoJbXRzcHIJU1BSTl9MMkNSLHIzCglzeW5jCgliCTIzZgoyMDoKCWIJMjFmCjIxOglzeW5jCglpc3luYwoJYgkyMmIKCjIzOgoJLyogUGVyZm9ybSBhIGdsb2JhbCBpbnZhbGlkYXRpb24gKi8KCW9yaXMJcjMscjMsMHgwMDIwCglzeW5jCgltdHNwcglTUFJOX0wyQ1IscjMKCXN5bmMKCWlzeW5jCQkJCS8qIEZvciBlcnJhdGEgKi8KCkJFR0lOX0ZUUl9TRUNUSU9OCgkvKiBPbiB0aGUgNzQ1MCwgd2Ugd2FpdCBmb3IgdGhlIEwySSBiaXQgdG8gY2xlYXIuLi4uLi4KCSovCjEwOgltZnNwcglyMyxTUFJOX0wyQ1IKCWFuZGlzLglyNCxyMywweDAwMjAKCWJuZQkxMGIKCWIJMTFmCkVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1NQRUM3NDUwKQoKCS8qIFdhaXQgZm9yIHRoZSBpbnZhbGlkYXRpb24gdG8gY29tcGxldGUgKi8KMzoJbWZzcHIJcjMsU1BSTl9MMkNSCglybHdpbm0uCXI0LHIzLDAsMzEsMzEKCWJuZQkzYgoKMTE6CXJsd2lubQlyMyxyMywwLDExLDkJCS8qIFR1cm4gb2ZmIHRoZSBMMkkgYml0ICovCglzeW5jCgltdHNwcglTUFJOX0wyQ1IscjMKCXN5bmMKCgkvKiBTZWUgaWYgd2UgbmVlZCB0byBlbmFibGUgdGhlIGNhY2hlICovCgljbXBsd2kJcjUsMAoJYmVxCTRmCgoJLyogRW5hYmxlIHRoZSBjYWNoZSAqLwoJb3JpcwlyMyxyMywweDgwMDAKCW10c3ByCVNQUk5fTDJDUixyMwoJc3luYwoJCgkvKiBFbmFibGUgTDIgSFcgcHJlZmV0Y2ggb24gNzQ0eC83NDV4ICovCkJFR0lOX0ZUUl9TRUNUSU9OCgltZnNwcglyMyxTUFJOX01TU0NSMAoJb3JpCXIzLHIzLDMKCXN5bmMKCW10c3ByCVNQUk5fTVNTQ1IwLHIzCglzeW5jCglpc3luYwpFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9TUEVDNzQ1MCkKNDoKCgkvKiBSZXN0b3JlIEhJRDBbRFBNXSB0byB3aGF0ZXZlciBpdCB3YXMgYmVmb3JlICovCglzeW5jCgltdHNwcgkxMDA4LHI4CglzeW5jCgoJLyogUmVzdG9yZSBNU1IgKHJlc3RvcmVzIEVFIGFuZCBEUiBiaXRzIHRvIG9yaWdpbmFsIHN0YXRlKSAqLwoJU1lOQwoJbXRtc3IJcjcKCWlzeW5jCgoJbXRscglyOQoJYmxyCgpfR0xPQkFMKF9nZXRfTDJDUikKCS8qIFJldHVybiB0aGUgTDJDUiBjb250ZW50cyAqLwoJbGkJcjMsMApCRUdJTl9GVFJfU0VDVElPTgoJbWZzcHIJcjMsU1BSTl9MMkNSCkVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0wyQ1IpCglibHIKCgovKgogKiBIZXJlIGlzIGEgc2ltaWxhciByb3V0aW5lIGZvciBkZWFsaW5nIHdpdGggdGhlIEwzIGNhY2hlCiAqIG9uIHRoZSA3NDV4IGZhbWlseSBvZiBjaGlwcwogKi8KCl9HTE9CQUwoX3NldF9MM0NSKQoJLyogTWFrZSBzdXJlIHRoaXMgaXMgYSA3NDV4IGNoaXAgKi8KQkVHSU5fRlRSX1NFQ1RJT04KCWxpCXIzLC0xCglibHIKRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfTDNDUikKCgkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzIGFuZCBkYXRhIHJlbG9jYXRpb24uICovCgltZm1zcglyNwkJLyogU2F2ZSBNU1IgaW4gcjcgKi8KCXJsd2lubQlyNCxyNywwLDE3LDE1CglybHdpbm0JcjQscjQsMCwyOCwyNgkvKiBUdXJuIG9mZiBEUiBiaXQgKi8KCXN5bmMKCW10bXNyCXI0Cglpc3luYwoKCS8qIFN0b3AgRFNUIHN0cmVhbXMgKi8KCURTU0FMTAoJc3luYwoKCS8qIEdldCB0aGUgY3VycmVudCBlbmFibGUgYml0IG9mIHRoZSBMM0NSIGludG8gcjQgKi8KCW1mc3ByCXI0LFNQUk5fTDNDUgoKCS8qIFR3ZWFrIHNvbWUgYml0cyAqLwoJcmx3aW5tCXI1LHIzLDAsMCwwCQkvKiByNSBjb250YWlucyB0aGUgbmV3IGVuYWJsZSBiaXQgKi8KCXJsd2lubQlyMyxyMywwLDIyLDIwCQkvKiBUdXJuIG9mZiB0aGUgaW52YWxpZGF0ZSBiaXQgKi8KCXJsd2lubQlyMyxyMywwLDIsMzEJCS8qIFR1cm4gb2ZmIHRoZSBlbmFibGUgJiBQRSBiaXRzICovCglybHdpbm0JcjMscjMsMCw1LDMJCS8qIFR1cm4gb2ZmIHRoZSBjbGtlbiBiaXQgKi8KCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGZsdXNoICovCglybHdpbm0uCXI0LHI0LDAsMCwwCgliZXEJMmYKCgkvKiBGbHVzaCB0aGUgY2FjaGUuCgkgKi8KCgkvKiBUT0RPOiB1c2UgSFcgZmx1c2ggYXNzaXN0ICovCgoJbGlzCXI0LDB4MDAwOAoJbXRjdHIJcjQKCWxpCXI0LDAKMToKCWx3engJcjAscjAscjQKCWRjYmYJMCxyNAoJYWRkaQlyNCxyNCwzMgkJLyogR28gdG8gc3RhcnQgb2YgbmV4dCBjYWNoZSBsaW5lICovCgliZG56CTFiCgoyOgoJLyogU2V0IHVwIHRoZSBMM0NSIGNvbmZpZ3VyYXRpb24gYml0cyAoYW5kIHN3aXRjaCBMMyBvZmYpICovCglzeW5jCgltdHNwcglTUFJOX0wzQ1IscjMKCXN5bmMKCglvcmlzCXIzLHIzLEwzQ1JfTDNSRVNAaAkJLyogU2V0IHJlc2VydmVkIGJpdCA1ICovCgltdHNwcglTUFJOX0wzQ1IscjMKCXN5bmMKCW9yaXMJcjMscjMsTDNDUl9MM0NMS0VOQGgJCS8qIFNldCBjbGtlbiAqLwoJbXRzcHIJU1BSTl9MM0NSLHIzCglzeW5jCgoJLyogV2FpdCBmb3Igc3RhYmlsaXplICovCglsaQlyMCwyNTYKCW10Y3RyCXIwCjE6CWJkbnoJMWIKCgkvKiBQZXJmb3JtIGEgZ2xvYmFsIGludmFsaWRhdGlvbiAqLwoJb3JpCXIzLHIzLDB4MDQwMAoJc3luYwoJbXRzcHIJU1BSTl9MM0NSLHIzCglzeW5jCglpc3luYwoKCS8qIFdlIHdhaXQgZm9yIHRoZSBMM0kgYml0IHRvIGNsZWFyLi4uLi4uICovCjEwOgltZnNwcglyMyxTUFJOX0wzQ1IKCWFuZGkuCXI0LHIzLDB4MDQwMAoJYm5lCTEwYgoKCS8qIENsZWFyIENMS0VOICovCglybHdpbm0JcjMscjMsMCw1LDMJCS8qIFR1cm4gb2ZmIHRoZSBjbGtlbiBiaXQgKi8KCW10c3ByCVNQUk5fTDNDUixyMwoJc3luYwoKCS8qIFdhaXQgZm9yIHN0YWJpbGl6ZSAqLwoJbGkJcjAsMjU2CgltdGN0cglyMAoxOgliZG56CTFiCgoJLyogU2VlIGlmIHdlIG5lZWQgdG8gZW5hYmxlIHRoZSBjYWNoZSAqLwoJY21wbHdpCXI1LDAKCWJlcQk0ZgoKCS8qIEVuYWJsZSB0aGUgY2FjaGUgKi8KCW9yaXMJcjMscjMsKEwzQ1JfTDNFIHwgTDNDUl9MM0NMS0VOKUBoCgltdHNwcglTUFJOX0wzQ1IscjMKCXN5bmMKCgkvKiBXYWl0IGZvciBzdGFiaWxpemUgKi8KCWxpCXIwLDI1NgoJbXRjdHIJcjAKMToJYmRuegkxYgoKCS8qIFJlc3RvcmUgTVNSIChyZXN0b3JlcyBFRSBhbmQgRFIgYml0cyB0byBvcmlnaW5hbCBzdGF0ZSkgKi8KNDoJU1lOQwoJbXRtc3IJcjcKCWlzeW5jCglibHIKCl9HTE9CQUwoX2dldF9MM0NSKQoJLyogUmV0dXJuIHRoZSBMM0NSIGNvbnRlbnRzICovCglsaQlyMywwCkJFR0lOX0ZUUl9TRUNUSU9OCgltZnNwcglyMyxTUFJOX0wzQ1IKRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfTDNDUikKCWJscgoKLyogLS0tIEVuZCBvZiBQb3dlckxvZ2l4IGNvZGUgLS0tCiAqLwoKCi8qIGZsdXNoX2Rpc2FibGVfTDEoKQktIEZsdXNoIGFuZCBkaXNhYmxlIEwxIGNhY2hlCiAqCiAqIGNsb2JiZXJzIHIwLCByMywgY3RyLCBjcjAKICogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCBNTVUgZW5hYmxlZC4KICovCl9HTE9CQUwoX19mbHVzaF9kaXNhYmxlX0wxKQoJLyogU3RvcCBwZW5kaW5nIGFsaXR2ZWMgc3RyZWFtcyBhbmQgbWVtb3J5IGFjY2Vzc2VzICovCkJFR0lOX0ZUUl9TRUNUSU9OCglEU1NBTEwKRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQUxUSVZFQykKIAlzeW5jCgoJLyogTG9hZCBjb3VudGVyIHRvIDB4NDAwMCBjYWNoZSBsaW5lcyAoNTEyaykgYW5kCgkgKiBsb2FkIGNhY2hlIHdpdGggZGF0YXMKCSAqLwoJbGkJcjMsMHg0MDAwCS8qIDUxMmtCIC8gMzJCICovCgltdGN0cglyMwoJbGlzCXIzLEtFUk5FTEJBU0VAaAoxOgoJbHd6CXIwLDAocjMpCglhZGRpCXIzLHIzLDB4MDAyMAkvKiBHbyB0byBzdGFydCBvZiBuZXh0IGNhY2hlIGxpbmUgKi8KCWJkbnoJMWIKCWlzeW5jCglzeW5jCgoJLyogTm93IGZsdXNoIHRob3NlIGNhY2hlIGxpbmVzICovCglsaQlyMywweDQwMDAJLyogNTEya0IgLyAzMkIgKi8KCW10Y3RyCXIzCglsaXMJcjMsS0VSTkVMQkFTRUBoCjE6CglkY2JmCTAscjMKCWFkZGkJcjMscjMsMHgwMDIwCS8qIEdvIHRvIHN0YXJ0IG9mIG5leHQgY2FjaGUgbGluZSAqLwoJYmRuegkxYgoJc3luYwoKCS8qIFdlIGNhbiBub3cgZGlzYWJsZSB0aGUgTDEgY2FjaGUgKEhJRDA6RENFLCBISUQwOklDRSkgKi8KCW1mc3ByCXIzLFNQUk5fSElEMAoJcmx3aW5tCXIzLHIzLDAsMTgsMTUKCW10c3ByCVNQUk5fSElEMCxyMwoJc3luYwoJaXN5bmMKIAlibHIKCi8qIGludmFsX2VuYWJsZV9MMQktIEludmFsaWRhdGUgYW5kIGVuYWJsZSBMMSBjYWNoZQogKgogKiBBc3N1bWVzIEwxIGlzIGFscmVhZHkgZGlzYWJsZWQgYW5kIE1TUjpFRSBpcyBvZmYKICoKICogY2xvYmJlcnMgcjMKICovCl9HTE9CQUwoX19pbnZhbF9lbmFibGVfTDEpCgkvKiBFbmFibGUgYW5kIHRoZW4gRmxhc2ggaW52YWwgdGhlIGluc3RydWN0aW9uICYgZGF0YSBjYWNoZSAqLwoJbWZzcHIJcjMsU1BSTl9ISUQwCglvcmkJcjMscjMsIEhJRDBfSUNFfEhJRDBfSUNGSXxISUQwX0RDRXxISUQwX0RDSQoJc3luYwoJaXN5bmMKCW10c3ByCVNQUk5fSElEMCxyMwoJeG9yaQlyMyxyMywgSElEMF9JQ0ZJfEhJRDBfRENJCgltdHNwcglTUFJOX0hJRDAscjMKCXN5bmMKCiAJYmxyCgoK